/******/
 (function(modules) { // webpackBootstrap
/******/ 	// install a JSONP callback for chunk loading
/******/ 	var parentJsonpFunction = window["webpackJsonp"];
/******/ 	window["webpackJsonp"] = function webpackJsonpCallback(chunkIds, moreModules) {
/******/ 		// add "moreModules" to the modules object,
/******/ 		// then flag all "chunkIds" as loaded and fire callback
/******/ 		var moduleId, chunkId, i = 0, callbacks = [];
/******/ 		for(;i < chunkIds.length; i++) {
/******/ 			chunkId = chunkIds[i];
/******/ 			if(installedChunks[chunkId])
/******/ 				callbacks.push.apply(callbacks, installedChunks[chunkId]);
/******/ 			installedChunks[chunkId] = 0;
/******/ 		}
/******/ 		for(moduleId in moreModules) {
/******/ 			modules[moduleId] = moreModules[moduleId];
/******/ 		}
/******/ 		if(parentJsonpFunction) parentJsonpFunction(chunkIds, moreModules);
/******/ 		while(callbacks.length)
/******/ 			callbacks.shift().call(null, __webpack_require__);
/******/ 		if(moreModules[0]) {
/******/ 			installedModules[0] = 0;
/******/ 			return __webpack_require__(0);
/******/ 		}
/******/ 	};

/******/ 	// The module cache
/******/ 	var installedModules = {};

/******/ 	// object to store loaded and loading chunks
/******/ 	// "0" means "already loaded"
/******/ 	// Array means "loading", array contains callbacks
/******/ 	var installedChunks = {
/******/ 		24:0
/******/ 	};

/******/ 	// 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;
/******/ 	}

/******/ 	// This file contains only the entry chunk.
/******/ 	// The chunk loading function for additional chunks
/******/ 	__webpack_require__.e = function requireEnsure(chunkId, callback) {
/******/ 		// "0" is the signal for "already loaded"
/******/ 		if(installedChunks[chunkId] === 0)
/******/ 			return callback.call(null, __webpack_require__);

/******/ 		// an array means "currently loading".
/******/ 		if(installedChunks[chunkId] !== undefined) {
/******/ 			installedChunks[chunkId].push(callback);
/******/ 		} else {
/******/ 			// start chunk loading
/******/ 			installedChunks[chunkId] = [callback];
/******/ 			var head = document.getElementsByTagName('head')[0];
/******/ 			var script = document.createElement('script');
/******/ 			script.type = 'text/javascript';
/******/ 			script.charset = 'utf-8';
/******/ 			script.async = true;

/******/ 			script.src = __webpack_require__.p + "gogo-chunk-" + chunkId + "." + ({"0":"admin","2":"browse","3":"campaign-editor","4":"campaign-page","5":"campaign-page-next","6":"careers","7":"collections","8":"command-center","9":"contribution-flow","10":"contribution-flow-23","12":"how-it-works","14":"lite","15":"pay-flow","16":"perk-store","17":"pre-launch","18":"profile","19":"search-anything","21":"ui-library","23":"update-page"}[chunkId]||chunkId) + "-" + {"0":"2ea63b2072d63a4c7b96","2":"6b9d61627f16027125df","3":"abc5cb60771fe3693fd0","4":"67ea8f4c6fda57d46948","5":"576d344869bbaa5b548b","6":"00c6e98c0d0173cea3e2","7":"5a0e2b7cf74933fd0b34","8":"8945ab14ea772bc9f3b2","9":"a808d767bbed3587f289","10":"9c97ceaa0d0a7cf5b0fe","12":"ae02f1c8bcd078d454e9","14":"fc64084b15ab2af1cc8c","15":"9062e9565e2110503a4b","16":"8adc124c5221dfb55d59","17":"8a6d66dba7c8757cede5","18":"3eec984b0bcd0470899b","19":"9c14c1cebfd8f09fdc7c","21":"6abf1cc28998fb403bca","22":"29cc838fc4142c0c4bf9","23":"1ea21af4145bfbc92671"}[chunkId] + "z.js";
/******/ 			head.appendChild(script);
/******/ 		}
/******/ 	};

/******/ 	// expose the modules object (__webpack_modules__)
/******/ 	__webpack_require__.m = modules;

/******/ 	// expose the module cache
/******/ 	__webpack_require__.c = installedModules;

/******/ 	// __webpack_public_path__
/******/ 	__webpack_require__.p = "/assets/";
/******/ })
/************************************************************************/
/******/ ([
/* 0 */,
/* 1 */,
/* 2 */,
/* 3 */,
/* 4 */,
/* 5 */,
/* 6 */,
/* 7 */,
/* 8 */,
/* 9 */,
/* 10 */,
/* 11 */
/***/ function(module, exports, __webpack_require__) {

	eval("/* WEBPACK VAR INJECTION */(function(global) {'use strict';\n\n__webpack_require__(12);\n\n__webpack_require__(15);\n\n__webpack_require__(18);\n\n__webpack_require__(20);\n\n__webpack_require__(22);\n\n__webpack_require__(24);\n\n__webpack_require__(26);\n\n__webpack_require__(28);\n\n__webpack_require__(30);\n\n__webpack_require__(32);\n\n__webpack_require__(33);\n\n__webpack_require__(34);\n\n__webpack_require__(35);\n\n__webpack_require__(36);\n\n__webpack_require__(37);\n\n__webpack_require__(38);\n\n__webpack_require__(39);\n\n__webpack_require__(41);\n\n__webpack_require__(43);\n\n__webpack_require__(44);\n\n__webpack_require__(45);\n\n__webpack_require__(46);\n\n__webpack_require__(47);\n\n__webpack_require__(51);\n\n__webpack_require__(52);\n\n__webpack_require__(53);\n\n__webpack_require__(54);\n\n__webpack_require__(55);\n\n__webpack_require__(56);\n\n__webpack_require__(57);\n\n__webpack_require__(58);\n\n__webpack_require__(59);\n\n__webpack_require__(60);\n\nvar _utils = __webpack_require__(61);\n\nvar _utils2 = _interopRequireDefault(_utils);\n\nvar _header = __webpack_require__(182);\n\nvar _header2 = _interopRequireDefault(_header);\n\nvar _footer = __webpack_require__(206);\n\nvar _footer2 = _interopRequireDefault(_footer);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nif (!global._babelPolyfill) {\n  __webpack_require__(212);\n}\n\ntry {\n  angular.module('templates');\n} catch (e) {\n  angular.module('templates', []);\n}\n\n(0, _utils2.default)(angular.module('utils', ['ui.select', 'mgcrea.ngStrap', 'ngCookies', 'vcRecaptcha', 'angular-uri', 'templates', 'angulartics', 'angulartics.google.analytics', 'angulartics.igg.theta', 'LocalStorageModule']).config(['$analyticsProvider', function ($analyticsProvider) {\n  $analyticsProvider.virtualPageviews(false);\n}]));\n\n(0, _header2.default)(angular.module('header', ['ngAnimate', 'utils', 'indiegogo.components.leftNavToggler']));\n\n(0, _footer2.default)(angular.module('footer', ['utils']));\n/* WEBPACK VAR INJECTION */}.call(exports, (function() { return this; }())))\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTEuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9hbmNpbGxhcnkvaW5kZXguanM/MmZjNSJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgJ2V4cG9zZT9fIWxvZGFzaCc7XG5pbXBvcnQgJ3NjcmlwdCEuLi9ib3dlcl9jb21wb25lbnRzL21vbWVudC9taW4vbW9tZW50Lm1pbi5qcyc7XG5pbXBvcnQgJ3NjcmlwdCEuLi9ib3dlcl9jb21wb25lbnRzL21vbWVudC10aW1lem9uZS9idWlsZHMvbW9tZW50LXRpbWV6b25lLm1pbi5qcyc7XG5pbXBvcnQgJ3NjcmlwdCEuLi9ib3dlcl9jb21wb25lbnRzL2Zyb29nYWxvb3AvZnJvb2dhbG9vcC5taW4uanMnO1xuaW1wb3J0ICdzY3JpcHQhLi4vYm93ZXJfY29tcG9uZW50cy91cmkuanMvc3JjL1VSSS5taW4uanMnO1xuXG5pbXBvcnQgJ3NjcmlwdCEuLi9ib3dlcl9jb21wb25lbnRzL2Nsb3VkaW5hcnlfanMvanMvanF1ZXJ5LmlmcmFtZS10cmFuc3BvcnQuanMnO1xuaW1wb3J0ICdzY3JpcHQhLi4vYm93ZXJfY29tcG9uZW50cy9jbG91ZGluYXJ5X2pzL2pzL2pxdWVyeS51aS53aWRnZXQuanMnO1xuaW1wb3J0ICdzY3JpcHQhLi4vYm93ZXJfY29tcG9uZW50cy9jbG91ZGluYXJ5X2pzL2pzL2pxdWVyeS5maWxldXBsb2FkLmpzJztcbmltcG9ydCAnc2NyaXB0IS4uL2Jvd2VyX2NvbXBvbmVudHMvY2xvdWRpbmFyeV9qcy9qcy9qcXVlcnkuY2xvdWRpbmFyeS5qcyc7XG5cbmltcG9ydCAncG9seWZpbGwtZnVuY3Rpb24tcHJvdG90eXBlLWJpbmQnO1xuaW1wb3J0ICdhbmd1bGFyJztcbmltcG9ydCBcIi4vdXRpbHMvYW5hbHl0aWNzL2FuZ3VsYXJ0aWNzLXRoZXRhLmpzXCI7XG5pbXBvcnQgJy4uL2Jvd2VyX2NvbXBvbmVudHMvanF1ZXJ5LmRvdGRvdGRvdC9zcmMvanMvanF1ZXJ5LmRvdGRvdGRvdC5taW4uanMnO1xuaW1wb3J0ICcuLi9ib3dlcl9jb21wb25lbnRzL2FuZ3VsYXItYW5pbWF0ZS9hbmd1bGFyLWFuaW1hdGUubWluLmpzJztcbmltcG9ydCAnLi4vYm93ZXJfY29tcG9uZW50cy9hbmd1bGFyLWNvb2tpZXMvYW5ndWxhci1jb29raWVzLm1pbi5qcyc7XG5pbXBvcnQgJy4uL2Jvd2VyX2NvbXBvbmVudHMvYW5ndWxhci1sb2NhbC1zdG9yYWdlL2Rpc3QvYW5ndWxhci1sb2NhbC1zdG9yYWdlLm1pbi5qcyc7XG5pbXBvcnQgJ3NjcmlwdCEuLi9kZXBlbmRlbmNpZXMvaWdnLW1vbWVudC10aW1lem9uZS1kYXRhLmpzJztcbmltcG9ydCAnc2NyaXB0IS4uL2Jvd2VyX2NvbXBvbmVudHMvYW5ndWxhci1tb21lbnQvYW5ndWxhci1tb21lbnQubWluLmpzJztcbmltcG9ydCAnLi4vYm93ZXJfY29tcG9uZW50cy9hbmd1bGFyLXNhbml0aXplL2FuZ3VsYXItc2FuaXRpemUubWluLmpzJztcbmltcG9ydCAnLi4vYm93ZXJfY29tcG9uZW50cy9hbmd1bGFyLXRvdWNoL2FuZ3VsYXItdG91Y2gubWluLmpzJztcbmltcG9ydCAnLi4vbm9kZV9tb2R1bGVzL2FuZ3VsYXItdWktcm91dGVyL3JlbGVhc2UvYW5ndWxhci11aS1yb3V0ZXIubWluLmpzJztcbmltcG9ydCAnLi4vbm9kZV9tb2R1bGVzL3VpLXNlbGVjdC9kaXN0L3NlbGVjdC5taW4uanMnO1xuaW1wb3J0ICcuLi9ub2RlX21vZHVsZXMvdWktc2VsZWN0L2Rpc3Qvc2VsZWN0Lm1pbi5jc3MnO1xuaW1wb3J0ICcuLi9ib3dlcl9jb21wb25lbnRzL2FuZ3VsYXItc3RyYXAvZGlzdC9hbmd1bGFyLXN0cmFwLm1pbi5qcyc7XG5pbXBvcnQgJy4uL2Jvd2VyX2NvbXBvbmVudHMvYW5ndWxhci1zdHJhcC9kaXN0L2FuZ3VsYXItc3RyYXAudHBsLm1pbi5qcyc7XG5pbXBvcnQgJy4uL2Jvd2VyX2NvbXBvbmVudHMvbmdBdXRvY29tcGxldGUvc3JjL25nQXV0b2NvbXBsZXRlLmpzJztcbmltcG9ydCAnLi4vYm93ZXJfY29tcG9uZW50cy9hbmd1bGFyLXVyaS9hbmd1bGFyLXVyaS5qcyc7XG5pbXBvcnQgJy4uL2Jvd2VyX2NvbXBvbmVudHMvYW5ndWxhci1yZWNhcHRjaGEvcmVsZWFzZS9hbmd1bGFyLXJlY2FwdGNoYS5taW4uanMnO1xuaW1wb3J0ICcuLi9ib3dlcl9jb21wb25lbnRzL2FuZ3VsYXJ0aWNzL3NyYy9hbmd1bGFydGljcy5qcyc7XG5pbXBvcnQgJy4uL2Jvd2VyX2NvbXBvbmVudHMvYW5ndWxhci1yZXNvdXJjZS9hbmd1bGFyLXJlc291cmNlLmpzJztcbmltcG9ydCAnLi4vYm93ZXJfY29tcG9uZW50cy9hbmd1bGFyanMtcmFpbHMtcmVzb3VyY2UvYW5ndWxhcmpzLXJhaWxzLXJlc291cmNlLmpzJztcbmltcG9ydCAnLi4vYm93ZXJfY29tcG9uZW50cy9hbmd1bGFydGljcy1nb29nbGUtYW5hbHl0aWNzL2Rpc3QvYW5ndWxhcnRpY3MtZ29vZ2xlLWFuYWx5dGljcy5taW4uanMnO1xuaW1wb3J0ICcuLi9ib3dlcl9jb21wb25lbnRzL2FuZ3VsYXItY2xpcGJvYXJkL2FuZ3VsYXItY2xpcGJvYXJkLmpzJztcblxuaW1wb3J0IHV0aWxzIGZyb20gJy4vdXRpbHMnO1xuaW1wb3J0IGhlYWRlciBmcm9tICcuL2hlYWRlcic7XG5pbXBvcnQgZm9vdGVyIGZyb20gJy4vZm9vdGVyJztcblxuaWYgKCFnbG9iYWwuX2JhYmVsUG9seWZpbGwpIHtcbiAgcmVxdWlyZSgnYmFiZWwtcG9seWZpbGwnKTtcbn1cblxudHJ5IHtcbiAgYW5ndWxhci5tb2R1bGUoJ3RlbXBsYXRlcycpO1xufSBjYXRjaCAoZSkge1xuICBhbmd1bGFyLm1vZHVsZSgndGVtcGxhdGVzJywgW10pO1xufVxuXG5cbnV0aWxzKFxuICBhbmd1bGFyLm1vZHVsZSgndXRpbHMnLFxuICAgIFsgJ3VpLnNlbGVjdCcsXG4gICAgICAnbWdjcmVhLm5nU3RyYXAnLFxuICAgICAgJ25nQ29va2llcycsICd2Y1JlY2FwdGNoYScsXG4gICAgICAnYW5ndWxhci11cmknLCAndGVtcGxhdGVzJyxcbiAgICAgICdhbmd1bGFydGljcycsICdhbmd1bGFydGljcy5nb29nbGUuYW5hbHl0aWNzJyxcbiAgICAgICdhbmd1bGFydGljcy5pZ2cudGhldGEnLFxuICAgICAgJ0xvY2FsU3RvcmFnZU1vZHVsZSdcbiAgICBdKS5jb25maWcoWyckYW5hbHl0aWNzUHJvdmlkZXInLCBmdW5jdGlvbiAoJGFuYWx5dGljc1Byb3ZpZGVyKSB7XG4gICAgICAkYW5hbHl0aWNzUHJvdmlkZXIudmlydHVhbFBhZ2V2aWV3cyhmYWxzZSk7XG4gICAgfV0pXG4pO1xuXG5oZWFkZXIoYW5ndWxhci5tb2R1bGUoJ2hlYWRlcicsIFtcbiAgJ25nQW5pbWF0ZScsXG4gICd1dGlscycsXG4gICdpbmRpZWdvZ28uY29tcG9uZW50cy5sZWZ0TmF2VG9nZ2xlcidcbl0pKTtcblxuZm9vdGVyKGFuZ3VsYXIubW9kdWxlKCdmb290ZXInLCBbXG4gICd1dGlscydcbl0pKTtcblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIC4vYW5jaWxsYXJ5L2luZGV4LmpzXG4gKiovIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBREE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQWlDQTtBQUNBO0FBbENBO0FBQ0E7QUFvQ0E7QUFDQTtBQXJDQTtBQUNBO0FBdUNBO0FBQ0E7QUFDQTtBQUNBO0FBekNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBOzs7QUFJQTtBQVVBOzs7QUFJQTtBQUNBO0FBS0E7Iiwic291cmNlUm9vdCI6IiJ9");

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

	eval("/* WEBPACK VAR INJECTION */(function(global) {module.exports = global[\"_\"] = __webpack_require__(13);\n/* WEBPACK VAR INJECTION */}.call(exports, (function() { return this; }())))\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTIuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9+L2xvZGFzaC9pbmRleC5qcz9kZTA4Il0sInNvdXJjZXNDb250ZW50IjpbIm1vZHVsZS5leHBvcnRzID0gZ2xvYmFsW1wiX1wiXSA9IHJlcXVpcmUoXCItIS9ob21lL2RlcGxveWVyL2RlcGxveW1lbnQvanMvbm9kZV9tb2R1bGVzL2xvZGFzaC9pbmRleC5qc1wiKTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9leHBvc2UtbG9hZGVyP18hLi9+L2xvZGFzaC9pbmRleC5qc1xuICoqIG1vZHVsZSBpZCA9IDEyXG4gKiogbW9kdWxlIGNodW5rcyA9IDI0XG4gKiovIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");

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

	eval("var __WEBPACK_AMD_DEFINE_RESULT__;/* WEBPACK VAR INJECTION */(function(module, global) {/**\n * @license\n * lodash 3.10.1 (Custom Build) <https://lodash.com/>\n * Build: `lodash modern -d -o ./index.js`\n * Copyright 2012-2015 The Dojo Foundation <http://dojofoundation.org/>\n * Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE>\n * Copyright 2009-2015 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n * Available under MIT license <https://lodash.com/license>\n */\n;(function() {\n\n  /** Used as a safe reference for `undefined` in pre-ES5 environments. */\n  var undefined;\n\n  /** Used as the semantic version number. */\n  var VERSION = '3.10.1';\n\n  /** Used to compose bitmasks for wrapper metadata. */\n  var BIND_FLAG = 1,\n      BIND_KEY_FLAG = 2,\n      CURRY_BOUND_FLAG = 4,\n      CURRY_FLAG = 8,\n      CURRY_RIGHT_FLAG = 16,\n      PARTIAL_FLAG = 32,\n      PARTIAL_RIGHT_FLAG = 64,\n      ARY_FLAG = 128,\n      REARG_FLAG = 256;\n\n  /** Used as default options for `_.trunc`. */\n  var DEFAULT_TRUNC_LENGTH = 30,\n      DEFAULT_TRUNC_OMISSION = '...';\n\n  /** Used to detect when a function becomes hot. */\n  var HOT_COUNT = 150,\n      HOT_SPAN = 16;\n\n  /** Used as the size to enable large array optimizations. */\n  var LARGE_ARRAY_SIZE = 200;\n\n  /** Used to indicate the type of lazy iteratees. */\n  var LAZY_FILTER_FLAG = 1,\n      LAZY_MAP_FLAG = 2;\n\n  /** Used as the `TypeError` message for \"Functions\" methods. */\n  var FUNC_ERROR_TEXT = 'Expected a function';\n\n  /** Used as the internal argument placeholder. */\n  var PLACEHOLDER = '__lodash_placeholder__';\n\n  /** `Object#toString` result references. */\n  var 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\n  var arrayBufferTag = '[object ArrayBuffer]',\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 match empty string literals in compiled template source. */\n  var reEmptyStringLeading = /\\b__p \\+= '';/g,\n      reEmptyStringMiddle = /\\b(__p \\+=) '' \\+/g,\n      reEmptyStringTrailing = /(__e\\(.*?\\)|\\b__t\\)) \\+\\n'';/g;\n\n  /** Used to match HTML entities and HTML characters. */\n  var reEscapedHtml = /&(?:amp|lt|gt|quot|#39|#96);/g,\n      reUnescapedHtml = /[&<>\"'`]/g,\n      reHasEscapedHtml = RegExp(reEscapedHtml.source),\n      reHasUnescapedHtml = RegExp(reUnescapedHtml.source);\n\n  /** Used to match template delimiters. */\n  var reEscape = /<%-([\\s\\S]+?)%>/g,\n      reEvaluate = /<%([\\s\\S]+?)%>/g,\n      reInterpolate = /<%=([\\s\\S]+?)%>/g;\n\n  /** Used to match property names within property paths. */\n  var reIsDeepProp = /\\.|\\[(?:[^[\\]]*|([\"'])(?:(?!\\1)[^\\n\\\\]|\\\\.)*?\\1)\\]/,\n      reIsPlainProp = /^\\w*$/,\n      rePropName = /[^.[\\]]+|\\[(?:(-?\\d+(?:\\.\\d+)?)|([\"'])((?:(?!\\2)[^\\n\\\\]|\\\\.)*?)\\2)\\]/g;\n\n  /**\n   * Used to match `RegExp` [syntax characters](http://ecma-international.org/ecma-262/6.0/#sec-patterns)\n   * and those outlined by [`EscapeRegExpPattern`](http://ecma-international.org/ecma-262/6.0/#sec-escaperegexppattern).\n   */\n  var reRegExpChars = /^[:!,]|[\\\\^$.*+?()[\\]{}|\\/]|(^[0-9a-fA-Fnrtuvx])|([\\n\\r\\u2028\\u2029])/g,\n      reHasRegExpChars = RegExp(reRegExpChars.source);\n\n  /** Used to match [combining diacritical marks](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks). */\n  var reComboMark = /[\\u0300-\\u036f\\ufe20-\\ufe23]/g;\n\n  /** Used to match backslashes in property paths. */\n  var reEscapeChar = /\\\\(\\\\)?/g;\n\n  /** Used to match [ES template delimiters](http://ecma-international.org/ecma-262/6.0/#sec-template-literal-lexical-components). */\n  var reEsTemplate = /\\$\\{([^\\\\}]*(?:\\\\.[^\\\\}]*)*)\\}/g;\n\n  /** Used to match `RegExp` flags from their coerced string values. */\n  var reFlags = /\\w*$/;\n\n  /** Used to detect hexadecimal string values. */\n  var reHasHexPrefix = /^0[xX]/;\n\n  /** Used to detect host constructors (Safari > 5). */\n  var reIsHostCtor = /^\\[object .+?Constructor\\]$/;\n\n  /** Used to detect unsigned integer values. */\n  var reIsUint = /^\\d+$/;\n\n  /** Used to match latin-1 supplementary letters (excluding mathematical operators). */\n  var reLatin1 = /[\\xc0-\\xd6\\xd8-\\xde\\xdf-\\xf6\\xf8-\\xff]/g;\n\n  /** Used to ensure capturing order of template delimiters. */\n  var reNoMatch = /($^)/;\n\n  /** Used to match unescaped characters in compiled string literals. */\n  var reUnescapedString = /['\\n\\r\\u2028\\u2029\\\\]/g;\n\n  /** Used to match words to create compound words. */\n  var reWords = (function() {\n    var upper = '[A-Z\\\\xc0-\\\\xd6\\\\xd8-\\\\xde]',\n        lower = '[a-z\\\\xdf-\\\\xf6\\\\xf8-\\\\xff]+';\n\n    return RegExp(upper + '+(?=' + upper + lower + ')|' + upper + '?' + lower + '|' + upper + '+|[0-9]+', 'g');\n  }());\n\n  /** Used to assign default `context` object properties. */\n  var contextProps = [\n    'Array', 'ArrayBuffer', 'Date', 'Error', 'Float32Array', 'Float64Array',\n    'Function', 'Int8Array', 'Int16Array', 'Int32Array', 'Math', 'Number',\n    'Object', 'RegExp', 'Set', 'String', '_', 'clearTimeout', 'isFinite',\n    'parseFloat', 'parseInt', 'setTimeout', 'TypeError', 'Uint8Array',\n    'Uint8ClampedArray', 'Uint16Array', 'Uint32Array', 'WeakMap'\n  ];\n\n  /** Used to make template sourceURLs easier to identify. */\n  var templateCounter = -1;\n\n  /** Used to identify `toStringTag` values of typed arrays. */\n  var typedArrayTags = {};\n  typedArrayTags[float32Tag] = typedArrayTags[float64Tag] =\n  typedArrayTags[int8Tag] = typedArrayTags[int16Tag] =\n  typedArrayTags[int32Tag] = typedArrayTags[uint8Tag] =\n  typedArrayTags[uint8ClampedTag] = typedArrayTags[uint16Tag] =\n  typedArrayTags[uint32Tag] = true;\n  typedArrayTags[argsTag] = typedArrayTags[arrayTag] =\n  typedArrayTags[arrayBufferTag] = typedArrayTags[boolTag] =\n  typedArrayTags[dateTag] = typedArrayTags[errorTag] =\n  typedArrayTags[funcTag] = typedArrayTags[mapTag] =\n  typedArrayTags[numberTag] = typedArrayTags[objectTag] =\n  typedArrayTags[regexpTag] = typedArrayTags[setTag] =\n  typedArrayTags[stringTag] = typedArrayTags[weakMapTag] = false;\n\n  /** Used to identify `toStringTag` values supported by `_.clone`. */\n  var cloneableTags = {};\n  cloneableTags[argsTag] = cloneableTags[arrayTag] =\n  cloneableTags[arrayBufferTag] = cloneableTags[boolTag] =\n  cloneableTags[dateTag] = cloneableTags[float32Tag] =\n  cloneableTags[float64Tag] = cloneableTags[int8Tag] =\n  cloneableTags[int16Tag] = cloneableTags[int32Tag] =\n  cloneableTags[numberTag] = cloneableTags[objectTag] =\n  cloneableTags[regexpTag] = cloneableTags[stringTag] =\n  cloneableTags[uint8Tag] = cloneableTags[uint8ClampedTag] =\n  cloneableTags[uint16Tag] = cloneableTags[uint32Tag] = true;\n  cloneableTags[errorTag] = cloneableTags[funcTag] =\n  cloneableTags[mapTag] = cloneableTags[setTag] =\n  cloneableTags[weakMapTag] = false;\n\n  /** Used to map latin-1 supplementary letters to basic latin letters. */\n  var deburredLetters = {\n    '\\xc0': 'A',  '\\xc1': 'A', '\\xc2': 'A', '\\xc3': 'A', '\\xc4': 'A', '\\xc5': 'A',\n    '\\xe0': 'a',  '\\xe1': 'a', '\\xe2': 'a', '\\xe3': 'a', '\\xe4': 'a', '\\xe5': 'a',\n    '\\xc7': 'C',  '\\xe7': 'c',\n    '\\xd0': 'D',  '\\xf0': 'd',\n    '\\xc8': 'E',  '\\xc9': 'E', '\\xca': 'E', '\\xcb': 'E',\n    '\\xe8': 'e',  '\\xe9': 'e', '\\xea': 'e', '\\xeb': 'e',\n    '\\xcC': 'I',  '\\xcd': 'I', '\\xce': 'I', '\\xcf': 'I',\n    '\\xeC': 'i',  '\\xed': 'i', '\\xee': 'i', '\\xef': 'i',\n    '\\xd1': 'N',  '\\xf1': 'n',\n    '\\xd2': 'O',  '\\xd3': 'O', '\\xd4': 'O', '\\xd5': 'O', '\\xd6': 'O', '\\xd8': 'O',\n    '\\xf2': 'o',  '\\xf3': 'o', '\\xf4': 'o', '\\xf5': 'o', '\\xf6': 'o', '\\xf8': 'o',\n    '\\xd9': 'U',  '\\xda': 'U', '\\xdb': 'U', '\\xdc': 'U',\n    '\\xf9': 'u',  '\\xfa': 'u', '\\xfb': 'u', '\\xfc': 'u',\n    '\\xdd': 'Y',  '\\xfd': 'y', '\\xff': 'y',\n    '\\xc6': 'Ae', '\\xe6': 'ae',\n    '\\xde': 'Th', '\\xfe': 'th',\n    '\\xdf': 'ss'\n  };\n\n  /** Used to map characters to HTML entities. */\n  var htmlEscapes = {\n    '&': '&amp;',\n    '<': '&lt;',\n    '>': '&gt;',\n    '\"': '&quot;',\n    \"'\": '&#39;',\n    '`': '&#96;'\n  };\n\n  /** Used to map HTML entities to characters. */\n  var htmlUnescapes = {\n    '&amp;': '&',\n    '&lt;': '<',\n    '&gt;': '>',\n    '&quot;': '\"',\n    '&#39;': \"'\",\n    '&#96;': '`'\n  };\n\n  /** Used to determine if values are of the language type `Object`. */\n  var objectTypes = {\n    'function': true,\n    'object': true\n  };\n\n  /** Used to escape characters for inclusion in compiled regexes. */\n  var regexpEscapes = {\n    '0': 'x30', '1': 'x31', '2': 'x32', '3': 'x33', '4': 'x34',\n    '5': 'x35', '6': 'x36', '7': 'x37', '8': 'x38', '9': 'x39',\n    'A': 'x41', 'B': 'x42', 'C': 'x43', 'D': 'x44', 'E': 'x45', 'F': 'x46',\n    'a': 'x61', 'b': 'x62', 'c': 'x63', 'd': 'x64', 'e': 'x65', 'f': 'x66',\n    'n': 'x6e', 'r': 'x72', 't': 'x74', 'u': 'x75', 'v': 'x76', 'x': 'x78'\n  };\n\n  /** Used to escape characters for inclusion in compiled string literals. */\n  var stringEscapes = {\n    '\\\\': '\\\\',\n    \"'\": \"'\",\n    '\\n': 'n',\n    '\\r': 'r',\n    '\\u2028': 'u2028',\n    '\\u2029': 'u2029'\n  };\n\n  /** Detect free variable `exports`. */\n  var freeExports = objectTypes[typeof exports] && exports && !exports.nodeType && exports;\n\n  /** Detect free variable `module`. */\n  var freeModule = objectTypes[typeof module] && module && !module.nodeType && module;\n\n  /** Detect free variable `global` from Node.js. */\n  var freeGlobal = freeExports && freeModule && typeof global == 'object' && global && global.Object && global;\n\n  /** Detect free variable `self`. */\n  var freeSelf = objectTypes[typeof self] && self && self.Object && self;\n\n  /** Detect free variable `window`. */\n  var freeWindow = objectTypes[typeof window] && window && window.Object && window;\n\n  /** Detect the popular CommonJS extension `module.exports`. */\n  var moduleExports = freeModule && freeModule.exports === freeExports && freeExports;\n\n  /**\n   * Used as a reference to the global object.\n   *\n   * The `this` value is used if it's the global object to avoid Greasemonkey's\n   * restricted `window` object, otherwise the `window` object is used.\n   */\n  var root = freeGlobal || ((freeWindow !== (this && this.window)) && freeWindow) || freeSelf || this;\n\n  /*--------------------------------------------------------------------------*/\n\n  /**\n   * The base implementation of `compareAscending` which compares values and\n   * sorts them in ascending order without guaranteeing a stable sort.\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   */\n  function baseCompareAscending(value, other) {\n    if (value !== other) {\n      var valIsNull = value === null,\n          valIsUndef = value === undefined,\n          valIsReflexive = value === value;\n\n      var othIsNull = other === null,\n          othIsUndef = other === undefined,\n          othIsReflexive = other === other;\n\n      if ((value > other && !othIsNull) || !valIsReflexive ||\n          (valIsNull && !othIsUndef && othIsReflexive) ||\n          (valIsUndef && othIsReflexive)) {\n        return 1;\n      }\n      if ((value < other && !valIsNull) || !othIsReflexive ||\n          (othIsNull && !valIsUndef && valIsReflexive) ||\n          (othIsUndef && valIsReflexive)) {\n        return -1;\n      }\n    }\n    return 0;\n  }\n\n  /**\n   * The base implementation of `_.findIndex` and `_.findLastIndex` without\n   * support for callback shorthands and `this` binding.\n   *\n   * @private\n   * @param {Array} array The array to search.\n   * @param {Function} predicate The function invoked per iteration.\n   * @param {boolean} [fromRight] Specify iterating from right to left.\n   * @returns {number} Returns the index of the matched value, else `-1`.\n   */\n  function baseFindIndex(array, predicate, fromRight) {\n    var length = array.length,\n        index = fromRight ? length : -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\n  /**\n   * The base implementation of `_.indexOf` without support for binary searches.\n   *\n   * @private\n   * @param {Array} array The array to search.\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   */\n  function baseIndexOf(array, value, fromIndex) {\n    if (value !== value) {\n      return indexOfNaN(array, fromIndex);\n    }\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\n  /**\n   * The base implementation of `_.isFunction` without support for environments\n   * with incorrect `typeof` results.\n   *\n   * @private\n   * @param {*} value The value to check.\n   * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.\n   */\n  function baseIsFunction(value) {\n    // Avoid a Chakra JIT bug in compatibility modes of IE 11.\n    // See https://github.com/jashkenas/underscore/issues/1621 for more details.\n    return typeof value == 'function' || false;\n  }\n\n  /**\n   * Converts `value` to a string if it's not one. An empty string is returned\n   * for `null` or `undefined` values.\n   *\n   * @private\n   * @param {*} value The value to process.\n   * @returns {string} Returns the string.\n   */\n  function baseToString(value) {\n    return value == null ? '' : (value + '');\n  }\n\n  /**\n   * Used by `_.trim` and `_.trimLeft` to get the index of the first character\n   * of `string` that is not found in `chars`.\n   *\n   * @private\n   * @param {string} string The string to inspect.\n   * @param {string} chars The characters to find.\n   * @returns {number} Returns the index of the first character not found in `chars`.\n   */\n  function charsLeftIndex(string, chars) {\n    var index = -1,\n        length = string.length;\n\n    while (++index < length && chars.indexOf(string.charAt(index)) > -1) {}\n    return index;\n  }\n\n  /**\n   * Used by `_.trim` and `_.trimRight` to get the index of the last character\n   * of `string` that is not found in `chars`.\n   *\n   * @private\n   * @param {string} string The string to inspect.\n   * @param {string} chars The characters to find.\n   * @returns {number} Returns the index of the last character not found in `chars`.\n   */\n  function charsRightIndex(string, chars) {\n    var index = string.length;\n\n    while (index-- && chars.indexOf(string.charAt(index)) > -1) {}\n    return index;\n  }\n\n  /**\n   * Used by `_.sortBy` to compare transformed elements of a collection and stable\n   * sort them in ascending order.\n   *\n   * @private\n   * @param {Object} object The object to compare.\n   * @param {Object} other The other object to compare.\n   * @returns {number} Returns the sort order indicator for `object`.\n   */\n  function compareAscending(object, other) {\n    return baseCompareAscending(object.criteria, other.criteria) || (object.index - other.index);\n  }\n\n  /**\n   * Used by `_.sortByOrder` to compare multiple properties of a value to another\n   * and stable sort them.\n   *\n   * If `orders` is unspecified, all valuess are sorted in ascending order. Otherwise,\n   * a value is sorted in ascending order if its corresponding order is \"asc\", and\n   * descending if \"desc\".\n   *\n   * @private\n   * @param {Object} object The object to compare.\n   * @param {Object} other The other object to compare.\n   * @param {boolean[]} orders The order to sort by for each property.\n   * @returns {number} Returns the sort order indicator for `object`.\n   */\n  function 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 = baseCompareAscending(objCriteria[index], othCriteria[index]);\n      if (result) {\n        if (index >= ordersLength) {\n          return result;\n        }\n        var order = orders[index];\n        return result * ((order === 'asc' || order === true) ? 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://code.google.com/p/v8/issues/detail?id=90 for more details.\n    return object.index - other.index;\n  }\n\n  /**\n   * Used by `_.deburr` to convert latin-1 supplementary letters to basic latin letters.\n   *\n   * @private\n   * @param {string} letter The matched letter to deburr.\n   * @returns {string} Returns the deburred letter.\n   */\n  function deburrLetter(letter) {\n    return deburredLetters[letter];\n  }\n\n  /**\n   * Used by `_.escape` to convert characters to HTML entities.\n   *\n   * @private\n   * @param {string} chr The matched character to escape.\n   * @returns {string} Returns the escaped character.\n   */\n  function escapeHtmlChar(chr) {\n    return htmlEscapes[chr];\n  }\n\n  /**\n   * Used by `_.escapeRegExp` to escape characters for inclusion in compiled regexes.\n   *\n   * @private\n   * @param {string} chr The matched character to escape.\n   * @param {string} leadingChar The capture group for a leading character.\n   * @param {string} whitespaceChar The capture group for a whitespace character.\n   * @returns {string} Returns the escaped character.\n   */\n  function escapeRegExpChar(chr, leadingChar, whitespaceChar) {\n    if (leadingChar) {\n      chr = regexpEscapes[chr];\n    } else if (whitespaceChar) {\n      chr = stringEscapes[chr];\n    }\n    return '\\\\' + chr;\n  }\n\n  /**\n   * Used by `_.template` to escape characters for inclusion in compiled string literals.\n   *\n   * @private\n   * @param {string} chr The matched character to escape.\n   * @returns {string} Returns the escaped character.\n   */\n  function escapeStringChar(chr) {\n    return '\\\\' + stringEscapes[chr];\n  }\n\n  /**\n   * Gets the index at which the first occurrence of `NaN` is found in `array`.\n   *\n   * @private\n   * @param {Array} array The array to search.\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 `NaN`, else `-1`.\n   */\n  function indexOfNaN(array, fromIndex, fromRight) {\n    var length = array.length,\n        index = fromIndex + (fromRight ? 0 : -1);\n\n    while ((fromRight ? index-- : ++index < length)) {\n      var other = array[index];\n      if (other !== other) {\n        return index;\n      }\n    }\n    return -1;\n  }\n\n  /**\n   * Checks if `value` is object-like.\n   *\n   * @private\n   * @param {*} value The value to check.\n   * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n   */\n  function isObjectLike(value) {\n    return !!value && typeof value == 'object';\n  }\n\n  /**\n   * Used by `trimmedLeftIndex` and `trimmedRightIndex` to determine if a\n   * character code is whitespace.\n   *\n   * @private\n   * @param {number} charCode The character code to inspect.\n   * @returns {boolean} Returns `true` if `charCode` is whitespace, else `false`.\n   */\n  function isSpace(charCode) {\n    return ((charCode <= 160 && (charCode >= 9 && charCode <= 13) || charCode == 32 || charCode == 160) || charCode == 5760 || charCode == 6158 ||\n      (charCode >= 8192 && (charCode <= 8202 || charCode == 8232 || charCode == 8233 || charCode == 8239 || charCode == 8287 || charCode == 12288 || charCode == 65279)));\n  }\n\n  /**\n   * Replaces all `placeholder` elements in `array` with an internal placeholder\n   * and returns an array of their indexes.\n   *\n   * @private\n   * @param {Array} array The array to modify.\n   * @param {*} placeholder The placeholder to replace.\n   * @returns {Array} Returns the new array of placeholder indexes.\n   */\n  function replaceHolders(array, placeholder) {\n    var index = -1,\n        length = array.length,\n        resIndex = -1,\n        result = [];\n\n    while (++index < length) {\n      if (array[index] === placeholder) {\n        array[index] = PLACEHOLDER;\n        result[++resIndex] = index;\n      }\n    }\n    return result;\n  }\n\n  /**\n   * An implementation of `_.uniq` optimized for sorted arrays without support\n   * for callback shorthands and `this` binding.\n   *\n   * @private\n   * @param {Array} array The array to inspect.\n   * @param {Function} [iteratee] The function invoked per iteration.\n   * @returns {Array} Returns the new duplicate-value-free array.\n   */\n  function sortedUniq(array, iteratee) {\n    var seen,\n        index = -1,\n        length = array.length,\n        resIndex = -1,\n        result = [];\n\n    while (++index < length) {\n      var value = array[index],\n          computed = iteratee ? iteratee(value, index, array) : value;\n\n      if (!index || seen !== computed) {\n        seen = computed;\n        result[++resIndex] = value;\n      }\n    }\n    return result;\n  }\n\n  /**\n   * Used by `_.trim` and `_.trimLeft` to get the index of the first non-whitespace\n   * character of `string`.\n   *\n   * @private\n   * @param {string} string The string to inspect.\n   * @returns {number} Returns the index of the first non-whitespace character.\n   */\n  function trimmedLeftIndex(string) {\n    var index = -1,\n        length = string.length;\n\n    while (++index < length && isSpace(string.charCodeAt(index))) {}\n    return index;\n  }\n\n  /**\n   * Used by `_.trim` and `_.trimRight` to get the index of the last non-whitespace\n   * character of `string`.\n   *\n   * @private\n   * @param {string} string The string to inspect.\n   * @returns {number} Returns the index of the last non-whitespace character.\n   */\n  function trimmedRightIndex(string) {\n    var index = string.length;\n\n    while (index-- && isSpace(string.charCodeAt(index))) {}\n    return index;\n  }\n\n  /**\n   * Used by `_.unescape` to convert HTML entities to characters.\n   *\n   * @private\n   * @param {string} chr The matched character to unescape.\n   * @returns {string} Returns the unescaped character.\n   */\n  function unescapeHtmlChar(chr) {\n    return htmlUnescapes[chr];\n  }\n\n  /*--------------------------------------------------------------------------*/\n\n  /**\n   * Create a new pristine `lodash` function using the given `context` object.\n   *\n   * @static\n   * @memberOf _\n   * @category Utility\n   * @param {Object} [context=root] The context object.\n   * @returns {Function} Returns a new `lodash` function.\n   * @example\n   *\n   * _.mixin({ 'foo': _.constant('foo') });\n   *\n   * var lodash = _.runInContext();\n   * lodash.mixin({ 'bar': lodash.constant('bar') });\n   *\n   * _.isFunction(_.foo);\n   * // => true\n   * _.isFunction(_.bar);\n   * // => false\n   *\n   * lodash.isFunction(lodash.foo);\n   * // => false\n   * lodash.isFunction(lodash.bar);\n   * // => true\n   *\n   * // using `context` to mock `Date#getTime` use in `_.now`\n   * var mock = _.runInContext({\n   *   'Date': function() {\n   *     return { 'getTime': getTimeMock };\n   *   }\n   * });\n   *\n   * // or creating a suped-up `defer` in Node.js\n   * var defer = _.runInContext({ 'setTimeout': setImmediate }).defer;\n   */\n  function runInContext(context) {\n    // Avoid issues with some ES3 environments that attempt to use values, named\n    // after built-in constructors like `Object`, for the creation of literals.\n    // ES5 clears this up by stating that literals must use built-in constructors.\n    // See https://es5.github.io/#x11.1.5 for more details.\n    context = context ? _.defaults(root.Object(), context, _.pick(root, contextProps)) : root;\n\n    /** Native constructor references. */\n    var Array = context.Array,\n        Date = context.Date,\n        Error = context.Error,\n        Function = context.Function,\n        Math = context.Math,\n        Number = context.Number,\n        Object = context.Object,\n        RegExp = context.RegExp,\n        String = context.String,\n        TypeError = context.TypeError;\n\n    /** Used for native method references. */\n    var arrayProto = Array.prototype,\n        objectProto = Object.prototype,\n        stringProto = String.prototype;\n\n    /** Used to resolve the decompiled source of functions. */\n    var fnToString = Function.prototype.toString;\n\n    /** Used to check objects for own properties. */\n    var hasOwnProperty = objectProto.hasOwnProperty;\n\n    /** Used to generate unique IDs. */\n    var idCounter = 0;\n\n    /**\n     * Used to resolve the [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring)\n     * of values.\n     */\n    var objToString = objectProto.toString;\n\n    /** Used to restore the original `_` reference in `_.noConflict`. */\n    var oldDash = root._;\n\n    /** Used to detect if a method is native. */\n    var reIsNative = RegExp('^' +\n      fnToString.call(hasOwnProperty).replace(/[\\\\^$.*+?()[\\]{}|]/g, '\\\\$&')\n      .replace(/hasOwnProperty|(function).*?(?=\\\\\\()| for .+?(?=\\\\\\])/g, '$1.*?') + '$'\n    );\n\n    /** Native method references. */\n    var ArrayBuffer = context.ArrayBuffer,\n        clearTimeout = context.clearTimeout,\n        parseFloat = context.parseFloat,\n        pow = Math.pow,\n        propertyIsEnumerable = objectProto.propertyIsEnumerable,\n        Set = getNative(context, 'Set'),\n        setTimeout = context.setTimeout,\n        splice = arrayProto.splice,\n        Uint8Array = context.Uint8Array,\n        WeakMap = getNative(context, 'WeakMap');\n\n    /* Native method references for those with the same name as other `lodash` methods. */\n    var nativeCeil = Math.ceil,\n        nativeCreate = getNative(Object, 'create'),\n        nativeFloor = Math.floor,\n        nativeIsArray = getNative(Array, 'isArray'),\n        nativeIsFinite = context.isFinite,\n        nativeKeys = getNative(Object, 'keys'),\n        nativeMax = Math.max,\n        nativeMin = Math.min,\n        nativeNow = getNative(Date, 'now'),\n        nativeParseInt = context.parseInt,\n        nativeRandom = Math.random;\n\n    /** Used as references for `-Infinity` and `Infinity`. */\n    var NEGATIVE_INFINITY = Number.NEGATIVE_INFINITY,\n        POSITIVE_INFINITY = Number.POSITIVE_INFINITY;\n\n    /** Used as references for the maximum length and index of an array. */\n    var MAX_ARRAY_LENGTH = 4294967295,\n        MAX_ARRAY_INDEX = MAX_ARRAY_LENGTH - 1,\n        HALF_MAX_ARRAY_LENGTH = MAX_ARRAY_LENGTH >>> 1;\n\n    /**\n     * Used as the [maximum length](http://ecma-international.org/ecma-262/6.0/#sec-number.max_safe_integer)\n     * of an array-like value.\n     */\n    var MAX_SAFE_INTEGER = 9007199254740991;\n\n    /** Used to store function metadata. */\n    var metaMap = WeakMap && new WeakMap;\n\n    /** Used to lookup unminified function names. */\n    var realNames = {};\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Creates a `lodash` object which wraps `value` to enable implicit chaining.\n     * Methods that operate on and return arrays, collections, and functions can\n     * be chained together. Methods that retrieve a single value or may return a\n     * primitive value will automatically end the chain returning the unwrapped\n     * value. Explicit chaining may be enabled using `_.chain`. The execution of\n     * chained methods is lazy, that is, execution is deferred until `_#value`\n     * is implicitly or explicitly called.\n     *\n     * Lazy evaluation allows several methods to support shortcut fusion. Shortcut\n     * fusion is an optimization strategy which merge iteratee calls; this can help\n     * to avoid the creation of intermediate data structures and greatly reduce the\n     * number of iteratee executions.\n     *\n     * Chaining is supported in custom builds as long as the `_#value` method is\n     * directly or indirectly included in the build.\n     *\n     * In addition to lodash methods, wrappers have `Array` and `String` methods.\n     *\n     * The wrapper `Array` methods are:\n     * `concat`, `join`, `pop`, `push`, `reverse`, `shift`, `slice`, `sort`,\n     * `splice`, and `unshift`\n     *\n     * The wrapper `String` methods are:\n     * `replace` and `split`\n     *\n     * The wrapper methods that support shortcut fusion are:\n     * `compact`, `drop`, `dropRight`, `dropRightWhile`, `dropWhile`, `filter`,\n     * `first`, `initial`, `last`, `map`, `pluck`, `reject`, `rest`, `reverse`,\n     * `slice`, `take`, `takeRight`, `takeRightWhile`, `takeWhile`, `toArray`,\n     * and `where`\n     *\n     * The chainable wrapper methods are:\n     * `after`, `ary`, `assign`, `at`, `before`, `bind`, `bindAll`, `bindKey`,\n     * `callback`, `chain`, `chunk`, `commit`, `compact`, `concat`, `constant`,\n     * `countBy`, `create`, `curry`, `debounce`, `defaults`, `defaultsDeep`,\n     * `defer`, `delay`, `difference`, `drop`, `dropRight`, `dropRightWhile`,\n     * `dropWhile`, `fill`, `filter`, `flatten`, `flattenDeep`, `flow`, `flowRight`,\n     * `forEach`, `forEachRight`, `forIn`, `forInRight`, `forOwn`, `forOwnRight`,\n     * `functions`, `groupBy`, `indexBy`, `initial`, `intersection`, `invert`,\n     * `invoke`, `keys`, `keysIn`, `map`, `mapKeys`, `mapValues`, `matches`,\n     * `matchesProperty`, `memoize`, `merge`, `method`, `methodOf`, `mixin`,\n     * `modArgs`, `negate`, `omit`, `once`, `pairs`, `partial`, `partialRight`,\n     * `partition`, `pick`, `plant`, `pluck`, `property`, `propertyOf`, `pull`,\n     * `pullAt`, `push`, `range`, `rearg`, `reject`, `remove`, `rest`, `restParam`,\n     * `reverse`, `set`, `shuffle`, `slice`, `sort`, `sortBy`, `sortByAll`,\n     * `sortByOrder`, `splice`, `spread`, `take`, `takeRight`, `takeRightWhile`,\n     * `takeWhile`, `tap`, `throttle`, `thru`, `times`, `toArray`, `toPlainObject`,\n     * `transform`, `union`, `uniq`, `unshift`, `unzip`, `unzipWith`, `values`,\n     * `valuesIn`, `where`, `without`, `wrap`, `xor`, `zip`, `zipObject`, `zipWith`\n     *\n     * The wrapper methods that are **not** chainable by default are:\n     * `add`, `attempt`, `camelCase`, `capitalize`, `ceil`, `clone`, `cloneDeep`,\n     * `deburr`, `endsWith`, `escape`, `escapeRegExp`, `every`, `find`, `findIndex`,\n     * `findKey`, `findLast`, `findLastIndex`, `findLastKey`, `findWhere`, `first`,\n     * `floor`, `get`, `gt`, `gte`, `has`, `identity`, `includes`, `indexOf`,\n     * `inRange`, `isArguments`, `isArray`, `isBoolean`, `isDate`, `isElement`,\n     * `isEmpty`, `isEqual`, `isError`, `isFinite` `isFunction`, `isMatch`,\n     * `isNative`, `isNaN`, `isNull`, `isNumber`, `isObject`, `isPlainObject`,\n     * `isRegExp`, `isString`, `isUndefined`, `isTypedArray`, `join`, `kebabCase`,\n     * `last`, `lastIndexOf`, `lt`, `lte`, `max`, `min`, `noConflict`, `noop`,\n     * `now`, `pad`, `padLeft`, `padRight`, `parseInt`, `pop`, `random`, `reduce`,\n     * `reduceRight`, `repeat`, `result`, `round`, `runInContext`, `shift`, `size`,\n     * `snakeCase`, `some`, `sortedIndex`, `sortedLastIndex`, `startCase`,\n     * `startsWith`, `sum`, `template`, `trim`, `trimLeft`, `trimRight`, `trunc`,\n     * `unescape`, `uniqueId`, `value`, and `words`\n     *\n     * The wrapper method `sample` will return a wrapped value when `n` is provided,\n     * otherwise an unwrapped value is returned.\n     *\n     * @name _\n     * @constructor\n     * @category Chain\n     * @param {*} value The value to wrap in a `lodash` instance.\n     * @returns {Object} Returns the new `lodash` wrapper instance.\n     * @example\n     *\n     * var wrapped = _([1, 2, 3]);\n     *\n     * // returns an unwrapped value\n     * wrapped.reduce(function(total, n) {\n     *   return total + n;\n     * });\n     * // => 6\n     *\n     * // returns a wrapped value\n     * var squares = wrapped.map(function(n) {\n     *   return n * n;\n     * });\n     *\n     * _.isArray(squares);\n     * // => false\n     *\n     * _.isArray(squares.value());\n     * // => true\n     */\n    function lodash(value) {\n      if (isObjectLike(value) && !isArray(value) && !(value instanceof LazyWrapper)) {\n        if (value instanceof LodashWrapper) {\n          return value;\n        }\n        if (hasOwnProperty.call(value, '__chain__') && hasOwnProperty.call(value, '__wrapped__')) {\n          return wrapperClone(value);\n        }\n      }\n      return new LodashWrapper(value);\n    }\n\n    /**\n     * The function whose prototype all chaining wrappers inherit from.\n     *\n     * @private\n     */\n    function baseLodash() {\n      // No operation performed.\n    }\n\n    /**\n     * The base constructor for creating `lodash` wrapper objects.\n     *\n     * @private\n     * @param {*} value The value to wrap.\n     * @param {boolean} [chainAll] Enable chaining for all wrapper methods.\n     * @param {Array} [actions=[]] Actions to peform to resolve the unwrapped value.\n     */\n    function LodashWrapper(value, chainAll, actions) {\n      this.__wrapped__ = value;\n      this.__actions__ = actions || [];\n      this.__chain__ = !!chainAll;\n    }\n\n    /**\n     * An object environment feature flags.\n     *\n     * @static\n     * @memberOf _\n     * @type Object\n     */\n    var support = lodash.support = {};\n\n    /**\n     * By default, the template delimiters used by lodash are like those in\n     * embedded Ruby (ERB). Change the following template settings to use\n     * alternative delimiters.\n     *\n     * @static\n     * @memberOf _\n     * @type Object\n     */\n    lodash.templateSettings = {\n\n      /**\n       * Used to detect `data` property values to be HTML-escaped.\n       *\n       * @memberOf _.templateSettings\n       * @type RegExp\n       */\n      'escape': reEscape,\n\n      /**\n       * Used to detect code to be evaluated.\n       *\n       * @memberOf _.templateSettings\n       * @type RegExp\n       */\n      'evaluate': reEvaluate,\n\n      /**\n       * Used to detect `data` property values to inject.\n       *\n       * @memberOf _.templateSettings\n       * @type RegExp\n       */\n      'interpolate': reInterpolate,\n\n      /**\n       * Used to reference the data object in the template text.\n       *\n       * @memberOf _.templateSettings\n       * @type string\n       */\n      'variable': '',\n\n      /**\n       * Used to import variables into the compiled template.\n       *\n       * @memberOf _.templateSettings\n       * @type Object\n       */\n      'imports': {\n\n        /**\n         * A reference to the `lodash` function.\n         *\n         * @memberOf _.templateSettings.imports\n         * @type Function\n         */\n        '_': lodash\n      }\n    };\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Creates a lazy wrapper object which wraps `value` to enable lazy evaluation.\n     *\n     * @private\n     * @param {*} value The value to wrap.\n     */\n    function LazyWrapper(value) {\n      this.__wrapped__ = value;\n      this.__actions__ = [];\n      this.__dir__ = 1;\n      this.__filtered__ = false;\n      this.__iteratees__ = [];\n      this.__takeCount__ = POSITIVE_INFINITY;\n      this.__views__ = [];\n    }\n\n    /**\n     * Creates a clone of the lazy wrapper object.\n     *\n     * @private\n     * @name clone\n     * @memberOf LazyWrapper\n     * @returns {Object} Returns the cloned `LazyWrapper` object.\n     */\n    function lazyClone() {\n      var result = new LazyWrapper(this.__wrapped__);\n      result.__actions__ = arrayCopy(this.__actions__);\n      result.__dir__ = this.__dir__;\n      result.__filtered__ = this.__filtered__;\n      result.__iteratees__ = arrayCopy(this.__iteratees__);\n      result.__takeCount__ = this.__takeCount__;\n      result.__views__ = arrayCopy(this.__views__);\n      return result;\n    }\n\n    /**\n     * Reverses the direction of lazy iteration.\n     *\n     * @private\n     * @name reverse\n     * @memberOf LazyWrapper\n     * @returns {Object} Returns the new reversed `LazyWrapper` object.\n     */\n    function lazyReverse() {\n      if (this.__filtered__) {\n        var result = new LazyWrapper(this);\n        result.__dir__ = -1;\n        result.__filtered__ = true;\n      } else {\n        result = this.clone();\n        result.__dir__ *= -1;\n      }\n      return result;\n    }\n\n    /**\n     * Extracts the unwrapped value from its lazy wrapper.\n     *\n     * @private\n     * @name value\n     * @memberOf LazyWrapper\n     * @returns {*} Returns the unwrapped value.\n     */\n    function lazyValue() {\n      var array = this.__wrapped__.value(),\n          dir = this.__dir__,\n          isArr = isArray(array),\n          isRight = dir < 0,\n          arrLength = isArr ? array.length : 0,\n          view = getView(0, arrLength, this.__views__),\n          start = view.start,\n          end = view.end,\n          length = end - start,\n          index = isRight ? end : (start - 1),\n          iteratees = this.__iteratees__,\n          iterLength = iteratees.length,\n          resIndex = 0,\n          takeCount = nativeMin(length, this.__takeCount__);\n\n      if (!isArr || arrLength < LARGE_ARRAY_SIZE || (arrLength == length && takeCount == length)) {\n        return baseWrapperValue((isRight && isArr) ? array.reverse() : array, this.__actions__);\n      }\n      var result = [];\n\n      outer:\n      while (length-- && resIndex < takeCount) {\n        index += dir;\n\n        var iterIndex = -1,\n            value = array[index];\n\n        while (++iterIndex < iterLength) {\n          var data = iteratees[iterIndex],\n              iteratee = data.iteratee,\n              type = data.type,\n              computed = iteratee(value);\n\n          if (type == LAZY_MAP_FLAG) {\n            value = computed;\n          } else if (!computed) {\n            if (type == LAZY_FILTER_FLAG) {\n              continue outer;\n            } else {\n              break outer;\n            }\n          }\n        }\n        result[resIndex++] = value;\n      }\n      return result;\n    }\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Creates a cache object to store key/value pairs.\n     *\n     * @private\n     * @static\n     * @name Cache\n     * @memberOf _.memoize\n     */\n    function MapCache() {\n      this.__data__ = {};\n    }\n\n    /**\n     * Removes `key` and its value from the cache.\n     *\n     * @private\n     * @name delete\n     * @memberOf _.memoize.Cache\n     * @param {string} key The key of the value to remove.\n     * @returns {boolean} Returns `true` if the entry was removed successfully, else `false`.\n     */\n    function mapDelete(key) {\n      return this.has(key) && delete this.__data__[key];\n    }\n\n    /**\n     * Gets the cached value for `key`.\n     *\n     * @private\n     * @name get\n     * @memberOf _.memoize.Cache\n     * @param {string} key The key of the value to get.\n     * @returns {*} Returns the cached value.\n     */\n    function mapGet(key) {\n      return key == '__proto__' ? undefined : this.__data__[key];\n    }\n\n    /**\n     * Checks if a cached value for `key` exists.\n     *\n     * @private\n     * @name has\n     * @memberOf _.memoize.Cache\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     */\n    function mapHas(key) {\n      return key != '__proto__' && hasOwnProperty.call(this.__data__, key);\n    }\n\n    /**\n     * Sets `value` to `key` of the cache.\n     *\n     * @private\n     * @name set\n     * @memberOf _.memoize.Cache\n     * @param {string} key The key of the value to cache.\n     * @param {*} value The value to cache.\n     * @returns {Object} Returns the cache object.\n     */\n    function mapSet(key, value) {\n      if (key != '__proto__') {\n        this.__data__[key] = value;\n      }\n      return this;\n    }\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     *\n     * Creates a cache object to store unique values.\n     *\n     * @private\n     * @param {Array} [values] The values to cache.\n     */\n    function SetCache(values) {\n      var length = values ? values.length : 0;\n\n      this.data = { 'hash': nativeCreate(null), 'set': new Set };\n      while (length--) {\n        this.push(values[length]);\n      }\n    }\n\n    /**\n     * Checks if `value` is in `cache` mimicking the return signature of\n     * `_.indexOf` by returning `0` if the value is found, else `-1`.\n     *\n     * @private\n     * @param {Object} cache The cache to search.\n     * @param {*} value The value to search for.\n     * @returns {number} Returns `0` if `value` is found, else `-1`.\n     */\n    function cacheIndexOf(cache, value) {\n      var data = cache.data,\n          result = (typeof value == 'string' || isObject(value)) ? data.set.has(value) : data.hash[value];\n\n      return result ? 0 : -1;\n    }\n\n    /**\n     * Adds `value` to the cache.\n     *\n     * @private\n     * @name push\n     * @memberOf SetCache\n     * @param {*} value The value to cache.\n     */\n    function cachePush(value) {\n      var data = this.data;\n      if (typeof value == 'string' || isObject(value)) {\n        data.set.add(value);\n      } else {\n        data.hash[value] = true;\n      }\n    }\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Creates a new array joining `array` with `other`.\n     *\n     * @private\n     * @param {Array} array The array to join.\n     * @param {Array} other The other array to join.\n     * @returns {Array} Returns the new concatenated array.\n     */\n    function arrayConcat(array, other) {\n      var index = -1,\n          length = array.length,\n          othIndex = -1,\n          othLength = other.length,\n          result = Array(length + othLength);\n\n      while (++index < length) {\n        result[index] = array[index];\n      }\n      while (++othIndex < othLength) {\n        result[index++] = other[othIndex];\n      }\n      return result;\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     */\n    function arrayCopy(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     * A specialized version of `_.forEach` for arrays without support for callback\n     * shorthands and `this` binding.\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     */\n    function arrayEach(array, iteratee) {\n      var index = -1,\n          length = array.length;\n\n      while (++index < length) {\n        if (iteratee(array[index], index, array) === false) {\n          break;\n        }\n      }\n      return array;\n    }\n\n    /**\n     * A specialized version of `_.forEachRight` for arrays without support for\n     * callback shorthands and `this` binding.\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     */\n    function arrayEachRight(array, iteratee) {\n      var length = array.length;\n\n      while (length--) {\n        if (iteratee(array[length], length, array) === false) {\n          break;\n        }\n      }\n      return array;\n    }\n\n    /**\n     * A specialized version of `_.every` for arrays without support for callback\n     * shorthands and `this` binding.\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 all elements pass the predicate check,\n     *  else `false`.\n     */\n    function arrayEvery(array, predicate) {\n      var index = -1,\n          length = array.length;\n\n      while (++index < length) {\n        if (!predicate(array[index], index, array)) {\n          return false;\n        }\n      }\n      return true;\n    }\n\n    /**\n     * A specialized version of `baseExtremum` for arrays which invokes `iteratee`\n     * with one argument: (value).\n     *\n     * @private\n     * @param {Array} array The array to iterate over.\n     * @param {Function} iteratee The function invoked per iteration.\n     * @param {Function} comparator The function used to compare values.\n     * @param {*} exValue The initial extremum value.\n     * @returns {*} Returns the extremum value.\n     */\n    function arrayExtremum(array, iteratee, comparator, exValue) {\n      var index = -1,\n          length = array.length,\n          computed = exValue,\n          result = computed;\n\n      while (++index < length) {\n        var value = array[index],\n            current = +iteratee(value);\n\n        if (comparator(current, computed)) {\n          computed = current;\n          result = value;\n        }\n      }\n      return result;\n    }\n\n    /**\n     * A specialized version of `_.filter` for arrays without support for callback\n     * shorthands and `this` binding.\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     */\n    function arrayFilter(array, predicate) {\n      var index = -1,\n          length = array.length,\n          resIndex = -1,\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\n    /**\n     * A specialized version of `_.map` for arrays without support for callback\n     * shorthands and `this` binding.\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     */\n    function arrayMap(array, iteratee) {\n      var index = -1,\n          length = 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\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     */\n    function 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 callback\n     * shorthands and `this` binding.\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} [initFromArray] Specify using the first element of `array`\n     *  as the initial value.\n     * @returns {*} Returns the accumulated value.\n     */\n    function arrayReduce(array, iteratee, accumulator, initFromArray) {\n      var index = -1,\n          length = array.length;\n\n      if (initFromArray && 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     * A specialized version of `_.reduceRight` for arrays without support for\n     * callback shorthands and `this` binding.\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} [initFromArray] Specify using the last element of `array`\n     *  as the initial value.\n     * @returns {*} Returns the accumulated value.\n     */\n    function arrayReduceRight(array, iteratee, accumulator, initFromArray) {\n      var length = array.length;\n      if (initFromArray && length) {\n        accumulator = array[--length];\n      }\n      while (length--) {\n        accumulator = iteratee(accumulator, array[length], length, array);\n      }\n      return accumulator;\n    }\n\n    /**\n     * A specialized version of `_.some` for arrays without support for callback\n     * shorthands and `this` binding.\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     */\n    function arraySome(array, predicate) {\n      var index = -1,\n          length = array.length;\n\n      while (++index < length) {\n        if (predicate(array[index], index, array)) {\n          return true;\n        }\n      }\n      return false;\n    }\n\n    /**\n     * A specialized version of `_.sum` for arrays without support for callback\n     * shorthands and `this` binding..\n     *\n     * @private\n     * @param {Array} array The array to iterate over.\n     * @param {Function} iteratee The function invoked per iteration.\n     * @returns {number} Returns the sum.\n     */\n    function arraySum(array, iteratee) {\n      var length = array.length,\n          result = 0;\n\n      while (length--) {\n        result += +iteratee(array[length]) || 0;\n      }\n      return result;\n    }\n\n    /**\n     * Used by `_.defaults` to customize its `_.assign` use.\n     *\n     * @private\n     * @param {*} objectValue The destination object property value.\n     * @param {*} sourceValue The source object property value.\n     * @returns {*} Returns the value to assign to the destination object.\n     */\n    function assignDefaults(objectValue, sourceValue) {\n      return objectValue === undefined ? sourceValue : objectValue;\n    }\n\n    /**\n     * Used by `_.template` to customize its `_.assign` use.\n     *\n     * **Note:** This function is like `assignDefaults` except that it ignores\n     * inherited property values when checking if a property is `undefined`.\n     *\n     * @private\n     * @param {*} objectValue The destination object property value.\n     * @param {*} sourceValue The source object property value.\n     * @param {string} key The key associated with the object and source values.\n     * @param {Object} object The destination object.\n     * @returns {*} Returns the value to assign to the destination object.\n     */\n    function assignOwnDefaults(objectValue, sourceValue, key, object) {\n      return (objectValue === undefined || !hasOwnProperty.call(object, key))\n        ? sourceValue\n        : objectValue;\n    }\n\n    /**\n     * A specialized version of `_.assign` for customizing assigned values without\n     * support for argument juggling, multiple sources, and `this` binding `customizer`\n     * functions.\n     *\n     * @private\n     * @param {Object} object The destination object.\n     * @param {Object} source The source object.\n     * @param {Function} customizer The function to customize assigned values.\n     * @returns {Object} Returns `object`.\n     */\n    function assignWith(object, source, customizer) {\n      var index = -1,\n          props = keys(source),\n          length = props.length;\n\n      while (++index < length) {\n        var key = props[index],\n            value = object[key],\n            result = customizer(value, source[key], key, object, source);\n\n        if ((result === result ? (result !== value) : (value === value)) ||\n            (value === undefined && !(key in object))) {\n          object[key] = result;\n        }\n      }\n      return object;\n    }\n\n    /**\n     * The base implementation of `_.assign` without support for argument juggling,\n     * multiple sources, and `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     */\n    function baseAssign(object, source) {\n      return source == null\n        ? object\n        : baseCopy(source, keys(source), object);\n    }\n\n    /**\n     * The base implementation of `_.at` without support for string collections\n     * and individual key arguments.\n     *\n     * @private\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {number[]|string[]} props The property names or indexes of elements to pick.\n     * @returns {Array} Returns the new array of picked elements.\n     */\n    function baseAt(collection, props) {\n      var index = -1,\n          isNil = collection == null,\n          isArr = !isNil && isArrayLike(collection),\n          length = isArr ? collection.length : 0,\n          propsLength = props.length,\n          result = Array(propsLength);\n\n      while(++index < propsLength) {\n        var key = props[index];\n        if (isArr) {\n          result[index] = isIndex(key, length) ? collection[key] : undefined;\n        } else {\n          result[index] = isNil ? undefined : collection[key];\n        }\n      }\n      return result;\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 names to copy.\n     * @param {Object} [object={}] The object to copy properties to.\n     * @returns {Object} Returns `object`.\n     */\n    function baseCopy(source, props, object) {\n      object || (object = {});\n\n      var index = -1,\n          length = props.length;\n\n      while (++index < length) {\n        var key = props[index];\n        object[key] = source[key];\n      }\n      return object;\n    }\n\n    /**\n     * The base implementation of `_.callback` which supports specifying the\n     * number of arguments to provide to `func`.\n     *\n     * @private\n     * @param {*} [func=_.identity] The value to convert to a callback.\n     * @param {*} [thisArg] The `this` binding of `func`.\n     * @param {number} [argCount] The number of arguments to provide to `func`.\n     * @returns {Function} Returns the callback.\n     */\n    function baseCallback(func, thisArg, argCount) {\n      var type = typeof func;\n      if (type == 'function') {\n        return thisArg === undefined\n          ? func\n          : bindCallback(func, thisArg, argCount);\n      }\n      if (func == null) {\n        return identity;\n      }\n      if (type == 'object') {\n        return baseMatches(func);\n      }\n      return thisArg === undefined\n        ? property(func)\n        : baseMatchesProperty(func, thisArg);\n    }\n\n    /**\n     * The base implementation of `_.clone` without support for argument juggling\n     * and `this` binding `customizer` functions.\n     *\n     * @private\n     * @param {*} value The value to clone.\n     * @param {boolean} [isDeep] Specify a deep clone.\n     * @param {Function} [customizer] The function to customize cloning values.\n     * @param {string} [key] The key of `value`.\n     * @param {Object} [object] The object `value` belongs to.\n     * @param {Array} [stackA=[]] Tracks traversed source objects.\n     * @param {Array} [stackB=[]] Associates clones with source counterparts.\n     * @returns {*} Returns the cloned value.\n     */\n    function baseClone(value, isDeep, customizer, key, object, stackA, stackB) {\n      var result;\n      if (customizer) {\n        result = object ? customizer(value, key, object) : 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 arrayCopy(value, result);\n        }\n      } else {\n        var tag = objToString.call(value),\n            isFunc = tag == funcTag;\n\n        if (tag == objectTag || tag == argsTag || (isFunc && !object)) {\n          result = initCloneObject(isFunc ? {} : value);\n          if (!isDeep) {\n            return baseAssign(result, value);\n          }\n        } else {\n          return cloneableTags[tag]\n            ? initCloneByTag(value, tag, isDeep)\n            : (object ? value : {});\n        }\n      }\n      // Check for circular references and return its corresponding clone.\n      stackA || (stackA = []);\n      stackB || (stackB = []);\n\n      var length = stackA.length;\n      while (length--) {\n        if (stackA[length] == value) {\n          return stackB[length];\n        }\n      }\n      // Add the source value to the stack of traversed objects and associate it with its clone.\n      stackA.push(value);\n      stackB.push(result);\n\n      // Recursively populate clone (susceptible to call stack limits).\n      (isArr ? arrayEach : baseForOwn)(value, function(subValue, key) {\n        result[key] = baseClone(subValue, isDeep, customizer, key, value, stackA, stackB);\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     */\n    var baseCreate = (function() {\n      function object() {}\n      return function(prototype) {\n        if (isObject(prototype)) {\n          object.prototype = prototype;\n          var result = new object;\n          object.prototype = undefined;\n        }\n        return result || {};\n      };\n    }());\n\n    /**\n     * The base implementation of `_.delay` and `_.defer` which accepts an index\n     * of where to slice the arguments to provide to `func`.\n     *\n     * @private\n     * @param {Function} func The function to delay.\n     * @param {number} wait The number of milliseconds to delay invocation.\n     * @param {Object} args The arguments provide to `func`.\n     * @returns {number} Returns the timer id.\n     */\n    function baseDelay(func, wait, args) {\n      if (typeof func != 'function') {\n        throw new TypeError(FUNC_ERROR_TEXT);\n      }\n      return setTimeout(function() { func.apply(undefined, args); }, wait);\n    }\n\n    /**\n     * The base implementation of `_.difference` which accepts a single array\n     * of values to exclude.\n     *\n     * @private\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     */\n    function baseDifference(array, values) {\n      var length = array ? array.length : 0,\n          result = [];\n\n      if (!length) {\n        return result;\n      }\n      var index = -1,\n          indexOf = getIndexOf(),\n          isCommon = indexOf == baseIndexOf,\n          cache = (isCommon && values.length >= LARGE_ARRAY_SIZE) ? createCache(values) : null,\n          valuesLength = values.length;\n\n      if (cache) {\n        indexOf = cacheIndexOf;\n        isCommon = false;\n        values = cache;\n      }\n      outer:\n      while (++index < length) {\n        var value = array[index];\n\n        if (isCommon && value === value) {\n          var valuesIndex = valuesLength;\n          while (valuesIndex--) {\n            if (values[valuesIndex] === value) {\n              continue outer;\n            }\n          }\n          result.push(value);\n        }\n        else if (indexOf(values, value, 0) < 0) {\n          result.push(value);\n        }\n      }\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.forEach` without support for callback\n     * shorthands and `this` binding.\n     *\n     * @private\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {Function} iteratee The function invoked per iteration.\n     * @returns {Array|Object|string} Returns `collection`.\n     */\n    var baseEach = createBaseEach(baseForOwn);\n\n    /**\n     * The base implementation of `_.forEachRight` without support for callback\n     * shorthands and `this` binding.\n     *\n     * @private\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {Function} iteratee The function invoked per iteration.\n     * @returns {Array|Object|string} Returns `collection`.\n     */\n    var baseEachRight = createBaseEach(baseForOwnRight, true);\n\n    /**\n     * The base implementation of `_.every` without support for callback\n     * shorthands and `this` binding.\n     *\n     * @private\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {Function} predicate The function invoked per iteration.\n     * @returns {boolean} Returns `true` if all elements pass the predicate check,\n     *  else `false`\n     */\n    function baseEvery(collection, predicate) {\n      var result = true;\n      baseEach(collection, function(value, index, collection) {\n        result = !!predicate(value, index, collection);\n        return result;\n      });\n      return result;\n    }\n\n    /**\n     * Gets the extremum value of `collection` invoking `iteratee` for each value\n     * in `collection` to generate the criterion by which the value is ranked.\n     * The `iteratee` is invoked with three arguments: (value, index|key, collection).\n     *\n     * @private\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {Function} iteratee The function invoked per iteration.\n     * @param {Function} comparator The function used to compare values.\n     * @param {*} exValue The initial extremum value.\n     * @returns {*} Returns the extremum value.\n     */\n    function baseExtremum(collection, iteratee, comparator, exValue) {\n      var computed = exValue,\n          result = computed;\n\n      baseEach(collection, function(value, index, collection) {\n        var current = +iteratee(value, index, collection);\n        if (comparator(current, computed) || (current === exValue && current === result)) {\n          computed = current;\n          result = value;\n        }\n      });\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.fill` without an iteratee call guard.\n     *\n     * @private\n     * @param {Array} array The array to fill.\n     * @param {*} value The value to fill `array` with.\n     * @param {number} [start=0] The start position.\n     * @param {number} [end=array.length] The end position.\n     * @returns {Array} Returns `array`.\n     */\n    function baseFill(array, value, start, end) {\n      var length = array.length;\n\n      start = start == null ? 0 : (+start || 0);\n      if (start < 0) {\n        start = -start > length ? 0 : (length + start);\n      }\n      end = (end === undefined || end > length) ? length : (+end || 0);\n      if (end < 0) {\n        end += length;\n      }\n      length = start > end ? 0 : (end >>> 0);\n      start >>>= 0;\n\n      while (start < length) {\n        array[start++] = value;\n      }\n      return array;\n    }\n\n    /**\n     * The base implementation of `_.filter` without support for callback\n     * shorthands and `this` binding.\n     *\n     * @private\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {Function} predicate The function invoked per iteration.\n     * @returns {Array} Returns the new filtered array.\n     */\n    function baseFilter(collection, predicate) {\n      var result = [];\n      baseEach(collection, function(value, index, collection) {\n        if (predicate(value, index, collection)) {\n          result.push(value);\n        }\n      });\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.find`, `_.findLast`, `_.findKey`, and `_.findLastKey`,\n     * without support for callback shorthands and `this` binding, which iterates\n     * over `collection` using the provided `eachFunc`.\n     *\n     * @private\n     * @param {Array|Object|string} collection The collection to search.\n     * @param {Function} predicate The function invoked per iteration.\n     * @param {Function} eachFunc The function to iterate over `collection`.\n     * @param {boolean} [retKey] Specify returning the key of the found element\n     *  instead of the element itself.\n     * @returns {*} Returns the found element or its key, else `undefined`.\n     */\n    function baseFind(collection, predicate, eachFunc, retKey) {\n      var result;\n      eachFunc(collection, function(value, key, collection) {\n        if (predicate(value, key, collection)) {\n          result = retKey ? key : value;\n          return false;\n        }\n      });\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.flatten` with added support for restricting\n     * flattening and specifying the start index.\n     *\n     * @private\n     * @param {Array} array The array to flatten.\n     * @param {boolean} [isDeep] Specify a deep flatten.\n     * @param {boolean} [isStrict] Restrict flattening to arrays-like objects.\n     * @param {Array} [result=[]] The initial result value.\n     * @returns {Array} Returns the new flattened array.\n     */\n    function baseFlatten(array, isDeep, isStrict, result) {\n      result || (result = []);\n\n      var index = -1,\n          length = array.length;\n\n      while (++index < length) {\n        var value = array[index];\n        if (isObjectLike(value) && isArrayLike(value) &&\n            (isStrict || isArray(value) || isArguments(value))) {\n          if (isDeep) {\n            // Recursively flatten arrays (susceptible to call stack limits).\n            baseFlatten(value, isDeep, 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\n    /**\n     * The base implementation of `baseForIn` and `baseForOwn` which iterates\n     * over `object` properties returned by `keysFunc` invoking `iteratee` for\n     * each property. Iteratee functions may exit iteration early by explicitly\n     * 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     */\n    var baseFor = createBaseFor();\n\n    /**\n     * This function is like `baseFor` except that it iterates over properties\n     * in the opposite order.\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     */\n    var baseForRight = createBaseFor(true);\n\n    /**\n     * The base implementation of `_.forIn` without support for callback\n     * shorthands and `this` binding.\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     */\n    function baseForIn(object, iteratee) {\n      return baseFor(object, iteratee, keysIn);\n    }\n\n    /**\n     * The base implementation of `_.forOwn` without support for callback\n     * shorthands and `this` binding.\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     */\n    function baseForOwn(object, iteratee) {\n      return baseFor(object, iteratee, keys);\n    }\n\n    /**\n     * The base implementation of `_.forOwnRight` without support for callback\n     * shorthands and `this` binding.\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     */\n    function baseForOwnRight(object, iteratee) {\n      return baseForRight(object, iteratee, keys);\n    }\n\n    /**\n     * The base implementation of `_.functions` which creates an array of\n     * `object` function property names filtered from those provided.\n     *\n     * @private\n     * @param {Object} object The object to inspect.\n     * @param {Array} props The property names to filter.\n     * @returns {Array} Returns the new array of filtered property names.\n     */\n    function baseFunctions(object, props) {\n      var index = -1,\n          length = props.length,\n          resIndex = -1,\n          result = [];\n\n      while (++index < length) {\n        var key = props[index];\n        if (isFunction(object[key])) {\n          result[++resIndex] = key;\n        }\n      }\n      return result;\n    }\n\n    /**\n     * The base implementation of `get` without support for string paths\n     * and default values.\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @param {Array} path The path of the property to get.\n     * @param {string} [pathKey] The key representation of path.\n     * @returns {*} Returns the resolved value.\n     */\n    function baseGet(object, path, pathKey) {\n      if (object == null) {\n        return;\n      }\n      if (pathKey !== undefined && pathKey in toObject(object)) {\n        path = [pathKey];\n      }\n      var index = 0,\n          length = path.length;\n\n      while (object != null && index < length) {\n        object = object[path[index++]];\n      }\n      return (index && index == length) ? object : undefined;\n    }\n\n    /**\n     * The base implementation of `_.isEqual` without support for `this` binding\n     * `customizer` functions.\n     *\n     * @private\n     * @param {*} value The value to compare.\n     * @param {*} other The other value to compare.\n     * @param {Function} [customizer] The function to customize comparing values.\n     * @param {boolean} [isLoose] Specify performing partial comparisons.\n     * @param {Array} [stackA] Tracks traversed `value` objects.\n     * @param {Array} [stackB] Tracks traversed `other` objects.\n     * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n     */\n    function baseIsEqual(value, other, customizer, isLoose, stackA, stackB) {\n      if (value === other) {\n        return true;\n      }\n      if (value == null || other == null || (!isObject(value) && !isObjectLike(other))) {\n        return value !== value && other !== other;\n      }\n      return baseIsEqualDeep(value, other, baseIsEqual, customizer, isLoose, stackA, stackB);\n    }\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 {Function} equalFunc The function to determine equivalents of values.\n     * @param {Function} [customizer] The function to customize comparing objects.\n     * @param {boolean} [isLoose] Specify performing partial comparisons.\n     * @param {Array} [stackA=[]] Tracks traversed `value` objects.\n     * @param {Array} [stackB=[]] Tracks traversed `other` objects.\n     * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n     */\n    function baseIsEqualDeep(object, other, equalFunc, customizer, isLoose, stackA, stackB) {\n      var objIsArr = isArray(object),\n          othIsArr = isArray(other),\n          objTag = arrayTag,\n          othTag = arrayTag;\n\n      if (!objIsArr) {\n        objTag = objToString.call(object);\n        if (objTag == argsTag) {\n          objTag = objectTag;\n        } else if (objTag != objectTag) {\n          objIsArr = isTypedArray(object);\n        }\n      }\n      if (!othIsArr) {\n        othTag = objToString.call(other);\n        if (othTag == argsTag) {\n          othTag = objectTag;\n        } else if (othTag != objectTag) {\n          othIsArr = isTypedArray(other);\n        }\n      }\n      var objIsObj = objTag == objectTag,\n          othIsObj = othTag == objectTag,\n          isSameTag = objTag == othTag;\n\n      if (isSameTag && !(objIsArr || objIsObj)) {\n        return equalByTag(object, other, objTag);\n      }\n      if (!isLoose) {\n        var objIsWrapped = objIsObj && hasOwnProperty.call(object, '__wrapped__'),\n            othIsWrapped = othIsObj && hasOwnProperty.call(other, '__wrapped__');\n\n        if (objIsWrapped || othIsWrapped) {\n          return equalFunc(objIsWrapped ? object.value() : object, othIsWrapped ? other.value() : other, customizer, isLoose, stackA, stackB);\n        }\n      }\n      if (!isSameTag) {\n        return false;\n      }\n      // Assume cyclic values are equal.\n      // For more information on detecting circular references see https://es5.github.io/#JO.\n      stackA || (stackA = []);\n      stackB || (stackB = []);\n\n      var length = stackA.length;\n      while (length--) {\n        if (stackA[length] == object) {\n          return stackB[length] == other;\n        }\n      }\n      // Add `object` and `other` to the stack of traversed objects.\n      stackA.push(object);\n      stackB.push(other);\n\n      var result = (objIsArr ? equalArrays : equalObjects)(object, other, equalFunc, customizer, isLoose, stackA, stackB);\n\n      stackA.pop();\n      stackB.pop();\n\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.isMatch` without support for callback\n     * shorthands and `this` binding.\n     *\n     * @private\n     * @param {Object} object The object to inspect.\n     * @param {Array} matchData The propery names, values, and compare flags to match.\n     * @param {Function} [customizer] The function to customize comparing objects.\n     * @returns {boolean} Returns `true` if `object` is a match, else `false`.\n     */\n    function baseIsMatch(object, matchData, customizer) {\n      var index = matchData.length,\n          length = index,\n          noCustomizer = !customizer;\n\n      if (object == null) {\n        return !length;\n      }\n      object = toObject(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 result = customizer ? customizer(objValue, srcValue, key) : undefined;\n          if (!(result === undefined ? baseIsEqual(srcValue, objValue, customizer, true) : result)) {\n            return false;\n          }\n        }\n      }\n      return true;\n    }\n\n    /**\n     * The base implementation of `_.map` without support for callback shorthands\n     * and `this` binding.\n     *\n     * @private\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {Function} iteratee The function invoked per iteration.\n     * @returns {Array} Returns the new mapped array.\n     */\n    function 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\n    /**\n     * The base implementation of `_.matches` which does not clone `source`.\n     *\n     * @private\n     * @param {Object} source The object of property values to match.\n     * @returns {Function} Returns the new function.\n     */\n    function baseMatches(source) {\n      var matchData = getMatchData(source);\n      if (matchData.length == 1 && matchData[0][2]) {\n        var key = matchData[0][0],\n            value = matchData[0][1];\n\n        return function(object) {\n          if (object == null) {\n            return false;\n          }\n          return object[key] === value && (value !== undefined || (key in toObject(object)));\n        };\n      }\n      return function(object) {\n        return baseIsMatch(object, matchData);\n      };\n    }\n\n    /**\n     * The base implementation of `_.matchesProperty` which does not clone `srcValue`.\n     *\n     * @private\n     * @param {string} path The path of the property to get.\n     * @param {*} srcValue The value to compare.\n     * @returns {Function} Returns the new function.\n     */\n    function baseMatchesProperty(path, srcValue) {\n      var isArr = isArray(path),\n          isCommon = isKey(path) && isStrictComparable(srcValue),\n          pathKey = (path + '');\n\n      path = toPath(path);\n      return function(object) {\n        if (object == null) {\n          return false;\n        }\n        var key = pathKey;\n        object = toObject(object);\n        if ((isArr || !isCommon) && !(key in object)) {\n          object = path.length == 1 ? object : baseGet(object, baseSlice(path, 0, -1));\n          if (object == null) {\n            return false;\n          }\n          key = last(path);\n          object = toObject(object);\n        }\n        return object[key] === srcValue\n          ? (srcValue !== undefined || (key in object))\n          : baseIsEqual(srcValue, object[key], undefined, true);\n      };\n    }\n\n    /**\n     * The base implementation of `_.merge` without support for argument juggling,\n     * multiple sources, and `this` binding `customizer` functions.\n     *\n     * @private\n     * @param {Object} object The destination object.\n     * @param {Object} source The source object.\n     * @param {Function} [customizer] The function to customize merged values.\n     * @param {Array} [stackA=[]] Tracks traversed source objects.\n     * @param {Array} [stackB=[]] Associates values with source counterparts.\n     * @returns {Object} Returns `object`.\n     */\n    function baseMerge(object, source, customizer, stackA, stackB) {\n      if (!isObject(object)) {\n        return object;\n      }\n      var isSrcArr = isArrayLike(source) && (isArray(source) || isTypedArray(source)),\n          props = isSrcArr ? undefined : keys(source);\n\n      arrayEach(props || source, function(srcValue, key) {\n        if (props) {\n          key = srcValue;\n          srcValue = source[key];\n        }\n        if (isObjectLike(srcValue)) {\n          stackA || (stackA = []);\n          stackB || (stackB = []);\n          baseMergeDeep(object, source, key, baseMerge, customizer, stackA, stackB);\n        }\n        else {\n          var value = object[key],\n              result = customizer ? customizer(value, srcValue, key, object, source) : undefined,\n              isCommon = result === undefined;\n\n          if (isCommon) {\n            result = srcValue;\n          }\n          if ((result !== undefined || (isSrcArr && !(key in object))) &&\n              (isCommon || (result === result ? (result !== value) : (value === value)))) {\n            object[key] = result;\n          }\n        }\n      });\n      return object;\n    }\n\n    /**\n     * A specialized version of `baseMerge` for arrays and objects which performs\n     * deep merges and tracks traversed objects enabling objects with circular\n     * references to be merged.\n     *\n     * @private\n     * @param {Object} object The destination object.\n     * @param {Object} source The source object.\n     * @param {string} key The key of the value to merge.\n     * @param {Function} mergeFunc The function to merge values.\n     * @param {Function} [customizer] The function to customize merged values.\n     * @param {Array} [stackA=[]] Tracks traversed source objects.\n     * @param {Array} [stackB=[]] Associates values with source counterparts.\n     * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n     */\n    function baseMergeDeep(object, source, key, mergeFunc, customizer, stackA, stackB) {\n      var length = stackA.length,\n          srcValue = source[key];\n\n      while (length--) {\n        if (stackA[length] == srcValue) {\n          object[key] = stackB[length];\n          return;\n        }\n      }\n      var value = object[key],\n          result = customizer ? customizer(value, srcValue, key, object, source) : undefined,\n          isCommon = result === undefined;\n\n      if (isCommon) {\n        result = srcValue;\n        if (isArrayLike(srcValue) && (isArray(srcValue) || isTypedArray(srcValue))) {\n          result = isArray(value)\n            ? value\n            : (isArrayLike(value) ? arrayCopy(value) : []);\n        }\n        else if (isPlainObject(srcValue) || isArguments(srcValue)) {\n          result = isArguments(value)\n            ? toPlainObject(value)\n            : (isPlainObject(value) ? value : {});\n        }\n        else {\n          isCommon = false;\n        }\n      }\n      // Add the source value to the stack of traversed objects and associate\n      // it with its merged value.\n      stackA.push(srcValue);\n      stackB.push(result);\n\n      if (isCommon) {\n        // Recursively merge objects and arrays (susceptible to call stack limits).\n        object[key] = mergeFunc(result, srcValue, customizer, stackA, stackB);\n      } else if (result === result ? (result !== value) : (value === value)) {\n        object[key] = result;\n      }\n    }\n\n    /**\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 function.\n     */\n    function baseProperty(key) {\n      return function(object) {\n        return object == null ? undefined : object[key];\n      };\n    }\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 function.\n     */\n    function basePropertyDeep(path) {\n      var pathKey = (path + '');\n      path = toPath(path);\n      return function(object) {\n        return baseGet(object, path, pathKey);\n      };\n    }\n\n    /**\n     * The base implementation of `_.pullAt` without support for individual\n     * index arguments and capturing the removed elements.\n     *\n     * @private\n     * @param {Array} array The array to modify.\n     * @param {number[]} indexes The indexes of elements to remove.\n     * @returns {Array} Returns `array`.\n     */\n    function basePullAt(array, indexes) {\n      var length = array ? indexes.length : 0;\n      while (length--) {\n        var index = indexes[length];\n        if (index != previous && isIndex(index)) {\n          var previous = index;\n          splice.call(array, index, 1);\n        }\n      }\n      return array;\n    }\n\n    /**\n     * The base implementation of `_.random` without support for argument juggling\n     * and returning floating-point numbers.\n     *\n     * @private\n     * @param {number} min The minimum possible value.\n     * @param {number} max The maximum possible value.\n     * @returns {number} Returns the random number.\n     */\n    function baseRandom(min, max) {\n      return min + nativeFloor(nativeRandom() * (max - min + 1));\n    }\n\n    /**\n     * The base implementation of `_.reduce` and `_.reduceRight` without support\n     * for callback shorthands and `this` binding, which iterates over `collection`\n     * using the provided `eachFunc`.\n     *\n     * @private\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {Function} iteratee The function invoked per iteration.\n     * @param {*} accumulator The initial value.\n     * @param {boolean} initFromCollection Specify using the first or last element\n     *  of `collection` as the initial value.\n     * @param {Function} eachFunc The function to iterate over `collection`.\n     * @returns {*} Returns the accumulated value.\n     */\n    function baseReduce(collection, iteratee, accumulator, initFromCollection, eachFunc) {\n      eachFunc(collection, function(value, index, collection) {\n        accumulator = initFromCollection\n          ? (initFromCollection = false, value)\n          : iteratee(accumulator, value, index, collection);\n      });\n      return accumulator;\n    }\n\n    /**\n     * The base implementation of `setData` without support for hot loop detection.\n     *\n     * @private\n     * @param {Function} func The function to associate metadata with.\n     * @param {*} data The metadata.\n     * @returns {Function} Returns `func`.\n     */\n    var baseSetData = !metaMap ? identity : function(func, data) {\n      metaMap.set(func, data);\n      return func;\n    };\n\n    /**\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     */\n    function baseSlice(array, start, end) {\n      var index = -1,\n          length = array.length;\n\n      start = start == null ? 0 : (+start || 0);\n      if (start < 0) {\n        start = -start > length ? 0 : (length + start);\n      }\n      end = (end === undefined || end > length) ? length : (+end || 0);\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\n    /**\n     * The base implementation of `_.some` without support for callback shorthands\n     * and `this` binding.\n     *\n     * @private\n     * @param {Array|Object|string} collection The collection 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     */\n    function baseSome(collection, predicate) {\n      var result;\n\n      baseEach(collection, function(value, index, collection) {\n        result = predicate(value, index, collection);\n        return !result;\n      });\n      return !!result;\n    }\n\n    /**\n     * The base implementation of `_.sortBy` which uses `comparer` to define\n     * the sort order of `array` and replaces criteria objects with their\n     * corresponding 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     */\n    function 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\n    /**\n     * The base implementation of `_.sortByOrder` without param guards.\n     *\n     * @private\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {Function[]|Object[]|string[]} iteratees The iteratees to sort by.\n     * @param {boolean[]} orders The sort orders of `iteratees`.\n     * @returns {Array} Returns the new sorted array.\n     */\n    function baseSortByOrder(collection, iteratees, orders) {\n      var callback = getCallback(),\n          index = -1;\n\n      iteratees = arrayMap(iteratees, function(iteratee) { return callback(iteratee); });\n\n      var result = baseMap(collection, function(value) {\n        var criteria = arrayMap(iteratees, function(iteratee) { return iteratee(value); });\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\n    /**\n     * The base implementation of `_.sum` without support for callback shorthands\n     * and `this` binding.\n     *\n     * @private\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {Function} iteratee The function invoked per iteration.\n     * @returns {number} Returns the sum.\n     */\n    function baseSum(collection, iteratee) {\n      var result = 0;\n      baseEach(collection, function(value, index, collection) {\n        result += +iteratee(value, index, collection) || 0;\n      });\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.uniq` without support for callback shorthands\n     * and `this` binding.\n     *\n     * @private\n     * @param {Array} array The array to inspect.\n     * @param {Function} [iteratee] The function invoked per iteration.\n     * @returns {Array} Returns the new duplicate-value-free array.\n     */\n    function baseUniq(array, iteratee) {\n      var index = -1,\n          indexOf = getIndexOf(),\n          length = array.length,\n          isCommon = indexOf == baseIndexOf,\n          isLarge = isCommon && length >= LARGE_ARRAY_SIZE,\n          seen = isLarge ? createCache() : null,\n          result = [];\n\n      if (seen) {\n        indexOf = cacheIndexOf;\n        isCommon = false;\n      } else {\n        isLarge = false;\n        seen = iteratee ? [] : result;\n      }\n      outer:\n      while (++index < length) {\n        var value = array[index],\n            computed = iteratee ? iteratee(value, index, array) : value;\n\n        if (isCommon && value === value) {\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 (indexOf(seen, computed, 0) < 0) {\n          if (iteratee || isLarge) {\n            seen.push(computed);\n          }\n          result.push(value);\n        }\n      }\n      return result;\n    }\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     */\n    function baseValues(object, props) {\n      var index = -1,\n          length = props.length,\n          result = Array(length);\n\n      while (++index < length) {\n        result[index] = object[props[index]];\n      }\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.dropRightWhile`, `_.dropWhile`, `_.takeRightWhile`,\n     * and `_.takeWhile` without support for callback shorthands and `this` binding.\n     *\n     * @private\n     * @param {Array} array The array to query.\n     * @param {Function} predicate The function invoked per iteration.\n     * @param {boolean} [isDrop] Specify dropping elements instead of taking them.\n     * @param {boolean} [fromRight] Specify iterating from right to left.\n     * @returns {Array} Returns the slice of `array`.\n     */\n    function baseWhile(array, predicate, isDrop, fromRight) {\n      var length = array.length,\n          index = fromRight ? length : -1;\n\n      while ((fromRight ? index-- : ++index < length) && predicate(array[index], index, array)) {}\n      return isDrop\n        ? baseSlice(array, (fromRight ? 0 : index), (fromRight ? index + 1 : length))\n        : baseSlice(array, (fromRight ? index + 1 : 0), (fromRight ? length : index));\n    }\n\n    /**\n     * The base implementation of `wrapperValue` which returns the result of\n     * performing a sequence of actions on the unwrapped `value`, where each\n     * successive action is supplied the return value of the previous.\n     *\n     * @private\n     * @param {*} value The unwrapped value.\n     * @param {Array} actions Actions to peform to resolve the unwrapped value.\n     * @returns {*} Returns the resolved value.\n     */\n    function baseWrapperValue(value, actions) {\n      var result = value;\n      if (result instanceof LazyWrapper) {\n        result = result.value();\n      }\n      var index = -1,\n          length = actions.length;\n\n      while (++index < length) {\n        var action = actions[index];\n        result = action.func.apply(action.thisArg, arrayPush([result], action.args));\n      }\n      return result;\n    }\n\n    /**\n     * Performs a binary search of `array` to determine the index at which `value`\n     * should be inserted into `array` in order to maintain its sort order.\n     *\n     * @private\n     * @param {Array} array The sorted array to inspect.\n     * @param {*} value The value to evaluate.\n     * @param {boolean} [retHighest] Specify returning the highest qualified index.\n     * @returns {number} Returns the index at which `value` should be inserted\n     *  into `array`.\n     */\n    function binaryIndex(array, value, retHighest) {\n      var low = 0,\n          high = array ? array.length : low;\n\n      if (typeof value == 'number' && value === value && high <= HALF_MAX_ARRAY_LENGTH) {\n        while (low < high) {\n          var mid = (low + high) >>> 1,\n              computed = array[mid];\n\n          if ((retHighest ? (computed <= value) : (computed < value)) && computed !== null) {\n            low = mid + 1;\n          } else {\n            high = mid;\n          }\n        }\n        return high;\n      }\n      return binaryIndexBy(array, value, identity, retHighest);\n    }\n\n    /**\n     * This function is like `binaryIndex` except that it invokes `iteratee` for\n     * `value` and each element of `array` to compute their sort ranking. The\n     * iteratee is invoked with one argument; (value).\n     *\n     * @private\n     * @param {Array} array The sorted array to inspect.\n     * @param {*} value The value to evaluate.\n     * @param {Function} iteratee The function invoked per iteration.\n     * @param {boolean} [retHighest] Specify returning the highest qualified index.\n     * @returns {number} Returns the index at which `value` should be inserted\n     *  into `array`.\n     */\n    function binaryIndexBy(array, value, iteratee, retHighest) {\n      value = iteratee(value);\n\n      var low = 0,\n          high = array ? array.length : 0,\n          valIsNaN = value !== value,\n          valIsNull = value === null,\n          valIsUndef = value === undefined;\n\n      while (low < high) {\n        var mid = nativeFloor((low + high) / 2),\n            computed = iteratee(array[mid]),\n            isDef = computed !== undefined,\n            isReflexive = computed === computed;\n\n        if (valIsNaN) {\n          var setLow = isReflexive || retHighest;\n        } else if (valIsNull) {\n          setLow = isReflexive && isDef && (retHighest || computed != null);\n        } else if (valIsUndef) {\n          setLow = isReflexive && (retHighest || isDef);\n        } else if (computed == null) {\n          setLow = false;\n        } else {\n          setLow = retHighest ? (computed <= value) : (computed < value);\n        }\n        if (setLow) {\n          low = mid + 1;\n        } else {\n          high = mid;\n        }\n      }\n      return nativeMin(high, MAX_ARRAY_INDEX);\n    }\n\n    /**\n     * A specialized version of `baseCallback` which only supports `this` binding\n     * and specifying the number of arguments to provide to `func`.\n     *\n     * @private\n     * @param {Function} func The function to bind.\n     * @param {*} thisArg The `this` binding of `func`.\n     * @param {number} [argCount] The number of arguments to provide to `func`.\n     * @returns {Function} Returns the callback.\n     */\n    function bindCallback(func, thisArg, argCount) {\n      if (typeof func != 'function') {\n        return identity;\n      }\n      if (thisArg === undefined) {\n        return func;\n      }\n      switch (argCount) {\n        case 1: return function(value) {\n          return func.call(thisArg, value);\n        };\n        case 3: return function(value, index, collection) {\n          return func.call(thisArg, value, index, collection);\n        };\n        case 4: return function(accumulator, value, index, collection) {\n          return func.call(thisArg, accumulator, value, index, collection);\n        };\n        case 5: return function(value, other, key, object, source) {\n          return func.call(thisArg, value, other, key, object, source);\n        };\n      }\n      return function() {\n        return func.apply(thisArg, arguments);\n      };\n    }\n\n    /**\n     * Creates a clone of the given array buffer.\n     *\n     * @private\n     * @param {ArrayBuffer} buffer The array buffer to clone.\n     * @returns {ArrayBuffer} Returns the cloned array buffer.\n     */\n    function bufferClone(buffer) {\n      var result = new ArrayBuffer(buffer.byteLength),\n          view = new Uint8Array(result);\n\n      view.set(new Uint8Array(buffer));\n      return result;\n    }\n\n    /**\n     * Creates an array that is the composition of partially applied arguments,\n     * placeholders, and provided arguments into a single array of arguments.\n     *\n     * @private\n     * @param {Array|Object} args The provided arguments.\n     * @param {Array} partials The arguments to prepend to those provided.\n     * @param {Array} holders The `partials` placeholder indexes.\n     * @returns {Array} Returns the new array of composed arguments.\n     */\n    function composeArgs(args, partials, holders) {\n      var holdersLength = holders.length,\n          argsIndex = -1,\n          argsLength = nativeMax(args.length - holdersLength, 0),\n          leftIndex = -1,\n          leftLength = partials.length,\n          result = Array(leftLength + argsLength);\n\n      while (++leftIndex < leftLength) {\n        result[leftIndex] = partials[leftIndex];\n      }\n      while (++argsIndex < holdersLength) {\n        result[holders[argsIndex]] = args[argsIndex];\n      }\n      while (argsLength--) {\n        result[leftIndex++] = args[argsIndex++];\n      }\n      return result;\n    }\n\n    /**\n     * This function is like `composeArgs` except that the arguments composition\n     * is tailored for `_.partialRight`.\n     *\n     * @private\n     * @param {Array|Object} args The provided arguments.\n     * @param {Array} partials The arguments to append to those provided.\n     * @param {Array} holders The `partials` placeholder indexes.\n     * @returns {Array} Returns the new array of composed arguments.\n     */\n    function composeArgsRight(args, partials, holders) {\n      var holdersIndex = -1,\n          holdersLength = holders.length,\n          argsIndex = -1,\n          argsLength = nativeMax(args.length - holdersLength, 0),\n          rightIndex = -1,\n          rightLength = partials.length,\n          result = Array(argsLength + rightLength);\n\n      while (++argsIndex < argsLength) {\n        result[argsIndex] = args[argsIndex];\n      }\n      var offset = argsIndex;\n      while (++rightIndex < rightLength) {\n        result[offset + rightIndex] = partials[rightIndex];\n      }\n      while (++holdersIndex < holdersLength) {\n        result[offset + holders[holdersIndex]] = args[argsIndex++];\n      }\n      return result;\n    }\n\n    /**\n     * Creates a `_.countBy`, `_.groupBy`, `_.indexBy`, or `_.partition` function.\n     *\n     * @private\n     * @param {Function} setter The function to set keys and values of the accumulator object.\n     * @param {Function} [initializer] The function to initialize the accumulator object.\n     * @returns {Function} Returns the new aggregator function.\n     */\n    function createAggregator(setter, initializer) {\n      return function(collection, iteratee, thisArg) {\n        var result = initializer ? initializer() : {};\n        iteratee = getCallback(iteratee, thisArg, 3);\n\n        if (isArray(collection)) {\n          var index = -1,\n              length = collection.length;\n\n          while (++index < length) {\n            var value = collection[index];\n            setter(result, value, iteratee(value, index, collection), collection);\n          }\n        } else {\n          baseEach(collection, function(value, key, collection) {\n            setter(result, value, iteratee(value, key, collection), collection);\n          });\n        }\n        return result;\n      };\n    }\n\n    /**\n     * Creates a `_.assign`, `_.defaults`, or `_.merge` function.\n     *\n     * @private\n     * @param {Function} assigner The function to assign values.\n     * @returns {Function} Returns the new assigner function.\n     */\n    function createAssigner(assigner) {\n      return restParam(function(object, sources) {\n        var index = -1,\n            length = object == null ? 0 : sources.length,\n            customizer = length > 2 ? sources[length - 2] : undefined,\n            guard = length > 2 ? sources[2] : undefined,\n            thisArg = length > 1 ? sources[length - 1] : undefined;\n\n        if (typeof customizer == 'function') {\n          customizer = bindCallback(customizer, thisArg, 5);\n          length -= 2;\n        } else {\n          customizer = typeof thisArg == 'function' ? thisArg : undefined;\n          length -= (customizer ? 1 : 0);\n        }\n        if (guard && isIterateeCall(sources[0], sources[1], guard)) {\n          customizer = length < 3 ? undefined : customizer;\n          length = 1;\n        }\n        while (++index < length) {\n          var source = sources[index];\n          if (source) {\n            assigner(object, source, customizer);\n          }\n        }\n        return object;\n      });\n    }\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     */\n    function createBaseEach(eachFunc, fromRight) {\n      return function(collection, iteratee) {\n        var length = collection ? getLength(collection) : 0;\n        if (!isLength(length)) {\n          return eachFunc(collection, iteratee);\n        }\n        var index = fromRight ? length : -1,\n            iterable = toObject(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\n    /**\n     * Creates a base function for `_.forIn` or `_.forInRight`.\n     *\n     * @private\n     * @param {boolean} [fromRight] Specify iterating from right to left.\n     * @returns {Function} Returns the new base function.\n     */\n    function createBaseFor(fromRight) {\n      return function(object, iteratee, keysFunc) {\n        var iterable = toObject(object),\n            props = keysFunc(object),\n            length = props.length,\n            index = fromRight ? length : -1;\n\n        while ((fromRight ? index-- : ++index < length)) {\n          var key = props[index];\n          if (iteratee(iterable[key], key, iterable) === false) {\n            break;\n          }\n        }\n        return object;\n      };\n    }\n\n    /**\n     * Creates a function that wraps `func` and invokes it with the `this`\n     * binding of `thisArg`.\n     *\n     * @private\n     * @param {Function} func The function to bind.\n     * @param {*} [thisArg] The `this` binding of `func`.\n     * @returns {Function} Returns the new bound function.\n     */\n    function createBindWrapper(func, thisArg) {\n      var Ctor = createCtorWrapper(func);\n\n      function wrapper() {\n        var fn = (this && this !== root && this instanceof wrapper) ? Ctor : func;\n        return fn.apply(thisArg, arguments);\n      }\n      return wrapper;\n    }\n\n    /**\n     * Creates a `Set` cache object to optimize linear searches of large arrays.\n     *\n     * @private\n     * @param {Array} [values] The values to cache.\n     * @returns {null|Object} Returns the new cache object if `Set` is supported, else `null`.\n     */\n    function createCache(values) {\n      return (nativeCreate && Set) ? new SetCache(values) : null;\n    }\n\n    /**\n     * Creates a function that produces compound words out of the words in a\n     * given string.\n     *\n     * @private\n     * @param {Function} callback The function to combine each word.\n     * @returns {Function} Returns the new compounder function.\n     */\n    function createCompounder(callback) {\n      return function(string) {\n        var index = -1,\n            array = words(deburr(string)),\n            length = array.length,\n            result = '';\n\n        while (++index < length) {\n          result = callback(result, array[index], index);\n        }\n        return result;\n      };\n    }\n\n    /**\n     * Creates a function that produces an instance of `Ctor` regardless of\n     * whether it was invoked as part of a `new` expression or by `call` or `apply`.\n     *\n     * @private\n     * @param {Function} Ctor The constructor to wrap.\n     * @returns {Function} Returns the new wrapped function.\n     */\n    function createCtorWrapper(Ctor) {\n      return function() {\n        // Use a `switch` statement to work with class constructors.\n        // See http://ecma-international.org/ecma-262/6.0/#sec-ecmascript-function-objects-call-thisargument-argumentslist\n        // for more details.\n        var args = arguments;\n        switch (args.length) {\n          case 0: return new Ctor;\n          case 1: return new Ctor(args[0]);\n          case 2: return new Ctor(args[0], args[1]);\n          case 3: return new Ctor(args[0], args[1], args[2]);\n          case 4: return new Ctor(args[0], args[1], args[2], args[3]);\n          case 5: return new Ctor(args[0], args[1], args[2], args[3], args[4]);\n          case 6: return new Ctor(args[0], args[1], args[2], args[3], args[4], args[5]);\n          case 7: return new Ctor(args[0], args[1], args[2], args[3], args[4], args[5], args[6]);\n        }\n        var thisBinding = baseCreate(Ctor.prototype),\n            result = Ctor.apply(thisBinding, args);\n\n        // Mimic the constructor's `return` behavior.\n        // See https://es5.github.io/#x13.2.2 for more details.\n        return isObject(result) ? result : thisBinding;\n      };\n    }\n\n    /**\n     * Creates a `_.curry` or `_.curryRight` function.\n     *\n     * @private\n     * @param {boolean} flag The curry bit flag.\n     * @returns {Function} Returns the new curry function.\n     */\n    function createCurry(flag) {\n      function curryFunc(func, arity, guard) {\n        if (guard && isIterateeCall(func, arity, guard)) {\n          arity = undefined;\n        }\n        var result = createWrapper(func, flag, undefined, undefined, undefined, undefined, undefined, arity);\n        result.placeholder = curryFunc.placeholder;\n        return result;\n      }\n      return curryFunc;\n    }\n\n    /**\n     * Creates a `_.defaults` or `_.defaultsDeep` function.\n     *\n     * @private\n     * @param {Function} assigner The function to assign values.\n     * @param {Function} customizer The function to customize assigned values.\n     * @returns {Function} Returns the new defaults function.\n     */\n    function createDefaults(assigner, customizer) {\n      return restParam(function(args) {\n        var object = args[0];\n        if (object == null) {\n          return object;\n        }\n        args.push(customizer);\n        return assigner.apply(undefined, args);\n      });\n    }\n\n    /**\n     * Creates a `_.max` or `_.min` function.\n     *\n     * @private\n     * @param {Function} comparator The function used to compare values.\n     * @param {*} exValue The initial extremum value.\n     * @returns {Function} Returns the new extremum function.\n     */\n    function createExtremum(comparator, exValue) {\n      return function(collection, iteratee, thisArg) {\n        if (thisArg && isIterateeCall(collection, iteratee, thisArg)) {\n          iteratee = undefined;\n        }\n        iteratee = getCallback(iteratee, thisArg, 3);\n        if (iteratee.length == 1) {\n          collection = isArray(collection) ? collection : toIterable(collection);\n          var result = arrayExtremum(collection, iteratee, comparator, exValue);\n          if (!(collection.length && result === exValue)) {\n            return result;\n          }\n        }\n        return baseExtremum(collection, iteratee, comparator, exValue);\n      };\n    }\n\n    /**\n     * Creates a `_.find` or `_.findLast` 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 find function.\n     */\n    function createFind(eachFunc, fromRight) {\n      return function(collection, predicate, thisArg) {\n        predicate = getCallback(predicate, thisArg, 3);\n        if (isArray(collection)) {\n          var index = baseFindIndex(collection, predicate, fromRight);\n          return index > -1 ? collection[index] : undefined;\n        }\n        return baseFind(collection, predicate, eachFunc);\n      };\n    }\n\n    /**\n     * Creates a `_.findIndex` or `_.findLastIndex` function.\n     *\n     * @private\n     * @param {boolean} [fromRight] Specify iterating from right to left.\n     * @returns {Function} Returns the new find function.\n     */\n    function createFindIndex(fromRight) {\n      return function(array, predicate, thisArg) {\n        if (!(array && array.length)) {\n          return -1;\n        }\n        predicate = getCallback(predicate, thisArg, 3);\n        return baseFindIndex(array, predicate, fromRight);\n      };\n    }\n\n    /**\n     * Creates a `_.findKey` or `_.findLastKey` function.\n     *\n     * @private\n     * @param {Function} objectFunc The function to iterate over an object.\n     * @returns {Function} Returns the new find function.\n     */\n    function createFindKey(objectFunc) {\n      return function(object, predicate, thisArg) {\n        predicate = getCallback(predicate, thisArg, 3);\n        return baseFind(object, predicate, objectFunc, true);\n      };\n    }\n\n    /**\n     * Creates a `_.flow` or `_.flowRight` function.\n     *\n     * @private\n     * @param {boolean} [fromRight] Specify iterating from right to left.\n     * @returns {Function} Returns the new flow function.\n     */\n    function createFlow(fromRight) {\n      return function() {\n        var wrapper,\n            length = arguments.length,\n            index = fromRight ? length : -1,\n            leftIndex = 0,\n            funcs = Array(length);\n\n        while ((fromRight ? index-- : ++index < length)) {\n          var func = funcs[leftIndex++] = arguments[index];\n          if (typeof func != 'function') {\n            throw new TypeError(FUNC_ERROR_TEXT);\n          }\n          if (!wrapper && LodashWrapper.prototype.thru && getFuncName(func) == 'wrapper') {\n            wrapper = new LodashWrapper([], true);\n          }\n        }\n        index = wrapper ? -1 : length;\n        while (++index < length) {\n          func = funcs[index];\n\n          var funcName = getFuncName(func),\n              data = funcName == 'wrapper' ? getData(func) : undefined;\n\n          if (data && isLaziable(data[0]) && data[1] == (ARY_FLAG | CURRY_FLAG | PARTIAL_FLAG | REARG_FLAG) && !data[4].length && data[9] == 1) {\n            wrapper = wrapper[getFuncName(data[0])].apply(wrapper, data[3]);\n          } else {\n            wrapper = (func.length == 1 && isLaziable(func)) ? wrapper[funcName]() : wrapper.thru(func);\n          }\n        }\n        return function() {\n          var args = arguments,\n              value = args[0];\n\n          if (wrapper && args.length == 1 && isArray(value) && value.length >= LARGE_ARRAY_SIZE) {\n            return wrapper.plant(value).value();\n          }\n          var index = 0,\n              result = length ? funcs[index].apply(this, args) : value;\n\n          while (++index < length) {\n            result = funcs[index].call(this, result);\n          }\n          return result;\n        };\n      };\n    }\n\n    /**\n     * Creates a function for `_.forEach` or `_.forEachRight`.\n     *\n     * @private\n     * @param {Function} arrayFunc The function to iterate over an array.\n     * @param {Function} eachFunc The function to iterate over a collection.\n     * @returns {Function} Returns the new each function.\n     */\n    function createForEach(arrayFunc, eachFunc) {\n      return function(collection, iteratee, thisArg) {\n        return (typeof iteratee == 'function' && thisArg === undefined && isArray(collection))\n          ? arrayFunc(collection, iteratee)\n          : eachFunc(collection, bindCallback(iteratee, thisArg, 3));\n      };\n    }\n\n    /**\n     * Creates a function for `_.forIn` or `_.forInRight`.\n     *\n     * @private\n     * @param {Function} objectFunc The function to iterate over an object.\n     * @returns {Function} Returns the new each function.\n     */\n    function createForIn(objectFunc) {\n      return function(object, iteratee, thisArg) {\n        if (typeof iteratee != 'function' || thisArg !== undefined) {\n          iteratee = bindCallback(iteratee, thisArg, 3);\n        }\n        return objectFunc(object, iteratee, keysIn);\n      };\n    }\n\n    /**\n     * Creates a function for `_.forOwn` or `_.forOwnRight`.\n     *\n     * @private\n     * @param {Function} objectFunc The function to iterate over an object.\n     * @returns {Function} Returns the new each function.\n     */\n    function createForOwn(objectFunc) {\n      return function(object, iteratee, thisArg) {\n        if (typeof iteratee != 'function' || thisArg !== undefined) {\n          iteratee = bindCallback(iteratee, thisArg, 3);\n        }\n        return objectFunc(object, iteratee);\n      };\n    }\n\n    /**\n     * Creates a function for `_.mapKeys` or `_.mapValues`.\n     *\n     * @private\n     * @param {boolean} [isMapKeys] Specify mapping keys instead of values.\n     * @returns {Function} Returns the new map function.\n     */\n    function createObjectMapper(isMapKeys) {\n      return function(object, iteratee, thisArg) {\n        var result = {};\n        iteratee = getCallback(iteratee, thisArg, 3);\n\n        baseForOwn(object, function(value, key, object) {\n          var mapped = iteratee(value, key, object);\n          key = isMapKeys ? mapped : key;\n          value = isMapKeys ? value : mapped;\n          result[key] = value;\n        });\n        return result;\n      };\n    }\n\n    /**\n     * Creates a function for `_.padLeft` or `_.padRight`.\n     *\n     * @private\n     * @param {boolean} [fromRight] Specify padding from the right.\n     * @returns {Function} Returns the new pad function.\n     */\n    function createPadDir(fromRight) {\n      return function(string, length, chars) {\n        string = baseToString(string);\n        return (fromRight ? string : '') + createPadding(string, length, chars) + (fromRight ? '' : string);\n      };\n    }\n\n    /**\n     * Creates a `_.partial` or `_.partialRight` function.\n     *\n     * @private\n     * @param {boolean} flag The partial bit flag.\n     * @returns {Function} Returns the new partial function.\n     */\n    function createPartial(flag) {\n      var partialFunc = restParam(function(func, partials) {\n        var holders = replaceHolders(partials, partialFunc.placeholder);\n        return createWrapper(func, flag, undefined, partials, holders);\n      });\n      return partialFunc;\n    }\n\n    /**\n     * Creates a function for `_.reduce` or `_.reduceRight`.\n     *\n     * @private\n     * @param {Function} arrayFunc The function to iterate over an array.\n     * @param {Function} eachFunc The function to iterate over a collection.\n     * @returns {Function} Returns the new each function.\n     */\n    function createReduce(arrayFunc, eachFunc) {\n      return function(collection, iteratee, accumulator, thisArg) {\n        var initFromArray = arguments.length < 3;\n        return (typeof iteratee == 'function' && thisArg === undefined && isArray(collection))\n          ? arrayFunc(collection, iteratee, accumulator, initFromArray)\n          : baseReduce(collection, getCallback(iteratee, thisArg, 4), accumulator, initFromArray, eachFunc);\n      };\n    }\n\n    /**\n     * Creates a function that wraps `func` and invokes it with optional `this`\n     * binding of, partial application, and currying.\n     *\n     * @private\n     * @param {Function|string} func The function or method name to reference.\n     * @param {number} bitmask The bitmask of flags. See `createWrapper` for more details.\n     * @param {*} [thisArg] The `this` binding of `func`.\n     * @param {Array} [partials] The arguments to prepend to those provided to the new function.\n     * @param {Array} [holders] The `partials` placeholder indexes.\n     * @param {Array} [partialsRight] The arguments to append to those provided to the new function.\n     * @param {Array} [holdersRight] The `partialsRight` placeholder indexes.\n     * @param {Array} [argPos] The argument positions of the new function.\n     * @param {number} [ary] The arity cap of `func`.\n     * @param {number} [arity] The arity of `func`.\n     * @returns {Function} Returns the new wrapped function.\n     */\n    function createHybridWrapper(func, bitmask, thisArg, partials, holders, partialsRight, holdersRight, argPos, ary, arity) {\n      var isAry = bitmask & ARY_FLAG,\n          isBind = bitmask & BIND_FLAG,\n          isBindKey = bitmask & BIND_KEY_FLAG,\n          isCurry = bitmask & CURRY_FLAG,\n          isCurryBound = bitmask & CURRY_BOUND_FLAG,\n          isCurryRight = bitmask & CURRY_RIGHT_FLAG,\n          Ctor = isBindKey ? undefined : createCtorWrapper(func);\n\n      function wrapper() {\n        // Avoid `arguments` object use disqualifying optimizations by\n        // converting it to an array before providing it to other functions.\n        var length = arguments.length,\n            index = length,\n            args = Array(length);\n\n        while (index--) {\n          args[index] = arguments[index];\n        }\n        if (partials) {\n          args = composeArgs(args, partials, holders);\n        }\n        if (partialsRight) {\n          args = composeArgsRight(args, partialsRight, holdersRight);\n        }\n        if (isCurry || isCurryRight) {\n          var placeholder = wrapper.placeholder,\n              argsHolders = replaceHolders(args, placeholder);\n\n          length -= argsHolders.length;\n          if (length < arity) {\n            var newArgPos = argPos ? arrayCopy(argPos) : undefined,\n                newArity = nativeMax(arity - length, 0),\n                newsHolders = isCurry ? argsHolders : undefined,\n                newHoldersRight = isCurry ? undefined : argsHolders,\n                newPartials = isCurry ? args : undefined,\n                newPartialsRight = isCurry ? undefined : args;\n\n            bitmask |= (isCurry ? PARTIAL_FLAG : PARTIAL_RIGHT_FLAG);\n            bitmask &= ~(isCurry ? PARTIAL_RIGHT_FLAG : PARTIAL_FLAG);\n\n            if (!isCurryBound) {\n              bitmask &= ~(BIND_FLAG | BIND_KEY_FLAG);\n            }\n            var newData = [func, bitmask, thisArg, newPartials, newsHolders, newPartialsRight, newHoldersRight, newArgPos, ary, newArity],\n                result = createHybridWrapper.apply(undefined, newData);\n\n            if (isLaziable(func)) {\n              setData(result, newData);\n            }\n            result.placeholder = placeholder;\n            return result;\n          }\n        }\n        var thisBinding = isBind ? thisArg : this,\n            fn = isBindKey ? thisBinding[func] : func;\n\n        if (argPos) {\n          args = reorder(args, argPos);\n        }\n        if (isAry && ary < args.length) {\n          args.length = ary;\n        }\n        if (this && this !== root && this instanceof wrapper) {\n          fn = Ctor || createCtorWrapper(func);\n        }\n        return fn.apply(thisBinding, args);\n      }\n      return wrapper;\n    }\n\n    /**\n     * Creates the padding required for `string` based on the given `length`.\n     * The `chars` string is truncated if the number of characters exceeds `length`.\n     *\n     * @private\n     * @param {string} string The string to create padding for.\n     * @param {number} [length=0] The padding length.\n     * @param {string} [chars=' '] The string used as padding.\n     * @returns {string} Returns the pad for `string`.\n     */\n    function createPadding(string, length, chars) {\n      var strLength = string.length;\n      length = +length;\n\n      if (strLength >= length || !nativeIsFinite(length)) {\n        return '';\n      }\n      var padLength = length - strLength;\n      chars = chars == null ? ' ' : (chars + '');\n      return repeat(chars, nativeCeil(padLength / chars.length)).slice(0, padLength);\n    }\n\n    /**\n     * Creates a function that wraps `func` and invokes it with the optional `this`\n     * binding of `thisArg` and the `partials` prepended to those provided to\n     * the wrapper.\n     *\n     * @private\n     * @param {Function} func The function to partially apply arguments to.\n     * @param {number} bitmask The bitmask of flags. See `createWrapper` for more details.\n     * @param {*} thisArg The `this` binding of `func`.\n     * @param {Array} partials The arguments to prepend to those provided to the new function.\n     * @returns {Function} Returns the new bound function.\n     */\n    function createPartialWrapper(func, bitmask, thisArg, partials) {\n      var isBind = bitmask & BIND_FLAG,\n          Ctor = createCtorWrapper(func);\n\n      function wrapper() {\n        // Avoid `arguments` object use disqualifying optimizations by\n        // converting it to an array before providing it `func`.\n        var argsIndex = -1,\n            argsLength = arguments.length,\n            leftIndex = -1,\n            leftLength = partials.length,\n            args = Array(leftLength + argsLength);\n\n        while (++leftIndex < leftLength) {\n          args[leftIndex] = partials[leftIndex];\n        }\n        while (argsLength--) {\n          args[leftIndex++] = arguments[++argsIndex];\n        }\n        var fn = (this && this !== root && this instanceof wrapper) ? Ctor : func;\n        return fn.apply(isBind ? thisArg : this, args);\n      }\n      return wrapper;\n    }\n\n    /**\n     * Creates a `_.ceil`, `_.floor`, or `_.round` function.\n     *\n     * @private\n     * @param {string} methodName The name of the `Math` method to use when rounding.\n     * @returns {Function} Returns the new round function.\n     */\n    function createRound(methodName) {\n      var func = Math[methodName];\n      return function(number, precision) {\n        precision = precision === undefined ? 0 : (+precision || 0);\n        if (precision) {\n          precision = pow(10, precision);\n          return func(number * precision) / precision;\n        }\n        return func(number);\n      };\n    }\n\n    /**\n     * Creates a `_.sortedIndex` or `_.sortedLastIndex` function.\n     *\n     * @private\n     * @param {boolean} [retHighest] Specify returning the highest qualified index.\n     * @returns {Function} Returns the new index function.\n     */\n    function createSortedIndex(retHighest) {\n      return function(array, value, iteratee, thisArg) {\n        var callback = getCallback(iteratee);\n        return (iteratee == null && callback === baseCallback)\n          ? binaryIndex(array, value, retHighest)\n          : binaryIndexBy(array, value, callback(iteratee, thisArg, 1), retHighest);\n      };\n    }\n\n    /**\n     * Creates a function that either curries or invokes `func` with optional\n     * `this` binding and partially applied arguments.\n     *\n     * @private\n     * @param {Function|string} func The function or method name to reference.\n     * @param {number} bitmask The bitmask of flags.\n     *  The bitmask may be composed of the following flags:\n     *     1 - `_.bind`\n     *     2 - `_.bindKey`\n     *     4 - `_.curry` or `_.curryRight` of a bound function\n     *     8 - `_.curry`\n     *    16 - `_.curryRight`\n     *    32 - `_.partial`\n     *    64 - `_.partialRight`\n     *   128 - `_.rearg`\n     *   256 - `_.ary`\n     * @param {*} [thisArg] The `this` binding of `func`.\n     * @param {Array} [partials] The arguments to be partially applied.\n     * @param {Array} [holders] The `partials` placeholder indexes.\n     * @param {Array} [argPos] The argument positions of the new function.\n     * @param {number} [ary] The arity cap of `func`.\n     * @param {number} [arity] The arity of `func`.\n     * @returns {Function} Returns the new wrapped function.\n     */\n    function createWrapper(func, bitmask, thisArg, partials, holders, argPos, ary, arity) {\n      var isBindKey = bitmask & BIND_KEY_FLAG;\n      if (!isBindKey && typeof func != 'function') {\n        throw new TypeError(FUNC_ERROR_TEXT);\n      }\n      var length = partials ? partials.length : 0;\n      if (!length) {\n        bitmask &= ~(PARTIAL_FLAG | PARTIAL_RIGHT_FLAG);\n        partials = holders = undefined;\n      }\n      length -= (holders ? holders.length : 0);\n      if (bitmask & PARTIAL_RIGHT_FLAG) {\n        var partialsRight = partials,\n            holdersRight = holders;\n\n        partials = holders = undefined;\n      }\n      var data = isBindKey ? undefined : getData(func),\n          newData = [func, bitmask, thisArg, partials, holders, partialsRight, holdersRight, argPos, ary, arity];\n\n      if (data) {\n        mergeData(newData, data);\n        bitmask = newData[1];\n        arity = newData[9];\n      }\n      newData[9] = arity == null\n        ? (isBindKey ? 0 : func.length)\n        : (nativeMax(arity - length, 0) || 0);\n\n      if (bitmask == BIND_FLAG) {\n        var result = createBindWrapper(newData[0], newData[2]);\n      } else if ((bitmask == PARTIAL_FLAG || bitmask == (BIND_FLAG | PARTIAL_FLAG)) && !newData[4].length) {\n        result = createPartialWrapper.apply(undefined, newData);\n      } else {\n        result = createHybridWrapper.apply(undefined, newData);\n      }\n      var setter = data ? baseSetData : setData;\n      return setter(result, newData);\n    }\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 {Function} equalFunc The function to determine equivalents of values.\n     * @param {Function} [customizer] The function to customize comparing arrays.\n     * @param {boolean} [isLoose] Specify performing partial comparisons.\n     * @param {Array} [stackA] Tracks traversed `value` objects.\n     * @param {Array} [stackB] Tracks traversed `other` objects.\n     * @returns {boolean} Returns `true` if the arrays are equivalent, else `false`.\n     */\n    function equalArrays(array, other, equalFunc, customizer, isLoose, stackA, stackB) {\n      var index = -1,\n          arrLength = array.length,\n          othLength = other.length;\n\n      if (arrLength != othLength && !(isLoose && othLength > arrLength)) {\n        return false;\n      }\n      // Ignore non-index properties.\n      while (++index < arrLength) {\n        var arrValue = array[index],\n            othValue = other[index],\n            result = customizer ? customizer(isLoose ? othValue : arrValue, isLoose ? arrValue : othValue, index) : undefined;\n\n        if (result !== undefined) {\n          if (result) {\n            continue;\n          }\n          return false;\n        }\n        // Recursively compare arrays (susceptible to call stack limits).\n        if (isLoose) {\n          if (!arraySome(other, function(othValue) {\n                return arrValue === othValue || equalFunc(arrValue, othValue, customizer, isLoose, stackA, stackB);\n              })) {\n            return false;\n          }\n        } else if (!(arrValue === othValue || equalFunc(arrValue, othValue, customizer, isLoose, stackA, stackB))) {\n          return false;\n        }\n      }\n      return true;\n    }\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     * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n     */\n    function equalByTag(object, other, tag) {\n      switch (tag) {\n        case boolTag:\n        case dateTag:\n          // Coerce dates and booleans to numbers, dates to milliseconds and booleans\n          // to `1` or `0` treating invalid dates coerced to `NaN` as not equal.\n          return +object == +other;\n\n        case errorTag:\n          return object.name == other.name && object.message == other.message;\n\n        case numberTag:\n          // Treat `NaN` vs. `NaN` as equal.\n          return (object != +object)\n            ? other != +other\n            : object == +other;\n\n        case regexpTag:\n        case stringTag:\n          // Coerce regexes to strings and treat strings primitives and string\n          // objects as equal. See https://es5.github.io/#x15.10.6.4 for more details.\n          return object == (other + '');\n      }\n      return false;\n    }\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 {Function} equalFunc The function to determine equivalents of values.\n     * @param {Function} [customizer] The function to customize comparing values.\n     * @param {boolean} [isLoose] Specify performing partial comparisons.\n     * @param {Array} [stackA] Tracks traversed `value` objects.\n     * @param {Array} [stackB] Tracks traversed `other` objects.\n     * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n     */\n    function equalObjects(object, other, equalFunc, customizer, isLoose, stackA, stackB) {\n      var objProps = keys(object),\n          objLength = objProps.length,\n          othProps = keys(other),\n          othLength = othProps.length;\n\n      if (objLength != othLength && !isLoose) {\n        return false;\n      }\n      var index = objLength;\n      while (index--) {\n        var key = objProps[index];\n        if (!(isLoose ? key in other : hasOwnProperty.call(other, key))) {\n          return false;\n        }\n      }\n      var skipCtor = isLoose;\n      while (++index < objLength) {\n        key = objProps[index];\n        var objValue = object[key],\n            othValue = other[key],\n            result = customizer ? customizer(isLoose ? othValue : objValue, isLoose? objValue : othValue, key) : undefined;\n\n        // Recursively compare objects (susceptible to call stack limits).\n        if (!(result === undefined ? equalFunc(objValue, othValue, customizer, isLoose, stackA, stackB) : result)) {\n          return false;\n        }\n        skipCtor || (skipCtor = key == 'constructor');\n      }\n      if (!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          return false;\n        }\n      }\n      return true;\n    }\n\n    /**\n     * Gets the appropriate \"callback\" function. If the `_.callback` method is\n     * customized this function returns the custom method, otherwise it returns\n     * the `baseCallback` function. If arguments are provided the chosen function\n     * is invoked with them and its result is returned.\n     *\n     * @private\n     * @returns {Function} Returns the chosen function or its result.\n     */\n    function getCallback(func, thisArg, argCount) {\n      var result = lodash.callback || callback;\n      result = result === callback ? baseCallback : result;\n      return argCount ? result(func, thisArg, argCount) : result;\n    }\n\n    /**\n     * Gets metadata for `func`.\n     *\n     * @private\n     * @param {Function} func The function to query.\n     * @returns {*} Returns the metadata for `func`.\n     */\n    var getData = !metaMap ? noop : function(func) {\n      return metaMap.get(func);\n    };\n\n    /**\n     * Gets the name of `func`.\n     *\n     * @private\n     * @param {Function} func The function to query.\n     * @returns {string} Returns the function name.\n     */\n    function getFuncName(func) {\n      var result = func.name,\n          array = realNames[result],\n          length = array ? array.length : 0;\n\n      while (length--) {\n        var data = array[length],\n            otherFunc = data.func;\n        if (otherFunc == null || otherFunc == func) {\n          return data.name;\n        }\n      }\n      return result;\n    }\n\n    /**\n     * Gets the appropriate \"indexOf\" function. If the `_.indexOf` method is\n     * customized this function returns the custom method, otherwise it returns\n     * the `baseIndexOf` function. If arguments are provided the chosen function\n     * is invoked with them and its result is returned.\n     *\n     * @private\n     * @returns {Function|number} Returns the chosen function or its result.\n     */\n    function getIndexOf(collection, target, fromIndex) {\n      var result = lodash.indexOf || indexOf;\n      result = result === indexOf ? baseIndexOf : result;\n      return collection ? result(collection, target, fromIndex) : result;\n    }\n\n    /**\n     * Gets the \"length\" property value of `object`.\n     *\n     * **Note:** This function is used to avoid a [JIT bug](https://bugs.webkit.org/show_bug.cgi?id=142792)\n     * that affects Safari on at least iOS 8.1-8.3 ARM64.\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @returns {*} Returns the \"length\" value.\n     */\n    var getLength = baseProperty('length');\n\n    /**\n     * Gets the propery 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     */\n    function getMatchData(object) {\n      var result = pairs(object),\n          length = result.length;\n\n      while (length--) {\n        result[length][2] = isStrictComparable(result[length][1]);\n      }\n      return result;\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     */\n    function getNative(object, key) {\n      var value = object == null ? undefined : object[key];\n      return isNative(value) ? value : undefined;\n    }\n\n    /**\n     * Gets the view, applying any `transforms` to the `start` and `end` positions.\n     *\n     * @private\n     * @param {number} start The start of the view.\n     * @param {number} end The end of the view.\n     * @param {Array} transforms The transformations to apply to the view.\n     * @returns {Object} Returns an object containing the `start` and `end`\n     *  positions of the view.\n     */\n    function getView(start, end, transforms) {\n      var index = -1,\n          length = transforms.length;\n\n      while (++index < length) {\n        var data = transforms[index],\n            size = data.size;\n\n        switch (data.type) {\n          case 'drop':      start += size; break;\n          case 'dropRight': end -= size; break;\n          case 'take':      end = nativeMin(end, start + size); break;\n          case 'takeRight': start = nativeMax(start, end - size); break;\n        }\n      }\n      return { 'start': start, 'end': end };\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     */\n    function initCloneArray(array) {\n      var length = array.length,\n          result = new array.constructor(length);\n\n      // Add array 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     */\n    function initCloneObject(object) {\n      var Ctor = object.constructor;\n      if (!(typeof Ctor == 'function' && Ctor instanceof Ctor)) {\n        Ctor = Object;\n      }\n      return new Ctor;\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 {boolean} [isDeep] Specify a deep clone.\n     * @returns {Object} Returns the initialized clone.\n     */\n    function initCloneByTag(object, tag, isDeep) {\n      var Ctor = object.constructor;\n      switch (tag) {\n        case arrayBufferTag:\n          return bufferClone(object);\n\n        case boolTag:\n        case dateTag:\n          return new Ctor(+object);\n\n        case float32Tag: case float64Tag:\n        case int8Tag: case int16Tag: case int32Tag:\n        case uint8Tag: case uint8ClampedTag: case uint16Tag: case uint32Tag:\n          var buffer = object.buffer;\n          return new Ctor(isDeep ? bufferClone(buffer) : buffer, object.byteOffset, object.length);\n\n        case numberTag:\n        case stringTag:\n          return new Ctor(object);\n\n        case regexpTag:\n          var result = new Ctor(object.source, reFlags.exec(object));\n          result.lastIndex = object.lastIndex;\n      }\n      return result;\n    }\n\n    /**\n     * Invokes the method at `path` on `object`.\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @param {Array|string} path The path of the method to invoke.\n     * @param {Array} args The arguments to invoke the method with.\n     * @returns {*} Returns the result of the invoked method.\n     */\n    function invokePath(object, path, args) {\n      if (object != null && !isKey(path, object)) {\n        path = toPath(path);\n        object = path.length == 1 ? object : baseGet(object, baseSlice(path, 0, -1));\n        path = last(path);\n      }\n      var func = object == null ? object : object[path];\n      return func == null ? undefined : func.apply(object, args);\n    }\n\n    /**\n     * Checks if `value` is array-like.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is array-like, else `false`.\n     */\n    function isArrayLike(value) {\n      return value != null && isLength(getLength(value));\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     */\n    function isIndex(value, length) {\n      value = (typeof value == 'number' || reIsUint.test(value)) ? +value : -1;\n      length = length == null ? MAX_SAFE_INTEGER : length;\n      return value > -1 && value % 1 == 0 && value < length;\n    }\n\n    /**\n     * Checks if the provided 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, else `false`.\n     */\n    function 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        var other = object[index];\n        return value === value ? (value === other) : (other !== other);\n      }\n      return false;\n    }\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     */\n    function isKey(value, object) {\n      var type = typeof value;\n      if ((type == 'string' && reIsPlainProp.test(value)) || type == 'number') {\n        return true;\n      }\n      if (isArray(value)) {\n        return false;\n      }\n      var result = !reIsDeepProp.test(value);\n      return result || (object != null && value in toObject(object));\n    }\n\n    /**\n     * Checks if `func` has a lazy counterpart.\n     *\n     * @private\n     * @param {Function} func The function to check.\n     * @returns {boolean} Returns `true` if `func` has a lazy counterpart, else `false`.\n     */\n    function isLaziable(func) {\n      var funcName = getFuncName(func);\n      if (!(funcName in LazyWrapper.prototype)) {\n        return false;\n      }\n      var other = lodash[funcName];\n      if (func === other) {\n        return true;\n      }\n      var data = getData(other);\n      return !!data && func === data[0];\n    }\n\n    /**\n     * Checks if `value` is a valid array-like length.\n     *\n     * **Note:** This function is based on [`ToLength`](http://ecma-international.org/ecma-262/6.0/#sec-tolength).\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.\n     */\n    function isLength(value) {\n      return typeof value == 'number' && value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;\n    }\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     */\n    function isStrictComparable(value) {\n      return value === value && !isObject(value);\n    }\n\n    /**\n     * Merges the function metadata of `source` into `data`.\n     *\n     * Merging metadata reduces the number of wrappers required to invoke a function.\n     * This is possible because methods like `_.bind`, `_.curry`, and `_.partial`\n     * may be applied regardless of execution order. Methods like `_.ary` and `_.rearg`\n     * augment function arguments, making the order in which they are executed important,\n     * preventing the merging of metadata. However, we make an exception for a safe\n     * common case where curried functions have `_.ary` and or `_.rearg` applied.\n     *\n     * @private\n     * @param {Array} data The destination metadata.\n     * @param {Array} source The source metadata.\n     * @returns {Array} Returns `data`.\n     */\n    function mergeData(data, source) {\n      var bitmask = data[1],\n          srcBitmask = source[1],\n          newBitmask = bitmask | srcBitmask,\n          isCommon = newBitmask < ARY_FLAG;\n\n      var isCombo =\n        (srcBitmask == ARY_FLAG && bitmask == CURRY_FLAG) ||\n        (srcBitmask == ARY_FLAG && bitmask == REARG_FLAG && data[7].length <= source[8]) ||\n        (srcBitmask == (ARY_FLAG | REARG_FLAG) && bitmask == CURRY_FLAG);\n\n      // Exit early if metadata can't be merged.\n      if (!(isCommon || isCombo)) {\n        return data;\n      }\n      // Use source `thisArg` if available.\n      if (srcBitmask & BIND_FLAG) {\n        data[2] = source[2];\n        // Set when currying a bound function.\n        newBitmask |= (bitmask & BIND_FLAG) ? 0 : CURRY_BOUND_FLAG;\n      }\n      // Compose partial arguments.\n      var value = source[3];\n      if (value) {\n        var partials = data[3];\n        data[3] = partials ? composeArgs(partials, value, source[4]) : arrayCopy(value);\n        data[4] = partials ? replaceHolders(data[3], PLACEHOLDER) : arrayCopy(source[4]);\n      }\n      // Compose partial right arguments.\n      value = source[5];\n      if (value) {\n        partials = data[5];\n        data[5] = partials ? composeArgsRight(partials, value, source[6]) : arrayCopy(value);\n        data[6] = partials ? replaceHolders(data[5], PLACEHOLDER) : arrayCopy(source[6]);\n      }\n      // Use source `argPos` if available.\n      value = source[7];\n      if (value) {\n        data[7] = arrayCopy(value);\n      }\n      // Use source `ary` if it's smaller.\n      if (srcBitmask & ARY_FLAG) {\n        data[8] = data[8] == null ? source[8] : nativeMin(data[8], source[8]);\n      }\n      // Use source `arity` if one is not provided.\n      if (data[9] == null) {\n        data[9] = source[9];\n      }\n      // Use source `func` and merge bitmasks.\n      data[0] = source[0];\n      data[1] = newBitmask;\n\n      return data;\n    }\n\n    /**\n     * Used by `_.defaultsDeep` to customize its `_.merge` use.\n     *\n     * @private\n     * @param {*} objectValue The destination object property value.\n     * @param {*} sourceValue The source object property value.\n     * @returns {*} Returns the value to assign to the destination object.\n     */\n    function mergeDefaults(objectValue, sourceValue) {\n      return objectValue === undefined ? sourceValue : merge(objectValue, sourceValue, mergeDefaults);\n    }\n\n    /**\n     * A specialized version of `_.pick` which picks `object` properties specified\n     * by `props`.\n     *\n     * @private\n     * @param {Object} object The source object.\n     * @param {string[]} props The property names to pick.\n     * @returns {Object} Returns the new object.\n     */\n    function pickByArray(object, props) {\n      object = toObject(object);\n\n      var index = -1,\n          length = props.length,\n          result = {};\n\n      while (++index < length) {\n        var key = props[index];\n        if (key in object) {\n          result[key] = object[key];\n        }\n      }\n      return result;\n    }\n\n    /**\n     * A specialized version of `_.pick` which picks `object` properties `predicate`\n     * returns truthy for.\n     *\n     * @private\n     * @param {Object} object The source object.\n     * @param {Function} predicate The function invoked per iteration.\n     * @returns {Object} Returns the new object.\n     */\n    function pickByCallback(object, predicate) {\n      var result = {};\n      baseForIn(object, function(value, key, object) {\n        if (predicate(value, key, object)) {\n          result[key] = value;\n        }\n      });\n      return result;\n    }\n\n    /**\n     * Reorder `array` according to the specified indexes where the element at\n     * the first index is assigned as the first element, the element at\n     * the second index is assigned as the second element, and so on.\n     *\n     * @private\n     * @param {Array} array The array to reorder.\n     * @param {Array} indexes The arranged array indexes.\n     * @returns {Array} Returns `array`.\n     */\n    function reorder(array, indexes) {\n      var arrLength = array.length,\n          length = nativeMin(indexes.length, arrLength),\n          oldArray = arrayCopy(array);\n\n      while (length--) {\n        var index = indexes[length];\n        array[length] = isIndex(index, arrLength) ? oldArray[index] : undefined;\n      }\n      return array;\n    }\n\n    /**\n     * Sets metadata for `func`.\n     *\n     * **Note:** If this function becomes hot, i.e. is invoked a lot in a short\n     * period of time, it will trip its breaker and transition to an identity function\n     * to avoid garbage collection pauses in V8. See [V8 issue 2070](https://code.google.com/p/v8/issues/detail?id=2070)\n     * for more details.\n     *\n     * @private\n     * @param {Function} func The function to associate metadata with.\n     * @param {*} data The metadata.\n     * @returns {Function} Returns `func`.\n     */\n    var setData = (function() {\n      var count = 0,\n          lastCalled = 0;\n\n      return function(key, value) {\n        var stamp = now(),\n            remaining = HOT_SPAN - (stamp - lastCalled);\n\n        lastCalled = stamp;\n        if (remaining > 0) {\n          if (++count >= HOT_COUNT) {\n            return key;\n          }\n        } else {\n          count = 0;\n        }\n        return baseSetData(key, value);\n      };\n    }());\n\n    /**\n     * A fallback implementation of `Object.keys` which creates an array of the\n     * own enumerable property names of `object`.\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @returns {Array} Returns the array of property names.\n     */\n    function shimKeys(object) {\n      var props = keysIn(object),\n          propsLength = props.length,\n          length = propsLength && object.length;\n\n      var allowIndexes = !!length && isLength(length) &&\n        (isArray(object) || isArguments(object));\n\n      var index = -1,\n          result = [];\n\n      while (++index < propsLength) {\n        var key = props[index];\n        if ((allowIndexes && isIndex(key, length)) || hasOwnProperty.call(object, key)) {\n          result.push(key);\n        }\n      }\n      return result;\n    }\n\n    /**\n     * Converts `value` to an array-like object if it's not one.\n     *\n     * @private\n     * @param {*} value The value to process.\n     * @returns {Array|Object} Returns the array-like object.\n     */\n    function toIterable(value) {\n      if (value == null) {\n        return [];\n      }\n      if (!isArrayLike(value)) {\n        return values(value);\n      }\n      return isObject(value) ? value : Object(value);\n    }\n\n    /**\n     * Converts `value` to an object if it's not one.\n     *\n     * @private\n     * @param {*} value The value to process.\n     * @returns {Object} Returns the object.\n     */\n    function toObject(value) {\n      return isObject(value) ? value : Object(value);\n    }\n\n    /**\n     * Converts `value` to property path array if it's not one.\n     *\n     * @private\n     * @param {*} value The value to process.\n     * @returns {Array} Returns the property path array.\n     */\n    function toPath(value) {\n      if (isArray(value)) {\n        return value;\n      }\n      var result = [];\n      baseToString(value).replace(rePropName, function(match, number, quote, string) {\n        result.push(quote ? string.replace(reEscapeChar, '$1') : (number || match));\n      });\n      return result;\n    }\n\n    /**\n     * Creates a clone of `wrapper`.\n     *\n     * @private\n     * @param {Object} wrapper The wrapper to clone.\n     * @returns {Object} Returns the cloned wrapper.\n     */\n    function wrapperClone(wrapper) {\n      return wrapper instanceof LazyWrapper\n        ? wrapper.clone()\n        : new LodashWrapper(wrapper.__wrapped__, wrapper.__chain__, arrayCopy(wrapper.__actions__));\n    }\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Creates an array of elements split into groups the length of `size`.\n     * If `collection` can't be split evenly, the final chunk will be the remaining\n     * elements.\n     *\n     * @static\n     * @memberOf _\n     * @category Array\n     * @param {Array} array The array to process.\n     * @param {number} [size=1] The length of each chunk.\n     * @param- {Object} [guard] Enables use as a callback for functions like `_.map`.\n     * @returns {Array} Returns the new array containing chunks.\n     * @example\n     *\n     * _.chunk(['a', 'b', 'c', 'd'], 2);\n     * // => [['a', 'b'], ['c', 'd']]\n     *\n     * _.chunk(['a', 'b', 'c', 'd'], 3);\n     * // => [['a', 'b', 'c'], ['d']]\n     */\n    function chunk(array, size, guard) {\n      if (guard ? isIterateeCall(array, size, guard) : size == null) {\n        size = 1;\n      } else {\n        size = nativeMax(nativeFloor(size) || 1, 1);\n      }\n      var index = 0,\n          length = array ? array.length : 0,\n          resIndex = -1,\n          result = Array(nativeCeil(length / size));\n\n      while (index < length) {\n        result[++resIndex] = baseSlice(array, index, (index += size));\n      }\n      return result;\n    }\n\n    /**\n     * Creates an array with all falsey values removed. The values `false`, `null`,\n     * `0`, `\"\"`, `undefined`, and `NaN` are falsey.\n     *\n     * @static\n     * @memberOf _\n     * @category Array\n     * @param {Array} array The array to compact.\n     * @returns {Array} Returns the new array of filtered values.\n     * @example\n     *\n     * _.compact([0, 1, false, 2, '', 3]);\n     * // => [1, 2, 3]\n     */\n    function compact(array) {\n      var index = -1,\n          length = array ? array.length : 0,\n          resIndex = -1,\n          result = [];\n\n      while (++index < length) {\n        var value = array[index];\n        if (value) {\n          result[++resIndex] = value;\n        }\n      }\n      return result;\n    }\n\n    /**\n     * Creates an array of unique `array` values not included in the other\n     * provided arrays using [`SameValueZero`](http://ecma-international.org/ecma-262/6.0/#sec-samevaluezero)\n     * for equality comparisons.\n     *\n     * @static\n     * @memberOf _\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @param {...Array} [values] The arrays of values to exclude.\n     * @returns {Array} Returns the new array of filtered values.\n     * @example\n     *\n     * _.difference([1, 2, 3], [4, 2]);\n     * // => [1, 3]\n     */\n    var difference = restParam(function(array, values) {\n      return (isObjectLike(array) && isArrayLike(array))\n        ? baseDifference(array, baseFlatten(values, false, true))\n        : [];\n    });\n\n    /**\n     * Creates a slice of `array` with `n` elements dropped from the beginning.\n     *\n     * @static\n     * @memberOf _\n     * @category Array\n     * @param {Array} array The array to query.\n     * @param {number} [n=1] The number of elements to drop.\n     * @param- {Object} [guard] Enables use as a callback for functions like `_.map`.\n     * @returns {Array} Returns the slice of `array`.\n     * @example\n     *\n     * _.drop([1, 2, 3]);\n     * // => [2, 3]\n     *\n     * _.drop([1, 2, 3], 2);\n     * // => [3]\n     *\n     * _.drop([1, 2, 3], 5);\n     * // => []\n     *\n     * _.drop([1, 2, 3], 0);\n     * // => [1, 2, 3]\n     */\n    function drop(array, n, guard) {\n      var length = array ? array.length : 0;\n      if (!length) {\n        return [];\n      }\n      if (guard ? isIterateeCall(array, n, guard) : n == null) {\n        n = 1;\n      }\n      return baseSlice(array, n < 0 ? 0 : n);\n    }\n\n    /**\n     * Creates a slice of `array` with `n` elements dropped from the end.\n     *\n     * @static\n     * @memberOf _\n     * @category Array\n     * @param {Array} array The array to query.\n     * @param {number} [n=1] The number of elements to drop.\n     * @param- {Object} [guard] Enables use as a callback for functions like `_.map`.\n     * @returns {Array} Returns the slice of `array`.\n     * @example\n     *\n     * _.dropRight([1, 2, 3]);\n     * // => [1, 2]\n     *\n     * _.dropRight([1, 2, 3], 2);\n     * // => [1]\n     *\n     * _.dropRight([1, 2, 3], 5);\n     * // => []\n     *\n     * _.dropRight([1, 2, 3], 0);\n     * // => [1, 2, 3]\n     */\n    function dropRight(array, n, guard) {\n      var length = array ? array.length : 0;\n      if (!length) {\n        return [];\n      }\n      if (guard ? isIterateeCall(array, n, guard) : n == null) {\n        n = 1;\n      }\n      n = length - (+n || 0);\n      return baseSlice(array, 0, n < 0 ? 0 : n);\n    }\n\n    /**\n     * Creates a slice of `array` excluding elements dropped from the end.\n     * Elements are dropped until `predicate` returns falsey. The predicate is\n     * bound to `thisArg` and invoked with three arguments: (value, index, array).\n     *\n     * If a property name is provided for `predicate` the created `_.property`\n     * style callback returns the property value of the given element.\n     *\n     * If a value is also provided for `thisArg` the created `_.matchesProperty`\n     * style callback returns `true` for elements that have a matching property\n     * value, else `false`.\n     *\n     * If an object is provided for `predicate` the created `_.matches` style\n     * callback returns `true` for elements that match the properties of the given\n     * object, else `false`.\n     *\n     * @static\n     * @memberOf _\n     * @category Array\n     * @param {Array} array The array to query.\n     * @param {Function|Object|string} [predicate=_.identity] The function invoked\n     *  per iteration.\n     * @param {*} [thisArg] The `this` binding of `predicate`.\n     * @returns {Array} Returns the slice of `array`.\n     * @example\n     *\n     * _.dropRightWhile([1, 2, 3], function(n) {\n     *   return n > 1;\n     * });\n     * // => [1]\n     *\n     * var users = [\n     *   { 'user': 'barney',  'active': true },\n     *   { 'user': 'fred',    'active': false },\n     *   { 'user': 'pebbles', 'active': false }\n     * ];\n     *\n     * // using the `_.matches` callback shorthand\n     * _.pluck(_.dropRightWhile(users, { 'user': 'pebbles', 'active': false }), 'user');\n     * // => ['barney', 'fred']\n     *\n     * // using the `_.matchesProperty` callback shorthand\n     * _.pluck(_.dropRightWhile(users, 'active', false), 'user');\n     * // => ['barney']\n     *\n     * // using the `_.property` callback shorthand\n     * _.pluck(_.dropRightWhile(users, 'active'), 'user');\n     * // => ['barney', 'fred', 'pebbles']\n     */\n    function dropRightWhile(array, predicate, thisArg) {\n      return (array && array.length)\n        ? baseWhile(array, getCallback(predicate, thisArg, 3), true, true)\n        : [];\n    }\n\n    /**\n     * Creates a slice of `array` excluding elements dropped from the beginning.\n     * Elements are dropped until `predicate` returns falsey. The predicate is\n     * bound to `thisArg` and invoked with three arguments: (value, index, array).\n     *\n     * If a property name is provided for `predicate` the created `_.property`\n     * style callback returns the property value of the given element.\n     *\n     * If a value is also provided for `thisArg` the created `_.matchesProperty`\n     * style callback returns `true` for elements that have a matching property\n     * value, else `false`.\n     *\n     * If an object is provided for `predicate` the created `_.matches` style\n     * callback returns `true` for elements that have the properties of the given\n     * object, else `false`.\n     *\n     * @static\n     * @memberOf _\n     * @category Array\n     * @param {Array} array The array to query.\n     * @param {Function|Object|string} [predicate=_.identity] The function invoked\n     *  per iteration.\n     * @param {*} [thisArg] The `this` binding of `predicate`.\n     * @returns {Array} Returns the slice of `array`.\n     * @example\n     *\n     * _.dropWhile([1, 2, 3], function(n) {\n     *   return n < 3;\n     * });\n     * // => [3]\n     *\n     * var users = [\n     *   { 'user': 'barney',  'active': false },\n     *   { 'user': 'fred',    'active': false },\n     *   { 'user': 'pebbles', 'active': true }\n     * ];\n     *\n     * // using the `_.matches` callback shorthand\n     * _.pluck(_.dropWhile(users, { 'user': 'barney', 'active': false }), 'user');\n     * // => ['fred', 'pebbles']\n     *\n     * // using the `_.matchesProperty` callback shorthand\n     * _.pluck(_.dropWhile(users, 'active', false), 'user');\n     * // => ['pebbles']\n     *\n     * // using the `_.property` callback shorthand\n     * _.pluck(_.dropWhile(users, 'active'), 'user');\n     * // => ['barney', 'fred', 'pebbles']\n     */\n    function dropWhile(array, predicate, thisArg) {\n      return (array && array.length)\n        ? baseWhile(array, getCallback(predicate, thisArg, 3), true)\n        : [];\n    }\n\n    /**\n     * Fills elements of `array` with `value` from `start` up to, but not\n     * including, `end`.\n     *\n     * **Note:** This method mutates `array`.\n     *\n     * @static\n     * @memberOf _\n     * @category Array\n     * @param {Array} array The array to fill.\n     * @param {*} value The value to fill `array` with.\n     * @param {number} [start=0] The start position.\n     * @param {number} [end=array.length] The end position.\n     * @returns {Array} Returns `array`.\n     * @example\n     *\n     * var array = [1, 2, 3];\n     *\n     * _.fill(array, 'a');\n     * console.log(array);\n     * // => ['a', 'a', 'a']\n     *\n     * _.fill(Array(3), 2);\n     * // => [2, 2, 2]\n     *\n     * _.fill([4, 6, 8], '*', 1, 2);\n     * // => [4, '*', 8]\n     */\n    function fill(array, value, start, end) {\n      var length = array ? array.length : 0;\n      if (!length) {\n        return [];\n      }\n      if (start && typeof start != 'number' && isIterateeCall(array, value, start)) {\n        start = 0;\n        end = length;\n      }\n      return baseFill(array, value, start, end);\n    }\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     * If a property name is provided for `predicate` the created `_.property`\n     * style callback returns the property value of the given element.\n     *\n     * If a value is also provided for `thisArg` the created `_.matchesProperty`\n     * style callback returns `true` for elements that have a matching property\n     * value, else `false`.\n     *\n     * If an object is provided for `predicate` the created `_.matches` style\n     * callback returns `true` for elements that have the properties of the given\n     * object, else `false`.\n     *\n     * @static\n     * @memberOf _\n     * @category Array\n     * @param {Array} array The array to search.\n     * @param {Function|Object|string} [predicate=_.identity] The function invoked\n     *  per iteration.\n     * @param {*} [thisArg] The `this` binding of `predicate`.\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(chr) {\n     *   return chr.user == 'barney';\n     * });\n     * // => 0\n     *\n     * // using the `_.matches` callback shorthand\n     * _.findIndex(users, { 'user': 'fred', 'active': false });\n     * // => 1\n     *\n     * // using the `_.matchesProperty` callback shorthand\n     * _.findIndex(users, 'active', false);\n     * // => 0\n     *\n     * // using the `_.property` callback shorthand\n     * _.findIndex(users, 'active');\n     * // => 2\n     */\n    var findIndex = createFindIndex();\n\n    /**\n     * This method is like `_.findIndex` except that it iterates over elements\n     * of `collection` from right to left.\n     *\n     * If a property name is provided for `predicate` the created `_.property`\n     * style callback returns the property value of the given element.\n     *\n     * If a value is also provided for `thisArg` the created `_.matchesProperty`\n     * style callback returns `true` for elements that have a matching property\n     * value, else `false`.\n     *\n     * If an object is provided for `predicate` the created `_.matches` style\n     * callback returns `true` for elements that have the properties of the given\n     * object, else `false`.\n     *\n     * @static\n     * @memberOf _\n     * @category Array\n     * @param {Array} array The array to search.\n     * @param {Function|Object|string} [predicate=_.identity] The function invoked\n     *  per iteration.\n     * @param {*} [thisArg] The `this` binding of `predicate`.\n     * @returns {number} Returns the index of the found element, else `-1`.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney',  'active': true },\n     *   { 'user': 'fred',    'active': false },\n     *   { 'user': 'pebbles', 'active': false }\n     * ];\n     *\n     * _.findLastIndex(users, function(chr) {\n     *   return chr.user == 'pebbles';\n     * });\n     * // => 2\n     *\n     * // using the `_.matches` callback shorthand\n     * _.findLastIndex(users, { 'user': 'barney', 'active': true });\n     * // => 0\n     *\n     * // using the `_.matchesProperty` callback shorthand\n     * _.findLastIndex(users, 'active', false);\n     * // => 2\n     *\n     * // using the `_.property` callback shorthand\n     * _.findLastIndex(users, 'active');\n     * // => 0\n     */\n    var findLastIndex = createFindIndex(true);\n\n    /**\n     * Gets the first element of `array`.\n     *\n     * @static\n     * @memberOf _\n     * @alias head\n     * @category Array\n     * @param {Array} array The array to query.\n     * @returns {*} Returns the first element of `array`.\n     * @example\n     *\n     * _.first([1, 2, 3]);\n     * // => 1\n     *\n     * _.first([]);\n     * // => undefined\n     */\n    function first(array) {\n      return array ? array[0] : undefined;\n    }\n\n    /**\n     * Flattens a nested array. If `isDeep` is `true` the array is recursively\n     * flattened, otherwise it is only flattened a single level.\n     *\n     * @static\n     * @memberOf _\n     * @category Array\n     * @param {Array} array The array to flatten.\n     * @param {boolean} [isDeep] Specify a deep flatten.\n     * @param- {Object} [guard] Enables use as a callback for functions like `_.map`.\n     * @returns {Array} Returns the new flattened array.\n     * @example\n     *\n     * _.flatten([1, [2, 3, [4]]]);\n     * // => [1, 2, 3, [4]]\n     *\n     * // using `isDeep`\n     * _.flatten([1, [2, 3, [4]]], true);\n     * // => [1, 2, 3, 4]\n     */\n    function flatten(array, isDeep, guard) {\n      var length = array ? array.length : 0;\n      if (guard && isIterateeCall(array, isDeep, guard)) {\n        isDeep = false;\n      }\n      return length ? baseFlatten(array, isDeep) : [];\n    }\n\n    /**\n     * Recursively flattens a nested array.\n     *\n     * @static\n     * @memberOf _\n     * @category Array\n     * @param {Array} array The array to recursively flatten.\n     * @returns {Array} Returns the new flattened array.\n     * @example\n     *\n     * _.flattenDeep([1, [2, 3, [4]]]);\n     * // => [1, 2, 3, 4]\n     */\n    function flattenDeep(array) {\n      var length = array ? array.length : 0;\n      return length ? baseFlatten(array, true) : [];\n    }\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/6.0/#sec-samevaluezero)\n     * for equality comparisons. If `fromIndex` is negative, it is used as the offset\n     * from the end of `array`. If `array` is sorted providing `true` for `fromIndex`\n     * performs a faster binary search.\n     *\n     * @static\n     * @memberOf _\n     * @category Array\n     * @param {Array} array The array to search.\n     * @param {*} value The value to search for.\n     * @param {boolean|number} [fromIndex=0] The index to search from or `true`\n     *  to perform a binary search on a sorted array.\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     * // using `fromIndex`\n     * _.indexOf([1, 2, 1, 2], 2, 2);\n     * // => 3\n     *\n     * // performing a binary search\n     * _.indexOf([1, 1, 2, 2], 2, true);\n     * // => 2\n     */\n    function indexOf(array, value, fromIndex) {\n      var length = array ? array.length : 0;\n      if (!length) {\n        return -1;\n      }\n      if (typeof fromIndex == 'number') {\n        fromIndex = fromIndex < 0 ? nativeMax(length + fromIndex, 0) : fromIndex;\n      } else if (fromIndex) {\n        var index = binaryIndex(array, value);\n        if (index < length &&\n            (value === value ? (value === array[index]) : (array[index] !== array[index]))) {\n          return index;\n        }\n        return -1;\n      }\n      return baseIndexOf(array, value, fromIndex || 0);\n    }\n\n    /**\n     * Gets all but the last element of `array`.\n     *\n     * @static\n     * @memberOf _\n     * @category Array\n     * @param {Array} array The array to query.\n     * @returns {Array} Returns the slice of `array`.\n     * @example\n     *\n     * _.initial([1, 2, 3]);\n     * // => [1, 2]\n     */\n    function initial(array) {\n      return dropRight(array, 1);\n    }\n\n    /**\n     * Creates an array of unique values that are included in all of the provided\n     * arrays using [`SameValueZero`](http://ecma-international.org/ecma-262/6.0/#sec-samevaluezero)\n     * for equality comparisons.\n     *\n     * @static\n     * @memberOf _\n     * @category Array\n     * @param {...Array} [arrays] The arrays to inspect.\n     * @returns {Array} Returns the new array of shared values.\n     * @example\n     * _.intersection([1, 2], [4, 2], [2, 1]);\n     * // => [2]\n     */\n    var intersection = restParam(function(arrays) {\n      var othLength = arrays.length,\n          othIndex = othLength,\n          caches = Array(length),\n          indexOf = getIndexOf(),\n          isCommon = indexOf == baseIndexOf,\n          result = [];\n\n      while (othIndex--) {\n        var value = arrays[othIndex] = isArrayLike(value = arrays[othIndex]) ? value : [];\n        caches[othIndex] = (isCommon && value.length >= 120) ? createCache(othIndex && value) : null;\n      }\n      var array = arrays[0],\n          index = -1,\n          length = array ? array.length : 0,\n          seen = caches[0];\n\n      outer:\n      while (++index < length) {\n        value = array[index];\n        if ((seen ? cacheIndexOf(seen, value) : indexOf(result, value, 0)) < 0) {\n          var othIndex = othLength;\n          while (--othIndex) {\n            var cache = caches[othIndex];\n            if ((cache ? cacheIndexOf(cache, value) : indexOf(arrays[othIndex], value, 0)) < 0) {\n              continue outer;\n            }\n          }\n          if (seen) {\n            seen.push(value);\n          }\n          result.push(value);\n        }\n      }\n      return result;\n    });\n\n    /**\n     * Gets the last element of `array`.\n     *\n     * @static\n     * @memberOf _\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     */\n    function last(array) {\n      var length = array ? array.length : 0;\n      return length ? array[length - 1] : undefined;\n    }\n\n    /**\n     * This method is like `_.indexOf` except that it iterates over elements of\n     * `array` from right to left.\n     *\n     * @static\n     * @memberOf _\n     * @category Array\n     * @param {Array} array The array to search.\n     * @param {*} value The value to search for.\n     * @param {boolean|number} [fromIndex=array.length-1] The index to search from\n     *  or `true` to perform a binary search on a sorted array.\n     * @returns {number} Returns the index of the matched value, else `-1`.\n     * @example\n     *\n     * _.lastIndexOf([1, 2, 1, 2], 2);\n     * // => 3\n     *\n     * // using `fromIndex`\n     * _.lastIndexOf([1, 2, 1, 2], 2, 2);\n     * // => 1\n     *\n     * // performing a binary search\n     * _.lastIndexOf([1, 1, 2, 2], 2, true);\n     * // => 3\n     */\n    function lastIndexOf(array, value, fromIndex) {\n      var length = array ? array.length : 0;\n      if (!length) {\n        return -1;\n      }\n      var index = length;\n      if (typeof fromIndex == 'number') {\n        index = (fromIndex < 0 ? nativeMax(length + fromIndex, 0) : nativeMin(fromIndex || 0, length - 1)) + 1;\n      } else if (fromIndex) {\n        index = binaryIndex(array, value, true) - 1;\n        var other = array[index];\n        if (value === value ? (value === other) : (other !== other)) {\n          return index;\n        }\n        return -1;\n      }\n      if (value !== value) {\n        return indexOfNaN(array, index, true);\n      }\n      while (index--) {\n        if (array[index] === value) {\n          return index;\n        }\n      }\n      return -1;\n    }\n\n    /**\n     * Removes all provided values from `array` using\n     * [`SameValueZero`](http://ecma-international.org/ecma-262/6.0/#sec-samevaluezero)\n     * for equality comparisons.\n     *\n     * **Note:** Unlike `_.without`, this method mutates `array`.\n     *\n     * @static\n     * @memberOf _\n     * @category Array\n     * @param {Array} array The array to modify.\n     * @param {...*} [values] The values to remove.\n     * @returns {Array} Returns `array`.\n     * @example\n     *\n     * var array = [1, 2, 3, 1, 2, 3];\n     *\n     * _.pull(array, 2, 3);\n     * console.log(array);\n     * // => [1, 1]\n     */\n    function pull() {\n      var args = arguments,\n          array = args[0];\n\n      if (!(array && array.length)) {\n        return array;\n      }\n      var index = 0,\n          indexOf = getIndexOf(),\n          length = args.length;\n\n      while (++index < length) {\n        var fromIndex = 0,\n            value = args[index];\n\n        while ((fromIndex = indexOf(array, value, fromIndex)) > -1) {\n          splice.call(array, fromIndex, 1);\n        }\n      }\n      return array;\n    }\n\n    /**\n     * Removes elements from `array` corresponding to the given indexes and returns\n     * an array of the removed elements. Indexes may be specified as an array of\n     * indexes or as individual arguments.\n     *\n     * **Note:** Unlike `_.at`, this method mutates `array`.\n     *\n     * @static\n     * @memberOf _\n     * @category Array\n     * @param {Array} array The array to modify.\n     * @param {...(number|number[])} [indexes] The indexes of elements to remove,\n     *  specified as individual indexes or arrays of indexes.\n     * @returns {Array} Returns the new array of removed elements.\n     * @example\n     *\n     * var array = [5, 10, 15, 20];\n     * var evens = _.pullAt(array, 1, 3);\n     *\n     * console.log(array);\n     * // => [5, 15]\n     *\n     * console.log(evens);\n     * // => [10, 20]\n     */\n    var pullAt = restParam(function(array, indexes) {\n      indexes = baseFlatten(indexes);\n\n      var result = baseAt(array, indexes);\n      basePullAt(array, indexes.sort(baseCompareAscending));\n      return result;\n    });\n\n    /**\n     * Removes all elements from `array` that `predicate` returns truthy for\n     * and returns an array of the removed elements. The predicate is bound to\n     * `thisArg` and invoked with three arguments: (value, index, array).\n     *\n     * If a property name is provided for `predicate` the created `_.property`\n     * style callback returns the property value of the given element.\n     *\n     * If a value is also provided for `thisArg` the created `_.matchesProperty`\n     * style callback returns `true` for elements that have a matching property\n     * value, else `false`.\n     *\n     * If an object is provided for `predicate` the created `_.matches` style\n     * callback returns `true` for elements that have the properties of the given\n     * object, else `false`.\n     *\n     * **Note:** Unlike `_.filter`, this method mutates `array`.\n     *\n     * @static\n     * @memberOf _\n     * @category Array\n     * @param {Array} array The array to modify.\n     * @param {Function|Object|string} [predicate=_.identity] The function invoked\n     *  per iteration.\n     * @param {*} [thisArg] The `this` binding of `predicate`.\n     * @returns {Array} Returns the new array of removed elements.\n     * @example\n     *\n     * var array = [1, 2, 3, 4];\n     * var evens = _.remove(array, function(n) {\n     *   return n % 2 == 0;\n     * });\n     *\n     * console.log(array);\n     * // => [1, 3]\n     *\n     * console.log(evens);\n     * // => [2, 4]\n     */\n    function remove(array, predicate, thisArg) {\n      var result = [];\n      if (!(array && array.length)) {\n        return result;\n      }\n      var index = -1,\n          indexes = [],\n          length = array.length;\n\n      predicate = getCallback(predicate, thisArg, 3);\n      while (++index < length) {\n        var value = array[index];\n        if (predicate(value, index, array)) {\n          result.push(value);\n          indexes.push(index);\n        }\n      }\n      basePullAt(array, indexes);\n      return result;\n    }\n\n    /**\n     * Gets all but the first element of `array`.\n     *\n     * @static\n     * @memberOf _\n     * @alias tail\n     * @category Array\n     * @param {Array} array The array to query.\n     * @returns {Array} Returns the slice of `array`.\n     * @example\n     *\n     * _.rest([1, 2, 3]);\n     * // => [2, 3]\n     */\n    function rest(array) {\n      return drop(array, 1);\n    }\n\n    /**\n     * Creates a slice of `array` from `start` up to, but not including, `end`.\n     *\n     * **Note:** This method is used instead of `Array#slice` to support node\n     * lists in IE < 9 and to ensure dense arrays are returned.\n     *\n     * @static\n     * @memberOf _\n     * @category Array\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     */\n    function slice(array, start, end) {\n      var length = array ? array.length : 0;\n      if (!length) {\n        return [];\n      }\n      if (end && typeof end != 'number' && isIterateeCall(array, start, end)) {\n        start = 0;\n        end = length;\n      }\n      return baseSlice(array, start, end);\n    }\n\n    /**\n     * Uses a binary search to determine the lowest index at which `value` should\n     * be inserted into `array` in order to maintain its sort order. If an iteratee\n     * function is provided it is invoked for `value` and each element of `array`\n     * to compute their sort ranking. The iteratee is bound to `thisArg` and\n     * invoked with one argument; (value).\n     *\n     * If a property name is provided for `iteratee` the created `_.property`\n     * style callback returns the property value of the given element.\n     *\n     * If a value is also provided for `thisArg` the created `_.matchesProperty`\n     * style callback returns `true` for elements that have a matching property\n     * value, else `false`.\n     *\n     * If an object is provided for `iteratee` the created `_.matches` style\n     * callback returns `true` for elements that have the properties of the given\n     * object, else `false`.\n     *\n     * @static\n     * @memberOf _\n     * @category Array\n     * @param {Array} array The sorted array to inspect.\n     * @param {*} value The value to evaluate.\n     * @param {Function|Object|string} [iteratee=_.identity] The function invoked\n     *  per iteration.\n     * @param {*} [thisArg] The `this` binding of `iteratee`.\n     * @returns {number} Returns the index at which `value` should be inserted\n     *  into `array`.\n     * @example\n     *\n     * _.sortedIndex([30, 50], 40);\n     * // => 1\n     *\n     * _.sortedIndex([4, 4, 5, 5], 5);\n     * // => 2\n     *\n     * var dict = { 'data': { 'thirty': 30, 'forty': 40, 'fifty': 50 } };\n     *\n     * // using an iteratee function\n     * _.sortedIndex(['thirty', 'fifty'], 'forty', function(word) {\n     *   return this.data[word];\n     * }, dict);\n     * // => 1\n     *\n     * // using the `_.property` callback shorthand\n     * _.sortedIndex([{ 'x': 30 }, { 'x': 50 }], { 'x': 40 }, 'x');\n     * // => 1\n     */\n    var sortedIndex = createSortedIndex();\n\n    /**\n     * This method is like `_.sortedIndex` except that it returns the highest\n     * index at which `value` should be inserted into `array` in order to\n     * maintain its sort order.\n     *\n     * @static\n     * @memberOf _\n     * @category Array\n     * @param {Array} array The sorted array to inspect.\n     * @param {*} value The value to evaluate.\n     * @param {Function|Object|string} [iteratee=_.identity] The function invoked\n     *  per iteration.\n     * @param {*} [thisArg] The `this` binding of `iteratee`.\n     * @returns {number} Returns the index at which `value` should be inserted\n     *  into `array`.\n     * @example\n     *\n     * _.sortedLastIndex([4, 4, 5, 5], 5);\n     * // => 4\n     */\n    var sortedLastIndex = createSortedIndex(true);\n\n    /**\n     * Creates a slice of `array` with `n` elements taken from the beginning.\n     *\n     * @static\n     * @memberOf _\n     * @category Array\n     * @param {Array} array The array to query.\n     * @param {number} [n=1] The number of elements to take.\n     * @param- {Object} [guard] Enables use as a callback for functions like `_.map`.\n     * @returns {Array} Returns the slice of `array`.\n     * @example\n     *\n     * _.take([1, 2, 3]);\n     * // => [1]\n     *\n     * _.take([1, 2, 3], 2);\n     * // => [1, 2]\n     *\n     * _.take([1, 2, 3], 5);\n     * // => [1, 2, 3]\n     *\n     * _.take([1, 2, 3], 0);\n     * // => []\n     */\n    function take(array, n, guard) {\n      var length = array ? array.length : 0;\n      if (!length) {\n        return [];\n      }\n      if (guard ? isIterateeCall(array, n, guard) : n == null) {\n        n = 1;\n      }\n      return baseSlice(array, 0, n < 0 ? 0 : n);\n    }\n\n    /**\n     * Creates a slice of `array` with `n` elements taken from the end.\n     *\n     * @static\n     * @memberOf _\n     * @category Array\n     * @param {Array} array The array to query.\n     * @param {number} [n=1] The number of elements to take.\n     * @param- {Object} [guard] Enables use as a callback for functions like `_.map`.\n     * @returns {Array} Returns the slice of `array`.\n     * @example\n     *\n     * _.takeRight([1, 2, 3]);\n     * // => [3]\n     *\n     * _.takeRight([1, 2, 3], 2);\n     * // => [2, 3]\n     *\n     * _.takeRight([1, 2, 3], 5);\n     * // => [1, 2, 3]\n     *\n     * _.takeRight([1, 2, 3], 0);\n     * // => []\n     */\n    function takeRight(array, n, guard) {\n      var length = array ? array.length : 0;\n      if (!length) {\n        return [];\n      }\n      if (guard ? isIterateeCall(array, n, guard) : n == null) {\n        n = 1;\n      }\n      n = length - (+n || 0);\n      return baseSlice(array, n < 0 ? 0 : n);\n    }\n\n    /**\n     * Creates a slice of `array` with elements taken from the end. Elements are\n     * taken until `predicate` returns falsey. The predicate is bound to `thisArg`\n     * and invoked with three arguments: (value, index, array).\n     *\n     * If a property name is provided for `predicate` the created `_.property`\n     * style callback returns the property value of the given element.\n     *\n     * If a value is also provided for `thisArg` the created `_.matchesProperty`\n     * style callback returns `true` for elements that have a matching property\n     * value, else `false`.\n     *\n     * If an object is provided for `predicate` the created `_.matches` style\n     * callback returns `true` for elements that have the properties of the given\n     * object, else `false`.\n     *\n     * @static\n     * @memberOf _\n     * @category Array\n     * @param {Array} array The array to query.\n     * @param {Function|Object|string} [predicate=_.identity] The function invoked\n     *  per iteration.\n     * @param {*} [thisArg] The `this` binding of `predicate`.\n     * @returns {Array} Returns the slice of `array`.\n     * @example\n     *\n     * _.takeRightWhile([1, 2, 3], function(n) {\n     *   return n > 1;\n     * });\n     * // => [2, 3]\n     *\n     * var users = [\n     *   { 'user': 'barney',  'active': true },\n     *   { 'user': 'fred',    'active': false },\n     *   { 'user': 'pebbles', 'active': false }\n     * ];\n     *\n     * // using the `_.matches` callback shorthand\n     * _.pluck(_.takeRightWhile(users, { 'user': 'pebbles', 'active': false }), 'user');\n     * // => ['pebbles']\n     *\n     * // using the `_.matchesProperty` callback shorthand\n     * _.pluck(_.takeRightWhile(users, 'active', false), 'user');\n     * // => ['fred', 'pebbles']\n     *\n     * // using the `_.property` callback shorthand\n     * _.pluck(_.takeRightWhile(users, 'active'), 'user');\n     * // => []\n     */\n    function takeRightWhile(array, predicate, thisArg) {\n      return (array && array.length)\n        ? baseWhile(array, getCallback(predicate, thisArg, 3), false, true)\n        : [];\n    }\n\n    /**\n     * Creates a slice of `array` with elements taken from the beginning. Elements\n     * are taken until `predicate` returns falsey. The predicate is bound to\n     * `thisArg` and invoked with three arguments: (value, index, array).\n     *\n     * If a property name is provided for `predicate` the created `_.property`\n     * style callback returns the property value of the given element.\n     *\n     * If a value is also provided for `thisArg` the created `_.matchesProperty`\n     * style callback returns `true` for elements that have a matching property\n     * value, else `false`.\n     *\n     * If an object is provided for `predicate` the created `_.matches` style\n     * callback returns `true` for elements that have the properties of the given\n     * object, else `false`.\n     *\n     * @static\n     * @memberOf _\n     * @category Array\n     * @param {Array} array The array to query.\n     * @param {Function|Object|string} [predicate=_.identity] The function invoked\n     *  per iteration.\n     * @param {*} [thisArg] The `this` binding of `predicate`.\n     * @returns {Array} Returns the slice of `array`.\n     * @example\n     *\n     * _.takeWhile([1, 2, 3], function(n) {\n     *   return n < 3;\n     * });\n     * // => [1, 2]\n     *\n     * var users = [\n     *   { 'user': 'barney',  'active': false },\n     *   { 'user': 'fred',    'active': false},\n     *   { 'user': 'pebbles', 'active': true }\n     * ];\n     *\n     * // using the `_.matches` callback shorthand\n     * _.pluck(_.takeWhile(users, { 'user': 'barney', 'active': false }), 'user');\n     * // => ['barney']\n     *\n     * // using the `_.matchesProperty` callback shorthand\n     * _.pluck(_.takeWhile(users, 'active', false), 'user');\n     * // => ['barney', 'fred']\n     *\n     * // using the `_.property` callback shorthand\n     * _.pluck(_.takeWhile(users, 'active'), 'user');\n     * // => []\n     */\n    function takeWhile(array, predicate, thisArg) {\n      return (array && array.length)\n        ? baseWhile(array, getCallback(predicate, thisArg, 3))\n        : [];\n    }\n\n    /**\n     * Creates an array of unique values, in order, from all of the provided arrays\n     * using [`SameValueZero`](http://ecma-international.org/ecma-262/6.0/#sec-samevaluezero)\n     * for equality comparisons.\n     *\n     * @static\n     * @memberOf _\n     * @category Array\n     * @param {...Array} [arrays] The arrays to inspect.\n     * @returns {Array} Returns the new array of combined values.\n     * @example\n     *\n     * _.union([1, 2], [4, 2], [2, 1]);\n     * // => [1, 2, 4]\n     */\n    var union = restParam(function(arrays) {\n      return baseUniq(baseFlatten(arrays, false, true));\n    });\n\n    /**\n     * Creates a duplicate-free version of an array, using\n     * [`SameValueZero`](http://ecma-international.org/ecma-262/6.0/#sec-samevaluezero)\n     * for equality comparisons, in which only the first occurence of each element\n     * is kept. Providing `true` for `isSorted` performs a faster search algorithm\n     * for sorted arrays. If an iteratee function is provided it is invoked for\n     * each element in the array to generate the criterion by which uniqueness\n     * is computed. The `iteratee` is bound to `thisArg` and invoked with three\n     * arguments: (value, index, array).\n     *\n     * If a property name is provided for `iteratee` the created `_.property`\n     * style callback returns the property value of the given element.\n     *\n     * If a value is also provided for `thisArg` the created `_.matchesProperty`\n     * style callback returns `true` for elements that have a matching property\n     * value, else `false`.\n     *\n     * If an object is provided for `iteratee` the created `_.matches` style\n     * callback returns `true` for elements that have the properties of the given\n     * object, else `false`.\n     *\n     * @static\n     * @memberOf _\n     * @alias unique\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @param {boolean} [isSorted] Specify the array is sorted.\n     * @param {Function|Object|string} [iteratee] The function invoked per iteration.\n     * @param {*} [thisArg] The `this` binding of `iteratee`.\n     * @returns {Array} Returns the new duplicate-value-free array.\n     * @example\n     *\n     * _.uniq([2, 1, 2]);\n     * // => [2, 1]\n     *\n     * // using `isSorted`\n     * _.uniq([1, 1, 2], true);\n     * // => [1, 2]\n     *\n     * // using an iteratee function\n     * _.uniq([1, 2.5, 1.5, 2], function(n) {\n     *   return this.floor(n);\n     * }, Math);\n     * // => [1, 2.5]\n     *\n     * // using the `_.property` callback shorthand\n     * _.uniq([{ 'x': 1 }, { 'x': 2 }, { 'x': 1 }], 'x');\n     * // => [{ 'x': 1 }, { 'x': 2 }]\n     */\n    function uniq(array, isSorted, iteratee, thisArg) {\n      var length = array ? array.length : 0;\n      if (!length) {\n        return [];\n      }\n      if (isSorted != null && typeof isSorted != 'boolean') {\n        thisArg = iteratee;\n        iteratee = isIterateeCall(array, isSorted, thisArg) ? undefined : isSorted;\n        isSorted = false;\n      }\n      var callback = getCallback();\n      if (!(iteratee == null && callback === baseCallback)) {\n        iteratee = callback(iteratee, thisArg, 3);\n      }\n      return (isSorted && getIndexOf() == baseIndexOf)\n        ? sortedUniq(array, iteratee)\n        : baseUniq(array, iteratee);\n    }\n\n    /**\n     * This method is like `_.zip` except that it accepts an array of grouped\n     * elements and creates an array regrouping the elements to their pre-zip\n     * configuration.\n     *\n     * @static\n     * @memberOf _\n     * @category Array\n     * @param {Array} array The array of grouped elements to process.\n     * @returns {Array} Returns the new array of regrouped elements.\n     * @example\n     *\n     * var zipped = _.zip(['fred', 'barney'], [30, 40], [true, false]);\n     * // => [['fred', 30, true], ['barney', 40, false]]\n     *\n     * _.unzip(zipped);\n     * // => [['fred', 'barney'], [30, 40], [true, false]]\n     */\n    function unzip(array) {\n      if (!(array && array.length)) {\n        return [];\n      }\n      var index = -1,\n          length = 0;\n\n      array = arrayFilter(array, function(group) {\n        if (isArrayLike(group)) {\n          length = nativeMax(group.length, length);\n          return true;\n        }\n      });\n      var result = Array(length);\n      while (++index < length) {\n        result[index] = arrayMap(array, baseProperty(index));\n      }\n      return result;\n    }\n\n    /**\n     * This method is like `_.unzip` except that it accepts an iteratee to specify\n     * how regrouped values should be combined. The `iteratee` is bound to `thisArg`\n     * and invoked with four arguments: (accumulator, value, index, group).\n     *\n     * @static\n     * @memberOf _\n     * @category Array\n     * @param {Array} array The array of grouped elements to process.\n     * @param {Function} [iteratee] The function to combine regrouped values.\n     * @param {*} [thisArg] The `this` binding of `iteratee`.\n     * @returns {Array} Returns the new array of regrouped elements.\n     * @example\n     *\n     * var zipped = _.zip([1, 2], [10, 20], [100, 200]);\n     * // => [[1, 10, 100], [2, 20, 200]]\n     *\n     * _.unzipWith(zipped, _.add);\n     * // => [3, 30, 300]\n     */\n    function unzipWith(array, iteratee, thisArg) {\n      var length = array ? array.length : 0;\n      if (!length) {\n        return [];\n      }\n      var result = unzip(array);\n      if (iteratee == null) {\n        return result;\n      }\n      iteratee = bindCallback(iteratee, thisArg, 4);\n      return arrayMap(result, function(group) {\n        return arrayReduce(group, iteratee, undefined, true);\n      });\n    }\n\n    /**\n     * Creates an array excluding all provided values using\n     * [`SameValueZero`](http://ecma-international.org/ecma-262/6.0/#sec-samevaluezero)\n     * for equality comparisons.\n     *\n     * @static\n     * @memberOf _\n     * @category Array\n     * @param {Array} array The array to filter.\n     * @param {...*} [values] The values to exclude.\n     * @returns {Array} Returns the new array of filtered values.\n     * @example\n     *\n     * _.without([1, 2, 1, 3], 1, 2);\n     * // => [3]\n     */\n    var without = restParam(function(array, values) {\n      return isArrayLike(array)\n        ? baseDifference(array, values)\n        : [];\n    });\n\n    /**\n     * Creates an array of unique values that is the [symmetric difference](https://en.wikipedia.org/wiki/Symmetric_difference)\n     * of the provided arrays.\n     *\n     * @static\n     * @memberOf _\n     * @category Array\n     * @param {...Array} [arrays] The arrays to inspect.\n     * @returns {Array} Returns the new array of values.\n     * @example\n     *\n     * _.xor([1, 2], [4, 2]);\n     * // => [1, 4]\n     */\n    function xor() {\n      var index = -1,\n          length = arguments.length;\n\n      while (++index < length) {\n        var array = arguments[index];\n        if (isArrayLike(array)) {\n          var result = result\n            ? arrayPush(baseDifference(result, array), baseDifference(array, result))\n            : array;\n        }\n      }\n      return result ? baseUniq(result) : [];\n    }\n\n    /**\n     * Creates an array of grouped elements, the first of which contains the first\n     * elements of the given arrays, the second of which contains the second elements\n     * of the given arrays, and so on.\n     *\n     * @static\n     * @memberOf _\n     * @category Array\n     * @param {...Array} [arrays] The arrays to process.\n     * @returns {Array} Returns the new array of grouped elements.\n     * @example\n     *\n     * _.zip(['fred', 'barney'], [30, 40], [true, false]);\n     * // => [['fred', 30, true], ['barney', 40, false]]\n     */\n    var zip = restParam(unzip);\n\n    /**\n     * The inverse of `_.pairs`; this method returns an object composed from arrays\n     * of property names and values. Provide either a single two dimensional array,\n     * e.g. `[[key1, value1], [key2, value2]]` or two arrays, one of property names\n     * and one of corresponding values.\n     *\n     * @static\n     * @memberOf _\n     * @alias object\n     * @category Array\n     * @param {Array} props The property names.\n     * @param {Array} [values=[]] The property values.\n     * @returns {Object} Returns the new object.\n     * @example\n     *\n     * _.zipObject([['fred', 30], ['barney', 40]]);\n     * // => { 'fred': 30, 'barney': 40 }\n     *\n     * _.zipObject(['fred', 'barney'], [30, 40]);\n     * // => { 'fred': 30, 'barney': 40 }\n     */\n    function zipObject(props, values) {\n      var index = -1,\n          length = props ? props.length : 0,\n          result = {};\n\n      if (length && !values && !isArray(props[0])) {\n        values = [];\n      }\n      while (++index < length) {\n        var key = props[index];\n        if (values) {\n          result[key] = values[index];\n        } else if (key) {\n          result[key[0]] = key[1];\n        }\n      }\n      return result;\n    }\n\n    /**\n     * This method is like `_.zip` except that it accepts an iteratee to specify\n     * how grouped values should be combined. The `iteratee` is bound to `thisArg`\n     * and invoked with four arguments: (accumulator, value, index, group).\n     *\n     * @static\n     * @memberOf _\n     * @category Array\n     * @param {...Array} [arrays] The arrays to process.\n     * @param {Function} [iteratee] The function to combine grouped values.\n     * @param {*} [thisArg] The `this` binding of `iteratee`.\n     * @returns {Array} Returns the new array of grouped elements.\n     * @example\n     *\n     * _.zipWith([1, 2], [10, 20], [100, 200], _.add);\n     * // => [111, 222]\n     */\n    var zipWith = restParam(function(arrays) {\n      var length = arrays.length,\n          iteratee = length > 2 ? arrays[length - 2] : undefined,\n          thisArg = length > 1 ? arrays[length - 1] : undefined;\n\n      if (length > 2 && typeof iteratee == 'function') {\n        length -= 2;\n      } else {\n        iteratee = (length > 1 && typeof thisArg == 'function') ? (--length, thisArg) : undefined;\n        thisArg = undefined;\n      }\n      arrays.length = length;\n      return unzipWith(arrays, iteratee, thisArg);\n    });\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Creates a `lodash` object that wraps `value` with explicit method\n     * chaining enabled.\n     *\n     * @static\n     * @memberOf _\n     * @category Chain\n     * @param {*} value The value to wrap.\n     * @returns {Object} Returns the new `lodash` wrapper instance.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney',  'age': 36 },\n     *   { 'user': 'fred',    'age': 40 },\n     *   { 'user': 'pebbles', 'age': 1 }\n     * ];\n     *\n     * var youngest = _.chain(users)\n     *   .sortBy('age')\n     *   .map(function(chr) {\n     *     return chr.user + ' is ' + chr.age;\n     *   })\n     *   .first()\n     *   .value();\n     * // => 'pebbles is 1'\n     */\n    function chain(value) {\n      var result = lodash(value);\n      result.__chain__ = true;\n      return result;\n    }\n\n    /**\n     * This method invokes `interceptor` and returns `value`. The interceptor is\n     * bound to `thisArg` and invoked with one argument; (value). The purpose of\n     * this method is to \"tap into\" a method chain in order to perform operations\n     * on intermediate results within the chain.\n     *\n     * @static\n     * @memberOf _\n     * @category Chain\n     * @param {*} value The value to provide to `interceptor`.\n     * @param {Function} interceptor The function to invoke.\n     * @param {*} [thisArg] The `this` binding of `interceptor`.\n     * @returns {*} Returns `value`.\n     * @example\n     *\n     * _([1, 2, 3])\n     *  .tap(function(array) {\n     *    array.pop();\n     *  })\n     *  .reverse()\n     *  .value();\n     * // => [2, 1]\n     */\n    function tap(value, interceptor, thisArg) {\n      interceptor.call(thisArg, value);\n      return value;\n    }\n\n    /**\n     * This method is like `_.tap` except that it returns the result of `interceptor`.\n     *\n     * @static\n     * @memberOf _\n     * @category Chain\n     * @param {*} value The value to provide to `interceptor`.\n     * @param {Function} interceptor The function to invoke.\n     * @param {*} [thisArg] The `this` binding of `interceptor`.\n     * @returns {*} Returns the result of `interceptor`.\n     * @example\n     *\n     * _('  abc  ')\n     *  .chain()\n     *  .trim()\n     *  .thru(function(value) {\n     *    return [value];\n     *  })\n     *  .value();\n     * // => ['abc']\n     */\n    function thru(value, interceptor, thisArg) {\n      return interceptor.call(thisArg, value);\n    }\n\n    /**\n     * Enables explicit method chaining on the wrapper object.\n     *\n     * @name chain\n     * @memberOf _\n     * @category Chain\n     * @returns {Object} Returns the new `lodash` wrapper instance.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney', 'age': 36 },\n     *   { 'user': 'fred',   'age': 40 }\n     * ];\n     *\n     * // without explicit chaining\n     * _(users).first();\n     * // => { 'user': 'barney', 'age': 36 }\n     *\n     * // with explicit chaining\n     * _(users).chain()\n     *   .first()\n     *   .pick('user')\n     *   .value();\n     * // => { 'user': 'barney' }\n     */\n    function wrapperChain() {\n      return chain(this);\n    }\n\n    /**\n     * Executes the chained sequence and returns the wrapped result.\n     *\n     * @name commit\n     * @memberOf _\n     * @category Chain\n     * @returns {Object} Returns the new `lodash` wrapper instance.\n     * @example\n     *\n     * var array = [1, 2];\n     * var wrapped = _(array).push(3);\n     *\n     * console.log(array);\n     * // => [1, 2]\n     *\n     * wrapped = wrapped.commit();\n     * console.log(array);\n     * // => [1, 2, 3]\n     *\n     * wrapped.last();\n     * // => 3\n     *\n     * console.log(array);\n     * // => [1, 2, 3]\n     */\n    function wrapperCommit() {\n      return new LodashWrapper(this.value(), this.__chain__);\n    }\n\n    /**\n     * Creates a new array joining a wrapped array with any additional arrays\n     * and/or values.\n     *\n     * @name concat\n     * @memberOf _\n     * @category Chain\n     * @param {...*} [values] The values to concatenate.\n     * @returns {Array} Returns the new concatenated array.\n     * @example\n     *\n     * var array = [1];\n     * var wrapped = _(array).concat(2, [3], [[4]]);\n     *\n     * console.log(wrapped.value());\n     * // => [1, 2, 3, [4]]\n     *\n     * console.log(array);\n     * // => [1]\n     */\n    var wrapperConcat = restParam(function(values) {\n      values = baseFlatten(values);\n      return this.thru(function(array) {\n        return arrayConcat(isArray(array) ? array : [toObject(array)], values);\n      });\n    });\n\n    /**\n     * Creates a clone of the chained sequence planting `value` as the wrapped value.\n     *\n     * @name plant\n     * @memberOf _\n     * @category Chain\n     * @returns {Object} Returns the new `lodash` wrapper instance.\n     * @example\n     *\n     * var array = [1, 2];\n     * var wrapped = _(array).map(function(value) {\n     *   return Math.pow(value, 2);\n     * });\n     *\n     * var other = [3, 4];\n     * var otherWrapped = wrapped.plant(other);\n     *\n     * otherWrapped.value();\n     * // => [9, 16]\n     *\n     * wrapped.value();\n     * // => [1, 4]\n     */\n    function wrapperPlant(value) {\n      var result,\n          parent = this;\n\n      while (parent instanceof baseLodash) {\n        var clone = wrapperClone(parent);\n        if (result) {\n          previous.__wrapped__ = clone;\n        } else {\n          result = clone;\n        }\n        var previous = clone;\n        parent = parent.__wrapped__;\n      }\n      previous.__wrapped__ = value;\n      return result;\n    }\n\n    /**\n     * Reverses the wrapped array so the first element becomes the last, the\n     * second element becomes the second to last, and so on.\n     *\n     * **Note:** This method mutates the wrapped array.\n     *\n     * @name reverse\n     * @memberOf _\n     * @category Chain\n     * @returns {Object} Returns the new reversed `lodash` wrapper instance.\n     * @example\n     *\n     * var array = [1, 2, 3];\n     *\n     * _(array).reverse().value()\n     * // => [3, 2, 1]\n     *\n     * console.log(array);\n     * // => [3, 2, 1]\n     */\n    function wrapperReverse() {\n      var value = this.__wrapped__;\n\n      var interceptor = function(value) {\n        return (wrapped && wrapped.__dir__ < 0) ? value : value.reverse();\n      };\n      if (value instanceof LazyWrapper) {\n        var wrapped = value;\n        if (this.__actions__.length) {\n          wrapped = new LazyWrapper(this);\n        }\n        wrapped = wrapped.reverse();\n        wrapped.__actions__.push({ 'func': thru, 'args': [interceptor], 'thisArg': undefined });\n        return new LodashWrapper(wrapped, this.__chain__);\n      }\n      return this.thru(interceptor);\n    }\n\n    /**\n     * Produces the result of coercing the unwrapped value to a string.\n     *\n     * @name toString\n     * @memberOf _\n     * @category Chain\n     * @returns {string} Returns the coerced string value.\n     * @example\n     *\n     * _([1, 2, 3]).toString();\n     * // => '1,2,3'\n     */\n    function wrapperToString() {\n      return (this.value() + '');\n    }\n\n    /**\n     * Executes the chained sequence to extract the unwrapped value.\n     *\n     * @name value\n     * @memberOf _\n     * @alias run, toJSON, valueOf\n     * @category Chain\n     * @returns {*} Returns the resolved unwrapped value.\n     * @example\n     *\n     * _([1, 2, 3]).value();\n     * // => [1, 2, 3]\n     */\n    function wrapperValue() {\n      return baseWrapperValue(this.__wrapped__, this.__actions__);\n    }\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Creates an array of elements corresponding to the given keys, or indexes,\n     * of `collection`. Keys may be specified as individual arguments or as arrays\n     * of keys.\n     *\n     * @static\n     * @memberOf _\n     * @category Collection\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {...(number|number[]|string|string[])} [props] The property names\n     *  or indexes of elements to pick, specified individually or in arrays.\n     * @returns {Array} Returns the new array of picked elements.\n     * @example\n     *\n     * _.at(['a', 'b', 'c'], [0, 2]);\n     * // => ['a', 'c']\n     *\n     * _.at(['barney', 'fred', 'pebbles'], 0, 2);\n     * // => ['barney', 'pebbles']\n     */\n    var at = restParam(function(collection, props) {\n      return baseAt(collection, baseFlatten(props));\n    });\n\n    /**\n     * Creates an object composed of keys generated from the results of running\n     * each element of `collection` through `iteratee`. The corresponding value\n     * of each key is the number of times the key was returned by `iteratee`.\n     * The `iteratee` is bound to `thisArg` and invoked with three arguments:\n     * (value, index|key, collection).\n     *\n     * If a property name is provided for `iteratee` the created `_.property`\n     * style callback returns the property value of the given element.\n     *\n     * If a value is also provided for `thisArg` the created `_.matchesProperty`\n     * style callback returns `true` for elements that have a matching property\n     * value, else `false`.\n     *\n     * If an object is provided for `iteratee` the created `_.matches` style\n     * callback returns `true` for elements that have the properties of the given\n     * object, else `false`.\n     *\n     * @static\n     * @memberOf _\n     * @category Collection\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {Function|Object|string} [iteratee=_.identity] The function invoked\n     *  per iteration.\n     * @param {*} [thisArg] The `this` binding of `iteratee`.\n     * @returns {Object} Returns the composed aggregate object.\n     * @example\n     *\n     * _.countBy([4.3, 6.1, 6.4], function(n) {\n     *   return Math.floor(n);\n     * });\n     * // => { '4': 1, '6': 2 }\n     *\n     * _.countBy([4.3, 6.1, 6.4], function(n) {\n     *   return this.floor(n);\n     * }, Math);\n     * // => { '4': 1, '6': 2 }\n     *\n     * _.countBy(['one', 'two', 'three'], 'length');\n     * // => { '3': 2, '5': 1 }\n     */\n    var countBy = createAggregator(function(result, value, key) {\n      hasOwnProperty.call(result, key) ? ++result[key] : (result[key] = 1);\n    });\n\n    /**\n     * Checks if `predicate` returns truthy for **all** elements of `collection`.\n     * The predicate is bound to `thisArg` and invoked with three arguments:\n     * (value, index|key, collection).\n     *\n     * If a property name is provided for `predicate` the created `_.property`\n     * style callback returns the property value of the given element.\n     *\n     * If a value is also provided for `thisArg` the created `_.matchesProperty`\n     * style callback returns `true` for elements that have a matching property\n     * value, else `false`.\n     *\n     * If an object is provided for `predicate` the created `_.matches` style\n     * callback returns `true` for elements that have the properties of the given\n     * object, else `false`.\n     *\n     * @static\n     * @memberOf _\n     * @alias all\n     * @category Collection\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {Function|Object|string} [predicate=_.identity] The function invoked\n     *  per iteration.\n     * @param {*} [thisArg] The `this` binding of `predicate`.\n     * @returns {boolean} Returns `true` if all elements pass the predicate check,\n     *  else `false`.\n     * @example\n     *\n     * _.every([true, 1, null, 'yes'], Boolean);\n     * // => false\n     *\n     * var users = [\n     *   { 'user': 'barney', 'active': false },\n     *   { 'user': 'fred',   'active': false }\n     * ];\n     *\n     * // using the `_.matches` callback shorthand\n     * _.every(users, { 'user': 'barney', 'active': false });\n     * // => false\n     *\n     * // using the `_.matchesProperty` callback shorthand\n     * _.every(users, 'active', false);\n     * // => true\n     *\n     * // using the `_.property` callback shorthand\n     * _.every(users, 'active');\n     * // => false\n     */\n    function every(collection, predicate, thisArg) {\n      var func = isArray(collection) ? arrayEvery : baseEvery;\n      if (thisArg && isIterateeCall(collection, predicate, thisArg)) {\n        predicate = undefined;\n      }\n      if (typeof predicate != 'function' || thisArg !== undefined) {\n        predicate = getCallback(predicate, thisArg, 3);\n      }\n      return func(collection, predicate);\n    }\n\n    /**\n     * Iterates over elements of `collection`, returning an array of all elements\n     * `predicate` returns truthy for. The predicate is bound to `thisArg` and\n     * invoked with three arguments: (value, index|key, collection).\n     *\n     * If a property name is provided for `predicate` the created `_.property`\n     * style callback returns the property value of the given element.\n     *\n     * If a value is also provided for `thisArg` the created `_.matchesProperty`\n     * style callback returns `true` for elements that have a matching property\n     * value, else `false`.\n     *\n     * If an object is provided for `predicate` the created `_.matches` style\n     * callback returns `true` for elements that have the properties of the given\n     * object, else `false`.\n     *\n     * @static\n     * @memberOf _\n     * @alias select\n     * @category Collection\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {Function|Object|string} [predicate=_.identity] The function invoked\n     *  per iteration.\n     * @param {*} [thisArg] The `this` binding of `predicate`.\n     * @returns {Array} Returns the new filtered array.\n     * @example\n     *\n     * _.filter([4, 5, 6], function(n) {\n     *   return n % 2 == 0;\n     * });\n     * // => [4, 6]\n     *\n     * var users = [\n     *   { 'user': 'barney', 'age': 36, 'active': true },\n     *   { 'user': 'fred',   'age': 40, 'active': false }\n     * ];\n     *\n     * // using the `_.matches` callback shorthand\n     * _.pluck(_.filter(users, { 'age': 36, 'active': true }), 'user');\n     * // => ['barney']\n     *\n     * // using the `_.matchesProperty` callback shorthand\n     * _.pluck(_.filter(users, 'active', false), 'user');\n     * // => ['fred']\n     *\n     * // using the `_.property` callback shorthand\n     * _.pluck(_.filter(users, 'active'), 'user');\n     * // => ['barney']\n     */\n    function filter(collection, predicate, thisArg) {\n      var func = isArray(collection) ? arrayFilter : baseFilter;\n      predicate = getCallback(predicate, thisArg, 3);\n      return func(collection, predicate);\n    }\n\n    /**\n     * Iterates over elements of `collection`, returning the first element\n     * `predicate` returns truthy for. The predicate is bound to `thisArg` and\n     * invoked with three arguments: (value, index|key, collection).\n     *\n     * If a property name is provided for `predicate` the created `_.property`\n     * style callback returns the property value of the given element.\n     *\n     * If a value is also provided for `thisArg` the created `_.matchesProperty`\n     * style callback returns `true` for elements that have a matching property\n     * value, else `false`.\n     *\n     * If an object is provided for `predicate` the created `_.matches` style\n     * callback returns `true` for elements that have the properties of the given\n     * object, else `false`.\n     *\n     * @static\n     * @memberOf _\n     * @alias detect\n     * @category Collection\n     * @param {Array|Object|string} collection The collection to search.\n     * @param {Function|Object|string} [predicate=_.identity] The function invoked\n     *  per iteration.\n     * @param {*} [thisArg] The `this` binding of `predicate`.\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     * _.result(_.find(users, function(chr) {\n     *   return chr.age < 40;\n     * }), 'user');\n     * // => 'barney'\n     *\n     * // using the `_.matches` callback shorthand\n     * _.result(_.find(users, { 'age': 1, 'active': true }), 'user');\n     * // => 'pebbles'\n     *\n     * // using the `_.matchesProperty` callback shorthand\n     * _.result(_.find(users, 'active', false), 'user');\n     * // => 'fred'\n     *\n     * // using the `_.property` callback shorthand\n     * _.result(_.find(users, 'active'), 'user');\n     * // => 'barney'\n     */\n    var find = createFind(baseEach);\n\n    /**\n     * This method is like `_.find` except that it iterates over elements of\n     * `collection` from right to left.\n     *\n     * @static\n     * @memberOf _\n     * @category Collection\n     * @param {Array|Object|string} collection The collection to search.\n     * @param {Function|Object|string} [predicate=_.identity] The function invoked\n     *  per iteration.\n     * @param {*} [thisArg] The `this` binding of `predicate`.\n     * @returns {*} Returns the matched element, else `undefined`.\n     * @example\n     *\n     * _.findLast([1, 2, 3, 4], function(n) {\n     *   return n % 2 == 1;\n     * });\n     * // => 3\n     */\n    var findLast = createFind(baseEachRight, true);\n\n    /**\n     * Performs a deep comparison between each element in `collection` and the\n     * source object, returning the first element that has equivalent property\n     * values.\n     *\n     * **Note:** This method supports comparing arrays, booleans, `Date` objects,\n     * numbers, `Object` objects, regexes, and strings. Objects are compared by\n     * their own, not inherited, enumerable properties. For comparing a single\n     * own or inherited property value see `_.matchesProperty`.\n     *\n     * @static\n     * @memberOf _\n     * @category Collection\n     * @param {Array|Object|string} collection The collection to search.\n     * @param {Object} source The object of property values to match.\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     * ];\n     *\n     * _.result(_.findWhere(users, { 'age': 36, 'active': true }), 'user');\n     * // => 'barney'\n     *\n     * _.result(_.findWhere(users, { 'age': 40, 'active': false }), 'user');\n     * // => 'fred'\n     */\n    function findWhere(collection, source) {\n      return find(collection, baseMatches(source));\n    }\n\n    /**\n     * Iterates over elements of `collection` invoking `iteratee` for each element.\n     * The `iteratee` is bound to `thisArg` and invoked with three arguments:\n     * (value, index|key, collection). Iteratee functions may exit iteration early\n     * by explicitly returning `false`.\n     *\n     * **Note:** As with other \"Collections\" methods, objects with a \"length\" property\n     * are iterated like arrays. To avoid this behavior `_.forIn` or `_.forOwn`\n     * may be used for object iteration.\n     *\n     * @static\n     * @memberOf _\n     * @alias each\n     * @category Collection\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @param {*} [thisArg] The `this` binding of `iteratee`.\n     * @returns {Array|Object|string} Returns `collection`.\n     * @example\n     *\n     * _([1, 2]).forEach(function(n) {\n     *   console.log(n);\n     * }).value();\n     * // => logs each value from left to right and returns the array\n     *\n     * _.forEach({ 'a': 1, 'b': 2 }, function(n, key) {\n     *   console.log(n, key);\n     * });\n     * // => logs each value-key pair and returns the object (iteration order is not guaranteed)\n     */\n    var forEach = createForEach(arrayEach, baseEach);\n\n    /**\n     * This method is like `_.forEach` except that it iterates over elements of\n     * `collection` from right to left.\n     *\n     * @static\n     * @memberOf _\n     * @alias eachRight\n     * @category Collection\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @param {*} [thisArg] The `this` binding of `iteratee`.\n     * @returns {Array|Object|string} Returns `collection`.\n     * @example\n     *\n     * _([1, 2]).forEachRight(function(n) {\n     *   console.log(n);\n     * }).value();\n     * // => logs each value from right to left and returns the array\n     */\n    var forEachRight = createForEach(arrayEachRight, baseEachRight);\n\n    /**\n     * Creates an object composed of keys generated from the results of running\n     * each element of `collection` through `iteratee`. The corresponding value\n     * of each key is an array of the elements responsible for generating the key.\n     * The `iteratee` is bound to `thisArg` and invoked with three arguments:\n     * (value, index|key, collection).\n     *\n     * If a property name is provided for `iteratee` the created `_.property`\n     * style callback returns the property value of the given element.\n     *\n     * If a value is also provided for `thisArg` the created `_.matchesProperty`\n     * style callback returns `true` for elements that have a matching property\n     * value, else `false`.\n     *\n     * If an object is provided for `iteratee` the created `_.matches` style\n     * callback returns `true` for elements that have the properties of the given\n     * object, else `false`.\n     *\n     * @static\n     * @memberOf _\n     * @category Collection\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {Function|Object|string} [iteratee=_.identity] The function invoked\n     *  per iteration.\n     * @param {*} [thisArg] The `this` binding of `iteratee`.\n     * @returns {Object} Returns the composed aggregate object.\n     * @example\n     *\n     * _.groupBy([4.2, 6.1, 6.4], function(n) {\n     *   return Math.floor(n);\n     * });\n     * // => { '4': [4.2], '6': [6.1, 6.4] }\n     *\n     * _.groupBy([4.2, 6.1, 6.4], function(n) {\n     *   return this.floor(n);\n     * }, Math);\n     * // => { '4': [4.2], '6': [6.1, 6.4] }\n     *\n     * // using the `_.property` callback shorthand\n     * _.groupBy(['one', 'two', 'three'], 'length');\n     * // => { '3': ['one', 'two'], '5': ['three'] }\n     */\n    var groupBy = createAggregator(function(result, value, key) {\n      if (hasOwnProperty.call(result, key)) {\n        result[key].push(value);\n      } else {\n        result[key] = [value];\n      }\n    });\n\n    /**\n     * Checks if `value` is in `collection` using\n     * [`SameValueZero`](http://ecma-international.org/ecma-262/6.0/#sec-samevaluezero)\n     * for equality comparisons. If `fromIndex` is negative, it is used as the offset\n     * from the end of `collection`.\n     *\n     * @static\n     * @memberOf _\n     * @alias contains, include\n     * @category Collection\n     * @param {Array|Object|string} collection The collection to search.\n     * @param {*} target The value to search for.\n     * @param {number} [fromIndex=0] The index to search from.\n     * @param- {Object} [guard] Enables use as a callback for functions like `_.reduce`.\n     * @returns {boolean} Returns `true` if a matching element is found, else `false`.\n     * @example\n     *\n     * _.includes([1, 2, 3], 1);\n     * // => true\n     *\n     * _.includes([1, 2, 3], 1, 2);\n     * // => false\n     *\n     * _.includes({ 'user': 'fred', 'age': 40 }, 'fred');\n     * // => true\n     *\n     * _.includes('pebbles', 'eb');\n     * // => true\n     */\n    function includes(collection, target, fromIndex, guard) {\n      var length = collection ? getLength(collection) : 0;\n      if (!isLength(length)) {\n        collection = values(collection);\n        length = collection.length;\n      }\n      if (typeof fromIndex != 'number' || (guard && isIterateeCall(target, fromIndex, guard))) {\n        fromIndex = 0;\n      } else {\n        fromIndex = fromIndex < 0 ? nativeMax(length + fromIndex, 0) : (fromIndex || 0);\n      }\n      return (typeof collection == 'string' || !isArray(collection) && isString(collection))\n        ? (fromIndex <= length && collection.indexOf(target, fromIndex) > -1)\n        : (!!length && getIndexOf(collection, target, fromIndex) > -1);\n    }\n\n    /**\n     * Creates an object composed of keys generated from the results of running\n     * each element of `collection` through `iteratee`. The corresponding value\n     * of each key is the last element responsible for generating the key. The\n     * iteratee function is bound to `thisArg` and invoked with three arguments:\n     * (value, index|key, collection).\n     *\n     * If a property name is provided for `iteratee` the created `_.property`\n     * style callback returns the property value of the given element.\n     *\n     * If a value is also provided for `thisArg` the created `_.matchesProperty`\n     * style callback returns `true` for elements that have a matching property\n     * value, else `false`.\n     *\n     * If an object is provided for `iteratee` the created `_.matches` style\n     * callback returns `true` for elements that have the properties of the given\n     * object, else `false`.\n     *\n     * @static\n     * @memberOf _\n     * @category Collection\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {Function|Object|string} [iteratee=_.identity] The function invoked\n     *  per iteration.\n     * @param {*} [thisArg] The `this` binding of `iteratee`.\n     * @returns {Object} Returns the composed aggregate object.\n     * @example\n     *\n     * var keyData = [\n     *   { 'dir': 'left', 'code': 97 },\n     *   { 'dir': 'right', 'code': 100 }\n     * ];\n     *\n     * _.indexBy(keyData, 'dir');\n     * // => { 'left': { 'dir': 'left', 'code': 97 }, 'right': { 'dir': 'right', 'code': 100 } }\n     *\n     * _.indexBy(keyData, function(object) {\n     *   return String.fromCharCode(object.code);\n     * });\n     * // => { 'a': { 'dir': 'left', 'code': 97 }, 'd': { 'dir': 'right', 'code': 100 } }\n     *\n     * _.indexBy(keyData, function(object) {\n     *   return this.fromCharCode(object.code);\n     * }, String);\n     * // => { 'a': { 'dir': 'left', 'code': 97 }, 'd': { 'dir': 'right', 'code': 100 } }\n     */\n    var indexBy = createAggregator(function(result, value, key) {\n      result[key] = value;\n    });\n\n    /**\n     * Invokes the method at `path` of each element in `collection`, returning\n     * an array of the results of each invoked method. Any additional arguments\n     * are provided to each invoked method. If `methodName` is a function it is\n     * invoked for, and `this` bound to, each element in `collection`.\n     *\n     * @static\n     * @memberOf _\n     * @category Collection\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {Array|Function|string} path The path of the method to invoke or\n     *  the function invoked per iteration.\n     * @param {...*} [args] The arguments to invoke the method with.\n     * @returns {Array} Returns the array of results.\n     * @example\n     *\n     * _.invoke([[5, 1, 7], [3, 2, 1]], 'sort');\n     * // => [[1, 5, 7], [1, 2, 3]]\n     *\n     * _.invoke([123, 456], String.prototype.split, '');\n     * // => [['1', '2', '3'], ['4', '5', '6']]\n     */\n    var invoke = restParam(function(collection, path, args) {\n      var index = -1,\n          isFunc = typeof path == 'function',\n          isProp = isKey(path),\n          result = isArrayLike(collection) ? Array(collection.length) : [];\n\n      baseEach(collection, function(value) {\n        var func = isFunc ? path : ((isProp && value != null) ? value[path] : undefined);\n        result[++index] = func ? func.apply(value, args) : invokePath(value, path, args);\n      });\n      return result;\n    });\n\n    /**\n     * Creates an array of values by running each element in `collection` through\n     * `iteratee`. The `iteratee` is bound to `thisArg` and invoked with three\n     * arguments: (value, index|key, collection).\n     *\n     * If a property name is provided for `iteratee` the created `_.property`\n     * style callback returns the property value of the given element.\n     *\n     * If a value is also provided for `thisArg` the created `_.matchesProperty`\n     * style callback returns `true` for elements that have a matching property\n     * value, else `false`.\n     *\n     * If an object is provided for `iteratee` the created `_.matches` style\n     * callback returns `true` for elements that have the properties of the given\n     * object, else `false`.\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`, `callback`, `chunk`, `clone`, `create`, `curry`, `curryRight`,\n     * `drop`, `dropRight`, `every`, `fill`, `flatten`, `invert`, `max`, `min`,\n     * `parseInt`, `slice`, `sortBy`, `take`, `takeRight`, `template`, `trim`,\n     * `trimLeft`, `trimRight`, `trunc`, `random`, `range`, `sample`, `some`,\n     * `sum`, `uniq`, and `words`\n     *\n     * @static\n     * @memberOf _\n     * @alias collect\n     * @category Collection\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {Function|Object|string} [iteratee=_.identity] The function invoked\n     *  per iteration.\n     * @param {*} [thisArg] The `this` binding of `iteratee`.\n     * @returns {Array} Returns the new mapped array.\n     * @example\n     *\n     * function timesThree(n) {\n     *   return n * 3;\n     * }\n     *\n     * _.map([1, 2], timesThree);\n     * // => [3, 6]\n     *\n     * _.map({ 'a': 1, 'b': 2 }, timesThree);\n     * // => [3, 6] (iteration order is not guaranteed)\n     *\n     * var users = [\n     *   { 'user': 'barney' },\n     *   { 'user': 'fred' }\n     * ];\n     *\n     * // using the `_.property` callback shorthand\n     * _.map(users, 'user');\n     * // => ['barney', 'fred']\n     */\n    function map(collection, iteratee, thisArg) {\n      var func = isArray(collection) ? arrayMap : baseMap;\n      iteratee = getCallback(iteratee, thisArg, 3);\n      return func(collection, iteratee);\n    }\n\n    /**\n     * Creates an array of elements split into two groups, the first of which\n     * contains elements `predicate` returns truthy for, while the second of which\n     * contains elements `predicate` returns falsey for. The predicate is bound\n     * to `thisArg` and invoked with three arguments: (value, index|key, collection).\n     *\n     * If a property name is provided for `predicate` the created `_.property`\n     * style callback returns the property value of the given element.\n     *\n     * If a value is also provided for `thisArg` the created `_.matchesProperty`\n     * style callback returns `true` for elements that have a matching property\n     * value, else `false`.\n     *\n     * If an object is provided for `predicate` the created `_.matches` style\n     * callback returns `true` for elements that have the properties of the given\n     * object, else `false`.\n     *\n     * @static\n     * @memberOf _\n     * @category Collection\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {Function|Object|string} [predicate=_.identity] The function invoked\n     *  per iteration.\n     * @param {*} [thisArg] The `this` binding of `predicate`.\n     * @returns {Array} Returns the array of grouped elements.\n     * @example\n     *\n     * _.partition([1, 2, 3], function(n) {\n     *   return n % 2;\n     * });\n     * // => [[1, 3], [2]]\n     *\n     * _.partition([1.2, 2.3, 3.4], function(n) {\n     *   return this.floor(n) % 2;\n     * }, Math);\n     * // => [[1.2, 3.4], [2.3]]\n     *\n     * var users = [\n     *   { 'user': 'barney',  'age': 36, 'active': false },\n     *   { 'user': 'fred',    'age': 40, 'active': true },\n     *   { 'user': 'pebbles', 'age': 1,  'active': false }\n     * ];\n     *\n     * var mapper = function(array) {\n     *   return _.pluck(array, 'user');\n     * };\n     *\n     * // using the `_.matches` callback shorthand\n     * _.map(_.partition(users, { 'age': 1, 'active': false }), mapper);\n     * // => [['pebbles'], ['barney', 'fred']]\n     *\n     * // using the `_.matchesProperty` callback shorthand\n     * _.map(_.partition(users, 'active', false), mapper);\n     * // => [['barney', 'pebbles'], ['fred']]\n     *\n     * // using the `_.property` callback shorthand\n     * _.map(_.partition(users, 'active'), mapper);\n     * // => [['fred'], ['barney', 'pebbles']]\n     */\n    var partition = createAggregator(function(result, value, key) {\n      result[key ? 0 : 1].push(value);\n    }, function() { return [[], []]; });\n\n    /**\n     * Gets the property value of `path` from all elements in `collection`.\n     *\n     * @static\n     * @memberOf _\n     * @category Collection\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {Array|string} path The path of the property to pluck.\n     * @returns {Array} Returns the property values.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney', 'age': 36 },\n     *   { 'user': 'fred',   'age': 40 }\n     * ];\n     *\n     * _.pluck(users, 'user');\n     * // => ['barney', 'fred']\n     *\n     * var userIndex = _.indexBy(users, 'user');\n     * _.pluck(userIndex, 'age');\n     * // => [36, 40] (iteration order is not guaranteed)\n     */\n    function pluck(collection, path) {\n      return map(collection, property(path));\n    }\n\n    /**\n     * Reduces `collection` to a value which is the accumulated result of running\n     * each element in `collection` through `iteratee`, where each successive\n     * invocation is supplied the return value of the previous. If `accumulator`\n     * is not provided the first element of `collection` is used as the initial\n     * value. The `iteratee` is bound to `thisArg` and invoked with four arguments:\n     * (accumulator, value, index|key, collection).\n     *\n     * Many lodash methods are guarded to work as iteratees for methods like\n     * `_.reduce`, `_.reduceRight`, and `_.transform`.\n     *\n     * The guarded methods are:\n     * `assign`, `defaults`, `defaultsDeep`, `includes`, `merge`, `sortByAll`,\n     * and `sortByOrder`\n     *\n     * @static\n     * @memberOf _\n     * @alias foldl, inject\n     * @category Collection\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @param {*} [accumulator] The initial value.\n     * @param {*} [thisArg] The `this` binding of `iteratee`.\n     * @returns {*} Returns the accumulated value.\n     * @example\n     *\n     * _.reduce([1, 2], function(total, n) {\n     *   return total + n;\n     * });\n     * // => 3\n     *\n     * _.reduce({ 'a': 1, 'b': 2 }, function(result, n, key) {\n     *   result[key] = n * 3;\n     *   return result;\n     * }, {});\n     * // => { 'a': 3, 'b': 6 } (iteration order is not guaranteed)\n     */\n    var reduce = createReduce(arrayReduce, baseEach);\n\n    /**\n     * This method is like `_.reduce` except that it iterates over elements of\n     * `collection` from right to left.\n     *\n     * @static\n     * @memberOf _\n     * @alias foldr\n     * @category Collection\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @param {*} [accumulator] The initial value.\n     * @param {*} [thisArg] The `this` binding of `iteratee`.\n     * @returns {*} Returns the accumulated value.\n     * @example\n     *\n     * var array = [[0, 1], [2, 3], [4, 5]];\n     *\n     * _.reduceRight(array, function(flattened, other) {\n     *   return flattened.concat(other);\n     * }, []);\n     * // => [4, 5, 2, 3, 0, 1]\n     */\n    var reduceRight = createReduce(arrayReduceRight, baseEachRight);\n\n    /**\n     * The opposite of `_.filter`; this method returns the elements of `collection`\n     * that `predicate` does **not** return truthy for.\n     *\n     * @static\n     * @memberOf _\n     * @category Collection\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {Function|Object|string} [predicate=_.identity] The function invoked\n     *  per iteration.\n     * @param {*} [thisArg] The `this` binding of `predicate`.\n     * @returns {Array} Returns the new filtered array.\n     * @example\n     *\n     * _.reject([1, 2, 3, 4], function(n) {\n     *   return n % 2 == 0;\n     * });\n     * // => [1, 3]\n     *\n     * var users = [\n     *   { 'user': 'barney', 'age': 36, 'active': false },\n     *   { 'user': 'fred',   'age': 40, 'active': true }\n     * ];\n     *\n     * // using the `_.matches` callback shorthand\n     * _.pluck(_.reject(users, { 'age': 40, 'active': true }), 'user');\n     * // => ['barney']\n     *\n     * // using the `_.matchesProperty` callback shorthand\n     * _.pluck(_.reject(users, 'active', false), 'user');\n     * // => ['fred']\n     *\n     * // using the `_.property` callback shorthand\n     * _.pluck(_.reject(users, 'active'), 'user');\n     * // => ['barney']\n     */\n    function reject(collection, predicate, thisArg) {\n      var func = isArray(collection) ? arrayFilter : baseFilter;\n      predicate = getCallback(predicate, thisArg, 3);\n      return func(collection, function(value, index, collection) {\n        return !predicate(value, index, collection);\n      });\n    }\n\n    /**\n     * Gets a random element or `n` random elements from a collection.\n     *\n     * @static\n     * @memberOf _\n     * @category Collection\n     * @param {Array|Object|string} collection The collection to sample.\n     * @param {number} [n] The number of elements to sample.\n     * @param- {Object} [guard] Enables use as a callback for functions like `_.map`.\n     * @returns {*} Returns the random sample(s).\n     * @example\n     *\n     * _.sample([1, 2, 3, 4]);\n     * // => 2\n     *\n     * _.sample([1, 2, 3, 4], 2);\n     * // => [3, 1]\n     */\n    function sample(collection, n, guard) {\n      if (guard ? isIterateeCall(collection, n, guard) : n == null) {\n        collection = toIterable(collection);\n        var length = collection.length;\n        return length > 0 ? collection[baseRandom(0, length - 1)] : undefined;\n      }\n      var index = -1,\n          result = toArray(collection),\n          length = result.length,\n          lastIndex = length - 1;\n\n      n = nativeMin(n < 0 ? 0 : (+n || 0), length);\n      while (++index < n) {\n        var rand = baseRandom(index, lastIndex),\n            value = result[rand];\n\n        result[rand] = result[index];\n        result[index] = value;\n      }\n      result.length = n;\n      return result;\n    }\n\n    /**\n     * Creates an array of shuffled values, using a version of the\n     * [Fisher-Yates shuffle](https://en.wikipedia.org/wiki/Fisher-Yates_shuffle).\n     *\n     * @static\n     * @memberOf _\n     * @category Collection\n     * @param {Array|Object|string} collection The collection to shuffle.\n     * @returns {Array} Returns the new shuffled array.\n     * @example\n     *\n     * _.shuffle([1, 2, 3, 4]);\n     * // => [4, 1, 3, 2]\n     */\n    function shuffle(collection) {\n      return sample(collection, POSITIVE_INFINITY);\n    }\n\n    /**\n     * Gets the size of `collection` by returning its length for array-like\n     * values or the number of own enumerable properties for objects.\n     *\n     * @static\n     * @memberOf _\n     * @category Collection\n     * @param {Array|Object|string} collection The collection to inspect.\n     * @returns {number} Returns the size of `collection`.\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     */\n    function size(collection) {\n      var length = collection ? getLength(collection) : 0;\n      return isLength(length) ? length : keys(collection).length;\n    }\n\n    /**\n     * Checks if `predicate` returns truthy for **any** element of `collection`.\n     * The function returns as soon as it finds a passing value and does not iterate\n     * over the entire collection. The predicate is bound to `thisArg` and invoked\n     * with three arguments: (value, index|key, collection).\n     *\n     * If a property name is provided for `predicate` the created `_.property`\n     * style callback returns the property value of the given element.\n     *\n     * If a value is also provided for `thisArg` the created `_.matchesProperty`\n     * style callback returns `true` for elements that have a matching property\n     * value, else `false`.\n     *\n     * If an object is provided for `predicate` the created `_.matches` style\n     * callback returns `true` for elements that have the properties of the given\n     * object, else `false`.\n     *\n     * @static\n     * @memberOf _\n     * @alias any\n     * @category Collection\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {Function|Object|string} [predicate=_.identity] The function invoked\n     *  per iteration.\n     * @param {*} [thisArg] The `this` binding of `predicate`.\n     * @returns {boolean} Returns `true` if any element passes the predicate check,\n     *  else `false`.\n     * @example\n     *\n     * _.some([null, 0, 'yes', false], Boolean);\n     * // => true\n     *\n     * var users = [\n     *   { 'user': 'barney', 'active': true },\n     *   { 'user': 'fred',   'active': false }\n     * ];\n     *\n     * // using the `_.matches` callback shorthand\n     * _.some(users, { 'user': 'barney', 'active': false });\n     * // => false\n     *\n     * // using the `_.matchesProperty` callback shorthand\n     * _.some(users, 'active', false);\n     * // => true\n     *\n     * // using the `_.property` callback shorthand\n     * _.some(users, 'active');\n     * // => true\n     */\n    function some(collection, predicate, thisArg) {\n      var func = isArray(collection) ? arraySome : baseSome;\n      if (thisArg && isIterateeCall(collection, predicate, thisArg)) {\n        predicate = undefined;\n      }\n      if (typeof predicate != 'function' || thisArg !== undefined) {\n        predicate = getCallback(predicate, thisArg, 3);\n      }\n      return func(collection, predicate);\n    }\n\n    /**\n     * Creates an array of elements, sorted in ascending order by the results of\n     * running each element in a collection through `iteratee`. This method performs\n     * a stable sort, that is, it preserves the original sort order of equal elements.\n     * The `iteratee` is bound to `thisArg` and invoked with three arguments:\n     * (value, index|key, collection).\n     *\n     * If a property name is provided for `iteratee` the created `_.property`\n     * style callback returns the property value of the given element.\n     *\n     * If a value is also provided for `thisArg` the created `_.matchesProperty`\n     * style callback returns `true` for elements that have a matching property\n     * value, else `false`.\n     *\n     * If an object is provided for `iteratee` the created `_.matches` style\n     * callback returns `true` for elements that have the properties of the given\n     * object, else `false`.\n     *\n     * @static\n     * @memberOf _\n     * @category Collection\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {Function|Object|string} [iteratee=_.identity] The function invoked\n     *  per iteration.\n     * @param {*} [thisArg] The `this` binding of `iteratee`.\n     * @returns {Array} Returns the new sorted array.\n     * @example\n     *\n     * _.sortBy([1, 2, 3], function(n) {\n     *   return Math.sin(n);\n     * });\n     * // => [3, 1, 2]\n     *\n     * _.sortBy([1, 2, 3], function(n) {\n     *   return this.sin(n);\n     * }, Math);\n     * // => [3, 1, 2]\n     *\n     * var users = [\n     *   { 'user': 'fred' },\n     *   { 'user': 'pebbles' },\n     *   { 'user': 'barney' }\n     * ];\n     *\n     * // using the `_.property` callback shorthand\n     * _.pluck(_.sortBy(users, 'user'), 'user');\n     * // => ['barney', 'fred', 'pebbles']\n     */\n    function sortBy(collection, iteratee, thisArg) {\n      if (collection == null) {\n        return [];\n      }\n      if (thisArg && isIterateeCall(collection, iteratee, thisArg)) {\n        iteratee = undefined;\n      }\n      var index = -1;\n      iteratee = getCallback(iteratee, thisArg, 3);\n\n      var result = baseMap(collection, function(value, key, collection) {\n        return { 'criteria': iteratee(value, key, collection), 'index': ++index, 'value': value };\n      });\n      return baseSortBy(result, compareAscending);\n    }\n\n    /**\n     * This method is like `_.sortBy` except that it can sort by multiple iteratees\n     * or property names.\n     *\n     * If a property name is provided for an iteratee the created `_.property`\n     * style callback returns the property value of the given element.\n     *\n     * If an object is provided for an iteratee the created `_.matches` style\n     * callback returns `true` for elements that have the properties of the given\n     * object, else `false`.\n     *\n     * @static\n     * @memberOf _\n     * @category Collection\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {...(Function|Function[]|Object|Object[]|string|string[])} iteratees\n     *  The iteratees to sort by, specified as individual values or arrays of values.\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': 42 },\n     *   { 'user': 'barney', 'age': 34 }\n     * ];\n     *\n     * _.map(_.sortByAll(users, ['user', 'age']), _.values);\n     * // => [['barney', 34], ['barney', 36], ['fred', 42], ['fred', 48]]\n     *\n     * _.map(_.sortByAll(users, 'user', function(chr) {\n     *   return Math.floor(chr.age / 10);\n     * }), _.values);\n     * // => [['barney', 36], ['barney', 34], ['fred', 48], ['fred', 42]]\n     */\n    var sortByAll = restParam(function(collection, iteratees) {\n      if (collection == null) {\n        return [];\n      }\n      var guard = iteratees[2];\n      if (guard && isIterateeCall(iteratees[0], iteratees[1], guard)) {\n        iteratees.length = 1;\n      }\n      return baseSortByOrder(collection, baseFlatten(iteratees), []);\n    });\n\n    /**\n     * This method is like `_.sortByAll` except that it allows specifying the\n     * sort orders of the iteratees to sort by. If `orders` is unspecified, all\n     * values are sorted in ascending order. Otherwise, a value is sorted in\n     * ascending order if its corresponding order is \"asc\", and descending if \"desc\".\n     *\n     * If a property name is provided for an iteratee the created `_.property`\n     * style callback returns the property value of the given element.\n     *\n     * If an object is provided for an iteratee the created `_.matches` style\n     * callback returns `true` for elements that have the properties of the given\n     * object, else `false`.\n     *\n     * @static\n     * @memberOf _\n     * @category Collection\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {Function[]|Object[]|string[]} iteratees The iteratees to sort by.\n     * @param {boolean[]} [orders] The sort orders of `iteratees`.\n     * @param- {Object} [guard] Enables use as a callback for functions 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': 42 },\n     *   { 'user': 'barney', 'age': 36 }\n     * ];\n     *\n     * // sort by `user` in ascending order and by `age` in descending order\n     * _.map(_.sortByOrder(users, ['user', 'age'], ['asc', 'desc']), _.values);\n     * // => [['barney', 36], ['barney', 34], ['fred', 48], ['fred', 42]]\n     */\n    function sortByOrder(collection, iteratees, orders, guard) {\n      if (collection == null) {\n        return [];\n      }\n      if (guard && isIterateeCall(iteratees, orders, guard)) {\n        orders = undefined;\n      }\n      if (!isArray(iteratees)) {\n        iteratees = iteratees == null ? [] : [iteratees];\n      }\n      if (!isArray(orders)) {\n        orders = orders == null ? [] : [orders];\n      }\n      return baseSortByOrder(collection, iteratees, orders);\n    }\n\n    /**\n     * Performs a deep comparison between each element in `collection` and the\n     * source object, returning an array of all elements that have equivalent\n     * property values.\n     *\n     * **Note:** This method supports comparing arrays, booleans, `Date` objects,\n     * numbers, `Object` objects, regexes, and strings. Objects are compared by\n     * their own, not inherited, enumerable properties. For comparing a single\n     * own or inherited property value see `_.matchesProperty`.\n     *\n     * @static\n     * @memberOf _\n     * @category Collection\n     * @param {Array|Object|string} collection The collection to search.\n     * @param {Object} source The object of property values to match.\n     * @returns {Array} Returns the new filtered array.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney', 'age': 36, 'active': false, 'pets': ['hoppy'] },\n     *   { 'user': 'fred',   'age': 40, 'active': true, 'pets': ['baby puss', 'dino'] }\n     * ];\n     *\n     * _.pluck(_.where(users, { 'age': 36, 'active': false }), 'user');\n     * // => ['barney']\n     *\n     * _.pluck(_.where(users, { 'pets': ['dino'] }), 'user');\n     * // => ['fred']\n     */\n    function where(collection, source) {\n      return filter(collection, baseMatches(source));\n    }\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Gets the number of milliseconds that have elapsed since the Unix epoch\n     * (1 January 1970 00:00:00 UTC).\n     *\n     * @static\n     * @memberOf _\n     * @category Date\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 function to be invoked\n     */\n    var now = nativeNow || function() {\n      return new Date().getTime();\n    };\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * The opposite of `_.before`; this method creates a function that invokes\n     * `func` once it is called `n` or more times.\n     *\n     * @static\n     * @memberOf _\n     * @category Function\n     * @param {number} n The number of calls before `func` is invoked.\n     * @param {Function} func The function to restrict.\n     * @returns {Function} Returns the new restricted function.\n     * @example\n     *\n     * var saves = ['profile', 'settings'];\n     *\n     * var done = _.after(saves.length, function() {\n     *   console.log('done saving!');\n     * });\n     *\n     * _.forEach(saves, function(type) {\n     *   asyncSave({ 'type': type, 'complete': done });\n     * });\n     * // => logs 'done saving!' after the two async saves have completed\n     */\n    function after(n, func) {\n      if (typeof func != 'function') {\n        if (typeof n == 'function') {\n          var temp = n;\n          n = func;\n          func = temp;\n        } else {\n          throw new TypeError(FUNC_ERROR_TEXT);\n        }\n      }\n      n = nativeIsFinite(n = +n) ? n : 0;\n      return function() {\n        if (--n < 1) {\n          return func.apply(this, arguments);\n        }\n      };\n    }\n\n    /**\n     * Creates a function that accepts up to `n` arguments ignoring any\n     * additional arguments.\n     *\n     * @static\n     * @memberOf _\n     * @category Function\n     * @param {Function} func The function to cap arguments for.\n     * @param {number} [n=func.length] The arity cap.\n     * @param- {Object} [guard] Enables use as a callback for functions like `_.map`.\n     * @returns {Function} Returns the new function.\n     * @example\n     *\n     * _.map(['6', '8', '10'], _.ary(parseInt, 1));\n     * // => [6, 8, 10]\n     */\n    function ary(func, n, guard) {\n      if (guard && isIterateeCall(func, n, guard)) {\n        n = undefined;\n      }\n      n = (func && n == null) ? func.length : nativeMax(+n || 0, 0);\n      return createWrapper(func, ARY_FLAG, undefined, undefined, undefined, undefined, n);\n    }\n\n    /**\n     * Creates a function that invokes `func`, with the `this` binding and arguments\n     * of the created function, while it is called less than `n` times. Subsequent\n     * calls to the created function return the result of the last `func` invocation.\n     *\n     * @static\n     * @memberOf _\n     * @category Function\n     * @param {number} n The number of calls at which `func` is no longer invoked.\n     * @param {Function} func The function to restrict.\n     * @returns {Function} Returns the new restricted function.\n     * @example\n     *\n     * jQuery('#add').on('click', _.before(5, addContactToList));\n     * // => allows adding up to 4 contacts to the list\n     */\n    function before(n, func) {\n      var result;\n      if (typeof func != 'function') {\n        if (typeof n == 'function') {\n          var temp = n;\n          n = func;\n          func = temp;\n        } else {\n          throw new TypeError(FUNC_ERROR_TEXT);\n        }\n      }\n      return function() {\n        if (--n > 0) {\n          result = func.apply(this, arguments);\n        }\n        if (n <= 1) {\n          func = undefined;\n        }\n        return result;\n      };\n    }\n\n    /**\n     * Creates a function that invokes `func` with the `this` binding of `thisArg`\n     * and prepends any additional `_.bind` arguments to those provided to the\n     * bound function.\n     *\n     * The `_.bind.placeholder` value, which defaults to `_` in monolithic builds,\n     * may be used as a placeholder for partially applied arguments.\n     *\n     * **Note:** Unlike native `Function#bind` this method does not set the \"length\"\n     * property of bound functions.\n     *\n     * @static\n     * @memberOf _\n     * @category Function\n     * @param {Function} func The function to bind.\n     * @param {*} thisArg The `this` binding of `func`.\n     * @param {...*} [partials] The arguments to be partially applied.\n     * @returns {Function} Returns the new bound function.\n     * @example\n     *\n     * var greet = function(greeting, punctuation) {\n     *   return greeting + ' ' + this.user + punctuation;\n     * };\n     *\n     * var object = { 'user': 'fred' };\n     *\n     * var bound = _.bind(greet, object, 'hi');\n     * bound('!');\n     * // => 'hi fred!'\n     *\n     * // using placeholders\n     * var bound = _.bind(greet, object, _, '!');\n     * bound('hi');\n     * // => 'hi fred!'\n     */\n    var bind = restParam(function(func, thisArg, partials) {\n      var bitmask = BIND_FLAG;\n      if (partials.length) {\n        var holders = replaceHolders(partials, bind.placeholder);\n        bitmask |= PARTIAL_FLAG;\n      }\n      return createWrapper(func, bitmask, thisArg, partials, holders);\n    });\n\n    /**\n     * Binds methods of an object to the object itself, overwriting the existing\n     * method. Method names may be specified as individual arguments or as arrays\n     * of method names. If no method names are provided all enumerable function\n     * properties, own and inherited, of `object` are bound.\n     *\n     * **Note:** This method does not set the \"length\" property of bound functions.\n     *\n     * @static\n     * @memberOf _\n     * @category Function\n     * @param {Object} object The object to bind and assign the bound methods to.\n     * @param {...(string|string[])} [methodNames] The object method names to bind,\n     *  specified as individual method names or arrays of method names.\n     * @returns {Object} Returns `object`.\n     * @example\n     *\n     * var view = {\n     *   'label': 'docs',\n     *   'onClick': function() {\n     *     console.log('clicked ' + this.label);\n     *   }\n     * };\n     *\n     * _.bindAll(view);\n     * jQuery('#docs').on('click', view.onClick);\n     * // => logs 'clicked docs' when the element is clicked\n     */\n    var bindAll = restParam(function(object, methodNames) {\n      methodNames = methodNames.length ? baseFlatten(methodNames) : functions(object);\n\n      var index = -1,\n          length = methodNames.length;\n\n      while (++index < length) {\n        var key = methodNames[index];\n        object[key] = createWrapper(object[key], BIND_FLAG, object);\n      }\n      return object;\n    });\n\n    /**\n     * Creates a function that invokes the method at `object[key]` and prepends\n     * any additional `_.bindKey` arguments to those provided to the bound function.\n     *\n     * This method differs from `_.bind` by allowing bound functions to reference\n     * methods that may be redefined or don't yet exist.\n     * See [Peter Michaux's article](http://peter.michaux.ca/articles/lazy-function-definition-pattern)\n     * for more details.\n     *\n     * The `_.bindKey.placeholder` value, which defaults to `_` in monolithic\n     * builds, may be used as a placeholder for partially applied arguments.\n     *\n     * @static\n     * @memberOf _\n     * @category Function\n     * @param {Object} object The object the method belongs to.\n     * @param {string} key The key of the method.\n     * @param {...*} [partials] The arguments to be partially applied.\n     * @returns {Function} Returns the new bound function.\n     * @example\n     *\n     * var object = {\n     *   'user': 'fred',\n     *   'greet': function(greeting, punctuation) {\n     *     return greeting + ' ' + this.user + punctuation;\n     *   }\n     * };\n     *\n     * var bound = _.bindKey(object, 'greet', 'hi');\n     * bound('!');\n     * // => 'hi fred!'\n     *\n     * object.greet = function(greeting, punctuation) {\n     *   return greeting + 'ya ' + this.user + punctuation;\n     * };\n     *\n     * bound('!');\n     * // => 'hiya fred!'\n     *\n     * // using placeholders\n     * var bound = _.bindKey(object, 'greet', _, '!');\n     * bound('hi');\n     * // => 'hiya fred!'\n     */\n    var bindKey = restParam(function(object, key, partials) {\n      var bitmask = BIND_FLAG | BIND_KEY_FLAG;\n      if (partials.length) {\n        var holders = replaceHolders(partials, bindKey.placeholder);\n        bitmask |= PARTIAL_FLAG;\n      }\n      return createWrapper(key, bitmask, object, partials, holders);\n    });\n\n    /**\n     * Creates a function that accepts one or more arguments of `func` that when\n     * called either invokes `func` returning its result, if all `func` arguments\n     * have been provided, or returns a function that accepts one or more of the\n     * remaining `func` arguments, and so on. The arity of `func` may be specified\n     * if `func.length` is not sufficient.\n     *\n     * The `_.curry.placeholder` value, which defaults to `_` in monolithic builds,\n     * may be used as a placeholder for provided arguments.\n     *\n     * **Note:** This method does not set the \"length\" property of curried functions.\n     *\n     * @static\n     * @memberOf _\n     * @category Function\n     * @param {Function} func The function to curry.\n     * @param {number} [arity=func.length] The arity of `func`.\n     * @param- {Object} [guard] Enables use as a callback for functions like `_.map`.\n     * @returns {Function} Returns the new curried function.\n     * @example\n     *\n     * var abc = function(a, b, c) {\n     *   return [a, b, c];\n     * };\n     *\n     * var curried = _.curry(abc);\n     *\n     * curried(1)(2)(3);\n     * // => [1, 2, 3]\n     *\n     * curried(1, 2)(3);\n     * // => [1, 2, 3]\n     *\n     * curried(1, 2, 3);\n     * // => [1, 2, 3]\n     *\n     * // using placeholders\n     * curried(1)(_, 3)(2);\n     * // => [1, 2, 3]\n     */\n    var curry = createCurry(CURRY_FLAG);\n\n    /**\n     * This method is like `_.curry` except that arguments are applied to `func`\n     * in the manner of `_.partialRight` instead of `_.partial`.\n     *\n     * The `_.curryRight.placeholder` value, which defaults to `_` in monolithic\n     * builds, may be used as a placeholder for provided arguments.\n     *\n     * **Note:** This method does not set the \"length\" property of curried functions.\n     *\n     * @static\n     * @memberOf _\n     * @category Function\n     * @param {Function} func The function to curry.\n     * @param {number} [arity=func.length] The arity of `func`.\n     * @param- {Object} [guard] Enables use as a callback for functions like `_.map`.\n     * @returns {Function} Returns the new curried function.\n     * @example\n     *\n     * var abc = function(a, b, c) {\n     *   return [a, b, c];\n     * };\n     *\n     * var curried = _.curryRight(abc);\n     *\n     * curried(3)(2)(1);\n     * // => [1, 2, 3]\n     *\n     * curried(2, 3)(1);\n     * // => [1, 2, 3]\n     *\n     * curried(1, 2, 3);\n     * // => [1, 2, 3]\n     *\n     * // using placeholders\n     * curried(3)(1, _)(2);\n     * // => [1, 2, 3]\n     */\n    var curryRight = createCurry(CURRY_RIGHT_FLAG);\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 invocations. Provide an options object to indicate that `func`\n     * should be invoked on the leading and/or trailing edge of the `wait` timeout.\n     * Subsequent calls to the debounced function return the result of the last\n     * `func` invocation.\n     *\n     * **Note:** If `leading` and `trailing` options are `true`, `func` is invoked\n     * on the trailing edge of the timeout only if the the debounced function is\n     * invoked more than once during the `wait` timeout.\n     *\n     * See [David Corbacho's article](http://drupalmotion.com/article/debounce-and-throttle-visual-explanation)\n     * for details over the differences between `_.debounce` and `_.throttle`.\n     *\n     * @static\n     * @memberOf _\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] Specify invoking on the leading\n     *  edge of the timeout.\n     * @param {number} [options.maxWait] The maximum time `func` is allowed to be\n     *  delayed before it is invoked.\n     * @param {boolean} [options.trailing=true] Specify invoking on the trailing\n     *  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 the click event is fired, debouncing subsequent calls\n     * jQuery('#postbox').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 source = new EventSource('/stream');\n     * jQuery(source).on('message', _.debounce(batchLog, 250, {\n     *   'maxWait': 1000\n     * }));\n     *\n     * // cancel a debounced call\n     * var todoChanges = _.debounce(batchLog, 1000);\n     * Object.observe(models.todo, todoChanges);\n     *\n     * Object.observe(models, function(changes) {\n     *   if (_.find(changes, { 'user': 'todo', 'type': 'delete'})) {\n     *     todoChanges.cancel();\n     *   }\n     * }, ['delete']);\n     *\n     * // ...at some point `models.todo` is changed\n     * models.todo.completed = true;\n     *\n     * // ...before 1 second has passed `models.todo` is deleted\n     * // which cancels the debounced `todoChanges` call\n     * delete models.todo;\n     */\n    function debounce(func, wait, options) {\n      var args,\n          maxTimeoutId,\n          result,\n          stamp,\n          thisArg,\n          timeoutId,\n          trailingCall,\n          lastCalled = 0,\n          maxWait = false,\n          trailing = true;\n\n      if (typeof func != 'function') {\n        throw new TypeError(FUNC_ERROR_TEXT);\n      }\n      wait = wait < 0 ? 0 : (+wait || 0);\n      if (options === true) {\n        var leading = true;\n        trailing = false;\n      } else if (isObject(options)) {\n        leading = !!options.leading;\n        maxWait = 'maxWait' in options && nativeMax(+options.maxWait || 0, wait);\n        trailing = 'trailing' in options ? !!options.trailing : trailing;\n      }\n\n      function cancel() {\n        if (timeoutId) {\n          clearTimeout(timeoutId);\n        }\n        if (maxTimeoutId) {\n          clearTimeout(maxTimeoutId);\n        }\n        lastCalled = 0;\n        maxTimeoutId = timeoutId = trailingCall = undefined;\n      }\n\n      function complete(isCalled, id) {\n        if (id) {\n          clearTimeout(id);\n        }\n        maxTimeoutId = timeoutId = trailingCall = undefined;\n        if (isCalled) {\n          lastCalled = now();\n          result = func.apply(thisArg, args);\n          if (!timeoutId && !maxTimeoutId) {\n            args = thisArg = undefined;\n          }\n        }\n      }\n\n      function delayed() {\n        var remaining = wait - (now() - stamp);\n        if (remaining <= 0 || remaining > wait) {\n          complete(trailingCall, maxTimeoutId);\n        } else {\n          timeoutId = setTimeout(delayed, remaining);\n        }\n      }\n\n      function maxDelayed() {\n        complete(trailing, timeoutId);\n      }\n\n      function debounced() {\n        args = arguments;\n        stamp = now();\n        thisArg = this;\n        trailingCall = trailing && (timeoutId || !leading);\n\n        if (maxWait === false) {\n          var leadingCall = leading && !timeoutId;\n        } else {\n          if (!maxTimeoutId && !leading) {\n            lastCalled = stamp;\n          }\n          var remaining = maxWait - (stamp - lastCalled),\n              isCalled = remaining <= 0 || remaining > maxWait;\n\n          if (isCalled) {\n            if (maxTimeoutId) {\n              maxTimeoutId = clearTimeout(maxTimeoutId);\n            }\n            lastCalled = stamp;\n            result = func.apply(thisArg, args);\n          }\n          else if (!maxTimeoutId) {\n            maxTimeoutId = setTimeout(maxDelayed, remaining);\n          }\n        }\n        if (isCalled && timeoutId) {\n          timeoutId = clearTimeout(timeoutId);\n        }\n        else if (!timeoutId && wait !== maxWait) {\n          timeoutId = setTimeout(delayed, wait);\n        }\n        if (leadingCall) {\n          isCalled = true;\n          result = func.apply(thisArg, args);\n        }\n        if (isCalled && !timeoutId && !maxTimeoutId) {\n          args = thisArg = undefined;\n        }\n        return result;\n      }\n      debounced.cancel = cancel;\n      return debounced;\n    }\n\n    /**\n     * Defers invoking the `func` until the current call stack has cleared. Any\n     * additional arguments are provided to `func` when it is invoked.\n     *\n     * @static\n     * @memberOf _\n     * @category Function\n     * @param {Function} func The function to defer.\n     * @param {...*} [args] The arguments to invoke the function with.\n     * @returns {number} Returns the timer id.\n     * @example\n     *\n     * _.defer(function(text) {\n     *   console.log(text);\n     * }, 'deferred');\n     * // logs 'deferred' after one or more milliseconds\n     */\n    var defer = restParam(function(func, args) {\n      return baseDelay(func, 1, args);\n    });\n\n    /**\n     * Invokes `func` after `wait` milliseconds. Any additional arguments are\n     * provided to `func` when it is invoked.\n     *\n     * @static\n     * @memberOf _\n     * @category Function\n     * @param {Function} func The function to delay.\n     * @param {number} wait The number of milliseconds to delay invocation.\n     * @param {...*} [args] The arguments to invoke the function with.\n     * @returns {number} Returns the timer id.\n     * @example\n     *\n     * _.delay(function(text) {\n     *   console.log(text);\n     * }, 1000, 'later');\n     * // => logs 'later' after one second\n     */\n    var delay = restParam(function(func, wait, args) {\n      return baseDelay(func, wait, args);\n    });\n\n    /**\n     * Creates a function that returns the result of invoking the provided\n     * functions with the `this` binding of the created function, where each\n     * successive invocation is supplied the return value of the previous.\n     *\n     * @static\n     * @memberOf _\n     * @category Function\n     * @param {...Function} [funcs] Functions to invoke.\n     * @returns {Function} Returns the new function.\n     * @example\n     *\n     * function square(n) {\n     *   return n * n;\n     * }\n     *\n     * var addSquare = _.flow(_.add, square);\n     * addSquare(1, 2);\n     * // => 9\n     */\n    var flow = createFlow();\n\n    /**\n     * This method is like `_.flow` except that it creates a function that\n     * invokes the provided functions from right to left.\n     *\n     * @static\n     * @memberOf _\n     * @alias backflow, compose\n     * @category Function\n     * @param {...Function} [funcs] Functions to invoke.\n     * @returns {Function} Returns the new function.\n     * @example\n     *\n     * function square(n) {\n     *   return n * n;\n     * }\n     *\n     * var addSquare = _.flowRight(square, _.add);\n     * addSquare(1, 2);\n     * // => 9\n     */\n    var flowRight = createFlow(true);\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 coerced to a string and used as the\n     * cache key. The `func` is invoked with the `this` binding of the memoized\n     * 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 [`Map`](http://ecma-international.org/ecma-262/6.0/#sec-properties-of-the-map-prototype-object)\n     * method interface of `get`, `has`, and `set`.\n     *\n     * @static\n     * @memberOf _\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 memoizing function.\n     * @example\n     *\n     * var upperCase = _.memoize(function(string) {\n     *   return string.toUpperCase();\n     * });\n     *\n     * upperCase('fred');\n     * // => 'FRED'\n     *\n     * // modifying the result cache\n     * upperCase.cache.set('fred', 'BARNEY');\n     * upperCase('fred');\n     * // => 'BARNEY'\n     *\n     * // replacing `_.memoize.Cache`\n     * var object = { 'user': 'fred' };\n     * var other = { 'user': 'barney' };\n     * var identity = _.memoize(_.identity);\n     *\n     * identity(object);\n     * // => { 'user': 'fred' }\n     * identity(other);\n     * // => { 'user': 'fred' }\n     *\n     * _.memoize.Cache = WeakMap;\n     * var identity = _.memoize(_.identity);\n     *\n     * identity(object);\n     * // => { 'user': 'fred' }\n     * identity(other);\n     * // => { 'user': 'barney' }\n     */\n    function memoize(func, resolver) {\n      if (typeof func != 'function' || (resolver && 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);\n        return result;\n      };\n      memoized.cache = new memoize.Cache;\n      return memoized;\n    }\n\n    /**\n     * Creates a function that runs each argument through a corresponding\n     * transform function.\n     *\n     * @static\n     * @memberOf _\n     * @category Function\n     * @param {Function} func The function to wrap.\n     * @param {...(Function|Function[])} [transforms] The functions to transform\n     * arguments, specified as individual functions or arrays of functions.\n     * @returns {Function} Returns the new function.\n     * @example\n     *\n     * function doubled(n) {\n     *   return n * 2;\n     * }\n     *\n     * function square(n) {\n     *   return n * n;\n     * }\n     *\n     * var modded = _.modArgs(function(x, y) {\n     *   return [x, y];\n     * }, square, doubled);\n     *\n     * modded(1, 2);\n     * // => [1, 4]\n     *\n     * modded(5, 10);\n     * // => [25, 20]\n     */\n    var modArgs = restParam(function(func, transforms) {\n      transforms = baseFlatten(transforms);\n      if (typeof func != 'function' || !arrayEvery(transforms, baseIsFunction)) {\n        throw new TypeError(FUNC_ERROR_TEXT);\n      }\n      var length = transforms.length;\n      return restParam(function(args) {\n        var index = nativeMin(args.length, length);\n        while (index--) {\n          args[index] = transforms[index](args[index]);\n        }\n        return func.apply(this, args);\n      });\n    });\n\n    /**\n     * Creates a function that negates the result of the predicate `func`. The\n     * `func` predicate is invoked with the `this` binding and arguments of the\n     * created function.\n     *\n     * @static\n     * @memberOf _\n     * @category Function\n     * @param {Function} predicate The predicate to negate.\n     * @returns {Function} Returns the new function.\n     * @example\n     *\n     * function isEven(n) {\n     *   return n % 2 == 0;\n     * }\n     *\n     * _.filter([1, 2, 3, 4, 5, 6], _.negate(isEven));\n     * // => [1, 3, 5]\n     */\n    function negate(predicate) {\n      if (typeof predicate != 'function') {\n        throw new TypeError(FUNC_ERROR_TEXT);\n      }\n      return function() {\n        return !predicate.apply(this, arguments);\n      };\n    }\n\n    /**\n     * Creates a function that is restricted to invoking `func` once. Repeat calls\n     * to the function return the value of the first call. The `func` is invoked\n     * with the `this` binding and arguments of the created function.\n     *\n     * @static\n     * @memberOf _\n     * @category Function\n     * @param {Function} func The function to restrict.\n     * @returns {Function} Returns the new restricted function.\n     * @example\n     *\n     * var initialize = _.once(createApplication);\n     * initialize();\n     * initialize();\n     * // `initialize` invokes `createApplication` once\n     */\n    function once(func) {\n      return before(2, func);\n    }\n\n    /**\n     * Creates a function that invokes `func` with `partial` arguments prepended\n     * to those provided to the new function. This method is like `_.bind` except\n     * it does **not** alter the `this` binding.\n     *\n     * The `_.partial.placeholder` value, which defaults to `_` in monolithic\n     * builds, may be used as a placeholder for partially applied arguments.\n     *\n     * **Note:** This method does not set the \"length\" property of partially\n     * applied functions.\n     *\n     * @static\n     * @memberOf _\n     * @category Function\n     * @param {Function} func The function to partially apply arguments to.\n     * @param {...*} [partials] The arguments to be partially applied.\n     * @returns {Function} Returns the new partially applied function.\n     * @example\n     *\n     * var greet = function(greeting, name) {\n     *   return greeting + ' ' + name;\n     * };\n     *\n     * var sayHelloTo = _.partial(greet, 'hello');\n     * sayHelloTo('fred');\n     * // => 'hello fred'\n     *\n     * // using placeholders\n     * var greetFred = _.partial(greet, _, 'fred');\n     * greetFred('hi');\n     * // => 'hi fred'\n     */\n    var partial = createPartial(PARTIAL_FLAG);\n\n    /**\n     * This method is like `_.partial` except that partially applied arguments\n     * are appended to those provided to the new function.\n     *\n     * The `_.partialRight.placeholder` value, which defaults to `_` in monolithic\n     * builds, may be used as a placeholder for partially applied arguments.\n     *\n     * **Note:** This method does not set the \"length\" property of partially\n     * applied functions.\n     *\n     * @static\n     * @memberOf _\n     * @category Function\n     * @param {Function} func The function to partially apply arguments to.\n     * @param {...*} [partials] The arguments to be partially applied.\n     * @returns {Function} Returns the new partially applied function.\n     * @example\n     *\n     * var greet = function(greeting, name) {\n     *   return greeting + ' ' + name;\n     * };\n     *\n     * var greetFred = _.partialRight(greet, 'fred');\n     * greetFred('hi');\n     * // => 'hi fred'\n     *\n     * // using placeholders\n     * var sayHelloTo = _.partialRight(greet, 'hello', _);\n     * sayHelloTo('fred');\n     * // => 'hello fred'\n     */\n    var partialRight = createPartial(PARTIAL_RIGHT_FLAG);\n\n    /**\n     * Creates a function that invokes `func` with arguments arranged according\n     * to the specified indexes where the argument value at the first index is\n     * provided as the first argument, the argument value at the second index is\n     * provided as the second argument, and so on.\n     *\n     * @static\n     * @memberOf _\n     * @category Function\n     * @param {Function} func The function to rearrange arguments for.\n     * @param {...(number|number[])} indexes The arranged argument indexes,\n     *  specified as individual indexes or arrays of indexes.\n     * @returns {Function} Returns the new function.\n     * @example\n     *\n     * var rearged = _.rearg(function(a, b, c) {\n     *   return [a, b, c];\n     * }, 2, 0, 1);\n     *\n     * rearged('b', 'c', 'a')\n     * // => ['a', 'b', 'c']\n     *\n     * var map = _.rearg(_.map, [1, 0]);\n     * map(function(n) {\n     *   return n * 3;\n     * }, [1, 2, 3]);\n     * // => [3, 6, 9]\n     */\n    var rearg = restParam(function(func, indexes) {\n      return createWrapper(func, REARG_FLAG, undefined, undefined, undefined, baseFlatten(indexes));\n    });\n\n    /**\n     * Creates a function that invokes `func` with the `this` binding of the\n     * created function and arguments from `start` and beyond provided as an array.\n     *\n     * **Note:** This method is based on the [rest parameter](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/rest_parameters).\n     *\n     * @static\n     * @memberOf _\n     * @category Function\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     * @example\n     *\n     * var say = _.restParam(function(what, names) {\n     *   return what + ' ' + _.initial(names).join(', ') +\n     *     (_.size(names) > 1 ? ', & ' : '') + _.last(names);\n     * });\n     *\n     * say('hello', 'fred', 'barney', 'pebbles');\n     * // => 'hello fred, barney, & pebbles'\n     */\n    function restParam(func, start) {\n      if (typeof func != 'function') {\n        throw new TypeError(FUNC_ERROR_TEXT);\n      }\n      start = nativeMax(start === undefined ? (func.length - 1) : (+start || 0), 0);\n      return function() {\n        var args = arguments,\n            index = -1,\n            length = nativeMax(args.length - start, 0),\n            rest = Array(length);\n\n        while (++index < length) {\n          rest[index] = args[start + index];\n        }\n        switch (start) {\n          case 0: return func.call(this, rest);\n          case 1: return func.call(this, args[0], rest);\n          case 2: return func.call(this, args[0], args[1], rest);\n        }\n        var otherArgs = Array(start + 1);\n        index = -1;\n        while (++index < start) {\n          otherArgs[index] = args[index];\n        }\n        otherArgs[start] = rest;\n        return func.apply(this, otherArgs);\n      };\n    }\n\n    /**\n     * Creates a function that invokes `func` with the `this` binding of the created\n     * function and an array of arguments much like [`Function#apply`](https://es5.github.io/#x15.3.4.3).\n     *\n     * **Note:** This method is based on the [spread operator](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Spread_operator).\n     *\n     * @static\n     * @memberOf _\n     * @category Function\n     * @param {Function} func The function to spread arguments over.\n     * @returns {Function} Returns the new function.\n     * @example\n     *\n     * var say = _.spread(function(who, what) {\n     *   return who + ' says ' + what;\n     * });\n     *\n     * say(['fred', 'hello']);\n     * // => 'fred says hello'\n     *\n     * // with a Promise\n     * var numbers = Promise.all([\n     *   Promise.resolve(40),\n     *   Promise.resolve(36)\n     * ]);\n     *\n     * numbers.then(_.spread(function(x, y) {\n     *   return x + y;\n     * }));\n     * // => a Promise of 76\n     */\n    function spread(func) {\n      if (typeof func != 'function') {\n        throw new TypeError(FUNC_ERROR_TEXT);\n      }\n      return function(array) {\n        return func.apply(this, array);\n      };\n    }\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 invocations. Provide an options object to indicate\n     * that `func` should be invoked on the leading and/or trailing edge of the\n     * `wait` timeout. Subsequent calls to the throttled function return the\n     * result of the last `func` call.\n     *\n     * **Note:** If `leading` and `trailing` options are `true`, `func` is invoked\n     * on the trailing edge of the timeout only if the the throttled function is\n     * invoked more than once during the `wait` timeout.\n     *\n     * See [David Corbacho's article](http://drupalmotion.com/article/debounce-and-throttle-visual-explanation)\n     * for details over the differences between `_.throttle` and `_.debounce`.\n     *\n     * @static\n     * @memberOf _\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] Specify invoking on the leading\n     *  edge of the timeout.\n     * @param {boolean} [options.trailing=true] Specify invoking on the trailing\n     *  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     * jQuery('.interactive').on('click', _.throttle(renewToken, 300000, {\n     *   'trailing': false\n     * }));\n     *\n     * // cancel a trailing throttled call\n     * jQuery(window).on('popstate', throttled.cancel);\n     */\n    function 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 (options === false) {\n        leading = false;\n      } else 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, { 'leading': leading, 'maxWait': +wait, 'trailing': trailing });\n    }\n\n    /**\n     * Creates a function that provides `value` to the wrapper function as its\n     * first argument. Any additional arguments provided to the function are\n     * appended to those provided to the wrapper function. The wrapper is invoked\n     * with the `this` binding of the created function.\n     *\n     * @static\n     * @memberOf _\n     * @category Function\n     * @param {*} value The value to wrap.\n     * @param {Function} wrapper The wrapper function.\n     * @returns {Function} Returns the new function.\n     * @example\n     *\n     * var p = _.wrap(_.escape, function(func, text) {\n     *   return '<p>' + func(text) + '</p>';\n     * });\n     *\n     * p('fred, barney, & pebbles');\n     * // => '<p>fred, barney, &amp; pebbles</p>'\n     */\n    function wrap(value, wrapper) {\n      wrapper = wrapper == null ? identity : wrapper;\n      return createWrapper(wrapper, PARTIAL_FLAG, undefined, [value], []);\n    }\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Creates a clone of `value`. If `isDeep` is `true` nested objects are cloned,\n     * otherwise they are assigned by reference. If `customizer` is provided it is\n     * invoked to produce the cloned values. If `customizer` returns `undefined`\n     * cloning is handled by the method instead. The `customizer` is bound to\n     * `thisArg` and invoked with two argument; (value [, index|key, object]).\n     *\n     * **Note:** This method is loosely based on the\n     * [structured clone algorithm](http://www.w3.org/TR/html5/infrastructure.html#internal-structured-cloning-algorithm).\n     * The enumerable properties of `arguments` objects and objects created by\n     * constructors other than `Object` are cloned to plain `Object` objects. An\n     * empty object is returned for uncloneable values such as functions, DOM nodes,\n     * Maps, Sets, and WeakMaps.\n     *\n     * @static\n     * @memberOf _\n     * @category Lang\n     * @param {*} value The value to clone.\n     * @param {boolean} [isDeep] Specify a deep clone.\n     * @param {Function} [customizer] The function to customize cloning values.\n     * @param {*} [thisArg] The `this` binding of `customizer`.\n     * @returns {*} Returns the cloned value.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney' },\n     *   { 'user': 'fred' }\n     * ];\n     *\n     * var shallow = _.clone(users);\n     * shallow[0] === users[0];\n     * // => true\n     *\n     * var deep = _.clone(users, true);\n     * deep[0] === users[0];\n     * // => false\n     *\n     * // using a customizer callback\n     * var el = _.clone(document.body, function(value) {\n     *   if (_.isElement(value)) {\n     *     return value.cloneNode(false);\n     *   }\n     * });\n     *\n     * el === document.body\n     * // => false\n     * el.nodeName\n     * // => BODY\n     * el.childNodes.length;\n     * // => 0\n     */\n    function clone(value, isDeep, customizer, thisArg) {\n      if (isDeep && typeof isDeep != 'boolean' && isIterateeCall(value, isDeep, customizer)) {\n        isDeep = false;\n      }\n      else if (typeof isDeep == 'function') {\n        thisArg = customizer;\n        customizer = isDeep;\n        isDeep = false;\n      }\n      return typeof customizer == 'function'\n        ? baseClone(value, isDeep, bindCallback(customizer, thisArg, 1))\n        : baseClone(value, isDeep);\n    }\n\n    /**\n     * Creates a deep clone of `value`. If `customizer` is provided it is invoked\n     * to produce the cloned values. If `customizer` returns `undefined` cloning\n     * is handled by the method instead. The `customizer` is bound to `thisArg`\n     * and invoked with two argument; (value [, index|key, object]).\n     *\n     * **Note:** This method is loosely based on the\n     * [structured clone algorithm](http://www.w3.org/TR/html5/infrastructure.html#internal-structured-cloning-algorithm).\n     * The enumerable properties of `arguments` objects and objects created by\n     * constructors other than `Object` are cloned to plain `Object` objects. An\n     * empty object is returned for uncloneable values such as functions, DOM nodes,\n     * Maps, Sets, and WeakMaps.\n     *\n     * @static\n     * @memberOf _\n     * @category Lang\n     * @param {*} value The value to deep clone.\n     * @param {Function} [customizer] The function to customize cloning values.\n     * @param {*} [thisArg] The `this` binding of `customizer`.\n     * @returns {*} Returns the deep cloned value.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney' },\n     *   { 'user': 'fred' }\n     * ];\n     *\n     * var deep = _.cloneDeep(users);\n     * deep[0] === users[0];\n     * // => false\n     *\n     * // using a customizer callback\n     * var el = _.cloneDeep(document.body, function(value) {\n     *   if (_.isElement(value)) {\n     *     return value.cloneNode(true);\n     *   }\n     * });\n     *\n     * el === document.body\n     * // => false\n     * el.nodeName\n     * // => BODY\n     * el.childNodes.length;\n     * // => 20\n     */\n    function cloneDeep(value, customizer, thisArg) {\n      return typeof customizer == 'function'\n        ? baseClone(value, true, bindCallback(customizer, thisArg, 1))\n        : baseClone(value, true);\n    }\n\n    /**\n     * Checks if `value` is greater than `other`.\n     *\n     * @static\n     * @memberOf _\n     * @category Lang\n     * @param {*} value The value to compare.\n     * @param {*} other The other value to compare.\n     * @returns {boolean} Returns `true` if `value` is greater than `other`, else `false`.\n     * @example\n     *\n     * _.gt(3, 1);\n     * // => true\n     *\n     * _.gt(3, 3);\n     * // => false\n     *\n     * _.gt(1, 3);\n     * // => false\n     */\n    function gt(value, other) {\n      return value > other;\n    }\n\n    /**\n     * Checks if `value` is greater than or equal to `other`.\n     *\n     * @static\n     * @memberOf _\n     * @category Lang\n     * @param {*} value The value to compare.\n     * @param {*} other The other value to compare.\n     * @returns {boolean} Returns `true` if `value` is greater than or equal to `other`, else `false`.\n     * @example\n     *\n     * _.gte(3, 1);\n     * // => true\n     *\n     * _.gte(3, 3);\n     * // => true\n     *\n     * _.gte(1, 3);\n     * // => false\n     */\n    function gte(value, other) {\n      return value >= other;\n    }\n\n    /**\n     * Checks if `value` is classified as an `arguments` object.\n     *\n     * @static\n     * @memberOf _\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.\n     * @example\n     *\n     * _.isArguments(function() { return arguments; }());\n     * // => true\n     *\n     * _.isArguments([1, 2, 3]);\n     * // => false\n     */\n    function isArguments(value) {\n      return isObjectLike(value) && isArrayLike(value) &&\n        hasOwnProperty.call(value, 'callee') && !propertyIsEnumerable.call(value, 'callee');\n    }\n\n    /**\n     * Checks if `value` is classified as an `Array` object.\n     *\n     * @static\n     * @memberOf _\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.\n     * @example\n     *\n     * _.isArray([1, 2, 3]);\n     * // => true\n     *\n     * _.isArray(function() { return arguments; }());\n     * // => false\n     */\n    var isArray = nativeIsArray || function(value) {\n      return isObjectLike(value) && isLength(value.length) && objToString.call(value) == arrayTag;\n    };\n\n    /**\n     * Checks if `value` is classified as a boolean primitive or object.\n     *\n     * @static\n     * @memberOf _\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.\n     * @example\n     *\n     * _.isBoolean(false);\n     * // => true\n     *\n     * _.isBoolean(null);\n     * // => false\n     */\n    function isBoolean(value) {\n      return value === true || value === false || (isObjectLike(value) && objToString.call(value) == boolTag);\n    }\n\n    /**\n     * Checks if `value` is classified as a `Date` object.\n     *\n     * @static\n     * @memberOf _\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.\n     * @example\n     *\n     * _.isDate(new Date);\n     * // => true\n     *\n     * _.isDate('Mon April 23 2012');\n     * // => false\n     */\n    function isDate(value) {\n      return isObjectLike(value) && objToString.call(value) == dateTag;\n    }\n\n    /**\n     * Checks if `value` is a DOM element.\n     *\n     * @static\n     * @memberOf _\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a DOM element, else `false`.\n     * @example\n     *\n     * _.isElement(document.body);\n     * // => true\n     *\n     * _.isElement('<body>');\n     * // => false\n     */\n    function isElement(value) {\n      return !!value && value.nodeType === 1 && isObjectLike(value) && !isPlainObject(value);\n    }\n\n    /**\n     * Checks if `value` is empty. A value is considered empty unless it is an\n     * `arguments` object, array, string, or jQuery-like collection with a length\n     * greater than `0` or an object with own enumerable properties.\n     *\n     * @static\n     * @memberOf _\n     * @category Lang\n     * @param {Array|Object|string} value The value to inspect.\n     * @returns {boolean} Returns `true` if `value` is empty, else `false`.\n     * @example\n     *\n     * _.isEmpty(null);\n     * // => true\n     *\n     * _.isEmpty(true);\n     * // => true\n     *\n     * _.isEmpty(1);\n     * // => true\n     *\n     * _.isEmpty([1, 2, 3]);\n     * // => false\n     *\n     * _.isEmpty({ 'a': 1 });\n     * // => false\n     */\n    function isEmpty(value) {\n      if (value == null) {\n        return true;\n      }\n      if (isArrayLike(value) && (isArray(value) || isString(value) || isArguments(value) ||\n          (isObjectLike(value) && isFunction(value.splice)))) {\n        return !value.length;\n      }\n      return !keys(value).length;\n    }\n\n    /**\n     * Performs a deep comparison between two values to determine if they are\n     * equivalent. If `customizer` is provided it is invoked to compare values.\n     * If `customizer` returns `undefined` comparisons are handled by the method\n     * instead. The `customizer` is bound to `thisArg` and invoked with three\n     * arguments: (value, other [, index|key]).\n     *\n     * **Note:** This method supports comparing arrays, booleans, `Date` objects,\n     * numbers, `Object` objects, regexes, and strings. Objects are compared by\n     * their own, not inherited, enumerable properties. Functions and DOM nodes\n     * are **not** supported. Provide a customizer function to extend support\n     * for comparing other values.\n     *\n     * @static\n     * @memberOf _\n     * @alias eq\n     * @category Lang\n     * @param {*} value The value to compare.\n     * @param {*} other The other value to compare.\n     * @param {Function} [customizer] The function to customize value comparisons.\n     * @param {*} [thisArg] The `this` binding of `customizer`.\n     * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n     * @example\n     *\n     * var object = { 'user': 'fred' };\n     * var other = { 'user': 'fred' };\n     *\n     * object == other;\n     * // => false\n     *\n     * _.isEqual(object, other);\n     * // => true\n     *\n     * // using a customizer callback\n     * var array = ['hello', 'goodbye'];\n     * var other = ['hi', 'goodbye'];\n     *\n     * _.isEqual(array, other, function(value, other) {\n     *   if (_.every([value, other], RegExp.prototype.test, /^h(?:i|ello)$/)) {\n     *     return true;\n     *   }\n     * });\n     * // => true\n     */\n    function isEqual(value, other, customizer, thisArg) {\n      customizer = typeof customizer == 'function' ? bindCallback(customizer, thisArg, 3) : undefined;\n      var result = customizer ? customizer(value, other) : undefined;\n      return  result === undefined ? baseIsEqual(value, other, customizer) : !!result;\n    }\n\n    /**\n     * Checks if `value` is an `Error`, `EvalError`, `RangeError`, `ReferenceError`,\n     * `SyntaxError`, `TypeError`, or `URIError` object.\n     *\n     * @static\n     * @memberOf _\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is an error object, else `false`.\n     * @example\n     *\n     * _.isError(new Error);\n     * // => true\n     *\n     * _.isError(Error);\n     * // => false\n     */\n    function isError(value) {\n      return isObjectLike(value) && typeof value.message == 'string' && objToString.call(value) == errorTag;\n    }\n\n    /**\n     * Checks if `value` is a finite primitive number.\n     *\n     * **Note:** This method is based on [`Number.isFinite`](http://ecma-international.org/ecma-262/6.0/#sec-number.isfinite).\n     *\n     * @static\n     * @memberOf _\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a finite number, else `false`.\n     * @example\n     *\n     * _.isFinite(10);\n     * // => true\n     *\n     * _.isFinite('10');\n     * // => false\n     *\n     * _.isFinite(true);\n     * // => false\n     *\n     * _.isFinite(Object(10));\n     * // => false\n     *\n     * _.isFinite(Infinity);\n     * // => false\n     */\n    function isFinite(value) {\n      return typeof value == 'number' && nativeIsFinite(value);\n    }\n\n    /**\n     * Checks if `value` is classified as a `Function` object.\n     *\n     * @static\n     * @memberOf _\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.\n     * @example\n     *\n     * _.isFunction(_);\n     * // => true\n     *\n     * _.isFunction(/abc/);\n     * // => false\n     */\n    function isFunction(value) {\n      // The use of `Object#toString` avoids issues with the `typeof` operator\n      // in older versions of Chrome and Safari which return 'function' for regexes\n      // and Safari 8 equivalents which return 'object' for typed array constructors.\n      return isObject(value) && objToString.call(value) == funcTag;\n    }\n\n    /**\n     * Checks if `value` is the [language type](https://es5.github.io/#x8) of `Object`.\n     * (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n     *\n     * @static\n     * @memberOf _\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(1);\n     * // => false\n     */\n    function isObject(value) {\n      // Avoid a V8 JIT bug in Chrome 19-20.\n      // See https://code.google.com/p/v8/issues/detail?id=2291 for more details.\n      var type = typeof value;\n      return !!value && (type == 'object' || type == 'function');\n    }\n\n    /**\n     * Performs a deep comparison between `object` and `source` to determine if\n     * `object` contains equivalent property values. If `customizer` is provided\n     * it is invoked to compare values. If `customizer` returns `undefined`\n     * comparisons are handled by the method instead. The `customizer` is bound\n     * to `thisArg` and invoked with three arguments: (value, other, index|key).\n     *\n     * **Note:** This method supports comparing properties of arrays, booleans,\n     * `Date` objects, numbers, `Object` objects, regexes, and strings. Functions\n     * and DOM nodes are **not** supported. Provide a customizer function to extend\n     * support for comparing other values.\n     *\n     * @static\n     * @memberOf _\n     * @category Lang\n     * @param {Object} object The object to inspect.\n     * @param {Object} source The object of property values to match.\n     * @param {Function} [customizer] The function to customize value comparisons.\n     * @param {*} [thisArg] The `this` binding of `customizer`.\n     * @returns {boolean} Returns `true` if `object` is a match, else `false`.\n     * @example\n     *\n     * var object = { 'user': 'fred', 'age': 40 };\n     *\n     * _.isMatch(object, { 'age': 40 });\n     * // => true\n     *\n     * _.isMatch(object, { 'age': 36 });\n     * // => false\n     *\n     * // using a customizer callback\n     * var object = { 'greeting': 'hello' };\n     * var source = { 'greeting': 'hi' };\n     *\n     * _.isMatch(object, source, function(value, other) {\n     *   return _.every([value, other], RegExp.prototype.test, /^h(?:i|ello)$/) || undefined;\n     * });\n     * // => true\n     */\n    function isMatch(object, source, customizer, thisArg) {\n      customizer = typeof customizer == 'function' ? bindCallback(customizer, thisArg, 3) : undefined;\n      return baseIsMatch(object, getMatchData(source), customizer);\n    }\n\n    /**\n     * Checks if `value` is `NaN`.\n     *\n     * **Note:** This method is not the same as [`isNaN`](https://es5.github.io/#x15.1.2.4)\n     * which returns `true` for `undefined` and other non-numeric values.\n     *\n     * @static\n     * @memberOf _\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is `NaN`, else `false`.\n     * @example\n     *\n     * _.isNaN(NaN);\n     * // => true\n     *\n     * _.isNaN(new Number(NaN));\n     * // => true\n     *\n     * isNaN(undefined);\n     * // => true\n     *\n     * _.isNaN(undefined);\n     * // => false\n     */\n    function isNaN(value) {\n      // An `NaN` primitive is the only value that is not equal to itself.\n      // Perform the `toStringTag` check first to avoid errors with some host objects in IE.\n      return isNumber(value) && value != +value;\n    }\n\n    /**\n     * Checks if `value` is a native function.\n     *\n     * @static\n     * @memberOf _\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a native function, else `false`.\n     * @example\n     *\n     * _.isNative(Array.prototype.push);\n     * // => true\n     *\n     * _.isNative(_);\n     * // => false\n     */\n    function isNative(value) {\n      if (value == null) {\n        return false;\n      }\n      if (isFunction(value)) {\n        return reIsNative.test(fnToString.call(value));\n      }\n      return isObjectLike(value) && reIsHostCtor.test(value);\n    }\n\n    /**\n     * Checks if `value` is `null`.\n     *\n     * @static\n     * @memberOf _\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is `null`, else `false`.\n     * @example\n     *\n     * _.isNull(null);\n     * // => true\n     *\n     * _.isNull(void 0);\n     * // => false\n     */\n    function isNull(value) {\n      return value === null;\n    }\n\n    /**\n     * Checks if `value` is classified as a `Number` primitive or object.\n     *\n     * **Note:** To exclude `Infinity`, `-Infinity`, and `NaN`, which are classified\n     * as numbers, use the `_.isFinite` method.\n     *\n     * @static\n     * @memberOf _\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.\n     * @example\n     *\n     * _.isNumber(8.4);\n     * // => true\n     *\n     * _.isNumber(NaN);\n     * // => true\n     *\n     * _.isNumber('8.4');\n     * // => false\n     */\n    function isNumber(value) {\n      return typeof value == 'number' || (isObjectLike(value) && objToString.call(value) == numberTag);\n    }\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     * **Note:** This method assumes objects created by the `Object` constructor\n     * have no inherited enumerable properties.\n     *\n     * @static\n     * @memberOf _\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     */\n    function isPlainObject(value) {\n      var Ctor;\n\n      // Exit early for non `Object` objects.\n      if (!(isObjectLike(value) && objToString.call(value) == objectTag && !isArguments(value)) ||\n          (!hasOwnProperty.call(value, 'constructor') && (Ctor = value.constructor, typeof Ctor == 'function' && !(Ctor instanceof Ctor)))) {\n        return false;\n      }\n      // IE < 9 iterates inherited properties before own properties. If the first\n      // iterated property is an object's own property then there are no inherited\n      // enumerable properties.\n      var result;\n      // In most environments an object's own properties are iterated before\n      // its inherited properties. If the last iterated property is an object's\n      // own property then there are no inherited enumerable properties.\n      baseForIn(value, function(subValue, key) {\n        result = key;\n      });\n      return result === undefined || hasOwnProperty.call(value, result);\n    }\n\n    /**\n     * Checks if `value` is classified as a `RegExp` object.\n     *\n     * @static\n     * @memberOf _\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.\n     * @example\n     *\n     * _.isRegExp(/abc/);\n     * // => true\n     *\n     * _.isRegExp('/abc/');\n     * // => false\n     */\n    function isRegExp(value) {\n      return isObject(value) && objToString.call(value) == regexpTag;\n    }\n\n    /**\n     * Checks if `value` is classified as a `String` primitive or object.\n     *\n     * @static\n     * @memberOf _\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.\n     * @example\n     *\n     * _.isString('abc');\n     * // => true\n     *\n     * _.isString(1);\n     * // => false\n     */\n    function isString(value) {\n      return typeof value == 'string' || (isObjectLike(value) && objToString.call(value) == stringTag);\n    }\n\n    /**\n     * Checks if `value` is classified as a typed array.\n     *\n     * @static\n     * @memberOf _\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.\n     * @example\n     *\n     * _.isTypedArray(new Uint8Array);\n     * // => true\n     *\n     * _.isTypedArray([]);\n     * // => false\n     */\n    function isTypedArray(value) {\n      return isObjectLike(value) && isLength(value.length) && !!typedArrayTags[objToString.call(value)];\n    }\n\n    /**\n     * Checks if `value` is `undefined`.\n     *\n     * @static\n     * @memberOf _\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is `undefined`, else `false`.\n     * @example\n     *\n     * _.isUndefined(void 0);\n     * // => true\n     *\n     * _.isUndefined(null);\n     * // => false\n     */\n    function isUndefined(value) {\n      return value === undefined;\n    }\n\n    /**\n     * Checks if `value` is less than `other`.\n     *\n     * @static\n     * @memberOf _\n     * @category Lang\n     * @param {*} value The value to compare.\n     * @param {*} other The other value to compare.\n     * @returns {boolean} Returns `true` if `value` is less than `other`, else `false`.\n     * @example\n     *\n     * _.lt(1, 3);\n     * // => true\n     *\n     * _.lt(3, 3);\n     * // => false\n     *\n     * _.lt(3, 1);\n     * // => false\n     */\n    function lt(value, other) {\n      return value < other;\n    }\n\n    /**\n     * Checks if `value` is less than or equal to `other`.\n     *\n     * @static\n     * @memberOf _\n     * @category Lang\n     * @param {*} value The value to compare.\n     * @param {*} other The other value to compare.\n     * @returns {boolean} Returns `true` if `value` is less than or equal to `other`, else `false`.\n     * @example\n     *\n     * _.lte(1, 3);\n     * // => true\n     *\n     * _.lte(3, 3);\n     * // => true\n     *\n     * _.lte(3, 1);\n     * // => false\n     */\n    function lte(value, other) {\n      return value <= other;\n    }\n\n    /**\n     * Converts `value` to an array.\n     *\n     * @static\n     * @memberOf _\n     * @category Lang\n     * @param {*} value The value to convert.\n     * @returns {Array} Returns the converted array.\n     * @example\n     *\n     * (function() {\n     *   return _.toArray(arguments).slice(1);\n     * }(1, 2, 3));\n     * // => [2, 3]\n     */\n    function toArray(value) {\n      var length = value ? getLength(value) : 0;\n      if (!isLength(length)) {\n        return values(value);\n      }\n      if (!length) {\n        return [];\n      }\n      return arrayCopy(value);\n    }\n\n    /**\n     * Converts `value` to a plain object flattening inherited enumerable\n     * properties of `value` to own properties of the plain object.\n     *\n     * @static\n     * @memberOf _\n     * @category Lang\n     * @param {*} value The value to convert.\n     * @returns {Object} Returns the converted plain object.\n     * @example\n     *\n     * function Foo() {\n     *   this.b = 2;\n     * }\n     *\n     * Foo.prototype.c = 3;\n     *\n     * _.assign({ 'a': 1 }, new Foo);\n     * // => { 'a': 1, 'b': 2 }\n     *\n     * _.assign({ 'a': 1 }, _.toPlainObject(new Foo));\n     * // => { 'a': 1, 'b': 2, 'c': 3 }\n     */\n    function toPlainObject(value) {\n      return baseCopy(value, keysIn(value));\n    }\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Recursively merges own enumerable properties of the source object(s), that\n     * don't resolve to `undefined` into the destination object. Subsequent sources\n     * overwrite property assignments of previous sources. If `customizer` is\n     * provided it is invoked to produce the merged values of the destination and\n     * source properties. If `customizer` returns `undefined` merging is handled\n     * by the method instead. The `customizer` is bound to `thisArg` and invoked\n     * with five arguments: (objectValue, sourceValue, key, object, source).\n     *\n     * @static\n     * @memberOf _\n     * @category Object\n     * @param {Object} object The destination object.\n     * @param {...Object} [sources] The source objects.\n     * @param {Function} [customizer] The function to customize assigned values.\n     * @param {*} [thisArg] The `this` binding of `customizer`.\n     * @returns {Object} Returns `object`.\n     * @example\n     *\n     * var users = {\n     *   'data': [{ 'user': 'barney' }, { 'user': 'fred' }]\n     * };\n     *\n     * var ages = {\n     *   'data': [{ 'age': 36 }, { 'age': 40 }]\n     * };\n     *\n     * _.merge(users, ages);\n     * // => { 'data': [{ 'user': 'barney', 'age': 36 }, { 'user': 'fred', 'age': 40 }] }\n     *\n     * // using a customizer callback\n     * var object = {\n     *   'fruits': ['apple'],\n     *   'vegetables': ['beet']\n     * };\n     *\n     * var other = {\n     *   'fruits': ['banana'],\n     *   'vegetables': ['carrot']\n     * };\n     *\n     * _.merge(object, other, function(a, b) {\n     *   if (_.isArray(a)) {\n     *     return a.concat(b);\n     *   }\n     * });\n     * // => { 'fruits': ['apple', 'banana'], 'vegetables': ['beet', 'carrot'] }\n     */\n    var merge = createAssigner(baseMerge);\n\n    /**\n     * Assigns own enumerable properties of source object(s) to the destination\n     * object. Subsequent sources overwrite property assignments of previous sources.\n     * If `customizer` is provided it is invoked to produce the assigned values.\n     * The `customizer` is bound to `thisArg` and invoked with five arguments:\n     * (objectValue, sourceValue, key, object, source).\n     *\n     * **Note:** This method mutates `object` and is based on\n     * [`Object.assign`](http://ecma-international.org/ecma-262/6.0/#sec-object.assign).\n     *\n     * @static\n     * @memberOf _\n     * @alias extend\n     * @category Object\n     * @param {Object} object The destination object.\n     * @param {...Object} [sources] The source objects.\n     * @param {Function} [customizer] The function to customize assigned values.\n     * @param {*} [thisArg] The `this` binding of `customizer`.\n     * @returns {Object} Returns `object`.\n     * @example\n     *\n     * _.assign({ 'user': 'barney' }, { 'age': 40 }, { 'user': 'fred' });\n     * // => { 'user': 'fred', 'age': 40 }\n     *\n     * // using a customizer callback\n     * var defaults = _.partialRight(_.assign, function(value, other) {\n     *   return _.isUndefined(value) ? other : value;\n     * });\n     *\n     * defaults({ 'user': 'barney' }, { 'age': 36 }, { 'user': 'fred' });\n     * // => { 'user': 'barney', 'age': 36 }\n     */\n    var assign = createAssigner(function(object, source, customizer) {\n      return customizer\n        ? assignWith(object, source, customizer)\n        : baseAssign(object, source);\n    });\n\n    /**\n     * Creates an object that inherits from the given `prototype` object. If a\n     * `properties` object is provided its own enumerable properties are assigned\n     * to the created object.\n     *\n     * @static\n     * @memberOf _\n     * @category Object\n     * @param {Object} prototype The object to inherit from.\n     * @param {Object} [properties] The properties to assign to the object.\n     * @param- {Object} [guard] Enables use as a callback for functions like `_.map`.\n     * @returns {Object} Returns the new object.\n     * @example\n     *\n     * function Shape() {\n     *   this.x = 0;\n     *   this.y = 0;\n     * }\n     *\n     * function Circle() {\n     *   Shape.call(this);\n     * }\n     *\n     * Circle.prototype = _.create(Shape.prototype, {\n     *   'constructor': Circle\n     * });\n     *\n     * var circle = new Circle;\n     * circle instanceof Circle;\n     * // => true\n     *\n     * circle instanceof Shape;\n     * // => true\n     */\n    function create(prototype, properties, guard) {\n      var result = baseCreate(prototype);\n      if (guard && isIterateeCall(prototype, properties, guard)) {\n        properties = undefined;\n      }\n      return properties ? baseAssign(result, properties) : result;\n    }\n\n    /**\n     * Assigns own enumerable properties of source object(s) to the destination\n     * object for all destination properties that resolve to `undefined`. Once a\n     * property is set, additional values of the same property are ignored.\n     *\n     * **Note:** This method mutates `object`.\n     *\n     * @static\n     * @memberOf _\n     * @category Object\n     * @param {Object} object The destination object.\n     * @param {...Object} [sources] The source objects.\n     * @returns {Object} Returns `object`.\n     * @example\n     *\n     * _.defaults({ 'user': 'barney' }, { 'age': 36 }, { 'user': 'fred' });\n     * // => { 'user': 'barney', 'age': 36 }\n     */\n    var defaults = createDefaults(assign, assignDefaults);\n\n    /**\n     * This method is like `_.defaults` except that it recursively assigns\n     * default properties.\n     *\n     * **Note:** This method mutates `object`.\n     *\n     * @static\n     * @memberOf _\n     * @category Object\n     * @param {Object} object The destination object.\n     * @param {...Object} [sources] The source objects.\n     * @returns {Object} Returns `object`.\n     * @example\n     *\n     * _.defaultsDeep({ 'user': { 'name': 'barney' } }, { 'user': { 'name': 'fred', 'age': 36 } });\n     * // => { 'user': { 'name': 'barney', 'age': 36 } }\n     *\n     */\n    var defaultsDeep = createDefaults(merge, mergeDefaults);\n\n    /**\n     * This method is like `_.find` except that it returns the key of the first\n     * element `predicate` returns truthy for instead of the element itself.\n     *\n     * If a property name is provided for `predicate` the created `_.property`\n     * style callback returns the property value of the given element.\n     *\n     * If a value is also provided for `thisArg` the created `_.matchesProperty`\n     * style callback returns `true` for elements that have a matching property\n     * value, else `false`.\n     *\n     * If an object is provided for `predicate` the created `_.matches` style\n     * callback returns `true` for elements that have the properties of the given\n     * object, else `false`.\n     *\n     * @static\n     * @memberOf _\n     * @category Object\n     * @param {Object} object The object to search.\n     * @param {Function|Object|string} [predicate=_.identity] The function invoked\n     *  per iteration.\n     * @param {*} [thisArg] The `this` binding of `predicate`.\n     * @returns {string|undefined} Returns the key of the matched element, else `undefined`.\n     * @example\n     *\n     * var users = {\n     *   'barney':  { 'age': 36, 'active': true },\n     *   'fred':    { 'age': 40, 'active': false },\n     *   'pebbles': { 'age': 1,  'active': true }\n     * };\n     *\n     * _.findKey(users, function(chr) {\n     *   return chr.age < 40;\n     * });\n     * // => 'barney' (iteration order is not guaranteed)\n     *\n     * // using the `_.matches` callback shorthand\n     * _.findKey(users, { 'age': 1, 'active': true });\n     * // => 'pebbles'\n     *\n     * // using the `_.matchesProperty` callback shorthand\n     * _.findKey(users, 'active', false);\n     * // => 'fred'\n     *\n     * // using the `_.property` callback shorthand\n     * _.findKey(users, 'active');\n     * // => 'barney'\n     */\n    var findKey = createFindKey(baseForOwn);\n\n    /**\n     * This method is like `_.findKey` except that it iterates over elements of\n     * a collection in the opposite order.\n     *\n     * If a property name is provided for `predicate` the created `_.property`\n     * style callback returns the property value of the given element.\n     *\n     * If a value is also provided for `thisArg` the created `_.matchesProperty`\n     * style callback returns `true` for elements that have a matching property\n     * value, else `false`.\n     *\n     * If an object is provided for `predicate` the created `_.matches` style\n     * callback returns `true` for elements that have the properties of the given\n     * object, else `false`.\n     *\n     * @static\n     * @memberOf _\n     * @category Object\n     * @param {Object} object The object to search.\n     * @param {Function|Object|string} [predicate=_.identity] The function invoked\n     *  per iteration.\n     * @param {*} [thisArg] The `this` binding of `predicate`.\n     * @returns {string|undefined} Returns the key of the matched element, else `undefined`.\n     * @example\n     *\n     * var users = {\n     *   'barney':  { 'age': 36, 'active': true },\n     *   'fred':    { 'age': 40, 'active': false },\n     *   'pebbles': { 'age': 1,  'active': true }\n     * };\n     *\n     * _.findLastKey(users, function(chr) {\n     *   return chr.age < 40;\n     * });\n     * // => returns `pebbles` assuming `_.findKey` returns `barney`\n     *\n     * // using the `_.matches` callback shorthand\n     * _.findLastKey(users, { 'age': 36, 'active': true });\n     * // => 'barney'\n     *\n     * // using the `_.matchesProperty` callback shorthand\n     * _.findLastKey(users, 'active', false);\n     * // => 'fred'\n     *\n     * // using the `_.property` callback shorthand\n     * _.findLastKey(users, 'active');\n     * // => 'pebbles'\n     */\n    var findLastKey = createFindKey(baseForOwnRight);\n\n    /**\n     * Iterates over own and inherited enumerable properties of an object invoking\n     * `iteratee` for each property. The `iteratee` is bound to `thisArg` and invoked\n     * with three arguments: (value, key, object). Iteratee functions may exit\n     * iteration early by explicitly returning `false`.\n     *\n     * @static\n     * @memberOf _\n     * @category Object\n     * @param {Object} object The object to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @param {*} [thisArg] The `this` binding of `iteratee`.\n     * @returns {Object} Returns `object`.\n     * @example\n     *\n     * function Foo() {\n     *   this.a = 1;\n     *   this.b = 2;\n     * }\n     *\n     * Foo.prototype.c = 3;\n     *\n     * _.forIn(new Foo, function(value, key) {\n     *   console.log(key);\n     * });\n     * // => logs 'a', 'b', and 'c' (iteration order is not guaranteed)\n     */\n    var forIn = createForIn(baseFor);\n\n    /**\n     * This method is like `_.forIn` except that it iterates over properties of\n     * `object` in the opposite order.\n     *\n     * @static\n     * @memberOf _\n     * @category Object\n     * @param {Object} object The object to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @param {*} [thisArg] The `this` binding of `iteratee`.\n     * @returns {Object} Returns `object`.\n     * @example\n     *\n     * function Foo() {\n     *   this.a = 1;\n     *   this.b = 2;\n     * }\n     *\n     * Foo.prototype.c = 3;\n     *\n     * _.forInRight(new Foo, function(value, key) {\n     *   console.log(key);\n     * });\n     * // => logs 'c', 'b', and 'a' assuming `_.forIn ` logs 'a', 'b', and 'c'\n     */\n    var forInRight = createForIn(baseForRight);\n\n    /**\n     * Iterates over own enumerable properties of an object invoking `iteratee`\n     * for each property. The `iteratee` is bound to `thisArg` and invoked with\n     * three arguments: (value, key, object). Iteratee functions may exit iteration\n     * early by explicitly returning `false`.\n     *\n     * @static\n     * @memberOf _\n     * @category Object\n     * @param {Object} object The object to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @param {*} [thisArg] The `this` binding of `iteratee`.\n     * @returns {Object} Returns `object`.\n     * @example\n     *\n     * function Foo() {\n     *   this.a = 1;\n     *   this.b = 2;\n     * }\n     *\n     * Foo.prototype.c = 3;\n     *\n     * _.forOwn(new Foo, function(value, key) {\n     *   console.log(key);\n     * });\n     * // => logs 'a' and 'b' (iteration order is not guaranteed)\n     */\n    var forOwn = createForOwn(baseForOwn);\n\n    /**\n     * This method is like `_.forOwn` except that it iterates over properties of\n     * `object` in the opposite order.\n     *\n     * @static\n     * @memberOf _\n     * @category Object\n     * @param {Object} object The object to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @param {*} [thisArg] The `this` binding of `iteratee`.\n     * @returns {Object} Returns `object`.\n     * @example\n     *\n     * function Foo() {\n     *   this.a = 1;\n     *   this.b = 2;\n     * }\n     *\n     * Foo.prototype.c = 3;\n     *\n     * _.forOwnRight(new Foo, function(value, key) {\n     *   console.log(key);\n     * });\n     * // => logs 'b' and 'a' assuming `_.forOwn` logs 'a' and 'b'\n     */\n    var forOwnRight = createForOwn(baseForOwnRight);\n\n    /**\n     * Creates an array of function property names from all enumerable properties,\n     * own and inherited, of `object`.\n     *\n     * @static\n     * @memberOf _\n     * @alias methods\n     * @category Object\n     * @param {Object} object The object to inspect.\n     * @returns {Array} Returns the new array of property names.\n     * @example\n     *\n     * _.functions(_);\n     * // => ['after', 'ary', 'assign', ...]\n     */\n    function functions(object) {\n      return baseFunctions(object, keysIn(object));\n    }\n\n    /**\n     * Gets the property value at `path` of `object`. If the resolved value is\n     * `undefined` the `defaultValue` is used in its place.\n     *\n     * @static\n     * @memberOf _\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 if the resolved value is `undefined`.\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     */\n    function get(object, path, defaultValue) {\n      var result = object == null ? undefined : baseGet(object, toPath(path), path + '');\n      return result === undefined ? defaultValue : result;\n    }\n\n    /**\n     * Checks if `path` is a direct property.\n     *\n     * @static\n     * @memberOf _\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` is a direct property, else `false`.\n     * @example\n     *\n     * var object = { 'a': { 'b': { 'c': 3 } } };\n     *\n     * _.has(object, 'a');\n     * // => true\n     *\n     * _.has(object, 'a.b.c');\n     * // => true\n     *\n     * _.has(object, ['a', 'b', 'c']);\n     * // => true\n     */\n    function has(object, path) {\n      if (object == null) {\n        return false;\n      }\n      var result = hasOwnProperty.call(object, path);\n      if (!result && !isKey(path)) {\n        path = toPath(path);\n        object = path.length == 1 ? object : baseGet(object, baseSlice(path, 0, -1));\n        if (object == null) {\n          return false;\n        }\n        path = last(path);\n        result = hasOwnProperty.call(object, path);\n      }\n      return result || (isLength(object.length) && isIndex(path, object.length) &&\n        (isArray(object) || isArguments(object)));\n    }\n\n    /**\n     * Creates an object composed of the inverted keys and values of `object`.\n     * If `object` contains duplicate values, subsequent values overwrite property\n     * assignments of previous values unless `multiValue` is `true`.\n     *\n     * @static\n     * @memberOf _\n     * @category Object\n     * @param {Object} object The object to invert.\n     * @param {boolean} [multiValue] Allow multiple values per key.\n     * @param- {Object} [guard] Enables use as a callback for functions like `_.map`.\n     * @returns {Object} Returns the new inverted object.\n     * @example\n     *\n     * var object = { 'a': 1, 'b': 2, 'c': 1 };\n     *\n     * _.invert(object);\n     * // => { '1': 'c', '2': 'b' }\n     *\n     * // with `multiValue`\n     * _.invert(object, true);\n     * // => { '1': ['a', 'c'], '2': ['b'] }\n     */\n    function invert(object, multiValue, guard) {\n      if (guard && isIterateeCall(object, multiValue, guard)) {\n        multiValue = undefined;\n      }\n      var index = -1,\n          props = keys(object),\n          length = props.length,\n          result = {};\n\n      while (++index < length) {\n        var key = props[index],\n            value = object[key];\n\n        if (multiValue) {\n          if (hasOwnProperty.call(result, value)) {\n            result[value].push(key);\n          } else {\n            result[value] = [key];\n          }\n        }\n        else {\n          result[value] = key;\n        }\n      }\n      return result;\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/6.0/#sec-object.keys)\n     * for more details.\n     *\n     * @static\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     */\n    var keys = !nativeKeys ? shimKeys : function(object) {\n      var Ctor = object == null ? undefined : object.constructor;\n      if ((typeof Ctor == 'function' && Ctor.prototype === object) ||\n          (typeof object != 'function' && isArrayLike(object))) {\n        return shimKeys(object);\n      }\n      return isObject(object) ? nativeKeys(object) : [];\n    };\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     * @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     */\n    function keysIn(object) {\n      if (object == null) {\n        return [];\n      }\n      if (!isObject(object)) {\n        object = Object(object);\n      }\n      var length = object.length;\n      length = (length && isLength(length) &&\n        (isArray(object) || isArguments(object)) && length) || 0;\n\n      var Ctor = object.constructor,\n          index = -1,\n          isProto = typeof Ctor == 'function' && Ctor.prototype === object,\n          result = Array(length),\n          skipIndexes = length > 0;\n\n      while (++index < length) {\n        result[index] = (index + '');\n      }\n      for (var key in object) {\n        if (!(skipIndexes && isIndex(key, length)) &&\n            !(key == 'constructor' && (isProto || !hasOwnProperty.call(object, key)))) {\n          result.push(key);\n        }\n      }\n      return result;\n    }\n\n    /**\n     * The opposite of `_.mapValues`; this method creates an object with the\n     * same values as `object` and keys generated by running each own enumerable\n     * property of `object` through `iteratee`.\n     *\n     * @static\n     * @memberOf _\n     * @category Object\n     * @param {Object} object The object to iterate over.\n     * @param {Function|Object|string} [iteratee=_.identity] The function invoked\n     *  per iteration.\n     * @param {*} [thisArg] The `this` binding of `iteratee`.\n     * @returns {Object} Returns the new mapped object.\n     * @example\n     *\n     * _.mapKeys({ 'a': 1, 'b': 2 }, function(value, key) {\n     *   return key + value;\n     * });\n     * // => { 'a1': 1, 'b2': 2 }\n     */\n    var mapKeys = createObjectMapper(true);\n\n    /**\n     * Creates an object with the same keys as `object` and values generated by\n     * running each own enumerable property of `object` through `iteratee`. The\n     * iteratee function is bound to `thisArg` and invoked with three arguments:\n     * (value, key, object).\n     *\n     * If a property name is provided for `iteratee` the created `_.property`\n     * style callback returns the property value of the given element.\n     *\n     * If a value is also provided for `thisArg` the created `_.matchesProperty`\n     * style callback returns `true` for elements that have a matching property\n     * value, else `false`.\n     *\n     * If an object is provided for `iteratee` the created `_.matches` style\n     * callback returns `true` for elements that have the properties of the given\n     * object, else `false`.\n     *\n     * @static\n     * @memberOf _\n     * @category Object\n     * @param {Object} object The object to iterate over.\n     * @param {Function|Object|string} [iteratee=_.identity] The function invoked\n     *  per iteration.\n     * @param {*} [thisArg] The `this` binding of `iteratee`.\n     * @returns {Object} Returns the new mapped object.\n     * @example\n     *\n     * _.mapValues({ 'a': 1, 'b': 2 }, function(n) {\n     *   return n * 3;\n     * });\n     * // => { 'a': 3, 'b': 6 }\n     *\n     * var users = {\n     *   'fred':    { 'user': 'fred',    'age': 40 },\n     *   'pebbles': { 'user': 'pebbles', 'age': 1 }\n     * };\n     *\n     * // using the `_.property` callback shorthand\n     * _.mapValues(users, 'age');\n     * // => { 'fred': 40, 'pebbles': 1 } (iteration order is not guaranteed)\n     */\n    var mapValues = createObjectMapper();\n\n    /**\n     * The opposite of `_.pick`; this method creates an object composed of the\n     * own and inherited enumerable properties of `object` that are not omitted.\n     *\n     * @static\n     * @memberOf _\n     * @category Object\n     * @param {Object} object The source object.\n     * @param {Function|...(string|string[])} [predicate] The function invoked per\n     *  iteration or property names to omit, specified as individual property\n     *  names or arrays of property names.\n     * @param {*} [thisArg] The `this` binding of `predicate`.\n     * @returns {Object} Returns the new object.\n     * @example\n     *\n     * var object = { 'user': 'fred', 'age': 40 };\n     *\n     * _.omit(object, 'age');\n     * // => { 'user': 'fred' }\n     *\n     * _.omit(object, _.isNumber);\n     * // => { 'user': 'fred' }\n     */\n    var omit = restParam(function(object, props) {\n      if (object == null) {\n        return {};\n      }\n      if (typeof props[0] != 'function') {\n        var props = arrayMap(baseFlatten(props), String);\n        return pickByArray(object, baseDifference(keysIn(object), props));\n      }\n      var predicate = bindCallback(props[0], props[1], 3);\n      return pickByCallback(object, function(value, key, object) {\n        return !predicate(value, key, object);\n      });\n    });\n\n    /**\n     * Creates a two dimensional array of the key-value pairs for `object`,\n     * e.g. `[[key1, value1], [key2, value2]]`.\n     *\n     * @static\n     * @memberOf _\n     * @category Object\n     * @param {Object} object The object to query.\n     * @returns {Array} Returns the new array of key-value pairs.\n     * @example\n     *\n     * _.pairs({ 'barney': 36, 'fred': 40 });\n     * // => [['barney', 36], ['fred', 40]] (iteration order is not guaranteed)\n     */\n    function pairs(object) {\n      object = toObject(object);\n\n      var index = -1,\n          props = keys(object),\n          length = props.length,\n          result = Array(length);\n\n      while (++index < length) {\n        var key = props[index];\n        result[index] = [key, object[key]];\n      }\n      return result;\n    }\n\n    /**\n     * Creates an object composed of the picked `object` properties. Property\n     * names may be specified as individual arguments or as arrays of property\n     * names. If `predicate` is provided it is invoked for each property of `object`\n     * picking the properties `predicate` returns truthy for. The predicate is\n     * bound to `thisArg` and invoked with three arguments: (value, key, object).\n     *\n     * @static\n     * @memberOf _\n     * @category Object\n     * @param {Object} object The source object.\n     * @param {Function|...(string|string[])} [predicate] The function invoked per\n     *  iteration or property names to pick, specified as individual property\n     *  names or arrays of property names.\n     * @param {*} [thisArg] The `this` binding of `predicate`.\n     * @returns {Object} Returns the new object.\n     * @example\n     *\n     * var object = { 'user': 'fred', 'age': 40 };\n     *\n     * _.pick(object, 'user');\n     * // => { 'user': 'fred' }\n     *\n     * _.pick(object, _.isString);\n     * // => { 'user': 'fred' }\n     */\n    var pick = restParam(function(object, props) {\n      if (object == null) {\n        return {};\n      }\n      return typeof props[0] == 'function'\n        ? pickByCallback(object, bindCallback(props[0], props[1], 3))\n        : pickByArray(object, baseFlatten(props));\n    });\n\n    /**\n     * This method is like `_.get` except that if the resolved value is a function\n     * it is invoked with the `this` binding of its parent object and its result\n     * is returned.\n     *\n     * @static\n     * @memberOf _\n     * @category Object\n     * @param {Object} object The object to query.\n     * @param {Array|string} path The path of the property to resolve.\n     * @param {*} [defaultValue] The value returned if the resolved value is `undefined`.\n     * @returns {*} Returns the resolved value.\n     * @example\n     *\n     * var object = { 'a': [{ 'b': { 'c1': 3, 'c2': _.constant(4) } }] };\n     *\n     * _.result(object, 'a[0].b.c1');\n     * // => 3\n     *\n     * _.result(object, 'a[0].b.c2');\n     * // => 4\n     *\n     * _.result(object, 'a.b.c', 'default');\n     * // => 'default'\n     *\n     * _.result(object, 'a.b.c', _.constant('default'));\n     * // => 'default'\n     */\n    function result(object, path, defaultValue) {\n      var result = object == null ? undefined : object[path];\n      if (result === undefined) {\n        if (object != null && !isKey(path, object)) {\n          path = toPath(path);\n          object = path.length == 1 ? object : baseGet(object, baseSlice(path, 0, -1));\n          result = object == null ? undefined : object[last(path)];\n        }\n        result = result === undefined ? defaultValue : result;\n      }\n      return isFunction(result) ? result.call(object) : result;\n    }\n\n    /**\n     * Sets the property value of `path` on `object`. If a portion of `path`\n     * does not exist it is created.\n     *\n     * @static\n     * @memberOf _\n     * @category Object\n     * @param {Object} object The object to augment.\n     * @param {Array|string} path The path of the property to set.\n     * @param {*} value The value to set.\n     * @returns {Object} Returns `object`.\n     * @example\n     *\n     * var object = { 'a': [{ 'b': { 'c': 3 } }] };\n     *\n     * _.set(object, 'a[0].b.c', 4);\n     * console.log(object.a[0].b.c);\n     * // => 4\n     *\n     * _.set(object, 'x[0].y.z', 5);\n     * console.log(object.x[0].y.z);\n     * // => 5\n     */\n    function set(object, path, value) {\n      if (object == null) {\n        return object;\n      }\n      var pathKey = (path + '');\n      path = (object[pathKey] != null || isKey(path, object)) ? [pathKey] : toPath(path);\n\n      var index = -1,\n          length = path.length,\n          lastIndex = length - 1,\n          nested = object;\n\n      while (nested != null && ++index < length) {\n        var key = path[index];\n        if (isObject(nested)) {\n          if (index == lastIndex) {\n            nested[key] = value;\n          } else if (nested[key] == null) {\n            nested[key] = isIndex(path[index + 1]) ? [] : {};\n          }\n        }\n        nested = nested[key];\n      }\n      return object;\n    }\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 enumerable\n     * properties through `iteratee`, with each invocation potentially mutating\n     * the `accumulator` object. The `iteratee` is bound to `thisArg` and invoked\n     * with four arguments: (accumulator, value, key, object). Iteratee functions\n     * may exit iteration early by explicitly returning `false`.\n     *\n     * @static\n     * @memberOf _\n     * @category Object\n     * @param {Array|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     * @param {*} [thisArg] The `this` binding of `iteratee`.\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 }, function(result, n, key) {\n     *   result[key] = n * 3;\n     * });\n     * // => { 'a': 3, 'b': 6 }\n     */\n    function transform(object, iteratee, accumulator, thisArg) {\n      var isArr = isArray(object) || isTypedArray(object);\n      iteratee = getCallback(iteratee, thisArg, 4);\n\n      if (accumulator == null) {\n        if (isArr || isObject(object)) {\n          var Ctor = object.constructor;\n          if (isArr) {\n            accumulator = isArray(object) ? new Ctor : [];\n          } else {\n            accumulator = baseCreate(isFunction(Ctor) ? Ctor.prototype : undefined);\n          }\n        } else {\n          accumulator = {};\n        }\n      }\n      (isArr ? arrayEach : baseForOwn)(object, function(value, index, object) {\n        return iteratee(accumulator, value, index, object);\n      });\n      return accumulator;\n    }\n\n    /**\n     * Creates an array of the own enumerable property values of `object`.\n     *\n     * **Note:** Non-object values are coerced to objects.\n     *\n     * @static\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     */\n    function values(object) {\n      return baseValues(object, keys(object));\n    }\n\n    /**\n     * Creates an array of the own and inherited enumerable property values\n     * of `object`.\n     *\n     * **Note:** Non-object values are coerced to objects.\n     *\n     * @static\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     * _.valuesIn(new Foo);\n     * // => [1, 2, 3] (iteration order is not guaranteed)\n     */\n    function valuesIn(object) {\n      return baseValues(object, keysIn(object));\n    }\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Checks if `n` is between `start` and up to but not including, `end`. If\n     * `end` is not specified it is set to `start` with `start` then set to `0`.\n     *\n     * @static\n     * @memberOf _\n     * @category Number\n     * @param {number} n The number to check.\n     * @param {number} [start=0] The start of the range.\n     * @param {number} end The end of the range.\n     * @returns {boolean} Returns `true` if `n` is in the range, else `false`.\n     * @example\n     *\n     * _.inRange(3, 2, 4);\n     * // => true\n     *\n     * _.inRange(4, 8);\n     * // => true\n     *\n     * _.inRange(4, 2);\n     * // => false\n     *\n     * _.inRange(2, 2);\n     * // => false\n     *\n     * _.inRange(1.2, 2);\n     * // => true\n     *\n     * _.inRange(5.2, 4);\n     * // => false\n     */\n    function inRange(value, start, end) {\n      start = +start || 0;\n      if (end === undefined) {\n        end = start;\n        start = 0;\n      } else {\n        end = +end || 0;\n      }\n      return value >= nativeMin(start, end) && value < nativeMax(start, end);\n    }\n\n    /**\n     * Produces a random number between `min` and `max` (inclusive). If only one\n     * argument is provided a number between `0` and the given number is returned.\n     * If `floating` is `true`, or either `min` or `max` are floats, a floating-point\n     * number is returned instead of an integer.\n     *\n     * @static\n     * @memberOf _\n     * @category Number\n     * @param {number} [min=0] The minimum possible value.\n     * @param {number} [max=1] The maximum possible value.\n     * @param {boolean} [floating] Specify returning a floating-point number.\n     * @returns {number} Returns the random number.\n     * @example\n     *\n     * _.random(0, 5);\n     * // => an integer between 0 and 5\n     *\n     * _.random(5);\n     * // => also an integer between 0 and 5\n     *\n     * _.random(5, true);\n     * // => a floating-point number between 0 and 5\n     *\n     * _.random(1.2, 5.2);\n     * // => a floating-point number between 1.2 and 5.2\n     */\n    function random(min, max, floating) {\n      if (floating && isIterateeCall(min, max, floating)) {\n        max = floating = undefined;\n      }\n      var noMin = min == null,\n          noMax = max == null;\n\n      if (floating == null) {\n        if (noMax && typeof min == 'boolean') {\n          floating = min;\n          min = 1;\n        }\n        else if (typeof max == 'boolean') {\n          floating = max;\n          noMax = true;\n        }\n      }\n      if (noMin && noMax) {\n        max = 1;\n        noMax = false;\n      }\n      min = +min || 0;\n      if (noMax) {\n        max = min;\n        min = 0;\n      } else {\n        max = +max || 0;\n      }\n      if (floating || min % 1 || max % 1) {\n        var rand = nativeRandom();\n        return nativeMin(min + (rand * (max - min + parseFloat('1e-' + ((rand + '').length - 1)))), max);\n      }\n      return baseRandom(min, max);\n    }\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Converts `string` to [camel case](https://en.wikipedia.org/wiki/CamelCase).\n     *\n     * @static\n     * @memberOf _\n     * @category String\n     * @param {string} [string=''] The string to convert.\n     * @returns {string} Returns the camel cased string.\n     * @example\n     *\n     * _.camelCase('Foo Bar');\n     * // => 'fooBar'\n     *\n     * _.camelCase('--foo-bar');\n     * // => 'fooBar'\n     *\n     * _.camelCase('__foo_bar__');\n     * // => 'fooBar'\n     */\n    var camelCase = createCompounder(function(result, word, index) {\n      word = word.toLowerCase();\n      return result + (index ? (word.charAt(0).toUpperCase() + word.slice(1)) : word);\n    });\n\n    /**\n     * Capitalizes the first character of `string`.\n     *\n     * @static\n     * @memberOf _\n     * @category String\n     * @param {string} [string=''] The string to capitalize.\n     * @returns {string} Returns the capitalized string.\n     * @example\n     *\n     * _.capitalize('fred');\n     * // => 'Fred'\n     */\n    function capitalize(string) {\n      string = baseToString(string);\n      return string && (string.charAt(0).toUpperCase() + string.slice(1));\n    }\n\n    /**\n     * Deburrs `string` by converting [latin-1 supplementary letters](https://en.wikipedia.org/wiki/Latin-1_Supplement_(Unicode_block)#Character_table)\n     * to basic latin letters and removing [combining diacritical marks](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks).\n     *\n     * @static\n     * @memberOf _\n     * @category String\n     * @param {string} [string=''] The string to deburr.\n     * @returns {string} Returns the deburred string.\n     * @example\n     *\n     * _.deburr('déjà vu');\n     * // => 'deja vu'\n     */\n    function deburr(string) {\n      string = baseToString(string);\n      return string && string.replace(reLatin1, deburrLetter).replace(reComboMark, '');\n    }\n\n    /**\n     * Checks if `string` ends with the given target string.\n     *\n     * @static\n     * @memberOf _\n     * @category String\n     * @param {string} [string=''] The string to search.\n     * @param {string} [target] The string to search for.\n     * @param {number} [position=string.length] The position to search from.\n     * @returns {boolean} Returns `true` if `string` ends with `target`, else `false`.\n     * @example\n     *\n     * _.endsWith('abc', 'c');\n     * // => true\n     *\n     * _.endsWith('abc', 'b');\n     * // => false\n     *\n     * _.endsWith('abc', 'b', 2);\n     * // => true\n     */\n    function endsWith(string, target, position) {\n      string = baseToString(string);\n      target = (target + '');\n\n      var length = string.length;\n      position = position === undefined\n        ? length\n        : nativeMin(position < 0 ? 0 : (+position || 0), length);\n\n      position -= target.length;\n      return position >= 0 && string.indexOf(target, position) == position;\n    }\n\n    /**\n     * Converts the characters \"&\", \"<\", \">\", '\"', \"'\", and \"\\`\", in `string` to\n     * their corresponding HTML entities.\n     *\n     * **Note:** No other characters are escaped. To escape additional characters\n     * use a third-party library like [_he_](https://mths.be/he).\n     *\n     * Though the \">\" character is escaped for symmetry, characters like\n     * \">\" and \"/\" don't need escaping in HTML and have no special meaning\n     * unless they're part of a tag or unquoted attribute value.\n     * See [Mathias Bynens's article](https://mathiasbynens.be/notes/ambiguous-ampersands)\n     * (under \"semi-related fun fact\") for more details.\n     *\n     * Backticks are escaped because in Internet Explorer < 9, they can break out\n     * of attribute values or HTML comments. See [#59](https://html5sec.org/#59),\n     * [#102](https://html5sec.org/#102), [#108](https://html5sec.org/#108), and\n     * [#133](https://html5sec.org/#133) of the [HTML5 Security Cheatsheet](https://html5sec.org/)\n     * for more details.\n     *\n     * When working with HTML you should always [quote attribute values](http://wonko.com/post/html-escaping)\n     * to reduce XSS vectors.\n     *\n     * @static\n     * @memberOf _\n     * @category String\n     * @param {string} [string=''] The string to escape.\n     * @returns {string} Returns the escaped string.\n     * @example\n     *\n     * _.escape('fred, barney, & pebbles');\n     * // => 'fred, barney, &amp; pebbles'\n     */\n    function escape(string) {\n      // Reset `lastIndex` because in IE < 9 `String#replace` does not.\n      string = baseToString(string);\n      return (string && reHasUnescapedHtml.test(string))\n        ? string.replace(reUnescapedHtml, escapeHtmlChar)\n        : string;\n    }\n\n    /**\n     * Escapes the `RegExp` special characters \"\\\", \"/\", \"^\", \"$\", \".\", \"|\", \"?\",\n     * \"*\", \"+\", \"(\", \")\", \"[\", \"]\", \"{\" and \"}\" in `string`.\n     *\n     * @static\n     * @memberOf _\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     */\n    function escapeRegExp(string) {\n      string = baseToString(string);\n      return (string && reHasRegExpChars.test(string))\n        ? string.replace(reRegExpChars, escapeRegExpChar)\n        : (string || '(?:)');\n    }\n\n    /**\n     * Converts `string` to [kebab case](https://en.wikipedia.org/wiki/Letter_case#Special_case_styles).\n     *\n     * @static\n     * @memberOf _\n     * @category String\n     * @param {string} [string=''] The string to convert.\n     * @returns {string} Returns the kebab cased string.\n     * @example\n     *\n     * _.kebabCase('Foo Bar');\n     * // => 'foo-bar'\n     *\n     * _.kebabCase('fooBar');\n     * // => 'foo-bar'\n     *\n     * _.kebabCase('__foo_bar__');\n     * // => 'foo-bar'\n     */\n    var kebabCase = createCompounder(function(result, word, index) {\n      return result + (index ? '-' : '') + word.toLowerCase();\n    });\n\n    /**\n     * Pads `string` on the left and right sides if it's shorter than `length`.\n     * Padding characters are truncated if they can't be evenly divided by `length`.\n     *\n     * @static\n     * @memberOf _\n     * @category String\n     * @param {string} [string=''] The string to pad.\n     * @param {number} [length=0] The padding length.\n     * @param {string} [chars=' '] The string used as padding.\n     * @returns {string} Returns the padded string.\n     * @example\n     *\n     * _.pad('abc', 8);\n     * // => '  abc   '\n     *\n     * _.pad('abc', 8, '_-');\n     * // => '_-abc_-_'\n     *\n     * _.pad('abc', 3);\n     * // => 'abc'\n     */\n    function pad(string, length, chars) {\n      string = baseToString(string);\n      length = +length;\n\n      var strLength = string.length;\n      if (strLength >= length || !nativeIsFinite(length)) {\n        return string;\n      }\n      var mid = (length - strLength) / 2,\n          leftLength = nativeFloor(mid),\n          rightLength = nativeCeil(mid);\n\n      chars = createPadding('', rightLength, chars);\n      return chars.slice(0, leftLength) + string + chars;\n    }\n\n    /**\n     * Pads `string` on the left side if it's shorter than `length`. Padding\n     * characters are truncated if they exceed `length`.\n     *\n     * @static\n     * @memberOf _\n     * @category String\n     * @param {string} [string=''] The string to pad.\n     * @param {number} [length=0] The padding length.\n     * @param {string} [chars=' '] The string used as padding.\n     * @returns {string} Returns the padded string.\n     * @example\n     *\n     * _.padLeft('abc', 6);\n     * // => '   abc'\n     *\n     * _.padLeft('abc', 6, '_-');\n     * // => '_-_abc'\n     *\n     * _.padLeft('abc', 3);\n     * // => 'abc'\n     */\n    var padLeft = createPadDir();\n\n    /**\n     * Pads `string` on the right side if it's shorter than `length`. Padding\n     * characters are truncated if they exceed `length`.\n     *\n     * @static\n     * @memberOf _\n     * @category String\n     * @param {string} [string=''] The string to pad.\n     * @param {number} [length=0] The padding length.\n     * @param {string} [chars=' '] The string used as padding.\n     * @returns {string} Returns the padded string.\n     * @example\n     *\n     * _.padRight('abc', 6);\n     * // => 'abc   '\n     *\n     * _.padRight('abc', 6, '_-');\n     * // => 'abc_-_'\n     *\n     * _.padRight('abc', 3);\n     * // => 'abc'\n     */\n    var padRight = createPadDir(true);\n\n    /**\n     * Converts `string` to an integer of the specified radix. If `radix` is\n     * `undefined` or `0`, a `radix` of `10` is used unless `value` is a hexadecimal,\n     * in which case a `radix` of `16` is used.\n     *\n     * **Note:** This method aligns with the [ES5 implementation](https://es5.github.io/#E)\n     * of `parseInt`.\n     *\n     * @static\n     * @memberOf _\n     * @category String\n     * @param {string} string The string to convert.\n     * @param {number} [radix] The radix to interpret `value` by.\n     * @param- {Object} [guard] Enables use as a callback for functions like `_.map`.\n     * @returns {number} Returns the converted integer.\n     * @example\n     *\n     * _.parseInt('08');\n     * // => 8\n     *\n     * _.map(['6', '08', '10'], _.parseInt);\n     * // => [6, 8, 10]\n     */\n    function parseInt(string, radix, guard) {\n      // Firefox < 21 and Opera < 15 follow ES3 for `parseInt`.\n      // Chrome fails to trim leading <BOM> whitespace characters.\n      // See https://code.google.com/p/v8/issues/detail?id=3109 for more details.\n      if (guard ? isIterateeCall(string, radix, guard) : radix == null) {\n        radix = 0;\n      } else if (radix) {\n        radix = +radix;\n      }\n      string = trim(string);\n      return nativeParseInt(string, radix || (reHasHexPrefix.test(string) ? 16 : 10));\n    }\n\n    /**\n     * Repeats the given string `n` times.\n     *\n     * @static\n     * @memberOf _\n     * @category String\n     * @param {string} [string=''] The string to repeat.\n     * @param {number} [n=0] The number of times to repeat the string.\n     * @returns {string} Returns the repeated string.\n     * @example\n     *\n     * _.repeat('*', 3);\n     * // => '***'\n     *\n     * _.repeat('abc', 2);\n     * // => 'abcabc'\n     *\n     * _.repeat('abc', 0);\n     * // => ''\n     */\n    function repeat(string, n) {\n      var result = '';\n      string = baseToString(string);\n      n = +n;\n      if (n < 1 || !string || !nativeIsFinite(n)) {\n        return result;\n      }\n      // Leverage the exponentiation by squaring algorithm for a faster repeat.\n      // See https://en.wikipedia.org/wiki/Exponentiation_by_squaring for more details.\n      do {\n        if (n % 2) {\n          result += string;\n        }\n        n = nativeFloor(n / 2);\n        string += string;\n      } while (n);\n\n      return result;\n    }\n\n    /**\n     * Converts `string` to [snake case](https://en.wikipedia.org/wiki/Snake_case).\n     *\n     * @static\n     * @memberOf _\n     * @category String\n     * @param {string} [string=''] The string to convert.\n     * @returns {string} Returns the snake cased string.\n     * @example\n     *\n     * _.snakeCase('Foo Bar');\n     * // => 'foo_bar'\n     *\n     * _.snakeCase('fooBar');\n     * // => 'foo_bar'\n     *\n     * _.snakeCase('--foo-bar');\n     * // => 'foo_bar'\n     */\n    var snakeCase = createCompounder(function(result, word, index) {\n      return result + (index ? '_' : '') + word.toLowerCase();\n    });\n\n    /**\n     * Converts `string` to [start case](https://en.wikipedia.org/wiki/Letter_case#Stylistic_or_specialised_usage).\n     *\n     * @static\n     * @memberOf _\n     * @category String\n     * @param {string} [string=''] The string to convert.\n     * @returns {string} Returns the start cased string.\n     * @example\n     *\n     * _.startCase('--foo-bar');\n     * // => 'Foo Bar'\n     *\n     * _.startCase('fooBar');\n     * // => 'Foo Bar'\n     *\n     * _.startCase('__foo_bar__');\n     * // => 'Foo Bar'\n     */\n    var startCase = createCompounder(function(result, word, index) {\n      return result + (index ? ' ' : '') + (word.charAt(0).toUpperCase() + word.slice(1));\n    });\n\n    /**\n     * Checks if `string` starts with the given target string.\n     *\n     * @static\n     * @memberOf _\n     * @category String\n     * @param {string} [string=''] The string to search.\n     * @param {string} [target] The string to search for.\n     * @param {number} [position=0] The position to search from.\n     * @returns {boolean} Returns `true` if `string` starts with `target`, else `false`.\n     * @example\n     *\n     * _.startsWith('abc', 'a');\n     * // => true\n     *\n     * _.startsWith('abc', 'b');\n     * // => false\n     *\n     * _.startsWith('abc', 'b', 1);\n     * // => true\n     */\n    function startsWith(string, target, position) {\n      string = baseToString(string);\n      position = position == null\n        ? 0\n        : nativeMin(position < 0 ? 0 : (+position || 0), string.length);\n\n      return string.lastIndexOf(target, position) == position;\n    }\n\n    /**\n     * Creates a compiled template function that can interpolate data properties\n     * in \"interpolate\" delimiters, HTML-escape interpolated data properties in\n     * \"escape\" delimiters, and execute JavaScript in \"evaluate\" delimiters. Data\n     * properties may be accessed as free variables in the template. If a setting\n     * object is provided it takes precedence over `_.templateSettings` values.\n     *\n     * **Note:** In the development build `_.template` utilizes\n     * [sourceURLs](http://www.html5rocks.com/en/tutorials/developertools/sourcemaps/#toc-sourceurl)\n     * for easier debugging.\n     *\n     * For more information on precompiling templates see\n     * [lodash's custom builds documentation](https://lodash.com/custom-builds).\n     *\n     * For more information on Chrome extension sandboxes see\n     * [Chrome's extensions documentation](https://developer.chrome.com/extensions/sandboxingEval).\n     *\n     * @static\n     * @memberOf _\n     * @category String\n     * @param {string} [string=''] The template string.\n     * @param {Object} [options] The options object.\n     * @param {RegExp} [options.escape] The HTML \"escape\" delimiter.\n     * @param {RegExp} [options.evaluate] The \"evaluate\" delimiter.\n     * @param {Object} [options.imports] An object to import into the template as free variables.\n     * @param {RegExp} [options.interpolate] The \"interpolate\" delimiter.\n     * @param {string} [options.sourceURL] The sourceURL of the template's compiled source.\n     * @param {string} [options.variable] The data object variable name.\n     * @param- {Object} [otherOptions] Enables the legacy `options` param signature.\n     * @returns {Function} Returns the compiled template function.\n     * @example\n     *\n     * // using the \"interpolate\" delimiter to create a compiled template\n     * var compiled = _.template('hello <%= user %>!');\n     * compiled({ 'user': 'fred' });\n     * // => 'hello fred!'\n     *\n     * // using the HTML \"escape\" delimiter to escape data property values\n     * var compiled = _.template('<b><%- value %></b>');\n     * compiled({ 'value': '<script>' });\n     * // => '<b>&lt;script&gt;</b>'\n     *\n     * // using the \"evaluate\" delimiter to execute JavaScript and generate HTML\n     * var compiled = _.template('<% _.forEach(users, function(user) { %><li><%- user %></li><% }); %>');\n     * compiled({ 'users': ['fred', 'barney'] });\n     * // => '<li>fred</li><li>barney</li>'\n     *\n     * // using the internal `print` function in \"evaluate\" delimiters\n     * var compiled = _.template('<% print(\"hello \" + user); %>!');\n     * compiled({ 'user': 'barney' });\n     * // => 'hello barney!'\n     *\n     * // using the ES delimiter as an alternative to the default \"interpolate\" delimiter\n     * var compiled = _.template('hello ${ user }!');\n     * compiled({ 'user': 'pebbles' });\n     * // => 'hello pebbles!'\n     *\n     * // using custom template delimiters\n     * _.templateSettings.interpolate = /{{([\\s\\S]+?)}}/g;\n     * var compiled = _.template('hello {{ user }}!');\n     * compiled({ 'user': 'mustache' });\n     * // => 'hello mustache!'\n     *\n     * // using backslashes to treat delimiters as plain text\n     * var compiled = _.template('<%= \"\\\\<%- value %\\\\>\" %>');\n     * compiled({ 'value': 'ignored' });\n     * // => '<%- value %>'\n     *\n     * // using the `imports` option to import `jQuery` as `jq`\n     * var text = '<% jq.each(users, function(user) { %><li><%- user %></li><% }); %>';\n     * var compiled = _.template(text, { 'imports': { 'jq': jQuery } });\n     * compiled({ 'users': ['fred', 'barney'] });\n     * // => '<li>fred</li><li>barney</li>'\n     *\n     * // using the `sourceURL` option to specify a custom sourceURL for the template\n     * var compiled = _.template('hello <%= user %>!', { 'sourceURL': '/basic/greeting.jst' });\n     * compiled(data);\n     * // => find the source of \"greeting.jst\" under the Sources tab or Resources panel of the web inspector\n     *\n     * // using the `variable` option to ensure a with-statement isn't used in the compiled template\n     * var compiled = _.template('hi <%= data.user %>!', { 'variable': 'data' });\n     * compiled.source;\n     * // => function(data) {\n     * //   var __t, __p = '';\n     * //   __p += 'hi ' + ((__t = ( data.user )) == null ? '' : __t) + '!';\n     * //   return __p;\n     * // }\n     *\n     * // using the `source` property to inline compiled templates for meaningful\n     * // line numbers in error messages and a stack trace\n     * fs.writeFileSync(path.join(cwd, 'jst.js'), '\\\n     *   var JST = {\\\n     *     \"main\": ' + _.template(mainText).source + '\\\n     *   };\\\n     * ');\n     */\n    function template(string, options, otherOptions) {\n      // Based on John Resig's `tmpl` implementation (http://ejohn.org/blog/javascript-micro-templating/)\n      // and Laura Doktorova's doT.js (https://github.com/olado/doT).\n      var settings = lodash.templateSettings;\n\n      if (otherOptions && isIterateeCall(string, options, otherOptions)) {\n        options = otherOptions = undefined;\n      }\n      string = baseToString(string);\n      options = assignWith(baseAssign({}, otherOptions || options), settings, assignOwnDefaults);\n\n      var imports = assignWith(baseAssign({}, options.imports), settings.imports, assignOwnDefaults),\n          importsKeys = keys(imports),\n          importsValues = baseValues(imports, importsKeys);\n\n      var isEscaping,\n          isEvaluating,\n          index = 0,\n          interpolate = options.interpolate || reNoMatch,\n          source = \"__p += '\";\n\n      // Compile the regexp to match each delimiter.\n      var reDelimiters = RegExp(\n        (options.escape || reNoMatch).source + '|' +\n        interpolate.source + '|' +\n        (interpolate === reInterpolate ? reEsTemplate : reNoMatch).source + '|' +\n        (options.evaluate || reNoMatch).source + '|$'\n      , 'g');\n\n      // Use a sourceURL for easier debugging.\n      var sourceURL = '//# sourceURL=' +\n        ('sourceURL' in options\n          ? options.sourceURL\n          : ('lodash.templateSources[' + (++templateCounter) + ']')\n        ) + '\\n';\n\n      string.replace(reDelimiters, function(match, escapeValue, interpolateValue, esTemplateValue, evaluateValue, offset) {\n        interpolateValue || (interpolateValue = esTemplateValue);\n\n        // Escape characters that can't be included in string literals.\n        source += string.slice(index, offset).replace(reUnescapedString, escapeStringChar);\n\n        // Replace delimiters with snippets.\n        if (escapeValue) {\n          isEscaping = true;\n          source += \"' +\\n__e(\" + escapeValue + \") +\\n'\";\n        }\n        if (evaluateValue) {\n          isEvaluating = true;\n          source += \"';\\n\" + evaluateValue + \";\\n__p += '\";\n        }\n        if (interpolateValue) {\n          source += \"' +\\n((__t = (\" + interpolateValue + \")) == null ? '' : __t) +\\n'\";\n        }\n        index = offset + match.length;\n\n        // The JS engine embedded in Adobe products requires returning the `match`\n        // string in order to produce the correct `offset` value.\n        return match;\n      });\n\n      source += \"';\\n\";\n\n      // If `variable` is not specified wrap a with-statement around the generated\n      // code to add the data object to the top of the scope chain.\n      var variable = options.variable;\n      if (!variable) {\n        source = 'with (obj) {\\n' + source + '\\n}\\n';\n      }\n      // Cleanup code by stripping empty strings.\n      source = (isEvaluating ? source.replace(reEmptyStringLeading, '') : source)\n        .replace(reEmptyStringMiddle, '$1')\n        .replace(reEmptyStringTrailing, '$1;');\n\n      // Frame code as the function body.\n      source = 'function(' + (variable || 'obj') + ') {\\n' +\n        (variable\n          ? ''\n          : 'obj || (obj = {});\\n'\n        ) +\n        \"var __t, __p = ''\" +\n        (isEscaping\n           ? ', __e = _.escape'\n           : ''\n        ) +\n        (isEvaluating\n          ? ', __j = Array.prototype.join;\\n' +\n            \"function print() { __p += __j.call(arguments, '') }\\n\"\n          : ';\\n'\n        ) +\n        source +\n        'return __p\\n}';\n\n      var result = attempt(function() {\n        return Function(importsKeys, sourceURL + 'return ' + source).apply(undefined, importsValues);\n      });\n\n      // Provide the compiled function's source by its `toString` method or\n      // the `source` property as a convenience for inlining compiled templates.\n      result.source = source;\n      if (isError(result)) {\n        throw result;\n      }\n      return result;\n    }\n\n    /**\n     * Removes leading and trailing whitespace or specified characters from `string`.\n     *\n     * @static\n     * @memberOf _\n     * @category String\n     * @param {string} [string=''] The string to trim.\n     * @param {string} [chars=whitespace] The characters to trim.\n     * @param- {Object} [guard] Enables use as a callback for functions like `_.map`.\n     * @returns {string} Returns the trimmed string.\n     * @example\n     *\n     * _.trim('  abc  ');\n     * // => 'abc'\n     *\n     * _.trim('-_-abc-_-', '_-');\n     * // => 'abc'\n     *\n     * _.map(['  foo  ', '  bar  '], _.trim);\n     * // => ['foo', 'bar']\n     */\n    function trim(string, chars, guard) {\n      var value = string;\n      string = baseToString(string);\n      if (!string) {\n        return string;\n      }\n      if (guard ? isIterateeCall(value, chars, guard) : chars == null) {\n        return string.slice(trimmedLeftIndex(string), trimmedRightIndex(string) + 1);\n      }\n      chars = (chars + '');\n      return string.slice(charsLeftIndex(string, chars), charsRightIndex(string, chars) + 1);\n    }\n\n    /**\n     * Removes leading whitespace or specified characters from `string`.\n     *\n     * @static\n     * @memberOf _\n     * @category String\n     * @param {string} [string=''] The string to trim.\n     * @param {string} [chars=whitespace] The characters to trim.\n     * @param- {Object} [guard] Enables use as a callback for functions like `_.map`.\n     * @returns {string} Returns the trimmed string.\n     * @example\n     *\n     * _.trimLeft('  abc  ');\n     * // => 'abc  '\n     *\n     * _.trimLeft('-_-abc-_-', '_-');\n     * // => 'abc-_-'\n     */\n    function trimLeft(string, chars, guard) {\n      var value = string;\n      string = baseToString(string);\n      if (!string) {\n        return string;\n      }\n      if (guard ? isIterateeCall(value, chars, guard) : chars == null) {\n        return string.slice(trimmedLeftIndex(string));\n      }\n      return string.slice(charsLeftIndex(string, (chars + '')));\n    }\n\n    /**\n     * Removes trailing whitespace or specified characters from `string`.\n     *\n     * @static\n     * @memberOf _\n     * @category String\n     * @param {string} [string=''] The string to trim.\n     * @param {string} [chars=whitespace] The characters to trim.\n     * @param- {Object} [guard] Enables use as a callback for functions like `_.map`.\n     * @returns {string} Returns the trimmed string.\n     * @example\n     *\n     * _.trimRight('  abc  ');\n     * // => '  abc'\n     *\n     * _.trimRight('-_-abc-_-', '_-');\n     * // => '-_-abc'\n     */\n    function trimRight(string, chars, guard) {\n      var value = string;\n      string = baseToString(string);\n      if (!string) {\n        return string;\n      }\n      if (guard ? isIterateeCall(value, chars, guard) : chars == null) {\n        return string.slice(0, trimmedRightIndex(string) + 1);\n      }\n      return string.slice(0, charsRightIndex(string, (chars + '')) + 1);\n    }\n\n    /**\n     * Truncates `string` if it's longer than the given maximum string length.\n     * The last characters of the truncated string are replaced with the omission\n     * string which defaults to \"...\".\n     *\n     * @static\n     * @memberOf _\n     * @category String\n     * @param {string} [string=''] The string to truncate.\n     * @param {Object|number} [options] The options object or maximum string length.\n     * @param {number} [options.length=30] The maximum string length.\n     * @param {string} [options.omission='...'] The string to indicate text is omitted.\n     * @param {RegExp|string} [options.separator] The separator pattern to truncate to.\n     * @param- {Object} [guard] Enables use as a callback for functions like `_.map`.\n     * @returns {string} Returns the truncated string.\n     * @example\n     *\n     * _.trunc('hi-diddly-ho there, neighborino');\n     * // => 'hi-diddly-ho there, neighbo...'\n     *\n     * _.trunc('hi-diddly-ho there, neighborino', 24);\n     * // => 'hi-diddly-ho there, n...'\n     *\n     * _.trunc('hi-diddly-ho there, neighborino', {\n     *   'length': 24,\n     *   'separator': ' '\n     * });\n     * // => 'hi-diddly-ho there,...'\n     *\n     * _.trunc('hi-diddly-ho there, neighborino', {\n     *   'length': 24,\n     *   'separator': /,? +/\n     * });\n     * // => 'hi-diddly-ho there...'\n     *\n     * _.trunc('hi-diddly-ho there, neighborino', {\n     *   'omission': ' [...]'\n     * });\n     * // => 'hi-diddly-ho there, neig [...]'\n     */\n    function trunc(string, options, guard) {\n      if (guard && isIterateeCall(string, options, guard)) {\n        options = undefined;\n      }\n      var length = DEFAULT_TRUNC_LENGTH,\n          omission = DEFAULT_TRUNC_OMISSION;\n\n      if (options != null) {\n        if (isObject(options)) {\n          var separator = 'separator' in options ? options.separator : separator;\n          length = 'length' in options ? (+options.length || 0) : length;\n          omission = 'omission' in options ? baseToString(options.omission) : omission;\n        } else {\n          length = +options || 0;\n        }\n      }\n      string = baseToString(string);\n      if (length >= string.length) {\n        return string;\n      }\n      var end = length - omission.length;\n      if (end < 1) {\n        return omission;\n      }\n      var result = string.slice(0, end);\n      if (separator == null) {\n        return result + omission;\n      }\n      if (isRegExp(separator)) {\n        if (string.slice(end).search(separator)) {\n          var match,\n              newEnd,\n              substring = string.slice(0, end);\n\n          if (!separator.global) {\n            separator = RegExp(separator.source, (reFlags.exec(separator) || '') + 'g');\n          }\n          separator.lastIndex = 0;\n          while ((match = separator.exec(substring))) {\n            newEnd = match.index;\n          }\n          result = result.slice(0, newEnd == null ? end : newEnd);\n        }\n      } else if (string.indexOf(separator, end) != end) {\n        var index = result.lastIndexOf(separator);\n        if (index > -1) {\n          result = result.slice(0, index);\n        }\n      }\n      return result + omission;\n    }\n\n    /**\n     * The inverse of `_.escape`; this method converts the HTML entities\n     * `&amp;`, `&lt;`, `&gt;`, `&quot;`, `&#39;`, and `&#96;` in `string` to their\n     * corresponding characters.\n     *\n     * **Note:** No other HTML entities are unescaped. To unescape additional HTML\n     * entities use a third-party library like [_he_](https://mths.be/he).\n     *\n     * @static\n     * @memberOf _\n     * @category String\n     * @param {string} [string=''] The string to unescape.\n     * @returns {string} Returns the unescaped string.\n     * @example\n     *\n     * _.unescape('fred, barney, &amp; pebbles');\n     * // => 'fred, barney, & pebbles'\n     */\n    function unescape(string) {\n      string = baseToString(string);\n      return (string && reHasEscapedHtml.test(string))\n        ? string.replace(reEscapedHtml, unescapeHtmlChar)\n        : string;\n    }\n\n    /**\n     * Splits `string` into an array of its words.\n     *\n     * @static\n     * @memberOf _\n     * @category String\n     * @param {string} [string=''] The string to inspect.\n     * @param {RegExp|string} [pattern] The pattern to match words.\n     * @param- {Object} [guard] Enables use as a callback for functions like `_.map`.\n     * @returns {Array} Returns the words of `string`.\n     * @example\n     *\n     * _.words('fred, barney, & pebbles');\n     * // => ['fred', 'barney', 'pebbles']\n     *\n     * _.words('fred, barney, & pebbles', /[^, ]+/g);\n     * // => ['fred', 'barney', '&', 'pebbles']\n     */\n    function words(string, pattern, guard) {\n      if (guard && isIterateeCall(string, pattern, guard)) {\n        pattern = undefined;\n      }\n      string = baseToString(string);\n      return string.match(pattern || reWords) || [];\n    }\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Attempts to invoke `func`, returning either the result or the caught error\n     * object. Any additional arguments are provided to `func` when it is invoked.\n     *\n     * @static\n     * @memberOf _\n     * @category Utility\n     * @param {Function} func The function to attempt.\n     * @returns {*} Returns the `func` result or error object.\n     * @example\n     *\n     * // avoid throwing errors for invalid selectors\n     * var elements = _.attempt(function(selector) {\n     *   return document.querySelectorAll(selector);\n     * }, '>_>');\n     *\n     * if (_.isError(elements)) {\n     *   elements = [];\n     * }\n     */\n    var attempt = restParam(function(func, args) {\n      try {\n        return func.apply(undefined, args);\n      } catch(e) {\n        return isError(e) ? e : new Error(e);\n      }\n    });\n\n    /**\n     * Creates a function that invokes `func` with the `this` binding of `thisArg`\n     * and arguments of the created function. If `func` is a property name the\n     * created callback returns the property value for a given element. If `func`\n     * is an object the created callback returns `true` for elements that contain\n     * the equivalent object properties, otherwise it returns `false`.\n     *\n     * @static\n     * @memberOf _\n     * @alias iteratee\n     * @category Utility\n     * @param {*} [func=_.identity] The value to convert to a callback.\n     * @param {*} [thisArg] The `this` binding of `func`.\n     * @param- {Object} [guard] Enables use as a callback for functions like `_.map`.\n     * @returns {Function} Returns the callback.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney', 'age': 36 },\n     *   { 'user': 'fred',   'age': 40 }\n     * ];\n     *\n     * // wrap to create custom callback shorthands\n     * _.callback = _.wrap(_.callback, function(callback, func, thisArg) {\n     *   var match = /^(.+?)__([gl]t)(.+)$/.exec(func);\n     *   if (!match) {\n     *     return callback(func, thisArg);\n     *   }\n     *   return function(object) {\n     *     return match[2] == 'gt'\n     *       ? object[match[1]] > match[3]\n     *       : object[match[1]] < match[3];\n     *   };\n     * });\n     *\n     * _.filter(users, 'age__gt36');\n     * // => [{ 'user': 'fred', 'age': 40 }]\n     */\n    function callback(func, thisArg, guard) {\n      if (guard && isIterateeCall(func, thisArg, guard)) {\n        thisArg = undefined;\n      }\n      return isObjectLike(func)\n        ? matches(func)\n        : baseCallback(func, thisArg);\n    }\n\n    /**\n     * Creates a function that returns `value`.\n     *\n     * @static\n     * @memberOf _\n     * @category Utility\n     * @param {*} value The value to return from the new function.\n     * @returns {Function} Returns the new function.\n     * @example\n     *\n     * var object = { 'user': 'fred' };\n     * var getter = _.constant(object);\n     *\n     * getter() === object;\n     * // => true\n     */\n    function constant(value) {\n      return function() {\n        return value;\n      };\n    }\n\n    /**\n     * This method returns the first argument provided to it.\n     *\n     * @static\n     * @memberOf _\n     * @category Utility\n     * @param {*} value Any value.\n     * @returns {*} Returns `value`.\n     * @example\n     *\n     * var object = { 'user': 'fred' };\n     *\n     * _.identity(object) === object;\n     * // => true\n     */\n    function identity(value) {\n      return value;\n    }\n\n    /**\n     * Creates a function that performs a deep comparison between a given object\n     * and `source`, returning `true` if the given object has equivalent property\n     * values, else `false`.\n     *\n     * **Note:** This method supports comparing arrays, booleans, `Date` objects,\n     * numbers, `Object` objects, regexes, and strings. Objects are compared by\n     * their own, not inherited, enumerable properties. For comparing a single\n     * own or inherited property value see `_.matchesProperty`.\n     *\n     * @static\n     * @memberOf _\n     * @category Utility\n     * @param {Object} source The object of property values to match.\n     * @returns {Function} Returns the new function.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney', 'age': 36, 'active': true },\n     *   { 'user': 'fred',   'age': 40, 'active': false }\n     * ];\n     *\n     * _.filter(users, _.matches({ 'age': 40, 'active': false }));\n     * // => [{ 'user': 'fred', 'age': 40, 'active': false }]\n     */\n    function matches(source) {\n      return baseMatches(baseClone(source, true));\n    }\n\n    /**\n     * Creates a function that compares the property value of `path` on a given\n     * object to `value`.\n     *\n     * **Note:** This method supports comparing arrays, booleans, `Date` objects,\n     * numbers, `Object` objects, regexes, and strings. Objects are compared by\n     * their own, not inherited, enumerable properties.\n     *\n     * @static\n     * @memberOf _\n     * @category Utility\n     * @param {Array|string} path The path of the property to get.\n     * @param {*} srcValue The value to match.\n     * @returns {Function} Returns the new function.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney' },\n     *   { 'user': 'fred' }\n     * ];\n     *\n     * _.find(users, _.matchesProperty('user', 'fred'));\n     * // => { 'user': 'fred' }\n     */\n    function matchesProperty(path, srcValue) {\n      return baseMatchesProperty(path, baseClone(srcValue, true));\n    }\n\n    /**\n     * Creates a function that invokes the method at `path` on a given object.\n     * Any additional arguments are provided to the invoked method.\n     *\n     * @static\n     * @memberOf _\n     * @category Utility\n     * @param {Array|string} path The path of the method to invoke.\n     * @param {...*} [args] The arguments to invoke the method with.\n     * @returns {Function} Returns the new function.\n     * @example\n     *\n     * var objects = [\n     *   { 'a': { 'b': { 'c': _.constant(2) } } },\n     *   { 'a': { 'b': { 'c': _.constant(1) } } }\n     * ];\n     *\n     * _.map(objects, _.method('a.b.c'));\n     * // => [2, 1]\n     *\n     * _.invoke(_.sortBy(objects, _.method(['a', 'b', 'c'])), 'a.b.c');\n     * // => [1, 2]\n     */\n    var method = restParam(function(path, args) {\n      return function(object) {\n        return invokePath(object, path, args);\n      };\n    });\n\n    /**\n     * The opposite of `_.method`; this method creates a function that invokes\n     * the method at a given path on `object`. Any additional arguments are\n     * provided to the invoked method.\n     *\n     * @static\n     * @memberOf _\n     * @category Utility\n     * @param {Object} object The object to query.\n     * @param {...*} [args] The arguments to invoke the method with.\n     * @returns {Function} Returns the new function.\n     * @example\n     *\n     * var array = _.times(3, _.constant),\n     *     object = { 'a': array, 'b': array, 'c': array };\n     *\n     * _.map(['a[2]', 'c[0]'], _.methodOf(object));\n     * // => [2, 0]\n     *\n     * _.map([['a', '2'], ['c', '0']], _.methodOf(object));\n     * // => [2, 0]\n     */\n    var methodOf = restParam(function(object, args) {\n      return function(path) {\n        return invokePath(object, path, args);\n      };\n    });\n\n    /**\n     * Adds all own enumerable function properties of a source object to the\n     * destination object. If `object` is a function then methods are added to\n     * its prototype as well.\n     *\n     * **Note:** Use `_.runInContext` to create a pristine `lodash` function to\n     * avoid conflicts caused by modifying the original.\n     *\n     * @static\n     * @memberOf _\n     * @category Utility\n     * @param {Function|Object} [object=lodash] The destination object.\n     * @param {Object} source The object of functions to add.\n     * @param {Object} [options] The options object.\n     * @param {boolean} [options.chain=true] Specify whether the functions added\n     *  are chainable.\n     * @returns {Function|Object} Returns `object`.\n     * @example\n     *\n     * function vowels(string) {\n     *   return _.filter(string, function(v) {\n     *     return /[aeiou]/i.test(v);\n     *   });\n     * }\n     *\n     * _.mixin({ 'vowels': vowels });\n     * _.vowels('fred');\n     * // => ['e']\n     *\n     * _('fred').vowels().value();\n     * // => ['e']\n     *\n     * _.mixin({ 'vowels': vowels }, { 'chain': false });\n     * _('fred').vowels();\n     * // => ['e']\n     */\n    function mixin(object, source, options) {\n      if (options == null) {\n        var isObj = isObject(source),\n            props = isObj ? keys(source) : undefined,\n            methodNames = (props && props.length) ? baseFunctions(source, props) : undefined;\n\n        if (!(methodNames ? methodNames.length : isObj)) {\n          methodNames = false;\n          options = source;\n          source = object;\n          object = this;\n        }\n      }\n      if (!methodNames) {\n        methodNames = baseFunctions(source, keys(source));\n      }\n      var chain = true,\n          index = -1,\n          isFunc = isFunction(object),\n          length = methodNames.length;\n\n      if (options === false) {\n        chain = false;\n      } else if (isObject(options) && 'chain' in options) {\n        chain = options.chain;\n      }\n      while (++index < length) {\n        var methodName = methodNames[index],\n            func = source[methodName];\n\n        object[methodName] = func;\n        if (isFunc) {\n          object.prototype[methodName] = (function(func) {\n            return function() {\n              var chainAll = this.__chain__;\n              if (chain || chainAll) {\n                var result = object(this.__wrapped__),\n                    actions = result.__actions__ = arrayCopy(this.__actions__);\n\n                actions.push({ 'func': func, 'args': arguments, 'thisArg': object });\n                result.__chain__ = chainAll;\n                return result;\n              }\n              return func.apply(object, arrayPush([this.value()], arguments));\n            };\n          }(func));\n        }\n      }\n      return object;\n    }\n\n    /**\n     * Reverts the `_` variable to its previous value and returns a reference to\n     * the `lodash` function.\n     *\n     * @static\n     * @memberOf _\n     * @category Utility\n     * @returns {Function} Returns the `lodash` function.\n     * @example\n     *\n     * var lodash = _.noConflict();\n     */\n    function noConflict() {\n      root._ = oldDash;\n      return this;\n    }\n\n    /**\n     * A no-operation function that returns `undefined` regardless of the\n     * arguments it receives.\n     *\n     * @static\n     * @memberOf _\n     * @category Utility\n     * @example\n     *\n     * var object = { 'user': 'fred' };\n     *\n     * _.noop(object) === undefined;\n     * // => true\n     */\n    function noop() {\n      // No operation performed.\n    }\n\n    /**\n     * Creates a function that returns the property value at `path` on a\n     * given object.\n     *\n     * @static\n     * @memberOf _\n     * @category Utility\n     * @param {Array|string} path The path of the property to get.\n     * @returns {Function} Returns the new function.\n     * @example\n     *\n     * var objects = [\n     *   { 'a': { 'b': { 'c': 2 } } },\n     *   { 'a': { 'b': { 'c': 1 } } }\n     * ];\n     *\n     * _.map(objects, _.property('a.b.c'));\n     * // => [2, 1]\n     *\n     * _.pluck(_.sortBy(objects, _.property(['a', 'b', 'c'])), 'a.b.c');\n     * // => [1, 2]\n     */\n    function property(path) {\n      return isKey(path) ? baseProperty(path) : basePropertyDeep(path);\n    }\n\n    /**\n     * The opposite of `_.property`; this method creates a function that returns\n     * the property value at a given path on `object`.\n     *\n     * @static\n     * @memberOf _\n     * @category Utility\n     * @param {Object} object The object to query.\n     * @returns {Function} Returns the new function.\n     * @example\n     *\n     * var array = [0, 1, 2],\n     *     object = { 'a': array, 'b': array, 'c': array };\n     *\n     * _.map(['a[2]', 'c[0]'], _.propertyOf(object));\n     * // => [2, 0]\n     *\n     * _.map([['a', '2'], ['c', '0']], _.propertyOf(object));\n     * // => [2, 0]\n     */\n    function propertyOf(object) {\n      return function(path) {\n        return baseGet(object, toPath(path), path + '');\n      };\n    }\n\n    /**\n     * Creates an array of numbers (positive and/or negative) progressing from\n     * `start` up to, but not including, `end`. If `end` is not specified it is\n     * set to `start` with `start` then set to `0`. If `end` is less than `start`\n     * a zero-length range is created unless a negative `step` is specified.\n     *\n     * @static\n     * @memberOf _\n     * @category Utility\n     * @param {number} [start=0] The start of the range.\n     * @param {number} end The end of the range.\n     * @param {number} [step=1] The value to increment or decrement by.\n     * @returns {Array} Returns the new array of numbers.\n     * @example\n     *\n     * _.range(4);\n     * // => [0, 1, 2, 3]\n     *\n     * _.range(1, 5);\n     * // => [1, 2, 3, 4]\n     *\n     * _.range(0, 20, 5);\n     * // => [0, 5, 10, 15]\n     *\n     * _.range(0, -4, -1);\n     * // => [0, -1, -2, -3]\n     *\n     * _.range(1, 4, 0);\n     * // => [1, 1, 1]\n     *\n     * _.range(0);\n     * // => []\n     */\n    function range(start, end, step) {\n      if (step && isIterateeCall(start, end, step)) {\n        end = step = undefined;\n      }\n      start = +start || 0;\n      step = step == null ? 1 : (+step || 0);\n\n      if (end == null) {\n        end = start;\n        start = 0;\n      } else {\n        end = +end || 0;\n      }\n      // Use `Array(length)` so engines like Chakra and V8 avoid slower modes.\n      // See https://youtu.be/XAqIpGU8ZZk#t=17m25s for more details.\n      var index = -1,\n          length = nativeMax(nativeCeil((end - start) / (step || 1)), 0),\n          result = Array(length);\n\n      while (++index < length) {\n        result[index] = start;\n        start += step;\n      }\n      return result;\n    }\n\n    /**\n     * Invokes the iteratee function `n` times, returning an array of the results\n     * of each invocation. The `iteratee` is bound to `thisArg` and invoked with\n     * one argument; (index).\n     *\n     * @static\n     * @memberOf _\n     * @category Utility\n     * @param {number} n The number of times to invoke `iteratee`.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @param {*} [thisArg] The `this` binding of `iteratee`.\n     * @returns {Array} Returns the array of results.\n     * @example\n     *\n     * var diceRolls = _.times(3, _.partial(_.random, 1, 6, false));\n     * // => [3, 6, 4]\n     *\n     * _.times(3, function(n) {\n     *   mage.castSpell(n);\n     * });\n     * // => invokes `mage.castSpell(n)` three times with `n` of `0`, `1`, and `2`\n     *\n     * _.times(3, function(n) {\n     *   this.cast(n);\n     * }, mage);\n     * // => also invokes `mage.castSpell(n)` three times\n     */\n    function times(n, iteratee, thisArg) {\n      n = nativeFloor(n);\n\n      // Exit early to avoid a JSC JIT bug in Safari 8\n      // where `Array(0)` is treated as `Array(1)`.\n      if (n < 1 || !nativeIsFinite(n)) {\n        return [];\n      }\n      var index = -1,\n          result = Array(nativeMin(n, MAX_ARRAY_LENGTH));\n\n      iteratee = bindCallback(iteratee, thisArg, 1);\n      while (++index < n) {\n        if (index < MAX_ARRAY_LENGTH) {\n          result[index] = iteratee(index);\n        } else {\n          iteratee(index);\n        }\n      }\n      return result;\n    }\n\n    /**\n     * Generates a unique ID. If `prefix` is provided the ID is appended to it.\n     *\n     * @static\n     * @memberOf _\n     * @category Utility\n     * @param {string} [prefix] The value to prefix the ID with.\n     * @returns {string} Returns the unique ID.\n     * @example\n     *\n     * _.uniqueId('contact_');\n     * // => 'contact_104'\n     *\n     * _.uniqueId();\n     * // => '105'\n     */\n    function uniqueId(prefix) {\n      var id = ++idCounter;\n      return baseToString(prefix) + id;\n    }\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Adds two numbers.\n     *\n     * @static\n     * @memberOf _\n     * @category Math\n     * @param {number} augend The first number to add.\n     * @param {number} addend The second number to add.\n     * @returns {number} Returns the sum.\n     * @example\n     *\n     * _.add(6, 4);\n     * // => 10\n     */\n    function add(augend, addend) {\n      return (+augend || 0) + (+addend || 0);\n    }\n\n    /**\n     * Calculates `n` rounded up to `precision`.\n     *\n     * @static\n     * @memberOf _\n     * @category Math\n     * @param {number} n The number to round up.\n     * @param {number} [precision=0] The precision to round up to.\n     * @returns {number} Returns the rounded up number.\n     * @example\n     *\n     * _.ceil(4.006);\n     * // => 5\n     *\n     * _.ceil(6.004, 2);\n     * // => 6.01\n     *\n     * _.ceil(6040, -2);\n     * // => 6100\n     */\n    var ceil = createRound('ceil');\n\n    /**\n     * Calculates `n` rounded down to `precision`.\n     *\n     * @static\n     * @memberOf _\n     * @category Math\n     * @param {number} n The number to round down.\n     * @param {number} [precision=0] The precision to round down to.\n     * @returns {number} Returns the rounded down number.\n     * @example\n     *\n     * _.floor(4.006);\n     * // => 4\n     *\n     * _.floor(0.046, 2);\n     * // => 0.04\n     *\n     * _.floor(4060, -2);\n     * // => 4000\n     */\n    var floor = createRound('floor');\n\n    /**\n     * Gets the maximum value of `collection`. If `collection` is empty or falsey\n     * `-Infinity` is returned. If an iteratee function is provided it is invoked\n     * for each value in `collection` to generate the criterion by which the value\n     * is ranked. The `iteratee` is bound to `thisArg` and invoked with three\n     * arguments: (value, index, collection).\n     *\n     * If a property name is provided for `iteratee` the created `_.property`\n     * style callback returns the property value of the given element.\n     *\n     * If a value is also provided for `thisArg` the created `_.matchesProperty`\n     * style callback returns `true` for elements that have a matching property\n     * value, else `false`.\n     *\n     * If an object is provided for `iteratee` the created `_.matches` style\n     * callback returns `true` for elements that have the properties of the given\n     * object, else `false`.\n     *\n     * @static\n     * @memberOf _\n     * @category Math\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {Function|Object|string} [iteratee] The function invoked per iteration.\n     * @param {*} [thisArg] The `this` binding of `iteratee`.\n     * @returns {*} Returns the maximum value.\n     * @example\n     *\n     * _.max([4, 2, 8, 6]);\n     * // => 8\n     *\n     * _.max([]);\n     * // => -Infinity\n     *\n     * var users = [\n     *   { 'user': 'barney', 'age': 36 },\n     *   { 'user': 'fred',   'age': 40 }\n     * ];\n     *\n     * _.max(users, function(chr) {\n     *   return chr.age;\n     * });\n     * // => { 'user': 'fred', 'age': 40 }\n     *\n     * // using the `_.property` callback shorthand\n     * _.max(users, 'age');\n     * // => { 'user': 'fred', 'age': 40 }\n     */\n    var max = createExtremum(gt, NEGATIVE_INFINITY);\n\n    /**\n     * Gets the minimum value of `collection`. If `collection` is empty or falsey\n     * `Infinity` is returned. If an iteratee function is provided it is invoked\n     * for each value in `collection` to generate the criterion by which the value\n     * is ranked. The `iteratee` is bound to `thisArg` and invoked with three\n     * arguments: (value, index, collection).\n     *\n     * If a property name is provided for `iteratee` the created `_.property`\n     * style callback returns the property value of the given element.\n     *\n     * If a value is also provided for `thisArg` the created `_.matchesProperty`\n     * style callback returns `true` for elements that have a matching property\n     * value, else `false`.\n     *\n     * If an object is provided for `iteratee` the created `_.matches` style\n     * callback returns `true` for elements that have the properties of the given\n     * object, else `false`.\n     *\n     * @static\n     * @memberOf _\n     * @category Math\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {Function|Object|string} [iteratee] The function invoked per iteration.\n     * @param {*} [thisArg] The `this` binding of `iteratee`.\n     * @returns {*} Returns the minimum value.\n     * @example\n     *\n     * _.min([4, 2, 8, 6]);\n     * // => 2\n     *\n     * _.min([]);\n     * // => Infinity\n     *\n     * var users = [\n     *   { 'user': 'barney', 'age': 36 },\n     *   { 'user': 'fred',   'age': 40 }\n     * ];\n     *\n     * _.min(users, function(chr) {\n     *   return chr.age;\n     * });\n     * // => { 'user': 'barney', 'age': 36 }\n     *\n     * // using the `_.property` callback shorthand\n     * _.min(users, 'age');\n     * // => { 'user': 'barney', 'age': 36 }\n     */\n    var min = createExtremum(lt, POSITIVE_INFINITY);\n\n    /**\n     * Calculates `n` rounded to `precision`.\n     *\n     * @static\n     * @memberOf _\n     * @category Math\n     * @param {number} n The number to round.\n     * @param {number} [precision=0] The precision to round to.\n     * @returns {number} Returns the rounded number.\n     * @example\n     *\n     * _.round(4.006);\n     * // => 4\n     *\n     * _.round(4.006, 2);\n     * // => 4.01\n     *\n     * _.round(4060, -2);\n     * // => 4100\n     */\n    var round = createRound('round');\n\n    /**\n     * Gets the sum of the values in `collection`.\n     *\n     * @static\n     * @memberOf _\n     * @category Math\n     * @param {Array|Object|string} collection The collection to iterate over.\n     * @param {Function|Object|string} [iteratee] The function invoked per iteration.\n     * @param {*} [thisArg] The `this` binding of `iteratee`.\n     * @returns {number} Returns the sum.\n     * @example\n     *\n     * _.sum([4, 6]);\n     * // => 10\n     *\n     * _.sum({ 'a': 4, 'b': 6 });\n     * // => 10\n     *\n     * var objects = [\n     *   { 'n': 4 },\n     *   { 'n': 6 }\n     * ];\n     *\n     * _.sum(objects, function(object) {\n     *   return object.n;\n     * });\n     * // => 10\n     *\n     * // using the `_.property` callback shorthand\n     * _.sum(objects, 'n');\n     * // => 10\n     */\n    function sum(collection, iteratee, thisArg) {\n      if (thisArg && isIterateeCall(collection, iteratee, thisArg)) {\n        iteratee = undefined;\n      }\n      iteratee = getCallback(iteratee, thisArg, 3);\n      return iteratee.length == 1\n        ? arraySum(isArray(collection) ? collection : toIterable(collection), iteratee)\n        : baseSum(collection, iteratee);\n    }\n\n    /*------------------------------------------------------------------------*/\n\n    // Ensure wrappers are instances of `baseLodash`.\n    lodash.prototype = baseLodash.prototype;\n\n    LodashWrapper.prototype = baseCreate(baseLodash.prototype);\n    LodashWrapper.prototype.constructor = LodashWrapper;\n\n    LazyWrapper.prototype = baseCreate(baseLodash.prototype);\n    LazyWrapper.prototype.constructor = LazyWrapper;\n\n    // Add functions to the `Map` cache.\n    MapCache.prototype['delete'] = mapDelete;\n    MapCache.prototype.get = mapGet;\n    MapCache.prototype.has = mapHas;\n    MapCache.prototype.set = mapSet;\n\n    // Add functions to the `Set` cache.\n    SetCache.prototype.push = cachePush;\n\n    // Assign cache to `_.memoize`.\n    memoize.Cache = MapCache;\n\n    // Add functions that return wrapped values when chaining.\n    lodash.after = after;\n    lodash.ary = ary;\n    lodash.assign = assign;\n    lodash.at = at;\n    lodash.before = before;\n    lodash.bind = bind;\n    lodash.bindAll = bindAll;\n    lodash.bindKey = bindKey;\n    lodash.callback = callback;\n    lodash.chain = chain;\n    lodash.chunk = chunk;\n    lodash.compact = compact;\n    lodash.constant = constant;\n    lodash.countBy = countBy;\n    lodash.create = create;\n    lodash.curry = curry;\n    lodash.curryRight = curryRight;\n    lodash.debounce = debounce;\n    lodash.defaults = defaults;\n    lodash.defaultsDeep = defaultsDeep;\n    lodash.defer = defer;\n    lodash.delay = delay;\n    lodash.difference = difference;\n    lodash.drop = drop;\n    lodash.dropRight = dropRight;\n    lodash.dropRightWhile = dropRightWhile;\n    lodash.dropWhile = dropWhile;\n    lodash.fill = fill;\n    lodash.filter = filter;\n    lodash.flatten = flatten;\n    lodash.flattenDeep = flattenDeep;\n    lodash.flow = flow;\n    lodash.flowRight = flowRight;\n    lodash.forEach = forEach;\n    lodash.forEachRight = forEachRight;\n    lodash.forIn = forIn;\n    lodash.forInRight = forInRight;\n    lodash.forOwn = forOwn;\n    lodash.forOwnRight = forOwnRight;\n    lodash.functions = functions;\n    lodash.groupBy = groupBy;\n    lodash.indexBy = indexBy;\n    lodash.initial = initial;\n    lodash.intersection = intersection;\n    lodash.invert = invert;\n    lodash.invoke = invoke;\n    lodash.keys = keys;\n    lodash.keysIn = keysIn;\n    lodash.map = map;\n    lodash.mapKeys = mapKeys;\n    lodash.mapValues = mapValues;\n    lodash.matches = matches;\n    lodash.matchesProperty = matchesProperty;\n    lodash.memoize = memoize;\n    lodash.merge = merge;\n    lodash.method = method;\n    lodash.methodOf = methodOf;\n    lodash.mixin = mixin;\n    lodash.modArgs = modArgs;\n    lodash.negate = negate;\n    lodash.omit = omit;\n    lodash.once = once;\n    lodash.pairs = pairs;\n    lodash.partial = partial;\n    lodash.partialRight = partialRight;\n    lodash.partition = partition;\n    lodash.pick = pick;\n    lodash.pluck = pluck;\n    lodash.property = property;\n    lodash.propertyOf = propertyOf;\n    lodash.pull = pull;\n    lodash.pullAt = pullAt;\n    lodash.range = range;\n    lodash.rearg = rearg;\n    lodash.reject = reject;\n    lodash.remove = remove;\n    lodash.rest = rest;\n    lodash.restParam = restParam;\n    lodash.set = set;\n    lodash.shuffle = shuffle;\n    lodash.slice = slice;\n    lodash.sortBy = sortBy;\n    lodash.sortByAll = sortByAll;\n    lodash.sortByOrder = sortByOrder;\n    lodash.spread = spread;\n    lodash.take = take;\n    lodash.takeRight = takeRight;\n    lodash.takeRightWhile = takeRightWhile;\n    lodash.takeWhile = takeWhile;\n    lodash.tap = tap;\n    lodash.throttle = throttle;\n    lodash.thru = thru;\n    lodash.times = times;\n    lodash.toArray = toArray;\n    lodash.toPlainObject = toPlainObject;\n    lodash.transform = transform;\n    lodash.union = union;\n    lodash.uniq = uniq;\n    lodash.unzip = unzip;\n    lodash.unzipWith = unzipWith;\n    lodash.values = values;\n    lodash.valuesIn = valuesIn;\n    lodash.where = where;\n    lodash.without = without;\n    lodash.wrap = wrap;\n    lodash.xor = xor;\n    lodash.zip = zip;\n    lodash.zipObject = zipObject;\n    lodash.zipWith = zipWith;\n\n    // Add aliases.\n    lodash.backflow = flowRight;\n    lodash.collect = map;\n    lodash.compose = flowRight;\n    lodash.each = forEach;\n    lodash.eachRight = forEachRight;\n    lodash.extend = assign;\n    lodash.iteratee = callback;\n    lodash.methods = functions;\n    lodash.object = zipObject;\n    lodash.select = filter;\n    lodash.tail = rest;\n    lodash.unique = uniq;\n\n    // Add functions to `lodash.prototype`.\n    mixin(lodash, lodash);\n\n    /*------------------------------------------------------------------------*/\n\n    // Add functions that return unwrapped values when chaining.\n    lodash.add = add;\n    lodash.attempt = attempt;\n    lodash.camelCase = camelCase;\n    lodash.capitalize = capitalize;\n    lodash.ceil = ceil;\n    lodash.clone = clone;\n    lodash.cloneDeep = cloneDeep;\n    lodash.deburr = deburr;\n    lodash.endsWith = endsWith;\n    lodash.escape = escape;\n    lodash.escapeRegExp = escapeRegExp;\n    lodash.every = every;\n    lodash.find = find;\n    lodash.findIndex = findIndex;\n    lodash.findKey = findKey;\n    lodash.findLast = findLast;\n    lodash.findLastIndex = findLastIndex;\n    lodash.findLastKey = findLastKey;\n    lodash.findWhere = findWhere;\n    lodash.first = first;\n    lodash.floor = floor;\n    lodash.get = get;\n    lodash.gt = gt;\n    lodash.gte = gte;\n    lodash.has = has;\n    lodash.identity = identity;\n    lodash.includes = includes;\n    lodash.indexOf = indexOf;\n    lodash.inRange = inRange;\n    lodash.isArguments = isArguments;\n    lodash.isArray = isArray;\n    lodash.isBoolean = isBoolean;\n    lodash.isDate = isDate;\n    lodash.isElement = isElement;\n    lodash.isEmpty = isEmpty;\n    lodash.isEqual = isEqual;\n    lodash.isError = isError;\n    lodash.isFinite = isFinite;\n    lodash.isFunction = isFunction;\n    lodash.isMatch = isMatch;\n    lodash.isNaN = isNaN;\n    lodash.isNative = isNative;\n    lodash.isNull = isNull;\n    lodash.isNumber = isNumber;\n    lodash.isObject = isObject;\n    lodash.isPlainObject = isPlainObject;\n    lodash.isRegExp = isRegExp;\n    lodash.isString = isString;\n    lodash.isTypedArray = isTypedArray;\n    lodash.isUndefined = isUndefined;\n    lodash.kebabCase = kebabCase;\n    lodash.last = last;\n    lodash.lastIndexOf = lastIndexOf;\n    lodash.lt = lt;\n    lodash.lte = lte;\n    lodash.max = max;\n    lodash.min = min;\n    lodash.noConflict = noConflict;\n    lodash.noop = noop;\n    lodash.now = now;\n    lodash.pad = pad;\n    lodash.padLeft = padLeft;\n    lodash.padRight = padRight;\n    lodash.parseInt = parseInt;\n    lodash.random = random;\n    lodash.reduce = reduce;\n    lodash.reduceRight = reduceRight;\n    lodash.repeat = repeat;\n    lodash.result = result;\n    lodash.round = round;\n    lodash.runInContext = runInContext;\n    lodash.size = size;\n    lodash.snakeCase = snakeCase;\n    lodash.some = some;\n    lodash.sortedIndex = sortedIndex;\n    lodash.sortedLastIndex = sortedLastIndex;\n    lodash.startCase = startCase;\n    lodash.startsWith = startsWith;\n    lodash.sum = sum;\n    lodash.template = template;\n    lodash.trim = trim;\n    lodash.trimLeft = trimLeft;\n    lodash.trimRight = trimRight;\n    lodash.trunc = trunc;\n    lodash.unescape = unescape;\n    lodash.uniqueId = uniqueId;\n    lodash.words = words;\n\n    // Add aliases.\n    lodash.all = every;\n    lodash.any = some;\n    lodash.contains = includes;\n    lodash.eq = isEqual;\n    lodash.detect = find;\n    lodash.foldl = reduce;\n    lodash.foldr = reduceRight;\n    lodash.head = first;\n    lodash.include = includes;\n    lodash.inject = reduce;\n\n    mixin(lodash, (function() {\n      var source = {};\n      baseForOwn(lodash, function(func, methodName) {\n        if (!lodash.prototype[methodName]) {\n          source[methodName] = func;\n        }\n      });\n      return source;\n    }()), false);\n\n    /*------------------------------------------------------------------------*/\n\n    // Add functions capable of returning wrapped and unwrapped values when chaining.\n    lodash.sample = sample;\n\n    lodash.prototype.sample = function(n) {\n      if (!this.__chain__ && n == null) {\n        return sample(this.value());\n      }\n      return this.thru(function(value) {\n        return sample(value, n);\n      });\n    };\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * The semantic version number.\n     *\n     * @static\n     * @memberOf _\n     * @type string\n     */\n    lodash.VERSION = VERSION;\n\n    // Assign default placeholders.\n    arrayEach(['bind', 'bindKey', 'curry', 'curryRight', 'partial', 'partialRight'], function(methodName) {\n      lodash[methodName].placeholder = lodash;\n    });\n\n    // Add `LazyWrapper` methods for `_.drop` and `_.take` variants.\n    arrayEach(['drop', 'take'], function(methodName, index) {\n      LazyWrapper.prototype[methodName] = function(n) {\n        var filtered = this.__filtered__;\n        if (filtered && !index) {\n          return new LazyWrapper(this);\n        }\n        n = n == null ? 1 : nativeMax(nativeFloor(n) || 0, 0);\n\n        var result = this.clone();\n        if (filtered) {\n          result.__takeCount__ = nativeMin(result.__takeCount__, n);\n        } else {\n          result.__views__.push({ 'size': n, 'type': methodName + (result.__dir__ < 0 ? 'Right' : '') });\n        }\n        return result;\n      };\n\n      LazyWrapper.prototype[methodName + 'Right'] = function(n) {\n        return this.reverse()[methodName](n).reverse();\n      };\n    });\n\n    // Add `LazyWrapper` methods that accept an `iteratee` value.\n    arrayEach(['filter', 'map', 'takeWhile'], function(methodName, index) {\n      var type = index + 1,\n          isFilter = type != LAZY_MAP_FLAG;\n\n      LazyWrapper.prototype[methodName] = function(iteratee, thisArg) {\n        var result = this.clone();\n        result.__iteratees__.push({ 'iteratee': getCallback(iteratee, thisArg, 1), 'type': type });\n        result.__filtered__ = result.__filtered__ || isFilter;\n        return result;\n      };\n    });\n\n    // Add `LazyWrapper` methods for `_.first` and `_.last`.\n    arrayEach(['first', 'last'], function(methodName, index) {\n      var takeName = 'take' + (index ? 'Right' : '');\n\n      LazyWrapper.prototype[methodName] = function() {\n        return this[takeName](1).value()[0];\n      };\n    });\n\n    // Add `LazyWrapper` methods for `_.initial` and `_.rest`.\n    arrayEach(['initial', 'rest'], function(methodName, index) {\n      var dropName = 'drop' + (index ? '' : 'Right');\n\n      LazyWrapper.prototype[methodName] = function() {\n        return this.__filtered__ ? new LazyWrapper(this) : this[dropName](1);\n      };\n    });\n\n    // Add `LazyWrapper` methods for `_.pluck` and `_.where`.\n    arrayEach(['pluck', 'where'], function(methodName, index) {\n      var operationName = index ? 'filter' : 'map',\n          createCallback = index ? baseMatches : property;\n\n      LazyWrapper.prototype[methodName] = function(value) {\n        return this[operationName](createCallback(value));\n      };\n    });\n\n    LazyWrapper.prototype.compact = function() {\n      return this.filter(identity);\n    };\n\n    LazyWrapper.prototype.reject = function(predicate, thisArg) {\n      predicate = getCallback(predicate, thisArg, 1);\n      return this.filter(function(value) {\n        return !predicate(value);\n      });\n    };\n\n    LazyWrapper.prototype.slice = function(start, end) {\n      start = start == null ? 0 : (+start || 0);\n\n      var result = this;\n      if (result.__filtered__ && (start > 0 || end < 0)) {\n        return new LazyWrapper(result);\n      }\n      if (start < 0) {\n        result = result.takeRight(-start);\n      } else if (start) {\n        result = result.drop(start);\n      }\n      if (end !== undefined) {\n        end = (+end || 0);\n        result = end < 0 ? result.dropRight(-end) : result.take(end - start);\n      }\n      return result;\n    };\n\n    LazyWrapper.prototype.takeRightWhile = function(predicate, thisArg) {\n      return this.reverse().takeWhile(predicate, thisArg).reverse();\n    };\n\n    LazyWrapper.prototype.toArray = function() {\n      return this.take(POSITIVE_INFINITY);\n    };\n\n    // Add `LazyWrapper` methods to `lodash.prototype`.\n    baseForOwn(LazyWrapper.prototype, function(func, methodName) {\n      var checkIteratee = /^(?:filter|map|reject)|While$/.test(methodName),\n          retUnwrapped = /^(?:first|last)$/.test(methodName),\n          lodashFunc = lodash[retUnwrapped ? ('take' + (methodName == 'last' ? 'Right' : '')) : methodName];\n\n      if (!lodashFunc) {\n        return;\n      }\n      lodash.prototype[methodName] = function() {\n        var args = retUnwrapped ? [1] : arguments,\n            chainAll = this.__chain__,\n            value = this.__wrapped__,\n            isHybrid = !!this.__actions__.length,\n            isLazy = value instanceof LazyWrapper,\n            iteratee = args[0],\n            useLazy = isLazy || isArray(value);\n\n        if (useLazy && checkIteratee && typeof iteratee == 'function' && iteratee.length != 1) {\n          // Avoid lazy use if the iteratee has a \"length\" value other than `1`.\n          isLazy = useLazy = false;\n        }\n        var interceptor = function(value) {\n          return (retUnwrapped && chainAll)\n            ? lodashFunc(value, 1)[0]\n            : lodashFunc.apply(undefined, arrayPush([value], args));\n        };\n\n        var action = { 'func': thru, 'args': [interceptor], 'thisArg': undefined },\n            onlyLazy = isLazy && !isHybrid;\n\n        if (retUnwrapped && !chainAll) {\n          if (onlyLazy) {\n            value = value.clone();\n            value.__actions__.push(action);\n            return func.call(value);\n          }\n          return lodashFunc.call(undefined, this.value())[0];\n        }\n        if (!retUnwrapped && useLazy) {\n          value = onlyLazy ? value : new LazyWrapper(this);\n          var result = func.apply(value, args);\n          result.__actions__.push(action);\n          return new LodashWrapper(result, chainAll);\n        }\n        return this.thru(interceptor);\n      };\n    });\n\n    // Add `Array` and `String` methods to `lodash.prototype`.\n    arrayEach(['join', 'pop', 'push', 'replace', 'shift', 'sort', 'splice', 'split', 'unshift'], function(methodName) {\n      var func = (/^(?:replace|split)$/.test(methodName) ? stringProto : arrayProto)[methodName],\n          chainName = /^(?:push|sort|unshift)$/.test(methodName) ? 'tap' : 'thru',\n          retUnwrapped = /^(?:join|pop|replace|shift)$/.test(methodName);\n\n      lodash.prototype[methodName] = function() {\n        var args = arguments;\n        if (retUnwrapped && !this.__chain__) {\n          return func.apply(this.value(), args);\n        }\n        return this[chainName](function(value) {\n          return func.apply(value, args);\n        });\n      };\n    });\n\n    // Map minified function names to their real names.\n    baseForOwn(LazyWrapper.prototype, function(func, methodName) {\n      var lodashFunc = lodash[methodName];\n      if (lodashFunc) {\n        var key = lodashFunc.name,\n            names = realNames[key] || (realNames[key] = []);\n\n        names.push({ 'name': methodName, 'func': lodashFunc });\n      }\n    });\n\n    realNames[createHybridWrapper(undefined, BIND_KEY_FLAG).name] = [{ 'name': 'wrapper', 'func': undefined }];\n\n    // Add functions to the lazy wrapper.\n    LazyWrapper.prototype.clone = lazyClone;\n    LazyWrapper.prototype.reverse = lazyReverse;\n    LazyWrapper.prototype.value = lazyValue;\n\n    // Add chaining functions to the `lodash` wrapper.\n    lodash.prototype.chain = wrapperChain;\n    lodash.prototype.commit = wrapperCommit;\n    lodash.prototype.concat = wrapperConcat;\n    lodash.prototype.plant = wrapperPlant;\n    lodash.prototype.reverse = wrapperReverse;\n    lodash.prototype.toString = wrapperToString;\n    lodash.prototype.run = lodash.prototype.toJSON = lodash.prototype.valueOf = lodash.prototype.value = wrapperValue;\n\n    // Add function aliases to the `lodash` wrapper.\n    lodash.prototype.collect = lodash.prototype.map;\n    lodash.prototype.head = lodash.prototype.first;\n    lodash.prototype.select = lodash.prototype.filter;\n    lodash.prototype.tail = lodash.prototype.rest;\n\n    return lodash;\n  }\n\n  /*--------------------------------------------------------------------------*/\n\n  // Export lodash.\n  var _ = runInContext();\n\n  // Some AMD build optimizers like r.js check for condition patterns like the following:\n  if (true) {\n    // Expose lodash to the global object when an AMD loader is present to avoid\n    // errors in cases where lodash is loaded by a script tag and not intended\n    // as an AMD module. See http://requirejs.org/docs/errors.html#mismatch for\n    // more details.\n    root._ = _;\n\n    // Define as an anonymous module so, through path mapping, it can be\n    // referenced as the \"underscore\" module.\n    !(__WEBPACK_AMD_DEFINE_RESULT__ = function() {\n      return _;\n    }.call(exports, __webpack_require__, exports, module), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n  }\n  // Check for `exports` after `define` in case a build optimizer adds an `exports` object.\n  else if (freeExports && freeModule) {\n    // Export for Node.js or RingoJS.\n    if (moduleExports) {\n      (freeModule.exports = _)._ = _;\n    }\n    // Export for Rhino with CommonJS support.\n    else {\n      freeExports._ = _;\n    }\n  }\n  else {\n    // Export for a browser or Rhino.\n    root._ = _;\n  }\n}.call(this));\n\n/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(14)(module), (function() { return this; }())))\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9+L2xvZGFzaC9pbmRleC5qcz82NmU2Il0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIGxvZGFzaCAzLjEwLjEgKEN1c3RvbSBCdWlsZCkgPGh0dHBzOi8vbG9kYXNoLmNvbS8+XG4gKiBCdWlsZDogYGxvZGFzaCBtb2Rlcm4gLWQgLW8gLi9pbmRleC5qc2BcbiAqIENvcHlyaWdodCAyMDEyLTIwMTUgVGhlIERvam8gRm91bmRhdGlvbiA8aHR0cDovL2Rvam9mb3VuZGF0aW9uLm9yZy8+XG4gKiBCYXNlZCBvbiBVbmRlcnNjb3JlLmpzIDEuOC4zIDxodHRwOi8vdW5kZXJzY29yZWpzLm9yZy9MSUNFTlNFPlxuICogQ29weXJpZ2h0IDIwMDktMjAxNSBKZXJlbXkgQXNoa2VuYXMsIERvY3VtZW50Q2xvdWQgYW5kIEludmVzdGlnYXRpdmUgUmVwb3J0ZXJzICYgRWRpdG9yc1xuICogQXZhaWxhYmxlIHVuZGVyIE1JVCBsaWNlbnNlIDxodHRwczovL2xvZGFzaC5jb20vbGljZW5zZT5cbiAqL1xuOyhmdW5jdGlvbigpIHtcblxuICAvKiogVXNlZCBhcyBhIHNhZmUgcmVmZXJlbmNlIGZvciBgdW5kZWZpbmVkYCBpbiBwcmUtRVM1IGVudmlyb25tZW50cy4gKi9cbiAgdmFyIHVuZGVmaW5lZDtcblxuICAvKiogVXNlZCBhcyB0aGUgc2VtYW50aWMgdmVyc2lvbiBudW1iZXIuICovXG4gIHZhciBWRVJTSU9OID0gJzMuMTAuMSc7XG5cbiAgLyoqIFVzZWQgdG8gY29tcG9zZSBiaXRtYXNrcyBmb3Igd3JhcHBlciBtZXRhZGF0YS4gKi9cbiAgdmFyIEJJTkRfRkxBRyA9IDEsXG4gICAgICBCSU5EX0tFWV9GTEFHID0gMixcbiAgICAgIENVUlJZX0JPVU5EX0ZMQUcgPSA0LFxuICAgICAgQ1VSUllfRkxBRyA9IDgsXG4gICAgICBDVVJSWV9SSUdIVF9GTEFHID0gMTYsXG4gICAgICBQQVJUSUFMX0ZMQUcgPSAzMixcbiAgICAgIFBBUlRJQUxfUklHSFRfRkxBRyA9IDY0LFxuICAgICAgQVJZX0ZMQUcgPSAxMjgsXG4gICAgICBSRUFSR19GTEFHID0gMjU2O1xuXG4gIC8qKiBVc2VkIGFzIGRlZmF1bHQgb3B0aW9ucyBmb3IgYF8udHJ1bmNgLiAqL1xuICB2YXIgREVGQVVMVF9UUlVOQ19MRU5HVEggPSAzMCxcbiAgICAgIERFRkFVTFRfVFJVTkNfT01JU1NJT04gPSAnLi4uJztcblxuICAvKiogVXNlZCB0byBkZXRlY3Qgd2hlbiBhIGZ1bmN0aW9uIGJlY29tZXMgaG90LiAqL1xuICB2YXIgSE9UX0NPVU5UID0gMTUwLFxuICAgICAgSE9UX1NQQU4gPSAxNjtcblxuICAvKiogVXNlZCBhcyB0aGUgc2l6ZSB0byBlbmFibGUgbGFyZ2UgYXJyYXkgb3B0aW1pemF0aW9ucy4gKi9cbiAgdmFyIExBUkdFX0FSUkFZX1NJWkUgPSAyMDA7XG5cbiAgLyoqIFVzZWQgdG8gaW5kaWNhdGUgdGhlIHR5cGUgb2YgbGF6eSBpdGVyYXRlZXMuICovXG4gIHZhciBMQVpZX0ZJTFRFUl9GTEFHID0gMSxcbiAgICAgIExBWllfTUFQX0ZMQUcgPSAyO1xuXG4gIC8qKiBVc2VkIGFzIHRoZSBgVHlwZUVycm9yYCBtZXNzYWdlIGZvciBcIkZ1bmN0aW9uc1wiIG1ldGhvZHMuICovXG4gIHZhciBGVU5DX0VSUk9SX1RFWFQgPSAnRXhwZWN0ZWQgYSBmdW5jdGlvbic7XG5cbiAgLyoqIFVzZWQgYXMgdGhlIGludGVybmFsIGFyZ3VtZW50IHBsYWNlaG9sZGVyLiAqL1xuICB2YXIgUExBQ0VIT0xERVIgPSAnX19sb2Rhc2hfcGxhY2Vob2xkZXJfXyc7XG5cbiAgLyoqIGBPYmplY3QjdG9TdHJpbmdgIHJlc3VsdCByZWZlcmVuY2VzLiAqL1xuICB2YXIgYXJnc1RhZyA9ICdbb2JqZWN0IEFyZ3VtZW50c10nLFxuICAgICAgYXJyYXlUYWcgPSAnW29iamVjdCBBcnJheV0nLFxuICAgICAgYm9vbFRhZyA9ICdbb2JqZWN0IEJvb2xlYW5dJyxcbiAgICAgIGRhdGVUYWcgPSAnW29iamVjdCBEYXRlXScsXG4gICAgICBlcnJvclRhZyA9ICdbb2JqZWN0IEVycm9yXScsXG4gICAgICBmdW5jVGFnID0gJ1tvYmplY3QgRnVuY3Rpb25dJyxcbiAgICAgIG1hcFRhZyA9ICdbb2JqZWN0IE1hcF0nLFxuICAgICAgbnVtYmVyVGFnID0gJ1tvYmplY3QgTnVtYmVyXScsXG4gICAgICBvYmplY3RUYWcgPSAnW29iamVjdCBPYmplY3RdJyxcbiAgICAgIHJlZ2V4cFRhZyA9ICdbb2JqZWN0IFJlZ0V4cF0nLFxuICAgICAgc2V0VGFnID0gJ1tvYmplY3QgU2V0XScsXG4gICAgICBzdHJpbmdUYWcgPSAnW29iamVjdCBTdHJpbmddJyxcbiAgICAgIHdlYWtNYXBUYWcgPSAnW29iamVjdCBXZWFrTWFwXSc7XG5cbiAgdmFyIGFycmF5QnVmZmVyVGFnID0gJ1tvYmplY3QgQXJyYXlCdWZmZXJdJyxcbiAgICAgIGZsb2F0MzJUYWcgPSAnW29iamVjdCBGbG9hdDMyQXJyYXldJyxcbiAgICAgIGZsb2F0NjRUYWcgPSAnW29iamVjdCBGbG9hdDY0QXJyYXldJyxcbiAgICAgIGludDhUYWcgPSAnW29iamVjdCBJbnQ4QXJyYXldJyxcbiAgICAgIGludDE2VGFnID0gJ1tvYmplY3QgSW50MTZBcnJheV0nLFxuICAgICAgaW50MzJUYWcgPSAnW29iamVjdCBJbnQzMkFycmF5XScsXG4gICAgICB1aW50OFRhZyA9ICdbb2JqZWN0IFVpbnQ4QXJyYXldJyxcbiAgICAgIHVpbnQ4Q2xhbXBlZFRhZyA9ICdbb2JqZWN0IFVpbnQ4Q2xhbXBlZEFycmF5XScsXG4gICAgICB1aW50MTZUYWcgPSAnW29iamVjdCBVaW50MTZBcnJheV0nLFxuICAgICAgdWludDMyVGFnID0gJ1tvYmplY3QgVWludDMyQXJyYXldJztcblxuICAvKiogVXNlZCB0byBtYXRjaCBlbXB0eSBzdHJpbmcgbGl0ZXJhbHMgaW4gY29tcGlsZWQgdGVtcGxhdGUgc291cmNlLiAqL1xuICB2YXIgcmVFbXB0eVN0cmluZ0xlYWRpbmcgPSAvXFxiX19wIFxcKz0gJyc7L2csXG4gICAgICByZUVtcHR5U3RyaW5nTWlkZGxlID0gL1xcYihfX3AgXFwrPSkgJycgXFwrL2csXG4gICAgICByZUVtcHR5U3RyaW5nVHJhaWxpbmcgPSAvKF9fZVxcKC4qP1xcKXxcXGJfX3RcXCkpIFxcK1xcbicnOy9nO1xuXG4gIC8qKiBVc2VkIHRvIG1hdGNoIEhUTUwgZW50aXRpZXMgYW5kIEhUTUwgY2hhcmFjdGVycy4gKi9cbiAgdmFyIHJlRXNjYXBlZEh0bWwgPSAvJig/OmFtcHxsdHxndHxxdW90fCMzOXwjOTYpOy9nLFxuICAgICAgcmVVbmVzY2FwZWRIdG1sID0gL1smPD5cIidgXS9nLFxuICAgICAgcmVIYXNFc2NhcGVkSHRtbCA9IFJlZ0V4cChyZUVzY2FwZWRIdG1sLnNvdXJjZSksXG4gICAgICByZUhhc1VuZXNjYXBlZEh0bWwgPSBSZWdFeHAocmVVbmVzY2FwZWRIdG1sLnNvdXJjZSk7XG5cbiAgLyoqIFVzZWQgdG8gbWF0Y2ggdGVtcGxhdGUgZGVsaW1pdGVycy4gKi9cbiAgdmFyIHJlRXNjYXBlID0gLzwlLShbXFxzXFxTXSs/KSU+L2csXG4gICAgICByZUV2YWx1YXRlID0gLzwlKFtcXHNcXFNdKz8pJT4vZyxcbiAgICAgIHJlSW50ZXJwb2xhdGUgPSAvPCU9KFtcXHNcXFNdKz8pJT4vZztcblxuICAvKiogVXNlZCB0byBtYXRjaCBwcm9wZXJ0eSBuYW1lcyB3aXRoaW4gcHJvcGVydHkgcGF0aHMuICovXG4gIHZhciByZUlzRGVlcFByb3AgPSAvXFwufFxcWyg/OlteW1xcXV0qfChbXCInXSkoPzooPyFcXDEpW15cXG5cXFxcXXxcXFxcLikqP1xcMSlcXF0vLFxuICAgICAgcmVJc1BsYWluUHJvcCA9IC9eXFx3KiQvLFxuICAgICAgcmVQcm9wTmFtZSA9IC9bXi5bXFxdXSt8XFxbKD86KC0/XFxkKyg/OlxcLlxcZCspPyl8KFtcIiddKSgoPzooPyFcXDIpW15cXG5cXFxcXXxcXFxcLikqPylcXDIpXFxdL2c7XG5cbiAgLyoqXG4gICAqIFVzZWQgdG8gbWF0Y2ggYFJlZ0V4cGAgW3N5bnRheCBjaGFyYWN0ZXJzXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi82LjAvI3NlYy1wYXR0ZXJucylcbiAgICogYW5kIHRob3NlIG91dGxpbmVkIGJ5IFtgRXNjYXBlUmVnRXhwUGF0dGVybmBdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzYuMC8jc2VjLWVzY2FwZXJlZ2V4cHBhdHRlcm4pLlxuICAgKi9cbiAgdmFyIHJlUmVnRXhwQ2hhcnMgPSAvXls6ISxdfFtcXFxcXiQuKis/KClbXFxde318XFwvXXwoXlswLTlhLWZBLUZucnR1dnhdKXwoW1xcblxcclxcdTIwMjhcXHUyMDI5XSkvZyxcbiAgICAgIHJlSGFzUmVnRXhwQ2hhcnMgPSBSZWdFeHAocmVSZWdFeHBDaGFycy5zb3VyY2UpO1xuXG4gIC8qKiBVc2VkIHRvIG1hdGNoIFtjb21iaW5pbmcgZGlhY3JpdGljYWwgbWFya3NdKGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0NvbWJpbmluZ19EaWFjcml0aWNhbF9NYXJrcykuICovXG4gIHZhciByZUNvbWJvTWFyayA9IC9bXFx1MDMwMC1cXHUwMzZmXFx1ZmUyMC1cXHVmZTIzXS9nO1xuXG4gIC8qKiBVc2VkIHRvIG1hdGNoIGJhY2tzbGFzaGVzIGluIHByb3BlcnR5IHBhdGhzLiAqL1xuICB2YXIgcmVFc2NhcGVDaGFyID0gL1xcXFwoXFxcXCk/L2c7XG5cbiAgLyoqIFVzZWQgdG8gbWF0Y2ggW0VTIHRlbXBsYXRlIGRlbGltaXRlcnNdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzYuMC8jc2VjLXRlbXBsYXRlLWxpdGVyYWwtbGV4aWNhbC1jb21wb25lbnRzKS4gKi9cbiAgdmFyIHJlRXNUZW1wbGF0ZSA9IC9cXCRcXHsoW15cXFxcfV0qKD86XFxcXC5bXlxcXFx9XSopKilcXH0vZztcblxuICAvKiogVXNlZCB0byBtYXRjaCBgUmVnRXhwYCBmbGFncyBmcm9tIHRoZWlyIGNvZXJjZWQgc3RyaW5nIHZhbHVlcy4gKi9cbiAgdmFyIHJlRmxhZ3MgPSAvXFx3KiQvO1xuXG4gIC8qKiBVc2VkIHRvIGRldGVjdCBoZXhhZGVjaW1hbCBzdHJpbmcgdmFsdWVzLiAqL1xuICB2YXIgcmVIYXNIZXhQcmVmaXggPSAvXjBbeFhdLztcblxuICAvKiogVXNlZCB0byBkZXRlY3QgaG9zdCBjb25zdHJ1Y3RvcnMgKFNhZmFyaSA+IDUpLiAqL1xuICB2YXIgcmVJc0hvc3RDdG9yID0gL15cXFtvYmplY3QgLis/Q29uc3RydWN0b3JcXF0kLztcblxuICAvKiogVXNlZCB0byBkZXRlY3QgdW5zaWduZWQgaW50ZWdlciB2YWx1ZXMuICovXG4gIHZhciByZUlzVWludCA9IC9eXFxkKyQvO1xuXG4gIC8qKiBVc2VkIHRvIG1hdGNoIGxhdGluLTEgc3VwcGxlbWVudGFyeSBsZXR0ZXJzIChleGNsdWRpbmcgbWF0aGVtYXRpY2FsIG9wZXJhdG9ycykuICovXG4gIHZhciByZUxhdGluMSA9IC9bXFx4YzAtXFx4ZDZcXHhkOC1cXHhkZVxceGRmLVxceGY2XFx4ZjgtXFx4ZmZdL2c7XG5cbiAgLyoqIFVzZWQgdG8gZW5zdXJlIGNhcHR1cmluZyBvcmRlciBvZiB0ZW1wbGF0ZSBkZWxpbWl0ZXJzLiAqL1xuICB2YXIgcmVOb01hdGNoID0gLygkXikvO1xuXG4gIC8qKiBVc2VkIHRvIG1hdGNoIHVuZXNjYXBlZCBjaGFyYWN0ZXJzIGluIGNvbXBpbGVkIHN0cmluZyBsaXRlcmFscy4gKi9cbiAgdmFyIHJlVW5lc2NhcGVkU3RyaW5nID0gL1snXFxuXFxyXFx1MjAyOFxcdTIwMjlcXFxcXS9nO1xuXG4gIC8qKiBVc2VkIHRvIG1hdGNoIHdvcmRzIHRvIGNyZWF0ZSBjb21wb3VuZCB3b3Jkcy4gKi9cbiAgdmFyIHJlV29yZHMgPSAoZnVuY3Rpb24oKSB7XG4gICAgdmFyIHVwcGVyID0gJ1tBLVpcXFxceGMwLVxcXFx4ZDZcXFxceGQ4LVxcXFx4ZGVdJyxcbiAgICAgICAgbG93ZXIgPSAnW2EtelxcXFx4ZGYtXFxcXHhmNlxcXFx4ZjgtXFxcXHhmZl0rJztcblxuICAgIHJldHVybiBSZWdFeHAodXBwZXIgKyAnKyg/PScgKyB1cHBlciArIGxvd2VyICsgJyl8JyArIHVwcGVyICsgJz8nICsgbG93ZXIgKyAnfCcgKyB1cHBlciArICcrfFswLTldKycsICdnJyk7XG4gIH0oKSk7XG5cbiAgLyoqIFVzZWQgdG8gYXNzaWduIGRlZmF1bHQgYGNvbnRleHRgIG9iamVjdCBwcm9wZXJ0aWVzLiAqL1xuICB2YXIgY29udGV4dFByb3BzID0gW1xuICAgICdBcnJheScsICdBcnJheUJ1ZmZlcicsICdEYXRlJywgJ0Vycm9yJywgJ0Zsb2F0MzJBcnJheScsICdGbG9hdDY0QXJyYXknLFxuICAgICdGdW5jdGlvbicsICdJbnQ4QXJyYXknLCAnSW50MTZBcnJheScsICdJbnQzMkFycmF5JywgJ01hdGgnLCAnTnVtYmVyJyxcbiAgICAnT2JqZWN0JywgJ1JlZ0V4cCcsICdTZXQnLCAnU3RyaW5nJywgJ18nLCAnY2xlYXJUaW1lb3V0JywgJ2lzRmluaXRlJyxcbiAgICAncGFyc2VGbG9hdCcsICdwYXJzZUludCcsICdzZXRUaW1lb3V0JywgJ1R5cGVFcnJvcicsICdVaW50OEFycmF5JyxcbiAgICAnVWludDhDbGFtcGVkQXJyYXknLCAnVWludDE2QXJyYXknLCAnVWludDMyQXJyYXknLCAnV2Vha01hcCdcbiAgXTtcblxuICAvKiogVXNlZCB0byBtYWtlIHRlbXBsYXRlIHNvdXJjZVVSTHMgZWFzaWVyIHRvIGlkZW50aWZ5LiAqL1xuICB2YXIgdGVtcGxhdGVDb3VudGVyID0gLTE7XG5cbiAgLyoqIFVzZWQgdG8gaWRlbnRpZnkgYHRvU3RyaW5nVGFnYCB2YWx1ZXMgb2YgdHlwZWQgYXJyYXlzLiAqL1xuICB2YXIgdHlwZWRBcnJheVRhZ3MgPSB7fTtcbiAgdHlwZWRBcnJheVRhZ3NbZmxvYXQzMlRhZ10gPSB0eXBlZEFycmF5VGFnc1tmbG9hdDY0VGFnXSA9XG4gIHR5cGVkQXJyYXlUYWdzW2ludDhUYWddID0gdHlwZWRBcnJheVRhZ3NbaW50MTZUYWddID1cbiAgdHlwZWRBcnJheVRhZ3NbaW50MzJUYWddID0gdHlwZWRBcnJheVRhZ3NbdWludDhUYWddID1cbiAgdHlwZWRBcnJheVRhZ3NbdWludDhDbGFtcGVkVGFnXSA9IHR5cGVkQXJyYXlUYWdzW3VpbnQxNlRhZ10gPVxuICB0eXBlZEFycmF5VGFnc1t1aW50MzJUYWddID0gdHJ1ZTtcbiAgdHlwZWRBcnJheVRhZ3NbYXJnc1RhZ10gPSB0eXBlZEFycmF5VGFnc1thcnJheVRhZ10gPVxuICB0eXBlZEFycmF5VGFnc1thcnJheUJ1ZmZlclRhZ10gPSB0eXBlZEFycmF5VGFnc1tib29sVGFnXSA9XG4gIHR5cGVkQXJyYXlUYWdzW2RhdGVUYWddID0gdHlwZWRBcnJheVRhZ3NbZXJyb3JUYWddID1cbiAgdHlwZWRBcnJheVRhZ3NbZnVuY1RhZ10gPSB0eXBlZEFycmF5VGFnc1ttYXBUYWddID1cbiAgdHlwZWRBcnJheVRhZ3NbbnVtYmVyVGFnXSA9IHR5cGVkQXJyYXlUYWdzW29iamVjdFRhZ10gPVxuICB0eXBlZEFycmF5VGFnc1tyZWdleHBUYWddID0gdHlwZWRBcnJheVRhZ3Nbc2V0VGFnXSA9XG4gIHR5cGVkQXJyYXlUYWdzW3N0cmluZ1RhZ10gPSB0eXBlZEFycmF5VGFnc1t3ZWFrTWFwVGFnXSA9IGZhbHNlO1xuXG4gIC8qKiBVc2VkIHRvIGlkZW50aWZ5IGB0b1N0cmluZ1RhZ2AgdmFsdWVzIHN1cHBvcnRlZCBieSBgXy5jbG9uZWAuICovXG4gIHZhciBjbG9uZWFibGVUYWdzID0ge307XG4gIGNsb25lYWJsZVRhZ3NbYXJnc1RhZ10gPSBjbG9uZWFibGVUYWdzW2FycmF5VGFnXSA9XG4gIGNsb25lYWJsZVRhZ3NbYXJyYXlCdWZmZXJUYWddID0gY2xvbmVhYmxlVGFnc1tib29sVGFnXSA9XG4gIGNsb25lYWJsZVRhZ3NbZGF0ZVRhZ10gPSBjbG9uZWFibGVUYWdzW2Zsb2F0MzJUYWddID1cbiAgY2xvbmVhYmxlVGFnc1tmbG9hdDY0VGFnXSA9IGNsb25lYWJsZVRhZ3NbaW50OFRhZ10gPVxuICBjbG9uZWFibGVUYWdzW2ludDE2VGFnXSA9IGNsb25lYWJsZVRhZ3NbaW50MzJUYWddID1cbiAgY2xvbmVhYmxlVGFnc1tudW1iZXJUYWddID0gY2xvbmVhYmxlVGFnc1tvYmplY3RUYWddID1cbiAgY2xvbmVhYmxlVGFnc1tyZWdleHBUYWddID0gY2xvbmVhYmxlVGFnc1tzdHJpbmdUYWddID1cbiAgY2xvbmVhYmxlVGFnc1t1aW50OFRhZ10gPSBjbG9uZWFibGVUYWdzW3VpbnQ4Q2xhbXBlZFRhZ10gPVxuICBjbG9uZWFibGVUYWdzW3VpbnQxNlRhZ10gPSBjbG9uZWFibGVUYWdzW3VpbnQzMlRhZ10gPSB0cnVlO1xuICBjbG9uZWFibGVUYWdzW2Vycm9yVGFnXSA9IGNsb25lYWJsZVRhZ3NbZnVuY1RhZ10gPVxuICBjbG9uZWFibGVUYWdzW21hcFRhZ10gPSBjbG9uZWFibGVUYWdzW3NldFRhZ10gPVxuICBjbG9uZWFibGVUYWdzW3dlYWtNYXBUYWddID0gZmFsc2U7XG5cbiAgLyoqIFVzZWQgdG8gbWFwIGxhdGluLTEgc3VwcGxlbWVudGFyeSBsZXR0ZXJzIHRvIGJhc2ljIGxhdGluIGxldHRlcnMuICovXG4gIHZhciBkZWJ1cnJlZExldHRlcnMgPSB7XG4gICAgJ1xceGMwJzogJ0EnLCAgJ1xceGMxJzogJ0EnLCAnXFx4YzInOiAnQScsICdcXHhjMyc6ICdBJywgJ1xceGM0JzogJ0EnLCAnXFx4YzUnOiAnQScsXG4gICAgJ1xceGUwJzogJ2EnLCAgJ1xceGUxJzogJ2EnLCAnXFx4ZTInOiAnYScsICdcXHhlMyc6ICdhJywgJ1xceGU0JzogJ2EnLCAnXFx4ZTUnOiAnYScsXG4gICAgJ1xceGM3JzogJ0MnLCAgJ1xceGU3JzogJ2MnLFxuICAgICdcXHhkMCc6ICdEJywgICdcXHhmMCc6ICdkJyxcbiAgICAnXFx4YzgnOiAnRScsICAnXFx4YzknOiAnRScsICdcXHhjYSc6ICdFJywgJ1xceGNiJzogJ0UnLFxuICAgICdcXHhlOCc6ICdlJywgICdcXHhlOSc6ICdlJywgJ1xceGVhJzogJ2UnLCAnXFx4ZWInOiAnZScsXG4gICAgJ1xceGNDJzogJ0knLCAgJ1xceGNkJzogJ0knLCAnXFx4Y2UnOiAnSScsICdcXHhjZic6ICdJJyxcbiAgICAnXFx4ZUMnOiAnaScsICAnXFx4ZWQnOiAnaScsICdcXHhlZSc6ICdpJywgJ1xceGVmJzogJ2knLFxuICAgICdcXHhkMSc6ICdOJywgICdcXHhmMSc6ICduJyxcbiAgICAnXFx4ZDInOiAnTycsICAnXFx4ZDMnOiAnTycsICdcXHhkNCc6ICdPJywgJ1xceGQ1JzogJ08nLCAnXFx4ZDYnOiAnTycsICdcXHhkOCc6ICdPJyxcbiAgICAnXFx4ZjInOiAnbycsICAnXFx4ZjMnOiAnbycsICdcXHhmNCc6ICdvJywgJ1xceGY1JzogJ28nLCAnXFx4ZjYnOiAnbycsICdcXHhmOCc6ICdvJyxcbiAgICAnXFx4ZDknOiAnVScsICAnXFx4ZGEnOiAnVScsICdcXHhkYic6ICdVJywgJ1xceGRjJzogJ1UnLFxuICAgICdcXHhmOSc6ICd1JywgICdcXHhmYSc6ICd1JywgJ1xceGZiJzogJ3UnLCAnXFx4ZmMnOiAndScsXG4gICAgJ1xceGRkJzogJ1knLCAgJ1xceGZkJzogJ3knLCAnXFx4ZmYnOiAneScsXG4gICAgJ1xceGM2JzogJ0FlJywgJ1xceGU2JzogJ2FlJyxcbiAgICAnXFx4ZGUnOiAnVGgnLCAnXFx4ZmUnOiAndGgnLFxuICAgICdcXHhkZic6ICdzcydcbiAgfTtcblxuICAvKiogVXNlZCB0byBtYXAgY2hhcmFjdGVycyB0byBIVE1MIGVudGl0aWVzLiAqL1xuICB2YXIgaHRtbEVzY2FwZXMgPSB7XG4gICAgJyYnOiAnJmFtcDsnLFxuICAgICc8JzogJyZsdDsnLFxuICAgICc+JzogJyZndDsnLFxuICAgICdcIic6ICcmcXVvdDsnLFxuICAgIFwiJ1wiOiAnJiMzOTsnLFxuICAgICdgJzogJyYjOTY7J1xuICB9O1xuXG4gIC8qKiBVc2VkIHRvIG1hcCBIVE1MIGVudGl0aWVzIHRvIGNoYXJhY3RlcnMuICovXG4gIHZhciBodG1sVW5lc2NhcGVzID0ge1xuICAgICcmYW1wOyc6ICcmJyxcbiAgICAnJmx0Oyc6ICc8JyxcbiAgICAnJmd0Oyc6ICc+JyxcbiAgICAnJnF1b3Q7JzogJ1wiJyxcbiAgICAnJiMzOTsnOiBcIidcIixcbiAgICAnJiM5NjsnOiAnYCdcbiAgfTtcblxuICAvKiogVXNlZCB0byBkZXRlcm1pbmUgaWYgdmFsdWVzIGFyZSBvZiB0aGUgbGFuZ3VhZ2UgdHlwZSBgT2JqZWN0YC4gKi9cbiAgdmFyIG9iamVjdFR5cGVzID0ge1xuICAgICdmdW5jdGlvbic6IHRydWUsXG4gICAgJ29iamVjdCc6IHRydWVcbiAgfTtcblxuICAvKiogVXNlZCB0byBlc2NhcGUgY2hhcmFjdGVycyBmb3IgaW5jbHVzaW9uIGluIGNvbXBpbGVkIHJlZ2V4ZXMuICovXG4gIHZhciByZWdleHBFc2NhcGVzID0ge1xuICAgICcwJzogJ3gzMCcsICcxJzogJ3gzMScsICcyJzogJ3gzMicsICczJzogJ3gzMycsICc0JzogJ3gzNCcsXG4gICAgJzUnOiAneDM1JywgJzYnOiAneDM2JywgJzcnOiAneDM3JywgJzgnOiAneDM4JywgJzknOiAneDM5JyxcbiAgICAnQSc6ICd4NDEnLCAnQic6ICd4NDInLCAnQyc6ICd4NDMnLCAnRCc6ICd4NDQnLCAnRSc6ICd4NDUnLCAnRic6ICd4NDYnLFxuICAgICdhJzogJ3g2MScsICdiJzogJ3g2MicsICdjJzogJ3g2MycsICdkJzogJ3g2NCcsICdlJzogJ3g2NScsICdmJzogJ3g2NicsXG4gICAgJ24nOiAneDZlJywgJ3InOiAneDcyJywgJ3QnOiAneDc0JywgJ3UnOiAneDc1JywgJ3YnOiAneDc2JywgJ3gnOiAneDc4J1xuICB9O1xuXG4gIC8qKiBVc2VkIHRvIGVzY2FwZSBjaGFyYWN0ZXJzIGZvciBpbmNsdXNpb24gaW4gY29tcGlsZWQgc3RyaW5nIGxpdGVyYWxzLiAqL1xuICB2YXIgc3RyaW5nRXNjYXBlcyA9IHtcbiAgICAnXFxcXCc6ICdcXFxcJyxcbiAgICBcIidcIjogXCInXCIsXG4gICAgJ1xcbic6ICduJyxcbiAgICAnXFxyJzogJ3InLFxuICAgICdcXHUyMDI4JzogJ3UyMDI4JyxcbiAgICAnXFx1MjAyOSc6ICd1MjAyOSdcbiAgfTtcblxuICAvKiogRGV0ZWN0IGZyZWUgdmFyaWFibGUgYGV4cG9ydHNgLiAqL1xuICB2YXIgZnJlZUV4cG9ydHMgPSBvYmplY3RUeXBlc1t0eXBlb2YgZXhwb3J0c10gJiYgZXhwb3J0cyAmJiAhZXhwb3J0cy5ub2RlVHlwZSAmJiBleHBvcnRzO1xuXG4gIC8qKiBEZXRlY3QgZnJlZSB2YXJpYWJsZSBgbW9kdWxlYC4gKi9cbiAgdmFyIGZyZWVNb2R1bGUgPSBvYmplY3RUeXBlc1t0eXBlb2YgbW9kdWxlXSAmJiBtb2R1bGUgJiYgIW1vZHVsZS5ub2RlVHlwZSAmJiBtb2R1bGU7XG5cbiAgLyoqIERldGVjdCBmcmVlIHZhcmlhYmxlIGBnbG9iYWxgIGZyb20gTm9kZS5qcy4gKi9cbiAgdmFyIGZyZWVHbG9iYWwgPSBmcmVlRXhwb3J0cyAmJiBmcmVlTW9kdWxlICYmIHR5cGVvZiBnbG9iYWwgPT0gJ29iamVjdCcgJiYgZ2xvYmFsICYmIGdsb2JhbC5PYmplY3QgJiYgZ2xvYmFsO1xuXG4gIC8qKiBEZXRlY3QgZnJlZSB2YXJpYWJsZSBgc2VsZmAuICovXG4gIHZhciBmcmVlU2VsZiA9IG9iamVjdFR5cGVzW3R5cGVvZiBzZWxmXSAmJiBzZWxmICYmIHNlbGYuT2JqZWN0ICYmIHNlbGY7XG5cbiAgLyoqIERldGVjdCBmcmVlIHZhcmlhYmxlIGB3aW5kb3dgLiAqL1xuICB2YXIgZnJlZVdpbmRvdyA9IG9iamVjdFR5cGVzW3R5cGVvZiB3aW5kb3ddICYmIHdpbmRvdyAmJiB3aW5kb3cuT2JqZWN0ICYmIHdpbmRvdztcblxuICAvKiogRGV0ZWN0IHRoZSBwb3B1bGFyIENvbW1vbkpTIGV4dGVuc2lvbiBgbW9kdWxlLmV4cG9ydHNgLiAqL1xuICB2YXIgbW9kdWxlRXhwb3J0cyA9IGZyZWVNb2R1bGUgJiYgZnJlZU1vZHVsZS5leHBvcnRzID09PSBmcmVlRXhwb3J0cyAmJiBmcmVlRXhwb3J0cztcblxuICAvKipcbiAgICogVXNlZCBhcyBhIHJlZmVyZW5jZSB0byB0aGUgZ2xvYmFsIG9iamVjdC5cbiAgICpcbiAgICogVGhlIGB0aGlzYCB2YWx1ZSBpcyB1c2VkIGlmIGl0J3MgdGhlIGdsb2JhbCBvYmplY3QgdG8gYXZvaWQgR3JlYXNlbW9ua2V5J3NcbiAgICogcmVzdHJpY3RlZCBgd2luZG93YCBvYmplY3QsIG90aGVyd2lzZSB0aGUgYHdpbmRvd2Agb2JqZWN0IGlzIHVzZWQuXG4gICAqL1xuICB2YXIgcm9vdCA9IGZyZWVHbG9iYWwgfHwgKChmcmVlV2luZG93ICE9PSAodGhpcyAmJiB0aGlzLndpbmRvdykpICYmIGZyZWVXaW5kb3cpIHx8IGZyZWVTZWxmIHx8IHRoaXM7XG5cbiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5cbiAgLyoqXG4gICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBjb21wYXJlQXNjZW5kaW5nYCB3aGljaCBjb21wYXJlcyB2YWx1ZXMgYW5kXG4gICAqIHNvcnRzIHRoZW0gaW4gYXNjZW5kaW5nIG9yZGVyIHdpdGhvdXQgZ3VhcmFudGVlaW5nIGEgc3RhYmxlIHNvcnQuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbXBhcmUuXG4gICAqIEBwYXJhbSB7Kn0gb3RoZXIgVGhlIG90aGVyIHZhbHVlIHRvIGNvbXBhcmUuXG4gICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIHNvcnQgb3JkZXIgaW5kaWNhdG9yIGZvciBgdmFsdWVgLlxuICAgKi9cbiAgZnVuY3Rpb24gYmFzZUNvbXBhcmVBc2NlbmRpbmcodmFsdWUsIG90aGVyKSB7XG4gICAgaWYgKHZhbHVlICE9PSBvdGhlcikge1xuICAgICAgdmFyIHZhbElzTnVsbCA9IHZhbHVlID09PSBudWxsLFxuICAgICAgICAgIHZhbElzVW5kZWYgPSB2YWx1ZSA9PT0gdW5kZWZpbmVkLFxuICAgICAgICAgIHZhbElzUmVmbGV4aXZlID0gdmFsdWUgPT09IHZhbHVlO1xuXG4gICAgICB2YXIgb3RoSXNOdWxsID0gb3RoZXIgPT09IG51bGwsXG4gICAgICAgICAgb3RoSXNVbmRlZiA9IG90aGVyID09PSB1bmRlZmluZWQsXG4gICAgICAgICAgb3RoSXNSZWZsZXhpdmUgPSBvdGhlciA9PT0gb3RoZXI7XG5cbiAgICAgIGlmICgodmFsdWUgPiBvdGhlciAmJiAhb3RoSXNOdWxsKSB8fCAhdmFsSXNSZWZsZXhpdmUgfHxcbiAgICAgICAgICAodmFsSXNOdWxsICYmICFvdGhJc1VuZGVmICYmIG90aElzUmVmbGV4aXZlKSB8fFxuICAgICAgICAgICh2YWxJc1VuZGVmICYmIG90aElzUmVmbGV4aXZlKSkge1xuICAgICAgICByZXR1cm4gMTtcbiAgICAgIH1cbiAgICAgIGlmICgodmFsdWUgPCBvdGhlciAmJiAhdmFsSXNOdWxsKSB8fCAhb3RoSXNSZWZsZXhpdmUgfHxcbiAgICAgICAgICAob3RoSXNOdWxsICYmICF2YWxJc1VuZGVmICYmIHZhbElzUmVmbGV4aXZlKSB8fFxuICAgICAgICAgIChvdGhJc1VuZGVmICYmIHZhbElzUmVmbGV4aXZlKSkge1xuICAgICAgICByZXR1cm4gLTE7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiAwO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmZpbmRJbmRleGAgYW5kIGBfLmZpbmRMYXN0SW5kZXhgIHdpdGhvdXRcbiAgICogc3VwcG9ydCBmb3IgY2FsbGJhY2sgc2hvcnRoYW5kcyBhbmQgYHRoaXNgIGJpbmRpbmcuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBzZWFyY2guXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IHByZWRpY2F0ZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtmcm9tUmlnaHRdIFNwZWNpZnkgaXRlcmF0aW5nIGZyb20gcmlnaHQgdG8gbGVmdC5cbiAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIG1hdGNoZWQgdmFsdWUsIGVsc2UgYC0xYC5cbiAgICovXG4gIGZ1bmN0aW9uIGJhc2VGaW5kSW5kZXgoYXJyYXksIHByZWRpY2F0ZSwgZnJvbVJpZ2h0KSB7XG4gICAgdmFyIGxlbmd0aCA9IGFycmF5Lmxlbmd0aCxcbiAgICAgICAgaW5kZXggPSBmcm9tUmlnaHQgPyBsZW5ndGggOiAtMTtcblxuICAgIHdoaWxlICgoZnJvbVJpZ2h0ID8gaW5kZXgtLSA6ICsraW5kZXggPCBsZW5ndGgpKSB7XG4gICAgICBpZiAocHJlZGljYXRlKGFycmF5W2luZGV4XSwgaW5kZXgsIGFycmF5KSkge1xuICAgICAgICByZXR1cm4gaW5kZXg7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiAtMTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5pbmRleE9mYCB3aXRob3V0IHN1cHBvcnQgZm9yIGJpbmFyeSBzZWFyY2hlcy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIHNlYXJjaC5cbiAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gc2VhcmNoIGZvci5cbiAgICogQHBhcmFtIHtudW1iZXJ9IGZyb21JbmRleCBUaGUgaW5kZXggdG8gc2VhcmNoIGZyb20uXG4gICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBtYXRjaGVkIHZhbHVlLCBlbHNlIGAtMWAuXG4gICAqL1xuICBmdW5jdGlvbiBiYXNlSW5kZXhPZihhcnJheSwgdmFsdWUsIGZyb21JbmRleCkge1xuICAgIGlmICh2YWx1ZSAhPT0gdmFsdWUpIHtcbiAgICAgIHJldHVybiBpbmRleE9mTmFOKGFycmF5LCBmcm9tSW5kZXgpO1xuICAgIH1cbiAgICB2YXIgaW5kZXggPSBmcm9tSW5kZXggLSAxLFxuICAgICAgICBsZW5ndGggPSBhcnJheS5sZW5ndGg7XG5cbiAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgaWYgKGFycmF5W2luZGV4XSA9PT0gdmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIGluZGV4O1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gLTE7XG4gIH1cblxuICAvKipcbiAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uaXNGdW5jdGlvbmAgd2l0aG91dCBzdXBwb3J0IGZvciBlbnZpcm9ubWVudHNcbiAgICogd2l0aCBpbmNvcnJlY3QgYHR5cGVvZmAgcmVzdWx0cy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGNvcnJlY3RseSBjbGFzc2lmaWVkLCBlbHNlIGBmYWxzZWAuXG4gICAqL1xuICBmdW5jdGlvbiBiYXNlSXNGdW5jdGlvbih2YWx1ZSkge1xuICAgIC8vIEF2b2lkIGEgQ2hha3JhIEpJVCBidWcgaW4gY29tcGF0aWJpbGl0eSBtb2RlcyBvZiBJRSAxMS5cbiAgICAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2phc2hrZW5hcy91bmRlcnNjb3JlL2lzc3Vlcy8xNjIxIGZvciBtb3JlIGRldGFpbHMuXG4gICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PSAnZnVuY3Rpb24nIHx8IGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlcnRzIGB2YWx1ZWAgdG8gYSBzdHJpbmcgaWYgaXQncyBub3Qgb25lLiBBbiBlbXB0eSBzdHJpbmcgaXMgcmV0dXJuZWRcbiAgICogZm9yIGBudWxsYCBvciBgdW5kZWZpbmVkYCB2YWx1ZXMuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHByb2Nlc3MuXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIHN0cmluZy5cbiAgICovXG4gIGZ1bmN0aW9uIGJhc2VUb1N0cmluZyh2YWx1ZSkge1xuICAgIHJldHVybiB2YWx1ZSA9PSBudWxsID8gJycgOiAodmFsdWUgKyAnJyk7XG4gIH1cblxuICAvKipcbiAgICogVXNlZCBieSBgXy50cmltYCBhbmQgYF8udHJpbUxlZnRgIHRvIGdldCB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IGNoYXJhY3RlclxuICAgKiBvZiBgc3RyaW5nYCB0aGF0IGlzIG5vdCBmb3VuZCBpbiBgY2hhcnNgLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyaW5nIFRoZSBzdHJpbmcgdG8gaW5zcGVjdC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGNoYXJzIFRoZSBjaGFyYWN0ZXJzIHRvIGZpbmQuXG4gICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBjaGFyYWN0ZXIgbm90IGZvdW5kIGluIGBjaGFyc2AuXG4gICAqL1xuICBmdW5jdGlvbiBjaGFyc0xlZnRJbmRleChzdHJpbmcsIGNoYXJzKSB7XG4gICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgIGxlbmd0aCA9IHN0cmluZy5sZW5ndGg7XG5cbiAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCAmJiBjaGFycy5pbmRleE9mKHN0cmluZy5jaGFyQXQoaW5kZXgpKSA+IC0xKSB7fVxuICAgIHJldHVybiBpbmRleDtcbiAgfVxuXG4gIC8qKlxuICAgKiBVc2VkIGJ5IGBfLnRyaW1gIGFuZCBgXy50cmltUmlnaHRgIHRvIGdldCB0aGUgaW5kZXggb2YgdGhlIGxhc3QgY2hhcmFjdGVyXG4gICAqIG9mIGBzdHJpbmdgIHRoYXQgaXMgbm90IGZvdW5kIGluIGBjaGFyc2AuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdHJpbmcgVGhlIHN0cmluZyB0byBpbnNwZWN0LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gY2hhcnMgVGhlIGNoYXJhY3RlcnMgdG8gZmluZC5cbiAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIGxhc3QgY2hhcmFjdGVyIG5vdCBmb3VuZCBpbiBgY2hhcnNgLlxuICAgKi9cbiAgZnVuY3Rpb24gY2hhcnNSaWdodEluZGV4KHN0cmluZywgY2hhcnMpIHtcbiAgICB2YXIgaW5kZXggPSBzdHJpbmcubGVuZ3RoO1xuXG4gICAgd2hpbGUgKGluZGV4LS0gJiYgY2hhcnMuaW5kZXhPZihzdHJpbmcuY2hhckF0KGluZGV4KSkgPiAtMSkge31cbiAgICByZXR1cm4gaW5kZXg7XG4gIH1cblxuICAvKipcbiAgICogVXNlZCBieSBgXy5zb3J0QnlgIHRvIGNvbXBhcmUgdHJhbnNmb3JtZWQgZWxlbWVudHMgb2YgYSBjb2xsZWN0aW9uIGFuZCBzdGFibGVcbiAgICogc29ydCB0aGVtIGluIGFzY2VuZGluZyBvcmRlci5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGNvbXBhcmUuXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvdGhlciBUaGUgb3RoZXIgb2JqZWN0IHRvIGNvbXBhcmUuXG4gICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIHNvcnQgb3JkZXIgaW5kaWNhdG9yIGZvciBgb2JqZWN0YC5cbiAgICovXG4gIGZ1bmN0aW9uIGNvbXBhcmVBc2NlbmRpbmcob2JqZWN0LCBvdGhlcikge1xuICAgIHJldHVybiBiYXNlQ29tcGFyZUFzY2VuZGluZyhvYmplY3QuY3JpdGVyaWEsIG90aGVyLmNyaXRlcmlhKSB8fCAob2JqZWN0LmluZGV4IC0gb3RoZXIuaW5kZXgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFVzZWQgYnkgYF8uc29ydEJ5T3JkZXJgIHRvIGNvbXBhcmUgbXVsdGlwbGUgcHJvcGVydGllcyBvZiBhIHZhbHVlIHRvIGFub3RoZXJcbiAgICogYW5kIHN0YWJsZSBzb3J0IHRoZW0uXG4gICAqXG4gICAqIElmIGBvcmRlcnNgIGlzIHVuc3BlY2lmaWVkLCBhbGwgdmFsdWVzcyBhcmUgc29ydGVkIGluIGFzY2VuZGluZyBvcmRlci4gT3RoZXJ3aXNlLFxuICAgKiBhIHZhbHVlIGlzIHNvcnRlZCBpbiBhc2NlbmRpbmcgb3JkZXIgaWYgaXRzIGNvcnJlc3BvbmRpbmcgb3JkZXIgaXMgXCJhc2NcIiwgYW5kXG4gICAqIGRlc2NlbmRpbmcgaWYgXCJkZXNjXCIuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBjb21wYXJlLlxuICAgKiBAcGFyYW0ge09iamVjdH0gb3RoZXIgVGhlIG90aGVyIG9iamVjdCB0byBjb21wYXJlLlxuICAgKiBAcGFyYW0ge2Jvb2xlYW5bXX0gb3JkZXJzIFRoZSBvcmRlciB0byBzb3J0IGJ5IGZvciBlYWNoIHByb3BlcnR5LlxuICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBzb3J0IG9yZGVyIGluZGljYXRvciBmb3IgYG9iamVjdGAuXG4gICAqL1xuICBmdW5jdGlvbiBjb21wYXJlTXVsdGlwbGUob2JqZWN0LCBvdGhlciwgb3JkZXJzKSB7XG4gICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgIG9iakNyaXRlcmlhID0gb2JqZWN0LmNyaXRlcmlhLFxuICAgICAgICBvdGhDcml0ZXJpYSA9IG90aGVyLmNyaXRlcmlhLFxuICAgICAgICBsZW5ndGggPSBvYmpDcml0ZXJpYS5sZW5ndGgsXG4gICAgICAgIG9yZGVyc0xlbmd0aCA9IG9yZGVycy5sZW5ndGg7XG5cbiAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgdmFyIHJlc3VsdCA9IGJhc2VDb21wYXJlQXNjZW5kaW5nKG9iakNyaXRlcmlhW2luZGV4XSwgb3RoQ3JpdGVyaWFbaW5kZXhdKTtcbiAgICAgIGlmIChyZXN1bHQpIHtcbiAgICAgICAgaWYgKGluZGV4ID49IG9yZGVyc0xlbmd0aCkge1xuICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIG9yZGVyID0gb3JkZXJzW2luZGV4XTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdCAqICgob3JkZXIgPT09ICdhc2MnIHx8IG9yZGVyID09PSB0cnVlKSA/IDEgOiAtMSk7XG4gICAgICB9XG4gICAgfVxuICAgIC8vIEZpeGVzIGFuIGBBcnJheSNzb3J0YCBidWcgaW4gdGhlIEpTIGVuZ2luZSBlbWJlZGRlZCBpbiBBZG9iZSBhcHBsaWNhdGlvbnNcbiAgICAvLyB0aGF0IGNhdXNlcyBpdCwgdW5kZXIgY2VydGFpbiBjaXJjdW1zdGFuY2VzLCB0byBwcm92aWRlIHRoZSBzYW1lIHZhbHVlIGZvclxuICAgIC8vIGBvYmplY3RgIGFuZCBgb3RoZXJgLiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2phc2hrZW5hcy91bmRlcnNjb3JlL3B1bGwvMTI0N1xuICAgIC8vIGZvciBtb3JlIGRldGFpbHMuXG4gICAgLy9cbiAgICAvLyBUaGlzIGFsc28gZW5zdXJlcyBhIHN0YWJsZSBzb3J0IGluIFY4IGFuZCBvdGhlciBlbmdpbmVzLlxuICAgIC8vIFNlZSBodHRwczovL2NvZGUuZ29vZ2xlLmNvbS9wL3Y4L2lzc3Vlcy9kZXRhaWw/aWQ9OTAgZm9yIG1vcmUgZGV0YWlscy5cbiAgICByZXR1cm4gb2JqZWN0LmluZGV4IC0gb3RoZXIuaW5kZXg7XG4gIH1cblxuICAvKipcbiAgICogVXNlZCBieSBgXy5kZWJ1cnJgIHRvIGNvbnZlcnQgbGF0aW4tMSBzdXBwbGVtZW50YXJ5IGxldHRlcnMgdG8gYmFzaWMgbGF0aW4gbGV0dGVycy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IGxldHRlciBUaGUgbWF0Y2hlZCBsZXR0ZXIgdG8gZGVidXJyLlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBkZWJ1cnJlZCBsZXR0ZXIuXG4gICAqL1xuICBmdW5jdGlvbiBkZWJ1cnJMZXR0ZXIobGV0dGVyKSB7XG4gICAgcmV0dXJuIGRlYnVycmVkTGV0dGVyc1tsZXR0ZXJdO1xuICB9XG5cbiAgLyoqXG4gICAqIFVzZWQgYnkgYF8uZXNjYXBlYCB0byBjb252ZXJ0IGNoYXJhY3RlcnMgdG8gSFRNTCBlbnRpdGllcy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IGNociBUaGUgbWF0Y2hlZCBjaGFyYWN0ZXIgdG8gZXNjYXBlLlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBlc2NhcGVkIGNoYXJhY3Rlci5cbiAgICovXG4gIGZ1bmN0aW9uIGVzY2FwZUh0bWxDaGFyKGNocikge1xuICAgIHJldHVybiBodG1sRXNjYXBlc1tjaHJdO1xuICB9XG5cbiAgLyoqXG4gICAqIFVzZWQgYnkgYF8uZXNjYXBlUmVnRXhwYCB0byBlc2NhcGUgY2hhcmFjdGVycyBmb3IgaW5jbHVzaW9uIGluIGNvbXBpbGVkIHJlZ2V4ZXMuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjaHIgVGhlIG1hdGNoZWQgY2hhcmFjdGVyIHRvIGVzY2FwZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGxlYWRpbmdDaGFyIFRoZSBjYXB0dXJlIGdyb3VwIGZvciBhIGxlYWRpbmcgY2hhcmFjdGVyLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gd2hpdGVzcGFjZUNoYXIgVGhlIGNhcHR1cmUgZ3JvdXAgZm9yIGEgd2hpdGVzcGFjZSBjaGFyYWN0ZXIuXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIGVzY2FwZWQgY2hhcmFjdGVyLlxuICAgKi9cbiAgZnVuY3Rpb24gZXNjYXBlUmVnRXhwQ2hhcihjaHIsIGxlYWRpbmdDaGFyLCB3aGl0ZXNwYWNlQ2hhcikge1xuICAgIGlmIChsZWFkaW5nQ2hhcikge1xuICAgICAgY2hyID0gcmVnZXhwRXNjYXBlc1tjaHJdO1xuICAgIH0gZWxzZSBpZiAod2hpdGVzcGFjZUNoYXIpIHtcbiAgICAgIGNociA9IHN0cmluZ0VzY2FwZXNbY2hyXTtcbiAgICB9XG4gICAgcmV0dXJuICdcXFxcJyArIGNocjtcbiAgfVxuXG4gIC8qKlxuICAgKiBVc2VkIGJ5IGBfLnRlbXBsYXRlYCB0byBlc2NhcGUgY2hhcmFjdGVycyBmb3IgaW5jbHVzaW9uIGluIGNvbXBpbGVkIHN0cmluZyBsaXRlcmFscy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IGNociBUaGUgbWF0Y2hlZCBjaGFyYWN0ZXIgdG8gZXNjYXBlLlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBlc2NhcGVkIGNoYXJhY3Rlci5cbiAgICovXG4gIGZ1bmN0aW9uIGVzY2FwZVN0cmluZ0NoYXIoY2hyKSB7XG4gICAgcmV0dXJuICdcXFxcJyArIHN0cmluZ0VzY2FwZXNbY2hyXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBpbmRleCBhdCB3aGljaCB0aGUgZmlyc3Qgb2NjdXJyZW5jZSBvZiBgTmFOYCBpcyBmb3VuZCBpbiBgYXJyYXlgLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gc2VhcmNoLlxuICAgKiBAcGFyYW0ge251bWJlcn0gZnJvbUluZGV4IFRoZSBpbmRleCB0byBzZWFyY2ggZnJvbS5cbiAgICogQHBhcmFtIHtib29sZWFufSBbZnJvbVJpZ2h0XSBTcGVjaWZ5IGl0ZXJhdGluZyBmcm9tIHJpZ2h0IHRvIGxlZnQuXG4gICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBtYXRjaGVkIGBOYU5gLCBlbHNlIGAtMWAuXG4gICAqL1xuICBmdW5jdGlvbiBpbmRleE9mTmFOKGFycmF5LCBmcm9tSW5kZXgsIGZyb21SaWdodCkge1xuICAgIHZhciBsZW5ndGggPSBhcnJheS5sZW5ndGgsXG4gICAgICAgIGluZGV4ID0gZnJvbUluZGV4ICsgKGZyb21SaWdodCA/IDAgOiAtMSk7XG5cbiAgICB3aGlsZSAoKGZyb21SaWdodCA/IGluZGV4LS0gOiArK2luZGV4IDwgbGVuZ3RoKSkge1xuICAgICAgdmFyIG90aGVyID0gYXJyYXlbaW5kZXhdO1xuICAgICAgaWYgKG90aGVyICE9PSBvdGhlcikge1xuICAgICAgICByZXR1cm4gaW5kZXg7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiAtMTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBvYmplY3QtbGlrZS5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIG9iamVjdC1saWtlLCBlbHNlIGBmYWxzZWAuXG4gICAqL1xuICBmdW5jdGlvbiBpc09iamVjdExpa2UodmFsdWUpIHtcbiAgICByZXR1cm4gISF2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT0gJ29iamVjdCc7XG4gIH1cblxuICAvKipcbiAgICogVXNlZCBieSBgdHJpbW1lZExlZnRJbmRleGAgYW5kIGB0cmltbWVkUmlnaHRJbmRleGAgdG8gZGV0ZXJtaW5lIGlmIGFcbiAgICogY2hhcmFjdGVyIGNvZGUgaXMgd2hpdGVzcGFjZS5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtudW1iZXJ9IGNoYXJDb2RlIFRoZSBjaGFyYWN0ZXIgY29kZSB0byBpbnNwZWN0LlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYGNoYXJDb2RlYCBpcyB3aGl0ZXNwYWNlLCBlbHNlIGBmYWxzZWAuXG4gICAqL1xuICBmdW5jdGlvbiBpc1NwYWNlKGNoYXJDb2RlKSB7XG4gICAgcmV0dXJuICgoY2hhckNvZGUgPD0gMTYwICYmIChjaGFyQ29kZSA+PSA5ICYmIGNoYXJDb2RlIDw9IDEzKSB8fCBjaGFyQ29kZSA9PSAzMiB8fCBjaGFyQ29kZSA9PSAxNjApIHx8IGNoYXJDb2RlID09IDU3NjAgfHwgY2hhckNvZGUgPT0gNjE1OCB8fFxuICAgICAgKGNoYXJDb2RlID49IDgxOTIgJiYgKGNoYXJDb2RlIDw9IDgyMDIgfHwgY2hhckNvZGUgPT0gODIzMiB8fCBjaGFyQ29kZSA9PSA4MjMzIHx8IGNoYXJDb2RlID09IDgyMzkgfHwgY2hhckNvZGUgPT0gODI4NyB8fCBjaGFyQ29kZSA9PSAxMjI4OCB8fCBjaGFyQ29kZSA9PSA2NTI3OSkpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXBsYWNlcyBhbGwgYHBsYWNlaG9sZGVyYCBlbGVtZW50cyBpbiBgYXJyYXlgIHdpdGggYW4gaW50ZXJuYWwgcGxhY2Vob2xkZXJcbiAgICogYW5kIHJldHVybnMgYW4gYXJyYXkgb2YgdGhlaXIgaW5kZXhlcy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIG1vZGlmeS5cbiAgICogQHBhcmFtIHsqfSBwbGFjZWhvbGRlciBUaGUgcGxhY2Vob2xkZXIgdG8gcmVwbGFjZS5cbiAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgYXJyYXkgb2YgcGxhY2Vob2xkZXIgaW5kZXhlcy5cbiAgICovXG4gIGZ1bmN0aW9uIHJlcGxhY2VIb2xkZXJzKGFycmF5LCBwbGFjZWhvbGRlcikge1xuICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICBsZW5ndGggPSBhcnJheS5sZW5ndGgsXG4gICAgICAgIHJlc0luZGV4ID0gLTEsXG4gICAgICAgIHJlc3VsdCA9IFtdO1xuXG4gICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgIGlmIChhcnJheVtpbmRleF0gPT09IHBsYWNlaG9sZGVyKSB7XG4gICAgICAgIGFycmF5W2luZGV4XSA9IFBMQUNFSE9MREVSO1xuICAgICAgICByZXN1bHRbKytyZXNJbmRleF0gPSBpbmRleDtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiBgXy51bmlxYCBvcHRpbWl6ZWQgZm9yIHNvcnRlZCBhcnJheXMgd2l0aG91dCBzdXBwb3J0XG4gICAqIGZvciBjYWxsYmFjayBzaG9ydGhhbmRzIGFuZCBgdGhpc2AgYmluZGluZy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGluc3BlY3QuXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgZHVwbGljYXRlLXZhbHVlLWZyZWUgYXJyYXkuXG4gICAqL1xuICBmdW5jdGlvbiBzb3J0ZWRVbmlxKGFycmF5LCBpdGVyYXRlZSkge1xuICAgIHZhciBzZWVuLFxuICAgICAgICBpbmRleCA9IC0xLFxuICAgICAgICBsZW5ndGggPSBhcnJheS5sZW5ndGgsXG4gICAgICAgIHJlc0luZGV4ID0gLTEsXG4gICAgICAgIHJlc3VsdCA9IFtdO1xuXG4gICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgIHZhciB2YWx1ZSA9IGFycmF5W2luZGV4XSxcbiAgICAgICAgICBjb21wdXRlZCA9IGl0ZXJhdGVlID8gaXRlcmF0ZWUodmFsdWUsIGluZGV4LCBhcnJheSkgOiB2YWx1ZTtcblxuICAgICAgaWYgKCFpbmRleCB8fCBzZWVuICE9PSBjb21wdXRlZCkge1xuICAgICAgICBzZWVuID0gY29tcHV0ZWQ7XG4gICAgICAgIHJlc3VsdFsrK3Jlc0luZGV4XSA9IHZhbHVlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIFVzZWQgYnkgYF8udHJpbWAgYW5kIGBfLnRyaW1MZWZ0YCB0byBnZXQgdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBub24td2hpdGVzcGFjZVxuICAgKiBjaGFyYWN0ZXIgb2YgYHN0cmluZ2AuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdHJpbmcgVGhlIHN0cmluZyB0byBpbnNwZWN0LlxuICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgZmlyc3Qgbm9uLXdoaXRlc3BhY2UgY2hhcmFjdGVyLlxuICAgKi9cbiAgZnVuY3Rpb24gdHJpbW1lZExlZnRJbmRleChzdHJpbmcpIHtcbiAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgbGVuZ3RoID0gc3RyaW5nLmxlbmd0aDtcblxuICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoICYmIGlzU3BhY2Uoc3RyaW5nLmNoYXJDb2RlQXQoaW5kZXgpKSkge31cbiAgICByZXR1cm4gaW5kZXg7XG4gIH1cblxuICAvKipcbiAgICogVXNlZCBieSBgXy50cmltYCBhbmQgYF8udHJpbVJpZ2h0YCB0byBnZXQgdGhlIGluZGV4IG9mIHRoZSBsYXN0IG5vbi13aGl0ZXNwYWNlXG4gICAqIGNoYXJhY3RlciBvZiBgc3RyaW5nYC5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IHN0cmluZyBUaGUgc3RyaW5nIHRvIGluc3BlY3QuXG4gICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBsYXN0IG5vbi13aGl0ZXNwYWNlIGNoYXJhY3Rlci5cbiAgICovXG4gIGZ1bmN0aW9uIHRyaW1tZWRSaWdodEluZGV4KHN0cmluZykge1xuICAgIHZhciBpbmRleCA9IHN0cmluZy5sZW5ndGg7XG5cbiAgICB3aGlsZSAoaW5kZXgtLSAmJiBpc1NwYWNlKHN0cmluZy5jaGFyQ29kZUF0KGluZGV4KSkpIHt9XG4gICAgcmV0dXJuIGluZGV4O1xuICB9XG5cbiAgLyoqXG4gICAqIFVzZWQgYnkgYF8udW5lc2NhcGVgIHRvIGNvbnZlcnQgSFRNTCBlbnRpdGllcyB0byBjaGFyYWN0ZXJzLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gY2hyIFRoZSBtYXRjaGVkIGNoYXJhY3RlciB0byB1bmVzY2FwZS5cbiAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgdW5lc2NhcGVkIGNoYXJhY3Rlci5cbiAgICovXG4gIGZ1bmN0aW9uIHVuZXNjYXBlSHRtbENoYXIoY2hyKSB7XG4gICAgcmV0dXJuIGh0bWxVbmVzY2FwZXNbY2hyXTtcbiAgfVxuXG4gIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBuZXcgcHJpc3RpbmUgYGxvZGFzaGAgZnVuY3Rpb24gdXNpbmcgdGhlIGdpdmVuIGBjb250ZXh0YCBvYmplY3QuXG4gICAqXG4gICAqIEBzdGF0aWNcbiAgICogQG1lbWJlck9mIF9cbiAgICogQGNhdGVnb3J5IFV0aWxpdHlcbiAgICogQHBhcmFtIHtPYmplY3R9IFtjb250ZXh0PXJvb3RdIFRoZSBjb250ZXh0IG9iamVjdC5cbiAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIGEgbmV3IGBsb2Rhc2hgIGZ1bmN0aW9uLlxuICAgKiBAZXhhbXBsZVxuICAgKlxuICAgKiBfLm1peGluKHsgJ2Zvbyc6IF8uY29uc3RhbnQoJ2ZvbycpIH0pO1xuICAgKlxuICAgKiB2YXIgbG9kYXNoID0gXy5ydW5JbkNvbnRleHQoKTtcbiAgICogbG9kYXNoLm1peGluKHsgJ2Jhcic6IGxvZGFzaC5jb25zdGFudCgnYmFyJykgfSk7XG4gICAqXG4gICAqIF8uaXNGdW5jdGlvbihfLmZvbyk7XG4gICAqIC8vID0+IHRydWVcbiAgICogXy5pc0Z1bmN0aW9uKF8uYmFyKTtcbiAgICogLy8gPT4gZmFsc2VcbiAgICpcbiAgICogbG9kYXNoLmlzRnVuY3Rpb24obG9kYXNoLmZvbyk7XG4gICAqIC8vID0+IGZhbHNlXG4gICAqIGxvZGFzaC5pc0Z1bmN0aW9uKGxvZGFzaC5iYXIpO1xuICAgKiAvLyA9PiB0cnVlXG4gICAqXG4gICAqIC8vIHVzaW5nIGBjb250ZXh0YCB0byBtb2NrIGBEYXRlI2dldFRpbWVgIHVzZSBpbiBgXy5ub3dgXG4gICAqIHZhciBtb2NrID0gXy5ydW5JbkNvbnRleHQoe1xuICAgKiAgICdEYXRlJzogZnVuY3Rpb24oKSB7XG4gICAqICAgICByZXR1cm4geyAnZ2V0VGltZSc6IGdldFRpbWVNb2NrIH07XG4gICAqICAgfVxuICAgKiB9KTtcbiAgICpcbiAgICogLy8gb3IgY3JlYXRpbmcgYSBzdXBlZC11cCBgZGVmZXJgIGluIE5vZGUuanNcbiAgICogdmFyIGRlZmVyID0gXy5ydW5JbkNvbnRleHQoeyAnc2V0VGltZW91dCc6IHNldEltbWVkaWF0ZSB9KS5kZWZlcjtcbiAgICovXG4gIGZ1bmN0aW9uIHJ1bkluQ29udGV4dChjb250ZXh0KSB7XG4gICAgLy8gQXZvaWQgaXNzdWVzIHdpdGggc29tZSBFUzMgZW52aXJvbm1lbnRzIHRoYXQgYXR0ZW1wdCB0byB1c2UgdmFsdWVzLCBuYW1lZFxuICAgIC8vIGFmdGVyIGJ1aWx0LWluIGNvbnN0cnVjdG9ycyBsaWtlIGBPYmplY3RgLCBmb3IgdGhlIGNyZWF0aW9uIG9mIGxpdGVyYWxzLlxuICAgIC8vIEVTNSBjbGVhcnMgdGhpcyB1cCBieSBzdGF0aW5nIHRoYXQgbGl0ZXJhbHMgbXVzdCB1c2UgYnVpbHQtaW4gY29uc3RydWN0b3JzLlxuICAgIC8vIFNlZSBodHRwczovL2VzNS5naXRodWIuaW8vI3gxMS4xLjUgZm9yIG1vcmUgZGV0YWlscy5cbiAgICBjb250ZXh0ID0gY29udGV4dCA/IF8uZGVmYXVsdHMocm9vdC5PYmplY3QoKSwgY29udGV4dCwgXy5waWNrKHJvb3QsIGNvbnRleHRQcm9wcykpIDogcm9vdDtcblxuICAgIC8qKiBOYXRpdmUgY29uc3RydWN0b3IgcmVmZXJlbmNlcy4gKi9cbiAgICB2YXIgQXJyYXkgPSBjb250ZXh0LkFycmF5LFxuICAgICAgICBEYXRlID0gY29udGV4dC5EYXRlLFxuICAgICAgICBFcnJvciA9IGNvbnRleHQuRXJyb3IsXG4gICAgICAgIEZ1bmN0aW9uID0gY29udGV4dC5GdW5jdGlvbixcbiAgICAgICAgTWF0aCA9IGNvbnRleHQuTWF0aCxcbiAgICAgICAgTnVtYmVyID0gY29udGV4dC5OdW1iZXIsXG4gICAgICAgIE9iamVjdCA9IGNvbnRleHQuT2JqZWN0LFxuICAgICAgICBSZWdFeHAgPSBjb250ZXh0LlJlZ0V4cCxcbiAgICAgICAgU3RyaW5nID0gY29udGV4dC5TdHJpbmcsXG4gICAgICAgIFR5cGVFcnJvciA9IGNvbnRleHQuVHlwZUVycm9yO1xuXG4gICAgLyoqIFVzZWQgZm9yIG5hdGl2ZSBtZXRob2QgcmVmZXJlbmNlcy4gKi9cbiAgICB2YXIgYXJyYXlQcm90byA9IEFycmF5LnByb3RvdHlwZSxcbiAgICAgICAgb2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlLFxuICAgICAgICBzdHJpbmdQcm90byA9IFN0cmluZy5wcm90b3R5cGU7XG5cbiAgICAvKiogVXNlZCB0byByZXNvbHZlIHRoZSBkZWNvbXBpbGVkIHNvdXJjZSBvZiBmdW5jdGlvbnMuICovXG4gICAgdmFyIGZuVG9TdHJpbmcgPSBGdW5jdGlvbi5wcm90b3R5cGUudG9TdHJpbmc7XG5cbiAgICAvKiogVXNlZCB0byBjaGVjayBvYmplY3RzIGZvciBvd24gcHJvcGVydGllcy4gKi9cbiAgICB2YXIgaGFzT3duUHJvcGVydHkgPSBvYmplY3RQcm90by5oYXNPd25Qcm9wZXJ0eTtcblxuICAgIC8qKiBVc2VkIHRvIGdlbmVyYXRlIHVuaXF1ZSBJRHMuICovXG4gICAgdmFyIGlkQ291bnRlciA9IDA7XG5cbiAgICAvKipcbiAgICAgKiBVc2VkIHRvIHJlc29sdmUgdGhlIFtgdG9TdHJpbmdUYWdgXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi82LjAvI3NlYy1vYmplY3QucHJvdG90eXBlLnRvc3RyaW5nKVxuICAgICAqIG9mIHZhbHVlcy5cbiAgICAgKi9cbiAgICB2YXIgb2JqVG9TdHJpbmcgPSBvYmplY3RQcm90by50b1N0cmluZztcblxuICAgIC8qKiBVc2VkIHRvIHJlc3RvcmUgdGhlIG9yaWdpbmFsIGBfYCByZWZlcmVuY2UgaW4gYF8ubm9Db25mbGljdGAuICovXG4gICAgdmFyIG9sZERhc2ggPSByb290Ll87XG5cbiAgICAvKiogVXNlZCB0byBkZXRlY3QgaWYgYSBtZXRob2QgaXMgbmF0aXZlLiAqL1xuICAgIHZhciByZUlzTmF0aXZlID0gUmVnRXhwKCdeJyArXG4gICAgICBmblRvU3RyaW5nLmNhbGwoaGFzT3duUHJvcGVydHkpLnJlcGxhY2UoL1tcXFxcXiQuKis/KClbXFxde318XS9nLCAnXFxcXCQmJylcbiAgICAgIC5yZXBsYWNlKC9oYXNPd25Qcm9wZXJ0eXwoZnVuY3Rpb24pLio/KD89XFxcXFxcKCl8IGZvciAuKz8oPz1cXFxcXFxdKS9nLCAnJDEuKj8nKSArICckJ1xuICAgICk7XG5cbiAgICAvKiogTmF0aXZlIG1ldGhvZCByZWZlcmVuY2VzLiAqL1xuICAgIHZhciBBcnJheUJ1ZmZlciA9IGNvbnRleHQuQXJyYXlCdWZmZXIsXG4gICAgICAgIGNsZWFyVGltZW91dCA9IGNvbnRleHQuY2xlYXJUaW1lb3V0LFxuICAgICAgICBwYXJzZUZsb2F0ID0gY29udGV4dC5wYXJzZUZsb2F0LFxuICAgICAgICBwb3cgPSBNYXRoLnBvdyxcbiAgICAgICAgcHJvcGVydHlJc0VudW1lcmFibGUgPSBvYmplY3RQcm90by5wcm9wZXJ0eUlzRW51bWVyYWJsZSxcbiAgICAgICAgU2V0ID0gZ2V0TmF0aXZlKGNvbnRleHQsICdTZXQnKSxcbiAgICAgICAgc2V0VGltZW91dCA9IGNvbnRleHQuc2V0VGltZW91dCxcbiAgICAgICAgc3BsaWNlID0gYXJyYXlQcm90by5zcGxpY2UsXG4gICAgICAgIFVpbnQ4QXJyYXkgPSBjb250ZXh0LlVpbnQ4QXJyYXksXG4gICAgICAgIFdlYWtNYXAgPSBnZXROYXRpdmUoY29udGV4dCwgJ1dlYWtNYXAnKTtcblxuICAgIC8qIE5hdGl2ZSBtZXRob2QgcmVmZXJlbmNlcyBmb3IgdGhvc2Ugd2l0aCB0aGUgc2FtZSBuYW1lIGFzIG90aGVyIGBsb2Rhc2hgIG1ldGhvZHMuICovXG4gICAgdmFyIG5hdGl2ZUNlaWwgPSBNYXRoLmNlaWwsXG4gICAgICAgIG5hdGl2ZUNyZWF0ZSA9IGdldE5hdGl2ZShPYmplY3QsICdjcmVhdGUnKSxcbiAgICAgICAgbmF0aXZlRmxvb3IgPSBNYXRoLmZsb29yLFxuICAgICAgICBuYXRpdmVJc0FycmF5ID0gZ2V0TmF0aXZlKEFycmF5LCAnaXNBcnJheScpLFxuICAgICAgICBuYXRpdmVJc0Zpbml0ZSA9IGNvbnRleHQuaXNGaW5pdGUsXG4gICAgICAgIG5hdGl2ZUtleXMgPSBnZXROYXRpdmUoT2JqZWN0LCAna2V5cycpLFxuICAgICAgICBuYXRpdmVNYXggPSBNYXRoLm1heCxcbiAgICAgICAgbmF0aXZlTWluID0gTWF0aC5taW4sXG4gICAgICAgIG5hdGl2ZU5vdyA9IGdldE5hdGl2ZShEYXRlLCAnbm93JyksXG4gICAgICAgIG5hdGl2ZVBhcnNlSW50ID0gY29udGV4dC5wYXJzZUludCxcbiAgICAgICAgbmF0aXZlUmFuZG9tID0gTWF0aC5yYW5kb207XG5cbiAgICAvKiogVXNlZCBhcyByZWZlcmVuY2VzIGZvciBgLUluZmluaXR5YCBhbmQgYEluZmluaXR5YC4gKi9cbiAgICB2YXIgTkVHQVRJVkVfSU5GSU5JVFkgPSBOdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFksXG4gICAgICAgIFBPU0lUSVZFX0lORklOSVRZID0gTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZO1xuXG4gICAgLyoqIFVzZWQgYXMgcmVmZXJlbmNlcyBmb3IgdGhlIG1heGltdW0gbGVuZ3RoIGFuZCBpbmRleCBvZiBhbiBhcnJheS4gKi9cbiAgICB2YXIgTUFYX0FSUkFZX0xFTkdUSCA9IDQyOTQ5NjcyOTUsXG4gICAgICAgIE1BWF9BUlJBWV9JTkRFWCA9IE1BWF9BUlJBWV9MRU5HVEggLSAxLFxuICAgICAgICBIQUxGX01BWF9BUlJBWV9MRU5HVEggPSBNQVhfQVJSQVlfTEVOR1RIID4+PiAxO1xuXG4gICAgLyoqXG4gICAgICogVXNlZCBhcyB0aGUgW21heGltdW0gbGVuZ3RoXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi82LjAvI3NlYy1udW1iZXIubWF4X3NhZmVfaW50ZWdlcilcbiAgICAgKiBvZiBhbiBhcnJheS1saWtlIHZhbHVlLlxuICAgICAqL1xuICAgIHZhciBNQVhfU0FGRV9JTlRFR0VSID0gOTAwNzE5OTI1NDc0MDk5MTtcblxuICAgIC8qKiBVc2VkIHRvIHN0b3JlIGZ1bmN0aW9uIG1ldGFkYXRhLiAqL1xuICAgIHZhciBtZXRhTWFwID0gV2Vha01hcCAmJiBuZXcgV2Vha01hcDtcblxuICAgIC8qKiBVc2VkIHRvIGxvb2t1cCB1bm1pbmlmaWVkIGZ1bmN0aW9uIG5hbWVzLiAqL1xuICAgIHZhciByZWFsTmFtZXMgPSB7fTtcblxuICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBgbG9kYXNoYCBvYmplY3Qgd2hpY2ggd3JhcHMgYHZhbHVlYCB0byBlbmFibGUgaW1wbGljaXQgY2hhaW5pbmcuXG4gICAgICogTWV0aG9kcyB0aGF0IG9wZXJhdGUgb24gYW5kIHJldHVybiBhcnJheXMsIGNvbGxlY3Rpb25zLCBhbmQgZnVuY3Rpb25zIGNhblxuICAgICAqIGJlIGNoYWluZWQgdG9nZXRoZXIuIE1ldGhvZHMgdGhhdCByZXRyaWV2ZSBhIHNpbmdsZSB2YWx1ZSBvciBtYXkgcmV0dXJuIGFcbiAgICAgKiBwcmltaXRpdmUgdmFsdWUgd2lsbCBhdXRvbWF0aWNhbGx5IGVuZCB0aGUgY2hhaW4gcmV0dXJuaW5nIHRoZSB1bndyYXBwZWRcbiAgICAgKiB2YWx1ZS4gRXhwbGljaXQgY2hhaW5pbmcgbWF5IGJlIGVuYWJsZWQgdXNpbmcgYF8uY2hhaW5gLiBUaGUgZXhlY3V0aW9uIG9mXG4gICAgICogY2hhaW5lZCBtZXRob2RzIGlzIGxhenksIHRoYXQgaXMsIGV4ZWN1dGlvbiBpcyBkZWZlcnJlZCB1bnRpbCBgXyN2YWx1ZWBcbiAgICAgKiBpcyBpbXBsaWNpdGx5IG9yIGV4cGxpY2l0bHkgY2FsbGVkLlxuICAgICAqXG4gICAgICogTGF6eSBldmFsdWF0aW9uIGFsbG93cyBzZXZlcmFsIG1ldGhvZHMgdG8gc3VwcG9ydCBzaG9ydGN1dCBmdXNpb24uIFNob3J0Y3V0XG4gICAgICogZnVzaW9uIGlzIGFuIG9wdGltaXphdGlvbiBzdHJhdGVneSB3aGljaCBtZXJnZSBpdGVyYXRlZSBjYWxsczsgdGhpcyBjYW4gaGVscFxuICAgICAqIHRvIGF2b2lkIHRoZSBjcmVhdGlvbiBvZiBpbnRlcm1lZGlhdGUgZGF0YSBzdHJ1Y3R1cmVzIGFuZCBncmVhdGx5IHJlZHVjZSB0aGVcbiAgICAgKiBudW1iZXIgb2YgaXRlcmF0ZWUgZXhlY3V0aW9ucy5cbiAgICAgKlxuICAgICAqIENoYWluaW5nIGlzIHN1cHBvcnRlZCBpbiBjdXN0b20gYnVpbGRzIGFzIGxvbmcgYXMgdGhlIGBfI3ZhbHVlYCBtZXRob2QgaXNcbiAgICAgKiBkaXJlY3RseSBvciBpbmRpcmVjdGx5IGluY2x1ZGVkIGluIHRoZSBidWlsZC5cbiAgICAgKlxuICAgICAqIEluIGFkZGl0aW9uIHRvIGxvZGFzaCBtZXRob2RzLCB3cmFwcGVycyBoYXZlIGBBcnJheWAgYW5kIGBTdHJpbmdgIG1ldGhvZHMuXG4gICAgICpcbiAgICAgKiBUaGUgd3JhcHBlciBgQXJyYXlgIG1ldGhvZHMgYXJlOlxuICAgICAqIGBjb25jYXRgLCBgam9pbmAsIGBwb3BgLCBgcHVzaGAsIGByZXZlcnNlYCwgYHNoaWZ0YCwgYHNsaWNlYCwgYHNvcnRgLFxuICAgICAqIGBzcGxpY2VgLCBhbmQgYHVuc2hpZnRgXG4gICAgICpcbiAgICAgKiBUaGUgd3JhcHBlciBgU3RyaW5nYCBtZXRob2RzIGFyZTpcbiAgICAgKiBgcmVwbGFjZWAgYW5kIGBzcGxpdGBcbiAgICAgKlxuICAgICAqIFRoZSB3cmFwcGVyIG1ldGhvZHMgdGhhdCBzdXBwb3J0IHNob3J0Y3V0IGZ1c2lvbiBhcmU6XG4gICAgICogYGNvbXBhY3RgLCBgZHJvcGAsIGBkcm9wUmlnaHRgLCBgZHJvcFJpZ2h0V2hpbGVgLCBgZHJvcFdoaWxlYCwgYGZpbHRlcmAsXG4gICAgICogYGZpcnN0YCwgYGluaXRpYWxgLCBgbGFzdGAsIGBtYXBgLCBgcGx1Y2tgLCBgcmVqZWN0YCwgYHJlc3RgLCBgcmV2ZXJzZWAsXG4gICAgICogYHNsaWNlYCwgYHRha2VgLCBgdGFrZVJpZ2h0YCwgYHRha2VSaWdodFdoaWxlYCwgYHRha2VXaGlsZWAsIGB0b0FycmF5YCxcbiAgICAgKiBhbmQgYHdoZXJlYFxuICAgICAqXG4gICAgICogVGhlIGNoYWluYWJsZSB3cmFwcGVyIG1ldGhvZHMgYXJlOlxuICAgICAqIGBhZnRlcmAsIGBhcnlgLCBgYXNzaWduYCwgYGF0YCwgYGJlZm9yZWAsIGBiaW5kYCwgYGJpbmRBbGxgLCBgYmluZEtleWAsXG4gICAgICogYGNhbGxiYWNrYCwgYGNoYWluYCwgYGNodW5rYCwgYGNvbW1pdGAsIGBjb21wYWN0YCwgYGNvbmNhdGAsIGBjb25zdGFudGAsXG4gICAgICogYGNvdW50QnlgLCBgY3JlYXRlYCwgYGN1cnJ5YCwgYGRlYm91bmNlYCwgYGRlZmF1bHRzYCwgYGRlZmF1bHRzRGVlcGAsXG4gICAgICogYGRlZmVyYCwgYGRlbGF5YCwgYGRpZmZlcmVuY2VgLCBgZHJvcGAsIGBkcm9wUmlnaHRgLCBgZHJvcFJpZ2h0V2hpbGVgLFxuICAgICAqIGBkcm9wV2hpbGVgLCBgZmlsbGAsIGBmaWx0ZXJgLCBgZmxhdHRlbmAsIGBmbGF0dGVuRGVlcGAsIGBmbG93YCwgYGZsb3dSaWdodGAsXG4gICAgICogYGZvckVhY2hgLCBgZm9yRWFjaFJpZ2h0YCwgYGZvckluYCwgYGZvckluUmlnaHRgLCBgZm9yT3duYCwgYGZvck93blJpZ2h0YCxcbiAgICAgKiBgZnVuY3Rpb25zYCwgYGdyb3VwQnlgLCBgaW5kZXhCeWAsIGBpbml0aWFsYCwgYGludGVyc2VjdGlvbmAsIGBpbnZlcnRgLFxuICAgICAqIGBpbnZva2VgLCBga2V5c2AsIGBrZXlzSW5gLCBgbWFwYCwgYG1hcEtleXNgLCBgbWFwVmFsdWVzYCwgYG1hdGNoZXNgLFxuICAgICAqIGBtYXRjaGVzUHJvcGVydHlgLCBgbWVtb2l6ZWAsIGBtZXJnZWAsIGBtZXRob2RgLCBgbWV0aG9kT2ZgLCBgbWl4aW5gLFxuICAgICAqIGBtb2RBcmdzYCwgYG5lZ2F0ZWAsIGBvbWl0YCwgYG9uY2VgLCBgcGFpcnNgLCBgcGFydGlhbGAsIGBwYXJ0aWFsUmlnaHRgLFxuICAgICAqIGBwYXJ0aXRpb25gLCBgcGlja2AsIGBwbGFudGAsIGBwbHVja2AsIGBwcm9wZXJ0eWAsIGBwcm9wZXJ0eU9mYCwgYHB1bGxgLFxuICAgICAqIGBwdWxsQXRgLCBgcHVzaGAsIGByYW5nZWAsIGByZWFyZ2AsIGByZWplY3RgLCBgcmVtb3ZlYCwgYHJlc3RgLCBgcmVzdFBhcmFtYCxcbiAgICAgKiBgcmV2ZXJzZWAsIGBzZXRgLCBgc2h1ZmZsZWAsIGBzbGljZWAsIGBzb3J0YCwgYHNvcnRCeWAsIGBzb3J0QnlBbGxgLFxuICAgICAqIGBzb3J0QnlPcmRlcmAsIGBzcGxpY2VgLCBgc3ByZWFkYCwgYHRha2VgLCBgdGFrZVJpZ2h0YCwgYHRha2VSaWdodFdoaWxlYCxcbiAgICAgKiBgdGFrZVdoaWxlYCwgYHRhcGAsIGB0aHJvdHRsZWAsIGB0aHJ1YCwgYHRpbWVzYCwgYHRvQXJyYXlgLCBgdG9QbGFpbk9iamVjdGAsXG4gICAgICogYHRyYW5zZm9ybWAsIGB1bmlvbmAsIGB1bmlxYCwgYHVuc2hpZnRgLCBgdW56aXBgLCBgdW56aXBXaXRoYCwgYHZhbHVlc2AsXG4gICAgICogYHZhbHVlc0luYCwgYHdoZXJlYCwgYHdpdGhvdXRgLCBgd3JhcGAsIGB4b3JgLCBgemlwYCwgYHppcE9iamVjdGAsIGB6aXBXaXRoYFxuICAgICAqXG4gICAgICogVGhlIHdyYXBwZXIgbWV0aG9kcyB0aGF0IGFyZSAqKm5vdCoqIGNoYWluYWJsZSBieSBkZWZhdWx0IGFyZTpcbiAgICAgKiBgYWRkYCwgYGF0dGVtcHRgLCBgY2FtZWxDYXNlYCwgYGNhcGl0YWxpemVgLCBgY2VpbGAsIGBjbG9uZWAsIGBjbG9uZURlZXBgLFxuICAgICAqIGBkZWJ1cnJgLCBgZW5kc1dpdGhgLCBgZXNjYXBlYCwgYGVzY2FwZVJlZ0V4cGAsIGBldmVyeWAsIGBmaW5kYCwgYGZpbmRJbmRleGAsXG4gICAgICogYGZpbmRLZXlgLCBgZmluZExhc3RgLCBgZmluZExhc3RJbmRleGAsIGBmaW5kTGFzdEtleWAsIGBmaW5kV2hlcmVgLCBgZmlyc3RgLFxuICAgICAqIGBmbG9vcmAsIGBnZXRgLCBgZ3RgLCBgZ3RlYCwgYGhhc2AsIGBpZGVudGl0eWAsIGBpbmNsdWRlc2AsIGBpbmRleE9mYCxcbiAgICAgKiBgaW5SYW5nZWAsIGBpc0FyZ3VtZW50c2AsIGBpc0FycmF5YCwgYGlzQm9vbGVhbmAsIGBpc0RhdGVgLCBgaXNFbGVtZW50YCxcbiAgICAgKiBgaXNFbXB0eWAsIGBpc0VxdWFsYCwgYGlzRXJyb3JgLCBgaXNGaW5pdGVgIGBpc0Z1bmN0aW9uYCwgYGlzTWF0Y2hgLFxuICAgICAqIGBpc05hdGl2ZWAsIGBpc05hTmAsIGBpc051bGxgLCBgaXNOdW1iZXJgLCBgaXNPYmplY3RgLCBgaXNQbGFpbk9iamVjdGAsXG4gICAgICogYGlzUmVnRXhwYCwgYGlzU3RyaW5nYCwgYGlzVW5kZWZpbmVkYCwgYGlzVHlwZWRBcnJheWAsIGBqb2luYCwgYGtlYmFiQ2FzZWAsXG4gICAgICogYGxhc3RgLCBgbGFzdEluZGV4T2ZgLCBgbHRgLCBgbHRlYCwgYG1heGAsIGBtaW5gLCBgbm9Db25mbGljdGAsIGBub29wYCxcbiAgICAgKiBgbm93YCwgYHBhZGAsIGBwYWRMZWZ0YCwgYHBhZFJpZ2h0YCwgYHBhcnNlSW50YCwgYHBvcGAsIGByYW5kb21gLCBgcmVkdWNlYCxcbiAgICAgKiBgcmVkdWNlUmlnaHRgLCBgcmVwZWF0YCwgYHJlc3VsdGAsIGByb3VuZGAsIGBydW5JbkNvbnRleHRgLCBgc2hpZnRgLCBgc2l6ZWAsXG4gICAgICogYHNuYWtlQ2FzZWAsIGBzb21lYCwgYHNvcnRlZEluZGV4YCwgYHNvcnRlZExhc3RJbmRleGAsIGBzdGFydENhc2VgLFxuICAgICAqIGBzdGFydHNXaXRoYCwgYHN1bWAsIGB0ZW1wbGF0ZWAsIGB0cmltYCwgYHRyaW1MZWZ0YCwgYHRyaW1SaWdodGAsIGB0cnVuY2AsXG4gICAgICogYHVuZXNjYXBlYCwgYHVuaXF1ZUlkYCwgYHZhbHVlYCwgYW5kIGB3b3Jkc2BcbiAgICAgKlxuICAgICAqIFRoZSB3cmFwcGVyIG1ldGhvZCBgc2FtcGxlYCB3aWxsIHJldHVybiBhIHdyYXBwZWQgdmFsdWUgd2hlbiBgbmAgaXMgcHJvdmlkZWQsXG4gICAgICogb3RoZXJ3aXNlIGFuIHVud3JhcHBlZCB2YWx1ZSBpcyByZXR1cm5lZC5cbiAgICAgKlxuICAgICAqIEBuYW1lIF9cbiAgICAgKiBAY29uc3RydWN0b3JcbiAgICAgKiBAY2F0ZWdvcnkgQ2hhaW5cbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byB3cmFwIGluIGEgYGxvZGFzaGAgaW5zdGFuY2UuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgbmV3IGBsb2Rhc2hgIHdyYXBwZXIgaW5zdGFuY2UuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciB3cmFwcGVkID0gXyhbMSwgMiwgM10pO1xuICAgICAqXG4gICAgICogLy8gcmV0dXJucyBhbiB1bndyYXBwZWQgdmFsdWVcbiAgICAgKiB3cmFwcGVkLnJlZHVjZShmdW5jdGlvbih0b3RhbCwgbikge1xuICAgICAqICAgcmV0dXJuIHRvdGFsICsgbjtcbiAgICAgKiB9KTtcbiAgICAgKiAvLyA9PiA2XG4gICAgICpcbiAgICAgKiAvLyByZXR1cm5zIGEgd3JhcHBlZCB2YWx1ZVxuICAgICAqIHZhciBzcXVhcmVzID0gd3JhcHBlZC5tYXAoZnVuY3Rpb24obikge1xuICAgICAqICAgcmV0dXJuIG4gKiBuO1xuICAgICAqIH0pO1xuICAgICAqXG4gICAgICogXy5pc0FycmF5KHNxdWFyZXMpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICpcbiAgICAgKiBfLmlzQXJyYXkoc3F1YXJlcy52YWx1ZSgpKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICovXG4gICAgZnVuY3Rpb24gbG9kYXNoKHZhbHVlKSB7XG4gICAgICBpZiAoaXNPYmplY3RMaWtlKHZhbHVlKSAmJiAhaXNBcnJheSh2YWx1ZSkgJiYgISh2YWx1ZSBpbnN0YW5jZW9mIExhenlXcmFwcGVyKSkge1xuICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBMb2Rhc2hXcmFwcGVyKSB7XG4gICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChoYXNPd25Qcm9wZXJ0eS5jYWxsKHZhbHVlLCAnX19jaGFpbl9fJykgJiYgaGFzT3duUHJvcGVydHkuY2FsbCh2YWx1ZSwgJ19fd3JhcHBlZF9fJykpIHtcbiAgICAgICAgICByZXR1cm4gd3JhcHBlckNsb25lKHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIG5ldyBMb2Rhc2hXcmFwcGVyKHZhbHVlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgZnVuY3Rpb24gd2hvc2UgcHJvdG90eXBlIGFsbCBjaGFpbmluZyB3cmFwcGVycyBpbmhlcml0IGZyb20uXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VMb2Rhc2goKSB7XG4gICAgICAvLyBObyBvcGVyYXRpb24gcGVyZm9ybWVkLlxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGNvbnN0cnVjdG9yIGZvciBjcmVhdGluZyBgbG9kYXNoYCB3cmFwcGVyIG9iamVjdHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHdyYXAuXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbY2hhaW5BbGxdIEVuYWJsZSBjaGFpbmluZyBmb3IgYWxsIHdyYXBwZXIgbWV0aG9kcy5cbiAgICAgKiBAcGFyYW0ge0FycmF5fSBbYWN0aW9ucz1bXV0gQWN0aW9ucyB0byBwZWZvcm0gdG8gcmVzb2x2ZSB0aGUgdW53cmFwcGVkIHZhbHVlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIExvZGFzaFdyYXBwZXIodmFsdWUsIGNoYWluQWxsLCBhY3Rpb25zKSB7XG4gICAgICB0aGlzLl9fd3JhcHBlZF9fID0gdmFsdWU7XG4gICAgICB0aGlzLl9fYWN0aW9uc19fID0gYWN0aW9ucyB8fCBbXTtcbiAgICAgIHRoaXMuX19jaGFpbl9fID0gISFjaGFpbkFsbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBbiBvYmplY3QgZW52aXJvbm1lbnQgZmVhdHVyZSBmbGFncy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEB0eXBlIE9iamVjdFxuICAgICAqL1xuICAgIHZhciBzdXBwb3J0ID0gbG9kYXNoLnN1cHBvcnQgPSB7fTtcblxuICAgIC8qKlxuICAgICAqIEJ5IGRlZmF1bHQsIHRoZSB0ZW1wbGF0ZSBkZWxpbWl0ZXJzIHVzZWQgYnkgbG9kYXNoIGFyZSBsaWtlIHRob3NlIGluXG4gICAgICogZW1iZWRkZWQgUnVieSAoRVJCKS4gQ2hhbmdlIHRoZSBmb2xsb3dpbmcgdGVtcGxhdGUgc2V0dGluZ3MgdG8gdXNlXG4gICAgICogYWx0ZXJuYXRpdmUgZGVsaW1pdGVycy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEB0eXBlIE9iamVjdFxuICAgICAqL1xuICAgIGxvZGFzaC50ZW1wbGF0ZVNldHRpbmdzID0ge1xuXG4gICAgICAvKipcbiAgICAgICAqIFVzZWQgdG8gZGV0ZWN0IGBkYXRhYCBwcm9wZXJ0eSB2YWx1ZXMgdG8gYmUgSFRNTC1lc2NhcGVkLlxuICAgICAgICpcbiAgICAgICAqIEBtZW1iZXJPZiBfLnRlbXBsYXRlU2V0dGluZ3NcbiAgICAgICAqIEB0eXBlIFJlZ0V4cFxuICAgICAgICovXG4gICAgICAnZXNjYXBlJzogcmVFc2NhcGUsXG5cbiAgICAgIC8qKlxuICAgICAgICogVXNlZCB0byBkZXRlY3QgY29kZSB0byBiZSBldmFsdWF0ZWQuXG4gICAgICAgKlxuICAgICAgICogQG1lbWJlck9mIF8udGVtcGxhdGVTZXR0aW5nc1xuICAgICAgICogQHR5cGUgUmVnRXhwXG4gICAgICAgKi9cbiAgICAgICdldmFsdWF0ZSc6IHJlRXZhbHVhdGUsXG5cbiAgICAgIC8qKlxuICAgICAgICogVXNlZCB0byBkZXRlY3QgYGRhdGFgIHByb3BlcnR5IHZhbHVlcyB0byBpbmplY3QuXG4gICAgICAgKlxuICAgICAgICogQG1lbWJlck9mIF8udGVtcGxhdGVTZXR0aW5nc1xuICAgICAgICogQHR5cGUgUmVnRXhwXG4gICAgICAgKi9cbiAgICAgICdpbnRlcnBvbGF0ZSc6IHJlSW50ZXJwb2xhdGUsXG5cbiAgICAgIC8qKlxuICAgICAgICogVXNlZCB0byByZWZlcmVuY2UgdGhlIGRhdGEgb2JqZWN0IGluIHRoZSB0ZW1wbGF0ZSB0ZXh0LlxuICAgICAgICpcbiAgICAgICAqIEBtZW1iZXJPZiBfLnRlbXBsYXRlU2V0dGluZ3NcbiAgICAgICAqIEB0eXBlIHN0cmluZ1xuICAgICAgICovXG4gICAgICAndmFyaWFibGUnOiAnJyxcblxuICAgICAgLyoqXG4gICAgICAgKiBVc2VkIHRvIGltcG9ydCB2YXJpYWJsZXMgaW50byB0aGUgY29tcGlsZWQgdGVtcGxhdGUuXG4gICAgICAgKlxuICAgICAgICogQG1lbWJlck9mIF8udGVtcGxhdGVTZXR0aW5nc1xuICAgICAgICogQHR5cGUgT2JqZWN0XG4gICAgICAgKi9cbiAgICAgICdpbXBvcnRzJzoge1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBBIHJlZmVyZW5jZSB0byB0aGUgYGxvZGFzaGAgZnVuY3Rpb24uXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZW1iZXJPZiBfLnRlbXBsYXRlU2V0dGluZ3MuaW1wb3J0c1xuICAgICAgICAgKiBAdHlwZSBGdW5jdGlvblxuICAgICAgICAgKi9cbiAgICAgICAgJ18nOiBsb2Rhc2hcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGxhenkgd3JhcHBlciBvYmplY3Qgd2hpY2ggd3JhcHMgYHZhbHVlYCB0byBlbmFibGUgbGF6eSBldmFsdWF0aW9uLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byB3cmFwLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIExhenlXcmFwcGVyKHZhbHVlKSB7XG4gICAgICB0aGlzLl9fd3JhcHBlZF9fID0gdmFsdWU7XG4gICAgICB0aGlzLl9fYWN0aW9uc19fID0gW107XG4gICAgICB0aGlzLl9fZGlyX18gPSAxO1xuICAgICAgdGhpcy5fX2ZpbHRlcmVkX18gPSBmYWxzZTtcbiAgICAgIHRoaXMuX19pdGVyYXRlZXNfXyA9IFtdO1xuICAgICAgdGhpcy5fX3Rha2VDb3VudF9fID0gUE9TSVRJVkVfSU5GSU5JVFk7XG4gICAgICB0aGlzLl9fdmlld3NfXyA9IFtdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBjbG9uZSBvZiB0aGUgbGF6eSB3cmFwcGVyIG9iamVjdC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQG5hbWUgY2xvbmVcbiAgICAgKiBAbWVtYmVyT2YgTGF6eVdyYXBwZXJcbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBjbG9uZWQgYExhenlXcmFwcGVyYCBvYmplY3QuXG4gICAgICovXG4gICAgZnVuY3Rpb24gbGF6eUNsb25lKCkge1xuICAgICAgdmFyIHJlc3VsdCA9IG5ldyBMYXp5V3JhcHBlcih0aGlzLl9fd3JhcHBlZF9fKTtcbiAgICAgIHJlc3VsdC5fX2FjdGlvbnNfXyA9IGFycmF5Q29weSh0aGlzLl9fYWN0aW9uc19fKTtcbiAgICAgIHJlc3VsdC5fX2Rpcl9fID0gdGhpcy5fX2Rpcl9fO1xuICAgICAgcmVzdWx0Ll9fZmlsdGVyZWRfXyA9IHRoaXMuX19maWx0ZXJlZF9fO1xuICAgICAgcmVzdWx0Ll9faXRlcmF0ZWVzX18gPSBhcnJheUNvcHkodGhpcy5fX2l0ZXJhdGVlc19fKTtcbiAgICAgIHJlc3VsdC5fX3Rha2VDb3VudF9fID0gdGhpcy5fX3Rha2VDb3VudF9fO1xuICAgICAgcmVzdWx0Ll9fdmlld3NfXyA9IGFycmF5Q29weSh0aGlzLl9fdmlld3NfXyk7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldmVyc2VzIHRoZSBkaXJlY3Rpb24gb2YgbGF6eSBpdGVyYXRpb24uXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBuYW1lIHJldmVyc2VcbiAgICAgKiBAbWVtYmVyT2YgTGF6eVdyYXBwZXJcbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBuZXcgcmV2ZXJzZWQgYExhenlXcmFwcGVyYCBvYmplY3QuXG4gICAgICovXG4gICAgZnVuY3Rpb24gbGF6eVJldmVyc2UoKSB7XG4gICAgICBpZiAodGhpcy5fX2ZpbHRlcmVkX18pIHtcbiAgICAgICAgdmFyIHJlc3VsdCA9IG5ldyBMYXp5V3JhcHBlcih0aGlzKTtcbiAgICAgICAgcmVzdWx0Ll9fZGlyX18gPSAtMTtcbiAgICAgICAgcmVzdWx0Ll9fZmlsdGVyZWRfXyA9IHRydWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXN1bHQgPSB0aGlzLmNsb25lKCk7XG4gICAgICAgIHJlc3VsdC5fX2Rpcl9fICo9IC0xO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFeHRyYWN0cyB0aGUgdW53cmFwcGVkIHZhbHVlIGZyb20gaXRzIGxhenkgd3JhcHBlci5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQG5hbWUgdmFsdWVcbiAgICAgKiBAbWVtYmVyT2YgTGF6eVdyYXBwZXJcbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgdW53cmFwcGVkIHZhbHVlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGxhenlWYWx1ZSgpIHtcbiAgICAgIHZhciBhcnJheSA9IHRoaXMuX193cmFwcGVkX18udmFsdWUoKSxcbiAgICAgICAgICBkaXIgPSB0aGlzLl9fZGlyX18sXG4gICAgICAgICAgaXNBcnIgPSBpc0FycmF5KGFycmF5KSxcbiAgICAgICAgICBpc1JpZ2h0ID0gZGlyIDwgMCxcbiAgICAgICAgICBhcnJMZW5ndGggPSBpc0FyciA/IGFycmF5Lmxlbmd0aCA6IDAsXG4gICAgICAgICAgdmlldyA9IGdldFZpZXcoMCwgYXJyTGVuZ3RoLCB0aGlzLl9fdmlld3NfXyksXG4gICAgICAgICAgc3RhcnQgPSB2aWV3LnN0YXJ0LFxuICAgICAgICAgIGVuZCA9IHZpZXcuZW5kLFxuICAgICAgICAgIGxlbmd0aCA9IGVuZCAtIHN0YXJ0LFxuICAgICAgICAgIGluZGV4ID0gaXNSaWdodCA/IGVuZCA6IChzdGFydCAtIDEpLFxuICAgICAgICAgIGl0ZXJhdGVlcyA9IHRoaXMuX19pdGVyYXRlZXNfXyxcbiAgICAgICAgICBpdGVyTGVuZ3RoID0gaXRlcmF0ZWVzLmxlbmd0aCxcbiAgICAgICAgICByZXNJbmRleCA9IDAsXG4gICAgICAgICAgdGFrZUNvdW50ID0gbmF0aXZlTWluKGxlbmd0aCwgdGhpcy5fX3Rha2VDb3VudF9fKTtcblxuICAgICAgaWYgKCFpc0FyciB8fCBhcnJMZW5ndGggPCBMQVJHRV9BUlJBWV9TSVpFIHx8IChhcnJMZW5ndGggPT0gbGVuZ3RoICYmIHRha2VDb3VudCA9PSBsZW5ndGgpKSB7XG4gICAgICAgIHJldHVybiBiYXNlV3JhcHBlclZhbHVlKChpc1JpZ2h0ICYmIGlzQXJyKSA/IGFycmF5LnJldmVyc2UoKSA6IGFycmF5LCB0aGlzLl9fYWN0aW9uc19fKTtcbiAgICAgIH1cbiAgICAgIHZhciByZXN1bHQgPSBbXTtcblxuICAgICAgb3V0ZXI6XG4gICAgICB3aGlsZSAobGVuZ3RoLS0gJiYgcmVzSW5kZXggPCB0YWtlQ291bnQpIHtcbiAgICAgICAgaW5kZXggKz0gZGlyO1xuXG4gICAgICAgIHZhciBpdGVySW5kZXggPSAtMSxcbiAgICAgICAgICAgIHZhbHVlID0gYXJyYXlbaW5kZXhdO1xuXG4gICAgICAgIHdoaWxlICgrK2l0ZXJJbmRleCA8IGl0ZXJMZW5ndGgpIHtcbiAgICAgICAgICB2YXIgZGF0YSA9IGl0ZXJhdGVlc1tpdGVySW5kZXhdLFxuICAgICAgICAgICAgICBpdGVyYXRlZSA9IGRhdGEuaXRlcmF0ZWUsXG4gICAgICAgICAgICAgIHR5cGUgPSBkYXRhLnR5cGUsXG4gICAgICAgICAgICAgIGNvbXB1dGVkID0gaXRlcmF0ZWUodmFsdWUpO1xuXG4gICAgICAgICAgaWYgKHR5cGUgPT0gTEFaWV9NQVBfRkxBRykge1xuICAgICAgICAgICAgdmFsdWUgPSBjb21wdXRlZDtcbiAgICAgICAgICB9IGVsc2UgaWYgKCFjb21wdXRlZCkge1xuICAgICAgICAgICAgaWYgKHR5cGUgPT0gTEFaWV9GSUxURVJfRkxBRykge1xuICAgICAgICAgICAgICBjb250aW51ZSBvdXRlcjtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGJyZWFrIG91dGVyO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXN1bHRbcmVzSW5kZXgrK10gPSB2YWx1ZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGNhY2hlIG9iamVjdCB0byBzdG9yZSBrZXkvdmFsdWUgcGFpcnMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbmFtZSBDYWNoZVxuICAgICAqIEBtZW1iZXJPZiBfLm1lbW9pemVcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBNYXBDYWNoZSgpIHtcbiAgICAgIHRoaXMuX19kYXRhX18gPSB7fTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIGBrZXlgIGFuZCBpdHMgdmFsdWUgZnJvbSB0aGUgY2FjaGUuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBuYW1lIGRlbGV0ZVxuICAgICAqIEBtZW1iZXJPZiBfLm1lbW9pemUuQ2FjaGVcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHZhbHVlIHRvIHJlbW92ZS5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGVudHJ5IHdhcyByZW1vdmVkIHN1Y2Nlc3NmdWxseSwgZWxzZSBgZmFsc2VgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIG1hcERlbGV0ZShrZXkpIHtcbiAgICAgIHJldHVybiB0aGlzLmhhcyhrZXkpICYmIGRlbGV0ZSB0aGlzLl9fZGF0YV9fW2tleV07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgY2FjaGVkIHZhbHVlIGZvciBga2V5YC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQG5hbWUgZ2V0XG4gICAgICogQG1lbWJlck9mIF8ubWVtb2l6ZS5DYWNoZVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgdmFsdWUgdG8gZ2V0LlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBjYWNoZWQgdmFsdWUuXG4gICAgICovXG4gICAgZnVuY3Rpb24gbWFwR2V0KGtleSkge1xuICAgICAgcmV0dXJuIGtleSA9PSAnX19wcm90b19fJyA/IHVuZGVmaW5lZCA6IHRoaXMuX19kYXRhX19ba2V5XTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYSBjYWNoZWQgdmFsdWUgZm9yIGBrZXlgIGV4aXN0cy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQG5hbWUgaGFzXG4gICAgICogQG1lbWJlck9mIF8ubWVtb2l6ZS5DYWNoZVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgZW50cnkgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGFuIGVudHJ5IGZvciBga2V5YCBleGlzdHMsIGVsc2UgYGZhbHNlYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBtYXBIYXMoa2V5KSB7XG4gICAgICByZXR1cm4ga2V5ICE9ICdfX3Byb3RvX18nICYmIGhhc093blByb3BlcnR5LmNhbGwodGhpcy5fX2RhdGFfXywga2V5KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIGB2YWx1ZWAgdG8gYGtleWAgb2YgdGhlIGNhY2hlLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAbmFtZSBzZXRcbiAgICAgKiBAbWVtYmVyT2YgXy5tZW1vaXplLkNhY2hlXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSB2YWx1ZSB0byBjYWNoZS5cbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjYWNoZS5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBjYWNoZSBvYmplY3QuXG4gICAgICovXG4gICAgZnVuY3Rpb24gbWFwU2V0KGtleSwgdmFsdWUpIHtcbiAgICAgIGlmIChrZXkgIT0gJ19fcHJvdG9fXycpIHtcbiAgICAgICAgdGhpcy5fX2RhdGFfX1trZXldID0gdmFsdWU7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5cbiAgICAvKipcbiAgICAgKlxuICAgICAqIENyZWF0ZXMgYSBjYWNoZSBvYmplY3QgdG8gc3RvcmUgdW5pcXVlIHZhbHVlcy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheX0gW3ZhbHVlc10gVGhlIHZhbHVlcyB0byBjYWNoZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBTZXRDYWNoZSh2YWx1ZXMpIHtcbiAgICAgIHZhciBsZW5ndGggPSB2YWx1ZXMgPyB2YWx1ZXMubGVuZ3RoIDogMDtcblxuICAgICAgdGhpcy5kYXRhID0geyAnaGFzaCc6IG5hdGl2ZUNyZWF0ZShudWxsKSwgJ3NldCc6IG5ldyBTZXQgfTtcbiAgICAgIHdoaWxlIChsZW5ndGgtLSkge1xuICAgICAgICB0aGlzLnB1c2godmFsdWVzW2xlbmd0aF0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGluIGBjYWNoZWAgbWltaWNraW5nIHRoZSByZXR1cm4gc2lnbmF0dXJlIG9mXG4gICAgICogYF8uaW5kZXhPZmAgYnkgcmV0dXJuaW5nIGAwYCBpZiB0aGUgdmFsdWUgaXMgZm91bmQsIGVsc2UgYC0xYC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGNhY2hlIFRoZSBjYWNoZSB0byBzZWFyY2guXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gc2VhcmNoIGZvci5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIGAwYCBpZiBgdmFsdWVgIGlzIGZvdW5kLCBlbHNlIGAtMWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY2FjaGVJbmRleE9mKGNhY2hlLCB2YWx1ZSkge1xuICAgICAgdmFyIGRhdGEgPSBjYWNoZS5kYXRhLFxuICAgICAgICAgIHJlc3VsdCA9ICh0eXBlb2YgdmFsdWUgPT0gJ3N0cmluZycgfHwgaXNPYmplY3QodmFsdWUpKSA/IGRhdGEuc2V0Lmhhcyh2YWx1ZSkgOiBkYXRhLmhhc2hbdmFsdWVdO1xuXG4gICAgICByZXR1cm4gcmVzdWx0ID8gMCA6IC0xO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFkZHMgYHZhbHVlYCB0byB0aGUgY2FjaGUuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBuYW1lIHB1c2hcbiAgICAgKiBAbWVtYmVyT2YgU2V0Q2FjaGVcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjYWNoZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjYWNoZVB1c2godmFsdWUpIHtcbiAgICAgIHZhciBkYXRhID0gdGhpcy5kYXRhO1xuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PSAnc3RyaW5nJyB8fCBpc09iamVjdCh2YWx1ZSkpIHtcbiAgICAgICAgZGF0YS5zZXQuYWRkKHZhbHVlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRhdGEuaGFzaFt2YWx1ZV0gPSB0cnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgYXJyYXkgam9pbmluZyBgYXJyYXlgIHdpdGggYG90aGVyYC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGpvaW4uXG4gICAgICogQHBhcmFtIHtBcnJheX0gb3RoZXIgVGhlIG90aGVyIGFycmF5IHRvIGpvaW4uXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgY29uY2F0ZW5hdGVkIGFycmF5LlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGFycmF5Q29uY2F0KGFycmF5LCBvdGhlcikge1xuICAgICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgICAgbGVuZ3RoID0gYXJyYXkubGVuZ3RoLFxuICAgICAgICAgIG90aEluZGV4ID0gLTEsXG4gICAgICAgICAgb3RoTGVuZ3RoID0gb3RoZXIubGVuZ3RoLFxuICAgICAgICAgIHJlc3VsdCA9IEFycmF5KGxlbmd0aCArIG90aExlbmd0aCk7XG5cbiAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgIHJlc3VsdFtpbmRleF0gPSBhcnJheVtpbmRleF07XG4gICAgICB9XG4gICAgICB3aGlsZSAoKytvdGhJbmRleCA8IG90aExlbmd0aCkge1xuICAgICAgICByZXN1bHRbaW5kZXgrK10gPSBvdGhlcltvdGhJbmRleF07XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvcGllcyB0aGUgdmFsdWVzIG9mIGBzb3VyY2VgIHRvIGBhcnJheWAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IHNvdXJjZSBUaGUgYXJyYXkgdG8gY29weSB2YWx1ZXMgZnJvbS5cbiAgICAgKiBAcGFyYW0ge0FycmF5fSBbYXJyYXk9W11dIFRoZSBhcnJheSB0byBjb3B5IHZhbHVlcyB0by5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgYGFycmF5YC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBhcnJheUNvcHkoc291cmNlLCBhcnJheSkge1xuICAgICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgICAgbGVuZ3RoID0gc291cmNlLmxlbmd0aDtcblxuICAgICAgYXJyYXkgfHwgKGFycmF5ID0gQXJyYXkobGVuZ3RoKSk7XG4gICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICBhcnJheVtpbmRleF0gPSBzb3VyY2VbaW5kZXhdO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGFycmF5O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgXy5mb3JFYWNoYCBmb3IgYXJyYXlzIHdpdGhvdXQgc3VwcG9ydCBmb3IgY2FsbGJhY2tcbiAgICAgKiBzaG9ydGhhbmRzIGFuZCBgdGhpc2AgYmluZGluZy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBpdGVyYXRlZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyBgYXJyYXlgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGFycmF5RWFjaChhcnJheSwgaXRlcmF0ZWUpIHtcbiAgICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICAgIGxlbmd0aCA9IGFycmF5Lmxlbmd0aDtcblxuICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgaWYgKGl0ZXJhdGVlKGFycmF5W2luZGV4XSwgaW5kZXgsIGFycmF5KSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGFycmF5O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgXy5mb3JFYWNoUmlnaHRgIGZvciBhcnJheXMgd2l0aG91dCBzdXBwb3J0IGZvclxuICAgICAqIGNhbGxiYWNrIHNob3J0aGFuZHMgYW5kIGB0aGlzYCBiaW5kaW5nLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdGVlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIGBhcnJheWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYXJyYXlFYWNoUmlnaHQoYXJyYXksIGl0ZXJhdGVlKSB7XG4gICAgICB2YXIgbGVuZ3RoID0gYXJyYXkubGVuZ3RoO1xuXG4gICAgICB3aGlsZSAobGVuZ3RoLS0pIHtcbiAgICAgICAgaWYgKGl0ZXJhdGVlKGFycmF5W2xlbmd0aF0sIGxlbmd0aCwgYXJyYXkpID09PSBmYWxzZSkge1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gYXJyYXk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBfLmV2ZXJ5YCBmb3IgYXJyYXlzIHdpdGhvdXQgc3VwcG9ydCBmb3IgY2FsbGJhY2tcbiAgICAgKiBzaG9ydGhhbmRzIGFuZCBgdGhpc2AgYmluZGluZy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBwcmVkaWNhdGUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYWxsIGVsZW1lbnRzIHBhc3MgdGhlIHByZWRpY2F0ZSBjaGVjayxcbiAgICAgKiAgZWxzZSBgZmFsc2VgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGFycmF5RXZlcnkoYXJyYXksIHByZWRpY2F0ZSkge1xuICAgICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgICAgbGVuZ3RoID0gYXJyYXkubGVuZ3RoO1xuXG4gICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICBpZiAoIXByZWRpY2F0ZShhcnJheVtpbmRleF0sIGluZGV4LCBhcnJheSkpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgYmFzZUV4dHJlbXVtYCBmb3IgYXJyYXlzIHdoaWNoIGludm9rZXMgYGl0ZXJhdGVlYFxuICAgICAqIHdpdGggb25lIGFyZ3VtZW50OiAodmFsdWUpLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdGVlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gY29tcGFyYXRvciBUaGUgZnVuY3Rpb24gdXNlZCB0byBjb21wYXJlIHZhbHVlcy5cbiAgICAgKiBAcGFyYW0geyp9IGV4VmFsdWUgVGhlIGluaXRpYWwgZXh0cmVtdW0gdmFsdWUuXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIGV4dHJlbXVtIHZhbHVlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGFycmF5RXh0cmVtdW0oYXJyYXksIGl0ZXJhdGVlLCBjb21wYXJhdG9yLCBleFZhbHVlKSB7XG4gICAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgICBsZW5ndGggPSBhcnJheS5sZW5ndGgsXG4gICAgICAgICAgY29tcHV0ZWQgPSBleFZhbHVlLFxuICAgICAgICAgIHJlc3VsdCA9IGNvbXB1dGVkO1xuXG4gICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICB2YXIgdmFsdWUgPSBhcnJheVtpbmRleF0sXG4gICAgICAgICAgICBjdXJyZW50ID0gK2l0ZXJhdGVlKHZhbHVlKTtcblxuICAgICAgICBpZiAoY29tcGFyYXRvcihjdXJyZW50LCBjb21wdXRlZCkpIHtcbiAgICAgICAgICBjb21wdXRlZCA9IGN1cnJlbnQ7XG4gICAgICAgICAgcmVzdWx0ID0gdmFsdWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBfLmZpbHRlcmAgZm9yIGFycmF5cyB3aXRob3V0IHN1cHBvcnQgZm9yIGNhbGxiYWNrXG4gICAgICogc2hvcnRoYW5kcyBhbmQgYHRoaXNgIGJpbmRpbmcuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gcHJlZGljYXRlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgZmlsdGVyZWQgYXJyYXkuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYXJyYXlGaWx0ZXIoYXJyYXksIHByZWRpY2F0ZSkge1xuICAgICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgICAgbGVuZ3RoID0gYXJyYXkubGVuZ3RoLFxuICAgICAgICAgIHJlc0luZGV4ID0gLTEsXG4gICAgICAgICAgcmVzdWx0ID0gW107XG5cbiAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgIHZhciB2YWx1ZSA9IGFycmF5W2luZGV4XTtcbiAgICAgICAgaWYgKHByZWRpY2F0ZSh2YWx1ZSwgaW5kZXgsIGFycmF5KSkge1xuICAgICAgICAgIHJlc3VsdFsrK3Jlc0luZGV4XSA9IHZhbHVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgXy5tYXBgIGZvciBhcnJheXMgd2l0aG91dCBzdXBwb3J0IGZvciBjYWxsYmFja1xuICAgICAqIHNob3J0aGFuZHMgYW5kIGB0aGlzYCBiaW5kaW5nLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdGVlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgbWFwcGVkIGFycmF5LlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGFycmF5TWFwKGFycmF5LCBpdGVyYXRlZSkge1xuICAgICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgICAgbGVuZ3RoID0gYXJyYXkubGVuZ3RoLFxuICAgICAgICAgIHJlc3VsdCA9IEFycmF5KGxlbmd0aCk7XG5cbiAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgIHJlc3VsdFtpbmRleF0gPSBpdGVyYXRlZShhcnJheVtpbmRleF0sIGluZGV4LCBhcnJheSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFwcGVuZHMgdGhlIGVsZW1lbnRzIG9mIGB2YWx1ZXNgIHRvIGBhcnJheWAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBtb2RpZnkuXG4gICAgICogQHBhcmFtIHtBcnJheX0gdmFsdWVzIFRoZSB2YWx1ZXMgdG8gYXBwZW5kLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyBgYXJyYXlgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGFycmF5UHVzaChhcnJheSwgdmFsdWVzKSB7XG4gICAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgICBsZW5ndGggPSB2YWx1ZXMubGVuZ3RoLFxuICAgICAgICAgIG9mZnNldCA9IGFycmF5Lmxlbmd0aDtcblxuICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgYXJyYXlbb2Zmc2V0ICsgaW5kZXhdID0gdmFsdWVzW2luZGV4XTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBhcnJheTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYF8ucmVkdWNlYCBmb3IgYXJyYXlzIHdpdGhvdXQgc3VwcG9ydCBmb3IgY2FsbGJhY2tcbiAgICAgKiBzaG9ydGhhbmRzIGFuZCBgdGhpc2AgYmluZGluZy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBpdGVyYXRlZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEBwYXJhbSB7Kn0gW2FjY3VtdWxhdG9yXSBUaGUgaW5pdGlhbCB2YWx1ZS5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtpbml0RnJvbUFycmF5XSBTcGVjaWZ5IHVzaW5nIHRoZSBmaXJzdCBlbGVtZW50IG9mIGBhcnJheWBcbiAgICAgKiAgYXMgdGhlIGluaXRpYWwgdmFsdWUuXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIGFjY3VtdWxhdGVkIHZhbHVlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGFycmF5UmVkdWNlKGFycmF5LCBpdGVyYXRlZSwgYWNjdW11bGF0b3IsIGluaXRGcm9tQXJyYXkpIHtcbiAgICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICAgIGxlbmd0aCA9IGFycmF5Lmxlbmd0aDtcblxuICAgICAgaWYgKGluaXRGcm9tQXJyYXkgJiYgbGVuZ3RoKSB7XG4gICAgICAgIGFjY3VtdWxhdG9yID0gYXJyYXlbKytpbmRleF07XG4gICAgICB9XG4gICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICBhY2N1bXVsYXRvciA9IGl0ZXJhdGVlKGFjY3VtdWxhdG9yLCBhcnJheVtpbmRleF0sIGluZGV4LCBhcnJheSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gYWNjdW11bGF0b3I7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBfLnJlZHVjZVJpZ2h0YCBmb3IgYXJyYXlzIHdpdGhvdXQgc3VwcG9ydCBmb3JcbiAgICAgKiBjYWxsYmFjayBzaG9ydGhhbmRzIGFuZCBgdGhpc2AgYmluZGluZy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBpdGVyYXRlZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEBwYXJhbSB7Kn0gW2FjY3VtdWxhdG9yXSBUaGUgaW5pdGlhbCB2YWx1ZS5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtpbml0RnJvbUFycmF5XSBTcGVjaWZ5IHVzaW5nIHRoZSBsYXN0IGVsZW1lbnQgb2YgYGFycmF5YFxuICAgICAqICBhcyB0aGUgaW5pdGlhbCB2YWx1ZS5cbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgYWNjdW11bGF0ZWQgdmFsdWUuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYXJyYXlSZWR1Y2VSaWdodChhcnJheSwgaXRlcmF0ZWUsIGFjY3VtdWxhdG9yLCBpbml0RnJvbUFycmF5KSB7XG4gICAgICB2YXIgbGVuZ3RoID0gYXJyYXkubGVuZ3RoO1xuICAgICAgaWYgKGluaXRGcm9tQXJyYXkgJiYgbGVuZ3RoKSB7XG4gICAgICAgIGFjY3VtdWxhdG9yID0gYXJyYXlbLS1sZW5ndGhdO1xuICAgICAgfVxuICAgICAgd2hpbGUgKGxlbmd0aC0tKSB7XG4gICAgICAgIGFjY3VtdWxhdG9yID0gaXRlcmF0ZWUoYWNjdW11bGF0b3IsIGFycmF5W2xlbmd0aF0sIGxlbmd0aCwgYXJyYXkpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGFjY3VtdWxhdG9yO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgXy5zb21lYCBmb3IgYXJyYXlzIHdpdGhvdXQgc3VwcG9ydCBmb3IgY2FsbGJhY2tcbiAgICAgKiBzaG9ydGhhbmRzIGFuZCBgdGhpc2AgYmluZGluZy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBwcmVkaWNhdGUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYW55IGVsZW1lbnQgcGFzc2VzIHRoZSBwcmVkaWNhdGUgY2hlY2ssXG4gICAgICogIGVsc2UgYGZhbHNlYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBhcnJheVNvbWUoYXJyYXksIHByZWRpY2F0ZSkge1xuICAgICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgICAgbGVuZ3RoID0gYXJyYXkubGVuZ3RoO1xuXG4gICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICBpZiAocHJlZGljYXRlKGFycmF5W2luZGV4XSwgaW5kZXgsIGFycmF5KSkge1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBfLnN1bWAgZm9yIGFycmF5cyB3aXRob3V0IHN1cHBvcnQgZm9yIGNhbGxiYWNrXG4gICAgICogc2hvcnRoYW5kcyBhbmQgYHRoaXNgIGJpbmRpbmcuLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdGVlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgc3VtLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGFycmF5U3VtKGFycmF5LCBpdGVyYXRlZSkge1xuICAgICAgdmFyIGxlbmd0aCA9IGFycmF5Lmxlbmd0aCxcbiAgICAgICAgICByZXN1bHQgPSAwO1xuXG4gICAgICB3aGlsZSAobGVuZ3RoLS0pIHtcbiAgICAgICAgcmVzdWx0ICs9ICtpdGVyYXRlZShhcnJheVtsZW5ndGhdKSB8fCAwO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVc2VkIGJ5IGBfLmRlZmF1bHRzYCB0byBjdXN0b21pemUgaXRzIGBfLmFzc2lnbmAgdXNlLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0geyp9IG9iamVjdFZhbHVlIFRoZSBkZXN0aW5hdGlvbiBvYmplY3QgcHJvcGVydHkgdmFsdWUuXG4gICAgICogQHBhcmFtIHsqfSBzb3VyY2VWYWx1ZSBUaGUgc291cmNlIG9iamVjdCBwcm9wZXJ0eSB2YWx1ZS5cbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgdmFsdWUgdG8gYXNzaWduIHRvIHRoZSBkZXN0aW5hdGlvbiBvYmplY3QuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYXNzaWduRGVmYXVsdHMob2JqZWN0VmFsdWUsIHNvdXJjZVZhbHVlKSB7XG4gICAgICByZXR1cm4gb2JqZWN0VmFsdWUgPT09IHVuZGVmaW5lZCA/IHNvdXJjZVZhbHVlIDogb2JqZWN0VmFsdWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXNlZCBieSBgXy50ZW1wbGF0ZWAgdG8gY3VzdG9taXplIGl0cyBgXy5hc3NpZ25gIHVzZS5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGlzIGZ1bmN0aW9uIGlzIGxpa2UgYGFzc2lnbkRlZmF1bHRzYCBleGNlcHQgdGhhdCBpdCBpZ25vcmVzXG4gICAgICogaW5oZXJpdGVkIHByb3BlcnR5IHZhbHVlcyB3aGVuIGNoZWNraW5nIGlmIGEgcHJvcGVydHkgaXMgYHVuZGVmaW5lZGAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Kn0gb2JqZWN0VmFsdWUgVGhlIGRlc3RpbmF0aW9uIG9iamVjdCBwcm9wZXJ0eSB2YWx1ZS5cbiAgICAgKiBAcGFyYW0geyp9IHNvdXJjZVZhbHVlIFRoZSBzb3VyY2Ugb2JqZWN0IHByb3BlcnR5IHZhbHVlLlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBhc3NvY2lhdGVkIHdpdGggdGhlIG9iamVjdCBhbmQgc291cmNlIHZhbHVlcy5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBkZXN0aW5hdGlvbiBvYmplY3QuXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIHZhbHVlIHRvIGFzc2lnbiB0byB0aGUgZGVzdGluYXRpb24gb2JqZWN0LlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGFzc2lnbk93bkRlZmF1bHRzKG9iamVjdFZhbHVlLCBzb3VyY2VWYWx1ZSwga2V5LCBvYmplY3QpIHtcbiAgICAgIHJldHVybiAob2JqZWN0VmFsdWUgPT09IHVuZGVmaW5lZCB8fCAhaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIGtleSkpXG4gICAgICAgID8gc291cmNlVmFsdWVcbiAgICAgICAgOiBvYmplY3RWYWx1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYF8uYXNzaWduYCBmb3IgY3VzdG9taXppbmcgYXNzaWduZWQgdmFsdWVzIHdpdGhvdXRcbiAgICAgKiBzdXBwb3J0IGZvciBhcmd1bWVudCBqdWdnbGluZywgbXVsdGlwbGUgc291cmNlcywgYW5kIGB0aGlzYCBiaW5kaW5nIGBjdXN0b21pemVyYFxuICAgICAqIGZ1bmN0aW9ucy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgZGVzdGluYXRpb24gb2JqZWN0LlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBzb3VyY2UgVGhlIHNvdXJjZSBvYmplY3QuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gY3VzdG9taXplciBUaGUgZnVuY3Rpb24gdG8gY3VzdG9taXplIGFzc2lnbmVkIHZhbHVlcy5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGBvYmplY3RgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGFzc2lnbldpdGgob2JqZWN0LCBzb3VyY2UsIGN1c3RvbWl6ZXIpIHtcbiAgICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICAgIHByb3BzID0ga2V5cyhzb3VyY2UpLFxuICAgICAgICAgIGxlbmd0aCA9IHByb3BzLmxlbmd0aDtcblxuICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgdmFyIGtleSA9IHByb3BzW2luZGV4XSxcbiAgICAgICAgICAgIHZhbHVlID0gb2JqZWN0W2tleV0sXG4gICAgICAgICAgICByZXN1bHQgPSBjdXN0b21pemVyKHZhbHVlLCBzb3VyY2Vba2V5XSwga2V5LCBvYmplY3QsIHNvdXJjZSk7XG5cbiAgICAgICAgaWYgKChyZXN1bHQgPT09IHJlc3VsdCA/IChyZXN1bHQgIT09IHZhbHVlKSA6ICh2YWx1ZSA9PT0gdmFsdWUpKSB8fFxuICAgICAgICAgICAgKHZhbHVlID09PSB1bmRlZmluZWQgJiYgIShrZXkgaW4gb2JqZWN0KSkpIHtcbiAgICAgICAgICBvYmplY3Rba2V5XSA9IHJlc3VsdDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIG9iamVjdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5hc3NpZ25gIHdpdGhvdXQgc3VwcG9ydCBmb3IgYXJndW1lbnQganVnZ2xpbmcsXG4gICAgICogbXVsdGlwbGUgc291cmNlcywgYW5kIGBjdXN0b21pemVyYCBmdW5jdGlvbnMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIGRlc3RpbmF0aW9uIG9iamVjdC5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gc291cmNlIFRoZSBzb3VyY2Ugb2JqZWN0LlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZUFzc2lnbihvYmplY3QsIHNvdXJjZSkge1xuICAgICAgcmV0dXJuIHNvdXJjZSA9PSBudWxsXG4gICAgICAgID8gb2JqZWN0XG4gICAgICAgIDogYmFzZUNvcHkoc291cmNlLCBrZXlzKHNvdXJjZSksIG9iamVjdCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uYXRgIHdpdGhvdXQgc3VwcG9ydCBmb3Igc3RyaW5nIGNvbGxlY3Rpb25zXG4gICAgICogYW5kIGluZGl2aWR1YWwga2V5IGFyZ3VtZW50cy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyW118c3RyaW5nW119IHByb3BzIFRoZSBwcm9wZXJ0eSBuYW1lcyBvciBpbmRleGVzIG9mIGVsZW1lbnRzIHRvIHBpY2suXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgYXJyYXkgb2YgcGlja2VkIGVsZW1lbnRzLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VBdChjb2xsZWN0aW9uLCBwcm9wcykge1xuICAgICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgICAgaXNOaWwgPSBjb2xsZWN0aW9uID09IG51bGwsXG4gICAgICAgICAgaXNBcnIgPSAhaXNOaWwgJiYgaXNBcnJheUxpa2UoY29sbGVjdGlvbiksXG4gICAgICAgICAgbGVuZ3RoID0gaXNBcnIgPyBjb2xsZWN0aW9uLmxlbmd0aCA6IDAsXG4gICAgICAgICAgcHJvcHNMZW5ndGggPSBwcm9wcy5sZW5ndGgsXG4gICAgICAgICAgcmVzdWx0ID0gQXJyYXkocHJvcHNMZW5ndGgpO1xuXG4gICAgICB3aGlsZSgrK2luZGV4IDwgcHJvcHNMZW5ndGgpIHtcbiAgICAgICAgdmFyIGtleSA9IHByb3BzW2luZGV4XTtcbiAgICAgICAgaWYgKGlzQXJyKSB7XG4gICAgICAgICAgcmVzdWx0W2luZGV4XSA9IGlzSW5kZXgoa2V5LCBsZW5ndGgpID8gY29sbGVjdGlvbltrZXldIDogdW5kZWZpbmVkO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlc3VsdFtpbmRleF0gPSBpc05pbCA/IHVuZGVmaW5lZCA6IGNvbGxlY3Rpb25ba2V5XTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb3BpZXMgcHJvcGVydGllcyBvZiBgc291cmNlYCB0byBgb2JqZWN0YC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHNvdXJjZSBUaGUgb2JqZWN0IHRvIGNvcHkgcHJvcGVydGllcyBmcm9tLlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IHByb3BzIFRoZSBwcm9wZXJ0eSBuYW1lcyB0byBjb3B5LlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbb2JqZWN0PXt9XSBUaGUgb2JqZWN0IHRvIGNvcHkgcHJvcGVydGllcyB0by5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGBvYmplY3RgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VDb3B5KHNvdXJjZSwgcHJvcHMsIG9iamVjdCkge1xuICAgICAgb2JqZWN0IHx8IChvYmplY3QgPSB7fSk7XG5cbiAgICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICAgIGxlbmd0aCA9IHByb3BzLmxlbmd0aDtcblxuICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgdmFyIGtleSA9IHByb3BzW2luZGV4XTtcbiAgICAgICAgb2JqZWN0W2tleV0gPSBzb3VyY2Vba2V5XTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBvYmplY3Q7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uY2FsbGJhY2tgIHdoaWNoIHN1cHBvcnRzIHNwZWNpZnlpbmcgdGhlXG4gICAgICogbnVtYmVyIG9mIGFyZ3VtZW50cyB0byBwcm92aWRlIHRvIGBmdW5jYC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHsqfSBbZnVuYz1fLmlkZW50aXR5XSBUaGUgdmFsdWUgdG8gY29udmVydCB0byBhIGNhbGxiYWNrLlxuICAgICAqIEBwYXJhbSB7Kn0gW3RoaXNBcmddIFRoZSBgdGhpc2AgYmluZGluZyBvZiBgZnVuY2AuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFthcmdDb3VudF0gVGhlIG51bWJlciBvZiBhcmd1bWVudHMgdG8gcHJvdmlkZSB0byBgZnVuY2AuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBjYWxsYmFjay5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlQ2FsbGJhY2soZnVuYywgdGhpc0FyZywgYXJnQ291bnQpIHtcbiAgICAgIHZhciB0eXBlID0gdHlwZW9mIGZ1bmM7XG4gICAgICBpZiAodHlwZSA9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHJldHVybiB0aGlzQXJnID09PSB1bmRlZmluZWRcbiAgICAgICAgICA/IGZ1bmNcbiAgICAgICAgICA6IGJpbmRDYWxsYmFjayhmdW5jLCB0aGlzQXJnLCBhcmdDb3VudCk7XG4gICAgICB9XG4gICAgICBpZiAoZnVuYyA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybiBpZGVudGl0eTtcbiAgICAgIH1cbiAgICAgIGlmICh0eXBlID09ICdvYmplY3QnKSB7XG4gICAgICAgIHJldHVybiBiYXNlTWF0Y2hlcyhmdW5jKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzQXJnID09PSB1bmRlZmluZWRcbiAgICAgICAgPyBwcm9wZXJ0eShmdW5jKVxuICAgICAgICA6IGJhc2VNYXRjaGVzUHJvcGVydHkoZnVuYywgdGhpc0FyZyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uY2xvbmVgIHdpdGhvdXQgc3VwcG9ydCBmb3IgYXJndW1lbnQganVnZ2xpbmdcbiAgICAgKiBhbmQgYHRoaXNgIGJpbmRpbmcgYGN1c3RvbWl6ZXJgIGZ1bmN0aW9ucy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2xvbmUuXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbaXNEZWVwXSBTcGVjaWZ5IGEgZGVlcCBjbG9uZS5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY3VzdG9taXplcl0gVGhlIGZ1bmN0aW9uIHRvIGN1c3RvbWl6ZSBjbG9uaW5nIHZhbHVlcy5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW2tleV0gVGhlIGtleSBvZiBgdmFsdWVgLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbb2JqZWN0XSBUaGUgb2JqZWN0IGB2YWx1ZWAgYmVsb25ncyB0by5cbiAgICAgKiBAcGFyYW0ge0FycmF5fSBbc3RhY2tBPVtdXSBUcmFja3MgdHJhdmVyc2VkIHNvdXJjZSBvYmplY3RzLlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IFtzdGFja0I9W11dIEFzc29jaWF0ZXMgY2xvbmVzIHdpdGggc291cmNlIGNvdW50ZXJwYXJ0cy5cbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgY2xvbmVkIHZhbHVlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VDbG9uZSh2YWx1ZSwgaXNEZWVwLCBjdXN0b21pemVyLCBrZXksIG9iamVjdCwgc3RhY2tBLCBzdGFja0IpIHtcbiAgICAgIHZhciByZXN1bHQ7XG4gICAgICBpZiAoY3VzdG9taXplcikge1xuICAgICAgICByZXN1bHQgPSBvYmplY3QgPyBjdXN0b21pemVyKHZhbHVlLCBrZXksIG9iamVjdCkgOiBjdXN0b21pemVyKHZhbHVlKTtcbiAgICAgIH1cbiAgICAgIGlmIChyZXN1bHQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfVxuICAgICAgaWYgKCFpc09iamVjdCh2YWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgfVxuICAgICAgdmFyIGlzQXJyID0gaXNBcnJheSh2YWx1ZSk7XG4gICAgICBpZiAoaXNBcnIpIHtcbiAgICAgICAgcmVzdWx0ID0gaW5pdENsb25lQXJyYXkodmFsdWUpO1xuICAgICAgICBpZiAoIWlzRGVlcCkge1xuICAgICAgICAgIHJldHVybiBhcnJheUNvcHkodmFsdWUsIHJlc3VsdCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhciB0YWcgPSBvYmpUb1N0cmluZy5jYWxsKHZhbHVlKSxcbiAgICAgICAgICAgIGlzRnVuYyA9IHRhZyA9PSBmdW5jVGFnO1xuXG4gICAgICAgIGlmICh0YWcgPT0gb2JqZWN0VGFnIHx8IHRhZyA9PSBhcmdzVGFnIHx8IChpc0Z1bmMgJiYgIW9iamVjdCkpIHtcbiAgICAgICAgICByZXN1bHQgPSBpbml0Q2xvbmVPYmplY3QoaXNGdW5jID8ge30gOiB2YWx1ZSk7XG4gICAgICAgICAgaWYgKCFpc0RlZXApIHtcbiAgICAgICAgICAgIHJldHVybiBiYXNlQXNzaWduKHJlc3VsdCwgdmFsdWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gY2xvbmVhYmxlVGFnc1t0YWddXG4gICAgICAgICAgICA/IGluaXRDbG9uZUJ5VGFnKHZhbHVlLCB0YWcsIGlzRGVlcClcbiAgICAgICAgICAgIDogKG9iamVjdCA/IHZhbHVlIDoge30pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvLyBDaGVjayBmb3IgY2lyY3VsYXIgcmVmZXJlbmNlcyBhbmQgcmV0dXJuIGl0cyBjb3JyZXNwb25kaW5nIGNsb25lLlxuICAgICAgc3RhY2tBIHx8IChzdGFja0EgPSBbXSk7XG4gICAgICBzdGFja0IgfHwgKHN0YWNrQiA9IFtdKTtcblxuICAgICAgdmFyIGxlbmd0aCA9IHN0YWNrQS5sZW5ndGg7XG4gICAgICB3aGlsZSAobGVuZ3RoLS0pIHtcbiAgICAgICAgaWYgKHN0YWNrQVtsZW5ndGhdID09IHZhbHVlKSB7XG4gICAgICAgICAgcmV0dXJuIHN0YWNrQltsZW5ndGhdO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvLyBBZGQgdGhlIHNvdXJjZSB2YWx1ZSB0byB0aGUgc3RhY2sgb2YgdHJhdmVyc2VkIG9iamVjdHMgYW5kIGFzc29jaWF0ZSBpdCB3aXRoIGl0cyBjbG9uZS5cbiAgICAgIHN0YWNrQS5wdXNoKHZhbHVlKTtcbiAgICAgIHN0YWNrQi5wdXNoKHJlc3VsdCk7XG5cbiAgICAgIC8vIFJlY3Vyc2l2ZWx5IHBvcHVsYXRlIGNsb25lIChzdXNjZXB0aWJsZSB0byBjYWxsIHN0YWNrIGxpbWl0cykuXG4gICAgICAoaXNBcnIgPyBhcnJheUVhY2ggOiBiYXNlRm9yT3duKSh2YWx1ZSwgZnVuY3Rpb24oc3ViVmFsdWUsIGtleSkge1xuICAgICAgICByZXN1bHRba2V5XSA9IGJhc2VDbG9uZShzdWJWYWx1ZSwgaXNEZWVwLCBjdXN0b21pemVyLCBrZXksIHZhbHVlLCBzdGFja0EsIHN0YWNrQik7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uY3JlYXRlYCB3aXRob3V0IHN1cHBvcnQgZm9yIGFzc2lnbmluZ1xuICAgICAqIHByb3BlcnRpZXMgdG8gdGhlIGNyZWF0ZWQgb2JqZWN0LlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gcHJvdG90eXBlIFRoZSBvYmplY3QgdG8gaW5oZXJpdCBmcm9tLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIG5ldyBvYmplY3QuXG4gICAgICovXG4gICAgdmFyIGJhc2VDcmVhdGUgPSAoZnVuY3Rpb24oKSB7XG4gICAgICBmdW5jdGlvbiBvYmplY3QoKSB7fVxuICAgICAgcmV0dXJuIGZ1bmN0aW9uKHByb3RvdHlwZSkge1xuICAgICAgICBpZiAoaXNPYmplY3QocHJvdG90eXBlKSkge1xuICAgICAgICAgIG9iamVjdC5wcm90b3R5cGUgPSBwcm90b3R5cGU7XG4gICAgICAgICAgdmFyIHJlc3VsdCA9IG5ldyBvYmplY3Q7XG4gICAgICAgICAgb2JqZWN0LnByb3RvdHlwZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0IHx8IHt9O1xuICAgICAgfTtcbiAgICB9KCkpO1xuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uZGVsYXlgIGFuZCBgXy5kZWZlcmAgd2hpY2ggYWNjZXB0cyBhbiBpbmRleFxuICAgICAqIG9mIHdoZXJlIHRvIHNsaWNlIHRoZSBhcmd1bWVudHMgdG8gcHJvdmlkZSB0byBgZnVuY2AuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGRlbGF5LlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB3YWl0IFRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHRvIGRlbGF5IGludm9jYXRpb24uXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGFyZ3MgVGhlIGFyZ3VtZW50cyBwcm92aWRlIHRvIGBmdW5jYC5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSB0aW1lciBpZC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlRGVsYXkoZnVuYywgd2FpdCwgYXJncykge1xuICAgICAgaWYgKHR5cGVvZiBmdW5jICE9ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihGVU5DX0VSUk9SX1RFWFQpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7IGZ1bmMuYXBwbHkodW5kZWZpbmVkLCBhcmdzKTsgfSwgd2FpdCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uZGlmZmVyZW5jZWAgd2hpY2ggYWNjZXB0cyBhIHNpbmdsZSBhcnJheVxuICAgICAqIG9mIHZhbHVlcyB0byBleGNsdWRlLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0ge0FycmF5fSB2YWx1ZXMgVGhlIHZhbHVlcyB0byBleGNsdWRlLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGFycmF5IG9mIGZpbHRlcmVkIHZhbHVlcy5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlRGlmZmVyZW5jZShhcnJheSwgdmFsdWVzKSB7XG4gICAgICB2YXIgbGVuZ3RoID0gYXJyYXkgPyBhcnJheS5sZW5ndGggOiAwLFxuICAgICAgICAgIHJlc3VsdCA9IFtdO1xuXG4gICAgICBpZiAoIWxlbmd0aCkge1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfVxuICAgICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgICAgaW5kZXhPZiA9IGdldEluZGV4T2YoKSxcbiAgICAgICAgICBpc0NvbW1vbiA9IGluZGV4T2YgPT0gYmFzZUluZGV4T2YsXG4gICAgICAgICAgY2FjaGUgPSAoaXNDb21tb24gJiYgdmFsdWVzLmxlbmd0aCA+PSBMQVJHRV9BUlJBWV9TSVpFKSA/IGNyZWF0ZUNhY2hlKHZhbHVlcykgOiBudWxsLFxuICAgICAgICAgIHZhbHVlc0xlbmd0aCA9IHZhbHVlcy5sZW5ndGg7XG5cbiAgICAgIGlmIChjYWNoZSkge1xuICAgICAgICBpbmRleE9mID0gY2FjaGVJbmRleE9mO1xuICAgICAgICBpc0NvbW1vbiA9IGZhbHNlO1xuICAgICAgICB2YWx1ZXMgPSBjYWNoZTtcbiAgICAgIH1cbiAgICAgIG91dGVyOlxuICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgdmFyIHZhbHVlID0gYXJyYXlbaW5kZXhdO1xuXG4gICAgICAgIGlmIChpc0NvbW1vbiAmJiB2YWx1ZSA9PT0gdmFsdWUpIHtcbiAgICAgICAgICB2YXIgdmFsdWVzSW5kZXggPSB2YWx1ZXNMZW5ndGg7XG4gICAgICAgICAgd2hpbGUgKHZhbHVlc0luZGV4LS0pIHtcbiAgICAgICAgICAgIGlmICh2YWx1ZXNbdmFsdWVzSW5kZXhdID09PSB2YWx1ZSkge1xuICAgICAgICAgICAgICBjb250aW51ZSBvdXRlcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgcmVzdWx0LnB1c2godmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGluZGV4T2YodmFsdWVzLCB2YWx1ZSwgMCkgPCAwKSB7XG4gICAgICAgICAgcmVzdWx0LnB1c2godmFsdWUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmZvckVhY2hgIHdpdGhvdXQgc3VwcG9ydCBmb3IgY2FsbGJhY2tcbiAgICAgKiBzaG9ydGhhbmRzIGFuZCBgdGhpc2AgYmluZGluZy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R8c3RyaW5nfSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBpdGVyYXRlZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEByZXR1cm5zIHtBcnJheXxPYmplY3R8c3RyaW5nfSBSZXR1cm5zIGBjb2xsZWN0aW9uYC5cbiAgICAgKi9cbiAgICB2YXIgYmFzZUVhY2ggPSBjcmVhdGVCYXNlRWFjaChiYXNlRm9yT3duKTtcblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmZvckVhY2hSaWdodGAgd2l0aG91dCBzdXBwb3J0IGZvciBjYWxsYmFja1xuICAgICAqIHNob3J0aGFuZHMgYW5kIGB0aGlzYCBiaW5kaW5nLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdHxzdHJpbmd9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdGVlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAgICogQHJldHVybnMge0FycmF5fE9iamVjdHxzdHJpbmd9IFJldHVybnMgYGNvbGxlY3Rpb25gLlxuICAgICAqL1xuICAgIHZhciBiYXNlRWFjaFJpZ2h0ID0gY3JlYXRlQmFzZUVhY2goYmFzZUZvck93blJpZ2h0LCB0cnVlKTtcblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmV2ZXJ5YCB3aXRob3V0IHN1cHBvcnQgZm9yIGNhbGxiYWNrXG4gICAgICogc2hvcnRoYW5kcyBhbmQgYHRoaXNgIGJpbmRpbmcuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fHN0cmluZ30gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gcHJlZGljYXRlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGFsbCBlbGVtZW50cyBwYXNzIHRoZSBwcmVkaWNhdGUgY2hlY2ssXG4gICAgICogIGVsc2UgYGZhbHNlYFxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VFdmVyeShjb2xsZWN0aW9uLCBwcmVkaWNhdGUpIHtcbiAgICAgIHZhciByZXN1bHQgPSB0cnVlO1xuICAgICAgYmFzZUVhY2goY29sbGVjdGlvbiwgZnVuY3Rpb24odmFsdWUsIGluZGV4LCBjb2xsZWN0aW9uKSB7XG4gICAgICAgIHJlc3VsdCA9ICEhcHJlZGljYXRlKHZhbHVlLCBpbmRleCwgY29sbGVjdGlvbik7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgZXh0cmVtdW0gdmFsdWUgb2YgYGNvbGxlY3Rpb25gIGludm9raW5nIGBpdGVyYXRlZWAgZm9yIGVhY2ggdmFsdWVcbiAgICAgKiBpbiBgY29sbGVjdGlvbmAgdG8gZ2VuZXJhdGUgdGhlIGNyaXRlcmlvbiBieSB3aGljaCB0aGUgdmFsdWUgaXMgcmFua2VkLlxuICAgICAqIFRoZSBgaXRlcmF0ZWVgIGlzIGludm9rZWQgd2l0aCB0aHJlZSBhcmd1bWVudHM6ICh2YWx1ZSwgaW5kZXh8a2V5LCBjb2xsZWN0aW9uKS5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R8c3RyaW5nfSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBpdGVyYXRlZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGNvbXBhcmF0b3IgVGhlIGZ1bmN0aW9uIHVzZWQgdG8gY29tcGFyZSB2YWx1ZXMuXG4gICAgICogQHBhcmFtIHsqfSBleFZhbHVlIFRoZSBpbml0aWFsIGV4dHJlbXVtIHZhbHVlLlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBleHRyZW11bSB2YWx1ZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlRXh0cmVtdW0oY29sbGVjdGlvbiwgaXRlcmF0ZWUsIGNvbXBhcmF0b3IsIGV4VmFsdWUpIHtcbiAgICAgIHZhciBjb21wdXRlZCA9IGV4VmFsdWUsXG4gICAgICAgICAgcmVzdWx0ID0gY29tcHV0ZWQ7XG5cbiAgICAgIGJhc2VFYWNoKGNvbGxlY3Rpb24sIGZ1bmN0aW9uKHZhbHVlLCBpbmRleCwgY29sbGVjdGlvbikge1xuICAgICAgICB2YXIgY3VycmVudCA9ICtpdGVyYXRlZSh2YWx1ZSwgaW5kZXgsIGNvbGxlY3Rpb24pO1xuICAgICAgICBpZiAoY29tcGFyYXRvcihjdXJyZW50LCBjb21wdXRlZCkgfHwgKGN1cnJlbnQgPT09IGV4VmFsdWUgJiYgY3VycmVudCA9PT0gcmVzdWx0KSkge1xuICAgICAgICAgIGNvbXB1dGVkID0gY3VycmVudDtcbiAgICAgICAgICByZXN1bHQgPSB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmZpbGxgIHdpdGhvdXQgYW4gaXRlcmF0ZWUgY2FsbCBndWFyZC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGZpbGwuXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gZmlsbCBgYXJyYXlgIHdpdGguXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtzdGFydD0wXSBUaGUgc3RhcnQgcG9zaXRpb24uXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtlbmQ9YXJyYXkubGVuZ3RoXSBUaGUgZW5kIHBvc2l0aW9uLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyBgYXJyYXlgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VGaWxsKGFycmF5LCB2YWx1ZSwgc3RhcnQsIGVuZCkge1xuICAgICAgdmFyIGxlbmd0aCA9IGFycmF5Lmxlbmd0aDtcblxuICAgICAgc3RhcnQgPSBzdGFydCA9PSBudWxsID8gMCA6ICgrc3RhcnQgfHwgMCk7XG4gICAgICBpZiAoc3RhcnQgPCAwKSB7XG4gICAgICAgIHN0YXJ0ID0gLXN0YXJ0ID4gbGVuZ3RoID8gMCA6IChsZW5ndGggKyBzdGFydCk7XG4gICAgICB9XG4gICAgICBlbmQgPSAoZW5kID09PSB1bmRlZmluZWQgfHwgZW5kID4gbGVuZ3RoKSA/IGxlbmd0aCA6ICgrZW5kIHx8IDApO1xuICAgICAgaWYgKGVuZCA8IDApIHtcbiAgICAgICAgZW5kICs9IGxlbmd0aDtcbiAgICAgIH1cbiAgICAgIGxlbmd0aCA9IHN0YXJ0ID4gZW5kID8gMCA6IChlbmQgPj4+IDApO1xuICAgICAgc3RhcnQgPj4+PSAwO1xuXG4gICAgICB3aGlsZSAoc3RhcnQgPCBsZW5ndGgpIHtcbiAgICAgICAgYXJyYXlbc3RhcnQrK10gPSB2YWx1ZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBhcnJheTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5maWx0ZXJgIHdpdGhvdXQgc3VwcG9ydCBmb3IgY2FsbGJhY2tcbiAgICAgKiBzaG9ydGhhbmRzIGFuZCBgdGhpc2AgYmluZGluZy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R8c3RyaW5nfSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBwcmVkaWNhdGUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBmaWx0ZXJlZCBhcnJheS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlRmlsdGVyKGNvbGxlY3Rpb24sIHByZWRpY2F0ZSkge1xuICAgICAgdmFyIHJlc3VsdCA9IFtdO1xuICAgICAgYmFzZUVhY2goY29sbGVjdGlvbiwgZnVuY3Rpb24odmFsdWUsIGluZGV4LCBjb2xsZWN0aW9uKSB7XG4gICAgICAgIGlmIChwcmVkaWNhdGUodmFsdWUsIGluZGV4LCBjb2xsZWN0aW9uKSkge1xuICAgICAgICAgIHJlc3VsdC5wdXNoKHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmZpbmRgLCBgXy5maW5kTGFzdGAsIGBfLmZpbmRLZXlgLCBhbmQgYF8uZmluZExhc3RLZXlgLFxuICAgICAqIHdpdGhvdXQgc3VwcG9ydCBmb3IgY2FsbGJhY2sgc2hvcnRoYW5kcyBhbmQgYHRoaXNgIGJpbmRpbmcsIHdoaWNoIGl0ZXJhdGVzXG4gICAgICogb3ZlciBgY29sbGVjdGlvbmAgdXNpbmcgdGhlIHByb3ZpZGVkIGBlYWNoRnVuY2AuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fHN0cmluZ30gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBzZWFyY2guXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gcHJlZGljYXRlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZWFjaEZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGl0ZXJhdGUgb3ZlciBgY29sbGVjdGlvbmAuXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbcmV0S2V5XSBTcGVjaWZ5IHJldHVybmluZyB0aGUga2V5IG9mIHRoZSBmb3VuZCBlbGVtZW50XG4gICAgICogIGluc3RlYWQgb2YgdGhlIGVsZW1lbnQgaXRzZWxmLlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBmb3VuZCBlbGVtZW50IG9yIGl0cyBrZXksIGVsc2UgYHVuZGVmaW5lZGAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZUZpbmQoY29sbGVjdGlvbiwgcHJlZGljYXRlLCBlYWNoRnVuYywgcmV0S2V5KSB7XG4gICAgICB2YXIgcmVzdWx0O1xuICAgICAgZWFjaEZ1bmMoY29sbGVjdGlvbiwgZnVuY3Rpb24odmFsdWUsIGtleSwgY29sbGVjdGlvbikge1xuICAgICAgICBpZiAocHJlZGljYXRlKHZhbHVlLCBrZXksIGNvbGxlY3Rpb24pKSB7XG4gICAgICAgICAgcmVzdWx0ID0gcmV0S2V5ID8ga2V5IDogdmFsdWU7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uZmxhdHRlbmAgd2l0aCBhZGRlZCBzdXBwb3J0IGZvciByZXN0cmljdGluZ1xuICAgICAqIGZsYXR0ZW5pbmcgYW5kIHNwZWNpZnlpbmcgdGhlIHN0YXJ0IGluZGV4LlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gZmxhdHRlbi5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtpc0RlZXBdIFNwZWNpZnkgYSBkZWVwIGZsYXR0ZW4uXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbaXNTdHJpY3RdIFJlc3RyaWN0IGZsYXR0ZW5pbmcgdG8gYXJyYXlzLWxpa2Ugb2JqZWN0cy5cbiAgICAgKiBAcGFyYW0ge0FycmF5fSBbcmVzdWx0PVtdXSBUaGUgaW5pdGlhbCByZXN1bHQgdmFsdWUuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgZmxhdHRlbmVkIGFycmF5LlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VGbGF0dGVuKGFycmF5LCBpc0RlZXAsIGlzU3RyaWN0LCByZXN1bHQpIHtcbiAgICAgIHJlc3VsdCB8fCAocmVzdWx0ID0gW10pO1xuXG4gICAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgICBsZW5ndGggPSBhcnJheS5sZW5ndGg7XG5cbiAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgIHZhciB2YWx1ZSA9IGFycmF5W2luZGV4XTtcbiAgICAgICAgaWYgKGlzT2JqZWN0TGlrZSh2YWx1ZSkgJiYgaXNBcnJheUxpa2UodmFsdWUpICYmXG4gICAgICAgICAgICAoaXNTdHJpY3QgfHwgaXNBcnJheSh2YWx1ZSkgfHwgaXNBcmd1bWVudHModmFsdWUpKSkge1xuICAgICAgICAgIGlmIChpc0RlZXApIHtcbiAgICAgICAgICAgIC8vIFJlY3Vyc2l2ZWx5IGZsYXR0ZW4gYXJyYXlzIChzdXNjZXB0aWJsZSB0byBjYWxsIHN0YWNrIGxpbWl0cykuXG4gICAgICAgICAgICBiYXNlRmxhdHRlbih2YWx1ZSwgaXNEZWVwLCBpc1N0cmljdCwgcmVzdWx0KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgYXJyYXlQdXNoKHJlc3VsdCwgdmFsdWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmICghaXNTdHJpY3QpIHtcbiAgICAgICAgICByZXN1bHRbcmVzdWx0Lmxlbmd0aF0gPSB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgYmFzZUZvckluYCBhbmQgYGJhc2VGb3JPd25gIHdoaWNoIGl0ZXJhdGVzXG4gICAgICogb3ZlciBgb2JqZWN0YCBwcm9wZXJ0aWVzIHJldHVybmVkIGJ5IGBrZXlzRnVuY2AgaW52b2tpbmcgYGl0ZXJhdGVlYCBmb3JcbiAgICAgKiBlYWNoIHByb3BlcnR5LiBJdGVyYXRlZSBmdW5jdGlvbnMgbWF5IGV4aXQgaXRlcmF0aW9uIGVhcmx5IGJ5IGV4cGxpY2l0bHlcbiAgICAgKiByZXR1cm5pbmcgYGZhbHNlYC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBpdGVyYXRlZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGtleXNGdW5jIFRoZSBmdW5jdGlvbiB0byBnZXQgdGhlIGtleXMgb2YgYG9iamVjdGAuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBgb2JqZWN0YC5cbiAgICAgKi9cbiAgICB2YXIgYmFzZUZvciA9IGNyZWF0ZUJhc2VGb3IoKTtcblxuICAgIC8qKlxuICAgICAqIFRoaXMgZnVuY3Rpb24gaXMgbGlrZSBgYmFzZUZvcmAgZXhjZXB0IHRoYXQgaXQgaXRlcmF0ZXMgb3ZlciBwcm9wZXJ0aWVzXG4gICAgICogaW4gdGhlIG9wcG9zaXRlIG9yZGVyLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdGVlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0ga2V5c0Z1bmMgVGhlIGZ1bmN0aW9uIHRvIGdldCB0aGUga2V5cyBvZiBgb2JqZWN0YC5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGBvYmplY3RgLlxuICAgICAqL1xuICAgIHZhciBiYXNlRm9yUmlnaHQgPSBjcmVhdGVCYXNlRm9yKHRydWUpO1xuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uZm9ySW5gIHdpdGhvdXQgc3VwcG9ydCBmb3IgY2FsbGJhY2tcbiAgICAgKiBzaG9ydGhhbmRzIGFuZCBgdGhpc2AgYmluZGluZy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBpdGVyYXRlZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZUZvckluKG9iamVjdCwgaXRlcmF0ZWUpIHtcbiAgICAgIHJldHVybiBiYXNlRm9yKG9iamVjdCwgaXRlcmF0ZWUsIGtleXNJbik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uZm9yT3duYCB3aXRob3V0IHN1cHBvcnQgZm9yIGNhbGxiYWNrXG4gICAgICogc2hvcnRoYW5kcyBhbmQgYHRoaXNgIGJpbmRpbmcuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gaXRlcmF0ZWUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGBvYmplY3RgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VGb3JPd24ob2JqZWN0LCBpdGVyYXRlZSkge1xuICAgICAgcmV0dXJuIGJhc2VGb3Iob2JqZWN0LCBpdGVyYXRlZSwga2V5cyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uZm9yT3duUmlnaHRgIHdpdGhvdXQgc3VwcG9ydCBmb3IgY2FsbGJhY2tcbiAgICAgKiBzaG9ydGhhbmRzIGFuZCBgdGhpc2AgYmluZGluZy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBpdGVyYXRlZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZUZvck93blJpZ2h0KG9iamVjdCwgaXRlcmF0ZWUpIHtcbiAgICAgIHJldHVybiBiYXNlRm9yUmlnaHQob2JqZWN0LCBpdGVyYXRlZSwga2V5cyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uZnVuY3Rpb25zYCB3aGljaCBjcmVhdGVzIGFuIGFycmF5IG9mXG4gICAgICogYG9iamVjdGAgZnVuY3Rpb24gcHJvcGVydHkgbmFtZXMgZmlsdGVyZWQgZnJvbSB0aG9zZSBwcm92aWRlZC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHtBcnJheX0gcHJvcHMgVGhlIHByb3BlcnR5IG5hbWVzIHRvIGZpbHRlci5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBhcnJheSBvZiBmaWx0ZXJlZCBwcm9wZXJ0eSBuYW1lcy5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlRnVuY3Rpb25zKG9iamVjdCwgcHJvcHMpIHtcbiAgICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICAgIGxlbmd0aCA9IHByb3BzLmxlbmd0aCxcbiAgICAgICAgICByZXNJbmRleCA9IC0xLFxuICAgICAgICAgIHJlc3VsdCA9IFtdO1xuXG4gICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICB2YXIga2V5ID0gcHJvcHNbaW5kZXhdO1xuICAgICAgICBpZiAoaXNGdW5jdGlvbihvYmplY3Rba2V5XSkpIHtcbiAgICAgICAgICByZXN1bHRbKytyZXNJbmRleF0gPSBrZXk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYGdldGAgd2l0aG91dCBzdXBwb3J0IGZvciBzdHJpbmcgcGF0aHNcbiAgICAgKiBhbmQgZGVmYXVsdCB2YWx1ZXMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAgICAgKiBAcGFyYW0ge0FycmF5fSBwYXRoIFRoZSBwYXRoIG9mIHRoZSBwcm9wZXJ0eSB0byBnZXQuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtwYXRoS2V5XSBUaGUga2V5IHJlcHJlc2VudGF0aW9uIG9mIHBhdGguXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIHJlc29sdmVkIHZhbHVlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VHZXQob2JqZWN0LCBwYXRoLCBwYXRoS2V5KSB7XG4gICAgICBpZiAob2JqZWN0ID09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKHBhdGhLZXkgIT09IHVuZGVmaW5lZCAmJiBwYXRoS2V5IGluIHRvT2JqZWN0KG9iamVjdCkpIHtcbiAgICAgICAgcGF0aCA9IFtwYXRoS2V5XTtcbiAgICAgIH1cbiAgICAgIHZhciBpbmRleCA9IDAsXG4gICAgICAgICAgbGVuZ3RoID0gcGF0aC5sZW5ndGg7XG5cbiAgICAgIHdoaWxlIChvYmplY3QgIT0gbnVsbCAmJiBpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICBvYmplY3QgPSBvYmplY3RbcGF0aFtpbmRleCsrXV07XG4gICAgICB9XG4gICAgICByZXR1cm4gKGluZGV4ICYmIGluZGV4ID09IGxlbmd0aCkgPyBvYmplY3QgOiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uaXNFcXVhbGAgd2l0aG91dCBzdXBwb3J0IGZvciBgdGhpc2AgYmluZGluZ1xuICAgICAqIGBjdXN0b21pemVyYCBmdW5jdGlvbnMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbXBhcmUuXG4gICAgICogQHBhcmFtIHsqfSBvdGhlciBUaGUgb3RoZXIgdmFsdWUgdG8gY29tcGFyZS5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY3VzdG9taXplcl0gVGhlIGZ1bmN0aW9uIHRvIGN1c3RvbWl6ZSBjb21wYXJpbmcgdmFsdWVzLlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2lzTG9vc2VdIFNwZWNpZnkgcGVyZm9ybWluZyBwYXJ0aWFsIGNvbXBhcmlzb25zLlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IFtzdGFja0FdIFRyYWNrcyB0cmF2ZXJzZWQgYHZhbHVlYCBvYmplY3RzLlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IFtzdGFja0JdIFRyYWNrcyB0cmF2ZXJzZWQgYG90aGVyYCBvYmplY3RzLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgdmFsdWVzIGFyZSBlcXVpdmFsZW50LCBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZUlzRXF1YWwodmFsdWUsIG90aGVyLCBjdXN0b21pemVyLCBpc0xvb3NlLCBzdGFja0EsIHN0YWNrQikge1xuICAgICAgaWYgKHZhbHVlID09PSBvdGhlcikge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIGlmICh2YWx1ZSA9PSBudWxsIHx8IG90aGVyID09IG51bGwgfHwgKCFpc09iamVjdCh2YWx1ZSkgJiYgIWlzT2JqZWN0TGlrZShvdGhlcikpKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZSAhPT0gdmFsdWUgJiYgb3RoZXIgIT09IG90aGVyO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGJhc2VJc0VxdWFsRGVlcCh2YWx1ZSwgb3RoZXIsIGJhc2VJc0VxdWFsLCBjdXN0b21pemVyLCBpc0xvb3NlLCBzdGFja0EsIHN0YWNrQik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBiYXNlSXNFcXVhbGAgZm9yIGFycmF5cyBhbmQgb2JqZWN0cyB3aGljaCBwZXJmb3Jtc1xuICAgICAqIGRlZXAgY29tcGFyaXNvbnMgYW5kIHRyYWNrcyB0cmF2ZXJzZWQgb2JqZWN0cyBlbmFibGluZyBvYmplY3RzIHdpdGggY2lyY3VsYXJcbiAgICAgKiByZWZlcmVuY2VzIHRvIGJlIGNvbXBhcmVkLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gY29tcGFyZS5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb3RoZXIgVGhlIG90aGVyIG9iamVjdCB0byBjb21wYXJlLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGVxdWFsRnVuYyBUaGUgZnVuY3Rpb24gdG8gZGV0ZXJtaW5lIGVxdWl2YWxlbnRzIG9mIHZhbHVlcy5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY3VzdG9taXplcl0gVGhlIGZ1bmN0aW9uIHRvIGN1c3RvbWl6ZSBjb21wYXJpbmcgb2JqZWN0cy5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtpc0xvb3NlXSBTcGVjaWZ5IHBlcmZvcm1pbmcgcGFydGlhbCBjb21wYXJpc29ucy5cbiAgICAgKiBAcGFyYW0ge0FycmF5fSBbc3RhY2tBPVtdXSBUcmFja3MgdHJhdmVyc2VkIGB2YWx1ZWAgb2JqZWN0cy5cbiAgICAgKiBAcGFyYW0ge0FycmF5fSBbc3RhY2tCPVtdXSBUcmFja3MgdHJhdmVyc2VkIGBvdGhlcmAgb2JqZWN0cy5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIG9iamVjdHMgYXJlIGVxdWl2YWxlbnQsIGVsc2UgYGZhbHNlYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlSXNFcXVhbERlZXAob2JqZWN0LCBvdGhlciwgZXF1YWxGdW5jLCBjdXN0b21pemVyLCBpc0xvb3NlLCBzdGFja0EsIHN0YWNrQikge1xuICAgICAgdmFyIG9iaklzQXJyID0gaXNBcnJheShvYmplY3QpLFxuICAgICAgICAgIG90aElzQXJyID0gaXNBcnJheShvdGhlciksXG4gICAgICAgICAgb2JqVGFnID0gYXJyYXlUYWcsXG4gICAgICAgICAgb3RoVGFnID0gYXJyYXlUYWc7XG5cbiAgICAgIGlmICghb2JqSXNBcnIpIHtcbiAgICAgICAgb2JqVGFnID0gb2JqVG9TdHJpbmcuY2FsbChvYmplY3QpO1xuICAgICAgICBpZiAob2JqVGFnID09IGFyZ3NUYWcpIHtcbiAgICAgICAgICBvYmpUYWcgPSBvYmplY3RUYWc7XG4gICAgICAgIH0gZWxzZSBpZiAob2JqVGFnICE9IG9iamVjdFRhZykge1xuICAgICAgICAgIG9iaklzQXJyID0gaXNUeXBlZEFycmF5KG9iamVjdCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmICghb3RoSXNBcnIpIHtcbiAgICAgICAgb3RoVGFnID0gb2JqVG9TdHJpbmcuY2FsbChvdGhlcik7XG4gICAgICAgIGlmIChvdGhUYWcgPT0gYXJnc1RhZykge1xuICAgICAgICAgIG90aFRhZyA9IG9iamVjdFRhZztcbiAgICAgICAgfSBlbHNlIGlmIChvdGhUYWcgIT0gb2JqZWN0VGFnKSB7XG4gICAgICAgICAgb3RoSXNBcnIgPSBpc1R5cGVkQXJyYXkob3RoZXIpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB2YXIgb2JqSXNPYmogPSBvYmpUYWcgPT0gb2JqZWN0VGFnLFxuICAgICAgICAgIG90aElzT2JqID0gb3RoVGFnID09IG9iamVjdFRhZyxcbiAgICAgICAgICBpc1NhbWVUYWcgPSBvYmpUYWcgPT0gb3RoVGFnO1xuXG4gICAgICBpZiAoaXNTYW1lVGFnICYmICEob2JqSXNBcnIgfHwgb2JqSXNPYmopKSB7XG4gICAgICAgIHJldHVybiBlcXVhbEJ5VGFnKG9iamVjdCwgb3RoZXIsIG9ialRhZyk7XG4gICAgICB9XG4gICAgICBpZiAoIWlzTG9vc2UpIHtcbiAgICAgICAgdmFyIG9iaklzV3JhcHBlZCA9IG9iaklzT2JqICYmIGhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCAnX193cmFwcGVkX18nKSxcbiAgICAgICAgICAgIG90aElzV3JhcHBlZCA9IG90aElzT2JqICYmIGhhc093blByb3BlcnR5LmNhbGwob3RoZXIsICdfX3dyYXBwZWRfXycpO1xuXG4gICAgICAgIGlmIChvYmpJc1dyYXBwZWQgfHwgb3RoSXNXcmFwcGVkKSB7XG4gICAgICAgICAgcmV0dXJuIGVxdWFsRnVuYyhvYmpJc1dyYXBwZWQgPyBvYmplY3QudmFsdWUoKSA6IG9iamVjdCwgb3RoSXNXcmFwcGVkID8gb3RoZXIudmFsdWUoKSA6IG90aGVyLCBjdXN0b21pemVyLCBpc0xvb3NlLCBzdGFja0EsIHN0YWNrQik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmICghaXNTYW1lVGFnKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIC8vIEFzc3VtZSBjeWNsaWMgdmFsdWVzIGFyZSBlcXVhbC5cbiAgICAgIC8vIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIGRldGVjdGluZyBjaXJjdWxhciByZWZlcmVuY2VzIHNlZSBodHRwczovL2VzNS5naXRodWIuaW8vI0pPLlxuICAgICAgc3RhY2tBIHx8IChzdGFja0EgPSBbXSk7XG4gICAgICBzdGFja0IgfHwgKHN0YWNrQiA9IFtdKTtcblxuICAgICAgdmFyIGxlbmd0aCA9IHN0YWNrQS5sZW5ndGg7XG4gICAgICB3aGlsZSAobGVuZ3RoLS0pIHtcbiAgICAgICAgaWYgKHN0YWNrQVtsZW5ndGhdID09IG9iamVjdCkge1xuICAgICAgICAgIHJldHVybiBzdGFja0JbbGVuZ3RoXSA9PSBvdGhlcjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgLy8gQWRkIGBvYmplY3RgIGFuZCBgb3RoZXJgIHRvIHRoZSBzdGFjayBvZiB0cmF2ZXJzZWQgb2JqZWN0cy5cbiAgICAgIHN0YWNrQS5wdXNoKG9iamVjdCk7XG4gICAgICBzdGFja0IucHVzaChvdGhlcik7XG5cbiAgICAgIHZhciByZXN1bHQgPSAob2JqSXNBcnIgPyBlcXVhbEFycmF5cyA6IGVxdWFsT2JqZWN0cykob2JqZWN0LCBvdGhlciwgZXF1YWxGdW5jLCBjdXN0b21pemVyLCBpc0xvb3NlLCBzdGFja0EsIHN0YWNrQik7XG5cbiAgICAgIHN0YWNrQS5wb3AoKTtcbiAgICAgIHN0YWNrQi5wb3AoKTtcblxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5pc01hdGNoYCB3aXRob3V0IHN1cHBvcnQgZm9yIGNhbGxiYWNrXG4gICAgICogc2hvcnRoYW5kcyBhbmQgYHRoaXNgIGJpbmRpbmcuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IG1hdGNoRGF0YSBUaGUgcHJvcGVyeSBuYW1lcywgdmFsdWVzLCBhbmQgY29tcGFyZSBmbGFncyB0byBtYXRjaC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY3VzdG9taXplcl0gVGhlIGZ1bmN0aW9uIHRvIGN1c3RvbWl6ZSBjb21wYXJpbmcgb2JqZWN0cy5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYG9iamVjdGAgaXMgYSBtYXRjaCwgZWxzZSBgZmFsc2VgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VJc01hdGNoKG9iamVjdCwgbWF0Y2hEYXRhLCBjdXN0b21pemVyKSB7XG4gICAgICB2YXIgaW5kZXggPSBtYXRjaERhdGEubGVuZ3RoLFxuICAgICAgICAgIGxlbmd0aCA9IGluZGV4LFxuICAgICAgICAgIG5vQ3VzdG9taXplciA9ICFjdXN0b21pemVyO1xuXG4gICAgICBpZiAob2JqZWN0ID09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuICFsZW5ndGg7XG4gICAgICB9XG4gICAgICBvYmplY3QgPSB0b09iamVjdChvYmplY3QpO1xuICAgICAgd2hpbGUgKGluZGV4LS0pIHtcbiAgICAgICAgdmFyIGRhdGEgPSBtYXRjaERhdGFbaW5kZXhdO1xuICAgICAgICBpZiAoKG5vQ3VzdG9taXplciAmJiBkYXRhWzJdKVxuICAgICAgICAgICAgICA/IGRhdGFbMV0gIT09IG9iamVjdFtkYXRhWzBdXVxuICAgICAgICAgICAgICA6ICEoZGF0YVswXSBpbiBvYmplY3QpXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgIGRhdGEgPSBtYXRjaERhdGFbaW5kZXhdO1xuICAgICAgICB2YXIga2V5ID0gZGF0YVswXSxcbiAgICAgICAgICAgIG9ialZhbHVlID0gb2JqZWN0W2tleV0sXG4gICAgICAgICAgICBzcmNWYWx1ZSA9IGRhdGFbMV07XG5cbiAgICAgICAgaWYgKG5vQ3VzdG9taXplciAmJiBkYXRhWzJdKSB7XG4gICAgICAgICAgaWYgKG9ialZhbHVlID09PSB1bmRlZmluZWQgJiYgIShrZXkgaW4gb2JqZWN0KSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2YXIgcmVzdWx0ID0gY3VzdG9taXplciA/IGN1c3RvbWl6ZXIob2JqVmFsdWUsIHNyY1ZhbHVlLCBrZXkpIDogdW5kZWZpbmVkO1xuICAgICAgICAgIGlmICghKHJlc3VsdCA9PT0gdW5kZWZpbmVkID8gYmFzZUlzRXF1YWwoc3JjVmFsdWUsIG9ialZhbHVlLCBjdXN0b21pemVyLCB0cnVlKSA6IHJlc3VsdCkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLm1hcGAgd2l0aG91dCBzdXBwb3J0IGZvciBjYWxsYmFjayBzaG9ydGhhbmRzXG4gICAgICogYW5kIGB0aGlzYCBiaW5kaW5nLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdHxzdHJpbmd9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdGVlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgbWFwcGVkIGFycmF5LlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VNYXAoY29sbGVjdGlvbiwgaXRlcmF0ZWUpIHtcbiAgICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICAgIHJlc3VsdCA9IGlzQXJyYXlMaWtlKGNvbGxlY3Rpb24pID8gQXJyYXkoY29sbGVjdGlvbi5sZW5ndGgpIDogW107XG5cbiAgICAgIGJhc2VFYWNoKGNvbGxlY3Rpb24sIGZ1bmN0aW9uKHZhbHVlLCBrZXksIGNvbGxlY3Rpb24pIHtcbiAgICAgICAgcmVzdWx0WysraW5kZXhdID0gaXRlcmF0ZWUodmFsdWUsIGtleSwgY29sbGVjdGlvbik7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8ubWF0Y2hlc2Agd2hpY2ggZG9lcyBub3QgY2xvbmUgYHNvdXJjZWAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBzb3VyY2UgVGhlIG9iamVjdCBvZiBwcm9wZXJ0eSB2YWx1ZXMgdG8gbWF0Y2guXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgZnVuY3Rpb24uXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZU1hdGNoZXMoc291cmNlKSB7XG4gICAgICB2YXIgbWF0Y2hEYXRhID0gZ2V0TWF0Y2hEYXRhKHNvdXJjZSk7XG4gICAgICBpZiAobWF0Y2hEYXRhLmxlbmd0aCA9PSAxICYmIG1hdGNoRGF0YVswXVsyXSkge1xuICAgICAgICB2YXIga2V5ID0gbWF0Y2hEYXRhWzBdWzBdLFxuICAgICAgICAgICAgdmFsdWUgPSBtYXRjaERhdGFbMF1bMV07XG5cbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKG9iamVjdCkge1xuICAgICAgICAgIGlmIChvYmplY3QgPT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gb2JqZWN0W2tleV0gPT09IHZhbHVlICYmICh2YWx1ZSAhPT0gdW5kZWZpbmVkIHx8IChrZXkgaW4gdG9PYmplY3Qob2JqZWN0KSkpO1xuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgcmV0dXJuIGZ1bmN0aW9uKG9iamVjdCkge1xuICAgICAgICByZXR1cm4gYmFzZUlzTWF0Y2gob2JqZWN0LCBtYXRjaERhdGEpO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5tYXRjaGVzUHJvcGVydHlgIHdoaWNoIGRvZXMgbm90IGNsb25lIGBzcmNWYWx1ZWAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoIFRoZSBwYXRoIG9mIHRoZSBwcm9wZXJ0eSB0byBnZXQuXG4gICAgICogQHBhcmFtIHsqfSBzcmNWYWx1ZSBUaGUgdmFsdWUgdG8gY29tcGFyZS5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlTWF0Y2hlc1Byb3BlcnR5KHBhdGgsIHNyY1ZhbHVlKSB7XG4gICAgICB2YXIgaXNBcnIgPSBpc0FycmF5KHBhdGgpLFxuICAgICAgICAgIGlzQ29tbW9uID0gaXNLZXkocGF0aCkgJiYgaXNTdHJpY3RDb21wYXJhYmxlKHNyY1ZhbHVlKSxcbiAgICAgICAgICBwYXRoS2V5ID0gKHBhdGggKyAnJyk7XG5cbiAgICAgIHBhdGggPSB0b1BhdGgocGF0aCk7XG4gICAgICByZXR1cm4gZnVuY3Rpb24ob2JqZWN0KSB7XG4gICAgICAgIGlmIChvYmplY3QgPT0gbnVsbCkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICB2YXIga2V5ID0gcGF0aEtleTtcbiAgICAgICAgb2JqZWN0ID0gdG9PYmplY3Qob2JqZWN0KTtcbiAgICAgICAgaWYgKChpc0FyciB8fCAhaXNDb21tb24pICYmICEoa2V5IGluIG9iamVjdCkpIHtcbiAgICAgICAgICBvYmplY3QgPSBwYXRoLmxlbmd0aCA9PSAxID8gb2JqZWN0IDogYmFzZUdldChvYmplY3QsIGJhc2VTbGljZShwYXRoLCAwLCAtMSkpO1xuICAgICAgICAgIGlmIChvYmplY3QgPT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBrZXkgPSBsYXN0KHBhdGgpO1xuICAgICAgICAgIG9iamVjdCA9IHRvT2JqZWN0KG9iamVjdCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG9iamVjdFtrZXldID09PSBzcmNWYWx1ZVxuICAgICAgICAgID8gKHNyY1ZhbHVlICE9PSB1bmRlZmluZWQgfHwgKGtleSBpbiBvYmplY3QpKVxuICAgICAgICAgIDogYmFzZUlzRXF1YWwoc3JjVmFsdWUsIG9iamVjdFtrZXldLCB1bmRlZmluZWQsIHRydWUpO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5tZXJnZWAgd2l0aG91dCBzdXBwb3J0IGZvciBhcmd1bWVudCBqdWdnbGluZyxcbiAgICAgKiBtdWx0aXBsZSBzb3VyY2VzLCBhbmQgYHRoaXNgIGJpbmRpbmcgYGN1c3RvbWl6ZXJgIGZ1bmN0aW9ucy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgZGVzdGluYXRpb24gb2JqZWN0LlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBzb3VyY2UgVGhlIHNvdXJjZSBvYmplY3QuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2N1c3RvbWl6ZXJdIFRoZSBmdW5jdGlvbiB0byBjdXN0b21pemUgbWVyZ2VkIHZhbHVlcy5cbiAgICAgKiBAcGFyYW0ge0FycmF5fSBbc3RhY2tBPVtdXSBUcmFja3MgdHJhdmVyc2VkIHNvdXJjZSBvYmplY3RzLlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IFtzdGFja0I9W11dIEFzc29jaWF0ZXMgdmFsdWVzIHdpdGggc291cmNlIGNvdW50ZXJwYXJ0cy5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGBvYmplY3RgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VNZXJnZShvYmplY3QsIHNvdXJjZSwgY3VzdG9taXplciwgc3RhY2tBLCBzdGFja0IpIHtcbiAgICAgIGlmICghaXNPYmplY3Qob2JqZWN0KSkge1xuICAgICAgICByZXR1cm4gb2JqZWN0O1xuICAgICAgfVxuICAgICAgdmFyIGlzU3JjQXJyID0gaXNBcnJheUxpa2Uoc291cmNlKSAmJiAoaXNBcnJheShzb3VyY2UpIHx8IGlzVHlwZWRBcnJheShzb3VyY2UpKSxcbiAgICAgICAgICBwcm9wcyA9IGlzU3JjQXJyID8gdW5kZWZpbmVkIDoga2V5cyhzb3VyY2UpO1xuXG4gICAgICBhcnJheUVhY2gocHJvcHMgfHwgc291cmNlLCBmdW5jdGlvbihzcmNWYWx1ZSwga2V5KSB7XG4gICAgICAgIGlmIChwcm9wcykge1xuICAgICAgICAgIGtleSA9IHNyY1ZhbHVlO1xuICAgICAgICAgIHNyY1ZhbHVlID0gc291cmNlW2tleV07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlzT2JqZWN0TGlrZShzcmNWYWx1ZSkpIHtcbiAgICAgICAgICBzdGFja0EgfHwgKHN0YWNrQSA9IFtdKTtcbiAgICAgICAgICBzdGFja0IgfHwgKHN0YWNrQiA9IFtdKTtcbiAgICAgICAgICBiYXNlTWVyZ2VEZWVwKG9iamVjdCwgc291cmNlLCBrZXksIGJhc2VNZXJnZSwgY3VzdG9taXplciwgc3RhY2tBLCBzdGFja0IpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgIHZhciB2YWx1ZSA9IG9iamVjdFtrZXldLFxuICAgICAgICAgICAgICByZXN1bHQgPSBjdXN0b21pemVyID8gY3VzdG9taXplcih2YWx1ZSwgc3JjVmFsdWUsIGtleSwgb2JqZWN0LCBzb3VyY2UpIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICBpc0NvbW1vbiA9IHJlc3VsdCA9PT0gdW5kZWZpbmVkO1xuXG4gICAgICAgICAgaWYgKGlzQ29tbW9uKSB7XG4gICAgICAgICAgICByZXN1bHQgPSBzcmNWYWx1ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKChyZXN1bHQgIT09IHVuZGVmaW5lZCB8fCAoaXNTcmNBcnIgJiYgIShrZXkgaW4gb2JqZWN0KSkpICYmXG4gICAgICAgICAgICAgIChpc0NvbW1vbiB8fCAocmVzdWx0ID09PSByZXN1bHQgPyAocmVzdWx0ICE9PSB2YWx1ZSkgOiAodmFsdWUgPT09IHZhbHVlKSkpKSB7XG4gICAgICAgICAgICBvYmplY3Rba2V5XSA9IHJlc3VsdDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIG9iamVjdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYGJhc2VNZXJnZWAgZm9yIGFycmF5cyBhbmQgb2JqZWN0cyB3aGljaCBwZXJmb3Jtc1xuICAgICAqIGRlZXAgbWVyZ2VzIGFuZCB0cmFja3MgdHJhdmVyc2VkIG9iamVjdHMgZW5hYmxpbmcgb2JqZWN0cyB3aXRoIGNpcmN1bGFyXG4gICAgICogcmVmZXJlbmNlcyB0byBiZSBtZXJnZWQuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIGRlc3RpbmF0aW9uIG9iamVjdC5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gc291cmNlIFRoZSBzb3VyY2Ugb2JqZWN0LlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgdmFsdWUgdG8gbWVyZ2UuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gbWVyZ2VGdW5jIFRoZSBmdW5jdGlvbiB0byBtZXJnZSB2YWx1ZXMuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2N1c3RvbWl6ZXJdIFRoZSBmdW5jdGlvbiB0byBjdXN0b21pemUgbWVyZ2VkIHZhbHVlcy5cbiAgICAgKiBAcGFyYW0ge0FycmF5fSBbc3RhY2tBPVtdXSBUcmFja3MgdHJhdmVyc2VkIHNvdXJjZSBvYmplY3RzLlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IFtzdGFja0I9W11dIEFzc29jaWF0ZXMgdmFsdWVzIHdpdGggc291cmNlIGNvdW50ZXJwYXJ0cy5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIG9iamVjdHMgYXJlIGVxdWl2YWxlbnQsIGVsc2UgYGZhbHNlYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlTWVyZ2VEZWVwKG9iamVjdCwgc291cmNlLCBrZXksIG1lcmdlRnVuYywgY3VzdG9taXplciwgc3RhY2tBLCBzdGFja0IpIHtcbiAgICAgIHZhciBsZW5ndGggPSBzdGFja0EubGVuZ3RoLFxuICAgICAgICAgIHNyY1ZhbHVlID0gc291cmNlW2tleV07XG5cbiAgICAgIHdoaWxlIChsZW5ndGgtLSkge1xuICAgICAgICBpZiAoc3RhY2tBW2xlbmd0aF0gPT0gc3JjVmFsdWUpIHtcbiAgICAgICAgICBvYmplY3Rba2V5XSA9IHN0YWNrQltsZW5ndGhdO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdmFyIHZhbHVlID0gb2JqZWN0W2tleV0sXG4gICAgICAgICAgcmVzdWx0ID0gY3VzdG9taXplciA/IGN1c3RvbWl6ZXIodmFsdWUsIHNyY1ZhbHVlLCBrZXksIG9iamVjdCwgc291cmNlKSA6IHVuZGVmaW5lZCxcbiAgICAgICAgICBpc0NvbW1vbiA9IHJlc3VsdCA9PT0gdW5kZWZpbmVkO1xuXG4gICAgICBpZiAoaXNDb21tb24pIHtcbiAgICAgICAgcmVzdWx0ID0gc3JjVmFsdWU7XG4gICAgICAgIGlmIChpc0FycmF5TGlrZShzcmNWYWx1ZSkgJiYgKGlzQXJyYXkoc3JjVmFsdWUpIHx8IGlzVHlwZWRBcnJheShzcmNWYWx1ZSkpKSB7XG4gICAgICAgICAgcmVzdWx0ID0gaXNBcnJheSh2YWx1ZSlcbiAgICAgICAgICAgID8gdmFsdWVcbiAgICAgICAgICAgIDogKGlzQXJyYXlMaWtlKHZhbHVlKSA/IGFycmF5Q29weSh2YWx1ZSkgOiBbXSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoaXNQbGFpbk9iamVjdChzcmNWYWx1ZSkgfHwgaXNBcmd1bWVudHMoc3JjVmFsdWUpKSB7XG4gICAgICAgICAgcmVzdWx0ID0gaXNBcmd1bWVudHModmFsdWUpXG4gICAgICAgICAgICA/IHRvUGxhaW5PYmplY3QodmFsdWUpXG4gICAgICAgICAgICA6IChpc1BsYWluT2JqZWN0KHZhbHVlKSA/IHZhbHVlIDoge30pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgIGlzQ29tbW9uID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vIEFkZCB0aGUgc291cmNlIHZhbHVlIHRvIHRoZSBzdGFjayBvZiB0cmF2ZXJzZWQgb2JqZWN0cyBhbmQgYXNzb2NpYXRlXG4gICAgICAvLyBpdCB3aXRoIGl0cyBtZXJnZWQgdmFsdWUuXG4gICAgICBzdGFja0EucHVzaChzcmNWYWx1ZSk7XG4gICAgICBzdGFja0IucHVzaChyZXN1bHQpO1xuXG4gICAgICBpZiAoaXNDb21tb24pIHtcbiAgICAgICAgLy8gUmVjdXJzaXZlbHkgbWVyZ2Ugb2JqZWN0cyBhbmQgYXJyYXlzIChzdXNjZXB0aWJsZSB0byBjYWxsIHN0YWNrIGxpbWl0cykuXG4gICAgICAgIG9iamVjdFtrZXldID0gbWVyZ2VGdW5jKHJlc3VsdCwgc3JjVmFsdWUsIGN1c3RvbWl6ZXIsIHN0YWNrQSwgc3RhY2tCKTtcbiAgICAgIH0gZWxzZSBpZiAocmVzdWx0ID09PSByZXN1bHQgPyAocmVzdWx0ICE9PSB2YWx1ZSkgOiAodmFsdWUgPT09IHZhbHVlKSkge1xuICAgICAgICBvYmplY3Rba2V5XSA9IHJlc3VsdDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5wcm9wZXJ0eWAgd2l0aG91dCBzdXBwb3J0IGZvciBkZWVwIHBhdGhzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHByb3BlcnR5IHRvIGdldC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlUHJvcGVydHkoa2V5KSB7XG4gICAgICByZXR1cm4gZnVuY3Rpb24ob2JqZWN0KSB7XG4gICAgICAgIHJldHVybiBvYmplY3QgPT0gbnVsbCA/IHVuZGVmaW5lZCA6IG9iamVjdFtrZXldO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYGJhc2VQcm9wZXJ0eWAgd2hpY2ggc3VwcG9ydHMgZGVlcCBwYXRocy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheXxzdHJpbmd9IHBhdGggVGhlIHBhdGggb2YgdGhlIHByb3BlcnR5IHRvIGdldC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlUHJvcGVydHlEZWVwKHBhdGgpIHtcbiAgICAgIHZhciBwYXRoS2V5ID0gKHBhdGggKyAnJyk7XG4gICAgICBwYXRoID0gdG9QYXRoKHBhdGgpO1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uKG9iamVjdCkge1xuICAgICAgICByZXR1cm4gYmFzZUdldChvYmplY3QsIHBhdGgsIHBhdGhLZXkpO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5wdWxsQXRgIHdpdGhvdXQgc3VwcG9ydCBmb3IgaW5kaXZpZHVhbFxuICAgICAqIGluZGV4IGFyZ3VtZW50cyBhbmQgY2FwdHVyaW5nIHRoZSByZW1vdmVkIGVsZW1lbnRzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gbW9kaWZ5LlxuICAgICAqIEBwYXJhbSB7bnVtYmVyW119IGluZGV4ZXMgVGhlIGluZGV4ZXMgb2YgZWxlbWVudHMgdG8gcmVtb3ZlLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyBgYXJyYXlgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VQdWxsQXQoYXJyYXksIGluZGV4ZXMpIHtcbiAgICAgIHZhciBsZW5ndGggPSBhcnJheSA/IGluZGV4ZXMubGVuZ3RoIDogMDtcbiAgICAgIHdoaWxlIChsZW5ndGgtLSkge1xuICAgICAgICB2YXIgaW5kZXggPSBpbmRleGVzW2xlbmd0aF07XG4gICAgICAgIGlmIChpbmRleCAhPSBwcmV2aW91cyAmJiBpc0luZGV4KGluZGV4KSkge1xuICAgICAgICAgIHZhciBwcmV2aW91cyA9IGluZGV4O1xuICAgICAgICAgIHNwbGljZS5jYWxsKGFycmF5LCBpbmRleCwgMSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBhcnJheTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5yYW5kb21gIHdpdGhvdXQgc3VwcG9ydCBmb3IgYXJndW1lbnQganVnZ2xpbmdcbiAgICAgKiBhbmQgcmV0dXJuaW5nIGZsb2F0aW5nLXBvaW50IG51bWJlcnMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBtaW4gVGhlIG1pbmltdW0gcG9zc2libGUgdmFsdWUuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IG1heCBUaGUgbWF4aW11bSBwb3NzaWJsZSB2YWx1ZS5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSByYW5kb20gbnVtYmVyLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VSYW5kb20obWluLCBtYXgpIHtcbiAgICAgIHJldHVybiBtaW4gKyBuYXRpdmVGbG9vcihuYXRpdmVSYW5kb20oKSAqIChtYXggLSBtaW4gKyAxKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8ucmVkdWNlYCBhbmQgYF8ucmVkdWNlUmlnaHRgIHdpdGhvdXQgc3VwcG9ydFxuICAgICAqIGZvciBjYWxsYmFjayBzaG9ydGhhbmRzIGFuZCBgdGhpc2AgYmluZGluZywgd2hpY2ggaXRlcmF0ZXMgb3ZlciBgY29sbGVjdGlvbmBcbiAgICAgKiB1c2luZyB0aGUgcHJvdmlkZWQgYGVhY2hGdW5jYC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R8c3RyaW5nfSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBpdGVyYXRlZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEBwYXJhbSB7Kn0gYWNjdW11bGF0b3IgVGhlIGluaXRpYWwgdmFsdWUuXG4gICAgICogQHBhcmFtIHtib29sZWFufSBpbml0RnJvbUNvbGxlY3Rpb24gU3BlY2lmeSB1c2luZyB0aGUgZmlyc3Qgb3IgbGFzdCBlbGVtZW50XG4gICAgICogIG9mIGBjb2xsZWN0aW9uYCBhcyB0aGUgaW5pdGlhbCB2YWx1ZS5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBlYWNoRnVuYyBUaGUgZnVuY3Rpb24gdG8gaXRlcmF0ZSBvdmVyIGBjb2xsZWN0aW9uYC5cbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgYWNjdW11bGF0ZWQgdmFsdWUuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZVJlZHVjZShjb2xsZWN0aW9uLCBpdGVyYXRlZSwgYWNjdW11bGF0b3IsIGluaXRGcm9tQ29sbGVjdGlvbiwgZWFjaEZ1bmMpIHtcbiAgICAgIGVhY2hGdW5jKGNvbGxlY3Rpb24sIGZ1bmN0aW9uKHZhbHVlLCBpbmRleCwgY29sbGVjdGlvbikge1xuICAgICAgICBhY2N1bXVsYXRvciA9IGluaXRGcm9tQ29sbGVjdGlvblxuICAgICAgICAgID8gKGluaXRGcm9tQ29sbGVjdGlvbiA9IGZhbHNlLCB2YWx1ZSlcbiAgICAgICAgICA6IGl0ZXJhdGVlKGFjY3VtdWxhdG9yLCB2YWx1ZSwgaW5kZXgsIGNvbGxlY3Rpb24pO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gYWNjdW11bGF0b3I7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYHNldERhdGFgIHdpdGhvdXQgc3VwcG9ydCBmb3IgaG90IGxvb3AgZGV0ZWN0aW9uLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBhc3NvY2lhdGUgbWV0YWRhdGEgd2l0aC5cbiAgICAgKiBAcGFyYW0geyp9IGRhdGEgVGhlIG1ldGFkYXRhLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyBgZnVuY2AuXG4gICAgICovXG4gICAgdmFyIGJhc2VTZXREYXRhID0gIW1ldGFNYXAgPyBpZGVudGl0eSA6IGZ1bmN0aW9uKGZ1bmMsIGRhdGEpIHtcbiAgICAgIG1ldGFNYXAuc2V0KGZ1bmMsIGRhdGEpO1xuICAgICAgcmV0dXJuIGZ1bmM7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnNsaWNlYCB3aXRob3V0IGFuIGl0ZXJhdGVlIGNhbGwgZ3VhcmQuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBzbGljZS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3N0YXJ0PTBdIFRoZSBzdGFydCBwb3NpdGlvbi5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW2VuZD1hcnJheS5sZW5ndGhdIFRoZSBlbmQgcG9zaXRpb24uXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBzbGljZSBvZiBgYXJyYXlgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VTbGljZShhcnJheSwgc3RhcnQsIGVuZCkge1xuICAgICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgICAgbGVuZ3RoID0gYXJyYXkubGVuZ3RoO1xuXG4gICAgICBzdGFydCA9IHN0YXJ0ID09IG51bGwgPyAwIDogKCtzdGFydCB8fCAwKTtcbiAgICAgIGlmIChzdGFydCA8IDApIHtcbiAgICAgICAgc3RhcnQgPSAtc3RhcnQgPiBsZW5ndGggPyAwIDogKGxlbmd0aCArIHN0YXJ0KTtcbiAgICAgIH1cbiAgICAgIGVuZCA9IChlbmQgPT09IHVuZGVmaW5lZCB8fCBlbmQgPiBsZW5ndGgpID8gbGVuZ3RoIDogKCtlbmQgfHwgMCk7XG4gICAgICBpZiAoZW5kIDwgMCkge1xuICAgICAgICBlbmQgKz0gbGVuZ3RoO1xuICAgICAgfVxuICAgICAgbGVuZ3RoID0gc3RhcnQgPiBlbmQgPyAwIDogKChlbmQgLSBzdGFydCkgPj4+IDApO1xuICAgICAgc3RhcnQgPj4+PSAwO1xuXG4gICAgICB2YXIgcmVzdWx0ID0gQXJyYXkobGVuZ3RoKTtcbiAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgIHJlc3VsdFtpbmRleF0gPSBhcnJheVtpbmRleCArIHN0YXJ0XTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uc29tZWAgd2l0aG91dCBzdXBwb3J0IGZvciBjYWxsYmFjayBzaG9ydGhhbmRzXG4gICAgICogYW5kIGB0aGlzYCBiaW5kaW5nLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdHxzdHJpbmd9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IHByZWRpY2F0ZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBhbnkgZWxlbWVudCBwYXNzZXMgdGhlIHByZWRpY2F0ZSBjaGVjayxcbiAgICAgKiAgZWxzZSBgZmFsc2VgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VTb21lKGNvbGxlY3Rpb24sIHByZWRpY2F0ZSkge1xuICAgICAgdmFyIHJlc3VsdDtcblxuICAgICAgYmFzZUVhY2goY29sbGVjdGlvbiwgZnVuY3Rpb24odmFsdWUsIGluZGV4LCBjb2xsZWN0aW9uKSB7XG4gICAgICAgIHJlc3VsdCA9IHByZWRpY2F0ZSh2YWx1ZSwgaW5kZXgsIGNvbGxlY3Rpb24pO1xuICAgICAgICByZXR1cm4gIXJlc3VsdDtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuICEhcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnNvcnRCeWAgd2hpY2ggdXNlcyBgY29tcGFyZXJgIHRvIGRlZmluZVxuICAgICAqIHRoZSBzb3J0IG9yZGVyIG9mIGBhcnJheWAgYW5kIHJlcGxhY2VzIGNyaXRlcmlhIG9iamVjdHMgd2l0aCB0aGVpclxuICAgICAqIGNvcnJlc3BvbmRpbmcgdmFsdWVzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gc29ydC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjb21wYXJlciBUaGUgZnVuY3Rpb24gdG8gZGVmaW5lIHNvcnQgb3JkZXIuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIGBhcnJheWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZVNvcnRCeShhcnJheSwgY29tcGFyZXIpIHtcbiAgICAgIHZhciBsZW5ndGggPSBhcnJheS5sZW5ndGg7XG5cbiAgICAgIGFycmF5LnNvcnQoY29tcGFyZXIpO1xuICAgICAgd2hpbGUgKGxlbmd0aC0tKSB7XG4gICAgICAgIGFycmF5W2xlbmd0aF0gPSBhcnJheVtsZW5ndGhdLnZhbHVlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGFycmF5O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnNvcnRCeU9yZGVyYCB3aXRob3V0IHBhcmFtIGd1YXJkcy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R8c3RyaW5nfSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9uW118T2JqZWN0W118c3RyaW5nW119IGl0ZXJhdGVlcyBUaGUgaXRlcmF0ZWVzIHRvIHNvcnQgYnkuXG4gICAgICogQHBhcmFtIHtib29sZWFuW119IG9yZGVycyBUaGUgc29ydCBvcmRlcnMgb2YgYGl0ZXJhdGVlc2AuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgc29ydGVkIGFycmF5LlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VTb3J0QnlPcmRlcihjb2xsZWN0aW9uLCBpdGVyYXRlZXMsIG9yZGVycykge1xuICAgICAgdmFyIGNhbGxiYWNrID0gZ2V0Q2FsbGJhY2soKSxcbiAgICAgICAgICBpbmRleCA9IC0xO1xuXG4gICAgICBpdGVyYXRlZXMgPSBhcnJheU1hcChpdGVyYXRlZXMsIGZ1bmN0aW9uKGl0ZXJhdGVlKSB7IHJldHVybiBjYWxsYmFjayhpdGVyYXRlZSk7IH0pO1xuXG4gICAgICB2YXIgcmVzdWx0ID0gYmFzZU1hcChjb2xsZWN0aW9uLCBmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgICB2YXIgY3JpdGVyaWEgPSBhcnJheU1hcChpdGVyYXRlZXMsIGZ1bmN0aW9uKGl0ZXJhdGVlKSB7IHJldHVybiBpdGVyYXRlZSh2YWx1ZSk7IH0pO1xuICAgICAgICByZXR1cm4geyAnY3JpdGVyaWEnOiBjcml0ZXJpYSwgJ2luZGV4JzogKytpbmRleCwgJ3ZhbHVlJzogdmFsdWUgfTtcbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gYmFzZVNvcnRCeShyZXN1bHQsIGZ1bmN0aW9uKG9iamVjdCwgb3RoZXIpIHtcbiAgICAgICAgcmV0dXJuIGNvbXBhcmVNdWx0aXBsZShvYmplY3QsIG90aGVyLCBvcmRlcnMpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uc3VtYCB3aXRob3V0IHN1cHBvcnQgZm9yIGNhbGxiYWNrIHNob3J0aGFuZHNcbiAgICAgKiBhbmQgYHRoaXNgIGJpbmRpbmcuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fHN0cmluZ30gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gaXRlcmF0ZWUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBzdW0uXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZVN1bShjb2xsZWN0aW9uLCBpdGVyYXRlZSkge1xuICAgICAgdmFyIHJlc3VsdCA9IDA7XG4gICAgICBiYXNlRWFjaChjb2xsZWN0aW9uLCBmdW5jdGlvbih2YWx1ZSwgaW5kZXgsIGNvbGxlY3Rpb24pIHtcbiAgICAgICAgcmVzdWx0ICs9ICtpdGVyYXRlZSh2YWx1ZSwgaW5kZXgsIGNvbGxlY3Rpb24pIHx8IDA7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8udW5pcWAgd2l0aG91dCBzdXBwb3J0IGZvciBjYWxsYmFjayBzaG9ydGhhbmRzXG4gICAgICogYW5kIGB0aGlzYCBiaW5kaW5nLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWVdIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgZHVwbGljYXRlLXZhbHVlLWZyZWUgYXJyYXkuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZVVuaXEoYXJyYXksIGl0ZXJhdGVlKSB7XG4gICAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgICBpbmRleE9mID0gZ2V0SW5kZXhPZigpLFxuICAgICAgICAgIGxlbmd0aCA9IGFycmF5Lmxlbmd0aCxcbiAgICAgICAgICBpc0NvbW1vbiA9IGluZGV4T2YgPT0gYmFzZUluZGV4T2YsXG4gICAgICAgICAgaXNMYXJnZSA9IGlzQ29tbW9uICYmIGxlbmd0aCA+PSBMQVJHRV9BUlJBWV9TSVpFLFxuICAgICAgICAgIHNlZW4gPSBpc0xhcmdlID8gY3JlYXRlQ2FjaGUoKSA6IG51bGwsXG4gICAgICAgICAgcmVzdWx0ID0gW107XG5cbiAgICAgIGlmIChzZWVuKSB7XG4gICAgICAgIGluZGV4T2YgPSBjYWNoZUluZGV4T2Y7XG4gICAgICAgIGlzQ29tbW9uID0gZmFsc2U7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpc0xhcmdlID0gZmFsc2U7XG4gICAgICAgIHNlZW4gPSBpdGVyYXRlZSA/IFtdIDogcmVzdWx0O1xuICAgICAgfVxuICAgICAgb3V0ZXI6XG4gICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICB2YXIgdmFsdWUgPSBhcnJheVtpbmRleF0sXG4gICAgICAgICAgICBjb21wdXRlZCA9IGl0ZXJhdGVlID8gaXRlcmF0ZWUodmFsdWUsIGluZGV4LCBhcnJheSkgOiB2YWx1ZTtcblxuICAgICAgICBpZiAoaXNDb21tb24gJiYgdmFsdWUgPT09IHZhbHVlKSB7XG4gICAgICAgICAgdmFyIHNlZW5JbmRleCA9IHNlZW4ubGVuZ3RoO1xuICAgICAgICAgIHdoaWxlIChzZWVuSW5kZXgtLSkge1xuICAgICAgICAgICAgaWYgKHNlZW5bc2VlbkluZGV4XSA9PT0gY29tcHV0ZWQpIHtcbiAgICAgICAgICAgICAgY29udGludWUgb3V0ZXI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChpdGVyYXRlZSkge1xuICAgICAgICAgICAgc2Vlbi5wdXNoKGNvbXB1dGVkKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmVzdWx0LnB1c2godmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGluZGV4T2Yoc2VlbiwgY29tcHV0ZWQsIDApIDwgMCkge1xuICAgICAgICAgIGlmIChpdGVyYXRlZSB8fCBpc0xhcmdlKSB7XG4gICAgICAgICAgICBzZWVuLnB1c2goY29tcHV0ZWQpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXN1bHQucHVzaCh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8udmFsdWVzYCBhbmQgYF8udmFsdWVzSW5gIHdoaWNoIGNyZWF0ZXMgYW5cbiAgICAgKiBhcnJheSBvZiBgb2JqZWN0YCBwcm9wZXJ0eSB2YWx1ZXMgY29ycmVzcG9uZGluZyB0byB0aGUgcHJvcGVydHkgbmFtZXNcbiAgICAgKiBvZiBgcHJvcHNgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gICAgICogQHBhcmFtIHtBcnJheX0gcHJvcHMgVGhlIHByb3BlcnR5IG5hbWVzIHRvIGdldCB2YWx1ZXMgZm9yLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIGFycmF5IG9mIHByb3BlcnR5IHZhbHVlcy5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlVmFsdWVzKG9iamVjdCwgcHJvcHMpIHtcbiAgICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICAgIGxlbmd0aCA9IHByb3BzLmxlbmd0aCxcbiAgICAgICAgICByZXN1bHQgPSBBcnJheShsZW5ndGgpO1xuXG4gICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICByZXN1bHRbaW5kZXhdID0gb2JqZWN0W3Byb3BzW2luZGV4XV07XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmRyb3BSaWdodFdoaWxlYCwgYF8uZHJvcFdoaWxlYCwgYF8udGFrZVJpZ2h0V2hpbGVgLFxuICAgICAqIGFuZCBgXy50YWtlV2hpbGVgIHdpdGhvdXQgc3VwcG9ydCBmb3IgY2FsbGJhY2sgc2hvcnRoYW5kcyBhbmQgYHRoaXNgIGJpbmRpbmcuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBxdWVyeS5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBwcmVkaWNhdGUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtpc0Ryb3BdIFNwZWNpZnkgZHJvcHBpbmcgZWxlbWVudHMgaW5zdGVhZCBvZiB0YWtpbmcgdGhlbS5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtmcm9tUmlnaHRdIFNwZWNpZnkgaXRlcmF0aW5nIGZyb20gcmlnaHQgdG8gbGVmdC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIHNsaWNlIG9mIGBhcnJheWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZVdoaWxlKGFycmF5LCBwcmVkaWNhdGUsIGlzRHJvcCwgZnJvbVJpZ2h0KSB7XG4gICAgICB2YXIgbGVuZ3RoID0gYXJyYXkubGVuZ3RoLFxuICAgICAgICAgIGluZGV4ID0gZnJvbVJpZ2h0ID8gbGVuZ3RoIDogLTE7XG5cbiAgICAgIHdoaWxlICgoZnJvbVJpZ2h0ID8gaW5kZXgtLSA6ICsraW5kZXggPCBsZW5ndGgpICYmIHByZWRpY2F0ZShhcnJheVtpbmRleF0sIGluZGV4LCBhcnJheSkpIHt9XG4gICAgICByZXR1cm4gaXNEcm9wXG4gICAgICAgID8gYmFzZVNsaWNlKGFycmF5LCAoZnJvbVJpZ2h0ID8gMCA6IGluZGV4KSwgKGZyb21SaWdodCA/IGluZGV4ICsgMSA6IGxlbmd0aCkpXG4gICAgICAgIDogYmFzZVNsaWNlKGFycmF5LCAoZnJvbVJpZ2h0ID8gaW5kZXggKyAxIDogMCksIChmcm9tUmlnaHQgPyBsZW5ndGggOiBpbmRleCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGB3cmFwcGVyVmFsdWVgIHdoaWNoIHJldHVybnMgdGhlIHJlc3VsdCBvZlxuICAgICAqIHBlcmZvcm1pbmcgYSBzZXF1ZW5jZSBvZiBhY3Rpb25zIG9uIHRoZSB1bndyYXBwZWQgYHZhbHVlYCwgd2hlcmUgZWFjaFxuICAgICAqIHN1Y2Nlc3NpdmUgYWN0aW9uIGlzIHN1cHBsaWVkIHRoZSByZXR1cm4gdmFsdWUgb2YgdGhlIHByZXZpb3VzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB1bndyYXBwZWQgdmFsdWUuXG4gICAgICogQHBhcmFtIHtBcnJheX0gYWN0aW9ucyBBY3Rpb25zIHRvIHBlZm9ybSB0byByZXNvbHZlIHRoZSB1bndyYXBwZWQgdmFsdWUuXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIHJlc29sdmVkIHZhbHVlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VXcmFwcGVyVmFsdWUodmFsdWUsIGFjdGlvbnMpIHtcbiAgICAgIHZhciByZXN1bHQgPSB2YWx1ZTtcbiAgICAgIGlmIChyZXN1bHQgaW5zdGFuY2VvZiBMYXp5V3JhcHBlcikge1xuICAgICAgICByZXN1bHQgPSByZXN1bHQudmFsdWUoKTtcbiAgICAgIH1cbiAgICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICAgIGxlbmd0aCA9IGFjdGlvbnMubGVuZ3RoO1xuXG4gICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICB2YXIgYWN0aW9uID0gYWN0aW9uc1tpbmRleF07XG4gICAgICAgIHJlc3VsdCA9IGFjdGlvbi5mdW5jLmFwcGx5KGFjdGlvbi50aGlzQXJnLCBhcnJheVB1c2goW3Jlc3VsdF0sIGFjdGlvbi5hcmdzKSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFBlcmZvcm1zIGEgYmluYXJ5IHNlYXJjaCBvZiBgYXJyYXlgIHRvIGRldGVybWluZSB0aGUgaW5kZXggYXQgd2hpY2ggYHZhbHVlYFxuICAgICAqIHNob3VsZCBiZSBpbnNlcnRlZCBpbnRvIGBhcnJheWAgaW4gb3JkZXIgdG8gbWFpbnRhaW4gaXRzIHNvcnQgb3JkZXIuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBzb3J0ZWQgYXJyYXkgdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBldmFsdWF0ZS5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtyZXRIaWdoZXN0XSBTcGVjaWZ5IHJldHVybmluZyB0aGUgaGlnaGVzdCBxdWFsaWZpZWQgaW5kZXguXG4gICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgaW5kZXggYXQgd2hpY2ggYHZhbHVlYCBzaG91bGQgYmUgaW5zZXJ0ZWRcbiAgICAgKiAgaW50byBgYXJyYXlgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJpbmFyeUluZGV4KGFycmF5LCB2YWx1ZSwgcmV0SGlnaGVzdCkge1xuICAgICAgdmFyIGxvdyA9IDAsXG4gICAgICAgICAgaGlnaCA9IGFycmF5ID8gYXJyYXkubGVuZ3RoIDogbG93O1xuXG4gICAgICBpZiAodHlwZW9mIHZhbHVlID09ICdudW1iZXInICYmIHZhbHVlID09PSB2YWx1ZSAmJiBoaWdoIDw9IEhBTEZfTUFYX0FSUkFZX0xFTkdUSCkge1xuICAgICAgICB3aGlsZSAobG93IDwgaGlnaCkge1xuICAgICAgICAgIHZhciBtaWQgPSAobG93ICsgaGlnaCkgPj4+IDEsXG4gICAgICAgICAgICAgIGNvbXB1dGVkID0gYXJyYXlbbWlkXTtcblxuICAgICAgICAgIGlmICgocmV0SGlnaGVzdCA/IChjb21wdXRlZCA8PSB2YWx1ZSkgOiAoY29tcHV0ZWQgPCB2YWx1ZSkpICYmIGNvbXB1dGVkICE9PSBudWxsKSB7XG4gICAgICAgICAgICBsb3cgPSBtaWQgKyAxO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBoaWdoID0gbWlkO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaGlnaDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBiaW5hcnlJbmRleEJ5KGFycmF5LCB2YWx1ZSwgaWRlbnRpdHksIHJldEhpZ2hlc3QpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgZnVuY3Rpb24gaXMgbGlrZSBgYmluYXJ5SW5kZXhgIGV4Y2VwdCB0aGF0IGl0IGludm9rZXMgYGl0ZXJhdGVlYCBmb3JcbiAgICAgKiBgdmFsdWVgIGFuZCBlYWNoIGVsZW1lbnQgb2YgYGFycmF5YCB0byBjb21wdXRlIHRoZWlyIHNvcnQgcmFua2luZy4gVGhlXG4gICAgICogaXRlcmF0ZWUgaXMgaW52b2tlZCB3aXRoIG9uZSBhcmd1bWVudDsgKHZhbHVlKS5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIHNvcnRlZCBhcnJheSB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGV2YWx1YXRlLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdGVlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbcmV0SGlnaGVzdF0gU3BlY2lmeSByZXR1cm5pbmcgdGhlIGhpZ2hlc3QgcXVhbGlmaWVkIGluZGV4LlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGluZGV4IGF0IHdoaWNoIGB2YWx1ZWAgc2hvdWxkIGJlIGluc2VydGVkXG4gICAgICogIGludG8gYGFycmF5YC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiaW5hcnlJbmRleEJ5KGFycmF5LCB2YWx1ZSwgaXRlcmF0ZWUsIHJldEhpZ2hlc3QpIHtcbiAgICAgIHZhbHVlID0gaXRlcmF0ZWUodmFsdWUpO1xuXG4gICAgICB2YXIgbG93ID0gMCxcbiAgICAgICAgICBoaWdoID0gYXJyYXkgPyBhcnJheS5sZW5ndGggOiAwLFxuICAgICAgICAgIHZhbElzTmFOID0gdmFsdWUgIT09IHZhbHVlLFxuICAgICAgICAgIHZhbElzTnVsbCA9IHZhbHVlID09PSBudWxsLFxuICAgICAgICAgIHZhbElzVW5kZWYgPSB2YWx1ZSA9PT0gdW5kZWZpbmVkO1xuXG4gICAgICB3aGlsZSAobG93IDwgaGlnaCkge1xuICAgICAgICB2YXIgbWlkID0gbmF0aXZlRmxvb3IoKGxvdyArIGhpZ2gpIC8gMiksXG4gICAgICAgICAgICBjb21wdXRlZCA9IGl0ZXJhdGVlKGFycmF5W21pZF0pLFxuICAgICAgICAgICAgaXNEZWYgPSBjb21wdXRlZCAhPT0gdW5kZWZpbmVkLFxuICAgICAgICAgICAgaXNSZWZsZXhpdmUgPSBjb21wdXRlZCA9PT0gY29tcHV0ZWQ7XG5cbiAgICAgICAgaWYgKHZhbElzTmFOKSB7XG4gICAgICAgICAgdmFyIHNldExvdyA9IGlzUmVmbGV4aXZlIHx8IHJldEhpZ2hlc3Q7XG4gICAgICAgIH0gZWxzZSBpZiAodmFsSXNOdWxsKSB7XG4gICAgICAgICAgc2V0TG93ID0gaXNSZWZsZXhpdmUgJiYgaXNEZWYgJiYgKHJldEhpZ2hlc3QgfHwgY29tcHV0ZWQgIT0gbnVsbCk7XG4gICAgICAgIH0gZWxzZSBpZiAodmFsSXNVbmRlZikge1xuICAgICAgICAgIHNldExvdyA9IGlzUmVmbGV4aXZlICYmIChyZXRIaWdoZXN0IHx8IGlzRGVmKTtcbiAgICAgICAgfSBlbHNlIGlmIChjb21wdXRlZCA9PSBudWxsKSB7XG4gICAgICAgICAgc2V0TG93ID0gZmFsc2U7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc2V0TG93ID0gcmV0SGlnaGVzdCA/IChjb21wdXRlZCA8PSB2YWx1ZSkgOiAoY29tcHV0ZWQgPCB2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNldExvdykge1xuICAgICAgICAgIGxvdyA9IG1pZCArIDE7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaGlnaCA9IG1pZDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIG5hdGl2ZU1pbihoaWdoLCBNQVhfQVJSQVlfSU5ERVgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgYmFzZUNhbGxiYWNrYCB3aGljaCBvbmx5IHN1cHBvcnRzIGB0aGlzYCBiaW5kaW5nXG4gICAgICogYW5kIHNwZWNpZnlpbmcgdGhlIG51bWJlciBvZiBhcmd1bWVudHMgdG8gcHJvdmlkZSB0byBgZnVuY2AuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGJpbmQuXG4gICAgICogQHBhcmFtIHsqfSB0aGlzQXJnIFRoZSBgdGhpc2AgYmluZGluZyBvZiBgZnVuY2AuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFthcmdDb3VudF0gVGhlIG51bWJlciBvZiBhcmd1bWVudHMgdG8gcHJvdmlkZSB0byBgZnVuY2AuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBjYWxsYmFjay5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiaW5kQ2FsbGJhY2soZnVuYywgdGhpc0FyZywgYXJnQ291bnQpIHtcbiAgICAgIGlmICh0eXBlb2YgZnVuYyAhPSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHJldHVybiBpZGVudGl0eTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzQXJnID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIGZ1bmM7XG4gICAgICB9XG4gICAgICBzd2l0Y2ggKGFyZ0NvdW50KSB7XG4gICAgICAgIGNhc2UgMTogcmV0dXJuIGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICAgICAgcmV0dXJuIGZ1bmMuY2FsbCh0aGlzQXJnLCB2YWx1ZSk7XG4gICAgICAgIH07XG4gICAgICAgIGNhc2UgMzogcmV0dXJuIGZ1bmN0aW9uKHZhbHVlLCBpbmRleCwgY29sbGVjdGlvbikge1xuICAgICAgICAgIHJldHVybiBmdW5jLmNhbGwodGhpc0FyZywgdmFsdWUsIGluZGV4LCBjb2xsZWN0aW9uKTtcbiAgICAgICAgfTtcbiAgICAgICAgY2FzZSA0OiByZXR1cm4gZnVuY3Rpb24oYWNjdW11bGF0b3IsIHZhbHVlLCBpbmRleCwgY29sbGVjdGlvbikge1xuICAgICAgICAgIHJldHVybiBmdW5jLmNhbGwodGhpc0FyZywgYWNjdW11bGF0b3IsIHZhbHVlLCBpbmRleCwgY29sbGVjdGlvbik7XG4gICAgICAgIH07XG4gICAgICAgIGNhc2UgNTogcmV0dXJuIGZ1bmN0aW9uKHZhbHVlLCBvdGhlciwga2V5LCBvYmplY3QsIHNvdXJjZSkge1xuICAgICAgICAgIHJldHVybiBmdW5jLmNhbGwodGhpc0FyZywgdmFsdWUsIG90aGVyLCBrZXksIG9iamVjdCwgc291cmNlKTtcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIGZ1bmMuYXBwbHkodGhpc0FyZywgYXJndW1lbnRzKTtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGNsb25lIG9mIHRoZSBnaXZlbiBhcnJheSBidWZmZXIuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXlCdWZmZXJ9IGJ1ZmZlciBUaGUgYXJyYXkgYnVmZmVyIHRvIGNsb25lLlxuICAgICAqIEByZXR1cm5zIHtBcnJheUJ1ZmZlcn0gUmV0dXJucyB0aGUgY2xvbmVkIGFycmF5IGJ1ZmZlci5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBidWZmZXJDbG9uZShidWZmZXIpIHtcbiAgICAgIHZhciByZXN1bHQgPSBuZXcgQXJyYXlCdWZmZXIoYnVmZmVyLmJ5dGVMZW5ndGgpLFxuICAgICAgICAgIHZpZXcgPSBuZXcgVWludDhBcnJheShyZXN1bHQpO1xuXG4gICAgICB2aWV3LnNldChuZXcgVWludDhBcnJheShidWZmZXIpKTtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBhcnJheSB0aGF0IGlzIHRoZSBjb21wb3NpdGlvbiBvZiBwYXJ0aWFsbHkgYXBwbGllZCBhcmd1bWVudHMsXG4gICAgICogcGxhY2Vob2xkZXJzLCBhbmQgcHJvdmlkZWQgYXJndW1lbnRzIGludG8gYSBzaW5nbGUgYXJyYXkgb2YgYXJndW1lbnRzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gYXJncyBUaGUgcHJvdmlkZWQgYXJndW1lbnRzLlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IHBhcnRpYWxzIFRoZSBhcmd1bWVudHMgdG8gcHJlcGVuZCB0byB0aG9zZSBwcm92aWRlZC5cbiAgICAgKiBAcGFyYW0ge0FycmF5fSBob2xkZXJzIFRoZSBgcGFydGlhbHNgIHBsYWNlaG9sZGVyIGluZGV4ZXMuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgYXJyYXkgb2YgY29tcG9zZWQgYXJndW1lbnRzLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNvbXBvc2VBcmdzKGFyZ3MsIHBhcnRpYWxzLCBob2xkZXJzKSB7XG4gICAgICB2YXIgaG9sZGVyc0xlbmd0aCA9IGhvbGRlcnMubGVuZ3RoLFxuICAgICAgICAgIGFyZ3NJbmRleCA9IC0xLFxuICAgICAgICAgIGFyZ3NMZW5ndGggPSBuYXRpdmVNYXgoYXJncy5sZW5ndGggLSBob2xkZXJzTGVuZ3RoLCAwKSxcbiAgICAgICAgICBsZWZ0SW5kZXggPSAtMSxcbiAgICAgICAgICBsZWZ0TGVuZ3RoID0gcGFydGlhbHMubGVuZ3RoLFxuICAgICAgICAgIHJlc3VsdCA9IEFycmF5KGxlZnRMZW5ndGggKyBhcmdzTGVuZ3RoKTtcblxuICAgICAgd2hpbGUgKCsrbGVmdEluZGV4IDwgbGVmdExlbmd0aCkge1xuICAgICAgICByZXN1bHRbbGVmdEluZGV4XSA9IHBhcnRpYWxzW2xlZnRJbmRleF07XG4gICAgICB9XG4gICAgICB3aGlsZSAoKythcmdzSW5kZXggPCBob2xkZXJzTGVuZ3RoKSB7XG4gICAgICAgIHJlc3VsdFtob2xkZXJzW2FyZ3NJbmRleF1dID0gYXJnc1thcmdzSW5kZXhdO1xuICAgICAgfVxuICAgICAgd2hpbGUgKGFyZ3NMZW5ndGgtLSkge1xuICAgICAgICByZXN1bHRbbGVmdEluZGV4KytdID0gYXJnc1thcmdzSW5kZXgrK107XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgZnVuY3Rpb24gaXMgbGlrZSBgY29tcG9zZUFyZ3NgIGV4Y2VwdCB0aGF0IHRoZSBhcmd1bWVudHMgY29tcG9zaXRpb25cbiAgICAgKiBpcyB0YWlsb3JlZCBmb3IgYF8ucGFydGlhbFJpZ2h0YC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGFyZ3MgVGhlIHByb3ZpZGVkIGFyZ3VtZW50cy5cbiAgICAgKiBAcGFyYW0ge0FycmF5fSBwYXJ0aWFscyBUaGUgYXJndW1lbnRzIHRvIGFwcGVuZCB0byB0aG9zZSBwcm92aWRlZC5cbiAgICAgKiBAcGFyYW0ge0FycmF5fSBob2xkZXJzIFRoZSBgcGFydGlhbHNgIHBsYWNlaG9sZGVyIGluZGV4ZXMuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgYXJyYXkgb2YgY29tcG9zZWQgYXJndW1lbnRzLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNvbXBvc2VBcmdzUmlnaHQoYXJncywgcGFydGlhbHMsIGhvbGRlcnMpIHtcbiAgICAgIHZhciBob2xkZXJzSW5kZXggPSAtMSxcbiAgICAgICAgICBob2xkZXJzTGVuZ3RoID0gaG9sZGVycy5sZW5ndGgsXG4gICAgICAgICAgYXJnc0luZGV4ID0gLTEsXG4gICAgICAgICAgYXJnc0xlbmd0aCA9IG5hdGl2ZU1heChhcmdzLmxlbmd0aCAtIGhvbGRlcnNMZW5ndGgsIDApLFxuICAgICAgICAgIHJpZ2h0SW5kZXggPSAtMSxcbiAgICAgICAgICByaWdodExlbmd0aCA9IHBhcnRpYWxzLmxlbmd0aCxcbiAgICAgICAgICByZXN1bHQgPSBBcnJheShhcmdzTGVuZ3RoICsgcmlnaHRMZW5ndGgpO1xuXG4gICAgICB3aGlsZSAoKythcmdzSW5kZXggPCBhcmdzTGVuZ3RoKSB7XG4gICAgICAgIHJlc3VsdFthcmdzSW5kZXhdID0gYXJnc1thcmdzSW5kZXhdO1xuICAgICAgfVxuICAgICAgdmFyIG9mZnNldCA9IGFyZ3NJbmRleDtcbiAgICAgIHdoaWxlICgrK3JpZ2h0SW5kZXggPCByaWdodExlbmd0aCkge1xuICAgICAgICByZXN1bHRbb2Zmc2V0ICsgcmlnaHRJbmRleF0gPSBwYXJ0aWFsc1tyaWdodEluZGV4XTtcbiAgICAgIH1cbiAgICAgIHdoaWxlICgrK2hvbGRlcnNJbmRleCA8IGhvbGRlcnNMZW5ndGgpIHtcbiAgICAgICAgcmVzdWx0W29mZnNldCArIGhvbGRlcnNbaG9sZGVyc0luZGV4XV0gPSBhcmdzW2FyZ3NJbmRleCsrXTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGBfLmNvdW50QnlgLCBgXy5ncm91cEJ5YCwgYF8uaW5kZXhCeWAsIG9yIGBfLnBhcnRpdGlvbmAgZnVuY3Rpb24uXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IHNldHRlciBUaGUgZnVuY3Rpb24gdG8gc2V0IGtleXMgYW5kIHZhbHVlcyBvZiB0aGUgYWNjdW11bGF0b3Igb2JqZWN0LlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpbml0aWFsaXplcl0gVGhlIGZ1bmN0aW9uIHRvIGluaXRpYWxpemUgdGhlIGFjY3VtdWxhdG9yIG9iamVjdC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBhZ2dyZWdhdG9yIGZ1bmN0aW9uLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZUFnZ3JlZ2F0b3Ioc2V0dGVyLCBpbml0aWFsaXplcikge1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uKGNvbGxlY3Rpb24sIGl0ZXJhdGVlLCB0aGlzQXJnKSB7XG4gICAgICAgIHZhciByZXN1bHQgPSBpbml0aWFsaXplciA/IGluaXRpYWxpemVyKCkgOiB7fTtcbiAgICAgICAgaXRlcmF0ZWUgPSBnZXRDYWxsYmFjayhpdGVyYXRlZSwgdGhpc0FyZywgMyk7XG5cbiAgICAgICAgaWYgKGlzQXJyYXkoY29sbGVjdGlvbikpIHtcbiAgICAgICAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgICAgICAgbGVuZ3RoID0gY29sbGVjdGlvbi5sZW5ndGg7XG5cbiAgICAgICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICAgICAgdmFyIHZhbHVlID0gY29sbGVjdGlvbltpbmRleF07XG4gICAgICAgICAgICBzZXR0ZXIocmVzdWx0LCB2YWx1ZSwgaXRlcmF0ZWUodmFsdWUsIGluZGV4LCBjb2xsZWN0aW9uKSwgY29sbGVjdGlvbik7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGJhc2VFYWNoKGNvbGxlY3Rpb24sIGZ1bmN0aW9uKHZhbHVlLCBrZXksIGNvbGxlY3Rpb24pIHtcbiAgICAgICAgICAgIHNldHRlcihyZXN1bHQsIHZhbHVlLCBpdGVyYXRlZSh2YWx1ZSwga2V5LCBjb2xsZWN0aW9uKSwgY29sbGVjdGlvbik7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGBfLmFzc2lnbmAsIGBfLmRlZmF1bHRzYCwgb3IgYF8ubWVyZ2VgIGZ1bmN0aW9uLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBhc3NpZ25lciBUaGUgZnVuY3Rpb24gdG8gYXNzaWduIHZhbHVlcy5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBhc3NpZ25lciBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGVBc3NpZ25lcihhc3NpZ25lcikge1xuICAgICAgcmV0dXJuIHJlc3RQYXJhbShmdW5jdGlvbihvYmplY3QsIHNvdXJjZXMpIHtcbiAgICAgICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgICAgICBsZW5ndGggPSBvYmplY3QgPT0gbnVsbCA/IDAgOiBzb3VyY2VzLmxlbmd0aCxcbiAgICAgICAgICAgIGN1c3RvbWl6ZXIgPSBsZW5ndGggPiAyID8gc291cmNlc1tsZW5ndGggLSAyXSA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIGd1YXJkID0gbGVuZ3RoID4gMiA/IHNvdXJjZXNbMl0gOiB1bmRlZmluZWQsXG4gICAgICAgICAgICB0aGlzQXJnID0gbGVuZ3RoID4gMSA/IHNvdXJjZXNbbGVuZ3RoIC0gMV0gOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgaWYgKHR5cGVvZiBjdXN0b21pemVyID09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICBjdXN0b21pemVyID0gYmluZENhbGxiYWNrKGN1c3RvbWl6ZXIsIHRoaXNBcmcsIDUpO1xuICAgICAgICAgIGxlbmd0aCAtPSAyO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGN1c3RvbWl6ZXIgPSB0eXBlb2YgdGhpc0FyZyA9PSAnZnVuY3Rpb24nID8gdGhpc0FyZyA6IHVuZGVmaW5lZDtcbiAgICAgICAgICBsZW5ndGggLT0gKGN1c3RvbWl6ZXIgPyAxIDogMCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGd1YXJkICYmIGlzSXRlcmF0ZWVDYWxsKHNvdXJjZXNbMF0sIHNvdXJjZXNbMV0sIGd1YXJkKSkge1xuICAgICAgICAgIGN1c3RvbWl6ZXIgPSBsZW5ndGggPCAzID8gdW5kZWZpbmVkIDogY3VzdG9taXplcjtcbiAgICAgICAgICBsZW5ndGggPSAxO1xuICAgICAgICB9XG4gICAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgICAgdmFyIHNvdXJjZSA9IHNvdXJjZXNbaW5kZXhdO1xuICAgICAgICAgIGlmIChzb3VyY2UpIHtcbiAgICAgICAgICAgIGFzc2lnbmVyKG9iamVjdCwgc291cmNlLCBjdXN0b21pemVyKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG9iamVjdDtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBgYmFzZUVhY2hgIG9yIGBiYXNlRWFjaFJpZ2h0YCBmdW5jdGlvbi5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZWFjaEZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGl0ZXJhdGUgb3ZlciBhIGNvbGxlY3Rpb24uXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbZnJvbVJpZ2h0XSBTcGVjaWZ5IGl0ZXJhdGluZyBmcm9tIHJpZ2h0IHRvIGxlZnQuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgYmFzZSBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGVCYXNlRWFjaChlYWNoRnVuYywgZnJvbVJpZ2h0KSB7XG4gICAgICByZXR1cm4gZnVuY3Rpb24oY29sbGVjdGlvbiwgaXRlcmF0ZWUpIHtcbiAgICAgICAgdmFyIGxlbmd0aCA9IGNvbGxlY3Rpb24gPyBnZXRMZW5ndGgoY29sbGVjdGlvbikgOiAwO1xuICAgICAgICBpZiAoIWlzTGVuZ3RoKGxlbmd0aCkpIHtcbiAgICAgICAgICByZXR1cm4gZWFjaEZ1bmMoY29sbGVjdGlvbiwgaXRlcmF0ZWUpO1xuICAgICAgICB9XG4gICAgICAgIHZhciBpbmRleCA9IGZyb21SaWdodCA/IGxlbmd0aCA6IC0xLFxuICAgICAgICAgICAgaXRlcmFibGUgPSB0b09iamVjdChjb2xsZWN0aW9uKTtcblxuICAgICAgICB3aGlsZSAoKGZyb21SaWdodCA/IGluZGV4LS0gOiArK2luZGV4IDwgbGVuZ3RoKSkge1xuICAgICAgICAgIGlmIChpdGVyYXRlZShpdGVyYWJsZVtpbmRleF0sIGluZGV4LCBpdGVyYWJsZSkgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNvbGxlY3Rpb247XG4gICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBiYXNlIGZ1bmN0aW9uIGZvciBgXy5mb3JJbmAgb3IgYF8uZm9ySW5SaWdodGAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2Zyb21SaWdodF0gU3BlY2lmeSBpdGVyYXRpbmcgZnJvbSByaWdodCB0byBsZWZ0LlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGJhc2UgZnVuY3Rpb24uXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlQmFzZUZvcihmcm9tUmlnaHQpIHtcbiAgICAgIHJldHVybiBmdW5jdGlvbihvYmplY3QsIGl0ZXJhdGVlLCBrZXlzRnVuYykge1xuICAgICAgICB2YXIgaXRlcmFibGUgPSB0b09iamVjdChvYmplY3QpLFxuICAgICAgICAgICAgcHJvcHMgPSBrZXlzRnVuYyhvYmplY3QpLFxuICAgICAgICAgICAgbGVuZ3RoID0gcHJvcHMubGVuZ3RoLFxuICAgICAgICAgICAgaW5kZXggPSBmcm9tUmlnaHQgPyBsZW5ndGggOiAtMTtcblxuICAgICAgICB3aGlsZSAoKGZyb21SaWdodCA/IGluZGV4LS0gOiArK2luZGV4IDwgbGVuZ3RoKSkge1xuICAgICAgICAgIHZhciBrZXkgPSBwcm9wc1tpbmRleF07XG4gICAgICAgICAgaWYgKGl0ZXJhdGVlKGl0ZXJhYmxlW2tleV0sIGtleSwgaXRlcmFibGUpID09PSBmYWxzZSkge1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBvYmplY3Q7XG4gICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IHdyYXBzIGBmdW5jYCBhbmQgaW52b2tlcyBpdCB3aXRoIHRoZSBgdGhpc2BcbiAgICAgKiBiaW5kaW5nIG9mIGB0aGlzQXJnYC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gYmluZC5cbiAgICAgKiBAcGFyYW0geyp9IFt0aGlzQXJnXSBUaGUgYHRoaXNgIGJpbmRpbmcgb2YgYGZ1bmNgLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGJvdW5kIGZ1bmN0aW9uLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZUJpbmRXcmFwcGVyKGZ1bmMsIHRoaXNBcmcpIHtcbiAgICAgIHZhciBDdG9yID0gY3JlYXRlQ3RvcldyYXBwZXIoZnVuYyk7XG5cbiAgICAgIGZ1bmN0aW9uIHdyYXBwZXIoKSB7XG4gICAgICAgIHZhciBmbiA9ICh0aGlzICYmIHRoaXMgIT09IHJvb3QgJiYgdGhpcyBpbnN0YW5jZW9mIHdyYXBwZXIpID8gQ3RvciA6IGZ1bmM7XG4gICAgICAgIHJldHVybiBmbi5hcHBseSh0aGlzQXJnLCBhcmd1bWVudHMpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHdyYXBwZXI7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGBTZXRgIGNhY2hlIG9iamVjdCB0byBvcHRpbWl6ZSBsaW5lYXIgc2VhcmNoZXMgb2YgbGFyZ2UgYXJyYXlzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBbdmFsdWVzXSBUaGUgdmFsdWVzIHRvIGNhY2hlLlxuICAgICAqIEByZXR1cm5zIHtudWxsfE9iamVjdH0gUmV0dXJucyB0aGUgbmV3IGNhY2hlIG9iamVjdCBpZiBgU2V0YCBpcyBzdXBwb3J0ZWQsIGVsc2UgYG51bGxgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZUNhY2hlKHZhbHVlcykge1xuICAgICAgcmV0dXJuIChuYXRpdmVDcmVhdGUgJiYgU2V0KSA/IG5ldyBTZXRDYWNoZSh2YWx1ZXMpIDogbnVsbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCBwcm9kdWNlcyBjb21wb3VuZCB3b3JkcyBvdXQgb2YgdGhlIHdvcmRzIGluIGFcbiAgICAgKiBnaXZlbiBzdHJpbmcuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIFRoZSBmdW5jdGlvbiB0byBjb21iaW5lIGVhY2ggd29yZC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBjb21wb3VuZGVyIGZ1bmN0aW9uLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZUNvbXBvdW5kZXIoY2FsbGJhY2spIHtcbiAgICAgIHJldHVybiBmdW5jdGlvbihzdHJpbmcpIHtcbiAgICAgICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgICAgICBhcnJheSA9IHdvcmRzKGRlYnVycihzdHJpbmcpKSxcbiAgICAgICAgICAgIGxlbmd0aCA9IGFycmF5Lmxlbmd0aCxcbiAgICAgICAgICAgIHJlc3VsdCA9ICcnO1xuXG4gICAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgICAgcmVzdWx0ID0gY2FsbGJhY2socmVzdWx0LCBhcnJheVtpbmRleF0sIGluZGV4KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCBwcm9kdWNlcyBhbiBpbnN0YW5jZSBvZiBgQ3RvcmAgcmVnYXJkbGVzcyBvZlxuICAgICAqIHdoZXRoZXIgaXQgd2FzIGludm9rZWQgYXMgcGFydCBvZiBhIGBuZXdgIGV4cHJlc3Npb24gb3IgYnkgYGNhbGxgIG9yIGBhcHBseWAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IEN0b3IgVGhlIGNvbnN0cnVjdG9yIHRvIHdyYXAuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgd3JhcHBlZCBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGVDdG9yV3JhcHBlcihDdG9yKSB7XG4gICAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICAgIC8vIFVzZSBhIGBzd2l0Y2hgIHN0YXRlbWVudCB0byB3b3JrIHdpdGggY2xhc3MgY29uc3RydWN0b3JzLlxuICAgICAgICAvLyBTZWUgaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNi4wLyNzZWMtZWNtYXNjcmlwdC1mdW5jdGlvbi1vYmplY3RzLWNhbGwtdGhpc2FyZ3VtZW50LWFyZ3VtZW50c2xpc3RcbiAgICAgICAgLy8gZm9yIG1vcmUgZGV0YWlscy5cbiAgICAgICAgdmFyIGFyZ3MgPSBhcmd1bWVudHM7XG4gICAgICAgIHN3aXRjaCAoYXJncy5sZW5ndGgpIHtcbiAgICAgICAgICBjYXNlIDA6IHJldHVybiBuZXcgQ3RvcjtcbiAgICAgICAgICBjYXNlIDE6IHJldHVybiBuZXcgQ3RvcihhcmdzWzBdKTtcbiAgICAgICAgICBjYXNlIDI6IHJldHVybiBuZXcgQ3RvcihhcmdzWzBdLCBhcmdzWzFdKTtcbiAgICAgICAgICBjYXNlIDM6IHJldHVybiBuZXcgQ3RvcihhcmdzWzBdLCBhcmdzWzFdLCBhcmdzWzJdKTtcbiAgICAgICAgICBjYXNlIDQ6IHJldHVybiBuZXcgQ3RvcihhcmdzWzBdLCBhcmdzWzFdLCBhcmdzWzJdLCBhcmdzWzNdKTtcbiAgICAgICAgICBjYXNlIDU6IHJldHVybiBuZXcgQ3RvcihhcmdzWzBdLCBhcmdzWzFdLCBhcmdzWzJdLCBhcmdzWzNdLCBhcmdzWzRdKTtcbiAgICAgICAgICBjYXNlIDY6IHJldHVybiBuZXcgQ3RvcihhcmdzWzBdLCBhcmdzWzFdLCBhcmdzWzJdLCBhcmdzWzNdLCBhcmdzWzRdLCBhcmdzWzVdKTtcbiAgICAgICAgICBjYXNlIDc6IHJldHVybiBuZXcgQ3RvcihhcmdzWzBdLCBhcmdzWzFdLCBhcmdzWzJdLCBhcmdzWzNdLCBhcmdzWzRdLCBhcmdzWzVdLCBhcmdzWzZdKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgdGhpc0JpbmRpbmcgPSBiYXNlQ3JlYXRlKEN0b3IucHJvdG90eXBlKSxcbiAgICAgICAgICAgIHJlc3VsdCA9IEN0b3IuYXBwbHkodGhpc0JpbmRpbmcsIGFyZ3MpO1xuXG4gICAgICAgIC8vIE1pbWljIHRoZSBjb25zdHJ1Y3RvcidzIGByZXR1cm5gIGJlaGF2aW9yLlxuICAgICAgICAvLyBTZWUgaHR0cHM6Ly9lczUuZ2l0aHViLmlvLyN4MTMuMi4yIGZvciBtb3JlIGRldGFpbHMuXG4gICAgICAgIHJldHVybiBpc09iamVjdChyZXN1bHQpID8gcmVzdWx0IDogdGhpc0JpbmRpbmc7XG4gICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBgXy5jdXJyeWAgb3IgYF8uY3VycnlSaWdodGAgZnVuY3Rpb24uXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gZmxhZyBUaGUgY3VycnkgYml0IGZsYWcuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgY3VycnkgZnVuY3Rpb24uXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlQ3VycnkoZmxhZykge1xuICAgICAgZnVuY3Rpb24gY3VycnlGdW5jKGZ1bmMsIGFyaXR5LCBndWFyZCkge1xuICAgICAgICBpZiAoZ3VhcmQgJiYgaXNJdGVyYXRlZUNhbGwoZnVuYywgYXJpdHksIGd1YXJkKSkge1xuICAgICAgICAgIGFyaXR5ID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIHZhciByZXN1bHQgPSBjcmVhdGVXcmFwcGVyKGZ1bmMsIGZsYWcsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCBhcml0eSk7XG4gICAgICAgIHJlc3VsdC5wbGFjZWhvbGRlciA9IGN1cnJ5RnVuYy5wbGFjZWhvbGRlcjtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBjdXJyeUZ1bmM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGBfLmRlZmF1bHRzYCBvciBgXy5kZWZhdWx0c0RlZXBgIGZ1bmN0aW9uLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBhc3NpZ25lciBUaGUgZnVuY3Rpb24gdG8gYXNzaWduIHZhbHVlcy5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjdXN0b21pemVyIFRoZSBmdW5jdGlvbiB0byBjdXN0b21pemUgYXNzaWduZWQgdmFsdWVzLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGRlZmF1bHRzIGZ1bmN0aW9uLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZURlZmF1bHRzKGFzc2lnbmVyLCBjdXN0b21pemVyKSB7XG4gICAgICByZXR1cm4gcmVzdFBhcmFtKGZ1bmN0aW9uKGFyZ3MpIHtcbiAgICAgICAgdmFyIG9iamVjdCA9IGFyZ3NbMF07XG4gICAgICAgIGlmIChvYmplY3QgPT0gbnVsbCkge1xuICAgICAgICAgIHJldHVybiBvYmplY3Q7XG4gICAgICAgIH1cbiAgICAgICAgYXJncy5wdXNoKGN1c3RvbWl6ZXIpO1xuICAgICAgICByZXR1cm4gYXNzaWduZXIuYXBwbHkodW5kZWZpbmVkLCBhcmdzKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBgXy5tYXhgIG9yIGBfLm1pbmAgZnVuY3Rpb24uXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGNvbXBhcmF0b3IgVGhlIGZ1bmN0aW9uIHVzZWQgdG8gY29tcGFyZSB2YWx1ZXMuXG4gICAgICogQHBhcmFtIHsqfSBleFZhbHVlIFRoZSBpbml0aWFsIGV4dHJlbXVtIHZhbHVlLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGV4dHJlbXVtIGZ1bmN0aW9uLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZUV4dHJlbXVtKGNvbXBhcmF0b3IsIGV4VmFsdWUpIHtcbiAgICAgIHJldHVybiBmdW5jdGlvbihjb2xsZWN0aW9uLCBpdGVyYXRlZSwgdGhpc0FyZykge1xuICAgICAgICBpZiAodGhpc0FyZyAmJiBpc0l0ZXJhdGVlQ2FsbChjb2xsZWN0aW9uLCBpdGVyYXRlZSwgdGhpc0FyZykpIHtcbiAgICAgICAgICBpdGVyYXRlZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICBpdGVyYXRlZSA9IGdldENhbGxiYWNrKGl0ZXJhdGVlLCB0aGlzQXJnLCAzKTtcbiAgICAgICAgaWYgKGl0ZXJhdGVlLmxlbmd0aCA9PSAxKSB7XG4gICAgICAgICAgY29sbGVjdGlvbiA9IGlzQXJyYXkoY29sbGVjdGlvbikgPyBjb2xsZWN0aW9uIDogdG9JdGVyYWJsZShjb2xsZWN0aW9uKTtcbiAgICAgICAgICB2YXIgcmVzdWx0ID0gYXJyYXlFeHRyZW11bShjb2xsZWN0aW9uLCBpdGVyYXRlZSwgY29tcGFyYXRvciwgZXhWYWx1ZSk7XG4gICAgICAgICAgaWYgKCEoY29sbGVjdGlvbi5sZW5ndGggJiYgcmVzdWx0ID09PSBleFZhbHVlKSkge1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGJhc2VFeHRyZW11bShjb2xsZWN0aW9uLCBpdGVyYXRlZSwgY29tcGFyYXRvciwgZXhWYWx1ZSk7XG4gICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBgXy5maW5kYCBvciBgXy5maW5kTGFzdGAgZnVuY3Rpb24uXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGVhY2hGdW5jIFRoZSBmdW5jdGlvbiB0byBpdGVyYXRlIG92ZXIgYSBjb2xsZWN0aW9uLlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2Zyb21SaWdodF0gU3BlY2lmeSBpdGVyYXRpbmcgZnJvbSByaWdodCB0byBsZWZ0LlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGZpbmQgZnVuY3Rpb24uXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlRmluZChlYWNoRnVuYywgZnJvbVJpZ2h0KSB7XG4gICAgICByZXR1cm4gZnVuY3Rpb24oY29sbGVjdGlvbiwgcHJlZGljYXRlLCB0aGlzQXJnKSB7XG4gICAgICAgIHByZWRpY2F0ZSA9IGdldENhbGxiYWNrKHByZWRpY2F0ZSwgdGhpc0FyZywgMyk7XG4gICAgICAgIGlmIChpc0FycmF5KGNvbGxlY3Rpb24pKSB7XG4gICAgICAgICAgdmFyIGluZGV4ID0gYmFzZUZpbmRJbmRleChjb2xsZWN0aW9uLCBwcmVkaWNhdGUsIGZyb21SaWdodCk7XG4gICAgICAgICAgcmV0dXJuIGluZGV4ID4gLTEgPyBjb2xsZWN0aW9uW2luZGV4XSA6IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYmFzZUZpbmQoY29sbGVjdGlvbiwgcHJlZGljYXRlLCBlYWNoRnVuYyk7XG4gICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBgXy5maW5kSW5kZXhgIG9yIGBfLmZpbmRMYXN0SW5kZXhgIGZ1bmN0aW9uLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtmcm9tUmlnaHRdIFNwZWNpZnkgaXRlcmF0aW5nIGZyb20gcmlnaHQgdG8gbGVmdC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBmaW5kIGZ1bmN0aW9uLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZUZpbmRJbmRleChmcm9tUmlnaHQpIHtcbiAgICAgIHJldHVybiBmdW5jdGlvbihhcnJheSwgcHJlZGljYXRlLCB0aGlzQXJnKSB7XG4gICAgICAgIGlmICghKGFycmF5ICYmIGFycmF5Lmxlbmd0aCkpIHtcbiAgICAgICAgICByZXR1cm4gLTE7XG4gICAgICAgIH1cbiAgICAgICAgcHJlZGljYXRlID0gZ2V0Q2FsbGJhY2socHJlZGljYXRlLCB0aGlzQXJnLCAzKTtcbiAgICAgICAgcmV0dXJuIGJhc2VGaW5kSW5kZXgoYXJyYXksIHByZWRpY2F0ZSwgZnJvbVJpZ2h0KTtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGBfLmZpbmRLZXlgIG9yIGBfLmZpbmRMYXN0S2V5YCBmdW5jdGlvbi5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gb2JqZWN0RnVuYyBUaGUgZnVuY3Rpb24gdG8gaXRlcmF0ZSBvdmVyIGFuIG9iamVjdC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBmaW5kIGZ1bmN0aW9uLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZUZpbmRLZXkob2JqZWN0RnVuYykge1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uKG9iamVjdCwgcHJlZGljYXRlLCB0aGlzQXJnKSB7XG4gICAgICAgIHByZWRpY2F0ZSA9IGdldENhbGxiYWNrKHByZWRpY2F0ZSwgdGhpc0FyZywgMyk7XG4gICAgICAgIHJldHVybiBiYXNlRmluZChvYmplY3QsIHByZWRpY2F0ZSwgb2JqZWN0RnVuYywgdHJ1ZSk7XG4gICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBgXy5mbG93YCBvciBgXy5mbG93UmlnaHRgIGZ1bmN0aW9uLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtmcm9tUmlnaHRdIFNwZWNpZnkgaXRlcmF0aW5nIGZyb20gcmlnaHQgdG8gbGVmdC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBmbG93IGZ1bmN0aW9uLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZUZsb3coZnJvbVJpZ2h0KSB7XG4gICAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciB3cmFwcGVyLFxuICAgICAgICAgICAgbGVuZ3RoID0gYXJndW1lbnRzLmxlbmd0aCxcbiAgICAgICAgICAgIGluZGV4ID0gZnJvbVJpZ2h0ID8gbGVuZ3RoIDogLTEsXG4gICAgICAgICAgICBsZWZ0SW5kZXggPSAwLFxuICAgICAgICAgICAgZnVuY3MgPSBBcnJheShsZW5ndGgpO1xuXG4gICAgICAgIHdoaWxlICgoZnJvbVJpZ2h0ID8gaW5kZXgtLSA6ICsraW5kZXggPCBsZW5ndGgpKSB7XG4gICAgICAgICAgdmFyIGZ1bmMgPSBmdW5jc1tsZWZ0SW5kZXgrK10gPSBhcmd1bWVudHNbaW5kZXhdO1xuICAgICAgICAgIGlmICh0eXBlb2YgZnVuYyAhPSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKEZVTkNfRVJST1JfVEVYVCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICghd3JhcHBlciAmJiBMb2Rhc2hXcmFwcGVyLnByb3RvdHlwZS50aHJ1ICYmIGdldEZ1bmNOYW1lKGZ1bmMpID09ICd3cmFwcGVyJykge1xuICAgICAgICAgICAgd3JhcHBlciA9IG5ldyBMb2Rhc2hXcmFwcGVyKFtdLCB0cnVlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaW5kZXggPSB3cmFwcGVyID8gLTEgOiBsZW5ndGg7XG4gICAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgICAgZnVuYyA9IGZ1bmNzW2luZGV4XTtcblxuICAgICAgICAgIHZhciBmdW5jTmFtZSA9IGdldEZ1bmNOYW1lKGZ1bmMpLFxuICAgICAgICAgICAgICBkYXRhID0gZnVuY05hbWUgPT0gJ3dyYXBwZXInID8gZ2V0RGF0YShmdW5jKSA6IHVuZGVmaW5lZDtcblxuICAgICAgICAgIGlmIChkYXRhICYmIGlzTGF6aWFibGUoZGF0YVswXSkgJiYgZGF0YVsxXSA9PSAoQVJZX0ZMQUcgfCBDVVJSWV9GTEFHIHwgUEFSVElBTF9GTEFHIHwgUkVBUkdfRkxBRykgJiYgIWRhdGFbNF0ubGVuZ3RoICYmIGRhdGFbOV0gPT0gMSkge1xuICAgICAgICAgICAgd3JhcHBlciA9IHdyYXBwZXJbZ2V0RnVuY05hbWUoZGF0YVswXSldLmFwcGx5KHdyYXBwZXIsIGRhdGFbM10pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB3cmFwcGVyID0gKGZ1bmMubGVuZ3RoID09IDEgJiYgaXNMYXppYWJsZShmdW5jKSkgPyB3cmFwcGVyW2Z1bmNOYW1lXSgpIDogd3JhcHBlci50aHJ1KGZ1bmMpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgdmFyIGFyZ3MgPSBhcmd1bWVudHMsXG4gICAgICAgICAgICAgIHZhbHVlID0gYXJnc1swXTtcblxuICAgICAgICAgIGlmICh3cmFwcGVyICYmIGFyZ3MubGVuZ3RoID09IDEgJiYgaXNBcnJheSh2YWx1ZSkgJiYgdmFsdWUubGVuZ3RoID49IExBUkdFX0FSUkFZX1NJWkUpIHtcbiAgICAgICAgICAgIHJldHVybiB3cmFwcGVyLnBsYW50KHZhbHVlKS52YWx1ZSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgICB2YXIgaW5kZXggPSAwLFxuICAgICAgICAgICAgICByZXN1bHQgPSBsZW5ndGggPyBmdW5jc1tpbmRleF0uYXBwbHkodGhpcywgYXJncykgOiB2YWx1ZTtcblxuICAgICAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgICAgICByZXN1bHQgPSBmdW5jc1tpbmRleF0uY2FsbCh0aGlzLCByZXN1bHQpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9O1xuICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gZm9yIGBfLmZvckVhY2hgIG9yIGBfLmZvckVhY2hSaWdodGAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGFycmF5RnVuYyBUaGUgZnVuY3Rpb24gdG8gaXRlcmF0ZSBvdmVyIGFuIGFycmF5LlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGVhY2hGdW5jIFRoZSBmdW5jdGlvbiB0byBpdGVyYXRlIG92ZXIgYSBjb2xsZWN0aW9uLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGVhY2ggZnVuY3Rpb24uXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlRm9yRWFjaChhcnJheUZ1bmMsIGVhY2hGdW5jKSB7XG4gICAgICByZXR1cm4gZnVuY3Rpb24oY29sbGVjdGlvbiwgaXRlcmF0ZWUsIHRoaXNBcmcpIHtcbiAgICAgICAgcmV0dXJuICh0eXBlb2YgaXRlcmF0ZWUgPT0gJ2Z1bmN0aW9uJyAmJiB0aGlzQXJnID09PSB1bmRlZmluZWQgJiYgaXNBcnJheShjb2xsZWN0aW9uKSlcbiAgICAgICAgICA/IGFycmF5RnVuYyhjb2xsZWN0aW9uLCBpdGVyYXRlZSlcbiAgICAgICAgICA6IGVhY2hGdW5jKGNvbGxlY3Rpb24sIGJpbmRDYWxsYmFjayhpdGVyYXRlZSwgdGhpc0FyZywgMykpO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gZm9yIGBfLmZvckluYCBvciBgXy5mb3JJblJpZ2h0YC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gb2JqZWN0RnVuYyBUaGUgZnVuY3Rpb24gdG8gaXRlcmF0ZSBvdmVyIGFuIG9iamVjdC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBlYWNoIGZ1bmN0aW9uLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZUZvckluKG9iamVjdEZ1bmMpIHtcbiAgICAgIHJldHVybiBmdW5jdGlvbihvYmplY3QsIGl0ZXJhdGVlLCB0aGlzQXJnKSB7XG4gICAgICAgIGlmICh0eXBlb2YgaXRlcmF0ZWUgIT0gJ2Z1bmN0aW9uJyB8fCB0aGlzQXJnICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBpdGVyYXRlZSA9IGJpbmRDYWxsYmFjayhpdGVyYXRlZSwgdGhpc0FyZywgMyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG9iamVjdEZ1bmMob2JqZWN0LCBpdGVyYXRlZSwga2V5c0luKTtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIGZvciBgXy5mb3JPd25gIG9yIGBfLmZvck93blJpZ2h0YC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gb2JqZWN0RnVuYyBUaGUgZnVuY3Rpb24gdG8gaXRlcmF0ZSBvdmVyIGFuIG9iamVjdC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBlYWNoIGZ1bmN0aW9uLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZUZvck93bihvYmplY3RGdW5jKSB7XG4gICAgICByZXR1cm4gZnVuY3Rpb24ob2JqZWN0LCBpdGVyYXRlZSwgdGhpc0FyZykge1xuICAgICAgICBpZiAodHlwZW9mIGl0ZXJhdGVlICE9ICdmdW5jdGlvbicgfHwgdGhpc0FyZyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgaXRlcmF0ZWUgPSBiaW5kQ2FsbGJhY2soaXRlcmF0ZWUsIHRoaXNBcmcsIDMpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBvYmplY3RGdW5jKG9iamVjdCwgaXRlcmF0ZWUpO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gZm9yIGBfLm1hcEtleXNgIG9yIGBfLm1hcFZhbHVlc2AuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2lzTWFwS2V5c10gU3BlY2lmeSBtYXBwaW5nIGtleXMgaW5zdGVhZCBvZiB2YWx1ZXMuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgbWFwIGZ1bmN0aW9uLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZU9iamVjdE1hcHBlcihpc01hcEtleXMpIHtcbiAgICAgIHJldHVybiBmdW5jdGlvbihvYmplY3QsIGl0ZXJhdGVlLCB0aGlzQXJnKSB7XG4gICAgICAgIHZhciByZXN1bHQgPSB7fTtcbiAgICAgICAgaXRlcmF0ZWUgPSBnZXRDYWxsYmFjayhpdGVyYXRlZSwgdGhpc0FyZywgMyk7XG5cbiAgICAgICAgYmFzZUZvck93bihvYmplY3QsIGZ1bmN0aW9uKHZhbHVlLCBrZXksIG9iamVjdCkge1xuICAgICAgICAgIHZhciBtYXBwZWQgPSBpdGVyYXRlZSh2YWx1ZSwga2V5LCBvYmplY3QpO1xuICAgICAgICAgIGtleSA9IGlzTWFwS2V5cyA/IG1hcHBlZCA6IGtleTtcbiAgICAgICAgICB2YWx1ZSA9IGlzTWFwS2V5cyA/IHZhbHVlIDogbWFwcGVkO1xuICAgICAgICAgIHJlc3VsdFtrZXldID0gdmFsdWU7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gZm9yIGBfLnBhZExlZnRgIG9yIGBfLnBhZFJpZ2h0YC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbZnJvbVJpZ2h0XSBTcGVjaWZ5IHBhZGRpbmcgZnJvbSB0aGUgcmlnaHQuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgcGFkIGZ1bmN0aW9uLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZVBhZERpcihmcm9tUmlnaHQpIHtcbiAgICAgIHJldHVybiBmdW5jdGlvbihzdHJpbmcsIGxlbmd0aCwgY2hhcnMpIHtcbiAgICAgICAgc3RyaW5nID0gYmFzZVRvU3RyaW5nKHN0cmluZyk7XG4gICAgICAgIHJldHVybiAoZnJvbVJpZ2h0ID8gc3RyaW5nIDogJycpICsgY3JlYXRlUGFkZGluZyhzdHJpbmcsIGxlbmd0aCwgY2hhcnMpICsgKGZyb21SaWdodCA/ICcnIDogc3RyaW5nKTtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGBfLnBhcnRpYWxgIG9yIGBfLnBhcnRpYWxSaWdodGAgZnVuY3Rpb24uXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gZmxhZyBUaGUgcGFydGlhbCBiaXQgZmxhZy5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBwYXJ0aWFsIGZ1bmN0aW9uLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZVBhcnRpYWwoZmxhZykge1xuICAgICAgdmFyIHBhcnRpYWxGdW5jID0gcmVzdFBhcmFtKGZ1bmN0aW9uKGZ1bmMsIHBhcnRpYWxzKSB7XG4gICAgICAgIHZhciBob2xkZXJzID0gcmVwbGFjZUhvbGRlcnMocGFydGlhbHMsIHBhcnRpYWxGdW5jLnBsYWNlaG9sZGVyKTtcbiAgICAgICAgcmV0dXJuIGNyZWF0ZVdyYXBwZXIoZnVuYywgZmxhZywgdW5kZWZpbmVkLCBwYXJ0aWFscywgaG9sZGVycyk7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBwYXJ0aWFsRnVuYztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gZm9yIGBfLnJlZHVjZWAgb3IgYF8ucmVkdWNlUmlnaHRgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBhcnJheUZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGl0ZXJhdGUgb3ZlciBhbiBhcnJheS5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBlYWNoRnVuYyBUaGUgZnVuY3Rpb24gdG8gaXRlcmF0ZSBvdmVyIGEgY29sbGVjdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBlYWNoIGZ1bmN0aW9uLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZVJlZHVjZShhcnJheUZ1bmMsIGVhY2hGdW5jKSB7XG4gICAgICByZXR1cm4gZnVuY3Rpb24oY29sbGVjdGlvbiwgaXRlcmF0ZWUsIGFjY3VtdWxhdG9yLCB0aGlzQXJnKSB7XG4gICAgICAgIHZhciBpbml0RnJvbUFycmF5ID0gYXJndW1lbnRzLmxlbmd0aCA8IDM7XG4gICAgICAgIHJldHVybiAodHlwZW9mIGl0ZXJhdGVlID09ICdmdW5jdGlvbicgJiYgdGhpc0FyZyA9PT0gdW5kZWZpbmVkICYmIGlzQXJyYXkoY29sbGVjdGlvbikpXG4gICAgICAgICAgPyBhcnJheUZ1bmMoY29sbGVjdGlvbiwgaXRlcmF0ZWUsIGFjY3VtdWxhdG9yLCBpbml0RnJvbUFycmF5KVxuICAgICAgICAgIDogYmFzZVJlZHVjZShjb2xsZWN0aW9uLCBnZXRDYWxsYmFjayhpdGVyYXRlZSwgdGhpc0FyZywgNCksIGFjY3VtdWxhdG9yLCBpbml0RnJvbUFycmF5LCBlYWNoRnVuYyk7XG4gICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IHdyYXBzIGBmdW5jYCBhbmQgaW52b2tlcyBpdCB3aXRoIG9wdGlvbmFsIGB0aGlzYFxuICAgICAqIGJpbmRpbmcgb2YsIHBhcnRpYWwgYXBwbGljYXRpb24sIGFuZCBjdXJyeWluZy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbnxzdHJpbmd9IGZ1bmMgVGhlIGZ1bmN0aW9uIG9yIG1ldGhvZCBuYW1lIHRvIHJlZmVyZW5jZS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gYml0bWFzayBUaGUgYml0bWFzayBvZiBmbGFncy4gU2VlIGBjcmVhdGVXcmFwcGVyYCBmb3IgbW9yZSBkZXRhaWxzLlxuICAgICAqIEBwYXJhbSB7Kn0gW3RoaXNBcmddIFRoZSBgdGhpc2AgYmluZGluZyBvZiBgZnVuY2AuXG4gICAgICogQHBhcmFtIHtBcnJheX0gW3BhcnRpYWxzXSBUaGUgYXJndW1lbnRzIHRvIHByZXBlbmQgdG8gdGhvc2UgcHJvdmlkZWQgdG8gdGhlIG5ldyBmdW5jdGlvbi5cbiAgICAgKiBAcGFyYW0ge0FycmF5fSBbaG9sZGVyc10gVGhlIGBwYXJ0aWFsc2AgcGxhY2Vob2xkZXIgaW5kZXhlcy5cbiAgICAgKiBAcGFyYW0ge0FycmF5fSBbcGFydGlhbHNSaWdodF0gVGhlIGFyZ3VtZW50cyB0byBhcHBlbmQgdG8gdGhvc2UgcHJvdmlkZWQgdG8gdGhlIG5ldyBmdW5jdGlvbi5cbiAgICAgKiBAcGFyYW0ge0FycmF5fSBbaG9sZGVyc1JpZ2h0XSBUaGUgYHBhcnRpYWxzUmlnaHRgIHBsYWNlaG9sZGVyIGluZGV4ZXMuXG4gICAgICogQHBhcmFtIHtBcnJheX0gW2FyZ1Bvc10gVGhlIGFyZ3VtZW50IHBvc2l0aW9ucyBvZiB0aGUgbmV3IGZ1bmN0aW9uLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbYXJ5XSBUaGUgYXJpdHkgY2FwIG9mIGBmdW5jYC5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW2FyaXR5XSBUaGUgYXJpdHkgb2YgYGZ1bmNgLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IHdyYXBwZWQgZnVuY3Rpb24uXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlSHlicmlkV3JhcHBlcihmdW5jLCBiaXRtYXNrLCB0aGlzQXJnLCBwYXJ0aWFscywgaG9sZGVycywgcGFydGlhbHNSaWdodCwgaG9sZGVyc1JpZ2h0LCBhcmdQb3MsIGFyeSwgYXJpdHkpIHtcbiAgICAgIHZhciBpc0FyeSA9IGJpdG1hc2sgJiBBUllfRkxBRyxcbiAgICAgICAgICBpc0JpbmQgPSBiaXRtYXNrICYgQklORF9GTEFHLFxuICAgICAgICAgIGlzQmluZEtleSA9IGJpdG1hc2sgJiBCSU5EX0tFWV9GTEFHLFxuICAgICAgICAgIGlzQ3VycnkgPSBiaXRtYXNrICYgQ1VSUllfRkxBRyxcbiAgICAgICAgICBpc0N1cnJ5Qm91bmQgPSBiaXRtYXNrICYgQ1VSUllfQk9VTkRfRkxBRyxcbiAgICAgICAgICBpc0N1cnJ5UmlnaHQgPSBiaXRtYXNrICYgQ1VSUllfUklHSFRfRkxBRyxcbiAgICAgICAgICBDdG9yID0gaXNCaW5kS2V5ID8gdW5kZWZpbmVkIDogY3JlYXRlQ3RvcldyYXBwZXIoZnVuYyk7XG5cbiAgICAgIGZ1bmN0aW9uIHdyYXBwZXIoKSB7XG4gICAgICAgIC8vIEF2b2lkIGBhcmd1bWVudHNgIG9iamVjdCB1c2UgZGlzcXVhbGlmeWluZyBvcHRpbWl6YXRpb25zIGJ5XG4gICAgICAgIC8vIGNvbnZlcnRpbmcgaXQgdG8gYW4gYXJyYXkgYmVmb3JlIHByb3ZpZGluZyBpdCB0byBvdGhlciBmdW5jdGlvbnMuXG4gICAgICAgIHZhciBsZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoLFxuICAgICAgICAgICAgaW5kZXggPSBsZW5ndGgsXG4gICAgICAgICAgICBhcmdzID0gQXJyYXkobGVuZ3RoKTtcblxuICAgICAgICB3aGlsZSAoaW5kZXgtLSkge1xuICAgICAgICAgIGFyZ3NbaW5kZXhdID0gYXJndW1lbnRzW2luZGV4XTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGFydGlhbHMpIHtcbiAgICAgICAgICBhcmdzID0gY29tcG9zZUFyZ3MoYXJncywgcGFydGlhbHMsIGhvbGRlcnMpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwYXJ0aWFsc1JpZ2h0KSB7XG4gICAgICAgICAgYXJncyA9IGNvbXBvc2VBcmdzUmlnaHQoYXJncywgcGFydGlhbHNSaWdodCwgaG9sZGVyc1JpZ2h0KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNDdXJyeSB8fCBpc0N1cnJ5UmlnaHQpIHtcbiAgICAgICAgICB2YXIgcGxhY2Vob2xkZXIgPSB3cmFwcGVyLnBsYWNlaG9sZGVyLFxuICAgICAgICAgICAgICBhcmdzSG9sZGVycyA9IHJlcGxhY2VIb2xkZXJzKGFyZ3MsIHBsYWNlaG9sZGVyKTtcblxuICAgICAgICAgIGxlbmd0aCAtPSBhcmdzSG9sZGVycy5sZW5ndGg7XG4gICAgICAgICAgaWYgKGxlbmd0aCA8IGFyaXR5KSB7XG4gICAgICAgICAgICB2YXIgbmV3QXJnUG9zID0gYXJnUG9zID8gYXJyYXlDb3B5KGFyZ1BvcykgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgbmV3QXJpdHkgPSBuYXRpdmVNYXgoYXJpdHkgLSBsZW5ndGgsIDApLFxuICAgICAgICAgICAgICAgIG5ld3NIb2xkZXJzID0gaXNDdXJyeSA/IGFyZ3NIb2xkZXJzIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgIG5ld0hvbGRlcnNSaWdodCA9IGlzQ3VycnkgPyB1bmRlZmluZWQgOiBhcmdzSG9sZGVycyxcbiAgICAgICAgICAgICAgICBuZXdQYXJ0aWFscyA9IGlzQ3VycnkgPyBhcmdzIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgIG5ld1BhcnRpYWxzUmlnaHQgPSBpc0N1cnJ5ID8gdW5kZWZpbmVkIDogYXJncztcblxuICAgICAgICAgICAgYml0bWFzayB8PSAoaXNDdXJyeSA/IFBBUlRJQUxfRkxBRyA6IFBBUlRJQUxfUklHSFRfRkxBRyk7XG4gICAgICAgICAgICBiaXRtYXNrICY9IH4oaXNDdXJyeSA/IFBBUlRJQUxfUklHSFRfRkxBRyA6IFBBUlRJQUxfRkxBRyk7XG5cbiAgICAgICAgICAgIGlmICghaXNDdXJyeUJvdW5kKSB7XG4gICAgICAgICAgICAgIGJpdG1hc2sgJj0gfihCSU5EX0ZMQUcgfCBCSU5EX0tFWV9GTEFHKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciBuZXdEYXRhID0gW2Z1bmMsIGJpdG1hc2ssIHRoaXNBcmcsIG5ld1BhcnRpYWxzLCBuZXdzSG9sZGVycywgbmV3UGFydGlhbHNSaWdodCwgbmV3SG9sZGVyc1JpZ2h0LCBuZXdBcmdQb3MsIGFyeSwgbmV3QXJpdHldLFxuICAgICAgICAgICAgICAgIHJlc3VsdCA9IGNyZWF0ZUh5YnJpZFdyYXBwZXIuYXBwbHkodW5kZWZpbmVkLCBuZXdEYXRhKTtcblxuICAgICAgICAgICAgaWYgKGlzTGF6aWFibGUoZnVuYykpIHtcbiAgICAgICAgICAgICAgc2V0RGF0YShyZXN1bHQsIG5ld0RhdGEpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVzdWx0LnBsYWNlaG9sZGVyID0gcGxhY2Vob2xkZXI7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB2YXIgdGhpc0JpbmRpbmcgPSBpc0JpbmQgPyB0aGlzQXJnIDogdGhpcyxcbiAgICAgICAgICAgIGZuID0gaXNCaW5kS2V5ID8gdGhpc0JpbmRpbmdbZnVuY10gOiBmdW5jO1xuXG4gICAgICAgIGlmIChhcmdQb3MpIHtcbiAgICAgICAgICBhcmdzID0gcmVvcmRlcihhcmdzLCBhcmdQb3MpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpc0FyeSAmJiBhcnkgPCBhcmdzLmxlbmd0aCkge1xuICAgICAgICAgIGFyZ3MubGVuZ3RoID0gYXJ5O1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzICYmIHRoaXMgIT09IHJvb3QgJiYgdGhpcyBpbnN0YW5jZW9mIHdyYXBwZXIpIHtcbiAgICAgICAgICBmbiA9IEN0b3IgfHwgY3JlYXRlQ3RvcldyYXBwZXIoZnVuYyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZuLmFwcGx5KHRoaXNCaW5kaW5nLCBhcmdzKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB3cmFwcGVyO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgdGhlIHBhZGRpbmcgcmVxdWlyZWQgZm9yIGBzdHJpbmdgIGJhc2VkIG9uIHRoZSBnaXZlbiBgbGVuZ3RoYC5cbiAgICAgKiBUaGUgYGNoYXJzYCBzdHJpbmcgaXMgdHJ1bmNhdGVkIGlmIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBleGNlZWRzIGBsZW5ndGhgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyaW5nIFRoZSBzdHJpbmcgdG8gY3JlYXRlIHBhZGRpbmcgZm9yLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbbGVuZ3RoPTBdIFRoZSBwYWRkaW5nIGxlbmd0aC5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW2NoYXJzPScgJ10gVGhlIHN0cmluZyB1c2VkIGFzIHBhZGRpbmcuXG4gICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgcGFkIGZvciBgc3RyaW5nYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGVQYWRkaW5nKHN0cmluZywgbGVuZ3RoLCBjaGFycykge1xuICAgICAgdmFyIHN0ckxlbmd0aCA9IHN0cmluZy5sZW5ndGg7XG4gICAgICBsZW5ndGggPSArbGVuZ3RoO1xuXG4gICAgICBpZiAoc3RyTGVuZ3RoID49IGxlbmd0aCB8fCAhbmF0aXZlSXNGaW5pdGUobGVuZ3RoKSkge1xuICAgICAgICByZXR1cm4gJyc7XG4gICAgICB9XG4gICAgICB2YXIgcGFkTGVuZ3RoID0gbGVuZ3RoIC0gc3RyTGVuZ3RoO1xuICAgICAgY2hhcnMgPSBjaGFycyA9PSBudWxsID8gJyAnIDogKGNoYXJzICsgJycpO1xuICAgICAgcmV0dXJuIHJlcGVhdChjaGFycywgbmF0aXZlQ2VpbChwYWRMZW5ndGggLyBjaGFycy5sZW5ndGgpKS5zbGljZSgwLCBwYWRMZW5ndGgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IHdyYXBzIGBmdW5jYCBhbmQgaW52b2tlcyBpdCB3aXRoIHRoZSBvcHRpb25hbCBgdGhpc2BcbiAgICAgKiBiaW5kaW5nIG9mIGB0aGlzQXJnYCBhbmQgdGhlIGBwYXJ0aWFsc2AgcHJlcGVuZGVkIHRvIHRob3NlIHByb3ZpZGVkIHRvXG4gICAgICogdGhlIHdyYXBwZXIuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIHBhcnRpYWxseSBhcHBseSBhcmd1bWVudHMgdG8uXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGJpdG1hc2sgVGhlIGJpdG1hc2sgb2YgZmxhZ3MuIFNlZSBgY3JlYXRlV3JhcHBlcmAgZm9yIG1vcmUgZGV0YWlscy5cbiAgICAgKiBAcGFyYW0geyp9IHRoaXNBcmcgVGhlIGB0aGlzYCBiaW5kaW5nIG9mIGBmdW5jYC5cbiAgICAgKiBAcGFyYW0ge0FycmF5fSBwYXJ0aWFscyBUaGUgYXJndW1lbnRzIHRvIHByZXBlbmQgdG8gdGhvc2UgcHJvdmlkZWQgdG8gdGhlIG5ldyBmdW5jdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBib3VuZCBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGVQYXJ0aWFsV3JhcHBlcihmdW5jLCBiaXRtYXNrLCB0aGlzQXJnLCBwYXJ0aWFscykge1xuICAgICAgdmFyIGlzQmluZCA9IGJpdG1hc2sgJiBCSU5EX0ZMQUcsXG4gICAgICAgICAgQ3RvciA9IGNyZWF0ZUN0b3JXcmFwcGVyKGZ1bmMpO1xuXG4gICAgICBmdW5jdGlvbiB3cmFwcGVyKCkge1xuICAgICAgICAvLyBBdm9pZCBgYXJndW1lbnRzYCBvYmplY3QgdXNlIGRpc3F1YWxpZnlpbmcgb3B0aW1pemF0aW9ucyBieVxuICAgICAgICAvLyBjb252ZXJ0aW5nIGl0IHRvIGFuIGFycmF5IGJlZm9yZSBwcm92aWRpbmcgaXQgYGZ1bmNgLlxuICAgICAgICB2YXIgYXJnc0luZGV4ID0gLTEsXG4gICAgICAgICAgICBhcmdzTGVuZ3RoID0gYXJndW1lbnRzLmxlbmd0aCxcbiAgICAgICAgICAgIGxlZnRJbmRleCA9IC0xLFxuICAgICAgICAgICAgbGVmdExlbmd0aCA9IHBhcnRpYWxzLmxlbmd0aCxcbiAgICAgICAgICAgIGFyZ3MgPSBBcnJheShsZWZ0TGVuZ3RoICsgYXJnc0xlbmd0aCk7XG5cbiAgICAgICAgd2hpbGUgKCsrbGVmdEluZGV4IDwgbGVmdExlbmd0aCkge1xuICAgICAgICAgIGFyZ3NbbGVmdEluZGV4XSA9IHBhcnRpYWxzW2xlZnRJbmRleF07XG4gICAgICAgIH1cbiAgICAgICAgd2hpbGUgKGFyZ3NMZW5ndGgtLSkge1xuICAgICAgICAgIGFyZ3NbbGVmdEluZGV4KytdID0gYXJndW1lbnRzWysrYXJnc0luZGV4XTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgZm4gPSAodGhpcyAmJiB0aGlzICE9PSByb290ICYmIHRoaXMgaW5zdGFuY2VvZiB3cmFwcGVyKSA/IEN0b3IgOiBmdW5jO1xuICAgICAgICByZXR1cm4gZm4uYXBwbHkoaXNCaW5kID8gdGhpc0FyZyA6IHRoaXMsIGFyZ3MpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHdyYXBwZXI7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGBfLmNlaWxgLCBgXy5mbG9vcmAsIG9yIGBfLnJvdW5kYCBmdW5jdGlvbi5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IG1ldGhvZE5hbWUgVGhlIG5hbWUgb2YgdGhlIGBNYXRoYCBtZXRob2QgdG8gdXNlIHdoZW4gcm91bmRpbmcuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgcm91bmQgZnVuY3Rpb24uXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlUm91bmQobWV0aG9kTmFtZSkge1xuICAgICAgdmFyIGZ1bmMgPSBNYXRoW21ldGhvZE5hbWVdO1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uKG51bWJlciwgcHJlY2lzaW9uKSB7XG4gICAgICAgIHByZWNpc2lvbiA9IHByZWNpc2lvbiA9PT0gdW5kZWZpbmVkID8gMCA6ICgrcHJlY2lzaW9uIHx8IDApO1xuICAgICAgICBpZiAocHJlY2lzaW9uKSB7XG4gICAgICAgICAgcHJlY2lzaW9uID0gcG93KDEwLCBwcmVjaXNpb24pO1xuICAgICAgICAgIHJldHVybiBmdW5jKG51bWJlciAqIHByZWNpc2lvbikgLyBwcmVjaXNpb247XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZ1bmMobnVtYmVyKTtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGBfLnNvcnRlZEluZGV4YCBvciBgXy5zb3J0ZWRMYXN0SW5kZXhgIGZ1bmN0aW9uLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtyZXRIaWdoZXN0XSBTcGVjaWZ5IHJldHVybmluZyB0aGUgaGlnaGVzdCBxdWFsaWZpZWQgaW5kZXguXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgaW5kZXggZnVuY3Rpb24uXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlU29ydGVkSW5kZXgocmV0SGlnaGVzdCkge1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uKGFycmF5LCB2YWx1ZSwgaXRlcmF0ZWUsIHRoaXNBcmcpIHtcbiAgICAgICAgdmFyIGNhbGxiYWNrID0gZ2V0Q2FsbGJhY2soaXRlcmF0ZWUpO1xuICAgICAgICByZXR1cm4gKGl0ZXJhdGVlID09IG51bGwgJiYgY2FsbGJhY2sgPT09IGJhc2VDYWxsYmFjaylcbiAgICAgICAgICA/IGJpbmFyeUluZGV4KGFycmF5LCB2YWx1ZSwgcmV0SGlnaGVzdClcbiAgICAgICAgICA6IGJpbmFyeUluZGV4QnkoYXJyYXksIHZhbHVlLCBjYWxsYmFjayhpdGVyYXRlZSwgdGhpc0FyZywgMSksIHJldEhpZ2hlc3QpO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCBlaXRoZXIgY3VycmllcyBvciBpbnZva2VzIGBmdW5jYCB3aXRoIG9wdGlvbmFsXG4gICAgICogYHRoaXNgIGJpbmRpbmcgYW5kIHBhcnRpYWxseSBhcHBsaWVkIGFyZ3VtZW50cy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbnxzdHJpbmd9IGZ1bmMgVGhlIGZ1bmN0aW9uIG9yIG1ldGhvZCBuYW1lIHRvIHJlZmVyZW5jZS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gYml0bWFzayBUaGUgYml0bWFzayBvZiBmbGFncy5cbiAgICAgKiAgVGhlIGJpdG1hc2sgbWF5IGJlIGNvbXBvc2VkIG9mIHRoZSBmb2xsb3dpbmcgZmxhZ3M6XG4gICAgICogICAgIDEgLSBgXy5iaW5kYFxuICAgICAqICAgICAyIC0gYF8uYmluZEtleWBcbiAgICAgKiAgICAgNCAtIGBfLmN1cnJ5YCBvciBgXy5jdXJyeVJpZ2h0YCBvZiBhIGJvdW5kIGZ1bmN0aW9uXG4gICAgICogICAgIDggLSBgXy5jdXJyeWBcbiAgICAgKiAgICAxNiAtIGBfLmN1cnJ5UmlnaHRgXG4gICAgICogICAgMzIgLSBgXy5wYXJ0aWFsYFxuICAgICAqICAgIDY0IC0gYF8ucGFydGlhbFJpZ2h0YFxuICAgICAqICAgMTI4IC0gYF8ucmVhcmdgXG4gICAgICogICAyNTYgLSBgXy5hcnlgXG4gICAgICogQHBhcmFtIHsqfSBbdGhpc0FyZ10gVGhlIGB0aGlzYCBiaW5kaW5nIG9mIGBmdW5jYC5cbiAgICAgKiBAcGFyYW0ge0FycmF5fSBbcGFydGlhbHNdIFRoZSBhcmd1bWVudHMgdG8gYmUgcGFydGlhbGx5IGFwcGxpZWQuXG4gICAgICogQHBhcmFtIHtBcnJheX0gW2hvbGRlcnNdIFRoZSBgcGFydGlhbHNgIHBsYWNlaG9sZGVyIGluZGV4ZXMuXG4gICAgICogQHBhcmFtIHtBcnJheX0gW2FyZ1Bvc10gVGhlIGFyZ3VtZW50IHBvc2l0aW9ucyBvZiB0aGUgbmV3IGZ1bmN0aW9uLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbYXJ5XSBUaGUgYXJpdHkgY2FwIG9mIGBmdW5jYC5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW2FyaXR5XSBUaGUgYXJpdHkgb2YgYGZ1bmNgLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IHdyYXBwZWQgZnVuY3Rpb24uXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlV3JhcHBlcihmdW5jLCBiaXRtYXNrLCB0aGlzQXJnLCBwYXJ0aWFscywgaG9sZGVycywgYXJnUG9zLCBhcnksIGFyaXR5KSB7XG4gICAgICB2YXIgaXNCaW5kS2V5ID0gYml0bWFzayAmIEJJTkRfS0VZX0ZMQUc7XG4gICAgICBpZiAoIWlzQmluZEtleSAmJiB0eXBlb2YgZnVuYyAhPSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoRlVOQ19FUlJPUl9URVhUKTtcbiAgICAgIH1cbiAgICAgIHZhciBsZW5ndGggPSBwYXJ0aWFscyA/IHBhcnRpYWxzLmxlbmd0aCA6IDA7XG4gICAgICBpZiAoIWxlbmd0aCkge1xuICAgICAgICBiaXRtYXNrICY9IH4oUEFSVElBTF9GTEFHIHwgUEFSVElBTF9SSUdIVF9GTEFHKTtcbiAgICAgICAgcGFydGlhbHMgPSBob2xkZXJzID0gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgICAgbGVuZ3RoIC09IChob2xkZXJzID8gaG9sZGVycy5sZW5ndGggOiAwKTtcbiAgICAgIGlmIChiaXRtYXNrICYgUEFSVElBTF9SSUdIVF9GTEFHKSB7XG4gICAgICAgIHZhciBwYXJ0aWFsc1JpZ2h0ID0gcGFydGlhbHMsXG4gICAgICAgICAgICBob2xkZXJzUmlnaHQgPSBob2xkZXJzO1xuXG4gICAgICAgIHBhcnRpYWxzID0gaG9sZGVycyA9IHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICAgIHZhciBkYXRhID0gaXNCaW5kS2V5ID8gdW5kZWZpbmVkIDogZ2V0RGF0YShmdW5jKSxcbiAgICAgICAgICBuZXdEYXRhID0gW2Z1bmMsIGJpdG1hc2ssIHRoaXNBcmcsIHBhcnRpYWxzLCBob2xkZXJzLCBwYXJ0aWFsc1JpZ2h0LCBob2xkZXJzUmlnaHQsIGFyZ1BvcywgYXJ5LCBhcml0eV07XG5cbiAgICAgIGlmIChkYXRhKSB7XG4gICAgICAgIG1lcmdlRGF0YShuZXdEYXRhLCBkYXRhKTtcbiAgICAgICAgYml0bWFzayA9IG5ld0RhdGFbMV07XG4gICAgICAgIGFyaXR5ID0gbmV3RGF0YVs5XTtcbiAgICAgIH1cbiAgICAgIG5ld0RhdGFbOV0gPSBhcml0eSA9PSBudWxsXG4gICAgICAgID8gKGlzQmluZEtleSA/IDAgOiBmdW5jLmxlbmd0aClcbiAgICAgICAgOiAobmF0aXZlTWF4KGFyaXR5IC0gbGVuZ3RoLCAwKSB8fCAwKTtcblxuICAgICAgaWYgKGJpdG1hc2sgPT0gQklORF9GTEFHKSB7XG4gICAgICAgIHZhciByZXN1bHQgPSBjcmVhdGVCaW5kV3JhcHBlcihuZXdEYXRhWzBdLCBuZXdEYXRhWzJdKTtcbiAgICAgIH0gZWxzZSBpZiAoKGJpdG1hc2sgPT0gUEFSVElBTF9GTEFHIHx8IGJpdG1hc2sgPT0gKEJJTkRfRkxBRyB8IFBBUlRJQUxfRkxBRykpICYmICFuZXdEYXRhWzRdLmxlbmd0aCkge1xuICAgICAgICByZXN1bHQgPSBjcmVhdGVQYXJ0aWFsV3JhcHBlci5hcHBseSh1bmRlZmluZWQsIG5ld0RhdGEpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzdWx0ID0gY3JlYXRlSHlicmlkV3JhcHBlci5hcHBseSh1bmRlZmluZWQsIG5ld0RhdGEpO1xuICAgICAgfVxuICAgICAgdmFyIHNldHRlciA9IGRhdGEgPyBiYXNlU2V0RGF0YSA6IHNldERhdGE7XG4gICAgICByZXR1cm4gc2V0dGVyKHJlc3VsdCwgbmV3RGF0YSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBiYXNlSXNFcXVhbERlZXBgIGZvciBhcnJheXMgd2l0aCBzdXBwb3J0IGZvclxuICAgICAqIHBhcnRpYWwgZGVlcCBjb21wYXJpc29ucy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGNvbXBhcmUuXG4gICAgICogQHBhcmFtIHtBcnJheX0gb3RoZXIgVGhlIG90aGVyIGFycmF5IHRvIGNvbXBhcmUuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZXF1YWxGdW5jIFRoZSBmdW5jdGlvbiB0byBkZXRlcm1pbmUgZXF1aXZhbGVudHMgb2YgdmFsdWVzLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtjdXN0b21pemVyXSBUaGUgZnVuY3Rpb24gdG8gY3VzdG9taXplIGNvbXBhcmluZyBhcnJheXMuXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbaXNMb29zZV0gU3BlY2lmeSBwZXJmb3JtaW5nIHBhcnRpYWwgY29tcGFyaXNvbnMuXG4gICAgICogQHBhcmFtIHtBcnJheX0gW3N0YWNrQV0gVHJhY2tzIHRyYXZlcnNlZCBgdmFsdWVgIG9iamVjdHMuXG4gICAgICogQHBhcmFtIHtBcnJheX0gW3N0YWNrQl0gVHJhY2tzIHRyYXZlcnNlZCBgb3RoZXJgIG9iamVjdHMuXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIHRoZSBhcnJheXMgYXJlIGVxdWl2YWxlbnQsIGVsc2UgYGZhbHNlYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBlcXVhbEFycmF5cyhhcnJheSwgb3RoZXIsIGVxdWFsRnVuYywgY3VzdG9taXplciwgaXNMb29zZSwgc3RhY2tBLCBzdGFja0IpIHtcbiAgICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICAgIGFyckxlbmd0aCA9IGFycmF5Lmxlbmd0aCxcbiAgICAgICAgICBvdGhMZW5ndGggPSBvdGhlci5sZW5ndGg7XG5cbiAgICAgIGlmIChhcnJMZW5ndGggIT0gb3RoTGVuZ3RoICYmICEoaXNMb29zZSAmJiBvdGhMZW5ndGggPiBhcnJMZW5ndGgpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIC8vIElnbm9yZSBub24taW5kZXggcHJvcGVydGllcy5cbiAgICAgIHdoaWxlICgrK2luZGV4IDwgYXJyTGVuZ3RoKSB7XG4gICAgICAgIHZhciBhcnJWYWx1ZSA9IGFycmF5W2luZGV4XSxcbiAgICAgICAgICAgIG90aFZhbHVlID0gb3RoZXJbaW5kZXhdLFxuICAgICAgICAgICAgcmVzdWx0ID0gY3VzdG9taXplciA/IGN1c3RvbWl6ZXIoaXNMb29zZSA/IG90aFZhbHVlIDogYXJyVmFsdWUsIGlzTG9vc2UgPyBhcnJWYWx1ZSA6IG90aFZhbHVlLCBpbmRleCkgOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgaWYgKHJlc3VsdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICAvLyBSZWN1cnNpdmVseSBjb21wYXJlIGFycmF5cyAoc3VzY2VwdGlibGUgdG8gY2FsbCBzdGFjayBsaW1pdHMpLlxuICAgICAgICBpZiAoaXNMb29zZSkge1xuICAgICAgICAgIGlmICghYXJyYXlTb21lKG90aGVyLCBmdW5jdGlvbihvdGhWYWx1ZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBhcnJWYWx1ZSA9PT0gb3RoVmFsdWUgfHwgZXF1YWxGdW5jKGFyclZhbHVlLCBvdGhWYWx1ZSwgY3VzdG9taXplciwgaXNMb29zZSwgc3RhY2tBLCBzdGFja0IpO1xuICAgICAgICAgICAgICB9KSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmICghKGFyclZhbHVlID09PSBvdGhWYWx1ZSB8fCBlcXVhbEZ1bmMoYXJyVmFsdWUsIG90aFZhbHVlLCBjdXN0b21pemVyLCBpc0xvb3NlLCBzdGFja0EsIHN0YWNrQikpKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYGJhc2VJc0VxdWFsRGVlcGAgZm9yIGNvbXBhcmluZyBvYmplY3RzIG9mXG4gICAgICogdGhlIHNhbWUgYHRvU3RyaW5nVGFnYC5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGlzIGZ1bmN0aW9uIG9ubHkgc3VwcG9ydHMgY29tcGFyaW5nIHZhbHVlcyB3aXRoIHRhZ3Mgb2ZcbiAgICAgKiBgQm9vbGVhbmAsIGBEYXRlYCwgYEVycm9yYCwgYE51bWJlcmAsIGBSZWdFeHBgLCBvciBgU3RyaW5nYC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGNvbXBhcmUuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG90aGVyIFRoZSBvdGhlciBvYmplY3QgdG8gY29tcGFyZS5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdGFnIFRoZSBgdG9TdHJpbmdUYWdgIG9mIHRoZSBvYmplY3RzIHRvIGNvbXBhcmUuXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIHRoZSBvYmplY3RzIGFyZSBlcXVpdmFsZW50LCBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gZXF1YWxCeVRhZyhvYmplY3QsIG90aGVyLCB0YWcpIHtcbiAgICAgIHN3aXRjaCAodGFnKSB7XG4gICAgICAgIGNhc2UgYm9vbFRhZzpcbiAgICAgICAgY2FzZSBkYXRlVGFnOlxuICAgICAgICAgIC8vIENvZXJjZSBkYXRlcyBhbmQgYm9vbGVhbnMgdG8gbnVtYmVycywgZGF0ZXMgdG8gbWlsbGlzZWNvbmRzIGFuZCBib29sZWFuc1xuICAgICAgICAgIC8vIHRvIGAxYCBvciBgMGAgdHJlYXRpbmcgaW52YWxpZCBkYXRlcyBjb2VyY2VkIHRvIGBOYU5gIGFzIG5vdCBlcXVhbC5cbiAgICAgICAgICByZXR1cm4gK29iamVjdCA9PSArb3RoZXI7XG5cbiAgICAgICAgY2FzZSBlcnJvclRhZzpcbiAgICAgICAgICByZXR1cm4gb2JqZWN0Lm5hbWUgPT0gb3RoZXIubmFtZSAmJiBvYmplY3QubWVzc2FnZSA9PSBvdGhlci5tZXNzYWdlO1xuXG4gICAgICAgIGNhc2UgbnVtYmVyVGFnOlxuICAgICAgICAgIC8vIFRyZWF0IGBOYU5gIHZzLiBgTmFOYCBhcyBlcXVhbC5cbiAgICAgICAgICByZXR1cm4gKG9iamVjdCAhPSArb2JqZWN0KVxuICAgICAgICAgICAgPyBvdGhlciAhPSArb3RoZXJcbiAgICAgICAgICAgIDogb2JqZWN0ID09ICtvdGhlcjtcblxuICAgICAgICBjYXNlIHJlZ2V4cFRhZzpcbiAgICAgICAgY2FzZSBzdHJpbmdUYWc6XG4gICAgICAgICAgLy8gQ29lcmNlIHJlZ2V4ZXMgdG8gc3RyaW5ncyBhbmQgdHJlYXQgc3RyaW5ncyBwcmltaXRpdmVzIGFuZCBzdHJpbmdcbiAgICAgICAgICAvLyBvYmplY3RzIGFzIGVxdWFsLiBTZWUgaHR0cHM6Ly9lczUuZ2l0aHViLmlvLyN4MTUuMTAuNi40IGZvciBtb3JlIGRldGFpbHMuXG4gICAgICAgICAgcmV0dXJuIG9iamVjdCA9PSAob3RoZXIgKyAnJyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBiYXNlSXNFcXVhbERlZXBgIGZvciBvYmplY3RzIHdpdGggc3VwcG9ydCBmb3JcbiAgICAgKiBwYXJ0aWFsIGRlZXAgY29tcGFyaXNvbnMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBjb21wYXJlLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvdGhlciBUaGUgb3RoZXIgb2JqZWN0IHRvIGNvbXBhcmUuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZXF1YWxGdW5jIFRoZSBmdW5jdGlvbiB0byBkZXRlcm1pbmUgZXF1aXZhbGVudHMgb2YgdmFsdWVzLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtjdXN0b21pemVyXSBUaGUgZnVuY3Rpb24gdG8gY3VzdG9taXplIGNvbXBhcmluZyB2YWx1ZXMuXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbaXNMb29zZV0gU3BlY2lmeSBwZXJmb3JtaW5nIHBhcnRpYWwgY29tcGFyaXNvbnMuXG4gICAgICogQHBhcmFtIHtBcnJheX0gW3N0YWNrQV0gVHJhY2tzIHRyYXZlcnNlZCBgdmFsdWVgIG9iamVjdHMuXG4gICAgICogQHBhcmFtIHtBcnJheX0gW3N0YWNrQl0gVHJhY2tzIHRyYXZlcnNlZCBgb3RoZXJgIG9iamVjdHMuXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIHRoZSBvYmplY3RzIGFyZSBlcXVpdmFsZW50LCBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gZXF1YWxPYmplY3RzKG9iamVjdCwgb3RoZXIsIGVxdWFsRnVuYywgY3VzdG9taXplciwgaXNMb29zZSwgc3RhY2tBLCBzdGFja0IpIHtcbiAgICAgIHZhciBvYmpQcm9wcyA9IGtleXMob2JqZWN0KSxcbiAgICAgICAgICBvYmpMZW5ndGggPSBvYmpQcm9wcy5sZW5ndGgsXG4gICAgICAgICAgb3RoUHJvcHMgPSBrZXlzKG90aGVyKSxcbiAgICAgICAgICBvdGhMZW5ndGggPSBvdGhQcm9wcy5sZW5ndGg7XG5cbiAgICAgIGlmIChvYmpMZW5ndGggIT0gb3RoTGVuZ3RoICYmICFpc0xvb3NlKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHZhciBpbmRleCA9IG9iakxlbmd0aDtcbiAgICAgIHdoaWxlIChpbmRleC0tKSB7XG4gICAgICAgIHZhciBrZXkgPSBvYmpQcm9wc1tpbmRleF07XG4gICAgICAgIGlmICghKGlzTG9vc2UgPyBrZXkgaW4gb3RoZXIgOiBoYXNPd25Qcm9wZXJ0eS5jYWxsKG90aGVyLCBrZXkpKSkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdmFyIHNraXBDdG9yID0gaXNMb29zZTtcbiAgICAgIHdoaWxlICgrK2luZGV4IDwgb2JqTGVuZ3RoKSB7XG4gICAgICAgIGtleSA9IG9ialByb3BzW2luZGV4XTtcbiAgICAgICAgdmFyIG9ialZhbHVlID0gb2JqZWN0W2tleV0sXG4gICAgICAgICAgICBvdGhWYWx1ZSA9IG90aGVyW2tleV0sXG4gICAgICAgICAgICByZXN1bHQgPSBjdXN0b21pemVyID8gY3VzdG9taXplcihpc0xvb3NlID8gb3RoVmFsdWUgOiBvYmpWYWx1ZSwgaXNMb29zZT8gb2JqVmFsdWUgOiBvdGhWYWx1ZSwga2V5KSA6IHVuZGVmaW5lZDtcblxuICAgICAgICAvLyBSZWN1cnNpdmVseSBjb21wYXJlIG9iamVjdHMgKHN1c2NlcHRpYmxlIHRvIGNhbGwgc3RhY2sgbGltaXRzKS5cbiAgICAgICAgaWYgKCEocmVzdWx0ID09PSB1bmRlZmluZWQgPyBlcXVhbEZ1bmMob2JqVmFsdWUsIG90aFZhbHVlLCBjdXN0b21pemVyLCBpc0xvb3NlLCBzdGFja0EsIHN0YWNrQikgOiByZXN1bHQpKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHNraXBDdG9yIHx8IChza2lwQ3RvciA9IGtleSA9PSAnY29uc3RydWN0b3InKTtcbiAgICAgIH1cbiAgICAgIGlmICghc2tpcEN0b3IpIHtcbiAgICAgICAgdmFyIG9iakN0b3IgPSBvYmplY3QuY29uc3RydWN0b3IsXG4gICAgICAgICAgICBvdGhDdG9yID0gb3RoZXIuY29uc3RydWN0b3I7XG5cbiAgICAgICAgLy8gTm9uIGBPYmplY3RgIG9iamVjdCBpbnN0YW5jZXMgd2l0aCBkaWZmZXJlbnQgY29uc3RydWN0b3JzIGFyZSBub3QgZXF1YWwuXG4gICAgICAgIGlmIChvYmpDdG9yICE9IG90aEN0b3IgJiZcbiAgICAgICAgICAgICgnY29uc3RydWN0b3InIGluIG9iamVjdCAmJiAnY29uc3RydWN0b3InIGluIG90aGVyKSAmJlxuICAgICAgICAgICAgISh0eXBlb2Ygb2JqQ3RvciA9PSAnZnVuY3Rpb24nICYmIG9iakN0b3IgaW5zdGFuY2VvZiBvYmpDdG9yICYmXG4gICAgICAgICAgICAgIHR5cGVvZiBvdGhDdG9yID09ICdmdW5jdGlvbicgJiYgb3RoQ3RvciBpbnN0YW5jZW9mIG90aEN0b3IpKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBhcHByb3ByaWF0ZSBcImNhbGxiYWNrXCIgZnVuY3Rpb24uIElmIHRoZSBgXy5jYWxsYmFja2AgbWV0aG9kIGlzXG4gICAgICogY3VzdG9taXplZCB0aGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIGN1c3RvbSBtZXRob2QsIG90aGVyd2lzZSBpdCByZXR1cm5zXG4gICAgICogdGhlIGBiYXNlQ2FsbGJhY2tgIGZ1bmN0aW9uLiBJZiBhcmd1bWVudHMgYXJlIHByb3ZpZGVkIHRoZSBjaG9zZW4gZnVuY3Rpb25cbiAgICAgKiBpcyBpbnZva2VkIHdpdGggdGhlbSBhbmQgaXRzIHJlc3VsdCBpcyByZXR1cm5lZC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBjaG9zZW4gZnVuY3Rpb24gb3IgaXRzIHJlc3VsdC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBnZXRDYWxsYmFjayhmdW5jLCB0aGlzQXJnLCBhcmdDb3VudCkge1xuICAgICAgdmFyIHJlc3VsdCA9IGxvZGFzaC5jYWxsYmFjayB8fCBjYWxsYmFjaztcbiAgICAgIHJlc3VsdCA9IHJlc3VsdCA9PT0gY2FsbGJhY2sgPyBiYXNlQ2FsbGJhY2sgOiByZXN1bHQ7XG4gICAgICByZXR1cm4gYXJnQ291bnQgPyByZXN1bHQoZnVuYywgdGhpc0FyZywgYXJnQ291bnQpIDogcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgbWV0YWRhdGEgZm9yIGBmdW5jYC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gcXVlcnkuXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIG1ldGFkYXRhIGZvciBgZnVuY2AuXG4gICAgICovXG4gICAgdmFyIGdldERhdGEgPSAhbWV0YU1hcCA/IG5vb3AgOiBmdW5jdGlvbihmdW5jKSB7XG4gICAgICByZXR1cm4gbWV0YU1hcC5nZXQoZnVuYyk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIG5hbWUgb2YgYGZ1bmNgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBxdWVyeS5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBmdW5jdGlvbiBuYW1lLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGdldEZ1bmNOYW1lKGZ1bmMpIHtcbiAgICAgIHZhciByZXN1bHQgPSBmdW5jLm5hbWUsXG4gICAgICAgICAgYXJyYXkgPSByZWFsTmFtZXNbcmVzdWx0XSxcbiAgICAgICAgICBsZW5ndGggPSBhcnJheSA/IGFycmF5Lmxlbmd0aCA6IDA7XG5cbiAgICAgIHdoaWxlIChsZW5ndGgtLSkge1xuICAgICAgICB2YXIgZGF0YSA9IGFycmF5W2xlbmd0aF0sXG4gICAgICAgICAgICBvdGhlckZ1bmMgPSBkYXRhLmZ1bmM7XG4gICAgICAgIGlmIChvdGhlckZ1bmMgPT0gbnVsbCB8fCBvdGhlckZ1bmMgPT0gZnVuYykge1xuICAgICAgICAgIHJldHVybiBkYXRhLm5hbWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgYXBwcm9wcmlhdGUgXCJpbmRleE9mXCIgZnVuY3Rpb24uIElmIHRoZSBgXy5pbmRleE9mYCBtZXRob2QgaXNcbiAgICAgKiBjdXN0b21pemVkIHRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgY3VzdG9tIG1ldGhvZCwgb3RoZXJ3aXNlIGl0IHJldHVybnNcbiAgICAgKiB0aGUgYGJhc2VJbmRleE9mYCBmdW5jdGlvbi4gSWYgYXJndW1lbnRzIGFyZSBwcm92aWRlZCB0aGUgY2hvc2VuIGZ1bmN0aW9uXG4gICAgICogaXMgaW52b2tlZCB3aXRoIHRoZW0gYW5kIGl0cyByZXN1bHQgaXMgcmV0dXJuZWQuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbnxudW1iZXJ9IFJldHVybnMgdGhlIGNob3NlbiBmdW5jdGlvbiBvciBpdHMgcmVzdWx0LlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGdldEluZGV4T2YoY29sbGVjdGlvbiwgdGFyZ2V0LCBmcm9tSW5kZXgpIHtcbiAgICAgIHZhciByZXN1bHQgPSBsb2Rhc2guaW5kZXhPZiB8fCBpbmRleE9mO1xuICAgICAgcmVzdWx0ID0gcmVzdWx0ID09PSBpbmRleE9mID8gYmFzZUluZGV4T2YgOiByZXN1bHQ7XG4gICAgICByZXR1cm4gY29sbGVjdGlvbiA/IHJlc3VsdChjb2xsZWN0aW9uLCB0YXJnZXQsIGZyb21JbmRleCkgOiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgXCJsZW5ndGhcIiBwcm9wZXJ0eSB2YWx1ZSBvZiBgb2JqZWN0YC5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gYXZvaWQgYSBbSklUIGJ1Z10oaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTE0Mjc5MilcbiAgICAgKiB0aGF0IGFmZmVjdHMgU2FmYXJpIG9uIGF0IGxlYXN0IGlPUyA4LjEtOC4zIEFSTTY0LlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIFwibGVuZ3RoXCIgdmFsdWUuXG4gICAgICovXG4gICAgdmFyIGdldExlbmd0aCA9IGJhc2VQcm9wZXJ0eSgnbGVuZ3RoJyk7XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBwcm9wZXJ5IG5hbWVzLCB2YWx1ZXMsIGFuZCBjb21wYXJlIGZsYWdzIG9mIGBvYmplY3RgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBtYXRjaCBkYXRhIG9mIGBvYmplY3RgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGdldE1hdGNoRGF0YShvYmplY3QpIHtcbiAgICAgIHZhciByZXN1bHQgPSBwYWlycyhvYmplY3QpLFxuICAgICAgICAgIGxlbmd0aCA9IHJlc3VsdC5sZW5ndGg7XG5cbiAgICAgIHdoaWxlIChsZW5ndGgtLSkge1xuICAgICAgICByZXN1bHRbbGVuZ3RoXVsyXSA9IGlzU3RyaWN0Q29tcGFyYWJsZShyZXN1bHRbbGVuZ3RoXVsxXSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIG5hdGl2ZSBmdW5jdGlvbiBhdCBga2V5YCBvZiBgb2JqZWN0YC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgbWV0aG9kIHRvIGdldC5cbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgZnVuY3Rpb24gaWYgaXQncyBuYXRpdmUsIGVsc2UgYHVuZGVmaW5lZGAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gZ2V0TmF0aXZlKG9iamVjdCwga2V5KSB7XG4gICAgICB2YXIgdmFsdWUgPSBvYmplY3QgPT0gbnVsbCA/IHVuZGVmaW5lZCA6IG9iamVjdFtrZXldO1xuICAgICAgcmV0dXJuIGlzTmF0aXZlKHZhbHVlKSA/IHZhbHVlIDogdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIHZpZXcsIGFwcGx5aW5nIGFueSBgdHJhbnNmb3Jtc2AgdG8gdGhlIGBzdGFydGAgYW5kIGBlbmRgIHBvc2l0aW9ucy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHN0YXJ0IFRoZSBzdGFydCBvZiB0aGUgdmlldy5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gZW5kIFRoZSBlbmQgb2YgdGhlIHZpZXcuXG4gICAgICogQHBhcmFtIHtBcnJheX0gdHJhbnNmb3JtcyBUaGUgdHJhbnNmb3JtYXRpb25zIHRvIGFwcGx5IHRvIHRoZSB2aWV3LlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYW4gb2JqZWN0IGNvbnRhaW5pbmcgdGhlIGBzdGFydGAgYW5kIGBlbmRgXG4gICAgICogIHBvc2l0aW9ucyBvZiB0aGUgdmlldy5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBnZXRWaWV3KHN0YXJ0LCBlbmQsIHRyYW5zZm9ybXMpIHtcbiAgICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICAgIGxlbmd0aCA9IHRyYW5zZm9ybXMubGVuZ3RoO1xuXG4gICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICB2YXIgZGF0YSA9IHRyYW5zZm9ybXNbaW5kZXhdLFxuICAgICAgICAgICAgc2l6ZSA9IGRhdGEuc2l6ZTtcblxuICAgICAgICBzd2l0Y2ggKGRhdGEudHlwZSkge1xuICAgICAgICAgIGNhc2UgJ2Ryb3AnOiAgICAgIHN0YXJ0ICs9IHNpemU7IGJyZWFrO1xuICAgICAgICAgIGNhc2UgJ2Ryb3BSaWdodCc6IGVuZCAtPSBzaXplOyBicmVhaztcbiAgICAgICAgICBjYXNlICd0YWtlJzogICAgICBlbmQgPSBuYXRpdmVNaW4oZW5kLCBzdGFydCArIHNpemUpOyBicmVhaztcbiAgICAgICAgICBjYXNlICd0YWtlUmlnaHQnOiBzdGFydCA9IG5hdGl2ZU1heChzdGFydCwgZW5kIC0gc2l6ZSk7IGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4geyAnc3RhcnQnOiBzdGFydCwgJ2VuZCc6IGVuZCB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEluaXRpYWxpemVzIGFuIGFycmF5IGNsb25lLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gY2xvbmUuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBpbml0aWFsaXplZCBjbG9uZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpbml0Q2xvbmVBcnJheShhcnJheSkge1xuICAgICAgdmFyIGxlbmd0aCA9IGFycmF5Lmxlbmd0aCxcbiAgICAgICAgICByZXN1bHQgPSBuZXcgYXJyYXkuY29uc3RydWN0b3IobGVuZ3RoKTtcblxuICAgICAgLy8gQWRkIGFycmF5IHByb3BlcnRpZXMgYXNzaWduZWQgYnkgYFJlZ0V4cCNleGVjYC5cbiAgICAgIGlmIChsZW5ndGggJiYgdHlwZW9mIGFycmF5WzBdID09ICdzdHJpbmcnICYmIGhhc093blByb3BlcnR5LmNhbGwoYXJyYXksICdpbmRleCcpKSB7XG4gICAgICAgIHJlc3VsdC5pbmRleCA9IGFycmF5LmluZGV4O1xuICAgICAgICByZXN1bHQuaW5wdXQgPSBhcnJheS5pbnB1dDtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSW5pdGlhbGl6ZXMgYW4gb2JqZWN0IGNsb25lLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gY2xvbmUuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgaW5pdGlhbGl6ZWQgY2xvbmUuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaW5pdENsb25lT2JqZWN0KG9iamVjdCkge1xuICAgICAgdmFyIEN0b3IgPSBvYmplY3QuY29uc3RydWN0b3I7XG4gICAgICBpZiAoISh0eXBlb2YgQ3RvciA9PSAnZnVuY3Rpb24nICYmIEN0b3IgaW5zdGFuY2VvZiBDdG9yKSkge1xuICAgICAgICBDdG9yID0gT2JqZWN0O1xuICAgICAgfVxuICAgICAgcmV0dXJuIG5ldyBDdG9yO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEluaXRpYWxpemVzIGFuIG9iamVjdCBjbG9uZSBiYXNlZCBvbiBpdHMgYHRvU3RyaW5nVGFnYC5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGlzIGZ1bmN0aW9uIG9ubHkgc3VwcG9ydHMgY2xvbmluZyB2YWx1ZXMgd2l0aCB0YWdzIG9mXG4gICAgICogYEJvb2xlYW5gLCBgRGF0ZWAsIGBFcnJvcmAsIGBOdW1iZXJgLCBgUmVnRXhwYCwgb3IgYFN0cmluZ2AuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBjbG9uZS5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdGFnIFRoZSBgdG9TdHJpbmdUYWdgIG9mIHRoZSBvYmplY3QgdG8gY2xvbmUuXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbaXNEZWVwXSBTcGVjaWZ5IGEgZGVlcCBjbG9uZS5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBpbml0aWFsaXplZCBjbG9uZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpbml0Q2xvbmVCeVRhZyhvYmplY3QsIHRhZywgaXNEZWVwKSB7XG4gICAgICB2YXIgQ3RvciA9IG9iamVjdC5jb25zdHJ1Y3RvcjtcbiAgICAgIHN3aXRjaCAodGFnKSB7XG4gICAgICAgIGNhc2UgYXJyYXlCdWZmZXJUYWc6XG4gICAgICAgICAgcmV0dXJuIGJ1ZmZlckNsb25lKG9iamVjdCk7XG5cbiAgICAgICAgY2FzZSBib29sVGFnOlxuICAgICAgICBjYXNlIGRhdGVUYWc6XG4gICAgICAgICAgcmV0dXJuIG5ldyBDdG9yKCtvYmplY3QpO1xuXG4gICAgICAgIGNhc2UgZmxvYXQzMlRhZzogY2FzZSBmbG9hdDY0VGFnOlxuICAgICAgICBjYXNlIGludDhUYWc6IGNhc2UgaW50MTZUYWc6IGNhc2UgaW50MzJUYWc6XG4gICAgICAgIGNhc2UgdWludDhUYWc6IGNhc2UgdWludDhDbGFtcGVkVGFnOiBjYXNlIHVpbnQxNlRhZzogY2FzZSB1aW50MzJUYWc6XG4gICAgICAgICAgdmFyIGJ1ZmZlciA9IG9iamVjdC5idWZmZXI7XG4gICAgICAgICAgcmV0dXJuIG5ldyBDdG9yKGlzRGVlcCA/IGJ1ZmZlckNsb25lKGJ1ZmZlcikgOiBidWZmZXIsIG9iamVjdC5ieXRlT2Zmc2V0LCBvYmplY3QubGVuZ3RoKTtcblxuICAgICAgICBjYXNlIG51bWJlclRhZzpcbiAgICAgICAgY2FzZSBzdHJpbmdUYWc6XG4gICAgICAgICAgcmV0dXJuIG5ldyBDdG9yKG9iamVjdCk7XG5cbiAgICAgICAgY2FzZSByZWdleHBUYWc6XG4gICAgICAgICAgdmFyIHJlc3VsdCA9IG5ldyBDdG9yKG9iamVjdC5zb3VyY2UsIHJlRmxhZ3MuZXhlYyhvYmplY3QpKTtcbiAgICAgICAgICByZXN1bHQubGFzdEluZGV4ID0gb2JqZWN0Lmxhc3RJbmRleDtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSW52b2tlcyB0aGUgbWV0aG9kIGF0IGBwYXRoYCBvbiBgb2JqZWN0YC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICAgICAqIEBwYXJhbSB7QXJyYXl8c3RyaW5nfSBwYXRoIFRoZSBwYXRoIG9mIHRoZSBtZXRob2QgdG8gaW52b2tlLlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFyZ3MgVGhlIGFyZ3VtZW50cyB0byBpbnZva2UgdGhlIG1ldGhvZCB3aXRoLlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSByZXN1bHQgb2YgdGhlIGludm9rZWQgbWV0aG9kLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGludm9rZVBhdGgob2JqZWN0LCBwYXRoLCBhcmdzKSB7XG4gICAgICBpZiAob2JqZWN0ICE9IG51bGwgJiYgIWlzS2V5KHBhdGgsIG9iamVjdCkpIHtcbiAgICAgICAgcGF0aCA9IHRvUGF0aChwYXRoKTtcbiAgICAgICAgb2JqZWN0ID0gcGF0aC5sZW5ndGggPT0gMSA/IG9iamVjdCA6IGJhc2VHZXQob2JqZWN0LCBiYXNlU2xpY2UocGF0aCwgMCwgLTEpKTtcbiAgICAgICAgcGF0aCA9IGxhc3QocGF0aCk7XG4gICAgICB9XG4gICAgICB2YXIgZnVuYyA9IG9iamVjdCA9PSBudWxsID8gb2JqZWN0IDogb2JqZWN0W3BhdGhdO1xuICAgICAgcmV0dXJuIGZ1bmMgPT0gbnVsbCA/IHVuZGVmaW5lZCA6IGZ1bmMuYXBwbHkob2JqZWN0LCBhcmdzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBhcnJheS1saWtlLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhcnJheS1saWtlLCBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNBcnJheUxpa2UodmFsdWUpIHtcbiAgICAgIHJldHVybiB2YWx1ZSAhPSBudWxsICYmIGlzTGVuZ3RoKGdldExlbmd0aCh2YWx1ZSkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGEgdmFsaWQgYXJyYXktbGlrZSBpbmRleC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtsZW5ndGg9TUFYX1NBRkVfSU5URUdFUl0gVGhlIHVwcGVyIGJvdW5kcyBvZiBhIHZhbGlkIGluZGV4LlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgdmFsaWQgaW5kZXgsIGVsc2UgYGZhbHNlYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpc0luZGV4KHZhbHVlLCBsZW5ndGgpIHtcbiAgICAgIHZhbHVlID0gKHR5cGVvZiB2YWx1ZSA9PSAnbnVtYmVyJyB8fCByZUlzVWludC50ZXN0KHZhbHVlKSkgPyArdmFsdWUgOiAtMTtcbiAgICAgIGxlbmd0aCA9IGxlbmd0aCA9PSBudWxsID8gTUFYX1NBRkVfSU5URUdFUiA6IGxlbmd0aDtcbiAgICAgIHJldHVybiB2YWx1ZSA+IC0xICYmIHZhbHVlICUgMSA9PSAwICYmIHZhbHVlIDwgbGVuZ3RoO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiB0aGUgcHJvdmlkZWQgYXJndW1lbnRzIGFyZSBmcm9tIGFuIGl0ZXJhdGVlIGNhbGwuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHBvdGVudGlhbCBpdGVyYXRlZSB2YWx1ZSBhcmd1bWVudC5cbiAgICAgKiBAcGFyYW0geyp9IGluZGV4IFRoZSBwb3RlbnRpYWwgaXRlcmF0ZWUgaW5kZXggb3Iga2V5IGFyZ3VtZW50LlxuICAgICAqIEBwYXJhbSB7Kn0gb2JqZWN0IFRoZSBwb3RlbnRpYWwgaXRlcmF0ZWUgb2JqZWN0IGFyZ3VtZW50LlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgYXJndW1lbnRzIGFyZSBmcm9tIGFuIGl0ZXJhdGVlIGNhbGwsIGVsc2UgYGZhbHNlYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpc0l0ZXJhdGVlQ2FsbCh2YWx1ZSwgaW5kZXgsIG9iamVjdCkge1xuICAgICAgaWYgKCFpc09iamVjdChvYmplY3QpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHZhciB0eXBlID0gdHlwZW9mIGluZGV4O1xuICAgICAgaWYgKHR5cGUgPT0gJ251bWJlcidcbiAgICAgICAgICA/IChpc0FycmF5TGlrZShvYmplY3QpICYmIGlzSW5kZXgoaW5kZXgsIG9iamVjdC5sZW5ndGgpKVxuICAgICAgICAgIDogKHR5cGUgPT0gJ3N0cmluZycgJiYgaW5kZXggaW4gb2JqZWN0KSkge1xuICAgICAgICB2YXIgb3RoZXIgPSBvYmplY3RbaW5kZXhdO1xuICAgICAgICByZXR1cm4gdmFsdWUgPT09IHZhbHVlID8gKHZhbHVlID09PSBvdGhlcikgOiAob3RoZXIgIT09IG90aGVyKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBhIHByb3BlcnR5IG5hbWUgYW5kIG5vdCBhIHByb3BlcnR5IHBhdGguXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbb2JqZWN0XSBUaGUgb2JqZWN0IHRvIHF1ZXJ5IGtleXMgb24uXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBwcm9wZXJ0eSBuYW1lLCBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNLZXkodmFsdWUsIG9iamVjdCkge1xuICAgICAgdmFyIHR5cGUgPSB0eXBlb2YgdmFsdWU7XG4gICAgICBpZiAoKHR5cGUgPT0gJ3N0cmluZycgJiYgcmVJc1BsYWluUHJvcC50ZXN0KHZhbHVlKSkgfHwgdHlwZSA9PSAnbnVtYmVyJykge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIGlmIChpc0FycmF5KHZhbHVlKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICB2YXIgcmVzdWx0ID0gIXJlSXNEZWVwUHJvcC50ZXN0KHZhbHVlKTtcbiAgICAgIHJldHVybiByZXN1bHQgfHwgKG9iamVjdCAhPSBudWxsICYmIHZhbHVlIGluIHRvT2JqZWN0KG9iamVjdCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgZnVuY2AgaGFzIGEgbGF6eSBjb3VudGVycGFydC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGBmdW5jYCBoYXMgYSBsYXp5IGNvdW50ZXJwYXJ0LCBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNMYXppYWJsZShmdW5jKSB7XG4gICAgICB2YXIgZnVuY05hbWUgPSBnZXRGdW5jTmFtZShmdW5jKTtcbiAgICAgIGlmICghKGZ1bmNOYW1lIGluIExhenlXcmFwcGVyLnByb3RvdHlwZSkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgdmFyIG90aGVyID0gbG9kYXNoW2Z1bmNOYW1lXTtcbiAgICAgIGlmIChmdW5jID09PSBvdGhlcikge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIHZhciBkYXRhID0gZ2V0RGF0YShvdGhlcik7XG4gICAgICByZXR1cm4gISFkYXRhICYmIGZ1bmMgPT09IGRhdGFbMF07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgYSB2YWxpZCBhcnJheS1saWtlIGxlbmd0aC5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGlzIGZ1bmN0aW9uIGlzIGJhc2VkIG9uIFtgVG9MZW5ndGhgXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi82LjAvI3NlYy10b2xlbmd0aCkuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgdmFsaWQgbGVuZ3RoLCBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNMZW5ndGgodmFsdWUpIHtcbiAgICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT0gJ251bWJlcicgJiYgdmFsdWUgPiAtMSAmJiB2YWx1ZSAlIDEgPT0gMCAmJiB2YWx1ZSA8PSBNQVhfU0FGRV9JTlRFR0VSO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIHN1aXRhYmxlIGZvciBzdHJpY3QgZXF1YWxpdHkgY29tcGFyaXNvbnMsIGkuZS4gYD09PWAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlmIHN1aXRhYmxlIGZvciBzdHJpY3RcbiAgICAgKiAgZXF1YWxpdHkgY29tcGFyaXNvbnMsIGVsc2UgYGZhbHNlYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpc1N0cmljdENvbXBhcmFibGUodmFsdWUpIHtcbiAgICAgIHJldHVybiB2YWx1ZSA9PT0gdmFsdWUgJiYgIWlzT2JqZWN0KHZhbHVlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBNZXJnZXMgdGhlIGZ1bmN0aW9uIG1ldGFkYXRhIG9mIGBzb3VyY2VgIGludG8gYGRhdGFgLlxuICAgICAqXG4gICAgICogTWVyZ2luZyBtZXRhZGF0YSByZWR1Y2VzIHRoZSBudW1iZXIgb2Ygd3JhcHBlcnMgcmVxdWlyZWQgdG8gaW52b2tlIGEgZnVuY3Rpb24uXG4gICAgICogVGhpcyBpcyBwb3NzaWJsZSBiZWNhdXNlIG1ldGhvZHMgbGlrZSBgXy5iaW5kYCwgYF8uY3VycnlgLCBhbmQgYF8ucGFydGlhbGBcbiAgICAgKiBtYXkgYmUgYXBwbGllZCByZWdhcmRsZXNzIG9mIGV4ZWN1dGlvbiBvcmRlci4gTWV0aG9kcyBsaWtlIGBfLmFyeWAgYW5kIGBfLnJlYXJnYFxuICAgICAqIGF1Z21lbnQgZnVuY3Rpb24gYXJndW1lbnRzLCBtYWtpbmcgdGhlIG9yZGVyIGluIHdoaWNoIHRoZXkgYXJlIGV4ZWN1dGVkIGltcG9ydGFudCxcbiAgICAgKiBwcmV2ZW50aW5nIHRoZSBtZXJnaW5nIG9mIG1ldGFkYXRhLiBIb3dldmVyLCB3ZSBtYWtlIGFuIGV4Y2VwdGlvbiBmb3IgYSBzYWZlXG4gICAgICogY29tbW9uIGNhc2Ugd2hlcmUgY3VycmllZCBmdW5jdGlvbnMgaGF2ZSBgXy5hcnlgIGFuZCBvciBgXy5yZWFyZ2AgYXBwbGllZC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheX0gZGF0YSBUaGUgZGVzdGluYXRpb24gbWV0YWRhdGEuXG4gICAgICogQHBhcmFtIHtBcnJheX0gc291cmNlIFRoZSBzb3VyY2UgbWV0YWRhdGEuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIGBkYXRhYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBtZXJnZURhdGEoZGF0YSwgc291cmNlKSB7XG4gICAgICB2YXIgYml0bWFzayA9IGRhdGFbMV0sXG4gICAgICAgICAgc3JjQml0bWFzayA9IHNvdXJjZVsxXSxcbiAgICAgICAgICBuZXdCaXRtYXNrID0gYml0bWFzayB8IHNyY0JpdG1hc2ssXG4gICAgICAgICAgaXNDb21tb24gPSBuZXdCaXRtYXNrIDwgQVJZX0ZMQUc7XG5cbiAgICAgIHZhciBpc0NvbWJvID1cbiAgICAgICAgKHNyY0JpdG1hc2sgPT0gQVJZX0ZMQUcgJiYgYml0bWFzayA9PSBDVVJSWV9GTEFHKSB8fFxuICAgICAgICAoc3JjQml0bWFzayA9PSBBUllfRkxBRyAmJiBiaXRtYXNrID09IFJFQVJHX0ZMQUcgJiYgZGF0YVs3XS5sZW5ndGggPD0gc291cmNlWzhdKSB8fFxuICAgICAgICAoc3JjQml0bWFzayA9PSAoQVJZX0ZMQUcgfCBSRUFSR19GTEFHKSAmJiBiaXRtYXNrID09IENVUlJZX0ZMQUcpO1xuXG4gICAgICAvLyBFeGl0IGVhcmx5IGlmIG1ldGFkYXRhIGNhbid0IGJlIG1lcmdlZC5cbiAgICAgIGlmICghKGlzQ29tbW9uIHx8IGlzQ29tYm8pKSB7XG4gICAgICAgIHJldHVybiBkYXRhO1xuICAgICAgfVxuICAgICAgLy8gVXNlIHNvdXJjZSBgdGhpc0FyZ2AgaWYgYXZhaWxhYmxlLlxuICAgICAgaWYgKHNyY0JpdG1hc2sgJiBCSU5EX0ZMQUcpIHtcbiAgICAgICAgZGF0YVsyXSA9IHNvdXJjZVsyXTtcbiAgICAgICAgLy8gU2V0IHdoZW4gY3VycnlpbmcgYSBib3VuZCBmdW5jdGlvbi5cbiAgICAgICAgbmV3Qml0bWFzayB8PSAoYml0bWFzayAmIEJJTkRfRkxBRykgPyAwIDogQ1VSUllfQk9VTkRfRkxBRztcbiAgICAgIH1cbiAgICAgIC8vIENvbXBvc2UgcGFydGlhbCBhcmd1bWVudHMuXG4gICAgICB2YXIgdmFsdWUgPSBzb3VyY2VbM107XG4gICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgdmFyIHBhcnRpYWxzID0gZGF0YVszXTtcbiAgICAgICAgZGF0YVszXSA9IHBhcnRpYWxzID8gY29tcG9zZUFyZ3MocGFydGlhbHMsIHZhbHVlLCBzb3VyY2VbNF0pIDogYXJyYXlDb3B5KHZhbHVlKTtcbiAgICAgICAgZGF0YVs0XSA9IHBhcnRpYWxzID8gcmVwbGFjZUhvbGRlcnMoZGF0YVszXSwgUExBQ0VIT0xERVIpIDogYXJyYXlDb3B5KHNvdXJjZVs0XSk7XG4gICAgICB9XG4gICAgICAvLyBDb21wb3NlIHBhcnRpYWwgcmlnaHQgYXJndW1lbnRzLlxuICAgICAgdmFsdWUgPSBzb3VyY2VbNV07XG4gICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgcGFydGlhbHMgPSBkYXRhWzVdO1xuICAgICAgICBkYXRhWzVdID0gcGFydGlhbHMgPyBjb21wb3NlQXJnc1JpZ2h0KHBhcnRpYWxzLCB2YWx1ZSwgc291cmNlWzZdKSA6IGFycmF5Q29weSh2YWx1ZSk7XG4gICAgICAgIGRhdGFbNl0gPSBwYXJ0aWFscyA/IHJlcGxhY2VIb2xkZXJzKGRhdGFbNV0sIFBMQUNFSE9MREVSKSA6IGFycmF5Q29weShzb3VyY2VbNl0pO1xuICAgICAgfVxuICAgICAgLy8gVXNlIHNvdXJjZSBgYXJnUG9zYCBpZiBhdmFpbGFibGUuXG4gICAgICB2YWx1ZSA9IHNvdXJjZVs3XTtcbiAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICBkYXRhWzddID0gYXJyYXlDb3B5KHZhbHVlKTtcbiAgICAgIH1cbiAgICAgIC8vIFVzZSBzb3VyY2UgYGFyeWAgaWYgaXQncyBzbWFsbGVyLlxuICAgICAgaWYgKHNyY0JpdG1hc2sgJiBBUllfRkxBRykge1xuICAgICAgICBkYXRhWzhdID0gZGF0YVs4XSA9PSBudWxsID8gc291cmNlWzhdIDogbmF0aXZlTWluKGRhdGFbOF0sIHNvdXJjZVs4XSk7XG4gICAgICB9XG4gICAgICAvLyBVc2Ugc291cmNlIGBhcml0eWAgaWYgb25lIGlzIG5vdCBwcm92aWRlZC5cbiAgICAgIGlmIChkYXRhWzldID09IG51bGwpIHtcbiAgICAgICAgZGF0YVs5XSA9IHNvdXJjZVs5XTtcbiAgICAgIH1cbiAgICAgIC8vIFVzZSBzb3VyY2UgYGZ1bmNgIGFuZCBtZXJnZSBiaXRtYXNrcy5cbiAgICAgIGRhdGFbMF0gPSBzb3VyY2VbMF07XG4gICAgICBkYXRhWzFdID0gbmV3Qml0bWFzaztcblxuICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXNlZCBieSBgXy5kZWZhdWx0c0RlZXBgIHRvIGN1c3RvbWl6ZSBpdHMgYF8ubWVyZ2VgIHVzZS5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHsqfSBvYmplY3RWYWx1ZSBUaGUgZGVzdGluYXRpb24gb2JqZWN0IHByb3BlcnR5IHZhbHVlLlxuICAgICAqIEBwYXJhbSB7Kn0gc291cmNlVmFsdWUgVGhlIHNvdXJjZSBvYmplY3QgcHJvcGVydHkgdmFsdWUuXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIHZhbHVlIHRvIGFzc2lnbiB0byB0aGUgZGVzdGluYXRpb24gb2JqZWN0LlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIG1lcmdlRGVmYXVsdHMob2JqZWN0VmFsdWUsIHNvdXJjZVZhbHVlKSB7XG4gICAgICByZXR1cm4gb2JqZWN0VmFsdWUgPT09IHVuZGVmaW5lZCA/IHNvdXJjZVZhbHVlIDogbWVyZ2Uob2JqZWN0VmFsdWUsIHNvdXJjZVZhbHVlLCBtZXJnZURlZmF1bHRzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYF8ucGlja2Agd2hpY2ggcGlja3MgYG9iamVjdGAgcHJvcGVydGllcyBzcGVjaWZpZWRcbiAgICAgKiBieSBgcHJvcHNgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBzb3VyY2Ugb2JqZWN0LlxuICAgICAqIEBwYXJhbSB7c3RyaW5nW119IHByb3BzIFRoZSBwcm9wZXJ0eSBuYW1lcyB0byBwaWNrLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIG5ldyBvYmplY3QuXG4gICAgICovXG4gICAgZnVuY3Rpb24gcGlja0J5QXJyYXkob2JqZWN0LCBwcm9wcykge1xuICAgICAgb2JqZWN0ID0gdG9PYmplY3Qob2JqZWN0KTtcblxuICAgICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgICAgbGVuZ3RoID0gcHJvcHMubGVuZ3RoLFxuICAgICAgICAgIHJlc3VsdCA9IHt9O1xuXG4gICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICB2YXIga2V5ID0gcHJvcHNbaW5kZXhdO1xuICAgICAgICBpZiAoa2V5IGluIG9iamVjdCkge1xuICAgICAgICAgIHJlc3VsdFtrZXldID0gb2JqZWN0W2tleV07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBfLnBpY2tgIHdoaWNoIHBpY2tzIGBvYmplY3RgIHByb3BlcnRpZXMgYHByZWRpY2F0ZWBcbiAgICAgKiByZXR1cm5zIHRydXRoeSBmb3IuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIHNvdXJjZSBvYmplY3QuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gcHJlZGljYXRlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgbmV3IG9iamVjdC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBwaWNrQnlDYWxsYmFjayhvYmplY3QsIHByZWRpY2F0ZSkge1xuICAgICAgdmFyIHJlc3VsdCA9IHt9O1xuICAgICAgYmFzZUZvckluKG9iamVjdCwgZnVuY3Rpb24odmFsdWUsIGtleSwgb2JqZWN0KSB7XG4gICAgICAgIGlmIChwcmVkaWNhdGUodmFsdWUsIGtleSwgb2JqZWN0KSkge1xuICAgICAgICAgIHJlc3VsdFtrZXldID0gdmFsdWU7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW9yZGVyIGBhcnJheWAgYWNjb3JkaW5nIHRvIHRoZSBzcGVjaWZpZWQgaW5kZXhlcyB3aGVyZSB0aGUgZWxlbWVudCBhdFxuICAgICAqIHRoZSBmaXJzdCBpbmRleCBpcyBhc3NpZ25lZCBhcyB0aGUgZmlyc3QgZWxlbWVudCwgdGhlIGVsZW1lbnQgYXRcbiAgICAgKiB0aGUgc2Vjb25kIGluZGV4IGlzIGFzc2lnbmVkIGFzIHRoZSBzZWNvbmQgZWxlbWVudCwgYW5kIHNvIG9uLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gcmVvcmRlci5cbiAgICAgKiBAcGFyYW0ge0FycmF5fSBpbmRleGVzIFRoZSBhcnJhbmdlZCBhcnJheSBpbmRleGVzLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyBgYXJyYXlgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHJlb3JkZXIoYXJyYXksIGluZGV4ZXMpIHtcbiAgICAgIHZhciBhcnJMZW5ndGggPSBhcnJheS5sZW5ndGgsXG4gICAgICAgICAgbGVuZ3RoID0gbmF0aXZlTWluKGluZGV4ZXMubGVuZ3RoLCBhcnJMZW5ndGgpLFxuICAgICAgICAgIG9sZEFycmF5ID0gYXJyYXlDb3B5KGFycmF5KTtcblxuICAgICAgd2hpbGUgKGxlbmd0aC0tKSB7XG4gICAgICAgIHZhciBpbmRleCA9IGluZGV4ZXNbbGVuZ3RoXTtcbiAgICAgICAgYXJyYXlbbGVuZ3RoXSA9IGlzSW5kZXgoaW5kZXgsIGFyckxlbmd0aCkgPyBvbGRBcnJheVtpbmRleF0gOiB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gYXJyYXk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyBtZXRhZGF0YSBmb3IgYGZ1bmNgLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIElmIHRoaXMgZnVuY3Rpb24gYmVjb21lcyBob3QsIGkuZS4gaXMgaW52b2tlZCBhIGxvdCBpbiBhIHNob3J0XG4gICAgICogcGVyaW9kIG9mIHRpbWUsIGl0IHdpbGwgdHJpcCBpdHMgYnJlYWtlciBhbmQgdHJhbnNpdGlvbiB0byBhbiBpZGVudGl0eSBmdW5jdGlvblxuICAgICAqIHRvIGF2b2lkIGdhcmJhZ2UgY29sbGVjdGlvbiBwYXVzZXMgaW4gVjguIFNlZSBbVjggaXNzdWUgMjA3MF0oaHR0cHM6Ly9jb2RlLmdvb2dsZS5jb20vcC92OC9pc3N1ZXMvZGV0YWlsP2lkPTIwNzApXG4gICAgICogZm9yIG1vcmUgZGV0YWlscy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gYXNzb2NpYXRlIG1ldGFkYXRhIHdpdGguXG4gICAgICogQHBhcmFtIHsqfSBkYXRhIFRoZSBtZXRhZGF0YS5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgYGZ1bmNgLlxuICAgICAqL1xuICAgIHZhciBzZXREYXRhID0gKGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIGNvdW50ID0gMCxcbiAgICAgICAgICBsYXN0Q2FsbGVkID0gMDtcblxuICAgICAgcmV0dXJuIGZ1bmN0aW9uKGtleSwgdmFsdWUpIHtcbiAgICAgICAgdmFyIHN0YW1wID0gbm93KCksXG4gICAgICAgICAgICByZW1haW5pbmcgPSBIT1RfU1BBTiAtIChzdGFtcCAtIGxhc3RDYWxsZWQpO1xuXG4gICAgICAgIGxhc3RDYWxsZWQgPSBzdGFtcDtcbiAgICAgICAgaWYgKHJlbWFpbmluZyA+IDApIHtcbiAgICAgICAgICBpZiAoKytjb3VudCA+PSBIT1RfQ09VTlQpIHtcbiAgICAgICAgICAgIHJldHVybiBrZXk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvdW50ID0gMDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYmFzZVNldERhdGEoa2V5LCB2YWx1ZSk7XG4gICAgICB9O1xuICAgIH0oKSk7XG5cbiAgICAvKipcbiAgICAgKiBBIGZhbGxiYWNrIGltcGxlbWVudGF0aW9uIG9mIGBPYmplY3Qua2V5c2Agd2hpY2ggY3JlYXRlcyBhbiBhcnJheSBvZiB0aGVcbiAgICAgKiBvd24gZW51bWVyYWJsZSBwcm9wZXJ0eSBuYW1lcyBvZiBgb2JqZWN0YC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgYXJyYXkgb2YgcHJvcGVydHkgbmFtZXMuXG4gICAgICovXG4gICAgZnVuY3Rpb24gc2hpbUtleXMob2JqZWN0KSB7XG4gICAgICB2YXIgcHJvcHMgPSBrZXlzSW4ob2JqZWN0KSxcbiAgICAgICAgICBwcm9wc0xlbmd0aCA9IHByb3BzLmxlbmd0aCxcbiAgICAgICAgICBsZW5ndGggPSBwcm9wc0xlbmd0aCAmJiBvYmplY3QubGVuZ3RoO1xuXG4gICAgICB2YXIgYWxsb3dJbmRleGVzID0gISFsZW5ndGggJiYgaXNMZW5ndGgobGVuZ3RoKSAmJlxuICAgICAgICAoaXNBcnJheShvYmplY3QpIHx8IGlzQXJndW1lbnRzKG9iamVjdCkpO1xuXG4gICAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgICByZXN1bHQgPSBbXTtcblxuICAgICAgd2hpbGUgKCsraW5kZXggPCBwcm9wc0xlbmd0aCkge1xuICAgICAgICB2YXIga2V5ID0gcHJvcHNbaW5kZXhdO1xuICAgICAgICBpZiAoKGFsbG93SW5kZXhlcyAmJiBpc0luZGV4KGtleSwgbGVuZ3RoKSkgfHwgaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIGtleSkpIHtcbiAgICAgICAgICByZXN1bHQucHVzaChrZXkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIGB2YWx1ZWAgdG8gYW4gYXJyYXktbGlrZSBvYmplY3QgaWYgaXQncyBub3Qgb25lLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBwcm9jZXNzLlxuICAgICAqIEByZXR1cm5zIHtBcnJheXxPYmplY3R9IFJldHVybnMgdGhlIGFycmF5LWxpa2Ugb2JqZWN0LlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHRvSXRlcmFibGUodmFsdWUpIHtcbiAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH1cbiAgICAgIGlmICghaXNBcnJheUxpa2UodmFsdWUpKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZXModmFsdWUpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGlzT2JqZWN0KHZhbHVlKSA/IHZhbHVlIDogT2JqZWN0KHZhbHVlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0cyBgdmFsdWVgIHRvIGFuIG9iamVjdCBpZiBpdCdzIG5vdCBvbmUuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHByb2Nlc3MuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgb2JqZWN0LlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHRvT2JqZWN0KHZhbHVlKSB7XG4gICAgICByZXR1cm4gaXNPYmplY3QodmFsdWUpID8gdmFsdWUgOiBPYmplY3QodmFsdWUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIGB2YWx1ZWAgdG8gcHJvcGVydHkgcGF0aCBhcnJheSBpZiBpdCdzIG5vdCBvbmUuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHByb2Nlc3MuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBwcm9wZXJ0eSBwYXRoIGFycmF5LlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHRvUGF0aCh2YWx1ZSkge1xuICAgICAgaWYgKGlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgIH1cbiAgICAgIHZhciByZXN1bHQgPSBbXTtcbiAgICAgIGJhc2VUb1N0cmluZyh2YWx1ZSkucmVwbGFjZShyZVByb3BOYW1lLCBmdW5jdGlvbihtYXRjaCwgbnVtYmVyLCBxdW90ZSwgc3RyaW5nKSB7XG4gICAgICAgIHJlc3VsdC5wdXNoKHF1b3RlID8gc3RyaW5nLnJlcGxhY2UocmVFc2NhcGVDaGFyLCAnJDEnKSA6IChudW1iZXIgfHwgbWF0Y2gpKTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgY2xvbmUgb2YgYHdyYXBwZXJgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gd3JhcHBlciBUaGUgd3JhcHBlciB0byBjbG9uZS5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBjbG9uZWQgd3JhcHBlci5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiB3cmFwcGVyQ2xvbmUod3JhcHBlcikge1xuICAgICAgcmV0dXJuIHdyYXBwZXIgaW5zdGFuY2VvZiBMYXp5V3JhcHBlclxuICAgICAgICA/IHdyYXBwZXIuY2xvbmUoKVxuICAgICAgICA6IG5ldyBMb2Rhc2hXcmFwcGVyKHdyYXBwZXIuX193cmFwcGVkX18sIHdyYXBwZXIuX19jaGFpbl9fLCBhcnJheUNvcHkod3JhcHBlci5fX2FjdGlvbnNfXykpO1xuICAgIH1cblxuICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gYXJyYXkgb2YgZWxlbWVudHMgc3BsaXQgaW50byBncm91cHMgdGhlIGxlbmd0aCBvZiBgc2l6ZWAuXG4gICAgICogSWYgYGNvbGxlY3Rpb25gIGNhbid0IGJlIHNwbGl0IGV2ZW5seSwgdGhlIGZpbmFsIGNodW5rIHdpbGwgYmUgdGhlIHJlbWFpbmluZ1xuICAgICAqIGVsZW1lbnRzLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIHByb2Nlc3MuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtzaXplPTFdIFRoZSBsZW5ndGggb2YgZWFjaCBjaHVuay5cbiAgICAgKiBAcGFyYW0tIHtPYmplY3R9IFtndWFyZF0gRW5hYmxlcyB1c2UgYXMgYSBjYWxsYmFjayBmb3IgZnVuY3Rpb25zIGxpa2UgYF8ubWFwYC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBhcnJheSBjb250YWluaW5nIGNodW5rcy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5jaHVuayhbJ2EnLCAnYicsICdjJywgJ2QnXSwgMik7XG4gICAgICogLy8gPT4gW1snYScsICdiJ10sIFsnYycsICdkJ11dXG4gICAgICpcbiAgICAgKiBfLmNodW5rKFsnYScsICdiJywgJ2MnLCAnZCddLCAzKTtcbiAgICAgKiAvLyA9PiBbWydhJywgJ2InLCAnYyddLCBbJ2QnXV1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjaHVuayhhcnJheSwgc2l6ZSwgZ3VhcmQpIHtcbiAgICAgIGlmIChndWFyZCA/IGlzSXRlcmF0ZWVDYWxsKGFycmF5LCBzaXplLCBndWFyZCkgOiBzaXplID09IG51bGwpIHtcbiAgICAgICAgc2l6ZSA9IDE7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzaXplID0gbmF0aXZlTWF4KG5hdGl2ZUZsb29yKHNpemUpIHx8IDEsIDEpO1xuICAgICAgfVxuICAgICAgdmFyIGluZGV4ID0gMCxcbiAgICAgICAgICBsZW5ndGggPSBhcnJheSA/IGFycmF5Lmxlbmd0aCA6IDAsXG4gICAgICAgICAgcmVzSW5kZXggPSAtMSxcbiAgICAgICAgICByZXN1bHQgPSBBcnJheShuYXRpdmVDZWlsKGxlbmd0aCAvIHNpemUpKTtcblxuICAgICAgd2hpbGUgKGluZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgIHJlc3VsdFsrK3Jlc0luZGV4XSA9IGJhc2VTbGljZShhcnJheSwgaW5kZXgsIChpbmRleCArPSBzaXplKSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gYXJyYXkgd2l0aCBhbGwgZmFsc2V5IHZhbHVlcyByZW1vdmVkLiBUaGUgdmFsdWVzIGBmYWxzZWAsIGBudWxsYCxcbiAgICAgKiBgMGAsIGBcIlwiYCwgYHVuZGVmaW5lZGAsIGFuZCBgTmFOYCBhcmUgZmFsc2V5LlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGNvbXBhY3QuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgYXJyYXkgb2YgZmlsdGVyZWQgdmFsdWVzLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmNvbXBhY3QoWzAsIDEsIGZhbHNlLCAyLCAnJywgM10pO1xuICAgICAqIC8vID0+IFsxLCAyLCAzXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNvbXBhY3QoYXJyYXkpIHtcbiAgICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICAgIGxlbmd0aCA9IGFycmF5ID8gYXJyYXkubGVuZ3RoIDogMCxcbiAgICAgICAgICByZXNJbmRleCA9IC0xLFxuICAgICAgICAgIHJlc3VsdCA9IFtdO1xuXG4gICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICB2YXIgdmFsdWUgPSBhcnJheVtpbmRleF07XG4gICAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICAgIHJlc3VsdFsrK3Jlc0luZGV4XSA9IHZhbHVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gYXJyYXkgb2YgdW5pcXVlIGBhcnJheWAgdmFsdWVzIG5vdCBpbmNsdWRlZCBpbiB0aGUgb3RoZXJcbiAgICAgKiBwcm92aWRlZCBhcnJheXMgdXNpbmcgW2BTYW1lVmFsdWVaZXJvYF0oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNi4wLyNzZWMtc2FtZXZhbHVlemVybylcbiAgICAgKiBmb3IgZXF1YWxpdHkgY29tcGFyaXNvbnMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0gey4uLkFycmF5fSBbdmFsdWVzXSBUaGUgYXJyYXlzIG9mIHZhbHVlcyB0byBleGNsdWRlLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGFycmF5IG9mIGZpbHRlcmVkIHZhbHVlcy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5kaWZmZXJlbmNlKFsxLCAyLCAzXSwgWzQsIDJdKTtcbiAgICAgKiAvLyA9PiBbMSwgM11cbiAgICAgKi9cbiAgICB2YXIgZGlmZmVyZW5jZSA9IHJlc3RQYXJhbShmdW5jdGlvbihhcnJheSwgdmFsdWVzKSB7XG4gICAgICByZXR1cm4gKGlzT2JqZWN0TGlrZShhcnJheSkgJiYgaXNBcnJheUxpa2UoYXJyYXkpKVxuICAgICAgICA/IGJhc2VEaWZmZXJlbmNlKGFycmF5LCBiYXNlRmxhdHRlbih2YWx1ZXMsIGZhbHNlLCB0cnVlKSlcbiAgICAgICAgOiBbXTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBzbGljZSBvZiBgYXJyYXlgIHdpdGggYG5gIGVsZW1lbnRzIGRyb3BwZWQgZnJvbSB0aGUgYmVnaW5uaW5nLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIHF1ZXJ5LlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbbj0xXSBUaGUgbnVtYmVyIG9mIGVsZW1lbnRzIHRvIGRyb3AuXG4gICAgICogQHBhcmFtLSB7T2JqZWN0fSBbZ3VhcmRdIEVuYWJsZXMgdXNlIGFzIGEgY2FsbGJhY2sgZm9yIGZ1bmN0aW9ucyBsaWtlIGBfLm1hcGAuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBzbGljZSBvZiBgYXJyYXlgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmRyb3AoWzEsIDIsIDNdKTtcbiAgICAgKiAvLyA9PiBbMiwgM11cbiAgICAgKlxuICAgICAqIF8uZHJvcChbMSwgMiwgM10sIDIpO1xuICAgICAqIC8vID0+IFszXVxuICAgICAqXG4gICAgICogXy5kcm9wKFsxLCAyLCAzXSwgNSk7XG4gICAgICogLy8gPT4gW11cbiAgICAgKlxuICAgICAqIF8uZHJvcChbMSwgMiwgM10sIDApO1xuICAgICAqIC8vID0+IFsxLCAyLCAzXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGRyb3AoYXJyYXksIG4sIGd1YXJkKSB7XG4gICAgICB2YXIgbGVuZ3RoID0gYXJyYXkgPyBhcnJheS5sZW5ndGggOiAwO1xuICAgICAgaWYgKCFsZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgfVxuICAgICAgaWYgKGd1YXJkID8gaXNJdGVyYXRlZUNhbGwoYXJyYXksIG4sIGd1YXJkKSA6IG4gPT0gbnVsbCkge1xuICAgICAgICBuID0gMTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBiYXNlU2xpY2UoYXJyYXksIG4gPCAwID8gMCA6IG4pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBzbGljZSBvZiBgYXJyYXlgIHdpdGggYG5gIGVsZW1lbnRzIGRyb3BwZWQgZnJvbSB0aGUgZW5kLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIHF1ZXJ5LlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbbj0xXSBUaGUgbnVtYmVyIG9mIGVsZW1lbnRzIHRvIGRyb3AuXG4gICAgICogQHBhcmFtLSB7T2JqZWN0fSBbZ3VhcmRdIEVuYWJsZXMgdXNlIGFzIGEgY2FsbGJhY2sgZm9yIGZ1bmN0aW9ucyBsaWtlIGBfLm1hcGAuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBzbGljZSBvZiBgYXJyYXlgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmRyb3BSaWdodChbMSwgMiwgM10pO1xuICAgICAqIC8vID0+IFsxLCAyXVxuICAgICAqXG4gICAgICogXy5kcm9wUmlnaHQoWzEsIDIsIDNdLCAyKTtcbiAgICAgKiAvLyA9PiBbMV1cbiAgICAgKlxuICAgICAqIF8uZHJvcFJpZ2h0KFsxLCAyLCAzXSwgNSk7XG4gICAgICogLy8gPT4gW11cbiAgICAgKlxuICAgICAqIF8uZHJvcFJpZ2h0KFsxLCAyLCAzXSwgMCk7XG4gICAgICogLy8gPT4gWzEsIDIsIDNdXG4gICAgICovXG4gICAgZnVuY3Rpb24gZHJvcFJpZ2h0KGFycmF5LCBuLCBndWFyZCkge1xuICAgICAgdmFyIGxlbmd0aCA9IGFycmF5ID8gYXJyYXkubGVuZ3RoIDogMDtcbiAgICAgIGlmICghbGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH1cbiAgICAgIGlmIChndWFyZCA/IGlzSXRlcmF0ZWVDYWxsKGFycmF5LCBuLCBndWFyZCkgOiBuID09IG51bGwpIHtcbiAgICAgICAgbiA9IDE7XG4gICAgICB9XG4gICAgICBuID0gbGVuZ3RoIC0gKCtuIHx8IDApO1xuICAgICAgcmV0dXJuIGJhc2VTbGljZShhcnJheSwgMCwgbiA8IDAgPyAwIDogbik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIHNsaWNlIG9mIGBhcnJheWAgZXhjbHVkaW5nIGVsZW1lbnRzIGRyb3BwZWQgZnJvbSB0aGUgZW5kLlxuICAgICAqIEVsZW1lbnRzIGFyZSBkcm9wcGVkIHVudGlsIGBwcmVkaWNhdGVgIHJldHVybnMgZmFsc2V5LiBUaGUgcHJlZGljYXRlIGlzXG4gICAgICogYm91bmQgdG8gYHRoaXNBcmdgIGFuZCBpbnZva2VkIHdpdGggdGhyZWUgYXJndW1lbnRzOiAodmFsdWUsIGluZGV4LCBhcnJheSkuXG4gICAgICpcbiAgICAgKiBJZiBhIHByb3BlcnR5IG5hbWUgaXMgcHJvdmlkZWQgZm9yIGBwcmVkaWNhdGVgIHRoZSBjcmVhdGVkIGBfLnByb3BlcnR5YFxuICAgICAqIHN0eWxlIGNhbGxiYWNrIHJldHVybnMgdGhlIHByb3BlcnR5IHZhbHVlIG9mIHRoZSBnaXZlbiBlbGVtZW50LlxuICAgICAqXG4gICAgICogSWYgYSB2YWx1ZSBpcyBhbHNvIHByb3ZpZGVkIGZvciBgdGhpc0FyZ2AgdGhlIGNyZWF0ZWQgYF8ubWF0Y2hlc1Byb3BlcnR5YFxuICAgICAqIHN0eWxlIGNhbGxiYWNrIHJldHVybnMgYHRydWVgIGZvciBlbGVtZW50cyB0aGF0IGhhdmUgYSBtYXRjaGluZyBwcm9wZXJ0eVxuICAgICAqIHZhbHVlLCBlbHNlIGBmYWxzZWAuXG4gICAgICpcbiAgICAgKiBJZiBhbiBvYmplY3QgaXMgcHJvdmlkZWQgZm9yIGBwcmVkaWNhdGVgIHRoZSBjcmVhdGVkIGBfLm1hdGNoZXNgIHN0eWxlXG4gICAgICogY2FsbGJhY2sgcmV0dXJucyBgdHJ1ZWAgZm9yIGVsZW1lbnRzIHRoYXQgbWF0Y2ggdGhlIHByb3BlcnRpZXMgb2YgdGhlIGdpdmVuXG4gICAgICogb2JqZWN0LCBlbHNlIGBmYWxzZWAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gcXVlcnkuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbnxPYmplY3R8c3RyaW5nfSBbcHJlZGljYXRlPV8uaWRlbnRpdHldIFRoZSBmdW5jdGlvbiBpbnZva2VkXG4gICAgICogIHBlciBpdGVyYXRpb24uXG4gICAgICogQHBhcmFtIHsqfSBbdGhpc0FyZ10gVGhlIGB0aGlzYCBiaW5kaW5nIG9mIGBwcmVkaWNhdGVgLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgc2xpY2Ugb2YgYGFycmF5YC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5kcm9wUmlnaHRXaGlsZShbMSwgMiwgM10sIGZ1bmN0aW9uKG4pIHtcbiAgICAgKiAgIHJldHVybiBuID4gMTtcbiAgICAgKiB9KTtcbiAgICAgKiAvLyA9PiBbMV1cbiAgICAgKlxuICAgICAqIHZhciB1c2VycyA9IFtcbiAgICAgKiAgIHsgJ3VzZXInOiAnYmFybmV5JywgICdhY3RpdmUnOiB0cnVlIH0sXG4gICAgICogICB7ICd1c2VyJzogJ2ZyZWQnLCAgICAnYWN0aXZlJzogZmFsc2UgfSxcbiAgICAgKiAgIHsgJ3VzZXInOiAncGViYmxlcycsICdhY3RpdmUnOiBmYWxzZSB9XG4gICAgICogXTtcbiAgICAgKlxuICAgICAqIC8vIHVzaW5nIHRoZSBgXy5tYXRjaGVzYCBjYWxsYmFjayBzaG9ydGhhbmRcbiAgICAgKiBfLnBsdWNrKF8uZHJvcFJpZ2h0V2hpbGUodXNlcnMsIHsgJ3VzZXInOiAncGViYmxlcycsICdhY3RpdmUnOiBmYWxzZSB9KSwgJ3VzZXInKTtcbiAgICAgKiAvLyA9PiBbJ2Jhcm5leScsICdmcmVkJ11cbiAgICAgKlxuICAgICAqIC8vIHVzaW5nIHRoZSBgXy5tYXRjaGVzUHJvcGVydHlgIGNhbGxiYWNrIHNob3J0aGFuZFxuICAgICAqIF8ucGx1Y2soXy5kcm9wUmlnaHRXaGlsZSh1c2VycywgJ2FjdGl2ZScsIGZhbHNlKSwgJ3VzZXInKTtcbiAgICAgKiAvLyA9PiBbJ2Jhcm5leSddXG4gICAgICpcbiAgICAgKiAvLyB1c2luZyB0aGUgYF8ucHJvcGVydHlgIGNhbGxiYWNrIHNob3J0aGFuZFxuICAgICAqIF8ucGx1Y2soXy5kcm9wUmlnaHRXaGlsZSh1c2VycywgJ2FjdGl2ZScpLCAndXNlcicpO1xuICAgICAqIC8vID0+IFsnYmFybmV5JywgJ2ZyZWQnLCAncGViYmxlcyddXG4gICAgICovXG4gICAgZnVuY3Rpb24gZHJvcFJpZ2h0V2hpbGUoYXJyYXksIHByZWRpY2F0ZSwgdGhpc0FyZykge1xuICAgICAgcmV0dXJuIChhcnJheSAmJiBhcnJheS5sZW5ndGgpXG4gICAgICAgID8gYmFzZVdoaWxlKGFycmF5LCBnZXRDYWxsYmFjayhwcmVkaWNhdGUsIHRoaXNBcmcsIDMpLCB0cnVlLCB0cnVlKVxuICAgICAgICA6IFtdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBzbGljZSBvZiBgYXJyYXlgIGV4Y2x1ZGluZyBlbGVtZW50cyBkcm9wcGVkIGZyb20gdGhlIGJlZ2lubmluZy5cbiAgICAgKiBFbGVtZW50cyBhcmUgZHJvcHBlZCB1bnRpbCBgcHJlZGljYXRlYCByZXR1cm5zIGZhbHNleS4gVGhlIHByZWRpY2F0ZSBpc1xuICAgICAqIGJvdW5kIHRvIGB0aGlzQXJnYCBhbmQgaW52b2tlZCB3aXRoIHRocmVlIGFyZ3VtZW50czogKHZhbHVlLCBpbmRleCwgYXJyYXkpLlxuICAgICAqXG4gICAgICogSWYgYSBwcm9wZXJ0eSBuYW1lIGlzIHByb3ZpZGVkIGZvciBgcHJlZGljYXRlYCB0aGUgY3JlYXRlZCBgXy5wcm9wZXJ0eWBcbiAgICAgKiBzdHlsZSBjYWxsYmFjayByZXR1cm5zIHRoZSBwcm9wZXJ0eSB2YWx1ZSBvZiB0aGUgZ2l2ZW4gZWxlbWVudC5cbiAgICAgKlxuICAgICAqIElmIGEgdmFsdWUgaXMgYWxzbyBwcm92aWRlZCBmb3IgYHRoaXNBcmdgIHRoZSBjcmVhdGVkIGBfLm1hdGNoZXNQcm9wZXJ0eWBcbiAgICAgKiBzdHlsZSBjYWxsYmFjayByZXR1cm5zIGB0cnVlYCBmb3IgZWxlbWVudHMgdGhhdCBoYXZlIGEgbWF0Y2hpbmcgcHJvcGVydHlcbiAgICAgKiB2YWx1ZSwgZWxzZSBgZmFsc2VgLlxuICAgICAqXG4gICAgICogSWYgYW4gb2JqZWN0IGlzIHByb3ZpZGVkIGZvciBgcHJlZGljYXRlYCB0aGUgY3JlYXRlZCBgXy5tYXRjaGVzYCBzdHlsZVxuICAgICAqIGNhbGxiYWNrIHJldHVybnMgYHRydWVgIGZvciBlbGVtZW50cyB0aGF0IGhhdmUgdGhlIHByb3BlcnRpZXMgb2YgdGhlIGdpdmVuXG4gICAgICogb2JqZWN0LCBlbHNlIGBmYWxzZWAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gcXVlcnkuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbnxPYmplY3R8c3RyaW5nfSBbcHJlZGljYXRlPV8uaWRlbnRpdHldIFRoZSBmdW5jdGlvbiBpbnZva2VkXG4gICAgICogIHBlciBpdGVyYXRpb24uXG4gICAgICogQHBhcmFtIHsqfSBbdGhpc0FyZ10gVGhlIGB0aGlzYCBiaW5kaW5nIG9mIGBwcmVkaWNhdGVgLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgc2xpY2Ugb2YgYGFycmF5YC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5kcm9wV2hpbGUoWzEsIDIsIDNdLCBmdW5jdGlvbihuKSB7XG4gICAgICogICByZXR1cm4gbiA8IDM7XG4gICAgICogfSk7XG4gICAgICogLy8gPT4gWzNdXG4gICAgICpcbiAgICAgKiB2YXIgdXNlcnMgPSBbXG4gICAgICogICB7ICd1c2VyJzogJ2Jhcm5leScsICAnYWN0aXZlJzogZmFsc2UgfSxcbiAgICAgKiAgIHsgJ3VzZXInOiAnZnJlZCcsICAgICdhY3RpdmUnOiBmYWxzZSB9LFxuICAgICAqICAgeyAndXNlcic6ICdwZWJibGVzJywgJ2FjdGl2ZSc6IHRydWUgfVxuICAgICAqIF07XG4gICAgICpcbiAgICAgKiAvLyB1c2luZyB0aGUgYF8ubWF0Y2hlc2AgY2FsbGJhY2sgc2hvcnRoYW5kXG4gICAgICogXy5wbHVjayhfLmRyb3BXaGlsZSh1c2VycywgeyAndXNlcic6ICdiYXJuZXknLCAnYWN0aXZlJzogZmFsc2UgfSksICd1c2VyJyk7XG4gICAgICogLy8gPT4gWydmcmVkJywgJ3BlYmJsZXMnXVxuICAgICAqXG4gICAgICogLy8gdXNpbmcgdGhlIGBfLm1hdGNoZXNQcm9wZXJ0eWAgY2FsbGJhY2sgc2hvcnRoYW5kXG4gICAgICogXy5wbHVjayhfLmRyb3BXaGlsZSh1c2VycywgJ2FjdGl2ZScsIGZhbHNlKSwgJ3VzZXInKTtcbiAgICAgKiAvLyA9PiBbJ3BlYmJsZXMnXVxuICAgICAqXG4gICAgICogLy8gdXNpbmcgdGhlIGBfLnByb3BlcnR5YCBjYWxsYmFjayBzaG9ydGhhbmRcbiAgICAgKiBfLnBsdWNrKF8uZHJvcFdoaWxlKHVzZXJzLCAnYWN0aXZlJyksICd1c2VyJyk7XG4gICAgICogLy8gPT4gWydiYXJuZXknLCAnZnJlZCcsICdwZWJibGVzJ11cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBkcm9wV2hpbGUoYXJyYXksIHByZWRpY2F0ZSwgdGhpc0FyZykge1xuICAgICAgcmV0dXJuIChhcnJheSAmJiBhcnJheS5sZW5ndGgpXG4gICAgICAgID8gYmFzZVdoaWxlKGFycmF5LCBnZXRDYWxsYmFjayhwcmVkaWNhdGUsIHRoaXNBcmcsIDMpLCB0cnVlKVxuICAgICAgICA6IFtdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEZpbGxzIGVsZW1lbnRzIG9mIGBhcnJheWAgd2l0aCBgdmFsdWVgIGZyb20gYHN0YXJ0YCB1cCB0bywgYnV0IG5vdFxuICAgICAqIGluY2x1ZGluZywgYGVuZGAuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgbXV0YXRlcyBgYXJyYXlgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGZpbGwuXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gZmlsbCBgYXJyYXlgIHdpdGguXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtzdGFydD0wXSBUaGUgc3RhcnQgcG9zaXRpb24uXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtlbmQ9YXJyYXkubGVuZ3RoXSBUaGUgZW5kIHBvc2l0aW9uLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyBgYXJyYXlgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgYXJyYXkgPSBbMSwgMiwgM107XG4gICAgICpcbiAgICAgKiBfLmZpbGwoYXJyYXksICdhJyk7XG4gICAgICogY29uc29sZS5sb2coYXJyYXkpO1xuICAgICAqIC8vID0+IFsnYScsICdhJywgJ2EnXVxuICAgICAqXG4gICAgICogXy5maWxsKEFycmF5KDMpLCAyKTtcbiAgICAgKiAvLyA9PiBbMiwgMiwgMl1cbiAgICAgKlxuICAgICAqIF8uZmlsbChbNCwgNiwgOF0sICcqJywgMSwgMik7XG4gICAgICogLy8gPT4gWzQsICcqJywgOF1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBmaWxsKGFycmF5LCB2YWx1ZSwgc3RhcnQsIGVuZCkge1xuICAgICAgdmFyIGxlbmd0aCA9IGFycmF5ID8gYXJyYXkubGVuZ3RoIDogMDtcbiAgICAgIGlmICghbGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH1cbiAgICAgIGlmIChzdGFydCAmJiB0eXBlb2Ygc3RhcnQgIT0gJ251bWJlcicgJiYgaXNJdGVyYXRlZUNhbGwoYXJyYXksIHZhbHVlLCBzdGFydCkpIHtcbiAgICAgICAgc3RhcnQgPSAwO1xuICAgICAgICBlbmQgPSBsZW5ndGg7XG4gICAgICB9XG4gICAgICByZXR1cm4gYmFzZUZpbGwoYXJyYXksIHZhbHVlLCBzdGFydCwgZW5kKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLmZpbmRgIGV4Y2VwdCB0aGF0IGl0IHJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBmaXJzdFxuICAgICAqIGVsZW1lbnQgYHByZWRpY2F0ZWAgcmV0dXJucyB0cnV0aHkgZm9yIGluc3RlYWQgb2YgdGhlIGVsZW1lbnQgaXRzZWxmLlxuICAgICAqXG4gICAgICogSWYgYSBwcm9wZXJ0eSBuYW1lIGlzIHByb3ZpZGVkIGZvciBgcHJlZGljYXRlYCB0aGUgY3JlYXRlZCBgXy5wcm9wZXJ0eWBcbiAgICAgKiBzdHlsZSBjYWxsYmFjayByZXR1cm5zIHRoZSBwcm9wZXJ0eSB2YWx1ZSBvZiB0aGUgZ2l2ZW4gZWxlbWVudC5cbiAgICAgKlxuICAgICAqIElmIGEgdmFsdWUgaXMgYWxzbyBwcm92aWRlZCBmb3IgYHRoaXNBcmdgIHRoZSBjcmVhdGVkIGBfLm1hdGNoZXNQcm9wZXJ0eWBcbiAgICAgKiBzdHlsZSBjYWxsYmFjayByZXR1cm5zIGB0cnVlYCBmb3IgZWxlbWVudHMgdGhhdCBoYXZlIGEgbWF0Y2hpbmcgcHJvcGVydHlcbiAgICAgKiB2YWx1ZSwgZWxzZSBgZmFsc2VgLlxuICAgICAqXG4gICAgICogSWYgYW4gb2JqZWN0IGlzIHByb3ZpZGVkIGZvciBgcHJlZGljYXRlYCB0aGUgY3JlYXRlZCBgXy5tYXRjaGVzYCBzdHlsZVxuICAgICAqIGNhbGxiYWNrIHJldHVybnMgYHRydWVgIGZvciBlbGVtZW50cyB0aGF0IGhhdmUgdGhlIHByb3BlcnRpZXMgb2YgdGhlIGdpdmVuXG4gICAgICogb2JqZWN0LCBlbHNlIGBmYWxzZWAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gc2VhcmNoLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb258T2JqZWN0fHN0cmluZ30gW3ByZWRpY2F0ZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZFxuICAgICAqICBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEBwYXJhbSB7Kn0gW3RoaXNBcmddIFRoZSBgdGhpc2AgYmluZGluZyBvZiBgcHJlZGljYXRlYC5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgZm91bmQgZWxlbWVudCwgZWxzZSBgLTFgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgdXNlcnMgPSBbXG4gICAgICogICB7ICd1c2VyJzogJ2Jhcm5leScsICAnYWN0aXZlJzogZmFsc2UgfSxcbiAgICAgKiAgIHsgJ3VzZXInOiAnZnJlZCcsICAgICdhY3RpdmUnOiBmYWxzZSB9LFxuICAgICAqICAgeyAndXNlcic6ICdwZWJibGVzJywgJ2FjdGl2ZSc6IHRydWUgfVxuICAgICAqIF07XG4gICAgICpcbiAgICAgKiBfLmZpbmRJbmRleCh1c2VycywgZnVuY3Rpb24oY2hyKSB7XG4gICAgICogICByZXR1cm4gY2hyLnVzZXIgPT0gJ2Jhcm5leSc7XG4gICAgICogfSk7XG4gICAgICogLy8gPT4gMFxuICAgICAqXG4gICAgICogLy8gdXNpbmcgdGhlIGBfLm1hdGNoZXNgIGNhbGxiYWNrIHNob3J0aGFuZFxuICAgICAqIF8uZmluZEluZGV4KHVzZXJzLCB7ICd1c2VyJzogJ2ZyZWQnLCAnYWN0aXZlJzogZmFsc2UgfSk7XG4gICAgICogLy8gPT4gMVxuICAgICAqXG4gICAgICogLy8gdXNpbmcgdGhlIGBfLm1hdGNoZXNQcm9wZXJ0eWAgY2FsbGJhY2sgc2hvcnRoYW5kXG4gICAgICogXy5maW5kSW5kZXgodXNlcnMsICdhY3RpdmUnLCBmYWxzZSk7XG4gICAgICogLy8gPT4gMFxuICAgICAqXG4gICAgICogLy8gdXNpbmcgdGhlIGBfLnByb3BlcnR5YCBjYWxsYmFjayBzaG9ydGhhbmRcbiAgICAgKiBfLmZpbmRJbmRleCh1c2VycywgJ2FjdGl2ZScpO1xuICAgICAqIC8vID0+IDJcbiAgICAgKi9cbiAgICB2YXIgZmluZEluZGV4ID0gY3JlYXRlRmluZEluZGV4KCk7XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLmZpbmRJbmRleGAgZXhjZXB0IHRoYXQgaXQgaXRlcmF0ZXMgb3ZlciBlbGVtZW50c1xuICAgICAqIG9mIGBjb2xsZWN0aW9uYCBmcm9tIHJpZ2h0IHRvIGxlZnQuXG4gICAgICpcbiAgICAgKiBJZiBhIHByb3BlcnR5IG5hbWUgaXMgcHJvdmlkZWQgZm9yIGBwcmVkaWNhdGVgIHRoZSBjcmVhdGVkIGBfLnByb3BlcnR5YFxuICAgICAqIHN0eWxlIGNhbGxiYWNrIHJldHVybnMgdGhlIHByb3BlcnR5IHZhbHVlIG9mIHRoZSBnaXZlbiBlbGVtZW50LlxuICAgICAqXG4gICAgICogSWYgYSB2YWx1ZSBpcyBhbHNvIHByb3ZpZGVkIGZvciBgdGhpc0FyZ2AgdGhlIGNyZWF0ZWQgYF8ubWF0Y2hlc1Byb3BlcnR5YFxuICAgICAqIHN0eWxlIGNhbGxiYWNrIHJldHVybnMgYHRydWVgIGZvciBlbGVtZW50cyB0aGF0IGhhdmUgYSBtYXRjaGluZyBwcm9wZXJ0eVxuICAgICAqIHZhbHVlLCBlbHNlIGBmYWxzZWAuXG4gICAgICpcbiAgICAgKiBJZiBhbiBvYmplY3QgaXMgcHJvdmlkZWQgZm9yIGBwcmVkaWNhdGVgIHRoZSBjcmVhdGVkIGBfLm1hdGNoZXNgIHN0eWxlXG4gICAgICogY2FsbGJhY2sgcmV0dXJucyBgdHJ1ZWAgZm9yIGVsZW1lbnRzIHRoYXQgaGF2ZSB0aGUgcHJvcGVydGllcyBvZiB0aGUgZ2l2ZW5cbiAgICAgKiBvYmplY3QsIGVsc2UgYGZhbHNlYC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBzZWFyY2guXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbnxPYmplY3R8c3RyaW5nfSBbcHJlZGljYXRlPV8uaWRlbnRpdHldIFRoZSBmdW5jdGlvbiBpbnZva2VkXG4gICAgICogIHBlciBpdGVyYXRpb24uXG4gICAgICogQHBhcmFtIHsqfSBbdGhpc0FyZ10gVGhlIGB0aGlzYCBiaW5kaW5nIG9mIGBwcmVkaWNhdGVgLlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBmb3VuZCBlbGVtZW50LCBlbHNlIGAtMWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciB1c2VycyA9IFtcbiAgICAgKiAgIHsgJ3VzZXInOiAnYmFybmV5JywgICdhY3RpdmUnOiB0cnVlIH0sXG4gICAgICogICB7ICd1c2VyJzogJ2ZyZWQnLCAgICAnYWN0aXZlJzogZmFsc2UgfSxcbiAgICAgKiAgIHsgJ3VzZXInOiAncGViYmxlcycsICdhY3RpdmUnOiBmYWxzZSB9XG4gICAgICogXTtcbiAgICAgKlxuICAgICAqIF8uZmluZExhc3RJbmRleCh1c2VycywgZnVuY3Rpb24oY2hyKSB7XG4gICAgICogICByZXR1cm4gY2hyLnVzZXIgPT0gJ3BlYmJsZXMnO1xuICAgICAqIH0pO1xuICAgICAqIC8vID0+IDJcbiAgICAgKlxuICAgICAqIC8vIHVzaW5nIHRoZSBgXy5tYXRjaGVzYCBjYWxsYmFjayBzaG9ydGhhbmRcbiAgICAgKiBfLmZpbmRMYXN0SW5kZXgodXNlcnMsIHsgJ3VzZXInOiAnYmFybmV5JywgJ2FjdGl2ZSc6IHRydWUgfSk7XG4gICAgICogLy8gPT4gMFxuICAgICAqXG4gICAgICogLy8gdXNpbmcgdGhlIGBfLm1hdGNoZXNQcm9wZXJ0eWAgY2FsbGJhY2sgc2hvcnRoYW5kXG4gICAgICogXy5maW5kTGFzdEluZGV4KHVzZXJzLCAnYWN0aXZlJywgZmFsc2UpO1xuICAgICAqIC8vID0+IDJcbiAgICAgKlxuICAgICAqIC8vIHVzaW5nIHRoZSBgXy5wcm9wZXJ0eWAgY2FsbGJhY2sgc2hvcnRoYW5kXG4gICAgICogXy5maW5kTGFzdEluZGV4KHVzZXJzLCAnYWN0aXZlJyk7XG4gICAgICogLy8gPT4gMFxuICAgICAqL1xuICAgIHZhciBmaW5kTGFzdEluZGV4ID0gY3JlYXRlRmluZEluZGV4KHRydWUpO1xuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgZmlyc3QgZWxlbWVudCBvZiBgYXJyYXlgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGFsaWFzIGhlYWRcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gcXVlcnkuXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIGZpcnN0IGVsZW1lbnQgb2YgYGFycmF5YC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5maXJzdChbMSwgMiwgM10pO1xuICAgICAqIC8vID0+IDFcbiAgICAgKlxuICAgICAqIF8uZmlyc3QoW10pO1xuICAgICAqIC8vID0+IHVuZGVmaW5lZFxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGZpcnN0KGFycmF5KSB7XG4gICAgICByZXR1cm4gYXJyYXkgPyBhcnJheVswXSA6IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBGbGF0dGVucyBhIG5lc3RlZCBhcnJheS4gSWYgYGlzRGVlcGAgaXMgYHRydWVgIHRoZSBhcnJheSBpcyByZWN1cnNpdmVseVxuICAgICAqIGZsYXR0ZW5lZCwgb3RoZXJ3aXNlIGl0IGlzIG9ubHkgZmxhdHRlbmVkIGEgc2luZ2xlIGxldmVsLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGZsYXR0ZW4uXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbaXNEZWVwXSBTcGVjaWZ5IGEgZGVlcCBmbGF0dGVuLlxuICAgICAqIEBwYXJhbS0ge09iamVjdH0gW2d1YXJkXSBFbmFibGVzIHVzZSBhcyBhIGNhbGxiYWNrIGZvciBmdW5jdGlvbnMgbGlrZSBgXy5tYXBgLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGZsYXR0ZW5lZCBhcnJheS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5mbGF0dGVuKFsxLCBbMiwgMywgWzRdXV0pO1xuICAgICAqIC8vID0+IFsxLCAyLCAzLCBbNF1dXG4gICAgICpcbiAgICAgKiAvLyB1c2luZyBgaXNEZWVwYFxuICAgICAqIF8uZmxhdHRlbihbMSwgWzIsIDMsIFs0XV1dLCB0cnVlKTtcbiAgICAgKiAvLyA9PiBbMSwgMiwgMywgNF1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBmbGF0dGVuKGFycmF5LCBpc0RlZXAsIGd1YXJkKSB7XG4gICAgICB2YXIgbGVuZ3RoID0gYXJyYXkgPyBhcnJheS5sZW5ndGggOiAwO1xuICAgICAgaWYgKGd1YXJkICYmIGlzSXRlcmF0ZWVDYWxsKGFycmF5LCBpc0RlZXAsIGd1YXJkKSkge1xuICAgICAgICBpc0RlZXAgPSBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBsZW5ndGggPyBiYXNlRmxhdHRlbihhcnJheSwgaXNEZWVwKSA6IFtdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlY3Vyc2l2ZWx5IGZsYXR0ZW5zIGEgbmVzdGVkIGFycmF5LlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIHJlY3Vyc2l2ZWx5IGZsYXR0ZW4uXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgZmxhdHRlbmVkIGFycmF5LlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmZsYXR0ZW5EZWVwKFsxLCBbMiwgMywgWzRdXV0pO1xuICAgICAqIC8vID0+IFsxLCAyLCAzLCA0XVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGZsYXR0ZW5EZWVwKGFycmF5KSB7XG4gICAgICB2YXIgbGVuZ3RoID0gYXJyYXkgPyBhcnJheS5sZW5ndGggOiAwO1xuICAgICAgcmV0dXJuIGxlbmd0aCA/IGJhc2VGbGF0dGVuKGFycmF5LCB0cnVlKSA6IFtdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIGluZGV4IGF0IHdoaWNoIHRoZSBmaXJzdCBvY2N1cnJlbmNlIG9mIGB2YWx1ZWAgaXMgZm91bmQgaW4gYGFycmF5YFxuICAgICAqIHVzaW5nIFtgU2FtZVZhbHVlWmVyb2BdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzYuMC8jc2VjLXNhbWV2YWx1ZXplcm8pXG4gICAgICogZm9yIGVxdWFsaXR5IGNvbXBhcmlzb25zLiBJZiBgZnJvbUluZGV4YCBpcyBuZWdhdGl2ZSwgaXQgaXMgdXNlZCBhcyB0aGUgb2Zmc2V0XG4gICAgICogZnJvbSB0aGUgZW5kIG9mIGBhcnJheWAuIElmIGBhcnJheWAgaXMgc29ydGVkIHByb3ZpZGluZyBgdHJ1ZWAgZm9yIGBmcm9tSW5kZXhgXG4gICAgICogcGVyZm9ybXMgYSBmYXN0ZXIgYmluYXJ5IHNlYXJjaC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBzZWFyY2guXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gc2VhcmNoIGZvci5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW58bnVtYmVyfSBbZnJvbUluZGV4PTBdIFRoZSBpbmRleCB0byBzZWFyY2ggZnJvbSBvciBgdHJ1ZWBcbiAgICAgKiAgdG8gcGVyZm9ybSBhIGJpbmFyeSBzZWFyY2ggb24gYSBzb3J0ZWQgYXJyYXkuXG4gICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIG1hdGNoZWQgdmFsdWUsIGVsc2UgYC0xYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5pbmRleE9mKFsxLCAyLCAxLCAyXSwgMik7XG4gICAgICogLy8gPT4gMVxuICAgICAqXG4gICAgICogLy8gdXNpbmcgYGZyb21JbmRleGBcbiAgICAgKiBfLmluZGV4T2YoWzEsIDIsIDEsIDJdLCAyLCAyKTtcbiAgICAgKiAvLyA9PiAzXG4gICAgICpcbiAgICAgKiAvLyBwZXJmb3JtaW5nIGEgYmluYXJ5IHNlYXJjaFxuICAgICAqIF8uaW5kZXhPZihbMSwgMSwgMiwgMl0sIDIsIHRydWUpO1xuICAgICAqIC8vID0+IDJcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpbmRleE9mKGFycmF5LCB2YWx1ZSwgZnJvbUluZGV4KSB7XG4gICAgICB2YXIgbGVuZ3RoID0gYXJyYXkgPyBhcnJheS5sZW5ndGggOiAwO1xuICAgICAgaWYgKCFsZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgfVxuICAgICAgaWYgKHR5cGVvZiBmcm9tSW5kZXggPT0gJ251bWJlcicpIHtcbiAgICAgICAgZnJvbUluZGV4ID0gZnJvbUluZGV4IDwgMCA/IG5hdGl2ZU1heChsZW5ndGggKyBmcm9tSW5kZXgsIDApIDogZnJvbUluZGV4O1xuICAgICAgfSBlbHNlIGlmIChmcm9tSW5kZXgpIHtcbiAgICAgICAgdmFyIGluZGV4ID0gYmluYXJ5SW5kZXgoYXJyYXksIHZhbHVlKTtcbiAgICAgICAgaWYgKGluZGV4IDwgbGVuZ3RoICYmXG4gICAgICAgICAgICAodmFsdWUgPT09IHZhbHVlID8gKHZhbHVlID09PSBhcnJheVtpbmRleF0pIDogKGFycmF5W2luZGV4XSAhPT0gYXJyYXlbaW5kZXhdKSkpIHtcbiAgICAgICAgICByZXR1cm4gaW5kZXg7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGJhc2VJbmRleE9mKGFycmF5LCB2YWx1ZSwgZnJvbUluZGV4IHx8IDApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgYWxsIGJ1dCB0aGUgbGFzdCBlbGVtZW50IG9mIGBhcnJheWAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gcXVlcnkuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBzbGljZSBvZiBgYXJyYXlgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmluaXRpYWwoWzEsIDIsIDNdKTtcbiAgICAgKiAvLyA9PiBbMSwgMl1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpbml0aWFsKGFycmF5KSB7XG4gICAgICByZXR1cm4gZHJvcFJpZ2h0KGFycmF5LCAxKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGFycmF5IG9mIHVuaXF1ZSB2YWx1ZXMgdGhhdCBhcmUgaW5jbHVkZWQgaW4gYWxsIG9mIHRoZSBwcm92aWRlZFxuICAgICAqIGFycmF5cyB1c2luZyBbYFNhbWVWYWx1ZVplcm9gXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi82LjAvI3NlYy1zYW1ldmFsdWV6ZXJvKVxuICAgICAqIGZvciBlcXVhbGl0eSBjb21wYXJpc29ucy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7Li4uQXJyYXl9IFthcnJheXNdIFRoZSBhcnJheXMgdG8gaW5zcGVjdC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBhcnJheSBvZiBzaGFyZWQgdmFsdWVzLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogXy5pbnRlcnNlY3Rpb24oWzEsIDJdLCBbNCwgMl0sIFsyLCAxXSk7XG4gICAgICogLy8gPT4gWzJdXG4gICAgICovXG4gICAgdmFyIGludGVyc2VjdGlvbiA9IHJlc3RQYXJhbShmdW5jdGlvbihhcnJheXMpIHtcbiAgICAgIHZhciBvdGhMZW5ndGggPSBhcnJheXMubGVuZ3RoLFxuICAgICAgICAgIG90aEluZGV4ID0gb3RoTGVuZ3RoLFxuICAgICAgICAgIGNhY2hlcyA9IEFycmF5KGxlbmd0aCksXG4gICAgICAgICAgaW5kZXhPZiA9IGdldEluZGV4T2YoKSxcbiAgICAgICAgICBpc0NvbW1vbiA9IGluZGV4T2YgPT0gYmFzZUluZGV4T2YsXG4gICAgICAgICAgcmVzdWx0ID0gW107XG5cbiAgICAgIHdoaWxlIChvdGhJbmRleC0tKSB7XG4gICAgICAgIHZhciB2YWx1ZSA9IGFycmF5c1tvdGhJbmRleF0gPSBpc0FycmF5TGlrZSh2YWx1ZSA9IGFycmF5c1tvdGhJbmRleF0pID8gdmFsdWUgOiBbXTtcbiAgICAgICAgY2FjaGVzW290aEluZGV4XSA9IChpc0NvbW1vbiAmJiB2YWx1ZS5sZW5ndGggPj0gMTIwKSA/IGNyZWF0ZUNhY2hlKG90aEluZGV4ICYmIHZhbHVlKSA6IG51bGw7XG4gICAgICB9XG4gICAgICB2YXIgYXJyYXkgPSBhcnJheXNbMF0sXG4gICAgICAgICAgaW5kZXggPSAtMSxcbiAgICAgICAgICBsZW5ndGggPSBhcnJheSA/IGFycmF5Lmxlbmd0aCA6IDAsXG4gICAgICAgICAgc2VlbiA9IGNhY2hlc1swXTtcblxuICAgICAgb3V0ZXI6XG4gICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICB2YWx1ZSA9IGFycmF5W2luZGV4XTtcbiAgICAgICAgaWYgKChzZWVuID8gY2FjaGVJbmRleE9mKHNlZW4sIHZhbHVlKSA6IGluZGV4T2YocmVzdWx0LCB2YWx1ZSwgMCkpIDwgMCkge1xuICAgICAgICAgIHZhciBvdGhJbmRleCA9IG90aExlbmd0aDtcbiAgICAgICAgICB3aGlsZSAoLS1vdGhJbmRleCkge1xuICAgICAgICAgICAgdmFyIGNhY2hlID0gY2FjaGVzW290aEluZGV4XTtcbiAgICAgICAgICAgIGlmICgoY2FjaGUgPyBjYWNoZUluZGV4T2YoY2FjaGUsIHZhbHVlKSA6IGluZGV4T2YoYXJyYXlzW290aEluZGV4XSwgdmFsdWUsIDApKSA8IDApIHtcbiAgICAgICAgICAgICAgY29udGludWUgb3V0ZXI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChzZWVuKSB7XG4gICAgICAgICAgICBzZWVuLnB1c2godmFsdWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXN1bHQucHVzaCh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBsYXN0IGVsZW1lbnQgb2YgYGFycmF5YC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBxdWVyeS5cbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgbGFzdCBlbGVtZW50IG9mIGBhcnJheWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8ubGFzdChbMSwgMiwgM10pO1xuICAgICAqIC8vID0+IDNcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBsYXN0KGFycmF5KSB7XG4gICAgICB2YXIgbGVuZ3RoID0gYXJyYXkgPyBhcnJheS5sZW5ndGggOiAwO1xuICAgICAgcmV0dXJuIGxlbmd0aCA/IGFycmF5W2xlbmd0aCAtIDFdIDogdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uaW5kZXhPZmAgZXhjZXB0IHRoYXQgaXQgaXRlcmF0ZXMgb3ZlciBlbGVtZW50cyBvZlxuICAgICAqIGBhcnJheWAgZnJvbSByaWdodCB0byBsZWZ0LlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIHNlYXJjaC5cbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBzZWFyY2ggZm9yLlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbnxudW1iZXJ9IFtmcm9tSW5kZXg9YXJyYXkubGVuZ3RoLTFdIFRoZSBpbmRleCB0byBzZWFyY2ggZnJvbVxuICAgICAqICBvciBgdHJ1ZWAgdG8gcGVyZm9ybSBhIGJpbmFyeSBzZWFyY2ggb24gYSBzb3J0ZWQgYXJyYXkuXG4gICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIG1hdGNoZWQgdmFsdWUsIGVsc2UgYC0xYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5sYXN0SW5kZXhPZihbMSwgMiwgMSwgMl0sIDIpO1xuICAgICAqIC8vID0+IDNcbiAgICAgKlxuICAgICAqIC8vIHVzaW5nIGBmcm9tSW5kZXhgXG4gICAgICogXy5sYXN0SW5kZXhPZihbMSwgMiwgMSwgMl0sIDIsIDIpO1xuICAgICAqIC8vID0+IDFcbiAgICAgKlxuICAgICAqIC8vIHBlcmZvcm1pbmcgYSBiaW5hcnkgc2VhcmNoXG4gICAgICogXy5sYXN0SW5kZXhPZihbMSwgMSwgMiwgMl0sIDIsIHRydWUpO1xuICAgICAqIC8vID0+IDNcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBsYXN0SW5kZXhPZihhcnJheSwgdmFsdWUsIGZyb21JbmRleCkge1xuICAgICAgdmFyIGxlbmd0aCA9IGFycmF5ID8gYXJyYXkubGVuZ3RoIDogMDtcbiAgICAgIGlmICghbGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiAtMTtcbiAgICAgIH1cbiAgICAgIHZhciBpbmRleCA9IGxlbmd0aDtcbiAgICAgIGlmICh0eXBlb2YgZnJvbUluZGV4ID09ICdudW1iZXInKSB7XG4gICAgICAgIGluZGV4ID0gKGZyb21JbmRleCA8IDAgPyBuYXRpdmVNYXgobGVuZ3RoICsgZnJvbUluZGV4LCAwKSA6IG5hdGl2ZU1pbihmcm9tSW5kZXggfHwgMCwgbGVuZ3RoIC0gMSkpICsgMTtcbiAgICAgIH0gZWxzZSBpZiAoZnJvbUluZGV4KSB7XG4gICAgICAgIGluZGV4ID0gYmluYXJ5SW5kZXgoYXJyYXksIHZhbHVlLCB0cnVlKSAtIDE7XG4gICAgICAgIHZhciBvdGhlciA9IGFycmF5W2luZGV4XTtcbiAgICAgICAgaWYgKHZhbHVlID09PSB2YWx1ZSA/ICh2YWx1ZSA9PT0gb3RoZXIpIDogKG90aGVyICE9PSBvdGhlcikpIHtcbiAgICAgICAgICByZXR1cm4gaW5kZXg7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgfVxuICAgICAgaWYgKHZhbHVlICE9PSB2YWx1ZSkge1xuICAgICAgICByZXR1cm4gaW5kZXhPZk5hTihhcnJheSwgaW5kZXgsIHRydWUpO1xuICAgICAgfVxuICAgICAgd2hpbGUgKGluZGV4LS0pIHtcbiAgICAgICAgaWYgKGFycmF5W2luZGV4XSA9PT0gdmFsdWUpIHtcbiAgICAgICAgICByZXR1cm4gaW5kZXg7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiAtMTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIGFsbCBwcm92aWRlZCB2YWx1ZXMgZnJvbSBgYXJyYXlgIHVzaW5nXG4gICAgICogW2BTYW1lVmFsdWVaZXJvYF0oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNi4wLyNzZWMtc2FtZXZhbHVlemVybylcbiAgICAgKiBmb3IgZXF1YWxpdHkgY29tcGFyaXNvbnMuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVW5saWtlIGBfLndpdGhvdXRgLCB0aGlzIG1ldGhvZCBtdXRhdGVzIGBhcnJheWAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gbW9kaWZ5LlxuICAgICAqIEBwYXJhbSB7Li4uKn0gW3ZhbHVlc10gVGhlIHZhbHVlcyB0byByZW1vdmUuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIGBhcnJheWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBhcnJheSA9IFsxLCAyLCAzLCAxLCAyLCAzXTtcbiAgICAgKlxuICAgICAqIF8ucHVsbChhcnJheSwgMiwgMyk7XG4gICAgICogY29uc29sZS5sb2coYXJyYXkpO1xuICAgICAqIC8vID0+IFsxLCAxXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHB1bGwoKSB7XG4gICAgICB2YXIgYXJncyA9IGFyZ3VtZW50cyxcbiAgICAgICAgICBhcnJheSA9IGFyZ3NbMF07XG5cbiAgICAgIGlmICghKGFycmF5ICYmIGFycmF5Lmxlbmd0aCkpIHtcbiAgICAgICAgcmV0dXJuIGFycmF5O1xuICAgICAgfVxuICAgICAgdmFyIGluZGV4ID0gMCxcbiAgICAgICAgICBpbmRleE9mID0gZ2V0SW5kZXhPZigpLFxuICAgICAgICAgIGxlbmd0aCA9IGFyZ3MubGVuZ3RoO1xuXG4gICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICB2YXIgZnJvbUluZGV4ID0gMCxcbiAgICAgICAgICAgIHZhbHVlID0gYXJnc1tpbmRleF07XG5cbiAgICAgICAgd2hpbGUgKChmcm9tSW5kZXggPSBpbmRleE9mKGFycmF5LCB2YWx1ZSwgZnJvbUluZGV4KSkgPiAtMSkge1xuICAgICAgICAgIHNwbGljZS5jYWxsKGFycmF5LCBmcm9tSW5kZXgsIDEpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gYXJyYXk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlcyBlbGVtZW50cyBmcm9tIGBhcnJheWAgY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4gaW5kZXhlcyBhbmQgcmV0dXJuc1xuICAgICAqIGFuIGFycmF5IG9mIHRoZSByZW1vdmVkIGVsZW1lbnRzLiBJbmRleGVzIG1heSBiZSBzcGVjaWZpZWQgYXMgYW4gYXJyYXkgb2ZcbiAgICAgKiBpbmRleGVzIG9yIGFzIGluZGl2aWR1YWwgYXJndW1lbnRzLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFVubGlrZSBgXy5hdGAsIHRoaXMgbWV0aG9kIG11dGF0ZXMgYGFycmF5YC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBtb2RpZnkuXG4gICAgICogQHBhcmFtIHsuLi4obnVtYmVyfG51bWJlcltdKX0gW2luZGV4ZXNdIFRoZSBpbmRleGVzIG9mIGVsZW1lbnRzIHRvIHJlbW92ZSxcbiAgICAgKiAgc3BlY2lmaWVkIGFzIGluZGl2aWR1YWwgaW5kZXhlcyBvciBhcnJheXMgb2YgaW5kZXhlcy5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBhcnJheSBvZiByZW1vdmVkIGVsZW1lbnRzLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgYXJyYXkgPSBbNSwgMTAsIDE1LCAyMF07XG4gICAgICogdmFyIGV2ZW5zID0gXy5wdWxsQXQoYXJyYXksIDEsIDMpO1xuICAgICAqXG4gICAgICogY29uc29sZS5sb2coYXJyYXkpO1xuICAgICAqIC8vID0+IFs1LCAxNV1cbiAgICAgKlxuICAgICAqIGNvbnNvbGUubG9nKGV2ZW5zKTtcbiAgICAgKiAvLyA9PiBbMTAsIDIwXVxuICAgICAqL1xuICAgIHZhciBwdWxsQXQgPSByZXN0UGFyYW0oZnVuY3Rpb24oYXJyYXksIGluZGV4ZXMpIHtcbiAgICAgIGluZGV4ZXMgPSBiYXNlRmxhdHRlbihpbmRleGVzKTtcblxuICAgICAgdmFyIHJlc3VsdCA9IGJhc2VBdChhcnJheSwgaW5kZXhlcyk7XG4gICAgICBiYXNlUHVsbEF0KGFycmF5LCBpbmRleGVzLnNvcnQoYmFzZUNvbXBhcmVBc2NlbmRpbmcpKTtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIGFsbCBlbGVtZW50cyBmcm9tIGBhcnJheWAgdGhhdCBgcHJlZGljYXRlYCByZXR1cm5zIHRydXRoeSBmb3JcbiAgICAgKiBhbmQgcmV0dXJucyBhbiBhcnJheSBvZiB0aGUgcmVtb3ZlZCBlbGVtZW50cy4gVGhlIHByZWRpY2F0ZSBpcyBib3VuZCB0b1xuICAgICAqIGB0aGlzQXJnYCBhbmQgaW52b2tlZCB3aXRoIHRocmVlIGFyZ3VtZW50czogKHZhbHVlLCBpbmRleCwgYXJyYXkpLlxuICAgICAqXG4gICAgICogSWYgYSBwcm9wZXJ0eSBuYW1lIGlzIHByb3ZpZGVkIGZvciBgcHJlZGljYXRlYCB0aGUgY3JlYXRlZCBgXy5wcm9wZXJ0eWBcbiAgICAgKiBzdHlsZSBjYWxsYmFjayByZXR1cm5zIHRoZSBwcm9wZXJ0eSB2YWx1ZSBvZiB0aGUgZ2l2ZW4gZWxlbWVudC5cbiAgICAgKlxuICAgICAqIElmIGEgdmFsdWUgaXMgYWxzbyBwcm92aWRlZCBmb3IgYHRoaXNBcmdgIHRoZSBjcmVhdGVkIGBfLm1hdGNoZXNQcm9wZXJ0eWBcbiAgICAgKiBzdHlsZSBjYWxsYmFjayByZXR1cm5zIGB0cnVlYCBmb3IgZWxlbWVudHMgdGhhdCBoYXZlIGEgbWF0Y2hpbmcgcHJvcGVydHlcbiAgICAgKiB2YWx1ZSwgZWxzZSBgZmFsc2VgLlxuICAgICAqXG4gICAgICogSWYgYW4gb2JqZWN0IGlzIHByb3ZpZGVkIGZvciBgcHJlZGljYXRlYCB0aGUgY3JlYXRlZCBgXy5tYXRjaGVzYCBzdHlsZVxuICAgICAqIGNhbGxiYWNrIHJldHVybnMgYHRydWVgIGZvciBlbGVtZW50cyB0aGF0IGhhdmUgdGhlIHByb3BlcnRpZXMgb2YgdGhlIGdpdmVuXG4gICAgICogb2JqZWN0LCBlbHNlIGBmYWxzZWAuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVW5saWtlIGBfLmZpbHRlcmAsIHRoaXMgbWV0aG9kIG11dGF0ZXMgYGFycmF5YC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBtb2RpZnkuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbnxPYmplY3R8c3RyaW5nfSBbcHJlZGljYXRlPV8uaWRlbnRpdHldIFRoZSBmdW5jdGlvbiBpbnZva2VkXG4gICAgICogIHBlciBpdGVyYXRpb24uXG4gICAgICogQHBhcmFtIHsqfSBbdGhpc0FyZ10gVGhlIGB0aGlzYCBiaW5kaW5nIG9mIGBwcmVkaWNhdGVgLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGFycmF5IG9mIHJlbW92ZWQgZWxlbWVudHMuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBhcnJheSA9IFsxLCAyLCAzLCA0XTtcbiAgICAgKiB2YXIgZXZlbnMgPSBfLnJlbW92ZShhcnJheSwgZnVuY3Rpb24obikge1xuICAgICAqICAgcmV0dXJuIG4gJSAyID09IDA7XG4gICAgICogfSk7XG4gICAgICpcbiAgICAgKiBjb25zb2xlLmxvZyhhcnJheSk7XG4gICAgICogLy8gPT4gWzEsIDNdXG4gICAgICpcbiAgICAgKiBjb25zb2xlLmxvZyhldmVucyk7XG4gICAgICogLy8gPT4gWzIsIDRdXG4gICAgICovXG4gICAgZnVuY3Rpb24gcmVtb3ZlKGFycmF5LCBwcmVkaWNhdGUsIHRoaXNBcmcpIHtcbiAgICAgIHZhciByZXN1bHQgPSBbXTtcbiAgICAgIGlmICghKGFycmF5ICYmIGFycmF5Lmxlbmd0aCkpIHtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH1cbiAgICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICAgIGluZGV4ZXMgPSBbXSxcbiAgICAgICAgICBsZW5ndGggPSBhcnJheS5sZW5ndGg7XG5cbiAgICAgIHByZWRpY2F0ZSA9IGdldENhbGxiYWNrKHByZWRpY2F0ZSwgdGhpc0FyZywgMyk7XG4gICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICB2YXIgdmFsdWUgPSBhcnJheVtpbmRleF07XG4gICAgICAgIGlmIChwcmVkaWNhdGUodmFsdWUsIGluZGV4LCBhcnJheSkpIHtcbiAgICAgICAgICByZXN1bHQucHVzaCh2YWx1ZSk7XG4gICAgICAgICAgaW5kZXhlcy5wdXNoKGluZGV4KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgYmFzZVB1bGxBdChhcnJheSwgaW5kZXhlcyk7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgYWxsIGJ1dCB0aGUgZmlyc3QgZWxlbWVudCBvZiBgYXJyYXlgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGFsaWFzIHRhaWxcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gcXVlcnkuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBzbGljZSBvZiBgYXJyYXlgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnJlc3QoWzEsIDIsIDNdKTtcbiAgICAgKiAvLyA9PiBbMiwgM11cbiAgICAgKi9cbiAgICBmdW5jdGlvbiByZXN0KGFycmF5KSB7XG4gICAgICByZXR1cm4gZHJvcChhcnJheSwgMSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIHNsaWNlIG9mIGBhcnJheWAgZnJvbSBgc3RhcnRgIHVwIHRvLCBidXQgbm90IGluY2x1ZGluZywgYGVuZGAuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgaXMgdXNlZCBpbnN0ZWFkIG9mIGBBcnJheSNzbGljZWAgdG8gc3VwcG9ydCBub2RlXG4gICAgICogbGlzdHMgaW4gSUUgPCA5IGFuZCB0byBlbnN1cmUgZGVuc2UgYXJyYXlzIGFyZSByZXR1cm5lZC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBzbGljZS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3N0YXJ0PTBdIFRoZSBzdGFydCBwb3NpdGlvbi5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW2VuZD1hcnJheS5sZW5ndGhdIFRoZSBlbmQgcG9zaXRpb24uXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBzbGljZSBvZiBgYXJyYXlgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHNsaWNlKGFycmF5LCBzdGFydCwgZW5kKSB7XG4gICAgICB2YXIgbGVuZ3RoID0gYXJyYXkgPyBhcnJheS5sZW5ndGggOiAwO1xuICAgICAgaWYgKCFsZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgfVxuICAgICAgaWYgKGVuZCAmJiB0eXBlb2YgZW5kICE9ICdudW1iZXInICYmIGlzSXRlcmF0ZWVDYWxsKGFycmF5LCBzdGFydCwgZW5kKSkge1xuICAgICAgICBzdGFydCA9IDA7XG4gICAgICAgIGVuZCA9IGxlbmd0aDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBiYXNlU2xpY2UoYXJyYXksIHN0YXJ0LCBlbmQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVzZXMgYSBiaW5hcnkgc2VhcmNoIHRvIGRldGVybWluZSB0aGUgbG93ZXN0IGluZGV4IGF0IHdoaWNoIGB2YWx1ZWAgc2hvdWxkXG4gICAgICogYmUgaW5zZXJ0ZWQgaW50byBgYXJyYXlgIGluIG9yZGVyIHRvIG1haW50YWluIGl0cyBzb3J0IG9yZGVyLiBJZiBhbiBpdGVyYXRlZVxuICAgICAqIGZ1bmN0aW9uIGlzIHByb3ZpZGVkIGl0IGlzIGludm9rZWQgZm9yIGB2YWx1ZWAgYW5kIGVhY2ggZWxlbWVudCBvZiBgYXJyYXlgXG4gICAgICogdG8gY29tcHV0ZSB0aGVpciBzb3J0IHJhbmtpbmcuIFRoZSBpdGVyYXRlZSBpcyBib3VuZCB0byBgdGhpc0FyZ2AgYW5kXG4gICAgICogaW52b2tlZCB3aXRoIG9uZSBhcmd1bWVudDsgKHZhbHVlKS5cbiAgICAgKlxuICAgICAqIElmIGEgcHJvcGVydHkgbmFtZSBpcyBwcm92aWRlZCBmb3IgYGl0ZXJhdGVlYCB0aGUgY3JlYXRlZCBgXy5wcm9wZXJ0eWBcbiAgICAgKiBzdHlsZSBjYWxsYmFjayByZXR1cm5zIHRoZSBwcm9wZXJ0eSB2YWx1ZSBvZiB0aGUgZ2l2ZW4gZWxlbWVudC5cbiAgICAgKlxuICAgICAqIElmIGEgdmFsdWUgaXMgYWxzbyBwcm92aWRlZCBmb3IgYHRoaXNBcmdgIHRoZSBjcmVhdGVkIGBfLm1hdGNoZXNQcm9wZXJ0eWBcbiAgICAgKiBzdHlsZSBjYWxsYmFjayByZXR1cm5zIGB0cnVlYCBmb3IgZWxlbWVudHMgdGhhdCBoYXZlIGEgbWF0Y2hpbmcgcHJvcGVydHlcbiAgICAgKiB2YWx1ZSwgZWxzZSBgZmFsc2VgLlxuICAgICAqXG4gICAgICogSWYgYW4gb2JqZWN0IGlzIHByb3ZpZGVkIGZvciBgaXRlcmF0ZWVgIHRoZSBjcmVhdGVkIGBfLm1hdGNoZXNgIHN0eWxlXG4gICAgICogY2FsbGJhY2sgcmV0dXJucyBgdHJ1ZWAgZm9yIGVsZW1lbnRzIHRoYXQgaGF2ZSB0aGUgcHJvcGVydGllcyBvZiB0aGUgZ2l2ZW5cbiAgICAgKiBvYmplY3QsIGVsc2UgYGZhbHNlYC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBzb3J0ZWQgYXJyYXkgdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBldmFsdWF0ZS5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufE9iamVjdHxzdHJpbmd9IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZFxuICAgICAqICBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEBwYXJhbSB7Kn0gW3RoaXNBcmddIFRoZSBgdGhpc2AgYmluZGluZyBvZiBgaXRlcmF0ZWVgLlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGluZGV4IGF0IHdoaWNoIGB2YWx1ZWAgc2hvdWxkIGJlIGluc2VydGVkXG4gICAgICogIGludG8gYGFycmF5YC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5zb3J0ZWRJbmRleChbMzAsIDUwXSwgNDApO1xuICAgICAqIC8vID0+IDFcbiAgICAgKlxuICAgICAqIF8uc29ydGVkSW5kZXgoWzQsIDQsIDUsIDVdLCA1KTtcbiAgICAgKiAvLyA9PiAyXG4gICAgICpcbiAgICAgKiB2YXIgZGljdCA9IHsgJ2RhdGEnOiB7ICd0aGlydHknOiAzMCwgJ2ZvcnR5JzogNDAsICdmaWZ0eSc6IDUwIH0gfTtcbiAgICAgKlxuICAgICAqIC8vIHVzaW5nIGFuIGl0ZXJhdGVlIGZ1bmN0aW9uXG4gICAgICogXy5zb3J0ZWRJbmRleChbJ3RoaXJ0eScsICdmaWZ0eSddLCAnZm9ydHknLCBmdW5jdGlvbih3b3JkKSB7XG4gICAgICogICByZXR1cm4gdGhpcy5kYXRhW3dvcmRdO1xuICAgICAqIH0sIGRpY3QpO1xuICAgICAqIC8vID0+IDFcbiAgICAgKlxuICAgICAqIC8vIHVzaW5nIHRoZSBgXy5wcm9wZXJ0eWAgY2FsbGJhY2sgc2hvcnRoYW5kXG4gICAgICogXy5zb3J0ZWRJbmRleChbeyAneCc6IDMwIH0sIHsgJ3gnOiA1MCB9XSwgeyAneCc6IDQwIH0sICd4Jyk7XG4gICAgICogLy8gPT4gMVxuICAgICAqL1xuICAgIHZhciBzb3J0ZWRJbmRleCA9IGNyZWF0ZVNvcnRlZEluZGV4KCk7XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLnNvcnRlZEluZGV4YCBleGNlcHQgdGhhdCBpdCByZXR1cm5zIHRoZSBoaWdoZXN0XG4gICAgICogaW5kZXggYXQgd2hpY2ggYHZhbHVlYCBzaG91bGQgYmUgaW5zZXJ0ZWQgaW50byBgYXJyYXlgIGluIG9yZGVyIHRvXG4gICAgICogbWFpbnRhaW4gaXRzIHNvcnQgb3JkZXIuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgc29ydGVkIGFycmF5IHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gZXZhbHVhdGUuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbnxPYmplY3R8c3RyaW5nfSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWRcbiAgICAgKiAgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcGFyYW0geyp9IFt0aGlzQXJnXSBUaGUgYHRoaXNgIGJpbmRpbmcgb2YgYGl0ZXJhdGVlYC5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBpbmRleCBhdCB3aGljaCBgdmFsdWVgIHNob3VsZCBiZSBpbnNlcnRlZFxuICAgICAqICBpbnRvIGBhcnJheWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uc29ydGVkTGFzdEluZGV4KFs0LCA0LCA1LCA1XSwgNSk7XG4gICAgICogLy8gPT4gNFxuICAgICAqL1xuICAgIHZhciBzb3J0ZWRMYXN0SW5kZXggPSBjcmVhdGVTb3J0ZWRJbmRleCh0cnVlKTtcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBzbGljZSBvZiBgYXJyYXlgIHdpdGggYG5gIGVsZW1lbnRzIHRha2VuIGZyb20gdGhlIGJlZ2lubmluZy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBxdWVyeS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW249MV0gVGhlIG51bWJlciBvZiBlbGVtZW50cyB0byB0YWtlLlxuICAgICAqIEBwYXJhbS0ge09iamVjdH0gW2d1YXJkXSBFbmFibGVzIHVzZSBhcyBhIGNhbGxiYWNrIGZvciBmdW5jdGlvbnMgbGlrZSBgXy5tYXBgLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgc2xpY2Ugb2YgYGFycmF5YC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy50YWtlKFsxLCAyLCAzXSk7XG4gICAgICogLy8gPT4gWzFdXG4gICAgICpcbiAgICAgKiBfLnRha2UoWzEsIDIsIDNdLCAyKTtcbiAgICAgKiAvLyA9PiBbMSwgMl1cbiAgICAgKlxuICAgICAqIF8udGFrZShbMSwgMiwgM10sIDUpO1xuICAgICAqIC8vID0+IFsxLCAyLCAzXVxuICAgICAqXG4gICAgICogXy50YWtlKFsxLCAyLCAzXSwgMCk7XG4gICAgICogLy8gPT4gW11cbiAgICAgKi9cbiAgICBmdW5jdGlvbiB0YWtlKGFycmF5LCBuLCBndWFyZCkge1xuICAgICAgdmFyIGxlbmd0aCA9IGFycmF5ID8gYXJyYXkubGVuZ3RoIDogMDtcbiAgICAgIGlmICghbGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH1cbiAgICAgIGlmIChndWFyZCA/IGlzSXRlcmF0ZWVDYWxsKGFycmF5LCBuLCBndWFyZCkgOiBuID09IG51bGwpIHtcbiAgICAgICAgbiA9IDE7XG4gICAgICB9XG4gICAgICByZXR1cm4gYmFzZVNsaWNlKGFycmF5LCAwLCBuIDwgMCA/IDAgOiBuKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgc2xpY2Ugb2YgYGFycmF5YCB3aXRoIGBuYCBlbGVtZW50cyB0YWtlbiBmcm9tIHRoZSBlbmQuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gcXVlcnkuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtuPTFdIFRoZSBudW1iZXIgb2YgZWxlbWVudHMgdG8gdGFrZS5cbiAgICAgKiBAcGFyYW0tIHtPYmplY3R9IFtndWFyZF0gRW5hYmxlcyB1c2UgYXMgYSBjYWxsYmFjayBmb3IgZnVuY3Rpb25zIGxpa2UgYF8ubWFwYC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIHNsaWNlIG9mIGBhcnJheWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8udGFrZVJpZ2h0KFsxLCAyLCAzXSk7XG4gICAgICogLy8gPT4gWzNdXG4gICAgICpcbiAgICAgKiBfLnRha2VSaWdodChbMSwgMiwgM10sIDIpO1xuICAgICAqIC8vID0+IFsyLCAzXVxuICAgICAqXG4gICAgICogXy50YWtlUmlnaHQoWzEsIDIsIDNdLCA1KTtcbiAgICAgKiAvLyA9PiBbMSwgMiwgM11cbiAgICAgKlxuICAgICAqIF8udGFrZVJpZ2h0KFsxLCAyLCAzXSwgMCk7XG4gICAgICogLy8gPT4gW11cbiAgICAgKi9cbiAgICBmdW5jdGlvbiB0YWtlUmlnaHQoYXJyYXksIG4sIGd1YXJkKSB7XG4gICAgICB2YXIgbGVuZ3RoID0gYXJyYXkgPyBhcnJheS5sZW5ndGggOiAwO1xuICAgICAgaWYgKCFsZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgfVxuICAgICAgaWYgKGd1YXJkID8gaXNJdGVyYXRlZUNhbGwoYXJyYXksIG4sIGd1YXJkKSA6IG4gPT0gbnVsbCkge1xuICAgICAgICBuID0gMTtcbiAgICAgIH1cbiAgICAgIG4gPSBsZW5ndGggLSAoK24gfHwgMCk7XG4gICAgICByZXR1cm4gYmFzZVNsaWNlKGFycmF5LCBuIDwgMCA/IDAgOiBuKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgc2xpY2Ugb2YgYGFycmF5YCB3aXRoIGVsZW1lbnRzIHRha2VuIGZyb20gdGhlIGVuZC4gRWxlbWVudHMgYXJlXG4gICAgICogdGFrZW4gdW50aWwgYHByZWRpY2F0ZWAgcmV0dXJucyBmYWxzZXkuIFRoZSBwcmVkaWNhdGUgaXMgYm91bmQgdG8gYHRoaXNBcmdgXG4gICAgICogYW5kIGludm9rZWQgd2l0aCB0aHJlZSBhcmd1bWVudHM6ICh2YWx1ZSwgaW5kZXgsIGFycmF5KS5cbiAgICAgKlxuICAgICAqIElmIGEgcHJvcGVydHkgbmFtZSBpcyBwcm92aWRlZCBmb3IgYHByZWRpY2F0ZWAgdGhlIGNyZWF0ZWQgYF8ucHJvcGVydHlgXG4gICAgICogc3R5bGUgY2FsbGJhY2sgcmV0dXJucyB0aGUgcHJvcGVydHkgdmFsdWUgb2YgdGhlIGdpdmVuIGVsZW1lbnQuXG4gICAgICpcbiAgICAgKiBJZiBhIHZhbHVlIGlzIGFsc28gcHJvdmlkZWQgZm9yIGB0aGlzQXJnYCB0aGUgY3JlYXRlZCBgXy5tYXRjaGVzUHJvcGVydHlgXG4gICAgICogc3R5bGUgY2FsbGJhY2sgcmV0dXJucyBgdHJ1ZWAgZm9yIGVsZW1lbnRzIHRoYXQgaGF2ZSBhIG1hdGNoaW5nIHByb3BlcnR5XG4gICAgICogdmFsdWUsIGVsc2UgYGZhbHNlYC5cbiAgICAgKlxuICAgICAqIElmIGFuIG9iamVjdCBpcyBwcm92aWRlZCBmb3IgYHByZWRpY2F0ZWAgdGhlIGNyZWF0ZWQgYF8ubWF0Y2hlc2Agc3R5bGVcbiAgICAgKiBjYWxsYmFjayByZXR1cm5zIGB0cnVlYCBmb3IgZWxlbWVudHMgdGhhdCBoYXZlIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBnaXZlblxuICAgICAqIG9iamVjdCwgZWxzZSBgZmFsc2VgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIHF1ZXJ5LlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb258T2JqZWN0fHN0cmluZ30gW3ByZWRpY2F0ZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZFxuICAgICAqICBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEBwYXJhbSB7Kn0gW3RoaXNBcmddIFRoZSBgdGhpc2AgYmluZGluZyBvZiBgcHJlZGljYXRlYC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIHNsaWNlIG9mIGBhcnJheWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8udGFrZVJpZ2h0V2hpbGUoWzEsIDIsIDNdLCBmdW5jdGlvbihuKSB7XG4gICAgICogICByZXR1cm4gbiA+IDE7XG4gICAgICogfSk7XG4gICAgICogLy8gPT4gWzIsIDNdXG4gICAgICpcbiAgICAgKiB2YXIgdXNlcnMgPSBbXG4gICAgICogICB7ICd1c2VyJzogJ2Jhcm5leScsICAnYWN0aXZlJzogdHJ1ZSB9LFxuICAgICAqICAgeyAndXNlcic6ICdmcmVkJywgICAgJ2FjdGl2ZSc6IGZhbHNlIH0sXG4gICAgICogICB7ICd1c2VyJzogJ3BlYmJsZXMnLCAnYWN0aXZlJzogZmFsc2UgfVxuICAgICAqIF07XG4gICAgICpcbiAgICAgKiAvLyB1c2luZyB0aGUgYF8ubWF0Y2hlc2AgY2FsbGJhY2sgc2hvcnRoYW5kXG4gICAgICogXy5wbHVjayhfLnRha2VSaWdodFdoaWxlKHVzZXJzLCB7ICd1c2VyJzogJ3BlYmJsZXMnLCAnYWN0aXZlJzogZmFsc2UgfSksICd1c2VyJyk7XG4gICAgICogLy8gPT4gWydwZWJibGVzJ11cbiAgICAgKlxuICAgICAqIC8vIHVzaW5nIHRoZSBgXy5tYXRjaGVzUHJvcGVydHlgIGNhbGxiYWNrIHNob3J0aGFuZFxuICAgICAqIF8ucGx1Y2soXy50YWtlUmlnaHRXaGlsZSh1c2VycywgJ2FjdGl2ZScsIGZhbHNlKSwgJ3VzZXInKTtcbiAgICAgKiAvLyA9PiBbJ2ZyZWQnLCAncGViYmxlcyddXG4gICAgICpcbiAgICAgKiAvLyB1c2luZyB0aGUgYF8ucHJvcGVydHlgIGNhbGxiYWNrIHNob3J0aGFuZFxuICAgICAqIF8ucGx1Y2soXy50YWtlUmlnaHRXaGlsZSh1c2VycywgJ2FjdGl2ZScpLCAndXNlcicpO1xuICAgICAqIC8vID0+IFtdXG4gICAgICovXG4gICAgZnVuY3Rpb24gdGFrZVJpZ2h0V2hpbGUoYXJyYXksIHByZWRpY2F0ZSwgdGhpc0FyZykge1xuICAgICAgcmV0dXJuIChhcnJheSAmJiBhcnJheS5sZW5ndGgpXG4gICAgICAgID8gYmFzZVdoaWxlKGFycmF5LCBnZXRDYWxsYmFjayhwcmVkaWNhdGUsIHRoaXNBcmcsIDMpLCBmYWxzZSwgdHJ1ZSlcbiAgICAgICAgOiBbXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgc2xpY2Ugb2YgYGFycmF5YCB3aXRoIGVsZW1lbnRzIHRha2VuIGZyb20gdGhlIGJlZ2lubmluZy4gRWxlbWVudHNcbiAgICAgKiBhcmUgdGFrZW4gdW50aWwgYHByZWRpY2F0ZWAgcmV0dXJucyBmYWxzZXkuIFRoZSBwcmVkaWNhdGUgaXMgYm91bmQgdG9cbiAgICAgKiBgdGhpc0FyZ2AgYW5kIGludm9rZWQgd2l0aCB0aHJlZSBhcmd1bWVudHM6ICh2YWx1ZSwgaW5kZXgsIGFycmF5KS5cbiAgICAgKlxuICAgICAqIElmIGEgcHJvcGVydHkgbmFtZSBpcyBwcm92aWRlZCBmb3IgYHByZWRpY2F0ZWAgdGhlIGNyZWF0ZWQgYF8ucHJvcGVydHlgXG4gICAgICogc3R5bGUgY2FsbGJhY2sgcmV0dXJucyB0aGUgcHJvcGVydHkgdmFsdWUgb2YgdGhlIGdpdmVuIGVsZW1lbnQuXG4gICAgICpcbiAgICAgKiBJZiBhIHZhbHVlIGlzIGFsc28gcHJvdmlkZWQgZm9yIGB0aGlzQXJnYCB0aGUgY3JlYXRlZCBgXy5tYXRjaGVzUHJvcGVydHlgXG4gICAgICogc3R5bGUgY2FsbGJhY2sgcmV0dXJucyBgdHJ1ZWAgZm9yIGVsZW1lbnRzIHRoYXQgaGF2ZSBhIG1hdGNoaW5nIHByb3BlcnR5XG4gICAgICogdmFsdWUsIGVsc2UgYGZhbHNlYC5cbiAgICAgKlxuICAgICAqIElmIGFuIG9iamVjdCBpcyBwcm92aWRlZCBmb3IgYHByZWRpY2F0ZWAgdGhlIGNyZWF0ZWQgYF8ubWF0Y2hlc2Agc3R5bGVcbiAgICAgKiBjYWxsYmFjayByZXR1cm5zIGB0cnVlYCBmb3IgZWxlbWVudHMgdGhhdCBoYXZlIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBnaXZlblxuICAgICAqIG9iamVjdCwgZWxzZSBgZmFsc2VgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIHF1ZXJ5LlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb258T2JqZWN0fHN0cmluZ30gW3ByZWRpY2F0ZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZFxuICAgICAqICBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEBwYXJhbSB7Kn0gW3RoaXNBcmddIFRoZSBgdGhpc2AgYmluZGluZyBvZiBgcHJlZGljYXRlYC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIHNsaWNlIG9mIGBhcnJheWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8udGFrZVdoaWxlKFsxLCAyLCAzXSwgZnVuY3Rpb24obikge1xuICAgICAqICAgcmV0dXJuIG4gPCAzO1xuICAgICAqIH0pO1xuICAgICAqIC8vID0+IFsxLCAyXVxuICAgICAqXG4gICAgICogdmFyIHVzZXJzID0gW1xuICAgICAqICAgeyAndXNlcic6ICdiYXJuZXknLCAgJ2FjdGl2ZSc6IGZhbHNlIH0sXG4gICAgICogICB7ICd1c2VyJzogJ2ZyZWQnLCAgICAnYWN0aXZlJzogZmFsc2V9LFxuICAgICAqICAgeyAndXNlcic6ICdwZWJibGVzJywgJ2FjdGl2ZSc6IHRydWUgfVxuICAgICAqIF07XG4gICAgICpcbiAgICAgKiAvLyB1c2luZyB0aGUgYF8ubWF0Y2hlc2AgY2FsbGJhY2sgc2hvcnRoYW5kXG4gICAgICogXy5wbHVjayhfLnRha2VXaGlsZSh1c2VycywgeyAndXNlcic6ICdiYXJuZXknLCAnYWN0aXZlJzogZmFsc2UgfSksICd1c2VyJyk7XG4gICAgICogLy8gPT4gWydiYXJuZXknXVxuICAgICAqXG4gICAgICogLy8gdXNpbmcgdGhlIGBfLm1hdGNoZXNQcm9wZXJ0eWAgY2FsbGJhY2sgc2hvcnRoYW5kXG4gICAgICogXy5wbHVjayhfLnRha2VXaGlsZSh1c2VycywgJ2FjdGl2ZScsIGZhbHNlKSwgJ3VzZXInKTtcbiAgICAgKiAvLyA9PiBbJ2Jhcm5leScsICdmcmVkJ11cbiAgICAgKlxuICAgICAqIC8vIHVzaW5nIHRoZSBgXy5wcm9wZXJ0eWAgY2FsbGJhY2sgc2hvcnRoYW5kXG4gICAgICogXy5wbHVjayhfLnRha2VXaGlsZSh1c2VycywgJ2FjdGl2ZScpLCAndXNlcicpO1xuICAgICAqIC8vID0+IFtdXG4gICAgICovXG4gICAgZnVuY3Rpb24gdGFrZVdoaWxlKGFycmF5LCBwcmVkaWNhdGUsIHRoaXNBcmcpIHtcbiAgICAgIHJldHVybiAoYXJyYXkgJiYgYXJyYXkubGVuZ3RoKVxuICAgICAgICA/IGJhc2VXaGlsZShhcnJheSwgZ2V0Q2FsbGJhY2socHJlZGljYXRlLCB0aGlzQXJnLCAzKSlcbiAgICAgICAgOiBbXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGFycmF5IG9mIHVuaXF1ZSB2YWx1ZXMsIGluIG9yZGVyLCBmcm9tIGFsbCBvZiB0aGUgcHJvdmlkZWQgYXJyYXlzXG4gICAgICogdXNpbmcgW2BTYW1lVmFsdWVaZXJvYF0oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNi4wLyNzZWMtc2FtZXZhbHVlemVybylcbiAgICAgKiBmb3IgZXF1YWxpdHkgY29tcGFyaXNvbnMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0gey4uLkFycmF5fSBbYXJyYXlzXSBUaGUgYXJyYXlzIHRvIGluc3BlY3QuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgYXJyYXkgb2YgY29tYmluZWQgdmFsdWVzLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnVuaW9uKFsxLCAyXSwgWzQsIDJdLCBbMiwgMV0pO1xuICAgICAqIC8vID0+IFsxLCAyLCA0XVxuICAgICAqL1xuICAgIHZhciB1bmlvbiA9IHJlc3RQYXJhbShmdW5jdGlvbihhcnJheXMpIHtcbiAgICAgIHJldHVybiBiYXNlVW5pcShiYXNlRmxhdHRlbihhcnJheXMsIGZhbHNlLCB0cnVlKSk7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZHVwbGljYXRlLWZyZWUgdmVyc2lvbiBvZiBhbiBhcnJheSwgdXNpbmdcbiAgICAgKiBbYFNhbWVWYWx1ZVplcm9gXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi82LjAvI3NlYy1zYW1ldmFsdWV6ZXJvKVxuICAgICAqIGZvciBlcXVhbGl0eSBjb21wYXJpc29ucywgaW4gd2hpY2ggb25seSB0aGUgZmlyc3Qgb2NjdXJlbmNlIG9mIGVhY2ggZWxlbWVudFxuICAgICAqIGlzIGtlcHQuIFByb3ZpZGluZyBgdHJ1ZWAgZm9yIGBpc1NvcnRlZGAgcGVyZm9ybXMgYSBmYXN0ZXIgc2VhcmNoIGFsZ29yaXRobVxuICAgICAqIGZvciBzb3J0ZWQgYXJyYXlzLiBJZiBhbiBpdGVyYXRlZSBmdW5jdGlvbiBpcyBwcm92aWRlZCBpdCBpcyBpbnZva2VkIGZvclxuICAgICAqIGVhY2ggZWxlbWVudCBpbiB0aGUgYXJyYXkgdG8gZ2VuZXJhdGUgdGhlIGNyaXRlcmlvbiBieSB3aGljaCB1bmlxdWVuZXNzXG4gICAgICogaXMgY29tcHV0ZWQuIFRoZSBgaXRlcmF0ZWVgIGlzIGJvdW5kIHRvIGB0aGlzQXJnYCBhbmQgaW52b2tlZCB3aXRoIHRocmVlXG4gICAgICogYXJndW1lbnRzOiAodmFsdWUsIGluZGV4LCBhcnJheSkuXG4gICAgICpcbiAgICAgKiBJZiBhIHByb3BlcnR5IG5hbWUgaXMgcHJvdmlkZWQgZm9yIGBpdGVyYXRlZWAgdGhlIGNyZWF0ZWQgYF8ucHJvcGVydHlgXG4gICAgICogc3R5bGUgY2FsbGJhY2sgcmV0dXJucyB0aGUgcHJvcGVydHkgdmFsdWUgb2YgdGhlIGdpdmVuIGVsZW1lbnQuXG4gICAgICpcbiAgICAgKiBJZiBhIHZhbHVlIGlzIGFsc28gcHJvdmlkZWQgZm9yIGB0aGlzQXJnYCB0aGUgY3JlYXRlZCBgXy5tYXRjaGVzUHJvcGVydHlgXG4gICAgICogc3R5bGUgY2FsbGJhY2sgcmV0dXJucyBgdHJ1ZWAgZm9yIGVsZW1lbnRzIHRoYXQgaGF2ZSBhIG1hdGNoaW5nIHByb3BlcnR5XG4gICAgICogdmFsdWUsIGVsc2UgYGZhbHNlYC5cbiAgICAgKlxuICAgICAqIElmIGFuIG9iamVjdCBpcyBwcm92aWRlZCBmb3IgYGl0ZXJhdGVlYCB0aGUgY3JlYXRlZCBgXy5tYXRjaGVzYCBzdHlsZVxuICAgICAqIGNhbGxiYWNrIHJldHVybnMgYHRydWVgIGZvciBlbGVtZW50cyB0aGF0IGhhdmUgdGhlIHByb3BlcnRpZXMgb2YgdGhlIGdpdmVuXG4gICAgICogb2JqZWN0LCBlbHNlIGBmYWxzZWAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAYWxpYXMgdW5pcXVlXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbaXNTb3J0ZWRdIFNwZWNpZnkgdGhlIGFycmF5IGlzIHNvcnRlZC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufE9iamVjdHxzdHJpbmd9IFtpdGVyYXRlZV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcGFyYW0geyp9IFt0aGlzQXJnXSBUaGUgYHRoaXNgIGJpbmRpbmcgb2YgYGl0ZXJhdGVlYC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBkdXBsaWNhdGUtdmFsdWUtZnJlZSBhcnJheS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy51bmlxKFsyLCAxLCAyXSk7XG4gICAgICogLy8gPT4gWzIsIDFdXG4gICAgICpcbiAgICAgKiAvLyB1c2luZyBgaXNTb3J0ZWRgXG4gICAgICogXy51bmlxKFsxLCAxLCAyXSwgdHJ1ZSk7XG4gICAgICogLy8gPT4gWzEsIDJdXG4gICAgICpcbiAgICAgKiAvLyB1c2luZyBhbiBpdGVyYXRlZSBmdW5jdGlvblxuICAgICAqIF8udW5pcShbMSwgMi41LCAxLjUsIDJdLCBmdW5jdGlvbihuKSB7XG4gICAgICogICByZXR1cm4gdGhpcy5mbG9vcihuKTtcbiAgICAgKiB9LCBNYXRoKTtcbiAgICAgKiAvLyA9PiBbMSwgMi41XVxuICAgICAqXG4gICAgICogLy8gdXNpbmcgdGhlIGBfLnByb3BlcnR5YCBjYWxsYmFjayBzaG9ydGhhbmRcbiAgICAgKiBfLnVuaXEoW3sgJ3gnOiAxIH0sIHsgJ3gnOiAyIH0sIHsgJ3gnOiAxIH1dLCAneCcpO1xuICAgICAqIC8vID0+IFt7ICd4JzogMSB9LCB7ICd4JzogMiB9XVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHVuaXEoYXJyYXksIGlzU29ydGVkLCBpdGVyYXRlZSwgdGhpc0FyZykge1xuICAgICAgdmFyIGxlbmd0aCA9IGFycmF5ID8gYXJyYXkubGVuZ3RoIDogMDtcbiAgICAgIGlmICghbGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH1cbiAgICAgIGlmIChpc1NvcnRlZCAhPSBudWxsICYmIHR5cGVvZiBpc1NvcnRlZCAhPSAnYm9vbGVhbicpIHtcbiAgICAgICAgdGhpc0FyZyA9IGl0ZXJhdGVlO1xuICAgICAgICBpdGVyYXRlZSA9IGlzSXRlcmF0ZWVDYWxsKGFycmF5LCBpc1NvcnRlZCwgdGhpc0FyZykgPyB1bmRlZmluZWQgOiBpc1NvcnRlZDtcbiAgICAgICAgaXNTb3J0ZWQgPSBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHZhciBjYWxsYmFjayA9IGdldENhbGxiYWNrKCk7XG4gICAgICBpZiAoIShpdGVyYXRlZSA9PSBudWxsICYmIGNhbGxiYWNrID09PSBiYXNlQ2FsbGJhY2spKSB7XG4gICAgICAgIGl0ZXJhdGVlID0gY2FsbGJhY2soaXRlcmF0ZWUsIHRoaXNBcmcsIDMpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIChpc1NvcnRlZCAmJiBnZXRJbmRleE9mKCkgPT0gYmFzZUluZGV4T2YpXG4gICAgICAgID8gc29ydGVkVW5pcShhcnJheSwgaXRlcmF0ZWUpXG4gICAgICAgIDogYmFzZVVuaXEoYXJyYXksIGl0ZXJhdGVlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLnppcGAgZXhjZXB0IHRoYXQgaXQgYWNjZXB0cyBhbiBhcnJheSBvZiBncm91cGVkXG4gICAgICogZWxlbWVudHMgYW5kIGNyZWF0ZXMgYW4gYXJyYXkgcmVncm91cGluZyB0aGUgZWxlbWVudHMgdG8gdGhlaXIgcHJlLXppcFxuICAgICAqIGNvbmZpZ3VyYXRpb24uXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgb2YgZ3JvdXBlZCBlbGVtZW50cyB0byBwcm9jZXNzLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGFycmF5IG9mIHJlZ3JvdXBlZCBlbGVtZW50cy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIHppcHBlZCA9IF8uemlwKFsnZnJlZCcsICdiYXJuZXknXSwgWzMwLCA0MF0sIFt0cnVlLCBmYWxzZV0pO1xuICAgICAqIC8vID0+IFtbJ2ZyZWQnLCAzMCwgdHJ1ZV0sIFsnYmFybmV5JywgNDAsIGZhbHNlXV1cbiAgICAgKlxuICAgICAqIF8udW56aXAoemlwcGVkKTtcbiAgICAgKiAvLyA9PiBbWydmcmVkJywgJ2Jhcm5leSddLCBbMzAsIDQwXSwgW3RydWUsIGZhbHNlXV1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiB1bnppcChhcnJheSkge1xuICAgICAgaWYgKCEoYXJyYXkgJiYgYXJyYXkubGVuZ3RoKSkge1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG4gICAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgICBsZW5ndGggPSAwO1xuXG4gICAgICBhcnJheSA9IGFycmF5RmlsdGVyKGFycmF5LCBmdW5jdGlvbihncm91cCkge1xuICAgICAgICBpZiAoaXNBcnJheUxpa2UoZ3JvdXApKSB7XG4gICAgICAgICAgbGVuZ3RoID0gbmF0aXZlTWF4KGdyb3VwLmxlbmd0aCwgbGVuZ3RoKTtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICB2YXIgcmVzdWx0ID0gQXJyYXkobGVuZ3RoKTtcbiAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgIHJlc3VsdFtpbmRleF0gPSBhcnJheU1hcChhcnJheSwgYmFzZVByb3BlcnR5KGluZGV4KSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8udW56aXBgIGV4Y2VwdCB0aGF0IGl0IGFjY2VwdHMgYW4gaXRlcmF0ZWUgdG8gc3BlY2lmeVxuICAgICAqIGhvdyByZWdyb3VwZWQgdmFsdWVzIHNob3VsZCBiZSBjb21iaW5lZC4gVGhlIGBpdGVyYXRlZWAgaXMgYm91bmQgdG8gYHRoaXNBcmdgXG4gICAgICogYW5kIGludm9rZWQgd2l0aCBmb3VyIGFyZ3VtZW50czogKGFjY3VtdWxhdG9yLCB2YWx1ZSwgaW5kZXgsIGdyb3VwKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSBvZiBncm91cGVkIGVsZW1lbnRzIHRvIHByb2Nlc3MuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlXSBUaGUgZnVuY3Rpb24gdG8gY29tYmluZSByZWdyb3VwZWQgdmFsdWVzLlxuICAgICAqIEBwYXJhbSB7Kn0gW3RoaXNBcmddIFRoZSBgdGhpc2AgYmluZGluZyBvZiBgaXRlcmF0ZWVgLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGFycmF5IG9mIHJlZ3JvdXBlZCBlbGVtZW50cy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIHppcHBlZCA9IF8uemlwKFsxLCAyXSwgWzEwLCAyMF0sIFsxMDAsIDIwMF0pO1xuICAgICAqIC8vID0+IFtbMSwgMTAsIDEwMF0sIFsyLCAyMCwgMjAwXV1cbiAgICAgKlxuICAgICAqIF8udW56aXBXaXRoKHppcHBlZCwgXy5hZGQpO1xuICAgICAqIC8vID0+IFszLCAzMCwgMzAwXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHVuemlwV2l0aChhcnJheSwgaXRlcmF0ZWUsIHRoaXNBcmcpIHtcbiAgICAgIHZhciBsZW5ndGggPSBhcnJheSA/IGFycmF5Lmxlbmd0aCA6IDA7XG4gICAgICBpZiAoIWxlbmd0aCkge1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG4gICAgICB2YXIgcmVzdWx0ID0gdW56aXAoYXJyYXkpO1xuICAgICAgaWYgKGl0ZXJhdGVlID09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH1cbiAgICAgIGl0ZXJhdGVlID0gYmluZENhbGxiYWNrKGl0ZXJhdGVlLCB0aGlzQXJnLCA0KTtcbiAgICAgIHJldHVybiBhcnJheU1hcChyZXN1bHQsIGZ1bmN0aW9uKGdyb3VwKSB7XG4gICAgICAgIHJldHVybiBhcnJheVJlZHVjZShncm91cCwgaXRlcmF0ZWUsIHVuZGVmaW5lZCwgdHJ1ZSk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGFycmF5IGV4Y2x1ZGluZyBhbGwgcHJvdmlkZWQgdmFsdWVzIHVzaW5nXG4gICAgICogW2BTYW1lVmFsdWVaZXJvYF0oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNi4wLyNzZWMtc2FtZXZhbHVlemVybylcbiAgICAgKiBmb3IgZXF1YWxpdHkgY29tcGFyaXNvbnMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gZmlsdGVyLlxuICAgICAqIEBwYXJhbSB7Li4uKn0gW3ZhbHVlc10gVGhlIHZhbHVlcyB0byBleGNsdWRlLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGFycmF5IG9mIGZpbHRlcmVkIHZhbHVlcy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy53aXRob3V0KFsxLCAyLCAxLCAzXSwgMSwgMik7XG4gICAgICogLy8gPT4gWzNdXG4gICAgICovXG4gICAgdmFyIHdpdGhvdXQgPSByZXN0UGFyYW0oZnVuY3Rpb24oYXJyYXksIHZhbHVlcykge1xuICAgICAgcmV0dXJuIGlzQXJyYXlMaWtlKGFycmF5KVxuICAgICAgICA/IGJhc2VEaWZmZXJlbmNlKGFycmF5LCB2YWx1ZXMpXG4gICAgICAgIDogW107XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGFycmF5IG9mIHVuaXF1ZSB2YWx1ZXMgdGhhdCBpcyB0aGUgW3N5bW1ldHJpYyBkaWZmZXJlbmNlXShodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9TeW1tZXRyaWNfZGlmZmVyZW5jZSlcbiAgICAgKiBvZiB0aGUgcHJvdmlkZWQgYXJyYXlzLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHsuLi5BcnJheX0gW2FycmF5c10gVGhlIGFycmF5cyB0byBpbnNwZWN0LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGFycmF5IG9mIHZhbHVlcy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy54b3IoWzEsIDJdLCBbNCwgMl0pO1xuICAgICAqIC8vID0+IFsxLCA0XVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHhvcigpIHtcbiAgICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICAgIGxlbmd0aCA9IGFyZ3VtZW50cy5sZW5ndGg7XG5cbiAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgIHZhciBhcnJheSA9IGFyZ3VtZW50c1tpbmRleF07XG4gICAgICAgIGlmIChpc0FycmF5TGlrZShhcnJheSkpIHtcbiAgICAgICAgICB2YXIgcmVzdWx0ID0gcmVzdWx0XG4gICAgICAgICAgICA/IGFycmF5UHVzaChiYXNlRGlmZmVyZW5jZShyZXN1bHQsIGFycmF5KSwgYmFzZURpZmZlcmVuY2UoYXJyYXksIHJlc3VsdCkpXG4gICAgICAgICAgICA6IGFycmF5O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0ID8gYmFzZVVuaXEocmVzdWx0KSA6IFtdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gYXJyYXkgb2YgZ3JvdXBlZCBlbGVtZW50cywgdGhlIGZpcnN0IG9mIHdoaWNoIGNvbnRhaW5zIHRoZSBmaXJzdFxuICAgICAqIGVsZW1lbnRzIG9mIHRoZSBnaXZlbiBhcnJheXMsIHRoZSBzZWNvbmQgb2Ygd2hpY2ggY29udGFpbnMgdGhlIHNlY29uZCBlbGVtZW50c1xuICAgICAqIG9mIHRoZSBnaXZlbiBhcnJheXMsIGFuZCBzbyBvbi5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7Li4uQXJyYXl9IFthcnJheXNdIFRoZSBhcnJheXMgdG8gcHJvY2Vzcy5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBhcnJheSBvZiBncm91cGVkIGVsZW1lbnRzLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnppcChbJ2ZyZWQnLCAnYmFybmV5J10sIFszMCwgNDBdLCBbdHJ1ZSwgZmFsc2VdKTtcbiAgICAgKiAvLyA9PiBbWydmcmVkJywgMzAsIHRydWVdLCBbJ2Jhcm5leScsIDQwLCBmYWxzZV1dXG4gICAgICovXG4gICAgdmFyIHppcCA9IHJlc3RQYXJhbSh1bnppcCk7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgaW52ZXJzZSBvZiBgXy5wYWlyc2A7IHRoaXMgbWV0aG9kIHJldHVybnMgYW4gb2JqZWN0IGNvbXBvc2VkIGZyb20gYXJyYXlzXG4gICAgICogb2YgcHJvcGVydHkgbmFtZXMgYW5kIHZhbHVlcy4gUHJvdmlkZSBlaXRoZXIgYSBzaW5nbGUgdHdvIGRpbWVuc2lvbmFsIGFycmF5LFxuICAgICAqIGUuZy4gYFtba2V5MSwgdmFsdWUxXSwgW2tleTIsIHZhbHVlMl1dYCBvciB0d28gYXJyYXlzLCBvbmUgb2YgcHJvcGVydHkgbmFtZXNcbiAgICAgKiBhbmQgb25lIG9mIGNvcnJlc3BvbmRpbmcgdmFsdWVzLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGFsaWFzIG9iamVjdFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IHByb3BzIFRoZSBwcm9wZXJ0eSBuYW1lcy5cbiAgICAgKiBAcGFyYW0ge0FycmF5fSBbdmFsdWVzPVtdXSBUaGUgcHJvcGVydHkgdmFsdWVzLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIG5ldyBvYmplY3QuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uemlwT2JqZWN0KFtbJ2ZyZWQnLCAzMF0sIFsnYmFybmV5JywgNDBdXSk7XG4gICAgICogLy8gPT4geyAnZnJlZCc6IDMwLCAnYmFybmV5JzogNDAgfVxuICAgICAqXG4gICAgICogXy56aXBPYmplY3QoWydmcmVkJywgJ2Jhcm5leSddLCBbMzAsIDQwXSk7XG4gICAgICogLy8gPT4geyAnZnJlZCc6IDMwLCAnYmFybmV5JzogNDAgfVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHppcE9iamVjdChwcm9wcywgdmFsdWVzKSB7XG4gICAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgICBsZW5ndGggPSBwcm9wcyA/IHByb3BzLmxlbmd0aCA6IDAsXG4gICAgICAgICAgcmVzdWx0ID0ge307XG5cbiAgICAgIGlmIChsZW5ndGggJiYgIXZhbHVlcyAmJiAhaXNBcnJheShwcm9wc1swXSkpIHtcbiAgICAgICAgdmFsdWVzID0gW107XG4gICAgICB9XG4gICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICB2YXIga2V5ID0gcHJvcHNbaW5kZXhdO1xuICAgICAgICBpZiAodmFsdWVzKSB7XG4gICAgICAgICAgcmVzdWx0W2tleV0gPSB2YWx1ZXNbaW5kZXhdO1xuICAgICAgICB9IGVsc2UgaWYgKGtleSkge1xuICAgICAgICAgIHJlc3VsdFtrZXlbMF1dID0ga2V5WzFdO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uemlwYCBleGNlcHQgdGhhdCBpdCBhY2NlcHRzIGFuIGl0ZXJhdGVlIHRvIHNwZWNpZnlcbiAgICAgKiBob3cgZ3JvdXBlZCB2YWx1ZXMgc2hvdWxkIGJlIGNvbWJpbmVkLiBUaGUgYGl0ZXJhdGVlYCBpcyBib3VuZCB0byBgdGhpc0FyZ2BcbiAgICAgKiBhbmQgaW52b2tlZCB3aXRoIGZvdXIgYXJndW1lbnRzOiAoYWNjdW11bGF0b3IsIHZhbHVlLCBpbmRleCwgZ3JvdXApLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHsuLi5BcnJheX0gW2FycmF5c10gVGhlIGFycmF5cyB0byBwcm9jZXNzLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZV0gVGhlIGZ1bmN0aW9uIHRvIGNvbWJpbmUgZ3JvdXBlZCB2YWx1ZXMuXG4gICAgICogQHBhcmFtIHsqfSBbdGhpc0FyZ10gVGhlIGB0aGlzYCBiaW5kaW5nIG9mIGBpdGVyYXRlZWAuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgYXJyYXkgb2YgZ3JvdXBlZCBlbGVtZW50cy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy56aXBXaXRoKFsxLCAyXSwgWzEwLCAyMF0sIFsxMDAsIDIwMF0sIF8uYWRkKTtcbiAgICAgKiAvLyA9PiBbMTExLCAyMjJdXG4gICAgICovXG4gICAgdmFyIHppcFdpdGggPSByZXN0UGFyYW0oZnVuY3Rpb24oYXJyYXlzKSB7XG4gICAgICB2YXIgbGVuZ3RoID0gYXJyYXlzLmxlbmd0aCxcbiAgICAgICAgICBpdGVyYXRlZSA9IGxlbmd0aCA+IDIgPyBhcnJheXNbbGVuZ3RoIC0gMl0gOiB1bmRlZmluZWQsXG4gICAgICAgICAgdGhpc0FyZyA9IGxlbmd0aCA+IDEgPyBhcnJheXNbbGVuZ3RoIC0gMV0gOiB1bmRlZmluZWQ7XG5cbiAgICAgIGlmIChsZW5ndGggPiAyICYmIHR5cGVvZiBpdGVyYXRlZSA9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIGxlbmd0aCAtPSAyO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaXRlcmF0ZWUgPSAobGVuZ3RoID4gMSAmJiB0eXBlb2YgdGhpc0FyZyA9PSAnZnVuY3Rpb24nKSA/ICgtLWxlbmd0aCwgdGhpc0FyZykgOiB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXNBcmcgPSB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgICBhcnJheXMubGVuZ3RoID0gbGVuZ3RoO1xuICAgICAgcmV0dXJuIHVuemlwV2l0aChhcnJheXMsIGl0ZXJhdGVlLCB0aGlzQXJnKTtcbiAgICB9KTtcblxuICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBgbG9kYXNoYCBvYmplY3QgdGhhdCB3cmFwcyBgdmFsdWVgIHdpdGggZXhwbGljaXQgbWV0aG9kXG4gICAgICogY2hhaW5pbmcgZW5hYmxlZC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBjYXRlZ29yeSBDaGFpblxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHdyYXAuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgbmV3IGBsb2Rhc2hgIHdyYXBwZXIgaW5zdGFuY2UuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciB1c2VycyA9IFtcbiAgICAgKiAgIHsgJ3VzZXInOiAnYmFybmV5JywgICdhZ2UnOiAzNiB9LFxuICAgICAqICAgeyAndXNlcic6ICdmcmVkJywgICAgJ2FnZSc6IDQwIH0sXG4gICAgICogICB7ICd1c2VyJzogJ3BlYmJsZXMnLCAnYWdlJzogMSB9XG4gICAgICogXTtcbiAgICAgKlxuICAgICAqIHZhciB5b3VuZ2VzdCA9IF8uY2hhaW4odXNlcnMpXG4gICAgICogICAuc29ydEJ5KCdhZ2UnKVxuICAgICAqICAgLm1hcChmdW5jdGlvbihjaHIpIHtcbiAgICAgKiAgICAgcmV0dXJuIGNoci51c2VyICsgJyBpcyAnICsgY2hyLmFnZTtcbiAgICAgKiAgIH0pXG4gICAgICogICAuZmlyc3QoKVxuICAgICAqICAgLnZhbHVlKCk7XG4gICAgICogLy8gPT4gJ3BlYmJsZXMgaXMgMSdcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjaGFpbih2YWx1ZSkge1xuICAgICAgdmFyIHJlc3VsdCA9IGxvZGFzaCh2YWx1ZSk7XG4gICAgICByZXN1bHQuX19jaGFpbl9fID0gdHJ1ZTtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaW52b2tlcyBgaW50ZXJjZXB0b3JgIGFuZCByZXR1cm5zIGB2YWx1ZWAuIFRoZSBpbnRlcmNlcHRvciBpc1xuICAgICAqIGJvdW5kIHRvIGB0aGlzQXJnYCBhbmQgaW52b2tlZCB3aXRoIG9uZSBhcmd1bWVudDsgKHZhbHVlKS4gVGhlIHB1cnBvc2Ugb2ZcbiAgICAgKiB0aGlzIG1ldGhvZCBpcyB0byBcInRhcCBpbnRvXCIgYSBtZXRob2QgY2hhaW4gaW4gb3JkZXIgdG8gcGVyZm9ybSBvcGVyYXRpb25zXG4gICAgICogb24gaW50ZXJtZWRpYXRlIHJlc3VsdHMgd2l0aGluIHRoZSBjaGFpbi5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBjYXRlZ29yeSBDaGFpblxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHByb3ZpZGUgdG8gYGludGVyY2VwdG9yYC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBpbnRlcmNlcHRvciBUaGUgZnVuY3Rpb24gdG8gaW52b2tlLlxuICAgICAqIEBwYXJhbSB7Kn0gW3RoaXNBcmddIFRoZSBgdGhpc2AgYmluZGluZyBvZiBgaW50ZXJjZXB0b3JgLlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIGB2YWx1ZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8oWzEsIDIsIDNdKVxuICAgICAqICAudGFwKGZ1bmN0aW9uKGFycmF5KSB7XG4gICAgICogICAgYXJyYXkucG9wKCk7XG4gICAgICogIH0pXG4gICAgICogIC5yZXZlcnNlKClcbiAgICAgKiAgLnZhbHVlKCk7XG4gICAgICogLy8gPT4gWzIsIDFdXG4gICAgICovXG4gICAgZnVuY3Rpb24gdGFwKHZhbHVlLCBpbnRlcmNlcHRvciwgdGhpc0FyZykge1xuICAgICAgaW50ZXJjZXB0b3IuY2FsbCh0aGlzQXJnLCB2YWx1ZSk7XG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy50YXBgIGV4Y2VwdCB0aGF0IGl0IHJldHVybnMgdGhlIHJlc3VsdCBvZiBgaW50ZXJjZXB0b3JgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IENoYWluXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gcHJvdmlkZSB0byBgaW50ZXJjZXB0b3JgLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGludGVyY2VwdG9yIFRoZSBmdW5jdGlvbiB0byBpbnZva2UuXG4gICAgICogQHBhcmFtIHsqfSBbdGhpc0FyZ10gVGhlIGB0aGlzYCBiaW5kaW5nIG9mIGBpbnRlcmNlcHRvcmAuXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIHJlc3VsdCBvZiBgaW50ZXJjZXB0b3JgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfKCcgIGFiYyAgJylcbiAgICAgKiAgLmNoYWluKClcbiAgICAgKiAgLnRyaW0oKVxuICAgICAqICAudGhydShmdW5jdGlvbih2YWx1ZSkge1xuICAgICAqICAgIHJldHVybiBbdmFsdWVdO1xuICAgICAqICB9KVxuICAgICAqICAudmFsdWUoKTtcbiAgICAgKiAvLyA9PiBbJ2FiYyddXG4gICAgICovXG4gICAgZnVuY3Rpb24gdGhydSh2YWx1ZSwgaW50ZXJjZXB0b3IsIHRoaXNBcmcpIHtcbiAgICAgIHJldHVybiBpbnRlcmNlcHRvci5jYWxsKHRoaXNBcmcsIHZhbHVlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFbmFibGVzIGV4cGxpY2l0IG1ldGhvZCBjaGFpbmluZyBvbiB0aGUgd3JhcHBlciBvYmplY3QuXG4gICAgICpcbiAgICAgKiBAbmFtZSBjaGFpblxuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IENoYWluXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgbmV3IGBsb2Rhc2hgIHdyYXBwZXIgaW5zdGFuY2UuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciB1c2VycyA9IFtcbiAgICAgKiAgIHsgJ3VzZXInOiAnYmFybmV5JywgJ2FnZSc6IDM2IH0sXG4gICAgICogICB7ICd1c2VyJzogJ2ZyZWQnLCAgICdhZ2UnOiA0MCB9XG4gICAgICogXTtcbiAgICAgKlxuICAgICAqIC8vIHdpdGhvdXQgZXhwbGljaXQgY2hhaW5pbmdcbiAgICAgKiBfKHVzZXJzKS5maXJzdCgpO1xuICAgICAqIC8vID0+IHsgJ3VzZXInOiAnYmFybmV5JywgJ2FnZSc6IDM2IH1cbiAgICAgKlxuICAgICAqIC8vIHdpdGggZXhwbGljaXQgY2hhaW5pbmdcbiAgICAgKiBfKHVzZXJzKS5jaGFpbigpXG4gICAgICogICAuZmlyc3QoKVxuICAgICAqICAgLnBpY2soJ3VzZXInKVxuICAgICAqICAgLnZhbHVlKCk7XG4gICAgICogLy8gPT4geyAndXNlcic6ICdiYXJuZXknIH1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiB3cmFwcGVyQ2hhaW4oKSB7XG4gICAgICByZXR1cm4gY2hhaW4odGhpcyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRXhlY3V0ZXMgdGhlIGNoYWluZWQgc2VxdWVuY2UgYW5kIHJldHVybnMgdGhlIHdyYXBwZWQgcmVzdWx0LlxuICAgICAqXG4gICAgICogQG5hbWUgY29tbWl0XG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAY2F0ZWdvcnkgQ2hhaW5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBuZXcgYGxvZGFzaGAgd3JhcHBlciBpbnN0YW5jZS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIGFycmF5ID0gWzEsIDJdO1xuICAgICAqIHZhciB3cmFwcGVkID0gXyhhcnJheSkucHVzaCgzKTtcbiAgICAgKlxuICAgICAqIGNvbnNvbGUubG9nKGFycmF5KTtcbiAgICAgKiAvLyA9PiBbMSwgMl1cbiAgICAgKlxuICAgICAqIHdyYXBwZWQgPSB3cmFwcGVkLmNvbW1pdCgpO1xuICAgICAqIGNvbnNvbGUubG9nKGFycmF5KTtcbiAgICAgKiAvLyA9PiBbMSwgMiwgM11cbiAgICAgKlxuICAgICAqIHdyYXBwZWQubGFzdCgpO1xuICAgICAqIC8vID0+IDNcbiAgICAgKlxuICAgICAqIGNvbnNvbGUubG9nKGFycmF5KTtcbiAgICAgKiAvLyA9PiBbMSwgMiwgM11cbiAgICAgKi9cbiAgICBmdW5jdGlvbiB3cmFwcGVyQ29tbWl0KCkge1xuICAgICAgcmV0dXJuIG5ldyBMb2Rhc2hXcmFwcGVyKHRoaXMudmFsdWUoKSwgdGhpcy5fX2NoYWluX18pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgYXJyYXkgam9pbmluZyBhIHdyYXBwZWQgYXJyYXkgd2l0aCBhbnkgYWRkaXRpb25hbCBhcnJheXNcbiAgICAgKiBhbmQvb3IgdmFsdWVzLlxuICAgICAqXG4gICAgICogQG5hbWUgY29uY2F0XG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAY2F0ZWdvcnkgQ2hhaW5cbiAgICAgKiBAcGFyYW0gey4uLip9IFt2YWx1ZXNdIFRoZSB2YWx1ZXMgdG8gY29uY2F0ZW5hdGUuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgY29uY2F0ZW5hdGVkIGFycmF5LlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgYXJyYXkgPSBbMV07XG4gICAgICogdmFyIHdyYXBwZWQgPSBfKGFycmF5KS5jb25jYXQoMiwgWzNdLCBbWzRdXSk7XG4gICAgICpcbiAgICAgKiBjb25zb2xlLmxvZyh3cmFwcGVkLnZhbHVlKCkpO1xuICAgICAqIC8vID0+IFsxLCAyLCAzLCBbNF1dXG4gICAgICpcbiAgICAgKiBjb25zb2xlLmxvZyhhcnJheSk7XG4gICAgICogLy8gPT4gWzFdXG4gICAgICovXG4gICAgdmFyIHdyYXBwZXJDb25jYXQgPSByZXN0UGFyYW0oZnVuY3Rpb24odmFsdWVzKSB7XG4gICAgICB2YWx1ZXMgPSBiYXNlRmxhdHRlbih2YWx1ZXMpO1xuICAgICAgcmV0dXJuIHRoaXMudGhydShmdW5jdGlvbihhcnJheSkge1xuICAgICAgICByZXR1cm4gYXJyYXlDb25jYXQoaXNBcnJheShhcnJheSkgPyBhcnJheSA6IFt0b09iamVjdChhcnJheSldLCB2YWx1ZXMpO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgY2xvbmUgb2YgdGhlIGNoYWluZWQgc2VxdWVuY2UgcGxhbnRpbmcgYHZhbHVlYCBhcyB0aGUgd3JhcHBlZCB2YWx1ZS5cbiAgICAgKlxuICAgICAqIEBuYW1lIHBsYW50XG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAY2F0ZWdvcnkgQ2hhaW5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBuZXcgYGxvZGFzaGAgd3JhcHBlciBpbnN0YW5jZS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIGFycmF5ID0gWzEsIDJdO1xuICAgICAqIHZhciB3cmFwcGVkID0gXyhhcnJheSkubWFwKGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICogICByZXR1cm4gTWF0aC5wb3codmFsdWUsIDIpO1xuICAgICAqIH0pO1xuICAgICAqXG4gICAgICogdmFyIG90aGVyID0gWzMsIDRdO1xuICAgICAqIHZhciBvdGhlcldyYXBwZWQgPSB3cmFwcGVkLnBsYW50KG90aGVyKTtcbiAgICAgKlxuICAgICAqIG90aGVyV3JhcHBlZC52YWx1ZSgpO1xuICAgICAqIC8vID0+IFs5LCAxNl1cbiAgICAgKlxuICAgICAqIHdyYXBwZWQudmFsdWUoKTtcbiAgICAgKiAvLyA9PiBbMSwgNF1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiB3cmFwcGVyUGxhbnQodmFsdWUpIHtcbiAgICAgIHZhciByZXN1bHQsXG4gICAgICAgICAgcGFyZW50ID0gdGhpcztcblxuICAgICAgd2hpbGUgKHBhcmVudCBpbnN0YW5jZW9mIGJhc2VMb2Rhc2gpIHtcbiAgICAgICAgdmFyIGNsb25lID0gd3JhcHBlckNsb25lKHBhcmVudCk7XG4gICAgICAgIGlmIChyZXN1bHQpIHtcbiAgICAgICAgICBwcmV2aW91cy5fX3dyYXBwZWRfXyA9IGNsb25lO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlc3VsdCA9IGNsb25lO1xuICAgICAgICB9XG4gICAgICAgIHZhciBwcmV2aW91cyA9IGNsb25lO1xuICAgICAgICBwYXJlbnQgPSBwYXJlbnQuX193cmFwcGVkX187XG4gICAgICB9XG4gICAgICBwcmV2aW91cy5fX3dyYXBwZWRfXyA9IHZhbHVlO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXZlcnNlcyB0aGUgd3JhcHBlZCBhcnJheSBzbyB0aGUgZmlyc3QgZWxlbWVudCBiZWNvbWVzIHRoZSBsYXN0LCB0aGVcbiAgICAgKiBzZWNvbmQgZWxlbWVudCBiZWNvbWVzIHRoZSBzZWNvbmQgdG8gbGFzdCwgYW5kIHNvIG9uLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoaXMgbWV0aG9kIG11dGF0ZXMgdGhlIHdyYXBwZWQgYXJyYXkuXG4gICAgICpcbiAgICAgKiBAbmFtZSByZXZlcnNlXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAY2F0ZWdvcnkgQ2hhaW5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBuZXcgcmV2ZXJzZWQgYGxvZGFzaGAgd3JhcHBlciBpbnN0YW5jZS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIGFycmF5ID0gWzEsIDIsIDNdO1xuICAgICAqXG4gICAgICogXyhhcnJheSkucmV2ZXJzZSgpLnZhbHVlKClcbiAgICAgKiAvLyA9PiBbMywgMiwgMV1cbiAgICAgKlxuICAgICAqIGNvbnNvbGUubG9nKGFycmF5KTtcbiAgICAgKiAvLyA9PiBbMywgMiwgMV1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiB3cmFwcGVyUmV2ZXJzZSgpIHtcbiAgICAgIHZhciB2YWx1ZSA9IHRoaXMuX193cmFwcGVkX187XG5cbiAgICAgIHZhciBpbnRlcmNlcHRvciA9IGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiAod3JhcHBlZCAmJiB3cmFwcGVkLl9fZGlyX18gPCAwKSA/IHZhbHVlIDogdmFsdWUucmV2ZXJzZSgpO1xuICAgICAgfTtcbiAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIExhenlXcmFwcGVyKSB7XG4gICAgICAgIHZhciB3cmFwcGVkID0gdmFsdWU7XG4gICAgICAgIGlmICh0aGlzLl9fYWN0aW9uc19fLmxlbmd0aCkge1xuICAgICAgICAgIHdyYXBwZWQgPSBuZXcgTGF6eVdyYXBwZXIodGhpcyk7XG4gICAgICAgIH1cbiAgICAgICAgd3JhcHBlZCA9IHdyYXBwZWQucmV2ZXJzZSgpO1xuICAgICAgICB3cmFwcGVkLl9fYWN0aW9uc19fLnB1c2goeyAnZnVuYyc6IHRocnUsICdhcmdzJzogW2ludGVyY2VwdG9yXSwgJ3RoaXNBcmcnOiB1bmRlZmluZWQgfSk7XG4gICAgICAgIHJldHVybiBuZXcgTG9kYXNoV3JhcHBlcih3cmFwcGVkLCB0aGlzLl9fY2hhaW5fXyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcy50aHJ1KGludGVyY2VwdG9yKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQcm9kdWNlcyB0aGUgcmVzdWx0IG9mIGNvZXJjaW5nIHRoZSB1bndyYXBwZWQgdmFsdWUgdG8gYSBzdHJpbmcuXG4gICAgICpcbiAgICAgKiBAbmFtZSB0b1N0cmluZ1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IENoYWluXG4gICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgY29lcmNlZCBzdHJpbmcgdmFsdWUuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8oWzEsIDIsIDNdKS50b1N0cmluZygpO1xuICAgICAqIC8vID0+ICcxLDIsMydcbiAgICAgKi9cbiAgICBmdW5jdGlvbiB3cmFwcGVyVG9TdHJpbmcoKSB7XG4gICAgICByZXR1cm4gKHRoaXMudmFsdWUoKSArICcnKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFeGVjdXRlcyB0aGUgY2hhaW5lZCBzZXF1ZW5jZSB0byBleHRyYWN0IHRoZSB1bndyYXBwZWQgdmFsdWUuXG4gICAgICpcbiAgICAgKiBAbmFtZSB2YWx1ZVxuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGFsaWFzIHJ1biwgdG9KU09OLCB2YWx1ZU9mXG4gICAgICogQGNhdGVnb3J5IENoYWluXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIHJlc29sdmVkIHVud3JhcHBlZCB2YWx1ZS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXyhbMSwgMiwgM10pLnZhbHVlKCk7XG4gICAgICogLy8gPT4gWzEsIDIsIDNdXG4gICAgICovXG4gICAgZnVuY3Rpb24gd3JhcHBlclZhbHVlKCkge1xuICAgICAgcmV0dXJuIGJhc2VXcmFwcGVyVmFsdWUodGhpcy5fX3dyYXBwZWRfXywgdGhpcy5fX2FjdGlvbnNfXyk7XG4gICAgfVxuXG4gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBhcnJheSBvZiBlbGVtZW50cyBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiBrZXlzLCBvciBpbmRleGVzLFxuICAgICAqIG9mIGBjb2xsZWN0aW9uYC4gS2V5cyBtYXkgYmUgc3BlY2lmaWVkIGFzIGluZGl2aWR1YWwgYXJndW1lbnRzIG9yIGFzIGFycmF5c1xuICAgICAqIG9mIGtleXMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAY2F0ZWdvcnkgQ29sbGVjdGlvblxuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fHN0cmluZ30gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHsuLi4obnVtYmVyfG51bWJlcltdfHN0cmluZ3xzdHJpbmdbXSl9IFtwcm9wc10gVGhlIHByb3BlcnR5IG5hbWVzXG4gICAgICogIG9yIGluZGV4ZXMgb2YgZWxlbWVudHMgdG8gcGljaywgc3BlY2lmaWVkIGluZGl2aWR1YWxseSBvciBpbiBhcnJheXMuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgYXJyYXkgb2YgcGlja2VkIGVsZW1lbnRzLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmF0KFsnYScsICdiJywgJ2MnXSwgWzAsIDJdKTtcbiAgICAgKiAvLyA9PiBbJ2EnLCAnYyddXG4gICAgICpcbiAgICAgKiBfLmF0KFsnYmFybmV5JywgJ2ZyZWQnLCAncGViYmxlcyddLCAwLCAyKTtcbiAgICAgKiAvLyA9PiBbJ2Jhcm5leScsICdwZWJibGVzJ11cbiAgICAgKi9cbiAgICB2YXIgYXQgPSByZXN0UGFyYW0oZnVuY3Rpb24oY29sbGVjdGlvbiwgcHJvcHMpIHtcbiAgICAgIHJldHVybiBiYXNlQXQoY29sbGVjdGlvbiwgYmFzZUZsYXR0ZW4ocHJvcHMpKTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gb2JqZWN0IGNvbXBvc2VkIG9mIGtleXMgZ2VuZXJhdGVkIGZyb20gdGhlIHJlc3VsdHMgb2YgcnVubmluZ1xuICAgICAqIGVhY2ggZWxlbWVudCBvZiBgY29sbGVjdGlvbmAgdGhyb3VnaCBgaXRlcmF0ZWVgLiBUaGUgY29ycmVzcG9uZGluZyB2YWx1ZVxuICAgICAqIG9mIGVhY2gga2V5IGlzIHRoZSBudW1iZXIgb2YgdGltZXMgdGhlIGtleSB3YXMgcmV0dXJuZWQgYnkgYGl0ZXJhdGVlYC5cbiAgICAgKiBUaGUgYGl0ZXJhdGVlYCBpcyBib3VuZCB0byBgdGhpc0FyZ2AgYW5kIGludm9rZWQgd2l0aCB0aHJlZSBhcmd1bWVudHM6XG4gICAgICogKHZhbHVlLCBpbmRleHxrZXksIGNvbGxlY3Rpb24pLlxuICAgICAqXG4gICAgICogSWYgYSBwcm9wZXJ0eSBuYW1lIGlzIHByb3ZpZGVkIGZvciBgaXRlcmF0ZWVgIHRoZSBjcmVhdGVkIGBfLnByb3BlcnR5YFxuICAgICAqIHN0eWxlIGNhbGxiYWNrIHJldHVybnMgdGhlIHByb3BlcnR5IHZhbHVlIG9mIHRoZSBnaXZlbiBlbGVtZW50LlxuICAgICAqXG4gICAgICogSWYgYSB2YWx1ZSBpcyBhbHNvIHByb3ZpZGVkIGZvciBgdGhpc0FyZ2AgdGhlIGNyZWF0ZWQgYF8ubWF0Y2hlc1Byb3BlcnR5YFxuICAgICAqIHN0eWxlIGNhbGxiYWNrIHJldHVybnMgYHRydWVgIGZvciBlbGVtZW50cyB0aGF0IGhhdmUgYSBtYXRjaGluZyBwcm9wZXJ0eVxuICAgICAqIHZhbHVlLCBlbHNlIGBmYWxzZWAuXG4gICAgICpcbiAgICAgKiBJZiBhbiBvYmplY3QgaXMgcHJvdmlkZWQgZm9yIGBpdGVyYXRlZWAgdGhlIGNyZWF0ZWQgYF8ubWF0Y2hlc2Agc3R5bGVcbiAgICAgKiBjYWxsYmFjayByZXR1cm5zIGB0cnVlYCBmb3IgZWxlbWVudHMgdGhhdCBoYXZlIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBnaXZlblxuICAgICAqIG9iamVjdCwgZWxzZSBgZmFsc2VgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IENvbGxlY3Rpb25cbiAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdHxzdHJpbmd9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb258T2JqZWN0fHN0cmluZ30gW2l0ZXJhdGVlPV8uaWRlbnRpdHldIFRoZSBmdW5jdGlvbiBpbnZva2VkXG4gICAgICogIHBlciBpdGVyYXRpb24uXG4gICAgICogQHBhcmFtIHsqfSBbdGhpc0FyZ10gVGhlIGB0aGlzYCBiaW5kaW5nIG9mIGBpdGVyYXRlZWAuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgY29tcG9zZWQgYWdncmVnYXRlIG9iamVjdC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5jb3VudEJ5KFs0LjMsIDYuMSwgNi40XSwgZnVuY3Rpb24obikge1xuICAgICAqICAgcmV0dXJuIE1hdGguZmxvb3Iobik7XG4gICAgICogfSk7XG4gICAgICogLy8gPT4geyAnNCc6IDEsICc2JzogMiB9XG4gICAgICpcbiAgICAgKiBfLmNvdW50QnkoWzQuMywgNi4xLCA2LjRdLCBmdW5jdGlvbihuKSB7XG4gICAgICogICByZXR1cm4gdGhpcy5mbG9vcihuKTtcbiAgICAgKiB9LCBNYXRoKTtcbiAgICAgKiAvLyA9PiB7ICc0JzogMSwgJzYnOiAyIH1cbiAgICAgKlxuICAgICAqIF8uY291bnRCeShbJ29uZScsICd0d28nLCAndGhyZWUnXSwgJ2xlbmd0aCcpO1xuICAgICAqIC8vID0+IHsgJzMnOiAyLCAnNSc6IDEgfVxuICAgICAqL1xuICAgIHZhciBjb3VudEJ5ID0gY3JlYXRlQWdncmVnYXRvcihmdW5jdGlvbihyZXN1bHQsIHZhbHVlLCBrZXkpIHtcbiAgICAgIGhhc093blByb3BlcnR5LmNhbGwocmVzdWx0LCBrZXkpID8gKytyZXN1bHRba2V5XSA6IChyZXN1bHRba2V5XSA9IDEpO1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGBwcmVkaWNhdGVgIHJldHVybnMgdHJ1dGh5IGZvciAqKmFsbCoqIGVsZW1lbnRzIG9mIGBjb2xsZWN0aW9uYC5cbiAgICAgKiBUaGUgcHJlZGljYXRlIGlzIGJvdW5kIHRvIGB0aGlzQXJnYCBhbmQgaW52b2tlZCB3aXRoIHRocmVlIGFyZ3VtZW50czpcbiAgICAgKiAodmFsdWUsIGluZGV4fGtleSwgY29sbGVjdGlvbikuXG4gICAgICpcbiAgICAgKiBJZiBhIHByb3BlcnR5IG5hbWUgaXMgcHJvdmlkZWQgZm9yIGBwcmVkaWNhdGVgIHRoZSBjcmVhdGVkIGBfLnByb3BlcnR5YFxuICAgICAqIHN0eWxlIGNhbGxiYWNrIHJldHVybnMgdGhlIHByb3BlcnR5IHZhbHVlIG9mIHRoZSBnaXZlbiBlbGVtZW50LlxuICAgICAqXG4gICAgICogSWYgYSB2YWx1ZSBpcyBhbHNvIHByb3ZpZGVkIGZvciBgdGhpc0FyZ2AgdGhlIGNyZWF0ZWQgYF8ubWF0Y2hlc1Byb3BlcnR5YFxuICAgICAqIHN0eWxlIGNhbGxiYWNrIHJldHVybnMgYHRydWVgIGZvciBlbGVtZW50cyB0aGF0IGhhdmUgYSBtYXRjaGluZyBwcm9wZXJ0eVxuICAgICAqIHZhbHVlLCBlbHNlIGBmYWxzZWAuXG4gICAgICpcbiAgICAgKiBJZiBhbiBvYmplY3QgaXMgcHJvdmlkZWQgZm9yIGBwcmVkaWNhdGVgIHRoZSBjcmVhdGVkIGBfLm1hdGNoZXNgIHN0eWxlXG4gICAgICogY2FsbGJhY2sgcmV0dXJucyBgdHJ1ZWAgZm9yIGVsZW1lbnRzIHRoYXQgaGF2ZSB0aGUgcHJvcGVydGllcyBvZiB0aGUgZ2l2ZW5cbiAgICAgKiBvYmplY3QsIGVsc2UgYGZhbHNlYC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBhbGlhcyBhbGxcbiAgICAgKiBAY2F0ZWdvcnkgQ29sbGVjdGlvblxuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fHN0cmluZ30gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbnxPYmplY3R8c3RyaW5nfSBbcHJlZGljYXRlPV8uaWRlbnRpdHldIFRoZSBmdW5jdGlvbiBpbnZva2VkXG4gICAgICogIHBlciBpdGVyYXRpb24uXG4gICAgICogQHBhcmFtIHsqfSBbdGhpc0FyZ10gVGhlIGB0aGlzYCBiaW5kaW5nIG9mIGBwcmVkaWNhdGVgLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBhbGwgZWxlbWVudHMgcGFzcyB0aGUgcHJlZGljYXRlIGNoZWNrLFxuICAgICAqICBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uZXZlcnkoW3RydWUsIDEsIG51bGwsICd5ZXMnXSwgQm9vbGVhbik7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKlxuICAgICAqIHZhciB1c2VycyA9IFtcbiAgICAgKiAgIHsgJ3VzZXInOiAnYmFybmV5JywgJ2FjdGl2ZSc6IGZhbHNlIH0sXG4gICAgICogICB7ICd1c2VyJzogJ2ZyZWQnLCAgICdhY3RpdmUnOiBmYWxzZSB9XG4gICAgICogXTtcbiAgICAgKlxuICAgICAqIC8vIHVzaW5nIHRoZSBgXy5tYXRjaGVzYCBjYWxsYmFjayBzaG9ydGhhbmRcbiAgICAgKiBfLmV2ZXJ5KHVzZXJzLCB7ICd1c2VyJzogJ2Jhcm5leScsICdhY3RpdmUnOiBmYWxzZSB9KTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqXG4gICAgICogLy8gdXNpbmcgdGhlIGBfLm1hdGNoZXNQcm9wZXJ0eWAgY2FsbGJhY2sgc2hvcnRoYW5kXG4gICAgICogXy5ldmVyeSh1c2VycywgJ2FjdGl2ZScsIGZhbHNlKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiAvLyB1c2luZyB0aGUgYF8ucHJvcGVydHlgIGNhbGxiYWNrIHNob3J0aGFuZFxuICAgICAqIF8uZXZlcnkodXNlcnMsICdhY3RpdmUnKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGV2ZXJ5KGNvbGxlY3Rpb24sIHByZWRpY2F0ZSwgdGhpc0FyZykge1xuICAgICAgdmFyIGZ1bmMgPSBpc0FycmF5KGNvbGxlY3Rpb24pID8gYXJyYXlFdmVyeSA6IGJhc2VFdmVyeTtcbiAgICAgIGlmICh0aGlzQXJnICYmIGlzSXRlcmF0ZWVDYWxsKGNvbGxlY3Rpb24sIHByZWRpY2F0ZSwgdGhpc0FyZykpIHtcbiAgICAgICAgcHJlZGljYXRlID0gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgICAgaWYgKHR5cGVvZiBwcmVkaWNhdGUgIT0gJ2Z1bmN0aW9uJyB8fCB0aGlzQXJnICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcHJlZGljYXRlID0gZ2V0Q2FsbGJhY2socHJlZGljYXRlLCB0aGlzQXJnLCAzKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBmdW5jKGNvbGxlY3Rpb24sIHByZWRpY2F0ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSXRlcmF0ZXMgb3ZlciBlbGVtZW50cyBvZiBgY29sbGVjdGlvbmAsIHJldHVybmluZyBhbiBhcnJheSBvZiBhbGwgZWxlbWVudHNcbiAgICAgKiBgcHJlZGljYXRlYCByZXR1cm5zIHRydXRoeSBmb3IuIFRoZSBwcmVkaWNhdGUgaXMgYm91bmQgdG8gYHRoaXNBcmdgIGFuZFxuICAgICAqIGludm9rZWQgd2l0aCB0aHJlZSBhcmd1bWVudHM6ICh2YWx1ZSwgaW5kZXh8a2V5LCBjb2xsZWN0aW9uKS5cbiAgICAgKlxuICAgICAqIElmIGEgcHJvcGVydHkgbmFtZSBpcyBwcm92aWRlZCBmb3IgYHByZWRpY2F0ZWAgdGhlIGNyZWF0ZWQgYF8ucHJvcGVydHlgXG4gICAgICogc3R5bGUgY2FsbGJhY2sgcmV0dXJucyB0aGUgcHJvcGVydHkgdmFsdWUgb2YgdGhlIGdpdmVuIGVsZW1lbnQuXG4gICAgICpcbiAgICAgKiBJZiBhIHZhbHVlIGlzIGFsc28gcHJvdmlkZWQgZm9yIGB0aGlzQXJnYCB0aGUgY3JlYXRlZCBgXy5tYXRjaGVzUHJvcGVydHlgXG4gICAgICogc3R5bGUgY2FsbGJhY2sgcmV0dXJucyBgdHJ1ZWAgZm9yIGVsZW1lbnRzIHRoYXQgaGF2ZSBhIG1hdGNoaW5nIHByb3BlcnR5XG4gICAgICogdmFsdWUsIGVsc2UgYGZhbHNlYC5cbiAgICAgKlxuICAgICAqIElmIGFuIG9iamVjdCBpcyBwcm92aWRlZCBmb3IgYHByZWRpY2F0ZWAgdGhlIGNyZWF0ZWQgYF8ubWF0Y2hlc2Agc3R5bGVcbiAgICAgKiBjYWxsYmFjayByZXR1cm5zIGB0cnVlYCBmb3IgZWxlbWVudHMgdGhhdCBoYXZlIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBnaXZlblxuICAgICAqIG9iamVjdCwgZWxzZSBgZmFsc2VgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGFsaWFzIHNlbGVjdFxuICAgICAqIEBjYXRlZ29yeSBDb2xsZWN0aW9uXG4gICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R8c3RyaW5nfSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufE9iamVjdHxzdHJpbmd9IFtwcmVkaWNhdGU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWRcbiAgICAgKiAgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcGFyYW0geyp9IFt0aGlzQXJnXSBUaGUgYHRoaXNgIGJpbmRpbmcgb2YgYHByZWRpY2F0ZWAuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgZmlsdGVyZWQgYXJyYXkuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uZmlsdGVyKFs0LCA1LCA2XSwgZnVuY3Rpb24obikge1xuICAgICAqICAgcmV0dXJuIG4gJSAyID09IDA7XG4gICAgICogfSk7XG4gICAgICogLy8gPT4gWzQsIDZdXG4gICAgICpcbiAgICAgKiB2YXIgdXNlcnMgPSBbXG4gICAgICogICB7ICd1c2VyJzogJ2Jhcm5leScsICdhZ2UnOiAzNiwgJ2FjdGl2ZSc6IHRydWUgfSxcbiAgICAgKiAgIHsgJ3VzZXInOiAnZnJlZCcsICAgJ2FnZSc6IDQwLCAnYWN0aXZlJzogZmFsc2UgfVxuICAgICAqIF07XG4gICAgICpcbiAgICAgKiAvLyB1c2luZyB0aGUgYF8ubWF0Y2hlc2AgY2FsbGJhY2sgc2hvcnRoYW5kXG4gICAgICogXy5wbHVjayhfLmZpbHRlcih1c2VycywgeyAnYWdlJzogMzYsICdhY3RpdmUnOiB0cnVlIH0pLCAndXNlcicpO1xuICAgICAqIC8vID0+IFsnYmFybmV5J11cbiAgICAgKlxuICAgICAqIC8vIHVzaW5nIHRoZSBgXy5tYXRjaGVzUHJvcGVydHlgIGNhbGxiYWNrIHNob3J0aGFuZFxuICAgICAqIF8ucGx1Y2soXy5maWx0ZXIodXNlcnMsICdhY3RpdmUnLCBmYWxzZSksICd1c2VyJyk7XG4gICAgICogLy8gPT4gWydmcmVkJ11cbiAgICAgKlxuICAgICAqIC8vIHVzaW5nIHRoZSBgXy5wcm9wZXJ0eWAgY2FsbGJhY2sgc2hvcnRoYW5kXG4gICAgICogXy5wbHVjayhfLmZpbHRlcih1c2VycywgJ2FjdGl2ZScpLCAndXNlcicpO1xuICAgICAqIC8vID0+IFsnYmFybmV5J11cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBmaWx0ZXIoY29sbGVjdGlvbiwgcHJlZGljYXRlLCB0aGlzQXJnKSB7XG4gICAgICB2YXIgZnVuYyA9IGlzQXJyYXkoY29sbGVjdGlvbikgPyBhcnJheUZpbHRlciA6IGJhc2VGaWx0ZXI7XG4gICAgICBwcmVkaWNhdGUgPSBnZXRDYWxsYmFjayhwcmVkaWNhdGUsIHRoaXNBcmcsIDMpO1xuICAgICAgcmV0dXJuIGZ1bmMoY29sbGVjdGlvbiwgcHJlZGljYXRlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJdGVyYXRlcyBvdmVyIGVsZW1lbnRzIG9mIGBjb2xsZWN0aW9uYCwgcmV0dXJuaW5nIHRoZSBmaXJzdCBlbGVtZW50XG4gICAgICogYHByZWRpY2F0ZWAgcmV0dXJucyB0cnV0aHkgZm9yLiBUaGUgcHJlZGljYXRlIGlzIGJvdW5kIHRvIGB0aGlzQXJnYCBhbmRcbiAgICAgKiBpbnZva2VkIHdpdGggdGhyZWUgYXJndW1lbnRzOiAodmFsdWUsIGluZGV4fGtleSwgY29sbGVjdGlvbikuXG4gICAgICpcbiAgICAgKiBJZiBhIHByb3BlcnR5IG5hbWUgaXMgcHJvdmlkZWQgZm9yIGBwcmVkaWNhdGVgIHRoZSBjcmVhdGVkIGBfLnByb3BlcnR5YFxuICAgICAqIHN0eWxlIGNhbGxiYWNrIHJldHVybnMgdGhlIHByb3BlcnR5IHZhbHVlIG9mIHRoZSBnaXZlbiBlbGVtZW50LlxuICAgICAqXG4gICAgICogSWYgYSB2YWx1ZSBpcyBhbHNvIHByb3ZpZGVkIGZvciBgdGhpc0FyZ2AgdGhlIGNyZWF0ZWQgYF8ubWF0Y2hlc1Byb3BlcnR5YFxuICAgICAqIHN0eWxlIGNhbGxiYWNrIHJldHVybnMgYHRydWVgIGZvciBlbGVtZW50cyB0aGF0IGhhdmUgYSBtYXRjaGluZyBwcm9wZXJ0eVxuICAgICAqIHZhbHVlLCBlbHNlIGBmYWxzZWAuXG4gICAgICpcbiAgICAgKiBJZiBhbiBvYmplY3QgaXMgcHJvdmlkZWQgZm9yIGBwcmVkaWNhdGVgIHRoZSBjcmVhdGVkIGBfLm1hdGNoZXNgIHN0eWxlXG4gICAgICogY2FsbGJhY2sgcmV0dXJucyBgdHJ1ZWAgZm9yIGVsZW1lbnRzIHRoYXQgaGF2ZSB0aGUgcHJvcGVydGllcyBvZiB0aGUgZ2l2ZW5cbiAgICAgKiBvYmplY3QsIGVsc2UgYGZhbHNlYC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBhbGlhcyBkZXRlY3RcbiAgICAgKiBAY2F0ZWdvcnkgQ29sbGVjdGlvblxuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fHN0cmluZ30gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBzZWFyY2guXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbnxPYmplY3R8c3RyaW5nfSBbcHJlZGljYXRlPV8uaWRlbnRpdHldIFRoZSBmdW5jdGlvbiBpbnZva2VkXG4gICAgICogIHBlciBpdGVyYXRpb24uXG4gICAgICogQHBhcmFtIHsqfSBbdGhpc0FyZ10gVGhlIGB0aGlzYCBiaW5kaW5nIG9mIGBwcmVkaWNhdGVgLlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBtYXRjaGVkIGVsZW1lbnQsIGVsc2UgYHVuZGVmaW5lZGAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciB1c2VycyA9IFtcbiAgICAgKiAgIHsgJ3VzZXInOiAnYmFybmV5JywgICdhZ2UnOiAzNiwgJ2FjdGl2ZSc6IHRydWUgfSxcbiAgICAgKiAgIHsgJ3VzZXInOiAnZnJlZCcsICAgICdhZ2UnOiA0MCwgJ2FjdGl2ZSc6IGZhbHNlIH0sXG4gICAgICogICB7ICd1c2VyJzogJ3BlYmJsZXMnLCAnYWdlJzogMSwgICdhY3RpdmUnOiB0cnVlIH1cbiAgICAgKiBdO1xuICAgICAqXG4gICAgICogXy5yZXN1bHQoXy5maW5kKHVzZXJzLCBmdW5jdGlvbihjaHIpIHtcbiAgICAgKiAgIHJldHVybiBjaHIuYWdlIDwgNDA7XG4gICAgICogfSksICd1c2VyJyk7XG4gICAgICogLy8gPT4gJ2Jhcm5leSdcbiAgICAgKlxuICAgICAqIC8vIHVzaW5nIHRoZSBgXy5tYXRjaGVzYCBjYWxsYmFjayBzaG9ydGhhbmRcbiAgICAgKiBfLnJlc3VsdChfLmZpbmQodXNlcnMsIHsgJ2FnZSc6IDEsICdhY3RpdmUnOiB0cnVlIH0pLCAndXNlcicpO1xuICAgICAqIC8vID0+ICdwZWJibGVzJ1xuICAgICAqXG4gICAgICogLy8gdXNpbmcgdGhlIGBfLm1hdGNoZXNQcm9wZXJ0eWAgY2FsbGJhY2sgc2hvcnRoYW5kXG4gICAgICogXy5yZXN1bHQoXy5maW5kKHVzZXJzLCAnYWN0aXZlJywgZmFsc2UpLCAndXNlcicpO1xuICAgICAqIC8vID0+ICdmcmVkJ1xuICAgICAqXG4gICAgICogLy8gdXNpbmcgdGhlIGBfLnByb3BlcnR5YCBjYWxsYmFjayBzaG9ydGhhbmRcbiAgICAgKiBfLnJlc3VsdChfLmZpbmQodXNlcnMsICdhY3RpdmUnKSwgJ3VzZXInKTtcbiAgICAgKiAvLyA9PiAnYmFybmV5J1xuICAgICAqL1xuICAgIHZhciBmaW5kID0gY3JlYXRlRmluZChiYXNlRWFjaCk7XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLmZpbmRgIGV4Y2VwdCB0aGF0IGl0IGl0ZXJhdGVzIG92ZXIgZWxlbWVudHMgb2ZcbiAgICAgKiBgY29sbGVjdGlvbmAgZnJvbSByaWdodCB0byBsZWZ0LlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IENvbGxlY3Rpb25cbiAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdHxzdHJpbmd9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gc2VhcmNoLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb258T2JqZWN0fHN0cmluZ30gW3ByZWRpY2F0ZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZFxuICAgICAqICBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEBwYXJhbSB7Kn0gW3RoaXNBcmddIFRoZSBgdGhpc2AgYmluZGluZyBvZiBgcHJlZGljYXRlYC5cbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgbWF0Y2hlZCBlbGVtZW50LCBlbHNlIGB1bmRlZmluZWRgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmZpbmRMYXN0KFsxLCAyLCAzLCA0XSwgZnVuY3Rpb24obikge1xuICAgICAqICAgcmV0dXJuIG4gJSAyID09IDE7XG4gICAgICogfSk7XG4gICAgICogLy8gPT4gM1xuICAgICAqL1xuICAgIHZhciBmaW5kTGFzdCA9IGNyZWF0ZUZpbmQoYmFzZUVhY2hSaWdodCwgdHJ1ZSk7XG5cbiAgICAvKipcbiAgICAgKiBQZXJmb3JtcyBhIGRlZXAgY29tcGFyaXNvbiBiZXR3ZWVuIGVhY2ggZWxlbWVudCBpbiBgY29sbGVjdGlvbmAgYW5kIHRoZVxuICAgICAqIHNvdXJjZSBvYmplY3QsIHJldHVybmluZyB0aGUgZmlyc3QgZWxlbWVudCB0aGF0IGhhcyBlcXVpdmFsZW50IHByb3BlcnR5XG4gICAgICogdmFsdWVzLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoaXMgbWV0aG9kIHN1cHBvcnRzIGNvbXBhcmluZyBhcnJheXMsIGJvb2xlYW5zLCBgRGF0ZWAgb2JqZWN0cyxcbiAgICAgKiBudW1iZXJzLCBgT2JqZWN0YCBvYmplY3RzLCByZWdleGVzLCBhbmQgc3RyaW5ncy4gT2JqZWN0cyBhcmUgY29tcGFyZWQgYnlcbiAgICAgKiB0aGVpciBvd24sIG5vdCBpbmhlcml0ZWQsIGVudW1lcmFibGUgcHJvcGVydGllcy4gRm9yIGNvbXBhcmluZyBhIHNpbmdsZVxuICAgICAqIG93biBvciBpbmhlcml0ZWQgcHJvcGVydHkgdmFsdWUgc2VlIGBfLm1hdGNoZXNQcm9wZXJ0eWAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAY2F0ZWdvcnkgQ29sbGVjdGlvblxuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fHN0cmluZ30gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBzZWFyY2guXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHNvdXJjZSBUaGUgb2JqZWN0IG9mIHByb3BlcnR5IHZhbHVlcyB0byBtYXRjaC5cbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgbWF0Y2hlZCBlbGVtZW50LCBlbHNlIGB1bmRlZmluZWRgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgdXNlcnMgPSBbXG4gICAgICogICB7ICd1c2VyJzogJ2Jhcm5leScsICdhZ2UnOiAzNiwgJ2FjdGl2ZSc6IHRydWUgfSxcbiAgICAgKiAgIHsgJ3VzZXInOiAnZnJlZCcsICAgJ2FnZSc6IDQwLCAnYWN0aXZlJzogZmFsc2UgfVxuICAgICAqIF07XG4gICAgICpcbiAgICAgKiBfLnJlc3VsdChfLmZpbmRXaGVyZSh1c2VycywgeyAnYWdlJzogMzYsICdhY3RpdmUnOiB0cnVlIH0pLCAndXNlcicpO1xuICAgICAqIC8vID0+ICdiYXJuZXknXG4gICAgICpcbiAgICAgKiBfLnJlc3VsdChfLmZpbmRXaGVyZSh1c2VycywgeyAnYWdlJzogNDAsICdhY3RpdmUnOiBmYWxzZSB9KSwgJ3VzZXInKTtcbiAgICAgKiAvLyA9PiAnZnJlZCdcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBmaW5kV2hlcmUoY29sbGVjdGlvbiwgc291cmNlKSB7XG4gICAgICByZXR1cm4gZmluZChjb2xsZWN0aW9uLCBiYXNlTWF0Y2hlcyhzb3VyY2UpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJdGVyYXRlcyBvdmVyIGVsZW1lbnRzIG9mIGBjb2xsZWN0aW9uYCBpbnZva2luZyBgaXRlcmF0ZWVgIGZvciBlYWNoIGVsZW1lbnQuXG4gICAgICogVGhlIGBpdGVyYXRlZWAgaXMgYm91bmQgdG8gYHRoaXNBcmdgIGFuZCBpbnZva2VkIHdpdGggdGhyZWUgYXJndW1lbnRzOlxuICAgICAqICh2YWx1ZSwgaW5kZXh8a2V5LCBjb2xsZWN0aW9uKS4gSXRlcmF0ZWUgZnVuY3Rpb25zIG1heSBleGl0IGl0ZXJhdGlvbiBlYXJseVxuICAgICAqIGJ5IGV4cGxpY2l0bHkgcmV0dXJuaW5nIGBmYWxzZWAuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogQXMgd2l0aCBvdGhlciBcIkNvbGxlY3Rpb25zXCIgbWV0aG9kcywgb2JqZWN0cyB3aXRoIGEgXCJsZW5ndGhcIiBwcm9wZXJ0eVxuICAgICAqIGFyZSBpdGVyYXRlZCBsaWtlIGFycmF5cy4gVG8gYXZvaWQgdGhpcyBiZWhhdmlvciBgXy5mb3JJbmAgb3IgYF8uZm9yT3duYFxuICAgICAqIG1heSBiZSB1c2VkIGZvciBvYmplY3QgaXRlcmF0aW9uLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGFsaWFzIGVhY2hcbiAgICAgKiBAY2F0ZWdvcnkgQ29sbGVjdGlvblxuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fHN0cmluZ30gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlPV8uaWRlbnRpdHldIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAgICogQHBhcmFtIHsqfSBbdGhpc0FyZ10gVGhlIGB0aGlzYCBiaW5kaW5nIG9mIGBpdGVyYXRlZWAuXG4gICAgICogQHJldHVybnMge0FycmF5fE9iamVjdHxzdHJpbmd9IFJldHVybnMgYGNvbGxlY3Rpb25gLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfKFsxLCAyXSkuZm9yRWFjaChmdW5jdGlvbihuKSB7XG4gICAgICogICBjb25zb2xlLmxvZyhuKTtcbiAgICAgKiB9KS52YWx1ZSgpO1xuICAgICAqIC8vID0+IGxvZ3MgZWFjaCB2YWx1ZSBmcm9tIGxlZnQgdG8gcmlnaHQgYW5kIHJldHVybnMgdGhlIGFycmF5XG4gICAgICpcbiAgICAgKiBfLmZvckVhY2goeyAnYSc6IDEsICdiJzogMiB9LCBmdW5jdGlvbihuLCBrZXkpIHtcbiAgICAgKiAgIGNvbnNvbGUubG9nKG4sIGtleSk7XG4gICAgICogfSk7XG4gICAgICogLy8gPT4gbG9ncyBlYWNoIHZhbHVlLWtleSBwYWlyIGFuZCByZXR1cm5zIHRoZSBvYmplY3QgKGl0ZXJhdGlvbiBvcmRlciBpcyBub3QgZ3VhcmFudGVlZClcbiAgICAgKi9cbiAgICB2YXIgZm9yRWFjaCA9IGNyZWF0ZUZvckVhY2goYXJyYXlFYWNoLCBiYXNlRWFjaCk7XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLmZvckVhY2hgIGV4Y2VwdCB0aGF0IGl0IGl0ZXJhdGVzIG92ZXIgZWxlbWVudHMgb2ZcbiAgICAgKiBgY29sbGVjdGlvbmAgZnJvbSByaWdodCB0byBsZWZ0LlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGFsaWFzIGVhY2hSaWdodFxuICAgICAqIEBjYXRlZ29yeSBDb2xsZWN0aW9uXG4gICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R8c3RyaW5nfSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcGFyYW0geyp9IFt0aGlzQXJnXSBUaGUgYHRoaXNgIGJpbmRpbmcgb2YgYGl0ZXJhdGVlYC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl8T2JqZWN0fHN0cmluZ30gUmV0dXJucyBgY29sbGVjdGlvbmAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8oWzEsIDJdKS5mb3JFYWNoUmlnaHQoZnVuY3Rpb24obikge1xuICAgICAqICAgY29uc29sZS5sb2cobik7XG4gICAgICogfSkudmFsdWUoKTtcbiAgICAgKiAvLyA9PiBsb2dzIGVhY2ggdmFsdWUgZnJvbSByaWdodCB0byBsZWZ0IGFuZCByZXR1cm5zIHRoZSBhcnJheVxuICAgICAqL1xuICAgIHZhciBmb3JFYWNoUmlnaHQgPSBjcmVhdGVGb3JFYWNoKGFycmF5RWFjaFJpZ2h0LCBiYXNlRWFjaFJpZ2h0KTtcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gb2JqZWN0IGNvbXBvc2VkIG9mIGtleXMgZ2VuZXJhdGVkIGZyb20gdGhlIHJlc3VsdHMgb2YgcnVubmluZ1xuICAgICAqIGVhY2ggZWxlbWVudCBvZiBgY29sbGVjdGlvbmAgdGhyb3VnaCBgaXRlcmF0ZWVgLiBUaGUgY29ycmVzcG9uZGluZyB2YWx1ZVxuICAgICAqIG9mIGVhY2gga2V5IGlzIGFuIGFycmF5IG9mIHRoZSBlbGVtZW50cyByZXNwb25zaWJsZSBmb3IgZ2VuZXJhdGluZyB0aGUga2V5LlxuICAgICAqIFRoZSBgaXRlcmF0ZWVgIGlzIGJvdW5kIHRvIGB0aGlzQXJnYCBhbmQgaW52b2tlZCB3aXRoIHRocmVlIGFyZ3VtZW50czpcbiAgICAgKiAodmFsdWUsIGluZGV4fGtleSwgY29sbGVjdGlvbikuXG4gICAgICpcbiAgICAgKiBJZiBhIHByb3BlcnR5IG5hbWUgaXMgcHJvdmlkZWQgZm9yIGBpdGVyYXRlZWAgdGhlIGNyZWF0ZWQgYF8ucHJvcGVydHlgXG4gICAgICogc3R5bGUgY2FsbGJhY2sgcmV0dXJucyB0aGUgcHJvcGVydHkgdmFsdWUgb2YgdGhlIGdpdmVuIGVsZW1lbnQuXG4gICAgICpcbiAgICAgKiBJZiBhIHZhbHVlIGlzIGFsc28gcHJvdmlkZWQgZm9yIGB0aGlzQXJnYCB0aGUgY3JlYXRlZCBgXy5tYXRjaGVzUHJvcGVydHlgXG4gICAgICogc3R5bGUgY2FsbGJhY2sgcmV0dXJucyBgdHJ1ZWAgZm9yIGVsZW1lbnRzIHRoYXQgaGF2ZSBhIG1hdGNoaW5nIHByb3BlcnR5XG4gICAgICogdmFsdWUsIGVsc2UgYGZhbHNlYC5cbiAgICAgKlxuICAgICAqIElmIGFuIG9iamVjdCBpcyBwcm92aWRlZCBmb3IgYGl0ZXJhdGVlYCB0aGUgY3JlYXRlZCBgXy5tYXRjaGVzYCBzdHlsZVxuICAgICAqIGNhbGxiYWNrIHJldHVybnMgYHRydWVgIGZvciBlbGVtZW50cyB0aGF0IGhhdmUgdGhlIHByb3BlcnRpZXMgb2YgdGhlIGdpdmVuXG4gICAgICogb2JqZWN0LCBlbHNlIGBmYWxzZWAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAY2F0ZWdvcnkgQ29sbGVjdGlvblxuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fHN0cmluZ30gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbnxPYmplY3R8c3RyaW5nfSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWRcbiAgICAgKiAgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcGFyYW0geyp9IFt0aGlzQXJnXSBUaGUgYHRoaXNgIGJpbmRpbmcgb2YgYGl0ZXJhdGVlYC5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBjb21wb3NlZCBhZ2dyZWdhdGUgb2JqZWN0LlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmdyb3VwQnkoWzQuMiwgNi4xLCA2LjRdLCBmdW5jdGlvbihuKSB7XG4gICAgICogICByZXR1cm4gTWF0aC5mbG9vcihuKTtcbiAgICAgKiB9KTtcbiAgICAgKiAvLyA9PiB7ICc0JzogWzQuMl0sICc2JzogWzYuMSwgNi40XSB9XG4gICAgICpcbiAgICAgKiBfLmdyb3VwQnkoWzQuMiwgNi4xLCA2LjRdLCBmdW5jdGlvbihuKSB7XG4gICAgICogICByZXR1cm4gdGhpcy5mbG9vcihuKTtcbiAgICAgKiB9LCBNYXRoKTtcbiAgICAgKiAvLyA9PiB7ICc0JzogWzQuMl0sICc2JzogWzYuMSwgNi40XSB9XG4gICAgICpcbiAgICAgKiAvLyB1c2luZyB0aGUgYF8ucHJvcGVydHlgIGNhbGxiYWNrIHNob3J0aGFuZFxuICAgICAqIF8uZ3JvdXBCeShbJ29uZScsICd0d28nLCAndGhyZWUnXSwgJ2xlbmd0aCcpO1xuICAgICAqIC8vID0+IHsgJzMnOiBbJ29uZScsICd0d28nXSwgJzUnOiBbJ3RocmVlJ10gfVxuICAgICAqL1xuICAgIHZhciBncm91cEJ5ID0gY3JlYXRlQWdncmVnYXRvcihmdW5jdGlvbihyZXN1bHQsIHZhbHVlLCBrZXkpIHtcbiAgICAgIGlmIChoYXNPd25Qcm9wZXJ0eS5jYWxsKHJlc3VsdCwga2V5KSkge1xuICAgICAgICByZXN1bHRba2V5XS5wdXNoKHZhbHVlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlc3VsdFtrZXldID0gW3ZhbHVlXTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGluIGBjb2xsZWN0aW9uYCB1c2luZ1xuICAgICAqIFtgU2FtZVZhbHVlWmVyb2BdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzYuMC8jc2VjLXNhbWV2YWx1ZXplcm8pXG4gICAgICogZm9yIGVxdWFsaXR5IGNvbXBhcmlzb25zLiBJZiBgZnJvbUluZGV4YCBpcyBuZWdhdGl2ZSwgaXQgaXMgdXNlZCBhcyB0aGUgb2Zmc2V0XG4gICAgICogZnJvbSB0aGUgZW5kIG9mIGBjb2xsZWN0aW9uYC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBhbGlhcyBjb250YWlucywgaW5jbHVkZVxuICAgICAqIEBjYXRlZ29yeSBDb2xsZWN0aW9uXG4gICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R8c3RyaW5nfSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIHNlYXJjaC5cbiAgICAgKiBAcGFyYW0geyp9IHRhcmdldCBUaGUgdmFsdWUgdG8gc2VhcmNoIGZvci5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW2Zyb21JbmRleD0wXSBUaGUgaW5kZXggdG8gc2VhcmNoIGZyb20uXG4gICAgICogQHBhcmFtLSB7T2JqZWN0fSBbZ3VhcmRdIEVuYWJsZXMgdXNlIGFzIGEgY2FsbGJhY2sgZm9yIGZ1bmN0aW9ucyBsaWtlIGBfLnJlZHVjZWAuXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGEgbWF0Y2hpbmcgZWxlbWVudCBpcyBmb3VuZCwgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmluY2x1ZGVzKFsxLCAyLCAzXSwgMSk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pbmNsdWRlcyhbMSwgMiwgM10sIDEsIDIpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICpcbiAgICAgKiBfLmluY2x1ZGVzKHsgJ3VzZXInOiAnZnJlZCcsICdhZ2UnOiA0MCB9LCAnZnJlZCcpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaW5jbHVkZXMoJ3BlYmJsZXMnLCAnZWInKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICovXG4gICAgZnVuY3Rpb24gaW5jbHVkZXMoY29sbGVjdGlvbiwgdGFyZ2V0LCBmcm9tSW5kZXgsIGd1YXJkKSB7XG4gICAgICB2YXIgbGVuZ3RoID0gY29sbGVjdGlvbiA/IGdldExlbmd0aChjb2xsZWN0aW9uKSA6IDA7XG4gICAgICBpZiAoIWlzTGVuZ3RoKGxlbmd0aCkpIHtcbiAgICAgICAgY29sbGVjdGlvbiA9IHZhbHVlcyhjb2xsZWN0aW9uKTtcbiAgICAgICAgbGVuZ3RoID0gY29sbGVjdGlvbi5sZW5ndGg7XG4gICAgICB9XG4gICAgICBpZiAodHlwZW9mIGZyb21JbmRleCAhPSAnbnVtYmVyJyB8fCAoZ3VhcmQgJiYgaXNJdGVyYXRlZUNhbGwodGFyZ2V0LCBmcm9tSW5kZXgsIGd1YXJkKSkpIHtcbiAgICAgICAgZnJvbUluZGV4ID0gMDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGZyb21JbmRleCA9IGZyb21JbmRleCA8IDAgPyBuYXRpdmVNYXgobGVuZ3RoICsgZnJvbUluZGV4LCAwKSA6IChmcm9tSW5kZXggfHwgMCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gKHR5cGVvZiBjb2xsZWN0aW9uID09ICdzdHJpbmcnIHx8ICFpc0FycmF5KGNvbGxlY3Rpb24pICYmIGlzU3RyaW5nKGNvbGxlY3Rpb24pKVxuICAgICAgICA/IChmcm9tSW5kZXggPD0gbGVuZ3RoICYmIGNvbGxlY3Rpb24uaW5kZXhPZih0YXJnZXQsIGZyb21JbmRleCkgPiAtMSlcbiAgICAgICAgOiAoISFsZW5ndGggJiYgZ2V0SW5kZXhPZihjb2xsZWN0aW9uLCB0YXJnZXQsIGZyb21JbmRleCkgPiAtMSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBvYmplY3QgY29tcG9zZWQgb2Yga2V5cyBnZW5lcmF0ZWQgZnJvbSB0aGUgcmVzdWx0cyBvZiBydW5uaW5nXG4gICAgICogZWFjaCBlbGVtZW50IG9mIGBjb2xsZWN0aW9uYCB0aHJvdWdoIGBpdGVyYXRlZWAuIFRoZSBjb3JyZXNwb25kaW5nIHZhbHVlXG4gICAgICogb2YgZWFjaCBrZXkgaXMgdGhlIGxhc3QgZWxlbWVudCByZXNwb25zaWJsZSBmb3IgZ2VuZXJhdGluZyB0aGUga2V5LiBUaGVcbiAgICAgKiBpdGVyYXRlZSBmdW5jdGlvbiBpcyBib3VuZCB0byBgdGhpc0FyZ2AgYW5kIGludm9rZWQgd2l0aCB0aHJlZSBhcmd1bWVudHM6XG4gICAgICogKHZhbHVlLCBpbmRleHxrZXksIGNvbGxlY3Rpb24pLlxuICAgICAqXG4gICAgICogSWYgYSBwcm9wZXJ0eSBuYW1lIGlzIHByb3ZpZGVkIGZvciBgaXRlcmF0ZWVgIHRoZSBjcmVhdGVkIGBfLnByb3BlcnR5YFxuICAgICAqIHN0eWxlIGNhbGxiYWNrIHJldHVybnMgdGhlIHByb3BlcnR5IHZhbHVlIG9mIHRoZSBnaXZlbiBlbGVtZW50LlxuICAgICAqXG4gICAgICogSWYgYSB2YWx1ZSBpcyBhbHNvIHByb3ZpZGVkIGZvciBgdGhpc0FyZ2AgdGhlIGNyZWF0ZWQgYF8ubWF0Y2hlc1Byb3BlcnR5YFxuICAgICAqIHN0eWxlIGNhbGxiYWNrIHJldHVybnMgYHRydWVgIGZvciBlbGVtZW50cyB0aGF0IGhhdmUgYSBtYXRjaGluZyBwcm9wZXJ0eVxuICAgICAqIHZhbHVlLCBlbHNlIGBmYWxzZWAuXG4gICAgICpcbiAgICAgKiBJZiBhbiBvYmplY3QgaXMgcHJvdmlkZWQgZm9yIGBpdGVyYXRlZWAgdGhlIGNyZWF0ZWQgYF8ubWF0Y2hlc2Agc3R5bGVcbiAgICAgKiBjYWxsYmFjayByZXR1cm5zIGB0cnVlYCBmb3IgZWxlbWVudHMgdGhhdCBoYXZlIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBnaXZlblxuICAgICAqIG9iamVjdCwgZWxzZSBgZmFsc2VgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IENvbGxlY3Rpb25cbiAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdHxzdHJpbmd9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb258T2JqZWN0fHN0cmluZ30gW2l0ZXJhdGVlPV8uaWRlbnRpdHldIFRoZSBmdW5jdGlvbiBpbnZva2VkXG4gICAgICogIHBlciBpdGVyYXRpb24uXG4gICAgICogQHBhcmFtIHsqfSBbdGhpc0FyZ10gVGhlIGB0aGlzYCBiaW5kaW5nIG9mIGBpdGVyYXRlZWAuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgY29tcG9zZWQgYWdncmVnYXRlIG9iamVjdC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIGtleURhdGEgPSBbXG4gICAgICogICB7ICdkaXInOiAnbGVmdCcsICdjb2RlJzogOTcgfSxcbiAgICAgKiAgIHsgJ2Rpcic6ICdyaWdodCcsICdjb2RlJzogMTAwIH1cbiAgICAgKiBdO1xuICAgICAqXG4gICAgICogXy5pbmRleEJ5KGtleURhdGEsICdkaXInKTtcbiAgICAgKiAvLyA9PiB7ICdsZWZ0JzogeyAnZGlyJzogJ2xlZnQnLCAnY29kZSc6IDk3IH0sICdyaWdodCc6IHsgJ2Rpcic6ICdyaWdodCcsICdjb2RlJzogMTAwIH0gfVxuICAgICAqXG4gICAgICogXy5pbmRleEJ5KGtleURhdGEsIGZ1bmN0aW9uKG9iamVjdCkge1xuICAgICAqICAgcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUob2JqZWN0LmNvZGUpO1xuICAgICAqIH0pO1xuICAgICAqIC8vID0+IHsgJ2EnOiB7ICdkaXInOiAnbGVmdCcsICdjb2RlJzogOTcgfSwgJ2QnOiB7ICdkaXInOiAncmlnaHQnLCAnY29kZSc6IDEwMCB9IH1cbiAgICAgKlxuICAgICAqIF8uaW5kZXhCeShrZXlEYXRhLCBmdW5jdGlvbihvYmplY3QpIHtcbiAgICAgKiAgIHJldHVybiB0aGlzLmZyb21DaGFyQ29kZShvYmplY3QuY29kZSk7XG4gICAgICogfSwgU3RyaW5nKTtcbiAgICAgKiAvLyA9PiB7ICdhJzogeyAnZGlyJzogJ2xlZnQnLCAnY29kZSc6IDk3IH0sICdkJzogeyAnZGlyJzogJ3JpZ2h0JywgJ2NvZGUnOiAxMDAgfSB9XG4gICAgICovXG4gICAgdmFyIGluZGV4QnkgPSBjcmVhdGVBZ2dyZWdhdG9yKGZ1bmN0aW9uKHJlc3VsdCwgdmFsdWUsIGtleSkge1xuICAgICAgcmVzdWx0W2tleV0gPSB2YWx1ZTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIEludm9rZXMgdGhlIG1ldGhvZCBhdCBgcGF0aGAgb2YgZWFjaCBlbGVtZW50IGluIGBjb2xsZWN0aW9uYCwgcmV0dXJuaW5nXG4gICAgICogYW4gYXJyYXkgb2YgdGhlIHJlc3VsdHMgb2YgZWFjaCBpbnZva2VkIG1ldGhvZC4gQW55IGFkZGl0aW9uYWwgYXJndW1lbnRzXG4gICAgICogYXJlIHByb3ZpZGVkIHRvIGVhY2ggaW52b2tlZCBtZXRob2QuIElmIGBtZXRob2ROYW1lYCBpcyBhIGZ1bmN0aW9uIGl0IGlzXG4gICAgICogaW52b2tlZCBmb3IsIGFuZCBgdGhpc2AgYm91bmQgdG8sIGVhY2ggZWxlbWVudCBpbiBgY29sbGVjdGlvbmAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAY2F0ZWdvcnkgQ29sbGVjdGlvblxuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fHN0cmluZ30gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtBcnJheXxGdW5jdGlvbnxzdHJpbmd9IHBhdGggVGhlIHBhdGggb2YgdGhlIG1ldGhvZCB0byBpbnZva2Ugb3JcbiAgICAgKiAgdGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcGFyYW0gey4uLip9IFthcmdzXSBUaGUgYXJndW1lbnRzIHRvIGludm9rZSB0aGUgbWV0aG9kIHdpdGguXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBhcnJheSBvZiByZXN1bHRzLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmludm9rZShbWzUsIDEsIDddLCBbMywgMiwgMV1dLCAnc29ydCcpO1xuICAgICAqIC8vID0+IFtbMSwgNSwgN10sIFsxLCAyLCAzXV1cbiAgICAgKlxuICAgICAqIF8uaW52b2tlKFsxMjMsIDQ1Nl0sIFN0cmluZy5wcm90b3R5cGUuc3BsaXQsICcnKTtcbiAgICAgKiAvLyA9PiBbWycxJywgJzInLCAnMyddLCBbJzQnLCAnNScsICc2J11dXG4gICAgICovXG4gICAgdmFyIGludm9rZSA9IHJlc3RQYXJhbShmdW5jdGlvbihjb2xsZWN0aW9uLCBwYXRoLCBhcmdzKSB7XG4gICAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgICBpc0Z1bmMgPSB0eXBlb2YgcGF0aCA9PSAnZnVuY3Rpb24nLFxuICAgICAgICAgIGlzUHJvcCA9IGlzS2V5KHBhdGgpLFxuICAgICAgICAgIHJlc3VsdCA9IGlzQXJyYXlMaWtlKGNvbGxlY3Rpb24pID8gQXJyYXkoY29sbGVjdGlvbi5sZW5ndGgpIDogW107XG5cbiAgICAgIGJhc2VFYWNoKGNvbGxlY3Rpb24sIGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICAgIHZhciBmdW5jID0gaXNGdW5jID8gcGF0aCA6ICgoaXNQcm9wICYmIHZhbHVlICE9IG51bGwpID8gdmFsdWVbcGF0aF0gOiB1bmRlZmluZWQpO1xuICAgICAgICByZXN1bHRbKytpbmRleF0gPSBmdW5jID8gZnVuYy5hcHBseSh2YWx1ZSwgYXJncykgOiBpbnZva2VQYXRoKHZhbHVlLCBwYXRoLCBhcmdzKTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gYXJyYXkgb2YgdmFsdWVzIGJ5IHJ1bm5pbmcgZWFjaCBlbGVtZW50IGluIGBjb2xsZWN0aW9uYCB0aHJvdWdoXG4gICAgICogYGl0ZXJhdGVlYC4gVGhlIGBpdGVyYXRlZWAgaXMgYm91bmQgdG8gYHRoaXNBcmdgIGFuZCBpbnZva2VkIHdpdGggdGhyZWVcbiAgICAgKiBhcmd1bWVudHM6ICh2YWx1ZSwgaW5kZXh8a2V5LCBjb2xsZWN0aW9uKS5cbiAgICAgKlxuICAgICAqIElmIGEgcHJvcGVydHkgbmFtZSBpcyBwcm92aWRlZCBmb3IgYGl0ZXJhdGVlYCB0aGUgY3JlYXRlZCBgXy5wcm9wZXJ0eWBcbiAgICAgKiBzdHlsZSBjYWxsYmFjayByZXR1cm5zIHRoZSBwcm9wZXJ0eSB2YWx1ZSBvZiB0aGUgZ2l2ZW4gZWxlbWVudC5cbiAgICAgKlxuICAgICAqIElmIGEgdmFsdWUgaXMgYWxzbyBwcm92aWRlZCBmb3IgYHRoaXNBcmdgIHRoZSBjcmVhdGVkIGBfLm1hdGNoZXNQcm9wZXJ0eWBcbiAgICAgKiBzdHlsZSBjYWxsYmFjayByZXR1cm5zIGB0cnVlYCBmb3IgZWxlbWVudHMgdGhhdCBoYXZlIGEgbWF0Y2hpbmcgcHJvcGVydHlcbiAgICAgKiB2YWx1ZSwgZWxzZSBgZmFsc2VgLlxuICAgICAqXG4gICAgICogSWYgYW4gb2JqZWN0IGlzIHByb3ZpZGVkIGZvciBgaXRlcmF0ZWVgIHRoZSBjcmVhdGVkIGBfLm1hdGNoZXNgIHN0eWxlXG4gICAgICogY2FsbGJhY2sgcmV0dXJucyBgdHJ1ZWAgZm9yIGVsZW1lbnRzIHRoYXQgaGF2ZSB0aGUgcHJvcGVydGllcyBvZiB0aGUgZ2l2ZW5cbiAgICAgKiBvYmplY3QsIGVsc2UgYGZhbHNlYC5cbiAgICAgKlxuICAgICAqIE1hbnkgbG9kYXNoIG1ldGhvZHMgYXJlIGd1YXJkZWQgdG8gd29yayBhcyBpdGVyYXRlZXMgZm9yIG1ldGhvZHMgbGlrZVxuICAgICAqIGBfLmV2ZXJ5YCwgYF8uZmlsdGVyYCwgYF8ubWFwYCwgYF8ubWFwVmFsdWVzYCwgYF8ucmVqZWN0YCwgYW5kIGBfLnNvbWVgLlxuICAgICAqXG4gICAgICogVGhlIGd1YXJkZWQgbWV0aG9kcyBhcmU6XG4gICAgICogYGFyeWAsIGBjYWxsYmFja2AsIGBjaHVua2AsIGBjbG9uZWAsIGBjcmVhdGVgLCBgY3VycnlgLCBgY3VycnlSaWdodGAsXG4gICAgICogYGRyb3BgLCBgZHJvcFJpZ2h0YCwgYGV2ZXJ5YCwgYGZpbGxgLCBgZmxhdHRlbmAsIGBpbnZlcnRgLCBgbWF4YCwgYG1pbmAsXG4gICAgICogYHBhcnNlSW50YCwgYHNsaWNlYCwgYHNvcnRCeWAsIGB0YWtlYCwgYHRha2VSaWdodGAsIGB0ZW1wbGF0ZWAsIGB0cmltYCxcbiAgICAgKiBgdHJpbUxlZnRgLCBgdHJpbVJpZ2h0YCwgYHRydW5jYCwgYHJhbmRvbWAsIGByYW5nZWAsIGBzYW1wbGVgLCBgc29tZWAsXG4gICAgICogYHN1bWAsIGB1bmlxYCwgYW5kIGB3b3Jkc2BcbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBhbGlhcyBjb2xsZWN0XG4gICAgICogQGNhdGVnb3J5IENvbGxlY3Rpb25cbiAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdHxzdHJpbmd9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb258T2JqZWN0fHN0cmluZ30gW2l0ZXJhdGVlPV8uaWRlbnRpdHldIFRoZSBmdW5jdGlvbiBpbnZva2VkXG4gICAgICogIHBlciBpdGVyYXRpb24uXG4gICAgICogQHBhcmFtIHsqfSBbdGhpc0FyZ10gVGhlIGB0aGlzYCBiaW5kaW5nIG9mIGBpdGVyYXRlZWAuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgbWFwcGVkIGFycmF5LlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBmdW5jdGlvbiB0aW1lc1RocmVlKG4pIHtcbiAgICAgKiAgIHJldHVybiBuICogMztcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiBfLm1hcChbMSwgMl0sIHRpbWVzVGhyZWUpO1xuICAgICAqIC8vID0+IFszLCA2XVxuICAgICAqXG4gICAgICogXy5tYXAoeyAnYSc6IDEsICdiJzogMiB9LCB0aW1lc1RocmVlKTtcbiAgICAgKiAvLyA9PiBbMywgNl0gKGl0ZXJhdGlvbiBvcmRlciBpcyBub3QgZ3VhcmFudGVlZClcbiAgICAgKlxuICAgICAqIHZhciB1c2VycyA9IFtcbiAgICAgKiAgIHsgJ3VzZXInOiAnYmFybmV5JyB9LFxuICAgICAqICAgeyAndXNlcic6ICdmcmVkJyB9XG4gICAgICogXTtcbiAgICAgKlxuICAgICAqIC8vIHVzaW5nIHRoZSBgXy5wcm9wZXJ0eWAgY2FsbGJhY2sgc2hvcnRoYW5kXG4gICAgICogXy5tYXAodXNlcnMsICd1c2VyJyk7XG4gICAgICogLy8gPT4gWydiYXJuZXknLCAnZnJlZCddXG4gICAgICovXG4gICAgZnVuY3Rpb24gbWFwKGNvbGxlY3Rpb24sIGl0ZXJhdGVlLCB0aGlzQXJnKSB7XG4gICAgICB2YXIgZnVuYyA9IGlzQXJyYXkoY29sbGVjdGlvbikgPyBhcnJheU1hcCA6IGJhc2VNYXA7XG4gICAgICBpdGVyYXRlZSA9IGdldENhbGxiYWNrKGl0ZXJhdGVlLCB0aGlzQXJnLCAzKTtcbiAgICAgIHJldHVybiBmdW5jKGNvbGxlY3Rpb24sIGl0ZXJhdGVlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGFycmF5IG9mIGVsZW1lbnRzIHNwbGl0IGludG8gdHdvIGdyb3VwcywgdGhlIGZpcnN0IG9mIHdoaWNoXG4gICAgICogY29udGFpbnMgZWxlbWVudHMgYHByZWRpY2F0ZWAgcmV0dXJucyB0cnV0aHkgZm9yLCB3aGlsZSB0aGUgc2Vjb25kIG9mIHdoaWNoXG4gICAgICogY29udGFpbnMgZWxlbWVudHMgYHByZWRpY2F0ZWAgcmV0dXJucyBmYWxzZXkgZm9yLiBUaGUgcHJlZGljYXRlIGlzIGJvdW5kXG4gICAgICogdG8gYHRoaXNBcmdgIGFuZCBpbnZva2VkIHdpdGggdGhyZWUgYXJndW1lbnRzOiAodmFsdWUsIGluZGV4fGtleSwgY29sbGVjdGlvbikuXG4gICAgICpcbiAgICAgKiBJZiBhIHByb3BlcnR5IG5hbWUgaXMgcHJvdmlkZWQgZm9yIGBwcmVkaWNhdGVgIHRoZSBjcmVhdGVkIGBfLnByb3BlcnR5YFxuICAgICAqIHN0eWxlIGNhbGxiYWNrIHJldHVybnMgdGhlIHByb3BlcnR5IHZhbHVlIG9mIHRoZSBnaXZlbiBlbGVtZW50LlxuICAgICAqXG4gICAgICogSWYgYSB2YWx1ZSBpcyBhbHNvIHByb3ZpZGVkIGZvciBgdGhpc0FyZ2AgdGhlIGNyZWF0ZWQgYF8ubWF0Y2hlc1Byb3BlcnR5YFxuICAgICAqIHN0eWxlIGNhbGxiYWNrIHJldHVybnMgYHRydWVgIGZvciBlbGVtZW50cyB0aGF0IGhhdmUgYSBtYXRjaGluZyBwcm9wZXJ0eVxuICAgICAqIHZhbHVlLCBlbHNlIGBmYWxzZWAuXG4gICAgICpcbiAgICAgKiBJZiBhbiBvYmplY3QgaXMgcHJvdmlkZWQgZm9yIGBwcmVkaWNhdGVgIHRoZSBjcmVhdGVkIGBfLm1hdGNoZXNgIHN0eWxlXG4gICAgICogY2FsbGJhY2sgcmV0dXJucyBgdHJ1ZWAgZm9yIGVsZW1lbnRzIHRoYXQgaGF2ZSB0aGUgcHJvcGVydGllcyBvZiB0aGUgZ2l2ZW5cbiAgICAgKiBvYmplY3QsIGVsc2UgYGZhbHNlYC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBjYXRlZ29yeSBDb2xsZWN0aW9uXG4gICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R8c3RyaW5nfSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufE9iamVjdHxzdHJpbmd9IFtwcmVkaWNhdGU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWRcbiAgICAgKiAgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcGFyYW0geyp9IFt0aGlzQXJnXSBUaGUgYHRoaXNgIGJpbmRpbmcgb2YgYHByZWRpY2F0ZWAuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBhcnJheSBvZiBncm91cGVkIGVsZW1lbnRzLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnBhcnRpdGlvbihbMSwgMiwgM10sIGZ1bmN0aW9uKG4pIHtcbiAgICAgKiAgIHJldHVybiBuICUgMjtcbiAgICAgKiB9KTtcbiAgICAgKiAvLyA9PiBbWzEsIDNdLCBbMl1dXG4gICAgICpcbiAgICAgKiBfLnBhcnRpdGlvbihbMS4yLCAyLjMsIDMuNF0sIGZ1bmN0aW9uKG4pIHtcbiAgICAgKiAgIHJldHVybiB0aGlzLmZsb29yKG4pICUgMjtcbiAgICAgKiB9LCBNYXRoKTtcbiAgICAgKiAvLyA9PiBbWzEuMiwgMy40XSwgWzIuM11dXG4gICAgICpcbiAgICAgKiB2YXIgdXNlcnMgPSBbXG4gICAgICogICB7ICd1c2VyJzogJ2Jhcm5leScsICAnYWdlJzogMzYsICdhY3RpdmUnOiBmYWxzZSB9LFxuICAgICAqICAgeyAndXNlcic6ICdmcmVkJywgICAgJ2FnZSc6IDQwLCAnYWN0aXZlJzogdHJ1ZSB9LFxuICAgICAqICAgeyAndXNlcic6ICdwZWJibGVzJywgJ2FnZSc6IDEsICAnYWN0aXZlJzogZmFsc2UgfVxuICAgICAqIF07XG4gICAgICpcbiAgICAgKiB2YXIgbWFwcGVyID0gZnVuY3Rpb24oYXJyYXkpIHtcbiAgICAgKiAgIHJldHVybiBfLnBsdWNrKGFycmF5LCAndXNlcicpO1xuICAgICAqIH07XG4gICAgICpcbiAgICAgKiAvLyB1c2luZyB0aGUgYF8ubWF0Y2hlc2AgY2FsbGJhY2sgc2hvcnRoYW5kXG4gICAgICogXy5tYXAoXy5wYXJ0aXRpb24odXNlcnMsIHsgJ2FnZSc6IDEsICdhY3RpdmUnOiBmYWxzZSB9KSwgbWFwcGVyKTtcbiAgICAgKiAvLyA9PiBbWydwZWJibGVzJ10sIFsnYmFybmV5JywgJ2ZyZWQnXV1cbiAgICAgKlxuICAgICAqIC8vIHVzaW5nIHRoZSBgXy5tYXRjaGVzUHJvcGVydHlgIGNhbGxiYWNrIHNob3J0aGFuZFxuICAgICAqIF8ubWFwKF8ucGFydGl0aW9uKHVzZXJzLCAnYWN0aXZlJywgZmFsc2UpLCBtYXBwZXIpO1xuICAgICAqIC8vID0+IFtbJ2Jhcm5leScsICdwZWJibGVzJ10sIFsnZnJlZCddXVxuICAgICAqXG4gICAgICogLy8gdXNpbmcgdGhlIGBfLnByb3BlcnR5YCBjYWxsYmFjayBzaG9ydGhhbmRcbiAgICAgKiBfLm1hcChfLnBhcnRpdGlvbih1c2VycywgJ2FjdGl2ZScpLCBtYXBwZXIpO1xuICAgICAqIC8vID0+IFtbJ2ZyZWQnXSwgWydiYXJuZXknLCAncGViYmxlcyddXVxuICAgICAqL1xuICAgIHZhciBwYXJ0aXRpb24gPSBjcmVhdGVBZ2dyZWdhdG9yKGZ1bmN0aW9uKHJlc3VsdCwgdmFsdWUsIGtleSkge1xuICAgICAgcmVzdWx0W2tleSA/IDAgOiAxXS5wdXNoKHZhbHVlKTtcbiAgICB9LCBmdW5jdGlvbigpIHsgcmV0dXJuIFtbXSwgW11dOyB9KTtcblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIHByb3BlcnR5IHZhbHVlIG9mIGBwYXRoYCBmcm9tIGFsbCBlbGVtZW50cyBpbiBgY29sbGVjdGlvbmAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAY2F0ZWdvcnkgQ29sbGVjdGlvblxuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fHN0cmluZ30gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtBcnJheXxzdHJpbmd9IHBhdGggVGhlIHBhdGggb2YgdGhlIHByb3BlcnR5IHRvIHBsdWNrLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgcHJvcGVydHkgdmFsdWVzLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgdXNlcnMgPSBbXG4gICAgICogICB7ICd1c2VyJzogJ2Jhcm5leScsICdhZ2UnOiAzNiB9LFxuICAgICAqICAgeyAndXNlcic6ICdmcmVkJywgICAnYWdlJzogNDAgfVxuICAgICAqIF07XG4gICAgICpcbiAgICAgKiBfLnBsdWNrKHVzZXJzLCAndXNlcicpO1xuICAgICAqIC8vID0+IFsnYmFybmV5JywgJ2ZyZWQnXVxuICAgICAqXG4gICAgICogdmFyIHVzZXJJbmRleCA9IF8uaW5kZXhCeSh1c2VycywgJ3VzZXInKTtcbiAgICAgKiBfLnBsdWNrKHVzZXJJbmRleCwgJ2FnZScpO1xuICAgICAqIC8vID0+IFszNiwgNDBdIChpdGVyYXRpb24gb3JkZXIgaXMgbm90IGd1YXJhbnRlZWQpXG4gICAgICovXG4gICAgZnVuY3Rpb24gcGx1Y2soY29sbGVjdGlvbiwgcGF0aCkge1xuICAgICAgcmV0dXJuIG1hcChjb2xsZWN0aW9uLCBwcm9wZXJ0eShwYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVkdWNlcyBgY29sbGVjdGlvbmAgdG8gYSB2YWx1ZSB3aGljaCBpcyB0aGUgYWNjdW11bGF0ZWQgcmVzdWx0IG9mIHJ1bm5pbmdcbiAgICAgKiBlYWNoIGVsZW1lbnQgaW4gYGNvbGxlY3Rpb25gIHRocm91Z2ggYGl0ZXJhdGVlYCwgd2hlcmUgZWFjaCBzdWNjZXNzaXZlXG4gICAgICogaW52b2NhdGlvbiBpcyBzdXBwbGllZCB0aGUgcmV0dXJuIHZhbHVlIG9mIHRoZSBwcmV2aW91cy4gSWYgYGFjY3VtdWxhdG9yYFxuICAgICAqIGlzIG5vdCBwcm92aWRlZCB0aGUgZmlyc3QgZWxlbWVudCBvZiBgY29sbGVjdGlvbmAgaXMgdXNlZCBhcyB0aGUgaW5pdGlhbFxuICAgICAqIHZhbHVlLiBUaGUgYGl0ZXJhdGVlYCBpcyBib3VuZCB0byBgdGhpc0FyZ2AgYW5kIGludm9rZWQgd2l0aCBmb3VyIGFyZ3VtZW50czpcbiAgICAgKiAoYWNjdW11bGF0b3IsIHZhbHVlLCBpbmRleHxrZXksIGNvbGxlY3Rpb24pLlxuICAgICAqXG4gICAgICogTWFueSBsb2Rhc2ggbWV0aG9kcyBhcmUgZ3VhcmRlZCB0byB3b3JrIGFzIGl0ZXJhdGVlcyBmb3IgbWV0aG9kcyBsaWtlXG4gICAgICogYF8ucmVkdWNlYCwgYF8ucmVkdWNlUmlnaHRgLCBhbmQgYF8udHJhbnNmb3JtYC5cbiAgICAgKlxuICAgICAqIFRoZSBndWFyZGVkIG1ldGhvZHMgYXJlOlxuICAgICAqIGBhc3NpZ25gLCBgZGVmYXVsdHNgLCBgZGVmYXVsdHNEZWVwYCwgYGluY2x1ZGVzYCwgYG1lcmdlYCwgYHNvcnRCeUFsbGAsXG4gICAgICogYW5kIGBzb3J0QnlPcmRlcmBcbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBhbGlhcyBmb2xkbCwgaW5qZWN0XG4gICAgICogQGNhdGVnb3J5IENvbGxlY3Rpb25cbiAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdHxzdHJpbmd9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEBwYXJhbSB7Kn0gW2FjY3VtdWxhdG9yXSBUaGUgaW5pdGlhbCB2YWx1ZS5cbiAgICAgKiBAcGFyYW0geyp9IFt0aGlzQXJnXSBUaGUgYHRoaXNgIGJpbmRpbmcgb2YgYGl0ZXJhdGVlYC5cbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgYWNjdW11bGF0ZWQgdmFsdWUuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8ucmVkdWNlKFsxLCAyXSwgZnVuY3Rpb24odG90YWwsIG4pIHtcbiAgICAgKiAgIHJldHVybiB0b3RhbCArIG47XG4gICAgICogfSk7XG4gICAgICogLy8gPT4gM1xuICAgICAqXG4gICAgICogXy5yZWR1Y2UoeyAnYSc6IDEsICdiJzogMiB9LCBmdW5jdGlvbihyZXN1bHQsIG4sIGtleSkge1xuICAgICAqICAgcmVzdWx0W2tleV0gPSBuICogMztcbiAgICAgKiAgIHJldHVybiByZXN1bHQ7XG4gICAgICogfSwge30pO1xuICAgICAqIC8vID0+IHsgJ2EnOiAzLCAnYic6IDYgfSAoaXRlcmF0aW9uIG9yZGVyIGlzIG5vdCBndWFyYW50ZWVkKVxuICAgICAqL1xuICAgIHZhciByZWR1Y2UgPSBjcmVhdGVSZWR1Y2UoYXJyYXlSZWR1Y2UsIGJhc2VFYWNoKTtcblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8ucmVkdWNlYCBleGNlcHQgdGhhdCBpdCBpdGVyYXRlcyBvdmVyIGVsZW1lbnRzIG9mXG4gICAgICogYGNvbGxlY3Rpb25gIGZyb20gcmlnaHQgdG8gbGVmdC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBhbGlhcyBmb2xkclxuICAgICAqIEBjYXRlZ29yeSBDb2xsZWN0aW9uXG4gICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R8c3RyaW5nfSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcGFyYW0geyp9IFthY2N1bXVsYXRvcl0gVGhlIGluaXRpYWwgdmFsdWUuXG4gICAgICogQHBhcmFtIHsqfSBbdGhpc0FyZ10gVGhlIGB0aGlzYCBiaW5kaW5nIG9mIGBpdGVyYXRlZWAuXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIGFjY3VtdWxhdGVkIHZhbHVlLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgYXJyYXkgPSBbWzAsIDFdLCBbMiwgM10sIFs0LCA1XV07XG4gICAgICpcbiAgICAgKiBfLnJlZHVjZVJpZ2h0KGFycmF5LCBmdW5jdGlvbihmbGF0dGVuZWQsIG90aGVyKSB7XG4gICAgICogICByZXR1cm4gZmxhdHRlbmVkLmNvbmNhdChvdGhlcik7XG4gICAgICogfSwgW10pO1xuICAgICAqIC8vID0+IFs0LCA1LCAyLCAzLCAwLCAxXVxuICAgICAqL1xuICAgIHZhciByZWR1Y2VSaWdodCA9IGNyZWF0ZVJlZHVjZShhcnJheVJlZHVjZVJpZ2h0LCBiYXNlRWFjaFJpZ2h0KTtcblxuICAgIC8qKlxuICAgICAqIFRoZSBvcHBvc2l0ZSBvZiBgXy5maWx0ZXJgOyB0aGlzIG1ldGhvZCByZXR1cm5zIHRoZSBlbGVtZW50cyBvZiBgY29sbGVjdGlvbmBcbiAgICAgKiB0aGF0IGBwcmVkaWNhdGVgIGRvZXMgKipub3QqKiByZXR1cm4gdHJ1dGh5IGZvci5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBjYXRlZ29yeSBDb2xsZWN0aW9uXG4gICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R8c3RyaW5nfSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufE9iamVjdHxzdHJpbmd9IFtwcmVkaWNhdGU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWRcbiAgICAgKiAgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcGFyYW0geyp9IFt0aGlzQXJnXSBUaGUgYHRoaXNgIGJpbmRpbmcgb2YgYHByZWRpY2F0ZWAuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgZmlsdGVyZWQgYXJyYXkuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8ucmVqZWN0KFsxLCAyLCAzLCA0XSwgZnVuY3Rpb24obikge1xuICAgICAqICAgcmV0dXJuIG4gJSAyID09IDA7XG4gICAgICogfSk7XG4gICAgICogLy8gPT4gWzEsIDNdXG4gICAgICpcbiAgICAgKiB2YXIgdXNlcnMgPSBbXG4gICAgICogICB7ICd1c2VyJzogJ2Jhcm5leScsICdhZ2UnOiAzNiwgJ2FjdGl2ZSc6IGZhbHNlIH0sXG4gICAgICogICB7ICd1c2VyJzogJ2ZyZWQnLCAgICdhZ2UnOiA0MCwgJ2FjdGl2ZSc6IHRydWUgfVxuICAgICAqIF07XG4gICAgICpcbiAgICAgKiAvLyB1c2luZyB0aGUgYF8ubWF0Y2hlc2AgY2FsbGJhY2sgc2hvcnRoYW5kXG4gICAgICogXy5wbHVjayhfLnJlamVjdCh1c2VycywgeyAnYWdlJzogNDAsICdhY3RpdmUnOiB0cnVlIH0pLCAndXNlcicpO1xuICAgICAqIC8vID0+IFsnYmFybmV5J11cbiAgICAgKlxuICAgICAqIC8vIHVzaW5nIHRoZSBgXy5tYXRjaGVzUHJvcGVydHlgIGNhbGxiYWNrIHNob3J0aGFuZFxuICAgICAqIF8ucGx1Y2soXy5yZWplY3QodXNlcnMsICdhY3RpdmUnLCBmYWxzZSksICd1c2VyJyk7XG4gICAgICogLy8gPT4gWydmcmVkJ11cbiAgICAgKlxuICAgICAqIC8vIHVzaW5nIHRoZSBgXy5wcm9wZXJ0eWAgY2FsbGJhY2sgc2hvcnRoYW5kXG4gICAgICogXy5wbHVjayhfLnJlamVjdCh1c2VycywgJ2FjdGl2ZScpLCAndXNlcicpO1xuICAgICAqIC8vID0+IFsnYmFybmV5J11cbiAgICAgKi9cbiAgICBmdW5jdGlvbiByZWplY3QoY29sbGVjdGlvbiwgcHJlZGljYXRlLCB0aGlzQXJnKSB7XG4gICAgICB2YXIgZnVuYyA9IGlzQXJyYXkoY29sbGVjdGlvbikgPyBhcnJheUZpbHRlciA6IGJhc2VGaWx0ZXI7XG4gICAgICBwcmVkaWNhdGUgPSBnZXRDYWxsYmFjayhwcmVkaWNhdGUsIHRoaXNBcmcsIDMpO1xuICAgICAgcmV0dXJuIGZ1bmMoY29sbGVjdGlvbiwgZnVuY3Rpb24odmFsdWUsIGluZGV4LCBjb2xsZWN0aW9uKSB7XG4gICAgICAgIHJldHVybiAhcHJlZGljYXRlKHZhbHVlLCBpbmRleCwgY29sbGVjdGlvbik7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIGEgcmFuZG9tIGVsZW1lbnQgb3IgYG5gIHJhbmRvbSBlbGVtZW50cyBmcm9tIGEgY29sbGVjdGlvbi5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBjYXRlZ29yeSBDb2xsZWN0aW9uXG4gICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R8c3RyaW5nfSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIHNhbXBsZS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW25dIFRoZSBudW1iZXIgb2YgZWxlbWVudHMgdG8gc2FtcGxlLlxuICAgICAqIEBwYXJhbS0ge09iamVjdH0gW2d1YXJkXSBFbmFibGVzIHVzZSBhcyBhIGNhbGxiYWNrIGZvciBmdW5jdGlvbnMgbGlrZSBgXy5tYXBgLlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSByYW5kb20gc2FtcGxlKHMpLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnNhbXBsZShbMSwgMiwgMywgNF0pO1xuICAgICAqIC8vID0+IDJcbiAgICAgKlxuICAgICAqIF8uc2FtcGxlKFsxLCAyLCAzLCA0XSwgMik7XG4gICAgICogLy8gPT4gWzMsIDFdXG4gICAgICovXG4gICAgZnVuY3Rpb24gc2FtcGxlKGNvbGxlY3Rpb24sIG4sIGd1YXJkKSB7XG4gICAgICBpZiAoZ3VhcmQgPyBpc0l0ZXJhdGVlQ2FsbChjb2xsZWN0aW9uLCBuLCBndWFyZCkgOiBuID09IG51bGwpIHtcbiAgICAgICAgY29sbGVjdGlvbiA9IHRvSXRlcmFibGUoY29sbGVjdGlvbik7XG4gICAgICAgIHZhciBsZW5ndGggPSBjb2xsZWN0aW9uLmxlbmd0aDtcbiAgICAgICAgcmV0dXJuIGxlbmd0aCA+IDAgPyBjb2xsZWN0aW9uW2Jhc2VSYW5kb20oMCwgbGVuZ3RoIC0gMSldIDogdW5kZWZpbmVkO1xuICAgICAgfVxuICAgICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgICAgcmVzdWx0ID0gdG9BcnJheShjb2xsZWN0aW9uKSxcbiAgICAgICAgICBsZW5ndGggPSByZXN1bHQubGVuZ3RoLFxuICAgICAgICAgIGxhc3RJbmRleCA9IGxlbmd0aCAtIDE7XG5cbiAgICAgIG4gPSBuYXRpdmVNaW4obiA8IDAgPyAwIDogKCtuIHx8IDApLCBsZW5ndGgpO1xuICAgICAgd2hpbGUgKCsraW5kZXggPCBuKSB7XG4gICAgICAgIHZhciByYW5kID0gYmFzZVJhbmRvbShpbmRleCwgbGFzdEluZGV4KSxcbiAgICAgICAgICAgIHZhbHVlID0gcmVzdWx0W3JhbmRdO1xuXG4gICAgICAgIHJlc3VsdFtyYW5kXSA9IHJlc3VsdFtpbmRleF07XG4gICAgICAgIHJlc3VsdFtpbmRleF0gPSB2YWx1ZTtcbiAgICAgIH1cbiAgICAgIHJlc3VsdC5sZW5ndGggPSBuO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGFycmF5IG9mIHNodWZmbGVkIHZhbHVlcywgdXNpbmcgYSB2ZXJzaW9uIG9mIHRoZVxuICAgICAqIFtGaXNoZXItWWF0ZXMgc2h1ZmZsZV0oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvRmlzaGVyLVlhdGVzX3NodWZmbGUpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IENvbGxlY3Rpb25cbiAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdHxzdHJpbmd9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gc2h1ZmZsZS5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBzaHVmZmxlZCBhcnJheS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5zaHVmZmxlKFsxLCAyLCAzLCA0XSk7XG4gICAgICogLy8gPT4gWzQsIDEsIDMsIDJdXG4gICAgICovXG4gICAgZnVuY3Rpb24gc2h1ZmZsZShjb2xsZWN0aW9uKSB7XG4gICAgICByZXR1cm4gc2FtcGxlKGNvbGxlY3Rpb24sIFBPU0lUSVZFX0lORklOSVRZKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBzaXplIG9mIGBjb2xsZWN0aW9uYCBieSByZXR1cm5pbmcgaXRzIGxlbmd0aCBmb3IgYXJyYXktbGlrZVxuICAgICAqIHZhbHVlcyBvciB0aGUgbnVtYmVyIG9mIG93biBlbnVtZXJhYmxlIHByb3BlcnRpZXMgZm9yIG9iamVjdHMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAY2F0ZWdvcnkgQ29sbGVjdGlvblxuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fHN0cmluZ30gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpbnNwZWN0LlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIHNpemUgb2YgYGNvbGxlY3Rpb25gLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnNpemUoWzEsIDIsIDNdKTtcbiAgICAgKiAvLyA9PiAzXG4gICAgICpcbiAgICAgKiBfLnNpemUoeyAnYSc6IDEsICdiJzogMiB9KTtcbiAgICAgKiAvLyA9PiAyXG4gICAgICpcbiAgICAgKiBfLnNpemUoJ3BlYmJsZXMnKTtcbiAgICAgKiAvLyA9PiA3XG4gICAgICovXG4gICAgZnVuY3Rpb24gc2l6ZShjb2xsZWN0aW9uKSB7XG4gICAgICB2YXIgbGVuZ3RoID0gY29sbGVjdGlvbiA/IGdldExlbmd0aChjb2xsZWN0aW9uKSA6IDA7XG4gICAgICByZXR1cm4gaXNMZW5ndGgobGVuZ3RoKSA/IGxlbmd0aCA6IGtleXMoY29sbGVjdGlvbikubGVuZ3RoO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgcHJlZGljYXRlYCByZXR1cm5zIHRydXRoeSBmb3IgKiphbnkqKiBlbGVtZW50IG9mIGBjb2xsZWN0aW9uYC5cbiAgICAgKiBUaGUgZnVuY3Rpb24gcmV0dXJucyBhcyBzb29uIGFzIGl0IGZpbmRzIGEgcGFzc2luZyB2YWx1ZSBhbmQgZG9lcyBub3QgaXRlcmF0ZVxuICAgICAqIG92ZXIgdGhlIGVudGlyZSBjb2xsZWN0aW9uLiBUaGUgcHJlZGljYXRlIGlzIGJvdW5kIHRvIGB0aGlzQXJnYCBhbmQgaW52b2tlZFxuICAgICAqIHdpdGggdGhyZWUgYXJndW1lbnRzOiAodmFsdWUsIGluZGV4fGtleSwgY29sbGVjdGlvbikuXG4gICAgICpcbiAgICAgKiBJZiBhIHByb3BlcnR5IG5hbWUgaXMgcHJvdmlkZWQgZm9yIGBwcmVkaWNhdGVgIHRoZSBjcmVhdGVkIGBfLnByb3BlcnR5YFxuICAgICAqIHN0eWxlIGNhbGxiYWNrIHJldHVybnMgdGhlIHByb3BlcnR5IHZhbHVlIG9mIHRoZSBnaXZlbiBlbGVtZW50LlxuICAgICAqXG4gICAgICogSWYgYSB2YWx1ZSBpcyBhbHNvIHByb3ZpZGVkIGZvciBgdGhpc0FyZ2AgdGhlIGNyZWF0ZWQgYF8ubWF0Y2hlc1Byb3BlcnR5YFxuICAgICAqIHN0eWxlIGNhbGxiYWNrIHJldHVybnMgYHRydWVgIGZvciBlbGVtZW50cyB0aGF0IGhhdmUgYSBtYXRjaGluZyBwcm9wZXJ0eVxuICAgICAqIHZhbHVlLCBlbHNlIGBmYWxzZWAuXG4gICAgICpcbiAgICAgKiBJZiBhbiBvYmplY3QgaXMgcHJvdmlkZWQgZm9yIGBwcmVkaWNhdGVgIHRoZSBjcmVhdGVkIGBfLm1hdGNoZXNgIHN0eWxlXG4gICAgICogY2FsbGJhY2sgcmV0dXJucyBgdHJ1ZWAgZm9yIGVsZW1lbnRzIHRoYXQgaGF2ZSB0aGUgcHJvcGVydGllcyBvZiB0aGUgZ2l2ZW5cbiAgICAgKiBvYmplY3QsIGVsc2UgYGZhbHNlYC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBhbGlhcyBhbnlcbiAgICAgKiBAY2F0ZWdvcnkgQ29sbGVjdGlvblxuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fHN0cmluZ30gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbnxPYmplY3R8c3RyaW5nfSBbcHJlZGljYXRlPV8uaWRlbnRpdHldIFRoZSBmdW5jdGlvbiBpbnZva2VkXG4gICAgICogIHBlciBpdGVyYXRpb24uXG4gICAgICogQHBhcmFtIHsqfSBbdGhpc0FyZ10gVGhlIGB0aGlzYCBiaW5kaW5nIG9mIGBwcmVkaWNhdGVgLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBhbnkgZWxlbWVudCBwYXNzZXMgdGhlIHByZWRpY2F0ZSBjaGVjayxcbiAgICAgKiAgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnNvbWUoW251bGwsIDAsICd5ZXMnLCBmYWxzZV0sIEJvb2xlYW4pO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIHZhciB1c2VycyA9IFtcbiAgICAgKiAgIHsgJ3VzZXInOiAnYmFybmV5JywgJ2FjdGl2ZSc6IHRydWUgfSxcbiAgICAgKiAgIHsgJ3VzZXInOiAnZnJlZCcsICAgJ2FjdGl2ZSc6IGZhbHNlIH1cbiAgICAgKiBdO1xuICAgICAqXG4gICAgICogLy8gdXNpbmcgdGhlIGBfLm1hdGNoZXNgIGNhbGxiYWNrIHNob3J0aGFuZFxuICAgICAqIF8uc29tZSh1c2VycywgeyAndXNlcic6ICdiYXJuZXknLCAnYWN0aXZlJzogZmFsc2UgfSk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKlxuICAgICAqIC8vIHVzaW5nIHRoZSBgXy5tYXRjaGVzUHJvcGVydHlgIGNhbGxiYWNrIHNob3J0aGFuZFxuICAgICAqIF8uc29tZSh1c2VycywgJ2FjdGl2ZScsIGZhbHNlKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiAvLyB1c2luZyB0aGUgYF8ucHJvcGVydHlgIGNhbGxiYWNrIHNob3J0aGFuZFxuICAgICAqIF8uc29tZSh1c2VycywgJ2FjdGl2ZScpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzb21lKGNvbGxlY3Rpb24sIHByZWRpY2F0ZSwgdGhpc0FyZykge1xuICAgICAgdmFyIGZ1bmMgPSBpc0FycmF5KGNvbGxlY3Rpb24pID8gYXJyYXlTb21lIDogYmFzZVNvbWU7XG4gICAgICBpZiAodGhpc0FyZyAmJiBpc0l0ZXJhdGVlQ2FsbChjb2xsZWN0aW9uLCBwcmVkaWNhdGUsIHRoaXNBcmcpKSB7XG4gICAgICAgIHByZWRpY2F0ZSA9IHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICAgIGlmICh0eXBlb2YgcHJlZGljYXRlICE9ICdmdW5jdGlvbicgfHwgdGhpc0FyZyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHByZWRpY2F0ZSA9IGdldENhbGxiYWNrKHByZWRpY2F0ZSwgdGhpc0FyZywgMyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gZnVuYyhjb2xsZWN0aW9uLCBwcmVkaWNhdGUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gYXJyYXkgb2YgZWxlbWVudHMsIHNvcnRlZCBpbiBhc2NlbmRpbmcgb3JkZXIgYnkgdGhlIHJlc3VsdHMgb2ZcbiAgICAgKiBydW5uaW5nIGVhY2ggZWxlbWVudCBpbiBhIGNvbGxlY3Rpb24gdGhyb3VnaCBgaXRlcmF0ZWVgLiBUaGlzIG1ldGhvZCBwZXJmb3Jtc1xuICAgICAqIGEgc3RhYmxlIHNvcnQsIHRoYXQgaXMsIGl0IHByZXNlcnZlcyB0aGUgb3JpZ2luYWwgc29ydCBvcmRlciBvZiBlcXVhbCBlbGVtZW50cy5cbiAgICAgKiBUaGUgYGl0ZXJhdGVlYCBpcyBib3VuZCB0byBgdGhpc0FyZ2AgYW5kIGludm9rZWQgd2l0aCB0aHJlZSBhcmd1bWVudHM6XG4gICAgICogKHZhbHVlLCBpbmRleHxrZXksIGNvbGxlY3Rpb24pLlxuICAgICAqXG4gICAgICogSWYgYSBwcm9wZXJ0eSBuYW1lIGlzIHByb3ZpZGVkIGZvciBgaXRlcmF0ZWVgIHRoZSBjcmVhdGVkIGBfLnByb3BlcnR5YFxuICAgICAqIHN0eWxlIGNhbGxiYWNrIHJldHVybnMgdGhlIHByb3BlcnR5IHZhbHVlIG9mIHRoZSBnaXZlbiBlbGVtZW50LlxuICAgICAqXG4gICAgICogSWYgYSB2YWx1ZSBpcyBhbHNvIHByb3ZpZGVkIGZvciBgdGhpc0FyZ2AgdGhlIGNyZWF0ZWQgYF8ubWF0Y2hlc1Byb3BlcnR5YFxuICAgICAqIHN0eWxlIGNhbGxiYWNrIHJldHVybnMgYHRydWVgIGZvciBlbGVtZW50cyB0aGF0IGhhdmUgYSBtYXRjaGluZyBwcm9wZXJ0eVxuICAgICAqIHZhbHVlLCBlbHNlIGBmYWxzZWAuXG4gICAgICpcbiAgICAgKiBJZiBhbiBvYmplY3QgaXMgcHJvdmlkZWQgZm9yIGBpdGVyYXRlZWAgdGhlIGNyZWF0ZWQgYF8ubWF0Y2hlc2Agc3R5bGVcbiAgICAgKiBjYWxsYmFjayByZXR1cm5zIGB0cnVlYCBmb3IgZWxlbWVudHMgdGhhdCBoYXZlIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBnaXZlblxuICAgICAqIG9iamVjdCwgZWxzZSBgZmFsc2VgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IENvbGxlY3Rpb25cbiAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdHxzdHJpbmd9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb258T2JqZWN0fHN0cmluZ30gW2l0ZXJhdGVlPV8uaWRlbnRpdHldIFRoZSBmdW5jdGlvbiBpbnZva2VkXG4gICAgICogIHBlciBpdGVyYXRpb24uXG4gICAgICogQHBhcmFtIHsqfSBbdGhpc0FyZ10gVGhlIGB0aGlzYCBiaW5kaW5nIG9mIGBpdGVyYXRlZWAuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgc29ydGVkIGFycmF5LlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnNvcnRCeShbMSwgMiwgM10sIGZ1bmN0aW9uKG4pIHtcbiAgICAgKiAgIHJldHVybiBNYXRoLnNpbihuKTtcbiAgICAgKiB9KTtcbiAgICAgKiAvLyA9PiBbMywgMSwgMl1cbiAgICAgKlxuICAgICAqIF8uc29ydEJ5KFsxLCAyLCAzXSwgZnVuY3Rpb24obikge1xuICAgICAqICAgcmV0dXJuIHRoaXMuc2luKG4pO1xuICAgICAqIH0sIE1hdGgpO1xuICAgICAqIC8vID0+IFszLCAxLCAyXVxuICAgICAqXG4gICAgICogdmFyIHVzZXJzID0gW1xuICAgICAqICAgeyAndXNlcic6ICdmcmVkJyB9LFxuICAgICAqICAgeyAndXNlcic6ICdwZWJibGVzJyB9LFxuICAgICAqICAgeyAndXNlcic6ICdiYXJuZXknIH1cbiAgICAgKiBdO1xuICAgICAqXG4gICAgICogLy8gdXNpbmcgdGhlIGBfLnByb3BlcnR5YCBjYWxsYmFjayBzaG9ydGhhbmRcbiAgICAgKiBfLnBsdWNrKF8uc29ydEJ5KHVzZXJzLCAndXNlcicpLCAndXNlcicpO1xuICAgICAqIC8vID0+IFsnYmFybmV5JywgJ2ZyZWQnLCAncGViYmxlcyddXG4gICAgICovXG4gICAgZnVuY3Rpb24gc29ydEJ5KGNvbGxlY3Rpb24sIGl0ZXJhdGVlLCB0aGlzQXJnKSB7XG4gICAgICBpZiAoY29sbGVjdGlvbiA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzQXJnICYmIGlzSXRlcmF0ZWVDYWxsKGNvbGxlY3Rpb24sIGl0ZXJhdGVlLCB0aGlzQXJnKSkge1xuICAgICAgICBpdGVyYXRlZSA9IHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICAgIHZhciBpbmRleCA9IC0xO1xuICAgICAgaXRlcmF0ZWUgPSBnZXRDYWxsYmFjayhpdGVyYXRlZSwgdGhpc0FyZywgMyk7XG5cbiAgICAgIHZhciByZXN1bHQgPSBiYXNlTWFwKGNvbGxlY3Rpb24sIGZ1bmN0aW9uKHZhbHVlLCBrZXksIGNvbGxlY3Rpb24pIHtcbiAgICAgICAgcmV0dXJuIHsgJ2NyaXRlcmlhJzogaXRlcmF0ZWUodmFsdWUsIGtleSwgY29sbGVjdGlvbiksICdpbmRleCc6ICsraW5kZXgsICd2YWx1ZSc6IHZhbHVlIH07XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBiYXNlU29ydEJ5KHJlc3VsdCwgY29tcGFyZUFzY2VuZGluZyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5zb3J0QnlgIGV4Y2VwdCB0aGF0IGl0IGNhbiBzb3J0IGJ5IG11bHRpcGxlIGl0ZXJhdGVlc1xuICAgICAqIG9yIHByb3BlcnR5IG5hbWVzLlxuICAgICAqXG4gICAgICogSWYgYSBwcm9wZXJ0eSBuYW1lIGlzIHByb3ZpZGVkIGZvciBhbiBpdGVyYXRlZSB0aGUgY3JlYXRlZCBgXy5wcm9wZXJ0eWBcbiAgICAgKiBzdHlsZSBjYWxsYmFjayByZXR1cm5zIHRoZSBwcm9wZXJ0eSB2YWx1ZSBvZiB0aGUgZ2l2ZW4gZWxlbWVudC5cbiAgICAgKlxuICAgICAqIElmIGFuIG9iamVjdCBpcyBwcm92aWRlZCBmb3IgYW4gaXRlcmF0ZWUgdGhlIGNyZWF0ZWQgYF8ubWF0Y2hlc2Agc3R5bGVcbiAgICAgKiBjYWxsYmFjayByZXR1cm5zIGB0cnVlYCBmb3IgZWxlbWVudHMgdGhhdCBoYXZlIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBnaXZlblxuICAgICAqIG9iamVjdCwgZWxzZSBgZmFsc2VgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IENvbGxlY3Rpb25cbiAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdHxzdHJpbmd9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7Li4uKEZ1bmN0aW9ufEZ1bmN0aW9uW118T2JqZWN0fE9iamVjdFtdfHN0cmluZ3xzdHJpbmdbXSl9IGl0ZXJhdGVlc1xuICAgICAqICBUaGUgaXRlcmF0ZWVzIHRvIHNvcnQgYnksIHNwZWNpZmllZCBhcyBpbmRpdmlkdWFsIHZhbHVlcyBvciBhcnJheXMgb2YgdmFsdWVzLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IHNvcnRlZCBhcnJheS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIHVzZXJzID0gW1xuICAgICAqICAgeyAndXNlcic6ICdmcmVkJywgICAnYWdlJzogNDggfSxcbiAgICAgKiAgIHsgJ3VzZXInOiAnYmFybmV5JywgJ2FnZSc6IDM2IH0sXG4gICAgICogICB7ICd1c2VyJzogJ2ZyZWQnLCAgICdhZ2UnOiA0MiB9LFxuICAgICAqICAgeyAndXNlcic6ICdiYXJuZXknLCAnYWdlJzogMzQgfVxuICAgICAqIF07XG4gICAgICpcbiAgICAgKiBfLm1hcChfLnNvcnRCeUFsbCh1c2VycywgWyd1c2VyJywgJ2FnZSddKSwgXy52YWx1ZXMpO1xuICAgICAqIC8vID0+IFtbJ2Jhcm5leScsIDM0XSwgWydiYXJuZXknLCAzNl0sIFsnZnJlZCcsIDQyXSwgWydmcmVkJywgNDhdXVxuICAgICAqXG4gICAgICogXy5tYXAoXy5zb3J0QnlBbGwodXNlcnMsICd1c2VyJywgZnVuY3Rpb24oY2hyKSB7XG4gICAgICogICByZXR1cm4gTWF0aC5mbG9vcihjaHIuYWdlIC8gMTApO1xuICAgICAqIH0pLCBfLnZhbHVlcyk7XG4gICAgICogLy8gPT4gW1snYmFybmV5JywgMzZdLCBbJ2Jhcm5leScsIDM0XSwgWydmcmVkJywgNDhdLCBbJ2ZyZWQnLCA0Ml1dXG4gICAgICovXG4gICAgdmFyIHNvcnRCeUFsbCA9IHJlc3RQYXJhbShmdW5jdGlvbihjb2xsZWN0aW9uLCBpdGVyYXRlZXMpIHtcbiAgICAgIGlmIChjb2xsZWN0aW9uID09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgfVxuICAgICAgdmFyIGd1YXJkID0gaXRlcmF0ZWVzWzJdO1xuICAgICAgaWYgKGd1YXJkICYmIGlzSXRlcmF0ZWVDYWxsKGl0ZXJhdGVlc1swXSwgaXRlcmF0ZWVzWzFdLCBndWFyZCkpIHtcbiAgICAgICAgaXRlcmF0ZWVzLmxlbmd0aCA9IDE7XG4gICAgICB9XG4gICAgICByZXR1cm4gYmFzZVNvcnRCeU9yZGVyKGNvbGxlY3Rpb24sIGJhc2VGbGF0dGVuKGl0ZXJhdGVlcyksIFtdKTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uc29ydEJ5QWxsYCBleGNlcHQgdGhhdCBpdCBhbGxvd3Mgc3BlY2lmeWluZyB0aGVcbiAgICAgKiBzb3J0IG9yZGVycyBvZiB0aGUgaXRlcmF0ZWVzIHRvIHNvcnQgYnkuIElmIGBvcmRlcnNgIGlzIHVuc3BlY2lmaWVkLCBhbGxcbiAgICAgKiB2YWx1ZXMgYXJlIHNvcnRlZCBpbiBhc2NlbmRpbmcgb3JkZXIuIE90aGVyd2lzZSwgYSB2YWx1ZSBpcyBzb3J0ZWQgaW5cbiAgICAgKiBhc2NlbmRpbmcgb3JkZXIgaWYgaXRzIGNvcnJlc3BvbmRpbmcgb3JkZXIgaXMgXCJhc2NcIiwgYW5kIGRlc2NlbmRpbmcgaWYgXCJkZXNjXCIuXG4gICAgICpcbiAgICAgKiBJZiBhIHByb3BlcnR5IG5hbWUgaXMgcHJvdmlkZWQgZm9yIGFuIGl0ZXJhdGVlIHRoZSBjcmVhdGVkIGBfLnByb3BlcnR5YFxuICAgICAqIHN0eWxlIGNhbGxiYWNrIHJldHVybnMgdGhlIHByb3BlcnR5IHZhbHVlIG9mIHRoZSBnaXZlbiBlbGVtZW50LlxuICAgICAqXG4gICAgICogSWYgYW4gb2JqZWN0IGlzIHByb3ZpZGVkIGZvciBhbiBpdGVyYXRlZSB0aGUgY3JlYXRlZCBgXy5tYXRjaGVzYCBzdHlsZVxuICAgICAqIGNhbGxiYWNrIHJldHVybnMgYHRydWVgIGZvciBlbGVtZW50cyB0aGF0IGhhdmUgdGhlIHByb3BlcnRpZXMgb2YgdGhlIGdpdmVuXG4gICAgICogb2JqZWN0LCBlbHNlIGBmYWxzZWAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAY2F0ZWdvcnkgQ29sbGVjdGlvblxuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fHN0cmluZ30gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbltdfE9iamVjdFtdfHN0cmluZ1tdfSBpdGVyYXRlZXMgVGhlIGl0ZXJhdGVlcyB0byBzb3J0IGJ5LlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbltdfSBbb3JkZXJzXSBUaGUgc29ydCBvcmRlcnMgb2YgYGl0ZXJhdGVlc2AuXG4gICAgICogQHBhcmFtLSB7T2JqZWN0fSBbZ3VhcmRdIEVuYWJsZXMgdXNlIGFzIGEgY2FsbGJhY2sgZm9yIGZ1bmN0aW9ucyBsaWtlIGBfLnJlZHVjZWAuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgc29ydGVkIGFycmF5LlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgdXNlcnMgPSBbXG4gICAgICogICB7ICd1c2VyJzogJ2ZyZWQnLCAgICdhZ2UnOiA0OCB9LFxuICAgICAqICAgeyAndXNlcic6ICdiYXJuZXknLCAnYWdlJzogMzQgfSxcbiAgICAgKiAgIHsgJ3VzZXInOiAnZnJlZCcsICAgJ2FnZSc6IDQyIH0sXG4gICAgICogICB7ICd1c2VyJzogJ2Jhcm5leScsICdhZ2UnOiAzNiB9XG4gICAgICogXTtcbiAgICAgKlxuICAgICAqIC8vIHNvcnQgYnkgYHVzZXJgIGluIGFzY2VuZGluZyBvcmRlciBhbmQgYnkgYGFnZWAgaW4gZGVzY2VuZGluZyBvcmRlclxuICAgICAqIF8ubWFwKF8uc29ydEJ5T3JkZXIodXNlcnMsIFsndXNlcicsICdhZ2UnXSwgWydhc2MnLCAnZGVzYyddKSwgXy52YWx1ZXMpO1xuICAgICAqIC8vID0+IFtbJ2Jhcm5leScsIDM2XSwgWydiYXJuZXknLCAzNF0sIFsnZnJlZCcsIDQ4XSwgWydmcmVkJywgNDJdXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHNvcnRCeU9yZGVyKGNvbGxlY3Rpb24sIGl0ZXJhdGVlcywgb3JkZXJzLCBndWFyZCkge1xuICAgICAgaWYgKGNvbGxlY3Rpb24gPT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG4gICAgICBpZiAoZ3VhcmQgJiYgaXNJdGVyYXRlZUNhbGwoaXRlcmF0ZWVzLCBvcmRlcnMsIGd1YXJkKSkge1xuICAgICAgICBvcmRlcnMgPSB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgICBpZiAoIWlzQXJyYXkoaXRlcmF0ZWVzKSkge1xuICAgICAgICBpdGVyYXRlZXMgPSBpdGVyYXRlZXMgPT0gbnVsbCA/IFtdIDogW2l0ZXJhdGVlc107XG4gICAgICB9XG4gICAgICBpZiAoIWlzQXJyYXkob3JkZXJzKSkge1xuICAgICAgICBvcmRlcnMgPSBvcmRlcnMgPT0gbnVsbCA/IFtdIDogW29yZGVyc107XG4gICAgICB9XG4gICAgICByZXR1cm4gYmFzZVNvcnRCeU9yZGVyKGNvbGxlY3Rpb24sIGl0ZXJhdGVlcywgb3JkZXJzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQZXJmb3JtcyBhIGRlZXAgY29tcGFyaXNvbiBiZXR3ZWVuIGVhY2ggZWxlbWVudCBpbiBgY29sbGVjdGlvbmAgYW5kIHRoZVxuICAgICAqIHNvdXJjZSBvYmplY3QsIHJldHVybmluZyBhbiBhcnJheSBvZiBhbGwgZWxlbWVudHMgdGhhdCBoYXZlIGVxdWl2YWxlbnRcbiAgICAgKiBwcm9wZXJ0eSB2YWx1ZXMuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2Qgc3VwcG9ydHMgY29tcGFyaW5nIGFycmF5cywgYm9vbGVhbnMsIGBEYXRlYCBvYmplY3RzLFxuICAgICAqIG51bWJlcnMsIGBPYmplY3RgIG9iamVjdHMsIHJlZ2V4ZXMsIGFuZCBzdHJpbmdzLiBPYmplY3RzIGFyZSBjb21wYXJlZCBieVxuICAgICAqIHRoZWlyIG93biwgbm90IGluaGVyaXRlZCwgZW51bWVyYWJsZSBwcm9wZXJ0aWVzLiBGb3IgY29tcGFyaW5nIGEgc2luZ2xlXG4gICAgICogb3duIG9yIGluaGVyaXRlZCBwcm9wZXJ0eSB2YWx1ZSBzZWUgYF8ubWF0Y2hlc1Byb3BlcnR5YC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBjYXRlZ29yeSBDb2xsZWN0aW9uXG4gICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R8c3RyaW5nfSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIHNlYXJjaC5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gc291cmNlIFRoZSBvYmplY3Qgb2YgcHJvcGVydHkgdmFsdWVzIHRvIG1hdGNoLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGZpbHRlcmVkIGFycmF5LlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgdXNlcnMgPSBbXG4gICAgICogICB7ICd1c2VyJzogJ2Jhcm5leScsICdhZ2UnOiAzNiwgJ2FjdGl2ZSc6IGZhbHNlLCAncGV0cyc6IFsnaG9wcHknXSB9LFxuICAgICAqICAgeyAndXNlcic6ICdmcmVkJywgICAnYWdlJzogNDAsICdhY3RpdmUnOiB0cnVlLCAncGV0cyc6IFsnYmFieSBwdXNzJywgJ2Rpbm8nXSB9XG4gICAgICogXTtcbiAgICAgKlxuICAgICAqIF8ucGx1Y2soXy53aGVyZSh1c2VycywgeyAnYWdlJzogMzYsICdhY3RpdmUnOiBmYWxzZSB9KSwgJ3VzZXInKTtcbiAgICAgKiAvLyA9PiBbJ2Jhcm5leSddXG4gICAgICpcbiAgICAgKiBfLnBsdWNrKF8ud2hlcmUodXNlcnMsIHsgJ3BldHMnOiBbJ2Rpbm8nXSB9KSwgJ3VzZXInKTtcbiAgICAgKiAvLyA9PiBbJ2ZyZWQnXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHdoZXJlKGNvbGxlY3Rpb24sIHNvdXJjZSkge1xuICAgICAgcmV0dXJuIGZpbHRlcihjb2xsZWN0aW9uLCBiYXNlTWF0Y2hlcyhzb3VyY2UpKTtcbiAgICB9XG5cbiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHRoYXQgaGF2ZSBlbGFwc2VkIHNpbmNlIHRoZSBVbml4IGVwb2NoXG4gICAgICogKDEgSmFudWFyeSAxOTcwIDAwOjAwOjAwIFVUQykuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAY2F0ZWdvcnkgRGF0ZVxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmRlZmVyKGZ1bmN0aW9uKHN0YW1wKSB7XG4gICAgICogICBjb25zb2xlLmxvZyhfLm5vdygpIC0gc3RhbXApO1xuICAgICAqIH0sIF8ubm93KCkpO1xuICAgICAqIC8vID0+IGxvZ3MgdGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgaXQgdG9vayBmb3IgdGhlIGRlZmVycmVkIGZ1bmN0aW9uIHRvIGJlIGludm9rZWRcbiAgICAgKi9cbiAgICB2YXIgbm93ID0gbmF0aXZlTm93IHx8IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIG5ldyBEYXRlKCkuZ2V0VGltZSgpO1xuICAgIH07XG5cbiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5cbiAgICAvKipcbiAgICAgKiBUaGUgb3Bwb3NpdGUgb2YgYF8uYmVmb3JlYDsgdGhpcyBtZXRob2QgY3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgaW52b2tlc1xuICAgICAqIGBmdW5jYCBvbmNlIGl0IGlzIGNhbGxlZCBgbmAgb3IgbW9yZSB0aW1lcy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBjYXRlZ29yeSBGdW5jdGlvblxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBuIFRoZSBudW1iZXIgb2YgY2FsbHMgYmVmb3JlIGBmdW5jYCBpcyBpbnZva2VkLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIHJlc3RyaWN0LlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IHJlc3RyaWN0ZWQgZnVuY3Rpb24uXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBzYXZlcyA9IFsncHJvZmlsZScsICdzZXR0aW5ncyddO1xuICAgICAqXG4gICAgICogdmFyIGRvbmUgPSBfLmFmdGVyKHNhdmVzLmxlbmd0aCwgZnVuY3Rpb24oKSB7XG4gICAgICogICBjb25zb2xlLmxvZygnZG9uZSBzYXZpbmchJyk7XG4gICAgICogfSk7XG4gICAgICpcbiAgICAgKiBfLmZvckVhY2goc2F2ZXMsIGZ1bmN0aW9uKHR5cGUpIHtcbiAgICAgKiAgIGFzeW5jU2F2ZSh7ICd0eXBlJzogdHlwZSwgJ2NvbXBsZXRlJzogZG9uZSB9KTtcbiAgICAgKiB9KTtcbiAgICAgKiAvLyA9PiBsb2dzICdkb25lIHNhdmluZyEnIGFmdGVyIHRoZSB0d28gYXN5bmMgc2F2ZXMgaGF2ZSBjb21wbGV0ZWRcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBhZnRlcihuLCBmdW5jKSB7XG4gICAgICBpZiAodHlwZW9mIGZ1bmMgIT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBpZiAodHlwZW9mIG4gPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIHZhciB0ZW1wID0gbjtcbiAgICAgICAgICBuID0gZnVuYztcbiAgICAgICAgICBmdW5jID0gdGVtcDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKEZVTkNfRVJST1JfVEVYVCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIG4gPSBuYXRpdmVJc0Zpbml0ZShuID0gK24pID8gbiA6IDA7XG4gICAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICAgIGlmICgtLW4gPCAxKSB7XG4gICAgICAgICAgcmV0dXJuIGZ1bmMuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCBhY2NlcHRzIHVwIHRvIGBuYCBhcmd1bWVudHMgaWdub3JpbmcgYW55XG4gICAgICogYWRkaXRpb25hbCBhcmd1bWVudHMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAY2F0ZWdvcnkgRnVuY3Rpb25cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBjYXAgYXJndW1lbnRzIGZvci5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW249ZnVuYy5sZW5ndGhdIFRoZSBhcml0eSBjYXAuXG4gICAgICogQHBhcmFtLSB7T2JqZWN0fSBbZ3VhcmRdIEVuYWJsZXMgdXNlIGFzIGEgY2FsbGJhY2sgZm9yIGZ1bmN0aW9ucyBsaWtlIGBfLm1hcGAuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgZnVuY3Rpb24uXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8ubWFwKFsnNicsICc4JywgJzEwJ10sIF8uYXJ5KHBhcnNlSW50LCAxKSk7XG4gICAgICogLy8gPT4gWzYsIDgsIDEwXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGFyeShmdW5jLCBuLCBndWFyZCkge1xuICAgICAgaWYgKGd1YXJkICYmIGlzSXRlcmF0ZWVDYWxsKGZ1bmMsIG4sIGd1YXJkKSkge1xuICAgICAgICBuID0gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgICAgbiA9IChmdW5jICYmIG4gPT0gbnVsbCkgPyBmdW5jLmxlbmd0aCA6IG5hdGl2ZU1heCgrbiB8fCAwLCAwKTtcbiAgICAgIHJldHVybiBjcmVhdGVXcmFwcGVyKGZ1bmMsIEFSWV9GTEFHLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIG4pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IGludm9rZXMgYGZ1bmNgLCB3aXRoIHRoZSBgdGhpc2AgYmluZGluZyBhbmQgYXJndW1lbnRzXG4gICAgICogb2YgdGhlIGNyZWF0ZWQgZnVuY3Rpb24sIHdoaWxlIGl0IGlzIGNhbGxlZCBsZXNzIHRoYW4gYG5gIHRpbWVzLiBTdWJzZXF1ZW50XG4gICAgICogY2FsbHMgdG8gdGhlIGNyZWF0ZWQgZnVuY3Rpb24gcmV0dXJuIHRoZSByZXN1bHQgb2YgdGhlIGxhc3QgYGZ1bmNgIGludm9jYXRpb24uXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAY2F0ZWdvcnkgRnVuY3Rpb25cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gbiBUaGUgbnVtYmVyIG9mIGNhbGxzIGF0IHdoaWNoIGBmdW5jYCBpcyBubyBsb25nZXIgaW52b2tlZC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byByZXN0cmljdC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyByZXN0cmljdGVkIGZ1bmN0aW9uLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBqUXVlcnkoJyNhZGQnKS5vbignY2xpY2snLCBfLmJlZm9yZSg1LCBhZGRDb250YWN0VG9MaXN0KSk7XG4gICAgICogLy8gPT4gYWxsb3dzIGFkZGluZyB1cCB0byA0IGNvbnRhY3RzIHRvIHRoZSBsaXN0XG4gICAgICovXG4gICAgZnVuY3Rpb24gYmVmb3JlKG4sIGZ1bmMpIHtcbiAgICAgIHZhciByZXN1bHQ7XG4gICAgICBpZiAodHlwZW9mIGZ1bmMgIT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBpZiAodHlwZW9mIG4gPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIHZhciB0ZW1wID0gbjtcbiAgICAgICAgICBuID0gZnVuYztcbiAgICAgICAgICBmdW5jID0gdGVtcDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKEZVTkNfRVJST1JfVEVYVCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgICAgaWYgKC0tbiA+IDApIHtcbiAgICAgICAgICByZXN1bHQgPSBmdW5jLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG4gPD0gMSkge1xuICAgICAgICAgIGZ1bmMgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgaW52b2tlcyBgZnVuY2Agd2l0aCB0aGUgYHRoaXNgIGJpbmRpbmcgb2YgYHRoaXNBcmdgXG4gICAgICogYW5kIHByZXBlbmRzIGFueSBhZGRpdGlvbmFsIGBfLmJpbmRgIGFyZ3VtZW50cyB0byB0aG9zZSBwcm92aWRlZCB0byB0aGVcbiAgICAgKiBib3VuZCBmdW5jdGlvbi5cbiAgICAgKlxuICAgICAqIFRoZSBgXy5iaW5kLnBsYWNlaG9sZGVyYCB2YWx1ZSwgd2hpY2ggZGVmYXVsdHMgdG8gYF9gIGluIG1vbm9saXRoaWMgYnVpbGRzLFxuICAgICAqIG1heSBiZSB1c2VkIGFzIGEgcGxhY2Vob2xkZXIgZm9yIHBhcnRpYWxseSBhcHBsaWVkIGFyZ3VtZW50cy5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBVbmxpa2UgbmF0aXZlIGBGdW5jdGlvbiNiaW5kYCB0aGlzIG1ldGhvZCBkb2VzIG5vdCBzZXQgdGhlIFwibGVuZ3RoXCJcbiAgICAgKiBwcm9wZXJ0eSBvZiBib3VuZCBmdW5jdGlvbnMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAY2F0ZWdvcnkgRnVuY3Rpb25cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBiaW5kLlxuICAgICAqIEBwYXJhbSB7Kn0gdGhpc0FyZyBUaGUgYHRoaXNgIGJpbmRpbmcgb2YgYGZ1bmNgLlxuICAgICAqIEBwYXJhbSB7Li4uKn0gW3BhcnRpYWxzXSBUaGUgYXJndW1lbnRzIHRvIGJlIHBhcnRpYWxseSBhcHBsaWVkLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGJvdW5kIGZ1bmN0aW9uLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgZ3JlZXQgPSBmdW5jdGlvbihncmVldGluZywgcHVuY3R1YXRpb24pIHtcbiAgICAgKiAgIHJldHVybiBncmVldGluZyArICcgJyArIHRoaXMudXNlciArIHB1bmN0dWF0aW9uO1xuICAgICAqIH07XG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0ID0geyAndXNlcic6ICdmcmVkJyB9O1xuICAgICAqXG4gICAgICogdmFyIGJvdW5kID0gXy5iaW5kKGdyZWV0LCBvYmplY3QsICdoaScpO1xuICAgICAqIGJvdW5kKCchJyk7XG4gICAgICogLy8gPT4gJ2hpIGZyZWQhJ1xuICAgICAqXG4gICAgICogLy8gdXNpbmcgcGxhY2Vob2xkZXJzXG4gICAgICogdmFyIGJvdW5kID0gXy5iaW5kKGdyZWV0LCBvYmplY3QsIF8sICchJyk7XG4gICAgICogYm91bmQoJ2hpJyk7XG4gICAgICogLy8gPT4gJ2hpIGZyZWQhJ1xuICAgICAqL1xuICAgIHZhciBiaW5kID0gcmVzdFBhcmFtKGZ1bmN0aW9uKGZ1bmMsIHRoaXNBcmcsIHBhcnRpYWxzKSB7XG4gICAgICB2YXIgYml0bWFzayA9IEJJTkRfRkxBRztcbiAgICAgIGlmIChwYXJ0aWFscy5sZW5ndGgpIHtcbiAgICAgICAgdmFyIGhvbGRlcnMgPSByZXBsYWNlSG9sZGVycyhwYXJ0aWFscywgYmluZC5wbGFjZWhvbGRlcik7XG4gICAgICAgIGJpdG1hc2sgfD0gUEFSVElBTF9GTEFHO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGNyZWF0ZVdyYXBwZXIoZnVuYywgYml0bWFzaywgdGhpc0FyZywgcGFydGlhbHMsIGhvbGRlcnMpO1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogQmluZHMgbWV0aG9kcyBvZiBhbiBvYmplY3QgdG8gdGhlIG9iamVjdCBpdHNlbGYsIG92ZXJ3cml0aW5nIHRoZSBleGlzdGluZ1xuICAgICAqIG1ldGhvZC4gTWV0aG9kIG5hbWVzIG1heSBiZSBzcGVjaWZpZWQgYXMgaW5kaXZpZHVhbCBhcmd1bWVudHMgb3IgYXMgYXJyYXlzXG4gICAgICogb2YgbWV0aG9kIG5hbWVzLiBJZiBubyBtZXRob2QgbmFtZXMgYXJlIHByb3ZpZGVkIGFsbCBlbnVtZXJhYmxlIGZ1bmN0aW9uXG4gICAgICogcHJvcGVydGllcywgb3duIGFuZCBpbmhlcml0ZWQsIG9mIGBvYmplY3RgIGFyZSBib3VuZC5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBkb2VzIG5vdCBzZXQgdGhlIFwibGVuZ3RoXCIgcHJvcGVydHkgb2YgYm91bmQgZnVuY3Rpb25zLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGJpbmQgYW5kIGFzc2lnbiB0aGUgYm91bmQgbWV0aG9kcyB0by5cbiAgICAgKiBAcGFyYW0gey4uLihzdHJpbmd8c3RyaW5nW10pfSBbbWV0aG9kTmFtZXNdIFRoZSBvYmplY3QgbWV0aG9kIG5hbWVzIHRvIGJpbmQsXG4gICAgICogIHNwZWNpZmllZCBhcyBpbmRpdmlkdWFsIG1ldGhvZCBuYW1lcyBvciBhcnJheXMgb2YgbWV0aG9kIG5hbWVzLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciB2aWV3ID0ge1xuICAgICAqICAgJ2xhYmVsJzogJ2RvY3MnLFxuICAgICAqICAgJ29uQ2xpY2snOiBmdW5jdGlvbigpIHtcbiAgICAgKiAgICAgY29uc29sZS5sb2coJ2NsaWNrZWQgJyArIHRoaXMubGFiZWwpO1xuICAgICAqICAgfVxuICAgICAqIH07XG4gICAgICpcbiAgICAgKiBfLmJpbmRBbGwodmlldyk7XG4gICAgICogalF1ZXJ5KCcjZG9jcycpLm9uKCdjbGljaycsIHZpZXcub25DbGljayk7XG4gICAgICogLy8gPT4gbG9ncyAnY2xpY2tlZCBkb2NzJyB3aGVuIHRoZSBlbGVtZW50IGlzIGNsaWNrZWRcbiAgICAgKi9cbiAgICB2YXIgYmluZEFsbCA9IHJlc3RQYXJhbShmdW5jdGlvbihvYmplY3QsIG1ldGhvZE5hbWVzKSB7XG4gICAgICBtZXRob2ROYW1lcyA9IG1ldGhvZE5hbWVzLmxlbmd0aCA/IGJhc2VGbGF0dGVuKG1ldGhvZE5hbWVzKSA6IGZ1bmN0aW9ucyhvYmplY3QpO1xuXG4gICAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgICBsZW5ndGggPSBtZXRob2ROYW1lcy5sZW5ndGg7XG5cbiAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgIHZhciBrZXkgPSBtZXRob2ROYW1lc1tpbmRleF07XG4gICAgICAgIG9iamVjdFtrZXldID0gY3JlYXRlV3JhcHBlcihvYmplY3Rba2V5XSwgQklORF9GTEFHLCBvYmplY3QpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG9iamVjdDtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IGludm9rZXMgdGhlIG1ldGhvZCBhdCBgb2JqZWN0W2tleV1gIGFuZCBwcmVwZW5kc1xuICAgICAqIGFueSBhZGRpdGlvbmFsIGBfLmJpbmRLZXlgIGFyZ3VtZW50cyB0byB0aG9zZSBwcm92aWRlZCB0byB0aGUgYm91bmQgZnVuY3Rpb24uXG4gICAgICpcbiAgICAgKiBUaGlzIG1ldGhvZCBkaWZmZXJzIGZyb20gYF8uYmluZGAgYnkgYWxsb3dpbmcgYm91bmQgZnVuY3Rpb25zIHRvIHJlZmVyZW5jZVxuICAgICAqIG1ldGhvZHMgdGhhdCBtYXkgYmUgcmVkZWZpbmVkIG9yIGRvbid0IHlldCBleGlzdC5cbiAgICAgKiBTZWUgW1BldGVyIE1pY2hhdXgncyBhcnRpY2xlXShodHRwOi8vcGV0ZXIubWljaGF1eC5jYS9hcnRpY2xlcy9sYXp5LWZ1bmN0aW9uLWRlZmluaXRpb24tcGF0dGVybilcbiAgICAgKiBmb3IgbW9yZSBkZXRhaWxzLlxuICAgICAqXG4gICAgICogVGhlIGBfLmJpbmRLZXkucGxhY2Vob2xkZXJgIHZhbHVlLCB3aGljaCBkZWZhdWx0cyB0byBgX2AgaW4gbW9ub2xpdGhpY1xuICAgICAqIGJ1aWxkcywgbWF5IGJlIHVzZWQgYXMgYSBwbGFjZWhvbGRlciBmb3IgcGFydGlhbGx5IGFwcGxpZWQgYXJndW1lbnRzLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRoZSBtZXRob2QgYmVsb25ncyB0by5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIG1ldGhvZC5cbiAgICAgKiBAcGFyYW0gey4uLip9IFtwYXJ0aWFsc10gVGhlIGFyZ3VtZW50cyB0byBiZSBwYXJ0aWFsbHkgYXBwbGllZC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBib3VuZCBmdW5jdGlvbi5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIG9iamVjdCA9IHtcbiAgICAgKiAgICd1c2VyJzogJ2ZyZWQnLFxuICAgICAqICAgJ2dyZWV0JzogZnVuY3Rpb24oZ3JlZXRpbmcsIHB1bmN0dWF0aW9uKSB7XG4gICAgICogICAgIHJldHVybiBncmVldGluZyArICcgJyArIHRoaXMudXNlciArIHB1bmN0dWF0aW9uO1xuICAgICAqICAgfVxuICAgICAqIH07XG4gICAgICpcbiAgICAgKiB2YXIgYm91bmQgPSBfLmJpbmRLZXkob2JqZWN0LCAnZ3JlZXQnLCAnaGknKTtcbiAgICAgKiBib3VuZCgnIScpO1xuICAgICAqIC8vID0+ICdoaSBmcmVkISdcbiAgICAgKlxuICAgICAqIG9iamVjdC5ncmVldCA9IGZ1bmN0aW9uKGdyZWV0aW5nLCBwdW5jdHVhdGlvbikge1xuICAgICAqICAgcmV0dXJuIGdyZWV0aW5nICsgJ3lhICcgKyB0aGlzLnVzZXIgKyBwdW5jdHVhdGlvbjtcbiAgICAgKiB9O1xuICAgICAqXG4gICAgICogYm91bmQoJyEnKTtcbiAgICAgKiAvLyA9PiAnaGl5YSBmcmVkISdcbiAgICAgKlxuICAgICAqIC8vIHVzaW5nIHBsYWNlaG9sZGVyc1xuICAgICAqIHZhciBib3VuZCA9IF8uYmluZEtleShvYmplY3QsICdncmVldCcsIF8sICchJyk7XG4gICAgICogYm91bmQoJ2hpJyk7XG4gICAgICogLy8gPT4gJ2hpeWEgZnJlZCEnXG4gICAgICovXG4gICAgdmFyIGJpbmRLZXkgPSByZXN0UGFyYW0oZnVuY3Rpb24ob2JqZWN0LCBrZXksIHBhcnRpYWxzKSB7XG4gICAgICB2YXIgYml0bWFzayA9IEJJTkRfRkxBRyB8IEJJTkRfS0VZX0ZMQUc7XG4gICAgICBpZiAocGFydGlhbHMubGVuZ3RoKSB7XG4gICAgICAgIHZhciBob2xkZXJzID0gcmVwbGFjZUhvbGRlcnMocGFydGlhbHMsIGJpbmRLZXkucGxhY2Vob2xkZXIpO1xuICAgICAgICBiaXRtYXNrIHw9IFBBUlRJQUxfRkxBRztcbiAgICAgIH1cbiAgICAgIHJldHVybiBjcmVhdGVXcmFwcGVyKGtleSwgYml0bWFzaywgb2JqZWN0LCBwYXJ0aWFscywgaG9sZGVycyk7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCBhY2NlcHRzIG9uZSBvciBtb3JlIGFyZ3VtZW50cyBvZiBgZnVuY2AgdGhhdCB3aGVuXG4gICAgICogY2FsbGVkIGVpdGhlciBpbnZva2VzIGBmdW5jYCByZXR1cm5pbmcgaXRzIHJlc3VsdCwgaWYgYWxsIGBmdW5jYCBhcmd1bWVudHNcbiAgICAgKiBoYXZlIGJlZW4gcHJvdmlkZWQsIG9yIHJldHVybnMgYSBmdW5jdGlvbiB0aGF0IGFjY2VwdHMgb25lIG9yIG1vcmUgb2YgdGhlXG4gICAgICogcmVtYWluaW5nIGBmdW5jYCBhcmd1bWVudHMsIGFuZCBzbyBvbi4gVGhlIGFyaXR5IG9mIGBmdW5jYCBtYXkgYmUgc3BlY2lmaWVkXG4gICAgICogaWYgYGZ1bmMubGVuZ3RoYCBpcyBub3Qgc3VmZmljaWVudC5cbiAgICAgKlxuICAgICAqIFRoZSBgXy5jdXJyeS5wbGFjZWhvbGRlcmAgdmFsdWUsIHdoaWNoIGRlZmF1bHRzIHRvIGBfYCBpbiBtb25vbGl0aGljIGJ1aWxkcyxcbiAgICAgKiBtYXkgYmUgdXNlZCBhcyBhIHBsYWNlaG9sZGVyIGZvciBwcm92aWRlZCBhcmd1bWVudHMuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgZG9lcyBub3Qgc2V0IHRoZSBcImxlbmd0aFwiIHByb3BlcnR5IG9mIGN1cnJpZWQgZnVuY3Rpb25zLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gY3VycnkuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFthcml0eT1mdW5jLmxlbmd0aF0gVGhlIGFyaXR5IG9mIGBmdW5jYC5cbiAgICAgKiBAcGFyYW0tIHtPYmplY3R9IFtndWFyZF0gRW5hYmxlcyB1c2UgYXMgYSBjYWxsYmFjayBmb3IgZnVuY3Rpb25zIGxpa2UgYF8ubWFwYC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBjdXJyaWVkIGZ1bmN0aW9uLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgYWJjID0gZnVuY3Rpb24oYSwgYiwgYykge1xuICAgICAqICAgcmV0dXJuIFthLCBiLCBjXTtcbiAgICAgKiB9O1xuICAgICAqXG4gICAgICogdmFyIGN1cnJpZWQgPSBfLmN1cnJ5KGFiYyk7XG4gICAgICpcbiAgICAgKiBjdXJyaWVkKDEpKDIpKDMpO1xuICAgICAqIC8vID0+IFsxLCAyLCAzXVxuICAgICAqXG4gICAgICogY3VycmllZCgxLCAyKSgzKTtcbiAgICAgKiAvLyA9PiBbMSwgMiwgM11cbiAgICAgKlxuICAgICAqIGN1cnJpZWQoMSwgMiwgMyk7XG4gICAgICogLy8gPT4gWzEsIDIsIDNdXG4gICAgICpcbiAgICAgKiAvLyB1c2luZyBwbGFjZWhvbGRlcnNcbiAgICAgKiBjdXJyaWVkKDEpKF8sIDMpKDIpO1xuICAgICAqIC8vID0+IFsxLCAyLCAzXVxuICAgICAqL1xuICAgIHZhciBjdXJyeSA9IGNyZWF0ZUN1cnJ5KENVUlJZX0ZMQUcpO1xuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5jdXJyeWAgZXhjZXB0IHRoYXQgYXJndW1lbnRzIGFyZSBhcHBsaWVkIHRvIGBmdW5jYFxuICAgICAqIGluIHRoZSBtYW5uZXIgb2YgYF8ucGFydGlhbFJpZ2h0YCBpbnN0ZWFkIG9mIGBfLnBhcnRpYWxgLlxuICAgICAqXG4gICAgICogVGhlIGBfLmN1cnJ5UmlnaHQucGxhY2Vob2xkZXJgIHZhbHVlLCB3aGljaCBkZWZhdWx0cyB0byBgX2AgaW4gbW9ub2xpdGhpY1xuICAgICAqIGJ1aWxkcywgbWF5IGJlIHVzZWQgYXMgYSBwbGFjZWhvbGRlciBmb3IgcHJvdmlkZWQgYXJndW1lbnRzLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoaXMgbWV0aG9kIGRvZXMgbm90IHNldCB0aGUgXCJsZW5ndGhcIiBwcm9wZXJ0eSBvZiBjdXJyaWVkIGZ1bmN0aW9ucy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBjYXRlZ29yeSBGdW5jdGlvblxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGN1cnJ5LlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbYXJpdHk9ZnVuYy5sZW5ndGhdIFRoZSBhcml0eSBvZiBgZnVuY2AuXG4gICAgICogQHBhcmFtLSB7T2JqZWN0fSBbZ3VhcmRdIEVuYWJsZXMgdXNlIGFzIGEgY2FsbGJhY2sgZm9yIGZ1bmN0aW9ucyBsaWtlIGBfLm1hcGAuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgY3VycmllZCBmdW5jdGlvbi5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIGFiYyA9IGZ1bmN0aW9uKGEsIGIsIGMpIHtcbiAgICAgKiAgIHJldHVybiBbYSwgYiwgY107XG4gICAgICogfTtcbiAgICAgKlxuICAgICAqIHZhciBjdXJyaWVkID0gXy5jdXJyeVJpZ2h0KGFiYyk7XG4gICAgICpcbiAgICAgKiBjdXJyaWVkKDMpKDIpKDEpO1xuICAgICAqIC8vID0+IFsxLCAyLCAzXVxuICAgICAqXG4gICAgICogY3VycmllZCgyLCAzKSgxKTtcbiAgICAgKiAvLyA9PiBbMSwgMiwgM11cbiAgICAgKlxuICAgICAqIGN1cnJpZWQoMSwgMiwgMyk7XG4gICAgICogLy8gPT4gWzEsIDIsIDNdXG4gICAgICpcbiAgICAgKiAvLyB1c2luZyBwbGFjZWhvbGRlcnNcbiAgICAgKiBjdXJyaWVkKDMpKDEsIF8pKDIpO1xuICAgICAqIC8vID0+IFsxLCAyLCAzXVxuICAgICAqL1xuICAgIHZhciBjdXJyeVJpZ2h0ID0gY3JlYXRlQ3VycnkoQ1VSUllfUklHSFRfRkxBRyk7XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZGVib3VuY2VkIGZ1bmN0aW9uIHRoYXQgZGVsYXlzIGludm9raW5nIGBmdW5jYCB1bnRpbCBhZnRlciBgd2FpdGBcbiAgICAgKiBtaWxsaXNlY29uZHMgaGF2ZSBlbGFwc2VkIHNpbmNlIHRoZSBsYXN0IHRpbWUgdGhlIGRlYm91bmNlZCBmdW5jdGlvbiB3YXNcbiAgICAgKiBpbnZva2VkLiBUaGUgZGVib3VuY2VkIGZ1bmN0aW9uIGNvbWVzIHdpdGggYSBgY2FuY2VsYCBtZXRob2QgdG8gY2FuY2VsXG4gICAgICogZGVsYXllZCBpbnZvY2F0aW9ucy4gUHJvdmlkZSBhbiBvcHRpb25zIG9iamVjdCB0byBpbmRpY2F0ZSB0aGF0IGBmdW5jYFxuICAgICAqIHNob3VsZCBiZSBpbnZva2VkIG9uIHRoZSBsZWFkaW5nIGFuZC9vciB0cmFpbGluZyBlZGdlIG9mIHRoZSBgd2FpdGAgdGltZW91dC5cbiAgICAgKiBTdWJzZXF1ZW50IGNhbGxzIHRvIHRoZSBkZWJvdW5jZWQgZnVuY3Rpb24gcmV0dXJuIHRoZSByZXN1bHQgb2YgdGhlIGxhc3RcbiAgICAgKiBgZnVuY2AgaW52b2NhdGlvbi5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBJZiBgbGVhZGluZ2AgYW5kIGB0cmFpbGluZ2Agb3B0aW9ucyBhcmUgYHRydWVgLCBgZnVuY2AgaXMgaW52b2tlZFxuICAgICAqIG9uIHRoZSB0cmFpbGluZyBlZGdlIG9mIHRoZSB0aW1lb3V0IG9ubHkgaWYgdGhlIHRoZSBkZWJvdW5jZWQgZnVuY3Rpb24gaXNcbiAgICAgKiBpbnZva2VkIG1vcmUgdGhhbiBvbmNlIGR1cmluZyB0aGUgYHdhaXRgIHRpbWVvdXQuXG4gICAgICpcbiAgICAgKiBTZWUgW0RhdmlkIENvcmJhY2hvJ3MgYXJ0aWNsZV0oaHR0cDovL2RydXBhbG1vdGlvbi5jb20vYXJ0aWNsZS9kZWJvdW5jZS1hbmQtdGhyb3R0bGUtdmlzdWFsLWV4cGxhbmF0aW9uKVxuICAgICAqIGZvciBkZXRhaWxzIG92ZXIgdGhlIGRpZmZlcmVuY2VzIGJldHdlZW4gYF8uZGVib3VuY2VgIGFuZCBgXy50aHJvdHRsZWAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAY2F0ZWdvcnkgRnVuY3Rpb25cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBkZWJvdW5jZS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3dhaXQ9MF0gVGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgdG8gZGVsYXkuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXSBUaGUgb3B0aW9ucyBvYmplY3QuXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy5sZWFkaW5nPWZhbHNlXSBTcGVjaWZ5IGludm9raW5nIG9uIHRoZSBsZWFkaW5nXG4gICAgICogIGVkZ2Ugb2YgdGhlIHRpbWVvdXQuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtvcHRpb25zLm1heFdhaXRdIFRoZSBtYXhpbXVtIHRpbWUgYGZ1bmNgIGlzIGFsbG93ZWQgdG8gYmVcbiAgICAgKiAgZGVsYXllZCBiZWZvcmUgaXQgaXMgaW52b2tlZC5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLnRyYWlsaW5nPXRydWVdIFNwZWNpZnkgaW52b2tpbmcgb24gdGhlIHRyYWlsaW5nXG4gICAgICogIGVkZ2Ugb2YgdGhlIHRpbWVvdXQuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgZGVib3VuY2VkIGZ1bmN0aW9uLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiAvLyBhdm9pZCBjb3N0bHkgY2FsY3VsYXRpb25zIHdoaWxlIHRoZSB3aW5kb3cgc2l6ZSBpcyBpbiBmbHV4XG4gICAgICogalF1ZXJ5KHdpbmRvdykub24oJ3Jlc2l6ZScsIF8uZGVib3VuY2UoY2FsY3VsYXRlTGF5b3V0LCAxNTApKTtcbiAgICAgKlxuICAgICAqIC8vIGludm9rZSBgc2VuZE1haWxgIHdoZW4gdGhlIGNsaWNrIGV2ZW50IGlzIGZpcmVkLCBkZWJvdW5jaW5nIHN1YnNlcXVlbnQgY2FsbHNcbiAgICAgKiBqUXVlcnkoJyNwb3N0Ym94Jykub24oJ2NsaWNrJywgXy5kZWJvdW5jZShzZW5kTWFpbCwgMzAwLCB7XG4gICAgICogICAnbGVhZGluZyc6IHRydWUsXG4gICAgICogICAndHJhaWxpbmcnOiBmYWxzZVxuICAgICAqIH0pKTtcbiAgICAgKlxuICAgICAqIC8vIGVuc3VyZSBgYmF0Y2hMb2dgIGlzIGludm9rZWQgb25jZSBhZnRlciAxIHNlY29uZCBvZiBkZWJvdW5jZWQgY2FsbHNcbiAgICAgKiB2YXIgc291cmNlID0gbmV3IEV2ZW50U291cmNlKCcvc3RyZWFtJyk7XG4gICAgICogalF1ZXJ5KHNvdXJjZSkub24oJ21lc3NhZ2UnLCBfLmRlYm91bmNlKGJhdGNoTG9nLCAyNTAsIHtcbiAgICAgKiAgICdtYXhXYWl0JzogMTAwMFxuICAgICAqIH0pKTtcbiAgICAgKlxuICAgICAqIC8vIGNhbmNlbCBhIGRlYm91bmNlZCBjYWxsXG4gICAgICogdmFyIHRvZG9DaGFuZ2VzID0gXy5kZWJvdW5jZShiYXRjaExvZywgMTAwMCk7XG4gICAgICogT2JqZWN0Lm9ic2VydmUobW9kZWxzLnRvZG8sIHRvZG9DaGFuZ2VzKTtcbiAgICAgKlxuICAgICAqIE9iamVjdC5vYnNlcnZlKG1vZGVscywgZnVuY3Rpb24oY2hhbmdlcykge1xuICAgICAqICAgaWYgKF8uZmluZChjaGFuZ2VzLCB7ICd1c2VyJzogJ3RvZG8nLCAndHlwZSc6ICdkZWxldGUnfSkpIHtcbiAgICAgKiAgICAgdG9kb0NoYW5nZXMuY2FuY2VsKCk7XG4gICAgICogICB9XG4gICAgICogfSwgWydkZWxldGUnXSk7XG4gICAgICpcbiAgICAgKiAvLyAuLi5hdCBzb21lIHBvaW50IGBtb2RlbHMudG9kb2AgaXMgY2hhbmdlZFxuICAgICAqIG1vZGVscy50b2RvLmNvbXBsZXRlZCA9IHRydWU7XG4gICAgICpcbiAgICAgKiAvLyAuLi5iZWZvcmUgMSBzZWNvbmQgaGFzIHBhc3NlZCBgbW9kZWxzLnRvZG9gIGlzIGRlbGV0ZWRcbiAgICAgKiAvLyB3aGljaCBjYW5jZWxzIHRoZSBkZWJvdW5jZWQgYHRvZG9DaGFuZ2VzYCBjYWxsXG4gICAgICogZGVsZXRlIG1vZGVscy50b2RvO1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIGRlYm91bmNlKGZ1bmMsIHdhaXQsIG9wdGlvbnMpIHtcbiAgICAgIHZhciBhcmdzLFxuICAgICAgICAgIG1heFRpbWVvdXRJZCxcbiAgICAgICAgICByZXN1bHQsXG4gICAgICAgICAgc3RhbXAsXG4gICAgICAgICAgdGhpc0FyZyxcbiAgICAgICAgICB0aW1lb3V0SWQsXG4gICAgICAgICAgdHJhaWxpbmdDYWxsLFxuICAgICAgICAgIGxhc3RDYWxsZWQgPSAwLFxuICAgICAgICAgIG1heFdhaXQgPSBmYWxzZSxcbiAgICAgICAgICB0cmFpbGluZyA9IHRydWU7XG5cbiAgICAgIGlmICh0eXBlb2YgZnVuYyAhPSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoRlVOQ19FUlJPUl9URVhUKTtcbiAgICAgIH1cbiAgICAgIHdhaXQgPSB3YWl0IDwgMCA/IDAgOiAoK3dhaXQgfHwgMCk7XG4gICAgICBpZiAob3B0aW9ucyA9PT0gdHJ1ZSkge1xuICAgICAgICB2YXIgbGVhZGluZyA9IHRydWU7XG4gICAgICAgIHRyYWlsaW5nID0gZmFsc2U7XG4gICAgICB9IGVsc2UgaWYgKGlzT2JqZWN0KG9wdGlvbnMpKSB7XG4gICAgICAgIGxlYWRpbmcgPSAhIW9wdGlvbnMubGVhZGluZztcbiAgICAgICAgbWF4V2FpdCA9ICdtYXhXYWl0JyBpbiBvcHRpb25zICYmIG5hdGl2ZU1heCgrb3B0aW9ucy5tYXhXYWl0IHx8IDAsIHdhaXQpO1xuICAgICAgICB0cmFpbGluZyA9ICd0cmFpbGluZycgaW4gb3B0aW9ucyA/ICEhb3B0aW9ucy50cmFpbGluZyA6IHRyYWlsaW5nO1xuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiBjYW5jZWwoKSB7XG4gICAgICAgIGlmICh0aW1lb3V0SWQpIHtcbiAgICAgICAgICBjbGVhclRpbWVvdXQodGltZW91dElkKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWF4VGltZW91dElkKSB7XG4gICAgICAgICAgY2xlYXJUaW1lb3V0KG1heFRpbWVvdXRJZCk7XG4gICAgICAgIH1cbiAgICAgICAgbGFzdENhbGxlZCA9IDA7XG4gICAgICAgIG1heFRpbWVvdXRJZCA9IHRpbWVvdXRJZCA9IHRyYWlsaW5nQ2FsbCA9IHVuZGVmaW5lZDtcbiAgICAgIH1cblxuICAgICAgZnVuY3Rpb24gY29tcGxldGUoaXNDYWxsZWQsIGlkKSB7XG4gICAgICAgIGlmIChpZCkge1xuICAgICAgICAgIGNsZWFyVGltZW91dChpZCk7XG4gICAgICAgIH1cbiAgICAgICAgbWF4VGltZW91dElkID0gdGltZW91dElkID0gdHJhaWxpbmdDYWxsID0gdW5kZWZpbmVkO1xuICAgICAgICBpZiAoaXNDYWxsZWQpIHtcbiAgICAgICAgICBsYXN0Q2FsbGVkID0gbm93KCk7XG4gICAgICAgICAgcmVzdWx0ID0gZnVuYy5hcHBseSh0aGlzQXJnLCBhcmdzKTtcbiAgICAgICAgICBpZiAoIXRpbWVvdXRJZCAmJiAhbWF4VGltZW91dElkKSB7XG4gICAgICAgICAgICBhcmdzID0gdGhpc0FyZyA9IHVuZGVmaW5lZDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgZnVuY3Rpb24gZGVsYXllZCgpIHtcbiAgICAgICAgdmFyIHJlbWFpbmluZyA9IHdhaXQgLSAobm93KCkgLSBzdGFtcCk7XG4gICAgICAgIGlmIChyZW1haW5pbmcgPD0gMCB8fCByZW1haW5pbmcgPiB3YWl0KSB7XG4gICAgICAgICAgY29tcGxldGUodHJhaWxpbmdDYWxsLCBtYXhUaW1lb3V0SWQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRpbWVvdXRJZCA9IHNldFRpbWVvdXQoZGVsYXllZCwgcmVtYWluaW5nKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiBtYXhEZWxheWVkKCkge1xuICAgICAgICBjb21wbGV0ZSh0cmFpbGluZywgdGltZW91dElkKTtcbiAgICAgIH1cblxuICAgICAgZnVuY3Rpb24gZGVib3VuY2VkKCkge1xuICAgICAgICBhcmdzID0gYXJndW1lbnRzO1xuICAgICAgICBzdGFtcCA9IG5vdygpO1xuICAgICAgICB0aGlzQXJnID0gdGhpcztcbiAgICAgICAgdHJhaWxpbmdDYWxsID0gdHJhaWxpbmcgJiYgKHRpbWVvdXRJZCB8fCAhbGVhZGluZyk7XG5cbiAgICAgICAgaWYgKG1heFdhaXQgPT09IGZhbHNlKSB7XG4gICAgICAgICAgdmFyIGxlYWRpbmdDYWxsID0gbGVhZGluZyAmJiAhdGltZW91dElkO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlmICghbWF4VGltZW91dElkICYmICFsZWFkaW5nKSB7XG4gICAgICAgICAgICBsYXN0Q2FsbGVkID0gc3RhbXA7XG4gICAgICAgICAgfVxuICAgICAgICAgIHZhciByZW1haW5pbmcgPSBtYXhXYWl0IC0gKHN0YW1wIC0gbGFzdENhbGxlZCksXG4gICAgICAgICAgICAgIGlzQ2FsbGVkID0gcmVtYWluaW5nIDw9IDAgfHwgcmVtYWluaW5nID4gbWF4V2FpdDtcblxuICAgICAgICAgIGlmIChpc0NhbGxlZCkge1xuICAgICAgICAgICAgaWYgKG1heFRpbWVvdXRJZCkge1xuICAgICAgICAgICAgICBtYXhUaW1lb3V0SWQgPSBjbGVhclRpbWVvdXQobWF4VGltZW91dElkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxhc3RDYWxsZWQgPSBzdGFtcDtcbiAgICAgICAgICAgIHJlc3VsdCA9IGZ1bmMuYXBwbHkodGhpc0FyZywgYXJncyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGVsc2UgaWYgKCFtYXhUaW1lb3V0SWQpIHtcbiAgICAgICAgICAgIG1heFRpbWVvdXRJZCA9IHNldFRpbWVvdXQobWF4RGVsYXllZCwgcmVtYWluaW5nKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlzQ2FsbGVkICYmIHRpbWVvdXRJZCkge1xuICAgICAgICAgIHRpbWVvdXRJZCA9IGNsZWFyVGltZW91dCh0aW1lb3V0SWQpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKCF0aW1lb3V0SWQgJiYgd2FpdCAhPT0gbWF4V2FpdCkge1xuICAgICAgICAgIHRpbWVvdXRJZCA9IHNldFRpbWVvdXQoZGVsYXllZCwgd2FpdCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGxlYWRpbmdDYWxsKSB7XG4gICAgICAgICAgaXNDYWxsZWQgPSB0cnVlO1xuICAgICAgICAgIHJlc3VsdCA9IGZ1bmMuYXBwbHkodGhpc0FyZywgYXJncyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlzQ2FsbGVkICYmICF0aW1lb3V0SWQgJiYgIW1heFRpbWVvdXRJZCkge1xuICAgICAgICAgIGFyZ3MgPSB0aGlzQXJnID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9XG4gICAgICBkZWJvdW5jZWQuY2FuY2VsID0gY2FuY2VsO1xuICAgICAgcmV0dXJuIGRlYm91bmNlZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZWZlcnMgaW52b2tpbmcgdGhlIGBmdW5jYCB1bnRpbCB0aGUgY3VycmVudCBjYWxsIHN0YWNrIGhhcyBjbGVhcmVkLiBBbnlcbiAgICAgKiBhZGRpdGlvbmFsIGFyZ3VtZW50cyBhcmUgcHJvdmlkZWQgdG8gYGZ1bmNgIHdoZW4gaXQgaXMgaW52b2tlZC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBjYXRlZ29yeSBGdW5jdGlvblxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGRlZmVyLlxuICAgICAqIEBwYXJhbSB7Li4uKn0gW2FyZ3NdIFRoZSBhcmd1bWVudHMgdG8gaW52b2tlIHRoZSBmdW5jdGlvbiB3aXRoLlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIHRpbWVyIGlkLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmRlZmVyKGZ1bmN0aW9uKHRleHQpIHtcbiAgICAgKiAgIGNvbnNvbGUubG9nKHRleHQpO1xuICAgICAqIH0sICdkZWZlcnJlZCcpO1xuICAgICAqIC8vIGxvZ3MgJ2RlZmVycmVkJyBhZnRlciBvbmUgb3IgbW9yZSBtaWxsaXNlY29uZHNcbiAgICAgKi9cbiAgICB2YXIgZGVmZXIgPSByZXN0UGFyYW0oZnVuY3Rpb24oZnVuYywgYXJncykge1xuICAgICAgcmV0dXJuIGJhc2VEZWxheShmdW5jLCAxLCBhcmdzKTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIEludm9rZXMgYGZ1bmNgIGFmdGVyIGB3YWl0YCBtaWxsaXNlY29uZHMuIEFueSBhZGRpdGlvbmFsIGFyZ3VtZW50cyBhcmVcbiAgICAgKiBwcm92aWRlZCB0byBgZnVuY2Agd2hlbiBpdCBpcyBpbnZva2VkLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gZGVsYXkuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHdhaXQgVGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgdG8gZGVsYXkgaW52b2NhdGlvbi5cbiAgICAgKiBAcGFyYW0gey4uLip9IFthcmdzXSBUaGUgYXJndW1lbnRzIHRvIGludm9rZSB0aGUgZnVuY3Rpb24gd2l0aC5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSB0aW1lciBpZC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5kZWxheShmdW5jdGlvbih0ZXh0KSB7XG4gICAgICogICBjb25zb2xlLmxvZyh0ZXh0KTtcbiAgICAgKiB9LCAxMDAwLCAnbGF0ZXInKTtcbiAgICAgKiAvLyA9PiBsb2dzICdsYXRlcicgYWZ0ZXIgb25lIHNlY29uZFxuICAgICAqL1xuICAgIHZhciBkZWxheSA9IHJlc3RQYXJhbShmdW5jdGlvbihmdW5jLCB3YWl0LCBhcmdzKSB7XG4gICAgICByZXR1cm4gYmFzZURlbGF5KGZ1bmMsIHdhaXQsIGFyZ3MpO1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyB0aGUgcmVzdWx0IG9mIGludm9raW5nIHRoZSBwcm92aWRlZFxuICAgICAqIGZ1bmN0aW9ucyB3aXRoIHRoZSBgdGhpc2AgYmluZGluZyBvZiB0aGUgY3JlYXRlZCBmdW5jdGlvbiwgd2hlcmUgZWFjaFxuICAgICAqIHN1Y2Nlc3NpdmUgaW52b2NhdGlvbiBpcyBzdXBwbGllZCB0aGUgcmV0dXJuIHZhbHVlIG9mIHRoZSBwcmV2aW91cy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBjYXRlZ29yeSBGdW5jdGlvblxuICAgICAqIEBwYXJhbSB7Li4uRnVuY3Rpb259IFtmdW5jc10gRnVuY3Rpb25zIHRvIGludm9rZS5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBmdW5jdGlvbi5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gc3F1YXJlKG4pIHtcbiAgICAgKiAgIHJldHVybiBuICogbjtcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiB2YXIgYWRkU3F1YXJlID0gXy5mbG93KF8uYWRkLCBzcXVhcmUpO1xuICAgICAqIGFkZFNxdWFyZSgxLCAyKTtcbiAgICAgKiAvLyA9PiA5XG4gICAgICovXG4gICAgdmFyIGZsb3cgPSBjcmVhdGVGbG93KCk7XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLmZsb3dgIGV4Y2VwdCB0aGF0IGl0IGNyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0XG4gICAgICogaW52b2tlcyB0aGUgcHJvdmlkZWQgZnVuY3Rpb25zIGZyb20gcmlnaHQgdG8gbGVmdC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBhbGlhcyBiYWNrZmxvdywgY29tcG9zZVxuICAgICAqIEBjYXRlZ29yeSBGdW5jdGlvblxuICAgICAqIEBwYXJhbSB7Li4uRnVuY3Rpb259IFtmdW5jc10gRnVuY3Rpb25zIHRvIGludm9rZS5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBmdW5jdGlvbi5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gc3F1YXJlKG4pIHtcbiAgICAgKiAgIHJldHVybiBuICogbjtcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiB2YXIgYWRkU3F1YXJlID0gXy5mbG93UmlnaHQoc3F1YXJlLCBfLmFkZCk7XG4gICAgICogYWRkU3F1YXJlKDEsIDIpO1xuICAgICAqIC8vID0+IDlcbiAgICAgKi9cbiAgICB2YXIgZmxvd1JpZ2h0ID0gY3JlYXRlRmxvdyh0cnVlKTtcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IG1lbW9pemVzIHRoZSByZXN1bHQgb2YgYGZ1bmNgLiBJZiBgcmVzb2x2ZXJgIGlzXG4gICAgICogcHJvdmlkZWQgaXQgZGV0ZXJtaW5lcyB0aGUgY2FjaGUga2V5IGZvciBzdG9yaW5nIHRoZSByZXN1bHQgYmFzZWQgb24gdGhlXG4gICAgICogYXJndW1lbnRzIHByb3ZpZGVkIHRvIHRoZSBtZW1vaXplZCBmdW5jdGlvbi4gQnkgZGVmYXVsdCwgdGhlIGZpcnN0IGFyZ3VtZW50XG4gICAgICogcHJvdmlkZWQgdG8gdGhlIG1lbW9pemVkIGZ1bmN0aW9uIGlzIGNvZXJjZWQgdG8gYSBzdHJpbmcgYW5kIHVzZWQgYXMgdGhlXG4gICAgICogY2FjaGUga2V5LiBUaGUgYGZ1bmNgIGlzIGludm9rZWQgd2l0aCB0aGUgYHRoaXNgIGJpbmRpbmcgb2YgdGhlIG1lbW9pemVkXG4gICAgICogZnVuY3Rpb24uXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVGhlIGNhY2hlIGlzIGV4cG9zZWQgYXMgdGhlIGBjYWNoZWAgcHJvcGVydHkgb24gdGhlIG1lbW9pemVkXG4gICAgICogZnVuY3Rpb24uIEl0cyBjcmVhdGlvbiBtYXkgYmUgY3VzdG9taXplZCBieSByZXBsYWNpbmcgdGhlIGBfLm1lbW9pemUuQ2FjaGVgXG4gICAgICogY29uc3RydWN0b3Igd2l0aCBvbmUgd2hvc2UgaW5zdGFuY2VzIGltcGxlbWVudCB0aGUgW2BNYXBgXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi82LjAvI3NlYy1wcm9wZXJ0aWVzLW9mLXRoZS1tYXAtcHJvdG90eXBlLW9iamVjdClcbiAgICAgKiBtZXRob2QgaW50ZXJmYWNlIG9mIGBnZXRgLCBgaGFzYCwgYW5kIGBzZXRgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gaGF2ZSBpdHMgb3V0cHV0IG1lbW9pemVkLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtyZXNvbHZlcl0gVGhlIGZ1bmN0aW9uIHRvIHJlc29sdmUgdGhlIGNhY2hlIGtleS5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBtZW1vaXppbmcgZnVuY3Rpb24uXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciB1cHBlckNhc2UgPSBfLm1lbW9pemUoZnVuY3Rpb24oc3RyaW5nKSB7XG4gICAgICogICByZXR1cm4gc3RyaW5nLnRvVXBwZXJDYXNlKCk7XG4gICAgICogfSk7XG4gICAgICpcbiAgICAgKiB1cHBlckNhc2UoJ2ZyZWQnKTtcbiAgICAgKiAvLyA9PiAnRlJFRCdcbiAgICAgKlxuICAgICAqIC8vIG1vZGlmeWluZyB0aGUgcmVzdWx0IGNhY2hlXG4gICAgICogdXBwZXJDYXNlLmNhY2hlLnNldCgnZnJlZCcsICdCQVJORVknKTtcbiAgICAgKiB1cHBlckNhc2UoJ2ZyZWQnKTtcbiAgICAgKiAvLyA9PiAnQkFSTkVZJ1xuICAgICAqXG4gICAgICogLy8gcmVwbGFjaW5nIGBfLm1lbW9pemUuQ2FjaGVgXG4gICAgICogdmFyIG9iamVjdCA9IHsgJ3VzZXInOiAnZnJlZCcgfTtcbiAgICAgKiB2YXIgb3RoZXIgPSB7ICd1c2VyJzogJ2Jhcm5leScgfTtcbiAgICAgKiB2YXIgaWRlbnRpdHkgPSBfLm1lbW9pemUoXy5pZGVudGl0eSk7XG4gICAgICpcbiAgICAgKiBpZGVudGl0eShvYmplY3QpO1xuICAgICAqIC8vID0+IHsgJ3VzZXInOiAnZnJlZCcgfVxuICAgICAqIGlkZW50aXR5KG90aGVyKTtcbiAgICAgKiAvLyA9PiB7ICd1c2VyJzogJ2ZyZWQnIH1cbiAgICAgKlxuICAgICAqIF8ubWVtb2l6ZS5DYWNoZSA9IFdlYWtNYXA7XG4gICAgICogdmFyIGlkZW50aXR5ID0gXy5tZW1vaXplKF8uaWRlbnRpdHkpO1xuICAgICAqXG4gICAgICogaWRlbnRpdHkob2JqZWN0KTtcbiAgICAgKiAvLyA9PiB7ICd1c2VyJzogJ2ZyZWQnIH1cbiAgICAgKiBpZGVudGl0eShvdGhlcik7XG4gICAgICogLy8gPT4geyAndXNlcic6ICdiYXJuZXknIH1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBtZW1vaXplKGZ1bmMsIHJlc29sdmVyKSB7XG4gICAgICBpZiAodHlwZW9mIGZ1bmMgIT0gJ2Z1bmN0aW9uJyB8fCAocmVzb2x2ZXIgJiYgdHlwZW9mIHJlc29sdmVyICE9ICdmdW5jdGlvbicpKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoRlVOQ19FUlJPUl9URVhUKTtcbiAgICAgIH1cbiAgICAgIHZhciBtZW1vaXplZCA9IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgYXJncyA9IGFyZ3VtZW50cyxcbiAgICAgICAgICAgIGtleSA9IHJlc29sdmVyID8gcmVzb2x2ZXIuYXBwbHkodGhpcywgYXJncykgOiBhcmdzWzBdLFxuICAgICAgICAgICAgY2FjaGUgPSBtZW1vaXplZC5jYWNoZTtcblxuICAgICAgICBpZiAoY2FjaGUuaGFzKGtleSkpIHtcbiAgICAgICAgICByZXR1cm4gY2FjaGUuZ2V0KGtleSk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHJlc3VsdCA9IGZ1bmMuYXBwbHkodGhpcywgYXJncyk7XG4gICAgICAgIG1lbW9pemVkLmNhY2hlID0gY2FjaGUuc2V0KGtleSwgcmVzdWx0KTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH07XG4gICAgICBtZW1vaXplZC5jYWNoZSA9IG5ldyBtZW1vaXplLkNhY2hlO1xuICAgICAgcmV0dXJuIG1lbW9pemVkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IHJ1bnMgZWFjaCBhcmd1bWVudCB0aHJvdWdoIGEgY29ycmVzcG9uZGluZ1xuICAgICAqIHRyYW5zZm9ybSBmdW5jdGlvbi5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBjYXRlZ29yeSBGdW5jdGlvblxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIHdyYXAuXG4gICAgICogQHBhcmFtIHsuLi4oRnVuY3Rpb258RnVuY3Rpb25bXSl9IFt0cmFuc2Zvcm1zXSBUaGUgZnVuY3Rpb25zIHRvIHRyYW5zZm9ybVxuICAgICAqIGFyZ3VtZW50cywgc3BlY2lmaWVkIGFzIGluZGl2aWR1YWwgZnVuY3Rpb25zIG9yIGFycmF5cyBvZiBmdW5jdGlvbnMuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgZnVuY3Rpb24uXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIGRvdWJsZWQobikge1xuICAgICAqICAgcmV0dXJuIG4gKiAyO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIHNxdWFyZShuKSB7XG4gICAgICogICByZXR1cm4gbiAqIG47XG4gICAgICogfVxuICAgICAqXG4gICAgICogdmFyIG1vZGRlZCA9IF8ubW9kQXJncyhmdW5jdGlvbih4LCB5KSB7XG4gICAgICogICByZXR1cm4gW3gsIHldO1xuICAgICAqIH0sIHNxdWFyZSwgZG91YmxlZCk7XG4gICAgICpcbiAgICAgKiBtb2RkZWQoMSwgMik7XG4gICAgICogLy8gPT4gWzEsIDRdXG4gICAgICpcbiAgICAgKiBtb2RkZWQoNSwgMTApO1xuICAgICAqIC8vID0+IFsyNSwgMjBdXG4gICAgICovXG4gICAgdmFyIG1vZEFyZ3MgPSByZXN0UGFyYW0oZnVuY3Rpb24oZnVuYywgdHJhbnNmb3Jtcykge1xuICAgICAgdHJhbnNmb3JtcyA9IGJhc2VGbGF0dGVuKHRyYW5zZm9ybXMpO1xuICAgICAgaWYgKHR5cGVvZiBmdW5jICE9ICdmdW5jdGlvbicgfHwgIWFycmF5RXZlcnkodHJhbnNmb3JtcywgYmFzZUlzRnVuY3Rpb24pKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoRlVOQ19FUlJPUl9URVhUKTtcbiAgICAgIH1cbiAgICAgIHZhciBsZW5ndGggPSB0cmFuc2Zvcm1zLmxlbmd0aDtcbiAgICAgIHJldHVybiByZXN0UGFyYW0oZnVuY3Rpb24oYXJncykge1xuICAgICAgICB2YXIgaW5kZXggPSBuYXRpdmVNaW4oYXJncy5sZW5ndGgsIGxlbmd0aCk7XG4gICAgICAgIHdoaWxlIChpbmRleC0tKSB7XG4gICAgICAgICAgYXJnc1tpbmRleF0gPSB0cmFuc2Zvcm1zW2luZGV4XShhcmdzW2luZGV4XSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZ1bmMuYXBwbHkodGhpcywgYXJncyk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IG5lZ2F0ZXMgdGhlIHJlc3VsdCBvZiB0aGUgcHJlZGljYXRlIGBmdW5jYC4gVGhlXG4gICAgICogYGZ1bmNgIHByZWRpY2F0ZSBpcyBpbnZva2VkIHdpdGggdGhlIGB0aGlzYCBiaW5kaW5nIGFuZCBhcmd1bWVudHMgb2YgdGhlXG4gICAgICogY3JlYXRlZCBmdW5jdGlvbi5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBjYXRlZ29yeSBGdW5jdGlvblxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IHByZWRpY2F0ZSBUaGUgcHJlZGljYXRlIHRvIG5lZ2F0ZS5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBmdW5jdGlvbi5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gaXNFdmVuKG4pIHtcbiAgICAgKiAgIHJldHVybiBuICUgMiA9PSAwO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIF8uZmlsdGVyKFsxLCAyLCAzLCA0LCA1LCA2XSwgXy5uZWdhdGUoaXNFdmVuKSk7XG4gICAgICogLy8gPT4gWzEsIDMsIDVdXG4gICAgICovXG4gICAgZnVuY3Rpb24gbmVnYXRlKHByZWRpY2F0ZSkge1xuICAgICAgaWYgKHR5cGVvZiBwcmVkaWNhdGUgIT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKEZVTkNfRVJST1JfVEVYVCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiAhcHJlZGljYXRlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IGlzIHJlc3RyaWN0ZWQgdG8gaW52b2tpbmcgYGZ1bmNgIG9uY2UuIFJlcGVhdCBjYWxsc1xuICAgICAqIHRvIHRoZSBmdW5jdGlvbiByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSBmaXJzdCBjYWxsLiBUaGUgYGZ1bmNgIGlzIGludm9rZWRcbiAgICAgKiB3aXRoIHRoZSBgdGhpc2AgYmluZGluZyBhbmQgYXJndW1lbnRzIG9mIHRoZSBjcmVhdGVkIGZ1bmN0aW9uLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gcmVzdHJpY3QuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgcmVzdHJpY3RlZCBmdW5jdGlvbi5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIGluaXRpYWxpemUgPSBfLm9uY2UoY3JlYXRlQXBwbGljYXRpb24pO1xuICAgICAqIGluaXRpYWxpemUoKTtcbiAgICAgKiBpbml0aWFsaXplKCk7XG4gICAgICogLy8gYGluaXRpYWxpemVgIGludm9rZXMgYGNyZWF0ZUFwcGxpY2F0aW9uYCBvbmNlXG4gICAgICovXG4gICAgZnVuY3Rpb24gb25jZShmdW5jKSB7XG4gICAgICByZXR1cm4gYmVmb3JlKDIsIGZ1bmMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IGludm9rZXMgYGZ1bmNgIHdpdGggYHBhcnRpYWxgIGFyZ3VtZW50cyBwcmVwZW5kZWRcbiAgICAgKiB0byB0aG9zZSBwcm92aWRlZCB0byB0aGUgbmV3IGZ1bmN0aW9uLiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLmJpbmRgIGV4Y2VwdFxuICAgICAqIGl0IGRvZXMgKipub3QqKiBhbHRlciB0aGUgYHRoaXNgIGJpbmRpbmcuXG4gICAgICpcbiAgICAgKiBUaGUgYF8ucGFydGlhbC5wbGFjZWhvbGRlcmAgdmFsdWUsIHdoaWNoIGRlZmF1bHRzIHRvIGBfYCBpbiBtb25vbGl0aGljXG4gICAgICogYnVpbGRzLCBtYXkgYmUgdXNlZCBhcyBhIHBsYWNlaG9sZGVyIGZvciBwYXJ0aWFsbHkgYXBwbGllZCBhcmd1bWVudHMuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgZG9lcyBub3Qgc2V0IHRoZSBcImxlbmd0aFwiIHByb3BlcnR5IG9mIHBhcnRpYWxseVxuICAgICAqIGFwcGxpZWQgZnVuY3Rpb25zLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gcGFydGlhbGx5IGFwcGx5IGFyZ3VtZW50cyB0by5cbiAgICAgKiBAcGFyYW0gey4uLip9IFtwYXJ0aWFsc10gVGhlIGFyZ3VtZW50cyB0byBiZSBwYXJ0aWFsbHkgYXBwbGllZC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBwYXJ0aWFsbHkgYXBwbGllZCBmdW5jdGlvbi5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIGdyZWV0ID0gZnVuY3Rpb24oZ3JlZXRpbmcsIG5hbWUpIHtcbiAgICAgKiAgIHJldHVybiBncmVldGluZyArICcgJyArIG5hbWU7XG4gICAgICogfTtcbiAgICAgKlxuICAgICAqIHZhciBzYXlIZWxsb1RvID0gXy5wYXJ0aWFsKGdyZWV0LCAnaGVsbG8nKTtcbiAgICAgKiBzYXlIZWxsb1RvKCdmcmVkJyk7XG4gICAgICogLy8gPT4gJ2hlbGxvIGZyZWQnXG4gICAgICpcbiAgICAgKiAvLyB1c2luZyBwbGFjZWhvbGRlcnNcbiAgICAgKiB2YXIgZ3JlZXRGcmVkID0gXy5wYXJ0aWFsKGdyZWV0LCBfLCAnZnJlZCcpO1xuICAgICAqIGdyZWV0RnJlZCgnaGknKTtcbiAgICAgKiAvLyA9PiAnaGkgZnJlZCdcbiAgICAgKi9cbiAgICB2YXIgcGFydGlhbCA9IGNyZWF0ZVBhcnRpYWwoUEFSVElBTF9GTEFHKTtcblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8ucGFydGlhbGAgZXhjZXB0IHRoYXQgcGFydGlhbGx5IGFwcGxpZWQgYXJndW1lbnRzXG4gICAgICogYXJlIGFwcGVuZGVkIHRvIHRob3NlIHByb3ZpZGVkIHRvIHRoZSBuZXcgZnVuY3Rpb24uXG4gICAgICpcbiAgICAgKiBUaGUgYF8ucGFydGlhbFJpZ2h0LnBsYWNlaG9sZGVyYCB2YWx1ZSwgd2hpY2ggZGVmYXVsdHMgdG8gYF9gIGluIG1vbm9saXRoaWNcbiAgICAgKiBidWlsZHMsIG1heSBiZSB1c2VkIGFzIGEgcGxhY2Vob2xkZXIgZm9yIHBhcnRpYWxseSBhcHBsaWVkIGFyZ3VtZW50cy5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBkb2VzIG5vdCBzZXQgdGhlIFwibGVuZ3RoXCIgcHJvcGVydHkgb2YgcGFydGlhbGx5XG4gICAgICogYXBwbGllZCBmdW5jdGlvbnMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAY2F0ZWdvcnkgRnVuY3Rpb25cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBwYXJ0aWFsbHkgYXBwbHkgYXJndW1lbnRzIHRvLlxuICAgICAqIEBwYXJhbSB7Li4uKn0gW3BhcnRpYWxzXSBUaGUgYXJndW1lbnRzIHRvIGJlIHBhcnRpYWxseSBhcHBsaWVkLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IHBhcnRpYWxseSBhcHBsaWVkIGZ1bmN0aW9uLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgZ3JlZXQgPSBmdW5jdGlvbihncmVldGluZywgbmFtZSkge1xuICAgICAqICAgcmV0dXJuIGdyZWV0aW5nICsgJyAnICsgbmFtZTtcbiAgICAgKiB9O1xuICAgICAqXG4gICAgICogdmFyIGdyZWV0RnJlZCA9IF8ucGFydGlhbFJpZ2h0KGdyZWV0LCAnZnJlZCcpO1xuICAgICAqIGdyZWV0RnJlZCgnaGknKTtcbiAgICAgKiAvLyA9PiAnaGkgZnJlZCdcbiAgICAgKlxuICAgICAqIC8vIHVzaW5nIHBsYWNlaG9sZGVyc1xuICAgICAqIHZhciBzYXlIZWxsb1RvID0gXy5wYXJ0aWFsUmlnaHQoZ3JlZXQsICdoZWxsbycsIF8pO1xuICAgICAqIHNheUhlbGxvVG8oJ2ZyZWQnKTtcbiAgICAgKiAvLyA9PiAnaGVsbG8gZnJlZCdcbiAgICAgKi9cbiAgICB2YXIgcGFydGlhbFJpZ2h0ID0gY3JlYXRlUGFydGlhbChQQVJUSUFMX1JJR0hUX0ZMQUcpO1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgaW52b2tlcyBgZnVuY2Agd2l0aCBhcmd1bWVudHMgYXJyYW5nZWQgYWNjb3JkaW5nXG4gICAgICogdG8gdGhlIHNwZWNpZmllZCBpbmRleGVzIHdoZXJlIHRoZSBhcmd1bWVudCB2YWx1ZSBhdCB0aGUgZmlyc3QgaW5kZXggaXNcbiAgICAgKiBwcm92aWRlZCBhcyB0aGUgZmlyc3QgYXJndW1lbnQsIHRoZSBhcmd1bWVudCB2YWx1ZSBhdCB0aGUgc2Vjb25kIGluZGV4IGlzXG4gICAgICogcHJvdmlkZWQgYXMgdGhlIHNlY29uZCBhcmd1bWVudCwgYW5kIHNvIG9uLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gcmVhcnJhbmdlIGFyZ3VtZW50cyBmb3IuXG4gICAgICogQHBhcmFtIHsuLi4obnVtYmVyfG51bWJlcltdKX0gaW5kZXhlcyBUaGUgYXJyYW5nZWQgYXJndW1lbnQgaW5kZXhlcyxcbiAgICAgKiAgc3BlY2lmaWVkIGFzIGluZGl2aWR1YWwgaW5kZXhlcyBvciBhcnJheXMgb2YgaW5kZXhlcy5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBmdW5jdGlvbi5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIHJlYXJnZWQgPSBfLnJlYXJnKGZ1bmN0aW9uKGEsIGIsIGMpIHtcbiAgICAgKiAgIHJldHVybiBbYSwgYiwgY107XG4gICAgICogfSwgMiwgMCwgMSk7XG4gICAgICpcbiAgICAgKiByZWFyZ2VkKCdiJywgJ2MnLCAnYScpXG4gICAgICogLy8gPT4gWydhJywgJ2InLCAnYyddXG4gICAgICpcbiAgICAgKiB2YXIgbWFwID0gXy5yZWFyZyhfLm1hcCwgWzEsIDBdKTtcbiAgICAgKiBtYXAoZnVuY3Rpb24obikge1xuICAgICAqICAgcmV0dXJuIG4gKiAzO1xuICAgICAqIH0sIFsxLCAyLCAzXSk7XG4gICAgICogLy8gPT4gWzMsIDYsIDldXG4gICAgICovXG4gICAgdmFyIHJlYXJnID0gcmVzdFBhcmFtKGZ1bmN0aW9uKGZ1bmMsIGluZGV4ZXMpIHtcbiAgICAgIHJldHVybiBjcmVhdGVXcmFwcGVyKGZ1bmMsIFJFQVJHX0ZMQUcsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIGJhc2VGbGF0dGVuKGluZGV4ZXMpKTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IGludm9rZXMgYGZ1bmNgIHdpdGggdGhlIGB0aGlzYCBiaW5kaW5nIG9mIHRoZVxuICAgICAqIGNyZWF0ZWQgZnVuY3Rpb24gYW5kIGFyZ3VtZW50cyBmcm9tIGBzdGFydGAgYW5kIGJleW9uZCBwcm92aWRlZCBhcyBhbiBhcnJheS5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBpcyBiYXNlZCBvbiB0aGUgW3Jlc3QgcGFyYW1ldGVyXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9GdW5jdGlvbnMvcmVzdF9wYXJhbWV0ZXJzKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBjYXRlZ29yeSBGdW5jdGlvblxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGFwcGx5IGEgcmVzdCBwYXJhbWV0ZXIgdG8uXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtzdGFydD1mdW5jLmxlbmd0aC0xXSBUaGUgc3RhcnQgcG9zaXRpb24gb2YgdGhlIHJlc3QgcGFyYW1ldGVyLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGZ1bmN0aW9uLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgc2F5ID0gXy5yZXN0UGFyYW0oZnVuY3Rpb24od2hhdCwgbmFtZXMpIHtcbiAgICAgKiAgIHJldHVybiB3aGF0ICsgJyAnICsgXy5pbml0aWFsKG5hbWVzKS5qb2luKCcsICcpICtcbiAgICAgKiAgICAgKF8uc2l6ZShuYW1lcykgPiAxID8gJywgJiAnIDogJycpICsgXy5sYXN0KG5hbWVzKTtcbiAgICAgKiB9KTtcbiAgICAgKlxuICAgICAqIHNheSgnaGVsbG8nLCAnZnJlZCcsICdiYXJuZXknLCAncGViYmxlcycpO1xuICAgICAqIC8vID0+ICdoZWxsbyBmcmVkLCBiYXJuZXksICYgcGViYmxlcydcbiAgICAgKi9cbiAgICBmdW5jdGlvbiByZXN0UGFyYW0oZnVuYywgc3RhcnQpIHtcbiAgICAgIGlmICh0eXBlb2YgZnVuYyAhPSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoRlVOQ19FUlJPUl9URVhUKTtcbiAgICAgIH1cbiAgICAgIHN0YXJ0ID0gbmF0aXZlTWF4KHN0YXJ0ID09PSB1bmRlZmluZWQgPyAoZnVuYy5sZW5ndGggLSAxKSA6ICgrc3RhcnQgfHwgMCksIDApO1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgYXJncyA9IGFyZ3VtZW50cyxcbiAgICAgICAgICAgIGluZGV4ID0gLTEsXG4gICAgICAgICAgICBsZW5ndGggPSBuYXRpdmVNYXgoYXJncy5sZW5ndGggLSBzdGFydCwgMCksXG4gICAgICAgICAgICByZXN0ID0gQXJyYXkobGVuZ3RoKTtcblxuICAgICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICAgIHJlc3RbaW5kZXhdID0gYXJnc1tzdGFydCArIGluZGV4XTtcbiAgICAgICAgfVxuICAgICAgICBzd2l0Y2ggKHN0YXJ0KSB7XG4gICAgICAgICAgY2FzZSAwOiByZXR1cm4gZnVuYy5jYWxsKHRoaXMsIHJlc3QpO1xuICAgICAgICAgIGNhc2UgMTogcmV0dXJuIGZ1bmMuY2FsbCh0aGlzLCBhcmdzWzBdLCByZXN0KTtcbiAgICAgICAgICBjYXNlIDI6IHJldHVybiBmdW5jLmNhbGwodGhpcywgYXJnc1swXSwgYXJnc1sxXSwgcmVzdCk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIG90aGVyQXJncyA9IEFycmF5KHN0YXJ0ICsgMSk7XG4gICAgICAgIGluZGV4ID0gLTE7XG4gICAgICAgIHdoaWxlICgrK2luZGV4IDwgc3RhcnQpIHtcbiAgICAgICAgICBvdGhlckFyZ3NbaW5kZXhdID0gYXJnc1tpbmRleF07XG4gICAgICAgIH1cbiAgICAgICAgb3RoZXJBcmdzW3N0YXJ0XSA9IHJlc3Q7XG4gICAgICAgIHJldHVybiBmdW5jLmFwcGx5KHRoaXMsIG90aGVyQXJncyk7XG4gICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IGludm9rZXMgYGZ1bmNgIHdpdGggdGhlIGB0aGlzYCBiaW5kaW5nIG9mIHRoZSBjcmVhdGVkXG4gICAgICogZnVuY3Rpb24gYW5kIGFuIGFycmF5IG9mIGFyZ3VtZW50cyBtdWNoIGxpa2UgW2BGdW5jdGlvbiNhcHBseWBdKGh0dHBzOi8vZXM1LmdpdGh1Yi5pby8jeDE1LjMuNC4zKS5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBpcyBiYXNlZCBvbiB0aGUgW3NwcmVhZCBvcGVyYXRvcl0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvT3BlcmF0b3JzL1NwcmVhZF9vcGVyYXRvcikuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAY2F0ZWdvcnkgRnVuY3Rpb25cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBzcHJlYWQgYXJndW1lbnRzIG92ZXIuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgZnVuY3Rpb24uXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBzYXkgPSBfLnNwcmVhZChmdW5jdGlvbih3aG8sIHdoYXQpIHtcbiAgICAgKiAgIHJldHVybiB3aG8gKyAnIHNheXMgJyArIHdoYXQ7XG4gICAgICogfSk7XG4gICAgICpcbiAgICAgKiBzYXkoWydmcmVkJywgJ2hlbGxvJ10pO1xuICAgICAqIC8vID0+ICdmcmVkIHNheXMgaGVsbG8nXG4gICAgICpcbiAgICAgKiAvLyB3aXRoIGEgUHJvbWlzZVxuICAgICAqIHZhciBudW1iZXJzID0gUHJvbWlzZS5hbGwoW1xuICAgICAqICAgUHJvbWlzZS5yZXNvbHZlKDQwKSxcbiAgICAgKiAgIFByb21pc2UucmVzb2x2ZSgzNilcbiAgICAgKiBdKTtcbiAgICAgKlxuICAgICAqIG51bWJlcnMudGhlbihfLnNwcmVhZChmdW5jdGlvbih4LCB5KSB7XG4gICAgICogICByZXR1cm4geCArIHk7XG4gICAgICogfSkpO1xuICAgICAqIC8vID0+IGEgUHJvbWlzZSBvZiA3NlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHNwcmVhZChmdW5jKSB7XG4gICAgICBpZiAodHlwZW9mIGZ1bmMgIT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKEZVTkNfRVJST1JfVEVYVCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gZnVuY3Rpb24oYXJyYXkpIHtcbiAgICAgICAgcmV0dXJuIGZ1bmMuYXBwbHkodGhpcywgYXJyYXkpO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgdGhyb3R0bGVkIGZ1bmN0aW9uIHRoYXQgb25seSBpbnZva2VzIGBmdW5jYCBhdCBtb3N0IG9uY2UgcGVyXG4gICAgICogZXZlcnkgYHdhaXRgIG1pbGxpc2Vjb25kcy4gVGhlIHRocm90dGxlZCBmdW5jdGlvbiBjb21lcyB3aXRoIGEgYGNhbmNlbGBcbiAgICAgKiBtZXRob2QgdG8gY2FuY2VsIGRlbGF5ZWQgaW52b2NhdGlvbnMuIFByb3ZpZGUgYW4gb3B0aW9ucyBvYmplY3QgdG8gaW5kaWNhdGVcbiAgICAgKiB0aGF0IGBmdW5jYCBzaG91bGQgYmUgaW52b2tlZCBvbiB0aGUgbGVhZGluZyBhbmQvb3IgdHJhaWxpbmcgZWRnZSBvZiB0aGVcbiAgICAgKiBgd2FpdGAgdGltZW91dC4gU3Vic2VxdWVudCBjYWxscyB0byB0aGUgdGhyb3R0bGVkIGZ1bmN0aW9uIHJldHVybiB0aGVcbiAgICAgKiByZXN1bHQgb2YgdGhlIGxhc3QgYGZ1bmNgIGNhbGwuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogSWYgYGxlYWRpbmdgIGFuZCBgdHJhaWxpbmdgIG9wdGlvbnMgYXJlIGB0cnVlYCwgYGZ1bmNgIGlzIGludm9rZWRcbiAgICAgKiBvbiB0aGUgdHJhaWxpbmcgZWRnZSBvZiB0aGUgdGltZW91dCBvbmx5IGlmIHRoZSB0aGUgdGhyb3R0bGVkIGZ1bmN0aW9uIGlzXG4gICAgICogaW52b2tlZCBtb3JlIHRoYW4gb25jZSBkdXJpbmcgdGhlIGB3YWl0YCB0aW1lb3V0LlxuICAgICAqXG4gICAgICogU2VlIFtEYXZpZCBDb3JiYWNobydzIGFydGljbGVdKGh0dHA6Ly9kcnVwYWxtb3Rpb24uY29tL2FydGljbGUvZGVib3VuY2UtYW5kLXRocm90dGxlLXZpc3VhbC1leHBsYW5hdGlvbilcbiAgICAgKiBmb3IgZGV0YWlscyBvdmVyIHRoZSBkaWZmZXJlbmNlcyBiZXR3ZWVuIGBfLnRocm90dGxlYCBhbmQgYF8uZGVib3VuY2VgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gdGhyb3R0bGUuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFt3YWl0PTBdIFRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHRvIHRocm90dGxlIGludm9jYXRpb25zIHRvLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc10gVGhlIG9wdGlvbnMgb2JqZWN0LlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMubGVhZGluZz10cnVlXSBTcGVjaWZ5IGludm9raW5nIG9uIHRoZSBsZWFkaW5nXG4gICAgICogIGVkZ2Ugb2YgdGhlIHRpbWVvdXQuXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy50cmFpbGluZz10cnVlXSBTcGVjaWZ5IGludm9raW5nIG9uIHRoZSB0cmFpbGluZ1xuICAgICAqICBlZGdlIG9mIHRoZSB0aW1lb3V0LlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IHRocm90dGxlZCBmdW5jdGlvbi5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogLy8gYXZvaWQgZXhjZXNzaXZlbHkgdXBkYXRpbmcgdGhlIHBvc2l0aW9uIHdoaWxlIHNjcm9sbGluZ1xuICAgICAqIGpRdWVyeSh3aW5kb3cpLm9uKCdzY3JvbGwnLCBfLnRocm90dGxlKHVwZGF0ZVBvc2l0aW9uLCAxMDApKTtcbiAgICAgKlxuICAgICAqIC8vIGludm9rZSBgcmVuZXdUb2tlbmAgd2hlbiB0aGUgY2xpY2sgZXZlbnQgaXMgZmlyZWQsIGJ1dCBub3QgbW9yZSB0aGFuIG9uY2UgZXZlcnkgNSBtaW51dGVzXG4gICAgICogalF1ZXJ5KCcuaW50ZXJhY3RpdmUnKS5vbignY2xpY2snLCBfLnRocm90dGxlKHJlbmV3VG9rZW4sIDMwMDAwMCwge1xuICAgICAqICAgJ3RyYWlsaW5nJzogZmFsc2VcbiAgICAgKiB9KSk7XG4gICAgICpcbiAgICAgKiAvLyBjYW5jZWwgYSB0cmFpbGluZyB0aHJvdHRsZWQgY2FsbFxuICAgICAqIGpRdWVyeSh3aW5kb3cpLm9uKCdwb3BzdGF0ZScsIHRocm90dGxlZC5jYW5jZWwpO1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIHRocm90dGxlKGZ1bmMsIHdhaXQsIG9wdGlvbnMpIHtcbiAgICAgIHZhciBsZWFkaW5nID0gdHJ1ZSxcbiAgICAgICAgICB0cmFpbGluZyA9IHRydWU7XG5cbiAgICAgIGlmICh0eXBlb2YgZnVuYyAhPSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoRlVOQ19FUlJPUl9URVhUKTtcbiAgICAgIH1cbiAgICAgIGlmIChvcHRpb25zID09PSBmYWxzZSkge1xuICAgICAgICBsZWFkaW5nID0gZmFsc2U7XG4gICAgICB9IGVsc2UgaWYgKGlzT2JqZWN0KG9wdGlvbnMpKSB7XG4gICAgICAgIGxlYWRpbmcgPSAnbGVhZGluZycgaW4gb3B0aW9ucyA/ICEhb3B0aW9ucy5sZWFkaW5nIDogbGVhZGluZztcbiAgICAgICAgdHJhaWxpbmcgPSAndHJhaWxpbmcnIGluIG9wdGlvbnMgPyAhIW9wdGlvbnMudHJhaWxpbmcgOiB0cmFpbGluZztcbiAgICAgIH1cbiAgICAgIHJldHVybiBkZWJvdW5jZShmdW5jLCB3YWl0LCB7ICdsZWFkaW5nJzogbGVhZGluZywgJ21heFdhaXQnOiArd2FpdCwgJ3RyYWlsaW5nJzogdHJhaWxpbmcgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgcHJvdmlkZXMgYHZhbHVlYCB0byB0aGUgd3JhcHBlciBmdW5jdGlvbiBhcyBpdHNcbiAgICAgKiBmaXJzdCBhcmd1bWVudC4gQW55IGFkZGl0aW9uYWwgYXJndW1lbnRzIHByb3ZpZGVkIHRvIHRoZSBmdW5jdGlvbiBhcmVcbiAgICAgKiBhcHBlbmRlZCB0byB0aG9zZSBwcm92aWRlZCB0byB0aGUgd3JhcHBlciBmdW5jdGlvbi4gVGhlIHdyYXBwZXIgaXMgaW52b2tlZFxuICAgICAqIHdpdGggdGhlIGB0aGlzYCBiaW5kaW5nIG9mIHRoZSBjcmVhdGVkIGZ1bmN0aW9uLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gd3JhcC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSB3cmFwcGVyIFRoZSB3cmFwcGVyIGZ1bmN0aW9uLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGZ1bmN0aW9uLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgcCA9IF8ud3JhcChfLmVzY2FwZSwgZnVuY3Rpb24oZnVuYywgdGV4dCkge1xuICAgICAqICAgcmV0dXJuICc8cD4nICsgZnVuYyh0ZXh0KSArICc8L3A+JztcbiAgICAgKiB9KTtcbiAgICAgKlxuICAgICAqIHAoJ2ZyZWQsIGJhcm5leSwgJiBwZWJibGVzJyk7XG4gICAgICogLy8gPT4gJzxwPmZyZWQsIGJhcm5leSwgJmFtcDsgcGViYmxlczwvcD4nXG4gICAgICovXG4gICAgZnVuY3Rpb24gd3JhcCh2YWx1ZSwgd3JhcHBlcikge1xuICAgICAgd3JhcHBlciA9IHdyYXBwZXIgPT0gbnVsbCA/IGlkZW50aXR5IDogd3JhcHBlcjtcbiAgICAgIHJldHVybiBjcmVhdGVXcmFwcGVyKHdyYXBwZXIsIFBBUlRJQUxfRkxBRywgdW5kZWZpbmVkLCBbdmFsdWVdLCBbXSk7XG4gICAgfVxuXG4gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGNsb25lIG9mIGB2YWx1ZWAuIElmIGBpc0RlZXBgIGlzIGB0cnVlYCBuZXN0ZWQgb2JqZWN0cyBhcmUgY2xvbmVkLFxuICAgICAqIG90aGVyd2lzZSB0aGV5IGFyZSBhc3NpZ25lZCBieSByZWZlcmVuY2UuIElmIGBjdXN0b21pemVyYCBpcyBwcm92aWRlZCBpdCBpc1xuICAgICAqIGludm9rZWQgdG8gcHJvZHVjZSB0aGUgY2xvbmVkIHZhbHVlcy4gSWYgYGN1c3RvbWl6ZXJgIHJldHVybnMgYHVuZGVmaW5lZGBcbiAgICAgKiBjbG9uaW5nIGlzIGhhbmRsZWQgYnkgdGhlIG1ldGhvZCBpbnN0ZWFkLiBUaGUgYGN1c3RvbWl6ZXJgIGlzIGJvdW5kIHRvXG4gICAgICogYHRoaXNBcmdgIGFuZCBpbnZva2VkIHdpdGggdHdvIGFyZ3VtZW50OyAodmFsdWUgWywgaW5kZXh8a2V5LCBvYmplY3RdKS5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBpcyBsb29zZWx5IGJhc2VkIG9uIHRoZVxuICAgICAqIFtzdHJ1Y3R1cmVkIGNsb25lIGFsZ29yaXRobV0oaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDUvaW5mcmFzdHJ1Y3R1cmUuaHRtbCNpbnRlcm5hbC1zdHJ1Y3R1cmVkLWNsb25pbmctYWxnb3JpdGhtKS5cbiAgICAgKiBUaGUgZW51bWVyYWJsZSBwcm9wZXJ0aWVzIG9mIGBhcmd1bWVudHNgIG9iamVjdHMgYW5kIG9iamVjdHMgY3JlYXRlZCBieVxuICAgICAqIGNvbnN0cnVjdG9ycyBvdGhlciB0aGFuIGBPYmplY3RgIGFyZSBjbG9uZWQgdG8gcGxhaW4gYE9iamVjdGAgb2JqZWN0cy4gQW5cbiAgICAgKiBlbXB0eSBvYmplY3QgaXMgcmV0dXJuZWQgZm9yIHVuY2xvbmVhYmxlIHZhbHVlcyBzdWNoIGFzIGZ1bmN0aW9ucywgRE9NIG5vZGVzLFxuICAgICAqIE1hcHMsIFNldHMsIGFuZCBXZWFrTWFwcy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2xvbmUuXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbaXNEZWVwXSBTcGVjaWZ5IGEgZGVlcCBjbG9uZS5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY3VzdG9taXplcl0gVGhlIGZ1bmN0aW9uIHRvIGN1c3RvbWl6ZSBjbG9uaW5nIHZhbHVlcy5cbiAgICAgKiBAcGFyYW0geyp9IFt0aGlzQXJnXSBUaGUgYHRoaXNgIGJpbmRpbmcgb2YgYGN1c3RvbWl6ZXJgLlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBjbG9uZWQgdmFsdWUuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciB1c2VycyA9IFtcbiAgICAgKiAgIHsgJ3VzZXInOiAnYmFybmV5JyB9LFxuICAgICAqICAgeyAndXNlcic6ICdmcmVkJyB9XG4gICAgICogXTtcbiAgICAgKlxuICAgICAqIHZhciBzaGFsbG93ID0gXy5jbG9uZSh1c2Vycyk7XG4gICAgICogc2hhbGxvd1swXSA9PT0gdXNlcnNbMF07XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogdmFyIGRlZXAgPSBfLmNsb25lKHVzZXJzLCB0cnVlKTtcbiAgICAgKiBkZWVwWzBdID09PSB1c2Vyc1swXTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqXG4gICAgICogLy8gdXNpbmcgYSBjdXN0b21pemVyIGNhbGxiYWNrXG4gICAgICogdmFyIGVsID0gXy5jbG9uZShkb2N1bWVudC5ib2R5LCBmdW5jdGlvbih2YWx1ZSkge1xuICAgICAqICAgaWYgKF8uaXNFbGVtZW50KHZhbHVlKSkge1xuICAgICAqICAgICByZXR1cm4gdmFsdWUuY2xvbmVOb2RlKGZhbHNlKTtcbiAgICAgKiAgIH1cbiAgICAgKiB9KTtcbiAgICAgKlxuICAgICAqIGVsID09PSBkb2N1bWVudC5ib2R5XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKiBlbC5ub2RlTmFtZVxuICAgICAqIC8vID0+IEJPRFlcbiAgICAgKiBlbC5jaGlsZE5vZGVzLmxlbmd0aDtcbiAgICAgKiAvLyA9PiAwXG4gICAgICovXG4gICAgZnVuY3Rpb24gY2xvbmUodmFsdWUsIGlzRGVlcCwgY3VzdG9taXplciwgdGhpc0FyZykge1xuICAgICAgaWYgKGlzRGVlcCAmJiB0eXBlb2YgaXNEZWVwICE9ICdib29sZWFuJyAmJiBpc0l0ZXJhdGVlQ2FsbCh2YWx1ZSwgaXNEZWVwLCBjdXN0b21pemVyKSkge1xuICAgICAgICBpc0RlZXAgPSBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGVsc2UgaWYgKHR5cGVvZiBpc0RlZXAgPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB0aGlzQXJnID0gY3VzdG9taXplcjtcbiAgICAgICAgY3VzdG9taXplciA9IGlzRGVlcDtcbiAgICAgICAgaXNEZWVwID0gZmFsc2U7XG4gICAgICB9XG4gICAgICByZXR1cm4gdHlwZW9mIGN1c3RvbWl6ZXIgPT0gJ2Z1bmN0aW9uJ1xuICAgICAgICA/IGJhc2VDbG9uZSh2YWx1ZSwgaXNEZWVwLCBiaW5kQ2FsbGJhY2soY3VzdG9taXplciwgdGhpc0FyZywgMSkpXG4gICAgICAgIDogYmFzZUNsb25lKHZhbHVlLCBpc0RlZXApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBkZWVwIGNsb25lIG9mIGB2YWx1ZWAuIElmIGBjdXN0b21pemVyYCBpcyBwcm92aWRlZCBpdCBpcyBpbnZva2VkXG4gICAgICogdG8gcHJvZHVjZSB0aGUgY2xvbmVkIHZhbHVlcy4gSWYgYGN1c3RvbWl6ZXJgIHJldHVybnMgYHVuZGVmaW5lZGAgY2xvbmluZ1xuICAgICAqIGlzIGhhbmRsZWQgYnkgdGhlIG1ldGhvZCBpbnN0ZWFkLiBUaGUgYGN1c3RvbWl6ZXJgIGlzIGJvdW5kIHRvIGB0aGlzQXJnYFxuICAgICAqIGFuZCBpbnZva2VkIHdpdGggdHdvIGFyZ3VtZW50OyAodmFsdWUgWywgaW5kZXh8a2V5LCBvYmplY3RdKS5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBpcyBsb29zZWx5IGJhc2VkIG9uIHRoZVxuICAgICAqIFtzdHJ1Y3R1cmVkIGNsb25lIGFsZ29yaXRobV0oaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDUvaW5mcmFzdHJ1Y3R1cmUuaHRtbCNpbnRlcm5hbC1zdHJ1Y3R1cmVkLWNsb25pbmctYWxnb3JpdGhtKS5cbiAgICAgKiBUaGUgZW51bWVyYWJsZSBwcm9wZXJ0aWVzIG9mIGBhcmd1bWVudHNgIG9iamVjdHMgYW5kIG9iamVjdHMgY3JlYXRlZCBieVxuICAgICAqIGNvbnN0cnVjdG9ycyBvdGhlciB0aGFuIGBPYmplY3RgIGFyZSBjbG9uZWQgdG8gcGxhaW4gYE9iamVjdGAgb2JqZWN0cy4gQW5cbiAgICAgKiBlbXB0eSBvYmplY3QgaXMgcmV0dXJuZWQgZm9yIHVuY2xvbmVhYmxlIHZhbHVlcyBzdWNoIGFzIGZ1bmN0aW9ucywgRE9NIG5vZGVzLFxuICAgICAqIE1hcHMsIFNldHMsIGFuZCBXZWFrTWFwcy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gZGVlcCBjbG9uZS5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY3VzdG9taXplcl0gVGhlIGZ1bmN0aW9uIHRvIGN1c3RvbWl6ZSBjbG9uaW5nIHZhbHVlcy5cbiAgICAgKiBAcGFyYW0geyp9IFt0aGlzQXJnXSBUaGUgYHRoaXNgIGJpbmRpbmcgb2YgYGN1c3RvbWl6ZXJgLlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBkZWVwIGNsb25lZCB2YWx1ZS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIHVzZXJzID0gW1xuICAgICAqICAgeyAndXNlcic6ICdiYXJuZXknIH0sXG4gICAgICogICB7ICd1c2VyJzogJ2ZyZWQnIH1cbiAgICAgKiBdO1xuICAgICAqXG4gICAgICogdmFyIGRlZXAgPSBfLmNsb25lRGVlcCh1c2Vycyk7XG4gICAgICogZGVlcFswXSA9PT0gdXNlcnNbMF07XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKlxuICAgICAqIC8vIHVzaW5nIGEgY3VzdG9taXplciBjYWxsYmFja1xuICAgICAqIHZhciBlbCA9IF8uY2xvbmVEZWVwKGRvY3VtZW50LmJvZHksIGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICogICBpZiAoXy5pc0VsZW1lbnQodmFsdWUpKSB7XG4gICAgICogICAgIHJldHVybiB2YWx1ZS5jbG9uZU5vZGUodHJ1ZSk7XG4gICAgICogICB9XG4gICAgICogfSk7XG4gICAgICpcbiAgICAgKiBlbCA9PT0gZG9jdW1lbnQuYm9keVxuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICogZWwubm9kZU5hbWVcbiAgICAgKiAvLyA9PiBCT0RZXG4gICAgICogZWwuY2hpbGROb2Rlcy5sZW5ndGg7XG4gICAgICogLy8gPT4gMjBcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjbG9uZURlZXAodmFsdWUsIGN1c3RvbWl6ZXIsIHRoaXNBcmcpIHtcbiAgICAgIHJldHVybiB0eXBlb2YgY3VzdG9taXplciA9PSAnZnVuY3Rpb24nXG4gICAgICAgID8gYmFzZUNsb25lKHZhbHVlLCB0cnVlLCBiaW5kQ2FsbGJhY2soY3VzdG9taXplciwgdGhpc0FyZywgMSkpXG4gICAgICAgIDogYmFzZUNsb25lKHZhbHVlLCB0cnVlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBncmVhdGVyIHRoYW4gYG90aGVyYC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY29tcGFyZS5cbiAgICAgKiBAcGFyYW0geyp9IG90aGVyIFRoZSBvdGhlciB2YWx1ZSB0byBjb21wYXJlLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGdyZWF0ZXIgdGhhbiBgb3RoZXJgLCBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uZ3QoMywgMSk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5ndCgzLCAzKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqXG4gICAgICogXy5ndCgxLCAzKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGd0KHZhbHVlLCBvdGhlcikge1xuICAgICAgcmV0dXJuIHZhbHVlID4gb3RoZXI7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIGBvdGhlcmAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbXBhcmUuXG4gICAgICogQHBhcmFtIHsqfSBvdGhlciBUaGUgb3RoZXIgdmFsdWUgdG8gY29tcGFyZS5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gYG90aGVyYCwgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmd0ZSgzLCAxKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmd0ZSgzLCAzKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmd0ZSgxLCAzKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGd0ZSh2YWx1ZSwgb3RoZXIpIHtcbiAgICAgIHJldHVybiB2YWx1ZSA+PSBvdGhlcjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBjbGFzc2lmaWVkIGFzIGFuIGBhcmd1bWVudHNgIG9iamVjdC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgY29ycmVjdGx5IGNsYXNzaWZpZWQsIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5pc0FyZ3VtZW50cyhmdW5jdGlvbigpIHsgcmV0dXJuIGFyZ3VtZW50czsgfSgpKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzQXJndW1lbnRzKFsxLCAyLCAzXSk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpc0FyZ3VtZW50cyh2YWx1ZSkge1xuICAgICAgcmV0dXJuIGlzT2JqZWN0TGlrZSh2YWx1ZSkgJiYgaXNBcnJheUxpa2UodmFsdWUpICYmXG4gICAgICAgIGhhc093blByb3BlcnR5LmNhbGwodmFsdWUsICdjYWxsZWUnKSAmJiAhcHJvcGVydHlJc0VudW1lcmFibGUuY2FsbCh2YWx1ZSwgJ2NhbGxlZScpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGNsYXNzaWZpZWQgYXMgYW4gYEFycmF5YCBvYmplY3QuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGNvcnJlY3RseSBjbGFzc2lmaWVkLCBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uaXNBcnJheShbMSwgMiwgM10pO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNBcnJheShmdW5jdGlvbigpIHsgcmV0dXJuIGFyZ3VtZW50czsgfSgpKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqL1xuICAgIHZhciBpc0FycmF5ID0gbmF0aXZlSXNBcnJheSB8fCBmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgcmV0dXJuIGlzT2JqZWN0TGlrZSh2YWx1ZSkgJiYgaXNMZW5ndGgodmFsdWUubGVuZ3RoKSAmJiBvYmpUb1N0cmluZy5jYWxsKHZhbHVlKSA9PSBhcnJheVRhZztcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgY2xhc3NpZmllZCBhcyBhIGJvb2xlYW4gcHJpbWl0aXZlIG9yIG9iamVjdC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgY29ycmVjdGx5IGNsYXNzaWZpZWQsIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5pc0Jvb2xlYW4oZmFsc2UpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNCb29sZWFuKG51bGwpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNCb29sZWFuKHZhbHVlKSB7XG4gICAgICByZXR1cm4gdmFsdWUgPT09IHRydWUgfHwgdmFsdWUgPT09IGZhbHNlIHx8IChpc09iamVjdExpa2UodmFsdWUpICYmIG9ialRvU3RyaW5nLmNhbGwodmFsdWUpID09IGJvb2xUYWcpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGNsYXNzaWZpZWQgYXMgYSBgRGF0ZWAgb2JqZWN0LlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBjb3JyZWN0bHkgY2xhc3NpZmllZCwgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmlzRGF0ZShuZXcgRGF0ZSk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pc0RhdGUoJ01vbiBBcHJpbCAyMyAyMDEyJyk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpc0RhdGUodmFsdWUpIHtcbiAgICAgIHJldHVybiBpc09iamVjdExpa2UodmFsdWUpICYmIG9ialRvU3RyaW5nLmNhbGwodmFsdWUpID09IGRhdGVUYWc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgYSBET00gZWxlbWVudC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBET00gZWxlbWVudCwgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmlzRWxlbWVudChkb2N1bWVudC5ib2R5KTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzRWxlbWVudCgnPGJvZHk+Jyk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpc0VsZW1lbnQodmFsdWUpIHtcbiAgICAgIHJldHVybiAhIXZhbHVlICYmIHZhbHVlLm5vZGVUeXBlID09PSAxICYmIGlzT2JqZWN0TGlrZSh2YWx1ZSkgJiYgIWlzUGxhaW5PYmplY3QodmFsdWUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGVtcHR5LiBBIHZhbHVlIGlzIGNvbnNpZGVyZWQgZW1wdHkgdW5sZXNzIGl0IGlzIGFuXG4gICAgICogYGFyZ3VtZW50c2Agb2JqZWN0LCBhcnJheSwgc3RyaW5nLCBvciBqUXVlcnktbGlrZSBjb2xsZWN0aW9uIHdpdGggYSBsZW5ndGhcbiAgICAgKiBncmVhdGVyIHRoYW4gYDBgIG9yIGFuIG9iamVjdCB3aXRoIG93biBlbnVtZXJhYmxlIHByb3BlcnRpZXMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fHN0cmluZ30gdmFsdWUgVGhlIHZhbHVlIHRvIGluc3BlY3QuXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgZW1wdHksIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5pc0VtcHR5KG51bGwpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNFbXB0eSh0cnVlKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzRW1wdHkoMSk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pc0VtcHR5KFsxLCAyLCAzXSk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKlxuICAgICAqIF8uaXNFbXB0eSh7ICdhJzogMSB9KTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzRW1wdHkodmFsdWUpIHtcbiAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgICAgaWYgKGlzQXJyYXlMaWtlKHZhbHVlKSAmJiAoaXNBcnJheSh2YWx1ZSkgfHwgaXNTdHJpbmcodmFsdWUpIHx8IGlzQXJndW1lbnRzKHZhbHVlKSB8fFxuICAgICAgICAgIChpc09iamVjdExpa2UodmFsdWUpICYmIGlzRnVuY3Rpb24odmFsdWUuc3BsaWNlKSkpKSB7XG4gICAgICAgIHJldHVybiAhdmFsdWUubGVuZ3RoO1xuICAgICAgfVxuICAgICAgcmV0dXJuICFrZXlzKHZhbHVlKS5sZW5ndGg7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUGVyZm9ybXMgYSBkZWVwIGNvbXBhcmlzb24gYmV0d2VlbiB0d28gdmFsdWVzIHRvIGRldGVybWluZSBpZiB0aGV5IGFyZVxuICAgICAqIGVxdWl2YWxlbnQuIElmIGBjdXN0b21pemVyYCBpcyBwcm92aWRlZCBpdCBpcyBpbnZva2VkIHRvIGNvbXBhcmUgdmFsdWVzLlxuICAgICAqIElmIGBjdXN0b21pemVyYCByZXR1cm5zIGB1bmRlZmluZWRgIGNvbXBhcmlzb25zIGFyZSBoYW5kbGVkIGJ5IHRoZSBtZXRob2RcbiAgICAgKiBpbnN0ZWFkLiBUaGUgYGN1c3RvbWl6ZXJgIGlzIGJvdW5kIHRvIGB0aGlzQXJnYCBhbmQgaW52b2tlZCB3aXRoIHRocmVlXG4gICAgICogYXJndW1lbnRzOiAodmFsdWUsIG90aGVyIFssIGluZGV4fGtleV0pLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoaXMgbWV0aG9kIHN1cHBvcnRzIGNvbXBhcmluZyBhcnJheXMsIGJvb2xlYW5zLCBgRGF0ZWAgb2JqZWN0cyxcbiAgICAgKiBudW1iZXJzLCBgT2JqZWN0YCBvYmplY3RzLCByZWdleGVzLCBhbmQgc3RyaW5ncy4gT2JqZWN0cyBhcmUgY29tcGFyZWQgYnlcbiAgICAgKiB0aGVpciBvd24sIG5vdCBpbmhlcml0ZWQsIGVudW1lcmFibGUgcHJvcGVydGllcy4gRnVuY3Rpb25zIGFuZCBET00gbm9kZXNcbiAgICAgKiBhcmUgKipub3QqKiBzdXBwb3J0ZWQuIFByb3ZpZGUgYSBjdXN0b21pemVyIGZ1bmN0aW9uIHRvIGV4dGVuZCBzdXBwb3J0XG4gICAgICogZm9yIGNvbXBhcmluZyBvdGhlciB2YWx1ZXMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAYWxpYXMgZXFcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbXBhcmUuXG4gICAgICogQHBhcmFtIHsqfSBvdGhlciBUaGUgb3RoZXIgdmFsdWUgdG8gY29tcGFyZS5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY3VzdG9taXplcl0gVGhlIGZ1bmN0aW9uIHRvIGN1c3RvbWl6ZSB2YWx1ZSBjb21wYXJpc29ucy5cbiAgICAgKiBAcGFyYW0geyp9IFt0aGlzQXJnXSBUaGUgYHRoaXNgIGJpbmRpbmcgb2YgYGN1c3RvbWl6ZXJgLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgdmFsdWVzIGFyZSBlcXVpdmFsZW50LCBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBvYmplY3QgPSB7ICd1c2VyJzogJ2ZyZWQnIH07XG4gICAgICogdmFyIG90aGVyID0geyAndXNlcic6ICdmcmVkJyB9O1xuICAgICAqXG4gICAgICogb2JqZWN0ID09IG90aGVyO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICpcbiAgICAgKiBfLmlzRXF1YWwob2JqZWN0LCBvdGhlcik7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogLy8gdXNpbmcgYSBjdXN0b21pemVyIGNhbGxiYWNrXG4gICAgICogdmFyIGFycmF5ID0gWydoZWxsbycsICdnb29kYnllJ107XG4gICAgICogdmFyIG90aGVyID0gWydoaScsICdnb29kYnllJ107XG4gICAgICpcbiAgICAgKiBfLmlzRXF1YWwoYXJyYXksIG90aGVyLCBmdW5jdGlvbih2YWx1ZSwgb3RoZXIpIHtcbiAgICAgKiAgIGlmIChfLmV2ZXJ5KFt2YWx1ZSwgb3RoZXJdLCBSZWdFeHAucHJvdG90eXBlLnRlc3QsIC9eaCg/Oml8ZWxsbykkLykpIHtcbiAgICAgKiAgICAgcmV0dXJuIHRydWU7XG4gICAgICogICB9XG4gICAgICogfSk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzRXF1YWwodmFsdWUsIG90aGVyLCBjdXN0b21pemVyLCB0aGlzQXJnKSB7XG4gICAgICBjdXN0b21pemVyID0gdHlwZW9mIGN1c3RvbWl6ZXIgPT0gJ2Z1bmN0aW9uJyA/IGJpbmRDYWxsYmFjayhjdXN0b21pemVyLCB0aGlzQXJnLCAzKSA6IHVuZGVmaW5lZDtcbiAgICAgIHZhciByZXN1bHQgPSBjdXN0b21pemVyID8gY3VzdG9taXplcih2YWx1ZSwgb3RoZXIpIDogdW5kZWZpbmVkO1xuICAgICAgcmV0dXJuICByZXN1bHQgPT09IHVuZGVmaW5lZCA/IGJhc2VJc0VxdWFsKHZhbHVlLCBvdGhlciwgY3VzdG9taXplcikgOiAhIXJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBhbiBgRXJyb3JgLCBgRXZhbEVycm9yYCwgYFJhbmdlRXJyb3JgLCBgUmVmZXJlbmNlRXJyb3JgLFxuICAgICAqIGBTeW50YXhFcnJvcmAsIGBUeXBlRXJyb3JgLCBvciBgVVJJRXJyb3JgIG9iamVjdC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYW4gZXJyb3Igb2JqZWN0LCBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uaXNFcnJvcihuZXcgRXJyb3IpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNFcnJvcihFcnJvcik7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpc0Vycm9yKHZhbHVlKSB7XG4gICAgICByZXR1cm4gaXNPYmplY3RMaWtlKHZhbHVlKSAmJiB0eXBlb2YgdmFsdWUubWVzc2FnZSA9PSAnc3RyaW5nJyAmJiBvYmpUb1N0cmluZy5jYWxsKHZhbHVlKSA9PSBlcnJvclRhZztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBhIGZpbml0ZSBwcmltaXRpdmUgbnVtYmVyLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoaXMgbWV0aG9kIGlzIGJhc2VkIG9uIFtgTnVtYmVyLmlzRmluaXRlYF0oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNi4wLyNzZWMtbnVtYmVyLmlzZmluaXRlKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBmaW5pdGUgbnVtYmVyLCBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uaXNGaW5pdGUoMTApO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNGaW5pdGUoJzEwJyk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKlxuICAgICAqIF8uaXNGaW5pdGUodHJ1ZSk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKlxuICAgICAqIF8uaXNGaW5pdGUoT2JqZWN0KDEwKSk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKlxuICAgICAqIF8uaXNGaW5pdGUoSW5maW5pdHkpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNGaW5pdGUodmFsdWUpIHtcbiAgICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT0gJ251bWJlcicgJiYgbmF0aXZlSXNGaW5pdGUodmFsdWUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGNsYXNzaWZpZWQgYXMgYSBgRnVuY3Rpb25gIG9iamVjdC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgY29ycmVjdGx5IGNsYXNzaWZpZWQsIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5pc0Z1bmN0aW9uKF8pO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNGdW5jdGlvbigvYWJjLyk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpc0Z1bmN0aW9uKHZhbHVlKSB7XG4gICAgICAvLyBUaGUgdXNlIG9mIGBPYmplY3QjdG9TdHJpbmdgIGF2b2lkcyBpc3N1ZXMgd2l0aCB0aGUgYHR5cGVvZmAgb3BlcmF0b3JcbiAgICAgIC8vIGluIG9sZGVyIHZlcnNpb25zIG9mIENocm9tZSBhbmQgU2FmYXJpIHdoaWNoIHJldHVybiAnZnVuY3Rpb24nIGZvciByZWdleGVzXG4gICAgICAvLyBhbmQgU2FmYXJpIDggZXF1aXZhbGVudHMgd2hpY2ggcmV0dXJuICdvYmplY3QnIGZvciB0eXBlZCBhcnJheSBjb25zdHJ1Y3RvcnMuXG4gICAgICByZXR1cm4gaXNPYmplY3QodmFsdWUpICYmIG9ialRvU3RyaW5nLmNhbGwodmFsdWUpID09IGZ1bmNUYWc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgdGhlIFtsYW5ndWFnZSB0eXBlXShodHRwczovL2VzNS5naXRodWIuaW8vI3g4KSBvZiBgT2JqZWN0YC5cbiAgICAgKiAoZS5nLiBhcnJheXMsIGZ1bmN0aW9ucywgb2JqZWN0cywgcmVnZXhlcywgYG5ldyBOdW1iZXIoMClgLCBhbmQgYG5ldyBTdHJpbmcoJycpYClcbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYW4gb2JqZWN0LCBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uaXNPYmplY3Qoe30pO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNPYmplY3QoWzEsIDIsIDNdKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzT2JqZWN0KDEpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNPYmplY3QodmFsdWUpIHtcbiAgICAgIC8vIEF2b2lkIGEgVjggSklUIGJ1ZyBpbiBDaHJvbWUgMTktMjAuXG4gICAgICAvLyBTZWUgaHR0cHM6Ly9jb2RlLmdvb2dsZS5jb20vcC92OC9pc3N1ZXMvZGV0YWlsP2lkPTIyOTEgZm9yIG1vcmUgZGV0YWlscy5cbiAgICAgIHZhciB0eXBlID0gdHlwZW9mIHZhbHVlO1xuICAgICAgcmV0dXJuICEhdmFsdWUgJiYgKHR5cGUgPT0gJ29iamVjdCcgfHwgdHlwZSA9PSAnZnVuY3Rpb24nKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQZXJmb3JtcyBhIGRlZXAgY29tcGFyaXNvbiBiZXR3ZWVuIGBvYmplY3RgIGFuZCBgc291cmNlYCB0byBkZXRlcm1pbmUgaWZcbiAgICAgKiBgb2JqZWN0YCBjb250YWlucyBlcXVpdmFsZW50IHByb3BlcnR5IHZhbHVlcy4gSWYgYGN1c3RvbWl6ZXJgIGlzIHByb3ZpZGVkXG4gICAgICogaXQgaXMgaW52b2tlZCB0byBjb21wYXJlIHZhbHVlcy4gSWYgYGN1c3RvbWl6ZXJgIHJldHVybnMgYHVuZGVmaW5lZGBcbiAgICAgKiBjb21wYXJpc29ucyBhcmUgaGFuZGxlZCBieSB0aGUgbWV0aG9kIGluc3RlYWQuIFRoZSBgY3VzdG9taXplcmAgaXMgYm91bmRcbiAgICAgKiB0byBgdGhpc0FyZ2AgYW5kIGludm9rZWQgd2l0aCB0aHJlZSBhcmd1bWVudHM6ICh2YWx1ZSwgb3RoZXIsIGluZGV4fGtleSkuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2Qgc3VwcG9ydHMgY29tcGFyaW5nIHByb3BlcnRpZXMgb2YgYXJyYXlzLCBib29sZWFucyxcbiAgICAgKiBgRGF0ZWAgb2JqZWN0cywgbnVtYmVycywgYE9iamVjdGAgb2JqZWN0cywgcmVnZXhlcywgYW5kIHN0cmluZ3MuIEZ1bmN0aW9uc1xuICAgICAqIGFuZCBET00gbm9kZXMgYXJlICoqbm90Kiogc3VwcG9ydGVkLiBQcm92aWRlIGEgY3VzdG9taXplciBmdW5jdGlvbiB0byBleHRlbmRcbiAgICAgKiBzdXBwb3J0IGZvciBjb21wYXJpbmcgb3RoZXIgdmFsdWVzLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gc291cmNlIFRoZSBvYmplY3Qgb2YgcHJvcGVydHkgdmFsdWVzIHRvIG1hdGNoLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtjdXN0b21pemVyXSBUaGUgZnVuY3Rpb24gdG8gY3VzdG9taXplIHZhbHVlIGNvbXBhcmlzb25zLlxuICAgICAqIEBwYXJhbSB7Kn0gW3RoaXNBcmddIFRoZSBgdGhpc2AgYmluZGluZyBvZiBgY3VzdG9taXplcmAuXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGBvYmplY3RgIGlzIGEgbWF0Y2gsIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIG9iamVjdCA9IHsgJ3VzZXInOiAnZnJlZCcsICdhZ2UnOiA0MCB9O1xuICAgICAqXG4gICAgICogXy5pc01hdGNoKG9iamVjdCwgeyAnYWdlJzogNDAgfSk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pc01hdGNoKG9iamVjdCwgeyAnYWdlJzogMzYgfSk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKlxuICAgICAqIC8vIHVzaW5nIGEgY3VzdG9taXplciBjYWxsYmFja1xuICAgICAqIHZhciBvYmplY3QgPSB7ICdncmVldGluZyc6ICdoZWxsbycgfTtcbiAgICAgKiB2YXIgc291cmNlID0geyAnZ3JlZXRpbmcnOiAnaGknIH07XG4gICAgICpcbiAgICAgKiBfLmlzTWF0Y2gob2JqZWN0LCBzb3VyY2UsIGZ1bmN0aW9uKHZhbHVlLCBvdGhlcikge1xuICAgICAqICAgcmV0dXJuIF8uZXZlcnkoW3ZhbHVlLCBvdGhlcl0sIFJlZ0V4cC5wcm90b3R5cGUudGVzdCwgL15oKD86aXxlbGxvKSQvKSB8fCB1bmRlZmluZWQ7XG4gICAgICogfSk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzTWF0Y2gob2JqZWN0LCBzb3VyY2UsIGN1c3RvbWl6ZXIsIHRoaXNBcmcpIHtcbiAgICAgIGN1c3RvbWl6ZXIgPSB0eXBlb2YgY3VzdG9taXplciA9PSAnZnVuY3Rpb24nID8gYmluZENhbGxiYWNrKGN1c3RvbWl6ZXIsIHRoaXNBcmcsIDMpIDogdW5kZWZpbmVkO1xuICAgICAgcmV0dXJuIGJhc2VJc01hdGNoKG9iamVjdCwgZ2V0TWF0Y2hEYXRhKHNvdXJjZSksIGN1c3RvbWl6ZXIpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGBOYU5gLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoaXMgbWV0aG9kIGlzIG5vdCB0aGUgc2FtZSBhcyBbYGlzTmFOYF0oaHR0cHM6Ly9lczUuZ2l0aHViLmlvLyN4MTUuMS4yLjQpXG4gICAgICogd2hpY2ggcmV0dXJucyBgdHJ1ZWAgZm9yIGB1bmRlZmluZWRgIGFuZCBvdGhlciBub24tbnVtZXJpYyB2YWx1ZXMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGBOYU5gLCBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uaXNOYU4oTmFOKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzTmFOKG5ldyBOdW1iZXIoTmFOKSk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogaXNOYU4odW5kZWZpbmVkKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzTmFOKHVuZGVmaW5lZCk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpc05hTih2YWx1ZSkge1xuICAgICAgLy8gQW4gYE5hTmAgcHJpbWl0aXZlIGlzIHRoZSBvbmx5IHZhbHVlIHRoYXQgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi5cbiAgICAgIC8vIFBlcmZvcm0gdGhlIGB0b1N0cmluZ1RhZ2AgY2hlY2sgZmlyc3QgdG8gYXZvaWQgZXJyb3JzIHdpdGggc29tZSBob3N0IG9iamVjdHMgaW4gSUUuXG4gICAgICByZXR1cm4gaXNOdW1iZXIodmFsdWUpICYmIHZhbHVlICE9ICt2YWx1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBhIG5hdGl2ZSBmdW5jdGlvbi5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBuYXRpdmUgZnVuY3Rpb24sIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5pc05hdGl2ZShBcnJheS5wcm90b3R5cGUucHVzaCk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pc05hdGl2ZShfKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzTmF0aXZlKHZhbHVlKSB7XG4gICAgICBpZiAodmFsdWUgPT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICBpZiAoaXNGdW5jdGlvbih2YWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuIHJlSXNOYXRpdmUudGVzdChmblRvU3RyaW5nLmNhbGwodmFsdWUpKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBpc09iamVjdExpa2UodmFsdWUpICYmIHJlSXNIb3N0Q3Rvci50ZXN0KHZhbHVlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBgbnVsbGAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGBudWxsYCwgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmlzTnVsbChudWxsKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzTnVsbCh2b2lkIDApO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNOdWxsKHZhbHVlKSB7XG4gICAgICByZXR1cm4gdmFsdWUgPT09IG51bGw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgY2xhc3NpZmllZCBhcyBhIGBOdW1iZXJgIHByaW1pdGl2ZSBvciBvYmplY3QuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVG8gZXhjbHVkZSBgSW5maW5pdHlgLCBgLUluZmluaXR5YCwgYW5kIGBOYU5gLCB3aGljaCBhcmUgY2xhc3NpZmllZFxuICAgICAqIGFzIG51bWJlcnMsIHVzZSB0aGUgYF8uaXNGaW5pdGVgIG1ldGhvZC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgY29ycmVjdGx5IGNsYXNzaWZpZWQsIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5pc051bWJlcig4LjQpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNOdW1iZXIoTmFOKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzTnVtYmVyKCc4LjQnKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzTnVtYmVyKHZhbHVlKSB7XG4gICAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09ICdudW1iZXInIHx8IChpc09iamVjdExpa2UodmFsdWUpICYmIG9ialRvU3RyaW5nLmNhbGwodmFsdWUpID09IG51bWJlclRhZyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgYSBwbGFpbiBvYmplY3QsIHRoYXQgaXMsIGFuIG9iamVjdCBjcmVhdGVkIGJ5IHRoZVxuICAgICAqIGBPYmplY3RgIGNvbnN0cnVjdG9yIG9yIG9uZSB3aXRoIGEgYFtbUHJvdG90eXBlXV1gIG9mIGBudWxsYC5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBhc3N1bWVzIG9iamVjdHMgY3JlYXRlZCBieSB0aGUgYE9iamVjdGAgY29uc3RydWN0b3JcbiAgICAgKiBoYXZlIG5vIGluaGVyaXRlZCBlbnVtZXJhYmxlIHByb3BlcnRpZXMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgcGxhaW4gb2JqZWN0LCBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIEZvbygpIHtcbiAgICAgKiAgIHRoaXMuYSA9IDE7XG4gICAgICogfVxuICAgICAqXG4gICAgICogXy5pc1BsYWluT2JqZWN0KG5ldyBGb28pO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICpcbiAgICAgKiBfLmlzUGxhaW5PYmplY3QoWzEsIDIsIDNdKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqXG4gICAgICogXy5pc1BsYWluT2JqZWN0KHsgJ3gnOiAwLCAneSc6IDAgfSk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pc1BsYWluT2JqZWN0KE9iamVjdC5jcmVhdGUobnVsbCkpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpc1BsYWluT2JqZWN0KHZhbHVlKSB7XG4gICAgICB2YXIgQ3RvcjtcblxuICAgICAgLy8gRXhpdCBlYXJseSBmb3Igbm9uIGBPYmplY3RgIG9iamVjdHMuXG4gICAgICBpZiAoIShpc09iamVjdExpa2UodmFsdWUpICYmIG9ialRvU3RyaW5nLmNhbGwodmFsdWUpID09IG9iamVjdFRhZyAmJiAhaXNBcmd1bWVudHModmFsdWUpKSB8fFxuICAgICAgICAgICghaGFzT3duUHJvcGVydHkuY2FsbCh2YWx1ZSwgJ2NvbnN0cnVjdG9yJykgJiYgKEN0b3IgPSB2YWx1ZS5jb25zdHJ1Y3RvciwgdHlwZW9mIEN0b3IgPT0gJ2Z1bmN0aW9uJyAmJiAhKEN0b3IgaW5zdGFuY2VvZiBDdG9yKSkpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIC8vIElFIDwgOSBpdGVyYXRlcyBpbmhlcml0ZWQgcHJvcGVydGllcyBiZWZvcmUgb3duIHByb3BlcnRpZXMuIElmIHRoZSBmaXJzdFxuICAgICAgLy8gaXRlcmF0ZWQgcHJvcGVydHkgaXMgYW4gb2JqZWN0J3Mgb3duIHByb3BlcnR5IHRoZW4gdGhlcmUgYXJlIG5vIGluaGVyaXRlZFxuICAgICAgLy8gZW51bWVyYWJsZSBwcm9wZXJ0aWVzLlxuICAgICAgdmFyIHJlc3VsdDtcbiAgICAgIC8vIEluIG1vc3QgZW52aXJvbm1lbnRzIGFuIG9iamVjdCdzIG93biBwcm9wZXJ0aWVzIGFyZSBpdGVyYXRlZCBiZWZvcmVcbiAgICAgIC8vIGl0cyBpbmhlcml0ZWQgcHJvcGVydGllcy4gSWYgdGhlIGxhc3QgaXRlcmF0ZWQgcHJvcGVydHkgaXMgYW4gb2JqZWN0J3NcbiAgICAgIC8vIG93biBwcm9wZXJ0eSB0aGVuIHRoZXJlIGFyZSBubyBpbmhlcml0ZWQgZW51bWVyYWJsZSBwcm9wZXJ0aWVzLlxuICAgICAgYmFzZUZvckluKHZhbHVlLCBmdW5jdGlvbihzdWJWYWx1ZSwga2V5KSB7XG4gICAgICAgIHJlc3VsdCA9IGtleTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHJlc3VsdCA9PT0gdW5kZWZpbmVkIHx8IGhhc093blByb3BlcnR5LmNhbGwodmFsdWUsIHJlc3VsdCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgY2xhc3NpZmllZCBhcyBhIGBSZWdFeHBgIG9iamVjdC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgY29ycmVjdGx5IGNsYXNzaWZpZWQsIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5pc1JlZ0V4cCgvYWJjLyk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pc1JlZ0V4cCgnL2FiYy8nKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzUmVnRXhwKHZhbHVlKSB7XG4gICAgICByZXR1cm4gaXNPYmplY3QodmFsdWUpICYmIG9ialRvU3RyaW5nLmNhbGwodmFsdWUpID09IHJlZ2V4cFRhZztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBjbGFzc2lmaWVkIGFzIGEgYFN0cmluZ2AgcHJpbWl0aXZlIG9yIG9iamVjdC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgY29ycmVjdGx5IGNsYXNzaWZpZWQsIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5pc1N0cmluZygnYWJjJyk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pc1N0cmluZygxKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzU3RyaW5nKHZhbHVlKSB7XG4gICAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09ICdzdHJpbmcnIHx8IChpc09iamVjdExpa2UodmFsdWUpICYmIG9ialRvU3RyaW5nLmNhbGwodmFsdWUpID09IHN0cmluZ1RhZyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgY2xhc3NpZmllZCBhcyBhIHR5cGVkIGFycmF5LlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBjb3JyZWN0bHkgY2xhc3NpZmllZCwgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmlzVHlwZWRBcnJheShuZXcgVWludDhBcnJheSk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pc1R5cGVkQXJyYXkoW10pO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNUeXBlZEFycmF5KHZhbHVlKSB7XG4gICAgICByZXR1cm4gaXNPYmplY3RMaWtlKHZhbHVlKSAmJiBpc0xlbmd0aCh2YWx1ZS5sZW5ndGgpICYmICEhdHlwZWRBcnJheVRhZ3Nbb2JqVG9TdHJpbmcuY2FsbCh2YWx1ZSldO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGB1bmRlZmluZWRgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBgdW5kZWZpbmVkYCwgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmlzVW5kZWZpbmVkKHZvaWQgMCk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pc1VuZGVmaW5lZChudWxsKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzVW5kZWZpbmVkKHZhbHVlKSB7XG4gICAgICByZXR1cm4gdmFsdWUgPT09IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBsZXNzIHRoYW4gYG90aGVyYC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY29tcGFyZS5cbiAgICAgKiBAcGFyYW0geyp9IG90aGVyIFRoZSBvdGhlciB2YWx1ZSB0byBjb21wYXJlLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGxlc3MgdGhhbiBgb3RoZXJgLCBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8ubHQoMSwgMyk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5sdCgzLCAzKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqXG4gICAgICogXy5sdCgzLCAxKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGx0KHZhbHVlLCBvdGhlcikge1xuICAgICAgcmV0dXJuIHZhbHVlIDwgb3RoZXI7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIGBvdGhlcmAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbXBhcmUuXG4gICAgICogQHBhcmFtIHsqfSBvdGhlciBUaGUgb3RoZXIgdmFsdWUgdG8gY29tcGFyZS5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gYG90aGVyYCwgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmx0ZSgxLCAzKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmx0ZSgzLCAzKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmx0ZSgzLCAxKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGx0ZSh2YWx1ZSwgb3RoZXIpIHtcbiAgICAgIHJldHVybiB2YWx1ZSA8PSBvdGhlcjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0cyBgdmFsdWVgIHRvIGFuIGFycmF5LlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjb252ZXJ0LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgY29udmVydGVkIGFycmF5LlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiAoZnVuY3Rpb24oKSB7XG4gICAgICogICByZXR1cm4gXy50b0FycmF5KGFyZ3VtZW50cykuc2xpY2UoMSk7XG4gICAgICogfSgxLCAyLCAzKSk7XG4gICAgICogLy8gPT4gWzIsIDNdXG4gICAgICovXG4gICAgZnVuY3Rpb24gdG9BcnJheSh2YWx1ZSkge1xuICAgICAgdmFyIGxlbmd0aCA9IHZhbHVlID8gZ2V0TGVuZ3RoKHZhbHVlKSA6IDA7XG4gICAgICBpZiAoIWlzTGVuZ3RoKGxlbmd0aCkpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlcyh2YWx1ZSk7XG4gICAgICB9XG4gICAgICBpZiAoIWxlbmd0aCkge1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG4gICAgICByZXR1cm4gYXJyYXlDb3B5KHZhbHVlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0cyBgdmFsdWVgIHRvIGEgcGxhaW4gb2JqZWN0IGZsYXR0ZW5pbmcgaW5oZXJpdGVkIGVudW1lcmFibGVcbiAgICAgKiBwcm9wZXJ0aWVzIG9mIGB2YWx1ZWAgdG8gb3duIHByb3BlcnRpZXMgb2YgdGhlIHBsYWluIG9iamVjdC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY29udmVydC5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBjb252ZXJ0ZWQgcGxhaW4gb2JqZWN0LlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBmdW5jdGlvbiBGb28oKSB7XG4gICAgICogICB0aGlzLmIgPSAyO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIEZvby5wcm90b3R5cGUuYyA9IDM7XG4gICAgICpcbiAgICAgKiBfLmFzc2lnbih7ICdhJzogMSB9LCBuZXcgRm9vKTtcbiAgICAgKiAvLyA9PiB7ICdhJzogMSwgJ2InOiAyIH1cbiAgICAgKlxuICAgICAqIF8uYXNzaWduKHsgJ2EnOiAxIH0sIF8udG9QbGFpbk9iamVjdChuZXcgRm9vKSk7XG4gICAgICogLy8gPT4geyAnYSc6IDEsICdiJzogMiwgJ2MnOiAzIH1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiB0b1BsYWluT2JqZWN0KHZhbHVlKSB7XG4gICAgICByZXR1cm4gYmFzZUNvcHkodmFsdWUsIGtleXNJbih2YWx1ZSkpO1xuICAgIH1cblxuICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuICAgIC8qKlxuICAgICAqIFJlY3Vyc2l2ZWx5IG1lcmdlcyBvd24gZW51bWVyYWJsZSBwcm9wZXJ0aWVzIG9mIHRoZSBzb3VyY2Ugb2JqZWN0KHMpLCB0aGF0XG4gICAgICogZG9uJ3QgcmVzb2x2ZSB0byBgdW5kZWZpbmVkYCBpbnRvIHRoZSBkZXN0aW5hdGlvbiBvYmplY3QuIFN1YnNlcXVlbnQgc291cmNlc1xuICAgICAqIG92ZXJ3cml0ZSBwcm9wZXJ0eSBhc3NpZ25tZW50cyBvZiBwcmV2aW91cyBzb3VyY2VzLiBJZiBgY3VzdG9taXplcmAgaXNcbiAgICAgKiBwcm92aWRlZCBpdCBpcyBpbnZva2VkIHRvIHByb2R1Y2UgdGhlIG1lcmdlZCB2YWx1ZXMgb2YgdGhlIGRlc3RpbmF0aW9uIGFuZFxuICAgICAqIHNvdXJjZSBwcm9wZXJ0aWVzLiBJZiBgY3VzdG9taXplcmAgcmV0dXJucyBgdW5kZWZpbmVkYCBtZXJnaW5nIGlzIGhhbmRsZWRcbiAgICAgKiBieSB0aGUgbWV0aG9kIGluc3RlYWQuIFRoZSBgY3VzdG9taXplcmAgaXMgYm91bmQgdG8gYHRoaXNBcmdgIGFuZCBpbnZva2VkXG4gICAgICogd2l0aCBmaXZlIGFyZ3VtZW50czogKG9iamVjdFZhbHVlLCBzb3VyY2VWYWx1ZSwga2V5LCBvYmplY3QsIHNvdXJjZSkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0XG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgZGVzdGluYXRpb24gb2JqZWN0LlxuICAgICAqIEBwYXJhbSB7Li4uT2JqZWN0fSBbc291cmNlc10gVGhlIHNvdXJjZSBvYmplY3RzLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtjdXN0b21pemVyXSBUaGUgZnVuY3Rpb24gdG8gY3VzdG9taXplIGFzc2lnbmVkIHZhbHVlcy5cbiAgICAgKiBAcGFyYW0geyp9IFt0aGlzQXJnXSBUaGUgYHRoaXNgIGJpbmRpbmcgb2YgYGN1c3RvbWl6ZXJgLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciB1c2VycyA9IHtcbiAgICAgKiAgICdkYXRhJzogW3sgJ3VzZXInOiAnYmFybmV5JyB9LCB7ICd1c2VyJzogJ2ZyZWQnIH1dXG4gICAgICogfTtcbiAgICAgKlxuICAgICAqIHZhciBhZ2VzID0ge1xuICAgICAqICAgJ2RhdGEnOiBbeyAnYWdlJzogMzYgfSwgeyAnYWdlJzogNDAgfV1cbiAgICAgKiB9O1xuICAgICAqXG4gICAgICogXy5tZXJnZSh1c2VycywgYWdlcyk7XG4gICAgICogLy8gPT4geyAnZGF0YSc6IFt7ICd1c2VyJzogJ2Jhcm5leScsICdhZ2UnOiAzNiB9LCB7ICd1c2VyJzogJ2ZyZWQnLCAnYWdlJzogNDAgfV0gfVxuICAgICAqXG4gICAgICogLy8gdXNpbmcgYSBjdXN0b21pemVyIGNhbGxiYWNrXG4gICAgICogdmFyIG9iamVjdCA9IHtcbiAgICAgKiAgICdmcnVpdHMnOiBbJ2FwcGxlJ10sXG4gICAgICogICAndmVnZXRhYmxlcyc6IFsnYmVldCddXG4gICAgICogfTtcbiAgICAgKlxuICAgICAqIHZhciBvdGhlciA9IHtcbiAgICAgKiAgICdmcnVpdHMnOiBbJ2JhbmFuYSddLFxuICAgICAqICAgJ3ZlZ2V0YWJsZXMnOiBbJ2NhcnJvdCddXG4gICAgICogfTtcbiAgICAgKlxuICAgICAqIF8ubWVyZ2Uob2JqZWN0LCBvdGhlciwgZnVuY3Rpb24oYSwgYikge1xuICAgICAqICAgaWYgKF8uaXNBcnJheShhKSkge1xuICAgICAqICAgICByZXR1cm4gYS5jb25jYXQoYik7XG4gICAgICogICB9XG4gICAgICogfSk7XG4gICAgICogLy8gPT4geyAnZnJ1aXRzJzogWydhcHBsZScsICdiYW5hbmEnXSwgJ3ZlZ2V0YWJsZXMnOiBbJ2JlZXQnLCAnY2Fycm90J10gfVxuICAgICAqL1xuICAgIHZhciBtZXJnZSA9IGNyZWF0ZUFzc2lnbmVyKGJhc2VNZXJnZSk7XG5cbiAgICAvKipcbiAgICAgKiBBc3NpZ25zIG93biBlbnVtZXJhYmxlIHByb3BlcnRpZXMgb2Ygc291cmNlIG9iamVjdChzKSB0byB0aGUgZGVzdGluYXRpb25cbiAgICAgKiBvYmplY3QuIFN1YnNlcXVlbnQgc291cmNlcyBvdmVyd3JpdGUgcHJvcGVydHkgYXNzaWdubWVudHMgb2YgcHJldmlvdXMgc291cmNlcy5cbiAgICAgKiBJZiBgY3VzdG9taXplcmAgaXMgcHJvdmlkZWQgaXQgaXMgaW52b2tlZCB0byBwcm9kdWNlIHRoZSBhc3NpZ25lZCB2YWx1ZXMuXG4gICAgICogVGhlIGBjdXN0b21pemVyYCBpcyBib3VuZCB0byBgdGhpc0FyZ2AgYW5kIGludm9rZWQgd2l0aCBmaXZlIGFyZ3VtZW50czpcbiAgICAgKiAob2JqZWN0VmFsdWUsIHNvdXJjZVZhbHVlLCBrZXksIG9iamVjdCwgc291cmNlKS5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBtdXRhdGVzIGBvYmplY3RgIGFuZCBpcyBiYXNlZCBvblxuICAgICAqIFtgT2JqZWN0LmFzc2lnbmBdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzYuMC8jc2VjLW9iamVjdC5hc3NpZ24pLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGFsaWFzIGV4dGVuZFxuICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBkZXN0aW5hdGlvbiBvYmplY3QuXG4gICAgICogQHBhcmFtIHsuLi5PYmplY3R9IFtzb3VyY2VzXSBUaGUgc291cmNlIG9iamVjdHMuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2N1c3RvbWl6ZXJdIFRoZSBmdW5jdGlvbiB0byBjdXN0b21pemUgYXNzaWduZWQgdmFsdWVzLlxuICAgICAqIEBwYXJhbSB7Kn0gW3RoaXNBcmddIFRoZSBgdGhpc2AgYmluZGluZyBvZiBgY3VzdG9taXplcmAuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBgb2JqZWN0YC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5hc3NpZ24oeyAndXNlcic6ICdiYXJuZXknIH0sIHsgJ2FnZSc6IDQwIH0sIHsgJ3VzZXInOiAnZnJlZCcgfSk7XG4gICAgICogLy8gPT4geyAndXNlcic6ICdmcmVkJywgJ2FnZSc6IDQwIH1cbiAgICAgKlxuICAgICAqIC8vIHVzaW5nIGEgY3VzdG9taXplciBjYWxsYmFja1xuICAgICAqIHZhciBkZWZhdWx0cyA9IF8ucGFydGlhbFJpZ2h0KF8uYXNzaWduLCBmdW5jdGlvbih2YWx1ZSwgb3RoZXIpIHtcbiAgICAgKiAgIHJldHVybiBfLmlzVW5kZWZpbmVkKHZhbHVlKSA/IG90aGVyIDogdmFsdWU7XG4gICAgICogfSk7XG4gICAgICpcbiAgICAgKiBkZWZhdWx0cyh7ICd1c2VyJzogJ2Jhcm5leScgfSwgeyAnYWdlJzogMzYgfSwgeyAndXNlcic6ICdmcmVkJyB9KTtcbiAgICAgKiAvLyA9PiB7ICd1c2VyJzogJ2Jhcm5leScsICdhZ2UnOiAzNiB9XG4gICAgICovXG4gICAgdmFyIGFzc2lnbiA9IGNyZWF0ZUFzc2lnbmVyKGZ1bmN0aW9uKG9iamVjdCwgc291cmNlLCBjdXN0b21pemVyKSB7XG4gICAgICByZXR1cm4gY3VzdG9taXplclxuICAgICAgICA/IGFzc2lnbldpdGgob2JqZWN0LCBzb3VyY2UsIGN1c3RvbWl6ZXIpXG4gICAgICAgIDogYmFzZUFzc2lnbihvYmplY3QsIHNvdXJjZSk7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIG9iamVjdCB0aGF0IGluaGVyaXRzIGZyb20gdGhlIGdpdmVuIGBwcm90b3R5cGVgIG9iamVjdC4gSWYgYVxuICAgICAqIGBwcm9wZXJ0aWVzYCBvYmplY3QgaXMgcHJvdmlkZWQgaXRzIG93biBlbnVtZXJhYmxlIHByb3BlcnRpZXMgYXJlIGFzc2lnbmVkXG4gICAgICogdG8gdGhlIGNyZWF0ZWQgb2JqZWN0LlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IE9iamVjdFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBwcm90b3R5cGUgVGhlIG9iamVjdCB0byBpbmhlcml0IGZyb20uXG4gICAgICogQHBhcmFtIHtPYmplY3R9IFtwcm9wZXJ0aWVzXSBUaGUgcHJvcGVydGllcyB0byBhc3NpZ24gdG8gdGhlIG9iamVjdC5cbiAgICAgKiBAcGFyYW0tIHtPYmplY3R9IFtndWFyZF0gRW5hYmxlcyB1c2UgYXMgYSBjYWxsYmFjayBmb3IgZnVuY3Rpb25zIGxpa2UgYF8ubWFwYC5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBuZXcgb2JqZWN0LlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBmdW5jdGlvbiBTaGFwZSgpIHtcbiAgICAgKiAgIHRoaXMueCA9IDA7XG4gICAgICogICB0aGlzLnkgPSAwO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIENpcmNsZSgpIHtcbiAgICAgKiAgIFNoYXBlLmNhbGwodGhpcyk7XG4gICAgICogfVxuICAgICAqXG4gICAgICogQ2lyY2xlLnByb3RvdHlwZSA9IF8uY3JlYXRlKFNoYXBlLnByb3RvdHlwZSwge1xuICAgICAqICAgJ2NvbnN0cnVjdG9yJzogQ2lyY2xlXG4gICAgICogfSk7XG4gICAgICpcbiAgICAgKiB2YXIgY2lyY2xlID0gbmV3IENpcmNsZTtcbiAgICAgKiBjaXJjbGUgaW5zdGFuY2VvZiBDaXJjbGU7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogY2lyY2xlIGluc3RhbmNlb2YgU2hhcGU7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZShwcm90b3R5cGUsIHByb3BlcnRpZXMsIGd1YXJkKSB7XG4gICAgICB2YXIgcmVzdWx0ID0gYmFzZUNyZWF0ZShwcm90b3R5cGUpO1xuICAgICAgaWYgKGd1YXJkICYmIGlzSXRlcmF0ZWVDYWxsKHByb3RvdHlwZSwgcHJvcGVydGllcywgZ3VhcmQpKSB7XG4gICAgICAgIHByb3BlcnRpZXMgPSB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gcHJvcGVydGllcyA/IGJhc2VBc3NpZ24ocmVzdWx0LCBwcm9wZXJ0aWVzKSA6IHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBc3NpZ25zIG93biBlbnVtZXJhYmxlIHByb3BlcnRpZXMgb2Ygc291cmNlIG9iamVjdChzKSB0byB0aGUgZGVzdGluYXRpb25cbiAgICAgKiBvYmplY3QgZm9yIGFsbCBkZXN0aW5hdGlvbiBwcm9wZXJ0aWVzIHRoYXQgcmVzb2x2ZSB0byBgdW5kZWZpbmVkYC4gT25jZSBhXG4gICAgICogcHJvcGVydHkgaXMgc2V0LCBhZGRpdGlvbmFsIHZhbHVlcyBvZiB0aGUgc2FtZSBwcm9wZXJ0eSBhcmUgaWdub3JlZC5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBtdXRhdGVzIGBvYmplY3RgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IE9iamVjdFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIGRlc3RpbmF0aW9uIG9iamVjdC5cbiAgICAgKiBAcGFyYW0gey4uLk9iamVjdH0gW3NvdXJjZXNdIFRoZSBzb3VyY2Ugb2JqZWN0cy5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGBvYmplY3RgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmRlZmF1bHRzKHsgJ3VzZXInOiAnYmFybmV5JyB9LCB7ICdhZ2UnOiAzNiB9LCB7ICd1c2VyJzogJ2ZyZWQnIH0pO1xuICAgICAqIC8vID0+IHsgJ3VzZXInOiAnYmFybmV5JywgJ2FnZSc6IDM2IH1cbiAgICAgKi9cbiAgICB2YXIgZGVmYXVsdHMgPSBjcmVhdGVEZWZhdWx0cyhhc3NpZ24sIGFzc2lnbkRlZmF1bHRzKTtcblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uZGVmYXVsdHNgIGV4Y2VwdCB0aGF0IGl0IHJlY3Vyc2l2ZWx5IGFzc2lnbnNcbiAgICAgKiBkZWZhdWx0IHByb3BlcnRpZXMuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgbXV0YXRlcyBgb2JqZWN0YC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBkZXN0aW5hdGlvbiBvYmplY3QuXG4gICAgICogQHBhcmFtIHsuLi5PYmplY3R9IFtzb3VyY2VzXSBUaGUgc291cmNlIG9iamVjdHMuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBgb2JqZWN0YC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5kZWZhdWx0c0RlZXAoeyAndXNlcic6IHsgJ25hbWUnOiAnYmFybmV5JyB9IH0sIHsgJ3VzZXInOiB7ICduYW1lJzogJ2ZyZWQnLCAnYWdlJzogMzYgfSB9KTtcbiAgICAgKiAvLyA9PiB7ICd1c2VyJzogeyAnbmFtZSc6ICdiYXJuZXknLCAnYWdlJzogMzYgfSB9XG4gICAgICpcbiAgICAgKi9cbiAgICB2YXIgZGVmYXVsdHNEZWVwID0gY3JlYXRlRGVmYXVsdHMobWVyZ2UsIG1lcmdlRGVmYXVsdHMpO1xuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5maW5kYCBleGNlcHQgdGhhdCBpdCByZXR1cm5zIHRoZSBrZXkgb2YgdGhlIGZpcnN0XG4gICAgICogZWxlbWVudCBgcHJlZGljYXRlYCByZXR1cm5zIHRydXRoeSBmb3IgaW5zdGVhZCBvZiB0aGUgZWxlbWVudCBpdHNlbGYuXG4gICAgICpcbiAgICAgKiBJZiBhIHByb3BlcnR5IG5hbWUgaXMgcHJvdmlkZWQgZm9yIGBwcmVkaWNhdGVgIHRoZSBjcmVhdGVkIGBfLnByb3BlcnR5YFxuICAgICAqIHN0eWxlIGNhbGxiYWNrIHJldHVybnMgdGhlIHByb3BlcnR5IHZhbHVlIG9mIHRoZSBnaXZlbiBlbGVtZW50LlxuICAgICAqXG4gICAgICogSWYgYSB2YWx1ZSBpcyBhbHNvIHByb3ZpZGVkIGZvciBgdGhpc0FyZ2AgdGhlIGNyZWF0ZWQgYF8ubWF0Y2hlc1Byb3BlcnR5YFxuICAgICAqIHN0eWxlIGNhbGxiYWNrIHJldHVybnMgYHRydWVgIGZvciBlbGVtZW50cyB0aGF0IGhhdmUgYSBtYXRjaGluZyBwcm9wZXJ0eVxuICAgICAqIHZhbHVlLCBlbHNlIGBmYWxzZWAuXG4gICAgICpcbiAgICAgKiBJZiBhbiBvYmplY3QgaXMgcHJvdmlkZWQgZm9yIGBwcmVkaWNhdGVgIHRoZSBjcmVhdGVkIGBfLm1hdGNoZXNgIHN0eWxlXG4gICAgICogY2FsbGJhY2sgcmV0dXJucyBgdHJ1ZWAgZm9yIGVsZW1lbnRzIHRoYXQgaGF2ZSB0aGUgcHJvcGVydGllcyBvZiB0aGUgZ2l2ZW5cbiAgICAgKiBvYmplY3QsIGVsc2UgYGZhbHNlYC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gc2VhcmNoLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb258T2JqZWN0fHN0cmluZ30gW3ByZWRpY2F0ZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZFxuICAgICAqICBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEBwYXJhbSB7Kn0gW3RoaXNBcmddIFRoZSBgdGhpc2AgYmluZGluZyBvZiBgcHJlZGljYXRlYC5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfHVuZGVmaW5lZH0gUmV0dXJucyB0aGUga2V5IG9mIHRoZSBtYXRjaGVkIGVsZW1lbnQsIGVsc2UgYHVuZGVmaW5lZGAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciB1c2VycyA9IHtcbiAgICAgKiAgICdiYXJuZXknOiAgeyAnYWdlJzogMzYsICdhY3RpdmUnOiB0cnVlIH0sXG4gICAgICogICAnZnJlZCc6ICAgIHsgJ2FnZSc6IDQwLCAnYWN0aXZlJzogZmFsc2UgfSxcbiAgICAgKiAgICdwZWJibGVzJzogeyAnYWdlJzogMSwgICdhY3RpdmUnOiB0cnVlIH1cbiAgICAgKiB9O1xuICAgICAqXG4gICAgICogXy5maW5kS2V5KHVzZXJzLCBmdW5jdGlvbihjaHIpIHtcbiAgICAgKiAgIHJldHVybiBjaHIuYWdlIDwgNDA7XG4gICAgICogfSk7XG4gICAgICogLy8gPT4gJ2Jhcm5leScgKGl0ZXJhdGlvbiBvcmRlciBpcyBub3QgZ3VhcmFudGVlZClcbiAgICAgKlxuICAgICAqIC8vIHVzaW5nIHRoZSBgXy5tYXRjaGVzYCBjYWxsYmFjayBzaG9ydGhhbmRcbiAgICAgKiBfLmZpbmRLZXkodXNlcnMsIHsgJ2FnZSc6IDEsICdhY3RpdmUnOiB0cnVlIH0pO1xuICAgICAqIC8vID0+ICdwZWJibGVzJ1xuICAgICAqXG4gICAgICogLy8gdXNpbmcgdGhlIGBfLm1hdGNoZXNQcm9wZXJ0eWAgY2FsbGJhY2sgc2hvcnRoYW5kXG4gICAgICogXy5maW5kS2V5KHVzZXJzLCAnYWN0aXZlJywgZmFsc2UpO1xuICAgICAqIC8vID0+ICdmcmVkJ1xuICAgICAqXG4gICAgICogLy8gdXNpbmcgdGhlIGBfLnByb3BlcnR5YCBjYWxsYmFjayBzaG9ydGhhbmRcbiAgICAgKiBfLmZpbmRLZXkodXNlcnMsICdhY3RpdmUnKTtcbiAgICAgKiAvLyA9PiAnYmFybmV5J1xuICAgICAqL1xuICAgIHZhciBmaW5kS2V5ID0gY3JlYXRlRmluZEtleShiYXNlRm9yT3duKTtcblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uZmluZEtleWAgZXhjZXB0IHRoYXQgaXQgaXRlcmF0ZXMgb3ZlciBlbGVtZW50cyBvZlxuICAgICAqIGEgY29sbGVjdGlvbiBpbiB0aGUgb3Bwb3NpdGUgb3JkZXIuXG4gICAgICpcbiAgICAgKiBJZiBhIHByb3BlcnR5IG5hbWUgaXMgcHJvdmlkZWQgZm9yIGBwcmVkaWNhdGVgIHRoZSBjcmVhdGVkIGBfLnByb3BlcnR5YFxuICAgICAqIHN0eWxlIGNhbGxiYWNrIHJldHVybnMgdGhlIHByb3BlcnR5IHZhbHVlIG9mIHRoZSBnaXZlbiBlbGVtZW50LlxuICAgICAqXG4gICAgICogSWYgYSB2YWx1ZSBpcyBhbHNvIHByb3ZpZGVkIGZvciBgdGhpc0FyZ2AgdGhlIGNyZWF0ZWQgYF8ubWF0Y2hlc1Byb3BlcnR5YFxuICAgICAqIHN0eWxlIGNhbGxiYWNrIHJldHVybnMgYHRydWVgIGZvciBlbGVtZW50cyB0aGF0IGhhdmUgYSBtYXRjaGluZyBwcm9wZXJ0eVxuICAgICAqIHZhbHVlLCBlbHNlIGBmYWxzZWAuXG4gICAgICpcbiAgICAgKiBJZiBhbiBvYmplY3QgaXMgcHJvdmlkZWQgZm9yIGBwcmVkaWNhdGVgIHRoZSBjcmVhdGVkIGBfLm1hdGNoZXNgIHN0eWxlXG4gICAgICogY2FsbGJhY2sgcmV0dXJucyBgdHJ1ZWAgZm9yIGVsZW1lbnRzIHRoYXQgaGF2ZSB0aGUgcHJvcGVydGllcyBvZiB0aGUgZ2l2ZW5cbiAgICAgKiBvYmplY3QsIGVsc2UgYGZhbHNlYC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gc2VhcmNoLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb258T2JqZWN0fHN0cmluZ30gW3ByZWRpY2F0ZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZFxuICAgICAqICBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEBwYXJhbSB7Kn0gW3RoaXNBcmddIFRoZSBgdGhpc2AgYmluZGluZyBvZiBgcHJlZGljYXRlYC5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfHVuZGVmaW5lZH0gUmV0dXJucyB0aGUga2V5IG9mIHRoZSBtYXRjaGVkIGVsZW1lbnQsIGVsc2UgYHVuZGVmaW5lZGAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciB1c2VycyA9IHtcbiAgICAgKiAgICdiYXJuZXknOiAgeyAnYWdlJzogMzYsICdhY3RpdmUnOiB0cnVlIH0sXG4gICAgICogICAnZnJlZCc6ICAgIHsgJ2FnZSc6IDQwLCAnYWN0aXZlJzogZmFsc2UgfSxcbiAgICAgKiAgICdwZWJibGVzJzogeyAnYWdlJzogMSwgICdhY3RpdmUnOiB0cnVlIH1cbiAgICAgKiB9O1xuICAgICAqXG4gICAgICogXy5maW5kTGFzdEtleSh1c2VycywgZnVuY3Rpb24oY2hyKSB7XG4gICAgICogICByZXR1cm4gY2hyLmFnZSA8IDQwO1xuICAgICAqIH0pO1xuICAgICAqIC8vID0+IHJldHVybnMgYHBlYmJsZXNgIGFzc3VtaW5nIGBfLmZpbmRLZXlgIHJldHVybnMgYGJhcm5leWBcbiAgICAgKlxuICAgICAqIC8vIHVzaW5nIHRoZSBgXy5tYXRjaGVzYCBjYWxsYmFjayBzaG9ydGhhbmRcbiAgICAgKiBfLmZpbmRMYXN0S2V5KHVzZXJzLCB7ICdhZ2UnOiAzNiwgJ2FjdGl2ZSc6IHRydWUgfSk7XG4gICAgICogLy8gPT4gJ2Jhcm5leSdcbiAgICAgKlxuICAgICAqIC8vIHVzaW5nIHRoZSBgXy5tYXRjaGVzUHJvcGVydHlgIGNhbGxiYWNrIHNob3J0aGFuZFxuICAgICAqIF8uZmluZExhc3RLZXkodXNlcnMsICdhY3RpdmUnLCBmYWxzZSk7XG4gICAgICogLy8gPT4gJ2ZyZWQnXG4gICAgICpcbiAgICAgKiAvLyB1c2luZyB0aGUgYF8ucHJvcGVydHlgIGNhbGxiYWNrIHNob3J0aGFuZFxuICAgICAqIF8uZmluZExhc3RLZXkodXNlcnMsICdhY3RpdmUnKTtcbiAgICAgKiAvLyA9PiAncGViYmxlcydcbiAgICAgKi9cbiAgICB2YXIgZmluZExhc3RLZXkgPSBjcmVhdGVGaW5kS2V5KGJhc2VGb3JPd25SaWdodCk7XG5cbiAgICAvKipcbiAgICAgKiBJdGVyYXRlcyBvdmVyIG93biBhbmQgaW5oZXJpdGVkIGVudW1lcmFibGUgcHJvcGVydGllcyBvZiBhbiBvYmplY3QgaW52b2tpbmdcbiAgICAgKiBgaXRlcmF0ZWVgIGZvciBlYWNoIHByb3BlcnR5LiBUaGUgYGl0ZXJhdGVlYCBpcyBib3VuZCB0byBgdGhpc0FyZ2AgYW5kIGludm9rZWRcbiAgICAgKiB3aXRoIHRocmVlIGFyZ3VtZW50czogKHZhbHVlLCBrZXksIG9iamVjdCkuIEl0ZXJhdGVlIGZ1bmN0aW9ucyBtYXkgZXhpdFxuICAgICAqIGl0ZXJhdGlvbiBlYXJseSBieSBleHBsaWNpdGx5IHJldHVybmluZyBgZmFsc2VgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IE9iamVjdFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlPV8uaWRlbnRpdHldIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAgICogQHBhcmFtIHsqfSBbdGhpc0FyZ10gVGhlIGB0aGlzYCBiaW5kaW5nIG9mIGBpdGVyYXRlZWAuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBgb2JqZWN0YC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gRm9vKCkge1xuICAgICAqICAgdGhpcy5hID0gMTtcbiAgICAgKiAgIHRoaXMuYiA9IDI7XG4gICAgICogfVxuICAgICAqXG4gICAgICogRm9vLnByb3RvdHlwZS5jID0gMztcbiAgICAgKlxuICAgICAqIF8uZm9ySW4obmV3IEZvbywgZnVuY3Rpb24odmFsdWUsIGtleSkge1xuICAgICAqICAgY29uc29sZS5sb2coa2V5KTtcbiAgICAgKiB9KTtcbiAgICAgKiAvLyA9PiBsb2dzICdhJywgJ2InLCBhbmQgJ2MnIChpdGVyYXRpb24gb3JkZXIgaXMgbm90IGd1YXJhbnRlZWQpXG4gICAgICovXG4gICAgdmFyIGZvckluID0gY3JlYXRlRm9ySW4oYmFzZUZvcik7XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLmZvckluYCBleGNlcHQgdGhhdCBpdCBpdGVyYXRlcyBvdmVyIHByb3BlcnRpZXMgb2ZcbiAgICAgKiBgb2JqZWN0YCBpbiB0aGUgb3Bwb3NpdGUgb3JkZXIuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0XG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcGFyYW0geyp9IFt0aGlzQXJnXSBUaGUgYHRoaXNgIGJpbmRpbmcgb2YgYGl0ZXJhdGVlYC5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGBvYmplY3RgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBmdW5jdGlvbiBGb28oKSB7XG4gICAgICogICB0aGlzLmEgPSAxO1xuICAgICAqICAgdGhpcy5iID0gMjtcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiBGb28ucHJvdG90eXBlLmMgPSAzO1xuICAgICAqXG4gICAgICogXy5mb3JJblJpZ2h0KG5ldyBGb28sIGZ1bmN0aW9uKHZhbHVlLCBrZXkpIHtcbiAgICAgKiAgIGNvbnNvbGUubG9nKGtleSk7XG4gICAgICogfSk7XG4gICAgICogLy8gPT4gbG9ncyAnYycsICdiJywgYW5kICdhJyBhc3N1bWluZyBgXy5mb3JJbiBgIGxvZ3MgJ2EnLCAnYicsIGFuZCAnYydcbiAgICAgKi9cbiAgICB2YXIgZm9ySW5SaWdodCA9IGNyZWF0ZUZvckluKGJhc2VGb3JSaWdodCk7XG5cbiAgICAvKipcbiAgICAgKiBJdGVyYXRlcyBvdmVyIG93biBlbnVtZXJhYmxlIHByb3BlcnRpZXMgb2YgYW4gb2JqZWN0IGludm9raW5nIGBpdGVyYXRlZWBcbiAgICAgKiBmb3IgZWFjaCBwcm9wZXJ0eS4gVGhlIGBpdGVyYXRlZWAgaXMgYm91bmQgdG8gYHRoaXNBcmdgIGFuZCBpbnZva2VkIHdpdGhcbiAgICAgKiB0aHJlZSBhcmd1bWVudHM6ICh2YWx1ZSwga2V5LCBvYmplY3QpLiBJdGVyYXRlZSBmdW5jdGlvbnMgbWF5IGV4aXQgaXRlcmF0aW9uXG4gICAgICogZWFybHkgYnkgZXhwbGljaXRseSByZXR1cm5pbmcgYGZhbHNlYC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEBwYXJhbSB7Kn0gW3RoaXNBcmddIFRoZSBgdGhpc2AgYmluZGluZyBvZiBgaXRlcmF0ZWVgLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIEZvbygpIHtcbiAgICAgKiAgIHRoaXMuYSA9IDE7XG4gICAgICogICB0aGlzLmIgPSAyO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIEZvby5wcm90b3R5cGUuYyA9IDM7XG4gICAgICpcbiAgICAgKiBfLmZvck93bihuZXcgRm9vLCBmdW5jdGlvbih2YWx1ZSwga2V5KSB7XG4gICAgICogICBjb25zb2xlLmxvZyhrZXkpO1xuICAgICAqIH0pO1xuICAgICAqIC8vID0+IGxvZ3MgJ2EnIGFuZCAnYicgKGl0ZXJhdGlvbiBvcmRlciBpcyBub3QgZ3VhcmFudGVlZClcbiAgICAgKi9cbiAgICB2YXIgZm9yT3duID0gY3JlYXRlRm9yT3duKGJhc2VGb3JPd24pO1xuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5mb3JPd25gIGV4Y2VwdCB0aGF0IGl0IGl0ZXJhdGVzIG92ZXIgcHJvcGVydGllcyBvZlxuICAgICAqIGBvYmplY3RgIGluIHRoZSBvcHBvc2l0ZSBvcmRlci5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEBwYXJhbSB7Kn0gW3RoaXNBcmddIFRoZSBgdGhpc2AgYmluZGluZyBvZiBgaXRlcmF0ZWVgLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIEZvbygpIHtcbiAgICAgKiAgIHRoaXMuYSA9IDE7XG4gICAgICogICB0aGlzLmIgPSAyO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIEZvby5wcm90b3R5cGUuYyA9IDM7XG4gICAgICpcbiAgICAgKiBfLmZvck93blJpZ2h0KG5ldyBGb28sIGZ1bmN0aW9uKHZhbHVlLCBrZXkpIHtcbiAgICAgKiAgIGNvbnNvbGUubG9nKGtleSk7XG4gICAgICogfSk7XG4gICAgICogLy8gPT4gbG9ncyAnYicgYW5kICdhJyBhc3N1bWluZyBgXy5mb3JPd25gIGxvZ3MgJ2EnIGFuZCAnYidcbiAgICAgKi9cbiAgICB2YXIgZm9yT3duUmlnaHQgPSBjcmVhdGVGb3JPd24oYmFzZUZvck93blJpZ2h0KTtcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gYXJyYXkgb2YgZnVuY3Rpb24gcHJvcGVydHkgbmFtZXMgZnJvbSBhbGwgZW51bWVyYWJsZSBwcm9wZXJ0aWVzLFxuICAgICAqIG93biBhbmQgaW5oZXJpdGVkLCBvZiBgb2JqZWN0YC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBhbGlhcyBtZXRob2RzXG4gICAgICogQGNhdGVnb3J5IE9iamVjdFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBpbnNwZWN0LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGFycmF5IG9mIHByb3BlcnR5IG5hbWVzLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmZ1bmN0aW9ucyhfKTtcbiAgICAgKiAvLyA9PiBbJ2FmdGVyJywgJ2FyeScsICdhc3NpZ24nLCAuLi5dXG4gICAgICovXG4gICAgZnVuY3Rpb24gZnVuY3Rpb25zKG9iamVjdCkge1xuICAgICAgcmV0dXJuIGJhc2VGdW5jdGlvbnMob2JqZWN0LCBrZXlzSW4ob2JqZWN0KSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgcHJvcGVydHkgdmFsdWUgYXQgYHBhdGhgIG9mIGBvYmplY3RgLiBJZiB0aGUgcmVzb2x2ZWQgdmFsdWUgaXNcbiAgICAgKiBgdW5kZWZpbmVkYCB0aGUgYGRlZmF1bHRWYWx1ZWAgaXMgdXNlZCBpbiBpdHMgcGxhY2UuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0XG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICAgICAqIEBwYXJhbSB7QXJyYXl8c3RyaW5nfSBwYXRoIFRoZSBwYXRoIG9mIHRoZSBwcm9wZXJ0eSB0byBnZXQuXG4gICAgICogQHBhcmFtIHsqfSBbZGVmYXVsdFZhbHVlXSBUaGUgdmFsdWUgcmV0dXJuZWQgaWYgdGhlIHJlc29sdmVkIHZhbHVlIGlzIGB1bmRlZmluZWRgLlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSByZXNvbHZlZCB2YWx1ZS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIG9iamVjdCA9IHsgJ2EnOiBbeyAnYic6IHsgJ2MnOiAzIH0gfV0gfTtcbiAgICAgKlxuICAgICAqIF8uZ2V0KG9iamVjdCwgJ2FbMF0uYi5jJyk7XG4gICAgICogLy8gPT4gM1xuICAgICAqXG4gICAgICogXy5nZXQob2JqZWN0LCBbJ2EnLCAnMCcsICdiJywgJ2MnXSk7XG4gICAgICogLy8gPT4gM1xuICAgICAqXG4gICAgICogXy5nZXQob2JqZWN0LCAnYS5iLmMnLCAnZGVmYXVsdCcpO1xuICAgICAqIC8vID0+ICdkZWZhdWx0J1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIGdldChvYmplY3QsIHBhdGgsIGRlZmF1bHRWYWx1ZSkge1xuICAgICAgdmFyIHJlc3VsdCA9IG9iamVjdCA9PSBudWxsID8gdW5kZWZpbmVkIDogYmFzZUdldChvYmplY3QsIHRvUGF0aChwYXRoKSwgcGF0aCArICcnKTtcbiAgICAgIHJldHVybiByZXN1bHQgPT09IHVuZGVmaW5lZCA/IGRlZmF1bHRWYWx1ZSA6IHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHBhdGhgIGlzIGEgZGlyZWN0IHByb3BlcnR5LlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IE9iamVjdFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAgICAgKiBAcGFyYW0ge0FycmF5fHN0cmluZ30gcGF0aCBUaGUgcGF0aCB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHBhdGhgIGlzIGEgZGlyZWN0IHByb3BlcnR5LCBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBvYmplY3QgPSB7ICdhJzogeyAnYic6IHsgJ2MnOiAzIH0gfSB9O1xuICAgICAqXG4gICAgICogXy5oYXMob2JqZWN0LCAnYScpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaGFzKG9iamVjdCwgJ2EuYi5jJyk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5oYXMob2JqZWN0LCBbJ2EnLCAnYicsICdjJ10pO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBoYXMob2JqZWN0LCBwYXRoKSB7XG4gICAgICBpZiAob2JqZWN0ID09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgdmFyIHJlc3VsdCA9IGhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBwYXRoKTtcbiAgICAgIGlmICghcmVzdWx0ICYmICFpc0tleShwYXRoKSkge1xuICAgICAgICBwYXRoID0gdG9QYXRoKHBhdGgpO1xuICAgICAgICBvYmplY3QgPSBwYXRoLmxlbmd0aCA9PSAxID8gb2JqZWN0IDogYmFzZUdldChvYmplY3QsIGJhc2VTbGljZShwYXRoLCAwLCAtMSkpO1xuICAgICAgICBpZiAob2JqZWN0ID09IG51bGwpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcGF0aCA9IGxhc3QocGF0aCk7XG4gICAgICAgIHJlc3VsdCA9IGhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBwYXRoKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQgfHwgKGlzTGVuZ3RoKG9iamVjdC5sZW5ndGgpICYmIGlzSW5kZXgocGF0aCwgb2JqZWN0Lmxlbmd0aCkgJiZcbiAgICAgICAgKGlzQXJyYXkob2JqZWN0KSB8fCBpc0FyZ3VtZW50cyhvYmplY3QpKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBvYmplY3QgY29tcG9zZWQgb2YgdGhlIGludmVydGVkIGtleXMgYW5kIHZhbHVlcyBvZiBgb2JqZWN0YC5cbiAgICAgKiBJZiBgb2JqZWN0YCBjb250YWlucyBkdXBsaWNhdGUgdmFsdWVzLCBzdWJzZXF1ZW50IHZhbHVlcyBvdmVyd3JpdGUgcHJvcGVydHlcbiAgICAgKiBhc3NpZ25tZW50cyBvZiBwcmV2aW91cyB2YWx1ZXMgdW5sZXNzIGBtdWx0aVZhbHVlYCBpcyBgdHJ1ZWAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0XG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGludmVydC5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFttdWx0aVZhbHVlXSBBbGxvdyBtdWx0aXBsZSB2YWx1ZXMgcGVyIGtleS5cbiAgICAgKiBAcGFyYW0tIHtPYmplY3R9IFtndWFyZF0gRW5hYmxlcyB1c2UgYXMgYSBjYWxsYmFjayBmb3IgZnVuY3Rpb25zIGxpa2UgYF8ubWFwYC5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBuZXcgaW52ZXJ0ZWQgb2JqZWN0LlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0ID0geyAnYSc6IDEsICdiJzogMiwgJ2MnOiAxIH07XG4gICAgICpcbiAgICAgKiBfLmludmVydChvYmplY3QpO1xuICAgICAqIC8vID0+IHsgJzEnOiAnYycsICcyJzogJ2InIH1cbiAgICAgKlxuICAgICAqIC8vIHdpdGggYG11bHRpVmFsdWVgXG4gICAgICogXy5pbnZlcnQob2JqZWN0LCB0cnVlKTtcbiAgICAgKiAvLyA9PiB7ICcxJzogWydhJywgJ2MnXSwgJzInOiBbJ2InXSB9XG4gICAgICovXG4gICAgZnVuY3Rpb24gaW52ZXJ0KG9iamVjdCwgbXVsdGlWYWx1ZSwgZ3VhcmQpIHtcbiAgICAgIGlmIChndWFyZCAmJiBpc0l0ZXJhdGVlQ2FsbChvYmplY3QsIG11bHRpVmFsdWUsIGd1YXJkKSkge1xuICAgICAgICBtdWx0aVZhbHVlID0gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgICAgcHJvcHMgPSBrZXlzKG9iamVjdCksXG4gICAgICAgICAgbGVuZ3RoID0gcHJvcHMubGVuZ3RoLFxuICAgICAgICAgIHJlc3VsdCA9IHt9O1xuXG4gICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICB2YXIga2V5ID0gcHJvcHNbaW5kZXhdLFxuICAgICAgICAgICAgdmFsdWUgPSBvYmplY3Rba2V5XTtcblxuICAgICAgICBpZiAobXVsdGlWYWx1ZSkge1xuICAgICAgICAgIGlmIChoYXNPd25Qcm9wZXJ0eS5jYWxsKHJlc3VsdCwgdmFsdWUpKSB7XG4gICAgICAgICAgICByZXN1bHRbdmFsdWVdLnB1c2goa2V5KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmVzdWx0W3ZhbHVlXSA9IFtrZXldO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICByZXN1bHRbdmFsdWVdID0ga2V5O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gYXJyYXkgb2YgdGhlIG93biBlbnVtZXJhYmxlIHByb3BlcnR5IG5hbWVzIG9mIGBvYmplY3RgLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIE5vbi1vYmplY3QgdmFsdWVzIGFyZSBjb2VyY2VkIHRvIG9iamVjdHMuIFNlZSB0aGVcbiAgICAgKiBbRVMgc3BlY10oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNi4wLyNzZWMtb2JqZWN0LmtleXMpXG4gICAgICogZm9yIG1vcmUgZGV0YWlscy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBhcnJheSBvZiBwcm9wZXJ0eSBuYW1lcy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gRm9vKCkge1xuICAgICAqICAgdGhpcy5hID0gMTtcbiAgICAgKiAgIHRoaXMuYiA9IDI7XG4gICAgICogfVxuICAgICAqXG4gICAgICogRm9vLnByb3RvdHlwZS5jID0gMztcbiAgICAgKlxuICAgICAqIF8ua2V5cyhuZXcgRm9vKTtcbiAgICAgKiAvLyA9PiBbJ2EnLCAnYiddIChpdGVyYXRpb24gb3JkZXIgaXMgbm90IGd1YXJhbnRlZWQpXG4gICAgICpcbiAgICAgKiBfLmtleXMoJ2hpJyk7XG4gICAgICogLy8gPT4gWycwJywgJzEnXVxuICAgICAqL1xuICAgIHZhciBrZXlzID0gIW5hdGl2ZUtleXMgPyBzaGltS2V5cyA6IGZ1bmN0aW9uKG9iamVjdCkge1xuICAgICAgdmFyIEN0b3IgPSBvYmplY3QgPT0gbnVsbCA/IHVuZGVmaW5lZCA6IG9iamVjdC5jb25zdHJ1Y3RvcjtcbiAgICAgIGlmICgodHlwZW9mIEN0b3IgPT0gJ2Z1bmN0aW9uJyAmJiBDdG9yLnByb3RvdHlwZSA9PT0gb2JqZWN0KSB8fFxuICAgICAgICAgICh0eXBlb2Ygb2JqZWN0ICE9ICdmdW5jdGlvbicgJiYgaXNBcnJheUxpa2Uob2JqZWN0KSkpIHtcbiAgICAgICAgcmV0dXJuIHNoaW1LZXlzKG9iamVjdCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gaXNPYmplY3Qob2JqZWN0KSA/IG5hdGl2ZUtleXMob2JqZWN0KSA6IFtdO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGFycmF5IG9mIHRoZSBvd24gYW5kIGluaGVyaXRlZCBlbnVtZXJhYmxlIHByb3BlcnR5IG5hbWVzIG9mIGBvYmplY3RgLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIE5vbi1vYmplY3QgdmFsdWVzIGFyZSBjb2VyY2VkIHRvIG9iamVjdHMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0XG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgYXJyYXkgb2YgcHJvcGVydHkgbmFtZXMuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIEZvbygpIHtcbiAgICAgKiAgIHRoaXMuYSA9IDE7XG4gICAgICogICB0aGlzLmIgPSAyO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIEZvby5wcm90b3R5cGUuYyA9IDM7XG4gICAgICpcbiAgICAgKiBfLmtleXNJbihuZXcgRm9vKTtcbiAgICAgKiAvLyA9PiBbJ2EnLCAnYicsICdjJ10gKGl0ZXJhdGlvbiBvcmRlciBpcyBub3QgZ3VhcmFudGVlZClcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBrZXlzSW4ob2JqZWN0KSB7XG4gICAgICBpZiAob2JqZWN0ID09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgfVxuICAgICAgaWYgKCFpc09iamVjdChvYmplY3QpKSB7XG4gICAgICAgIG9iamVjdCA9IE9iamVjdChvYmplY3QpO1xuICAgICAgfVxuICAgICAgdmFyIGxlbmd0aCA9IG9iamVjdC5sZW5ndGg7XG4gICAgICBsZW5ndGggPSAobGVuZ3RoICYmIGlzTGVuZ3RoKGxlbmd0aCkgJiZcbiAgICAgICAgKGlzQXJyYXkob2JqZWN0KSB8fCBpc0FyZ3VtZW50cyhvYmplY3QpKSAmJiBsZW5ndGgpIHx8IDA7XG5cbiAgICAgIHZhciBDdG9yID0gb2JqZWN0LmNvbnN0cnVjdG9yLFxuICAgICAgICAgIGluZGV4ID0gLTEsXG4gICAgICAgICAgaXNQcm90byA9IHR5cGVvZiBDdG9yID09ICdmdW5jdGlvbicgJiYgQ3Rvci5wcm90b3R5cGUgPT09IG9iamVjdCxcbiAgICAgICAgICByZXN1bHQgPSBBcnJheShsZW5ndGgpLFxuICAgICAgICAgIHNraXBJbmRleGVzID0gbGVuZ3RoID4gMDtcblxuICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgcmVzdWx0W2luZGV4XSA9IChpbmRleCArICcnKTtcbiAgICAgIH1cbiAgICAgIGZvciAodmFyIGtleSBpbiBvYmplY3QpIHtcbiAgICAgICAgaWYgKCEoc2tpcEluZGV4ZXMgJiYgaXNJbmRleChrZXksIGxlbmd0aCkpICYmXG4gICAgICAgICAgICAhKGtleSA9PSAnY29uc3RydWN0b3InICYmIChpc1Byb3RvIHx8ICFoYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwga2V5KSkpKSB7XG4gICAgICAgICAgcmVzdWx0LnB1c2goa2V5KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgb3Bwb3NpdGUgb2YgYF8ubWFwVmFsdWVzYDsgdGhpcyBtZXRob2QgY3JlYXRlcyBhbiBvYmplY3Qgd2l0aCB0aGVcbiAgICAgKiBzYW1lIHZhbHVlcyBhcyBgb2JqZWN0YCBhbmQga2V5cyBnZW5lcmF0ZWQgYnkgcnVubmluZyBlYWNoIG93biBlbnVtZXJhYmxlXG4gICAgICogcHJvcGVydHkgb2YgYG9iamVjdGAgdGhyb3VnaCBgaXRlcmF0ZWVgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IE9iamVjdFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbnxPYmplY3R8c3RyaW5nfSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWRcbiAgICAgKiAgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcGFyYW0geyp9IFt0aGlzQXJnXSBUaGUgYHRoaXNgIGJpbmRpbmcgb2YgYGl0ZXJhdGVlYC5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBuZXcgbWFwcGVkIG9iamVjdC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5tYXBLZXlzKHsgJ2EnOiAxLCAnYic6IDIgfSwgZnVuY3Rpb24odmFsdWUsIGtleSkge1xuICAgICAqICAgcmV0dXJuIGtleSArIHZhbHVlO1xuICAgICAqIH0pO1xuICAgICAqIC8vID0+IHsgJ2ExJzogMSwgJ2IyJzogMiB9XG4gICAgICovXG4gICAgdmFyIG1hcEtleXMgPSBjcmVhdGVPYmplY3RNYXBwZXIodHJ1ZSk7XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIG9iamVjdCB3aXRoIHRoZSBzYW1lIGtleXMgYXMgYG9iamVjdGAgYW5kIHZhbHVlcyBnZW5lcmF0ZWQgYnlcbiAgICAgKiBydW5uaW5nIGVhY2ggb3duIGVudW1lcmFibGUgcHJvcGVydHkgb2YgYG9iamVjdGAgdGhyb3VnaCBgaXRlcmF0ZWVgLiBUaGVcbiAgICAgKiBpdGVyYXRlZSBmdW5jdGlvbiBpcyBib3VuZCB0byBgdGhpc0FyZ2AgYW5kIGludm9rZWQgd2l0aCB0aHJlZSBhcmd1bWVudHM6XG4gICAgICogKHZhbHVlLCBrZXksIG9iamVjdCkuXG4gICAgICpcbiAgICAgKiBJZiBhIHByb3BlcnR5IG5hbWUgaXMgcHJvdmlkZWQgZm9yIGBpdGVyYXRlZWAgdGhlIGNyZWF0ZWQgYF8ucHJvcGVydHlgXG4gICAgICogc3R5bGUgY2FsbGJhY2sgcmV0dXJucyB0aGUgcHJvcGVydHkgdmFsdWUgb2YgdGhlIGdpdmVuIGVsZW1lbnQuXG4gICAgICpcbiAgICAgKiBJZiBhIHZhbHVlIGlzIGFsc28gcHJvdmlkZWQgZm9yIGB0aGlzQXJnYCB0aGUgY3JlYXRlZCBgXy5tYXRjaGVzUHJvcGVydHlgXG4gICAgICogc3R5bGUgY2FsbGJhY2sgcmV0dXJucyBgdHJ1ZWAgZm9yIGVsZW1lbnRzIHRoYXQgaGF2ZSBhIG1hdGNoaW5nIHByb3BlcnR5XG4gICAgICogdmFsdWUsIGVsc2UgYGZhbHNlYC5cbiAgICAgKlxuICAgICAqIElmIGFuIG9iamVjdCBpcyBwcm92aWRlZCBmb3IgYGl0ZXJhdGVlYCB0aGUgY3JlYXRlZCBgXy5tYXRjaGVzYCBzdHlsZVxuICAgICAqIGNhbGxiYWNrIHJldHVybnMgYHRydWVgIGZvciBlbGVtZW50cyB0aGF0IGhhdmUgdGhlIHByb3BlcnRpZXMgb2YgdGhlIGdpdmVuXG4gICAgICogb2JqZWN0LCBlbHNlIGBmYWxzZWAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0XG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufE9iamVjdHxzdHJpbmd9IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZFxuICAgICAqICBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEBwYXJhbSB7Kn0gW3RoaXNBcmddIFRoZSBgdGhpc2AgYmluZGluZyBvZiBgaXRlcmF0ZWVgLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIG5ldyBtYXBwZWQgb2JqZWN0LlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLm1hcFZhbHVlcyh7ICdhJzogMSwgJ2InOiAyIH0sIGZ1bmN0aW9uKG4pIHtcbiAgICAgKiAgIHJldHVybiBuICogMztcbiAgICAgKiB9KTtcbiAgICAgKiAvLyA9PiB7ICdhJzogMywgJ2InOiA2IH1cbiAgICAgKlxuICAgICAqIHZhciB1c2VycyA9IHtcbiAgICAgKiAgICdmcmVkJzogICAgeyAndXNlcic6ICdmcmVkJywgICAgJ2FnZSc6IDQwIH0sXG4gICAgICogICAncGViYmxlcyc6IHsgJ3VzZXInOiAncGViYmxlcycsICdhZ2UnOiAxIH1cbiAgICAgKiB9O1xuICAgICAqXG4gICAgICogLy8gdXNpbmcgdGhlIGBfLnByb3BlcnR5YCBjYWxsYmFjayBzaG9ydGhhbmRcbiAgICAgKiBfLm1hcFZhbHVlcyh1c2VycywgJ2FnZScpO1xuICAgICAqIC8vID0+IHsgJ2ZyZWQnOiA0MCwgJ3BlYmJsZXMnOiAxIH0gKGl0ZXJhdGlvbiBvcmRlciBpcyBub3QgZ3VhcmFudGVlZClcbiAgICAgKi9cbiAgICB2YXIgbWFwVmFsdWVzID0gY3JlYXRlT2JqZWN0TWFwcGVyKCk7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgb3Bwb3NpdGUgb2YgYF8ucGlja2A7IHRoaXMgbWV0aG9kIGNyZWF0ZXMgYW4gb2JqZWN0IGNvbXBvc2VkIG9mIHRoZVxuICAgICAqIG93biBhbmQgaW5oZXJpdGVkIGVudW1lcmFibGUgcHJvcGVydGllcyBvZiBgb2JqZWN0YCB0aGF0IGFyZSBub3Qgb21pdHRlZC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBzb3VyY2Ugb2JqZWN0LlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb258Li4uKHN0cmluZ3xzdHJpbmdbXSl9IFtwcmVkaWNhdGVdIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlclxuICAgICAqICBpdGVyYXRpb24gb3IgcHJvcGVydHkgbmFtZXMgdG8gb21pdCwgc3BlY2lmaWVkIGFzIGluZGl2aWR1YWwgcHJvcGVydHlcbiAgICAgKiAgbmFtZXMgb3IgYXJyYXlzIG9mIHByb3BlcnR5IG5hbWVzLlxuICAgICAqIEBwYXJhbSB7Kn0gW3RoaXNBcmddIFRoZSBgdGhpc2AgYmluZGluZyBvZiBgcHJlZGljYXRlYC5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBuZXcgb2JqZWN0LlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0ID0geyAndXNlcic6ICdmcmVkJywgJ2FnZSc6IDQwIH07XG4gICAgICpcbiAgICAgKiBfLm9taXQob2JqZWN0LCAnYWdlJyk7XG4gICAgICogLy8gPT4geyAndXNlcic6ICdmcmVkJyB9XG4gICAgICpcbiAgICAgKiBfLm9taXQob2JqZWN0LCBfLmlzTnVtYmVyKTtcbiAgICAgKiAvLyA9PiB7ICd1c2VyJzogJ2ZyZWQnIH1cbiAgICAgKi9cbiAgICB2YXIgb21pdCA9IHJlc3RQYXJhbShmdW5jdGlvbihvYmplY3QsIHByb3BzKSB7XG4gICAgICBpZiAob2JqZWN0ID09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIHt9O1xuICAgICAgfVxuICAgICAgaWYgKHR5cGVvZiBwcm9wc1swXSAhPSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHZhciBwcm9wcyA9IGFycmF5TWFwKGJhc2VGbGF0dGVuKHByb3BzKSwgU3RyaW5nKTtcbiAgICAgICAgcmV0dXJuIHBpY2tCeUFycmF5KG9iamVjdCwgYmFzZURpZmZlcmVuY2Uoa2V5c0luKG9iamVjdCksIHByb3BzKSk7XG4gICAgICB9XG4gICAgICB2YXIgcHJlZGljYXRlID0gYmluZENhbGxiYWNrKHByb3BzWzBdLCBwcm9wc1sxXSwgMyk7XG4gICAgICByZXR1cm4gcGlja0J5Q2FsbGJhY2sob2JqZWN0LCBmdW5jdGlvbih2YWx1ZSwga2V5LCBvYmplY3QpIHtcbiAgICAgICAgcmV0dXJuICFwcmVkaWNhdGUodmFsdWUsIGtleSwgb2JqZWN0KTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIHR3byBkaW1lbnNpb25hbCBhcnJheSBvZiB0aGUga2V5LXZhbHVlIHBhaXJzIGZvciBgb2JqZWN0YCxcbiAgICAgKiBlLmcuIGBbW2tleTEsIHZhbHVlMV0sIFtrZXkyLCB2YWx1ZTJdXWAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0XG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGFycmF5IG9mIGtleS12YWx1ZSBwYWlycy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5wYWlycyh7ICdiYXJuZXknOiAzNiwgJ2ZyZWQnOiA0MCB9KTtcbiAgICAgKiAvLyA9PiBbWydiYXJuZXknLCAzNl0sIFsnZnJlZCcsIDQwXV0gKGl0ZXJhdGlvbiBvcmRlciBpcyBub3QgZ3VhcmFudGVlZClcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBwYWlycyhvYmplY3QpIHtcbiAgICAgIG9iamVjdCA9IHRvT2JqZWN0KG9iamVjdCk7XG5cbiAgICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICAgIHByb3BzID0ga2V5cyhvYmplY3QpLFxuICAgICAgICAgIGxlbmd0aCA9IHByb3BzLmxlbmd0aCxcbiAgICAgICAgICByZXN1bHQgPSBBcnJheShsZW5ndGgpO1xuXG4gICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICB2YXIga2V5ID0gcHJvcHNbaW5kZXhdO1xuICAgICAgICByZXN1bHRbaW5kZXhdID0gW2tleSwgb2JqZWN0W2tleV1dO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIG9iamVjdCBjb21wb3NlZCBvZiB0aGUgcGlja2VkIGBvYmplY3RgIHByb3BlcnRpZXMuIFByb3BlcnR5XG4gICAgICogbmFtZXMgbWF5IGJlIHNwZWNpZmllZCBhcyBpbmRpdmlkdWFsIGFyZ3VtZW50cyBvciBhcyBhcnJheXMgb2YgcHJvcGVydHlcbiAgICAgKiBuYW1lcy4gSWYgYHByZWRpY2F0ZWAgaXMgcHJvdmlkZWQgaXQgaXMgaW52b2tlZCBmb3IgZWFjaCBwcm9wZXJ0eSBvZiBgb2JqZWN0YFxuICAgICAqIHBpY2tpbmcgdGhlIHByb3BlcnRpZXMgYHByZWRpY2F0ZWAgcmV0dXJucyB0cnV0aHkgZm9yLiBUaGUgcHJlZGljYXRlIGlzXG4gICAgICogYm91bmQgdG8gYHRoaXNBcmdgIGFuZCBpbnZva2VkIHdpdGggdGhyZWUgYXJndW1lbnRzOiAodmFsdWUsIGtleSwgb2JqZWN0KS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBzb3VyY2Ugb2JqZWN0LlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb258Li4uKHN0cmluZ3xzdHJpbmdbXSl9IFtwcmVkaWNhdGVdIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlclxuICAgICAqICBpdGVyYXRpb24gb3IgcHJvcGVydHkgbmFtZXMgdG8gcGljaywgc3BlY2lmaWVkIGFzIGluZGl2aWR1YWwgcHJvcGVydHlcbiAgICAgKiAgbmFtZXMgb3IgYXJyYXlzIG9mIHByb3BlcnR5IG5hbWVzLlxuICAgICAqIEBwYXJhbSB7Kn0gW3RoaXNBcmddIFRoZSBgdGhpc2AgYmluZGluZyBvZiBgcHJlZGljYXRlYC5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBuZXcgb2JqZWN0LlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0ID0geyAndXNlcic6ICdmcmVkJywgJ2FnZSc6IDQwIH07XG4gICAgICpcbiAgICAgKiBfLnBpY2sob2JqZWN0LCAndXNlcicpO1xuICAgICAqIC8vID0+IHsgJ3VzZXInOiAnZnJlZCcgfVxuICAgICAqXG4gICAgICogXy5waWNrKG9iamVjdCwgXy5pc1N0cmluZyk7XG4gICAgICogLy8gPT4geyAndXNlcic6ICdmcmVkJyB9XG4gICAgICovXG4gICAgdmFyIHBpY2sgPSByZXN0UGFyYW0oZnVuY3Rpb24ob2JqZWN0LCBwcm9wcykge1xuICAgICAgaWYgKG9iamVjdCA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybiB7fTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0eXBlb2YgcHJvcHNbMF0gPT0gJ2Z1bmN0aW9uJ1xuICAgICAgICA/IHBpY2tCeUNhbGxiYWNrKG9iamVjdCwgYmluZENhbGxiYWNrKHByb3BzWzBdLCBwcm9wc1sxXSwgMykpXG4gICAgICAgIDogcGlja0J5QXJyYXkob2JqZWN0LCBiYXNlRmxhdHRlbihwcm9wcykpO1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5nZXRgIGV4Y2VwdCB0aGF0IGlmIHRoZSByZXNvbHZlZCB2YWx1ZSBpcyBhIGZ1bmN0aW9uXG4gICAgICogaXQgaXMgaW52b2tlZCB3aXRoIHRoZSBgdGhpc2AgYmluZGluZyBvZiBpdHMgcGFyZW50IG9iamVjdCBhbmQgaXRzIHJlc3VsdFxuICAgICAqIGlzIHJldHVybmVkLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IE9iamVjdFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAgICAgKiBAcGFyYW0ge0FycmF5fHN0cmluZ30gcGF0aCBUaGUgcGF0aCBvZiB0aGUgcHJvcGVydHkgdG8gcmVzb2x2ZS5cbiAgICAgKiBAcGFyYW0geyp9IFtkZWZhdWx0VmFsdWVdIFRoZSB2YWx1ZSByZXR1cm5lZCBpZiB0aGUgcmVzb2x2ZWQgdmFsdWUgaXMgYHVuZGVmaW5lZGAuXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIHJlc29sdmVkIHZhbHVlLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0ID0geyAnYSc6IFt7ICdiJzogeyAnYzEnOiAzLCAnYzInOiBfLmNvbnN0YW50KDQpIH0gfV0gfTtcbiAgICAgKlxuICAgICAqIF8ucmVzdWx0KG9iamVjdCwgJ2FbMF0uYi5jMScpO1xuICAgICAqIC8vID0+IDNcbiAgICAgKlxuICAgICAqIF8ucmVzdWx0KG9iamVjdCwgJ2FbMF0uYi5jMicpO1xuICAgICAqIC8vID0+IDRcbiAgICAgKlxuICAgICAqIF8ucmVzdWx0KG9iamVjdCwgJ2EuYi5jJywgJ2RlZmF1bHQnKTtcbiAgICAgKiAvLyA9PiAnZGVmYXVsdCdcbiAgICAgKlxuICAgICAqIF8ucmVzdWx0KG9iamVjdCwgJ2EuYi5jJywgXy5jb25zdGFudCgnZGVmYXVsdCcpKTtcbiAgICAgKiAvLyA9PiAnZGVmYXVsdCdcbiAgICAgKi9cbiAgICBmdW5jdGlvbiByZXN1bHQob2JqZWN0LCBwYXRoLCBkZWZhdWx0VmFsdWUpIHtcbiAgICAgIHZhciByZXN1bHQgPSBvYmplY3QgPT0gbnVsbCA/IHVuZGVmaW5lZCA6IG9iamVjdFtwYXRoXTtcbiAgICAgIGlmIChyZXN1bHQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBpZiAob2JqZWN0ICE9IG51bGwgJiYgIWlzS2V5KHBhdGgsIG9iamVjdCkpIHtcbiAgICAgICAgICBwYXRoID0gdG9QYXRoKHBhdGgpO1xuICAgICAgICAgIG9iamVjdCA9IHBhdGgubGVuZ3RoID09IDEgPyBvYmplY3QgOiBiYXNlR2V0KG9iamVjdCwgYmFzZVNsaWNlKHBhdGgsIDAsIC0xKSk7XG4gICAgICAgICAgcmVzdWx0ID0gb2JqZWN0ID09IG51bGwgPyB1bmRlZmluZWQgOiBvYmplY3RbbGFzdChwYXRoKV07XG4gICAgICAgIH1cbiAgICAgICAgcmVzdWx0ID0gcmVzdWx0ID09PSB1bmRlZmluZWQgPyBkZWZhdWx0VmFsdWUgOiByZXN1bHQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gaXNGdW5jdGlvbihyZXN1bHQpID8gcmVzdWx0LmNhbGwob2JqZWN0KSA6IHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBwcm9wZXJ0eSB2YWx1ZSBvZiBgcGF0aGAgb24gYG9iamVjdGAuIElmIGEgcG9ydGlvbiBvZiBgcGF0aGBcbiAgICAgKiBkb2VzIG5vdCBleGlzdCBpdCBpcyBjcmVhdGVkLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IE9iamVjdFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBhdWdtZW50LlxuICAgICAqIEBwYXJhbSB7QXJyYXl8c3RyaW5nfSBwYXRoIFRoZSBwYXRoIG9mIHRoZSBwcm9wZXJ0eSB0byBzZXQuXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gc2V0LlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBvYmplY3QgPSB7ICdhJzogW3sgJ2InOiB7ICdjJzogMyB9IH1dIH07XG4gICAgICpcbiAgICAgKiBfLnNldChvYmplY3QsICdhWzBdLmIuYycsIDQpO1xuICAgICAqIGNvbnNvbGUubG9nKG9iamVjdC5hWzBdLmIuYyk7XG4gICAgICogLy8gPT4gNFxuICAgICAqXG4gICAgICogXy5zZXQob2JqZWN0LCAneFswXS55LnonLCA1KTtcbiAgICAgKiBjb25zb2xlLmxvZyhvYmplY3QueFswXS55LnopO1xuICAgICAqIC8vID0+IDVcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzZXQob2JqZWN0LCBwYXRoLCB2YWx1ZSkge1xuICAgICAgaWYgKG9iamVjdCA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybiBvYmplY3Q7XG4gICAgICB9XG4gICAgICB2YXIgcGF0aEtleSA9IChwYXRoICsgJycpO1xuICAgICAgcGF0aCA9IChvYmplY3RbcGF0aEtleV0gIT0gbnVsbCB8fCBpc0tleShwYXRoLCBvYmplY3QpKSA/IFtwYXRoS2V5XSA6IHRvUGF0aChwYXRoKTtcblxuICAgICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgICAgbGVuZ3RoID0gcGF0aC5sZW5ndGgsXG4gICAgICAgICAgbGFzdEluZGV4ID0gbGVuZ3RoIC0gMSxcbiAgICAgICAgICBuZXN0ZWQgPSBvYmplY3Q7XG5cbiAgICAgIHdoaWxlIChuZXN0ZWQgIT0gbnVsbCAmJiArK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgIHZhciBrZXkgPSBwYXRoW2luZGV4XTtcbiAgICAgICAgaWYgKGlzT2JqZWN0KG5lc3RlZCkpIHtcbiAgICAgICAgICBpZiAoaW5kZXggPT0gbGFzdEluZGV4KSB7XG4gICAgICAgICAgICBuZXN0ZWRba2V5XSA9IHZhbHVlO1xuICAgICAgICAgIH0gZWxzZSBpZiAobmVzdGVkW2tleV0gPT0gbnVsbCkge1xuICAgICAgICAgICAgbmVzdGVkW2tleV0gPSBpc0luZGV4KHBhdGhbaW5kZXggKyAxXSkgPyBbXSA6IHt9O1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBuZXN0ZWQgPSBuZXN0ZWRba2V5XTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBvYmplY3Q7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQW4gYWx0ZXJuYXRpdmUgdG8gYF8ucmVkdWNlYDsgdGhpcyBtZXRob2QgdHJhbnNmb3JtcyBgb2JqZWN0YCB0byBhIG5ld1xuICAgICAqIGBhY2N1bXVsYXRvcmAgb2JqZWN0IHdoaWNoIGlzIHRoZSByZXN1bHQgb2YgcnVubmluZyBlYWNoIG9mIGl0cyBvd24gZW51bWVyYWJsZVxuICAgICAqIHByb3BlcnRpZXMgdGhyb3VnaCBgaXRlcmF0ZWVgLCB3aXRoIGVhY2ggaW52b2NhdGlvbiBwb3RlbnRpYWxseSBtdXRhdGluZ1xuICAgICAqIHRoZSBgYWNjdW11bGF0b3JgIG9iamVjdC4gVGhlIGBpdGVyYXRlZWAgaXMgYm91bmQgdG8gYHRoaXNBcmdgIGFuZCBpbnZva2VkXG4gICAgICogd2l0aCBmb3VyIGFyZ3VtZW50czogKGFjY3VtdWxhdG9yLCB2YWx1ZSwga2V5LCBvYmplY3QpLiBJdGVyYXRlZSBmdW5jdGlvbnNcbiAgICAgKiBtYXkgZXhpdCBpdGVyYXRpb24gZWFybHkgYnkgZXhwbGljaXRseSByZXR1cm5pbmcgYGZhbHNlYC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEBwYXJhbSB7Kn0gW2FjY3VtdWxhdG9yXSBUaGUgY3VzdG9tIGFjY3VtdWxhdG9yIHZhbHVlLlxuICAgICAqIEBwYXJhbSB7Kn0gW3RoaXNBcmddIFRoZSBgdGhpc2AgYmluZGluZyBvZiBgaXRlcmF0ZWVgLlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBhY2N1bXVsYXRlZCB2YWx1ZS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy50cmFuc2Zvcm0oWzIsIDMsIDRdLCBmdW5jdGlvbihyZXN1bHQsIG4pIHtcbiAgICAgKiAgIHJlc3VsdC5wdXNoKG4gKj0gbik7XG4gICAgICogICByZXR1cm4gbiAlIDIgPT0gMDtcbiAgICAgKiB9KTtcbiAgICAgKiAvLyA9PiBbNCwgOV1cbiAgICAgKlxuICAgICAqIF8udHJhbnNmb3JtKHsgJ2EnOiAxLCAnYic6IDIgfSwgZnVuY3Rpb24ocmVzdWx0LCBuLCBrZXkpIHtcbiAgICAgKiAgIHJlc3VsdFtrZXldID0gbiAqIDM7XG4gICAgICogfSk7XG4gICAgICogLy8gPT4geyAnYSc6IDMsICdiJzogNiB9XG4gICAgICovXG4gICAgZnVuY3Rpb24gdHJhbnNmb3JtKG9iamVjdCwgaXRlcmF0ZWUsIGFjY3VtdWxhdG9yLCB0aGlzQXJnKSB7XG4gICAgICB2YXIgaXNBcnIgPSBpc0FycmF5KG9iamVjdCkgfHwgaXNUeXBlZEFycmF5KG9iamVjdCk7XG4gICAgICBpdGVyYXRlZSA9IGdldENhbGxiYWNrKGl0ZXJhdGVlLCB0aGlzQXJnLCA0KTtcblxuICAgICAgaWYgKGFjY3VtdWxhdG9yID09IG51bGwpIHtcbiAgICAgICAgaWYgKGlzQXJyIHx8IGlzT2JqZWN0KG9iamVjdCkpIHtcbiAgICAgICAgICB2YXIgQ3RvciA9IG9iamVjdC5jb25zdHJ1Y3RvcjtcbiAgICAgICAgICBpZiAoaXNBcnIpIHtcbiAgICAgICAgICAgIGFjY3VtdWxhdG9yID0gaXNBcnJheShvYmplY3QpID8gbmV3IEN0b3IgOiBbXTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgYWNjdW11bGF0b3IgPSBiYXNlQ3JlYXRlKGlzRnVuY3Rpb24oQ3RvcikgPyBDdG9yLnByb3RvdHlwZSA6IHVuZGVmaW5lZCk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGFjY3VtdWxhdG9yID0ge307XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIChpc0FyciA/IGFycmF5RWFjaCA6IGJhc2VGb3JPd24pKG9iamVjdCwgZnVuY3Rpb24odmFsdWUsIGluZGV4LCBvYmplY3QpIHtcbiAgICAgICAgcmV0dXJuIGl0ZXJhdGVlKGFjY3VtdWxhdG9yLCB2YWx1ZSwgaW5kZXgsIG9iamVjdCk7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBhY2N1bXVsYXRvcjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGFycmF5IG9mIHRoZSBvd24gZW51bWVyYWJsZSBwcm9wZXJ0eSB2YWx1ZXMgb2YgYG9iamVjdGAuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogTm9uLW9iamVjdCB2YWx1ZXMgYXJlIGNvZXJjZWQgdG8gb2JqZWN0cy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBhcnJheSBvZiBwcm9wZXJ0eSB2YWx1ZXMuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIEZvbygpIHtcbiAgICAgKiAgIHRoaXMuYSA9IDE7XG4gICAgICogICB0aGlzLmIgPSAyO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIEZvby5wcm90b3R5cGUuYyA9IDM7XG4gICAgICpcbiAgICAgKiBfLnZhbHVlcyhuZXcgRm9vKTtcbiAgICAgKiAvLyA9PiBbMSwgMl0gKGl0ZXJhdGlvbiBvcmRlciBpcyBub3QgZ3VhcmFudGVlZClcbiAgICAgKlxuICAgICAqIF8udmFsdWVzKCdoaScpO1xuICAgICAqIC8vID0+IFsnaCcsICdpJ11cbiAgICAgKi9cbiAgICBmdW5jdGlvbiB2YWx1ZXMob2JqZWN0KSB7XG4gICAgICByZXR1cm4gYmFzZVZhbHVlcyhvYmplY3QsIGtleXMob2JqZWN0KSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBhcnJheSBvZiB0aGUgb3duIGFuZCBpbmhlcml0ZWQgZW51bWVyYWJsZSBwcm9wZXJ0eSB2YWx1ZXNcbiAgICAgKiBvZiBgb2JqZWN0YC5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBOb24tb2JqZWN0IHZhbHVlcyBhcmUgY29lcmNlZCB0byBvYmplY3RzLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IE9iamVjdFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGFycmF5IG9mIHByb3BlcnR5IHZhbHVlcy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gRm9vKCkge1xuICAgICAqICAgdGhpcy5hID0gMTtcbiAgICAgKiAgIHRoaXMuYiA9IDI7XG4gICAgICogfVxuICAgICAqXG4gICAgICogRm9vLnByb3RvdHlwZS5jID0gMztcbiAgICAgKlxuICAgICAqIF8udmFsdWVzSW4obmV3IEZvbyk7XG4gICAgICogLy8gPT4gWzEsIDIsIDNdIChpdGVyYXRpb24gb3JkZXIgaXMgbm90IGd1YXJhbnRlZWQpXG4gICAgICovXG4gICAgZnVuY3Rpb24gdmFsdWVzSW4ob2JqZWN0KSB7XG4gICAgICByZXR1cm4gYmFzZVZhbHVlcyhvYmplY3QsIGtleXNJbihvYmplY3QpKTtcbiAgICB9XG5cbiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYG5gIGlzIGJldHdlZW4gYHN0YXJ0YCBhbmQgdXAgdG8gYnV0IG5vdCBpbmNsdWRpbmcsIGBlbmRgLiBJZlxuICAgICAqIGBlbmRgIGlzIG5vdCBzcGVjaWZpZWQgaXQgaXMgc2V0IHRvIGBzdGFydGAgd2l0aCBgc3RhcnRgIHRoZW4gc2V0IHRvIGAwYC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBjYXRlZ29yeSBOdW1iZXJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gbiBUaGUgbnVtYmVyIHRvIGNoZWNrLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbc3RhcnQ9MF0gVGhlIHN0YXJ0IG9mIHRoZSByYW5nZS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gZW5kIFRoZSBlbmQgb2YgdGhlIHJhbmdlLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgbmAgaXMgaW4gdGhlIHJhbmdlLCBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uaW5SYW5nZSgzLCAyLCA0KTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmluUmFuZ2UoNCwgOCk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pblJhbmdlKDQsIDIpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICpcbiAgICAgKiBfLmluUmFuZ2UoMiwgMik7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKlxuICAgICAqIF8uaW5SYW5nZSgxLjIsIDIpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaW5SYW5nZSg1LjIsIDQpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICovXG4gICAgZnVuY3Rpb24gaW5SYW5nZSh2YWx1ZSwgc3RhcnQsIGVuZCkge1xuICAgICAgc3RhcnQgPSArc3RhcnQgfHwgMDtcbiAgICAgIGlmIChlbmQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBlbmQgPSBzdGFydDtcbiAgICAgICAgc3RhcnQgPSAwO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZW5kID0gK2VuZCB8fCAwO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHZhbHVlID49IG5hdGl2ZU1pbihzdGFydCwgZW5kKSAmJiB2YWx1ZSA8IG5hdGl2ZU1heChzdGFydCwgZW5kKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQcm9kdWNlcyBhIHJhbmRvbSBudW1iZXIgYmV0d2VlbiBgbWluYCBhbmQgYG1heGAgKGluY2x1c2l2ZSkuIElmIG9ubHkgb25lXG4gICAgICogYXJndW1lbnQgaXMgcHJvdmlkZWQgYSBudW1iZXIgYmV0d2VlbiBgMGAgYW5kIHRoZSBnaXZlbiBudW1iZXIgaXMgcmV0dXJuZWQuXG4gICAgICogSWYgYGZsb2F0aW5nYCBpcyBgdHJ1ZWAsIG9yIGVpdGhlciBgbWluYCBvciBgbWF4YCBhcmUgZmxvYXRzLCBhIGZsb2F0aW5nLXBvaW50XG4gICAgICogbnVtYmVyIGlzIHJldHVybmVkIGluc3RlYWQgb2YgYW4gaW50ZWdlci5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBjYXRlZ29yeSBOdW1iZXJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW21pbj0wXSBUaGUgbWluaW11bSBwb3NzaWJsZSB2YWx1ZS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW21heD0xXSBUaGUgbWF4aW11bSBwb3NzaWJsZSB2YWx1ZS5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtmbG9hdGluZ10gU3BlY2lmeSByZXR1cm5pbmcgYSBmbG9hdGluZy1wb2ludCBudW1iZXIuXG4gICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgcmFuZG9tIG51bWJlci5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5yYW5kb20oMCwgNSk7XG4gICAgICogLy8gPT4gYW4gaW50ZWdlciBiZXR3ZWVuIDAgYW5kIDVcbiAgICAgKlxuICAgICAqIF8ucmFuZG9tKDUpO1xuICAgICAqIC8vID0+IGFsc28gYW4gaW50ZWdlciBiZXR3ZWVuIDAgYW5kIDVcbiAgICAgKlxuICAgICAqIF8ucmFuZG9tKDUsIHRydWUpO1xuICAgICAqIC8vID0+IGEgZmxvYXRpbmctcG9pbnQgbnVtYmVyIGJldHdlZW4gMCBhbmQgNVxuICAgICAqXG4gICAgICogXy5yYW5kb20oMS4yLCA1LjIpO1xuICAgICAqIC8vID0+IGEgZmxvYXRpbmctcG9pbnQgbnVtYmVyIGJldHdlZW4gMS4yIGFuZCA1LjJcbiAgICAgKi9cbiAgICBmdW5jdGlvbiByYW5kb20obWluLCBtYXgsIGZsb2F0aW5nKSB7XG4gICAgICBpZiAoZmxvYXRpbmcgJiYgaXNJdGVyYXRlZUNhbGwobWluLCBtYXgsIGZsb2F0aW5nKSkge1xuICAgICAgICBtYXggPSBmbG9hdGluZyA9IHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICAgIHZhciBub01pbiA9IG1pbiA9PSBudWxsLFxuICAgICAgICAgIG5vTWF4ID0gbWF4ID09IG51bGw7XG5cbiAgICAgIGlmIChmbG9hdGluZyA9PSBudWxsKSB7XG4gICAgICAgIGlmIChub01heCAmJiB0eXBlb2YgbWluID09ICdib29sZWFuJykge1xuICAgICAgICAgIGZsb2F0aW5nID0gbWluO1xuICAgICAgICAgIG1pbiA9IDE7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodHlwZW9mIG1heCA9PSAnYm9vbGVhbicpIHtcbiAgICAgICAgICBmbG9hdGluZyA9IG1heDtcbiAgICAgICAgICBub01heCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChub01pbiAmJiBub01heCkge1xuICAgICAgICBtYXggPSAxO1xuICAgICAgICBub01heCA9IGZhbHNlO1xuICAgICAgfVxuICAgICAgbWluID0gK21pbiB8fCAwO1xuICAgICAgaWYgKG5vTWF4KSB7XG4gICAgICAgIG1heCA9IG1pbjtcbiAgICAgICAgbWluID0gMDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG1heCA9ICttYXggfHwgMDtcbiAgICAgIH1cbiAgICAgIGlmIChmbG9hdGluZyB8fCBtaW4gJSAxIHx8IG1heCAlIDEpIHtcbiAgICAgICAgdmFyIHJhbmQgPSBuYXRpdmVSYW5kb20oKTtcbiAgICAgICAgcmV0dXJuIG5hdGl2ZU1pbihtaW4gKyAocmFuZCAqIChtYXggLSBtaW4gKyBwYXJzZUZsb2F0KCcxZS0nICsgKChyYW5kICsgJycpLmxlbmd0aCAtIDEpKSkpLCBtYXgpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGJhc2VSYW5kb20obWluLCBtYXgpO1xuICAgIH1cblxuICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIGBzdHJpbmdgIHRvIFtjYW1lbCBjYXNlXShodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9DYW1lbENhc2UpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IFN0cmluZ1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbc3RyaW5nPScnXSBUaGUgc3RyaW5nIHRvIGNvbnZlcnQuXG4gICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgY2FtZWwgY2FzZWQgc3RyaW5nLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmNhbWVsQ2FzZSgnRm9vIEJhcicpO1xuICAgICAqIC8vID0+ICdmb29CYXInXG4gICAgICpcbiAgICAgKiBfLmNhbWVsQ2FzZSgnLS1mb28tYmFyJyk7XG4gICAgICogLy8gPT4gJ2Zvb0JhcidcbiAgICAgKlxuICAgICAqIF8uY2FtZWxDYXNlKCdfX2Zvb19iYXJfXycpO1xuICAgICAqIC8vID0+ICdmb29CYXInXG4gICAgICovXG4gICAgdmFyIGNhbWVsQ2FzZSA9IGNyZWF0ZUNvbXBvdW5kZXIoZnVuY3Rpb24ocmVzdWx0LCB3b3JkLCBpbmRleCkge1xuICAgICAgd29yZCA9IHdvcmQudG9Mb3dlckNhc2UoKTtcbiAgICAgIHJldHVybiByZXN1bHQgKyAoaW5kZXggPyAod29yZC5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIHdvcmQuc2xpY2UoMSkpIDogd29yZCk7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBDYXBpdGFsaXplcyB0aGUgZmlyc3QgY2hhcmFjdGVyIG9mIGBzdHJpbmdgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IFN0cmluZ1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbc3RyaW5nPScnXSBUaGUgc3RyaW5nIHRvIGNhcGl0YWxpemUuXG4gICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgY2FwaXRhbGl6ZWQgc3RyaW5nLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmNhcGl0YWxpemUoJ2ZyZWQnKTtcbiAgICAgKiAvLyA9PiAnRnJlZCdcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjYXBpdGFsaXplKHN0cmluZykge1xuICAgICAgc3RyaW5nID0gYmFzZVRvU3RyaW5nKHN0cmluZyk7XG4gICAgICByZXR1cm4gc3RyaW5nICYmIChzdHJpbmcuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyBzdHJpbmcuc2xpY2UoMSkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERlYnVycnMgYHN0cmluZ2AgYnkgY29udmVydGluZyBbbGF0aW4tMSBzdXBwbGVtZW50YXJ5IGxldHRlcnNdKGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0xhdGluLTFfU3VwcGxlbWVudF8oVW5pY29kZV9ibG9jaykjQ2hhcmFjdGVyX3RhYmxlKVxuICAgICAqIHRvIGJhc2ljIGxhdGluIGxldHRlcnMgYW5kIHJlbW92aW5nIFtjb21iaW5pbmcgZGlhY3JpdGljYWwgbWFya3NdKGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0NvbWJpbmluZ19EaWFjcml0aWNhbF9NYXJrcykuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAY2F0ZWdvcnkgU3RyaW5nXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtzdHJpbmc9JyddIFRoZSBzdHJpbmcgdG8gZGVidXJyLlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIGRlYnVycmVkIHN0cmluZy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5kZWJ1cnIoJ2TDqWrDoCB2dScpO1xuICAgICAqIC8vID0+ICdkZWphIHZ1J1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIGRlYnVycihzdHJpbmcpIHtcbiAgICAgIHN0cmluZyA9IGJhc2VUb1N0cmluZyhzdHJpbmcpO1xuICAgICAgcmV0dXJuIHN0cmluZyAmJiBzdHJpbmcucmVwbGFjZShyZUxhdGluMSwgZGVidXJyTGV0dGVyKS5yZXBsYWNlKHJlQ29tYm9NYXJrLCAnJyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGBzdHJpbmdgIGVuZHMgd2l0aCB0aGUgZ2l2ZW4gdGFyZ2V0IHN0cmluZy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBjYXRlZ29yeSBTdHJpbmdcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3N0cmluZz0nJ10gVGhlIHN0cmluZyB0byBzZWFyY2guXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFt0YXJnZXRdIFRoZSBzdHJpbmcgdG8gc2VhcmNoIGZvci5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3Bvc2l0aW9uPXN0cmluZy5sZW5ndGhdIFRoZSBwb3NpdGlvbiB0byBzZWFyY2ggZnJvbS5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHN0cmluZ2AgZW5kcyB3aXRoIGB0YXJnZXRgLCBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uZW5kc1dpdGgoJ2FiYycsICdjJyk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5lbmRzV2l0aCgnYWJjJywgJ2InKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqXG4gICAgICogXy5lbmRzV2l0aCgnYWJjJywgJ2InLCAyKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICovXG4gICAgZnVuY3Rpb24gZW5kc1dpdGgoc3RyaW5nLCB0YXJnZXQsIHBvc2l0aW9uKSB7XG4gICAgICBzdHJpbmcgPSBiYXNlVG9TdHJpbmcoc3RyaW5nKTtcbiAgICAgIHRhcmdldCA9ICh0YXJnZXQgKyAnJyk7XG5cbiAgICAgIHZhciBsZW5ndGggPSBzdHJpbmcubGVuZ3RoO1xuICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbiA9PT0gdW5kZWZpbmVkXG4gICAgICAgID8gbGVuZ3RoXG4gICAgICAgIDogbmF0aXZlTWluKHBvc2l0aW9uIDwgMCA/IDAgOiAoK3Bvc2l0aW9uIHx8IDApLCBsZW5ndGgpO1xuXG4gICAgICBwb3NpdGlvbiAtPSB0YXJnZXQubGVuZ3RoO1xuICAgICAgcmV0dXJuIHBvc2l0aW9uID49IDAgJiYgc3RyaW5nLmluZGV4T2YodGFyZ2V0LCBwb3NpdGlvbikgPT0gcG9zaXRpb247XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29udmVydHMgdGhlIGNoYXJhY3RlcnMgXCImXCIsIFwiPFwiLCBcIj5cIiwgJ1wiJywgXCInXCIsIGFuZCBcIlxcYFwiLCBpbiBgc3RyaW5nYCB0b1xuICAgICAqIHRoZWlyIGNvcnJlc3BvbmRpbmcgSFRNTCBlbnRpdGllcy5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBObyBvdGhlciBjaGFyYWN0ZXJzIGFyZSBlc2NhcGVkLiBUbyBlc2NhcGUgYWRkaXRpb25hbCBjaGFyYWN0ZXJzXG4gICAgICogdXNlIGEgdGhpcmQtcGFydHkgbGlicmFyeSBsaWtlIFtfaGVfXShodHRwczovL210aHMuYmUvaGUpLlxuICAgICAqXG4gICAgICogVGhvdWdoIHRoZSBcIj5cIiBjaGFyYWN0ZXIgaXMgZXNjYXBlZCBmb3Igc3ltbWV0cnksIGNoYXJhY3RlcnMgbGlrZVxuICAgICAqIFwiPlwiIGFuZCBcIi9cIiBkb24ndCBuZWVkIGVzY2FwaW5nIGluIEhUTUwgYW5kIGhhdmUgbm8gc3BlY2lhbCBtZWFuaW5nXG4gICAgICogdW5sZXNzIHRoZXkncmUgcGFydCBvZiBhIHRhZyBvciB1bnF1b3RlZCBhdHRyaWJ1dGUgdmFsdWUuXG4gICAgICogU2VlIFtNYXRoaWFzIEJ5bmVucydzIGFydGljbGVdKGh0dHBzOi8vbWF0aGlhc2J5bmVucy5iZS9ub3Rlcy9hbWJpZ3VvdXMtYW1wZXJzYW5kcylcbiAgICAgKiAodW5kZXIgXCJzZW1pLXJlbGF0ZWQgZnVuIGZhY3RcIikgZm9yIG1vcmUgZGV0YWlscy5cbiAgICAgKlxuICAgICAqIEJhY2t0aWNrcyBhcmUgZXNjYXBlZCBiZWNhdXNlIGluIEludGVybmV0IEV4cGxvcmVyIDwgOSwgdGhleSBjYW4gYnJlYWsgb3V0XG4gICAgICogb2YgYXR0cmlidXRlIHZhbHVlcyBvciBIVE1MIGNvbW1lbnRzLiBTZWUgWyM1OV0oaHR0cHM6Ly9odG1sNXNlYy5vcmcvIzU5KSxcbiAgICAgKiBbIzEwMl0oaHR0cHM6Ly9odG1sNXNlYy5vcmcvIzEwMiksIFsjMTA4XShodHRwczovL2h0bWw1c2VjLm9yZy8jMTA4KSwgYW5kXG4gICAgICogWyMxMzNdKGh0dHBzOi8vaHRtbDVzZWMub3JnLyMxMzMpIG9mIHRoZSBbSFRNTDUgU2VjdXJpdHkgQ2hlYXRzaGVldF0oaHR0cHM6Ly9odG1sNXNlYy5vcmcvKVxuICAgICAqIGZvciBtb3JlIGRldGFpbHMuXG4gICAgICpcbiAgICAgKiBXaGVuIHdvcmtpbmcgd2l0aCBIVE1MIHlvdSBzaG91bGQgYWx3YXlzIFtxdW90ZSBhdHRyaWJ1dGUgdmFsdWVzXShodHRwOi8vd29ua28uY29tL3Bvc3QvaHRtbC1lc2NhcGluZylcbiAgICAgKiB0byByZWR1Y2UgWFNTIHZlY3RvcnMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAY2F0ZWdvcnkgU3RyaW5nXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtzdHJpbmc9JyddIFRoZSBzdHJpbmcgdG8gZXNjYXBlLlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIGVzY2FwZWQgc3RyaW5nLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmVzY2FwZSgnZnJlZCwgYmFybmV5LCAmIHBlYmJsZXMnKTtcbiAgICAgKiAvLyA9PiAnZnJlZCwgYmFybmV5LCAmYW1wOyBwZWJibGVzJ1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIGVzY2FwZShzdHJpbmcpIHtcbiAgICAgIC8vIFJlc2V0IGBsYXN0SW5kZXhgIGJlY2F1c2UgaW4gSUUgPCA5IGBTdHJpbmcjcmVwbGFjZWAgZG9lcyBub3QuXG4gICAgICBzdHJpbmcgPSBiYXNlVG9TdHJpbmcoc3RyaW5nKTtcbiAgICAgIHJldHVybiAoc3RyaW5nICYmIHJlSGFzVW5lc2NhcGVkSHRtbC50ZXN0KHN0cmluZykpXG4gICAgICAgID8gc3RyaW5nLnJlcGxhY2UocmVVbmVzY2FwZWRIdG1sLCBlc2NhcGVIdG1sQ2hhcilcbiAgICAgICAgOiBzdHJpbmc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRXNjYXBlcyB0aGUgYFJlZ0V4cGAgc3BlY2lhbCBjaGFyYWN0ZXJzIFwiXFxcIiwgXCIvXCIsIFwiXlwiLCBcIiRcIiwgXCIuXCIsIFwifFwiLCBcIj9cIixcbiAgICAgKiBcIipcIiwgXCIrXCIsIFwiKFwiLCBcIilcIiwgXCJbXCIsIFwiXVwiLCBcIntcIiBhbmQgXCJ9XCIgaW4gYHN0cmluZ2AuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAY2F0ZWdvcnkgU3RyaW5nXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtzdHJpbmc9JyddIFRoZSBzdHJpbmcgdG8gZXNjYXBlLlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIGVzY2FwZWQgc3RyaW5nLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmVzY2FwZVJlZ0V4cCgnW2xvZGFzaF0oaHR0cHM6Ly9sb2Rhc2guY29tLyknKTtcbiAgICAgKiAvLyA9PiAnXFxbbG9kYXNoXFxdXFwoaHR0cHM6XFwvXFwvbG9kYXNoXFwuY29tXFwvXFwpJ1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIGVzY2FwZVJlZ0V4cChzdHJpbmcpIHtcbiAgICAgIHN0cmluZyA9IGJhc2VUb1N0cmluZyhzdHJpbmcpO1xuICAgICAgcmV0dXJuIChzdHJpbmcgJiYgcmVIYXNSZWdFeHBDaGFycy50ZXN0KHN0cmluZykpXG4gICAgICAgID8gc3RyaW5nLnJlcGxhY2UocmVSZWdFeHBDaGFycywgZXNjYXBlUmVnRXhwQ2hhcilcbiAgICAgICAgOiAoc3RyaW5nIHx8ICcoPzopJyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29udmVydHMgYHN0cmluZ2AgdG8gW2tlYmFiIGNhc2VdKGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0xldHRlcl9jYXNlI1NwZWNpYWxfY2FzZV9zdHlsZXMpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IFN0cmluZ1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbc3RyaW5nPScnXSBUaGUgc3RyaW5nIHRvIGNvbnZlcnQuXG4gICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUga2ViYWIgY2FzZWQgc3RyaW5nLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmtlYmFiQ2FzZSgnRm9vIEJhcicpO1xuICAgICAqIC8vID0+ICdmb28tYmFyJ1xuICAgICAqXG4gICAgICogXy5rZWJhYkNhc2UoJ2Zvb0JhcicpO1xuICAgICAqIC8vID0+ICdmb28tYmFyJ1xuICAgICAqXG4gICAgICogXy5rZWJhYkNhc2UoJ19fZm9vX2Jhcl9fJyk7XG4gICAgICogLy8gPT4gJ2Zvby1iYXInXG4gICAgICovXG4gICAgdmFyIGtlYmFiQ2FzZSA9IGNyZWF0ZUNvbXBvdW5kZXIoZnVuY3Rpb24ocmVzdWx0LCB3b3JkLCBpbmRleCkge1xuICAgICAgcmV0dXJuIHJlc3VsdCArIChpbmRleCA/ICctJyA6ICcnKSArIHdvcmQudG9Mb3dlckNhc2UoKTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIFBhZHMgYHN0cmluZ2Agb24gdGhlIGxlZnQgYW5kIHJpZ2h0IHNpZGVzIGlmIGl0J3Mgc2hvcnRlciB0aGFuIGBsZW5ndGhgLlxuICAgICAqIFBhZGRpbmcgY2hhcmFjdGVycyBhcmUgdHJ1bmNhdGVkIGlmIHRoZXkgY2FuJ3QgYmUgZXZlbmx5IGRpdmlkZWQgYnkgYGxlbmd0aGAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAY2F0ZWdvcnkgU3RyaW5nXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtzdHJpbmc9JyddIFRoZSBzdHJpbmcgdG8gcGFkLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbbGVuZ3RoPTBdIFRoZSBwYWRkaW5nIGxlbmd0aC5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW2NoYXJzPScgJ10gVGhlIHN0cmluZyB1c2VkIGFzIHBhZGRpbmcuXG4gICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgcGFkZGVkIHN0cmluZy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5wYWQoJ2FiYycsIDgpO1xuICAgICAqIC8vID0+ICcgIGFiYyAgICdcbiAgICAgKlxuICAgICAqIF8ucGFkKCdhYmMnLCA4LCAnXy0nKTtcbiAgICAgKiAvLyA9PiAnXy1hYmNfLV8nXG4gICAgICpcbiAgICAgKiBfLnBhZCgnYWJjJywgMyk7XG4gICAgICogLy8gPT4gJ2FiYydcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBwYWQoc3RyaW5nLCBsZW5ndGgsIGNoYXJzKSB7XG4gICAgICBzdHJpbmcgPSBiYXNlVG9TdHJpbmcoc3RyaW5nKTtcbiAgICAgIGxlbmd0aCA9ICtsZW5ndGg7XG5cbiAgICAgIHZhciBzdHJMZW5ndGggPSBzdHJpbmcubGVuZ3RoO1xuICAgICAgaWYgKHN0ckxlbmd0aCA+PSBsZW5ndGggfHwgIW5hdGl2ZUlzRmluaXRlKGxlbmd0aCkpIHtcbiAgICAgICAgcmV0dXJuIHN0cmluZztcbiAgICAgIH1cbiAgICAgIHZhciBtaWQgPSAobGVuZ3RoIC0gc3RyTGVuZ3RoKSAvIDIsXG4gICAgICAgICAgbGVmdExlbmd0aCA9IG5hdGl2ZUZsb29yKG1pZCksXG4gICAgICAgICAgcmlnaHRMZW5ndGggPSBuYXRpdmVDZWlsKG1pZCk7XG5cbiAgICAgIGNoYXJzID0gY3JlYXRlUGFkZGluZygnJywgcmlnaHRMZW5ndGgsIGNoYXJzKTtcbiAgICAgIHJldHVybiBjaGFycy5zbGljZSgwLCBsZWZ0TGVuZ3RoKSArIHN0cmluZyArIGNoYXJzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFBhZHMgYHN0cmluZ2Agb24gdGhlIGxlZnQgc2lkZSBpZiBpdCdzIHNob3J0ZXIgdGhhbiBgbGVuZ3RoYC4gUGFkZGluZ1xuICAgICAqIGNoYXJhY3RlcnMgYXJlIHRydW5jYXRlZCBpZiB0aGV5IGV4Y2VlZCBgbGVuZ3RoYC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBjYXRlZ29yeSBTdHJpbmdcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3N0cmluZz0nJ10gVGhlIHN0cmluZyB0byBwYWQuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtsZW5ndGg9MF0gVGhlIHBhZGRpbmcgbGVuZ3RoLlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbY2hhcnM9JyAnXSBUaGUgc3RyaW5nIHVzZWQgYXMgcGFkZGluZy5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBwYWRkZWQgc3RyaW5nLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnBhZExlZnQoJ2FiYycsIDYpO1xuICAgICAqIC8vID0+ICcgICBhYmMnXG4gICAgICpcbiAgICAgKiBfLnBhZExlZnQoJ2FiYycsIDYsICdfLScpO1xuICAgICAqIC8vID0+ICdfLV9hYmMnXG4gICAgICpcbiAgICAgKiBfLnBhZExlZnQoJ2FiYycsIDMpO1xuICAgICAqIC8vID0+ICdhYmMnXG4gICAgICovXG4gICAgdmFyIHBhZExlZnQgPSBjcmVhdGVQYWREaXIoKTtcblxuICAgIC8qKlxuICAgICAqIFBhZHMgYHN0cmluZ2Agb24gdGhlIHJpZ2h0IHNpZGUgaWYgaXQncyBzaG9ydGVyIHRoYW4gYGxlbmd0aGAuIFBhZGRpbmdcbiAgICAgKiBjaGFyYWN0ZXJzIGFyZSB0cnVuY2F0ZWQgaWYgdGhleSBleGNlZWQgYGxlbmd0aGAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAY2F0ZWdvcnkgU3RyaW5nXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtzdHJpbmc9JyddIFRoZSBzdHJpbmcgdG8gcGFkLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbbGVuZ3RoPTBdIFRoZSBwYWRkaW5nIGxlbmd0aC5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW2NoYXJzPScgJ10gVGhlIHN0cmluZyB1c2VkIGFzIHBhZGRpbmcuXG4gICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgcGFkZGVkIHN0cmluZy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5wYWRSaWdodCgnYWJjJywgNik7XG4gICAgICogLy8gPT4gJ2FiYyAgICdcbiAgICAgKlxuICAgICAqIF8ucGFkUmlnaHQoJ2FiYycsIDYsICdfLScpO1xuICAgICAqIC8vID0+ICdhYmNfLV8nXG4gICAgICpcbiAgICAgKiBfLnBhZFJpZ2h0KCdhYmMnLCAzKTtcbiAgICAgKiAvLyA9PiAnYWJjJ1xuICAgICAqL1xuICAgIHZhciBwYWRSaWdodCA9IGNyZWF0ZVBhZERpcih0cnVlKTtcblxuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIGBzdHJpbmdgIHRvIGFuIGludGVnZXIgb2YgdGhlIHNwZWNpZmllZCByYWRpeC4gSWYgYHJhZGl4YCBpc1xuICAgICAqIGB1bmRlZmluZWRgIG9yIGAwYCwgYSBgcmFkaXhgIG9mIGAxMGAgaXMgdXNlZCB1bmxlc3MgYHZhbHVlYCBpcyBhIGhleGFkZWNpbWFsLFxuICAgICAqIGluIHdoaWNoIGNhc2UgYSBgcmFkaXhgIG9mIGAxNmAgaXMgdXNlZC5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBhbGlnbnMgd2l0aCB0aGUgW0VTNSBpbXBsZW1lbnRhdGlvbl0oaHR0cHM6Ly9lczUuZ2l0aHViLmlvLyNFKVxuICAgICAqIG9mIGBwYXJzZUludGAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAY2F0ZWdvcnkgU3RyaW5nXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHN0cmluZyBUaGUgc3RyaW5nIHRvIGNvbnZlcnQuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtyYWRpeF0gVGhlIHJhZGl4IHRvIGludGVycHJldCBgdmFsdWVgIGJ5LlxuICAgICAqIEBwYXJhbS0ge09iamVjdH0gW2d1YXJkXSBFbmFibGVzIHVzZSBhcyBhIGNhbGxiYWNrIGZvciBmdW5jdGlvbnMgbGlrZSBgXy5tYXBgLlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGNvbnZlcnRlZCBpbnRlZ2VyLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnBhcnNlSW50KCcwOCcpO1xuICAgICAqIC8vID0+IDhcbiAgICAgKlxuICAgICAqIF8ubWFwKFsnNicsICcwOCcsICcxMCddLCBfLnBhcnNlSW50KTtcbiAgICAgKiAvLyA9PiBbNiwgOCwgMTBdXG4gICAgICovXG4gICAgZnVuY3Rpb24gcGFyc2VJbnQoc3RyaW5nLCByYWRpeCwgZ3VhcmQpIHtcbiAgICAgIC8vIEZpcmVmb3ggPCAyMSBhbmQgT3BlcmEgPCAxNSBmb2xsb3cgRVMzIGZvciBgcGFyc2VJbnRgLlxuICAgICAgLy8gQ2hyb21lIGZhaWxzIHRvIHRyaW0gbGVhZGluZyA8Qk9NPiB3aGl0ZXNwYWNlIGNoYXJhY3RlcnMuXG4gICAgICAvLyBTZWUgaHR0cHM6Ly9jb2RlLmdvb2dsZS5jb20vcC92OC9pc3N1ZXMvZGV0YWlsP2lkPTMxMDkgZm9yIG1vcmUgZGV0YWlscy5cbiAgICAgIGlmIChndWFyZCA/IGlzSXRlcmF0ZWVDYWxsKHN0cmluZywgcmFkaXgsIGd1YXJkKSA6IHJhZGl4ID09IG51bGwpIHtcbiAgICAgICAgcmFkaXggPSAwO1xuICAgICAgfSBlbHNlIGlmIChyYWRpeCkge1xuICAgICAgICByYWRpeCA9ICtyYWRpeDtcbiAgICAgIH1cbiAgICAgIHN0cmluZyA9IHRyaW0oc3RyaW5nKTtcbiAgICAgIHJldHVybiBuYXRpdmVQYXJzZUludChzdHJpbmcsIHJhZGl4IHx8IChyZUhhc0hleFByZWZpeC50ZXN0KHN0cmluZykgPyAxNiA6IDEwKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVwZWF0cyB0aGUgZ2l2ZW4gc3RyaW5nIGBuYCB0aW1lcy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBjYXRlZ29yeSBTdHJpbmdcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3N0cmluZz0nJ10gVGhlIHN0cmluZyB0byByZXBlYXQuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtuPTBdIFRoZSBudW1iZXIgb2YgdGltZXMgdG8gcmVwZWF0IHRoZSBzdHJpbmcuXG4gICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgcmVwZWF0ZWQgc3RyaW5nLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnJlcGVhdCgnKicsIDMpO1xuICAgICAqIC8vID0+ICcqKionXG4gICAgICpcbiAgICAgKiBfLnJlcGVhdCgnYWJjJywgMik7XG4gICAgICogLy8gPT4gJ2FiY2FiYydcbiAgICAgKlxuICAgICAqIF8ucmVwZWF0KCdhYmMnLCAwKTtcbiAgICAgKiAvLyA9PiAnJ1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIHJlcGVhdChzdHJpbmcsIG4pIHtcbiAgICAgIHZhciByZXN1bHQgPSAnJztcbiAgICAgIHN0cmluZyA9IGJhc2VUb1N0cmluZyhzdHJpbmcpO1xuICAgICAgbiA9ICtuO1xuICAgICAgaWYgKG4gPCAxIHx8ICFzdHJpbmcgfHwgIW5hdGl2ZUlzRmluaXRlKG4pKSB7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9XG4gICAgICAvLyBMZXZlcmFnZSB0aGUgZXhwb25lbnRpYXRpb24gYnkgc3F1YXJpbmcgYWxnb3JpdGhtIGZvciBhIGZhc3RlciByZXBlYXQuXG4gICAgICAvLyBTZWUgaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvRXhwb25lbnRpYXRpb25fYnlfc3F1YXJpbmcgZm9yIG1vcmUgZGV0YWlscy5cbiAgICAgIGRvIHtcbiAgICAgICAgaWYgKG4gJSAyKSB7XG4gICAgICAgICAgcmVzdWx0ICs9IHN0cmluZztcbiAgICAgICAgfVxuICAgICAgICBuID0gbmF0aXZlRmxvb3IobiAvIDIpO1xuICAgICAgICBzdHJpbmcgKz0gc3RyaW5nO1xuICAgICAgfSB3aGlsZSAobik7XG5cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29udmVydHMgYHN0cmluZ2AgdG8gW3NuYWtlIGNhc2VdKGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1NuYWtlX2Nhc2UpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IFN0cmluZ1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbc3RyaW5nPScnXSBUaGUgc3RyaW5nIHRvIGNvbnZlcnQuXG4gICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgc25ha2UgY2FzZWQgc3RyaW5nLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnNuYWtlQ2FzZSgnRm9vIEJhcicpO1xuICAgICAqIC8vID0+ICdmb29fYmFyJ1xuICAgICAqXG4gICAgICogXy5zbmFrZUNhc2UoJ2Zvb0JhcicpO1xuICAgICAqIC8vID0+ICdmb29fYmFyJ1xuICAgICAqXG4gICAgICogXy5zbmFrZUNhc2UoJy0tZm9vLWJhcicpO1xuICAgICAqIC8vID0+ICdmb29fYmFyJ1xuICAgICAqL1xuICAgIHZhciBzbmFrZUNhc2UgPSBjcmVhdGVDb21wb3VuZGVyKGZ1bmN0aW9uKHJlc3VsdCwgd29yZCwgaW5kZXgpIHtcbiAgICAgIHJldHVybiByZXN1bHQgKyAoaW5kZXggPyAnXycgOiAnJykgKyB3b3JkLnRvTG93ZXJDYXNlKCk7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0cyBgc3RyaW5nYCB0byBbc3RhcnQgY2FzZV0oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvTGV0dGVyX2Nhc2UjU3R5bGlzdGljX29yX3NwZWNpYWxpc2VkX3VzYWdlKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBjYXRlZ29yeSBTdHJpbmdcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3N0cmluZz0nJ10gVGhlIHN0cmluZyB0byBjb252ZXJ0LlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIHN0YXJ0IGNhc2VkIHN0cmluZy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5zdGFydENhc2UoJy0tZm9vLWJhcicpO1xuICAgICAqIC8vID0+ICdGb28gQmFyJ1xuICAgICAqXG4gICAgICogXy5zdGFydENhc2UoJ2Zvb0JhcicpO1xuICAgICAqIC8vID0+ICdGb28gQmFyJ1xuICAgICAqXG4gICAgICogXy5zdGFydENhc2UoJ19fZm9vX2Jhcl9fJyk7XG4gICAgICogLy8gPT4gJ0ZvbyBCYXInXG4gICAgICovXG4gICAgdmFyIHN0YXJ0Q2FzZSA9IGNyZWF0ZUNvbXBvdW5kZXIoZnVuY3Rpb24ocmVzdWx0LCB3b3JkLCBpbmRleCkge1xuICAgICAgcmV0dXJuIHJlc3VsdCArIChpbmRleCA/ICcgJyA6ICcnKSArICh3b3JkLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgd29yZC5zbGljZSgxKSk7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHN0cmluZ2Agc3RhcnRzIHdpdGggdGhlIGdpdmVuIHRhcmdldCBzdHJpbmcuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAY2F0ZWdvcnkgU3RyaW5nXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtzdHJpbmc9JyddIFRoZSBzdHJpbmcgdG8gc2VhcmNoLlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbdGFyZ2V0XSBUaGUgc3RyaW5nIHRvIHNlYXJjaCBmb3IuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtwb3NpdGlvbj0wXSBUaGUgcG9zaXRpb24gdG8gc2VhcmNoIGZyb20uXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGBzdHJpbmdgIHN0YXJ0cyB3aXRoIGB0YXJnZXRgLCBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uc3RhcnRzV2l0aCgnYWJjJywgJ2EnKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLnN0YXJ0c1dpdGgoJ2FiYycsICdiJyk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKlxuICAgICAqIF8uc3RhcnRzV2l0aCgnYWJjJywgJ2InLCAxKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICovXG4gICAgZnVuY3Rpb24gc3RhcnRzV2l0aChzdHJpbmcsIHRhcmdldCwgcG9zaXRpb24pIHtcbiAgICAgIHN0cmluZyA9IGJhc2VUb1N0cmluZyhzdHJpbmcpO1xuICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbiA9PSBudWxsXG4gICAgICAgID8gMFxuICAgICAgICA6IG5hdGl2ZU1pbihwb3NpdGlvbiA8IDAgPyAwIDogKCtwb3NpdGlvbiB8fCAwKSwgc3RyaW5nLmxlbmd0aCk7XG5cbiAgICAgIHJldHVybiBzdHJpbmcubGFzdEluZGV4T2YodGFyZ2V0LCBwb3NpdGlvbikgPT0gcG9zaXRpb247XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGNvbXBpbGVkIHRlbXBsYXRlIGZ1bmN0aW9uIHRoYXQgY2FuIGludGVycG9sYXRlIGRhdGEgcHJvcGVydGllc1xuICAgICAqIGluIFwiaW50ZXJwb2xhdGVcIiBkZWxpbWl0ZXJzLCBIVE1MLWVzY2FwZSBpbnRlcnBvbGF0ZWQgZGF0YSBwcm9wZXJ0aWVzIGluXG4gICAgICogXCJlc2NhcGVcIiBkZWxpbWl0ZXJzLCBhbmQgZXhlY3V0ZSBKYXZhU2NyaXB0IGluIFwiZXZhbHVhdGVcIiBkZWxpbWl0ZXJzLiBEYXRhXG4gICAgICogcHJvcGVydGllcyBtYXkgYmUgYWNjZXNzZWQgYXMgZnJlZSB2YXJpYWJsZXMgaW4gdGhlIHRlbXBsYXRlLiBJZiBhIHNldHRpbmdcbiAgICAgKiBvYmplY3QgaXMgcHJvdmlkZWQgaXQgdGFrZXMgcHJlY2VkZW5jZSBvdmVyIGBfLnRlbXBsYXRlU2V0dGluZ3NgIHZhbHVlcy5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBJbiB0aGUgZGV2ZWxvcG1lbnQgYnVpbGQgYF8udGVtcGxhdGVgIHV0aWxpemVzXG4gICAgICogW3NvdXJjZVVSTHNdKGh0dHA6Ly93d3cuaHRtbDVyb2Nrcy5jb20vZW4vdHV0b3JpYWxzL2RldmVsb3BlcnRvb2xzL3NvdXJjZW1hcHMvI3RvYy1zb3VyY2V1cmwpXG4gICAgICogZm9yIGVhc2llciBkZWJ1Z2dpbmcuXG4gICAgICpcbiAgICAgKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBwcmVjb21waWxpbmcgdGVtcGxhdGVzIHNlZVxuICAgICAqIFtsb2Rhc2gncyBjdXN0b20gYnVpbGRzIGRvY3VtZW50YXRpb25dKGh0dHBzOi8vbG9kYXNoLmNvbS9jdXN0b20tYnVpbGRzKS5cbiAgICAgKlxuICAgICAqIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIENocm9tZSBleHRlbnNpb24gc2FuZGJveGVzIHNlZVxuICAgICAqIFtDaHJvbWUncyBleHRlbnNpb25zIGRvY3VtZW50YXRpb25dKGh0dHBzOi8vZGV2ZWxvcGVyLmNocm9tZS5jb20vZXh0ZW5zaW9ucy9zYW5kYm94aW5nRXZhbCkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAY2F0ZWdvcnkgU3RyaW5nXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtzdHJpbmc9JyddIFRoZSB0ZW1wbGF0ZSBzdHJpbmcuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXSBUaGUgb3B0aW9ucyBvYmplY3QuXG4gICAgICogQHBhcmFtIHtSZWdFeHB9IFtvcHRpb25zLmVzY2FwZV0gVGhlIEhUTUwgXCJlc2NhcGVcIiBkZWxpbWl0ZXIuXG4gICAgICogQHBhcmFtIHtSZWdFeHB9IFtvcHRpb25zLmV2YWx1YXRlXSBUaGUgXCJldmFsdWF0ZVwiIGRlbGltaXRlci5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnMuaW1wb3J0c10gQW4gb2JqZWN0IHRvIGltcG9ydCBpbnRvIHRoZSB0ZW1wbGF0ZSBhcyBmcmVlIHZhcmlhYmxlcy5cbiAgICAgKiBAcGFyYW0ge1JlZ0V4cH0gW29wdGlvbnMuaW50ZXJwb2xhdGVdIFRoZSBcImludGVycG9sYXRlXCIgZGVsaW1pdGVyLlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0aW9ucy5zb3VyY2VVUkxdIFRoZSBzb3VyY2VVUkwgb2YgdGhlIHRlbXBsYXRlJ3MgY29tcGlsZWQgc291cmNlLlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0aW9ucy52YXJpYWJsZV0gVGhlIGRhdGEgb2JqZWN0IHZhcmlhYmxlIG5hbWUuXG4gICAgICogQHBhcmFtLSB7T2JqZWN0fSBbb3RoZXJPcHRpb25zXSBFbmFibGVzIHRoZSBsZWdhY3kgYG9wdGlvbnNgIHBhcmFtIHNpZ25hdHVyZS5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIGNvbXBpbGVkIHRlbXBsYXRlIGZ1bmN0aW9uLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiAvLyB1c2luZyB0aGUgXCJpbnRlcnBvbGF0ZVwiIGRlbGltaXRlciB0byBjcmVhdGUgYSBjb21waWxlZCB0ZW1wbGF0ZVxuICAgICAqIHZhciBjb21waWxlZCA9IF8udGVtcGxhdGUoJ2hlbGxvIDwlPSB1c2VyICU+IScpO1xuICAgICAqIGNvbXBpbGVkKHsgJ3VzZXInOiAnZnJlZCcgfSk7XG4gICAgICogLy8gPT4gJ2hlbGxvIGZyZWQhJ1xuICAgICAqXG4gICAgICogLy8gdXNpbmcgdGhlIEhUTUwgXCJlc2NhcGVcIiBkZWxpbWl0ZXIgdG8gZXNjYXBlIGRhdGEgcHJvcGVydHkgdmFsdWVzXG4gICAgICogdmFyIGNvbXBpbGVkID0gXy50ZW1wbGF0ZSgnPGI+PCUtIHZhbHVlICU+PC9iPicpO1xuICAgICAqIGNvbXBpbGVkKHsgJ3ZhbHVlJzogJzxzY3JpcHQ+JyB9KTtcbiAgICAgKiAvLyA9PiAnPGI+Jmx0O3NjcmlwdCZndDs8L2I+J1xuICAgICAqXG4gICAgICogLy8gdXNpbmcgdGhlIFwiZXZhbHVhdGVcIiBkZWxpbWl0ZXIgdG8gZXhlY3V0ZSBKYXZhU2NyaXB0IGFuZCBnZW5lcmF0ZSBIVE1MXG4gICAgICogdmFyIGNvbXBpbGVkID0gXy50ZW1wbGF0ZSgnPCUgXy5mb3JFYWNoKHVzZXJzLCBmdW5jdGlvbih1c2VyKSB7ICU+PGxpPjwlLSB1c2VyICU+PC9saT48JSB9KTsgJT4nKTtcbiAgICAgKiBjb21waWxlZCh7ICd1c2Vycyc6IFsnZnJlZCcsICdiYXJuZXknXSB9KTtcbiAgICAgKiAvLyA9PiAnPGxpPmZyZWQ8L2xpPjxsaT5iYXJuZXk8L2xpPidcbiAgICAgKlxuICAgICAqIC8vIHVzaW5nIHRoZSBpbnRlcm5hbCBgcHJpbnRgIGZ1bmN0aW9uIGluIFwiZXZhbHVhdGVcIiBkZWxpbWl0ZXJzXG4gICAgICogdmFyIGNvbXBpbGVkID0gXy50ZW1wbGF0ZSgnPCUgcHJpbnQoXCJoZWxsbyBcIiArIHVzZXIpOyAlPiEnKTtcbiAgICAgKiBjb21waWxlZCh7ICd1c2VyJzogJ2Jhcm5leScgfSk7XG4gICAgICogLy8gPT4gJ2hlbGxvIGJhcm5leSEnXG4gICAgICpcbiAgICAgKiAvLyB1c2luZyB0aGUgRVMgZGVsaW1pdGVyIGFzIGFuIGFsdGVybmF0aXZlIHRvIHRoZSBkZWZhdWx0IFwiaW50ZXJwb2xhdGVcIiBkZWxpbWl0ZXJcbiAgICAgKiB2YXIgY29tcGlsZWQgPSBfLnRlbXBsYXRlKCdoZWxsbyAkeyB1c2VyIH0hJyk7XG4gICAgICogY29tcGlsZWQoeyAndXNlcic6ICdwZWJibGVzJyB9KTtcbiAgICAgKiAvLyA9PiAnaGVsbG8gcGViYmxlcyEnXG4gICAgICpcbiAgICAgKiAvLyB1c2luZyBjdXN0b20gdGVtcGxhdGUgZGVsaW1pdGVyc1xuICAgICAqIF8udGVtcGxhdGVTZXR0aW5ncy5pbnRlcnBvbGF0ZSA9IC97eyhbXFxzXFxTXSs/KX19L2c7XG4gICAgICogdmFyIGNvbXBpbGVkID0gXy50ZW1wbGF0ZSgnaGVsbG8ge3sgdXNlciB9fSEnKTtcbiAgICAgKiBjb21waWxlZCh7ICd1c2VyJzogJ211c3RhY2hlJyB9KTtcbiAgICAgKiAvLyA9PiAnaGVsbG8gbXVzdGFjaGUhJ1xuICAgICAqXG4gICAgICogLy8gdXNpbmcgYmFja3NsYXNoZXMgdG8gdHJlYXQgZGVsaW1pdGVycyBhcyBwbGFpbiB0ZXh0XG4gICAgICogdmFyIGNvbXBpbGVkID0gXy50ZW1wbGF0ZSgnPCU9IFwiXFxcXDwlLSB2YWx1ZSAlXFxcXD5cIiAlPicpO1xuICAgICAqIGNvbXBpbGVkKHsgJ3ZhbHVlJzogJ2lnbm9yZWQnIH0pO1xuICAgICAqIC8vID0+ICc8JS0gdmFsdWUgJT4nXG4gICAgICpcbiAgICAgKiAvLyB1c2luZyB0aGUgYGltcG9ydHNgIG9wdGlvbiB0byBpbXBvcnQgYGpRdWVyeWAgYXMgYGpxYFxuICAgICAqIHZhciB0ZXh0ID0gJzwlIGpxLmVhY2godXNlcnMsIGZ1bmN0aW9uKHVzZXIpIHsgJT48bGk+PCUtIHVzZXIgJT48L2xpPjwlIH0pOyAlPic7XG4gICAgICogdmFyIGNvbXBpbGVkID0gXy50ZW1wbGF0ZSh0ZXh0LCB7ICdpbXBvcnRzJzogeyAnanEnOiBqUXVlcnkgfSB9KTtcbiAgICAgKiBjb21waWxlZCh7ICd1c2Vycyc6IFsnZnJlZCcsICdiYXJuZXknXSB9KTtcbiAgICAgKiAvLyA9PiAnPGxpPmZyZWQ8L2xpPjxsaT5iYXJuZXk8L2xpPidcbiAgICAgKlxuICAgICAqIC8vIHVzaW5nIHRoZSBgc291cmNlVVJMYCBvcHRpb24gdG8gc3BlY2lmeSBhIGN1c3RvbSBzb3VyY2VVUkwgZm9yIHRoZSB0ZW1wbGF0ZVxuICAgICAqIHZhciBjb21waWxlZCA9IF8udGVtcGxhdGUoJ2hlbGxvIDwlPSB1c2VyICU+IScsIHsgJ3NvdXJjZVVSTCc6ICcvYmFzaWMvZ3JlZXRpbmcuanN0JyB9KTtcbiAgICAgKiBjb21waWxlZChkYXRhKTtcbiAgICAgKiAvLyA9PiBmaW5kIHRoZSBzb3VyY2Ugb2YgXCJncmVldGluZy5qc3RcIiB1bmRlciB0aGUgU291cmNlcyB0YWIgb3IgUmVzb3VyY2VzIHBhbmVsIG9mIHRoZSB3ZWIgaW5zcGVjdG9yXG4gICAgICpcbiAgICAgKiAvLyB1c2luZyB0aGUgYHZhcmlhYmxlYCBvcHRpb24gdG8gZW5zdXJlIGEgd2l0aC1zdGF0ZW1lbnQgaXNuJ3QgdXNlZCBpbiB0aGUgY29tcGlsZWQgdGVtcGxhdGVcbiAgICAgKiB2YXIgY29tcGlsZWQgPSBfLnRlbXBsYXRlKCdoaSA8JT0gZGF0YS51c2VyICU+IScsIHsgJ3ZhcmlhYmxlJzogJ2RhdGEnIH0pO1xuICAgICAqIGNvbXBpbGVkLnNvdXJjZTtcbiAgICAgKiAvLyA9PiBmdW5jdGlvbihkYXRhKSB7XG4gICAgICogLy8gICB2YXIgX190LCBfX3AgPSAnJztcbiAgICAgKiAvLyAgIF9fcCArPSAnaGkgJyArICgoX190ID0gKCBkYXRhLnVzZXIgKSkgPT0gbnVsbCA/ICcnIDogX190KSArICchJztcbiAgICAgKiAvLyAgIHJldHVybiBfX3A7XG4gICAgICogLy8gfVxuICAgICAqXG4gICAgICogLy8gdXNpbmcgdGhlIGBzb3VyY2VgIHByb3BlcnR5IHRvIGlubGluZSBjb21waWxlZCB0ZW1wbGF0ZXMgZm9yIG1lYW5pbmdmdWxcbiAgICAgKiAvLyBsaW5lIG51bWJlcnMgaW4gZXJyb3IgbWVzc2FnZXMgYW5kIGEgc3RhY2sgdHJhY2VcbiAgICAgKiBmcy53cml0ZUZpbGVTeW5jKHBhdGguam9pbihjd2QsICdqc3QuanMnKSwgJ1xcXG4gICAgICogICB2YXIgSlNUID0ge1xcXG4gICAgICogICAgIFwibWFpblwiOiAnICsgXy50ZW1wbGF0ZShtYWluVGV4dCkuc291cmNlICsgJ1xcXG4gICAgICogICB9O1xcXG4gICAgICogJyk7XG4gICAgICovXG4gICAgZnVuY3Rpb24gdGVtcGxhdGUoc3RyaW5nLCBvcHRpb25zLCBvdGhlck9wdGlvbnMpIHtcbiAgICAgIC8vIEJhc2VkIG9uIEpvaG4gUmVzaWcncyBgdG1wbGAgaW1wbGVtZW50YXRpb24gKGh0dHA6Ly9lam9obi5vcmcvYmxvZy9qYXZhc2NyaXB0LW1pY3JvLXRlbXBsYXRpbmcvKVxuICAgICAgLy8gYW5kIExhdXJhIERva3Rvcm92YSdzIGRvVC5qcyAoaHR0cHM6Ly9naXRodWIuY29tL29sYWRvL2RvVCkuXG4gICAgICB2YXIgc2V0dGluZ3MgPSBsb2Rhc2gudGVtcGxhdGVTZXR0aW5ncztcblxuICAgICAgaWYgKG90aGVyT3B0aW9ucyAmJiBpc0l0ZXJhdGVlQ2FsbChzdHJpbmcsIG9wdGlvbnMsIG90aGVyT3B0aW9ucykpIHtcbiAgICAgICAgb3B0aW9ucyA9IG90aGVyT3B0aW9ucyA9IHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICAgIHN0cmluZyA9IGJhc2VUb1N0cmluZyhzdHJpbmcpO1xuICAgICAgb3B0aW9ucyA9IGFzc2lnbldpdGgoYmFzZUFzc2lnbih7fSwgb3RoZXJPcHRpb25zIHx8IG9wdGlvbnMpLCBzZXR0aW5ncywgYXNzaWduT3duRGVmYXVsdHMpO1xuXG4gICAgICB2YXIgaW1wb3J0cyA9IGFzc2lnbldpdGgoYmFzZUFzc2lnbih7fSwgb3B0aW9ucy5pbXBvcnRzKSwgc2V0dGluZ3MuaW1wb3J0cywgYXNzaWduT3duRGVmYXVsdHMpLFxuICAgICAgICAgIGltcG9ydHNLZXlzID0ga2V5cyhpbXBvcnRzKSxcbiAgICAgICAgICBpbXBvcnRzVmFsdWVzID0gYmFzZVZhbHVlcyhpbXBvcnRzLCBpbXBvcnRzS2V5cyk7XG5cbiAgICAgIHZhciBpc0VzY2FwaW5nLFxuICAgICAgICAgIGlzRXZhbHVhdGluZyxcbiAgICAgICAgICBpbmRleCA9IDAsXG4gICAgICAgICAgaW50ZXJwb2xhdGUgPSBvcHRpb25zLmludGVycG9sYXRlIHx8IHJlTm9NYXRjaCxcbiAgICAgICAgICBzb3VyY2UgPSBcIl9fcCArPSAnXCI7XG5cbiAgICAgIC8vIENvbXBpbGUgdGhlIHJlZ2V4cCB0byBtYXRjaCBlYWNoIGRlbGltaXRlci5cbiAgICAgIHZhciByZURlbGltaXRlcnMgPSBSZWdFeHAoXG4gICAgICAgIChvcHRpb25zLmVzY2FwZSB8fCByZU5vTWF0Y2gpLnNvdXJjZSArICd8JyArXG4gICAgICAgIGludGVycG9sYXRlLnNvdXJjZSArICd8JyArXG4gICAgICAgIChpbnRlcnBvbGF0ZSA9PT0gcmVJbnRlcnBvbGF0ZSA/IHJlRXNUZW1wbGF0ZSA6IHJlTm9NYXRjaCkuc291cmNlICsgJ3wnICtcbiAgICAgICAgKG9wdGlvbnMuZXZhbHVhdGUgfHwgcmVOb01hdGNoKS5zb3VyY2UgKyAnfCQnXG4gICAgICAsICdnJyk7XG5cbiAgICAgIC8vIFVzZSBhIHNvdXJjZVVSTCBmb3IgZWFzaWVyIGRlYnVnZ2luZy5cbiAgICAgIHZhciBzb3VyY2VVUkwgPSAnLy8jIHNvdXJjZVVSTD0nICtcbiAgICAgICAgKCdzb3VyY2VVUkwnIGluIG9wdGlvbnNcbiAgICAgICAgICA/IG9wdGlvbnMuc291cmNlVVJMXG4gICAgICAgICAgOiAoJ2xvZGFzaC50ZW1wbGF0ZVNvdXJjZXNbJyArICgrK3RlbXBsYXRlQ291bnRlcikgKyAnXScpXG4gICAgICAgICkgKyAnXFxuJztcblxuICAgICAgc3RyaW5nLnJlcGxhY2UocmVEZWxpbWl0ZXJzLCBmdW5jdGlvbihtYXRjaCwgZXNjYXBlVmFsdWUsIGludGVycG9sYXRlVmFsdWUsIGVzVGVtcGxhdGVWYWx1ZSwgZXZhbHVhdGVWYWx1ZSwgb2Zmc2V0KSB7XG4gICAgICAgIGludGVycG9sYXRlVmFsdWUgfHwgKGludGVycG9sYXRlVmFsdWUgPSBlc1RlbXBsYXRlVmFsdWUpO1xuXG4gICAgICAgIC8vIEVzY2FwZSBjaGFyYWN0ZXJzIHRoYXQgY2FuJ3QgYmUgaW5jbHVkZWQgaW4gc3RyaW5nIGxpdGVyYWxzLlxuICAgICAgICBzb3VyY2UgKz0gc3RyaW5nLnNsaWNlKGluZGV4LCBvZmZzZXQpLnJlcGxhY2UocmVVbmVzY2FwZWRTdHJpbmcsIGVzY2FwZVN0cmluZ0NoYXIpO1xuXG4gICAgICAgIC8vIFJlcGxhY2UgZGVsaW1pdGVycyB3aXRoIHNuaXBwZXRzLlxuICAgICAgICBpZiAoZXNjYXBlVmFsdWUpIHtcbiAgICAgICAgICBpc0VzY2FwaW5nID0gdHJ1ZTtcbiAgICAgICAgICBzb3VyY2UgKz0gXCInICtcXG5fX2UoXCIgKyBlc2NhcGVWYWx1ZSArIFwiKSArXFxuJ1wiO1xuICAgICAgICB9XG4gICAgICAgIGlmIChldmFsdWF0ZVZhbHVlKSB7XG4gICAgICAgICAgaXNFdmFsdWF0aW5nID0gdHJ1ZTtcbiAgICAgICAgICBzb3VyY2UgKz0gXCInO1xcblwiICsgZXZhbHVhdGVWYWx1ZSArIFwiO1xcbl9fcCArPSAnXCI7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGludGVycG9sYXRlVmFsdWUpIHtcbiAgICAgICAgICBzb3VyY2UgKz0gXCInICtcXG4oKF9fdCA9IChcIiArIGludGVycG9sYXRlVmFsdWUgKyBcIikpID09IG51bGwgPyAnJyA6IF9fdCkgK1xcbidcIjtcbiAgICAgICAgfVxuICAgICAgICBpbmRleCA9IG9mZnNldCArIG1hdGNoLmxlbmd0aDtcblxuICAgICAgICAvLyBUaGUgSlMgZW5naW5lIGVtYmVkZGVkIGluIEFkb2JlIHByb2R1Y3RzIHJlcXVpcmVzIHJldHVybmluZyB0aGUgYG1hdGNoYFxuICAgICAgICAvLyBzdHJpbmcgaW4gb3JkZXIgdG8gcHJvZHVjZSB0aGUgY29ycmVjdCBgb2Zmc2V0YCB2YWx1ZS5cbiAgICAgICAgcmV0dXJuIG1hdGNoO1xuICAgICAgfSk7XG5cbiAgICAgIHNvdXJjZSArPSBcIic7XFxuXCI7XG5cbiAgICAgIC8vIElmIGB2YXJpYWJsZWAgaXMgbm90IHNwZWNpZmllZCB3cmFwIGEgd2l0aC1zdGF0ZW1lbnQgYXJvdW5kIHRoZSBnZW5lcmF0ZWRcbiAgICAgIC8vIGNvZGUgdG8gYWRkIHRoZSBkYXRhIG9iamVjdCB0byB0aGUgdG9wIG9mIHRoZSBzY29wZSBjaGFpbi5cbiAgICAgIHZhciB2YXJpYWJsZSA9IG9wdGlvbnMudmFyaWFibGU7XG4gICAgICBpZiAoIXZhcmlhYmxlKSB7XG4gICAgICAgIHNvdXJjZSA9ICd3aXRoIChvYmopIHtcXG4nICsgc291cmNlICsgJ1xcbn1cXG4nO1xuICAgICAgfVxuICAgICAgLy8gQ2xlYW51cCBjb2RlIGJ5IHN0cmlwcGluZyBlbXB0eSBzdHJpbmdzLlxuICAgICAgc291cmNlID0gKGlzRXZhbHVhdGluZyA/IHNvdXJjZS5yZXBsYWNlKHJlRW1wdHlTdHJpbmdMZWFkaW5nLCAnJykgOiBzb3VyY2UpXG4gICAgICAgIC5yZXBsYWNlKHJlRW1wdHlTdHJpbmdNaWRkbGUsICckMScpXG4gICAgICAgIC5yZXBsYWNlKHJlRW1wdHlTdHJpbmdUcmFpbGluZywgJyQxOycpO1xuXG4gICAgICAvLyBGcmFtZSBjb2RlIGFzIHRoZSBmdW5jdGlvbiBib2R5LlxuICAgICAgc291cmNlID0gJ2Z1bmN0aW9uKCcgKyAodmFyaWFibGUgfHwgJ29iaicpICsgJykge1xcbicgK1xuICAgICAgICAodmFyaWFibGVcbiAgICAgICAgICA/ICcnXG4gICAgICAgICAgOiAnb2JqIHx8IChvYmogPSB7fSk7XFxuJ1xuICAgICAgICApICtcbiAgICAgICAgXCJ2YXIgX190LCBfX3AgPSAnJ1wiICtcbiAgICAgICAgKGlzRXNjYXBpbmdcbiAgICAgICAgICAgPyAnLCBfX2UgPSBfLmVzY2FwZSdcbiAgICAgICAgICAgOiAnJ1xuICAgICAgICApICtcbiAgICAgICAgKGlzRXZhbHVhdGluZ1xuICAgICAgICAgID8gJywgX19qID0gQXJyYXkucHJvdG90eXBlLmpvaW47XFxuJyArXG4gICAgICAgICAgICBcImZ1bmN0aW9uIHByaW50KCkgeyBfX3AgKz0gX19qLmNhbGwoYXJndW1lbnRzLCAnJykgfVxcblwiXG4gICAgICAgICAgOiAnO1xcbidcbiAgICAgICAgKSArXG4gICAgICAgIHNvdXJjZSArXG4gICAgICAgICdyZXR1cm4gX19wXFxufSc7XG5cbiAgICAgIHZhciByZXN1bHQgPSBhdHRlbXB0KGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gRnVuY3Rpb24oaW1wb3J0c0tleXMsIHNvdXJjZVVSTCArICdyZXR1cm4gJyArIHNvdXJjZSkuYXBwbHkodW5kZWZpbmVkLCBpbXBvcnRzVmFsdWVzKTtcbiAgICAgIH0pO1xuXG4gICAgICAvLyBQcm92aWRlIHRoZSBjb21waWxlZCBmdW5jdGlvbidzIHNvdXJjZSBieSBpdHMgYHRvU3RyaW5nYCBtZXRob2Qgb3JcbiAgICAgIC8vIHRoZSBgc291cmNlYCBwcm9wZXJ0eSBhcyBhIGNvbnZlbmllbmNlIGZvciBpbmxpbmluZyBjb21waWxlZCB0ZW1wbGF0ZXMuXG4gICAgICByZXN1bHQuc291cmNlID0gc291cmNlO1xuICAgICAgaWYgKGlzRXJyb3IocmVzdWx0KSkge1xuICAgICAgICB0aHJvdyByZXN1bHQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgbGVhZGluZyBhbmQgdHJhaWxpbmcgd2hpdGVzcGFjZSBvciBzcGVjaWZpZWQgY2hhcmFjdGVycyBmcm9tIGBzdHJpbmdgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IFN0cmluZ1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbc3RyaW5nPScnXSBUaGUgc3RyaW5nIHRvIHRyaW0uXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtjaGFycz13aGl0ZXNwYWNlXSBUaGUgY2hhcmFjdGVycyB0byB0cmltLlxuICAgICAqIEBwYXJhbS0ge09iamVjdH0gW2d1YXJkXSBFbmFibGVzIHVzZSBhcyBhIGNhbGxiYWNrIGZvciBmdW5jdGlvbnMgbGlrZSBgXy5tYXBgLlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIHRyaW1tZWQgc3RyaW5nLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnRyaW0oJyAgYWJjICAnKTtcbiAgICAgKiAvLyA9PiAnYWJjJ1xuICAgICAqXG4gICAgICogXy50cmltKCctXy1hYmMtXy0nLCAnXy0nKTtcbiAgICAgKiAvLyA9PiAnYWJjJ1xuICAgICAqXG4gICAgICogXy5tYXAoWycgIGZvbyAgJywgJyAgYmFyICAnXSwgXy50cmltKTtcbiAgICAgKiAvLyA9PiBbJ2ZvbycsICdiYXInXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHRyaW0oc3RyaW5nLCBjaGFycywgZ3VhcmQpIHtcbiAgICAgIHZhciB2YWx1ZSA9IHN0cmluZztcbiAgICAgIHN0cmluZyA9IGJhc2VUb1N0cmluZyhzdHJpbmcpO1xuICAgICAgaWYgKCFzdHJpbmcpIHtcbiAgICAgICAgcmV0dXJuIHN0cmluZztcbiAgICAgIH1cbiAgICAgIGlmIChndWFyZCA/IGlzSXRlcmF0ZWVDYWxsKHZhbHVlLCBjaGFycywgZ3VhcmQpIDogY2hhcnMgPT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gc3RyaW5nLnNsaWNlKHRyaW1tZWRMZWZ0SW5kZXgoc3RyaW5nKSwgdHJpbW1lZFJpZ2h0SW5kZXgoc3RyaW5nKSArIDEpO1xuICAgICAgfVxuICAgICAgY2hhcnMgPSAoY2hhcnMgKyAnJyk7XG4gICAgICByZXR1cm4gc3RyaW5nLnNsaWNlKGNoYXJzTGVmdEluZGV4KHN0cmluZywgY2hhcnMpLCBjaGFyc1JpZ2h0SW5kZXgoc3RyaW5nLCBjaGFycykgKyAxKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIGxlYWRpbmcgd2hpdGVzcGFjZSBvciBzcGVjaWZpZWQgY2hhcmFjdGVycyBmcm9tIGBzdHJpbmdgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IFN0cmluZ1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbc3RyaW5nPScnXSBUaGUgc3RyaW5nIHRvIHRyaW0uXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtjaGFycz13aGl0ZXNwYWNlXSBUaGUgY2hhcmFjdGVycyB0byB0cmltLlxuICAgICAqIEBwYXJhbS0ge09iamVjdH0gW2d1YXJkXSBFbmFibGVzIHVzZSBhcyBhIGNhbGxiYWNrIGZvciBmdW5jdGlvbnMgbGlrZSBgXy5tYXBgLlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIHRyaW1tZWQgc3RyaW5nLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnRyaW1MZWZ0KCcgIGFiYyAgJyk7XG4gICAgICogLy8gPT4gJ2FiYyAgJ1xuICAgICAqXG4gICAgICogXy50cmltTGVmdCgnLV8tYWJjLV8tJywgJ18tJyk7XG4gICAgICogLy8gPT4gJ2FiYy1fLSdcbiAgICAgKi9cbiAgICBmdW5jdGlvbiB0cmltTGVmdChzdHJpbmcsIGNoYXJzLCBndWFyZCkge1xuICAgICAgdmFyIHZhbHVlID0gc3RyaW5nO1xuICAgICAgc3RyaW5nID0gYmFzZVRvU3RyaW5nKHN0cmluZyk7XG4gICAgICBpZiAoIXN0cmluZykge1xuICAgICAgICByZXR1cm4gc3RyaW5nO1xuICAgICAgfVxuICAgICAgaWYgKGd1YXJkID8gaXNJdGVyYXRlZUNhbGwodmFsdWUsIGNoYXJzLCBndWFyZCkgOiBjaGFycyA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybiBzdHJpbmcuc2xpY2UodHJpbW1lZExlZnRJbmRleChzdHJpbmcpKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBzdHJpbmcuc2xpY2UoY2hhcnNMZWZ0SW5kZXgoc3RyaW5nLCAoY2hhcnMgKyAnJykpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIHRyYWlsaW5nIHdoaXRlc3BhY2Ugb3Igc3BlY2lmaWVkIGNoYXJhY3RlcnMgZnJvbSBgc3RyaW5nYC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBjYXRlZ29yeSBTdHJpbmdcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3N0cmluZz0nJ10gVGhlIHN0cmluZyB0byB0cmltLlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbY2hhcnM9d2hpdGVzcGFjZV0gVGhlIGNoYXJhY3RlcnMgdG8gdHJpbS5cbiAgICAgKiBAcGFyYW0tIHtPYmplY3R9IFtndWFyZF0gRW5hYmxlcyB1c2UgYXMgYSBjYWxsYmFjayBmb3IgZnVuY3Rpb25zIGxpa2UgYF8ubWFwYC5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSB0cmltbWVkIHN0cmluZy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy50cmltUmlnaHQoJyAgYWJjICAnKTtcbiAgICAgKiAvLyA9PiAnICBhYmMnXG4gICAgICpcbiAgICAgKiBfLnRyaW1SaWdodCgnLV8tYWJjLV8tJywgJ18tJyk7XG4gICAgICogLy8gPT4gJy1fLWFiYydcbiAgICAgKi9cbiAgICBmdW5jdGlvbiB0cmltUmlnaHQoc3RyaW5nLCBjaGFycywgZ3VhcmQpIHtcbiAgICAgIHZhciB2YWx1ZSA9IHN0cmluZztcbiAgICAgIHN0cmluZyA9IGJhc2VUb1N0cmluZyhzdHJpbmcpO1xuICAgICAgaWYgKCFzdHJpbmcpIHtcbiAgICAgICAgcmV0dXJuIHN0cmluZztcbiAgICAgIH1cbiAgICAgIGlmIChndWFyZCA/IGlzSXRlcmF0ZWVDYWxsKHZhbHVlLCBjaGFycywgZ3VhcmQpIDogY2hhcnMgPT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gc3RyaW5nLnNsaWNlKDAsIHRyaW1tZWRSaWdodEluZGV4KHN0cmluZykgKyAxKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBzdHJpbmcuc2xpY2UoMCwgY2hhcnNSaWdodEluZGV4KHN0cmluZywgKGNoYXJzICsgJycpKSArIDEpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRydW5jYXRlcyBgc3RyaW5nYCBpZiBpdCdzIGxvbmdlciB0aGFuIHRoZSBnaXZlbiBtYXhpbXVtIHN0cmluZyBsZW5ndGguXG4gICAgICogVGhlIGxhc3QgY2hhcmFjdGVycyBvZiB0aGUgdHJ1bmNhdGVkIHN0cmluZyBhcmUgcmVwbGFjZWQgd2l0aCB0aGUgb21pc3Npb25cbiAgICAgKiBzdHJpbmcgd2hpY2ggZGVmYXVsdHMgdG8gXCIuLi5cIi5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBjYXRlZ29yeSBTdHJpbmdcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3N0cmluZz0nJ10gVGhlIHN0cmluZyB0byB0cnVuY2F0ZS5cbiAgICAgKiBAcGFyYW0ge09iamVjdHxudW1iZXJ9IFtvcHRpb25zXSBUaGUgb3B0aW9ucyBvYmplY3Qgb3IgbWF4aW11bSBzdHJpbmcgbGVuZ3RoLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbb3B0aW9ucy5sZW5ndGg9MzBdIFRoZSBtYXhpbXVtIHN0cmluZyBsZW5ndGguXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRpb25zLm9taXNzaW9uPScuLi4nXSBUaGUgc3RyaW5nIHRvIGluZGljYXRlIHRleHQgaXMgb21pdHRlZC5cbiAgICAgKiBAcGFyYW0ge1JlZ0V4cHxzdHJpbmd9IFtvcHRpb25zLnNlcGFyYXRvcl0gVGhlIHNlcGFyYXRvciBwYXR0ZXJuIHRvIHRydW5jYXRlIHRvLlxuICAgICAqIEBwYXJhbS0ge09iamVjdH0gW2d1YXJkXSBFbmFibGVzIHVzZSBhcyBhIGNhbGxiYWNrIGZvciBmdW5jdGlvbnMgbGlrZSBgXy5tYXBgLlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIHRydW5jYXRlZCBzdHJpbmcuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8udHJ1bmMoJ2hpLWRpZGRseS1obyB0aGVyZSwgbmVpZ2hib3Jpbm8nKTtcbiAgICAgKiAvLyA9PiAnaGktZGlkZGx5LWhvIHRoZXJlLCBuZWlnaGJvLi4uJ1xuICAgICAqXG4gICAgICogXy50cnVuYygnaGktZGlkZGx5LWhvIHRoZXJlLCBuZWlnaGJvcmlubycsIDI0KTtcbiAgICAgKiAvLyA9PiAnaGktZGlkZGx5LWhvIHRoZXJlLCBuLi4uJ1xuICAgICAqXG4gICAgICogXy50cnVuYygnaGktZGlkZGx5LWhvIHRoZXJlLCBuZWlnaGJvcmlubycsIHtcbiAgICAgKiAgICdsZW5ndGgnOiAyNCxcbiAgICAgKiAgICdzZXBhcmF0b3InOiAnICdcbiAgICAgKiB9KTtcbiAgICAgKiAvLyA9PiAnaGktZGlkZGx5LWhvIHRoZXJlLC4uLidcbiAgICAgKlxuICAgICAqIF8udHJ1bmMoJ2hpLWRpZGRseS1obyB0aGVyZSwgbmVpZ2hib3Jpbm8nLCB7XG4gICAgICogICAnbGVuZ3RoJzogMjQsXG4gICAgICogICAnc2VwYXJhdG9yJzogLyw/ICsvXG4gICAgICogfSk7XG4gICAgICogLy8gPT4gJ2hpLWRpZGRseS1obyB0aGVyZS4uLidcbiAgICAgKlxuICAgICAqIF8udHJ1bmMoJ2hpLWRpZGRseS1obyB0aGVyZSwgbmVpZ2hib3Jpbm8nLCB7XG4gICAgICogICAnb21pc3Npb24nOiAnIFsuLi5dJ1xuICAgICAqIH0pO1xuICAgICAqIC8vID0+ICdoaS1kaWRkbHktaG8gdGhlcmUsIG5laWcgWy4uLl0nXG4gICAgICovXG4gICAgZnVuY3Rpb24gdHJ1bmMoc3RyaW5nLCBvcHRpb25zLCBndWFyZCkge1xuICAgICAgaWYgKGd1YXJkICYmIGlzSXRlcmF0ZWVDYWxsKHN0cmluZywgb3B0aW9ucywgZ3VhcmQpKSB7XG4gICAgICAgIG9wdGlvbnMgPSB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgICB2YXIgbGVuZ3RoID0gREVGQVVMVF9UUlVOQ19MRU5HVEgsXG4gICAgICAgICAgb21pc3Npb24gPSBERUZBVUxUX1RSVU5DX09NSVNTSU9OO1xuXG4gICAgICBpZiAob3B0aW9ucyAhPSBudWxsKSB7XG4gICAgICAgIGlmIChpc09iamVjdChvcHRpb25zKSkge1xuICAgICAgICAgIHZhciBzZXBhcmF0b3IgPSAnc2VwYXJhdG9yJyBpbiBvcHRpb25zID8gb3B0aW9ucy5zZXBhcmF0b3IgOiBzZXBhcmF0b3I7XG4gICAgICAgICAgbGVuZ3RoID0gJ2xlbmd0aCcgaW4gb3B0aW9ucyA/ICgrb3B0aW9ucy5sZW5ndGggfHwgMCkgOiBsZW5ndGg7XG4gICAgICAgICAgb21pc3Npb24gPSAnb21pc3Npb24nIGluIG9wdGlvbnMgPyBiYXNlVG9TdHJpbmcob3B0aW9ucy5vbWlzc2lvbikgOiBvbWlzc2lvbjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBsZW5ndGggPSArb3B0aW9ucyB8fCAwO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBzdHJpbmcgPSBiYXNlVG9TdHJpbmcoc3RyaW5nKTtcbiAgICAgIGlmIChsZW5ndGggPj0gc3RyaW5nLmxlbmd0aCkge1xuICAgICAgICByZXR1cm4gc3RyaW5nO1xuICAgICAgfVxuICAgICAgdmFyIGVuZCA9IGxlbmd0aCAtIG9taXNzaW9uLmxlbmd0aDtcbiAgICAgIGlmIChlbmQgPCAxKSB7XG4gICAgICAgIHJldHVybiBvbWlzc2lvbjtcbiAgICAgIH1cbiAgICAgIHZhciByZXN1bHQgPSBzdHJpbmcuc2xpY2UoMCwgZW5kKTtcbiAgICAgIGlmIChzZXBhcmF0b3IgPT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gcmVzdWx0ICsgb21pc3Npb247XG4gICAgICB9XG4gICAgICBpZiAoaXNSZWdFeHAoc2VwYXJhdG9yKSkge1xuICAgICAgICBpZiAoc3RyaW5nLnNsaWNlKGVuZCkuc2VhcmNoKHNlcGFyYXRvcikpIHtcbiAgICAgICAgICB2YXIgbWF0Y2gsXG4gICAgICAgICAgICAgIG5ld0VuZCxcbiAgICAgICAgICAgICAgc3Vic3RyaW5nID0gc3RyaW5nLnNsaWNlKDAsIGVuZCk7XG5cbiAgICAgICAgICBpZiAoIXNlcGFyYXRvci5nbG9iYWwpIHtcbiAgICAgICAgICAgIHNlcGFyYXRvciA9IFJlZ0V4cChzZXBhcmF0b3Iuc291cmNlLCAocmVGbGFncy5leGVjKHNlcGFyYXRvcikgfHwgJycpICsgJ2cnKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgc2VwYXJhdG9yLmxhc3RJbmRleCA9IDA7XG4gICAgICAgICAgd2hpbGUgKChtYXRjaCA9IHNlcGFyYXRvci5leGVjKHN1YnN0cmluZykpKSB7XG4gICAgICAgICAgICBuZXdFbmQgPSBtYXRjaC5pbmRleDtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmVzdWx0ID0gcmVzdWx0LnNsaWNlKDAsIG5ld0VuZCA9PSBudWxsID8gZW5kIDogbmV3RW5kKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChzdHJpbmcuaW5kZXhPZihzZXBhcmF0b3IsIGVuZCkgIT0gZW5kKSB7XG4gICAgICAgIHZhciBpbmRleCA9IHJlc3VsdC5sYXN0SW5kZXhPZihzZXBhcmF0b3IpO1xuICAgICAgICBpZiAoaW5kZXggPiAtMSkge1xuICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdC5zbGljZSgwLCBpbmRleCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQgKyBvbWlzc2lvbjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgaW52ZXJzZSBvZiBgXy5lc2NhcGVgOyB0aGlzIG1ldGhvZCBjb252ZXJ0cyB0aGUgSFRNTCBlbnRpdGllc1xuICAgICAqIGAmYW1wO2AsIGAmbHQ7YCwgYCZndDtgLCBgJnF1b3Q7YCwgYCYjMzk7YCwgYW5kIGAmIzk2O2AgaW4gYHN0cmluZ2AgdG8gdGhlaXJcbiAgICAgKiBjb3JyZXNwb25kaW5nIGNoYXJhY3RlcnMuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogTm8gb3RoZXIgSFRNTCBlbnRpdGllcyBhcmUgdW5lc2NhcGVkLiBUbyB1bmVzY2FwZSBhZGRpdGlvbmFsIEhUTUxcbiAgICAgKiBlbnRpdGllcyB1c2UgYSB0aGlyZC1wYXJ0eSBsaWJyYXJ5IGxpa2UgW19oZV9dKGh0dHBzOi8vbXRocy5iZS9oZSkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAY2F0ZWdvcnkgU3RyaW5nXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtzdHJpbmc9JyddIFRoZSBzdHJpbmcgdG8gdW5lc2NhcGUuXG4gICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgdW5lc2NhcGVkIHN0cmluZy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy51bmVzY2FwZSgnZnJlZCwgYmFybmV5LCAmYW1wOyBwZWJibGVzJyk7XG4gICAgICogLy8gPT4gJ2ZyZWQsIGJhcm5leSwgJiBwZWJibGVzJ1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIHVuZXNjYXBlKHN0cmluZykge1xuICAgICAgc3RyaW5nID0gYmFzZVRvU3RyaW5nKHN0cmluZyk7XG4gICAgICByZXR1cm4gKHN0cmluZyAmJiByZUhhc0VzY2FwZWRIdG1sLnRlc3Qoc3RyaW5nKSlcbiAgICAgICAgPyBzdHJpbmcucmVwbGFjZShyZUVzY2FwZWRIdG1sLCB1bmVzY2FwZUh0bWxDaGFyKVxuICAgICAgICA6IHN0cmluZztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTcGxpdHMgYHN0cmluZ2AgaW50byBhbiBhcnJheSBvZiBpdHMgd29yZHMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAY2F0ZWdvcnkgU3RyaW5nXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtzdHJpbmc9JyddIFRoZSBzdHJpbmcgdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0ge1JlZ0V4cHxzdHJpbmd9IFtwYXR0ZXJuXSBUaGUgcGF0dGVybiB0byBtYXRjaCB3b3Jkcy5cbiAgICAgKiBAcGFyYW0tIHtPYmplY3R9IFtndWFyZF0gRW5hYmxlcyB1c2UgYXMgYSBjYWxsYmFjayBmb3IgZnVuY3Rpb25zIGxpa2UgYF8ubWFwYC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIHdvcmRzIG9mIGBzdHJpbmdgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLndvcmRzKCdmcmVkLCBiYXJuZXksICYgcGViYmxlcycpO1xuICAgICAqIC8vID0+IFsnZnJlZCcsICdiYXJuZXknLCAncGViYmxlcyddXG4gICAgICpcbiAgICAgKiBfLndvcmRzKCdmcmVkLCBiYXJuZXksICYgcGViYmxlcycsIC9bXiwgXSsvZyk7XG4gICAgICogLy8gPT4gWydmcmVkJywgJ2Jhcm5leScsICcmJywgJ3BlYmJsZXMnXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHdvcmRzKHN0cmluZywgcGF0dGVybiwgZ3VhcmQpIHtcbiAgICAgIGlmIChndWFyZCAmJiBpc0l0ZXJhdGVlQ2FsbChzdHJpbmcsIHBhdHRlcm4sIGd1YXJkKSkge1xuICAgICAgICBwYXR0ZXJuID0gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgICAgc3RyaW5nID0gYmFzZVRvU3RyaW5nKHN0cmluZyk7XG4gICAgICByZXR1cm4gc3RyaW5nLm1hdGNoKHBhdHRlcm4gfHwgcmVXb3JkcykgfHwgW107XG4gICAgfVxuXG4gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuXG4gICAgLyoqXG4gICAgICogQXR0ZW1wdHMgdG8gaW52b2tlIGBmdW5jYCwgcmV0dXJuaW5nIGVpdGhlciB0aGUgcmVzdWx0IG9yIHRoZSBjYXVnaHQgZXJyb3JcbiAgICAgKiBvYmplY3QuIEFueSBhZGRpdGlvbmFsIGFyZ3VtZW50cyBhcmUgcHJvdmlkZWQgdG8gYGZ1bmNgIHdoZW4gaXQgaXMgaW52b2tlZC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBjYXRlZ29yeSBVdGlsaXR5XG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gYXR0ZW1wdC5cbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgYGZ1bmNgIHJlc3VsdCBvciBlcnJvciBvYmplY3QuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIC8vIGF2b2lkIHRocm93aW5nIGVycm9ycyBmb3IgaW52YWxpZCBzZWxlY3RvcnNcbiAgICAgKiB2YXIgZWxlbWVudHMgPSBfLmF0dGVtcHQoZnVuY3Rpb24oc2VsZWN0b3IpIHtcbiAgICAgKiAgIHJldHVybiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKHNlbGVjdG9yKTtcbiAgICAgKiB9LCAnPl8+Jyk7XG4gICAgICpcbiAgICAgKiBpZiAoXy5pc0Vycm9yKGVsZW1lbnRzKSkge1xuICAgICAqICAgZWxlbWVudHMgPSBbXTtcbiAgICAgKiB9XG4gICAgICovXG4gICAgdmFyIGF0dGVtcHQgPSByZXN0UGFyYW0oZnVuY3Rpb24oZnVuYywgYXJncykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIGZ1bmMuYXBwbHkodW5kZWZpbmVkLCBhcmdzKTtcbiAgICAgIH0gY2F0Y2goZSkge1xuICAgICAgICByZXR1cm4gaXNFcnJvcihlKSA/IGUgOiBuZXcgRXJyb3IoZSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCBpbnZva2VzIGBmdW5jYCB3aXRoIHRoZSBgdGhpc2AgYmluZGluZyBvZiBgdGhpc0FyZ2BcbiAgICAgKiBhbmQgYXJndW1lbnRzIG9mIHRoZSBjcmVhdGVkIGZ1bmN0aW9uLiBJZiBgZnVuY2AgaXMgYSBwcm9wZXJ0eSBuYW1lIHRoZVxuICAgICAqIGNyZWF0ZWQgY2FsbGJhY2sgcmV0dXJucyB0aGUgcHJvcGVydHkgdmFsdWUgZm9yIGEgZ2l2ZW4gZWxlbWVudC4gSWYgYGZ1bmNgXG4gICAgICogaXMgYW4gb2JqZWN0IHRoZSBjcmVhdGVkIGNhbGxiYWNrIHJldHVybnMgYHRydWVgIGZvciBlbGVtZW50cyB0aGF0IGNvbnRhaW5cbiAgICAgKiB0aGUgZXF1aXZhbGVudCBvYmplY3QgcHJvcGVydGllcywgb3RoZXJ3aXNlIGl0IHJldHVybnMgYGZhbHNlYC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBhbGlhcyBpdGVyYXRlZVxuICAgICAqIEBjYXRlZ29yeSBVdGlsaXR5XG4gICAgICogQHBhcmFtIHsqfSBbZnVuYz1fLmlkZW50aXR5XSBUaGUgdmFsdWUgdG8gY29udmVydCB0byBhIGNhbGxiYWNrLlxuICAgICAqIEBwYXJhbSB7Kn0gW3RoaXNBcmddIFRoZSBgdGhpc2AgYmluZGluZyBvZiBgZnVuY2AuXG4gICAgICogQHBhcmFtLSB7T2JqZWN0fSBbZ3VhcmRdIEVuYWJsZXMgdXNlIGFzIGEgY2FsbGJhY2sgZm9yIGZ1bmN0aW9ucyBsaWtlIGBfLm1hcGAuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBjYWxsYmFjay5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIHVzZXJzID0gW1xuICAgICAqICAgeyAndXNlcic6ICdiYXJuZXknLCAnYWdlJzogMzYgfSxcbiAgICAgKiAgIHsgJ3VzZXInOiAnZnJlZCcsICAgJ2FnZSc6IDQwIH1cbiAgICAgKiBdO1xuICAgICAqXG4gICAgICogLy8gd3JhcCB0byBjcmVhdGUgY3VzdG9tIGNhbGxiYWNrIHNob3J0aGFuZHNcbiAgICAgKiBfLmNhbGxiYWNrID0gXy53cmFwKF8uY2FsbGJhY2ssIGZ1bmN0aW9uKGNhbGxiYWNrLCBmdW5jLCB0aGlzQXJnKSB7XG4gICAgICogICB2YXIgbWF0Y2ggPSAvXiguKz8pX18oW2dsXXQpKC4rKSQvLmV4ZWMoZnVuYyk7XG4gICAgICogICBpZiAoIW1hdGNoKSB7XG4gICAgICogICAgIHJldHVybiBjYWxsYmFjayhmdW5jLCB0aGlzQXJnKTtcbiAgICAgKiAgIH1cbiAgICAgKiAgIHJldHVybiBmdW5jdGlvbihvYmplY3QpIHtcbiAgICAgKiAgICAgcmV0dXJuIG1hdGNoWzJdID09ICdndCdcbiAgICAgKiAgICAgICA/IG9iamVjdFttYXRjaFsxXV0gPiBtYXRjaFszXVxuICAgICAqICAgICAgIDogb2JqZWN0W21hdGNoWzFdXSA8IG1hdGNoWzNdO1xuICAgICAqICAgfTtcbiAgICAgKiB9KTtcbiAgICAgKlxuICAgICAqIF8uZmlsdGVyKHVzZXJzLCAnYWdlX19ndDM2Jyk7XG4gICAgICogLy8gPT4gW3sgJ3VzZXInOiAnZnJlZCcsICdhZ2UnOiA0MCB9XVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNhbGxiYWNrKGZ1bmMsIHRoaXNBcmcsIGd1YXJkKSB7XG4gICAgICBpZiAoZ3VhcmQgJiYgaXNJdGVyYXRlZUNhbGwoZnVuYywgdGhpc0FyZywgZ3VhcmQpKSB7XG4gICAgICAgIHRoaXNBcmcgPSB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gaXNPYmplY3RMaWtlKGZ1bmMpXG4gICAgICAgID8gbWF0Y2hlcyhmdW5jKVxuICAgICAgICA6IGJhc2VDYWxsYmFjayhmdW5jLCB0aGlzQXJnKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCByZXR1cm5zIGB2YWx1ZWAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAY2F0ZWdvcnkgVXRpbGl0eVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHJldHVybiBmcm9tIHRoZSBuZXcgZnVuY3Rpb24uXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgZnVuY3Rpb24uXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBvYmplY3QgPSB7ICd1c2VyJzogJ2ZyZWQnIH07XG4gICAgICogdmFyIGdldHRlciA9IF8uY29uc3RhbnQob2JqZWN0KTtcbiAgICAgKlxuICAgICAqIGdldHRlcigpID09PSBvYmplY3Q7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNvbnN0YW50KHZhbHVlKSB7XG4gICAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgcmV0dXJucyB0aGUgZmlyc3QgYXJndW1lbnQgcHJvdmlkZWQgdG8gaXQuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAY2F0ZWdvcnkgVXRpbGl0eVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgQW55IHZhbHVlLlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIGB2YWx1ZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBvYmplY3QgPSB7ICd1c2VyJzogJ2ZyZWQnIH07XG4gICAgICpcbiAgICAgKiBfLmlkZW50aXR5KG9iamVjdCkgPT09IG9iamVjdDtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICovXG4gICAgZnVuY3Rpb24gaWRlbnRpdHkodmFsdWUpIHtcbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCBwZXJmb3JtcyBhIGRlZXAgY29tcGFyaXNvbiBiZXR3ZWVuIGEgZ2l2ZW4gb2JqZWN0XG4gICAgICogYW5kIGBzb3VyY2VgLCByZXR1cm5pbmcgYHRydWVgIGlmIHRoZSBnaXZlbiBvYmplY3QgaGFzIGVxdWl2YWxlbnQgcHJvcGVydHlcbiAgICAgKiB2YWx1ZXMsIGVsc2UgYGZhbHNlYC5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBzdXBwb3J0cyBjb21wYXJpbmcgYXJyYXlzLCBib29sZWFucywgYERhdGVgIG9iamVjdHMsXG4gICAgICogbnVtYmVycywgYE9iamVjdGAgb2JqZWN0cywgcmVnZXhlcywgYW5kIHN0cmluZ3MuIE9iamVjdHMgYXJlIGNvbXBhcmVkIGJ5XG4gICAgICogdGhlaXIgb3duLCBub3QgaW5oZXJpdGVkLCBlbnVtZXJhYmxlIHByb3BlcnRpZXMuIEZvciBjb21wYXJpbmcgYSBzaW5nbGVcbiAgICAgKiBvd24gb3IgaW5oZXJpdGVkIHByb3BlcnR5IHZhbHVlIHNlZSBgXy5tYXRjaGVzUHJvcGVydHlgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IFV0aWxpdHlcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gc291cmNlIFRoZSBvYmplY3Qgb2YgcHJvcGVydHkgdmFsdWVzIHRvIG1hdGNoLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGZ1bmN0aW9uLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgdXNlcnMgPSBbXG4gICAgICogICB7ICd1c2VyJzogJ2Jhcm5leScsICdhZ2UnOiAzNiwgJ2FjdGl2ZSc6IHRydWUgfSxcbiAgICAgKiAgIHsgJ3VzZXInOiAnZnJlZCcsICAgJ2FnZSc6IDQwLCAnYWN0aXZlJzogZmFsc2UgfVxuICAgICAqIF07XG4gICAgICpcbiAgICAgKiBfLmZpbHRlcih1c2VycywgXy5tYXRjaGVzKHsgJ2FnZSc6IDQwLCAnYWN0aXZlJzogZmFsc2UgfSkpO1xuICAgICAqIC8vID0+IFt7ICd1c2VyJzogJ2ZyZWQnLCAnYWdlJzogNDAsICdhY3RpdmUnOiBmYWxzZSB9XVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIG1hdGNoZXMoc291cmNlKSB7XG4gICAgICByZXR1cm4gYmFzZU1hdGNoZXMoYmFzZUNsb25lKHNvdXJjZSwgdHJ1ZSkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IGNvbXBhcmVzIHRoZSBwcm9wZXJ0eSB2YWx1ZSBvZiBgcGF0aGAgb24gYSBnaXZlblxuICAgICAqIG9iamVjdCB0byBgdmFsdWVgLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoaXMgbWV0aG9kIHN1cHBvcnRzIGNvbXBhcmluZyBhcnJheXMsIGJvb2xlYW5zLCBgRGF0ZWAgb2JqZWN0cyxcbiAgICAgKiBudW1iZXJzLCBgT2JqZWN0YCBvYmplY3RzLCByZWdleGVzLCBhbmQgc3RyaW5ncy4gT2JqZWN0cyBhcmUgY29tcGFyZWQgYnlcbiAgICAgKiB0aGVpciBvd24sIG5vdCBpbmhlcml0ZWQsIGVudW1lcmFibGUgcHJvcGVydGllcy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBjYXRlZ29yeSBVdGlsaXR5XG4gICAgICogQHBhcmFtIHtBcnJheXxzdHJpbmd9IHBhdGggVGhlIHBhdGggb2YgdGhlIHByb3BlcnR5IHRvIGdldC5cbiAgICAgKiBAcGFyYW0geyp9IHNyY1ZhbHVlIFRoZSB2YWx1ZSB0byBtYXRjaC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBmdW5jdGlvbi5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIHVzZXJzID0gW1xuICAgICAqICAgeyAndXNlcic6ICdiYXJuZXknIH0sXG4gICAgICogICB7ICd1c2VyJzogJ2ZyZWQnIH1cbiAgICAgKiBdO1xuICAgICAqXG4gICAgICogXy5maW5kKHVzZXJzLCBfLm1hdGNoZXNQcm9wZXJ0eSgndXNlcicsICdmcmVkJykpO1xuICAgICAqIC8vID0+IHsgJ3VzZXInOiAnZnJlZCcgfVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIG1hdGNoZXNQcm9wZXJ0eShwYXRoLCBzcmNWYWx1ZSkge1xuICAgICAgcmV0dXJuIGJhc2VNYXRjaGVzUHJvcGVydHkocGF0aCwgYmFzZUNsb25lKHNyY1ZhbHVlLCB0cnVlKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgaW52b2tlcyB0aGUgbWV0aG9kIGF0IGBwYXRoYCBvbiBhIGdpdmVuIG9iamVjdC5cbiAgICAgKiBBbnkgYWRkaXRpb25hbCBhcmd1bWVudHMgYXJlIHByb3ZpZGVkIHRvIHRoZSBpbnZva2VkIG1ldGhvZC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBjYXRlZ29yeSBVdGlsaXR5XG4gICAgICogQHBhcmFtIHtBcnJheXxzdHJpbmd9IHBhdGggVGhlIHBhdGggb2YgdGhlIG1ldGhvZCB0byBpbnZva2UuXG4gICAgICogQHBhcmFtIHsuLi4qfSBbYXJnc10gVGhlIGFyZ3VtZW50cyB0byBpbnZva2UgdGhlIG1ldGhvZCB3aXRoLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGZ1bmN0aW9uLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0cyA9IFtcbiAgICAgKiAgIHsgJ2EnOiB7ICdiJzogeyAnYyc6IF8uY29uc3RhbnQoMikgfSB9IH0sXG4gICAgICogICB7ICdhJzogeyAnYic6IHsgJ2MnOiBfLmNvbnN0YW50KDEpIH0gfSB9XG4gICAgICogXTtcbiAgICAgKlxuICAgICAqIF8ubWFwKG9iamVjdHMsIF8ubWV0aG9kKCdhLmIuYycpKTtcbiAgICAgKiAvLyA9PiBbMiwgMV1cbiAgICAgKlxuICAgICAqIF8uaW52b2tlKF8uc29ydEJ5KG9iamVjdHMsIF8ubWV0aG9kKFsnYScsICdiJywgJ2MnXSkpLCAnYS5iLmMnKTtcbiAgICAgKiAvLyA9PiBbMSwgMl1cbiAgICAgKi9cbiAgICB2YXIgbWV0aG9kID0gcmVzdFBhcmFtKGZ1bmN0aW9uKHBhdGgsIGFyZ3MpIHtcbiAgICAgIHJldHVybiBmdW5jdGlvbihvYmplY3QpIHtcbiAgICAgICAgcmV0dXJuIGludm9rZVBhdGgob2JqZWN0LCBwYXRoLCBhcmdzKTtcbiAgICAgIH07XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgb3Bwb3NpdGUgb2YgYF8ubWV0aG9kYDsgdGhpcyBtZXRob2QgY3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgaW52b2tlc1xuICAgICAqIHRoZSBtZXRob2QgYXQgYSBnaXZlbiBwYXRoIG9uIGBvYmplY3RgLiBBbnkgYWRkaXRpb25hbCBhcmd1bWVudHMgYXJlXG4gICAgICogcHJvdmlkZWQgdG8gdGhlIGludm9rZWQgbWV0aG9kLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IFV0aWxpdHlcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gICAgICogQHBhcmFtIHsuLi4qfSBbYXJnc10gVGhlIGFyZ3VtZW50cyB0byBpbnZva2UgdGhlIG1ldGhvZCB3aXRoLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGZ1bmN0aW9uLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgYXJyYXkgPSBfLnRpbWVzKDMsIF8uY29uc3RhbnQpLFxuICAgICAqICAgICBvYmplY3QgPSB7ICdhJzogYXJyYXksICdiJzogYXJyYXksICdjJzogYXJyYXkgfTtcbiAgICAgKlxuICAgICAqIF8ubWFwKFsnYVsyXScsICdjWzBdJ10sIF8ubWV0aG9kT2Yob2JqZWN0KSk7XG4gICAgICogLy8gPT4gWzIsIDBdXG4gICAgICpcbiAgICAgKiBfLm1hcChbWydhJywgJzInXSwgWydjJywgJzAnXV0sIF8ubWV0aG9kT2Yob2JqZWN0KSk7XG4gICAgICogLy8gPT4gWzIsIDBdXG4gICAgICovXG4gICAgdmFyIG1ldGhvZE9mID0gcmVzdFBhcmFtKGZ1bmN0aW9uKG9iamVjdCwgYXJncykge1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uKHBhdGgpIHtcbiAgICAgICAgcmV0dXJuIGludm9rZVBhdGgob2JqZWN0LCBwYXRoLCBhcmdzKTtcbiAgICAgIH07XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBBZGRzIGFsbCBvd24gZW51bWVyYWJsZSBmdW5jdGlvbiBwcm9wZXJ0aWVzIG9mIGEgc291cmNlIG9iamVjdCB0byB0aGVcbiAgICAgKiBkZXN0aW5hdGlvbiBvYmplY3QuIElmIGBvYmplY3RgIGlzIGEgZnVuY3Rpb24gdGhlbiBtZXRob2RzIGFyZSBhZGRlZCB0b1xuICAgICAqIGl0cyBwcm90b3R5cGUgYXMgd2VsbC5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBVc2UgYF8ucnVuSW5Db250ZXh0YCB0byBjcmVhdGUgYSBwcmlzdGluZSBgbG9kYXNoYCBmdW5jdGlvbiB0b1xuICAgICAqIGF2b2lkIGNvbmZsaWN0cyBjYXVzZWQgYnkgbW9kaWZ5aW5nIHRoZSBvcmlnaW5hbC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBjYXRlZ29yeSBVdGlsaXR5XG4gICAgICogQHBhcmFtIHtGdW5jdGlvbnxPYmplY3R9IFtvYmplY3Q9bG9kYXNoXSBUaGUgZGVzdGluYXRpb24gb2JqZWN0LlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBzb3VyY2UgVGhlIG9iamVjdCBvZiBmdW5jdGlvbnMgdG8gYWRkLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc10gVGhlIG9wdGlvbnMgb2JqZWN0LlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMuY2hhaW49dHJ1ZV0gU3BlY2lmeSB3aGV0aGVyIHRoZSBmdW5jdGlvbnMgYWRkZWRcbiAgICAgKiAgYXJlIGNoYWluYWJsZS5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb258T2JqZWN0fSBSZXR1cm5zIGBvYmplY3RgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBmdW5jdGlvbiB2b3dlbHMoc3RyaW5nKSB7XG4gICAgICogICByZXR1cm4gXy5maWx0ZXIoc3RyaW5nLCBmdW5jdGlvbih2KSB7XG4gICAgICogICAgIHJldHVybiAvW2FlaW91XS9pLnRlc3Qodik7XG4gICAgICogICB9KTtcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiBfLm1peGluKHsgJ3Zvd2Vscyc6IHZvd2VscyB9KTtcbiAgICAgKiBfLnZvd2VscygnZnJlZCcpO1xuICAgICAqIC8vID0+IFsnZSddXG4gICAgICpcbiAgICAgKiBfKCdmcmVkJykudm93ZWxzKCkudmFsdWUoKTtcbiAgICAgKiAvLyA9PiBbJ2UnXVxuICAgICAqXG4gICAgICogXy5taXhpbih7ICd2b3dlbHMnOiB2b3dlbHMgfSwgeyAnY2hhaW4nOiBmYWxzZSB9KTtcbiAgICAgKiBfKCdmcmVkJykudm93ZWxzKCk7XG4gICAgICogLy8gPT4gWydlJ11cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBtaXhpbihvYmplY3QsIHNvdXJjZSwgb3B0aW9ucykge1xuICAgICAgaWYgKG9wdGlvbnMgPT0gbnVsbCkge1xuICAgICAgICB2YXIgaXNPYmogPSBpc09iamVjdChzb3VyY2UpLFxuICAgICAgICAgICAgcHJvcHMgPSBpc09iaiA/IGtleXMoc291cmNlKSA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIG1ldGhvZE5hbWVzID0gKHByb3BzICYmIHByb3BzLmxlbmd0aCkgPyBiYXNlRnVuY3Rpb25zKHNvdXJjZSwgcHJvcHMpIDogdW5kZWZpbmVkO1xuXG4gICAgICAgIGlmICghKG1ldGhvZE5hbWVzID8gbWV0aG9kTmFtZXMubGVuZ3RoIDogaXNPYmopKSB7XG4gICAgICAgICAgbWV0aG9kTmFtZXMgPSBmYWxzZTtcbiAgICAgICAgICBvcHRpb25zID0gc291cmNlO1xuICAgICAgICAgIHNvdXJjZSA9IG9iamVjdDtcbiAgICAgICAgICBvYmplY3QgPSB0aGlzO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoIW1ldGhvZE5hbWVzKSB7XG4gICAgICAgIG1ldGhvZE5hbWVzID0gYmFzZUZ1bmN0aW9ucyhzb3VyY2UsIGtleXMoc291cmNlKSk7XG4gICAgICB9XG4gICAgICB2YXIgY2hhaW4gPSB0cnVlLFxuICAgICAgICAgIGluZGV4ID0gLTEsXG4gICAgICAgICAgaXNGdW5jID0gaXNGdW5jdGlvbihvYmplY3QpLFxuICAgICAgICAgIGxlbmd0aCA9IG1ldGhvZE5hbWVzLmxlbmd0aDtcblxuICAgICAgaWYgKG9wdGlvbnMgPT09IGZhbHNlKSB7XG4gICAgICAgIGNoYWluID0gZmFsc2U7XG4gICAgICB9IGVsc2UgaWYgKGlzT2JqZWN0KG9wdGlvbnMpICYmICdjaGFpbicgaW4gb3B0aW9ucykge1xuICAgICAgICBjaGFpbiA9IG9wdGlvbnMuY2hhaW47XG4gICAgICB9XG4gICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICB2YXIgbWV0aG9kTmFtZSA9IG1ldGhvZE5hbWVzW2luZGV4XSxcbiAgICAgICAgICAgIGZ1bmMgPSBzb3VyY2VbbWV0aG9kTmFtZV07XG5cbiAgICAgICAgb2JqZWN0W21ldGhvZE5hbWVdID0gZnVuYztcbiAgICAgICAgaWYgKGlzRnVuYykge1xuICAgICAgICAgIG9iamVjdC5wcm90b3R5cGVbbWV0aG9kTmFtZV0gPSAoZnVuY3Rpb24oZnVuYykge1xuICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICB2YXIgY2hhaW5BbGwgPSB0aGlzLl9fY2hhaW5fXztcbiAgICAgICAgICAgICAgaWYgKGNoYWluIHx8IGNoYWluQWxsKSB7XG4gICAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9IG9iamVjdCh0aGlzLl9fd3JhcHBlZF9fKSxcbiAgICAgICAgICAgICAgICAgICAgYWN0aW9ucyA9IHJlc3VsdC5fX2FjdGlvbnNfXyA9IGFycmF5Q29weSh0aGlzLl9fYWN0aW9uc19fKTtcblxuICAgICAgICAgICAgICAgIGFjdGlvbnMucHVzaCh7ICdmdW5jJzogZnVuYywgJ2FyZ3MnOiBhcmd1bWVudHMsICd0aGlzQXJnJzogb2JqZWN0IH0pO1xuICAgICAgICAgICAgICAgIHJlc3VsdC5fX2NoYWluX18gPSBjaGFpbkFsbDtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJldHVybiBmdW5jLmFwcGx5KG9iamVjdCwgYXJyYXlQdXNoKFt0aGlzLnZhbHVlKCldLCBhcmd1bWVudHMpKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfShmdW5jKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBvYmplY3Q7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV2ZXJ0cyB0aGUgYF9gIHZhcmlhYmxlIHRvIGl0cyBwcmV2aW91cyB2YWx1ZSBhbmQgcmV0dXJucyBhIHJlZmVyZW5jZSB0b1xuICAgICAqIHRoZSBgbG9kYXNoYCBmdW5jdGlvbi5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBjYXRlZ29yeSBVdGlsaXR5XG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBgbG9kYXNoYCBmdW5jdGlvbi5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIGxvZGFzaCA9IF8ubm9Db25mbGljdCgpO1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIG5vQ29uZmxpY3QoKSB7XG4gICAgICByb290Ll8gPSBvbGREYXNoO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQSBuby1vcGVyYXRpb24gZnVuY3Rpb24gdGhhdCByZXR1cm5zIGB1bmRlZmluZWRgIHJlZ2FyZGxlc3Mgb2YgdGhlXG4gICAgICogYXJndW1lbnRzIGl0IHJlY2VpdmVzLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IFV0aWxpdHlcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIG9iamVjdCA9IHsgJ3VzZXInOiAnZnJlZCcgfTtcbiAgICAgKlxuICAgICAqIF8ubm9vcChvYmplY3QpID09PSB1bmRlZmluZWQ7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIG5vb3AoKSB7XG4gICAgICAvLyBObyBvcGVyYXRpb24gcGVyZm9ybWVkLlxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IHJldHVybnMgdGhlIHByb3BlcnR5IHZhbHVlIGF0IGBwYXRoYCBvbiBhXG4gICAgICogZ2l2ZW4gb2JqZWN0LlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IFV0aWxpdHlcbiAgICAgKiBAcGFyYW0ge0FycmF5fHN0cmluZ30gcGF0aCBUaGUgcGF0aCBvZiB0aGUgcHJvcGVydHkgdG8gZ2V0LlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGZ1bmN0aW9uLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0cyA9IFtcbiAgICAgKiAgIHsgJ2EnOiB7ICdiJzogeyAnYyc6IDIgfSB9IH0sXG4gICAgICogICB7ICdhJzogeyAnYic6IHsgJ2MnOiAxIH0gfSB9XG4gICAgICogXTtcbiAgICAgKlxuICAgICAqIF8ubWFwKG9iamVjdHMsIF8ucHJvcGVydHkoJ2EuYi5jJykpO1xuICAgICAqIC8vID0+IFsyLCAxXVxuICAgICAqXG4gICAgICogXy5wbHVjayhfLnNvcnRCeShvYmplY3RzLCBfLnByb3BlcnR5KFsnYScsICdiJywgJ2MnXSkpLCAnYS5iLmMnKTtcbiAgICAgKiAvLyA9PiBbMSwgMl1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBwcm9wZXJ0eShwYXRoKSB7XG4gICAgICByZXR1cm4gaXNLZXkocGF0aCkgPyBiYXNlUHJvcGVydHkocGF0aCkgOiBiYXNlUHJvcGVydHlEZWVwKHBhdGgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBvcHBvc2l0ZSBvZiBgXy5wcm9wZXJ0eWA7IHRoaXMgbWV0aG9kIGNyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IHJldHVybnNcbiAgICAgKiB0aGUgcHJvcGVydHkgdmFsdWUgYXQgYSBnaXZlbiBwYXRoIG9uIGBvYmplY3RgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IFV0aWxpdHlcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgZnVuY3Rpb24uXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBhcnJheSA9IFswLCAxLCAyXSxcbiAgICAgKiAgICAgb2JqZWN0ID0geyAnYSc6IGFycmF5LCAnYic6IGFycmF5LCAnYyc6IGFycmF5IH07XG4gICAgICpcbiAgICAgKiBfLm1hcChbJ2FbMl0nLCAnY1swXSddLCBfLnByb3BlcnR5T2Yob2JqZWN0KSk7XG4gICAgICogLy8gPT4gWzIsIDBdXG4gICAgICpcbiAgICAgKiBfLm1hcChbWydhJywgJzInXSwgWydjJywgJzAnXV0sIF8ucHJvcGVydHlPZihvYmplY3QpKTtcbiAgICAgKiAvLyA9PiBbMiwgMF1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBwcm9wZXJ0eU9mKG9iamVjdCkge1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uKHBhdGgpIHtcbiAgICAgICAgcmV0dXJuIGJhc2VHZXQob2JqZWN0LCB0b1BhdGgocGF0aCksIHBhdGggKyAnJyk7XG4gICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gYXJyYXkgb2YgbnVtYmVycyAocG9zaXRpdmUgYW5kL29yIG5lZ2F0aXZlKSBwcm9ncmVzc2luZyBmcm9tXG4gICAgICogYHN0YXJ0YCB1cCB0bywgYnV0IG5vdCBpbmNsdWRpbmcsIGBlbmRgLiBJZiBgZW5kYCBpcyBub3Qgc3BlY2lmaWVkIGl0IGlzXG4gICAgICogc2V0IHRvIGBzdGFydGAgd2l0aCBgc3RhcnRgIHRoZW4gc2V0IHRvIGAwYC4gSWYgYGVuZGAgaXMgbGVzcyB0aGFuIGBzdGFydGBcbiAgICAgKiBhIHplcm8tbGVuZ3RoIHJhbmdlIGlzIGNyZWF0ZWQgdW5sZXNzIGEgbmVnYXRpdmUgYHN0ZXBgIGlzIHNwZWNpZmllZC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBjYXRlZ29yeSBVdGlsaXR5XG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtzdGFydD0wXSBUaGUgc3RhcnQgb2YgdGhlIHJhbmdlLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBlbmQgVGhlIGVuZCBvZiB0aGUgcmFuZ2UuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtzdGVwPTFdIFRoZSB2YWx1ZSB0byBpbmNyZW1lbnQgb3IgZGVjcmVtZW50IGJ5LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGFycmF5IG9mIG51bWJlcnMuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8ucmFuZ2UoNCk7XG4gICAgICogLy8gPT4gWzAsIDEsIDIsIDNdXG4gICAgICpcbiAgICAgKiBfLnJhbmdlKDEsIDUpO1xuICAgICAqIC8vID0+IFsxLCAyLCAzLCA0XVxuICAgICAqXG4gICAgICogXy5yYW5nZSgwLCAyMCwgNSk7XG4gICAgICogLy8gPT4gWzAsIDUsIDEwLCAxNV1cbiAgICAgKlxuICAgICAqIF8ucmFuZ2UoMCwgLTQsIC0xKTtcbiAgICAgKiAvLyA9PiBbMCwgLTEsIC0yLCAtM11cbiAgICAgKlxuICAgICAqIF8ucmFuZ2UoMSwgNCwgMCk7XG4gICAgICogLy8gPT4gWzEsIDEsIDFdXG4gICAgICpcbiAgICAgKiBfLnJhbmdlKDApO1xuICAgICAqIC8vID0+IFtdXG4gICAgICovXG4gICAgZnVuY3Rpb24gcmFuZ2Uoc3RhcnQsIGVuZCwgc3RlcCkge1xuICAgICAgaWYgKHN0ZXAgJiYgaXNJdGVyYXRlZUNhbGwoc3RhcnQsIGVuZCwgc3RlcCkpIHtcbiAgICAgICAgZW5kID0gc3RlcCA9IHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICAgIHN0YXJ0ID0gK3N0YXJ0IHx8IDA7XG4gICAgICBzdGVwID0gc3RlcCA9PSBudWxsID8gMSA6ICgrc3RlcCB8fCAwKTtcblxuICAgICAgaWYgKGVuZCA9PSBudWxsKSB7XG4gICAgICAgIGVuZCA9IHN0YXJ0O1xuICAgICAgICBzdGFydCA9IDA7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBlbmQgPSArZW5kIHx8IDA7XG4gICAgICB9XG4gICAgICAvLyBVc2UgYEFycmF5KGxlbmd0aClgIHNvIGVuZ2luZXMgbGlrZSBDaGFrcmEgYW5kIFY4IGF2b2lkIHNsb3dlciBtb2Rlcy5cbiAgICAgIC8vIFNlZSBodHRwczovL3lvdXR1LmJlL1hBcUlwR1U4WlprI3Q9MTdtMjVzIGZvciBtb3JlIGRldGFpbHMuXG4gICAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgICBsZW5ndGggPSBuYXRpdmVNYXgobmF0aXZlQ2VpbCgoZW5kIC0gc3RhcnQpIC8gKHN0ZXAgfHwgMSkpLCAwKSxcbiAgICAgICAgICByZXN1bHQgPSBBcnJheShsZW5ndGgpO1xuXG4gICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICByZXN1bHRbaW5kZXhdID0gc3RhcnQ7XG4gICAgICAgIHN0YXJ0ICs9IHN0ZXA7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEludm9rZXMgdGhlIGl0ZXJhdGVlIGZ1bmN0aW9uIGBuYCB0aW1lcywgcmV0dXJuaW5nIGFuIGFycmF5IG9mIHRoZSByZXN1bHRzXG4gICAgICogb2YgZWFjaCBpbnZvY2F0aW9uLiBUaGUgYGl0ZXJhdGVlYCBpcyBib3VuZCB0byBgdGhpc0FyZ2AgYW5kIGludm9rZWQgd2l0aFxuICAgICAqIG9uZSBhcmd1bWVudDsgKGluZGV4KS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBjYXRlZ29yeSBVdGlsaXR5XG4gICAgICogQHBhcmFtIHtudW1iZXJ9IG4gVGhlIG51bWJlciBvZiB0aW1lcyB0byBpbnZva2UgYGl0ZXJhdGVlYC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcGFyYW0geyp9IFt0aGlzQXJnXSBUaGUgYHRoaXNgIGJpbmRpbmcgb2YgYGl0ZXJhdGVlYC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGFycmF5IG9mIHJlc3VsdHMuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBkaWNlUm9sbHMgPSBfLnRpbWVzKDMsIF8ucGFydGlhbChfLnJhbmRvbSwgMSwgNiwgZmFsc2UpKTtcbiAgICAgKiAvLyA9PiBbMywgNiwgNF1cbiAgICAgKlxuICAgICAqIF8udGltZXMoMywgZnVuY3Rpb24obikge1xuICAgICAqICAgbWFnZS5jYXN0U3BlbGwobik7XG4gICAgICogfSk7XG4gICAgICogLy8gPT4gaW52b2tlcyBgbWFnZS5jYXN0U3BlbGwobilgIHRocmVlIHRpbWVzIHdpdGggYG5gIG9mIGAwYCwgYDFgLCBhbmQgYDJgXG4gICAgICpcbiAgICAgKiBfLnRpbWVzKDMsIGZ1bmN0aW9uKG4pIHtcbiAgICAgKiAgIHRoaXMuY2FzdChuKTtcbiAgICAgKiB9LCBtYWdlKTtcbiAgICAgKiAvLyA9PiBhbHNvIGludm9rZXMgYG1hZ2UuY2FzdFNwZWxsKG4pYCB0aHJlZSB0aW1lc1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIHRpbWVzKG4sIGl0ZXJhdGVlLCB0aGlzQXJnKSB7XG4gICAgICBuID0gbmF0aXZlRmxvb3Iobik7XG5cbiAgICAgIC8vIEV4aXQgZWFybHkgdG8gYXZvaWQgYSBKU0MgSklUIGJ1ZyBpbiBTYWZhcmkgOFxuICAgICAgLy8gd2hlcmUgYEFycmF5KDApYCBpcyB0cmVhdGVkIGFzIGBBcnJheSgxKWAuXG4gICAgICBpZiAobiA8IDEgfHwgIW5hdGl2ZUlzRmluaXRlKG4pKSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH1cbiAgICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICAgIHJlc3VsdCA9IEFycmF5KG5hdGl2ZU1pbihuLCBNQVhfQVJSQVlfTEVOR1RIKSk7XG5cbiAgICAgIGl0ZXJhdGVlID0gYmluZENhbGxiYWNrKGl0ZXJhdGVlLCB0aGlzQXJnLCAxKTtcbiAgICAgIHdoaWxlICgrK2luZGV4IDwgbikge1xuICAgICAgICBpZiAoaW5kZXggPCBNQVhfQVJSQVlfTEVOR1RIKSB7XG4gICAgICAgICAgcmVzdWx0W2luZGV4XSA9IGl0ZXJhdGVlKGluZGV4KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpdGVyYXRlZShpbmRleCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2VuZXJhdGVzIGEgdW5pcXVlIElELiBJZiBgcHJlZml4YCBpcyBwcm92aWRlZCB0aGUgSUQgaXMgYXBwZW5kZWQgdG8gaXQuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAY2F0ZWdvcnkgVXRpbGl0eVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbcHJlZml4XSBUaGUgdmFsdWUgdG8gcHJlZml4IHRoZSBJRCB3aXRoLlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIHVuaXF1ZSBJRC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy51bmlxdWVJZCgnY29udGFjdF8nKTtcbiAgICAgKiAvLyA9PiAnY29udGFjdF8xMDQnXG4gICAgICpcbiAgICAgKiBfLnVuaXF1ZUlkKCk7XG4gICAgICogLy8gPT4gJzEwNSdcbiAgICAgKi9cbiAgICBmdW5jdGlvbiB1bmlxdWVJZChwcmVmaXgpIHtcbiAgICAgIHZhciBpZCA9ICsraWRDb3VudGVyO1xuICAgICAgcmV0dXJuIGJhc2VUb1N0cmluZyhwcmVmaXgpICsgaWQ7XG4gICAgfVxuXG4gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuXG4gICAgLyoqXG4gICAgICogQWRkcyB0d28gbnVtYmVycy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBjYXRlZ29yeSBNYXRoXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGF1Z2VuZCBUaGUgZmlyc3QgbnVtYmVyIHRvIGFkZC5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gYWRkZW5kIFRoZSBzZWNvbmQgbnVtYmVyIHRvIGFkZC5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBzdW0uXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uYWRkKDYsIDQpO1xuICAgICAqIC8vID0+IDEwXG4gICAgICovXG4gICAgZnVuY3Rpb24gYWRkKGF1Z2VuZCwgYWRkZW5kKSB7XG4gICAgICByZXR1cm4gKCthdWdlbmQgfHwgMCkgKyAoK2FkZGVuZCB8fCAwKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDYWxjdWxhdGVzIGBuYCByb3VuZGVkIHVwIHRvIGBwcmVjaXNpb25gLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IE1hdGhcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gbiBUaGUgbnVtYmVyIHRvIHJvdW5kIHVwLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbcHJlY2lzaW9uPTBdIFRoZSBwcmVjaXNpb24gdG8gcm91bmQgdXAgdG8uXG4gICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgcm91bmRlZCB1cCBudW1iZXIuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uY2VpbCg0LjAwNik7XG4gICAgICogLy8gPT4gNVxuICAgICAqXG4gICAgICogXy5jZWlsKDYuMDA0LCAyKTtcbiAgICAgKiAvLyA9PiA2LjAxXG4gICAgICpcbiAgICAgKiBfLmNlaWwoNjA0MCwgLTIpO1xuICAgICAqIC8vID0+IDYxMDBcbiAgICAgKi9cbiAgICB2YXIgY2VpbCA9IGNyZWF0ZVJvdW5kKCdjZWlsJyk7XG5cbiAgICAvKipcbiAgICAgKiBDYWxjdWxhdGVzIGBuYCByb3VuZGVkIGRvd24gdG8gYHByZWNpc2lvbmAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAY2F0ZWdvcnkgTWF0aFxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBuIFRoZSBudW1iZXIgdG8gcm91bmQgZG93bi5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3ByZWNpc2lvbj0wXSBUaGUgcHJlY2lzaW9uIHRvIHJvdW5kIGRvd24gdG8uXG4gICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgcm91bmRlZCBkb3duIG51bWJlci5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5mbG9vcig0LjAwNik7XG4gICAgICogLy8gPT4gNFxuICAgICAqXG4gICAgICogXy5mbG9vcigwLjA0NiwgMik7XG4gICAgICogLy8gPT4gMC4wNFxuICAgICAqXG4gICAgICogXy5mbG9vcig0MDYwLCAtMik7XG4gICAgICogLy8gPT4gNDAwMFxuICAgICAqL1xuICAgIHZhciBmbG9vciA9IGNyZWF0ZVJvdW5kKCdmbG9vcicpO1xuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgbWF4aW11bSB2YWx1ZSBvZiBgY29sbGVjdGlvbmAuIElmIGBjb2xsZWN0aW9uYCBpcyBlbXB0eSBvciBmYWxzZXlcbiAgICAgKiBgLUluZmluaXR5YCBpcyByZXR1cm5lZC4gSWYgYW4gaXRlcmF0ZWUgZnVuY3Rpb24gaXMgcHJvdmlkZWQgaXQgaXMgaW52b2tlZFxuICAgICAqIGZvciBlYWNoIHZhbHVlIGluIGBjb2xsZWN0aW9uYCB0byBnZW5lcmF0ZSB0aGUgY3JpdGVyaW9uIGJ5IHdoaWNoIHRoZSB2YWx1ZVxuICAgICAqIGlzIHJhbmtlZC4gVGhlIGBpdGVyYXRlZWAgaXMgYm91bmQgdG8gYHRoaXNBcmdgIGFuZCBpbnZva2VkIHdpdGggdGhyZWVcbiAgICAgKiBhcmd1bWVudHM6ICh2YWx1ZSwgaW5kZXgsIGNvbGxlY3Rpb24pLlxuICAgICAqXG4gICAgICogSWYgYSBwcm9wZXJ0eSBuYW1lIGlzIHByb3ZpZGVkIGZvciBgaXRlcmF0ZWVgIHRoZSBjcmVhdGVkIGBfLnByb3BlcnR5YFxuICAgICAqIHN0eWxlIGNhbGxiYWNrIHJldHVybnMgdGhlIHByb3BlcnR5IHZhbHVlIG9mIHRoZSBnaXZlbiBlbGVtZW50LlxuICAgICAqXG4gICAgICogSWYgYSB2YWx1ZSBpcyBhbHNvIHByb3ZpZGVkIGZvciBgdGhpc0FyZ2AgdGhlIGNyZWF0ZWQgYF8ubWF0Y2hlc1Byb3BlcnR5YFxuICAgICAqIHN0eWxlIGNhbGxiYWNrIHJldHVybnMgYHRydWVgIGZvciBlbGVtZW50cyB0aGF0IGhhdmUgYSBtYXRjaGluZyBwcm9wZXJ0eVxuICAgICAqIHZhbHVlLCBlbHNlIGBmYWxzZWAuXG4gICAgICpcbiAgICAgKiBJZiBhbiBvYmplY3QgaXMgcHJvdmlkZWQgZm9yIGBpdGVyYXRlZWAgdGhlIGNyZWF0ZWQgYF8ubWF0Y2hlc2Agc3R5bGVcbiAgICAgKiBjYWxsYmFjayByZXR1cm5zIGB0cnVlYCBmb3IgZWxlbWVudHMgdGhhdCBoYXZlIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBnaXZlblxuICAgICAqIG9iamVjdCwgZWxzZSBgZmFsc2VgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IE1hdGhcbiAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdHxzdHJpbmd9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb258T2JqZWN0fHN0cmluZ30gW2l0ZXJhdGVlXSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEBwYXJhbSB7Kn0gW3RoaXNBcmddIFRoZSBgdGhpc2AgYmluZGluZyBvZiBgaXRlcmF0ZWVgLlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBtYXhpbXVtIHZhbHVlLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLm1heChbNCwgMiwgOCwgNl0pO1xuICAgICAqIC8vID0+IDhcbiAgICAgKlxuICAgICAqIF8ubWF4KFtdKTtcbiAgICAgKiAvLyA9PiAtSW5maW5pdHlcbiAgICAgKlxuICAgICAqIHZhciB1c2VycyA9IFtcbiAgICAgKiAgIHsgJ3VzZXInOiAnYmFybmV5JywgJ2FnZSc6IDM2IH0sXG4gICAgICogICB7ICd1c2VyJzogJ2ZyZWQnLCAgICdhZ2UnOiA0MCB9XG4gICAgICogXTtcbiAgICAgKlxuICAgICAqIF8ubWF4KHVzZXJzLCBmdW5jdGlvbihjaHIpIHtcbiAgICAgKiAgIHJldHVybiBjaHIuYWdlO1xuICAgICAqIH0pO1xuICAgICAqIC8vID0+IHsgJ3VzZXInOiAnZnJlZCcsICdhZ2UnOiA0MCB9XG4gICAgICpcbiAgICAgKiAvLyB1c2luZyB0aGUgYF8ucHJvcGVydHlgIGNhbGxiYWNrIHNob3J0aGFuZFxuICAgICAqIF8ubWF4KHVzZXJzLCAnYWdlJyk7XG4gICAgICogLy8gPT4geyAndXNlcic6ICdmcmVkJywgJ2FnZSc6IDQwIH1cbiAgICAgKi9cbiAgICB2YXIgbWF4ID0gY3JlYXRlRXh0cmVtdW0oZ3QsIE5FR0FUSVZFX0lORklOSVRZKTtcblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIG1pbmltdW0gdmFsdWUgb2YgYGNvbGxlY3Rpb25gLiBJZiBgY29sbGVjdGlvbmAgaXMgZW1wdHkgb3IgZmFsc2V5XG4gICAgICogYEluZmluaXR5YCBpcyByZXR1cm5lZC4gSWYgYW4gaXRlcmF0ZWUgZnVuY3Rpb24gaXMgcHJvdmlkZWQgaXQgaXMgaW52b2tlZFxuICAgICAqIGZvciBlYWNoIHZhbHVlIGluIGBjb2xsZWN0aW9uYCB0byBnZW5lcmF0ZSB0aGUgY3JpdGVyaW9uIGJ5IHdoaWNoIHRoZSB2YWx1ZVxuICAgICAqIGlzIHJhbmtlZC4gVGhlIGBpdGVyYXRlZWAgaXMgYm91bmQgdG8gYHRoaXNBcmdgIGFuZCBpbnZva2VkIHdpdGggdGhyZWVcbiAgICAgKiBhcmd1bWVudHM6ICh2YWx1ZSwgaW5kZXgsIGNvbGxlY3Rpb24pLlxuICAgICAqXG4gICAgICogSWYgYSBwcm9wZXJ0eSBuYW1lIGlzIHByb3ZpZGVkIGZvciBgaXRlcmF0ZWVgIHRoZSBjcmVhdGVkIGBfLnByb3BlcnR5YFxuICAgICAqIHN0eWxlIGNhbGxiYWNrIHJldHVybnMgdGhlIHByb3BlcnR5IHZhbHVlIG9mIHRoZSBnaXZlbiBlbGVtZW50LlxuICAgICAqXG4gICAgICogSWYgYSB2YWx1ZSBpcyBhbHNvIHByb3ZpZGVkIGZvciBgdGhpc0FyZ2AgdGhlIGNyZWF0ZWQgYF8ubWF0Y2hlc1Byb3BlcnR5YFxuICAgICAqIHN0eWxlIGNhbGxiYWNrIHJldHVybnMgYHRydWVgIGZvciBlbGVtZW50cyB0aGF0IGhhdmUgYSBtYXRjaGluZyBwcm9wZXJ0eVxuICAgICAqIHZhbHVlLCBlbHNlIGBmYWxzZWAuXG4gICAgICpcbiAgICAgKiBJZiBhbiBvYmplY3QgaXMgcHJvdmlkZWQgZm9yIGBpdGVyYXRlZWAgdGhlIGNyZWF0ZWQgYF8ubWF0Y2hlc2Agc3R5bGVcbiAgICAgKiBjYWxsYmFjayByZXR1cm5zIGB0cnVlYCBmb3IgZWxlbWVudHMgdGhhdCBoYXZlIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBnaXZlblxuICAgICAqIG9iamVjdCwgZWxzZSBgZmFsc2VgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IE1hdGhcbiAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdHxzdHJpbmd9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb258T2JqZWN0fHN0cmluZ30gW2l0ZXJhdGVlXSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEBwYXJhbSB7Kn0gW3RoaXNBcmddIFRoZSBgdGhpc2AgYmluZGluZyBvZiBgaXRlcmF0ZWVgLlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBtaW5pbXVtIHZhbHVlLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLm1pbihbNCwgMiwgOCwgNl0pO1xuICAgICAqIC8vID0+IDJcbiAgICAgKlxuICAgICAqIF8ubWluKFtdKTtcbiAgICAgKiAvLyA9PiBJbmZpbml0eVxuICAgICAqXG4gICAgICogdmFyIHVzZXJzID0gW1xuICAgICAqICAgeyAndXNlcic6ICdiYXJuZXknLCAnYWdlJzogMzYgfSxcbiAgICAgKiAgIHsgJ3VzZXInOiAnZnJlZCcsICAgJ2FnZSc6IDQwIH1cbiAgICAgKiBdO1xuICAgICAqXG4gICAgICogXy5taW4odXNlcnMsIGZ1bmN0aW9uKGNocikge1xuICAgICAqICAgcmV0dXJuIGNoci5hZ2U7XG4gICAgICogfSk7XG4gICAgICogLy8gPT4geyAndXNlcic6ICdiYXJuZXknLCAnYWdlJzogMzYgfVxuICAgICAqXG4gICAgICogLy8gdXNpbmcgdGhlIGBfLnByb3BlcnR5YCBjYWxsYmFjayBzaG9ydGhhbmRcbiAgICAgKiBfLm1pbih1c2VycywgJ2FnZScpO1xuICAgICAqIC8vID0+IHsgJ3VzZXInOiAnYmFybmV5JywgJ2FnZSc6IDM2IH1cbiAgICAgKi9cbiAgICB2YXIgbWluID0gY3JlYXRlRXh0cmVtdW0obHQsIFBPU0lUSVZFX0lORklOSVRZKTtcblxuICAgIC8qKlxuICAgICAqIENhbGN1bGF0ZXMgYG5gIHJvdW5kZWQgdG8gYHByZWNpc2lvbmAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAY2F0ZWdvcnkgTWF0aFxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBuIFRoZSBudW1iZXIgdG8gcm91bmQuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtwcmVjaXNpb249MF0gVGhlIHByZWNpc2lvbiB0byByb3VuZCB0by5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSByb3VuZGVkIG51bWJlci5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5yb3VuZCg0LjAwNik7XG4gICAgICogLy8gPT4gNFxuICAgICAqXG4gICAgICogXy5yb3VuZCg0LjAwNiwgMik7XG4gICAgICogLy8gPT4gNC4wMVxuICAgICAqXG4gICAgICogXy5yb3VuZCg0MDYwLCAtMik7XG4gICAgICogLy8gPT4gNDEwMFxuICAgICAqL1xuICAgIHZhciByb3VuZCA9IGNyZWF0ZVJvdW5kKCdyb3VuZCcpO1xuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgc3VtIG9mIHRoZSB2YWx1ZXMgaW4gYGNvbGxlY3Rpb25gLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IE1hdGhcbiAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdHxzdHJpbmd9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb258T2JqZWN0fHN0cmluZ30gW2l0ZXJhdGVlXSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEBwYXJhbSB7Kn0gW3RoaXNBcmddIFRoZSBgdGhpc2AgYmluZGluZyBvZiBgaXRlcmF0ZWVgLlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIHN1bS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5zdW0oWzQsIDZdKTtcbiAgICAgKiAvLyA9PiAxMFxuICAgICAqXG4gICAgICogXy5zdW0oeyAnYSc6IDQsICdiJzogNiB9KTtcbiAgICAgKiAvLyA9PiAxMFxuICAgICAqXG4gICAgICogdmFyIG9iamVjdHMgPSBbXG4gICAgICogICB7ICduJzogNCB9LFxuICAgICAqICAgeyAnbic6IDYgfVxuICAgICAqIF07XG4gICAgICpcbiAgICAgKiBfLnN1bShvYmplY3RzLCBmdW5jdGlvbihvYmplY3QpIHtcbiAgICAgKiAgIHJldHVybiBvYmplY3QubjtcbiAgICAgKiB9KTtcbiAgICAgKiAvLyA9PiAxMFxuICAgICAqXG4gICAgICogLy8gdXNpbmcgdGhlIGBfLnByb3BlcnR5YCBjYWxsYmFjayBzaG9ydGhhbmRcbiAgICAgKiBfLnN1bShvYmplY3RzLCAnbicpO1xuICAgICAqIC8vID0+IDEwXG4gICAgICovXG4gICAgZnVuY3Rpb24gc3VtKGNvbGxlY3Rpb24sIGl0ZXJhdGVlLCB0aGlzQXJnKSB7XG4gICAgICBpZiAodGhpc0FyZyAmJiBpc0l0ZXJhdGVlQ2FsbChjb2xsZWN0aW9uLCBpdGVyYXRlZSwgdGhpc0FyZykpIHtcbiAgICAgICAgaXRlcmF0ZWUgPSB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgICBpdGVyYXRlZSA9IGdldENhbGxiYWNrKGl0ZXJhdGVlLCB0aGlzQXJnLCAzKTtcbiAgICAgIHJldHVybiBpdGVyYXRlZS5sZW5ndGggPT0gMVxuICAgICAgICA/IGFycmF5U3VtKGlzQXJyYXkoY29sbGVjdGlvbikgPyBjb2xsZWN0aW9uIDogdG9JdGVyYWJsZShjb2xsZWN0aW9uKSwgaXRlcmF0ZWUpXG4gICAgICAgIDogYmFzZVN1bShjb2xsZWN0aW9uLCBpdGVyYXRlZSk7XG4gICAgfVxuXG4gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuXG4gICAgLy8gRW5zdXJlIHdyYXBwZXJzIGFyZSBpbnN0YW5jZXMgb2YgYGJhc2VMb2Rhc2hgLlxuICAgIGxvZGFzaC5wcm90b3R5cGUgPSBiYXNlTG9kYXNoLnByb3RvdHlwZTtcblxuICAgIExvZGFzaFdyYXBwZXIucHJvdG90eXBlID0gYmFzZUNyZWF0ZShiYXNlTG9kYXNoLnByb3RvdHlwZSk7XG4gICAgTG9kYXNoV3JhcHBlci5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBMb2Rhc2hXcmFwcGVyO1xuXG4gICAgTGF6eVdyYXBwZXIucHJvdG90eXBlID0gYmFzZUNyZWF0ZShiYXNlTG9kYXNoLnByb3RvdHlwZSk7XG4gICAgTGF6eVdyYXBwZXIucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gTGF6eVdyYXBwZXI7XG5cbiAgICAvLyBBZGQgZnVuY3Rpb25zIHRvIHRoZSBgTWFwYCBjYWNoZS5cbiAgICBNYXBDYWNoZS5wcm90b3R5cGVbJ2RlbGV0ZSddID0gbWFwRGVsZXRlO1xuICAgIE1hcENhY2hlLnByb3RvdHlwZS5nZXQgPSBtYXBHZXQ7XG4gICAgTWFwQ2FjaGUucHJvdG90eXBlLmhhcyA9IG1hcEhhcztcbiAgICBNYXBDYWNoZS5wcm90b3R5cGUuc2V0ID0gbWFwU2V0O1xuXG4gICAgLy8gQWRkIGZ1bmN0aW9ucyB0byB0aGUgYFNldGAgY2FjaGUuXG4gICAgU2V0Q2FjaGUucHJvdG90eXBlLnB1c2ggPSBjYWNoZVB1c2g7XG5cbiAgICAvLyBBc3NpZ24gY2FjaGUgdG8gYF8ubWVtb2l6ZWAuXG4gICAgbWVtb2l6ZS5DYWNoZSA9IE1hcENhY2hlO1xuXG4gICAgLy8gQWRkIGZ1bmN0aW9ucyB0aGF0IHJldHVybiB3cmFwcGVkIHZhbHVlcyB3aGVuIGNoYWluaW5nLlxuICAgIGxvZGFzaC5hZnRlciA9IGFmdGVyO1xuICAgIGxvZGFzaC5hcnkgPSBhcnk7XG4gICAgbG9kYXNoLmFzc2lnbiA9IGFzc2lnbjtcbiAgICBsb2Rhc2guYXQgPSBhdDtcbiAgICBsb2Rhc2guYmVmb3JlID0gYmVmb3JlO1xuICAgIGxvZGFzaC5iaW5kID0gYmluZDtcbiAgICBsb2Rhc2guYmluZEFsbCA9IGJpbmRBbGw7XG4gICAgbG9kYXNoLmJpbmRLZXkgPSBiaW5kS2V5O1xuICAgIGxvZGFzaC5jYWxsYmFjayA9IGNhbGxiYWNrO1xuICAgIGxvZGFzaC5jaGFpbiA9IGNoYWluO1xuICAgIGxvZGFzaC5jaHVuayA9IGNodW5rO1xuICAgIGxvZGFzaC5jb21wYWN0ID0gY29tcGFjdDtcbiAgICBsb2Rhc2guY29uc3RhbnQgPSBjb25zdGFudDtcbiAgICBsb2Rhc2guY291bnRCeSA9IGNvdW50Qnk7XG4gICAgbG9kYXNoLmNyZWF0ZSA9IGNyZWF0ZTtcbiAgICBsb2Rhc2guY3VycnkgPSBjdXJyeTtcbiAgICBsb2Rhc2guY3VycnlSaWdodCA9IGN1cnJ5UmlnaHQ7XG4gICAgbG9kYXNoLmRlYm91bmNlID0gZGVib3VuY2U7XG4gICAgbG9kYXNoLmRlZmF1bHRzID0gZGVmYXVsdHM7XG4gICAgbG9kYXNoLmRlZmF1bHRzRGVlcCA9IGRlZmF1bHRzRGVlcDtcbiAgICBsb2Rhc2guZGVmZXIgPSBkZWZlcjtcbiAgICBsb2Rhc2guZGVsYXkgPSBkZWxheTtcbiAgICBsb2Rhc2guZGlmZmVyZW5jZSA9IGRpZmZlcmVuY2U7XG4gICAgbG9kYXNoLmRyb3AgPSBkcm9wO1xuICAgIGxvZGFzaC5kcm9wUmlnaHQgPSBkcm9wUmlnaHQ7XG4gICAgbG9kYXNoLmRyb3BSaWdodFdoaWxlID0gZHJvcFJpZ2h0V2hpbGU7XG4gICAgbG9kYXNoLmRyb3BXaGlsZSA9IGRyb3BXaGlsZTtcbiAgICBsb2Rhc2guZmlsbCA9IGZpbGw7XG4gICAgbG9kYXNoLmZpbHRlciA9IGZpbHRlcjtcbiAgICBsb2Rhc2guZmxhdHRlbiA9IGZsYXR0ZW47XG4gICAgbG9kYXNoLmZsYXR0ZW5EZWVwID0gZmxhdHRlbkRlZXA7XG4gICAgbG9kYXNoLmZsb3cgPSBmbG93O1xuICAgIGxvZGFzaC5mbG93UmlnaHQgPSBmbG93UmlnaHQ7XG4gICAgbG9kYXNoLmZvckVhY2ggPSBmb3JFYWNoO1xuICAgIGxvZGFzaC5mb3JFYWNoUmlnaHQgPSBmb3JFYWNoUmlnaHQ7XG4gICAgbG9kYXNoLmZvckluID0gZm9ySW47XG4gICAgbG9kYXNoLmZvckluUmlnaHQgPSBmb3JJblJpZ2h0O1xuICAgIGxvZGFzaC5mb3JPd24gPSBmb3JPd247XG4gICAgbG9kYXNoLmZvck93blJpZ2h0ID0gZm9yT3duUmlnaHQ7XG4gICAgbG9kYXNoLmZ1bmN0aW9ucyA9IGZ1bmN0aW9ucztcbiAgICBsb2Rhc2guZ3JvdXBCeSA9IGdyb3VwQnk7XG4gICAgbG9kYXNoLmluZGV4QnkgPSBpbmRleEJ5O1xuICAgIGxvZGFzaC5pbml0aWFsID0gaW5pdGlhbDtcbiAgICBsb2Rhc2guaW50ZXJzZWN0aW9uID0gaW50ZXJzZWN0aW9uO1xuICAgIGxvZGFzaC5pbnZlcnQgPSBpbnZlcnQ7XG4gICAgbG9kYXNoLmludm9rZSA9IGludm9rZTtcbiAgICBsb2Rhc2gua2V5cyA9IGtleXM7XG4gICAgbG9kYXNoLmtleXNJbiA9IGtleXNJbjtcbiAgICBsb2Rhc2gubWFwID0gbWFwO1xuICAgIGxvZGFzaC5tYXBLZXlzID0gbWFwS2V5cztcbiAgICBsb2Rhc2gubWFwVmFsdWVzID0gbWFwVmFsdWVzO1xuICAgIGxvZGFzaC5tYXRjaGVzID0gbWF0Y2hlcztcbiAgICBsb2Rhc2gubWF0Y2hlc1Byb3BlcnR5ID0gbWF0Y2hlc1Byb3BlcnR5O1xuICAgIGxvZGFzaC5tZW1vaXplID0gbWVtb2l6ZTtcbiAgICBsb2Rhc2gubWVyZ2UgPSBtZXJnZTtcbiAgICBsb2Rhc2gubWV0aG9kID0gbWV0aG9kO1xuICAgIGxvZGFzaC5tZXRob2RPZiA9IG1ldGhvZE9mO1xuICAgIGxvZGFzaC5taXhpbiA9IG1peGluO1xuICAgIGxvZGFzaC5tb2RBcmdzID0gbW9kQXJncztcbiAgICBsb2Rhc2gubmVnYXRlID0gbmVnYXRlO1xuICAgIGxvZGFzaC5vbWl0ID0gb21pdDtcbiAgICBsb2Rhc2gub25jZSA9IG9uY2U7XG4gICAgbG9kYXNoLnBhaXJzID0gcGFpcnM7XG4gICAgbG9kYXNoLnBhcnRpYWwgPSBwYXJ0aWFsO1xuICAgIGxvZGFzaC5wYXJ0aWFsUmlnaHQgPSBwYXJ0aWFsUmlnaHQ7XG4gICAgbG9kYXNoLnBhcnRpdGlvbiA9IHBhcnRpdGlvbjtcbiAgICBsb2Rhc2gucGljayA9IHBpY2s7XG4gICAgbG9kYXNoLnBsdWNrID0gcGx1Y2s7XG4gICAgbG9kYXNoLnByb3BlcnR5ID0gcHJvcGVydHk7XG4gICAgbG9kYXNoLnByb3BlcnR5T2YgPSBwcm9wZXJ0eU9mO1xuICAgIGxvZGFzaC5wdWxsID0gcHVsbDtcbiAgICBsb2Rhc2gucHVsbEF0ID0gcHVsbEF0O1xuICAgIGxvZGFzaC5yYW5nZSA9IHJhbmdlO1xuICAgIGxvZGFzaC5yZWFyZyA9IHJlYXJnO1xuICAgIGxvZGFzaC5yZWplY3QgPSByZWplY3Q7XG4gICAgbG9kYXNoLnJlbW92ZSA9IHJlbW92ZTtcbiAgICBsb2Rhc2gucmVzdCA9IHJlc3Q7XG4gICAgbG9kYXNoLnJlc3RQYXJhbSA9IHJlc3RQYXJhbTtcbiAgICBsb2Rhc2guc2V0ID0gc2V0O1xuICAgIGxvZGFzaC5zaHVmZmxlID0gc2h1ZmZsZTtcbiAgICBsb2Rhc2guc2xpY2UgPSBzbGljZTtcbiAgICBsb2Rhc2guc29ydEJ5ID0gc29ydEJ5O1xuICAgIGxvZGFzaC5zb3J0QnlBbGwgPSBzb3J0QnlBbGw7XG4gICAgbG9kYXNoLnNvcnRCeU9yZGVyID0gc29ydEJ5T3JkZXI7XG4gICAgbG9kYXNoLnNwcmVhZCA9IHNwcmVhZDtcbiAgICBsb2Rhc2gudGFrZSA9IHRha2U7XG4gICAgbG9kYXNoLnRha2VSaWdodCA9IHRha2VSaWdodDtcbiAgICBsb2Rhc2gudGFrZVJpZ2h0V2hpbGUgPSB0YWtlUmlnaHRXaGlsZTtcbiAgICBsb2Rhc2gudGFrZVdoaWxlID0gdGFrZVdoaWxlO1xuICAgIGxvZGFzaC50YXAgPSB0YXA7XG4gICAgbG9kYXNoLnRocm90dGxlID0gdGhyb3R0bGU7XG4gICAgbG9kYXNoLnRocnUgPSB0aHJ1O1xuICAgIGxvZGFzaC50aW1lcyA9IHRpbWVzO1xuICAgIGxvZGFzaC50b0FycmF5ID0gdG9BcnJheTtcbiAgICBsb2Rhc2gudG9QbGFpbk9iamVjdCA9IHRvUGxhaW5PYmplY3Q7XG4gICAgbG9kYXNoLnRyYW5zZm9ybSA9IHRyYW5zZm9ybTtcbiAgICBsb2Rhc2gudW5pb24gPSB1bmlvbjtcbiAgICBsb2Rhc2gudW5pcSA9IHVuaXE7XG4gICAgbG9kYXNoLnVuemlwID0gdW56aXA7XG4gICAgbG9kYXNoLnVuemlwV2l0aCA9IHVuemlwV2l0aDtcbiAgICBsb2Rhc2gudmFsdWVzID0gdmFsdWVzO1xuICAgIGxvZGFzaC52YWx1ZXNJbiA9IHZhbHVlc0luO1xuICAgIGxvZGFzaC53aGVyZSA9IHdoZXJlO1xuICAgIGxvZGFzaC53aXRob3V0ID0gd2l0aG91dDtcbiAgICBsb2Rhc2gud3JhcCA9IHdyYXA7XG4gICAgbG9kYXNoLnhvciA9IHhvcjtcbiAgICBsb2Rhc2guemlwID0gemlwO1xuICAgIGxvZGFzaC56aXBPYmplY3QgPSB6aXBPYmplY3Q7XG4gICAgbG9kYXNoLnppcFdpdGggPSB6aXBXaXRoO1xuXG4gICAgLy8gQWRkIGFsaWFzZXMuXG4gICAgbG9kYXNoLmJhY2tmbG93ID0gZmxvd1JpZ2h0O1xuICAgIGxvZGFzaC5jb2xsZWN0ID0gbWFwO1xuICAgIGxvZGFzaC5jb21wb3NlID0gZmxvd1JpZ2h0O1xuICAgIGxvZGFzaC5lYWNoID0gZm9yRWFjaDtcbiAgICBsb2Rhc2guZWFjaFJpZ2h0ID0gZm9yRWFjaFJpZ2h0O1xuICAgIGxvZGFzaC5leHRlbmQgPSBhc3NpZ247XG4gICAgbG9kYXNoLml0ZXJhdGVlID0gY2FsbGJhY2s7XG4gICAgbG9kYXNoLm1ldGhvZHMgPSBmdW5jdGlvbnM7XG4gICAgbG9kYXNoLm9iamVjdCA9IHppcE9iamVjdDtcbiAgICBsb2Rhc2guc2VsZWN0ID0gZmlsdGVyO1xuICAgIGxvZGFzaC50YWlsID0gcmVzdDtcbiAgICBsb2Rhc2gudW5pcXVlID0gdW5pcTtcblxuICAgIC8vIEFkZCBmdW5jdGlvbnMgdG8gYGxvZGFzaC5wcm90b3R5cGVgLlxuICAgIG1peGluKGxvZGFzaCwgbG9kYXNoKTtcblxuICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuICAgIC8vIEFkZCBmdW5jdGlvbnMgdGhhdCByZXR1cm4gdW53cmFwcGVkIHZhbHVlcyB3aGVuIGNoYWluaW5nLlxuICAgIGxvZGFzaC5hZGQgPSBhZGQ7XG4gICAgbG9kYXNoLmF0dGVtcHQgPSBhdHRlbXB0O1xuICAgIGxvZGFzaC5jYW1lbENhc2UgPSBjYW1lbENhc2U7XG4gICAgbG9kYXNoLmNhcGl0YWxpemUgPSBjYXBpdGFsaXplO1xuICAgIGxvZGFzaC5jZWlsID0gY2VpbDtcbiAgICBsb2Rhc2guY2xvbmUgPSBjbG9uZTtcbiAgICBsb2Rhc2guY2xvbmVEZWVwID0gY2xvbmVEZWVwO1xuICAgIGxvZGFzaC5kZWJ1cnIgPSBkZWJ1cnI7XG4gICAgbG9kYXNoLmVuZHNXaXRoID0gZW5kc1dpdGg7XG4gICAgbG9kYXNoLmVzY2FwZSA9IGVzY2FwZTtcbiAgICBsb2Rhc2guZXNjYXBlUmVnRXhwID0gZXNjYXBlUmVnRXhwO1xuICAgIGxvZGFzaC5ldmVyeSA9IGV2ZXJ5O1xuICAgIGxvZGFzaC5maW5kID0gZmluZDtcbiAgICBsb2Rhc2guZmluZEluZGV4ID0gZmluZEluZGV4O1xuICAgIGxvZGFzaC5maW5kS2V5ID0gZmluZEtleTtcbiAgICBsb2Rhc2guZmluZExhc3QgPSBmaW5kTGFzdDtcbiAgICBsb2Rhc2guZmluZExhc3RJbmRleCA9IGZpbmRMYXN0SW5kZXg7XG4gICAgbG9kYXNoLmZpbmRMYXN0S2V5ID0gZmluZExhc3RLZXk7XG4gICAgbG9kYXNoLmZpbmRXaGVyZSA9IGZpbmRXaGVyZTtcbiAgICBsb2Rhc2guZmlyc3QgPSBmaXJzdDtcbiAgICBsb2Rhc2guZmxvb3IgPSBmbG9vcjtcbiAgICBsb2Rhc2guZ2V0ID0gZ2V0O1xuICAgIGxvZGFzaC5ndCA9IGd0O1xuICAgIGxvZGFzaC5ndGUgPSBndGU7XG4gICAgbG9kYXNoLmhhcyA9IGhhcztcbiAgICBsb2Rhc2guaWRlbnRpdHkgPSBpZGVudGl0eTtcbiAgICBsb2Rhc2guaW5jbHVkZXMgPSBpbmNsdWRlcztcbiAgICBsb2Rhc2guaW5kZXhPZiA9IGluZGV4T2Y7XG4gICAgbG9kYXNoLmluUmFuZ2UgPSBpblJhbmdlO1xuICAgIGxvZGFzaC5pc0FyZ3VtZW50cyA9IGlzQXJndW1lbnRzO1xuICAgIGxvZGFzaC5pc0FycmF5ID0gaXNBcnJheTtcbiAgICBsb2Rhc2guaXNCb29sZWFuID0gaXNCb29sZWFuO1xuICAgIGxvZGFzaC5pc0RhdGUgPSBpc0RhdGU7XG4gICAgbG9kYXNoLmlzRWxlbWVudCA9IGlzRWxlbWVudDtcbiAgICBsb2Rhc2guaXNFbXB0eSA9IGlzRW1wdHk7XG4gICAgbG9kYXNoLmlzRXF1YWwgPSBpc0VxdWFsO1xuICAgIGxvZGFzaC5pc0Vycm9yID0gaXNFcnJvcjtcbiAgICBsb2Rhc2guaXNGaW5pdGUgPSBpc0Zpbml0ZTtcbiAgICBsb2Rhc2guaXNGdW5jdGlvbiA9IGlzRnVuY3Rpb247XG4gICAgbG9kYXNoLmlzTWF0Y2ggPSBpc01hdGNoO1xuICAgIGxvZGFzaC5pc05hTiA9IGlzTmFOO1xuICAgIGxvZGFzaC5pc05hdGl2ZSA9IGlzTmF0aXZlO1xuICAgIGxvZGFzaC5pc051bGwgPSBpc051bGw7XG4gICAgbG9kYXNoLmlzTnVtYmVyID0gaXNOdW1iZXI7XG4gICAgbG9kYXNoLmlzT2JqZWN0ID0gaXNPYmplY3Q7XG4gICAgbG9kYXNoLmlzUGxhaW5PYmplY3QgPSBpc1BsYWluT2JqZWN0O1xuICAgIGxvZGFzaC5pc1JlZ0V4cCA9IGlzUmVnRXhwO1xuICAgIGxvZGFzaC5pc1N0cmluZyA9IGlzU3RyaW5nO1xuICAgIGxvZGFzaC5pc1R5cGVkQXJyYXkgPSBpc1R5cGVkQXJyYXk7XG4gICAgbG9kYXNoLmlzVW5kZWZpbmVkID0gaXNVbmRlZmluZWQ7XG4gICAgbG9kYXNoLmtlYmFiQ2FzZSA9IGtlYmFiQ2FzZTtcbiAgICBsb2Rhc2gubGFzdCA9IGxhc3Q7XG4gICAgbG9kYXNoLmxhc3RJbmRleE9mID0gbGFzdEluZGV4T2Y7XG4gICAgbG9kYXNoLmx0ID0gbHQ7XG4gICAgbG9kYXNoLmx0ZSA9IGx0ZTtcbiAgICBsb2Rhc2gubWF4ID0gbWF4O1xuICAgIGxvZGFzaC5taW4gPSBtaW47XG4gICAgbG9kYXNoLm5vQ29uZmxpY3QgPSBub0NvbmZsaWN0O1xuICAgIGxvZGFzaC5ub29wID0gbm9vcDtcbiAgICBsb2Rhc2gubm93ID0gbm93O1xuICAgIGxvZGFzaC5wYWQgPSBwYWQ7XG4gICAgbG9kYXNoLnBhZExlZnQgPSBwYWRMZWZ0O1xuICAgIGxvZGFzaC5wYWRSaWdodCA9IHBhZFJpZ2h0O1xuICAgIGxvZGFzaC5wYXJzZUludCA9IHBhcnNlSW50O1xuICAgIGxvZGFzaC5yYW5kb20gPSByYW5kb207XG4gICAgbG9kYXNoLnJlZHVjZSA9IHJlZHVjZTtcbiAgICBsb2Rhc2gucmVkdWNlUmlnaHQgPSByZWR1Y2VSaWdodDtcbiAgICBsb2Rhc2gucmVwZWF0ID0gcmVwZWF0O1xuICAgIGxvZGFzaC5yZXN1bHQgPSByZXN1bHQ7XG4gICAgbG9kYXNoLnJvdW5kID0gcm91bmQ7XG4gICAgbG9kYXNoLnJ1bkluQ29udGV4dCA9IHJ1bkluQ29udGV4dDtcbiAgICBsb2Rhc2guc2l6ZSA9IHNpemU7XG4gICAgbG9kYXNoLnNuYWtlQ2FzZSA9IHNuYWtlQ2FzZTtcbiAgICBsb2Rhc2guc29tZSA9IHNvbWU7XG4gICAgbG9kYXNoLnNvcnRlZEluZGV4ID0gc29ydGVkSW5kZXg7XG4gICAgbG9kYXNoLnNvcnRlZExhc3RJbmRleCA9IHNvcnRlZExhc3RJbmRleDtcbiAgICBsb2Rhc2guc3RhcnRDYXNlID0gc3RhcnRDYXNlO1xuICAgIGxvZGFzaC5zdGFydHNXaXRoID0gc3RhcnRzV2l0aDtcbiAgICBsb2Rhc2guc3VtID0gc3VtO1xuICAgIGxvZGFzaC50ZW1wbGF0ZSA9IHRlbXBsYXRlO1xuICAgIGxvZGFzaC50cmltID0gdHJpbTtcbiAgICBsb2Rhc2gudHJpbUxlZnQgPSB0cmltTGVmdDtcbiAgICBsb2Rhc2gudHJpbVJpZ2h0ID0gdHJpbVJpZ2h0O1xuICAgIGxvZGFzaC50cnVuYyA9IHRydW5jO1xuICAgIGxvZGFzaC51bmVzY2FwZSA9IHVuZXNjYXBlO1xuICAgIGxvZGFzaC51bmlxdWVJZCA9IHVuaXF1ZUlkO1xuICAgIGxvZGFzaC53b3JkcyA9IHdvcmRzO1xuXG4gICAgLy8gQWRkIGFsaWFzZXMuXG4gICAgbG9kYXNoLmFsbCA9IGV2ZXJ5O1xuICAgIGxvZGFzaC5hbnkgPSBzb21lO1xuICAgIGxvZGFzaC5jb250YWlucyA9IGluY2x1ZGVzO1xuICAgIGxvZGFzaC5lcSA9IGlzRXF1YWw7XG4gICAgbG9kYXNoLmRldGVjdCA9IGZpbmQ7XG4gICAgbG9kYXNoLmZvbGRsID0gcmVkdWNlO1xuICAgIGxvZGFzaC5mb2xkciA9IHJlZHVjZVJpZ2h0O1xuICAgIGxvZGFzaC5oZWFkID0gZmlyc3Q7XG4gICAgbG9kYXNoLmluY2x1ZGUgPSBpbmNsdWRlcztcbiAgICBsb2Rhc2guaW5qZWN0ID0gcmVkdWNlO1xuXG4gICAgbWl4aW4obG9kYXNoLCAoZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgc291cmNlID0ge307XG4gICAgICBiYXNlRm9yT3duKGxvZGFzaCwgZnVuY3Rpb24oZnVuYywgbWV0aG9kTmFtZSkge1xuICAgICAgICBpZiAoIWxvZGFzaC5wcm90b3R5cGVbbWV0aG9kTmFtZV0pIHtcbiAgICAgICAgICBzb3VyY2VbbWV0aG9kTmFtZV0gPSBmdW5jO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBzb3VyY2U7XG4gICAgfSgpKSwgZmFsc2UpO1xuXG4gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuXG4gICAgLy8gQWRkIGZ1bmN0aW9ucyBjYXBhYmxlIG9mIHJldHVybmluZyB3cmFwcGVkIGFuZCB1bndyYXBwZWQgdmFsdWVzIHdoZW4gY2hhaW5pbmcuXG4gICAgbG9kYXNoLnNhbXBsZSA9IHNhbXBsZTtcblxuICAgIGxvZGFzaC5wcm90b3R5cGUuc2FtcGxlID0gZnVuY3Rpb24obikge1xuICAgICAgaWYgKCF0aGlzLl9fY2hhaW5fXyAmJiBuID09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIHNhbXBsZSh0aGlzLnZhbHVlKCkpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMudGhydShmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgICByZXR1cm4gc2FtcGxlKHZhbHVlLCBuKTtcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5cbiAgICAvKipcbiAgICAgKiBUaGUgc2VtYW50aWMgdmVyc2lvbiBudW1iZXIuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAdHlwZSBzdHJpbmdcbiAgICAgKi9cbiAgICBsb2Rhc2guVkVSU0lPTiA9IFZFUlNJT047XG5cbiAgICAvLyBBc3NpZ24gZGVmYXVsdCBwbGFjZWhvbGRlcnMuXG4gICAgYXJyYXlFYWNoKFsnYmluZCcsICdiaW5kS2V5JywgJ2N1cnJ5JywgJ2N1cnJ5UmlnaHQnLCAncGFydGlhbCcsICdwYXJ0aWFsUmlnaHQnXSwgZnVuY3Rpb24obWV0aG9kTmFtZSkge1xuICAgICAgbG9kYXNoW21ldGhvZE5hbWVdLnBsYWNlaG9sZGVyID0gbG9kYXNoO1xuICAgIH0pO1xuXG4gICAgLy8gQWRkIGBMYXp5V3JhcHBlcmAgbWV0aG9kcyBmb3IgYF8uZHJvcGAgYW5kIGBfLnRha2VgIHZhcmlhbnRzLlxuICAgIGFycmF5RWFjaChbJ2Ryb3AnLCAndGFrZSddLCBmdW5jdGlvbihtZXRob2ROYW1lLCBpbmRleCkge1xuICAgICAgTGF6eVdyYXBwZXIucHJvdG90eXBlW21ldGhvZE5hbWVdID0gZnVuY3Rpb24obikge1xuICAgICAgICB2YXIgZmlsdGVyZWQgPSB0aGlzLl9fZmlsdGVyZWRfXztcbiAgICAgICAgaWYgKGZpbHRlcmVkICYmICFpbmRleCkge1xuICAgICAgICAgIHJldHVybiBuZXcgTGF6eVdyYXBwZXIodGhpcyk7XG4gICAgICAgIH1cbiAgICAgICAgbiA9IG4gPT0gbnVsbCA/IDEgOiBuYXRpdmVNYXgobmF0aXZlRmxvb3IobikgfHwgMCwgMCk7XG5cbiAgICAgICAgdmFyIHJlc3VsdCA9IHRoaXMuY2xvbmUoKTtcbiAgICAgICAgaWYgKGZpbHRlcmVkKSB7XG4gICAgICAgICAgcmVzdWx0Ll9fdGFrZUNvdW50X18gPSBuYXRpdmVNaW4ocmVzdWx0Ll9fdGFrZUNvdW50X18sIG4pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlc3VsdC5fX3ZpZXdzX18ucHVzaCh7ICdzaXplJzogbiwgJ3R5cGUnOiBtZXRob2ROYW1lICsgKHJlc3VsdC5fX2Rpcl9fIDwgMCA/ICdSaWdodCcgOiAnJykgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH07XG5cbiAgICAgIExhenlXcmFwcGVyLnByb3RvdHlwZVttZXRob2ROYW1lICsgJ1JpZ2h0J10gPSBmdW5jdGlvbihuKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnJldmVyc2UoKVttZXRob2ROYW1lXShuKS5yZXZlcnNlKCk7XG4gICAgICB9O1xuICAgIH0pO1xuXG4gICAgLy8gQWRkIGBMYXp5V3JhcHBlcmAgbWV0aG9kcyB0aGF0IGFjY2VwdCBhbiBgaXRlcmF0ZWVgIHZhbHVlLlxuICAgIGFycmF5RWFjaChbJ2ZpbHRlcicsICdtYXAnLCAndGFrZVdoaWxlJ10sIGZ1bmN0aW9uKG1ldGhvZE5hbWUsIGluZGV4KSB7XG4gICAgICB2YXIgdHlwZSA9IGluZGV4ICsgMSxcbiAgICAgICAgICBpc0ZpbHRlciA9IHR5cGUgIT0gTEFaWV9NQVBfRkxBRztcblxuICAgICAgTGF6eVdyYXBwZXIucHJvdG90eXBlW21ldGhvZE5hbWVdID0gZnVuY3Rpb24oaXRlcmF0ZWUsIHRoaXNBcmcpIHtcbiAgICAgICAgdmFyIHJlc3VsdCA9IHRoaXMuY2xvbmUoKTtcbiAgICAgICAgcmVzdWx0Ll9faXRlcmF0ZWVzX18ucHVzaCh7ICdpdGVyYXRlZSc6IGdldENhbGxiYWNrKGl0ZXJhdGVlLCB0aGlzQXJnLCAxKSwgJ3R5cGUnOiB0eXBlIH0pO1xuICAgICAgICByZXN1bHQuX19maWx0ZXJlZF9fID0gcmVzdWx0Ll9fZmlsdGVyZWRfXyB8fCBpc0ZpbHRlcjtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH07XG4gICAgfSk7XG5cbiAgICAvLyBBZGQgYExhenlXcmFwcGVyYCBtZXRob2RzIGZvciBgXy5maXJzdGAgYW5kIGBfLmxhc3RgLlxuICAgIGFycmF5RWFjaChbJ2ZpcnN0JywgJ2xhc3QnXSwgZnVuY3Rpb24obWV0aG9kTmFtZSwgaW5kZXgpIHtcbiAgICAgIHZhciB0YWtlTmFtZSA9ICd0YWtlJyArIChpbmRleCA/ICdSaWdodCcgOiAnJyk7XG5cbiAgICAgIExhenlXcmFwcGVyLnByb3RvdHlwZVttZXRob2ROYW1lXSA9IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gdGhpc1t0YWtlTmFtZV0oMSkudmFsdWUoKVswXTtcbiAgICAgIH07XG4gICAgfSk7XG5cbiAgICAvLyBBZGQgYExhenlXcmFwcGVyYCBtZXRob2RzIGZvciBgXy5pbml0aWFsYCBhbmQgYF8ucmVzdGAuXG4gICAgYXJyYXlFYWNoKFsnaW5pdGlhbCcsICdyZXN0J10sIGZ1bmN0aW9uKG1ldGhvZE5hbWUsIGluZGV4KSB7XG4gICAgICB2YXIgZHJvcE5hbWUgPSAnZHJvcCcgKyAoaW5kZXggPyAnJyA6ICdSaWdodCcpO1xuXG4gICAgICBMYXp5V3JhcHBlci5wcm90b3R5cGVbbWV0aG9kTmFtZV0gPSBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX19maWx0ZXJlZF9fID8gbmV3IExhenlXcmFwcGVyKHRoaXMpIDogdGhpc1tkcm9wTmFtZV0oMSk7XG4gICAgICB9O1xuICAgIH0pO1xuXG4gICAgLy8gQWRkIGBMYXp5V3JhcHBlcmAgbWV0aG9kcyBmb3IgYF8ucGx1Y2tgIGFuZCBgXy53aGVyZWAuXG4gICAgYXJyYXlFYWNoKFsncGx1Y2snLCAnd2hlcmUnXSwgZnVuY3Rpb24obWV0aG9kTmFtZSwgaW5kZXgpIHtcbiAgICAgIHZhciBvcGVyYXRpb25OYW1lID0gaW5kZXggPyAnZmlsdGVyJyA6ICdtYXAnLFxuICAgICAgICAgIGNyZWF0ZUNhbGxiYWNrID0gaW5kZXggPyBiYXNlTWF0Y2hlcyA6IHByb3BlcnR5O1xuXG4gICAgICBMYXp5V3JhcHBlci5wcm90b3R5cGVbbWV0aG9kTmFtZV0gPSBmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgICByZXR1cm4gdGhpc1tvcGVyYXRpb25OYW1lXShjcmVhdGVDYWxsYmFjayh2YWx1ZSkpO1xuICAgICAgfTtcbiAgICB9KTtcblxuICAgIExhenlXcmFwcGVyLnByb3RvdHlwZS5jb21wYWN0ID0gZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gdGhpcy5maWx0ZXIoaWRlbnRpdHkpO1xuICAgIH07XG5cbiAgICBMYXp5V3JhcHBlci5wcm90b3R5cGUucmVqZWN0ID0gZnVuY3Rpb24ocHJlZGljYXRlLCB0aGlzQXJnKSB7XG4gICAgICBwcmVkaWNhdGUgPSBnZXRDYWxsYmFjayhwcmVkaWNhdGUsIHRoaXNBcmcsIDEpO1xuICAgICAgcmV0dXJuIHRoaXMuZmlsdGVyKGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiAhcHJlZGljYXRlKHZhbHVlKTtcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICBMYXp5V3JhcHBlci5wcm90b3R5cGUuc2xpY2UgPSBmdW5jdGlvbihzdGFydCwgZW5kKSB7XG4gICAgICBzdGFydCA9IHN0YXJ0ID09IG51bGwgPyAwIDogKCtzdGFydCB8fCAwKTtcblxuICAgICAgdmFyIHJlc3VsdCA9IHRoaXM7XG4gICAgICBpZiAocmVzdWx0Ll9fZmlsdGVyZWRfXyAmJiAoc3RhcnQgPiAwIHx8IGVuZCA8IDApKSB7XG4gICAgICAgIHJldHVybiBuZXcgTGF6eVdyYXBwZXIocmVzdWx0KTtcbiAgICAgIH1cbiAgICAgIGlmIChzdGFydCA8IDApIHtcbiAgICAgICAgcmVzdWx0ID0gcmVzdWx0LnRha2VSaWdodCgtc3RhcnQpO1xuICAgICAgfSBlbHNlIGlmIChzdGFydCkge1xuICAgICAgICByZXN1bHQgPSByZXN1bHQuZHJvcChzdGFydCk7XG4gICAgICB9XG4gICAgICBpZiAoZW5kICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgZW5kID0gKCtlbmQgfHwgMCk7XG4gICAgICAgIHJlc3VsdCA9IGVuZCA8IDAgPyByZXN1bHQuZHJvcFJpZ2h0KC1lbmQpIDogcmVzdWx0LnRha2UoZW5kIC0gc3RhcnQpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9O1xuXG4gICAgTGF6eVdyYXBwZXIucHJvdG90eXBlLnRha2VSaWdodFdoaWxlID0gZnVuY3Rpb24ocHJlZGljYXRlLCB0aGlzQXJnKSB7XG4gICAgICByZXR1cm4gdGhpcy5yZXZlcnNlKCkudGFrZVdoaWxlKHByZWRpY2F0ZSwgdGhpc0FyZykucmV2ZXJzZSgpO1xuICAgIH07XG5cbiAgICBMYXp5V3JhcHBlci5wcm90b3R5cGUudG9BcnJheSA9IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIHRoaXMudGFrZShQT1NJVElWRV9JTkZJTklUWSk7XG4gICAgfTtcblxuICAgIC8vIEFkZCBgTGF6eVdyYXBwZXJgIG1ldGhvZHMgdG8gYGxvZGFzaC5wcm90b3R5cGVgLlxuICAgIGJhc2VGb3JPd24oTGF6eVdyYXBwZXIucHJvdG90eXBlLCBmdW5jdGlvbihmdW5jLCBtZXRob2ROYW1lKSB7XG4gICAgICB2YXIgY2hlY2tJdGVyYXRlZSA9IC9eKD86ZmlsdGVyfG1hcHxyZWplY3QpfFdoaWxlJC8udGVzdChtZXRob2ROYW1lKSxcbiAgICAgICAgICByZXRVbndyYXBwZWQgPSAvXig/OmZpcnN0fGxhc3QpJC8udGVzdChtZXRob2ROYW1lKSxcbiAgICAgICAgICBsb2Rhc2hGdW5jID0gbG9kYXNoW3JldFVud3JhcHBlZCA/ICgndGFrZScgKyAobWV0aG9kTmFtZSA9PSAnbGFzdCcgPyAnUmlnaHQnIDogJycpKSA6IG1ldGhvZE5hbWVdO1xuXG4gICAgICBpZiAoIWxvZGFzaEZ1bmMpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgbG9kYXNoLnByb3RvdHlwZVttZXRob2ROYW1lXSA9IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgYXJncyA9IHJldFVud3JhcHBlZCA/IFsxXSA6IGFyZ3VtZW50cyxcbiAgICAgICAgICAgIGNoYWluQWxsID0gdGhpcy5fX2NoYWluX18sXG4gICAgICAgICAgICB2YWx1ZSA9IHRoaXMuX193cmFwcGVkX18sXG4gICAgICAgICAgICBpc0h5YnJpZCA9ICEhdGhpcy5fX2FjdGlvbnNfXy5sZW5ndGgsXG4gICAgICAgICAgICBpc0xhenkgPSB2YWx1ZSBpbnN0YW5jZW9mIExhenlXcmFwcGVyLFxuICAgICAgICAgICAgaXRlcmF0ZWUgPSBhcmdzWzBdLFxuICAgICAgICAgICAgdXNlTGF6eSA9IGlzTGF6eSB8fCBpc0FycmF5KHZhbHVlKTtcblxuICAgICAgICBpZiAodXNlTGF6eSAmJiBjaGVja0l0ZXJhdGVlICYmIHR5cGVvZiBpdGVyYXRlZSA9PSAnZnVuY3Rpb24nICYmIGl0ZXJhdGVlLmxlbmd0aCAhPSAxKSB7XG4gICAgICAgICAgLy8gQXZvaWQgbGF6eSB1c2UgaWYgdGhlIGl0ZXJhdGVlIGhhcyBhIFwibGVuZ3RoXCIgdmFsdWUgb3RoZXIgdGhhbiBgMWAuXG4gICAgICAgICAgaXNMYXp5ID0gdXNlTGF6eSA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHZhciBpbnRlcmNlcHRvciA9IGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICAgICAgcmV0dXJuIChyZXRVbndyYXBwZWQgJiYgY2hhaW5BbGwpXG4gICAgICAgICAgICA/IGxvZGFzaEZ1bmModmFsdWUsIDEpWzBdXG4gICAgICAgICAgICA6IGxvZGFzaEZ1bmMuYXBwbHkodW5kZWZpbmVkLCBhcnJheVB1c2goW3ZhbHVlXSwgYXJncykpO1xuICAgICAgICB9O1xuXG4gICAgICAgIHZhciBhY3Rpb24gPSB7ICdmdW5jJzogdGhydSwgJ2FyZ3MnOiBbaW50ZXJjZXB0b3JdLCAndGhpc0FyZyc6IHVuZGVmaW5lZCB9LFxuICAgICAgICAgICAgb25seUxhenkgPSBpc0xhenkgJiYgIWlzSHlicmlkO1xuXG4gICAgICAgIGlmIChyZXRVbndyYXBwZWQgJiYgIWNoYWluQWxsKSB7XG4gICAgICAgICAgaWYgKG9ubHlMYXp5KSB7XG4gICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLmNsb25lKCk7XG4gICAgICAgICAgICB2YWx1ZS5fX2FjdGlvbnNfXy5wdXNoKGFjdGlvbik7XG4gICAgICAgICAgICByZXR1cm4gZnVuYy5jYWxsKHZhbHVlKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGxvZGFzaEZ1bmMuY2FsbCh1bmRlZmluZWQsIHRoaXMudmFsdWUoKSlbMF07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFyZXRVbndyYXBwZWQgJiYgdXNlTGF6eSkge1xuICAgICAgICAgIHZhbHVlID0gb25seUxhenkgPyB2YWx1ZSA6IG5ldyBMYXp5V3JhcHBlcih0aGlzKTtcbiAgICAgICAgICB2YXIgcmVzdWx0ID0gZnVuYy5hcHBseSh2YWx1ZSwgYXJncyk7XG4gICAgICAgICAgcmVzdWx0Ll9fYWN0aW9uc19fLnB1c2goYWN0aW9uKTtcbiAgICAgICAgICByZXR1cm4gbmV3IExvZGFzaFdyYXBwZXIocmVzdWx0LCBjaGFpbkFsbCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMudGhydShpbnRlcmNlcHRvcik7XG4gICAgICB9O1xuICAgIH0pO1xuXG4gICAgLy8gQWRkIGBBcnJheWAgYW5kIGBTdHJpbmdgIG1ldGhvZHMgdG8gYGxvZGFzaC5wcm90b3R5cGVgLlxuICAgIGFycmF5RWFjaChbJ2pvaW4nLCAncG9wJywgJ3B1c2gnLCAncmVwbGFjZScsICdzaGlmdCcsICdzb3J0JywgJ3NwbGljZScsICdzcGxpdCcsICd1bnNoaWZ0J10sIGZ1bmN0aW9uKG1ldGhvZE5hbWUpIHtcbiAgICAgIHZhciBmdW5jID0gKC9eKD86cmVwbGFjZXxzcGxpdCkkLy50ZXN0KG1ldGhvZE5hbWUpID8gc3RyaW5nUHJvdG8gOiBhcnJheVByb3RvKVttZXRob2ROYW1lXSxcbiAgICAgICAgICBjaGFpbk5hbWUgPSAvXig/OnB1c2h8c29ydHx1bnNoaWZ0KSQvLnRlc3QobWV0aG9kTmFtZSkgPyAndGFwJyA6ICd0aHJ1JyxcbiAgICAgICAgICByZXRVbndyYXBwZWQgPSAvXig/OmpvaW58cG9wfHJlcGxhY2V8c2hpZnQpJC8udGVzdChtZXRob2ROYW1lKTtcblxuICAgICAgbG9kYXNoLnByb3RvdHlwZVttZXRob2ROYW1lXSA9IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgYXJncyA9IGFyZ3VtZW50cztcbiAgICAgICAgaWYgKHJldFVud3JhcHBlZCAmJiAhdGhpcy5fX2NoYWluX18pIHtcbiAgICAgICAgICByZXR1cm4gZnVuYy5hcHBseSh0aGlzLnZhbHVlKCksIGFyZ3MpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzW2NoYWluTmFtZV0oZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgICAgICByZXR1cm4gZnVuYy5hcHBseSh2YWx1ZSwgYXJncyk7XG4gICAgICAgIH0pO1xuICAgICAgfTtcbiAgICB9KTtcblxuICAgIC8vIE1hcCBtaW5pZmllZCBmdW5jdGlvbiBuYW1lcyB0byB0aGVpciByZWFsIG5hbWVzLlxuICAgIGJhc2VGb3JPd24oTGF6eVdyYXBwZXIucHJvdG90eXBlLCBmdW5jdGlvbihmdW5jLCBtZXRob2ROYW1lKSB7XG4gICAgICB2YXIgbG9kYXNoRnVuYyA9IGxvZGFzaFttZXRob2ROYW1lXTtcbiAgICAgIGlmIChsb2Rhc2hGdW5jKSB7XG4gICAgICAgIHZhciBrZXkgPSBsb2Rhc2hGdW5jLm5hbWUsXG4gICAgICAgICAgICBuYW1lcyA9IHJlYWxOYW1lc1trZXldIHx8IChyZWFsTmFtZXNba2V5XSA9IFtdKTtcblxuICAgICAgICBuYW1lcy5wdXNoKHsgJ25hbWUnOiBtZXRob2ROYW1lLCAnZnVuYyc6IGxvZGFzaEZ1bmMgfSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZWFsTmFtZXNbY3JlYXRlSHlicmlkV3JhcHBlcih1bmRlZmluZWQsIEJJTkRfS0VZX0ZMQUcpLm5hbWVdID0gW3sgJ25hbWUnOiAnd3JhcHBlcicsICdmdW5jJzogdW5kZWZpbmVkIH1dO1xuXG4gICAgLy8gQWRkIGZ1bmN0aW9ucyB0byB0aGUgbGF6eSB3cmFwcGVyLlxuICAgIExhenlXcmFwcGVyLnByb3RvdHlwZS5jbG9uZSA9IGxhenlDbG9uZTtcbiAgICBMYXp5V3JhcHBlci5wcm90b3R5cGUucmV2ZXJzZSA9IGxhenlSZXZlcnNlO1xuICAgIExhenlXcmFwcGVyLnByb3RvdHlwZS52YWx1ZSA9IGxhenlWYWx1ZTtcblxuICAgIC8vIEFkZCBjaGFpbmluZyBmdW5jdGlvbnMgdG8gdGhlIGBsb2Rhc2hgIHdyYXBwZXIuXG4gICAgbG9kYXNoLnByb3RvdHlwZS5jaGFpbiA9IHdyYXBwZXJDaGFpbjtcbiAgICBsb2Rhc2gucHJvdG90eXBlLmNvbW1pdCA9IHdyYXBwZXJDb21taXQ7XG4gICAgbG9kYXNoLnByb3RvdHlwZS5jb25jYXQgPSB3cmFwcGVyQ29uY2F0O1xuICAgIGxvZGFzaC5wcm90b3R5cGUucGxhbnQgPSB3cmFwcGVyUGxhbnQ7XG4gICAgbG9kYXNoLnByb3RvdHlwZS5yZXZlcnNlID0gd3JhcHBlclJldmVyc2U7XG4gICAgbG9kYXNoLnByb3RvdHlwZS50b1N0cmluZyA9IHdyYXBwZXJUb1N0cmluZztcbiAgICBsb2Rhc2gucHJvdG90eXBlLnJ1biA9IGxvZGFzaC5wcm90b3R5cGUudG9KU09OID0gbG9kYXNoLnByb3RvdHlwZS52YWx1ZU9mID0gbG9kYXNoLnByb3RvdHlwZS52YWx1ZSA9IHdyYXBwZXJWYWx1ZTtcblxuICAgIC8vIEFkZCBmdW5jdGlvbiBhbGlhc2VzIHRvIHRoZSBgbG9kYXNoYCB3cmFwcGVyLlxuICAgIGxvZGFzaC5wcm90b3R5cGUuY29sbGVjdCA9IGxvZGFzaC5wcm90b3R5cGUubWFwO1xuICAgIGxvZGFzaC5wcm90b3R5cGUuaGVhZCA9IGxvZGFzaC5wcm90b3R5cGUuZmlyc3Q7XG4gICAgbG9kYXNoLnByb3RvdHlwZS5zZWxlY3QgPSBsb2Rhc2gucHJvdG90eXBlLmZpbHRlcjtcbiAgICBsb2Rhc2gucHJvdG90eXBlLnRhaWwgPSBsb2Rhc2gucHJvdG90eXBlLnJlc3Q7XG5cbiAgICByZXR1cm4gbG9kYXNoO1xuICB9XG5cbiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5cbiAgLy8gRXhwb3J0IGxvZGFzaC5cbiAgdmFyIF8gPSBydW5JbkNvbnRleHQoKTtcblxuICAvLyBTb21lIEFNRCBidWlsZCBvcHRpbWl6ZXJzIGxpa2Ugci5qcyBjaGVjayBmb3IgY29uZGl0aW9uIHBhdHRlcm5zIGxpa2UgdGhlIGZvbGxvd2luZzpcbiAgaWYgKHR5cGVvZiBkZWZpbmUgPT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgZGVmaW5lLmFtZCA9PSAnb2JqZWN0JyAmJiBkZWZpbmUuYW1kKSB7XG4gICAgLy8gRXhwb3NlIGxvZGFzaCB0byB0aGUgZ2xvYmFsIG9iamVjdCB3aGVuIGFuIEFNRCBsb2FkZXIgaXMgcHJlc2VudCB0byBhdm9pZFxuICAgIC8vIGVycm9ycyBpbiBjYXNlcyB3aGVyZSBsb2Rhc2ggaXMgbG9hZGVkIGJ5IGEgc2NyaXB0IHRhZyBhbmQgbm90IGludGVuZGVkXG4gICAgLy8gYXMgYW4gQU1EIG1vZHVsZS4gU2VlIGh0dHA6Ly9yZXF1aXJlanMub3JnL2RvY3MvZXJyb3JzLmh0bWwjbWlzbWF0Y2ggZm9yXG4gICAgLy8gbW9yZSBkZXRhaWxzLlxuICAgIHJvb3QuXyA9IF87XG5cbiAgICAvLyBEZWZpbmUgYXMgYW4gYW5vbnltb3VzIG1vZHVsZSBzbywgdGhyb3VnaCBwYXRoIG1hcHBpbmcsIGl0IGNhbiBiZVxuICAgIC8vIHJlZmVyZW5jZWQgYXMgdGhlIFwidW5kZXJzY29yZVwiIG1vZHVsZS5cbiAgICBkZWZpbmUoZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gXztcbiAgICB9KTtcbiAgfVxuICAvLyBDaGVjayBmb3IgYGV4cG9ydHNgIGFmdGVyIGBkZWZpbmVgIGluIGNhc2UgYSBidWlsZCBvcHRpbWl6ZXIgYWRkcyBhbiBgZXhwb3J0c2Agb2JqZWN0LlxuICBlbHNlIGlmIChmcmVlRXhwb3J0cyAmJiBmcmVlTW9kdWxlKSB7XG4gICAgLy8gRXhwb3J0IGZvciBOb2RlLmpzIG9yIFJpbmdvSlMuXG4gICAgaWYgKG1vZHVsZUV4cG9ydHMpIHtcbiAgICAgIChmcmVlTW9kdWxlLmV4cG9ydHMgPSBfKS5fID0gXztcbiAgICB9XG4gICAgLy8gRXhwb3J0IGZvciBSaGlubyB3aXRoIENvbW1vbkpTIHN1cHBvcnQuXG4gICAgZWxzZSB7XG4gICAgICBmcmVlRXhwb3J0cy5fID0gXztcbiAgICB9XG4gIH1cbiAgZWxzZSB7XG4gICAgLy8gRXhwb3J0IGZvciBhIGJyb3dzZXIgb3IgUmhpbm8uXG4gICAgcm9vdC5fID0gXztcbiAgfVxufS5jYWxsKHRoaXMpKTtcblxuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2xvZGFzaC9pbmRleC5qc1xuICoqIG1vZHVsZSBpZCA9IDEzXG4gKiogbW9kdWxlIGNodW5rcyA9IDI0XG4gKiovIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");

/***/ },
/* 14 */
/***/ 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\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTQuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vKHdlYnBhY2spL2J1aWxkaW4vbW9kdWxlLmpzP2MzYzIiXSwic291cmNlc0NvbnRlbnQiOlsibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihtb2R1bGUpIHtcclxuXHRpZighbW9kdWxlLndlYnBhY2tQb2x5ZmlsbCkge1xyXG5cdFx0bW9kdWxlLmRlcHJlY2F0ZSA9IGZ1bmN0aW9uKCkge307XHJcblx0XHRtb2R1bGUucGF0aHMgPSBbXTtcclxuXHRcdC8vIG1vZHVsZS5wYXJlbnQgPSB1bmRlZmluZWQgYnkgZGVmYXVsdFxyXG5cdFx0bW9kdWxlLmNoaWxkcmVuID0gW107XHJcblx0XHRtb2R1bGUud2VicGFja1BvbHlmaWxsID0gMTtcclxuXHR9XHJcblx0cmV0dXJuIG1vZHVsZTtcclxufVxyXG5cblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqICh3ZWJwYWNrKS9idWlsZGluL21vZHVsZS5qc1xuICoqIG1vZHVsZSBpZCA9IDE0XG4gKiogbW9kdWxlIGNodW5rcyA9IDI0XG4gKiovIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=");

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

	eval("__webpack_require__(16)(__webpack_require__(17))\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTUuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ib3dlcl9jb21wb25lbnRzL21vbWVudC9taW4vbW9tZW50Lm1pbi5qcz9jMDBmIl0sInNvdXJjZXNDb250ZW50IjpbInJlcXVpcmUoXCIhIS9ob21lL2RlcGxveWVyL2RlcGxveW1lbnQvanMvbm9kZV9tb2R1bGVzL3NjcmlwdC1sb2FkZXIvYWRkU2NyaXB0LmpzXCIpKHJlcXVpcmUoXCIhIS9ob21lL2RlcGxveWVyL2RlcGxveW1lbnQvanMvbm9kZV9tb2R1bGVzL3Jhdy1sb2FkZXIvaW5kZXguanMhL2hvbWUvZGVwbG95ZXIvZGVwbG95bWVudC9qcy9ib3dlcl9jb21wb25lbnRzL21vbWVudC9taW4vbW9tZW50Lm1pbi5qc1wiKSlcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9zY3JpcHQtbG9hZGVyIS4vYm93ZXJfY29tcG9uZW50cy9tb21lbnQvbWluL21vbWVudC5taW4uanNcbiAqKiBtb2R1bGUgaWQgPSAxNVxuICoqIG1vZHVsZSBjaHVua3MgPSAyNFxuICoqLyJdLCJtYXBwaW5ncyI6IkFBQUEiLCJzb3VyY2VSb290IjoiIn0=");

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

	eval("/*\r\n\tMIT License http://www.opensource.org/licenses/mit-license.php\r\n\tAuthor Tobias Koppers @sokra\r\n*/\r\nmodule.exports = function(src) {\r\n\tif (typeof execScript === \"function\")\r\n\t\texecScript(src);\r\n\telse\r\n\t\teval.call(null, src);\r\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTYuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9+L3NjcmlwdC1sb2FkZXIvYWRkU2NyaXB0LmpzPzgxMDciXSwic291cmNlc0NvbnRlbnQiOlsiLypcclxuXHRNSVQgTGljZW5zZSBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL21pdC1saWNlbnNlLnBocFxyXG5cdEF1dGhvciBUb2JpYXMgS29wcGVycyBAc29rcmFcclxuKi9cclxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihzcmMpIHtcclxuXHRpZiAodHlwZW9mIGV4ZWNTY3JpcHQgPT09IFwiZnVuY3Rpb25cIilcclxuXHRcdGV4ZWNTY3JpcHQoc3JjKTtcclxuXHRlbHNlXHJcblx0XHRldmFsLmNhbGwobnVsbCwgc3JjKTtcclxufVxuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L3NjcmlwdC1sb2FkZXIvYWRkU2NyaXB0LmpzXG4gKiogbW9kdWxlIGlkID0gMTZcbiAqKiBtb2R1bGUgY2h1bmtzID0gMjAgMjRcbiAqKi8iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");

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

	eval("module.exports = \"//! moment.js\\n//! version : 2.11.1\\n//! authors : Tim Wood, Iskren Chernev, Moment.js contributors\\n//! license : MIT\\n//! momentjs.com\\n!function(a,b){\\\"object\\\"==typeof exports&&\\\"undefined\\\"!=typeof module?module.exports=b():\\\"function\\\"==typeof define&&define.amd?define(b):a.moment=b()}(this,function(){\\\"use strict\\\";function a(){return Uc.apply(null,arguments)}function b(a){Uc=a}function c(a){return\\\"[object Array]\\\"===Object.prototype.toString.call(a)}function d(a){return a instanceof Date||\\\"[object Date]\\\"===Object.prototype.toString.call(a)}function e(a,b){var c,d=[];for(c=0;c<a.length;++c)d.push(b(a[c],c));return d}function f(a,b){return Object.prototype.hasOwnProperty.call(a,b)}function g(a,b){for(var c in b)f(b,c)&&(a[c]=b[c]);return f(b,\\\"toString\\\")&&(a.toString=b.toString),f(b,\\\"valueOf\\\")&&(a.valueOf=b.valueOf),a}function h(a,b,c,d){return Da(a,b,c,d,!0).utc()}function i(){return{empty:!1,unusedTokens:[],unusedInput:[],overflow:-2,charsLeftOver:0,nullInput:!1,invalidMonth:null,invalidFormat:!1,userInvalidated:!1,iso:!1}}function j(a){return null==a._pf&&(a._pf=i()),a._pf}function k(a){if(null==a._isValid){var b=j(a);a._isValid=!(isNaN(a._d.getTime())||!(b.overflow<0)||b.empty||b.invalidMonth||b.invalidWeekday||b.nullInput||b.invalidFormat||b.userInvalidated),a._strict&&(a._isValid=a._isValid&&0===b.charsLeftOver&&0===b.unusedTokens.length&&void 0===b.bigHour)}return a._isValid}function l(a){var b=h(NaN);return null!=a?g(j(b),a):j(b).userInvalidated=!0,b}function m(a){return void 0===a}function n(a,b){var c,d,e;if(m(b._isAMomentObject)||(a._isAMomentObject=b._isAMomentObject),m(b._i)||(a._i=b._i),m(b._f)||(a._f=b._f),m(b._l)||(a._l=b._l),m(b._strict)||(a._strict=b._strict),m(b._tzm)||(a._tzm=b._tzm),m(b._isUTC)||(a._isUTC=b._isUTC),m(b._offset)||(a._offset=b._offset),m(b._pf)||(a._pf=j(b)),m(b._locale)||(a._locale=b._locale),Wc.length>0)for(c in Wc)d=Wc[c],e=b[d],m(e)||(a[d]=e);return a}function o(b){n(this,b),this._d=new Date(null!=b._d?b._d.getTime():NaN),Xc===!1&&(Xc=!0,a.updateOffset(this),Xc=!1)}function p(a){return a instanceof o||null!=a&&null!=a._isAMomentObject}function q(a){return 0>a?Math.ceil(a):Math.floor(a)}function r(a){var b=+a,c=0;return 0!==b&&isFinite(b)&&(c=q(b)),c}function s(a,b,c){var d,e=Math.min(a.length,b.length),f=Math.abs(a.length-b.length),g=0;for(d=0;e>d;d++)(c&&a[d]!==b[d]||!c&&r(a[d])!==r(b[d]))&&g++;return g+f}function t(){}function u(a){return a?a.toLowerCase().replace(\\\"_\\\",\\\"-\\\"):a}function v(a){for(var b,c,d,e,f=0;f<a.length;){for(e=u(a[f]).split(\\\"-\\\"),b=e.length,c=u(a[f+1]),c=c?c.split(\\\"-\\\"):null;b>0;){if(d=w(e.slice(0,b).join(\\\"-\\\")))return d;if(c&&c.length>=b&&s(e,c,!0)>=b-1)break;b--}f++}return null}function w(a){var b=null;if(!Yc[a]&&\\\"undefined\\\"!=typeof module&&module&&module.exports)try{b=Vc._abbr,require(\\\"./locale/\\\"+a),x(b)}catch(c){}return Yc[a]}function x(a,b){var c;return a&&(c=m(b)?z(a):y(a,b),c&&(Vc=c)),Vc._abbr}function y(a,b){return null!==b?(b.abbr=a,Yc[a]=Yc[a]||new t,Yc[a].set(b),x(a),Yc[a]):(delete Yc[a],null)}function z(a){var b;if(a&&a._locale&&a._locale._abbr&&(a=a._locale._abbr),!a)return Vc;if(!c(a)){if(b=w(a))return b;a=[a]}return v(a)}function A(a,b){var c=a.toLowerCase();Zc[c]=Zc[c+\\\"s\\\"]=Zc[b]=a}function B(a){return\\\"string\\\"==typeof a?Zc[a]||Zc[a.toLowerCase()]:void 0}function C(a){var b,c,d={};for(c in a)f(a,c)&&(b=B(c),b&&(d[b]=a[c]));return d}function D(a){return a instanceof Function||\\\"[object Function]\\\"===Object.prototype.toString.call(a)}function E(b,c){return function(d){return null!=d?(G(this,b,d),a.updateOffset(this,c),this):F(this,b)}}function F(a,b){return a.isValid()?a._d[\\\"get\\\"+(a._isUTC?\\\"UTC\\\":\\\"\\\")+b]():NaN}function G(a,b,c){a.isValid()&&a._d[\\\"set\\\"+(a._isUTC?\\\"UTC\\\":\\\"\\\")+b](c)}function H(a,b){var c;if(\\\"object\\\"==typeof a)for(c in a)this.set(c,a[c]);else if(a=B(a),D(this[a]))return this[a](b);return this}function I(a,b,c){var d=\\\"\\\"+Math.abs(a),e=b-d.length,f=a>=0;return(f?c?\\\"+\\\":\\\"\\\":\\\"-\\\")+Math.pow(10,Math.max(0,e)).toString().substr(1)+d}function J(a,b,c,d){var e=d;\\\"string\\\"==typeof d&&(e=function(){return this[d]()}),a&&(bd[a]=e),b&&(bd[b[0]]=function(){return I(e.apply(this,arguments),b[1],b[2])}),c&&(bd[c]=function(){return this.localeData().ordinal(e.apply(this,arguments),a)})}function K(a){return a.match(/\\\\[[\\\\s\\\\S]/)?a.replace(/^\\\\[|\\\\]$/g,\\\"\\\"):a.replace(/\\\\\\\\/g,\\\"\\\")}function L(a){var b,c,d=a.match($c);for(b=0,c=d.length;c>b;b++)bd[d[b]]?d[b]=bd[d[b]]:d[b]=K(d[b]);return function(e){var f=\\\"\\\";for(b=0;c>b;b++)f+=d[b]instanceof Function?d[b].call(e,a):d[b];return f}}function M(a,b){return a.isValid()?(b=N(b,a.localeData()),ad[b]=ad[b]||L(b),ad[b](a)):a.localeData().invalidDate()}function N(a,b){function c(a){return b.longDateFormat(a)||a}var d=5;for(_c.lastIndex=0;d>=0&&_c.test(a);)a=a.replace(_c,c),_c.lastIndex=0,d-=1;return a}function O(a,b,c){td[a]=D(b)?b:function(a,d){return a&&c?c:b}}function P(a,b){return f(td,a)?td[a](b._strict,b._locale):new RegExp(Q(a))}function Q(a){return R(a.replace(\\\"\\\\\\\\\\\",\\\"\\\").replace(/\\\\\\\\(\\\\[)|\\\\\\\\(\\\\])|\\\\[([^\\\\]\\\\[]*)\\\\]|\\\\\\\\(.)/g,function(a,b,c,d,e){return b||c||d||e}))}function R(a){return a.replace(/[-\\\\/\\\\\\\\^$*+?.()|[\\\\]{}]/g,\\\"\\\\\\\\$&\\\")}function S(a,b){var c,d=b;for(\\\"string\\\"==typeof a&&(a=[a]),\\\"number\\\"==typeof b&&(d=function(a,c){c[b]=r(a)}),c=0;c<a.length;c++)ud[a[c]]=d}function T(a,b){S(a,function(a,c,d,e){d._w=d._w||{},b(a,d._w,d,e)})}function U(a,b,c){null!=b&&f(ud,a)&&ud[a](b,c._a,c,a)}function V(a,b){return new Date(Date.UTC(a,b+1,0)).getUTCDate()}function W(a,b){return c(this._months)?this._months[a.month()]:this._months[Ed.test(b)?\\\"format\\\":\\\"standalone\\\"][a.month()]}function X(a,b){return c(this._monthsShort)?this._monthsShort[a.month()]:this._monthsShort[Ed.test(b)?\\\"format\\\":\\\"standalone\\\"][a.month()]}function Y(a,b,c){var d,e,f;for(this._monthsParse||(this._monthsParse=[],this._longMonthsParse=[],this._shortMonthsParse=[]),d=0;12>d;d++){if(e=h([2e3,d]),c&&!this._longMonthsParse[d]&&(this._longMonthsParse[d]=new RegExp(\\\"^\\\"+this.months(e,\\\"\\\").replace(\\\".\\\",\\\"\\\")+\\\"$\\\",\\\"i\\\"),this._shortMonthsParse[d]=new RegExp(\\\"^\\\"+this.monthsShort(e,\\\"\\\").replace(\\\".\\\",\\\"\\\")+\\\"$\\\",\\\"i\\\")),c||this._monthsParse[d]||(f=\\\"^\\\"+this.months(e,\\\"\\\")+\\\"|^\\\"+this.monthsShort(e,\\\"\\\"),this._monthsParse[d]=new RegExp(f.replace(\\\".\\\",\\\"\\\"),\\\"i\\\")),c&&\\\"MMMM\\\"===b&&this._longMonthsParse[d].test(a))return d;if(c&&\\\"MMM\\\"===b&&this._shortMonthsParse[d].test(a))return d;if(!c&&this._monthsParse[d].test(a))return d}}function Z(a,b){var c;return a.isValid()?\\\"string\\\"==typeof b&&(b=a.localeData().monthsParse(b),\\\"number\\\"!=typeof b)?a:(c=Math.min(a.date(),V(a.year(),b)),a._d[\\\"set\\\"+(a._isUTC?\\\"UTC\\\":\\\"\\\")+\\\"Month\\\"](b,c),a):a}function $(b){return null!=b?(Z(this,b),a.updateOffset(this,!0),this):F(this,\\\"Month\\\")}function _(){return V(this.year(),this.month())}function aa(a){return this._monthsParseExact?(f(this,\\\"_monthsRegex\\\")||ca.call(this),a?this._monthsShortStrictRegex:this._monthsShortRegex):this._monthsShortStrictRegex&&a?this._monthsShortStrictRegex:this._monthsShortRegex}function ba(a){return this._monthsParseExact?(f(this,\\\"_monthsRegex\\\")||ca.call(this),a?this._monthsStrictRegex:this._monthsRegex):this._monthsStrictRegex&&a?this._monthsStrictRegex:this._monthsRegex}function ca(){function a(a,b){return b.length-a.length}var b,c,d=[],e=[],f=[];for(b=0;12>b;b++)c=h([2e3,b]),d.push(this.monthsShort(c,\\\"\\\")),e.push(this.months(c,\\\"\\\")),f.push(this.months(c,\\\"\\\")),f.push(this.monthsShort(c,\\\"\\\"));for(d.sort(a),e.sort(a),f.sort(a),b=0;12>b;b++)d[b]=R(d[b]),e[b]=R(e[b]),f[b]=R(f[b]);this._monthsRegex=new RegExp(\\\"^(\\\"+f.join(\\\"|\\\")+\\\")\\\",\\\"i\\\"),this._monthsShortRegex=this._monthsRegex,this._monthsStrictRegex=new RegExp(\\\"^(\\\"+e.join(\\\"|\\\")+\\\")$\\\",\\\"i\\\"),this._monthsShortStrictRegex=new RegExp(\\\"^(\\\"+d.join(\\\"|\\\")+\\\")$\\\",\\\"i\\\")}function da(a){var b,c=a._a;return c&&-2===j(a).overflow&&(b=c[wd]<0||c[wd]>11?wd:c[xd]<1||c[xd]>V(c[vd],c[wd])?xd:c[yd]<0||c[yd]>24||24===c[yd]&&(0!==c[zd]||0!==c[Ad]||0!==c[Bd])?yd:c[zd]<0||c[zd]>59?zd:c[Ad]<0||c[Ad]>59?Ad:c[Bd]<0||c[Bd]>999?Bd:-1,j(a)._overflowDayOfYear&&(vd>b||b>xd)&&(b=xd),j(a)._overflowWeeks&&-1===b&&(b=Cd),j(a)._overflowWeekday&&-1===b&&(b=Dd),j(a).overflow=b),a}function ea(b){a.suppressDeprecationWarnings===!1&&\\\"undefined\\\"!=typeof console&&console.warn&&console.warn(\\\"Deprecation warning: \\\"+b)}function fa(a,b){var c=!0;return g(function(){return c&&(ea(a+\\\"\\\\nArguments: \\\"+Array.prototype.slice.call(arguments).join(\\\", \\\")+\\\"\\\\n\\\"+(new Error).stack),c=!1),b.apply(this,arguments)},b)}function ga(a,b){Jd[a]||(ea(b),Jd[a]=!0)}function ha(a){var b,c,d,e,f,g,h=a._i,i=Kd.exec(h)||Ld.exec(h);if(i){for(j(a).iso=!0,b=0,c=Nd.length;c>b;b++)if(Nd[b][1].exec(i[1])){e=Nd[b][0],d=Nd[b][2]!==!1;break}if(null==e)return void(a._isValid=!1);if(i[3]){for(b=0,c=Od.length;c>b;b++)if(Od[b][1].exec(i[3])){f=(i[2]||\\\" \\\")+Od[b][0];break}if(null==f)return void(a._isValid=!1)}if(!d&&null!=f)return void(a._isValid=!1);if(i[4]){if(!Md.exec(i[4]))return void(a._isValid=!1);g=\\\"Z\\\"}a._f=e+(f||\\\"\\\")+(g||\\\"\\\"),wa(a)}else a._isValid=!1}function ia(b){var c=Pd.exec(b._i);return null!==c?void(b._d=new Date(+c[1])):(ha(b),void(b._isValid===!1&&(delete b._isValid,a.createFromInputFallback(b))))}function ja(a,b,c,d,e,f,g){var h=new Date(a,b,c,d,e,f,g);return 100>a&&a>=0&&isFinite(h.getFullYear())&&h.setFullYear(a),h}function ka(a){var b=new Date(Date.UTC.apply(null,arguments));return 100>a&&a>=0&&isFinite(b.getUTCFullYear())&&b.setUTCFullYear(a),b}function la(a){return ma(a)?366:365}function ma(a){return a%4===0&&a%100!==0||a%400===0}function na(){return ma(this.year())}function oa(a,b,c){var d=7+b-c,e=(7+ka(a,0,d).getUTCDay()-b)%7;return-e+d-1}function pa(a,b,c,d,e){var f,g,h=(7+c-d)%7,i=oa(a,d,e),j=1+7*(b-1)+h+i;return 0>=j?(f=a-1,g=la(f)+j):j>la(a)?(f=a+1,g=j-la(a)):(f=a,g=j),{year:f,dayOfYear:g}}function qa(a,b,c){var d,e,f=oa(a.year(),b,c),g=Math.floor((a.dayOfYear()-f-1)/7)+1;return 1>g?(e=a.year()-1,d=g+ra(e,b,c)):g>ra(a.year(),b,c)?(d=g-ra(a.year(),b,c),e=a.year()+1):(e=a.year(),d=g),{week:d,year:e}}function ra(a,b,c){var d=oa(a,b,c),e=oa(a+1,b,c);return(la(a)-d+e)/7}function sa(a,b,c){return null!=a?a:null!=b?b:c}function ta(b){var c=new Date(a.now());return b._useUTC?[c.getUTCFullYear(),c.getUTCMonth(),c.getUTCDate()]:[c.getFullYear(),c.getMonth(),c.getDate()]}function ua(a){var b,c,d,e,f=[];if(!a._d){for(d=ta(a),a._w&&null==a._a[xd]&&null==a._a[wd]&&va(a),a._dayOfYear&&(e=sa(a._a[vd],d[vd]),a._dayOfYear>la(e)&&(j(a)._overflowDayOfYear=!0),c=ka(e,0,a._dayOfYear),a._a[wd]=c.getUTCMonth(),a._a[xd]=c.getUTCDate()),b=0;3>b&&null==a._a[b];++b)a._a[b]=f[b]=d[b];for(;7>b;b++)a._a[b]=f[b]=null==a._a[b]?2===b?1:0:a._a[b];24===a._a[yd]&&0===a._a[zd]&&0===a._a[Ad]&&0===a._a[Bd]&&(a._nextDay=!0,a._a[yd]=0),a._d=(a._useUTC?ka:ja).apply(null,f),null!=a._tzm&&a._d.setUTCMinutes(a._d.getUTCMinutes()-a._tzm),a._nextDay&&(a._a[yd]=24)}}function va(a){var b,c,d,e,f,g,h,i;b=a._w,null!=b.GG||null!=b.W||null!=b.E?(f=1,g=4,c=sa(b.GG,a._a[vd],qa(Ea(),1,4).year),d=sa(b.W,1),e=sa(b.E,1),(1>e||e>7)&&(i=!0)):(f=a._locale._week.dow,g=a._locale._week.doy,c=sa(b.gg,a._a[vd],qa(Ea(),f,g).year),d=sa(b.w,1),null!=b.d?(e=b.d,(0>e||e>6)&&(i=!0)):null!=b.e?(e=b.e+f,(b.e<0||b.e>6)&&(i=!0)):e=f),1>d||d>ra(c,f,g)?j(a)._overflowWeeks=!0:null!=i?j(a)._overflowWeekday=!0:(h=pa(c,d,e,f,g),a._a[vd]=h.year,a._dayOfYear=h.dayOfYear)}function wa(b){if(b._f===a.ISO_8601)return void ha(b);b._a=[],j(b).empty=!0;var c,d,e,f,g,h=\\\"\\\"+b._i,i=h.length,k=0;for(e=N(b._f,b._locale).match($c)||[],c=0;c<e.length;c++)f=e[c],d=(h.match(P(f,b))||[])[0],d&&(g=h.substr(0,h.indexOf(d)),g.length>0&&j(b).unusedInput.push(g),h=h.slice(h.indexOf(d)+d.length),k+=d.length),bd[f]?(d?j(b).empty=!1:j(b).unusedTokens.push(f),U(f,d,b)):b._strict&&!d&&j(b).unusedTokens.push(f);j(b).charsLeftOver=i-k,h.length>0&&j(b).unusedInput.push(h),j(b).bigHour===!0&&b._a[yd]<=12&&b._a[yd]>0&&(j(b).bigHour=void 0),b._a[yd]=xa(b._locale,b._a[yd],b._meridiem),ua(b),da(b)}function xa(a,b,c){var d;return null==c?b:null!=a.meridiemHour?a.meridiemHour(b,c):null!=a.isPM?(d=a.isPM(c),d&&12>b&&(b+=12),d||12!==b||(b=0),b):b}function ya(a){var b,c,d,e,f;if(0===a._f.length)return j(a).invalidFormat=!0,void(a._d=new Date(NaN));for(e=0;e<a._f.length;e++)f=0,b=n({},a),null!=a._useUTC&&(b._useUTC=a._useUTC),b._f=a._f[e],wa(b),k(b)&&(f+=j(b).charsLeftOver,f+=10*j(b).unusedTokens.length,j(b).score=f,(null==d||d>f)&&(d=f,c=b));g(a,c||b)}function za(a){if(!a._d){var b=C(a._i);a._a=e([b.year,b.month,b.day||b.date,b.hour,b.minute,b.second,b.millisecond],function(a){return a&&parseInt(a,10)}),ua(a)}}function Aa(a){var b=new o(da(Ba(a)));return b._nextDay&&(b.add(1,\\\"d\\\"),b._nextDay=void 0),b}function Ba(a){var b=a._i,e=a._f;return a._locale=a._locale||z(a._l),null===b||void 0===e&&\\\"\\\"===b?l({nullInput:!0}):(\\\"string\\\"==typeof b&&(a._i=b=a._locale.preparse(b)),p(b)?new o(da(b)):(c(e)?ya(a):e?wa(a):d(b)?a._d=b:Ca(a),k(a)||(a._d=null),a))}function Ca(b){var f=b._i;void 0===f?b._d=new Date(a.now()):d(f)?b._d=new Date(+f):\\\"string\\\"==typeof f?ia(b):c(f)?(b._a=e(f.slice(0),function(a){return parseInt(a,10)}),ua(b)):\\\"object\\\"==typeof f?za(b):\\\"number\\\"==typeof f?b._d=new Date(f):a.createFromInputFallback(b)}function Da(a,b,c,d,e){var f={};return\\\"boolean\\\"==typeof c&&(d=c,c=void 0),f._isAMomentObject=!0,f._useUTC=f._isUTC=e,f._l=c,f._i=a,f._f=b,f._strict=d,Aa(f)}function Ea(a,b,c,d){return Da(a,b,c,d,!1)}function Fa(a,b){var d,e;if(1===b.length&&c(b[0])&&(b=b[0]),!b.length)return Ea();for(d=b[0],e=1;e<b.length;++e)(!b[e].isValid()||b[e][a](d))&&(d=b[e]);return d}function Ga(){var a=[].slice.call(arguments,0);return Fa(\\\"isBefore\\\",a)}function Ha(){var a=[].slice.call(arguments,0);return Fa(\\\"isAfter\\\",a)}function Ia(a){var b=C(a),c=b.year||0,d=b.quarter||0,e=b.month||0,f=b.week||0,g=b.day||0,h=b.hour||0,i=b.minute||0,j=b.second||0,k=b.millisecond||0;this._milliseconds=+k+1e3*j+6e4*i+36e5*h,this._days=+g+7*f,this._months=+e+3*d+12*c,this._data={},this._locale=z(),this._bubble()}function Ja(a){return a instanceof Ia}function Ka(a,b){J(a,0,0,function(){var a=this.utcOffset(),c=\\\"+\\\";return 0>a&&(a=-a,c=\\\"-\\\"),c+I(~~(a/60),2)+b+I(~~a%60,2)})}function La(a,b){var c=(b||\\\"\\\").match(a)||[],d=c[c.length-1]||[],e=(d+\\\"\\\").match(Ud)||[\\\"-\\\",0,0],f=+(60*e[1])+r(e[2]);return\\\"+\\\"===e[0]?f:-f}function Ma(b,c){var e,f;return c._isUTC?(e=c.clone(),f=(p(b)||d(b)?+b:+Ea(b))-+e,e._d.setTime(+e._d+f),a.updateOffset(e,!1),e):Ea(b).local()}function Na(a){return 15*-Math.round(a._d.getTimezoneOffset()/15)}function Oa(b,c){var d,e=this._offset||0;return this.isValid()?null!=b?(\\\"string\\\"==typeof b?b=La(qd,b):Math.abs(b)<16&&(b=60*b),!this._isUTC&&c&&(d=Na(this)),this._offset=b,this._isUTC=!0,null!=d&&this.add(d,\\\"m\\\"),e!==b&&(!c||this._changeInProgress?cb(this,Za(b-e,\\\"m\\\"),1,!1):this._changeInProgress||(this._changeInProgress=!0,a.updateOffset(this,!0),this._changeInProgress=null)),this):this._isUTC?e:Na(this):null!=b?this:NaN}function Pa(a,b){return null!=a?(\\\"string\\\"!=typeof a&&(a=-a),this.utcOffset(a,b),this):-this.utcOffset()}function Qa(a){return this.utcOffset(0,a)}function Ra(a){return this._isUTC&&(this.utcOffset(0,a),this._isUTC=!1,a&&this.subtract(Na(this),\\\"m\\\")),this}function Sa(){return this._tzm?this.utcOffset(this._tzm):\\\"string\\\"==typeof this._i&&this.utcOffset(La(pd,this._i)),this}function Ta(a){return this.isValid()?(a=a?Ea(a).utcOffset():0,(this.utcOffset()-a)%60===0):!1}function Ua(){return this.utcOffset()>this.clone().month(0).utcOffset()||this.utcOffset()>this.clone().month(5).utcOffset()}function Va(){if(!m(this._isDSTShifted))return this._isDSTShifted;var a={};if(n(a,this),a=Ba(a),a._a){var b=a._isUTC?h(a._a):Ea(a._a);this._isDSTShifted=this.isValid()&&s(a._a,b.toArray())>0}else this._isDSTShifted=!1;return this._isDSTShifted}function Wa(){return this.isValid()?!this._isUTC:!1}function Xa(){return this.isValid()?this._isUTC:!1}function Ya(){return this.isValid()?this._isUTC&&0===this._offset:!1}function Za(a,b){var c,d,e,g=a,h=null;return Ja(a)?g={ms:a._milliseconds,d:a._days,M:a._months}:\\\"number\\\"==typeof a?(g={},b?g[b]=a:g.milliseconds=a):(h=Vd.exec(a))?(c=\\\"-\\\"===h[1]?-1:1,g={y:0,d:r(h[xd])*c,h:r(h[yd])*c,m:r(h[zd])*c,s:r(h[Ad])*c,ms:r(h[Bd])*c}):(h=Wd.exec(a))?(c=\\\"-\\\"===h[1]?-1:1,g={y:$a(h[2],c),M:$a(h[3],c),d:$a(h[4],c),h:$a(h[5],c),m:$a(h[6],c),s:$a(h[7],c),w:$a(h[8],c)}):null==g?g={}:\\\"object\\\"==typeof g&&(\\\"from\\\"in g||\\\"to\\\"in g)&&(e=ab(Ea(g.from),Ea(g.to)),g={},g.ms=e.milliseconds,g.M=e.months),d=new Ia(g),Ja(a)&&f(a,\\\"_locale\\\")&&(d._locale=a._locale),d}function $a(a,b){var c=a&&parseFloat(a.replace(\\\",\\\",\\\".\\\"));return(isNaN(c)?0:c)*b}function _a(a,b){var c={milliseconds:0,months:0};return c.months=b.month()-a.month()+12*(b.year()-a.year()),a.clone().add(c.months,\\\"M\\\").isAfter(b)&&--c.months,c.milliseconds=+b-+a.clone().add(c.months,\\\"M\\\"),c}function ab(a,b){var c;return a.isValid()&&b.isValid()?(b=Ma(b,a),a.isBefore(b)?c=_a(a,b):(c=_a(b,a),c.milliseconds=-c.milliseconds,c.months=-c.months),c):{milliseconds:0,months:0}}function bb(a,b){return function(c,d){var e,f;return null===d||isNaN(+d)||(ga(b,\\\"moment().\\\"+b+\\\"(period, number) is deprecated. Please use moment().\\\"+b+\\\"(number, period).\\\"),f=c,c=d,d=f),c=\\\"string\\\"==typeof c?+c:c,e=Za(c,d),cb(this,e,a),this}}function cb(b,c,d,e){var f=c._milliseconds,g=c._days,h=c._months;b.isValid()&&(e=null==e?!0:e,f&&b._d.setTime(+b._d+f*d),g&&G(b,\\\"Date\\\",F(b,\\\"Date\\\")+g*d),h&&Z(b,F(b,\\\"Month\\\")+h*d),e&&a.updateOffset(b,g||h))}function db(a,b){var c=a||Ea(),d=Ma(c,this).startOf(\\\"day\\\"),e=this.diff(d,\\\"days\\\",!0),f=-6>e?\\\"sameElse\\\":-1>e?\\\"lastWeek\\\":0>e?\\\"lastDay\\\":1>e?\\\"sameDay\\\":2>e?\\\"nextDay\\\":7>e?\\\"nextWeek\\\":\\\"sameElse\\\",g=b&&(D(b[f])?b[f]():b[f]);return this.format(g||this.localeData().calendar(f,this,Ea(c)))}function eb(){return new o(this)}function fb(a,b){var c=p(a)?a:Ea(a);return this.isValid()&&c.isValid()?(b=B(m(b)?\\\"millisecond\\\":b),\\\"millisecond\\\"===b?+this>+c:+c<+this.clone().startOf(b)):!1}function gb(a,b){var c=p(a)?a:Ea(a);return this.isValid()&&c.isValid()?(b=B(m(b)?\\\"millisecond\\\":b),\\\"millisecond\\\"===b?+c>+this:+this.clone().endOf(b)<+c):!1}function hb(a,b,c){return this.isAfter(a,c)&&this.isBefore(b,c)}function ib(a,b){var c,d=p(a)?a:Ea(a);return this.isValid()&&d.isValid()?(b=B(b||\\\"millisecond\\\"),\\\"millisecond\\\"===b?+this===+d:(c=+d,+this.clone().startOf(b)<=c&&c<=+this.clone().endOf(b))):!1}function jb(a,b){return this.isSame(a,b)||this.isAfter(a,b)}function kb(a,b){return this.isSame(a,b)||this.isBefore(a,b)}function lb(a,b,c){var d,e,f,g;return this.isValid()?(d=Ma(a,this),d.isValid()?(e=6e4*(d.utcOffset()-this.utcOffset()),b=B(b),\\\"year\\\"===b||\\\"month\\\"===b||\\\"quarter\\\"===b?(g=mb(this,d),\\\"quarter\\\"===b?g/=3:\\\"year\\\"===b&&(g/=12)):(f=this-d,g=\\\"second\\\"===b?f/1e3:\\\"minute\\\"===b?f/6e4:\\\"hour\\\"===b?f/36e5:\\\"day\\\"===b?(f-e)/864e5:\\\"week\\\"===b?(f-e)/6048e5:f),c?g:q(g)):NaN):NaN}function mb(a,b){var c,d,e=12*(b.year()-a.year())+(b.month()-a.month()),f=a.clone().add(e,\\\"months\\\");return 0>b-f?(c=a.clone().add(e-1,\\\"months\\\"),d=(b-f)/(f-c)):(c=a.clone().add(e+1,\\\"months\\\"),d=(b-f)/(c-f)),-(e+d)}function nb(){return this.clone().locale(\\\"en\\\").format(\\\"ddd MMM DD YYYY HH:mm:ss [GMT]ZZ\\\")}function ob(){var a=this.clone().utc();return 0<a.year()&&a.year()<=9999?D(Date.prototype.toISOString)?this.toDate().toISOString():M(a,\\\"YYYY-MM-DD[T]HH:mm:ss.SSS[Z]\\\"):M(a,\\\"YYYYYY-MM-DD[T]HH:mm:ss.SSS[Z]\\\")}function pb(b){var c=M(this,b||a.defaultFormat);return this.localeData().postformat(c)}function qb(a,b){return this.isValid()&&(p(a)&&a.isValid()||Ea(a).isValid())?Za({to:this,from:a}).locale(this.locale()).humanize(!b):this.localeData().invalidDate()}function rb(a){return this.from(Ea(),a)}function sb(a,b){return this.isValid()&&(p(a)&&a.isValid()||Ea(a).isValid())?Za({from:this,to:a}).locale(this.locale()).humanize(!b):this.localeData().invalidDate()}function tb(a){return this.to(Ea(),a)}function ub(a){var b;return void 0===a?this._locale._abbr:(b=z(a),null!=b&&(this._locale=b),this)}function vb(){return this._locale}function wb(a){switch(a=B(a)){case\\\"year\\\":this.month(0);case\\\"quarter\\\":case\\\"month\\\":this.date(1);case\\\"week\\\":case\\\"isoWeek\\\":case\\\"day\\\":this.hours(0);case\\\"hour\\\":this.minutes(0);case\\\"minute\\\":this.seconds(0);case\\\"second\\\":this.milliseconds(0)}return\\\"week\\\"===a&&this.weekday(0),\\\"isoWeek\\\"===a&&this.isoWeekday(1),\\\"quarter\\\"===a&&this.month(3*Math.floor(this.month()/3)),this}function xb(a){return a=B(a),void 0===a||\\\"millisecond\\\"===a?this:this.startOf(a).add(1,\\\"isoWeek\\\"===a?\\\"week\\\":a).subtract(1,\\\"ms\\\")}function yb(){return+this._d-6e4*(this._offset||0)}function zb(){return Math.floor(+this/1e3)}function Ab(){return this._offset?new Date(+this):this._d}function Bb(){var a=this;return[a.year(),a.month(),a.date(),a.hour(),a.minute(),a.second(),a.millisecond()]}function Cb(){var a=this;return{years:a.year(),months:a.month(),date:a.date(),hours:a.hours(),minutes:a.minutes(),seconds:a.seconds(),milliseconds:a.milliseconds()}}function Db(){return this.isValid()?this.toISOString():\\\"null\\\"}function Eb(){return k(this)}function Fb(){return g({},j(this))}function Gb(){return j(this).overflow}function Hb(){return{input:this._i,format:this._f,locale:this._locale,isUTC:this._isUTC,strict:this._strict}}function Ib(a,b){J(0,[a,a.length],0,b)}function Jb(a){return Nb.call(this,a,this.week(),this.weekday(),this.localeData()._week.dow,this.localeData()._week.doy)}function Kb(a){return Nb.call(this,a,this.isoWeek(),this.isoWeekday(),1,4)}function Lb(){return ra(this.year(),1,4)}function Mb(){var a=this.localeData()._week;return ra(this.year(),a.dow,a.doy)}function Nb(a,b,c,d,e){var f;return null==a?qa(this,d,e).year:(f=ra(a,d,e),b>f&&(b=f),Ob.call(this,a,b,c,d,e))}function Ob(a,b,c,d,e){var f=pa(a,b,c,d,e),g=ka(f.year,0,f.dayOfYear);return this.year(g.getUTCFullYear()),this.month(g.getUTCMonth()),this.date(g.getUTCDate()),this}function Pb(a){return null==a?Math.ceil((this.month()+1)/3):this.month(3*(a-1)+this.month()%3)}function Qb(a){return qa(a,this._week.dow,this._week.doy).week}function Rb(){return this._week.dow}function Sb(){return this._week.doy}function Tb(a){var b=this.localeData().week(this);return null==a?b:this.add(7*(a-b),\\\"d\\\")}function Ub(a){var b=qa(this,1,4).week;return null==a?b:this.add(7*(a-b),\\\"d\\\")}function Vb(a,b){return\\\"string\\\"!=typeof a?a:isNaN(a)?(a=b.weekdaysParse(a),\\\"number\\\"==typeof a?a:null):parseInt(a,10)}function Wb(a,b){return c(this._weekdays)?this._weekdays[a.day()]:this._weekdays[this._weekdays.isFormat.test(b)?\\\"format\\\":\\\"standalone\\\"][a.day()]}function Xb(a){return this._weekdaysShort[a.day()]}function Yb(a){return this._weekdaysMin[a.day()]}function Zb(a,b,c){var d,e,f;for(this._weekdaysParse||(this._weekdaysParse=[],this._minWeekdaysParse=[],this._shortWeekdaysParse=[],this._fullWeekdaysParse=[]),d=0;7>d;d++){if(e=Ea([2e3,1]).day(d),c&&!this._fullWeekdaysParse[d]&&(this._fullWeekdaysParse[d]=new RegExp(\\\"^\\\"+this.weekdays(e,\\\"\\\").replace(\\\".\\\",\\\".?\\\")+\\\"$\\\",\\\"i\\\"),this._shortWeekdaysParse[d]=new RegExp(\\\"^\\\"+this.weekdaysShort(e,\\\"\\\").replace(\\\".\\\",\\\".?\\\")+\\\"$\\\",\\\"i\\\"),this._minWeekdaysParse[d]=new RegExp(\\\"^\\\"+this.weekdaysMin(e,\\\"\\\").replace(\\\".\\\",\\\".?\\\")+\\\"$\\\",\\\"i\\\")),this._weekdaysParse[d]||(f=\\\"^\\\"+this.weekdays(e,\\\"\\\")+\\\"|^\\\"+this.weekdaysShort(e,\\\"\\\")+\\\"|^\\\"+this.weekdaysMin(e,\\\"\\\"),this._weekdaysParse[d]=new RegExp(f.replace(\\\".\\\",\\\"\\\"),\\\"i\\\")),c&&\\\"dddd\\\"===b&&this._fullWeekdaysParse[d].test(a))return d;if(c&&\\\"ddd\\\"===b&&this._shortWeekdaysParse[d].test(a))return d;if(c&&\\\"dd\\\"===b&&this._minWeekdaysParse[d].test(a))return d;if(!c&&this._weekdaysParse[d].test(a))return d}}function $b(a){if(!this.isValid())return null!=a?this:NaN;var b=this._isUTC?this._d.getUTCDay():this._d.getDay();return null!=a?(a=Vb(a,this.localeData()),this.add(a-b,\\\"d\\\")):b}function _b(a){if(!this.isValid())return null!=a?this:NaN;var b=(this.day()+7-this.localeData()._week.dow)%7;return null==a?b:this.add(a-b,\\\"d\\\")}function ac(a){return this.isValid()?null==a?this.day()||7:this.day(this.day()%7?a:a-7):null!=a?this:NaN}function bc(a){var b=Math.round((this.clone().startOf(\\\"day\\\")-this.clone().startOf(\\\"year\\\"))/864e5)+1;return null==a?b:this.add(a-b,\\\"d\\\")}function cc(){return this.hours()%12||12}function dc(a,b){J(a,0,0,function(){return this.localeData().meridiem(this.hours(),this.minutes(),b)})}function ec(a,b){return b._meridiemParse}function fc(a){return\\\"p\\\"===(a+\\\"\\\").toLowerCase().charAt(0)}function gc(a,b,c){return a>11?c?\\\"pm\\\":\\\"PM\\\":c?\\\"am\\\":\\\"AM\\\"}function hc(a,b){b[Bd]=r(1e3*(\\\"0.\\\"+a))}function ic(){return this._isUTC?\\\"UTC\\\":\\\"\\\"}function jc(){return this._isUTC?\\\"Coordinated Universal Time\\\":\\\"\\\"}function kc(a){return Ea(1e3*a)}function lc(){return Ea.apply(null,arguments).parseZone()}function mc(a,b,c){var d=this._calendar[a];return D(d)?d.call(b,c):d}function nc(a){var b=this._longDateFormat[a],c=this._longDateFormat[a.toUpperCase()];return b||!c?b:(this._longDateFormat[a]=c.replace(/MMMM|MM|DD|dddd/g,function(a){return a.slice(1)}),this._longDateFormat[a])}function oc(){return this._invalidDate}function pc(a){return this._ordinal.replace(\\\"%d\\\",a)}function qc(a){return a}function rc(a,b,c,d){var e=this._relativeTime[c];return D(e)?e(a,b,c,d):e.replace(/%d/i,a)}function sc(a,b){var c=this._relativeTime[a>0?\\\"future\\\":\\\"past\\\"];return D(c)?c(b):c.replace(/%s/i,b)}function tc(a){var b,c;for(c in a)b=a[c],D(b)?this[c]=b:this[\\\"_\\\"+c]=b;this._ordinalParseLenient=new RegExp(this._ordinalParse.source+\\\"|\\\"+/\\\\d{1,2}/.source)}function uc(a,b,c,d){var e=z(),f=h().set(d,b);return e[c](f,a)}function vc(a,b,c,d,e){if(\\\"number\\\"==typeof a&&(b=a,a=void 0),a=a||\\\"\\\",null!=b)return uc(a,b,c,e);var f,g=[];for(f=0;d>f;f++)g[f]=uc(a,f,c,e);return g}function wc(a,b){return vc(a,b,\\\"months\\\",12,\\\"month\\\")}function xc(a,b){return vc(a,b,\\\"monthsShort\\\",12,\\\"month\\\")}function yc(a,b){return vc(a,b,\\\"weekdays\\\",7,\\\"day\\\")}function zc(a,b){return vc(a,b,\\\"weekdaysShort\\\",7,\\\"day\\\")}function Ac(a,b){return vc(a,b,\\\"weekdaysMin\\\",7,\\\"day\\\")}function Bc(){var a=this._data;return this._milliseconds=se(this._milliseconds),this._days=se(this._days),this._months=se(this._months),a.milliseconds=se(a.milliseconds),a.seconds=se(a.seconds),a.minutes=se(a.minutes),a.hours=se(a.hours),a.months=se(a.months),a.years=se(a.years),this}function Cc(a,b,c,d){var e=Za(b,c);return a._milliseconds+=d*e._milliseconds,a._days+=d*e._days,a._months+=d*e._months,a._bubble()}function Dc(a,b){return Cc(this,a,b,1)}function Ec(a,b){return Cc(this,a,b,-1)}function Fc(a){return 0>a?Math.floor(a):Math.ceil(a)}function Gc(){var a,b,c,d,e,f=this._milliseconds,g=this._days,h=this._months,i=this._data;return f>=0&&g>=0&&h>=0||0>=f&&0>=g&&0>=h||(f+=864e5*Fc(Ic(h)+g),g=0,h=0),i.milliseconds=f%1e3,a=q(f/1e3),i.seconds=a%60,b=q(a/60),i.minutes=b%60,c=q(b/60),i.hours=c%24,g+=q(c/24),e=q(Hc(g)),h+=e,g-=Fc(Ic(e)),d=q(h/12),h%=12,i.days=g,i.months=h,i.years=d,this}function Hc(a){return 4800*a/146097}function Ic(a){return 146097*a/4800}function Jc(a){var b,c,d=this._milliseconds;if(a=B(a),\\\"month\\\"===a||\\\"year\\\"===a)return b=this._days+d/864e5,c=this._months+Hc(b),\\\"month\\\"===a?c:c/12;switch(b=this._days+Math.round(Ic(this._months)),a){case\\\"week\\\":return b/7+d/6048e5;case\\\"day\\\":return b+d/864e5;case\\\"hour\\\":return 24*b+d/36e5;case\\\"minute\\\":return 1440*b+d/6e4;case\\\"second\\\":return 86400*b+d/1e3;case\\\"millisecond\\\":return Math.floor(864e5*b)+d;default:throw new Error(\\\"Unknown unit \\\"+a)}}function Kc(){return this._milliseconds+864e5*this._days+this._months%12*2592e6+31536e6*r(this._months/12)}function Lc(a){return function(){return this.as(a)}}function Mc(a){return a=B(a),this[a+\\\"s\\\"]()}function Nc(a){return function(){return this._data[a]}}function Oc(){return q(this.days()/7)}function Pc(a,b,c,d,e){return e.relativeTime(b||1,!!c,a,d)}function Qc(a,b,c){var d=Za(a).abs(),e=Ie(d.as(\\\"s\\\")),f=Ie(d.as(\\\"m\\\")),g=Ie(d.as(\\\"h\\\")),h=Ie(d.as(\\\"d\\\")),i=Ie(d.as(\\\"M\\\")),j=Ie(d.as(\\\"y\\\")),k=e<Je.s&&[\\\"s\\\",e]||1>=f&&[\\\"m\\\"]||f<Je.m&&[\\\"mm\\\",f]||1>=g&&[\\\"h\\\"]||g<Je.h&&[\\\"hh\\\",g]||1>=h&&[\\\"d\\\"]||h<Je.d&&[\\\"dd\\\",h]||1>=i&&[\\\"M\\\"]||i<Je.M&&[\\\"MM\\\",i]||1>=j&&[\\\"y\\\"]||[\\\"yy\\\",j];return k[2]=b,k[3]=+a>0,k[4]=c,Pc.apply(null,k)}function Rc(a,b){return void 0===Je[a]?!1:void 0===b?Je[a]:(Je[a]=b,!0)}function Sc(a){var b=this.localeData(),c=Qc(this,!a,b);return a&&(c=b.pastFuture(+this,c)),b.postformat(c)}function Tc(){var a,b,c,d=Ke(this._milliseconds)/1e3,e=Ke(this._days),f=Ke(this._months);a=q(d/60),b=q(a/60),d%=60,a%=60,c=q(f/12),f%=12;var g=c,h=f,i=e,j=b,k=a,l=d,m=this.asSeconds();return m?(0>m?\\\"-\\\":\\\"\\\")+\\\"P\\\"+(g?g+\\\"Y\\\":\\\"\\\")+(h?h+\\\"M\\\":\\\"\\\")+(i?i+\\\"D\\\":\\\"\\\")+(j||k||l?\\\"T\\\":\\\"\\\")+(j?j+\\\"H\\\":\\\"\\\")+(k?k+\\\"M\\\":\\\"\\\")+(l?l+\\\"S\\\":\\\"\\\"):\\\"P0D\\\"}var Uc,Vc,Wc=a.momentProperties=[],Xc=!1,Yc={},Zc={},$c=/(\\\\[[^\\\\[]*\\\\])|(\\\\\\\\)?([Hh]mm(ss)?|Mo|MM?M?M?|Do|DDDo|DD?D?D?|ddd?d?|do?|w[o|w]?|W[o|W]?|Qo?|YYYYYY|YYYYY|YYYY|YY|gg(ggg?)?|GG(GGG?)?|e|E|a|A|hh?|HH?|mm?|ss?|S{1,9}|x|X|zz?|ZZ?|.)/g,_c=/(\\\\[[^\\\\[]*\\\\])|(\\\\\\\\)?(LTS|LT|LL?L?L?|l{1,4})/g,ad={},bd={},cd=/\\\\d/,dd=/\\\\d\\\\d/,ed=/\\\\d{3}/,fd=/\\\\d{4}/,gd=/[+-]?\\\\d{6}/,hd=/\\\\d\\\\d?/,id=/\\\\d\\\\d\\\\d\\\\d?/,jd=/\\\\d\\\\d\\\\d\\\\d\\\\d\\\\d?/,kd=/\\\\d{1,3}/,ld=/\\\\d{1,4}/,md=/[+-]?\\\\d{1,6}/,nd=/\\\\d+/,od=/[+-]?\\\\d+/,pd=/Z|[+-]\\\\d\\\\d:?\\\\d\\\\d/gi,qd=/Z|[+-]\\\\d\\\\d(?::?\\\\d\\\\d)?/gi,rd=/[+-]?\\\\d+(\\\\.\\\\d{1,3})?/,sd=/[0-9]*['a-z\\\\u00A0-\\\\u05FF\\\\u0700-\\\\uD7FF\\\\uF900-\\\\uFDCF\\\\uFDF0-\\\\uFFEF]+|[\\\\u0600-\\\\u06FF\\\\/]+(\\\\s*?[\\\\u0600-\\\\u06FF]+){1,2}/i,td={},ud={},vd=0,wd=1,xd=2,yd=3,zd=4,Ad=5,Bd=6,Cd=7,Dd=8;J(\\\"M\\\",[\\\"MM\\\",2],\\\"Mo\\\",function(){return this.month()+1}),J(\\\"MMM\\\",0,0,function(a){return this.localeData().monthsShort(this,a)}),J(\\\"MMMM\\\",0,0,function(a){return this.localeData().months(this,a)}),A(\\\"month\\\",\\\"M\\\"),O(\\\"M\\\",hd),O(\\\"MM\\\",hd,dd),O(\\\"MMM\\\",function(a,b){return b.monthsShortRegex(a)}),O(\\\"MMMM\\\",function(a,b){return b.monthsRegex(a)}),S([\\\"M\\\",\\\"MM\\\"],function(a,b){b[wd]=r(a)-1}),S([\\\"MMM\\\",\\\"MMMM\\\"],function(a,b,c,d){var e=c._locale.monthsParse(a,d,c._strict);null!=e?b[wd]=e:j(c).invalidMonth=a});var Ed=/D[oD]?(\\\\[[^\\\\[\\\\]]*\\\\]|\\\\s+)+MMMM?/,Fd=\\\"January_February_March_April_May_June_July_August_September_October_November_December\\\".split(\\\"_\\\"),Gd=\\\"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec\\\".split(\\\"_\\\"),Hd=sd,Id=sd,Jd={};a.suppressDeprecationWarnings=!1;var Kd=/^\\\\s*((?:[+-]\\\\d{6}|\\\\d{4})-(?:\\\\d\\\\d-\\\\d\\\\d|W\\\\d\\\\d-\\\\d|W\\\\d\\\\d|\\\\d\\\\d\\\\d|\\\\d\\\\d))(?:(T| )(\\\\d\\\\d(?::\\\\d\\\\d(?::\\\\d\\\\d(?:[.,]\\\\d+)?)?)?)([\\\\+\\\\-]\\\\d\\\\d(?::?\\\\d\\\\d)?|\\\\s*Z)?)?/,Ld=/^\\\\s*((?:[+-]\\\\d{6}|\\\\d{4})(?:\\\\d\\\\d\\\\d\\\\d|W\\\\d\\\\d\\\\d|W\\\\d\\\\d|\\\\d\\\\d\\\\d|\\\\d\\\\d))(?:(T| )(\\\\d\\\\d(?:\\\\d\\\\d(?:\\\\d\\\\d(?:[.,]\\\\d+)?)?)?)([\\\\+\\\\-]\\\\d\\\\d(?::?\\\\d\\\\d)?|\\\\s*Z)?)?/,Md=/Z|[+-]\\\\d\\\\d(?::?\\\\d\\\\d)?/,Nd=[[\\\"YYYYYY-MM-DD\\\",/[+-]\\\\d{6}-\\\\d\\\\d-\\\\d\\\\d/],[\\\"YYYY-MM-DD\\\",/\\\\d{4}-\\\\d\\\\d-\\\\d\\\\d/],[\\\"GGGG-[W]WW-E\\\",/\\\\d{4}-W\\\\d\\\\d-\\\\d/],[\\\"GGGG-[W]WW\\\",/\\\\d{4}-W\\\\d\\\\d/,!1],[\\\"YYYY-DDD\\\",/\\\\d{4}-\\\\d{3}/],[\\\"YYYY-MM\\\",/\\\\d{4}-\\\\d\\\\d/,!1],[\\\"YYYYYYMMDD\\\",/[+-]\\\\d{10}/],[\\\"YYYYMMDD\\\",/\\\\d{8}/],[\\\"GGGG[W]WWE\\\",/\\\\d{4}W\\\\d{3}/],[\\\"GGGG[W]WW\\\",/\\\\d{4}W\\\\d{2}/,!1],[\\\"YYYYDDD\\\",/\\\\d{7}/]],Od=[[\\\"HH:mm:ss.SSSS\\\",/\\\\d\\\\d:\\\\d\\\\d:\\\\d\\\\d\\\\.\\\\d+/],[\\\"HH:mm:ss,SSSS\\\",/\\\\d\\\\d:\\\\d\\\\d:\\\\d\\\\d,\\\\d+/],[\\\"HH:mm:ss\\\",/\\\\d\\\\d:\\\\d\\\\d:\\\\d\\\\d/],[\\\"HH:mm\\\",/\\\\d\\\\d:\\\\d\\\\d/],[\\\"HHmmss.SSSS\\\",/\\\\d\\\\d\\\\d\\\\d\\\\d\\\\d\\\\.\\\\d+/],[\\\"HHmmss,SSSS\\\",/\\\\d\\\\d\\\\d\\\\d\\\\d\\\\d,\\\\d+/],[\\\"HHmmss\\\",/\\\\d\\\\d\\\\d\\\\d\\\\d\\\\d/],[\\\"HHmm\\\",/\\\\d\\\\d\\\\d\\\\d/],[\\\"HH\\\",/\\\\d\\\\d/]],Pd=/^\\\\/?Date\\\\((\\\\-?\\\\d+)/i;a.createFromInputFallback=fa(\\\"moment construction falls back to js Date. This is discouraged and will be removed in upcoming major release. Please refer to https://github.com/moment/moment/issues/1407 for more info.\\\",function(a){a._d=new Date(a._i+(a._useUTC?\\\" UTC\\\":\\\"\\\"))}),J(\\\"Y\\\",0,0,function(){var a=this.year();return 9999>=a?\\\"\\\"+a:\\\"+\\\"+a}),J(0,[\\\"YY\\\",2],0,function(){return this.year()%100}),J(0,[\\\"YYYY\\\",4],0,\\\"year\\\"),J(0,[\\\"YYYYY\\\",5],0,\\\"year\\\"),J(0,[\\\"YYYYYY\\\",6,!0],0,\\\"year\\\"),A(\\\"year\\\",\\\"y\\\"),O(\\\"Y\\\",od),O(\\\"YY\\\",hd,dd),O(\\\"YYYY\\\",ld,fd),O(\\\"YYYYY\\\",md,gd),O(\\\"YYYYYY\\\",md,gd),S([\\\"YYYYY\\\",\\\"YYYYYY\\\"],vd),S(\\\"YYYY\\\",function(b,c){c[vd]=2===b.length?a.parseTwoDigitYear(b):r(b)}),S(\\\"YY\\\",function(b,c){c[vd]=a.parseTwoDigitYear(b)}),S(\\\"Y\\\",function(a,b){b[vd]=parseInt(a,10)}),a.parseTwoDigitYear=function(a){return r(a)+(r(a)>68?1900:2e3)};var Qd=E(\\\"FullYear\\\",!1);a.ISO_8601=function(){};var Rd=fa(\\\"moment().min is deprecated, use moment.min instead. https://github.com/moment/moment/issues/1548\\\",function(){var a=Ea.apply(null,arguments);return this.isValid()&&a.isValid()?this>a?this:a:l()}),Sd=fa(\\\"moment().max is deprecated, use moment.max instead. https://github.com/moment/moment/issues/1548\\\",function(){var a=Ea.apply(null,arguments);return this.isValid()&&a.isValid()?a>this?this:a:l()}),Td=function(){return Date.now?Date.now():+new Date};Ka(\\\"Z\\\",\\\":\\\"),Ka(\\\"ZZ\\\",\\\"\\\"),O(\\\"Z\\\",qd),O(\\\"ZZ\\\",qd),S([\\\"Z\\\",\\\"ZZ\\\"],function(a,b,c){c._useUTC=!0,c._tzm=La(qd,a)});var Ud=/([\\\\+\\\\-]|\\\\d\\\\d)/gi;a.updateOffset=function(){};var Vd=/(\\\\-)?(?:(\\\\d*)[. ])?(\\\\d+)\\\\:(\\\\d+)(?:\\\\:(\\\\d+)\\\\.?(\\\\d{3})?)?/,Wd=/^(-)?P(?:(?:([0-9,.]*)Y)?(?:([0-9,.]*)M)?(?:([0-9,.]*)D)?(?:T(?:([0-9,.]*)H)?(?:([0-9,.]*)M)?(?:([0-9,.]*)S)?)?|([0-9,.]*)W)$/;\\nZa.fn=Ia.prototype;var Xd=bb(1,\\\"add\\\"),Yd=bb(-1,\\\"subtract\\\");a.defaultFormat=\\\"YYYY-MM-DDTHH:mm:ssZ\\\";var Zd=fa(\\\"moment().lang() is deprecated. Instead, use moment().localeData() to get the language configuration. Use moment().locale() to change languages.\\\",function(a){return void 0===a?this.localeData():this.locale(a)});J(0,[\\\"gg\\\",2],0,function(){return this.weekYear()%100}),J(0,[\\\"GG\\\",2],0,function(){return this.isoWeekYear()%100}),Ib(\\\"gggg\\\",\\\"weekYear\\\"),Ib(\\\"ggggg\\\",\\\"weekYear\\\"),Ib(\\\"GGGG\\\",\\\"isoWeekYear\\\"),Ib(\\\"GGGGG\\\",\\\"isoWeekYear\\\"),A(\\\"weekYear\\\",\\\"gg\\\"),A(\\\"isoWeekYear\\\",\\\"GG\\\"),O(\\\"G\\\",od),O(\\\"g\\\",od),O(\\\"GG\\\",hd,dd),O(\\\"gg\\\",hd,dd),O(\\\"GGGG\\\",ld,fd),O(\\\"gggg\\\",ld,fd),O(\\\"GGGGG\\\",md,gd),O(\\\"ggggg\\\",md,gd),T([\\\"gggg\\\",\\\"ggggg\\\",\\\"GGGG\\\",\\\"GGGGG\\\"],function(a,b,c,d){b[d.substr(0,2)]=r(a)}),T([\\\"gg\\\",\\\"GG\\\"],function(b,c,d,e){c[e]=a.parseTwoDigitYear(b)}),J(\\\"Q\\\",0,\\\"Qo\\\",\\\"quarter\\\"),A(\\\"quarter\\\",\\\"Q\\\"),O(\\\"Q\\\",cd),S(\\\"Q\\\",function(a,b){b[wd]=3*(r(a)-1)}),J(\\\"w\\\",[\\\"ww\\\",2],\\\"wo\\\",\\\"week\\\"),J(\\\"W\\\",[\\\"WW\\\",2],\\\"Wo\\\",\\\"isoWeek\\\"),A(\\\"week\\\",\\\"w\\\"),A(\\\"isoWeek\\\",\\\"W\\\"),O(\\\"w\\\",hd),O(\\\"ww\\\",hd,dd),O(\\\"W\\\",hd),O(\\\"WW\\\",hd,dd),T([\\\"w\\\",\\\"ww\\\",\\\"W\\\",\\\"WW\\\"],function(a,b,c,d){b[d.substr(0,1)]=r(a)});var $d={dow:0,doy:6};J(\\\"D\\\",[\\\"DD\\\",2],\\\"Do\\\",\\\"date\\\"),A(\\\"date\\\",\\\"D\\\"),O(\\\"D\\\",hd),O(\\\"DD\\\",hd,dd),O(\\\"Do\\\",function(a,b){return a?b._ordinalParse:b._ordinalParseLenient}),S([\\\"D\\\",\\\"DD\\\"],xd),S(\\\"Do\\\",function(a,b){b[xd]=r(a.match(hd)[0],10)});var _d=E(\\\"Date\\\",!0);J(\\\"d\\\",0,\\\"do\\\",\\\"day\\\"),J(\\\"dd\\\",0,0,function(a){return this.localeData().weekdaysMin(this,a)}),J(\\\"ddd\\\",0,0,function(a){return this.localeData().weekdaysShort(this,a)}),J(\\\"dddd\\\",0,0,function(a){return this.localeData().weekdays(this,a)}),J(\\\"e\\\",0,0,\\\"weekday\\\"),J(\\\"E\\\",0,0,\\\"isoWeekday\\\"),A(\\\"day\\\",\\\"d\\\"),A(\\\"weekday\\\",\\\"e\\\"),A(\\\"isoWeekday\\\",\\\"E\\\"),O(\\\"d\\\",hd),O(\\\"e\\\",hd),O(\\\"E\\\",hd),O(\\\"dd\\\",sd),O(\\\"ddd\\\",sd),O(\\\"dddd\\\",sd),T([\\\"dd\\\",\\\"ddd\\\",\\\"dddd\\\"],function(a,b,c,d){var e=c._locale.weekdaysParse(a,d,c._strict);null!=e?b.d=e:j(c).invalidWeekday=a}),T([\\\"d\\\",\\\"e\\\",\\\"E\\\"],function(a,b,c,d){b[d]=r(a)});var ae=\\\"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday\\\".split(\\\"_\\\"),be=\\\"Sun_Mon_Tue_Wed_Thu_Fri_Sat\\\".split(\\\"_\\\"),ce=\\\"Su_Mo_Tu_We_Th_Fr_Sa\\\".split(\\\"_\\\");J(\\\"DDD\\\",[\\\"DDDD\\\",3],\\\"DDDo\\\",\\\"dayOfYear\\\"),A(\\\"dayOfYear\\\",\\\"DDD\\\"),O(\\\"DDD\\\",kd),O(\\\"DDDD\\\",ed),S([\\\"DDD\\\",\\\"DDDD\\\"],function(a,b,c){c._dayOfYear=r(a)}),J(\\\"H\\\",[\\\"HH\\\",2],0,\\\"hour\\\"),J(\\\"h\\\",[\\\"hh\\\",2],0,cc),J(\\\"hmm\\\",0,0,function(){return\\\"\\\"+cc.apply(this)+I(this.minutes(),2)}),J(\\\"hmmss\\\",0,0,function(){return\\\"\\\"+cc.apply(this)+I(this.minutes(),2)+I(this.seconds(),2)}),J(\\\"Hmm\\\",0,0,function(){return\\\"\\\"+this.hours()+I(this.minutes(),2)}),J(\\\"Hmmss\\\",0,0,function(){return\\\"\\\"+this.hours()+I(this.minutes(),2)+I(this.seconds(),2)}),dc(\\\"a\\\",!0),dc(\\\"A\\\",!1),A(\\\"hour\\\",\\\"h\\\"),O(\\\"a\\\",ec),O(\\\"A\\\",ec),O(\\\"H\\\",hd),O(\\\"h\\\",hd),O(\\\"HH\\\",hd,dd),O(\\\"hh\\\",hd,dd),O(\\\"hmm\\\",id),O(\\\"hmmss\\\",jd),O(\\\"Hmm\\\",id),O(\\\"Hmmss\\\",jd),S([\\\"H\\\",\\\"HH\\\"],yd),S([\\\"a\\\",\\\"A\\\"],function(a,b,c){c._isPm=c._locale.isPM(a),c._meridiem=a}),S([\\\"h\\\",\\\"hh\\\"],function(a,b,c){b[yd]=r(a),j(c).bigHour=!0}),S(\\\"hmm\\\",function(a,b,c){var d=a.length-2;b[yd]=r(a.substr(0,d)),b[zd]=r(a.substr(d)),j(c).bigHour=!0}),S(\\\"hmmss\\\",function(a,b,c){var d=a.length-4,e=a.length-2;b[yd]=r(a.substr(0,d)),b[zd]=r(a.substr(d,2)),b[Ad]=r(a.substr(e)),j(c).bigHour=!0}),S(\\\"Hmm\\\",function(a,b,c){var d=a.length-2;b[yd]=r(a.substr(0,d)),b[zd]=r(a.substr(d))}),S(\\\"Hmmss\\\",function(a,b,c){var d=a.length-4,e=a.length-2;b[yd]=r(a.substr(0,d)),b[zd]=r(a.substr(d,2)),b[Ad]=r(a.substr(e))});var de=/[ap]\\\\.?m?\\\\.?/i,ee=E(\\\"Hours\\\",!0);J(\\\"m\\\",[\\\"mm\\\",2],0,\\\"minute\\\"),A(\\\"minute\\\",\\\"m\\\"),O(\\\"m\\\",hd),O(\\\"mm\\\",hd,dd),S([\\\"m\\\",\\\"mm\\\"],zd);var fe=E(\\\"Minutes\\\",!1);J(\\\"s\\\",[\\\"ss\\\",2],0,\\\"second\\\"),A(\\\"second\\\",\\\"s\\\"),O(\\\"s\\\",hd),O(\\\"ss\\\",hd,dd),S([\\\"s\\\",\\\"ss\\\"],Ad);var ge=E(\\\"Seconds\\\",!1);J(\\\"S\\\",0,0,function(){return~~(this.millisecond()/100)}),J(0,[\\\"SS\\\",2],0,function(){return~~(this.millisecond()/10)}),J(0,[\\\"SSS\\\",3],0,\\\"millisecond\\\"),J(0,[\\\"SSSS\\\",4],0,function(){return 10*this.millisecond()}),J(0,[\\\"SSSSS\\\",5],0,function(){return 100*this.millisecond()}),J(0,[\\\"SSSSSS\\\",6],0,function(){return 1e3*this.millisecond()}),J(0,[\\\"SSSSSSS\\\",7],0,function(){return 1e4*this.millisecond()}),J(0,[\\\"SSSSSSSS\\\",8],0,function(){return 1e5*this.millisecond()}),J(0,[\\\"SSSSSSSSS\\\",9],0,function(){return 1e6*this.millisecond()}),A(\\\"millisecond\\\",\\\"ms\\\"),O(\\\"S\\\",kd,cd),O(\\\"SS\\\",kd,dd),O(\\\"SSS\\\",kd,ed);var he;for(he=\\\"SSSS\\\";he.length<=9;he+=\\\"S\\\")O(he,nd);for(he=\\\"S\\\";he.length<=9;he+=\\\"S\\\")S(he,hc);var ie=E(\\\"Milliseconds\\\",!1);J(\\\"z\\\",0,0,\\\"zoneAbbr\\\"),J(\\\"zz\\\",0,0,\\\"zoneName\\\");var je=o.prototype;je.add=Xd,je.calendar=db,je.clone=eb,je.diff=lb,je.endOf=xb,je.format=pb,je.from=qb,je.fromNow=rb,je.to=sb,je.toNow=tb,je.get=H,je.invalidAt=Gb,je.isAfter=fb,je.isBefore=gb,je.isBetween=hb,je.isSame=ib,je.isSameOrAfter=jb,je.isSameOrBefore=kb,je.isValid=Eb,je.lang=Zd,je.locale=ub,je.localeData=vb,je.max=Sd,je.min=Rd,je.parsingFlags=Fb,je.set=H,je.startOf=wb,je.subtract=Yd,je.toArray=Bb,je.toObject=Cb,je.toDate=Ab,je.toISOString=ob,je.toJSON=Db,je.toString=nb,je.unix=zb,je.valueOf=yb,je.creationData=Hb,je.year=Qd,je.isLeapYear=na,je.weekYear=Jb,je.isoWeekYear=Kb,je.quarter=je.quarters=Pb,je.month=$,je.daysInMonth=_,je.week=je.weeks=Tb,je.isoWeek=je.isoWeeks=Ub,je.weeksInYear=Mb,je.isoWeeksInYear=Lb,je.date=_d,je.day=je.days=$b,je.weekday=_b,je.isoWeekday=ac,je.dayOfYear=bc,je.hour=je.hours=ee,je.minute=je.minutes=fe,je.second=je.seconds=ge,je.millisecond=je.milliseconds=ie,je.utcOffset=Oa,je.utc=Qa,je.local=Ra,je.parseZone=Sa,je.hasAlignedHourOffset=Ta,je.isDST=Ua,je.isDSTShifted=Va,je.isLocal=Wa,je.isUtcOffset=Xa,je.isUtc=Ya,je.isUTC=Ya,je.zoneAbbr=ic,je.zoneName=jc,je.dates=fa(\\\"dates accessor is deprecated. Use date instead.\\\",_d),je.months=fa(\\\"months accessor is deprecated. Use month instead\\\",$),je.years=fa(\\\"years accessor is deprecated. Use year instead\\\",Qd),je.zone=fa(\\\"moment().zone is deprecated, use moment().utcOffset instead. https://github.com/moment/moment/issues/1779\\\",Pa);var ke=je,le={sameDay:\\\"[Today at] LT\\\",nextDay:\\\"[Tomorrow at] LT\\\",nextWeek:\\\"dddd [at] LT\\\",lastDay:\\\"[Yesterday at] LT\\\",lastWeek:\\\"[Last] dddd [at] LT\\\",sameElse:\\\"L\\\"},me={LTS:\\\"h:mm:ss A\\\",LT:\\\"h:mm A\\\",L:\\\"MM/DD/YYYY\\\",LL:\\\"MMMM D, YYYY\\\",LLL:\\\"MMMM D, YYYY h:mm A\\\",LLLL:\\\"dddd, MMMM D, YYYY h:mm A\\\"},ne=\\\"Invalid date\\\",oe=\\\"%d\\\",pe=/\\\\d{1,2}/,qe={future:\\\"in %s\\\",past:\\\"%s ago\\\",s:\\\"a few seconds\\\",m:\\\"a minute\\\",mm:\\\"%d minutes\\\",h:\\\"an hour\\\",hh:\\\"%d hours\\\",d:\\\"a day\\\",dd:\\\"%d days\\\",M:\\\"a month\\\",MM:\\\"%d months\\\",y:\\\"a year\\\",yy:\\\"%d years\\\"},re=t.prototype;re._calendar=le,re.calendar=mc,re._longDateFormat=me,re.longDateFormat=nc,re._invalidDate=ne,re.invalidDate=oc,re._ordinal=oe,re.ordinal=pc,re._ordinalParse=pe,re.preparse=qc,re.postformat=qc,re._relativeTime=qe,re.relativeTime=rc,re.pastFuture=sc,re.set=tc,re.months=W,re._months=Fd,re.monthsShort=X,re._monthsShort=Gd,re.monthsParse=Y,re._monthsRegex=Id,re.monthsRegex=ba,re._monthsShortRegex=Hd,re.monthsShortRegex=aa,re.week=Qb,re._week=$d,re.firstDayOfYear=Sb,re.firstDayOfWeek=Rb,re.weekdays=Wb,re._weekdays=ae,re.weekdaysMin=Yb,re._weekdaysMin=ce,re.weekdaysShort=Xb,re._weekdaysShort=be,re.weekdaysParse=Zb,re.isPM=fc,re._meridiemParse=de,re.meridiem=gc,x(\\\"en\\\",{ordinalParse:/\\\\d{1,2}(th|st|nd|rd)/,ordinal:function(a){var b=a%10,c=1===r(a%100/10)?\\\"th\\\":1===b?\\\"st\\\":2===b?\\\"nd\\\":3===b?\\\"rd\\\":\\\"th\\\";return a+c}}),a.lang=fa(\\\"moment.lang is deprecated. Use moment.locale instead.\\\",x),a.langData=fa(\\\"moment.langData is deprecated. Use moment.localeData instead.\\\",z);var se=Math.abs,te=Lc(\\\"ms\\\"),ue=Lc(\\\"s\\\"),ve=Lc(\\\"m\\\"),we=Lc(\\\"h\\\"),xe=Lc(\\\"d\\\"),ye=Lc(\\\"w\\\"),ze=Lc(\\\"M\\\"),Ae=Lc(\\\"y\\\"),Be=Nc(\\\"milliseconds\\\"),Ce=Nc(\\\"seconds\\\"),De=Nc(\\\"minutes\\\"),Ee=Nc(\\\"hours\\\"),Fe=Nc(\\\"days\\\"),Ge=Nc(\\\"months\\\"),He=Nc(\\\"years\\\"),Ie=Math.round,Je={s:45,m:45,h:22,d:26,M:11},Ke=Math.abs,Le=Ia.prototype;Le.abs=Bc,Le.add=Dc,Le.subtract=Ec,Le.as=Jc,Le.asMilliseconds=te,Le.asSeconds=ue,Le.asMinutes=ve,Le.asHours=we,Le.asDays=xe,Le.asWeeks=ye,Le.asMonths=ze,Le.asYears=Ae,Le.valueOf=Kc,Le._bubble=Gc,Le.get=Mc,Le.milliseconds=Be,Le.seconds=Ce,Le.minutes=De,Le.hours=Ee,Le.days=Fe,Le.weeks=Oc,Le.months=Ge,Le.years=He,Le.humanize=Sc,Le.toISOString=Tc,Le.toString=Tc,Le.toJSON=Tc,Le.locale=ub,Le.localeData=vb,Le.toIsoString=fa(\\\"toIsoString() is deprecated. Please use toISOString() instead (notice the capitals)\\\",Tc),Le.lang=Zd,J(\\\"X\\\",0,0,\\\"unix\\\"),J(\\\"x\\\",0,0,\\\"valueOf\\\"),O(\\\"x\\\",od),O(\\\"X\\\",rd),S(\\\"X\\\",function(a,b,c){c._d=new Date(1e3*parseFloat(a,10))}),S(\\\"x\\\",function(a,b,c){c._d=new Date(r(a))}),a.version=\\\"2.11.1\\\",b(Ea),a.fn=ke,a.min=Ga,a.max=Ha,a.now=Td,a.utc=h,a.unix=kc,a.months=wc,a.isDate=d,a.locale=x,a.invalid=l,a.duration=Za,a.isMoment=p,a.weekdays=yc,a.parseZone=lc,a.localeData=z,a.isDuration=Ja,a.monthsShort=xc,a.weekdaysMin=Ac,a.defineLocale=y,a.weekdaysShort=zc,a.normalizeUnits=B,a.relativeTimeThreshold=Rc,a.prototype=ke;var Me=a;return Me});\"\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTcuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ib3dlcl9jb21wb25lbnRzL21vbWVudC9taW4vbW9tZW50Lm1pbi5qcz9mYzc4Il0sInNvdXJjZXNDb250ZW50IjpbIm1vZHVsZS5leHBvcnRzID0gXCIvLyEgbW9tZW50LmpzXFxuLy8hIHZlcnNpb24gOiAyLjExLjFcXG4vLyEgYXV0aG9ycyA6IFRpbSBXb29kLCBJc2tyZW4gQ2hlcm5ldiwgTW9tZW50LmpzIGNvbnRyaWJ1dG9yc1xcbi8vISBsaWNlbnNlIDogTUlUXFxuLy8hIG1vbWVudGpzLmNvbVxcbiFmdW5jdGlvbihhLGIpe1xcXCJvYmplY3RcXFwiPT10eXBlb2YgZXhwb3J0cyYmXFxcInVuZGVmaW5lZFxcXCIhPXR5cGVvZiBtb2R1bGU/bW9kdWxlLmV4cG9ydHM9YigpOlxcXCJmdW5jdGlvblxcXCI9PXR5cGVvZiBkZWZpbmUmJmRlZmluZS5hbWQ/ZGVmaW5lKGIpOmEubW9tZW50PWIoKX0odGhpcyxmdW5jdGlvbigpe1xcXCJ1c2Ugc3RyaWN0XFxcIjtmdW5jdGlvbiBhKCl7cmV0dXJuIFVjLmFwcGx5KG51bGwsYXJndW1lbnRzKX1mdW5jdGlvbiBiKGEpe1VjPWF9ZnVuY3Rpb24gYyhhKXtyZXR1cm5cXFwiW29iamVjdCBBcnJheV1cXFwiPT09T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGEpfWZ1bmN0aW9uIGQoYSl7cmV0dXJuIGEgaW5zdGFuY2VvZiBEYXRlfHxcXFwiW29iamVjdCBEYXRlXVxcXCI9PT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoYSl9ZnVuY3Rpb24gZShhLGIpe3ZhciBjLGQ9W107Zm9yKGM9MDtjPGEubGVuZ3RoOysrYylkLnB1c2goYihhW2NdLGMpKTtyZXR1cm4gZH1mdW5jdGlvbiBmKGEsYil7cmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChhLGIpfWZ1bmN0aW9uIGcoYSxiKXtmb3IodmFyIGMgaW4gYilmKGIsYykmJihhW2NdPWJbY10pO3JldHVybiBmKGIsXFxcInRvU3RyaW5nXFxcIikmJihhLnRvU3RyaW5nPWIudG9TdHJpbmcpLGYoYixcXFwidmFsdWVPZlxcXCIpJiYoYS52YWx1ZU9mPWIudmFsdWVPZiksYX1mdW5jdGlvbiBoKGEsYixjLGQpe3JldHVybiBEYShhLGIsYyxkLCEwKS51dGMoKX1mdW5jdGlvbiBpKCl7cmV0dXJue2VtcHR5OiExLHVudXNlZFRva2VuczpbXSx1bnVzZWRJbnB1dDpbXSxvdmVyZmxvdzotMixjaGFyc0xlZnRPdmVyOjAsbnVsbElucHV0OiExLGludmFsaWRNb250aDpudWxsLGludmFsaWRGb3JtYXQ6ITEsdXNlckludmFsaWRhdGVkOiExLGlzbzohMX19ZnVuY3Rpb24gaihhKXtyZXR1cm4gbnVsbD09YS5fcGYmJihhLl9wZj1pKCkpLGEuX3BmfWZ1bmN0aW9uIGsoYSl7aWYobnVsbD09YS5faXNWYWxpZCl7dmFyIGI9aihhKTthLl9pc1ZhbGlkPSEoaXNOYU4oYS5fZC5nZXRUaW1lKCkpfHwhKGIub3ZlcmZsb3c8MCl8fGIuZW1wdHl8fGIuaW52YWxpZE1vbnRofHxiLmludmFsaWRXZWVrZGF5fHxiLm51bGxJbnB1dHx8Yi5pbnZhbGlkRm9ybWF0fHxiLnVzZXJJbnZhbGlkYXRlZCksYS5fc3RyaWN0JiYoYS5faXNWYWxpZD1hLl9pc1ZhbGlkJiYwPT09Yi5jaGFyc0xlZnRPdmVyJiYwPT09Yi51bnVzZWRUb2tlbnMubGVuZ3RoJiZ2b2lkIDA9PT1iLmJpZ0hvdXIpfXJldHVybiBhLl9pc1ZhbGlkfWZ1bmN0aW9uIGwoYSl7dmFyIGI9aChOYU4pO3JldHVybiBudWxsIT1hP2coaihiKSxhKTpqKGIpLnVzZXJJbnZhbGlkYXRlZD0hMCxifWZ1bmN0aW9uIG0oYSl7cmV0dXJuIHZvaWQgMD09PWF9ZnVuY3Rpb24gbihhLGIpe3ZhciBjLGQsZTtpZihtKGIuX2lzQU1vbWVudE9iamVjdCl8fChhLl9pc0FNb21lbnRPYmplY3Q9Yi5faXNBTW9tZW50T2JqZWN0KSxtKGIuX2kpfHwoYS5faT1iLl9pKSxtKGIuX2YpfHwoYS5fZj1iLl9mKSxtKGIuX2wpfHwoYS5fbD1iLl9sKSxtKGIuX3N0cmljdCl8fChhLl9zdHJpY3Q9Yi5fc3RyaWN0KSxtKGIuX3R6bSl8fChhLl90em09Yi5fdHptKSxtKGIuX2lzVVRDKXx8KGEuX2lzVVRDPWIuX2lzVVRDKSxtKGIuX29mZnNldCl8fChhLl9vZmZzZXQ9Yi5fb2Zmc2V0KSxtKGIuX3BmKXx8KGEuX3BmPWooYikpLG0oYi5fbG9jYWxlKXx8KGEuX2xvY2FsZT1iLl9sb2NhbGUpLFdjLmxlbmd0aD4wKWZvcihjIGluIFdjKWQ9V2NbY10sZT1iW2RdLG0oZSl8fChhW2RdPWUpO3JldHVybiBhfWZ1bmN0aW9uIG8oYil7bih0aGlzLGIpLHRoaXMuX2Q9bmV3IERhdGUobnVsbCE9Yi5fZD9iLl9kLmdldFRpbWUoKTpOYU4pLFhjPT09ITEmJihYYz0hMCxhLnVwZGF0ZU9mZnNldCh0aGlzKSxYYz0hMSl9ZnVuY3Rpb24gcChhKXtyZXR1cm4gYSBpbnN0YW5jZW9mIG98fG51bGwhPWEmJm51bGwhPWEuX2lzQU1vbWVudE9iamVjdH1mdW5jdGlvbiBxKGEpe3JldHVybiAwPmE/TWF0aC5jZWlsKGEpOk1hdGguZmxvb3IoYSl9ZnVuY3Rpb24gcihhKXt2YXIgYj0rYSxjPTA7cmV0dXJuIDAhPT1iJiZpc0Zpbml0ZShiKSYmKGM9cShiKSksY31mdW5jdGlvbiBzKGEsYixjKXt2YXIgZCxlPU1hdGgubWluKGEubGVuZ3RoLGIubGVuZ3RoKSxmPU1hdGguYWJzKGEubGVuZ3RoLWIubGVuZ3RoKSxnPTA7Zm9yKGQ9MDtlPmQ7ZCsrKShjJiZhW2RdIT09YltkXXx8IWMmJnIoYVtkXSkhPT1yKGJbZF0pKSYmZysrO3JldHVybiBnK2Z9ZnVuY3Rpb24gdCgpe31mdW5jdGlvbiB1KGEpe3JldHVybiBhP2EudG9Mb3dlckNhc2UoKS5yZXBsYWNlKFxcXCJfXFxcIixcXFwiLVxcXCIpOmF9ZnVuY3Rpb24gdihhKXtmb3IodmFyIGIsYyxkLGUsZj0wO2Y8YS5sZW5ndGg7KXtmb3IoZT11KGFbZl0pLnNwbGl0KFxcXCItXFxcIiksYj1lLmxlbmd0aCxjPXUoYVtmKzFdKSxjPWM/Yy5zcGxpdChcXFwiLVxcXCIpOm51bGw7Yj4wOyl7aWYoZD13KGUuc2xpY2UoMCxiKS5qb2luKFxcXCItXFxcIikpKXJldHVybiBkO2lmKGMmJmMubGVuZ3RoPj1iJiZzKGUsYywhMCk+PWItMSlicmVhaztiLS19ZisrfXJldHVybiBudWxsfWZ1bmN0aW9uIHcoYSl7dmFyIGI9bnVsbDtpZighWWNbYV0mJlxcXCJ1bmRlZmluZWRcXFwiIT10eXBlb2YgbW9kdWxlJiZtb2R1bGUmJm1vZHVsZS5leHBvcnRzKXRyeXtiPVZjLl9hYmJyLHJlcXVpcmUoXFxcIi4vbG9jYWxlL1xcXCIrYSkseChiKX1jYXRjaChjKXt9cmV0dXJuIFljW2FdfWZ1bmN0aW9uIHgoYSxiKXt2YXIgYztyZXR1cm4gYSYmKGM9bShiKT96KGEpOnkoYSxiKSxjJiYoVmM9YykpLFZjLl9hYmJyfWZ1bmN0aW9uIHkoYSxiKXtyZXR1cm4gbnVsbCE9PWI/KGIuYWJicj1hLFljW2FdPVljW2FdfHxuZXcgdCxZY1thXS5zZXQoYikseChhKSxZY1thXSk6KGRlbGV0ZSBZY1thXSxudWxsKX1mdW5jdGlvbiB6KGEpe3ZhciBiO2lmKGEmJmEuX2xvY2FsZSYmYS5fbG9jYWxlLl9hYmJyJiYoYT1hLl9sb2NhbGUuX2FiYnIpLCFhKXJldHVybiBWYztpZighYyhhKSl7aWYoYj13KGEpKXJldHVybiBiO2E9W2FdfXJldHVybiB2KGEpfWZ1bmN0aW9uIEEoYSxiKXt2YXIgYz1hLnRvTG93ZXJDYXNlKCk7WmNbY109WmNbYytcXFwic1xcXCJdPVpjW2JdPWF9ZnVuY3Rpb24gQihhKXtyZXR1cm5cXFwic3RyaW5nXFxcIj09dHlwZW9mIGE/WmNbYV18fFpjW2EudG9Mb3dlckNhc2UoKV06dm9pZCAwfWZ1bmN0aW9uIEMoYSl7dmFyIGIsYyxkPXt9O2ZvcihjIGluIGEpZihhLGMpJiYoYj1CKGMpLGImJihkW2JdPWFbY10pKTtyZXR1cm4gZH1mdW5jdGlvbiBEKGEpe3JldHVybiBhIGluc3RhbmNlb2YgRnVuY3Rpb258fFxcXCJbb2JqZWN0IEZ1bmN0aW9uXVxcXCI9PT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoYSl9ZnVuY3Rpb24gRShiLGMpe3JldHVybiBmdW5jdGlvbihkKXtyZXR1cm4gbnVsbCE9ZD8oRyh0aGlzLGIsZCksYS51cGRhdGVPZmZzZXQodGhpcyxjKSx0aGlzKTpGKHRoaXMsYil9fWZ1bmN0aW9uIEYoYSxiKXtyZXR1cm4gYS5pc1ZhbGlkKCk/YS5fZFtcXFwiZ2V0XFxcIisoYS5faXNVVEM/XFxcIlVUQ1xcXCI6XFxcIlxcXCIpK2JdKCk6TmFOfWZ1bmN0aW9uIEcoYSxiLGMpe2EuaXNWYWxpZCgpJiZhLl9kW1xcXCJzZXRcXFwiKyhhLl9pc1VUQz9cXFwiVVRDXFxcIjpcXFwiXFxcIikrYl0oYyl9ZnVuY3Rpb24gSChhLGIpe3ZhciBjO2lmKFxcXCJvYmplY3RcXFwiPT10eXBlb2YgYSlmb3IoYyBpbiBhKXRoaXMuc2V0KGMsYVtjXSk7ZWxzZSBpZihhPUIoYSksRCh0aGlzW2FdKSlyZXR1cm4gdGhpc1thXShiKTtyZXR1cm4gdGhpc31mdW5jdGlvbiBJKGEsYixjKXt2YXIgZD1cXFwiXFxcIitNYXRoLmFicyhhKSxlPWItZC5sZW5ndGgsZj1hPj0wO3JldHVybihmP2M/XFxcIitcXFwiOlxcXCJcXFwiOlxcXCItXFxcIikrTWF0aC5wb3coMTAsTWF0aC5tYXgoMCxlKSkudG9TdHJpbmcoKS5zdWJzdHIoMSkrZH1mdW5jdGlvbiBKKGEsYixjLGQpe3ZhciBlPWQ7XFxcInN0cmluZ1xcXCI9PXR5cGVvZiBkJiYoZT1mdW5jdGlvbigpe3JldHVybiB0aGlzW2RdKCl9KSxhJiYoYmRbYV09ZSksYiYmKGJkW2JbMF1dPWZ1bmN0aW9uKCl7cmV0dXJuIEkoZS5hcHBseSh0aGlzLGFyZ3VtZW50cyksYlsxXSxiWzJdKX0pLGMmJihiZFtjXT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmxvY2FsZURhdGEoKS5vcmRpbmFsKGUuYXBwbHkodGhpcyxhcmd1bWVudHMpLGEpfSl9ZnVuY3Rpb24gSyhhKXtyZXR1cm4gYS5tYXRjaCgvXFxcXFtbXFxcXHNcXFxcU10vKT9hLnJlcGxhY2UoL15cXFxcW3xcXFxcXSQvZyxcXFwiXFxcIik6YS5yZXBsYWNlKC9cXFxcXFxcXC9nLFxcXCJcXFwiKX1mdW5jdGlvbiBMKGEpe3ZhciBiLGMsZD1hLm1hdGNoKCRjKTtmb3IoYj0wLGM9ZC5sZW5ndGg7Yz5iO2IrKyliZFtkW2JdXT9kW2JdPWJkW2RbYl1dOmRbYl09SyhkW2JdKTtyZXR1cm4gZnVuY3Rpb24oZSl7dmFyIGY9XFxcIlxcXCI7Zm9yKGI9MDtjPmI7YisrKWYrPWRbYl1pbnN0YW5jZW9mIEZ1bmN0aW9uP2RbYl0uY2FsbChlLGEpOmRbYl07cmV0dXJuIGZ9fWZ1bmN0aW9uIE0oYSxiKXtyZXR1cm4gYS5pc1ZhbGlkKCk/KGI9TihiLGEubG9jYWxlRGF0YSgpKSxhZFtiXT1hZFtiXXx8TChiKSxhZFtiXShhKSk6YS5sb2NhbGVEYXRhKCkuaW52YWxpZERhdGUoKX1mdW5jdGlvbiBOKGEsYil7ZnVuY3Rpb24gYyhhKXtyZXR1cm4gYi5sb25nRGF0ZUZvcm1hdChhKXx8YX12YXIgZD01O2ZvcihfYy5sYXN0SW5kZXg9MDtkPj0wJiZfYy50ZXN0KGEpOylhPWEucmVwbGFjZShfYyxjKSxfYy5sYXN0SW5kZXg9MCxkLT0xO3JldHVybiBhfWZ1bmN0aW9uIE8oYSxiLGMpe3RkW2FdPUQoYik/YjpmdW5jdGlvbihhLGQpe3JldHVybiBhJiZjP2M6Yn19ZnVuY3Rpb24gUChhLGIpe3JldHVybiBmKHRkLGEpP3RkW2FdKGIuX3N0cmljdCxiLl9sb2NhbGUpOm5ldyBSZWdFeHAoUShhKSl9ZnVuY3Rpb24gUShhKXtyZXR1cm4gUihhLnJlcGxhY2UoXFxcIlxcXFxcXFxcXFxcIixcXFwiXFxcIikucmVwbGFjZSgvXFxcXFxcXFwoXFxcXFspfFxcXFxcXFxcKFxcXFxdKXxcXFxcWyhbXlxcXFxdXFxcXFtdKilcXFxcXXxcXFxcXFxcXCguKS9nLGZ1bmN0aW9uKGEsYixjLGQsZSl7cmV0dXJuIGJ8fGN8fGR8fGV9KSl9ZnVuY3Rpb24gUihhKXtyZXR1cm4gYS5yZXBsYWNlKC9bLVxcXFwvXFxcXFxcXFxeJCorPy4oKXxbXFxcXF17fV0vZyxcXFwiXFxcXFxcXFwkJlxcXCIpfWZ1bmN0aW9uIFMoYSxiKXt2YXIgYyxkPWI7Zm9yKFxcXCJzdHJpbmdcXFwiPT10eXBlb2YgYSYmKGE9W2FdKSxcXFwibnVtYmVyXFxcIj09dHlwZW9mIGImJihkPWZ1bmN0aW9uKGEsYyl7Y1tiXT1yKGEpfSksYz0wO2M8YS5sZW5ndGg7YysrKXVkW2FbY11dPWR9ZnVuY3Rpb24gVChhLGIpe1MoYSxmdW5jdGlvbihhLGMsZCxlKXtkLl93PWQuX3d8fHt9LGIoYSxkLl93LGQsZSl9KX1mdW5jdGlvbiBVKGEsYixjKXtudWxsIT1iJiZmKHVkLGEpJiZ1ZFthXShiLGMuX2EsYyxhKX1mdW5jdGlvbiBWKGEsYil7cmV0dXJuIG5ldyBEYXRlKERhdGUuVVRDKGEsYisxLDApKS5nZXRVVENEYXRlKCl9ZnVuY3Rpb24gVyhhLGIpe3JldHVybiBjKHRoaXMuX21vbnRocyk/dGhpcy5fbW9udGhzW2EubW9udGgoKV06dGhpcy5fbW9udGhzW0VkLnRlc3QoYik/XFxcImZvcm1hdFxcXCI6XFxcInN0YW5kYWxvbmVcXFwiXVthLm1vbnRoKCldfWZ1bmN0aW9uIFgoYSxiKXtyZXR1cm4gYyh0aGlzLl9tb250aHNTaG9ydCk/dGhpcy5fbW9udGhzU2hvcnRbYS5tb250aCgpXTp0aGlzLl9tb250aHNTaG9ydFtFZC50ZXN0KGIpP1xcXCJmb3JtYXRcXFwiOlxcXCJzdGFuZGFsb25lXFxcIl1bYS5tb250aCgpXX1mdW5jdGlvbiBZKGEsYixjKXt2YXIgZCxlLGY7Zm9yKHRoaXMuX21vbnRoc1BhcnNlfHwodGhpcy5fbW9udGhzUGFyc2U9W10sdGhpcy5fbG9uZ01vbnRoc1BhcnNlPVtdLHRoaXMuX3Nob3J0TW9udGhzUGFyc2U9W10pLGQ9MDsxMj5kO2QrKyl7aWYoZT1oKFsyZTMsZF0pLGMmJiF0aGlzLl9sb25nTW9udGhzUGFyc2VbZF0mJih0aGlzLl9sb25nTW9udGhzUGFyc2VbZF09bmV3IFJlZ0V4cChcXFwiXlxcXCIrdGhpcy5tb250aHMoZSxcXFwiXFxcIikucmVwbGFjZShcXFwiLlxcXCIsXFxcIlxcXCIpK1xcXCIkXFxcIixcXFwiaVxcXCIpLHRoaXMuX3Nob3J0TW9udGhzUGFyc2VbZF09bmV3IFJlZ0V4cChcXFwiXlxcXCIrdGhpcy5tb250aHNTaG9ydChlLFxcXCJcXFwiKS5yZXBsYWNlKFxcXCIuXFxcIixcXFwiXFxcIikrXFxcIiRcXFwiLFxcXCJpXFxcIikpLGN8fHRoaXMuX21vbnRoc1BhcnNlW2RdfHwoZj1cXFwiXlxcXCIrdGhpcy5tb250aHMoZSxcXFwiXFxcIikrXFxcInxeXFxcIit0aGlzLm1vbnRoc1Nob3J0KGUsXFxcIlxcXCIpLHRoaXMuX21vbnRoc1BhcnNlW2RdPW5ldyBSZWdFeHAoZi5yZXBsYWNlKFxcXCIuXFxcIixcXFwiXFxcIiksXFxcImlcXFwiKSksYyYmXFxcIk1NTU1cXFwiPT09YiYmdGhpcy5fbG9uZ01vbnRoc1BhcnNlW2RdLnRlc3QoYSkpcmV0dXJuIGQ7aWYoYyYmXFxcIk1NTVxcXCI9PT1iJiZ0aGlzLl9zaG9ydE1vbnRoc1BhcnNlW2RdLnRlc3QoYSkpcmV0dXJuIGQ7aWYoIWMmJnRoaXMuX21vbnRoc1BhcnNlW2RdLnRlc3QoYSkpcmV0dXJuIGR9fWZ1bmN0aW9uIFooYSxiKXt2YXIgYztyZXR1cm4gYS5pc1ZhbGlkKCk/XFxcInN0cmluZ1xcXCI9PXR5cGVvZiBiJiYoYj1hLmxvY2FsZURhdGEoKS5tb250aHNQYXJzZShiKSxcXFwibnVtYmVyXFxcIiE9dHlwZW9mIGIpP2E6KGM9TWF0aC5taW4oYS5kYXRlKCksVihhLnllYXIoKSxiKSksYS5fZFtcXFwic2V0XFxcIisoYS5faXNVVEM/XFxcIlVUQ1xcXCI6XFxcIlxcXCIpK1xcXCJNb250aFxcXCJdKGIsYyksYSk6YX1mdW5jdGlvbiAkKGIpe3JldHVybiBudWxsIT1iPyhaKHRoaXMsYiksYS51cGRhdGVPZmZzZXQodGhpcywhMCksdGhpcyk6Rih0aGlzLFxcXCJNb250aFxcXCIpfWZ1bmN0aW9uIF8oKXtyZXR1cm4gVih0aGlzLnllYXIoKSx0aGlzLm1vbnRoKCkpfWZ1bmN0aW9uIGFhKGEpe3JldHVybiB0aGlzLl9tb250aHNQYXJzZUV4YWN0PyhmKHRoaXMsXFxcIl9tb250aHNSZWdleFxcXCIpfHxjYS5jYWxsKHRoaXMpLGE/dGhpcy5fbW9udGhzU2hvcnRTdHJpY3RSZWdleDp0aGlzLl9tb250aHNTaG9ydFJlZ2V4KTp0aGlzLl9tb250aHNTaG9ydFN0cmljdFJlZ2V4JiZhP3RoaXMuX21vbnRoc1Nob3J0U3RyaWN0UmVnZXg6dGhpcy5fbW9udGhzU2hvcnRSZWdleH1mdW5jdGlvbiBiYShhKXtyZXR1cm4gdGhpcy5fbW9udGhzUGFyc2VFeGFjdD8oZih0aGlzLFxcXCJfbW9udGhzUmVnZXhcXFwiKXx8Y2EuY2FsbCh0aGlzKSxhP3RoaXMuX21vbnRoc1N0cmljdFJlZ2V4OnRoaXMuX21vbnRoc1JlZ2V4KTp0aGlzLl9tb250aHNTdHJpY3RSZWdleCYmYT90aGlzLl9tb250aHNTdHJpY3RSZWdleDp0aGlzLl9tb250aHNSZWdleH1mdW5jdGlvbiBjYSgpe2Z1bmN0aW9uIGEoYSxiKXtyZXR1cm4gYi5sZW5ndGgtYS5sZW5ndGh9dmFyIGIsYyxkPVtdLGU9W10sZj1bXTtmb3IoYj0wOzEyPmI7YisrKWM9aChbMmUzLGJdKSxkLnB1c2godGhpcy5tb250aHNTaG9ydChjLFxcXCJcXFwiKSksZS5wdXNoKHRoaXMubW9udGhzKGMsXFxcIlxcXCIpKSxmLnB1c2godGhpcy5tb250aHMoYyxcXFwiXFxcIikpLGYucHVzaCh0aGlzLm1vbnRoc1Nob3J0KGMsXFxcIlxcXCIpKTtmb3IoZC5zb3J0KGEpLGUuc29ydChhKSxmLnNvcnQoYSksYj0wOzEyPmI7YisrKWRbYl09UihkW2JdKSxlW2JdPVIoZVtiXSksZltiXT1SKGZbYl0pO3RoaXMuX21vbnRoc1JlZ2V4PW5ldyBSZWdFeHAoXFxcIl4oXFxcIitmLmpvaW4oXFxcInxcXFwiKStcXFwiKVxcXCIsXFxcImlcXFwiKSx0aGlzLl9tb250aHNTaG9ydFJlZ2V4PXRoaXMuX21vbnRoc1JlZ2V4LHRoaXMuX21vbnRoc1N0cmljdFJlZ2V4PW5ldyBSZWdFeHAoXFxcIl4oXFxcIitlLmpvaW4oXFxcInxcXFwiKStcXFwiKSRcXFwiLFxcXCJpXFxcIiksdGhpcy5fbW9udGhzU2hvcnRTdHJpY3RSZWdleD1uZXcgUmVnRXhwKFxcXCJeKFxcXCIrZC5qb2luKFxcXCJ8XFxcIikrXFxcIikkXFxcIixcXFwiaVxcXCIpfWZ1bmN0aW9uIGRhKGEpe3ZhciBiLGM9YS5fYTtyZXR1cm4gYyYmLTI9PT1qKGEpLm92ZXJmbG93JiYoYj1jW3dkXTwwfHxjW3dkXT4xMT93ZDpjW3hkXTwxfHxjW3hkXT5WKGNbdmRdLGNbd2RdKT94ZDpjW3lkXTwwfHxjW3lkXT4yNHx8MjQ9PT1jW3lkXSYmKDAhPT1jW3pkXXx8MCE9PWNbQWRdfHwwIT09Y1tCZF0pP3lkOmNbemRdPDB8fGNbemRdPjU5P3pkOmNbQWRdPDB8fGNbQWRdPjU5P0FkOmNbQmRdPDB8fGNbQmRdPjk5OT9CZDotMSxqKGEpLl9vdmVyZmxvd0RheU9mWWVhciYmKHZkPmJ8fGI+eGQpJiYoYj14ZCksaihhKS5fb3ZlcmZsb3dXZWVrcyYmLTE9PT1iJiYoYj1DZCksaihhKS5fb3ZlcmZsb3dXZWVrZGF5JiYtMT09PWImJihiPURkKSxqKGEpLm92ZXJmbG93PWIpLGF9ZnVuY3Rpb24gZWEoYil7YS5zdXBwcmVzc0RlcHJlY2F0aW9uV2FybmluZ3M9PT0hMSYmXFxcInVuZGVmaW5lZFxcXCIhPXR5cGVvZiBjb25zb2xlJiZjb25zb2xlLndhcm4mJmNvbnNvbGUud2FybihcXFwiRGVwcmVjYXRpb24gd2FybmluZzogXFxcIitiKX1mdW5jdGlvbiBmYShhLGIpe3ZhciBjPSEwO3JldHVybiBnKGZ1bmN0aW9uKCl7cmV0dXJuIGMmJihlYShhK1xcXCJcXFxcbkFyZ3VtZW50czogXFxcIitBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpLmpvaW4oXFxcIiwgXFxcIikrXFxcIlxcXFxuXFxcIisobmV3IEVycm9yKS5zdGFjayksYz0hMSksYi5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LGIpfWZ1bmN0aW9uIGdhKGEsYil7SmRbYV18fChlYShiKSxKZFthXT0hMCl9ZnVuY3Rpb24gaGEoYSl7dmFyIGIsYyxkLGUsZixnLGg9YS5faSxpPUtkLmV4ZWMoaCl8fExkLmV4ZWMoaCk7aWYoaSl7Zm9yKGooYSkuaXNvPSEwLGI9MCxjPU5kLmxlbmd0aDtjPmI7YisrKWlmKE5kW2JdWzFdLmV4ZWMoaVsxXSkpe2U9TmRbYl1bMF0sZD1OZFtiXVsyXSE9PSExO2JyZWFrfWlmKG51bGw9PWUpcmV0dXJuIHZvaWQoYS5faXNWYWxpZD0hMSk7aWYoaVszXSl7Zm9yKGI9MCxjPU9kLmxlbmd0aDtjPmI7YisrKWlmKE9kW2JdWzFdLmV4ZWMoaVszXSkpe2Y9KGlbMl18fFxcXCIgXFxcIikrT2RbYl1bMF07YnJlYWt9aWYobnVsbD09ZilyZXR1cm4gdm9pZChhLl9pc1ZhbGlkPSExKX1pZighZCYmbnVsbCE9ZilyZXR1cm4gdm9pZChhLl9pc1ZhbGlkPSExKTtpZihpWzRdKXtpZighTWQuZXhlYyhpWzRdKSlyZXR1cm4gdm9pZChhLl9pc1ZhbGlkPSExKTtnPVxcXCJaXFxcIn1hLl9mPWUrKGZ8fFxcXCJcXFwiKSsoZ3x8XFxcIlxcXCIpLHdhKGEpfWVsc2UgYS5faXNWYWxpZD0hMX1mdW5jdGlvbiBpYShiKXt2YXIgYz1QZC5leGVjKGIuX2kpO3JldHVybiBudWxsIT09Yz92b2lkKGIuX2Q9bmV3IERhdGUoK2NbMV0pKTooaGEoYiksdm9pZChiLl9pc1ZhbGlkPT09ITEmJihkZWxldGUgYi5faXNWYWxpZCxhLmNyZWF0ZUZyb21JbnB1dEZhbGxiYWNrKGIpKSkpfWZ1bmN0aW9uIGphKGEsYixjLGQsZSxmLGcpe3ZhciBoPW5ldyBEYXRlKGEsYixjLGQsZSxmLGcpO3JldHVybiAxMDA+YSYmYT49MCYmaXNGaW5pdGUoaC5nZXRGdWxsWWVhcigpKSYmaC5zZXRGdWxsWWVhcihhKSxofWZ1bmN0aW9uIGthKGEpe3ZhciBiPW5ldyBEYXRlKERhdGUuVVRDLmFwcGx5KG51bGwsYXJndW1lbnRzKSk7cmV0dXJuIDEwMD5hJiZhPj0wJiZpc0Zpbml0ZShiLmdldFVUQ0Z1bGxZZWFyKCkpJiZiLnNldFVUQ0Z1bGxZZWFyKGEpLGJ9ZnVuY3Rpb24gbGEoYSl7cmV0dXJuIG1hKGEpPzM2NjozNjV9ZnVuY3Rpb24gbWEoYSl7cmV0dXJuIGElND09PTAmJmElMTAwIT09MHx8YSU0MDA9PT0wfWZ1bmN0aW9uIG5hKCl7cmV0dXJuIG1hKHRoaXMueWVhcigpKX1mdW5jdGlvbiBvYShhLGIsYyl7dmFyIGQ9NytiLWMsZT0oNytrYShhLDAsZCkuZ2V0VVRDRGF5KCktYiklNztyZXR1cm4tZStkLTF9ZnVuY3Rpb24gcGEoYSxiLGMsZCxlKXt2YXIgZixnLGg9KDcrYy1kKSU3LGk9b2EoYSxkLGUpLGo9MSs3KihiLTEpK2graTtyZXR1cm4gMD49aj8oZj1hLTEsZz1sYShmKStqKTpqPmxhKGEpPyhmPWErMSxnPWotbGEoYSkpOihmPWEsZz1qKSx7eWVhcjpmLGRheU9mWWVhcjpnfX1mdW5jdGlvbiBxYShhLGIsYyl7dmFyIGQsZSxmPW9hKGEueWVhcigpLGIsYyksZz1NYXRoLmZsb29yKChhLmRheU9mWWVhcigpLWYtMSkvNykrMTtyZXR1cm4gMT5nPyhlPWEueWVhcigpLTEsZD1nK3JhKGUsYixjKSk6Zz5yYShhLnllYXIoKSxiLGMpPyhkPWctcmEoYS55ZWFyKCksYixjKSxlPWEueWVhcigpKzEpOihlPWEueWVhcigpLGQ9Zykse3dlZWs6ZCx5ZWFyOmV9fWZ1bmN0aW9uIHJhKGEsYixjKXt2YXIgZD1vYShhLGIsYyksZT1vYShhKzEsYixjKTtyZXR1cm4obGEoYSktZCtlKS83fWZ1bmN0aW9uIHNhKGEsYixjKXtyZXR1cm4gbnVsbCE9YT9hOm51bGwhPWI/YjpjfWZ1bmN0aW9uIHRhKGIpe3ZhciBjPW5ldyBEYXRlKGEubm93KCkpO3JldHVybiBiLl91c2VVVEM/W2MuZ2V0VVRDRnVsbFllYXIoKSxjLmdldFVUQ01vbnRoKCksYy5nZXRVVENEYXRlKCldOltjLmdldEZ1bGxZZWFyKCksYy5nZXRNb250aCgpLGMuZ2V0RGF0ZSgpXX1mdW5jdGlvbiB1YShhKXt2YXIgYixjLGQsZSxmPVtdO2lmKCFhLl9kKXtmb3IoZD10YShhKSxhLl93JiZudWxsPT1hLl9hW3hkXSYmbnVsbD09YS5fYVt3ZF0mJnZhKGEpLGEuX2RheU9mWWVhciYmKGU9c2EoYS5fYVt2ZF0sZFt2ZF0pLGEuX2RheU9mWWVhcj5sYShlKSYmKGooYSkuX292ZXJmbG93RGF5T2ZZZWFyPSEwKSxjPWthKGUsMCxhLl9kYXlPZlllYXIpLGEuX2Fbd2RdPWMuZ2V0VVRDTW9udGgoKSxhLl9hW3hkXT1jLmdldFVUQ0RhdGUoKSksYj0wOzM+YiYmbnVsbD09YS5fYVtiXTsrK2IpYS5fYVtiXT1mW2JdPWRbYl07Zm9yKDs3PmI7YisrKWEuX2FbYl09ZltiXT1udWxsPT1hLl9hW2JdPzI9PT1iPzE6MDphLl9hW2JdOzI0PT09YS5fYVt5ZF0mJjA9PT1hLl9hW3pkXSYmMD09PWEuX2FbQWRdJiYwPT09YS5fYVtCZF0mJihhLl9uZXh0RGF5PSEwLGEuX2FbeWRdPTApLGEuX2Q9KGEuX3VzZVVUQz9rYTpqYSkuYXBwbHkobnVsbCxmKSxudWxsIT1hLl90em0mJmEuX2Quc2V0VVRDTWludXRlcyhhLl9kLmdldFVUQ01pbnV0ZXMoKS1hLl90em0pLGEuX25leHREYXkmJihhLl9hW3lkXT0yNCl9fWZ1bmN0aW9uIHZhKGEpe3ZhciBiLGMsZCxlLGYsZyxoLGk7Yj1hLl93LG51bGwhPWIuR0d8fG51bGwhPWIuV3x8bnVsbCE9Yi5FPyhmPTEsZz00LGM9c2EoYi5HRyxhLl9hW3ZkXSxxYShFYSgpLDEsNCkueWVhciksZD1zYShiLlcsMSksZT1zYShiLkUsMSksKDE+ZXx8ZT43KSYmKGk9ITApKTooZj1hLl9sb2NhbGUuX3dlZWsuZG93LGc9YS5fbG9jYWxlLl93ZWVrLmRveSxjPXNhKGIuZ2csYS5fYVt2ZF0scWEoRWEoKSxmLGcpLnllYXIpLGQ9c2EoYi53LDEpLG51bGwhPWIuZD8oZT1iLmQsKDA+ZXx8ZT42KSYmKGk9ITApKTpudWxsIT1iLmU/KGU9Yi5lK2YsKGIuZTwwfHxiLmU+NikmJihpPSEwKSk6ZT1mKSwxPmR8fGQ+cmEoYyxmLGcpP2ooYSkuX292ZXJmbG93V2Vla3M9ITA6bnVsbCE9aT9qKGEpLl9vdmVyZmxvd1dlZWtkYXk9ITA6KGg9cGEoYyxkLGUsZixnKSxhLl9hW3ZkXT1oLnllYXIsYS5fZGF5T2ZZZWFyPWguZGF5T2ZZZWFyKX1mdW5jdGlvbiB3YShiKXtpZihiLl9mPT09YS5JU09fODYwMSlyZXR1cm4gdm9pZCBoYShiKTtiLl9hPVtdLGooYikuZW1wdHk9ITA7dmFyIGMsZCxlLGYsZyxoPVxcXCJcXFwiK2IuX2ksaT1oLmxlbmd0aCxrPTA7Zm9yKGU9TihiLl9mLGIuX2xvY2FsZSkubWF0Y2goJGMpfHxbXSxjPTA7YzxlLmxlbmd0aDtjKyspZj1lW2NdLGQ9KGgubWF0Y2goUChmLGIpKXx8W10pWzBdLGQmJihnPWguc3Vic3RyKDAsaC5pbmRleE9mKGQpKSxnLmxlbmd0aD4wJiZqKGIpLnVudXNlZElucHV0LnB1c2goZyksaD1oLnNsaWNlKGguaW5kZXhPZihkKStkLmxlbmd0aCksays9ZC5sZW5ndGgpLGJkW2ZdPyhkP2ooYikuZW1wdHk9ITE6aihiKS51bnVzZWRUb2tlbnMucHVzaChmKSxVKGYsZCxiKSk6Yi5fc3RyaWN0JiYhZCYmaihiKS51bnVzZWRUb2tlbnMucHVzaChmKTtqKGIpLmNoYXJzTGVmdE92ZXI9aS1rLGgubGVuZ3RoPjAmJmooYikudW51c2VkSW5wdXQucHVzaChoKSxqKGIpLmJpZ0hvdXI9PT0hMCYmYi5fYVt5ZF08PTEyJiZiLl9hW3lkXT4wJiYoaihiKS5iaWdIb3VyPXZvaWQgMCksYi5fYVt5ZF09eGEoYi5fbG9jYWxlLGIuX2FbeWRdLGIuX21lcmlkaWVtKSx1YShiKSxkYShiKX1mdW5jdGlvbiB4YShhLGIsYyl7dmFyIGQ7cmV0dXJuIG51bGw9PWM/YjpudWxsIT1hLm1lcmlkaWVtSG91cj9hLm1lcmlkaWVtSG91cihiLGMpOm51bGwhPWEuaXNQTT8oZD1hLmlzUE0oYyksZCYmMTI+YiYmKGIrPTEyKSxkfHwxMiE9PWJ8fChiPTApLGIpOmJ9ZnVuY3Rpb24geWEoYSl7dmFyIGIsYyxkLGUsZjtpZigwPT09YS5fZi5sZW5ndGgpcmV0dXJuIGooYSkuaW52YWxpZEZvcm1hdD0hMCx2b2lkKGEuX2Q9bmV3IERhdGUoTmFOKSk7Zm9yKGU9MDtlPGEuX2YubGVuZ3RoO2UrKylmPTAsYj1uKHt9LGEpLG51bGwhPWEuX3VzZVVUQyYmKGIuX3VzZVVUQz1hLl91c2VVVEMpLGIuX2Y9YS5fZltlXSx3YShiKSxrKGIpJiYoZis9aihiKS5jaGFyc0xlZnRPdmVyLGYrPTEwKmooYikudW51c2VkVG9rZW5zLmxlbmd0aCxqKGIpLnNjb3JlPWYsKG51bGw9PWR8fGQ+ZikmJihkPWYsYz1iKSk7ZyhhLGN8fGIpfWZ1bmN0aW9uIHphKGEpe2lmKCFhLl9kKXt2YXIgYj1DKGEuX2kpO2EuX2E9ZShbYi55ZWFyLGIubW9udGgsYi5kYXl8fGIuZGF0ZSxiLmhvdXIsYi5taW51dGUsYi5zZWNvbmQsYi5taWxsaXNlY29uZF0sZnVuY3Rpb24oYSl7cmV0dXJuIGEmJnBhcnNlSW50KGEsMTApfSksdWEoYSl9fWZ1bmN0aW9uIEFhKGEpe3ZhciBiPW5ldyBvKGRhKEJhKGEpKSk7cmV0dXJuIGIuX25leHREYXkmJihiLmFkZCgxLFxcXCJkXFxcIiksYi5fbmV4dERheT12b2lkIDApLGJ9ZnVuY3Rpb24gQmEoYSl7dmFyIGI9YS5faSxlPWEuX2Y7cmV0dXJuIGEuX2xvY2FsZT1hLl9sb2NhbGV8fHooYS5fbCksbnVsbD09PWJ8fHZvaWQgMD09PWUmJlxcXCJcXFwiPT09Yj9sKHtudWxsSW5wdXQ6ITB9KTooXFxcInN0cmluZ1xcXCI9PXR5cGVvZiBiJiYoYS5faT1iPWEuX2xvY2FsZS5wcmVwYXJzZShiKSkscChiKT9uZXcgbyhkYShiKSk6KGMoZSk/eWEoYSk6ZT93YShhKTpkKGIpP2EuX2Q9YjpDYShhKSxrKGEpfHwoYS5fZD1udWxsKSxhKSl9ZnVuY3Rpb24gQ2EoYil7dmFyIGY9Yi5faTt2b2lkIDA9PT1mP2IuX2Q9bmV3IERhdGUoYS5ub3coKSk6ZChmKT9iLl9kPW5ldyBEYXRlKCtmKTpcXFwic3RyaW5nXFxcIj09dHlwZW9mIGY/aWEoYik6YyhmKT8oYi5fYT1lKGYuc2xpY2UoMCksZnVuY3Rpb24oYSl7cmV0dXJuIHBhcnNlSW50KGEsMTApfSksdWEoYikpOlxcXCJvYmplY3RcXFwiPT10eXBlb2YgZj96YShiKTpcXFwibnVtYmVyXFxcIj09dHlwZW9mIGY/Yi5fZD1uZXcgRGF0ZShmKTphLmNyZWF0ZUZyb21JbnB1dEZhbGxiYWNrKGIpfWZ1bmN0aW9uIERhKGEsYixjLGQsZSl7dmFyIGY9e307cmV0dXJuXFxcImJvb2xlYW5cXFwiPT10eXBlb2YgYyYmKGQ9YyxjPXZvaWQgMCksZi5faXNBTW9tZW50T2JqZWN0PSEwLGYuX3VzZVVUQz1mLl9pc1VUQz1lLGYuX2w9YyxmLl9pPWEsZi5fZj1iLGYuX3N0cmljdD1kLEFhKGYpfWZ1bmN0aW9uIEVhKGEsYixjLGQpe3JldHVybiBEYShhLGIsYyxkLCExKX1mdW5jdGlvbiBGYShhLGIpe3ZhciBkLGU7aWYoMT09PWIubGVuZ3RoJiZjKGJbMF0pJiYoYj1iWzBdKSwhYi5sZW5ndGgpcmV0dXJuIEVhKCk7Zm9yKGQ9YlswXSxlPTE7ZTxiLmxlbmd0aDsrK2UpKCFiW2VdLmlzVmFsaWQoKXx8YltlXVthXShkKSkmJihkPWJbZV0pO3JldHVybiBkfWZ1bmN0aW9uIEdhKCl7dmFyIGE9W10uc2xpY2UuY2FsbChhcmd1bWVudHMsMCk7cmV0dXJuIEZhKFxcXCJpc0JlZm9yZVxcXCIsYSl9ZnVuY3Rpb24gSGEoKXt2YXIgYT1bXS5zbGljZS5jYWxsKGFyZ3VtZW50cywwKTtyZXR1cm4gRmEoXFxcImlzQWZ0ZXJcXFwiLGEpfWZ1bmN0aW9uIElhKGEpe3ZhciBiPUMoYSksYz1iLnllYXJ8fDAsZD1iLnF1YXJ0ZXJ8fDAsZT1iLm1vbnRofHwwLGY9Yi53ZWVrfHwwLGc9Yi5kYXl8fDAsaD1iLmhvdXJ8fDAsaT1iLm1pbnV0ZXx8MCxqPWIuc2Vjb25kfHwwLGs9Yi5taWxsaXNlY29uZHx8MDt0aGlzLl9taWxsaXNlY29uZHM9K2srMWUzKmorNmU0KmkrMzZlNSpoLHRoaXMuX2RheXM9K2crNypmLHRoaXMuX21vbnRocz0rZSszKmQrMTIqYyx0aGlzLl9kYXRhPXt9LHRoaXMuX2xvY2FsZT16KCksdGhpcy5fYnViYmxlKCl9ZnVuY3Rpb24gSmEoYSl7cmV0dXJuIGEgaW5zdGFuY2VvZiBJYX1mdW5jdGlvbiBLYShhLGIpe0ooYSwwLDAsZnVuY3Rpb24oKXt2YXIgYT10aGlzLnV0Y09mZnNldCgpLGM9XFxcIitcXFwiO3JldHVybiAwPmEmJihhPS1hLGM9XFxcIi1cXFwiKSxjK0kofn4oYS82MCksMikrYitJKH5+YSU2MCwyKX0pfWZ1bmN0aW9uIExhKGEsYil7dmFyIGM9KGJ8fFxcXCJcXFwiKS5tYXRjaChhKXx8W10sZD1jW2MubGVuZ3RoLTFdfHxbXSxlPShkK1xcXCJcXFwiKS5tYXRjaChVZCl8fFtcXFwiLVxcXCIsMCwwXSxmPSsoNjAqZVsxXSkrcihlWzJdKTtyZXR1cm5cXFwiK1xcXCI9PT1lWzBdP2Y6LWZ9ZnVuY3Rpb24gTWEoYixjKXt2YXIgZSxmO3JldHVybiBjLl9pc1VUQz8oZT1jLmNsb25lKCksZj0ocChiKXx8ZChiKT8rYjorRWEoYikpLStlLGUuX2Quc2V0VGltZSgrZS5fZCtmKSxhLnVwZGF0ZU9mZnNldChlLCExKSxlKTpFYShiKS5sb2NhbCgpfWZ1bmN0aW9uIE5hKGEpe3JldHVybiAxNSotTWF0aC5yb3VuZChhLl9kLmdldFRpbWV6b25lT2Zmc2V0KCkvMTUpfWZ1bmN0aW9uIE9hKGIsYyl7dmFyIGQsZT10aGlzLl9vZmZzZXR8fDA7cmV0dXJuIHRoaXMuaXNWYWxpZCgpP251bGwhPWI/KFxcXCJzdHJpbmdcXFwiPT10eXBlb2YgYj9iPUxhKHFkLGIpOk1hdGguYWJzKGIpPDE2JiYoYj02MCpiKSwhdGhpcy5faXNVVEMmJmMmJihkPU5hKHRoaXMpKSx0aGlzLl9vZmZzZXQ9Yix0aGlzLl9pc1VUQz0hMCxudWxsIT1kJiZ0aGlzLmFkZChkLFxcXCJtXFxcIiksZSE9PWImJighY3x8dGhpcy5fY2hhbmdlSW5Qcm9ncmVzcz9jYih0aGlzLFphKGItZSxcXFwibVxcXCIpLDEsITEpOnRoaXMuX2NoYW5nZUluUHJvZ3Jlc3N8fCh0aGlzLl9jaGFuZ2VJblByb2dyZXNzPSEwLGEudXBkYXRlT2Zmc2V0KHRoaXMsITApLHRoaXMuX2NoYW5nZUluUHJvZ3Jlc3M9bnVsbCkpLHRoaXMpOnRoaXMuX2lzVVRDP2U6TmEodGhpcyk6bnVsbCE9Yj90aGlzOk5hTn1mdW5jdGlvbiBQYShhLGIpe3JldHVybiBudWxsIT1hPyhcXFwic3RyaW5nXFxcIiE9dHlwZW9mIGEmJihhPS1hKSx0aGlzLnV0Y09mZnNldChhLGIpLHRoaXMpOi10aGlzLnV0Y09mZnNldCgpfWZ1bmN0aW9uIFFhKGEpe3JldHVybiB0aGlzLnV0Y09mZnNldCgwLGEpfWZ1bmN0aW9uIFJhKGEpe3JldHVybiB0aGlzLl9pc1VUQyYmKHRoaXMudXRjT2Zmc2V0KDAsYSksdGhpcy5faXNVVEM9ITEsYSYmdGhpcy5zdWJ0cmFjdChOYSh0aGlzKSxcXFwibVxcXCIpKSx0aGlzfWZ1bmN0aW9uIFNhKCl7cmV0dXJuIHRoaXMuX3R6bT90aGlzLnV0Y09mZnNldCh0aGlzLl90em0pOlxcXCJzdHJpbmdcXFwiPT10eXBlb2YgdGhpcy5faSYmdGhpcy51dGNPZmZzZXQoTGEocGQsdGhpcy5faSkpLHRoaXN9ZnVuY3Rpb24gVGEoYSl7cmV0dXJuIHRoaXMuaXNWYWxpZCgpPyhhPWE/RWEoYSkudXRjT2Zmc2V0KCk6MCwodGhpcy51dGNPZmZzZXQoKS1hKSU2MD09PTApOiExfWZ1bmN0aW9uIFVhKCl7cmV0dXJuIHRoaXMudXRjT2Zmc2V0KCk+dGhpcy5jbG9uZSgpLm1vbnRoKDApLnV0Y09mZnNldCgpfHx0aGlzLnV0Y09mZnNldCgpPnRoaXMuY2xvbmUoKS5tb250aCg1KS51dGNPZmZzZXQoKX1mdW5jdGlvbiBWYSgpe2lmKCFtKHRoaXMuX2lzRFNUU2hpZnRlZCkpcmV0dXJuIHRoaXMuX2lzRFNUU2hpZnRlZDt2YXIgYT17fTtpZihuKGEsdGhpcyksYT1CYShhKSxhLl9hKXt2YXIgYj1hLl9pc1VUQz9oKGEuX2EpOkVhKGEuX2EpO3RoaXMuX2lzRFNUU2hpZnRlZD10aGlzLmlzVmFsaWQoKSYmcyhhLl9hLGIudG9BcnJheSgpKT4wfWVsc2UgdGhpcy5faXNEU1RTaGlmdGVkPSExO3JldHVybiB0aGlzLl9pc0RTVFNoaWZ0ZWR9ZnVuY3Rpb24gV2EoKXtyZXR1cm4gdGhpcy5pc1ZhbGlkKCk/IXRoaXMuX2lzVVRDOiExfWZ1bmN0aW9uIFhhKCl7cmV0dXJuIHRoaXMuaXNWYWxpZCgpP3RoaXMuX2lzVVRDOiExfWZ1bmN0aW9uIFlhKCl7cmV0dXJuIHRoaXMuaXNWYWxpZCgpP3RoaXMuX2lzVVRDJiYwPT09dGhpcy5fb2Zmc2V0OiExfWZ1bmN0aW9uIFphKGEsYil7dmFyIGMsZCxlLGc9YSxoPW51bGw7cmV0dXJuIEphKGEpP2c9e21zOmEuX21pbGxpc2Vjb25kcyxkOmEuX2RheXMsTTphLl9tb250aHN9OlxcXCJudW1iZXJcXFwiPT10eXBlb2YgYT8oZz17fSxiP2dbYl09YTpnLm1pbGxpc2Vjb25kcz1hKTooaD1WZC5leGVjKGEpKT8oYz1cXFwiLVxcXCI9PT1oWzFdPy0xOjEsZz17eTowLGQ6cihoW3hkXSkqYyxoOnIoaFt5ZF0pKmMsbTpyKGhbemRdKSpjLHM6cihoW0FkXSkqYyxtczpyKGhbQmRdKSpjfSk6KGg9V2QuZXhlYyhhKSk/KGM9XFxcIi1cXFwiPT09aFsxXT8tMToxLGc9e3k6JGEoaFsyXSxjKSxNOiRhKGhbM10sYyksZDokYShoWzRdLGMpLGg6JGEoaFs1XSxjKSxtOiRhKGhbNl0sYyksczokYShoWzddLGMpLHc6JGEoaFs4XSxjKX0pOm51bGw9PWc/Zz17fTpcXFwib2JqZWN0XFxcIj09dHlwZW9mIGcmJihcXFwiZnJvbVxcXCJpbiBnfHxcXFwidG9cXFwiaW4gZykmJihlPWFiKEVhKGcuZnJvbSksRWEoZy50bykpLGc9e30sZy5tcz1lLm1pbGxpc2Vjb25kcyxnLk09ZS5tb250aHMpLGQ9bmV3IElhKGcpLEphKGEpJiZmKGEsXFxcIl9sb2NhbGVcXFwiKSYmKGQuX2xvY2FsZT1hLl9sb2NhbGUpLGR9ZnVuY3Rpb24gJGEoYSxiKXt2YXIgYz1hJiZwYXJzZUZsb2F0KGEucmVwbGFjZShcXFwiLFxcXCIsXFxcIi5cXFwiKSk7cmV0dXJuKGlzTmFOKGMpPzA6YykqYn1mdW5jdGlvbiBfYShhLGIpe3ZhciBjPXttaWxsaXNlY29uZHM6MCxtb250aHM6MH07cmV0dXJuIGMubW9udGhzPWIubW9udGgoKS1hLm1vbnRoKCkrMTIqKGIueWVhcigpLWEueWVhcigpKSxhLmNsb25lKCkuYWRkKGMubW9udGhzLFxcXCJNXFxcIikuaXNBZnRlcihiKSYmLS1jLm1vbnRocyxjLm1pbGxpc2Vjb25kcz0rYi0rYS5jbG9uZSgpLmFkZChjLm1vbnRocyxcXFwiTVxcXCIpLGN9ZnVuY3Rpb24gYWIoYSxiKXt2YXIgYztyZXR1cm4gYS5pc1ZhbGlkKCkmJmIuaXNWYWxpZCgpPyhiPU1hKGIsYSksYS5pc0JlZm9yZShiKT9jPV9hKGEsYik6KGM9X2EoYixhKSxjLm1pbGxpc2Vjb25kcz0tYy5taWxsaXNlY29uZHMsYy5tb250aHM9LWMubW9udGhzKSxjKTp7bWlsbGlzZWNvbmRzOjAsbW9udGhzOjB9fWZ1bmN0aW9uIGJiKGEsYil7cmV0dXJuIGZ1bmN0aW9uKGMsZCl7dmFyIGUsZjtyZXR1cm4gbnVsbD09PWR8fGlzTmFOKCtkKXx8KGdhKGIsXFxcIm1vbWVudCgpLlxcXCIrYitcXFwiKHBlcmlvZCwgbnVtYmVyKSBpcyBkZXByZWNhdGVkLiBQbGVhc2UgdXNlIG1vbWVudCgpLlxcXCIrYitcXFwiKG51bWJlciwgcGVyaW9kKS5cXFwiKSxmPWMsYz1kLGQ9ZiksYz1cXFwic3RyaW5nXFxcIj09dHlwZW9mIGM/K2M6YyxlPVphKGMsZCksY2IodGhpcyxlLGEpLHRoaXN9fWZ1bmN0aW9uIGNiKGIsYyxkLGUpe3ZhciBmPWMuX21pbGxpc2Vjb25kcyxnPWMuX2RheXMsaD1jLl9tb250aHM7Yi5pc1ZhbGlkKCkmJihlPW51bGw9PWU/ITA6ZSxmJiZiLl9kLnNldFRpbWUoK2IuX2QrZipkKSxnJiZHKGIsXFxcIkRhdGVcXFwiLEYoYixcXFwiRGF0ZVxcXCIpK2cqZCksaCYmWihiLEYoYixcXFwiTW9udGhcXFwiKStoKmQpLGUmJmEudXBkYXRlT2Zmc2V0KGIsZ3x8aCkpfWZ1bmN0aW9uIGRiKGEsYil7dmFyIGM9YXx8RWEoKSxkPU1hKGMsdGhpcykuc3RhcnRPZihcXFwiZGF5XFxcIiksZT10aGlzLmRpZmYoZCxcXFwiZGF5c1xcXCIsITApLGY9LTY+ZT9cXFwic2FtZUVsc2VcXFwiOi0xPmU/XFxcImxhc3RXZWVrXFxcIjowPmU/XFxcImxhc3REYXlcXFwiOjE+ZT9cXFwic2FtZURheVxcXCI6Mj5lP1xcXCJuZXh0RGF5XFxcIjo3PmU/XFxcIm5leHRXZWVrXFxcIjpcXFwic2FtZUVsc2VcXFwiLGc9YiYmKEQoYltmXSk/YltmXSgpOmJbZl0pO3JldHVybiB0aGlzLmZvcm1hdChnfHx0aGlzLmxvY2FsZURhdGEoKS5jYWxlbmRhcihmLHRoaXMsRWEoYykpKX1mdW5jdGlvbiBlYigpe3JldHVybiBuZXcgbyh0aGlzKX1mdW5jdGlvbiBmYihhLGIpe3ZhciBjPXAoYSk/YTpFYShhKTtyZXR1cm4gdGhpcy5pc1ZhbGlkKCkmJmMuaXNWYWxpZCgpPyhiPUIobShiKT9cXFwibWlsbGlzZWNvbmRcXFwiOmIpLFxcXCJtaWxsaXNlY29uZFxcXCI9PT1iPyt0aGlzPitjOitjPCt0aGlzLmNsb25lKCkuc3RhcnRPZihiKSk6ITF9ZnVuY3Rpb24gZ2IoYSxiKXt2YXIgYz1wKGEpP2E6RWEoYSk7cmV0dXJuIHRoaXMuaXNWYWxpZCgpJiZjLmlzVmFsaWQoKT8oYj1CKG0oYik/XFxcIm1pbGxpc2Vjb25kXFxcIjpiKSxcXFwibWlsbGlzZWNvbmRcXFwiPT09Yj8rYz4rdGhpczordGhpcy5jbG9uZSgpLmVuZE9mKGIpPCtjKTohMX1mdW5jdGlvbiBoYihhLGIsYyl7cmV0dXJuIHRoaXMuaXNBZnRlcihhLGMpJiZ0aGlzLmlzQmVmb3JlKGIsYyl9ZnVuY3Rpb24gaWIoYSxiKXt2YXIgYyxkPXAoYSk/YTpFYShhKTtyZXR1cm4gdGhpcy5pc1ZhbGlkKCkmJmQuaXNWYWxpZCgpPyhiPUIoYnx8XFxcIm1pbGxpc2Vjb25kXFxcIiksXFxcIm1pbGxpc2Vjb25kXFxcIj09PWI/K3RoaXM9PT0rZDooYz0rZCwrdGhpcy5jbG9uZSgpLnN0YXJ0T2YoYik8PWMmJmM8PSt0aGlzLmNsb25lKCkuZW5kT2YoYikpKTohMX1mdW5jdGlvbiBqYihhLGIpe3JldHVybiB0aGlzLmlzU2FtZShhLGIpfHx0aGlzLmlzQWZ0ZXIoYSxiKX1mdW5jdGlvbiBrYihhLGIpe3JldHVybiB0aGlzLmlzU2FtZShhLGIpfHx0aGlzLmlzQmVmb3JlKGEsYil9ZnVuY3Rpb24gbGIoYSxiLGMpe3ZhciBkLGUsZixnO3JldHVybiB0aGlzLmlzVmFsaWQoKT8oZD1NYShhLHRoaXMpLGQuaXNWYWxpZCgpPyhlPTZlNCooZC51dGNPZmZzZXQoKS10aGlzLnV0Y09mZnNldCgpKSxiPUIoYiksXFxcInllYXJcXFwiPT09Ynx8XFxcIm1vbnRoXFxcIj09PWJ8fFxcXCJxdWFydGVyXFxcIj09PWI/KGc9bWIodGhpcyxkKSxcXFwicXVhcnRlclxcXCI9PT1iP2cvPTM6XFxcInllYXJcXFwiPT09YiYmKGcvPTEyKSk6KGY9dGhpcy1kLGc9XFxcInNlY29uZFxcXCI9PT1iP2YvMWUzOlxcXCJtaW51dGVcXFwiPT09Yj9mLzZlNDpcXFwiaG91clxcXCI9PT1iP2YvMzZlNTpcXFwiZGF5XFxcIj09PWI/KGYtZSkvODY0ZTU6XFxcIndlZWtcXFwiPT09Yj8oZi1lKS82MDQ4ZTU6ZiksYz9nOnEoZykpOk5hTik6TmFOfWZ1bmN0aW9uIG1iKGEsYil7dmFyIGMsZCxlPTEyKihiLnllYXIoKS1hLnllYXIoKSkrKGIubW9udGgoKS1hLm1vbnRoKCkpLGY9YS5jbG9uZSgpLmFkZChlLFxcXCJtb250aHNcXFwiKTtyZXR1cm4gMD5iLWY/KGM9YS5jbG9uZSgpLmFkZChlLTEsXFxcIm1vbnRoc1xcXCIpLGQ9KGItZikvKGYtYykpOihjPWEuY2xvbmUoKS5hZGQoZSsxLFxcXCJtb250aHNcXFwiKSxkPShiLWYpLyhjLWYpKSwtKGUrZCl9ZnVuY3Rpb24gbmIoKXtyZXR1cm4gdGhpcy5jbG9uZSgpLmxvY2FsZShcXFwiZW5cXFwiKS5mb3JtYXQoXFxcImRkZCBNTU0gREQgWVlZWSBISDptbTpzcyBbR01UXVpaXFxcIil9ZnVuY3Rpb24gb2IoKXt2YXIgYT10aGlzLmNsb25lKCkudXRjKCk7cmV0dXJuIDA8YS55ZWFyKCkmJmEueWVhcigpPD05OTk5P0QoRGF0ZS5wcm90b3R5cGUudG9JU09TdHJpbmcpP3RoaXMudG9EYXRlKCkudG9JU09TdHJpbmcoKTpNKGEsXFxcIllZWVktTU0tRERbVF1ISDptbTpzcy5TU1NbWl1cXFwiKTpNKGEsXFxcIllZWVlZWS1NTS1ERFtUXUhIOm1tOnNzLlNTU1taXVxcXCIpfWZ1bmN0aW9uIHBiKGIpe3ZhciBjPU0odGhpcyxifHxhLmRlZmF1bHRGb3JtYXQpO3JldHVybiB0aGlzLmxvY2FsZURhdGEoKS5wb3N0Zm9ybWF0KGMpfWZ1bmN0aW9uIHFiKGEsYil7cmV0dXJuIHRoaXMuaXNWYWxpZCgpJiYocChhKSYmYS5pc1ZhbGlkKCl8fEVhKGEpLmlzVmFsaWQoKSk/WmEoe3RvOnRoaXMsZnJvbTphfSkubG9jYWxlKHRoaXMubG9jYWxlKCkpLmh1bWFuaXplKCFiKTp0aGlzLmxvY2FsZURhdGEoKS5pbnZhbGlkRGF0ZSgpfWZ1bmN0aW9uIHJiKGEpe3JldHVybiB0aGlzLmZyb20oRWEoKSxhKX1mdW5jdGlvbiBzYihhLGIpe3JldHVybiB0aGlzLmlzVmFsaWQoKSYmKHAoYSkmJmEuaXNWYWxpZCgpfHxFYShhKS5pc1ZhbGlkKCkpP1phKHtmcm9tOnRoaXMsdG86YX0pLmxvY2FsZSh0aGlzLmxvY2FsZSgpKS5odW1hbml6ZSghYik6dGhpcy5sb2NhbGVEYXRhKCkuaW52YWxpZERhdGUoKX1mdW5jdGlvbiB0YihhKXtyZXR1cm4gdGhpcy50byhFYSgpLGEpfWZ1bmN0aW9uIHViKGEpe3ZhciBiO3JldHVybiB2b2lkIDA9PT1hP3RoaXMuX2xvY2FsZS5fYWJicjooYj16KGEpLG51bGwhPWImJih0aGlzLl9sb2NhbGU9YiksdGhpcyl9ZnVuY3Rpb24gdmIoKXtyZXR1cm4gdGhpcy5fbG9jYWxlfWZ1bmN0aW9uIHdiKGEpe3N3aXRjaChhPUIoYSkpe2Nhc2VcXFwieWVhclxcXCI6dGhpcy5tb250aCgwKTtjYXNlXFxcInF1YXJ0ZXJcXFwiOmNhc2VcXFwibW9udGhcXFwiOnRoaXMuZGF0ZSgxKTtjYXNlXFxcIndlZWtcXFwiOmNhc2VcXFwiaXNvV2Vla1xcXCI6Y2FzZVxcXCJkYXlcXFwiOnRoaXMuaG91cnMoMCk7Y2FzZVxcXCJob3VyXFxcIjp0aGlzLm1pbnV0ZXMoMCk7Y2FzZVxcXCJtaW51dGVcXFwiOnRoaXMuc2Vjb25kcygwKTtjYXNlXFxcInNlY29uZFxcXCI6dGhpcy5taWxsaXNlY29uZHMoMCl9cmV0dXJuXFxcIndlZWtcXFwiPT09YSYmdGhpcy53ZWVrZGF5KDApLFxcXCJpc29XZWVrXFxcIj09PWEmJnRoaXMuaXNvV2Vla2RheSgxKSxcXFwicXVhcnRlclxcXCI9PT1hJiZ0aGlzLm1vbnRoKDMqTWF0aC5mbG9vcih0aGlzLm1vbnRoKCkvMykpLHRoaXN9ZnVuY3Rpb24geGIoYSl7cmV0dXJuIGE9QihhKSx2b2lkIDA9PT1hfHxcXFwibWlsbGlzZWNvbmRcXFwiPT09YT90aGlzOnRoaXMuc3RhcnRPZihhKS5hZGQoMSxcXFwiaXNvV2Vla1xcXCI9PT1hP1xcXCJ3ZWVrXFxcIjphKS5zdWJ0cmFjdCgxLFxcXCJtc1xcXCIpfWZ1bmN0aW9uIHliKCl7cmV0dXJuK3RoaXMuX2QtNmU0Kih0aGlzLl9vZmZzZXR8fDApfWZ1bmN0aW9uIHpiKCl7cmV0dXJuIE1hdGguZmxvb3IoK3RoaXMvMWUzKX1mdW5jdGlvbiBBYigpe3JldHVybiB0aGlzLl9vZmZzZXQ/bmV3IERhdGUoK3RoaXMpOnRoaXMuX2R9ZnVuY3Rpb24gQmIoKXt2YXIgYT10aGlzO3JldHVyblthLnllYXIoKSxhLm1vbnRoKCksYS5kYXRlKCksYS5ob3VyKCksYS5taW51dGUoKSxhLnNlY29uZCgpLGEubWlsbGlzZWNvbmQoKV19ZnVuY3Rpb24gQ2IoKXt2YXIgYT10aGlzO3JldHVybnt5ZWFyczphLnllYXIoKSxtb250aHM6YS5tb250aCgpLGRhdGU6YS5kYXRlKCksaG91cnM6YS5ob3VycygpLG1pbnV0ZXM6YS5taW51dGVzKCksc2Vjb25kczphLnNlY29uZHMoKSxtaWxsaXNlY29uZHM6YS5taWxsaXNlY29uZHMoKX19ZnVuY3Rpb24gRGIoKXtyZXR1cm4gdGhpcy5pc1ZhbGlkKCk/dGhpcy50b0lTT1N0cmluZygpOlxcXCJudWxsXFxcIn1mdW5jdGlvbiBFYigpe3JldHVybiBrKHRoaXMpfWZ1bmN0aW9uIEZiKCl7cmV0dXJuIGcoe30saih0aGlzKSl9ZnVuY3Rpb24gR2IoKXtyZXR1cm4gaih0aGlzKS5vdmVyZmxvd31mdW5jdGlvbiBIYigpe3JldHVybntpbnB1dDp0aGlzLl9pLGZvcm1hdDp0aGlzLl9mLGxvY2FsZTp0aGlzLl9sb2NhbGUsaXNVVEM6dGhpcy5faXNVVEMsc3RyaWN0OnRoaXMuX3N0cmljdH19ZnVuY3Rpb24gSWIoYSxiKXtKKDAsW2EsYS5sZW5ndGhdLDAsYil9ZnVuY3Rpb24gSmIoYSl7cmV0dXJuIE5iLmNhbGwodGhpcyxhLHRoaXMud2VlaygpLHRoaXMud2Vla2RheSgpLHRoaXMubG9jYWxlRGF0YSgpLl93ZWVrLmRvdyx0aGlzLmxvY2FsZURhdGEoKS5fd2Vlay5kb3kpfWZ1bmN0aW9uIEtiKGEpe3JldHVybiBOYi5jYWxsKHRoaXMsYSx0aGlzLmlzb1dlZWsoKSx0aGlzLmlzb1dlZWtkYXkoKSwxLDQpfWZ1bmN0aW9uIExiKCl7cmV0dXJuIHJhKHRoaXMueWVhcigpLDEsNCl9ZnVuY3Rpb24gTWIoKXt2YXIgYT10aGlzLmxvY2FsZURhdGEoKS5fd2VlaztyZXR1cm4gcmEodGhpcy55ZWFyKCksYS5kb3csYS5kb3kpfWZ1bmN0aW9uIE5iKGEsYixjLGQsZSl7dmFyIGY7cmV0dXJuIG51bGw9PWE/cWEodGhpcyxkLGUpLnllYXI6KGY9cmEoYSxkLGUpLGI+ZiYmKGI9ZiksT2IuY2FsbCh0aGlzLGEsYixjLGQsZSkpfWZ1bmN0aW9uIE9iKGEsYixjLGQsZSl7dmFyIGY9cGEoYSxiLGMsZCxlKSxnPWthKGYueWVhciwwLGYuZGF5T2ZZZWFyKTtyZXR1cm4gdGhpcy55ZWFyKGcuZ2V0VVRDRnVsbFllYXIoKSksdGhpcy5tb250aChnLmdldFVUQ01vbnRoKCkpLHRoaXMuZGF0ZShnLmdldFVUQ0RhdGUoKSksdGhpc31mdW5jdGlvbiBQYihhKXtyZXR1cm4gbnVsbD09YT9NYXRoLmNlaWwoKHRoaXMubW9udGgoKSsxKS8zKTp0aGlzLm1vbnRoKDMqKGEtMSkrdGhpcy5tb250aCgpJTMpfWZ1bmN0aW9uIFFiKGEpe3JldHVybiBxYShhLHRoaXMuX3dlZWsuZG93LHRoaXMuX3dlZWsuZG95KS53ZWVrfWZ1bmN0aW9uIFJiKCl7cmV0dXJuIHRoaXMuX3dlZWsuZG93fWZ1bmN0aW9uIFNiKCl7cmV0dXJuIHRoaXMuX3dlZWsuZG95fWZ1bmN0aW9uIFRiKGEpe3ZhciBiPXRoaXMubG9jYWxlRGF0YSgpLndlZWsodGhpcyk7cmV0dXJuIG51bGw9PWE/Yjp0aGlzLmFkZCg3KihhLWIpLFxcXCJkXFxcIil9ZnVuY3Rpb24gVWIoYSl7dmFyIGI9cWEodGhpcywxLDQpLndlZWs7cmV0dXJuIG51bGw9PWE/Yjp0aGlzLmFkZCg3KihhLWIpLFxcXCJkXFxcIil9ZnVuY3Rpb24gVmIoYSxiKXtyZXR1cm5cXFwic3RyaW5nXFxcIiE9dHlwZW9mIGE/YTppc05hTihhKT8oYT1iLndlZWtkYXlzUGFyc2UoYSksXFxcIm51bWJlclxcXCI9PXR5cGVvZiBhP2E6bnVsbCk6cGFyc2VJbnQoYSwxMCl9ZnVuY3Rpb24gV2IoYSxiKXtyZXR1cm4gYyh0aGlzLl93ZWVrZGF5cyk/dGhpcy5fd2Vla2RheXNbYS5kYXkoKV06dGhpcy5fd2Vla2RheXNbdGhpcy5fd2Vla2RheXMuaXNGb3JtYXQudGVzdChiKT9cXFwiZm9ybWF0XFxcIjpcXFwic3RhbmRhbG9uZVxcXCJdW2EuZGF5KCldfWZ1bmN0aW9uIFhiKGEpe3JldHVybiB0aGlzLl93ZWVrZGF5c1Nob3J0W2EuZGF5KCldfWZ1bmN0aW9uIFliKGEpe3JldHVybiB0aGlzLl93ZWVrZGF5c01pblthLmRheSgpXX1mdW5jdGlvbiBaYihhLGIsYyl7dmFyIGQsZSxmO2Zvcih0aGlzLl93ZWVrZGF5c1BhcnNlfHwodGhpcy5fd2Vla2RheXNQYXJzZT1bXSx0aGlzLl9taW5XZWVrZGF5c1BhcnNlPVtdLHRoaXMuX3Nob3J0V2Vla2RheXNQYXJzZT1bXSx0aGlzLl9mdWxsV2Vla2RheXNQYXJzZT1bXSksZD0wOzc+ZDtkKyspe2lmKGU9RWEoWzJlMywxXSkuZGF5KGQpLGMmJiF0aGlzLl9mdWxsV2Vla2RheXNQYXJzZVtkXSYmKHRoaXMuX2Z1bGxXZWVrZGF5c1BhcnNlW2RdPW5ldyBSZWdFeHAoXFxcIl5cXFwiK3RoaXMud2Vla2RheXMoZSxcXFwiXFxcIikucmVwbGFjZShcXFwiLlxcXCIsXFxcIi4/XFxcIikrXFxcIiRcXFwiLFxcXCJpXFxcIiksdGhpcy5fc2hvcnRXZWVrZGF5c1BhcnNlW2RdPW5ldyBSZWdFeHAoXFxcIl5cXFwiK3RoaXMud2Vla2RheXNTaG9ydChlLFxcXCJcXFwiKS5yZXBsYWNlKFxcXCIuXFxcIixcXFwiLj9cXFwiKStcXFwiJFxcXCIsXFxcImlcXFwiKSx0aGlzLl9taW5XZWVrZGF5c1BhcnNlW2RdPW5ldyBSZWdFeHAoXFxcIl5cXFwiK3RoaXMud2Vla2RheXNNaW4oZSxcXFwiXFxcIikucmVwbGFjZShcXFwiLlxcXCIsXFxcIi4/XFxcIikrXFxcIiRcXFwiLFxcXCJpXFxcIikpLHRoaXMuX3dlZWtkYXlzUGFyc2VbZF18fChmPVxcXCJeXFxcIit0aGlzLndlZWtkYXlzKGUsXFxcIlxcXCIpK1xcXCJ8XlxcXCIrdGhpcy53ZWVrZGF5c1Nob3J0KGUsXFxcIlxcXCIpK1xcXCJ8XlxcXCIrdGhpcy53ZWVrZGF5c01pbihlLFxcXCJcXFwiKSx0aGlzLl93ZWVrZGF5c1BhcnNlW2RdPW5ldyBSZWdFeHAoZi5yZXBsYWNlKFxcXCIuXFxcIixcXFwiXFxcIiksXFxcImlcXFwiKSksYyYmXFxcImRkZGRcXFwiPT09YiYmdGhpcy5fZnVsbFdlZWtkYXlzUGFyc2VbZF0udGVzdChhKSlyZXR1cm4gZDtpZihjJiZcXFwiZGRkXFxcIj09PWImJnRoaXMuX3Nob3J0V2Vla2RheXNQYXJzZVtkXS50ZXN0KGEpKXJldHVybiBkO2lmKGMmJlxcXCJkZFxcXCI9PT1iJiZ0aGlzLl9taW5XZWVrZGF5c1BhcnNlW2RdLnRlc3QoYSkpcmV0dXJuIGQ7aWYoIWMmJnRoaXMuX3dlZWtkYXlzUGFyc2VbZF0udGVzdChhKSlyZXR1cm4gZH19ZnVuY3Rpb24gJGIoYSl7aWYoIXRoaXMuaXNWYWxpZCgpKXJldHVybiBudWxsIT1hP3RoaXM6TmFOO3ZhciBiPXRoaXMuX2lzVVRDP3RoaXMuX2QuZ2V0VVRDRGF5KCk6dGhpcy5fZC5nZXREYXkoKTtyZXR1cm4gbnVsbCE9YT8oYT1WYihhLHRoaXMubG9jYWxlRGF0YSgpKSx0aGlzLmFkZChhLWIsXFxcImRcXFwiKSk6Yn1mdW5jdGlvbiBfYihhKXtpZighdGhpcy5pc1ZhbGlkKCkpcmV0dXJuIG51bGwhPWE/dGhpczpOYU47dmFyIGI9KHRoaXMuZGF5KCkrNy10aGlzLmxvY2FsZURhdGEoKS5fd2Vlay5kb3cpJTc7cmV0dXJuIG51bGw9PWE/Yjp0aGlzLmFkZChhLWIsXFxcImRcXFwiKX1mdW5jdGlvbiBhYyhhKXtyZXR1cm4gdGhpcy5pc1ZhbGlkKCk/bnVsbD09YT90aGlzLmRheSgpfHw3OnRoaXMuZGF5KHRoaXMuZGF5KCklNz9hOmEtNyk6bnVsbCE9YT90aGlzOk5hTn1mdW5jdGlvbiBiYyhhKXt2YXIgYj1NYXRoLnJvdW5kKCh0aGlzLmNsb25lKCkuc3RhcnRPZihcXFwiZGF5XFxcIiktdGhpcy5jbG9uZSgpLnN0YXJ0T2YoXFxcInllYXJcXFwiKSkvODY0ZTUpKzE7cmV0dXJuIG51bGw9PWE/Yjp0aGlzLmFkZChhLWIsXFxcImRcXFwiKX1mdW5jdGlvbiBjYygpe3JldHVybiB0aGlzLmhvdXJzKCklMTJ8fDEyfWZ1bmN0aW9uIGRjKGEsYil7SihhLDAsMCxmdW5jdGlvbigpe3JldHVybiB0aGlzLmxvY2FsZURhdGEoKS5tZXJpZGllbSh0aGlzLmhvdXJzKCksdGhpcy5taW51dGVzKCksYil9KX1mdW5jdGlvbiBlYyhhLGIpe3JldHVybiBiLl9tZXJpZGllbVBhcnNlfWZ1bmN0aW9uIGZjKGEpe3JldHVyblxcXCJwXFxcIj09PShhK1xcXCJcXFwiKS50b0xvd2VyQ2FzZSgpLmNoYXJBdCgwKX1mdW5jdGlvbiBnYyhhLGIsYyl7cmV0dXJuIGE+MTE/Yz9cXFwicG1cXFwiOlxcXCJQTVxcXCI6Yz9cXFwiYW1cXFwiOlxcXCJBTVxcXCJ9ZnVuY3Rpb24gaGMoYSxiKXtiW0JkXT1yKDFlMyooXFxcIjAuXFxcIithKSl9ZnVuY3Rpb24gaWMoKXtyZXR1cm4gdGhpcy5faXNVVEM/XFxcIlVUQ1xcXCI6XFxcIlxcXCJ9ZnVuY3Rpb24gamMoKXtyZXR1cm4gdGhpcy5faXNVVEM/XFxcIkNvb3JkaW5hdGVkIFVuaXZlcnNhbCBUaW1lXFxcIjpcXFwiXFxcIn1mdW5jdGlvbiBrYyhhKXtyZXR1cm4gRWEoMWUzKmEpfWZ1bmN0aW9uIGxjKCl7cmV0dXJuIEVhLmFwcGx5KG51bGwsYXJndW1lbnRzKS5wYXJzZVpvbmUoKX1mdW5jdGlvbiBtYyhhLGIsYyl7dmFyIGQ9dGhpcy5fY2FsZW5kYXJbYV07cmV0dXJuIEQoZCk/ZC5jYWxsKGIsYyk6ZH1mdW5jdGlvbiBuYyhhKXt2YXIgYj10aGlzLl9sb25nRGF0ZUZvcm1hdFthXSxjPXRoaXMuX2xvbmdEYXRlRm9ybWF0W2EudG9VcHBlckNhc2UoKV07cmV0dXJuIGJ8fCFjP2I6KHRoaXMuX2xvbmdEYXRlRm9ybWF0W2FdPWMucmVwbGFjZSgvTU1NTXxNTXxERHxkZGRkL2csZnVuY3Rpb24oYSl7cmV0dXJuIGEuc2xpY2UoMSl9KSx0aGlzLl9sb25nRGF0ZUZvcm1hdFthXSl9ZnVuY3Rpb24gb2MoKXtyZXR1cm4gdGhpcy5faW52YWxpZERhdGV9ZnVuY3Rpb24gcGMoYSl7cmV0dXJuIHRoaXMuX29yZGluYWwucmVwbGFjZShcXFwiJWRcXFwiLGEpfWZ1bmN0aW9uIHFjKGEpe3JldHVybiBhfWZ1bmN0aW9uIHJjKGEsYixjLGQpe3ZhciBlPXRoaXMuX3JlbGF0aXZlVGltZVtjXTtyZXR1cm4gRChlKT9lKGEsYixjLGQpOmUucmVwbGFjZSgvJWQvaSxhKX1mdW5jdGlvbiBzYyhhLGIpe3ZhciBjPXRoaXMuX3JlbGF0aXZlVGltZVthPjA/XFxcImZ1dHVyZVxcXCI6XFxcInBhc3RcXFwiXTtyZXR1cm4gRChjKT9jKGIpOmMucmVwbGFjZSgvJXMvaSxiKX1mdW5jdGlvbiB0YyhhKXt2YXIgYixjO2ZvcihjIGluIGEpYj1hW2NdLEQoYik/dGhpc1tjXT1iOnRoaXNbXFxcIl9cXFwiK2NdPWI7dGhpcy5fb3JkaW5hbFBhcnNlTGVuaWVudD1uZXcgUmVnRXhwKHRoaXMuX29yZGluYWxQYXJzZS5zb3VyY2UrXFxcInxcXFwiKy9cXFxcZHsxLDJ9Ly5zb3VyY2UpfWZ1bmN0aW9uIHVjKGEsYixjLGQpe3ZhciBlPXooKSxmPWgoKS5zZXQoZCxiKTtyZXR1cm4gZVtjXShmLGEpfWZ1bmN0aW9uIHZjKGEsYixjLGQsZSl7aWYoXFxcIm51bWJlclxcXCI9PXR5cGVvZiBhJiYoYj1hLGE9dm9pZCAwKSxhPWF8fFxcXCJcXFwiLG51bGwhPWIpcmV0dXJuIHVjKGEsYixjLGUpO3ZhciBmLGc9W107Zm9yKGY9MDtkPmY7ZisrKWdbZl09dWMoYSxmLGMsZSk7cmV0dXJuIGd9ZnVuY3Rpb24gd2MoYSxiKXtyZXR1cm4gdmMoYSxiLFxcXCJtb250aHNcXFwiLDEyLFxcXCJtb250aFxcXCIpfWZ1bmN0aW9uIHhjKGEsYil7cmV0dXJuIHZjKGEsYixcXFwibW9udGhzU2hvcnRcXFwiLDEyLFxcXCJtb250aFxcXCIpfWZ1bmN0aW9uIHljKGEsYil7cmV0dXJuIHZjKGEsYixcXFwid2Vla2RheXNcXFwiLDcsXFxcImRheVxcXCIpfWZ1bmN0aW9uIHpjKGEsYil7cmV0dXJuIHZjKGEsYixcXFwid2Vla2RheXNTaG9ydFxcXCIsNyxcXFwiZGF5XFxcIil9ZnVuY3Rpb24gQWMoYSxiKXtyZXR1cm4gdmMoYSxiLFxcXCJ3ZWVrZGF5c01pblxcXCIsNyxcXFwiZGF5XFxcIil9ZnVuY3Rpb24gQmMoKXt2YXIgYT10aGlzLl9kYXRhO3JldHVybiB0aGlzLl9taWxsaXNlY29uZHM9c2UodGhpcy5fbWlsbGlzZWNvbmRzKSx0aGlzLl9kYXlzPXNlKHRoaXMuX2RheXMpLHRoaXMuX21vbnRocz1zZSh0aGlzLl9tb250aHMpLGEubWlsbGlzZWNvbmRzPXNlKGEubWlsbGlzZWNvbmRzKSxhLnNlY29uZHM9c2UoYS5zZWNvbmRzKSxhLm1pbnV0ZXM9c2UoYS5taW51dGVzKSxhLmhvdXJzPXNlKGEuaG91cnMpLGEubW9udGhzPXNlKGEubW9udGhzKSxhLnllYXJzPXNlKGEueWVhcnMpLHRoaXN9ZnVuY3Rpb24gQ2MoYSxiLGMsZCl7dmFyIGU9WmEoYixjKTtyZXR1cm4gYS5fbWlsbGlzZWNvbmRzKz1kKmUuX21pbGxpc2Vjb25kcyxhLl9kYXlzKz1kKmUuX2RheXMsYS5fbW9udGhzKz1kKmUuX21vbnRocyxhLl9idWJibGUoKX1mdW5jdGlvbiBEYyhhLGIpe3JldHVybiBDYyh0aGlzLGEsYiwxKX1mdW5jdGlvbiBFYyhhLGIpe3JldHVybiBDYyh0aGlzLGEsYiwtMSl9ZnVuY3Rpb24gRmMoYSl7cmV0dXJuIDA+YT9NYXRoLmZsb29yKGEpOk1hdGguY2VpbChhKX1mdW5jdGlvbiBHYygpe3ZhciBhLGIsYyxkLGUsZj10aGlzLl9taWxsaXNlY29uZHMsZz10aGlzLl9kYXlzLGg9dGhpcy5fbW9udGhzLGk9dGhpcy5fZGF0YTtyZXR1cm4gZj49MCYmZz49MCYmaD49MHx8MD49ZiYmMD49ZyYmMD49aHx8KGYrPTg2NGU1KkZjKEljKGgpK2cpLGc9MCxoPTApLGkubWlsbGlzZWNvbmRzPWYlMWUzLGE9cShmLzFlMyksaS5zZWNvbmRzPWElNjAsYj1xKGEvNjApLGkubWludXRlcz1iJTYwLGM9cShiLzYwKSxpLmhvdXJzPWMlMjQsZys9cShjLzI0KSxlPXEoSGMoZykpLGgrPWUsZy09RmMoSWMoZSkpLGQ9cShoLzEyKSxoJT0xMixpLmRheXM9ZyxpLm1vbnRocz1oLGkueWVhcnM9ZCx0aGlzfWZ1bmN0aW9uIEhjKGEpe3JldHVybiA0ODAwKmEvMTQ2MDk3fWZ1bmN0aW9uIEljKGEpe3JldHVybiAxNDYwOTcqYS80ODAwfWZ1bmN0aW9uIEpjKGEpe3ZhciBiLGMsZD10aGlzLl9taWxsaXNlY29uZHM7aWYoYT1CKGEpLFxcXCJtb250aFxcXCI9PT1hfHxcXFwieWVhclxcXCI9PT1hKXJldHVybiBiPXRoaXMuX2RheXMrZC84NjRlNSxjPXRoaXMuX21vbnRocytIYyhiKSxcXFwibW9udGhcXFwiPT09YT9jOmMvMTI7c3dpdGNoKGI9dGhpcy5fZGF5cytNYXRoLnJvdW5kKEljKHRoaXMuX21vbnRocykpLGEpe2Nhc2VcXFwid2Vla1xcXCI6cmV0dXJuIGIvNytkLzYwNDhlNTtjYXNlXFxcImRheVxcXCI6cmV0dXJuIGIrZC84NjRlNTtjYXNlXFxcImhvdXJcXFwiOnJldHVybiAyNCpiK2QvMzZlNTtjYXNlXFxcIm1pbnV0ZVxcXCI6cmV0dXJuIDE0NDAqYitkLzZlNDtjYXNlXFxcInNlY29uZFxcXCI6cmV0dXJuIDg2NDAwKmIrZC8xZTM7Y2FzZVxcXCJtaWxsaXNlY29uZFxcXCI6cmV0dXJuIE1hdGguZmxvb3IoODY0ZTUqYikrZDtkZWZhdWx0OnRocm93IG5ldyBFcnJvcihcXFwiVW5rbm93biB1bml0IFxcXCIrYSl9fWZ1bmN0aW9uIEtjKCl7cmV0dXJuIHRoaXMuX21pbGxpc2Vjb25kcys4NjRlNSp0aGlzLl9kYXlzK3RoaXMuX21vbnRocyUxMioyNTkyZTYrMzE1MzZlNipyKHRoaXMuX21vbnRocy8xMil9ZnVuY3Rpb24gTGMoYSl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYXMoYSl9fWZ1bmN0aW9uIE1jKGEpe3JldHVybiBhPUIoYSksdGhpc1thK1xcXCJzXFxcIl0oKX1mdW5jdGlvbiBOYyhhKXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZGF0YVthXX19ZnVuY3Rpb24gT2MoKXtyZXR1cm4gcSh0aGlzLmRheXMoKS83KX1mdW5jdGlvbiBQYyhhLGIsYyxkLGUpe3JldHVybiBlLnJlbGF0aXZlVGltZShifHwxLCEhYyxhLGQpfWZ1bmN0aW9uIFFjKGEsYixjKXt2YXIgZD1aYShhKS5hYnMoKSxlPUllKGQuYXMoXFxcInNcXFwiKSksZj1JZShkLmFzKFxcXCJtXFxcIikpLGc9SWUoZC5hcyhcXFwiaFxcXCIpKSxoPUllKGQuYXMoXFxcImRcXFwiKSksaT1JZShkLmFzKFxcXCJNXFxcIikpLGo9SWUoZC5hcyhcXFwieVxcXCIpKSxrPWU8SmUucyYmW1xcXCJzXFxcIixlXXx8MT49ZiYmW1xcXCJtXFxcIl18fGY8SmUubSYmW1xcXCJtbVxcXCIsZl18fDE+PWcmJltcXFwiaFxcXCJdfHxnPEplLmgmJltcXFwiaGhcXFwiLGddfHwxPj1oJiZbXFxcImRcXFwiXXx8aDxKZS5kJiZbXFxcImRkXFxcIixoXXx8MT49aSYmW1xcXCJNXFxcIl18fGk8SmUuTSYmW1xcXCJNTVxcXCIsaV18fDE+PWomJltcXFwieVxcXCJdfHxbXFxcInl5XFxcIixqXTtyZXR1cm4ga1syXT1iLGtbM109K2E+MCxrWzRdPWMsUGMuYXBwbHkobnVsbCxrKX1mdW5jdGlvbiBSYyhhLGIpe3JldHVybiB2b2lkIDA9PT1KZVthXT8hMTp2b2lkIDA9PT1iP0plW2FdOihKZVthXT1iLCEwKX1mdW5jdGlvbiBTYyhhKXt2YXIgYj10aGlzLmxvY2FsZURhdGEoKSxjPVFjKHRoaXMsIWEsYik7cmV0dXJuIGEmJihjPWIucGFzdEZ1dHVyZSgrdGhpcyxjKSksYi5wb3N0Zm9ybWF0KGMpfWZ1bmN0aW9uIFRjKCl7dmFyIGEsYixjLGQ9S2UodGhpcy5fbWlsbGlzZWNvbmRzKS8xZTMsZT1LZSh0aGlzLl9kYXlzKSxmPUtlKHRoaXMuX21vbnRocyk7YT1xKGQvNjApLGI9cShhLzYwKSxkJT02MCxhJT02MCxjPXEoZi8xMiksZiU9MTI7dmFyIGc9YyxoPWYsaT1lLGo9YixrPWEsbD1kLG09dGhpcy5hc1NlY29uZHMoKTtyZXR1cm4gbT8oMD5tP1xcXCItXFxcIjpcXFwiXFxcIikrXFxcIlBcXFwiKyhnP2crXFxcIllcXFwiOlxcXCJcXFwiKSsoaD9oK1xcXCJNXFxcIjpcXFwiXFxcIikrKGk/aStcXFwiRFxcXCI6XFxcIlxcXCIpKyhqfHxrfHxsP1xcXCJUXFxcIjpcXFwiXFxcIikrKGo/aitcXFwiSFxcXCI6XFxcIlxcXCIpKyhrP2srXFxcIk1cXFwiOlxcXCJcXFwiKSsobD9sK1xcXCJTXFxcIjpcXFwiXFxcIik6XFxcIlAwRFxcXCJ9dmFyIFVjLFZjLFdjPWEubW9tZW50UHJvcGVydGllcz1bXSxYYz0hMSxZYz17fSxaYz17fSwkYz0vKFxcXFxbW15cXFxcW10qXFxcXF0pfChcXFxcXFxcXCk/KFtIaF1tbShzcyk/fE1vfE1NP00/TT98RG98REREb3xERD9EP0Q/fGRkZD9kP3xkbz98d1tvfHddP3xXW298V10/fFFvP3xZWVlZWVl8WVlZWVl8WVlZWXxZWXxnZyhnZ2c/KT98R0coR0dHPyk/fGV8RXxhfEF8aGg/fEhIP3xtbT98c3M/fFN7MSw5fXx4fFh8eno/fFpaP3wuKS9nLF9jPS8oXFxcXFtbXlxcXFxbXSpcXFxcXSl8KFxcXFxcXFxcKT8oTFRTfExUfExMP0w/TD98bHsxLDR9KS9nLGFkPXt9LGJkPXt9LGNkPS9cXFxcZC8sZGQ9L1xcXFxkXFxcXGQvLGVkPS9cXFxcZHszfS8sZmQ9L1xcXFxkezR9LyxnZD0vWystXT9cXFxcZHs2fS8saGQ9L1xcXFxkXFxcXGQ/LyxpZD0vXFxcXGRcXFxcZFxcXFxkXFxcXGQ/LyxqZD0vXFxcXGRcXFxcZFxcXFxkXFxcXGRcXFxcZFxcXFxkPy8sa2Q9L1xcXFxkezEsM30vLGxkPS9cXFxcZHsxLDR9LyxtZD0vWystXT9cXFxcZHsxLDZ9LyxuZD0vXFxcXGQrLyxvZD0vWystXT9cXFxcZCsvLHBkPS9afFsrLV1cXFxcZFxcXFxkOj9cXFxcZFxcXFxkL2dpLHFkPS9afFsrLV1cXFxcZFxcXFxkKD86Oj9cXFxcZFxcXFxkKT8vZ2kscmQ9L1srLV0/XFxcXGQrKFxcXFwuXFxcXGR7MSwzfSk/LyxzZD0vWzAtOV0qWydhLXpcXFxcdTAwQTAtXFxcXHUwNUZGXFxcXHUwNzAwLVxcXFx1RDdGRlxcXFx1RjkwMC1cXFxcdUZEQ0ZcXFxcdUZERjAtXFxcXHVGRkVGXSt8W1xcXFx1MDYwMC1cXFxcdTA2RkZcXFxcL10rKFxcXFxzKj9bXFxcXHUwNjAwLVxcXFx1MDZGRl0rKXsxLDJ9L2ksdGQ9e30sdWQ9e30sdmQ9MCx3ZD0xLHhkPTIseWQ9Myx6ZD00LEFkPTUsQmQ9NixDZD03LERkPTg7SihcXFwiTVxcXCIsW1xcXCJNTVxcXCIsMl0sXFxcIk1vXFxcIixmdW5jdGlvbigpe3JldHVybiB0aGlzLm1vbnRoKCkrMX0pLEooXFxcIk1NTVxcXCIsMCwwLGZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmxvY2FsZURhdGEoKS5tb250aHNTaG9ydCh0aGlzLGEpfSksSihcXFwiTU1NTVxcXCIsMCwwLGZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmxvY2FsZURhdGEoKS5tb250aHModGhpcyxhKX0pLEEoXFxcIm1vbnRoXFxcIixcXFwiTVxcXCIpLE8oXFxcIk1cXFwiLGhkKSxPKFxcXCJNTVxcXCIsaGQsZGQpLE8oXFxcIk1NTVxcXCIsZnVuY3Rpb24oYSxiKXtyZXR1cm4gYi5tb250aHNTaG9ydFJlZ2V4KGEpfSksTyhcXFwiTU1NTVxcXCIsZnVuY3Rpb24oYSxiKXtyZXR1cm4gYi5tb250aHNSZWdleChhKX0pLFMoW1xcXCJNXFxcIixcXFwiTU1cXFwiXSxmdW5jdGlvbihhLGIpe2Jbd2RdPXIoYSktMX0pLFMoW1xcXCJNTU1cXFwiLFxcXCJNTU1NXFxcIl0sZnVuY3Rpb24oYSxiLGMsZCl7dmFyIGU9Yy5fbG9jYWxlLm1vbnRoc1BhcnNlKGEsZCxjLl9zdHJpY3QpO251bGwhPWU/Ylt3ZF09ZTpqKGMpLmludmFsaWRNb250aD1hfSk7dmFyIEVkPS9EW29EXT8oXFxcXFtbXlxcXFxbXFxcXF1dKlxcXFxdfFxcXFxzKykrTU1NTT8vLEZkPVxcXCJKYW51YXJ5X0ZlYnJ1YXJ5X01hcmNoX0FwcmlsX01heV9KdW5lX0p1bHlfQXVndXN0X1NlcHRlbWJlcl9PY3RvYmVyX05vdmVtYmVyX0RlY2VtYmVyXFxcIi5zcGxpdChcXFwiX1xcXCIpLEdkPVxcXCJKYW5fRmViX01hcl9BcHJfTWF5X0p1bl9KdWxfQXVnX1NlcF9PY3RfTm92X0RlY1xcXCIuc3BsaXQoXFxcIl9cXFwiKSxIZD1zZCxJZD1zZCxKZD17fTthLnN1cHByZXNzRGVwcmVjYXRpb25XYXJuaW5ncz0hMTt2YXIgS2Q9L15cXFxccyooKD86WystXVxcXFxkezZ9fFxcXFxkezR9KS0oPzpcXFxcZFxcXFxkLVxcXFxkXFxcXGR8V1xcXFxkXFxcXGQtXFxcXGR8V1xcXFxkXFxcXGR8XFxcXGRcXFxcZFxcXFxkfFxcXFxkXFxcXGQpKSg/OihUfCApKFxcXFxkXFxcXGQoPzo6XFxcXGRcXFxcZCg/OjpcXFxcZFxcXFxkKD86Wy4sXVxcXFxkKyk/KT8pPykoW1xcXFwrXFxcXC1dXFxcXGRcXFxcZCg/Ojo/XFxcXGRcXFxcZCk/fFxcXFxzKlopPyk/LyxMZD0vXlxcXFxzKigoPzpbKy1dXFxcXGR7Nn18XFxcXGR7NH0pKD86XFxcXGRcXFxcZFxcXFxkXFxcXGR8V1xcXFxkXFxcXGRcXFxcZHxXXFxcXGRcXFxcZHxcXFxcZFxcXFxkXFxcXGR8XFxcXGRcXFxcZCkpKD86KFR8ICkoXFxcXGRcXFxcZCg/OlxcXFxkXFxcXGQoPzpcXFxcZFxcXFxkKD86Wy4sXVxcXFxkKyk/KT8pPykoW1xcXFwrXFxcXC1dXFxcXGRcXFxcZCg/Ojo/XFxcXGRcXFxcZCk/fFxcXFxzKlopPyk/LyxNZD0vWnxbKy1dXFxcXGRcXFxcZCg/Ojo/XFxcXGRcXFxcZCk/LyxOZD1bW1xcXCJZWVlZWVktTU0tRERcXFwiLC9bKy1dXFxcXGR7Nn0tXFxcXGRcXFxcZC1cXFxcZFxcXFxkL10sW1xcXCJZWVlZLU1NLUREXFxcIiwvXFxcXGR7NH0tXFxcXGRcXFxcZC1cXFxcZFxcXFxkL10sW1xcXCJHR0dHLVtXXVdXLUVcXFwiLC9cXFxcZHs0fS1XXFxcXGRcXFxcZC1cXFxcZC9dLFtcXFwiR0dHRy1bV11XV1xcXCIsL1xcXFxkezR9LVdcXFxcZFxcXFxkLywhMV0sW1xcXCJZWVlZLURERFxcXCIsL1xcXFxkezR9LVxcXFxkezN9L10sW1xcXCJZWVlZLU1NXFxcIiwvXFxcXGR7NH0tXFxcXGRcXFxcZC8sITFdLFtcXFwiWVlZWVlZTU1ERFxcXCIsL1srLV1cXFxcZHsxMH0vXSxbXFxcIllZWVlNTUREXFxcIiwvXFxcXGR7OH0vXSxbXFxcIkdHR0dbV11XV0VcXFwiLC9cXFxcZHs0fVdcXFxcZHszfS9dLFtcXFwiR0dHR1tXXVdXXFxcIiwvXFxcXGR7NH1XXFxcXGR7Mn0vLCExXSxbXFxcIllZWVlERERcXFwiLC9cXFxcZHs3fS9dXSxPZD1bW1xcXCJISDptbTpzcy5TU1NTXFxcIiwvXFxcXGRcXFxcZDpcXFxcZFxcXFxkOlxcXFxkXFxcXGRcXFxcLlxcXFxkKy9dLFtcXFwiSEg6bW06c3MsU1NTU1xcXCIsL1xcXFxkXFxcXGQ6XFxcXGRcXFxcZDpcXFxcZFxcXFxkLFxcXFxkKy9dLFtcXFwiSEg6bW06c3NcXFwiLC9cXFxcZFxcXFxkOlxcXFxkXFxcXGQ6XFxcXGRcXFxcZC9dLFtcXFwiSEg6bW1cXFwiLC9cXFxcZFxcXFxkOlxcXFxkXFxcXGQvXSxbXFxcIkhIbW1zcy5TU1NTXFxcIiwvXFxcXGRcXFxcZFxcXFxkXFxcXGRcXFxcZFxcXFxkXFxcXC5cXFxcZCsvXSxbXFxcIkhIbW1zcyxTU1NTXFxcIiwvXFxcXGRcXFxcZFxcXFxkXFxcXGRcXFxcZFxcXFxkLFxcXFxkKy9dLFtcXFwiSEhtbXNzXFxcIiwvXFxcXGRcXFxcZFxcXFxkXFxcXGRcXFxcZFxcXFxkL10sW1xcXCJISG1tXFxcIiwvXFxcXGRcXFxcZFxcXFxkXFxcXGQvXSxbXFxcIkhIXFxcIiwvXFxcXGRcXFxcZC9dXSxQZD0vXlxcXFwvP0RhdGVcXFxcKChcXFxcLT9cXFxcZCspL2k7YS5jcmVhdGVGcm9tSW5wdXRGYWxsYmFjaz1mYShcXFwibW9tZW50IGNvbnN0cnVjdGlvbiBmYWxscyBiYWNrIHRvIGpzIERhdGUuIFRoaXMgaXMgZGlzY291cmFnZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiB1cGNvbWluZyBtYWpvciByZWxlYXNlLiBQbGVhc2UgcmVmZXIgdG8gaHR0cHM6Ly9naXRodWIuY29tL21vbWVudC9tb21lbnQvaXNzdWVzLzE0MDcgZm9yIG1vcmUgaW5mby5cXFwiLGZ1bmN0aW9uKGEpe2EuX2Q9bmV3IERhdGUoYS5faSsoYS5fdXNlVVRDP1xcXCIgVVRDXFxcIjpcXFwiXFxcIikpfSksSihcXFwiWVxcXCIsMCwwLGZ1bmN0aW9uKCl7dmFyIGE9dGhpcy55ZWFyKCk7cmV0dXJuIDk5OTk+PWE/XFxcIlxcXCIrYTpcXFwiK1xcXCIrYX0pLEooMCxbXFxcIllZXFxcIiwyXSwwLGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMueWVhcigpJTEwMH0pLEooMCxbXFxcIllZWVlcXFwiLDRdLDAsXFxcInllYXJcXFwiKSxKKDAsW1xcXCJZWVlZWVxcXCIsNV0sMCxcXFwieWVhclxcXCIpLEooMCxbXFxcIllZWVlZWVxcXCIsNiwhMF0sMCxcXFwieWVhclxcXCIpLEEoXFxcInllYXJcXFwiLFxcXCJ5XFxcIiksTyhcXFwiWVxcXCIsb2QpLE8oXFxcIllZXFxcIixoZCxkZCksTyhcXFwiWVlZWVxcXCIsbGQsZmQpLE8oXFxcIllZWVlZXFxcIixtZCxnZCksTyhcXFwiWVlZWVlZXFxcIixtZCxnZCksUyhbXFxcIllZWVlZXFxcIixcXFwiWVlZWVlZXFxcIl0sdmQpLFMoXFxcIllZWVlcXFwiLGZ1bmN0aW9uKGIsYyl7Y1t2ZF09Mj09PWIubGVuZ3RoP2EucGFyc2VUd29EaWdpdFllYXIoYik6cihiKX0pLFMoXFxcIllZXFxcIixmdW5jdGlvbihiLGMpe2NbdmRdPWEucGFyc2VUd29EaWdpdFllYXIoYil9KSxTKFxcXCJZXFxcIixmdW5jdGlvbihhLGIpe2JbdmRdPXBhcnNlSW50KGEsMTApfSksYS5wYXJzZVR3b0RpZ2l0WWVhcj1mdW5jdGlvbihhKXtyZXR1cm4gcihhKSsocihhKT42OD8xOTAwOjJlMyl9O3ZhciBRZD1FKFxcXCJGdWxsWWVhclxcXCIsITEpO2EuSVNPXzg2MDE9ZnVuY3Rpb24oKXt9O3ZhciBSZD1mYShcXFwibW9tZW50KCkubWluIGlzIGRlcHJlY2F0ZWQsIHVzZSBtb21lbnQubWluIGluc3RlYWQuIGh0dHBzOi8vZ2l0aHViLmNvbS9tb21lbnQvbW9tZW50L2lzc3Vlcy8xNTQ4XFxcIixmdW5jdGlvbigpe3ZhciBhPUVhLmFwcGx5KG51bGwsYXJndW1lbnRzKTtyZXR1cm4gdGhpcy5pc1ZhbGlkKCkmJmEuaXNWYWxpZCgpP3RoaXM+YT90aGlzOmE6bCgpfSksU2Q9ZmEoXFxcIm1vbWVudCgpLm1heCBpcyBkZXByZWNhdGVkLCB1c2UgbW9tZW50Lm1heCBpbnN0ZWFkLiBodHRwczovL2dpdGh1Yi5jb20vbW9tZW50L21vbWVudC9pc3N1ZXMvMTU0OFxcXCIsZnVuY3Rpb24oKXt2YXIgYT1FYS5hcHBseShudWxsLGFyZ3VtZW50cyk7cmV0dXJuIHRoaXMuaXNWYWxpZCgpJiZhLmlzVmFsaWQoKT9hPnRoaXM/dGhpczphOmwoKX0pLFRkPWZ1bmN0aW9uKCl7cmV0dXJuIERhdGUubm93P0RhdGUubm93KCk6K25ldyBEYXRlfTtLYShcXFwiWlxcXCIsXFxcIjpcXFwiKSxLYShcXFwiWlpcXFwiLFxcXCJcXFwiKSxPKFxcXCJaXFxcIixxZCksTyhcXFwiWlpcXFwiLHFkKSxTKFtcXFwiWlxcXCIsXFxcIlpaXFxcIl0sZnVuY3Rpb24oYSxiLGMpe2MuX3VzZVVUQz0hMCxjLl90em09TGEocWQsYSl9KTt2YXIgVWQ9LyhbXFxcXCtcXFxcLV18XFxcXGRcXFxcZCkvZ2k7YS51cGRhdGVPZmZzZXQ9ZnVuY3Rpb24oKXt9O3ZhciBWZD0vKFxcXFwtKT8oPzooXFxcXGQqKVsuIF0pPyhcXFxcZCspXFxcXDooXFxcXGQrKSg/OlxcXFw6KFxcXFxkKylcXFxcLj8oXFxcXGR7M30pPyk/LyxXZD0vXigtKT9QKD86KD86KFswLTksLl0qKVkpPyg/OihbMC05LC5dKilNKT8oPzooWzAtOSwuXSopRCk/KD86VCg/OihbMC05LC5dKilIKT8oPzooWzAtOSwuXSopTSk/KD86KFswLTksLl0qKVMpPyk/fChbMC05LC5dKilXKSQvO1xcblphLmZuPUlhLnByb3RvdHlwZTt2YXIgWGQ9YmIoMSxcXFwiYWRkXFxcIiksWWQ9YmIoLTEsXFxcInN1YnRyYWN0XFxcIik7YS5kZWZhdWx0Rm9ybWF0PVxcXCJZWVlZLU1NLUREVEhIOm1tOnNzWlxcXCI7dmFyIFpkPWZhKFxcXCJtb21lbnQoKS5sYW5nKCkgaXMgZGVwcmVjYXRlZC4gSW5zdGVhZCwgdXNlIG1vbWVudCgpLmxvY2FsZURhdGEoKSB0byBnZXQgdGhlIGxhbmd1YWdlIGNvbmZpZ3VyYXRpb24uIFVzZSBtb21lbnQoKS5sb2NhbGUoKSB0byBjaGFuZ2UgbGFuZ3VhZ2VzLlxcXCIsZnVuY3Rpb24oYSl7cmV0dXJuIHZvaWQgMD09PWE/dGhpcy5sb2NhbGVEYXRhKCk6dGhpcy5sb2NhbGUoYSl9KTtKKDAsW1xcXCJnZ1xcXCIsMl0sMCxmdW5jdGlvbigpe3JldHVybiB0aGlzLndlZWtZZWFyKCklMTAwfSksSigwLFtcXFwiR0dcXFwiLDJdLDAsZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pc29XZWVrWWVhcigpJTEwMH0pLEliKFxcXCJnZ2dnXFxcIixcXFwid2Vla1llYXJcXFwiKSxJYihcXFwiZ2dnZ2dcXFwiLFxcXCJ3ZWVrWWVhclxcXCIpLEliKFxcXCJHR0dHXFxcIixcXFwiaXNvV2Vla1llYXJcXFwiKSxJYihcXFwiR0dHR0dcXFwiLFxcXCJpc29XZWVrWWVhclxcXCIpLEEoXFxcIndlZWtZZWFyXFxcIixcXFwiZ2dcXFwiKSxBKFxcXCJpc29XZWVrWWVhclxcXCIsXFxcIkdHXFxcIiksTyhcXFwiR1xcXCIsb2QpLE8oXFxcImdcXFwiLG9kKSxPKFxcXCJHR1xcXCIsaGQsZGQpLE8oXFxcImdnXFxcIixoZCxkZCksTyhcXFwiR0dHR1xcXCIsbGQsZmQpLE8oXFxcImdnZ2dcXFwiLGxkLGZkKSxPKFxcXCJHR0dHR1xcXCIsbWQsZ2QpLE8oXFxcImdnZ2dnXFxcIixtZCxnZCksVChbXFxcImdnZ2dcXFwiLFxcXCJnZ2dnZ1xcXCIsXFxcIkdHR0dcXFwiLFxcXCJHR0dHR1xcXCJdLGZ1bmN0aW9uKGEsYixjLGQpe2JbZC5zdWJzdHIoMCwyKV09cihhKX0pLFQoW1xcXCJnZ1xcXCIsXFxcIkdHXFxcIl0sZnVuY3Rpb24oYixjLGQsZSl7Y1tlXT1hLnBhcnNlVHdvRGlnaXRZZWFyKGIpfSksSihcXFwiUVxcXCIsMCxcXFwiUW9cXFwiLFxcXCJxdWFydGVyXFxcIiksQShcXFwicXVhcnRlclxcXCIsXFxcIlFcXFwiKSxPKFxcXCJRXFxcIixjZCksUyhcXFwiUVxcXCIsZnVuY3Rpb24oYSxiKXtiW3dkXT0zKihyKGEpLTEpfSksSihcXFwid1xcXCIsW1xcXCJ3d1xcXCIsMl0sXFxcIndvXFxcIixcXFwid2Vla1xcXCIpLEooXFxcIldcXFwiLFtcXFwiV1dcXFwiLDJdLFxcXCJXb1xcXCIsXFxcImlzb1dlZWtcXFwiKSxBKFxcXCJ3ZWVrXFxcIixcXFwid1xcXCIpLEEoXFxcImlzb1dlZWtcXFwiLFxcXCJXXFxcIiksTyhcXFwid1xcXCIsaGQpLE8oXFxcInd3XFxcIixoZCxkZCksTyhcXFwiV1xcXCIsaGQpLE8oXFxcIldXXFxcIixoZCxkZCksVChbXFxcIndcXFwiLFxcXCJ3d1xcXCIsXFxcIldcXFwiLFxcXCJXV1xcXCJdLGZ1bmN0aW9uKGEsYixjLGQpe2JbZC5zdWJzdHIoMCwxKV09cihhKX0pO3ZhciAkZD17ZG93OjAsZG95OjZ9O0ooXFxcIkRcXFwiLFtcXFwiRERcXFwiLDJdLFxcXCJEb1xcXCIsXFxcImRhdGVcXFwiKSxBKFxcXCJkYXRlXFxcIixcXFwiRFxcXCIpLE8oXFxcIkRcXFwiLGhkKSxPKFxcXCJERFxcXCIsaGQsZGQpLE8oXFxcIkRvXFxcIixmdW5jdGlvbihhLGIpe3JldHVybiBhP2IuX29yZGluYWxQYXJzZTpiLl9vcmRpbmFsUGFyc2VMZW5pZW50fSksUyhbXFxcIkRcXFwiLFxcXCJERFxcXCJdLHhkKSxTKFxcXCJEb1xcXCIsZnVuY3Rpb24oYSxiKXtiW3hkXT1yKGEubWF0Y2goaGQpWzBdLDEwKX0pO3ZhciBfZD1FKFxcXCJEYXRlXFxcIiwhMCk7SihcXFwiZFxcXCIsMCxcXFwiZG9cXFwiLFxcXCJkYXlcXFwiKSxKKFxcXCJkZFxcXCIsMCwwLGZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmxvY2FsZURhdGEoKS53ZWVrZGF5c01pbih0aGlzLGEpfSksSihcXFwiZGRkXFxcIiwwLDAsZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMubG9jYWxlRGF0YSgpLndlZWtkYXlzU2hvcnQodGhpcyxhKX0pLEooXFxcImRkZGRcXFwiLDAsMCxmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5sb2NhbGVEYXRhKCkud2Vla2RheXModGhpcyxhKX0pLEooXFxcImVcXFwiLDAsMCxcXFwid2Vla2RheVxcXCIpLEooXFxcIkVcXFwiLDAsMCxcXFwiaXNvV2Vla2RheVxcXCIpLEEoXFxcImRheVxcXCIsXFxcImRcXFwiKSxBKFxcXCJ3ZWVrZGF5XFxcIixcXFwiZVxcXCIpLEEoXFxcImlzb1dlZWtkYXlcXFwiLFxcXCJFXFxcIiksTyhcXFwiZFxcXCIsaGQpLE8oXFxcImVcXFwiLGhkKSxPKFxcXCJFXFxcIixoZCksTyhcXFwiZGRcXFwiLHNkKSxPKFxcXCJkZGRcXFwiLHNkKSxPKFxcXCJkZGRkXFxcIixzZCksVChbXFxcImRkXFxcIixcXFwiZGRkXFxcIixcXFwiZGRkZFxcXCJdLGZ1bmN0aW9uKGEsYixjLGQpe3ZhciBlPWMuX2xvY2FsZS53ZWVrZGF5c1BhcnNlKGEsZCxjLl9zdHJpY3QpO251bGwhPWU/Yi5kPWU6aihjKS5pbnZhbGlkV2Vla2RheT1hfSksVChbXFxcImRcXFwiLFxcXCJlXFxcIixcXFwiRVxcXCJdLGZ1bmN0aW9uKGEsYixjLGQpe2JbZF09cihhKX0pO3ZhciBhZT1cXFwiU3VuZGF5X01vbmRheV9UdWVzZGF5X1dlZG5lc2RheV9UaHVyc2RheV9GcmlkYXlfU2F0dXJkYXlcXFwiLnNwbGl0KFxcXCJfXFxcIiksYmU9XFxcIlN1bl9Nb25fVHVlX1dlZF9UaHVfRnJpX1NhdFxcXCIuc3BsaXQoXFxcIl9cXFwiKSxjZT1cXFwiU3VfTW9fVHVfV2VfVGhfRnJfU2FcXFwiLnNwbGl0KFxcXCJfXFxcIik7SihcXFwiREREXFxcIixbXFxcIkRERERcXFwiLDNdLFxcXCJERERvXFxcIixcXFwiZGF5T2ZZZWFyXFxcIiksQShcXFwiZGF5T2ZZZWFyXFxcIixcXFwiREREXFxcIiksTyhcXFwiREREXFxcIixrZCksTyhcXFwiRERERFxcXCIsZWQpLFMoW1xcXCJERERcXFwiLFxcXCJEREREXFxcIl0sZnVuY3Rpb24oYSxiLGMpe2MuX2RheU9mWWVhcj1yKGEpfSksSihcXFwiSFxcXCIsW1xcXCJISFxcXCIsMl0sMCxcXFwiaG91clxcXCIpLEooXFxcImhcXFwiLFtcXFwiaGhcXFwiLDJdLDAsY2MpLEooXFxcImhtbVxcXCIsMCwwLGZ1bmN0aW9uKCl7cmV0dXJuXFxcIlxcXCIrY2MuYXBwbHkodGhpcykrSSh0aGlzLm1pbnV0ZXMoKSwyKX0pLEooXFxcImhtbXNzXFxcIiwwLDAsZnVuY3Rpb24oKXtyZXR1cm5cXFwiXFxcIitjYy5hcHBseSh0aGlzKStJKHRoaXMubWludXRlcygpLDIpK0kodGhpcy5zZWNvbmRzKCksMil9KSxKKFxcXCJIbW1cXFwiLDAsMCxmdW5jdGlvbigpe3JldHVyblxcXCJcXFwiK3RoaXMuaG91cnMoKStJKHRoaXMubWludXRlcygpLDIpfSksSihcXFwiSG1tc3NcXFwiLDAsMCxmdW5jdGlvbigpe3JldHVyblxcXCJcXFwiK3RoaXMuaG91cnMoKStJKHRoaXMubWludXRlcygpLDIpK0kodGhpcy5zZWNvbmRzKCksMil9KSxkYyhcXFwiYVxcXCIsITApLGRjKFxcXCJBXFxcIiwhMSksQShcXFwiaG91clxcXCIsXFxcImhcXFwiKSxPKFxcXCJhXFxcIixlYyksTyhcXFwiQVxcXCIsZWMpLE8oXFxcIkhcXFwiLGhkKSxPKFxcXCJoXFxcIixoZCksTyhcXFwiSEhcXFwiLGhkLGRkKSxPKFxcXCJoaFxcXCIsaGQsZGQpLE8oXFxcImhtbVxcXCIsaWQpLE8oXFxcImhtbXNzXFxcIixqZCksTyhcXFwiSG1tXFxcIixpZCksTyhcXFwiSG1tc3NcXFwiLGpkKSxTKFtcXFwiSFxcXCIsXFxcIkhIXFxcIl0seWQpLFMoW1xcXCJhXFxcIixcXFwiQVxcXCJdLGZ1bmN0aW9uKGEsYixjKXtjLl9pc1BtPWMuX2xvY2FsZS5pc1BNKGEpLGMuX21lcmlkaWVtPWF9KSxTKFtcXFwiaFxcXCIsXFxcImhoXFxcIl0sZnVuY3Rpb24oYSxiLGMpe2JbeWRdPXIoYSksaihjKS5iaWdIb3VyPSEwfSksUyhcXFwiaG1tXFxcIixmdW5jdGlvbihhLGIsYyl7dmFyIGQ9YS5sZW5ndGgtMjtiW3lkXT1yKGEuc3Vic3RyKDAsZCkpLGJbemRdPXIoYS5zdWJzdHIoZCkpLGooYykuYmlnSG91cj0hMH0pLFMoXFxcImhtbXNzXFxcIixmdW5jdGlvbihhLGIsYyl7dmFyIGQ9YS5sZW5ndGgtNCxlPWEubGVuZ3RoLTI7Ylt5ZF09cihhLnN1YnN0cigwLGQpKSxiW3pkXT1yKGEuc3Vic3RyKGQsMikpLGJbQWRdPXIoYS5zdWJzdHIoZSkpLGooYykuYmlnSG91cj0hMH0pLFMoXFxcIkhtbVxcXCIsZnVuY3Rpb24oYSxiLGMpe3ZhciBkPWEubGVuZ3RoLTI7Ylt5ZF09cihhLnN1YnN0cigwLGQpKSxiW3pkXT1yKGEuc3Vic3RyKGQpKX0pLFMoXFxcIkhtbXNzXFxcIixmdW5jdGlvbihhLGIsYyl7dmFyIGQ9YS5sZW5ndGgtNCxlPWEubGVuZ3RoLTI7Ylt5ZF09cihhLnN1YnN0cigwLGQpKSxiW3pkXT1yKGEuc3Vic3RyKGQsMikpLGJbQWRdPXIoYS5zdWJzdHIoZSkpfSk7dmFyIGRlPS9bYXBdXFxcXC4/bT9cXFxcLj8vaSxlZT1FKFxcXCJIb3Vyc1xcXCIsITApO0ooXFxcIm1cXFwiLFtcXFwibW1cXFwiLDJdLDAsXFxcIm1pbnV0ZVxcXCIpLEEoXFxcIm1pbnV0ZVxcXCIsXFxcIm1cXFwiKSxPKFxcXCJtXFxcIixoZCksTyhcXFwibW1cXFwiLGhkLGRkKSxTKFtcXFwibVxcXCIsXFxcIm1tXFxcIl0semQpO3ZhciBmZT1FKFxcXCJNaW51dGVzXFxcIiwhMSk7SihcXFwic1xcXCIsW1xcXCJzc1xcXCIsMl0sMCxcXFwic2Vjb25kXFxcIiksQShcXFwic2Vjb25kXFxcIixcXFwic1xcXCIpLE8oXFxcInNcXFwiLGhkKSxPKFxcXCJzc1xcXCIsaGQsZGQpLFMoW1xcXCJzXFxcIixcXFwic3NcXFwiXSxBZCk7dmFyIGdlPUUoXFxcIlNlY29uZHNcXFwiLCExKTtKKFxcXCJTXFxcIiwwLDAsZnVuY3Rpb24oKXtyZXR1cm5+fih0aGlzLm1pbGxpc2Vjb25kKCkvMTAwKX0pLEooMCxbXFxcIlNTXFxcIiwyXSwwLGZ1bmN0aW9uKCl7cmV0dXJufn4odGhpcy5taWxsaXNlY29uZCgpLzEwKX0pLEooMCxbXFxcIlNTU1xcXCIsM10sMCxcXFwibWlsbGlzZWNvbmRcXFwiKSxKKDAsW1xcXCJTU1NTXFxcIiw0XSwwLGZ1bmN0aW9uKCl7cmV0dXJuIDEwKnRoaXMubWlsbGlzZWNvbmQoKX0pLEooMCxbXFxcIlNTU1NTXFxcIiw1XSwwLGZ1bmN0aW9uKCl7cmV0dXJuIDEwMCp0aGlzLm1pbGxpc2Vjb25kKCl9KSxKKDAsW1xcXCJTU1NTU1NcXFwiLDZdLDAsZnVuY3Rpb24oKXtyZXR1cm4gMWUzKnRoaXMubWlsbGlzZWNvbmQoKX0pLEooMCxbXFxcIlNTU1NTU1NcXFwiLDddLDAsZnVuY3Rpb24oKXtyZXR1cm4gMWU0KnRoaXMubWlsbGlzZWNvbmQoKX0pLEooMCxbXFxcIlNTU1NTU1NTXFxcIiw4XSwwLGZ1bmN0aW9uKCl7cmV0dXJuIDFlNSp0aGlzLm1pbGxpc2Vjb25kKCl9KSxKKDAsW1xcXCJTU1NTU1NTU1NcXFwiLDldLDAsZnVuY3Rpb24oKXtyZXR1cm4gMWU2KnRoaXMubWlsbGlzZWNvbmQoKX0pLEEoXFxcIm1pbGxpc2Vjb25kXFxcIixcXFwibXNcXFwiKSxPKFxcXCJTXFxcIixrZCxjZCksTyhcXFwiU1NcXFwiLGtkLGRkKSxPKFxcXCJTU1NcXFwiLGtkLGVkKTt2YXIgaGU7Zm9yKGhlPVxcXCJTU1NTXFxcIjtoZS5sZW5ndGg8PTk7aGUrPVxcXCJTXFxcIilPKGhlLG5kKTtmb3IoaGU9XFxcIlNcXFwiO2hlLmxlbmd0aDw9OTtoZSs9XFxcIlNcXFwiKVMoaGUsaGMpO3ZhciBpZT1FKFxcXCJNaWxsaXNlY29uZHNcXFwiLCExKTtKKFxcXCJ6XFxcIiwwLDAsXFxcInpvbmVBYmJyXFxcIiksSihcXFwienpcXFwiLDAsMCxcXFwiem9uZU5hbWVcXFwiKTt2YXIgamU9by5wcm90b3R5cGU7amUuYWRkPVhkLGplLmNhbGVuZGFyPWRiLGplLmNsb25lPWViLGplLmRpZmY9bGIsamUuZW5kT2Y9eGIsamUuZm9ybWF0PXBiLGplLmZyb209cWIsamUuZnJvbU5vdz1yYixqZS50bz1zYixqZS50b05vdz10YixqZS5nZXQ9SCxqZS5pbnZhbGlkQXQ9R2IsamUuaXNBZnRlcj1mYixqZS5pc0JlZm9yZT1nYixqZS5pc0JldHdlZW49aGIsamUuaXNTYW1lPWliLGplLmlzU2FtZU9yQWZ0ZXI9amIsamUuaXNTYW1lT3JCZWZvcmU9a2IsamUuaXNWYWxpZD1FYixqZS5sYW5nPVpkLGplLmxvY2FsZT11YixqZS5sb2NhbGVEYXRhPXZiLGplLm1heD1TZCxqZS5taW49UmQsamUucGFyc2luZ0ZsYWdzPUZiLGplLnNldD1ILGplLnN0YXJ0T2Y9d2IsamUuc3VidHJhY3Q9WWQsamUudG9BcnJheT1CYixqZS50b09iamVjdD1DYixqZS50b0RhdGU9QWIsamUudG9JU09TdHJpbmc9b2IsamUudG9KU09OPURiLGplLnRvU3RyaW5nPW5iLGplLnVuaXg9emIsamUudmFsdWVPZj15YixqZS5jcmVhdGlvbkRhdGE9SGIsamUueWVhcj1RZCxqZS5pc0xlYXBZZWFyPW5hLGplLndlZWtZZWFyPUpiLGplLmlzb1dlZWtZZWFyPUtiLGplLnF1YXJ0ZXI9amUucXVhcnRlcnM9UGIsamUubW9udGg9JCxqZS5kYXlzSW5Nb250aD1fLGplLndlZWs9amUud2Vla3M9VGIsamUuaXNvV2Vlaz1qZS5pc29XZWVrcz1VYixqZS53ZWVrc0luWWVhcj1NYixqZS5pc29XZWVrc0luWWVhcj1MYixqZS5kYXRlPV9kLGplLmRheT1qZS5kYXlzPSRiLGplLndlZWtkYXk9X2IsamUuaXNvV2Vla2RheT1hYyxqZS5kYXlPZlllYXI9YmMsamUuaG91cj1qZS5ob3Vycz1lZSxqZS5taW51dGU9amUubWludXRlcz1mZSxqZS5zZWNvbmQ9amUuc2Vjb25kcz1nZSxqZS5taWxsaXNlY29uZD1qZS5taWxsaXNlY29uZHM9aWUsamUudXRjT2Zmc2V0PU9hLGplLnV0Yz1RYSxqZS5sb2NhbD1SYSxqZS5wYXJzZVpvbmU9U2EsamUuaGFzQWxpZ25lZEhvdXJPZmZzZXQ9VGEsamUuaXNEU1Q9VWEsamUuaXNEU1RTaGlmdGVkPVZhLGplLmlzTG9jYWw9V2EsamUuaXNVdGNPZmZzZXQ9WGEsamUuaXNVdGM9WWEsamUuaXNVVEM9WWEsamUuem9uZUFiYnI9aWMsamUuem9uZU5hbWU9amMsamUuZGF0ZXM9ZmEoXFxcImRhdGVzIGFjY2Vzc29yIGlzIGRlcHJlY2F0ZWQuIFVzZSBkYXRlIGluc3RlYWQuXFxcIixfZCksamUubW9udGhzPWZhKFxcXCJtb250aHMgYWNjZXNzb3IgaXMgZGVwcmVjYXRlZC4gVXNlIG1vbnRoIGluc3RlYWRcXFwiLCQpLGplLnllYXJzPWZhKFxcXCJ5ZWFycyBhY2Nlc3NvciBpcyBkZXByZWNhdGVkLiBVc2UgeWVhciBpbnN0ZWFkXFxcIixRZCksamUuem9uZT1mYShcXFwibW9tZW50KCkuem9uZSBpcyBkZXByZWNhdGVkLCB1c2UgbW9tZW50KCkudXRjT2Zmc2V0IGluc3RlYWQuIGh0dHBzOi8vZ2l0aHViLmNvbS9tb21lbnQvbW9tZW50L2lzc3Vlcy8xNzc5XFxcIixQYSk7dmFyIGtlPWplLGxlPXtzYW1lRGF5OlxcXCJbVG9kYXkgYXRdIExUXFxcIixuZXh0RGF5OlxcXCJbVG9tb3Jyb3cgYXRdIExUXFxcIixuZXh0V2VlazpcXFwiZGRkZCBbYXRdIExUXFxcIixsYXN0RGF5OlxcXCJbWWVzdGVyZGF5IGF0XSBMVFxcXCIsbGFzdFdlZWs6XFxcIltMYXN0XSBkZGRkIFthdF0gTFRcXFwiLHNhbWVFbHNlOlxcXCJMXFxcIn0sbWU9e0xUUzpcXFwiaDptbTpzcyBBXFxcIixMVDpcXFwiaDptbSBBXFxcIixMOlxcXCJNTS9ERC9ZWVlZXFxcIixMTDpcXFwiTU1NTSBELCBZWVlZXFxcIixMTEw6XFxcIk1NTU0gRCwgWVlZWSBoOm1tIEFcXFwiLExMTEw6XFxcImRkZGQsIE1NTU0gRCwgWVlZWSBoOm1tIEFcXFwifSxuZT1cXFwiSW52YWxpZCBkYXRlXFxcIixvZT1cXFwiJWRcXFwiLHBlPS9cXFxcZHsxLDJ9LyxxZT17ZnV0dXJlOlxcXCJpbiAlc1xcXCIscGFzdDpcXFwiJXMgYWdvXFxcIixzOlxcXCJhIGZldyBzZWNvbmRzXFxcIixtOlxcXCJhIG1pbnV0ZVxcXCIsbW06XFxcIiVkIG1pbnV0ZXNcXFwiLGg6XFxcImFuIGhvdXJcXFwiLGhoOlxcXCIlZCBob3Vyc1xcXCIsZDpcXFwiYSBkYXlcXFwiLGRkOlxcXCIlZCBkYXlzXFxcIixNOlxcXCJhIG1vbnRoXFxcIixNTTpcXFwiJWQgbW9udGhzXFxcIix5OlxcXCJhIHllYXJcXFwiLHl5OlxcXCIlZCB5ZWFyc1xcXCJ9LHJlPXQucHJvdG90eXBlO3JlLl9jYWxlbmRhcj1sZSxyZS5jYWxlbmRhcj1tYyxyZS5fbG9uZ0RhdGVGb3JtYXQ9bWUscmUubG9uZ0RhdGVGb3JtYXQ9bmMscmUuX2ludmFsaWREYXRlPW5lLHJlLmludmFsaWREYXRlPW9jLHJlLl9vcmRpbmFsPW9lLHJlLm9yZGluYWw9cGMscmUuX29yZGluYWxQYXJzZT1wZSxyZS5wcmVwYXJzZT1xYyxyZS5wb3N0Zm9ybWF0PXFjLHJlLl9yZWxhdGl2ZVRpbWU9cWUscmUucmVsYXRpdmVUaW1lPXJjLHJlLnBhc3RGdXR1cmU9c2MscmUuc2V0PXRjLHJlLm1vbnRocz1XLHJlLl9tb250aHM9RmQscmUubW9udGhzU2hvcnQ9WCxyZS5fbW9udGhzU2hvcnQ9R2QscmUubW9udGhzUGFyc2U9WSxyZS5fbW9udGhzUmVnZXg9SWQscmUubW9udGhzUmVnZXg9YmEscmUuX21vbnRoc1Nob3J0UmVnZXg9SGQscmUubW9udGhzU2hvcnRSZWdleD1hYSxyZS53ZWVrPVFiLHJlLl93ZWVrPSRkLHJlLmZpcnN0RGF5T2ZZZWFyPVNiLHJlLmZpcnN0RGF5T2ZXZWVrPVJiLHJlLndlZWtkYXlzPVdiLHJlLl93ZWVrZGF5cz1hZSxyZS53ZWVrZGF5c01pbj1ZYixyZS5fd2Vla2RheXNNaW49Y2UscmUud2Vla2RheXNTaG9ydD1YYixyZS5fd2Vla2RheXNTaG9ydD1iZSxyZS53ZWVrZGF5c1BhcnNlPVpiLHJlLmlzUE09ZmMscmUuX21lcmlkaWVtUGFyc2U9ZGUscmUubWVyaWRpZW09Z2MseChcXFwiZW5cXFwiLHtvcmRpbmFsUGFyc2U6L1xcXFxkezEsMn0odGh8c3R8bmR8cmQpLyxvcmRpbmFsOmZ1bmN0aW9uKGEpe3ZhciBiPWElMTAsYz0xPT09cihhJTEwMC8xMCk/XFxcInRoXFxcIjoxPT09Yj9cXFwic3RcXFwiOjI9PT1iP1xcXCJuZFxcXCI6Mz09PWI/XFxcInJkXFxcIjpcXFwidGhcXFwiO3JldHVybiBhK2N9fSksYS5sYW5nPWZhKFxcXCJtb21lbnQubGFuZyBpcyBkZXByZWNhdGVkLiBVc2UgbW9tZW50LmxvY2FsZSBpbnN0ZWFkLlxcXCIseCksYS5sYW5nRGF0YT1mYShcXFwibW9tZW50LmxhbmdEYXRhIGlzIGRlcHJlY2F0ZWQuIFVzZSBtb21lbnQubG9jYWxlRGF0YSBpbnN0ZWFkLlxcXCIseik7dmFyIHNlPU1hdGguYWJzLHRlPUxjKFxcXCJtc1xcXCIpLHVlPUxjKFxcXCJzXFxcIiksdmU9TGMoXFxcIm1cXFwiKSx3ZT1MYyhcXFwiaFxcXCIpLHhlPUxjKFxcXCJkXFxcIikseWU9TGMoXFxcIndcXFwiKSx6ZT1MYyhcXFwiTVxcXCIpLEFlPUxjKFxcXCJ5XFxcIiksQmU9TmMoXFxcIm1pbGxpc2Vjb25kc1xcXCIpLENlPU5jKFxcXCJzZWNvbmRzXFxcIiksRGU9TmMoXFxcIm1pbnV0ZXNcXFwiKSxFZT1OYyhcXFwiaG91cnNcXFwiKSxGZT1OYyhcXFwiZGF5c1xcXCIpLEdlPU5jKFxcXCJtb250aHNcXFwiKSxIZT1OYyhcXFwieWVhcnNcXFwiKSxJZT1NYXRoLnJvdW5kLEplPXtzOjQ1LG06NDUsaDoyMixkOjI2LE06MTF9LEtlPU1hdGguYWJzLExlPUlhLnByb3RvdHlwZTtMZS5hYnM9QmMsTGUuYWRkPURjLExlLnN1YnRyYWN0PUVjLExlLmFzPUpjLExlLmFzTWlsbGlzZWNvbmRzPXRlLExlLmFzU2Vjb25kcz11ZSxMZS5hc01pbnV0ZXM9dmUsTGUuYXNIb3Vycz13ZSxMZS5hc0RheXM9eGUsTGUuYXNXZWVrcz15ZSxMZS5hc01vbnRocz16ZSxMZS5hc1llYXJzPUFlLExlLnZhbHVlT2Y9S2MsTGUuX2J1YmJsZT1HYyxMZS5nZXQ9TWMsTGUubWlsbGlzZWNvbmRzPUJlLExlLnNlY29uZHM9Q2UsTGUubWludXRlcz1EZSxMZS5ob3Vycz1FZSxMZS5kYXlzPUZlLExlLndlZWtzPU9jLExlLm1vbnRocz1HZSxMZS55ZWFycz1IZSxMZS5odW1hbml6ZT1TYyxMZS50b0lTT1N0cmluZz1UYyxMZS50b1N0cmluZz1UYyxMZS50b0pTT049VGMsTGUubG9jYWxlPXViLExlLmxvY2FsZURhdGE9dmIsTGUudG9Jc29TdHJpbmc9ZmEoXFxcInRvSXNvU3RyaW5nKCkgaXMgZGVwcmVjYXRlZC4gUGxlYXNlIHVzZSB0b0lTT1N0cmluZygpIGluc3RlYWQgKG5vdGljZSB0aGUgY2FwaXRhbHMpXFxcIixUYyksTGUubGFuZz1aZCxKKFxcXCJYXFxcIiwwLDAsXFxcInVuaXhcXFwiKSxKKFxcXCJ4XFxcIiwwLDAsXFxcInZhbHVlT2ZcXFwiKSxPKFxcXCJ4XFxcIixvZCksTyhcXFwiWFxcXCIscmQpLFMoXFxcIlhcXFwiLGZ1bmN0aW9uKGEsYixjKXtjLl9kPW5ldyBEYXRlKDFlMypwYXJzZUZsb2F0KGEsMTApKX0pLFMoXFxcInhcXFwiLGZ1bmN0aW9uKGEsYixjKXtjLl9kPW5ldyBEYXRlKHIoYSkpfSksYS52ZXJzaW9uPVxcXCIyLjExLjFcXFwiLGIoRWEpLGEuZm49a2UsYS5taW49R2EsYS5tYXg9SGEsYS5ub3c9VGQsYS51dGM9aCxhLnVuaXg9a2MsYS5tb250aHM9d2MsYS5pc0RhdGU9ZCxhLmxvY2FsZT14LGEuaW52YWxpZD1sLGEuZHVyYXRpb249WmEsYS5pc01vbWVudD1wLGEud2Vla2RheXM9eWMsYS5wYXJzZVpvbmU9bGMsYS5sb2NhbGVEYXRhPXosYS5pc0R1cmF0aW9uPUphLGEubW9udGhzU2hvcnQ9eGMsYS53ZWVrZGF5c01pbj1BYyxhLmRlZmluZUxvY2FsZT15LGEud2Vla2RheXNTaG9ydD16YyxhLm5vcm1hbGl6ZVVuaXRzPUIsYS5yZWxhdGl2ZVRpbWVUaHJlc2hvbGQ9UmMsYS5wcm90b3R5cGU9a2U7dmFyIE1lPWE7cmV0dXJuIE1lfSk7XCJcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9yYXctbG9hZGVyIS4vYm93ZXJfY29tcG9uZW50cy9tb21lbnQvbWluL21vbWVudC5taW4uanNcbiAqKiBtb2R1bGUgaWQgPSAxN1xuICoqIG1vZHVsZSBjaHVua3MgPSAyNFxuICoqLyJdLCJtYXBwaW5ncyI6IkFBQUEiLCJzb3VyY2VSb290IjoiIn0=");

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

	eval("__webpack_require__(16)(__webpack_require__(19))\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTguanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ib3dlcl9jb21wb25lbnRzL21vbWVudC10aW1lem9uZS9idWlsZHMvbW9tZW50LXRpbWV6b25lLm1pbi5qcz9mYmZlIl0sInNvdXJjZXNDb250ZW50IjpbInJlcXVpcmUoXCIhIS9ob21lL2RlcGxveWVyL2RlcGxveW1lbnQvanMvbm9kZV9tb2R1bGVzL3NjcmlwdC1sb2FkZXIvYWRkU2NyaXB0LmpzXCIpKHJlcXVpcmUoXCIhIS9ob21lL2RlcGxveWVyL2RlcGxveW1lbnQvanMvbm9kZV9tb2R1bGVzL3Jhdy1sb2FkZXIvaW5kZXguanMhL2hvbWUvZGVwbG95ZXIvZGVwbG95bWVudC9qcy9ib3dlcl9jb21wb25lbnRzL21vbWVudC10aW1lem9uZS9idWlsZHMvbW9tZW50LXRpbWV6b25lLm1pbi5qc1wiKSlcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9zY3JpcHQtbG9hZGVyIS4vYm93ZXJfY29tcG9uZW50cy9tb21lbnQtdGltZXpvbmUvYnVpbGRzL21vbWVudC10aW1lem9uZS5taW4uanNcbiAqKiBtb2R1bGUgaWQgPSAxOFxuICoqIG1vZHVsZSBjaHVua3MgPSAyNFxuICoqLyJdLCJtYXBwaW5ncyI6IkFBQUEiLCJzb3VyY2VSb290IjoiIn0=");

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

	eval("module.exports = \"//! moment-timezone.js\\n//! version : 0.3.1\\n//! author : Tim Wood\\n//! license : MIT\\n//! github.com/moment/moment-timezone\\n!function(a,b){\\\"use strict\\\";\\\"function\\\"==typeof define&&define.amd?define([\\\"moment\\\"],b):\\\"object\\\"==typeof exports?module.exports=b(require(\\\"moment\\\")):b(a.moment)}(this,function(a){\\\"use strict\\\";function b(a){return a>96?a-87:a>64?a-29:a-48}function c(a){var c,d=0,e=a.split(\\\".\\\"),f=e[0],g=e[1]||\\\"\\\",h=1,i=0,j=1;for(45===a.charCodeAt(0)&&(d=1,j=-1),d;d<f.length;d++)c=b(f.charCodeAt(d)),i=60*i+c;for(d=0;d<g.length;d++)h/=60,c=b(g.charCodeAt(d)),i+=c*h;return i*j}function d(a){for(var b=0;b<a.length;b++)a[b]=c(a[b])}function e(a,b){for(var c=0;b>c;c++)a[c]=Math.round((a[c-1]||0)+6e4*a[c]);a[b-1]=1/0}function f(a,b){var c,d=[];for(c=0;c<b.length;c++)d[c]=a[b[c]];return d}function g(a){var b=a.split(\\\"|\\\"),c=b[2].split(\\\" \\\"),g=b[3].split(\\\"\\\"),h=b[4].split(\\\" \\\");return d(c),d(g),d(h),e(h,g.length),{name:b[0],abbrs:f(b[1].split(\\\" \\\"),g),offsets:f(c,g),untils:h}}function h(a){a&&this._set(g(a))}function i(a){return(a||\\\"\\\").toLowerCase().replace(/\\\\//g,\\\"_\\\")}function j(a){var b,c,d;for(\\\"string\\\"==typeof a&&(a=[a]),b=0;b<a.length;b++)c=new h(a[b]),d=i(c.name),y[d]=c,n(d)}function k(a){return y[i(a)]||null}function l(){var a,b=[];for(a in y)y.hasOwnProperty(a)&&y[a]&&b.push(y[a].name);return b.sort()}function m(a){var b,c;for(\\\"string\\\"==typeof a&&(a=[a]),b=0;b<a.length;b++)c=a[b].split(\\\"|\\\"),p(c[0],c[1]),p(c[1],c[0])}function n(a){if(z[a]){var b,c=y[a],d=z[a];for(b=0;b<d.length;b++)o(c,d[b]);z[a]=null}}function o(a,b){var c=y[i(b)]=new h;c._set(a),c.name=b}function p(a,b){a=i(a),y[a]?o(y[a],b):(z[a]=z[a]||[],z[a].push(b))}function q(a){j(a.zones),m(a.links),u.dataVersion=a.version}function r(a){return r.didShowError||(r.didShowError=!0,t(\\\"moment.tz.zoneExists('\\\"+a+\\\"') has been deprecated in favor of !moment.tz.zone('\\\"+a+\\\"')\\\")),!!k(a)}function s(a){return!(!a._a||void 0!==a._tzm)}function t(a){\\\"undefined\\\"!=typeof console&&\\\"function\\\"==typeof console.error&&console.error(a)}function u(b){var c=Array.prototype.slice.call(arguments,0,-1),d=arguments[arguments.length-1],e=k(d),f=a.utc.apply(null,c);return e&&!a.isMoment(b)&&s(f)&&f.add(e.parse(f),\\\"minutes\\\"),f.tz(d),f}function v(a){return function(){return this._z?this._z.abbr(this):a.call(this)}}function w(a){return function(){return this._z=null,a.apply(this,arguments)}}if(void 0!==a.tz)return a;var x=\\\"0.3.1\\\",y={},z={},A=a.version.split(\\\".\\\"),B=+A[0],C=+A[1];(2>B||2===B&&6>C)&&t(\\\"Moment Timezone requires Moment.js >= 2.6.0. You are using Moment.js \\\"+a.version+\\\". See momentjs.com\\\"),h.prototype={_set:function(a){this.name=a.name,this.abbrs=a.abbrs,this.untils=a.untils,this.offsets=a.offsets},_index:function(a){var b,c=+a,d=this.untils;for(b=0;b<d.length;b++)if(c<d[b])return b},parse:function(a){var b,c,d,e,f=+a,g=this.offsets,h=this.untils,i=h.length-1;for(e=0;i>e;e++)if(b=g[e],c=g[e+1],d=g[e?e-1:e],c>b&&u.moveAmbiguousForward?b=c:b>d&&u.moveInvalidForward&&(b=d),f<h[e]-6e4*b)return g[e];return g[i]},abbr:function(a){return this.abbrs[this._index(a)]},offset:function(a){return this.offsets[this._index(a)]}},u.version=x,u.dataVersion=\\\"\\\",u._zones=y,u._links=z,u.add=j,u.link=m,u.load=q,u.zone=k,u.zoneExists=r,u.names=l,u.Zone=h,u.unpack=g,u.unpackBase60=c,u.needsOffset=s,u.moveInvalidForward=!0,u.moveAmbiguousForward=!1;var D=a.fn;a.tz=u,a.defaultZone=null,a.updateOffset=function(b,c){var d;void 0===b._z&&(b._z=a.defaultZone),b._z&&(d=b._z.offset(b),Math.abs(d)<16&&(d/=60),void 0!==b.utcOffset?b.utcOffset(-d,c):b.zone(d,c))},D.tz=function(b){return b?(this._z=k(b),this._z?a.updateOffset(this):t(\\\"Moment Timezone has no data for \\\"+b+\\\". See http://momentjs.com/timezone/docs/#/data-loading/.\\\"),this):this._z?this._z.name:void 0},D.zoneName=v(D.zoneName),D.zoneAbbr=v(D.zoneAbbr),D.utc=w(D.utc),a.tz.setDefault=function(b){return(2>B||2===B&&9>C)&&t(\\\"Moment Timezone setDefault() requires Moment.js >= 2.9.0. You are using Moment.js \\\"+a.version+\\\".\\\"),a.defaultZone=b?k(b):null,a};var E=a.momentProperties;return\\\"[object Array]\\\"===Object.prototype.toString.call(E)?(E.push(\\\"_z\\\"),E.push(\\\"_a\\\")):E&&(E._z=null),a});\"\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTkuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ib3dlcl9jb21wb25lbnRzL21vbWVudC10aW1lem9uZS9idWlsZHMvbW9tZW50LXRpbWV6b25lLm1pbi5qcz8xNDJhIl0sInNvdXJjZXNDb250ZW50IjpbIm1vZHVsZS5leHBvcnRzID0gXCIvLyEgbW9tZW50LXRpbWV6b25lLmpzXFxuLy8hIHZlcnNpb24gOiAwLjMuMVxcbi8vISBhdXRob3IgOiBUaW0gV29vZFxcbi8vISBsaWNlbnNlIDogTUlUXFxuLy8hIGdpdGh1Yi5jb20vbW9tZW50L21vbWVudC10aW1lem9uZVxcbiFmdW5jdGlvbihhLGIpe1xcXCJ1c2Ugc3RyaWN0XFxcIjtcXFwiZnVuY3Rpb25cXFwiPT10eXBlb2YgZGVmaW5lJiZkZWZpbmUuYW1kP2RlZmluZShbXFxcIm1vbWVudFxcXCJdLGIpOlxcXCJvYmplY3RcXFwiPT10eXBlb2YgZXhwb3J0cz9tb2R1bGUuZXhwb3J0cz1iKHJlcXVpcmUoXFxcIm1vbWVudFxcXCIpKTpiKGEubW9tZW50KX0odGhpcyxmdW5jdGlvbihhKXtcXFwidXNlIHN0cmljdFxcXCI7ZnVuY3Rpb24gYihhKXtyZXR1cm4gYT45Nj9hLTg3OmE+NjQ/YS0yOTphLTQ4fWZ1bmN0aW9uIGMoYSl7dmFyIGMsZD0wLGU9YS5zcGxpdChcXFwiLlxcXCIpLGY9ZVswXSxnPWVbMV18fFxcXCJcXFwiLGg9MSxpPTAsaj0xO2Zvcig0NT09PWEuY2hhckNvZGVBdCgwKSYmKGQ9MSxqPS0xKSxkO2Q8Zi5sZW5ndGg7ZCsrKWM9YihmLmNoYXJDb2RlQXQoZCkpLGk9NjAqaStjO2ZvcihkPTA7ZDxnLmxlbmd0aDtkKyspaC89NjAsYz1iKGcuY2hhckNvZGVBdChkKSksaSs9YypoO3JldHVybiBpKmp9ZnVuY3Rpb24gZChhKXtmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdPWMoYVtiXSl9ZnVuY3Rpb24gZShhLGIpe2Zvcih2YXIgYz0wO2I+YztjKyspYVtjXT1NYXRoLnJvdW5kKChhW2MtMV18fDApKzZlNCphW2NdKTthW2ItMV09MS8wfWZ1bmN0aW9uIGYoYSxiKXt2YXIgYyxkPVtdO2ZvcihjPTA7YzxiLmxlbmd0aDtjKyspZFtjXT1hW2JbY11dO3JldHVybiBkfWZ1bmN0aW9uIGcoYSl7dmFyIGI9YS5zcGxpdChcXFwifFxcXCIpLGM9YlsyXS5zcGxpdChcXFwiIFxcXCIpLGc9YlszXS5zcGxpdChcXFwiXFxcIiksaD1iWzRdLnNwbGl0KFxcXCIgXFxcIik7cmV0dXJuIGQoYyksZChnKSxkKGgpLGUoaCxnLmxlbmd0aCkse25hbWU6YlswXSxhYmJyczpmKGJbMV0uc3BsaXQoXFxcIiBcXFwiKSxnKSxvZmZzZXRzOmYoYyxnKSx1bnRpbHM6aH19ZnVuY3Rpb24gaChhKXthJiZ0aGlzLl9zZXQoZyhhKSl9ZnVuY3Rpb24gaShhKXtyZXR1cm4oYXx8XFxcIlxcXCIpLnRvTG93ZXJDYXNlKCkucmVwbGFjZSgvXFxcXC8vZyxcXFwiX1xcXCIpfWZ1bmN0aW9uIGooYSl7dmFyIGIsYyxkO2ZvcihcXFwic3RyaW5nXFxcIj09dHlwZW9mIGEmJihhPVthXSksYj0wO2I8YS5sZW5ndGg7YisrKWM9bmV3IGgoYVtiXSksZD1pKGMubmFtZSkseVtkXT1jLG4oZCl9ZnVuY3Rpb24gayhhKXtyZXR1cm4geVtpKGEpXXx8bnVsbH1mdW5jdGlvbiBsKCl7dmFyIGEsYj1bXTtmb3IoYSBpbiB5KXkuaGFzT3duUHJvcGVydHkoYSkmJnlbYV0mJmIucHVzaCh5W2FdLm5hbWUpO3JldHVybiBiLnNvcnQoKX1mdW5jdGlvbiBtKGEpe3ZhciBiLGM7Zm9yKFxcXCJzdHJpbmdcXFwiPT10eXBlb2YgYSYmKGE9W2FdKSxiPTA7YjxhLmxlbmd0aDtiKyspYz1hW2JdLnNwbGl0KFxcXCJ8XFxcIikscChjWzBdLGNbMV0pLHAoY1sxXSxjWzBdKX1mdW5jdGlvbiBuKGEpe2lmKHpbYV0pe3ZhciBiLGM9eVthXSxkPXpbYV07Zm9yKGI9MDtiPGQubGVuZ3RoO2IrKylvKGMsZFtiXSk7elthXT1udWxsfX1mdW5jdGlvbiBvKGEsYil7dmFyIGM9eVtpKGIpXT1uZXcgaDtjLl9zZXQoYSksYy5uYW1lPWJ9ZnVuY3Rpb24gcChhLGIpe2E9aShhKSx5W2FdP28oeVthXSxiKTooelthXT16W2FdfHxbXSx6W2FdLnB1c2goYikpfWZ1bmN0aW9uIHEoYSl7aihhLnpvbmVzKSxtKGEubGlua3MpLHUuZGF0YVZlcnNpb249YS52ZXJzaW9ufWZ1bmN0aW9uIHIoYSl7cmV0dXJuIHIuZGlkU2hvd0Vycm9yfHwoci5kaWRTaG93RXJyb3I9ITAsdChcXFwibW9tZW50LnR6LnpvbmVFeGlzdHMoJ1xcXCIrYStcXFwiJykgaGFzIGJlZW4gZGVwcmVjYXRlZCBpbiBmYXZvciBvZiAhbW9tZW50LnR6LnpvbmUoJ1xcXCIrYStcXFwiJylcXFwiKSksISFrKGEpfWZ1bmN0aW9uIHMoYSl7cmV0dXJuISghYS5fYXx8dm9pZCAwIT09YS5fdHptKX1mdW5jdGlvbiB0KGEpe1xcXCJ1bmRlZmluZWRcXFwiIT10eXBlb2YgY29uc29sZSYmXFxcImZ1bmN0aW9uXFxcIj09dHlwZW9mIGNvbnNvbGUuZXJyb3ImJmNvbnNvbGUuZXJyb3IoYSl9ZnVuY3Rpb24gdShiKXt2YXIgYz1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMCwtMSksZD1hcmd1bWVudHNbYXJndW1lbnRzLmxlbmd0aC0xXSxlPWsoZCksZj1hLnV0Yy5hcHBseShudWxsLGMpO3JldHVybiBlJiYhYS5pc01vbWVudChiKSYmcyhmKSYmZi5hZGQoZS5wYXJzZShmKSxcXFwibWludXRlc1xcXCIpLGYudHooZCksZn1mdW5jdGlvbiB2KGEpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiB0aGlzLl96P3RoaXMuX3ouYWJicih0aGlzKTphLmNhbGwodGhpcyl9fWZ1bmN0aW9uIHcoYSl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3o9bnVsbCxhLmFwcGx5KHRoaXMsYXJndW1lbnRzKX19aWYodm9pZCAwIT09YS50eilyZXR1cm4gYTt2YXIgeD1cXFwiMC4zLjFcXFwiLHk9e30sej17fSxBPWEudmVyc2lvbi5zcGxpdChcXFwiLlxcXCIpLEI9K0FbMF0sQz0rQVsxXTsoMj5CfHwyPT09QiYmNj5DKSYmdChcXFwiTW9tZW50IFRpbWV6b25lIHJlcXVpcmVzIE1vbWVudC5qcyA+PSAyLjYuMC4gWW91IGFyZSB1c2luZyBNb21lbnQuanMgXFxcIithLnZlcnNpb24rXFxcIi4gU2VlIG1vbWVudGpzLmNvbVxcXCIpLGgucHJvdG90eXBlPXtfc2V0OmZ1bmN0aW9uKGEpe3RoaXMubmFtZT1hLm5hbWUsdGhpcy5hYmJycz1hLmFiYnJzLHRoaXMudW50aWxzPWEudW50aWxzLHRoaXMub2Zmc2V0cz1hLm9mZnNldHN9LF9pbmRleDpmdW5jdGlvbihhKXt2YXIgYixjPSthLGQ9dGhpcy51bnRpbHM7Zm9yKGI9MDtiPGQubGVuZ3RoO2IrKylpZihjPGRbYl0pcmV0dXJuIGJ9LHBhcnNlOmZ1bmN0aW9uKGEpe3ZhciBiLGMsZCxlLGY9K2EsZz10aGlzLm9mZnNldHMsaD10aGlzLnVudGlscyxpPWgubGVuZ3RoLTE7Zm9yKGU9MDtpPmU7ZSsrKWlmKGI9Z1tlXSxjPWdbZSsxXSxkPWdbZT9lLTE6ZV0sYz5iJiZ1Lm1vdmVBbWJpZ3VvdXNGb3J3YXJkP2I9YzpiPmQmJnUubW92ZUludmFsaWRGb3J3YXJkJiYoYj1kKSxmPGhbZV0tNmU0KmIpcmV0dXJuIGdbZV07cmV0dXJuIGdbaV19LGFiYnI6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuYWJicnNbdGhpcy5faW5kZXgoYSldfSxvZmZzZXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMub2Zmc2V0c1t0aGlzLl9pbmRleChhKV19fSx1LnZlcnNpb249eCx1LmRhdGFWZXJzaW9uPVxcXCJcXFwiLHUuX3pvbmVzPXksdS5fbGlua3M9eix1LmFkZD1qLHUubGluaz1tLHUubG9hZD1xLHUuem9uZT1rLHUuem9uZUV4aXN0cz1yLHUubmFtZXM9bCx1LlpvbmU9aCx1LnVucGFjaz1nLHUudW5wYWNrQmFzZTYwPWMsdS5uZWVkc09mZnNldD1zLHUubW92ZUludmFsaWRGb3J3YXJkPSEwLHUubW92ZUFtYmlndW91c0ZvcndhcmQ9ITE7dmFyIEQ9YS5mbjthLnR6PXUsYS5kZWZhdWx0Wm9uZT1udWxsLGEudXBkYXRlT2Zmc2V0PWZ1bmN0aW9uKGIsYyl7dmFyIGQ7dm9pZCAwPT09Yi5feiYmKGIuX3o9YS5kZWZhdWx0Wm9uZSksYi5feiYmKGQ9Yi5fei5vZmZzZXQoYiksTWF0aC5hYnMoZCk8MTYmJihkLz02MCksdm9pZCAwIT09Yi51dGNPZmZzZXQ/Yi51dGNPZmZzZXQoLWQsYyk6Yi56b25lKGQsYykpfSxELnR6PWZ1bmN0aW9uKGIpe3JldHVybiBiPyh0aGlzLl96PWsoYiksdGhpcy5fej9hLnVwZGF0ZU9mZnNldCh0aGlzKTp0KFxcXCJNb21lbnQgVGltZXpvbmUgaGFzIG5vIGRhdGEgZm9yIFxcXCIrYitcXFwiLiBTZWUgaHR0cDovL21vbWVudGpzLmNvbS90aW1lem9uZS9kb2NzLyMvZGF0YS1sb2FkaW5nLy5cXFwiKSx0aGlzKTp0aGlzLl96P3RoaXMuX3oubmFtZTp2b2lkIDB9LEQuem9uZU5hbWU9dihELnpvbmVOYW1lKSxELnpvbmVBYmJyPXYoRC56b25lQWJiciksRC51dGM9dyhELnV0YyksYS50ei5zZXREZWZhdWx0PWZ1bmN0aW9uKGIpe3JldHVybigyPkJ8fDI9PT1CJiY5PkMpJiZ0KFxcXCJNb21lbnQgVGltZXpvbmUgc2V0RGVmYXVsdCgpIHJlcXVpcmVzIE1vbWVudC5qcyA+PSAyLjkuMC4gWW91IGFyZSB1c2luZyBNb21lbnQuanMgXFxcIithLnZlcnNpb24rXFxcIi5cXFwiKSxhLmRlZmF1bHRab25lPWI/ayhiKTpudWxsLGF9O3ZhciBFPWEubW9tZW50UHJvcGVydGllcztyZXR1cm5cXFwiW29iamVjdCBBcnJheV1cXFwiPT09T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKEUpPyhFLnB1c2goXFxcIl96XFxcIiksRS5wdXNoKFxcXCJfYVxcXCIpKTpFJiYoRS5fej1udWxsKSxhfSk7XCJcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9yYXctbG9hZGVyIS4vYm93ZXJfY29tcG9uZW50cy9tb21lbnQtdGltZXpvbmUvYnVpbGRzL21vbWVudC10aW1lem9uZS5taW4uanNcbiAqKiBtb2R1bGUgaWQgPSAxOVxuICoqIG1vZHVsZSBjaHVua3MgPSAyNFxuICoqLyJdLCJtYXBwaW5ncyI6IkFBQUEiLCJzb3VyY2VSb290IjoiIn0=");

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

	eval("__webpack_require__(16)(__webpack_require__(21))\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjAuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ib3dlcl9jb21wb25lbnRzL2Zyb29nYWxvb3AvZnJvb2dhbG9vcC5taW4uanM/MmM0MCJdLCJzb3VyY2VzQ29udGVudCI6WyJyZXF1aXJlKFwiISEvaG9tZS9kZXBsb3llci9kZXBsb3ltZW50L2pzL25vZGVfbW9kdWxlcy9zY3JpcHQtbG9hZGVyL2FkZFNjcmlwdC5qc1wiKShyZXF1aXJlKFwiISEvaG9tZS9kZXBsb3llci9kZXBsb3ltZW50L2pzL25vZGVfbW9kdWxlcy9yYXctbG9hZGVyL2luZGV4LmpzIS9ob21lL2RlcGxveWVyL2RlcGxveW1lbnQvanMvYm93ZXJfY29tcG9uZW50cy9mcm9vZ2Fsb29wL2Zyb29nYWxvb3AubWluLmpzXCIpKVxuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L3NjcmlwdC1sb2FkZXIhLi9ib3dlcl9jb21wb25lbnRzL2Zyb29nYWxvb3AvZnJvb2dhbG9vcC5taW4uanNcbiAqKiBtb2R1bGUgaWQgPSAyMFxuICoqIG1vZHVsZSBjaHVua3MgPSAyNFxuICoqLyJdLCJtYXBwaW5ncyI6IkFBQUEiLCJzb3VyY2VSb290IjoiIn0=");

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

	eval("module.exports = \"var Froogaloop=function(){function e(a){return new e.fn.init(a)}function g(a,c,b){if(!b.contentWindow.postMessage)return!1;a=JSON.stringify({method:a,value:c});b.contentWindow.postMessage(a,h)}function l(a){var c,b;try{c=JSON.parse(a.data),b=c.event||c.method}catch(e){}\\\"ready\\\"!=b||k||(k=!0);if(!/^https?:\\\\/\\\\/player.vimeo.com/.test(a.origin))return!1;\\\"*\\\"===h&&(h=a.origin);a=c.value;var m=c.data,f=\\\"\\\"===f?null:c.player_id;c=f?d[f][b]:d[b];b=[];if(!c)return!1;void 0!==a&&b.push(a);m&&b.push(m);f&&b.push(f);\\nreturn 0<b.length?c.apply(null,b):c.call()}function n(a,c,b){b?(d[b]||(d[b]={}),d[b][a]=c):d[a]=c}var d={},k=!1,h=\\\"*\\\";e.fn=e.prototype={element:null,init:function(a){\\\"string\\\"===typeof a&&(a=document.getElementById(a));this.element=a;return this},api:function(a,c){if(!this.element||!a)return!1;var b=this.element,d=\\\"\\\"!==b.id?b.id:null,e=c&&c.constructor&&c.call&&c.apply?null:c,f=c&&c.constructor&&c.call&&c.apply?c:null;f&&n(a,f,d);g(a,e,b);return this},addEvent:function(a,c){if(!this.element)return!1;\\nvar b=this.element,d=\\\"\\\"!==b.id?b.id:null;n(a,c,d);\\\"ready\\\"!=a?g(\\\"addEventListener\\\",a,b):\\\"ready\\\"==a&&k&&c.call(null,d);return this},removeEvent:function(a){if(!this.element)return!1;var c=this.element,b=\\\"\\\"!==c.id?c.id:null;a:{if(b&&d[b]){if(!d[b][a]){b=!1;break a}d[b][a]=null}else{if(!d[a]){b=!1;break a}d[a]=null}b=!0}\\\"ready\\\"!=a&&b&&g(\\\"removeEventListener\\\",a,c)}};e.fn.init.prototype=e.fn;window.addEventListener?window.addEventListener(\\\"message\\\",l,!1):window.attachEvent(\\\"onmessage\\\",l);return window.Froogaloop=\\nwindow.$f=e}();\\n\"\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjEuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ib3dlcl9jb21wb25lbnRzL2Zyb29nYWxvb3AvZnJvb2dhbG9vcC5taW4uanM/Y2ZmNCJdLCJzb3VyY2VzQ29udGVudCI6WyJtb2R1bGUuZXhwb3J0cyA9IFwidmFyIEZyb29nYWxvb3A9ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKGEpe3JldHVybiBuZXcgZS5mbi5pbml0KGEpfWZ1bmN0aW9uIGcoYSxjLGIpe2lmKCFiLmNvbnRlbnRXaW5kb3cucG9zdE1lc3NhZ2UpcmV0dXJuITE7YT1KU09OLnN0cmluZ2lmeSh7bWV0aG9kOmEsdmFsdWU6Y30pO2IuY29udGVudFdpbmRvdy5wb3N0TWVzc2FnZShhLGgpfWZ1bmN0aW9uIGwoYSl7dmFyIGMsYjt0cnl7Yz1KU09OLnBhcnNlKGEuZGF0YSksYj1jLmV2ZW50fHxjLm1ldGhvZH1jYXRjaChlKXt9XFxcInJlYWR5XFxcIiE9Ynx8a3x8KGs9ITApO2lmKCEvXmh0dHBzPzpcXFxcL1xcXFwvcGxheWVyLnZpbWVvLmNvbS8udGVzdChhLm9yaWdpbikpcmV0dXJuITE7XFxcIipcXFwiPT09aCYmKGg9YS5vcmlnaW4pO2E9Yy52YWx1ZTt2YXIgbT1jLmRhdGEsZj1cXFwiXFxcIj09PWY/bnVsbDpjLnBsYXllcl9pZDtjPWY/ZFtmXVtiXTpkW2JdO2I9W107aWYoIWMpcmV0dXJuITE7dm9pZCAwIT09YSYmYi5wdXNoKGEpO20mJmIucHVzaChtKTtmJiZiLnB1c2goZik7XFxucmV0dXJuIDA8Yi5sZW5ndGg/Yy5hcHBseShudWxsLGIpOmMuY2FsbCgpfWZ1bmN0aW9uIG4oYSxjLGIpe2I/KGRbYl18fChkW2JdPXt9KSxkW2JdW2FdPWMpOmRbYV09Y312YXIgZD17fSxrPSExLGg9XFxcIipcXFwiO2UuZm49ZS5wcm90b3R5cGU9e2VsZW1lbnQ6bnVsbCxpbml0OmZ1bmN0aW9uKGEpe1xcXCJzdHJpbmdcXFwiPT09dHlwZW9mIGEmJihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEpKTt0aGlzLmVsZW1lbnQ9YTtyZXR1cm4gdGhpc30sYXBpOmZ1bmN0aW9uKGEsYyl7aWYoIXRoaXMuZWxlbWVudHx8IWEpcmV0dXJuITE7dmFyIGI9dGhpcy5lbGVtZW50LGQ9XFxcIlxcXCIhPT1iLmlkP2IuaWQ6bnVsbCxlPWMmJmMuY29uc3RydWN0b3ImJmMuY2FsbCYmYy5hcHBseT9udWxsOmMsZj1jJiZjLmNvbnN0cnVjdG9yJiZjLmNhbGwmJmMuYXBwbHk/YzpudWxsO2YmJm4oYSxmLGQpO2coYSxlLGIpO3JldHVybiB0aGlzfSxhZGRFdmVudDpmdW5jdGlvbihhLGMpe2lmKCF0aGlzLmVsZW1lbnQpcmV0dXJuITE7XFxudmFyIGI9dGhpcy5lbGVtZW50LGQ9XFxcIlxcXCIhPT1iLmlkP2IuaWQ6bnVsbDtuKGEsYyxkKTtcXFwicmVhZHlcXFwiIT1hP2coXFxcImFkZEV2ZW50TGlzdGVuZXJcXFwiLGEsYik6XFxcInJlYWR5XFxcIj09YSYmayYmYy5jYWxsKG51bGwsZCk7cmV0dXJuIHRoaXN9LHJlbW92ZUV2ZW50OmZ1bmN0aW9uKGEpe2lmKCF0aGlzLmVsZW1lbnQpcmV0dXJuITE7dmFyIGM9dGhpcy5lbGVtZW50LGI9XFxcIlxcXCIhPT1jLmlkP2MuaWQ6bnVsbDthOntpZihiJiZkW2JdKXtpZighZFtiXVthXSl7Yj0hMTticmVhayBhfWRbYl1bYV09bnVsbH1lbHNle2lmKCFkW2FdKXtiPSExO2JyZWFrIGF9ZFthXT1udWxsfWI9ITB9XFxcInJlYWR5XFxcIiE9YSYmYiYmZyhcXFwicmVtb3ZlRXZlbnRMaXN0ZW5lclxcXCIsYSxjKX19O2UuZm4uaW5pdC5wcm90b3R5cGU9ZS5mbjt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcj93aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcXFwibWVzc2FnZVxcXCIsbCwhMSk6d2luZG93LmF0dGFjaEV2ZW50KFxcXCJvbm1lc3NhZ2VcXFwiLGwpO3JldHVybiB3aW5kb3cuRnJvb2dhbG9vcD1cXG53aW5kb3cuJGY9ZX0oKTtcXG5cIlxuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L3Jhdy1sb2FkZXIhLi9ib3dlcl9jb21wb25lbnRzL2Zyb29nYWxvb3AvZnJvb2dhbG9vcC5taW4uanNcbiAqKiBtb2R1bGUgaWQgPSAyMVxuICoqIG1vZHVsZSBjaHVua3MgPSAyNFxuICoqLyJdLCJtYXBwaW5ncyI6IkFBQUEiLCJzb3VyY2VSb290IjoiIn0=");

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

	eval("__webpack_require__(16)(__webpack_require__(23))\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjIuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ib3dlcl9jb21wb25lbnRzL3VyaS5qcy9zcmMvVVJJLm1pbi5qcz9mMDRkIl0sInNvdXJjZXNDb250ZW50IjpbInJlcXVpcmUoXCIhIS9ob21lL2RlcGxveWVyL2RlcGxveW1lbnQvanMvbm9kZV9tb2R1bGVzL3NjcmlwdC1sb2FkZXIvYWRkU2NyaXB0LmpzXCIpKHJlcXVpcmUoXCIhIS9ob21lL2RlcGxveWVyL2RlcGxveW1lbnQvanMvbm9kZV9tb2R1bGVzL3Jhdy1sb2FkZXIvaW5kZXguanMhL2hvbWUvZGVwbG95ZXIvZGVwbG95bWVudC9qcy9ib3dlcl9jb21wb25lbnRzL3VyaS5qcy9zcmMvVVJJLm1pbi5qc1wiKSlcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9zY3JpcHQtbG9hZGVyIS4vYm93ZXJfY29tcG9uZW50cy91cmkuanMvc3JjL1VSSS5taW4uanNcbiAqKiBtb2R1bGUgaWQgPSAyMlxuICoqIG1vZHVsZSBjaHVua3MgPSAyNFxuICoqLyJdLCJtYXBwaW5ncyI6IkFBQUEiLCJzb3VyY2VSb290IjoiIn0=");

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

	eval("module.exports = \"/*! URI.js v1.15.2 http://medialize.github.io/URI.js/ */\\n/* build contains: IPv6.js, punycode.js, SecondLevelDomains.js, URI.js, URITemplate.js */\\n(function(e,n){\\\"object\\\"===typeof exports?module.exports=n():\\\"function\\\"===typeof define&&define.amd?define(n):e.IPv6=n(e)})(this,function(e){var n=e&&e.IPv6;return{best:function(g){g=g.toLowerCase().split(\\\":\\\");var l=g.length,b=8;\\\"\\\"===g[0]&&\\\"\\\"===g[1]&&\\\"\\\"===g[2]?(g.shift(),g.shift()):\\\"\\\"===g[0]&&\\\"\\\"===g[1]?g.shift():\\\"\\\"===g[l-1]&&\\\"\\\"===g[l-2]&&g.pop();l=g.length;-1!==g[l-1].indexOf(\\\".\\\")&&(b=7);var h;for(h=0;h<l&&\\\"\\\"!==g[h];h++);if(h<b)for(g.splice(h,1,\\\"0000\\\");g.length<b;)g.splice(h,0,\\\"0000\\\");for(h=0;h<b;h++){for(var l=\\ng[h].split(\\\"\\\"),e=0;3>e;e++)if(\\\"0\\\"===l[0]&&1<l.length)l.splice(0,1);else break;g[h]=l.join(\\\"\\\")}var l=-1,n=e=0,k=-1,u=!1;for(h=0;h<b;h++)u?\\\"0\\\"===g[h]?n+=1:(u=!1,n>e&&(l=k,e=n)):\\\"0\\\"===g[h]&&(u=!0,k=h,n=1);n>e&&(l=k,e=n);1<e&&g.splice(l,e,\\\"\\\");l=g.length;b=\\\"\\\";\\\"\\\"===g[0]&&(b=\\\":\\\");for(h=0;h<l;h++){b+=g[h];if(h===l-1)break;b+=\\\":\\\"}\\\"\\\"===g[l-1]&&(b+=\\\":\\\");return b},noConflict:function(){e.IPv6===this&&(e.IPv6=n);return this}}});\\n(function(e){function n(b){throw RangeError(v[b]);}function g(b,f){for(var k=b.length;k--;)b[k]=f(b[k]);return b}function l(b,k){return g(b.split(f),k).join(\\\".\\\")}function b(b){for(var f=[],k=0,g=b.length,a,c;k<g;)a=b.charCodeAt(k++),55296<=a&&56319>=a&&k<g?(c=b.charCodeAt(k++),56320==(c&64512)?f.push(((a&1023)<<10)+(c&1023)+65536):(f.push(a),k--)):f.push(a);return f}function h(b){return g(b,function(b){var f=\\\"\\\";65535<b&&(b-=65536,f+=x(b>>>10&1023|55296),b=56320|b&1023);return f+=x(b)}).join(\\\"\\\")}function A(b,\\nf){return b+22+75*(26>b)-((0!=f)<<5)}function w(b,f,k){var g=0;b=k?q(b/700):b>>1;for(b+=q(b/f);455<b;g+=36)b=q(b/35);return q(g+36*b/(b+38))}function k(b){var f=[],k=b.length,g,a=0,c=128,d=72,m,z,y,e,l;m=b.lastIndexOf(\\\"-\\\");0>m&&(m=0);for(z=0;z<m;++z)128<=b.charCodeAt(z)&&n(\\\"not-basic\\\"),f.push(b.charCodeAt(z));for(m=0<m?m+1:0;m<k;){z=a;g=1;for(y=36;;y+=36){m>=k&&n(\\\"invalid-input\\\");e=b.charCodeAt(m++);e=10>e-48?e-22:26>e-65?e-65:26>e-97?e-97:36;(36<=e||e>q((2147483647-a)/g))&&n(\\\"overflow\\\");a+=e*g;l=\\ny<=d?1:y>=d+26?26:y-d;if(e<l)break;e=36-l;g>q(2147483647/e)&&n(\\\"overflow\\\");g*=e}g=f.length+1;d=w(a-z,g,0==z);q(a/g)>2147483647-c&&n(\\\"overflow\\\");c+=q(a/g);a%=g;f.splice(a++,0,c)}return h(f)}function u(f){var g,k,e,a,c,d,m,z,y,l=[],u,h,p;f=b(f);u=f.length;g=128;k=0;c=72;for(d=0;d<u;++d)y=f[d],128>y&&l.push(x(y));for((e=a=l.length)&&l.push(\\\"-\\\");e<u;){m=2147483647;for(d=0;d<u;++d)y=f[d],y>=g&&y<m&&(m=y);h=e+1;m-g>q((2147483647-k)/h)&&n(\\\"overflow\\\");k+=(m-g)*h;g=m;for(d=0;d<u;++d)if(y=f[d],y<g&&2147483647<\\n++k&&n(\\\"overflow\\\"),y==g){z=k;for(m=36;;m+=36){y=m<=c?1:m>=c+26?26:m-c;if(z<y)break;p=z-y;z=36-y;l.push(x(A(y+p%z,0)));z=q(p/z)}l.push(x(A(z,0)));c=w(k,h,e==a);k=0;++e}++k;++g}return l.join(\\\"\\\")}var D=\\\"object\\\"==typeof exports&&exports,E=\\\"object\\\"==typeof module&&module&&module.exports==D&&module,B=\\\"object\\\"==typeof global&&global;if(B.global===B||B.window===B)e=B;var t,r=/^xn--/,p=/[^ -~]/,f=/\\\\x2E|\\\\u3002|\\\\uFF0E|\\\\uFF61/g,v={overflow:\\\"Overflow: input needs wider integers to process\\\",\\\"not-basic\\\":\\\"Illegal input >= 0x80 (not a basic code point)\\\",\\n\\\"invalid-input\\\":\\\"Invalid input\\\"},q=Math.floor,x=String.fromCharCode,C;t={version:\\\"1.2.3\\\",ucs2:{decode:b,encode:h},decode:k,encode:u,toASCII:function(b){return l(b,function(b){return p.test(b)?\\\"xn--\\\"+u(b):b})},toUnicode:function(b){return l(b,function(b){return r.test(b)?k(b.slice(4).toLowerCase()):b})}};if(\\\"function\\\"==typeof define&&\\\"object\\\"==typeof define.amd&&define.amd)define(function(){return t});else if(D&&!D.nodeType)if(E)E.exports=t;else for(C in t)t.hasOwnProperty(C)&&(D[C]=t[C]);else e.punycode=\\nt})(this);\\n(function(e,n){\\\"object\\\"===typeof exports?module.exports=n():\\\"function\\\"===typeof define&&define.amd?define(n):e.SecondLevelDomains=n(e)})(this,function(e){var n=e&&e.SecondLevelDomains,g={list:{ac:\\\" com gov mil net org \\\",ae:\\\" ac co gov mil name net org pro sch \\\",af:\\\" com edu gov net org \\\",al:\\\" com edu gov mil net org \\\",ao:\\\" co ed gv it og pb \\\",ar:\\\" com edu gob gov int mil net org tur \\\",at:\\\" ac co gv or \\\",au:\\\" asn com csiro edu gov id net org \\\",ba:\\\" co com edu gov mil net org rs unbi unmo unsa untz unze \\\",bb:\\\" biz co com edu gov info net org store tv \\\",\\nbh:\\\" biz cc com edu gov info net org \\\",bn:\\\" com edu gov net org \\\",bo:\\\" com edu gob gov int mil net org tv \\\",br:\\\" adm adv agr am arq art ato b bio blog bmd cim cng cnt com coop ecn edu eng esp etc eti far flog fm fnd fot fst g12 ggf gov imb ind inf jor jus lel mat med mil mus net nom not ntr odo org ppg pro psc psi qsl rec slg srv tmp trd tur tv vet vlog wiki zlg \\\",bs:\\\" com edu gov net org \\\",bz:\\\" du et om ov rg \\\",ca:\\\" ab bc mb nb nf nl ns nt nu on pe qc sk yk \\\",ck:\\\" biz co edu gen gov info net org \\\",\\ncn:\\\" ac ah bj com cq edu fj gd gov gs gx gz ha hb he hi hl hn jl js jx ln mil net nm nx org qh sc sd sh sn sx tj tw xj xz yn zj \\\",co:\\\" com edu gov mil net nom org \\\",cr:\\\" ac c co ed fi go or sa \\\",cy:\\\" ac biz com ekloges gov ltd name net org parliament press pro tm \\\",\\\"do\\\":\\\" art com edu gob gov mil net org sld web \\\",dz:\\\" art asso com edu gov net org pol \\\",ec:\\\" com edu fin gov info med mil net org pro \\\",eg:\\\" com edu eun gov mil name net org sci \\\",er:\\\" com edu gov ind mil net org rochest w \\\",es:\\\" com edu gob nom org \\\",\\net:\\\" biz com edu gov info name net org \\\",fj:\\\" ac biz com info mil name net org pro \\\",fk:\\\" ac co gov net nom org \\\",fr:\\\" asso com f gouv nom prd presse tm \\\",gg:\\\" co net org \\\",gh:\\\" com edu gov mil org \\\",gn:\\\" ac com gov net org \\\",gr:\\\" com edu gov mil net org \\\",gt:\\\" com edu gob ind mil net org \\\",gu:\\\" com edu gov net org \\\",hk:\\\" com edu gov idv net org \\\",hu:\\\" 2000 agrar bolt casino city co erotica erotika film forum games hotel info ingatlan jogasz konyvelo lakas media news org priv reklam sex shop sport suli szex tm tozsde utazas video \\\",\\nid:\\\" ac co go mil net or sch web \\\",il:\\\" ac co gov idf k12 muni net org \\\",\\\"in\\\":\\\" ac co edu ernet firm gen gov i ind mil net nic org res \\\",iq:\\\" com edu gov i mil net org \\\",ir:\\\" ac co dnssec gov i id net org sch \\\",it:\\\" edu gov \\\",je:\\\" co net org \\\",jo:\\\" com edu gov mil name net org sch \\\",jp:\\\" ac ad co ed go gr lg ne or \\\",ke:\\\" ac co go info me mobi ne or sc \\\",kh:\\\" com edu gov mil net org per \\\",ki:\\\" biz com de edu gov info mob net org tel \\\",km:\\\" asso com coop edu gouv k medecin mil nom notaires pharmaciens presse tm veterinaire \\\",\\nkn:\\\" edu gov net org \\\",kr:\\\" ac busan chungbuk chungnam co daegu daejeon es gangwon go gwangju gyeongbuk gyeonggi gyeongnam hs incheon jeju jeonbuk jeonnam k kg mil ms ne or pe re sc seoul ulsan \\\",kw:\\\" com edu gov net org \\\",ky:\\\" com edu gov net org \\\",kz:\\\" com edu gov mil net org \\\",lb:\\\" com edu gov net org \\\",lk:\\\" assn com edu gov grp hotel int ltd net ngo org sch soc web \\\",lr:\\\" com edu gov net org \\\",lv:\\\" asn com conf edu gov id mil net org \\\",ly:\\\" com edu gov id med net org plc sch \\\",ma:\\\" ac co gov m net org press \\\",\\nmc:\\\" asso tm \\\",me:\\\" ac co edu gov its net org priv \\\",mg:\\\" com edu gov mil nom org prd tm \\\",mk:\\\" com edu gov inf name net org pro \\\",ml:\\\" com edu gov net org presse \\\",mn:\\\" edu gov org \\\",mo:\\\" com edu gov net org \\\",mt:\\\" com edu gov net org \\\",mv:\\\" aero biz com coop edu gov info int mil museum name net org pro \\\",mw:\\\" ac co com coop edu gov int museum net org \\\",mx:\\\" com edu gob net org \\\",my:\\\" com edu gov mil name net org sch \\\",nf:\\\" arts com firm info net other per rec store web \\\",ng:\\\" biz com edu gov mil mobi name net org sch \\\",\\nni:\\\" ac co com edu gob mil net nom org \\\",np:\\\" com edu gov mil net org \\\",nr:\\\" biz com edu gov info net org \\\",om:\\\" ac biz co com edu gov med mil museum net org pro sch \\\",pe:\\\" com edu gob mil net nom org sld \\\",ph:\\\" com edu gov i mil net ngo org \\\",pk:\\\" biz com edu fam gob gok gon gop gos gov net org web \\\",pl:\\\" art bialystok biz com edu gda gdansk gorzow gov info katowice krakow lodz lublin mil net ngo olsztyn org poznan pwr radom slupsk szczecin torun warszawa waw wroc wroclaw zgora \\\",pr:\\\" ac biz com edu est gov info isla name net org pro prof \\\",\\nps:\\\" com edu gov net org plo sec \\\",pw:\\\" belau co ed go ne or \\\",ro:\\\" arts com firm info nom nt org rec store tm www \\\",rs:\\\" ac co edu gov in org \\\",sb:\\\" com edu gov net org \\\",sc:\\\" com edu gov net org \\\",sh:\\\" co com edu gov net nom org \\\",sl:\\\" com edu gov net org \\\",st:\\\" co com consulado edu embaixada gov mil net org principe saotome store \\\",sv:\\\" com edu gob org red \\\",sz:\\\" ac co org \\\",tr:\\\" av bbs bel biz com dr edu gen gov info k12 name net org pol tel tsk tv web \\\",tt:\\\" aero biz cat co com coop edu gov info int jobs mil mobi museum name net org pro tel travel \\\",\\ntw:\\\" club com ebiz edu game gov idv mil net org \\\",mu:\\\" ac co com gov net or org \\\",mz:\\\" ac co edu gov org \\\",na:\\\" co com \\\",nz:\\\" ac co cri geek gen govt health iwi maori mil net org parliament school \\\",pa:\\\" abo ac com edu gob ing med net nom org sld \\\",pt:\\\" com edu gov int net nome org publ \\\",py:\\\" com edu gov mil net org \\\",qa:\\\" com edu gov mil net org \\\",re:\\\" asso com nom \\\",ru:\\\" ac adygeya altai amur arkhangelsk astrakhan bashkiria belgorod bir bryansk buryatia cbg chel chelyabinsk chita chukotka chuvashia com dagestan e-burg edu gov grozny int irkutsk ivanovo izhevsk jar joshkar-ola kalmykia kaluga kamchatka karelia kazan kchr kemerovo khabarovsk khakassia khv kirov koenig komi kostroma kranoyarsk kuban kurgan kursk lipetsk magadan mari mari-el marine mil mordovia mosreg msk murmansk nalchik net nnov nov novosibirsk nsk omsk orenburg org oryol penza perm pp pskov ptz rnd ryazan sakhalin samara saratov simbirsk smolensk spb stavropol stv surgut tambov tatarstan tom tomsk tsaritsyn tsk tula tuva tver tyumen udm udmurtia ulan-ude vladikavkaz vladimir vladivostok volgograd vologda voronezh vrn vyatka yakutia yamal yekaterinburg yuzhno-sakhalinsk \\\",\\nrw:\\\" ac co com edu gouv gov int mil net \\\",sa:\\\" com edu gov med net org pub sch \\\",sd:\\\" com edu gov info med net org tv \\\",se:\\\" a ac b bd c d e f g h i k l m n o org p parti pp press r s t tm u w x y z \\\",sg:\\\" com edu gov idn net org per \\\",sn:\\\" art com edu gouv org perso univ \\\",sy:\\\" com edu gov mil net news org \\\",th:\\\" ac co go in mi net or \\\",tj:\\\" ac biz co com edu go gov info int mil name net nic org test web \\\",tn:\\\" agrinet com defense edunet ens fin gov ind info intl mincom nat net org perso rnrt rns rnu tourism \\\",\\ntz:\\\" ac co go ne or \\\",ua:\\\" biz cherkassy chernigov chernovtsy ck cn co com crimea cv dn dnepropetrovsk donetsk dp edu gov if in ivano-frankivsk kh kharkov kherson khmelnitskiy kiev kirovograd km kr ks kv lg lugansk lutsk lviv me mk net nikolaev od odessa org pl poltava pp rovno rv sebastopol sumy te ternopil uzhgorod vinnica vn zaporizhzhe zhitomir zp zt \\\",ug:\\\" ac co go ne or org sc \\\",uk:\\\" ac bl british-library co cym gov govt icnet jet lea ltd me mil mod national-library-scotland nel net nhs nic nls org orgn parliament plc police sch scot soc \\\",\\nus:\\\" dni fed isa kids nsn \\\",uy:\\\" com edu gub mil net org \\\",ve:\\\" co com edu gob info mil net org web \\\",vi:\\\" co com k12 net org \\\",vn:\\\" ac biz com edu gov health info int name net org pro \\\",ye:\\\" co com gov ltd me net org plc \\\",yu:\\\" ac co edu gov org \\\",za:\\\" ac agric alt bourse city co cybernet db edu gov grondar iaccess imt inca landesign law mil net ngo nis nom olivetti org pix school tm web \\\",zm:\\\" ac co com edu gov net org sch \\\"},has:function(e){var b=e.lastIndexOf(\\\".\\\");if(0>=b||b>=e.length-1)return!1;\\nvar h=e.lastIndexOf(\\\".\\\",b-1);if(0>=h||h>=b-1)return!1;var n=g.list[e.slice(b+1)];return n?0<=n.indexOf(\\\" \\\"+e.slice(h+1,b)+\\\" \\\"):!1},is:function(e){var b=e.lastIndexOf(\\\".\\\");if(0>=b||b>=e.length-1||0<=e.lastIndexOf(\\\".\\\",b-1))return!1;var h=g.list[e.slice(b+1)];return h?0<=h.indexOf(\\\" \\\"+e.slice(0,b)+\\\" \\\"):!1},get:function(e){var b=e.lastIndexOf(\\\".\\\");if(0>=b||b>=e.length-1)return null;var h=e.lastIndexOf(\\\".\\\",b-1);if(0>=h||h>=b-1)return null;var n=g.list[e.slice(b+1)];return!n||0>n.indexOf(\\\" \\\"+e.slice(h+\\n1,b)+\\\" \\\")?null:e.slice(h+1)},noConflict:function(){e.SecondLevelDomains===this&&(e.SecondLevelDomains=n);return this}};return g});\\n(function(e,n){\\\"object\\\"===typeof exports?module.exports=n(require(\\\"./punycode\\\"),require(\\\"./IPv6\\\"),require(\\\"./SecondLevelDomains\\\")):\\\"function\\\"===typeof define&&define.amd?define([\\\"./punycode\\\",\\\"./IPv6\\\",\\\"./SecondLevelDomains\\\"],n):e.URI=n(e.punycode,e.IPv6,e.SecondLevelDomains,e)})(this,function(e,n,g,l){function b(a,c){var d=1<=arguments.length,m=2<=arguments.length;if(!(this instanceof b))return d?m?new b(a,c):new b(a):new b;if(void 0===a){if(d)throw new TypeError(\\\"undefined is not a valid argument for URI\\\");\\na=\\\"undefined\\\"!==typeof location?location.href+\\\"\\\":\\\"\\\"}this.href(a);return void 0!==c?this.absoluteTo(c):this}function h(a){return a.replace(/([.*+?^=!:${}()|[\\\\]\\\\/\\\\\\\\])/g,\\\"\\\\\\\\$1\\\")}function A(a){return void 0===a?\\\"Undefined\\\":String(Object.prototype.toString.call(a)).slice(8,-1)}function w(a){return\\\"Array\\\"===A(a)}function k(a,c){var d={},b,f;if(\\\"RegExp\\\"===A(c))d=null;else if(w(c))for(b=0,f=c.length;b<f;b++)d[c[b]]=!0;else d[c]=!0;b=0;for(f=a.length;b<f;b++)if(d&&void 0!==d[a[b]]||!d&&c.test(a[b]))a.splice(b,\\n1),f--,b--;return a}function u(a,c){var d,b;if(w(c)){d=0;for(b=c.length;d<b;d++)if(!u(a,c[d]))return!1;return!0}var f=A(c);d=0;for(b=a.length;d<b;d++)if(\\\"RegExp\\\"===f){if(\\\"string\\\"===typeof a[d]&&a[d].match(c))return!0}else if(a[d]===c)return!0;return!1}function D(a,c){if(!w(a)||!w(c)||a.length!==c.length)return!1;a.sort();c.sort();for(var d=0,b=a.length;d<b;d++)if(a[d]!==c[d])return!1;return!0}function E(a){return escape(a)}function B(a){return encodeURIComponent(a).replace(/[!'()*]/g,E).replace(/\\\\*/g,\\n\\\"%2A\\\")}function t(a){return function(c,d){if(void 0===c)return this._parts[a]||\\\"\\\";this._parts[a]=c||null;this.build(!d);return this}}function r(a,c){return function(d,b){if(void 0===d)return this._parts[a]||\\\"\\\";null!==d&&(d+=\\\"\\\",d.charAt(0)===c&&(d=d.substring(1)));this._parts[a]=d;this.build(!b);return this}}var p=l&&l.URI;b.version=\\\"1.15.2\\\";var f=b.prototype,v=Object.prototype.hasOwnProperty;b._parts=function(){return{protocol:null,username:null,password:null,hostname:null,urn:null,port:null,path:null,\\nquery:null,fragment:null,duplicateQueryParameters:b.duplicateQueryParameters,escapeQuerySpace:b.escapeQuerySpace}};b.duplicateQueryParameters=!1;b.escapeQuerySpace=!0;b.protocol_expression=/^[a-z][a-z0-9.+-]*$/i;b.idn_expression=/[^a-z0-9\\\\.-]/i;b.punycode_expression=/(xn--)/i;b.ip4_expression=/^\\\\d{1,3}\\\\.\\\\d{1,3}\\\\.\\\\d{1,3}\\\\.\\\\d{1,3}$/;b.ip6_expression=/^\\\\s*((([0-9A-Fa-f]{1,4}:){7}([0-9A-Fa-f]{1,4}|:))|(([0-9A-Fa-f]{1,4}:){6}(:[0-9A-Fa-f]{1,4}|((25[0-5]|2[0-4]\\\\d|1\\\\d\\\\d|[1-9]?\\\\d)(\\\\.(25[0-5]|2[0-4]\\\\d|1\\\\d\\\\d|[1-9]?\\\\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){5}(((:[0-9A-Fa-f]{1,4}){1,2})|:((25[0-5]|2[0-4]\\\\d|1\\\\d\\\\d|[1-9]?\\\\d)(\\\\.(25[0-5]|2[0-4]\\\\d|1\\\\d\\\\d|[1-9]?\\\\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){4}(((:[0-9A-Fa-f]{1,4}){1,3})|((:[0-9A-Fa-f]{1,4})?:((25[0-5]|2[0-4]\\\\d|1\\\\d\\\\d|[1-9]?\\\\d)(\\\\.(25[0-5]|2[0-4]\\\\d|1\\\\d\\\\d|[1-9]?\\\\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){3}(((:[0-9A-Fa-f]{1,4}){1,4})|((:[0-9A-Fa-f]{1,4}){0,2}:((25[0-5]|2[0-4]\\\\d|1\\\\d\\\\d|[1-9]?\\\\d)(\\\\.(25[0-5]|2[0-4]\\\\d|1\\\\d\\\\d|[1-9]?\\\\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){2}(((:[0-9A-Fa-f]{1,4}){1,5})|((:[0-9A-Fa-f]{1,4}){0,3}:((25[0-5]|2[0-4]\\\\d|1\\\\d\\\\d|[1-9]?\\\\d)(\\\\.(25[0-5]|2[0-4]\\\\d|1\\\\d\\\\d|[1-9]?\\\\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){1}(((:[0-9A-Fa-f]{1,4}){1,6})|((:[0-9A-Fa-f]{1,4}){0,4}:((25[0-5]|2[0-4]\\\\d|1\\\\d\\\\d|[1-9]?\\\\d)(\\\\.(25[0-5]|2[0-4]\\\\d|1\\\\d\\\\d|[1-9]?\\\\d)){3}))|:))|(:(((:[0-9A-Fa-f]{1,4}){1,7})|((:[0-9A-Fa-f]{1,4}){0,5}:((25[0-5]|2[0-4]\\\\d|1\\\\d\\\\d|[1-9]?\\\\d)(\\\\.(25[0-5]|2[0-4]\\\\d|1\\\\d\\\\d|[1-9]?\\\\d)){3}))|:)))(%.+)?\\\\s*$/;\\nb.find_uri_expression=/\\\\b((?:[a-z][\\\\w-]+:(?:\\\\/{1,3}|[a-z0-9%])|www\\\\d{0,3}[.]|[a-z0-9.\\\\-]+[.][a-z]{2,4}\\\\/)(?:[^\\\\s()<>]+|\\\\(([^\\\\s()<>]+|(\\\\([^\\\\s()<>]+\\\\)))*\\\\))+(?:\\\\(([^\\\\s()<>]+|(\\\\([^\\\\s()<>]+\\\\)))*\\\\)|[^\\\\s`!()\\\\[\\\\]{};:'\\\".,<>?\\\\u00ab\\\\u00bb\\\\u201c\\\\u201d\\\\u2018\\\\u2019]))/ig;b.findUri={start:/\\\\b(?:([a-z][a-z0-9.+-]*:\\\\/\\\\/)|www\\\\.)/gi,end:/[\\\\s\\\\r\\\\n]|$/,trim:/[`!()\\\\[\\\\]{};:'\\\".,<>?\\\\u00ab\\\\u00bb\\\\u201c\\\\u201d\\\\u201e\\\\u2018\\\\u2019]+$/};b.defaultPorts={http:\\\"80\\\",https:\\\"443\\\",ftp:\\\"21\\\",gopher:\\\"70\\\",ws:\\\"80\\\",wss:\\\"443\\\"};b.invalid_hostname_characters=\\n/[^a-zA-Z0-9\\\\.-]/;b.domAttributes={a:\\\"href\\\",blockquote:\\\"cite\\\",link:\\\"href\\\",base:\\\"href\\\",script:\\\"src\\\",form:\\\"action\\\",img:\\\"src\\\",area:\\\"href\\\",iframe:\\\"src\\\",embed:\\\"src\\\",source:\\\"src\\\",track:\\\"src\\\",input:\\\"src\\\",audio:\\\"src\\\",video:\\\"src\\\"};b.getDomAttribute=function(a){if(a&&a.nodeName){var c=a.nodeName.toLowerCase();return\\\"input\\\"===c&&\\\"image\\\"!==a.type?void 0:b.domAttributes[c]}};b.encode=B;b.decode=decodeURIComponent;b.iso8859=function(){b.encode=escape;b.decode=unescape};b.unicode=function(){b.encode=B;b.decode=\\ndecodeURIComponent};b.characters={pathname:{encode:{expression:/%(24|26|2B|2C|3B|3D|3A|40)/ig,map:{\\\"%24\\\":\\\"$\\\",\\\"%26\\\":\\\"&\\\",\\\"%2B\\\":\\\"+\\\",\\\"%2C\\\":\\\",\\\",\\\"%3B\\\":\\\";\\\",\\\"%3D\\\":\\\"=\\\",\\\"%3A\\\":\\\":\\\",\\\"%40\\\":\\\"@\\\"}},decode:{expression:/[\\\\/\\\\?#]/g,map:{\\\"/\\\":\\\"%2F\\\",\\\"?\\\":\\\"%3F\\\",\\\"#\\\":\\\"%23\\\"}}},reserved:{encode:{expression:/%(21|23|24|26|27|28|29|2A|2B|2C|2F|3A|3B|3D|3F|40|5B|5D)/ig,map:{\\\"%3A\\\":\\\":\\\",\\\"%2F\\\":\\\"/\\\",\\\"%3F\\\":\\\"?\\\",\\\"%23\\\":\\\"#\\\",\\\"%5B\\\":\\\"[\\\",\\\"%5D\\\":\\\"]\\\",\\\"%40\\\":\\\"@\\\",\\\"%21\\\":\\\"!\\\",\\\"%24\\\":\\\"$\\\",\\\"%26\\\":\\\"&\\\",\\\"%27\\\":\\\"'\\\",\\\"%28\\\":\\\"(\\\",\\\"%29\\\":\\\")\\\",\\\"%2A\\\":\\\"*\\\",\\\"%2B\\\":\\\"+\\\",\\\"%2C\\\":\\\",\\\",\\n\\\"%3B\\\":\\\";\\\",\\\"%3D\\\":\\\"=\\\"}}},urnpath:{encode:{expression:/%(21|24|27|28|29|2A|2B|2C|3B|3D|40)/ig,map:{\\\"%21\\\":\\\"!\\\",\\\"%24\\\":\\\"$\\\",\\\"%27\\\":\\\"'\\\",\\\"%28\\\":\\\"(\\\",\\\"%29\\\":\\\")\\\",\\\"%2A\\\":\\\"*\\\",\\\"%2B\\\":\\\"+\\\",\\\"%2C\\\":\\\",\\\",\\\"%3B\\\":\\\";\\\",\\\"%3D\\\":\\\"=\\\",\\\"%40\\\":\\\"@\\\"}},decode:{expression:/[\\\\/\\\\?#:]/g,map:{\\\"/\\\":\\\"%2F\\\",\\\"?\\\":\\\"%3F\\\",\\\"#\\\":\\\"%23\\\",\\\":\\\":\\\"%3A\\\"}}}};b.encodeQuery=function(a,c){var d=b.encode(a+\\\"\\\");void 0===c&&(c=b.escapeQuerySpace);return c?d.replace(/%20/g,\\\"+\\\"):d};b.decodeQuery=function(a,c){a+=\\\"\\\";void 0===c&&(c=b.escapeQuerySpace);try{return b.decode(c?a.replace(/\\\\+/g,\\n\\\"%20\\\"):a)}catch(d){return a}};var q={encode:\\\"encode\\\",decode:\\\"decode\\\"},x,C=function(a,c){return function(d){try{return b[c](d+\\\"\\\").replace(b.characters[a][c].expression,function(d){return b.characters[a][c].map[d]})}catch(m){return d}}};for(x in q)b[x+\\\"PathSegment\\\"]=C(\\\"pathname\\\",q[x]),b[x+\\\"UrnPathSegment\\\"]=C(\\\"urnpath\\\",q[x]);q=function(a,c,d){return function(m){var f;f=d?function(a){return b[c](b[d](a))}:b[c];m=(m+\\\"\\\").split(a);for(var e=0,k=m.length;e<k;e++)m[e]=f(m[e]);return m.join(a)}};b.decodePath=\\nq(\\\"/\\\",\\\"decodePathSegment\\\");b.decodeUrnPath=q(\\\":\\\",\\\"decodeUrnPathSegment\\\");b.recodePath=q(\\\"/\\\",\\\"encodePathSegment\\\",\\\"decode\\\");b.recodeUrnPath=q(\\\":\\\",\\\"encodeUrnPathSegment\\\",\\\"decode\\\");b.encodeReserved=C(\\\"reserved\\\",\\\"encode\\\");b.parse=function(a,c){var d;c||(c={});d=a.indexOf(\\\"#\\\");-1<d&&(c.fragment=a.substring(d+1)||null,a=a.substring(0,d));d=a.indexOf(\\\"?\\\");-1<d&&(c.query=a.substring(d+1)||null,a=a.substring(0,d));\\\"//\\\"===a.substring(0,2)?(c.protocol=null,a=a.substring(2),a=b.parseAuthority(a,c)):(d=a.indexOf(\\\":\\\"),\\n-1<d&&(c.protocol=a.substring(0,d)||null,c.protocol&&!c.protocol.match(b.protocol_expression)?c.protocol=void 0:\\\"//\\\"===a.substring(d+1,d+3)?(a=a.substring(d+3),a=b.parseAuthority(a,c)):(a=a.substring(d+1),c.urn=!0)));c.path=a;return c};b.parseHost=function(a,c){var d=a.indexOf(\\\"/\\\"),b;-1===d&&(d=a.length);if(\\\"[\\\"===a.charAt(0))b=a.indexOf(\\\"]\\\"),c.hostname=a.substring(1,b)||null,c.port=a.substring(b+2,d)||null,\\\"/\\\"===c.port&&(c.port=null);else{var f=a.indexOf(\\\":\\\");b=a.indexOf(\\\"/\\\");f=a.indexOf(\\\":\\\",f+1);\\n-1!==f&&(-1===b||f<b)?(c.hostname=a.substring(0,d)||null,c.port=null):(b=a.substring(0,d).split(\\\":\\\"),c.hostname=b[0]||null,c.port=b[1]||null)}c.hostname&&\\\"/\\\"!==a.substring(d).charAt(0)&&(d++,a=\\\"/\\\"+a);return a.substring(d)||\\\"/\\\"};b.parseAuthority=function(a,c){a=b.parseUserinfo(a,c);return b.parseHost(a,c)};b.parseUserinfo=function(a,c){var d=a.indexOf(\\\"/\\\"),m=a.lastIndexOf(\\\"@\\\",-1<d?d:a.length-1);-1<m&&(-1===d||m<d)?(d=a.substring(0,m).split(\\\":\\\"),c.username=d[0]?b.decode(d[0]):null,d.shift(),c.password=\\nd[0]?b.decode(d.join(\\\":\\\")):null,a=a.substring(m+1)):(c.username=null,c.password=null);return a};b.parseQuery=function(a,c){if(!a)return{};a=a.replace(/&+/g,\\\"&\\\").replace(/^\\\\?*&*|&+$/g,\\\"\\\");if(!a)return{};for(var d={},m=a.split(\\\"&\\\"),f=m.length,e,k,g=0;g<f;g++)if(e=m[g].split(\\\"=\\\"),k=b.decodeQuery(e.shift(),c),e=e.length?b.decodeQuery(e.join(\\\"=\\\"),c):null,v.call(d,k)){if(\\\"string\\\"===typeof d[k]||null===d[k])d[k]=[d[k]];d[k].push(e)}else d[k]=e;return d};b.build=function(a){var c=\\\"\\\";a.protocol&&(c+=a.protocol+\\n\\\":\\\");a.urn||!c&&!a.hostname||(c+=\\\"//\\\");c+=b.buildAuthority(a)||\\\"\\\";\\\"string\\\"===typeof a.path&&(\\\"/\\\"!==a.path.charAt(0)&&\\\"string\\\"===typeof a.hostname&&(c+=\\\"/\\\"),c+=a.path);\\\"string\\\"===typeof a.query&&a.query&&(c+=\\\"?\\\"+a.query);\\\"string\\\"===typeof a.fragment&&a.fragment&&(c+=\\\"#\\\"+a.fragment);return c};b.buildHost=function(a){var c=\\\"\\\";if(a.hostname)c=b.ip6_expression.test(a.hostname)?c+(\\\"[\\\"+a.hostname+\\\"]\\\"):c+a.hostname;else return\\\"\\\";a.port&&(c+=\\\":\\\"+a.port);return c};b.buildAuthority=function(a){return b.buildUserinfo(a)+\\nb.buildHost(a)};b.buildUserinfo=function(a){var c=\\\"\\\";a.username&&(c+=b.encode(a.username),a.password&&(c+=\\\":\\\"+b.encode(a.password)),c+=\\\"@\\\");return c};b.buildQuery=function(a,c,d){var m=\\\"\\\",f,e,k,g;for(e in a)if(v.call(a,e)&&e)if(w(a[e]))for(f={},k=0,g=a[e].length;k<g;k++)void 0!==a[e][k]&&void 0===f[a[e][k]+\\\"\\\"]&&(m+=\\\"&\\\"+b.buildQueryParameter(e,a[e][k],d),!0!==c&&(f[a[e][k]+\\\"\\\"]=!0));else void 0!==a[e]&&(m+=\\\"&\\\"+b.buildQueryParameter(e,a[e],d));return m.substring(1)};b.buildQueryParameter=function(a,\\nc,d){return b.encodeQuery(a,d)+(null!==c?\\\"=\\\"+b.encodeQuery(c,d):\\\"\\\")};b.addQuery=function(a,c,d){if(\\\"object\\\"===typeof c)for(var m in c)v.call(c,m)&&b.addQuery(a,m,c[m]);else if(\\\"string\\\"===typeof c)void 0===a[c]?a[c]=d:(\\\"string\\\"===typeof a[c]&&(a[c]=[a[c]]),w(d)||(d=[d]),a[c]=(a[c]||[]).concat(d));else throw new TypeError(\\\"URI.addQuery() accepts an object, string as the name parameter\\\");};b.removeQuery=function(a,c,d){var m;if(w(c))for(d=0,m=c.length;d<m;d++)a[c[d]]=void 0;else if(\\\"RegExp\\\"===A(c))for(m in a)c.test(m)&&\\n(a[m]=void 0);else if(\\\"object\\\"===typeof c)for(m in c)v.call(c,m)&&b.removeQuery(a,m,c[m]);else if(\\\"string\\\"===typeof c)void 0!==d?\\\"RegExp\\\"===A(d)?!w(a[c])&&d.test(a[c])?a[c]=void 0:a[c]=k(a[c],d):a[c]===d?a[c]=void 0:w(a[c])&&(a[c]=k(a[c],d)):a[c]=void 0;else throw new TypeError(\\\"URI.removeQuery() accepts an object, string, RegExp as the first parameter\\\");};b.hasQuery=function(a,c,d,m){if(\\\"object\\\"===typeof c){for(var f in c)if(v.call(c,f)&&!b.hasQuery(a,f,c[f]))return!1;return!0}if(\\\"string\\\"!==typeof c)throw new TypeError(\\\"URI.hasQuery() accepts an object, string as the name parameter\\\");\\nswitch(A(d)){case \\\"Undefined\\\":return c in a;case \\\"Boolean\\\":return a=Boolean(w(a[c])?a[c].length:a[c]),d===a;case \\\"Function\\\":return!!d(a[c],c,a);case \\\"Array\\\":return w(a[c])?(m?u:D)(a[c],d):!1;case \\\"RegExp\\\":return w(a[c])?m?u(a[c],d):!1:Boolean(a[c]&&a[c].match(d));case \\\"Number\\\":d=String(d);case \\\"String\\\":return w(a[c])?m?u(a[c],d):!1:a[c]===d;default:throw new TypeError(\\\"URI.hasQuery() accepts undefined, boolean, string, number, RegExp, Function as the value parameter\\\");}};b.commonPath=function(a,c){var d=\\nMath.min(a.length,c.length),b;for(b=0;b<d;b++)if(a.charAt(b)!==c.charAt(b)){b--;break}if(1>b)return a.charAt(0)===c.charAt(0)&&\\\"/\\\"===a.charAt(0)?\\\"/\\\":\\\"\\\";if(\\\"/\\\"!==a.charAt(b)||\\\"/\\\"!==c.charAt(b))b=a.substring(0,b).lastIndexOf(\\\"/\\\");return a.substring(0,b+1)};b.withinString=function(a,c,d){d||(d={});var m=d.start||b.findUri.start,f=d.end||b.findUri.end,e=d.trim||b.findUri.trim,k=/[a-z0-9-]=[\\\"']?$/i;for(m.lastIndex=0;;){var g=m.exec(a);if(!g)break;g=g.index;if(d.ignoreHtml){var u=a.slice(Math.max(g-3,0),\\ng);if(u&&k.test(u))continue}var u=g+a.slice(g).search(f),h=a.slice(g,u).replace(e,\\\"\\\");d.ignore&&d.ignore.test(h)||(u=g+h.length,h=c(h,g,u,a),a=a.slice(0,g)+h+a.slice(u),m.lastIndex=g+h.length)}m.lastIndex=0;return a};b.ensureValidHostname=function(a){if(a.match(b.invalid_hostname_characters)){if(!e)throw new TypeError('Hostname \\\"'+a+'\\\" contains characters other than [A-Z0-9.-] and Punycode.js is not available');if(e.toASCII(a).match(b.invalid_hostname_characters))throw new TypeError('Hostname \\\"'+\\na+'\\\" contains characters other than [A-Z0-9.-]');}};b.noConflict=function(a){if(a)return a={URI:this.noConflict()},l.URITemplate&&\\\"function\\\"===typeof l.URITemplate.noConflict&&(a.URITemplate=l.URITemplate.noConflict()),l.IPv6&&\\\"function\\\"===typeof l.IPv6.noConflict&&(a.IPv6=l.IPv6.noConflict()),l.SecondLevelDomains&&\\\"function\\\"===typeof l.SecondLevelDomains.noConflict&&(a.SecondLevelDomains=l.SecondLevelDomains.noConflict()),a;l.URI===this&&(l.URI=p);return this};f.build=function(a){if(!0===a)this._deferred_build=\\n!0;else if(void 0===a||this._deferred_build)this._string=b.build(this._parts),this._deferred_build=!1;return this};f.clone=function(){return new b(this)};f.valueOf=f.toString=function(){return this.build(!1)._string};f.protocol=t(\\\"protocol\\\");f.username=t(\\\"username\\\");f.password=t(\\\"password\\\");f.hostname=t(\\\"hostname\\\");f.port=t(\\\"port\\\");f.query=r(\\\"query\\\",\\\"?\\\");f.fragment=r(\\\"fragment\\\",\\\"#\\\");f.search=function(a,c){var b=this.query(a,c);return\\\"string\\\"===typeof b&&b.length?\\\"?\\\"+b:b};f.hash=function(a,c){var b=\\nthis.fragment(a,c);return\\\"string\\\"===typeof b&&b.length?\\\"#\\\"+b:b};f.pathname=function(a,c){if(void 0===a||!0===a){var d=this._parts.path||(this._parts.hostname?\\\"/\\\":\\\"\\\");return a?(this._parts.urn?b.decodeUrnPath:b.decodePath)(d):d}this._parts.path=this._parts.urn?a?b.recodeUrnPath(a):\\\"\\\":a?b.recodePath(a):\\\"/\\\";this.build(!c);return this};f.path=f.pathname;f.href=function(a,c){var d;if(void 0===a)return this.toString();this._string=\\\"\\\";this._parts=b._parts();var f=a instanceof b,e=\\\"object\\\"===typeof a&&(a.hostname||\\na.path||a.pathname);a.nodeName&&(e=b.getDomAttribute(a),a=a[e]||\\\"\\\",e=!1);!f&&e&&void 0!==a.pathname&&(a=a.toString());if(\\\"string\\\"===typeof a||a instanceof String)this._parts=b.parse(String(a),this._parts);else if(f||e)for(d in f=f?a._parts:a,f)v.call(this._parts,d)&&(this._parts[d]=f[d]);else throw new TypeError(\\\"invalid input\\\");this.build(!c);return this};f.is=function(a){var c=!1,d=!1,f=!1,e=!1,k=!1,u=!1,h=!1,l=!this._parts.urn;this._parts.hostname&&(l=!1,d=b.ip4_expression.test(this._parts.hostname),\\nf=b.ip6_expression.test(this._parts.hostname),c=d||f,k=(e=!c)&&g&&g.has(this._parts.hostname),u=e&&b.idn_expression.test(this._parts.hostname),h=e&&b.punycode_expression.test(this._parts.hostname));switch(a.toLowerCase()){case \\\"relative\\\":return l;case \\\"absolute\\\":return!l;case \\\"domain\\\":case \\\"name\\\":return e;case \\\"sld\\\":return k;case \\\"ip\\\":return c;case \\\"ip4\\\":case \\\"ipv4\\\":case \\\"inet4\\\":return d;case \\\"ip6\\\":case \\\"ipv6\\\":case \\\"inet6\\\":return f;case \\\"idn\\\":return u;case \\\"url\\\":return!this._parts.urn;case \\\"urn\\\":return!!this._parts.urn;\\ncase \\\"punycode\\\":return h}return null};var F=f.protocol,G=f.port,H=f.hostname;f.protocol=function(a,c){if(void 0!==a&&a&&(a=a.replace(/:(\\\\/\\\\/)?$/,\\\"\\\"),!a.match(b.protocol_expression)))throw new TypeError('Protocol \\\"'+a+\\\"\\\\\\\" contains characters other than [A-Z0-9.+-] or doesn't start with [A-Z]\\\");return F.call(this,a,c)};f.scheme=f.protocol;f.port=function(a,c){if(this._parts.urn)return void 0===a?\\\"\\\":this;if(void 0!==a&&(0===a&&(a=null),a&&(a+=\\\"\\\",\\\":\\\"===a.charAt(0)&&(a=a.substring(1)),a.match(/[^0-9]/))))throw new TypeError('Port \\\"'+\\na+'\\\" contains characters other than [0-9]');return G.call(this,a,c)};f.hostname=function(a,c){if(this._parts.urn)return void 0===a?\\\"\\\":this;if(void 0!==a){var d={};b.parseHost(a,d);a=d.hostname}return H.call(this,a,c)};f.host=function(a,c){if(this._parts.urn)return void 0===a?\\\"\\\":this;if(void 0===a)return this._parts.hostname?b.buildHost(this._parts):\\\"\\\";b.parseHost(a,this._parts);this.build(!c);return this};f.authority=function(a,c){if(this._parts.urn)return void 0===a?\\\"\\\":this;if(void 0===a)return this._parts.hostname?\\nb.buildAuthority(this._parts):\\\"\\\";b.parseAuthority(a,this._parts);this.build(!c);return this};f.userinfo=function(a,c){if(this._parts.urn)return void 0===a?\\\"\\\":this;if(void 0===a){if(!this._parts.username)return\\\"\\\";var d=b.buildUserinfo(this._parts);return d.substring(0,d.length-1)}\\\"@\\\"!==a[a.length-1]&&(a+=\\\"@\\\");b.parseUserinfo(a,this._parts);this.build(!c);return this};f.resource=function(a,c){var d;if(void 0===a)return this.path()+this.search()+this.hash();d=b.parse(a);this._parts.path=d.path;this._parts.query=\\nd.query;this._parts.fragment=d.fragment;this.build(!c);return this};f.subdomain=function(a,c){if(this._parts.urn)return void 0===a?\\\"\\\":this;if(void 0===a){if(!this._parts.hostname||this.is(\\\"IP\\\"))return\\\"\\\";var d=this._parts.hostname.length-this.domain().length-1;return this._parts.hostname.substring(0,d)||\\\"\\\"}d=this._parts.hostname.length-this.domain().length;d=this._parts.hostname.substring(0,d);d=new RegExp(\\\"^\\\"+h(d));a&&\\\".\\\"!==a.charAt(a.length-1)&&(a+=\\\".\\\");a&&b.ensureValidHostname(a);this._parts.hostname=\\nthis._parts.hostname.replace(d,a);this.build(!c);return this};f.domain=function(a,c){if(this._parts.urn)return void 0===a?\\\"\\\":this;\\\"boolean\\\"===typeof a&&(c=a,a=void 0);if(void 0===a){if(!this._parts.hostname||this.is(\\\"IP\\\"))return\\\"\\\";var d=this._parts.hostname.match(/\\\\./g);if(d&&2>d.length)return this._parts.hostname;d=this._parts.hostname.length-this.tld(c).length-1;d=this._parts.hostname.lastIndexOf(\\\".\\\",d-1)+1;return this._parts.hostname.substring(d)||\\\"\\\"}if(!a)throw new TypeError(\\\"cannot set domain empty\\\");\\nb.ensureValidHostname(a);!this._parts.hostname||this.is(\\\"IP\\\")?this._parts.hostname=a:(d=new RegExp(h(this.domain())+\\\"$\\\"),this._parts.hostname=this._parts.hostname.replace(d,a));this.build(!c);return this};f.tld=function(a,c){if(this._parts.urn)return void 0===a?\\\"\\\":this;\\\"boolean\\\"===typeof a&&(c=a,a=void 0);if(void 0===a){if(!this._parts.hostname||this.is(\\\"IP\\\"))return\\\"\\\";var b=this._parts.hostname.lastIndexOf(\\\".\\\"),b=this._parts.hostname.substring(b+1);return!0!==c&&g&&g.list[b.toLowerCase()]?g.get(this._parts.hostname)||\\nb:b}if(a)if(a.match(/[^a-zA-Z0-9-]/))if(g&&g.is(a))b=new RegExp(h(this.tld())+\\\"$\\\"),this._parts.hostname=this._parts.hostname.replace(b,a);else throw new TypeError('TLD \\\"'+a+'\\\" contains characters other than [A-Z0-9]');else{if(!this._parts.hostname||this.is(\\\"IP\\\"))throw new ReferenceError(\\\"cannot set TLD on non-domain host\\\");b=new RegExp(h(this.tld())+\\\"$\\\");this._parts.hostname=this._parts.hostname.replace(b,a)}else throw new TypeError(\\\"cannot set TLD empty\\\");this.build(!c);return this};f.directory=\\nfunction(a,c){if(this._parts.urn)return void 0===a?\\\"\\\":this;if(void 0===a||!0===a){if(!this._parts.path&&!this._parts.hostname)return\\\"\\\";if(\\\"/\\\"===this._parts.path)return\\\"/\\\";var d=this._parts.path.length-this.filename().length-1,d=this._parts.path.substring(0,d)||(this._parts.hostname?\\\"/\\\":\\\"\\\");return a?b.decodePath(d):d}d=this._parts.path.length-this.filename().length;d=this._parts.path.substring(0,d);d=new RegExp(\\\"^\\\"+h(d));this.is(\\\"relative\\\")||(a||(a=\\\"/\\\"),\\\"/\\\"!==a.charAt(0)&&(a=\\\"/\\\"+a));a&&\\\"/\\\"!==a.charAt(a.length-\\n1)&&(a+=\\\"/\\\");a=b.recodePath(a);this._parts.path=this._parts.path.replace(d,a);this.build(!c);return this};f.filename=function(a,c){if(this._parts.urn)return void 0===a?\\\"\\\":this;if(void 0===a||!0===a){if(!this._parts.path||\\\"/\\\"===this._parts.path)return\\\"\\\";var d=this._parts.path.lastIndexOf(\\\"/\\\"),d=this._parts.path.substring(d+1);return a?b.decodePathSegment(d):d}d=!1;\\\"/\\\"===a.charAt(0)&&(a=a.substring(1));a.match(/\\\\.?\\\\//)&&(d=!0);var f=new RegExp(h(this.filename())+\\\"$\\\");a=b.recodePath(a);this._parts.path=\\nthis._parts.path.replace(f,a);d?this.normalizePath(c):this.build(!c);return this};f.suffix=function(a,c){if(this._parts.urn)return void 0===a?\\\"\\\":this;if(void 0===a||!0===a){if(!this._parts.path||\\\"/\\\"===this._parts.path)return\\\"\\\";var d=this.filename(),f=d.lastIndexOf(\\\".\\\");if(-1===f)return\\\"\\\";d=d.substring(f+1);d=/^[a-z0-9%]+$/i.test(d)?d:\\\"\\\";return a?b.decodePathSegment(d):d}\\\".\\\"===a.charAt(0)&&(a=a.substring(1));if(d=this.suffix())f=a?new RegExp(h(d)+\\\"$\\\"):new RegExp(h(\\\".\\\"+d)+\\\"$\\\");else{if(!a)return this;\\nthis._parts.path+=\\\".\\\"+b.recodePath(a)}f&&(a=b.recodePath(a),this._parts.path=this._parts.path.replace(f,a));this.build(!c);return this};f.segment=function(a,c,b){var f=this._parts.urn?\\\":\\\":\\\"/\\\",e=this.path(),k=\\\"/\\\"===e.substring(0,1),e=e.split(f);void 0!==a&&\\\"number\\\"!==typeof a&&(b=c,c=a,a=void 0);if(void 0!==a&&\\\"number\\\"!==typeof a)throw Error('Bad segment \\\"'+a+'\\\", must be 0-based integer');k&&e.shift();0>a&&(a=Math.max(e.length+a,0));if(void 0===c)return void 0===a?e:e[a];if(null===a||void 0===e[a])if(w(c)){e=\\n[];a=0;for(var g=c.length;a<g;a++)if(c[a].length||e.length&&e[e.length-1].length)e.length&&!e[e.length-1].length&&e.pop(),e.push(c[a])}else{if(c||\\\"string\\\"===typeof c)\\\"\\\"===e[e.length-1]?e[e.length-1]=c:e.push(c)}else c?e[a]=c:e.splice(a,1);k&&e.unshift(\\\"\\\");return this.path(e.join(f),b)};f.segmentCoded=function(a,c,d){var f,e;\\\"number\\\"!==typeof a&&(d=c,c=a,a=void 0);if(void 0===c){a=this.segment(a,c,d);if(w(a))for(f=0,e=a.length;f<e;f++)a[f]=b.decode(a[f]);else a=void 0!==a?b.decode(a):void 0;return a}if(w(c))for(f=\\n0,e=c.length;f<e;f++)c[f]=b.encode(c[f]);else c=\\\"string\\\"===typeof c||c instanceof String?b.encode(c):c;return this.segment(a,c,d)};var I=f.query;f.query=function(a,c){if(!0===a)return b.parseQuery(this._parts.query,this._parts.escapeQuerySpace);if(\\\"function\\\"===typeof a){var d=b.parseQuery(this._parts.query,this._parts.escapeQuerySpace),f=a.call(this,d);this._parts.query=b.buildQuery(f||d,this._parts.duplicateQueryParameters,this._parts.escapeQuerySpace);this.build(!c);return this}return void 0!==\\na&&\\\"string\\\"!==typeof a?(this._parts.query=b.buildQuery(a,this._parts.duplicateQueryParameters,this._parts.escapeQuerySpace),this.build(!c),this):I.call(this,a,c)};f.setQuery=function(a,c,d){var f=b.parseQuery(this._parts.query,this._parts.escapeQuerySpace);if(\\\"string\\\"===typeof a||a instanceof String)f[a]=void 0!==c?c:null;else if(\\\"object\\\"===typeof a)for(var e in a)v.call(a,e)&&(f[e]=a[e]);else throw new TypeError(\\\"URI.addQuery() accepts an object, string as the name parameter\\\");this._parts.query=\\nb.buildQuery(f,this._parts.duplicateQueryParameters,this._parts.escapeQuerySpace);\\\"string\\\"!==typeof a&&(d=c);this.build(!d);return this};f.addQuery=function(a,c,d){var f=b.parseQuery(this._parts.query,this._parts.escapeQuerySpace);b.addQuery(f,a,void 0===c?null:c);this._parts.query=b.buildQuery(f,this._parts.duplicateQueryParameters,this._parts.escapeQuerySpace);\\\"string\\\"!==typeof a&&(d=c);this.build(!d);return this};f.removeQuery=function(a,c,d){var f=b.parseQuery(this._parts.query,this._parts.escapeQuerySpace);\\nb.removeQuery(f,a,c);this._parts.query=b.buildQuery(f,this._parts.duplicateQueryParameters,this._parts.escapeQuerySpace);\\\"string\\\"!==typeof a&&(d=c);this.build(!d);return this};f.hasQuery=function(a,c,d){var f=b.parseQuery(this._parts.query,this._parts.escapeQuerySpace);return b.hasQuery(f,a,c,d)};f.setSearch=f.setQuery;f.addSearch=f.addQuery;f.removeSearch=f.removeQuery;f.hasSearch=f.hasQuery;f.normalize=function(){return this._parts.urn?this.normalizeProtocol(!1).normalizePath(!1).normalizeQuery(!1).normalizeFragment(!1).build():\\nthis.normalizeProtocol(!1).normalizeHostname(!1).normalizePort(!1).normalizePath(!1).normalizeQuery(!1).normalizeFragment(!1).build()};f.normalizeProtocol=function(a){\\\"string\\\"===typeof this._parts.protocol&&(this._parts.protocol=this._parts.protocol.toLowerCase(),this.build(!a));return this};f.normalizeHostname=function(a){this._parts.hostname&&(this.is(\\\"IDN\\\")&&e?this._parts.hostname=e.toASCII(this._parts.hostname):this.is(\\\"IPv6\\\")&&n&&(this._parts.hostname=n.best(this._parts.hostname)),this._parts.hostname=\\nthis._parts.hostname.toLowerCase(),this.build(!a));return this};f.normalizePort=function(a){\\\"string\\\"===typeof this._parts.protocol&&this._parts.port===b.defaultPorts[this._parts.protocol]&&(this._parts.port=null,this.build(!a));return this};f.normalizePath=function(a){var c=this._parts.path;if(!c)return this;if(this._parts.urn)return this._parts.path=b.recodeUrnPath(this._parts.path),this.build(!a),this;if(\\\"/\\\"===this._parts.path)return this;var d,f=\\\"\\\",e,k;\\\"/\\\"!==c.charAt(0)&&(d=!0,c=\\\"/\\\"+c);if(\\\"/..\\\"===\\nc.slice(-3)||\\\"/.\\\"===c.slice(-2))c+=\\\"/\\\";c=c.replace(/(\\\\/(\\\\.\\\\/)+)|(\\\\/\\\\.$)/g,\\\"/\\\").replace(/\\\\/{2,}/g,\\\"/\\\");d&&(f=c.substring(1).match(/^(\\\\.\\\\.\\\\/)+/)||\\\"\\\")&&(f=f[0]);for(;;){e=c.indexOf(\\\"/..\\\");if(-1===e)break;else if(0===e){c=c.substring(3);continue}k=c.substring(0,e).lastIndexOf(\\\"/\\\");-1===k&&(k=e);c=c.substring(0,k)+c.substring(e+3)}d&&this.is(\\\"relative\\\")&&(c=f+c.substring(1));c=b.recodePath(c);this._parts.path=c;this.build(!a);return this};f.normalizePathname=f.normalizePath;f.normalizeQuery=function(a){\\\"string\\\"===\\ntypeof this._parts.query&&(this._parts.query.length?this.query(b.parseQuery(this._parts.query,this._parts.escapeQuerySpace)):this._parts.query=null,this.build(!a));return this};f.normalizeFragment=function(a){this._parts.fragment||(this._parts.fragment=null,this.build(!a));return this};f.normalizeSearch=f.normalizeQuery;f.normalizeHash=f.normalizeFragment;f.iso8859=function(){var a=b.encode,c=b.decode;b.encode=escape;b.decode=decodeURIComponent;try{this.normalize()}finally{b.encode=a,b.decode=c}return this};\\nf.unicode=function(){var a=b.encode,c=b.decode;b.encode=B;b.decode=unescape;try{this.normalize()}finally{b.encode=a,b.decode=c}return this};f.readable=function(){var a=this.clone();a.username(\\\"\\\").password(\\\"\\\").normalize();var c=\\\"\\\";a._parts.protocol&&(c+=a._parts.protocol+\\\"://\\\");a._parts.hostname&&(a.is(\\\"punycode\\\")&&e?(c+=e.toUnicode(a._parts.hostname),a._parts.port&&(c+=\\\":\\\"+a._parts.port)):c+=a.host());a._parts.hostname&&a._parts.path&&\\\"/\\\"!==a._parts.path.charAt(0)&&(c+=\\\"/\\\");c+=a.path(!0);if(a._parts.query){for(var d=\\n\\\"\\\",f=0,k=a._parts.query.split(\\\"&\\\"),g=k.length;f<g;f++){var u=(k[f]||\\\"\\\").split(\\\"=\\\"),d=d+(\\\"&\\\"+b.decodeQuery(u[0],this._parts.escapeQuerySpace).replace(/&/g,\\\"%26\\\"));void 0!==u[1]&&(d+=\\\"=\\\"+b.decodeQuery(u[1],this._parts.escapeQuerySpace).replace(/&/g,\\\"%26\\\"))}c+=\\\"?\\\"+d.substring(1)}return c+=b.decodeQuery(a.hash(),!0)};f.absoluteTo=function(a){var c=this.clone(),d=[\\\"protocol\\\",\\\"username\\\",\\\"password\\\",\\\"hostname\\\",\\\"port\\\"],f,e;if(this._parts.urn)throw Error(\\\"URNs do not have any generally defined hierarchical components\\\");\\na instanceof b||(a=new b(a));c._parts.protocol||(c._parts.protocol=a._parts.protocol);if(this._parts.hostname)return c;for(f=0;e=d[f];f++)c._parts[e]=a._parts[e];c._parts.path?\\\"..\\\"===c._parts.path.substring(-2)&&(c._parts.path+=\\\"/\\\"):(c._parts.path=a._parts.path,c._parts.query||(c._parts.query=a._parts.query));\\\"/\\\"!==c.path().charAt(0)&&(d=(d=a.directory())?d:0===a.path().indexOf(\\\"/\\\")?\\\"/\\\":\\\"\\\",c._parts.path=(d?d+\\\"/\\\":\\\"\\\")+c._parts.path,c.normalizePath());c.build();return c};f.relativeTo=function(a){var c=\\nthis.clone().normalize(),d,f,e;if(c._parts.urn)throw Error(\\\"URNs do not have any generally defined hierarchical components\\\");a=(new b(a)).normalize();d=c._parts;f=a._parts;e=c.path();a=a.path();if(\\\"/\\\"!==e.charAt(0))throw Error(\\\"URI is already relative\\\");if(\\\"/\\\"!==a.charAt(0))throw Error(\\\"Cannot calculate a URI relative to another relative URI\\\");d.protocol===f.protocol&&(d.protocol=null);if(d.username===f.username&&d.password===f.password&&null===d.protocol&&null===d.username&&null===d.password&&d.hostname===\\nf.hostname&&d.port===f.port)d.hostname=null,d.port=null;else return c.build();if(e===a)return d.path=\\\"\\\",c.build();e=b.commonPath(e,a);if(!e)return c.build();f=f.path.substring(e.length).replace(/[^\\\\/]*$/,\\\"\\\").replace(/.*?\\\\//g,\\\"../\\\");d.path=f+d.path.substring(e.length)||\\\"./\\\";return c.build()};f.equals=function(a){var c=this.clone();a=new b(a);var d={},f={},e={},k;c.normalize();a.normalize();if(c.toString()===a.toString())return!0;d=c.query();f=a.query();c.query(\\\"\\\");a.query(\\\"\\\");if(c.toString()!==a.toString()||\\nd.length!==f.length)return!1;d=b.parseQuery(d,this._parts.escapeQuerySpace);f=b.parseQuery(f,this._parts.escapeQuerySpace);for(k in d)if(v.call(d,k)){if(!w(d[k])){if(d[k]!==f[k])return!1}else if(!D(d[k],f[k]))return!1;e[k]=!0}for(k in f)if(v.call(f,k)&&!e[k])return!1;return!0};f.duplicateQueryParameters=function(a){this._parts.duplicateQueryParameters=!!a;return this};f.escapeQuerySpace=function(a){this._parts.escapeQuerySpace=!!a;return this};return b});\\n(function(e,n){\\\"object\\\"===typeof exports?module.exports=n(require(\\\"./URI\\\")):\\\"function\\\"===typeof define&&define.amd?define([\\\"./URI\\\"],n):e.URITemplate=n(e.URI,e)})(this,function(e,n){function g(b){if(g._cache[b])return g._cache[b];if(!(this instanceof g))return new g(b);this.expression=b;g._cache[b]=this;return this}function l(b){this.data=b;this.cache={}}var b=n&&n.URITemplate,h=Object.prototype.hasOwnProperty,A=g.prototype,w={\\\"\\\":{prefix:\\\"\\\",separator:\\\",\\\",named:!1,empty_name_separator:!1,encode:\\\"encode\\\"},\\n\\\"+\\\":{prefix:\\\"\\\",separator:\\\",\\\",named:!1,empty_name_separator:!1,encode:\\\"encodeReserved\\\"},\\\"#\\\":{prefix:\\\"#\\\",separator:\\\",\\\",named:!1,empty_name_separator:!1,encode:\\\"encodeReserved\\\"},\\\".\\\":{prefix:\\\".\\\",separator:\\\".\\\",named:!1,empty_name_separator:!1,encode:\\\"encode\\\"},\\\"/\\\":{prefix:\\\"/\\\",separator:\\\"/\\\",named:!1,empty_name_separator:!1,encode:\\\"encode\\\"},\\\";\\\":{prefix:\\\";\\\",separator:\\\";\\\",named:!0,empty_name_separator:!1,encode:\\\"encode\\\"},\\\"?\\\":{prefix:\\\"?\\\",separator:\\\"&\\\",named:!0,empty_name_separator:!0,encode:\\\"encode\\\"},\\\"&\\\":{prefix:\\\"&\\\",\\nseparator:\\\"&\\\",named:!0,empty_name_separator:!0,encode:\\\"encode\\\"}};g._cache={};g.EXPRESSION_PATTERN=/\\\\{([^a-zA-Z0-9%_]?)([^\\\\}]+)(\\\\}|$)/g;g.VARIABLE_PATTERN=/^([^*:]+)((\\\\*)|:(\\\\d+))?$/;g.VARIABLE_NAME_PATTERN=/[^a-zA-Z0-9%_]/;g.expand=function(b,e){var h=w[b.operator],l=h.named?\\\"Named\\\":\\\"Unnamed\\\",n=b.variables,t=[],r,p,f;for(f=0;p=n[f];f++)r=e.get(p.name),r.val.length?t.push(g[\\\"expand\\\"+l](r,h,p.explode,p.explode&&h.separator||\\\",\\\",p.maxlength,p.name)):r.type&&t.push(\\\"\\\");return t.length?h.prefix+t.join(h.separator):\\n\\\"\\\"};g.expandNamed=function(b,g,h,l,n,t){var r=\\\"\\\",p=g.encode;g=g.empty_name_separator;var f=!b[p].length,v=2===b.type?\\\"\\\":e[p](t),q,x,w;x=0;for(w=b.val.length;x<w;x++)n?(q=e[p](b.val[x][1].substring(0,n)),2===b.type&&(v=e[p](b.val[x][0].substring(0,n)))):f?(q=e[p](b.val[x][1]),2===b.type?(v=e[p](b.val[x][0]),b[p].push([v,q])):b[p].push([void 0,q])):(q=b[p][x][1],2===b.type&&(v=b[p][x][0])),r&&(r+=l),h?r+=v+(g||q?\\\"=\\\":\\\"\\\")+q:(x||(r+=e[p](t)+(g||q?\\\"=\\\":\\\"\\\")),2===b.type&&(r+=v+\\\",\\\"),r+=q);return r};g.expandUnnamed=\\nfunction(b,g,h,l,n){var t=\\\"\\\",r=g.encode;g=g.empty_name_separator;var p=!b[r].length,f,v,q,w;q=0;for(w=b.val.length;q<w;q++)n?v=e[r](b.val[q][1].substring(0,n)):p?(v=e[r](b.val[q][1]),b[r].push([2===b.type?e[r](b.val[q][0]):void 0,v])):v=b[r][q][1],t&&(t+=l),2===b.type&&(f=n?e[r](b.val[q][0].substring(0,n)):b[r][q][0],t+=f,t=h?t+(g||v?\\\"=\\\":\\\"\\\"):t+\\\",\\\"),t+=v;return t};g.noConflict=function(){n.URITemplate===g&&(n.URITemplate=b);return g};A.expand=function(b){var e=\\\"\\\";this.parts&&this.parts.length||this.parse();\\nb instanceof l||(b=new l(b));for(var h=0,n=this.parts.length;h<n;h++)e+=\\\"string\\\"===typeof this.parts[h]?this.parts[h]:g.expand(this.parts[h],b);return e};A.parse=function(){var b=this.expression,e=g.EXPRESSION_PATTERN,h=g.VARIABLE_PATTERN,n=g.VARIABLE_NAME_PATTERN,l=[],t=0,r,p,f;for(e.lastIndex=0;;){p=e.exec(b);if(null===p){l.push(b.substring(t));break}else l.push(b.substring(t,p.index)),t=p.index+p[0].length;if(!w[p[1]])throw Error('Unknown Operator \\\"'+p[1]+'\\\" in \\\"'+p[0]+'\\\"');if(!p[3])throw Error('Unclosed Expression \\\"'+\\np[0]+'\\\"');r=p[2].split(\\\",\\\");for(var v=0,q=r.length;v<q;v++){f=r[v].match(h);if(null===f)throw Error('Invalid Variable \\\"'+r[v]+'\\\" in \\\"'+p[0]+'\\\"');if(f[1].match(n))throw Error('Invalid Variable Name \\\"'+f[1]+'\\\" in \\\"'+p[0]+'\\\"');r[v]={name:f[1],explode:!!f[3],maxlength:f[4]&&parseInt(f[4],10)}}if(!r.length)throw Error('Expression Missing Variable(s) \\\"'+p[0]+'\\\"');l.push({expression:p[0],operator:p[1],variables:r})}l.length||l.push(b);this.parts=l;return this};l.prototype.get=function(b){var e=this.data,\\ng={type:0,val:[],encode:[],encodeReserved:[]},l;if(void 0!==this.cache[b])return this.cache[b];this.cache[b]=g;e=\\\"[object Function]\\\"===String(Object.prototype.toString.call(e))?e(b):\\\"[object Function]\\\"===String(Object.prototype.toString.call(e[b]))?e[b](b):e[b];if(void 0!==e&&null!==e)if(\\\"[object Array]\\\"===String(Object.prototype.toString.call(e))){l=0;for(b=e.length;l<b;l++)void 0!==e[l]&&null!==e[l]&&g.val.push([void 0,String(e[l])]);g.val.length&&(g.type=3)}else if(\\\"[object Object]\\\"===String(Object.prototype.toString.call(e))){for(l in e)h.call(e,\\nl)&&void 0!==e[l]&&null!==e[l]&&g.val.push([l,String(e[l])]);g.val.length&&(g.type=2)}else g.type=1,g.val.push([void 0,String(e)]);return g};e.expand=function(b,h){var l=(new g(b)).expand(h);return new e(l)};return g});\\n\"\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ib3dlcl9jb21wb25lbnRzL3VyaS5qcy9zcmMvVVJJLm1pbi5qcz84NGNlIl0sInNvdXJjZXNDb250ZW50IjpbIm1vZHVsZS5leHBvcnRzID0gXCIvKiEgVVJJLmpzIHYxLjE1LjIgaHR0cDovL21lZGlhbGl6ZS5naXRodWIuaW8vVVJJLmpzLyAqL1xcbi8qIGJ1aWxkIGNvbnRhaW5zOiBJUHY2LmpzLCBwdW55Y29kZS5qcywgU2Vjb25kTGV2ZWxEb21haW5zLmpzLCBVUkkuanMsIFVSSVRlbXBsYXRlLmpzICovXFxuKGZ1bmN0aW9uKGUsbil7XFxcIm9iamVjdFxcXCI9PT10eXBlb2YgZXhwb3J0cz9tb2R1bGUuZXhwb3J0cz1uKCk6XFxcImZ1bmN0aW9uXFxcIj09PXR5cGVvZiBkZWZpbmUmJmRlZmluZS5hbWQ/ZGVmaW5lKG4pOmUuSVB2Nj1uKGUpfSkodGhpcyxmdW5jdGlvbihlKXt2YXIgbj1lJiZlLklQdjY7cmV0dXJue2Jlc3Q6ZnVuY3Rpb24oZyl7Zz1nLnRvTG93ZXJDYXNlKCkuc3BsaXQoXFxcIjpcXFwiKTt2YXIgbD1nLmxlbmd0aCxiPTg7XFxcIlxcXCI9PT1nWzBdJiZcXFwiXFxcIj09PWdbMV0mJlxcXCJcXFwiPT09Z1syXT8oZy5zaGlmdCgpLGcuc2hpZnQoKSk6XFxcIlxcXCI9PT1nWzBdJiZcXFwiXFxcIj09PWdbMV0/Zy5zaGlmdCgpOlxcXCJcXFwiPT09Z1tsLTFdJiZcXFwiXFxcIj09PWdbbC0yXSYmZy5wb3AoKTtsPWcubGVuZ3RoOy0xIT09Z1tsLTFdLmluZGV4T2YoXFxcIi5cXFwiKSYmKGI9Nyk7dmFyIGg7Zm9yKGg9MDtoPGwmJlxcXCJcXFwiIT09Z1toXTtoKyspO2lmKGg8Yilmb3IoZy5zcGxpY2UoaCwxLFxcXCIwMDAwXFxcIik7Zy5sZW5ndGg8YjspZy5zcGxpY2UoaCwwLFxcXCIwMDAwXFxcIik7Zm9yKGg9MDtoPGI7aCsrKXtmb3IodmFyIGw9XFxuZ1toXS5zcGxpdChcXFwiXFxcIiksZT0wOzM+ZTtlKyspaWYoXFxcIjBcXFwiPT09bFswXSYmMTxsLmxlbmd0aClsLnNwbGljZSgwLDEpO2Vsc2UgYnJlYWs7Z1toXT1sLmpvaW4oXFxcIlxcXCIpfXZhciBsPS0xLG49ZT0wLGs9LTEsdT0hMTtmb3IoaD0wO2g8YjtoKyspdT9cXFwiMFxcXCI9PT1nW2hdP24rPTE6KHU9ITEsbj5lJiYobD1rLGU9bikpOlxcXCIwXFxcIj09PWdbaF0mJih1PSEwLGs9aCxuPTEpO24+ZSYmKGw9ayxlPW4pOzE8ZSYmZy5zcGxpY2UobCxlLFxcXCJcXFwiKTtsPWcubGVuZ3RoO2I9XFxcIlxcXCI7XFxcIlxcXCI9PT1nWzBdJiYoYj1cXFwiOlxcXCIpO2ZvcihoPTA7aDxsO2grKyl7Yis9Z1toXTtpZihoPT09bC0xKWJyZWFrO2IrPVxcXCI6XFxcIn1cXFwiXFxcIj09PWdbbC0xXSYmKGIrPVxcXCI6XFxcIik7cmV0dXJuIGJ9LG5vQ29uZmxpY3Q6ZnVuY3Rpb24oKXtlLklQdjY9PT10aGlzJiYoZS5JUHY2PW4pO3JldHVybiB0aGlzfX19KTtcXG4oZnVuY3Rpb24oZSl7ZnVuY3Rpb24gbihiKXt0aHJvdyBSYW5nZUVycm9yKHZbYl0pO31mdW5jdGlvbiBnKGIsZil7Zm9yKHZhciBrPWIubGVuZ3RoO2stLTspYltrXT1mKGJba10pO3JldHVybiBifWZ1bmN0aW9uIGwoYixrKXtyZXR1cm4gZyhiLnNwbGl0KGYpLGspLmpvaW4oXFxcIi5cXFwiKX1mdW5jdGlvbiBiKGIpe2Zvcih2YXIgZj1bXSxrPTAsZz1iLmxlbmd0aCxhLGM7azxnOylhPWIuY2hhckNvZGVBdChrKyspLDU1Mjk2PD1hJiY1NjMxOT49YSYmazxnPyhjPWIuY2hhckNvZGVBdChrKyspLDU2MzIwPT0oYyY2NDUxMik/Zi5wdXNoKCgoYSYxMDIzKTw8MTApKyhjJjEwMjMpKzY1NTM2KTooZi5wdXNoKGEpLGstLSkpOmYucHVzaChhKTtyZXR1cm4gZn1mdW5jdGlvbiBoKGIpe3JldHVybiBnKGIsZnVuY3Rpb24oYil7dmFyIGY9XFxcIlxcXCI7NjU1MzU8YiYmKGItPTY1NTM2LGYrPXgoYj4+PjEwJjEwMjN8NTUyOTYpLGI9NTYzMjB8YiYxMDIzKTtyZXR1cm4gZis9eChiKX0pLmpvaW4oXFxcIlxcXCIpfWZ1bmN0aW9uIEEoYixcXG5mKXtyZXR1cm4gYisyMis3NSooMjY+YiktKCgwIT1mKTw8NSl9ZnVuY3Rpb24gdyhiLGYsayl7dmFyIGc9MDtiPWs/cShiLzcwMCk6Yj4+MTtmb3IoYis9cShiL2YpOzQ1NTxiO2crPTM2KWI9cShiLzM1KTtyZXR1cm4gcShnKzM2KmIvKGIrMzgpKX1mdW5jdGlvbiBrKGIpe3ZhciBmPVtdLGs9Yi5sZW5ndGgsZyxhPTAsYz0xMjgsZD03MixtLHoseSxlLGw7bT1iLmxhc3RJbmRleE9mKFxcXCItXFxcIik7MD5tJiYobT0wKTtmb3Ioej0wO3o8bTsrK3opMTI4PD1iLmNoYXJDb2RlQXQoeikmJm4oXFxcIm5vdC1iYXNpY1xcXCIpLGYucHVzaChiLmNoYXJDb2RlQXQoeikpO2ZvcihtPTA8bT9tKzE6MDttPGs7KXt6PWE7Zz0xO2Zvcih5PTM2Ozt5Kz0zNil7bT49ayYmbihcXFwiaW52YWxpZC1pbnB1dFxcXCIpO2U9Yi5jaGFyQ29kZUF0KG0rKyk7ZT0xMD5lLTQ4P2UtMjI6MjY+ZS02NT9lLTY1OjI2PmUtOTc/ZS05NzozNjsoMzY8PWV8fGU+cSgoMjE0NzQ4MzY0Ny1hKS9nKSkmJm4oXFxcIm92ZXJmbG93XFxcIik7YSs9ZSpnO2w9XFxueTw9ZD8xOnk+PWQrMjY/MjY6eS1kO2lmKGU8bClicmVhaztlPTM2LWw7Zz5xKDIxNDc0ODM2NDcvZSkmJm4oXFxcIm92ZXJmbG93XFxcIik7Zyo9ZX1nPWYubGVuZ3RoKzE7ZD13KGEteixnLDA9PXopO3EoYS9nKT4yMTQ3NDgzNjQ3LWMmJm4oXFxcIm92ZXJmbG93XFxcIik7Yys9cShhL2cpO2ElPWc7Zi5zcGxpY2UoYSsrLDAsYyl9cmV0dXJuIGgoZil9ZnVuY3Rpb24gdShmKXt2YXIgZyxrLGUsYSxjLGQsbSx6LHksbD1bXSx1LGgscDtmPWIoZik7dT1mLmxlbmd0aDtnPTEyODtrPTA7Yz03Mjtmb3IoZD0wO2Q8dTsrK2QpeT1mW2RdLDEyOD55JiZsLnB1c2goeCh5KSk7Zm9yKChlPWE9bC5sZW5ndGgpJiZsLnB1c2goXFxcIi1cXFwiKTtlPHU7KXttPTIxNDc0ODM2NDc7Zm9yKGQ9MDtkPHU7KytkKXk9ZltkXSx5Pj1nJiZ5PG0mJihtPXkpO2g9ZSsxO20tZz5xKCgyMTQ3NDgzNjQ3LWspL2gpJiZuKFxcXCJvdmVyZmxvd1xcXCIpO2srPShtLWcpKmg7Zz1tO2ZvcihkPTA7ZDx1OysrZClpZih5PWZbZF0seTxnJiYyMTQ3NDgzNjQ3PFxcbisrayYmbihcXFwib3ZlcmZsb3dcXFwiKSx5PT1nKXt6PWs7Zm9yKG09MzY7O20rPTM2KXt5PW08PWM/MTptPj1jKzI2PzI2Om0tYztpZih6PHkpYnJlYWs7cD16LXk7ej0zNi15O2wucHVzaCh4KEEoeStwJXosMCkpKTt6PXEocC96KX1sLnB1c2goeChBKHosMCkpKTtjPXcoayxoLGU9PWEpO2s9MDsrK2V9KytrOysrZ31yZXR1cm4gbC5qb2luKFxcXCJcXFwiKX12YXIgRD1cXFwib2JqZWN0XFxcIj09dHlwZW9mIGV4cG9ydHMmJmV4cG9ydHMsRT1cXFwib2JqZWN0XFxcIj09dHlwZW9mIG1vZHVsZSYmbW9kdWxlJiZtb2R1bGUuZXhwb3J0cz09RCYmbW9kdWxlLEI9XFxcIm9iamVjdFxcXCI9PXR5cGVvZiBnbG9iYWwmJmdsb2JhbDtpZihCLmdsb2JhbD09PUJ8fEIud2luZG93PT09QillPUI7dmFyIHQscj0vXnhuLS0vLHA9L1teIC1+XS8sZj0vXFxcXHgyRXxcXFxcdTMwMDJ8XFxcXHVGRjBFfFxcXFx1RkY2MS9nLHY9e292ZXJmbG93OlxcXCJPdmVyZmxvdzogaW5wdXQgbmVlZHMgd2lkZXIgaW50ZWdlcnMgdG8gcHJvY2Vzc1xcXCIsXFxcIm5vdC1iYXNpY1xcXCI6XFxcIklsbGVnYWwgaW5wdXQgPj0gMHg4MCAobm90IGEgYmFzaWMgY29kZSBwb2ludClcXFwiLFxcblxcXCJpbnZhbGlkLWlucHV0XFxcIjpcXFwiSW52YWxpZCBpbnB1dFxcXCJ9LHE9TWF0aC5mbG9vcix4PVN0cmluZy5mcm9tQ2hhckNvZGUsQzt0PXt2ZXJzaW9uOlxcXCIxLjIuM1xcXCIsdWNzMjp7ZGVjb2RlOmIsZW5jb2RlOmh9LGRlY29kZTprLGVuY29kZTp1LHRvQVNDSUk6ZnVuY3Rpb24oYil7cmV0dXJuIGwoYixmdW5jdGlvbihiKXtyZXR1cm4gcC50ZXN0KGIpP1xcXCJ4bi0tXFxcIit1KGIpOmJ9KX0sdG9Vbmljb2RlOmZ1bmN0aW9uKGIpe3JldHVybiBsKGIsZnVuY3Rpb24oYil7cmV0dXJuIHIudGVzdChiKT9rKGIuc2xpY2UoNCkudG9Mb3dlckNhc2UoKSk6Yn0pfX07aWYoXFxcImZ1bmN0aW9uXFxcIj09dHlwZW9mIGRlZmluZSYmXFxcIm9iamVjdFxcXCI9PXR5cGVvZiBkZWZpbmUuYW1kJiZkZWZpbmUuYW1kKWRlZmluZShmdW5jdGlvbigpe3JldHVybiB0fSk7ZWxzZSBpZihEJiYhRC5ub2RlVHlwZSlpZihFKUUuZXhwb3J0cz10O2Vsc2UgZm9yKEMgaW4gdCl0Lmhhc093blByb3BlcnR5KEMpJiYoRFtDXT10W0NdKTtlbHNlIGUucHVueWNvZGU9XFxudH0pKHRoaXMpO1xcbihmdW5jdGlvbihlLG4pe1xcXCJvYmplY3RcXFwiPT09dHlwZW9mIGV4cG9ydHM/bW9kdWxlLmV4cG9ydHM9bigpOlxcXCJmdW5jdGlvblxcXCI9PT10eXBlb2YgZGVmaW5lJiZkZWZpbmUuYW1kP2RlZmluZShuKTplLlNlY29uZExldmVsRG9tYWlucz1uKGUpfSkodGhpcyxmdW5jdGlvbihlKXt2YXIgbj1lJiZlLlNlY29uZExldmVsRG9tYWlucyxnPXtsaXN0OnthYzpcXFwiIGNvbSBnb3YgbWlsIG5ldCBvcmcgXFxcIixhZTpcXFwiIGFjIGNvIGdvdiBtaWwgbmFtZSBuZXQgb3JnIHBybyBzY2ggXFxcIixhZjpcXFwiIGNvbSBlZHUgZ292IG5ldCBvcmcgXFxcIixhbDpcXFwiIGNvbSBlZHUgZ292IG1pbCBuZXQgb3JnIFxcXCIsYW86XFxcIiBjbyBlZCBndiBpdCBvZyBwYiBcXFwiLGFyOlxcXCIgY29tIGVkdSBnb2IgZ292IGludCBtaWwgbmV0IG9yZyB0dXIgXFxcIixhdDpcXFwiIGFjIGNvIGd2IG9yIFxcXCIsYXU6XFxcIiBhc24gY29tIGNzaXJvIGVkdSBnb3YgaWQgbmV0IG9yZyBcXFwiLGJhOlxcXCIgY28gY29tIGVkdSBnb3YgbWlsIG5ldCBvcmcgcnMgdW5iaSB1bm1vIHVuc2EgdW50eiB1bnplIFxcXCIsYmI6XFxcIiBiaXogY28gY29tIGVkdSBnb3YgaW5mbyBuZXQgb3JnIHN0b3JlIHR2IFxcXCIsXFxuYmg6XFxcIiBiaXogY2MgY29tIGVkdSBnb3YgaW5mbyBuZXQgb3JnIFxcXCIsYm46XFxcIiBjb20gZWR1IGdvdiBuZXQgb3JnIFxcXCIsYm86XFxcIiBjb20gZWR1IGdvYiBnb3YgaW50IG1pbCBuZXQgb3JnIHR2IFxcXCIsYnI6XFxcIiBhZG0gYWR2IGFnciBhbSBhcnEgYXJ0IGF0byBiIGJpbyBibG9nIGJtZCBjaW0gY25nIGNudCBjb20gY29vcCBlY24gZWR1IGVuZyBlc3AgZXRjIGV0aSBmYXIgZmxvZyBmbSBmbmQgZm90IGZzdCBnMTIgZ2dmIGdvdiBpbWIgaW5kIGluZiBqb3IganVzIGxlbCBtYXQgbWVkIG1pbCBtdXMgbmV0IG5vbSBub3QgbnRyIG9kbyBvcmcgcHBnIHBybyBwc2MgcHNpIHFzbCByZWMgc2xnIHNydiB0bXAgdHJkIHR1ciB0diB2ZXQgdmxvZyB3aWtpIHpsZyBcXFwiLGJzOlxcXCIgY29tIGVkdSBnb3YgbmV0IG9yZyBcXFwiLGJ6OlxcXCIgZHUgZXQgb20gb3YgcmcgXFxcIixjYTpcXFwiIGFiIGJjIG1iIG5iIG5mIG5sIG5zIG50IG51IG9uIHBlIHFjIHNrIHlrIFxcXCIsY2s6XFxcIiBiaXogY28gZWR1IGdlbiBnb3YgaW5mbyBuZXQgb3JnIFxcXCIsXFxuY246XFxcIiBhYyBhaCBiaiBjb20gY3EgZWR1IGZqIGdkIGdvdiBncyBneCBneiBoYSBoYiBoZSBoaSBobCBobiBqbCBqcyBqeCBsbiBtaWwgbmV0IG5tIG54IG9yZyBxaCBzYyBzZCBzaCBzbiBzeCB0aiB0dyB4aiB4eiB5biB6aiBcXFwiLGNvOlxcXCIgY29tIGVkdSBnb3YgbWlsIG5ldCBub20gb3JnIFxcXCIsY3I6XFxcIiBhYyBjIGNvIGVkIGZpIGdvIG9yIHNhIFxcXCIsY3k6XFxcIiBhYyBiaXogY29tIGVrbG9nZXMgZ292IGx0ZCBuYW1lIG5ldCBvcmcgcGFybGlhbWVudCBwcmVzcyBwcm8gdG0gXFxcIixcXFwiZG9cXFwiOlxcXCIgYXJ0IGNvbSBlZHUgZ29iIGdvdiBtaWwgbmV0IG9yZyBzbGQgd2ViIFxcXCIsZHo6XFxcIiBhcnQgYXNzbyBjb20gZWR1IGdvdiBuZXQgb3JnIHBvbCBcXFwiLGVjOlxcXCIgY29tIGVkdSBmaW4gZ292IGluZm8gbWVkIG1pbCBuZXQgb3JnIHBybyBcXFwiLGVnOlxcXCIgY29tIGVkdSBldW4gZ292IG1pbCBuYW1lIG5ldCBvcmcgc2NpIFxcXCIsZXI6XFxcIiBjb20gZWR1IGdvdiBpbmQgbWlsIG5ldCBvcmcgcm9jaGVzdCB3IFxcXCIsZXM6XFxcIiBjb20gZWR1IGdvYiBub20gb3JnIFxcXCIsXFxuZXQ6XFxcIiBiaXogY29tIGVkdSBnb3YgaW5mbyBuYW1lIG5ldCBvcmcgXFxcIixmajpcXFwiIGFjIGJpeiBjb20gaW5mbyBtaWwgbmFtZSBuZXQgb3JnIHBybyBcXFwiLGZrOlxcXCIgYWMgY28gZ292IG5ldCBub20gb3JnIFxcXCIsZnI6XFxcIiBhc3NvIGNvbSBmIGdvdXYgbm9tIHByZCBwcmVzc2UgdG0gXFxcIixnZzpcXFwiIGNvIG5ldCBvcmcgXFxcIixnaDpcXFwiIGNvbSBlZHUgZ292IG1pbCBvcmcgXFxcIixnbjpcXFwiIGFjIGNvbSBnb3YgbmV0IG9yZyBcXFwiLGdyOlxcXCIgY29tIGVkdSBnb3YgbWlsIG5ldCBvcmcgXFxcIixndDpcXFwiIGNvbSBlZHUgZ29iIGluZCBtaWwgbmV0IG9yZyBcXFwiLGd1OlxcXCIgY29tIGVkdSBnb3YgbmV0IG9yZyBcXFwiLGhrOlxcXCIgY29tIGVkdSBnb3YgaWR2IG5ldCBvcmcgXFxcIixodTpcXFwiIDIwMDAgYWdyYXIgYm9sdCBjYXNpbm8gY2l0eSBjbyBlcm90aWNhIGVyb3Rpa2EgZmlsbSBmb3J1bSBnYW1lcyBob3RlbCBpbmZvIGluZ2F0bGFuIGpvZ2FzeiBrb255dmVsbyBsYWthcyBtZWRpYSBuZXdzIG9yZyBwcml2IHJla2xhbSBzZXggc2hvcCBzcG9ydCBzdWxpIHN6ZXggdG0gdG96c2RlIHV0YXphcyB2aWRlbyBcXFwiLFxcbmlkOlxcXCIgYWMgY28gZ28gbWlsIG5ldCBvciBzY2ggd2ViIFxcXCIsaWw6XFxcIiBhYyBjbyBnb3YgaWRmIGsxMiBtdW5pIG5ldCBvcmcgXFxcIixcXFwiaW5cXFwiOlxcXCIgYWMgY28gZWR1IGVybmV0IGZpcm0gZ2VuIGdvdiBpIGluZCBtaWwgbmV0IG5pYyBvcmcgcmVzIFxcXCIsaXE6XFxcIiBjb20gZWR1IGdvdiBpIG1pbCBuZXQgb3JnIFxcXCIsaXI6XFxcIiBhYyBjbyBkbnNzZWMgZ292IGkgaWQgbmV0IG9yZyBzY2ggXFxcIixpdDpcXFwiIGVkdSBnb3YgXFxcIixqZTpcXFwiIGNvIG5ldCBvcmcgXFxcIixqbzpcXFwiIGNvbSBlZHUgZ292IG1pbCBuYW1lIG5ldCBvcmcgc2NoIFxcXCIsanA6XFxcIiBhYyBhZCBjbyBlZCBnbyBnciBsZyBuZSBvciBcXFwiLGtlOlxcXCIgYWMgY28gZ28gaW5mbyBtZSBtb2JpIG5lIG9yIHNjIFxcXCIsa2g6XFxcIiBjb20gZWR1IGdvdiBtaWwgbmV0IG9yZyBwZXIgXFxcIixraTpcXFwiIGJpeiBjb20gZGUgZWR1IGdvdiBpbmZvIG1vYiBuZXQgb3JnIHRlbCBcXFwiLGttOlxcXCIgYXNzbyBjb20gY29vcCBlZHUgZ291diBrIG1lZGVjaW4gbWlsIG5vbSBub3RhaXJlcyBwaGFybWFjaWVucyBwcmVzc2UgdG0gdmV0ZXJpbmFpcmUgXFxcIixcXG5rbjpcXFwiIGVkdSBnb3YgbmV0IG9yZyBcXFwiLGtyOlxcXCIgYWMgYnVzYW4gY2h1bmdidWsgY2h1bmduYW0gY28gZGFlZ3UgZGFlamVvbiBlcyBnYW5nd29uIGdvIGd3YW5nanUgZ3llb25nYnVrIGd5ZW9uZ2dpIGd5ZW9uZ25hbSBocyBpbmNoZW9uIGplanUgamVvbmJ1ayBqZW9ubmFtIGsga2cgbWlsIG1zIG5lIG9yIHBlIHJlIHNjIHNlb3VsIHVsc2FuIFxcXCIsa3c6XFxcIiBjb20gZWR1IGdvdiBuZXQgb3JnIFxcXCIsa3k6XFxcIiBjb20gZWR1IGdvdiBuZXQgb3JnIFxcXCIsa3o6XFxcIiBjb20gZWR1IGdvdiBtaWwgbmV0IG9yZyBcXFwiLGxiOlxcXCIgY29tIGVkdSBnb3YgbmV0IG9yZyBcXFwiLGxrOlxcXCIgYXNzbiBjb20gZWR1IGdvdiBncnAgaG90ZWwgaW50IGx0ZCBuZXQgbmdvIG9yZyBzY2ggc29jIHdlYiBcXFwiLGxyOlxcXCIgY29tIGVkdSBnb3YgbmV0IG9yZyBcXFwiLGx2OlxcXCIgYXNuIGNvbSBjb25mIGVkdSBnb3YgaWQgbWlsIG5ldCBvcmcgXFxcIixseTpcXFwiIGNvbSBlZHUgZ292IGlkIG1lZCBuZXQgb3JnIHBsYyBzY2ggXFxcIixtYTpcXFwiIGFjIGNvIGdvdiBtIG5ldCBvcmcgcHJlc3MgXFxcIixcXG5tYzpcXFwiIGFzc28gdG0gXFxcIixtZTpcXFwiIGFjIGNvIGVkdSBnb3YgaXRzIG5ldCBvcmcgcHJpdiBcXFwiLG1nOlxcXCIgY29tIGVkdSBnb3YgbWlsIG5vbSBvcmcgcHJkIHRtIFxcXCIsbWs6XFxcIiBjb20gZWR1IGdvdiBpbmYgbmFtZSBuZXQgb3JnIHBybyBcXFwiLG1sOlxcXCIgY29tIGVkdSBnb3YgbmV0IG9yZyBwcmVzc2UgXFxcIixtbjpcXFwiIGVkdSBnb3Ygb3JnIFxcXCIsbW86XFxcIiBjb20gZWR1IGdvdiBuZXQgb3JnIFxcXCIsbXQ6XFxcIiBjb20gZWR1IGdvdiBuZXQgb3JnIFxcXCIsbXY6XFxcIiBhZXJvIGJpeiBjb20gY29vcCBlZHUgZ292IGluZm8gaW50IG1pbCBtdXNldW0gbmFtZSBuZXQgb3JnIHBybyBcXFwiLG13OlxcXCIgYWMgY28gY29tIGNvb3AgZWR1IGdvdiBpbnQgbXVzZXVtIG5ldCBvcmcgXFxcIixteDpcXFwiIGNvbSBlZHUgZ29iIG5ldCBvcmcgXFxcIixteTpcXFwiIGNvbSBlZHUgZ292IG1pbCBuYW1lIG5ldCBvcmcgc2NoIFxcXCIsbmY6XFxcIiBhcnRzIGNvbSBmaXJtIGluZm8gbmV0IG90aGVyIHBlciByZWMgc3RvcmUgd2ViIFxcXCIsbmc6XFxcIiBiaXogY29tIGVkdSBnb3YgbWlsIG1vYmkgbmFtZSBuZXQgb3JnIHNjaCBcXFwiLFxcbm5pOlxcXCIgYWMgY28gY29tIGVkdSBnb2IgbWlsIG5ldCBub20gb3JnIFxcXCIsbnA6XFxcIiBjb20gZWR1IGdvdiBtaWwgbmV0IG9yZyBcXFwiLG5yOlxcXCIgYml6IGNvbSBlZHUgZ292IGluZm8gbmV0IG9yZyBcXFwiLG9tOlxcXCIgYWMgYml6IGNvIGNvbSBlZHUgZ292IG1lZCBtaWwgbXVzZXVtIG5ldCBvcmcgcHJvIHNjaCBcXFwiLHBlOlxcXCIgY29tIGVkdSBnb2IgbWlsIG5ldCBub20gb3JnIHNsZCBcXFwiLHBoOlxcXCIgY29tIGVkdSBnb3YgaSBtaWwgbmV0IG5nbyBvcmcgXFxcIixwazpcXFwiIGJpeiBjb20gZWR1IGZhbSBnb2IgZ29rIGdvbiBnb3AgZ29zIGdvdiBuZXQgb3JnIHdlYiBcXFwiLHBsOlxcXCIgYXJ0IGJpYWx5c3RvayBiaXogY29tIGVkdSBnZGEgZ2RhbnNrIGdvcnpvdyBnb3YgaW5mbyBrYXRvd2ljZSBrcmFrb3cgbG9keiBsdWJsaW4gbWlsIG5ldCBuZ28gb2xzenR5biBvcmcgcG96bmFuIHB3ciByYWRvbSBzbHVwc2sgc3pjemVjaW4gdG9ydW4gd2Fyc3phd2Egd2F3IHdyb2Mgd3JvY2xhdyB6Z29yYSBcXFwiLHByOlxcXCIgYWMgYml6IGNvbSBlZHUgZXN0IGdvdiBpbmZvIGlzbGEgbmFtZSBuZXQgb3JnIHBybyBwcm9mIFxcXCIsXFxucHM6XFxcIiBjb20gZWR1IGdvdiBuZXQgb3JnIHBsbyBzZWMgXFxcIixwdzpcXFwiIGJlbGF1IGNvIGVkIGdvIG5lIG9yIFxcXCIscm86XFxcIiBhcnRzIGNvbSBmaXJtIGluZm8gbm9tIG50IG9yZyByZWMgc3RvcmUgdG0gd3d3IFxcXCIscnM6XFxcIiBhYyBjbyBlZHUgZ292IGluIG9yZyBcXFwiLHNiOlxcXCIgY29tIGVkdSBnb3YgbmV0IG9yZyBcXFwiLHNjOlxcXCIgY29tIGVkdSBnb3YgbmV0IG9yZyBcXFwiLHNoOlxcXCIgY28gY29tIGVkdSBnb3YgbmV0IG5vbSBvcmcgXFxcIixzbDpcXFwiIGNvbSBlZHUgZ292IG5ldCBvcmcgXFxcIixzdDpcXFwiIGNvIGNvbSBjb25zdWxhZG8gZWR1IGVtYmFpeGFkYSBnb3YgbWlsIG5ldCBvcmcgcHJpbmNpcGUgc2FvdG9tZSBzdG9yZSBcXFwiLHN2OlxcXCIgY29tIGVkdSBnb2Igb3JnIHJlZCBcXFwiLHN6OlxcXCIgYWMgY28gb3JnIFxcXCIsdHI6XFxcIiBhdiBiYnMgYmVsIGJpeiBjb20gZHIgZWR1IGdlbiBnb3YgaW5mbyBrMTIgbmFtZSBuZXQgb3JnIHBvbCB0ZWwgdHNrIHR2IHdlYiBcXFwiLHR0OlxcXCIgYWVybyBiaXogY2F0IGNvIGNvbSBjb29wIGVkdSBnb3YgaW5mbyBpbnQgam9icyBtaWwgbW9iaSBtdXNldW0gbmFtZSBuZXQgb3JnIHBybyB0ZWwgdHJhdmVsIFxcXCIsXFxudHc6XFxcIiBjbHViIGNvbSBlYml6IGVkdSBnYW1lIGdvdiBpZHYgbWlsIG5ldCBvcmcgXFxcIixtdTpcXFwiIGFjIGNvIGNvbSBnb3YgbmV0IG9yIG9yZyBcXFwiLG16OlxcXCIgYWMgY28gZWR1IGdvdiBvcmcgXFxcIixuYTpcXFwiIGNvIGNvbSBcXFwiLG56OlxcXCIgYWMgY28gY3JpIGdlZWsgZ2VuIGdvdnQgaGVhbHRoIGl3aSBtYW9yaSBtaWwgbmV0IG9yZyBwYXJsaWFtZW50IHNjaG9vbCBcXFwiLHBhOlxcXCIgYWJvIGFjIGNvbSBlZHUgZ29iIGluZyBtZWQgbmV0IG5vbSBvcmcgc2xkIFxcXCIscHQ6XFxcIiBjb20gZWR1IGdvdiBpbnQgbmV0IG5vbWUgb3JnIHB1YmwgXFxcIixweTpcXFwiIGNvbSBlZHUgZ292IG1pbCBuZXQgb3JnIFxcXCIscWE6XFxcIiBjb20gZWR1IGdvdiBtaWwgbmV0IG9yZyBcXFwiLHJlOlxcXCIgYXNzbyBjb20gbm9tIFxcXCIscnU6XFxcIiBhYyBhZHlnZXlhIGFsdGFpIGFtdXIgYXJraGFuZ2Vsc2sgYXN0cmFraGFuIGJhc2hraXJpYSBiZWxnb3JvZCBiaXIgYnJ5YW5zayBidXJ5YXRpYSBjYmcgY2hlbCBjaGVseWFiaW5zayBjaGl0YSBjaHVrb3RrYSBjaHV2YXNoaWEgY29tIGRhZ2VzdGFuIGUtYnVyZyBlZHUgZ292IGdyb3pueSBpbnQgaXJrdXRzayBpdmFub3ZvIGl6aGV2c2sgamFyIGpvc2hrYXItb2xhIGthbG15a2lhIGthbHVnYSBrYW1jaGF0a2Ega2FyZWxpYSBrYXphbiBrY2hyIGtlbWVyb3ZvIGtoYWJhcm92c2sga2hha2Fzc2lhIGtodiBraXJvdiBrb2VuaWcga29taSBrb3N0cm9tYSBrcmFub3lhcnNrIGt1YmFuIGt1cmdhbiBrdXJzayBsaXBldHNrIG1hZ2FkYW4gbWFyaSBtYXJpLWVsIG1hcmluZSBtaWwgbW9yZG92aWEgbW9zcmVnIG1zayBtdXJtYW5zayBuYWxjaGlrIG5ldCBubm92IG5vdiBub3Zvc2liaXJzayBuc2sgb21zayBvcmVuYnVyZyBvcmcgb3J5b2wgcGVuemEgcGVybSBwcCBwc2tvdiBwdHogcm5kIHJ5YXphbiBzYWtoYWxpbiBzYW1hcmEgc2FyYXRvdiBzaW1iaXJzayBzbW9sZW5zayBzcGIgc3RhdnJvcG9sIHN0diBzdXJndXQgdGFtYm92IHRhdGFyc3RhbiB0b20gdG9tc2sgdHNhcml0c3luIHRzayB0dWxhIHR1dmEgdHZlciB0eXVtZW4gdWRtIHVkbXVydGlhIHVsYW4tdWRlIHZsYWRpa2F2a2F6IHZsYWRpbWlyIHZsYWRpdm9zdG9rIHZvbGdvZ3JhZCB2b2xvZ2RhIHZvcm9uZXpoIHZybiB2eWF0a2EgeWFrdXRpYSB5YW1hbCB5ZWthdGVyaW5idXJnIHl1emhuby1zYWtoYWxpbnNrIFxcXCIsXFxucnc6XFxcIiBhYyBjbyBjb20gZWR1IGdvdXYgZ292IGludCBtaWwgbmV0IFxcXCIsc2E6XFxcIiBjb20gZWR1IGdvdiBtZWQgbmV0IG9yZyBwdWIgc2NoIFxcXCIsc2Q6XFxcIiBjb20gZWR1IGdvdiBpbmZvIG1lZCBuZXQgb3JnIHR2IFxcXCIsc2U6XFxcIiBhIGFjIGIgYmQgYyBkIGUgZiBnIGggaSBrIGwgbSBuIG8gb3JnIHAgcGFydGkgcHAgcHJlc3MgciBzIHQgdG0gdSB3IHggeSB6IFxcXCIsc2c6XFxcIiBjb20gZWR1IGdvdiBpZG4gbmV0IG9yZyBwZXIgXFxcIixzbjpcXFwiIGFydCBjb20gZWR1IGdvdXYgb3JnIHBlcnNvIHVuaXYgXFxcIixzeTpcXFwiIGNvbSBlZHUgZ292IG1pbCBuZXQgbmV3cyBvcmcgXFxcIix0aDpcXFwiIGFjIGNvIGdvIGluIG1pIG5ldCBvciBcXFwiLHRqOlxcXCIgYWMgYml6IGNvIGNvbSBlZHUgZ28gZ292IGluZm8gaW50IG1pbCBuYW1lIG5ldCBuaWMgb3JnIHRlc3Qgd2ViIFxcXCIsdG46XFxcIiBhZ3JpbmV0IGNvbSBkZWZlbnNlIGVkdW5ldCBlbnMgZmluIGdvdiBpbmQgaW5mbyBpbnRsIG1pbmNvbSBuYXQgbmV0IG9yZyBwZXJzbyBybnJ0IHJucyBybnUgdG91cmlzbSBcXFwiLFxcbnR6OlxcXCIgYWMgY28gZ28gbmUgb3IgXFxcIix1YTpcXFwiIGJpeiBjaGVya2Fzc3kgY2hlcm5pZ292IGNoZXJub3Z0c3kgY2sgY24gY28gY29tIGNyaW1lYSBjdiBkbiBkbmVwcm9wZXRyb3ZzayBkb25ldHNrIGRwIGVkdSBnb3YgaWYgaW4gaXZhbm8tZnJhbmtpdnNrIGtoIGtoYXJrb3Yga2hlcnNvbiBraG1lbG5pdHNraXkga2lldiBraXJvdm9ncmFkIGttIGtyIGtzIGt2IGxnIGx1Z2Fuc2sgbHV0c2sgbHZpdiBtZSBtayBuZXQgbmlrb2xhZXYgb2Qgb2Rlc3NhIG9yZyBwbCBwb2x0YXZhIHBwIHJvdm5vIHJ2IHNlYmFzdG9wb2wgc3VteSB0ZSB0ZXJub3BpbCB1emhnb3JvZCB2aW5uaWNhIHZuIHphcG9yaXpoemhlIHpoaXRvbWlyIHpwIHp0IFxcXCIsdWc6XFxcIiBhYyBjbyBnbyBuZSBvciBvcmcgc2MgXFxcIix1azpcXFwiIGFjIGJsIGJyaXRpc2gtbGlicmFyeSBjbyBjeW0gZ292IGdvdnQgaWNuZXQgamV0IGxlYSBsdGQgbWUgbWlsIG1vZCBuYXRpb25hbC1saWJyYXJ5LXNjb3RsYW5kIG5lbCBuZXQgbmhzIG5pYyBubHMgb3JnIG9yZ24gcGFybGlhbWVudCBwbGMgcG9saWNlIHNjaCBzY290IHNvYyBcXFwiLFxcbnVzOlxcXCIgZG5pIGZlZCBpc2Ega2lkcyBuc24gXFxcIix1eTpcXFwiIGNvbSBlZHUgZ3ViIG1pbCBuZXQgb3JnIFxcXCIsdmU6XFxcIiBjbyBjb20gZWR1IGdvYiBpbmZvIG1pbCBuZXQgb3JnIHdlYiBcXFwiLHZpOlxcXCIgY28gY29tIGsxMiBuZXQgb3JnIFxcXCIsdm46XFxcIiBhYyBiaXogY29tIGVkdSBnb3YgaGVhbHRoIGluZm8gaW50IG5hbWUgbmV0IG9yZyBwcm8gXFxcIix5ZTpcXFwiIGNvIGNvbSBnb3YgbHRkIG1lIG5ldCBvcmcgcGxjIFxcXCIseXU6XFxcIiBhYyBjbyBlZHUgZ292IG9yZyBcXFwiLHphOlxcXCIgYWMgYWdyaWMgYWx0IGJvdXJzZSBjaXR5IGNvIGN5YmVybmV0IGRiIGVkdSBnb3YgZ3JvbmRhciBpYWNjZXNzIGltdCBpbmNhIGxhbmRlc2lnbiBsYXcgbWlsIG5ldCBuZ28gbmlzIG5vbSBvbGl2ZXR0aSBvcmcgcGl4IHNjaG9vbCB0bSB3ZWIgXFxcIix6bTpcXFwiIGFjIGNvIGNvbSBlZHUgZ292IG5ldCBvcmcgc2NoIFxcXCJ9LGhhczpmdW5jdGlvbihlKXt2YXIgYj1lLmxhc3RJbmRleE9mKFxcXCIuXFxcIik7aWYoMD49Ynx8Yj49ZS5sZW5ndGgtMSlyZXR1cm4hMTtcXG52YXIgaD1lLmxhc3RJbmRleE9mKFxcXCIuXFxcIixiLTEpO2lmKDA+PWh8fGg+PWItMSlyZXR1cm4hMTt2YXIgbj1nLmxpc3RbZS5zbGljZShiKzEpXTtyZXR1cm4gbj8wPD1uLmluZGV4T2YoXFxcIiBcXFwiK2Uuc2xpY2UoaCsxLGIpK1xcXCIgXFxcIik6ITF9LGlzOmZ1bmN0aW9uKGUpe3ZhciBiPWUubGFzdEluZGV4T2YoXFxcIi5cXFwiKTtpZigwPj1ifHxiPj1lLmxlbmd0aC0xfHwwPD1lLmxhc3RJbmRleE9mKFxcXCIuXFxcIixiLTEpKXJldHVybiExO3ZhciBoPWcubGlzdFtlLnNsaWNlKGIrMSldO3JldHVybiBoPzA8PWguaW5kZXhPZihcXFwiIFxcXCIrZS5zbGljZSgwLGIpK1xcXCIgXFxcIik6ITF9LGdldDpmdW5jdGlvbihlKXt2YXIgYj1lLmxhc3RJbmRleE9mKFxcXCIuXFxcIik7aWYoMD49Ynx8Yj49ZS5sZW5ndGgtMSlyZXR1cm4gbnVsbDt2YXIgaD1lLmxhc3RJbmRleE9mKFxcXCIuXFxcIixiLTEpO2lmKDA+PWh8fGg+PWItMSlyZXR1cm4gbnVsbDt2YXIgbj1nLmxpc3RbZS5zbGljZShiKzEpXTtyZXR1cm4hbnx8MD5uLmluZGV4T2YoXFxcIiBcXFwiK2Uuc2xpY2UoaCtcXG4xLGIpK1xcXCIgXFxcIik/bnVsbDplLnNsaWNlKGgrMSl9LG5vQ29uZmxpY3Q6ZnVuY3Rpb24oKXtlLlNlY29uZExldmVsRG9tYWlucz09PXRoaXMmJihlLlNlY29uZExldmVsRG9tYWlucz1uKTtyZXR1cm4gdGhpc319O3JldHVybiBnfSk7XFxuKGZ1bmN0aW9uKGUsbil7XFxcIm9iamVjdFxcXCI9PT10eXBlb2YgZXhwb3J0cz9tb2R1bGUuZXhwb3J0cz1uKHJlcXVpcmUoXFxcIi4vcHVueWNvZGVcXFwiKSxyZXF1aXJlKFxcXCIuL0lQdjZcXFwiKSxyZXF1aXJlKFxcXCIuL1NlY29uZExldmVsRG9tYWluc1xcXCIpKTpcXFwiZnVuY3Rpb25cXFwiPT09dHlwZW9mIGRlZmluZSYmZGVmaW5lLmFtZD9kZWZpbmUoW1xcXCIuL3B1bnljb2RlXFxcIixcXFwiLi9JUHY2XFxcIixcXFwiLi9TZWNvbmRMZXZlbERvbWFpbnNcXFwiXSxuKTplLlVSST1uKGUucHVueWNvZGUsZS5JUHY2LGUuU2Vjb25kTGV2ZWxEb21haW5zLGUpfSkodGhpcyxmdW5jdGlvbihlLG4sZyxsKXtmdW5jdGlvbiBiKGEsYyl7dmFyIGQ9MTw9YXJndW1lbnRzLmxlbmd0aCxtPTI8PWFyZ3VtZW50cy5sZW5ndGg7aWYoISh0aGlzIGluc3RhbmNlb2YgYikpcmV0dXJuIGQ/bT9uZXcgYihhLGMpOm5ldyBiKGEpOm5ldyBiO2lmKHZvaWQgMD09PWEpe2lmKGQpdGhyb3cgbmV3IFR5cGVFcnJvcihcXFwidW5kZWZpbmVkIGlzIG5vdCBhIHZhbGlkIGFyZ3VtZW50IGZvciBVUklcXFwiKTtcXG5hPVxcXCJ1bmRlZmluZWRcXFwiIT09dHlwZW9mIGxvY2F0aW9uP2xvY2F0aW9uLmhyZWYrXFxcIlxcXCI6XFxcIlxcXCJ9dGhpcy5ocmVmKGEpO3JldHVybiB2b2lkIDAhPT1jP3RoaXMuYWJzb2x1dGVUbyhjKTp0aGlzfWZ1bmN0aW9uIGgoYSl7cmV0dXJuIGEucmVwbGFjZSgvKFsuKis/Xj0hOiR7fSgpfFtcXFxcXVxcXFwvXFxcXFxcXFxdKS9nLFxcXCJcXFxcXFxcXCQxXFxcIil9ZnVuY3Rpb24gQShhKXtyZXR1cm4gdm9pZCAwPT09YT9cXFwiVW5kZWZpbmVkXFxcIjpTdHJpbmcoT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGEpKS5zbGljZSg4LC0xKX1mdW5jdGlvbiB3KGEpe3JldHVyblxcXCJBcnJheVxcXCI9PT1BKGEpfWZ1bmN0aW9uIGsoYSxjKXt2YXIgZD17fSxiLGY7aWYoXFxcIlJlZ0V4cFxcXCI9PT1BKGMpKWQ9bnVsbDtlbHNlIGlmKHcoYykpZm9yKGI9MCxmPWMubGVuZ3RoO2I8ZjtiKyspZFtjW2JdXT0hMDtlbHNlIGRbY109ITA7Yj0wO2ZvcihmPWEubGVuZ3RoO2I8ZjtiKyspaWYoZCYmdm9pZCAwIT09ZFthW2JdXXx8IWQmJmMudGVzdChhW2JdKSlhLnNwbGljZShiLFxcbjEpLGYtLSxiLS07cmV0dXJuIGF9ZnVuY3Rpb24gdShhLGMpe3ZhciBkLGI7aWYodyhjKSl7ZD0wO2ZvcihiPWMubGVuZ3RoO2Q8YjtkKyspaWYoIXUoYSxjW2RdKSlyZXR1cm4hMTtyZXR1cm4hMH12YXIgZj1BKGMpO2Q9MDtmb3IoYj1hLmxlbmd0aDtkPGI7ZCsrKWlmKFxcXCJSZWdFeHBcXFwiPT09Zil7aWYoXFxcInN0cmluZ1xcXCI9PT10eXBlb2YgYVtkXSYmYVtkXS5tYXRjaChjKSlyZXR1cm4hMH1lbHNlIGlmKGFbZF09PT1jKXJldHVybiEwO3JldHVybiExfWZ1bmN0aW9uIEQoYSxjKXtpZighdyhhKXx8IXcoYyl8fGEubGVuZ3RoIT09Yy5sZW5ndGgpcmV0dXJuITE7YS5zb3J0KCk7Yy5zb3J0KCk7Zm9yKHZhciBkPTAsYj1hLmxlbmd0aDtkPGI7ZCsrKWlmKGFbZF0hPT1jW2RdKXJldHVybiExO3JldHVybiEwfWZ1bmN0aW9uIEUoYSl7cmV0dXJuIGVzY2FwZShhKX1mdW5jdGlvbiBCKGEpe3JldHVybiBlbmNvZGVVUklDb21wb25lbnQoYSkucmVwbGFjZSgvWyEnKCkqXS9nLEUpLnJlcGxhY2UoL1xcXFwqL2csXFxuXFxcIiUyQVxcXCIpfWZ1bmN0aW9uIHQoYSl7cmV0dXJuIGZ1bmN0aW9uKGMsZCl7aWYodm9pZCAwPT09YylyZXR1cm4gdGhpcy5fcGFydHNbYV18fFxcXCJcXFwiO3RoaXMuX3BhcnRzW2FdPWN8fG51bGw7dGhpcy5idWlsZCghZCk7cmV0dXJuIHRoaXN9fWZ1bmN0aW9uIHIoYSxjKXtyZXR1cm4gZnVuY3Rpb24oZCxiKXtpZih2b2lkIDA9PT1kKXJldHVybiB0aGlzLl9wYXJ0c1thXXx8XFxcIlxcXCI7bnVsbCE9PWQmJihkKz1cXFwiXFxcIixkLmNoYXJBdCgwKT09PWMmJihkPWQuc3Vic3RyaW5nKDEpKSk7dGhpcy5fcGFydHNbYV09ZDt0aGlzLmJ1aWxkKCFiKTtyZXR1cm4gdGhpc319dmFyIHA9bCYmbC5VUkk7Yi52ZXJzaW9uPVxcXCIxLjE1LjJcXFwiO3ZhciBmPWIucHJvdG90eXBlLHY9T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTtiLl9wYXJ0cz1mdW5jdGlvbigpe3JldHVybntwcm90b2NvbDpudWxsLHVzZXJuYW1lOm51bGwscGFzc3dvcmQ6bnVsbCxob3N0bmFtZTpudWxsLHVybjpudWxsLHBvcnQ6bnVsbCxwYXRoOm51bGwsXFxucXVlcnk6bnVsbCxmcmFnbWVudDpudWxsLGR1cGxpY2F0ZVF1ZXJ5UGFyYW1ldGVyczpiLmR1cGxpY2F0ZVF1ZXJ5UGFyYW1ldGVycyxlc2NhcGVRdWVyeVNwYWNlOmIuZXNjYXBlUXVlcnlTcGFjZX19O2IuZHVwbGljYXRlUXVlcnlQYXJhbWV0ZXJzPSExO2IuZXNjYXBlUXVlcnlTcGFjZT0hMDtiLnByb3RvY29sX2V4cHJlc3Npb249L15bYS16XVthLXowLTkuKy1dKiQvaTtiLmlkbl9leHByZXNzaW9uPS9bXmEtejAtOVxcXFwuLV0vaTtiLnB1bnljb2RlX2V4cHJlc3Npb249Lyh4bi0tKS9pO2IuaXA0X2V4cHJlc3Npb249L15cXFxcZHsxLDN9XFxcXC5cXFxcZHsxLDN9XFxcXC5cXFxcZHsxLDN9XFxcXC5cXFxcZHsxLDN9JC87Yi5pcDZfZXhwcmVzc2lvbj0vXlxcXFxzKigoKFswLTlBLUZhLWZdezEsNH06KXs3fShbMC05QS1GYS1mXXsxLDR9fDopKXwoKFswLTlBLUZhLWZdezEsNH06KXs2fSg6WzAtOUEtRmEtZl17MSw0fXwoKDI1WzAtNV18MlswLTRdXFxcXGR8MVxcXFxkXFxcXGR8WzEtOV0/XFxcXGQpKFxcXFwuKDI1WzAtNV18MlswLTRdXFxcXGR8MVxcXFxkXFxcXGR8WzEtOV0/XFxcXGQpKXszfSl8OikpfCgoWzAtOUEtRmEtZl17MSw0fTopezV9KCgoOlswLTlBLUZhLWZdezEsNH0pezEsMn0pfDooKDI1WzAtNV18MlswLTRdXFxcXGR8MVxcXFxkXFxcXGR8WzEtOV0/XFxcXGQpKFxcXFwuKDI1WzAtNV18MlswLTRdXFxcXGR8MVxcXFxkXFxcXGR8WzEtOV0/XFxcXGQpKXszfSl8OikpfCgoWzAtOUEtRmEtZl17MSw0fTopezR9KCgoOlswLTlBLUZhLWZdezEsNH0pezEsM30pfCgoOlswLTlBLUZhLWZdezEsNH0pPzooKDI1WzAtNV18MlswLTRdXFxcXGR8MVxcXFxkXFxcXGR8WzEtOV0/XFxcXGQpKFxcXFwuKDI1WzAtNV18MlswLTRdXFxcXGR8MVxcXFxkXFxcXGR8WzEtOV0/XFxcXGQpKXszfSkpfDopKXwoKFswLTlBLUZhLWZdezEsNH06KXszfSgoKDpbMC05QS1GYS1mXXsxLDR9KXsxLDR9KXwoKDpbMC05QS1GYS1mXXsxLDR9KXswLDJ9OigoMjVbMC01XXwyWzAtNF1cXFxcZHwxXFxcXGRcXFxcZHxbMS05XT9cXFxcZCkoXFxcXC4oMjVbMC01XXwyWzAtNF1cXFxcZHwxXFxcXGRcXFxcZHxbMS05XT9cXFxcZCkpezN9KSl8OikpfCgoWzAtOUEtRmEtZl17MSw0fTopezJ9KCgoOlswLTlBLUZhLWZdezEsNH0pezEsNX0pfCgoOlswLTlBLUZhLWZdezEsNH0pezAsM306KCgyNVswLTVdfDJbMC00XVxcXFxkfDFcXFxcZFxcXFxkfFsxLTldP1xcXFxkKShcXFxcLigyNVswLTVdfDJbMC00XVxcXFxkfDFcXFxcZFxcXFxkfFsxLTldP1xcXFxkKSl7M30pKXw6KSl8KChbMC05QS1GYS1mXXsxLDR9Oil7MX0oKCg6WzAtOUEtRmEtZl17MSw0fSl7MSw2fSl8KCg6WzAtOUEtRmEtZl17MSw0fSl7MCw0fTooKDI1WzAtNV18MlswLTRdXFxcXGR8MVxcXFxkXFxcXGR8WzEtOV0/XFxcXGQpKFxcXFwuKDI1WzAtNV18MlswLTRdXFxcXGR8MVxcXFxkXFxcXGR8WzEtOV0/XFxcXGQpKXszfSkpfDopKXwoOigoKDpbMC05QS1GYS1mXXsxLDR9KXsxLDd9KXwoKDpbMC05QS1GYS1mXXsxLDR9KXswLDV9OigoMjVbMC01XXwyWzAtNF1cXFxcZHwxXFxcXGRcXFxcZHxbMS05XT9cXFxcZCkoXFxcXC4oMjVbMC01XXwyWzAtNF1cXFxcZHwxXFxcXGRcXFxcZHxbMS05XT9cXFxcZCkpezN9KSl8OikpKSglLispP1xcXFxzKiQvO1xcbmIuZmluZF91cmlfZXhwcmVzc2lvbj0vXFxcXGIoKD86W2Etel1bXFxcXHctXSs6KD86XFxcXC97MSwzfXxbYS16MC05JV0pfHd3d1xcXFxkezAsM31bLl18W2EtejAtOS5cXFxcLV0rWy5dW2Etel17Miw0fVxcXFwvKSg/OlteXFxcXHMoKTw+XSt8XFxcXCgoW15cXFxccygpPD5dK3woXFxcXChbXlxcXFxzKCk8Pl0rXFxcXCkpKSpcXFxcKSkrKD86XFxcXCgoW15cXFxccygpPD5dK3woXFxcXChbXlxcXFxzKCk8Pl0rXFxcXCkpKSpcXFxcKXxbXlxcXFxzYCEoKVxcXFxbXFxcXF17fTs6J1xcXCIuLDw+P1xcXFx1MDBhYlxcXFx1MDBiYlxcXFx1MjAxY1xcXFx1MjAxZFxcXFx1MjAxOFxcXFx1MjAxOV0pKS9pZztiLmZpbmRVcmk9e3N0YXJ0Oi9cXFxcYig/OihbYS16XVthLXowLTkuKy1dKjpcXFxcL1xcXFwvKXx3d3dcXFxcLikvZ2ksZW5kOi9bXFxcXHNcXFxcclxcXFxuXXwkLyx0cmltOi9bYCEoKVxcXFxbXFxcXF17fTs6J1xcXCIuLDw+P1xcXFx1MDBhYlxcXFx1MDBiYlxcXFx1MjAxY1xcXFx1MjAxZFxcXFx1MjAxZVxcXFx1MjAxOFxcXFx1MjAxOV0rJC99O2IuZGVmYXVsdFBvcnRzPXtodHRwOlxcXCI4MFxcXCIsaHR0cHM6XFxcIjQ0M1xcXCIsZnRwOlxcXCIyMVxcXCIsZ29waGVyOlxcXCI3MFxcXCIsd3M6XFxcIjgwXFxcIix3c3M6XFxcIjQ0M1xcXCJ9O2IuaW52YWxpZF9ob3N0bmFtZV9jaGFyYWN0ZXJzPVxcbi9bXmEtekEtWjAtOVxcXFwuLV0vO2IuZG9tQXR0cmlidXRlcz17YTpcXFwiaHJlZlxcXCIsYmxvY2txdW90ZTpcXFwiY2l0ZVxcXCIsbGluazpcXFwiaHJlZlxcXCIsYmFzZTpcXFwiaHJlZlxcXCIsc2NyaXB0OlxcXCJzcmNcXFwiLGZvcm06XFxcImFjdGlvblxcXCIsaW1nOlxcXCJzcmNcXFwiLGFyZWE6XFxcImhyZWZcXFwiLGlmcmFtZTpcXFwic3JjXFxcIixlbWJlZDpcXFwic3JjXFxcIixzb3VyY2U6XFxcInNyY1xcXCIsdHJhY2s6XFxcInNyY1xcXCIsaW5wdXQ6XFxcInNyY1xcXCIsYXVkaW86XFxcInNyY1xcXCIsdmlkZW86XFxcInNyY1xcXCJ9O2IuZ2V0RG9tQXR0cmlidXRlPWZ1bmN0aW9uKGEpe2lmKGEmJmEubm9kZU5hbWUpe3ZhciBjPWEubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtyZXR1cm5cXFwiaW5wdXRcXFwiPT09YyYmXFxcImltYWdlXFxcIiE9PWEudHlwZT92b2lkIDA6Yi5kb21BdHRyaWJ1dGVzW2NdfX07Yi5lbmNvZGU9QjtiLmRlY29kZT1kZWNvZGVVUklDb21wb25lbnQ7Yi5pc284ODU5PWZ1bmN0aW9uKCl7Yi5lbmNvZGU9ZXNjYXBlO2IuZGVjb2RlPXVuZXNjYXBlfTtiLnVuaWNvZGU9ZnVuY3Rpb24oKXtiLmVuY29kZT1CO2IuZGVjb2RlPVxcbmRlY29kZVVSSUNvbXBvbmVudH07Yi5jaGFyYWN0ZXJzPXtwYXRobmFtZTp7ZW5jb2RlOntleHByZXNzaW9uOi8lKDI0fDI2fDJCfDJDfDNCfDNEfDNBfDQwKS9pZyxtYXA6e1xcXCIlMjRcXFwiOlxcXCIkXFxcIixcXFwiJTI2XFxcIjpcXFwiJlxcXCIsXFxcIiUyQlxcXCI6XFxcIitcXFwiLFxcXCIlMkNcXFwiOlxcXCIsXFxcIixcXFwiJTNCXFxcIjpcXFwiO1xcXCIsXFxcIiUzRFxcXCI6XFxcIj1cXFwiLFxcXCIlM0FcXFwiOlxcXCI6XFxcIixcXFwiJTQwXFxcIjpcXFwiQFxcXCJ9fSxkZWNvZGU6e2V4cHJlc3Npb246L1tcXFxcL1xcXFw/I10vZyxtYXA6e1xcXCIvXFxcIjpcXFwiJTJGXFxcIixcXFwiP1xcXCI6XFxcIiUzRlxcXCIsXFxcIiNcXFwiOlxcXCIlMjNcXFwifX19LHJlc2VydmVkOntlbmNvZGU6e2V4cHJlc3Npb246LyUoMjF8MjN8MjR8MjZ8Mjd8Mjh8Mjl8MkF8MkJ8MkN8MkZ8M0F8M0J8M0R8M0Z8NDB8NUJ8NUQpL2lnLG1hcDp7XFxcIiUzQVxcXCI6XFxcIjpcXFwiLFxcXCIlMkZcXFwiOlxcXCIvXFxcIixcXFwiJTNGXFxcIjpcXFwiP1xcXCIsXFxcIiUyM1xcXCI6XFxcIiNcXFwiLFxcXCIlNUJcXFwiOlxcXCJbXFxcIixcXFwiJTVEXFxcIjpcXFwiXVxcXCIsXFxcIiU0MFxcXCI6XFxcIkBcXFwiLFxcXCIlMjFcXFwiOlxcXCIhXFxcIixcXFwiJTI0XFxcIjpcXFwiJFxcXCIsXFxcIiUyNlxcXCI6XFxcIiZcXFwiLFxcXCIlMjdcXFwiOlxcXCInXFxcIixcXFwiJTI4XFxcIjpcXFwiKFxcXCIsXFxcIiUyOVxcXCI6XFxcIilcXFwiLFxcXCIlMkFcXFwiOlxcXCIqXFxcIixcXFwiJTJCXFxcIjpcXFwiK1xcXCIsXFxcIiUyQ1xcXCI6XFxcIixcXFwiLFxcblxcXCIlM0JcXFwiOlxcXCI7XFxcIixcXFwiJTNEXFxcIjpcXFwiPVxcXCJ9fX0sdXJucGF0aDp7ZW5jb2RlOntleHByZXNzaW9uOi8lKDIxfDI0fDI3fDI4fDI5fDJBfDJCfDJDfDNCfDNEfDQwKS9pZyxtYXA6e1xcXCIlMjFcXFwiOlxcXCIhXFxcIixcXFwiJTI0XFxcIjpcXFwiJFxcXCIsXFxcIiUyN1xcXCI6XFxcIidcXFwiLFxcXCIlMjhcXFwiOlxcXCIoXFxcIixcXFwiJTI5XFxcIjpcXFwiKVxcXCIsXFxcIiUyQVxcXCI6XFxcIipcXFwiLFxcXCIlMkJcXFwiOlxcXCIrXFxcIixcXFwiJTJDXFxcIjpcXFwiLFxcXCIsXFxcIiUzQlxcXCI6XFxcIjtcXFwiLFxcXCIlM0RcXFwiOlxcXCI9XFxcIixcXFwiJTQwXFxcIjpcXFwiQFxcXCJ9fSxkZWNvZGU6e2V4cHJlc3Npb246L1tcXFxcL1xcXFw/IzpdL2csbWFwOntcXFwiL1xcXCI6XFxcIiUyRlxcXCIsXFxcIj9cXFwiOlxcXCIlM0ZcXFwiLFxcXCIjXFxcIjpcXFwiJTIzXFxcIixcXFwiOlxcXCI6XFxcIiUzQVxcXCJ9fX19O2IuZW5jb2RlUXVlcnk9ZnVuY3Rpb24oYSxjKXt2YXIgZD1iLmVuY29kZShhK1xcXCJcXFwiKTt2b2lkIDA9PT1jJiYoYz1iLmVzY2FwZVF1ZXJ5U3BhY2UpO3JldHVybiBjP2QucmVwbGFjZSgvJTIwL2csXFxcIitcXFwiKTpkfTtiLmRlY29kZVF1ZXJ5PWZ1bmN0aW9uKGEsYyl7YSs9XFxcIlxcXCI7dm9pZCAwPT09YyYmKGM9Yi5lc2NhcGVRdWVyeVNwYWNlKTt0cnl7cmV0dXJuIGIuZGVjb2RlKGM/YS5yZXBsYWNlKC9cXFxcKy9nLFxcblxcXCIlMjBcXFwiKTphKX1jYXRjaChkKXtyZXR1cm4gYX19O3ZhciBxPXtlbmNvZGU6XFxcImVuY29kZVxcXCIsZGVjb2RlOlxcXCJkZWNvZGVcXFwifSx4LEM9ZnVuY3Rpb24oYSxjKXtyZXR1cm4gZnVuY3Rpb24oZCl7dHJ5e3JldHVybiBiW2NdKGQrXFxcIlxcXCIpLnJlcGxhY2UoYi5jaGFyYWN0ZXJzW2FdW2NdLmV4cHJlc3Npb24sZnVuY3Rpb24oZCl7cmV0dXJuIGIuY2hhcmFjdGVyc1thXVtjXS5tYXBbZF19KX1jYXRjaChtKXtyZXR1cm4gZH19fTtmb3IoeCBpbiBxKWJbeCtcXFwiUGF0aFNlZ21lbnRcXFwiXT1DKFxcXCJwYXRobmFtZVxcXCIscVt4XSksYlt4K1xcXCJVcm5QYXRoU2VnbWVudFxcXCJdPUMoXFxcInVybnBhdGhcXFwiLHFbeF0pO3E9ZnVuY3Rpb24oYSxjLGQpe3JldHVybiBmdW5jdGlvbihtKXt2YXIgZjtmPWQ/ZnVuY3Rpb24oYSl7cmV0dXJuIGJbY10oYltkXShhKSl9OmJbY107bT0obStcXFwiXFxcIikuc3BsaXQoYSk7Zm9yKHZhciBlPTAsaz1tLmxlbmd0aDtlPGs7ZSsrKW1bZV09ZihtW2VdKTtyZXR1cm4gbS5qb2luKGEpfX07Yi5kZWNvZGVQYXRoPVxcbnEoXFxcIi9cXFwiLFxcXCJkZWNvZGVQYXRoU2VnbWVudFxcXCIpO2IuZGVjb2RlVXJuUGF0aD1xKFxcXCI6XFxcIixcXFwiZGVjb2RlVXJuUGF0aFNlZ21lbnRcXFwiKTtiLnJlY29kZVBhdGg9cShcXFwiL1xcXCIsXFxcImVuY29kZVBhdGhTZWdtZW50XFxcIixcXFwiZGVjb2RlXFxcIik7Yi5yZWNvZGVVcm5QYXRoPXEoXFxcIjpcXFwiLFxcXCJlbmNvZGVVcm5QYXRoU2VnbWVudFxcXCIsXFxcImRlY29kZVxcXCIpO2IuZW5jb2RlUmVzZXJ2ZWQ9QyhcXFwicmVzZXJ2ZWRcXFwiLFxcXCJlbmNvZGVcXFwiKTtiLnBhcnNlPWZ1bmN0aW9uKGEsYyl7dmFyIGQ7Y3x8KGM9e30pO2Q9YS5pbmRleE9mKFxcXCIjXFxcIik7LTE8ZCYmKGMuZnJhZ21lbnQ9YS5zdWJzdHJpbmcoZCsxKXx8bnVsbCxhPWEuc3Vic3RyaW5nKDAsZCkpO2Q9YS5pbmRleE9mKFxcXCI/XFxcIik7LTE8ZCYmKGMucXVlcnk9YS5zdWJzdHJpbmcoZCsxKXx8bnVsbCxhPWEuc3Vic3RyaW5nKDAsZCkpO1xcXCIvL1xcXCI9PT1hLnN1YnN0cmluZygwLDIpPyhjLnByb3RvY29sPW51bGwsYT1hLnN1YnN0cmluZygyKSxhPWIucGFyc2VBdXRob3JpdHkoYSxjKSk6KGQ9YS5pbmRleE9mKFxcXCI6XFxcIiksXFxuLTE8ZCYmKGMucHJvdG9jb2w9YS5zdWJzdHJpbmcoMCxkKXx8bnVsbCxjLnByb3RvY29sJiYhYy5wcm90b2NvbC5tYXRjaChiLnByb3RvY29sX2V4cHJlc3Npb24pP2MucHJvdG9jb2w9dm9pZCAwOlxcXCIvL1xcXCI9PT1hLnN1YnN0cmluZyhkKzEsZCszKT8oYT1hLnN1YnN0cmluZyhkKzMpLGE9Yi5wYXJzZUF1dGhvcml0eShhLGMpKTooYT1hLnN1YnN0cmluZyhkKzEpLGMudXJuPSEwKSkpO2MucGF0aD1hO3JldHVybiBjfTtiLnBhcnNlSG9zdD1mdW5jdGlvbihhLGMpe3ZhciBkPWEuaW5kZXhPZihcXFwiL1xcXCIpLGI7LTE9PT1kJiYoZD1hLmxlbmd0aCk7aWYoXFxcIltcXFwiPT09YS5jaGFyQXQoMCkpYj1hLmluZGV4T2YoXFxcIl1cXFwiKSxjLmhvc3RuYW1lPWEuc3Vic3RyaW5nKDEsYil8fG51bGwsYy5wb3J0PWEuc3Vic3RyaW5nKGIrMixkKXx8bnVsbCxcXFwiL1xcXCI9PT1jLnBvcnQmJihjLnBvcnQ9bnVsbCk7ZWxzZXt2YXIgZj1hLmluZGV4T2YoXFxcIjpcXFwiKTtiPWEuaW5kZXhPZihcXFwiL1xcXCIpO2Y9YS5pbmRleE9mKFxcXCI6XFxcIixmKzEpO1xcbi0xIT09ZiYmKC0xPT09Ynx8ZjxiKT8oYy5ob3N0bmFtZT1hLnN1YnN0cmluZygwLGQpfHxudWxsLGMucG9ydD1udWxsKTooYj1hLnN1YnN0cmluZygwLGQpLnNwbGl0KFxcXCI6XFxcIiksYy5ob3N0bmFtZT1iWzBdfHxudWxsLGMucG9ydD1iWzFdfHxudWxsKX1jLmhvc3RuYW1lJiZcXFwiL1xcXCIhPT1hLnN1YnN0cmluZyhkKS5jaGFyQXQoMCkmJihkKyssYT1cXFwiL1xcXCIrYSk7cmV0dXJuIGEuc3Vic3RyaW5nKGQpfHxcXFwiL1xcXCJ9O2IucGFyc2VBdXRob3JpdHk9ZnVuY3Rpb24oYSxjKXthPWIucGFyc2VVc2VyaW5mbyhhLGMpO3JldHVybiBiLnBhcnNlSG9zdChhLGMpfTtiLnBhcnNlVXNlcmluZm89ZnVuY3Rpb24oYSxjKXt2YXIgZD1hLmluZGV4T2YoXFxcIi9cXFwiKSxtPWEubGFzdEluZGV4T2YoXFxcIkBcXFwiLC0xPGQ/ZDphLmxlbmd0aC0xKTstMTxtJiYoLTE9PT1kfHxtPGQpPyhkPWEuc3Vic3RyaW5nKDAsbSkuc3BsaXQoXFxcIjpcXFwiKSxjLnVzZXJuYW1lPWRbMF0/Yi5kZWNvZGUoZFswXSk6bnVsbCxkLnNoaWZ0KCksYy5wYXNzd29yZD1cXG5kWzBdP2IuZGVjb2RlKGQuam9pbihcXFwiOlxcXCIpKTpudWxsLGE9YS5zdWJzdHJpbmcobSsxKSk6KGMudXNlcm5hbWU9bnVsbCxjLnBhc3N3b3JkPW51bGwpO3JldHVybiBhfTtiLnBhcnNlUXVlcnk9ZnVuY3Rpb24oYSxjKXtpZighYSlyZXR1cm57fTthPWEucmVwbGFjZSgvJisvZyxcXFwiJlxcXCIpLnJlcGxhY2UoL15cXFxcPyomKnwmKyQvZyxcXFwiXFxcIik7aWYoIWEpcmV0dXJue307Zm9yKHZhciBkPXt9LG09YS5zcGxpdChcXFwiJlxcXCIpLGY9bS5sZW5ndGgsZSxrLGc9MDtnPGY7ZysrKWlmKGU9bVtnXS5zcGxpdChcXFwiPVxcXCIpLGs9Yi5kZWNvZGVRdWVyeShlLnNoaWZ0KCksYyksZT1lLmxlbmd0aD9iLmRlY29kZVF1ZXJ5KGUuam9pbihcXFwiPVxcXCIpLGMpOm51bGwsdi5jYWxsKGQsaykpe2lmKFxcXCJzdHJpbmdcXFwiPT09dHlwZW9mIGRba118fG51bGw9PT1kW2tdKWRba109W2Rba11dO2Rba10ucHVzaChlKX1lbHNlIGRba109ZTtyZXR1cm4gZH07Yi5idWlsZD1mdW5jdGlvbihhKXt2YXIgYz1cXFwiXFxcIjthLnByb3RvY29sJiYoYys9YS5wcm90b2NvbCtcXG5cXFwiOlxcXCIpO2EudXJufHwhYyYmIWEuaG9zdG5hbWV8fChjKz1cXFwiLy9cXFwiKTtjKz1iLmJ1aWxkQXV0aG9yaXR5KGEpfHxcXFwiXFxcIjtcXFwic3RyaW5nXFxcIj09PXR5cGVvZiBhLnBhdGgmJihcXFwiL1xcXCIhPT1hLnBhdGguY2hhckF0KDApJiZcXFwic3RyaW5nXFxcIj09PXR5cGVvZiBhLmhvc3RuYW1lJiYoYys9XFxcIi9cXFwiKSxjKz1hLnBhdGgpO1xcXCJzdHJpbmdcXFwiPT09dHlwZW9mIGEucXVlcnkmJmEucXVlcnkmJihjKz1cXFwiP1xcXCIrYS5xdWVyeSk7XFxcInN0cmluZ1xcXCI9PT10eXBlb2YgYS5mcmFnbWVudCYmYS5mcmFnbWVudCYmKGMrPVxcXCIjXFxcIithLmZyYWdtZW50KTtyZXR1cm4gY307Yi5idWlsZEhvc3Q9ZnVuY3Rpb24oYSl7dmFyIGM9XFxcIlxcXCI7aWYoYS5ob3N0bmFtZSljPWIuaXA2X2V4cHJlc3Npb24udGVzdChhLmhvc3RuYW1lKT9jKyhcXFwiW1xcXCIrYS5ob3N0bmFtZStcXFwiXVxcXCIpOmMrYS5ob3N0bmFtZTtlbHNlIHJldHVyblxcXCJcXFwiO2EucG9ydCYmKGMrPVxcXCI6XFxcIithLnBvcnQpO3JldHVybiBjfTtiLmJ1aWxkQXV0aG9yaXR5PWZ1bmN0aW9uKGEpe3JldHVybiBiLmJ1aWxkVXNlcmluZm8oYSkrXFxuYi5idWlsZEhvc3QoYSl9O2IuYnVpbGRVc2VyaW5mbz1mdW5jdGlvbihhKXt2YXIgYz1cXFwiXFxcIjthLnVzZXJuYW1lJiYoYys9Yi5lbmNvZGUoYS51c2VybmFtZSksYS5wYXNzd29yZCYmKGMrPVxcXCI6XFxcIitiLmVuY29kZShhLnBhc3N3b3JkKSksYys9XFxcIkBcXFwiKTtyZXR1cm4gY307Yi5idWlsZFF1ZXJ5PWZ1bmN0aW9uKGEsYyxkKXt2YXIgbT1cXFwiXFxcIixmLGUsayxnO2ZvcihlIGluIGEpaWYodi5jYWxsKGEsZSkmJmUpaWYodyhhW2VdKSlmb3IoZj17fSxrPTAsZz1hW2VdLmxlbmd0aDtrPGc7aysrKXZvaWQgMCE9PWFbZV1ba10mJnZvaWQgMD09PWZbYVtlXVtrXStcXFwiXFxcIl0mJihtKz1cXFwiJlxcXCIrYi5idWlsZFF1ZXJ5UGFyYW1ldGVyKGUsYVtlXVtrXSxkKSwhMCE9PWMmJihmW2FbZV1ba10rXFxcIlxcXCJdPSEwKSk7ZWxzZSB2b2lkIDAhPT1hW2VdJiYobSs9XFxcIiZcXFwiK2IuYnVpbGRRdWVyeVBhcmFtZXRlcihlLGFbZV0sZCkpO3JldHVybiBtLnN1YnN0cmluZygxKX07Yi5idWlsZFF1ZXJ5UGFyYW1ldGVyPWZ1bmN0aW9uKGEsXFxuYyxkKXtyZXR1cm4gYi5lbmNvZGVRdWVyeShhLGQpKyhudWxsIT09Yz9cXFwiPVxcXCIrYi5lbmNvZGVRdWVyeShjLGQpOlxcXCJcXFwiKX07Yi5hZGRRdWVyeT1mdW5jdGlvbihhLGMsZCl7aWYoXFxcIm9iamVjdFxcXCI9PT10eXBlb2YgYylmb3IodmFyIG0gaW4gYyl2LmNhbGwoYyxtKSYmYi5hZGRRdWVyeShhLG0sY1ttXSk7ZWxzZSBpZihcXFwic3RyaW5nXFxcIj09PXR5cGVvZiBjKXZvaWQgMD09PWFbY10/YVtjXT1kOihcXFwic3RyaW5nXFxcIj09PXR5cGVvZiBhW2NdJiYoYVtjXT1bYVtjXV0pLHcoZCl8fChkPVtkXSksYVtjXT0oYVtjXXx8W10pLmNvbmNhdChkKSk7ZWxzZSB0aHJvdyBuZXcgVHlwZUVycm9yKFxcXCJVUkkuYWRkUXVlcnkoKSBhY2NlcHRzIGFuIG9iamVjdCwgc3RyaW5nIGFzIHRoZSBuYW1lIHBhcmFtZXRlclxcXCIpO307Yi5yZW1vdmVRdWVyeT1mdW5jdGlvbihhLGMsZCl7dmFyIG07aWYodyhjKSlmb3IoZD0wLG09Yy5sZW5ndGg7ZDxtO2QrKylhW2NbZF1dPXZvaWQgMDtlbHNlIGlmKFxcXCJSZWdFeHBcXFwiPT09QShjKSlmb3IobSBpbiBhKWMudGVzdChtKSYmXFxuKGFbbV09dm9pZCAwKTtlbHNlIGlmKFxcXCJvYmplY3RcXFwiPT09dHlwZW9mIGMpZm9yKG0gaW4gYyl2LmNhbGwoYyxtKSYmYi5yZW1vdmVRdWVyeShhLG0sY1ttXSk7ZWxzZSBpZihcXFwic3RyaW5nXFxcIj09PXR5cGVvZiBjKXZvaWQgMCE9PWQ/XFxcIlJlZ0V4cFxcXCI9PT1BKGQpPyF3KGFbY10pJiZkLnRlc3QoYVtjXSk/YVtjXT12b2lkIDA6YVtjXT1rKGFbY10sZCk6YVtjXT09PWQ/YVtjXT12b2lkIDA6dyhhW2NdKSYmKGFbY109ayhhW2NdLGQpKTphW2NdPXZvaWQgMDtlbHNlIHRocm93IG5ldyBUeXBlRXJyb3IoXFxcIlVSSS5yZW1vdmVRdWVyeSgpIGFjY2VwdHMgYW4gb2JqZWN0LCBzdHJpbmcsIFJlZ0V4cCBhcyB0aGUgZmlyc3QgcGFyYW1ldGVyXFxcIik7fTtiLmhhc1F1ZXJ5PWZ1bmN0aW9uKGEsYyxkLG0pe2lmKFxcXCJvYmplY3RcXFwiPT09dHlwZW9mIGMpe2Zvcih2YXIgZiBpbiBjKWlmKHYuY2FsbChjLGYpJiYhYi5oYXNRdWVyeShhLGYsY1tmXSkpcmV0dXJuITE7cmV0dXJuITB9aWYoXFxcInN0cmluZ1xcXCIhPT10eXBlb2YgYyl0aHJvdyBuZXcgVHlwZUVycm9yKFxcXCJVUkkuaGFzUXVlcnkoKSBhY2NlcHRzIGFuIG9iamVjdCwgc3RyaW5nIGFzIHRoZSBuYW1lIHBhcmFtZXRlclxcXCIpO1xcbnN3aXRjaChBKGQpKXtjYXNlIFxcXCJVbmRlZmluZWRcXFwiOnJldHVybiBjIGluIGE7Y2FzZSBcXFwiQm9vbGVhblxcXCI6cmV0dXJuIGE9Qm9vbGVhbih3KGFbY10pP2FbY10ubGVuZ3RoOmFbY10pLGQ9PT1hO2Nhc2UgXFxcIkZ1bmN0aW9uXFxcIjpyZXR1cm4hIWQoYVtjXSxjLGEpO2Nhc2UgXFxcIkFycmF5XFxcIjpyZXR1cm4gdyhhW2NdKT8obT91OkQpKGFbY10sZCk6ITE7Y2FzZSBcXFwiUmVnRXhwXFxcIjpyZXR1cm4gdyhhW2NdKT9tP3UoYVtjXSxkKTohMTpCb29sZWFuKGFbY10mJmFbY10ubWF0Y2goZCkpO2Nhc2UgXFxcIk51bWJlclxcXCI6ZD1TdHJpbmcoZCk7Y2FzZSBcXFwiU3RyaW5nXFxcIjpyZXR1cm4gdyhhW2NdKT9tP3UoYVtjXSxkKTohMTphW2NdPT09ZDtkZWZhdWx0OnRocm93IG5ldyBUeXBlRXJyb3IoXFxcIlVSSS5oYXNRdWVyeSgpIGFjY2VwdHMgdW5kZWZpbmVkLCBib29sZWFuLCBzdHJpbmcsIG51bWJlciwgUmVnRXhwLCBGdW5jdGlvbiBhcyB0aGUgdmFsdWUgcGFyYW1ldGVyXFxcIik7fX07Yi5jb21tb25QYXRoPWZ1bmN0aW9uKGEsYyl7dmFyIGQ9XFxuTWF0aC5taW4oYS5sZW5ndGgsYy5sZW5ndGgpLGI7Zm9yKGI9MDtiPGQ7YisrKWlmKGEuY2hhckF0KGIpIT09Yy5jaGFyQXQoYikpe2ItLTticmVha31pZigxPmIpcmV0dXJuIGEuY2hhckF0KDApPT09Yy5jaGFyQXQoMCkmJlxcXCIvXFxcIj09PWEuY2hhckF0KDApP1xcXCIvXFxcIjpcXFwiXFxcIjtpZihcXFwiL1xcXCIhPT1hLmNoYXJBdChiKXx8XFxcIi9cXFwiIT09Yy5jaGFyQXQoYikpYj1hLnN1YnN0cmluZygwLGIpLmxhc3RJbmRleE9mKFxcXCIvXFxcIik7cmV0dXJuIGEuc3Vic3RyaW5nKDAsYisxKX07Yi53aXRoaW5TdHJpbmc9ZnVuY3Rpb24oYSxjLGQpe2R8fChkPXt9KTt2YXIgbT1kLnN0YXJ0fHxiLmZpbmRVcmkuc3RhcnQsZj1kLmVuZHx8Yi5maW5kVXJpLmVuZCxlPWQudHJpbXx8Yi5maW5kVXJpLnRyaW0saz0vW2EtejAtOS1dPVtcXFwiJ10/JC9pO2ZvcihtLmxhc3RJbmRleD0wOzspe3ZhciBnPW0uZXhlYyhhKTtpZighZylicmVhaztnPWcuaW5kZXg7aWYoZC5pZ25vcmVIdG1sKXt2YXIgdT1hLnNsaWNlKE1hdGgubWF4KGctMywwKSxcXG5nKTtpZih1JiZrLnRlc3QodSkpY29udGludWV9dmFyIHU9ZythLnNsaWNlKGcpLnNlYXJjaChmKSxoPWEuc2xpY2UoZyx1KS5yZXBsYWNlKGUsXFxcIlxcXCIpO2QuaWdub3JlJiZkLmlnbm9yZS50ZXN0KGgpfHwodT1nK2gubGVuZ3RoLGg9YyhoLGcsdSxhKSxhPWEuc2xpY2UoMCxnKStoK2Euc2xpY2UodSksbS5sYXN0SW5kZXg9ZytoLmxlbmd0aCl9bS5sYXN0SW5kZXg9MDtyZXR1cm4gYX07Yi5lbnN1cmVWYWxpZEhvc3RuYW1lPWZ1bmN0aW9uKGEpe2lmKGEubWF0Y2goYi5pbnZhbGlkX2hvc3RuYW1lX2NoYXJhY3RlcnMpKXtpZighZSl0aHJvdyBuZXcgVHlwZUVycm9yKCdIb3N0bmFtZSBcXFwiJythKydcXFwiIGNvbnRhaW5zIGNoYXJhY3RlcnMgb3RoZXIgdGhhbiBbQS1aMC05Li1dIGFuZCBQdW55Y29kZS5qcyBpcyBub3QgYXZhaWxhYmxlJyk7aWYoZS50b0FTQ0lJKGEpLm1hdGNoKGIuaW52YWxpZF9ob3N0bmFtZV9jaGFyYWN0ZXJzKSl0aHJvdyBuZXcgVHlwZUVycm9yKCdIb3N0bmFtZSBcXFwiJytcXG5hKydcXFwiIGNvbnRhaW5zIGNoYXJhY3RlcnMgb3RoZXIgdGhhbiBbQS1aMC05Li1dJyk7fX07Yi5ub0NvbmZsaWN0PWZ1bmN0aW9uKGEpe2lmKGEpcmV0dXJuIGE9e1VSSTp0aGlzLm5vQ29uZmxpY3QoKX0sbC5VUklUZW1wbGF0ZSYmXFxcImZ1bmN0aW9uXFxcIj09PXR5cGVvZiBsLlVSSVRlbXBsYXRlLm5vQ29uZmxpY3QmJihhLlVSSVRlbXBsYXRlPWwuVVJJVGVtcGxhdGUubm9Db25mbGljdCgpKSxsLklQdjYmJlxcXCJmdW5jdGlvblxcXCI9PT10eXBlb2YgbC5JUHY2Lm5vQ29uZmxpY3QmJihhLklQdjY9bC5JUHY2Lm5vQ29uZmxpY3QoKSksbC5TZWNvbmRMZXZlbERvbWFpbnMmJlxcXCJmdW5jdGlvblxcXCI9PT10eXBlb2YgbC5TZWNvbmRMZXZlbERvbWFpbnMubm9Db25mbGljdCYmKGEuU2Vjb25kTGV2ZWxEb21haW5zPWwuU2Vjb25kTGV2ZWxEb21haW5zLm5vQ29uZmxpY3QoKSksYTtsLlVSST09PXRoaXMmJihsLlVSST1wKTtyZXR1cm4gdGhpc307Zi5idWlsZD1mdW5jdGlvbihhKXtpZighMD09PWEpdGhpcy5fZGVmZXJyZWRfYnVpbGQ9XFxuITA7ZWxzZSBpZih2b2lkIDA9PT1hfHx0aGlzLl9kZWZlcnJlZF9idWlsZCl0aGlzLl9zdHJpbmc9Yi5idWlsZCh0aGlzLl9wYXJ0cyksdGhpcy5fZGVmZXJyZWRfYnVpbGQ9ITE7cmV0dXJuIHRoaXN9O2YuY2xvbmU9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IGIodGhpcyl9O2YudmFsdWVPZj1mLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYnVpbGQoITEpLl9zdHJpbmd9O2YucHJvdG9jb2w9dChcXFwicHJvdG9jb2xcXFwiKTtmLnVzZXJuYW1lPXQoXFxcInVzZXJuYW1lXFxcIik7Zi5wYXNzd29yZD10KFxcXCJwYXNzd29yZFxcXCIpO2YuaG9zdG5hbWU9dChcXFwiaG9zdG5hbWVcXFwiKTtmLnBvcnQ9dChcXFwicG9ydFxcXCIpO2YucXVlcnk9cihcXFwicXVlcnlcXFwiLFxcXCI/XFxcIik7Zi5mcmFnbWVudD1yKFxcXCJmcmFnbWVudFxcXCIsXFxcIiNcXFwiKTtmLnNlYXJjaD1mdW5jdGlvbihhLGMpe3ZhciBiPXRoaXMucXVlcnkoYSxjKTtyZXR1cm5cXFwic3RyaW5nXFxcIj09PXR5cGVvZiBiJiZiLmxlbmd0aD9cXFwiP1xcXCIrYjpifTtmLmhhc2g9ZnVuY3Rpb24oYSxjKXt2YXIgYj1cXG50aGlzLmZyYWdtZW50KGEsYyk7cmV0dXJuXFxcInN0cmluZ1xcXCI9PT10eXBlb2YgYiYmYi5sZW5ndGg/XFxcIiNcXFwiK2I6Yn07Zi5wYXRobmFtZT1mdW5jdGlvbihhLGMpe2lmKHZvaWQgMD09PWF8fCEwPT09YSl7dmFyIGQ9dGhpcy5fcGFydHMucGF0aHx8KHRoaXMuX3BhcnRzLmhvc3RuYW1lP1xcXCIvXFxcIjpcXFwiXFxcIik7cmV0dXJuIGE/KHRoaXMuX3BhcnRzLnVybj9iLmRlY29kZVVyblBhdGg6Yi5kZWNvZGVQYXRoKShkKTpkfXRoaXMuX3BhcnRzLnBhdGg9dGhpcy5fcGFydHMudXJuP2E/Yi5yZWNvZGVVcm5QYXRoKGEpOlxcXCJcXFwiOmE/Yi5yZWNvZGVQYXRoKGEpOlxcXCIvXFxcIjt0aGlzLmJ1aWxkKCFjKTtyZXR1cm4gdGhpc307Zi5wYXRoPWYucGF0aG5hbWU7Zi5ocmVmPWZ1bmN0aW9uKGEsYyl7dmFyIGQ7aWYodm9pZCAwPT09YSlyZXR1cm4gdGhpcy50b1N0cmluZygpO3RoaXMuX3N0cmluZz1cXFwiXFxcIjt0aGlzLl9wYXJ0cz1iLl9wYXJ0cygpO3ZhciBmPWEgaW5zdGFuY2VvZiBiLGU9XFxcIm9iamVjdFxcXCI9PT10eXBlb2YgYSYmKGEuaG9zdG5hbWV8fFxcbmEucGF0aHx8YS5wYXRobmFtZSk7YS5ub2RlTmFtZSYmKGU9Yi5nZXREb21BdHRyaWJ1dGUoYSksYT1hW2VdfHxcXFwiXFxcIixlPSExKTshZiYmZSYmdm9pZCAwIT09YS5wYXRobmFtZSYmKGE9YS50b1N0cmluZygpKTtpZihcXFwic3RyaW5nXFxcIj09PXR5cGVvZiBhfHxhIGluc3RhbmNlb2YgU3RyaW5nKXRoaXMuX3BhcnRzPWIucGFyc2UoU3RyaW5nKGEpLHRoaXMuX3BhcnRzKTtlbHNlIGlmKGZ8fGUpZm9yKGQgaW4gZj1mP2EuX3BhcnRzOmEsZil2LmNhbGwodGhpcy5fcGFydHMsZCkmJih0aGlzLl9wYXJ0c1tkXT1mW2RdKTtlbHNlIHRocm93IG5ldyBUeXBlRXJyb3IoXFxcImludmFsaWQgaW5wdXRcXFwiKTt0aGlzLmJ1aWxkKCFjKTtyZXR1cm4gdGhpc307Zi5pcz1mdW5jdGlvbihhKXt2YXIgYz0hMSxkPSExLGY9ITEsZT0hMSxrPSExLHU9ITEsaD0hMSxsPSF0aGlzLl9wYXJ0cy51cm47dGhpcy5fcGFydHMuaG9zdG5hbWUmJihsPSExLGQ9Yi5pcDRfZXhwcmVzc2lvbi50ZXN0KHRoaXMuX3BhcnRzLmhvc3RuYW1lKSxcXG5mPWIuaXA2X2V4cHJlc3Npb24udGVzdCh0aGlzLl9wYXJ0cy5ob3N0bmFtZSksYz1kfHxmLGs9KGU9IWMpJiZnJiZnLmhhcyh0aGlzLl9wYXJ0cy5ob3N0bmFtZSksdT1lJiZiLmlkbl9leHByZXNzaW9uLnRlc3QodGhpcy5fcGFydHMuaG9zdG5hbWUpLGg9ZSYmYi5wdW55Y29kZV9leHByZXNzaW9uLnRlc3QodGhpcy5fcGFydHMuaG9zdG5hbWUpKTtzd2l0Y2goYS50b0xvd2VyQ2FzZSgpKXtjYXNlIFxcXCJyZWxhdGl2ZVxcXCI6cmV0dXJuIGw7Y2FzZSBcXFwiYWJzb2x1dGVcXFwiOnJldHVybiFsO2Nhc2UgXFxcImRvbWFpblxcXCI6Y2FzZSBcXFwibmFtZVxcXCI6cmV0dXJuIGU7Y2FzZSBcXFwic2xkXFxcIjpyZXR1cm4gaztjYXNlIFxcXCJpcFxcXCI6cmV0dXJuIGM7Y2FzZSBcXFwiaXA0XFxcIjpjYXNlIFxcXCJpcHY0XFxcIjpjYXNlIFxcXCJpbmV0NFxcXCI6cmV0dXJuIGQ7Y2FzZSBcXFwiaXA2XFxcIjpjYXNlIFxcXCJpcHY2XFxcIjpjYXNlIFxcXCJpbmV0NlxcXCI6cmV0dXJuIGY7Y2FzZSBcXFwiaWRuXFxcIjpyZXR1cm4gdTtjYXNlIFxcXCJ1cmxcXFwiOnJldHVybiF0aGlzLl9wYXJ0cy51cm47Y2FzZSBcXFwidXJuXFxcIjpyZXR1cm4hIXRoaXMuX3BhcnRzLnVybjtcXG5jYXNlIFxcXCJwdW55Y29kZVxcXCI6cmV0dXJuIGh9cmV0dXJuIG51bGx9O3ZhciBGPWYucHJvdG9jb2wsRz1mLnBvcnQsSD1mLmhvc3RuYW1lO2YucHJvdG9jb2w9ZnVuY3Rpb24oYSxjKXtpZih2b2lkIDAhPT1hJiZhJiYoYT1hLnJlcGxhY2UoLzooXFxcXC9cXFxcLyk/JC8sXFxcIlxcXCIpLCFhLm1hdGNoKGIucHJvdG9jb2xfZXhwcmVzc2lvbikpKXRocm93IG5ldyBUeXBlRXJyb3IoJ1Byb3RvY29sIFxcXCInK2ErXFxcIlxcXFxcXFwiIGNvbnRhaW5zIGNoYXJhY3RlcnMgb3RoZXIgdGhhbiBbQS1aMC05ListXSBvciBkb2Vzbid0IHN0YXJ0IHdpdGggW0EtWl1cXFwiKTtyZXR1cm4gRi5jYWxsKHRoaXMsYSxjKX07Zi5zY2hlbWU9Zi5wcm90b2NvbDtmLnBvcnQ9ZnVuY3Rpb24oYSxjKXtpZih0aGlzLl9wYXJ0cy51cm4pcmV0dXJuIHZvaWQgMD09PWE/XFxcIlxcXCI6dGhpcztpZih2b2lkIDAhPT1hJiYoMD09PWEmJihhPW51bGwpLGEmJihhKz1cXFwiXFxcIixcXFwiOlxcXCI9PT1hLmNoYXJBdCgwKSYmKGE9YS5zdWJzdHJpbmcoMSkpLGEubWF0Y2goL1teMC05XS8pKSkpdGhyb3cgbmV3IFR5cGVFcnJvcignUG9ydCBcXFwiJytcXG5hKydcXFwiIGNvbnRhaW5zIGNoYXJhY3RlcnMgb3RoZXIgdGhhbiBbMC05XScpO3JldHVybiBHLmNhbGwodGhpcyxhLGMpfTtmLmhvc3RuYW1lPWZ1bmN0aW9uKGEsYyl7aWYodGhpcy5fcGFydHMudXJuKXJldHVybiB2b2lkIDA9PT1hP1xcXCJcXFwiOnRoaXM7aWYodm9pZCAwIT09YSl7dmFyIGQ9e307Yi5wYXJzZUhvc3QoYSxkKTthPWQuaG9zdG5hbWV9cmV0dXJuIEguY2FsbCh0aGlzLGEsYyl9O2YuaG9zdD1mdW5jdGlvbihhLGMpe2lmKHRoaXMuX3BhcnRzLnVybilyZXR1cm4gdm9pZCAwPT09YT9cXFwiXFxcIjp0aGlzO2lmKHZvaWQgMD09PWEpcmV0dXJuIHRoaXMuX3BhcnRzLmhvc3RuYW1lP2IuYnVpbGRIb3N0KHRoaXMuX3BhcnRzKTpcXFwiXFxcIjtiLnBhcnNlSG9zdChhLHRoaXMuX3BhcnRzKTt0aGlzLmJ1aWxkKCFjKTtyZXR1cm4gdGhpc307Zi5hdXRob3JpdHk9ZnVuY3Rpb24oYSxjKXtpZih0aGlzLl9wYXJ0cy51cm4pcmV0dXJuIHZvaWQgMD09PWE/XFxcIlxcXCI6dGhpcztpZih2b2lkIDA9PT1hKXJldHVybiB0aGlzLl9wYXJ0cy5ob3N0bmFtZT9cXG5iLmJ1aWxkQXV0aG9yaXR5KHRoaXMuX3BhcnRzKTpcXFwiXFxcIjtiLnBhcnNlQXV0aG9yaXR5KGEsdGhpcy5fcGFydHMpO3RoaXMuYnVpbGQoIWMpO3JldHVybiB0aGlzfTtmLnVzZXJpbmZvPWZ1bmN0aW9uKGEsYyl7aWYodGhpcy5fcGFydHMudXJuKXJldHVybiB2b2lkIDA9PT1hP1xcXCJcXFwiOnRoaXM7aWYodm9pZCAwPT09YSl7aWYoIXRoaXMuX3BhcnRzLnVzZXJuYW1lKXJldHVyblxcXCJcXFwiO3ZhciBkPWIuYnVpbGRVc2VyaW5mbyh0aGlzLl9wYXJ0cyk7cmV0dXJuIGQuc3Vic3RyaW5nKDAsZC5sZW5ndGgtMSl9XFxcIkBcXFwiIT09YVthLmxlbmd0aC0xXSYmKGErPVxcXCJAXFxcIik7Yi5wYXJzZVVzZXJpbmZvKGEsdGhpcy5fcGFydHMpO3RoaXMuYnVpbGQoIWMpO3JldHVybiB0aGlzfTtmLnJlc291cmNlPWZ1bmN0aW9uKGEsYyl7dmFyIGQ7aWYodm9pZCAwPT09YSlyZXR1cm4gdGhpcy5wYXRoKCkrdGhpcy5zZWFyY2goKSt0aGlzLmhhc2goKTtkPWIucGFyc2UoYSk7dGhpcy5fcGFydHMucGF0aD1kLnBhdGg7dGhpcy5fcGFydHMucXVlcnk9XFxuZC5xdWVyeTt0aGlzLl9wYXJ0cy5mcmFnbWVudD1kLmZyYWdtZW50O3RoaXMuYnVpbGQoIWMpO3JldHVybiB0aGlzfTtmLnN1YmRvbWFpbj1mdW5jdGlvbihhLGMpe2lmKHRoaXMuX3BhcnRzLnVybilyZXR1cm4gdm9pZCAwPT09YT9cXFwiXFxcIjp0aGlzO2lmKHZvaWQgMD09PWEpe2lmKCF0aGlzLl9wYXJ0cy5ob3N0bmFtZXx8dGhpcy5pcyhcXFwiSVBcXFwiKSlyZXR1cm5cXFwiXFxcIjt2YXIgZD10aGlzLl9wYXJ0cy5ob3N0bmFtZS5sZW5ndGgtdGhpcy5kb21haW4oKS5sZW5ndGgtMTtyZXR1cm4gdGhpcy5fcGFydHMuaG9zdG5hbWUuc3Vic3RyaW5nKDAsZCl8fFxcXCJcXFwifWQ9dGhpcy5fcGFydHMuaG9zdG5hbWUubGVuZ3RoLXRoaXMuZG9tYWluKCkubGVuZ3RoO2Q9dGhpcy5fcGFydHMuaG9zdG5hbWUuc3Vic3RyaW5nKDAsZCk7ZD1uZXcgUmVnRXhwKFxcXCJeXFxcIitoKGQpKTthJiZcXFwiLlxcXCIhPT1hLmNoYXJBdChhLmxlbmd0aC0xKSYmKGErPVxcXCIuXFxcIik7YSYmYi5lbnN1cmVWYWxpZEhvc3RuYW1lKGEpO3RoaXMuX3BhcnRzLmhvc3RuYW1lPVxcbnRoaXMuX3BhcnRzLmhvc3RuYW1lLnJlcGxhY2UoZCxhKTt0aGlzLmJ1aWxkKCFjKTtyZXR1cm4gdGhpc307Zi5kb21haW49ZnVuY3Rpb24oYSxjKXtpZih0aGlzLl9wYXJ0cy51cm4pcmV0dXJuIHZvaWQgMD09PWE/XFxcIlxcXCI6dGhpcztcXFwiYm9vbGVhblxcXCI9PT10eXBlb2YgYSYmKGM9YSxhPXZvaWQgMCk7aWYodm9pZCAwPT09YSl7aWYoIXRoaXMuX3BhcnRzLmhvc3RuYW1lfHx0aGlzLmlzKFxcXCJJUFxcXCIpKXJldHVyblxcXCJcXFwiO3ZhciBkPXRoaXMuX3BhcnRzLmhvc3RuYW1lLm1hdGNoKC9cXFxcLi9nKTtpZihkJiYyPmQubGVuZ3RoKXJldHVybiB0aGlzLl9wYXJ0cy5ob3N0bmFtZTtkPXRoaXMuX3BhcnRzLmhvc3RuYW1lLmxlbmd0aC10aGlzLnRsZChjKS5sZW5ndGgtMTtkPXRoaXMuX3BhcnRzLmhvc3RuYW1lLmxhc3RJbmRleE9mKFxcXCIuXFxcIixkLTEpKzE7cmV0dXJuIHRoaXMuX3BhcnRzLmhvc3RuYW1lLnN1YnN0cmluZyhkKXx8XFxcIlxcXCJ9aWYoIWEpdGhyb3cgbmV3IFR5cGVFcnJvcihcXFwiY2Fubm90IHNldCBkb21haW4gZW1wdHlcXFwiKTtcXG5iLmVuc3VyZVZhbGlkSG9zdG5hbWUoYSk7IXRoaXMuX3BhcnRzLmhvc3RuYW1lfHx0aGlzLmlzKFxcXCJJUFxcXCIpP3RoaXMuX3BhcnRzLmhvc3RuYW1lPWE6KGQ9bmV3IFJlZ0V4cChoKHRoaXMuZG9tYWluKCkpK1xcXCIkXFxcIiksdGhpcy5fcGFydHMuaG9zdG5hbWU9dGhpcy5fcGFydHMuaG9zdG5hbWUucmVwbGFjZShkLGEpKTt0aGlzLmJ1aWxkKCFjKTtyZXR1cm4gdGhpc307Zi50bGQ9ZnVuY3Rpb24oYSxjKXtpZih0aGlzLl9wYXJ0cy51cm4pcmV0dXJuIHZvaWQgMD09PWE/XFxcIlxcXCI6dGhpcztcXFwiYm9vbGVhblxcXCI9PT10eXBlb2YgYSYmKGM9YSxhPXZvaWQgMCk7aWYodm9pZCAwPT09YSl7aWYoIXRoaXMuX3BhcnRzLmhvc3RuYW1lfHx0aGlzLmlzKFxcXCJJUFxcXCIpKXJldHVyblxcXCJcXFwiO3ZhciBiPXRoaXMuX3BhcnRzLmhvc3RuYW1lLmxhc3RJbmRleE9mKFxcXCIuXFxcIiksYj10aGlzLl9wYXJ0cy5ob3N0bmFtZS5zdWJzdHJpbmcoYisxKTtyZXR1cm4hMCE9PWMmJmcmJmcubGlzdFtiLnRvTG93ZXJDYXNlKCldP2cuZ2V0KHRoaXMuX3BhcnRzLmhvc3RuYW1lKXx8XFxuYjpifWlmKGEpaWYoYS5tYXRjaCgvW15hLXpBLVowLTktXS8pKWlmKGcmJmcuaXMoYSkpYj1uZXcgUmVnRXhwKGgodGhpcy50bGQoKSkrXFxcIiRcXFwiKSx0aGlzLl9wYXJ0cy5ob3N0bmFtZT10aGlzLl9wYXJ0cy5ob3N0bmFtZS5yZXBsYWNlKGIsYSk7ZWxzZSB0aHJvdyBuZXcgVHlwZUVycm9yKCdUTEQgXFxcIicrYSsnXFxcIiBjb250YWlucyBjaGFyYWN0ZXJzIG90aGVyIHRoYW4gW0EtWjAtOV0nKTtlbHNle2lmKCF0aGlzLl9wYXJ0cy5ob3N0bmFtZXx8dGhpcy5pcyhcXFwiSVBcXFwiKSl0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoXFxcImNhbm5vdCBzZXQgVExEIG9uIG5vbi1kb21haW4gaG9zdFxcXCIpO2I9bmV3IFJlZ0V4cChoKHRoaXMudGxkKCkpK1xcXCIkXFxcIik7dGhpcy5fcGFydHMuaG9zdG5hbWU9dGhpcy5fcGFydHMuaG9zdG5hbWUucmVwbGFjZShiLGEpfWVsc2UgdGhyb3cgbmV3IFR5cGVFcnJvcihcXFwiY2Fubm90IHNldCBUTEQgZW1wdHlcXFwiKTt0aGlzLmJ1aWxkKCFjKTtyZXR1cm4gdGhpc307Zi5kaXJlY3Rvcnk9XFxuZnVuY3Rpb24oYSxjKXtpZih0aGlzLl9wYXJ0cy51cm4pcmV0dXJuIHZvaWQgMD09PWE/XFxcIlxcXCI6dGhpcztpZih2b2lkIDA9PT1hfHwhMD09PWEpe2lmKCF0aGlzLl9wYXJ0cy5wYXRoJiYhdGhpcy5fcGFydHMuaG9zdG5hbWUpcmV0dXJuXFxcIlxcXCI7aWYoXFxcIi9cXFwiPT09dGhpcy5fcGFydHMucGF0aClyZXR1cm5cXFwiL1xcXCI7dmFyIGQ9dGhpcy5fcGFydHMucGF0aC5sZW5ndGgtdGhpcy5maWxlbmFtZSgpLmxlbmd0aC0xLGQ9dGhpcy5fcGFydHMucGF0aC5zdWJzdHJpbmcoMCxkKXx8KHRoaXMuX3BhcnRzLmhvc3RuYW1lP1xcXCIvXFxcIjpcXFwiXFxcIik7cmV0dXJuIGE/Yi5kZWNvZGVQYXRoKGQpOmR9ZD10aGlzLl9wYXJ0cy5wYXRoLmxlbmd0aC10aGlzLmZpbGVuYW1lKCkubGVuZ3RoO2Q9dGhpcy5fcGFydHMucGF0aC5zdWJzdHJpbmcoMCxkKTtkPW5ldyBSZWdFeHAoXFxcIl5cXFwiK2goZCkpO3RoaXMuaXMoXFxcInJlbGF0aXZlXFxcIil8fChhfHwoYT1cXFwiL1xcXCIpLFxcXCIvXFxcIiE9PWEuY2hhckF0KDApJiYoYT1cXFwiL1xcXCIrYSkpO2EmJlxcXCIvXFxcIiE9PWEuY2hhckF0KGEubGVuZ3RoLVxcbjEpJiYoYSs9XFxcIi9cXFwiKTthPWIucmVjb2RlUGF0aChhKTt0aGlzLl9wYXJ0cy5wYXRoPXRoaXMuX3BhcnRzLnBhdGgucmVwbGFjZShkLGEpO3RoaXMuYnVpbGQoIWMpO3JldHVybiB0aGlzfTtmLmZpbGVuYW1lPWZ1bmN0aW9uKGEsYyl7aWYodGhpcy5fcGFydHMudXJuKXJldHVybiB2b2lkIDA9PT1hP1xcXCJcXFwiOnRoaXM7aWYodm9pZCAwPT09YXx8ITA9PT1hKXtpZighdGhpcy5fcGFydHMucGF0aHx8XFxcIi9cXFwiPT09dGhpcy5fcGFydHMucGF0aClyZXR1cm5cXFwiXFxcIjt2YXIgZD10aGlzLl9wYXJ0cy5wYXRoLmxhc3RJbmRleE9mKFxcXCIvXFxcIiksZD10aGlzLl9wYXJ0cy5wYXRoLnN1YnN0cmluZyhkKzEpO3JldHVybiBhP2IuZGVjb2RlUGF0aFNlZ21lbnQoZCk6ZH1kPSExO1xcXCIvXFxcIj09PWEuY2hhckF0KDApJiYoYT1hLnN1YnN0cmluZygxKSk7YS5tYXRjaCgvXFxcXC4/XFxcXC8vKSYmKGQ9ITApO3ZhciBmPW5ldyBSZWdFeHAoaCh0aGlzLmZpbGVuYW1lKCkpK1xcXCIkXFxcIik7YT1iLnJlY29kZVBhdGgoYSk7dGhpcy5fcGFydHMucGF0aD1cXG50aGlzLl9wYXJ0cy5wYXRoLnJlcGxhY2UoZixhKTtkP3RoaXMubm9ybWFsaXplUGF0aChjKTp0aGlzLmJ1aWxkKCFjKTtyZXR1cm4gdGhpc307Zi5zdWZmaXg9ZnVuY3Rpb24oYSxjKXtpZih0aGlzLl9wYXJ0cy51cm4pcmV0dXJuIHZvaWQgMD09PWE/XFxcIlxcXCI6dGhpcztpZih2b2lkIDA9PT1hfHwhMD09PWEpe2lmKCF0aGlzLl9wYXJ0cy5wYXRofHxcXFwiL1xcXCI9PT10aGlzLl9wYXJ0cy5wYXRoKXJldHVyblxcXCJcXFwiO3ZhciBkPXRoaXMuZmlsZW5hbWUoKSxmPWQubGFzdEluZGV4T2YoXFxcIi5cXFwiKTtpZigtMT09PWYpcmV0dXJuXFxcIlxcXCI7ZD1kLnN1YnN0cmluZyhmKzEpO2Q9L15bYS16MC05JV0rJC9pLnRlc3QoZCk/ZDpcXFwiXFxcIjtyZXR1cm4gYT9iLmRlY29kZVBhdGhTZWdtZW50KGQpOmR9XFxcIi5cXFwiPT09YS5jaGFyQXQoMCkmJihhPWEuc3Vic3RyaW5nKDEpKTtpZihkPXRoaXMuc3VmZml4KCkpZj1hP25ldyBSZWdFeHAoaChkKStcXFwiJFxcXCIpOm5ldyBSZWdFeHAoaChcXFwiLlxcXCIrZCkrXFxcIiRcXFwiKTtlbHNle2lmKCFhKXJldHVybiB0aGlzO1xcbnRoaXMuX3BhcnRzLnBhdGgrPVxcXCIuXFxcIitiLnJlY29kZVBhdGgoYSl9ZiYmKGE9Yi5yZWNvZGVQYXRoKGEpLHRoaXMuX3BhcnRzLnBhdGg9dGhpcy5fcGFydHMucGF0aC5yZXBsYWNlKGYsYSkpO3RoaXMuYnVpbGQoIWMpO3JldHVybiB0aGlzfTtmLnNlZ21lbnQ9ZnVuY3Rpb24oYSxjLGIpe3ZhciBmPXRoaXMuX3BhcnRzLnVybj9cXFwiOlxcXCI6XFxcIi9cXFwiLGU9dGhpcy5wYXRoKCksaz1cXFwiL1xcXCI9PT1lLnN1YnN0cmluZygwLDEpLGU9ZS5zcGxpdChmKTt2b2lkIDAhPT1hJiZcXFwibnVtYmVyXFxcIiE9PXR5cGVvZiBhJiYoYj1jLGM9YSxhPXZvaWQgMCk7aWYodm9pZCAwIT09YSYmXFxcIm51bWJlclxcXCIhPT10eXBlb2YgYSl0aHJvdyBFcnJvcignQmFkIHNlZ21lbnQgXFxcIicrYSsnXFxcIiwgbXVzdCBiZSAwLWJhc2VkIGludGVnZXInKTtrJiZlLnNoaWZ0KCk7MD5hJiYoYT1NYXRoLm1heChlLmxlbmd0aCthLDApKTtpZih2b2lkIDA9PT1jKXJldHVybiB2b2lkIDA9PT1hP2U6ZVthXTtpZihudWxsPT09YXx8dm9pZCAwPT09ZVthXSlpZih3KGMpKXtlPVxcbltdO2E9MDtmb3IodmFyIGc9Yy5sZW5ndGg7YTxnO2ErKylpZihjW2FdLmxlbmd0aHx8ZS5sZW5ndGgmJmVbZS5sZW5ndGgtMV0ubGVuZ3RoKWUubGVuZ3RoJiYhZVtlLmxlbmd0aC0xXS5sZW5ndGgmJmUucG9wKCksZS5wdXNoKGNbYV0pfWVsc2V7aWYoY3x8XFxcInN0cmluZ1xcXCI9PT10eXBlb2YgYylcXFwiXFxcIj09PWVbZS5sZW5ndGgtMV0/ZVtlLmxlbmd0aC0xXT1jOmUucHVzaChjKX1lbHNlIGM/ZVthXT1jOmUuc3BsaWNlKGEsMSk7ayYmZS51bnNoaWZ0KFxcXCJcXFwiKTtyZXR1cm4gdGhpcy5wYXRoKGUuam9pbihmKSxiKX07Zi5zZWdtZW50Q29kZWQ9ZnVuY3Rpb24oYSxjLGQpe3ZhciBmLGU7XFxcIm51bWJlclxcXCIhPT10eXBlb2YgYSYmKGQ9YyxjPWEsYT12b2lkIDApO2lmKHZvaWQgMD09PWMpe2E9dGhpcy5zZWdtZW50KGEsYyxkKTtpZih3KGEpKWZvcihmPTAsZT1hLmxlbmd0aDtmPGU7ZisrKWFbZl09Yi5kZWNvZGUoYVtmXSk7ZWxzZSBhPXZvaWQgMCE9PWE/Yi5kZWNvZGUoYSk6dm9pZCAwO3JldHVybiBhfWlmKHcoYykpZm9yKGY9XFxuMCxlPWMubGVuZ3RoO2Y8ZTtmKyspY1tmXT1iLmVuY29kZShjW2ZdKTtlbHNlIGM9XFxcInN0cmluZ1xcXCI9PT10eXBlb2YgY3x8YyBpbnN0YW5jZW9mIFN0cmluZz9iLmVuY29kZShjKTpjO3JldHVybiB0aGlzLnNlZ21lbnQoYSxjLGQpfTt2YXIgST1mLnF1ZXJ5O2YucXVlcnk9ZnVuY3Rpb24oYSxjKXtpZighMD09PWEpcmV0dXJuIGIucGFyc2VRdWVyeSh0aGlzLl9wYXJ0cy5xdWVyeSx0aGlzLl9wYXJ0cy5lc2NhcGVRdWVyeVNwYWNlKTtpZihcXFwiZnVuY3Rpb25cXFwiPT09dHlwZW9mIGEpe3ZhciBkPWIucGFyc2VRdWVyeSh0aGlzLl9wYXJ0cy5xdWVyeSx0aGlzLl9wYXJ0cy5lc2NhcGVRdWVyeVNwYWNlKSxmPWEuY2FsbCh0aGlzLGQpO3RoaXMuX3BhcnRzLnF1ZXJ5PWIuYnVpbGRRdWVyeShmfHxkLHRoaXMuX3BhcnRzLmR1cGxpY2F0ZVF1ZXJ5UGFyYW1ldGVycyx0aGlzLl9wYXJ0cy5lc2NhcGVRdWVyeVNwYWNlKTt0aGlzLmJ1aWxkKCFjKTtyZXR1cm4gdGhpc31yZXR1cm4gdm9pZCAwIT09XFxuYSYmXFxcInN0cmluZ1xcXCIhPT10eXBlb2YgYT8odGhpcy5fcGFydHMucXVlcnk9Yi5idWlsZFF1ZXJ5KGEsdGhpcy5fcGFydHMuZHVwbGljYXRlUXVlcnlQYXJhbWV0ZXJzLHRoaXMuX3BhcnRzLmVzY2FwZVF1ZXJ5U3BhY2UpLHRoaXMuYnVpbGQoIWMpLHRoaXMpOkkuY2FsbCh0aGlzLGEsYyl9O2Yuc2V0UXVlcnk9ZnVuY3Rpb24oYSxjLGQpe3ZhciBmPWIucGFyc2VRdWVyeSh0aGlzLl9wYXJ0cy5xdWVyeSx0aGlzLl9wYXJ0cy5lc2NhcGVRdWVyeVNwYWNlKTtpZihcXFwic3RyaW5nXFxcIj09PXR5cGVvZiBhfHxhIGluc3RhbmNlb2YgU3RyaW5nKWZbYV09dm9pZCAwIT09Yz9jOm51bGw7ZWxzZSBpZihcXFwib2JqZWN0XFxcIj09PXR5cGVvZiBhKWZvcih2YXIgZSBpbiBhKXYuY2FsbChhLGUpJiYoZltlXT1hW2VdKTtlbHNlIHRocm93IG5ldyBUeXBlRXJyb3IoXFxcIlVSSS5hZGRRdWVyeSgpIGFjY2VwdHMgYW4gb2JqZWN0LCBzdHJpbmcgYXMgdGhlIG5hbWUgcGFyYW1ldGVyXFxcIik7dGhpcy5fcGFydHMucXVlcnk9XFxuYi5idWlsZFF1ZXJ5KGYsdGhpcy5fcGFydHMuZHVwbGljYXRlUXVlcnlQYXJhbWV0ZXJzLHRoaXMuX3BhcnRzLmVzY2FwZVF1ZXJ5U3BhY2UpO1xcXCJzdHJpbmdcXFwiIT09dHlwZW9mIGEmJihkPWMpO3RoaXMuYnVpbGQoIWQpO3JldHVybiB0aGlzfTtmLmFkZFF1ZXJ5PWZ1bmN0aW9uKGEsYyxkKXt2YXIgZj1iLnBhcnNlUXVlcnkodGhpcy5fcGFydHMucXVlcnksdGhpcy5fcGFydHMuZXNjYXBlUXVlcnlTcGFjZSk7Yi5hZGRRdWVyeShmLGEsdm9pZCAwPT09Yz9udWxsOmMpO3RoaXMuX3BhcnRzLnF1ZXJ5PWIuYnVpbGRRdWVyeShmLHRoaXMuX3BhcnRzLmR1cGxpY2F0ZVF1ZXJ5UGFyYW1ldGVycyx0aGlzLl9wYXJ0cy5lc2NhcGVRdWVyeVNwYWNlKTtcXFwic3RyaW5nXFxcIiE9PXR5cGVvZiBhJiYoZD1jKTt0aGlzLmJ1aWxkKCFkKTtyZXR1cm4gdGhpc307Zi5yZW1vdmVRdWVyeT1mdW5jdGlvbihhLGMsZCl7dmFyIGY9Yi5wYXJzZVF1ZXJ5KHRoaXMuX3BhcnRzLnF1ZXJ5LHRoaXMuX3BhcnRzLmVzY2FwZVF1ZXJ5U3BhY2UpO1xcbmIucmVtb3ZlUXVlcnkoZixhLGMpO3RoaXMuX3BhcnRzLnF1ZXJ5PWIuYnVpbGRRdWVyeShmLHRoaXMuX3BhcnRzLmR1cGxpY2F0ZVF1ZXJ5UGFyYW1ldGVycyx0aGlzLl9wYXJ0cy5lc2NhcGVRdWVyeVNwYWNlKTtcXFwic3RyaW5nXFxcIiE9PXR5cGVvZiBhJiYoZD1jKTt0aGlzLmJ1aWxkKCFkKTtyZXR1cm4gdGhpc307Zi5oYXNRdWVyeT1mdW5jdGlvbihhLGMsZCl7dmFyIGY9Yi5wYXJzZVF1ZXJ5KHRoaXMuX3BhcnRzLnF1ZXJ5LHRoaXMuX3BhcnRzLmVzY2FwZVF1ZXJ5U3BhY2UpO3JldHVybiBiLmhhc1F1ZXJ5KGYsYSxjLGQpfTtmLnNldFNlYXJjaD1mLnNldFF1ZXJ5O2YuYWRkU2VhcmNoPWYuYWRkUXVlcnk7Zi5yZW1vdmVTZWFyY2g9Zi5yZW1vdmVRdWVyeTtmLmhhc1NlYXJjaD1mLmhhc1F1ZXJ5O2Yubm9ybWFsaXplPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3BhcnRzLnVybj90aGlzLm5vcm1hbGl6ZVByb3RvY29sKCExKS5ub3JtYWxpemVQYXRoKCExKS5ub3JtYWxpemVRdWVyeSghMSkubm9ybWFsaXplRnJhZ21lbnQoITEpLmJ1aWxkKCk6XFxudGhpcy5ub3JtYWxpemVQcm90b2NvbCghMSkubm9ybWFsaXplSG9zdG5hbWUoITEpLm5vcm1hbGl6ZVBvcnQoITEpLm5vcm1hbGl6ZVBhdGgoITEpLm5vcm1hbGl6ZVF1ZXJ5KCExKS5ub3JtYWxpemVGcmFnbWVudCghMSkuYnVpbGQoKX07Zi5ub3JtYWxpemVQcm90b2NvbD1mdW5jdGlvbihhKXtcXFwic3RyaW5nXFxcIj09PXR5cGVvZiB0aGlzLl9wYXJ0cy5wcm90b2NvbCYmKHRoaXMuX3BhcnRzLnByb3RvY29sPXRoaXMuX3BhcnRzLnByb3RvY29sLnRvTG93ZXJDYXNlKCksdGhpcy5idWlsZCghYSkpO3JldHVybiB0aGlzfTtmLm5vcm1hbGl6ZUhvc3RuYW1lPWZ1bmN0aW9uKGEpe3RoaXMuX3BhcnRzLmhvc3RuYW1lJiYodGhpcy5pcyhcXFwiSUROXFxcIikmJmU/dGhpcy5fcGFydHMuaG9zdG5hbWU9ZS50b0FTQ0lJKHRoaXMuX3BhcnRzLmhvc3RuYW1lKTp0aGlzLmlzKFxcXCJJUHY2XFxcIikmJm4mJih0aGlzLl9wYXJ0cy5ob3N0bmFtZT1uLmJlc3QodGhpcy5fcGFydHMuaG9zdG5hbWUpKSx0aGlzLl9wYXJ0cy5ob3N0bmFtZT1cXG50aGlzLl9wYXJ0cy5ob3N0bmFtZS50b0xvd2VyQ2FzZSgpLHRoaXMuYnVpbGQoIWEpKTtyZXR1cm4gdGhpc307Zi5ub3JtYWxpemVQb3J0PWZ1bmN0aW9uKGEpe1xcXCJzdHJpbmdcXFwiPT09dHlwZW9mIHRoaXMuX3BhcnRzLnByb3RvY29sJiZ0aGlzLl9wYXJ0cy5wb3J0PT09Yi5kZWZhdWx0UG9ydHNbdGhpcy5fcGFydHMucHJvdG9jb2xdJiYodGhpcy5fcGFydHMucG9ydD1udWxsLHRoaXMuYnVpbGQoIWEpKTtyZXR1cm4gdGhpc307Zi5ub3JtYWxpemVQYXRoPWZ1bmN0aW9uKGEpe3ZhciBjPXRoaXMuX3BhcnRzLnBhdGg7aWYoIWMpcmV0dXJuIHRoaXM7aWYodGhpcy5fcGFydHMudXJuKXJldHVybiB0aGlzLl9wYXJ0cy5wYXRoPWIucmVjb2RlVXJuUGF0aCh0aGlzLl9wYXJ0cy5wYXRoKSx0aGlzLmJ1aWxkKCFhKSx0aGlzO2lmKFxcXCIvXFxcIj09PXRoaXMuX3BhcnRzLnBhdGgpcmV0dXJuIHRoaXM7dmFyIGQsZj1cXFwiXFxcIixlLGs7XFxcIi9cXFwiIT09Yy5jaGFyQXQoMCkmJihkPSEwLGM9XFxcIi9cXFwiK2MpO2lmKFxcXCIvLi5cXFwiPT09XFxuYy5zbGljZSgtMyl8fFxcXCIvLlxcXCI9PT1jLnNsaWNlKC0yKSljKz1cXFwiL1xcXCI7Yz1jLnJlcGxhY2UoLyhcXFxcLyhcXFxcLlxcXFwvKSspfChcXFxcL1xcXFwuJCkvZyxcXFwiL1xcXCIpLnJlcGxhY2UoL1xcXFwvezIsfS9nLFxcXCIvXFxcIik7ZCYmKGY9Yy5zdWJzdHJpbmcoMSkubWF0Y2goL14oXFxcXC5cXFxcLlxcXFwvKSsvKXx8XFxcIlxcXCIpJiYoZj1mWzBdKTtmb3IoOzspe2U9Yy5pbmRleE9mKFxcXCIvLi5cXFwiKTtpZigtMT09PWUpYnJlYWs7ZWxzZSBpZigwPT09ZSl7Yz1jLnN1YnN0cmluZygzKTtjb250aW51ZX1rPWMuc3Vic3RyaW5nKDAsZSkubGFzdEluZGV4T2YoXFxcIi9cXFwiKTstMT09PWsmJihrPWUpO2M9Yy5zdWJzdHJpbmcoMCxrKStjLnN1YnN0cmluZyhlKzMpfWQmJnRoaXMuaXMoXFxcInJlbGF0aXZlXFxcIikmJihjPWYrYy5zdWJzdHJpbmcoMSkpO2M9Yi5yZWNvZGVQYXRoKGMpO3RoaXMuX3BhcnRzLnBhdGg9Yzt0aGlzLmJ1aWxkKCFhKTtyZXR1cm4gdGhpc307Zi5ub3JtYWxpemVQYXRobmFtZT1mLm5vcm1hbGl6ZVBhdGg7Zi5ub3JtYWxpemVRdWVyeT1mdW5jdGlvbihhKXtcXFwic3RyaW5nXFxcIj09PVxcbnR5cGVvZiB0aGlzLl9wYXJ0cy5xdWVyeSYmKHRoaXMuX3BhcnRzLnF1ZXJ5Lmxlbmd0aD90aGlzLnF1ZXJ5KGIucGFyc2VRdWVyeSh0aGlzLl9wYXJ0cy5xdWVyeSx0aGlzLl9wYXJ0cy5lc2NhcGVRdWVyeVNwYWNlKSk6dGhpcy5fcGFydHMucXVlcnk9bnVsbCx0aGlzLmJ1aWxkKCFhKSk7cmV0dXJuIHRoaXN9O2Yubm9ybWFsaXplRnJhZ21lbnQ9ZnVuY3Rpb24oYSl7dGhpcy5fcGFydHMuZnJhZ21lbnR8fCh0aGlzLl9wYXJ0cy5mcmFnbWVudD1udWxsLHRoaXMuYnVpbGQoIWEpKTtyZXR1cm4gdGhpc307Zi5ub3JtYWxpemVTZWFyY2g9Zi5ub3JtYWxpemVRdWVyeTtmLm5vcm1hbGl6ZUhhc2g9Zi5ub3JtYWxpemVGcmFnbWVudDtmLmlzbzg4NTk9ZnVuY3Rpb24oKXt2YXIgYT1iLmVuY29kZSxjPWIuZGVjb2RlO2IuZW5jb2RlPWVzY2FwZTtiLmRlY29kZT1kZWNvZGVVUklDb21wb25lbnQ7dHJ5e3RoaXMubm9ybWFsaXplKCl9ZmluYWxseXtiLmVuY29kZT1hLGIuZGVjb2RlPWN9cmV0dXJuIHRoaXN9O1xcbmYudW5pY29kZT1mdW5jdGlvbigpe3ZhciBhPWIuZW5jb2RlLGM9Yi5kZWNvZGU7Yi5lbmNvZGU9QjtiLmRlY29kZT11bmVzY2FwZTt0cnl7dGhpcy5ub3JtYWxpemUoKX1maW5hbGx5e2IuZW5jb2RlPWEsYi5kZWNvZGU9Y31yZXR1cm4gdGhpc307Zi5yZWFkYWJsZT1mdW5jdGlvbigpe3ZhciBhPXRoaXMuY2xvbmUoKTthLnVzZXJuYW1lKFxcXCJcXFwiKS5wYXNzd29yZChcXFwiXFxcIikubm9ybWFsaXplKCk7dmFyIGM9XFxcIlxcXCI7YS5fcGFydHMucHJvdG9jb2wmJihjKz1hLl9wYXJ0cy5wcm90b2NvbCtcXFwiOi8vXFxcIik7YS5fcGFydHMuaG9zdG5hbWUmJihhLmlzKFxcXCJwdW55Y29kZVxcXCIpJiZlPyhjKz1lLnRvVW5pY29kZShhLl9wYXJ0cy5ob3N0bmFtZSksYS5fcGFydHMucG9ydCYmKGMrPVxcXCI6XFxcIithLl9wYXJ0cy5wb3J0KSk6Yys9YS5ob3N0KCkpO2EuX3BhcnRzLmhvc3RuYW1lJiZhLl9wYXJ0cy5wYXRoJiZcXFwiL1xcXCIhPT1hLl9wYXJ0cy5wYXRoLmNoYXJBdCgwKSYmKGMrPVxcXCIvXFxcIik7Yys9YS5wYXRoKCEwKTtpZihhLl9wYXJ0cy5xdWVyeSl7Zm9yKHZhciBkPVxcblxcXCJcXFwiLGY9MCxrPWEuX3BhcnRzLnF1ZXJ5LnNwbGl0KFxcXCImXFxcIiksZz1rLmxlbmd0aDtmPGc7ZisrKXt2YXIgdT0oa1tmXXx8XFxcIlxcXCIpLnNwbGl0KFxcXCI9XFxcIiksZD1kKyhcXFwiJlxcXCIrYi5kZWNvZGVRdWVyeSh1WzBdLHRoaXMuX3BhcnRzLmVzY2FwZVF1ZXJ5U3BhY2UpLnJlcGxhY2UoLyYvZyxcXFwiJTI2XFxcIikpO3ZvaWQgMCE9PXVbMV0mJihkKz1cXFwiPVxcXCIrYi5kZWNvZGVRdWVyeSh1WzFdLHRoaXMuX3BhcnRzLmVzY2FwZVF1ZXJ5U3BhY2UpLnJlcGxhY2UoLyYvZyxcXFwiJTI2XFxcIikpfWMrPVxcXCI/XFxcIitkLnN1YnN0cmluZygxKX1yZXR1cm4gYys9Yi5kZWNvZGVRdWVyeShhLmhhc2goKSwhMCl9O2YuYWJzb2x1dGVUbz1mdW5jdGlvbihhKXt2YXIgYz10aGlzLmNsb25lKCksZD1bXFxcInByb3RvY29sXFxcIixcXFwidXNlcm5hbWVcXFwiLFxcXCJwYXNzd29yZFxcXCIsXFxcImhvc3RuYW1lXFxcIixcXFwicG9ydFxcXCJdLGYsZTtpZih0aGlzLl9wYXJ0cy51cm4pdGhyb3cgRXJyb3IoXFxcIlVSTnMgZG8gbm90IGhhdmUgYW55IGdlbmVyYWxseSBkZWZpbmVkIGhpZXJhcmNoaWNhbCBjb21wb25lbnRzXFxcIik7XFxuYSBpbnN0YW5jZW9mIGJ8fChhPW5ldyBiKGEpKTtjLl9wYXJ0cy5wcm90b2NvbHx8KGMuX3BhcnRzLnByb3RvY29sPWEuX3BhcnRzLnByb3RvY29sKTtpZih0aGlzLl9wYXJ0cy5ob3N0bmFtZSlyZXR1cm4gYztmb3IoZj0wO2U9ZFtmXTtmKyspYy5fcGFydHNbZV09YS5fcGFydHNbZV07Yy5fcGFydHMucGF0aD9cXFwiLi5cXFwiPT09Yy5fcGFydHMucGF0aC5zdWJzdHJpbmcoLTIpJiYoYy5fcGFydHMucGF0aCs9XFxcIi9cXFwiKTooYy5fcGFydHMucGF0aD1hLl9wYXJ0cy5wYXRoLGMuX3BhcnRzLnF1ZXJ5fHwoYy5fcGFydHMucXVlcnk9YS5fcGFydHMucXVlcnkpKTtcXFwiL1xcXCIhPT1jLnBhdGgoKS5jaGFyQXQoMCkmJihkPShkPWEuZGlyZWN0b3J5KCkpP2Q6MD09PWEucGF0aCgpLmluZGV4T2YoXFxcIi9cXFwiKT9cXFwiL1xcXCI6XFxcIlxcXCIsYy5fcGFydHMucGF0aD0oZD9kK1xcXCIvXFxcIjpcXFwiXFxcIikrYy5fcGFydHMucGF0aCxjLm5vcm1hbGl6ZVBhdGgoKSk7Yy5idWlsZCgpO3JldHVybiBjfTtmLnJlbGF0aXZlVG89ZnVuY3Rpb24oYSl7dmFyIGM9XFxudGhpcy5jbG9uZSgpLm5vcm1hbGl6ZSgpLGQsZixlO2lmKGMuX3BhcnRzLnVybil0aHJvdyBFcnJvcihcXFwiVVJOcyBkbyBub3QgaGF2ZSBhbnkgZ2VuZXJhbGx5IGRlZmluZWQgaGllcmFyY2hpY2FsIGNvbXBvbmVudHNcXFwiKTthPShuZXcgYihhKSkubm9ybWFsaXplKCk7ZD1jLl9wYXJ0cztmPWEuX3BhcnRzO2U9Yy5wYXRoKCk7YT1hLnBhdGgoKTtpZihcXFwiL1xcXCIhPT1lLmNoYXJBdCgwKSl0aHJvdyBFcnJvcihcXFwiVVJJIGlzIGFscmVhZHkgcmVsYXRpdmVcXFwiKTtpZihcXFwiL1xcXCIhPT1hLmNoYXJBdCgwKSl0aHJvdyBFcnJvcihcXFwiQ2Fubm90IGNhbGN1bGF0ZSBhIFVSSSByZWxhdGl2ZSB0byBhbm90aGVyIHJlbGF0aXZlIFVSSVxcXCIpO2QucHJvdG9jb2w9PT1mLnByb3RvY29sJiYoZC5wcm90b2NvbD1udWxsKTtpZihkLnVzZXJuYW1lPT09Zi51c2VybmFtZSYmZC5wYXNzd29yZD09PWYucGFzc3dvcmQmJm51bGw9PT1kLnByb3RvY29sJiZudWxsPT09ZC51c2VybmFtZSYmbnVsbD09PWQucGFzc3dvcmQmJmQuaG9zdG5hbWU9PT1cXG5mLmhvc3RuYW1lJiZkLnBvcnQ9PT1mLnBvcnQpZC5ob3N0bmFtZT1udWxsLGQucG9ydD1udWxsO2Vsc2UgcmV0dXJuIGMuYnVpbGQoKTtpZihlPT09YSlyZXR1cm4gZC5wYXRoPVxcXCJcXFwiLGMuYnVpbGQoKTtlPWIuY29tbW9uUGF0aChlLGEpO2lmKCFlKXJldHVybiBjLmJ1aWxkKCk7Zj1mLnBhdGguc3Vic3RyaW5nKGUubGVuZ3RoKS5yZXBsYWNlKC9bXlxcXFwvXSokLyxcXFwiXFxcIikucmVwbGFjZSgvLio/XFxcXC8vZyxcXFwiLi4vXFxcIik7ZC5wYXRoPWYrZC5wYXRoLnN1YnN0cmluZyhlLmxlbmd0aCl8fFxcXCIuL1xcXCI7cmV0dXJuIGMuYnVpbGQoKX07Zi5lcXVhbHM9ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy5jbG9uZSgpO2E9bmV3IGIoYSk7dmFyIGQ9e30sZj17fSxlPXt9LGs7Yy5ub3JtYWxpemUoKTthLm5vcm1hbGl6ZSgpO2lmKGMudG9TdHJpbmcoKT09PWEudG9TdHJpbmcoKSlyZXR1cm4hMDtkPWMucXVlcnkoKTtmPWEucXVlcnkoKTtjLnF1ZXJ5KFxcXCJcXFwiKTthLnF1ZXJ5KFxcXCJcXFwiKTtpZihjLnRvU3RyaW5nKCkhPT1hLnRvU3RyaW5nKCl8fFxcbmQubGVuZ3RoIT09Zi5sZW5ndGgpcmV0dXJuITE7ZD1iLnBhcnNlUXVlcnkoZCx0aGlzLl9wYXJ0cy5lc2NhcGVRdWVyeVNwYWNlKTtmPWIucGFyc2VRdWVyeShmLHRoaXMuX3BhcnRzLmVzY2FwZVF1ZXJ5U3BhY2UpO2ZvcihrIGluIGQpaWYodi5jYWxsKGQsaykpe2lmKCF3KGRba10pKXtpZihkW2tdIT09ZltrXSlyZXR1cm4hMX1lbHNlIGlmKCFEKGRba10sZltrXSkpcmV0dXJuITE7ZVtrXT0hMH1mb3IoayBpbiBmKWlmKHYuY2FsbChmLGspJiYhZVtrXSlyZXR1cm4hMTtyZXR1cm4hMH07Zi5kdXBsaWNhdGVRdWVyeVBhcmFtZXRlcnM9ZnVuY3Rpb24oYSl7dGhpcy5fcGFydHMuZHVwbGljYXRlUXVlcnlQYXJhbWV0ZXJzPSEhYTtyZXR1cm4gdGhpc307Zi5lc2NhcGVRdWVyeVNwYWNlPWZ1bmN0aW9uKGEpe3RoaXMuX3BhcnRzLmVzY2FwZVF1ZXJ5U3BhY2U9ISFhO3JldHVybiB0aGlzfTtyZXR1cm4gYn0pO1xcbihmdW5jdGlvbihlLG4pe1xcXCJvYmplY3RcXFwiPT09dHlwZW9mIGV4cG9ydHM/bW9kdWxlLmV4cG9ydHM9bihyZXF1aXJlKFxcXCIuL1VSSVxcXCIpKTpcXFwiZnVuY3Rpb25cXFwiPT09dHlwZW9mIGRlZmluZSYmZGVmaW5lLmFtZD9kZWZpbmUoW1xcXCIuL1VSSVxcXCJdLG4pOmUuVVJJVGVtcGxhdGU9bihlLlVSSSxlKX0pKHRoaXMsZnVuY3Rpb24oZSxuKXtmdW5jdGlvbiBnKGIpe2lmKGcuX2NhY2hlW2JdKXJldHVybiBnLl9jYWNoZVtiXTtpZighKHRoaXMgaW5zdGFuY2VvZiBnKSlyZXR1cm4gbmV3IGcoYik7dGhpcy5leHByZXNzaW9uPWI7Zy5fY2FjaGVbYl09dGhpcztyZXR1cm4gdGhpc31mdW5jdGlvbiBsKGIpe3RoaXMuZGF0YT1iO3RoaXMuY2FjaGU9e319dmFyIGI9biYmbi5VUklUZW1wbGF0ZSxoPU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHksQT1nLnByb3RvdHlwZSx3PXtcXFwiXFxcIjp7cHJlZml4OlxcXCJcXFwiLHNlcGFyYXRvcjpcXFwiLFxcXCIsbmFtZWQ6ITEsZW1wdHlfbmFtZV9zZXBhcmF0b3I6ITEsZW5jb2RlOlxcXCJlbmNvZGVcXFwifSxcXG5cXFwiK1xcXCI6e3ByZWZpeDpcXFwiXFxcIixzZXBhcmF0b3I6XFxcIixcXFwiLG5hbWVkOiExLGVtcHR5X25hbWVfc2VwYXJhdG9yOiExLGVuY29kZTpcXFwiZW5jb2RlUmVzZXJ2ZWRcXFwifSxcXFwiI1xcXCI6e3ByZWZpeDpcXFwiI1xcXCIsc2VwYXJhdG9yOlxcXCIsXFxcIixuYW1lZDohMSxlbXB0eV9uYW1lX3NlcGFyYXRvcjohMSxlbmNvZGU6XFxcImVuY29kZVJlc2VydmVkXFxcIn0sXFxcIi5cXFwiOntwcmVmaXg6XFxcIi5cXFwiLHNlcGFyYXRvcjpcXFwiLlxcXCIsbmFtZWQ6ITEsZW1wdHlfbmFtZV9zZXBhcmF0b3I6ITEsZW5jb2RlOlxcXCJlbmNvZGVcXFwifSxcXFwiL1xcXCI6e3ByZWZpeDpcXFwiL1xcXCIsc2VwYXJhdG9yOlxcXCIvXFxcIixuYW1lZDohMSxlbXB0eV9uYW1lX3NlcGFyYXRvcjohMSxlbmNvZGU6XFxcImVuY29kZVxcXCJ9LFxcXCI7XFxcIjp7cHJlZml4OlxcXCI7XFxcIixzZXBhcmF0b3I6XFxcIjtcXFwiLG5hbWVkOiEwLGVtcHR5X25hbWVfc2VwYXJhdG9yOiExLGVuY29kZTpcXFwiZW5jb2RlXFxcIn0sXFxcIj9cXFwiOntwcmVmaXg6XFxcIj9cXFwiLHNlcGFyYXRvcjpcXFwiJlxcXCIsbmFtZWQ6ITAsZW1wdHlfbmFtZV9zZXBhcmF0b3I6ITAsZW5jb2RlOlxcXCJlbmNvZGVcXFwifSxcXFwiJlxcXCI6e3ByZWZpeDpcXFwiJlxcXCIsXFxuc2VwYXJhdG9yOlxcXCImXFxcIixuYW1lZDohMCxlbXB0eV9uYW1lX3NlcGFyYXRvcjohMCxlbmNvZGU6XFxcImVuY29kZVxcXCJ9fTtnLl9jYWNoZT17fTtnLkVYUFJFU1NJT05fUEFUVEVSTj0vXFxcXHsoW15hLXpBLVowLTklX10/KShbXlxcXFx9XSspKFxcXFx9fCQpL2c7Zy5WQVJJQUJMRV9QQVRURVJOPS9eKFteKjpdKykoKFxcXFwqKXw6KFxcXFxkKykpPyQvO2cuVkFSSUFCTEVfTkFNRV9QQVRURVJOPS9bXmEtekEtWjAtOSVfXS87Zy5leHBhbmQ9ZnVuY3Rpb24oYixlKXt2YXIgaD13W2Iub3BlcmF0b3JdLGw9aC5uYW1lZD9cXFwiTmFtZWRcXFwiOlxcXCJVbm5hbWVkXFxcIixuPWIudmFyaWFibGVzLHQ9W10scixwLGY7Zm9yKGY9MDtwPW5bZl07ZisrKXI9ZS5nZXQocC5uYW1lKSxyLnZhbC5sZW5ndGg/dC5wdXNoKGdbXFxcImV4cGFuZFxcXCIrbF0ocixoLHAuZXhwbG9kZSxwLmV4cGxvZGUmJmguc2VwYXJhdG9yfHxcXFwiLFxcXCIscC5tYXhsZW5ndGgscC5uYW1lKSk6ci50eXBlJiZ0LnB1c2goXFxcIlxcXCIpO3JldHVybiB0Lmxlbmd0aD9oLnByZWZpeCt0LmpvaW4oaC5zZXBhcmF0b3IpOlxcblxcXCJcXFwifTtnLmV4cGFuZE5hbWVkPWZ1bmN0aW9uKGIsZyxoLGwsbix0KXt2YXIgcj1cXFwiXFxcIixwPWcuZW5jb2RlO2c9Zy5lbXB0eV9uYW1lX3NlcGFyYXRvcjt2YXIgZj0hYltwXS5sZW5ndGgsdj0yPT09Yi50eXBlP1xcXCJcXFwiOmVbcF0odCkscSx4LHc7eD0wO2Zvcih3PWIudmFsLmxlbmd0aDt4PHc7eCsrKW4/KHE9ZVtwXShiLnZhbFt4XVsxXS5zdWJzdHJpbmcoMCxuKSksMj09PWIudHlwZSYmKHY9ZVtwXShiLnZhbFt4XVswXS5zdWJzdHJpbmcoMCxuKSkpKTpmPyhxPWVbcF0oYi52YWxbeF1bMV0pLDI9PT1iLnR5cGU/KHY9ZVtwXShiLnZhbFt4XVswXSksYltwXS5wdXNoKFt2LHFdKSk6YltwXS5wdXNoKFt2b2lkIDAscV0pKToocT1iW3BdW3hdWzFdLDI9PT1iLnR5cGUmJih2PWJbcF1beF1bMF0pKSxyJiYocis9bCksaD9yKz12KyhnfHxxP1xcXCI9XFxcIjpcXFwiXFxcIikrcTooeHx8KHIrPWVbcF0odCkrKGd8fHE/XFxcIj1cXFwiOlxcXCJcXFwiKSksMj09PWIudHlwZSYmKHIrPXYrXFxcIixcXFwiKSxyKz1xKTtyZXR1cm4gcn07Zy5leHBhbmRVbm5hbWVkPVxcbmZ1bmN0aW9uKGIsZyxoLGwsbil7dmFyIHQ9XFxcIlxcXCIscj1nLmVuY29kZTtnPWcuZW1wdHlfbmFtZV9zZXBhcmF0b3I7dmFyIHA9IWJbcl0ubGVuZ3RoLGYsdixxLHc7cT0wO2Zvcih3PWIudmFsLmxlbmd0aDtxPHc7cSsrKW4/dj1lW3JdKGIudmFsW3FdWzFdLnN1YnN0cmluZygwLG4pKTpwPyh2PWVbcl0oYi52YWxbcV1bMV0pLGJbcl0ucHVzaChbMj09PWIudHlwZT9lW3JdKGIudmFsW3FdWzBdKTp2b2lkIDAsdl0pKTp2PWJbcl1bcV1bMV0sdCYmKHQrPWwpLDI9PT1iLnR5cGUmJihmPW4/ZVtyXShiLnZhbFtxXVswXS5zdWJzdHJpbmcoMCxuKSk6YltyXVtxXVswXSx0Kz1mLHQ9aD90KyhnfHx2P1xcXCI9XFxcIjpcXFwiXFxcIik6dCtcXFwiLFxcXCIpLHQrPXY7cmV0dXJuIHR9O2cubm9Db25mbGljdD1mdW5jdGlvbigpe24uVVJJVGVtcGxhdGU9PT1nJiYobi5VUklUZW1wbGF0ZT1iKTtyZXR1cm4gZ307QS5leHBhbmQ9ZnVuY3Rpb24oYil7dmFyIGU9XFxcIlxcXCI7dGhpcy5wYXJ0cyYmdGhpcy5wYXJ0cy5sZW5ndGh8fHRoaXMucGFyc2UoKTtcXG5iIGluc3RhbmNlb2YgbHx8KGI9bmV3IGwoYikpO2Zvcih2YXIgaD0wLG49dGhpcy5wYXJ0cy5sZW5ndGg7aDxuO2grKyllKz1cXFwic3RyaW5nXFxcIj09PXR5cGVvZiB0aGlzLnBhcnRzW2hdP3RoaXMucGFydHNbaF06Zy5leHBhbmQodGhpcy5wYXJ0c1toXSxiKTtyZXR1cm4gZX07QS5wYXJzZT1mdW5jdGlvbigpe3ZhciBiPXRoaXMuZXhwcmVzc2lvbixlPWcuRVhQUkVTU0lPTl9QQVRURVJOLGg9Zy5WQVJJQUJMRV9QQVRURVJOLG49Zy5WQVJJQUJMRV9OQU1FX1BBVFRFUk4sbD1bXSx0PTAscixwLGY7Zm9yKGUubGFzdEluZGV4PTA7Oyl7cD1lLmV4ZWMoYik7aWYobnVsbD09PXApe2wucHVzaChiLnN1YnN0cmluZyh0KSk7YnJlYWt9ZWxzZSBsLnB1c2goYi5zdWJzdHJpbmcodCxwLmluZGV4KSksdD1wLmluZGV4K3BbMF0ubGVuZ3RoO2lmKCF3W3BbMV1dKXRocm93IEVycm9yKCdVbmtub3duIE9wZXJhdG9yIFxcXCInK3BbMV0rJ1xcXCIgaW4gXFxcIicrcFswXSsnXFxcIicpO2lmKCFwWzNdKXRocm93IEVycm9yKCdVbmNsb3NlZCBFeHByZXNzaW9uIFxcXCInK1xcbnBbMF0rJ1xcXCInKTtyPXBbMl0uc3BsaXQoXFxcIixcXFwiKTtmb3IodmFyIHY9MCxxPXIubGVuZ3RoO3Y8cTt2Kyspe2Y9clt2XS5tYXRjaChoKTtpZihudWxsPT09Zil0aHJvdyBFcnJvcignSW52YWxpZCBWYXJpYWJsZSBcXFwiJytyW3ZdKydcXFwiIGluIFxcXCInK3BbMF0rJ1xcXCInKTtpZihmWzFdLm1hdGNoKG4pKXRocm93IEVycm9yKCdJbnZhbGlkIFZhcmlhYmxlIE5hbWUgXFxcIicrZlsxXSsnXFxcIiBpbiBcXFwiJytwWzBdKydcXFwiJyk7clt2XT17bmFtZTpmWzFdLGV4cGxvZGU6ISFmWzNdLG1heGxlbmd0aDpmWzRdJiZwYXJzZUludChmWzRdLDEwKX19aWYoIXIubGVuZ3RoKXRocm93IEVycm9yKCdFeHByZXNzaW9uIE1pc3NpbmcgVmFyaWFibGUocykgXFxcIicrcFswXSsnXFxcIicpO2wucHVzaCh7ZXhwcmVzc2lvbjpwWzBdLG9wZXJhdG9yOnBbMV0sdmFyaWFibGVzOnJ9KX1sLmxlbmd0aHx8bC5wdXNoKGIpO3RoaXMucGFydHM9bDtyZXR1cm4gdGhpc307bC5wcm90b3R5cGUuZ2V0PWZ1bmN0aW9uKGIpe3ZhciBlPXRoaXMuZGF0YSxcXG5nPXt0eXBlOjAsdmFsOltdLGVuY29kZTpbXSxlbmNvZGVSZXNlcnZlZDpbXX0sbDtpZih2b2lkIDAhPT10aGlzLmNhY2hlW2JdKXJldHVybiB0aGlzLmNhY2hlW2JdO3RoaXMuY2FjaGVbYl09ZztlPVxcXCJbb2JqZWN0IEZ1bmN0aW9uXVxcXCI9PT1TdHJpbmcoT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGUpKT9lKGIpOlxcXCJbb2JqZWN0IEZ1bmN0aW9uXVxcXCI9PT1TdHJpbmcoT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGVbYl0pKT9lW2JdKGIpOmVbYl07aWYodm9pZCAwIT09ZSYmbnVsbCE9PWUpaWYoXFxcIltvYmplY3QgQXJyYXldXFxcIj09PVN0cmluZyhPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoZSkpKXtsPTA7Zm9yKGI9ZS5sZW5ndGg7bDxiO2wrKyl2b2lkIDAhPT1lW2xdJiZudWxsIT09ZVtsXSYmZy52YWwucHVzaChbdm9pZCAwLFN0cmluZyhlW2xdKV0pO2cudmFsLmxlbmd0aCYmKGcudHlwZT0zKX1lbHNlIGlmKFxcXCJbb2JqZWN0IE9iamVjdF1cXFwiPT09U3RyaW5nKE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChlKSkpe2ZvcihsIGluIGUpaC5jYWxsKGUsXFxubCkmJnZvaWQgMCE9PWVbbF0mJm51bGwhPT1lW2xdJiZnLnZhbC5wdXNoKFtsLFN0cmluZyhlW2xdKV0pO2cudmFsLmxlbmd0aCYmKGcudHlwZT0yKX1lbHNlIGcudHlwZT0xLGcudmFsLnB1c2goW3ZvaWQgMCxTdHJpbmcoZSldKTtyZXR1cm4gZ307ZS5leHBhbmQ9ZnVuY3Rpb24oYixoKXt2YXIgbD0obmV3IGcoYikpLmV4cGFuZChoKTtyZXR1cm4gbmV3IGUobCl9O3JldHVybiBnfSk7XFxuXCJcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9yYXctbG9hZGVyIS4vYm93ZXJfY29tcG9uZW50cy91cmkuanMvc3JjL1VSSS5taW4uanNcbiAqKiBtb2R1bGUgaWQgPSAyM1xuICoqIG1vZHVsZSBjaHVua3MgPSAyNFxuICoqLyJdLCJtYXBwaW5ncyI6IkFBQUEiLCJzb3VyY2VSb290IjoiIn0=");

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

	eval("__webpack_require__(16)(__webpack_require__(25))\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjQuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ib3dlcl9jb21wb25lbnRzL2Nsb3VkaW5hcnlfanMvanMvanF1ZXJ5LmlmcmFtZS10cmFuc3BvcnQuanM/YTI3MiJdLCJzb3VyY2VzQ29udGVudCI6WyJyZXF1aXJlKFwiISEvaG9tZS9kZXBsb3llci9kZXBsb3ltZW50L2pzL25vZGVfbW9kdWxlcy9zY3JpcHQtbG9hZGVyL2FkZFNjcmlwdC5qc1wiKShyZXF1aXJlKFwiISEvaG9tZS9kZXBsb3llci9kZXBsb3ltZW50L2pzL25vZGVfbW9kdWxlcy9yYXctbG9hZGVyL2luZGV4LmpzIS9ob21lL2RlcGxveWVyL2RlcGxveW1lbnQvanMvYm93ZXJfY29tcG9uZW50cy9jbG91ZGluYXJ5X2pzL2pzL2pxdWVyeS5pZnJhbWUtdHJhbnNwb3J0LmpzXCIpKVxuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L3NjcmlwdC1sb2FkZXIhLi9ib3dlcl9jb21wb25lbnRzL2Nsb3VkaW5hcnlfanMvanMvanF1ZXJ5LmlmcmFtZS10cmFuc3BvcnQuanNcbiAqKiBtb2R1bGUgaWQgPSAyNFxuICoqIG1vZHVsZSBjaHVua3MgPSAyNFxuICoqLyJdLCJtYXBwaW5ncyI6IkFBQUEiLCJzb3VyY2VSb290IjoiIn0=");

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

	eval("module.exports = \"/*\\n * jQuery Iframe Transport Plugin 1.7\\n * https://github.com/blueimp/jQuery-File-Upload\\n *\\n * Copyright 2011, Sebastian Tschan\\n * https://blueimp.net\\n *\\n * Licensed under the MIT license:\\n * http://www.opensource.org/licenses/MIT\\n */\\n\\n/*jslint unparam: true, nomen: true */\\n/*global define, window, document */\\n\\n(function (factory) {\\n    'use strict';\\n    if (typeof define === 'function' && define.amd) {\\n        // Register as an anonymous AMD module:\\n        define(['jquery'], factory);\\n    } else {\\n        // Browser globals:\\n        factory(window.jQuery);\\n    }\\n}(function ($) {\\n    'use strict';\\n\\n    // Helper variable to create unique names for the transport iframes:\\n    var counter = 0;\\n\\n    // The iframe transport accepts three additional options:\\n    // options.fileInput: a jQuery collection of file input fields\\n    // options.paramName: the parameter name for the file form data,\\n    //  overrides the name property of the file input field(s),\\n    //  can be a string or an array of strings.\\n    // options.formData: an array of objects with name and value properties,\\n    //  equivalent to the return data of .serializeArray(), e.g.:\\n    //  [{name: 'a', value: 1}, {name: 'b', value: 2}]\\n    $.ajaxTransport('iframe', function (options) {\\n        if (options.async) {\\n            var form,\\n                iframe,\\n                addParamChar;\\n            return {\\n                send: function (_, completeCallback) {\\n                    form = $('<form style=\\\"display:none;\\\"></form>');\\n                    form.attr('accept-charset', options.formAcceptCharset);\\n                    addParamChar = /\\\\?/.test(options.url) ? '&' : '?';\\n                    // XDomainRequest only supports GET and POST:\\n                    if (options.type === 'DELETE') {\\n                        options.url = options.url + addParamChar + '_method=DELETE';\\n                        options.type = 'POST';\\n                    } else if (options.type === 'PUT') {\\n                        options.url = options.url + addParamChar + '_method=PUT';\\n                        options.type = 'POST';\\n                    } else if (options.type === 'PATCH') {\\n                        options.url = options.url + addParamChar + '_method=PATCH';\\n                        options.type = 'POST';\\n                    }\\n                    // javascript:false as initial iframe src\\n                    // prevents warning popups on HTTPS in IE6.\\n                    // IE versions below IE8 cannot set the name property of\\n                    // elements that have already been added to the DOM,\\n                    // so we set the name along with the iframe HTML markup:\\n                    counter += 1;\\n                    iframe = $(\\n                        '<iframe src=\\\"javascript:false;\\\" name=\\\"iframe-transport-' +\\n                            counter + '\\\"></iframe>'\\n                    ).bind('load', function () {\\n                        var fileInputClones,\\n                            paramNames = $.isArray(options.paramName) ?\\n                                    options.paramName : [options.paramName];\\n                        iframe\\n                            .unbind('load')\\n                            .bind('load', function () {\\n                                var response;\\n                                // Wrap in a try/catch block to catch exceptions thrown\\n                                // when trying to access cross-domain iframe contents:\\n                                try {\\n                                    response = iframe.contents();\\n                                    // Google Chrome and Firefox do not throw an\\n                                    // exception when calling iframe.contents() on\\n                                    // cross-domain requests, so we unify the response:\\n                                    if (!response.length || !response[0].firstChild) {\\n                                        throw new Error();\\n                                    }\\n                                } catch (e) {\\n                                    response = undefined;\\n                                }\\n                                // The complete callback returns the\\n                                // iframe content document as response object:\\n                                completeCallback(\\n                                    200,\\n                                    'success',\\n                                    {'iframe': response}\\n                                );\\n                                // Fix for IE endless progress bar activity bug\\n                                // (happens on form submits to iframe targets):\\n                                $('<iframe src=\\\"javascript:false;\\\"></iframe>')\\n                                    .appendTo(form);\\n                                window.setTimeout(function () {\\n                                    // Removing the form in a setTimeout call\\n                                    // allows Chrome's developer tools to display\\n                                    // the response result\\n                                    form.remove();\\n                                }, 0);\\n                            });\\n                        form\\n                            .prop('target', iframe.prop('name'))\\n                            .prop('action', options.url)\\n                            .prop('method', options.type);\\n                        if (options.formData) {\\n                            $.each(options.formData, function (index, field) {\\n                                $('<input type=\\\"hidden\\\"/>')\\n                                    .prop('name', field.name)\\n                                    .val(field.value)\\n                                    .appendTo(form);\\n                            });\\n                        }\\n                        if (options.fileInput && options.fileInput.length &&\\n                                options.type === 'POST') {\\n                            fileInputClones = options.fileInput.clone();\\n                            // Insert a clone for each file input field:\\n                            options.fileInput.after(function (index) {\\n                                return fileInputClones[index];\\n                            });\\n                            if (options.paramName) {\\n                                options.fileInput.each(function (index) {\\n                                    $(this).prop(\\n                                        'name',\\n                                        paramNames[index] || options.paramName\\n                                    );\\n                                });\\n                            }\\n                            // Appending the file input fields to the hidden form\\n                            // removes them from their original location:\\n                            form\\n                                .append(options.fileInput)\\n                                .prop('enctype', 'multipart/form-data')\\n                                // enctype must be set as encoding for IE:\\n                                .prop('encoding', 'multipart/form-data');\\n                        }\\n                        form.submit();\\n                        // Insert the file input fields at their original location\\n                        // by replacing the clones with the originals:\\n                        if (fileInputClones && fileInputClones.length) {\\n                            options.fileInput.each(function (index, input) {\\n                                var clone = $(fileInputClones[index]);\\n                                $(input).prop('name', clone.prop('name'));\\n                                clone.replaceWith(input);\\n                            });\\n                        }\\n                    });\\n                    form.append(iframe).appendTo(document.body);\\n                },\\n                abort: function () {\\n                    if (iframe) {\\n                        // javascript:false as iframe src aborts the request\\n                        // and prevents warning popups on HTTPS in IE6.\\n                        // concat is used to avoid the \\\"Script URL\\\" JSLint error:\\n                        iframe\\n                            .unbind('load')\\n                            .prop('src', 'javascript'.concat(':false;'));\\n                    }\\n                    if (form) {\\n                        form.remove();\\n                    }\\n                }\\n            };\\n        }\\n    });\\n\\n    // The iframe transport returns the iframe content document as response.\\n    // The following adds converters from iframe to text, json, html, xml\\n    // and script.\\n    // Please note that the Content-Type for JSON responses has to be text/plain\\n    // or text/html, if the browser doesn't include application/json in the\\n    // Accept header, else IE will show a download dialog.\\n    // The Content-Type for XML responses on the other hand has to be always\\n    // application/xml or text/xml, so IE properly parses the XML response.\\n    // See also\\n    // https://github.com/blueimp/jQuery-File-Upload/wiki/Setup#content-type-negotiation\\n    $.ajaxSetup({\\n        converters: {\\n            'iframe text': function (iframe) {\\n                return iframe && $(iframe[0].body).text();\\n            },\\n            'iframe json': function (iframe) {\\n                return iframe && $.parseJSON($(iframe[0].body).text());\\n            },\\n            'iframe html': function (iframe) {\\n                return iframe && $(iframe[0].body).html();\\n            },\\n            'iframe xml': function (iframe) {\\n                var xmlDoc = iframe && iframe[0];\\n                return xmlDoc && $.isXMLDoc(xmlDoc) ? xmlDoc :\\n                        $.parseXML((xmlDoc.XMLDocument && xmlDoc.XMLDocument.xml) ||\\n                            $(xmlDoc.body).html());\\n            },\\n            'iframe script': function (iframe) {\\n                return iframe && $.globalEval($(iframe[0].body).text());\\n            }\\n        }\\n    });\\n\\n}));\\n\"\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjUuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ib3dlcl9jb21wb25lbnRzL2Nsb3VkaW5hcnlfanMvanMvanF1ZXJ5LmlmcmFtZS10cmFuc3BvcnQuanM/NDAwNiJdLCJzb3VyY2VzQ29udGVudCI6WyJtb2R1bGUuZXhwb3J0cyA9IFwiLypcXG4gKiBqUXVlcnkgSWZyYW1lIFRyYW5zcG9ydCBQbHVnaW4gMS43XFxuICogaHR0cHM6Ly9naXRodWIuY29tL2JsdWVpbXAvalF1ZXJ5LUZpbGUtVXBsb2FkXFxuICpcXG4gKiBDb3B5cmlnaHQgMjAxMSwgU2ViYXN0aWFuIFRzY2hhblxcbiAqIGh0dHBzOi8vYmx1ZWltcC5uZXRcXG4gKlxcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZTpcXG4gKiBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVFxcbiAqL1xcblxcbi8qanNsaW50IHVucGFyYW06IHRydWUsIG5vbWVuOiB0cnVlICovXFxuLypnbG9iYWwgZGVmaW5lLCB3aW5kb3csIGRvY3VtZW50ICovXFxuXFxuKGZ1bmN0aW9uIChmYWN0b3J5KSB7XFxuICAgICd1c2Ugc3RyaWN0JztcXG4gICAgaWYgKHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCkge1xcbiAgICAgICAgLy8gUmVnaXN0ZXIgYXMgYW4gYW5vbnltb3VzIEFNRCBtb2R1bGU6XFxuICAgICAgICBkZWZpbmUoWydqcXVlcnknXSwgZmFjdG9yeSk7XFxuICAgIH0gZWxzZSB7XFxuICAgICAgICAvLyBCcm93c2VyIGdsb2JhbHM6XFxuICAgICAgICBmYWN0b3J5KHdpbmRvdy5qUXVlcnkpO1xcbiAgICB9XFxufShmdW5jdGlvbiAoJCkge1xcbiAgICAndXNlIHN0cmljdCc7XFxuXFxuICAgIC8vIEhlbHBlciB2YXJpYWJsZSB0byBjcmVhdGUgdW5pcXVlIG5hbWVzIGZvciB0aGUgdHJhbnNwb3J0IGlmcmFtZXM6XFxuICAgIHZhciBjb3VudGVyID0gMDtcXG5cXG4gICAgLy8gVGhlIGlmcmFtZSB0cmFuc3BvcnQgYWNjZXB0cyB0aHJlZSBhZGRpdGlvbmFsIG9wdGlvbnM6XFxuICAgIC8vIG9wdGlvbnMuZmlsZUlucHV0OiBhIGpRdWVyeSBjb2xsZWN0aW9uIG9mIGZpbGUgaW5wdXQgZmllbGRzXFxuICAgIC8vIG9wdGlvbnMucGFyYW1OYW1lOiB0aGUgcGFyYW1ldGVyIG5hbWUgZm9yIHRoZSBmaWxlIGZvcm0gZGF0YSxcXG4gICAgLy8gIG92ZXJyaWRlcyB0aGUgbmFtZSBwcm9wZXJ0eSBvZiB0aGUgZmlsZSBpbnB1dCBmaWVsZChzKSxcXG4gICAgLy8gIGNhbiBiZSBhIHN0cmluZyBvciBhbiBhcnJheSBvZiBzdHJpbmdzLlxcbiAgICAvLyBvcHRpb25zLmZvcm1EYXRhOiBhbiBhcnJheSBvZiBvYmplY3RzIHdpdGggbmFtZSBhbmQgdmFsdWUgcHJvcGVydGllcyxcXG4gICAgLy8gIGVxdWl2YWxlbnQgdG8gdGhlIHJldHVybiBkYXRhIG9mIC5zZXJpYWxpemVBcnJheSgpLCBlLmcuOlxcbiAgICAvLyAgW3tuYW1lOiAnYScsIHZhbHVlOiAxfSwge25hbWU6ICdiJywgdmFsdWU6IDJ9XVxcbiAgICAkLmFqYXhUcmFuc3BvcnQoJ2lmcmFtZScsIGZ1bmN0aW9uIChvcHRpb25zKSB7XFxuICAgICAgICBpZiAob3B0aW9ucy5hc3luYykge1xcbiAgICAgICAgICAgIHZhciBmb3JtLFxcbiAgICAgICAgICAgICAgICBpZnJhbWUsXFxuICAgICAgICAgICAgICAgIGFkZFBhcmFtQ2hhcjtcXG4gICAgICAgICAgICByZXR1cm4ge1xcbiAgICAgICAgICAgICAgICBzZW5kOiBmdW5jdGlvbiAoXywgY29tcGxldGVDYWxsYmFjaykge1xcbiAgICAgICAgICAgICAgICAgICAgZm9ybSA9ICQoJzxmb3JtIHN0eWxlPVxcXCJkaXNwbGF5Om5vbmU7XFxcIj48L2Zvcm0+Jyk7XFxuICAgICAgICAgICAgICAgICAgICBmb3JtLmF0dHIoJ2FjY2VwdC1jaGFyc2V0Jywgb3B0aW9ucy5mb3JtQWNjZXB0Q2hhcnNldCk7XFxuICAgICAgICAgICAgICAgICAgICBhZGRQYXJhbUNoYXIgPSAvXFxcXD8vLnRlc3Qob3B0aW9ucy51cmwpID8gJyYnIDogJz8nO1xcbiAgICAgICAgICAgICAgICAgICAgLy8gWERvbWFpblJlcXVlc3Qgb25seSBzdXBwb3J0cyBHRVQgYW5kIFBPU1Q6XFxuICAgICAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy50eXBlID09PSAnREVMRVRFJykge1xcbiAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMudXJsID0gb3B0aW9ucy51cmwgKyBhZGRQYXJhbUNoYXIgKyAnX21ldGhvZD1ERUxFVEUnO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMudHlwZSA9ICdQT1NUJztcXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAob3B0aW9ucy50eXBlID09PSAnUFVUJykge1xcbiAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMudXJsID0gb3B0aW9ucy51cmwgKyBhZGRQYXJhbUNoYXIgKyAnX21ldGhvZD1QVVQnO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMudHlwZSA9ICdQT1NUJztcXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAob3B0aW9ucy50eXBlID09PSAnUEFUQ0gnKSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy51cmwgPSBvcHRpb25zLnVybCArIGFkZFBhcmFtQ2hhciArICdfbWV0aG9kPVBBVENIJztcXG4gICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnR5cGUgPSAnUE9TVCc7XFxuICAgICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgICAgICAvLyBqYXZhc2NyaXB0OmZhbHNlIGFzIGluaXRpYWwgaWZyYW1lIHNyY1xcbiAgICAgICAgICAgICAgICAgICAgLy8gcHJldmVudHMgd2FybmluZyBwb3B1cHMgb24gSFRUUFMgaW4gSUU2LlxcbiAgICAgICAgICAgICAgICAgICAgLy8gSUUgdmVyc2lvbnMgYmVsb3cgSUU4IGNhbm5vdCBzZXQgdGhlIG5hbWUgcHJvcGVydHkgb2ZcXG4gICAgICAgICAgICAgICAgICAgIC8vIGVsZW1lbnRzIHRoYXQgaGF2ZSBhbHJlYWR5IGJlZW4gYWRkZWQgdG8gdGhlIERPTSxcXG4gICAgICAgICAgICAgICAgICAgIC8vIHNvIHdlIHNldCB0aGUgbmFtZSBhbG9uZyB3aXRoIHRoZSBpZnJhbWUgSFRNTCBtYXJrdXA6XFxuICAgICAgICAgICAgICAgICAgICBjb3VudGVyICs9IDE7XFxuICAgICAgICAgICAgICAgICAgICBpZnJhbWUgPSAkKFxcbiAgICAgICAgICAgICAgICAgICAgICAgICc8aWZyYW1lIHNyYz1cXFwiamF2YXNjcmlwdDpmYWxzZTtcXFwiIG5hbWU9XFxcImlmcmFtZS10cmFuc3BvcnQtJyArXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50ZXIgKyAnXFxcIj48L2lmcmFtZT4nXFxuICAgICAgICAgICAgICAgICAgICApLmJpbmQoJ2xvYWQnLCBmdW5jdGlvbiAoKSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGZpbGVJbnB1dENsb25lcyxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1OYW1lcyA9ICQuaXNBcnJheShvcHRpb25zLnBhcmFtTmFtZSkgP1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMucGFyYW1OYW1lIDogW29wdGlvbnMucGFyYW1OYW1lXTtcXG4gICAgICAgICAgICAgICAgICAgICAgICBpZnJhbWVcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLnVuYmluZCgnbG9hZCcpXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5iaW5kKCdsb2FkJywgZnVuY3Rpb24gKCkge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHJlc3BvbnNlO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gV3JhcCBpbiBhIHRyeS9jYXRjaCBibG9jayB0byBjYXRjaCBleGNlcHRpb25zIHRocm93blxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2hlbiB0cnlpbmcgdG8gYWNjZXNzIGNyb3NzLWRvbWFpbiBpZnJhbWUgY29udGVudHM6XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlID0gaWZyYW1lLmNvbnRlbnRzKCk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gR29vZ2xlIENocm9tZSBhbmQgRmlyZWZveCBkbyBub3QgdGhyb3cgYW5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBleGNlcHRpb24gd2hlbiBjYWxsaW5nIGlmcmFtZS5jb250ZW50cygpIG9uXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY3Jvc3MtZG9tYWluIHJlcXVlc3RzLCBzbyB3ZSB1bmlmeSB0aGUgcmVzcG9uc2U6XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFyZXNwb25zZS5sZW5ndGggfHwgIXJlc3BvbnNlWzBdLmZpcnN0Q2hpbGQpIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlID0gdW5kZWZpbmVkO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIGNvbXBsZXRlIGNhbGxiYWNrIHJldHVybnMgdGhlXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZnJhbWUgY29udGVudCBkb2N1bWVudCBhcyByZXNwb25zZSBvYmplY3Q6XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wbGV0ZUNhbGxiYWNrKFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIwMCxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc3VjY2VzcycsXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeydpZnJhbWUnOiByZXNwb25zZX1cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBGaXggZm9yIElFIGVuZGxlc3MgcHJvZ3Jlc3MgYmFyIGFjdGl2aXR5IGJ1Z1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gKGhhcHBlbnMgb24gZm9ybSBzdWJtaXRzIHRvIGlmcmFtZSB0YXJnZXRzKTpcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoJzxpZnJhbWUgc3JjPVxcXCJqYXZhc2NyaXB0OmZhbHNlO1xcXCI+PC9pZnJhbWU+JylcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYXBwZW5kVG8oZm9ybSk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUmVtb3ZpbmcgdGhlIGZvcm0gaW4gYSBzZXRUaW1lb3V0IGNhbGxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbGxvd3MgQ2hyb21lJ3MgZGV2ZWxvcGVyIHRvb2xzIHRvIGRpc3BsYXlcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgcmVzcG9uc2UgcmVzdWx0XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybS5yZW1vdmUoKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIDApO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3JtXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5wcm9wKCd0YXJnZXQnLCBpZnJhbWUucHJvcCgnbmFtZScpKVxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAucHJvcCgnYWN0aW9uJywgb3B0aW9ucy51cmwpXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5wcm9wKCdtZXRob2QnLCBvcHRpb25zLnR5cGUpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLmZvcm1EYXRhKSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICQuZWFjaChvcHRpb25zLmZvcm1EYXRhLCBmdW5jdGlvbiAoaW5kZXgsIGZpZWxkKSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKCc8aW5wdXQgdHlwZT1cXFwiaGlkZGVuXFxcIi8+JylcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucHJvcCgnbmFtZScsIGZpZWxkLm5hbWUpXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnZhbChmaWVsZC52YWx1ZSlcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYXBwZW5kVG8oZm9ybSk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5maWxlSW5wdXQgJiYgb3B0aW9ucy5maWxlSW5wdXQubGVuZ3RoICYmXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnR5cGUgPT09ICdQT1NUJykge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlSW5wdXRDbG9uZXMgPSBvcHRpb25zLmZpbGVJbnB1dC5jbG9uZSgpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJbnNlcnQgYSBjbG9uZSBmb3IgZWFjaCBmaWxlIGlucHV0IGZpZWxkOlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLmZpbGVJbnB1dC5hZnRlcihmdW5jdGlvbiAoaW5kZXgpIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmaWxlSW5wdXRDbG9uZXNbaW5kZXhdO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMucGFyYW1OYW1lKSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLmZpbGVJbnB1dC5lYWNoKGZ1bmN0aW9uIChpbmRleCkge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQodGhpcykucHJvcChcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ25hbWUnLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbU5hbWVzW2luZGV4XSB8fCBvcHRpb25zLnBhcmFtTmFtZVxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBcHBlbmRpbmcgdGhlIGZpbGUgaW5wdXQgZmllbGRzIHRvIHRoZSBoaWRkZW4gZm9ybVxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZW1vdmVzIHRoZW0gZnJvbSB0aGVpciBvcmlnaW5hbCBsb2NhdGlvbjpcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybVxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFwcGVuZChvcHRpb25zLmZpbGVJbnB1dClcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5wcm9wKCdlbmN0eXBlJywgJ211bHRpcGFydC9mb3JtLWRhdGEnKVxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZW5jdHlwZSBtdXN0IGJlIHNldCBhcyBlbmNvZGluZyBmb3IgSUU6XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucHJvcCgnZW5jb2RpbmcnLCAnbXVsdGlwYXJ0L2Zvcm0tZGF0YScpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3JtLnN1Ym1pdCgpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEluc2VydCB0aGUgZmlsZSBpbnB1dCBmaWVsZHMgYXQgdGhlaXIgb3JpZ2luYWwgbG9jYXRpb25cXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBieSByZXBsYWNpbmcgdGhlIGNsb25lcyB3aXRoIHRoZSBvcmlnaW5hbHM6XFxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpbGVJbnB1dENsb25lcyAmJiBmaWxlSW5wdXRDbG9uZXMubGVuZ3RoKSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuZmlsZUlucHV0LmVhY2goZnVuY3Rpb24gKGluZGV4LCBpbnB1dCkge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNsb25lID0gJChmaWxlSW5wdXRDbG9uZXNbaW5kZXhdKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoaW5wdXQpLnByb3AoJ25hbWUnLCBjbG9uZS5wcm9wKCduYW1lJykpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xvbmUucmVwbGFjZVdpdGgoaW5wdXQpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICAgICAgICAgIGZvcm0uYXBwZW5kKGlmcmFtZSkuYXBwZW5kVG8oZG9jdW1lbnQuYm9keSk7XFxuICAgICAgICAgICAgICAgIH0sXFxuICAgICAgICAgICAgICAgIGFib3J0OiBmdW5jdGlvbiAoKSB7XFxuICAgICAgICAgICAgICAgICAgICBpZiAoaWZyYW1lKSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gamF2YXNjcmlwdDpmYWxzZSBhcyBpZnJhbWUgc3JjIGFib3J0cyB0aGUgcmVxdWVzdFxcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFuZCBwcmV2ZW50cyB3YXJuaW5nIHBvcHVwcyBvbiBIVFRQUyBpbiBJRTYuXFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uY2F0IGlzIHVzZWQgdG8gYXZvaWQgdGhlIFxcXCJTY3JpcHQgVVJMXFxcIiBKU0xpbnQgZXJyb3I6XFxuICAgICAgICAgICAgICAgICAgICAgICAgaWZyYW1lXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC51bmJpbmQoJ2xvYWQnKVxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAucHJvcCgnc3JjJywgJ2phdmFzY3JpcHQnLmNvbmNhdCgnOmZhbHNlOycpKTtcXG4gICAgICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgICAgIGlmIChmb3JtKSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgZm9ybS5yZW1vdmUoKTtcXG4gICAgICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIH07XFxuICAgICAgICB9XFxuICAgIH0pO1xcblxcbiAgICAvLyBUaGUgaWZyYW1lIHRyYW5zcG9ydCByZXR1cm5zIHRoZSBpZnJhbWUgY29udGVudCBkb2N1bWVudCBhcyByZXNwb25zZS5cXG4gICAgLy8gVGhlIGZvbGxvd2luZyBhZGRzIGNvbnZlcnRlcnMgZnJvbSBpZnJhbWUgdG8gdGV4dCwganNvbiwgaHRtbCwgeG1sXFxuICAgIC8vIGFuZCBzY3JpcHQuXFxuICAgIC8vIFBsZWFzZSBub3RlIHRoYXQgdGhlIENvbnRlbnQtVHlwZSBmb3IgSlNPTiByZXNwb25zZXMgaGFzIHRvIGJlIHRleHQvcGxhaW5cXG4gICAgLy8gb3IgdGV4dC9odG1sLCBpZiB0aGUgYnJvd3NlciBkb2Vzbid0IGluY2x1ZGUgYXBwbGljYXRpb24vanNvbiBpbiB0aGVcXG4gICAgLy8gQWNjZXB0IGhlYWRlciwgZWxzZSBJRSB3aWxsIHNob3cgYSBkb3dubG9hZCBkaWFsb2cuXFxuICAgIC8vIFRoZSBDb250ZW50LVR5cGUgZm9yIFhNTCByZXNwb25zZXMgb24gdGhlIG90aGVyIGhhbmQgaGFzIHRvIGJlIGFsd2F5c1xcbiAgICAvLyBhcHBsaWNhdGlvbi94bWwgb3IgdGV4dC94bWwsIHNvIElFIHByb3Blcmx5IHBhcnNlcyB0aGUgWE1MIHJlc3BvbnNlLlxcbiAgICAvLyBTZWUgYWxzb1xcbiAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vYmx1ZWltcC9qUXVlcnktRmlsZS1VcGxvYWQvd2lraS9TZXR1cCNjb250ZW50LXR5cGUtbmVnb3RpYXRpb25cXG4gICAgJC5hamF4U2V0dXAoe1xcbiAgICAgICAgY29udmVydGVyczoge1xcbiAgICAgICAgICAgICdpZnJhbWUgdGV4dCc6IGZ1bmN0aW9uIChpZnJhbWUpIHtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIGlmcmFtZSAmJiAkKGlmcmFtZVswXS5ib2R5KS50ZXh0KCk7XFxuICAgICAgICAgICAgfSxcXG4gICAgICAgICAgICAnaWZyYW1lIGpzb24nOiBmdW5jdGlvbiAoaWZyYW1lKSB7XFxuICAgICAgICAgICAgICAgIHJldHVybiBpZnJhbWUgJiYgJC5wYXJzZUpTT04oJChpZnJhbWVbMF0uYm9keSkudGV4dCgpKTtcXG4gICAgICAgICAgICB9LFxcbiAgICAgICAgICAgICdpZnJhbWUgaHRtbCc6IGZ1bmN0aW9uIChpZnJhbWUpIHtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIGlmcmFtZSAmJiAkKGlmcmFtZVswXS5ib2R5KS5odG1sKCk7XFxuICAgICAgICAgICAgfSxcXG4gICAgICAgICAgICAnaWZyYW1lIHhtbCc6IGZ1bmN0aW9uIChpZnJhbWUpIHtcXG4gICAgICAgICAgICAgICAgdmFyIHhtbERvYyA9IGlmcmFtZSAmJiBpZnJhbWVbMF07XFxuICAgICAgICAgICAgICAgIHJldHVybiB4bWxEb2MgJiYgJC5pc1hNTERvYyh4bWxEb2MpID8geG1sRG9jIDpcXG4gICAgICAgICAgICAgICAgICAgICAgICAkLnBhcnNlWE1MKCh4bWxEb2MuWE1MRG9jdW1lbnQgJiYgeG1sRG9jLlhNTERvY3VtZW50LnhtbCkgfHxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJCh4bWxEb2MuYm9keSkuaHRtbCgpKTtcXG4gICAgICAgICAgICB9LFxcbiAgICAgICAgICAgICdpZnJhbWUgc2NyaXB0JzogZnVuY3Rpb24gKGlmcmFtZSkge1xcbiAgICAgICAgICAgICAgICByZXR1cm4gaWZyYW1lICYmICQuZ2xvYmFsRXZhbCgkKGlmcmFtZVswXS5ib2R5KS50ZXh0KCkpO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH1cXG4gICAgfSk7XFxuXFxufSkpO1xcblwiXG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vcmF3LWxvYWRlciEuL2Jvd2VyX2NvbXBvbmVudHMvY2xvdWRpbmFyeV9qcy9qcy9qcXVlcnkuaWZyYW1lLXRyYW5zcG9ydC5qc1xuICoqIG1vZHVsZSBpZCA9IDI1XG4gKiogbW9kdWxlIGNodW5rcyA9IDI0XG4gKiovIl0sIm1hcHBpbmdzIjoiQUFBQSIsInNvdXJjZVJvb3QiOiIifQ==");

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

	eval("__webpack_require__(16)(__webpack_require__(27))\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjYuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ib3dlcl9jb21wb25lbnRzL2Nsb3VkaW5hcnlfanMvanMvanF1ZXJ5LnVpLndpZGdldC5qcz9hMDc3Il0sInNvdXJjZXNDb250ZW50IjpbInJlcXVpcmUoXCIhIS9ob21lL2RlcGxveWVyL2RlcGxveW1lbnQvanMvbm9kZV9tb2R1bGVzL3NjcmlwdC1sb2FkZXIvYWRkU2NyaXB0LmpzXCIpKHJlcXVpcmUoXCIhIS9ob21lL2RlcGxveWVyL2RlcGxveW1lbnQvanMvbm9kZV9tb2R1bGVzL3Jhdy1sb2FkZXIvaW5kZXguanMhL2hvbWUvZGVwbG95ZXIvZGVwbG95bWVudC9qcy9ib3dlcl9jb21wb25lbnRzL2Nsb3VkaW5hcnlfanMvanMvanF1ZXJ5LnVpLndpZGdldC5qc1wiKSlcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9zY3JpcHQtbG9hZGVyIS4vYm93ZXJfY29tcG9uZW50cy9jbG91ZGluYXJ5X2pzL2pzL2pxdWVyeS51aS53aWRnZXQuanNcbiAqKiBtb2R1bGUgaWQgPSAyNlxuICoqIG1vZHVsZSBjaHVua3MgPSAyNFxuICoqLyJdLCJtYXBwaW5ncyI6IkFBQUEiLCJzb3VyY2VSb290IjoiIn0=");

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

	eval("module.exports = \"/*\\n * jQuery UI Widget 1.10.3+amd\\n * https://github.com/blueimp/jQuery-File-Upload\\n *\\n * Copyright 2013 jQuery Foundation and other contributors\\n * Released under the MIT license.\\n * http://jquery.org/license\\n *\\n * http://api.jqueryui.com/jQuery.widget/\\n */\\n\\n(function (factory) {\\n    if (typeof define === \\\"function\\\" && define.amd) {\\n        // Register as an anonymous AMD module:\\n        define([\\\"jquery\\\"], factory);\\n    } else {\\n        // Browser globals:\\n        factory(jQuery);\\n    }\\n}(function( $, undefined ) {\\n\\nvar uuid = 0,\\n\\tslice = Array.prototype.slice,\\n\\t_cleanData = $.cleanData;\\n$.cleanData = function( elems ) {\\n\\tfor ( var i = 0, elem; (elem = elems[i]) != null; i++ ) {\\n\\t\\ttry {\\n\\t\\t\\t$( elem ).triggerHandler( \\\"remove\\\" );\\n\\t\\t// http://bugs.jquery.com/ticket/8235\\n\\t\\t} catch( e ) {}\\n\\t}\\n\\t_cleanData( elems );\\n};\\n\\n$.widget = function( name, base, prototype ) {\\n\\tvar fullName, existingConstructor, constructor, basePrototype,\\n\\t\\t// proxiedPrototype allows the provided prototype to remain unmodified\\n\\t\\t// so that it can be used as a mixin for multiple widgets (#8876)\\n\\t\\tproxiedPrototype = {},\\n\\t\\tnamespace = name.split( \\\".\\\" )[ 0 ];\\n\\n\\tname = name.split( \\\".\\\" )[ 1 ];\\n\\tfullName = namespace + \\\"-\\\" + name;\\n\\n\\tif ( !prototype ) {\\n\\t\\tprototype = base;\\n\\t\\tbase = $.Widget;\\n\\t}\\n\\n\\t// create selector for plugin\\n\\t$.expr[ \\\":\\\" ][ fullName.toLowerCase() ] = function( elem ) {\\n\\t\\treturn !!$.data( elem, fullName );\\n\\t};\\n\\n\\t$[ namespace ] = $[ namespace ] || {};\\n\\texistingConstructor = $[ namespace ][ name ];\\n\\tconstructor = $[ namespace ][ name ] = function( options, element ) {\\n\\t\\t// allow instantiation without \\\"new\\\" keyword\\n\\t\\tif ( !this._createWidget ) {\\n\\t\\t\\treturn new constructor( options, element );\\n\\t\\t}\\n\\n\\t\\t// allow instantiation without initializing for simple inheritance\\n\\t\\t// must use \\\"new\\\" keyword (the code above always passes args)\\n\\t\\tif ( arguments.length ) {\\n\\t\\t\\tthis._createWidget( options, element );\\n\\t\\t}\\n\\t};\\n\\t// extend with the existing constructor to carry over any static properties\\n\\t$.extend( constructor, existingConstructor, {\\n\\t\\tversion: prototype.version,\\n\\t\\t// copy the object used to create the prototype in case we need to\\n\\t\\t// redefine the widget later\\n\\t\\t_proto: $.extend( {}, prototype ),\\n\\t\\t// track widgets that inherit from this widget in case this widget is\\n\\t\\t// redefined after a widget inherits from it\\n\\t\\t_childConstructors: []\\n\\t});\\n\\n\\tbasePrototype = new base();\\n\\t// we need to make the options hash a property directly on the new instance\\n\\t// otherwise we'll modify the options hash on the prototype that we're\\n\\t// inheriting from\\n\\tbasePrototype.options = $.widget.extend( {}, basePrototype.options );\\n\\t$.each( prototype, function( prop, value ) {\\n\\t\\tif ( !$.isFunction( value ) ) {\\n\\t\\t\\tproxiedPrototype[ prop ] = value;\\n\\t\\t\\treturn;\\n\\t\\t}\\n\\t\\tproxiedPrototype[ prop ] = (function() {\\n\\t\\t\\tvar _super = function() {\\n\\t\\t\\t\\t\\treturn base.prototype[ prop ].apply( this, arguments );\\n\\t\\t\\t\\t},\\n\\t\\t\\t\\t_superApply = function( args ) {\\n\\t\\t\\t\\t\\treturn base.prototype[ prop ].apply( this, args );\\n\\t\\t\\t\\t};\\n\\t\\t\\treturn function() {\\n\\t\\t\\t\\tvar __super = this._super,\\n\\t\\t\\t\\t\\t__superApply = this._superApply,\\n\\t\\t\\t\\t\\treturnValue;\\n\\n\\t\\t\\t\\tthis._super = _super;\\n\\t\\t\\t\\tthis._superApply = _superApply;\\n\\n\\t\\t\\t\\treturnValue = value.apply( this, arguments );\\n\\n\\t\\t\\t\\tthis._super = __super;\\n\\t\\t\\t\\tthis._superApply = __superApply;\\n\\n\\t\\t\\t\\treturn returnValue;\\n\\t\\t\\t};\\n\\t\\t})();\\n\\t});\\n\\tconstructor.prototype = $.widget.extend( basePrototype, {\\n\\t\\t// TODO: remove support for widgetEventPrefix\\n\\t\\t// always use the name + a colon as the prefix, e.g., draggable:start\\n\\t\\t// don't prefix for widgets that aren't DOM-based\\n\\t\\twidgetEventPrefix: existingConstructor ? basePrototype.widgetEventPrefix : name\\n\\t}, proxiedPrototype, {\\n\\t\\tconstructor: constructor,\\n\\t\\tnamespace: namespace,\\n\\t\\twidgetName: name,\\n\\t\\twidgetFullName: fullName\\n\\t});\\n\\n\\t// If this widget is being redefined then we need to find all widgets that\\n\\t// are inheriting from it and redefine all of them so that they inherit from\\n\\t// the new version of this widget. We're essentially trying to replace one\\n\\t// level in the prototype chain.\\n\\tif ( existingConstructor ) {\\n\\t\\t$.each( existingConstructor._childConstructors, function( i, child ) {\\n\\t\\t\\tvar childPrototype = child.prototype;\\n\\n\\t\\t\\t// redefine the child widget using the same prototype that was\\n\\t\\t\\t// originally used, but inherit from the new version of the base\\n\\t\\t\\t$.widget( childPrototype.namespace + \\\".\\\" + childPrototype.widgetName, constructor, child._proto );\\n\\t\\t});\\n\\t\\t// remove the list of existing child constructors from the old constructor\\n\\t\\t// so the old child constructors can be garbage collected\\n\\t\\tdelete existingConstructor._childConstructors;\\n\\t} else {\\n\\t\\tbase._childConstructors.push( constructor );\\n\\t}\\n\\n\\t$.widget.bridge( name, constructor );\\n};\\n\\n$.widget.extend = function( target ) {\\n\\tvar input = slice.call( arguments, 1 ),\\n\\t\\tinputIndex = 0,\\n\\t\\tinputLength = input.length,\\n\\t\\tkey,\\n\\t\\tvalue;\\n\\tfor ( ; inputIndex < inputLength; inputIndex++ ) {\\n\\t\\tfor ( key in input[ inputIndex ] ) {\\n\\t\\t\\tvalue = input[ inputIndex ][ key ];\\n\\t\\t\\tif ( input[ inputIndex ].hasOwnProperty( key ) && value !== undefined ) {\\n\\t\\t\\t\\t// Clone objects\\n\\t\\t\\t\\tif ( $.isPlainObject( value ) ) {\\n\\t\\t\\t\\t\\ttarget[ key ] = $.isPlainObject( target[ key ] ) ?\\n\\t\\t\\t\\t\\t\\t$.widget.extend( {}, target[ key ], value ) :\\n\\t\\t\\t\\t\\t\\t// Don't extend strings, arrays, etc. with objects\\n\\t\\t\\t\\t\\t\\t$.widget.extend( {}, value );\\n\\t\\t\\t\\t// Copy everything else by reference\\n\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\ttarget[ key ] = value;\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n\\treturn target;\\n};\\n\\n$.widget.bridge = function( name, object ) {\\n\\tvar fullName = object.prototype.widgetFullName || name;\\n\\t$.fn[ name ] = function( options ) {\\n\\t\\tvar isMethodCall = typeof options === \\\"string\\\",\\n\\t\\t\\targs = slice.call( arguments, 1 ),\\n\\t\\t\\treturnValue = this;\\n\\n\\t\\t// allow multiple hashes to be passed on init\\n\\t\\toptions = !isMethodCall && args.length ?\\n\\t\\t\\t$.widget.extend.apply( null, [ options ].concat(args) ) :\\n\\t\\t\\toptions;\\n\\n\\t\\tif ( isMethodCall ) {\\n\\t\\t\\tthis.each(function() {\\n\\t\\t\\t\\tvar methodValue,\\n\\t\\t\\t\\t\\tinstance = $.data( this, fullName );\\n\\t\\t\\t\\tif ( !instance ) {\\n\\t\\t\\t\\t\\treturn $.error( \\\"cannot call methods on \\\" + name + \\\" prior to initialization; \\\" +\\n\\t\\t\\t\\t\\t\\t\\\"attempted to call method '\\\" + options + \\\"'\\\" );\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\tif ( !$.isFunction( instance[options] ) || options.charAt( 0 ) === \\\"_\\\" ) {\\n\\t\\t\\t\\t\\treturn $.error( \\\"no such method '\\\" + options + \\\"' for \\\" + name + \\\" widget instance\\\" );\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\tmethodValue = instance[ options ].apply( instance, args );\\n\\t\\t\\t\\tif ( methodValue !== instance && methodValue !== undefined ) {\\n\\t\\t\\t\\t\\treturnValue = methodValue && methodValue.jquery ?\\n\\t\\t\\t\\t\\t\\treturnValue.pushStack( methodValue.get() ) :\\n\\t\\t\\t\\t\\t\\tmethodValue;\\n\\t\\t\\t\\t\\treturn false;\\n\\t\\t\\t\\t}\\n\\t\\t\\t});\\n\\t\\t} else {\\n\\t\\t\\tthis.each(function() {\\n\\t\\t\\t\\tvar instance = $.data( this, fullName );\\n\\t\\t\\t\\tif ( instance ) {\\n\\t\\t\\t\\t\\tinstance.option( options || {} )._init();\\n\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\t$.data( this, fullName, new object( options, this ) );\\n\\t\\t\\t\\t}\\n\\t\\t\\t});\\n\\t\\t}\\n\\n\\t\\treturn returnValue;\\n\\t};\\n};\\n\\n$.Widget = function( /* options, element */ ) {};\\n$.Widget._childConstructors = [];\\n\\n$.Widget.prototype = {\\n\\twidgetName: \\\"widget\\\",\\n\\twidgetEventPrefix: \\\"\\\",\\n\\tdefaultElement: \\\"<div>\\\",\\n\\toptions: {\\n\\t\\tdisabled: false,\\n\\n\\t\\t// callbacks\\n\\t\\tcreate: null\\n\\t},\\n\\t_createWidget: function( options, element ) {\\n\\t\\telement = $( element || this.defaultElement || this )[ 0 ];\\n\\t\\tthis.element = $( element );\\n\\t\\tthis.uuid = uuid++;\\n\\t\\tthis.eventNamespace = \\\".\\\" + this.widgetName + this.uuid;\\n\\t\\tthis.options = $.widget.extend( {},\\n\\t\\t\\tthis.options,\\n\\t\\t\\tthis._getCreateOptions(),\\n\\t\\t\\toptions );\\n\\n\\t\\tthis.bindings = $();\\n\\t\\tthis.hoverable = $();\\n\\t\\tthis.focusable = $();\\n\\n\\t\\tif ( element !== this ) {\\n\\t\\t\\t$.data( element, this.widgetFullName, this );\\n\\t\\t\\tthis._on( true, this.element, {\\n\\t\\t\\t\\tremove: function( event ) {\\n\\t\\t\\t\\t\\tif ( event.target === element ) {\\n\\t\\t\\t\\t\\t\\tthis.destroy();\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t}\\n\\t\\t\\t});\\n\\t\\t\\tthis.document = $( element.style ?\\n\\t\\t\\t\\t// element within the document\\n\\t\\t\\t\\telement.ownerDocument :\\n\\t\\t\\t\\t// element is window or document\\n\\t\\t\\t\\telement.document || element );\\n\\t\\t\\tthis.window = $( this.document[0].defaultView || this.document[0].parentWindow );\\n\\t\\t}\\n\\n\\t\\tthis._create();\\n\\t\\tthis._trigger( \\\"create\\\", null, this._getCreateEventData() );\\n\\t\\tthis._init();\\n\\t},\\n\\t_getCreateOptions: $.noop,\\n\\t_getCreateEventData: $.noop,\\n\\t_create: $.noop,\\n\\t_init: $.noop,\\n\\n\\tdestroy: function() {\\n\\t\\tthis._destroy();\\n\\t\\t// we can probably remove the unbind calls in 2.0\\n\\t\\t// all event bindings should go through this._on()\\n\\t\\tthis.element\\n\\t\\t\\t.unbind( this.eventNamespace )\\n\\t\\t\\t// 1.9 BC for #7810\\n\\t\\t\\t// TODO remove dual storage\\n\\t\\t\\t.removeData( this.widgetName )\\n\\t\\t\\t.removeData( this.widgetFullName )\\n\\t\\t\\t// support: jquery <1.6.3\\n\\t\\t\\t// http://bugs.jquery.com/ticket/9413\\n\\t\\t\\t.removeData( $.camelCase( this.widgetFullName ) );\\n\\t\\tthis.widget()\\n\\t\\t\\t.unbind( this.eventNamespace )\\n\\t\\t\\t.removeAttr( \\\"aria-disabled\\\" )\\n\\t\\t\\t.removeClass(\\n\\t\\t\\t\\tthis.widgetFullName + \\\"-disabled \\\" +\\n\\t\\t\\t\\t\\\"ui-state-disabled\\\" );\\n\\n\\t\\t// clean up events and states\\n\\t\\tthis.bindings.unbind( this.eventNamespace );\\n\\t\\tthis.hoverable.removeClass( \\\"ui-state-hover\\\" );\\n\\t\\tthis.focusable.removeClass( \\\"ui-state-focus\\\" );\\n\\t},\\n\\t_destroy: $.noop,\\n\\n\\twidget: function() {\\n\\t\\treturn this.element;\\n\\t},\\n\\n\\toption: function( key, value ) {\\n\\t\\tvar options = key,\\n\\t\\t\\tparts,\\n\\t\\t\\tcurOption,\\n\\t\\t\\ti;\\n\\n\\t\\tif ( arguments.length === 0 ) {\\n\\t\\t\\t// don't return a reference to the internal hash\\n\\t\\t\\treturn $.widget.extend( {}, this.options );\\n\\t\\t}\\n\\n\\t\\tif ( typeof key === \\\"string\\\" ) {\\n\\t\\t\\t// handle nested keys, e.g., \\\"foo.bar\\\" => { foo: { bar: ___ } }\\n\\t\\t\\toptions = {};\\n\\t\\t\\tparts = key.split( \\\".\\\" );\\n\\t\\t\\tkey = parts.shift();\\n\\t\\t\\tif ( parts.length ) {\\n\\t\\t\\t\\tcurOption = options[ key ] = $.widget.extend( {}, this.options[ key ] );\\n\\t\\t\\t\\tfor ( i = 0; i < parts.length - 1; i++ ) {\\n\\t\\t\\t\\t\\tcurOption[ parts[ i ] ] = curOption[ parts[ i ] ] || {};\\n\\t\\t\\t\\t\\tcurOption = curOption[ parts[ i ] ];\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\tkey = parts.pop();\\n\\t\\t\\t\\tif ( value === undefined ) {\\n\\t\\t\\t\\t\\treturn curOption[ key ] === undefined ? null : curOption[ key ];\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\tcurOption[ key ] = value;\\n\\t\\t\\t} else {\\n\\t\\t\\t\\tif ( value === undefined ) {\\n\\t\\t\\t\\t\\treturn this.options[ key ] === undefined ? null : this.options[ key ];\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\toptions[ key ] = value;\\n\\t\\t\\t}\\n\\t\\t}\\n\\n\\t\\tthis._setOptions( options );\\n\\n\\t\\treturn this;\\n\\t},\\n\\t_setOptions: function( options ) {\\n\\t\\tvar key;\\n\\n\\t\\tfor ( key in options ) {\\n\\t\\t\\tthis._setOption( key, options[ key ] );\\n\\t\\t}\\n\\n\\t\\treturn this;\\n\\t},\\n\\t_setOption: function( key, value ) {\\n\\t\\tthis.options[ key ] = value;\\n\\n\\t\\tif ( key === \\\"disabled\\\" ) {\\n\\t\\t\\tthis.widget()\\n\\t\\t\\t\\t.toggleClass( this.widgetFullName + \\\"-disabled ui-state-disabled\\\", !!value )\\n\\t\\t\\t\\t.attr( \\\"aria-disabled\\\", value );\\n\\t\\t\\tthis.hoverable.removeClass( \\\"ui-state-hover\\\" );\\n\\t\\t\\tthis.focusable.removeClass( \\\"ui-state-focus\\\" );\\n\\t\\t}\\n\\n\\t\\treturn this;\\n\\t},\\n\\n\\tenable: function() {\\n\\t\\treturn this._setOption( \\\"disabled\\\", false );\\n\\t},\\n\\tdisable: function() {\\n\\t\\treturn this._setOption( \\\"disabled\\\", true );\\n\\t},\\n\\n\\t_on: function( suppressDisabledCheck, element, handlers ) {\\n\\t\\tvar delegateElement,\\n\\t\\t\\tinstance = this;\\n\\n\\t\\t// no suppressDisabledCheck flag, shuffle arguments\\n\\t\\tif ( typeof suppressDisabledCheck !== \\\"boolean\\\" ) {\\n\\t\\t\\thandlers = element;\\n\\t\\t\\telement = suppressDisabledCheck;\\n\\t\\t\\tsuppressDisabledCheck = false;\\n\\t\\t}\\n\\n\\t\\t// no element argument, shuffle and use this.element\\n\\t\\tif ( !handlers ) {\\n\\t\\t\\thandlers = element;\\n\\t\\t\\telement = this.element;\\n\\t\\t\\tdelegateElement = this.widget();\\n\\t\\t} else {\\n\\t\\t\\t// accept selectors, DOM elements\\n\\t\\t\\telement = delegateElement = $( element );\\n\\t\\t\\tthis.bindings = this.bindings.add( element );\\n\\t\\t}\\n\\n\\t\\t$.each( handlers, function( event, handler ) {\\n\\t\\t\\tfunction handlerProxy() {\\n\\t\\t\\t\\t// allow widgets to customize the disabled handling\\n\\t\\t\\t\\t// - disabled as an array instead of boolean\\n\\t\\t\\t\\t// - disabled class as method for disabling individual parts\\n\\t\\t\\t\\tif ( !suppressDisabledCheck &&\\n\\t\\t\\t\\t\\t\\t( instance.options.disabled === true ||\\n\\t\\t\\t\\t\\t\\t\\t$( this ).hasClass( \\\"ui-state-disabled\\\" ) ) ) {\\n\\t\\t\\t\\t\\treturn;\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\treturn ( typeof handler === \\\"string\\\" ? instance[ handler ] : handler )\\n\\t\\t\\t\\t\\t.apply( instance, arguments );\\n\\t\\t\\t}\\n\\n\\t\\t\\t// copy the guid so direct unbinding works\\n\\t\\t\\tif ( typeof handler !== \\\"string\\\" ) {\\n\\t\\t\\t\\thandlerProxy.guid = handler.guid =\\n\\t\\t\\t\\t\\thandler.guid || handlerProxy.guid || $.guid++;\\n\\t\\t\\t}\\n\\n\\t\\t\\tvar match = event.match( /^(\\\\w+)\\\\s*(.*)$/ ),\\n\\t\\t\\t\\teventName = match[1] + instance.eventNamespace,\\n\\t\\t\\t\\tselector = match[2];\\n\\t\\t\\tif ( selector ) {\\n\\t\\t\\t\\tdelegateElement.delegate( selector, eventName, handlerProxy );\\n\\t\\t\\t} else {\\n\\t\\t\\t\\telement.bind( eventName, handlerProxy );\\n\\t\\t\\t}\\n\\t\\t});\\n\\t},\\n\\n\\t_off: function( element, eventName ) {\\n\\t\\teventName = (eventName || \\\"\\\").split( \\\" \\\" ).join( this.eventNamespace + \\\" \\\" ) + this.eventNamespace;\\n\\t\\telement.unbind( eventName ).undelegate( eventName );\\n\\t},\\n\\n\\t_delay: function( handler, delay ) {\\n\\t\\tfunction handlerProxy() {\\n\\t\\t\\treturn ( typeof handler === \\\"string\\\" ? instance[ handler ] : handler )\\n\\t\\t\\t\\t.apply( instance, arguments );\\n\\t\\t}\\n\\t\\tvar instance = this;\\n\\t\\treturn setTimeout( handlerProxy, delay || 0 );\\n\\t},\\n\\n\\t_hoverable: function( element ) {\\n\\t\\tthis.hoverable = this.hoverable.add( element );\\n\\t\\tthis._on( element, {\\n\\t\\t\\tmouseenter: function( event ) {\\n\\t\\t\\t\\t$( event.currentTarget ).addClass( \\\"ui-state-hover\\\" );\\n\\t\\t\\t},\\n\\t\\t\\tmouseleave: function( event ) {\\n\\t\\t\\t\\t$( event.currentTarget ).removeClass( \\\"ui-state-hover\\\" );\\n\\t\\t\\t}\\n\\t\\t});\\n\\t},\\n\\n\\t_focusable: function( element ) {\\n\\t\\tthis.focusable = this.focusable.add( element );\\n\\t\\tthis._on( element, {\\n\\t\\t\\tfocusin: function( event ) {\\n\\t\\t\\t\\t$( event.currentTarget ).addClass( \\\"ui-state-focus\\\" );\\n\\t\\t\\t},\\n\\t\\t\\tfocusout: function( event ) {\\n\\t\\t\\t\\t$( event.currentTarget ).removeClass( \\\"ui-state-focus\\\" );\\n\\t\\t\\t}\\n\\t\\t});\\n\\t},\\n\\n\\t_trigger: function( type, event, data ) {\\n\\t\\tvar prop, orig,\\n\\t\\t\\tcallback = this.options[ type ];\\n\\n\\t\\tdata = data || {};\\n\\t\\tevent = $.Event( event );\\n\\t\\tevent.type = ( type === this.widgetEventPrefix ?\\n\\t\\t\\ttype :\\n\\t\\t\\tthis.widgetEventPrefix + type ).toLowerCase();\\n\\t\\t// the original event may come from any element\\n\\t\\t// so we need to reset the target on the new event\\n\\t\\tevent.target = this.element[ 0 ];\\n\\n\\t\\t// copy original event properties over to the new event\\n\\t\\torig = event.originalEvent;\\n\\t\\tif ( orig ) {\\n\\t\\t\\tfor ( prop in orig ) {\\n\\t\\t\\t\\tif ( !( prop in event ) ) {\\n\\t\\t\\t\\t\\tevent[ prop ] = orig[ prop ];\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t}\\n\\n\\t\\tthis.element.trigger( event, data );\\n\\t\\treturn !( $.isFunction( callback ) &&\\n\\t\\t\\tcallback.apply( this.element[0], [ event ].concat( data ) ) === false ||\\n\\t\\t\\tevent.isDefaultPrevented() );\\n\\t}\\n};\\n\\n$.each( { show: \\\"fadeIn\\\", hide: \\\"fadeOut\\\" }, function( method, defaultEffect ) {\\n\\t$.Widget.prototype[ \\\"_\\\" + method ] = function( element, options, callback ) {\\n\\t\\tif ( typeof options === \\\"string\\\" ) {\\n\\t\\t\\toptions = { effect: options };\\n\\t\\t}\\n\\t\\tvar hasOptions,\\n\\t\\t\\teffectName = !options ?\\n\\t\\t\\t\\tmethod :\\n\\t\\t\\t\\toptions === true || typeof options === \\\"number\\\" ?\\n\\t\\t\\t\\t\\tdefaultEffect :\\n\\t\\t\\t\\t\\toptions.effect || defaultEffect;\\n\\t\\toptions = options || {};\\n\\t\\tif ( typeof options === \\\"number\\\" ) {\\n\\t\\t\\toptions = { duration: options };\\n\\t\\t}\\n\\t\\thasOptions = !$.isEmptyObject( options );\\n\\t\\toptions.complete = callback;\\n\\t\\tif ( options.delay ) {\\n\\t\\t\\telement.delay( options.delay );\\n\\t\\t}\\n\\t\\tif ( hasOptions && $.effects && $.effects.effect[ effectName ] ) {\\n\\t\\t\\telement[ method ]( options );\\n\\t\\t} else if ( effectName !== method && element[ effectName ] ) {\\n\\t\\t\\telement[ effectName ]( options.duration, options.easing, callback );\\n\\t\\t} else {\\n\\t\\t\\telement.queue(function( next ) {\\n\\t\\t\\t\\t$( this )[ method ]();\\n\\t\\t\\t\\tif ( callback ) {\\n\\t\\t\\t\\t\\tcallback.call( element[ 0 ] );\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\tnext();\\n\\t\\t\\t});\\n\\t\\t}\\n\\t};\\n});\\n\\n}));\\n\"\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjcuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ib3dlcl9jb21wb25lbnRzL2Nsb3VkaW5hcnlfanMvanMvanF1ZXJ5LnVpLndpZGdldC5qcz81MGMzIl0sInNvdXJjZXNDb250ZW50IjpbIm1vZHVsZS5leHBvcnRzID0gXCIvKlxcbiAqIGpRdWVyeSBVSSBXaWRnZXQgMS4xMC4zK2FtZFxcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9ibHVlaW1wL2pRdWVyeS1GaWxlLVVwbG9hZFxcbiAqXFxuICogQ29weXJpZ2h0IDIwMTMgalF1ZXJ5IEZvdW5kYXRpb24gYW5kIG90aGVyIGNvbnRyaWJ1dG9yc1xcbiAqIFJlbGVhc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZS5cXG4gKiBodHRwOi8vanF1ZXJ5Lm9yZy9saWNlbnNlXFxuICpcXG4gKiBodHRwOi8vYXBpLmpxdWVyeXVpLmNvbS9qUXVlcnkud2lkZ2V0L1xcbiAqL1xcblxcbihmdW5jdGlvbiAoZmFjdG9yeSkge1xcbiAgICBpZiAodHlwZW9mIGRlZmluZSA9PT0gXFxcImZ1bmN0aW9uXFxcIiAmJiBkZWZpbmUuYW1kKSB7XFxuICAgICAgICAvLyBSZWdpc3RlciBhcyBhbiBhbm9ueW1vdXMgQU1EIG1vZHVsZTpcXG4gICAgICAgIGRlZmluZShbXFxcImpxdWVyeVxcXCJdLCBmYWN0b3J5KTtcXG4gICAgfSBlbHNlIHtcXG4gICAgICAgIC8vIEJyb3dzZXIgZ2xvYmFsczpcXG4gICAgICAgIGZhY3RvcnkoalF1ZXJ5KTtcXG4gICAgfVxcbn0oZnVuY3Rpb24oICQsIHVuZGVmaW5lZCApIHtcXG5cXG52YXIgdXVpZCA9IDAsXFxuXFx0c2xpY2UgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UsXFxuXFx0X2NsZWFuRGF0YSA9ICQuY2xlYW5EYXRhO1xcbiQuY2xlYW5EYXRhID0gZnVuY3Rpb24oIGVsZW1zICkge1xcblxcdGZvciAoIHZhciBpID0gMCwgZWxlbTsgKGVsZW0gPSBlbGVtc1tpXSkgIT0gbnVsbDsgaSsrICkge1xcblxcdFxcdHRyeSB7XFxuXFx0XFx0XFx0JCggZWxlbSApLnRyaWdnZXJIYW5kbGVyKCBcXFwicmVtb3ZlXFxcIiApO1xcblxcdFxcdC8vIGh0dHA6Ly9idWdzLmpxdWVyeS5jb20vdGlja2V0LzgyMzVcXG5cXHRcXHR9IGNhdGNoKCBlICkge31cXG5cXHR9XFxuXFx0X2NsZWFuRGF0YSggZWxlbXMgKTtcXG59O1xcblxcbiQud2lkZ2V0ID0gZnVuY3Rpb24oIG5hbWUsIGJhc2UsIHByb3RvdHlwZSApIHtcXG5cXHR2YXIgZnVsbE5hbWUsIGV4aXN0aW5nQ29uc3RydWN0b3IsIGNvbnN0cnVjdG9yLCBiYXNlUHJvdG90eXBlLFxcblxcdFxcdC8vIHByb3hpZWRQcm90b3R5cGUgYWxsb3dzIHRoZSBwcm92aWRlZCBwcm90b3R5cGUgdG8gcmVtYWluIHVubW9kaWZpZWRcXG5cXHRcXHQvLyBzbyB0aGF0IGl0IGNhbiBiZSB1c2VkIGFzIGEgbWl4aW4gZm9yIG11bHRpcGxlIHdpZGdldHMgKCM4ODc2KVxcblxcdFxcdHByb3hpZWRQcm90b3R5cGUgPSB7fSxcXG5cXHRcXHRuYW1lc3BhY2UgPSBuYW1lLnNwbGl0KCBcXFwiLlxcXCIgKVsgMCBdO1xcblxcblxcdG5hbWUgPSBuYW1lLnNwbGl0KCBcXFwiLlxcXCIgKVsgMSBdO1xcblxcdGZ1bGxOYW1lID0gbmFtZXNwYWNlICsgXFxcIi1cXFwiICsgbmFtZTtcXG5cXG5cXHRpZiAoICFwcm90b3R5cGUgKSB7XFxuXFx0XFx0cHJvdG90eXBlID0gYmFzZTtcXG5cXHRcXHRiYXNlID0gJC5XaWRnZXQ7XFxuXFx0fVxcblxcblxcdC8vIGNyZWF0ZSBzZWxlY3RvciBmb3IgcGx1Z2luXFxuXFx0JC5leHByWyBcXFwiOlxcXCIgXVsgZnVsbE5hbWUudG9Mb3dlckNhc2UoKSBdID0gZnVuY3Rpb24oIGVsZW0gKSB7XFxuXFx0XFx0cmV0dXJuICEhJC5kYXRhKCBlbGVtLCBmdWxsTmFtZSApO1xcblxcdH07XFxuXFxuXFx0JFsgbmFtZXNwYWNlIF0gPSAkWyBuYW1lc3BhY2UgXSB8fCB7fTtcXG5cXHRleGlzdGluZ0NvbnN0cnVjdG9yID0gJFsgbmFtZXNwYWNlIF1bIG5hbWUgXTtcXG5cXHRjb25zdHJ1Y3RvciA9ICRbIG5hbWVzcGFjZSBdWyBuYW1lIF0gPSBmdW5jdGlvbiggb3B0aW9ucywgZWxlbWVudCApIHtcXG5cXHRcXHQvLyBhbGxvdyBpbnN0YW50aWF0aW9uIHdpdGhvdXQgXFxcIm5ld1xcXCIga2V5d29yZFxcblxcdFxcdGlmICggIXRoaXMuX2NyZWF0ZVdpZGdldCApIHtcXG5cXHRcXHRcXHRyZXR1cm4gbmV3IGNvbnN0cnVjdG9yKCBvcHRpb25zLCBlbGVtZW50ICk7XFxuXFx0XFx0fVxcblxcblxcdFxcdC8vIGFsbG93IGluc3RhbnRpYXRpb24gd2l0aG91dCBpbml0aWFsaXppbmcgZm9yIHNpbXBsZSBpbmhlcml0YW5jZVxcblxcdFxcdC8vIG11c3QgdXNlIFxcXCJuZXdcXFwiIGtleXdvcmQgKHRoZSBjb2RlIGFib3ZlIGFsd2F5cyBwYXNzZXMgYXJncylcXG5cXHRcXHRpZiAoIGFyZ3VtZW50cy5sZW5ndGggKSB7XFxuXFx0XFx0XFx0dGhpcy5fY3JlYXRlV2lkZ2V0KCBvcHRpb25zLCBlbGVtZW50ICk7XFxuXFx0XFx0fVxcblxcdH07XFxuXFx0Ly8gZXh0ZW5kIHdpdGggdGhlIGV4aXN0aW5nIGNvbnN0cnVjdG9yIHRvIGNhcnJ5IG92ZXIgYW55IHN0YXRpYyBwcm9wZXJ0aWVzXFxuXFx0JC5leHRlbmQoIGNvbnN0cnVjdG9yLCBleGlzdGluZ0NvbnN0cnVjdG9yLCB7XFxuXFx0XFx0dmVyc2lvbjogcHJvdG90eXBlLnZlcnNpb24sXFxuXFx0XFx0Ly8gY29weSB0aGUgb2JqZWN0IHVzZWQgdG8gY3JlYXRlIHRoZSBwcm90b3R5cGUgaW4gY2FzZSB3ZSBuZWVkIHRvXFxuXFx0XFx0Ly8gcmVkZWZpbmUgdGhlIHdpZGdldCBsYXRlclxcblxcdFxcdF9wcm90bzogJC5leHRlbmQoIHt9LCBwcm90b3R5cGUgKSxcXG5cXHRcXHQvLyB0cmFjayB3aWRnZXRzIHRoYXQgaW5oZXJpdCBmcm9tIHRoaXMgd2lkZ2V0IGluIGNhc2UgdGhpcyB3aWRnZXQgaXNcXG5cXHRcXHQvLyByZWRlZmluZWQgYWZ0ZXIgYSB3aWRnZXQgaW5oZXJpdHMgZnJvbSBpdFxcblxcdFxcdF9jaGlsZENvbnN0cnVjdG9yczogW11cXG5cXHR9KTtcXG5cXG5cXHRiYXNlUHJvdG90eXBlID0gbmV3IGJhc2UoKTtcXG5cXHQvLyB3ZSBuZWVkIHRvIG1ha2UgdGhlIG9wdGlvbnMgaGFzaCBhIHByb3BlcnR5IGRpcmVjdGx5IG9uIHRoZSBuZXcgaW5zdGFuY2VcXG5cXHQvLyBvdGhlcndpc2Ugd2UnbGwgbW9kaWZ5IHRoZSBvcHRpb25zIGhhc2ggb24gdGhlIHByb3RvdHlwZSB0aGF0IHdlJ3JlXFxuXFx0Ly8gaW5oZXJpdGluZyBmcm9tXFxuXFx0YmFzZVByb3RvdHlwZS5vcHRpb25zID0gJC53aWRnZXQuZXh0ZW5kKCB7fSwgYmFzZVByb3RvdHlwZS5vcHRpb25zICk7XFxuXFx0JC5lYWNoKCBwcm90b3R5cGUsIGZ1bmN0aW9uKCBwcm9wLCB2YWx1ZSApIHtcXG5cXHRcXHRpZiAoICEkLmlzRnVuY3Rpb24oIHZhbHVlICkgKSB7XFxuXFx0XFx0XFx0cHJveGllZFByb3RvdHlwZVsgcHJvcCBdID0gdmFsdWU7XFxuXFx0XFx0XFx0cmV0dXJuO1xcblxcdFxcdH1cXG5cXHRcXHRwcm94aWVkUHJvdG90eXBlWyBwcm9wIF0gPSAoZnVuY3Rpb24oKSB7XFxuXFx0XFx0XFx0dmFyIF9zdXBlciA9IGZ1bmN0aW9uKCkge1xcblxcdFxcdFxcdFxcdFxcdHJldHVybiBiYXNlLnByb3RvdHlwZVsgcHJvcCBdLmFwcGx5KCB0aGlzLCBhcmd1bWVudHMgKTtcXG5cXHRcXHRcXHRcXHR9LFxcblxcdFxcdFxcdFxcdF9zdXBlckFwcGx5ID0gZnVuY3Rpb24oIGFyZ3MgKSB7XFxuXFx0XFx0XFx0XFx0XFx0cmV0dXJuIGJhc2UucHJvdG90eXBlWyBwcm9wIF0uYXBwbHkoIHRoaXMsIGFyZ3MgKTtcXG5cXHRcXHRcXHRcXHR9O1xcblxcdFxcdFxcdHJldHVybiBmdW5jdGlvbigpIHtcXG5cXHRcXHRcXHRcXHR2YXIgX19zdXBlciA9IHRoaXMuX3N1cGVyLFxcblxcdFxcdFxcdFxcdFxcdF9fc3VwZXJBcHBseSA9IHRoaXMuX3N1cGVyQXBwbHksXFxuXFx0XFx0XFx0XFx0XFx0cmV0dXJuVmFsdWU7XFxuXFxuXFx0XFx0XFx0XFx0dGhpcy5fc3VwZXIgPSBfc3VwZXI7XFxuXFx0XFx0XFx0XFx0dGhpcy5fc3VwZXJBcHBseSA9IF9zdXBlckFwcGx5O1xcblxcblxcdFxcdFxcdFxcdHJldHVyblZhbHVlID0gdmFsdWUuYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApO1xcblxcblxcdFxcdFxcdFxcdHRoaXMuX3N1cGVyID0gX19zdXBlcjtcXG5cXHRcXHRcXHRcXHR0aGlzLl9zdXBlckFwcGx5ID0gX19zdXBlckFwcGx5O1xcblxcblxcdFxcdFxcdFxcdHJldHVybiByZXR1cm5WYWx1ZTtcXG5cXHRcXHRcXHR9O1xcblxcdFxcdH0pKCk7XFxuXFx0fSk7XFxuXFx0Y29uc3RydWN0b3IucHJvdG90eXBlID0gJC53aWRnZXQuZXh0ZW5kKCBiYXNlUHJvdG90eXBlLCB7XFxuXFx0XFx0Ly8gVE9ETzogcmVtb3ZlIHN1cHBvcnQgZm9yIHdpZGdldEV2ZW50UHJlZml4XFxuXFx0XFx0Ly8gYWx3YXlzIHVzZSB0aGUgbmFtZSArIGEgY29sb24gYXMgdGhlIHByZWZpeCwgZS5nLiwgZHJhZ2dhYmxlOnN0YXJ0XFxuXFx0XFx0Ly8gZG9uJ3QgcHJlZml4IGZvciB3aWRnZXRzIHRoYXQgYXJlbid0IERPTS1iYXNlZFxcblxcdFxcdHdpZGdldEV2ZW50UHJlZml4OiBleGlzdGluZ0NvbnN0cnVjdG9yID8gYmFzZVByb3RvdHlwZS53aWRnZXRFdmVudFByZWZpeCA6IG5hbWVcXG5cXHR9LCBwcm94aWVkUHJvdG90eXBlLCB7XFxuXFx0XFx0Y29uc3RydWN0b3I6IGNvbnN0cnVjdG9yLFxcblxcdFxcdG5hbWVzcGFjZTogbmFtZXNwYWNlLFxcblxcdFxcdHdpZGdldE5hbWU6IG5hbWUsXFxuXFx0XFx0d2lkZ2V0RnVsbE5hbWU6IGZ1bGxOYW1lXFxuXFx0fSk7XFxuXFxuXFx0Ly8gSWYgdGhpcyB3aWRnZXQgaXMgYmVpbmcgcmVkZWZpbmVkIHRoZW4gd2UgbmVlZCB0byBmaW5kIGFsbCB3aWRnZXRzIHRoYXRcXG5cXHQvLyBhcmUgaW5oZXJpdGluZyBmcm9tIGl0IGFuZCByZWRlZmluZSBhbGwgb2YgdGhlbSBzbyB0aGF0IHRoZXkgaW5oZXJpdCBmcm9tXFxuXFx0Ly8gdGhlIG5ldyB2ZXJzaW9uIG9mIHRoaXMgd2lkZ2V0LiBXZSdyZSBlc3NlbnRpYWxseSB0cnlpbmcgdG8gcmVwbGFjZSBvbmVcXG5cXHQvLyBsZXZlbCBpbiB0aGUgcHJvdG90eXBlIGNoYWluLlxcblxcdGlmICggZXhpc3RpbmdDb25zdHJ1Y3RvciApIHtcXG5cXHRcXHQkLmVhY2goIGV4aXN0aW5nQ29uc3RydWN0b3IuX2NoaWxkQ29uc3RydWN0b3JzLCBmdW5jdGlvbiggaSwgY2hpbGQgKSB7XFxuXFx0XFx0XFx0dmFyIGNoaWxkUHJvdG90eXBlID0gY2hpbGQucHJvdG90eXBlO1xcblxcblxcdFxcdFxcdC8vIHJlZGVmaW5lIHRoZSBjaGlsZCB3aWRnZXQgdXNpbmcgdGhlIHNhbWUgcHJvdG90eXBlIHRoYXQgd2FzXFxuXFx0XFx0XFx0Ly8gb3JpZ2luYWxseSB1c2VkLCBidXQgaW5oZXJpdCBmcm9tIHRoZSBuZXcgdmVyc2lvbiBvZiB0aGUgYmFzZVxcblxcdFxcdFxcdCQud2lkZ2V0KCBjaGlsZFByb3RvdHlwZS5uYW1lc3BhY2UgKyBcXFwiLlxcXCIgKyBjaGlsZFByb3RvdHlwZS53aWRnZXROYW1lLCBjb25zdHJ1Y3RvciwgY2hpbGQuX3Byb3RvICk7XFxuXFx0XFx0fSk7XFxuXFx0XFx0Ly8gcmVtb3ZlIHRoZSBsaXN0IG9mIGV4aXN0aW5nIGNoaWxkIGNvbnN0cnVjdG9ycyBmcm9tIHRoZSBvbGQgY29uc3RydWN0b3JcXG5cXHRcXHQvLyBzbyB0aGUgb2xkIGNoaWxkIGNvbnN0cnVjdG9ycyBjYW4gYmUgZ2FyYmFnZSBjb2xsZWN0ZWRcXG5cXHRcXHRkZWxldGUgZXhpc3RpbmdDb25zdHJ1Y3Rvci5fY2hpbGRDb25zdHJ1Y3RvcnM7XFxuXFx0fSBlbHNlIHtcXG5cXHRcXHRiYXNlLl9jaGlsZENvbnN0cnVjdG9ycy5wdXNoKCBjb25zdHJ1Y3RvciApO1xcblxcdH1cXG5cXG5cXHQkLndpZGdldC5icmlkZ2UoIG5hbWUsIGNvbnN0cnVjdG9yICk7XFxufTtcXG5cXG4kLndpZGdldC5leHRlbmQgPSBmdW5jdGlvbiggdGFyZ2V0ICkge1xcblxcdHZhciBpbnB1dCA9IHNsaWNlLmNhbGwoIGFyZ3VtZW50cywgMSApLFxcblxcdFxcdGlucHV0SW5kZXggPSAwLFxcblxcdFxcdGlucHV0TGVuZ3RoID0gaW5wdXQubGVuZ3RoLFxcblxcdFxcdGtleSxcXG5cXHRcXHR2YWx1ZTtcXG5cXHRmb3IgKCA7IGlucHV0SW5kZXggPCBpbnB1dExlbmd0aDsgaW5wdXRJbmRleCsrICkge1xcblxcdFxcdGZvciAoIGtleSBpbiBpbnB1dFsgaW5wdXRJbmRleCBdICkge1xcblxcdFxcdFxcdHZhbHVlID0gaW5wdXRbIGlucHV0SW5kZXggXVsga2V5IF07XFxuXFx0XFx0XFx0aWYgKCBpbnB1dFsgaW5wdXRJbmRleCBdLmhhc093blByb3BlcnR5KCBrZXkgKSAmJiB2YWx1ZSAhPT0gdW5kZWZpbmVkICkge1xcblxcdFxcdFxcdFxcdC8vIENsb25lIG9iamVjdHNcXG5cXHRcXHRcXHRcXHRpZiAoICQuaXNQbGFpbk9iamVjdCggdmFsdWUgKSApIHtcXG5cXHRcXHRcXHRcXHRcXHR0YXJnZXRbIGtleSBdID0gJC5pc1BsYWluT2JqZWN0KCB0YXJnZXRbIGtleSBdICkgP1xcblxcdFxcdFxcdFxcdFxcdFxcdCQud2lkZ2V0LmV4dGVuZCgge30sIHRhcmdldFsga2V5IF0sIHZhbHVlICkgOlxcblxcdFxcdFxcdFxcdFxcdFxcdC8vIERvbid0IGV4dGVuZCBzdHJpbmdzLCBhcnJheXMsIGV0Yy4gd2l0aCBvYmplY3RzXFxuXFx0XFx0XFx0XFx0XFx0XFx0JC53aWRnZXQuZXh0ZW5kKCB7fSwgdmFsdWUgKTtcXG5cXHRcXHRcXHRcXHQvLyBDb3B5IGV2ZXJ5dGhpbmcgZWxzZSBieSByZWZlcmVuY2VcXG5cXHRcXHRcXHRcXHR9IGVsc2Uge1xcblxcdFxcdFxcdFxcdFxcdHRhcmdldFsga2V5IF0gPSB2YWx1ZTtcXG5cXHRcXHRcXHRcXHR9XFxuXFx0XFx0XFx0fVxcblxcdFxcdH1cXG5cXHR9XFxuXFx0cmV0dXJuIHRhcmdldDtcXG59O1xcblxcbiQud2lkZ2V0LmJyaWRnZSA9IGZ1bmN0aW9uKCBuYW1lLCBvYmplY3QgKSB7XFxuXFx0dmFyIGZ1bGxOYW1lID0gb2JqZWN0LnByb3RvdHlwZS53aWRnZXRGdWxsTmFtZSB8fCBuYW1lO1xcblxcdCQuZm5bIG5hbWUgXSA9IGZ1bmN0aW9uKCBvcHRpb25zICkge1xcblxcdFxcdHZhciBpc01ldGhvZENhbGwgPSB0eXBlb2Ygb3B0aW9ucyA9PT0gXFxcInN0cmluZ1xcXCIsXFxuXFx0XFx0XFx0YXJncyA9IHNsaWNlLmNhbGwoIGFyZ3VtZW50cywgMSApLFxcblxcdFxcdFxcdHJldHVyblZhbHVlID0gdGhpcztcXG5cXG5cXHRcXHQvLyBhbGxvdyBtdWx0aXBsZSBoYXNoZXMgdG8gYmUgcGFzc2VkIG9uIGluaXRcXG5cXHRcXHRvcHRpb25zID0gIWlzTWV0aG9kQ2FsbCAmJiBhcmdzLmxlbmd0aCA/XFxuXFx0XFx0XFx0JC53aWRnZXQuZXh0ZW5kLmFwcGx5KCBudWxsLCBbIG9wdGlvbnMgXS5jb25jYXQoYXJncykgKSA6XFxuXFx0XFx0XFx0b3B0aW9ucztcXG5cXG5cXHRcXHRpZiAoIGlzTWV0aG9kQ2FsbCApIHtcXG5cXHRcXHRcXHR0aGlzLmVhY2goZnVuY3Rpb24oKSB7XFxuXFx0XFx0XFx0XFx0dmFyIG1ldGhvZFZhbHVlLFxcblxcdFxcdFxcdFxcdFxcdGluc3RhbmNlID0gJC5kYXRhKCB0aGlzLCBmdWxsTmFtZSApO1xcblxcdFxcdFxcdFxcdGlmICggIWluc3RhbmNlICkge1xcblxcdFxcdFxcdFxcdFxcdHJldHVybiAkLmVycm9yKCBcXFwiY2Fubm90IGNhbGwgbWV0aG9kcyBvbiBcXFwiICsgbmFtZSArIFxcXCIgcHJpb3IgdG8gaW5pdGlhbGl6YXRpb247IFxcXCIgK1xcblxcdFxcdFxcdFxcdFxcdFxcdFxcXCJhdHRlbXB0ZWQgdG8gY2FsbCBtZXRob2QgJ1xcXCIgKyBvcHRpb25zICsgXFxcIidcXFwiICk7XFxuXFx0XFx0XFx0XFx0fVxcblxcdFxcdFxcdFxcdGlmICggISQuaXNGdW5jdGlvbiggaW5zdGFuY2Vbb3B0aW9uc10gKSB8fCBvcHRpb25zLmNoYXJBdCggMCApID09PSBcXFwiX1xcXCIgKSB7XFxuXFx0XFx0XFx0XFx0XFx0cmV0dXJuICQuZXJyb3IoIFxcXCJubyBzdWNoIG1ldGhvZCAnXFxcIiArIG9wdGlvbnMgKyBcXFwiJyBmb3IgXFxcIiArIG5hbWUgKyBcXFwiIHdpZGdldCBpbnN0YW5jZVxcXCIgKTtcXG5cXHRcXHRcXHRcXHR9XFxuXFx0XFx0XFx0XFx0bWV0aG9kVmFsdWUgPSBpbnN0YW5jZVsgb3B0aW9ucyBdLmFwcGx5KCBpbnN0YW5jZSwgYXJncyApO1xcblxcdFxcdFxcdFxcdGlmICggbWV0aG9kVmFsdWUgIT09IGluc3RhbmNlICYmIG1ldGhvZFZhbHVlICE9PSB1bmRlZmluZWQgKSB7XFxuXFx0XFx0XFx0XFx0XFx0cmV0dXJuVmFsdWUgPSBtZXRob2RWYWx1ZSAmJiBtZXRob2RWYWx1ZS5qcXVlcnkgP1xcblxcdFxcdFxcdFxcdFxcdFxcdHJldHVyblZhbHVlLnB1c2hTdGFjayggbWV0aG9kVmFsdWUuZ2V0KCkgKSA6XFxuXFx0XFx0XFx0XFx0XFx0XFx0bWV0aG9kVmFsdWU7XFxuXFx0XFx0XFx0XFx0XFx0cmV0dXJuIGZhbHNlO1xcblxcdFxcdFxcdFxcdH1cXG5cXHRcXHRcXHR9KTtcXG5cXHRcXHR9IGVsc2Uge1xcblxcdFxcdFxcdHRoaXMuZWFjaChmdW5jdGlvbigpIHtcXG5cXHRcXHRcXHRcXHR2YXIgaW5zdGFuY2UgPSAkLmRhdGEoIHRoaXMsIGZ1bGxOYW1lICk7XFxuXFx0XFx0XFx0XFx0aWYgKCBpbnN0YW5jZSApIHtcXG5cXHRcXHRcXHRcXHRcXHRpbnN0YW5jZS5vcHRpb24oIG9wdGlvbnMgfHwge30gKS5faW5pdCgpO1xcblxcdFxcdFxcdFxcdH0gZWxzZSB7XFxuXFx0XFx0XFx0XFx0XFx0JC5kYXRhKCB0aGlzLCBmdWxsTmFtZSwgbmV3IG9iamVjdCggb3B0aW9ucywgdGhpcyApICk7XFxuXFx0XFx0XFx0XFx0fVxcblxcdFxcdFxcdH0pO1xcblxcdFxcdH1cXG5cXG5cXHRcXHRyZXR1cm4gcmV0dXJuVmFsdWU7XFxuXFx0fTtcXG59O1xcblxcbiQuV2lkZ2V0ID0gZnVuY3Rpb24oIC8qIG9wdGlvbnMsIGVsZW1lbnQgKi8gKSB7fTtcXG4kLldpZGdldC5fY2hpbGRDb25zdHJ1Y3RvcnMgPSBbXTtcXG5cXG4kLldpZGdldC5wcm90b3R5cGUgPSB7XFxuXFx0d2lkZ2V0TmFtZTogXFxcIndpZGdldFxcXCIsXFxuXFx0d2lkZ2V0RXZlbnRQcmVmaXg6IFxcXCJcXFwiLFxcblxcdGRlZmF1bHRFbGVtZW50OiBcXFwiPGRpdj5cXFwiLFxcblxcdG9wdGlvbnM6IHtcXG5cXHRcXHRkaXNhYmxlZDogZmFsc2UsXFxuXFxuXFx0XFx0Ly8gY2FsbGJhY2tzXFxuXFx0XFx0Y3JlYXRlOiBudWxsXFxuXFx0fSxcXG5cXHRfY3JlYXRlV2lkZ2V0OiBmdW5jdGlvbiggb3B0aW9ucywgZWxlbWVudCApIHtcXG5cXHRcXHRlbGVtZW50ID0gJCggZWxlbWVudCB8fCB0aGlzLmRlZmF1bHRFbGVtZW50IHx8IHRoaXMgKVsgMCBdO1xcblxcdFxcdHRoaXMuZWxlbWVudCA9ICQoIGVsZW1lbnQgKTtcXG5cXHRcXHR0aGlzLnV1aWQgPSB1dWlkKys7XFxuXFx0XFx0dGhpcy5ldmVudE5hbWVzcGFjZSA9IFxcXCIuXFxcIiArIHRoaXMud2lkZ2V0TmFtZSArIHRoaXMudXVpZDtcXG5cXHRcXHR0aGlzLm9wdGlvbnMgPSAkLndpZGdldC5leHRlbmQoIHt9LFxcblxcdFxcdFxcdHRoaXMub3B0aW9ucyxcXG5cXHRcXHRcXHR0aGlzLl9nZXRDcmVhdGVPcHRpb25zKCksXFxuXFx0XFx0XFx0b3B0aW9ucyApO1xcblxcblxcdFxcdHRoaXMuYmluZGluZ3MgPSAkKCk7XFxuXFx0XFx0dGhpcy5ob3ZlcmFibGUgPSAkKCk7XFxuXFx0XFx0dGhpcy5mb2N1c2FibGUgPSAkKCk7XFxuXFxuXFx0XFx0aWYgKCBlbGVtZW50ICE9PSB0aGlzICkge1xcblxcdFxcdFxcdCQuZGF0YSggZWxlbWVudCwgdGhpcy53aWRnZXRGdWxsTmFtZSwgdGhpcyApO1xcblxcdFxcdFxcdHRoaXMuX29uKCB0cnVlLCB0aGlzLmVsZW1lbnQsIHtcXG5cXHRcXHRcXHRcXHRyZW1vdmU6IGZ1bmN0aW9uKCBldmVudCApIHtcXG5cXHRcXHRcXHRcXHRcXHRpZiAoIGV2ZW50LnRhcmdldCA9PT0gZWxlbWVudCApIHtcXG5cXHRcXHRcXHRcXHRcXHRcXHR0aGlzLmRlc3Ryb3koKTtcXG5cXHRcXHRcXHRcXHRcXHR9XFxuXFx0XFx0XFx0XFx0fVxcblxcdFxcdFxcdH0pO1xcblxcdFxcdFxcdHRoaXMuZG9jdW1lbnQgPSAkKCBlbGVtZW50LnN0eWxlID9cXG5cXHRcXHRcXHRcXHQvLyBlbGVtZW50IHdpdGhpbiB0aGUgZG9jdW1lbnRcXG5cXHRcXHRcXHRcXHRlbGVtZW50Lm93bmVyRG9jdW1lbnQgOlxcblxcdFxcdFxcdFxcdC8vIGVsZW1lbnQgaXMgd2luZG93IG9yIGRvY3VtZW50XFxuXFx0XFx0XFx0XFx0ZWxlbWVudC5kb2N1bWVudCB8fCBlbGVtZW50ICk7XFxuXFx0XFx0XFx0dGhpcy53aW5kb3cgPSAkKCB0aGlzLmRvY3VtZW50WzBdLmRlZmF1bHRWaWV3IHx8IHRoaXMuZG9jdW1lbnRbMF0ucGFyZW50V2luZG93ICk7XFxuXFx0XFx0fVxcblxcblxcdFxcdHRoaXMuX2NyZWF0ZSgpO1xcblxcdFxcdHRoaXMuX3RyaWdnZXIoIFxcXCJjcmVhdGVcXFwiLCBudWxsLCB0aGlzLl9nZXRDcmVhdGVFdmVudERhdGEoKSApO1xcblxcdFxcdHRoaXMuX2luaXQoKTtcXG5cXHR9LFxcblxcdF9nZXRDcmVhdGVPcHRpb25zOiAkLm5vb3AsXFxuXFx0X2dldENyZWF0ZUV2ZW50RGF0YTogJC5ub29wLFxcblxcdF9jcmVhdGU6ICQubm9vcCxcXG5cXHRfaW5pdDogJC5ub29wLFxcblxcblxcdGRlc3Ryb3k6IGZ1bmN0aW9uKCkge1xcblxcdFxcdHRoaXMuX2Rlc3Ryb3koKTtcXG5cXHRcXHQvLyB3ZSBjYW4gcHJvYmFibHkgcmVtb3ZlIHRoZSB1bmJpbmQgY2FsbHMgaW4gMi4wXFxuXFx0XFx0Ly8gYWxsIGV2ZW50IGJpbmRpbmdzIHNob3VsZCBnbyB0aHJvdWdoIHRoaXMuX29uKClcXG5cXHRcXHR0aGlzLmVsZW1lbnRcXG5cXHRcXHRcXHQudW5iaW5kKCB0aGlzLmV2ZW50TmFtZXNwYWNlIClcXG5cXHRcXHRcXHQvLyAxLjkgQkMgZm9yICM3ODEwXFxuXFx0XFx0XFx0Ly8gVE9ETyByZW1vdmUgZHVhbCBzdG9yYWdlXFxuXFx0XFx0XFx0LnJlbW92ZURhdGEoIHRoaXMud2lkZ2V0TmFtZSApXFxuXFx0XFx0XFx0LnJlbW92ZURhdGEoIHRoaXMud2lkZ2V0RnVsbE5hbWUgKVxcblxcdFxcdFxcdC8vIHN1cHBvcnQ6IGpxdWVyeSA8MS42LjNcXG5cXHRcXHRcXHQvLyBodHRwOi8vYnVncy5qcXVlcnkuY29tL3RpY2tldC85NDEzXFxuXFx0XFx0XFx0LnJlbW92ZURhdGEoICQuY2FtZWxDYXNlKCB0aGlzLndpZGdldEZ1bGxOYW1lICkgKTtcXG5cXHRcXHR0aGlzLndpZGdldCgpXFxuXFx0XFx0XFx0LnVuYmluZCggdGhpcy5ldmVudE5hbWVzcGFjZSApXFxuXFx0XFx0XFx0LnJlbW92ZUF0dHIoIFxcXCJhcmlhLWRpc2FibGVkXFxcIiApXFxuXFx0XFx0XFx0LnJlbW92ZUNsYXNzKFxcblxcdFxcdFxcdFxcdHRoaXMud2lkZ2V0RnVsbE5hbWUgKyBcXFwiLWRpc2FibGVkIFxcXCIgK1xcblxcdFxcdFxcdFxcdFxcXCJ1aS1zdGF0ZS1kaXNhYmxlZFxcXCIgKTtcXG5cXG5cXHRcXHQvLyBjbGVhbiB1cCBldmVudHMgYW5kIHN0YXRlc1xcblxcdFxcdHRoaXMuYmluZGluZ3MudW5iaW5kKCB0aGlzLmV2ZW50TmFtZXNwYWNlICk7XFxuXFx0XFx0dGhpcy5ob3ZlcmFibGUucmVtb3ZlQ2xhc3MoIFxcXCJ1aS1zdGF0ZS1ob3ZlclxcXCIgKTtcXG5cXHRcXHR0aGlzLmZvY3VzYWJsZS5yZW1vdmVDbGFzcyggXFxcInVpLXN0YXRlLWZvY3VzXFxcIiApO1xcblxcdH0sXFxuXFx0X2Rlc3Ryb3k6ICQubm9vcCxcXG5cXG5cXHR3aWRnZXQ6IGZ1bmN0aW9uKCkge1xcblxcdFxcdHJldHVybiB0aGlzLmVsZW1lbnQ7XFxuXFx0fSxcXG5cXG5cXHRvcHRpb246IGZ1bmN0aW9uKCBrZXksIHZhbHVlICkge1xcblxcdFxcdHZhciBvcHRpb25zID0ga2V5LFxcblxcdFxcdFxcdHBhcnRzLFxcblxcdFxcdFxcdGN1ck9wdGlvbixcXG5cXHRcXHRcXHRpO1xcblxcblxcdFxcdGlmICggYXJndW1lbnRzLmxlbmd0aCA9PT0gMCApIHtcXG5cXHRcXHRcXHQvLyBkb24ndCByZXR1cm4gYSByZWZlcmVuY2UgdG8gdGhlIGludGVybmFsIGhhc2hcXG5cXHRcXHRcXHRyZXR1cm4gJC53aWRnZXQuZXh0ZW5kKCB7fSwgdGhpcy5vcHRpb25zICk7XFxuXFx0XFx0fVxcblxcblxcdFxcdGlmICggdHlwZW9mIGtleSA9PT0gXFxcInN0cmluZ1xcXCIgKSB7XFxuXFx0XFx0XFx0Ly8gaGFuZGxlIG5lc3RlZCBrZXlzLCBlLmcuLCBcXFwiZm9vLmJhclxcXCIgPT4geyBmb286IHsgYmFyOiBfX18gfSB9XFxuXFx0XFx0XFx0b3B0aW9ucyA9IHt9O1xcblxcdFxcdFxcdHBhcnRzID0ga2V5LnNwbGl0KCBcXFwiLlxcXCIgKTtcXG5cXHRcXHRcXHRrZXkgPSBwYXJ0cy5zaGlmdCgpO1xcblxcdFxcdFxcdGlmICggcGFydHMubGVuZ3RoICkge1xcblxcdFxcdFxcdFxcdGN1ck9wdGlvbiA9IG9wdGlvbnNbIGtleSBdID0gJC53aWRnZXQuZXh0ZW5kKCB7fSwgdGhpcy5vcHRpb25zWyBrZXkgXSApO1xcblxcdFxcdFxcdFxcdGZvciAoIGkgPSAwOyBpIDwgcGFydHMubGVuZ3RoIC0gMTsgaSsrICkge1xcblxcdFxcdFxcdFxcdFxcdGN1ck9wdGlvblsgcGFydHNbIGkgXSBdID0gY3VyT3B0aW9uWyBwYXJ0c1sgaSBdIF0gfHwge307XFxuXFx0XFx0XFx0XFx0XFx0Y3VyT3B0aW9uID0gY3VyT3B0aW9uWyBwYXJ0c1sgaSBdIF07XFxuXFx0XFx0XFx0XFx0fVxcblxcdFxcdFxcdFxcdGtleSA9IHBhcnRzLnBvcCgpO1xcblxcdFxcdFxcdFxcdGlmICggdmFsdWUgPT09IHVuZGVmaW5lZCApIHtcXG5cXHRcXHRcXHRcXHRcXHRyZXR1cm4gY3VyT3B0aW9uWyBrZXkgXSA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IGN1ck9wdGlvblsga2V5IF07XFxuXFx0XFx0XFx0XFx0fVxcblxcdFxcdFxcdFxcdGN1ck9wdGlvblsga2V5IF0gPSB2YWx1ZTtcXG5cXHRcXHRcXHR9IGVsc2Uge1xcblxcdFxcdFxcdFxcdGlmICggdmFsdWUgPT09IHVuZGVmaW5lZCApIHtcXG5cXHRcXHRcXHRcXHRcXHRyZXR1cm4gdGhpcy5vcHRpb25zWyBrZXkgXSA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IHRoaXMub3B0aW9uc1sga2V5IF07XFxuXFx0XFx0XFx0XFx0fVxcblxcdFxcdFxcdFxcdG9wdGlvbnNbIGtleSBdID0gdmFsdWU7XFxuXFx0XFx0XFx0fVxcblxcdFxcdH1cXG5cXG5cXHRcXHR0aGlzLl9zZXRPcHRpb25zKCBvcHRpb25zICk7XFxuXFxuXFx0XFx0cmV0dXJuIHRoaXM7XFxuXFx0fSxcXG5cXHRfc2V0T3B0aW9uczogZnVuY3Rpb24oIG9wdGlvbnMgKSB7XFxuXFx0XFx0dmFyIGtleTtcXG5cXG5cXHRcXHRmb3IgKCBrZXkgaW4gb3B0aW9ucyApIHtcXG5cXHRcXHRcXHR0aGlzLl9zZXRPcHRpb24oIGtleSwgb3B0aW9uc1sga2V5IF0gKTtcXG5cXHRcXHR9XFxuXFxuXFx0XFx0cmV0dXJuIHRoaXM7XFxuXFx0fSxcXG5cXHRfc2V0T3B0aW9uOiBmdW5jdGlvbigga2V5LCB2YWx1ZSApIHtcXG5cXHRcXHR0aGlzLm9wdGlvbnNbIGtleSBdID0gdmFsdWU7XFxuXFxuXFx0XFx0aWYgKCBrZXkgPT09IFxcXCJkaXNhYmxlZFxcXCIgKSB7XFxuXFx0XFx0XFx0dGhpcy53aWRnZXQoKVxcblxcdFxcdFxcdFxcdC50b2dnbGVDbGFzcyggdGhpcy53aWRnZXRGdWxsTmFtZSArIFxcXCItZGlzYWJsZWQgdWktc3RhdGUtZGlzYWJsZWRcXFwiLCAhIXZhbHVlIClcXG5cXHRcXHRcXHRcXHQuYXR0ciggXFxcImFyaWEtZGlzYWJsZWRcXFwiLCB2YWx1ZSApO1xcblxcdFxcdFxcdHRoaXMuaG92ZXJhYmxlLnJlbW92ZUNsYXNzKCBcXFwidWktc3RhdGUtaG92ZXJcXFwiICk7XFxuXFx0XFx0XFx0dGhpcy5mb2N1c2FibGUucmVtb3ZlQ2xhc3MoIFxcXCJ1aS1zdGF0ZS1mb2N1c1xcXCIgKTtcXG5cXHRcXHR9XFxuXFxuXFx0XFx0cmV0dXJuIHRoaXM7XFxuXFx0fSxcXG5cXG5cXHRlbmFibGU6IGZ1bmN0aW9uKCkge1xcblxcdFxcdHJldHVybiB0aGlzLl9zZXRPcHRpb24oIFxcXCJkaXNhYmxlZFxcXCIsIGZhbHNlICk7XFxuXFx0fSxcXG5cXHRkaXNhYmxlOiBmdW5jdGlvbigpIHtcXG5cXHRcXHRyZXR1cm4gdGhpcy5fc2V0T3B0aW9uKCBcXFwiZGlzYWJsZWRcXFwiLCB0cnVlICk7XFxuXFx0fSxcXG5cXG5cXHRfb246IGZ1bmN0aW9uKCBzdXBwcmVzc0Rpc2FibGVkQ2hlY2ssIGVsZW1lbnQsIGhhbmRsZXJzICkge1xcblxcdFxcdHZhciBkZWxlZ2F0ZUVsZW1lbnQsXFxuXFx0XFx0XFx0aW5zdGFuY2UgPSB0aGlzO1xcblxcblxcdFxcdC8vIG5vIHN1cHByZXNzRGlzYWJsZWRDaGVjayBmbGFnLCBzaHVmZmxlIGFyZ3VtZW50c1xcblxcdFxcdGlmICggdHlwZW9mIHN1cHByZXNzRGlzYWJsZWRDaGVjayAhPT0gXFxcImJvb2xlYW5cXFwiICkge1xcblxcdFxcdFxcdGhhbmRsZXJzID0gZWxlbWVudDtcXG5cXHRcXHRcXHRlbGVtZW50ID0gc3VwcHJlc3NEaXNhYmxlZENoZWNrO1xcblxcdFxcdFxcdHN1cHByZXNzRGlzYWJsZWRDaGVjayA9IGZhbHNlO1xcblxcdFxcdH1cXG5cXG5cXHRcXHQvLyBubyBlbGVtZW50IGFyZ3VtZW50LCBzaHVmZmxlIGFuZCB1c2UgdGhpcy5lbGVtZW50XFxuXFx0XFx0aWYgKCAhaGFuZGxlcnMgKSB7XFxuXFx0XFx0XFx0aGFuZGxlcnMgPSBlbGVtZW50O1xcblxcdFxcdFxcdGVsZW1lbnQgPSB0aGlzLmVsZW1lbnQ7XFxuXFx0XFx0XFx0ZGVsZWdhdGVFbGVtZW50ID0gdGhpcy53aWRnZXQoKTtcXG5cXHRcXHR9IGVsc2Uge1xcblxcdFxcdFxcdC8vIGFjY2VwdCBzZWxlY3RvcnMsIERPTSBlbGVtZW50c1xcblxcdFxcdFxcdGVsZW1lbnQgPSBkZWxlZ2F0ZUVsZW1lbnQgPSAkKCBlbGVtZW50ICk7XFxuXFx0XFx0XFx0dGhpcy5iaW5kaW5ncyA9IHRoaXMuYmluZGluZ3MuYWRkKCBlbGVtZW50ICk7XFxuXFx0XFx0fVxcblxcblxcdFxcdCQuZWFjaCggaGFuZGxlcnMsIGZ1bmN0aW9uKCBldmVudCwgaGFuZGxlciApIHtcXG5cXHRcXHRcXHRmdW5jdGlvbiBoYW5kbGVyUHJveHkoKSB7XFxuXFx0XFx0XFx0XFx0Ly8gYWxsb3cgd2lkZ2V0cyB0byBjdXN0b21pemUgdGhlIGRpc2FibGVkIGhhbmRsaW5nXFxuXFx0XFx0XFx0XFx0Ly8gLSBkaXNhYmxlZCBhcyBhbiBhcnJheSBpbnN0ZWFkIG9mIGJvb2xlYW5cXG5cXHRcXHRcXHRcXHQvLyAtIGRpc2FibGVkIGNsYXNzIGFzIG1ldGhvZCBmb3IgZGlzYWJsaW5nIGluZGl2aWR1YWwgcGFydHNcXG5cXHRcXHRcXHRcXHRpZiAoICFzdXBwcmVzc0Rpc2FibGVkQ2hlY2sgJiZcXG5cXHRcXHRcXHRcXHRcXHRcXHQoIGluc3RhbmNlLm9wdGlvbnMuZGlzYWJsZWQgPT09IHRydWUgfHxcXG5cXHRcXHRcXHRcXHRcXHRcXHRcXHQkKCB0aGlzICkuaGFzQ2xhc3MoIFxcXCJ1aS1zdGF0ZS1kaXNhYmxlZFxcXCIgKSApICkge1xcblxcdFxcdFxcdFxcdFxcdHJldHVybjtcXG5cXHRcXHRcXHRcXHR9XFxuXFx0XFx0XFx0XFx0cmV0dXJuICggdHlwZW9mIGhhbmRsZXIgPT09IFxcXCJzdHJpbmdcXFwiID8gaW5zdGFuY2VbIGhhbmRsZXIgXSA6IGhhbmRsZXIgKVxcblxcdFxcdFxcdFxcdFxcdC5hcHBseSggaW5zdGFuY2UsIGFyZ3VtZW50cyApO1xcblxcdFxcdFxcdH1cXG5cXG5cXHRcXHRcXHQvLyBjb3B5IHRoZSBndWlkIHNvIGRpcmVjdCB1bmJpbmRpbmcgd29ya3NcXG5cXHRcXHRcXHRpZiAoIHR5cGVvZiBoYW5kbGVyICE9PSBcXFwic3RyaW5nXFxcIiApIHtcXG5cXHRcXHRcXHRcXHRoYW5kbGVyUHJveHkuZ3VpZCA9IGhhbmRsZXIuZ3VpZCA9XFxuXFx0XFx0XFx0XFx0XFx0aGFuZGxlci5ndWlkIHx8IGhhbmRsZXJQcm94eS5ndWlkIHx8ICQuZ3VpZCsrO1xcblxcdFxcdFxcdH1cXG5cXG5cXHRcXHRcXHR2YXIgbWF0Y2ggPSBldmVudC5tYXRjaCggL14oXFxcXHcrKVxcXFxzKiguKikkLyApLFxcblxcdFxcdFxcdFxcdGV2ZW50TmFtZSA9IG1hdGNoWzFdICsgaW5zdGFuY2UuZXZlbnROYW1lc3BhY2UsXFxuXFx0XFx0XFx0XFx0c2VsZWN0b3IgPSBtYXRjaFsyXTtcXG5cXHRcXHRcXHRpZiAoIHNlbGVjdG9yICkge1xcblxcdFxcdFxcdFxcdGRlbGVnYXRlRWxlbWVudC5kZWxlZ2F0ZSggc2VsZWN0b3IsIGV2ZW50TmFtZSwgaGFuZGxlclByb3h5ICk7XFxuXFx0XFx0XFx0fSBlbHNlIHtcXG5cXHRcXHRcXHRcXHRlbGVtZW50LmJpbmQoIGV2ZW50TmFtZSwgaGFuZGxlclByb3h5ICk7XFxuXFx0XFx0XFx0fVxcblxcdFxcdH0pO1xcblxcdH0sXFxuXFxuXFx0X29mZjogZnVuY3Rpb24oIGVsZW1lbnQsIGV2ZW50TmFtZSApIHtcXG5cXHRcXHRldmVudE5hbWUgPSAoZXZlbnROYW1lIHx8IFxcXCJcXFwiKS5zcGxpdCggXFxcIiBcXFwiICkuam9pbiggdGhpcy5ldmVudE5hbWVzcGFjZSArIFxcXCIgXFxcIiApICsgdGhpcy5ldmVudE5hbWVzcGFjZTtcXG5cXHRcXHRlbGVtZW50LnVuYmluZCggZXZlbnROYW1lICkudW5kZWxlZ2F0ZSggZXZlbnROYW1lICk7XFxuXFx0fSxcXG5cXG5cXHRfZGVsYXk6IGZ1bmN0aW9uKCBoYW5kbGVyLCBkZWxheSApIHtcXG5cXHRcXHRmdW5jdGlvbiBoYW5kbGVyUHJveHkoKSB7XFxuXFx0XFx0XFx0cmV0dXJuICggdHlwZW9mIGhhbmRsZXIgPT09IFxcXCJzdHJpbmdcXFwiID8gaW5zdGFuY2VbIGhhbmRsZXIgXSA6IGhhbmRsZXIgKVxcblxcdFxcdFxcdFxcdC5hcHBseSggaW5zdGFuY2UsIGFyZ3VtZW50cyApO1xcblxcdFxcdH1cXG5cXHRcXHR2YXIgaW5zdGFuY2UgPSB0aGlzO1xcblxcdFxcdHJldHVybiBzZXRUaW1lb3V0KCBoYW5kbGVyUHJveHksIGRlbGF5IHx8IDAgKTtcXG5cXHR9LFxcblxcblxcdF9ob3ZlcmFibGU6IGZ1bmN0aW9uKCBlbGVtZW50ICkge1xcblxcdFxcdHRoaXMuaG92ZXJhYmxlID0gdGhpcy5ob3ZlcmFibGUuYWRkKCBlbGVtZW50ICk7XFxuXFx0XFx0dGhpcy5fb24oIGVsZW1lbnQsIHtcXG5cXHRcXHRcXHRtb3VzZWVudGVyOiBmdW5jdGlvbiggZXZlbnQgKSB7XFxuXFx0XFx0XFx0XFx0JCggZXZlbnQuY3VycmVudFRhcmdldCApLmFkZENsYXNzKCBcXFwidWktc3RhdGUtaG92ZXJcXFwiICk7XFxuXFx0XFx0XFx0fSxcXG5cXHRcXHRcXHRtb3VzZWxlYXZlOiBmdW5jdGlvbiggZXZlbnQgKSB7XFxuXFx0XFx0XFx0XFx0JCggZXZlbnQuY3VycmVudFRhcmdldCApLnJlbW92ZUNsYXNzKCBcXFwidWktc3RhdGUtaG92ZXJcXFwiICk7XFxuXFx0XFx0XFx0fVxcblxcdFxcdH0pO1xcblxcdH0sXFxuXFxuXFx0X2ZvY3VzYWJsZTogZnVuY3Rpb24oIGVsZW1lbnQgKSB7XFxuXFx0XFx0dGhpcy5mb2N1c2FibGUgPSB0aGlzLmZvY3VzYWJsZS5hZGQoIGVsZW1lbnQgKTtcXG5cXHRcXHR0aGlzLl9vbiggZWxlbWVudCwge1xcblxcdFxcdFxcdGZvY3VzaW46IGZ1bmN0aW9uKCBldmVudCApIHtcXG5cXHRcXHRcXHRcXHQkKCBldmVudC5jdXJyZW50VGFyZ2V0ICkuYWRkQ2xhc3MoIFxcXCJ1aS1zdGF0ZS1mb2N1c1xcXCIgKTtcXG5cXHRcXHRcXHR9LFxcblxcdFxcdFxcdGZvY3Vzb3V0OiBmdW5jdGlvbiggZXZlbnQgKSB7XFxuXFx0XFx0XFx0XFx0JCggZXZlbnQuY3VycmVudFRhcmdldCApLnJlbW92ZUNsYXNzKCBcXFwidWktc3RhdGUtZm9jdXNcXFwiICk7XFxuXFx0XFx0XFx0fVxcblxcdFxcdH0pO1xcblxcdH0sXFxuXFxuXFx0X3RyaWdnZXI6IGZ1bmN0aW9uKCB0eXBlLCBldmVudCwgZGF0YSApIHtcXG5cXHRcXHR2YXIgcHJvcCwgb3JpZyxcXG5cXHRcXHRcXHRjYWxsYmFjayA9IHRoaXMub3B0aW9uc1sgdHlwZSBdO1xcblxcblxcdFxcdGRhdGEgPSBkYXRhIHx8IHt9O1xcblxcdFxcdGV2ZW50ID0gJC5FdmVudCggZXZlbnQgKTtcXG5cXHRcXHRldmVudC50eXBlID0gKCB0eXBlID09PSB0aGlzLndpZGdldEV2ZW50UHJlZml4ID9cXG5cXHRcXHRcXHR0eXBlIDpcXG5cXHRcXHRcXHR0aGlzLndpZGdldEV2ZW50UHJlZml4ICsgdHlwZSApLnRvTG93ZXJDYXNlKCk7XFxuXFx0XFx0Ly8gdGhlIG9yaWdpbmFsIGV2ZW50IG1heSBjb21lIGZyb20gYW55IGVsZW1lbnRcXG5cXHRcXHQvLyBzbyB3ZSBuZWVkIHRvIHJlc2V0IHRoZSB0YXJnZXQgb24gdGhlIG5ldyBldmVudFxcblxcdFxcdGV2ZW50LnRhcmdldCA9IHRoaXMuZWxlbWVudFsgMCBdO1xcblxcblxcdFxcdC8vIGNvcHkgb3JpZ2luYWwgZXZlbnQgcHJvcGVydGllcyBvdmVyIHRvIHRoZSBuZXcgZXZlbnRcXG5cXHRcXHRvcmlnID0gZXZlbnQub3JpZ2luYWxFdmVudDtcXG5cXHRcXHRpZiAoIG9yaWcgKSB7XFxuXFx0XFx0XFx0Zm9yICggcHJvcCBpbiBvcmlnICkge1xcblxcdFxcdFxcdFxcdGlmICggISggcHJvcCBpbiBldmVudCApICkge1xcblxcdFxcdFxcdFxcdFxcdGV2ZW50WyBwcm9wIF0gPSBvcmlnWyBwcm9wIF07XFxuXFx0XFx0XFx0XFx0fVxcblxcdFxcdFxcdH1cXG5cXHRcXHR9XFxuXFxuXFx0XFx0dGhpcy5lbGVtZW50LnRyaWdnZXIoIGV2ZW50LCBkYXRhICk7XFxuXFx0XFx0cmV0dXJuICEoICQuaXNGdW5jdGlvbiggY2FsbGJhY2sgKSAmJlxcblxcdFxcdFxcdGNhbGxiYWNrLmFwcGx5KCB0aGlzLmVsZW1lbnRbMF0sIFsgZXZlbnQgXS5jb25jYXQoIGRhdGEgKSApID09PSBmYWxzZSB8fFxcblxcdFxcdFxcdGV2ZW50LmlzRGVmYXVsdFByZXZlbnRlZCgpICk7XFxuXFx0fVxcbn07XFxuXFxuJC5lYWNoKCB7IHNob3c6IFxcXCJmYWRlSW5cXFwiLCBoaWRlOiBcXFwiZmFkZU91dFxcXCIgfSwgZnVuY3Rpb24oIG1ldGhvZCwgZGVmYXVsdEVmZmVjdCApIHtcXG5cXHQkLldpZGdldC5wcm90b3R5cGVbIFxcXCJfXFxcIiArIG1ldGhvZCBdID0gZnVuY3Rpb24oIGVsZW1lbnQsIG9wdGlvbnMsIGNhbGxiYWNrICkge1xcblxcdFxcdGlmICggdHlwZW9mIG9wdGlvbnMgPT09IFxcXCJzdHJpbmdcXFwiICkge1xcblxcdFxcdFxcdG9wdGlvbnMgPSB7IGVmZmVjdDogb3B0aW9ucyB9O1xcblxcdFxcdH1cXG5cXHRcXHR2YXIgaGFzT3B0aW9ucyxcXG5cXHRcXHRcXHRlZmZlY3ROYW1lID0gIW9wdGlvbnMgP1xcblxcdFxcdFxcdFxcdG1ldGhvZCA6XFxuXFx0XFx0XFx0XFx0b3B0aW9ucyA9PT0gdHJ1ZSB8fCB0eXBlb2Ygb3B0aW9ucyA9PT0gXFxcIm51bWJlclxcXCIgP1xcblxcdFxcdFxcdFxcdFxcdGRlZmF1bHRFZmZlY3QgOlxcblxcdFxcdFxcdFxcdFxcdG9wdGlvbnMuZWZmZWN0IHx8IGRlZmF1bHRFZmZlY3Q7XFxuXFx0XFx0b3B0aW9ucyA9IG9wdGlvbnMgfHwge307XFxuXFx0XFx0aWYgKCB0eXBlb2Ygb3B0aW9ucyA9PT0gXFxcIm51bWJlclxcXCIgKSB7XFxuXFx0XFx0XFx0b3B0aW9ucyA9IHsgZHVyYXRpb246IG9wdGlvbnMgfTtcXG5cXHRcXHR9XFxuXFx0XFx0aGFzT3B0aW9ucyA9ICEkLmlzRW1wdHlPYmplY3QoIG9wdGlvbnMgKTtcXG5cXHRcXHRvcHRpb25zLmNvbXBsZXRlID0gY2FsbGJhY2s7XFxuXFx0XFx0aWYgKCBvcHRpb25zLmRlbGF5ICkge1xcblxcdFxcdFxcdGVsZW1lbnQuZGVsYXkoIG9wdGlvbnMuZGVsYXkgKTtcXG5cXHRcXHR9XFxuXFx0XFx0aWYgKCBoYXNPcHRpb25zICYmICQuZWZmZWN0cyAmJiAkLmVmZmVjdHMuZWZmZWN0WyBlZmZlY3ROYW1lIF0gKSB7XFxuXFx0XFx0XFx0ZWxlbWVudFsgbWV0aG9kIF0oIG9wdGlvbnMgKTtcXG5cXHRcXHR9IGVsc2UgaWYgKCBlZmZlY3ROYW1lICE9PSBtZXRob2QgJiYgZWxlbWVudFsgZWZmZWN0TmFtZSBdICkge1xcblxcdFxcdFxcdGVsZW1lbnRbIGVmZmVjdE5hbWUgXSggb3B0aW9ucy5kdXJhdGlvbiwgb3B0aW9ucy5lYXNpbmcsIGNhbGxiYWNrICk7XFxuXFx0XFx0fSBlbHNlIHtcXG5cXHRcXHRcXHRlbGVtZW50LnF1ZXVlKGZ1bmN0aW9uKCBuZXh0ICkge1xcblxcdFxcdFxcdFxcdCQoIHRoaXMgKVsgbWV0aG9kIF0oKTtcXG5cXHRcXHRcXHRcXHRpZiAoIGNhbGxiYWNrICkge1xcblxcdFxcdFxcdFxcdFxcdGNhbGxiYWNrLmNhbGwoIGVsZW1lbnRbIDAgXSApO1xcblxcdFxcdFxcdFxcdH1cXG5cXHRcXHRcXHRcXHRuZXh0KCk7XFxuXFx0XFx0XFx0fSk7XFxuXFx0XFx0fVxcblxcdH07XFxufSk7XFxuXFxufSkpO1xcblwiXG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vcmF3LWxvYWRlciEuL2Jvd2VyX2NvbXBvbmVudHMvY2xvdWRpbmFyeV9qcy9qcy9qcXVlcnkudWkud2lkZ2V0LmpzXG4gKiogbW9kdWxlIGlkID0gMjdcbiAqKiBtb2R1bGUgY2h1bmtzID0gMjRcbiAqKi8iXSwibWFwcGluZ3MiOiJBQUFBIiwic291cmNlUm9vdCI6IiJ9");

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

	eval("__webpack_require__(16)(__webpack_require__(29))\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjguanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ib3dlcl9jb21wb25lbnRzL2Nsb3VkaW5hcnlfanMvanMvanF1ZXJ5LmZpbGV1cGxvYWQuanM/OTA1OSJdLCJzb3VyY2VzQ29udGVudCI6WyJyZXF1aXJlKFwiISEvaG9tZS9kZXBsb3llci9kZXBsb3ltZW50L2pzL25vZGVfbW9kdWxlcy9zY3JpcHQtbG9hZGVyL2FkZFNjcmlwdC5qc1wiKShyZXF1aXJlKFwiISEvaG9tZS9kZXBsb3llci9kZXBsb3ltZW50L2pzL25vZGVfbW9kdWxlcy9yYXctbG9hZGVyL2luZGV4LmpzIS9ob21lL2RlcGxveWVyL2RlcGxveW1lbnQvanMvYm93ZXJfY29tcG9uZW50cy9jbG91ZGluYXJ5X2pzL2pzL2pxdWVyeS5maWxldXBsb2FkLmpzXCIpKVxuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L3NjcmlwdC1sb2FkZXIhLi9ib3dlcl9jb21wb25lbnRzL2Nsb3VkaW5hcnlfanMvanMvanF1ZXJ5LmZpbGV1cGxvYWQuanNcbiAqKiBtb2R1bGUgaWQgPSAyOFxuICoqIG1vZHVsZSBjaHVua3MgPSAyNFxuICoqLyJdLCJtYXBwaW5ncyI6IkFBQUEiLCJzb3VyY2VSb290IjoiIn0=");

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

	eval("module.exports = \"/*\\n * jQuery File Upload Plugin 5.31.6\\n * https://github.com/blueimp/jQuery-File-Upload\\n *\\n * Copyright 2010, Sebastian Tschan\\n * https://blueimp.net\\n *\\n * Licensed under the MIT license:\\n * http://www.opensource.org/licenses/MIT\\n */\\n\\n/*jslint nomen: true, unparam: true, regexp: true */\\n/*global define, window, document, location, File, Blob, FormData */\\n\\n(function (factory) {\\n    'use strict';\\n    if (typeof define === 'function' && define.amd) {\\n        // Register as an anonymous AMD module:\\n        define([\\n            'jquery',\\n            'jquery.ui.widget'\\n        ], factory);\\n    } else {\\n        // Browser globals:\\n        factory(window.jQuery);\\n    }\\n}(function ($) {\\n    'use strict';\\n\\n    // The FileReader API is not actually used, but works as feature detection,\\n    // as e.g. Safari supports XHR file uploads via the FormData API,\\n    // but not non-multipart XHR file uploads:\\n    $.support.xhrFileUpload = !!(window.XMLHttpRequestUpload && window.FileReader);\\n    $.support.xhrFormDataFileUpload = !!window.FormData;\\n\\n    // Detect support for Blob slicing (required for chunked uploads):\\n    $.support.blobSlice = window.Blob && (Blob.prototype.slice ||\\n        Blob.prototype.webkitSlice || Blob.prototype.mozSlice);\\n\\n    // The fileupload widget listens for change events on file input fields defined\\n    // via fileInput setting and paste or drop events of the given dropZone.\\n    // In addition to the default jQuery Widget methods, the fileupload widget\\n    // exposes the \\\"add\\\" and \\\"send\\\" methods, to add or directly send files using\\n    // the fileupload API.\\n    // By default, files added via file input selection, paste, drag & drop or\\n    // \\\"add\\\" method are uploaded immediately, but it is possible to override\\n    // the \\\"add\\\" callback option to queue file uploads.\\n    $.widget('blueimp.fileupload', {\\n\\n        options: {\\n            // The drop target element(s), by the default the complete document.\\n            // Set to null to disable drag & drop support:\\n            dropZone: $(document),\\n            // The paste target element(s), by the default the complete document.\\n            // Set to null to disable paste support:\\n            pasteZone: $(document),\\n            // The file input field(s), that are listened to for change events.\\n            // If undefined, it is set to the file input fields inside\\n            // of the widget element on plugin initialization.\\n            // Set to null to disable the change listener.\\n            fileInput: undefined,\\n            // By default, the file input field is replaced with a clone after\\n            // each input field change event. This is required for iframe transport\\n            // queues and allows change events to be fired for the same file\\n            // selection, but can be disabled by setting the following option to false:\\n            replaceFileInput: true,\\n            // The parameter name for the file form data (the request argument name).\\n            // If undefined or empty, the name property of the file input field is\\n            // used, or \\\"files[]\\\" if the file input name property is also empty,\\n            // can be a string or an array of strings:\\n            paramName: undefined,\\n            // By default, each file of a selection is uploaded using an individual\\n            // request for XHR type uploads. Set to false to upload file\\n            // selections in one request each:\\n            singleFileUploads: true,\\n            // To limit the number of files uploaded with one XHR request,\\n            // set the following option to an integer greater than 0:\\n            limitMultiFileUploads: undefined,\\n            // Set the following option to true to issue all file upload requests\\n            // in a sequential order:\\n            sequentialUploads: false,\\n            // To limit the number of concurrent uploads,\\n            // set the following option to an integer greater than 0:\\n            limitConcurrentUploads: undefined,\\n            // Set the following option to true to force iframe transport uploads:\\n            forceIframeTransport: false,\\n            // Set the following option to the location of a redirect url on the\\n            // origin server, for cross-domain iframe transport uploads:\\n            redirect: undefined,\\n            // The parameter name for the redirect url, sent as part of the form\\n            // data and set to 'redirect' if this option is empty:\\n            redirectParamName: undefined,\\n            // Set the following option to the location of a postMessage window,\\n            // to enable postMessage transport uploads:\\n            postMessage: undefined,\\n            // By default, XHR file uploads are sent as multipart/form-data.\\n            // The iframe transport is always using multipart/form-data.\\n            // Set to false to enable non-multipart XHR uploads:\\n            multipart: true,\\n            // To upload large files in smaller chunks, set the following option\\n            // to a preferred maximum chunk size. If set to 0, null or undefined,\\n            // or the browser does not support the required Blob API, files will\\n            // be uploaded as a whole.\\n            maxChunkSize: undefined,\\n            // When a non-multipart upload or a chunked multipart upload has been\\n            // aborted, this option can be used to resume the upload by setting\\n            // it to the size of the already uploaded bytes. This option is most\\n            // useful when modifying the options object inside of the \\\"add\\\" or\\n            // \\\"send\\\" callbacks, as the options are cloned for each file upload.\\n            uploadedBytes: undefined,\\n            // By default, failed (abort or error) file uploads are removed from the\\n            // global progress calculation. Set the following option to false to\\n            // prevent recalculating the global progress data:\\n            recalculateProgress: true,\\n            // Interval in milliseconds to calculate and trigger progress events:\\n            progressInterval: 100,\\n            // Interval in milliseconds to calculate progress bitrate:\\n            bitrateInterval: 500,\\n            // By default, uploads are started automatically when adding files:\\n            autoUpload: true,\\n\\n            // Error and info messages:\\n            messages: {\\n                uploadedBytes: 'Uploaded bytes exceed file size'\\n            },\\n\\n            // Translation function, gets the message key to be translated\\n            // and an object with context specific data as arguments:\\n            i18n: function (message, context) {\\n                message = this.messages[message] || message.toString();\\n                if (context) {\\n                    $.each(context, function (key, value) {\\n                        message = message.replace('{' + key + '}', value);\\n                    });\\n                }\\n                return message;\\n            },\\n\\n            // Additional form data to be sent along with the file uploads can be set\\n            // using this option, which accepts an array of objects with name and\\n            // value properties, a function returning such an array, a FormData\\n            // object (for XHR file uploads), or a simple object.\\n            // The form of the first fileInput is given as parameter to the function:\\n            formData: function (form) {\\n                return form.serializeArray();\\n            },\\n\\n            // The add callback is invoked as soon as files are added to the fileupload\\n            // widget (via file input selection, drag & drop, paste or add API call).\\n            // If the singleFileUploads option is enabled, this callback will be\\n            // called once for each file in the selection for XHR file uploads, else\\n            // once for each file selection.\\n            //\\n            // The upload starts when the submit method is invoked on the data parameter.\\n            // The data object contains a files property holding the added files\\n            // and allows you to override plugin options as well as define ajax settings.\\n            //\\n            // Listeners for this callback can also be bound the following way:\\n            // .bind('fileuploadadd', func);\\n            //\\n            // data.submit() returns a Promise object and allows to attach additional\\n            // handlers using jQuery's Deferred callbacks:\\n            // data.submit().done(func).fail(func).always(func);\\n            add: function (e, data) {\\n                if (data.autoUpload || (data.autoUpload !== false &&\\n                        $(this).fileupload('option', 'autoUpload'))) {\\n                    data.process().done(function () {\\n                        data.submit();\\n                    });\\n                }\\n            },\\n\\n            // Other callbacks:\\n\\n            // Callback for the submit event of each file upload:\\n            // submit: function (e, data) {}, // .bind('fileuploadsubmit', func);\\n\\n            // Callback for the start of each file upload request:\\n            // send: function (e, data) {}, // .bind('fileuploadsend', func);\\n\\n            // Callback for successful uploads:\\n            // done: function (e, data) {}, // .bind('fileuploaddone', func);\\n\\n            // Callback for failed (abort or error) uploads:\\n            // fail: function (e, data) {}, // .bind('fileuploadfail', func);\\n\\n            // Callback for completed (success, abort or error) requests:\\n            // always: function (e, data) {}, // .bind('fileuploadalways', func);\\n\\n            // Callback for upload progress events:\\n            // progress: function (e, data) {}, // .bind('fileuploadprogress', func);\\n\\n            // Callback for global upload progress events:\\n            // progressall: function (e, data) {}, // .bind('fileuploadprogressall', func);\\n\\n            // Callback for uploads start, equivalent to the global ajaxStart event:\\n            // start: function (e) {}, // .bind('fileuploadstart', func);\\n\\n            // Callback for uploads stop, equivalent to the global ajaxStop event:\\n            // stop: function (e) {}, // .bind('fileuploadstop', func);\\n\\n            // Callback for change events of the fileInput(s):\\n            // change: function (e, data) {}, // .bind('fileuploadchange', func);\\n\\n            // Callback for paste events to the pasteZone(s):\\n            // paste: function (e, data) {}, // .bind('fileuploadpaste', func);\\n\\n            // Callback for drop events of the dropZone(s):\\n            // drop: function (e, data) {}, // .bind('fileuploaddrop', func);\\n\\n            // Callback for dragover events of the dropZone(s):\\n            // dragover: function (e) {}, // .bind('fileuploaddragover', func);\\n\\n            // Callback for the start of each chunk upload request:\\n            // chunksend: function (e, data) {}, // .bind('fileuploadchunksend', func);\\n\\n            // Callback for successful chunk uploads:\\n            // chunkdone: function (e, data) {}, // .bind('fileuploadchunkdone', func);\\n\\n            // Callback for failed (abort or error) chunk uploads:\\n            // chunkfail: function (e, data) {}, // .bind('fileuploadchunkfail', func);\\n\\n            // Callback for completed (success, abort or error) chunk upload requests:\\n            // chunkalways: function (e, data) {}, // .bind('fileuploadchunkalways', func);\\n\\n            // The plugin options are used as settings object for the ajax calls.\\n            // The following are jQuery ajax settings required for the file uploads:\\n            processData: false,\\n            contentType: false,\\n            cache: false\\n        },\\n\\n        // A list of options that require reinitializing event listeners and/or\\n        // special initialization code:\\n        _specialOptions: [\\n            'fileInput',\\n            'dropZone',\\n            'pasteZone',\\n            'multipart',\\n            'forceIframeTransport'\\n        ],\\n\\n        _blobSlice: $.support.blobSlice && function () {\\n            var slice = this.slice || this.webkitSlice || this.mozSlice;\\n            return slice.apply(this, arguments);\\n        },\\n\\n        _BitrateTimer: function () {\\n            this.timestamp = ((Date.now) ? Date.now() : (new Date()).getTime());\\n            this.loaded = 0;\\n            this.bitrate = 0;\\n            this.getBitrate = function (now, loaded, interval) {\\n                var timeDiff = now - this.timestamp;\\n                if (!this.bitrate || !interval || timeDiff > interval) {\\n                    this.bitrate = (loaded - this.loaded) * (1000 / timeDiff) * 8;\\n                    this.loaded = loaded;\\n                    this.timestamp = now;\\n                }\\n                return this.bitrate;\\n            };\\n        },\\n\\n        _isXHRUpload: function (options) {\\n            return !options.forceIframeTransport &&\\n                ((!options.multipart && $.support.xhrFileUpload) ||\\n                $.support.xhrFormDataFileUpload);\\n        },\\n\\n        _getFormData: function (options) {\\n            var formData;\\n            if (typeof options.formData === 'function') {\\n                return options.formData(options.form);\\n            }\\n            if ($.isArray(options.formData)) {\\n                return options.formData;\\n            }\\n            if ($.type(options.formData) === 'object') {\\n                formData = [];\\n                $.each(options.formData, function (name, value) {\\n                    formData.push({name: name, value: value});\\n                });\\n                return formData;\\n            }\\n            return [];\\n        },\\n\\n        _getTotal: function (files) {\\n            var total = 0;\\n            $.each(files, function (index, file) {\\n                total += file.size || 1;\\n            });\\n            return total;\\n        },\\n\\n        _initProgressObject: function (obj) {\\n            var progress = {\\n                loaded: 0,\\n                total: 0,\\n                bitrate: 0\\n            };\\n            if (obj._progress) {\\n                $.extend(obj._progress, progress);\\n            } else {\\n                obj._progress = progress;\\n            }\\n        },\\n\\n        _initResponseObject: function (obj) {\\n            var prop;\\n            if (obj._response) {\\n                for (prop in obj._response) {\\n                    if (obj._response.hasOwnProperty(prop)) {\\n                        delete obj._response[prop];\\n                    }\\n                }\\n            } else {\\n                obj._response = {};\\n            }\\n        },\\n\\n        _onProgress: function (e, data) {\\n            if (e.lengthComputable) {\\n                var now = ((Date.now) ? Date.now() : (new Date()).getTime()),\\n                    loaded;\\n                if (data._time && data.progressInterval &&\\n                        (now - data._time < data.progressInterval) &&\\n                        e.loaded !== e.total) {\\n                    return;\\n                }\\n                data._time = now;\\n                loaded = Math.floor(\\n                    e.loaded / e.total * (data.chunkSize || data._progress.total)\\n                ) + (data.uploadedBytes || 0);\\n                // Add the difference from the previously loaded state\\n                // to the global loaded counter:\\n                this._progress.loaded += (loaded - data._progress.loaded);\\n                this._progress.bitrate = this._bitrateTimer.getBitrate(\\n                    now,\\n                    this._progress.loaded,\\n                    data.bitrateInterval\\n                );\\n                data._progress.loaded = data.loaded = loaded;\\n                data._progress.bitrate = data.bitrate = data._bitrateTimer.getBitrate(\\n                    now,\\n                    loaded,\\n                    data.bitrateInterval\\n                );\\n                // Trigger a custom progress event with a total data property set\\n                // to the file size(s) of the current upload and a loaded data\\n                // property calculated accordingly:\\n                this._trigger('progress', e, data);\\n                // Trigger a global progress event for all current file uploads,\\n                // including ajax calls queued for sequential file uploads:\\n                this._trigger('progressall', e, this._progress);\\n            }\\n        },\\n\\n        _initProgressListener: function (options) {\\n            var that = this,\\n                xhr = options.xhr ? options.xhr() : $.ajaxSettings.xhr();\\n            // Accesss to the native XHR object is required to add event listeners\\n            // for the upload progress event:\\n            if (xhr.upload) {\\n                $(xhr.upload).bind('progress', function (e) {\\n                    var oe = e.originalEvent;\\n                    // Make sure the progress event properties get copied over:\\n                    e.lengthComputable = oe.lengthComputable;\\n                    e.loaded = oe.loaded;\\n                    e.total = oe.total;\\n                    that._onProgress(e, options);\\n                });\\n                options.xhr = function () {\\n                    return xhr;\\n                };\\n            }\\n        },\\n\\n        _isInstanceOf: function (type, obj) {\\n            // Cross-frame instanceof check\\n            return Object.prototype.toString.call(obj) === '[object ' + type + ']';\\n        },\\n\\n        _initXHRData: function (options) {\\n            var that = this,\\n                formData,\\n                file = options.files[0],\\n                // Ignore non-multipart setting if not supported:\\n                multipart = options.multipart || !$.support.xhrFileUpload,\\n                paramName = options.paramName[0];\\n            options.headers = options.headers || {};\\n            if (options.contentRange) {\\n                options.headers['Content-Range'] = options.contentRange;\\n            }\\n            if (!multipart || options.blob || !this._isInstanceOf('File', file)) {\\n                options.headers['Content-Disposition'] = 'attachment; filename=\\\"' +\\n                    encodeURI(file.name) + '\\\"';\\n            }\\n            if (!multipart) {\\n                options.contentType = file.type;\\n                options.data = options.blob || file;\\n            } else if ($.support.xhrFormDataFileUpload) {\\n                if (options.postMessage) {\\n                    // window.postMessage does not allow sending FormData\\n                    // objects, so we just add the File/Blob objects to\\n                    // the formData array and let the postMessage window\\n                    // create the FormData object out of this array:\\n                    formData = this._getFormData(options);\\n                    if (options.blob) {\\n                        formData.push({\\n                            name: paramName,\\n                            value: options.blob\\n                        });\\n                    } else {\\n                        $.each(options.files, function (index, file) {\\n                            formData.push({\\n                                name: options.paramName[index] || paramName,\\n                                value: file\\n                            });\\n                        });\\n                    }\\n                } else {\\n                    if (that._isInstanceOf('FormData', options.formData)) {\\n                        formData = options.formData;\\n                    } else {\\n                        formData = new FormData();\\n                        $.each(this._getFormData(options), function (index, field) {\\n                            formData.append(field.name, field.value);\\n                        });\\n                    }\\n                    if (options.blob) {\\n                        formData.append(paramName, options.blob, file.name);\\n                    } else {\\n                        $.each(options.files, function (index, file) {\\n                            // This check allows the tests to run with\\n                            // dummy objects:\\n                            if (that._isInstanceOf('File', file) ||\\n                                    that._isInstanceOf('Blob', file)) {\\n                                formData.append(\\n                                    options.paramName[index] || paramName,\\n                                    file,\\n                                    file.name\\n                                );\\n                            }\\n                        });\\n                    }\\n                }\\n                options.data = formData;\\n            }\\n            // Blob reference is not needed anymore, free memory:\\n            options.blob = null;\\n        },\\n\\n        _initIframeSettings: function (options) {\\n            var targetHost = $('<a></a>').prop('href', options.url).prop('host');\\n            // Setting the dataType to iframe enables the iframe transport:\\n            options.dataType = 'iframe ' + (options.dataType || '');\\n            // The iframe transport accepts a serialized array as form data:\\n            options.formData = this._getFormData(options);\\n            // Add redirect url to form data on cross-domain uploads:\\n            if (options.redirect && targetHost && targetHost !== location.host) {\\n                options.formData.push({\\n                    name: options.redirectParamName || 'redirect',\\n                    value: options.redirect\\n                });\\n            }\\n        },\\n\\n        _initDataSettings: function (options) {\\n            if (this._isXHRUpload(options)) {\\n                if (!this._chunkedUpload(options, true)) {\\n                    if (!options.data) {\\n                        this._initXHRData(options);\\n                    }\\n                    this._initProgressListener(options);\\n                }\\n                if (options.postMessage) {\\n                    // Setting the dataType to postmessage enables the\\n                    // postMessage transport:\\n                    options.dataType = 'postmessage ' + (options.dataType || '');\\n                }\\n            } else {\\n                this._initIframeSettings(options);\\n            }\\n        },\\n\\n        _getParamName: function (options) {\\n            var fileInput = $(options.fileInput),\\n                paramName = options.paramName;\\n            if (!paramName) {\\n                paramName = [];\\n                fileInput.each(function () {\\n                    var input = $(this),\\n                        name = input.prop('name') || 'files[]',\\n                        i = (input.prop('files') || [1]).length;\\n                    while (i) {\\n                        paramName.push(name);\\n                        i -= 1;\\n                    }\\n                });\\n                if (!paramName.length) {\\n                    paramName = [fileInput.prop('name') || 'files[]'];\\n                }\\n            } else if (!$.isArray(paramName)) {\\n                paramName = [paramName];\\n            }\\n            return paramName;\\n        },\\n\\n        _initFormSettings: function (options) {\\n            // Retrieve missing options from the input field and the\\n            // associated form, if available:\\n            if (!options.form || !options.form.length) {\\n                options.form = $(options.fileInput.prop('form'));\\n                // If the given file input doesn't have an associated form,\\n                // use the default widget file input's form:\\n                if (!options.form.length) {\\n                    options.form = $(this.options.fileInput.prop('form'));\\n                }\\n            }\\n            options.paramName = this._getParamName(options);\\n            if (!options.url) {\\n                options.url = options.form.prop('action') || location.href;\\n            }\\n            // The HTTP request method must be \\\"POST\\\" or \\\"PUT\\\":\\n            options.type = (options.type || options.form.prop('method') || '')\\n                .toUpperCase();\\n            if (options.type !== 'POST' && options.type !== 'PUT' &&\\n                    options.type !== 'PATCH') {\\n                options.type = 'POST';\\n            }\\n            if (!options.formAcceptCharset) {\\n                options.formAcceptCharset = options.form.attr('accept-charset');\\n            }\\n        },\\n\\n        _getAJAXSettings: function (data) {\\n            var options = $.extend({}, this.options, data);\\n            this._initFormSettings(options);\\n            this._initDataSettings(options);\\n            return options;\\n        },\\n\\n        // jQuery 1.6 doesn't provide .state(),\\n        // while jQuery 1.8+ removed .isRejected() and .isResolved():\\n        _getDeferredState: function (deferred) {\\n            if (deferred.state) {\\n                return deferred.state();\\n            }\\n            if (deferred.isResolved()) {\\n                return 'resolved';\\n            }\\n            if (deferred.isRejected()) {\\n                return 'rejected';\\n            }\\n            return 'pending';\\n        },\\n\\n        // Maps jqXHR callbacks to the equivalent\\n        // methods of the given Promise object:\\n        _enhancePromise: function (promise) {\\n            promise.success = promise.done;\\n            promise.error = promise.fail;\\n            promise.complete = promise.always;\\n            return promise;\\n        },\\n\\n        // Creates and returns a Promise object enhanced with\\n        // the jqXHR methods abort, success, error and complete:\\n        _getXHRPromise: function (resolveOrReject, context, args) {\\n            var dfd = $.Deferred(),\\n                promise = dfd.promise();\\n            context = context || this.options.context || promise;\\n            if (resolveOrReject === true) {\\n                dfd.resolveWith(context, args);\\n            } else if (resolveOrReject === false) {\\n                dfd.rejectWith(context, args);\\n            }\\n            promise.abort = dfd.promise;\\n            return this._enhancePromise(promise);\\n        },\\n\\n        // Adds convenience methods to the data callback argument:\\n        _addConvenienceMethods: function (e, data) {\\n            var that = this,\\n                getPromise = function (data) {\\n                    return $.Deferred().resolveWith(that, [data]).promise();\\n                };\\n            data.process = function (resolveFunc, rejectFunc) {\\n                if (resolveFunc || rejectFunc) {\\n                    data._processQueue = this._processQueue =\\n                        (this._processQueue || getPromise(this))\\n                            .pipe(resolveFunc, rejectFunc);\\n                }\\n                return this._processQueue || getPromise(this);\\n            };\\n            data.submit = function () {\\n                if (this.state() !== 'pending') {\\n                    data.jqXHR = this.jqXHR =\\n                        (that._trigger('submit', e, this) !== false) &&\\n                        that._onSend(e, this);\\n                }\\n                return this.jqXHR || that._getXHRPromise();\\n            };\\n            data.abort = function () {\\n                if (this.jqXHR) {\\n                    return this.jqXHR.abort();\\n                }\\n                return that._getXHRPromise();\\n            };\\n            data.state = function () {\\n                if (this.jqXHR) {\\n                    return that._getDeferredState(this.jqXHR);\\n                }\\n                if (this._processQueue) {\\n                    return that._getDeferredState(this._processQueue);\\n                }\\n            };\\n            data.progress = function () {\\n                return this._progress;\\n            };\\n            data.response = function () {\\n                return this._response;\\n            };\\n        },\\n\\n        // Parses the Range header from the server response\\n        // and returns the uploaded bytes:\\n        _getUploadedBytes: function (jqXHR) {\\n            var range = jqXHR.getResponseHeader('Range'),\\n                parts = range && range.split('-'),\\n                upperBytesPos = parts && parts.length > 1 &&\\n                    parseInt(parts[1], 10);\\n            return upperBytesPos && upperBytesPos + 1;\\n        },\\n\\n        // Uploads a file in multiple, sequential requests\\n        // by splitting the file up in multiple blob chunks.\\n        // If the second parameter is true, only tests if the file\\n        // should be uploaded in chunks, but does not invoke any\\n        // upload requests:\\n        _chunkedUpload: function (options, testOnly) {\\n            options.uploadedBytes = options.uploadedBytes || 0;\\n            var that = this,\\n                file = options.files[0],\\n                fs = file.size,\\n                ub = options.uploadedBytes,\\n                mcs = options.maxChunkSize || fs,\\n                slice = this._blobSlice,\\n                dfd = $.Deferred(),\\n                promise = dfd.promise(),\\n                jqXHR,\\n                upload;\\n            if (!(this._isXHRUpload(options) && slice && (ub || mcs < fs)) ||\\n                    options.data) {\\n                return false;\\n            }\\n            if (testOnly) {\\n                return true;\\n            }\\n            if (ub >= fs) {\\n                file.error = options.i18n('uploadedBytes');\\n                return this._getXHRPromise(\\n                    false,\\n                    options.context,\\n                    [null, 'error', file.error]\\n                );\\n            }\\n            // The chunk upload method:\\n            upload = function () {\\n                // Clone the options object for each chunk upload:\\n                var o = $.extend({}, options),\\n                    currentLoaded = o._progress.loaded;\\n                o.blob = slice.call(\\n                    file,\\n                    ub,\\n                    ub + mcs,\\n                    file.type\\n                );\\n                // Store the current chunk size, as the blob itself\\n                // will be dereferenced after data processing:\\n                o.chunkSize = o.blob.size;\\n                // Expose the chunk bytes position range:\\n                o.contentRange = 'bytes ' + ub + '-' +\\n                    (ub + o.chunkSize - 1) + '/' + fs;\\n                // Process the upload data (the blob and potential form data):\\n                that._initXHRData(o);\\n                // Add progress listeners for this chunk upload:\\n                that._initProgressListener(o);\\n                jqXHR = ((that._trigger('chunksend', null, o) !== false && $.ajax(o)) ||\\n                        that._getXHRPromise(false, o.context))\\n                    .done(function (result, textStatus, jqXHR) {\\n                        ub = that._getUploadedBytes(jqXHR) ||\\n                            (ub + o.chunkSize);\\n                        // Create a progress event if no final progress event\\n                        // with loaded equaling total has been triggered\\n                        // for this chunk:\\n                        if (currentLoaded + o.chunkSize - o._progress.loaded) {\\n                            that._onProgress($.Event('progress', {\\n                                lengthComputable: true,\\n                                loaded: ub - o.uploadedBytes,\\n                                total: ub - o.uploadedBytes\\n                            }), o);\\n                        }\\n                        options.uploadedBytes = o.uploadedBytes = ub;\\n                        o.result = result;\\n                        o.textStatus = textStatus;\\n                        o.jqXHR = jqXHR;\\n                        that._trigger('chunkdone', null, o);\\n                        that._trigger('chunkalways', null, o);\\n                        if (ub < fs) {\\n                            // File upload not yet complete,\\n                            // continue with the next chunk:\\n                            upload();\\n                        } else {\\n                            dfd.resolveWith(\\n                                o.context,\\n                                [result, textStatus, jqXHR]\\n                            );\\n                        }\\n                    })\\n                    .fail(function (jqXHR, textStatus, errorThrown) {\\n                        o.jqXHR = jqXHR;\\n                        o.textStatus = textStatus;\\n                        o.errorThrown = errorThrown;\\n                        that._trigger('chunkfail', null, o);\\n                        that._trigger('chunkalways', null, o);\\n                        dfd.rejectWith(\\n                            o.context,\\n                            [jqXHR, textStatus, errorThrown]\\n                        );\\n                    });\\n            };\\n            this._enhancePromise(promise);\\n            promise.abort = function () {\\n                return jqXHR.abort();\\n            };\\n            upload();\\n            return promise;\\n        },\\n\\n        _beforeSend: function (e, data) {\\n            if (this._active === 0) {\\n                // the start callback is triggered when an upload starts\\n                // and no other uploads are currently running,\\n                // equivalent to the global ajaxStart event:\\n                this._trigger('start');\\n                // Set timer for global bitrate progress calculation:\\n                this._bitrateTimer = new this._BitrateTimer();\\n                // Reset the global progress values:\\n                this._progress.loaded = this._progress.total = 0;\\n                this._progress.bitrate = 0;\\n            }\\n            // Make sure the container objects for the .response() and\\n            // .progress() methods on the data object are available\\n            // and reset to their initial state:\\n            this._initResponseObject(data);\\n            this._initProgressObject(data);\\n            data._progress.loaded = data.loaded = data.uploadedBytes || 0;\\n            data._progress.total = data.total = this._getTotal(data.files) || 1;\\n            data._progress.bitrate = data.bitrate = 0;\\n            this._active += 1;\\n            // Initialize the global progress values:\\n            this._progress.loaded += data.loaded;\\n            this._progress.total += data.total;\\n        },\\n\\n        _onDone: function (result, textStatus, jqXHR, options) {\\n            var total = options._progress.total,\\n                response = options._response;\\n            if (options._progress.loaded < total) {\\n                // Create a progress event if no final progress event\\n                // with loaded equaling total has been triggered:\\n                this._onProgress($.Event('progress', {\\n                    lengthComputable: true,\\n                    loaded: total,\\n                    total: total\\n                }), options);\\n            }\\n            response.result = options.result = result;\\n            response.textStatus = options.textStatus = textStatus;\\n            response.jqXHR = options.jqXHR = jqXHR;\\n            this._trigger('done', null, options);\\n        },\\n\\n        _onFail: function (jqXHR, textStatus, errorThrown, options) {\\n            var response = options._response;\\n            if (options.recalculateProgress) {\\n                // Remove the failed (error or abort) file upload from\\n                // the global progress calculation:\\n                this._progress.loaded -= options._progress.loaded;\\n                this._progress.total -= options._progress.total;\\n            }\\n            response.jqXHR = options.jqXHR = jqXHR;\\n            response.textStatus = options.textStatus = textStatus;\\n            response.errorThrown = options.errorThrown = errorThrown;\\n            this._trigger('fail', null, options);\\n        },\\n\\n        _onAlways: function (jqXHRorResult, textStatus, jqXHRorError, options) {\\n            // jqXHRorResult, textStatus and jqXHRorError are added to the\\n            // options object via done and fail callbacks\\n            this._trigger('always', null, options);\\n        },\\n\\n        _onSend: function (e, data) {\\n            if (!data.submit) {\\n                this._addConvenienceMethods(e, data);\\n            }\\n            var that = this,\\n                jqXHR,\\n                aborted,\\n                slot,\\n                pipe,\\n                options = that._getAJAXSettings(data),\\n                send = function () {\\n                    that._sending += 1;\\n                    // Set timer for bitrate progress calculation:\\n                    options._bitrateTimer = new that._BitrateTimer();\\n                    jqXHR = jqXHR || (\\n                        ((aborted || that._trigger('send', e, options) === false) &&\\n                        that._getXHRPromise(false, options.context, aborted)) ||\\n                        that._chunkedUpload(options) || $.ajax(options)\\n                    ).done(function (result, textStatus, jqXHR) {\\n                        that._onDone(result, textStatus, jqXHR, options);\\n                    }).fail(function (jqXHR, textStatus, errorThrown) {\\n                        that._onFail(jqXHR, textStatus, errorThrown, options);\\n                    }).always(function (jqXHRorResult, textStatus, jqXHRorError) {\\n                        that._onAlways(\\n                            jqXHRorResult,\\n                            textStatus,\\n                            jqXHRorError,\\n                            options\\n                        );\\n                        that._sending -= 1;\\n                        that._active -= 1;\\n                        if (options.limitConcurrentUploads &&\\n                                options.limitConcurrentUploads > that._sending) {\\n                            // Start the next queued upload,\\n                            // that has not been aborted:\\n                            var nextSlot = that._slots.shift();\\n                            while (nextSlot) {\\n                                if (that._getDeferredState(nextSlot) === 'pending') {\\n                                    nextSlot.resolve();\\n                                    break;\\n                                }\\n                                nextSlot = that._slots.shift();\\n                            }\\n                        }\\n                        if (that._active === 0) {\\n                            // The stop callback is triggered when all uploads have\\n                            // been completed, equivalent to the global ajaxStop event:\\n                            that._trigger('stop');\\n                        }\\n                    });\\n                    return jqXHR;\\n                };\\n            this._beforeSend(e, options);\\n            if (this.options.sequentialUploads ||\\n                    (this.options.limitConcurrentUploads &&\\n                    this.options.limitConcurrentUploads <= this._sending)) {\\n                if (this.options.limitConcurrentUploads > 1) {\\n                    slot = $.Deferred();\\n                    this._slots.push(slot);\\n                    pipe = slot.pipe(send);\\n                } else {\\n                    this._sequence = this._sequence.pipe(send, send);\\n                    pipe = this._sequence;\\n                }\\n                // Return the piped Promise object, enhanced with an abort method,\\n                // which is delegated to the jqXHR object of the current upload,\\n                // and jqXHR callbacks mapped to the equivalent Promise methods:\\n                pipe.abort = function () {\\n                    aborted = [undefined, 'abort', 'abort'];\\n                    if (!jqXHR) {\\n                        if (slot) {\\n                            slot.rejectWith(options.context, aborted);\\n                        }\\n                        return send();\\n                    }\\n                    return jqXHR.abort();\\n                };\\n                return this._enhancePromise(pipe);\\n            }\\n            return send();\\n        },\\n\\n        _onAdd: function (e, data) {\\n            var that = this,\\n                result = true,\\n                options = $.extend({}, this.options, data),\\n                limit = options.limitMultiFileUploads,\\n                paramName = this._getParamName(options),\\n                paramNameSet,\\n                paramNameSlice,\\n                fileSet,\\n                i;\\n            if (!(options.singleFileUploads || limit) ||\\n                    !this._isXHRUpload(options)) {\\n                fileSet = [data.files];\\n                paramNameSet = [paramName];\\n            } else if (!options.singleFileUploads && limit) {\\n                fileSet = [];\\n                paramNameSet = [];\\n                for (i = 0; i < data.files.length; i += limit) {\\n                    fileSet.push(data.files.slice(i, i + limit));\\n                    paramNameSlice = paramName.slice(i, i + limit);\\n                    if (!paramNameSlice.length) {\\n                        paramNameSlice = paramName;\\n                    }\\n                    paramNameSet.push(paramNameSlice);\\n                }\\n            } else {\\n                paramNameSet = paramName;\\n            }\\n            data.originalFiles = data.files;\\n            $.each(fileSet || data.files, function (index, element) {\\n                var newData = $.extend({}, data);\\n                newData.files = fileSet ? element : [element];\\n                newData.paramName = paramNameSet[index];\\n                that._initResponseObject(newData);\\n                that._initProgressObject(newData);\\n                that._addConvenienceMethods(e, newData);\\n                result = that._trigger('add', e, newData);\\n                return result;\\n            });\\n            return result;\\n        },\\n\\n        _replaceFileInput: function (input) {\\n            var inputClone = input.clone(true);\\n            $('<form></form>').append(inputClone)[0].reset();\\n            // Detaching allows to insert the fileInput on another form\\n            // without loosing the file input value:\\n            input.after(inputClone).detach();\\n            // Avoid memory leaks with the detached file input:\\n            $.cleanData(input.unbind('remove'));\\n            // Replace the original file input element in the fileInput\\n            // elements set with the clone, which has been copied including\\n            // event handlers:\\n            this.options.fileInput = this.options.fileInput.map(function (i, el) {\\n                if (el === input[0]) {\\n                    return inputClone[0];\\n                }\\n                return el;\\n            });\\n            // If the widget has been initialized on the file input itself,\\n            // override this.element with the file input clone:\\n            if (input[0] === this.element[0]) {\\n                this.element = inputClone;\\n            }\\n        },\\n\\n        _handleFileTreeEntry: function (entry, path) {\\n            var that = this,\\n                dfd = $.Deferred(),\\n                errorHandler = function (e) {\\n                    if (e && !e.entry) {\\n                        e.entry = entry;\\n                    }\\n                    // Since $.when returns immediately if one\\n                    // Deferred is rejected, we use resolve instead.\\n                    // This allows valid files and invalid items\\n                    // to be returned together in one set:\\n                    dfd.resolve([e]);\\n                },\\n                dirReader;\\n            path = path || '';\\n            if (entry.isFile) {\\n                if (entry._file) {\\n                    // Workaround for Chrome bug #149735\\n                    entry._file.relativePath = path;\\n                    dfd.resolve(entry._file);\\n                } else {\\n                    entry.file(function (file) {\\n                        file.relativePath = path;\\n                        dfd.resolve(file);\\n                    }, errorHandler);\\n                }\\n            } else if (entry.isDirectory) {\\n                dirReader = entry.createReader();\\n                dirReader.readEntries(function (entries) {\\n                    that._handleFileTreeEntries(\\n                        entries,\\n                        path + entry.name + '/'\\n                    ).done(function (files) {\\n                        dfd.resolve(files);\\n                    }).fail(errorHandler);\\n                }, errorHandler);\\n            } else {\\n                // Return an empy list for file system items\\n                // other than files or directories:\\n                dfd.resolve([]);\\n            }\\n            return dfd.promise();\\n        },\\n\\n        _handleFileTreeEntries: function (entries, path) {\\n            var that = this;\\n            return $.when.apply(\\n                $,\\n                $.map(entries, function (entry) {\\n                    return that._handleFileTreeEntry(entry, path);\\n                })\\n            ).pipe(function () {\\n                return Array.prototype.concat.apply(\\n                    [],\\n                    arguments\\n                );\\n            });\\n        },\\n\\n        _getDroppedFiles: function (dataTransfer) {\\n            dataTransfer = dataTransfer || {};\\n            var items = dataTransfer.items;\\n            if (items && items.length && (items[0].webkitGetAsEntry ||\\n                    items[0].getAsEntry)) {\\n                return this._handleFileTreeEntries(\\n                    $.map(items, function (item) {\\n                        var entry;\\n                        if (item.webkitGetAsEntry) {\\n                            entry = item.webkitGetAsEntry();\\n                            if (entry) {\\n                                // Workaround for Chrome bug #149735:\\n                                entry._file = item.getAsFile();\\n                            }\\n                            return entry;\\n                        }\\n                        return item.getAsEntry();\\n                    })\\n                );\\n            }\\n            return $.Deferred().resolve(\\n                $.makeArray(dataTransfer.files)\\n            ).promise();\\n        },\\n\\n        _getSingleFileInputFiles: function (fileInput) {\\n            fileInput = $(fileInput);\\n            var entries = fileInput.prop('webkitEntries') ||\\n                    fileInput.prop('entries'),\\n                files,\\n                value;\\n            if (entries && entries.length) {\\n                return this._handleFileTreeEntries(entries);\\n            }\\n            files = $.makeArray(fileInput.prop('files'));\\n            if (!files.length) {\\n                value = fileInput.prop('value');\\n                if (!value) {\\n                    return $.Deferred().resolve([]).promise();\\n                }\\n                // If the files property is not available, the browser does not\\n                // support the File API and we add a pseudo File object with\\n                // the input value as name with path information removed:\\n                files = [{name: value.replace(/^.*\\\\\\\\/, '')}];\\n            } else if (files[0].name === undefined && files[0].fileName) {\\n                // File normalization for Safari 4 and Firefox 3:\\n                $.each(files, function (index, file) {\\n                    file.name = file.fileName;\\n                    file.size = file.fileSize;\\n                });\\n            }\\n            return $.Deferred().resolve(files).promise();\\n        },\\n\\n        _getFileInputFiles: function (fileInput) {\\n            if (!(fileInput instanceof $) || fileInput.length === 1) {\\n                return this._getSingleFileInputFiles(fileInput);\\n            }\\n            return $.when.apply(\\n                $,\\n                $.map(fileInput, this._getSingleFileInputFiles)\\n            ).pipe(function () {\\n                return Array.prototype.concat.apply(\\n                    [],\\n                    arguments\\n                );\\n            });\\n        },\\n\\n        _onChange: function (e) {\\n            var that = this,\\n                data = {\\n                    fileInput: $(e.target),\\n                    form: $(e.target.form)\\n                };\\n            this._getFileInputFiles(data.fileInput).always(function (files) {\\n                data.files = files;\\n                if (that.options.replaceFileInput) {\\n                    that._replaceFileInput(data.fileInput);\\n                }\\n                if (that._trigger('change', e, data) !== false) {\\n                    that._onAdd(e, data);\\n                }\\n            });\\n        },\\n\\n        _onPaste: function (e) {\\n            var items = e.originalEvent && e.originalEvent.clipboardData &&\\n                    e.originalEvent.clipboardData.items,\\n                data = {files: []};\\n            if (items && items.length) {\\n                $.each(items, function (index, item) {\\n                    var file = item.getAsFile && item.getAsFile();\\n                    if (file) {\\n                        data.files.push(file);\\n                    }\\n                });\\n                if (this._trigger('paste', e, data) === false ||\\n                        this._onAdd(e, data) === false) {\\n                    return false;\\n                }\\n            }\\n        },\\n\\n        _onDrop: function (e) {\\n            e.dataTransfer = e.originalEvent && e.originalEvent.dataTransfer;\\n            var that = this,\\n                dataTransfer = e.dataTransfer,\\n                data = {};\\n            if (dataTransfer && dataTransfer.files && dataTransfer.files.length) {\\n                e.preventDefault();\\n                this._getDroppedFiles(dataTransfer).always(function (files) {\\n                    data.files = files;\\n                    if (that._trigger('drop', e, data) !== false) {\\n                        that._onAdd(e, data);\\n                    }\\n                });\\n            }\\n        },\\n\\n        _onDragOver: function (e) {\\n            e.dataTransfer = e.originalEvent && e.originalEvent.dataTransfer;\\n            var dataTransfer = e.dataTransfer;\\n            if (dataTransfer) {\\n                if (this._trigger('dragover', e) === false) {\\n                    return false;\\n                }\\n                if ($.inArray('Files', dataTransfer.types) !== -1) {\\n                    dataTransfer.dropEffect = 'copy';\\n                    e.preventDefault();\\n                }\\n            }\\n        },\\n\\n        _initEventHandlers: function () {\\n            if (this._isXHRUpload(this.options)) {\\n                this._on(this.options.dropZone, {\\n                    dragover: this._onDragOver,\\n                    drop: this._onDrop\\n                });\\n                this._on(this.options.pasteZone, {\\n                    paste: this._onPaste\\n                });\\n            }\\n            this._on(this.options.fileInput, {\\n                change: this._onChange\\n            });\\n        },\\n\\n        _destroyEventHandlers: function () {\\n            this._off(this.options.dropZone, 'dragover drop');\\n            this._off(this.options.pasteZone, 'paste');\\n            this._off(this.options.fileInput, 'change');\\n        },\\n\\n        _setOption: function (key, value) {\\n            var reinit = $.inArray(key, this._specialOptions) !== -1;\\n            if (reinit) {\\n                this._destroyEventHandlers();\\n            }\\n            this._super(key, value);\\n            if (reinit) {\\n                this._initSpecialOptions();\\n                this._initEventHandlers();\\n            }\\n        },\\n\\n        _initSpecialOptions: function () {\\n            var options = this.options;\\n            if (options.fileInput === undefined) {\\n                options.fileInput = this.element.is('input[type=\\\"file\\\"]') ?\\n                        this.element : this.element.find('input[type=\\\"file\\\"]');\\n            } else if (!(options.fileInput instanceof $)) {\\n                options.fileInput = $(options.fileInput);\\n            }\\n            if (!(options.dropZone instanceof $)) {\\n                options.dropZone = $(options.dropZone);\\n            }\\n            if (!(options.pasteZone instanceof $)) {\\n                options.pasteZone = $(options.pasteZone);\\n            }\\n        },\\n\\n        _getRegExp: function (str) {\\n            var parts = str.split('/'),\\n                modifiers = parts.pop();\\n            parts.shift();\\n            return new RegExp(parts.join('/'), modifiers);\\n        },\\n\\n        _isRegExpOption: function (key, value) {\\n            return key !== 'url' && $.type(value) === 'string' &&\\n                /^\\\\/.*\\\\/[igm]{0,3}$/.test(value);\\n        },\\n\\n        _initDataAttributes: function () {\\n            var that = this,\\n                options = this.options;\\n            // Initialize options set via HTML5 data-attributes:\\n            $.each(\\n                $(this.element[0].cloneNode(false)).data(),\\n                function (key, value) {\\n                    if (that._isRegExpOption(key, value)) {\\n                        value = that._getRegExp(value);\\n                    }\\n                    options[key] = value;\\n                }\\n            );\\n        },\\n\\n        _create: function () {\\n            this._initDataAttributes();\\n            this._initSpecialOptions();\\n            this._slots = [];\\n            this._sequence = this._getXHRPromise(true);\\n            this._sending = this._active = 0;\\n            this._initProgressObject(this);\\n            this._initEventHandlers();\\n        },\\n\\n        // This method is exposed to the widget API and allows to query\\n        // the number of active uploads:\\n        active: function () {\\n            return this._active;\\n        },\\n\\n        // This method is exposed to the widget API and allows to query\\n        // the widget upload progress.\\n        // It returns an object with loaded, total and bitrate properties\\n        // for the running uploads:\\n        progress: function () {\\n            return this._progress;\\n        },\\n\\n        // This method is exposed to the widget API and allows adding files\\n        // using the fileupload API. The data parameter accepts an object which\\n        // must have a files property and can contain additional options:\\n        // .fileupload('add', {files: filesList});\\n        add: function (data) {\\n            var that = this;\\n            if (!data || this.options.disabled) {\\n                return;\\n            }\\n            if (data.fileInput && !data.files) {\\n                this._getFileInputFiles(data.fileInput).always(function (files) {\\n                    data.files = files;\\n                    that._onAdd(null, data);\\n                });\\n            } else {\\n                data.files = $.makeArray(data.files);\\n                this._onAdd(null, data);\\n            }\\n        },\\n\\n        // This method is exposed to the widget API and allows sending files\\n        // using the fileupload API. The data parameter accepts an object which\\n        // must have a files or fileInput property and can contain additional options:\\n        // .fileupload('send', {files: filesList});\\n        // The method returns a Promise object for the file upload call.\\n        send: function (data) {\\n            if (data && !this.options.disabled) {\\n                if (data.fileInput && !data.files) {\\n                    var that = this,\\n                        dfd = $.Deferred(),\\n                        promise = dfd.promise(),\\n                        jqXHR,\\n                        aborted;\\n                    promise.abort = function () {\\n                        aborted = true;\\n                        if (jqXHR) {\\n                            return jqXHR.abort();\\n                        }\\n                        dfd.reject(null, 'abort', 'abort');\\n                        return promise;\\n                    };\\n                    this._getFileInputFiles(data.fileInput).always(\\n                        function (files) {\\n                            if (aborted) {\\n                                return;\\n                            }\\n                            data.files = files;\\n                            jqXHR = that._onSend(null, data).then(\\n                                function (result, textStatus, jqXHR) {\\n                                    dfd.resolve(result, textStatus, jqXHR);\\n                                },\\n                                function (jqXHR, textStatus, errorThrown) {\\n                                    dfd.reject(jqXHR, textStatus, errorThrown);\\n                                }\\n                            );\\n                        }\\n                    );\\n                    return this._enhancePromise(promise);\\n                }\\n                data.files = $.makeArray(data.files);\\n                if (data.files.length) {\\n                    return this._onSend(null, data);\\n                }\\n            }\\n            return this._getXHRPromise(false, data && data.context);\\n        }\\n\\n    });\\n\\n}));\\n\"\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjkuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ib3dlcl9jb21wb25lbnRzL2Nsb3VkaW5hcnlfanMvanMvanF1ZXJ5LmZpbGV1cGxvYWQuanM/ZjQ1ZiJdLCJzb3VyY2VzQ29udGVudCI6WyJtb2R1bGUuZXhwb3J0cyA9IFwiLypcXG4gKiBqUXVlcnkgRmlsZSBVcGxvYWQgUGx1Z2luIDUuMzEuNlxcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9ibHVlaW1wL2pRdWVyeS1GaWxlLVVwbG9hZFxcbiAqXFxuICogQ29weXJpZ2h0IDIwMTAsIFNlYmFzdGlhbiBUc2NoYW5cXG4gKiBodHRwczovL2JsdWVpbXAubmV0XFxuICpcXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2U6XFxuICogaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVRcXG4gKi9cXG5cXG4vKmpzbGludCBub21lbjogdHJ1ZSwgdW5wYXJhbTogdHJ1ZSwgcmVnZXhwOiB0cnVlICovXFxuLypnbG9iYWwgZGVmaW5lLCB3aW5kb3csIGRvY3VtZW50LCBsb2NhdGlvbiwgRmlsZSwgQmxvYiwgRm9ybURhdGEgKi9cXG5cXG4oZnVuY3Rpb24gKGZhY3RvcnkpIHtcXG4gICAgJ3VzZSBzdHJpY3QnO1xcbiAgICBpZiAodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kKSB7XFxuICAgICAgICAvLyBSZWdpc3RlciBhcyBhbiBhbm9ueW1vdXMgQU1EIG1vZHVsZTpcXG4gICAgICAgIGRlZmluZShbXFxuICAgICAgICAgICAgJ2pxdWVyeScsXFxuICAgICAgICAgICAgJ2pxdWVyeS51aS53aWRnZXQnXFxuICAgICAgICBdLCBmYWN0b3J5KTtcXG4gICAgfSBlbHNlIHtcXG4gICAgICAgIC8vIEJyb3dzZXIgZ2xvYmFsczpcXG4gICAgICAgIGZhY3Rvcnkod2luZG93LmpRdWVyeSk7XFxuICAgIH1cXG59KGZ1bmN0aW9uICgkKSB7XFxuICAgICd1c2Ugc3RyaWN0JztcXG5cXG4gICAgLy8gVGhlIEZpbGVSZWFkZXIgQVBJIGlzIG5vdCBhY3R1YWxseSB1c2VkLCBidXQgd29ya3MgYXMgZmVhdHVyZSBkZXRlY3Rpb24sXFxuICAgIC8vIGFzIGUuZy4gU2FmYXJpIHN1cHBvcnRzIFhIUiBmaWxlIHVwbG9hZHMgdmlhIHRoZSBGb3JtRGF0YSBBUEksXFxuICAgIC8vIGJ1dCBub3Qgbm9uLW11bHRpcGFydCBYSFIgZmlsZSB1cGxvYWRzOlxcbiAgICAkLnN1cHBvcnQueGhyRmlsZVVwbG9hZCA9ICEhKHdpbmRvdy5YTUxIdHRwUmVxdWVzdFVwbG9hZCAmJiB3aW5kb3cuRmlsZVJlYWRlcik7XFxuICAgICQuc3VwcG9ydC54aHJGb3JtRGF0YUZpbGVVcGxvYWQgPSAhIXdpbmRvdy5Gb3JtRGF0YTtcXG5cXG4gICAgLy8gRGV0ZWN0IHN1cHBvcnQgZm9yIEJsb2Igc2xpY2luZyAocmVxdWlyZWQgZm9yIGNodW5rZWQgdXBsb2Fkcyk6XFxuICAgICQuc3VwcG9ydC5ibG9iU2xpY2UgPSB3aW5kb3cuQmxvYiAmJiAoQmxvYi5wcm90b3R5cGUuc2xpY2UgfHxcXG4gICAgICAgIEJsb2IucHJvdG90eXBlLndlYmtpdFNsaWNlIHx8IEJsb2IucHJvdG90eXBlLm1velNsaWNlKTtcXG5cXG4gICAgLy8gVGhlIGZpbGV1cGxvYWQgd2lkZ2V0IGxpc3RlbnMgZm9yIGNoYW5nZSBldmVudHMgb24gZmlsZSBpbnB1dCBmaWVsZHMgZGVmaW5lZFxcbiAgICAvLyB2aWEgZmlsZUlucHV0IHNldHRpbmcgYW5kIHBhc3RlIG9yIGRyb3AgZXZlbnRzIG9mIHRoZSBnaXZlbiBkcm9wWm9uZS5cXG4gICAgLy8gSW4gYWRkaXRpb24gdG8gdGhlIGRlZmF1bHQgalF1ZXJ5IFdpZGdldCBtZXRob2RzLCB0aGUgZmlsZXVwbG9hZCB3aWRnZXRcXG4gICAgLy8gZXhwb3NlcyB0aGUgXFxcImFkZFxcXCIgYW5kIFxcXCJzZW5kXFxcIiBtZXRob2RzLCB0byBhZGQgb3IgZGlyZWN0bHkgc2VuZCBmaWxlcyB1c2luZ1xcbiAgICAvLyB0aGUgZmlsZXVwbG9hZCBBUEkuXFxuICAgIC8vIEJ5IGRlZmF1bHQsIGZpbGVzIGFkZGVkIHZpYSBmaWxlIGlucHV0IHNlbGVjdGlvbiwgcGFzdGUsIGRyYWcgJiBkcm9wIG9yXFxuICAgIC8vIFxcXCJhZGRcXFwiIG1ldGhvZCBhcmUgdXBsb2FkZWQgaW1tZWRpYXRlbHksIGJ1dCBpdCBpcyBwb3NzaWJsZSB0byBvdmVycmlkZVxcbiAgICAvLyB0aGUgXFxcImFkZFxcXCIgY2FsbGJhY2sgb3B0aW9uIHRvIHF1ZXVlIGZpbGUgdXBsb2Fkcy5cXG4gICAgJC53aWRnZXQoJ2JsdWVpbXAuZmlsZXVwbG9hZCcsIHtcXG5cXG4gICAgICAgIG9wdGlvbnM6IHtcXG4gICAgICAgICAgICAvLyBUaGUgZHJvcCB0YXJnZXQgZWxlbWVudChzKSwgYnkgdGhlIGRlZmF1bHQgdGhlIGNvbXBsZXRlIGRvY3VtZW50LlxcbiAgICAgICAgICAgIC8vIFNldCB0byBudWxsIHRvIGRpc2FibGUgZHJhZyAmIGRyb3Agc3VwcG9ydDpcXG4gICAgICAgICAgICBkcm9wWm9uZTogJChkb2N1bWVudCksXFxuICAgICAgICAgICAgLy8gVGhlIHBhc3RlIHRhcmdldCBlbGVtZW50KHMpLCBieSB0aGUgZGVmYXVsdCB0aGUgY29tcGxldGUgZG9jdW1lbnQuXFxuICAgICAgICAgICAgLy8gU2V0IHRvIG51bGwgdG8gZGlzYWJsZSBwYXN0ZSBzdXBwb3J0OlxcbiAgICAgICAgICAgIHBhc3RlWm9uZTogJChkb2N1bWVudCksXFxuICAgICAgICAgICAgLy8gVGhlIGZpbGUgaW5wdXQgZmllbGQocyksIHRoYXQgYXJlIGxpc3RlbmVkIHRvIGZvciBjaGFuZ2UgZXZlbnRzLlxcbiAgICAgICAgICAgIC8vIElmIHVuZGVmaW5lZCwgaXQgaXMgc2V0IHRvIHRoZSBmaWxlIGlucHV0IGZpZWxkcyBpbnNpZGVcXG4gICAgICAgICAgICAvLyBvZiB0aGUgd2lkZ2V0IGVsZW1lbnQgb24gcGx1Z2luIGluaXRpYWxpemF0aW9uLlxcbiAgICAgICAgICAgIC8vIFNldCB0byBudWxsIHRvIGRpc2FibGUgdGhlIGNoYW5nZSBsaXN0ZW5lci5cXG4gICAgICAgICAgICBmaWxlSW5wdXQ6IHVuZGVmaW5lZCxcXG4gICAgICAgICAgICAvLyBCeSBkZWZhdWx0LCB0aGUgZmlsZSBpbnB1dCBmaWVsZCBpcyByZXBsYWNlZCB3aXRoIGEgY2xvbmUgYWZ0ZXJcXG4gICAgICAgICAgICAvLyBlYWNoIGlucHV0IGZpZWxkIGNoYW5nZSBldmVudC4gVGhpcyBpcyByZXF1aXJlZCBmb3IgaWZyYW1lIHRyYW5zcG9ydFxcbiAgICAgICAgICAgIC8vIHF1ZXVlcyBhbmQgYWxsb3dzIGNoYW5nZSBldmVudHMgdG8gYmUgZmlyZWQgZm9yIHRoZSBzYW1lIGZpbGVcXG4gICAgICAgICAgICAvLyBzZWxlY3Rpb24sIGJ1dCBjYW4gYmUgZGlzYWJsZWQgYnkgc2V0dGluZyB0aGUgZm9sbG93aW5nIG9wdGlvbiB0byBmYWxzZTpcXG4gICAgICAgICAgICByZXBsYWNlRmlsZUlucHV0OiB0cnVlLFxcbiAgICAgICAgICAgIC8vIFRoZSBwYXJhbWV0ZXIgbmFtZSBmb3IgdGhlIGZpbGUgZm9ybSBkYXRhICh0aGUgcmVxdWVzdCBhcmd1bWVudCBuYW1lKS5cXG4gICAgICAgICAgICAvLyBJZiB1bmRlZmluZWQgb3IgZW1wdHksIHRoZSBuYW1lIHByb3BlcnR5IG9mIHRoZSBmaWxlIGlucHV0IGZpZWxkIGlzXFxuICAgICAgICAgICAgLy8gdXNlZCwgb3IgXFxcImZpbGVzW11cXFwiIGlmIHRoZSBmaWxlIGlucHV0IG5hbWUgcHJvcGVydHkgaXMgYWxzbyBlbXB0eSxcXG4gICAgICAgICAgICAvLyBjYW4gYmUgYSBzdHJpbmcgb3IgYW4gYXJyYXkgb2Ygc3RyaW5nczpcXG4gICAgICAgICAgICBwYXJhbU5hbWU6IHVuZGVmaW5lZCxcXG4gICAgICAgICAgICAvLyBCeSBkZWZhdWx0LCBlYWNoIGZpbGUgb2YgYSBzZWxlY3Rpb24gaXMgdXBsb2FkZWQgdXNpbmcgYW4gaW5kaXZpZHVhbFxcbiAgICAgICAgICAgIC8vIHJlcXVlc3QgZm9yIFhIUiB0eXBlIHVwbG9hZHMuIFNldCB0byBmYWxzZSB0byB1cGxvYWQgZmlsZVxcbiAgICAgICAgICAgIC8vIHNlbGVjdGlvbnMgaW4gb25lIHJlcXVlc3QgZWFjaDpcXG4gICAgICAgICAgICBzaW5nbGVGaWxlVXBsb2FkczogdHJ1ZSxcXG4gICAgICAgICAgICAvLyBUbyBsaW1pdCB0aGUgbnVtYmVyIG9mIGZpbGVzIHVwbG9hZGVkIHdpdGggb25lIFhIUiByZXF1ZXN0LFxcbiAgICAgICAgICAgIC8vIHNldCB0aGUgZm9sbG93aW5nIG9wdGlvbiB0byBhbiBpbnRlZ2VyIGdyZWF0ZXIgdGhhbiAwOlxcbiAgICAgICAgICAgIGxpbWl0TXVsdGlGaWxlVXBsb2FkczogdW5kZWZpbmVkLFxcbiAgICAgICAgICAgIC8vIFNldCB0aGUgZm9sbG93aW5nIG9wdGlvbiB0byB0cnVlIHRvIGlzc3VlIGFsbCBmaWxlIHVwbG9hZCByZXF1ZXN0c1xcbiAgICAgICAgICAgIC8vIGluIGEgc2VxdWVudGlhbCBvcmRlcjpcXG4gICAgICAgICAgICBzZXF1ZW50aWFsVXBsb2FkczogZmFsc2UsXFxuICAgICAgICAgICAgLy8gVG8gbGltaXQgdGhlIG51bWJlciBvZiBjb25jdXJyZW50IHVwbG9hZHMsXFxuICAgICAgICAgICAgLy8gc2V0IHRoZSBmb2xsb3dpbmcgb3B0aW9uIHRvIGFuIGludGVnZXIgZ3JlYXRlciB0aGFuIDA6XFxuICAgICAgICAgICAgbGltaXRDb25jdXJyZW50VXBsb2FkczogdW5kZWZpbmVkLFxcbiAgICAgICAgICAgIC8vIFNldCB0aGUgZm9sbG93aW5nIG9wdGlvbiB0byB0cnVlIHRvIGZvcmNlIGlmcmFtZSB0cmFuc3BvcnQgdXBsb2FkczpcXG4gICAgICAgICAgICBmb3JjZUlmcmFtZVRyYW5zcG9ydDogZmFsc2UsXFxuICAgICAgICAgICAgLy8gU2V0IHRoZSBmb2xsb3dpbmcgb3B0aW9uIHRvIHRoZSBsb2NhdGlvbiBvZiBhIHJlZGlyZWN0IHVybCBvbiB0aGVcXG4gICAgICAgICAgICAvLyBvcmlnaW4gc2VydmVyLCBmb3IgY3Jvc3MtZG9tYWluIGlmcmFtZSB0cmFuc3BvcnQgdXBsb2FkczpcXG4gICAgICAgICAgICByZWRpcmVjdDogdW5kZWZpbmVkLFxcbiAgICAgICAgICAgIC8vIFRoZSBwYXJhbWV0ZXIgbmFtZSBmb3IgdGhlIHJlZGlyZWN0IHVybCwgc2VudCBhcyBwYXJ0IG9mIHRoZSBmb3JtXFxuICAgICAgICAgICAgLy8gZGF0YSBhbmQgc2V0IHRvICdyZWRpcmVjdCcgaWYgdGhpcyBvcHRpb24gaXMgZW1wdHk6XFxuICAgICAgICAgICAgcmVkaXJlY3RQYXJhbU5hbWU6IHVuZGVmaW5lZCxcXG4gICAgICAgICAgICAvLyBTZXQgdGhlIGZvbGxvd2luZyBvcHRpb24gdG8gdGhlIGxvY2F0aW9uIG9mIGEgcG9zdE1lc3NhZ2Ugd2luZG93LFxcbiAgICAgICAgICAgIC8vIHRvIGVuYWJsZSBwb3N0TWVzc2FnZSB0cmFuc3BvcnQgdXBsb2FkczpcXG4gICAgICAgICAgICBwb3N0TWVzc2FnZTogdW5kZWZpbmVkLFxcbiAgICAgICAgICAgIC8vIEJ5IGRlZmF1bHQsIFhIUiBmaWxlIHVwbG9hZHMgYXJlIHNlbnQgYXMgbXVsdGlwYXJ0L2Zvcm0tZGF0YS5cXG4gICAgICAgICAgICAvLyBUaGUgaWZyYW1lIHRyYW5zcG9ydCBpcyBhbHdheXMgdXNpbmcgbXVsdGlwYXJ0L2Zvcm0tZGF0YS5cXG4gICAgICAgICAgICAvLyBTZXQgdG8gZmFsc2UgdG8gZW5hYmxlIG5vbi1tdWx0aXBhcnQgWEhSIHVwbG9hZHM6XFxuICAgICAgICAgICAgbXVsdGlwYXJ0OiB0cnVlLFxcbiAgICAgICAgICAgIC8vIFRvIHVwbG9hZCBsYXJnZSBmaWxlcyBpbiBzbWFsbGVyIGNodW5rcywgc2V0IHRoZSBmb2xsb3dpbmcgb3B0aW9uXFxuICAgICAgICAgICAgLy8gdG8gYSBwcmVmZXJyZWQgbWF4aW11bSBjaHVuayBzaXplLiBJZiBzZXQgdG8gMCwgbnVsbCBvciB1bmRlZmluZWQsXFxuICAgICAgICAgICAgLy8gb3IgdGhlIGJyb3dzZXIgZG9lcyBub3Qgc3VwcG9ydCB0aGUgcmVxdWlyZWQgQmxvYiBBUEksIGZpbGVzIHdpbGxcXG4gICAgICAgICAgICAvLyBiZSB1cGxvYWRlZCBhcyBhIHdob2xlLlxcbiAgICAgICAgICAgIG1heENodW5rU2l6ZTogdW5kZWZpbmVkLFxcbiAgICAgICAgICAgIC8vIFdoZW4gYSBub24tbXVsdGlwYXJ0IHVwbG9hZCBvciBhIGNodW5rZWQgbXVsdGlwYXJ0IHVwbG9hZCBoYXMgYmVlblxcbiAgICAgICAgICAgIC8vIGFib3J0ZWQsIHRoaXMgb3B0aW9uIGNhbiBiZSB1c2VkIHRvIHJlc3VtZSB0aGUgdXBsb2FkIGJ5IHNldHRpbmdcXG4gICAgICAgICAgICAvLyBpdCB0byB0aGUgc2l6ZSBvZiB0aGUgYWxyZWFkeSB1cGxvYWRlZCBieXRlcy4gVGhpcyBvcHRpb24gaXMgbW9zdFxcbiAgICAgICAgICAgIC8vIHVzZWZ1bCB3aGVuIG1vZGlmeWluZyB0aGUgb3B0aW9ucyBvYmplY3QgaW5zaWRlIG9mIHRoZSBcXFwiYWRkXFxcIiBvclxcbiAgICAgICAgICAgIC8vIFxcXCJzZW5kXFxcIiBjYWxsYmFja3MsIGFzIHRoZSBvcHRpb25zIGFyZSBjbG9uZWQgZm9yIGVhY2ggZmlsZSB1cGxvYWQuXFxuICAgICAgICAgICAgdXBsb2FkZWRCeXRlczogdW5kZWZpbmVkLFxcbiAgICAgICAgICAgIC8vIEJ5IGRlZmF1bHQsIGZhaWxlZCAoYWJvcnQgb3IgZXJyb3IpIGZpbGUgdXBsb2FkcyBhcmUgcmVtb3ZlZCBmcm9tIHRoZVxcbiAgICAgICAgICAgIC8vIGdsb2JhbCBwcm9ncmVzcyBjYWxjdWxhdGlvbi4gU2V0IHRoZSBmb2xsb3dpbmcgb3B0aW9uIHRvIGZhbHNlIHRvXFxuICAgICAgICAgICAgLy8gcHJldmVudCByZWNhbGN1bGF0aW5nIHRoZSBnbG9iYWwgcHJvZ3Jlc3MgZGF0YTpcXG4gICAgICAgICAgICByZWNhbGN1bGF0ZVByb2dyZXNzOiB0cnVlLFxcbiAgICAgICAgICAgIC8vIEludGVydmFsIGluIG1pbGxpc2Vjb25kcyB0byBjYWxjdWxhdGUgYW5kIHRyaWdnZXIgcHJvZ3Jlc3MgZXZlbnRzOlxcbiAgICAgICAgICAgIHByb2dyZXNzSW50ZXJ2YWw6IDEwMCxcXG4gICAgICAgICAgICAvLyBJbnRlcnZhbCBpbiBtaWxsaXNlY29uZHMgdG8gY2FsY3VsYXRlIHByb2dyZXNzIGJpdHJhdGU6XFxuICAgICAgICAgICAgYml0cmF0ZUludGVydmFsOiA1MDAsXFxuICAgICAgICAgICAgLy8gQnkgZGVmYXVsdCwgdXBsb2FkcyBhcmUgc3RhcnRlZCBhdXRvbWF0aWNhbGx5IHdoZW4gYWRkaW5nIGZpbGVzOlxcbiAgICAgICAgICAgIGF1dG9VcGxvYWQ6IHRydWUsXFxuXFxuICAgICAgICAgICAgLy8gRXJyb3IgYW5kIGluZm8gbWVzc2FnZXM6XFxuICAgICAgICAgICAgbWVzc2FnZXM6IHtcXG4gICAgICAgICAgICAgICAgdXBsb2FkZWRCeXRlczogJ1VwbG9hZGVkIGJ5dGVzIGV4Y2VlZCBmaWxlIHNpemUnXFxuICAgICAgICAgICAgfSxcXG5cXG4gICAgICAgICAgICAvLyBUcmFuc2xhdGlvbiBmdW5jdGlvbiwgZ2V0cyB0aGUgbWVzc2FnZSBrZXkgdG8gYmUgdHJhbnNsYXRlZFxcbiAgICAgICAgICAgIC8vIGFuZCBhbiBvYmplY3Qgd2l0aCBjb250ZXh0IHNwZWNpZmljIGRhdGEgYXMgYXJndW1lbnRzOlxcbiAgICAgICAgICAgIGkxOG46IGZ1bmN0aW9uIChtZXNzYWdlLCBjb250ZXh0KSB7XFxuICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSB0aGlzLm1lc3NhZ2VzW21lc3NhZ2VdIHx8IG1lc3NhZ2UudG9TdHJpbmcoKTtcXG4gICAgICAgICAgICAgICAgaWYgKGNvbnRleHQpIHtcXG4gICAgICAgICAgICAgICAgICAgICQuZWFjaChjb250ZXh0LCBmdW5jdGlvbiAoa2V5LCB2YWx1ZSkge1xcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBtZXNzYWdlLnJlcGxhY2UoJ3snICsga2V5ICsgJ30nLCB2YWx1ZSk7XFxuICAgICAgICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICByZXR1cm4gbWVzc2FnZTtcXG4gICAgICAgICAgICB9LFxcblxcbiAgICAgICAgICAgIC8vIEFkZGl0aW9uYWwgZm9ybSBkYXRhIHRvIGJlIHNlbnQgYWxvbmcgd2l0aCB0aGUgZmlsZSB1cGxvYWRzIGNhbiBiZSBzZXRcXG4gICAgICAgICAgICAvLyB1c2luZyB0aGlzIG9wdGlvbiwgd2hpY2ggYWNjZXB0cyBhbiBhcnJheSBvZiBvYmplY3RzIHdpdGggbmFtZSBhbmRcXG4gICAgICAgICAgICAvLyB2YWx1ZSBwcm9wZXJ0aWVzLCBhIGZ1bmN0aW9uIHJldHVybmluZyBzdWNoIGFuIGFycmF5LCBhIEZvcm1EYXRhXFxuICAgICAgICAgICAgLy8gb2JqZWN0IChmb3IgWEhSIGZpbGUgdXBsb2FkcyksIG9yIGEgc2ltcGxlIG9iamVjdC5cXG4gICAgICAgICAgICAvLyBUaGUgZm9ybSBvZiB0aGUgZmlyc3QgZmlsZUlucHV0IGlzIGdpdmVuIGFzIHBhcmFtZXRlciB0byB0aGUgZnVuY3Rpb246XFxuICAgICAgICAgICAgZm9ybURhdGE6IGZ1bmN0aW9uIChmb3JtKSB7XFxuICAgICAgICAgICAgICAgIHJldHVybiBmb3JtLnNlcmlhbGl6ZUFycmF5KCk7XFxuICAgICAgICAgICAgfSxcXG5cXG4gICAgICAgICAgICAvLyBUaGUgYWRkIGNhbGxiYWNrIGlzIGludm9rZWQgYXMgc29vbiBhcyBmaWxlcyBhcmUgYWRkZWQgdG8gdGhlIGZpbGV1cGxvYWRcXG4gICAgICAgICAgICAvLyB3aWRnZXQgKHZpYSBmaWxlIGlucHV0IHNlbGVjdGlvbiwgZHJhZyAmIGRyb3AsIHBhc3RlIG9yIGFkZCBBUEkgY2FsbCkuXFxuICAgICAgICAgICAgLy8gSWYgdGhlIHNpbmdsZUZpbGVVcGxvYWRzIG9wdGlvbiBpcyBlbmFibGVkLCB0aGlzIGNhbGxiYWNrIHdpbGwgYmVcXG4gICAgICAgICAgICAvLyBjYWxsZWQgb25jZSBmb3IgZWFjaCBmaWxlIGluIHRoZSBzZWxlY3Rpb24gZm9yIFhIUiBmaWxlIHVwbG9hZHMsIGVsc2VcXG4gICAgICAgICAgICAvLyBvbmNlIGZvciBlYWNoIGZpbGUgc2VsZWN0aW9uLlxcbiAgICAgICAgICAgIC8vXFxuICAgICAgICAgICAgLy8gVGhlIHVwbG9hZCBzdGFydHMgd2hlbiB0aGUgc3VibWl0IG1ldGhvZCBpcyBpbnZva2VkIG9uIHRoZSBkYXRhIHBhcmFtZXRlci5cXG4gICAgICAgICAgICAvLyBUaGUgZGF0YSBvYmplY3QgY29udGFpbnMgYSBmaWxlcyBwcm9wZXJ0eSBob2xkaW5nIHRoZSBhZGRlZCBmaWxlc1xcbiAgICAgICAgICAgIC8vIGFuZCBhbGxvd3MgeW91IHRvIG92ZXJyaWRlIHBsdWdpbiBvcHRpb25zIGFzIHdlbGwgYXMgZGVmaW5lIGFqYXggc2V0dGluZ3MuXFxuICAgICAgICAgICAgLy9cXG4gICAgICAgICAgICAvLyBMaXN0ZW5lcnMgZm9yIHRoaXMgY2FsbGJhY2sgY2FuIGFsc28gYmUgYm91bmQgdGhlIGZvbGxvd2luZyB3YXk6XFxuICAgICAgICAgICAgLy8gLmJpbmQoJ2ZpbGV1cGxvYWRhZGQnLCBmdW5jKTtcXG4gICAgICAgICAgICAvL1xcbiAgICAgICAgICAgIC8vIGRhdGEuc3VibWl0KCkgcmV0dXJucyBhIFByb21pc2Ugb2JqZWN0IGFuZCBhbGxvd3MgdG8gYXR0YWNoIGFkZGl0aW9uYWxcXG4gICAgICAgICAgICAvLyBoYW5kbGVycyB1c2luZyBqUXVlcnkncyBEZWZlcnJlZCBjYWxsYmFja3M6XFxuICAgICAgICAgICAgLy8gZGF0YS5zdWJtaXQoKS5kb25lKGZ1bmMpLmZhaWwoZnVuYykuYWx3YXlzKGZ1bmMpO1xcbiAgICAgICAgICAgIGFkZDogZnVuY3Rpb24gKGUsIGRhdGEpIHtcXG4gICAgICAgICAgICAgICAgaWYgKGRhdGEuYXV0b1VwbG9hZCB8fCAoZGF0YS5hdXRvVXBsb2FkICE9PSBmYWxzZSAmJlxcbiAgICAgICAgICAgICAgICAgICAgICAgICQodGhpcykuZmlsZXVwbG9hZCgnb3B0aW9uJywgJ2F1dG9VcGxvYWQnKSkpIHtcXG4gICAgICAgICAgICAgICAgICAgIGRhdGEucHJvY2VzcygpLmRvbmUoZnVuY3Rpb24gKCkge1xcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEuc3VibWl0KCk7XFxuICAgICAgICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIH0sXFxuXFxuICAgICAgICAgICAgLy8gT3RoZXIgY2FsbGJhY2tzOlxcblxcbiAgICAgICAgICAgIC8vIENhbGxiYWNrIGZvciB0aGUgc3VibWl0IGV2ZW50IG9mIGVhY2ggZmlsZSB1cGxvYWQ6XFxuICAgICAgICAgICAgLy8gc3VibWl0OiBmdW5jdGlvbiAoZSwgZGF0YSkge30sIC8vIC5iaW5kKCdmaWxldXBsb2Fkc3VibWl0JywgZnVuYyk7XFxuXFxuICAgICAgICAgICAgLy8gQ2FsbGJhY2sgZm9yIHRoZSBzdGFydCBvZiBlYWNoIGZpbGUgdXBsb2FkIHJlcXVlc3Q6XFxuICAgICAgICAgICAgLy8gc2VuZDogZnVuY3Rpb24gKGUsIGRhdGEpIHt9LCAvLyAuYmluZCgnZmlsZXVwbG9hZHNlbmQnLCBmdW5jKTtcXG5cXG4gICAgICAgICAgICAvLyBDYWxsYmFjayBmb3Igc3VjY2Vzc2Z1bCB1cGxvYWRzOlxcbiAgICAgICAgICAgIC8vIGRvbmU6IGZ1bmN0aW9uIChlLCBkYXRhKSB7fSwgLy8gLmJpbmQoJ2ZpbGV1cGxvYWRkb25lJywgZnVuYyk7XFxuXFxuICAgICAgICAgICAgLy8gQ2FsbGJhY2sgZm9yIGZhaWxlZCAoYWJvcnQgb3IgZXJyb3IpIHVwbG9hZHM6XFxuICAgICAgICAgICAgLy8gZmFpbDogZnVuY3Rpb24gKGUsIGRhdGEpIHt9LCAvLyAuYmluZCgnZmlsZXVwbG9hZGZhaWwnLCBmdW5jKTtcXG5cXG4gICAgICAgICAgICAvLyBDYWxsYmFjayBmb3IgY29tcGxldGVkIChzdWNjZXNzLCBhYm9ydCBvciBlcnJvcikgcmVxdWVzdHM6XFxuICAgICAgICAgICAgLy8gYWx3YXlzOiBmdW5jdGlvbiAoZSwgZGF0YSkge30sIC8vIC5iaW5kKCdmaWxldXBsb2FkYWx3YXlzJywgZnVuYyk7XFxuXFxuICAgICAgICAgICAgLy8gQ2FsbGJhY2sgZm9yIHVwbG9hZCBwcm9ncmVzcyBldmVudHM6XFxuICAgICAgICAgICAgLy8gcHJvZ3Jlc3M6IGZ1bmN0aW9uIChlLCBkYXRhKSB7fSwgLy8gLmJpbmQoJ2ZpbGV1cGxvYWRwcm9ncmVzcycsIGZ1bmMpO1xcblxcbiAgICAgICAgICAgIC8vIENhbGxiYWNrIGZvciBnbG9iYWwgdXBsb2FkIHByb2dyZXNzIGV2ZW50czpcXG4gICAgICAgICAgICAvLyBwcm9ncmVzc2FsbDogZnVuY3Rpb24gKGUsIGRhdGEpIHt9LCAvLyAuYmluZCgnZmlsZXVwbG9hZHByb2dyZXNzYWxsJywgZnVuYyk7XFxuXFxuICAgICAgICAgICAgLy8gQ2FsbGJhY2sgZm9yIHVwbG9hZHMgc3RhcnQsIGVxdWl2YWxlbnQgdG8gdGhlIGdsb2JhbCBhamF4U3RhcnQgZXZlbnQ6XFxuICAgICAgICAgICAgLy8gc3RhcnQ6IGZ1bmN0aW9uIChlKSB7fSwgLy8gLmJpbmQoJ2ZpbGV1cGxvYWRzdGFydCcsIGZ1bmMpO1xcblxcbiAgICAgICAgICAgIC8vIENhbGxiYWNrIGZvciB1cGxvYWRzIHN0b3AsIGVxdWl2YWxlbnQgdG8gdGhlIGdsb2JhbCBhamF4U3RvcCBldmVudDpcXG4gICAgICAgICAgICAvLyBzdG9wOiBmdW5jdGlvbiAoZSkge30sIC8vIC5iaW5kKCdmaWxldXBsb2Fkc3RvcCcsIGZ1bmMpO1xcblxcbiAgICAgICAgICAgIC8vIENhbGxiYWNrIGZvciBjaGFuZ2UgZXZlbnRzIG9mIHRoZSBmaWxlSW5wdXQocyk6XFxuICAgICAgICAgICAgLy8gY2hhbmdlOiBmdW5jdGlvbiAoZSwgZGF0YSkge30sIC8vIC5iaW5kKCdmaWxldXBsb2FkY2hhbmdlJywgZnVuYyk7XFxuXFxuICAgICAgICAgICAgLy8gQ2FsbGJhY2sgZm9yIHBhc3RlIGV2ZW50cyB0byB0aGUgcGFzdGVab25lKHMpOlxcbiAgICAgICAgICAgIC8vIHBhc3RlOiBmdW5jdGlvbiAoZSwgZGF0YSkge30sIC8vIC5iaW5kKCdmaWxldXBsb2FkcGFzdGUnLCBmdW5jKTtcXG5cXG4gICAgICAgICAgICAvLyBDYWxsYmFjayBmb3IgZHJvcCBldmVudHMgb2YgdGhlIGRyb3Bab25lKHMpOlxcbiAgICAgICAgICAgIC8vIGRyb3A6IGZ1bmN0aW9uIChlLCBkYXRhKSB7fSwgLy8gLmJpbmQoJ2ZpbGV1cGxvYWRkcm9wJywgZnVuYyk7XFxuXFxuICAgICAgICAgICAgLy8gQ2FsbGJhY2sgZm9yIGRyYWdvdmVyIGV2ZW50cyBvZiB0aGUgZHJvcFpvbmUocyk6XFxuICAgICAgICAgICAgLy8gZHJhZ292ZXI6IGZ1bmN0aW9uIChlKSB7fSwgLy8gLmJpbmQoJ2ZpbGV1cGxvYWRkcmFnb3ZlcicsIGZ1bmMpO1xcblxcbiAgICAgICAgICAgIC8vIENhbGxiYWNrIGZvciB0aGUgc3RhcnQgb2YgZWFjaCBjaHVuayB1cGxvYWQgcmVxdWVzdDpcXG4gICAgICAgICAgICAvLyBjaHVua3NlbmQ6IGZ1bmN0aW9uIChlLCBkYXRhKSB7fSwgLy8gLmJpbmQoJ2ZpbGV1cGxvYWRjaHVua3NlbmQnLCBmdW5jKTtcXG5cXG4gICAgICAgICAgICAvLyBDYWxsYmFjayBmb3Igc3VjY2Vzc2Z1bCBjaHVuayB1cGxvYWRzOlxcbiAgICAgICAgICAgIC8vIGNodW5rZG9uZTogZnVuY3Rpb24gKGUsIGRhdGEpIHt9LCAvLyAuYmluZCgnZmlsZXVwbG9hZGNodW5rZG9uZScsIGZ1bmMpO1xcblxcbiAgICAgICAgICAgIC8vIENhbGxiYWNrIGZvciBmYWlsZWQgKGFib3J0IG9yIGVycm9yKSBjaHVuayB1cGxvYWRzOlxcbiAgICAgICAgICAgIC8vIGNodW5rZmFpbDogZnVuY3Rpb24gKGUsIGRhdGEpIHt9LCAvLyAuYmluZCgnZmlsZXVwbG9hZGNodW5rZmFpbCcsIGZ1bmMpO1xcblxcbiAgICAgICAgICAgIC8vIENhbGxiYWNrIGZvciBjb21wbGV0ZWQgKHN1Y2Nlc3MsIGFib3J0IG9yIGVycm9yKSBjaHVuayB1cGxvYWQgcmVxdWVzdHM6XFxuICAgICAgICAgICAgLy8gY2h1bmthbHdheXM6IGZ1bmN0aW9uIChlLCBkYXRhKSB7fSwgLy8gLmJpbmQoJ2ZpbGV1cGxvYWRjaHVua2Fsd2F5cycsIGZ1bmMpO1xcblxcbiAgICAgICAgICAgIC8vIFRoZSBwbHVnaW4gb3B0aW9ucyBhcmUgdXNlZCBhcyBzZXR0aW5ncyBvYmplY3QgZm9yIHRoZSBhamF4IGNhbGxzLlxcbiAgICAgICAgICAgIC8vIFRoZSBmb2xsb3dpbmcgYXJlIGpRdWVyeSBhamF4IHNldHRpbmdzIHJlcXVpcmVkIGZvciB0aGUgZmlsZSB1cGxvYWRzOlxcbiAgICAgICAgICAgIHByb2Nlc3NEYXRhOiBmYWxzZSxcXG4gICAgICAgICAgICBjb250ZW50VHlwZTogZmFsc2UsXFxuICAgICAgICAgICAgY2FjaGU6IGZhbHNlXFxuICAgICAgICB9LFxcblxcbiAgICAgICAgLy8gQSBsaXN0IG9mIG9wdGlvbnMgdGhhdCByZXF1aXJlIHJlaW5pdGlhbGl6aW5nIGV2ZW50IGxpc3RlbmVycyBhbmQvb3JcXG4gICAgICAgIC8vIHNwZWNpYWwgaW5pdGlhbGl6YXRpb24gY29kZTpcXG4gICAgICAgIF9zcGVjaWFsT3B0aW9uczogW1xcbiAgICAgICAgICAgICdmaWxlSW5wdXQnLFxcbiAgICAgICAgICAgICdkcm9wWm9uZScsXFxuICAgICAgICAgICAgJ3Bhc3RlWm9uZScsXFxuICAgICAgICAgICAgJ211bHRpcGFydCcsXFxuICAgICAgICAgICAgJ2ZvcmNlSWZyYW1lVHJhbnNwb3J0J1xcbiAgICAgICAgXSxcXG5cXG4gICAgICAgIF9ibG9iU2xpY2U6ICQuc3VwcG9ydC5ibG9iU2xpY2UgJiYgZnVuY3Rpb24gKCkge1xcbiAgICAgICAgICAgIHZhciBzbGljZSA9IHRoaXMuc2xpY2UgfHwgdGhpcy53ZWJraXRTbGljZSB8fCB0aGlzLm1velNsaWNlO1xcbiAgICAgICAgICAgIHJldHVybiBzbGljZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xcbiAgICAgICAgfSxcXG5cXG4gICAgICAgIF9CaXRyYXRlVGltZXI6IGZ1bmN0aW9uICgpIHtcXG4gICAgICAgICAgICB0aGlzLnRpbWVzdGFtcCA9ICgoRGF0ZS5ub3cpID8gRGF0ZS5ub3coKSA6IChuZXcgRGF0ZSgpKS5nZXRUaW1lKCkpO1xcbiAgICAgICAgICAgIHRoaXMubG9hZGVkID0gMDtcXG4gICAgICAgICAgICB0aGlzLmJpdHJhdGUgPSAwO1xcbiAgICAgICAgICAgIHRoaXMuZ2V0Qml0cmF0ZSA9IGZ1bmN0aW9uIChub3csIGxvYWRlZCwgaW50ZXJ2YWwpIHtcXG4gICAgICAgICAgICAgICAgdmFyIHRpbWVEaWZmID0gbm93IC0gdGhpcy50aW1lc3RhbXA7XFxuICAgICAgICAgICAgICAgIGlmICghdGhpcy5iaXRyYXRlIHx8ICFpbnRlcnZhbCB8fCB0aW1lRGlmZiA+IGludGVydmFsKSB7XFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmJpdHJhdGUgPSAobG9hZGVkIC0gdGhpcy5sb2FkZWQpICogKDEwMDAgLyB0aW1lRGlmZikgKiA4O1xcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2FkZWQgPSBsb2FkZWQ7XFxuICAgICAgICAgICAgICAgICAgICB0aGlzLnRpbWVzdGFtcCA9IG5vdztcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5iaXRyYXRlO1xcbiAgICAgICAgICAgIH07XFxuICAgICAgICB9LFxcblxcbiAgICAgICAgX2lzWEhSVXBsb2FkOiBmdW5jdGlvbiAob3B0aW9ucykge1xcbiAgICAgICAgICAgIHJldHVybiAhb3B0aW9ucy5mb3JjZUlmcmFtZVRyYW5zcG9ydCAmJlxcbiAgICAgICAgICAgICAgICAoKCFvcHRpb25zLm11bHRpcGFydCAmJiAkLnN1cHBvcnQueGhyRmlsZVVwbG9hZCkgfHxcXG4gICAgICAgICAgICAgICAgJC5zdXBwb3J0LnhockZvcm1EYXRhRmlsZVVwbG9hZCk7XFxuICAgICAgICB9LFxcblxcbiAgICAgICAgX2dldEZvcm1EYXRhOiBmdW5jdGlvbiAob3B0aW9ucykge1xcbiAgICAgICAgICAgIHZhciBmb3JtRGF0YTtcXG4gICAgICAgICAgICBpZiAodHlwZW9mIG9wdGlvbnMuZm9ybURhdGEgPT09ICdmdW5jdGlvbicpIHtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIG9wdGlvbnMuZm9ybURhdGEob3B0aW9ucy5mb3JtKTtcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgaWYgKCQuaXNBcnJheShvcHRpb25zLmZvcm1EYXRhKSkge1xcbiAgICAgICAgICAgICAgICByZXR1cm4gb3B0aW9ucy5mb3JtRGF0YTtcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgaWYgKCQudHlwZShvcHRpb25zLmZvcm1EYXRhKSA9PT0gJ29iamVjdCcpIHtcXG4gICAgICAgICAgICAgICAgZm9ybURhdGEgPSBbXTtcXG4gICAgICAgICAgICAgICAgJC5lYWNoKG9wdGlvbnMuZm9ybURhdGEsIGZ1bmN0aW9uIChuYW1lLCB2YWx1ZSkge1xcbiAgICAgICAgICAgICAgICAgICAgZm9ybURhdGEucHVzaCh7bmFtZTogbmFtZSwgdmFsdWU6IHZhbHVlfSk7XFxuICAgICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgICAgICByZXR1cm4gZm9ybURhdGE7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIHJldHVybiBbXTtcXG4gICAgICAgIH0sXFxuXFxuICAgICAgICBfZ2V0VG90YWw6IGZ1bmN0aW9uIChmaWxlcykge1xcbiAgICAgICAgICAgIHZhciB0b3RhbCA9IDA7XFxuICAgICAgICAgICAgJC5lYWNoKGZpbGVzLCBmdW5jdGlvbiAoaW5kZXgsIGZpbGUpIHtcXG4gICAgICAgICAgICAgICAgdG90YWwgKz0gZmlsZS5zaXplIHx8IDE7XFxuICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgcmV0dXJuIHRvdGFsO1xcbiAgICAgICAgfSxcXG5cXG4gICAgICAgIF9pbml0UHJvZ3Jlc3NPYmplY3Q6IGZ1bmN0aW9uIChvYmopIHtcXG4gICAgICAgICAgICB2YXIgcHJvZ3Jlc3MgPSB7XFxuICAgICAgICAgICAgICAgIGxvYWRlZDogMCxcXG4gICAgICAgICAgICAgICAgdG90YWw6IDAsXFxuICAgICAgICAgICAgICAgIGJpdHJhdGU6IDBcXG4gICAgICAgICAgICB9O1xcbiAgICAgICAgICAgIGlmIChvYmouX3Byb2dyZXNzKSB7XFxuICAgICAgICAgICAgICAgICQuZXh0ZW5kKG9iai5fcHJvZ3Jlc3MsIHByb2dyZXNzKTtcXG4gICAgICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgICAgICBvYmouX3Byb2dyZXNzID0gcHJvZ3Jlc3M7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgfSxcXG5cXG4gICAgICAgIF9pbml0UmVzcG9uc2VPYmplY3Q6IGZ1bmN0aW9uIChvYmopIHtcXG4gICAgICAgICAgICB2YXIgcHJvcDtcXG4gICAgICAgICAgICBpZiAob2JqLl9yZXNwb25zZSkge1xcbiAgICAgICAgICAgICAgICBmb3IgKHByb3AgaW4gb2JqLl9yZXNwb25zZSkge1xcbiAgICAgICAgICAgICAgICAgICAgaWYgKG9iai5fcmVzcG9uc2UuaGFzT3duUHJvcGVydHkocHJvcCkpIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgb2JqLl9yZXNwb25zZVtwcm9wXTtcXG4gICAgICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgICAgIG9iai5fcmVzcG9uc2UgPSB7fTtcXG4gICAgICAgICAgICB9XFxuICAgICAgICB9LFxcblxcbiAgICAgICAgX29uUHJvZ3Jlc3M6IGZ1bmN0aW9uIChlLCBkYXRhKSB7XFxuICAgICAgICAgICAgaWYgKGUubGVuZ3RoQ29tcHV0YWJsZSkge1xcbiAgICAgICAgICAgICAgICB2YXIgbm93ID0gKChEYXRlLm5vdykgPyBEYXRlLm5vdygpIDogKG5ldyBEYXRlKCkpLmdldFRpbWUoKSksXFxuICAgICAgICAgICAgICAgICAgICBsb2FkZWQ7XFxuICAgICAgICAgICAgICAgIGlmIChkYXRhLl90aW1lICYmIGRhdGEucHJvZ3Jlc3NJbnRlcnZhbCAmJlxcbiAgICAgICAgICAgICAgICAgICAgICAgIChub3cgLSBkYXRhLl90aW1lIDwgZGF0YS5wcm9ncmVzc0ludGVydmFsKSAmJlxcbiAgICAgICAgICAgICAgICAgICAgICAgIGUubG9hZGVkICE9PSBlLnRvdGFsKSB7XFxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgZGF0YS5fdGltZSA9IG5vdztcXG4gICAgICAgICAgICAgICAgbG9hZGVkID0gTWF0aC5mbG9vcihcXG4gICAgICAgICAgICAgICAgICAgIGUubG9hZGVkIC8gZS50b3RhbCAqIChkYXRhLmNodW5rU2l6ZSB8fCBkYXRhLl9wcm9ncmVzcy50b3RhbClcXG4gICAgICAgICAgICAgICAgKSArIChkYXRhLnVwbG9hZGVkQnl0ZXMgfHwgMCk7XFxuICAgICAgICAgICAgICAgIC8vIEFkZCB0aGUgZGlmZmVyZW5jZSBmcm9tIHRoZSBwcmV2aW91c2x5IGxvYWRlZCBzdGF0ZVxcbiAgICAgICAgICAgICAgICAvLyB0byB0aGUgZ2xvYmFsIGxvYWRlZCBjb3VudGVyOlxcbiAgICAgICAgICAgICAgICB0aGlzLl9wcm9ncmVzcy5sb2FkZWQgKz0gKGxvYWRlZCAtIGRhdGEuX3Byb2dyZXNzLmxvYWRlZCk7XFxuICAgICAgICAgICAgICAgIHRoaXMuX3Byb2dyZXNzLmJpdHJhdGUgPSB0aGlzLl9iaXRyYXRlVGltZXIuZ2V0Qml0cmF0ZShcXG4gICAgICAgICAgICAgICAgICAgIG5vdyxcXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3Byb2dyZXNzLmxvYWRlZCxcXG4gICAgICAgICAgICAgICAgICAgIGRhdGEuYml0cmF0ZUludGVydmFsXFxuICAgICAgICAgICAgICAgICk7XFxuICAgICAgICAgICAgICAgIGRhdGEuX3Byb2dyZXNzLmxvYWRlZCA9IGRhdGEubG9hZGVkID0gbG9hZGVkO1xcbiAgICAgICAgICAgICAgICBkYXRhLl9wcm9ncmVzcy5iaXRyYXRlID0gZGF0YS5iaXRyYXRlID0gZGF0YS5fYml0cmF0ZVRpbWVyLmdldEJpdHJhdGUoXFxuICAgICAgICAgICAgICAgICAgICBub3csXFxuICAgICAgICAgICAgICAgICAgICBsb2FkZWQsXFxuICAgICAgICAgICAgICAgICAgICBkYXRhLmJpdHJhdGVJbnRlcnZhbFxcbiAgICAgICAgICAgICAgICApO1xcbiAgICAgICAgICAgICAgICAvLyBUcmlnZ2VyIGEgY3VzdG9tIHByb2dyZXNzIGV2ZW50IHdpdGggYSB0b3RhbCBkYXRhIHByb3BlcnR5IHNldFxcbiAgICAgICAgICAgICAgICAvLyB0byB0aGUgZmlsZSBzaXplKHMpIG9mIHRoZSBjdXJyZW50IHVwbG9hZCBhbmQgYSBsb2FkZWQgZGF0YVxcbiAgICAgICAgICAgICAgICAvLyBwcm9wZXJ0eSBjYWxjdWxhdGVkIGFjY29yZGluZ2x5OlxcbiAgICAgICAgICAgICAgICB0aGlzLl90cmlnZ2VyKCdwcm9ncmVzcycsIGUsIGRhdGEpO1xcbiAgICAgICAgICAgICAgICAvLyBUcmlnZ2VyIGEgZ2xvYmFsIHByb2dyZXNzIGV2ZW50IGZvciBhbGwgY3VycmVudCBmaWxlIHVwbG9hZHMsXFxuICAgICAgICAgICAgICAgIC8vIGluY2x1ZGluZyBhamF4IGNhbGxzIHF1ZXVlZCBmb3Igc2VxdWVudGlhbCBmaWxlIHVwbG9hZHM6XFxuICAgICAgICAgICAgICAgIHRoaXMuX3RyaWdnZXIoJ3Byb2dyZXNzYWxsJywgZSwgdGhpcy5fcHJvZ3Jlc3MpO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH0sXFxuXFxuICAgICAgICBfaW5pdFByb2dyZXNzTGlzdGVuZXI6IGZ1bmN0aW9uIChvcHRpb25zKSB7XFxuICAgICAgICAgICAgdmFyIHRoYXQgPSB0aGlzLFxcbiAgICAgICAgICAgICAgICB4aHIgPSBvcHRpb25zLnhociA/IG9wdGlvbnMueGhyKCkgOiAkLmFqYXhTZXR0aW5ncy54aHIoKTtcXG4gICAgICAgICAgICAvLyBBY2Nlc3NzIHRvIHRoZSBuYXRpdmUgWEhSIG9iamVjdCBpcyByZXF1aXJlZCB0byBhZGQgZXZlbnQgbGlzdGVuZXJzXFxuICAgICAgICAgICAgLy8gZm9yIHRoZSB1cGxvYWQgcHJvZ3Jlc3MgZXZlbnQ6XFxuICAgICAgICAgICAgaWYgKHhoci51cGxvYWQpIHtcXG4gICAgICAgICAgICAgICAgJCh4aHIudXBsb2FkKS5iaW5kKCdwcm9ncmVzcycsIGZ1bmN0aW9uIChlKSB7XFxuICAgICAgICAgICAgICAgICAgICB2YXIgb2UgPSBlLm9yaWdpbmFsRXZlbnQ7XFxuICAgICAgICAgICAgICAgICAgICAvLyBNYWtlIHN1cmUgdGhlIHByb2dyZXNzIGV2ZW50IHByb3BlcnRpZXMgZ2V0IGNvcGllZCBvdmVyOlxcbiAgICAgICAgICAgICAgICAgICAgZS5sZW5ndGhDb21wdXRhYmxlID0gb2UubGVuZ3RoQ29tcHV0YWJsZTtcXG4gICAgICAgICAgICAgICAgICAgIGUubG9hZGVkID0gb2UubG9hZGVkO1xcbiAgICAgICAgICAgICAgICAgICAgZS50b3RhbCA9IG9lLnRvdGFsO1xcbiAgICAgICAgICAgICAgICAgICAgdGhhdC5fb25Qcm9ncmVzcyhlLCBvcHRpb25zKTtcXG4gICAgICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgICAgIG9wdGlvbnMueGhyID0gZnVuY3Rpb24gKCkge1xcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHhocjtcXG4gICAgICAgICAgICAgICAgfTtcXG4gICAgICAgICAgICB9XFxuICAgICAgICB9LFxcblxcbiAgICAgICAgX2lzSW5zdGFuY2VPZjogZnVuY3Rpb24gKHR5cGUsIG9iaikge1xcbiAgICAgICAgICAgIC8vIENyb3NzLWZyYW1lIGluc3RhbmNlb2YgY2hlY2tcXG4gICAgICAgICAgICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG9iaikgPT09ICdbb2JqZWN0ICcgKyB0eXBlICsgJ10nO1xcbiAgICAgICAgfSxcXG5cXG4gICAgICAgIF9pbml0WEhSRGF0YTogZnVuY3Rpb24gKG9wdGlvbnMpIHtcXG4gICAgICAgICAgICB2YXIgdGhhdCA9IHRoaXMsXFxuICAgICAgICAgICAgICAgIGZvcm1EYXRhLFxcbiAgICAgICAgICAgICAgICBmaWxlID0gb3B0aW9ucy5maWxlc1swXSxcXG4gICAgICAgICAgICAgICAgLy8gSWdub3JlIG5vbi1tdWx0aXBhcnQgc2V0dGluZyBpZiBub3Qgc3VwcG9ydGVkOlxcbiAgICAgICAgICAgICAgICBtdWx0aXBhcnQgPSBvcHRpb25zLm11bHRpcGFydCB8fCAhJC5zdXBwb3J0LnhockZpbGVVcGxvYWQsXFxuICAgICAgICAgICAgICAgIHBhcmFtTmFtZSA9IG9wdGlvbnMucGFyYW1OYW1lWzBdO1xcbiAgICAgICAgICAgIG9wdGlvbnMuaGVhZGVycyA9IG9wdGlvbnMuaGVhZGVycyB8fCB7fTtcXG4gICAgICAgICAgICBpZiAob3B0aW9ucy5jb250ZW50UmFuZ2UpIHtcXG4gICAgICAgICAgICAgICAgb3B0aW9ucy5oZWFkZXJzWydDb250ZW50LVJhbmdlJ10gPSBvcHRpb25zLmNvbnRlbnRSYW5nZTtcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgaWYgKCFtdWx0aXBhcnQgfHwgb3B0aW9ucy5ibG9iIHx8ICF0aGlzLl9pc0luc3RhbmNlT2YoJ0ZpbGUnLCBmaWxlKSkge1xcbiAgICAgICAgICAgICAgICBvcHRpb25zLmhlYWRlcnNbJ0NvbnRlbnQtRGlzcG9zaXRpb24nXSA9ICdhdHRhY2htZW50OyBmaWxlbmFtZT1cXFwiJyArXFxuICAgICAgICAgICAgICAgICAgICBlbmNvZGVVUkkoZmlsZS5uYW1lKSArICdcXFwiJztcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgaWYgKCFtdWx0aXBhcnQpIHtcXG4gICAgICAgICAgICAgICAgb3B0aW9ucy5jb250ZW50VHlwZSA9IGZpbGUudHlwZTtcXG4gICAgICAgICAgICAgICAgb3B0aW9ucy5kYXRhID0gb3B0aW9ucy5ibG9iIHx8IGZpbGU7XFxuICAgICAgICAgICAgfSBlbHNlIGlmICgkLnN1cHBvcnQueGhyRm9ybURhdGFGaWxlVXBsb2FkKSB7XFxuICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLnBvc3RNZXNzYWdlKSB7XFxuICAgICAgICAgICAgICAgICAgICAvLyB3aW5kb3cucG9zdE1lc3NhZ2UgZG9lcyBub3QgYWxsb3cgc2VuZGluZyBGb3JtRGF0YVxcbiAgICAgICAgICAgICAgICAgICAgLy8gb2JqZWN0cywgc28gd2UganVzdCBhZGQgdGhlIEZpbGUvQmxvYiBvYmplY3RzIHRvXFxuICAgICAgICAgICAgICAgICAgICAvLyB0aGUgZm9ybURhdGEgYXJyYXkgYW5kIGxldCB0aGUgcG9zdE1lc3NhZ2Ugd2luZG93XFxuICAgICAgICAgICAgICAgICAgICAvLyBjcmVhdGUgdGhlIEZvcm1EYXRhIG9iamVjdCBvdXQgb2YgdGhpcyBhcnJheTpcXG4gICAgICAgICAgICAgICAgICAgIGZvcm1EYXRhID0gdGhpcy5fZ2V0Rm9ybURhdGEob3B0aW9ucyk7XFxuICAgICAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5ibG9iKSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgZm9ybURhdGEucHVzaCh7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IHBhcmFtTmFtZSxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IG9wdGlvbnMuYmxvYlxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAkLmVhY2gob3B0aW9ucy5maWxlcywgZnVuY3Rpb24gKGluZGV4LCBmaWxlKSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1EYXRhLnB1c2goe1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogb3B0aW9ucy5wYXJhbU5hbWVbaW5kZXhdIHx8IHBhcmFtTmFtZSxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBmaWxlXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoYXQuX2lzSW5zdGFuY2VPZignRm9ybURhdGEnLCBvcHRpb25zLmZvcm1EYXRhKSkge1xcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1EYXRhID0gb3B0aW9ucy5mb3JtRGF0YTtcXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgZm9ybURhdGEgPSBuZXcgRm9ybURhdGEoKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAkLmVhY2godGhpcy5fZ2V0Rm9ybURhdGEob3B0aW9ucyksIGZ1bmN0aW9uIChpbmRleCwgZmllbGQpIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybURhdGEuYXBwZW5kKGZpZWxkLm5hbWUsIGZpZWxkLnZhbHVlKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLmJsb2IpIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3JtRGF0YS5hcHBlbmQocGFyYW1OYW1lLCBvcHRpb25zLmJsb2IsIGZpbGUubmFtZSk7XFxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICQuZWFjaChvcHRpb25zLmZpbGVzLCBmdW5jdGlvbiAoaW5kZXgsIGZpbGUpIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBjaGVjayBhbGxvd3MgdGhlIHRlc3RzIHRvIHJ1biB3aXRoXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGR1bW15IG9iamVjdHM6XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGF0Ll9pc0luc3RhbmNlT2YoJ0ZpbGUnLCBmaWxlKSB8fFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuX2lzSW5zdGFuY2VPZignQmxvYicsIGZpbGUpKSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtRGF0YS5hcHBlbmQoXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5wYXJhbU5hbWVbaW5kZXhdIHx8IHBhcmFtTmFtZSxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGUubmFtZVxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgIG9wdGlvbnMuZGF0YSA9IGZvcm1EYXRhO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAvLyBCbG9iIHJlZmVyZW5jZSBpcyBub3QgbmVlZGVkIGFueW1vcmUsIGZyZWUgbWVtb3J5OlxcbiAgICAgICAgICAgIG9wdGlvbnMuYmxvYiA9IG51bGw7XFxuICAgICAgICB9LFxcblxcbiAgICAgICAgX2luaXRJZnJhbWVTZXR0aW5nczogZnVuY3Rpb24gKG9wdGlvbnMpIHtcXG4gICAgICAgICAgICB2YXIgdGFyZ2V0SG9zdCA9ICQoJzxhPjwvYT4nKS5wcm9wKCdocmVmJywgb3B0aW9ucy51cmwpLnByb3AoJ2hvc3QnKTtcXG4gICAgICAgICAgICAvLyBTZXR0aW5nIHRoZSBkYXRhVHlwZSB0byBpZnJhbWUgZW5hYmxlcyB0aGUgaWZyYW1lIHRyYW5zcG9ydDpcXG4gICAgICAgICAgICBvcHRpb25zLmRhdGFUeXBlID0gJ2lmcmFtZSAnICsgKG9wdGlvbnMuZGF0YVR5cGUgfHwgJycpO1xcbiAgICAgICAgICAgIC8vIFRoZSBpZnJhbWUgdHJhbnNwb3J0IGFjY2VwdHMgYSBzZXJpYWxpemVkIGFycmF5IGFzIGZvcm0gZGF0YTpcXG4gICAgICAgICAgICBvcHRpb25zLmZvcm1EYXRhID0gdGhpcy5fZ2V0Rm9ybURhdGEob3B0aW9ucyk7XFxuICAgICAgICAgICAgLy8gQWRkIHJlZGlyZWN0IHVybCB0byBmb3JtIGRhdGEgb24gY3Jvc3MtZG9tYWluIHVwbG9hZHM6XFxuICAgICAgICAgICAgaWYgKG9wdGlvbnMucmVkaXJlY3QgJiYgdGFyZ2V0SG9zdCAmJiB0YXJnZXRIb3N0ICE9PSBsb2NhdGlvbi5ob3N0KSB7XFxuICAgICAgICAgICAgICAgIG9wdGlvbnMuZm9ybURhdGEucHVzaCh7XFxuICAgICAgICAgICAgICAgICAgICBuYW1lOiBvcHRpb25zLnJlZGlyZWN0UGFyYW1OYW1lIHx8ICdyZWRpcmVjdCcsXFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogb3B0aW9ucy5yZWRpcmVjdFxcbiAgICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICB9XFxuICAgICAgICB9LFxcblxcbiAgICAgICAgX2luaXREYXRhU2V0dGluZ3M6IGZ1bmN0aW9uIChvcHRpb25zKSB7XFxuICAgICAgICAgICAgaWYgKHRoaXMuX2lzWEhSVXBsb2FkKG9wdGlvbnMpKSB7XFxuICAgICAgICAgICAgICAgIGlmICghdGhpcy5fY2h1bmtlZFVwbG9hZChvcHRpb25zLCB0cnVlKSkge1xcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFvcHRpb25zLmRhdGEpIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9pbml0WEhSRGF0YShvcHRpb25zKTtcXG4gICAgICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2luaXRQcm9ncmVzc0xpc3RlbmVyKG9wdGlvbnMpO1xcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLnBvc3RNZXNzYWdlKSB7XFxuICAgICAgICAgICAgICAgICAgICAvLyBTZXR0aW5nIHRoZSBkYXRhVHlwZSB0byBwb3N0bWVzc2FnZSBlbmFibGVzIHRoZVxcbiAgICAgICAgICAgICAgICAgICAgLy8gcG9zdE1lc3NhZ2UgdHJhbnNwb3J0OlxcbiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5kYXRhVHlwZSA9ICdwb3N0bWVzc2FnZSAnICsgKG9wdGlvbnMuZGF0YVR5cGUgfHwgJycpO1xcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgdGhpcy5faW5pdElmcmFtZVNldHRpbmdzKG9wdGlvbnMpO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH0sXFxuXFxuICAgICAgICBfZ2V0UGFyYW1OYW1lOiBmdW5jdGlvbiAob3B0aW9ucykge1xcbiAgICAgICAgICAgIHZhciBmaWxlSW5wdXQgPSAkKG9wdGlvbnMuZmlsZUlucHV0KSxcXG4gICAgICAgICAgICAgICAgcGFyYW1OYW1lID0gb3B0aW9ucy5wYXJhbU5hbWU7XFxuICAgICAgICAgICAgaWYgKCFwYXJhbU5hbWUpIHtcXG4gICAgICAgICAgICAgICAgcGFyYW1OYW1lID0gW107XFxuICAgICAgICAgICAgICAgIGZpbGVJbnB1dC5lYWNoKGZ1bmN0aW9uICgpIHtcXG4gICAgICAgICAgICAgICAgICAgIHZhciBpbnB1dCA9ICQodGhpcyksXFxuICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSA9IGlucHV0LnByb3AoJ25hbWUnKSB8fCAnZmlsZXNbXScsXFxuICAgICAgICAgICAgICAgICAgICAgICAgaSA9IChpbnB1dC5wcm9wKCdmaWxlcycpIHx8IFsxXSkubGVuZ3RoO1xcbiAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGkpIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJhbU5hbWUucHVzaChuYW1lKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICBpIC09IDE7XFxuICAgICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgICAgICBpZiAoIXBhcmFtTmFtZS5sZW5ndGgpIHtcXG4gICAgICAgICAgICAgICAgICAgIHBhcmFtTmFtZSA9IFtmaWxlSW5wdXQucHJvcCgnbmFtZScpIHx8ICdmaWxlc1tdJ107XFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICB9IGVsc2UgaWYgKCEkLmlzQXJyYXkocGFyYW1OYW1lKSkge1xcbiAgICAgICAgICAgICAgICBwYXJhbU5hbWUgPSBbcGFyYW1OYW1lXTtcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgcmV0dXJuIHBhcmFtTmFtZTtcXG4gICAgICAgIH0sXFxuXFxuICAgICAgICBfaW5pdEZvcm1TZXR0aW5nczogZnVuY3Rpb24gKG9wdGlvbnMpIHtcXG4gICAgICAgICAgICAvLyBSZXRyaWV2ZSBtaXNzaW5nIG9wdGlvbnMgZnJvbSB0aGUgaW5wdXQgZmllbGQgYW5kIHRoZVxcbiAgICAgICAgICAgIC8vIGFzc29jaWF0ZWQgZm9ybSwgaWYgYXZhaWxhYmxlOlxcbiAgICAgICAgICAgIGlmICghb3B0aW9ucy5mb3JtIHx8ICFvcHRpb25zLmZvcm0ubGVuZ3RoKSB7XFxuICAgICAgICAgICAgICAgIG9wdGlvbnMuZm9ybSA9ICQob3B0aW9ucy5maWxlSW5wdXQucHJvcCgnZm9ybScpKTtcXG4gICAgICAgICAgICAgICAgLy8gSWYgdGhlIGdpdmVuIGZpbGUgaW5wdXQgZG9lc24ndCBoYXZlIGFuIGFzc29jaWF0ZWQgZm9ybSxcXG4gICAgICAgICAgICAgICAgLy8gdXNlIHRoZSBkZWZhdWx0IHdpZGdldCBmaWxlIGlucHV0J3MgZm9ybTpcXG4gICAgICAgICAgICAgICAgaWYgKCFvcHRpb25zLmZvcm0ubGVuZ3RoKSB7XFxuICAgICAgICAgICAgICAgICAgICBvcHRpb25zLmZvcm0gPSAkKHRoaXMub3B0aW9ucy5maWxlSW5wdXQucHJvcCgnZm9ybScpKTtcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICBvcHRpb25zLnBhcmFtTmFtZSA9IHRoaXMuX2dldFBhcmFtTmFtZShvcHRpb25zKTtcXG4gICAgICAgICAgICBpZiAoIW9wdGlvbnMudXJsKSB7XFxuICAgICAgICAgICAgICAgIG9wdGlvbnMudXJsID0gb3B0aW9ucy5mb3JtLnByb3AoJ2FjdGlvbicpIHx8IGxvY2F0aW9uLmhyZWY7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIC8vIFRoZSBIVFRQIHJlcXVlc3QgbWV0aG9kIG11c3QgYmUgXFxcIlBPU1RcXFwiIG9yIFxcXCJQVVRcXFwiOlxcbiAgICAgICAgICAgIG9wdGlvbnMudHlwZSA9IChvcHRpb25zLnR5cGUgfHwgb3B0aW9ucy5mb3JtLnByb3AoJ21ldGhvZCcpIHx8ICcnKVxcbiAgICAgICAgICAgICAgICAudG9VcHBlckNhc2UoKTtcXG4gICAgICAgICAgICBpZiAob3B0aW9ucy50eXBlICE9PSAnUE9TVCcgJiYgb3B0aW9ucy50eXBlICE9PSAnUFVUJyAmJlxcbiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy50eXBlICE9PSAnUEFUQ0gnKSB7XFxuICAgICAgICAgICAgICAgIG9wdGlvbnMudHlwZSA9ICdQT1NUJztcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgaWYgKCFvcHRpb25zLmZvcm1BY2NlcHRDaGFyc2V0KSB7XFxuICAgICAgICAgICAgICAgIG9wdGlvbnMuZm9ybUFjY2VwdENoYXJzZXQgPSBvcHRpb25zLmZvcm0uYXR0cignYWNjZXB0LWNoYXJzZXQnKTtcXG4gICAgICAgICAgICB9XFxuICAgICAgICB9LFxcblxcbiAgICAgICAgX2dldEFKQVhTZXR0aW5nczogZnVuY3Rpb24gKGRhdGEpIHtcXG4gICAgICAgICAgICB2YXIgb3B0aW9ucyA9ICQuZXh0ZW5kKHt9LCB0aGlzLm9wdGlvbnMsIGRhdGEpO1xcbiAgICAgICAgICAgIHRoaXMuX2luaXRGb3JtU2V0dGluZ3Mob3B0aW9ucyk7XFxuICAgICAgICAgICAgdGhpcy5faW5pdERhdGFTZXR0aW5ncyhvcHRpb25zKTtcXG4gICAgICAgICAgICByZXR1cm4gb3B0aW9ucztcXG4gICAgICAgIH0sXFxuXFxuICAgICAgICAvLyBqUXVlcnkgMS42IGRvZXNuJ3QgcHJvdmlkZSAuc3RhdGUoKSxcXG4gICAgICAgIC8vIHdoaWxlIGpRdWVyeSAxLjgrIHJlbW92ZWQgLmlzUmVqZWN0ZWQoKSBhbmQgLmlzUmVzb2x2ZWQoKTpcXG4gICAgICAgIF9nZXREZWZlcnJlZFN0YXRlOiBmdW5jdGlvbiAoZGVmZXJyZWQpIHtcXG4gICAgICAgICAgICBpZiAoZGVmZXJyZWQuc3RhdGUpIHtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIGRlZmVycmVkLnN0YXRlKCk7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIGlmIChkZWZlcnJlZC5pc1Jlc29sdmVkKCkpIHtcXG4gICAgICAgICAgICAgICAgcmV0dXJuICdyZXNvbHZlZCc7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIGlmIChkZWZlcnJlZC5pc1JlamVjdGVkKCkpIHtcXG4gICAgICAgICAgICAgICAgcmV0dXJuICdyZWplY3RlZCc7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIHJldHVybiAncGVuZGluZyc7XFxuICAgICAgICB9LFxcblxcbiAgICAgICAgLy8gTWFwcyBqcVhIUiBjYWxsYmFja3MgdG8gdGhlIGVxdWl2YWxlbnRcXG4gICAgICAgIC8vIG1ldGhvZHMgb2YgdGhlIGdpdmVuIFByb21pc2Ugb2JqZWN0OlxcbiAgICAgICAgX2VuaGFuY2VQcm9taXNlOiBmdW5jdGlvbiAocHJvbWlzZSkge1xcbiAgICAgICAgICAgIHByb21pc2Uuc3VjY2VzcyA9IHByb21pc2UuZG9uZTtcXG4gICAgICAgICAgICBwcm9taXNlLmVycm9yID0gcHJvbWlzZS5mYWlsO1xcbiAgICAgICAgICAgIHByb21pc2UuY29tcGxldGUgPSBwcm9taXNlLmFsd2F5cztcXG4gICAgICAgICAgICByZXR1cm4gcHJvbWlzZTtcXG4gICAgICAgIH0sXFxuXFxuICAgICAgICAvLyBDcmVhdGVzIGFuZCByZXR1cm5zIGEgUHJvbWlzZSBvYmplY3QgZW5oYW5jZWQgd2l0aFxcbiAgICAgICAgLy8gdGhlIGpxWEhSIG1ldGhvZHMgYWJvcnQsIHN1Y2Nlc3MsIGVycm9yIGFuZCBjb21wbGV0ZTpcXG4gICAgICAgIF9nZXRYSFJQcm9taXNlOiBmdW5jdGlvbiAocmVzb2x2ZU9yUmVqZWN0LCBjb250ZXh0LCBhcmdzKSB7XFxuICAgICAgICAgICAgdmFyIGRmZCA9ICQuRGVmZXJyZWQoKSxcXG4gICAgICAgICAgICAgICAgcHJvbWlzZSA9IGRmZC5wcm9taXNlKCk7XFxuICAgICAgICAgICAgY29udGV4dCA9IGNvbnRleHQgfHwgdGhpcy5vcHRpb25zLmNvbnRleHQgfHwgcHJvbWlzZTtcXG4gICAgICAgICAgICBpZiAocmVzb2x2ZU9yUmVqZWN0ID09PSB0cnVlKSB7XFxuICAgICAgICAgICAgICAgIGRmZC5yZXNvbHZlV2l0aChjb250ZXh0LCBhcmdzKTtcXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHJlc29sdmVPclJlamVjdCA9PT0gZmFsc2UpIHtcXG4gICAgICAgICAgICAgICAgZGZkLnJlamVjdFdpdGgoY29udGV4dCwgYXJncyk7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIHByb21pc2UuYWJvcnQgPSBkZmQucHJvbWlzZTtcXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fZW5oYW5jZVByb21pc2UocHJvbWlzZSk7XFxuICAgICAgICB9LFxcblxcbiAgICAgICAgLy8gQWRkcyBjb252ZW5pZW5jZSBtZXRob2RzIHRvIHRoZSBkYXRhIGNhbGxiYWNrIGFyZ3VtZW50OlxcbiAgICAgICAgX2FkZENvbnZlbmllbmNlTWV0aG9kczogZnVuY3Rpb24gKGUsIGRhdGEpIHtcXG4gICAgICAgICAgICB2YXIgdGhhdCA9IHRoaXMsXFxuICAgICAgICAgICAgICAgIGdldFByb21pc2UgPSBmdW5jdGlvbiAoZGF0YSkge1xcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICQuRGVmZXJyZWQoKS5yZXNvbHZlV2l0aCh0aGF0LCBbZGF0YV0pLnByb21pc2UoKTtcXG4gICAgICAgICAgICAgICAgfTtcXG4gICAgICAgICAgICBkYXRhLnByb2Nlc3MgPSBmdW5jdGlvbiAocmVzb2x2ZUZ1bmMsIHJlamVjdEZ1bmMpIHtcXG4gICAgICAgICAgICAgICAgaWYgKHJlc29sdmVGdW5jIHx8IHJlamVjdEZ1bmMpIHtcXG4gICAgICAgICAgICAgICAgICAgIGRhdGEuX3Byb2Nlc3NRdWV1ZSA9IHRoaXMuX3Byb2Nlc3NRdWV1ZSA9XFxuICAgICAgICAgICAgICAgICAgICAgICAgKHRoaXMuX3Byb2Nlc3NRdWV1ZSB8fCBnZXRQcm9taXNlKHRoaXMpKVxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAucGlwZShyZXNvbHZlRnVuYywgcmVqZWN0RnVuYyk7XFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3Byb2Nlc3NRdWV1ZSB8fCBnZXRQcm9taXNlKHRoaXMpO1xcbiAgICAgICAgICAgIH07XFxuICAgICAgICAgICAgZGF0YS5zdWJtaXQgPSBmdW5jdGlvbiAoKSB7XFxuICAgICAgICAgICAgICAgIGlmICh0aGlzLnN0YXRlKCkgIT09ICdwZW5kaW5nJykge1xcbiAgICAgICAgICAgICAgICAgICAgZGF0YS5qcVhIUiA9IHRoaXMuanFYSFIgPVxcbiAgICAgICAgICAgICAgICAgICAgICAgICh0aGF0Ll90cmlnZ2VyKCdzdWJtaXQnLCBlLCB0aGlzKSAhPT0gZmFsc2UpICYmXFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhhdC5fb25TZW5kKGUsIHRoaXMpO1xcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmpxWEhSIHx8IHRoYXQuX2dldFhIUlByb21pc2UoKTtcXG4gICAgICAgICAgICB9O1xcbiAgICAgICAgICAgIGRhdGEuYWJvcnQgPSBmdW5jdGlvbiAoKSB7XFxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmpxWEhSKSB7XFxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5qcVhIUi5hYm9ydCgpO1xcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgIHJldHVybiB0aGF0Ll9nZXRYSFJQcm9taXNlKCk7XFxuICAgICAgICAgICAgfTtcXG4gICAgICAgICAgICBkYXRhLnN0YXRlID0gZnVuY3Rpb24gKCkge1xcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5qcVhIUikge1xcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoYXQuX2dldERlZmVycmVkU3RhdGUodGhpcy5qcVhIUik7XFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX3Byb2Nlc3NRdWV1ZSkge1xcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoYXQuX2dldERlZmVycmVkU3RhdGUodGhpcy5fcHJvY2Vzc1F1ZXVlKTtcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIH07XFxuICAgICAgICAgICAgZGF0YS5wcm9ncmVzcyA9IGZ1bmN0aW9uICgpIHtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3Byb2dyZXNzO1xcbiAgICAgICAgICAgIH07XFxuICAgICAgICAgICAgZGF0YS5yZXNwb25zZSA9IGZ1bmN0aW9uICgpIHtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3Jlc3BvbnNlO1xcbiAgICAgICAgICAgIH07XFxuICAgICAgICB9LFxcblxcbiAgICAgICAgLy8gUGFyc2VzIHRoZSBSYW5nZSBoZWFkZXIgZnJvbSB0aGUgc2VydmVyIHJlc3BvbnNlXFxuICAgICAgICAvLyBhbmQgcmV0dXJucyB0aGUgdXBsb2FkZWQgYnl0ZXM6XFxuICAgICAgICBfZ2V0VXBsb2FkZWRCeXRlczogZnVuY3Rpb24gKGpxWEhSKSB7XFxuICAgICAgICAgICAgdmFyIHJhbmdlID0ganFYSFIuZ2V0UmVzcG9uc2VIZWFkZXIoJ1JhbmdlJyksXFxuICAgICAgICAgICAgICAgIHBhcnRzID0gcmFuZ2UgJiYgcmFuZ2Uuc3BsaXQoJy0nKSxcXG4gICAgICAgICAgICAgICAgdXBwZXJCeXRlc1BvcyA9IHBhcnRzICYmIHBhcnRzLmxlbmd0aCA+IDEgJiZcXG4gICAgICAgICAgICAgICAgICAgIHBhcnNlSW50KHBhcnRzWzFdLCAxMCk7XFxuICAgICAgICAgICAgcmV0dXJuIHVwcGVyQnl0ZXNQb3MgJiYgdXBwZXJCeXRlc1BvcyArIDE7XFxuICAgICAgICB9LFxcblxcbiAgICAgICAgLy8gVXBsb2FkcyBhIGZpbGUgaW4gbXVsdGlwbGUsIHNlcXVlbnRpYWwgcmVxdWVzdHNcXG4gICAgICAgIC8vIGJ5IHNwbGl0dGluZyB0aGUgZmlsZSB1cCBpbiBtdWx0aXBsZSBibG9iIGNodW5rcy5cXG4gICAgICAgIC8vIElmIHRoZSBzZWNvbmQgcGFyYW1ldGVyIGlzIHRydWUsIG9ubHkgdGVzdHMgaWYgdGhlIGZpbGVcXG4gICAgICAgIC8vIHNob3VsZCBiZSB1cGxvYWRlZCBpbiBjaHVua3MsIGJ1dCBkb2VzIG5vdCBpbnZva2UgYW55XFxuICAgICAgICAvLyB1cGxvYWQgcmVxdWVzdHM6XFxuICAgICAgICBfY2h1bmtlZFVwbG9hZDogZnVuY3Rpb24gKG9wdGlvbnMsIHRlc3RPbmx5KSB7XFxuICAgICAgICAgICAgb3B0aW9ucy51cGxvYWRlZEJ5dGVzID0gb3B0aW9ucy51cGxvYWRlZEJ5dGVzIHx8IDA7XFxuICAgICAgICAgICAgdmFyIHRoYXQgPSB0aGlzLFxcbiAgICAgICAgICAgICAgICBmaWxlID0gb3B0aW9ucy5maWxlc1swXSxcXG4gICAgICAgICAgICAgICAgZnMgPSBmaWxlLnNpemUsXFxuICAgICAgICAgICAgICAgIHViID0gb3B0aW9ucy51cGxvYWRlZEJ5dGVzLFxcbiAgICAgICAgICAgICAgICBtY3MgPSBvcHRpb25zLm1heENodW5rU2l6ZSB8fCBmcyxcXG4gICAgICAgICAgICAgICAgc2xpY2UgPSB0aGlzLl9ibG9iU2xpY2UsXFxuICAgICAgICAgICAgICAgIGRmZCA9ICQuRGVmZXJyZWQoKSxcXG4gICAgICAgICAgICAgICAgcHJvbWlzZSA9IGRmZC5wcm9taXNlKCksXFxuICAgICAgICAgICAgICAgIGpxWEhSLFxcbiAgICAgICAgICAgICAgICB1cGxvYWQ7XFxuICAgICAgICAgICAgaWYgKCEodGhpcy5faXNYSFJVcGxvYWQob3B0aW9ucykgJiYgc2xpY2UgJiYgKHViIHx8IG1jcyA8IGZzKSkgfHxcXG4gICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuZGF0YSkge1xcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIGlmICh0ZXN0T25seSkge1xcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgaWYgKHViID49IGZzKSB7XFxuICAgICAgICAgICAgICAgIGZpbGUuZXJyb3IgPSBvcHRpb25zLmkxOG4oJ3VwbG9hZGVkQnl0ZXMnKTtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2dldFhIUlByb21pc2UoXFxuICAgICAgICAgICAgICAgICAgICBmYWxzZSxcXG4gICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuY29udGV4dCxcXG4gICAgICAgICAgICAgICAgICAgIFtudWxsLCAnZXJyb3InLCBmaWxlLmVycm9yXVxcbiAgICAgICAgICAgICAgICApO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAvLyBUaGUgY2h1bmsgdXBsb2FkIG1ldGhvZDpcXG4gICAgICAgICAgICB1cGxvYWQgPSBmdW5jdGlvbiAoKSB7XFxuICAgICAgICAgICAgICAgIC8vIENsb25lIHRoZSBvcHRpb25zIG9iamVjdCBmb3IgZWFjaCBjaHVuayB1cGxvYWQ6XFxuICAgICAgICAgICAgICAgIHZhciBvID0gJC5leHRlbmQoe30sIG9wdGlvbnMpLFxcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudExvYWRlZCA9IG8uX3Byb2dyZXNzLmxvYWRlZDtcXG4gICAgICAgICAgICAgICAgby5ibG9iID0gc2xpY2UuY2FsbChcXG4gICAgICAgICAgICAgICAgICAgIGZpbGUsXFxuICAgICAgICAgICAgICAgICAgICB1YixcXG4gICAgICAgICAgICAgICAgICAgIHViICsgbWNzLFxcbiAgICAgICAgICAgICAgICAgICAgZmlsZS50eXBlXFxuICAgICAgICAgICAgICAgICk7XFxuICAgICAgICAgICAgICAgIC8vIFN0b3JlIHRoZSBjdXJyZW50IGNodW5rIHNpemUsIGFzIHRoZSBibG9iIGl0c2VsZlxcbiAgICAgICAgICAgICAgICAvLyB3aWxsIGJlIGRlcmVmZXJlbmNlZCBhZnRlciBkYXRhIHByb2Nlc3Npbmc6XFxuICAgICAgICAgICAgICAgIG8uY2h1bmtTaXplID0gby5ibG9iLnNpemU7XFxuICAgICAgICAgICAgICAgIC8vIEV4cG9zZSB0aGUgY2h1bmsgYnl0ZXMgcG9zaXRpb24gcmFuZ2U6XFxuICAgICAgICAgICAgICAgIG8uY29udGVudFJhbmdlID0gJ2J5dGVzICcgKyB1YiArICctJyArXFxuICAgICAgICAgICAgICAgICAgICAodWIgKyBvLmNodW5rU2l6ZSAtIDEpICsgJy8nICsgZnM7XFxuICAgICAgICAgICAgICAgIC8vIFByb2Nlc3MgdGhlIHVwbG9hZCBkYXRhICh0aGUgYmxvYiBhbmQgcG90ZW50aWFsIGZvcm0gZGF0YSk6XFxuICAgICAgICAgICAgICAgIHRoYXQuX2luaXRYSFJEYXRhKG8pO1xcbiAgICAgICAgICAgICAgICAvLyBBZGQgcHJvZ3Jlc3MgbGlzdGVuZXJzIGZvciB0aGlzIGNodW5rIHVwbG9hZDpcXG4gICAgICAgICAgICAgICAgdGhhdC5faW5pdFByb2dyZXNzTGlzdGVuZXIobyk7XFxuICAgICAgICAgICAgICAgIGpxWEhSID0gKCh0aGF0Ll90cmlnZ2VyKCdjaHVua3NlbmQnLCBudWxsLCBvKSAhPT0gZmFsc2UgJiYgJC5hamF4KG8pKSB8fFxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuX2dldFhIUlByb21pc2UoZmFsc2UsIG8uY29udGV4dCkpXFxuICAgICAgICAgICAgICAgICAgICAuZG9uZShmdW5jdGlvbiAocmVzdWx0LCB0ZXh0U3RhdHVzLCBqcVhIUikge1xcbiAgICAgICAgICAgICAgICAgICAgICAgIHViID0gdGhhdC5fZ2V0VXBsb2FkZWRCeXRlcyhqcVhIUikgfHxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKHViICsgby5jaHVua1NpemUpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIENyZWF0ZSBhIHByb2dyZXNzIGV2ZW50IGlmIG5vIGZpbmFsIHByb2dyZXNzIGV2ZW50XFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2l0aCBsb2FkZWQgZXF1YWxpbmcgdG90YWwgaGFzIGJlZW4gdHJpZ2dlcmVkXFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZm9yIHRoaXMgY2h1bms6XFxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRMb2FkZWQgKyBvLmNodW5rU2l6ZSAtIG8uX3Byb2dyZXNzLmxvYWRlZCkge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGF0Ll9vblByb2dyZXNzKCQuRXZlbnQoJ3Byb2dyZXNzJywge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoQ29tcHV0YWJsZTogdHJ1ZSxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvYWRlZDogdWIgLSBvLnVwbG9hZGVkQnl0ZXMsXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3RhbDogdWIgLSBvLnVwbG9hZGVkQnl0ZXNcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksIG8pO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnVwbG9hZGVkQnl0ZXMgPSBvLnVwbG9hZGVkQnl0ZXMgPSB1YjtcXG4gICAgICAgICAgICAgICAgICAgICAgICBvLnJlc3VsdCA9IHJlc3VsdDtcXG4gICAgICAgICAgICAgICAgICAgICAgICBvLnRleHRTdGF0dXMgPSB0ZXh0U3RhdHVzO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIG8uanFYSFIgPSBqcVhIUjtcXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGF0Ll90cmlnZ2VyKCdjaHVua2RvbmUnLCBudWxsLCBvKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGF0Ll90cmlnZ2VyKCdjaHVua2Fsd2F5cycsIG51bGwsIG8pO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh1YiA8IGZzKSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZpbGUgdXBsb2FkIG5vdCB5ZXQgY29tcGxldGUsXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnRpbnVlIHdpdGggdGhlIG5leHQgY2h1bms6XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwbG9hZCgpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRmZC5yZXNvbHZlV2l0aChcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG8uY29udGV4dCxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyZXN1bHQsIHRleHRTdGF0dXMsIGpxWEhSXVxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgICAgIH0pXFxuICAgICAgICAgICAgICAgICAgICAuZmFpbChmdW5jdGlvbiAoanFYSFIsIHRleHRTdGF0dXMsIGVycm9yVGhyb3duKSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgby5qcVhIUiA9IGpxWEhSO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIG8udGV4dFN0YXR1cyA9IHRleHRTdGF0dXM7XFxuICAgICAgICAgICAgICAgICAgICAgICAgby5lcnJvclRocm93biA9IGVycm9yVGhyb3duO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuX3RyaWdnZXIoJ2NodW5rZmFpbCcsIG51bGwsIG8pO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuX3RyaWdnZXIoJ2NodW5rYWx3YXlzJywgbnVsbCwgbyk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgZGZkLnJlamVjdFdpdGgoXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG8uY29udGV4dCxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2pxWEhSLCB0ZXh0U3RhdHVzLCBlcnJvclRocm93bl1cXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xcbiAgICAgICAgICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgfTtcXG4gICAgICAgICAgICB0aGlzLl9lbmhhbmNlUHJvbWlzZShwcm9taXNlKTtcXG4gICAgICAgICAgICBwcm9taXNlLmFib3J0ID0gZnVuY3Rpb24gKCkge1xcbiAgICAgICAgICAgICAgICByZXR1cm4ganFYSFIuYWJvcnQoKTtcXG4gICAgICAgICAgICB9O1xcbiAgICAgICAgICAgIHVwbG9hZCgpO1xcbiAgICAgICAgICAgIHJldHVybiBwcm9taXNlO1xcbiAgICAgICAgfSxcXG5cXG4gICAgICAgIF9iZWZvcmVTZW5kOiBmdW5jdGlvbiAoZSwgZGF0YSkge1xcbiAgICAgICAgICAgIGlmICh0aGlzLl9hY3RpdmUgPT09IDApIHtcXG4gICAgICAgICAgICAgICAgLy8gdGhlIHN0YXJ0IGNhbGxiYWNrIGlzIHRyaWdnZXJlZCB3aGVuIGFuIHVwbG9hZCBzdGFydHNcXG4gICAgICAgICAgICAgICAgLy8gYW5kIG5vIG90aGVyIHVwbG9hZHMgYXJlIGN1cnJlbnRseSBydW5uaW5nLFxcbiAgICAgICAgICAgICAgICAvLyBlcXVpdmFsZW50IHRvIHRoZSBnbG9iYWwgYWpheFN0YXJ0IGV2ZW50OlxcbiAgICAgICAgICAgICAgICB0aGlzLl90cmlnZ2VyKCdzdGFydCcpO1xcbiAgICAgICAgICAgICAgICAvLyBTZXQgdGltZXIgZm9yIGdsb2JhbCBiaXRyYXRlIHByb2dyZXNzIGNhbGN1bGF0aW9uOlxcbiAgICAgICAgICAgICAgICB0aGlzLl9iaXRyYXRlVGltZXIgPSBuZXcgdGhpcy5fQml0cmF0ZVRpbWVyKCk7XFxuICAgICAgICAgICAgICAgIC8vIFJlc2V0IHRoZSBnbG9iYWwgcHJvZ3Jlc3MgdmFsdWVzOlxcbiAgICAgICAgICAgICAgICB0aGlzLl9wcm9ncmVzcy5sb2FkZWQgPSB0aGlzLl9wcm9ncmVzcy50b3RhbCA9IDA7XFxuICAgICAgICAgICAgICAgIHRoaXMuX3Byb2dyZXNzLmJpdHJhdGUgPSAwO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAvLyBNYWtlIHN1cmUgdGhlIGNvbnRhaW5lciBvYmplY3RzIGZvciB0aGUgLnJlc3BvbnNlKCkgYW5kXFxuICAgICAgICAgICAgLy8gLnByb2dyZXNzKCkgbWV0aG9kcyBvbiB0aGUgZGF0YSBvYmplY3QgYXJlIGF2YWlsYWJsZVxcbiAgICAgICAgICAgIC8vIGFuZCByZXNldCB0byB0aGVpciBpbml0aWFsIHN0YXRlOlxcbiAgICAgICAgICAgIHRoaXMuX2luaXRSZXNwb25zZU9iamVjdChkYXRhKTtcXG4gICAgICAgICAgICB0aGlzLl9pbml0UHJvZ3Jlc3NPYmplY3QoZGF0YSk7XFxuICAgICAgICAgICAgZGF0YS5fcHJvZ3Jlc3MubG9hZGVkID0gZGF0YS5sb2FkZWQgPSBkYXRhLnVwbG9hZGVkQnl0ZXMgfHwgMDtcXG4gICAgICAgICAgICBkYXRhLl9wcm9ncmVzcy50b3RhbCA9IGRhdGEudG90YWwgPSB0aGlzLl9nZXRUb3RhbChkYXRhLmZpbGVzKSB8fCAxO1xcbiAgICAgICAgICAgIGRhdGEuX3Byb2dyZXNzLmJpdHJhdGUgPSBkYXRhLmJpdHJhdGUgPSAwO1xcbiAgICAgICAgICAgIHRoaXMuX2FjdGl2ZSArPSAxO1xcbiAgICAgICAgICAgIC8vIEluaXRpYWxpemUgdGhlIGdsb2JhbCBwcm9ncmVzcyB2YWx1ZXM6XFxuICAgICAgICAgICAgdGhpcy5fcHJvZ3Jlc3MubG9hZGVkICs9IGRhdGEubG9hZGVkO1xcbiAgICAgICAgICAgIHRoaXMuX3Byb2dyZXNzLnRvdGFsICs9IGRhdGEudG90YWw7XFxuICAgICAgICB9LFxcblxcbiAgICAgICAgX29uRG9uZTogZnVuY3Rpb24gKHJlc3VsdCwgdGV4dFN0YXR1cywganFYSFIsIG9wdGlvbnMpIHtcXG4gICAgICAgICAgICB2YXIgdG90YWwgPSBvcHRpb25zLl9wcm9ncmVzcy50b3RhbCxcXG4gICAgICAgICAgICAgICAgcmVzcG9uc2UgPSBvcHRpb25zLl9yZXNwb25zZTtcXG4gICAgICAgICAgICBpZiAob3B0aW9ucy5fcHJvZ3Jlc3MubG9hZGVkIDwgdG90YWwpIHtcXG4gICAgICAgICAgICAgICAgLy8gQ3JlYXRlIGEgcHJvZ3Jlc3MgZXZlbnQgaWYgbm8gZmluYWwgcHJvZ3Jlc3MgZXZlbnRcXG4gICAgICAgICAgICAgICAgLy8gd2l0aCBsb2FkZWQgZXF1YWxpbmcgdG90YWwgaGFzIGJlZW4gdHJpZ2dlcmVkOlxcbiAgICAgICAgICAgICAgICB0aGlzLl9vblByb2dyZXNzKCQuRXZlbnQoJ3Byb2dyZXNzJywge1xcbiAgICAgICAgICAgICAgICAgICAgbGVuZ3RoQ29tcHV0YWJsZTogdHJ1ZSxcXG4gICAgICAgICAgICAgICAgICAgIGxvYWRlZDogdG90YWwsXFxuICAgICAgICAgICAgICAgICAgICB0b3RhbDogdG90YWxcXG4gICAgICAgICAgICAgICAgfSksIG9wdGlvbnMpO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICByZXNwb25zZS5yZXN1bHQgPSBvcHRpb25zLnJlc3VsdCA9IHJlc3VsdDtcXG4gICAgICAgICAgICByZXNwb25zZS50ZXh0U3RhdHVzID0gb3B0aW9ucy50ZXh0U3RhdHVzID0gdGV4dFN0YXR1cztcXG4gICAgICAgICAgICByZXNwb25zZS5qcVhIUiA9IG9wdGlvbnMuanFYSFIgPSBqcVhIUjtcXG4gICAgICAgICAgICB0aGlzLl90cmlnZ2VyKCdkb25lJywgbnVsbCwgb3B0aW9ucyk7XFxuICAgICAgICB9LFxcblxcbiAgICAgICAgX29uRmFpbDogZnVuY3Rpb24gKGpxWEhSLCB0ZXh0U3RhdHVzLCBlcnJvclRocm93biwgb3B0aW9ucykge1xcbiAgICAgICAgICAgIHZhciByZXNwb25zZSA9IG9wdGlvbnMuX3Jlc3BvbnNlO1xcbiAgICAgICAgICAgIGlmIChvcHRpb25zLnJlY2FsY3VsYXRlUHJvZ3Jlc3MpIHtcXG4gICAgICAgICAgICAgICAgLy8gUmVtb3ZlIHRoZSBmYWlsZWQgKGVycm9yIG9yIGFib3J0KSBmaWxlIHVwbG9hZCBmcm9tXFxuICAgICAgICAgICAgICAgIC8vIHRoZSBnbG9iYWwgcHJvZ3Jlc3MgY2FsY3VsYXRpb246XFxuICAgICAgICAgICAgICAgIHRoaXMuX3Byb2dyZXNzLmxvYWRlZCAtPSBvcHRpb25zLl9wcm9ncmVzcy5sb2FkZWQ7XFxuICAgICAgICAgICAgICAgIHRoaXMuX3Byb2dyZXNzLnRvdGFsIC09IG9wdGlvbnMuX3Byb2dyZXNzLnRvdGFsO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICByZXNwb25zZS5qcVhIUiA9IG9wdGlvbnMuanFYSFIgPSBqcVhIUjtcXG4gICAgICAgICAgICByZXNwb25zZS50ZXh0U3RhdHVzID0gb3B0aW9ucy50ZXh0U3RhdHVzID0gdGV4dFN0YXR1cztcXG4gICAgICAgICAgICByZXNwb25zZS5lcnJvclRocm93biA9IG9wdGlvbnMuZXJyb3JUaHJvd24gPSBlcnJvclRocm93bjtcXG4gICAgICAgICAgICB0aGlzLl90cmlnZ2VyKCdmYWlsJywgbnVsbCwgb3B0aW9ucyk7XFxuICAgICAgICB9LFxcblxcbiAgICAgICAgX29uQWx3YXlzOiBmdW5jdGlvbiAoanFYSFJvclJlc3VsdCwgdGV4dFN0YXR1cywganFYSFJvckVycm9yLCBvcHRpb25zKSB7XFxuICAgICAgICAgICAgLy8ganFYSFJvclJlc3VsdCwgdGV4dFN0YXR1cyBhbmQganFYSFJvckVycm9yIGFyZSBhZGRlZCB0byB0aGVcXG4gICAgICAgICAgICAvLyBvcHRpb25zIG9iamVjdCB2aWEgZG9uZSBhbmQgZmFpbCBjYWxsYmFja3NcXG4gICAgICAgICAgICB0aGlzLl90cmlnZ2VyKCdhbHdheXMnLCBudWxsLCBvcHRpb25zKTtcXG4gICAgICAgIH0sXFxuXFxuICAgICAgICBfb25TZW5kOiBmdW5jdGlvbiAoZSwgZGF0YSkge1xcbiAgICAgICAgICAgIGlmICghZGF0YS5zdWJtaXQpIHtcXG4gICAgICAgICAgICAgICAgdGhpcy5fYWRkQ29udmVuaWVuY2VNZXRob2RzKGUsIGRhdGEpO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICB2YXIgdGhhdCA9IHRoaXMsXFxuICAgICAgICAgICAgICAgIGpxWEhSLFxcbiAgICAgICAgICAgICAgICBhYm9ydGVkLFxcbiAgICAgICAgICAgICAgICBzbG90LFxcbiAgICAgICAgICAgICAgICBwaXBlLFxcbiAgICAgICAgICAgICAgICBvcHRpb25zID0gdGhhdC5fZ2V0QUpBWFNldHRpbmdzKGRhdGEpLFxcbiAgICAgICAgICAgICAgICBzZW5kID0gZnVuY3Rpb24gKCkge1xcbiAgICAgICAgICAgICAgICAgICAgdGhhdC5fc2VuZGluZyArPSAxO1xcbiAgICAgICAgICAgICAgICAgICAgLy8gU2V0IHRpbWVyIGZvciBiaXRyYXRlIHByb2dyZXNzIGNhbGN1bGF0aW9uOlxcbiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5fYml0cmF0ZVRpbWVyID0gbmV3IHRoYXQuX0JpdHJhdGVUaW1lcigpO1xcbiAgICAgICAgICAgICAgICAgICAganFYSFIgPSBqcVhIUiB8fCAoXFxuICAgICAgICAgICAgICAgICAgICAgICAgKChhYm9ydGVkIHx8IHRoYXQuX3RyaWdnZXIoJ3NlbmQnLCBlLCBvcHRpb25zKSA9PT0gZmFsc2UpICYmXFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhhdC5fZ2V0WEhSUHJvbWlzZShmYWxzZSwgb3B0aW9ucy5jb250ZXh0LCBhYm9ydGVkKSkgfHxcXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGF0Ll9jaHVua2VkVXBsb2FkKG9wdGlvbnMpIHx8ICQuYWpheChvcHRpb25zKVxcbiAgICAgICAgICAgICAgICAgICAgKS5kb25lKGZ1bmN0aW9uIChyZXN1bHQsIHRleHRTdGF0dXMsIGpxWEhSKSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhhdC5fb25Eb25lKHJlc3VsdCwgdGV4dFN0YXR1cywganFYSFIsIG9wdGlvbnMpO1xcbiAgICAgICAgICAgICAgICAgICAgfSkuZmFpbChmdW5jdGlvbiAoanFYSFIsIHRleHRTdGF0dXMsIGVycm9yVGhyb3duKSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhhdC5fb25GYWlsKGpxWEhSLCB0ZXh0U3RhdHVzLCBlcnJvclRocm93biwgb3B0aW9ucyk7XFxuICAgICAgICAgICAgICAgICAgICB9KS5hbHdheXMoZnVuY3Rpb24gKGpxWEhSb3JSZXN1bHQsIHRleHRTdGF0dXMsIGpxWEhSb3JFcnJvcikge1xcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuX29uQWx3YXlzKFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBqcVhIUm9yUmVzdWx0LFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0U3RhdHVzLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBqcVhIUm9yRXJyb3IsXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnNcXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuX3NlbmRpbmcgLT0gMTtcXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGF0Ll9hY3RpdmUgLT0gMTtcXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5saW1pdENvbmN1cnJlbnRVcGxvYWRzICYmXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLmxpbWl0Q29uY3VycmVudFVwbG9hZHMgPiB0aGF0Ll9zZW5kaW5nKSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFN0YXJ0IHRoZSBuZXh0IHF1ZXVlZCB1cGxvYWQsXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoYXQgaGFzIG5vdCBiZWVuIGFib3J0ZWQ6XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuZXh0U2xvdCA9IHRoYXQuX3Nsb3RzLnNoaWZ0KCk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChuZXh0U2xvdCkge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoYXQuX2dldERlZmVycmVkU3RhdGUobmV4dFNsb3QpID09PSAncGVuZGluZycpIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0U2xvdC5yZXNvbHZlKCk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0U2xvdCA9IHRoYXQuX3Nsb3RzLnNoaWZ0KCk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoYXQuX2FjdGl2ZSA9PT0gMCkge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGUgc3RvcCBjYWxsYmFjayBpcyB0cmlnZ2VyZWQgd2hlbiBhbGwgdXBsb2FkcyBoYXZlXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJlZW4gY29tcGxldGVkLCBlcXVpdmFsZW50IHRvIHRoZSBnbG9iYWwgYWpheFN0b3AgZXZlbnQ6XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuX3RyaWdnZXIoJ3N0b3AnKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBqcVhIUjtcXG4gICAgICAgICAgICAgICAgfTtcXG4gICAgICAgICAgICB0aGlzLl9iZWZvcmVTZW5kKGUsIG9wdGlvbnMpO1xcbiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMuc2VxdWVudGlhbFVwbG9hZHMgfHxcXG4gICAgICAgICAgICAgICAgICAgICh0aGlzLm9wdGlvbnMubGltaXRDb25jdXJyZW50VXBsb2FkcyAmJlxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmxpbWl0Q29uY3VycmVudFVwbG9hZHMgPD0gdGhpcy5fc2VuZGluZykpIHtcXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5saW1pdENvbmN1cnJlbnRVcGxvYWRzID4gMSkge1xcbiAgICAgICAgICAgICAgICAgICAgc2xvdCA9ICQuRGVmZXJyZWQoKTtcXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3Nsb3RzLnB1c2goc2xvdCk7XFxuICAgICAgICAgICAgICAgICAgICBwaXBlID0gc2xvdC5waXBlKHNlbmQpO1xcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fc2VxdWVuY2UgPSB0aGlzLl9zZXF1ZW5jZS5waXBlKHNlbmQsIHNlbmQpO1xcbiAgICAgICAgICAgICAgICAgICAgcGlwZSA9IHRoaXMuX3NlcXVlbmNlO1xcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgIC8vIFJldHVybiB0aGUgcGlwZWQgUHJvbWlzZSBvYmplY3QsIGVuaGFuY2VkIHdpdGggYW4gYWJvcnQgbWV0aG9kLFxcbiAgICAgICAgICAgICAgICAvLyB3aGljaCBpcyBkZWxlZ2F0ZWQgdG8gdGhlIGpxWEhSIG9iamVjdCBvZiB0aGUgY3VycmVudCB1cGxvYWQsXFxuICAgICAgICAgICAgICAgIC8vIGFuZCBqcVhIUiBjYWxsYmFja3MgbWFwcGVkIHRvIHRoZSBlcXVpdmFsZW50IFByb21pc2UgbWV0aG9kczpcXG4gICAgICAgICAgICAgICAgcGlwZS5hYm9ydCA9IGZ1bmN0aW9uICgpIHtcXG4gICAgICAgICAgICAgICAgICAgIGFib3J0ZWQgPSBbdW5kZWZpbmVkLCAnYWJvcnQnLCAnYWJvcnQnXTtcXG4gICAgICAgICAgICAgICAgICAgIGlmICghanFYSFIpIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2xvdCkge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbG90LnJlamVjdFdpdGgob3B0aW9ucy5jb250ZXh0LCBhYm9ydGVkKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlbmQoKTtcXG4gICAgICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBqcVhIUi5hYm9ydCgpO1xcbiAgICAgICAgICAgICAgICB9O1xcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fZW5oYW5jZVByb21pc2UocGlwZSk7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIHJldHVybiBzZW5kKCk7XFxuICAgICAgICB9LFxcblxcbiAgICAgICAgX29uQWRkOiBmdW5jdGlvbiAoZSwgZGF0YSkge1xcbiAgICAgICAgICAgIHZhciB0aGF0ID0gdGhpcyxcXG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gdHJ1ZSxcXG4gICAgICAgICAgICAgICAgb3B0aW9ucyA9ICQuZXh0ZW5kKHt9LCB0aGlzLm9wdGlvbnMsIGRhdGEpLFxcbiAgICAgICAgICAgICAgICBsaW1pdCA9IG9wdGlvbnMubGltaXRNdWx0aUZpbGVVcGxvYWRzLFxcbiAgICAgICAgICAgICAgICBwYXJhbU5hbWUgPSB0aGlzLl9nZXRQYXJhbU5hbWUob3B0aW9ucyksXFxuICAgICAgICAgICAgICAgIHBhcmFtTmFtZVNldCxcXG4gICAgICAgICAgICAgICAgcGFyYW1OYW1lU2xpY2UsXFxuICAgICAgICAgICAgICAgIGZpbGVTZXQsXFxuICAgICAgICAgICAgICAgIGk7XFxuICAgICAgICAgICAgaWYgKCEob3B0aW9ucy5zaW5nbGVGaWxlVXBsb2FkcyB8fCBsaW1pdCkgfHxcXG4gICAgICAgICAgICAgICAgICAgICF0aGlzLl9pc1hIUlVwbG9hZChvcHRpb25zKSkge1xcbiAgICAgICAgICAgICAgICBmaWxlU2V0ID0gW2RhdGEuZmlsZXNdO1xcbiAgICAgICAgICAgICAgICBwYXJhbU5hbWVTZXQgPSBbcGFyYW1OYW1lXTtcXG4gICAgICAgICAgICB9IGVsc2UgaWYgKCFvcHRpb25zLnNpbmdsZUZpbGVVcGxvYWRzICYmIGxpbWl0KSB7XFxuICAgICAgICAgICAgICAgIGZpbGVTZXQgPSBbXTtcXG4gICAgICAgICAgICAgICAgcGFyYW1OYW1lU2V0ID0gW107XFxuICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBkYXRhLmZpbGVzLmxlbmd0aDsgaSArPSBsaW1pdCkge1xcbiAgICAgICAgICAgICAgICAgICAgZmlsZVNldC5wdXNoKGRhdGEuZmlsZXMuc2xpY2UoaSwgaSArIGxpbWl0KSk7XFxuICAgICAgICAgICAgICAgICAgICBwYXJhbU5hbWVTbGljZSA9IHBhcmFtTmFtZS5zbGljZShpLCBpICsgbGltaXQpO1xcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFwYXJhbU5hbWVTbGljZS5sZW5ndGgpIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJhbU5hbWVTbGljZSA9IHBhcmFtTmFtZTtcXG4gICAgICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgICAgIHBhcmFtTmFtZVNldC5wdXNoKHBhcmFtTmFtZVNsaWNlKTtcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgICAgIHBhcmFtTmFtZVNldCA9IHBhcmFtTmFtZTtcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgZGF0YS5vcmlnaW5hbEZpbGVzID0gZGF0YS5maWxlcztcXG4gICAgICAgICAgICAkLmVhY2goZmlsZVNldCB8fCBkYXRhLmZpbGVzLCBmdW5jdGlvbiAoaW5kZXgsIGVsZW1lbnQpIHtcXG4gICAgICAgICAgICAgICAgdmFyIG5ld0RhdGEgPSAkLmV4dGVuZCh7fSwgZGF0YSk7XFxuICAgICAgICAgICAgICAgIG5ld0RhdGEuZmlsZXMgPSBmaWxlU2V0ID8gZWxlbWVudCA6IFtlbGVtZW50XTtcXG4gICAgICAgICAgICAgICAgbmV3RGF0YS5wYXJhbU5hbWUgPSBwYXJhbU5hbWVTZXRbaW5kZXhdO1xcbiAgICAgICAgICAgICAgICB0aGF0Ll9pbml0UmVzcG9uc2VPYmplY3QobmV3RGF0YSk7XFxuICAgICAgICAgICAgICAgIHRoYXQuX2luaXRQcm9ncmVzc09iamVjdChuZXdEYXRhKTtcXG4gICAgICAgICAgICAgICAgdGhhdC5fYWRkQ29udmVuaWVuY2VNZXRob2RzKGUsIG5ld0RhdGEpO1xcbiAgICAgICAgICAgICAgICByZXN1bHQgPSB0aGF0Ll90cmlnZ2VyKCdhZGQnLCBlLCBuZXdEYXRhKTtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcXG4gICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xcbiAgICAgICAgfSxcXG5cXG4gICAgICAgIF9yZXBsYWNlRmlsZUlucHV0OiBmdW5jdGlvbiAoaW5wdXQpIHtcXG4gICAgICAgICAgICB2YXIgaW5wdXRDbG9uZSA9IGlucHV0LmNsb25lKHRydWUpO1xcbiAgICAgICAgICAgICQoJzxmb3JtPjwvZm9ybT4nKS5hcHBlbmQoaW5wdXRDbG9uZSlbMF0ucmVzZXQoKTtcXG4gICAgICAgICAgICAvLyBEZXRhY2hpbmcgYWxsb3dzIHRvIGluc2VydCB0aGUgZmlsZUlucHV0IG9uIGFub3RoZXIgZm9ybVxcbiAgICAgICAgICAgIC8vIHdpdGhvdXQgbG9vc2luZyB0aGUgZmlsZSBpbnB1dCB2YWx1ZTpcXG4gICAgICAgICAgICBpbnB1dC5hZnRlcihpbnB1dENsb25lKS5kZXRhY2goKTtcXG4gICAgICAgICAgICAvLyBBdm9pZCBtZW1vcnkgbGVha3Mgd2l0aCB0aGUgZGV0YWNoZWQgZmlsZSBpbnB1dDpcXG4gICAgICAgICAgICAkLmNsZWFuRGF0YShpbnB1dC51bmJpbmQoJ3JlbW92ZScpKTtcXG4gICAgICAgICAgICAvLyBSZXBsYWNlIHRoZSBvcmlnaW5hbCBmaWxlIGlucHV0IGVsZW1lbnQgaW4gdGhlIGZpbGVJbnB1dFxcbiAgICAgICAgICAgIC8vIGVsZW1lbnRzIHNldCB3aXRoIHRoZSBjbG9uZSwgd2hpY2ggaGFzIGJlZW4gY29waWVkIGluY2x1ZGluZ1xcbiAgICAgICAgICAgIC8vIGV2ZW50IGhhbmRsZXJzOlxcbiAgICAgICAgICAgIHRoaXMub3B0aW9ucy5maWxlSW5wdXQgPSB0aGlzLm9wdGlvbnMuZmlsZUlucHV0Lm1hcChmdW5jdGlvbiAoaSwgZWwpIHtcXG4gICAgICAgICAgICAgICAgaWYgKGVsID09PSBpbnB1dFswXSkge1xcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlucHV0Q2xvbmVbMF07XFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVsO1xcbiAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgIC8vIElmIHRoZSB3aWRnZXQgaGFzIGJlZW4gaW5pdGlhbGl6ZWQgb24gdGhlIGZpbGUgaW5wdXQgaXRzZWxmLFxcbiAgICAgICAgICAgIC8vIG92ZXJyaWRlIHRoaXMuZWxlbWVudCB3aXRoIHRoZSBmaWxlIGlucHV0IGNsb25lOlxcbiAgICAgICAgICAgIGlmIChpbnB1dFswXSA9PT0gdGhpcy5lbGVtZW50WzBdKSB7XFxuICAgICAgICAgICAgICAgIHRoaXMuZWxlbWVudCA9IGlucHV0Q2xvbmU7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgfSxcXG5cXG4gICAgICAgIF9oYW5kbGVGaWxlVHJlZUVudHJ5OiBmdW5jdGlvbiAoZW50cnksIHBhdGgpIHtcXG4gICAgICAgICAgICB2YXIgdGhhdCA9IHRoaXMsXFxuICAgICAgICAgICAgICAgIGRmZCA9ICQuRGVmZXJyZWQoKSxcXG4gICAgICAgICAgICAgICAgZXJyb3JIYW5kbGVyID0gZnVuY3Rpb24gKGUpIHtcXG4gICAgICAgICAgICAgICAgICAgIGlmIChlICYmICFlLmVudHJ5KSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgZS5lbnRyeSA9IGVudHJ5O1xcbiAgICAgICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICAgICAgLy8gU2luY2UgJC53aGVuIHJldHVybnMgaW1tZWRpYXRlbHkgaWYgb25lXFxuICAgICAgICAgICAgICAgICAgICAvLyBEZWZlcnJlZCBpcyByZWplY3RlZCwgd2UgdXNlIHJlc29sdmUgaW5zdGVhZC5cXG4gICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgYWxsb3dzIHZhbGlkIGZpbGVzIGFuZCBpbnZhbGlkIGl0ZW1zXFxuICAgICAgICAgICAgICAgICAgICAvLyB0byBiZSByZXR1cm5lZCB0b2dldGhlciBpbiBvbmUgc2V0OlxcbiAgICAgICAgICAgICAgICAgICAgZGZkLnJlc29sdmUoW2VdKTtcXG4gICAgICAgICAgICAgICAgfSxcXG4gICAgICAgICAgICAgICAgZGlyUmVhZGVyO1xcbiAgICAgICAgICAgIHBhdGggPSBwYXRoIHx8ICcnO1xcbiAgICAgICAgICAgIGlmIChlbnRyeS5pc0ZpbGUpIHtcXG4gICAgICAgICAgICAgICAgaWYgKGVudHJ5Ll9maWxlKSB7XFxuICAgICAgICAgICAgICAgICAgICAvLyBXb3JrYXJvdW5kIGZvciBDaHJvbWUgYnVnICMxNDk3MzVcXG4gICAgICAgICAgICAgICAgICAgIGVudHJ5Ll9maWxlLnJlbGF0aXZlUGF0aCA9IHBhdGg7XFxuICAgICAgICAgICAgICAgICAgICBkZmQucmVzb2x2ZShlbnRyeS5fZmlsZSk7XFxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgICAgICAgICBlbnRyeS5maWxlKGZ1bmN0aW9uIChmaWxlKSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgZmlsZS5yZWxhdGl2ZVBhdGggPSBwYXRoO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIGRmZC5yZXNvbHZlKGZpbGUpO1xcbiAgICAgICAgICAgICAgICAgICAgfSwgZXJyb3JIYW5kbGVyKTtcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZW50cnkuaXNEaXJlY3RvcnkpIHtcXG4gICAgICAgICAgICAgICAgZGlyUmVhZGVyID0gZW50cnkuY3JlYXRlUmVhZGVyKCk7XFxuICAgICAgICAgICAgICAgIGRpclJlYWRlci5yZWFkRW50cmllcyhmdW5jdGlvbiAoZW50cmllcykge1xcbiAgICAgICAgICAgICAgICAgICAgdGhhdC5faGFuZGxlRmlsZVRyZWVFbnRyaWVzKFxcbiAgICAgICAgICAgICAgICAgICAgICAgIGVudHJpZXMsXFxuICAgICAgICAgICAgICAgICAgICAgICAgcGF0aCArIGVudHJ5Lm5hbWUgKyAnLydcXG4gICAgICAgICAgICAgICAgICAgICkuZG9uZShmdW5jdGlvbiAoZmlsZXMpIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICBkZmQucmVzb2x2ZShmaWxlcyk7XFxuICAgICAgICAgICAgICAgICAgICB9KS5mYWlsKGVycm9ySGFuZGxlcik7XFxuICAgICAgICAgICAgICAgIH0sIGVycm9ySGFuZGxlcik7XFxuICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgLy8gUmV0dXJuIGFuIGVtcHkgbGlzdCBmb3IgZmlsZSBzeXN0ZW0gaXRlbXNcXG4gICAgICAgICAgICAgICAgLy8gb3RoZXIgdGhhbiBmaWxlcyBvciBkaXJlY3RvcmllczpcXG4gICAgICAgICAgICAgICAgZGZkLnJlc29sdmUoW10pO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICByZXR1cm4gZGZkLnByb21pc2UoKTtcXG4gICAgICAgIH0sXFxuXFxuICAgICAgICBfaGFuZGxlRmlsZVRyZWVFbnRyaWVzOiBmdW5jdGlvbiAoZW50cmllcywgcGF0aCkge1xcbiAgICAgICAgICAgIHZhciB0aGF0ID0gdGhpcztcXG4gICAgICAgICAgICByZXR1cm4gJC53aGVuLmFwcGx5KFxcbiAgICAgICAgICAgICAgICAkLFxcbiAgICAgICAgICAgICAgICAkLm1hcChlbnRyaWVzLCBmdW5jdGlvbiAoZW50cnkpIHtcXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGF0Ll9oYW5kbGVGaWxlVHJlZUVudHJ5KGVudHJ5LCBwYXRoKTtcXG4gICAgICAgICAgICAgICAgfSlcXG4gICAgICAgICAgICApLnBpcGUoZnVuY3Rpb24gKCkge1xcbiAgICAgICAgICAgICAgICByZXR1cm4gQXJyYXkucHJvdG90eXBlLmNvbmNhdC5hcHBseShcXG4gICAgICAgICAgICAgICAgICAgIFtdLFxcbiAgICAgICAgICAgICAgICAgICAgYXJndW1lbnRzXFxuICAgICAgICAgICAgICAgICk7XFxuICAgICAgICAgICAgfSk7XFxuICAgICAgICB9LFxcblxcbiAgICAgICAgX2dldERyb3BwZWRGaWxlczogZnVuY3Rpb24gKGRhdGFUcmFuc2Zlcikge1xcbiAgICAgICAgICAgIGRhdGFUcmFuc2ZlciA9IGRhdGFUcmFuc2ZlciB8fCB7fTtcXG4gICAgICAgICAgICB2YXIgaXRlbXMgPSBkYXRhVHJhbnNmZXIuaXRlbXM7XFxuICAgICAgICAgICAgaWYgKGl0ZW1zICYmIGl0ZW1zLmxlbmd0aCAmJiAoaXRlbXNbMF0ud2Via2l0R2V0QXNFbnRyeSB8fFxcbiAgICAgICAgICAgICAgICAgICAgaXRlbXNbMF0uZ2V0QXNFbnRyeSkpIHtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2hhbmRsZUZpbGVUcmVlRW50cmllcyhcXG4gICAgICAgICAgICAgICAgICAgICQubWFwKGl0ZW1zLCBmdW5jdGlvbiAoaXRlbSkge1xcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlbnRyeTtcXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXRlbS53ZWJraXRHZXRBc0VudHJ5KSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5ID0gaXRlbS53ZWJraXRHZXRBc0VudHJ5KCk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlbnRyeSkge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gV29ya2Fyb3VuZCBmb3IgQ2hyb21lIGJ1ZyAjMTQ5NzM1OlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50cnkuX2ZpbGUgPSBpdGVtLmdldEFzRmlsZSgpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnRyeTtcXG4gICAgICAgICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGl0ZW0uZ2V0QXNFbnRyeSgpO1xcbiAgICAgICAgICAgICAgICAgICAgfSlcXG4gICAgICAgICAgICAgICAgKTtcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgcmV0dXJuICQuRGVmZXJyZWQoKS5yZXNvbHZlKFxcbiAgICAgICAgICAgICAgICAkLm1ha2VBcnJheShkYXRhVHJhbnNmZXIuZmlsZXMpXFxuICAgICAgICAgICAgKS5wcm9taXNlKCk7XFxuICAgICAgICB9LFxcblxcbiAgICAgICAgX2dldFNpbmdsZUZpbGVJbnB1dEZpbGVzOiBmdW5jdGlvbiAoZmlsZUlucHV0KSB7XFxuICAgICAgICAgICAgZmlsZUlucHV0ID0gJChmaWxlSW5wdXQpO1xcbiAgICAgICAgICAgIHZhciBlbnRyaWVzID0gZmlsZUlucHV0LnByb3AoJ3dlYmtpdEVudHJpZXMnKSB8fFxcbiAgICAgICAgICAgICAgICAgICAgZmlsZUlucHV0LnByb3AoJ2VudHJpZXMnKSxcXG4gICAgICAgICAgICAgICAgZmlsZXMsXFxuICAgICAgICAgICAgICAgIHZhbHVlO1xcbiAgICAgICAgICAgIGlmIChlbnRyaWVzICYmIGVudHJpZXMubGVuZ3RoKSB7XFxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9oYW5kbGVGaWxlVHJlZUVudHJpZXMoZW50cmllcyk7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIGZpbGVzID0gJC5tYWtlQXJyYXkoZmlsZUlucHV0LnByb3AoJ2ZpbGVzJykpO1xcbiAgICAgICAgICAgIGlmICghZmlsZXMubGVuZ3RoKSB7XFxuICAgICAgICAgICAgICAgIHZhbHVlID0gZmlsZUlucHV0LnByb3AoJ3ZhbHVlJyk7XFxuICAgICAgICAgICAgICAgIGlmICghdmFsdWUpIHtcXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAkLkRlZmVycmVkKCkucmVzb2x2ZShbXSkucHJvbWlzZSgpO1xcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgIC8vIElmIHRoZSBmaWxlcyBwcm9wZXJ0eSBpcyBub3QgYXZhaWxhYmxlLCB0aGUgYnJvd3NlciBkb2VzIG5vdFxcbiAgICAgICAgICAgICAgICAvLyBzdXBwb3J0IHRoZSBGaWxlIEFQSSBhbmQgd2UgYWRkIGEgcHNldWRvIEZpbGUgb2JqZWN0IHdpdGhcXG4gICAgICAgICAgICAgICAgLy8gdGhlIGlucHV0IHZhbHVlIGFzIG5hbWUgd2l0aCBwYXRoIGluZm9ybWF0aW9uIHJlbW92ZWQ6XFxuICAgICAgICAgICAgICAgIGZpbGVzID0gW3tuYW1lOiB2YWx1ZS5yZXBsYWNlKC9eLipcXFxcXFxcXC8sICcnKX1dO1xcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZmlsZXNbMF0ubmFtZSA9PT0gdW5kZWZpbmVkICYmIGZpbGVzWzBdLmZpbGVOYW1lKSB7XFxuICAgICAgICAgICAgICAgIC8vIEZpbGUgbm9ybWFsaXphdGlvbiBmb3IgU2FmYXJpIDQgYW5kIEZpcmVmb3ggMzpcXG4gICAgICAgICAgICAgICAgJC5lYWNoKGZpbGVzLCBmdW5jdGlvbiAoaW5kZXgsIGZpbGUpIHtcXG4gICAgICAgICAgICAgICAgICAgIGZpbGUubmFtZSA9IGZpbGUuZmlsZU5hbWU7XFxuICAgICAgICAgICAgICAgICAgICBmaWxlLnNpemUgPSBmaWxlLmZpbGVTaXplO1xcbiAgICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgcmV0dXJuICQuRGVmZXJyZWQoKS5yZXNvbHZlKGZpbGVzKS5wcm9taXNlKCk7XFxuICAgICAgICB9LFxcblxcbiAgICAgICAgX2dldEZpbGVJbnB1dEZpbGVzOiBmdW5jdGlvbiAoZmlsZUlucHV0KSB7XFxuICAgICAgICAgICAgaWYgKCEoZmlsZUlucHV0IGluc3RhbmNlb2YgJCkgfHwgZmlsZUlucHV0Lmxlbmd0aCA9PT0gMSkge1xcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fZ2V0U2luZ2xlRmlsZUlucHV0RmlsZXMoZmlsZUlucHV0KTtcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgcmV0dXJuICQud2hlbi5hcHBseShcXG4gICAgICAgICAgICAgICAgJCxcXG4gICAgICAgICAgICAgICAgJC5tYXAoZmlsZUlucHV0LCB0aGlzLl9nZXRTaW5nbGVGaWxlSW5wdXRGaWxlcylcXG4gICAgICAgICAgICApLnBpcGUoZnVuY3Rpb24gKCkge1xcbiAgICAgICAgICAgICAgICByZXR1cm4gQXJyYXkucHJvdG90eXBlLmNvbmNhdC5hcHBseShcXG4gICAgICAgICAgICAgICAgICAgIFtdLFxcbiAgICAgICAgICAgICAgICAgICAgYXJndW1lbnRzXFxuICAgICAgICAgICAgICAgICk7XFxuICAgICAgICAgICAgfSk7XFxuICAgICAgICB9LFxcblxcbiAgICAgICAgX29uQ2hhbmdlOiBmdW5jdGlvbiAoZSkge1xcbiAgICAgICAgICAgIHZhciB0aGF0ID0gdGhpcyxcXG4gICAgICAgICAgICAgICAgZGF0YSA9IHtcXG4gICAgICAgICAgICAgICAgICAgIGZpbGVJbnB1dDogJChlLnRhcmdldCksXFxuICAgICAgICAgICAgICAgICAgICBmb3JtOiAkKGUudGFyZ2V0LmZvcm0pXFxuICAgICAgICAgICAgICAgIH07XFxuICAgICAgICAgICAgdGhpcy5fZ2V0RmlsZUlucHV0RmlsZXMoZGF0YS5maWxlSW5wdXQpLmFsd2F5cyhmdW5jdGlvbiAoZmlsZXMpIHtcXG4gICAgICAgICAgICAgICAgZGF0YS5maWxlcyA9IGZpbGVzO1xcbiAgICAgICAgICAgICAgICBpZiAodGhhdC5vcHRpb25zLnJlcGxhY2VGaWxlSW5wdXQpIHtcXG4gICAgICAgICAgICAgICAgICAgIHRoYXQuX3JlcGxhY2VGaWxlSW5wdXQoZGF0YS5maWxlSW5wdXQpO1xcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgIGlmICh0aGF0Ll90cmlnZ2VyKCdjaGFuZ2UnLCBlLCBkYXRhKSAhPT0gZmFsc2UpIHtcXG4gICAgICAgICAgICAgICAgICAgIHRoYXQuX29uQWRkKGUsIGRhdGEpO1xcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgfSk7XFxuICAgICAgICB9LFxcblxcbiAgICAgICAgX29uUGFzdGU6IGZ1bmN0aW9uIChlKSB7XFxuICAgICAgICAgICAgdmFyIGl0ZW1zID0gZS5vcmlnaW5hbEV2ZW50ICYmIGUub3JpZ2luYWxFdmVudC5jbGlwYm9hcmREYXRhICYmXFxuICAgICAgICAgICAgICAgICAgICBlLm9yaWdpbmFsRXZlbnQuY2xpcGJvYXJkRGF0YS5pdGVtcyxcXG4gICAgICAgICAgICAgICAgZGF0YSA9IHtmaWxlczogW119O1xcbiAgICAgICAgICAgIGlmIChpdGVtcyAmJiBpdGVtcy5sZW5ndGgpIHtcXG4gICAgICAgICAgICAgICAgJC5lYWNoKGl0ZW1zLCBmdW5jdGlvbiAoaW5kZXgsIGl0ZW0pIHtcXG4gICAgICAgICAgICAgICAgICAgIHZhciBmaWxlID0gaXRlbS5nZXRBc0ZpbGUgJiYgaXRlbS5nZXRBc0ZpbGUoKTtcXG4gICAgICAgICAgICAgICAgICAgIGlmIChmaWxlKSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS5maWxlcy5wdXNoKGZpbGUpO1xcbiAgICAgICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX3RyaWdnZXIoJ3Bhc3RlJywgZSwgZGF0YSkgPT09IGZhbHNlIHx8XFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fb25BZGQoZSwgZGF0YSkgPT09IGZhbHNlKSB7XFxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICB9XFxuICAgICAgICB9LFxcblxcbiAgICAgICAgX29uRHJvcDogZnVuY3Rpb24gKGUpIHtcXG4gICAgICAgICAgICBlLmRhdGFUcmFuc2ZlciA9IGUub3JpZ2luYWxFdmVudCAmJiBlLm9yaWdpbmFsRXZlbnQuZGF0YVRyYW5zZmVyO1xcbiAgICAgICAgICAgIHZhciB0aGF0ID0gdGhpcyxcXG4gICAgICAgICAgICAgICAgZGF0YVRyYW5zZmVyID0gZS5kYXRhVHJhbnNmZXIsXFxuICAgICAgICAgICAgICAgIGRhdGEgPSB7fTtcXG4gICAgICAgICAgICBpZiAoZGF0YVRyYW5zZmVyICYmIGRhdGFUcmFuc2Zlci5maWxlcyAmJiBkYXRhVHJhbnNmZXIuZmlsZXMubGVuZ3RoKSB7XFxuICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcXG4gICAgICAgICAgICAgICAgdGhpcy5fZ2V0RHJvcHBlZEZpbGVzKGRhdGFUcmFuc2ZlcikuYWx3YXlzKGZ1bmN0aW9uIChmaWxlcykge1xcbiAgICAgICAgICAgICAgICAgICAgZGF0YS5maWxlcyA9IGZpbGVzO1xcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoYXQuX3RyaWdnZXIoJ2Ryb3AnLCBlLCBkYXRhKSAhPT0gZmFsc2UpIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGF0Ll9vbkFkZChlLCBkYXRhKTtcXG4gICAgICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgfSxcXG5cXG4gICAgICAgIF9vbkRyYWdPdmVyOiBmdW5jdGlvbiAoZSkge1xcbiAgICAgICAgICAgIGUuZGF0YVRyYW5zZmVyID0gZS5vcmlnaW5hbEV2ZW50ICYmIGUub3JpZ2luYWxFdmVudC5kYXRhVHJhbnNmZXI7XFxuICAgICAgICAgICAgdmFyIGRhdGFUcmFuc2ZlciA9IGUuZGF0YVRyYW5zZmVyO1xcbiAgICAgICAgICAgIGlmIChkYXRhVHJhbnNmZXIpIHtcXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX3RyaWdnZXIoJ2RyYWdvdmVyJywgZSkgPT09IGZhbHNlKSB7XFxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgaWYgKCQuaW5BcnJheSgnRmlsZXMnLCBkYXRhVHJhbnNmZXIudHlwZXMpICE9PSAtMSkge1xcbiAgICAgICAgICAgICAgICAgICAgZGF0YVRyYW5zZmVyLmRyb3BFZmZlY3QgPSAnY29weSc7XFxuICAgICAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICB9XFxuICAgICAgICB9LFxcblxcbiAgICAgICAgX2luaXRFdmVudEhhbmRsZXJzOiBmdW5jdGlvbiAoKSB7XFxuICAgICAgICAgICAgaWYgKHRoaXMuX2lzWEhSVXBsb2FkKHRoaXMub3B0aW9ucykpIHtcXG4gICAgICAgICAgICAgICAgdGhpcy5fb24odGhpcy5vcHRpb25zLmRyb3Bab25lLCB7XFxuICAgICAgICAgICAgICAgICAgICBkcmFnb3ZlcjogdGhpcy5fb25EcmFnT3ZlcixcXG4gICAgICAgICAgICAgICAgICAgIGRyb3A6IHRoaXMuX29uRHJvcFxcbiAgICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICAgICAgdGhpcy5fb24odGhpcy5vcHRpb25zLnBhc3RlWm9uZSwge1xcbiAgICAgICAgICAgICAgICAgICAgcGFzdGU6IHRoaXMuX29uUGFzdGVcXG4gICAgICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIHRoaXMuX29uKHRoaXMub3B0aW9ucy5maWxlSW5wdXQsIHtcXG4gICAgICAgICAgICAgICAgY2hhbmdlOiB0aGlzLl9vbkNoYW5nZVxcbiAgICAgICAgICAgIH0pO1xcbiAgICAgICAgfSxcXG5cXG4gICAgICAgIF9kZXN0cm95RXZlbnRIYW5kbGVyczogZnVuY3Rpb24gKCkge1xcbiAgICAgICAgICAgIHRoaXMuX29mZih0aGlzLm9wdGlvbnMuZHJvcFpvbmUsICdkcmFnb3ZlciBkcm9wJyk7XFxuICAgICAgICAgICAgdGhpcy5fb2ZmKHRoaXMub3B0aW9ucy5wYXN0ZVpvbmUsICdwYXN0ZScpO1xcbiAgICAgICAgICAgIHRoaXMuX29mZih0aGlzLm9wdGlvbnMuZmlsZUlucHV0LCAnY2hhbmdlJyk7XFxuICAgICAgICB9LFxcblxcbiAgICAgICAgX3NldE9wdGlvbjogZnVuY3Rpb24gKGtleSwgdmFsdWUpIHtcXG4gICAgICAgICAgICB2YXIgcmVpbml0ID0gJC5pbkFycmF5KGtleSwgdGhpcy5fc3BlY2lhbE9wdGlvbnMpICE9PSAtMTtcXG4gICAgICAgICAgICBpZiAocmVpbml0KSB7XFxuICAgICAgICAgICAgICAgIHRoaXMuX2Rlc3Ryb3lFdmVudEhhbmRsZXJzKCk7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIHRoaXMuX3N1cGVyKGtleSwgdmFsdWUpO1xcbiAgICAgICAgICAgIGlmIChyZWluaXQpIHtcXG4gICAgICAgICAgICAgICAgdGhpcy5faW5pdFNwZWNpYWxPcHRpb25zKCk7XFxuICAgICAgICAgICAgICAgIHRoaXMuX2luaXRFdmVudEhhbmRsZXJzKCk7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgfSxcXG5cXG4gICAgICAgIF9pbml0U3BlY2lhbE9wdGlvbnM6IGZ1bmN0aW9uICgpIHtcXG4gICAgICAgICAgICB2YXIgb3B0aW9ucyA9IHRoaXMub3B0aW9ucztcXG4gICAgICAgICAgICBpZiAob3B0aW9ucy5maWxlSW5wdXQgPT09IHVuZGVmaW5lZCkge1xcbiAgICAgICAgICAgICAgICBvcHRpb25zLmZpbGVJbnB1dCA9IHRoaXMuZWxlbWVudC5pcygnaW5wdXRbdHlwZT1cXFwiZmlsZVxcXCJdJykgP1xcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZWxlbWVudCA6IHRoaXMuZWxlbWVudC5maW5kKCdpbnB1dFt0eXBlPVxcXCJmaWxlXFxcIl0nKTtcXG4gICAgICAgICAgICB9IGVsc2UgaWYgKCEob3B0aW9ucy5maWxlSW5wdXQgaW5zdGFuY2VvZiAkKSkge1xcbiAgICAgICAgICAgICAgICBvcHRpb25zLmZpbGVJbnB1dCA9ICQob3B0aW9ucy5maWxlSW5wdXQpO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICBpZiAoIShvcHRpb25zLmRyb3Bab25lIGluc3RhbmNlb2YgJCkpIHtcXG4gICAgICAgICAgICAgICAgb3B0aW9ucy5kcm9wWm9uZSA9ICQob3B0aW9ucy5kcm9wWm9uZSk7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIGlmICghKG9wdGlvbnMucGFzdGVab25lIGluc3RhbmNlb2YgJCkpIHtcXG4gICAgICAgICAgICAgICAgb3B0aW9ucy5wYXN0ZVpvbmUgPSAkKG9wdGlvbnMucGFzdGVab25lKTtcXG4gICAgICAgICAgICB9XFxuICAgICAgICB9LFxcblxcbiAgICAgICAgX2dldFJlZ0V4cDogZnVuY3Rpb24gKHN0cikge1xcbiAgICAgICAgICAgIHZhciBwYXJ0cyA9IHN0ci5zcGxpdCgnLycpLFxcbiAgICAgICAgICAgICAgICBtb2RpZmllcnMgPSBwYXJ0cy5wb3AoKTtcXG4gICAgICAgICAgICBwYXJ0cy5zaGlmdCgpO1xcbiAgICAgICAgICAgIHJldHVybiBuZXcgUmVnRXhwKHBhcnRzLmpvaW4oJy8nKSwgbW9kaWZpZXJzKTtcXG4gICAgICAgIH0sXFxuXFxuICAgICAgICBfaXNSZWdFeHBPcHRpb246IGZ1bmN0aW9uIChrZXksIHZhbHVlKSB7XFxuICAgICAgICAgICAgcmV0dXJuIGtleSAhPT0gJ3VybCcgJiYgJC50eXBlKHZhbHVlKSA9PT0gJ3N0cmluZycgJiZcXG4gICAgICAgICAgICAgICAgL15cXFxcLy4qXFxcXC9baWdtXXswLDN9JC8udGVzdCh2YWx1ZSk7XFxuICAgICAgICB9LFxcblxcbiAgICAgICAgX2luaXREYXRhQXR0cmlidXRlczogZnVuY3Rpb24gKCkge1xcbiAgICAgICAgICAgIHZhciB0aGF0ID0gdGhpcyxcXG4gICAgICAgICAgICAgICAgb3B0aW9ucyA9IHRoaXMub3B0aW9ucztcXG4gICAgICAgICAgICAvLyBJbml0aWFsaXplIG9wdGlvbnMgc2V0IHZpYSBIVE1MNSBkYXRhLWF0dHJpYnV0ZXM6XFxuICAgICAgICAgICAgJC5lYWNoKFxcbiAgICAgICAgICAgICAgICAkKHRoaXMuZWxlbWVudFswXS5jbG9uZU5vZGUoZmFsc2UpKS5kYXRhKCksXFxuICAgICAgICAgICAgICAgIGZ1bmN0aW9uIChrZXksIHZhbHVlKSB7XFxuICAgICAgICAgICAgICAgICAgICBpZiAodGhhdC5faXNSZWdFeHBPcHRpb24oa2V5LCB2YWx1ZSkpIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHRoYXQuX2dldFJlZ0V4cCh2YWx1ZSk7XFxuICAgICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgICAgICBvcHRpb25zW2tleV0gPSB2YWx1ZTtcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICk7XFxuICAgICAgICB9LFxcblxcbiAgICAgICAgX2NyZWF0ZTogZnVuY3Rpb24gKCkge1xcbiAgICAgICAgICAgIHRoaXMuX2luaXREYXRhQXR0cmlidXRlcygpO1xcbiAgICAgICAgICAgIHRoaXMuX2luaXRTcGVjaWFsT3B0aW9ucygpO1xcbiAgICAgICAgICAgIHRoaXMuX3Nsb3RzID0gW107XFxuICAgICAgICAgICAgdGhpcy5fc2VxdWVuY2UgPSB0aGlzLl9nZXRYSFJQcm9taXNlKHRydWUpO1xcbiAgICAgICAgICAgIHRoaXMuX3NlbmRpbmcgPSB0aGlzLl9hY3RpdmUgPSAwO1xcbiAgICAgICAgICAgIHRoaXMuX2luaXRQcm9ncmVzc09iamVjdCh0aGlzKTtcXG4gICAgICAgICAgICB0aGlzLl9pbml0RXZlbnRIYW5kbGVycygpO1xcbiAgICAgICAgfSxcXG5cXG4gICAgICAgIC8vIFRoaXMgbWV0aG9kIGlzIGV4cG9zZWQgdG8gdGhlIHdpZGdldCBBUEkgYW5kIGFsbG93cyB0byBxdWVyeVxcbiAgICAgICAgLy8gdGhlIG51bWJlciBvZiBhY3RpdmUgdXBsb2FkczpcXG4gICAgICAgIGFjdGl2ZTogZnVuY3Rpb24gKCkge1xcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9hY3RpdmU7XFxuICAgICAgICB9LFxcblxcbiAgICAgICAgLy8gVGhpcyBtZXRob2QgaXMgZXhwb3NlZCB0byB0aGUgd2lkZ2V0IEFQSSBhbmQgYWxsb3dzIHRvIHF1ZXJ5XFxuICAgICAgICAvLyB0aGUgd2lkZ2V0IHVwbG9hZCBwcm9ncmVzcy5cXG4gICAgICAgIC8vIEl0IHJldHVybnMgYW4gb2JqZWN0IHdpdGggbG9hZGVkLCB0b3RhbCBhbmQgYml0cmF0ZSBwcm9wZXJ0aWVzXFxuICAgICAgICAvLyBmb3IgdGhlIHJ1bm5pbmcgdXBsb2FkczpcXG4gICAgICAgIHByb2dyZXNzOiBmdW5jdGlvbiAoKSB7XFxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3Byb2dyZXNzO1xcbiAgICAgICAgfSxcXG5cXG4gICAgICAgIC8vIFRoaXMgbWV0aG9kIGlzIGV4cG9zZWQgdG8gdGhlIHdpZGdldCBBUEkgYW5kIGFsbG93cyBhZGRpbmcgZmlsZXNcXG4gICAgICAgIC8vIHVzaW5nIHRoZSBmaWxldXBsb2FkIEFQSS4gVGhlIGRhdGEgcGFyYW1ldGVyIGFjY2VwdHMgYW4gb2JqZWN0IHdoaWNoXFxuICAgICAgICAvLyBtdXN0IGhhdmUgYSBmaWxlcyBwcm9wZXJ0eSBhbmQgY2FuIGNvbnRhaW4gYWRkaXRpb25hbCBvcHRpb25zOlxcbiAgICAgICAgLy8gLmZpbGV1cGxvYWQoJ2FkZCcsIHtmaWxlczogZmlsZXNMaXN0fSk7XFxuICAgICAgICBhZGQ6IGZ1bmN0aW9uIChkYXRhKSB7XFxuICAgICAgICAgICAgdmFyIHRoYXQgPSB0aGlzO1xcbiAgICAgICAgICAgIGlmICghZGF0YSB8fCB0aGlzLm9wdGlvbnMuZGlzYWJsZWQpIHtcXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICBpZiAoZGF0YS5maWxlSW5wdXQgJiYgIWRhdGEuZmlsZXMpIHtcXG4gICAgICAgICAgICAgICAgdGhpcy5fZ2V0RmlsZUlucHV0RmlsZXMoZGF0YS5maWxlSW5wdXQpLmFsd2F5cyhmdW5jdGlvbiAoZmlsZXMpIHtcXG4gICAgICAgICAgICAgICAgICAgIGRhdGEuZmlsZXMgPSBmaWxlcztcXG4gICAgICAgICAgICAgICAgICAgIHRoYXQuX29uQWRkKG51bGwsIGRhdGEpO1xcbiAgICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgICAgICBkYXRhLmZpbGVzID0gJC5tYWtlQXJyYXkoZGF0YS5maWxlcyk7XFxuICAgICAgICAgICAgICAgIHRoaXMuX29uQWRkKG51bGwsIGRhdGEpO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH0sXFxuXFxuICAgICAgICAvLyBUaGlzIG1ldGhvZCBpcyBleHBvc2VkIHRvIHRoZSB3aWRnZXQgQVBJIGFuZCBhbGxvd3Mgc2VuZGluZyBmaWxlc1xcbiAgICAgICAgLy8gdXNpbmcgdGhlIGZpbGV1cGxvYWQgQVBJLiBUaGUgZGF0YSBwYXJhbWV0ZXIgYWNjZXB0cyBhbiBvYmplY3Qgd2hpY2hcXG4gICAgICAgIC8vIG11c3QgaGF2ZSBhIGZpbGVzIG9yIGZpbGVJbnB1dCBwcm9wZXJ0eSBhbmQgY2FuIGNvbnRhaW4gYWRkaXRpb25hbCBvcHRpb25zOlxcbiAgICAgICAgLy8gLmZpbGV1cGxvYWQoJ3NlbmQnLCB7ZmlsZXM6IGZpbGVzTGlzdH0pO1xcbiAgICAgICAgLy8gVGhlIG1ldGhvZCByZXR1cm5zIGEgUHJvbWlzZSBvYmplY3QgZm9yIHRoZSBmaWxlIHVwbG9hZCBjYWxsLlxcbiAgICAgICAgc2VuZDogZnVuY3Rpb24gKGRhdGEpIHtcXG4gICAgICAgICAgICBpZiAoZGF0YSAmJiAhdGhpcy5vcHRpb25zLmRpc2FibGVkKSB7XFxuICAgICAgICAgICAgICAgIGlmIChkYXRhLmZpbGVJbnB1dCAmJiAhZGF0YS5maWxlcykge1xcbiAgICAgICAgICAgICAgICAgICAgdmFyIHRoYXQgPSB0aGlzLFxcbiAgICAgICAgICAgICAgICAgICAgICAgIGRmZCA9ICQuRGVmZXJyZWQoKSxcXG4gICAgICAgICAgICAgICAgICAgICAgICBwcm9taXNlID0gZGZkLnByb21pc2UoKSxcXG4gICAgICAgICAgICAgICAgICAgICAgICBqcVhIUixcXG4gICAgICAgICAgICAgICAgICAgICAgICBhYm9ydGVkO1xcbiAgICAgICAgICAgICAgICAgICAgcHJvbWlzZS5hYm9ydCA9IGZ1bmN0aW9uICgpIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICBhYm9ydGVkID0gdHJ1ZTtcXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoanFYSFIpIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGpxWEhSLmFib3J0KCk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICAgICAgICAgIGRmZC5yZWplY3QobnVsbCwgJ2Fib3J0JywgJ2Fib3J0Jyk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHByb21pc2U7XFxuICAgICAgICAgICAgICAgICAgICB9O1xcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fZ2V0RmlsZUlucHV0RmlsZXMoZGF0YS5maWxlSW5wdXQpLmFsd2F5cyhcXG4gICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAoZmlsZXMpIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFib3J0ZWQpIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLmZpbGVzID0gZmlsZXM7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpxWEhSID0gdGhhdC5fb25TZW5kKG51bGwsIGRhdGEpLnRoZW4oXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAocmVzdWx0LCB0ZXh0U3RhdHVzLCBqcVhIUikge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRmZC5yZXNvbHZlKHJlc3VsdCwgdGV4dFN0YXR1cywganFYSFIpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIChqcVhIUiwgdGV4dFN0YXR1cywgZXJyb3JUaHJvd24pIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZmQucmVqZWN0KGpxWEhSLCB0ZXh0U3RhdHVzLCBlcnJvclRocm93bik7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICAgICAgKTtcXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9lbmhhbmNlUHJvbWlzZShwcm9taXNlKTtcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICBkYXRhLmZpbGVzID0gJC5tYWtlQXJyYXkoZGF0YS5maWxlcyk7XFxuICAgICAgICAgICAgICAgIGlmIChkYXRhLmZpbGVzLmxlbmd0aCkge1xcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX29uU2VuZChudWxsLCBkYXRhKTtcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fZ2V0WEhSUHJvbWlzZShmYWxzZSwgZGF0YSAmJiBkYXRhLmNvbnRleHQpO1xcbiAgICAgICAgfVxcblxcbiAgICB9KTtcXG5cXG59KSk7XFxuXCJcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9yYXctbG9hZGVyIS4vYm93ZXJfY29tcG9uZW50cy9jbG91ZGluYXJ5X2pzL2pzL2pxdWVyeS5maWxldXBsb2FkLmpzXG4gKiogbW9kdWxlIGlkID0gMjlcbiAqKiBtb2R1bGUgY2h1bmtzID0gMjRcbiAqKi8iXSwibWFwcGluZ3MiOiJBQUFBIiwic291cmNlUm9vdCI6IiJ9");

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

	eval("__webpack_require__(16)(__webpack_require__(31))\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzAuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ib3dlcl9jb21wb25lbnRzL2Nsb3VkaW5hcnlfanMvanMvanF1ZXJ5LmNsb3VkaW5hcnkuanM/NzJjYyJdLCJzb3VyY2VzQ29udGVudCI6WyJyZXF1aXJlKFwiISEvaG9tZS9kZXBsb3llci9kZXBsb3ltZW50L2pzL25vZGVfbW9kdWxlcy9zY3JpcHQtbG9hZGVyL2FkZFNjcmlwdC5qc1wiKShyZXF1aXJlKFwiISEvaG9tZS9kZXBsb3llci9kZXBsb3ltZW50L2pzL25vZGVfbW9kdWxlcy9yYXctbG9hZGVyL2luZGV4LmpzIS9ob21lL2RlcGxveWVyL2RlcGxveW1lbnQvanMvYm93ZXJfY29tcG9uZW50cy9jbG91ZGluYXJ5X2pzL2pzL2pxdWVyeS5jbG91ZGluYXJ5LmpzXCIpKVxuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L3NjcmlwdC1sb2FkZXIhLi9ib3dlcl9jb21wb25lbnRzL2Nsb3VkaW5hcnlfanMvanMvanF1ZXJ5LmNsb3VkaW5hcnkuanNcbiAqKiBtb2R1bGUgaWQgPSAzMFxuICoqIG1vZHVsZSBjaHVua3MgPSAyNFxuICoqLyJdLCJtYXBwaW5ncyI6IkFBQUEiLCJzb3VyY2VSb290IjoiIn0=");

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

	eval("module.exports = \"/*\\n * Cloudinary's jQuery library - v1.0.11\\n * Copyright Cloudinary\\n * see https://github.com/cloudinary/cloudinary_js\\n */\\n\\n(function( $ ) {\\n  var CF_SHARED_CDN = \\\"d3jpl91pxevbkh.cloudfront.net\\\";\\n  var OLD_AKAMAI_SHARED_CDN = \\\"cloudinary-a.akamaihd.net\\\";\\n  var AKAMAI_SHARED_CDN = \\\"res.cloudinary.com\\\";\\n  var SHARED_CDN = AKAMAI_SHARED_CDN;\\n  \\n  function utf8_encode (argString) {\\n      // http://kevin.vanzonneveld.net\\n      // +   original by: Webtoolkit.info (http://www.webtoolkit.info/)\\n      // +   improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)\\n      // +   improved by: sowberry\\n      // +    tweaked by: Jack\\n      // +   bugfixed by: Onno Marsman\\n      // +   improved by: Yves Sucaet\\n      // +   bugfixed by: Onno Marsman\\n      // +   bugfixed by: Ulrich\\n      // +   bugfixed by: Rafal Kukawski\\n      // +   improved by: kirilloid\\n      // *     example 1: utf8_encode('Kevin van Zonneveld');\\n      // *     returns 1: 'Kevin van Zonneveld'\\n  \\n      if (argString === null || typeof argString === \\\"undefined\\\") {\\n          return \\\"\\\";\\n      }\\n  \\n      var string = (argString + ''); // .replace(/\\\\r\\\\n/g, \\\"\\\\n\\\").replace(/\\\\r/g, \\\"\\\\n\\\");\\n      var utftext = '',\\n          start, end, stringl = 0;\\n  \\n      start = end = 0;\\n      stringl = string.length;\\n      for (var n = 0; n < stringl; n++) {\\n          var c1 = string.charCodeAt(n);\\n          var enc = null;\\n  \\n          if (c1 < 128) {\\n              end++;\\n          } else if (c1 > 127 && c1 < 2048) {\\n              enc = String.fromCharCode((c1 >> 6) | 192, (c1 & 63) | 128);\\n          } else {\\n              enc = String.fromCharCode((c1 >> 12) | 224, ((c1 >> 6) & 63) | 128, (c1 & 63) | 128);\\n          }\\n          if (enc !== null) {\\n              if (end > start) {\\n                  utftext += string.slice(start, end);\\n              }\\n              utftext += enc;\\n              start = end = n + 1;\\n          }\\n      }\\n  \\n      if (end > start) {\\n          utftext += string.slice(start, stringl);\\n      }\\n  \\n      return utftext;\\n  }\\n  \\n  function crc32 (str) {\\n      // http://kevin.vanzonneveld.net\\n      // +   original by: Webtoolkit.info (http://www.webtoolkit.info/)\\n      // +   improved by: T0bsn\\n      // +   improved by: http://stackoverflow.com/questions/2647935/javascript-crc32-function-and-php-crc32-not-matching\\n      // -    depends on: utf8_encode\\n      // *     example 1: crc32('Kevin van Zonneveld');\\n      // *     returns 1: 1249991249\\n      str = utf8_encode(str);\\n      var table = \\\"00000000 77073096 EE0E612C 990951BA 076DC419 706AF48F E963A535 9E6495A3 0EDB8832 79DCB8A4 E0D5E91E 97D2D988 09B64C2B 7EB17CBD E7B82D07 90BF1D91 1DB71064 6AB020F2 F3B97148 84BE41DE 1ADAD47D 6DDDE4EB F4D4B551 83D385C7 136C9856 646BA8C0 FD62F97A 8A65C9EC 14015C4F 63066CD9 FA0F3D63 8D080DF5 3B6E20C8 4C69105E D56041E4 A2677172 3C03E4D1 4B04D447 D20D85FD A50AB56B 35B5A8FA 42B2986C DBBBC9D6 ACBCF940 32D86CE3 45DF5C75 DCD60DCF ABD13D59 26D930AC 51DE003A C8D75180 BFD06116 21B4F4B5 56B3C423 CFBA9599 B8BDA50F 2802B89E 5F058808 C60CD9B2 B10BE924 2F6F7C87 58684C11 C1611DAB B6662D3D 76DC4190 01DB7106 98D220BC EFD5102A 71B18589 06B6B51F 9FBFE4A5 E8B8D433 7807C9A2 0F00F934 9609A88E E10E9818 7F6A0DBB 086D3D2D 91646C97 E6635C01 6B6B51F4 1C6C6162 856530D8 F262004E 6C0695ED 1B01A57B 8208F4C1 F50FC457 65B0D9C6 12B7E950 8BBEB8EA FCB9887C 62DD1DDF 15DA2D49 8CD37CF3 FBD44C65 4DB26158 3AB551CE A3BC0074 D4BB30E2 4ADFA541 3DD895D7 A4D1C46D D3D6F4FB 4369E96A 346ED9FC AD678846 DA60B8D0 44042D73 33031DE5 AA0A4C5F DD0D7CC9 5005713C 270241AA BE0B1010 C90C2086 5768B525 206F85B3 B966D409 CE61E49F 5EDEF90E 29D9C998 B0D09822 C7D7A8B4 59B33D17 2EB40D81 B7BD5C3B C0BA6CAD EDB88320 9ABFB3B6 03B6E20C 74B1D29A EAD54739 9DD277AF 04DB2615 73DC1683 E3630B12 94643B84 0D6D6A3E 7A6A5AA8 E40ECF0B 9309FF9D 0A00AE27 7D079EB1 F00F9344 8708A3D2 1E01F268 6906C2FE F762575D 806567CB 196C3671 6E6B06E7 FED41B76 89D32BE0 10DA7A5A 67DD4ACC F9B9DF6F 8EBEEFF9 17B7BE43 60B08ED5 D6D6A3E8 A1D1937E 38D8C2C4 4FDFF252 D1BB67F1 A6BC5767 3FB506DD 48B2364B D80D2BDA AF0A1B4C 36034AF6 41047A60 DF60EFC3 A867DF55 316E8EEF 4669BE79 CB61B38C BC66831A 256FD2A0 5268E236 CC0C7795 BB0B4703 220216B9 5505262F C5BA3BBE B2BD0B28 2BB45A92 5CB36A04 C2D7FFA7 B5D0CF31 2CD99E8B 5BDEAE1D 9B64C2B0 EC63F226 756AA39C 026D930A 9C0906A9 EB0E363F 72076785 05005713 95BF4A82 E2B87A14 7BB12BAE 0CB61B38 92D28E9B E5D5BE0D 7CDCEFB7 0BDBDF21 86D3D2D4 F1D4E242 68DDB3F8 1FDA836E 81BE16CD F6B9265B 6FB077E1 18B74777 88085AE6 FF0F6A70 66063BCA 11010B5C 8F659EFF F862AE69 616BFFD3 166CCF45 A00AE278 D70DD2EE 4E048354 3903B3C2 A7672661 D06016F7 4969474D 3E6E77DB AED16A4A D9D65ADC 40DF0B66 37D83BF0 A9BCAE53 DEBB9EC5 47B2CF7F 30B5FFE9 BDBDF21C CABAC28A 53B39330 24B4A3A6 BAD03605 CDD70693 54DE5729 23D967BF B3667A2E C4614AB8 5D681B02 2A6F2B94 B40BBE37 C30C8EA1 5A05DF1B 2D02EF8D\\\";\\n  \\n      var crc = 0;\\n      var x = 0;\\n      var y = 0;\\n  \\n      crc = crc ^ (-1);\\n      for (var i = 0, iTop = str.length; i < iTop; i++) {\\n          y = (crc ^ str.charCodeAt(i)) & 0xFF;\\n          x = \\\"0x\\\" + table.substr(y * 9, 8);\\n          crc = (crc >>> 8) ^ x;\\n      }\\n  \\n      crc = crc ^ (-1);\\n      //convert to unsigned 32-bit int if needed\\n      if (crc < 0) {crc += 4294967296}\\n      return crc;\\n  }\\n\\n  function option_consume(options, option_name, default_value) {\\n    var result = options[option_name];\\n    delete options[option_name];\\n    return typeof(result) == 'undefined' ? default_value : result;\\n  }\\n  function build_array(arg) {\\n    if (!arg) {\\n      return [];\\n    } else if ($.isArray(arg)) {\\n      return arg;\\n    } else { \\n      return [arg];\\n    }\\n  }\\n  function present(value) {\\n    return typeof value != 'undefined' && (\\\"\\\" + value).length > 0;\\n  } \\n  function generate_transformation_string(options) {\\n    var width = options['width'];\\n    var height = options['height'];\\n    var size = option_consume(options, 'size');\\n    if (size) {\\n      var split_size = size.split(\\\"x\\\");\\n      options['width'] = width = split_size[0];\\n      options['height'] = height = split_size[1];  \\n    }       \\n    var has_layer = options.overlay || options.underlay;\\n     \\n    var crop = option_consume(options, 'crop');\\n    var angle = build_array(option_consume(options, 'angle')).join(\\\".\\\");\\n\\n    var no_html_sizes = has_layer || present(angle) || crop == \\\"fit\\\" || crop == \\\"limit\\\" || crop == \\\"lfill\\\";\\n     \\n    if (width && (no_html_sizes || parseFloat(width) < 1)) delete options['width'];\\n    if (height && (no_html_sizes || parseFloat(height) < 1)) delete options['height'];\\n    if (!crop && !has_layer) width = height = undefined;\\n\\n    var background = option_consume(options, 'background');\\n    background = background && background.replace(/^#/, 'rgb:');\\n    var color = option_consume(options, 'color');\\n    color = color && color.replace(/^#/, 'rgb:');\\n\\n    var base_transformations = build_array(option_consume(options, 'transformation', []));\\n    var named_transformation = [];\\n    if ($.grep(base_transformations, function(bs) {return typeof(bs) == 'object';}).length > 0) {\\n      base_transformations = $.map(base_transformations, function(base_transformation) {\\n        return typeof(base_transformation) == 'object' ? generate_transformation_string($.extend({}, base_transformation)) : generate_transformation_string({transformation: base_transformation});\\n      });\\n    } else {\\n      named_transformation = $.grep(base_transformations, function() { return this != null && this != \\\"\\\"}).join(\\\".\\\");\\n      base_transformations = [];\\n    }\\n    var effect = option_consume(options, \\\"effect\\\");\\n    if ($.isArray(effect)) effect = effect.join(\\\":\\\");\\n    \\n    var border = option_consume(options, \\\"border\\\")\\n    if ($.isPlainObject(border)) { \\n      var border_width = \\\"\\\" + (border.width || 2);\\n      var border_color = (border.color || \\\"black\\\").replace(/^#/, 'rgb:');\\n      border = border_width + \\\"px_solid_\\\" + border_color;\\n    }\\n    \\n    var flags = build_array(option_consume(options, 'flags')).join(\\\".\\\");\\n\\n    var params = [['c', crop], ['t', named_transformation], ['w', width], ['h', height], ['b', background], ['co', color], ['e', effect], ['a', angle], ['bo', border], ['fl', flags]];\\n    var simple_params = {\\n      x: 'x',\\n      y: 'y',\\n      radius: 'r',\\n      gravity: 'g',\\n      quality: 'q',\\n      prefix: 'p',\\n      default_image: 'd',\\n      underlay: 'u',\\n      overlay: 'l',\\n      fetch_format: 'f',\\n      density: 'dn',\\n      page: 'pg',\\n      color_space: 'cl',\\n      delay: 'dl',\\n      opacity: 'o'\\n    };\\n    for (var param in simple_params) {\\n      params.push([simple_params[param], option_consume(options, param)]);\\n    }\\n    params.sort(function(a, b){return a[0]<b[0] ? -1  : (a[0]>b[0] ? 1 : 0);});\\n    params.push([option_consume(options, 'raw_transformation')]);\\n    var transformation = $.map($.grep(params, function(param) {\\n      var value = param[param.length-1];\\n      return present(value);\\n    }), function(param) {\\n      return param.join(\\\"_\\\");\\n    }).join(\\\",\\\");\\n    base_transformations.push(transformation);\\n    return $.grep(base_transformations, present).join(\\\"/\\\");\\n  }\\n  var dummyImg = undefined;\\n  function absolutize(url) {\\n    if (!dummyImg) dummyImg = document.createElement(\\\"img\\\");\\n    dummyImg.src = url;\\n    url = dummyImg.src;\\n    dummyImg.src = null;\\n    return url;\\n  }\\n  function cloudinary_url(public_id, options) { \\n    options = options || {};\\n    var type = option_consume(options, 'type', 'upload');\\n    if (type == 'fetch') {\\n      options.fetch_format = options.fetch_format || option_consume(options, 'format');\\n    }\\n    var transformation = generate_transformation_string(options);\\n    var resource_type = option_consume(options, 'resource_type', \\\"image\\\");\\n    var version = option_consume(options, 'version');\\n    var format = option_consume(options, 'format');\\n    var cloud_name = option_consume(options, 'cloud_name', $.cloudinary.config().cloud_name);\\n    if (!cloud_name) throw \\\"Unknown cloud_name\\\";\\n    var private_cdn = option_consume(options, 'private_cdn', $.cloudinary.config().private_cdn);    \\n    var secure_distribution = option_consume(options, 'secure_distribution', $.cloudinary.config().secure_distribution);    \\n    var cname = option_consume(options, 'cname', $.cloudinary.config().cname);\\n    var cdn_subdomain = option_consume(options, 'cdn_subdomain', $.cloudinary.config().cdn_subdomain);\\n    var shorten = option_consume(options, 'shorten', $.cloudinary.config().shorten);\\n    var secure = option_consume(options, 'secure', window.location.protocol == 'https:'); \\n\\n    if (type == 'fetch') {\\n      public_id = absolutize(public_id); \\n    }\\n    \\n    if (public_id.match(/^https?:/)) {\\n      if (type == \\\"upload\\\" || type == \\\"asset\\\") return public_id;\\n      public_id = encodeURIComponent(public_id).replace(/%3A/g, \\\":\\\").replace(/%2F/g, \\\"/\\\"); \\n    } else {\\n      // Make sure public_id is URI encoded.\\n      public_id = encodeURIComponent(decodeURIComponent(public_id)).replace(/%3A/g, \\\":\\\").replace(/%2F/g, \\\"/\\\");      \\n      if (format) {\\n        public_id = public_id.replace(/\\\\.(jpg|png|gif|webp)$/, '') + \\\".\\\" + format;\\n      }\\n    }\\n\\n    var prefix = window.location.protocol == 'file:' ? \\\"file://\\\" : (secure ? 'https://' : 'http://');\\n    if (cloud_name.match(/^\\\\//) && !secure) {    \\n      prefix = \\\"/res\\\" + cloud_name;\\n    } else {\\n      var shared_domain = !private_cdn;\\n      if (secure) {        \\n        if (!secure_distribution || secure_distribution == OLD_AKAMAI_SHARED_CDN) {\\n          secure_distribution = private_cdn ? cloud_name + \\\"-res.cloudinary.com\\\" : SHARED_CDN;\\n        }\\n        shared_domain = shared_domain || secure_distribution == SHARED_CDN;\\n        prefix += secure_distribution;\\n      } else {\\n        var subdomain = cdn_subdomain ? \\\"a\\\" + ((crc32(public_id) % 5) + 1) + \\\".\\\" : \\\"\\\";\\n        host = cname || (private_cdn ? cloud_name + \\\"-res.cloudinary.com\\\" : \\\"res.cloudinary.com\\\" );\\n        prefix += subdomain + host;\\n      }\\n      if (shared_domain) prefix += \\\"/\\\" + cloud_name;\\n    }\\n    if (shorten && resource_type == \\\"image\\\" && type == \\\"upload\\\") {\\n      resource_type = \\\"iu\\\";\\n      type = undefined;\\n    }\\n    if (public_id.search(\\\"/\\\") >= 0 && !public_id.match(/^v[0-9]+/) && !public_id.match(/^https?:\\\\//) && !present(version)) {\\n      version = 1;\\n    }\\n\\n    var url = [prefix, resource_type, type, transformation, version ? \\\"v\\\" + version : \\\"\\\",\\n               public_id].join(\\\"/\\\").replace(/([^:])\\\\/+/g, '$1/');\\n    return url;\\n  }\\n  function html_only_attributes(options) {\\n    var width = option_consume(options, 'html_width');\\n    var height = option_consume(options, 'html_height');\\n    if (width) options['width'] = width;\\n    if (height) options['height'] = height;    \\n  }\\n  var cloudinary_config = undefined;\\n  $.cloudinary = {\\n    CF_SHARED_CDN: CF_SHARED_CDN,  \\n    OLD_AKAMAI_SHARED_CDN: OLD_AKAMAI_SHARED_CDN,\\n    AKAMAI_SHARED_CDN: AKAMAI_SHARED_CDN,\\n    SHARED_CDN: SHARED_CDN,    \\n    config: function(new_config, new_value) {\\n      if (!cloudinary_config) {\\n        cloudinary_config = {};\\n        $('meta[name^=\\\"cloudinary_\\\"]').each(function() {\\n          cloudinary_config[$(this).attr('name').replace(\\\"cloudinary_\\\", '')] = $(this).attr('content');\\n        });\\n      }\\n      if (typeof(new_value) != 'undefined') {\\n        cloudinary_config[new_config] = new_value;\\n      } else if (typeof(new_config) == 'string') {\\n        return cloudinary_config[new_config];\\n      } else if (new_config) {\\n        cloudinary_config = new_config;\\n      }\\n      return cloudinary_config;\\n    },\\n    url: function(public_id, options) {\\n      options = $.extend({}, options);\\n      return cloudinary_url(public_id, options);    \\n    },    \\n    url_internal: cloudinary_url,\\n    transformation_string: function(options) {\\n      options = $.extend({}, options);\\n      return generate_transformation_string(options);\\n    },\\n    image: function(public_id, options) {\\n      options = $.extend({}, options);\\n      var url = cloudinary_url(public_id, options);\\n      html_only_attributes(options);\\n      return $('<img/>').attr(options).attr('src', url);      \\n    },\\n    facebook_profile_image: function(public_id, options) {\\n      return $.cloudinary.image(public_id, $.extend({type: 'facebook'}, options));\\n    },\\n    twitter_profile_image: function(public_id, options) {\\n      return $.cloudinary.image(public_id, $.extend({type: 'twitter'}, options));\\n    },\\n    twitter_name_profile_image: function(public_id, options) {\\n      return $.cloudinary.image(public_id, $.extend({type: 'twitter_name'}, options));\\n    },\\n    gravatar_image: function(public_id, options) {\\n      return $.cloudinary.image(public_id, $.extend({type: 'gravatar'}, options));\\n    },\\n    fetch_image: function(public_id, options) {\\n      return $.cloudinary.image(public_id, $.extend({type: 'fetch'}, options));\\n    },\\n    sprite_css: function(public_id, options) {\\n      options = $.extend({type: 'sprite'}, options);\\n      if (!public_id.match(/.css$/)) options.format = 'css';\\n      return $.cloudinary.url(public_id, options);\\n    }\\n  };\\n  $.fn.cloudinary = function(options) {\\n    this.filter('img').each(function() {\\n      var img_options = $.extend({width: $(this).attr('width'), height: $(this).attr('height'),\\n                          src: $(this).attr('src')},\\n                         $.extend($(this).data(), options));\\n      var public_id = option_consume(img_options, 'source', option_consume(img_options, 'src')); \\n      var url = cloudinary_url(public_id, img_options);\\n      html_only_attributes(img_options);\\n      $(this).attr({src: url, width: img_options['width'], height: img_options['height']});\\n    });\\n    return this;\\n  };\\n  var webp = null;\\n  $.fn.webpify = function(options, webp_options) {\\n    var that = this;\\n    options = options || {};\\n    webp_options = webp_options || options;\\n    if (!webp) { \\n      var webp = $.Deferred();\\n      var webp_canary = new Image();\\n      webp_canary.onerror = webp.reject;\\n      webp_canary.onload = webp.resolve;\\n      webp_canary.src = 'data:image/webp;base64,UklGRjIAAABXRUJQVlA4ICYAAACyAgCdASoBAAEALmk0mk0iIiIiIgBoSygABc6zbAAA/v56QAAAAA==';\\n    }\\n    $(function() {\\n      webp.done(function() {\\n        $(that).cloudinary($.extend({}, $.extend(webp_options, {format: 'webp'})));\\n      }).fail(function() {\\n        $(that).cloudinary(options);\\n      });\\n    });\\n  }\\n  $.fn.fetchify = function(options) {\\n    return this.cloudinary($.extend(options, {'type': 'fetch'}));\\n  };\\n})( jQuery );\\n\\n(function( $ ) {\\n  if (!$.fn.fileupload) {\\n    return;\\n  }\\n  $.fn.cloudinary_fileupload = function(options) {\\n    var initializing = !this.data('blueimpFileupload');\\n    options = $.extend({\\n      maxFileSize: 20000000,\\n      dataType: 'json',\\n      headers: {\\\"X-Requested-With\\\": \\\"XMLHttpRequest\\\"}\\n    }, options);\\n    this.fileupload(options);\\n    \\n    if (initializing) {\\n      this.bind(\\\"fileuploaddone\\\", function(e, data) {\\n        if (data.result.error) return;      \\n        data.result.path = [\\\"v\\\", data.result.version, \\\"/\\\", data.result.public_id, \\n                            data.result.format ? \\\".\\\" + data.result.format : \\\"\\\"].join(\\\"\\\");\\n    \\n        if (data.cloudinaryField && data.form.length > 0) {\\n          var upload_info = [data.result.resource_type, data.result.type, data.result.path].join(\\\"/\\\") + \\\"#\\\" + data.result.signature;  \\n          var field = $(data.form).find('input[name=\\\"' + data.cloudinaryField + '\\\"]');\\n          if (field.length > 0) {\\n            field.val(upload_info);\\n          } else {\\n            $('<input></input>').attr({type: \\\"hidden\\\", name: data.cloudinaryField}).val(upload_info).appendTo(data.form);\\n          }\\n        }\\n        $(e.target).trigger('cloudinarydone', data);\\n      });\\n      \\n      this.bind(\\\"fileuploadstart\\\", function(e){\\n        $(e.target).trigger('cloudinarystart');\\n      });\\n      this.bind(\\\"fileuploadstop\\\", function(e){\\n        $(e.target).trigger('cloudinarystop');\\n      });\\n      this.bind(\\\"fileuploadprogress\\\", function(e,data){\\n        $(e.target).trigger('cloudinaryprogress',data);\\n      });\\n      this.bind(\\\"fileuploadprogressall\\\", function(e,data){\\n        $(e.target).trigger('cloudinaryprogressall',data);\\n      });\\n      this.bind(\\\"fileuploadfail\\\", function(e,data){\\n        $(e.target).trigger('cloudinaryfail',data);\\n      });\\n      this.bind(\\\"fileuploadalways\\\", function(e,data){\\n        $(e.target).trigger('cloudinaryalways',data);\\n      });\\n\\n      if (!this.fileupload('option').url) {\\n        var upload_url = \\\"https://api.cloudinary.com/v1_1/\\\" + $.cloudinary.config().cloud_name + \\\"/upload\\\";\\n        this.fileupload('option', 'url', upload_url);\\n      }\\n    }\\n    return this;\\n  };\\n  \\n  $.fn.cloudinary_upload_url = function(remote_url) {\\n    this.fileupload('option', 'formData').file = remote_url; \\n    this.fileupload('add', { files: [ remote_url ] }); \\n    delete(this.fileupload('option', 'formData').file);    \\n  }\\n  \\n  $(function() {\\n    $(\\\"input.cloudinary-fileupload[type=file]\\\").cloudinary_fileupload();\\n  });\\n})( jQuery );\\n\"\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzEuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ib3dlcl9jb21wb25lbnRzL2Nsb3VkaW5hcnlfanMvanMvanF1ZXJ5LmNsb3VkaW5hcnkuanM/YTE0MyJdLCJzb3VyY2VzQ29udGVudCI6WyJtb2R1bGUuZXhwb3J0cyA9IFwiLypcXG4gKiBDbG91ZGluYXJ5J3MgalF1ZXJ5IGxpYnJhcnkgLSB2MS4wLjExXFxuICogQ29weXJpZ2h0IENsb3VkaW5hcnlcXG4gKiBzZWUgaHR0cHM6Ly9naXRodWIuY29tL2Nsb3VkaW5hcnkvY2xvdWRpbmFyeV9qc1xcbiAqL1xcblxcbihmdW5jdGlvbiggJCApIHtcXG4gIHZhciBDRl9TSEFSRURfQ0ROID0gXFxcImQzanBsOTFweGV2YmtoLmNsb3VkZnJvbnQubmV0XFxcIjtcXG4gIHZhciBPTERfQUtBTUFJX1NIQVJFRF9DRE4gPSBcXFwiY2xvdWRpbmFyeS1hLmFrYW1haWhkLm5ldFxcXCI7XFxuICB2YXIgQUtBTUFJX1NIQVJFRF9DRE4gPSBcXFwicmVzLmNsb3VkaW5hcnkuY29tXFxcIjtcXG4gIHZhciBTSEFSRURfQ0ROID0gQUtBTUFJX1NIQVJFRF9DRE47XFxuICBcXG4gIGZ1bmN0aW9uIHV0ZjhfZW5jb2RlIChhcmdTdHJpbmcpIHtcXG4gICAgICAvLyBodHRwOi8va2V2aW4udmFuem9ubmV2ZWxkLm5ldFxcbiAgICAgIC8vICsgICBvcmlnaW5hbCBieTogV2VidG9vbGtpdC5pbmZvIChodHRwOi8vd3d3LndlYnRvb2xraXQuaW5mby8pXFxuICAgICAgLy8gKyAgIGltcHJvdmVkIGJ5OiBLZXZpbiB2YW4gWm9ubmV2ZWxkIChodHRwOi8va2V2aW4udmFuem9ubmV2ZWxkLm5ldClcXG4gICAgICAvLyArICAgaW1wcm92ZWQgYnk6IHNvd2JlcnJ5XFxuICAgICAgLy8gKyAgICB0d2Vha2VkIGJ5OiBKYWNrXFxuICAgICAgLy8gKyAgIGJ1Z2ZpeGVkIGJ5OiBPbm5vIE1hcnNtYW5cXG4gICAgICAvLyArICAgaW1wcm92ZWQgYnk6IFl2ZXMgU3VjYWV0XFxuICAgICAgLy8gKyAgIGJ1Z2ZpeGVkIGJ5OiBPbm5vIE1hcnNtYW5cXG4gICAgICAvLyArICAgYnVnZml4ZWQgYnk6IFVscmljaFxcbiAgICAgIC8vICsgICBidWdmaXhlZCBieTogUmFmYWwgS3VrYXdza2lcXG4gICAgICAvLyArICAgaW1wcm92ZWQgYnk6IGtpcmlsbG9pZFxcbiAgICAgIC8vICogICAgIGV4YW1wbGUgMTogdXRmOF9lbmNvZGUoJ0tldmluIHZhbiBab25uZXZlbGQnKTtcXG4gICAgICAvLyAqICAgICByZXR1cm5zIDE6ICdLZXZpbiB2YW4gWm9ubmV2ZWxkJ1xcbiAgXFxuICAgICAgaWYgKGFyZ1N0cmluZyA9PT0gbnVsbCB8fCB0eXBlb2YgYXJnU3RyaW5nID09PSBcXFwidW5kZWZpbmVkXFxcIikge1xcbiAgICAgICAgICByZXR1cm4gXFxcIlxcXCI7XFxuICAgICAgfVxcbiAgXFxuICAgICAgdmFyIHN0cmluZyA9IChhcmdTdHJpbmcgKyAnJyk7IC8vIC5yZXBsYWNlKC9cXFxcclxcXFxuL2csIFxcXCJcXFxcblxcXCIpLnJlcGxhY2UoL1xcXFxyL2csIFxcXCJcXFxcblxcXCIpO1xcbiAgICAgIHZhciB1dGZ0ZXh0ID0gJycsXFxuICAgICAgICAgIHN0YXJ0LCBlbmQsIHN0cmluZ2wgPSAwO1xcbiAgXFxuICAgICAgc3RhcnQgPSBlbmQgPSAwO1xcbiAgICAgIHN0cmluZ2wgPSBzdHJpbmcubGVuZ3RoO1xcbiAgICAgIGZvciAodmFyIG4gPSAwOyBuIDwgc3RyaW5nbDsgbisrKSB7XFxuICAgICAgICAgIHZhciBjMSA9IHN0cmluZy5jaGFyQ29kZUF0KG4pO1xcbiAgICAgICAgICB2YXIgZW5jID0gbnVsbDtcXG4gIFxcbiAgICAgICAgICBpZiAoYzEgPCAxMjgpIHtcXG4gICAgICAgICAgICAgIGVuZCsrO1xcbiAgICAgICAgICB9IGVsc2UgaWYgKGMxID4gMTI3ICYmIGMxIDwgMjA0OCkge1xcbiAgICAgICAgICAgICAgZW5jID0gU3RyaW5nLmZyb21DaGFyQ29kZSgoYzEgPj4gNikgfCAxOTIsIChjMSAmIDYzKSB8IDEyOCk7XFxuICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgICBlbmMgPSBTdHJpbmcuZnJvbUNoYXJDb2RlKChjMSA+PiAxMikgfCAyMjQsICgoYzEgPj4gNikgJiA2MykgfCAxMjgsIChjMSAmIDYzKSB8IDEyOCk7XFxuICAgICAgICAgIH1cXG4gICAgICAgICAgaWYgKGVuYyAhPT0gbnVsbCkge1xcbiAgICAgICAgICAgICAgaWYgKGVuZCA+IHN0YXJ0KSB7XFxuICAgICAgICAgICAgICAgICAgdXRmdGV4dCArPSBzdHJpbmcuc2xpY2Uoc3RhcnQsIGVuZCk7XFxuICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICB1dGZ0ZXh0ICs9IGVuYztcXG4gICAgICAgICAgICAgIHN0YXJ0ID0gZW5kID0gbiArIDE7XFxuICAgICAgICAgIH1cXG4gICAgICB9XFxuICBcXG4gICAgICBpZiAoZW5kID4gc3RhcnQpIHtcXG4gICAgICAgICAgdXRmdGV4dCArPSBzdHJpbmcuc2xpY2Uoc3RhcnQsIHN0cmluZ2wpO1xcbiAgICAgIH1cXG4gIFxcbiAgICAgIHJldHVybiB1dGZ0ZXh0O1xcbiAgfVxcbiAgXFxuICBmdW5jdGlvbiBjcmMzMiAoc3RyKSB7XFxuICAgICAgLy8gaHR0cDovL2tldmluLnZhbnpvbm5ldmVsZC5uZXRcXG4gICAgICAvLyArICAgb3JpZ2luYWwgYnk6IFdlYnRvb2xraXQuaW5mbyAoaHR0cDovL3d3dy53ZWJ0b29sa2l0LmluZm8vKVxcbiAgICAgIC8vICsgICBpbXByb3ZlZCBieTogVDBic25cXG4gICAgICAvLyArICAgaW1wcm92ZWQgYnk6IGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMjY0NzkzNS9qYXZhc2NyaXB0LWNyYzMyLWZ1bmN0aW9uLWFuZC1waHAtY3JjMzItbm90LW1hdGNoaW5nXFxuICAgICAgLy8gLSAgICBkZXBlbmRzIG9uOiB1dGY4X2VuY29kZVxcbiAgICAgIC8vICogICAgIGV4YW1wbGUgMTogY3JjMzIoJ0tldmluIHZhbiBab25uZXZlbGQnKTtcXG4gICAgICAvLyAqICAgICByZXR1cm5zIDE6IDEyNDk5OTEyNDlcXG4gICAgICBzdHIgPSB1dGY4X2VuY29kZShzdHIpO1xcbiAgICAgIHZhciB0YWJsZSA9IFxcXCIwMDAwMDAwMCA3NzA3MzA5NiBFRTBFNjEyQyA5OTA5NTFCQSAwNzZEQzQxOSA3MDZBRjQ4RiBFOTYzQTUzNSA5RTY0OTVBMyAwRURCODgzMiA3OURDQjhBNCBFMEQ1RTkxRSA5N0QyRDk4OCAwOUI2NEMyQiA3RUIxN0NCRCBFN0I4MkQwNyA5MEJGMUQ5MSAxREI3MTA2NCA2QUIwMjBGMiBGM0I5NzE0OCA4NEJFNDFERSAxQURBRDQ3RCA2RERERTRFQiBGNEQ0QjU1MSA4M0QzODVDNyAxMzZDOTg1NiA2NDZCQThDMCBGRDYyRjk3QSA4QTY1QzlFQyAxNDAxNUM0RiA2MzA2NkNEOSBGQTBGM0Q2MyA4RDA4MERGNSAzQjZFMjBDOCA0QzY5MTA1RSBENTYwNDFFNCBBMjY3NzE3MiAzQzAzRTREMSA0QjA0RDQ0NyBEMjBEODVGRCBBNTBBQjU2QiAzNUI1QThGQSA0MkIyOTg2QyBEQkJCQzlENiBBQ0JDRjk0MCAzMkQ4NkNFMyA0NURGNUM3NSBEQ0Q2MERDRiBBQkQxM0Q1OSAyNkQ5MzBBQyA1MURFMDAzQSBDOEQ3NTE4MCBCRkQwNjExNiAyMUI0RjRCNSA1NkIzQzQyMyBDRkJBOTU5OSBCOEJEQTUwRiAyODAyQjg5RSA1RjA1ODgwOCBDNjBDRDlCMiBCMTBCRTkyNCAyRjZGN0M4NyA1ODY4NEMxMSBDMTYxMURBQiBCNjY2MkQzRCA3NkRDNDE5MCAwMURCNzEwNiA5OEQyMjBCQyBFRkQ1MTAyQSA3MUIxODU4OSAwNkI2QjUxRiA5RkJGRTRBNSBFOEI4RDQzMyA3ODA3QzlBMiAwRjAwRjkzNCA5NjA5QTg4RSBFMTBFOTgxOCA3RjZBMERCQiAwODZEM0QyRCA5MTY0NkM5NyBFNjYzNUMwMSA2QjZCNTFGNCAxQzZDNjE2MiA4NTY1MzBEOCBGMjYyMDA0RSA2QzA2OTVFRCAxQjAxQTU3QiA4MjA4RjRDMSBGNTBGQzQ1NyA2NUIwRDlDNiAxMkI3RTk1MCA4QkJFQjhFQSBGQ0I5ODg3QyA2MkREMURERiAxNURBMkQ0OSA4Q0QzN0NGMyBGQkQ0NEM2NSA0REIyNjE1OCAzQUI1NTFDRSBBM0JDMDA3NCBENEJCMzBFMiA0QURGQTU0MSAzREQ4OTVENyBBNEQxQzQ2RCBEM0Q2RjRGQiA0MzY5RTk2QSAzNDZFRDlGQyBBRDY3ODg0NiBEQTYwQjhEMCA0NDA0MkQ3MyAzMzAzMURFNSBBQTBBNEM1RiBERDBEN0NDOSA1MDA1NzEzQyAyNzAyNDFBQSBCRTBCMTAxMCBDOTBDMjA4NiA1NzY4QjUyNSAyMDZGODVCMyBCOTY2RDQwOSBDRTYxRTQ5RiA1RURFRjkwRSAyOUQ5Qzk5OCBCMEQwOTgyMiBDN0Q3QThCNCA1OUIzM0QxNyAyRUI0MEQ4MSBCN0JENUMzQiBDMEJBNkNBRCBFREI4ODMyMCA5QUJGQjNCNiAwM0I2RTIwQyA3NEIxRDI5QSBFQUQ1NDczOSA5REQyNzdBRiAwNERCMjYxNSA3M0RDMTY4MyBFMzYzMEIxMiA5NDY0M0I4NCAwRDZENkEzRSA3QTZBNUFBOCBFNDBFQ0YwQiA5MzA5RkY5RCAwQTAwQUUyNyA3RDA3OUVCMSBGMDBGOTM0NCA4NzA4QTNEMiAxRTAxRjI2OCA2OTA2QzJGRSBGNzYyNTc1RCA4MDY1NjdDQiAxOTZDMzY3MSA2RTZCMDZFNyBGRUQ0MUI3NiA4OUQzMkJFMCAxMERBN0E1QSA2N0RENEFDQyBGOUI5REY2RiA4RUJFRUZGOSAxN0I3QkU0MyA2MEIwOEVENSBENkQ2QTNFOCBBMUQxOTM3RSAzOEQ4QzJDNCA0RkRGRjI1MiBEMUJCNjdGMSBBNkJDNTc2NyAzRkI1MDZERCA0OEIyMzY0QiBEODBEMkJEQSBBRjBBMUI0QyAzNjAzNEFGNiA0MTA0N0E2MCBERjYwRUZDMyBBODY3REY1NSAzMTZFOEVFRiA0NjY5QkU3OSBDQjYxQjM4QyBCQzY2ODMxQSAyNTZGRDJBMCA1MjY4RTIzNiBDQzBDNzc5NSBCQjBCNDcwMyAyMjAyMTZCOSA1NTA1MjYyRiBDNUJBM0JCRSBCMkJEMEIyOCAyQkI0NUE5MiA1Q0IzNkEwNCBDMkQ3RkZBNyBCNUQwQ0YzMSAyQ0Q5OUU4QiA1QkRFQUUxRCA5QjY0QzJCMCBFQzYzRjIyNiA3NTZBQTM5QyAwMjZEOTMwQSA5QzA5MDZBOSBFQjBFMzYzRiA3MjA3Njc4NSAwNTAwNTcxMyA5NUJGNEE4MiBFMkI4N0ExNCA3QkIxMkJBRSAwQ0I2MUIzOCA5MkQyOEU5QiBFNUQ1QkUwRCA3Q0RDRUZCNyAwQkRCREYyMSA4NkQzRDJENCBGMUQ0RTI0MiA2OEREQjNGOCAxRkRBODM2RSA4MUJFMTZDRCBGNkI5MjY1QiA2RkIwNzdFMSAxOEI3NDc3NyA4ODA4NUFFNiBGRjBGNkE3MCA2NjA2M0JDQSAxMTAxMEI1QyA4RjY1OUVGRiBGODYyQUU2OSA2MTZCRkZEMyAxNjZDQ0Y0NSBBMDBBRTI3OCBENzBERDJFRSA0RTA0ODM1NCAzOTAzQjNDMiBBNzY3MjY2MSBEMDYwMTZGNyA0OTY5NDc0RCAzRTZFNzdEQiBBRUQxNkE0QSBEOUQ2NUFEQyA0MERGMEI2NiAzN0Q4M0JGMCBBOUJDQUU1MyBERUJCOUVDNSA0N0IyQ0Y3RiAzMEI1RkZFOSBCREJERjIxQyBDQUJBQzI4QSA1M0IzOTMzMCAyNEI0QTNBNiBCQUQwMzYwNSBDREQ3MDY5MyA1NERFNTcyOSAyM0Q5NjdCRiBCMzY2N0EyRSBDNDYxNEFCOCA1RDY4MUIwMiAyQTZGMkI5NCBCNDBCQkUzNyBDMzBDOEVBMSA1QTA1REYxQiAyRDAyRUY4RFxcXCI7XFxuICBcXG4gICAgICB2YXIgY3JjID0gMDtcXG4gICAgICB2YXIgeCA9IDA7XFxuICAgICAgdmFyIHkgPSAwO1xcbiAgXFxuICAgICAgY3JjID0gY3JjIF4gKC0xKTtcXG4gICAgICBmb3IgKHZhciBpID0gMCwgaVRvcCA9IHN0ci5sZW5ndGg7IGkgPCBpVG9wOyBpKyspIHtcXG4gICAgICAgICAgeSA9IChjcmMgXiBzdHIuY2hhckNvZGVBdChpKSkgJiAweEZGO1xcbiAgICAgICAgICB4ID0gXFxcIjB4XFxcIiArIHRhYmxlLnN1YnN0cih5ICogOSwgOCk7XFxuICAgICAgICAgIGNyYyA9IChjcmMgPj4+IDgpIF4geDtcXG4gICAgICB9XFxuICBcXG4gICAgICBjcmMgPSBjcmMgXiAoLTEpO1xcbiAgICAgIC8vY29udmVydCB0byB1bnNpZ25lZCAzMi1iaXQgaW50IGlmIG5lZWRlZFxcbiAgICAgIGlmIChjcmMgPCAwKSB7Y3JjICs9IDQyOTQ5NjcyOTZ9XFxuICAgICAgcmV0dXJuIGNyYztcXG4gIH1cXG5cXG4gIGZ1bmN0aW9uIG9wdGlvbl9jb25zdW1lKG9wdGlvbnMsIG9wdGlvbl9uYW1lLCBkZWZhdWx0X3ZhbHVlKSB7XFxuICAgIHZhciByZXN1bHQgPSBvcHRpb25zW29wdGlvbl9uYW1lXTtcXG4gICAgZGVsZXRlIG9wdGlvbnNbb3B0aW9uX25hbWVdO1xcbiAgICByZXR1cm4gdHlwZW9mKHJlc3VsdCkgPT0gJ3VuZGVmaW5lZCcgPyBkZWZhdWx0X3ZhbHVlIDogcmVzdWx0O1xcbiAgfVxcbiAgZnVuY3Rpb24gYnVpbGRfYXJyYXkoYXJnKSB7XFxuICAgIGlmICghYXJnKSB7XFxuICAgICAgcmV0dXJuIFtdO1xcbiAgICB9IGVsc2UgaWYgKCQuaXNBcnJheShhcmcpKSB7XFxuICAgICAgcmV0dXJuIGFyZztcXG4gICAgfSBlbHNlIHsgXFxuICAgICAgcmV0dXJuIFthcmddO1xcbiAgICB9XFxuICB9XFxuICBmdW5jdGlvbiBwcmVzZW50KHZhbHVlKSB7XFxuICAgIHJldHVybiB0eXBlb2YgdmFsdWUgIT0gJ3VuZGVmaW5lZCcgJiYgKFxcXCJcXFwiICsgdmFsdWUpLmxlbmd0aCA+IDA7XFxuICB9IFxcbiAgZnVuY3Rpb24gZ2VuZXJhdGVfdHJhbnNmb3JtYXRpb25fc3RyaW5nKG9wdGlvbnMpIHtcXG4gICAgdmFyIHdpZHRoID0gb3B0aW9uc1snd2lkdGgnXTtcXG4gICAgdmFyIGhlaWdodCA9IG9wdGlvbnNbJ2hlaWdodCddO1xcbiAgICB2YXIgc2l6ZSA9IG9wdGlvbl9jb25zdW1lKG9wdGlvbnMsICdzaXplJyk7XFxuICAgIGlmIChzaXplKSB7XFxuICAgICAgdmFyIHNwbGl0X3NpemUgPSBzaXplLnNwbGl0KFxcXCJ4XFxcIik7XFxuICAgICAgb3B0aW9uc1snd2lkdGgnXSA9IHdpZHRoID0gc3BsaXRfc2l6ZVswXTtcXG4gICAgICBvcHRpb25zWydoZWlnaHQnXSA9IGhlaWdodCA9IHNwbGl0X3NpemVbMV07ICBcXG4gICAgfSAgICAgICBcXG4gICAgdmFyIGhhc19sYXllciA9IG9wdGlvbnMub3ZlcmxheSB8fCBvcHRpb25zLnVuZGVybGF5O1xcbiAgICAgXFxuICAgIHZhciBjcm9wID0gb3B0aW9uX2NvbnN1bWUob3B0aW9ucywgJ2Nyb3AnKTtcXG4gICAgdmFyIGFuZ2xlID0gYnVpbGRfYXJyYXkob3B0aW9uX2NvbnN1bWUob3B0aW9ucywgJ2FuZ2xlJykpLmpvaW4oXFxcIi5cXFwiKTtcXG5cXG4gICAgdmFyIG5vX2h0bWxfc2l6ZXMgPSBoYXNfbGF5ZXIgfHwgcHJlc2VudChhbmdsZSkgfHwgY3JvcCA9PSBcXFwiZml0XFxcIiB8fCBjcm9wID09IFxcXCJsaW1pdFxcXCIgfHwgY3JvcCA9PSBcXFwibGZpbGxcXFwiO1xcbiAgICAgXFxuICAgIGlmICh3aWR0aCAmJiAobm9faHRtbF9zaXplcyB8fCBwYXJzZUZsb2F0KHdpZHRoKSA8IDEpKSBkZWxldGUgb3B0aW9uc1snd2lkdGgnXTtcXG4gICAgaWYgKGhlaWdodCAmJiAobm9faHRtbF9zaXplcyB8fCBwYXJzZUZsb2F0KGhlaWdodCkgPCAxKSkgZGVsZXRlIG9wdGlvbnNbJ2hlaWdodCddO1xcbiAgICBpZiAoIWNyb3AgJiYgIWhhc19sYXllcikgd2lkdGggPSBoZWlnaHQgPSB1bmRlZmluZWQ7XFxuXFxuICAgIHZhciBiYWNrZ3JvdW5kID0gb3B0aW9uX2NvbnN1bWUob3B0aW9ucywgJ2JhY2tncm91bmQnKTtcXG4gICAgYmFja2dyb3VuZCA9IGJhY2tncm91bmQgJiYgYmFja2dyb3VuZC5yZXBsYWNlKC9eIy8sICdyZ2I6Jyk7XFxuICAgIHZhciBjb2xvciA9IG9wdGlvbl9jb25zdW1lKG9wdGlvbnMsICdjb2xvcicpO1xcbiAgICBjb2xvciA9IGNvbG9yICYmIGNvbG9yLnJlcGxhY2UoL14jLywgJ3JnYjonKTtcXG5cXG4gICAgdmFyIGJhc2VfdHJhbnNmb3JtYXRpb25zID0gYnVpbGRfYXJyYXkob3B0aW9uX2NvbnN1bWUob3B0aW9ucywgJ3RyYW5zZm9ybWF0aW9uJywgW10pKTtcXG4gICAgdmFyIG5hbWVkX3RyYW5zZm9ybWF0aW9uID0gW107XFxuICAgIGlmICgkLmdyZXAoYmFzZV90cmFuc2Zvcm1hdGlvbnMsIGZ1bmN0aW9uKGJzKSB7cmV0dXJuIHR5cGVvZihicykgPT0gJ29iamVjdCc7fSkubGVuZ3RoID4gMCkge1xcbiAgICAgIGJhc2VfdHJhbnNmb3JtYXRpb25zID0gJC5tYXAoYmFzZV90cmFuc2Zvcm1hdGlvbnMsIGZ1bmN0aW9uKGJhc2VfdHJhbnNmb3JtYXRpb24pIHtcXG4gICAgICAgIHJldHVybiB0eXBlb2YoYmFzZV90cmFuc2Zvcm1hdGlvbikgPT0gJ29iamVjdCcgPyBnZW5lcmF0ZV90cmFuc2Zvcm1hdGlvbl9zdHJpbmcoJC5leHRlbmQoe30sIGJhc2VfdHJhbnNmb3JtYXRpb24pKSA6IGdlbmVyYXRlX3RyYW5zZm9ybWF0aW9uX3N0cmluZyh7dHJhbnNmb3JtYXRpb246IGJhc2VfdHJhbnNmb3JtYXRpb259KTtcXG4gICAgICB9KTtcXG4gICAgfSBlbHNlIHtcXG4gICAgICBuYW1lZF90cmFuc2Zvcm1hdGlvbiA9ICQuZ3JlcChiYXNlX3RyYW5zZm9ybWF0aW9ucywgZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzICE9IG51bGwgJiYgdGhpcyAhPSBcXFwiXFxcIn0pLmpvaW4oXFxcIi5cXFwiKTtcXG4gICAgICBiYXNlX3RyYW5zZm9ybWF0aW9ucyA9IFtdO1xcbiAgICB9XFxuICAgIHZhciBlZmZlY3QgPSBvcHRpb25fY29uc3VtZShvcHRpb25zLCBcXFwiZWZmZWN0XFxcIik7XFxuICAgIGlmICgkLmlzQXJyYXkoZWZmZWN0KSkgZWZmZWN0ID0gZWZmZWN0LmpvaW4oXFxcIjpcXFwiKTtcXG4gICAgXFxuICAgIHZhciBib3JkZXIgPSBvcHRpb25fY29uc3VtZShvcHRpb25zLCBcXFwiYm9yZGVyXFxcIilcXG4gICAgaWYgKCQuaXNQbGFpbk9iamVjdChib3JkZXIpKSB7IFxcbiAgICAgIHZhciBib3JkZXJfd2lkdGggPSBcXFwiXFxcIiArIChib3JkZXIud2lkdGggfHwgMik7XFxuICAgICAgdmFyIGJvcmRlcl9jb2xvciA9IChib3JkZXIuY29sb3IgfHwgXFxcImJsYWNrXFxcIikucmVwbGFjZSgvXiMvLCAncmdiOicpO1xcbiAgICAgIGJvcmRlciA9IGJvcmRlcl93aWR0aCArIFxcXCJweF9zb2xpZF9cXFwiICsgYm9yZGVyX2NvbG9yO1xcbiAgICB9XFxuICAgIFxcbiAgICB2YXIgZmxhZ3MgPSBidWlsZF9hcnJheShvcHRpb25fY29uc3VtZShvcHRpb25zLCAnZmxhZ3MnKSkuam9pbihcXFwiLlxcXCIpO1xcblxcbiAgICB2YXIgcGFyYW1zID0gW1snYycsIGNyb3BdLCBbJ3QnLCBuYW1lZF90cmFuc2Zvcm1hdGlvbl0sIFsndycsIHdpZHRoXSwgWydoJywgaGVpZ2h0XSwgWydiJywgYmFja2dyb3VuZF0sIFsnY28nLCBjb2xvcl0sIFsnZScsIGVmZmVjdF0sIFsnYScsIGFuZ2xlXSwgWydibycsIGJvcmRlcl0sIFsnZmwnLCBmbGFnc11dO1xcbiAgICB2YXIgc2ltcGxlX3BhcmFtcyA9IHtcXG4gICAgICB4OiAneCcsXFxuICAgICAgeTogJ3knLFxcbiAgICAgIHJhZGl1czogJ3InLFxcbiAgICAgIGdyYXZpdHk6ICdnJyxcXG4gICAgICBxdWFsaXR5OiAncScsXFxuICAgICAgcHJlZml4OiAncCcsXFxuICAgICAgZGVmYXVsdF9pbWFnZTogJ2QnLFxcbiAgICAgIHVuZGVybGF5OiAndScsXFxuICAgICAgb3ZlcmxheTogJ2wnLFxcbiAgICAgIGZldGNoX2Zvcm1hdDogJ2YnLFxcbiAgICAgIGRlbnNpdHk6ICdkbicsXFxuICAgICAgcGFnZTogJ3BnJyxcXG4gICAgICBjb2xvcl9zcGFjZTogJ2NsJyxcXG4gICAgICBkZWxheTogJ2RsJyxcXG4gICAgICBvcGFjaXR5OiAnbydcXG4gICAgfTtcXG4gICAgZm9yICh2YXIgcGFyYW0gaW4gc2ltcGxlX3BhcmFtcykge1xcbiAgICAgIHBhcmFtcy5wdXNoKFtzaW1wbGVfcGFyYW1zW3BhcmFtXSwgb3B0aW9uX2NvbnN1bWUob3B0aW9ucywgcGFyYW0pXSk7XFxuICAgIH1cXG4gICAgcGFyYW1zLnNvcnQoZnVuY3Rpb24oYSwgYil7cmV0dXJuIGFbMF08YlswXSA/IC0xICA6IChhWzBdPmJbMF0gPyAxIDogMCk7fSk7XFxuICAgIHBhcmFtcy5wdXNoKFtvcHRpb25fY29uc3VtZShvcHRpb25zLCAncmF3X3RyYW5zZm9ybWF0aW9uJyldKTtcXG4gICAgdmFyIHRyYW5zZm9ybWF0aW9uID0gJC5tYXAoJC5ncmVwKHBhcmFtcywgZnVuY3Rpb24ocGFyYW0pIHtcXG4gICAgICB2YXIgdmFsdWUgPSBwYXJhbVtwYXJhbS5sZW5ndGgtMV07XFxuICAgICAgcmV0dXJuIHByZXNlbnQodmFsdWUpO1xcbiAgICB9KSwgZnVuY3Rpb24ocGFyYW0pIHtcXG4gICAgICByZXR1cm4gcGFyYW0uam9pbihcXFwiX1xcXCIpO1xcbiAgICB9KS5qb2luKFxcXCIsXFxcIik7XFxuICAgIGJhc2VfdHJhbnNmb3JtYXRpb25zLnB1c2godHJhbnNmb3JtYXRpb24pO1xcbiAgICByZXR1cm4gJC5ncmVwKGJhc2VfdHJhbnNmb3JtYXRpb25zLCBwcmVzZW50KS5qb2luKFxcXCIvXFxcIik7XFxuICB9XFxuICB2YXIgZHVtbXlJbWcgPSB1bmRlZmluZWQ7XFxuICBmdW5jdGlvbiBhYnNvbHV0aXplKHVybCkge1xcbiAgICBpZiAoIWR1bW15SW1nKSBkdW1teUltZyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXFxcImltZ1xcXCIpO1xcbiAgICBkdW1teUltZy5zcmMgPSB1cmw7XFxuICAgIHVybCA9IGR1bW15SW1nLnNyYztcXG4gICAgZHVtbXlJbWcuc3JjID0gbnVsbDtcXG4gICAgcmV0dXJuIHVybDtcXG4gIH1cXG4gIGZ1bmN0aW9uIGNsb3VkaW5hcnlfdXJsKHB1YmxpY19pZCwgb3B0aW9ucykgeyBcXG4gICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XFxuICAgIHZhciB0eXBlID0gb3B0aW9uX2NvbnN1bWUob3B0aW9ucywgJ3R5cGUnLCAndXBsb2FkJyk7XFxuICAgIGlmICh0eXBlID09ICdmZXRjaCcpIHtcXG4gICAgICBvcHRpb25zLmZldGNoX2Zvcm1hdCA9IG9wdGlvbnMuZmV0Y2hfZm9ybWF0IHx8IG9wdGlvbl9jb25zdW1lKG9wdGlvbnMsICdmb3JtYXQnKTtcXG4gICAgfVxcbiAgICB2YXIgdHJhbnNmb3JtYXRpb24gPSBnZW5lcmF0ZV90cmFuc2Zvcm1hdGlvbl9zdHJpbmcob3B0aW9ucyk7XFxuICAgIHZhciByZXNvdXJjZV90eXBlID0gb3B0aW9uX2NvbnN1bWUob3B0aW9ucywgJ3Jlc291cmNlX3R5cGUnLCBcXFwiaW1hZ2VcXFwiKTtcXG4gICAgdmFyIHZlcnNpb24gPSBvcHRpb25fY29uc3VtZShvcHRpb25zLCAndmVyc2lvbicpO1xcbiAgICB2YXIgZm9ybWF0ID0gb3B0aW9uX2NvbnN1bWUob3B0aW9ucywgJ2Zvcm1hdCcpO1xcbiAgICB2YXIgY2xvdWRfbmFtZSA9IG9wdGlvbl9jb25zdW1lKG9wdGlvbnMsICdjbG91ZF9uYW1lJywgJC5jbG91ZGluYXJ5LmNvbmZpZygpLmNsb3VkX25hbWUpO1xcbiAgICBpZiAoIWNsb3VkX25hbWUpIHRocm93IFxcXCJVbmtub3duIGNsb3VkX25hbWVcXFwiO1xcbiAgICB2YXIgcHJpdmF0ZV9jZG4gPSBvcHRpb25fY29uc3VtZShvcHRpb25zLCAncHJpdmF0ZV9jZG4nLCAkLmNsb3VkaW5hcnkuY29uZmlnKCkucHJpdmF0ZV9jZG4pOyAgICBcXG4gICAgdmFyIHNlY3VyZV9kaXN0cmlidXRpb24gPSBvcHRpb25fY29uc3VtZShvcHRpb25zLCAnc2VjdXJlX2Rpc3RyaWJ1dGlvbicsICQuY2xvdWRpbmFyeS5jb25maWcoKS5zZWN1cmVfZGlzdHJpYnV0aW9uKTsgICAgXFxuICAgIHZhciBjbmFtZSA9IG9wdGlvbl9jb25zdW1lKG9wdGlvbnMsICdjbmFtZScsICQuY2xvdWRpbmFyeS5jb25maWcoKS5jbmFtZSk7XFxuICAgIHZhciBjZG5fc3ViZG9tYWluID0gb3B0aW9uX2NvbnN1bWUob3B0aW9ucywgJ2Nkbl9zdWJkb21haW4nLCAkLmNsb3VkaW5hcnkuY29uZmlnKCkuY2RuX3N1YmRvbWFpbik7XFxuICAgIHZhciBzaG9ydGVuID0gb3B0aW9uX2NvbnN1bWUob3B0aW9ucywgJ3Nob3J0ZW4nLCAkLmNsb3VkaW5hcnkuY29uZmlnKCkuc2hvcnRlbik7XFxuICAgIHZhciBzZWN1cmUgPSBvcHRpb25fY29uc3VtZShvcHRpb25zLCAnc2VjdXJlJywgd2luZG93LmxvY2F0aW9uLnByb3RvY29sID09ICdodHRwczonKTsgXFxuXFxuICAgIGlmICh0eXBlID09ICdmZXRjaCcpIHtcXG4gICAgICBwdWJsaWNfaWQgPSBhYnNvbHV0aXplKHB1YmxpY19pZCk7IFxcbiAgICB9XFxuICAgIFxcbiAgICBpZiAocHVibGljX2lkLm1hdGNoKC9eaHR0cHM/Oi8pKSB7XFxuICAgICAgaWYgKHR5cGUgPT0gXFxcInVwbG9hZFxcXCIgfHwgdHlwZSA9PSBcXFwiYXNzZXRcXFwiKSByZXR1cm4gcHVibGljX2lkO1xcbiAgICAgIHB1YmxpY19pZCA9IGVuY29kZVVSSUNvbXBvbmVudChwdWJsaWNfaWQpLnJlcGxhY2UoLyUzQS9nLCBcXFwiOlxcXCIpLnJlcGxhY2UoLyUyRi9nLCBcXFwiL1xcXCIpOyBcXG4gICAgfSBlbHNlIHtcXG4gICAgICAvLyBNYWtlIHN1cmUgcHVibGljX2lkIGlzIFVSSSBlbmNvZGVkLlxcbiAgICAgIHB1YmxpY19pZCA9IGVuY29kZVVSSUNvbXBvbmVudChkZWNvZGVVUklDb21wb25lbnQocHVibGljX2lkKSkucmVwbGFjZSgvJTNBL2csIFxcXCI6XFxcIikucmVwbGFjZSgvJTJGL2csIFxcXCIvXFxcIik7ICAgICAgXFxuICAgICAgaWYgKGZvcm1hdCkge1xcbiAgICAgICAgcHVibGljX2lkID0gcHVibGljX2lkLnJlcGxhY2UoL1xcXFwuKGpwZ3xwbmd8Z2lmfHdlYnApJC8sICcnKSArIFxcXCIuXFxcIiArIGZvcm1hdDtcXG4gICAgICB9XFxuICAgIH1cXG5cXG4gICAgdmFyIHByZWZpeCA9IHdpbmRvdy5sb2NhdGlvbi5wcm90b2NvbCA9PSAnZmlsZTonID8gXFxcImZpbGU6Ly9cXFwiIDogKHNlY3VyZSA/ICdodHRwczovLycgOiAnaHR0cDovLycpO1xcbiAgICBpZiAoY2xvdWRfbmFtZS5tYXRjaCgvXlxcXFwvLykgJiYgIXNlY3VyZSkgeyAgICBcXG4gICAgICBwcmVmaXggPSBcXFwiL3Jlc1xcXCIgKyBjbG91ZF9uYW1lO1xcbiAgICB9IGVsc2Uge1xcbiAgICAgIHZhciBzaGFyZWRfZG9tYWluID0gIXByaXZhdGVfY2RuO1xcbiAgICAgIGlmIChzZWN1cmUpIHsgICAgICAgIFxcbiAgICAgICAgaWYgKCFzZWN1cmVfZGlzdHJpYnV0aW9uIHx8IHNlY3VyZV9kaXN0cmlidXRpb24gPT0gT0xEX0FLQU1BSV9TSEFSRURfQ0ROKSB7XFxuICAgICAgICAgIHNlY3VyZV9kaXN0cmlidXRpb24gPSBwcml2YXRlX2NkbiA/IGNsb3VkX25hbWUgKyBcXFwiLXJlcy5jbG91ZGluYXJ5LmNvbVxcXCIgOiBTSEFSRURfQ0ROO1xcbiAgICAgICAgfVxcbiAgICAgICAgc2hhcmVkX2RvbWFpbiA9IHNoYXJlZF9kb21haW4gfHwgc2VjdXJlX2Rpc3RyaWJ1dGlvbiA9PSBTSEFSRURfQ0ROO1xcbiAgICAgICAgcHJlZml4ICs9IHNlY3VyZV9kaXN0cmlidXRpb247XFxuICAgICAgfSBlbHNlIHtcXG4gICAgICAgIHZhciBzdWJkb21haW4gPSBjZG5fc3ViZG9tYWluID8gXFxcImFcXFwiICsgKChjcmMzMihwdWJsaWNfaWQpICUgNSkgKyAxKSArIFxcXCIuXFxcIiA6IFxcXCJcXFwiO1xcbiAgICAgICAgaG9zdCA9IGNuYW1lIHx8IChwcml2YXRlX2NkbiA/IGNsb3VkX25hbWUgKyBcXFwiLXJlcy5jbG91ZGluYXJ5LmNvbVxcXCIgOiBcXFwicmVzLmNsb3VkaW5hcnkuY29tXFxcIiApO1xcbiAgICAgICAgcHJlZml4ICs9IHN1YmRvbWFpbiArIGhvc3Q7XFxuICAgICAgfVxcbiAgICAgIGlmIChzaGFyZWRfZG9tYWluKSBwcmVmaXggKz0gXFxcIi9cXFwiICsgY2xvdWRfbmFtZTtcXG4gICAgfVxcbiAgICBpZiAoc2hvcnRlbiAmJiByZXNvdXJjZV90eXBlID09IFxcXCJpbWFnZVxcXCIgJiYgdHlwZSA9PSBcXFwidXBsb2FkXFxcIikge1xcbiAgICAgIHJlc291cmNlX3R5cGUgPSBcXFwiaXVcXFwiO1xcbiAgICAgIHR5cGUgPSB1bmRlZmluZWQ7XFxuICAgIH1cXG4gICAgaWYgKHB1YmxpY19pZC5zZWFyY2goXFxcIi9cXFwiKSA+PSAwICYmICFwdWJsaWNfaWQubWF0Y2goL152WzAtOV0rLykgJiYgIXB1YmxpY19pZC5tYXRjaCgvXmh0dHBzPzpcXFxcLy8pICYmICFwcmVzZW50KHZlcnNpb24pKSB7XFxuICAgICAgdmVyc2lvbiA9IDE7XFxuICAgIH1cXG5cXG4gICAgdmFyIHVybCA9IFtwcmVmaXgsIHJlc291cmNlX3R5cGUsIHR5cGUsIHRyYW5zZm9ybWF0aW9uLCB2ZXJzaW9uID8gXFxcInZcXFwiICsgdmVyc2lvbiA6IFxcXCJcXFwiLFxcbiAgICAgICAgICAgICAgIHB1YmxpY19pZF0uam9pbihcXFwiL1xcXCIpLnJlcGxhY2UoLyhbXjpdKVxcXFwvKy9nLCAnJDEvJyk7XFxuICAgIHJldHVybiB1cmw7XFxuICB9XFxuICBmdW5jdGlvbiBodG1sX29ubHlfYXR0cmlidXRlcyhvcHRpb25zKSB7XFxuICAgIHZhciB3aWR0aCA9IG9wdGlvbl9jb25zdW1lKG9wdGlvbnMsICdodG1sX3dpZHRoJyk7XFxuICAgIHZhciBoZWlnaHQgPSBvcHRpb25fY29uc3VtZShvcHRpb25zLCAnaHRtbF9oZWlnaHQnKTtcXG4gICAgaWYgKHdpZHRoKSBvcHRpb25zWyd3aWR0aCddID0gd2lkdGg7XFxuICAgIGlmIChoZWlnaHQpIG9wdGlvbnNbJ2hlaWdodCddID0gaGVpZ2h0OyAgICBcXG4gIH1cXG4gIHZhciBjbG91ZGluYXJ5X2NvbmZpZyA9IHVuZGVmaW5lZDtcXG4gICQuY2xvdWRpbmFyeSA9IHtcXG4gICAgQ0ZfU0hBUkVEX0NETjogQ0ZfU0hBUkVEX0NETiwgIFxcbiAgICBPTERfQUtBTUFJX1NIQVJFRF9DRE46IE9MRF9BS0FNQUlfU0hBUkVEX0NETixcXG4gICAgQUtBTUFJX1NIQVJFRF9DRE46IEFLQU1BSV9TSEFSRURfQ0ROLFxcbiAgICBTSEFSRURfQ0ROOiBTSEFSRURfQ0ROLCAgICBcXG4gICAgY29uZmlnOiBmdW5jdGlvbihuZXdfY29uZmlnLCBuZXdfdmFsdWUpIHtcXG4gICAgICBpZiAoIWNsb3VkaW5hcnlfY29uZmlnKSB7XFxuICAgICAgICBjbG91ZGluYXJ5X2NvbmZpZyA9IHt9O1xcbiAgICAgICAgJCgnbWV0YVtuYW1lXj1cXFwiY2xvdWRpbmFyeV9cXFwiXScpLmVhY2goZnVuY3Rpb24oKSB7XFxuICAgICAgICAgIGNsb3VkaW5hcnlfY29uZmlnWyQodGhpcykuYXR0cignbmFtZScpLnJlcGxhY2UoXFxcImNsb3VkaW5hcnlfXFxcIiwgJycpXSA9ICQodGhpcykuYXR0cignY29udGVudCcpO1xcbiAgICAgICAgfSk7XFxuICAgICAgfVxcbiAgICAgIGlmICh0eXBlb2YobmV3X3ZhbHVlKSAhPSAndW5kZWZpbmVkJykge1xcbiAgICAgICAgY2xvdWRpbmFyeV9jb25maWdbbmV3X2NvbmZpZ10gPSBuZXdfdmFsdWU7XFxuICAgICAgfSBlbHNlIGlmICh0eXBlb2YobmV3X2NvbmZpZykgPT0gJ3N0cmluZycpIHtcXG4gICAgICAgIHJldHVybiBjbG91ZGluYXJ5X2NvbmZpZ1tuZXdfY29uZmlnXTtcXG4gICAgICB9IGVsc2UgaWYgKG5ld19jb25maWcpIHtcXG4gICAgICAgIGNsb3VkaW5hcnlfY29uZmlnID0gbmV3X2NvbmZpZztcXG4gICAgICB9XFxuICAgICAgcmV0dXJuIGNsb3VkaW5hcnlfY29uZmlnO1xcbiAgICB9LFxcbiAgICB1cmw6IGZ1bmN0aW9uKHB1YmxpY19pZCwgb3B0aW9ucykge1xcbiAgICAgIG9wdGlvbnMgPSAkLmV4dGVuZCh7fSwgb3B0aW9ucyk7XFxuICAgICAgcmV0dXJuIGNsb3VkaW5hcnlfdXJsKHB1YmxpY19pZCwgb3B0aW9ucyk7ICAgIFxcbiAgICB9LCAgICBcXG4gICAgdXJsX2ludGVybmFsOiBjbG91ZGluYXJ5X3VybCxcXG4gICAgdHJhbnNmb3JtYXRpb25fc3RyaW5nOiBmdW5jdGlvbihvcHRpb25zKSB7XFxuICAgICAgb3B0aW9ucyA9ICQuZXh0ZW5kKHt9LCBvcHRpb25zKTtcXG4gICAgICByZXR1cm4gZ2VuZXJhdGVfdHJhbnNmb3JtYXRpb25fc3RyaW5nKG9wdGlvbnMpO1xcbiAgICB9LFxcbiAgICBpbWFnZTogZnVuY3Rpb24ocHVibGljX2lkLCBvcHRpb25zKSB7XFxuICAgICAgb3B0aW9ucyA9ICQuZXh0ZW5kKHt9LCBvcHRpb25zKTtcXG4gICAgICB2YXIgdXJsID0gY2xvdWRpbmFyeV91cmwocHVibGljX2lkLCBvcHRpb25zKTtcXG4gICAgICBodG1sX29ubHlfYXR0cmlidXRlcyhvcHRpb25zKTtcXG4gICAgICByZXR1cm4gJCgnPGltZy8+JykuYXR0cihvcHRpb25zKS5hdHRyKCdzcmMnLCB1cmwpOyAgICAgIFxcbiAgICB9LFxcbiAgICBmYWNlYm9va19wcm9maWxlX2ltYWdlOiBmdW5jdGlvbihwdWJsaWNfaWQsIG9wdGlvbnMpIHtcXG4gICAgICByZXR1cm4gJC5jbG91ZGluYXJ5LmltYWdlKHB1YmxpY19pZCwgJC5leHRlbmQoe3R5cGU6ICdmYWNlYm9vayd9LCBvcHRpb25zKSk7XFxuICAgIH0sXFxuICAgIHR3aXR0ZXJfcHJvZmlsZV9pbWFnZTogZnVuY3Rpb24ocHVibGljX2lkLCBvcHRpb25zKSB7XFxuICAgICAgcmV0dXJuICQuY2xvdWRpbmFyeS5pbWFnZShwdWJsaWNfaWQsICQuZXh0ZW5kKHt0eXBlOiAndHdpdHRlcid9LCBvcHRpb25zKSk7XFxuICAgIH0sXFxuICAgIHR3aXR0ZXJfbmFtZV9wcm9maWxlX2ltYWdlOiBmdW5jdGlvbihwdWJsaWNfaWQsIG9wdGlvbnMpIHtcXG4gICAgICByZXR1cm4gJC5jbG91ZGluYXJ5LmltYWdlKHB1YmxpY19pZCwgJC5leHRlbmQoe3R5cGU6ICd0d2l0dGVyX25hbWUnfSwgb3B0aW9ucykpO1xcbiAgICB9LFxcbiAgICBncmF2YXRhcl9pbWFnZTogZnVuY3Rpb24ocHVibGljX2lkLCBvcHRpb25zKSB7XFxuICAgICAgcmV0dXJuICQuY2xvdWRpbmFyeS5pbWFnZShwdWJsaWNfaWQsICQuZXh0ZW5kKHt0eXBlOiAnZ3JhdmF0YXInfSwgb3B0aW9ucykpO1xcbiAgICB9LFxcbiAgICBmZXRjaF9pbWFnZTogZnVuY3Rpb24ocHVibGljX2lkLCBvcHRpb25zKSB7XFxuICAgICAgcmV0dXJuICQuY2xvdWRpbmFyeS5pbWFnZShwdWJsaWNfaWQsICQuZXh0ZW5kKHt0eXBlOiAnZmV0Y2gnfSwgb3B0aW9ucykpO1xcbiAgICB9LFxcbiAgICBzcHJpdGVfY3NzOiBmdW5jdGlvbihwdWJsaWNfaWQsIG9wdGlvbnMpIHtcXG4gICAgICBvcHRpb25zID0gJC5leHRlbmQoe3R5cGU6ICdzcHJpdGUnfSwgb3B0aW9ucyk7XFxuICAgICAgaWYgKCFwdWJsaWNfaWQubWF0Y2goLy5jc3MkLykpIG9wdGlvbnMuZm9ybWF0ID0gJ2Nzcyc7XFxuICAgICAgcmV0dXJuICQuY2xvdWRpbmFyeS51cmwocHVibGljX2lkLCBvcHRpb25zKTtcXG4gICAgfVxcbiAgfTtcXG4gICQuZm4uY2xvdWRpbmFyeSA9IGZ1bmN0aW9uKG9wdGlvbnMpIHtcXG4gICAgdGhpcy5maWx0ZXIoJ2ltZycpLmVhY2goZnVuY3Rpb24oKSB7XFxuICAgICAgdmFyIGltZ19vcHRpb25zID0gJC5leHRlbmQoe3dpZHRoOiAkKHRoaXMpLmF0dHIoJ3dpZHRoJyksIGhlaWdodDogJCh0aGlzKS5hdHRyKCdoZWlnaHQnKSxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHNyYzogJCh0aGlzKS5hdHRyKCdzcmMnKX0sXFxuICAgICAgICAgICAgICAgICAgICAgICAgICQuZXh0ZW5kKCQodGhpcykuZGF0YSgpLCBvcHRpb25zKSk7XFxuICAgICAgdmFyIHB1YmxpY19pZCA9IG9wdGlvbl9jb25zdW1lKGltZ19vcHRpb25zLCAnc291cmNlJywgb3B0aW9uX2NvbnN1bWUoaW1nX29wdGlvbnMsICdzcmMnKSk7IFxcbiAgICAgIHZhciB1cmwgPSBjbG91ZGluYXJ5X3VybChwdWJsaWNfaWQsIGltZ19vcHRpb25zKTtcXG4gICAgICBodG1sX29ubHlfYXR0cmlidXRlcyhpbWdfb3B0aW9ucyk7XFxuICAgICAgJCh0aGlzKS5hdHRyKHtzcmM6IHVybCwgd2lkdGg6IGltZ19vcHRpb25zWyd3aWR0aCddLCBoZWlnaHQ6IGltZ19vcHRpb25zWydoZWlnaHQnXX0pO1xcbiAgICB9KTtcXG4gICAgcmV0dXJuIHRoaXM7XFxuICB9O1xcbiAgdmFyIHdlYnAgPSBudWxsO1xcbiAgJC5mbi53ZWJwaWZ5ID0gZnVuY3Rpb24ob3B0aW9ucywgd2VicF9vcHRpb25zKSB7XFxuICAgIHZhciB0aGF0ID0gdGhpcztcXG4gICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XFxuICAgIHdlYnBfb3B0aW9ucyA9IHdlYnBfb3B0aW9ucyB8fCBvcHRpb25zO1xcbiAgICBpZiAoIXdlYnApIHsgXFxuICAgICAgdmFyIHdlYnAgPSAkLkRlZmVycmVkKCk7XFxuICAgICAgdmFyIHdlYnBfY2FuYXJ5ID0gbmV3IEltYWdlKCk7XFxuICAgICAgd2VicF9jYW5hcnkub25lcnJvciA9IHdlYnAucmVqZWN0O1xcbiAgICAgIHdlYnBfY2FuYXJ5Lm9ubG9hZCA9IHdlYnAucmVzb2x2ZTtcXG4gICAgICB3ZWJwX2NhbmFyeS5zcmMgPSAnZGF0YTppbWFnZS93ZWJwO2Jhc2U2NCxVa2xHUmpJQUFBQlhSVUpRVmxBNElDWUFBQUN5QWdDZEFTb0JBQUVBTG1rMG1rMGlJaUlpSWdCb1N5Z0FCYzZ6YkFBQS92NTZRQUFBQUE9PSc7XFxuICAgIH1cXG4gICAgJChmdW5jdGlvbigpIHtcXG4gICAgICB3ZWJwLmRvbmUoZnVuY3Rpb24oKSB7XFxuICAgICAgICAkKHRoYXQpLmNsb3VkaW5hcnkoJC5leHRlbmQoe30sICQuZXh0ZW5kKHdlYnBfb3B0aW9ucywge2Zvcm1hdDogJ3dlYnAnfSkpKTtcXG4gICAgICB9KS5mYWlsKGZ1bmN0aW9uKCkge1xcbiAgICAgICAgJCh0aGF0KS5jbG91ZGluYXJ5KG9wdGlvbnMpO1xcbiAgICAgIH0pO1xcbiAgICB9KTtcXG4gIH1cXG4gICQuZm4uZmV0Y2hpZnkgPSBmdW5jdGlvbihvcHRpb25zKSB7XFxuICAgIHJldHVybiB0aGlzLmNsb3VkaW5hcnkoJC5leHRlbmQob3B0aW9ucywgeyd0eXBlJzogJ2ZldGNoJ30pKTtcXG4gIH07XFxufSkoIGpRdWVyeSApO1xcblxcbihmdW5jdGlvbiggJCApIHtcXG4gIGlmICghJC5mbi5maWxldXBsb2FkKSB7XFxuICAgIHJldHVybjtcXG4gIH1cXG4gICQuZm4uY2xvdWRpbmFyeV9maWxldXBsb2FkID0gZnVuY3Rpb24ob3B0aW9ucykge1xcbiAgICB2YXIgaW5pdGlhbGl6aW5nID0gIXRoaXMuZGF0YSgnYmx1ZWltcEZpbGV1cGxvYWQnKTtcXG4gICAgb3B0aW9ucyA9ICQuZXh0ZW5kKHtcXG4gICAgICBtYXhGaWxlU2l6ZTogMjAwMDAwMDAsXFxuICAgICAgZGF0YVR5cGU6ICdqc29uJyxcXG4gICAgICBoZWFkZXJzOiB7XFxcIlgtUmVxdWVzdGVkLVdpdGhcXFwiOiBcXFwiWE1MSHR0cFJlcXVlc3RcXFwifVxcbiAgICB9LCBvcHRpb25zKTtcXG4gICAgdGhpcy5maWxldXBsb2FkKG9wdGlvbnMpO1xcbiAgICBcXG4gICAgaWYgKGluaXRpYWxpemluZykge1xcbiAgICAgIHRoaXMuYmluZChcXFwiZmlsZXVwbG9hZGRvbmVcXFwiLCBmdW5jdGlvbihlLCBkYXRhKSB7XFxuICAgICAgICBpZiAoZGF0YS5yZXN1bHQuZXJyb3IpIHJldHVybjsgICAgICBcXG4gICAgICAgIGRhdGEucmVzdWx0LnBhdGggPSBbXFxcInZcXFwiLCBkYXRhLnJlc3VsdC52ZXJzaW9uLCBcXFwiL1xcXCIsIGRhdGEucmVzdWx0LnB1YmxpY19pZCwgXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEucmVzdWx0LmZvcm1hdCA/IFxcXCIuXFxcIiArIGRhdGEucmVzdWx0LmZvcm1hdCA6IFxcXCJcXFwiXS5qb2luKFxcXCJcXFwiKTtcXG4gICAgXFxuICAgICAgICBpZiAoZGF0YS5jbG91ZGluYXJ5RmllbGQgJiYgZGF0YS5mb3JtLmxlbmd0aCA+IDApIHtcXG4gICAgICAgICAgdmFyIHVwbG9hZF9pbmZvID0gW2RhdGEucmVzdWx0LnJlc291cmNlX3R5cGUsIGRhdGEucmVzdWx0LnR5cGUsIGRhdGEucmVzdWx0LnBhdGhdLmpvaW4oXFxcIi9cXFwiKSArIFxcXCIjXFxcIiArIGRhdGEucmVzdWx0LnNpZ25hdHVyZTsgIFxcbiAgICAgICAgICB2YXIgZmllbGQgPSAkKGRhdGEuZm9ybSkuZmluZCgnaW5wdXRbbmFtZT1cXFwiJyArIGRhdGEuY2xvdWRpbmFyeUZpZWxkICsgJ1xcXCJdJyk7XFxuICAgICAgICAgIGlmIChmaWVsZC5sZW5ndGggPiAwKSB7XFxuICAgICAgICAgICAgZmllbGQudmFsKHVwbG9hZF9pbmZvKTtcXG4gICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAkKCc8aW5wdXQ+PC9pbnB1dD4nKS5hdHRyKHt0eXBlOiBcXFwiaGlkZGVuXFxcIiwgbmFtZTogZGF0YS5jbG91ZGluYXJ5RmllbGR9KS52YWwodXBsb2FkX2luZm8pLmFwcGVuZFRvKGRhdGEuZm9ybSk7XFxuICAgICAgICAgIH1cXG4gICAgICAgIH1cXG4gICAgICAgICQoZS50YXJnZXQpLnRyaWdnZXIoJ2Nsb3VkaW5hcnlkb25lJywgZGF0YSk7XFxuICAgICAgfSk7XFxuICAgICAgXFxuICAgICAgdGhpcy5iaW5kKFxcXCJmaWxldXBsb2Fkc3RhcnRcXFwiLCBmdW5jdGlvbihlKXtcXG4gICAgICAgICQoZS50YXJnZXQpLnRyaWdnZXIoJ2Nsb3VkaW5hcnlzdGFydCcpO1xcbiAgICAgIH0pO1xcbiAgICAgIHRoaXMuYmluZChcXFwiZmlsZXVwbG9hZHN0b3BcXFwiLCBmdW5jdGlvbihlKXtcXG4gICAgICAgICQoZS50YXJnZXQpLnRyaWdnZXIoJ2Nsb3VkaW5hcnlzdG9wJyk7XFxuICAgICAgfSk7XFxuICAgICAgdGhpcy5iaW5kKFxcXCJmaWxldXBsb2FkcHJvZ3Jlc3NcXFwiLCBmdW5jdGlvbihlLGRhdGEpe1xcbiAgICAgICAgJChlLnRhcmdldCkudHJpZ2dlcignY2xvdWRpbmFyeXByb2dyZXNzJyxkYXRhKTtcXG4gICAgICB9KTtcXG4gICAgICB0aGlzLmJpbmQoXFxcImZpbGV1cGxvYWRwcm9ncmVzc2FsbFxcXCIsIGZ1bmN0aW9uKGUsZGF0YSl7XFxuICAgICAgICAkKGUudGFyZ2V0KS50cmlnZ2VyKCdjbG91ZGluYXJ5cHJvZ3Jlc3NhbGwnLGRhdGEpO1xcbiAgICAgIH0pO1xcbiAgICAgIHRoaXMuYmluZChcXFwiZmlsZXVwbG9hZGZhaWxcXFwiLCBmdW5jdGlvbihlLGRhdGEpe1xcbiAgICAgICAgJChlLnRhcmdldCkudHJpZ2dlcignY2xvdWRpbmFyeWZhaWwnLGRhdGEpO1xcbiAgICAgIH0pO1xcbiAgICAgIHRoaXMuYmluZChcXFwiZmlsZXVwbG9hZGFsd2F5c1xcXCIsIGZ1bmN0aW9uKGUsZGF0YSl7XFxuICAgICAgICAkKGUudGFyZ2V0KS50cmlnZ2VyKCdjbG91ZGluYXJ5YWx3YXlzJyxkYXRhKTtcXG4gICAgICB9KTtcXG5cXG4gICAgICBpZiAoIXRoaXMuZmlsZXVwbG9hZCgnb3B0aW9uJykudXJsKSB7XFxuICAgICAgICB2YXIgdXBsb2FkX3VybCA9IFxcXCJodHRwczovL2FwaS5jbG91ZGluYXJ5LmNvbS92MV8xL1xcXCIgKyAkLmNsb3VkaW5hcnkuY29uZmlnKCkuY2xvdWRfbmFtZSArIFxcXCIvdXBsb2FkXFxcIjtcXG4gICAgICAgIHRoaXMuZmlsZXVwbG9hZCgnb3B0aW9uJywgJ3VybCcsIHVwbG9hZF91cmwpO1xcbiAgICAgIH1cXG4gICAgfVxcbiAgICByZXR1cm4gdGhpcztcXG4gIH07XFxuICBcXG4gICQuZm4uY2xvdWRpbmFyeV91cGxvYWRfdXJsID0gZnVuY3Rpb24ocmVtb3RlX3VybCkge1xcbiAgICB0aGlzLmZpbGV1cGxvYWQoJ29wdGlvbicsICdmb3JtRGF0YScpLmZpbGUgPSByZW1vdGVfdXJsOyBcXG4gICAgdGhpcy5maWxldXBsb2FkKCdhZGQnLCB7IGZpbGVzOiBbIHJlbW90ZV91cmwgXSB9KTsgXFxuICAgIGRlbGV0ZSh0aGlzLmZpbGV1cGxvYWQoJ29wdGlvbicsICdmb3JtRGF0YScpLmZpbGUpOyAgICBcXG4gIH1cXG4gIFxcbiAgJChmdW5jdGlvbigpIHtcXG4gICAgJChcXFwiaW5wdXQuY2xvdWRpbmFyeS1maWxldXBsb2FkW3R5cGU9ZmlsZV1cXFwiKS5jbG91ZGluYXJ5X2ZpbGV1cGxvYWQoKTtcXG4gIH0pO1xcbn0pKCBqUXVlcnkgKTtcXG5cIlxuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L3Jhdy1sb2FkZXIhLi9ib3dlcl9jb21wb25lbnRzL2Nsb3VkaW5hcnlfanMvanMvanF1ZXJ5LmNsb3VkaW5hcnkuanNcbiAqKiBtb2R1bGUgaWQgPSAzMVxuICoqIG1vZHVsZSBjaHVua3MgPSAyNFxuICoqLyJdLCJtYXBwaW5ncyI6IkFBQUEiLCJzb3VyY2VSb290IjoiIn0=");

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

	eval("// Taken from https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/bind\nif (!Function.prototype.bind) {\n  Function.prototype.bind = function (oThis) {\n    if (typeof this !== \"function\") {\n      // closest thing possible to the ECMAScript 5\n      // internal IsCallable function\n      throw new TypeError(\"Function.prototype.bind - what is trying to be bound is not callable\");\n    }\n\n    var aArgs = Array.prototype.slice.call(arguments, 1), \n        fToBind = this, \n        fNOP = function () {},\n        fBound = function () {\n          return fToBind.apply(this instanceof fNOP && oThis\n                 ? this\n                 : oThis,\n                 aArgs.concat(Array.prototype.slice.call(arguments)));\n        };\n\n    fNOP.prototype = this.prototype;\n    fBound.prototype = new fNOP();\n\n    return fBound;\n  };\n}\n\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzIuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9+L3BvbHlmaWxsLWZ1bmN0aW9uLXByb3RvdHlwZS1iaW5kL2JpbmQuanM/OTE4YyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBUYWtlbiBmcm9tIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL0Z1bmN0aW9uL2JpbmRcbmlmICghRnVuY3Rpb24ucHJvdG90eXBlLmJpbmQpIHtcbiAgRnVuY3Rpb24ucHJvdG90eXBlLmJpbmQgPSBmdW5jdGlvbiAob1RoaXMpIHtcbiAgICBpZiAodHlwZW9mIHRoaXMgIT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgLy8gY2xvc2VzdCB0aGluZyBwb3NzaWJsZSB0byB0aGUgRUNNQVNjcmlwdCA1XG4gICAgICAvLyBpbnRlcm5hbCBJc0NhbGxhYmxlIGZ1bmN0aW9uXG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiRnVuY3Rpb24ucHJvdG90eXBlLmJpbmQgLSB3aGF0IGlzIHRyeWluZyB0byBiZSBib3VuZCBpcyBub3QgY2FsbGFibGVcIik7XG4gICAgfVxuXG4gICAgdmFyIGFBcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKSwgXG4gICAgICAgIGZUb0JpbmQgPSB0aGlzLCBcbiAgICAgICAgZk5PUCA9IGZ1bmN0aW9uICgpIHt9LFxuICAgICAgICBmQm91bmQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgcmV0dXJuIGZUb0JpbmQuYXBwbHkodGhpcyBpbnN0YW5jZW9mIGZOT1AgJiYgb1RoaXNcbiAgICAgICAgICAgICAgICAgPyB0aGlzXG4gICAgICAgICAgICAgICAgIDogb1RoaXMsXG4gICAgICAgICAgICAgICAgIGFBcmdzLmNvbmNhdChBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpKSk7XG4gICAgICAgIH07XG5cbiAgICBmTk9QLnByb3RvdHlwZSA9IHRoaXMucHJvdG90eXBlO1xuICAgIGZCb3VuZC5wcm90b3R5cGUgPSBuZXcgZk5PUCgpO1xuXG4gICAgcmV0dXJuIGZCb3VuZDtcbiAgfTtcbn1cblxuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L3BvbHlmaWxsLWZ1bmN0aW9uLXByb3RvdHlwZS1iaW5kL2JpbmQuanNcbiAqKiBtb2R1bGUgaWQgPSAzMlxuICoqIG1vZHVsZSBjaHVua3MgPSAxMSAxMyAyNFxuICoqLyJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9");

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

	eval("/*\n AngularJS v1.4.8\n (c) 2010-2015 Google, Inc. http://angularjs.org\n License: MIT\n*/\n(function(S,X,u){'use strict';function G(a){return function(){var b=arguments[0],d;d=\"[\"+(a?a+\":\":\"\")+b+\"] http://errors.angularjs.org/1.4.8/\"+(a?a+\"/\":\"\")+b;for(b=1;b<arguments.length;b++){d=d+(1==b?\"?\":\"&\")+\"p\"+(b-1)+\"=\";var c=encodeURIComponent,e;e=arguments[b];e=\"function\"==typeof e?e.toString().replace(/ \\{[\\s\\S]*$/,\"\"):\"undefined\"==typeof e?\"undefined\":\"string\"!=typeof e?JSON.stringify(e):e;d+=c(e)}return Error(d)}}function za(a){if(null==a||Xa(a))return!1;if(I(a)||E(a)||B&&a instanceof B)return!0;\nvar b=\"length\"in Object(a)&&a.length;return Q(b)&&(0<=b&&b-1 in a||\"function\"==typeof a.item)}function n(a,b,d){var c,e;if(a)if(z(a))for(c in a)\"prototype\"==c||\"length\"==c||\"name\"==c||a.hasOwnProperty&&!a.hasOwnProperty(c)||b.call(d,a[c],c,a);else if(I(a)||za(a)){var f=\"object\"!==typeof a;c=0;for(e=a.length;c<e;c++)(f||c in a)&&b.call(d,a[c],c,a)}else if(a.forEach&&a.forEach!==n)a.forEach(b,d,a);else if(nc(a))for(c in a)b.call(d,a[c],c,a);else if(\"function\"===typeof a.hasOwnProperty)for(c in a)a.hasOwnProperty(c)&&\nb.call(d,a[c],c,a);else for(c in a)qa.call(a,c)&&b.call(d,a[c],c,a);return a}function oc(a,b,d){for(var c=Object.keys(a).sort(),e=0;e<c.length;e++)b.call(d,a[c[e]],c[e]);return c}function pc(a){return function(b,d){a(d,b)}}function Td(){return++nb}function Mb(a,b,d){for(var c=a.$$hashKey,e=0,f=b.length;e<f;++e){var g=b[e];if(H(g)||z(g))for(var h=Object.keys(g),k=0,l=h.length;k<l;k++){var m=h[k],r=g[m];d&&H(r)?da(r)?a[m]=new Date(r.valueOf()):Ma(r)?a[m]=new RegExp(r):r.nodeName?a[m]=r.cloneNode(!0):\nNb(r)?a[m]=r.clone():(H(a[m])||(a[m]=I(r)?[]:{}),Mb(a[m],[r],!0)):a[m]=r}}c?a.$$hashKey=c:delete a.$$hashKey;return a}function M(a){return Mb(a,ra.call(arguments,1),!1)}function Ud(a){return Mb(a,ra.call(arguments,1),!0)}function ea(a){return parseInt(a,10)}function Ob(a,b){return M(Object.create(a),b)}function x(){}function Ya(a){return a}function na(a){return function(){return a}}function qc(a){return z(a.toString)&&a.toString!==sa}function q(a){return\"undefined\"===typeof a}function y(a){return\"undefined\"!==\ntypeof a}function H(a){return null!==a&&\"object\"===typeof a}function nc(a){return null!==a&&\"object\"===typeof a&&!rc(a)}function E(a){return\"string\"===typeof a}function Q(a){return\"number\"===typeof a}function da(a){return\"[object Date]\"===sa.call(a)}function z(a){return\"function\"===typeof a}function Ma(a){return\"[object RegExp]\"===sa.call(a)}function Xa(a){return a&&a.window===a}function Za(a){return a&&a.$evalAsync&&a.$watch}function $a(a){return\"boolean\"===typeof a}function sc(a){return a&&Q(a.length)&&\nVd.test(sa.call(a))}function Nb(a){return!(!a||!(a.nodeName||a.prop&&a.attr&&a.find))}function Wd(a){var b={};a=a.split(\",\");var d;for(d=0;d<a.length;d++)b[a[d]]=!0;return b}function ta(a){return F(a.nodeName||a[0]&&a[0].nodeName)}function ab(a,b){var d=a.indexOf(b);0<=d&&a.splice(d,1);return d}function bb(a,b){function d(a,b){var d=b.$$hashKey,e;if(I(a)){e=0;for(var f=a.length;e<f;e++)b.push(c(a[e]))}else if(nc(a))for(e in a)b[e]=c(a[e]);else if(a&&\"function\"===typeof a.hasOwnProperty)for(e in a)a.hasOwnProperty(e)&&\n(b[e]=c(a[e]));else for(e in a)qa.call(a,e)&&(b[e]=c(a[e]));d?b.$$hashKey=d:delete b.$$hashKey;return b}function c(a){if(!H(a))return a;var b=e.indexOf(a);if(-1!==b)return f[b];if(Xa(a)||Za(a))throw Aa(\"cpws\");var b=!1,c;I(a)?(c=[],b=!0):sc(a)?c=new a.constructor(a):da(a)?c=new Date(a.getTime()):Ma(a)?(c=new RegExp(a.source,a.toString().match(/[^\\/]*$/)[0]),c.lastIndex=a.lastIndex):z(a.cloneNode)?c=a.cloneNode(!0):(c=Object.create(rc(a)),b=!0);e.push(a);f.push(c);return b?d(a,c):c}var e=[],f=[];if(b){if(sc(b))throw Aa(\"cpta\");\nif(a===b)throw Aa(\"cpi\");I(b)?b.length=0:n(b,function(a,c){\"$$hashKey\"!==c&&delete b[c]});e.push(a);f.push(b);return d(a,b)}return c(a)}function ia(a,b){if(I(a)){b=b||[];for(var d=0,c=a.length;d<c;d++)b[d]=a[d]}else if(H(a))for(d in b=b||{},a)if(\"$\"!==d.charAt(0)||\"$\"!==d.charAt(1))b[d]=a[d];return b||a}function ma(a,b){if(a===b)return!0;if(null===a||null===b)return!1;if(a!==a&&b!==b)return!0;var d=typeof a,c;if(d==typeof b&&\"object\"==d)if(I(a)){if(!I(b))return!1;if((d=a.length)==b.length){for(c=\n0;c<d;c++)if(!ma(a[c],b[c]))return!1;return!0}}else{if(da(a))return da(b)?ma(a.getTime(),b.getTime()):!1;if(Ma(a))return Ma(b)?a.toString()==b.toString():!1;if(Za(a)||Za(b)||Xa(a)||Xa(b)||I(b)||da(b)||Ma(b))return!1;d=$();for(c in a)if(\"$\"!==c.charAt(0)&&!z(a[c])){if(!ma(a[c],b[c]))return!1;d[c]=!0}for(c in b)if(!(c in d)&&\"$\"!==c.charAt(0)&&y(b[c])&&!z(b[c]))return!1;return!0}return!1}function cb(a,b,d){return a.concat(ra.call(b,d))}function tc(a,b){var d=2<arguments.length?ra.call(arguments,2):\n[];return!z(b)||b instanceof RegExp?b:d.length?function(){return arguments.length?b.apply(a,cb(d,arguments,0)):b.apply(a,d)}:function(){return arguments.length?b.apply(a,arguments):b.call(a)}}function Xd(a,b){var d=b;\"string\"===typeof a&&\"$\"===a.charAt(0)&&\"$\"===a.charAt(1)?d=u:Xa(b)?d=\"$WINDOW\":b&&X===b?d=\"$DOCUMENT\":Za(b)&&(d=\"$SCOPE\");return d}function db(a,b){if(\"undefined\"===typeof a)return u;Q(b)||(b=b?2:null);return JSON.stringify(a,Xd,b)}function uc(a){return E(a)?JSON.parse(a):a}function vc(a,\nb){var d=Date.parse(\"Jan 01, 1970 00:00:00 \"+a)/6E4;return isNaN(d)?b:d}function Pb(a,b,d){d=d?-1:1;var c=vc(b,a.getTimezoneOffset());b=a;a=d*(c-a.getTimezoneOffset());b=new Date(b.getTime());b.setMinutes(b.getMinutes()+a);return b}function ua(a){a=B(a).clone();try{a.empty()}catch(b){}var d=B(\"<div>\").append(a).html();try{return a[0].nodeType===Na?F(d):d.match(/^(<[^>]+>)/)[1].replace(/^<([\\w\\-]+)/,function(a,b){return\"<\"+F(b)})}catch(c){return F(d)}}function wc(a){try{return decodeURIComponent(a)}catch(b){}}\nfunction xc(a){var b={};n((a||\"\").split(\"&\"),function(a){var c,e,f;a&&(e=a=a.replace(/\\+/g,\"%20\"),c=a.indexOf(\"=\"),-1!==c&&(e=a.substring(0,c),f=a.substring(c+1)),e=wc(e),y(e)&&(f=y(f)?wc(f):!0,qa.call(b,e)?I(b[e])?b[e].push(f):b[e]=[b[e],f]:b[e]=f))});return b}function Qb(a){var b=[];n(a,function(a,c){I(a)?n(a,function(a){b.push(ja(c,!0)+(!0===a?\"\":\"=\"+ja(a,!0)))}):b.push(ja(c,!0)+(!0===a?\"\":\"=\"+ja(a,!0)))});return b.length?b.join(\"&\"):\"\"}function ob(a){return ja(a,!0).replace(/%26/gi,\"&\").replace(/%3D/gi,\n\"=\").replace(/%2B/gi,\"+\")}function ja(a,b){return encodeURIComponent(a).replace(/%40/gi,\"@\").replace(/%3A/gi,\":\").replace(/%24/g,\"$\").replace(/%2C/gi,\",\").replace(/%3B/gi,\";\").replace(/%20/g,b?\"%20\":\"+\")}function Yd(a,b){var d,c,e=Oa.length;for(c=0;c<e;++c)if(d=Oa[c]+b,E(d=a.getAttribute(d)))return d;return null}function Zd(a,b){var d,c,e={};n(Oa,function(b){b+=\"app\";!d&&a.hasAttribute&&a.hasAttribute(b)&&(d=a,c=a.getAttribute(b))});n(Oa,function(b){b+=\"app\";var e;!d&&(e=a.querySelector(\"[\"+b.replace(\":\",\n\"\\\\:\")+\"]\"))&&(d=e,c=e.getAttribute(b))});d&&(e.strictDi=null!==Yd(d,\"strict-di\"),b(d,c?[c]:[],e))}function yc(a,b,d){H(d)||(d={});d=M({strictDi:!1},d);var c=function(){a=B(a);if(a.injector()){var c=a[0]===X?\"document\":ua(a);throw Aa(\"btstrpd\",c.replace(/</,\"&lt;\").replace(/>/,\"&gt;\"));}b=b||[];b.unshift([\"$provide\",function(b){b.value(\"$rootElement\",a)}]);d.debugInfoEnabled&&b.push([\"$compileProvider\",function(a){a.debugInfoEnabled(!0)}]);b.unshift(\"ng\");c=eb(b,d.strictDi);c.invoke([\"$rootScope\",\n\"$rootElement\",\"$compile\",\"$injector\",function(a,b,c,d){a.$apply(function(){b.data(\"$injector\",d);c(b)(a)})}]);return c},e=/^NG_ENABLE_DEBUG_INFO!/,f=/^NG_DEFER_BOOTSTRAP!/;S&&e.test(S.name)&&(d.debugInfoEnabled=!0,S.name=S.name.replace(e,\"\"));if(S&&!f.test(S.name))return c();S.name=S.name.replace(f,\"\");fa.resumeBootstrap=function(a){n(a,function(a){b.push(a)});return c()};z(fa.resumeDeferredBootstrap)&&fa.resumeDeferredBootstrap()}function $d(){S.name=\"NG_ENABLE_DEBUG_INFO!\"+S.name;S.location.reload()}\nfunction ae(a){a=fa.element(a).injector();if(!a)throw Aa(\"test\");return a.get(\"$$testability\")}function zc(a,b){b=b||\"_\";return a.replace(be,function(a,c){return(c?b:\"\")+a.toLowerCase()})}function ce(){var a;if(!Ac){var b=pb();(oa=q(b)?S.jQuery:b?S[b]:u)&&oa.fn.on?(B=oa,M(oa.fn,{scope:Pa.scope,isolateScope:Pa.isolateScope,controller:Pa.controller,injector:Pa.injector,inheritedData:Pa.inheritedData}),a=oa.cleanData,oa.cleanData=function(b){var c;if(Rb)Rb=!1;else for(var e=0,f;null!=(f=b[e]);e++)(c=\noa._data(f,\"events\"))&&c.$destroy&&oa(f).triggerHandler(\"$destroy\");a(b)}):B=N;fa.element=B;Ac=!0}}function qb(a,b,d){if(!a)throw Aa(\"areq\",b||\"?\",d||\"required\");return a}function Qa(a,b,d){d&&I(a)&&(a=a[a.length-1]);qb(z(a),b,\"not a function, got \"+(a&&\"object\"===typeof a?a.constructor.name||\"Object\":typeof a));return a}function Ra(a,b){if(\"hasOwnProperty\"===a)throw Aa(\"badname\",b);}function Bc(a,b,d){if(!b)return a;b=b.split(\".\");for(var c,e=a,f=b.length,g=0;g<f;g++)c=b[g],a&&(a=(e=a)[c]);return!d&&\nz(a)?tc(e,a):a}function rb(a){for(var b=a[0],d=a[a.length-1],c,e=1;b!==d&&(b=b.nextSibling);e++)if(c||a[e]!==b)c||(c=B(ra.call(a,0,e))),c.push(b);return c||a}function $(){return Object.create(null)}function de(a){function b(a,b,c){return a[b]||(a[b]=c())}var d=G(\"$injector\"),c=G(\"ng\");a=b(a,\"angular\",Object);a.$$minErr=a.$$minErr||G;return b(a,\"module\",function(){var a={};return function(f,g,h){if(\"hasOwnProperty\"===f)throw c(\"badname\",\"module\");g&&a.hasOwnProperty(f)&&(a[f]=null);return b(a,f,function(){function a(b,\nd,e,f){f||(f=c);return function(){f[e||\"push\"]([b,d,arguments]);return v}}function b(a,d){return function(b,e){e&&z(e)&&(e.$$moduleName=f);c.push([a,d,arguments]);return v}}if(!g)throw d(\"nomod\",f);var c=[],e=[],t=[],A=a(\"$injector\",\"invoke\",\"push\",e),v={_invokeQueue:c,_configBlocks:e,_runBlocks:t,requires:g,name:f,provider:b(\"$provide\",\"provider\"),factory:b(\"$provide\",\"factory\"),service:b(\"$provide\",\"service\"),value:a(\"$provide\",\"value\"),constant:a(\"$provide\",\"constant\",\"unshift\"),decorator:b(\"$provide\",\n\"decorator\"),animation:b(\"$animateProvider\",\"register\"),filter:b(\"$filterProvider\",\"register\"),controller:b(\"$controllerProvider\",\"register\"),directive:b(\"$compileProvider\",\"directive\"),config:A,run:function(a){t.push(a);return this}};h&&A(h);return v})}})}function ee(a){M(a,{bootstrap:yc,copy:bb,extend:M,merge:Ud,equals:ma,element:B,forEach:n,injector:eb,noop:x,bind:tc,toJson:db,fromJson:uc,identity:Ya,isUndefined:q,isDefined:y,isString:E,isFunction:z,isObject:H,isNumber:Q,isElement:Nb,isArray:I,\nversion:fe,isDate:da,lowercase:F,uppercase:sb,callbacks:{counter:0},getTestability:ae,$$minErr:G,$$csp:Ba,reloadWithDebugInfo:$d});Sb=de(S);Sb(\"ng\",[\"ngLocale\"],[\"$provide\",function(a){a.provider({$$sanitizeUri:ge});a.provider(\"$compile\",Cc).directive({a:he,input:Dc,textarea:Dc,form:ie,script:je,select:ke,style:le,option:me,ngBind:ne,ngBindHtml:oe,ngBindTemplate:pe,ngClass:qe,ngClassEven:re,ngClassOdd:se,ngCloak:te,ngController:ue,ngForm:ve,ngHide:we,ngIf:xe,ngInclude:ye,ngInit:ze,ngNonBindable:Ae,\nngPluralize:Be,ngRepeat:Ce,ngShow:De,ngStyle:Ee,ngSwitch:Fe,ngSwitchWhen:Ge,ngSwitchDefault:He,ngOptions:Ie,ngTransclude:Je,ngModel:Ke,ngList:Le,ngChange:Me,pattern:Ec,ngPattern:Ec,required:Fc,ngRequired:Fc,minlength:Gc,ngMinlength:Gc,maxlength:Hc,ngMaxlength:Hc,ngValue:Ne,ngModelOptions:Oe}).directive({ngInclude:Pe}).directive(tb).directive(Ic);a.provider({$anchorScroll:Qe,$animate:Re,$animateCss:Se,$$animateQueue:Te,$$AnimateRunner:Ue,$browser:Ve,$cacheFactory:We,$controller:Xe,$document:Ye,$exceptionHandler:Ze,\n$filter:Jc,$$forceReflow:$e,$interpolate:af,$interval:bf,$http:cf,$httpParamSerializer:df,$httpParamSerializerJQLike:ef,$httpBackend:ff,$xhrFactory:gf,$location:hf,$log:jf,$parse:kf,$rootScope:lf,$q:mf,$$q:nf,$sce:of,$sceDelegate:pf,$sniffer:qf,$templateCache:rf,$templateRequest:sf,$$testability:tf,$timeout:uf,$window:vf,$$rAF:wf,$$jqLite:xf,$$HashMap:yf,$$cookieReader:zf})}])}function fb(a){return a.replace(Af,function(a,d,c,e){return e?c.toUpperCase():c}).replace(Bf,\"Moz$1\")}function Kc(a){a=a.nodeType;\nreturn 1===a||!a||9===a}function Lc(a,b){var d,c,e=b.createDocumentFragment(),f=[];if(Tb.test(a)){d=d||e.appendChild(b.createElement(\"div\"));c=(Cf.exec(a)||[\"\",\"\"])[1].toLowerCase();c=ka[c]||ka._default;d.innerHTML=c[1]+a.replace(Df,\"<$1></$2>\")+c[2];for(c=c[0];c--;)d=d.lastChild;f=cb(f,d.childNodes);d=e.firstChild;d.textContent=\"\"}else f.push(b.createTextNode(a));e.textContent=\"\";e.innerHTML=\"\";n(f,function(a){e.appendChild(a)});return e}function N(a){if(a instanceof N)return a;var b;E(a)&&(a=U(a),\nb=!0);if(!(this instanceof N)){if(b&&\"<\"!=a.charAt(0))throw Ub(\"nosel\");return new N(a)}if(b){b=X;var d;a=(d=Ef.exec(a))?[b.createElement(d[1])]:(d=Lc(a,b))?d.childNodes:[]}Mc(this,a)}function Vb(a){return a.cloneNode(!0)}function ub(a,b){b||vb(a);if(a.querySelectorAll)for(var d=a.querySelectorAll(\"*\"),c=0,e=d.length;c<e;c++)vb(d[c])}function Nc(a,b,d,c){if(y(c))throw Ub(\"offargs\");var e=(c=wb(a))&&c.events,f=c&&c.handle;if(f)if(b){var g=function(b){var c=e[b];y(d)&&ab(c||[],d);y(d)&&c&&0<c.length||\n(a.removeEventListener(b,f,!1),delete e[b])};n(b.split(\" \"),function(a){g(a);xb[a]&&g(xb[a])})}else for(b in e)\"$destroy\"!==b&&a.removeEventListener(b,f,!1),delete e[b]}function vb(a,b){var d=a.ng339,c=d&&gb[d];c&&(b?delete c.data[b]:(c.handle&&(c.events.$destroy&&c.handle({},\"$destroy\"),Nc(a)),delete gb[d],a.ng339=u))}function wb(a,b){var d=a.ng339,d=d&&gb[d];b&&!d&&(a.ng339=d=++Ff,d=gb[d]={events:{},data:{},handle:u});return d}function Wb(a,b,d){if(Kc(a)){var c=y(d),e=!c&&b&&!H(b),f=!b;a=(a=wb(a,\n!e))&&a.data;if(c)a[b]=d;else{if(f)return a;if(e)return a&&a[b];M(a,b)}}}function yb(a,b){return a.getAttribute?-1<(\" \"+(a.getAttribute(\"class\")||\"\")+\" \").replace(/[\\n\\t]/g,\" \").indexOf(\" \"+b+\" \"):!1}function zb(a,b){b&&a.setAttribute&&n(b.split(\" \"),function(b){a.setAttribute(\"class\",U((\" \"+(a.getAttribute(\"class\")||\"\")+\" \").replace(/[\\n\\t]/g,\" \").replace(\" \"+U(b)+\" \",\" \")))})}function Ab(a,b){if(b&&a.setAttribute){var d=(\" \"+(a.getAttribute(\"class\")||\"\")+\" \").replace(/[\\n\\t]/g,\" \");n(b.split(\" \"),\nfunction(a){a=U(a);-1===d.indexOf(\" \"+a+\" \")&&(d+=a+\" \")});a.setAttribute(\"class\",U(d))}}function Mc(a,b){if(b)if(b.nodeType)a[a.length++]=b;else{var d=b.length;if(\"number\"===typeof d&&b.window!==b){if(d)for(var c=0;c<d;c++)a[a.length++]=b[c]}else a[a.length++]=b}}function Oc(a,b){return Bb(a,\"$\"+(b||\"ngController\")+\"Controller\")}function Bb(a,b,d){9==a.nodeType&&(a=a.documentElement);for(b=I(b)?b:[b];a;){for(var c=0,e=b.length;c<e;c++)if(y(d=B.data(a,b[c])))return d;a=a.parentNode||11===a.nodeType&&\na.host}}function Pc(a){for(ub(a,!0);a.firstChild;)a.removeChild(a.firstChild)}function Xb(a,b){b||ub(a);var d=a.parentNode;d&&d.removeChild(a)}function Gf(a,b){b=b||S;if(\"complete\"===b.document.readyState)b.setTimeout(a);else B(b).on(\"load\",a)}function Qc(a,b){var d=Cb[b.toLowerCase()];return d&&Rc[ta(a)]&&d}function Hf(a,b){var d=function(c,d){c.isDefaultPrevented=function(){return c.defaultPrevented};var f=b[d||c.type],g=f?f.length:0;if(g){if(q(c.immediatePropagationStopped)){var h=c.stopImmediatePropagation;\nc.stopImmediatePropagation=function(){c.immediatePropagationStopped=!0;c.stopPropagation&&c.stopPropagation();h&&h.call(c)}}c.isImmediatePropagationStopped=function(){return!0===c.immediatePropagationStopped};var k=f.specialHandlerWrapper||If;1<g&&(f=ia(f));for(var l=0;l<g;l++)c.isImmediatePropagationStopped()||k(a,c,f[l])}};d.elem=a;return d}function If(a,b,d){d.call(a,b)}function Jf(a,b,d){var c=b.relatedTarget;c&&(c===a||Kf.call(a,c))||d.call(a,b)}function xf(){this.$get=function(){return M(N,\n{hasClass:function(a,b){a.attr&&(a=a[0]);return yb(a,b)},addClass:function(a,b){a.attr&&(a=a[0]);return Ab(a,b)},removeClass:function(a,b){a.attr&&(a=a[0]);return zb(a,b)}})}}function Ca(a,b){var d=a&&a.$$hashKey;if(d)return\"function\"===typeof d&&(d=a.$$hashKey()),d;d=typeof a;return d=\"function\"==d||\"object\"==d&&null!==a?a.$$hashKey=d+\":\"+(b||Td)():d+\":\"+a}function Sa(a,b){if(b){var d=0;this.nextUid=function(){return++d}}n(a,this.put,this)}function Lf(a){return(a=a.toString().replace(Sc,\"\").match(Tc))?\n\"function(\"+(a[1]||\"\").replace(/[\\s\\r\\n]+/,\" \")+\")\":\"fn\"}function eb(a,b){function d(a){return function(b,c){if(H(b))n(b,pc(a));else return a(b,c)}}function c(a,b){Ra(a,\"service\");if(z(b)||I(b))b=t.instantiate(b);if(!b.$get)throw Da(\"pget\",a);return r[a+\"Provider\"]=b}function e(a,b){return function(){var c=v.invoke(b,this);if(q(c))throw Da(\"undef\",a);return c}}function f(a,b,d){return c(a,{$get:!1!==d?e(a,b):b})}function g(a){qb(q(a)||I(a),\"modulesToLoad\",\"not an array\");var b=[],c;n(a,function(a){function d(a){var b,\nc;b=0;for(c=a.length;b<c;b++){var e=a[b],f=t.get(e[0]);f[e[1]].apply(f,e[2])}}if(!m.get(a)){m.put(a,!0);try{E(a)?(c=Sb(a),b=b.concat(g(c.requires)).concat(c._runBlocks),d(c._invokeQueue),d(c._configBlocks)):z(a)?b.push(t.invoke(a)):I(a)?b.push(t.invoke(a)):Qa(a,\"module\")}catch(e){throw I(a)&&(a=a[a.length-1]),e.message&&e.stack&&-1==e.stack.indexOf(e.message)&&(e=e.message+\"\\n\"+e.stack),Da(\"modulerr\",a,e.stack||e.message||e);}}});return b}function h(a,c){function d(b,e){if(a.hasOwnProperty(b)){if(a[b]===\nk)throw Da(\"cdep\",b+\" <- \"+l.join(\" <- \"));return a[b]}try{return l.unshift(b),a[b]=k,a[b]=c(b,e)}catch(f){throw a[b]===k&&delete a[b],f;}finally{l.shift()}}function e(a,c,f,g){\"string\"===typeof f&&(g=f,f=null);var h=[],k=eb.$$annotate(a,b,g),l,m,t;m=0;for(l=k.length;m<l;m++){t=k[m];if(\"string\"!==typeof t)throw Da(\"itkn\",t);h.push(f&&f.hasOwnProperty(t)?f[t]:d(t,g))}I(a)&&(a=a[l]);return a.apply(c,h)}return{invoke:e,instantiate:function(a,b,c){var d=Object.create((I(a)?a[a.length-1]:a).prototype||\nnull);a=e(a,d,b,c);return H(a)||z(a)?a:d},get:d,annotate:eb.$$annotate,has:function(b){return r.hasOwnProperty(b+\"Provider\")||a.hasOwnProperty(b)}}}b=!0===b;var k={},l=[],m=new Sa([],!0),r={$provide:{provider:d(c),factory:d(f),service:d(function(a,b){return f(a,[\"$injector\",function(a){return a.instantiate(b)}])}),value:d(function(a,b){return f(a,na(b),!1)}),constant:d(function(a,b){Ra(a,\"constant\");r[a]=b;A[a]=b}),decorator:function(a,b){var c=t.get(a+\"Provider\"),d=c.$get;c.$get=function(){var a=\nv.invoke(d,c);return v.invoke(b,null,{$delegate:a})}}}},t=r.$injector=h(r,function(a,b){fa.isString(b)&&l.push(b);throw Da(\"unpr\",l.join(\" <- \"));}),A={},v=A.$injector=h(A,function(a,b){var c=t.get(a+\"Provider\",b);return v.invoke(c.$get,c,u,a)});n(g(a),function(a){a&&v.invoke(a)});return v}function Qe(){var a=!0;this.disableAutoScrolling=function(){a=!1};this.$get=[\"$window\",\"$location\",\"$rootScope\",function(b,d,c){function e(a){var b=null;Array.prototype.some.call(a,function(a){if(\"a\"===ta(a))return b=\na,!0});return b}function f(a){if(a){a.scrollIntoView();var c;c=g.yOffset;z(c)?c=c():Nb(c)?(c=c[0],c=\"fixed\"!==b.getComputedStyle(c).position?0:c.getBoundingClientRect().bottom):Q(c)||(c=0);c&&(a=a.getBoundingClientRect().top,b.scrollBy(0,a-c))}else b.scrollTo(0,0)}function g(a){a=E(a)?a:d.hash();var b;a?(b=h.getElementById(a))?f(b):(b=e(h.getElementsByName(a)))?f(b):\"top\"===a&&f(null):f(null)}var h=b.document;a&&c.$watch(function(){return d.hash()},function(a,b){a===b&&\"\"===a||Gf(function(){c.$evalAsync(g)})});\nreturn g}]}function hb(a,b){if(!a&&!b)return\"\";if(!a)return b;if(!b)return a;I(a)&&(a=a.join(\" \"));I(b)&&(b=b.join(\" \"));return a+\" \"+b}function Mf(a){E(a)&&(a=a.split(\" \"));var b=$();n(a,function(a){a.length&&(b[a]=!0)});return b}function Ea(a){return H(a)?a:{}}function Nf(a,b,d,c){function e(a){try{a.apply(null,ra.call(arguments,1))}finally{if(v--,0===v)for(;T.length;)try{T.pop()()}catch(b){d.error(b)}}}function f(){L=null;g();h()}function g(){a:{try{p=m.state;break a}catch(a){}p=void 0}p=q(p)?\nnull:p;ma(p,J)&&(p=J);J=p}function h(){if(w!==k.url()||C!==p)w=k.url(),C=p,n(aa,function(a){a(k.url(),p)})}var k=this,l=a.location,m=a.history,r=a.setTimeout,t=a.clearTimeout,A={};k.isMock=!1;var v=0,T=[];k.$$completeOutstandingRequest=e;k.$$incOutstandingRequestCount=function(){v++};k.notifyWhenNoOutstandingRequests=function(a){0===v?a():T.push(a)};var p,C,w=l.href,ga=b.find(\"base\"),L=null;g();C=p;k.url=function(b,d,e){q(e)&&(e=null);l!==a.location&&(l=a.location);m!==a.history&&(m=a.history);if(b){var f=\nC===e;if(w===b&&(!c.history||f))return k;var h=w&&Fa(w)===Fa(b);w=b;C=e;if(!c.history||h&&f){if(!h||L)L=b;d?l.replace(b):h?(d=l,e=b.indexOf(\"#\"),e=-1===e?\"\":b.substr(e),d.hash=e):l.href=b;l.href!==b&&(L=b)}else m[d?\"replaceState\":\"pushState\"](e,\"\",b),g(),C=p;return k}return L||l.href.replace(/%27/g,\"'\")};k.state=function(){return p};var aa=[],D=!1,J=null;k.onUrlChange=function(b){if(!D){if(c.history)B(a).on(\"popstate\",f);B(a).on(\"hashchange\",f);D=!0}aa.push(b);return b};k.$$applicationDestroyed=function(){B(a).off(\"hashchange popstate\",\nf)};k.$$checkUrlChange=h;k.baseHref=function(){var a=ga.attr(\"href\");return a?a.replace(/^(https?\\:)?\\/\\/[^\\/]*/,\"\"):\"\"};k.defer=function(a,b){var c;v++;c=r(function(){delete A[c];e(a)},b||0);A[c]=!0;return c};k.defer.cancel=function(a){return A[a]?(delete A[a],t(a),e(x),!0):!1}}function Ve(){this.$get=[\"$window\",\"$log\",\"$sniffer\",\"$document\",function(a,b,d,c){return new Nf(a,c,b,d)}]}function We(){this.$get=function(){function a(a,c){function e(a){a!=r&&(t?t==a&&(t=a.n):t=a,f(a.n,a.p),f(a,r),r=a,\nr.n=null)}function f(a,b){a!=b&&(a&&(a.p=b),b&&(b.n=a))}if(a in b)throw G(\"$cacheFactory\")(\"iid\",a);var g=0,h=M({},c,{id:a}),k=$(),l=c&&c.capacity||Number.MAX_VALUE,m=$(),r=null,t=null;return b[a]={put:function(a,b){if(!q(b)){if(l<Number.MAX_VALUE){var c=m[a]||(m[a]={key:a});e(c)}a in k||g++;k[a]=b;g>l&&this.remove(t.key);return b}},get:function(a){if(l<Number.MAX_VALUE){var b=m[a];if(!b)return;e(b)}return k[a]},remove:function(a){if(l<Number.MAX_VALUE){var b=m[a];if(!b)return;b==r&&(r=b.p);b==t&&\n(t=b.n);f(b.n,b.p);delete m[a]}a in k&&(delete k[a],g--)},removeAll:function(){k=$();g=0;m=$();r=t=null},destroy:function(){m=h=k=null;delete b[a]},info:function(){return M({},h,{size:g})}}}var b={};a.info=function(){var a={};n(b,function(b,e){a[e]=b.info()});return a};a.get=function(a){return b[a]};return a}}function rf(){this.$get=[\"$cacheFactory\",function(a){return a(\"templates\")}]}function Cc(a,b){function d(a,b,c){var d=/^\\s*([@&]|=(\\*?))(\\??)\\s*(\\w*)\\s*$/,e={};n(a,function(a,f){var g=a.match(d);\nif(!g)throw ha(\"iscp\",b,f,a,c?\"controller bindings definition\":\"isolate scope definition\");e[f]={mode:g[1][0],collection:\"*\"===g[2],optional:\"?\"===g[3],attrName:g[4]||f}});return e}function c(a){var b=a.charAt(0);if(!b||b!==F(b))throw ha(\"baddir\",a);if(a!==a.trim())throw ha(\"baddir\",a);}var e={},f=/^\\s*directive\\:\\s*([\\w\\-]+)\\s+(.*)$/,g=/(([\\w\\-]+)(?:\\:([^;]+))?;?)/,h=Wd(\"ngSrc,ngSrcset,src,srcset\"),k=/^(?:(\\^\\^?)?(\\?)?(\\^\\^?)?)?/,l=/^(on[a-z]+|formaction)$/;this.directive=function t(b,f){Ra(b,\"directive\");\nE(b)?(c(b),qb(f,\"directiveFactory\"),e.hasOwnProperty(b)||(e[b]=[],a.factory(b+\"Directive\",[\"$injector\",\"$exceptionHandler\",function(a,c){var f=[];n(e[b],function(e,g){try{var h=a.invoke(e);z(h)?h={compile:na(h)}:!h.compile&&h.link&&(h.compile=na(h.link));h.priority=h.priority||0;h.index=g;h.name=h.name||b;h.require=h.require||h.controller&&h.name;h.restrict=h.restrict||\"EA\";var k=h,l=h,m=h.name,t={isolateScope:null,bindToController:null};H(l.scope)&&(!0===l.bindToController?(t.bindToController=d(l.scope,\nm,!0),t.isolateScope={}):t.isolateScope=d(l.scope,m,!1));H(l.bindToController)&&(t.bindToController=d(l.bindToController,m,!0));if(H(t.bindToController)){var v=l.controller,R=l.controllerAs;if(!v)throw ha(\"noctrl\",m);var V;a:if(R&&E(R))V=R;else{if(E(v)){var n=Uc.exec(v);if(n){V=n[3];break a}}V=void 0}if(!V)throw ha(\"noident\",m);}var s=k.$$bindings=t;H(s.isolateScope)&&(h.$$isolateBindings=s.isolateScope);h.$$moduleName=e.$$moduleName;f.push(h)}catch(u){c(u)}});return f}])),e[b].push(f)):n(b,pc(t));\nreturn this};this.aHrefSanitizationWhitelist=function(a){return y(a)?(b.aHrefSanitizationWhitelist(a),this):b.aHrefSanitizationWhitelist()};this.imgSrcSanitizationWhitelist=function(a){return y(a)?(b.imgSrcSanitizationWhitelist(a),this):b.imgSrcSanitizationWhitelist()};var m=!0;this.debugInfoEnabled=function(a){return y(a)?(m=a,this):m};this.$get=[\"$injector\",\"$interpolate\",\"$exceptionHandler\",\"$templateRequest\",\"$parse\",\"$controller\",\"$rootScope\",\"$document\",\"$sce\",\"$animate\",\"$$sanitizeUri\",function(a,\nb,c,d,p,C,w,ga,L,aa,D){function J(a,b){try{a.addClass(b)}catch(c){}}function K(a,b,c,d,e){a instanceof B||(a=B(a));n(a,function(b,c){b.nodeType==Na&&b.nodeValue.match(/\\S+/)&&(a[c]=B(b).wrap(\"<span></span>\").parent()[0])});var f=O(a,b,a,c,d,e);K.$$addScopeClass(a);var g=null;return function(b,c,d){qb(b,\"scope\");e&&e.needsNewScope&&(b=b.$parent.$new());d=d||{};var h=d.parentBoundTranscludeFn,k=d.transcludeControllers;d=d.futureParentElement;h&&h.$$boundTransclude&&(h=h.$$boundTransclude);g||(g=(d=\nd&&d[0])?\"foreignobject\"!==ta(d)&&d.toString().match(/SVG/)?\"svg\":\"html\":\"html\");d=\"html\"!==g?B(Yb(g,B(\"<div>\").append(a).html())):c?Pa.clone.call(a):a;if(k)for(var l in k)d.data(\"$\"+l+\"Controller\",k[l].instance);K.$$addScopeInfo(d,b);c&&c(d,b);f&&f(b,d,d,h);return d}}function O(a,b,c,d,e,f){function g(a,c,d,e){var f,k,l,m,t,w,D;if(p)for(D=Array(c.length),m=0;m<h.length;m+=3)f=h[m],D[f]=c[f];else D=c;m=0;for(t=h.length;m<t;)k=D[h[m++]],c=h[m++],f=h[m++],c?(c.scope?(l=a.$new(),K.$$addScopeInfo(B(k),\nl)):l=a,w=c.transcludeOnThisElement?R(a,c.transclude,e):!c.templateOnThisElement&&e?e:!e&&b?R(a,b):null,c(f,l,k,d,w)):f&&f(a,k.childNodes,u,e)}for(var h=[],k,l,m,t,p,w=0;w<a.length;w++){k=new fa;l=V(a[w],[],k,0===w?d:u,e);(f=l.length?Z(l,a[w],k,b,c,null,[],[],f):null)&&f.scope&&K.$$addScopeClass(k.$$element);k=f&&f.terminal||!(m=a[w].childNodes)||!m.length?null:O(m,f?(f.transcludeOnThisElement||!f.templateOnThisElement)&&f.transclude:b);if(f||k)h.push(w,f,k),t=!0,p=p||f;f=null}return t?g:null}function R(a,\nb,c){return function(d,e,f,g,h){d||(d=a.$new(!1,h),d.$$transcluded=!0);return b(d,e,{parentBoundTranscludeFn:c,transcludeControllers:f,futureParentElement:g})}}function V(a,b,c,d,e){var h=c.$attr,k;switch(a.nodeType){case 1:P(b,va(ta(a)),\"E\",d,e);for(var l,m,t,p=a.attributes,w=0,D=p&&p.length;w<D;w++){var K=!1,A=!1;l=p[w];k=l.name;m=U(l.value);l=va(k);if(t=ka.test(l))k=k.replace(Vc,\"\").substr(8).replace(/_(.)/g,function(a,b){return b.toUpperCase()});(l=l.match(la))&&G(l[1])&&(K=k,A=k.substr(0,k.length-\n5)+\"end\",k=k.substr(0,k.length-6));l=va(k.toLowerCase());h[l]=k;if(t||!c.hasOwnProperty(l))c[l]=m,Qc(a,l)&&(c[l]=!0);W(a,b,m,l,t);P(b,l,\"A\",d,e,K,A)}a=a.className;H(a)&&(a=a.animVal);if(E(a)&&\"\"!==a)for(;k=g.exec(a);)l=va(k[2]),P(b,l,\"C\",d,e)&&(c[l]=U(k[3])),a=a.substr(k.index+k[0].length);break;case Na:if(11===Ha)for(;a.parentNode&&a.nextSibling&&a.nextSibling.nodeType===Na;)a.nodeValue+=a.nextSibling.nodeValue,a.parentNode.removeChild(a.nextSibling);N(b,a.nodeValue);break;case 8:try{if(k=f.exec(a.nodeValue))l=\nva(k[1]),P(b,l,\"M\",d,e)&&(c[l]=U(k[2]))}catch(R){}}b.sort(Ia);return b}function Ta(a,b,c){var d=[],e=0;if(b&&a.hasAttribute&&a.hasAttribute(b)){do{if(!a)throw ha(\"uterdir\",b,c);1==a.nodeType&&(a.hasAttribute(b)&&e++,a.hasAttribute(c)&&e--);d.push(a);a=a.nextSibling}while(0<e)}else d.push(a);return B(d)}function s(a,b,c){return function(d,e,f,g,h){e=Ta(e[0],b,c);return a(d,e,f,g,h)}}function Z(a,b,d,e,f,g,h,l,m){function t(a,b,c,d){if(a){c&&(a=s(a,c,d));a.require=q.require;a.directiveName=x;if(O===\nq||q.$$isolateScope)a=ca(a,{isolateScope:!0});h.push(a)}if(b){c&&(b=s(b,c,d));b.require=q.require;b.directiveName=x;if(O===q||q.$$isolateScope)b=ca(b,{isolateScope:!0});l.push(b)}}function p(a,b,c,d){var e;if(E(b)){var f=b.match(k);b=b.substring(f[0].length);var g=f[1]||f[3],f=\"?\"===f[2];\"^^\"===g?c=c.parent():e=(e=d&&d[b])&&e.instance;e||(d=\"$\"+b+\"Controller\",e=g?c.inheritedData(d):c.data(d));if(!e&&!f)throw ha(\"ctreq\",b,a);}else if(I(b))for(e=[],g=0,f=b.length;g<f;g++)e[g]=p(a,b[g],c,d);return e||\nnull}function w(a,b,c,d,e,f){var g=$(),h;for(h in d){var k=d[h],l={$scope:k===O||k.$$isolateScope?e:f,$element:a,$attrs:b,$transclude:c},m=k.controller;\"@\"==m&&(m=b[k.name]);l=C(m,l,!0,k.controllerAs);g[k.name]=l;aa||a.data(\"$\"+k.name+\"Controller\",l.instance)}return g}function D(a,c,e,f,g){function k(a,b,c){var d;Za(a)||(c=b,b=a,a=u);aa&&(d=v);c||(c=aa?V.parent():V);return g(a,b,d,c,Ta)}var m,t,A,v,C,V,Ga;b===e?(f=d,V=d.$$element):(V=B(e),f=new fa(V,d));A=c;O?t=c.$new(!0):R&&(A=c.$parent);g&&(C=k,\nC.$$boundTransclude=g);T&&(v=w(V,f,C,T,t,c));O&&(K.$$addScopeInfo(V,t,!0,!(J&&(J===O||J===O.$$originalDirective))),K.$$addScopeClass(V,!0),t.$$isolateBindings=O.$$isolateBindings,(Ga=ba(c,f,t,t.$$isolateBindings,O))&&t.$on(\"$destroy\",Ga));for(var n in v){Ga=T[n];var ga=v[n],L=Ga.$$bindings.bindToController;ga.identifier&&L&&(m=ba(A,f,ga.instance,L,Ga));var q=ga();q!==ga.instance&&(ga.instance=q,V.data(\"$\"+Ga.name+\"Controller\",q),m&&m(),m=ba(A,f,ga.instance,L,Ga))}F=0;for(M=h.length;F<M;F++)m=h[F],\nea(m,m.isolateScope?t:c,V,f,m.require&&p(m.directiveName,m.require,V,v),C);var Ta=c;O&&(O.template||null===O.templateUrl)&&(Ta=t);a&&a(Ta,e.childNodes,u,g);for(F=l.length-1;0<=F;F--)m=l[F],ea(m,m.isolateScope?t:c,V,f,m.require&&p(m.directiveName,m.require,V,v),C)}m=m||{};for(var A=-Number.MAX_VALUE,R=m.newScopeDirective,T=m.controllerDirectives,O=m.newIsolateScopeDirective,J=m.templateDirective,n=m.nonTlbTranscludeDirective,ga=!1,L=!1,aa=m.hasElementTranscludeDirective,Z=d.$$element=B(b),q,x,P,Ia=\ne,G,F=0,M=a.length;F<M;F++){q=a[F];var N=q.$$start,Q=q.$$end;N&&(Z=Ta(b,N,Q));P=u;if(A>q.priority)break;if(P=q.scope)q.templateUrl||(H(P)?(Ua(\"new/isolated scope\",O||R,q,Z),O=q):Ua(\"new/isolated scope\",O,q,Z)),R=R||q;x=q.name;!q.templateUrl&&q.controller&&(P=q.controller,T=T||$(),Ua(\"'\"+x+\"' controller\",T[x],q,Z),T[x]=q);if(P=q.transclude)ga=!0,q.$$tlb||(Ua(\"transclusion\",n,q,Z),n=q),\"element\"==P?(aa=!0,A=q.priority,P=Z,Z=d.$$element=B(X.createComment(\" \"+x+\": \"+d[x]+\" \")),b=Z[0],Y(f,ra.call(P,0),\nb),Ia=K(P,e,A,g&&g.name,{nonTlbTranscludeDirective:n})):(P=B(Vb(b)).contents(),Z.empty(),Ia=K(P,e,u,u,{needsNewScope:q.$$isolateScope||q.$$newScope}));if(q.template)if(L=!0,Ua(\"template\",J,q,Z),J=q,P=z(q.template)?q.template(Z,d):q.template,P=ja(P),q.replace){g=q;P=Tb.test(P)?Xc(Yb(q.templateNamespace,U(P))):[];b=P[0];if(1!=P.length||1!==b.nodeType)throw ha(\"tplrt\",x,\"\");Y(f,Z,b);P={$attr:{}};var Wc=V(b,[],P),W=a.splice(F+1,a.length-(F+1));(O||R)&&y(Wc,O,R);a=a.concat(Wc).concat(W);S(d,P);M=a.length}else Z.html(P);\nif(q.templateUrl)L=!0,Ua(\"template\",J,q,Z),J=q,q.replace&&(g=q),D=Of(a.splice(F,a.length-F),Z,d,f,ga&&Ia,h,l,{controllerDirectives:T,newScopeDirective:R!==q&&R,newIsolateScopeDirective:O,templateDirective:J,nonTlbTranscludeDirective:n}),M=a.length;else if(q.compile)try{G=q.compile(Z,d,Ia),z(G)?t(null,G,N,Q):G&&t(G.pre,G.post,N,Q)}catch(da){c(da,ua(Z))}q.terminal&&(D.terminal=!0,A=Math.max(A,q.priority))}D.scope=R&&!0===R.scope;D.transcludeOnThisElement=ga;D.templateOnThisElement=L;D.transclude=Ia;\nm.hasElementTranscludeDirective=aa;return D}function y(a,b,c){for(var d=0,e=a.length;d<e;d++)a[d]=Ob(a[d],{$$isolateScope:b,$$newScope:c})}function P(b,d,f,g,h,k,l){if(d===h)return null;h=null;if(e.hasOwnProperty(d)){var m;d=a.get(d+\"Directive\");for(var p=0,w=d.length;p<w;p++)try{m=d[p],(q(g)||g>m.priority)&&-1!=m.restrict.indexOf(f)&&(k&&(m=Ob(m,{$$start:k,$$end:l})),b.push(m),h=m)}catch(D){c(D)}}return h}function G(b){if(e.hasOwnProperty(b))for(var c=a.get(b+\"Directive\"),d=0,f=c.length;d<f;d++)if(b=\nc[d],b.multiElement)return!0;return!1}function S(a,b){var c=b.$attr,d=a.$attr,e=a.$$element;n(a,function(d,e){\"$\"!=e.charAt(0)&&(b[e]&&b[e]!==d&&(d+=(\"style\"===e?\";\":\" \")+b[e]),a.$set(e,d,!0,c[e]))});n(b,function(b,f){\"class\"==f?(J(e,b),a[\"class\"]=(a[\"class\"]?a[\"class\"]+\" \":\"\")+b):\"style\"==f?(e.attr(\"style\",e.attr(\"style\")+\";\"+b),a.style=(a.style?a.style+\";\":\"\")+b):\"$\"==f.charAt(0)||a.hasOwnProperty(f)||(a[f]=b,d[f]=c[f])})}function Of(a,b,c,e,f,g,h,k){var l=[],m,t,p=b[0],w=a.shift(),D=Ob(w,{templateUrl:null,\ntransclude:null,replace:null,$$originalDirective:w}),A=z(w.templateUrl)?w.templateUrl(b,c):w.templateUrl,K=w.templateNamespace;b.empty();d(A).then(function(d){var T,v;d=ja(d);if(w.replace){d=Tb.test(d)?Xc(Yb(K,U(d))):[];T=d[0];if(1!=d.length||1!==T.nodeType)throw ha(\"tplrt\",w.name,A);d={$attr:{}};Y(e,b,T);var C=V(T,[],d);H(w.scope)&&y(C,!0);a=C.concat(a);S(c,d)}else T=p,b.html(d);a.unshift(D);m=Z(a,T,c,f,b,w,g,h,k);n(e,function(a,c){a==T&&(e[c]=b[0])});for(t=O(b[0].childNodes,f);l.length;){d=l.shift();\nv=l.shift();var ga=l.shift(),L=l.shift(),C=b[0];if(!d.$$destroyed){if(v!==p){var q=v.className;k.hasElementTranscludeDirective&&w.replace||(C=Vb(T));Y(ga,B(v),C);J(B(C),q)}v=m.transcludeOnThisElement?R(d,m.transclude,L):L;m(t,d,C,e,v)}}l=null});return function(a,b,c,d,e){a=e;b.$$destroyed||(l?l.push(b,c,d,a):(m.transcludeOnThisElement&&(a=R(b,m.transclude,e)),m(t,b,c,d,a)))}}function Ia(a,b){var c=b.priority-a.priority;return 0!==c?c:a.name!==b.name?a.name<b.name?-1:1:a.index-b.index}function Ua(a,\nb,c,d){function e(a){return a?\" (module: \"+a+\")\":\"\"}if(b)throw ha(\"multidir\",b.name,e(b.$$moduleName),c.name,e(c.$$moduleName),a,ua(d));}function N(a,c){var d=b(c,!0);d&&a.push({priority:0,compile:function(a){a=a.parent();var b=!!a.length;b&&K.$$addBindingClass(a);return function(a,c){var e=c.parent();b||K.$$addBindingClass(e);K.$$addBindingInfo(e,d.expressions);a.$watch(d,function(a){c[0].nodeValue=a})}}})}function Yb(a,b){a=F(a||\"html\");switch(a){case \"svg\":case \"math\":var c=X.createElement(\"div\");\nc.innerHTML=\"<\"+a+\">\"+b+\"</\"+a+\">\";return c.childNodes[0].childNodes;default:return b}}function Q(a,b){if(\"srcdoc\"==b)return L.HTML;var c=ta(a);if(\"xlinkHref\"==b||\"form\"==c&&\"action\"==b||\"img\"!=c&&(\"src\"==b||\"ngSrc\"==b))return L.RESOURCE_URL}function W(a,c,d,e,f){var g=Q(a,e);f=h[e]||f;var k=b(d,!0,g,f);if(k){if(\"multiple\"===e&&\"select\"===ta(a))throw ha(\"selmulti\",ua(a));c.push({priority:100,compile:function(){return{pre:function(a,c,h){c=h.$$observers||(h.$$observers=$());if(l.test(e))throw ha(\"nodomevents\");\nvar m=h[e];m!==d&&(k=m&&b(m,!0,g,f),d=m);k&&(h[e]=k(a),(c[e]||(c[e]=[])).$$inter=!0,(h.$$observers&&h.$$observers[e].$$scope||a).$watch(k,function(a,b){\"class\"===e&&a!=b?h.$updateClass(a,b):h.$set(e,a)}))}}}})}}function Y(a,b,c){var d=b[0],e=b.length,f=d.parentNode,g,h;if(a)for(g=0,h=a.length;g<h;g++)if(a[g]==d){a[g++]=c;h=g+e-1;for(var k=a.length;g<k;g++,h++)h<k?a[g]=a[h]:delete a[g];a.length-=e-1;a.context===d&&(a.context=c);break}f&&f.replaceChild(c,d);a=X.createDocumentFragment();a.appendChild(d);\nB.hasData(d)&&(B.data(c,B.data(d)),oa?(Rb=!0,oa.cleanData([d])):delete B.cache[d[B.expando]]);d=1;for(e=b.length;d<e;d++)f=b[d],B(f).remove(),a.appendChild(f),delete b[d];b[0]=c;b.length=1}function ca(a,b){return M(function(){return a.apply(null,arguments)},a,b)}function ea(a,b,d,e,f,g){try{a(b,d,e,f,g)}catch(h){c(h,ua(d))}}function ba(a,c,d,e,f){var g=[];n(e,function(e,h){var k=e.attrName,l=e.optional,m,t,w,D;switch(e.mode){case \"@\":l||qa.call(c,k)||(d[h]=c[k]=void 0);c.$observe(k,function(a){E(a)&&\n(d[h]=a)});c.$$observers[k].$$scope=a;E(c[k])&&(d[h]=b(c[k])(a));break;case \"=\":if(!qa.call(c,k)){if(l)break;c[k]=void 0}if(l&&!c[k])break;t=p(c[k]);D=t.literal?ma:function(a,b){return a===b||a!==a&&b!==b};w=t.assign||function(){m=d[h]=t(a);throw ha(\"nonassign\",c[k],f.name);};m=d[h]=t(a);l=function(b){D(b,d[h])||(D(b,m)?w(a,b=d[h]):d[h]=b);return m=b};l.$stateful=!0;l=e.collection?a.$watchCollection(c[k],l):a.$watch(p(c[k],l),null,t.literal);g.push(l);break;case \"&\":t=c.hasOwnProperty(k)?p(c[k]):\nx;if(t===x&&l)break;d[h]=function(b){return t(a,b)}}});return g.length&&function(){for(var a=0,b=g.length;a<b;++a)g[a]()}}var fa=function(a,b){if(b){var c=Object.keys(b),d,e,f;d=0;for(e=c.length;d<e;d++)f=c[d],this[f]=b[f]}else this.$attr={};this.$$element=a};fa.prototype={$normalize:va,$addClass:function(a){a&&0<a.length&&aa.addClass(this.$$element,a)},$removeClass:function(a){a&&0<a.length&&aa.removeClass(this.$$element,a)},$updateClass:function(a,b){var c=Yc(a,b);c&&c.length&&aa.addClass(this.$$element,\nc);(c=Yc(b,a))&&c.length&&aa.removeClass(this.$$element,c)},$set:function(a,b,d,e){var f=Qc(this.$$element[0],a),g=Zc[a],h=a;f?(this.$$element.prop(a,b),e=f):g&&(this[g]=b,h=g);this[a]=b;e?this.$attr[a]=e:(e=this.$attr[a])||(this.$attr[a]=e=zc(a,\"-\"));f=ta(this.$$element);if(\"a\"===f&&\"href\"===a||\"img\"===f&&\"src\"===a)this[a]=b=D(b,\"src\"===a);else if(\"img\"===f&&\"srcset\"===a){for(var f=\"\",g=U(b),k=/(\\s+\\d+x\\s*,|\\s+\\d+w\\s*,|\\s+,|,\\s+)/,k=/\\s/.test(g)?k:/(,)/,g=g.split(k),k=Math.floor(g.length/2),l=0;l<\nk;l++)var m=2*l,f=f+D(U(g[m]),!0),f=f+(\" \"+U(g[m+1]));g=U(g[2*l]).split(/\\s/);f+=D(U(g[0]),!0);2===g.length&&(f+=\" \"+U(g[1]));this[a]=b=f}!1!==d&&(null===b||q(b)?this.$$element.removeAttr(e):this.$$element.attr(e,b));(a=this.$$observers)&&n(a[h],function(a){try{a(b)}catch(d){c(d)}})},$observe:function(a,b){var c=this,d=c.$$observers||(c.$$observers=$()),e=d[a]||(d[a]=[]);e.push(b);w.$evalAsync(function(){e.$$inter||!c.hasOwnProperty(a)||q(c[a])||b(c[a])});return function(){ab(e,b)}}};var da=b.startSymbol(),\nia=b.endSymbol(),ja=\"{{\"==da||\"}}\"==ia?Ya:function(a){return a.replace(/\\{\\{/g,da).replace(/}}/g,ia)},ka=/^ngAttr[A-Z]/,la=/^(.+)Start$/;K.$$addBindingInfo=m?function(a,b){var c=a.data(\"$binding\")||[];I(b)?c=c.concat(b):c.push(b);a.data(\"$binding\",c)}:x;K.$$addBindingClass=m?function(a){J(a,\"ng-binding\")}:x;K.$$addScopeInfo=m?function(a,b,c,d){a.data(c?d?\"$isolateScopeNoTemplate\":\"$isolateScope\":\"$scope\",b)}:x;K.$$addScopeClass=m?function(a,b){J(a,b?\"ng-isolate-scope\":\"ng-scope\")}:x;return K}]}function va(a){return fb(a.replace(Vc,\n\"\"))}function Yc(a,b){var d=\"\",c=a.split(/\\s+/),e=b.split(/\\s+/),f=0;a:for(;f<c.length;f++){for(var g=c[f],h=0;h<e.length;h++)if(g==e[h])continue a;d+=(0<d.length?\" \":\"\")+g}return d}function Xc(a){a=B(a);var b=a.length;if(1>=b)return a;for(;b--;)8===a[b].nodeType&&Pf.call(a,b,1);return a}function Xe(){var a={},b=!1;this.register=function(b,c){Ra(b,\"controller\");H(b)?M(a,b):a[b]=c};this.allowGlobals=function(){b=!0};this.$get=[\"$injector\",\"$window\",function(d,c){function e(a,b,c,d){if(!a||!H(a.$scope))throw G(\"$controller\")(\"noscp\",\nd,b);a.$scope[b]=c}return function(f,g,h,k){var l,m,r;h=!0===h;k&&E(k)&&(r=k);if(E(f)){k=f.match(Uc);if(!k)throw Qf(\"ctrlfmt\",f);m=k[1];r=r||k[3];f=a.hasOwnProperty(m)?a[m]:Bc(g.$scope,m,!0)||(b?Bc(c,m,!0):u);Qa(f,m,!0)}if(h)return h=(I(f)?f[f.length-1]:f).prototype,l=Object.create(h||null),r&&e(g,r,l,m||f.name),M(function(){var a=d.invoke(f,l,g,m);a!==l&&(H(a)||z(a))&&(l=a,r&&e(g,r,l,m||f.name));return l},{instance:l,identifier:r});l=d.instantiate(f,g,m);r&&e(g,r,l,m||f.name);return l}}]}function Ye(){this.$get=\n[\"$window\",function(a){return B(a.document)}]}function Ze(){this.$get=[\"$log\",function(a){return function(b,d){a.error.apply(a,arguments)}}]}function Zb(a){return H(a)?da(a)?a.toISOString():db(a):a}function df(){this.$get=function(){return function(a){if(!a)return\"\";var b=[];oc(a,function(a,c){null===a||q(a)||(I(a)?n(a,function(a,d){b.push(ja(c)+\"=\"+ja(Zb(a)))}):b.push(ja(c)+\"=\"+ja(Zb(a))))});return b.join(\"&\")}}}function ef(){this.$get=function(){return function(a){function b(a,e,f){null===a||q(a)||\n(I(a)?n(a,function(a,c){b(a,e+\"[\"+(H(a)?c:\"\")+\"]\")}):H(a)&&!da(a)?oc(a,function(a,c){b(a,e+(f?\"\":\"[\")+c+(f?\"\":\"]\"))}):d.push(ja(e)+\"=\"+ja(Zb(a))))}if(!a)return\"\";var d=[];b(a,\"\",!0);return d.join(\"&\")}}}function $b(a,b){if(E(a)){var d=a.replace(Rf,\"\").trim();if(d){var c=b(\"Content-Type\");(c=c&&0===c.indexOf($c))||(c=(c=d.match(Sf))&&Tf[c[0]].test(d));c&&(a=uc(d))}}return a}function ad(a){var b=$(),d;E(a)?n(a.split(\"\\n\"),function(a){d=a.indexOf(\":\");var e=F(U(a.substr(0,d)));a=U(a.substr(d+1));e&&\n(b[e]=b[e]?b[e]+\", \"+a:a)}):H(a)&&n(a,function(a,d){var f=F(d),g=U(a);f&&(b[f]=b[f]?b[f]+\", \"+g:g)});return b}function bd(a){var b;return function(d){b||(b=ad(a));return d?(d=b[F(d)],void 0===d&&(d=null),d):b}}function cd(a,b,d,c){if(z(c))return c(a,b,d);n(c,function(c){a=c(a,b,d)});return a}function cf(){var a=this.defaults={transformResponse:[$b],transformRequest:[function(a){return H(a)&&\"[object File]\"!==sa.call(a)&&\"[object Blob]\"!==sa.call(a)&&\"[object FormData]\"!==sa.call(a)?db(a):a}],headers:{common:{Accept:\"application/json, text/plain, */*\"},\npost:ia(ac),put:ia(ac),patch:ia(ac)},xsrfCookieName:\"XSRF-TOKEN\",xsrfHeaderName:\"X-XSRF-TOKEN\",paramSerializer:\"$httpParamSerializer\"},b=!1;this.useApplyAsync=function(a){return y(a)?(b=!!a,this):b};var d=!0;this.useLegacyPromiseExtensions=function(a){return y(a)?(d=!!a,this):d};var c=this.interceptors=[];this.$get=[\"$httpBackend\",\"$$cookieReader\",\"$cacheFactory\",\"$rootScope\",\"$q\",\"$injector\",function(e,f,g,h,k,l){function m(b){function c(a){var b=M({},a);b.data=cd(a.data,a.headers,a.status,f.transformResponse);\na=a.status;return 200<=a&&300>a?b:k.reject(b)}function e(a,b){var c,d={};n(a,function(a,e){z(a)?(c=a(b),null!=c&&(d[e]=c)):d[e]=a});return d}if(!fa.isObject(b))throw G(\"$http\")(\"badreq\",b);var f=M({method:\"get\",transformRequest:a.transformRequest,transformResponse:a.transformResponse,paramSerializer:a.paramSerializer},b);f.headers=function(b){var c=a.headers,d=M({},b.headers),f,g,h,c=M({},c.common,c[F(b.method)]);a:for(f in c){g=F(f);for(h in d)if(F(h)===g)continue a;d[f]=c[f]}return e(d,ia(b))}(b);\nf.method=sb(f.method);f.paramSerializer=E(f.paramSerializer)?l.get(f.paramSerializer):f.paramSerializer;var g=[function(b){var d=b.headers,e=cd(b.data,bd(d),u,b.transformRequest);q(e)&&n(d,function(a,b){\"content-type\"===F(b)&&delete d[b]});q(b.withCredentials)&&!q(a.withCredentials)&&(b.withCredentials=a.withCredentials);return r(b,e).then(c,c)},u],h=k.when(f);for(n(v,function(a){(a.request||a.requestError)&&g.unshift(a.request,a.requestError);(a.response||a.responseError)&&g.push(a.response,a.responseError)});g.length;){b=\ng.shift();var m=g.shift(),h=h.then(b,m)}d?(h.success=function(a){Qa(a,\"fn\");h.then(function(b){a(b.data,b.status,b.headers,f)});return h},h.error=function(a){Qa(a,\"fn\");h.then(null,function(b){a(b.data,b.status,b.headers,f)});return h}):(h.success=dd(\"success\"),h.error=dd(\"error\"));return h}function r(c,d){function g(a,c,d,e){function f(){l(c,a,d,e)}J&&(200<=a&&300>a?J.put(R,[a,c,ad(d),e]):J.remove(R));b?h.$applyAsync(f):(f(),h.$$phase||h.$apply())}function l(a,b,d,e){b=-1<=b?b:0;(200<=b&&300>b?n.resolve:\nn.reject)({data:a,status:b,headers:bd(d),config:c,statusText:e})}function r(a){l(a.data,a.status,ia(a.headers()),a.statusText)}function v(){var a=m.pendingRequests.indexOf(c);-1!==a&&m.pendingRequests.splice(a,1)}var n=k.defer(),D=n.promise,J,K,O=c.headers,R=t(c.url,c.paramSerializer(c.params));m.pendingRequests.push(c);D.then(v,v);!c.cache&&!a.cache||!1===c.cache||\"GET\"!==c.method&&\"JSONP\"!==c.method||(J=H(c.cache)?c.cache:H(a.cache)?a.cache:A);J&&(K=J.get(R),y(K)?K&&z(K.then)?K.then(r,r):I(K)?l(K[1],\nK[0],ia(K[2]),K[3]):l(K,200,{},\"OK\"):J.put(R,D));q(K)&&((K=ed(c.url)?f()[c.xsrfCookieName||a.xsrfCookieName]:u)&&(O[c.xsrfHeaderName||a.xsrfHeaderName]=K),e(c.method,R,d,g,O,c.timeout,c.withCredentials,c.responseType));return D}function t(a,b){0<b.length&&(a+=(-1==a.indexOf(\"?\")?\"?\":\"&\")+b);return a}var A=g(\"$http\");a.paramSerializer=E(a.paramSerializer)?l.get(a.paramSerializer):a.paramSerializer;var v=[];n(c,function(a){v.unshift(E(a)?l.get(a):l.invoke(a))});m.pendingRequests=[];(function(a){n(arguments,\nfunction(a){m[a]=function(b,c){return m(M({},c||{},{method:a,url:b}))}})})(\"get\",\"delete\",\"head\",\"jsonp\");(function(a){n(arguments,function(a){m[a]=function(b,c,d){return m(M({},d||{},{method:a,url:b,data:c}))}})})(\"post\",\"put\",\"patch\");m.defaults=a;return m}]}function gf(){this.$get=function(){return function(){return new S.XMLHttpRequest}}}function ff(){this.$get=[\"$browser\",\"$window\",\"$document\",\"$xhrFactory\",function(a,b,d,c){return Uf(a,c,a.defer,b.angular.callbacks,d[0])}]}function Uf(a,b,d,\nc,e){function f(a,b,d){var f=e.createElement(\"script\"),m=null;f.type=\"text/javascript\";f.src=a;f.async=!0;m=function(a){f.removeEventListener(\"load\",m,!1);f.removeEventListener(\"error\",m,!1);e.body.removeChild(f);f=null;var g=-1,A=\"unknown\";a&&(\"load\"!==a.type||c[b].called||(a={type:\"error\"}),A=a.type,g=\"error\"===a.type?404:200);d&&d(g,A)};f.addEventListener(\"load\",m,!1);f.addEventListener(\"error\",m,!1);e.body.appendChild(f);return m}return function(e,h,k,l,m,r,t,A){function v(){C&&C();w&&w.abort()}\nfunction T(b,c,e,f,g){y(L)&&d.cancel(L);C=w=null;b(c,e,f,g);a.$$completeOutstandingRequest(x)}a.$$incOutstandingRequestCount();h=h||a.url();if(\"jsonp\"==F(e)){var p=\"_\"+(c.counter++).toString(36);c[p]=function(a){c[p].data=a;c[p].called=!0};var C=f(h.replace(\"JSON_CALLBACK\",\"angular.callbacks.\"+p),p,function(a,b){T(l,a,c[p].data,\"\",b);c[p]=x})}else{var w=b(e,h);w.open(e,h,!0);n(m,function(a,b){y(a)&&w.setRequestHeader(b,a)});w.onload=function(){var a=w.statusText||\"\",b=\"response\"in w?w.response:w.responseText,\nc=1223===w.status?204:w.status;0===c&&(c=b?200:\"file\"==wa(h).protocol?404:0);T(l,c,b,w.getAllResponseHeaders(),a)};e=function(){T(l,-1,null,null,\"\")};w.onerror=e;w.onabort=e;t&&(w.withCredentials=!0);if(A)try{w.responseType=A}catch(ga){if(\"json\"!==A)throw ga;}w.send(q(k)?null:k)}if(0<r)var L=d(v,r);else r&&z(r.then)&&r.then(v)}}function af(){var a=\"{{\",b=\"}}\";this.startSymbol=function(b){return b?(a=b,this):a};this.endSymbol=function(a){return a?(b=a,this):b};this.$get=[\"$parse\",\"$exceptionHandler\",\n\"$sce\",function(d,c,e){function f(a){return\"\\\\\\\\\\\\\"+a}function g(c){return c.replace(m,a).replace(r,b)}function h(f,h,m,r){function p(a){try{var b=a;a=m?e.getTrusted(m,b):e.valueOf(b);var d;if(r&&!y(a))d=a;else if(null==a)d=\"\";else{switch(typeof a){case \"string\":break;case \"number\":a=\"\"+a;break;default:a=db(a)}d=a}return d}catch(g){c(Ja.interr(f,g))}}r=!!r;for(var C,w,n=0,L=[],s=[],D=f.length,J=[],K=[];n<D;)if(-1!=(C=f.indexOf(a,n))&&-1!=(w=f.indexOf(b,C+k)))n!==C&&J.push(g(f.substring(n,C))),n=f.substring(C+\nk,w),L.push(n),s.push(d(n,p)),n=w+l,K.push(J.length),J.push(\"\");else{n!==D&&J.push(g(f.substring(n)));break}m&&1<J.length&&Ja.throwNoconcat(f);if(!h||L.length){var O=function(a){for(var b=0,c=L.length;b<c;b++){if(r&&q(a[b]))return;J[K[b]]=a[b]}return J.join(\"\")};return M(function(a){var b=0,d=L.length,e=Array(d);try{for(;b<d;b++)e[b]=s[b](a);return O(e)}catch(g){c(Ja.interr(f,g))}},{exp:f,expressions:L,$$watchDelegate:function(a,b){var c;return a.$watchGroup(s,function(d,e){var f=O(d);z(b)&&b.call(this,\nf,d!==e?c:f,a);c=f})}})}}var k=a.length,l=b.length,m=new RegExp(a.replace(/./g,f),\"g\"),r=new RegExp(b.replace(/./g,f),\"g\");h.startSymbol=function(){return a};h.endSymbol=function(){return b};return h}]}function bf(){this.$get=[\"$rootScope\",\"$window\",\"$q\",\"$$q\",function(a,b,d,c){function e(e,h,k,l){var m=4<arguments.length,r=m?ra.call(arguments,4):[],t=b.setInterval,A=b.clearInterval,v=0,n=y(l)&&!l,p=(n?c:d).defer(),C=p.promise;k=y(k)?k:0;C.then(null,null,m?function(){e.apply(null,r)}:e);C.$$intervalId=\nt(function(){p.notify(v++);0<k&&v>=k&&(p.resolve(v),A(C.$$intervalId),delete f[C.$$intervalId]);n||a.$apply()},h);f[C.$$intervalId]=p;return C}var f={};e.cancel=function(a){return a&&a.$$intervalId in f?(f[a.$$intervalId].reject(\"canceled\"),b.clearInterval(a.$$intervalId),delete f[a.$$intervalId],!0):!1};return e}]}function bc(a){a=a.split(\"/\");for(var b=a.length;b--;)a[b]=ob(a[b]);return a.join(\"/\")}function fd(a,b){var d=wa(a);b.$$protocol=d.protocol;b.$$host=d.hostname;b.$$port=ea(d.port)||Vf[d.protocol]||\nnull}function gd(a,b){var d=\"/\"!==a.charAt(0);d&&(a=\"/\"+a);var c=wa(a);b.$$path=decodeURIComponent(d&&\"/\"===c.pathname.charAt(0)?c.pathname.substring(1):c.pathname);b.$$search=xc(c.search);b.$$hash=decodeURIComponent(c.hash);b.$$path&&\"/\"!=b.$$path.charAt(0)&&(b.$$path=\"/\"+b.$$path)}function pa(a,b){if(0===b.indexOf(a))return b.substr(a.length)}function Fa(a){var b=a.indexOf(\"#\");return-1==b?a:a.substr(0,b)}function ib(a){return a.replace(/(#.+)|#$/,\"$1\")}function cc(a,b,d){this.$$html5=!0;d=d||\"\";\nfd(a,this);this.$$parse=function(a){var d=pa(b,a);if(!E(d))throw Db(\"ipthprfx\",a,b);gd(d,this);this.$$path||(this.$$path=\"/\");this.$$compose()};this.$$compose=function(){var a=Qb(this.$$search),d=this.$$hash?\"#\"+ob(this.$$hash):\"\";this.$$url=bc(this.$$path)+(a?\"?\"+a:\"\")+d;this.$$absUrl=b+this.$$url.substr(1)};this.$$parseLinkUrl=function(c,e){if(e&&\"#\"===e[0])return this.hash(e.slice(1)),!0;var f,g;y(f=pa(a,c))?(g=f,g=y(f=pa(d,f))?b+(pa(\"/\",f)||f):a+g):y(f=pa(b,c))?g=b+f:b==c+\"/\"&&(g=b);g&&this.$$parse(g);\nreturn!!g}}function dc(a,b,d){fd(a,this);this.$$parse=function(c){var e=pa(a,c)||pa(b,c),f;q(e)||\"#\"!==e.charAt(0)?this.$$html5?f=e:(f=\"\",q(e)&&(a=c,this.replace())):(f=pa(d,e),q(f)&&(f=e));gd(f,this);c=this.$$path;var e=a,g=/^\\/[A-Z]:(\\/.*)/;0===f.indexOf(e)&&(f=f.replace(e,\"\"));g.exec(f)||(c=(f=g.exec(c))?f[1]:c);this.$$path=c;this.$$compose()};this.$$compose=function(){var b=Qb(this.$$search),e=this.$$hash?\"#\"+ob(this.$$hash):\"\";this.$$url=bc(this.$$path)+(b?\"?\"+b:\"\")+e;this.$$absUrl=a+(this.$$url?\nd+this.$$url:\"\")};this.$$parseLinkUrl=function(b,d){return Fa(a)==Fa(b)?(this.$$parse(b),!0):!1}}function hd(a,b,d){this.$$html5=!0;dc.apply(this,arguments);this.$$parseLinkUrl=function(c,e){if(e&&\"#\"===e[0])return this.hash(e.slice(1)),!0;var f,g;a==Fa(c)?f=c:(g=pa(b,c))?f=a+d+g:b===c+\"/\"&&(f=b);f&&this.$$parse(f);return!!f};this.$$compose=function(){var b=Qb(this.$$search),e=this.$$hash?\"#\"+ob(this.$$hash):\"\";this.$$url=bc(this.$$path)+(b?\"?\"+b:\"\")+e;this.$$absUrl=a+d+this.$$url}}function Eb(a){return function(){return this[a]}}\nfunction id(a,b){return function(d){if(q(d))return this[a];this[a]=b(d);this.$$compose();return this}}function hf(){var a=\"\",b={enabled:!1,requireBase:!0,rewriteLinks:!0};this.hashPrefix=function(b){return y(b)?(a=b,this):a};this.html5Mode=function(a){return $a(a)?(b.enabled=a,this):H(a)?($a(a.enabled)&&(b.enabled=a.enabled),$a(a.requireBase)&&(b.requireBase=a.requireBase),$a(a.rewriteLinks)&&(b.rewriteLinks=a.rewriteLinks),this):b};this.$get=[\"$rootScope\",\"$browser\",\"$sniffer\",\"$rootElement\",\"$window\",\nfunction(d,c,e,f,g){function h(a,b,d){var e=l.url(),f=l.$$state;try{c.url(a,b,d),l.$$state=c.state()}catch(g){throw l.url(e),l.$$state=f,g;}}function k(a,b){d.$broadcast(\"$locationChangeSuccess\",l.absUrl(),a,l.$$state,b)}var l,m;m=c.baseHref();var r=c.url(),t;if(b.enabled){if(!m&&b.requireBase)throw Db(\"nobase\");t=r.substring(0,r.indexOf(\"/\",r.indexOf(\"//\")+2))+(m||\"/\");m=e.history?cc:hd}else t=Fa(r),m=dc;var A=t.substr(0,Fa(t).lastIndexOf(\"/\")+1);l=new m(t,A,\"#\"+a);l.$$parseLinkUrl(r,r);l.$$state=\nc.state();var v=/^\\s*(javascript|mailto):/i;f.on(\"click\",function(a){if(b.rewriteLinks&&!a.ctrlKey&&!a.metaKey&&!a.shiftKey&&2!=a.which&&2!=a.button){for(var e=B(a.target);\"a\"!==ta(e[0]);)if(e[0]===f[0]||!(e=e.parent())[0])return;var h=e.prop(\"href\"),k=e.attr(\"href\")||e.attr(\"xlink:href\");H(h)&&\"[object SVGAnimatedString]\"===h.toString()&&(h=wa(h.animVal).href);v.test(h)||!h||e.attr(\"target\")||a.isDefaultPrevented()||!l.$$parseLinkUrl(h,k)||(a.preventDefault(),l.absUrl()!=c.url()&&(d.$apply(),g.angular[\"ff-684208-preventDefault\"]=\n!0))}});ib(l.absUrl())!=ib(r)&&c.url(l.absUrl(),!0);var n=!0;c.onUrlChange(function(a,b){q(pa(A,a))?g.location.href=a:(d.$evalAsync(function(){var c=l.absUrl(),e=l.$$state,f;a=ib(a);l.$$parse(a);l.$$state=b;f=d.$broadcast(\"$locationChangeStart\",a,c,b,e).defaultPrevented;l.absUrl()===a&&(f?(l.$$parse(c),l.$$state=e,h(c,!1,e)):(n=!1,k(c,e)))}),d.$$phase||d.$digest())});d.$watch(function(){var a=ib(c.url()),b=ib(l.absUrl()),f=c.state(),g=l.$$replace,m=a!==b||l.$$html5&&e.history&&f!==l.$$state;if(n||\nm)n=!1,d.$evalAsync(function(){var b=l.absUrl(),c=d.$broadcast(\"$locationChangeStart\",b,a,l.$$state,f).defaultPrevented;l.absUrl()===b&&(c?(l.$$parse(a),l.$$state=f):(m&&h(b,g,f===l.$$state?null:l.$$state),k(a,f)))});l.$$replace=!1});return l}]}function jf(){var a=!0,b=this;this.debugEnabled=function(b){return y(b)?(a=b,this):a};this.$get=[\"$window\",function(d){function c(a){a instanceof Error&&(a.stack?a=a.message&&-1===a.stack.indexOf(a.message)?\"Error: \"+a.message+\"\\n\"+a.stack:a.stack:a.sourceURL&&\n(a=a.message+\"\\n\"+a.sourceURL+\":\"+a.line));return a}function e(a){var b=d.console||{},e=b[a]||b.log||x;a=!1;try{a=!!e.apply}catch(k){}return a?function(){var a=[];n(arguments,function(b){a.push(c(b))});return e.apply(b,a)}:function(a,b){e(a,null==b?\"\":b)}}return{log:e(\"log\"),info:e(\"info\"),warn:e(\"warn\"),error:e(\"error\"),debug:function(){var c=e(\"debug\");return function(){a&&c.apply(b,arguments)}}()}}]}function Va(a,b){if(\"__defineGetter__\"===a||\"__defineSetter__\"===a||\"__lookupGetter__\"===a||\"__lookupSetter__\"===\na||\"__proto__\"===a)throw ba(\"isecfld\",b);return a}function jd(a,b){a+=\"\";if(!E(a))throw ba(\"iseccst\",b);return a}function xa(a,b){if(a){if(a.constructor===a)throw ba(\"isecfn\",b);if(a.window===a)throw ba(\"isecwindow\",b);if(a.children&&(a.nodeName||a.prop&&a.attr&&a.find))throw ba(\"isecdom\",b);if(a===Object)throw ba(\"isecobj\",b);}return a}function kd(a,b){if(a){if(a.constructor===a)throw ba(\"isecfn\",b);if(a===Wf||a===Xf||a===Yf)throw ba(\"isecff\",b);}}function ld(a,b){if(a&&(a===(0).constructor||a===\n(!1).constructor||a===\"\".constructor||a==={}.constructor||a===[].constructor||a===Function.constructor))throw ba(\"isecaf\",b);}function Zf(a,b){return\"undefined\"!==typeof a?a:b}function md(a,b){return\"undefined\"===typeof a?b:\"undefined\"===typeof b?a:a+b}function W(a,b){var d,c;switch(a.type){case s.Program:d=!0;n(a.body,function(a){W(a.expression,b);d=d&&a.expression.constant});a.constant=d;break;case s.Literal:a.constant=!0;a.toWatch=[];break;case s.UnaryExpression:W(a.argument,b);a.constant=a.argument.constant;\na.toWatch=a.argument.toWatch;break;case s.BinaryExpression:W(a.left,b);W(a.right,b);a.constant=a.left.constant&&a.right.constant;a.toWatch=a.left.toWatch.concat(a.right.toWatch);break;case s.LogicalExpression:W(a.left,b);W(a.right,b);a.constant=a.left.constant&&a.right.constant;a.toWatch=a.constant?[]:[a];break;case s.ConditionalExpression:W(a.test,b);W(a.alternate,b);W(a.consequent,b);a.constant=a.test.constant&&a.alternate.constant&&a.consequent.constant;a.toWatch=a.constant?[]:[a];break;case s.Identifier:a.constant=\n!1;a.toWatch=[a];break;case s.MemberExpression:W(a.object,b);a.computed&&W(a.property,b);a.constant=a.object.constant&&(!a.computed||a.property.constant);a.toWatch=[a];break;case s.CallExpression:d=a.filter?!b(a.callee.name).$stateful:!1;c=[];n(a.arguments,function(a){W(a,b);d=d&&a.constant;a.constant||c.push.apply(c,a.toWatch)});a.constant=d;a.toWatch=a.filter&&!b(a.callee.name).$stateful?c:[a];break;case s.AssignmentExpression:W(a.left,b);W(a.right,b);a.constant=a.left.constant&&a.right.constant;\na.toWatch=[a];break;case s.ArrayExpression:d=!0;c=[];n(a.elements,function(a){W(a,b);d=d&&a.constant;a.constant||c.push.apply(c,a.toWatch)});a.constant=d;a.toWatch=c;break;case s.ObjectExpression:d=!0;c=[];n(a.properties,function(a){W(a.value,b);d=d&&a.value.constant;a.value.constant||c.push.apply(c,a.value.toWatch)});a.constant=d;a.toWatch=c;break;case s.ThisExpression:a.constant=!1,a.toWatch=[]}}function nd(a){if(1==a.length){a=a[0].expression;var b=a.toWatch;return 1!==b.length?b:b[0]!==a?b:u}}\nfunction od(a){return a.type===s.Identifier||a.type===s.MemberExpression}function pd(a){if(1===a.body.length&&od(a.body[0].expression))return{type:s.AssignmentExpression,left:a.body[0].expression,right:{type:s.NGValueParameter},operator:\"=\"}}function qd(a){return 0===a.body.length||1===a.body.length&&(a.body[0].expression.type===s.Literal||a.body[0].expression.type===s.ArrayExpression||a.body[0].expression.type===s.ObjectExpression)}function rd(a,b){this.astBuilder=a;this.$filter=b}function sd(a,\nb){this.astBuilder=a;this.$filter=b}function Fb(a){return\"constructor\"==a}function ec(a){return z(a.valueOf)?a.valueOf():$f.call(a)}function kf(){var a=$(),b=$();this.$get=[\"$filter\",function(d){function c(a,b){return null==a||null==b?a===b:\"object\"===typeof a&&(a=ec(a),\"object\"===typeof a)?!1:a===b||a!==a&&b!==b}function e(a,b,d,e,f){var g=e.inputs,h;if(1===g.length){var k=c,g=g[0];return a.$watch(function(a){var b=g(a);c(b,k)||(h=e(a,u,u,[b]),k=b&&ec(b));return h},b,d,f)}for(var l=[],m=[],r=0,n=\ng.length;r<n;r++)l[r]=c,m[r]=null;return a.$watch(function(a){for(var b=!1,d=0,f=g.length;d<f;d++){var k=g[d](a);if(b||(b=!c(k,l[d])))m[d]=k,l[d]=k&&ec(k)}b&&(h=e(a,u,u,m));return h},b,d,f)}function f(a,b,c,d){var e,f;return e=a.$watch(function(a){return d(a)},function(a,c,d){f=a;z(b)&&b.apply(this,arguments);y(a)&&d.$$postDigest(function(){y(f)&&e()})},c)}function g(a,b,c,d){function e(a){var b=!0;n(a,function(a){y(a)||(b=!1)});return b}var f,g;return f=a.$watch(function(a){return d(a)},function(a,\nc,d){g=a;z(b)&&b.call(this,a,c,d);e(a)&&d.$$postDigest(function(){e(g)&&f()})},c)}function h(a,b,c,d){var e;return e=a.$watch(function(a){return d(a)},function(a,c,d){z(b)&&b.apply(this,arguments);e()},c)}function k(a,b){if(!b)return a;var c=a.$$watchDelegate,d=!1,c=c!==g&&c!==f?function(c,e,f,g){f=d&&g?g[0]:a(c,e,f,g);return b(f,c,e)}:function(c,d,e,f){e=a(c,d,e,f);c=b(e,c,d);return y(e)?c:e};a.$$watchDelegate&&a.$$watchDelegate!==e?c.$$watchDelegate=a.$$watchDelegate:b.$stateful||(c.$$watchDelegate=\ne,d=!a.inputs,c.inputs=a.inputs?a.inputs:[a]);return c}var l=Ba().noUnsafeEval,m={csp:l,expensiveChecks:!1},r={csp:l,expensiveChecks:!0};return function(c,l,v){var n,p,q;switch(typeof c){case \"string\":q=c=c.trim();var w=v?b:a;n=w[q];n||(\":\"===c.charAt(0)&&\":\"===c.charAt(1)&&(p=!0,c=c.substring(2)),v=v?r:m,n=new fc(v),n=(new gc(n,d,v)).parse(c),n.constant?n.$$watchDelegate=h:p?n.$$watchDelegate=n.literal?g:f:n.inputs&&(n.$$watchDelegate=e),w[q]=n);return k(n,l);case \"function\":return k(c,l);default:return x}}}]}\nfunction mf(){this.$get=[\"$rootScope\",\"$exceptionHandler\",function(a,b){return td(function(b){a.$evalAsync(b)},b)}]}function nf(){this.$get=[\"$browser\",\"$exceptionHandler\",function(a,b){return td(function(b){a.defer(b)},b)}]}function td(a,b){function d(a,b,c){function d(b){return function(c){e||(e=!0,b.call(a,c))}}var e=!1;return[d(b),d(c)]}function c(){this.$$state={status:0}}function e(a,b){return function(c){b.call(a,c)}}function f(c){!c.processScheduled&&c.pending&&(c.processScheduled=!0,a(function(){var a,\nd,e;e=c.pending;c.processScheduled=!1;c.pending=u;for(var f=0,g=e.length;f<g;++f){d=e[f][0];a=e[f][c.status];try{z(a)?d.resolve(a(c.value)):1===c.status?d.resolve(c.value):d.reject(c.value)}catch(h){d.reject(h),b(h)}}}))}function g(){this.promise=new c;this.resolve=e(this,this.resolve);this.reject=e(this,this.reject);this.notify=e(this,this.notify)}var h=G(\"$q\",TypeError);M(c.prototype,{then:function(a,b,c){if(q(a)&&q(b)&&q(c))return this;var d=new g;this.$$state.pending=this.$$state.pending||[];\nthis.$$state.pending.push([d,a,b,c]);0<this.$$state.status&&f(this.$$state);return d.promise},\"catch\":function(a){return this.then(null,a)},\"finally\":function(a,b){return this.then(function(b){return l(b,!0,a)},function(b){return l(b,!1,a)},b)}});M(g.prototype,{resolve:function(a){this.promise.$$state.status||(a===this.promise?this.$$reject(h(\"qcycle\",a)):this.$$resolve(a))},$$resolve:function(a){var c,e;e=d(this,this.$$resolve,this.$$reject);try{if(H(a)||z(a))c=a&&a.then;z(c)?(this.promise.$$state.status=\n-1,c.call(a,e[0],e[1],this.notify)):(this.promise.$$state.value=a,this.promise.$$state.status=1,f(this.promise.$$state))}catch(g){e[1](g),b(g)}},reject:function(a){this.promise.$$state.status||this.$$reject(a)},$$reject:function(a){this.promise.$$state.value=a;this.promise.$$state.status=2;f(this.promise.$$state)},notify:function(c){var d=this.promise.$$state.pending;0>=this.promise.$$state.status&&d&&d.length&&a(function(){for(var a,e,f=0,g=d.length;f<g;f++){e=d[f][0];a=d[f][3];try{e.notify(z(a)?\na(c):c)}catch(h){b(h)}}})}});var k=function(a,b){var c=new g;b?c.resolve(a):c.reject(a);return c.promise},l=function(a,b,c){var d=null;try{z(c)&&(d=c())}catch(e){return k(e,!1)}return d&&z(d.then)?d.then(function(){return k(a,b)},function(a){return k(a,!1)}):k(a,b)},m=function(a,b,c,d){var e=new g;e.resolve(a);return e.promise.then(b,c,d)},r=function A(a){if(!z(a))throw h(\"norslvr\",a);if(!(this instanceof A))return new A(a);var b=new g;a(function(a){b.resolve(a)},function(a){b.reject(a)});return b.promise};\nr.defer=function(){return new g};r.reject=function(a){var b=new g;b.reject(a);return b.promise};r.when=m;r.resolve=m;r.all=function(a){var b=new g,c=0,d=I(a)?[]:{};n(a,function(a,e){c++;m(a).then(function(a){d.hasOwnProperty(e)||(d[e]=a,--c||b.resolve(d))},function(a){d.hasOwnProperty(e)||b.reject(a)})});0===c&&b.resolve(d);return b.promise};return r}function wf(){this.$get=[\"$window\",\"$timeout\",function(a,b){var d=a.requestAnimationFrame||a.webkitRequestAnimationFrame,c=a.cancelAnimationFrame||a.webkitCancelAnimationFrame||\na.webkitCancelRequestAnimationFrame,e=!!d,f=e?function(a){var b=d(a);return function(){c(b)}}:function(a){var c=b(a,16.66,!1);return function(){b.cancel(c)}};f.supported=e;return f}]}function lf(){function a(a){function b(){this.$$watchers=this.$$nextSibling=this.$$childHead=this.$$childTail=null;this.$$listeners={};this.$$listenerCount={};this.$$watchersCount=0;this.$id=++nb;this.$$ChildScope=null}b.prototype=a;return b}var b=10,d=G(\"$rootScope\"),c=null,e=null;this.digestTtl=function(a){arguments.length&&\n(b=a);return b};this.$get=[\"$injector\",\"$exceptionHandler\",\"$parse\",\"$browser\",function(f,g,h,k){function l(a){a.currentScope.$$destroyed=!0}function m(a){9===Ha&&(a.$$childHead&&m(a.$$childHead),a.$$nextSibling&&m(a.$$nextSibling));a.$parent=a.$$nextSibling=a.$$prevSibling=a.$$childHead=a.$$childTail=a.$root=a.$$watchers=null}function r(){this.$id=++nb;this.$$phase=this.$parent=this.$$watchers=this.$$nextSibling=this.$$prevSibling=this.$$childHead=this.$$childTail=null;this.$root=this;this.$$destroyed=\n!1;this.$$listeners={};this.$$listenerCount={};this.$$watchersCount=0;this.$$isolateBindings=null}function t(a){if(w.$$phase)throw d(\"inprog\",w.$$phase);w.$$phase=a}function A(a,b){do a.$$watchersCount+=b;while(a=a.$parent)}function v(a,b,c){do a.$$listenerCount[c]-=b,0===a.$$listenerCount[c]&&delete a.$$listenerCount[c];while(a=a.$parent)}function s(){}function p(){for(;aa.length;)try{aa.shift()()}catch(a){g(a)}e=null}function C(){null===e&&(e=k.defer(function(){w.$apply(p)}))}r.prototype={constructor:r,\n$new:function(b,c){var d;c=c||this;b?(d=new r,d.$root=this.$root):(this.$$ChildScope||(this.$$ChildScope=a(this)),d=new this.$$ChildScope);d.$parent=c;d.$$prevSibling=c.$$childTail;c.$$childHead?(c.$$childTail.$$nextSibling=d,c.$$childTail=d):c.$$childHead=c.$$childTail=d;(b||c!=this)&&d.$on(\"$destroy\",l);return d},$watch:function(a,b,d,e){var f=h(a);if(f.$$watchDelegate)return f.$$watchDelegate(this,b,d,f,a);var g=this,k=g.$$watchers,l={fn:b,last:s,get:f,exp:e||a,eq:!!d};c=null;z(b)||(l.fn=x);k||\n(k=g.$$watchers=[]);k.unshift(l);A(this,1);return function(){0<=ab(k,l)&&A(g,-1);c=null}},$watchGroup:function(a,b){function c(){h=!1;k?(k=!1,b(e,e,g)):b(e,d,g)}var d=Array(a.length),e=Array(a.length),f=[],g=this,h=!1,k=!0;if(!a.length){var l=!0;g.$evalAsync(function(){l&&b(e,e,g)});return function(){l=!1}}if(1===a.length)return this.$watch(a[0],function(a,c,f){e[0]=a;d[0]=c;b(e,a===c?e:d,f)});n(a,function(a,b){var k=g.$watch(a,function(a,f){e[b]=a;d[b]=f;h||(h=!0,g.$evalAsync(c))});f.push(k)});return function(){for(;f.length;)f.shift()()}},\n$watchCollection:function(a,b){function c(a){e=a;var b,d,g,h;if(!q(e)){if(H(e))if(za(e))for(f!==r&&(f=r,n=f.length=0,l++),a=e.length,n!==a&&(l++,f.length=n=a),b=0;b<a;b++)h=f[b],g=e[b],d=h!==h&&g!==g,d||h===g||(l++,f[b]=g);else{f!==t&&(f=t={},n=0,l++);a=0;for(b in e)qa.call(e,b)&&(a++,g=e[b],h=f[b],b in f?(d=h!==h&&g!==g,d||h===g||(l++,f[b]=g)):(n++,f[b]=g,l++));if(n>a)for(b in l++,f)qa.call(e,b)||(n--,delete f[b])}else f!==e&&(f=e,l++);return l}}c.$stateful=!0;var d=this,e,f,g,k=1<b.length,l=0,m=\nh(a,c),r=[],t={},p=!0,n=0;return this.$watch(m,function(){p?(p=!1,b(e,e,d)):b(e,g,d);if(k)if(H(e))if(za(e)){g=Array(e.length);for(var a=0;a<e.length;a++)g[a]=e[a]}else for(a in g={},e)qa.call(e,a)&&(g[a]=e[a]);else g=e})},$digest:function(){var a,f,h,l,m,r,n=b,A,q=[],v,C;t(\"$digest\");k.$$checkUrlChange();this===w&&null!==e&&(k.defer.cancel(e),p());c=null;do{r=!1;for(A=this;u.length;){try{C=u.shift(),C.scope.$eval(C.expression,C.locals)}catch(aa){g(aa)}c=null}a:do{if(l=A.$$watchers)for(m=l.length;m--;)try{if(a=\nl[m])if((f=a.get(A))!==(h=a.last)&&!(a.eq?ma(f,h):\"number\"===typeof f&&\"number\"===typeof h&&isNaN(f)&&isNaN(h)))r=!0,c=a,a.last=a.eq?bb(f,null):f,a.fn(f,h===s?f:h,A),5>n&&(v=4-n,q[v]||(q[v]=[]),q[v].push({msg:z(a.exp)?\"fn: \"+(a.exp.name||a.exp.toString()):a.exp,newVal:f,oldVal:h}));else if(a===c){r=!1;break a}}catch(y){g(y)}if(!(l=A.$$watchersCount&&A.$$childHead||A!==this&&A.$$nextSibling))for(;A!==this&&!(l=A.$$nextSibling);)A=A.$parent}while(A=l);if((r||u.length)&&!n--)throw w.$$phase=null,d(\"infdig\",\nb,q);}while(r||u.length);for(w.$$phase=null;L.length;)try{L.shift()()}catch(x){g(x)}},$destroy:function(){if(!this.$$destroyed){var a=this.$parent;this.$broadcast(\"$destroy\");this.$$destroyed=!0;this===w&&k.$$applicationDestroyed();A(this,-this.$$watchersCount);for(var b in this.$$listenerCount)v(this,this.$$listenerCount[b],b);a&&a.$$childHead==this&&(a.$$childHead=this.$$nextSibling);a&&a.$$childTail==this&&(a.$$childTail=this.$$prevSibling);this.$$prevSibling&&(this.$$prevSibling.$$nextSibling=\nthis.$$nextSibling);this.$$nextSibling&&(this.$$nextSibling.$$prevSibling=this.$$prevSibling);this.$destroy=this.$digest=this.$apply=this.$evalAsync=this.$applyAsync=x;this.$on=this.$watch=this.$watchGroup=function(){return x};this.$$listeners={};this.$$nextSibling=null;m(this)}},$eval:function(a,b){return h(a)(this,b)},$evalAsync:function(a,b){w.$$phase||u.length||k.defer(function(){u.length&&w.$digest()});u.push({scope:this,expression:a,locals:b})},$$postDigest:function(a){L.push(a)},$apply:function(a){try{t(\"$apply\");\ntry{return this.$eval(a)}finally{w.$$phase=null}}catch(b){g(b)}finally{try{w.$digest()}catch(c){throw g(c),c;}}},$applyAsync:function(a){function b(){c.$eval(a)}var c=this;a&&aa.push(b);C()},$on:function(a,b){var c=this.$$listeners[a];c||(this.$$listeners[a]=c=[]);c.push(b);var d=this;do d.$$listenerCount[a]||(d.$$listenerCount[a]=0),d.$$listenerCount[a]++;while(d=d.$parent);var e=this;return function(){var d=c.indexOf(b);-1!==d&&(c[d]=null,v(e,1,a))}},$emit:function(a,b){var c=[],d,e=this,f=!1,h=\n{name:a,targetScope:e,stopPropagation:function(){f=!0},preventDefault:function(){h.defaultPrevented=!0},defaultPrevented:!1},k=cb([h],arguments,1),l,m;do{d=e.$$listeners[a]||c;h.currentScope=e;l=0;for(m=d.length;l<m;l++)if(d[l])try{d[l].apply(null,k)}catch(r){g(r)}else d.splice(l,1),l--,m--;if(f)return h.currentScope=null,h;e=e.$parent}while(e);h.currentScope=null;return h},$broadcast:function(a,b){var c=this,d=this,e={name:a,targetScope:this,preventDefault:function(){e.defaultPrevented=!0},defaultPrevented:!1};\nif(!this.$$listenerCount[a])return e;for(var f=cb([e],arguments,1),h,k;c=d;){e.currentScope=c;d=c.$$listeners[a]||[];h=0;for(k=d.length;h<k;h++)if(d[h])try{d[h].apply(null,f)}catch(l){g(l)}else d.splice(h,1),h--,k--;if(!(d=c.$$listenerCount[a]&&c.$$childHead||c!==this&&c.$$nextSibling))for(;c!==this&&!(d=c.$$nextSibling);)c=c.$parent}e.currentScope=null;return e}};var w=new r,u=w.$$asyncQueue=[],L=w.$$postDigestQueue=[],aa=w.$$applyAsyncQueue=[];return w}]}function ge(){var a=/^\\s*(https?|ftp|mailto|tel|file):/,\nb=/^\\s*((https?|ftp|file|blob):|data:image\\/)/;this.aHrefSanitizationWhitelist=function(b){return y(b)?(a=b,this):a};this.imgSrcSanitizationWhitelist=function(a){return y(a)?(b=a,this):b};this.$get=function(){return function(d,c){var e=c?b:a,f;f=wa(d).href;return\"\"===f||f.match(e)?d:\"unsafe:\"+f}}}function ag(a){if(\"self\"===a)return a;if(E(a)){if(-1<a.indexOf(\"***\"))throw ya(\"iwcard\",a);a=ud(a).replace(\"\\\\*\\\\*\",\".*\").replace(\"\\\\*\",\"[^:/.?&;]*\");return new RegExp(\"^\"+a+\"$\")}if(Ma(a))return new RegExp(\"^\"+\na.source+\"$\");throw ya(\"imatcher\");}function vd(a){var b=[];y(a)&&n(a,function(a){b.push(ag(a))});return b}function pf(){this.SCE_CONTEXTS=la;var a=[\"self\"],b=[];this.resourceUrlWhitelist=function(b){arguments.length&&(a=vd(b));return a};this.resourceUrlBlacklist=function(a){arguments.length&&(b=vd(a));return b};this.$get=[\"$injector\",function(d){function c(a,b){return\"self\"===a?ed(b):!!a.exec(b.href)}function e(a){var b=function(a){this.$$unwrapTrustedValue=function(){return a}};a&&(b.prototype=\nnew a);b.prototype.valueOf=function(){return this.$$unwrapTrustedValue()};b.prototype.toString=function(){return this.$$unwrapTrustedValue().toString()};return b}var f=function(a){throw ya(\"unsafe\");};d.has(\"$sanitize\")&&(f=d.get(\"$sanitize\"));var g=e(),h={};h[la.HTML]=e(g);h[la.CSS]=e(g);h[la.URL]=e(g);h[la.JS]=e(g);h[la.RESOURCE_URL]=e(h[la.URL]);return{trustAs:function(a,b){var c=h.hasOwnProperty(a)?h[a]:null;if(!c)throw ya(\"icontext\",a,b);if(null===b||q(b)||\"\"===b)return b;if(\"string\"!==typeof b)throw ya(\"itype\",\na);return new c(b)},getTrusted:function(d,e){if(null===e||q(e)||\"\"===e)return e;var g=h.hasOwnProperty(d)?h[d]:null;if(g&&e instanceof g)return e.$$unwrapTrustedValue();if(d===la.RESOURCE_URL){var g=wa(e.toString()),r,t,n=!1;r=0;for(t=a.length;r<t;r++)if(c(a[r],g)){n=!0;break}if(n)for(r=0,t=b.length;r<t;r++)if(c(b[r],g)){n=!1;break}if(n)return e;throw ya(\"insecurl\",e.toString());}if(d===la.HTML)return f(e);throw ya(\"unsafe\");},valueOf:function(a){return a instanceof g?a.$$unwrapTrustedValue():a}}}]}\nfunction of(){var a=!0;this.enabled=function(b){arguments.length&&(a=!!b);return a};this.$get=[\"$parse\",\"$sceDelegate\",function(b,d){if(a&&8>Ha)throw ya(\"iequirks\");var c=ia(la);c.isEnabled=function(){return a};c.trustAs=d.trustAs;c.getTrusted=d.getTrusted;c.valueOf=d.valueOf;a||(c.trustAs=c.getTrusted=function(a,b){return b},c.valueOf=Ya);c.parseAs=function(a,d){var e=b(d);return e.literal&&e.constant?e:b(d,function(b){return c.getTrusted(a,b)})};var e=c.parseAs,f=c.getTrusted,g=c.trustAs;n(la,function(a,\nb){var d=F(b);c[fb(\"parse_as_\"+d)]=function(b){return e(a,b)};c[fb(\"get_trusted_\"+d)]=function(b){return f(a,b)};c[fb(\"trust_as_\"+d)]=function(b){return g(a,b)}});return c}]}function qf(){this.$get=[\"$window\",\"$document\",function(a,b){var d={},c=ea((/android (\\d+)/.exec(F((a.navigator||{}).userAgent))||[])[1]),e=/Boxee/i.test((a.navigator||{}).userAgent),f=b[0]||{},g,h=/^(Moz|webkit|ms)(?=[A-Z])/,k=f.body&&f.body.style,l=!1,m=!1;if(k){for(var r in k)if(l=h.exec(r)){g=l[0];g=g.substr(0,1).toUpperCase()+\ng.substr(1);break}g||(g=\"WebkitOpacity\"in k&&\"webkit\");l=!!(\"transition\"in k||g+\"Transition\"in k);m=!!(\"animation\"in k||g+\"Animation\"in k);!c||l&&m||(l=E(k.webkitTransition),m=E(k.webkitAnimation))}return{history:!(!a.history||!a.history.pushState||4>c||e),hasEvent:function(a){if(\"input\"===a&&11>=Ha)return!1;if(q(d[a])){var b=f.createElement(\"div\");d[a]=\"on\"+a in b}return d[a]},csp:Ba(),vendorPrefix:g,transitions:l,animations:m,android:c}}]}function sf(){this.$get=[\"$templateCache\",\"$http\",\"$q\",\"$sce\",\nfunction(a,b,d,c){function e(f,g){e.totalPendingRequests++;E(f)&&a.get(f)||(f=c.getTrustedResourceUrl(f));var h=b.defaults&&b.defaults.transformResponse;I(h)?h=h.filter(function(a){return a!==$b}):h===$b&&(h=null);return b.get(f,{cache:a,transformResponse:h})[\"finally\"](function(){e.totalPendingRequests--}).then(function(b){a.put(f,b.data);return b.data},function(a){if(!g)throw ha(\"tpload\",f,a.status,a.statusText);return d.reject(a)})}e.totalPendingRequests=0;return e}]}function tf(){this.$get=[\"$rootScope\",\n\"$browser\",\"$location\",function(a,b,d){return{findBindings:function(a,b,d){a=a.getElementsByClassName(\"ng-binding\");var g=[];n(a,function(a){var c=fa.element(a).data(\"$binding\");c&&n(c,function(c){d?(new RegExp(\"(^|\\\\s)\"+ud(b)+\"(\\\\s|\\\\||$)\")).test(c)&&g.push(a):-1!=c.indexOf(b)&&g.push(a)})});return g},findModels:function(a,b,d){for(var g=[\"ng-\",\"data-ng-\",\"ng\\\\:\"],h=0;h<g.length;++h){var k=a.querySelectorAll(\"[\"+g[h]+\"model\"+(d?\"=\":\"*=\")+'\"'+b+'\"]');if(k.length)return k}},getLocation:function(){return d.url()},\nsetLocation:function(b){b!==d.url()&&(d.url(b),a.$digest())},whenStable:function(a){b.notifyWhenNoOutstandingRequests(a)}}}]}function uf(){this.$get=[\"$rootScope\",\"$browser\",\"$q\",\"$$q\",\"$exceptionHandler\",function(a,b,d,c,e){function f(f,k,l){z(f)||(l=k,k=f,f=x);var m=ra.call(arguments,3),r=y(l)&&!l,t=(r?c:d).defer(),n=t.promise,q;q=b.defer(function(){try{t.resolve(f.apply(null,m))}catch(b){t.reject(b),e(b)}finally{delete g[n.$$timeoutId]}r||a.$apply()},k);n.$$timeoutId=q;g[q]=t;return n}var g={};\nf.cancel=function(a){return a&&a.$$timeoutId in g?(g[a.$$timeoutId].reject(\"canceled\"),delete g[a.$$timeoutId],b.defer.cancel(a.$$timeoutId)):!1};return f}]}function wa(a){Ha&&(Y.setAttribute(\"href\",a),a=Y.href);Y.setAttribute(\"href\",a);return{href:Y.href,protocol:Y.protocol?Y.protocol.replace(/:$/,\"\"):\"\",host:Y.host,search:Y.search?Y.search.replace(/^\\?/,\"\"):\"\",hash:Y.hash?Y.hash.replace(/^#/,\"\"):\"\",hostname:Y.hostname,port:Y.port,pathname:\"/\"===Y.pathname.charAt(0)?Y.pathname:\"/\"+Y.pathname}}function ed(a){a=\nE(a)?wa(a):a;return a.protocol===wd.protocol&&a.host===wd.host}function vf(){this.$get=na(S)}function xd(a){function b(a){try{return decodeURIComponent(a)}catch(b){return a}}var d=a[0]||{},c={},e=\"\";return function(){var a,g,h,k,l;a=d.cookie||\"\";if(a!==e)for(e=a,a=e.split(\"; \"),c={},h=0;h<a.length;h++)g=a[h],k=g.indexOf(\"=\"),0<k&&(l=b(g.substring(0,k)),q(c[l])&&(c[l]=b(g.substring(k+1))));return c}}function zf(){this.$get=xd}function Jc(a){function b(d,c){if(H(d)){var e={};n(d,function(a,c){e[c]=\nb(c,a)});return e}return a.factory(d+\"Filter\",c)}this.register=b;this.$get=[\"$injector\",function(a){return function(b){return a.get(b+\"Filter\")}}];b(\"currency\",yd);b(\"date\",zd);b(\"filter\",bg);b(\"json\",cg);b(\"limitTo\",dg);b(\"lowercase\",eg);b(\"number\",Ad);b(\"orderBy\",Bd);b(\"uppercase\",fg)}function bg(){return function(a,b,d){if(!za(a)){if(null==a)return a;throw G(\"filter\")(\"notarray\",a);}var c;switch(hc(b)){case \"function\":break;case \"boolean\":case \"null\":case \"number\":case \"string\":c=!0;case \"object\":b=\ngg(b,d,c);break;default:return a}return Array.prototype.filter.call(a,b)}}function gg(a,b,d){var c=H(a)&&\"$\"in a;!0===b?b=ma:z(b)||(b=function(a,b){if(q(a))return!1;if(null===a||null===b)return a===b;if(H(b)||H(a)&&!qc(a))return!1;a=F(\"\"+a);b=F(\"\"+b);return-1!==a.indexOf(b)});return function(e){return c&&!H(e)?Ka(e,a.$,b,!1):Ka(e,a,b,d)}}function Ka(a,b,d,c,e){var f=hc(a),g=hc(b);if(\"string\"===g&&\"!\"===b.charAt(0))return!Ka(a,b.substring(1),d,c);if(I(a))return a.some(function(a){return Ka(a,b,d,c)});\nswitch(f){case \"object\":var h;if(c){for(h in a)if(\"$\"!==h.charAt(0)&&Ka(a[h],b,d,!0))return!0;return e?!1:Ka(a,b,d,!1)}if(\"object\"===g){for(h in b)if(e=b[h],!z(e)&&!q(e)&&(f=\"$\"===h,!Ka(f?a:a[h],e,d,f,f)))return!1;return!0}return d(a,b);case \"function\":return!1;default:return d(a,b)}}function hc(a){return null===a?\"null\":typeof a}function yd(a){var b=a.NUMBER_FORMATS;return function(a,c,e){q(c)&&(c=b.CURRENCY_SYM);q(e)&&(e=b.PATTERNS[1].maxFrac);return null==a?a:Cd(a,b.PATTERNS[1],b.GROUP_SEP,b.DECIMAL_SEP,\ne).replace(/\\u00A4/g,c)}}function Ad(a){var b=a.NUMBER_FORMATS;return function(a,c){return null==a?a:Cd(a,b.PATTERNS[0],b.GROUP_SEP,b.DECIMAL_SEP,c)}}function Cd(a,b,d,c,e){if(H(a))return\"\";var f=0>a;a=Math.abs(a);var g=Infinity===a;if(!g&&!isFinite(a))return\"\";var h=a+\"\",k=\"\",l=!1,m=[];g&&(k=\"\\u221e\");if(!g&&-1!==h.indexOf(\"e\")){var r=h.match(/([\\d\\.]+)e(-?)(\\d+)/);r&&\"-\"==r[2]&&r[3]>e+1?a=0:(k=h,l=!0)}if(g||l)0<e&&1>a&&(k=a.toFixed(e),a=parseFloat(k),k=k.replace(ic,c));else{g=(h.split(ic)[1]||\"\").length;\nq(e)&&(e=Math.min(Math.max(b.minFrac,g),b.maxFrac));a=+(Math.round(+(a.toString()+\"e\"+e)).toString()+\"e\"+-e);var g=(\"\"+a).split(ic),h=g[0],g=g[1]||\"\",r=0,t=b.lgSize,n=b.gSize;if(h.length>=t+n)for(r=h.length-t,l=0;l<r;l++)0===(r-l)%n&&0!==l&&(k+=d),k+=h.charAt(l);for(l=r;l<h.length;l++)0===(h.length-l)%t&&0!==l&&(k+=d),k+=h.charAt(l);for(;g.length<e;)g+=\"0\";e&&\"0\"!==e&&(k+=c+g.substr(0,e))}0===a&&(f=!1);m.push(f?b.negPre:b.posPre,k,f?b.negSuf:b.posSuf);return m.join(\"\")}function Gb(a,b,d){var c=\"\";\n0>a&&(c=\"-\",a=-a);for(a=\"\"+a;a.length<b;)a=\"0\"+a;d&&(a=a.substr(a.length-b));return c+a}function ca(a,b,d,c){d=d||0;return function(e){e=e[\"get\"+a]();if(0<d||e>-d)e+=d;0===e&&-12==d&&(e=12);return Gb(e,b,c)}}function Hb(a,b){return function(d,c){var e=d[\"get\"+a](),f=sb(b?\"SHORT\"+a:a);return c[f][e]}}function Dd(a){var b=(new Date(a,0,1)).getDay();return new Date(a,0,(4>=b?5:12)-b)}function Ed(a){return function(b){var d=Dd(b.getFullYear());b=+new Date(b.getFullYear(),b.getMonth(),b.getDate()+(4-b.getDay()))-\n+d;b=1+Math.round(b/6048E5);return Gb(b,a)}}function jc(a,b){return 0>=a.getFullYear()?b.ERAS[0]:b.ERAS[1]}function zd(a){function b(a){var b;if(b=a.match(d)){a=new Date(0);var f=0,g=0,h=b[8]?a.setUTCFullYear:a.setFullYear,k=b[8]?a.setUTCHours:a.setHours;b[9]&&(f=ea(b[9]+b[10]),g=ea(b[9]+b[11]));h.call(a,ea(b[1]),ea(b[2])-1,ea(b[3]));f=ea(b[4]||0)-f;g=ea(b[5]||0)-g;h=ea(b[6]||0);b=Math.round(1E3*parseFloat(\"0.\"+(b[7]||0)));k.call(a,f,g,h,b)}return a}var d=/^(\\d{4})-?(\\d\\d)-?(\\d\\d)(?:T(\\d\\d)(?::?(\\d\\d)(?::?(\\d\\d)(?:\\.(\\d+))?)?)?(Z|([+-])(\\d\\d):?(\\d\\d))?)?$/;\nreturn function(c,d,f){var g=\"\",h=[],k,l;d=d||\"mediumDate\";d=a.DATETIME_FORMATS[d]||d;E(c)&&(c=hg.test(c)?ea(c):b(c));Q(c)&&(c=new Date(c));if(!da(c)||!isFinite(c.getTime()))return c;for(;d;)(l=ig.exec(d))?(h=cb(h,l,1),d=h.pop()):(h.push(d),d=null);var m=c.getTimezoneOffset();f&&(m=vc(f,c.getTimezoneOffset()),c=Pb(c,f,!0));n(h,function(b){k=jg[b];g+=k?k(c,a.DATETIME_FORMATS,m):b.replace(/(^'|'$)/g,\"\").replace(/''/g,\"'\")});return g}}function cg(){return function(a,b){q(b)&&(b=2);return db(a,b)}}function dg(){return function(a,\nb,d){b=Infinity===Math.abs(Number(b))?Number(b):ea(b);if(isNaN(b))return a;Q(a)&&(a=a.toString());if(!I(a)&&!E(a))return a;d=!d||isNaN(d)?0:ea(d);d=0>d?Math.max(0,a.length+d):d;return 0<=b?a.slice(d,d+b):0===d?a.slice(b,a.length):a.slice(Math.max(0,d+b),d)}}function Bd(a){function b(b,d){d=d?-1:1;return b.map(function(b){var c=1,h=Ya;if(z(b))h=b;else if(E(b)){if(\"+\"==b.charAt(0)||\"-\"==b.charAt(0))c=\"-\"==b.charAt(0)?-1:1,b=b.substring(1);if(\"\"!==b&&(h=a(b),h.constant))var k=h(),h=function(a){return a[k]}}return{get:h,\ndescending:c*d}})}function d(a){switch(typeof a){case \"number\":case \"boolean\":case \"string\":return!0;default:return!1}}return function(a,e,f){if(!za(a))return a;I(e)||(e=[e]);0===e.length&&(e=[\"+\"]);var g=b(e,f);g.push({get:function(){return{}},descending:f?-1:1});a=Array.prototype.map.call(a,function(a,b){return{value:a,predicateValues:g.map(function(c){var e=c.get(a);c=typeof e;if(null===e)c=\"string\",e=\"null\";else if(\"string\"===c)e=e.toLowerCase();else if(\"object\"===c)a:{if(\"function\"===typeof e.valueOf&&\n(e=e.valueOf(),d(e)))break a;if(qc(e)&&(e=e.toString(),d(e)))break a;e=b}return{value:e,type:c}})}});a.sort(function(a,b){for(var c=0,d=0,e=g.length;d<e;++d){var c=a.predicateValues[d],f=b.predicateValues[d],n=0;c.type===f.type?c.value!==f.value&&(n=c.value<f.value?-1:1):n=c.type<f.type?-1:1;if(c=n*g[d].descending)break}return c});return a=a.map(function(a){return a.value})}}function La(a){z(a)&&(a={link:a});a.restrict=a.restrict||\"AC\";return na(a)}function Fd(a,b,d,c,e){var f=this,g=[];f.$error=\n{};f.$$success={};f.$pending=u;f.$name=e(b.name||b.ngForm||\"\")(d);f.$dirty=!1;f.$pristine=!0;f.$valid=!0;f.$invalid=!1;f.$submitted=!1;f.$$parentForm=Ib;f.$rollbackViewValue=function(){n(g,function(a){a.$rollbackViewValue()})};f.$commitViewValue=function(){n(g,function(a){a.$commitViewValue()})};f.$addControl=function(a){Ra(a.$name,\"input\");g.push(a);a.$name&&(f[a.$name]=a);a.$$parentForm=f};f.$$renameControl=function(a,b){var c=a.$name;f[c]===a&&delete f[c];f[b]=a;a.$name=b};f.$removeControl=function(a){a.$name&&\nf[a.$name]===a&&delete f[a.$name];n(f.$pending,function(b,c){f.$setValidity(c,null,a)});n(f.$error,function(b,c){f.$setValidity(c,null,a)});n(f.$$success,function(b,c){f.$setValidity(c,null,a)});ab(g,a);a.$$parentForm=Ib};Gd({ctrl:this,$element:a,set:function(a,b,c){var d=a[b];d?-1===d.indexOf(c)&&d.push(c):a[b]=[c]},unset:function(a,b,c){var d=a[b];d&&(ab(d,c),0===d.length&&delete a[b])},$animate:c});f.$setDirty=function(){c.removeClass(a,Wa);c.addClass(a,Jb);f.$dirty=!0;f.$pristine=!1;f.$$parentForm.$setDirty()};\nf.$setPristine=function(){c.setClass(a,Wa,Jb+\" ng-submitted\");f.$dirty=!1;f.$pristine=!0;f.$submitted=!1;n(g,function(a){a.$setPristine()})};f.$setUntouched=function(){n(g,function(a){a.$setUntouched()})};f.$setSubmitted=function(){c.addClass(a,\"ng-submitted\");f.$submitted=!0;f.$$parentForm.$setSubmitted()}}function kc(a){a.$formatters.push(function(b){return a.$isEmpty(b)?b:b.toString()})}function jb(a,b,d,c,e,f){var g=F(b[0].type);if(!e.android){var h=!1;b.on(\"compositionstart\",function(a){h=!0});\nb.on(\"compositionend\",function(){h=!1;k()})}var k=function(a){l&&(f.defer.cancel(l),l=null);if(!h){var e=b.val();a=a&&a.type;\"password\"===g||d.ngTrim&&\"false\"===d.ngTrim||(e=U(e));(c.$viewValue!==e||\"\"===e&&c.$$hasNativeValidators)&&c.$setViewValue(e,a)}};if(e.hasEvent(\"input\"))b.on(\"input\",k);else{var l,m=function(a,b,c){l||(l=f.defer(function(){l=null;b&&b.value===c||k(a)}))};b.on(\"keydown\",function(a){var b=a.keyCode;91===b||15<b&&19>b||37<=b&&40>=b||m(a,this,this.value)});if(e.hasEvent(\"paste\"))b.on(\"paste cut\",\nm)}b.on(\"change\",k);c.$render=function(){var a=c.$isEmpty(c.$viewValue)?\"\":c.$viewValue;b.val()!==a&&b.val(a)}}function Kb(a,b){return function(d,c){var e,f;if(da(d))return d;if(E(d)){'\"'==d.charAt(0)&&'\"'==d.charAt(d.length-1)&&(d=d.substring(1,d.length-1));if(kg.test(d))return new Date(d);a.lastIndex=0;if(e=a.exec(d))return e.shift(),f=c?{yyyy:c.getFullYear(),MM:c.getMonth()+1,dd:c.getDate(),HH:c.getHours(),mm:c.getMinutes(),ss:c.getSeconds(),sss:c.getMilliseconds()/1E3}:{yyyy:1970,MM:1,dd:1,HH:0,\nmm:0,ss:0,sss:0},n(e,function(a,c){c<b.length&&(f[b[c]]=+a)}),new Date(f.yyyy,f.MM-1,f.dd,f.HH,f.mm,f.ss||0,1E3*f.sss||0)}return NaN}}function kb(a,b,d,c){return function(e,f,g,h,k,l,m){function r(a){return a&&!(a.getTime&&a.getTime()!==a.getTime())}function n(a){return y(a)&&!da(a)?d(a)||u:a}Hd(e,f,g,h);jb(e,f,g,h,k,l);var A=h&&h.$options&&h.$options.timezone,v;h.$$parserName=a;h.$parsers.push(function(a){return h.$isEmpty(a)?null:b.test(a)?(a=d(a,v),A&&(a=Pb(a,A)),a):u});h.$formatters.push(function(a){if(a&&\n!da(a))throw lb(\"datefmt\",a);if(r(a))return(v=a)&&A&&(v=Pb(v,A,!0)),m(\"date\")(a,c,A);v=null;return\"\"});if(y(g.min)||g.ngMin){var s;h.$validators.min=function(a){return!r(a)||q(s)||d(a)>=s};g.$observe(\"min\",function(a){s=n(a);h.$validate()})}if(y(g.max)||g.ngMax){var p;h.$validators.max=function(a){return!r(a)||q(p)||d(a)<=p};g.$observe(\"max\",function(a){p=n(a);h.$validate()})}}}function Hd(a,b,d,c){(c.$$hasNativeValidators=H(b[0].validity))&&c.$parsers.push(function(a){var c=b.prop(\"validity\")||{};\nreturn c.badInput&&!c.typeMismatch?u:a})}function Id(a,b,d,c,e){if(y(c)){a=a(c);if(!a.constant)throw lb(\"constexpr\",d,c);return a(b)}return e}function lc(a,b){a=\"ngClass\"+a;return[\"$animate\",function(d){function c(a,b){var c=[],d=0;a:for(;d<a.length;d++){for(var e=a[d],m=0;m<b.length;m++)if(e==b[m])continue a;c.push(e)}return c}function e(a){var b=[];return I(a)?(n(a,function(a){b=b.concat(e(a))}),b):E(a)?a.split(\" \"):H(a)?(n(a,function(a,c){a&&(b=b.concat(c.split(\" \")))}),b):a}return{restrict:\"AC\",\nlink:function(f,g,h){function k(a,b){var c=g.data(\"$classCounts\")||$(),d=[];n(a,function(a){if(0<b||c[a])c[a]=(c[a]||0)+b,c[a]===+(0<b)&&d.push(a)});g.data(\"$classCounts\",c);return d.join(\" \")}function l(a){if(!0===b||f.$index%2===b){var l=e(a||[]);if(!m){var n=k(l,1);h.$addClass(n)}else if(!ma(a,m)){var q=e(m),n=c(l,q),l=c(q,l),n=k(n,1),l=k(l,-1);n&&n.length&&d.addClass(g,n);l&&l.length&&d.removeClass(g,l)}}m=ia(a)}var m;f.$watch(h[a],l,!0);h.$observe(\"class\",function(b){l(f.$eval(h[a]))});\"ngClass\"!==\na&&f.$watch(\"$index\",function(c,d){var g=c&1;if(g!==(d&1)){var l=e(f.$eval(h[a]));g===b?(g=k(l,1),h.$addClass(g)):(g=k(l,-1),h.$removeClass(g))}})}}}]}function Gd(a){function b(a,b){b&&!f[a]?(k.addClass(e,a),f[a]=!0):!b&&f[a]&&(k.removeClass(e,a),f[a]=!1)}function d(a,c){a=a?\"-\"+zc(a,\"-\"):\"\";b(mb+a,!0===c);b(Jd+a,!1===c)}var c=a.ctrl,e=a.$element,f={},g=a.set,h=a.unset,k=a.$animate;f[Jd]=!(f[mb]=e.hasClass(mb));c.$setValidity=function(a,e,f){q(e)?(c.$pending||(c.$pending={}),g(c.$pending,a,f)):(c.$pending&&\nh(c.$pending,a,f),Kd(c.$pending)&&(c.$pending=u));$a(e)?e?(h(c.$error,a,f),g(c.$$success,a,f)):(g(c.$error,a,f),h(c.$$success,a,f)):(h(c.$error,a,f),h(c.$$success,a,f));c.$pending?(b(Ld,!0),c.$valid=c.$invalid=u,d(\"\",null)):(b(Ld,!1),c.$valid=Kd(c.$error),c.$invalid=!c.$valid,d(\"\",c.$valid));e=c.$pending&&c.$pending[a]?u:c.$error[a]?!1:c.$$success[a]?!0:null;d(a,e);c.$$parentForm.$setValidity(a,e,c)}}function Kd(a){if(a)for(var b in a)if(a.hasOwnProperty(b))return!1;return!0}var lg=/^\\/(.+)\\/([a-z]*)$/,\nF=function(a){return E(a)?a.toLowerCase():a},qa=Object.prototype.hasOwnProperty,sb=function(a){return E(a)?a.toUpperCase():a},Ha,B,oa,ra=[].slice,Pf=[].splice,mg=[].push,sa=Object.prototype.toString,rc=Object.getPrototypeOf,Aa=G(\"ng\"),fa=S.angular||(S.angular={}),Sb,nb=0;Ha=X.documentMode;x.$inject=[];Ya.$inject=[];var I=Array.isArray,Vd=/^\\[object (?:Uint8|Uint8Clamped|Uint16|Uint32|Int8|Int16|Int32|Float32|Float64)Array\\]$/,U=function(a){return E(a)?a.trim():a},ud=function(a){return a.replace(/([-()\\[\\]{}+?*.$\\^|,:#<!\\\\])/g,\n\"\\\\$1\").replace(/\\x08/g,\"\\\\x08\")},Ba=function(){if(!y(Ba.rules)){var a=X.querySelector(\"[ng-csp]\")||X.querySelector(\"[data-ng-csp]\");if(a){var b=a.getAttribute(\"ng-csp\")||a.getAttribute(\"data-ng-csp\");Ba.rules={noUnsafeEval:!b||-1!==b.indexOf(\"no-unsafe-eval\"),noInlineStyle:!b||-1!==b.indexOf(\"no-inline-style\")}}else{a=Ba;try{new Function(\"\"),b=!1}catch(d){b=!0}a.rules={noUnsafeEval:b,noInlineStyle:!1}}}return Ba.rules},pb=function(){if(y(pb.name_))return pb.name_;var a,b,d=Oa.length,c,e;for(b=0;b<\nd;++b)if(c=Oa[b],a=X.querySelector(\"[\"+c.replace(\":\",\"\\\\:\")+\"jq]\")){e=a.getAttribute(c+\"jq\");break}return pb.name_=e},Oa=[\"ng-\",\"data-ng-\",\"ng:\",\"x-ng-\"],be=/[A-Z]/g,Ac=!1,Rb,Na=3,fe={full:\"1.4.8\",major:1,minor:4,dot:8,codeName:\"ice-manipulation\"};N.expando=\"ng339\";var gb=N.cache={},Ff=1;N._data=function(a){return this.cache[a[this.expando]]||{}};var Af=/([\\:\\-\\_]+(.))/g,Bf=/^moz([A-Z])/,xb={mouseleave:\"mouseout\",mouseenter:\"mouseover\"},Ub=G(\"jqLite\"),Ef=/^<([\\w-]+)\\s*\\/?>(?:<\\/\\1>|)$/,Tb=/<|&#?\\w+;/,\nCf=/<([\\w:-]+)/,Df=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\\w:-]+)[^>]*)\\/>/gi,ka={option:[1,'<select multiple=\"multiple\">',\"</select>\"],thead:[1,\"<table>\",\"</table>\"],col:[2,\"<table><colgroup>\",\"</colgroup></table>\"],tr:[2,\"<table><tbody>\",\"</tbody></table>\"],td:[3,\"<table><tbody><tr>\",\"</tr></tbody></table>\"],_default:[0,\"\",\"\"]};ka.optgroup=ka.option;ka.tbody=ka.tfoot=ka.colgroup=ka.caption=ka.thead;ka.th=ka.td;var Kf=Node.prototype.contains||function(a){return!!(this.compareDocumentPosition(a)&\n16)},Pa=N.prototype={ready:function(a){function b(){d||(d=!0,a())}var d=!1;\"complete\"===X.readyState?setTimeout(b):(this.on(\"DOMContentLoaded\",b),N(S).on(\"load\",b))},toString:function(){var a=[];n(this,function(b){a.push(\"\"+b)});return\"[\"+a.join(\", \")+\"]\"},eq:function(a){return 0<=a?B(this[a]):B(this[this.length+a])},length:0,push:mg,sort:[].sort,splice:[].splice},Cb={};n(\"multiple selected checked disabled readOnly required open\".split(\" \"),function(a){Cb[F(a)]=a});var Rc={};n(\"input select option textarea button form details\".split(\" \"),\nfunction(a){Rc[a]=!0});var Zc={ngMinlength:\"minlength\",ngMaxlength:\"maxlength\",ngMin:\"min\",ngMax:\"max\",ngPattern:\"pattern\"};n({data:Wb,removeData:vb,hasData:function(a){for(var b in gb[a.ng339])return!0;return!1}},function(a,b){N[b]=a});n({data:Wb,inheritedData:Bb,scope:function(a){return B.data(a,\"$scope\")||Bb(a.parentNode||a,[\"$isolateScope\",\"$scope\"])},isolateScope:function(a){return B.data(a,\"$isolateScope\")||B.data(a,\"$isolateScopeNoTemplate\")},controller:Oc,injector:function(a){return Bb(a,\n\"$injector\")},removeAttr:function(a,b){a.removeAttribute(b)},hasClass:yb,css:function(a,b,d){b=fb(b);if(y(d))a.style[b]=d;else return a.style[b]},attr:function(a,b,d){var c=a.nodeType;if(c!==Na&&2!==c&&8!==c)if(c=F(b),Cb[c])if(y(d))d?(a[b]=!0,a.setAttribute(b,c)):(a[b]=!1,a.removeAttribute(c));else return a[b]||(a.attributes.getNamedItem(b)||x).specified?c:u;else if(y(d))a.setAttribute(b,d);else if(a.getAttribute)return a=a.getAttribute(b,2),null===a?u:a},prop:function(a,b,d){if(y(d))a[b]=d;else return a[b]},\ntext:function(){function a(a,d){if(q(d)){var c=a.nodeType;return 1===c||c===Na?a.textContent:\"\"}a.textContent=d}a.$dv=\"\";return a}(),val:function(a,b){if(q(b)){if(a.multiple&&\"select\"===ta(a)){var d=[];n(a.options,function(a){a.selected&&d.push(a.value||a.text)});return 0===d.length?null:d}return a.value}a.value=b},html:function(a,b){if(q(b))return a.innerHTML;ub(a,!0);a.innerHTML=b},empty:Pc},function(a,b){N.prototype[b]=function(b,c){var e,f,g=this.length;if(a!==Pc&&q(2==a.length&&a!==yb&&a!==Oc?\nb:c)){if(H(b)){for(e=0;e<g;e++)if(a===Wb)a(this[e],b);else for(f in b)a(this[e],f,b[f]);return this}e=a.$dv;g=q(e)?Math.min(g,1):g;for(f=0;f<g;f++){var h=a(this[f],b,c);e=e?e+h:h}return e}for(e=0;e<g;e++)a(this[e],b,c);return this}});n({removeData:vb,on:function(a,b,d,c){if(y(c))throw Ub(\"onargs\");if(Kc(a)){c=wb(a,!0);var e=c.events,f=c.handle;f||(f=c.handle=Hf(a,e));c=0<=b.indexOf(\" \")?b.split(\" \"):[b];for(var g=c.length,h=function(b,c,g){var h=e[b];h||(h=e[b]=[],h.specialHandlerWrapper=c,\"$destroy\"===\nb||g||a.addEventListener(b,f,!1));h.push(d)};g--;)b=c[g],xb[b]?(h(xb[b],Jf),h(b,u,!0)):h(b)}},off:Nc,one:function(a,b,d){a=B(a);a.on(b,function e(){a.off(b,d);a.off(b,e)});a.on(b,d)},replaceWith:function(a,b){var d,c=a.parentNode;ub(a);n(new N(b),function(b){d?c.insertBefore(b,d.nextSibling):c.replaceChild(b,a);d=b})},children:function(a){var b=[];n(a.childNodes,function(a){1===a.nodeType&&b.push(a)});return b},contents:function(a){return a.contentDocument||a.childNodes||[]},append:function(a,b){var d=\na.nodeType;if(1===d||11===d){b=new N(b);for(var d=0,c=b.length;d<c;d++)a.appendChild(b[d])}},prepend:function(a,b){if(1===a.nodeType){var d=a.firstChild;n(new N(b),function(b){a.insertBefore(b,d)})}},wrap:function(a,b){b=B(b).eq(0).clone()[0];var d=a.parentNode;d&&d.replaceChild(b,a);b.appendChild(a)},remove:Xb,detach:function(a){Xb(a,!0)},after:function(a,b){var d=a,c=a.parentNode;b=new N(b);for(var e=0,f=b.length;e<f;e++){var g=b[e];c.insertBefore(g,d.nextSibling);d=g}},addClass:Ab,removeClass:zb,\ntoggleClass:function(a,b,d){b&&n(b.split(\" \"),function(b){var e=d;q(e)&&(e=!yb(a,b));(e?Ab:zb)(a,b)})},parent:function(a){return(a=a.parentNode)&&11!==a.nodeType?a:null},next:function(a){return a.nextElementSibling},find:function(a,b){return a.getElementsByTagName?a.getElementsByTagName(b):[]},clone:Vb,triggerHandler:function(a,b,d){var c,e,f=b.type||b,g=wb(a);if(g=(g=g&&g.events)&&g[f])c={preventDefault:function(){this.defaultPrevented=!0},isDefaultPrevented:function(){return!0===this.defaultPrevented},\nstopImmediatePropagation:function(){this.immediatePropagationStopped=!0},isImmediatePropagationStopped:function(){return!0===this.immediatePropagationStopped},stopPropagation:x,type:f,target:a},b.type&&(c=M(c,b)),b=ia(g),e=d?[c].concat(d):[c],n(b,function(b){c.isImmediatePropagationStopped()||b.apply(a,e)})}},function(a,b){N.prototype[b]=function(b,c,e){for(var f,g=0,h=this.length;g<h;g++)q(f)?(f=a(this[g],b,c,e),y(f)&&(f=B(f))):Mc(f,a(this[g],b,c,e));return y(f)?f:this};N.prototype.bind=N.prototype.on;\nN.prototype.unbind=N.prototype.off});Sa.prototype={put:function(a,b){this[Ca(a,this.nextUid)]=b},get:function(a){return this[Ca(a,this.nextUid)]},remove:function(a){var b=this[a=Ca(a,this.nextUid)];delete this[a];return b}};var yf=[function(){this.$get=[function(){return Sa}]}],Tc=/^[^\\(]*\\(\\s*([^\\)]*)\\)/m,ng=/,/,og=/^\\s*(_?)(\\S+?)\\1\\s*$/,Sc=/((\\/\\/.*$)|(\\/\\*[\\s\\S]*?\\*\\/))/mg,Da=G(\"$injector\");eb.$$annotate=function(a,b,d){var c;if(\"function\"===typeof a){if(!(c=a.$inject)){c=[];if(a.length){if(b)throw E(d)&&\nd||(d=a.name||Lf(a)),Da(\"strictdi\",d);b=a.toString().replace(Sc,\"\");b=b.match(Tc);n(b[1].split(ng),function(a){a.replace(og,function(a,b,d){c.push(d)})})}a.$inject=c}}else I(a)?(b=a.length-1,Qa(a[b],\"fn\"),c=a.slice(0,b)):Qa(a,\"fn\",!0);return c};var Md=G(\"$animate\"),Ue=function(){this.$get=[\"$q\",\"$$rAF\",function(a,b){function d(){}d.all=x;d.chain=x;d.prototype={end:x,cancel:x,resume:x,pause:x,complete:x,then:function(c,d){return a(function(a){b(function(){a()})}).then(c,d)}};return d}]},Te=function(){var a=\nnew Sa,b=[];this.$get=[\"$$AnimateRunner\",\"$rootScope\",function(d,c){function e(a,b,c){var d=!1;b&&(b=E(b)?b.split(\" \"):I(b)?b:[],n(b,function(b){b&&(d=!0,a[b]=c)}));return d}function f(){n(b,function(b){var c=a.get(b);if(c){var d=Mf(b.attr(\"class\")),e=\"\",f=\"\";n(c,function(a,b){a!==!!d[b]&&(a?e+=(e.length?\" \":\"\")+b:f+=(f.length?\" \":\"\")+b)});n(b,function(a){e&&Ab(a,e);f&&zb(a,f)});a.remove(b)}});b.length=0}return{enabled:x,on:x,off:x,pin:x,push:function(g,h,k,l){l&&l();k=k||{};k.from&&g.css(k.from);\nk.to&&g.css(k.to);if(k.addClass||k.removeClass)if(h=k.addClass,l=k.removeClass,k=a.get(g)||{},h=e(k,h,!0),l=e(k,l,!1),h||l)a.put(g,k),b.push(g),1===b.length&&c.$$postDigest(f);return new d}}}]},Re=[\"$provide\",function(a){var b=this;this.$$registeredAnimations=Object.create(null);this.register=function(d,c){if(d&&\".\"!==d.charAt(0))throw Md(\"notcsel\",d);var e=d+\"-animation\";b.$$registeredAnimations[d.substr(1)]=e;a.factory(e,c)};this.classNameFilter=function(a){if(1===arguments.length&&(this.$$classNameFilter=\na instanceof RegExp?a:null)&&/(\\s+|\\/)ng-animate(\\s+|\\/)/.test(this.$$classNameFilter.toString()))throw Md(\"nongcls\",\"ng-animate\");return this.$$classNameFilter};this.$get=[\"$$animateQueue\",function(a){function b(a,c,d){if(d){var h;a:{for(h=0;h<d.length;h++){var k=d[h];if(1===k.nodeType){h=k;break a}}h=void 0}!h||h.parentNode||h.previousElementSibling||(d=null)}d?d.after(a):c.prepend(a)}return{on:a.on,off:a.off,pin:a.pin,enabled:a.enabled,cancel:function(a){a.end&&a.end()},enter:function(e,f,g,h){f=\nf&&B(f);g=g&&B(g);f=f||g.parent();b(e,f,g);return a.push(e,\"enter\",Ea(h))},move:function(e,f,g,h){f=f&&B(f);g=g&&B(g);f=f||g.parent();b(e,f,g);return a.push(e,\"move\",Ea(h))},leave:function(b,c){return a.push(b,\"leave\",Ea(c),function(){b.remove()})},addClass:function(b,c,g){g=Ea(g);g.addClass=hb(g.addclass,c);return a.push(b,\"addClass\",g)},removeClass:function(b,c,g){g=Ea(g);g.removeClass=hb(g.removeClass,c);return a.push(b,\"removeClass\",g)},setClass:function(b,c,g,h){h=Ea(h);h.addClass=hb(h.addClass,\nc);h.removeClass=hb(h.removeClass,g);return a.push(b,\"setClass\",h)},animate:function(b,c,g,h,k){k=Ea(k);k.from=k.from?M(k.from,c):c;k.to=k.to?M(k.to,g):g;k.tempClasses=hb(k.tempClasses,h||\"ng-inline-animate\");return a.push(b,\"animate\",k)}}}]}],Se=function(){this.$get=[\"$$rAF\",\"$q\",function(a,b){var d=function(){};d.prototype={done:function(a){this.defer&&this.defer[!0===a?\"reject\":\"resolve\"]()},end:function(){this.done()},cancel:function(){this.done(!0)},getPromise:function(){this.defer||(this.defer=\nb.defer());return this.defer.promise},then:function(a,b){return this.getPromise().then(a,b)},\"catch\":function(a){return this.getPromise()[\"catch\"](a)},\"finally\":function(a){return this.getPromise()[\"finally\"](a)}};return function(b,e){function f(){a(function(){e.addClass&&(b.addClass(e.addClass),e.addClass=null);e.removeClass&&(b.removeClass(e.removeClass),e.removeClass=null);e.to&&(b.css(e.to),e.to=null);g||h.done();g=!0});return h}e.cleanupStyles&&(e.from=e.to=null);e.from&&(b.css(e.from),e.from=\nnull);var g,h=new d;return{start:f,end:f}}}]},ha=G(\"$compile\");Cc.$inject=[\"$provide\",\"$$sanitizeUriProvider\"];var Vc=/^((?:x|data)[\\:\\-_])/i,Qf=G(\"$controller\"),Uc=/^(\\S+)(\\s+as\\s+(\\w+))?$/,$e=function(){this.$get=[\"$document\",function(a){return function(b){b?!b.nodeType&&b instanceof B&&(b=b[0]):b=a[0].body;return b.offsetWidth+1}}]},$c=\"application/json\",ac={\"Content-Type\":$c+\";charset=utf-8\"},Sf=/^\\[|^\\{(?!\\{)/,Tf={\"[\":/]$/,\"{\":/}$/},Rf=/^\\)\\]\\}',?\\n/,pg=G(\"$http\"),dd=function(a){return function(){throw pg(\"legacy\",\na);}},Ja=fa.$interpolateMinErr=G(\"$interpolate\");Ja.throwNoconcat=function(a){throw Ja(\"noconcat\",a);};Ja.interr=function(a,b){return Ja(\"interr\",a,b.toString())};var qg=/^([^\\?#]*)(\\?([^#]*))?(#(.*))?$/,Vf={http:80,https:443,ftp:21},Db=G(\"$location\"),rg={$$html5:!1,$$replace:!1,absUrl:Eb(\"$$absUrl\"),url:function(a){if(q(a))return this.$$url;var b=qg.exec(a);(b[1]||\"\"===a)&&this.path(decodeURIComponent(b[1]));(b[2]||b[1]||\"\"===a)&&this.search(b[3]||\"\");this.hash(b[5]||\"\");return this},protocol:Eb(\"$$protocol\"),\nhost:Eb(\"$$host\"),port:Eb(\"$$port\"),path:id(\"$$path\",function(a){a=null!==a?a.toString():\"\";return\"/\"==a.charAt(0)?a:\"/\"+a}),search:function(a,b){switch(arguments.length){case 0:return this.$$search;case 1:if(E(a)||Q(a))a=a.toString(),this.$$search=xc(a);else if(H(a))a=bb(a,{}),n(a,function(b,c){null==b&&delete a[c]}),this.$$search=a;else throw Db(\"isrcharg\");break;default:q(b)||null===b?delete this.$$search[a]:this.$$search[a]=b}this.$$compose();return this},hash:id(\"$$hash\",function(a){return null!==\na?a.toString():\"\"}),replace:function(){this.$$replace=!0;return this}};n([hd,dc,cc],function(a){a.prototype=Object.create(rg);a.prototype.state=function(b){if(!arguments.length)return this.$$state;if(a!==cc||!this.$$html5)throw Db(\"nostate\");this.$$state=q(b)?null:b;return this}});var ba=G(\"$parse\"),Wf=Function.prototype.call,Xf=Function.prototype.apply,Yf=Function.prototype.bind,Lb=$();n(\"+ - * / % === !== == != < > <= >= && || ! = |\".split(\" \"),function(a){Lb[a]=!0});var sg={n:\"\\n\",f:\"\\f\",r:\"\\r\",\nt:\"\\t\",v:\"\\v\",\"'\":\"'\",'\"':'\"'},fc=function(a){this.options=a};fc.prototype={constructor:fc,lex:function(a){this.text=a;this.index=0;for(this.tokens=[];this.index<this.text.length;)if(a=this.text.charAt(this.index),'\"'===a||\"'\"===a)this.readString(a);else if(this.isNumber(a)||\".\"===a&&this.isNumber(this.peek()))this.readNumber();else if(this.isIdent(a))this.readIdent();else if(this.is(a,\"(){}[].,;:?\"))this.tokens.push({index:this.index,text:a}),this.index++;else if(this.isWhitespace(a))this.index++;\nelse{var b=a+this.peek(),d=b+this.peek(2),c=Lb[b],e=Lb[d];Lb[a]||c||e?(a=e?d:c?b:a,this.tokens.push({index:this.index,text:a,operator:!0}),this.index+=a.length):this.throwError(\"Unexpected next character \",this.index,this.index+1)}return this.tokens},is:function(a,b){return-1!==b.indexOf(a)},peek:function(a){a=a||1;return this.index+a<this.text.length?this.text.charAt(this.index+a):!1},isNumber:function(a){return\"0\"<=a&&\"9\">=a&&\"string\"===typeof a},isWhitespace:function(a){return\" \"===a||\"\\r\"===a||\n\"\\t\"===a||\"\\n\"===a||\"\\v\"===a||\"\\u00a0\"===a},isIdent:function(a){return\"a\"<=a&&\"z\">=a||\"A\"<=a&&\"Z\">=a||\"_\"===a||\"$\"===a},isExpOperator:function(a){return\"-\"===a||\"+\"===a||this.isNumber(a)},throwError:function(a,b,d){d=d||this.index;b=y(b)?\"s \"+b+\"-\"+this.index+\" [\"+this.text.substring(b,d)+\"]\":\" \"+d;throw ba(\"lexerr\",a,b,this.text);},readNumber:function(){for(var a=\"\",b=this.index;this.index<this.text.length;){var d=F(this.text.charAt(this.index));if(\".\"==d||this.isNumber(d))a+=d;else{var c=this.peek();\nif(\"e\"==d&&this.isExpOperator(c))a+=d;else if(this.isExpOperator(d)&&c&&this.isNumber(c)&&\"e\"==a.charAt(a.length-1))a+=d;else if(!this.isExpOperator(d)||c&&this.isNumber(c)||\"e\"!=a.charAt(a.length-1))break;else this.throwError(\"Invalid exponent\")}this.index++}this.tokens.push({index:b,text:a,constant:!0,value:Number(a)})},readIdent:function(){for(var a=this.index;this.index<this.text.length;){var b=this.text.charAt(this.index);if(!this.isIdent(b)&&!this.isNumber(b))break;this.index++}this.tokens.push({index:a,\ntext:this.text.slice(a,this.index),identifier:!0})},readString:function(a){var b=this.index;this.index++;for(var d=\"\",c=a,e=!1;this.index<this.text.length;){var f=this.text.charAt(this.index),c=c+f;if(e)\"u\"===f?(e=this.text.substring(this.index+1,this.index+5),e.match(/[\\da-f]{4}/i)||this.throwError(\"Invalid unicode escape [\\\\u\"+e+\"]\"),this.index+=4,d+=String.fromCharCode(parseInt(e,16))):d+=sg[f]||f,e=!1;else if(\"\\\\\"===f)e=!0;else{if(f===a){this.index++;this.tokens.push({index:b,text:c,constant:!0,\nvalue:d});return}d+=f}this.index++}this.throwError(\"Unterminated quote\",b)}};var s=function(a,b){this.lexer=a;this.options=b};s.Program=\"Program\";s.ExpressionStatement=\"ExpressionStatement\";s.AssignmentExpression=\"AssignmentExpression\";s.ConditionalExpression=\"ConditionalExpression\";s.LogicalExpression=\"LogicalExpression\";s.BinaryExpression=\"BinaryExpression\";s.UnaryExpression=\"UnaryExpression\";s.CallExpression=\"CallExpression\";s.MemberExpression=\"MemberExpression\";s.Identifier=\"Identifier\";s.Literal=\n\"Literal\";s.ArrayExpression=\"ArrayExpression\";s.Property=\"Property\";s.ObjectExpression=\"ObjectExpression\";s.ThisExpression=\"ThisExpression\";s.NGValueParameter=\"NGValueParameter\";s.prototype={ast:function(a){this.text=a;this.tokens=this.lexer.lex(a);a=this.program();0!==this.tokens.length&&this.throwError(\"is an unexpected token\",this.tokens[0]);return a},program:function(){for(var a=[];;)if(0<this.tokens.length&&!this.peek(\"}\",\")\",\";\",\"]\")&&a.push(this.expressionStatement()),!this.expect(\";\"))return{type:s.Program,\nbody:a}},expressionStatement:function(){return{type:s.ExpressionStatement,expression:this.filterChain()}},filterChain:function(){for(var a=this.expression();this.expect(\"|\");)a=this.filter(a);return a},expression:function(){return this.assignment()},assignment:function(){var a=this.ternary();this.expect(\"=\")&&(a={type:s.AssignmentExpression,left:a,right:this.assignment(),operator:\"=\"});return a},ternary:function(){var a=this.logicalOR(),b,d;return this.expect(\"?\")&&(b=this.expression(),this.consume(\":\"))?\n(d=this.expression(),{type:s.ConditionalExpression,test:a,alternate:b,consequent:d}):a},logicalOR:function(){for(var a=this.logicalAND();this.expect(\"||\");)a={type:s.LogicalExpression,operator:\"||\",left:a,right:this.logicalAND()};return a},logicalAND:function(){for(var a=this.equality();this.expect(\"&&\");)a={type:s.LogicalExpression,operator:\"&&\",left:a,right:this.equality()};return a},equality:function(){for(var a=this.relational(),b;b=this.expect(\"==\",\"!=\",\"===\",\"!==\");)a={type:s.BinaryExpression,\noperator:b.text,left:a,right:this.relational()};return a},relational:function(){for(var a=this.additive(),b;b=this.expect(\"<\",\">\",\"<=\",\">=\");)a={type:s.BinaryExpression,operator:b.text,left:a,right:this.additive()};return a},additive:function(){for(var a=this.multiplicative(),b;b=this.expect(\"+\",\"-\");)a={type:s.BinaryExpression,operator:b.text,left:a,right:this.multiplicative()};return a},multiplicative:function(){for(var a=this.unary(),b;b=this.expect(\"*\",\"/\",\"%\");)a={type:s.BinaryExpression,operator:b.text,\nleft:a,right:this.unary()};return a},unary:function(){var a;return(a=this.expect(\"+\",\"-\",\"!\"))?{type:s.UnaryExpression,operator:a.text,prefix:!0,argument:this.unary()}:this.primary()},primary:function(){var a;this.expect(\"(\")?(a=this.filterChain(),this.consume(\")\")):this.expect(\"[\")?a=this.arrayDeclaration():this.expect(\"{\")?a=this.object():this.constants.hasOwnProperty(this.peek().text)?a=bb(this.constants[this.consume().text]):this.peek().identifier?a=this.identifier():this.peek().constant?a=this.constant():\nthis.throwError(\"not a primary expression\",this.peek());for(var b;b=this.expect(\"(\",\"[\",\".\");)\"(\"===b.text?(a={type:s.CallExpression,callee:a,arguments:this.parseArguments()},this.consume(\")\")):\"[\"===b.text?(a={type:s.MemberExpression,object:a,property:this.expression(),computed:!0},this.consume(\"]\")):\".\"===b.text?a={type:s.MemberExpression,object:a,property:this.identifier(),computed:!1}:this.throwError(\"IMPOSSIBLE\");return a},filter:function(a){a=[a];for(var b={type:s.CallExpression,callee:this.identifier(),\narguments:a,filter:!0};this.expect(\":\");)a.push(this.expression());return b},parseArguments:function(){var a=[];if(\")\"!==this.peekToken().text){do a.push(this.expression());while(this.expect(\",\"))}return a},identifier:function(){var a=this.consume();a.identifier||this.throwError(\"is not a valid identifier\",a);return{type:s.Identifier,name:a.text}},constant:function(){return{type:s.Literal,value:this.consume().value}},arrayDeclaration:function(){var a=[];if(\"]\"!==this.peekToken().text){do{if(this.peek(\"]\"))break;\na.push(this.expression())}while(this.expect(\",\"))}this.consume(\"]\");return{type:s.ArrayExpression,elements:a}},object:function(){var a=[],b;if(\"}\"!==this.peekToken().text){do{if(this.peek(\"}\"))break;b={type:s.Property,kind:\"init\"};this.peek().constant?b.key=this.constant():this.peek().identifier?b.key=this.identifier():this.throwError(\"invalid key\",this.peek());this.consume(\":\");b.value=this.expression();a.push(b)}while(this.expect(\",\"))}this.consume(\"}\");return{type:s.ObjectExpression,properties:a}},\nthrowError:function(a,b){throw ba(\"syntax\",b.text,a,b.index+1,this.text,this.text.substring(b.index));},consume:function(a){if(0===this.tokens.length)throw ba(\"ueoe\",this.text);var b=this.expect(a);b||this.throwError(\"is unexpected, expecting [\"+a+\"]\",this.peek());return b},peekToken:function(){if(0===this.tokens.length)throw ba(\"ueoe\",this.text);return this.tokens[0]},peek:function(a,b,d,c){return this.peekAhead(0,a,b,d,c)},peekAhead:function(a,b,d,c,e){if(this.tokens.length>a){a=this.tokens[a];\nvar f=a.text;if(f===b||f===d||f===c||f===e||!(b||d||c||e))return a}return!1},expect:function(a,b,d,c){return(a=this.peek(a,b,d,c))?(this.tokens.shift(),a):!1},constants:{\"true\":{type:s.Literal,value:!0},\"false\":{type:s.Literal,value:!1},\"null\":{type:s.Literal,value:null},undefined:{type:s.Literal,value:u},\"this\":{type:s.ThisExpression}}};rd.prototype={compile:function(a,b){var d=this,c=this.astBuilder.ast(a);this.state={nextId:0,filters:{},expensiveChecks:b,fn:{vars:[],body:[],own:{}},assign:{vars:[],\nbody:[],own:{}},inputs:[]};W(c,d.$filter);var e=\"\",f;this.stage=\"assign\";if(f=pd(c))this.state.computing=\"assign\",e=this.nextId(),this.recurse(f,e),this.return_(e),e=\"fn.assign=\"+this.generateFunction(\"assign\",\"s,v,l\");f=nd(c.body);d.stage=\"inputs\";n(f,function(a,b){var c=\"fn\"+b;d.state[c]={vars:[],body:[],own:{}};d.state.computing=c;var e=d.nextId();d.recurse(a,e);d.return_(e);d.state.inputs.push(c);a.watchId=b});this.state.computing=\"fn\";this.stage=\"main\";this.recurse(c);e='\"'+this.USE+\" \"+this.STRICT+\n'\";\\n'+this.filterPrefix()+\"var fn=\"+this.generateFunction(\"fn\",\"s,l,a,i\")+e+this.watchFns()+\"return fn;\";e=(new Function(\"$filter\",\"ensureSafeMemberName\",\"ensureSafeObject\",\"ensureSafeFunction\",\"getStringValue\",\"ensureSafeAssignContext\",\"ifDefined\",\"plus\",\"text\",e))(this.$filter,Va,xa,kd,jd,ld,Zf,md,a);this.state=this.stage=u;e.literal=qd(c);e.constant=c.constant;return e},USE:\"use\",STRICT:\"strict\",watchFns:function(){var a=[],b=this.state.inputs,d=this;n(b,function(b){a.push(\"var \"+b+\"=\"+d.generateFunction(b,\n\"s\"))});b.length&&a.push(\"fn.inputs=[\"+b.join(\",\")+\"];\");return a.join(\"\")},generateFunction:function(a,b){return\"function(\"+b+\"){\"+this.varsPrefix(a)+this.body(a)+\"};\"},filterPrefix:function(){var a=[],b=this;n(this.state.filters,function(d,c){a.push(d+\"=$filter(\"+b.escape(c)+\")\")});return a.length?\"var \"+a.join(\",\")+\";\":\"\"},varsPrefix:function(a){return this.state[a].vars.length?\"var \"+this.state[a].vars.join(\",\")+\";\":\"\"},body:function(a){return this.state[a].body.join(\"\")},recurse:function(a,b,\nd,c,e,f){var g,h,k=this,l,m;c=c||x;if(!f&&y(a.watchId))b=b||this.nextId(),this.if_(\"i\",this.lazyAssign(b,this.computedMember(\"i\",a.watchId)),this.lazyRecurse(a,b,d,c,e,!0));else switch(a.type){case s.Program:n(a.body,function(b,c){k.recurse(b.expression,u,u,function(a){h=a});c!==a.body.length-1?k.current().body.push(h,\";\"):k.return_(h)});break;case s.Literal:m=this.escape(a.value);this.assign(b,m);c(m);break;case s.UnaryExpression:this.recurse(a.argument,u,u,function(a){h=a});m=a.operator+\"(\"+this.ifDefined(h,\n0)+\")\";this.assign(b,m);c(m);break;case s.BinaryExpression:this.recurse(a.left,u,u,function(a){g=a});this.recurse(a.right,u,u,function(a){h=a});m=\"+\"===a.operator?this.plus(g,h):\"-\"===a.operator?this.ifDefined(g,0)+a.operator+this.ifDefined(h,0):\"(\"+g+\")\"+a.operator+\"(\"+h+\")\";this.assign(b,m);c(m);break;case s.LogicalExpression:b=b||this.nextId();k.recurse(a.left,b);k.if_(\"&&\"===a.operator?b:k.not(b),k.lazyRecurse(a.right,b));c(b);break;case s.ConditionalExpression:b=b||this.nextId();k.recurse(a.test,\nb);k.if_(b,k.lazyRecurse(a.alternate,b),k.lazyRecurse(a.consequent,b));c(b);break;case s.Identifier:b=b||this.nextId();d&&(d.context=\"inputs\"===k.stage?\"s\":this.assign(this.nextId(),this.getHasOwnProperty(\"l\",a.name)+\"?l:s\"),d.computed=!1,d.name=a.name);Va(a.name);k.if_(\"inputs\"===k.stage||k.not(k.getHasOwnProperty(\"l\",a.name)),function(){k.if_(\"inputs\"===k.stage||\"s\",function(){e&&1!==e&&k.if_(k.not(k.nonComputedMember(\"s\",a.name)),k.lazyAssign(k.nonComputedMember(\"s\",a.name),\"{}\"));k.assign(b,k.nonComputedMember(\"s\",\na.name))})},b&&k.lazyAssign(b,k.nonComputedMember(\"l\",a.name)));(k.state.expensiveChecks||Fb(a.name))&&k.addEnsureSafeObject(b);c(b);break;case s.MemberExpression:g=d&&(d.context=this.nextId())||this.nextId();b=b||this.nextId();k.recurse(a.object,g,u,function(){k.if_(k.notNull(g),function(){if(a.computed)h=k.nextId(),k.recurse(a.property,h),k.getStringValue(h),k.addEnsureSafeMemberName(h),e&&1!==e&&k.if_(k.not(k.computedMember(g,h)),k.lazyAssign(k.computedMember(g,h),\"{}\")),m=k.ensureSafeObject(k.computedMember(g,\nh)),k.assign(b,m),d&&(d.computed=!0,d.name=h);else{Va(a.property.name);e&&1!==e&&k.if_(k.not(k.nonComputedMember(g,a.property.name)),k.lazyAssign(k.nonComputedMember(g,a.property.name),\"{}\"));m=k.nonComputedMember(g,a.property.name);if(k.state.expensiveChecks||Fb(a.property.name))m=k.ensureSafeObject(m);k.assign(b,m);d&&(d.computed=!1,d.name=a.property.name)}},function(){k.assign(b,\"undefined\")});c(b)},!!e);break;case s.CallExpression:b=b||this.nextId();a.filter?(h=k.filter(a.callee.name),l=[],n(a.arguments,\nfunction(a){var b=k.nextId();k.recurse(a,b);l.push(b)}),m=h+\"(\"+l.join(\",\")+\")\",k.assign(b,m),c(b)):(h=k.nextId(),g={},l=[],k.recurse(a.callee,h,g,function(){k.if_(k.notNull(h),function(){k.addEnsureSafeFunction(h);n(a.arguments,function(a){k.recurse(a,k.nextId(),u,function(a){l.push(k.ensureSafeObject(a))})});g.name?(k.state.expensiveChecks||k.addEnsureSafeObject(g.context),m=k.member(g.context,g.name,g.computed)+\"(\"+l.join(\",\")+\")\"):m=h+\"(\"+l.join(\",\")+\")\";m=k.ensureSafeObject(m);k.assign(b,m)},\nfunction(){k.assign(b,\"undefined\")});c(b)}));break;case s.AssignmentExpression:h=this.nextId();g={};if(!od(a.left))throw ba(\"lval\");this.recurse(a.left,u,g,function(){k.if_(k.notNull(g.context),function(){k.recurse(a.right,h);k.addEnsureSafeObject(k.member(g.context,g.name,g.computed));k.addEnsureSafeAssignContext(g.context);m=k.member(g.context,g.name,g.computed)+a.operator+h;k.assign(b,m);c(b||m)})},1);break;case s.ArrayExpression:l=[];n(a.elements,function(a){k.recurse(a,k.nextId(),u,function(a){l.push(a)})});\nm=\"[\"+l.join(\",\")+\"]\";this.assign(b,m);c(m);break;case s.ObjectExpression:l=[];n(a.properties,function(a){k.recurse(a.value,k.nextId(),u,function(b){l.push(k.escape(a.key.type===s.Identifier?a.key.name:\"\"+a.key.value)+\":\"+b)})});m=\"{\"+l.join(\",\")+\"}\";this.assign(b,m);c(m);break;case s.ThisExpression:this.assign(b,\"s\");c(\"s\");break;case s.NGValueParameter:this.assign(b,\"v\"),c(\"v\")}},getHasOwnProperty:function(a,b){var d=a+\".\"+b,c=this.current().own;c.hasOwnProperty(d)||(c[d]=this.nextId(!1,a+\"&&(\"+\nthis.escape(b)+\" in \"+a+\")\"));return c[d]},assign:function(a,b){if(a)return this.current().body.push(a,\"=\",b,\";\"),a},filter:function(a){this.state.filters.hasOwnProperty(a)||(this.state.filters[a]=this.nextId(!0));return this.state.filters[a]},ifDefined:function(a,b){return\"ifDefined(\"+a+\",\"+this.escape(b)+\")\"},plus:function(a,b){return\"plus(\"+a+\",\"+b+\")\"},return_:function(a){this.current().body.push(\"return \",a,\";\")},if_:function(a,b,d){if(!0===a)b();else{var c=this.current().body;c.push(\"if(\",a,\n\"){\");b();c.push(\"}\");d&&(c.push(\"else{\"),d(),c.push(\"}\"))}},not:function(a){return\"!(\"+a+\")\"},notNull:function(a){return a+\"!=null\"},nonComputedMember:function(a,b){return a+\".\"+b},computedMember:function(a,b){return a+\"[\"+b+\"]\"},member:function(a,b,d){return d?this.computedMember(a,b):this.nonComputedMember(a,b)},addEnsureSafeObject:function(a){this.current().body.push(this.ensureSafeObject(a),\";\")},addEnsureSafeMemberName:function(a){this.current().body.push(this.ensureSafeMemberName(a),\";\")},\naddEnsureSafeFunction:function(a){this.current().body.push(this.ensureSafeFunction(a),\";\")},addEnsureSafeAssignContext:function(a){this.current().body.push(this.ensureSafeAssignContext(a),\";\")},ensureSafeObject:function(a){return\"ensureSafeObject(\"+a+\",text)\"},ensureSafeMemberName:function(a){return\"ensureSafeMemberName(\"+a+\",text)\"},ensureSafeFunction:function(a){return\"ensureSafeFunction(\"+a+\",text)\"},getStringValue:function(a){this.assign(a,\"getStringValue(\"+a+\",text)\")},ensureSafeAssignContext:function(a){return\"ensureSafeAssignContext(\"+\na+\",text)\"},lazyRecurse:function(a,b,d,c,e,f){var g=this;return function(){g.recurse(a,b,d,c,e,f)}},lazyAssign:function(a,b){var d=this;return function(){d.assign(a,b)}},stringEscapeRegex:/[^ a-zA-Z0-9]/g,stringEscapeFn:function(a){return\"\\\\u\"+(\"0000\"+a.charCodeAt(0).toString(16)).slice(-4)},escape:function(a){if(E(a))return\"'\"+a.replace(this.stringEscapeRegex,this.stringEscapeFn)+\"'\";if(Q(a))return a.toString();if(!0===a)return\"true\";if(!1===a)return\"false\";if(null===a)return\"null\";if(\"undefined\"===\ntypeof a)return\"undefined\";throw ba(\"esc\");},nextId:function(a,b){var d=\"v\"+this.state.nextId++;a||this.current().vars.push(d+(b?\"=\"+b:\"\"));return d},current:function(){return this.state[this.state.computing]}};sd.prototype={compile:function(a,b){var d=this,c=this.astBuilder.ast(a);this.expression=a;this.expensiveChecks=b;W(c,d.$filter);var e,f;if(e=pd(c))f=this.recurse(e);e=nd(c.body);var g;e&&(g=[],n(e,function(a,b){var c=d.recurse(a);a.input=c;g.push(c);a.watchId=b}));var h=[];n(c.body,function(a){h.push(d.recurse(a.expression))});\ne=0===c.body.length?function(){}:1===c.body.length?h[0]:function(a,b){var c;n(h,function(d){c=d(a,b)});return c};f&&(e.assign=function(a,b,c){return f(a,c,b)});g&&(e.inputs=g);e.literal=qd(c);e.constant=c.constant;return e},recurse:function(a,b,d){var c,e,f=this,g;if(a.input)return this.inputs(a.input,a.watchId);switch(a.type){case s.Literal:return this.value(a.value,b);case s.UnaryExpression:return e=this.recurse(a.argument),this[\"unary\"+a.operator](e,b);case s.BinaryExpression:return c=this.recurse(a.left),\ne=this.recurse(a.right),this[\"binary\"+a.operator](c,e,b);case s.LogicalExpression:return c=this.recurse(a.left),e=this.recurse(a.right),this[\"binary\"+a.operator](c,e,b);case s.ConditionalExpression:return this[\"ternary?:\"](this.recurse(a.test),this.recurse(a.alternate),this.recurse(a.consequent),b);case s.Identifier:return Va(a.name,f.expression),f.identifier(a.name,f.expensiveChecks||Fb(a.name),b,d,f.expression);case s.MemberExpression:return c=this.recurse(a.object,!1,!!d),a.computed||(Va(a.property.name,\nf.expression),e=a.property.name),a.computed&&(e=this.recurse(a.property)),a.computed?this.computedMember(c,e,b,d,f.expression):this.nonComputedMember(c,e,f.expensiveChecks,b,d,f.expression);case s.CallExpression:return g=[],n(a.arguments,function(a){g.push(f.recurse(a))}),a.filter&&(e=this.$filter(a.callee.name)),a.filter||(e=this.recurse(a.callee,!0)),a.filter?function(a,c,d,f){for(var r=[],n=0;n<g.length;++n)r.push(g[n](a,c,d,f));a=e.apply(u,r,f);return b?{context:u,name:u,value:a}:a}:function(a,\nc,d,m){var r=e(a,c,d,m),n;if(null!=r.value){xa(r.context,f.expression);kd(r.value,f.expression);n=[];for(var q=0;q<g.length;++q)n.push(xa(g[q](a,c,d,m),f.expression));n=xa(r.value.apply(r.context,n),f.expression)}return b?{value:n}:n};case s.AssignmentExpression:return c=this.recurse(a.left,!0,1),e=this.recurse(a.right),function(a,d,g,m){var n=c(a,d,g,m);a=e(a,d,g,m);xa(n.value,f.expression);ld(n.context);n.context[n.name]=a;return b?{value:a}:a};case s.ArrayExpression:return g=[],n(a.elements,function(a){g.push(f.recurse(a))}),\nfunction(a,c,d,e){for(var f=[],n=0;n<g.length;++n)f.push(g[n](a,c,d,e));return b?{value:f}:f};case s.ObjectExpression:return g=[],n(a.properties,function(a){g.push({key:a.key.type===s.Identifier?a.key.name:\"\"+a.key.value,value:f.recurse(a.value)})}),function(a,c,d,e){for(var f={},n=0;n<g.length;++n)f[g[n].key]=g[n].value(a,c,d,e);return b?{value:f}:f};case s.ThisExpression:return function(a){return b?{value:a}:a};case s.NGValueParameter:return function(a,c,d,e){return b?{value:d}:d}}},\"unary+\":function(a,\nb){return function(d,c,e,f){d=a(d,c,e,f);d=y(d)?+d:0;return b?{value:d}:d}},\"unary-\":function(a,b){return function(d,c,e,f){d=a(d,c,e,f);d=y(d)?-d:0;return b?{value:d}:d}},\"unary!\":function(a,b){return function(d,c,e,f){d=!a(d,c,e,f);return b?{value:d}:d}},\"binary+\":function(a,b,d){return function(c,e,f,g){var h=a(c,e,f,g);c=b(c,e,f,g);h=md(h,c);return d?{value:h}:h}},\"binary-\":function(a,b,d){return function(c,e,f,g){var h=a(c,e,f,g);c=b(c,e,f,g);h=(y(h)?h:0)-(y(c)?c:0);return d?{value:h}:h}},\"binary*\":function(a,\nb,d){return function(c,e,f,g){c=a(c,e,f,g)*b(c,e,f,g);return d?{value:c}:c}},\"binary/\":function(a,b,d){return function(c,e,f,g){c=a(c,e,f,g)/b(c,e,f,g);return d?{value:c}:c}},\"binary%\":function(a,b,d){return function(c,e,f,g){c=a(c,e,f,g)%b(c,e,f,g);return d?{value:c}:c}},\"binary===\":function(a,b,d){return function(c,e,f,g){c=a(c,e,f,g)===b(c,e,f,g);return d?{value:c}:c}},\"binary!==\":function(a,b,d){return function(c,e,f,g){c=a(c,e,f,g)!==b(c,e,f,g);return d?{value:c}:c}},\"binary==\":function(a,b,\nd){return function(c,e,f,g){c=a(c,e,f,g)==b(c,e,f,g);return d?{value:c}:c}},\"binary!=\":function(a,b,d){return function(c,e,f,g){c=a(c,e,f,g)!=b(c,e,f,g);return d?{value:c}:c}},\"binary<\":function(a,b,d){return function(c,e,f,g){c=a(c,e,f,g)<b(c,e,f,g);return d?{value:c}:c}},\"binary>\":function(a,b,d){return function(c,e,f,g){c=a(c,e,f,g)>b(c,e,f,g);return d?{value:c}:c}},\"binary<=\":function(a,b,d){return function(c,e,f,g){c=a(c,e,f,g)<=b(c,e,f,g);return d?{value:c}:c}},\"binary>=\":function(a,b,d){return function(c,\ne,f,g){c=a(c,e,f,g)>=b(c,e,f,g);return d?{value:c}:c}},\"binary&&\":function(a,b,d){return function(c,e,f,g){c=a(c,e,f,g)&&b(c,e,f,g);return d?{value:c}:c}},\"binary||\":function(a,b,d){return function(c,e,f,g){c=a(c,e,f,g)||b(c,e,f,g);return d?{value:c}:c}},\"ternary?:\":function(a,b,d,c){return function(e,f,g,h){e=a(e,f,g,h)?b(e,f,g,h):d(e,f,g,h);return c?{value:e}:e}},value:function(a,b){return function(){return b?{context:u,name:u,value:a}:a}},identifier:function(a,b,d,c,e){return function(f,g,h,k){f=\ng&&a in g?g:f;c&&1!==c&&f&&!f[a]&&(f[a]={});g=f?f[a]:u;b&&xa(g,e);return d?{context:f,name:a,value:g}:g}},computedMember:function(a,b,d,c,e){return function(f,g,h,k){var l=a(f,g,h,k),m,n;null!=l&&(m=b(f,g,h,k),m=jd(m),Va(m,e),c&&1!==c&&l&&!l[m]&&(l[m]={}),n=l[m],xa(n,e));return d?{context:l,name:m,value:n}:n}},nonComputedMember:function(a,b,d,c,e,f){return function(g,h,k,l){g=a(g,h,k,l);e&&1!==e&&g&&!g[b]&&(g[b]={});h=null!=g?g[b]:u;(d||Fb(b))&&xa(h,f);return c?{context:g,name:b,value:h}:h}},inputs:function(a,\nb){return function(d,c,e,f){return f?f[b]:a(d,c,e)}}};var gc=function(a,b,d){this.lexer=a;this.$filter=b;this.options=d;this.ast=new s(this.lexer);this.astCompiler=d.csp?new sd(this.ast,b):new rd(this.ast,b)};gc.prototype={constructor:gc,parse:function(a){return this.astCompiler.compile(a,this.options.expensiveChecks)}};$();$();var $f=Object.prototype.valueOf,ya=G(\"$sce\"),la={HTML:\"html\",CSS:\"css\",URL:\"url\",RESOURCE_URL:\"resourceUrl\",JS:\"js\"},ha=G(\"$compile\"),Y=X.createElement(\"a\"),wd=wa(S.location.href);\nxd.$inject=[\"$document\"];Jc.$inject=[\"$provide\"];yd.$inject=[\"$locale\"];Ad.$inject=[\"$locale\"];var ic=\".\",jg={yyyy:ca(\"FullYear\",4),yy:ca(\"FullYear\",2,0,!0),y:ca(\"FullYear\",1),MMMM:Hb(\"Month\"),MMM:Hb(\"Month\",!0),MM:ca(\"Month\",2,1),M:ca(\"Month\",1,1),dd:ca(\"Date\",2),d:ca(\"Date\",1),HH:ca(\"Hours\",2),H:ca(\"Hours\",1),hh:ca(\"Hours\",2,-12),h:ca(\"Hours\",1,-12),mm:ca(\"Minutes\",2),m:ca(\"Minutes\",1),ss:ca(\"Seconds\",2),s:ca(\"Seconds\",1),sss:ca(\"Milliseconds\",3),EEEE:Hb(\"Day\"),EEE:Hb(\"Day\",!0),a:function(a,b){return 12>\na.getHours()?b.AMPMS[0]:b.AMPMS[1]},Z:function(a,b,d){a=-1*d;return a=(0<=a?\"+\":\"\")+(Gb(Math[0<a?\"floor\":\"ceil\"](a/60),2)+Gb(Math.abs(a%60),2))},ww:Ed(2),w:Ed(1),G:jc,GG:jc,GGG:jc,GGGG:function(a,b){return 0>=a.getFullYear()?b.ERANAMES[0]:b.ERANAMES[1]}},ig=/((?:[^yMdHhmsaZEwG']+)|(?:'(?:[^']|'')*')|(?:E+|y+|M+|d+|H+|h+|m+|s+|a|Z|G+|w+))(.*)/,hg=/^\\-?\\d+$/;zd.$inject=[\"$locale\"];var eg=na(F),fg=na(sb);Bd.$inject=[\"$parse\"];var he=na({restrict:\"E\",compile:function(a,b){if(!b.href&&!b.xlinkHref)return function(a,\nb){if(\"a\"===b[0].nodeName.toLowerCase()){var e=\"[object SVGAnimatedString]\"===sa.call(b.prop(\"href\"))?\"xlink:href\":\"href\";b.on(\"click\",function(a){b.attr(e)||a.preventDefault()})}}}}),tb={};n(Cb,function(a,b){function d(a,d,e){a.$watch(e[c],function(a){e.$set(b,!!a)})}if(\"multiple\"!=a){var c=va(\"ng-\"+b),e=d;\"checked\"===a&&(e=function(a,b,e){e.ngModel!==e[c]&&d(a,b,e)});tb[c]=function(){return{restrict:\"A\",priority:100,link:e}}}});n(Zc,function(a,b){tb[b]=function(){return{priority:100,link:function(a,\nc,e){if(\"ngPattern\"===b&&\"/\"==e.ngPattern.charAt(0)&&(c=e.ngPattern.match(lg))){e.$set(\"ngPattern\",new RegExp(c[1],c[2]));return}a.$watch(e[b],function(a){e.$set(b,a)})}}}});n([\"src\",\"srcset\",\"href\"],function(a){var b=va(\"ng-\"+a);tb[b]=function(){return{priority:99,link:function(d,c,e){var f=a,g=a;\"href\"===a&&\"[object SVGAnimatedString]\"===sa.call(c.prop(\"href\"))&&(g=\"xlinkHref\",e.$attr[g]=\"xlink:href\",f=null);e.$observe(b,function(b){b?(e.$set(g,b),Ha&&f&&c.prop(f,e[g])):\"href\"===a&&e.$set(g,null)})}}}});\nvar Ib={$addControl:x,$$renameControl:function(a,b){a.$name=b},$removeControl:x,$setValidity:x,$setDirty:x,$setPristine:x,$setSubmitted:x};Fd.$inject=[\"$element\",\"$attrs\",\"$scope\",\"$animate\",\"$interpolate\"];var Nd=function(a){return[\"$timeout\",\"$parse\",function(b,d){function c(a){return\"\"===a?d('this[\"\"]').assign:d(a).assign||x}return{name:\"form\",restrict:a?\"EAC\":\"E\",require:[\"form\",\"^^?form\"],controller:Fd,compile:function(d,f){d.addClass(Wa).addClass(mb);var g=f.name?\"name\":a&&f.ngForm?\"ngForm\":\n!1;return{pre:function(a,d,e,f){var n=f[0];if(!(\"action\"in e)){var q=function(b){a.$apply(function(){n.$commitViewValue();n.$setSubmitted()});b.preventDefault()};d[0].addEventListener(\"submit\",q,!1);d.on(\"$destroy\",function(){b(function(){d[0].removeEventListener(\"submit\",q,!1)},0,!1)})}(f[1]||n.$$parentForm).$addControl(n);var s=g?c(n.$name):x;g&&(s(a,n),e.$observe(g,function(b){n.$name!==b&&(s(a,u),n.$$parentForm.$$renameControl(n,b),s=c(n.$name),s(a,n))}));d.on(\"$destroy\",function(){n.$$parentForm.$removeControl(n);\ns(a,u);M(n,Ib)})}}}}}]},ie=Nd(),ve=Nd(!0),kg=/\\d{4}-[01]\\d-[0-3]\\dT[0-2]\\d:[0-5]\\d:[0-5]\\d\\.\\d+([+-][0-2]\\d:[0-5]\\d|Z)/,tg=/^[A-Za-z][A-Za-z\\d.+-]*:\\/*(?:\\w+(?::\\w+)?@)?[^\\s/]+(?::\\d+)?(?:\\/[\\w#!:.?+=&%@\\-/]*)?$/,ug=/^[a-z0-9!#$%&'*+\\/=?^_`{|}~.-]+@[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$/i,vg=/^\\s*(\\-|\\+)?(\\d+|(\\d*(\\.\\d*)))([eE][+-]?\\d+)?\\s*$/,Od=/^(\\d{4})-(\\d{2})-(\\d{2})$/,Pd=/^(\\d{4})-(\\d\\d)-(\\d\\d)T(\\d\\d):(\\d\\d)(?::(\\d\\d)(\\.\\d{1,3})?)?$/,mc=/^(\\d{4})-W(\\d\\d)$/,Qd=/^(\\d{4})-(\\d\\d)$/,\nRd=/^(\\d\\d):(\\d\\d)(?::(\\d\\d)(\\.\\d{1,3})?)?$/,Sd={text:function(a,b,d,c,e,f){jb(a,b,d,c,e,f);kc(c)},date:kb(\"date\",Od,Kb(Od,[\"yyyy\",\"MM\",\"dd\"]),\"yyyy-MM-dd\"),\"datetime-local\":kb(\"datetimelocal\",Pd,Kb(Pd,\"yyyy MM dd HH mm ss sss\".split(\" \")),\"yyyy-MM-ddTHH:mm:ss.sss\"),time:kb(\"time\",Rd,Kb(Rd,[\"HH\",\"mm\",\"ss\",\"sss\"]),\"HH:mm:ss.sss\"),week:kb(\"week\",mc,function(a,b){if(da(a))return a;if(E(a)){mc.lastIndex=0;var d=mc.exec(a);if(d){var c=+d[1],e=+d[2],f=d=0,g=0,h=0,k=Dd(c),e=7*(e-1);b&&(d=b.getHours(),f=\nb.getMinutes(),g=b.getSeconds(),h=b.getMilliseconds());return new Date(c,0,k.getDate()+e,d,f,g,h)}}return NaN},\"yyyy-Www\"),month:kb(\"month\",Qd,Kb(Qd,[\"yyyy\",\"MM\"]),\"yyyy-MM\"),number:function(a,b,d,c,e,f){Hd(a,b,d,c);jb(a,b,d,c,e,f);c.$$parserName=\"number\";c.$parsers.push(function(a){return c.$isEmpty(a)?null:vg.test(a)?parseFloat(a):u});c.$formatters.push(function(a){if(!c.$isEmpty(a)){if(!Q(a))throw lb(\"numfmt\",a);a=a.toString()}return a});if(y(d.min)||d.ngMin){var g;c.$validators.min=function(a){return c.$isEmpty(a)||\nq(g)||a>=g};d.$observe(\"min\",function(a){y(a)&&!Q(a)&&(a=parseFloat(a,10));g=Q(a)&&!isNaN(a)?a:u;c.$validate()})}if(y(d.max)||d.ngMax){var h;c.$validators.max=function(a){return c.$isEmpty(a)||q(h)||a<=h};d.$observe(\"max\",function(a){y(a)&&!Q(a)&&(a=parseFloat(a,10));h=Q(a)&&!isNaN(a)?a:u;c.$validate()})}},url:function(a,b,d,c,e,f){jb(a,b,d,c,e,f);kc(c);c.$$parserName=\"url\";c.$validators.url=function(a,b){var d=a||b;return c.$isEmpty(d)||tg.test(d)}},email:function(a,b,d,c,e,f){jb(a,b,d,c,e,f);kc(c);\nc.$$parserName=\"email\";c.$validators.email=function(a,b){var d=a||b;return c.$isEmpty(d)||ug.test(d)}},radio:function(a,b,d,c){q(d.name)&&b.attr(\"name\",++nb);b.on(\"click\",function(a){b[0].checked&&c.$setViewValue(d.value,a&&a.type)});c.$render=function(){b[0].checked=d.value==c.$viewValue};d.$observe(\"value\",c.$render)},checkbox:function(a,b,d,c,e,f,g,h){var k=Id(h,a,\"ngTrueValue\",d.ngTrueValue,!0),l=Id(h,a,\"ngFalseValue\",d.ngFalseValue,!1);b.on(\"click\",function(a){c.$setViewValue(b[0].checked,a&&\na.type)});c.$render=function(){b[0].checked=c.$viewValue};c.$isEmpty=function(a){return!1===a};c.$formatters.push(function(a){return ma(a,k)});c.$parsers.push(function(a){return a?k:l})},hidden:x,button:x,submit:x,reset:x,file:x},Dc=[\"$browser\",\"$sniffer\",\"$filter\",\"$parse\",function(a,b,d,c){return{restrict:\"E\",require:[\"?ngModel\"],link:{pre:function(e,f,g,h){h[0]&&(Sd[F(g.type)]||Sd.text)(e,f,g,h[0],b,a,d,c)}}}}],wg=/^(true|false|\\d+)$/,Ne=function(){return{restrict:\"A\",priority:100,compile:function(a,\nb){return wg.test(b.ngValue)?function(a,b,e){e.$set(\"value\",a.$eval(e.ngValue))}:function(a,b,e){a.$watch(e.ngValue,function(a){e.$set(\"value\",a)})}}}},ne=[\"$compile\",function(a){return{restrict:\"AC\",compile:function(b){a.$$addBindingClass(b);return function(b,c,e){a.$$addBindingInfo(c,e.ngBind);c=c[0];b.$watch(e.ngBind,function(a){c.textContent=q(a)?\"\":a})}}}}],pe=[\"$interpolate\",\"$compile\",function(a,b){return{compile:function(d){b.$$addBindingClass(d);return function(c,d,f){c=a(d.attr(f.$attr.ngBindTemplate));\nb.$$addBindingInfo(d,c.expressions);d=d[0];f.$observe(\"ngBindTemplate\",function(a){d.textContent=q(a)?\"\":a})}}}}],oe=[\"$sce\",\"$parse\",\"$compile\",function(a,b,d){return{restrict:\"A\",compile:function(c,e){var f=b(e.ngBindHtml),g=b(e.ngBindHtml,function(a){return(a||\"\").toString()});d.$$addBindingClass(c);return function(b,c,e){d.$$addBindingInfo(c,e.ngBindHtml);b.$watch(g,function(){c.html(a.getTrustedHtml(f(b))||\"\")})}}}}],Me=na({restrict:\"A\",require:\"ngModel\",link:function(a,b,d,c){c.$viewChangeListeners.push(function(){a.$eval(d.ngChange)})}}),\nqe=lc(\"\",!0),se=lc(\"Odd\",0),re=lc(\"Even\",1),te=La({compile:function(a,b){b.$set(\"ngCloak\",u);a.removeClass(\"ng-cloak\")}}),ue=[function(){return{restrict:\"A\",scope:!0,controller:\"@\",priority:500}}],Ic={},xg={blur:!0,focus:!0};n(\"click dblclick mousedown mouseup mouseover mouseout mousemove mouseenter mouseleave keydown keyup keypress submit focus blur copy cut paste\".split(\" \"),function(a){var b=va(\"ng-\"+a);Ic[b]=[\"$parse\",\"$rootScope\",function(d,c){return{restrict:\"A\",compile:function(e,f){var g=\nd(f[b],null,!0);return function(b,d){d.on(a,function(d){var e=function(){g(b,{$event:d})};xg[a]&&c.$$phase?b.$evalAsync(e):b.$apply(e)})}}}}]});var xe=[\"$animate\",function(a){return{multiElement:!0,transclude:\"element\",priority:600,terminal:!0,restrict:\"A\",$$tlb:!0,link:function(b,d,c,e,f){var g,h,k;b.$watch(c.ngIf,function(b){b?h||f(function(b,e){h=e;b[b.length++]=X.createComment(\" end ngIf: \"+c.ngIf+\" \");g={clone:b};a.enter(b,d.parent(),d)}):(k&&(k.remove(),k=null),h&&(h.$destroy(),h=null),g&&(k=\nrb(g.clone),a.leave(k).then(function(){k=null}),g=null))})}}}],ye=[\"$templateRequest\",\"$anchorScroll\",\"$animate\",function(a,b,d){return{restrict:\"ECA\",priority:400,terminal:!0,transclude:\"element\",controller:fa.noop,compile:function(c,e){var f=e.ngInclude||e.src,g=e.onload||\"\",h=e.autoscroll;return function(c,e,m,n,q){var s=0,v,u,p,C=function(){u&&(u.remove(),u=null);v&&(v.$destroy(),v=null);p&&(d.leave(p).then(function(){u=null}),u=p,p=null)};c.$watch(f,function(f){var m=function(){!y(h)||h&&!c.$eval(h)||\nb()},u=++s;f?(a(f,!0).then(function(a){if(u===s){var b=c.$new();n.template=a;a=q(b,function(a){C();d.enter(a,null,e).then(m)});v=b;p=a;v.$emit(\"$includeContentLoaded\",f);c.$eval(g)}},function(){u===s&&(C(),c.$emit(\"$includeContentError\",f))}),c.$emit(\"$includeContentRequested\",f)):(C(),n.template=null)})}}}}],Pe=[\"$compile\",function(a){return{restrict:\"ECA\",priority:-400,require:\"ngInclude\",link:function(b,d,c,e){/SVG/.test(d[0].toString())?(d.empty(),a(Lc(e.template,X).childNodes)(b,function(a){d.append(a)},\n{futureParentElement:d})):(d.html(e.template),a(d.contents())(b))}}}],ze=La({priority:450,compile:function(){return{pre:function(a,b,d){a.$eval(d.ngInit)}}}}),Le=function(){return{restrict:\"A\",priority:100,require:\"ngModel\",link:function(a,b,d,c){var e=b.attr(d.$attr.ngList)||\", \",f=\"false\"!==d.ngTrim,g=f?U(e):e;c.$parsers.push(function(a){if(!q(a)){var b=[];a&&n(a.split(g),function(a){a&&b.push(f?U(a):a)});return b}});c.$formatters.push(function(a){return I(a)?a.join(e):u});c.$isEmpty=function(a){return!a||\n!a.length}}}},mb=\"ng-valid\",Jd=\"ng-invalid\",Wa=\"ng-pristine\",Jb=\"ng-dirty\",Ld=\"ng-pending\",lb=G(\"ngModel\"),yg=[\"$scope\",\"$exceptionHandler\",\"$attrs\",\"$element\",\"$parse\",\"$animate\",\"$timeout\",\"$rootScope\",\"$q\",\"$interpolate\",function(a,b,d,c,e,f,g,h,k,l){this.$modelValue=this.$viewValue=Number.NaN;this.$$rawModelValue=u;this.$validators={};this.$asyncValidators={};this.$parsers=[];this.$formatters=[];this.$viewChangeListeners=[];this.$untouched=!0;this.$touched=!1;this.$pristine=!0;this.$dirty=!1;\nthis.$valid=!0;this.$invalid=!1;this.$error={};this.$$success={};this.$pending=u;this.$name=l(d.name||\"\",!1)(a);this.$$parentForm=Ib;var m=e(d.ngModel),r=m.assign,t=m,s=r,v=null,B,p=this;this.$$setOptions=function(a){if((p.$options=a)&&a.getterSetter){var b=e(d.ngModel+\"()\"),f=e(d.ngModel+\"($$$p)\");t=function(a){var c=m(a);z(c)&&(c=b(a));return c};s=function(a,b){z(m(a))?f(a,{$$$p:p.$modelValue}):r(a,p.$modelValue)}}else if(!m.assign)throw lb(\"nonassign\",d.ngModel,ua(c));};this.$render=x;this.$isEmpty=\nfunction(a){return q(a)||\"\"===a||null===a||a!==a};var C=0;Gd({ctrl:this,$element:c,set:function(a,b){a[b]=!0},unset:function(a,b){delete a[b]},$animate:f});this.$setPristine=function(){p.$dirty=!1;p.$pristine=!0;f.removeClass(c,Jb);f.addClass(c,Wa)};this.$setDirty=function(){p.$dirty=!0;p.$pristine=!1;f.removeClass(c,Wa);f.addClass(c,Jb);p.$$parentForm.$setDirty()};this.$setUntouched=function(){p.$touched=!1;p.$untouched=!0;f.setClass(c,\"ng-untouched\",\"ng-touched\")};this.$setTouched=function(){p.$touched=\n!0;p.$untouched=!1;f.setClass(c,\"ng-touched\",\"ng-untouched\")};this.$rollbackViewValue=function(){g.cancel(v);p.$viewValue=p.$$lastCommittedViewValue;p.$render()};this.$validate=function(){if(!Q(p.$modelValue)||!isNaN(p.$modelValue)){var a=p.$$rawModelValue,b=p.$valid,c=p.$modelValue,d=p.$options&&p.$options.allowInvalid;p.$$runValidators(a,p.$$lastCommittedViewValue,function(e){d||b===e||(p.$modelValue=e?a:u,p.$modelValue!==c&&p.$$writeModelToScope())})}};this.$$runValidators=function(a,b,c){function d(){var c=\n!0;n(p.$validators,function(d,e){var g=d(a,b);c=c&&g;f(e,g)});return c?!0:(n(p.$asyncValidators,function(a,b){f(b,null)}),!1)}function e(){var c=[],d=!0;n(p.$asyncValidators,function(e,g){var h=e(a,b);if(!h||!z(h.then))throw lb(\"$asyncValidators\",h);f(g,u);c.push(h.then(function(){f(g,!0)},function(a){d=!1;f(g,!1)}))});c.length?k.all(c).then(function(){g(d)},x):g(!0)}function f(a,b){h===C&&p.$setValidity(a,b)}function g(a){h===C&&c(a)}C++;var h=C;(function(){var a=p.$$parserName||\"parse\";if(q(B))f(a,\nnull);else return B||(n(p.$validators,function(a,b){f(b,null)}),n(p.$asyncValidators,function(a,b){f(b,null)})),f(a,B),B;return!0})()?d()?e():g(!1):g(!1)};this.$commitViewValue=function(){var a=p.$viewValue;g.cancel(v);if(p.$$lastCommittedViewValue!==a||\"\"===a&&p.$$hasNativeValidators)p.$$lastCommittedViewValue=a,p.$pristine&&this.$setDirty(),this.$$parseAndValidate()};this.$$parseAndValidate=function(){var b=p.$$lastCommittedViewValue;if(B=q(b)?u:!0)for(var c=0;c<p.$parsers.length;c++)if(b=p.$parsers[c](b),\nq(b)){B=!1;break}Q(p.$modelValue)&&isNaN(p.$modelValue)&&(p.$modelValue=t(a));var d=p.$modelValue,e=p.$options&&p.$options.allowInvalid;p.$$rawModelValue=b;e&&(p.$modelValue=b,p.$modelValue!==d&&p.$$writeModelToScope());p.$$runValidators(b,p.$$lastCommittedViewValue,function(a){e||(p.$modelValue=a?b:u,p.$modelValue!==d&&p.$$writeModelToScope())})};this.$$writeModelToScope=function(){s(a,p.$modelValue);n(p.$viewChangeListeners,function(a){try{a()}catch(c){b(c)}})};this.$setViewValue=function(a,b){p.$viewValue=\na;p.$options&&!p.$options.updateOnDefault||p.$$debounceViewValueCommit(b)};this.$$debounceViewValueCommit=function(b){var c=0,d=p.$options;d&&y(d.debounce)&&(d=d.debounce,Q(d)?c=d:Q(d[b])?c=d[b]:Q(d[\"default\"])&&(c=d[\"default\"]));g.cancel(v);c?v=g(function(){p.$commitViewValue()},c):h.$$phase?p.$commitViewValue():a.$apply(function(){p.$commitViewValue()})};a.$watch(function(){var b=t(a);if(b!==p.$modelValue&&(p.$modelValue===p.$modelValue||b===b)){p.$modelValue=p.$$rawModelValue=b;B=u;for(var c=p.$formatters,\nd=c.length,e=b;d--;)e=c[d](e);p.$viewValue!==e&&(p.$viewValue=p.$$lastCommittedViewValue=e,p.$render(),p.$$runValidators(b,e,x))}return b})}],Ke=[\"$rootScope\",function(a){return{restrict:\"A\",require:[\"ngModel\",\"^?form\",\"^?ngModelOptions\"],controller:yg,priority:1,compile:function(b){b.addClass(Wa).addClass(\"ng-untouched\").addClass(mb);return{pre:function(a,b,e,f){var g=f[0];b=f[1]||g.$$parentForm;g.$$setOptions(f[2]&&f[2].$options);b.$addControl(g);e.$observe(\"name\",function(a){g.$name!==a&&g.$$parentForm.$$renameControl(g,\na)});a.$on(\"$destroy\",function(){g.$$parentForm.$removeControl(g)})},post:function(b,c,e,f){var g=f[0];if(g.$options&&g.$options.updateOn)c.on(g.$options.updateOn,function(a){g.$$debounceViewValueCommit(a&&a.type)});c.on(\"blur\",function(c){g.$touched||(a.$$phase?b.$evalAsync(g.$setTouched):b.$apply(g.$setTouched))})}}}}}],zg=/(\\s+|^)default(\\s+|$)/,Oe=function(){return{restrict:\"A\",controller:[\"$scope\",\"$attrs\",function(a,b){var d=this;this.$options=bb(a.$eval(b.ngModelOptions));y(this.$options.updateOn)?\n(this.$options.updateOnDefault=!1,this.$options.updateOn=U(this.$options.updateOn.replace(zg,function(){d.$options.updateOnDefault=!0;return\" \"}))):this.$options.updateOnDefault=!0}]}},Ae=La({terminal:!0,priority:1E3}),Ag=G(\"ngOptions\"),Bg=/^\\s*([\\s\\S]+?)(?:\\s+as\\s+([\\s\\S]+?))?(?:\\s+group\\s+by\\s+([\\s\\S]+?))?(?:\\s+disable\\s+when\\s+([\\s\\S]+?))?\\s+for\\s+(?:([\\$\\w][\\$\\w]*)|(?:\\(\\s*([\\$\\w][\\$\\w]*)\\s*,\\s*([\\$\\w][\\$\\w]*)\\s*\\)))\\s+in\\s+([\\s\\S]+?)(?:\\s+track\\s+by\\s+([\\s\\S]+?))?$/,Ie=[\"$compile\",\"$parse\",function(a,\nb){function d(a,c,d){function e(a,b,c,d,f){this.selectValue=a;this.viewValue=b;this.label=c;this.group=d;this.disabled=f}function l(a){var b;if(!q&&za(a))b=a;else{b=[];for(var c in a)a.hasOwnProperty(c)&&\"$\"!==c.charAt(0)&&b.push(c)}return b}var m=a.match(Bg);if(!m)throw Ag(\"iexp\",a,ua(c));var n=m[5]||m[7],q=m[6];a=/ as /.test(m[0])&&m[1];var s=m[9];c=b(m[2]?m[1]:n);var v=a&&b(a)||c,u=s&&b(s),p=s?function(a,b){return u(d,b)}:function(a){return Ca(a)},C=function(a,b){return p(a,z(a,b))},w=b(m[2]||\nm[1]),y=b(m[3]||\"\"),B=b(m[4]||\"\"),x=b(m[8]),D={},z=q?function(a,b){D[q]=b;D[n]=a;return D}:function(a){D[n]=a;return D};return{trackBy:s,getTrackByValue:C,getWatchables:b(x,function(a){var b=[];a=a||[];for(var c=l(a),e=c.length,f=0;f<e;f++){var g=a===c?f:c[f],k=z(a[g],g),g=p(a[g],k);b.push(g);if(m[2]||m[1])g=w(d,k),b.push(g);m[4]&&(k=B(d,k),b.push(k))}return b}),getOptions:function(){for(var a=[],b={},c=x(d)||[],f=l(c),g=f.length,m=0;m<g;m++){var n=c===f?m:f[m],r=z(c[n],n),q=v(d,r),n=p(q,r),t=w(d,\nr),u=y(d,r),r=B(d,r),q=new e(n,q,t,u,r);a.push(q);b[n]=q}return{items:a,selectValueMap:b,getOptionFromViewValue:function(a){return b[C(a)]},getViewValueFromOption:function(a){return s?fa.copy(a.viewValue):a.viewValue}}}}}var c=X.createElement(\"option\"),e=X.createElement(\"optgroup\");return{restrict:\"A\",terminal:!0,require:[\"select\",\"?ngModel\"],link:{pre:function(a,b,c,d){d[0].registerOption=x},post:function(b,g,h,k){function l(a,b){a.element=b;b.disabled=a.disabled;a.label!==b.label&&(b.label=a.label,\nb.textContent=a.label);a.value!==b.value&&(b.value=a.selectValue)}function m(a,b,c,d){b&&F(b.nodeName)===c?c=b:(c=d.cloneNode(!1),b?a.insertBefore(c,b):a.appendChild(c));return c}function r(a){for(var b;a;)b=a.nextSibling,Xb(a),a=b}function q(a){var b=p&&p[0],c=z&&z[0];if(b||c)for(;a&&(a===b||a===c||8===a.nodeType||\"\"===a.value);)a=a.nextSibling;return a}function s(){var a=D&&u.readValue();D=E.getOptions();var b={},d=g[0].firstChild;x&&g.prepend(p);d=q(d);D.items.forEach(function(a){var f,h;a.group?\n(f=b[a.group],f||(f=m(g[0],d,\"optgroup\",e),d=f.nextSibling,f.label=a.group,f=b[a.group]={groupElement:f,currentOptionElement:f.firstChild}),h=m(f.groupElement,f.currentOptionElement,\"option\",c),l(a,h),f.currentOptionElement=h.nextSibling):(h=m(g[0],d,\"option\",c),l(a,h),d=h.nextSibling)});Object.keys(b).forEach(function(a){r(b[a].currentOptionElement)});r(d);v.$render();if(!v.$isEmpty(a)){var f=u.readValue();(E.trackBy?ma(a,f):a===f)||(v.$setViewValue(f),v.$render())}}var v=k[1];if(v){var u=k[0];k=\nh.multiple;for(var p,C=0,w=g.children(),y=w.length;C<y;C++)if(\"\"===w[C].value){p=w.eq(C);break}var x=!!p,z=B(c.cloneNode(!1));z.val(\"?\");var D,E=d(h.ngOptions,g,b);k?(v.$isEmpty=function(a){return!a||0===a.length},u.writeValue=function(a){D.items.forEach(function(a){a.element.selected=!1});a&&a.forEach(function(a){(a=D.getOptionFromViewValue(a))&&!a.disabled&&(a.element.selected=!0)})},u.readValue=function(){var a=g.val()||[],b=[];n(a,function(a){(a=D.selectValueMap[a])&&!a.disabled&&b.push(D.getViewValueFromOption(a))});\nreturn b},E.trackBy&&b.$watchCollection(function(){if(I(v.$viewValue))return v.$viewValue.map(function(a){return E.getTrackByValue(a)})},function(){v.$render()})):(u.writeValue=function(a){var b=D.getOptionFromViewValue(a);b&&!b.disabled?g[0].value!==b.selectValue&&(z.remove(),x||p.remove(),g[0].value=b.selectValue,b.element.selected=!0,b.element.setAttribute(\"selected\",\"selected\")):null===a||x?(z.remove(),x||g.prepend(p),g.val(\"\"),p.prop(\"selected\",!0),p.attr(\"selected\",!0)):(x||p.remove(),g.prepend(z),\ng.val(\"?\"),z.prop(\"selected\",!0),z.attr(\"selected\",!0))},u.readValue=function(){var a=D.selectValueMap[g.val()];return a&&!a.disabled?(x||p.remove(),z.remove(),D.getViewValueFromOption(a)):null},E.trackBy&&b.$watch(function(){return E.getTrackByValue(v.$viewValue)},function(){v.$render()}));x?(p.remove(),a(p)(b),p.removeClass(\"ng-scope\")):p=B(c.cloneNode(!1));s();b.$watchCollection(E.getWatchables,s)}}}}}],Be=[\"$locale\",\"$interpolate\",\"$log\",function(a,b,d){var c=/{}/g,e=/^when(Minus)?(.+)$/;return{link:function(f,\ng,h){function k(a){g.text(a||\"\")}var l=h.count,m=h.$attr.when&&g.attr(h.$attr.when),r=h.offset||0,s=f.$eval(m)||{},u={},v=b.startSymbol(),y=b.endSymbol(),p=v+l+\"-\"+r+y,C=fa.noop,w;n(h,function(a,b){var c=e.exec(b);c&&(c=(c[1]?\"-\":\"\")+F(c[2]),s[c]=g.attr(h.$attr[b]))});n(s,function(a,d){u[d]=b(a.replace(c,p))});f.$watch(l,function(b){var c=parseFloat(b),e=isNaN(c);e||c in s||(c=a.pluralCat(c-r));c===w||e&&Q(w)&&isNaN(w)||(C(),e=u[c],q(e)?(null!=b&&d.debug(\"ngPluralize: no rule defined for '\"+c+\"' in \"+\nm),C=x,k()):C=f.$watch(e,k),w=c)})}}}],Ce=[\"$parse\",\"$animate\",function(a,b){var d=G(\"ngRepeat\"),c=function(a,b,c,d,k,l,m){a[c]=d;k&&(a[k]=l);a.$index=b;a.$first=0===b;a.$last=b===m-1;a.$middle=!(a.$first||a.$last);a.$odd=!(a.$even=0===(b&1))};return{restrict:\"A\",multiElement:!0,transclude:\"element\",priority:1E3,terminal:!0,$$tlb:!0,compile:function(e,f){var g=f.ngRepeat,h=X.createComment(\" end ngRepeat: \"+g+\" \"),k=g.match(/^\\s*([\\s\\S]+?)\\s+in\\s+([\\s\\S]+?)(?:\\s+as\\s+([\\s\\S]+?))?(?:\\s+track\\s+by\\s+([\\s\\S]+?))?\\s*$/);\nif(!k)throw d(\"iexp\",g);var l=k[1],m=k[2],r=k[3],q=k[4],k=l.match(/^(?:(\\s*[\\$\\w]+)|\\(\\s*([\\$\\w]+)\\s*,\\s*([\\$\\w]+)\\s*\\))$/);if(!k)throw d(\"iidexp\",l);var s=k[3]||k[1],v=k[2];if(r&&(!/^[$a-zA-Z_][$a-zA-Z0-9_]*$/.test(r)||/^(null|undefined|this|\\$index|\\$first|\\$middle|\\$last|\\$even|\\$odd|\\$parent|\\$root|\\$id)$/.test(r)))throw d(\"badident\",r);var x,p,y,w,z={$id:Ca};q?x=a(q):(y=function(a,b){return Ca(b)},w=function(a){return a});return function(a,e,f,k,l){x&&(p=function(b,c,d){v&&(z[v]=b);z[s]=c;z.$index=\nd;return x(a,z)});var q=$();a.$watchCollection(m,function(f){var k,m,t=e[0],x,z=$(),D,E,H,F,I,G,J;r&&(a[r]=f);if(za(f))I=f,m=p||y;else for(J in m=p||w,I=[],f)qa.call(f,J)&&\"$\"!==J.charAt(0)&&I.push(J);D=I.length;J=Array(D);for(k=0;k<D;k++)if(E=f===I?k:I[k],H=f[E],F=m(E,H,k),q[F])G=q[F],delete q[F],z[F]=G,J[k]=G;else{if(z[F])throw n(J,function(a){a&&a.scope&&(q[a.id]=a)}),d(\"dupes\",g,F,H);J[k]={id:F,scope:u,clone:u};z[F]=!0}for(x in q){G=q[x];F=rb(G.clone);b.leave(F);if(F[0].parentNode)for(k=0,m=F.length;k<\nm;k++)F[k].$$NG_REMOVED=!0;G.scope.$destroy()}for(k=0;k<D;k++)if(E=f===I?k:I[k],H=f[E],G=J[k],G.scope){x=t;do x=x.nextSibling;while(x&&x.$$NG_REMOVED);G.clone[0]!=x&&b.move(rb(G.clone),null,B(t));t=G.clone[G.clone.length-1];c(G.scope,k,s,H,v,E,D)}else l(function(a,d){G.scope=d;var e=h.cloneNode(!1);a[a.length++]=e;b.enter(a,null,B(t));t=e;G.clone=a;z[G.id]=G;c(G.scope,k,s,H,v,E,D)});q=z})}}}}],De=[\"$animate\",function(a){return{restrict:\"A\",multiElement:!0,link:function(b,d,c){b.$watch(c.ngShow,function(b){a[b?\n\"removeClass\":\"addClass\"](d,\"ng-hide\",{tempClasses:\"ng-hide-animate\"})})}}}],we=[\"$animate\",function(a){return{restrict:\"A\",multiElement:!0,link:function(b,d,c){b.$watch(c.ngHide,function(b){a[b?\"addClass\":\"removeClass\"](d,\"ng-hide\",{tempClasses:\"ng-hide-animate\"})})}}}],Ee=La(function(a,b,d){a.$watch(d.ngStyle,function(a,d){d&&a!==d&&n(d,function(a,c){b.css(c,\"\")});a&&b.css(a)},!0)}),Fe=[\"$animate\",function(a){return{require:\"ngSwitch\",controller:[\"$scope\",function(){this.cases={}}],link:function(b,\nd,c,e){var f=[],g=[],h=[],k=[],l=function(a,b){return function(){a.splice(b,1)}};b.$watch(c.ngSwitch||c.on,function(b){var c,d;c=0;for(d=h.length;c<d;++c)a.cancel(h[c]);c=h.length=0;for(d=k.length;c<d;++c){var q=rb(g[c].clone);k[c].$destroy();(h[c]=a.leave(q)).then(l(h,c))}g.length=0;k.length=0;(f=e.cases[\"!\"+b]||e.cases[\"?\"])&&n(f,function(b){b.transclude(function(c,d){k.push(d);var e=b.element;c[c.length++]=X.createComment(\" end ngSwitchWhen: \");g.push({clone:c});a.enter(c,e.parent(),e)})})})}}}],\nGe=La({transclude:\"element\",priority:1200,require:\"^ngSwitch\",multiElement:!0,link:function(a,b,d,c,e){c.cases[\"!\"+d.ngSwitchWhen]=c.cases[\"!\"+d.ngSwitchWhen]||[];c.cases[\"!\"+d.ngSwitchWhen].push({transclude:e,element:b})}}),He=La({transclude:\"element\",priority:1200,require:\"^ngSwitch\",multiElement:!0,link:function(a,b,d,c,e){c.cases[\"?\"]=c.cases[\"?\"]||[];c.cases[\"?\"].push({transclude:e,element:b})}}),Je=La({restrict:\"EAC\",link:function(a,b,d,c,e){if(!e)throw G(\"ngTransclude\")(\"orphan\",ua(b));e(function(a){b.empty();\nb.append(a)})}}),je=[\"$templateCache\",function(a){return{restrict:\"E\",terminal:!0,compile:function(b,d){\"text/ng-template\"==d.type&&a.put(d.id,b[0].text)}}}],Cg={$setViewValue:x,$render:x},Dg=[\"$element\",\"$scope\",\"$attrs\",function(a,b,d){var c=this,e=new Sa;c.ngModelCtrl=Cg;c.unknownOption=B(X.createElement(\"option\"));c.renderUnknownOption=function(b){b=\"? \"+Ca(b)+\" ?\";c.unknownOption.val(b);a.prepend(c.unknownOption);a.val(b)};b.$on(\"$destroy\",function(){c.renderUnknownOption=x});c.removeUnknownOption=\nfunction(){c.unknownOption.parent()&&c.unknownOption.remove()};c.readValue=function(){c.removeUnknownOption();return a.val()};c.writeValue=function(b){c.hasOption(b)?(c.removeUnknownOption(),a.val(b),\"\"===b&&c.emptyOption.prop(\"selected\",!0)):null==b&&c.emptyOption?(c.removeUnknownOption(),a.val(\"\")):c.renderUnknownOption(b)};c.addOption=function(a,b){Ra(a,'\"option value\"');\"\"===a&&(c.emptyOption=b);var d=e.get(a)||0;e.put(a,d+1);c.ngModelCtrl.$render();b[0].hasAttribute(\"selected\")&&(b[0].selected=\n!0)};c.removeOption=function(a){var b=e.get(a);b&&(1===b?(e.remove(a),\"\"===a&&(c.emptyOption=u)):e.put(a,b-1))};c.hasOption=function(a){return!!e.get(a)};c.registerOption=function(a,b,d,e,l){if(e){var m;d.$observe(\"value\",function(a){y(m)&&c.removeOption(m);m=a;c.addOption(a,b)})}else l?a.$watch(l,function(a,e){d.$set(\"value\",a);e!==a&&c.removeOption(e);c.addOption(a,b)}):c.addOption(d.value,b);b.on(\"$destroy\",function(){c.removeOption(d.value);c.ngModelCtrl.$render()})}}],ke=function(){return{restrict:\"E\",\nrequire:[\"select\",\"?ngModel\"],controller:Dg,priority:1,link:{pre:function(a,b,d,c){var e=c[1];if(e){var f=c[0];f.ngModelCtrl=e;e.$render=function(){f.writeValue(e.$viewValue)};b.on(\"change\",function(){a.$apply(function(){e.$setViewValue(f.readValue())})});if(d.multiple){f.readValue=function(){var a=[];n(b.find(\"option\"),function(b){b.selected&&a.push(b.value)});return a};f.writeValue=function(a){var c=new Sa(a);n(b.find(\"option\"),function(a){a.selected=y(c.get(a.value))})};var g,h=NaN;a.$watch(function(){h!==\ne.$viewValue||ma(g,e.$viewValue)||(g=ia(e.$viewValue),e.$render());h=e.$viewValue});e.$isEmpty=function(a){return!a||0===a.length}}}}}}},me=[\"$interpolate\",function(a){return{restrict:\"E\",priority:100,compile:function(b,d){if(y(d.value))var c=a(d.value,!0);else{var e=a(b.text(),!0);e||d.$set(\"value\",b.text())}return function(a,b,d){var k=b.parent();(k=k.data(\"$selectController\")||k.parent().data(\"$selectController\"))&&k.registerOption(a,b,d,c,e)}}}}],le=na({restrict:\"E\",terminal:!1}),Fc=function(){return{restrict:\"A\",\nrequire:\"?ngModel\",link:function(a,b,d,c){c&&(d.required=!0,c.$validators.required=function(a,b){return!d.required||!c.$isEmpty(b)},d.$observe(\"required\",function(){c.$validate()}))}}},Ec=function(){return{restrict:\"A\",require:\"?ngModel\",link:function(a,b,d,c){if(c){var e,f=d.ngPattern||d.pattern;d.$observe(\"pattern\",function(a){E(a)&&0<a.length&&(a=new RegExp(\"^\"+a+\"$\"));if(a&&!a.test)throw G(\"ngPattern\")(\"noregexp\",f,a,ua(b));e=a||u;c.$validate()});c.$validators.pattern=function(a,b){return c.$isEmpty(b)||\nq(e)||e.test(b)}}}}},Hc=function(){return{restrict:\"A\",require:\"?ngModel\",link:function(a,b,d,c){if(c){var e=-1;d.$observe(\"maxlength\",function(a){a=ea(a);e=isNaN(a)?-1:a;c.$validate()});c.$validators.maxlength=function(a,b){return 0>e||c.$isEmpty(b)||b.length<=e}}}}},Gc=function(){return{restrict:\"A\",require:\"?ngModel\",link:function(a,b,d,c){if(c){var e=0;d.$observe(\"minlength\",function(a){e=ea(a)||0;c.$validate()});c.$validators.minlength=function(a,b){return c.$isEmpty(b)||b.length>=e}}}}};S.angular.bootstrap?\nconsole.log(\"WARNING: Tried to load angular more than once.\"):(ce(),ee(fa),fa.module(\"ngLocale\",[],[\"$provide\",function(a){function b(a){a+=\"\";var b=a.indexOf(\".\");return-1==b?0:a.length-b-1}a.value(\"$locale\",{DATETIME_FORMATS:{AMPMS:[\"AM\",\"PM\"],DAY:\"Sunday Monday Tuesday Wednesday Thursday Friday Saturday\".split(\" \"),ERANAMES:[\"Before Christ\",\"Anno Domini\"],ERAS:[\"BC\",\"AD\"],FIRSTDAYOFWEEK:6,MONTH:\"January February March April May June July August September October November December\".split(\" \"),SHORTDAY:\"Sun Mon Tue Wed Thu Fri Sat\".split(\" \"),\nSHORTMONTH:\"Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec\".split(\" \"),WEEKENDRANGE:[5,6],fullDate:\"EEEE, MMMM d, y\",longDate:\"MMMM d, y\",medium:\"MMM d, y h:mm:ss a\",mediumDate:\"MMM d, y\",mediumTime:\"h:mm:ss a\",\"short\":\"M/d/yy h:mm a\",shortDate:\"M/d/yy\",shortTime:\"h:mm a\"},NUMBER_FORMATS:{CURRENCY_SYM:\"$\",DECIMAL_SEP:\".\",GROUP_SEP:\",\",PATTERNS:[{gSize:3,lgSize:3,maxFrac:3,minFrac:0,minInt:1,negPre:\"-\",negSuf:\"\",posPre:\"\",posSuf:\"\"},{gSize:3,lgSize:3,maxFrac:2,minFrac:2,minInt:1,negPre:\"-\\u00a4\",\nnegSuf:\"\",posPre:\"\\u00a4\",posSuf:\"\"}]},id:\"en-us\",pluralCat:function(a,c){var e=a|0,f=c;u===f&&(f=Math.min(b(a),3));Math.pow(10,f);return 1==e&&0==f?\"one\":\"other\"}})}]),B(X).ready(function(){Zd(X,yc)}))})(window,document);!window.angular.$$csp().noInlineStyle&&window.angular.element(document.head).prepend('<style type=\"text/css\">@charset \"UTF-8\";[ng\\\\:cloak],[ng-cloak],[data-ng-cloak],[x-ng-cloak],.ng-cloak,.x-ng-cloak,.ng-hide:not(.ng-hide-animate){display:none !important;}ng\\\\:form{display:block;}.ng-animate-shim{visibility:hidden;}.ng-anchor{position:absolute;}</style>');\n//# sourceMappingURL=angular.min.js.map\n\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9+L2FuZ3VsYXIvYW5ndWxhci5taW4uanM/ODRiNCJdLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuIEFuZ3VsYXJKUyB2MS40LjhcbiAoYykgMjAxMC0yMDE1IEdvb2dsZSwgSW5jLiBodHRwOi8vYW5ndWxhcmpzLm9yZ1xuIExpY2Vuc2U6IE1JVFxuKi9cbihmdW5jdGlvbihTLFgsdSl7J3VzZSBzdHJpY3QnO2Z1bmN0aW9uIEcoYSl7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGI9YXJndW1lbnRzWzBdLGQ7ZD1cIltcIisoYT9hK1wiOlwiOlwiXCIpK2IrXCJdIGh0dHA6Ly9lcnJvcnMuYW5ndWxhcmpzLm9yZy8xLjQuOC9cIisoYT9hK1wiL1wiOlwiXCIpK2I7Zm9yKGI9MTtiPGFyZ3VtZW50cy5sZW5ndGg7YisrKXtkPWQrKDE9PWI/XCI/XCI6XCImXCIpK1wicFwiKyhiLTEpK1wiPVwiO3ZhciBjPWVuY29kZVVSSUNvbXBvbmVudCxlO2U9YXJndW1lbnRzW2JdO2U9XCJmdW5jdGlvblwiPT10eXBlb2YgZT9lLnRvU3RyaW5nKCkucmVwbGFjZSgvIFxce1tcXHNcXFNdKiQvLFwiXCIpOlwidW5kZWZpbmVkXCI9PXR5cGVvZiBlP1widW5kZWZpbmVkXCI6XCJzdHJpbmdcIiE9dHlwZW9mIGU/SlNPTi5zdHJpbmdpZnkoZSk6ZTtkKz1jKGUpfXJldHVybiBFcnJvcihkKX19ZnVuY3Rpb24gemEoYSl7aWYobnVsbD09YXx8WGEoYSkpcmV0dXJuITE7aWYoSShhKXx8RShhKXx8QiYmYSBpbnN0YW5jZW9mIEIpcmV0dXJuITA7XG52YXIgYj1cImxlbmd0aFwiaW4gT2JqZWN0KGEpJiZhLmxlbmd0aDtyZXR1cm4gUShiKSYmKDA8PWImJmItMSBpbiBhfHxcImZ1bmN0aW9uXCI9PXR5cGVvZiBhLml0ZW0pfWZ1bmN0aW9uIG4oYSxiLGQpe3ZhciBjLGU7aWYoYSlpZih6KGEpKWZvcihjIGluIGEpXCJwcm90b3R5cGVcIj09Y3x8XCJsZW5ndGhcIj09Y3x8XCJuYW1lXCI9PWN8fGEuaGFzT3duUHJvcGVydHkmJiFhLmhhc093blByb3BlcnR5KGMpfHxiLmNhbGwoZCxhW2NdLGMsYSk7ZWxzZSBpZihJKGEpfHx6YShhKSl7dmFyIGY9XCJvYmplY3RcIiE9PXR5cGVvZiBhO2M9MDtmb3IoZT1hLmxlbmd0aDtjPGU7YysrKShmfHxjIGluIGEpJiZiLmNhbGwoZCxhW2NdLGMsYSl9ZWxzZSBpZihhLmZvckVhY2gmJmEuZm9yRWFjaCE9PW4pYS5mb3JFYWNoKGIsZCxhKTtlbHNlIGlmKG5jKGEpKWZvcihjIGluIGEpYi5jYWxsKGQsYVtjXSxjLGEpO2Vsc2UgaWYoXCJmdW5jdGlvblwiPT09dHlwZW9mIGEuaGFzT3duUHJvcGVydHkpZm9yKGMgaW4gYSlhLmhhc093blByb3BlcnR5KGMpJiZcbmIuY2FsbChkLGFbY10sYyxhKTtlbHNlIGZvcihjIGluIGEpcWEuY2FsbChhLGMpJiZiLmNhbGwoZCxhW2NdLGMsYSk7cmV0dXJuIGF9ZnVuY3Rpb24gb2MoYSxiLGQpe2Zvcih2YXIgYz1PYmplY3Qua2V5cyhhKS5zb3J0KCksZT0wO2U8Yy5sZW5ndGg7ZSsrKWIuY2FsbChkLGFbY1tlXV0sY1tlXSk7cmV0dXJuIGN9ZnVuY3Rpb24gcGMoYSl7cmV0dXJuIGZ1bmN0aW9uKGIsZCl7YShkLGIpfX1mdW5jdGlvbiBUZCgpe3JldHVybisrbmJ9ZnVuY3Rpb24gTWIoYSxiLGQpe2Zvcih2YXIgYz1hLiQkaGFzaEtleSxlPTAsZj1iLmxlbmd0aDtlPGY7KytlKXt2YXIgZz1iW2VdO2lmKEgoZyl8fHooZykpZm9yKHZhciBoPU9iamVjdC5rZXlzKGcpLGs9MCxsPWgubGVuZ3RoO2s8bDtrKyspe3ZhciBtPWhba10scj1nW21dO2QmJkgocik/ZGEocik/YVttXT1uZXcgRGF0ZShyLnZhbHVlT2YoKSk6TWEocik/YVttXT1uZXcgUmVnRXhwKHIpOnIubm9kZU5hbWU/YVttXT1yLmNsb25lTm9kZSghMCk6XG5OYihyKT9hW21dPXIuY2xvbmUoKTooSChhW21dKXx8KGFbbV09SShyKT9bXTp7fSksTWIoYVttXSxbcl0sITApKTphW21dPXJ9fWM/YS4kJGhhc2hLZXk9YzpkZWxldGUgYS4kJGhhc2hLZXk7cmV0dXJuIGF9ZnVuY3Rpb24gTShhKXtyZXR1cm4gTWIoYSxyYS5jYWxsKGFyZ3VtZW50cywxKSwhMSl9ZnVuY3Rpb24gVWQoYSl7cmV0dXJuIE1iKGEscmEuY2FsbChhcmd1bWVudHMsMSksITApfWZ1bmN0aW9uIGVhKGEpe3JldHVybiBwYXJzZUludChhLDEwKX1mdW5jdGlvbiBPYihhLGIpe3JldHVybiBNKE9iamVjdC5jcmVhdGUoYSksYil9ZnVuY3Rpb24geCgpe31mdW5jdGlvbiBZYShhKXtyZXR1cm4gYX1mdW5jdGlvbiBuYShhKXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gYX19ZnVuY3Rpb24gcWMoYSl7cmV0dXJuIHooYS50b1N0cmluZykmJmEudG9TdHJpbmchPT1zYX1mdW5jdGlvbiBxKGEpe3JldHVyblwidW5kZWZpbmVkXCI9PT10eXBlb2YgYX1mdW5jdGlvbiB5KGEpe3JldHVyblwidW5kZWZpbmVkXCIhPT1cbnR5cGVvZiBhfWZ1bmN0aW9uIEgoYSl7cmV0dXJuIG51bGwhPT1hJiZcIm9iamVjdFwiPT09dHlwZW9mIGF9ZnVuY3Rpb24gbmMoYSl7cmV0dXJuIG51bGwhPT1hJiZcIm9iamVjdFwiPT09dHlwZW9mIGEmJiFyYyhhKX1mdW5jdGlvbiBFKGEpe3JldHVyblwic3RyaW5nXCI9PT10eXBlb2YgYX1mdW5jdGlvbiBRKGEpe3JldHVyblwibnVtYmVyXCI9PT10eXBlb2YgYX1mdW5jdGlvbiBkYShhKXtyZXR1cm5cIltvYmplY3QgRGF0ZV1cIj09PXNhLmNhbGwoYSl9ZnVuY3Rpb24geihhKXtyZXR1cm5cImZ1bmN0aW9uXCI9PT10eXBlb2YgYX1mdW5jdGlvbiBNYShhKXtyZXR1cm5cIltvYmplY3QgUmVnRXhwXVwiPT09c2EuY2FsbChhKX1mdW5jdGlvbiBYYShhKXtyZXR1cm4gYSYmYS53aW5kb3c9PT1hfWZ1bmN0aW9uIFphKGEpe3JldHVybiBhJiZhLiRldmFsQXN5bmMmJmEuJHdhdGNofWZ1bmN0aW9uICRhKGEpe3JldHVyblwiYm9vbGVhblwiPT09dHlwZW9mIGF9ZnVuY3Rpb24gc2MoYSl7cmV0dXJuIGEmJlEoYS5sZW5ndGgpJiZcblZkLnRlc3Qoc2EuY2FsbChhKSl9ZnVuY3Rpb24gTmIoYSl7cmV0dXJuISghYXx8IShhLm5vZGVOYW1lfHxhLnByb3AmJmEuYXR0ciYmYS5maW5kKSl9ZnVuY3Rpb24gV2QoYSl7dmFyIGI9e307YT1hLnNwbGl0KFwiLFwiKTt2YXIgZDtmb3IoZD0wO2Q8YS5sZW5ndGg7ZCsrKWJbYVtkXV09ITA7cmV0dXJuIGJ9ZnVuY3Rpb24gdGEoYSl7cmV0dXJuIEYoYS5ub2RlTmFtZXx8YVswXSYmYVswXS5ub2RlTmFtZSl9ZnVuY3Rpb24gYWIoYSxiKXt2YXIgZD1hLmluZGV4T2YoYik7MDw9ZCYmYS5zcGxpY2UoZCwxKTtyZXR1cm4gZH1mdW5jdGlvbiBiYihhLGIpe2Z1bmN0aW9uIGQoYSxiKXt2YXIgZD1iLiQkaGFzaEtleSxlO2lmKEkoYSkpe2U9MDtmb3IodmFyIGY9YS5sZW5ndGg7ZTxmO2UrKyliLnB1c2goYyhhW2VdKSl9ZWxzZSBpZihuYyhhKSlmb3IoZSBpbiBhKWJbZV09YyhhW2VdKTtlbHNlIGlmKGEmJlwiZnVuY3Rpb25cIj09PXR5cGVvZiBhLmhhc093blByb3BlcnR5KWZvcihlIGluIGEpYS5oYXNPd25Qcm9wZXJ0eShlKSYmXG4oYltlXT1jKGFbZV0pKTtlbHNlIGZvcihlIGluIGEpcWEuY2FsbChhLGUpJiYoYltlXT1jKGFbZV0pKTtkP2IuJCRoYXNoS2V5PWQ6ZGVsZXRlIGIuJCRoYXNoS2V5O3JldHVybiBifWZ1bmN0aW9uIGMoYSl7aWYoIUgoYSkpcmV0dXJuIGE7dmFyIGI9ZS5pbmRleE9mKGEpO2lmKC0xIT09YilyZXR1cm4gZltiXTtpZihYYShhKXx8WmEoYSkpdGhyb3cgQWEoXCJjcHdzXCIpO3ZhciBiPSExLGM7SShhKT8oYz1bXSxiPSEwKTpzYyhhKT9jPW5ldyBhLmNvbnN0cnVjdG9yKGEpOmRhKGEpP2M9bmV3IERhdGUoYS5nZXRUaW1lKCkpOk1hKGEpPyhjPW5ldyBSZWdFeHAoYS5zb3VyY2UsYS50b1N0cmluZygpLm1hdGNoKC9bXlxcL10qJC8pWzBdKSxjLmxhc3RJbmRleD1hLmxhc3RJbmRleCk6eihhLmNsb25lTm9kZSk/Yz1hLmNsb25lTm9kZSghMCk6KGM9T2JqZWN0LmNyZWF0ZShyYyhhKSksYj0hMCk7ZS5wdXNoKGEpO2YucHVzaChjKTtyZXR1cm4gYj9kKGEsYyk6Y312YXIgZT1bXSxmPVtdO2lmKGIpe2lmKHNjKGIpKXRocm93IEFhKFwiY3B0YVwiKTtcbmlmKGE9PT1iKXRocm93IEFhKFwiY3BpXCIpO0koYik/Yi5sZW5ndGg9MDpuKGIsZnVuY3Rpb24oYSxjKXtcIiQkaGFzaEtleVwiIT09YyYmZGVsZXRlIGJbY119KTtlLnB1c2goYSk7Zi5wdXNoKGIpO3JldHVybiBkKGEsYil9cmV0dXJuIGMoYSl9ZnVuY3Rpb24gaWEoYSxiKXtpZihJKGEpKXtiPWJ8fFtdO2Zvcih2YXIgZD0wLGM9YS5sZW5ndGg7ZDxjO2QrKyliW2RdPWFbZF19ZWxzZSBpZihIKGEpKWZvcihkIGluIGI9Ynx8e30sYSlpZihcIiRcIiE9PWQuY2hhckF0KDApfHxcIiRcIiE9PWQuY2hhckF0KDEpKWJbZF09YVtkXTtyZXR1cm4gYnx8YX1mdW5jdGlvbiBtYShhLGIpe2lmKGE9PT1iKXJldHVybiEwO2lmKG51bGw9PT1hfHxudWxsPT09YilyZXR1cm4hMTtpZihhIT09YSYmYiE9PWIpcmV0dXJuITA7dmFyIGQ9dHlwZW9mIGEsYztpZihkPT10eXBlb2YgYiYmXCJvYmplY3RcIj09ZClpZihJKGEpKXtpZighSShiKSlyZXR1cm4hMTtpZigoZD1hLmxlbmd0aCk9PWIubGVuZ3RoKXtmb3IoYz1cbjA7YzxkO2MrKylpZighbWEoYVtjXSxiW2NdKSlyZXR1cm4hMTtyZXR1cm4hMH19ZWxzZXtpZihkYShhKSlyZXR1cm4gZGEoYik/bWEoYS5nZXRUaW1lKCksYi5nZXRUaW1lKCkpOiExO2lmKE1hKGEpKXJldHVybiBNYShiKT9hLnRvU3RyaW5nKCk9PWIudG9TdHJpbmcoKTohMTtpZihaYShhKXx8WmEoYil8fFhhKGEpfHxYYShiKXx8SShiKXx8ZGEoYil8fE1hKGIpKXJldHVybiExO2Q9JCgpO2ZvcihjIGluIGEpaWYoXCIkXCIhPT1jLmNoYXJBdCgwKSYmIXooYVtjXSkpe2lmKCFtYShhW2NdLGJbY10pKXJldHVybiExO2RbY109ITB9Zm9yKGMgaW4gYilpZighKGMgaW4gZCkmJlwiJFwiIT09Yy5jaGFyQXQoMCkmJnkoYltjXSkmJiF6KGJbY10pKXJldHVybiExO3JldHVybiEwfXJldHVybiExfWZ1bmN0aW9uIGNiKGEsYixkKXtyZXR1cm4gYS5jb25jYXQocmEuY2FsbChiLGQpKX1mdW5jdGlvbiB0YyhhLGIpe3ZhciBkPTI8YXJndW1lbnRzLmxlbmd0aD9yYS5jYWxsKGFyZ3VtZW50cywyKTpcbltdO3JldHVybiF6KGIpfHxiIGluc3RhbmNlb2YgUmVnRXhwP2I6ZC5sZW5ndGg/ZnVuY3Rpb24oKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD9iLmFwcGx5KGEsY2IoZCxhcmd1bWVudHMsMCkpOmIuYXBwbHkoYSxkKX06ZnVuY3Rpb24oKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD9iLmFwcGx5KGEsYXJndW1lbnRzKTpiLmNhbGwoYSl9fWZ1bmN0aW9uIFhkKGEsYil7dmFyIGQ9YjtcInN0cmluZ1wiPT09dHlwZW9mIGEmJlwiJFwiPT09YS5jaGFyQXQoMCkmJlwiJFwiPT09YS5jaGFyQXQoMSk/ZD11OlhhKGIpP2Q9XCIkV0lORE9XXCI6YiYmWD09PWI/ZD1cIiRET0NVTUVOVFwiOlphKGIpJiYoZD1cIiRTQ09QRVwiKTtyZXR1cm4gZH1mdW5jdGlvbiBkYihhLGIpe2lmKFwidW5kZWZpbmVkXCI9PT10eXBlb2YgYSlyZXR1cm4gdTtRKGIpfHwoYj1iPzI6bnVsbCk7cmV0dXJuIEpTT04uc3RyaW5naWZ5KGEsWGQsYil9ZnVuY3Rpb24gdWMoYSl7cmV0dXJuIEUoYSk/SlNPTi5wYXJzZShhKTphfWZ1bmN0aW9uIHZjKGEsXG5iKXt2YXIgZD1EYXRlLnBhcnNlKFwiSmFuIDAxLCAxOTcwIDAwOjAwOjAwIFwiK2EpLzZFNDtyZXR1cm4gaXNOYU4oZCk/YjpkfWZ1bmN0aW9uIFBiKGEsYixkKXtkPWQ/LTE6MTt2YXIgYz12YyhiLGEuZ2V0VGltZXpvbmVPZmZzZXQoKSk7Yj1hO2E9ZCooYy1hLmdldFRpbWV6b25lT2Zmc2V0KCkpO2I9bmV3IERhdGUoYi5nZXRUaW1lKCkpO2Iuc2V0TWludXRlcyhiLmdldE1pbnV0ZXMoKSthKTtyZXR1cm4gYn1mdW5jdGlvbiB1YShhKXthPUIoYSkuY2xvbmUoKTt0cnl7YS5lbXB0eSgpfWNhdGNoKGIpe312YXIgZD1CKFwiPGRpdj5cIikuYXBwZW5kKGEpLmh0bWwoKTt0cnl7cmV0dXJuIGFbMF0ubm9kZVR5cGU9PT1OYT9GKGQpOmQubWF0Y2goL14oPFtePl0rPikvKVsxXS5yZXBsYWNlKC9ePChbXFx3XFwtXSspLyxmdW5jdGlvbihhLGIpe3JldHVyblwiPFwiK0YoYil9KX1jYXRjaChjKXtyZXR1cm4gRihkKX19ZnVuY3Rpb24gd2MoYSl7dHJ5e3JldHVybiBkZWNvZGVVUklDb21wb25lbnQoYSl9Y2F0Y2goYil7fX1cbmZ1bmN0aW9uIHhjKGEpe3ZhciBiPXt9O24oKGF8fFwiXCIpLnNwbGl0KFwiJlwiKSxmdW5jdGlvbihhKXt2YXIgYyxlLGY7YSYmKGU9YT1hLnJlcGxhY2UoL1xcKy9nLFwiJTIwXCIpLGM9YS5pbmRleE9mKFwiPVwiKSwtMSE9PWMmJihlPWEuc3Vic3RyaW5nKDAsYyksZj1hLnN1YnN0cmluZyhjKzEpKSxlPXdjKGUpLHkoZSkmJihmPXkoZik/d2MoZik6ITAscWEuY2FsbChiLGUpP0koYltlXSk/YltlXS5wdXNoKGYpOmJbZV09W2JbZV0sZl06YltlXT1mKSl9KTtyZXR1cm4gYn1mdW5jdGlvbiBRYihhKXt2YXIgYj1bXTtuKGEsZnVuY3Rpb24oYSxjKXtJKGEpP24oYSxmdW5jdGlvbihhKXtiLnB1c2goamEoYywhMCkrKCEwPT09YT9cIlwiOlwiPVwiK2phKGEsITApKSl9KTpiLnB1c2goamEoYywhMCkrKCEwPT09YT9cIlwiOlwiPVwiK2phKGEsITApKSl9KTtyZXR1cm4gYi5sZW5ndGg/Yi5qb2luKFwiJlwiKTpcIlwifWZ1bmN0aW9uIG9iKGEpe3JldHVybiBqYShhLCEwKS5yZXBsYWNlKC8lMjYvZ2ksXCImXCIpLnJlcGxhY2UoLyUzRC9naSxcblwiPVwiKS5yZXBsYWNlKC8lMkIvZ2ksXCIrXCIpfWZ1bmN0aW9uIGphKGEsYil7cmV0dXJuIGVuY29kZVVSSUNvbXBvbmVudChhKS5yZXBsYWNlKC8lNDAvZ2ksXCJAXCIpLnJlcGxhY2UoLyUzQS9naSxcIjpcIikucmVwbGFjZSgvJTI0L2csXCIkXCIpLnJlcGxhY2UoLyUyQy9naSxcIixcIikucmVwbGFjZSgvJTNCL2dpLFwiO1wiKS5yZXBsYWNlKC8lMjAvZyxiP1wiJTIwXCI6XCIrXCIpfWZ1bmN0aW9uIFlkKGEsYil7dmFyIGQsYyxlPU9hLmxlbmd0aDtmb3IoYz0wO2M8ZTsrK2MpaWYoZD1PYVtjXStiLEUoZD1hLmdldEF0dHJpYnV0ZShkKSkpcmV0dXJuIGQ7cmV0dXJuIG51bGx9ZnVuY3Rpb24gWmQoYSxiKXt2YXIgZCxjLGU9e307bihPYSxmdW5jdGlvbihiKXtiKz1cImFwcFwiOyFkJiZhLmhhc0F0dHJpYnV0ZSYmYS5oYXNBdHRyaWJ1dGUoYikmJihkPWEsYz1hLmdldEF0dHJpYnV0ZShiKSl9KTtuKE9hLGZ1bmN0aW9uKGIpe2IrPVwiYXBwXCI7dmFyIGU7IWQmJihlPWEucXVlcnlTZWxlY3RvcihcIltcIitiLnJlcGxhY2UoXCI6XCIsXG5cIlxcXFw6XCIpK1wiXVwiKSkmJihkPWUsYz1lLmdldEF0dHJpYnV0ZShiKSl9KTtkJiYoZS5zdHJpY3REaT1udWxsIT09WWQoZCxcInN0cmljdC1kaVwiKSxiKGQsYz9bY106W10sZSkpfWZ1bmN0aW9uIHljKGEsYixkKXtIKGQpfHwoZD17fSk7ZD1NKHtzdHJpY3REaTohMX0sZCk7dmFyIGM9ZnVuY3Rpb24oKXthPUIoYSk7aWYoYS5pbmplY3RvcigpKXt2YXIgYz1hWzBdPT09WD9cImRvY3VtZW50XCI6dWEoYSk7dGhyb3cgQWEoXCJidHN0cnBkXCIsYy5yZXBsYWNlKC88LyxcIiZsdDtcIikucmVwbGFjZSgvPi8sXCImZ3Q7XCIpKTt9Yj1ifHxbXTtiLnVuc2hpZnQoW1wiJHByb3ZpZGVcIixmdW5jdGlvbihiKXtiLnZhbHVlKFwiJHJvb3RFbGVtZW50XCIsYSl9XSk7ZC5kZWJ1Z0luZm9FbmFibGVkJiZiLnB1c2goW1wiJGNvbXBpbGVQcm92aWRlclwiLGZ1bmN0aW9uKGEpe2EuZGVidWdJbmZvRW5hYmxlZCghMCl9XSk7Yi51bnNoaWZ0KFwibmdcIik7Yz1lYihiLGQuc3RyaWN0RGkpO2MuaW52b2tlKFtcIiRyb290U2NvcGVcIixcblwiJHJvb3RFbGVtZW50XCIsXCIkY29tcGlsZVwiLFwiJGluamVjdG9yXCIsZnVuY3Rpb24oYSxiLGMsZCl7YS4kYXBwbHkoZnVuY3Rpb24oKXtiLmRhdGEoXCIkaW5qZWN0b3JcIixkKTtjKGIpKGEpfSl9XSk7cmV0dXJuIGN9LGU9L15OR19FTkFCTEVfREVCVUdfSU5GTyEvLGY9L15OR19ERUZFUl9CT09UU1RSQVAhLztTJiZlLnRlc3QoUy5uYW1lKSYmKGQuZGVidWdJbmZvRW5hYmxlZD0hMCxTLm5hbWU9Uy5uYW1lLnJlcGxhY2UoZSxcIlwiKSk7aWYoUyYmIWYudGVzdChTLm5hbWUpKXJldHVybiBjKCk7Uy5uYW1lPVMubmFtZS5yZXBsYWNlKGYsXCJcIik7ZmEucmVzdW1lQm9vdHN0cmFwPWZ1bmN0aW9uKGEpe24oYSxmdW5jdGlvbihhKXtiLnB1c2goYSl9KTtyZXR1cm4gYygpfTt6KGZhLnJlc3VtZURlZmVycmVkQm9vdHN0cmFwKSYmZmEucmVzdW1lRGVmZXJyZWRCb290c3RyYXAoKX1mdW5jdGlvbiAkZCgpe1MubmFtZT1cIk5HX0VOQUJMRV9ERUJVR19JTkZPIVwiK1MubmFtZTtTLmxvY2F0aW9uLnJlbG9hZCgpfVxuZnVuY3Rpb24gYWUoYSl7YT1mYS5lbGVtZW50KGEpLmluamVjdG9yKCk7aWYoIWEpdGhyb3cgQWEoXCJ0ZXN0XCIpO3JldHVybiBhLmdldChcIiQkdGVzdGFiaWxpdHlcIil9ZnVuY3Rpb24gemMoYSxiKXtiPWJ8fFwiX1wiO3JldHVybiBhLnJlcGxhY2UoYmUsZnVuY3Rpb24oYSxjKXtyZXR1cm4oYz9iOlwiXCIpK2EudG9Mb3dlckNhc2UoKX0pfWZ1bmN0aW9uIGNlKCl7dmFyIGE7aWYoIUFjKXt2YXIgYj1wYigpOyhvYT1xKGIpP1MualF1ZXJ5OmI/U1tiXTp1KSYmb2EuZm4ub24/KEI9b2EsTShvYS5mbix7c2NvcGU6UGEuc2NvcGUsaXNvbGF0ZVNjb3BlOlBhLmlzb2xhdGVTY29wZSxjb250cm9sbGVyOlBhLmNvbnRyb2xsZXIsaW5qZWN0b3I6UGEuaW5qZWN0b3IsaW5oZXJpdGVkRGF0YTpQYS5pbmhlcml0ZWREYXRhfSksYT1vYS5jbGVhbkRhdGEsb2EuY2xlYW5EYXRhPWZ1bmN0aW9uKGIpe3ZhciBjO2lmKFJiKVJiPSExO2Vsc2UgZm9yKHZhciBlPTAsZjtudWxsIT0oZj1iW2VdKTtlKyspKGM9XG5vYS5fZGF0YShmLFwiZXZlbnRzXCIpKSYmYy4kZGVzdHJveSYmb2EoZikudHJpZ2dlckhhbmRsZXIoXCIkZGVzdHJveVwiKTthKGIpfSk6Qj1OO2ZhLmVsZW1lbnQ9QjtBYz0hMH19ZnVuY3Rpb24gcWIoYSxiLGQpe2lmKCFhKXRocm93IEFhKFwiYXJlcVwiLGJ8fFwiP1wiLGR8fFwicmVxdWlyZWRcIik7cmV0dXJuIGF9ZnVuY3Rpb24gUWEoYSxiLGQpe2QmJkkoYSkmJihhPWFbYS5sZW5ndGgtMV0pO3FiKHooYSksYixcIm5vdCBhIGZ1bmN0aW9uLCBnb3QgXCIrKGEmJlwib2JqZWN0XCI9PT10eXBlb2YgYT9hLmNvbnN0cnVjdG9yLm5hbWV8fFwiT2JqZWN0XCI6dHlwZW9mIGEpKTtyZXR1cm4gYX1mdW5jdGlvbiBSYShhLGIpe2lmKFwiaGFzT3duUHJvcGVydHlcIj09PWEpdGhyb3cgQWEoXCJiYWRuYW1lXCIsYik7fWZ1bmN0aW9uIEJjKGEsYixkKXtpZighYilyZXR1cm4gYTtiPWIuc3BsaXQoXCIuXCIpO2Zvcih2YXIgYyxlPWEsZj1iLmxlbmd0aCxnPTA7ZzxmO2crKyljPWJbZ10sYSYmKGE9KGU9YSlbY10pO3JldHVybiFkJiZcbnooYSk/dGMoZSxhKTphfWZ1bmN0aW9uIHJiKGEpe2Zvcih2YXIgYj1hWzBdLGQ9YVthLmxlbmd0aC0xXSxjLGU9MTtiIT09ZCYmKGI9Yi5uZXh0U2libGluZyk7ZSsrKWlmKGN8fGFbZV0hPT1iKWN8fChjPUIocmEuY2FsbChhLDAsZSkpKSxjLnB1c2goYik7cmV0dXJuIGN8fGF9ZnVuY3Rpb24gJCgpe3JldHVybiBPYmplY3QuY3JlYXRlKG51bGwpfWZ1bmN0aW9uIGRlKGEpe2Z1bmN0aW9uIGIoYSxiLGMpe3JldHVybiBhW2JdfHwoYVtiXT1jKCkpfXZhciBkPUcoXCIkaW5qZWN0b3JcIiksYz1HKFwibmdcIik7YT1iKGEsXCJhbmd1bGFyXCIsT2JqZWN0KTthLiQkbWluRXJyPWEuJCRtaW5FcnJ8fEc7cmV0dXJuIGIoYSxcIm1vZHVsZVwiLGZ1bmN0aW9uKCl7dmFyIGE9e307cmV0dXJuIGZ1bmN0aW9uKGYsZyxoKXtpZihcImhhc093blByb3BlcnR5XCI9PT1mKXRocm93IGMoXCJiYWRuYW1lXCIsXCJtb2R1bGVcIik7ZyYmYS5oYXNPd25Qcm9wZXJ0eShmKSYmKGFbZl09bnVsbCk7cmV0dXJuIGIoYSxmLGZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShiLFxuZCxlLGYpe2Z8fChmPWMpO3JldHVybiBmdW5jdGlvbigpe2ZbZXx8XCJwdXNoXCJdKFtiLGQsYXJndW1lbnRzXSk7cmV0dXJuIHZ9fWZ1bmN0aW9uIGIoYSxkKXtyZXR1cm4gZnVuY3Rpb24oYixlKXtlJiZ6KGUpJiYoZS4kJG1vZHVsZU5hbWU9Zik7Yy5wdXNoKFthLGQsYXJndW1lbnRzXSk7cmV0dXJuIHZ9fWlmKCFnKXRocm93IGQoXCJub21vZFwiLGYpO3ZhciBjPVtdLGU9W10sdD1bXSxBPWEoXCIkaW5qZWN0b3JcIixcImludm9rZVwiLFwicHVzaFwiLGUpLHY9e19pbnZva2VRdWV1ZTpjLF9jb25maWdCbG9ja3M6ZSxfcnVuQmxvY2tzOnQscmVxdWlyZXM6ZyxuYW1lOmYscHJvdmlkZXI6YihcIiRwcm92aWRlXCIsXCJwcm92aWRlclwiKSxmYWN0b3J5OmIoXCIkcHJvdmlkZVwiLFwiZmFjdG9yeVwiKSxzZXJ2aWNlOmIoXCIkcHJvdmlkZVwiLFwic2VydmljZVwiKSx2YWx1ZTphKFwiJHByb3ZpZGVcIixcInZhbHVlXCIpLGNvbnN0YW50OmEoXCIkcHJvdmlkZVwiLFwiY29uc3RhbnRcIixcInVuc2hpZnRcIiksZGVjb3JhdG9yOmIoXCIkcHJvdmlkZVwiLFxuXCJkZWNvcmF0b3JcIiksYW5pbWF0aW9uOmIoXCIkYW5pbWF0ZVByb3ZpZGVyXCIsXCJyZWdpc3RlclwiKSxmaWx0ZXI6YihcIiRmaWx0ZXJQcm92aWRlclwiLFwicmVnaXN0ZXJcIiksY29udHJvbGxlcjpiKFwiJGNvbnRyb2xsZXJQcm92aWRlclwiLFwicmVnaXN0ZXJcIiksZGlyZWN0aXZlOmIoXCIkY29tcGlsZVByb3ZpZGVyXCIsXCJkaXJlY3RpdmVcIiksY29uZmlnOkEscnVuOmZ1bmN0aW9uKGEpe3QucHVzaChhKTtyZXR1cm4gdGhpc319O2gmJkEoaCk7cmV0dXJuIHZ9KX19KX1mdW5jdGlvbiBlZShhKXtNKGEse2Jvb3RzdHJhcDp5Yyxjb3B5OmJiLGV4dGVuZDpNLG1lcmdlOlVkLGVxdWFsczptYSxlbGVtZW50OkIsZm9yRWFjaDpuLGluamVjdG9yOmViLG5vb3A6eCxiaW5kOnRjLHRvSnNvbjpkYixmcm9tSnNvbjp1YyxpZGVudGl0eTpZYSxpc1VuZGVmaW5lZDpxLGlzRGVmaW5lZDp5LGlzU3RyaW5nOkUsaXNGdW5jdGlvbjp6LGlzT2JqZWN0OkgsaXNOdW1iZXI6USxpc0VsZW1lbnQ6TmIsaXNBcnJheTpJLFxudmVyc2lvbjpmZSxpc0RhdGU6ZGEsbG93ZXJjYXNlOkYsdXBwZXJjYXNlOnNiLGNhbGxiYWNrczp7Y291bnRlcjowfSxnZXRUZXN0YWJpbGl0eTphZSwkJG1pbkVycjpHLCQkY3NwOkJhLHJlbG9hZFdpdGhEZWJ1Z0luZm86JGR9KTtTYj1kZShTKTtTYihcIm5nXCIsW1wibmdMb2NhbGVcIl0sW1wiJHByb3ZpZGVcIixmdW5jdGlvbihhKXthLnByb3ZpZGVyKHskJHNhbml0aXplVXJpOmdlfSk7YS5wcm92aWRlcihcIiRjb21waWxlXCIsQ2MpLmRpcmVjdGl2ZSh7YTpoZSxpbnB1dDpEYyx0ZXh0YXJlYTpEYyxmb3JtOmllLHNjcmlwdDpqZSxzZWxlY3Q6a2Usc3R5bGU6bGUsb3B0aW9uOm1lLG5nQmluZDpuZSxuZ0JpbmRIdG1sOm9lLG5nQmluZFRlbXBsYXRlOnBlLG5nQ2xhc3M6cWUsbmdDbGFzc0V2ZW46cmUsbmdDbGFzc09kZDpzZSxuZ0Nsb2FrOnRlLG5nQ29udHJvbGxlcjp1ZSxuZ0Zvcm06dmUsbmdIaWRlOndlLG5nSWY6eGUsbmdJbmNsdWRlOnllLG5nSW5pdDp6ZSxuZ05vbkJpbmRhYmxlOkFlLFxubmdQbHVyYWxpemU6QmUsbmdSZXBlYXQ6Q2UsbmdTaG93OkRlLG5nU3R5bGU6RWUsbmdTd2l0Y2g6RmUsbmdTd2l0Y2hXaGVuOkdlLG5nU3dpdGNoRGVmYXVsdDpIZSxuZ09wdGlvbnM6SWUsbmdUcmFuc2NsdWRlOkplLG5nTW9kZWw6S2UsbmdMaXN0OkxlLG5nQ2hhbmdlOk1lLHBhdHRlcm46RWMsbmdQYXR0ZXJuOkVjLHJlcXVpcmVkOkZjLG5nUmVxdWlyZWQ6RmMsbWlubGVuZ3RoOkdjLG5nTWlubGVuZ3RoOkdjLG1heGxlbmd0aDpIYyxuZ01heGxlbmd0aDpIYyxuZ1ZhbHVlOk5lLG5nTW9kZWxPcHRpb25zOk9lfSkuZGlyZWN0aXZlKHtuZ0luY2x1ZGU6UGV9KS5kaXJlY3RpdmUodGIpLmRpcmVjdGl2ZShJYyk7YS5wcm92aWRlcih7JGFuY2hvclNjcm9sbDpRZSwkYW5pbWF0ZTpSZSwkYW5pbWF0ZUNzczpTZSwkJGFuaW1hdGVRdWV1ZTpUZSwkJEFuaW1hdGVSdW5uZXI6VWUsJGJyb3dzZXI6VmUsJGNhY2hlRmFjdG9yeTpXZSwkY29udHJvbGxlcjpYZSwkZG9jdW1lbnQ6WWUsJGV4Y2VwdGlvbkhhbmRsZXI6WmUsXG4kZmlsdGVyOkpjLCQkZm9yY2VSZWZsb3c6JGUsJGludGVycG9sYXRlOmFmLCRpbnRlcnZhbDpiZiwkaHR0cDpjZiwkaHR0cFBhcmFtU2VyaWFsaXplcjpkZiwkaHR0cFBhcmFtU2VyaWFsaXplckpRTGlrZTplZiwkaHR0cEJhY2tlbmQ6ZmYsJHhockZhY3Rvcnk6Z2YsJGxvY2F0aW9uOmhmLCRsb2c6amYsJHBhcnNlOmtmLCRyb290U2NvcGU6bGYsJHE6bWYsJCRxOm5mLCRzY2U6b2YsJHNjZURlbGVnYXRlOnBmLCRzbmlmZmVyOnFmLCR0ZW1wbGF0ZUNhY2hlOnJmLCR0ZW1wbGF0ZVJlcXVlc3Q6c2YsJCR0ZXN0YWJpbGl0eTp0ZiwkdGltZW91dDp1Ziwkd2luZG93OnZmLCQkckFGOndmLCQkanFMaXRlOnhmLCQkSGFzaE1hcDp5ZiwkJGNvb2tpZVJlYWRlcjp6Zn0pfV0pfWZ1bmN0aW9uIGZiKGEpe3JldHVybiBhLnJlcGxhY2UoQWYsZnVuY3Rpb24oYSxkLGMsZSl7cmV0dXJuIGU/Yy50b1VwcGVyQ2FzZSgpOmN9KS5yZXBsYWNlKEJmLFwiTW96JDFcIil9ZnVuY3Rpb24gS2MoYSl7YT1hLm5vZGVUeXBlO1xucmV0dXJuIDE9PT1hfHwhYXx8OT09PWF9ZnVuY3Rpb24gTGMoYSxiKXt2YXIgZCxjLGU9Yi5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCksZj1bXTtpZihUYi50ZXN0KGEpKXtkPWR8fGUuYXBwZW5kQ2hpbGQoYi5jcmVhdGVFbGVtZW50KFwiZGl2XCIpKTtjPShDZi5leGVjKGEpfHxbXCJcIixcIlwiXSlbMV0udG9Mb3dlckNhc2UoKTtjPWthW2NdfHxrYS5fZGVmYXVsdDtkLmlubmVySFRNTD1jWzFdK2EucmVwbGFjZShEZixcIjwkMT48LyQyPlwiKStjWzJdO2ZvcihjPWNbMF07Yy0tOylkPWQubGFzdENoaWxkO2Y9Y2IoZixkLmNoaWxkTm9kZXMpO2Q9ZS5maXJzdENoaWxkO2QudGV4dENvbnRlbnQ9XCJcIn1lbHNlIGYucHVzaChiLmNyZWF0ZVRleHROb2RlKGEpKTtlLnRleHRDb250ZW50PVwiXCI7ZS5pbm5lckhUTUw9XCJcIjtuKGYsZnVuY3Rpb24oYSl7ZS5hcHBlbmRDaGlsZChhKX0pO3JldHVybiBlfWZ1bmN0aW9uIE4oYSl7aWYoYSBpbnN0YW5jZW9mIE4pcmV0dXJuIGE7dmFyIGI7RShhKSYmKGE9VShhKSxcbmI9ITApO2lmKCEodGhpcyBpbnN0YW5jZW9mIE4pKXtpZihiJiZcIjxcIiE9YS5jaGFyQXQoMCkpdGhyb3cgVWIoXCJub3NlbFwiKTtyZXR1cm4gbmV3IE4oYSl9aWYoYil7Yj1YO3ZhciBkO2E9KGQ9RWYuZXhlYyhhKSk/W2IuY3JlYXRlRWxlbWVudChkWzFdKV06KGQ9TGMoYSxiKSk/ZC5jaGlsZE5vZGVzOltdfU1jKHRoaXMsYSl9ZnVuY3Rpb24gVmIoYSl7cmV0dXJuIGEuY2xvbmVOb2RlKCEwKX1mdW5jdGlvbiB1YihhLGIpe2J8fHZiKGEpO2lmKGEucXVlcnlTZWxlY3RvckFsbClmb3IodmFyIGQ9YS5xdWVyeVNlbGVjdG9yQWxsKFwiKlwiKSxjPTAsZT1kLmxlbmd0aDtjPGU7YysrKXZiKGRbY10pfWZ1bmN0aW9uIE5jKGEsYixkLGMpe2lmKHkoYykpdGhyb3cgVWIoXCJvZmZhcmdzXCIpO3ZhciBlPShjPXdiKGEpKSYmYy5ldmVudHMsZj1jJiZjLmhhbmRsZTtpZihmKWlmKGIpe3ZhciBnPWZ1bmN0aW9uKGIpe3ZhciBjPWVbYl07eShkKSYmYWIoY3x8W10sZCk7eShkKSYmYyYmMDxjLmxlbmd0aHx8XG4oYS5yZW1vdmVFdmVudExpc3RlbmVyKGIsZiwhMSksZGVsZXRlIGVbYl0pfTtuKGIuc3BsaXQoXCIgXCIpLGZ1bmN0aW9uKGEpe2coYSk7eGJbYV0mJmcoeGJbYV0pfSl9ZWxzZSBmb3IoYiBpbiBlKVwiJGRlc3Ryb3lcIiE9PWImJmEucmVtb3ZlRXZlbnRMaXN0ZW5lcihiLGYsITEpLGRlbGV0ZSBlW2JdfWZ1bmN0aW9uIHZiKGEsYil7dmFyIGQ9YS5uZzMzOSxjPWQmJmdiW2RdO2MmJihiP2RlbGV0ZSBjLmRhdGFbYl06KGMuaGFuZGxlJiYoYy5ldmVudHMuJGRlc3Ryb3kmJmMuaGFuZGxlKHt9LFwiJGRlc3Ryb3lcIiksTmMoYSkpLGRlbGV0ZSBnYltkXSxhLm5nMzM5PXUpKX1mdW5jdGlvbiB3YihhLGIpe3ZhciBkPWEubmczMzksZD1kJiZnYltkXTtiJiYhZCYmKGEubmczMzk9ZD0rK0ZmLGQ9Z2JbZF09e2V2ZW50czp7fSxkYXRhOnt9LGhhbmRsZTp1fSk7cmV0dXJuIGR9ZnVuY3Rpb24gV2IoYSxiLGQpe2lmKEtjKGEpKXt2YXIgYz15KGQpLGU9IWMmJmImJiFIKGIpLGY9IWI7YT0oYT13YihhLFxuIWUpKSYmYS5kYXRhO2lmKGMpYVtiXT1kO2Vsc2V7aWYoZilyZXR1cm4gYTtpZihlKXJldHVybiBhJiZhW2JdO00oYSxiKX19fWZ1bmN0aW9uIHliKGEsYil7cmV0dXJuIGEuZ2V0QXR0cmlidXRlPy0xPChcIiBcIisoYS5nZXRBdHRyaWJ1dGUoXCJjbGFzc1wiKXx8XCJcIikrXCIgXCIpLnJlcGxhY2UoL1tcXG5cXHRdL2csXCIgXCIpLmluZGV4T2YoXCIgXCIrYitcIiBcIik6ITF9ZnVuY3Rpb24gemIoYSxiKXtiJiZhLnNldEF0dHJpYnV0ZSYmbihiLnNwbGl0KFwiIFwiKSxmdW5jdGlvbihiKXthLnNldEF0dHJpYnV0ZShcImNsYXNzXCIsVSgoXCIgXCIrKGEuZ2V0QXR0cmlidXRlKFwiY2xhc3NcIil8fFwiXCIpK1wiIFwiKS5yZXBsYWNlKC9bXFxuXFx0XS9nLFwiIFwiKS5yZXBsYWNlKFwiIFwiK1UoYikrXCIgXCIsXCIgXCIpKSl9KX1mdW5jdGlvbiBBYihhLGIpe2lmKGImJmEuc2V0QXR0cmlidXRlKXt2YXIgZD0oXCIgXCIrKGEuZ2V0QXR0cmlidXRlKFwiY2xhc3NcIil8fFwiXCIpK1wiIFwiKS5yZXBsYWNlKC9bXFxuXFx0XS9nLFwiIFwiKTtuKGIuc3BsaXQoXCIgXCIpLFxuZnVuY3Rpb24oYSl7YT1VKGEpOy0xPT09ZC5pbmRleE9mKFwiIFwiK2ErXCIgXCIpJiYoZCs9YStcIiBcIil9KTthLnNldEF0dHJpYnV0ZShcImNsYXNzXCIsVShkKSl9fWZ1bmN0aW9uIE1jKGEsYil7aWYoYilpZihiLm5vZGVUeXBlKWFbYS5sZW5ndGgrK109YjtlbHNle3ZhciBkPWIubGVuZ3RoO2lmKFwibnVtYmVyXCI9PT10eXBlb2YgZCYmYi53aW5kb3chPT1iKXtpZihkKWZvcih2YXIgYz0wO2M8ZDtjKyspYVthLmxlbmd0aCsrXT1iW2NdfWVsc2UgYVthLmxlbmd0aCsrXT1ifX1mdW5jdGlvbiBPYyhhLGIpe3JldHVybiBCYihhLFwiJFwiKyhifHxcIm5nQ29udHJvbGxlclwiKStcIkNvbnRyb2xsZXJcIil9ZnVuY3Rpb24gQmIoYSxiLGQpezk9PWEubm9kZVR5cGUmJihhPWEuZG9jdW1lbnRFbGVtZW50KTtmb3IoYj1JKGIpP2I6W2JdO2E7KXtmb3IodmFyIGM9MCxlPWIubGVuZ3RoO2M8ZTtjKyspaWYoeShkPUIuZGF0YShhLGJbY10pKSlyZXR1cm4gZDthPWEucGFyZW50Tm9kZXx8MTE9PT1hLm5vZGVUeXBlJiZcbmEuaG9zdH19ZnVuY3Rpb24gUGMoYSl7Zm9yKHViKGEsITApO2EuZmlyc3RDaGlsZDspYS5yZW1vdmVDaGlsZChhLmZpcnN0Q2hpbGQpfWZ1bmN0aW9uIFhiKGEsYil7Ynx8dWIoYSk7dmFyIGQ9YS5wYXJlbnROb2RlO2QmJmQucmVtb3ZlQ2hpbGQoYSl9ZnVuY3Rpb24gR2YoYSxiKXtiPWJ8fFM7aWYoXCJjb21wbGV0ZVwiPT09Yi5kb2N1bWVudC5yZWFkeVN0YXRlKWIuc2V0VGltZW91dChhKTtlbHNlIEIoYikub24oXCJsb2FkXCIsYSl9ZnVuY3Rpb24gUWMoYSxiKXt2YXIgZD1DYltiLnRvTG93ZXJDYXNlKCldO3JldHVybiBkJiZSY1t0YShhKV0mJmR9ZnVuY3Rpb24gSGYoYSxiKXt2YXIgZD1mdW5jdGlvbihjLGQpe2MuaXNEZWZhdWx0UHJldmVudGVkPWZ1bmN0aW9uKCl7cmV0dXJuIGMuZGVmYXVsdFByZXZlbnRlZH07dmFyIGY9YltkfHxjLnR5cGVdLGc9Zj9mLmxlbmd0aDowO2lmKGcpe2lmKHEoYy5pbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQpKXt2YXIgaD1jLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbjtcbmMuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uPWZ1bmN0aW9uKCl7Yy5pbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQ9ITA7Yy5zdG9wUHJvcGFnYXRpb24mJmMuc3RvcFByb3BhZ2F0aW9uKCk7aCYmaC5jYWxsKGMpfX1jLmlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkPWZ1bmN0aW9uKCl7cmV0dXJuITA9PT1jLmltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZH07dmFyIGs9Zi5zcGVjaWFsSGFuZGxlcldyYXBwZXJ8fElmOzE8ZyYmKGY9aWEoZikpO2Zvcih2YXIgbD0wO2w8ZztsKyspYy5pc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZCgpfHxrKGEsYyxmW2xdKX19O2QuZWxlbT1hO3JldHVybiBkfWZ1bmN0aW9uIElmKGEsYixkKXtkLmNhbGwoYSxiKX1mdW5jdGlvbiBKZihhLGIsZCl7dmFyIGM9Yi5yZWxhdGVkVGFyZ2V0O2MmJihjPT09YXx8S2YuY2FsbChhLGMpKXx8ZC5jYWxsKGEsYil9ZnVuY3Rpb24geGYoKXt0aGlzLiRnZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gTShOLFxue2hhc0NsYXNzOmZ1bmN0aW9uKGEsYil7YS5hdHRyJiYoYT1hWzBdKTtyZXR1cm4geWIoYSxiKX0sYWRkQ2xhc3M6ZnVuY3Rpb24oYSxiKXthLmF0dHImJihhPWFbMF0pO3JldHVybiBBYihhLGIpfSxyZW1vdmVDbGFzczpmdW5jdGlvbihhLGIpe2EuYXR0ciYmKGE9YVswXSk7cmV0dXJuIHpiKGEsYil9fSl9fWZ1bmN0aW9uIENhKGEsYil7dmFyIGQ9YSYmYS4kJGhhc2hLZXk7aWYoZClyZXR1cm5cImZ1bmN0aW9uXCI9PT10eXBlb2YgZCYmKGQ9YS4kJGhhc2hLZXkoKSksZDtkPXR5cGVvZiBhO3JldHVybiBkPVwiZnVuY3Rpb25cIj09ZHx8XCJvYmplY3RcIj09ZCYmbnVsbCE9PWE/YS4kJGhhc2hLZXk9ZCtcIjpcIisoYnx8VGQpKCk6ZCtcIjpcIithfWZ1bmN0aW9uIFNhKGEsYil7aWYoYil7dmFyIGQ9MDt0aGlzLm5leHRVaWQ9ZnVuY3Rpb24oKXtyZXR1cm4rK2R9fW4oYSx0aGlzLnB1dCx0aGlzKX1mdW5jdGlvbiBMZihhKXtyZXR1cm4oYT1hLnRvU3RyaW5nKCkucmVwbGFjZShTYyxcIlwiKS5tYXRjaChUYykpP1xuXCJmdW5jdGlvbihcIisoYVsxXXx8XCJcIikucmVwbGFjZSgvW1xcc1xcclxcbl0rLyxcIiBcIikrXCIpXCI6XCJmblwifWZ1bmN0aW9uIGViKGEsYil7ZnVuY3Rpb24gZChhKXtyZXR1cm4gZnVuY3Rpb24oYixjKXtpZihIKGIpKW4oYixwYyhhKSk7ZWxzZSByZXR1cm4gYShiLGMpfX1mdW5jdGlvbiBjKGEsYil7UmEoYSxcInNlcnZpY2VcIik7aWYoeihiKXx8SShiKSliPXQuaW5zdGFudGlhdGUoYik7aWYoIWIuJGdldCl0aHJvdyBEYShcInBnZXRcIixhKTtyZXR1cm4gclthK1wiUHJvdmlkZXJcIl09Yn1mdW5jdGlvbiBlKGEsYil7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGM9di5pbnZva2UoYix0aGlzKTtpZihxKGMpKXRocm93IERhKFwidW5kZWZcIixhKTtyZXR1cm4gY319ZnVuY3Rpb24gZihhLGIsZCl7cmV0dXJuIGMoYSx7JGdldDohMSE9PWQ/ZShhLGIpOmJ9KX1mdW5jdGlvbiBnKGEpe3FiKHEoYSl8fEkoYSksXCJtb2R1bGVzVG9Mb2FkXCIsXCJub3QgYW4gYXJyYXlcIik7dmFyIGI9W10sYztuKGEsZnVuY3Rpb24oYSl7ZnVuY3Rpb24gZChhKXt2YXIgYixcbmM7Yj0wO2ZvcihjPWEubGVuZ3RoO2I8YztiKyspe3ZhciBlPWFbYl0sZj10LmdldChlWzBdKTtmW2VbMV1dLmFwcGx5KGYsZVsyXSl9fWlmKCFtLmdldChhKSl7bS5wdXQoYSwhMCk7dHJ5e0UoYSk/KGM9U2IoYSksYj1iLmNvbmNhdChnKGMucmVxdWlyZXMpKS5jb25jYXQoYy5fcnVuQmxvY2tzKSxkKGMuX2ludm9rZVF1ZXVlKSxkKGMuX2NvbmZpZ0Jsb2NrcykpOnooYSk/Yi5wdXNoKHQuaW52b2tlKGEpKTpJKGEpP2IucHVzaCh0Lmludm9rZShhKSk6UWEoYSxcIm1vZHVsZVwiKX1jYXRjaChlKXt0aHJvdyBJKGEpJiYoYT1hW2EubGVuZ3RoLTFdKSxlLm1lc3NhZ2UmJmUuc3RhY2smJi0xPT1lLnN0YWNrLmluZGV4T2YoZS5tZXNzYWdlKSYmKGU9ZS5tZXNzYWdlK1wiXFxuXCIrZS5zdGFjayksRGEoXCJtb2R1bGVyclwiLGEsZS5zdGFja3x8ZS5tZXNzYWdlfHxlKTt9fX0pO3JldHVybiBifWZ1bmN0aW9uIGgoYSxjKXtmdW5jdGlvbiBkKGIsZSl7aWYoYS5oYXNPd25Qcm9wZXJ0eShiKSl7aWYoYVtiXT09PVxuayl0aHJvdyBEYShcImNkZXBcIixiK1wiIDwtIFwiK2wuam9pbihcIiA8LSBcIikpO3JldHVybiBhW2JdfXRyeXtyZXR1cm4gbC51bnNoaWZ0KGIpLGFbYl09ayxhW2JdPWMoYixlKX1jYXRjaChmKXt0aHJvdyBhW2JdPT09ayYmZGVsZXRlIGFbYl0sZjt9ZmluYWxseXtsLnNoaWZ0KCl9fWZ1bmN0aW9uIGUoYSxjLGYsZyl7XCJzdHJpbmdcIj09PXR5cGVvZiBmJiYoZz1mLGY9bnVsbCk7dmFyIGg9W10saz1lYi4kJGFubm90YXRlKGEsYixnKSxsLG0sdDttPTA7Zm9yKGw9ay5sZW5ndGg7bTxsO20rKyl7dD1rW21dO2lmKFwic3RyaW5nXCIhPT10eXBlb2YgdCl0aHJvdyBEYShcIml0a25cIix0KTtoLnB1c2goZiYmZi5oYXNPd25Qcm9wZXJ0eSh0KT9mW3RdOmQodCxnKSl9SShhKSYmKGE9YVtsXSk7cmV0dXJuIGEuYXBwbHkoYyxoKX1yZXR1cm57aW52b2tlOmUsaW5zdGFudGlhdGU6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPU9iamVjdC5jcmVhdGUoKEkoYSk/YVthLmxlbmd0aC0xXTphKS5wcm90b3R5cGV8fFxubnVsbCk7YT1lKGEsZCxiLGMpO3JldHVybiBIKGEpfHx6KGEpP2E6ZH0sZ2V0OmQsYW5ub3RhdGU6ZWIuJCRhbm5vdGF0ZSxoYXM6ZnVuY3Rpb24oYil7cmV0dXJuIHIuaGFzT3duUHJvcGVydHkoYitcIlByb3ZpZGVyXCIpfHxhLmhhc093blByb3BlcnR5KGIpfX19Yj0hMD09PWI7dmFyIGs9e30sbD1bXSxtPW5ldyBTYShbXSwhMCkscj17JHByb3ZpZGU6e3Byb3ZpZGVyOmQoYyksZmFjdG9yeTpkKGYpLHNlcnZpY2U6ZChmdW5jdGlvbihhLGIpe3JldHVybiBmKGEsW1wiJGluamVjdG9yXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEuaW5zdGFudGlhdGUoYil9XSl9KSx2YWx1ZTpkKGZ1bmN0aW9uKGEsYil7cmV0dXJuIGYoYSxuYShiKSwhMSl9KSxjb25zdGFudDpkKGZ1bmN0aW9uKGEsYil7UmEoYSxcImNvbnN0YW50XCIpO3JbYV09YjtBW2FdPWJ9KSxkZWNvcmF0b3I6ZnVuY3Rpb24oYSxiKXt2YXIgYz10LmdldChhK1wiUHJvdmlkZXJcIiksZD1jLiRnZXQ7Yy4kZ2V0PWZ1bmN0aW9uKCl7dmFyIGE9XG52Lmludm9rZShkLGMpO3JldHVybiB2Lmludm9rZShiLG51bGwseyRkZWxlZ2F0ZTphfSl9fX19LHQ9ci4kaW5qZWN0b3I9aChyLGZ1bmN0aW9uKGEsYil7ZmEuaXNTdHJpbmcoYikmJmwucHVzaChiKTt0aHJvdyBEYShcInVucHJcIixsLmpvaW4oXCIgPC0gXCIpKTt9KSxBPXt9LHY9QS4kaW5qZWN0b3I9aChBLGZ1bmN0aW9uKGEsYil7dmFyIGM9dC5nZXQoYStcIlByb3ZpZGVyXCIsYik7cmV0dXJuIHYuaW52b2tlKGMuJGdldCxjLHUsYSl9KTtuKGcoYSksZnVuY3Rpb24oYSl7YSYmdi5pbnZva2UoYSl9KTtyZXR1cm4gdn1mdW5jdGlvbiBRZSgpe3ZhciBhPSEwO3RoaXMuZGlzYWJsZUF1dG9TY3JvbGxpbmc9ZnVuY3Rpb24oKXthPSExfTt0aGlzLiRnZXQ9W1wiJHdpbmRvd1wiLFwiJGxvY2F0aW9uXCIsXCIkcm9vdFNjb3BlXCIsZnVuY3Rpb24oYixkLGMpe2Z1bmN0aW9uIGUoYSl7dmFyIGI9bnVsbDtBcnJheS5wcm90b3R5cGUuc29tZS5jYWxsKGEsZnVuY3Rpb24oYSl7aWYoXCJhXCI9PT10YShhKSlyZXR1cm4gYj1cbmEsITB9KTtyZXR1cm4gYn1mdW5jdGlvbiBmKGEpe2lmKGEpe2Euc2Nyb2xsSW50b1ZpZXcoKTt2YXIgYztjPWcueU9mZnNldDt6KGMpP2M9YygpOk5iKGMpPyhjPWNbMF0sYz1cImZpeGVkXCIhPT1iLmdldENvbXB1dGVkU3R5bGUoYykucG9zaXRpb24/MDpjLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmJvdHRvbSk6UShjKXx8KGM9MCk7YyYmKGE9YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS50b3AsYi5zY3JvbGxCeSgwLGEtYykpfWVsc2UgYi5zY3JvbGxUbygwLDApfWZ1bmN0aW9uIGcoYSl7YT1FKGEpP2E6ZC5oYXNoKCk7dmFyIGI7YT8oYj1oLmdldEVsZW1lbnRCeUlkKGEpKT9mKGIpOihiPWUoaC5nZXRFbGVtZW50c0J5TmFtZShhKSkpP2YoYik6XCJ0b3BcIj09PWEmJmYobnVsbCk6ZihudWxsKX12YXIgaD1iLmRvY3VtZW50O2EmJmMuJHdhdGNoKGZ1bmN0aW9uKCl7cmV0dXJuIGQuaGFzaCgpfSxmdW5jdGlvbihhLGIpe2E9PT1iJiZcIlwiPT09YXx8R2YoZnVuY3Rpb24oKXtjLiRldmFsQXN5bmMoZyl9KX0pO1xucmV0dXJuIGd9XX1mdW5jdGlvbiBoYihhLGIpe2lmKCFhJiYhYilyZXR1cm5cIlwiO2lmKCFhKXJldHVybiBiO2lmKCFiKXJldHVybiBhO0koYSkmJihhPWEuam9pbihcIiBcIikpO0koYikmJihiPWIuam9pbihcIiBcIikpO3JldHVybiBhK1wiIFwiK2J9ZnVuY3Rpb24gTWYoYSl7RShhKSYmKGE9YS5zcGxpdChcIiBcIikpO3ZhciBiPSQoKTtuKGEsZnVuY3Rpb24oYSl7YS5sZW5ndGgmJihiW2FdPSEwKX0pO3JldHVybiBifWZ1bmN0aW9uIEVhKGEpe3JldHVybiBIKGEpP2E6e319ZnVuY3Rpb24gTmYoYSxiLGQsYyl7ZnVuY3Rpb24gZShhKXt0cnl7YS5hcHBseShudWxsLHJhLmNhbGwoYXJndW1lbnRzLDEpKX1maW5hbGx5e2lmKHYtLSwwPT09dilmb3IoO1QubGVuZ3RoOyl0cnl7VC5wb3AoKSgpfWNhdGNoKGIpe2QuZXJyb3IoYil9fX1mdW5jdGlvbiBmKCl7TD1udWxsO2coKTtoKCl9ZnVuY3Rpb24gZygpe2E6e3RyeXtwPW0uc3RhdGU7YnJlYWsgYX1jYXRjaChhKXt9cD12b2lkIDB9cD1xKHApP1xubnVsbDpwO21hKHAsSikmJihwPUopO0o9cH1mdW5jdGlvbiBoKCl7aWYodyE9PWsudXJsKCl8fEMhPT1wKXc9ay51cmwoKSxDPXAsbihhYSxmdW5jdGlvbihhKXthKGsudXJsKCkscCl9KX12YXIgaz10aGlzLGw9YS5sb2NhdGlvbixtPWEuaGlzdG9yeSxyPWEuc2V0VGltZW91dCx0PWEuY2xlYXJUaW1lb3V0LEE9e307ay5pc01vY2s9ITE7dmFyIHY9MCxUPVtdO2suJCRjb21wbGV0ZU91dHN0YW5kaW5nUmVxdWVzdD1lO2suJCRpbmNPdXRzdGFuZGluZ1JlcXVlc3RDb3VudD1mdW5jdGlvbigpe3YrK307ay5ub3RpZnlXaGVuTm9PdXRzdGFuZGluZ1JlcXVlc3RzPWZ1bmN0aW9uKGEpezA9PT12P2EoKTpULnB1c2goYSl9O3ZhciBwLEMsdz1sLmhyZWYsZ2E9Yi5maW5kKFwiYmFzZVwiKSxMPW51bGw7ZygpO0M9cDtrLnVybD1mdW5jdGlvbihiLGQsZSl7cShlKSYmKGU9bnVsbCk7bCE9PWEubG9jYXRpb24mJihsPWEubG9jYXRpb24pO20hPT1hLmhpc3RvcnkmJihtPWEuaGlzdG9yeSk7aWYoYil7dmFyIGY9XG5DPT09ZTtpZih3PT09YiYmKCFjLmhpc3Rvcnl8fGYpKXJldHVybiBrO3ZhciBoPXcmJkZhKHcpPT09RmEoYik7dz1iO0M9ZTtpZighYy5oaXN0b3J5fHxoJiZmKXtpZighaHx8TClMPWI7ZD9sLnJlcGxhY2UoYik6aD8oZD1sLGU9Yi5pbmRleE9mKFwiI1wiKSxlPS0xPT09ZT9cIlwiOmIuc3Vic3RyKGUpLGQuaGFzaD1lKTpsLmhyZWY9YjtsLmhyZWYhPT1iJiYoTD1iKX1lbHNlIG1bZD9cInJlcGxhY2VTdGF0ZVwiOlwicHVzaFN0YXRlXCJdKGUsXCJcIixiKSxnKCksQz1wO3JldHVybiBrfXJldHVybiBMfHxsLmhyZWYucmVwbGFjZSgvJTI3L2csXCInXCIpfTtrLnN0YXRlPWZ1bmN0aW9uKCl7cmV0dXJuIHB9O3ZhciBhYT1bXSxEPSExLEo9bnVsbDtrLm9uVXJsQ2hhbmdlPWZ1bmN0aW9uKGIpe2lmKCFEKXtpZihjLmhpc3RvcnkpQihhKS5vbihcInBvcHN0YXRlXCIsZik7QihhKS5vbihcImhhc2hjaGFuZ2VcIixmKTtEPSEwfWFhLnB1c2goYik7cmV0dXJuIGJ9O2suJCRhcHBsaWNhdGlvbkRlc3Ryb3llZD1mdW5jdGlvbigpe0IoYSkub2ZmKFwiaGFzaGNoYW5nZSBwb3BzdGF0ZVwiLFxuZil9O2suJCRjaGVja1VybENoYW5nZT1oO2suYmFzZUhyZWY9ZnVuY3Rpb24oKXt2YXIgYT1nYS5hdHRyKFwiaHJlZlwiKTtyZXR1cm4gYT9hLnJlcGxhY2UoL14oaHR0cHM/XFw6KT9cXC9cXC9bXlxcL10qLyxcIlwiKTpcIlwifTtrLmRlZmVyPWZ1bmN0aW9uKGEsYil7dmFyIGM7disrO2M9cihmdW5jdGlvbigpe2RlbGV0ZSBBW2NdO2UoYSl9LGJ8fDApO0FbY109ITA7cmV0dXJuIGN9O2suZGVmZXIuY2FuY2VsPWZ1bmN0aW9uKGEpe3JldHVybiBBW2FdPyhkZWxldGUgQVthXSx0KGEpLGUoeCksITApOiExfX1mdW5jdGlvbiBWZSgpe3RoaXMuJGdldD1bXCIkd2luZG93XCIsXCIkbG9nXCIsXCIkc25pZmZlclwiLFwiJGRvY3VtZW50XCIsZnVuY3Rpb24oYSxiLGQsYyl7cmV0dXJuIG5ldyBOZihhLGMsYixkKX1dfWZ1bmN0aW9uIFdlKCl7dGhpcy4kZ2V0PWZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShhLGMpe2Z1bmN0aW9uIGUoYSl7YSE9ciYmKHQ/dD09YSYmKHQ9YS5uKTp0PWEsZihhLm4sYS5wKSxmKGEscikscj1hLFxuci5uPW51bGwpfWZ1bmN0aW9uIGYoYSxiKXthIT1iJiYoYSYmKGEucD1iKSxiJiYoYi5uPWEpKX1pZihhIGluIGIpdGhyb3cgRyhcIiRjYWNoZUZhY3RvcnlcIikoXCJpaWRcIixhKTt2YXIgZz0wLGg9TSh7fSxjLHtpZDphfSksaz0kKCksbD1jJiZjLmNhcGFjaXR5fHxOdW1iZXIuTUFYX1ZBTFVFLG09JCgpLHI9bnVsbCx0PW51bGw7cmV0dXJuIGJbYV09e3B1dDpmdW5jdGlvbihhLGIpe2lmKCFxKGIpKXtpZihsPE51bWJlci5NQVhfVkFMVUUpe3ZhciBjPW1bYV18fChtW2FdPXtrZXk6YX0pO2UoYyl9YSBpbiBrfHxnKys7a1thXT1iO2c+bCYmdGhpcy5yZW1vdmUodC5rZXkpO3JldHVybiBifX0sZ2V0OmZ1bmN0aW9uKGEpe2lmKGw8TnVtYmVyLk1BWF9WQUxVRSl7dmFyIGI9bVthXTtpZighYilyZXR1cm47ZShiKX1yZXR1cm4ga1thXX0scmVtb3ZlOmZ1bmN0aW9uKGEpe2lmKGw8TnVtYmVyLk1BWF9WQUxVRSl7dmFyIGI9bVthXTtpZighYilyZXR1cm47Yj09ciYmKHI9Yi5wKTtiPT10JiZcbih0PWIubik7ZihiLm4sYi5wKTtkZWxldGUgbVthXX1hIGluIGsmJihkZWxldGUga1thXSxnLS0pfSxyZW1vdmVBbGw6ZnVuY3Rpb24oKXtrPSQoKTtnPTA7bT0kKCk7cj10PW51bGx9LGRlc3Ryb3k6ZnVuY3Rpb24oKXttPWg9az1udWxsO2RlbGV0ZSBiW2FdfSxpbmZvOmZ1bmN0aW9uKCl7cmV0dXJuIE0oe30saCx7c2l6ZTpnfSl9fX12YXIgYj17fTthLmluZm89ZnVuY3Rpb24oKXt2YXIgYT17fTtuKGIsZnVuY3Rpb24oYixlKXthW2VdPWIuaW5mbygpfSk7cmV0dXJuIGF9O2EuZ2V0PWZ1bmN0aW9uKGEpe3JldHVybiBiW2FdfTtyZXR1cm4gYX19ZnVuY3Rpb24gcmYoKXt0aGlzLiRnZXQ9W1wiJGNhY2hlRmFjdG9yeVwiLGZ1bmN0aW9uKGEpe3JldHVybiBhKFwidGVtcGxhdGVzXCIpfV19ZnVuY3Rpb24gQ2MoYSxiKXtmdW5jdGlvbiBkKGEsYixjKXt2YXIgZD0vXlxccyooW0AmXXw9KFxcKj8pKShcXD8/KVxccyooXFx3KilcXHMqJC8sZT17fTtuKGEsZnVuY3Rpb24oYSxmKXt2YXIgZz1hLm1hdGNoKGQpO1xuaWYoIWcpdGhyb3cgaGEoXCJpc2NwXCIsYixmLGEsYz9cImNvbnRyb2xsZXIgYmluZGluZ3MgZGVmaW5pdGlvblwiOlwiaXNvbGF0ZSBzY29wZSBkZWZpbml0aW9uXCIpO2VbZl09e21vZGU6Z1sxXVswXSxjb2xsZWN0aW9uOlwiKlwiPT09Z1syXSxvcHRpb25hbDpcIj9cIj09PWdbM10sYXR0ck5hbWU6Z1s0XXx8Zn19KTtyZXR1cm4gZX1mdW5jdGlvbiBjKGEpe3ZhciBiPWEuY2hhckF0KDApO2lmKCFifHxiIT09RihiKSl0aHJvdyBoYShcImJhZGRpclwiLGEpO2lmKGEhPT1hLnRyaW0oKSl0aHJvdyBoYShcImJhZGRpclwiLGEpO312YXIgZT17fSxmPS9eXFxzKmRpcmVjdGl2ZVxcOlxccyooW1xcd1xcLV0rKVxccysoLiopJC8sZz0vKChbXFx3XFwtXSspKD86XFw6KFteO10rKSk/Oz8pLyxoPVdkKFwibmdTcmMsbmdTcmNzZXQsc3JjLHNyY3NldFwiKSxrPS9eKD86KFxcXlxcXj8pPyhcXD8pPyhcXF5cXF4/KT8pPy8sbD0vXihvblthLXpdK3xmb3JtYWN0aW9uKSQvO3RoaXMuZGlyZWN0aXZlPWZ1bmN0aW9uIHQoYixmKXtSYShiLFwiZGlyZWN0aXZlXCIpO1xuRShiKT8oYyhiKSxxYihmLFwiZGlyZWN0aXZlRmFjdG9yeVwiKSxlLmhhc093blByb3BlcnR5KGIpfHwoZVtiXT1bXSxhLmZhY3RvcnkoYitcIkRpcmVjdGl2ZVwiLFtcIiRpbmplY3RvclwiLFwiJGV4Y2VwdGlvbkhhbmRsZXJcIixmdW5jdGlvbihhLGMpe3ZhciBmPVtdO24oZVtiXSxmdW5jdGlvbihlLGcpe3RyeXt2YXIgaD1hLmludm9rZShlKTt6KGgpP2g9e2NvbXBpbGU6bmEoaCl9OiFoLmNvbXBpbGUmJmgubGluayYmKGguY29tcGlsZT1uYShoLmxpbmspKTtoLnByaW9yaXR5PWgucHJpb3JpdHl8fDA7aC5pbmRleD1nO2gubmFtZT1oLm5hbWV8fGI7aC5yZXF1aXJlPWgucmVxdWlyZXx8aC5jb250cm9sbGVyJiZoLm5hbWU7aC5yZXN0cmljdD1oLnJlc3RyaWN0fHxcIkVBXCI7dmFyIGs9aCxsPWgsbT1oLm5hbWUsdD17aXNvbGF0ZVNjb3BlOm51bGwsYmluZFRvQ29udHJvbGxlcjpudWxsfTtIKGwuc2NvcGUpJiYoITA9PT1sLmJpbmRUb0NvbnRyb2xsZXI/KHQuYmluZFRvQ29udHJvbGxlcj1kKGwuc2NvcGUsXG5tLCEwKSx0Lmlzb2xhdGVTY29wZT17fSk6dC5pc29sYXRlU2NvcGU9ZChsLnNjb3BlLG0sITEpKTtIKGwuYmluZFRvQ29udHJvbGxlcikmJih0LmJpbmRUb0NvbnRyb2xsZXI9ZChsLmJpbmRUb0NvbnRyb2xsZXIsbSwhMCkpO2lmKEgodC5iaW5kVG9Db250cm9sbGVyKSl7dmFyIHY9bC5jb250cm9sbGVyLFI9bC5jb250cm9sbGVyQXM7aWYoIXYpdGhyb3cgaGEoXCJub2N0cmxcIixtKTt2YXIgVjthOmlmKFImJkUoUikpVj1SO2Vsc2V7aWYoRSh2KSl7dmFyIG49VWMuZXhlYyh2KTtpZihuKXtWPW5bM107YnJlYWsgYX19Vj12b2lkIDB9aWYoIVYpdGhyb3cgaGEoXCJub2lkZW50XCIsbSk7fXZhciBzPWsuJCRiaW5kaW5ncz10O0gocy5pc29sYXRlU2NvcGUpJiYoaC4kJGlzb2xhdGVCaW5kaW5ncz1zLmlzb2xhdGVTY29wZSk7aC4kJG1vZHVsZU5hbWU9ZS4kJG1vZHVsZU5hbWU7Zi5wdXNoKGgpfWNhdGNoKHUpe2ModSl9fSk7cmV0dXJuIGZ9XSkpLGVbYl0ucHVzaChmKSk6bihiLHBjKHQpKTtcbnJldHVybiB0aGlzfTt0aGlzLmFIcmVmU2FuaXRpemF0aW9uV2hpdGVsaXN0PWZ1bmN0aW9uKGEpe3JldHVybiB5KGEpPyhiLmFIcmVmU2FuaXRpemF0aW9uV2hpdGVsaXN0KGEpLHRoaXMpOmIuYUhyZWZTYW5pdGl6YXRpb25XaGl0ZWxpc3QoKX07dGhpcy5pbWdTcmNTYW5pdGl6YXRpb25XaGl0ZWxpc3Q9ZnVuY3Rpb24oYSl7cmV0dXJuIHkoYSk/KGIuaW1nU3JjU2FuaXRpemF0aW9uV2hpdGVsaXN0KGEpLHRoaXMpOmIuaW1nU3JjU2FuaXRpemF0aW9uV2hpdGVsaXN0KCl9O3ZhciBtPSEwO3RoaXMuZGVidWdJbmZvRW5hYmxlZD1mdW5jdGlvbihhKXtyZXR1cm4geShhKT8obT1hLHRoaXMpOm19O3RoaXMuJGdldD1bXCIkaW5qZWN0b3JcIixcIiRpbnRlcnBvbGF0ZVwiLFwiJGV4Y2VwdGlvbkhhbmRsZXJcIixcIiR0ZW1wbGF0ZVJlcXVlc3RcIixcIiRwYXJzZVwiLFwiJGNvbnRyb2xsZXJcIixcIiRyb290U2NvcGVcIixcIiRkb2N1bWVudFwiLFwiJHNjZVwiLFwiJGFuaW1hdGVcIixcIiQkc2FuaXRpemVVcmlcIixmdW5jdGlvbihhLFxuYixjLGQscCxDLHcsZ2EsTCxhYSxEKXtmdW5jdGlvbiBKKGEsYil7dHJ5e2EuYWRkQ2xhc3MoYil9Y2F0Y2goYyl7fX1mdW5jdGlvbiBLKGEsYixjLGQsZSl7YSBpbnN0YW5jZW9mIEJ8fChhPUIoYSkpO24oYSxmdW5jdGlvbihiLGMpe2Iubm9kZVR5cGU9PU5hJiZiLm5vZGVWYWx1ZS5tYXRjaCgvXFxTKy8pJiYoYVtjXT1CKGIpLndyYXAoXCI8c3Bhbj48L3NwYW4+XCIpLnBhcmVudCgpWzBdKX0pO3ZhciBmPU8oYSxiLGEsYyxkLGUpO0suJCRhZGRTY29wZUNsYXNzKGEpO3ZhciBnPW51bGw7cmV0dXJuIGZ1bmN0aW9uKGIsYyxkKXtxYihiLFwic2NvcGVcIik7ZSYmZS5uZWVkc05ld1Njb3BlJiYoYj1iLiRwYXJlbnQuJG5ldygpKTtkPWR8fHt9O3ZhciBoPWQucGFyZW50Qm91bmRUcmFuc2NsdWRlRm4saz1kLnRyYW5zY2x1ZGVDb250cm9sbGVycztkPWQuZnV0dXJlUGFyZW50RWxlbWVudDtoJiZoLiQkYm91bmRUcmFuc2NsdWRlJiYoaD1oLiQkYm91bmRUcmFuc2NsdWRlKTtnfHwoZz0oZD1cbmQmJmRbMF0pP1wiZm9yZWlnbm9iamVjdFwiIT09dGEoZCkmJmQudG9TdHJpbmcoKS5tYXRjaCgvU1ZHLyk/XCJzdmdcIjpcImh0bWxcIjpcImh0bWxcIik7ZD1cImh0bWxcIiE9PWc/QihZYihnLEIoXCI8ZGl2PlwiKS5hcHBlbmQoYSkuaHRtbCgpKSk6Yz9QYS5jbG9uZS5jYWxsKGEpOmE7aWYoaylmb3IodmFyIGwgaW4gaylkLmRhdGEoXCIkXCIrbCtcIkNvbnRyb2xsZXJcIixrW2xdLmluc3RhbmNlKTtLLiQkYWRkU2NvcGVJbmZvKGQsYik7YyYmYyhkLGIpO2YmJmYoYixkLGQsaCk7cmV0dXJuIGR9fWZ1bmN0aW9uIE8oYSxiLGMsZCxlLGYpe2Z1bmN0aW9uIGcoYSxjLGQsZSl7dmFyIGYsayxsLG0sdCx3LEQ7aWYocClmb3IoRD1BcnJheShjLmxlbmd0aCksbT0wO208aC5sZW5ndGg7bSs9MylmPWhbbV0sRFtmXT1jW2ZdO2Vsc2UgRD1jO209MDtmb3IodD1oLmxlbmd0aDttPHQ7KWs9RFtoW20rK11dLGM9aFttKytdLGY9aFttKytdLGM/KGMuc2NvcGU/KGw9YS4kbmV3KCksSy4kJGFkZFNjb3BlSW5mbyhCKGspLFxubCkpOmw9YSx3PWMudHJhbnNjbHVkZU9uVGhpc0VsZW1lbnQ/UihhLGMudHJhbnNjbHVkZSxlKTohYy50ZW1wbGF0ZU9uVGhpc0VsZW1lbnQmJmU/ZTohZSYmYj9SKGEsYik6bnVsbCxjKGYsbCxrLGQsdykpOmYmJmYoYSxrLmNoaWxkTm9kZXMsdSxlKX1mb3IodmFyIGg9W10sayxsLG0sdCxwLHc9MDt3PGEubGVuZ3RoO3crKyl7az1uZXcgZmE7bD1WKGFbd10sW10saywwPT09dz9kOnUsZSk7KGY9bC5sZW5ndGg/WihsLGFbd10sayxiLGMsbnVsbCxbXSxbXSxmKTpudWxsKSYmZi5zY29wZSYmSy4kJGFkZFNjb3BlQ2xhc3Moay4kJGVsZW1lbnQpO2s9ZiYmZi50ZXJtaW5hbHx8IShtPWFbd10uY2hpbGROb2Rlcyl8fCFtLmxlbmd0aD9udWxsOk8obSxmPyhmLnRyYW5zY2x1ZGVPblRoaXNFbGVtZW50fHwhZi50ZW1wbGF0ZU9uVGhpc0VsZW1lbnQpJiZmLnRyYW5zY2x1ZGU6Yik7aWYoZnx8ayloLnB1c2godyxmLGspLHQ9ITAscD1wfHxmO2Y9bnVsbH1yZXR1cm4gdD9nOm51bGx9ZnVuY3Rpb24gUihhLFxuYixjKXtyZXR1cm4gZnVuY3Rpb24oZCxlLGYsZyxoKXtkfHwoZD1hLiRuZXcoITEsaCksZC4kJHRyYW5zY2x1ZGVkPSEwKTtyZXR1cm4gYihkLGUse3BhcmVudEJvdW5kVHJhbnNjbHVkZUZuOmMsdHJhbnNjbHVkZUNvbnRyb2xsZXJzOmYsZnV0dXJlUGFyZW50RWxlbWVudDpnfSl9fWZ1bmN0aW9uIFYoYSxiLGMsZCxlKXt2YXIgaD1jLiRhdHRyLGs7c3dpdGNoKGEubm9kZVR5cGUpe2Nhc2UgMTpQKGIsdmEodGEoYSkpLFwiRVwiLGQsZSk7Zm9yKHZhciBsLG0sdCxwPWEuYXR0cmlidXRlcyx3PTAsRD1wJiZwLmxlbmd0aDt3PEQ7dysrKXt2YXIgSz0hMSxBPSExO2w9cFt3XTtrPWwubmFtZTttPVUobC52YWx1ZSk7bD12YShrKTtpZih0PWthLnRlc3QobCkpaz1rLnJlcGxhY2UoVmMsXCJcIikuc3Vic3RyKDgpLnJlcGxhY2UoL18oLikvZyxmdW5jdGlvbihhLGIpe3JldHVybiBiLnRvVXBwZXJDYXNlKCl9KTsobD1sLm1hdGNoKGxhKSkmJkcobFsxXSkmJihLPWssQT1rLnN1YnN0cigwLGsubGVuZ3RoLVxuNSkrXCJlbmRcIixrPWsuc3Vic3RyKDAsay5sZW5ndGgtNikpO2w9dmEoay50b0xvd2VyQ2FzZSgpKTtoW2xdPWs7aWYodHx8IWMuaGFzT3duUHJvcGVydHkobCkpY1tsXT1tLFFjKGEsbCkmJihjW2xdPSEwKTtXKGEsYixtLGwsdCk7UChiLGwsXCJBXCIsZCxlLEssQSl9YT1hLmNsYXNzTmFtZTtIKGEpJiYoYT1hLmFuaW1WYWwpO2lmKEUoYSkmJlwiXCIhPT1hKWZvcig7az1nLmV4ZWMoYSk7KWw9dmEoa1syXSksUChiLGwsXCJDXCIsZCxlKSYmKGNbbF09VShrWzNdKSksYT1hLnN1YnN0cihrLmluZGV4K2tbMF0ubGVuZ3RoKTticmVhaztjYXNlIE5hOmlmKDExPT09SGEpZm9yKDthLnBhcmVudE5vZGUmJmEubmV4dFNpYmxpbmcmJmEubmV4dFNpYmxpbmcubm9kZVR5cGU9PT1OYTspYS5ub2RlVmFsdWUrPWEubmV4dFNpYmxpbmcubm9kZVZhbHVlLGEucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhLm5leHRTaWJsaW5nKTtOKGIsYS5ub2RlVmFsdWUpO2JyZWFrO2Nhc2UgODp0cnl7aWYoaz1mLmV4ZWMoYS5ub2RlVmFsdWUpKWw9XG52YShrWzFdKSxQKGIsbCxcIk1cIixkLGUpJiYoY1tsXT1VKGtbMl0pKX1jYXRjaChSKXt9fWIuc29ydChJYSk7cmV0dXJuIGJ9ZnVuY3Rpb24gVGEoYSxiLGMpe3ZhciBkPVtdLGU9MDtpZihiJiZhLmhhc0F0dHJpYnV0ZSYmYS5oYXNBdHRyaWJ1dGUoYikpe2Rve2lmKCFhKXRocm93IGhhKFwidXRlcmRpclwiLGIsYyk7MT09YS5ub2RlVHlwZSYmKGEuaGFzQXR0cmlidXRlKGIpJiZlKyssYS5oYXNBdHRyaWJ1dGUoYykmJmUtLSk7ZC5wdXNoKGEpO2E9YS5uZXh0U2libGluZ313aGlsZSgwPGUpfWVsc2UgZC5wdXNoKGEpO3JldHVybiBCKGQpfWZ1bmN0aW9uIHMoYSxiLGMpe3JldHVybiBmdW5jdGlvbihkLGUsZixnLGgpe2U9VGEoZVswXSxiLGMpO3JldHVybiBhKGQsZSxmLGcsaCl9fWZ1bmN0aW9uIFooYSxiLGQsZSxmLGcsaCxsLG0pe2Z1bmN0aW9uIHQoYSxiLGMsZCl7aWYoYSl7YyYmKGE9cyhhLGMsZCkpO2EucmVxdWlyZT1xLnJlcXVpcmU7YS5kaXJlY3RpdmVOYW1lPXg7aWYoTz09PVxucXx8cS4kJGlzb2xhdGVTY29wZSlhPWNhKGEse2lzb2xhdGVTY29wZTohMH0pO2gucHVzaChhKX1pZihiKXtjJiYoYj1zKGIsYyxkKSk7Yi5yZXF1aXJlPXEucmVxdWlyZTtiLmRpcmVjdGl2ZU5hbWU9eDtpZihPPT09cXx8cS4kJGlzb2xhdGVTY29wZSliPWNhKGIse2lzb2xhdGVTY29wZTohMH0pO2wucHVzaChiKX19ZnVuY3Rpb24gcChhLGIsYyxkKXt2YXIgZTtpZihFKGIpKXt2YXIgZj1iLm1hdGNoKGspO2I9Yi5zdWJzdHJpbmcoZlswXS5sZW5ndGgpO3ZhciBnPWZbMV18fGZbM10sZj1cIj9cIj09PWZbMl07XCJeXlwiPT09Zz9jPWMucGFyZW50KCk6ZT0oZT1kJiZkW2JdKSYmZS5pbnN0YW5jZTtlfHwoZD1cIiRcIitiK1wiQ29udHJvbGxlclwiLGU9Zz9jLmluaGVyaXRlZERhdGEoZCk6Yy5kYXRhKGQpKTtpZighZSYmIWYpdGhyb3cgaGEoXCJjdHJlcVwiLGIsYSk7fWVsc2UgaWYoSShiKSlmb3IoZT1bXSxnPTAsZj1iLmxlbmd0aDtnPGY7ZysrKWVbZ109cChhLGJbZ10sYyxkKTtyZXR1cm4gZXx8XG5udWxsfWZ1bmN0aW9uIHcoYSxiLGMsZCxlLGYpe3ZhciBnPSQoKSxoO2ZvcihoIGluIGQpe3ZhciBrPWRbaF0sbD17JHNjb3BlOms9PT1PfHxrLiQkaXNvbGF0ZVNjb3BlP2U6ZiwkZWxlbWVudDphLCRhdHRyczpiLCR0cmFuc2NsdWRlOmN9LG09ay5jb250cm9sbGVyO1wiQFwiPT1tJiYobT1iW2submFtZV0pO2w9QyhtLGwsITAsay5jb250cm9sbGVyQXMpO2dbay5uYW1lXT1sO2FhfHxhLmRhdGEoXCIkXCIray5uYW1lK1wiQ29udHJvbGxlclwiLGwuaW5zdGFuY2UpfXJldHVybiBnfWZ1bmN0aW9uIEQoYSxjLGUsZixnKXtmdW5jdGlvbiBrKGEsYixjKXt2YXIgZDtaYShhKXx8KGM9YixiPWEsYT11KTthYSYmKGQ9dik7Y3x8KGM9YWE/Vi5wYXJlbnQoKTpWKTtyZXR1cm4gZyhhLGIsZCxjLFRhKX12YXIgbSx0LEEsdixDLFYsR2E7Yj09PWU/KGY9ZCxWPWQuJCRlbGVtZW50KTooVj1CKGUpLGY9bmV3IGZhKFYsZCkpO0E9YztPP3Q9Yy4kbmV3KCEwKTpSJiYoQT1jLiRwYXJlbnQpO2cmJihDPWssXG5DLiQkYm91bmRUcmFuc2NsdWRlPWcpO1QmJih2PXcoVixmLEMsVCx0LGMpKTtPJiYoSy4kJGFkZFNjb3BlSW5mbyhWLHQsITAsIShKJiYoSj09PU98fEo9PT1PLiQkb3JpZ2luYWxEaXJlY3RpdmUpKSksSy4kJGFkZFNjb3BlQ2xhc3MoViwhMCksdC4kJGlzb2xhdGVCaW5kaW5ncz1PLiQkaXNvbGF0ZUJpbmRpbmdzLChHYT1iYShjLGYsdCx0LiQkaXNvbGF0ZUJpbmRpbmdzLE8pKSYmdC4kb24oXCIkZGVzdHJveVwiLEdhKSk7Zm9yKHZhciBuIGluIHYpe0dhPVRbbl07dmFyIGdhPXZbbl0sTD1HYS4kJGJpbmRpbmdzLmJpbmRUb0NvbnRyb2xsZXI7Z2EuaWRlbnRpZmllciYmTCYmKG09YmEoQSxmLGdhLmluc3RhbmNlLEwsR2EpKTt2YXIgcT1nYSgpO3EhPT1nYS5pbnN0YW5jZSYmKGdhLmluc3RhbmNlPXEsVi5kYXRhKFwiJFwiK0dhLm5hbWUrXCJDb250cm9sbGVyXCIscSksbSYmbSgpLG09YmEoQSxmLGdhLmluc3RhbmNlLEwsR2EpKX1GPTA7Zm9yKE09aC5sZW5ndGg7RjxNO0YrKyltPWhbRl0sXG5lYShtLG0uaXNvbGF0ZVNjb3BlP3Q6YyxWLGYsbS5yZXF1aXJlJiZwKG0uZGlyZWN0aXZlTmFtZSxtLnJlcXVpcmUsVix2KSxDKTt2YXIgVGE9YztPJiYoTy50ZW1wbGF0ZXx8bnVsbD09PU8udGVtcGxhdGVVcmwpJiYoVGE9dCk7YSYmYShUYSxlLmNoaWxkTm9kZXMsdSxnKTtmb3IoRj1sLmxlbmd0aC0xOzA8PUY7Ri0tKW09bFtGXSxlYShtLG0uaXNvbGF0ZVNjb3BlP3Q6YyxWLGYsbS5yZXF1aXJlJiZwKG0uZGlyZWN0aXZlTmFtZSxtLnJlcXVpcmUsVix2KSxDKX1tPW18fHt9O2Zvcih2YXIgQT0tTnVtYmVyLk1BWF9WQUxVRSxSPW0ubmV3U2NvcGVEaXJlY3RpdmUsVD1tLmNvbnRyb2xsZXJEaXJlY3RpdmVzLE89bS5uZXdJc29sYXRlU2NvcGVEaXJlY3RpdmUsSj1tLnRlbXBsYXRlRGlyZWN0aXZlLG49bS5ub25UbGJUcmFuc2NsdWRlRGlyZWN0aXZlLGdhPSExLEw9ITEsYWE9bS5oYXNFbGVtZW50VHJhbnNjbHVkZURpcmVjdGl2ZSxaPWQuJCRlbGVtZW50PUIoYikscSx4LFAsSWE9XG5lLEcsRj0wLE09YS5sZW5ndGg7RjxNO0YrKyl7cT1hW0ZdO3ZhciBOPXEuJCRzdGFydCxRPXEuJCRlbmQ7TiYmKFo9VGEoYixOLFEpKTtQPXU7aWYoQT5xLnByaW9yaXR5KWJyZWFrO2lmKFA9cS5zY29wZSlxLnRlbXBsYXRlVXJsfHwoSChQKT8oVWEoXCJuZXcvaXNvbGF0ZWQgc2NvcGVcIixPfHxSLHEsWiksTz1xKTpVYShcIm5ldy9pc29sYXRlZCBzY29wZVwiLE8scSxaKSksUj1SfHxxO3g9cS5uYW1lOyFxLnRlbXBsYXRlVXJsJiZxLmNvbnRyb2xsZXImJihQPXEuY29udHJvbGxlcixUPVR8fCQoKSxVYShcIidcIit4K1wiJyBjb250cm9sbGVyXCIsVFt4XSxxLFopLFRbeF09cSk7aWYoUD1xLnRyYW5zY2x1ZGUpZ2E9ITAscS4kJHRsYnx8KFVhKFwidHJhbnNjbHVzaW9uXCIsbixxLFopLG49cSksXCJlbGVtZW50XCI9PVA/KGFhPSEwLEE9cS5wcmlvcml0eSxQPVosWj1kLiQkZWxlbWVudD1CKFguY3JlYXRlQ29tbWVudChcIiBcIit4K1wiOiBcIitkW3hdK1wiIFwiKSksYj1aWzBdLFkoZixyYS5jYWxsKFAsMCksXG5iKSxJYT1LKFAsZSxBLGcmJmcubmFtZSx7bm9uVGxiVHJhbnNjbHVkZURpcmVjdGl2ZTpufSkpOihQPUIoVmIoYikpLmNvbnRlbnRzKCksWi5lbXB0eSgpLElhPUsoUCxlLHUsdSx7bmVlZHNOZXdTY29wZTpxLiQkaXNvbGF0ZVNjb3BlfHxxLiQkbmV3U2NvcGV9KSk7aWYocS50ZW1wbGF0ZSlpZihMPSEwLFVhKFwidGVtcGxhdGVcIixKLHEsWiksSj1xLFA9eihxLnRlbXBsYXRlKT9xLnRlbXBsYXRlKFosZCk6cS50ZW1wbGF0ZSxQPWphKFApLHEucmVwbGFjZSl7Zz1xO1A9VGIudGVzdChQKT9YYyhZYihxLnRlbXBsYXRlTmFtZXNwYWNlLFUoUCkpKTpbXTtiPVBbMF07aWYoMSE9UC5sZW5ndGh8fDEhPT1iLm5vZGVUeXBlKXRocm93IGhhKFwidHBscnRcIix4LFwiXCIpO1koZixaLGIpO1A9eyRhdHRyOnt9fTt2YXIgV2M9VihiLFtdLFApLFc9YS5zcGxpY2UoRisxLGEubGVuZ3RoLShGKzEpKTsoT3x8UikmJnkoV2MsTyxSKTthPWEuY29uY2F0KFdjKS5jb25jYXQoVyk7UyhkLFApO009YS5sZW5ndGh9ZWxzZSBaLmh0bWwoUCk7XG5pZihxLnRlbXBsYXRlVXJsKUw9ITAsVWEoXCJ0ZW1wbGF0ZVwiLEoscSxaKSxKPXEscS5yZXBsYWNlJiYoZz1xKSxEPU9mKGEuc3BsaWNlKEYsYS5sZW5ndGgtRiksWixkLGYsZ2EmJklhLGgsbCx7Y29udHJvbGxlckRpcmVjdGl2ZXM6VCxuZXdTY29wZURpcmVjdGl2ZTpSIT09cSYmUixuZXdJc29sYXRlU2NvcGVEaXJlY3RpdmU6Tyx0ZW1wbGF0ZURpcmVjdGl2ZTpKLG5vblRsYlRyYW5zY2x1ZGVEaXJlY3RpdmU6bn0pLE09YS5sZW5ndGg7ZWxzZSBpZihxLmNvbXBpbGUpdHJ5e0c9cS5jb21waWxlKFosZCxJYSkseihHKT90KG51bGwsRyxOLFEpOkcmJnQoRy5wcmUsRy5wb3N0LE4sUSl9Y2F0Y2goZGEpe2MoZGEsdWEoWikpfXEudGVybWluYWwmJihELnRlcm1pbmFsPSEwLEE9TWF0aC5tYXgoQSxxLnByaW9yaXR5KSl9RC5zY29wZT1SJiYhMD09PVIuc2NvcGU7RC50cmFuc2NsdWRlT25UaGlzRWxlbWVudD1nYTtELnRlbXBsYXRlT25UaGlzRWxlbWVudD1MO0QudHJhbnNjbHVkZT1JYTtcbm0uaGFzRWxlbWVudFRyYW5zY2x1ZGVEaXJlY3RpdmU9YWE7cmV0dXJuIER9ZnVuY3Rpb24geShhLGIsYyl7Zm9yKHZhciBkPTAsZT1hLmxlbmd0aDtkPGU7ZCsrKWFbZF09T2IoYVtkXSx7JCRpc29sYXRlU2NvcGU6YiwkJG5ld1Njb3BlOmN9KX1mdW5jdGlvbiBQKGIsZCxmLGcsaCxrLGwpe2lmKGQ9PT1oKXJldHVybiBudWxsO2g9bnVsbDtpZihlLmhhc093blByb3BlcnR5KGQpKXt2YXIgbTtkPWEuZ2V0KGQrXCJEaXJlY3RpdmVcIik7Zm9yKHZhciBwPTAsdz1kLmxlbmd0aDtwPHc7cCsrKXRyeXttPWRbcF0sKHEoZyl8fGc+bS5wcmlvcml0eSkmJi0xIT1tLnJlc3RyaWN0LmluZGV4T2YoZikmJihrJiYobT1PYihtLHskJHN0YXJ0OmssJCRlbmQ6bH0pKSxiLnB1c2gobSksaD1tKX1jYXRjaChEKXtjKEQpfX1yZXR1cm4gaH1mdW5jdGlvbiBHKGIpe2lmKGUuaGFzT3duUHJvcGVydHkoYikpZm9yKHZhciBjPWEuZ2V0KGIrXCJEaXJlY3RpdmVcIiksZD0wLGY9Yy5sZW5ndGg7ZDxmO2QrKylpZihiPVxuY1tkXSxiLm11bHRpRWxlbWVudClyZXR1cm4hMDtyZXR1cm4hMX1mdW5jdGlvbiBTKGEsYil7dmFyIGM9Yi4kYXR0cixkPWEuJGF0dHIsZT1hLiQkZWxlbWVudDtuKGEsZnVuY3Rpb24oZCxlKXtcIiRcIiE9ZS5jaGFyQXQoMCkmJihiW2VdJiZiW2VdIT09ZCYmKGQrPShcInN0eWxlXCI9PT1lP1wiO1wiOlwiIFwiKStiW2VdKSxhLiRzZXQoZSxkLCEwLGNbZV0pKX0pO24oYixmdW5jdGlvbihiLGYpe1wiY2xhc3NcIj09Zj8oSihlLGIpLGFbXCJjbGFzc1wiXT0oYVtcImNsYXNzXCJdP2FbXCJjbGFzc1wiXStcIiBcIjpcIlwiKStiKTpcInN0eWxlXCI9PWY/KGUuYXR0cihcInN0eWxlXCIsZS5hdHRyKFwic3R5bGVcIikrXCI7XCIrYiksYS5zdHlsZT0oYS5zdHlsZT9hLnN0eWxlK1wiO1wiOlwiXCIpK2IpOlwiJFwiPT1mLmNoYXJBdCgwKXx8YS5oYXNPd25Qcm9wZXJ0eShmKXx8KGFbZl09YixkW2ZdPWNbZl0pfSl9ZnVuY3Rpb24gT2YoYSxiLGMsZSxmLGcsaCxrKXt2YXIgbD1bXSxtLHQscD1iWzBdLHc9YS5zaGlmdCgpLEQ9T2Iodyx7dGVtcGxhdGVVcmw6bnVsbCxcbnRyYW5zY2x1ZGU6bnVsbCxyZXBsYWNlOm51bGwsJCRvcmlnaW5hbERpcmVjdGl2ZTp3fSksQT16KHcudGVtcGxhdGVVcmwpP3cudGVtcGxhdGVVcmwoYixjKTp3LnRlbXBsYXRlVXJsLEs9dy50ZW1wbGF0ZU5hbWVzcGFjZTtiLmVtcHR5KCk7ZChBKS50aGVuKGZ1bmN0aW9uKGQpe3ZhciBULHY7ZD1qYShkKTtpZih3LnJlcGxhY2Upe2Q9VGIudGVzdChkKT9YYyhZYihLLFUoZCkpKTpbXTtUPWRbMF07aWYoMSE9ZC5sZW5ndGh8fDEhPT1ULm5vZGVUeXBlKXRocm93IGhhKFwidHBscnRcIix3Lm5hbWUsQSk7ZD17JGF0dHI6e319O1koZSxiLFQpO3ZhciBDPVYoVCxbXSxkKTtIKHcuc2NvcGUpJiZ5KEMsITApO2E9Qy5jb25jYXQoYSk7UyhjLGQpfWVsc2UgVD1wLGIuaHRtbChkKTthLnVuc2hpZnQoRCk7bT1aKGEsVCxjLGYsYix3LGcsaCxrKTtuKGUsZnVuY3Rpb24oYSxjKXthPT1UJiYoZVtjXT1iWzBdKX0pO2Zvcih0PU8oYlswXS5jaGlsZE5vZGVzLGYpO2wubGVuZ3RoOyl7ZD1sLnNoaWZ0KCk7XG52PWwuc2hpZnQoKTt2YXIgZ2E9bC5zaGlmdCgpLEw9bC5zaGlmdCgpLEM9YlswXTtpZighZC4kJGRlc3Ryb3llZCl7aWYodiE9PXApe3ZhciBxPXYuY2xhc3NOYW1lO2suaGFzRWxlbWVudFRyYW5zY2x1ZGVEaXJlY3RpdmUmJncucmVwbGFjZXx8KEM9VmIoVCkpO1koZ2EsQih2KSxDKTtKKEIoQykscSl9dj1tLnRyYW5zY2x1ZGVPblRoaXNFbGVtZW50P1IoZCxtLnRyYW5zY2x1ZGUsTCk6TDttKHQsZCxDLGUsdil9fWw9bnVsbH0pO3JldHVybiBmdW5jdGlvbihhLGIsYyxkLGUpe2E9ZTtiLiQkZGVzdHJveWVkfHwobD9sLnB1c2goYixjLGQsYSk6KG0udHJhbnNjbHVkZU9uVGhpc0VsZW1lbnQmJihhPVIoYixtLnRyYW5zY2x1ZGUsZSkpLG0odCxiLGMsZCxhKSkpfX1mdW5jdGlvbiBJYShhLGIpe3ZhciBjPWIucHJpb3JpdHktYS5wcmlvcml0eTtyZXR1cm4gMCE9PWM/YzphLm5hbWUhPT1iLm5hbWU/YS5uYW1lPGIubmFtZT8tMToxOmEuaW5kZXgtYi5pbmRleH1mdW5jdGlvbiBVYShhLFxuYixjLGQpe2Z1bmN0aW9uIGUoYSl7cmV0dXJuIGE/XCIgKG1vZHVsZTogXCIrYStcIilcIjpcIlwifWlmKGIpdGhyb3cgaGEoXCJtdWx0aWRpclwiLGIubmFtZSxlKGIuJCRtb2R1bGVOYW1lKSxjLm5hbWUsZShjLiQkbW9kdWxlTmFtZSksYSx1YShkKSk7fWZ1bmN0aW9uIE4oYSxjKXt2YXIgZD1iKGMsITApO2QmJmEucHVzaCh7cHJpb3JpdHk6MCxjb21waWxlOmZ1bmN0aW9uKGEpe2E9YS5wYXJlbnQoKTt2YXIgYj0hIWEubGVuZ3RoO2ImJksuJCRhZGRCaW5kaW5nQ2xhc3MoYSk7cmV0dXJuIGZ1bmN0aW9uKGEsYyl7dmFyIGU9Yy5wYXJlbnQoKTtifHxLLiQkYWRkQmluZGluZ0NsYXNzKGUpO0suJCRhZGRCaW5kaW5nSW5mbyhlLGQuZXhwcmVzc2lvbnMpO2EuJHdhdGNoKGQsZnVuY3Rpb24oYSl7Y1swXS5ub2RlVmFsdWU9YX0pfX19KX1mdW5jdGlvbiBZYihhLGIpe2E9RihhfHxcImh0bWxcIik7c3dpdGNoKGEpe2Nhc2UgXCJzdmdcIjpjYXNlIFwibWF0aFwiOnZhciBjPVguY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbmMuaW5uZXJIVE1MPVwiPFwiK2ErXCI+XCIrYitcIjwvXCIrYStcIj5cIjtyZXR1cm4gYy5jaGlsZE5vZGVzWzBdLmNoaWxkTm9kZXM7ZGVmYXVsdDpyZXR1cm4gYn19ZnVuY3Rpb24gUShhLGIpe2lmKFwic3JjZG9jXCI9PWIpcmV0dXJuIEwuSFRNTDt2YXIgYz10YShhKTtpZihcInhsaW5rSHJlZlwiPT1ifHxcImZvcm1cIj09YyYmXCJhY3Rpb25cIj09Ynx8XCJpbWdcIiE9YyYmKFwic3JjXCI9PWJ8fFwibmdTcmNcIj09YikpcmV0dXJuIEwuUkVTT1VSQ0VfVVJMfWZ1bmN0aW9uIFcoYSxjLGQsZSxmKXt2YXIgZz1RKGEsZSk7Zj1oW2VdfHxmO3ZhciBrPWIoZCwhMCxnLGYpO2lmKGspe2lmKFwibXVsdGlwbGVcIj09PWUmJlwic2VsZWN0XCI9PT10YShhKSl0aHJvdyBoYShcInNlbG11bHRpXCIsdWEoYSkpO2MucHVzaCh7cHJpb3JpdHk6MTAwLGNvbXBpbGU6ZnVuY3Rpb24oKXtyZXR1cm57cHJlOmZ1bmN0aW9uKGEsYyxoKXtjPWguJCRvYnNlcnZlcnN8fChoLiQkb2JzZXJ2ZXJzPSQoKSk7aWYobC50ZXN0KGUpKXRocm93IGhhKFwibm9kb21ldmVudHNcIik7XG52YXIgbT1oW2VdO20hPT1kJiYoaz1tJiZiKG0sITAsZyxmKSxkPW0pO2smJihoW2VdPWsoYSksKGNbZV18fChjW2VdPVtdKSkuJCRpbnRlcj0hMCwoaC4kJG9ic2VydmVycyYmaC4kJG9ic2VydmVyc1tlXS4kJHNjb3BlfHxhKS4kd2F0Y2goayxmdW5jdGlvbihhLGIpe1wiY2xhc3NcIj09PWUmJmEhPWI/aC4kdXBkYXRlQ2xhc3MoYSxiKTpoLiRzZXQoZSxhKX0pKX19fX0pfX1mdW5jdGlvbiBZKGEsYixjKXt2YXIgZD1iWzBdLGU9Yi5sZW5ndGgsZj1kLnBhcmVudE5vZGUsZyxoO2lmKGEpZm9yKGc9MCxoPWEubGVuZ3RoO2c8aDtnKyspaWYoYVtnXT09ZCl7YVtnKytdPWM7aD1nK2UtMTtmb3IodmFyIGs9YS5sZW5ndGg7ZzxrO2crKyxoKyspaDxrP2FbZ109YVtoXTpkZWxldGUgYVtnXTthLmxlbmd0aC09ZS0xO2EuY29udGV4dD09PWQmJihhLmNvbnRleHQ9Yyk7YnJlYWt9ZiYmZi5yZXBsYWNlQ2hpbGQoYyxkKTthPVguY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpO2EuYXBwZW5kQ2hpbGQoZCk7XG5CLmhhc0RhdGEoZCkmJihCLmRhdGEoYyxCLmRhdGEoZCkpLG9hPyhSYj0hMCxvYS5jbGVhbkRhdGEoW2RdKSk6ZGVsZXRlIEIuY2FjaGVbZFtCLmV4cGFuZG9dXSk7ZD0xO2ZvcihlPWIubGVuZ3RoO2Q8ZTtkKyspZj1iW2RdLEIoZikucmVtb3ZlKCksYS5hcHBlbmRDaGlsZChmKSxkZWxldGUgYltkXTtiWzBdPWM7Yi5sZW5ndGg9MX1mdW5jdGlvbiBjYShhLGIpe3JldHVybiBNKGZ1bmN0aW9uKCl7cmV0dXJuIGEuYXBwbHkobnVsbCxhcmd1bWVudHMpfSxhLGIpfWZ1bmN0aW9uIGVhKGEsYixkLGUsZixnKXt0cnl7YShiLGQsZSxmLGcpfWNhdGNoKGgpe2MoaCx1YShkKSl9fWZ1bmN0aW9uIGJhKGEsYyxkLGUsZil7dmFyIGc9W107bihlLGZ1bmN0aW9uKGUsaCl7dmFyIGs9ZS5hdHRyTmFtZSxsPWUub3B0aW9uYWwsbSx0LHcsRDtzd2l0Y2goZS5tb2RlKXtjYXNlIFwiQFwiOmx8fHFhLmNhbGwoYyxrKXx8KGRbaF09Y1trXT12b2lkIDApO2MuJG9ic2VydmUoayxmdW5jdGlvbihhKXtFKGEpJiZcbihkW2hdPWEpfSk7Yy4kJG9ic2VydmVyc1trXS4kJHNjb3BlPWE7RShjW2tdKSYmKGRbaF09YihjW2tdKShhKSk7YnJlYWs7Y2FzZSBcIj1cIjppZighcWEuY2FsbChjLGspKXtpZihsKWJyZWFrO2Nba109dm9pZCAwfWlmKGwmJiFjW2tdKWJyZWFrO3Q9cChjW2tdKTtEPXQubGl0ZXJhbD9tYTpmdW5jdGlvbihhLGIpe3JldHVybiBhPT09Ynx8YSE9PWEmJmIhPT1ifTt3PXQuYXNzaWdufHxmdW5jdGlvbigpe209ZFtoXT10KGEpO3Rocm93IGhhKFwibm9uYXNzaWduXCIsY1trXSxmLm5hbWUpO307bT1kW2hdPXQoYSk7bD1mdW5jdGlvbihiKXtEKGIsZFtoXSl8fChEKGIsbSk/dyhhLGI9ZFtoXSk6ZFtoXT1iKTtyZXR1cm4gbT1ifTtsLiRzdGF0ZWZ1bD0hMDtsPWUuY29sbGVjdGlvbj9hLiR3YXRjaENvbGxlY3Rpb24oY1trXSxsKTphLiR3YXRjaChwKGNba10sbCksbnVsbCx0LmxpdGVyYWwpO2cucHVzaChsKTticmVhaztjYXNlIFwiJlwiOnQ9Yy5oYXNPd25Qcm9wZXJ0eShrKT9wKGNba10pOlxueDtpZih0PT09eCYmbClicmVhaztkW2hdPWZ1bmN0aW9uKGIpe3JldHVybiB0KGEsYil9fX0pO3JldHVybiBnLmxlbmd0aCYmZnVuY3Rpb24oKXtmb3IodmFyIGE9MCxiPWcubGVuZ3RoO2E8YjsrK2EpZ1thXSgpfX12YXIgZmE9ZnVuY3Rpb24oYSxiKXtpZihiKXt2YXIgYz1PYmplY3Qua2V5cyhiKSxkLGUsZjtkPTA7Zm9yKGU9Yy5sZW5ndGg7ZDxlO2QrKylmPWNbZF0sdGhpc1tmXT1iW2ZdfWVsc2UgdGhpcy4kYXR0cj17fTt0aGlzLiQkZWxlbWVudD1hfTtmYS5wcm90b3R5cGU9eyRub3JtYWxpemU6dmEsJGFkZENsYXNzOmZ1bmN0aW9uKGEpe2EmJjA8YS5sZW5ndGgmJmFhLmFkZENsYXNzKHRoaXMuJCRlbGVtZW50LGEpfSwkcmVtb3ZlQ2xhc3M6ZnVuY3Rpb24oYSl7YSYmMDxhLmxlbmd0aCYmYWEucmVtb3ZlQ2xhc3ModGhpcy4kJGVsZW1lbnQsYSl9LCR1cGRhdGVDbGFzczpmdW5jdGlvbihhLGIpe3ZhciBjPVljKGEsYik7YyYmYy5sZW5ndGgmJmFhLmFkZENsYXNzKHRoaXMuJCRlbGVtZW50LFxuYyk7KGM9WWMoYixhKSkmJmMubGVuZ3RoJiZhYS5yZW1vdmVDbGFzcyh0aGlzLiQkZWxlbWVudCxjKX0sJHNldDpmdW5jdGlvbihhLGIsZCxlKXt2YXIgZj1RYyh0aGlzLiQkZWxlbWVudFswXSxhKSxnPVpjW2FdLGg9YTtmPyh0aGlzLiQkZWxlbWVudC5wcm9wKGEsYiksZT1mKTpnJiYodGhpc1tnXT1iLGg9Zyk7dGhpc1thXT1iO2U/dGhpcy4kYXR0clthXT1lOihlPXRoaXMuJGF0dHJbYV0pfHwodGhpcy4kYXR0clthXT1lPXpjKGEsXCItXCIpKTtmPXRhKHRoaXMuJCRlbGVtZW50KTtpZihcImFcIj09PWYmJlwiaHJlZlwiPT09YXx8XCJpbWdcIj09PWYmJlwic3JjXCI9PT1hKXRoaXNbYV09Yj1EKGIsXCJzcmNcIj09PWEpO2Vsc2UgaWYoXCJpbWdcIj09PWYmJlwic3Jjc2V0XCI9PT1hKXtmb3IodmFyIGY9XCJcIixnPVUoYiksaz0vKFxccytcXGQreFxccyosfFxccytcXGQrd1xccyosfFxccyssfCxcXHMrKS8saz0vXFxzLy50ZXN0KGcpP2s6LygsKS8sZz1nLnNwbGl0KGspLGs9TWF0aC5mbG9vcihnLmxlbmd0aC8yKSxsPTA7bDxcbms7bCsrKXZhciBtPTIqbCxmPWYrRChVKGdbbV0pLCEwKSxmPWYrKFwiIFwiK1UoZ1ttKzFdKSk7Zz1VKGdbMipsXSkuc3BsaXQoL1xccy8pO2YrPUQoVShnWzBdKSwhMCk7Mj09PWcubGVuZ3RoJiYoZis9XCIgXCIrVShnWzFdKSk7dGhpc1thXT1iPWZ9ITEhPT1kJiYobnVsbD09PWJ8fHEoYik/dGhpcy4kJGVsZW1lbnQucmVtb3ZlQXR0cihlKTp0aGlzLiQkZWxlbWVudC5hdHRyKGUsYikpOyhhPXRoaXMuJCRvYnNlcnZlcnMpJiZuKGFbaF0sZnVuY3Rpb24oYSl7dHJ5e2EoYil9Y2F0Y2goZCl7YyhkKX19KX0sJG9ic2VydmU6ZnVuY3Rpb24oYSxiKXt2YXIgYz10aGlzLGQ9Yy4kJG9ic2VydmVyc3x8KGMuJCRvYnNlcnZlcnM9JCgpKSxlPWRbYV18fChkW2FdPVtdKTtlLnB1c2goYik7dy4kZXZhbEFzeW5jKGZ1bmN0aW9uKCl7ZS4kJGludGVyfHwhYy5oYXNPd25Qcm9wZXJ0eShhKXx8cShjW2FdKXx8YihjW2FdKX0pO3JldHVybiBmdW5jdGlvbigpe2FiKGUsYil9fX07dmFyIGRhPWIuc3RhcnRTeW1ib2woKSxcbmlhPWIuZW5kU3ltYm9sKCksamE9XCJ7e1wiPT1kYXx8XCJ9fVwiPT1pYT9ZYTpmdW5jdGlvbihhKXtyZXR1cm4gYS5yZXBsYWNlKC9cXHtcXHsvZyxkYSkucmVwbGFjZSgvfX0vZyxpYSl9LGthPS9ebmdBdHRyW0EtWl0vLGxhPS9eKC4rKVN0YXJ0JC87Sy4kJGFkZEJpbmRpbmdJbmZvPW0/ZnVuY3Rpb24oYSxiKXt2YXIgYz1hLmRhdGEoXCIkYmluZGluZ1wiKXx8W107SShiKT9jPWMuY29uY2F0KGIpOmMucHVzaChiKTthLmRhdGEoXCIkYmluZGluZ1wiLGMpfTp4O0suJCRhZGRCaW5kaW5nQ2xhc3M9bT9mdW5jdGlvbihhKXtKKGEsXCJuZy1iaW5kaW5nXCIpfTp4O0suJCRhZGRTY29wZUluZm89bT9mdW5jdGlvbihhLGIsYyxkKXthLmRhdGEoYz9kP1wiJGlzb2xhdGVTY29wZU5vVGVtcGxhdGVcIjpcIiRpc29sYXRlU2NvcGVcIjpcIiRzY29wZVwiLGIpfTp4O0suJCRhZGRTY29wZUNsYXNzPW0/ZnVuY3Rpb24oYSxiKXtKKGEsYj9cIm5nLWlzb2xhdGUtc2NvcGVcIjpcIm5nLXNjb3BlXCIpfTp4O3JldHVybiBLfV19ZnVuY3Rpb24gdmEoYSl7cmV0dXJuIGZiKGEucmVwbGFjZShWYyxcblwiXCIpKX1mdW5jdGlvbiBZYyhhLGIpe3ZhciBkPVwiXCIsYz1hLnNwbGl0KC9cXHMrLyksZT1iLnNwbGl0KC9cXHMrLyksZj0wO2E6Zm9yKDtmPGMubGVuZ3RoO2YrKyl7Zm9yKHZhciBnPWNbZl0saD0wO2g8ZS5sZW5ndGg7aCsrKWlmKGc9PWVbaF0pY29udGludWUgYTtkKz0oMDxkLmxlbmd0aD9cIiBcIjpcIlwiKStnfXJldHVybiBkfWZ1bmN0aW9uIFhjKGEpe2E9QihhKTt2YXIgYj1hLmxlbmd0aDtpZigxPj1iKXJldHVybiBhO2Zvcig7Yi0tOyk4PT09YVtiXS5ub2RlVHlwZSYmUGYuY2FsbChhLGIsMSk7cmV0dXJuIGF9ZnVuY3Rpb24gWGUoKXt2YXIgYT17fSxiPSExO3RoaXMucmVnaXN0ZXI9ZnVuY3Rpb24oYixjKXtSYShiLFwiY29udHJvbGxlclwiKTtIKGIpP00oYSxiKTphW2JdPWN9O3RoaXMuYWxsb3dHbG9iYWxzPWZ1bmN0aW9uKCl7Yj0hMH07dGhpcy4kZ2V0PVtcIiRpbmplY3RvclwiLFwiJHdpbmRvd1wiLGZ1bmN0aW9uKGQsYyl7ZnVuY3Rpb24gZShhLGIsYyxkKXtpZighYXx8IUgoYS4kc2NvcGUpKXRocm93IEcoXCIkY29udHJvbGxlclwiKShcIm5vc2NwXCIsXG5kLGIpO2EuJHNjb3BlW2JdPWN9cmV0dXJuIGZ1bmN0aW9uKGYsZyxoLGspe3ZhciBsLG0scjtoPSEwPT09aDtrJiZFKGspJiYocj1rKTtpZihFKGYpKXtrPWYubWF0Y2goVWMpO2lmKCFrKXRocm93IFFmKFwiY3RybGZtdFwiLGYpO209a1sxXTtyPXJ8fGtbM107Zj1hLmhhc093blByb3BlcnR5KG0pP2FbbV06QmMoZy4kc2NvcGUsbSwhMCl8fChiP0JjKGMsbSwhMCk6dSk7UWEoZixtLCEwKX1pZihoKXJldHVybiBoPShJKGYpP2ZbZi5sZW5ndGgtMV06ZikucHJvdG90eXBlLGw9T2JqZWN0LmNyZWF0ZShofHxudWxsKSxyJiZlKGcscixsLG18fGYubmFtZSksTShmdW5jdGlvbigpe3ZhciBhPWQuaW52b2tlKGYsbCxnLG0pO2EhPT1sJiYoSChhKXx8eihhKSkmJihsPWEsciYmZShnLHIsbCxtfHxmLm5hbWUpKTtyZXR1cm4gbH0se2luc3RhbmNlOmwsaWRlbnRpZmllcjpyfSk7bD1kLmluc3RhbnRpYXRlKGYsZyxtKTtyJiZlKGcscixsLG18fGYubmFtZSk7cmV0dXJuIGx9fV19ZnVuY3Rpb24gWWUoKXt0aGlzLiRnZXQ9XG5bXCIkd2luZG93XCIsZnVuY3Rpb24oYSl7cmV0dXJuIEIoYS5kb2N1bWVudCl9XX1mdW5jdGlvbiBaZSgpe3RoaXMuJGdldD1bXCIkbG9nXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGZ1bmN0aW9uKGIsZCl7YS5lcnJvci5hcHBseShhLGFyZ3VtZW50cyl9fV19ZnVuY3Rpb24gWmIoYSl7cmV0dXJuIEgoYSk/ZGEoYSk/YS50b0lTT1N0cmluZygpOmRiKGEpOmF9ZnVuY3Rpb24gZGYoKXt0aGlzLiRnZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gZnVuY3Rpb24oYSl7aWYoIWEpcmV0dXJuXCJcIjt2YXIgYj1bXTtvYyhhLGZ1bmN0aW9uKGEsYyl7bnVsbD09PWF8fHEoYSl8fChJKGEpP24oYSxmdW5jdGlvbihhLGQpe2IucHVzaChqYShjKStcIj1cIitqYShaYihhKSkpfSk6Yi5wdXNoKGphKGMpK1wiPVwiK2phKFpiKGEpKSkpfSk7cmV0dXJuIGIuam9pbihcIiZcIil9fX1mdW5jdGlvbiBlZigpe3RoaXMuJGdldD1mdW5jdGlvbigpe3JldHVybiBmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEsZSxmKXtudWxsPT09YXx8cShhKXx8XG4oSShhKT9uKGEsZnVuY3Rpb24oYSxjKXtiKGEsZStcIltcIisoSChhKT9jOlwiXCIpK1wiXVwiKX0pOkgoYSkmJiFkYShhKT9vYyhhLGZ1bmN0aW9uKGEsYyl7YihhLGUrKGY/XCJcIjpcIltcIikrYysoZj9cIlwiOlwiXVwiKSl9KTpkLnB1c2goamEoZSkrXCI9XCIramEoWmIoYSkpKSl9aWYoIWEpcmV0dXJuXCJcIjt2YXIgZD1bXTtiKGEsXCJcIiwhMCk7cmV0dXJuIGQuam9pbihcIiZcIil9fX1mdW5jdGlvbiAkYihhLGIpe2lmKEUoYSkpe3ZhciBkPWEucmVwbGFjZShSZixcIlwiKS50cmltKCk7aWYoZCl7dmFyIGM9YihcIkNvbnRlbnQtVHlwZVwiKTsoYz1jJiYwPT09Yy5pbmRleE9mKCRjKSl8fChjPShjPWQubWF0Y2goU2YpKSYmVGZbY1swXV0udGVzdChkKSk7YyYmKGE9dWMoZCkpfX1yZXR1cm4gYX1mdW5jdGlvbiBhZChhKXt2YXIgYj0kKCksZDtFKGEpP24oYS5zcGxpdChcIlxcblwiKSxmdW5jdGlvbihhKXtkPWEuaW5kZXhPZihcIjpcIik7dmFyIGU9RihVKGEuc3Vic3RyKDAsZCkpKTthPVUoYS5zdWJzdHIoZCsxKSk7ZSYmXG4oYltlXT1iW2VdP2JbZV0rXCIsIFwiK2E6YSl9KTpIKGEpJiZuKGEsZnVuY3Rpb24oYSxkKXt2YXIgZj1GKGQpLGc9VShhKTtmJiYoYltmXT1iW2ZdP2JbZl0rXCIsIFwiK2c6Zyl9KTtyZXR1cm4gYn1mdW5jdGlvbiBiZChhKXt2YXIgYjtyZXR1cm4gZnVuY3Rpb24oZCl7Ynx8KGI9YWQoYSkpO3JldHVybiBkPyhkPWJbRihkKV0sdm9pZCAwPT09ZCYmKGQ9bnVsbCksZCk6Yn19ZnVuY3Rpb24gY2QoYSxiLGQsYyl7aWYoeihjKSlyZXR1cm4gYyhhLGIsZCk7bihjLGZ1bmN0aW9uKGMpe2E9YyhhLGIsZCl9KTtyZXR1cm4gYX1mdW5jdGlvbiBjZigpe3ZhciBhPXRoaXMuZGVmYXVsdHM9e3RyYW5zZm9ybVJlc3BvbnNlOlskYl0sdHJhbnNmb3JtUmVxdWVzdDpbZnVuY3Rpb24oYSl7cmV0dXJuIEgoYSkmJlwiW29iamVjdCBGaWxlXVwiIT09c2EuY2FsbChhKSYmXCJbb2JqZWN0IEJsb2JdXCIhPT1zYS5jYWxsKGEpJiZcIltvYmplY3QgRm9ybURhdGFdXCIhPT1zYS5jYWxsKGEpP2RiKGEpOmF9XSxoZWFkZXJzOntjb21tb246e0FjY2VwdDpcImFwcGxpY2F0aW9uL2pzb24sIHRleHQvcGxhaW4sICovKlwifSxcbnBvc3Q6aWEoYWMpLHB1dDppYShhYykscGF0Y2g6aWEoYWMpfSx4c3JmQ29va2llTmFtZTpcIlhTUkYtVE9LRU5cIix4c3JmSGVhZGVyTmFtZTpcIlgtWFNSRi1UT0tFTlwiLHBhcmFtU2VyaWFsaXplcjpcIiRodHRwUGFyYW1TZXJpYWxpemVyXCJ9LGI9ITE7dGhpcy51c2VBcHBseUFzeW5jPWZ1bmN0aW9uKGEpe3JldHVybiB5KGEpPyhiPSEhYSx0aGlzKTpifTt2YXIgZD0hMDt0aGlzLnVzZUxlZ2FjeVByb21pc2VFeHRlbnNpb25zPWZ1bmN0aW9uKGEpe3JldHVybiB5KGEpPyhkPSEhYSx0aGlzKTpkfTt2YXIgYz10aGlzLmludGVyY2VwdG9ycz1bXTt0aGlzLiRnZXQ9W1wiJGh0dHBCYWNrZW5kXCIsXCIkJGNvb2tpZVJlYWRlclwiLFwiJGNhY2hlRmFjdG9yeVwiLFwiJHJvb3RTY29wZVwiLFwiJHFcIixcIiRpbmplY3RvclwiLGZ1bmN0aW9uKGUsZixnLGgsayxsKXtmdW5jdGlvbiBtKGIpe2Z1bmN0aW9uIGMoYSl7dmFyIGI9TSh7fSxhKTtiLmRhdGE9Y2QoYS5kYXRhLGEuaGVhZGVycyxhLnN0YXR1cyxmLnRyYW5zZm9ybVJlc3BvbnNlKTtcbmE9YS5zdGF0dXM7cmV0dXJuIDIwMDw9YSYmMzAwPmE/YjprLnJlamVjdChiKX1mdW5jdGlvbiBlKGEsYil7dmFyIGMsZD17fTtuKGEsZnVuY3Rpb24oYSxlKXt6KGEpPyhjPWEoYiksbnVsbCE9YyYmKGRbZV09YykpOmRbZV09YX0pO3JldHVybiBkfWlmKCFmYS5pc09iamVjdChiKSl0aHJvdyBHKFwiJGh0dHBcIikoXCJiYWRyZXFcIixiKTt2YXIgZj1NKHttZXRob2Q6XCJnZXRcIix0cmFuc2Zvcm1SZXF1ZXN0OmEudHJhbnNmb3JtUmVxdWVzdCx0cmFuc2Zvcm1SZXNwb25zZTphLnRyYW5zZm9ybVJlc3BvbnNlLHBhcmFtU2VyaWFsaXplcjphLnBhcmFtU2VyaWFsaXplcn0sYik7Zi5oZWFkZXJzPWZ1bmN0aW9uKGIpe3ZhciBjPWEuaGVhZGVycyxkPU0oe30sYi5oZWFkZXJzKSxmLGcsaCxjPU0oe30sYy5jb21tb24sY1tGKGIubWV0aG9kKV0pO2E6Zm9yKGYgaW4gYyl7Zz1GKGYpO2ZvcihoIGluIGQpaWYoRihoKT09PWcpY29udGludWUgYTtkW2ZdPWNbZl19cmV0dXJuIGUoZCxpYShiKSl9KGIpO1xuZi5tZXRob2Q9c2IoZi5tZXRob2QpO2YucGFyYW1TZXJpYWxpemVyPUUoZi5wYXJhbVNlcmlhbGl6ZXIpP2wuZ2V0KGYucGFyYW1TZXJpYWxpemVyKTpmLnBhcmFtU2VyaWFsaXplcjt2YXIgZz1bZnVuY3Rpb24oYil7dmFyIGQ9Yi5oZWFkZXJzLGU9Y2QoYi5kYXRhLGJkKGQpLHUsYi50cmFuc2Zvcm1SZXF1ZXN0KTtxKGUpJiZuKGQsZnVuY3Rpb24oYSxiKXtcImNvbnRlbnQtdHlwZVwiPT09RihiKSYmZGVsZXRlIGRbYl19KTtxKGIud2l0aENyZWRlbnRpYWxzKSYmIXEoYS53aXRoQ3JlZGVudGlhbHMpJiYoYi53aXRoQ3JlZGVudGlhbHM9YS53aXRoQ3JlZGVudGlhbHMpO3JldHVybiByKGIsZSkudGhlbihjLGMpfSx1XSxoPWsud2hlbihmKTtmb3Iobih2LGZ1bmN0aW9uKGEpeyhhLnJlcXVlc3R8fGEucmVxdWVzdEVycm9yKSYmZy51bnNoaWZ0KGEucmVxdWVzdCxhLnJlcXVlc3RFcnJvcik7KGEucmVzcG9uc2V8fGEucmVzcG9uc2VFcnJvcikmJmcucHVzaChhLnJlc3BvbnNlLGEucmVzcG9uc2VFcnJvcil9KTtnLmxlbmd0aDspe2I9XG5nLnNoaWZ0KCk7dmFyIG09Zy5zaGlmdCgpLGg9aC50aGVuKGIsbSl9ZD8oaC5zdWNjZXNzPWZ1bmN0aW9uKGEpe1FhKGEsXCJmblwiKTtoLnRoZW4oZnVuY3Rpb24oYil7YShiLmRhdGEsYi5zdGF0dXMsYi5oZWFkZXJzLGYpfSk7cmV0dXJuIGh9LGguZXJyb3I9ZnVuY3Rpb24oYSl7UWEoYSxcImZuXCIpO2gudGhlbihudWxsLGZ1bmN0aW9uKGIpe2EoYi5kYXRhLGIuc3RhdHVzLGIuaGVhZGVycyxmKX0pO3JldHVybiBofSk6KGguc3VjY2Vzcz1kZChcInN1Y2Nlc3NcIiksaC5lcnJvcj1kZChcImVycm9yXCIpKTtyZXR1cm4gaH1mdW5jdGlvbiByKGMsZCl7ZnVuY3Rpb24gZyhhLGMsZCxlKXtmdW5jdGlvbiBmKCl7bChjLGEsZCxlKX1KJiYoMjAwPD1hJiYzMDA+YT9KLnB1dChSLFthLGMsYWQoZCksZV0pOkoucmVtb3ZlKFIpKTtiP2guJGFwcGx5QXN5bmMoZik6KGYoKSxoLiQkcGhhc2V8fGguJGFwcGx5KCkpfWZ1bmN0aW9uIGwoYSxiLGQsZSl7Yj0tMTw9Yj9iOjA7KDIwMDw9YiYmMzAwPmI/bi5yZXNvbHZlOlxubi5yZWplY3QpKHtkYXRhOmEsc3RhdHVzOmIsaGVhZGVyczpiZChkKSxjb25maWc6YyxzdGF0dXNUZXh0OmV9KX1mdW5jdGlvbiByKGEpe2woYS5kYXRhLGEuc3RhdHVzLGlhKGEuaGVhZGVycygpKSxhLnN0YXR1c1RleHQpfWZ1bmN0aW9uIHYoKXt2YXIgYT1tLnBlbmRpbmdSZXF1ZXN0cy5pbmRleE9mKGMpOy0xIT09YSYmbS5wZW5kaW5nUmVxdWVzdHMuc3BsaWNlKGEsMSl9dmFyIG49ay5kZWZlcigpLEQ9bi5wcm9taXNlLEosSyxPPWMuaGVhZGVycyxSPXQoYy51cmwsYy5wYXJhbVNlcmlhbGl6ZXIoYy5wYXJhbXMpKTttLnBlbmRpbmdSZXF1ZXN0cy5wdXNoKGMpO0QudGhlbih2LHYpOyFjLmNhY2hlJiYhYS5jYWNoZXx8ITE9PT1jLmNhY2hlfHxcIkdFVFwiIT09Yy5tZXRob2QmJlwiSlNPTlBcIiE9PWMubWV0aG9kfHwoSj1IKGMuY2FjaGUpP2MuY2FjaGU6SChhLmNhY2hlKT9hLmNhY2hlOkEpO0omJihLPUouZ2V0KFIpLHkoSyk/SyYmeihLLnRoZW4pP0sudGhlbihyLHIpOkkoSyk/bChLWzFdLFxuS1swXSxpYShLWzJdKSxLWzNdKTpsKEssMjAwLHt9LFwiT0tcIik6Si5wdXQoUixEKSk7cShLKSYmKChLPWVkKGMudXJsKT9mKClbYy54c3JmQ29va2llTmFtZXx8YS54c3JmQ29va2llTmFtZV06dSkmJihPW2MueHNyZkhlYWRlck5hbWV8fGEueHNyZkhlYWRlck5hbWVdPUspLGUoYy5tZXRob2QsUixkLGcsTyxjLnRpbWVvdXQsYy53aXRoQ3JlZGVudGlhbHMsYy5yZXNwb25zZVR5cGUpKTtyZXR1cm4gRH1mdW5jdGlvbiB0KGEsYil7MDxiLmxlbmd0aCYmKGErPSgtMT09YS5pbmRleE9mKFwiP1wiKT9cIj9cIjpcIiZcIikrYik7cmV0dXJuIGF9dmFyIEE9ZyhcIiRodHRwXCIpO2EucGFyYW1TZXJpYWxpemVyPUUoYS5wYXJhbVNlcmlhbGl6ZXIpP2wuZ2V0KGEucGFyYW1TZXJpYWxpemVyKTphLnBhcmFtU2VyaWFsaXplcjt2YXIgdj1bXTtuKGMsZnVuY3Rpb24oYSl7di51bnNoaWZ0KEUoYSk/bC5nZXQoYSk6bC5pbnZva2UoYSkpfSk7bS5wZW5kaW5nUmVxdWVzdHM9W107KGZ1bmN0aW9uKGEpe24oYXJndW1lbnRzLFxuZnVuY3Rpb24oYSl7bVthXT1mdW5jdGlvbihiLGMpe3JldHVybiBtKE0oe30sY3x8e30se21ldGhvZDphLHVybDpifSkpfX0pfSkoXCJnZXRcIixcImRlbGV0ZVwiLFwiaGVhZFwiLFwianNvbnBcIik7KGZ1bmN0aW9uKGEpe24oYXJndW1lbnRzLGZ1bmN0aW9uKGEpe21bYV09ZnVuY3Rpb24oYixjLGQpe3JldHVybiBtKE0oe30sZHx8e30se21ldGhvZDphLHVybDpiLGRhdGE6Y30pKX19KX0pKFwicG9zdFwiLFwicHV0XCIsXCJwYXRjaFwiKTttLmRlZmF1bHRzPWE7cmV0dXJuIG19XX1mdW5jdGlvbiBnZigpe3RoaXMuJGdldD1mdW5jdGlvbigpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiBuZXcgUy5YTUxIdHRwUmVxdWVzdH19fWZ1bmN0aW9uIGZmKCl7dGhpcy4kZ2V0PVtcIiRicm93c2VyXCIsXCIkd2luZG93XCIsXCIkZG9jdW1lbnRcIixcIiR4aHJGYWN0b3J5XCIsZnVuY3Rpb24oYSxiLGQsYyl7cmV0dXJuIFVmKGEsYyxhLmRlZmVyLGIuYW5ndWxhci5jYWxsYmFja3MsZFswXSl9XX1mdW5jdGlvbiBVZihhLGIsZCxcbmMsZSl7ZnVuY3Rpb24gZihhLGIsZCl7dmFyIGY9ZS5jcmVhdGVFbGVtZW50KFwic2NyaXB0XCIpLG09bnVsbDtmLnR5cGU9XCJ0ZXh0L2phdmFzY3JpcHRcIjtmLnNyYz1hO2YuYXN5bmM9ITA7bT1mdW5jdGlvbihhKXtmLnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJsb2FkXCIsbSwhMSk7Zi5yZW1vdmVFdmVudExpc3RlbmVyKFwiZXJyb3JcIixtLCExKTtlLmJvZHkucmVtb3ZlQ2hpbGQoZik7Zj1udWxsO3ZhciBnPS0xLEE9XCJ1bmtub3duXCI7YSYmKFwibG9hZFwiIT09YS50eXBlfHxjW2JdLmNhbGxlZHx8KGE9e3R5cGU6XCJlcnJvclwifSksQT1hLnR5cGUsZz1cImVycm9yXCI9PT1hLnR5cGU/NDA0OjIwMCk7ZCYmZChnLEEpfTtmLmFkZEV2ZW50TGlzdGVuZXIoXCJsb2FkXCIsbSwhMSk7Zi5hZGRFdmVudExpc3RlbmVyKFwiZXJyb3JcIixtLCExKTtlLmJvZHkuYXBwZW5kQ2hpbGQoZik7cmV0dXJuIG19cmV0dXJuIGZ1bmN0aW9uKGUsaCxrLGwsbSxyLHQsQSl7ZnVuY3Rpb24gdigpe0MmJkMoKTt3JiZ3LmFib3J0KCl9XG5mdW5jdGlvbiBUKGIsYyxlLGYsZyl7eShMKSYmZC5jYW5jZWwoTCk7Qz13PW51bGw7YihjLGUsZixnKTthLiQkY29tcGxldGVPdXRzdGFuZGluZ1JlcXVlc3QoeCl9YS4kJGluY091dHN0YW5kaW5nUmVxdWVzdENvdW50KCk7aD1ofHxhLnVybCgpO2lmKFwianNvbnBcIj09RihlKSl7dmFyIHA9XCJfXCIrKGMuY291bnRlcisrKS50b1N0cmluZygzNik7Y1twXT1mdW5jdGlvbihhKXtjW3BdLmRhdGE9YTtjW3BdLmNhbGxlZD0hMH07dmFyIEM9ZihoLnJlcGxhY2UoXCJKU09OX0NBTExCQUNLXCIsXCJhbmd1bGFyLmNhbGxiYWNrcy5cIitwKSxwLGZ1bmN0aW9uKGEsYil7VChsLGEsY1twXS5kYXRhLFwiXCIsYik7Y1twXT14fSl9ZWxzZXt2YXIgdz1iKGUsaCk7dy5vcGVuKGUsaCwhMCk7bihtLGZ1bmN0aW9uKGEsYil7eShhKSYmdy5zZXRSZXF1ZXN0SGVhZGVyKGIsYSl9KTt3Lm9ubG9hZD1mdW5jdGlvbigpe3ZhciBhPXcuc3RhdHVzVGV4dHx8XCJcIixiPVwicmVzcG9uc2VcImluIHc/dy5yZXNwb25zZTp3LnJlc3BvbnNlVGV4dCxcbmM9MTIyMz09PXcuc3RhdHVzPzIwNDp3LnN0YXR1czswPT09YyYmKGM9Yj8yMDA6XCJmaWxlXCI9PXdhKGgpLnByb3RvY29sPzQwNDowKTtUKGwsYyxiLHcuZ2V0QWxsUmVzcG9uc2VIZWFkZXJzKCksYSl9O2U9ZnVuY3Rpb24oKXtUKGwsLTEsbnVsbCxudWxsLFwiXCIpfTt3Lm9uZXJyb3I9ZTt3Lm9uYWJvcnQ9ZTt0JiYody53aXRoQ3JlZGVudGlhbHM9ITApO2lmKEEpdHJ5e3cucmVzcG9uc2VUeXBlPUF9Y2F0Y2goZ2Epe2lmKFwianNvblwiIT09QSl0aHJvdyBnYTt9dy5zZW5kKHEoayk/bnVsbDprKX1pZigwPHIpdmFyIEw9ZCh2LHIpO2Vsc2UgciYmeihyLnRoZW4pJiZyLnRoZW4odil9fWZ1bmN0aW9uIGFmKCl7dmFyIGE9XCJ7e1wiLGI9XCJ9fVwiO3RoaXMuc3RhcnRTeW1ib2w9ZnVuY3Rpb24oYil7cmV0dXJuIGI/KGE9Yix0aGlzKTphfTt0aGlzLmVuZFN5bWJvbD1mdW5jdGlvbihhKXtyZXR1cm4gYT8oYj1hLHRoaXMpOmJ9O3RoaXMuJGdldD1bXCIkcGFyc2VcIixcIiRleGNlcHRpb25IYW5kbGVyXCIsXG5cIiRzY2VcIixmdW5jdGlvbihkLGMsZSl7ZnVuY3Rpb24gZihhKXtyZXR1cm5cIlxcXFxcXFxcXFxcXFwiK2F9ZnVuY3Rpb24gZyhjKXtyZXR1cm4gYy5yZXBsYWNlKG0sYSkucmVwbGFjZShyLGIpfWZ1bmN0aW9uIGgoZixoLG0scil7ZnVuY3Rpb24gcChhKXt0cnl7dmFyIGI9YTthPW0/ZS5nZXRUcnVzdGVkKG0sYik6ZS52YWx1ZU9mKGIpO3ZhciBkO2lmKHImJiF5KGEpKWQ9YTtlbHNlIGlmKG51bGw9PWEpZD1cIlwiO2Vsc2V7c3dpdGNoKHR5cGVvZiBhKXtjYXNlIFwic3RyaW5nXCI6YnJlYWs7Y2FzZSBcIm51bWJlclwiOmE9XCJcIithO2JyZWFrO2RlZmF1bHQ6YT1kYihhKX1kPWF9cmV0dXJuIGR9Y2F0Y2goZyl7YyhKYS5pbnRlcnIoZixnKSl9fXI9ISFyO2Zvcih2YXIgQyx3LG49MCxMPVtdLHM9W10sRD1mLmxlbmd0aCxKPVtdLEs9W107bjxEOylpZigtMSE9KEM9Zi5pbmRleE9mKGEsbikpJiYtMSE9KHc9Zi5pbmRleE9mKGIsQytrKSkpbiE9PUMmJkoucHVzaChnKGYuc3Vic3RyaW5nKG4sQykpKSxuPWYuc3Vic3RyaW5nKEMrXG5rLHcpLEwucHVzaChuKSxzLnB1c2goZChuLHApKSxuPXcrbCxLLnB1c2goSi5sZW5ndGgpLEoucHVzaChcIlwiKTtlbHNle24hPT1EJiZKLnB1c2goZyhmLnN1YnN0cmluZyhuKSkpO2JyZWFrfW0mJjE8Si5sZW5ndGgmJkphLnRocm93Tm9jb25jYXQoZik7aWYoIWh8fEwubGVuZ3RoKXt2YXIgTz1mdW5jdGlvbihhKXtmb3IodmFyIGI9MCxjPUwubGVuZ3RoO2I8YztiKyspe2lmKHImJnEoYVtiXSkpcmV0dXJuO0pbS1tiXV09YVtiXX1yZXR1cm4gSi5qb2luKFwiXCIpfTtyZXR1cm4gTShmdW5jdGlvbihhKXt2YXIgYj0wLGQ9TC5sZW5ndGgsZT1BcnJheShkKTt0cnl7Zm9yKDtiPGQ7YisrKWVbYl09c1tiXShhKTtyZXR1cm4gTyhlKX1jYXRjaChnKXtjKEphLmludGVycihmLGcpKX19LHtleHA6ZixleHByZXNzaW9uczpMLCQkd2F0Y2hEZWxlZ2F0ZTpmdW5jdGlvbihhLGIpe3ZhciBjO3JldHVybiBhLiR3YXRjaEdyb3VwKHMsZnVuY3Rpb24oZCxlKXt2YXIgZj1PKGQpO3ooYikmJmIuY2FsbCh0aGlzLFxuZixkIT09ZT9jOmYsYSk7Yz1mfSl9fSl9fXZhciBrPWEubGVuZ3RoLGw9Yi5sZW5ndGgsbT1uZXcgUmVnRXhwKGEucmVwbGFjZSgvLi9nLGYpLFwiZ1wiKSxyPW5ldyBSZWdFeHAoYi5yZXBsYWNlKC8uL2csZiksXCJnXCIpO2guc3RhcnRTeW1ib2w9ZnVuY3Rpb24oKXtyZXR1cm4gYX07aC5lbmRTeW1ib2w9ZnVuY3Rpb24oKXtyZXR1cm4gYn07cmV0dXJuIGh9XX1mdW5jdGlvbiBiZigpe3RoaXMuJGdldD1bXCIkcm9vdFNjb3BlXCIsXCIkd2luZG93XCIsXCIkcVwiLFwiJCRxXCIsZnVuY3Rpb24oYSxiLGQsYyl7ZnVuY3Rpb24gZShlLGgsayxsKXt2YXIgbT00PGFyZ3VtZW50cy5sZW5ndGgscj1tP3JhLmNhbGwoYXJndW1lbnRzLDQpOltdLHQ9Yi5zZXRJbnRlcnZhbCxBPWIuY2xlYXJJbnRlcnZhbCx2PTAsbj15KGwpJiYhbCxwPShuP2M6ZCkuZGVmZXIoKSxDPXAucHJvbWlzZTtrPXkoayk/azowO0MudGhlbihudWxsLG51bGwsbT9mdW5jdGlvbigpe2UuYXBwbHkobnVsbCxyKX06ZSk7Qy4kJGludGVydmFsSWQ9XG50KGZ1bmN0aW9uKCl7cC5ub3RpZnkodisrKTswPGsmJnY+PWsmJihwLnJlc29sdmUodiksQShDLiQkaW50ZXJ2YWxJZCksZGVsZXRlIGZbQy4kJGludGVydmFsSWRdKTtufHxhLiRhcHBseSgpfSxoKTtmW0MuJCRpbnRlcnZhbElkXT1wO3JldHVybiBDfXZhciBmPXt9O2UuY2FuY2VsPWZ1bmN0aW9uKGEpe3JldHVybiBhJiZhLiQkaW50ZXJ2YWxJZCBpbiBmPyhmW2EuJCRpbnRlcnZhbElkXS5yZWplY3QoXCJjYW5jZWxlZFwiKSxiLmNsZWFySW50ZXJ2YWwoYS4kJGludGVydmFsSWQpLGRlbGV0ZSBmW2EuJCRpbnRlcnZhbElkXSwhMCk6ITF9O3JldHVybiBlfV19ZnVuY3Rpb24gYmMoYSl7YT1hLnNwbGl0KFwiL1wiKTtmb3IodmFyIGI9YS5sZW5ndGg7Yi0tOylhW2JdPW9iKGFbYl0pO3JldHVybiBhLmpvaW4oXCIvXCIpfWZ1bmN0aW9uIGZkKGEsYil7dmFyIGQ9d2EoYSk7Yi4kJHByb3RvY29sPWQucHJvdG9jb2w7Yi4kJGhvc3Q9ZC5ob3N0bmFtZTtiLiQkcG9ydD1lYShkLnBvcnQpfHxWZltkLnByb3RvY29sXXx8XG5udWxsfWZ1bmN0aW9uIGdkKGEsYil7dmFyIGQ9XCIvXCIhPT1hLmNoYXJBdCgwKTtkJiYoYT1cIi9cIithKTt2YXIgYz13YShhKTtiLiQkcGF0aD1kZWNvZGVVUklDb21wb25lbnQoZCYmXCIvXCI9PT1jLnBhdGhuYW1lLmNoYXJBdCgwKT9jLnBhdGhuYW1lLnN1YnN0cmluZygxKTpjLnBhdGhuYW1lKTtiLiQkc2VhcmNoPXhjKGMuc2VhcmNoKTtiLiQkaGFzaD1kZWNvZGVVUklDb21wb25lbnQoYy5oYXNoKTtiLiQkcGF0aCYmXCIvXCIhPWIuJCRwYXRoLmNoYXJBdCgwKSYmKGIuJCRwYXRoPVwiL1wiK2IuJCRwYXRoKX1mdW5jdGlvbiBwYShhLGIpe2lmKDA9PT1iLmluZGV4T2YoYSkpcmV0dXJuIGIuc3Vic3RyKGEubGVuZ3RoKX1mdW5jdGlvbiBGYShhKXt2YXIgYj1hLmluZGV4T2YoXCIjXCIpO3JldHVybi0xPT1iP2E6YS5zdWJzdHIoMCxiKX1mdW5jdGlvbiBpYihhKXtyZXR1cm4gYS5yZXBsYWNlKC8oIy4rKXwjJC8sXCIkMVwiKX1mdW5jdGlvbiBjYyhhLGIsZCl7dGhpcy4kJGh0bWw1PSEwO2Q9ZHx8XCJcIjtcbmZkKGEsdGhpcyk7dGhpcy4kJHBhcnNlPWZ1bmN0aW9uKGEpe3ZhciBkPXBhKGIsYSk7aWYoIUUoZCkpdGhyb3cgRGIoXCJpcHRocHJmeFwiLGEsYik7Z2QoZCx0aGlzKTt0aGlzLiQkcGF0aHx8KHRoaXMuJCRwYXRoPVwiL1wiKTt0aGlzLiQkY29tcG9zZSgpfTt0aGlzLiQkY29tcG9zZT1mdW5jdGlvbigpe3ZhciBhPVFiKHRoaXMuJCRzZWFyY2gpLGQ9dGhpcy4kJGhhc2g/XCIjXCIrb2IodGhpcy4kJGhhc2gpOlwiXCI7dGhpcy4kJHVybD1iYyh0aGlzLiQkcGF0aCkrKGE/XCI/XCIrYTpcIlwiKStkO3RoaXMuJCRhYnNVcmw9Yit0aGlzLiQkdXJsLnN1YnN0cigxKX07dGhpcy4kJHBhcnNlTGlua1VybD1mdW5jdGlvbihjLGUpe2lmKGUmJlwiI1wiPT09ZVswXSlyZXR1cm4gdGhpcy5oYXNoKGUuc2xpY2UoMSkpLCEwO3ZhciBmLGc7eShmPXBhKGEsYykpPyhnPWYsZz15KGY9cGEoZCxmKSk/YisocGEoXCIvXCIsZil8fGYpOmErZyk6eShmPXBhKGIsYykpP2c9YitmOmI9PWMrXCIvXCImJihnPWIpO2cmJnRoaXMuJCRwYXJzZShnKTtcbnJldHVybiEhZ319ZnVuY3Rpb24gZGMoYSxiLGQpe2ZkKGEsdGhpcyk7dGhpcy4kJHBhcnNlPWZ1bmN0aW9uKGMpe3ZhciBlPXBhKGEsYyl8fHBhKGIsYyksZjtxKGUpfHxcIiNcIiE9PWUuY2hhckF0KDApP3RoaXMuJCRodG1sNT9mPWU6KGY9XCJcIixxKGUpJiYoYT1jLHRoaXMucmVwbGFjZSgpKSk6KGY9cGEoZCxlKSxxKGYpJiYoZj1lKSk7Z2QoZix0aGlzKTtjPXRoaXMuJCRwYXRoO3ZhciBlPWEsZz0vXlxcL1tBLVpdOihcXC8uKikvOzA9PT1mLmluZGV4T2YoZSkmJihmPWYucmVwbGFjZShlLFwiXCIpKTtnLmV4ZWMoZil8fChjPShmPWcuZXhlYyhjKSk/ZlsxXTpjKTt0aGlzLiQkcGF0aD1jO3RoaXMuJCRjb21wb3NlKCl9O3RoaXMuJCRjb21wb3NlPWZ1bmN0aW9uKCl7dmFyIGI9UWIodGhpcy4kJHNlYXJjaCksZT10aGlzLiQkaGFzaD9cIiNcIitvYih0aGlzLiQkaGFzaCk6XCJcIjt0aGlzLiQkdXJsPWJjKHRoaXMuJCRwYXRoKSsoYj9cIj9cIitiOlwiXCIpK2U7dGhpcy4kJGFic1VybD1hKyh0aGlzLiQkdXJsP1xuZCt0aGlzLiQkdXJsOlwiXCIpfTt0aGlzLiQkcGFyc2VMaW5rVXJsPWZ1bmN0aW9uKGIsZCl7cmV0dXJuIEZhKGEpPT1GYShiKT8odGhpcy4kJHBhcnNlKGIpLCEwKTohMX19ZnVuY3Rpb24gaGQoYSxiLGQpe3RoaXMuJCRodG1sNT0hMDtkYy5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dGhpcy4kJHBhcnNlTGlua1VybD1mdW5jdGlvbihjLGUpe2lmKGUmJlwiI1wiPT09ZVswXSlyZXR1cm4gdGhpcy5oYXNoKGUuc2xpY2UoMSkpLCEwO3ZhciBmLGc7YT09RmEoYyk/Zj1jOihnPXBhKGIsYykpP2Y9YStkK2c6Yj09PWMrXCIvXCImJihmPWIpO2YmJnRoaXMuJCRwYXJzZShmKTtyZXR1cm4hIWZ9O3RoaXMuJCRjb21wb3NlPWZ1bmN0aW9uKCl7dmFyIGI9UWIodGhpcy4kJHNlYXJjaCksZT10aGlzLiQkaGFzaD9cIiNcIitvYih0aGlzLiQkaGFzaCk6XCJcIjt0aGlzLiQkdXJsPWJjKHRoaXMuJCRwYXRoKSsoYj9cIj9cIitiOlwiXCIpK2U7dGhpcy4kJGFic1VybD1hK2QrdGhpcy4kJHVybH19ZnVuY3Rpb24gRWIoYSl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXNbYV19fVxuZnVuY3Rpb24gaWQoYSxiKXtyZXR1cm4gZnVuY3Rpb24oZCl7aWYocShkKSlyZXR1cm4gdGhpc1thXTt0aGlzW2FdPWIoZCk7dGhpcy4kJGNvbXBvc2UoKTtyZXR1cm4gdGhpc319ZnVuY3Rpb24gaGYoKXt2YXIgYT1cIlwiLGI9e2VuYWJsZWQ6ITEscmVxdWlyZUJhc2U6ITAscmV3cml0ZUxpbmtzOiEwfTt0aGlzLmhhc2hQcmVmaXg9ZnVuY3Rpb24oYil7cmV0dXJuIHkoYik/KGE9Yix0aGlzKTphfTt0aGlzLmh0bWw1TW9kZT1mdW5jdGlvbihhKXtyZXR1cm4gJGEoYSk/KGIuZW5hYmxlZD1hLHRoaXMpOkgoYSk/KCRhKGEuZW5hYmxlZCkmJihiLmVuYWJsZWQ9YS5lbmFibGVkKSwkYShhLnJlcXVpcmVCYXNlKSYmKGIucmVxdWlyZUJhc2U9YS5yZXF1aXJlQmFzZSksJGEoYS5yZXdyaXRlTGlua3MpJiYoYi5yZXdyaXRlTGlua3M9YS5yZXdyaXRlTGlua3MpLHRoaXMpOmJ9O3RoaXMuJGdldD1bXCIkcm9vdFNjb3BlXCIsXCIkYnJvd3NlclwiLFwiJHNuaWZmZXJcIixcIiRyb290RWxlbWVudFwiLFwiJHdpbmRvd1wiLFxuZnVuY3Rpb24oZCxjLGUsZixnKXtmdW5jdGlvbiBoKGEsYixkKXt2YXIgZT1sLnVybCgpLGY9bC4kJHN0YXRlO3RyeXtjLnVybChhLGIsZCksbC4kJHN0YXRlPWMuc3RhdGUoKX1jYXRjaChnKXt0aHJvdyBsLnVybChlKSxsLiQkc3RhdGU9ZixnO319ZnVuY3Rpb24gayhhLGIpe2QuJGJyb2FkY2FzdChcIiRsb2NhdGlvbkNoYW5nZVN1Y2Nlc3NcIixsLmFic1VybCgpLGEsbC4kJHN0YXRlLGIpfXZhciBsLG07bT1jLmJhc2VIcmVmKCk7dmFyIHI9Yy51cmwoKSx0O2lmKGIuZW5hYmxlZCl7aWYoIW0mJmIucmVxdWlyZUJhc2UpdGhyb3cgRGIoXCJub2Jhc2VcIik7dD1yLnN1YnN0cmluZygwLHIuaW5kZXhPZihcIi9cIixyLmluZGV4T2YoXCIvL1wiKSsyKSkrKG18fFwiL1wiKTttPWUuaGlzdG9yeT9jYzpoZH1lbHNlIHQ9RmEociksbT1kYzt2YXIgQT10LnN1YnN0cigwLEZhKHQpLmxhc3RJbmRleE9mKFwiL1wiKSsxKTtsPW5ldyBtKHQsQSxcIiNcIithKTtsLiQkcGFyc2VMaW5rVXJsKHIscik7bC4kJHN0YXRlPVxuYy5zdGF0ZSgpO3ZhciB2PS9eXFxzKihqYXZhc2NyaXB0fG1haWx0byk6L2k7Zi5vbihcImNsaWNrXCIsZnVuY3Rpb24oYSl7aWYoYi5yZXdyaXRlTGlua3MmJiFhLmN0cmxLZXkmJiFhLm1ldGFLZXkmJiFhLnNoaWZ0S2V5JiYyIT1hLndoaWNoJiYyIT1hLmJ1dHRvbil7Zm9yKHZhciBlPUIoYS50YXJnZXQpO1wiYVwiIT09dGEoZVswXSk7KWlmKGVbMF09PT1mWzBdfHwhKGU9ZS5wYXJlbnQoKSlbMF0pcmV0dXJuO3ZhciBoPWUucHJvcChcImhyZWZcIiksaz1lLmF0dHIoXCJocmVmXCIpfHxlLmF0dHIoXCJ4bGluazpocmVmXCIpO0goaCkmJlwiW29iamVjdCBTVkdBbmltYXRlZFN0cmluZ11cIj09PWgudG9TdHJpbmcoKSYmKGg9d2EoaC5hbmltVmFsKS5ocmVmKTt2LnRlc3QoaCl8fCFofHxlLmF0dHIoXCJ0YXJnZXRcIil8fGEuaXNEZWZhdWx0UHJldmVudGVkKCl8fCFsLiQkcGFyc2VMaW5rVXJsKGgsayl8fChhLnByZXZlbnREZWZhdWx0KCksbC5hYnNVcmwoKSE9Yy51cmwoKSYmKGQuJGFwcGx5KCksZy5hbmd1bGFyW1wiZmYtNjg0MjA4LXByZXZlbnREZWZhdWx0XCJdPVxuITApKX19KTtpYihsLmFic1VybCgpKSE9aWIocikmJmMudXJsKGwuYWJzVXJsKCksITApO3ZhciBuPSEwO2Mub25VcmxDaGFuZ2UoZnVuY3Rpb24oYSxiKXtxKHBhKEEsYSkpP2cubG9jYXRpb24uaHJlZj1hOihkLiRldmFsQXN5bmMoZnVuY3Rpb24oKXt2YXIgYz1sLmFic1VybCgpLGU9bC4kJHN0YXRlLGY7YT1pYihhKTtsLiQkcGFyc2UoYSk7bC4kJHN0YXRlPWI7Zj1kLiRicm9hZGNhc3QoXCIkbG9jYXRpb25DaGFuZ2VTdGFydFwiLGEsYyxiLGUpLmRlZmF1bHRQcmV2ZW50ZWQ7bC5hYnNVcmwoKT09PWEmJihmPyhsLiQkcGFyc2UoYyksbC4kJHN0YXRlPWUsaChjLCExLGUpKToobj0hMSxrKGMsZSkpKX0pLGQuJCRwaGFzZXx8ZC4kZGlnZXN0KCkpfSk7ZC4kd2F0Y2goZnVuY3Rpb24oKXt2YXIgYT1pYihjLnVybCgpKSxiPWliKGwuYWJzVXJsKCkpLGY9Yy5zdGF0ZSgpLGc9bC4kJHJlcGxhY2UsbT1hIT09Ynx8bC4kJGh0bWw1JiZlLmhpc3RvcnkmJmYhPT1sLiQkc3RhdGU7aWYobnx8XG5tKW49ITEsZC4kZXZhbEFzeW5jKGZ1bmN0aW9uKCl7dmFyIGI9bC5hYnNVcmwoKSxjPWQuJGJyb2FkY2FzdChcIiRsb2NhdGlvbkNoYW5nZVN0YXJ0XCIsYixhLGwuJCRzdGF0ZSxmKS5kZWZhdWx0UHJldmVudGVkO2wuYWJzVXJsKCk9PT1iJiYoYz8obC4kJHBhcnNlKGEpLGwuJCRzdGF0ZT1mKToobSYmaChiLGcsZj09PWwuJCRzdGF0ZT9udWxsOmwuJCRzdGF0ZSksayhhLGYpKSl9KTtsLiQkcmVwbGFjZT0hMX0pO3JldHVybiBsfV19ZnVuY3Rpb24gamYoKXt2YXIgYT0hMCxiPXRoaXM7dGhpcy5kZWJ1Z0VuYWJsZWQ9ZnVuY3Rpb24oYil7cmV0dXJuIHkoYik/KGE9Yix0aGlzKTphfTt0aGlzLiRnZXQ9W1wiJHdpbmRvd1wiLGZ1bmN0aW9uKGQpe2Z1bmN0aW9uIGMoYSl7YSBpbnN0YW5jZW9mIEVycm9yJiYoYS5zdGFjaz9hPWEubWVzc2FnZSYmLTE9PT1hLnN0YWNrLmluZGV4T2YoYS5tZXNzYWdlKT9cIkVycm9yOiBcIithLm1lc3NhZ2UrXCJcXG5cIithLnN0YWNrOmEuc3RhY2s6YS5zb3VyY2VVUkwmJlxuKGE9YS5tZXNzYWdlK1wiXFxuXCIrYS5zb3VyY2VVUkwrXCI6XCIrYS5saW5lKSk7cmV0dXJuIGF9ZnVuY3Rpb24gZShhKXt2YXIgYj1kLmNvbnNvbGV8fHt9LGU9YlthXXx8Yi5sb2d8fHg7YT0hMTt0cnl7YT0hIWUuYXBwbHl9Y2F0Y2goayl7fXJldHVybiBhP2Z1bmN0aW9uKCl7dmFyIGE9W107bihhcmd1bWVudHMsZnVuY3Rpb24oYil7YS5wdXNoKGMoYikpfSk7cmV0dXJuIGUuYXBwbHkoYixhKX06ZnVuY3Rpb24oYSxiKXtlKGEsbnVsbD09Yj9cIlwiOmIpfX1yZXR1cm57bG9nOmUoXCJsb2dcIiksaW5mbzplKFwiaW5mb1wiKSx3YXJuOmUoXCJ3YXJuXCIpLGVycm9yOmUoXCJlcnJvclwiKSxkZWJ1ZzpmdW5jdGlvbigpe3ZhciBjPWUoXCJkZWJ1Z1wiKTtyZXR1cm4gZnVuY3Rpb24oKXthJiZjLmFwcGx5KGIsYXJndW1lbnRzKX19KCl9fV19ZnVuY3Rpb24gVmEoYSxiKXtpZihcIl9fZGVmaW5lR2V0dGVyX19cIj09PWF8fFwiX19kZWZpbmVTZXR0ZXJfX1wiPT09YXx8XCJfX2xvb2t1cEdldHRlcl9fXCI9PT1hfHxcIl9fbG9va3VwU2V0dGVyX19cIj09PVxuYXx8XCJfX3Byb3RvX19cIj09PWEpdGhyb3cgYmEoXCJpc2VjZmxkXCIsYik7cmV0dXJuIGF9ZnVuY3Rpb24gamQoYSxiKXthKz1cIlwiO2lmKCFFKGEpKXRocm93IGJhKFwiaXNlY2NzdFwiLGIpO3JldHVybiBhfWZ1bmN0aW9uIHhhKGEsYil7aWYoYSl7aWYoYS5jb25zdHJ1Y3Rvcj09PWEpdGhyb3cgYmEoXCJpc2VjZm5cIixiKTtpZihhLndpbmRvdz09PWEpdGhyb3cgYmEoXCJpc2Vjd2luZG93XCIsYik7aWYoYS5jaGlsZHJlbiYmKGEubm9kZU5hbWV8fGEucHJvcCYmYS5hdHRyJiZhLmZpbmQpKXRocm93IGJhKFwiaXNlY2RvbVwiLGIpO2lmKGE9PT1PYmplY3QpdGhyb3cgYmEoXCJpc2Vjb2JqXCIsYik7fXJldHVybiBhfWZ1bmN0aW9uIGtkKGEsYil7aWYoYSl7aWYoYS5jb25zdHJ1Y3Rvcj09PWEpdGhyb3cgYmEoXCJpc2VjZm5cIixiKTtpZihhPT09V2Z8fGE9PT1YZnx8YT09PVlmKXRocm93IGJhKFwiaXNlY2ZmXCIsYik7fX1mdW5jdGlvbiBsZChhLGIpe2lmKGEmJihhPT09KDApLmNvbnN0cnVjdG9yfHxhPT09XG4oITEpLmNvbnN0cnVjdG9yfHxhPT09XCJcIi5jb25zdHJ1Y3Rvcnx8YT09PXt9LmNvbnN0cnVjdG9yfHxhPT09W10uY29uc3RydWN0b3J8fGE9PT1GdW5jdGlvbi5jb25zdHJ1Y3RvcikpdGhyb3cgYmEoXCJpc2VjYWZcIixiKTt9ZnVuY3Rpb24gWmYoYSxiKXtyZXR1cm5cInVuZGVmaW5lZFwiIT09dHlwZW9mIGE/YTpifWZ1bmN0aW9uIG1kKGEsYil7cmV0dXJuXCJ1bmRlZmluZWRcIj09PXR5cGVvZiBhP2I6XCJ1bmRlZmluZWRcIj09PXR5cGVvZiBiP2E6YStifWZ1bmN0aW9uIFcoYSxiKXt2YXIgZCxjO3N3aXRjaChhLnR5cGUpe2Nhc2Ugcy5Qcm9ncmFtOmQ9ITA7bihhLmJvZHksZnVuY3Rpb24oYSl7VyhhLmV4cHJlc3Npb24sYik7ZD1kJiZhLmV4cHJlc3Npb24uY29uc3RhbnR9KTthLmNvbnN0YW50PWQ7YnJlYWs7Y2FzZSBzLkxpdGVyYWw6YS5jb25zdGFudD0hMDthLnRvV2F0Y2g9W107YnJlYWs7Y2FzZSBzLlVuYXJ5RXhwcmVzc2lvbjpXKGEuYXJndW1lbnQsYik7YS5jb25zdGFudD1hLmFyZ3VtZW50LmNvbnN0YW50O1xuYS50b1dhdGNoPWEuYXJndW1lbnQudG9XYXRjaDticmVhaztjYXNlIHMuQmluYXJ5RXhwcmVzc2lvbjpXKGEubGVmdCxiKTtXKGEucmlnaHQsYik7YS5jb25zdGFudD1hLmxlZnQuY29uc3RhbnQmJmEucmlnaHQuY29uc3RhbnQ7YS50b1dhdGNoPWEubGVmdC50b1dhdGNoLmNvbmNhdChhLnJpZ2h0LnRvV2F0Y2gpO2JyZWFrO2Nhc2Ugcy5Mb2dpY2FsRXhwcmVzc2lvbjpXKGEubGVmdCxiKTtXKGEucmlnaHQsYik7YS5jb25zdGFudD1hLmxlZnQuY29uc3RhbnQmJmEucmlnaHQuY29uc3RhbnQ7YS50b1dhdGNoPWEuY29uc3RhbnQ/W106W2FdO2JyZWFrO2Nhc2Ugcy5Db25kaXRpb25hbEV4cHJlc3Npb246VyhhLnRlc3QsYik7VyhhLmFsdGVybmF0ZSxiKTtXKGEuY29uc2VxdWVudCxiKTthLmNvbnN0YW50PWEudGVzdC5jb25zdGFudCYmYS5hbHRlcm5hdGUuY29uc3RhbnQmJmEuY29uc2VxdWVudC5jb25zdGFudDthLnRvV2F0Y2g9YS5jb25zdGFudD9bXTpbYV07YnJlYWs7Y2FzZSBzLklkZW50aWZpZXI6YS5jb25zdGFudD1cbiExO2EudG9XYXRjaD1bYV07YnJlYWs7Y2FzZSBzLk1lbWJlckV4cHJlc3Npb246VyhhLm9iamVjdCxiKTthLmNvbXB1dGVkJiZXKGEucHJvcGVydHksYik7YS5jb25zdGFudD1hLm9iamVjdC5jb25zdGFudCYmKCFhLmNvbXB1dGVkfHxhLnByb3BlcnR5LmNvbnN0YW50KTthLnRvV2F0Y2g9W2FdO2JyZWFrO2Nhc2Ugcy5DYWxsRXhwcmVzc2lvbjpkPWEuZmlsdGVyPyFiKGEuY2FsbGVlLm5hbWUpLiRzdGF0ZWZ1bDohMTtjPVtdO24oYS5hcmd1bWVudHMsZnVuY3Rpb24oYSl7VyhhLGIpO2Q9ZCYmYS5jb25zdGFudDthLmNvbnN0YW50fHxjLnB1c2guYXBwbHkoYyxhLnRvV2F0Y2gpfSk7YS5jb25zdGFudD1kO2EudG9XYXRjaD1hLmZpbHRlciYmIWIoYS5jYWxsZWUubmFtZSkuJHN0YXRlZnVsP2M6W2FdO2JyZWFrO2Nhc2Ugcy5Bc3NpZ25tZW50RXhwcmVzc2lvbjpXKGEubGVmdCxiKTtXKGEucmlnaHQsYik7YS5jb25zdGFudD1hLmxlZnQuY29uc3RhbnQmJmEucmlnaHQuY29uc3RhbnQ7XG5hLnRvV2F0Y2g9W2FdO2JyZWFrO2Nhc2Ugcy5BcnJheUV4cHJlc3Npb246ZD0hMDtjPVtdO24oYS5lbGVtZW50cyxmdW5jdGlvbihhKXtXKGEsYik7ZD1kJiZhLmNvbnN0YW50O2EuY29uc3RhbnR8fGMucHVzaC5hcHBseShjLGEudG9XYXRjaCl9KTthLmNvbnN0YW50PWQ7YS50b1dhdGNoPWM7YnJlYWs7Y2FzZSBzLk9iamVjdEV4cHJlc3Npb246ZD0hMDtjPVtdO24oYS5wcm9wZXJ0aWVzLGZ1bmN0aW9uKGEpe1coYS52YWx1ZSxiKTtkPWQmJmEudmFsdWUuY29uc3RhbnQ7YS52YWx1ZS5jb25zdGFudHx8Yy5wdXNoLmFwcGx5KGMsYS52YWx1ZS50b1dhdGNoKX0pO2EuY29uc3RhbnQ9ZDthLnRvV2F0Y2g9YzticmVhaztjYXNlIHMuVGhpc0V4cHJlc3Npb246YS5jb25zdGFudD0hMSxhLnRvV2F0Y2g9W119fWZ1bmN0aW9uIG5kKGEpe2lmKDE9PWEubGVuZ3RoKXthPWFbMF0uZXhwcmVzc2lvbjt2YXIgYj1hLnRvV2F0Y2g7cmV0dXJuIDEhPT1iLmxlbmd0aD9iOmJbMF0hPT1hP2I6dX19XG5mdW5jdGlvbiBvZChhKXtyZXR1cm4gYS50eXBlPT09cy5JZGVudGlmaWVyfHxhLnR5cGU9PT1zLk1lbWJlckV4cHJlc3Npb259ZnVuY3Rpb24gcGQoYSl7aWYoMT09PWEuYm9keS5sZW5ndGgmJm9kKGEuYm9keVswXS5leHByZXNzaW9uKSlyZXR1cm57dHlwZTpzLkFzc2lnbm1lbnRFeHByZXNzaW9uLGxlZnQ6YS5ib2R5WzBdLmV4cHJlc3Npb24scmlnaHQ6e3R5cGU6cy5OR1ZhbHVlUGFyYW1ldGVyfSxvcGVyYXRvcjpcIj1cIn19ZnVuY3Rpb24gcWQoYSl7cmV0dXJuIDA9PT1hLmJvZHkubGVuZ3RofHwxPT09YS5ib2R5Lmxlbmd0aCYmKGEuYm9keVswXS5leHByZXNzaW9uLnR5cGU9PT1zLkxpdGVyYWx8fGEuYm9keVswXS5leHByZXNzaW9uLnR5cGU9PT1zLkFycmF5RXhwcmVzc2lvbnx8YS5ib2R5WzBdLmV4cHJlc3Npb24udHlwZT09PXMuT2JqZWN0RXhwcmVzc2lvbil9ZnVuY3Rpb24gcmQoYSxiKXt0aGlzLmFzdEJ1aWxkZXI9YTt0aGlzLiRmaWx0ZXI9Yn1mdW5jdGlvbiBzZChhLFxuYil7dGhpcy5hc3RCdWlsZGVyPWE7dGhpcy4kZmlsdGVyPWJ9ZnVuY3Rpb24gRmIoYSl7cmV0dXJuXCJjb25zdHJ1Y3RvclwiPT1hfWZ1bmN0aW9uIGVjKGEpe3JldHVybiB6KGEudmFsdWVPZik/YS52YWx1ZU9mKCk6JGYuY2FsbChhKX1mdW5jdGlvbiBrZigpe3ZhciBhPSQoKSxiPSQoKTt0aGlzLiRnZXQ9W1wiJGZpbHRlclwiLGZ1bmN0aW9uKGQpe2Z1bmN0aW9uIGMoYSxiKXtyZXR1cm4gbnVsbD09YXx8bnVsbD09Yj9hPT09YjpcIm9iamVjdFwiPT09dHlwZW9mIGEmJihhPWVjKGEpLFwib2JqZWN0XCI9PT10eXBlb2YgYSk/ITE6YT09PWJ8fGEhPT1hJiZiIT09Yn1mdW5jdGlvbiBlKGEsYixkLGUsZil7dmFyIGc9ZS5pbnB1dHMsaDtpZigxPT09Zy5sZW5ndGgpe3ZhciBrPWMsZz1nWzBdO3JldHVybiBhLiR3YXRjaChmdW5jdGlvbihhKXt2YXIgYj1nKGEpO2MoYixrKXx8KGg9ZShhLHUsdSxbYl0pLGs9YiYmZWMoYikpO3JldHVybiBofSxiLGQsZil9Zm9yKHZhciBsPVtdLG09W10scj0wLG49XG5nLmxlbmd0aDtyPG47cisrKWxbcl09YyxtW3JdPW51bGw7cmV0dXJuIGEuJHdhdGNoKGZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0hMSxkPTAsZj1nLmxlbmd0aDtkPGY7ZCsrKXt2YXIgaz1nW2RdKGEpO2lmKGJ8fChiPSFjKGssbFtkXSkpKW1bZF09ayxsW2RdPWsmJmVjKGspfWImJihoPWUoYSx1LHUsbSkpO3JldHVybiBofSxiLGQsZil9ZnVuY3Rpb24gZihhLGIsYyxkKXt2YXIgZSxmO3JldHVybiBlPWEuJHdhdGNoKGZ1bmN0aW9uKGEpe3JldHVybiBkKGEpfSxmdW5jdGlvbihhLGMsZCl7Zj1hO3ooYikmJmIuYXBwbHkodGhpcyxhcmd1bWVudHMpO3koYSkmJmQuJCRwb3N0RGlnZXN0KGZ1bmN0aW9uKCl7eShmKSYmZSgpfSl9LGMpfWZ1bmN0aW9uIGcoYSxiLGMsZCl7ZnVuY3Rpb24gZShhKXt2YXIgYj0hMDtuKGEsZnVuY3Rpb24oYSl7eShhKXx8KGI9ITEpfSk7cmV0dXJuIGJ9dmFyIGYsZztyZXR1cm4gZj1hLiR3YXRjaChmdW5jdGlvbihhKXtyZXR1cm4gZChhKX0sZnVuY3Rpb24oYSxcbmMsZCl7Zz1hO3ooYikmJmIuY2FsbCh0aGlzLGEsYyxkKTtlKGEpJiZkLiQkcG9zdERpZ2VzdChmdW5jdGlvbigpe2UoZykmJmYoKX0pfSxjKX1mdW5jdGlvbiBoKGEsYixjLGQpe3ZhciBlO3JldHVybiBlPWEuJHdhdGNoKGZ1bmN0aW9uKGEpe3JldHVybiBkKGEpfSxmdW5jdGlvbihhLGMsZCl7eihiKSYmYi5hcHBseSh0aGlzLGFyZ3VtZW50cyk7ZSgpfSxjKX1mdW5jdGlvbiBrKGEsYil7aWYoIWIpcmV0dXJuIGE7dmFyIGM9YS4kJHdhdGNoRGVsZWdhdGUsZD0hMSxjPWMhPT1nJiZjIT09Zj9mdW5jdGlvbihjLGUsZixnKXtmPWQmJmc/Z1swXTphKGMsZSxmLGcpO3JldHVybiBiKGYsYyxlKX06ZnVuY3Rpb24oYyxkLGUsZil7ZT1hKGMsZCxlLGYpO2M9YihlLGMsZCk7cmV0dXJuIHkoZSk/YzplfTthLiQkd2F0Y2hEZWxlZ2F0ZSYmYS4kJHdhdGNoRGVsZWdhdGUhPT1lP2MuJCR3YXRjaERlbGVnYXRlPWEuJCR3YXRjaERlbGVnYXRlOmIuJHN0YXRlZnVsfHwoYy4kJHdhdGNoRGVsZWdhdGU9XG5lLGQ9IWEuaW5wdXRzLGMuaW5wdXRzPWEuaW5wdXRzP2EuaW5wdXRzOlthXSk7cmV0dXJuIGN9dmFyIGw9QmEoKS5ub1Vuc2FmZUV2YWwsbT17Y3NwOmwsZXhwZW5zaXZlQ2hlY2tzOiExfSxyPXtjc3A6bCxleHBlbnNpdmVDaGVja3M6ITB9O3JldHVybiBmdW5jdGlvbihjLGwsdil7dmFyIG4scCxxO3N3aXRjaCh0eXBlb2YgYyl7Y2FzZSBcInN0cmluZ1wiOnE9Yz1jLnRyaW0oKTt2YXIgdz12P2I6YTtuPXdbcV07bnx8KFwiOlwiPT09Yy5jaGFyQXQoMCkmJlwiOlwiPT09Yy5jaGFyQXQoMSkmJihwPSEwLGM9Yy5zdWJzdHJpbmcoMikpLHY9dj9yOm0sbj1uZXcgZmModiksbj0obmV3IGdjKG4sZCx2KSkucGFyc2UoYyksbi5jb25zdGFudD9uLiQkd2F0Y2hEZWxlZ2F0ZT1oOnA/bi4kJHdhdGNoRGVsZWdhdGU9bi5saXRlcmFsP2c6ZjpuLmlucHV0cyYmKG4uJCR3YXRjaERlbGVnYXRlPWUpLHdbcV09bik7cmV0dXJuIGsobixsKTtjYXNlIFwiZnVuY3Rpb25cIjpyZXR1cm4gayhjLGwpO2RlZmF1bHQ6cmV0dXJuIHh9fX1dfVxuZnVuY3Rpb24gbWYoKXt0aGlzLiRnZXQ9W1wiJHJvb3RTY29wZVwiLFwiJGV4Y2VwdGlvbkhhbmRsZXJcIixmdW5jdGlvbihhLGIpe3JldHVybiB0ZChmdW5jdGlvbihiKXthLiRldmFsQXN5bmMoYil9LGIpfV19ZnVuY3Rpb24gbmYoKXt0aGlzLiRnZXQ9W1wiJGJyb3dzZXJcIixcIiRleGNlcHRpb25IYW5kbGVyXCIsZnVuY3Rpb24oYSxiKXtyZXR1cm4gdGQoZnVuY3Rpb24oYil7YS5kZWZlcihiKX0sYil9XX1mdW5jdGlvbiB0ZChhLGIpe2Z1bmN0aW9uIGQoYSxiLGMpe2Z1bmN0aW9uIGQoYil7cmV0dXJuIGZ1bmN0aW9uKGMpe2V8fChlPSEwLGIuY2FsbChhLGMpKX19dmFyIGU9ITE7cmV0dXJuW2QoYiksZChjKV19ZnVuY3Rpb24gYygpe3RoaXMuJCRzdGF0ZT17c3RhdHVzOjB9fWZ1bmN0aW9uIGUoYSxiKXtyZXR1cm4gZnVuY3Rpb24oYyl7Yi5jYWxsKGEsYyl9fWZ1bmN0aW9uIGYoYyl7IWMucHJvY2Vzc1NjaGVkdWxlZCYmYy5wZW5kaW5nJiYoYy5wcm9jZXNzU2NoZWR1bGVkPSEwLGEoZnVuY3Rpb24oKXt2YXIgYSxcbmQsZTtlPWMucGVuZGluZztjLnByb2Nlc3NTY2hlZHVsZWQ9ITE7Yy5wZW5kaW5nPXU7Zm9yKHZhciBmPTAsZz1lLmxlbmd0aDtmPGc7KytmKXtkPWVbZl1bMF07YT1lW2ZdW2Muc3RhdHVzXTt0cnl7eihhKT9kLnJlc29sdmUoYShjLnZhbHVlKSk6MT09PWMuc3RhdHVzP2QucmVzb2x2ZShjLnZhbHVlKTpkLnJlamVjdChjLnZhbHVlKX1jYXRjaChoKXtkLnJlamVjdChoKSxiKGgpfX19KSl9ZnVuY3Rpb24gZygpe3RoaXMucHJvbWlzZT1uZXcgYzt0aGlzLnJlc29sdmU9ZSh0aGlzLHRoaXMucmVzb2x2ZSk7dGhpcy5yZWplY3Q9ZSh0aGlzLHRoaXMucmVqZWN0KTt0aGlzLm5vdGlmeT1lKHRoaXMsdGhpcy5ub3RpZnkpfXZhciBoPUcoXCIkcVwiLFR5cGVFcnJvcik7TShjLnByb3RvdHlwZSx7dGhlbjpmdW5jdGlvbihhLGIsYyl7aWYocShhKSYmcShiKSYmcShjKSlyZXR1cm4gdGhpczt2YXIgZD1uZXcgZzt0aGlzLiQkc3RhdGUucGVuZGluZz10aGlzLiQkc3RhdGUucGVuZGluZ3x8W107XG50aGlzLiQkc3RhdGUucGVuZGluZy5wdXNoKFtkLGEsYixjXSk7MDx0aGlzLiQkc3RhdGUuc3RhdHVzJiZmKHRoaXMuJCRzdGF0ZSk7cmV0dXJuIGQucHJvbWlzZX0sXCJjYXRjaFwiOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLnRoZW4obnVsbCxhKX0sXCJmaW5hbGx5XCI6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gdGhpcy50aGVuKGZ1bmN0aW9uKGIpe3JldHVybiBsKGIsITAsYSl9LGZ1bmN0aW9uKGIpe3JldHVybiBsKGIsITEsYSl9LGIpfX0pO00oZy5wcm90b3R5cGUse3Jlc29sdmU6ZnVuY3Rpb24oYSl7dGhpcy5wcm9taXNlLiQkc3RhdGUuc3RhdHVzfHwoYT09PXRoaXMucHJvbWlzZT90aGlzLiQkcmVqZWN0KGgoXCJxY3ljbGVcIixhKSk6dGhpcy4kJHJlc29sdmUoYSkpfSwkJHJlc29sdmU6ZnVuY3Rpb24oYSl7dmFyIGMsZTtlPWQodGhpcyx0aGlzLiQkcmVzb2x2ZSx0aGlzLiQkcmVqZWN0KTt0cnl7aWYoSChhKXx8eihhKSljPWEmJmEudGhlbjt6KGMpPyh0aGlzLnByb21pc2UuJCRzdGF0ZS5zdGF0dXM9XG4tMSxjLmNhbGwoYSxlWzBdLGVbMV0sdGhpcy5ub3RpZnkpKToodGhpcy5wcm9taXNlLiQkc3RhdGUudmFsdWU9YSx0aGlzLnByb21pc2UuJCRzdGF0ZS5zdGF0dXM9MSxmKHRoaXMucHJvbWlzZS4kJHN0YXRlKSl9Y2F0Y2goZyl7ZVsxXShnKSxiKGcpfX0scmVqZWN0OmZ1bmN0aW9uKGEpe3RoaXMucHJvbWlzZS4kJHN0YXRlLnN0YXR1c3x8dGhpcy4kJHJlamVjdChhKX0sJCRyZWplY3Q6ZnVuY3Rpb24oYSl7dGhpcy5wcm9taXNlLiQkc3RhdGUudmFsdWU9YTt0aGlzLnByb21pc2UuJCRzdGF0ZS5zdGF0dXM9MjtmKHRoaXMucHJvbWlzZS4kJHN0YXRlKX0sbm90aWZ5OmZ1bmN0aW9uKGMpe3ZhciBkPXRoaXMucHJvbWlzZS4kJHN0YXRlLnBlbmRpbmc7MD49dGhpcy5wcm9taXNlLiQkc3RhdGUuc3RhdHVzJiZkJiZkLmxlbmd0aCYmYShmdW5jdGlvbigpe2Zvcih2YXIgYSxlLGY9MCxnPWQubGVuZ3RoO2Y8ZztmKyspe2U9ZFtmXVswXTthPWRbZl1bM107dHJ5e2Uubm90aWZ5KHooYSk/XG5hKGMpOmMpfWNhdGNoKGgpe2IoaCl9fX0pfX0pO3ZhciBrPWZ1bmN0aW9uKGEsYil7dmFyIGM9bmV3IGc7Yj9jLnJlc29sdmUoYSk6Yy5yZWplY3QoYSk7cmV0dXJuIGMucHJvbWlzZX0sbD1mdW5jdGlvbihhLGIsYyl7dmFyIGQ9bnVsbDt0cnl7eihjKSYmKGQ9YygpKX1jYXRjaChlKXtyZXR1cm4gayhlLCExKX1yZXR1cm4gZCYmeihkLnRoZW4pP2QudGhlbihmdW5jdGlvbigpe3JldHVybiBrKGEsYil9LGZ1bmN0aW9uKGEpe3JldHVybiBrKGEsITEpfSk6ayhhLGIpfSxtPWZ1bmN0aW9uKGEsYixjLGQpe3ZhciBlPW5ldyBnO2UucmVzb2x2ZShhKTtyZXR1cm4gZS5wcm9taXNlLnRoZW4oYixjLGQpfSxyPWZ1bmN0aW9uIEEoYSl7aWYoIXooYSkpdGhyb3cgaChcIm5vcnNsdnJcIixhKTtpZighKHRoaXMgaW5zdGFuY2VvZiBBKSlyZXR1cm4gbmV3IEEoYSk7dmFyIGI9bmV3IGc7YShmdW5jdGlvbihhKXtiLnJlc29sdmUoYSl9LGZ1bmN0aW9uKGEpe2IucmVqZWN0KGEpfSk7cmV0dXJuIGIucHJvbWlzZX07XG5yLmRlZmVyPWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBnfTtyLnJlamVjdD1mdW5jdGlvbihhKXt2YXIgYj1uZXcgZztiLnJlamVjdChhKTtyZXR1cm4gYi5wcm9taXNlfTtyLndoZW49bTtyLnJlc29sdmU9bTtyLmFsbD1mdW5jdGlvbihhKXt2YXIgYj1uZXcgZyxjPTAsZD1JKGEpP1tdOnt9O24oYSxmdW5jdGlvbihhLGUpe2MrKzttKGEpLnRoZW4oZnVuY3Rpb24oYSl7ZC5oYXNPd25Qcm9wZXJ0eShlKXx8KGRbZV09YSwtLWN8fGIucmVzb2x2ZShkKSl9LGZ1bmN0aW9uKGEpe2QuaGFzT3duUHJvcGVydHkoZSl8fGIucmVqZWN0KGEpfSl9KTswPT09YyYmYi5yZXNvbHZlKGQpO3JldHVybiBiLnByb21pc2V9O3JldHVybiByfWZ1bmN0aW9uIHdmKCl7dGhpcy4kZ2V0PVtcIiR3aW5kb3dcIixcIiR0aW1lb3V0XCIsZnVuY3Rpb24oYSxiKXt2YXIgZD1hLnJlcXVlc3RBbmltYXRpb25GcmFtZXx8YS53ZWJraXRSZXF1ZXN0QW5pbWF0aW9uRnJhbWUsYz1hLmNhbmNlbEFuaW1hdGlvbkZyYW1lfHxhLndlYmtpdENhbmNlbEFuaW1hdGlvbkZyYW1lfHxcbmEud2Via2l0Q2FuY2VsUmVxdWVzdEFuaW1hdGlvbkZyYW1lLGU9ISFkLGY9ZT9mdW5jdGlvbihhKXt2YXIgYj1kKGEpO3JldHVybiBmdW5jdGlvbigpe2MoYil9fTpmdW5jdGlvbihhKXt2YXIgYz1iKGEsMTYuNjYsITEpO3JldHVybiBmdW5jdGlvbigpe2IuY2FuY2VsKGMpfX07Zi5zdXBwb3J0ZWQ9ZTtyZXR1cm4gZn1dfWZ1bmN0aW9uIGxmKCl7ZnVuY3Rpb24gYShhKXtmdW5jdGlvbiBiKCl7dGhpcy4kJHdhdGNoZXJzPXRoaXMuJCRuZXh0U2libGluZz10aGlzLiQkY2hpbGRIZWFkPXRoaXMuJCRjaGlsZFRhaWw9bnVsbDt0aGlzLiQkbGlzdGVuZXJzPXt9O3RoaXMuJCRsaXN0ZW5lckNvdW50PXt9O3RoaXMuJCR3YXRjaGVyc0NvdW50PTA7dGhpcy4kaWQ9KytuYjt0aGlzLiQkQ2hpbGRTY29wZT1udWxsfWIucHJvdG90eXBlPWE7cmV0dXJuIGJ9dmFyIGI9MTAsZD1HKFwiJHJvb3RTY29wZVwiKSxjPW51bGwsZT1udWxsO3RoaXMuZGlnZXN0VHRsPWZ1bmN0aW9uKGEpe2FyZ3VtZW50cy5sZW5ndGgmJlxuKGI9YSk7cmV0dXJuIGJ9O3RoaXMuJGdldD1bXCIkaW5qZWN0b3JcIixcIiRleGNlcHRpb25IYW5kbGVyXCIsXCIkcGFyc2VcIixcIiRicm93c2VyXCIsZnVuY3Rpb24oZixnLGgsayl7ZnVuY3Rpb24gbChhKXthLmN1cnJlbnRTY29wZS4kJGRlc3Ryb3llZD0hMH1mdW5jdGlvbiBtKGEpezk9PT1IYSYmKGEuJCRjaGlsZEhlYWQmJm0oYS4kJGNoaWxkSGVhZCksYS4kJG5leHRTaWJsaW5nJiZtKGEuJCRuZXh0U2libGluZykpO2EuJHBhcmVudD1hLiQkbmV4dFNpYmxpbmc9YS4kJHByZXZTaWJsaW5nPWEuJCRjaGlsZEhlYWQ9YS4kJGNoaWxkVGFpbD1hLiRyb290PWEuJCR3YXRjaGVycz1udWxsfWZ1bmN0aW9uIHIoKXt0aGlzLiRpZD0rK25iO3RoaXMuJCRwaGFzZT10aGlzLiRwYXJlbnQ9dGhpcy4kJHdhdGNoZXJzPXRoaXMuJCRuZXh0U2libGluZz10aGlzLiQkcHJldlNpYmxpbmc9dGhpcy4kJGNoaWxkSGVhZD10aGlzLiQkY2hpbGRUYWlsPW51bGw7dGhpcy4kcm9vdD10aGlzO3RoaXMuJCRkZXN0cm95ZWQ9XG4hMTt0aGlzLiQkbGlzdGVuZXJzPXt9O3RoaXMuJCRsaXN0ZW5lckNvdW50PXt9O3RoaXMuJCR3YXRjaGVyc0NvdW50PTA7dGhpcy4kJGlzb2xhdGVCaW5kaW5ncz1udWxsfWZ1bmN0aW9uIHQoYSl7aWYody4kJHBoYXNlKXRocm93IGQoXCJpbnByb2dcIix3LiQkcGhhc2UpO3cuJCRwaGFzZT1hfWZ1bmN0aW9uIEEoYSxiKXtkbyBhLiQkd2F0Y2hlcnNDb3VudCs9Yjt3aGlsZShhPWEuJHBhcmVudCl9ZnVuY3Rpb24gdihhLGIsYyl7ZG8gYS4kJGxpc3RlbmVyQ291bnRbY10tPWIsMD09PWEuJCRsaXN0ZW5lckNvdW50W2NdJiZkZWxldGUgYS4kJGxpc3RlbmVyQ291bnRbY107d2hpbGUoYT1hLiRwYXJlbnQpfWZ1bmN0aW9uIHMoKXt9ZnVuY3Rpb24gcCgpe2Zvcig7YWEubGVuZ3RoOyl0cnl7YWEuc2hpZnQoKSgpfWNhdGNoKGEpe2coYSl9ZT1udWxsfWZ1bmN0aW9uIEMoKXtudWxsPT09ZSYmKGU9ay5kZWZlcihmdW5jdGlvbigpe3cuJGFwcGx5KHApfSkpfXIucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpyLFxuJG5ldzpmdW5jdGlvbihiLGMpe3ZhciBkO2M9Y3x8dGhpcztiPyhkPW5ldyByLGQuJHJvb3Q9dGhpcy4kcm9vdCk6KHRoaXMuJCRDaGlsZFNjb3BlfHwodGhpcy4kJENoaWxkU2NvcGU9YSh0aGlzKSksZD1uZXcgdGhpcy4kJENoaWxkU2NvcGUpO2QuJHBhcmVudD1jO2QuJCRwcmV2U2libGluZz1jLiQkY2hpbGRUYWlsO2MuJCRjaGlsZEhlYWQ/KGMuJCRjaGlsZFRhaWwuJCRuZXh0U2libGluZz1kLGMuJCRjaGlsZFRhaWw9ZCk6Yy4kJGNoaWxkSGVhZD1jLiQkY2hpbGRUYWlsPWQ7KGJ8fGMhPXRoaXMpJiZkLiRvbihcIiRkZXN0cm95XCIsbCk7cmV0dXJuIGR9LCR3YXRjaDpmdW5jdGlvbihhLGIsZCxlKXt2YXIgZj1oKGEpO2lmKGYuJCR3YXRjaERlbGVnYXRlKXJldHVybiBmLiQkd2F0Y2hEZWxlZ2F0ZSh0aGlzLGIsZCxmLGEpO3ZhciBnPXRoaXMsaz1nLiQkd2F0Y2hlcnMsbD17Zm46YixsYXN0OnMsZ2V0OmYsZXhwOmV8fGEsZXE6ISFkfTtjPW51bGw7eihiKXx8KGwuZm49eCk7a3x8XG4oaz1nLiQkd2F0Y2hlcnM9W10pO2sudW5zaGlmdChsKTtBKHRoaXMsMSk7cmV0dXJuIGZ1bmN0aW9uKCl7MDw9YWIoayxsKSYmQShnLC0xKTtjPW51bGx9fSwkd2F0Y2hHcm91cDpmdW5jdGlvbihhLGIpe2Z1bmN0aW9uIGMoKXtoPSExO2s/KGs9ITEsYihlLGUsZykpOmIoZSxkLGcpfXZhciBkPUFycmF5KGEubGVuZ3RoKSxlPUFycmF5KGEubGVuZ3RoKSxmPVtdLGc9dGhpcyxoPSExLGs9ITA7aWYoIWEubGVuZ3RoKXt2YXIgbD0hMDtnLiRldmFsQXN5bmMoZnVuY3Rpb24oKXtsJiZiKGUsZSxnKX0pO3JldHVybiBmdW5jdGlvbigpe2w9ITF9fWlmKDE9PT1hLmxlbmd0aClyZXR1cm4gdGhpcy4kd2F0Y2goYVswXSxmdW5jdGlvbihhLGMsZil7ZVswXT1hO2RbMF09YztiKGUsYT09PWM/ZTpkLGYpfSk7bihhLGZ1bmN0aW9uKGEsYil7dmFyIGs9Zy4kd2F0Y2goYSxmdW5jdGlvbihhLGYpe2VbYl09YTtkW2JdPWY7aHx8KGg9ITAsZy4kZXZhbEFzeW5jKGMpKX0pO2YucHVzaChrKX0pO3JldHVybiBmdW5jdGlvbigpe2Zvcig7Zi5sZW5ndGg7KWYuc2hpZnQoKSgpfX0sXG4kd2F0Y2hDb2xsZWN0aW9uOmZ1bmN0aW9uKGEsYil7ZnVuY3Rpb24gYyhhKXtlPWE7dmFyIGIsZCxnLGg7aWYoIXEoZSkpe2lmKEgoZSkpaWYoemEoZSkpZm9yKGYhPT1yJiYoZj1yLG49Zi5sZW5ndGg9MCxsKyspLGE9ZS5sZW5ndGgsbiE9PWEmJihsKyssZi5sZW5ndGg9bj1hKSxiPTA7YjxhO2IrKyloPWZbYl0sZz1lW2JdLGQ9aCE9PWgmJmchPT1nLGR8fGg9PT1nfHwobCsrLGZbYl09Zyk7ZWxzZXtmIT09dCYmKGY9dD17fSxuPTAsbCsrKTthPTA7Zm9yKGIgaW4gZSlxYS5jYWxsKGUsYikmJihhKyssZz1lW2JdLGg9ZltiXSxiIGluIGY/KGQ9aCE9PWgmJmchPT1nLGR8fGg9PT1nfHwobCsrLGZbYl09ZykpOihuKyssZltiXT1nLGwrKykpO2lmKG4+YSlmb3IoYiBpbiBsKyssZilxYS5jYWxsKGUsYil8fChuLS0sZGVsZXRlIGZbYl0pfWVsc2UgZiE9PWUmJihmPWUsbCsrKTtyZXR1cm4gbH19Yy4kc3RhdGVmdWw9ITA7dmFyIGQ9dGhpcyxlLGYsZyxrPTE8Yi5sZW5ndGgsbD0wLG09XG5oKGEsYykscj1bXSx0PXt9LHA9ITAsbj0wO3JldHVybiB0aGlzLiR3YXRjaChtLGZ1bmN0aW9uKCl7cD8ocD0hMSxiKGUsZSxkKSk6YihlLGcsZCk7aWYoaylpZihIKGUpKWlmKHphKGUpKXtnPUFycmF5KGUubGVuZ3RoKTtmb3IodmFyIGE9MDthPGUubGVuZ3RoO2ErKylnW2FdPWVbYV19ZWxzZSBmb3IoYSBpbiBnPXt9LGUpcWEuY2FsbChlLGEpJiYoZ1thXT1lW2FdKTtlbHNlIGc9ZX0pfSwkZGlnZXN0OmZ1bmN0aW9uKCl7dmFyIGEsZixoLGwsbSxyLG49YixBLHE9W10sdixDO3QoXCIkZGlnZXN0XCIpO2suJCRjaGVja1VybENoYW5nZSgpO3RoaXM9PT13JiZudWxsIT09ZSYmKGsuZGVmZXIuY2FuY2VsKGUpLHAoKSk7Yz1udWxsO2Rve3I9ITE7Zm9yKEE9dGhpczt1Lmxlbmd0aDspe3RyeXtDPXUuc2hpZnQoKSxDLnNjb3BlLiRldmFsKEMuZXhwcmVzc2lvbixDLmxvY2Fscyl9Y2F0Y2goYWEpe2coYWEpfWM9bnVsbH1hOmRve2lmKGw9QS4kJHdhdGNoZXJzKWZvcihtPWwubGVuZ3RoO20tLTspdHJ5e2lmKGE9XG5sW21dKWlmKChmPWEuZ2V0KEEpKSE9PShoPWEubGFzdCkmJiEoYS5lcT9tYShmLGgpOlwibnVtYmVyXCI9PT10eXBlb2YgZiYmXCJudW1iZXJcIj09PXR5cGVvZiBoJiZpc05hTihmKSYmaXNOYU4oaCkpKXI9ITAsYz1hLGEubGFzdD1hLmVxP2JiKGYsbnVsbCk6ZixhLmZuKGYsaD09PXM/ZjpoLEEpLDU+biYmKHY9NC1uLHFbdl18fChxW3ZdPVtdKSxxW3ZdLnB1c2goe21zZzp6KGEuZXhwKT9cImZuOiBcIisoYS5leHAubmFtZXx8YS5leHAudG9TdHJpbmcoKSk6YS5leHAsbmV3VmFsOmYsb2xkVmFsOmh9KSk7ZWxzZSBpZihhPT09Yyl7cj0hMTticmVhayBhfX1jYXRjaCh5KXtnKHkpfWlmKCEobD1BLiQkd2F0Y2hlcnNDb3VudCYmQS4kJGNoaWxkSGVhZHx8QSE9PXRoaXMmJkEuJCRuZXh0U2libGluZykpZm9yKDtBIT09dGhpcyYmIShsPUEuJCRuZXh0U2libGluZyk7KUE9QS4kcGFyZW50fXdoaWxlKEE9bCk7aWYoKHJ8fHUubGVuZ3RoKSYmIW4tLSl0aHJvdyB3LiQkcGhhc2U9bnVsbCxkKFwiaW5mZGlnXCIsXG5iLHEpO313aGlsZShyfHx1Lmxlbmd0aCk7Zm9yKHcuJCRwaGFzZT1udWxsO0wubGVuZ3RoOyl0cnl7TC5zaGlmdCgpKCl9Y2F0Y2goeCl7Zyh4KX19LCRkZXN0cm95OmZ1bmN0aW9uKCl7aWYoIXRoaXMuJCRkZXN0cm95ZWQpe3ZhciBhPXRoaXMuJHBhcmVudDt0aGlzLiRicm9hZGNhc3QoXCIkZGVzdHJveVwiKTt0aGlzLiQkZGVzdHJveWVkPSEwO3RoaXM9PT13JiZrLiQkYXBwbGljYXRpb25EZXN0cm95ZWQoKTtBKHRoaXMsLXRoaXMuJCR3YXRjaGVyc0NvdW50KTtmb3IodmFyIGIgaW4gdGhpcy4kJGxpc3RlbmVyQ291bnQpdih0aGlzLHRoaXMuJCRsaXN0ZW5lckNvdW50W2JdLGIpO2EmJmEuJCRjaGlsZEhlYWQ9PXRoaXMmJihhLiQkY2hpbGRIZWFkPXRoaXMuJCRuZXh0U2libGluZyk7YSYmYS4kJGNoaWxkVGFpbD09dGhpcyYmKGEuJCRjaGlsZFRhaWw9dGhpcy4kJHByZXZTaWJsaW5nKTt0aGlzLiQkcHJldlNpYmxpbmcmJih0aGlzLiQkcHJldlNpYmxpbmcuJCRuZXh0U2libGluZz1cbnRoaXMuJCRuZXh0U2libGluZyk7dGhpcy4kJG5leHRTaWJsaW5nJiYodGhpcy4kJG5leHRTaWJsaW5nLiQkcHJldlNpYmxpbmc9dGhpcy4kJHByZXZTaWJsaW5nKTt0aGlzLiRkZXN0cm95PXRoaXMuJGRpZ2VzdD10aGlzLiRhcHBseT10aGlzLiRldmFsQXN5bmM9dGhpcy4kYXBwbHlBc3luYz14O3RoaXMuJG9uPXRoaXMuJHdhdGNoPXRoaXMuJHdhdGNoR3JvdXA9ZnVuY3Rpb24oKXtyZXR1cm4geH07dGhpcy4kJGxpc3RlbmVycz17fTt0aGlzLiQkbmV4dFNpYmxpbmc9bnVsbDttKHRoaXMpfX0sJGV2YWw6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gaChhKSh0aGlzLGIpfSwkZXZhbEFzeW5jOmZ1bmN0aW9uKGEsYil7dy4kJHBoYXNlfHx1Lmxlbmd0aHx8ay5kZWZlcihmdW5jdGlvbigpe3UubGVuZ3RoJiZ3LiRkaWdlc3QoKX0pO3UucHVzaCh7c2NvcGU6dGhpcyxleHByZXNzaW9uOmEsbG9jYWxzOmJ9KX0sJCRwb3N0RGlnZXN0OmZ1bmN0aW9uKGEpe0wucHVzaChhKX0sJGFwcGx5OmZ1bmN0aW9uKGEpe3RyeXt0KFwiJGFwcGx5XCIpO1xudHJ5e3JldHVybiB0aGlzLiRldmFsKGEpfWZpbmFsbHl7dy4kJHBoYXNlPW51bGx9fWNhdGNoKGIpe2coYil9ZmluYWxseXt0cnl7dy4kZGlnZXN0KCl9Y2F0Y2goYyl7dGhyb3cgZyhjKSxjO319fSwkYXBwbHlBc3luYzpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKCl7Yy4kZXZhbChhKX12YXIgYz10aGlzO2EmJmFhLnB1c2goYik7QygpfSwkb246ZnVuY3Rpb24oYSxiKXt2YXIgYz10aGlzLiQkbGlzdGVuZXJzW2FdO2N8fCh0aGlzLiQkbGlzdGVuZXJzW2FdPWM9W10pO2MucHVzaChiKTt2YXIgZD10aGlzO2RvIGQuJCRsaXN0ZW5lckNvdW50W2FdfHwoZC4kJGxpc3RlbmVyQ291bnRbYV09MCksZC4kJGxpc3RlbmVyQ291bnRbYV0rKzt3aGlsZShkPWQuJHBhcmVudCk7dmFyIGU9dGhpcztyZXR1cm4gZnVuY3Rpb24oKXt2YXIgZD1jLmluZGV4T2YoYik7LTEhPT1kJiYoY1tkXT1udWxsLHYoZSwxLGEpKX19LCRlbWl0OmZ1bmN0aW9uKGEsYil7dmFyIGM9W10sZCxlPXRoaXMsZj0hMSxoPVxue25hbWU6YSx0YXJnZXRTY29wZTplLHN0b3BQcm9wYWdhdGlvbjpmdW5jdGlvbigpe2Y9ITB9LHByZXZlbnREZWZhdWx0OmZ1bmN0aW9uKCl7aC5kZWZhdWx0UHJldmVudGVkPSEwfSxkZWZhdWx0UHJldmVudGVkOiExfSxrPWNiKFtoXSxhcmd1bWVudHMsMSksbCxtO2Rve2Q9ZS4kJGxpc3RlbmVyc1thXXx8YztoLmN1cnJlbnRTY29wZT1lO2w9MDtmb3IobT1kLmxlbmd0aDtsPG07bCsrKWlmKGRbbF0pdHJ5e2RbbF0uYXBwbHkobnVsbCxrKX1jYXRjaChyKXtnKHIpfWVsc2UgZC5zcGxpY2UobCwxKSxsLS0sbS0tO2lmKGYpcmV0dXJuIGguY3VycmVudFNjb3BlPW51bGwsaDtlPWUuJHBhcmVudH13aGlsZShlKTtoLmN1cnJlbnRTY29wZT1udWxsO3JldHVybiBofSwkYnJvYWRjYXN0OmZ1bmN0aW9uKGEsYil7dmFyIGM9dGhpcyxkPXRoaXMsZT17bmFtZTphLHRhcmdldFNjb3BlOnRoaXMscHJldmVudERlZmF1bHQ6ZnVuY3Rpb24oKXtlLmRlZmF1bHRQcmV2ZW50ZWQ9ITB9LGRlZmF1bHRQcmV2ZW50ZWQ6ITF9O1xuaWYoIXRoaXMuJCRsaXN0ZW5lckNvdW50W2FdKXJldHVybiBlO2Zvcih2YXIgZj1jYihbZV0sYXJndW1lbnRzLDEpLGgsaztjPWQ7KXtlLmN1cnJlbnRTY29wZT1jO2Q9Yy4kJGxpc3RlbmVyc1thXXx8W107aD0wO2ZvcihrPWQubGVuZ3RoO2g8aztoKyspaWYoZFtoXSl0cnl7ZFtoXS5hcHBseShudWxsLGYpfWNhdGNoKGwpe2cobCl9ZWxzZSBkLnNwbGljZShoLDEpLGgtLSxrLS07aWYoIShkPWMuJCRsaXN0ZW5lckNvdW50W2FdJiZjLiQkY2hpbGRIZWFkfHxjIT09dGhpcyYmYy4kJG5leHRTaWJsaW5nKSlmb3IoO2MhPT10aGlzJiYhKGQ9Yy4kJG5leHRTaWJsaW5nKTspYz1jLiRwYXJlbnR9ZS5jdXJyZW50U2NvcGU9bnVsbDtyZXR1cm4gZX19O3ZhciB3PW5ldyByLHU9dy4kJGFzeW5jUXVldWU9W10sTD13LiQkcG9zdERpZ2VzdFF1ZXVlPVtdLGFhPXcuJCRhcHBseUFzeW5jUXVldWU9W107cmV0dXJuIHd9XX1mdW5jdGlvbiBnZSgpe3ZhciBhPS9eXFxzKihodHRwcz98ZnRwfG1haWx0b3x0ZWx8ZmlsZSk6LyxcbmI9L15cXHMqKChodHRwcz98ZnRwfGZpbGV8YmxvYik6fGRhdGE6aW1hZ2VcXC8pLzt0aGlzLmFIcmVmU2FuaXRpemF0aW9uV2hpdGVsaXN0PWZ1bmN0aW9uKGIpe3JldHVybiB5KGIpPyhhPWIsdGhpcyk6YX07dGhpcy5pbWdTcmNTYW5pdGl6YXRpb25XaGl0ZWxpc3Q9ZnVuY3Rpb24oYSl7cmV0dXJuIHkoYSk/KGI9YSx0aGlzKTpifTt0aGlzLiRnZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gZnVuY3Rpb24oZCxjKXt2YXIgZT1jP2I6YSxmO2Y9d2EoZCkuaHJlZjtyZXR1cm5cIlwiPT09Znx8Zi5tYXRjaChlKT9kOlwidW5zYWZlOlwiK2Z9fX1mdW5jdGlvbiBhZyhhKXtpZihcInNlbGZcIj09PWEpcmV0dXJuIGE7aWYoRShhKSl7aWYoLTE8YS5pbmRleE9mKFwiKioqXCIpKXRocm93IHlhKFwiaXdjYXJkXCIsYSk7YT11ZChhKS5yZXBsYWNlKFwiXFxcXCpcXFxcKlwiLFwiLipcIikucmVwbGFjZShcIlxcXFwqXCIsXCJbXjovLj8mO10qXCIpO3JldHVybiBuZXcgUmVnRXhwKFwiXlwiK2ErXCIkXCIpfWlmKE1hKGEpKXJldHVybiBuZXcgUmVnRXhwKFwiXlwiK1xuYS5zb3VyY2UrXCIkXCIpO3Rocm93IHlhKFwiaW1hdGNoZXJcIik7fWZ1bmN0aW9uIHZkKGEpe3ZhciBiPVtdO3koYSkmJm4oYSxmdW5jdGlvbihhKXtiLnB1c2goYWcoYSkpfSk7cmV0dXJuIGJ9ZnVuY3Rpb24gcGYoKXt0aGlzLlNDRV9DT05URVhUUz1sYTt2YXIgYT1bXCJzZWxmXCJdLGI9W107dGhpcy5yZXNvdXJjZVVybFdoaXRlbGlzdD1mdW5jdGlvbihiKXthcmd1bWVudHMubGVuZ3RoJiYoYT12ZChiKSk7cmV0dXJuIGF9O3RoaXMucmVzb3VyY2VVcmxCbGFja2xpc3Q9ZnVuY3Rpb24oYSl7YXJndW1lbnRzLmxlbmd0aCYmKGI9dmQoYSkpO3JldHVybiBifTt0aGlzLiRnZXQ9W1wiJGluamVjdG9yXCIsZnVuY3Rpb24oZCl7ZnVuY3Rpb24gYyhhLGIpe3JldHVyblwic2VsZlwiPT09YT9lZChiKTohIWEuZXhlYyhiLmhyZWYpfWZ1bmN0aW9uIGUoYSl7dmFyIGI9ZnVuY3Rpb24oYSl7dGhpcy4kJHVud3JhcFRydXN0ZWRWYWx1ZT1mdW5jdGlvbigpe3JldHVybiBhfX07YSYmKGIucHJvdG90eXBlPVxubmV3IGEpO2IucHJvdG90eXBlLnZhbHVlT2Y9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy4kJHVud3JhcFRydXN0ZWRWYWx1ZSgpfTtiLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiB0aGlzLiQkdW53cmFwVHJ1c3RlZFZhbHVlKCkudG9TdHJpbmcoKX07cmV0dXJuIGJ9dmFyIGY9ZnVuY3Rpb24oYSl7dGhyb3cgeWEoXCJ1bnNhZmVcIik7fTtkLmhhcyhcIiRzYW5pdGl6ZVwiKSYmKGY9ZC5nZXQoXCIkc2FuaXRpemVcIikpO3ZhciBnPWUoKSxoPXt9O2hbbGEuSFRNTF09ZShnKTtoW2xhLkNTU109ZShnKTtoW2xhLlVSTF09ZShnKTtoW2xhLkpTXT1lKGcpO2hbbGEuUkVTT1VSQ0VfVVJMXT1lKGhbbGEuVVJMXSk7cmV0dXJue3RydXN0QXM6ZnVuY3Rpb24oYSxiKXt2YXIgYz1oLmhhc093blByb3BlcnR5KGEpP2hbYV06bnVsbDtpZighYyl0aHJvdyB5YShcImljb250ZXh0XCIsYSxiKTtpZihudWxsPT09Ynx8cShiKXx8XCJcIj09PWIpcmV0dXJuIGI7aWYoXCJzdHJpbmdcIiE9PXR5cGVvZiBiKXRocm93IHlhKFwiaXR5cGVcIixcbmEpO3JldHVybiBuZXcgYyhiKX0sZ2V0VHJ1c3RlZDpmdW5jdGlvbihkLGUpe2lmKG51bGw9PT1lfHxxKGUpfHxcIlwiPT09ZSlyZXR1cm4gZTt2YXIgZz1oLmhhc093blByb3BlcnR5KGQpP2hbZF06bnVsbDtpZihnJiZlIGluc3RhbmNlb2YgZylyZXR1cm4gZS4kJHVud3JhcFRydXN0ZWRWYWx1ZSgpO2lmKGQ9PT1sYS5SRVNPVVJDRV9VUkwpe3ZhciBnPXdhKGUudG9TdHJpbmcoKSkscix0LG49ITE7cj0wO2Zvcih0PWEubGVuZ3RoO3I8dDtyKyspaWYoYyhhW3JdLGcpKXtuPSEwO2JyZWFrfWlmKG4pZm9yKHI9MCx0PWIubGVuZ3RoO3I8dDtyKyspaWYoYyhiW3JdLGcpKXtuPSExO2JyZWFrfWlmKG4pcmV0dXJuIGU7dGhyb3cgeWEoXCJpbnNlY3VybFwiLGUudG9TdHJpbmcoKSk7fWlmKGQ9PT1sYS5IVE1MKXJldHVybiBmKGUpO3Rocm93IHlhKFwidW5zYWZlXCIpO30sdmFsdWVPZjpmdW5jdGlvbihhKXtyZXR1cm4gYSBpbnN0YW5jZW9mIGc/YS4kJHVud3JhcFRydXN0ZWRWYWx1ZSgpOmF9fX1dfVxuZnVuY3Rpb24gb2YoKXt2YXIgYT0hMDt0aGlzLmVuYWJsZWQ9ZnVuY3Rpb24oYil7YXJndW1lbnRzLmxlbmd0aCYmKGE9ISFiKTtyZXR1cm4gYX07dGhpcy4kZ2V0PVtcIiRwYXJzZVwiLFwiJHNjZURlbGVnYXRlXCIsZnVuY3Rpb24oYixkKXtpZihhJiY4PkhhKXRocm93IHlhKFwiaWVxdWlya3NcIik7dmFyIGM9aWEobGEpO2MuaXNFbmFibGVkPWZ1bmN0aW9uKCl7cmV0dXJuIGF9O2MudHJ1c3RBcz1kLnRydXN0QXM7Yy5nZXRUcnVzdGVkPWQuZ2V0VHJ1c3RlZDtjLnZhbHVlT2Y9ZC52YWx1ZU9mO2F8fChjLnRydXN0QXM9Yy5nZXRUcnVzdGVkPWZ1bmN0aW9uKGEsYil7cmV0dXJuIGJ9LGMudmFsdWVPZj1ZYSk7Yy5wYXJzZUFzPWZ1bmN0aW9uKGEsZCl7dmFyIGU9YihkKTtyZXR1cm4gZS5saXRlcmFsJiZlLmNvbnN0YW50P2U6YihkLGZ1bmN0aW9uKGIpe3JldHVybiBjLmdldFRydXN0ZWQoYSxiKX0pfTt2YXIgZT1jLnBhcnNlQXMsZj1jLmdldFRydXN0ZWQsZz1jLnRydXN0QXM7bihsYSxmdW5jdGlvbihhLFxuYil7dmFyIGQ9RihiKTtjW2ZiKFwicGFyc2VfYXNfXCIrZCldPWZ1bmN0aW9uKGIpe3JldHVybiBlKGEsYil9O2NbZmIoXCJnZXRfdHJ1c3RlZF9cIitkKV09ZnVuY3Rpb24oYil7cmV0dXJuIGYoYSxiKX07Y1tmYihcInRydXN0X2FzX1wiK2QpXT1mdW5jdGlvbihiKXtyZXR1cm4gZyhhLGIpfX0pO3JldHVybiBjfV19ZnVuY3Rpb24gcWYoKXt0aGlzLiRnZXQ9W1wiJHdpbmRvd1wiLFwiJGRvY3VtZW50XCIsZnVuY3Rpb24oYSxiKXt2YXIgZD17fSxjPWVhKCgvYW5kcm9pZCAoXFxkKykvLmV4ZWMoRigoYS5uYXZpZ2F0b3J8fHt9KS51c2VyQWdlbnQpKXx8W10pWzFdKSxlPS9Cb3hlZS9pLnRlc3QoKGEubmF2aWdhdG9yfHx7fSkudXNlckFnZW50KSxmPWJbMF18fHt9LGcsaD0vXihNb3p8d2Via2l0fG1zKSg/PVtBLVpdKS8saz1mLmJvZHkmJmYuYm9keS5zdHlsZSxsPSExLG09ITE7aWYoayl7Zm9yKHZhciByIGluIGspaWYobD1oLmV4ZWMocikpe2c9bFswXTtnPWcuc3Vic3RyKDAsMSkudG9VcHBlckNhc2UoKStcbmcuc3Vic3RyKDEpO2JyZWFrfWd8fChnPVwiV2Via2l0T3BhY2l0eVwiaW4gayYmXCJ3ZWJraXRcIik7bD0hIShcInRyYW5zaXRpb25cImluIGt8fGcrXCJUcmFuc2l0aW9uXCJpbiBrKTttPSEhKFwiYW5pbWF0aW9uXCJpbiBrfHxnK1wiQW5pbWF0aW9uXCJpbiBrKTshY3x8bCYmbXx8KGw9RShrLndlYmtpdFRyYW5zaXRpb24pLG09RShrLndlYmtpdEFuaW1hdGlvbikpfXJldHVybntoaXN0b3J5OiEoIWEuaGlzdG9yeXx8IWEuaGlzdG9yeS5wdXNoU3RhdGV8fDQ+Y3x8ZSksaGFzRXZlbnQ6ZnVuY3Rpb24oYSl7aWYoXCJpbnB1dFwiPT09YSYmMTE+PUhhKXJldHVybiExO2lmKHEoZFthXSkpe3ZhciBiPWYuY3JlYXRlRWxlbWVudChcImRpdlwiKTtkW2FdPVwib25cIithIGluIGJ9cmV0dXJuIGRbYV19LGNzcDpCYSgpLHZlbmRvclByZWZpeDpnLHRyYW5zaXRpb25zOmwsYW5pbWF0aW9uczptLGFuZHJvaWQ6Y319XX1mdW5jdGlvbiBzZigpe3RoaXMuJGdldD1bXCIkdGVtcGxhdGVDYWNoZVwiLFwiJGh0dHBcIixcIiRxXCIsXCIkc2NlXCIsXG5mdW5jdGlvbihhLGIsZCxjKXtmdW5jdGlvbiBlKGYsZyl7ZS50b3RhbFBlbmRpbmdSZXF1ZXN0cysrO0UoZikmJmEuZ2V0KGYpfHwoZj1jLmdldFRydXN0ZWRSZXNvdXJjZVVybChmKSk7dmFyIGg9Yi5kZWZhdWx0cyYmYi5kZWZhdWx0cy50cmFuc2Zvcm1SZXNwb25zZTtJKGgpP2g9aC5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGEhPT0kYn0pOmg9PT0kYiYmKGg9bnVsbCk7cmV0dXJuIGIuZ2V0KGYse2NhY2hlOmEsdHJhbnNmb3JtUmVzcG9uc2U6aH0pW1wiZmluYWxseVwiXShmdW5jdGlvbigpe2UudG90YWxQZW5kaW5nUmVxdWVzdHMtLX0pLnRoZW4oZnVuY3Rpb24oYil7YS5wdXQoZixiLmRhdGEpO3JldHVybiBiLmRhdGF9LGZ1bmN0aW9uKGEpe2lmKCFnKXRocm93IGhhKFwidHBsb2FkXCIsZixhLnN0YXR1cyxhLnN0YXR1c1RleHQpO3JldHVybiBkLnJlamVjdChhKX0pfWUudG90YWxQZW5kaW5nUmVxdWVzdHM9MDtyZXR1cm4gZX1dfWZ1bmN0aW9uIHRmKCl7dGhpcy4kZ2V0PVtcIiRyb290U2NvcGVcIixcblwiJGJyb3dzZXJcIixcIiRsb2NhdGlvblwiLGZ1bmN0aW9uKGEsYixkKXtyZXR1cm57ZmluZEJpbmRpbmdzOmZ1bmN0aW9uKGEsYixkKXthPWEuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShcIm5nLWJpbmRpbmdcIik7dmFyIGc9W107bihhLGZ1bmN0aW9uKGEpe3ZhciBjPWZhLmVsZW1lbnQoYSkuZGF0YShcIiRiaW5kaW5nXCIpO2MmJm4oYyxmdW5jdGlvbihjKXtkPyhuZXcgUmVnRXhwKFwiKF58XFxcXHMpXCIrdWQoYikrXCIoXFxcXHN8XFxcXHx8JClcIikpLnRlc3QoYykmJmcucHVzaChhKTotMSE9Yy5pbmRleE9mKGIpJiZnLnB1c2goYSl9KX0pO3JldHVybiBnfSxmaW5kTW9kZWxzOmZ1bmN0aW9uKGEsYixkKXtmb3IodmFyIGc9W1wibmctXCIsXCJkYXRhLW5nLVwiLFwibmdcXFxcOlwiXSxoPTA7aDxnLmxlbmd0aDsrK2gpe3ZhciBrPWEucXVlcnlTZWxlY3RvckFsbChcIltcIitnW2hdK1wibW9kZWxcIisoZD9cIj1cIjpcIio9XCIpKydcIicrYisnXCJdJyk7aWYoay5sZW5ndGgpcmV0dXJuIGt9fSxnZXRMb2NhdGlvbjpmdW5jdGlvbigpe3JldHVybiBkLnVybCgpfSxcbnNldExvY2F0aW9uOmZ1bmN0aW9uKGIpe2IhPT1kLnVybCgpJiYoZC51cmwoYiksYS4kZGlnZXN0KCkpfSx3aGVuU3RhYmxlOmZ1bmN0aW9uKGEpe2Iubm90aWZ5V2hlbk5vT3V0c3RhbmRpbmdSZXF1ZXN0cyhhKX19fV19ZnVuY3Rpb24gdWYoKXt0aGlzLiRnZXQ9W1wiJHJvb3RTY29wZVwiLFwiJGJyb3dzZXJcIixcIiRxXCIsXCIkJHFcIixcIiRleGNlcHRpb25IYW5kbGVyXCIsZnVuY3Rpb24oYSxiLGQsYyxlKXtmdW5jdGlvbiBmKGYsayxsKXt6KGYpfHwobD1rLGs9ZixmPXgpO3ZhciBtPXJhLmNhbGwoYXJndW1lbnRzLDMpLHI9eShsKSYmIWwsdD0ocj9jOmQpLmRlZmVyKCksbj10LnByb21pc2UscTtxPWIuZGVmZXIoZnVuY3Rpb24oKXt0cnl7dC5yZXNvbHZlKGYuYXBwbHkobnVsbCxtKSl9Y2F0Y2goYil7dC5yZWplY3QoYiksZShiKX1maW5hbGx5e2RlbGV0ZSBnW24uJCR0aW1lb3V0SWRdfXJ8fGEuJGFwcGx5KCl9LGspO24uJCR0aW1lb3V0SWQ9cTtnW3FdPXQ7cmV0dXJuIG59dmFyIGc9e307XG5mLmNhbmNlbD1mdW5jdGlvbihhKXtyZXR1cm4gYSYmYS4kJHRpbWVvdXRJZCBpbiBnPyhnW2EuJCR0aW1lb3V0SWRdLnJlamVjdChcImNhbmNlbGVkXCIpLGRlbGV0ZSBnW2EuJCR0aW1lb3V0SWRdLGIuZGVmZXIuY2FuY2VsKGEuJCR0aW1lb3V0SWQpKTohMX07cmV0dXJuIGZ9XX1mdW5jdGlvbiB3YShhKXtIYSYmKFkuc2V0QXR0cmlidXRlKFwiaHJlZlwiLGEpLGE9WS5ocmVmKTtZLnNldEF0dHJpYnV0ZShcImhyZWZcIixhKTtyZXR1cm57aHJlZjpZLmhyZWYscHJvdG9jb2w6WS5wcm90b2NvbD9ZLnByb3RvY29sLnJlcGxhY2UoLzokLyxcIlwiKTpcIlwiLGhvc3Q6WS5ob3N0LHNlYXJjaDpZLnNlYXJjaD9ZLnNlYXJjaC5yZXBsYWNlKC9eXFw/LyxcIlwiKTpcIlwiLGhhc2g6WS5oYXNoP1kuaGFzaC5yZXBsYWNlKC9eIy8sXCJcIik6XCJcIixob3N0bmFtZTpZLmhvc3RuYW1lLHBvcnQ6WS5wb3J0LHBhdGhuYW1lOlwiL1wiPT09WS5wYXRobmFtZS5jaGFyQXQoMCk/WS5wYXRobmFtZTpcIi9cIitZLnBhdGhuYW1lfX1mdW5jdGlvbiBlZChhKXthPVxuRShhKT93YShhKTphO3JldHVybiBhLnByb3RvY29sPT09d2QucHJvdG9jb2wmJmEuaG9zdD09PXdkLmhvc3R9ZnVuY3Rpb24gdmYoKXt0aGlzLiRnZXQ9bmEoUyl9ZnVuY3Rpb24geGQoYSl7ZnVuY3Rpb24gYihhKXt0cnl7cmV0dXJuIGRlY29kZVVSSUNvbXBvbmVudChhKX1jYXRjaChiKXtyZXR1cm4gYX19dmFyIGQ9YVswXXx8e30sYz17fSxlPVwiXCI7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGEsZyxoLGssbDthPWQuY29va2llfHxcIlwiO2lmKGEhPT1lKWZvcihlPWEsYT1lLnNwbGl0KFwiOyBcIiksYz17fSxoPTA7aDxhLmxlbmd0aDtoKyspZz1hW2hdLGs9Zy5pbmRleE9mKFwiPVwiKSwwPGsmJihsPWIoZy5zdWJzdHJpbmcoMCxrKSkscShjW2xdKSYmKGNbbF09YihnLnN1YnN0cmluZyhrKzEpKSkpO3JldHVybiBjfX1mdW5jdGlvbiB6Zigpe3RoaXMuJGdldD14ZH1mdW5jdGlvbiBKYyhhKXtmdW5jdGlvbiBiKGQsYyl7aWYoSChkKSl7dmFyIGU9e307bihkLGZ1bmN0aW9uKGEsYyl7ZVtjXT1cbmIoYyxhKX0pO3JldHVybiBlfXJldHVybiBhLmZhY3RvcnkoZCtcIkZpbHRlclwiLGMpfXRoaXMucmVnaXN0ZXI9Yjt0aGlzLiRnZXQ9W1wiJGluamVjdG9yXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGZ1bmN0aW9uKGIpe3JldHVybiBhLmdldChiK1wiRmlsdGVyXCIpfX1dO2IoXCJjdXJyZW5jeVwiLHlkKTtiKFwiZGF0ZVwiLHpkKTtiKFwiZmlsdGVyXCIsYmcpO2IoXCJqc29uXCIsY2cpO2IoXCJsaW1pdFRvXCIsZGcpO2IoXCJsb3dlcmNhc2VcIixlZyk7YihcIm51bWJlclwiLEFkKTtiKFwib3JkZXJCeVwiLEJkKTtiKFwidXBwZXJjYXNlXCIsZmcpfWZ1bmN0aW9uIGJnKCl7cmV0dXJuIGZ1bmN0aW9uKGEsYixkKXtpZighemEoYSkpe2lmKG51bGw9PWEpcmV0dXJuIGE7dGhyb3cgRyhcImZpbHRlclwiKShcIm5vdGFycmF5XCIsYSk7fXZhciBjO3N3aXRjaChoYyhiKSl7Y2FzZSBcImZ1bmN0aW9uXCI6YnJlYWs7Y2FzZSBcImJvb2xlYW5cIjpjYXNlIFwibnVsbFwiOmNhc2UgXCJudW1iZXJcIjpjYXNlIFwic3RyaW5nXCI6Yz0hMDtjYXNlIFwib2JqZWN0XCI6Yj1cbmdnKGIsZCxjKTticmVhaztkZWZhdWx0OnJldHVybiBhfXJldHVybiBBcnJheS5wcm90b3R5cGUuZmlsdGVyLmNhbGwoYSxiKX19ZnVuY3Rpb24gZ2coYSxiLGQpe3ZhciBjPUgoYSkmJlwiJFwiaW4gYTshMD09PWI/Yj1tYTp6KGIpfHwoYj1mdW5jdGlvbihhLGIpe2lmKHEoYSkpcmV0dXJuITE7aWYobnVsbD09PWF8fG51bGw9PT1iKXJldHVybiBhPT09YjtpZihIKGIpfHxIKGEpJiYhcWMoYSkpcmV0dXJuITE7YT1GKFwiXCIrYSk7Yj1GKFwiXCIrYik7cmV0dXJuLTEhPT1hLmluZGV4T2YoYil9KTtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuIGMmJiFIKGUpP0thKGUsYS4kLGIsITEpOkthKGUsYSxiLGQpfX1mdW5jdGlvbiBLYShhLGIsZCxjLGUpe3ZhciBmPWhjKGEpLGc9aGMoYik7aWYoXCJzdHJpbmdcIj09PWcmJlwiIVwiPT09Yi5jaGFyQXQoMCkpcmV0dXJuIUthKGEsYi5zdWJzdHJpbmcoMSksZCxjKTtpZihJKGEpKXJldHVybiBhLnNvbWUoZnVuY3Rpb24oYSl7cmV0dXJuIEthKGEsYixkLGMpfSk7XG5zd2l0Y2goZil7Y2FzZSBcIm9iamVjdFwiOnZhciBoO2lmKGMpe2ZvcihoIGluIGEpaWYoXCIkXCIhPT1oLmNoYXJBdCgwKSYmS2EoYVtoXSxiLGQsITApKXJldHVybiEwO3JldHVybiBlPyExOkthKGEsYixkLCExKX1pZihcIm9iamVjdFwiPT09Zyl7Zm9yKGggaW4gYilpZihlPWJbaF0sIXooZSkmJiFxKGUpJiYoZj1cIiRcIj09PWgsIUthKGY/YTphW2hdLGUsZCxmLGYpKSlyZXR1cm4hMTtyZXR1cm4hMH1yZXR1cm4gZChhLGIpO2Nhc2UgXCJmdW5jdGlvblwiOnJldHVybiExO2RlZmF1bHQ6cmV0dXJuIGQoYSxiKX19ZnVuY3Rpb24gaGMoYSl7cmV0dXJuIG51bGw9PT1hP1wibnVsbFwiOnR5cGVvZiBhfWZ1bmN0aW9uIHlkKGEpe3ZhciBiPWEuTlVNQkVSX0ZPUk1BVFM7cmV0dXJuIGZ1bmN0aW9uKGEsYyxlKXtxKGMpJiYoYz1iLkNVUlJFTkNZX1NZTSk7cShlKSYmKGU9Yi5QQVRURVJOU1sxXS5tYXhGcmFjKTtyZXR1cm4gbnVsbD09YT9hOkNkKGEsYi5QQVRURVJOU1sxXSxiLkdST1VQX1NFUCxiLkRFQ0lNQUxfU0VQLFxuZSkucmVwbGFjZSgvXFx1MDBBNC9nLGMpfX1mdW5jdGlvbiBBZChhKXt2YXIgYj1hLk5VTUJFUl9GT1JNQVRTO3JldHVybiBmdW5jdGlvbihhLGMpe3JldHVybiBudWxsPT1hP2E6Q2QoYSxiLlBBVFRFUk5TWzBdLGIuR1JPVVBfU0VQLGIuREVDSU1BTF9TRVAsYyl9fWZ1bmN0aW9uIENkKGEsYixkLGMsZSl7aWYoSChhKSlyZXR1cm5cIlwiO3ZhciBmPTA+YTthPU1hdGguYWJzKGEpO3ZhciBnPUluZmluaXR5PT09YTtpZighZyYmIWlzRmluaXRlKGEpKXJldHVyblwiXCI7dmFyIGg9YStcIlwiLGs9XCJcIixsPSExLG09W107ZyYmKGs9XCJcXHUyMjFlXCIpO2lmKCFnJiYtMSE9PWguaW5kZXhPZihcImVcIikpe3ZhciByPWgubWF0Y2goLyhbXFxkXFwuXSspZSgtPykoXFxkKykvKTtyJiZcIi1cIj09clsyXSYmclszXT5lKzE/YT0wOihrPWgsbD0hMCl9aWYoZ3x8bCkwPGUmJjE+YSYmKGs9YS50b0ZpeGVkKGUpLGE9cGFyc2VGbG9hdChrKSxrPWsucmVwbGFjZShpYyxjKSk7ZWxzZXtnPShoLnNwbGl0KGljKVsxXXx8XCJcIikubGVuZ3RoO1xucShlKSYmKGU9TWF0aC5taW4oTWF0aC5tYXgoYi5taW5GcmFjLGcpLGIubWF4RnJhYykpO2E9KyhNYXRoLnJvdW5kKCsoYS50b1N0cmluZygpK1wiZVwiK2UpKS50b1N0cmluZygpK1wiZVwiKy1lKTt2YXIgZz0oXCJcIithKS5zcGxpdChpYyksaD1nWzBdLGc9Z1sxXXx8XCJcIixyPTAsdD1iLmxnU2l6ZSxuPWIuZ1NpemU7aWYoaC5sZW5ndGg+PXQrbilmb3Iocj1oLmxlbmd0aC10LGw9MDtsPHI7bCsrKTA9PT0oci1sKSVuJiYwIT09bCYmKGsrPWQpLGsrPWguY2hhckF0KGwpO2ZvcihsPXI7bDxoLmxlbmd0aDtsKyspMD09PShoLmxlbmd0aC1sKSV0JiYwIT09bCYmKGsrPWQpLGsrPWguY2hhckF0KGwpO2Zvcig7Zy5sZW5ndGg8ZTspZys9XCIwXCI7ZSYmXCIwXCIhPT1lJiYoays9YytnLnN1YnN0cigwLGUpKX0wPT09YSYmKGY9ITEpO20ucHVzaChmP2IubmVnUHJlOmIucG9zUHJlLGssZj9iLm5lZ1N1ZjpiLnBvc1N1Zik7cmV0dXJuIG0uam9pbihcIlwiKX1mdW5jdGlvbiBHYihhLGIsZCl7dmFyIGM9XCJcIjtcbjA+YSYmKGM9XCItXCIsYT0tYSk7Zm9yKGE9XCJcIithO2EubGVuZ3RoPGI7KWE9XCIwXCIrYTtkJiYoYT1hLnN1YnN0cihhLmxlbmd0aC1iKSk7cmV0dXJuIGMrYX1mdW5jdGlvbiBjYShhLGIsZCxjKXtkPWR8fDA7cmV0dXJuIGZ1bmN0aW9uKGUpe2U9ZVtcImdldFwiK2FdKCk7aWYoMDxkfHxlPi1kKWUrPWQ7MD09PWUmJi0xMj09ZCYmKGU9MTIpO3JldHVybiBHYihlLGIsYyl9fWZ1bmN0aW9uIEhiKGEsYil7cmV0dXJuIGZ1bmN0aW9uKGQsYyl7dmFyIGU9ZFtcImdldFwiK2FdKCksZj1zYihiP1wiU0hPUlRcIithOmEpO3JldHVybiBjW2ZdW2VdfX1mdW5jdGlvbiBEZChhKXt2YXIgYj0obmV3IERhdGUoYSwwLDEpKS5nZXREYXkoKTtyZXR1cm4gbmV3IERhdGUoYSwwLCg0Pj1iPzU6MTIpLWIpfWZ1bmN0aW9uIEVkKGEpe3JldHVybiBmdW5jdGlvbihiKXt2YXIgZD1EZChiLmdldEZ1bGxZZWFyKCkpO2I9K25ldyBEYXRlKGIuZ2V0RnVsbFllYXIoKSxiLmdldE1vbnRoKCksYi5nZXREYXRlKCkrKDQtYi5nZXREYXkoKSkpLVxuK2Q7Yj0xK01hdGgucm91bmQoYi82MDQ4RTUpO3JldHVybiBHYihiLGEpfX1mdW5jdGlvbiBqYyhhLGIpe3JldHVybiAwPj1hLmdldEZ1bGxZZWFyKCk/Yi5FUkFTWzBdOmIuRVJBU1sxXX1mdW5jdGlvbiB6ZChhKXtmdW5jdGlvbiBiKGEpe3ZhciBiO2lmKGI9YS5tYXRjaChkKSl7YT1uZXcgRGF0ZSgwKTt2YXIgZj0wLGc9MCxoPWJbOF0/YS5zZXRVVENGdWxsWWVhcjphLnNldEZ1bGxZZWFyLGs9Yls4XT9hLnNldFVUQ0hvdXJzOmEuc2V0SG91cnM7Yls5XSYmKGY9ZWEoYls5XStiWzEwXSksZz1lYShiWzldK2JbMTFdKSk7aC5jYWxsKGEsZWEoYlsxXSksZWEoYlsyXSktMSxlYShiWzNdKSk7Zj1lYShiWzRdfHwwKS1mO2c9ZWEoYls1XXx8MCktZztoPWVhKGJbNl18fDApO2I9TWF0aC5yb3VuZCgxRTMqcGFyc2VGbG9hdChcIjAuXCIrKGJbN118fDApKSk7ay5jYWxsKGEsZixnLGgsYil9cmV0dXJuIGF9dmFyIGQ9L14oXFxkezR9KS0/KFxcZFxcZCktPyhcXGRcXGQpKD86VChcXGRcXGQpKD86Oj8oXFxkXFxkKSg/Ojo/KFxcZFxcZCkoPzpcXC4oXFxkKykpPyk/KT8oWnwoWystXSkoXFxkXFxkKTo/KFxcZFxcZCkpPyk/JC87XG5yZXR1cm4gZnVuY3Rpb24oYyxkLGYpe3ZhciBnPVwiXCIsaD1bXSxrLGw7ZD1kfHxcIm1lZGl1bURhdGVcIjtkPWEuREFURVRJTUVfRk9STUFUU1tkXXx8ZDtFKGMpJiYoYz1oZy50ZXN0KGMpP2VhKGMpOmIoYykpO1EoYykmJihjPW5ldyBEYXRlKGMpKTtpZighZGEoYyl8fCFpc0Zpbml0ZShjLmdldFRpbWUoKSkpcmV0dXJuIGM7Zm9yKDtkOykobD1pZy5leGVjKGQpKT8oaD1jYihoLGwsMSksZD1oLnBvcCgpKTooaC5wdXNoKGQpLGQ9bnVsbCk7dmFyIG09Yy5nZXRUaW1lem9uZU9mZnNldCgpO2YmJihtPXZjKGYsYy5nZXRUaW1lem9uZU9mZnNldCgpKSxjPVBiKGMsZiwhMCkpO24oaCxmdW5jdGlvbihiKXtrPWpnW2JdO2crPWs/ayhjLGEuREFURVRJTUVfRk9STUFUUyxtKTpiLnJlcGxhY2UoLyheJ3wnJCkvZyxcIlwiKS5yZXBsYWNlKC8nJy9nLFwiJ1wiKX0pO3JldHVybiBnfX1mdW5jdGlvbiBjZygpe3JldHVybiBmdW5jdGlvbihhLGIpe3EoYikmJihiPTIpO3JldHVybiBkYihhLGIpfX1mdW5jdGlvbiBkZygpe3JldHVybiBmdW5jdGlvbihhLFxuYixkKXtiPUluZmluaXR5PT09TWF0aC5hYnMoTnVtYmVyKGIpKT9OdW1iZXIoYik6ZWEoYik7aWYoaXNOYU4oYikpcmV0dXJuIGE7UShhKSYmKGE9YS50b1N0cmluZygpKTtpZighSShhKSYmIUUoYSkpcmV0dXJuIGE7ZD0hZHx8aXNOYU4oZCk/MDplYShkKTtkPTA+ZD9NYXRoLm1heCgwLGEubGVuZ3RoK2QpOmQ7cmV0dXJuIDA8PWI/YS5zbGljZShkLGQrYik6MD09PWQ/YS5zbGljZShiLGEubGVuZ3RoKTphLnNsaWNlKE1hdGgubWF4KDAsZCtiKSxkKX19ZnVuY3Rpb24gQmQoYSl7ZnVuY3Rpb24gYihiLGQpe2Q9ZD8tMToxO3JldHVybiBiLm1hcChmdW5jdGlvbihiKXt2YXIgYz0xLGg9WWE7aWYoeihiKSloPWI7ZWxzZSBpZihFKGIpKXtpZihcIitcIj09Yi5jaGFyQXQoMCl8fFwiLVwiPT1iLmNoYXJBdCgwKSljPVwiLVwiPT1iLmNoYXJBdCgwKT8tMToxLGI9Yi5zdWJzdHJpbmcoMSk7aWYoXCJcIiE9PWImJihoPWEoYiksaC5jb25zdGFudCkpdmFyIGs9aCgpLGg9ZnVuY3Rpb24oYSl7cmV0dXJuIGFba119fXJldHVybntnZXQ6aCxcbmRlc2NlbmRpbmc6YypkfX0pfWZ1bmN0aW9uIGQoYSl7c3dpdGNoKHR5cGVvZiBhKXtjYXNlIFwibnVtYmVyXCI6Y2FzZSBcImJvb2xlYW5cIjpjYXNlIFwic3RyaW5nXCI6cmV0dXJuITA7ZGVmYXVsdDpyZXR1cm4hMX19cmV0dXJuIGZ1bmN0aW9uKGEsZSxmKXtpZighemEoYSkpcmV0dXJuIGE7SShlKXx8KGU9W2VdKTswPT09ZS5sZW5ndGgmJihlPVtcIitcIl0pO3ZhciBnPWIoZSxmKTtnLnB1c2goe2dldDpmdW5jdGlvbigpe3JldHVybnt9fSxkZXNjZW5kaW5nOmY/LTE6MX0pO2E9QXJyYXkucHJvdG90eXBlLm1hcC5jYWxsKGEsZnVuY3Rpb24oYSxiKXtyZXR1cm57dmFsdWU6YSxwcmVkaWNhdGVWYWx1ZXM6Zy5tYXAoZnVuY3Rpb24oYyl7dmFyIGU9Yy5nZXQoYSk7Yz10eXBlb2YgZTtpZihudWxsPT09ZSljPVwic3RyaW5nXCIsZT1cIm51bGxcIjtlbHNlIGlmKFwic3RyaW5nXCI9PT1jKWU9ZS50b0xvd2VyQ2FzZSgpO2Vsc2UgaWYoXCJvYmplY3RcIj09PWMpYTp7aWYoXCJmdW5jdGlvblwiPT09dHlwZW9mIGUudmFsdWVPZiYmXG4oZT1lLnZhbHVlT2YoKSxkKGUpKSlicmVhayBhO2lmKHFjKGUpJiYoZT1lLnRvU3RyaW5nKCksZChlKSkpYnJlYWsgYTtlPWJ9cmV0dXJue3ZhbHVlOmUsdHlwZTpjfX0pfX0pO2Euc29ydChmdW5jdGlvbihhLGIpe2Zvcih2YXIgYz0wLGQ9MCxlPWcubGVuZ3RoO2Q8ZTsrK2Qpe3ZhciBjPWEucHJlZGljYXRlVmFsdWVzW2RdLGY9Yi5wcmVkaWNhdGVWYWx1ZXNbZF0sbj0wO2MudHlwZT09PWYudHlwZT9jLnZhbHVlIT09Zi52YWx1ZSYmKG49Yy52YWx1ZTxmLnZhbHVlPy0xOjEpOm49Yy50eXBlPGYudHlwZT8tMToxO2lmKGM9bipnW2RdLmRlc2NlbmRpbmcpYnJlYWt9cmV0dXJuIGN9KTtyZXR1cm4gYT1hLm1hcChmdW5jdGlvbihhKXtyZXR1cm4gYS52YWx1ZX0pfX1mdW5jdGlvbiBMYShhKXt6KGEpJiYoYT17bGluazphfSk7YS5yZXN0cmljdD1hLnJlc3RyaWN0fHxcIkFDXCI7cmV0dXJuIG5hKGEpfWZ1bmN0aW9uIEZkKGEsYixkLGMsZSl7dmFyIGY9dGhpcyxnPVtdO2YuJGVycm9yPVxue307Zi4kJHN1Y2Nlc3M9e307Zi4kcGVuZGluZz11O2YuJG5hbWU9ZShiLm5hbWV8fGIubmdGb3JtfHxcIlwiKShkKTtmLiRkaXJ0eT0hMTtmLiRwcmlzdGluZT0hMDtmLiR2YWxpZD0hMDtmLiRpbnZhbGlkPSExO2YuJHN1Ym1pdHRlZD0hMTtmLiQkcGFyZW50Rm9ybT1JYjtmLiRyb2xsYmFja1ZpZXdWYWx1ZT1mdW5jdGlvbigpe24oZyxmdW5jdGlvbihhKXthLiRyb2xsYmFja1ZpZXdWYWx1ZSgpfSl9O2YuJGNvbW1pdFZpZXdWYWx1ZT1mdW5jdGlvbigpe24oZyxmdW5jdGlvbihhKXthLiRjb21taXRWaWV3VmFsdWUoKX0pfTtmLiRhZGRDb250cm9sPWZ1bmN0aW9uKGEpe1JhKGEuJG5hbWUsXCJpbnB1dFwiKTtnLnB1c2goYSk7YS4kbmFtZSYmKGZbYS4kbmFtZV09YSk7YS4kJHBhcmVudEZvcm09Zn07Zi4kJHJlbmFtZUNvbnRyb2w9ZnVuY3Rpb24oYSxiKXt2YXIgYz1hLiRuYW1lO2ZbY109PT1hJiZkZWxldGUgZltjXTtmW2JdPWE7YS4kbmFtZT1ifTtmLiRyZW1vdmVDb250cm9sPWZ1bmN0aW9uKGEpe2EuJG5hbWUmJlxuZlthLiRuYW1lXT09PWEmJmRlbGV0ZSBmW2EuJG5hbWVdO24oZi4kcGVuZGluZyxmdW5jdGlvbihiLGMpe2YuJHNldFZhbGlkaXR5KGMsbnVsbCxhKX0pO24oZi4kZXJyb3IsZnVuY3Rpb24oYixjKXtmLiRzZXRWYWxpZGl0eShjLG51bGwsYSl9KTtuKGYuJCRzdWNjZXNzLGZ1bmN0aW9uKGIsYyl7Zi4kc2V0VmFsaWRpdHkoYyxudWxsLGEpfSk7YWIoZyxhKTthLiQkcGFyZW50Rm9ybT1JYn07R2Qoe2N0cmw6dGhpcywkZWxlbWVudDphLHNldDpmdW5jdGlvbihhLGIsYyl7dmFyIGQ9YVtiXTtkPy0xPT09ZC5pbmRleE9mKGMpJiZkLnB1c2goYyk6YVtiXT1bY119LHVuc2V0OmZ1bmN0aW9uKGEsYixjKXt2YXIgZD1hW2JdO2QmJihhYihkLGMpLDA9PT1kLmxlbmd0aCYmZGVsZXRlIGFbYl0pfSwkYW5pbWF0ZTpjfSk7Zi4kc2V0RGlydHk9ZnVuY3Rpb24oKXtjLnJlbW92ZUNsYXNzKGEsV2EpO2MuYWRkQ2xhc3MoYSxKYik7Zi4kZGlydHk9ITA7Zi4kcHJpc3RpbmU9ITE7Zi4kJHBhcmVudEZvcm0uJHNldERpcnR5KCl9O1xuZi4kc2V0UHJpc3RpbmU9ZnVuY3Rpb24oKXtjLnNldENsYXNzKGEsV2EsSmIrXCIgbmctc3VibWl0dGVkXCIpO2YuJGRpcnR5PSExO2YuJHByaXN0aW5lPSEwO2YuJHN1Ym1pdHRlZD0hMTtuKGcsZnVuY3Rpb24oYSl7YS4kc2V0UHJpc3RpbmUoKX0pfTtmLiRzZXRVbnRvdWNoZWQ9ZnVuY3Rpb24oKXtuKGcsZnVuY3Rpb24oYSl7YS4kc2V0VW50b3VjaGVkKCl9KX07Zi4kc2V0U3VibWl0dGVkPWZ1bmN0aW9uKCl7Yy5hZGRDbGFzcyhhLFwibmctc3VibWl0dGVkXCIpO2YuJHN1Ym1pdHRlZD0hMDtmLiQkcGFyZW50Rm9ybS4kc2V0U3VibWl0dGVkKCl9fWZ1bmN0aW9uIGtjKGEpe2EuJGZvcm1hdHRlcnMucHVzaChmdW5jdGlvbihiKXtyZXR1cm4gYS4kaXNFbXB0eShiKT9iOmIudG9TdHJpbmcoKX0pfWZ1bmN0aW9uIGpiKGEsYixkLGMsZSxmKXt2YXIgZz1GKGJbMF0udHlwZSk7aWYoIWUuYW5kcm9pZCl7dmFyIGg9ITE7Yi5vbihcImNvbXBvc2l0aW9uc3RhcnRcIixmdW5jdGlvbihhKXtoPSEwfSk7XG5iLm9uKFwiY29tcG9zaXRpb25lbmRcIixmdW5jdGlvbigpe2g9ITE7aygpfSl9dmFyIGs9ZnVuY3Rpb24oYSl7bCYmKGYuZGVmZXIuY2FuY2VsKGwpLGw9bnVsbCk7aWYoIWgpe3ZhciBlPWIudmFsKCk7YT1hJiZhLnR5cGU7XCJwYXNzd29yZFwiPT09Z3x8ZC5uZ1RyaW0mJlwiZmFsc2VcIj09PWQubmdUcmltfHwoZT1VKGUpKTsoYy4kdmlld1ZhbHVlIT09ZXx8XCJcIj09PWUmJmMuJCRoYXNOYXRpdmVWYWxpZGF0b3JzKSYmYy4kc2V0Vmlld1ZhbHVlKGUsYSl9fTtpZihlLmhhc0V2ZW50KFwiaW5wdXRcIikpYi5vbihcImlucHV0XCIsayk7ZWxzZXt2YXIgbCxtPWZ1bmN0aW9uKGEsYixjKXtsfHwobD1mLmRlZmVyKGZ1bmN0aW9uKCl7bD1udWxsO2ImJmIudmFsdWU9PT1jfHxrKGEpfSkpfTtiLm9uKFwia2V5ZG93blwiLGZ1bmN0aW9uKGEpe3ZhciBiPWEua2V5Q29kZTs5MT09PWJ8fDE1PGImJjE5PmJ8fDM3PD1iJiY0MD49Ynx8bShhLHRoaXMsdGhpcy52YWx1ZSl9KTtpZihlLmhhc0V2ZW50KFwicGFzdGVcIikpYi5vbihcInBhc3RlIGN1dFwiLFxubSl9Yi5vbihcImNoYW5nZVwiLGspO2MuJHJlbmRlcj1mdW5jdGlvbigpe3ZhciBhPWMuJGlzRW1wdHkoYy4kdmlld1ZhbHVlKT9cIlwiOmMuJHZpZXdWYWx1ZTtiLnZhbCgpIT09YSYmYi52YWwoYSl9fWZ1bmN0aW9uIEtiKGEsYil7cmV0dXJuIGZ1bmN0aW9uKGQsYyl7dmFyIGUsZjtpZihkYShkKSlyZXR1cm4gZDtpZihFKGQpKXsnXCInPT1kLmNoYXJBdCgwKSYmJ1wiJz09ZC5jaGFyQXQoZC5sZW5ndGgtMSkmJihkPWQuc3Vic3RyaW5nKDEsZC5sZW5ndGgtMSkpO2lmKGtnLnRlc3QoZCkpcmV0dXJuIG5ldyBEYXRlKGQpO2EubGFzdEluZGV4PTA7aWYoZT1hLmV4ZWMoZCkpcmV0dXJuIGUuc2hpZnQoKSxmPWM/e3l5eXk6Yy5nZXRGdWxsWWVhcigpLE1NOmMuZ2V0TW9udGgoKSsxLGRkOmMuZ2V0RGF0ZSgpLEhIOmMuZ2V0SG91cnMoKSxtbTpjLmdldE1pbnV0ZXMoKSxzczpjLmdldFNlY29uZHMoKSxzc3M6Yy5nZXRNaWxsaXNlY29uZHMoKS8xRTN9Ont5eXl5OjE5NzAsTU06MSxkZDoxLEhIOjAsXG5tbTowLHNzOjAsc3NzOjB9LG4oZSxmdW5jdGlvbihhLGMpe2M8Yi5sZW5ndGgmJihmW2JbY11dPSthKX0pLG5ldyBEYXRlKGYueXl5eSxmLk1NLTEsZi5kZCxmLkhILGYubW0sZi5zc3x8MCwxRTMqZi5zc3N8fDApfXJldHVybiBOYU59fWZ1bmN0aW9uIGtiKGEsYixkLGMpe3JldHVybiBmdW5jdGlvbihlLGYsZyxoLGssbCxtKXtmdW5jdGlvbiByKGEpe3JldHVybiBhJiYhKGEuZ2V0VGltZSYmYS5nZXRUaW1lKCkhPT1hLmdldFRpbWUoKSl9ZnVuY3Rpb24gbihhKXtyZXR1cm4geShhKSYmIWRhKGEpP2QoYSl8fHU6YX1IZChlLGYsZyxoKTtqYihlLGYsZyxoLGssbCk7dmFyIEE9aCYmaC4kb3B0aW9ucyYmaC4kb3B0aW9ucy50aW1lem9uZSx2O2guJCRwYXJzZXJOYW1lPWE7aC4kcGFyc2Vycy5wdXNoKGZ1bmN0aW9uKGEpe3JldHVybiBoLiRpc0VtcHR5KGEpP251bGw6Yi50ZXN0KGEpPyhhPWQoYSx2KSxBJiYoYT1QYihhLEEpKSxhKTp1fSk7aC4kZm9ybWF0dGVycy5wdXNoKGZ1bmN0aW9uKGEpe2lmKGEmJlxuIWRhKGEpKXRocm93IGxiKFwiZGF0ZWZtdFwiLGEpO2lmKHIoYSkpcmV0dXJuKHY9YSkmJkEmJih2PVBiKHYsQSwhMCkpLG0oXCJkYXRlXCIpKGEsYyxBKTt2PW51bGw7cmV0dXJuXCJcIn0pO2lmKHkoZy5taW4pfHxnLm5nTWluKXt2YXIgcztoLiR2YWxpZGF0b3JzLm1pbj1mdW5jdGlvbihhKXtyZXR1cm4hcihhKXx8cShzKXx8ZChhKT49c307Zy4kb2JzZXJ2ZShcIm1pblwiLGZ1bmN0aW9uKGEpe3M9bihhKTtoLiR2YWxpZGF0ZSgpfSl9aWYoeShnLm1heCl8fGcubmdNYXgpe3ZhciBwO2guJHZhbGlkYXRvcnMubWF4PWZ1bmN0aW9uKGEpe3JldHVybiFyKGEpfHxxKHApfHxkKGEpPD1wfTtnLiRvYnNlcnZlKFwibWF4XCIsZnVuY3Rpb24oYSl7cD1uKGEpO2guJHZhbGlkYXRlKCl9KX19fWZ1bmN0aW9uIEhkKGEsYixkLGMpeyhjLiQkaGFzTmF0aXZlVmFsaWRhdG9ycz1IKGJbMF0udmFsaWRpdHkpKSYmYy4kcGFyc2Vycy5wdXNoKGZ1bmN0aW9uKGEpe3ZhciBjPWIucHJvcChcInZhbGlkaXR5XCIpfHx7fTtcbnJldHVybiBjLmJhZElucHV0JiYhYy50eXBlTWlzbWF0Y2g/dTphfSl9ZnVuY3Rpb24gSWQoYSxiLGQsYyxlKXtpZih5KGMpKXthPWEoYyk7aWYoIWEuY29uc3RhbnQpdGhyb3cgbGIoXCJjb25zdGV4cHJcIixkLGMpO3JldHVybiBhKGIpfXJldHVybiBlfWZ1bmN0aW9uIGxjKGEsYil7YT1cIm5nQ2xhc3NcIithO3JldHVybltcIiRhbmltYXRlXCIsZnVuY3Rpb24oZCl7ZnVuY3Rpb24gYyhhLGIpe3ZhciBjPVtdLGQ9MDthOmZvcig7ZDxhLmxlbmd0aDtkKyspe2Zvcih2YXIgZT1hW2RdLG09MDttPGIubGVuZ3RoO20rKylpZihlPT1iW21dKWNvbnRpbnVlIGE7Yy5wdXNoKGUpfXJldHVybiBjfWZ1bmN0aW9uIGUoYSl7dmFyIGI9W107cmV0dXJuIEkoYSk/KG4oYSxmdW5jdGlvbihhKXtiPWIuY29uY2F0KGUoYSkpfSksYik6RShhKT9hLnNwbGl0KFwiIFwiKTpIKGEpPyhuKGEsZnVuY3Rpb24oYSxjKXthJiYoYj1iLmNvbmNhdChjLnNwbGl0KFwiIFwiKSkpfSksYik6YX1yZXR1cm57cmVzdHJpY3Q6XCJBQ1wiLFxubGluazpmdW5jdGlvbihmLGcsaCl7ZnVuY3Rpb24gayhhLGIpe3ZhciBjPWcuZGF0YShcIiRjbGFzc0NvdW50c1wiKXx8JCgpLGQ9W107bihhLGZ1bmN0aW9uKGEpe2lmKDA8Ynx8Y1thXSljW2FdPShjW2FdfHwwKStiLGNbYV09PT0rKDA8YikmJmQucHVzaChhKX0pO2cuZGF0YShcIiRjbGFzc0NvdW50c1wiLGMpO3JldHVybiBkLmpvaW4oXCIgXCIpfWZ1bmN0aW9uIGwoYSl7aWYoITA9PT1ifHxmLiRpbmRleCUyPT09Yil7dmFyIGw9ZShhfHxbXSk7aWYoIW0pe3ZhciBuPWsobCwxKTtoLiRhZGRDbGFzcyhuKX1lbHNlIGlmKCFtYShhLG0pKXt2YXIgcT1lKG0pLG49YyhsLHEpLGw9YyhxLGwpLG49ayhuLDEpLGw9ayhsLC0xKTtuJiZuLmxlbmd0aCYmZC5hZGRDbGFzcyhnLG4pO2wmJmwubGVuZ3RoJiZkLnJlbW92ZUNsYXNzKGcsbCl9fW09aWEoYSl9dmFyIG07Zi4kd2F0Y2goaFthXSxsLCEwKTtoLiRvYnNlcnZlKFwiY2xhc3NcIixmdW5jdGlvbihiKXtsKGYuJGV2YWwoaFthXSkpfSk7XCJuZ0NsYXNzXCIhPT1cbmEmJmYuJHdhdGNoKFwiJGluZGV4XCIsZnVuY3Rpb24oYyxkKXt2YXIgZz1jJjE7aWYoZyE9PShkJjEpKXt2YXIgbD1lKGYuJGV2YWwoaFthXSkpO2c9PT1iPyhnPWsobCwxKSxoLiRhZGRDbGFzcyhnKSk6KGc9ayhsLC0xKSxoLiRyZW1vdmVDbGFzcyhnKSl9fSl9fX1dfWZ1bmN0aW9uIEdkKGEpe2Z1bmN0aW9uIGIoYSxiKXtiJiYhZlthXT8oay5hZGRDbGFzcyhlLGEpLGZbYV09ITApOiFiJiZmW2FdJiYoay5yZW1vdmVDbGFzcyhlLGEpLGZbYV09ITEpfWZ1bmN0aW9uIGQoYSxjKXthPWE/XCItXCIremMoYSxcIi1cIik6XCJcIjtiKG1iK2EsITA9PT1jKTtiKEpkK2EsITE9PT1jKX12YXIgYz1hLmN0cmwsZT1hLiRlbGVtZW50LGY9e30sZz1hLnNldCxoPWEudW5zZXQsaz1hLiRhbmltYXRlO2ZbSmRdPSEoZlttYl09ZS5oYXNDbGFzcyhtYikpO2MuJHNldFZhbGlkaXR5PWZ1bmN0aW9uKGEsZSxmKXtxKGUpPyhjLiRwZW5kaW5nfHwoYy4kcGVuZGluZz17fSksZyhjLiRwZW5kaW5nLGEsZikpOihjLiRwZW5kaW5nJiZcbmgoYy4kcGVuZGluZyxhLGYpLEtkKGMuJHBlbmRpbmcpJiYoYy4kcGVuZGluZz11KSk7JGEoZSk/ZT8oaChjLiRlcnJvcixhLGYpLGcoYy4kJHN1Y2Nlc3MsYSxmKSk6KGcoYy4kZXJyb3IsYSxmKSxoKGMuJCRzdWNjZXNzLGEsZikpOihoKGMuJGVycm9yLGEsZiksaChjLiQkc3VjY2VzcyxhLGYpKTtjLiRwZW5kaW5nPyhiKExkLCEwKSxjLiR2YWxpZD1jLiRpbnZhbGlkPXUsZChcIlwiLG51bGwpKTooYihMZCwhMSksYy4kdmFsaWQ9S2QoYy4kZXJyb3IpLGMuJGludmFsaWQ9IWMuJHZhbGlkLGQoXCJcIixjLiR2YWxpZCkpO2U9Yy4kcGVuZGluZyYmYy4kcGVuZGluZ1thXT91OmMuJGVycm9yW2FdPyExOmMuJCRzdWNjZXNzW2FdPyEwOm51bGw7ZChhLGUpO2MuJCRwYXJlbnRGb3JtLiRzZXRWYWxpZGl0eShhLGUsYyl9fWZ1bmN0aW9uIEtkKGEpe2lmKGEpZm9yKHZhciBiIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShiKSlyZXR1cm4hMTtyZXR1cm4hMH12YXIgbGc9L15cXC8oLispXFwvKFthLXpdKikkLyxcbkY9ZnVuY3Rpb24oYSl7cmV0dXJuIEUoYSk/YS50b0xvd2VyQ2FzZSgpOmF9LHFhPU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHksc2I9ZnVuY3Rpb24oYSl7cmV0dXJuIEUoYSk/YS50b1VwcGVyQ2FzZSgpOmF9LEhhLEIsb2EscmE9W10uc2xpY2UsUGY9W10uc3BsaWNlLG1nPVtdLnB1c2gsc2E9T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZyxyYz1PYmplY3QuZ2V0UHJvdG90eXBlT2YsQWE9RyhcIm5nXCIpLGZhPVMuYW5ndWxhcnx8KFMuYW5ndWxhcj17fSksU2IsbmI9MDtIYT1YLmRvY3VtZW50TW9kZTt4LiRpbmplY3Q9W107WWEuJGluamVjdD1bXTt2YXIgST1BcnJheS5pc0FycmF5LFZkPS9eXFxbb2JqZWN0ICg/OlVpbnQ4fFVpbnQ4Q2xhbXBlZHxVaW50MTZ8VWludDMyfEludDh8SW50MTZ8SW50MzJ8RmxvYXQzMnxGbG9hdDY0KUFycmF5XFxdJC8sVT1mdW5jdGlvbihhKXtyZXR1cm4gRShhKT9hLnRyaW0oKTphfSx1ZD1mdW5jdGlvbihhKXtyZXR1cm4gYS5yZXBsYWNlKC8oWy0oKVxcW1xcXXt9Kz8qLiRcXF58LDojPCFcXFxcXSkvZyxcblwiXFxcXCQxXCIpLnJlcGxhY2UoL1xceDA4L2csXCJcXFxceDA4XCIpfSxCYT1mdW5jdGlvbigpe2lmKCF5KEJhLnJ1bGVzKSl7dmFyIGE9WC5xdWVyeVNlbGVjdG9yKFwiW25nLWNzcF1cIil8fFgucXVlcnlTZWxlY3RvcihcIltkYXRhLW5nLWNzcF1cIik7aWYoYSl7dmFyIGI9YS5nZXRBdHRyaWJ1dGUoXCJuZy1jc3BcIil8fGEuZ2V0QXR0cmlidXRlKFwiZGF0YS1uZy1jc3BcIik7QmEucnVsZXM9e25vVW5zYWZlRXZhbDohYnx8LTEhPT1iLmluZGV4T2YoXCJuby11bnNhZmUtZXZhbFwiKSxub0lubGluZVN0eWxlOiFifHwtMSE9PWIuaW5kZXhPZihcIm5vLWlubGluZS1zdHlsZVwiKX19ZWxzZXthPUJhO3RyeXtuZXcgRnVuY3Rpb24oXCJcIiksYj0hMX1jYXRjaChkKXtiPSEwfWEucnVsZXM9e25vVW5zYWZlRXZhbDpiLG5vSW5saW5lU3R5bGU6ITF9fX1yZXR1cm4gQmEucnVsZXN9LHBiPWZ1bmN0aW9uKCl7aWYoeShwYi5uYW1lXykpcmV0dXJuIHBiLm5hbWVfO3ZhciBhLGIsZD1PYS5sZW5ndGgsYyxlO2ZvcihiPTA7YjxcbmQ7KytiKWlmKGM9T2FbYl0sYT1YLnF1ZXJ5U2VsZWN0b3IoXCJbXCIrYy5yZXBsYWNlKFwiOlwiLFwiXFxcXDpcIikrXCJqcV1cIikpe2U9YS5nZXRBdHRyaWJ1dGUoYytcImpxXCIpO2JyZWFrfXJldHVybiBwYi5uYW1lXz1lfSxPYT1bXCJuZy1cIixcImRhdGEtbmctXCIsXCJuZzpcIixcIngtbmctXCJdLGJlPS9bQS1aXS9nLEFjPSExLFJiLE5hPTMsZmU9e2Z1bGw6XCIxLjQuOFwiLG1ham9yOjEsbWlub3I6NCxkb3Q6OCxjb2RlTmFtZTpcImljZS1tYW5pcHVsYXRpb25cIn07Ti5leHBhbmRvPVwibmczMzlcIjt2YXIgZ2I9Ti5jYWNoZT17fSxGZj0xO04uX2RhdGE9ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuY2FjaGVbYVt0aGlzLmV4cGFuZG9dXXx8e319O3ZhciBBZj0vKFtcXDpcXC1cXF9dKyguKSkvZyxCZj0vXm1veihbQS1aXSkvLHhiPXttb3VzZWxlYXZlOlwibW91c2VvdXRcIixtb3VzZWVudGVyOlwibW91c2VvdmVyXCJ9LFViPUcoXCJqcUxpdGVcIiksRWY9L148KFtcXHctXSspXFxzKlxcLz8+KD86PFxcL1xcMT58KSQvLFRiPS88fCYjP1xcdys7LyxcbkNmPS88KFtcXHc6LV0rKS8sRGY9LzwoPyFhcmVhfGJyfGNvbHxlbWJlZHxocnxpbWd8aW5wdXR8bGlua3xtZXRhfHBhcmFtKSgoW1xcdzotXSspW14+XSopXFwvPi9naSxrYT17b3B0aW9uOlsxLCc8c2VsZWN0IG11bHRpcGxlPVwibXVsdGlwbGVcIj4nLFwiPC9zZWxlY3Q+XCJdLHRoZWFkOlsxLFwiPHRhYmxlPlwiLFwiPC90YWJsZT5cIl0sY29sOlsyLFwiPHRhYmxlPjxjb2xncm91cD5cIixcIjwvY29sZ3JvdXA+PC90YWJsZT5cIl0sdHI6WzIsXCI8dGFibGU+PHRib2R5PlwiLFwiPC90Ym9keT48L3RhYmxlPlwiXSx0ZDpbMyxcIjx0YWJsZT48dGJvZHk+PHRyPlwiLFwiPC90cj48L3Rib2R5PjwvdGFibGU+XCJdLF9kZWZhdWx0OlswLFwiXCIsXCJcIl19O2thLm9wdGdyb3VwPWthLm9wdGlvbjtrYS50Ym9keT1rYS50Zm9vdD1rYS5jb2xncm91cD1rYS5jYXB0aW9uPWthLnRoZWFkO2thLnRoPWthLnRkO3ZhciBLZj1Ob2RlLnByb3RvdHlwZS5jb250YWluc3x8ZnVuY3Rpb24oYSl7cmV0dXJuISEodGhpcy5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihhKSZcbjE2KX0sUGE9Ti5wcm90b3R5cGU9e3JlYWR5OmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoKXtkfHwoZD0hMCxhKCkpfXZhciBkPSExO1wiY29tcGxldGVcIj09PVgucmVhZHlTdGF0ZT9zZXRUaW1lb3V0KGIpOih0aGlzLm9uKFwiRE9NQ29udGVudExvYWRlZFwiLGIpLE4oUykub24oXCJsb2FkXCIsYikpfSx0b1N0cmluZzpmdW5jdGlvbigpe3ZhciBhPVtdO24odGhpcyxmdW5jdGlvbihiKXthLnB1c2goXCJcIitiKX0pO3JldHVyblwiW1wiK2Euam9pbihcIiwgXCIpK1wiXVwifSxlcTpmdW5jdGlvbihhKXtyZXR1cm4gMDw9YT9CKHRoaXNbYV0pOkIodGhpc1t0aGlzLmxlbmd0aCthXSl9LGxlbmd0aDowLHB1c2g6bWcsc29ydDpbXS5zb3J0LHNwbGljZTpbXS5zcGxpY2V9LENiPXt9O24oXCJtdWx0aXBsZSBzZWxlY3RlZCBjaGVja2VkIGRpc2FibGVkIHJlYWRPbmx5IHJlcXVpcmVkIG9wZW5cIi5zcGxpdChcIiBcIiksZnVuY3Rpb24oYSl7Q2JbRihhKV09YX0pO3ZhciBSYz17fTtuKFwiaW5wdXQgc2VsZWN0IG9wdGlvbiB0ZXh0YXJlYSBidXR0b24gZm9ybSBkZXRhaWxzXCIuc3BsaXQoXCIgXCIpLFxuZnVuY3Rpb24oYSl7UmNbYV09ITB9KTt2YXIgWmM9e25nTWlubGVuZ3RoOlwibWlubGVuZ3RoXCIsbmdNYXhsZW5ndGg6XCJtYXhsZW5ndGhcIixuZ01pbjpcIm1pblwiLG5nTWF4OlwibWF4XCIsbmdQYXR0ZXJuOlwicGF0dGVyblwifTtuKHtkYXRhOldiLHJlbW92ZURhdGE6dmIsaGFzRGF0YTpmdW5jdGlvbihhKXtmb3IodmFyIGIgaW4gZ2JbYS5uZzMzOV0pcmV0dXJuITA7cmV0dXJuITF9fSxmdW5jdGlvbihhLGIpe05bYl09YX0pO24oe2RhdGE6V2IsaW5oZXJpdGVkRGF0YTpCYixzY29wZTpmdW5jdGlvbihhKXtyZXR1cm4gQi5kYXRhKGEsXCIkc2NvcGVcIil8fEJiKGEucGFyZW50Tm9kZXx8YSxbXCIkaXNvbGF0ZVNjb3BlXCIsXCIkc2NvcGVcIl0pfSxpc29sYXRlU2NvcGU6ZnVuY3Rpb24oYSl7cmV0dXJuIEIuZGF0YShhLFwiJGlzb2xhdGVTY29wZVwiKXx8Qi5kYXRhKGEsXCIkaXNvbGF0ZVNjb3BlTm9UZW1wbGF0ZVwiKX0sY29udHJvbGxlcjpPYyxpbmplY3RvcjpmdW5jdGlvbihhKXtyZXR1cm4gQmIoYSxcblwiJGluamVjdG9yXCIpfSxyZW1vdmVBdHRyOmZ1bmN0aW9uKGEsYil7YS5yZW1vdmVBdHRyaWJ1dGUoYil9LGhhc0NsYXNzOnliLGNzczpmdW5jdGlvbihhLGIsZCl7Yj1mYihiKTtpZih5KGQpKWEuc3R5bGVbYl09ZDtlbHNlIHJldHVybiBhLnN0eWxlW2JdfSxhdHRyOmZ1bmN0aW9uKGEsYixkKXt2YXIgYz1hLm5vZGVUeXBlO2lmKGMhPT1OYSYmMiE9PWMmJjghPT1jKWlmKGM9RihiKSxDYltjXSlpZih5KGQpKWQ/KGFbYl09ITAsYS5zZXRBdHRyaWJ1dGUoYixjKSk6KGFbYl09ITEsYS5yZW1vdmVBdHRyaWJ1dGUoYykpO2Vsc2UgcmV0dXJuIGFbYl18fChhLmF0dHJpYnV0ZXMuZ2V0TmFtZWRJdGVtKGIpfHx4KS5zcGVjaWZpZWQ/Yzp1O2Vsc2UgaWYoeShkKSlhLnNldEF0dHJpYnV0ZShiLGQpO2Vsc2UgaWYoYS5nZXRBdHRyaWJ1dGUpcmV0dXJuIGE9YS5nZXRBdHRyaWJ1dGUoYiwyKSxudWxsPT09YT91OmF9LHByb3A6ZnVuY3Rpb24oYSxiLGQpe2lmKHkoZCkpYVtiXT1kO2Vsc2UgcmV0dXJuIGFbYl19LFxudGV4dDpmdW5jdGlvbigpe2Z1bmN0aW9uIGEoYSxkKXtpZihxKGQpKXt2YXIgYz1hLm5vZGVUeXBlO3JldHVybiAxPT09Y3x8Yz09PU5hP2EudGV4dENvbnRlbnQ6XCJcIn1hLnRleHRDb250ZW50PWR9YS4kZHY9XCJcIjtyZXR1cm4gYX0oKSx2YWw6ZnVuY3Rpb24oYSxiKXtpZihxKGIpKXtpZihhLm11bHRpcGxlJiZcInNlbGVjdFwiPT09dGEoYSkpe3ZhciBkPVtdO24oYS5vcHRpb25zLGZ1bmN0aW9uKGEpe2Euc2VsZWN0ZWQmJmQucHVzaChhLnZhbHVlfHxhLnRleHQpfSk7cmV0dXJuIDA9PT1kLmxlbmd0aD9udWxsOmR9cmV0dXJuIGEudmFsdWV9YS52YWx1ZT1ifSxodG1sOmZ1bmN0aW9uKGEsYil7aWYocShiKSlyZXR1cm4gYS5pbm5lckhUTUw7dWIoYSwhMCk7YS5pbm5lckhUTUw9Yn0sZW1wdHk6UGN9LGZ1bmN0aW9uKGEsYil7Ti5wcm90b3R5cGVbYl09ZnVuY3Rpb24oYixjKXt2YXIgZSxmLGc9dGhpcy5sZW5ndGg7aWYoYSE9PVBjJiZxKDI9PWEubGVuZ3RoJiZhIT09eWImJmEhPT1PYz9cbmI6Yykpe2lmKEgoYikpe2ZvcihlPTA7ZTxnO2UrKylpZihhPT09V2IpYSh0aGlzW2VdLGIpO2Vsc2UgZm9yKGYgaW4gYilhKHRoaXNbZV0sZixiW2ZdKTtyZXR1cm4gdGhpc31lPWEuJGR2O2c9cShlKT9NYXRoLm1pbihnLDEpOmc7Zm9yKGY9MDtmPGc7ZisrKXt2YXIgaD1hKHRoaXNbZl0sYixjKTtlPWU/ZStoOmh9cmV0dXJuIGV9Zm9yKGU9MDtlPGc7ZSsrKWEodGhpc1tlXSxiLGMpO3JldHVybiB0aGlzfX0pO24oe3JlbW92ZURhdGE6dmIsb246ZnVuY3Rpb24oYSxiLGQsYyl7aWYoeShjKSl0aHJvdyBVYihcIm9uYXJnc1wiKTtpZihLYyhhKSl7Yz13YihhLCEwKTt2YXIgZT1jLmV2ZW50cyxmPWMuaGFuZGxlO2Z8fChmPWMuaGFuZGxlPUhmKGEsZSkpO2M9MDw9Yi5pbmRleE9mKFwiIFwiKT9iLnNwbGl0KFwiIFwiKTpbYl07Zm9yKHZhciBnPWMubGVuZ3RoLGg9ZnVuY3Rpb24oYixjLGcpe3ZhciBoPWVbYl07aHx8KGg9ZVtiXT1bXSxoLnNwZWNpYWxIYW5kbGVyV3JhcHBlcj1jLFwiJGRlc3Ryb3lcIj09PVxuYnx8Z3x8YS5hZGRFdmVudExpc3RlbmVyKGIsZiwhMSkpO2gucHVzaChkKX07Zy0tOyliPWNbZ10seGJbYl0/KGgoeGJbYl0sSmYpLGgoYix1LCEwKSk6aChiKX19LG9mZjpOYyxvbmU6ZnVuY3Rpb24oYSxiLGQpe2E9QihhKTthLm9uKGIsZnVuY3Rpb24gZSgpe2Eub2ZmKGIsZCk7YS5vZmYoYixlKX0pO2Eub24oYixkKX0scmVwbGFjZVdpdGg6ZnVuY3Rpb24oYSxiKXt2YXIgZCxjPWEucGFyZW50Tm9kZTt1YihhKTtuKG5ldyBOKGIpLGZ1bmN0aW9uKGIpe2Q/Yy5pbnNlcnRCZWZvcmUoYixkLm5leHRTaWJsaW5nKTpjLnJlcGxhY2VDaGlsZChiLGEpO2Q9Yn0pfSxjaGlsZHJlbjpmdW5jdGlvbihhKXt2YXIgYj1bXTtuKGEuY2hpbGROb2RlcyxmdW5jdGlvbihhKXsxPT09YS5ub2RlVHlwZSYmYi5wdXNoKGEpfSk7cmV0dXJuIGJ9LGNvbnRlbnRzOmZ1bmN0aW9uKGEpe3JldHVybiBhLmNvbnRlbnREb2N1bWVudHx8YS5jaGlsZE5vZGVzfHxbXX0sYXBwZW5kOmZ1bmN0aW9uKGEsYil7dmFyIGQ9XG5hLm5vZGVUeXBlO2lmKDE9PT1kfHwxMT09PWQpe2I9bmV3IE4oYik7Zm9yKHZhciBkPTAsYz1iLmxlbmd0aDtkPGM7ZCsrKWEuYXBwZW5kQ2hpbGQoYltkXSl9fSxwcmVwZW5kOmZ1bmN0aW9uKGEsYil7aWYoMT09PWEubm9kZVR5cGUpe3ZhciBkPWEuZmlyc3RDaGlsZDtuKG5ldyBOKGIpLGZ1bmN0aW9uKGIpe2EuaW5zZXJ0QmVmb3JlKGIsZCl9KX19LHdyYXA6ZnVuY3Rpb24oYSxiKXtiPUIoYikuZXEoMCkuY2xvbmUoKVswXTt2YXIgZD1hLnBhcmVudE5vZGU7ZCYmZC5yZXBsYWNlQ2hpbGQoYixhKTtiLmFwcGVuZENoaWxkKGEpfSxyZW1vdmU6WGIsZGV0YWNoOmZ1bmN0aW9uKGEpe1hiKGEsITApfSxhZnRlcjpmdW5jdGlvbihhLGIpe3ZhciBkPWEsYz1hLnBhcmVudE5vZGU7Yj1uZXcgTihiKTtmb3IodmFyIGU9MCxmPWIubGVuZ3RoO2U8ZjtlKyspe3ZhciBnPWJbZV07Yy5pbnNlcnRCZWZvcmUoZyxkLm5leHRTaWJsaW5nKTtkPWd9fSxhZGRDbGFzczpBYixyZW1vdmVDbGFzczp6YixcbnRvZ2dsZUNsYXNzOmZ1bmN0aW9uKGEsYixkKXtiJiZuKGIuc3BsaXQoXCIgXCIpLGZ1bmN0aW9uKGIpe3ZhciBlPWQ7cShlKSYmKGU9IXliKGEsYikpOyhlP0FiOnpiKShhLGIpfSl9LHBhcmVudDpmdW5jdGlvbihhKXtyZXR1cm4oYT1hLnBhcmVudE5vZGUpJiYxMSE9PWEubm9kZVR5cGU/YTpudWxsfSxuZXh0OmZ1bmN0aW9uKGEpe3JldHVybiBhLm5leHRFbGVtZW50U2libGluZ30sZmluZDpmdW5jdGlvbihhLGIpe3JldHVybiBhLmdldEVsZW1lbnRzQnlUYWdOYW1lP2EuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYik6W119LGNsb25lOlZiLHRyaWdnZXJIYW5kbGVyOmZ1bmN0aW9uKGEsYixkKXt2YXIgYyxlLGY9Yi50eXBlfHxiLGc9d2IoYSk7aWYoZz0oZz1nJiZnLmV2ZW50cykmJmdbZl0pYz17cHJldmVudERlZmF1bHQ6ZnVuY3Rpb24oKXt0aGlzLmRlZmF1bHRQcmV2ZW50ZWQ9ITB9LGlzRGVmYXVsdFByZXZlbnRlZDpmdW5jdGlvbigpe3JldHVybiEwPT09dGhpcy5kZWZhdWx0UHJldmVudGVkfSxcbnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbjpmdW5jdGlvbigpe3RoaXMuaW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkPSEwfSxpc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZDpmdW5jdGlvbigpe3JldHVybiEwPT09dGhpcy5pbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWR9LHN0b3BQcm9wYWdhdGlvbjp4LHR5cGU6Zix0YXJnZXQ6YX0sYi50eXBlJiYoYz1NKGMsYikpLGI9aWEoZyksZT1kP1tjXS5jb25jYXQoZCk6W2NdLG4oYixmdW5jdGlvbihiKXtjLmlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkKCl8fGIuYXBwbHkoYSxlKX0pfX0sZnVuY3Rpb24oYSxiKXtOLnByb3RvdHlwZVtiXT1mdW5jdGlvbihiLGMsZSl7Zm9yKHZhciBmLGc9MCxoPXRoaXMubGVuZ3RoO2c8aDtnKyspcShmKT8oZj1hKHRoaXNbZ10sYixjLGUpLHkoZikmJihmPUIoZikpKTpNYyhmLGEodGhpc1tnXSxiLGMsZSkpO3JldHVybiB5KGYpP2Y6dGhpc307Ti5wcm90b3R5cGUuYmluZD1OLnByb3RvdHlwZS5vbjtcbk4ucHJvdG90eXBlLnVuYmluZD1OLnByb3RvdHlwZS5vZmZ9KTtTYS5wcm90b3R5cGU9e3B1dDpmdW5jdGlvbihhLGIpe3RoaXNbQ2EoYSx0aGlzLm5leHRVaWQpXT1ifSxnZXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXNbQ2EoYSx0aGlzLm5leHRVaWQpXX0scmVtb3ZlOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXNbYT1DYShhLHRoaXMubmV4dFVpZCldO2RlbGV0ZSB0aGlzW2FdO3JldHVybiBifX07dmFyIHlmPVtmdW5jdGlvbigpe3RoaXMuJGdldD1bZnVuY3Rpb24oKXtyZXR1cm4gU2F9XX1dLFRjPS9eW15cXChdKlxcKFxccyooW15cXCldKilcXCkvbSxuZz0vLC8sb2c9L15cXHMqKF8/KShcXFMrPylcXDFcXHMqJC8sU2M9LygoXFwvXFwvLiokKXwoXFwvXFwqW1xcc1xcU10qP1xcKlxcLykpL21nLERhPUcoXCIkaW5qZWN0b3JcIik7ZWIuJCRhbm5vdGF0ZT1mdW5jdGlvbihhLGIsZCl7dmFyIGM7aWYoXCJmdW5jdGlvblwiPT09dHlwZW9mIGEpe2lmKCEoYz1hLiRpbmplY3QpKXtjPVtdO2lmKGEubGVuZ3RoKXtpZihiKXRocm93IEUoZCkmJlxuZHx8KGQ9YS5uYW1lfHxMZihhKSksRGEoXCJzdHJpY3RkaVwiLGQpO2I9YS50b1N0cmluZygpLnJlcGxhY2UoU2MsXCJcIik7Yj1iLm1hdGNoKFRjKTtuKGJbMV0uc3BsaXQobmcpLGZ1bmN0aW9uKGEpe2EucmVwbGFjZShvZyxmdW5jdGlvbihhLGIsZCl7Yy5wdXNoKGQpfSl9KX1hLiRpbmplY3Q9Y319ZWxzZSBJKGEpPyhiPWEubGVuZ3RoLTEsUWEoYVtiXSxcImZuXCIpLGM9YS5zbGljZSgwLGIpKTpRYShhLFwiZm5cIiwhMCk7cmV0dXJuIGN9O3ZhciBNZD1HKFwiJGFuaW1hdGVcIiksVWU9ZnVuY3Rpb24oKXt0aGlzLiRnZXQ9W1wiJHFcIixcIiQkckFGXCIsZnVuY3Rpb24oYSxiKXtmdW5jdGlvbiBkKCl7fWQuYWxsPXg7ZC5jaGFpbj14O2QucHJvdG90eXBlPXtlbmQ6eCxjYW5jZWw6eCxyZXN1bWU6eCxwYXVzZTp4LGNvbXBsZXRlOngsdGhlbjpmdW5jdGlvbihjLGQpe3JldHVybiBhKGZ1bmN0aW9uKGEpe2IoZnVuY3Rpb24oKXthKCl9KX0pLnRoZW4oYyxkKX19O3JldHVybiBkfV19LFRlPWZ1bmN0aW9uKCl7dmFyIGE9XG5uZXcgU2EsYj1bXTt0aGlzLiRnZXQ9W1wiJCRBbmltYXRlUnVubmVyXCIsXCIkcm9vdFNjb3BlXCIsZnVuY3Rpb24oZCxjKXtmdW5jdGlvbiBlKGEsYixjKXt2YXIgZD0hMTtiJiYoYj1FKGIpP2Iuc3BsaXQoXCIgXCIpOkkoYik/YjpbXSxuKGIsZnVuY3Rpb24oYil7YiYmKGQ9ITAsYVtiXT1jKX0pKTtyZXR1cm4gZH1mdW5jdGlvbiBmKCl7bihiLGZ1bmN0aW9uKGIpe3ZhciBjPWEuZ2V0KGIpO2lmKGMpe3ZhciBkPU1mKGIuYXR0cihcImNsYXNzXCIpKSxlPVwiXCIsZj1cIlwiO24oYyxmdW5jdGlvbihhLGIpe2EhPT0hIWRbYl0mJihhP2UrPShlLmxlbmd0aD9cIiBcIjpcIlwiKStiOmYrPShmLmxlbmd0aD9cIiBcIjpcIlwiKStiKX0pO24oYixmdW5jdGlvbihhKXtlJiZBYihhLGUpO2YmJnpiKGEsZil9KTthLnJlbW92ZShiKX19KTtiLmxlbmd0aD0wfXJldHVybntlbmFibGVkOngsb246eCxvZmY6eCxwaW46eCxwdXNoOmZ1bmN0aW9uKGcsaCxrLGwpe2wmJmwoKTtrPWt8fHt9O2suZnJvbSYmZy5jc3Moay5mcm9tKTtcbmsudG8mJmcuY3NzKGsudG8pO2lmKGsuYWRkQ2xhc3N8fGsucmVtb3ZlQ2xhc3MpaWYoaD1rLmFkZENsYXNzLGw9ay5yZW1vdmVDbGFzcyxrPWEuZ2V0KGcpfHx7fSxoPWUoayxoLCEwKSxsPWUoayxsLCExKSxofHxsKWEucHV0KGcsayksYi5wdXNoKGcpLDE9PT1iLmxlbmd0aCYmYy4kJHBvc3REaWdlc3QoZik7cmV0dXJuIG5ldyBkfX19XX0sUmU9W1wiJHByb3ZpZGVcIixmdW5jdGlvbihhKXt2YXIgYj10aGlzO3RoaXMuJCRyZWdpc3RlcmVkQW5pbWF0aW9ucz1PYmplY3QuY3JlYXRlKG51bGwpO3RoaXMucmVnaXN0ZXI9ZnVuY3Rpb24oZCxjKXtpZihkJiZcIi5cIiE9PWQuY2hhckF0KDApKXRocm93IE1kKFwibm90Y3NlbFwiLGQpO3ZhciBlPWQrXCItYW5pbWF0aW9uXCI7Yi4kJHJlZ2lzdGVyZWRBbmltYXRpb25zW2Quc3Vic3RyKDEpXT1lO2EuZmFjdG9yeShlLGMpfTt0aGlzLmNsYXNzTmFtZUZpbHRlcj1mdW5jdGlvbihhKXtpZigxPT09YXJndW1lbnRzLmxlbmd0aCYmKHRoaXMuJCRjbGFzc05hbWVGaWx0ZXI9XG5hIGluc3RhbmNlb2YgUmVnRXhwP2E6bnVsbCkmJi8oXFxzK3xcXC8pbmctYW5pbWF0ZShcXHMrfFxcLykvLnRlc3QodGhpcy4kJGNsYXNzTmFtZUZpbHRlci50b1N0cmluZygpKSl0aHJvdyBNZChcIm5vbmdjbHNcIixcIm5nLWFuaW1hdGVcIik7cmV0dXJuIHRoaXMuJCRjbGFzc05hbWVGaWx0ZXJ9O3RoaXMuJGdldD1bXCIkJGFuaW1hdGVRdWV1ZVwiLGZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYSxjLGQpe2lmKGQpe3ZhciBoO2E6e2ZvcihoPTA7aDxkLmxlbmd0aDtoKyspe3ZhciBrPWRbaF07aWYoMT09PWsubm9kZVR5cGUpe2g9azticmVhayBhfX1oPXZvaWQgMH0haHx8aC5wYXJlbnROb2RlfHxoLnByZXZpb3VzRWxlbWVudFNpYmxpbmd8fChkPW51bGwpfWQ/ZC5hZnRlcihhKTpjLnByZXBlbmQoYSl9cmV0dXJue29uOmEub24sb2ZmOmEub2ZmLHBpbjphLnBpbixlbmFibGVkOmEuZW5hYmxlZCxjYW5jZWw6ZnVuY3Rpb24oYSl7YS5lbmQmJmEuZW5kKCl9LGVudGVyOmZ1bmN0aW9uKGUsZixnLGgpe2Y9XG5mJiZCKGYpO2c9ZyYmQihnKTtmPWZ8fGcucGFyZW50KCk7YihlLGYsZyk7cmV0dXJuIGEucHVzaChlLFwiZW50ZXJcIixFYShoKSl9LG1vdmU6ZnVuY3Rpb24oZSxmLGcsaCl7Zj1mJiZCKGYpO2c9ZyYmQihnKTtmPWZ8fGcucGFyZW50KCk7YihlLGYsZyk7cmV0dXJuIGEucHVzaChlLFwibW92ZVwiLEVhKGgpKX0sbGVhdmU6ZnVuY3Rpb24oYixjKXtyZXR1cm4gYS5wdXNoKGIsXCJsZWF2ZVwiLEVhKGMpLGZ1bmN0aW9uKCl7Yi5yZW1vdmUoKX0pfSxhZGRDbGFzczpmdW5jdGlvbihiLGMsZyl7Zz1FYShnKTtnLmFkZENsYXNzPWhiKGcuYWRkY2xhc3MsYyk7cmV0dXJuIGEucHVzaChiLFwiYWRkQ2xhc3NcIixnKX0scmVtb3ZlQ2xhc3M6ZnVuY3Rpb24oYixjLGcpe2c9RWEoZyk7Zy5yZW1vdmVDbGFzcz1oYihnLnJlbW92ZUNsYXNzLGMpO3JldHVybiBhLnB1c2goYixcInJlbW92ZUNsYXNzXCIsZyl9LHNldENsYXNzOmZ1bmN0aW9uKGIsYyxnLGgpe2g9RWEoaCk7aC5hZGRDbGFzcz1oYihoLmFkZENsYXNzLFxuYyk7aC5yZW1vdmVDbGFzcz1oYihoLnJlbW92ZUNsYXNzLGcpO3JldHVybiBhLnB1c2goYixcInNldENsYXNzXCIsaCl9LGFuaW1hdGU6ZnVuY3Rpb24oYixjLGcsaCxrKXtrPUVhKGspO2suZnJvbT1rLmZyb20/TShrLmZyb20sYyk6YztrLnRvPWsudG8/TShrLnRvLGcpOmc7ay50ZW1wQ2xhc3Nlcz1oYihrLnRlbXBDbGFzc2VzLGh8fFwibmctaW5saW5lLWFuaW1hdGVcIik7cmV0dXJuIGEucHVzaChiLFwiYW5pbWF0ZVwiLGspfX19XX1dLFNlPWZ1bmN0aW9uKCl7dGhpcy4kZ2V0PVtcIiQkckFGXCIsXCIkcVwiLGZ1bmN0aW9uKGEsYil7dmFyIGQ9ZnVuY3Rpb24oKXt9O2QucHJvdG90eXBlPXtkb25lOmZ1bmN0aW9uKGEpe3RoaXMuZGVmZXImJnRoaXMuZGVmZXJbITA9PT1hP1wicmVqZWN0XCI6XCJyZXNvbHZlXCJdKCl9LGVuZDpmdW5jdGlvbigpe3RoaXMuZG9uZSgpfSxjYW5jZWw6ZnVuY3Rpb24oKXt0aGlzLmRvbmUoITApfSxnZXRQcm9taXNlOmZ1bmN0aW9uKCl7dGhpcy5kZWZlcnx8KHRoaXMuZGVmZXI9XG5iLmRlZmVyKCkpO3JldHVybiB0aGlzLmRlZmVyLnByb21pc2V9LHRoZW46ZnVuY3Rpb24oYSxiKXtyZXR1cm4gdGhpcy5nZXRQcm9taXNlKCkudGhlbihhLGIpfSxcImNhdGNoXCI6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuZ2V0UHJvbWlzZSgpW1wiY2F0Y2hcIl0oYSl9LFwiZmluYWxseVwiOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmdldFByb21pc2UoKVtcImZpbmFsbHlcIl0oYSl9fTtyZXR1cm4gZnVuY3Rpb24oYixlKXtmdW5jdGlvbiBmKCl7YShmdW5jdGlvbigpe2UuYWRkQ2xhc3MmJihiLmFkZENsYXNzKGUuYWRkQ2xhc3MpLGUuYWRkQ2xhc3M9bnVsbCk7ZS5yZW1vdmVDbGFzcyYmKGIucmVtb3ZlQ2xhc3MoZS5yZW1vdmVDbGFzcyksZS5yZW1vdmVDbGFzcz1udWxsKTtlLnRvJiYoYi5jc3MoZS50byksZS50bz1udWxsKTtnfHxoLmRvbmUoKTtnPSEwfSk7cmV0dXJuIGh9ZS5jbGVhbnVwU3R5bGVzJiYoZS5mcm9tPWUudG89bnVsbCk7ZS5mcm9tJiYoYi5jc3MoZS5mcm9tKSxlLmZyb209XG5udWxsKTt2YXIgZyxoPW5ldyBkO3JldHVybntzdGFydDpmLGVuZDpmfX19XX0saGE9RyhcIiRjb21waWxlXCIpO0NjLiRpbmplY3Q9W1wiJHByb3ZpZGVcIixcIiQkc2FuaXRpemVVcmlQcm92aWRlclwiXTt2YXIgVmM9L14oKD86eHxkYXRhKVtcXDpcXC1fXSkvaSxRZj1HKFwiJGNvbnRyb2xsZXJcIiksVWM9L14oXFxTKykoXFxzK2FzXFxzKyhcXHcrKSk/JC8sJGU9ZnVuY3Rpb24oKXt0aGlzLiRnZXQ9W1wiJGRvY3VtZW50XCIsZnVuY3Rpb24oYSl7cmV0dXJuIGZ1bmN0aW9uKGIpe2I/IWIubm9kZVR5cGUmJmIgaW5zdGFuY2VvZiBCJiYoYj1iWzBdKTpiPWFbMF0uYm9keTtyZXR1cm4gYi5vZmZzZXRXaWR0aCsxfX1dfSwkYz1cImFwcGxpY2F0aW9uL2pzb25cIixhYz17XCJDb250ZW50LVR5cGVcIjokYytcIjtjaGFyc2V0PXV0Zi04XCJ9LFNmPS9eXFxbfF5cXHsoPyFcXHspLyxUZj17XCJbXCI6L10kLyxcIntcIjovfSQvfSxSZj0vXlxcKVxcXVxcfScsP1xcbi8scGc9RyhcIiRodHRwXCIpLGRkPWZ1bmN0aW9uKGEpe3JldHVybiBmdW5jdGlvbigpe3Rocm93IHBnKFwibGVnYWN5XCIsXG5hKTt9fSxKYT1mYS4kaW50ZXJwb2xhdGVNaW5FcnI9RyhcIiRpbnRlcnBvbGF0ZVwiKTtKYS50aHJvd05vY29uY2F0PWZ1bmN0aW9uKGEpe3Rocm93IEphKFwibm9jb25jYXRcIixhKTt9O0phLmludGVycj1mdW5jdGlvbihhLGIpe3JldHVybiBKYShcImludGVyclwiLGEsYi50b1N0cmluZygpKX07dmFyIHFnPS9eKFteXFw/I10qKShcXD8oW14jXSopKT8oIyguKikpPyQvLFZmPXtodHRwOjgwLGh0dHBzOjQ0MyxmdHA6MjF9LERiPUcoXCIkbG9jYXRpb25cIikscmc9eyQkaHRtbDU6ITEsJCRyZXBsYWNlOiExLGFic1VybDpFYihcIiQkYWJzVXJsXCIpLHVybDpmdW5jdGlvbihhKXtpZihxKGEpKXJldHVybiB0aGlzLiQkdXJsO3ZhciBiPXFnLmV4ZWMoYSk7KGJbMV18fFwiXCI9PT1hKSYmdGhpcy5wYXRoKGRlY29kZVVSSUNvbXBvbmVudChiWzFdKSk7KGJbMl18fGJbMV18fFwiXCI9PT1hKSYmdGhpcy5zZWFyY2goYlszXXx8XCJcIik7dGhpcy5oYXNoKGJbNV18fFwiXCIpO3JldHVybiB0aGlzfSxwcm90b2NvbDpFYihcIiQkcHJvdG9jb2xcIiksXG5ob3N0OkViKFwiJCRob3N0XCIpLHBvcnQ6RWIoXCIkJHBvcnRcIikscGF0aDppZChcIiQkcGF0aFwiLGZ1bmN0aW9uKGEpe2E9bnVsbCE9PWE/YS50b1N0cmluZygpOlwiXCI7cmV0dXJuXCIvXCI9PWEuY2hhckF0KDApP2E6XCIvXCIrYX0pLHNlYXJjaDpmdW5jdGlvbihhLGIpe3N3aXRjaChhcmd1bWVudHMubGVuZ3RoKXtjYXNlIDA6cmV0dXJuIHRoaXMuJCRzZWFyY2g7Y2FzZSAxOmlmKEUoYSl8fFEoYSkpYT1hLnRvU3RyaW5nKCksdGhpcy4kJHNlYXJjaD14YyhhKTtlbHNlIGlmKEgoYSkpYT1iYihhLHt9KSxuKGEsZnVuY3Rpb24oYixjKXtudWxsPT1iJiZkZWxldGUgYVtjXX0pLHRoaXMuJCRzZWFyY2g9YTtlbHNlIHRocm93IERiKFwiaXNyY2hhcmdcIik7YnJlYWs7ZGVmYXVsdDpxKGIpfHxudWxsPT09Yj9kZWxldGUgdGhpcy4kJHNlYXJjaFthXTp0aGlzLiQkc2VhcmNoW2FdPWJ9dGhpcy4kJGNvbXBvc2UoKTtyZXR1cm4gdGhpc30saGFzaDppZChcIiQkaGFzaFwiLGZ1bmN0aW9uKGEpe3JldHVybiBudWxsIT09XG5hP2EudG9TdHJpbmcoKTpcIlwifSkscmVwbGFjZTpmdW5jdGlvbigpe3RoaXMuJCRyZXBsYWNlPSEwO3JldHVybiB0aGlzfX07bihbaGQsZGMsY2NdLGZ1bmN0aW9uKGEpe2EucHJvdG90eXBlPU9iamVjdC5jcmVhdGUocmcpO2EucHJvdG90eXBlLnN0YXRlPWZ1bmN0aW9uKGIpe2lmKCFhcmd1bWVudHMubGVuZ3RoKXJldHVybiB0aGlzLiQkc3RhdGU7aWYoYSE9PWNjfHwhdGhpcy4kJGh0bWw1KXRocm93IERiKFwibm9zdGF0ZVwiKTt0aGlzLiQkc3RhdGU9cShiKT9udWxsOmI7cmV0dXJuIHRoaXN9fSk7dmFyIGJhPUcoXCIkcGFyc2VcIiksV2Y9RnVuY3Rpb24ucHJvdG90eXBlLmNhbGwsWGY9RnVuY3Rpb24ucHJvdG90eXBlLmFwcGx5LFlmPUZ1bmN0aW9uLnByb3RvdHlwZS5iaW5kLExiPSQoKTtuKFwiKyAtICogLyAlID09PSAhPT0gPT0gIT0gPCA+IDw9ID49ICYmIHx8ICEgPSB8XCIuc3BsaXQoXCIgXCIpLGZ1bmN0aW9uKGEpe0xiW2FdPSEwfSk7dmFyIHNnPXtuOlwiXFxuXCIsZjpcIlxcZlwiLHI6XCJcXHJcIixcbnQ6XCJcXHRcIix2OlwiXFx2XCIsXCInXCI6XCInXCIsJ1wiJzonXCInfSxmYz1mdW5jdGlvbihhKXt0aGlzLm9wdGlvbnM9YX07ZmMucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpmYyxsZXg6ZnVuY3Rpb24oYSl7dGhpcy50ZXh0PWE7dGhpcy5pbmRleD0wO2Zvcih0aGlzLnRva2Vucz1bXTt0aGlzLmluZGV4PHRoaXMudGV4dC5sZW5ndGg7KWlmKGE9dGhpcy50ZXh0LmNoYXJBdCh0aGlzLmluZGV4KSwnXCInPT09YXx8XCInXCI9PT1hKXRoaXMucmVhZFN0cmluZyhhKTtlbHNlIGlmKHRoaXMuaXNOdW1iZXIoYSl8fFwiLlwiPT09YSYmdGhpcy5pc051bWJlcih0aGlzLnBlZWsoKSkpdGhpcy5yZWFkTnVtYmVyKCk7ZWxzZSBpZih0aGlzLmlzSWRlbnQoYSkpdGhpcy5yZWFkSWRlbnQoKTtlbHNlIGlmKHRoaXMuaXMoYSxcIigpe31bXS4sOzo/XCIpKXRoaXMudG9rZW5zLnB1c2goe2luZGV4OnRoaXMuaW5kZXgsdGV4dDphfSksdGhpcy5pbmRleCsrO2Vsc2UgaWYodGhpcy5pc1doaXRlc3BhY2UoYSkpdGhpcy5pbmRleCsrO1xuZWxzZXt2YXIgYj1hK3RoaXMucGVlaygpLGQ9Yit0aGlzLnBlZWsoMiksYz1MYltiXSxlPUxiW2RdO0xiW2FdfHxjfHxlPyhhPWU/ZDpjP2I6YSx0aGlzLnRva2Vucy5wdXNoKHtpbmRleDp0aGlzLmluZGV4LHRleHQ6YSxvcGVyYXRvcjohMH0pLHRoaXMuaW5kZXgrPWEubGVuZ3RoKTp0aGlzLnRocm93RXJyb3IoXCJVbmV4cGVjdGVkIG5leHQgY2hhcmFjdGVyIFwiLHRoaXMuaW5kZXgsdGhpcy5pbmRleCsxKX1yZXR1cm4gdGhpcy50b2tlbnN9LGlzOmZ1bmN0aW9uKGEsYil7cmV0dXJuLTEhPT1iLmluZGV4T2YoYSl9LHBlZWs6ZnVuY3Rpb24oYSl7YT1hfHwxO3JldHVybiB0aGlzLmluZGV4K2E8dGhpcy50ZXh0Lmxlbmd0aD90aGlzLnRleHQuY2hhckF0KHRoaXMuaW5kZXgrYSk6ITF9LGlzTnVtYmVyOmZ1bmN0aW9uKGEpe3JldHVyblwiMFwiPD1hJiZcIjlcIj49YSYmXCJzdHJpbmdcIj09PXR5cGVvZiBhfSxpc1doaXRlc3BhY2U6ZnVuY3Rpb24oYSl7cmV0dXJuXCIgXCI9PT1hfHxcIlxcclwiPT09YXx8XG5cIlxcdFwiPT09YXx8XCJcXG5cIj09PWF8fFwiXFx2XCI9PT1hfHxcIlxcdTAwYTBcIj09PWF9LGlzSWRlbnQ6ZnVuY3Rpb24oYSl7cmV0dXJuXCJhXCI8PWEmJlwielwiPj1hfHxcIkFcIjw9YSYmXCJaXCI+PWF8fFwiX1wiPT09YXx8XCIkXCI9PT1hfSxpc0V4cE9wZXJhdG9yOmZ1bmN0aW9uKGEpe3JldHVyblwiLVwiPT09YXx8XCIrXCI9PT1hfHx0aGlzLmlzTnVtYmVyKGEpfSx0aHJvd0Vycm9yOmZ1bmN0aW9uKGEsYixkKXtkPWR8fHRoaXMuaW5kZXg7Yj15KGIpP1wicyBcIitiK1wiLVwiK3RoaXMuaW5kZXgrXCIgW1wiK3RoaXMudGV4dC5zdWJzdHJpbmcoYixkKStcIl1cIjpcIiBcIitkO3Rocm93IGJhKFwibGV4ZXJyXCIsYSxiLHRoaXMudGV4dCk7fSxyZWFkTnVtYmVyOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPVwiXCIsYj10aGlzLmluZGV4O3RoaXMuaW5kZXg8dGhpcy50ZXh0Lmxlbmd0aDspe3ZhciBkPUYodGhpcy50ZXh0LmNoYXJBdCh0aGlzLmluZGV4KSk7aWYoXCIuXCI9PWR8fHRoaXMuaXNOdW1iZXIoZCkpYSs9ZDtlbHNle3ZhciBjPXRoaXMucGVlaygpO1xuaWYoXCJlXCI9PWQmJnRoaXMuaXNFeHBPcGVyYXRvcihjKSlhKz1kO2Vsc2UgaWYodGhpcy5pc0V4cE9wZXJhdG9yKGQpJiZjJiZ0aGlzLmlzTnVtYmVyKGMpJiZcImVcIj09YS5jaGFyQXQoYS5sZW5ndGgtMSkpYSs9ZDtlbHNlIGlmKCF0aGlzLmlzRXhwT3BlcmF0b3IoZCl8fGMmJnRoaXMuaXNOdW1iZXIoYyl8fFwiZVwiIT1hLmNoYXJBdChhLmxlbmd0aC0xKSlicmVhaztlbHNlIHRoaXMudGhyb3dFcnJvcihcIkludmFsaWQgZXhwb25lbnRcIil9dGhpcy5pbmRleCsrfXRoaXMudG9rZW5zLnB1c2goe2luZGV4OmIsdGV4dDphLGNvbnN0YW50OiEwLHZhbHVlOk51bWJlcihhKX0pfSxyZWFkSWRlbnQ6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5pbmRleDt0aGlzLmluZGV4PHRoaXMudGV4dC5sZW5ndGg7KXt2YXIgYj10aGlzLnRleHQuY2hhckF0KHRoaXMuaW5kZXgpO2lmKCF0aGlzLmlzSWRlbnQoYikmJiF0aGlzLmlzTnVtYmVyKGIpKWJyZWFrO3RoaXMuaW5kZXgrK310aGlzLnRva2Vucy5wdXNoKHtpbmRleDphLFxudGV4dDp0aGlzLnRleHQuc2xpY2UoYSx0aGlzLmluZGV4KSxpZGVudGlmaWVyOiEwfSl9LHJlYWRTdHJpbmc6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5pbmRleDt0aGlzLmluZGV4Kys7Zm9yKHZhciBkPVwiXCIsYz1hLGU9ITE7dGhpcy5pbmRleDx0aGlzLnRleHQubGVuZ3RoOyl7dmFyIGY9dGhpcy50ZXh0LmNoYXJBdCh0aGlzLmluZGV4KSxjPWMrZjtpZihlKVwidVwiPT09Zj8oZT10aGlzLnRleHQuc3Vic3RyaW5nKHRoaXMuaW5kZXgrMSx0aGlzLmluZGV4KzUpLGUubWF0Y2goL1tcXGRhLWZdezR9L2kpfHx0aGlzLnRocm93RXJyb3IoXCJJbnZhbGlkIHVuaWNvZGUgZXNjYXBlIFtcXFxcdVwiK2UrXCJdXCIpLHRoaXMuaW5kZXgrPTQsZCs9U3RyaW5nLmZyb21DaGFyQ29kZShwYXJzZUludChlLDE2KSkpOmQrPXNnW2ZdfHxmLGU9ITE7ZWxzZSBpZihcIlxcXFxcIj09PWYpZT0hMDtlbHNle2lmKGY9PT1hKXt0aGlzLmluZGV4Kys7dGhpcy50b2tlbnMucHVzaCh7aW5kZXg6Yix0ZXh0OmMsY29uc3RhbnQ6ITAsXG52YWx1ZTpkfSk7cmV0dXJufWQrPWZ9dGhpcy5pbmRleCsrfXRoaXMudGhyb3dFcnJvcihcIlVudGVybWluYXRlZCBxdW90ZVwiLGIpfX07dmFyIHM9ZnVuY3Rpb24oYSxiKXt0aGlzLmxleGVyPWE7dGhpcy5vcHRpb25zPWJ9O3MuUHJvZ3JhbT1cIlByb2dyYW1cIjtzLkV4cHJlc3Npb25TdGF0ZW1lbnQ9XCJFeHByZXNzaW9uU3RhdGVtZW50XCI7cy5Bc3NpZ25tZW50RXhwcmVzc2lvbj1cIkFzc2lnbm1lbnRFeHByZXNzaW9uXCI7cy5Db25kaXRpb25hbEV4cHJlc3Npb249XCJDb25kaXRpb25hbEV4cHJlc3Npb25cIjtzLkxvZ2ljYWxFeHByZXNzaW9uPVwiTG9naWNhbEV4cHJlc3Npb25cIjtzLkJpbmFyeUV4cHJlc3Npb249XCJCaW5hcnlFeHByZXNzaW9uXCI7cy5VbmFyeUV4cHJlc3Npb249XCJVbmFyeUV4cHJlc3Npb25cIjtzLkNhbGxFeHByZXNzaW9uPVwiQ2FsbEV4cHJlc3Npb25cIjtzLk1lbWJlckV4cHJlc3Npb249XCJNZW1iZXJFeHByZXNzaW9uXCI7cy5JZGVudGlmaWVyPVwiSWRlbnRpZmllclwiO3MuTGl0ZXJhbD1cblwiTGl0ZXJhbFwiO3MuQXJyYXlFeHByZXNzaW9uPVwiQXJyYXlFeHByZXNzaW9uXCI7cy5Qcm9wZXJ0eT1cIlByb3BlcnR5XCI7cy5PYmplY3RFeHByZXNzaW9uPVwiT2JqZWN0RXhwcmVzc2lvblwiO3MuVGhpc0V4cHJlc3Npb249XCJUaGlzRXhwcmVzc2lvblwiO3MuTkdWYWx1ZVBhcmFtZXRlcj1cIk5HVmFsdWVQYXJhbWV0ZXJcIjtzLnByb3RvdHlwZT17YXN0OmZ1bmN0aW9uKGEpe3RoaXMudGV4dD1hO3RoaXMudG9rZW5zPXRoaXMubGV4ZXIubGV4KGEpO2E9dGhpcy5wcm9ncmFtKCk7MCE9PXRoaXMudG9rZW5zLmxlbmd0aCYmdGhpcy50aHJvd0Vycm9yKFwiaXMgYW4gdW5leHBlY3RlZCB0b2tlblwiLHRoaXMudG9rZW5zWzBdKTtyZXR1cm4gYX0scHJvZ3JhbTpmdW5jdGlvbigpe2Zvcih2YXIgYT1bXTs7KWlmKDA8dGhpcy50b2tlbnMubGVuZ3RoJiYhdGhpcy5wZWVrKFwifVwiLFwiKVwiLFwiO1wiLFwiXVwiKSYmYS5wdXNoKHRoaXMuZXhwcmVzc2lvblN0YXRlbWVudCgpKSwhdGhpcy5leHBlY3QoXCI7XCIpKXJldHVybnt0eXBlOnMuUHJvZ3JhbSxcbmJvZHk6YX19LGV4cHJlc3Npb25TdGF0ZW1lbnQ6ZnVuY3Rpb24oKXtyZXR1cm57dHlwZTpzLkV4cHJlc3Npb25TdGF0ZW1lbnQsZXhwcmVzc2lvbjp0aGlzLmZpbHRlckNoYWluKCl9fSxmaWx0ZXJDaGFpbjpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLmV4cHJlc3Npb24oKTt0aGlzLmV4cGVjdChcInxcIik7KWE9dGhpcy5maWx0ZXIoYSk7cmV0dXJuIGF9LGV4cHJlc3Npb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5hc3NpZ25tZW50KCl9LGFzc2lnbm1lbnQ6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnRlcm5hcnkoKTt0aGlzLmV4cGVjdChcIj1cIikmJihhPXt0eXBlOnMuQXNzaWdubWVudEV4cHJlc3Npb24sbGVmdDphLHJpZ2h0OnRoaXMuYXNzaWdubWVudCgpLG9wZXJhdG9yOlwiPVwifSk7cmV0dXJuIGF9LHRlcm5hcnk6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmxvZ2ljYWxPUigpLGIsZDtyZXR1cm4gdGhpcy5leHBlY3QoXCI/XCIpJiYoYj10aGlzLmV4cHJlc3Npb24oKSx0aGlzLmNvbnN1bWUoXCI6XCIpKT9cbihkPXRoaXMuZXhwcmVzc2lvbigpLHt0eXBlOnMuQ29uZGl0aW9uYWxFeHByZXNzaW9uLHRlc3Q6YSxhbHRlcm5hdGU6Yixjb25zZXF1ZW50OmR9KTphfSxsb2dpY2FsT1I6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5sb2dpY2FsQU5EKCk7dGhpcy5leHBlY3QoXCJ8fFwiKTspYT17dHlwZTpzLkxvZ2ljYWxFeHByZXNzaW9uLG9wZXJhdG9yOlwifHxcIixsZWZ0OmEscmlnaHQ6dGhpcy5sb2dpY2FsQU5EKCl9O3JldHVybiBhfSxsb2dpY2FsQU5EOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMuZXF1YWxpdHkoKTt0aGlzLmV4cGVjdChcIiYmXCIpOylhPXt0eXBlOnMuTG9naWNhbEV4cHJlc3Npb24sb3BlcmF0b3I6XCImJlwiLGxlZnQ6YSxyaWdodDp0aGlzLmVxdWFsaXR5KCl9O3JldHVybiBhfSxlcXVhbGl0eTpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLnJlbGF0aW9uYWwoKSxiO2I9dGhpcy5leHBlY3QoXCI9PVwiLFwiIT1cIixcIj09PVwiLFwiIT09XCIpOylhPXt0eXBlOnMuQmluYXJ5RXhwcmVzc2lvbixcbm9wZXJhdG9yOmIudGV4dCxsZWZ0OmEscmlnaHQ6dGhpcy5yZWxhdGlvbmFsKCl9O3JldHVybiBhfSxyZWxhdGlvbmFsOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMuYWRkaXRpdmUoKSxiO2I9dGhpcy5leHBlY3QoXCI8XCIsXCI+XCIsXCI8PVwiLFwiPj1cIik7KWE9e3R5cGU6cy5CaW5hcnlFeHByZXNzaW9uLG9wZXJhdG9yOmIudGV4dCxsZWZ0OmEscmlnaHQ6dGhpcy5hZGRpdGl2ZSgpfTtyZXR1cm4gYX0sYWRkaXRpdmU6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5tdWx0aXBsaWNhdGl2ZSgpLGI7Yj10aGlzLmV4cGVjdChcIitcIixcIi1cIik7KWE9e3R5cGU6cy5CaW5hcnlFeHByZXNzaW9uLG9wZXJhdG9yOmIudGV4dCxsZWZ0OmEscmlnaHQ6dGhpcy5tdWx0aXBsaWNhdGl2ZSgpfTtyZXR1cm4gYX0sbXVsdGlwbGljYXRpdmU6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy51bmFyeSgpLGI7Yj10aGlzLmV4cGVjdChcIipcIixcIi9cIixcIiVcIik7KWE9e3R5cGU6cy5CaW5hcnlFeHByZXNzaW9uLG9wZXJhdG9yOmIudGV4dCxcbmxlZnQ6YSxyaWdodDp0aGlzLnVuYXJ5KCl9O3JldHVybiBhfSx1bmFyeTpmdW5jdGlvbigpe3ZhciBhO3JldHVybihhPXRoaXMuZXhwZWN0KFwiK1wiLFwiLVwiLFwiIVwiKSk/e3R5cGU6cy5VbmFyeUV4cHJlc3Npb24sb3BlcmF0b3I6YS50ZXh0LHByZWZpeDohMCxhcmd1bWVudDp0aGlzLnVuYXJ5KCl9OnRoaXMucHJpbWFyeSgpfSxwcmltYXJ5OmZ1bmN0aW9uKCl7dmFyIGE7dGhpcy5leHBlY3QoXCIoXCIpPyhhPXRoaXMuZmlsdGVyQ2hhaW4oKSx0aGlzLmNvbnN1bWUoXCIpXCIpKTp0aGlzLmV4cGVjdChcIltcIik/YT10aGlzLmFycmF5RGVjbGFyYXRpb24oKTp0aGlzLmV4cGVjdChcIntcIik/YT10aGlzLm9iamVjdCgpOnRoaXMuY29uc3RhbnRzLmhhc093blByb3BlcnR5KHRoaXMucGVlaygpLnRleHQpP2E9YmIodGhpcy5jb25zdGFudHNbdGhpcy5jb25zdW1lKCkudGV4dF0pOnRoaXMucGVlaygpLmlkZW50aWZpZXI/YT10aGlzLmlkZW50aWZpZXIoKTp0aGlzLnBlZWsoKS5jb25zdGFudD9hPXRoaXMuY29uc3RhbnQoKTpcbnRoaXMudGhyb3dFcnJvcihcIm5vdCBhIHByaW1hcnkgZXhwcmVzc2lvblwiLHRoaXMucGVlaygpKTtmb3IodmFyIGI7Yj10aGlzLmV4cGVjdChcIihcIixcIltcIixcIi5cIik7KVwiKFwiPT09Yi50ZXh0PyhhPXt0eXBlOnMuQ2FsbEV4cHJlc3Npb24sY2FsbGVlOmEsYXJndW1lbnRzOnRoaXMucGFyc2VBcmd1bWVudHMoKX0sdGhpcy5jb25zdW1lKFwiKVwiKSk6XCJbXCI9PT1iLnRleHQ/KGE9e3R5cGU6cy5NZW1iZXJFeHByZXNzaW9uLG9iamVjdDphLHByb3BlcnR5OnRoaXMuZXhwcmVzc2lvbigpLGNvbXB1dGVkOiEwfSx0aGlzLmNvbnN1bWUoXCJdXCIpKTpcIi5cIj09PWIudGV4dD9hPXt0eXBlOnMuTWVtYmVyRXhwcmVzc2lvbixvYmplY3Q6YSxwcm9wZXJ0eTp0aGlzLmlkZW50aWZpZXIoKSxjb21wdXRlZDohMX06dGhpcy50aHJvd0Vycm9yKFwiSU1QT1NTSUJMRVwiKTtyZXR1cm4gYX0sZmlsdGVyOmZ1bmN0aW9uKGEpe2E9W2FdO2Zvcih2YXIgYj17dHlwZTpzLkNhbGxFeHByZXNzaW9uLGNhbGxlZTp0aGlzLmlkZW50aWZpZXIoKSxcbmFyZ3VtZW50czphLGZpbHRlcjohMH07dGhpcy5leHBlY3QoXCI6XCIpOylhLnB1c2godGhpcy5leHByZXNzaW9uKCkpO3JldHVybiBifSxwYXJzZUFyZ3VtZW50czpmdW5jdGlvbigpe3ZhciBhPVtdO2lmKFwiKVwiIT09dGhpcy5wZWVrVG9rZW4oKS50ZXh0KXtkbyBhLnB1c2godGhpcy5leHByZXNzaW9uKCkpO3doaWxlKHRoaXMuZXhwZWN0KFwiLFwiKSl9cmV0dXJuIGF9LGlkZW50aWZpZXI6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmNvbnN1bWUoKTthLmlkZW50aWZpZXJ8fHRoaXMudGhyb3dFcnJvcihcImlzIG5vdCBhIHZhbGlkIGlkZW50aWZpZXJcIixhKTtyZXR1cm57dHlwZTpzLklkZW50aWZpZXIsbmFtZTphLnRleHR9fSxjb25zdGFudDpmdW5jdGlvbigpe3JldHVybnt0eXBlOnMuTGl0ZXJhbCx2YWx1ZTp0aGlzLmNvbnN1bWUoKS52YWx1ZX19LGFycmF5RGVjbGFyYXRpb246ZnVuY3Rpb24oKXt2YXIgYT1bXTtpZihcIl1cIiE9PXRoaXMucGVla1Rva2VuKCkudGV4dCl7ZG97aWYodGhpcy5wZWVrKFwiXVwiKSlicmVhaztcbmEucHVzaCh0aGlzLmV4cHJlc3Npb24oKSl9d2hpbGUodGhpcy5leHBlY3QoXCIsXCIpKX10aGlzLmNvbnN1bWUoXCJdXCIpO3JldHVybnt0eXBlOnMuQXJyYXlFeHByZXNzaW9uLGVsZW1lbnRzOmF9fSxvYmplY3Q6ZnVuY3Rpb24oKXt2YXIgYT1bXSxiO2lmKFwifVwiIT09dGhpcy5wZWVrVG9rZW4oKS50ZXh0KXtkb3tpZih0aGlzLnBlZWsoXCJ9XCIpKWJyZWFrO2I9e3R5cGU6cy5Qcm9wZXJ0eSxraW5kOlwiaW5pdFwifTt0aGlzLnBlZWsoKS5jb25zdGFudD9iLmtleT10aGlzLmNvbnN0YW50KCk6dGhpcy5wZWVrKCkuaWRlbnRpZmllcj9iLmtleT10aGlzLmlkZW50aWZpZXIoKTp0aGlzLnRocm93RXJyb3IoXCJpbnZhbGlkIGtleVwiLHRoaXMucGVlaygpKTt0aGlzLmNvbnN1bWUoXCI6XCIpO2IudmFsdWU9dGhpcy5leHByZXNzaW9uKCk7YS5wdXNoKGIpfXdoaWxlKHRoaXMuZXhwZWN0KFwiLFwiKSl9dGhpcy5jb25zdW1lKFwifVwiKTtyZXR1cm57dHlwZTpzLk9iamVjdEV4cHJlc3Npb24scHJvcGVydGllczphfX0sXG50aHJvd0Vycm9yOmZ1bmN0aW9uKGEsYil7dGhyb3cgYmEoXCJzeW50YXhcIixiLnRleHQsYSxiLmluZGV4KzEsdGhpcy50ZXh0LHRoaXMudGV4dC5zdWJzdHJpbmcoYi5pbmRleCkpO30sY29uc3VtZTpmdW5jdGlvbihhKXtpZigwPT09dGhpcy50b2tlbnMubGVuZ3RoKXRocm93IGJhKFwidWVvZVwiLHRoaXMudGV4dCk7dmFyIGI9dGhpcy5leHBlY3QoYSk7Ynx8dGhpcy50aHJvd0Vycm9yKFwiaXMgdW5leHBlY3RlZCwgZXhwZWN0aW5nIFtcIithK1wiXVwiLHRoaXMucGVlaygpKTtyZXR1cm4gYn0scGVla1Rva2VuOmZ1bmN0aW9uKCl7aWYoMD09PXRoaXMudG9rZW5zLmxlbmd0aCl0aHJvdyBiYShcInVlb2VcIix0aGlzLnRleHQpO3JldHVybiB0aGlzLnRva2Vuc1swXX0scGVlazpmdW5jdGlvbihhLGIsZCxjKXtyZXR1cm4gdGhpcy5wZWVrQWhlYWQoMCxhLGIsZCxjKX0scGVla0FoZWFkOmZ1bmN0aW9uKGEsYixkLGMsZSl7aWYodGhpcy50b2tlbnMubGVuZ3RoPmEpe2E9dGhpcy50b2tlbnNbYV07XG52YXIgZj1hLnRleHQ7aWYoZj09PWJ8fGY9PT1kfHxmPT09Y3x8Zj09PWV8fCEoYnx8ZHx8Y3x8ZSkpcmV0dXJuIGF9cmV0dXJuITF9LGV4cGVjdDpmdW5jdGlvbihhLGIsZCxjKXtyZXR1cm4oYT10aGlzLnBlZWsoYSxiLGQsYykpPyh0aGlzLnRva2Vucy5zaGlmdCgpLGEpOiExfSxjb25zdGFudHM6e1widHJ1ZVwiOnt0eXBlOnMuTGl0ZXJhbCx2YWx1ZTohMH0sXCJmYWxzZVwiOnt0eXBlOnMuTGl0ZXJhbCx2YWx1ZTohMX0sXCJudWxsXCI6e3R5cGU6cy5MaXRlcmFsLHZhbHVlOm51bGx9LHVuZGVmaW5lZDp7dHlwZTpzLkxpdGVyYWwsdmFsdWU6dX0sXCJ0aGlzXCI6e3R5cGU6cy5UaGlzRXhwcmVzc2lvbn19fTtyZC5wcm90b3R5cGU9e2NvbXBpbGU6ZnVuY3Rpb24oYSxiKXt2YXIgZD10aGlzLGM9dGhpcy5hc3RCdWlsZGVyLmFzdChhKTt0aGlzLnN0YXRlPXtuZXh0SWQ6MCxmaWx0ZXJzOnt9LGV4cGVuc2l2ZUNoZWNrczpiLGZuOnt2YXJzOltdLGJvZHk6W10sb3duOnt9fSxhc3NpZ246e3ZhcnM6W10sXG5ib2R5OltdLG93bjp7fX0saW5wdXRzOltdfTtXKGMsZC4kZmlsdGVyKTt2YXIgZT1cIlwiLGY7dGhpcy5zdGFnZT1cImFzc2lnblwiO2lmKGY9cGQoYykpdGhpcy5zdGF0ZS5jb21wdXRpbmc9XCJhc3NpZ25cIixlPXRoaXMubmV4dElkKCksdGhpcy5yZWN1cnNlKGYsZSksdGhpcy5yZXR1cm5fKGUpLGU9XCJmbi5hc3NpZ249XCIrdGhpcy5nZW5lcmF0ZUZ1bmN0aW9uKFwiYXNzaWduXCIsXCJzLHYsbFwiKTtmPW5kKGMuYm9keSk7ZC5zdGFnZT1cImlucHV0c1wiO24oZixmdW5jdGlvbihhLGIpe3ZhciBjPVwiZm5cIitiO2Quc3RhdGVbY109e3ZhcnM6W10sYm9keTpbXSxvd246e319O2Quc3RhdGUuY29tcHV0aW5nPWM7dmFyIGU9ZC5uZXh0SWQoKTtkLnJlY3Vyc2UoYSxlKTtkLnJldHVybl8oZSk7ZC5zdGF0ZS5pbnB1dHMucHVzaChjKTthLndhdGNoSWQ9Yn0pO3RoaXMuc3RhdGUuY29tcHV0aW5nPVwiZm5cIjt0aGlzLnN0YWdlPVwibWFpblwiO3RoaXMucmVjdXJzZShjKTtlPSdcIicrdGhpcy5VU0UrXCIgXCIrdGhpcy5TVFJJQ1QrXG4nXCI7XFxuJyt0aGlzLmZpbHRlclByZWZpeCgpK1widmFyIGZuPVwiK3RoaXMuZ2VuZXJhdGVGdW5jdGlvbihcImZuXCIsXCJzLGwsYSxpXCIpK2UrdGhpcy53YXRjaEZucygpK1wicmV0dXJuIGZuO1wiO2U9KG5ldyBGdW5jdGlvbihcIiRmaWx0ZXJcIixcImVuc3VyZVNhZmVNZW1iZXJOYW1lXCIsXCJlbnN1cmVTYWZlT2JqZWN0XCIsXCJlbnN1cmVTYWZlRnVuY3Rpb25cIixcImdldFN0cmluZ1ZhbHVlXCIsXCJlbnN1cmVTYWZlQXNzaWduQ29udGV4dFwiLFwiaWZEZWZpbmVkXCIsXCJwbHVzXCIsXCJ0ZXh0XCIsZSkpKHRoaXMuJGZpbHRlcixWYSx4YSxrZCxqZCxsZCxaZixtZCxhKTt0aGlzLnN0YXRlPXRoaXMuc3RhZ2U9dTtlLmxpdGVyYWw9cWQoYyk7ZS5jb25zdGFudD1jLmNvbnN0YW50O3JldHVybiBlfSxVU0U6XCJ1c2VcIixTVFJJQ1Q6XCJzdHJpY3RcIix3YXRjaEZuczpmdW5jdGlvbigpe3ZhciBhPVtdLGI9dGhpcy5zdGF0ZS5pbnB1dHMsZD10aGlzO24oYixmdW5jdGlvbihiKXthLnB1c2goXCJ2YXIgXCIrYitcIj1cIitkLmdlbmVyYXRlRnVuY3Rpb24oYixcblwic1wiKSl9KTtiLmxlbmd0aCYmYS5wdXNoKFwiZm4uaW5wdXRzPVtcIitiLmpvaW4oXCIsXCIpK1wiXTtcIik7cmV0dXJuIGEuam9pbihcIlwiKX0sZ2VuZXJhdGVGdW5jdGlvbjpmdW5jdGlvbihhLGIpe3JldHVyblwiZnVuY3Rpb24oXCIrYitcIil7XCIrdGhpcy52YXJzUHJlZml4KGEpK3RoaXMuYm9keShhKStcIn07XCJ9LGZpbHRlclByZWZpeDpmdW5jdGlvbigpe3ZhciBhPVtdLGI9dGhpcztuKHRoaXMuc3RhdGUuZmlsdGVycyxmdW5jdGlvbihkLGMpe2EucHVzaChkK1wiPSRmaWx0ZXIoXCIrYi5lc2NhcGUoYykrXCIpXCIpfSk7cmV0dXJuIGEubGVuZ3RoP1widmFyIFwiK2Euam9pbihcIixcIikrXCI7XCI6XCJcIn0sdmFyc1ByZWZpeDpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5zdGF0ZVthXS52YXJzLmxlbmd0aD9cInZhciBcIit0aGlzLnN0YXRlW2FdLnZhcnMuam9pbihcIixcIikrXCI7XCI6XCJcIn0sYm9keTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5zdGF0ZVthXS5ib2R5LmpvaW4oXCJcIil9LHJlY3Vyc2U6ZnVuY3Rpb24oYSxiLFxuZCxjLGUsZil7dmFyIGcsaCxrPXRoaXMsbCxtO2M9Y3x8eDtpZighZiYmeShhLndhdGNoSWQpKWI9Ynx8dGhpcy5uZXh0SWQoKSx0aGlzLmlmXyhcImlcIix0aGlzLmxhenlBc3NpZ24oYix0aGlzLmNvbXB1dGVkTWVtYmVyKFwiaVwiLGEud2F0Y2hJZCkpLHRoaXMubGF6eVJlY3Vyc2UoYSxiLGQsYyxlLCEwKSk7ZWxzZSBzd2l0Y2goYS50eXBlKXtjYXNlIHMuUHJvZ3JhbTpuKGEuYm9keSxmdW5jdGlvbihiLGMpe2sucmVjdXJzZShiLmV4cHJlc3Npb24sdSx1LGZ1bmN0aW9uKGEpe2g9YX0pO2MhPT1hLmJvZHkubGVuZ3RoLTE/ay5jdXJyZW50KCkuYm9keS5wdXNoKGgsXCI7XCIpOmsucmV0dXJuXyhoKX0pO2JyZWFrO2Nhc2Ugcy5MaXRlcmFsOm09dGhpcy5lc2NhcGUoYS52YWx1ZSk7dGhpcy5hc3NpZ24oYixtKTtjKG0pO2JyZWFrO2Nhc2Ugcy5VbmFyeUV4cHJlc3Npb246dGhpcy5yZWN1cnNlKGEuYXJndW1lbnQsdSx1LGZ1bmN0aW9uKGEpe2g9YX0pO209YS5vcGVyYXRvcitcIihcIit0aGlzLmlmRGVmaW5lZChoLFxuMCkrXCIpXCI7dGhpcy5hc3NpZ24oYixtKTtjKG0pO2JyZWFrO2Nhc2Ugcy5CaW5hcnlFeHByZXNzaW9uOnRoaXMucmVjdXJzZShhLmxlZnQsdSx1LGZ1bmN0aW9uKGEpe2c9YX0pO3RoaXMucmVjdXJzZShhLnJpZ2h0LHUsdSxmdW5jdGlvbihhKXtoPWF9KTttPVwiK1wiPT09YS5vcGVyYXRvcj90aGlzLnBsdXMoZyxoKTpcIi1cIj09PWEub3BlcmF0b3I/dGhpcy5pZkRlZmluZWQoZywwKSthLm9wZXJhdG9yK3RoaXMuaWZEZWZpbmVkKGgsMCk6XCIoXCIrZytcIilcIithLm9wZXJhdG9yK1wiKFwiK2grXCIpXCI7dGhpcy5hc3NpZ24oYixtKTtjKG0pO2JyZWFrO2Nhc2Ugcy5Mb2dpY2FsRXhwcmVzc2lvbjpiPWJ8fHRoaXMubmV4dElkKCk7ay5yZWN1cnNlKGEubGVmdCxiKTtrLmlmXyhcIiYmXCI9PT1hLm9wZXJhdG9yP2I6ay5ub3QoYiksay5sYXp5UmVjdXJzZShhLnJpZ2h0LGIpKTtjKGIpO2JyZWFrO2Nhc2Ugcy5Db25kaXRpb25hbEV4cHJlc3Npb246Yj1ifHx0aGlzLm5leHRJZCgpO2sucmVjdXJzZShhLnRlc3QsXG5iKTtrLmlmXyhiLGsubGF6eVJlY3Vyc2UoYS5hbHRlcm5hdGUsYiksay5sYXp5UmVjdXJzZShhLmNvbnNlcXVlbnQsYikpO2MoYik7YnJlYWs7Y2FzZSBzLklkZW50aWZpZXI6Yj1ifHx0aGlzLm5leHRJZCgpO2QmJihkLmNvbnRleHQ9XCJpbnB1dHNcIj09PWsuc3RhZ2U/XCJzXCI6dGhpcy5hc3NpZ24odGhpcy5uZXh0SWQoKSx0aGlzLmdldEhhc093blByb3BlcnR5KFwibFwiLGEubmFtZSkrXCI/bDpzXCIpLGQuY29tcHV0ZWQ9ITEsZC5uYW1lPWEubmFtZSk7VmEoYS5uYW1lKTtrLmlmXyhcImlucHV0c1wiPT09ay5zdGFnZXx8ay5ub3Qoay5nZXRIYXNPd25Qcm9wZXJ0eShcImxcIixhLm5hbWUpKSxmdW5jdGlvbigpe2suaWZfKFwiaW5wdXRzXCI9PT1rLnN0YWdlfHxcInNcIixmdW5jdGlvbigpe2UmJjEhPT1lJiZrLmlmXyhrLm5vdChrLm5vbkNvbXB1dGVkTWVtYmVyKFwic1wiLGEubmFtZSkpLGsubGF6eUFzc2lnbihrLm5vbkNvbXB1dGVkTWVtYmVyKFwic1wiLGEubmFtZSksXCJ7fVwiKSk7ay5hc3NpZ24oYixrLm5vbkNvbXB1dGVkTWVtYmVyKFwic1wiLFxuYS5uYW1lKSl9KX0sYiYmay5sYXp5QXNzaWduKGIsay5ub25Db21wdXRlZE1lbWJlcihcImxcIixhLm5hbWUpKSk7KGsuc3RhdGUuZXhwZW5zaXZlQ2hlY2tzfHxGYihhLm5hbWUpKSYmay5hZGRFbnN1cmVTYWZlT2JqZWN0KGIpO2MoYik7YnJlYWs7Y2FzZSBzLk1lbWJlckV4cHJlc3Npb246Zz1kJiYoZC5jb250ZXh0PXRoaXMubmV4dElkKCkpfHx0aGlzLm5leHRJZCgpO2I9Ynx8dGhpcy5uZXh0SWQoKTtrLnJlY3Vyc2UoYS5vYmplY3QsZyx1LGZ1bmN0aW9uKCl7ay5pZl8oay5ub3ROdWxsKGcpLGZ1bmN0aW9uKCl7aWYoYS5jb21wdXRlZCloPWsubmV4dElkKCksay5yZWN1cnNlKGEucHJvcGVydHksaCksay5nZXRTdHJpbmdWYWx1ZShoKSxrLmFkZEVuc3VyZVNhZmVNZW1iZXJOYW1lKGgpLGUmJjEhPT1lJiZrLmlmXyhrLm5vdChrLmNvbXB1dGVkTWVtYmVyKGcsaCkpLGsubGF6eUFzc2lnbihrLmNvbXB1dGVkTWVtYmVyKGcsaCksXCJ7fVwiKSksbT1rLmVuc3VyZVNhZmVPYmplY3Qoay5jb21wdXRlZE1lbWJlcihnLFxuaCkpLGsuYXNzaWduKGIsbSksZCYmKGQuY29tcHV0ZWQ9ITAsZC5uYW1lPWgpO2Vsc2V7VmEoYS5wcm9wZXJ0eS5uYW1lKTtlJiYxIT09ZSYmay5pZl8oay5ub3Qoay5ub25Db21wdXRlZE1lbWJlcihnLGEucHJvcGVydHkubmFtZSkpLGsubGF6eUFzc2lnbihrLm5vbkNvbXB1dGVkTWVtYmVyKGcsYS5wcm9wZXJ0eS5uYW1lKSxcInt9XCIpKTttPWsubm9uQ29tcHV0ZWRNZW1iZXIoZyxhLnByb3BlcnR5Lm5hbWUpO2lmKGsuc3RhdGUuZXhwZW5zaXZlQ2hlY2tzfHxGYihhLnByb3BlcnR5Lm5hbWUpKW09ay5lbnN1cmVTYWZlT2JqZWN0KG0pO2suYXNzaWduKGIsbSk7ZCYmKGQuY29tcHV0ZWQ9ITEsZC5uYW1lPWEucHJvcGVydHkubmFtZSl9fSxmdW5jdGlvbigpe2suYXNzaWduKGIsXCJ1bmRlZmluZWRcIil9KTtjKGIpfSwhIWUpO2JyZWFrO2Nhc2Ugcy5DYWxsRXhwcmVzc2lvbjpiPWJ8fHRoaXMubmV4dElkKCk7YS5maWx0ZXI/KGg9ay5maWx0ZXIoYS5jYWxsZWUubmFtZSksbD1bXSxuKGEuYXJndW1lbnRzLFxuZnVuY3Rpb24oYSl7dmFyIGI9ay5uZXh0SWQoKTtrLnJlY3Vyc2UoYSxiKTtsLnB1c2goYil9KSxtPWgrXCIoXCIrbC5qb2luKFwiLFwiKStcIilcIixrLmFzc2lnbihiLG0pLGMoYikpOihoPWsubmV4dElkKCksZz17fSxsPVtdLGsucmVjdXJzZShhLmNhbGxlZSxoLGcsZnVuY3Rpb24oKXtrLmlmXyhrLm5vdE51bGwoaCksZnVuY3Rpb24oKXtrLmFkZEVuc3VyZVNhZmVGdW5jdGlvbihoKTtuKGEuYXJndW1lbnRzLGZ1bmN0aW9uKGEpe2sucmVjdXJzZShhLGsubmV4dElkKCksdSxmdW5jdGlvbihhKXtsLnB1c2goay5lbnN1cmVTYWZlT2JqZWN0KGEpKX0pfSk7Zy5uYW1lPyhrLnN0YXRlLmV4cGVuc2l2ZUNoZWNrc3x8ay5hZGRFbnN1cmVTYWZlT2JqZWN0KGcuY29udGV4dCksbT1rLm1lbWJlcihnLmNvbnRleHQsZy5uYW1lLGcuY29tcHV0ZWQpK1wiKFwiK2wuam9pbihcIixcIikrXCIpXCIpOm09aCtcIihcIitsLmpvaW4oXCIsXCIpK1wiKVwiO209ay5lbnN1cmVTYWZlT2JqZWN0KG0pO2suYXNzaWduKGIsbSl9LFxuZnVuY3Rpb24oKXtrLmFzc2lnbihiLFwidW5kZWZpbmVkXCIpfSk7YyhiKX0pKTticmVhaztjYXNlIHMuQXNzaWdubWVudEV4cHJlc3Npb246aD10aGlzLm5leHRJZCgpO2c9e307aWYoIW9kKGEubGVmdCkpdGhyb3cgYmEoXCJsdmFsXCIpO3RoaXMucmVjdXJzZShhLmxlZnQsdSxnLGZ1bmN0aW9uKCl7ay5pZl8oay5ub3ROdWxsKGcuY29udGV4dCksZnVuY3Rpb24oKXtrLnJlY3Vyc2UoYS5yaWdodCxoKTtrLmFkZEVuc3VyZVNhZmVPYmplY3Qoay5tZW1iZXIoZy5jb250ZXh0LGcubmFtZSxnLmNvbXB1dGVkKSk7ay5hZGRFbnN1cmVTYWZlQXNzaWduQ29udGV4dChnLmNvbnRleHQpO209ay5tZW1iZXIoZy5jb250ZXh0LGcubmFtZSxnLmNvbXB1dGVkKSthLm9wZXJhdG9yK2g7ay5hc3NpZ24oYixtKTtjKGJ8fG0pfSl9LDEpO2JyZWFrO2Nhc2Ugcy5BcnJheUV4cHJlc3Npb246bD1bXTtuKGEuZWxlbWVudHMsZnVuY3Rpb24oYSl7ay5yZWN1cnNlKGEsay5uZXh0SWQoKSx1LGZ1bmN0aW9uKGEpe2wucHVzaChhKX0pfSk7XG5tPVwiW1wiK2wuam9pbihcIixcIikrXCJdXCI7dGhpcy5hc3NpZ24oYixtKTtjKG0pO2JyZWFrO2Nhc2Ugcy5PYmplY3RFeHByZXNzaW9uOmw9W107bihhLnByb3BlcnRpZXMsZnVuY3Rpb24oYSl7ay5yZWN1cnNlKGEudmFsdWUsay5uZXh0SWQoKSx1LGZ1bmN0aW9uKGIpe2wucHVzaChrLmVzY2FwZShhLmtleS50eXBlPT09cy5JZGVudGlmaWVyP2Eua2V5Lm5hbWU6XCJcIithLmtleS52YWx1ZSkrXCI6XCIrYil9KX0pO209XCJ7XCIrbC5qb2luKFwiLFwiKStcIn1cIjt0aGlzLmFzc2lnbihiLG0pO2MobSk7YnJlYWs7Y2FzZSBzLlRoaXNFeHByZXNzaW9uOnRoaXMuYXNzaWduKGIsXCJzXCIpO2MoXCJzXCIpO2JyZWFrO2Nhc2Ugcy5OR1ZhbHVlUGFyYW1ldGVyOnRoaXMuYXNzaWduKGIsXCJ2XCIpLGMoXCJ2XCIpfX0sZ2V0SGFzT3duUHJvcGVydHk6ZnVuY3Rpb24oYSxiKXt2YXIgZD1hK1wiLlwiK2IsYz10aGlzLmN1cnJlbnQoKS5vd247Yy5oYXNPd25Qcm9wZXJ0eShkKXx8KGNbZF09dGhpcy5uZXh0SWQoITEsYStcIiYmKFwiK1xudGhpcy5lc2NhcGUoYikrXCIgaW4gXCIrYStcIilcIikpO3JldHVybiBjW2RdfSxhc3NpZ246ZnVuY3Rpb24oYSxiKXtpZihhKXJldHVybiB0aGlzLmN1cnJlbnQoKS5ib2R5LnB1c2goYSxcIj1cIixiLFwiO1wiKSxhfSxmaWx0ZXI6ZnVuY3Rpb24oYSl7dGhpcy5zdGF0ZS5maWx0ZXJzLmhhc093blByb3BlcnR5KGEpfHwodGhpcy5zdGF0ZS5maWx0ZXJzW2FdPXRoaXMubmV4dElkKCEwKSk7cmV0dXJuIHRoaXMuc3RhdGUuZmlsdGVyc1thXX0saWZEZWZpbmVkOmZ1bmN0aW9uKGEsYil7cmV0dXJuXCJpZkRlZmluZWQoXCIrYStcIixcIit0aGlzLmVzY2FwZShiKStcIilcIn0scGx1czpmdW5jdGlvbihhLGIpe3JldHVyblwicGx1cyhcIithK1wiLFwiK2IrXCIpXCJ9LHJldHVybl86ZnVuY3Rpb24oYSl7dGhpcy5jdXJyZW50KCkuYm9keS5wdXNoKFwicmV0dXJuIFwiLGEsXCI7XCIpfSxpZl86ZnVuY3Rpb24oYSxiLGQpe2lmKCEwPT09YSliKCk7ZWxzZXt2YXIgYz10aGlzLmN1cnJlbnQoKS5ib2R5O2MucHVzaChcImlmKFwiLGEsXG5cIil7XCIpO2IoKTtjLnB1c2goXCJ9XCIpO2QmJihjLnB1c2goXCJlbHNle1wiKSxkKCksYy5wdXNoKFwifVwiKSl9fSxub3Q6ZnVuY3Rpb24oYSl7cmV0dXJuXCIhKFwiK2ErXCIpXCJ9LG5vdE51bGw6ZnVuY3Rpb24oYSl7cmV0dXJuIGErXCIhPW51bGxcIn0sbm9uQ29tcHV0ZWRNZW1iZXI6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYStcIi5cIitifSxjb21wdXRlZE1lbWJlcjpmdW5jdGlvbihhLGIpe3JldHVybiBhK1wiW1wiK2IrXCJdXCJ9LG1lbWJlcjpmdW5jdGlvbihhLGIsZCl7cmV0dXJuIGQ/dGhpcy5jb21wdXRlZE1lbWJlcihhLGIpOnRoaXMubm9uQ29tcHV0ZWRNZW1iZXIoYSxiKX0sYWRkRW5zdXJlU2FmZU9iamVjdDpmdW5jdGlvbihhKXt0aGlzLmN1cnJlbnQoKS5ib2R5LnB1c2godGhpcy5lbnN1cmVTYWZlT2JqZWN0KGEpLFwiO1wiKX0sYWRkRW5zdXJlU2FmZU1lbWJlck5hbWU6ZnVuY3Rpb24oYSl7dGhpcy5jdXJyZW50KCkuYm9keS5wdXNoKHRoaXMuZW5zdXJlU2FmZU1lbWJlck5hbWUoYSksXCI7XCIpfSxcbmFkZEVuc3VyZVNhZmVGdW5jdGlvbjpmdW5jdGlvbihhKXt0aGlzLmN1cnJlbnQoKS5ib2R5LnB1c2godGhpcy5lbnN1cmVTYWZlRnVuY3Rpb24oYSksXCI7XCIpfSxhZGRFbnN1cmVTYWZlQXNzaWduQ29udGV4dDpmdW5jdGlvbihhKXt0aGlzLmN1cnJlbnQoKS5ib2R5LnB1c2godGhpcy5lbnN1cmVTYWZlQXNzaWduQ29udGV4dChhKSxcIjtcIil9LGVuc3VyZVNhZmVPYmplY3Q6ZnVuY3Rpb24oYSl7cmV0dXJuXCJlbnN1cmVTYWZlT2JqZWN0KFwiK2ErXCIsdGV4dClcIn0sZW5zdXJlU2FmZU1lbWJlck5hbWU6ZnVuY3Rpb24oYSl7cmV0dXJuXCJlbnN1cmVTYWZlTWVtYmVyTmFtZShcIithK1wiLHRleHQpXCJ9LGVuc3VyZVNhZmVGdW5jdGlvbjpmdW5jdGlvbihhKXtyZXR1cm5cImVuc3VyZVNhZmVGdW5jdGlvbihcIithK1wiLHRleHQpXCJ9LGdldFN0cmluZ1ZhbHVlOmZ1bmN0aW9uKGEpe3RoaXMuYXNzaWduKGEsXCJnZXRTdHJpbmdWYWx1ZShcIithK1wiLHRleHQpXCIpfSxlbnN1cmVTYWZlQXNzaWduQ29udGV4dDpmdW5jdGlvbihhKXtyZXR1cm5cImVuc3VyZVNhZmVBc3NpZ25Db250ZXh0KFwiK1xuYStcIix0ZXh0KVwifSxsYXp5UmVjdXJzZTpmdW5jdGlvbihhLGIsZCxjLGUsZil7dmFyIGc9dGhpcztyZXR1cm4gZnVuY3Rpb24oKXtnLnJlY3Vyc2UoYSxiLGQsYyxlLGYpfX0sbGF6eUFzc2lnbjpmdW5jdGlvbihhLGIpe3ZhciBkPXRoaXM7cmV0dXJuIGZ1bmN0aW9uKCl7ZC5hc3NpZ24oYSxiKX19LHN0cmluZ0VzY2FwZVJlZ2V4Oi9bXiBhLXpBLVowLTldL2csc3RyaW5nRXNjYXBlRm46ZnVuY3Rpb24oYSl7cmV0dXJuXCJcXFxcdVwiKyhcIjAwMDBcIithLmNoYXJDb2RlQXQoMCkudG9TdHJpbmcoMTYpKS5zbGljZSgtNCl9LGVzY2FwZTpmdW5jdGlvbihhKXtpZihFKGEpKXJldHVyblwiJ1wiK2EucmVwbGFjZSh0aGlzLnN0cmluZ0VzY2FwZVJlZ2V4LHRoaXMuc3RyaW5nRXNjYXBlRm4pK1wiJ1wiO2lmKFEoYSkpcmV0dXJuIGEudG9TdHJpbmcoKTtpZighMD09PWEpcmV0dXJuXCJ0cnVlXCI7aWYoITE9PT1hKXJldHVyblwiZmFsc2VcIjtpZihudWxsPT09YSlyZXR1cm5cIm51bGxcIjtpZihcInVuZGVmaW5lZFwiPT09XG50eXBlb2YgYSlyZXR1cm5cInVuZGVmaW5lZFwiO3Rocm93IGJhKFwiZXNjXCIpO30sbmV4dElkOmZ1bmN0aW9uKGEsYil7dmFyIGQ9XCJ2XCIrdGhpcy5zdGF0ZS5uZXh0SWQrKzthfHx0aGlzLmN1cnJlbnQoKS52YXJzLnB1c2goZCsoYj9cIj1cIitiOlwiXCIpKTtyZXR1cm4gZH0sY3VycmVudDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXRlW3RoaXMuc3RhdGUuY29tcHV0aW5nXX19O3NkLnByb3RvdHlwZT17Y29tcGlsZTpmdW5jdGlvbihhLGIpe3ZhciBkPXRoaXMsYz10aGlzLmFzdEJ1aWxkZXIuYXN0KGEpO3RoaXMuZXhwcmVzc2lvbj1hO3RoaXMuZXhwZW5zaXZlQ2hlY2tzPWI7VyhjLGQuJGZpbHRlcik7dmFyIGUsZjtpZihlPXBkKGMpKWY9dGhpcy5yZWN1cnNlKGUpO2U9bmQoYy5ib2R5KTt2YXIgZztlJiYoZz1bXSxuKGUsZnVuY3Rpb24oYSxiKXt2YXIgYz1kLnJlY3Vyc2UoYSk7YS5pbnB1dD1jO2cucHVzaChjKTthLndhdGNoSWQ9Yn0pKTt2YXIgaD1bXTtuKGMuYm9keSxmdW5jdGlvbihhKXtoLnB1c2goZC5yZWN1cnNlKGEuZXhwcmVzc2lvbikpfSk7XG5lPTA9PT1jLmJvZHkubGVuZ3RoP2Z1bmN0aW9uKCl7fToxPT09Yy5ib2R5Lmxlbmd0aD9oWzBdOmZ1bmN0aW9uKGEsYil7dmFyIGM7bihoLGZ1bmN0aW9uKGQpe2M9ZChhLGIpfSk7cmV0dXJuIGN9O2YmJihlLmFzc2lnbj1mdW5jdGlvbihhLGIsYyl7cmV0dXJuIGYoYSxjLGIpfSk7ZyYmKGUuaW5wdXRzPWcpO2UubGl0ZXJhbD1xZChjKTtlLmNvbnN0YW50PWMuY29uc3RhbnQ7cmV0dXJuIGV9LHJlY3Vyc2U6ZnVuY3Rpb24oYSxiLGQpe3ZhciBjLGUsZj10aGlzLGc7aWYoYS5pbnB1dClyZXR1cm4gdGhpcy5pbnB1dHMoYS5pbnB1dCxhLndhdGNoSWQpO3N3aXRjaChhLnR5cGUpe2Nhc2Ugcy5MaXRlcmFsOnJldHVybiB0aGlzLnZhbHVlKGEudmFsdWUsYik7Y2FzZSBzLlVuYXJ5RXhwcmVzc2lvbjpyZXR1cm4gZT10aGlzLnJlY3Vyc2UoYS5hcmd1bWVudCksdGhpc1tcInVuYXJ5XCIrYS5vcGVyYXRvcl0oZSxiKTtjYXNlIHMuQmluYXJ5RXhwcmVzc2lvbjpyZXR1cm4gYz10aGlzLnJlY3Vyc2UoYS5sZWZ0KSxcbmU9dGhpcy5yZWN1cnNlKGEucmlnaHQpLHRoaXNbXCJiaW5hcnlcIithLm9wZXJhdG9yXShjLGUsYik7Y2FzZSBzLkxvZ2ljYWxFeHByZXNzaW9uOnJldHVybiBjPXRoaXMucmVjdXJzZShhLmxlZnQpLGU9dGhpcy5yZWN1cnNlKGEucmlnaHQpLHRoaXNbXCJiaW5hcnlcIithLm9wZXJhdG9yXShjLGUsYik7Y2FzZSBzLkNvbmRpdGlvbmFsRXhwcmVzc2lvbjpyZXR1cm4gdGhpc1tcInRlcm5hcnk/OlwiXSh0aGlzLnJlY3Vyc2UoYS50ZXN0KSx0aGlzLnJlY3Vyc2UoYS5hbHRlcm5hdGUpLHRoaXMucmVjdXJzZShhLmNvbnNlcXVlbnQpLGIpO2Nhc2Ugcy5JZGVudGlmaWVyOnJldHVybiBWYShhLm5hbWUsZi5leHByZXNzaW9uKSxmLmlkZW50aWZpZXIoYS5uYW1lLGYuZXhwZW5zaXZlQ2hlY2tzfHxGYihhLm5hbWUpLGIsZCxmLmV4cHJlc3Npb24pO2Nhc2Ugcy5NZW1iZXJFeHByZXNzaW9uOnJldHVybiBjPXRoaXMucmVjdXJzZShhLm9iamVjdCwhMSwhIWQpLGEuY29tcHV0ZWR8fChWYShhLnByb3BlcnR5Lm5hbWUsXG5mLmV4cHJlc3Npb24pLGU9YS5wcm9wZXJ0eS5uYW1lKSxhLmNvbXB1dGVkJiYoZT10aGlzLnJlY3Vyc2UoYS5wcm9wZXJ0eSkpLGEuY29tcHV0ZWQ/dGhpcy5jb21wdXRlZE1lbWJlcihjLGUsYixkLGYuZXhwcmVzc2lvbik6dGhpcy5ub25Db21wdXRlZE1lbWJlcihjLGUsZi5leHBlbnNpdmVDaGVja3MsYixkLGYuZXhwcmVzc2lvbik7Y2FzZSBzLkNhbGxFeHByZXNzaW9uOnJldHVybiBnPVtdLG4oYS5hcmd1bWVudHMsZnVuY3Rpb24oYSl7Zy5wdXNoKGYucmVjdXJzZShhKSl9KSxhLmZpbHRlciYmKGU9dGhpcy4kZmlsdGVyKGEuY2FsbGVlLm5hbWUpKSxhLmZpbHRlcnx8KGU9dGhpcy5yZWN1cnNlKGEuY2FsbGVlLCEwKSksYS5maWx0ZXI/ZnVuY3Rpb24oYSxjLGQsZil7Zm9yKHZhciByPVtdLG49MDtuPGcubGVuZ3RoOysrbilyLnB1c2goZ1tuXShhLGMsZCxmKSk7YT1lLmFwcGx5KHUscixmKTtyZXR1cm4gYj97Y29udGV4dDp1LG5hbWU6dSx2YWx1ZTphfTphfTpmdW5jdGlvbihhLFxuYyxkLG0pe3ZhciByPWUoYSxjLGQsbSksbjtpZihudWxsIT1yLnZhbHVlKXt4YShyLmNvbnRleHQsZi5leHByZXNzaW9uKTtrZChyLnZhbHVlLGYuZXhwcmVzc2lvbik7bj1bXTtmb3IodmFyIHE9MDtxPGcubGVuZ3RoOysrcSluLnB1c2goeGEoZ1txXShhLGMsZCxtKSxmLmV4cHJlc3Npb24pKTtuPXhhKHIudmFsdWUuYXBwbHkoci5jb250ZXh0LG4pLGYuZXhwcmVzc2lvbil9cmV0dXJuIGI/e3ZhbHVlOm59Om59O2Nhc2Ugcy5Bc3NpZ25tZW50RXhwcmVzc2lvbjpyZXR1cm4gYz10aGlzLnJlY3Vyc2UoYS5sZWZ0LCEwLDEpLGU9dGhpcy5yZWN1cnNlKGEucmlnaHQpLGZ1bmN0aW9uKGEsZCxnLG0pe3ZhciBuPWMoYSxkLGcsbSk7YT1lKGEsZCxnLG0pO3hhKG4udmFsdWUsZi5leHByZXNzaW9uKTtsZChuLmNvbnRleHQpO24uY29udGV4dFtuLm5hbWVdPWE7cmV0dXJuIGI/e3ZhbHVlOmF9OmF9O2Nhc2Ugcy5BcnJheUV4cHJlc3Npb246cmV0dXJuIGc9W10sbihhLmVsZW1lbnRzLGZ1bmN0aW9uKGEpe2cucHVzaChmLnJlY3Vyc2UoYSkpfSksXG5mdW5jdGlvbihhLGMsZCxlKXtmb3IodmFyIGY9W10sbj0wO248Zy5sZW5ndGg7KytuKWYucHVzaChnW25dKGEsYyxkLGUpKTtyZXR1cm4gYj97dmFsdWU6Zn06Zn07Y2FzZSBzLk9iamVjdEV4cHJlc3Npb246cmV0dXJuIGc9W10sbihhLnByb3BlcnRpZXMsZnVuY3Rpb24oYSl7Zy5wdXNoKHtrZXk6YS5rZXkudHlwZT09PXMuSWRlbnRpZmllcj9hLmtleS5uYW1lOlwiXCIrYS5rZXkudmFsdWUsdmFsdWU6Zi5yZWN1cnNlKGEudmFsdWUpfSl9KSxmdW5jdGlvbihhLGMsZCxlKXtmb3IodmFyIGY9e30sbj0wO248Zy5sZW5ndGg7KytuKWZbZ1tuXS5rZXldPWdbbl0udmFsdWUoYSxjLGQsZSk7cmV0dXJuIGI/e3ZhbHVlOmZ9OmZ9O2Nhc2Ugcy5UaGlzRXhwcmVzc2lvbjpyZXR1cm4gZnVuY3Rpb24oYSl7cmV0dXJuIGI/e3ZhbHVlOmF9OmF9O2Nhc2Ugcy5OR1ZhbHVlUGFyYW1ldGVyOnJldHVybiBmdW5jdGlvbihhLGMsZCxlKXtyZXR1cm4gYj97dmFsdWU6ZH06ZH19fSxcInVuYXJ5K1wiOmZ1bmN0aW9uKGEsXG5iKXtyZXR1cm4gZnVuY3Rpb24oZCxjLGUsZil7ZD1hKGQsYyxlLGYpO2Q9eShkKT8rZDowO3JldHVybiBiP3t2YWx1ZTpkfTpkfX0sXCJ1bmFyeS1cIjpmdW5jdGlvbihhLGIpe3JldHVybiBmdW5jdGlvbihkLGMsZSxmKXtkPWEoZCxjLGUsZik7ZD15KGQpPy1kOjA7cmV0dXJuIGI/e3ZhbHVlOmR9OmR9fSxcInVuYXJ5IVwiOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGZ1bmN0aW9uKGQsYyxlLGYpe2Q9IWEoZCxjLGUsZik7cmV0dXJuIGI/e3ZhbHVlOmR9OmR9fSxcImJpbmFyeStcIjpmdW5jdGlvbihhLGIsZCl7cmV0dXJuIGZ1bmN0aW9uKGMsZSxmLGcpe3ZhciBoPWEoYyxlLGYsZyk7Yz1iKGMsZSxmLGcpO2g9bWQoaCxjKTtyZXR1cm4gZD97dmFsdWU6aH06aH19LFwiYmluYXJ5LVwiOmZ1bmN0aW9uKGEsYixkKXtyZXR1cm4gZnVuY3Rpb24oYyxlLGYsZyl7dmFyIGg9YShjLGUsZixnKTtjPWIoYyxlLGYsZyk7aD0oeShoKT9oOjApLSh5KGMpP2M6MCk7cmV0dXJuIGQ/e3ZhbHVlOmh9Omh9fSxcImJpbmFyeSpcIjpmdW5jdGlvbihhLFxuYixkKXtyZXR1cm4gZnVuY3Rpb24oYyxlLGYsZyl7Yz1hKGMsZSxmLGcpKmIoYyxlLGYsZyk7cmV0dXJuIGQ/e3ZhbHVlOmN9OmN9fSxcImJpbmFyeS9cIjpmdW5jdGlvbihhLGIsZCl7cmV0dXJuIGZ1bmN0aW9uKGMsZSxmLGcpe2M9YShjLGUsZixnKS9iKGMsZSxmLGcpO3JldHVybiBkP3t2YWx1ZTpjfTpjfX0sXCJiaW5hcnklXCI6ZnVuY3Rpb24oYSxiLGQpe3JldHVybiBmdW5jdGlvbihjLGUsZixnKXtjPWEoYyxlLGYsZyklYihjLGUsZixnKTtyZXR1cm4gZD97dmFsdWU6Y306Y319LFwiYmluYXJ5PT09XCI6ZnVuY3Rpb24oYSxiLGQpe3JldHVybiBmdW5jdGlvbihjLGUsZixnKXtjPWEoYyxlLGYsZyk9PT1iKGMsZSxmLGcpO3JldHVybiBkP3t2YWx1ZTpjfTpjfX0sXCJiaW5hcnkhPT1cIjpmdW5jdGlvbihhLGIsZCl7cmV0dXJuIGZ1bmN0aW9uKGMsZSxmLGcpe2M9YShjLGUsZixnKSE9PWIoYyxlLGYsZyk7cmV0dXJuIGQ/e3ZhbHVlOmN9OmN9fSxcImJpbmFyeT09XCI6ZnVuY3Rpb24oYSxiLFxuZCl7cmV0dXJuIGZ1bmN0aW9uKGMsZSxmLGcpe2M9YShjLGUsZixnKT09YihjLGUsZixnKTtyZXR1cm4gZD97dmFsdWU6Y306Y319LFwiYmluYXJ5IT1cIjpmdW5jdGlvbihhLGIsZCl7cmV0dXJuIGZ1bmN0aW9uKGMsZSxmLGcpe2M9YShjLGUsZixnKSE9YihjLGUsZixnKTtyZXR1cm4gZD97dmFsdWU6Y306Y319LFwiYmluYXJ5PFwiOmZ1bmN0aW9uKGEsYixkKXtyZXR1cm4gZnVuY3Rpb24oYyxlLGYsZyl7Yz1hKGMsZSxmLGcpPGIoYyxlLGYsZyk7cmV0dXJuIGQ/e3ZhbHVlOmN9OmN9fSxcImJpbmFyeT5cIjpmdW5jdGlvbihhLGIsZCl7cmV0dXJuIGZ1bmN0aW9uKGMsZSxmLGcpe2M9YShjLGUsZixnKT5iKGMsZSxmLGcpO3JldHVybiBkP3t2YWx1ZTpjfTpjfX0sXCJiaW5hcnk8PVwiOmZ1bmN0aW9uKGEsYixkKXtyZXR1cm4gZnVuY3Rpb24oYyxlLGYsZyl7Yz1hKGMsZSxmLGcpPD1iKGMsZSxmLGcpO3JldHVybiBkP3t2YWx1ZTpjfTpjfX0sXCJiaW5hcnk+PVwiOmZ1bmN0aW9uKGEsYixkKXtyZXR1cm4gZnVuY3Rpb24oYyxcbmUsZixnKXtjPWEoYyxlLGYsZyk+PWIoYyxlLGYsZyk7cmV0dXJuIGQ/e3ZhbHVlOmN9OmN9fSxcImJpbmFyeSYmXCI6ZnVuY3Rpb24oYSxiLGQpe3JldHVybiBmdW5jdGlvbihjLGUsZixnKXtjPWEoYyxlLGYsZykmJmIoYyxlLGYsZyk7cmV0dXJuIGQ/e3ZhbHVlOmN9OmN9fSxcImJpbmFyeXx8XCI6ZnVuY3Rpb24oYSxiLGQpe3JldHVybiBmdW5jdGlvbihjLGUsZixnKXtjPWEoYyxlLGYsZyl8fGIoYyxlLGYsZyk7cmV0dXJuIGQ/e3ZhbHVlOmN9OmN9fSxcInRlcm5hcnk/OlwiOmZ1bmN0aW9uKGEsYixkLGMpe3JldHVybiBmdW5jdGlvbihlLGYsZyxoKXtlPWEoZSxmLGcsaCk/YihlLGYsZyxoKTpkKGUsZixnLGgpO3JldHVybiBjP3t2YWx1ZTplfTplfX0sdmFsdWU6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gYj97Y29udGV4dDp1LG5hbWU6dSx2YWx1ZTphfTphfX0saWRlbnRpZmllcjpmdW5jdGlvbihhLGIsZCxjLGUpe3JldHVybiBmdW5jdGlvbihmLGcsaCxrKXtmPVxuZyYmYSBpbiBnP2c6ZjtjJiYxIT09YyYmZiYmIWZbYV0mJihmW2FdPXt9KTtnPWY/ZlthXTp1O2ImJnhhKGcsZSk7cmV0dXJuIGQ/e2NvbnRleHQ6ZixuYW1lOmEsdmFsdWU6Z306Z319LGNvbXB1dGVkTWVtYmVyOmZ1bmN0aW9uKGEsYixkLGMsZSl7cmV0dXJuIGZ1bmN0aW9uKGYsZyxoLGspe3ZhciBsPWEoZixnLGgsayksbSxuO251bGwhPWwmJihtPWIoZixnLGgsayksbT1qZChtKSxWYShtLGUpLGMmJjEhPT1jJiZsJiYhbFttXSYmKGxbbV09e30pLG49bFttXSx4YShuLGUpKTtyZXR1cm4gZD97Y29udGV4dDpsLG5hbWU6bSx2YWx1ZTpufTpufX0sbm9uQ29tcHV0ZWRNZW1iZXI6ZnVuY3Rpb24oYSxiLGQsYyxlLGYpe3JldHVybiBmdW5jdGlvbihnLGgsayxsKXtnPWEoZyxoLGssbCk7ZSYmMSE9PWUmJmcmJiFnW2JdJiYoZ1tiXT17fSk7aD1udWxsIT1nP2dbYl06dTsoZHx8RmIoYikpJiZ4YShoLGYpO3JldHVybiBjP3tjb250ZXh0OmcsbmFtZTpiLHZhbHVlOmh9Omh9fSxpbnB1dHM6ZnVuY3Rpb24oYSxcbmIpe3JldHVybiBmdW5jdGlvbihkLGMsZSxmKXtyZXR1cm4gZj9mW2JdOmEoZCxjLGUpfX19O3ZhciBnYz1mdW5jdGlvbihhLGIsZCl7dGhpcy5sZXhlcj1hO3RoaXMuJGZpbHRlcj1iO3RoaXMub3B0aW9ucz1kO3RoaXMuYXN0PW5ldyBzKHRoaXMubGV4ZXIpO3RoaXMuYXN0Q29tcGlsZXI9ZC5jc3A/bmV3IHNkKHRoaXMuYXN0LGIpOm5ldyByZCh0aGlzLmFzdCxiKX07Z2MucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpnYyxwYXJzZTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5hc3RDb21waWxlci5jb21waWxlKGEsdGhpcy5vcHRpb25zLmV4cGVuc2l2ZUNoZWNrcyl9fTskKCk7JCgpO3ZhciAkZj1PYmplY3QucHJvdG90eXBlLnZhbHVlT2YseWE9RyhcIiRzY2VcIiksbGE9e0hUTUw6XCJodG1sXCIsQ1NTOlwiY3NzXCIsVVJMOlwidXJsXCIsUkVTT1VSQ0VfVVJMOlwicmVzb3VyY2VVcmxcIixKUzpcImpzXCJ9LGhhPUcoXCIkY29tcGlsZVwiKSxZPVguY3JlYXRlRWxlbWVudChcImFcIiksd2Q9d2EoUy5sb2NhdGlvbi5ocmVmKTtcbnhkLiRpbmplY3Q9W1wiJGRvY3VtZW50XCJdO0pjLiRpbmplY3Q9W1wiJHByb3ZpZGVcIl07eWQuJGluamVjdD1bXCIkbG9jYWxlXCJdO0FkLiRpbmplY3Q9W1wiJGxvY2FsZVwiXTt2YXIgaWM9XCIuXCIsamc9e3l5eXk6Y2EoXCJGdWxsWWVhclwiLDQpLHl5OmNhKFwiRnVsbFllYXJcIiwyLDAsITApLHk6Y2EoXCJGdWxsWWVhclwiLDEpLE1NTU06SGIoXCJNb250aFwiKSxNTU06SGIoXCJNb250aFwiLCEwKSxNTTpjYShcIk1vbnRoXCIsMiwxKSxNOmNhKFwiTW9udGhcIiwxLDEpLGRkOmNhKFwiRGF0ZVwiLDIpLGQ6Y2EoXCJEYXRlXCIsMSksSEg6Y2EoXCJIb3Vyc1wiLDIpLEg6Y2EoXCJIb3Vyc1wiLDEpLGhoOmNhKFwiSG91cnNcIiwyLC0xMiksaDpjYShcIkhvdXJzXCIsMSwtMTIpLG1tOmNhKFwiTWludXRlc1wiLDIpLG06Y2EoXCJNaW51dGVzXCIsMSksc3M6Y2EoXCJTZWNvbmRzXCIsMiksczpjYShcIlNlY29uZHNcIiwxKSxzc3M6Y2EoXCJNaWxsaXNlY29uZHNcIiwzKSxFRUVFOkhiKFwiRGF5XCIpLEVFRTpIYihcIkRheVwiLCEwKSxhOmZ1bmN0aW9uKGEsYil7cmV0dXJuIDEyPlxuYS5nZXRIb3VycygpP2IuQU1QTVNbMF06Yi5BTVBNU1sxXX0sWjpmdW5jdGlvbihhLGIsZCl7YT0tMSpkO3JldHVybiBhPSgwPD1hP1wiK1wiOlwiXCIpKyhHYihNYXRoWzA8YT9cImZsb29yXCI6XCJjZWlsXCJdKGEvNjApLDIpK0diKE1hdGguYWJzKGElNjApLDIpKX0sd3c6RWQoMiksdzpFZCgxKSxHOmpjLEdHOmpjLEdHRzpqYyxHR0dHOmZ1bmN0aW9uKGEsYil7cmV0dXJuIDA+PWEuZ2V0RnVsbFllYXIoKT9iLkVSQU5BTUVTWzBdOmIuRVJBTkFNRVNbMV19fSxpZz0vKCg/OlteeU1kSGhtc2FaRXdHJ10rKXwoPzonKD86W14nXXwnJykqJyl8KD86RSt8eSt8TSt8ZCt8SCt8aCt8bSt8cyt8YXxafEcrfHcrKSkoLiopLyxoZz0vXlxcLT9cXGQrJC87emQuJGluamVjdD1bXCIkbG9jYWxlXCJdO3ZhciBlZz1uYShGKSxmZz1uYShzYik7QmQuJGluamVjdD1bXCIkcGFyc2VcIl07dmFyIGhlPW5hKHtyZXN0cmljdDpcIkVcIixjb21waWxlOmZ1bmN0aW9uKGEsYil7aWYoIWIuaHJlZiYmIWIueGxpbmtIcmVmKXJldHVybiBmdW5jdGlvbihhLFxuYil7aWYoXCJhXCI9PT1iWzBdLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkpe3ZhciBlPVwiW29iamVjdCBTVkdBbmltYXRlZFN0cmluZ11cIj09PXNhLmNhbGwoYi5wcm9wKFwiaHJlZlwiKSk/XCJ4bGluazpocmVmXCI6XCJocmVmXCI7Yi5vbihcImNsaWNrXCIsZnVuY3Rpb24oYSl7Yi5hdHRyKGUpfHxhLnByZXZlbnREZWZhdWx0KCl9KX19fX0pLHRiPXt9O24oQ2IsZnVuY3Rpb24oYSxiKXtmdW5jdGlvbiBkKGEsZCxlKXthLiR3YXRjaChlW2NdLGZ1bmN0aW9uKGEpe2UuJHNldChiLCEhYSl9KX1pZihcIm11bHRpcGxlXCIhPWEpe3ZhciBjPXZhKFwibmctXCIrYiksZT1kO1wiY2hlY2tlZFwiPT09YSYmKGU9ZnVuY3Rpb24oYSxiLGUpe2UubmdNb2RlbCE9PWVbY10mJmQoYSxiLGUpfSk7dGJbY109ZnVuY3Rpb24oKXtyZXR1cm57cmVzdHJpY3Q6XCJBXCIscHJpb3JpdHk6MTAwLGxpbms6ZX19fX0pO24oWmMsZnVuY3Rpb24oYSxiKXt0YltiXT1mdW5jdGlvbigpe3JldHVybntwcmlvcml0eToxMDAsbGluazpmdW5jdGlvbihhLFxuYyxlKXtpZihcIm5nUGF0dGVyblwiPT09YiYmXCIvXCI9PWUubmdQYXR0ZXJuLmNoYXJBdCgwKSYmKGM9ZS5uZ1BhdHRlcm4ubWF0Y2gobGcpKSl7ZS4kc2V0KFwibmdQYXR0ZXJuXCIsbmV3IFJlZ0V4cChjWzFdLGNbMl0pKTtyZXR1cm59YS4kd2F0Y2goZVtiXSxmdW5jdGlvbihhKXtlLiRzZXQoYixhKX0pfX19fSk7bihbXCJzcmNcIixcInNyY3NldFwiLFwiaHJlZlwiXSxmdW5jdGlvbihhKXt2YXIgYj12YShcIm5nLVwiK2EpO3RiW2JdPWZ1bmN0aW9uKCl7cmV0dXJue3ByaW9yaXR5Ojk5LGxpbms6ZnVuY3Rpb24oZCxjLGUpe3ZhciBmPWEsZz1hO1wiaHJlZlwiPT09YSYmXCJbb2JqZWN0IFNWR0FuaW1hdGVkU3RyaW5nXVwiPT09c2EuY2FsbChjLnByb3AoXCJocmVmXCIpKSYmKGc9XCJ4bGlua0hyZWZcIixlLiRhdHRyW2ddPVwieGxpbms6aHJlZlwiLGY9bnVsbCk7ZS4kb2JzZXJ2ZShiLGZ1bmN0aW9uKGIpe2I/KGUuJHNldChnLGIpLEhhJiZmJiZjLnByb3AoZixlW2ddKSk6XCJocmVmXCI9PT1hJiZlLiRzZXQoZyxudWxsKX0pfX19fSk7XG52YXIgSWI9eyRhZGRDb250cm9sOngsJCRyZW5hbWVDb250cm9sOmZ1bmN0aW9uKGEsYil7YS4kbmFtZT1ifSwkcmVtb3ZlQ29udHJvbDp4LCRzZXRWYWxpZGl0eTp4LCRzZXREaXJ0eTp4LCRzZXRQcmlzdGluZTp4LCRzZXRTdWJtaXR0ZWQ6eH07RmQuJGluamVjdD1bXCIkZWxlbWVudFwiLFwiJGF0dHJzXCIsXCIkc2NvcGVcIixcIiRhbmltYXRlXCIsXCIkaW50ZXJwb2xhdGVcIl07dmFyIE5kPWZ1bmN0aW9uKGEpe3JldHVybltcIiR0aW1lb3V0XCIsXCIkcGFyc2VcIixmdW5jdGlvbihiLGQpe2Z1bmN0aW9uIGMoYSl7cmV0dXJuXCJcIj09PWE/ZCgndGhpc1tcIlwiXScpLmFzc2lnbjpkKGEpLmFzc2lnbnx8eH1yZXR1cm57bmFtZTpcImZvcm1cIixyZXN0cmljdDphP1wiRUFDXCI6XCJFXCIscmVxdWlyZTpbXCJmb3JtXCIsXCJeXj9mb3JtXCJdLGNvbnRyb2xsZXI6RmQsY29tcGlsZTpmdW5jdGlvbihkLGYpe2QuYWRkQ2xhc3MoV2EpLmFkZENsYXNzKG1iKTt2YXIgZz1mLm5hbWU/XCJuYW1lXCI6YSYmZi5uZ0Zvcm0/XCJuZ0Zvcm1cIjpcbiExO3JldHVybntwcmU6ZnVuY3Rpb24oYSxkLGUsZil7dmFyIG49ZlswXTtpZighKFwiYWN0aW9uXCJpbiBlKSl7dmFyIHE9ZnVuY3Rpb24oYil7YS4kYXBwbHkoZnVuY3Rpb24oKXtuLiRjb21taXRWaWV3VmFsdWUoKTtuLiRzZXRTdWJtaXR0ZWQoKX0pO2IucHJldmVudERlZmF1bHQoKX07ZFswXS5hZGRFdmVudExpc3RlbmVyKFwic3VibWl0XCIscSwhMSk7ZC5vbihcIiRkZXN0cm95XCIsZnVuY3Rpb24oKXtiKGZ1bmN0aW9uKCl7ZFswXS5yZW1vdmVFdmVudExpc3RlbmVyKFwic3VibWl0XCIscSwhMSl9LDAsITEpfSl9KGZbMV18fG4uJCRwYXJlbnRGb3JtKS4kYWRkQ29udHJvbChuKTt2YXIgcz1nP2Mobi4kbmFtZSk6eDtnJiYocyhhLG4pLGUuJG9ic2VydmUoZyxmdW5jdGlvbihiKXtuLiRuYW1lIT09YiYmKHMoYSx1KSxuLiQkcGFyZW50Rm9ybS4kJHJlbmFtZUNvbnRyb2wobixiKSxzPWMobi4kbmFtZSkscyhhLG4pKX0pKTtkLm9uKFwiJGRlc3Ryb3lcIixmdW5jdGlvbigpe24uJCRwYXJlbnRGb3JtLiRyZW1vdmVDb250cm9sKG4pO1xucyhhLHUpO00obixJYil9KX19fX19XX0saWU9TmQoKSx2ZT1OZCghMCksa2c9L1xcZHs0fS1bMDFdXFxkLVswLTNdXFxkVFswLTJdXFxkOlswLTVdXFxkOlswLTVdXFxkXFwuXFxkKyhbKy1dWzAtMl1cXGQ6WzAtNV1cXGR8WikvLHRnPS9eW0EtWmEtel1bQS1aYS16XFxkListXSo6XFwvKig/OlxcdysoPzo6XFx3Kyk/QCk/W15cXHMvXSsoPzo6XFxkKyk/KD86XFwvW1xcdyMhOi4/Kz0mJUBcXC0vXSopPyQvLHVnPS9eW2EtejAtOSEjJCUmJyorXFwvPT9eX2B7fH1+Li1dK0BbYS16MC05XShbYS16MC05LV0qW2EtejAtOV0pPyhcXC5bYS16MC05XShbYS16MC05LV0qW2EtejAtOV0pPykqJC9pLHZnPS9eXFxzKihcXC18XFwrKT8oXFxkK3woXFxkKihcXC5cXGQqKSkpKFtlRV1bKy1dP1xcZCspP1xccyokLyxPZD0vXihcXGR7NH0pLShcXGR7Mn0pLShcXGR7Mn0pJC8sUGQ9L14oXFxkezR9KS0oXFxkXFxkKS0oXFxkXFxkKVQoXFxkXFxkKTooXFxkXFxkKSg/OjooXFxkXFxkKShcXC5cXGR7MSwzfSk/KT8kLyxtYz0vXihcXGR7NH0pLVcoXFxkXFxkKSQvLFFkPS9eKFxcZHs0fSktKFxcZFxcZCkkLyxcblJkPS9eKFxcZFxcZCk6KFxcZFxcZCkoPzo6KFxcZFxcZCkoXFwuXFxkezEsM30pPyk/JC8sU2Q9e3RleHQ6ZnVuY3Rpb24oYSxiLGQsYyxlLGYpe2piKGEsYixkLGMsZSxmKTtrYyhjKX0sZGF0ZTprYihcImRhdGVcIixPZCxLYihPZCxbXCJ5eXl5XCIsXCJNTVwiLFwiZGRcIl0pLFwieXl5eS1NTS1kZFwiKSxcImRhdGV0aW1lLWxvY2FsXCI6a2IoXCJkYXRldGltZWxvY2FsXCIsUGQsS2IoUGQsXCJ5eXl5IE1NIGRkIEhIIG1tIHNzIHNzc1wiLnNwbGl0KFwiIFwiKSksXCJ5eXl5LU1NLWRkVEhIOm1tOnNzLnNzc1wiKSx0aW1lOmtiKFwidGltZVwiLFJkLEtiKFJkLFtcIkhIXCIsXCJtbVwiLFwic3NcIixcInNzc1wiXSksXCJISDptbTpzcy5zc3NcIiksd2VlazprYihcIndlZWtcIixtYyxmdW5jdGlvbihhLGIpe2lmKGRhKGEpKXJldHVybiBhO2lmKEUoYSkpe21jLmxhc3RJbmRleD0wO3ZhciBkPW1jLmV4ZWMoYSk7aWYoZCl7dmFyIGM9K2RbMV0sZT0rZFsyXSxmPWQ9MCxnPTAsaD0wLGs9RGQoYyksZT03KihlLTEpO2ImJihkPWIuZ2V0SG91cnMoKSxmPVxuYi5nZXRNaW51dGVzKCksZz1iLmdldFNlY29uZHMoKSxoPWIuZ2V0TWlsbGlzZWNvbmRzKCkpO3JldHVybiBuZXcgRGF0ZShjLDAsay5nZXREYXRlKCkrZSxkLGYsZyxoKX19cmV0dXJuIE5hTn0sXCJ5eXl5LVd3d1wiKSxtb250aDprYihcIm1vbnRoXCIsUWQsS2IoUWQsW1wieXl5eVwiLFwiTU1cIl0pLFwieXl5eS1NTVwiKSxudW1iZXI6ZnVuY3Rpb24oYSxiLGQsYyxlLGYpe0hkKGEsYixkLGMpO2piKGEsYixkLGMsZSxmKTtjLiQkcGFyc2VyTmFtZT1cIm51bWJlclwiO2MuJHBhcnNlcnMucHVzaChmdW5jdGlvbihhKXtyZXR1cm4gYy4kaXNFbXB0eShhKT9udWxsOnZnLnRlc3QoYSk/cGFyc2VGbG9hdChhKTp1fSk7Yy4kZm9ybWF0dGVycy5wdXNoKGZ1bmN0aW9uKGEpe2lmKCFjLiRpc0VtcHR5KGEpKXtpZighUShhKSl0aHJvdyBsYihcIm51bWZtdFwiLGEpO2E9YS50b1N0cmluZygpfXJldHVybiBhfSk7aWYoeShkLm1pbil8fGQubmdNaW4pe3ZhciBnO2MuJHZhbGlkYXRvcnMubWluPWZ1bmN0aW9uKGEpe3JldHVybiBjLiRpc0VtcHR5KGEpfHxcbnEoZyl8fGE+PWd9O2QuJG9ic2VydmUoXCJtaW5cIixmdW5jdGlvbihhKXt5KGEpJiYhUShhKSYmKGE9cGFyc2VGbG9hdChhLDEwKSk7Zz1RKGEpJiYhaXNOYU4oYSk/YTp1O2MuJHZhbGlkYXRlKCl9KX1pZih5KGQubWF4KXx8ZC5uZ01heCl7dmFyIGg7Yy4kdmFsaWRhdG9ycy5tYXg9ZnVuY3Rpb24oYSl7cmV0dXJuIGMuJGlzRW1wdHkoYSl8fHEoaCl8fGE8PWh9O2QuJG9ic2VydmUoXCJtYXhcIixmdW5jdGlvbihhKXt5KGEpJiYhUShhKSYmKGE9cGFyc2VGbG9hdChhLDEwKSk7aD1RKGEpJiYhaXNOYU4oYSk/YTp1O2MuJHZhbGlkYXRlKCl9KX19LHVybDpmdW5jdGlvbihhLGIsZCxjLGUsZil7amIoYSxiLGQsYyxlLGYpO2tjKGMpO2MuJCRwYXJzZXJOYW1lPVwidXJsXCI7Yy4kdmFsaWRhdG9ycy51cmw9ZnVuY3Rpb24oYSxiKXt2YXIgZD1hfHxiO3JldHVybiBjLiRpc0VtcHR5KGQpfHx0Zy50ZXN0KGQpfX0sZW1haWw6ZnVuY3Rpb24oYSxiLGQsYyxlLGYpe2piKGEsYixkLGMsZSxmKTtrYyhjKTtcbmMuJCRwYXJzZXJOYW1lPVwiZW1haWxcIjtjLiR2YWxpZGF0b3JzLmVtYWlsPWZ1bmN0aW9uKGEsYil7dmFyIGQ9YXx8YjtyZXR1cm4gYy4kaXNFbXB0eShkKXx8dWcudGVzdChkKX19LHJhZGlvOmZ1bmN0aW9uKGEsYixkLGMpe3EoZC5uYW1lKSYmYi5hdHRyKFwibmFtZVwiLCsrbmIpO2Iub24oXCJjbGlja1wiLGZ1bmN0aW9uKGEpe2JbMF0uY2hlY2tlZCYmYy4kc2V0Vmlld1ZhbHVlKGQudmFsdWUsYSYmYS50eXBlKX0pO2MuJHJlbmRlcj1mdW5jdGlvbigpe2JbMF0uY2hlY2tlZD1kLnZhbHVlPT1jLiR2aWV3VmFsdWV9O2QuJG9ic2VydmUoXCJ2YWx1ZVwiLGMuJHJlbmRlcil9LGNoZWNrYm94OmZ1bmN0aW9uKGEsYixkLGMsZSxmLGcsaCl7dmFyIGs9SWQoaCxhLFwibmdUcnVlVmFsdWVcIixkLm5nVHJ1ZVZhbHVlLCEwKSxsPUlkKGgsYSxcIm5nRmFsc2VWYWx1ZVwiLGQubmdGYWxzZVZhbHVlLCExKTtiLm9uKFwiY2xpY2tcIixmdW5jdGlvbihhKXtjLiRzZXRWaWV3VmFsdWUoYlswXS5jaGVja2VkLGEmJlxuYS50eXBlKX0pO2MuJHJlbmRlcj1mdW5jdGlvbigpe2JbMF0uY2hlY2tlZD1jLiR2aWV3VmFsdWV9O2MuJGlzRW1wdHk9ZnVuY3Rpb24oYSl7cmV0dXJuITE9PT1hfTtjLiRmb3JtYXR0ZXJzLnB1c2goZnVuY3Rpb24oYSl7cmV0dXJuIG1hKGEsayl9KTtjLiRwYXJzZXJzLnB1c2goZnVuY3Rpb24oYSl7cmV0dXJuIGE/azpsfSl9LGhpZGRlbjp4LGJ1dHRvbjp4LHN1Ym1pdDp4LHJlc2V0OngsZmlsZTp4fSxEYz1bXCIkYnJvd3NlclwiLFwiJHNuaWZmZXJcIixcIiRmaWx0ZXJcIixcIiRwYXJzZVwiLGZ1bmN0aW9uKGEsYixkLGMpe3JldHVybntyZXN0cmljdDpcIkVcIixyZXF1aXJlOltcIj9uZ01vZGVsXCJdLGxpbms6e3ByZTpmdW5jdGlvbihlLGYsZyxoKXtoWzBdJiYoU2RbRihnLnR5cGUpXXx8U2QudGV4dCkoZSxmLGcsaFswXSxiLGEsZCxjKX19fX1dLHdnPS9eKHRydWV8ZmFsc2V8XFxkKykkLyxOZT1mdW5jdGlvbigpe3JldHVybntyZXN0cmljdDpcIkFcIixwcmlvcml0eToxMDAsY29tcGlsZTpmdW5jdGlvbihhLFxuYil7cmV0dXJuIHdnLnRlc3QoYi5uZ1ZhbHVlKT9mdW5jdGlvbihhLGIsZSl7ZS4kc2V0KFwidmFsdWVcIixhLiRldmFsKGUubmdWYWx1ZSkpfTpmdW5jdGlvbihhLGIsZSl7YS4kd2F0Y2goZS5uZ1ZhbHVlLGZ1bmN0aW9uKGEpe2UuJHNldChcInZhbHVlXCIsYSl9KX19fX0sbmU9W1wiJGNvbXBpbGVcIixmdW5jdGlvbihhKXtyZXR1cm57cmVzdHJpY3Q6XCJBQ1wiLGNvbXBpbGU6ZnVuY3Rpb24oYil7YS4kJGFkZEJpbmRpbmdDbGFzcyhiKTtyZXR1cm4gZnVuY3Rpb24oYixjLGUpe2EuJCRhZGRCaW5kaW5nSW5mbyhjLGUubmdCaW5kKTtjPWNbMF07Yi4kd2F0Y2goZS5uZ0JpbmQsZnVuY3Rpb24oYSl7Yy50ZXh0Q29udGVudD1xKGEpP1wiXCI6YX0pfX19fV0scGU9W1wiJGludGVycG9sYXRlXCIsXCIkY29tcGlsZVwiLGZ1bmN0aW9uKGEsYil7cmV0dXJue2NvbXBpbGU6ZnVuY3Rpb24oZCl7Yi4kJGFkZEJpbmRpbmdDbGFzcyhkKTtyZXR1cm4gZnVuY3Rpb24oYyxkLGYpe2M9YShkLmF0dHIoZi4kYXR0ci5uZ0JpbmRUZW1wbGF0ZSkpO1xuYi4kJGFkZEJpbmRpbmdJbmZvKGQsYy5leHByZXNzaW9ucyk7ZD1kWzBdO2YuJG9ic2VydmUoXCJuZ0JpbmRUZW1wbGF0ZVwiLGZ1bmN0aW9uKGEpe2QudGV4dENvbnRlbnQ9cShhKT9cIlwiOmF9KX19fX1dLG9lPVtcIiRzY2VcIixcIiRwYXJzZVwiLFwiJGNvbXBpbGVcIixmdW5jdGlvbihhLGIsZCl7cmV0dXJue3Jlc3RyaWN0OlwiQVwiLGNvbXBpbGU6ZnVuY3Rpb24oYyxlKXt2YXIgZj1iKGUubmdCaW5kSHRtbCksZz1iKGUubmdCaW5kSHRtbCxmdW5jdGlvbihhKXtyZXR1cm4oYXx8XCJcIikudG9TdHJpbmcoKX0pO2QuJCRhZGRCaW5kaW5nQ2xhc3MoYyk7cmV0dXJuIGZ1bmN0aW9uKGIsYyxlKXtkLiQkYWRkQmluZGluZ0luZm8oYyxlLm5nQmluZEh0bWwpO2IuJHdhdGNoKGcsZnVuY3Rpb24oKXtjLmh0bWwoYS5nZXRUcnVzdGVkSHRtbChmKGIpKXx8XCJcIil9KX19fX1dLE1lPW5hKHtyZXN0cmljdDpcIkFcIixyZXF1aXJlOlwibmdNb2RlbFwiLGxpbms6ZnVuY3Rpb24oYSxiLGQsYyl7Yy4kdmlld0NoYW5nZUxpc3RlbmVycy5wdXNoKGZ1bmN0aW9uKCl7YS4kZXZhbChkLm5nQ2hhbmdlKX0pfX0pLFxucWU9bGMoXCJcIiwhMCksc2U9bGMoXCJPZGRcIiwwKSxyZT1sYyhcIkV2ZW5cIiwxKSx0ZT1MYSh7Y29tcGlsZTpmdW5jdGlvbihhLGIpe2IuJHNldChcIm5nQ2xvYWtcIix1KTthLnJlbW92ZUNsYXNzKFwibmctY2xvYWtcIil9fSksdWU9W2Z1bmN0aW9uKCl7cmV0dXJue3Jlc3RyaWN0OlwiQVwiLHNjb3BlOiEwLGNvbnRyb2xsZXI6XCJAXCIscHJpb3JpdHk6NTAwfX1dLEljPXt9LHhnPXtibHVyOiEwLGZvY3VzOiEwfTtuKFwiY2xpY2sgZGJsY2xpY2sgbW91c2Vkb3duIG1vdXNldXAgbW91c2VvdmVyIG1vdXNlb3V0IG1vdXNlbW92ZSBtb3VzZWVudGVyIG1vdXNlbGVhdmUga2V5ZG93biBrZXl1cCBrZXlwcmVzcyBzdWJtaXQgZm9jdXMgYmx1ciBjb3B5IGN1dCBwYXN0ZVwiLnNwbGl0KFwiIFwiKSxmdW5jdGlvbihhKXt2YXIgYj12YShcIm5nLVwiK2EpO0ljW2JdPVtcIiRwYXJzZVwiLFwiJHJvb3RTY29wZVwiLGZ1bmN0aW9uKGQsYyl7cmV0dXJue3Jlc3RyaWN0OlwiQVwiLGNvbXBpbGU6ZnVuY3Rpb24oZSxmKXt2YXIgZz1cbmQoZltiXSxudWxsLCEwKTtyZXR1cm4gZnVuY3Rpb24oYixkKXtkLm9uKGEsZnVuY3Rpb24oZCl7dmFyIGU9ZnVuY3Rpb24oKXtnKGIseyRldmVudDpkfSl9O3hnW2FdJiZjLiQkcGhhc2U/Yi4kZXZhbEFzeW5jKGUpOmIuJGFwcGx5KGUpfSl9fX19XX0pO3ZhciB4ZT1bXCIkYW5pbWF0ZVwiLGZ1bmN0aW9uKGEpe3JldHVybnttdWx0aUVsZW1lbnQ6ITAsdHJhbnNjbHVkZTpcImVsZW1lbnRcIixwcmlvcml0eTo2MDAsdGVybWluYWw6ITAscmVzdHJpY3Q6XCJBXCIsJCR0bGI6ITAsbGluazpmdW5jdGlvbihiLGQsYyxlLGYpe3ZhciBnLGgsaztiLiR3YXRjaChjLm5nSWYsZnVuY3Rpb24oYil7Yj9ofHxmKGZ1bmN0aW9uKGIsZSl7aD1lO2JbYi5sZW5ndGgrK109WC5jcmVhdGVDb21tZW50KFwiIGVuZCBuZ0lmOiBcIitjLm5nSWYrXCIgXCIpO2c9e2Nsb25lOmJ9O2EuZW50ZXIoYixkLnBhcmVudCgpLGQpfSk6KGsmJihrLnJlbW92ZSgpLGs9bnVsbCksaCYmKGguJGRlc3Ryb3koKSxoPW51bGwpLGcmJihrPVxucmIoZy5jbG9uZSksYS5sZWF2ZShrKS50aGVuKGZ1bmN0aW9uKCl7az1udWxsfSksZz1udWxsKSl9KX19fV0seWU9W1wiJHRlbXBsYXRlUmVxdWVzdFwiLFwiJGFuY2hvclNjcm9sbFwiLFwiJGFuaW1hdGVcIixmdW5jdGlvbihhLGIsZCl7cmV0dXJue3Jlc3RyaWN0OlwiRUNBXCIscHJpb3JpdHk6NDAwLHRlcm1pbmFsOiEwLHRyYW5zY2x1ZGU6XCJlbGVtZW50XCIsY29udHJvbGxlcjpmYS5ub29wLGNvbXBpbGU6ZnVuY3Rpb24oYyxlKXt2YXIgZj1lLm5nSW5jbHVkZXx8ZS5zcmMsZz1lLm9ubG9hZHx8XCJcIixoPWUuYXV0b3Njcm9sbDtyZXR1cm4gZnVuY3Rpb24oYyxlLG0sbixxKXt2YXIgcz0wLHYsdSxwLEM9ZnVuY3Rpb24oKXt1JiYodS5yZW1vdmUoKSx1PW51bGwpO3YmJih2LiRkZXN0cm95KCksdj1udWxsKTtwJiYoZC5sZWF2ZShwKS50aGVuKGZ1bmN0aW9uKCl7dT1udWxsfSksdT1wLHA9bnVsbCl9O2MuJHdhdGNoKGYsZnVuY3Rpb24oZil7dmFyIG09ZnVuY3Rpb24oKXsheShoKXx8aCYmIWMuJGV2YWwoaCl8fFxuYigpfSx1PSsrcztmPyhhKGYsITApLnRoZW4oZnVuY3Rpb24oYSl7aWYodT09PXMpe3ZhciBiPWMuJG5ldygpO24udGVtcGxhdGU9YTthPXEoYixmdW5jdGlvbihhKXtDKCk7ZC5lbnRlcihhLG51bGwsZSkudGhlbihtKX0pO3Y9YjtwPWE7di4kZW1pdChcIiRpbmNsdWRlQ29udGVudExvYWRlZFwiLGYpO2MuJGV2YWwoZyl9fSxmdW5jdGlvbigpe3U9PT1zJiYoQygpLGMuJGVtaXQoXCIkaW5jbHVkZUNvbnRlbnRFcnJvclwiLGYpKX0pLGMuJGVtaXQoXCIkaW5jbHVkZUNvbnRlbnRSZXF1ZXN0ZWRcIixmKSk6KEMoKSxuLnRlbXBsYXRlPW51bGwpfSl9fX19XSxQZT1bXCIkY29tcGlsZVwiLGZ1bmN0aW9uKGEpe3JldHVybntyZXN0cmljdDpcIkVDQVwiLHByaW9yaXR5Oi00MDAscmVxdWlyZTpcIm5nSW5jbHVkZVwiLGxpbms6ZnVuY3Rpb24oYixkLGMsZSl7L1NWRy8udGVzdChkWzBdLnRvU3RyaW5nKCkpPyhkLmVtcHR5KCksYShMYyhlLnRlbXBsYXRlLFgpLmNoaWxkTm9kZXMpKGIsZnVuY3Rpb24oYSl7ZC5hcHBlbmQoYSl9LFxue2Z1dHVyZVBhcmVudEVsZW1lbnQ6ZH0pKTooZC5odG1sKGUudGVtcGxhdGUpLGEoZC5jb250ZW50cygpKShiKSl9fX1dLHplPUxhKHtwcmlvcml0eTo0NTAsY29tcGlsZTpmdW5jdGlvbigpe3JldHVybntwcmU6ZnVuY3Rpb24oYSxiLGQpe2EuJGV2YWwoZC5uZ0luaXQpfX19fSksTGU9ZnVuY3Rpb24oKXtyZXR1cm57cmVzdHJpY3Q6XCJBXCIscHJpb3JpdHk6MTAwLHJlcXVpcmU6XCJuZ01vZGVsXCIsbGluazpmdW5jdGlvbihhLGIsZCxjKXt2YXIgZT1iLmF0dHIoZC4kYXR0ci5uZ0xpc3QpfHxcIiwgXCIsZj1cImZhbHNlXCIhPT1kLm5nVHJpbSxnPWY/VShlKTplO2MuJHBhcnNlcnMucHVzaChmdW5jdGlvbihhKXtpZighcShhKSl7dmFyIGI9W107YSYmbihhLnNwbGl0KGcpLGZ1bmN0aW9uKGEpe2EmJmIucHVzaChmP1UoYSk6YSl9KTtyZXR1cm4gYn19KTtjLiRmb3JtYXR0ZXJzLnB1c2goZnVuY3Rpb24oYSl7cmV0dXJuIEkoYSk/YS5qb2luKGUpOnV9KTtjLiRpc0VtcHR5PWZ1bmN0aW9uKGEpe3JldHVybiFhfHxcbiFhLmxlbmd0aH19fX0sbWI9XCJuZy12YWxpZFwiLEpkPVwibmctaW52YWxpZFwiLFdhPVwibmctcHJpc3RpbmVcIixKYj1cIm5nLWRpcnR5XCIsTGQ9XCJuZy1wZW5kaW5nXCIsbGI9RyhcIm5nTW9kZWxcIikseWc9W1wiJHNjb3BlXCIsXCIkZXhjZXB0aW9uSGFuZGxlclwiLFwiJGF0dHJzXCIsXCIkZWxlbWVudFwiLFwiJHBhcnNlXCIsXCIkYW5pbWF0ZVwiLFwiJHRpbWVvdXRcIixcIiRyb290U2NvcGVcIixcIiRxXCIsXCIkaW50ZXJwb2xhdGVcIixmdW5jdGlvbihhLGIsZCxjLGUsZixnLGgsayxsKXt0aGlzLiRtb2RlbFZhbHVlPXRoaXMuJHZpZXdWYWx1ZT1OdW1iZXIuTmFOO3RoaXMuJCRyYXdNb2RlbFZhbHVlPXU7dGhpcy4kdmFsaWRhdG9ycz17fTt0aGlzLiRhc3luY1ZhbGlkYXRvcnM9e307dGhpcy4kcGFyc2Vycz1bXTt0aGlzLiRmb3JtYXR0ZXJzPVtdO3RoaXMuJHZpZXdDaGFuZ2VMaXN0ZW5lcnM9W107dGhpcy4kdW50b3VjaGVkPSEwO3RoaXMuJHRvdWNoZWQ9ITE7dGhpcy4kcHJpc3RpbmU9ITA7dGhpcy4kZGlydHk9ITE7XG50aGlzLiR2YWxpZD0hMDt0aGlzLiRpbnZhbGlkPSExO3RoaXMuJGVycm9yPXt9O3RoaXMuJCRzdWNjZXNzPXt9O3RoaXMuJHBlbmRpbmc9dTt0aGlzLiRuYW1lPWwoZC5uYW1lfHxcIlwiLCExKShhKTt0aGlzLiQkcGFyZW50Rm9ybT1JYjt2YXIgbT1lKGQubmdNb2RlbCkscj1tLmFzc2lnbix0PW0scz1yLHY9bnVsbCxCLHA9dGhpczt0aGlzLiQkc2V0T3B0aW9ucz1mdW5jdGlvbihhKXtpZigocC4kb3B0aW9ucz1hKSYmYS5nZXR0ZXJTZXR0ZXIpe3ZhciBiPWUoZC5uZ01vZGVsK1wiKClcIiksZj1lKGQubmdNb2RlbCtcIigkJCRwKVwiKTt0PWZ1bmN0aW9uKGEpe3ZhciBjPW0oYSk7eihjKSYmKGM9YihhKSk7cmV0dXJuIGN9O3M9ZnVuY3Rpb24oYSxiKXt6KG0oYSkpP2YoYSx7JCQkcDpwLiRtb2RlbFZhbHVlfSk6cihhLHAuJG1vZGVsVmFsdWUpfX1lbHNlIGlmKCFtLmFzc2lnbil0aHJvdyBsYihcIm5vbmFzc2lnblwiLGQubmdNb2RlbCx1YShjKSk7fTt0aGlzLiRyZW5kZXI9eDt0aGlzLiRpc0VtcHR5PVxuZnVuY3Rpb24oYSl7cmV0dXJuIHEoYSl8fFwiXCI9PT1hfHxudWxsPT09YXx8YSE9PWF9O3ZhciBDPTA7R2Qoe2N0cmw6dGhpcywkZWxlbWVudDpjLHNldDpmdW5jdGlvbihhLGIpe2FbYl09ITB9LHVuc2V0OmZ1bmN0aW9uKGEsYil7ZGVsZXRlIGFbYl19LCRhbmltYXRlOmZ9KTt0aGlzLiRzZXRQcmlzdGluZT1mdW5jdGlvbigpe3AuJGRpcnR5PSExO3AuJHByaXN0aW5lPSEwO2YucmVtb3ZlQ2xhc3MoYyxKYik7Zi5hZGRDbGFzcyhjLFdhKX07dGhpcy4kc2V0RGlydHk9ZnVuY3Rpb24oKXtwLiRkaXJ0eT0hMDtwLiRwcmlzdGluZT0hMTtmLnJlbW92ZUNsYXNzKGMsV2EpO2YuYWRkQ2xhc3MoYyxKYik7cC4kJHBhcmVudEZvcm0uJHNldERpcnR5KCl9O3RoaXMuJHNldFVudG91Y2hlZD1mdW5jdGlvbigpe3AuJHRvdWNoZWQ9ITE7cC4kdW50b3VjaGVkPSEwO2Yuc2V0Q2xhc3MoYyxcIm5nLXVudG91Y2hlZFwiLFwibmctdG91Y2hlZFwiKX07dGhpcy4kc2V0VG91Y2hlZD1mdW5jdGlvbigpe3AuJHRvdWNoZWQ9XG4hMDtwLiR1bnRvdWNoZWQ9ITE7Zi5zZXRDbGFzcyhjLFwibmctdG91Y2hlZFwiLFwibmctdW50b3VjaGVkXCIpfTt0aGlzLiRyb2xsYmFja1ZpZXdWYWx1ZT1mdW5jdGlvbigpe2cuY2FuY2VsKHYpO3AuJHZpZXdWYWx1ZT1wLiQkbGFzdENvbW1pdHRlZFZpZXdWYWx1ZTtwLiRyZW5kZXIoKX07dGhpcy4kdmFsaWRhdGU9ZnVuY3Rpb24oKXtpZighUShwLiRtb2RlbFZhbHVlKXx8IWlzTmFOKHAuJG1vZGVsVmFsdWUpKXt2YXIgYT1wLiQkcmF3TW9kZWxWYWx1ZSxiPXAuJHZhbGlkLGM9cC4kbW9kZWxWYWx1ZSxkPXAuJG9wdGlvbnMmJnAuJG9wdGlvbnMuYWxsb3dJbnZhbGlkO3AuJCRydW5WYWxpZGF0b3JzKGEscC4kJGxhc3RDb21taXR0ZWRWaWV3VmFsdWUsZnVuY3Rpb24oZSl7ZHx8Yj09PWV8fChwLiRtb2RlbFZhbHVlPWU/YTp1LHAuJG1vZGVsVmFsdWUhPT1jJiZwLiQkd3JpdGVNb2RlbFRvU2NvcGUoKSl9KX19O3RoaXMuJCRydW5WYWxpZGF0b3JzPWZ1bmN0aW9uKGEsYixjKXtmdW5jdGlvbiBkKCl7dmFyIGM9XG4hMDtuKHAuJHZhbGlkYXRvcnMsZnVuY3Rpb24oZCxlKXt2YXIgZz1kKGEsYik7Yz1jJiZnO2YoZSxnKX0pO3JldHVybiBjPyEwOihuKHAuJGFzeW5jVmFsaWRhdG9ycyxmdW5jdGlvbihhLGIpe2YoYixudWxsKX0pLCExKX1mdW5jdGlvbiBlKCl7dmFyIGM9W10sZD0hMDtuKHAuJGFzeW5jVmFsaWRhdG9ycyxmdW5jdGlvbihlLGcpe3ZhciBoPWUoYSxiKTtpZighaHx8IXooaC50aGVuKSl0aHJvdyBsYihcIiRhc3luY1ZhbGlkYXRvcnNcIixoKTtmKGcsdSk7Yy5wdXNoKGgudGhlbihmdW5jdGlvbigpe2YoZywhMCl9LGZ1bmN0aW9uKGEpe2Q9ITE7ZihnLCExKX0pKX0pO2MubGVuZ3RoP2suYWxsKGMpLnRoZW4oZnVuY3Rpb24oKXtnKGQpfSx4KTpnKCEwKX1mdW5jdGlvbiBmKGEsYil7aD09PUMmJnAuJHNldFZhbGlkaXR5KGEsYil9ZnVuY3Rpb24gZyhhKXtoPT09QyYmYyhhKX1DKys7dmFyIGg9QzsoZnVuY3Rpb24oKXt2YXIgYT1wLiQkcGFyc2VyTmFtZXx8XCJwYXJzZVwiO2lmKHEoQikpZihhLFxubnVsbCk7ZWxzZSByZXR1cm4gQnx8KG4ocC4kdmFsaWRhdG9ycyxmdW5jdGlvbihhLGIpe2YoYixudWxsKX0pLG4ocC4kYXN5bmNWYWxpZGF0b3JzLGZ1bmN0aW9uKGEsYil7ZihiLG51bGwpfSkpLGYoYSxCKSxCO3JldHVybiEwfSkoKT9kKCk/ZSgpOmcoITEpOmcoITEpfTt0aGlzLiRjb21taXRWaWV3VmFsdWU9ZnVuY3Rpb24oKXt2YXIgYT1wLiR2aWV3VmFsdWU7Zy5jYW5jZWwodik7aWYocC4kJGxhc3RDb21taXR0ZWRWaWV3VmFsdWUhPT1hfHxcIlwiPT09YSYmcC4kJGhhc05hdGl2ZVZhbGlkYXRvcnMpcC4kJGxhc3RDb21taXR0ZWRWaWV3VmFsdWU9YSxwLiRwcmlzdGluZSYmdGhpcy4kc2V0RGlydHkoKSx0aGlzLiQkcGFyc2VBbmRWYWxpZGF0ZSgpfTt0aGlzLiQkcGFyc2VBbmRWYWxpZGF0ZT1mdW5jdGlvbigpe3ZhciBiPXAuJCRsYXN0Q29tbWl0dGVkVmlld1ZhbHVlO2lmKEI9cShiKT91OiEwKWZvcih2YXIgYz0wO2M8cC4kcGFyc2Vycy5sZW5ndGg7YysrKWlmKGI9cC4kcGFyc2Vyc1tjXShiKSxcbnEoYikpe0I9ITE7YnJlYWt9UShwLiRtb2RlbFZhbHVlKSYmaXNOYU4ocC4kbW9kZWxWYWx1ZSkmJihwLiRtb2RlbFZhbHVlPXQoYSkpO3ZhciBkPXAuJG1vZGVsVmFsdWUsZT1wLiRvcHRpb25zJiZwLiRvcHRpb25zLmFsbG93SW52YWxpZDtwLiQkcmF3TW9kZWxWYWx1ZT1iO2UmJihwLiRtb2RlbFZhbHVlPWIscC4kbW9kZWxWYWx1ZSE9PWQmJnAuJCR3cml0ZU1vZGVsVG9TY29wZSgpKTtwLiQkcnVuVmFsaWRhdG9ycyhiLHAuJCRsYXN0Q29tbWl0dGVkVmlld1ZhbHVlLGZ1bmN0aW9uKGEpe2V8fChwLiRtb2RlbFZhbHVlPWE/Yjp1LHAuJG1vZGVsVmFsdWUhPT1kJiZwLiQkd3JpdGVNb2RlbFRvU2NvcGUoKSl9KX07dGhpcy4kJHdyaXRlTW9kZWxUb1Njb3BlPWZ1bmN0aW9uKCl7cyhhLHAuJG1vZGVsVmFsdWUpO24ocC4kdmlld0NoYW5nZUxpc3RlbmVycyxmdW5jdGlvbihhKXt0cnl7YSgpfWNhdGNoKGMpe2IoYyl9fSl9O3RoaXMuJHNldFZpZXdWYWx1ZT1mdW5jdGlvbihhLGIpe3AuJHZpZXdWYWx1ZT1cbmE7cC4kb3B0aW9ucyYmIXAuJG9wdGlvbnMudXBkYXRlT25EZWZhdWx0fHxwLiQkZGVib3VuY2VWaWV3VmFsdWVDb21taXQoYil9O3RoaXMuJCRkZWJvdW5jZVZpZXdWYWx1ZUNvbW1pdD1mdW5jdGlvbihiKXt2YXIgYz0wLGQ9cC4kb3B0aW9ucztkJiZ5KGQuZGVib3VuY2UpJiYoZD1kLmRlYm91bmNlLFEoZCk/Yz1kOlEoZFtiXSk/Yz1kW2JdOlEoZFtcImRlZmF1bHRcIl0pJiYoYz1kW1wiZGVmYXVsdFwiXSkpO2cuY2FuY2VsKHYpO2M/dj1nKGZ1bmN0aW9uKCl7cC4kY29tbWl0Vmlld1ZhbHVlKCl9LGMpOmguJCRwaGFzZT9wLiRjb21taXRWaWV3VmFsdWUoKTphLiRhcHBseShmdW5jdGlvbigpe3AuJGNvbW1pdFZpZXdWYWx1ZSgpfSl9O2EuJHdhdGNoKGZ1bmN0aW9uKCl7dmFyIGI9dChhKTtpZihiIT09cC4kbW9kZWxWYWx1ZSYmKHAuJG1vZGVsVmFsdWU9PT1wLiRtb2RlbFZhbHVlfHxiPT09Yikpe3AuJG1vZGVsVmFsdWU9cC4kJHJhd01vZGVsVmFsdWU9YjtCPXU7Zm9yKHZhciBjPXAuJGZvcm1hdHRlcnMsXG5kPWMubGVuZ3RoLGU9YjtkLS07KWU9Y1tkXShlKTtwLiR2aWV3VmFsdWUhPT1lJiYocC4kdmlld1ZhbHVlPXAuJCRsYXN0Q29tbWl0dGVkVmlld1ZhbHVlPWUscC4kcmVuZGVyKCkscC4kJHJ1blZhbGlkYXRvcnMoYixlLHgpKX1yZXR1cm4gYn0pfV0sS2U9W1wiJHJvb3RTY29wZVwiLGZ1bmN0aW9uKGEpe3JldHVybntyZXN0cmljdDpcIkFcIixyZXF1aXJlOltcIm5nTW9kZWxcIixcIl4/Zm9ybVwiLFwiXj9uZ01vZGVsT3B0aW9uc1wiXSxjb250cm9sbGVyOnlnLHByaW9yaXR5OjEsY29tcGlsZTpmdW5jdGlvbihiKXtiLmFkZENsYXNzKFdhKS5hZGRDbGFzcyhcIm5nLXVudG91Y2hlZFwiKS5hZGRDbGFzcyhtYik7cmV0dXJue3ByZTpmdW5jdGlvbihhLGIsZSxmKXt2YXIgZz1mWzBdO2I9ZlsxXXx8Zy4kJHBhcmVudEZvcm07Zy4kJHNldE9wdGlvbnMoZlsyXSYmZlsyXS4kb3B0aW9ucyk7Yi4kYWRkQ29udHJvbChnKTtlLiRvYnNlcnZlKFwibmFtZVwiLGZ1bmN0aW9uKGEpe2cuJG5hbWUhPT1hJiZnLiQkcGFyZW50Rm9ybS4kJHJlbmFtZUNvbnRyb2woZyxcbmEpfSk7YS4kb24oXCIkZGVzdHJveVwiLGZ1bmN0aW9uKCl7Zy4kJHBhcmVudEZvcm0uJHJlbW92ZUNvbnRyb2woZyl9KX0scG9zdDpmdW5jdGlvbihiLGMsZSxmKXt2YXIgZz1mWzBdO2lmKGcuJG9wdGlvbnMmJmcuJG9wdGlvbnMudXBkYXRlT24pYy5vbihnLiRvcHRpb25zLnVwZGF0ZU9uLGZ1bmN0aW9uKGEpe2cuJCRkZWJvdW5jZVZpZXdWYWx1ZUNvbW1pdChhJiZhLnR5cGUpfSk7Yy5vbihcImJsdXJcIixmdW5jdGlvbihjKXtnLiR0b3VjaGVkfHwoYS4kJHBoYXNlP2IuJGV2YWxBc3luYyhnLiRzZXRUb3VjaGVkKTpiLiRhcHBseShnLiRzZXRUb3VjaGVkKSl9KX19fX19XSx6Zz0vKFxccyt8XilkZWZhdWx0KFxccyt8JCkvLE9lPWZ1bmN0aW9uKCl7cmV0dXJue3Jlc3RyaWN0OlwiQVwiLGNvbnRyb2xsZXI6W1wiJHNjb3BlXCIsXCIkYXR0cnNcIixmdW5jdGlvbihhLGIpe3ZhciBkPXRoaXM7dGhpcy4kb3B0aW9ucz1iYihhLiRldmFsKGIubmdNb2RlbE9wdGlvbnMpKTt5KHRoaXMuJG9wdGlvbnMudXBkYXRlT24pP1xuKHRoaXMuJG9wdGlvbnMudXBkYXRlT25EZWZhdWx0PSExLHRoaXMuJG9wdGlvbnMudXBkYXRlT249VSh0aGlzLiRvcHRpb25zLnVwZGF0ZU9uLnJlcGxhY2UoemcsZnVuY3Rpb24oKXtkLiRvcHRpb25zLnVwZGF0ZU9uRGVmYXVsdD0hMDtyZXR1cm5cIiBcIn0pKSk6dGhpcy4kb3B0aW9ucy51cGRhdGVPbkRlZmF1bHQ9ITB9XX19LEFlPUxhKHt0ZXJtaW5hbDohMCxwcmlvcml0eToxRTN9KSxBZz1HKFwibmdPcHRpb25zXCIpLEJnPS9eXFxzKihbXFxzXFxTXSs/KSg/Olxccythc1xccysoW1xcc1xcU10rPykpPyg/Olxccytncm91cFxccytieVxccysoW1xcc1xcU10rPykpPyg/OlxccytkaXNhYmxlXFxzK3doZW5cXHMrKFtcXHNcXFNdKz8pKT9cXHMrZm9yXFxzKyg/OihbXFwkXFx3XVtcXCRcXHddKil8KD86XFwoXFxzKihbXFwkXFx3XVtcXCRcXHddKilcXHMqLFxccyooW1xcJFxcd11bXFwkXFx3XSopXFxzKlxcKSkpXFxzK2luXFxzKyhbXFxzXFxTXSs/KSg/Olxccyt0cmFja1xccytieVxccysoW1xcc1xcU10rPykpPyQvLEllPVtcIiRjb21waWxlXCIsXCIkcGFyc2VcIixmdW5jdGlvbihhLFxuYil7ZnVuY3Rpb24gZChhLGMsZCl7ZnVuY3Rpb24gZShhLGIsYyxkLGYpe3RoaXMuc2VsZWN0VmFsdWU9YTt0aGlzLnZpZXdWYWx1ZT1iO3RoaXMubGFiZWw9Yzt0aGlzLmdyb3VwPWQ7dGhpcy5kaXNhYmxlZD1mfWZ1bmN0aW9uIGwoYSl7dmFyIGI7aWYoIXEmJnphKGEpKWI9YTtlbHNle2I9W107Zm9yKHZhciBjIGluIGEpYS5oYXNPd25Qcm9wZXJ0eShjKSYmXCIkXCIhPT1jLmNoYXJBdCgwKSYmYi5wdXNoKGMpfXJldHVybiBifXZhciBtPWEubWF0Y2goQmcpO2lmKCFtKXRocm93IEFnKFwiaWV4cFwiLGEsdWEoYykpO3ZhciBuPW1bNV18fG1bN10scT1tWzZdO2E9LyBhcyAvLnRlc3QobVswXSkmJm1bMV07dmFyIHM9bVs5XTtjPWIobVsyXT9tWzFdOm4pO3ZhciB2PWEmJmIoYSl8fGMsdT1zJiZiKHMpLHA9cz9mdW5jdGlvbihhLGIpe3JldHVybiB1KGQsYil9OmZ1bmN0aW9uKGEpe3JldHVybiBDYShhKX0sQz1mdW5jdGlvbihhLGIpe3JldHVybiBwKGEseihhLGIpKX0sdz1iKG1bMl18fFxubVsxXSkseT1iKG1bM118fFwiXCIpLEI9YihtWzRdfHxcIlwiKSx4PWIobVs4XSksRD17fSx6PXE/ZnVuY3Rpb24oYSxiKXtEW3FdPWI7RFtuXT1hO3JldHVybiBEfTpmdW5jdGlvbihhKXtEW25dPWE7cmV0dXJuIER9O3JldHVybnt0cmFja0J5OnMsZ2V0VHJhY2tCeVZhbHVlOkMsZ2V0V2F0Y2hhYmxlczpiKHgsZnVuY3Rpb24oYSl7dmFyIGI9W107YT1hfHxbXTtmb3IodmFyIGM9bChhKSxlPWMubGVuZ3RoLGY9MDtmPGU7ZisrKXt2YXIgZz1hPT09Yz9mOmNbZl0saz16KGFbZ10sZyksZz1wKGFbZ10sayk7Yi5wdXNoKGcpO2lmKG1bMl18fG1bMV0pZz13KGQsayksYi5wdXNoKGcpO21bNF0mJihrPUIoZCxrKSxiLnB1c2goaykpfXJldHVybiBifSksZ2V0T3B0aW9uczpmdW5jdGlvbigpe2Zvcih2YXIgYT1bXSxiPXt9LGM9eChkKXx8W10sZj1sKGMpLGc9Zi5sZW5ndGgsbT0wO208ZzttKyspe3ZhciBuPWM9PT1mP206ZlttXSxyPXooY1tuXSxuKSxxPXYoZCxyKSxuPXAocSxyKSx0PXcoZCxcbnIpLHU9eShkLHIpLHI9QihkLHIpLHE9bmV3IGUobixxLHQsdSxyKTthLnB1c2gocSk7YltuXT1xfXJldHVybntpdGVtczphLHNlbGVjdFZhbHVlTWFwOmIsZ2V0T3B0aW9uRnJvbVZpZXdWYWx1ZTpmdW5jdGlvbihhKXtyZXR1cm4gYltDKGEpXX0sZ2V0Vmlld1ZhbHVlRnJvbU9wdGlvbjpmdW5jdGlvbihhKXtyZXR1cm4gcz9mYS5jb3B5KGEudmlld1ZhbHVlKTphLnZpZXdWYWx1ZX19fX19dmFyIGM9WC5jcmVhdGVFbGVtZW50KFwib3B0aW9uXCIpLGU9WC5jcmVhdGVFbGVtZW50KFwib3B0Z3JvdXBcIik7cmV0dXJue3Jlc3RyaWN0OlwiQVwiLHRlcm1pbmFsOiEwLHJlcXVpcmU6W1wic2VsZWN0XCIsXCI/bmdNb2RlbFwiXSxsaW5rOntwcmU6ZnVuY3Rpb24oYSxiLGMsZCl7ZFswXS5yZWdpc3Rlck9wdGlvbj14fSxwb3N0OmZ1bmN0aW9uKGIsZyxoLGspe2Z1bmN0aW9uIGwoYSxiKXthLmVsZW1lbnQ9YjtiLmRpc2FibGVkPWEuZGlzYWJsZWQ7YS5sYWJlbCE9PWIubGFiZWwmJihiLmxhYmVsPWEubGFiZWwsXG5iLnRleHRDb250ZW50PWEubGFiZWwpO2EudmFsdWUhPT1iLnZhbHVlJiYoYi52YWx1ZT1hLnNlbGVjdFZhbHVlKX1mdW5jdGlvbiBtKGEsYixjLGQpe2ImJkYoYi5ub2RlTmFtZSk9PT1jP2M9YjooYz1kLmNsb25lTm9kZSghMSksYj9hLmluc2VydEJlZm9yZShjLGIpOmEuYXBwZW5kQ2hpbGQoYykpO3JldHVybiBjfWZ1bmN0aW9uIHIoYSl7Zm9yKHZhciBiO2E7KWI9YS5uZXh0U2libGluZyxYYihhKSxhPWJ9ZnVuY3Rpb24gcShhKXt2YXIgYj1wJiZwWzBdLGM9eiYmelswXTtpZihifHxjKWZvcig7YSYmKGE9PT1ifHxhPT09Y3x8OD09PWEubm9kZVR5cGV8fFwiXCI9PT1hLnZhbHVlKTspYT1hLm5leHRTaWJsaW5nO3JldHVybiBhfWZ1bmN0aW9uIHMoKXt2YXIgYT1EJiZ1LnJlYWRWYWx1ZSgpO0Q9RS5nZXRPcHRpb25zKCk7dmFyIGI9e30sZD1nWzBdLmZpcnN0Q2hpbGQ7eCYmZy5wcmVwZW5kKHApO2Q9cShkKTtELml0ZW1zLmZvckVhY2goZnVuY3Rpb24oYSl7dmFyIGYsaDthLmdyb3VwP1xuKGY9YlthLmdyb3VwXSxmfHwoZj1tKGdbMF0sZCxcIm9wdGdyb3VwXCIsZSksZD1mLm5leHRTaWJsaW5nLGYubGFiZWw9YS5ncm91cCxmPWJbYS5ncm91cF09e2dyb3VwRWxlbWVudDpmLGN1cnJlbnRPcHRpb25FbGVtZW50OmYuZmlyc3RDaGlsZH0pLGg9bShmLmdyb3VwRWxlbWVudCxmLmN1cnJlbnRPcHRpb25FbGVtZW50LFwib3B0aW9uXCIsYyksbChhLGgpLGYuY3VycmVudE9wdGlvbkVsZW1lbnQ9aC5uZXh0U2libGluZyk6KGg9bShnWzBdLGQsXCJvcHRpb25cIixjKSxsKGEsaCksZD1oLm5leHRTaWJsaW5nKX0pO09iamVjdC5rZXlzKGIpLmZvckVhY2goZnVuY3Rpb24oYSl7cihiW2FdLmN1cnJlbnRPcHRpb25FbGVtZW50KX0pO3IoZCk7di4kcmVuZGVyKCk7aWYoIXYuJGlzRW1wdHkoYSkpe3ZhciBmPXUucmVhZFZhbHVlKCk7KEUudHJhY2tCeT9tYShhLGYpOmE9PT1mKXx8KHYuJHNldFZpZXdWYWx1ZShmKSx2LiRyZW5kZXIoKSl9fXZhciB2PWtbMV07aWYodil7dmFyIHU9a1swXTtrPVxuaC5tdWx0aXBsZTtmb3IodmFyIHAsQz0wLHc9Zy5jaGlsZHJlbigpLHk9dy5sZW5ndGg7Qzx5O0MrKylpZihcIlwiPT09d1tDXS52YWx1ZSl7cD13LmVxKEMpO2JyZWFrfXZhciB4PSEhcCx6PUIoYy5jbG9uZU5vZGUoITEpKTt6LnZhbChcIj9cIik7dmFyIEQsRT1kKGgubmdPcHRpb25zLGcsYik7az8odi4kaXNFbXB0eT1mdW5jdGlvbihhKXtyZXR1cm4hYXx8MD09PWEubGVuZ3RofSx1LndyaXRlVmFsdWU9ZnVuY3Rpb24oYSl7RC5pdGVtcy5mb3JFYWNoKGZ1bmN0aW9uKGEpe2EuZWxlbWVudC5zZWxlY3RlZD0hMX0pO2EmJmEuZm9yRWFjaChmdW5jdGlvbihhKXsoYT1ELmdldE9wdGlvbkZyb21WaWV3VmFsdWUoYSkpJiYhYS5kaXNhYmxlZCYmKGEuZWxlbWVudC5zZWxlY3RlZD0hMCl9KX0sdS5yZWFkVmFsdWU9ZnVuY3Rpb24oKXt2YXIgYT1nLnZhbCgpfHxbXSxiPVtdO24oYSxmdW5jdGlvbihhKXsoYT1ELnNlbGVjdFZhbHVlTWFwW2FdKSYmIWEuZGlzYWJsZWQmJmIucHVzaChELmdldFZpZXdWYWx1ZUZyb21PcHRpb24oYSkpfSk7XG5yZXR1cm4gYn0sRS50cmFja0J5JiZiLiR3YXRjaENvbGxlY3Rpb24oZnVuY3Rpb24oKXtpZihJKHYuJHZpZXdWYWx1ZSkpcmV0dXJuIHYuJHZpZXdWYWx1ZS5tYXAoZnVuY3Rpb24oYSl7cmV0dXJuIEUuZ2V0VHJhY2tCeVZhbHVlKGEpfSl9LGZ1bmN0aW9uKCl7di4kcmVuZGVyKCl9KSk6KHUud3JpdGVWYWx1ZT1mdW5jdGlvbihhKXt2YXIgYj1ELmdldE9wdGlvbkZyb21WaWV3VmFsdWUoYSk7YiYmIWIuZGlzYWJsZWQ/Z1swXS52YWx1ZSE9PWIuc2VsZWN0VmFsdWUmJih6LnJlbW92ZSgpLHh8fHAucmVtb3ZlKCksZ1swXS52YWx1ZT1iLnNlbGVjdFZhbHVlLGIuZWxlbWVudC5zZWxlY3RlZD0hMCxiLmVsZW1lbnQuc2V0QXR0cmlidXRlKFwic2VsZWN0ZWRcIixcInNlbGVjdGVkXCIpKTpudWxsPT09YXx8eD8oei5yZW1vdmUoKSx4fHxnLnByZXBlbmQocCksZy52YWwoXCJcIikscC5wcm9wKFwic2VsZWN0ZWRcIiwhMCkscC5hdHRyKFwic2VsZWN0ZWRcIiwhMCkpOih4fHxwLnJlbW92ZSgpLGcucHJlcGVuZCh6KSxcbmcudmFsKFwiP1wiKSx6LnByb3AoXCJzZWxlY3RlZFwiLCEwKSx6LmF0dHIoXCJzZWxlY3RlZFwiLCEwKSl9LHUucmVhZFZhbHVlPWZ1bmN0aW9uKCl7dmFyIGE9RC5zZWxlY3RWYWx1ZU1hcFtnLnZhbCgpXTtyZXR1cm4gYSYmIWEuZGlzYWJsZWQ/KHh8fHAucmVtb3ZlKCksei5yZW1vdmUoKSxELmdldFZpZXdWYWx1ZUZyb21PcHRpb24oYSkpOm51bGx9LEUudHJhY2tCeSYmYi4kd2F0Y2goZnVuY3Rpb24oKXtyZXR1cm4gRS5nZXRUcmFja0J5VmFsdWUodi4kdmlld1ZhbHVlKX0sZnVuY3Rpb24oKXt2LiRyZW5kZXIoKX0pKTt4PyhwLnJlbW92ZSgpLGEocCkoYikscC5yZW1vdmVDbGFzcyhcIm5nLXNjb3BlXCIpKTpwPUIoYy5jbG9uZU5vZGUoITEpKTtzKCk7Yi4kd2F0Y2hDb2xsZWN0aW9uKEUuZ2V0V2F0Y2hhYmxlcyxzKX19fX19XSxCZT1bXCIkbG9jYWxlXCIsXCIkaW50ZXJwb2xhdGVcIixcIiRsb2dcIixmdW5jdGlvbihhLGIsZCl7dmFyIGM9L3t9L2csZT0vXndoZW4oTWludXMpPyguKykkLztyZXR1cm57bGluazpmdW5jdGlvbihmLFxuZyxoKXtmdW5jdGlvbiBrKGEpe2cudGV4dChhfHxcIlwiKX12YXIgbD1oLmNvdW50LG09aC4kYXR0ci53aGVuJiZnLmF0dHIoaC4kYXR0ci53aGVuKSxyPWgub2Zmc2V0fHwwLHM9Zi4kZXZhbChtKXx8e30sdT17fSx2PWIuc3RhcnRTeW1ib2woKSx5PWIuZW5kU3ltYm9sKCkscD12K2wrXCItXCIrcit5LEM9ZmEubm9vcCx3O24oaCxmdW5jdGlvbihhLGIpe3ZhciBjPWUuZXhlYyhiKTtjJiYoYz0oY1sxXT9cIi1cIjpcIlwiKStGKGNbMl0pLHNbY109Zy5hdHRyKGguJGF0dHJbYl0pKX0pO24ocyxmdW5jdGlvbihhLGQpe3VbZF09YihhLnJlcGxhY2UoYyxwKSl9KTtmLiR3YXRjaChsLGZ1bmN0aW9uKGIpe3ZhciBjPXBhcnNlRmxvYXQoYiksZT1pc05hTihjKTtlfHxjIGluIHN8fChjPWEucGx1cmFsQ2F0KGMtcikpO2M9PT13fHxlJiZRKHcpJiZpc05hTih3KXx8KEMoKSxlPXVbY10scShlKT8obnVsbCE9YiYmZC5kZWJ1ZyhcIm5nUGx1cmFsaXplOiBubyBydWxlIGRlZmluZWQgZm9yICdcIitjK1wiJyBpbiBcIitcbm0pLEM9eCxrKCkpOkM9Zi4kd2F0Y2goZSxrKSx3PWMpfSl9fX1dLENlPVtcIiRwYXJzZVwiLFwiJGFuaW1hdGVcIixmdW5jdGlvbihhLGIpe3ZhciBkPUcoXCJuZ1JlcGVhdFwiKSxjPWZ1bmN0aW9uKGEsYixjLGQsayxsLG0pe2FbY109ZDtrJiYoYVtrXT1sKTthLiRpbmRleD1iO2EuJGZpcnN0PTA9PT1iO2EuJGxhc3Q9Yj09PW0tMTthLiRtaWRkbGU9IShhLiRmaXJzdHx8YS4kbGFzdCk7YS4kb2RkPSEoYS4kZXZlbj0wPT09KGImMSkpfTtyZXR1cm57cmVzdHJpY3Q6XCJBXCIsbXVsdGlFbGVtZW50OiEwLHRyYW5zY2x1ZGU6XCJlbGVtZW50XCIscHJpb3JpdHk6MUUzLHRlcm1pbmFsOiEwLCQkdGxiOiEwLGNvbXBpbGU6ZnVuY3Rpb24oZSxmKXt2YXIgZz1mLm5nUmVwZWF0LGg9WC5jcmVhdGVDb21tZW50KFwiIGVuZCBuZ1JlcGVhdDogXCIrZytcIiBcIiksaz1nLm1hdGNoKC9eXFxzKihbXFxzXFxTXSs/KVxccytpblxccysoW1xcc1xcU10rPykoPzpcXHMrYXNcXHMrKFtcXHNcXFNdKz8pKT8oPzpcXHMrdHJhY2tcXHMrYnlcXHMrKFtcXHNcXFNdKz8pKT9cXHMqJC8pO1xuaWYoIWspdGhyb3cgZChcImlleHBcIixnKTt2YXIgbD1rWzFdLG09a1syXSxyPWtbM10scT1rWzRdLGs9bC5tYXRjaCgvXig/OihcXHMqW1xcJFxcd10rKXxcXChcXHMqKFtcXCRcXHddKylcXHMqLFxccyooW1xcJFxcd10rKVxccypcXCkpJC8pO2lmKCFrKXRocm93IGQoXCJpaWRleHBcIixsKTt2YXIgcz1rWzNdfHxrWzFdLHY9a1syXTtpZihyJiYoIS9eWyRhLXpBLVpfXVskYS16QS1aMC05X10qJC8udGVzdChyKXx8L14obnVsbHx1bmRlZmluZWR8dGhpc3xcXCRpbmRleHxcXCRmaXJzdHxcXCRtaWRkbGV8XFwkbGFzdHxcXCRldmVufFxcJG9kZHxcXCRwYXJlbnR8XFwkcm9vdHxcXCRpZCkkLy50ZXN0KHIpKSl0aHJvdyBkKFwiYmFkaWRlbnRcIixyKTt2YXIgeCxwLHksdyx6PXskaWQ6Q2F9O3E/eD1hKHEpOih5PWZ1bmN0aW9uKGEsYil7cmV0dXJuIENhKGIpfSx3PWZ1bmN0aW9uKGEpe3JldHVybiBhfSk7cmV0dXJuIGZ1bmN0aW9uKGEsZSxmLGssbCl7eCYmKHA9ZnVuY3Rpb24oYixjLGQpe3YmJih6W3ZdPWIpO3pbc109Yzt6LiRpbmRleD1cbmQ7cmV0dXJuIHgoYSx6KX0pO3ZhciBxPSQoKTthLiR3YXRjaENvbGxlY3Rpb24obSxmdW5jdGlvbihmKXt2YXIgayxtLHQ9ZVswXSx4LHo9JCgpLEQsRSxILEYsSSxHLEo7ciYmKGFbcl09Zik7aWYoemEoZikpST1mLG09cHx8eTtlbHNlIGZvcihKIGluIG09cHx8dyxJPVtdLGYpcWEuY2FsbChmLEopJiZcIiRcIiE9PUouY2hhckF0KDApJiZJLnB1c2goSik7RD1JLmxlbmd0aDtKPUFycmF5KEQpO2ZvcihrPTA7azxEO2srKylpZihFPWY9PT1JP2s6SVtrXSxIPWZbRV0sRj1tKEUsSCxrKSxxW0ZdKUc9cVtGXSxkZWxldGUgcVtGXSx6W0ZdPUcsSltrXT1HO2Vsc2V7aWYoeltGXSl0aHJvdyBuKEosZnVuY3Rpb24oYSl7YSYmYS5zY29wZSYmKHFbYS5pZF09YSl9KSxkKFwiZHVwZXNcIixnLEYsSCk7SltrXT17aWQ6RixzY29wZTp1LGNsb25lOnV9O3pbRl09ITB9Zm9yKHggaW4gcSl7Rz1xW3hdO0Y9cmIoRy5jbG9uZSk7Yi5sZWF2ZShGKTtpZihGWzBdLnBhcmVudE5vZGUpZm9yKGs9MCxtPUYubGVuZ3RoO2s8XG5tO2srKylGW2tdLiQkTkdfUkVNT1ZFRD0hMDtHLnNjb3BlLiRkZXN0cm95KCl9Zm9yKGs9MDtrPEQ7aysrKWlmKEU9Zj09PUk/azpJW2tdLEg9ZltFXSxHPUpba10sRy5zY29wZSl7eD10O2RvIHg9eC5uZXh0U2libGluZzt3aGlsZSh4JiZ4LiQkTkdfUkVNT1ZFRCk7Ry5jbG9uZVswXSE9eCYmYi5tb3ZlKHJiKEcuY2xvbmUpLG51bGwsQih0KSk7dD1HLmNsb25lW0cuY2xvbmUubGVuZ3RoLTFdO2MoRy5zY29wZSxrLHMsSCx2LEUsRCl9ZWxzZSBsKGZ1bmN0aW9uKGEsZCl7Ry5zY29wZT1kO3ZhciBlPWguY2xvbmVOb2RlKCExKTthW2EubGVuZ3RoKytdPWU7Yi5lbnRlcihhLG51bGwsQih0KSk7dD1lO0cuY2xvbmU9YTt6W0cuaWRdPUc7YyhHLnNjb3BlLGsscyxILHYsRSxEKX0pO3E9en0pfX19fV0sRGU9W1wiJGFuaW1hdGVcIixmdW5jdGlvbihhKXtyZXR1cm57cmVzdHJpY3Q6XCJBXCIsbXVsdGlFbGVtZW50OiEwLGxpbms6ZnVuY3Rpb24oYixkLGMpe2IuJHdhdGNoKGMubmdTaG93LGZ1bmN0aW9uKGIpe2FbYj9cblwicmVtb3ZlQ2xhc3NcIjpcImFkZENsYXNzXCJdKGQsXCJuZy1oaWRlXCIse3RlbXBDbGFzc2VzOlwibmctaGlkZS1hbmltYXRlXCJ9KX0pfX19XSx3ZT1bXCIkYW5pbWF0ZVwiLGZ1bmN0aW9uKGEpe3JldHVybntyZXN0cmljdDpcIkFcIixtdWx0aUVsZW1lbnQ6ITAsbGluazpmdW5jdGlvbihiLGQsYyl7Yi4kd2F0Y2goYy5uZ0hpZGUsZnVuY3Rpb24oYil7YVtiP1wiYWRkQ2xhc3NcIjpcInJlbW92ZUNsYXNzXCJdKGQsXCJuZy1oaWRlXCIse3RlbXBDbGFzc2VzOlwibmctaGlkZS1hbmltYXRlXCJ9KX0pfX19XSxFZT1MYShmdW5jdGlvbihhLGIsZCl7YS4kd2F0Y2goZC5uZ1N0eWxlLGZ1bmN0aW9uKGEsZCl7ZCYmYSE9PWQmJm4oZCxmdW5jdGlvbihhLGMpe2IuY3NzKGMsXCJcIil9KTthJiZiLmNzcyhhKX0sITApfSksRmU9W1wiJGFuaW1hdGVcIixmdW5jdGlvbihhKXtyZXR1cm57cmVxdWlyZTpcIm5nU3dpdGNoXCIsY29udHJvbGxlcjpbXCIkc2NvcGVcIixmdW5jdGlvbigpe3RoaXMuY2FzZXM9e319XSxsaW5rOmZ1bmN0aW9uKGIsXG5kLGMsZSl7dmFyIGY9W10sZz1bXSxoPVtdLGs9W10sbD1mdW5jdGlvbihhLGIpe3JldHVybiBmdW5jdGlvbigpe2Euc3BsaWNlKGIsMSl9fTtiLiR3YXRjaChjLm5nU3dpdGNofHxjLm9uLGZ1bmN0aW9uKGIpe3ZhciBjLGQ7Yz0wO2ZvcihkPWgubGVuZ3RoO2M8ZDsrK2MpYS5jYW5jZWwoaFtjXSk7Yz1oLmxlbmd0aD0wO2ZvcihkPWsubGVuZ3RoO2M8ZDsrK2Mpe3ZhciBxPXJiKGdbY10uY2xvbmUpO2tbY10uJGRlc3Ryb3koKTsoaFtjXT1hLmxlYXZlKHEpKS50aGVuKGwoaCxjKSl9Zy5sZW5ndGg9MDtrLmxlbmd0aD0wOyhmPWUuY2FzZXNbXCIhXCIrYl18fGUuY2FzZXNbXCI/XCJdKSYmbihmLGZ1bmN0aW9uKGIpe2IudHJhbnNjbHVkZShmdW5jdGlvbihjLGQpe2sucHVzaChkKTt2YXIgZT1iLmVsZW1lbnQ7Y1tjLmxlbmd0aCsrXT1YLmNyZWF0ZUNvbW1lbnQoXCIgZW5kIG5nU3dpdGNoV2hlbjogXCIpO2cucHVzaCh7Y2xvbmU6Y30pO2EuZW50ZXIoYyxlLnBhcmVudCgpLGUpfSl9KX0pfX19XSxcbkdlPUxhKHt0cmFuc2NsdWRlOlwiZWxlbWVudFwiLHByaW9yaXR5OjEyMDAscmVxdWlyZTpcIl5uZ1N3aXRjaFwiLG11bHRpRWxlbWVudDohMCxsaW5rOmZ1bmN0aW9uKGEsYixkLGMsZSl7Yy5jYXNlc1tcIiFcIitkLm5nU3dpdGNoV2hlbl09Yy5jYXNlc1tcIiFcIitkLm5nU3dpdGNoV2hlbl18fFtdO2MuY2FzZXNbXCIhXCIrZC5uZ1N3aXRjaFdoZW5dLnB1c2goe3RyYW5zY2x1ZGU6ZSxlbGVtZW50OmJ9KX19KSxIZT1MYSh7dHJhbnNjbHVkZTpcImVsZW1lbnRcIixwcmlvcml0eToxMjAwLHJlcXVpcmU6XCJebmdTd2l0Y2hcIixtdWx0aUVsZW1lbnQ6ITAsbGluazpmdW5jdGlvbihhLGIsZCxjLGUpe2MuY2FzZXNbXCI/XCJdPWMuY2FzZXNbXCI/XCJdfHxbXTtjLmNhc2VzW1wiP1wiXS5wdXNoKHt0cmFuc2NsdWRlOmUsZWxlbWVudDpifSl9fSksSmU9TGEoe3Jlc3RyaWN0OlwiRUFDXCIsbGluazpmdW5jdGlvbihhLGIsZCxjLGUpe2lmKCFlKXRocm93IEcoXCJuZ1RyYW5zY2x1ZGVcIikoXCJvcnBoYW5cIix1YShiKSk7ZShmdW5jdGlvbihhKXtiLmVtcHR5KCk7XG5iLmFwcGVuZChhKX0pfX0pLGplPVtcIiR0ZW1wbGF0ZUNhY2hlXCIsZnVuY3Rpb24oYSl7cmV0dXJue3Jlc3RyaWN0OlwiRVwiLHRlcm1pbmFsOiEwLGNvbXBpbGU6ZnVuY3Rpb24oYixkKXtcInRleHQvbmctdGVtcGxhdGVcIj09ZC50eXBlJiZhLnB1dChkLmlkLGJbMF0udGV4dCl9fX1dLENnPXskc2V0Vmlld1ZhbHVlOngsJHJlbmRlcjp4fSxEZz1bXCIkZWxlbWVudFwiLFwiJHNjb3BlXCIsXCIkYXR0cnNcIixmdW5jdGlvbihhLGIsZCl7dmFyIGM9dGhpcyxlPW5ldyBTYTtjLm5nTW9kZWxDdHJsPUNnO2MudW5rbm93bk9wdGlvbj1CKFguY3JlYXRlRWxlbWVudChcIm9wdGlvblwiKSk7Yy5yZW5kZXJVbmtub3duT3B0aW9uPWZ1bmN0aW9uKGIpe2I9XCI/IFwiK0NhKGIpK1wiID9cIjtjLnVua25vd25PcHRpb24udmFsKGIpO2EucHJlcGVuZChjLnVua25vd25PcHRpb24pO2EudmFsKGIpfTtiLiRvbihcIiRkZXN0cm95XCIsZnVuY3Rpb24oKXtjLnJlbmRlclVua25vd25PcHRpb249eH0pO2MucmVtb3ZlVW5rbm93bk9wdGlvbj1cbmZ1bmN0aW9uKCl7Yy51bmtub3duT3B0aW9uLnBhcmVudCgpJiZjLnVua25vd25PcHRpb24ucmVtb3ZlKCl9O2MucmVhZFZhbHVlPWZ1bmN0aW9uKCl7Yy5yZW1vdmVVbmtub3duT3B0aW9uKCk7cmV0dXJuIGEudmFsKCl9O2Mud3JpdGVWYWx1ZT1mdW5jdGlvbihiKXtjLmhhc09wdGlvbihiKT8oYy5yZW1vdmVVbmtub3duT3B0aW9uKCksYS52YWwoYiksXCJcIj09PWImJmMuZW1wdHlPcHRpb24ucHJvcChcInNlbGVjdGVkXCIsITApKTpudWxsPT1iJiZjLmVtcHR5T3B0aW9uPyhjLnJlbW92ZVVua25vd25PcHRpb24oKSxhLnZhbChcIlwiKSk6Yy5yZW5kZXJVbmtub3duT3B0aW9uKGIpfTtjLmFkZE9wdGlvbj1mdW5jdGlvbihhLGIpe1JhKGEsJ1wib3B0aW9uIHZhbHVlXCInKTtcIlwiPT09YSYmKGMuZW1wdHlPcHRpb249Yik7dmFyIGQ9ZS5nZXQoYSl8fDA7ZS5wdXQoYSxkKzEpO2MubmdNb2RlbEN0cmwuJHJlbmRlcigpO2JbMF0uaGFzQXR0cmlidXRlKFwic2VsZWN0ZWRcIikmJihiWzBdLnNlbGVjdGVkPVxuITApfTtjLnJlbW92ZU9wdGlvbj1mdW5jdGlvbihhKXt2YXIgYj1lLmdldChhKTtiJiYoMT09PWI/KGUucmVtb3ZlKGEpLFwiXCI9PT1hJiYoYy5lbXB0eU9wdGlvbj11KSk6ZS5wdXQoYSxiLTEpKX07Yy5oYXNPcHRpb249ZnVuY3Rpb24oYSl7cmV0dXJuISFlLmdldChhKX07Yy5yZWdpc3Rlck9wdGlvbj1mdW5jdGlvbihhLGIsZCxlLGwpe2lmKGUpe3ZhciBtO2QuJG9ic2VydmUoXCJ2YWx1ZVwiLGZ1bmN0aW9uKGEpe3kobSkmJmMucmVtb3ZlT3B0aW9uKG0pO209YTtjLmFkZE9wdGlvbihhLGIpfSl9ZWxzZSBsP2EuJHdhdGNoKGwsZnVuY3Rpb24oYSxlKXtkLiRzZXQoXCJ2YWx1ZVwiLGEpO2UhPT1hJiZjLnJlbW92ZU9wdGlvbihlKTtjLmFkZE9wdGlvbihhLGIpfSk6Yy5hZGRPcHRpb24oZC52YWx1ZSxiKTtiLm9uKFwiJGRlc3Ryb3lcIixmdW5jdGlvbigpe2MucmVtb3ZlT3B0aW9uKGQudmFsdWUpO2MubmdNb2RlbEN0cmwuJHJlbmRlcigpfSl9fV0sa2U9ZnVuY3Rpb24oKXtyZXR1cm57cmVzdHJpY3Q6XCJFXCIsXG5yZXF1aXJlOltcInNlbGVjdFwiLFwiP25nTW9kZWxcIl0sY29udHJvbGxlcjpEZyxwcmlvcml0eToxLGxpbms6e3ByZTpmdW5jdGlvbihhLGIsZCxjKXt2YXIgZT1jWzFdO2lmKGUpe3ZhciBmPWNbMF07Zi5uZ01vZGVsQ3RybD1lO2UuJHJlbmRlcj1mdW5jdGlvbigpe2Yud3JpdGVWYWx1ZShlLiR2aWV3VmFsdWUpfTtiLm9uKFwiY2hhbmdlXCIsZnVuY3Rpb24oKXthLiRhcHBseShmdW5jdGlvbigpe2UuJHNldFZpZXdWYWx1ZShmLnJlYWRWYWx1ZSgpKX0pfSk7aWYoZC5tdWx0aXBsZSl7Zi5yZWFkVmFsdWU9ZnVuY3Rpb24oKXt2YXIgYT1bXTtuKGIuZmluZChcIm9wdGlvblwiKSxmdW5jdGlvbihiKXtiLnNlbGVjdGVkJiZhLnB1c2goYi52YWx1ZSl9KTtyZXR1cm4gYX07Zi53cml0ZVZhbHVlPWZ1bmN0aW9uKGEpe3ZhciBjPW5ldyBTYShhKTtuKGIuZmluZChcIm9wdGlvblwiKSxmdW5jdGlvbihhKXthLnNlbGVjdGVkPXkoYy5nZXQoYS52YWx1ZSkpfSl9O3ZhciBnLGg9TmFOO2EuJHdhdGNoKGZ1bmN0aW9uKCl7aCE9PVxuZS4kdmlld1ZhbHVlfHxtYShnLGUuJHZpZXdWYWx1ZSl8fChnPWlhKGUuJHZpZXdWYWx1ZSksZS4kcmVuZGVyKCkpO2g9ZS4kdmlld1ZhbHVlfSk7ZS4kaXNFbXB0eT1mdW5jdGlvbihhKXtyZXR1cm4hYXx8MD09PWEubGVuZ3RofX19fX19fSxtZT1bXCIkaW50ZXJwb2xhdGVcIixmdW5jdGlvbihhKXtyZXR1cm57cmVzdHJpY3Q6XCJFXCIscHJpb3JpdHk6MTAwLGNvbXBpbGU6ZnVuY3Rpb24oYixkKXtpZih5KGQudmFsdWUpKXZhciBjPWEoZC52YWx1ZSwhMCk7ZWxzZXt2YXIgZT1hKGIudGV4dCgpLCEwKTtlfHxkLiRzZXQoXCJ2YWx1ZVwiLGIudGV4dCgpKX1yZXR1cm4gZnVuY3Rpb24oYSxiLGQpe3ZhciBrPWIucGFyZW50KCk7KGs9ay5kYXRhKFwiJHNlbGVjdENvbnRyb2xsZXJcIil8fGsucGFyZW50KCkuZGF0YShcIiRzZWxlY3RDb250cm9sbGVyXCIpKSYmay5yZWdpc3Rlck9wdGlvbihhLGIsZCxjLGUpfX19fV0sbGU9bmEoe3Jlc3RyaWN0OlwiRVwiLHRlcm1pbmFsOiExfSksRmM9ZnVuY3Rpb24oKXtyZXR1cm57cmVzdHJpY3Q6XCJBXCIsXG5yZXF1aXJlOlwiP25nTW9kZWxcIixsaW5rOmZ1bmN0aW9uKGEsYixkLGMpe2MmJihkLnJlcXVpcmVkPSEwLGMuJHZhbGlkYXRvcnMucmVxdWlyZWQ9ZnVuY3Rpb24oYSxiKXtyZXR1cm4hZC5yZXF1aXJlZHx8IWMuJGlzRW1wdHkoYil9LGQuJG9ic2VydmUoXCJyZXF1aXJlZFwiLGZ1bmN0aW9uKCl7Yy4kdmFsaWRhdGUoKX0pKX19fSxFYz1mdW5jdGlvbigpe3JldHVybntyZXN0cmljdDpcIkFcIixyZXF1aXJlOlwiP25nTW9kZWxcIixsaW5rOmZ1bmN0aW9uKGEsYixkLGMpe2lmKGMpe3ZhciBlLGY9ZC5uZ1BhdHRlcm58fGQucGF0dGVybjtkLiRvYnNlcnZlKFwicGF0dGVyblwiLGZ1bmN0aW9uKGEpe0UoYSkmJjA8YS5sZW5ndGgmJihhPW5ldyBSZWdFeHAoXCJeXCIrYStcIiRcIikpO2lmKGEmJiFhLnRlc3QpdGhyb3cgRyhcIm5nUGF0dGVyblwiKShcIm5vcmVnZXhwXCIsZixhLHVhKGIpKTtlPWF8fHU7Yy4kdmFsaWRhdGUoKX0pO2MuJHZhbGlkYXRvcnMucGF0dGVybj1mdW5jdGlvbihhLGIpe3JldHVybiBjLiRpc0VtcHR5KGIpfHxcbnEoZSl8fGUudGVzdChiKX19fX19LEhjPWZ1bmN0aW9uKCl7cmV0dXJue3Jlc3RyaWN0OlwiQVwiLHJlcXVpcmU6XCI/bmdNb2RlbFwiLGxpbms6ZnVuY3Rpb24oYSxiLGQsYyl7aWYoYyl7dmFyIGU9LTE7ZC4kb2JzZXJ2ZShcIm1heGxlbmd0aFwiLGZ1bmN0aW9uKGEpe2E9ZWEoYSk7ZT1pc05hTihhKT8tMTphO2MuJHZhbGlkYXRlKCl9KTtjLiR2YWxpZGF0b3JzLm1heGxlbmd0aD1mdW5jdGlvbihhLGIpe3JldHVybiAwPmV8fGMuJGlzRW1wdHkoYil8fGIubGVuZ3RoPD1lfX19fX0sR2M9ZnVuY3Rpb24oKXtyZXR1cm57cmVzdHJpY3Q6XCJBXCIscmVxdWlyZTpcIj9uZ01vZGVsXCIsbGluazpmdW5jdGlvbihhLGIsZCxjKXtpZihjKXt2YXIgZT0wO2QuJG9ic2VydmUoXCJtaW5sZW5ndGhcIixmdW5jdGlvbihhKXtlPWVhKGEpfHwwO2MuJHZhbGlkYXRlKCl9KTtjLiR2YWxpZGF0b3JzLm1pbmxlbmd0aD1mdW5jdGlvbihhLGIpe3JldHVybiBjLiRpc0VtcHR5KGIpfHxiLmxlbmd0aD49ZX19fX19O1MuYW5ndWxhci5ib290c3RyYXA/XG5jb25zb2xlLmxvZyhcIldBUk5JTkc6IFRyaWVkIHRvIGxvYWQgYW5ndWxhciBtb3JlIHRoYW4gb25jZS5cIik6KGNlKCksZWUoZmEpLGZhLm1vZHVsZShcIm5nTG9jYWxlXCIsW10sW1wiJHByb3ZpZGVcIixmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEpe2ErPVwiXCI7dmFyIGI9YS5pbmRleE9mKFwiLlwiKTtyZXR1cm4tMT09Yj8wOmEubGVuZ3RoLWItMX1hLnZhbHVlKFwiJGxvY2FsZVwiLHtEQVRFVElNRV9GT1JNQVRTOntBTVBNUzpbXCJBTVwiLFwiUE1cIl0sREFZOlwiU3VuZGF5IE1vbmRheSBUdWVzZGF5IFdlZG5lc2RheSBUaHVyc2RheSBGcmlkYXkgU2F0dXJkYXlcIi5zcGxpdChcIiBcIiksRVJBTkFNRVM6W1wiQmVmb3JlIENocmlzdFwiLFwiQW5ubyBEb21pbmlcIl0sRVJBUzpbXCJCQ1wiLFwiQURcIl0sRklSU1REQVlPRldFRUs6NixNT05USDpcIkphbnVhcnkgRmVicnVhcnkgTWFyY2ggQXByaWwgTWF5IEp1bmUgSnVseSBBdWd1c3QgU2VwdGVtYmVyIE9jdG9iZXIgTm92ZW1iZXIgRGVjZW1iZXJcIi5zcGxpdChcIiBcIiksU0hPUlREQVk6XCJTdW4gTW9uIFR1ZSBXZWQgVGh1IEZyaSBTYXRcIi5zcGxpdChcIiBcIiksXG5TSE9SVE1PTlRIOlwiSmFuIEZlYiBNYXIgQXByIE1heSBKdW4gSnVsIEF1ZyBTZXAgT2N0IE5vdiBEZWNcIi5zcGxpdChcIiBcIiksV0VFS0VORFJBTkdFOls1LDZdLGZ1bGxEYXRlOlwiRUVFRSwgTU1NTSBkLCB5XCIsbG9uZ0RhdGU6XCJNTU1NIGQsIHlcIixtZWRpdW06XCJNTU0gZCwgeSBoOm1tOnNzIGFcIixtZWRpdW1EYXRlOlwiTU1NIGQsIHlcIixtZWRpdW1UaW1lOlwiaDptbTpzcyBhXCIsXCJzaG9ydFwiOlwiTS9kL3l5IGg6bW0gYVwiLHNob3J0RGF0ZTpcIk0vZC95eVwiLHNob3J0VGltZTpcImg6bW0gYVwifSxOVU1CRVJfRk9STUFUUzp7Q1VSUkVOQ1lfU1lNOlwiJFwiLERFQ0lNQUxfU0VQOlwiLlwiLEdST1VQX1NFUDpcIixcIixQQVRURVJOUzpbe2dTaXplOjMsbGdTaXplOjMsbWF4RnJhYzozLG1pbkZyYWM6MCxtaW5JbnQ6MSxuZWdQcmU6XCItXCIsbmVnU3VmOlwiXCIscG9zUHJlOlwiXCIscG9zU3VmOlwiXCJ9LHtnU2l6ZTozLGxnU2l6ZTozLG1heEZyYWM6MixtaW5GcmFjOjIsbWluSW50OjEsbmVnUHJlOlwiLVxcdTAwYTRcIixcbm5lZ1N1ZjpcIlwiLHBvc1ByZTpcIlxcdTAwYTRcIixwb3NTdWY6XCJcIn1dfSxpZDpcImVuLXVzXCIscGx1cmFsQ2F0OmZ1bmN0aW9uKGEsYyl7dmFyIGU9YXwwLGY9Yzt1PT09ZiYmKGY9TWF0aC5taW4oYihhKSwzKSk7TWF0aC5wb3coMTAsZik7cmV0dXJuIDE9PWUmJjA9PWY/XCJvbmVcIjpcIm90aGVyXCJ9fSl9XSksQihYKS5yZWFkeShmdW5jdGlvbigpe1pkKFgseWMpfSkpfSkod2luZG93LGRvY3VtZW50KTshd2luZG93LmFuZ3VsYXIuJCRjc3AoKS5ub0lubGluZVN0eWxlJiZ3aW5kb3cuYW5ndWxhci5lbGVtZW50KGRvY3VtZW50LmhlYWQpLnByZXBlbmQoJzxzdHlsZSB0eXBlPVwidGV4dC9jc3NcIj5AY2hhcnNldCBcIlVURi04XCI7W25nXFxcXDpjbG9ha10sW25nLWNsb2FrXSxbZGF0YS1uZy1jbG9ha10sW3gtbmctY2xvYWtdLC5uZy1jbG9haywueC1uZy1jbG9haywubmctaGlkZTpub3QoLm5nLWhpZGUtYW5pbWF0ZSl7ZGlzcGxheTpub25lICFpbXBvcnRhbnQ7fW5nXFxcXDpmb3Jte2Rpc3BsYXk6YmxvY2s7fS5uZy1hbmltYXRlLXNoaW17dmlzaWJpbGl0eTpoaWRkZW47fS5uZy1hbmNob3J7cG9zaXRpb246YWJzb2x1dGU7fTwvc3R5bGU+Jyk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1hbmd1bGFyLm1pbi5qcy5tYXBcblxuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2FuZ3VsYXIvYW5ndWxhci5taW4uanNcbiAqKiBtb2R1bGUgaWQgPSAzM1xuICoqIG1vZHVsZSBjaHVua3MgPSAyNFxuICoqLyJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9");

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

	eval("'use strict';\n\n(function () {\n  'use strict';\n\n  angular.module('angulartics.igg.theta', ['angulartics', 'utils']).config(['$analyticsProvider', function ($analyticsProvider) {\n    $analyticsProvider.registerEventTrack(function (action, properties) {\n      this.$inject(function (gogoEvents, split) {\n\n        var thetaProperties = {};\n\n        // TODO: change back to:\n        // var event_name = properties.name;\n        var event_name = properties.name || action;\n\n        // Google Analytics sends an eventType that is not needed by Theta so we omit it here.\n        properties = _.omit(properties, ['eventType', 'name']);\n\n        // map Angular camelCase properties into snake case\n        // perhaps we should move this to the gogoEvents.captureEvent function\n        _.each(properties, function (value, key) {\n          var newKey = key.replace(/\\.?([A-Z]+)/g, function (x, y) {\n            return \"_\" + y.toLowerCase();\n          }).replace(/^_/, \"\");\n          thetaProperties[newKey] = value;\n        });\n\n        // Google Analytics also manipulates the properties object and always adds a property.category: 'Event'\n        // if there is none\n        gogoEvents.captureEvent(event_name, thetaProperties);\n      });\n    });\n  }]);\n})();\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzQuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9hbmNpbGxhcnkvdXRpbHMvYW5hbHl0aWNzL2FuZ3VsYXJ0aWNzLXRoZXRhLmpzPzVlYzEiXSwic291cmNlc0NvbnRlbnQiOlsiKGZ1bmN0aW9uKCkge1xuICAndXNlIHN0cmljdCc7XG4gIGFuZ3VsYXIubW9kdWxlKCdhbmd1bGFydGljcy5pZ2cudGhldGEnLCBbJ2FuZ3VsYXJ0aWNzJywgJ3V0aWxzJ10pXG4gIC5jb25maWcoWyckYW5hbHl0aWNzUHJvdmlkZXInLCBmdW5jdGlvbigkYW5hbHl0aWNzUHJvdmlkZXIpe1xuICAgICRhbmFseXRpY3NQcm92aWRlci5yZWdpc3RlckV2ZW50VHJhY2soZnVuY3Rpb24oYWN0aW9uLCBwcm9wZXJ0aWVzKXtcbiAgICAgIHRoaXMuJGluamVjdChmdW5jdGlvbihnb2dvRXZlbnRzLCBzcGxpdCkge1xuXG4gICAgICAgIHZhciB0aGV0YVByb3BlcnRpZXMgPSB7fTtcblxuICAgICAgICAvLyBUT0RPOiBjaGFuZ2UgYmFjayB0bzpcbiAgICAgICAgLy8gdmFyIGV2ZW50X25hbWUgPSBwcm9wZXJ0aWVzLm5hbWU7XG4gICAgICAgIHZhciBldmVudF9uYW1lID0gcHJvcGVydGllcy5uYW1lIHx8IGFjdGlvbjtcblxuICAgICAgICAvLyBHb29nbGUgQW5hbHl0aWNzIHNlbmRzIGFuIGV2ZW50VHlwZSB0aGF0IGlzIG5vdCBuZWVkZWQgYnkgVGhldGEgc28gd2Ugb21pdCBpdCBoZXJlLlxuICAgICAgICBwcm9wZXJ0aWVzID0gXy5vbWl0KHByb3BlcnRpZXMsIFsnZXZlbnRUeXBlJywgJ25hbWUnXSk7XG5cbiAgICAgICAgLy8gbWFwIEFuZ3VsYXIgY2FtZWxDYXNlIHByb3BlcnRpZXMgaW50byBzbmFrZSBjYXNlXG4gICAgICAgIC8vIHBlcmhhcHMgd2Ugc2hvdWxkIG1vdmUgdGhpcyB0byB0aGUgZ29nb0V2ZW50cy5jYXB0dXJlRXZlbnQgZnVuY3Rpb25cbiAgICAgICAgXy5lYWNoKHByb3BlcnRpZXMsIGZ1bmN0aW9uKHZhbHVlLCBrZXkpIHtcbiAgICAgICAgICB2YXIgbmV3S2V5ID0ga2V5LnJlcGxhY2UoL1xcLj8oW0EtWl0rKS9nLCBmdW5jdGlvbiAoeCx5KXsgcmV0dXJuIFwiX1wiICsgeS50b0xvd2VyQ2FzZSgpOyB9KS5yZXBsYWNlKC9eXy8sIFwiXCIpO1xuICAgICAgICAgIHRoZXRhUHJvcGVydGllc1tuZXdLZXldID0gdmFsdWU7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIEdvb2dsZSBBbmFseXRpY3MgYWxzbyBtYW5pcHVsYXRlcyB0aGUgcHJvcGVydGllcyBvYmplY3QgYW5kIGFsd2F5cyBhZGRzIGEgcHJvcGVydHkuY2F0ZWdvcnk6ICdFdmVudCdcbiAgICAgICAgLy8gaWYgdGhlcmUgaXMgbm9uZVxuICAgICAgICBnb2dvRXZlbnRzLmNhcHR1cmVFdmVudChldmVudF9uYW1lLCB0aGV0YVByb3BlcnRpZXMpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1dKTtcbn0oKSk7XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiAuL2FuY2lsbGFyeS91dGlscy9hbmFseXRpY3MvYW5ndWxhcnRpY3MtdGhldGEuanNcbiAqKi8iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFEQTtBQUNBO0FBQ0E7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUhBO0FBQ0E7O0FBREE7QUFDQTs7O0FBREE7QUFjQTtBQUFBO0FBQUE7QUFDQTs7Ozs7QUFmQTs7OztBQUxBIiwic291cmNlUm9vdCI6IiJ9");

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

	eval("/*\n *\tjQuery dotdotdot 1.6.11\n *\n *\tCopyright (c) Fred Heusschen\n *\twww.frebsite.nl\n *\n *\tPlugin website:\n *\tdotdotdot.frebsite.nl\n *\n *\tDual licensed under the MIT and GPL licenses.\n *\thttp://en.wikipedia.org/wiki/MIT_License\n *\thttp://en.wikipedia.org/wiki/GNU_General_Public_License\n */\n!function(t,e){function n(t,e,n){var r=t.children(),o=!1;t.empty();for(var i=0,d=r.length;d>i;i++){var l=r.eq(i);if(t.append(l),n&&t.append(n),a(t,e)){l.remove(),o=!0;break}n&&n.detach()}return o}function r(e,n,i,d,l){var s=!1,c=\"table, thead, tbody, tfoot, tr, col, colgroup, object, embed, param, ol, ul, dl, blockquote, select, optgroup, option, textarea, script, style\",u=\"script\";return e.contents().detach().each(function(){var h=this,f=t(h);if(\"undefined\"==typeof h||3==h.nodeType&&0==t.trim(h.data).length)return!0;if(f.is(u))e.append(f);else{if(s)return!0;e.append(f),l&&e[e.is(c)?\"after\":\"append\"](l),a(i,d)?(s=3==h.nodeType?o(f,n,i,d,l):r(f,n,i,d,l),s||(f.detach(),s=!0)):s=!0,s||l&&l.detach()}}),s}function o(e,n,r,o,d){var c=e[0];if(!c)return!1;var h=s(c),f=-1!==h.indexOf(\" \")?\" \":\"　\",p=\"letter\"==o.wrap?\"\":f,g=h.split(p),v=-1,w=-1,b=0,y=g.length-1;for(o.fallbackToLetter&&0==b&&0==y&&(p=\"\",g=h.split(p),y=g.length-1);y>=b&&(0!=b||0!=y);){var m=Math.floor((b+y)/2);if(m==w)break;w=m,l(c,g.slice(0,w+1).join(p)+o.ellipsis),a(r,o)?(y=w,o.fallbackToLetter&&0==b&&0==y&&(p=\"\",g=g[0].split(p),v=-1,w=-1,b=0,y=g.length-1)):(v=w,b=w)}if(-1==v||1==g.length&&0==g[0].length){var x=e.parent();e.detach();var T=d&&d.closest(x).length?d.length:0;x.contents().length>T?c=u(x.contents().eq(-1-T),n):(c=u(x,n,!0),T||x.detach()),c&&(h=i(s(c),o),l(c,h),T&&d&&t(c).parent().append(d))}else h=i(g.slice(0,v+1).join(p),o),l(c,h);return!0}function a(t,e){return t.innerHeight()>e.maxHeight}function i(e,n){for(;t.inArray(e.slice(-1),n.lastCharacter.remove)>-1;)e=e.slice(0,-1);return t.inArray(e.slice(-1),n.lastCharacter.noEllipsis)<0&&(e+=n.ellipsis),e}function d(t){return{width:t.innerWidth(),height:t.innerHeight()}}function l(t,e){t.innerText?t.innerText=e:t.nodeValue?t.nodeValue=e:t.textContent&&(t.textContent=e)}function s(t){return t.innerText?t.innerText:t.nodeValue?t.nodeValue:t.textContent?t.textContent:\"\"}function c(t){do t=t.previousSibling;while(t&&1!==t.nodeType&&3!==t.nodeType);return t}function u(e,n,r){var o,a=e&&e[0];if(a){if(!r){if(3===a.nodeType)return a;if(t.trim(e.text()))return u(e.contents().last(),n)}for(o=c(a);!o;){if(e=e.parent(),e.is(n)||!e.length)return!1;o=c(e[0])}if(o)return u(t(o),n)}return!1}function h(e,n){return e?\"string\"==typeof e?(e=t(e,n),e.length?e:!1):e.jquery?e:!1:!1}function f(t){for(var e=t.innerHeight(),n=[\"paddingTop\",\"paddingBottom\"],r=0,o=n.length;o>r;r++){var a=parseInt(t.css(n[r]),10);isNaN(a)&&(a=0),e-=a}return e}if(!t.fn.dotdotdot){t.fn.dotdotdot=function(e){if(0==this.length)return t.fn.dotdotdot.debug('No element found for \"'+this.selector+'\".'),this;if(this.length>1)return this.each(function(){t(this).dotdotdot(e)});var o=this;o.data(\"dotdotdot\")&&o.trigger(\"destroy.dot\"),o.data(\"dotdotdot-style\",o.attr(\"style\")||\"\"),o.css(\"word-wrap\",\"break-word\"),\"nowrap\"===o.css(\"white-space\")&&o.css(\"white-space\",\"normal\"),o.bind_events=function(){return o.bind(\"update.dot\",function(e,d){e.preventDefault(),e.stopPropagation(),l.maxHeight=\"number\"==typeof l.height?l.height:f(o),l.maxHeight+=l.tolerance,\"undefined\"!=typeof d&&((\"string\"==typeof d||d instanceof HTMLElement)&&(d=t(\"<div />\").append(d).contents()),d instanceof t&&(i=d)),g=o.wrapInner('<div class=\"dotdotdot\" />').children(),g.contents().detach().end().append(i.clone(!0)).find(\"br\").replaceWith(\"  <br />  \").end().css({height:\"auto\",width:\"auto\",border:\"none\",padding:0,margin:0});var c=!1,u=!1;return s.afterElement&&(c=s.afterElement.clone(!0),c.show(),s.afterElement.detach()),a(g,l)&&(u=\"children\"==l.wrap?n(g,l,c):r(g,o,g,l,c)),g.replaceWith(g.contents()),g=null,t.isFunction(l.callback)&&l.callback.call(o[0],u,i),s.isTruncated=u,u}).bind(\"isTruncated.dot\",function(t,e){return t.preventDefault(),t.stopPropagation(),\"function\"==typeof e&&e.call(o[0],s.isTruncated),s.isTruncated}).bind(\"originalContent.dot\",function(t,e){return t.preventDefault(),t.stopPropagation(),\"function\"==typeof e&&e.call(o[0],i),i}).bind(\"destroy.dot\",function(t){t.preventDefault(),t.stopPropagation(),o.unwatch().unbind_events().contents().detach().end().append(i).attr(\"style\",o.data(\"dotdotdot-style\")||\"\").data(\"dotdotdot\",!1)}),o},o.unbind_events=function(){return o.unbind(\".dot\"),o},o.watch=function(){if(o.unwatch(),\"window\"==l.watch){var e=t(window),n=e.width(),r=e.height();e.bind(\"resize.dot\"+s.dotId,function(){n==e.width()&&r==e.height()&&l.windowResizeFix||(n=e.width(),r=e.height(),u&&clearInterval(u),u=setTimeout(function(){o.trigger(\"update.dot\")},10))})}else c=d(o),u=setInterval(function(){var t=d(o);(c.width!=t.width||c.height!=t.height)&&(o.trigger(\"update.dot\"),c=d(o))},100);return o},o.unwatch=function(){return t(window).unbind(\"resize.dot\"+s.dotId),u&&clearInterval(u),o};var i=o.contents(),l=t.extend(!0,{},t.fn.dotdotdot.defaults,e),s={},c={},u=null,g=null;return l.lastCharacter.remove instanceof Array||(l.lastCharacter.remove=t.fn.dotdotdot.defaultArrays.lastCharacter.remove),l.lastCharacter.noEllipsis instanceof Array||(l.lastCharacter.noEllipsis=t.fn.dotdotdot.defaultArrays.lastCharacter.noEllipsis),s.afterElement=h(l.after,o),s.isTruncated=!1,s.dotId=p++,o.data(\"dotdotdot\",!0).bind_events().trigger(\"update.dot\"),l.watch&&o.watch(),o},t.fn.dotdotdot.defaults={ellipsis:\"... \",wrap:\"word\",fallbackToLetter:!0,lastCharacter:{},tolerance:0,callback:null,after:null,height:null,watch:!1,windowResizeFix:!0},t.fn.dotdotdot.defaultArrays={lastCharacter:{remove:[\" \",\"　\",\",\",\";\",\".\",\"!\",\"?\"],noEllipsis:[]}},t.fn.dotdotdot.debug=function(){};var p=1,g=t.fn.html;t.fn.html=function(n){return n!=e&&!t.isFunction(n)&&this.data(\"dotdotdot\")?this.trigger(\"update\",[n]):g.apply(this,arguments)};var v=t.fn.text;t.fn.text=function(n){return n!=e&&!t.isFunction(n)&&this.data(\"dotdotdot\")?(n=t(\"<div />\").text(n).html(),this.trigger(\"update\",[n])):v.apply(this,arguments)}}}(jQuery);\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzUuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ib3dlcl9jb21wb25lbnRzL2pxdWVyeS5kb3Rkb3Rkb3Qvc3JjL2pzL2pxdWVyeS5kb3Rkb3Rkb3QubWluLmpzPzExMGEiXSwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqXHRqUXVlcnkgZG90ZG90ZG90IDEuNi4xMVxuICpcbiAqXHRDb3B5cmlnaHQgKGMpIEZyZWQgSGV1c3NjaGVuXG4gKlx0d3d3LmZyZWJzaXRlLm5sXG4gKlxuICpcdFBsdWdpbiB3ZWJzaXRlOlxuICpcdGRvdGRvdGRvdC5mcmVic2l0ZS5ubFxuICpcbiAqXHREdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIEdQTCBsaWNlbnNlcy5cbiAqXHRodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL01JVF9MaWNlbnNlXG4gKlx0aHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9HTlVfR2VuZXJhbF9QdWJsaWNfTGljZW5zZVxuICovXG4hZnVuY3Rpb24odCxlKXtmdW5jdGlvbiBuKHQsZSxuKXt2YXIgcj10LmNoaWxkcmVuKCksbz0hMTt0LmVtcHR5KCk7Zm9yKHZhciBpPTAsZD1yLmxlbmd0aDtkPmk7aSsrKXt2YXIgbD1yLmVxKGkpO2lmKHQuYXBwZW5kKGwpLG4mJnQuYXBwZW5kKG4pLGEodCxlKSl7bC5yZW1vdmUoKSxvPSEwO2JyZWFrfW4mJm4uZGV0YWNoKCl9cmV0dXJuIG99ZnVuY3Rpb24gcihlLG4saSxkLGwpe3ZhciBzPSExLGM9XCJ0YWJsZSwgdGhlYWQsIHRib2R5LCB0Zm9vdCwgdHIsIGNvbCwgY29sZ3JvdXAsIG9iamVjdCwgZW1iZWQsIHBhcmFtLCBvbCwgdWwsIGRsLCBibG9ja3F1b3RlLCBzZWxlY3QsIG9wdGdyb3VwLCBvcHRpb24sIHRleHRhcmVhLCBzY3JpcHQsIHN0eWxlXCIsdT1cInNjcmlwdFwiO3JldHVybiBlLmNvbnRlbnRzKCkuZGV0YWNoKCkuZWFjaChmdW5jdGlvbigpe3ZhciBoPXRoaXMsZj10KGgpO2lmKFwidW5kZWZpbmVkXCI9PXR5cGVvZiBofHwzPT1oLm5vZGVUeXBlJiYwPT10LnRyaW0oaC5kYXRhKS5sZW5ndGgpcmV0dXJuITA7aWYoZi5pcyh1KSllLmFwcGVuZChmKTtlbHNle2lmKHMpcmV0dXJuITA7ZS5hcHBlbmQoZiksbCYmZVtlLmlzKGMpP1wiYWZ0ZXJcIjpcImFwcGVuZFwiXShsKSxhKGksZCk/KHM9Mz09aC5ub2RlVHlwZT9vKGYsbixpLGQsbCk6cihmLG4saSxkLGwpLHN8fChmLmRldGFjaCgpLHM9ITApKTpzPSEwLHN8fGwmJmwuZGV0YWNoKCl9fSksc31mdW5jdGlvbiBvKGUsbixyLG8sZCl7dmFyIGM9ZVswXTtpZighYylyZXR1cm4hMTt2YXIgaD1zKGMpLGY9LTEhPT1oLmluZGV4T2YoXCIgXCIpP1wiIFwiOlwi44CAXCIscD1cImxldHRlclwiPT1vLndyYXA/XCJcIjpmLGc9aC5zcGxpdChwKSx2PS0xLHc9LTEsYj0wLHk9Zy5sZW5ndGgtMTtmb3Ioby5mYWxsYmFja1RvTGV0dGVyJiYwPT1iJiYwPT15JiYocD1cIlwiLGc9aC5zcGxpdChwKSx5PWcubGVuZ3RoLTEpO3k+PWImJigwIT1ifHwwIT15KTspe3ZhciBtPU1hdGguZmxvb3IoKGIreSkvMik7aWYobT09dylicmVhazt3PW0sbChjLGcuc2xpY2UoMCx3KzEpLmpvaW4ocCkrby5lbGxpcHNpcyksYShyLG8pPyh5PXcsby5mYWxsYmFja1RvTGV0dGVyJiYwPT1iJiYwPT15JiYocD1cIlwiLGc9Z1swXS5zcGxpdChwKSx2PS0xLHc9LTEsYj0wLHk9Zy5sZW5ndGgtMSkpOih2PXcsYj13KX1pZigtMT09dnx8MT09Zy5sZW5ndGgmJjA9PWdbMF0ubGVuZ3RoKXt2YXIgeD1lLnBhcmVudCgpO2UuZGV0YWNoKCk7dmFyIFQ9ZCYmZC5jbG9zZXN0KHgpLmxlbmd0aD9kLmxlbmd0aDowO3guY29udGVudHMoKS5sZW5ndGg+VD9jPXUoeC5jb250ZW50cygpLmVxKC0xLVQpLG4pOihjPXUoeCxuLCEwKSxUfHx4LmRldGFjaCgpKSxjJiYoaD1pKHMoYyksbyksbChjLGgpLFQmJmQmJnQoYykucGFyZW50KCkuYXBwZW5kKGQpKX1lbHNlIGg9aShnLnNsaWNlKDAsdisxKS5qb2luKHApLG8pLGwoYyxoKTtyZXR1cm4hMH1mdW5jdGlvbiBhKHQsZSl7cmV0dXJuIHQuaW5uZXJIZWlnaHQoKT5lLm1heEhlaWdodH1mdW5jdGlvbiBpKGUsbil7Zm9yKDt0LmluQXJyYXkoZS5zbGljZSgtMSksbi5sYXN0Q2hhcmFjdGVyLnJlbW92ZSk+LTE7KWU9ZS5zbGljZSgwLC0xKTtyZXR1cm4gdC5pbkFycmF5KGUuc2xpY2UoLTEpLG4ubGFzdENoYXJhY3Rlci5ub0VsbGlwc2lzKTwwJiYoZSs9bi5lbGxpcHNpcyksZX1mdW5jdGlvbiBkKHQpe3JldHVybnt3aWR0aDp0LmlubmVyV2lkdGgoKSxoZWlnaHQ6dC5pbm5lckhlaWdodCgpfX1mdW5jdGlvbiBsKHQsZSl7dC5pbm5lclRleHQ/dC5pbm5lclRleHQ9ZTp0Lm5vZGVWYWx1ZT90Lm5vZGVWYWx1ZT1lOnQudGV4dENvbnRlbnQmJih0LnRleHRDb250ZW50PWUpfWZ1bmN0aW9uIHModCl7cmV0dXJuIHQuaW5uZXJUZXh0P3QuaW5uZXJUZXh0OnQubm9kZVZhbHVlP3Qubm9kZVZhbHVlOnQudGV4dENvbnRlbnQ/dC50ZXh0Q29udGVudDpcIlwifWZ1bmN0aW9uIGModCl7ZG8gdD10LnByZXZpb3VzU2libGluZzt3aGlsZSh0JiYxIT09dC5ub2RlVHlwZSYmMyE9PXQubm9kZVR5cGUpO3JldHVybiB0fWZ1bmN0aW9uIHUoZSxuLHIpe3ZhciBvLGE9ZSYmZVswXTtpZihhKXtpZighcil7aWYoMz09PWEubm9kZVR5cGUpcmV0dXJuIGE7aWYodC50cmltKGUudGV4dCgpKSlyZXR1cm4gdShlLmNvbnRlbnRzKCkubGFzdCgpLG4pfWZvcihvPWMoYSk7IW87KXtpZihlPWUucGFyZW50KCksZS5pcyhuKXx8IWUubGVuZ3RoKXJldHVybiExO289YyhlWzBdKX1pZihvKXJldHVybiB1KHQobyksbil9cmV0dXJuITF9ZnVuY3Rpb24gaChlLG4pe3JldHVybiBlP1wic3RyaW5nXCI9PXR5cGVvZiBlPyhlPXQoZSxuKSxlLmxlbmd0aD9lOiExKTplLmpxdWVyeT9lOiExOiExfWZ1bmN0aW9uIGYodCl7Zm9yKHZhciBlPXQuaW5uZXJIZWlnaHQoKSxuPVtcInBhZGRpbmdUb3BcIixcInBhZGRpbmdCb3R0b21cIl0scj0wLG89bi5sZW5ndGg7bz5yO3IrKyl7dmFyIGE9cGFyc2VJbnQodC5jc3MobltyXSksMTApO2lzTmFOKGEpJiYoYT0wKSxlLT1hfXJldHVybiBlfWlmKCF0LmZuLmRvdGRvdGRvdCl7dC5mbi5kb3Rkb3Rkb3Q9ZnVuY3Rpb24oZSl7aWYoMD09dGhpcy5sZW5ndGgpcmV0dXJuIHQuZm4uZG90ZG90ZG90LmRlYnVnKCdObyBlbGVtZW50IGZvdW5kIGZvciBcIicrdGhpcy5zZWxlY3RvcisnXCIuJyksdGhpcztpZih0aGlzLmxlbmd0aD4xKXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXt0KHRoaXMpLmRvdGRvdGRvdChlKX0pO3ZhciBvPXRoaXM7by5kYXRhKFwiZG90ZG90ZG90XCIpJiZvLnRyaWdnZXIoXCJkZXN0cm95LmRvdFwiKSxvLmRhdGEoXCJkb3Rkb3Rkb3Qtc3R5bGVcIixvLmF0dHIoXCJzdHlsZVwiKXx8XCJcIiksby5jc3MoXCJ3b3JkLXdyYXBcIixcImJyZWFrLXdvcmRcIiksXCJub3dyYXBcIj09PW8uY3NzKFwid2hpdGUtc3BhY2VcIikmJm8uY3NzKFwid2hpdGUtc3BhY2VcIixcIm5vcm1hbFwiKSxvLmJpbmRfZXZlbnRzPWZ1bmN0aW9uKCl7cmV0dXJuIG8uYmluZChcInVwZGF0ZS5kb3RcIixmdW5jdGlvbihlLGQpe2UucHJldmVudERlZmF1bHQoKSxlLnN0b3BQcm9wYWdhdGlvbigpLGwubWF4SGVpZ2h0PVwibnVtYmVyXCI9PXR5cGVvZiBsLmhlaWdodD9sLmhlaWdodDpmKG8pLGwubWF4SGVpZ2h0Kz1sLnRvbGVyYW5jZSxcInVuZGVmaW5lZFwiIT10eXBlb2YgZCYmKChcInN0cmluZ1wiPT10eXBlb2YgZHx8ZCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50KSYmKGQ9dChcIjxkaXYgLz5cIikuYXBwZW5kKGQpLmNvbnRlbnRzKCkpLGQgaW5zdGFuY2VvZiB0JiYoaT1kKSksZz1vLndyYXBJbm5lcignPGRpdiBjbGFzcz1cImRvdGRvdGRvdFwiIC8+JykuY2hpbGRyZW4oKSxnLmNvbnRlbnRzKCkuZGV0YWNoKCkuZW5kKCkuYXBwZW5kKGkuY2xvbmUoITApKS5maW5kKFwiYnJcIikucmVwbGFjZVdpdGgoXCIgIDxiciAvPiAgXCIpLmVuZCgpLmNzcyh7aGVpZ2h0OlwiYXV0b1wiLHdpZHRoOlwiYXV0b1wiLGJvcmRlcjpcIm5vbmVcIixwYWRkaW5nOjAsbWFyZ2luOjB9KTt2YXIgYz0hMSx1PSExO3JldHVybiBzLmFmdGVyRWxlbWVudCYmKGM9cy5hZnRlckVsZW1lbnQuY2xvbmUoITApLGMuc2hvdygpLHMuYWZ0ZXJFbGVtZW50LmRldGFjaCgpKSxhKGcsbCkmJih1PVwiY2hpbGRyZW5cIj09bC53cmFwP24oZyxsLGMpOnIoZyxvLGcsbCxjKSksZy5yZXBsYWNlV2l0aChnLmNvbnRlbnRzKCkpLGc9bnVsbCx0LmlzRnVuY3Rpb24obC5jYWxsYmFjaykmJmwuY2FsbGJhY2suY2FsbChvWzBdLHUsaSkscy5pc1RydW5jYXRlZD11LHV9KS5iaW5kKFwiaXNUcnVuY2F0ZWQuZG90XCIsZnVuY3Rpb24odCxlKXtyZXR1cm4gdC5wcmV2ZW50RGVmYXVsdCgpLHQuc3RvcFByb3BhZ2F0aW9uKCksXCJmdW5jdGlvblwiPT10eXBlb2YgZSYmZS5jYWxsKG9bMF0scy5pc1RydW5jYXRlZCkscy5pc1RydW5jYXRlZH0pLmJpbmQoXCJvcmlnaW5hbENvbnRlbnQuZG90XCIsZnVuY3Rpb24odCxlKXtyZXR1cm4gdC5wcmV2ZW50RGVmYXVsdCgpLHQuc3RvcFByb3BhZ2F0aW9uKCksXCJmdW5jdGlvblwiPT10eXBlb2YgZSYmZS5jYWxsKG9bMF0saSksaX0pLmJpbmQoXCJkZXN0cm95LmRvdFwiLGZ1bmN0aW9uKHQpe3QucHJldmVudERlZmF1bHQoKSx0LnN0b3BQcm9wYWdhdGlvbigpLG8udW53YXRjaCgpLnVuYmluZF9ldmVudHMoKS5jb250ZW50cygpLmRldGFjaCgpLmVuZCgpLmFwcGVuZChpKS5hdHRyKFwic3R5bGVcIixvLmRhdGEoXCJkb3Rkb3Rkb3Qtc3R5bGVcIil8fFwiXCIpLmRhdGEoXCJkb3Rkb3Rkb3RcIiwhMSl9KSxvfSxvLnVuYmluZF9ldmVudHM9ZnVuY3Rpb24oKXtyZXR1cm4gby51bmJpbmQoXCIuZG90XCIpLG99LG8ud2F0Y2g9ZnVuY3Rpb24oKXtpZihvLnVud2F0Y2goKSxcIndpbmRvd1wiPT1sLndhdGNoKXt2YXIgZT10KHdpbmRvdyksbj1lLndpZHRoKCkscj1lLmhlaWdodCgpO2UuYmluZChcInJlc2l6ZS5kb3RcIitzLmRvdElkLGZ1bmN0aW9uKCl7bj09ZS53aWR0aCgpJiZyPT1lLmhlaWdodCgpJiZsLndpbmRvd1Jlc2l6ZUZpeHx8KG49ZS53aWR0aCgpLHI9ZS5oZWlnaHQoKSx1JiZjbGVhckludGVydmFsKHUpLHU9c2V0VGltZW91dChmdW5jdGlvbigpe28udHJpZ2dlcihcInVwZGF0ZS5kb3RcIil9LDEwKSl9KX1lbHNlIGM9ZChvKSx1PXNldEludGVydmFsKGZ1bmN0aW9uKCl7dmFyIHQ9ZChvKTsoYy53aWR0aCE9dC53aWR0aHx8Yy5oZWlnaHQhPXQuaGVpZ2h0KSYmKG8udHJpZ2dlcihcInVwZGF0ZS5kb3RcIiksYz1kKG8pKX0sMTAwKTtyZXR1cm4gb30sby51bndhdGNoPWZ1bmN0aW9uKCl7cmV0dXJuIHQod2luZG93KS51bmJpbmQoXCJyZXNpemUuZG90XCIrcy5kb3RJZCksdSYmY2xlYXJJbnRlcnZhbCh1KSxvfTt2YXIgaT1vLmNvbnRlbnRzKCksbD10LmV4dGVuZCghMCx7fSx0LmZuLmRvdGRvdGRvdC5kZWZhdWx0cyxlKSxzPXt9LGM9e30sdT1udWxsLGc9bnVsbDtyZXR1cm4gbC5sYXN0Q2hhcmFjdGVyLnJlbW92ZSBpbnN0YW5jZW9mIEFycmF5fHwobC5sYXN0Q2hhcmFjdGVyLnJlbW92ZT10LmZuLmRvdGRvdGRvdC5kZWZhdWx0QXJyYXlzLmxhc3RDaGFyYWN0ZXIucmVtb3ZlKSxsLmxhc3RDaGFyYWN0ZXIubm9FbGxpcHNpcyBpbnN0YW5jZW9mIEFycmF5fHwobC5sYXN0Q2hhcmFjdGVyLm5vRWxsaXBzaXM9dC5mbi5kb3Rkb3Rkb3QuZGVmYXVsdEFycmF5cy5sYXN0Q2hhcmFjdGVyLm5vRWxsaXBzaXMpLHMuYWZ0ZXJFbGVtZW50PWgobC5hZnRlcixvKSxzLmlzVHJ1bmNhdGVkPSExLHMuZG90SWQ9cCsrLG8uZGF0YShcImRvdGRvdGRvdFwiLCEwKS5iaW5kX2V2ZW50cygpLnRyaWdnZXIoXCJ1cGRhdGUuZG90XCIpLGwud2F0Y2gmJm8ud2F0Y2goKSxvfSx0LmZuLmRvdGRvdGRvdC5kZWZhdWx0cz17ZWxsaXBzaXM6XCIuLi4gXCIsd3JhcDpcIndvcmRcIixmYWxsYmFja1RvTGV0dGVyOiEwLGxhc3RDaGFyYWN0ZXI6e30sdG9sZXJhbmNlOjAsY2FsbGJhY2s6bnVsbCxhZnRlcjpudWxsLGhlaWdodDpudWxsLHdhdGNoOiExLHdpbmRvd1Jlc2l6ZUZpeDohMH0sdC5mbi5kb3Rkb3Rkb3QuZGVmYXVsdEFycmF5cz17bGFzdENoYXJhY3Rlcjp7cmVtb3ZlOltcIiBcIixcIuOAgFwiLFwiLFwiLFwiO1wiLFwiLlwiLFwiIVwiLFwiP1wiXSxub0VsbGlwc2lzOltdfX0sdC5mbi5kb3Rkb3Rkb3QuZGVidWc9ZnVuY3Rpb24oKXt9O3ZhciBwPTEsZz10LmZuLmh0bWw7dC5mbi5odG1sPWZ1bmN0aW9uKG4pe3JldHVybiBuIT1lJiYhdC5pc0Z1bmN0aW9uKG4pJiZ0aGlzLmRhdGEoXCJkb3Rkb3Rkb3RcIik/dGhpcy50cmlnZ2VyKFwidXBkYXRlXCIsW25dKTpnLmFwcGx5KHRoaXMsYXJndW1lbnRzKX07dmFyIHY9dC5mbi50ZXh0O3QuZm4udGV4dD1mdW5jdGlvbihuKXtyZXR1cm4gbiE9ZSYmIXQuaXNGdW5jdGlvbihuKSYmdGhpcy5kYXRhKFwiZG90ZG90ZG90XCIpPyhuPXQoXCI8ZGl2IC8+XCIpLnRleHQobikuaHRtbCgpLHRoaXMudHJpZ2dlcihcInVwZGF0ZVwiLFtuXSkpOnYuYXBwbHkodGhpcyxhcmd1bWVudHMpfX19KGpRdWVyeSk7XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL2Jvd2VyX2NvbXBvbmVudHMvanF1ZXJ5LmRvdGRvdGRvdC9zcmMvanMvanF1ZXJ5LmRvdGRvdGRvdC5taW4uanNcbiAqKiBtb2R1bGUgaWQgPSAzNVxuICoqIG1vZHVsZSBjaHVua3MgPSAyNFxuICoqLyJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");

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

	eval("/*\n AngularJS v1.4.6\n (c) 2010-2015 Google, Inc. http://angularjs.org\n License: MIT\n*/\n(function(F,x,Oa){'use strict';function va(a,b,c){if(!a)throw ngMinErr(\"areq\",b||\"?\",c||\"required\");return a}function wa(a,b){if(!a&&!b)return\"\";if(!a)return b;if(!b)return a;Y(a)&&(a=a.join(\" \"));Y(b)&&(b=b.join(\" \"));return a+\" \"+b}function Fa(a){var b={};a&&(a.to||a.from)&&(b.to=a.to,b.from=a.from);return b}function V(a,b,c){var d=\"\";a=Y(a)?a:a&&M(a)&&a.length?a.split(/\\s+/):[];q(a,function(a,y){a&&0<a.length&&(d+=0<y?\" \":\"\",d+=c?b+a:a+b)});return d}function Ga(a){if(a instanceof I)switch(a.length){case 0:return[];\ncase 1:if(1===a[0].nodeType)return a;break;default:return I(Z(a))}if(1===a.nodeType)return I(a)}function Z(a){if(!a[0])return a;for(var b=0;b<a.length;b++){var c=a[b];if(1==c.nodeType)return c}}function Ha(a,b,c){q(b,function(b){a.addClass(b,c)})}function Ia(a,b,c){q(b,function(b){a.removeClass(b,c)})}function Q(a){return function(b,c){c.addClass&&(Ha(a,b,c.addClass),c.addClass=null);c.removeClass&&(Ia(a,b,c.removeClass),c.removeClass=null)}}function ia(a){a=a||{};if(!a.$$prepared){var b=a.domOperation||\nL;a.domOperation=function(){a.$$domOperationFired=!0;b();b=L};a.$$prepared=!0}return a}function ea(a,b){xa(a,b);ya(a,b)}function xa(a,b){b.from&&(a.css(b.from),b.from=null)}function ya(a,b){b.to&&(a.css(b.to),b.to=null)}function R(a,b,c){var d=(b.addClass||\"\")+\" \"+(c.addClass||\"\"),e=(b.removeClass||\"\")+\" \"+(c.removeClass||\"\");a=Ja(a.attr(\"class\"),d,e);c.preparationClasses&&(b.preparationClasses=$(c.preparationClasses,b.preparationClasses),delete c.preparationClasses);d=b.domOperation!==L?b.domOperation:\nnull;za(b,c);d&&(b.domOperation=d);b.addClass=a.addClass?a.addClass:null;b.removeClass=a.removeClass?a.removeClass:null;return b}function Ja(a,b,c){function d(a){M(a)&&(a=a.split(\" \"));var b={};q(a,function(a){a.length&&(b[a]=!0)});return b}var e={};a=d(a);b=d(b);q(b,function(a,b){e[b]=1});c=d(c);q(c,function(a,b){e[b]=1===e[b]?null:-1});var y={addClass:\"\",removeClass:\"\"};q(e,function(b,c){var e,d;1===b?(e=\"addClass\",d=!a[c]):-1===b&&(e=\"removeClass\",d=a[c]);d&&(y[e].length&&(y[e]+=\" \"),y[e]+=c)});\nreturn y}function G(a){return a instanceof x.element?a[0]:a}function Ka(a,b,c){var d=\"\";b&&(d=V(b,\"ng-\",!0));c.addClass&&(d=$(d,V(c.addClass,\"-add\")));c.removeClass&&(d=$(d,V(c.removeClass,\"-remove\")));d.length&&(c.preparationClasses=d,a.addClass(d))}function ja(a,b){var c=b?\"-\"+b+\"s\":\"\";fa(a,[ga,c]);return[ga,c]}function ma(a,b){var c=b?\"paused\":\"\",d=W+\"PlayState\";fa(a,[d,c]);return[d,c]}function fa(a,b){a.style[b[0]]=b[1]}function $(a,b){return a?b?a+\" \"+b:a:b}function Aa(a,b,c){var d=Object.create(null),\ne=a.getComputedStyle(b)||{};q(c,function(a,b){var c=e[a];if(c){var l=c.charAt(0);if(\"-\"===l||\"+\"===l||0<=l)c=La(c);0===c&&(c=null);d[b]=c}});return d}function La(a){var b=0;a=a.split(/\\s*,\\s*/);q(a,function(a){\"s\"==a.charAt(a.length-1)&&(a=a.substring(0,a.length-1));a=parseFloat(a)||0;b=b?Math.max(a,b):a});return b}function na(a){return 0===a||null!=a}function Ba(a,b){var c=N,d=a+\"s\";b?c+=\"Duration\":d+=\" linear all\";return[c,d]}function Ca(){var a=Object.create(null);return{flush:function(){a=Object.create(null)},\ncount:function(b){return(b=a[b])?b.total:0},get:function(b){return(b=a[b])&&b.value},put:function(b,c){a[b]?a[b].total++:a[b]={total:1,value:c}}}}var L=x.noop,za=x.extend,I=x.element,q=x.forEach,Y=x.isArray,M=x.isString,oa=x.isObject,pa=x.isUndefined,qa=x.isDefined,Da=x.isFunction,ra=x.isElement,N,sa,W,ta;pa(F.ontransitionend)&&qa(F.onwebkittransitionend)?(N=\"WebkitTransition\",sa=\"webkitTransitionEnd transitionend\"):(N=\"transition\",sa=\"transitionend\");pa(F.onanimationend)&&qa(F.onwebkitanimationend)?\n(W=\"WebkitAnimation\",ta=\"webkitAnimationEnd animationend\"):(W=\"animation\",ta=\"animationend\");var ka=W+\"Delay\",ua=W+\"Duration\",ga=N+\"Delay\";F=N+\"Duration\";var Ma={transitionDuration:F,transitionDelay:ga,transitionProperty:N+\"Property\",animationDuration:ua,animationDelay:ka,animationIterationCount:W+\"IterationCount\"},Na={transitionDuration:F,transitionDelay:ga,animationDuration:ua,animationDelay:ka};x.module(\"ngAnimate\",[]).provider(\"$$body\",function(){this.$get=[\"$document\",function(a){return I(a[0].body)}]}).directive(\"ngAnimateChildren\",\n[function(){return function(a,b,c){a=c.ngAnimateChildren;x.isString(a)&&0===a.length?b.data(\"$$ngAnimateChildren\",!0):c.$observe(\"ngAnimateChildren\",function(a){b.data(\"$$ngAnimateChildren\",\"on\"===a||\"true\"===a)})}}]).factory(\"$$rAFScheduler\",[\"$$rAF\",function(a){function b(a){d=d.concat(a);c()}function c(){if(d.length){for(var b=d.shift(),v=0;v<b.length;v++)b[v]();e||a(function(){e||c()})}}var d,e;d=b.queue=[];b.waitUntilQuiet=function(b){e&&e();e=a(function(){e=null;b();c()})};return b}]).factory(\"$$AnimateRunner\",\n[\"$q\",\"$sniffer\",\"$$animateAsyncRun\",function(a,b,c){function d(a){this.setHost(a);this._doneCallbacks=[];this._runInAnimationFrame=c();this._state=0}d.chain=function(a,b){function c(){if(d===a.length)b(!0);else a[d](function(a){!1===a?b(!1):(d++,c())})}var d=0;c()};d.all=function(a,b){function c(v){l=l&&v;++d===a.length&&b(l)}var d=0,l=!0;q(a,function(a){a.done(c)})};d.prototype={setHost:function(a){this.host=a||{}},done:function(a){2===this._state?a():this._doneCallbacks.push(a)},progress:L,getPromise:function(){if(!this.promise){var b=\nthis;this.promise=a(function(a,c){b.done(function(b){!1===b?c():a()})})}return this.promise},then:function(a,b){return this.getPromise().then(a,b)},\"catch\":function(a){return this.getPromise()[\"catch\"](a)},\"finally\":function(a){return this.getPromise()[\"finally\"](a)},pause:function(){this.host.pause&&this.host.pause()},resume:function(){this.host.resume&&this.host.resume()},end:function(){this.host.end&&this.host.end();this._resolve(!0)},cancel:function(){this.host.cancel&&this.host.cancel();this._resolve(!1)},\ncomplete:function(a){var b=this;0===b._state&&(b._state=1,b._runInAnimationFrame(function(){b._resolve(a)}))},_resolve:function(a){2!==this._state&&(q(this._doneCallbacks,function(b){b(a)}),this._doneCallbacks.length=0,this._state=2)}};return d}]).factory(\"$$animateAsyncRun\",[\"$$rAF\",function(a){function b(b){c.push(b);1<c.length||a(function(){for(var a=0;a<c.length;a++)c[a]();c=[]})}var c=[];return function(){var a=!1;b(function(){a=!0});return function(c){a?c():b(c)}}}]).provider(\"$$animateQueue\",\n[\"$animateProvider\",function(a){function b(a,b,c,q){return d[a].some(function(a){return a(b,c,q)})}function c(a,b){a=a||{};var c=0<(a.addClass||\"\").length,d=0<(a.removeClass||\"\").length;return b?c&&d:c||d}var d=this.rules={skip:[],cancel:[],join:[]};d.join.push(function(a,b,d){return!b.structural&&c(b.options)});d.skip.push(function(a,b,d){return!b.structural&&!c(b.options)});d.skip.push(function(a,b,c){return\"leave\"==c.event&&b.structural});d.skip.push(function(a,b,c){return c.structural&&2===c.state&&\n!b.structural});d.cancel.push(function(a,b,c){return c.structural&&b.structural});d.cancel.push(function(a,b,c){return 2===c.state&&b.structural});d.cancel.push(function(a,b,c){a=b.options;c=c.options;return a.addClass&&a.addClass===c.removeClass||a.removeClass&&a.removeClass===c.addClass});this.$get=[\"$$rAF\",\"$rootScope\",\"$rootElement\",\"$document\",\"$$body\",\"$$HashMap\",\"$$animation\",\"$$AnimateRunner\",\"$templateRequest\",\"$$jqLite\",\"$$forceReflow\",function(d,y,v,z,l,s,O,x,t,la,E){function h(a,b){var c=\nG(a),f=[],g=w[b];g&&q(g,function(a){a.node.contains(c)&&f.push(a.callback)});return f}function S(a,b,c,f){d(function(){q(h(b,a),function(a){a(b,c,f)})})}function u(a,g,m){function d(b,c,g,f){S(c,a,g,f);b.progress(c,g,f)}function w(b){var c=a,g=m;g.preparationClasses&&(c.removeClass(g.preparationClasses),g.preparationClasses=null);g.activeClasses&&(c.removeClass(g.activeClasses),g.activeClasses=null);Ea(a,m);ea(a,m);m.domOperation();e.complete(!b)}var B,h;if(a=Ga(a))B=G(a),h=a.parent();m=ia(m);var e=\nnew x;Y(m.addClass)&&(m.addClass=m.addClass.join(\" \"));m.addClass&&!M(m.addClass)&&(m.addClass=null);Y(m.removeClass)&&(m.removeClass=m.removeClass.join(\" \"));m.removeClass&&!M(m.removeClass)&&(m.removeClass=null);m.from&&!oa(m.from)&&(m.from=null);m.to&&!oa(m.to)&&(m.to=null);if(!B)return w(),e;var k=[B.className,m.addClass,m.removeClass].join(\" \");if(!C(k))return w(),e;var l=0<=[\"enter\",\"move\",\"leave\"].indexOf(g),u=!H||U.get(B),k=!u&&A.get(B)||{},v=!!k.state;u||v&&1==k.state||(u=!p(a,h,g));if(u)return w(),\ne;l&&J(a);h={structural:l,element:a,event:g,close:w,options:m,runner:e};if(v){if(b(\"skip\",a,h,k)){if(2===k.state)return w(),e;R(a,k.options,m);return k.runner}if(b(\"cancel\",a,h,k))if(2===k.state)k.runner.end();else if(k.structural)k.close();else return R(a,k.options,h.options),k.runner;else if(b(\"join\",a,h,k))if(2===k.state)R(a,m,{});else return Ka(a,l?g:null,m),g=h.event=k.event,m=R(a,k.options,h.options),k.runner}else R(a,m,{});(v=h.structural)||(v=\"animate\"===h.event&&0<Object.keys(h.options.to||\n{}).length||c(h.options));if(!v)return w(),f(a),e;var t=(k.counter||0)+1;h.counter=t;r(a,1,h);y.$$postDigest(function(){var b=A.get(B),h=!b,b=b||{},J=0<(a.parent()||[]).length&&(\"animate\"===b.event||b.structural||c(b.options));if(h||b.counter!==t||!J){h&&(Ea(a,m),ea(a,m));if(h||l&&b.event!==g)m.domOperation(),e.end();J||f(a)}else g=!b.structural&&c(b.options,!0)?\"setClass\":b.event,r(a,2),b=O(a,g,b.options),b.done(function(b){w(!b);(b=A.get(B))&&b.counter===t&&f(G(a));d(e,g,\"close\",{})}),e.setHost(b),\nd(e,g,\"start\",{})});return e}function J(a){a=G(a).querySelectorAll(\"[data-ng-animate]\");q(a,function(a){var b=parseInt(a.getAttribute(\"data-ng-animate\")),c=A.get(a);switch(b){case 2:c.runner.end();case 1:c&&A.remove(a)}})}function f(a){a=G(a);a.removeAttribute(\"data-ng-animate\");A.remove(a)}function B(a,b){return G(a)===G(b)}function p(a,b,c){c=B(a,l)||\"HTML\"===a[0].nodeName;var g=B(a,v),f=!1,d;for((a=a.data(\"$ngAnimatePin\"))&&(b=a);b&&b.length;){g||(g=B(b,v));a=b[0];if(1!==a.nodeType)break;var w=\nA.get(a)||{};f||(f=w.structural||U.get(a));if(pa(d)||!0===d)a=b.data(\"$$ngAnimateChildren\"),qa(a)&&(d=a);if(f&&!1===d)break;g||(g=B(b,v),g||(a=b.data(\"$ngAnimatePin\"))&&(b=a));c||(c=B(b,l));b=b.parent()}return(!f||d)&&g&&c}function r(a,b,c){c=c||{};c.state=b;a=G(a);a.setAttribute(\"data-ng-animate\",b);c=(b=A.get(a))?za(b,c):c;A.put(a,c)}var A=new s,U=new s,H=null,g=y.$watch(function(){return 0===t.totalPendingRequests},function(a){a&&(g(),y.$$postDigest(function(){y.$$postDigest(function(){null===\nH&&(H=!0)})}))}),w={},k=a.classNameFilter(),C=k?function(a){return k.test(a)}:function(){return!0},Ea=Q(la);return{on:function(a,b,c){b=Z(b);w[a]=w[a]||[];w[a].push({node:b,callback:c})},off:function(a,b,c){function g(a,b,c){var f=Z(b);return a.filter(function(a){return!(a.node===f&&(!c||a.callback===c))})}var f=w[a];f&&(w[a]=1===arguments.length?null:g(f,b,c))},pin:function(a,b){va(ra(a),\"element\",\"not an element\");va(ra(b),\"parentElement\",\"not an element\");a.data(\"$ngAnimatePin\",b)},push:function(a,\nb,c,g){c=c||{};c.domOperation=g;return u(a,b,c)},enabled:function(a,b){var c=arguments.length;if(0===c)b=!!H;else if(ra(a)){var g=G(a),f=U.get(g);1===c?b=!f:(b=!!b)?f&&U.remove(g):U.put(g,!0)}else b=H=!!a;return b}}}]}]).provider(\"$$animation\",[\"$animateProvider\",function(a){function b(a){return a.data(\"$$animationRunner\")}var c=this.drivers=[];this.$get=[\"$$jqLite\",\"$rootScope\",\"$injector\",\"$$AnimateRunner\",\"$$HashMap\",\"$$rAFScheduler\",function(a,e,y,v,z,l){function s(a){function b(a){if(a.processed)return a;\na.processed=!0;var f=a.domNode,d=f.parentNode;e.put(f,a);for(var h;d;){if(h=e.get(d)){h.processed||(h=b(h));break}d=d.parentNode}(h||c).children.push(a);return a}var c={children:[]},d,e=new z;for(d=0;d<a.length;d++){var l=a[d];e.put(l.domNode,a[d]={domNode:l.domNode,fn:l.fn,children:[]})}for(d=0;d<a.length;d++)b(a[d]);return function(a){var b=[],c=[],d;for(d=0;d<a.children.length;d++)c.push(a.children[d]);a=c.length;var h=0,e=[];for(d=0;d<c.length;d++){var l=c[d];0>=a&&(a=h,h=0,b.push(e),e=[]);e.push(l.fn);\nl.children.forEach(function(a){h++;c.push(a)});a--}e.length&&b.push(e);return b}(c)}var O=[],x=Q(a);return function(t,z,E){function h(a){a=a.hasAttribute(\"ng-animate-ref\")?[a]:a.querySelectorAll(\"[ng-animate-ref]\");var b=[];q(a,function(a){var c=a.getAttribute(\"ng-animate-ref\");c&&c.length&&b.push(a)});return b}function S(a){var b=[],c={};q(a,function(a,g){var d=G(a.element),f=0<=[\"enter\",\"move\"].indexOf(a.event),d=a.structural?h(d):[];if(d.length){var e=f?\"to\":\"from\";q(d,function(a){var b=a.getAttribute(\"ng-animate-ref\");\nc[b]=c[b]||{};c[b][e]={animationID:g,element:I(a)}})}else b.push(a)});var d={},f={};q(c,function(c,e){var h=c.from,r=c.to;if(h&&r){var J=a[h.animationID],k=a[r.animationID],B=h.animationID.toString();if(!f[B]){var l=f[B]={structural:!0,beforeStart:function(){J.beforeStart();k.beforeStart()},close:function(){J.close();k.close()},classes:u(J.classes,k.classes),from:J,to:k,anchors:[]};l.classes.length?b.push(l):(b.push(J),b.push(k))}f[B].anchors.push({out:h.element,\"in\":r.element})}else h=h?h.animationID:\nr.animationID,r=h.toString(),d[r]||(d[r]=!0,b.push(a[h]))});return b}function u(a,b){a=a.split(\" \");b=b.split(\" \");for(var c=[],d=0;d<a.length;d++){var f=a[d];if(\"ng-\"!==f.substring(0,3))for(var h=0;h<b.length;h++)if(f===b[h]){c.push(f);break}}return c.join(\" \")}function J(a){for(var b=c.length-1;0<=b;b--){var d=c[b];if(y.has(d)&&(d=y.get(d)(a)))return d}}function f(a,c){a.from&&a.to?(b(a.from.element).setHost(c),b(a.to.element).setHost(c)):b(a.element).setHost(c)}function B(){var a=b(t);!a||\"leave\"===\nz&&E.$$domOperationFired||a.end()}function p(b){t.off(\"$destroy\",B);t.removeData(\"$$animationRunner\");x(t,E);ea(t,E);E.domOperation();H&&a.removeClass(t,H);t.removeClass(\"ng-animate\");A.complete(!b)}E=ia(E);var r=0<=[\"enter\",\"move\",\"leave\"].indexOf(z),A=new v({end:function(){p()},cancel:function(){p(!0)}});if(!c.length)return p(),A;t.data(\"$$animationRunner\",A);var U=wa(t.attr(\"class\"),wa(E.addClass,E.removeClass)),H=E.tempClasses;H&&(U+=\" \"+H,E.tempClasses=null);O.push({element:t,classes:U,event:z,\nstructural:r,options:E,beforeStart:function(){t.addClass(\"ng-animate\");H&&a.addClass(t,H)},close:p});t.on(\"$destroy\",B);if(1<O.length)return A;e.$$postDigest(function(){var a=[];q(O,function(c){b(c.element)?a.push(c):c.close()});O.length=0;var c=S(a),d=[];q(c,function(a){d.push({domNode:G(a.from?a.from.element:a.element),fn:function(){a.beforeStart();var c,d=a.close;if(b(a.anchors?a.from.element||a.to.element:a.element)){var g=J(a);g&&(c=g.start)}c?(c=c(),c.done(function(a){d(!a)}),f(a,c)):d()}})});\nl(s(d))});return A}}]}]).provider(\"$animateCss\",[\"$animateProvider\",function(a){var b=Ca(),c=Ca();this.$get=[\"$window\",\"$$jqLite\",\"$$AnimateRunner\",\"$timeout\",\"$$forceReflow\",\"$sniffer\",\"$$rAFScheduler\",\"$animate\",function(a,e,y,v,z,l,s,O){function x(a,b){var c=a.parentNode;return(c.$$ngAnimateParentKey||(c.$$ngAnimateParentKey=++S))+\"-\"+a.getAttribute(\"class\")+\"-\"+b}function t(h,f,l,p){var r;0<b.count(l)&&(r=c.get(l),r||(f=V(f,\"-stagger\"),e.addClass(h,f),r=Aa(a,h,p),r.animationDuration=Math.max(r.animationDuration,\n0),r.transitionDuration=Math.max(r.transitionDuration,0),e.removeClass(h,f),c.put(l,r)));return r||{}}function la(a){u.push(a);s.waitUntilQuiet(function(){b.flush();c.flush();for(var a=z(),d=0;d<u.length;d++)u[d](a);u.length=0})}function E(c,f,h){f=b.get(h);f||(f=Aa(a,c,Ma),\"infinite\"===f.animationIterationCount&&(f.animationIterationCount=1));b.put(h,f);c=f;h=c.animationDelay;f=c.transitionDelay;c.maxDelay=h&&f?Math.max(h,f):h||f;c.maxDuration=Math.max(c.animationDuration*c.animationIterationCount,\nc.transitionDuration);return c}var h=Q(e),S=0,u=[];return function(a,c){function d(){r()}function p(){r(!0)}function r(b){if(!(s||S&&z)){s=!0;z=!1;c.$$skipPreparationClasses||e.removeClass(a,aa);e.removeClass(a,$);ma(g,!1);ja(g,!1);q(w,function(a){g.style[a[0]]=\"\"});h(a,c);ea(a,c);if(c.onDone)c.onDone();m&&m.complete(!b)}}function A(a){n.blockTransition&&ja(g,a);n.blockKeyframeAnimation&&ma(g,!!a)}function u(){m=new y({end:d,cancel:p});la(L);r();return{$$willAnimate:!1,start:function(){return m},\nend:d}}function H(){function b(){if(!s){A(!1);q(w,function(a){g.style[a[0]]=a[1]});h(a,c);e.addClass(a,$);if(n.recalculateTimingStyles){ha=g.className+\" \"+aa;ba=x(g,ha);D=E(g,ha,ba);X=D.maxDelay;I=Math.max(X,0);K=D.maxDuration;if(0===K){r();return}n.hasTransitions=0<D.transitionDuration;n.hasAnimations=0<D.animationDuration}n.applyAnimationDelay&&(X=\"boolean\"!==typeof c.delay&&na(c.delay)?parseFloat(c.delay):X,I=Math.max(X,0),D.animationDelay=X,da=[ka,X+\"s\"],w.push(da),g.style[da[0]]=da[1]);M=1E3*\nI;Q=1E3*K;if(c.easing){var k,p=c.easing;n.hasTransitions&&(k=N+\"TimingFunction\",w.push([k,p]),g.style[k]=p);n.hasAnimations&&(k=W+\"TimingFunction\",w.push([k,p]),g.style[k]=p)}D.transitionDuration&&m.push(sa);D.animationDuration&&m.push(ta);H=Date.now();var u=M+1.5*Q;k=H+u;var p=a.data(\"$$animateCss\")||[],z=!0;if(p.length){var C=p[0];(z=k>C.expectedEndTime)?v.cancel(C.timer):p.push(r)}z&&(u=v(d,u,!1),p[0]={timer:u,expectedEndTime:k},p.push(r),a.data(\"$$animateCss\",p));a.on(m.join(\" \"),l);ya(a,c)}}\nfunction d(){var b=a.data(\"$$animateCss\");if(b){for(var c=1;c<b.length;c++)b[c]();a.removeData(\"$$animateCss\")}}function l(a){a.stopPropagation();var b=a.originalEvent||a;a=b.$manualTimeStamp||b.timeStamp||Date.now();b=parseFloat(b.elapsedTime.toFixed(3));Math.max(a-H,0)>=M&&b>=K&&(S=!0,r())}if(!s)if(g.parentNode){var H,m=[],k=function(a){if(S)z&&a&&(z=!1,r());else if(z=!a,D.animationDuration)if(a=ma(g,z),z)w.push(a);else{var b=w,c=b.indexOf(a);0<=a&&b.splice(c,1)}},p=0<Z&&(D.transitionDuration&&\n0===T.transitionDuration||D.animationDuration&&0===T.animationDuration)&&Math.max(T.animationDelay,T.transitionDelay);p?v(b,Math.floor(p*Z*1E3),!1):b();F.resume=function(){k(!0)};F.pause=function(){k(!1)}}else r()}var g=G(a);if(!g||!g.parentNode||!O.enabled())return u();c=ia(c);var w=[],k=a.attr(\"class\"),C=Fa(c),s,z,S,m,F,I,M,K,Q;if(0===c.duration||!l.animations&&!l.transitions)return u();var ca=c.event&&Y(c.event)?c.event.join(\" \"):c.event,R=\"\",P=\"\";ca&&c.structural?R=V(ca,\"ng-\",!0):ca&&(R=ca);c.addClass&&\n(P+=V(c.addClass,\"-add\"));c.removeClass&&(P.length&&(P+=\" \"),P+=V(c.removeClass,\"-remove\"));c.applyClassesEarly&&P.length&&h(a,c);var aa=[R,P].join(\" \").trim(),ha=k+\" \"+aa,$=V(aa,\"-active\"),k=C.to&&0<Object.keys(C.to).length;if(!(0<(c.keyframeStyle||\"\").length||k||aa))return u();var ba,T;0<c.stagger?(C=parseFloat(c.stagger),T={transitionDelay:C,animationDelay:C,transitionDuration:0,animationDuration:0}):(ba=x(g,ha),T=t(g,aa,ba,Na));c.$$skipPreparationClasses||e.addClass(a,aa);c.transitionStyle&&(C=\n[N,c.transitionStyle],fa(g,C),w.push(C));0<=c.duration&&(C=0<g.style[N].length,C=Ba(c.duration,C),fa(g,C),w.push(C));c.keyframeStyle&&(C=[W,c.keyframeStyle],fa(g,C),w.push(C));var Z=T?0<=c.staggerIndex?c.staggerIndex:b.count(ba):0;(ca=0===Z)&&!c.skipBlocking&&ja(g,9999);var D=E(g,ha,ba),X=D.maxDelay;I=Math.max(X,0);K=D.maxDuration;var n={};n.hasTransitions=0<D.transitionDuration;n.hasAnimations=0<D.animationDuration;n.hasTransitionAll=n.hasTransitions&&\"all\"==D.transitionProperty;n.applyTransitionDuration=\nk&&(n.hasTransitions&&!n.hasTransitionAll||n.hasAnimations&&!n.hasTransitions);n.applyAnimationDuration=c.duration&&n.hasAnimations;n.applyTransitionDelay=na(c.delay)&&(n.applyTransitionDuration||n.hasTransitions);n.applyAnimationDelay=na(c.delay)&&n.hasAnimations;n.recalculateTimingStyles=0<P.length;if(n.applyTransitionDuration||n.applyAnimationDuration)K=c.duration?parseFloat(c.duration):K,n.applyTransitionDuration&&(n.hasTransitions=!0,D.transitionDuration=K,C=0<g.style[N+\"Property\"].length,w.push(Ba(K,\nC))),n.applyAnimationDuration&&(n.hasAnimations=!0,D.animationDuration=K,w.push([ua,K+\"s\"]));if(0===K&&!n.recalculateTimingStyles)return u();if(null!=c.delay){var da=parseFloat(c.delay);n.applyTransitionDelay&&w.push([ga,da+\"s\"]);n.applyAnimationDelay&&w.push([ka,da+\"s\"])}null==c.duration&&0<D.transitionDuration&&(n.recalculateTimingStyles=n.recalculateTimingStyles||ca);M=1E3*I;Q=1E3*K;c.skipBlocking||(n.blockTransition=0<D.transitionDuration,n.blockKeyframeAnimation=0<D.animationDuration&&0<T.animationDelay&&\n0===T.animationDuration);xa(a,c);n.blockTransition||n.blockKeyframeAnimation?A(K):c.skipBlocking||ja(g,!1);return{$$willAnimate:!0,end:d,start:function(){if(!s)return F={end:d,cancel:p,resume:null,pause:null},m=new y(F),la(H),m}}}}]}]).provider(\"$$animateCssDriver\",[\"$$animationProvider\",function(a){a.drivers.push(\"$$animateCssDriver\");this.$get=[\"$animateCss\",\"$rootScope\",\"$$AnimateRunner\",\"$rootElement\",\"$$body\",\"$sniffer\",\"$$jqLite\",function(a,c,d,e,y,v,z){function l(a){return a.replace(/\\bng-\\S+\\b/g,\n\"\")}function s(a,b){M(a)&&(a=a.split(\" \"));M(b)&&(b=b.split(\" \"));return a.filter(function(a){return-1===b.indexOf(a)}).join(\" \")}function O(c,e,u){function v(a){var b={},c=G(a).getBoundingClientRect();q([\"width\",\"height\",\"top\",\"left\"],function(a){var d=c[a];switch(a){case \"top\":d+=F.scrollTop;break;case \"left\":d+=F.scrollLeft}b[a]=Math.floor(d)+\"px\"});return b}function f(){var c=l(u.attr(\"class\")||\"\"),d=s(c,r),c=s(r,c),d=a(p,{to:v(u),addClass:\"ng-anchor-in \"+d,removeClass:\"ng-anchor-out \"+c,delay:!0});\nreturn d.$$willAnimate?d:null}function z(){p.remove();e.removeClass(\"ng-animate-shim\");u.removeClass(\"ng-animate-shim\")}var p=I(G(e).cloneNode(!0)),r=l(p.attr(\"class\")||\"\");e.addClass(\"ng-animate-shim\");u.addClass(\"ng-animate-shim\");p.addClass(\"ng-anchor\");E.append(p);var A;c=function(){var c=a(p,{addClass:\"ng-anchor-out\",delay:!0,from:v(e)});return c.$$willAnimate?c:null}();if(!c&&(A=f(),!A))return z();var t=c||A;return{start:function(){function a(){c&&c.end()}var b,c=t.start();c.done(function(){c=\nnull;if(!A&&(A=f()))return c=A.start(),c.done(function(){c=null;z();b.complete()}),c;z();b.complete()});return b=new d({end:a,cancel:a})}}}function x(a,b,c,e){var f=t(a,L),l=t(b,L),p=[];q(e,function(a){(a=O(c,a.out,a[\"in\"]))&&p.push(a)});if(f||l||0!==p.length)return{start:function(){function a(){q(b,function(a){a.end()})}var b=[];f&&b.push(f.start());l&&b.push(l.start());q(p,function(a){b.push(a.start())});var c=new d({end:a,cancel:a});d.all(b,function(a){c.complete(a)});return c}}}function t(c){var d=\nc.element,e=c.options||{};c.structural&&(e.event=c.event,e.structural=!0,e.applyClassesEarly=!0,\"leave\"===c.event&&(e.onDone=e.domOperation));e.preparationClasses&&(e.event=$(e.event,e.preparationClasses));c=a(d,e);return c.$$willAnimate?c:null}if(!v.animations&&!v.transitions)return L;var F=G(y);c=G(e);var E=I(F.parentNode===c?F:c);Q(z);return function(a){return a.from&&a.to?x(a.from,a.to,a.classes,a.anchors):t(a)}}]}]).provider(\"$$animateJs\",[\"$animateProvider\",function(a){this.$get=[\"$injector\",\n\"$$AnimateRunner\",\"$$jqLite\",function(b,c,d){function e(c){c=Y(c)?c:c.split(\" \");for(var d=[],e={},s=0;s<c.length;s++){var q=c[s],y=a.$$registeredAnimations[q];y&&!e[q]&&(d.push(b.get(y)),e[q]=!0)}return d}var y=Q(d);return function(a,b,d,s){function x(){s.domOperation();y(a,s)}function F(a,b,d,e,f){switch(d){case \"animate\":b=[b,e.from,e.to,f];break;case \"setClass\":b=[b,E,h,f];break;case \"addClass\":b=[b,E,f];break;case \"removeClass\":b=[b,h,f];break;default:b=[b,f]}b.push(e);if(a=a.apply(a,b))if(Da(a.start)&&\n(a=a.start()),a instanceof c)a.done(f);else if(Da(a))return a;return L}function t(a,b,d,e,f){var g=[];q(e,function(e){var h=e[f];h&&g.push(function(){var e,g,f=!1,l=function(a){f||(f=!0,(g||L)(a),e.complete(!a))};e=new c({end:function(){l()},cancel:function(){l(!0)}});g=F(h,a,b,d,function(a){l(!1===a)});return e})});return g}function G(a,b,d,e,f){var g=t(a,b,d,e,f);if(0===g.length){var h,k;\"beforeSetClass\"===f?(h=t(a,\"removeClass\",d,e,\"beforeRemoveClass\"),k=t(a,\"addClass\",d,e,\"beforeAddClass\")):\"setClass\"===\nf&&(h=t(a,\"removeClass\",d,e,\"removeClass\"),k=t(a,\"addClass\",d,e,\"addClass\"));h&&(g=g.concat(h));k&&(g=g.concat(k))}if(0!==g.length)return function(a){var b=[];g.length&&q(g,function(a){b.push(a())});b.length?c.all(b,a):a();return function(a){q(b,function(b){a?b.cancel():b.end()})}}}3===arguments.length&&oa(d)&&(s=d,d=null);s=ia(s);d||(d=a.attr(\"class\")||\"\",s.addClass&&(d+=\" \"+s.addClass),s.removeClass&&(d+=\" \"+s.removeClass));var E=s.addClass,h=s.removeClass,I=e(d),u,J;if(I.length){var f,B;\"leave\"==\nb?(B=\"leave\",f=\"afterLeave\"):(B=\"before\"+b.charAt(0).toUpperCase()+b.substr(1),f=b);\"enter\"!==b&&\"move\"!==b&&(u=G(a,b,s,I,B));J=G(a,b,s,I,f)}if(u||J)return{start:function(){function b(c){f=!0;x();ea(a,s);h.complete(c)}var d,e=[];u&&e.push(function(a){d=u(a)});e.length?e.push(function(a){x();a(!0)}):x();J&&e.push(function(a){d=J(a)});var f=!1,h=new c({end:function(){f||((d||L)(void 0),b(void 0))},cancel:function(){f||((d||L)(!0),b(!0))}});c.chain(e,b);return h}}}}]}]).provider(\"$$animateJsDriver\",\n[\"$$animationProvider\",function(a){a.drivers.push(\"$$animateJsDriver\");this.$get=[\"$$animateJs\",\"$$AnimateRunner\",function(a,c){function d(c){return a(c.element,c.event,c.classes,c.options)}return function(a){if(a.from&&a.to){var b=d(a.from),v=d(a.to);if(b||v)return{start:function(){function a(){return function(){q(d,function(a){a.end()})}}var d=[];b&&d.push(b.start());v&&d.push(v.start());c.all(d,function(a){e.complete(a)});var e=new c({end:a(),cancel:a()});return e}}}else return d(a)}}]}])})(window,\nwindow.angular);\n//# sourceMappingURL=angular-animate.min.js.map\n\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzYuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ib3dlcl9jb21wb25lbnRzL2FuZ3VsYXItYW5pbWF0ZS9hbmd1bGFyLWFuaW1hdGUubWluLmpzP2Y0YzkiXSwic291cmNlc0NvbnRlbnQiOlsiLypcbiBBbmd1bGFySlMgdjEuNC42XG4gKGMpIDIwMTAtMjAxNSBHb29nbGUsIEluYy4gaHR0cDovL2FuZ3VsYXJqcy5vcmdcbiBMaWNlbnNlOiBNSVRcbiovXG4oZnVuY3Rpb24oRix4LE9hKXsndXNlIHN0cmljdCc7ZnVuY3Rpb24gdmEoYSxiLGMpe2lmKCFhKXRocm93IG5nTWluRXJyKFwiYXJlcVwiLGJ8fFwiP1wiLGN8fFwicmVxdWlyZWRcIik7cmV0dXJuIGF9ZnVuY3Rpb24gd2EoYSxiKXtpZighYSYmIWIpcmV0dXJuXCJcIjtpZighYSlyZXR1cm4gYjtpZighYilyZXR1cm4gYTtZKGEpJiYoYT1hLmpvaW4oXCIgXCIpKTtZKGIpJiYoYj1iLmpvaW4oXCIgXCIpKTtyZXR1cm4gYStcIiBcIitifWZ1bmN0aW9uIEZhKGEpe3ZhciBiPXt9O2EmJihhLnRvfHxhLmZyb20pJiYoYi50bz1hLnRvLGIuZnJvbT1hLmZyb20pO3JldHVybiBifWZ1bmN0aW9uIFYoYSxiLGMpe3ZhciBkPVwiXCI7YT1ZKGEpP2E6YSYmTShhKSYmYS5sZW5ndGg/YS5zcGxpdCgvXFxzKy8pOltdO3EoYSxmdW5jdGlvbihhLHkpe2EmJjA8YS5sZW5ndGgmJihkKz0wPHk/XCIgXCI6XCJcIixkKz1jP2IrYTphK2IpfSk7cmV0dXJuIGR9ZnVuY3Rpb24gR2EoYSl7aWYoYSBpbnN0YW5jZW9mIEkpc3dpdGNoKGEubGVuZ3RoKXtjYXNlIDA6cmV0dXJuW107XG5jYXNlIDE6aWYoMT09PWFbMF0ubm9kZVR5cGUpcmV0dXJuIGE7YnJlYWs7ZGVmYXVsdDpyZXR1cm4gSShaKGEpKX1pZigxPT09YS5ub2RlVHlwZSlyZXR1cm4gSShhKX1mdW5jdGlvbiBaKGEpe2lmKCFhWzBdKXJldHVybiBhO2Zvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKXt2YXIgYz1hW2JdO2lmKDE9PWMubm9kZVR5cGUpcmV0dXJuIGN9fWZ1bmN0aW9uIEhhKGEsYixjKXtxKGIsZnVuY3Rpb24oYil7YS5hZGRDbGFzcyhiLGMpfSl9ZnVuY3Rpb24gSWEoYSxiLGMpe3EoYixmdW5jdGlvbihiKXthLnJlbW92ZUNsYXNzKGIsYyl9KX1mdW5jdGlvbiBRKGEpe3JldHVybiBmdW5jdGlvbihiLGMpe2MuYWRkQ2xhc3MmJihIYShhLGIsYy5hZGRDbGFzcyksYy5hZGRDbGFzcz1udWxsKTtjLnJlbW92ZUNsYXNzJiYoSWEoYSxiLGMucmVtb3ZlQ2xhc3MpLGMucmVtb3ZlQ2xhc3M9bnVsbCl9fWZ1bmN0aW9uIGlhKGEpe2E9YXx8e307aWYoIWEuJCRwcmVwYXJlZCl7dmFyIGI9YS5kb21PcGVyYXRpb258fFxuTDthLmRvbU9wZXJhdGlvbj1mdW5jdGlvbigpe2EuJCRkb21PcGVyYXRpb25GaXJlZD0hMDtiKCk7Yj1MfTthLiQkcHJlcGFyZWQ9ITB9cmV0dXJuIGF9ZnVuY3Rpb24gZWEoYSxiKXt4YShhLGIpO3lhKGEsYil9ZnVuY3Rpb24geGEoYSxiKXtiLmZyb20mJihhLmNzcyhiLmZyb20pLGIuZnJvbT1udWxsKX1mdW5jdGlvbiB5YShhLGIpe2IudG8mJihhLmNzcyhiLnRvKSxiLnRvPW51bGwpfWZ1bmN0aW9uIFIoYSxiLGMpe3ZhciBkPShiLmFkZENsYXNzfHxcIlwiKStcIiBcIisoYy5hZGRDbGFzc3x8XCJcIiksZT0oYi5yZW1vdmVDbGFzc3x8XCJcIikrXCIgXCIrKGMucmVtb3ZlQ2xhc3N8fFwiXCIpO2E9SmEoYS5hdHRyKFwiY2xhc3NcIiksZCxlKTtjLnByZXBhcmF0aW9uQ2xhc3NlcyYmKGIucHJlcGFyYXRpb25DbGFzc2VzPSQoYy5wcmVwYXJhdGlvbkNsYXNzZXMsYi5wcmVwYXJhdGlvbkNsYXNzZXMpLGRlbGV0ZSBjLnByZXBhcmF0aW9uQ2xhc3Nlcyk7ZD1iLmRvbU9wZXJhdGlvbiE9PUw/Yi5kb21PcGVyYXRpb246XG5udWxsO3phKGIsYyk7ZCYmKGIuZG9tT3BlcmF0aW9uPWQpO2IuYWRkQ2xhc3M9YS5hZGRDbGFzcz9hLmFkZENsYXNzOm51bGw7Yi5yZW1vdmVDbGFzcz1hLnJlbW92ZUNsYXNzP2EucmVtb3ZlQ2xhc3M6bnVsbDtyZXR1cm4gYn1mdW5jdGlvbiBKYShhLGIsYyl7ZnVuY3Rpb24gZChhKXtNKGEpJiYoYT1hLnNwbGl0KFwiIFwiKSk7dmFyIGI9e307cShhLGZ1bmN0aW9uKGEpe2EubGVuZ3RoJiYoYlthXT0hMCl9KTtyZXR1cm4gYn12YXIgZT17fTthPWQoYSk7Yj1kKGIpO3EoYixmdW5jdGlvbihhLGIpe2VbYl09MX0pO2M9ZChjKTtxKGMsZnVuY3Rpb24oYSxiKXtlW2JdPTE9PT1lW2JdP251bGw6LTF9KTt2YXIgeT17YWRkQ2xhc3M6XCJcIixyZW1vdmVDbGFzczpcIlwifTtxKGUsZnVuY3Rpb24oYixjKXt2YXIgZSxkOzE9PT1iPyhlPVwiYWRkQ2xhc3NcIixkPSFhW2NdKTotMT09PWImJihlPVwicmVtb3ZlQ2xhc3NcIixkPWFbY10pO2QmJih5W2VdLmxlbmd0aCYmKHlbZV0rPVwiIFwiKSx5W2VdKz1jKX0pO1xucmV0dXJuIHl9ZnVuY3Rpb24gRyhhKXtyZXR1cm4gYSBpbnN0YW5jZW9mIHguZWxlbWVudD9hWzBdOmF9ZnVuY3Rpb24gS2EoYSxiLGMpe3ZhciBkPVwiXCI7YiYmKGQ9VihiLFwibmctXCIsITApKTtjLmFkZENsYXNzJiYoZD0kKGQsVihjLmFkZENsYXNzLFwiLWFkZFwiKSkpO2MucmVtb3ZlQ2xhc3MmJihkPSQoZCxWKGMucmVtb3ZlQ2xhc3MsXCItcmVtb3ZlXCIpKSk7ZC5sZW5ndGgmJihjLnByZXBhcmF0aW9uQ2xhc3Nlcz1kLGEuYWRkQ2xhc3MoZCkpfWZ1bmN0aW9uIGphKGEsYil7dmFyIGM9Yj9cIi1cIitiK1wic1wiOlwiXCI7ZmEoYSxbZ2EsY10pO3JldHVybltnYSxjXX1mdW5jdGlvbiBtYShhLGIpe3ZhciBjPWI/XCJwYXVzZWRcIjpcIlwiLGQ9VytcIlBsYXlTdGF0ZVwiO2ZhKGEsW2QsY10pO3JldHVybltkLGNdfWZ1bmN0aW9uIGZhKGEsYil7YS5zdHlsZVtiWzBdXT1iWzFdfWZ1bmN0aW9uICQoYSxiKXtyZXR1cm4gYT9iP2ErXCIgXCIrYjphOmJ9ZnVuY3Rpb24gQWEoYSxiLGMpe3ZhciBkPU9iamVjdC5jcmVhdGUobnVsbCksXG5lPWEuZ2V0Q29tcHV0ZWRTdHlsZShiKXx8e307cShjLGZ1bmN0aW9uKGEsYil7dmFyIGM9ZVthXTtpZihjKXt2YXIgbD1jLmNoYXJBdCgwKTtpZihcIi1cIj09PWx8fFwiK1wiPT09bHx8MDw9bCljPUxhKGMpOzA9PT1jJiYoYz1udWxsKTtkW2JdPWN9fSk7cmV0dXJuIGR9ZnVuY3Rpb24gTGEoYSl7dmFyIGI9MDthPWEuc3BsaXQoL1xccyosXFxzKi8pO3EoYSxmdW5jdGlvbihhKXtcInNcIj09YS5jaGFyQXQoYS5sZW5ndGgtMSkmJihhPWEuc3Vic3RyaW5nKDAsYS5sZW5ndGgtMSkpO2E9cGFyc2VGbG9hdChhKXx8MDtiPWI/TWF0aC5tYXgoYSxiKTphfSk7cmV0dXJuIGJ9ZnVuY3Rpb24gbmEoYSl7cmV0dXJuIDA9PT1hfHxudWxsIT1hfWZ1bmN0aW9uIEJhKGEsYil7dmFyIGM9TixkPWErXCJzXCI7Yj9jKz1cIkR1cmF0aW9uXCI6ZCs9XCIgbGluZWFyIGFsbFwiO3JldHVybltjLGRdfWZ1bmN0aW9uIENhKCl7dmFyIGE9T2JqZWN0LmNyZWF0ZShudWxsKTtyZXR1cm57Zmx1c2g6ZnVuY3Rpb24oKXthPU9iamVjdC5jcmVhdGUobnVsbCl9LFxuY291bnQ6ZnVuY3Rpb24oYil7cmV0dXJuKGI9YVtiXSk/Yi50b3RhbDowfSxnZXQ6ZnVuY3Rpb24oYil7cmV0dXJuKGI9YVtiXSkmJmIudmFsdWV9LHB1dDpmdW5jdGlvbihiLGMpe2FbYl0/YVtiXS50b3RhbCsrOmFbYl09e3RvdGFsOjEsdmFsdWU6Y319fX12YXIgTD14Lm5vb3AsemE9eC5leHRlbmQsST14LmVsZW1lbnQscT14LmZvckVhY2gsWT14LmlzQXJyYXksTT14LmlzU3RyaW5nLG9hPXguaXNPYmplY3QscGE9eC5pc1VuZGVmaW5lZCxxYT14LmlzRGVmaW5lZCxEYT14LmlzRnVuY3Rpb24scmE9eC5pc0VsZW1lbnQsTixzYSxXLHRhO3BhKEYub250cmFuc2l0aW9uZW5kKSYmcWEoRi5vbndlYmtpdHRyYW5zaXRpb25lbmQpPyhOPVwiV2Via2l0VHJhbnNpdGlvblwiLHNhPVwid2Via2l0VHJhbnNpdGlvbkVuZCB0cmFuc2l0aW9uZW5kXCIpOihOPVwidHJhbnNpdGlvblwiLHNhPVwidHJhbnNpdGlvbmVuZFwiKTtwYShGLm9uYW5pbWF0aW9uZW5kKSYmcWEoRi5vbndlYmtpdGFuaW1hdGlvbmVuZCk/XG4oVz1cIldlYmtpdEFuaW1hdGlvblwiLHRhPVwid2Via2l0QW5pbWF0aW9uRW5kIGFuaW1hdGlvbmVuZFwiKTooVz1cImFuaW1hdGlvblwiLHRhPVwiYW5pbWF0aW9uZW5kXCIpO3ZhciBrYT1XK1wiRGVsYXlcIix1YT1XK1wiRHVyYXRpb25cIixnYT1OK1wiRGVsYXlcIjtGPU4rXCJEdXJhdGlvblwiO3ZhciBNYT17dHJhbnNpdGlvbkR1cmF0aW9uOkYsdHJhbnNpdGlvbkRlbGF5OmdhLHRyYW5zaXRpb25Qcm9wZXJ0eTpOK1wiUHJvcGVydHlcIixhbmltYXRpb25EdXJhdGlvbjp1YSxhbmltYXRpb25EZWxheTprYSxhbmltYXRpb25JdGVyYXRpb25Db3VudDpXK1wiSXRlcmF0aW9uQ291bnRcIn0sTmE9e3RyYW5zaXRpb25EdXJhdGlvbjpGLHRyYW5zaXRpb25EZWxheTpnYSxhbmltYXRpb25EdXJhdGlvbjp1YSxhbmltYXRpb25EZWxheTprYX07eC5tb2R1bGUoXCJuZ0FuaW1hdGVcIixbXSkucHJvdmlkZXIoXCIkJGJvZHlcIixmdW5jdGlvbigpe3RoaXMuJGdldD1bXCIkZG9jdW1lbnRcIixmdW5jdGlvbihhKXtyZXR1cm4gSShhWzBdLmJvZHkpfV19KS5kaXJlY3RpdmUoXCJuZ0FuaW1hdGVDaGlsZHJlblwiLFxuW2Z1bmN0aW9uKCl7cmV0dXJuIGZ1bmN0aW9uKGEsYixjKXthPWMubmdBbmltYXRlQ2hpbGRyZW47eC5pc1N0cmluZyhhKSYmMD09PWEubGVuZ3RoP2IuZGF0YShcIiQkbmdBbmltYXRlQ2hpbGRyZW5cIiwhMCk6Yy4kb2JzZXJ2ZShcIm5nQW5pbWF0ZUNoaWxkcmVuXCIsZnVuY3Rpb24oYSl7Yi5kYXRhKFwiJCRuZ0FuaW1hdGVDaGlsZHJlblwiLFwib25cIj09PWF8fFwidHJ1ZVwiPT09YSl9KX19XSkuZmFjdG9yeShcIiQkckFGU2NoZWR1bGVyXCIsW1wiJCRyQUZcIixmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEpe2Q9ZC5jb25jYXQoYSk7YygpfWZ1bmN0aW9uIGMoKXtpZihkLmxlbmd0aCl7Zm9yKHZhciBiPWQuc2hpZnQoKSx2PTA7djxiLmxlbmd0aDt2KyspYlt2XSgpO2V8fGEoZnVuY3Rpb24oKXtlfHxjKCl9KX19dmFyIGQsZTtkPWIucXVldWU9W107Yi53YWl0VW50aWxRdWlldD1mdW5jdGlvbihiKXtlJiZlKCk7ZT1hKGZ1bmN0aW9uKCl7ZT1udWxsO2IoKTtjKCl9KX07cmV0dXJuIGJ9XSkuZmFjdG9yeShcIiQkQW5pbWF0ZVJ1bm5lclwiLFxuW1wiJHFcIixcIiRzbmlmZmVyXCIsXCIkJGFuaW1hdGVBc3luY1J1blwiLGZ1bmN0aW9uKGEsYixjKXtmdW5jdGlvbiBkKGEpe3RoaXMuc2V0SG9zdChhKTt0aGlzLl9kb25lQ2FsbGJhY2tzPVtdO3RoaXMuX3J1bkluQW5pbWF0aW9uRnJhbWU9YygpO3RoaXMuX3N0YXRlPTB9ZC5jaGFpbj1mdW5jdGlvbihhLGIpe2Z1bmN0aW9uIGMoKXtpZihkPT09YS5sZW5ndGgpYighMCk7ZWxzZSBhW2RdKGZ1bmN0aW9uKGEpeyExPT09YT9iKCExKTooZCsrLGMoKSl9KX12YXIgZD0wO2MoKX07ZC5hbGw9ZnVuY3Rpb24oYSxiKXtmdW5jdGlvbiBjKHYpe2w9bCYmdjsrK2Q9PT1hLmxlbmd0aCYmYihsKX12YXIgZD0wLGw9ITA7cShhLGZ1bmN0aW9uKGEpe2EuZG9uZShjKX0pfTtkLnByb3RvdHlwZT17c2V0SG9zdDpmdW5jdGlvbihhKXt0aGlzLmhvc3Q9YXx8e319LGRvbmU6ZnVuY3Rpb24oYSl7Mj09PXRoaXMuX3N0YXRlP2EoKTp0aGlzLl9kb25lQ2FsbGJhY2tzLnB1c2goYSl9LHByb2dyZXNzOkwsZ2V0UHJvbWlzZTpmdW5jdGlvbigpe2lmKCF0aGlzLnByb21pc2Upe3ZhciBiPVxudGhpczt0aGlzLnByb21pc2U9YShmdW5jdGlvbihhLGMpe2IuZG9uZShmdW5jdGlvbihiKXshMT09PWI/YygpOmEoKX0pfSl9cmV0dXJuIHRoaXMucHJvbWlzZX0sdGhlbjpmdW5jdGlvbihhLGIpe3JldHVybiB0aGlzLmdldFByb21pc2UoKS50aGVuKGEsYil9LFwiY2F0Y2hcIjpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5nZXRQcm9taXNlKClbXCJjYXRjaFwiXShhKX0sXCJmaW5hbGx5XCI6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuZ2V0UHJvbWlzZSgpW1wiZmluYWxseVwiXShhKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmhvc3QucGF1c2UmJnRoaXMuaG9zdC5wYXVzZSgpfSxyZXN1bWU6ZnVuY3Rpb24oKXt0aGlzLmhvc3QucmVzdW1lJiZ0aGlzLmhvc3QucmVzdW1lKCl9LGVuZDpmdW5jdGlvbigpe3RoaXMuaG9zdC5lbmQmJnRoaXMuaG9zdC5lbmQoKTt0aGlzLl9yZXNvbHZlKCEwKX0sY2FuY2VsOmZ1bmN0aW9uKCl7dGhpcy5ob3N0LmNhbmNlbCYmdGhpcy5ob3N0LmNhbmNlbCgpO3RoaXMuX3Jlc29sdmUoITEpfSxcbmNvbXBsZXRlOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXM7MD09PWIuX3N0YXRlJiYoYi5fc3RhdGU9MSxiLl9ydW5JbkFuaW1hdGlvbkZyYW1lKGZ1bmN0aW9uKCl7Yi5fcmVzb2x2ZShhKX0pKX0sX3Jlc29sdmU6ZnVuY3Rpb24oYSl7MiE9PXRoaXMuX3N0YXRlJiYocSh0aGlzLl9kb25lQ2FsbGJhY2tzLGZ1bmN0aW9uKGIpe2IoYSl9KSx0aGlzLl9kb25lQ2FsbGJhY2tzLmxlbmd0aD0wLHRoaXMuX3N0YXRlPTIpfX07cmV0dXJuIGR9XSkuZmFjdG9yeShcIiQkYW5pbWF0ZUFzeW5jUnVuXCIsW1wiJCRyQUZcIixmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGIpe2MucHVzaChiKTsxPGMubGVuZ3RofHxhKGZ1bmN0aW9uKCl7Zm9yKHZhciBhPTA7YTxjLmxlbmd0aDthKyspY1thXSgpO2M9W119KX12YXIgYz1bXTtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgYT0hMTtiKGZ1bmN0aW9uKCl7YT0hMH0pO3JldHVybiBmdW5jdGlvbihjKXthP2MoKTpiKGMpfX19XSkucHJvdmlkZXIoXCIkJGFuaW1hdGVRdWV1ZVwiLFxuW1wiJGFuaW1hdGVQcm92aWRlclwiLGZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYSxiLGMscSl7cmV0dXJuIGRbYV0uc29tZShmdW5jdGlvbihhKXtyZXR1cm4gYShiLGMscSl9KX1mdW5jdGlvbiBjKGEsYil7YT1hfHx7fTt2YXIgYz0wPChhLmFkZENsYXNzfHxcIlwiKS5sZW5ndGgsZD0wPChhLnJlbW92ZUNsYXNzfHxcIlwiKS5sZW5ndGg7cmV0dXJuIGI/YyYmZDpjfHxkfXZhciBkPXRoaXMucnVsZXM9e3NraXA6W10sY2FuY2VsOltdLGpvaW46W119O2Quam9pbi5wdXNoKGZ1bmN0aW9uKGEsYixkKXtyZXR1cm4hYi5zdHJ1Y3R1cmFsJiZjKGIub3B0aW9ucyl9KTtkLnNraXAucHVzaChmdW5jdGlvbihhLGIsZCl7cmV0dXJuIWIuc3RydWN0dXJhbCYmIWMoYi5vcHRpb25zKX0pO2Quc2tpcC5wdXNoKGZ1bmN0aW9uKGEsYixjKXtyZXR1cm5cImxlYXZlXCI9PWMuZXZlbnQmJmIuc3RydWN0dXJhbH0pO2Quc2tpcC5wdXNoKGZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gYy5zdHJ1Y3R1cmFsJiYyPT09Yy5zdGF0ZSYmXG4hYi5zdHJ1Y3R1cmFsfSk7ZC5jYW5jZWwucHVzaChmdW5jdGlvbihhLGIsYyl7cmV0dXJuIGMuc3RydWN0dXJhbCYmYi5zdHJ1Y3R1cmFsfSk7ZC5jYW5jZWwucHVzaChmdW5jdGlvbihhLGIsYyl7cmV0dXJuIDI9PT1jLnN0YXRlJiZiLnN0cnVjdHVyYWx9KTtkLmNhbmNlbC5wdXNoKGZ1bmN0aW9uKGEsYixjKXthPWIub3B0aW9ucztjPWMub3B0aW9ucztyZXR1cm4gYS5hZGRDbGFzcyYmYS5hZGRDbGFzcz09PWMucmVtb3ZlQ2xhc3N8fGEucmVtb3ZlQ2xhc3MmJmEucmVtb3ZlQ2xhc3M9PT1jLmFkZENsYXNzfSk7dGhpcy4kZ2V0PVtcIiQkckFGXCIsXCIkcm9vdFNjb3BlXCIsXCIkcm9vdEVsZW1lbnRcIixcIiRkb2N1bWVudFwiLFwiJCRib2R5XCIsXCIkJEhhc2hNYXBcIixcIiQkYW5pbWF0aW9uXCIsXCIkJEFuaW1hdGVSdW5uZXJcIixcIiR0ZW1wbGF0ZVJlcXVlc3RcIixcIiQkanFMaXRlXCIsXCIkJGZvcmNlUmVmbG93XCIsZnVuY3Rpb24oZCx5LHYseixsLHMsTyx4LHQsbGEsRSl7ZnVuY3Rpb24gaChhLGIpe3ZhciBjPVxuRyhhKSxmPVtdLGc9d1tiXTtnJiZxKGcsZnVuY3Rpb24oYSl7YS5ub2RlLmNvbnRhaW5zKGMpJiZmLnB1c2goYS5jYWxsYmFjayl9KTtyZXR1cm4gZn1mdW5jdGlvbiBTKGEsYixjLGYpe2QoZnVuY3Rpb24oKXtxKGgoYixhKSxmdW5jdGlvbihhKXthKGIsYyxmKX0pfSl9ZnVuY3Rpb24gdShhLGcsbSl7ZnVuY3Rpb24gZChiLGMsZyxmKXtTKGMsYSxnLGYpO2IucHJvZ3Jlc3MoYyxnLGYpfWZ1bmN0aW9uIHcoYil7dmFyIGM9YSxnPW07Zy5wcmVwYXJhdGlvbkNsYXNzZXMmJihjLnJlbW92ZUNsYXNzKGcucHJlcGFyYXRpb25DbGFzc2VzKSxnLnByZXBhcmF0aW9uQ2xhc3Nlcz1udWxsKTtnLmFjdGl2ZUNsYXNzZXMmJihjLnJlbW92ZUNsYXNzKGcuYWN0aXZlQ2xhc3NlcyksZy5hY3RpdmVDbGFzc2VzPW51bGwpO0VhKGEsbSk7ZWEoYSxtKTttLmRvbU9wZXJhdGlvbigpO2UuY29tcGxldGUoIWIpfXZhciBCLGg7aWYoYT1HYShhKSlCPUcoYSksaD1hLnBhcmVudCgpO209aWEobSk7dmFyIGU9XG5uZXcgeDtZKG0uYWRkQ2xhc3MpJiYobS5hZGRDbGFzcz1tLmFkZENsYXNzLmpvaW4oXCIgXCIpKTttLmFkZENsYXNzJiYhTShtLmFkZENsYXNzKSYmKG0uYWRkQ2xhc3M9bnVsbCk7WShtLnJlbW92ZUNsYXNzKSYmKG0ucmVtb3ZlQ2xhc3M9bS5yZW1vdmVDbGFzcy5qb2luKFwiIFwiKSk7bS5yZW1vdmVDbGFzcyYmIU0obS5yZW1vdmVDbGFzcykmJihtLnJlbW92ZUNsYXNzPW51bGwpO20uZnJvbSYmIW9hKG0uZnJvbSkmJihtLmZyb209bnVsbCk7bS50byYmIW9hKG0udG8pJiYobS50bz1udWxsKTtpZighQilyZXR1cm4gdygpLGU7dmFyIGs9W0IuY2xhc3NOYW1lLG0uYWRkQ2xhc3MsbS5yZW1vdmVDbGFzc10uam9pbihcIiBcIik7aWYoIUMoaykpcmV0dXJuIHcoKSxlO3ZhciBsPTA8PVtcImVudGVyXCIsXCJtb3ZlXCIsXCJsZWF2ZVwiXS5pbmRleE9mKGcpLHU9IUh8fFUuZ2V0KEIpLGs9IXUmJkEuZ2V0KEIpfHx7fSx2PSEhay5zdGF0ZTt1fHx2JiYxPT1rLnN0YXRlfHwodT0hcChhLGgsZykpO2lmKHUpcmV0dXJuIHcoKSxcbmU7bCYmSihhKTtoPXtzdHJ1Y3R1cmFsOmwsZWxlbWVudDphLGV2ZW50OmcsY2xvc2U6dyxvcHRpb25zOm0scnVubmVyOmV9O2lmKHYpe2lmKGIoXCJza2lwXCIsYSxoLGspKXtpZigyPT09ay5zdGF0ZSlyZXR1cm4gdygpLGU7UihhLGsub3B0aW9ucyxtKTtyZXR1cm4gay5ydW5uZXJ9aWYoYihcImNhbmNlbFwiLGEsaCxrKSlpZigyPT09ay5zdGF0ZSlrLnJ1bm5lci5lbmQoKTtlbHNlIGlmKGsuc3RydWN0dXJhbClrLmNsb3NlKCk7ZWxzZSByZXR1cm4gUihhLGsub3B0aW9ucyxoLm9wdGlvbnMpLGsucnVubmVyO2Vsc2UgaWYoYihcImpvaW5cIixhLGgsaykpaWYoMj09PWsuc3RhdGUpUihhLG0se30pO2Vsc2UgcmV0dXJuIEthKGEsbD9nOm51bGwsbSksZz1oLmV2ZW50PWsuZXZlbnQsbT1SKGEsay5vcHRpb25zLGgub3B0aW9ucyksay5ydW5uZXJ9ZWxzZSBSKGEsbSx7fSk7KHY9aC5zdHJ1Y3R1cmFsKXx8KHY9XCJhbmltYXRlXCI9PT1oLmV2ZW50JiYwPE9iamVjdC5rZXlzKGgub3B0aW9ucy50b3x8XG57fSkubGVuZ3RofHxjKGgub3B0aW9ucykpO2lmKCF2KXJldHVybiB3KCksZihhKSxlO3ZhciB0PShrLmNvdW50ZXJ8fDApKzE7aC5jb3VudGVyPXQ7cihhLDEsaCk7eS4kJHBvc3REaWdlc3QoZnVuY3Rpb24oKXt2YXIgYj1BLmdldChCKSxoPSFiLGI9Ynx8e30sSj0wPChhLnBhcmVudCgpfHxbXSkubGVuZ3RoJiYoXCJhbmltYXRlXCI9PT1iLmV2ZW50fHxiLnN0cnVjdHVyYWx8fGMoYi5vcHRpb25zKSk7aWYoaHx8Yi5jb3VudGVyIT09dHx8IUope2gmJihFYShhLG0pLGVhKGEsbSkpO2lmKGh8fGwmJmIuZXZlbnQhPT1nKW0uZG9tT3BlcmF0aW9uKCksZS5lbmQoKTtKfHxmKGEpfWVsc2UgZz0hYi5zdHJ1Y3R1cmFsJiZjKGIub3B0aW9ucywhMCk/XCJzZXRDbGFzc1wiOmIuZXZlbnQscihhLDIpLGI9TyhhLGcsYi5vcHRpb25zKSxiLmRvbmUoZnVuY3Rpb24oYil7dyghYik7KGI9QS5nZXQoQikpJiZiLmNvdW50ZXI9PT10JiZmKEcoYSkpO2QoZSxnLFwiY2xvc2VcIix7fSl9KSxlLnNldEhvc3QoYiksXG5kKGUsZyxcInN0YXJ0XCIse30pfSk7cmV0dXJuIGV9ZnVuY3Rpb24gSihhKXthPUcoYSkucXVlcnlTZWxlY3RvckFsbChcIltkYXRhLW5nLWFuaW1hdGVdXCIpO3EoYSxmdW5jdGlvbihhKXt2YXIgYj1wYXJzZUludChhLmdldEF0dHJpYnV0ZShcImRhdGEtbmctYW5pbWF0ZVwiKSksYz1BLmdldChhKTtzd2l0Y2goYil7Y2FzZSAyOmMucnVubmVyLmVuZCgpO2Nhc2UgMTpjJiZBLnJlbW92ZShhKX19KX1mdW5jdGlvbiBmKGEpe2E9RyhhKTthLnJlbW92ZUF0dHJpYnV0ZShcImRhdGEtbmctYW5pbWF0ZVwiKTtBLnJlbW92ZShhKX1mdW5jdGlvbiBCKGEsYil7cmV0dXJuIEcoYSk9PT1HKGIpfWZ1bmN0aW9uIHAoYSxiLGMpe2M9QihhLGwpfHxcIkhUTUxcIj09PWFbMF0ubm9kZU5hbWU7dmFyIGc9QihhLHYpLGY9ITEsZDtmb3IoKGE9YS5kYXRhKFwiJG5nQW5pbWF0ZVBpblwiKSkmJihiPWEpO2ImJmIubGVuZ3RoOyl7Z3x8KGc9QihiLHYpKTthPWJbMF07aWYoMSE9PWEubm9kZVR5cGUpYnJlYWs7dmFyIHc9XG5BLmdldChhKXx8e307Znx8KGY9dy5zdHJ1Y3R1cmFsfHxVLmdldChhKSk7aWYocGEoZCl8fCEwPT09ZClhPWIuZGF0YShcIiQkbmdBbmltYXRlQ2hpbGRyZW5cIikscWEoYSkmJihkPWEpO2lmKGYmJiExPT09ZClicmVhaztnfHwoZz1CKGIsdiksZ3x8KGE9Yi5kYXRhKFwiJG5nQW5pbWF0ZVBpblwiKSkmJihiPWEpKTtjfHwoYz1CKGIsbCkpO2I9Yi5wYXJlbnQoKX1yZXR1cm4oIWZ8fGQpJiZnJiZjfWZ1bmN0aW9uIHIoYSxiLGMpe2M9Y3x8e307Yy5zdGF0ZT1iO2E9RyhhKTthLnNldEF0dHJpYnV0ZShcImRhdGEtbmctYW5pbWF0ZVwiLGIpO2M9KGI9QS5nZXQoYSkpP3phKGIsYyk6YztBLnB1dChhLGMpfXZhciBBPW5ldyBzLFU9bmV3IHMsSD1udWxsLGc9eS4kd2F0Y2goZnVuY3Rpb24oKXtyZXR1cm4gMD09PXQudG90YWxQZW5kaW5nUmVxdWVzdHN9LGZ1bmN0aW9uKGEpe2EmJihnKCkseS4kJHBvc3REaWdlc3QoZnVuY3Rpb24oKXt5LiQkcG9zdERpZ2VzdChmdW5jdGlvbigpe251bGw9PT1cbkgmJihIPSEwKX0pfSkpfSksdz17fSxrPWEuY2xhc3NOYW1lRmlsdGVyKCksQz1rP2Z1bmN0aW9uKGEpe3JldHVybiBrLnRlc3QoYSl9OmZ1bmN0aW9uKCl7cmV0dXJuITB9LEVhPVEobGEpO3JldHVybntvbjpmdW5jdGlvbihhLGIsYyl7Yj1aKGIpO3dbYV09d1thXXx8W107d1thXS5wdXNoKHtub2RlOmIsY2FsbGJhY2s6Y30pfSxvZmY6ZnVuY3Rpb24oYSxiLGMpe2Z1bmN0aW9uIGcoYSxiLGMpe3ZhciBmPVooYik7cmV0dXJuIGEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiEoYS5ub2RlPT09ZiYmKCFjfHxhLmNhbGxiYWNrPT09YykpfSl9dmFyIGY9d1thXTtmJiYod1thXT0xPT09YXJndW1lbnRzLmxlbmd0aD9udWxsOmcoZixiLGMpKX0scGluOmZ1bmN0aW9uKGEsYil7dmEocmEoYSksXCJlbGVtZW50XCIsXCJub3QgYW4gZWxlbWVudFwiKTt2YShyYShiKSxcInBhcmVudEVsZW1lbnRcIixcIm5vdCBhbiBlbGVtZW50XCIpO2EuZGF0YShcIiRuZ0FuaW1hdGVQaW5cIixiKX0scHVzaDpmdW5jdGlvbihhLFxuYixjLGcpe2M9Y3x8e307Yy5kb21PcGVyYXRpb249ZztyZXR1cm4gdShhLGIsYyl9LGVuYWJsZWQ6ZnVuY3Rpb24oYSxiKXt2YXIgYz1hcmd1bWVudHMubGVuZ3RoO2lmKDA9PT1jKWI9ISFIO2Vsc2UgaWYocmEoYSkpe3ZhciBnPUcoYSksZj1VLmdldChnKTsxPT09Yz9iPSFmOihiPSEhYik/ZiYmVS5yZW1vdmUoZyk6VS5wdXQoZywhMCl9ZWxzZSBiPUg9ISFhO3JldHVybiBifX19XX1dKS5wcm92aWRlcihcIiQkYW5pbWF0aW9uXCIsW1wiJGFuaW1hdGVQcm92aWRlclwiLGZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYSl7cmV0dXJuIGEuZGF0YShcIiQkYW5pbWF0aW9uUnVubmVyXCIpfXZhciBjPXRoaXMuZHJpdmVycz1bXTt0aGlzLiRnZXQ9W1wiJCRqcUxpdGVcIixcIiRyb290U2NvcGVcIixcIiRpbmplY3RvclwiLFwiJCRBbmltYXRlUnVubmVyXCIsXCIkJEhhc2hNYXBcIixcIiQkckFGU2NoZWR1bGVyXCIsZnVuY3Rpb24oYSxlLHksdix6LGwpe2Z1bmN0aW9uIHMoYSl7ZnVuY3Rpb24gYihhKXtpZihhLnByb2Nlc3NlZClyZXR1cm4gYTtcbmEucHJvY2Vzc2VkPSEwO3ZhciBmPWEuZG9tTm9kZSxkPWYucGFyZW50Tm9kZTtlLnB1dChmLGEpO2Zvcih2YXIgaDtkOyl7aWYoaD1lLmdldChkKSl7aC5wcm9jZXNzZWR8fChoPWIoaCkpO2JyZWFrfWQ9ZC5wYXJlbnROb2RlfShofHxjKS5jaGlsZHJlbi5wdXNoKGEpO3JldHVybiBhfXZhciBjPXtjaGlsZHJlbjpbXX0sZCxlPW5ldyB6O2ZvcihkPTA7ZDxhLmxlbmd0aDtkKyspe3ZhciBsPWFbZF07ZS5wdXQobC5kb21Ob2RlLGFbZF09e2RvbU5vZGU6bC5kb21Ob2RlLGZuOmwuZm4sY2hpbGRyZW46W119KX1mb3IoZD0wO2Q8YS5sZW5ndGg7ZCsrKWIoYVtkXSk7cmV0dXJuIGZ1bmN0aW9uKGEpe3ZhciBiPVtdLGM9W10sZDtmb3IoZD0wO2Q8YS5jaGlsZHJlbi5sZW5ndGg7ZCsrKWMucHVzaChhLmNoaWxkcmVuW2RdKTthPWMubGVuZ3RoO3ZhciBoPTAsZT1bXTtmb3IoZD0wO2Q8Yy5sZW5ndGg7ZCsrKXt2YXIgbD1jW2RdOzA+PWEmJihhPWgsaD0wLGIucHVzaChlKSxlPVtdKTtlLnB1c2gobC5mbik7XG5sLmNoaWxkcmVuLmZvckVhY2goZnVuY3Rpb24oYSl7aCsrO2MucHVzaChhKX0pO2EtLX1lLmxlbmd0aCYmYi5wdXNoKGUpO3JldHVybiBifShjKX12YXIgTz1bXSx4PVEoYSk7cmV0dXJuIGZ1bmN0aW9uKHQseixFKXtmdW5jdGlvbiBoKGEpe2E9YS5oYXNBdHRyaWJ1dGUoXCJuZy1hbmltYXRlLXJlZlwiKT9bYV06YS5xdWVyeVNlbGVjdG9yQWxsKFwiW25nLWFuaW1hdGUtcmVmXVwiKTt2YXIgYj1bXTtxKGEsZnVuY3Rpb24oYSl7dmFyIGM9YS5nZXRBdHRyaWJ1dGUoXCJuZy1hbmltYXRlLXJlZlwiKTtjJiZjLmxlbmd0aCYmYi5wdXNoKGEpfSk7cmV0dXJuIGJ9ZnVuY3Rpb24gUyhhKXt2YXIgYj1bXSxjPXt9O3EoYSxmdW5jdGlvbihhLGcpe3ZhciBkPUcoYS5lbGVtZW50KSxmPTA8PVtcImVudGVyXCIsXCJtb3ZlXCJdLmluZGV4T2YoYS5ldmVudCksZD1hLnN0cnVjdHVyYWw/aChkKTpbXTtpZihkLmxlbmd0aCl7dmFyIGU9Zj9cInRvXCI6XCJmcm9tXCI7cShkLGZ1bmN0aW9uKGEpe3ZhciBiPWEuZ2V0QXR0cmlidXRlKFwibmctYW5pbWF0ZS1yZWZcIik7XG5jW2JdPWNbYl18fHt9O2NbYl1bZV09e2FuaW1hdGlvbklEOmcsZWxlbWVudDpJKGEpfX0pfWVsc2UgYi5wdXNoKGEpfSk7dmFyIGQ9e30sZj17fTtxKGMsZnVuY3Rpb24oYyxlKXt2YXIgaD1jLmZyb20scj1jLnRvO2lmKGgmJnIpe3ZhciBKPWFbaC5hbmltYXRpb25JRF0saz1hW3IuYW5pbWF0aW9uSURdLEI9aC5hbmltYXRpb25JRC50b1N0cmluZygpO2lmKCFmW0JdKXt2YXIgbD1mW0JdPXtzdHJ1Y3R1cmFsOiEwLGJlZm9yZVN0YXJ0OmZ1bmN0aW9uKCl7Si5iZWZvcmVTdGFydCgpO2suYmVmb3JlU3RhcnQoKX0sY2xvc2U6ZnVuY3Rpb24oKXtKLmNsb3NlKCk7ay5jbG9zZSgpfSxjbGFzc2VzOnUoSi5jbGFzc2VzLGsuY2xhc3NlcyksZnJvbTpKLHRvOmssYW5jaG9yczpbXX07bC5jbGFzc2VzLmxlbmd0aD9iLnB1c2gobCk6KGIucHVzaChKKSxiLnB1c2goaykpfWZbQl0uYW5jaG9ycy5wdXNoKHtvdXQ6aC5lbGVtZW50LFwiaW5cIjpyLmVsZW1lbnR9KX1lbHNlIGg9aD9oLmFuaW1hdGlvbklEOlxuci5hbmltYXRpb25JRCxyPWgudG9TdHJpbmcoKSxkW3JdfHwoZFtyXT0hMCxiLnB1c2goYVtoXSkpfSk7cmV0dXJuIGJ9ZnVuY3Rpb24gdShhLGIpe2E9YS5zcGxpdChcIiBcIik7Yj1iLnNwbGl0KFwiIFwiKTtmb3IodmFyIGM9W10sZD0wO2Q8YS5sZW5ndGg7ZCsrKXt2YXIgZj1hW2RdO2lmKFwibmctXCIhPT1mLnN1YnN0cmluZygwLDMpKWZvcih2YXIgaD0wO2g8Yi5sZW5ndGg7aCsrKWlmKGY9PT1iW2hdKXtjLnB1c2goZik7YnJlYWt9fXJldHVybiBjLmpvaW4oXCIgXCIpfWZ1bmN0aW9uIEooYSl7Zm9yKHZhciBiPWMubGVuZ3RoLTE7MDw9YjtiLS0pe3ZhciBkPWNbYl07aWYoeS5oYXMoZCkmJihkPXkuZ2V0KGQpKGEpKSlyZXR1cm4gZH19ZnVuY3Rpb24gZihhLGMpe2EuZnJvbSYmYS50bz8oYihhLmZyb20uZWxlbWVudCkuc2V0SG9zdChjKSxiKGEudG8uZWxlbWVudCkuc2V0SG9zdChjKSk6YihhLmVsZW1lbnQpLnNldEhvc3QoYyl9ZnVuY3Rpb24gQigpe3ZhciBhPWIodCk7IWF8fFwibGVhdmVcIj09PVxueiYmRS4kJGRvbU9wZXJhdGlvbkZpcmVkfHxhLmVuZCgpfWZ1bmN0aW9uIHAoYil7dC5vZmYoXCIkZGVzdHJveVwiLEIpO3QucmVtb3ZlRGF0YShcIiQkYW5pbWF0aW9uUnVubmVyXCIpO3godCxFKTtlYSh0LEUpO0UuZG9tT3BlcmF0aW9uKCk7SCYmYS5yZW1vdmVDbGFzcyh0LEgpO3QucmVtb3ZlQ2xhc3MoXCJuZy1hbmltYXRlXCIpO0EuY29tcGxldGUoIWIpfUU9aWEoRSk7dmFyIHI9MDw9W1wiZW50ZXJcIixcIm1vdmVcIixcImxlYXZlXCJdLmluZGV4T2YoeiksQT1uZXcgdih7ZW5kOmZ1bmN0aW9uKCl7cCgpfSxjYW5jZWw6ZnVuY3Rpb24oKXtwKCEwKX19KTtpZighYy5sZW5ndGgpcmV0dXJuIHAoKSxBO3QuZGF0YShcIiQkYW5pbWF0aW9uUnVubmVyXCIsQSk7dmFyIFU9d2EodC5hdHRyKFwiY2xhc3NcIiksd2EoRS5hZGRDbGFzcyxFLnJlbW92ZUNsYXNzKSksSD1FLnRlbXBDbGFzc2VzO0gmJihVKz1cIiBcIitILEUudGVtcENsYXNzZXM9bnVsbCk7Ty5wdXNoKHtlbGVtZW50OnQsY2xhc3NlczpVLGV2ZW50OnosXG5zdHJ1Y3R1cmFsOnIsb3B0aW9uczpFLGJlZm9yZVN0YXJ0OmZ1bmN0aW9uKCl7dC5hZGRDbGFzcyhcIm5nLWFuaW1hdGVcIik7SCYmYS5hZGRDbGFzcyh0LEgpfSxjbG9zZTpwfSk7dC5vbihcIiRkZXN0cm95XCIsQik7aWYoMTxPLmxlbmd0aClyZXR1cm4gQTtlLiQkcG9zdERpZ2VzdChmdW5jdGlvbigpe3ZhciBhPVtdO3EoTyxmdW5jdGlvbihjKXtiKGMuZWxlbWVudCk/YS5wdXNoKGMpOmMuY2xvc2UoKX0pO08ubGVuZ3RoPTA7dmFyIGM9UyhhKSxkPVtdO3EoYyxmdW5jdGlvbihhKXtkLnB1c2goe2RvbU5vZGU6RyhhLmZyb20/YS5mcm9tLmVsZW1lbnQ6YS5lbGVtZW50KSxmbjpmdW5jdGlvbigpe2EuYmVmb3JlU3RhcnQoKTt2YXIgYyxkPWEuY2xvc2U7aWYoYihhLmFuY2hvcnM/YS5mcm9tLmVsZW1lbnR8fGEudG8uZWxlbWVudDphLmVsZW1lbnQpKXt2YXIgZz1KKGEpO2cmJihjPWcuc3RhcnQpfWM/KGM9YygpLGMuZG9uZShmdW5jdGlvbihhKXtkKCFhKX0pLGYoYSxjKSk6ZCgpfX0pfSk7XG5sKHMoZCkpfSk7cmV0dXJuIEF9fV19XSkucHJvdmlkZXIoXCIkYW5pbWF0ZUNzc1wiLFtcIiRhbmltYXRlUHJvdmlkZXJcIixmdW5jdGlvbihhKXt2YXIgYj1DYSgpLGM9Q2EoKTt0aGlzLiRnZXQ9W1wiJHdpbmRvd1wiLFwiJCRqcUxpdGVcIixcIiQkQW5pbWF0ZVJ1bm5lclwiLFwiJHRpbWVvdXRcIixcIiQkZm9yY2VSZWZsb3dcIixcIiRzbmlmZmVyXCIsXCIkJHJBRlNjaGVkdWxlclwiLFwiJGFuaW1hdGVcIixmdW5jdGlvbihhLGUseSx2LHosbCxzLE8pe2Z1bmN0aW9uIHgoYSxiKXt2YXIgYz1hLnBhcmVudE5vZGU7cmV0dXJuKGMuJCRuZ0FuaW1hdGVQYXJlbnRLZXl8fChjLiQkbmdBbmltYXRlUGFyZW50S2V5PSsrUykpK1wiLVwiK2EuZ2V0QXR0cmlidXRlKFwiY2xhc3NcIikrXCItXCIrYn1mdW5jdGlvbiB0KGgsZixsLHApe3ZhciByOzA8Yi5jb3VudChsKSYmKHI9Yy5nZXQobCkscnx8KGY9VihmLFwiLXN0YWdnZXJcIiksZS5hZGRDbGFzcyhoLGYpLHI9QWEoYSxoLHApLHIuYW5pbWF0aW9uRHVyYXRpb249TWF0aC5tYXgoci5hbmltYXRpb25EdXJhdGlvbixcbjApLHIudHJhbnNpdGlvbkR1cmF0aW9uPU1hdGgubWF4KHIudHJhbnNpdGlvbkR1cmF0aW9uLDApLGUucmVtb3ZlQ2xhc3MoaCxmKSxjLnB1dChsLHIpKSk7cmV0dXJuIHJ8fHt9fWZ1bmN0aW9uIGxhKGEpe3UucHVzaChhKTtzLndhaXRVbnRpbFF1aWV0KGZ1bmN0aW9uKCl7Yi5mbHVzaCgpO2MuZmx1c2goKTtmb3IodmFyIGE9eigpLGQ9MDtkPHUubGVuZ3RoO2QrKyl1W2RdKGEpO3UubGVuZ3RoPTB9KX1mdW5jdGlvbiBFKGMsZixoKXtmPWIuZ2V0KGgpO2Z8fChmPUFhKGEsYyxNYSksXCJpbmZpbml0ZVwiPT09Zi5hbmltYXRpb25JdGVyYXRpb25Db3VudCYmKGYuYW5pbWF0aW9uSXRlcmF0aW9uQ291bnQ9MSkpO2IucHV0KGgsZik7Yz1mO2g9Yy5hbmltYXRpb25EZWxheTtmPWMudHJhbnNpdGlvbkRlbGF5O2MubWF4RGVsYXk9aCYmZj9NYXRoLm1heChoLGYpOmh8fGY7Yy5tYXhEdXJhdGlvbj1NYXRoLm1heChjLmFuaW1hdGlvbkR1cmF0aW9uKmMuYW5pbWF0aW9uSXRlcmF0aW9uQ291bnQsXG5jLnRyYW5zaXRpb25EdXJhdGlvbik7cmV0dXJuIGN9dmFyIGg9UShlKSxTPTAsdT1bXTtyZXR1cm4gZnVuY3Rpb24oYSxjKXtmdW5jdGlvbiBkKCl7cigpfWZ1bmN0aW9uIHAoKXtyKCEwKX1mdW5jdGlvbiByKGIpe2lmKCEoc3x8UyYmeikpe3M9ITA7ej0hMTtjLiQkc2tpcFByZXBhcmF0aW9uQ2xhc3Nlc3x8ZS5yZW1vdmVDbGFzcyhhLGFhKTtlLnJlbW92ZUNsYXNzKGEsJCk7bWEoZywhMSk7amEoZywhMSk7cSh3LGZ1bmN0aW9uKGEpe2cuc3R5bGVbYVswXV09XCJcIn0pO2goYSxjKTtlYShhLGMpO2lmKGMub25Eb25lKWMub25Eb25lKCk7bSYmbS5jb21wbGV0ZSghYil9fWZ1bmN0aW9uIEEoYSl7bi5ibG9ja1RyYW5zaXRpb24mJmphKGcsYSk7bi5ibG9ja0tleWZyYW1lQW5pbWF0aW9uJiZtYShnLCEhYSl9ZnVuY3Rpb24gdSgpe209bmV3IHkoe2VuZDpkLGNhbmNlbDpwfSk7bGEoTCk7cigpO3JldHVybnskJHdpbGxBbmltYXRlOiExLHN0YXJ0OmZ1bmN0aW9uKCl7cmV0dXJuIG19LFxuZW5kOmR9fWZ1bmN0aW9uIEgoKXtmdW5jdGlvbiBiKCl7aWYoIXMpe0EoITEpO3EodyxmdW5jdGlvbihhKXtnLnN0eWxlW2FbMF1dPWFbMV19KTtoKGEsYyk7ZS5hZGRDbGFzcyhhLCQpO2lmKG4ucmVjYWxjdWxhdGVUaW1pbmdTdHlsZXMpe2hhPWcuY2xhc3NOYW1lK1wiIFwiK2FhO2JhPXgoZyxoYSk7RD1FKGcsaGEsYmEpO1g9RC5tYXhEZWxheTtJPU1hdGgubWF4KFgsMCk7Sz1ELm1heER1cmF0aW9uO2lmKDA9PT1LKXtyKCk7cmV0dXJufW4uaGFzVHJhbnNpdGlvbnM9MDxELnRyYW5zaXRpb25EdXJhdGlvbjtuLmhhc0FuaW1hdGlvbnM9MDxELmFuaW1hdGlvbkR1cmF0aW9ufW4uYXBwbHlBbmltYXRpb25EZWxheSYmKFg9XCJib29sZWFuXCIhPT10eXBlb2YgYy5kZWxheSYmbmEoYy5kZWxheSk/cGFyc2VGbG9hdChjLmRlbGF5KTpYLEk9TWF0aC5tYXgoWCwwKSxELmFuaW1hdGlvbkRlbGF5PVgsZGE9W2thLFgrXCJzXCJdLHcucHVzaChkYSksZy5zdHlsZVtkYVswXV09ZGFbMV0pO009MUUzKlxuSTtRPTFFMypLO2lmKGMuZWFzaW5nKXt2YXIgayxwPWMuZWFzaW5nO24uaGFzVHJhbnNpdGlvbnMmJihrPU4rXCJUaW1pbmdGdW5jdGlvblwiLHcucHVzaChbayxwXSksZy5zdHlsZVtrXT1wKTtuLmhhc0FuaW1hdGlvbnMmJihrPVcrXCJUaW1pbmdGdW5jdGlvblwiLHcucHVzaChbayxwXSksZy5zdHlsZVtrXT1wKX1ELnRyYW5zaXRpb25EdXJhdGlvbiYmbS5wdXNoKHNhKTtELmFuaW1hdGlvbkR1cmF0aW9uJiZtLnB1c2godGEpO0g9RGF0ZS5ub3coKTt2YXIgdT1NKzEuNSpRO2s9SCt1O3ZhciBwPWEuZGF0YShcIiQkYW5pbWF0ZUNzc1wiKXx8W10sej0hMDtpZihwLmxlbmd0aCl7dmFyIEM9cFswXTsoej1rPkMuZXhwZWN0ZWRFbmRUaW1lKT92LmNhbmNlbChDLnRpbWVyKTpwLnB1c2gocil9eiYmKHU9dihkLHUsITEpLHBbMF09e3RpbWVyOnUsZXhwZWN0ZWRFbmRUaW1lOmt9LHAucHVzaChyKSxhLmRhdGEoXCIkJGFuaW1hdGVDc3NcIixwKSk7YS5vbihtLmpvaW4oXCIgXCIpLGwpO3lhKGEsYyl9fVxuZnVuY3Rpb24gZCgpe3ZhciBiPWEuZGF0YShcIiQkYW5pbWF0ZUNzc1wiKTtpZihiKXtmb3IodmFyIGM9MTtjPGIubGVuZ3RoO2MrKyliW2NdKCk7YS5yZW1vdmVEYXRhKFwiJCRhbmltYXRlQ3NzXCIpfX1mdW5jdGlvbiBsKGEpe2Euc3RvcFByb3BhZ2F0aW9uKCk7dmFyIGI9YS5vcmlnaW5hbEV2ZW50fHxhO2E9Yi4kbWFudWFsVGltZVN0YW1wfHxiLnRpbWVTdGFtcHx8RGF0ZS5ub3coKTtiPXBhcnNlRmxvYXQoYi5lbGFwc2VkVGltZS50b0ZpeGVkKDMpKTtNYXRoLm1heChhLUgsMCk+PU0mJmI+PUsmJihTPSEwLHIoKSl9aWYoIXMpaWYoZy5wYXJlbnROb2RlKXt2YXIgSCxtPVtdLGs9ZnVuY3Rpb24oYSl7aWYoUyl6JiZhJiYoej0hMSxyKCkpO2Vsc2UgaWYoej0hYSxELmFuaW1hdGlvbkR1cmF0aW9uKWlmKGE9bWEoZyx6KSx6KXcucHVzaChhKTtlbHNle3ZhciBiPXcsYz1iLmluZGV4T2YoYSk7MDw9YSYmYi5zcGxpY2UoYywxKX19LHA9MDxaJiYoRC50cmFuc2l0aW9uRHVyYXRpb24mJlxuMD09PVQudHJhbnNpdGlvbkR1cmF0aW9ufHxELmFuaW1hdGlvbkR1cmF0aW9uJiYwPT09VC5hbmltYXRpb25EdXJhdGlvbikmJk1hdGgubWF4KFQuYW5pbWF0aW9uRGVsYXksVC50cmFuc2l0aW9uRGVsYXkpO3A/dihiLE1hdGguZmxvb3IocCpaKjFFMyksITEpOmIoKTtGLnJlc3VtZT1mdW5jdGlvbigpe2soITApfTtGLnBhdXNlPWZ1bmN0aW9uKCl7ayghMSl9fWVsc2UgcigpfXZhciBnPUcoYSk7aWYoIWd8fCFnLnBhcmVudE5vZGV8fCFPLmVuYWJsZWQoKSlyZXR1cm4gdSgpO2M9aWEoYyk7dmFyIHc9W10saz1hLmF0dHIoXCJjbGFzc1wiKSxDPUZhKGMpLHMseixTLG0sRixJLE0sSyxRO2lmKDA9PT1jLmR1cmF0aW9ufHwhbC5hbmltYXRpb25zJiYhbC50cmFuc2l0aW9ucylyZXR1cm4gdSgpO3ZhciBjYT1jLmV2ZW50JiZZKGMuZXZlbnQpP2MuZXZlbnQuam9pbihcIiBcIik6Yy5ldmVudCxSPVwiXCIsUD1cIlwiO2NhJiZjLnN0cnVjdHVyYWw/Uj1WKGNhLFwibmctXCIsITApOmNhJiYoUj1jYSk7Yy5hZGRDbGFzcyYmXG4oUCs9VihjLmFkZENsYXNzLFwiLWFkZFwiKSk7Yy5yZW1vdmVDbGFzcyYmKFAubGVuZ3RoJiYoUCs9XCIgXCIpLFArPVYoYy5yZW1vdmVDbGFzcyxcIi1yZW1vdmVcIikpO2MuYXBwbHlDbGFzc2VzRWFybHkmJlAubGVuZ3RoJiZoKGEsYyk7dmFyIGFhPVtSLFBdLmpvaW4oXCIgXCIpLnRyaW0oKSxoYT1rK1wiIFwiK2FhLCQ9VihhYSxcIi1hY3RpdmVcIiksaz1DLnRvJiYwPE9iamVjdC5rZXlzKEMudG8pLmxlbmd0aDtpZighKDA8KGMua2V5ZnJhbWVTdHlsZXx8XCJcIikubGVuZ3RofHxrfHxhYSkpcmV0dXJuIHUoKTt2YXIgYmEsVDswPGMuc3RhZ2dlcj8oQz1wYXJzZUZsb2F0KGMuc3RhZ2dlciksVD17dHJhbnNpdGlvbkRlbGF5OkMsYW5pbWF0aW9uRGVsYXk6Qyx0cmFuc2l0aW9uRHVyYXRpb246MCxhbmltYXRpb25EdXJhdGlvbjowfSk6KGJhPXgoZyxoYSksVD10KGcsYWEsYmEsTmEpKTtjLiQkc2tpcFByZXBhcmF0aW9uQ2xhc3Nlc3x8ZS5hZGRDbGFzcyhhLGFhKTtjLnRyYW5zaXRpb25TdHlsZSYmKEM9XG5bTixjLnRyYW5zaXRpb25TdHlsZV0sZmEoZyxDKSx3LnB1c2goQykpOzA8PWMuZHVyYXRpb24mJihDPTA8Zy5zdHlsZVtOXS5sZW5ndGgsQz1CYShjLmR1cmF0aW9uLEMpLGZhKGcsQyksdy5wdXNoKEMpKTtjLmtleWZyYW1lU3R5bGUmJihDPVtXLGMua2V5ZnJhbWVTdHlsZV0sZmEoZyxDKSx3LnB1c2goQykpO3ZhciBaPVQ/MDw9Yy5zdGFnZ2VySW5kZXg/Yy5zdGFnZ2VySW5kZXg6Yi5jb3VudChiYSk6MDsoY2E9MD09PVopJiYhYy5za2lwQmxvY2tpbmcmJmphKGcsOTk5OSk7dmFyIEQ9RShnLGhhLGJhKSxYPUQubWF4RGVsYXk7ST1NYXRoLm1heChYLDApO0s9RC5tYXhEdXJhdGlvbjt2YXIgbj17fTtuLmhhc1RyYW5zaXRpb25zPTA8RC50cmFuc2l0aW9uRHVyYXRpb247bi5oYXNBbmltYXRpb25zPTA8RC5hbmltYXRpb25EdXJhdGlvbjtuLmhhc1RyYW5zaXRpb25BbGw9bi5oYXNUcmFuc2l0aW9ucyYmXCJhbGxcIj09RC50cmFuc2l0aW9uUHJvcGVydHk7bi5hcHBseVRyYW5zaXRpb25EdXJhdGlvbj1cbmsmJihuLmhhc1RyYW5zaXRpb25zJiYhbi5oYXNUcmFuc2l0aW9uQWxsfHxuLmhhc0FuaW1hdGlvbnMmJiFuLmhhc1RyYW5zaXRpb25zKTtuLmFwcGx5QW5pbWF0aW9uRHVyYXRpb249Yy5kdXJhdGlvbiYmbi5oYXNBbmltYXRpb25zO24uYXBwbHlUcmFuc2l0aW9uRGVsYXk9bmEoYy5kZWxheSkmJihuLmFwcGx5VHJhbnNpdGlvbkR1cmF0aW9ufHxuLmhhc1RyYW5zaXRpb25zKTtuLmFwcGx5QW5pbWF0aW9uRGVsYXk9bmEoYy5kZWxheSkmJm4uaGFzQW5pbWF0aW9ucztuLnJlY2FsY3VsYXRlVGltaW5nU3R5bGVzPTA8UC5sZW5ndGg7aWYobi5hcHBseVRyYW5zaXRpb25EdXJhdGlvbnx8bi5hcHBseUFuaW1hdGlvbkR1cmF0aW9uKUs9Yy5kdXJhdGlvbj9wYXJzZUZsb2F0KGMuZHVyYXRpb24pOkssbi5hcHBseVRyYW5zaXRpb25EdXJhdGlvbiYmKG4uaGFzVHJhbnNpdGlvbnM9ITAsRC50cmFuc2l0aW9uRHVyYXRpb249SyxDPTA8Zy5zdHlsZVtOK1wiUHJvcGVydHlcIl0ubGVuZ3RoLHcucHVzaChCYShLLFxuQykpKSxuLmFwcGx5QW5pbWF0aW9uRHVyYXRpb24mJihuLmhhc0FuaW1hdGlvbnM9ITAsRC5hbmltYXRpb25EdXJhdGlvbj1LLHcucHVzaChbdWEsSytcInNcIl0pKTtpZigwPT09SyYmIW4ucmVjYWxjdWxhdGVUaW1pbmdTdHlsZXMpcmV0dXJuIHUoKTtpZihudWxsIT1jLmRlbGF5KXt2YXIgZGE9cGFyc2VGbG9hdChjLmRlbGF5KTtuLmFwcGx5VHJhbnNpdGlvbkRlbGF5JiZ3LnB1c2goW2dhLGRhK1wic1wiXSk7bi5hcHBseUFuaW1hdGlvbkRlbGF5JiZ3LnB1c2goW2thLGRhK1wic1wiXSl9bnVsbD09Yy5kdXJhdGlvbiYmMDxELnRyYW5zaXRpb25EdXJhdGlvbiYmKG4ucmVjYWxjdWxhdGVUaW1pbmdTdHlsZXM9bi5yZWNhbGN1bGF0ZVRpbWluZ1N0eWxlc3x8Y2EpO009MUUzKkk7UT0xRTMqSztjLnNraXBCbG9ja2luZ3x8KG4uYmxvY2tUcmFuc2l0aW9uPTA8RC50cmFuc2l0aW9uRHVyYXRpb24sbi5ibG9ja0tleWZyYW1lQW5pbWF0aW9uPTA8RC5hbmltYXRpb25EdXJhdGlvbiYmMDxULmFuaW1hdGlvbkRlbGF5JiZcbjA9PT1ULmFuaW1hdGlvbkR1cmF0aW9uKTt4YShhLGMpO24uYmxvY2tUcmFuc2l0aW9ufHxuLmJsb2NrS2V5ZnJhbWVBbmltYXRpb24/QShLKTpjLnNraXBCbG9ja2luZ3x8amEoZywhMSk7cmV0dXJueyQkd2lsbEFuaW1hdGU6ITAsZW5kOmQsc3RhcnQ6ZnVuY3Rpb24oKXtpZighcylyZXR1cm4gRj17ZW5kOmQsY2FuY2VsOnAscmVzdW1lOm51bGwscGF1c2U6bnVsbH0sbT1uZXcgeShGKSxsYShIKSxtfX19fV19XSkucHJvdmlkZXIoXCIkJGFuaW1hdGVDc3NEcml2ZXJcIixbXCIkJGFuaW1hdGlvblByb3ZpZGVyXCIsZnVuY3Rpb24oYSl7YS5kcml2ZXJzLnB1c2goXCIkJGFuaW1hdGVDc3NEcml2ZXJcIik7dGhpcy4kZ2V0PVtcIiRhbmltYXRlQ3NzXCIsXCIkcm9vdFNjb3BlXCIsXCIkJEFuaW1hdGVSdW5uZXJcIixcIiRyb290RWxlbWVudFwiLFwiJCRib2R5XCIsXCIkc25pZmZlclwiLFwiJCRqcUxpdGVcIixmdW5jdGlvbihhLGMsZCxlLHksdix6KXtmdW5jdGlvbiBsKGEpe3JldHVybiBhLnJlcGxhY2UoL1xcYm5nLVxcUytcXGIvZyxcblwiXCIpfWZ1bmN0aW9uIHMoYSxiKXtNKGEpJiYoYT1hLnNwbGl0KFwiIFwiKSk7TShiKSYmKGI9Yi5zcGxpdChcIiBcIikpO3JldHVybiBhLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4tMT09PWIuaW5kZXhPZihhKX0pLmpvaW4oXCIgXCIpfWZ1bmN0aW9uIE8oYyxlLHUpe2Z1bmN0aW9uIHYoYSl7dmFyIGI9e30sYz1HKGEpLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO3EoW1wid2lkdGhcIixcImhlaWdodFwiLFwidG9wXCIsXCJsZWZ0XCJdLGZ1bmN0aW9uKGEpe3ZhciBkPWNbYV07c3dpdGNoKGEpe2Nhc2UgXCJ0b3BcIjpkKz1GLnNjcm9sbFRvcDticmVhaztjYXNlIFwibGVmdFwiOmQrPUYuc2Nyb2xsTGVmdH1iW2FdPU1hdGguZmxvb3IoZCkrXCJweFwifSk7cmV0dXJuIGJ9ZnVuY3Rpb24gZigpe3ZhciBjPWwodS5hdHRyKFwiY2xhc3NcIil8fFwiXCIpLGQ9cyhjLHIpLGM9cyhyLGMpLGQ9YShwLHt0bzp2KHUpLGFkZENsYXNzOlwibmctYW5jaG9yLWluIFwiK2QscmVtb3ZlQ2xhc3M6XCJuZy1hbmNob3Itb3V0IFwiK2MsZGVsYXk6ITB9KTtcbnJldHVybiBkLiQkd2lsbEFuaW1hdGU/ZDpudWxsfWZ1bmN0aW9uIHooKXtwLnJlbW92ZSgpO2UucmVtb3ZlQ2xhc3MoXCJuZy1hbmltYXRlLXNoaW1cIik7dS5yZW1vdmVDbGFzcyhcIm5nLWFuaW1hdGUtc2hpbVwiKX12YXIgcD1JKEcoZSkuY2xvbmVOb2RlKCEwKSkscj1sKHAuYXR0cihcImNsYXNzXCIpfHxcIlwiKTtlLmFkZENsYXNzKFwibmctYW5pbWF0ZS1zaGltXCIpO3UuYWRkQ2xhc3MoXCJuZy1hbmltYXRlLXNoaW1cIik7cC5hZGRDbGFzcyhcIm5nLWFuY2hvclwiKTtFLmFwcGVuZChwKTt2YXIgQTtjPWZ1bmN0aW9uKCl7dmFyIGM9YShwLHthZGRDbGFzczpcIm5nLWFuY2hvci1vdXRcIixkZWxheTohMCxmcm9tOnYoZSl9KTtyZXR1cm4gYy4kJHdpbGxBbmltYXRlP2M6bnVsbH0oKTtpZighYyYmKEE9ZigpLCFBKSlyZXR1cm4geigpO3ZhciB0PWN8fEE7cmV0dXJue3N0YXJ0OmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYSgpe2MmJmMuZW5kKCl9dmFyIGIsYz10LnN0YXJ0KCk7Yy5kb25lKGZ1bmN0aW9uKCl7Yz1cbm51bGw7aWYoIUEmJihBPWYoKSkpcmV0dXJuIGM9QS5zdGFydCgpLGMuZG9uZShmdW5jdGlvbigpe2M9bnVsbDt6KCk7Yi5jb21wbGV0ZSgpfSksYzt6KCk7Yi5jb21wbGV0ZSgpfSk7cmV0dXJuIGI9bmV3IGQoe2VuZDphLGNhbmNlbDphfSl9fX1mdW5jdGlvbiB4KGEsYixjLGUpe3ZhciBmPXQoYSxMKSxsPXQoYixMKSxwPVtdO3EoZSxmdW5jdGlvbihhKXsoYT1PKGMsYS5vdXQsYVtcImluXCJdKSkmJnAucHVzaChhKX0pO2lmKGZ8fGx8fDAhPT1wLmxlbmd0aClyZXR1cm57c3RhcnQ6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKCl7cShiLGZ1bmN0aW9uKGEpe2EuZW5kKCl9KX12YXIgYj1bXTtmJiZiLnB1c2goZi5zdGFydCgpKTtsJiZiLnB1c2gobC5zdGFydCgpKTtxKHAsZnVuY3Rpb24oYSl7Yi5wdXNoKGEuc3RhcnQoKSl9KTt2YXIgYz1uZXcgZCh7ZW5kOmEsY2FuY2VsOmF9KTtkLmFsbChiLGZ1bmN0aW9uKGEpe2MuY29tcGxldGUoYSl9KTtyZXR1cm4gY319fWZ1bmN0aW9uIHQoYyl7dmFyIGQ9XG5jLmVsZW1lbnQsZT1jLm9wdGlvbnN8fHt9O2Muc3RydWN0dXJhbCYmKGUuZXZlbnQ9Yy5ldmVudCxlLnN0cnVjdHVyYWw9ITAsZS5hcHBseUNsYXNzZXNFYXJseT0hMCxcImxlYXZlXCI9PT1jLmV2ZW50JiYoZS5vbkRvbmU9ZS5kb21PcGVyYXRpb24pKTtlLnByZXBhcmF0aW9uQ2xhc3NlcyYmKGUuZXZlbnQ9JChlLmV2ZW50LGUucHJlcGFyYXRpb25DbGFzc2VzKSk7Yz1hKGQsZSk7cmV0dXJuIGMuJCR3aWxsQW5pbWF0ZT9jOm51bGx9aWYoIXYuYW5pbWF0aW9ucyYmIXYudHJhbnNpdGlvbnMpcmV0dXJuIEw7dmFyIEY9Ryh5KTtjPUcoZSk7dmFyIEU9SShGLnBhcmVudE5vZGU9PT1jP0Y6Yyk7USh6KTtyZXR1cm4gZnVuY3Rpb24oYSl7cmV0dXJuIGEuZnJvbSYmYS50bz94KGEuZnJvbSxhLnRvLGEuY2xhc3NlcyxhLmFuY2hvcnMpOnQoYSl9fV19XSkucHJvdmlkZXIoXCIkJGFuaW1hdGVKc1wiLFtcIiRhbmltYXRlUHJvdmlkZXJcIixmdW5jdGlvbihhKXt0aGlzLiRnZXQ9W1wiJGluamVjdG9yXCIsXG5cIiQkQW5pbWF0ZVJ1bm5lclwiLFwiJCRqcUxpdGVcIixmdW5jdGlvbihiLGMsZCl7ZnVuY3Rpb24gZShjKXtjPVkoYyk/YzpjLnNwbGl0KFwiIFwiKTtmb3IodmFyIGQ9W10sZT17fSxzPTA7czxjLmxlbmd0aDtzKyspe3ZhciBxPWNbc10seT1hLiQkcmVnaXN0ZXJlZEFuaW1hdGlvbnNbcV07eSYmIWVbcV0mJihkLnB1c2goYi5nZXQoeSkpLGVbcV09ITApfXJldHVybiBkfXZhciB5PVEoZCk7cmV0dXJuIGZ1bmN0aW9uKGEsYixkLHMpe2Z1bmN0aW9uIHgoKXtzLmRvbU9wZXJhdGlvbigpO3koYSxzKX1mdW5jdGlvbiBGKGEsYixkLGUsZil7c3dpdGNoKGQpe2Nhc2UgXCJhbmltYXRlXCI6Yj1bYixlLmZyb20sZS50byxmXTticmVhaztjYXNlIFwic2V0Q2xhc3NcIjpiPVtiLEUsaCxmXTticmVhaztjYXNlIFwiYWRkQ2xhc3NcIjpiPVtiLEUsZl07YnJlYWs7Y2FzZSBcInJlbW92ZUNsYXNzXCI6Yj1bYixoLGZdO2JyZWFrO2RlZmF1bHQ6Yj1bYixmXX1iLnB1c2goZSk7aWYoYT1hLmFwcGx5KGEsYikpaWYoRGEoYS5zdGFydCkmJlxuKGE9YS5zdGFydCgpKSxhIGluc3RhbmNlb2YgYylhLmRvbmUoZik7ZWxzZSBpZihEYShhKSlyZXR1cm4gYTtyZXR1cm4gTH1mdW5jdGlvbiB0KGEsYixkLGUsZil7dmFyIGc9W107cShlLGZ1bmN0aW9uKGUpe3ZhciBoPWVbZl07aCYmZy5wdXNoKGZ1bmN0aW9uKCl7dmFyIGUsZyxmPSExLGw9ZnVuY3Rpb24oYSl7Znx8KGY9ITAsKGd8fEwpKGEpLGUuY29tcGxldGUoIWEpKX07ZT1uZXcgYyh7ZW5kOmZ1bmN0aW9uKCl7bCgpfSxjYW5jZWw6ZnVuY3Rpb24oKXtsKCEwKX19KTtnPUYoaCxhLGIsZCxmdW5jdGlvbihhKXtsKCExPT09YSl9KTtyZXR1cm4gZX0pfSk7cmV0dXJuIGd9ZnVuY3Rpb24gRyhhLGIsZCxlLGYpe3ZhciBnPXQoYSxiLGQsZSxmKTtpZigwPT09Zy5sZW5ndGgpe3ZhciBoLGs7XCJiZWZvcmVTZXRDbGFzc1wiPT09Zj8oaD10KGEsXCJyZW1vdmVDbGFzc1wiLGQsZSxcImJlZm9yZVJlbW92ZUNsYXNzXCIpLGs9dChhLFwiYWRkQ2xhc3NcIixkLGUsXCJiZWZvcmVBZGRDbGFzc1wiKSk6XCJzZXRDbGFzc1wiPT09XG5mJiYoaD10KGEsXCJyZW1vdmVDbGFzc1wiLGQsZSxcInJlbW92ZUNsYXNzXCIpLGs9dChhLFwiYWRkQ2xhc3NcIixkLGUsXCJhZGRDbGFzc1wiKSk7aCYmKGc9Zy5jb25jYXQoaCkpO2smJihnPWcuY29uY2F0KGspKX1pZigwIT09Zy5sZW5ndGgpcmV0dXJuIGZ1bmN0aW9uKGEpe3ZhciBiPVtdO2cubGVuZ3RoJiZxKGcsZnVuY3Rpb24oYSl7Yi5wdXNoKGEoKSl9KTtiLmxlbmd0aD9jLmFsbChiLGEpOmEoKTtyZXR1cm4gZnVuY3Rpb24oYSl7cShiLGZ1bmN0aW9uKGIpe2E/Yi5jYW5jZWwoKTpiLmVuZCgpfSl9fX0zPT09YXJndW1lbnRzLmxlbmd0aCYmb2EoZCkmJihzPWQsZD1udWxsKTtzPWlhKHMpO2R8fChkPWEuYXR0cihcImNsYXNzXCIpfHxcIlwiLHMuYWRkQ2xhc3MmJihkKz1cIiBcIitzLmFkZENsYXNzKSxzLnJlbW92ZUNsYXNzJiYoZCs9XCIgXCIrcy5yZW1vdmVDbGFzcykpO3ZhciBFPXMuYWRkQ2xhc3MsaD1zLnJlbW92ZUNsYXNzLEk9ZShkKSx1LEo7aWYoSS5sZW5ndGgpe3ZhciBmLEI7XCJsZWF2ZVwiPT1cbmI/KEI9XCJsZWF2ZVwiLGY9XCJhZnRlckxlYXZlXCIpOihCPVwiYmVmb3JlXCIrYi5jaGFyQXQoMCkudG9VcHBlckNhc2UoKStiLnN1YnN0cigxKSxmPWIpO1wiZW50ZXJcIiE9PWImJlwibW92ZVwiIT09YiYmKHU9RyhhLGIscyxJLEIpKTtKPUcoYSxiLHMsSSxmKX1pZih1fHxKKXJldHVybntzdGFydDpmdW5jdGlvbigpe2Z1bmN0aW9uIGIoYyl7Zj0hMDt4KCk7ZWEoYSxzKTtoLmNvbXBsZXRlKGMpfXZhciBkLGU9W107dSYmZS5wdXNoKGZ1bmN0aW9uKGEpe2Q9dShhKX0pO2UubGVuZ3RoP2UucHVzaChmdW5jdGlvbihhKXt4KCk7YSghMCl9KTp4KCk7SiYmZS5wdXNoKGZ1bmN0aW9uKGEpe2Q9SihhKX0pO3ZhciBmPSExLGg9bmV3IGMoe2VuZDpmdW5jdGlvbigpe2Z8fCgoZHx8TCkodm9pZCAwKSxiKHZvaWQgMCkpfSxjYW5jZWw6ZnVuY3Rpb24oKXtmfHwoKGR8fEwpKCEwKSxiKCEwKSl9fSk7Yy5jaGFpbihlLGIpO3JldHVybiBofX19fV19XSkucHJvdmlkZXIoXCIkJGFuaW1hdGVKc0RyaXZlclwiLFxuW1wiJCRhbmltYXRpb25Qcm92aWRlclwiLGZ1bmN0aW9uKGEpe2EuZHJpdmVycy5wdXNoKFwiJCRhbmltYXRlSnNEcml2ZXJcIik7dGhpcy4kZ2V0PVtcIiQkYW5pbWF0ZUpzXCIsXCIkJEFuaW1hdGVSdW5uZXJcIixmdW5jdGlvbihhLGMpe2Z1bmN0aW9uIGQoYyl7cmV0dXJuIGEoYy5lbGVtZW50LGMuZXZlbnQsYy5jbGFzc2VzLGMub3B0aW9ucyl9cmV0dXJuIGZ1bmN0aW9uKGEpe2lmKGEuZnJvbSYmYS50byl7dmFyIGI9ZChhLmZyb20pLHY9ZChhLnRvKTtpZihifHx2KXJldHVybntzdGFydDpmdW5jdGlvbigpe2Z1bmN0aW9uIGEoKXtyZXR1cm4gZnVuY3Rpb24oKXtxKGQsZnVuY3Rpb24oYSl7YS5lbmQoKX0pfX12YXIgZD1bXTtiJiZkLnB1c2goYi5zdGFydCgpKTt2JiZkLnB1c2godi5zdGFydCgpKTtjLmFsbChkLGZ1bmN0aW9uKGEpe2UuY29tcGxldGUoYSl9KTt2YXIgZT1uZXcgYyh7ZW5kOmEoKSxjYW5jZWw6YSgpfSk7cmV0dXJuIGV9fX1lbHNlIHJldHVybiBkKGEpfX1dfV0pfSkod2luZG93LFxud2luZG93LmFuZ3VsYXIpO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9YW5ndWxhci1hbmltYXRlLm1pbi5qcy5tYXBcblxuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9ib3dlcl9jb21wb25lbnRzL2FuZ3VsYXItYW5pbWF0ZS9hbmd1bGFyLWFuaW1hdGUubWluLmpzXG4gKiogbW9kdWxlIGlkID0gMzZcbiAqKiBtb2R1bGUgY2h1bmtzID0gMjRcbiAqKi8iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9");

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

	eval("/*\n AngularJS v1.4.6\n (c) 2010-2015 Google, Inc. http://angularjs.org\n License: MIT\n*/\n(function(p,c,n){'use strict';function l(b,a,g){var d=g.baseHref(),k=b[0];return function(b,e,f){var g,h;f=f||{};h=f.expires;g=c.isDefined(f.path)?f.path:d;c.isUndefined(e)&&(h=\"Thu, 01 Jan 1970 00:00:00 GMT\",e=\"\");c.isString(h)&&(h=new Date(h));e=encodeURIComponent(b)+\"=\"+encodeURIComponent(e);e=e+(g?\";path=\"+g:\"\")+(f.domain?\";domain=\"+f.domain:\"\");e+=h?\";expires=\"+h.toUTCString():\"\";e+=f.secure?\";secure\":\"\";f=e.length+1;4096<f&&a.warn(\"Cookie '\"+b+\"' possibly not set or overflowed because it was too large (\"+\nf+\" > 4096 bytes)!\");k.cookie=e}}c.module(\"ngCookies\",[\"ng\"]).provider(\"$cookies\",[function(){var b=this.defaults={};this.$get=[\"$$cookieReader\",\"$$cookieWriter\",function(a,g){return{get:function(d){return a()[d]},getObject:function(d){return(d=this.get(d))?c.fromJson(d):d},getAll:function(){return a()},put:function(d,a,m){g(d,a,m?c.extend({},b,m):b)},putObject:function(d,b,a){this.put(d,c.toJson(b),a)},remove:function(a,k){g(a,n,k?c.extend({},b,k):b)}}}]}]);c.module(\"ngCookies\").factory(\"$cookieStore\",\n[\"$cookies\",function(b){return{get:function(a){return b.getObject(a)},put:function(a,c){b.putObject(a,c)},remove:function(a){b.remove(a)}}}]);l.$inject=[\"$document\",\"$log\",\"$browser\"];c.module(\"ngCookies\").provider(\"$$cookieWriter\",function(){this.$get=l})})(window,window.angular);\n//# sourceMappingURL=angular-cookies.min.js.map\n\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzcuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ib3dlcl9jb21wb25lbnRzL2FuZ3VsYXItY29va2llcy9hbmd1bGFyLWNvb2tpZXMubWluLmpzP2I0MDUiXSwic291cmNlc0NvbnRlbnQiOlsiLypcbiBBbmd1bGFySlMgdjEuNC42XG4gKGMpIDIwMTAtMjAxNSBHb29nbGUsIEluYy4gaHR0cDovL2FuZ3VsYXJqcy5vcmdcbiBMaWNlbnNlOiBNSVRcbiovXG4oZnVuY3Rpb24ocCxjLG4peyd1c2Ugc3RyaWN0JztmdW5jdGlvbiBsKGIsYSxnKXt2YXIgZD1nLmJhc2VIcmVmKCksaz1iWzBdO3JldHVybiBmdW5jdGlvbihiLGUsZil7dmFyIGcsaDtmPWZ8fHt9O2g9Zi5leHBpcmVzO2c9Yy5pc0RlZmluZWQoZi5wYXRoKT9mLnBhdGg6ZDtjLmlzVW5kZWZpbmVkKGUpJiYoaD1cIlRodSwgMDEgSmFuIDE5NzAgMDA6MDA6MDAgR01UXCIsZT1cIlwiKTtjLmlzU3RyaW5nKGgpJiYoaD1uZXcgRGF0ZShoKSk7ZT1lbmNvZGVVUklDb21wb25lbnQoYikrXCI9XCIrZW5jb2RlVVJJQ29tcG9uZW50KGUpO2U9ZSsoZz9cIjtwYXRoPVwiK2c6XCJcIikrKGYuZG9tYWluP1wiO2RvbWFpbj1cIitmLmRvbWFpbjpcIlwiKTtlKz1oP1wiO2V4cGlyZXM9XCIraC50b1VUQ1N0cmluZygpOlwiXCI7ZSs9Zi5zZWN1cmU/XCI7c2VjdXJlXCI6XCJcIjtmPWUubGVuZ3RoKzE7NDA5NjxmJiZhLndhcm4oXCJDb29raWUgJ1wiK2IrXCInIHBvc3NpYmx5IG5vdCBzZXQgb3Igb3ZlcmZsb3dlZCBiZWNhdXNlIGl0IHdhcyB0b28gbGFyZ2UgKFwiK1xuZitcIiA+IDQwOTYgYnl0ZXMpIVwiKTtrLmNvb2tpZT1lfX1jLm1vZHVsZShcIm5nQ29va2llc1wiLFtcIm5nXCJdKS5wcm92aWRlcihcIiRjb29raWVzXCIsW2Z1bmN0aW9uKCl7dmFyIGI9dGhpcy5kZWZhdWx0cz17fTt0aGlzLiRnZXQ9W1wiJCRjb29raWVSZWFkZXJcIixcIiQkY29va2llV3JpdGVyXCIsZnVuY3Rpb24oYSxnKXtyZXR1cm57Z2V0OmZ1bmN0aW9uKGQpe3JldHVybiBhKClbZF19LGdldE9iamVjdDpmdW5jdGlvbihkKXtyZXR1cm4oZD10aGlzLmdldChkKSk/Yy5mcm9tSnNvbihkKTpkfSxnZXRBbGw6ZnVuY3Rpb24oKXtyZXR1cm4gYSgpfSxwdXQ6ZnVuY3Rpb24oZCxhLG0pe2coZCxhLG0/Yy5leHRlbmQoe30sYixtKTpiKX0scHV0T2JqZWN0OmZ1bmN0aW9uKGQsYixhKXt0aGlzLnB1dChkLGMudG9Kc29uKGIpLGEpfSxyZW1vdmU6ZnVuY3Rpb24oYSxrKXtnKGEsbixrP2MuZXh0ZW5kKHt9LGIsayk6Yil9fX1dfV0pO2MubW9kdWxlKFwibmdDb29raWVzXCIpLmZhY3RvcnkoXCIkY29va2llU3RvcmVcIixcbltcIiRjb29raWVzXCIsZnVuY3Rpb24oYil7cmV0dXJue2dldDpmdW5jdGlvbihhKXtyZXR1cm4gYi5nZXRPYmplY3QoYSl9LHB1dDpmdW5jdGlvbihhLGMpe2IucHV0T2JqZWN0KGEsYyl9LHJlbW92ZTpmdW5jdGlvbihhKXtiLnJlbW92ZShhKX19fV0pO2wuJGluamVjdD1bXCIkZG9jdW1lbnRcIixcIiRsb2dcIixcIiRicm93c2VyXCJdO2MubW9kdWxlKFwibmdDb29raWVzXCIpLnByb3ZpZGVyKFwiJCRjb29raWVXcml0ZXJcIixmdW5jdGlvbigpe3RoaXMuJGdldD1sfSl9KSh3aW5kb3csd2luZG93LmFuZ3VsYXIpO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9YW5ndWxhci1jb29raWVzLm1pbi5qcy5tYXBcblxuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9ib3dlcl9jb21wb25lbnRzL2FuZ3VsYXItY29va2llcy9hbmd1bGFyLWNvb2tpZXMubWluLmpzXG4gKiogbW9kdWxlIGlkID0gMzdcbiAqKiBtb2R1bGUgY2h1bmtzID0gMjRcbiAqKi8iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=");

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

	eval("/**\n * An Angular module that gives you access to the browsers local storage\n * @version v0.2.2 - 2015-05-29\n * @link https://github.com/grevory/angular-local-storage\n * @author grevory <greg@gregpike.ca>\n * @license MIT License, http://www.opensource.org/licenses/MIT\n */!function(a,b,c){\"use strict\";var d=b.isDefined,e=b.isUndefined,f=b.isNumber,g=b.isObject,h=b.isArray,i=b.extend,j=b.toJson,k=b.module(\"LocalStorageModule\",[]);k.provider(\"localStorageService\",function(){this.prefix=\"ls\",this.storageType=\"localStorage\",this.cookie={expiry:30,path:\"/\"},this.notify={setItem:!0,removeItem:!1},this.setPrefix=function(a){return this.prefix=a,this},this.setStorageType=function(a){return this.storageType=a,this},this.setStorageCookie=function(a,b){return this.cookie.expiry=a,this.cookie.path=b,this},this.setStorageCookieDomain=function(a){return this.cookie.domain=a,this},this.setNotify=function(a,b){return this.notify={setItem:a,removeItem:b},this},this.$get=[\"$rootScope\",\"$window\",\"$document\",\"$parse\",function(a,b,c,k){var l,m=this,n=m.prefix,o=m.cookie,p=m.notify,q=m.storageType;c?c[0]&&(c=c[0]):c=document,\".\"!==n.substr(-1)&&(n=n?n+\".\":\"\");var r=function(a){return n+a},s=function(){try{var c=q in b&&null!==b[q],d=r(\"__\"+Math.round(1e7*Math.random()));return c&&(l=b[q],l.setItem(d,\"\"),l.removeItem(d)),c}catch(e){return q=\"cookie\",a.$broadcast(\"LocalStorageModule.notification.error\",e.message),!1}}(),t=function(b,c){if(c=e(c)?null:j(c),!s||\"cookie\"===m.storageType)return s||a.$broadcast(\"LocalStorageModule.notification.warning\",\"LOCAL_STORAGE_NOT_SUPPORTED\"),p.setItem&&a.$broadcast(\"LocalStorageModule.notification.setitem\",{key:b,newvalue:c,storageType:\"cookie\"}),z(b,c);try{l&&l.setItem(r(b),c),p.setItem&&a.$broadcast(\"LocalStorageModule.notification.setitem\",{key:b,newvalue:c,storageType:m.storageType})}catch(d){return a.$broadcast(\"LocalStorageModule.notification.error\",d.message),z(b,c)}return!0},u=function(b){if(!s||\"cookie\"===m.storageType)return s||a.$broadcast(\"LocalStorageModule.notification.warning\",\"LOCAL_STORAGE_NOT_SUPPORTED\"),A(b);var c=l?l.getItem(r(b)):null;if(!c||\"null\"===c)return null;try{return JSON.parse(c)}catch(d){return c}},v=function(){var b,c;for(b=0;b<arguments.length;b++)if(c=arguments[b],s&&\"cookie\"!==m.storageType)try{l.removeItem(r(c)),p.removeItem&&a.$broadcast(\"LocalStorageModule.notification.removeitem\",{key:c,storageType:m.storageType})}catch(d){a.$broadcast(\"LocalStorageModule.notification.error\",d.message),B(c)}else s||a.$broadcast(\"LocalStorageModule.notification.warning\",\"LOCAL_STORAGE_NOT_SUPPORTED\"),p.removeItem&&a.$broadcast(\"LocalStorageModule.notification.removeitem\",{key:c,storageType:\"cookie\"}),B(c)},w=function(){if(!s)return a.$broadcast(\"LocalStorageModule.notification.warning\",\"LOCAL_STORAGE_NOT_SUPPORTED\"),!1;var b=n.length,c=[];for(var d in l)if(d.substr(0,b)===n)try{c.push(d.substr(b))}catch(e){return a.$broadcast(\"LocalStorageModule.notification.error\",e.Description),[]}return c},x=function(b){var c=n?new RegExp(\"^\"+n):new RegExp,d=b?new RegExp(b):new RegExp;if(!s||\"cookie\"===m.storageType)return s||a.$broadcast(\"LocalStorageModule.notification.warning\",\"LOCAL_STORAGE_NOT_SUPPORTED\"),C();var e=n.length;for(var f in l)if(c.test(f)&&d.test(f.substr(e)))try{v(f.substr(e))}catch(g){return a.$broadcast(\"LocalStorageModule.notification.error\",g.message),C()}return!0},y=function(){try{return b.navigator.cookieEnabled||\"cookie\"in c&&(c.cookie.length>0||(c.cookie=\"test\").indexOf.call(c.cookie,\"test\")>-1)}catch(d){return a.$broadcast(\"LocalStorageModule.notification.error\",d.message),!1}}(),z=function(b,d,i){if(e(d))return!1;if((h(d)||g(d))&&(d=j(d)),!y)return a.$broadcast(\"LocalStorageModule.notification.error\",\"COOKIES_NOT_SUPPORTED\"),!1;try{var k=\"\",l=new Date,m=\"\";if(null===d?(l.setTime(l.getTime()+-864e5),k=\"; expires=\"+l.toGMTString(),d=\"\"):f(i)&&0!==i?(l.setTime(l.getTime()+24*i*60*60*1e3),k=\"; expires=\"+l.toGMTString()):0!==o.expiry&&(l.setTime(l.getTime()+24*o.expiry*60*60*1e3),k=\"; expires=\"+l.toGMTString()),b){var n=\"; path=\"+o.path;o.domain&&(m=\"; domain=\"+o.domain),c.cookie=r(b)+\"=\"+encodeURIComponent(d)+k+n+m}}catch(p){return a.$broadcast(\"LocalStorageModule.notification.error\",p.message),!1}return!0},A=function(b){if(!y)return a.$broadcast(\"LocalStorageModule.notification.error\",\"COOKIES_NOT_SUPPORTED\"),!1;for(var d=c.cookie&&c.cookie.split(\";\")||[],e=0;e<d.length;e++){for(var f=d[e];\" \"===f.charAt(0);)f=f.substring(1,f.length);if(0===f.indexOf(r(b)+\"=\")){var g=decodeURIComponent(f.substring(n.length+b.length+1,f.length));try{return JSON.parse(g)}catch(h){return g}}}return null},B=function(a){z(a,null)},C=function(){for(var a=null,b=n.length,d=c.cookie.split(\";\"),e=0;e<d.length;e++){for(a=d[e];\" \"===a.charAt(0);)a=a.substring(1,a.length);var f=a.substring(b,a.indexOf(\"=\"));B(f)}},D=function(){return q},E=function(a,b,c,e){e=e||b;var f=u(e);return null===f&&d(c)?f=c:g(f)&&g(c)&&(f=i(c,f)),k(b).assign(a,f),a.$watch(b,function(a){t(e,a)},g(a[b]))},F=function(){for(var a=0,c=b[q],d=0;d<c.length;d++)0===c.key(d).indexOf(n)&&a++;return a};return{isSupported:s,getStorageType:D,set:t,add:t,get:u,keys:w,remove:v,clearAll:x,bind:E,deriveKey:r,length:F,cookie:{isSupported:y,set:z,add:z,get:A,remove:B,clearAll:C}}}]})}(window,window.angular);\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzguanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ib3dlcl9jb21wb25lbnRzL2FuZ3VsYXItbG9jYWwtc3RvcmFnZS9kaXN0L2FuZ3VsYXItbG9jYWwtc3RvcmFnZS5taW4uanM/MDUwOSJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEFuIEFuZ3VsYXIgbW9kdWxlIHRoYXQgZ2l2ZXMgeW91IGFjY2VzcyB0byB0aGUgYnJvd3NlcnMgbG9jYWwgc3RvcmFnZVxuICogQHZlcnNpb24gdjAuMi4yIC0gMjAxNS0wNS0yOVxuICogQGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL2dyZXZvcnkvYW5ndWxhci1sb2NhbC1zdG9yYWdlXG4gKiBAYXV0aG9yIGdyZXZvcnkgPGdyZWdAZ3JlZ3Bpa2UuY2E+XG4gKiBAbGljZW5zZSBNSVQgTGljZW5zZSwgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVRcbiAqLyFmdW5jdGlvbihhLGIsYyl7XCJ1c2Ugc3RyaWN0XCI7dmFyIGQ9Yi5pc0RlZmluZWQsZT1iLmlzVW5kZWZpbmVkLGY9Yi5pc051bWJlcixnPWIuaXNPYmplY3QsaD1iLmlzQXJyYXksaT1iLmV4dGVuZCxqPWIudG9Kc29uLGs9Yi5tb2R1bGUoXCJMb2NhbFN0b3JhZ2VNb2R1bGVcIixbXSk7ay5wcm92aWRlcihcImxvY2FsU3RvcmFnZVNlcnZpY2VcIixmdW5jdGlvbigpe3RoaXMucHJlZml4PVwibHNcIix0aGlzLnN0b3JhZ2VUeXBlPVwibG9jYWxTdG9yYWdlXCIsdGhpcy5jb29raWU9e2V4cGlyeTozMCxwYXRoOlwiL1wifSx0aGlzLm5vdGlmeT17c2V0SXRlbTohMCxyZW1vdmVJdGVtOiExfSx0aGlzLnNldFByZWZpeD1mdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5wcmVmaXg9YSx0aGlzfSx0aGlzLnNldFN0b3JhZ2VUeXBlPWZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLnN0b3JhZ2VUeXBlPWEsdGhpc30sdGhpcy5zZXRTdG9yYWdlQ29va2llPWZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMuY29va2llLmV4cGlyeT1hLHRoaXMuY29va2llLnBhdGg9Yix0aGlzfSx0aGlzLnNldFN0b3JhZ2VDb29raWVEb21haW49ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuY29va2llLmRvbWFpbj1hLHRoaXN9LHRoaXMuc2V0Tm90aWZ5PWZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMubm90aWZ5PXtzZXRJdGVtOmEscmVtb3ZlSXRlbTpifSx0aGlzfSx0aGlzLiRnZXQ9W1wiJHJvb3RTY29wZVwiLFwiJHdpbmRvd1wiLFwiJGRvY3VtZW50XCIsXCIkcGFyc2VcIixmdW5jdGlvbihhLGIsYyxrKXt2YXIgbCxtPXRoaXMsbj1tLnByZWZpeCxvPW0uY29va2llLHA9bS5ub3RpZnkscT1tLnN0b3JhZ2VUeXBlO2M/Y1swXSYmKGM9Y1swXSk6Yz1kb2N1bWVudCxcIi5cIiE9PW4uc3Vic3RyKC0xKSYmKG49bj9uK1wiLlwiOlwiXCIpO3ZhciByPWZ1bmN0aW9uKGEpe3JldHVybiBuK2F9LHM9ZnVuY3Rpb24oKXt0cnl7dmFyIGM9cSBpbiBiJiZudWxsIT09YltxXSxkPXIoXCJfX1wiK01hdGgucm91bmQoMWU3Kk1hdGgucmFuZG9tKCkpKTtyZXR1cm4gYyYmKGw9YltxXSxsLnNldEl0ZW0oZCxcIlwiKSxsLnJlbW92ZUl0ZW0oZCkpLGN9Y2F0Y2goZSl7cmV0dXJuIHE9XCJjb29raWVcIixhLiRicm9hZGNhc3QoXCJMb2NhbFN0b3JhZ2VNb2R1bGUubm90aWZpY2F0aW9uLmVycm9yXCIsZS5tZXNzYWdlKSwhMX19KCksdD1mdW5jdGlvbihiLGMpe2lmKGM9ZShjKT9udWxsOmooYyksIXN8fFwiY29va2llXCI9PT1tLnN0b3JhZ2VUeXBlKXJldHVybiBzfHxhLiRicm9hZGNhc3QoXCJMb2NhbFN0b3JhZ2VNb2R1bGUubm90aWZpY2F0aW9uLndhcm5pbmdcIixcIkxPQ0FMX1NUT1JBR0VfTk9UX1NVUFBPUlRFRFwiKSxwLnNldEl0ZW0mJmEuJGJyb2FkY2FzdChcIkxvY2FsU3RvcmFnZU1vZHVsZS5ub3RpZmljYXRpb24uc2V0aXRlbVwiLHtrZXk6YixuZXd2YWx1ZTpjLHN0b3JhZ2VUeXBlOlwiY29va2llXCJ9KSx6KGIsYyk7dHJ5e2wmJmwuc2V0SXRlbShyKGIpLGMpLHAuc2V0SXRlbSYmYS4kYnJvYWRjYXN0KFwiTG9jYWxTdG9yYWdlTW9kdWxlLm5vdGlmaWNhdGlvbi5zZXRpdGVtXCIse2tleTpiLG5ld3ZhbHVlOmMsc3RvcmFnZVR5cGU6bS5zdG9yYWdlVHlwZX0pfWNhdGNoKGQpe3JldHVybiBhLiRicm9hZGNhc3QoXCJMb2NhbFN0b3JhZ2VNb2R1bGUubm90aWZpY2F0aW9uLmVycm9yXCIsZC5tZXNzYWdlKSx6KGIsYyl9cmV0dXJuITB9LHU9ZnVuY3Rpb24oYil7aWYoIXN8fFwiY29va2llXCI9PT1tLnN0b3JhZ2VUeXBlKXJldHVybiBzfHxhLiRicm9hZGNhc3QoXCJMb2NhbFN0b3JhZ2VNb2R1bGUubm90aWZpY2F0aW9uLndhcm5pbmdcIixcIkxPQ0FMX1NUT1JBR0VfTk9UX1NVUFBPUlRFRFwiKSxBKGIpO3ZhciBjPWw/bC5nZXRJdGVtKHIoYikpOm51bGw7aWYoIWN8fFwibnVsbFwiPT09YylyZXR1cm4gbnVsbDt0cnl7cmV0dXJuIEpTT04ucGFyc2UoYyl9Y2F0Y2goZCl7cmV0dXJuIGN9fSx2PWZ1bmN0aW9uKCl7dmFyIGIsYztmb3IoYj0wO2I8YXJndW1lbnRzLmxlbmd0aDtiKyspaWYoYz1hcmd1bWVudHNbYl0scyYmXCJjb29raWVcIiE9PW0uc3RvcmFnZVR5cGUpdHJ5e2wucmVtb3ZlSXRlbShyKGMpKSxwLnJlbW92ZUl0ZW0mJmEuJGJyb2FkY2FzdChcIkxvY2FsU3RvcmFnZU1vZHVsZS5ub3RpZmljYXRpb24ucmVtb3ZlaXRlbVwiLHtrZXk6YyxzdG9yYWdlVHlwZTptLnN0b3JhZ2VUeXBlfSl9Y2F0Y2goZCl7YS4kYnJvYWRjYXN0KFwiTG9jYWxTdG9yYWdlTW9kdWxlLm5vdGlmaWNhdGlvbi5lcnJvclwiLGQubWVzc2FnZSksQihjKX1lbHNlIHN8fGEuJGJyb2FkY2FzdChcIkxvY2FsU3RvcmFnZU1vZHVsZS5ub3RpZmljYXRpb24ud2FybmluZ1wiLFwiTE9DQUxfU1RPUkFHRV9OT1RfU1VQUE9SVEVEXCIpLHAucmVtb3ZlSXRlbSYmYS4kYnJvYWRjYXN0KFwiTG9jYWxTdG9yYWdlTW9kdWxlLm5vdGlmaWNhdGlvbi5yZW1vdmVpdGVtXCIse2tleTpjLHN0b3JhZ2VUeXBlOlwiY29va2llXCJ9KSxCKGMpfSx3PWZ1bmN0aW9uKCl7aWYoIXMpcmV0dXJuIGEuJGJyb2FkY2FzdChcIkxvY2FsU3RvcmFnZU1vZHVsZS5ub3RpZmljYXRpb24ud2FybmluZ1wiLFwiTE9DQUxfU1RPUkFHRV9OT1RfU1VQUE9SVEVEXCIpLCExO3ZhciBiPW4ubGVuZ3RoLGM9W107Zm9yKHZhciBkIGluIGwpaWYoZC5zdWJzdHIoMCxiKT09PW4pdHJ5e2MucHVzaChkLnN1YnN0cihiKSl9Y2F0Y2goZSl7cmV0dXJuIGEuJGJyb2FkY2FzdChcIkxvY2FsU3RvcmFnZU1vZHVsZS5ub3RpZmljYXRpb24uZXJyb3JcIixlLkRlc2NyaXB0aW9uKSxbXX1yZXR1cm4gY30seD1mdW5jdGlvbihiKXt2YXIgYz1uP25ldyBSZWdFeHAoXCJeXCIrbik6bmV3IFJlZ0V4cCxkPWI/bmV3IFJlZ0V4cChiKTpuZXcgUmVnRXhwO2lmKCFzfHxcImNvb2tpZVwiPT09bS5zdG9yYWdlVHlwZSlyZXR1cm4gc3x8YS4kYnJvYWRjYXN0KFwiTG9jYWxTdG9yYWdlTW9kdWxlLm5vdGlmaWNhdGlvbi53YXJuaW5nXCIsXCJMT0NBTF9TVE9SQUdFX05PVF9TVVBQT1JURURcIiksQygpO3ZhciBlPW4ubGVuZ3RoO2Zvcih2YXIgZiBpbiBsKWlmKGMudGVzdChmKSYmZC50ZXN0KGYuc3Vic3RyKGUpKSl0cnl7dihmLnN1YnN0cihlKSl9Y2F0Y2goZyl7cmV0dXJuIGEuJGJyb2FkY2FzdChcIkxvY2FsU3RvcmFnZU1vZHVsZS5ub3RpZmljYXRpb24uZXJyb3JcIixnLm1lc3NhZ2UpLEMoKX1yZXR1cm4hMH0seT1mdW5jdGlvbigpe3RyeXtyZXR1cm4gYi5uYXZpZ2F0b3IuY29va2llRW5hYmxlZHx8XCJjb29raWVcImluIGMmJihjLmNvb2tpZS5sZW5ndGg+MHx8KGMuY29va2llPVwidGVzdFwiKS5pbmRleE9mLmNhbGwoYy5jb29raWUsXCJ0ZXN0XCIpPi0xKX1jYXRjaChkKXtyZXR1cm4gYS4kYnJvYWRjYXN0KFwiTG9jYWxTdG9yYWdlTW9kdWxlLm5vdGlmaWNhdGlvbi5lcnJvclwiLGQubWVzc2FnZSksITF9fSgpLHo9ZnVuY3Rpb24oYixkLGkpe2lmKGUoZCkpcmV0dXJuITE7aWYoKGgoZCl8fGcoZCkpJiYoZD1qKGQpKSwheSlyZXR1cm4gYS4kYnJvYWRjYXN0KFwiTG9jYWxTdG9yYWdlTW9kdWxlLm5vdGlmaWNhdGlvbi5lcnJvclwiLFwiQ09PS0lFU19OT1RfU1VQUE9SVEVEXCIpLCExO3RyeXt2YXIgaz1cIlwiLGw9bmV3IERhdGUsbT1cIlwiO2lmKG51bGw9PT1kPyhsLnNldFRpbWUobC5nZXRUaW1lKCkrLTg2NGU1KSxrPVwiOyBleHBpcmVzPVwiK2wudG9HTVRTdHJpbmcoKSxkPVwiXCIpOmYoaSkmJjAhPT1pPyhsLnNldFRpbWUobC5nZXRUaW1lKCkrMjQqaSo2MCo2MCoxZTMpLGs9XCI7IGV4cGlyZXM9XCIrbC50b0dNVFN0cmluZygpKTowIT09by5leHBpcnkmJihsLnNldFRpbWUobC5nZXRUaW1lKCkrMjQqby5leHBpcnkqNjAqNjAqMWUzKSxrPVwiOyBleHBpcmVzPVwiK2wudG9HTVRTdHJpbmcoKSksYil7dmFyIG49XCI7IHBhdGg9XCIrby5wYXRoO28uZG9tYWluJiYobT1cIjsgZG9tYWluPVwiK28uZG9tYWluKSxjLmNvb2tpZT1yKGIpK1wiPVwiK2VuY29kZVVSSUNvbXBvbmVudChkKStrK24rbX19Y2F0Y2gocCl7cmV0dXJuIGEuJGJyb2FkY2FzdChcIkxvY2FsU3RvcmFnZU1vZHVsZS5ub3RpZmljYXRpb24uZXJyb3JcIixwLm1lc3NhZ2UpLCExfXJldHVybiEwfSxBPWZ1bmN0aW9uKGIpe2lmKCF5KXJldHVybiBhLiRicm9hZGNhc3QoXCJMb2NhbFN0b3JhZ2VNb2R1bGUubm90aWZpY2F0aW9uLmVycm9yXCIsXCJDT09LSUVTX05PVF9TVVBQT1JURURcIiksITE7Zm9yKHZhciBkPWMuY29va2llJiZjLmNvb2tpZS5zcGxpdChcIjtcIil8fFtdLGU9MDtlPGQubGVuZ3RoO2UrKyl7Zm9yKHZhciBmPWRbZV07XCIgXCI9PT1mLmNoYXJBdCgwKTspZj1mLnN1YnN0cmluZygxLGYubGVuZ3RoKTtpZigwPT09Zi5pbmRleE9mKHIoYikrXCI9XCIpKXt2YXIgZz1kZWNvZGVVUklDb21wb25lbnQoZi5zdWJzdHJpbmcobi5sZW5ndGgrYi5sZW5ndGgrMSxmLmxlbmd0aCkpO3RyeXtyZXR1cm4gSlNPTi5wYXJzZShnKX1jYXRjaChoKXtyZXR1cm4gZ319fXJldHVybiBudWxsfSxCPWZ1bmN0aW9uKGEpe3ooYSxudWxsKX0sQz1mdW5jdGlvbigpe2Zvcih2YXIgYT1udWxsLGI9bi5sZW5ndGgsZD1jLmNvb2tpZS5zcGxpdChcIjtcIiksZT0wO2U8ZC5sZW5ndGg7ZSsrKXtmb3IoYT1kW2VdO1wiIFwiPT09YS5jaGFyQXQoMCk7KWE9YS5zdWJzdHJpbmcoMSxhLmxlbmd0aCk7dmFyIGY9YS5zdWJzdHJpbmcoYixhLmluZGV4T2YoXCI9XCIpKTtCKGYpfX0sRD1mdW5jdGlvbigpe3JldHVybiBxfSxFPWZ1bmN0aW9uKGEsYixjLGUpe2U9ZXx8Yjt2YXIgZj11KGUpO3JldHVybiBudWxsPT09ZiYmZChjKT9mPWM6ZyhmKSYmZyhjKSYmKGY9aShjLGYpKSxrKGIpLmFzc2lnbihhLGYpLGEuJHdhdGNoKGIsZnVuY3Rpb24oYSl7dChlLGEpfSxnKGFbYl0pKX0sRj1mdW5jdGlvbigpe2Zvcih2YXIgYT0wLGM9YltxXSxkPTA7ZDxjLmxlbmd0aDtkKyspMD09PWMua2V5KGQpLmluZGV4T2YobikmJmErKztyZXR1cm4gYX07cmV0dXJue2lzU3VwcG9ydGVkOnMsZ2V0U3RvcmFnZVR5cGU6RCxzZXQ6dCxhZGQ6dCxnZXQ6dSxrZXlzOncscmVtb3ZlOnYsY2xlYXJBbGw6eCxiaW5kOkUsZGVyaXZlS2V5OnIsbGVuZ3RoOkYsY29va2llOntpc1N1cHBvcnRlZDp5LHNldDp6LGFkZDp6LGdldDpBLHJlbW92ZTpCLGNsZWFyQWxsOkN9fX1dfSl9KHdpbmRvdyx3aW5kb3cuYW5ndWxhcik7XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL2Jvd2VyX2NvbXBvbmVudHMvYW5ndWxhci1sb2NhbC1zdG9yYWdlL2Rpc3QvYW5ndWxhci1sb2NhbC1zdG9yYWdlLm1pbi5qc1xuICoqIG1vZHVsZSBpZCA9IDM4XG4gKiogbW9kdWxlIGNodW5rcyA9IDI0XG4gKiovIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");

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

	eval("__webpack_require__(16)(__webpack_require__(40))\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzkuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9kZXBlbmRlbmNpZXMvaWdnLW1vbWVudC10aW1lem9uZS1kYXRhLmpzP2VjODYiXSwic291cmNlc0NvbnRlbnQiOlsicmVxdWlyZShcIiEhL2hvbWUvZGVwbG95ZXIvZGVwbG95bWVudC9qcy9ub2RlX21vZHVsZXMvc2NyaXB0LWxvYWRlci9hZGRTY3JpcHQuanNcIikocmVxdWlyZShcIiEhL2hvbWUvZGVwbG95ZXIvZGVwbG95bWVudC9qcy9ub2RlX21vZHVsZXMvcmF3LWxvYWRlci9pbmRleC5qcyEvaG9tZS9kZXBsb3llci9kZXBsb3ltZW50L2pzL25vZGVfbW9kdWxlcy9qc2hpbnQtbG9hZGVyL2luZGV4LmpzIS9ob21lL2RlcGxveWVyL2RlcGxveW1lbnQvanMvZGVwZW5kZW5jaWVzL2lnZy1tb21lbnQtdGltZXpvbmUtZGF0YS5qc1wiKSlcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9zY3JpcHQtbG9hZGVyIS4vZGVwZW5kZW5jaWVzL2lnZy1tb21lbnQtdGltZXpvbmUtZGF0YS5qc1xuICoqIG1vZHVsZSBpZCA9IDM5XG4gKiogbW9kdWxlIGNodW5rcyA9IDI0XG4gKiovIl0sIm1hcHBpbmdzIjoiQUFBQSIsInNvdXJjZVJvb3QiOiIifQ==");

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

	eval("module.exports = \"//http://momentjs.com/timezone/docs/#/data-loading/adding-a-zone/\\n//http://momentjs.com/downloads/moment-timezone-with-data.js\\n//The below packed zone string handles dates between 1918-03-31 and 2037-11-01.\\n\\nmoment.tz.add('America/Los_Angeles|PST PDT PWT PPT|80 70 70 70|010102301010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-261q0 1nX0 11B0 1nX0 SgN0 8x10 iy0 5Wp0 1Vb0 3dB0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0');\\n\"\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDAuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9kZXBlbmRlbmNpZXMvaWdnLW1vbWVudC10aW1lem9uZS1kYXRhLmpzP2EwM2UiXSwic291cmNlc0NvbnRlbnQiOlsibW9kdWxlLmV4cG9ydHMgPSBcIi8vaHR0cDovL21vbWVudGpzLmNvbS90aW1lem9uZS9kb2NzLyMvZGF0YS1sb2FkaW5nL2FkZGluZy1hLXpvbmUvXFxuLy9odHRwOi8vbW9tZW50anMuY29tL2Rvd25sb2Fkcy9tb21lbnQtdGltZXpvbmUtd2l0aC1kYXRhLmpzXFxuLy9UaGUgYmVsb3cgcGFja2VkIHpvbmUgc3RyaW5nIGhhbmRsZXMgZGF0ZXMgYmV0d2VlbiAxOTE4LTAzLTMxIGFuZCAyMDM3LTExLTAxLlxcblxcbm1vbWVudC50ei5hZGQoJ0FtZXJpY2EvTG9zX0FuZ2VsZXN8UFNUIFBEVCBQV1QgUFBUfDgwIDcwIDcwIDcwfDAxMDEwMjMwMTAxMDEwMTAxMDEwMTAxMDEwMTAxMDEwMTAxMDEwMTAxMDEwMTAxMDEwMTAxMDEwMTAxMDEwMTAxMDEwMTAxMDEwMTAxMDEwMTAxMDEwMTAxMDEwMTAxMDEwMTAxMDEwMTAxMDEwMTAxMDEwMTAxMDEwMTAxMDEwMTAxMDEwMTAxMDEwMTAxMDEwMTAxMDEwMTAxMDEwMTAxMDEwMTAxMDEwMTAxMDEwMTAxMDEwMTAxMHwtMjYxcTAgMW5YMCAxMUIwIDFuWDAgU2dOMCA4eDEwIGl5MCA1V3AwIDFWYjAgM2RCMCBXTDAgMXFOMCAxMXowIDFvMTAgMTF6MCAxbzEwIDExejAgMW8xMCAxMXowIDFvMTAgMTF6MCAxcU4wIDExejAgMW8xMCAxMXowIDFvMTAgMTF6MCAxbzEwIDExejAgMW8xMCAxMXowIDFxTjAgV0wwIDFxTjAgMWNMMCAxY04wIDFjTDAgMWNOMCAxY0wwIDFjTjAgMWZ6MCAxYTEwIDFmejAgMWNOMCAxY0wwIDFjTjAgMWNMMCAxY04wIDFjTDAgMWNOMCAxY0wwIDFjTjAgMWZ6MCAxY04wIDFjTDAgMWNOMCAxY0wwIHMxMCAxVnowIExCMCAxQlgwIDFjTjAgMWZ6MCAxYTEwIDFmejAgMWNOMCAxY0wwIDFjTjAgMWNMMCAxY04wIDFjTDAgMWNOMCAxY0wwIDFjTjAgMWZ6MCAxYTEwIDFmejAgMWNOMCAxY0wwIDFjTjAgMWNMMCAxY04wIDFjTDAgMTRwMCAxbGIwIDE0cDAgMW5YMCAxMUIwIDFuWDAgMTFCMCAxblgwIDE0cDAgMWxiMCAxNHAwIDFsYjAgMTRwMCAxblgwIDExQjAgMW5YMCAxMUIwIDFuWDAgMTRwMCAxbGIwIDE0cDAgMWxiMCAxNHAwIDFsYjAgMTRwMCAxblgwIDExQjAgMW5YMCAxMUIwIDFuWDAgMTRwMCAxbGIwIDE0cDAgMWxiMCAxNHAwIDFuWDAgMTFCMCAxblgwIDExQjAgMW5YMCBSZDAgMXpiMCBPcDAgMXpiMCBPcDAgMXpiMCBSZDAgMXpiMCBPcDAgMXpiMCBPcDAgMXpiMCBPcDAgMXpiMCBPcDAgMXpiMCBPcDAgMXpiMCBSZDAgMXpiMCBPcDAgMXpiMCBPcDAgMXpiMCBPcDAgMXpiMCBPcDAgMXpiMCBSZDAgMXpiMCBPcDAgMXpiMCBPcDAgMXpiMCBPcDAgMXpiMCBPcDAgMXpiMCBPcDAgMXpiMCBSZDAgMXpiMCBPcDAgMXpiMCBPcDAgMXpiMCBPcDAgMXpiMCBPcDAgMXpiMCBSZDAgMXpiMCBPcDAgMXpiMCBPcDAgMXpiMCBPcDAgMXpiMCBPcDAgMXpiMCBPcDAgMXpiMCcpO1xcblwiXG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vcmF3LWxvYWRlciEuL34vanNoaW50LWxvYWRlciEuL2RlcGVuZGVuY2llcy9pZ2ctbW9tZW50LXRpbWV6b25lLWRhdGEuanNcbiAqKiBtb2R1bGUgaWQgPSA0MFxuICoqIG1vZHVsZSBjaHVua3MgPSAyNFxuICoqLyJdLCJtYXBwaW5ncyI6IkFBQUEiLCJzb3VyY2VSb290IjoiIn0=");

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

	eval("__webpack_require__(16)(__webpack_require__(42))\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDEuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ib3dlcl9jb21wb25lbnRzL2FuZ3VsYXItbW9tZW50L2FuZ3VsYXItbW9tZW50Lm1pbi5qcz9lMmE4Il0sInNvdXJjZXNDb250ZW50IjpbInJlcXVpcmUoXCIhIS9ob21lL2RlcGxveWVyL2RlcGxveW1lbnQvanMvbm9kZV9tb2R1bGVzL3NjcmlwdC1sb2FkZXIvYWRkU2NyaXB0LmpzXCIpKHJlcXVpcmUoXCIhIS9ob21lL2RlcGxveWVyL2RlcGxveW1lbnQvanMvbm9kZV9tb2R1bGVzL3Jhdy1sb2FkZXIvaW5kZXguanMhL2hvbWUvZGVwbG95ZXIvZGVwbG95bWVudC9qcy9ib3dlcl9jb21wb25lbnRzL2FuZ3VsYXItbW9tZW50L2FuZ3VsYXItbW9tZW50Lm1pbi5qc1wiKSlcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9zY3JpcHQtbG9hZGVyIS4vYm93ZXJfY29tcG9uZW50cy9hbmd1bGFyLW1vbWVudC9hbmd1bGFyLW1vbWVudC5taW4uanNcbiAqKiBtb2R1bGUgaWQgPSA0MVxuICoqIG1vZHVsZSBjaHVua3MgPSAyNFxuICoqLyJdLCJtYXBwaW5ncyI6IkFBQUEiLCJzb3VyY2VSb290IjoiIn0=");

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

	eval("module.exports = \"\\\"format global\\\";\\\"deps angular\\\";\\\"deps moment\\\";!function(){\\\"use strict\\\";function a(a,b){return a.module(\\\"angularMoment\\\",[]).constant(\\\"angularMomentConfig\\\",{preprocess:null,timezone:\\\"\\\",format:null,statefulFilters:!0}).constant(\\\"moment\\\",b).constant(\\\"amTimeAgoConfig\\\",{withoutSuffix:!1,serverTime:null,titleFormat:null,fullDateThreshold:null,fullDateFormat:null}).directive(\\\"amTimeAgo\\\",[\\\"$window\\\",\\\"moment\\\",\\\"amMoment\\\",\\\"amTimeAgoConfig\\\",\\\"angularMomentConfig\\\",function(b,c,d,e,f){return function(g,h,i){function j(){var a;if(e.serverTime){var b=(new Date).getTime(),d=b-v+e.serverTime;a=c(d)}else a=c();return a}function k(){p&&(b.clearTimeout(p),p=null)}function l(a){var c=j().diff(a,\\\"day\\\"),d=t&&c>=t;if(h.text(d?a.format(u):a.from(j(),r)),s&&!h.attr(\\\"title\\\")&&h.attr(\\\"title\\\",a.local().format(s)),!d){var e=Math.abs(j().diff(a,\\\"minute\\\")),f=3600;1>e?f=1:60>e?f=30:180>e&&(f=300),p=b.setTimeout(function(){l(a)},1e3*f)}}function m(a){y&&h.attr(\\\"datetime\\\",a)}function n(){if(k(),o){var a=d.preprocessDate(o,w,q);l(a),m(a.toISOString())}}var o,p=null,q=f.format,r=e.withoutSuffix,s=e.titleFormat,t=e.fullDateThreshold,u=e.fullDateFormat,v=(new Date).getTime(),w=f.preprocess,x=i.amTimeAgo,y=\\\"TIME\\\"===h[0].nodeName.toUpperCase();g.$watch(x,function(a){return\\\"undefined\\\"==typeof a||null===a||\\\"\\\"===a?(k(),void(o&&(h.text(\\\"\\\"),m(\\\"\\\"),o=null))):(o=a,void n())}),a.isDefined(i.amWithoutSuffix)&&g.$watch(i.amWithoutSuffix,function(a){\\\"boolean\\\"==typeof a?(r=a,n()):r=e.withoutSuffix}),i.$observe(\\\"amFormat\\\",function(a){\\\"undefined\\\"!=typeof a&&(q=a,n())}),i.$observe(\\\"amPreprocess\\\",function(a){w=a,n()}),i.$observe(\\\"amFullDateThreshold\\\",function(a){t=a,n()}),i.$observe(\\\"amFullDateFormat\\\",function(a){u=a,n()}),g.$on(\\\"$destroy\\\",function(){k()}),g.$on(\\\"amMoment:localeChanged\\\",function(){n()})}}]).service(\\\"amMoment\\\",[\\\"moment\\\",\\\"$rootScope\\\",\\\"$log\\\",\\\"angularMomentConfig\\\",function(b,c,d,e){this.preprocessors={utc:b.utc,unix:b.unix},this.changeLocale=function(d,e){var f=b.locale(d,e);return a.isDefined(d)&&c.$broadcast(\\\"amMoment:localeChanged\\\"),f},this.changeTimezone=function(a){e.timezone=a,c.$broadcast(\\\"amMoment:timezoneChanged\\\")},this.preprocessDate=function(c,f,g){return a.isUndefined(f)&&(f=e.preprocess),this.preprocessors[f]?this.preprocessors[f](c,g):(f&&d.warn(\\\"angular-moment: Ignoring unsupported value for preprocess: \\\"+f),!isNaN(parseFloat(c))&&isFinite(c)?b(parseInt(c,10)):b(c,g))},this.applyTimezone=function(a){var b=e.timezone;return a&&b&&(a.tz?a=a.tz(b):d.warn(\\\"angular-moment: timezone specified but moment.tz() is undefined. Did you forget to include moment-timezone.js?\\\")),a}}]).filter(\\\"amCalendar\\\",[\\\"moment\\\",\\\"amMoment\\\",\\\"angularMomentConfig\\\",function(a,b,c){function d(c,d){if(\\\"undefined\\\"==typeof c||null===c)return\\\"\\\";c=b.preprocessDate(c,d);var e=a(c);return e.isValid()?b.applyTimezone(e).calendar():\\\"\\\"}return d.$stateful=c.statefulFilters,d}]).filter(\\\"amDifference\\\",[\\\"moment\\\",\\\"amMoment\\\",\\\"angularMomentConfig\\\",function(a,b,c){function d(c,d,e,f,g,h){if(\\\"undefined\\\"==typeof c||null===c)return\\\"\\\";c=b.preprocessDate(c,g);var i=a(c);if(!i.isValid())return\\\"\\\";var j;if(\\\"undefined\\\"==typeof d||null===d)j=a();else if(d=b.preprocessDate(d,h),j=a(d),!j.isValid())return\\\"\\\";return b.applyTimezone(i).diff(b.applyTimezone(j),e,f)}return d.$stateful=c.statefulFilters,d}]).filter(\\\"amDateFormat\\\",[\\\"moment\\\",\\\"amMoment\\\",\\\"angularMomentConfig\\\",function(a,b,c){function d(c,d,e){if(\\\"undefined\\\"==typeof c||null===c)return\\\"\\\";c=b.preprocessDate(c,e);var f=a(c);return f.isValid()?b.applyTimezone(f).format(d):\\\"\\\"}return d.$stateful=c.statefulFilters,d}]).filter(\\\"amDurationFormat\\\",[\\\"moment\\\",\\\"angularMomentConfig\\\",function(a,b){function c(b,c,d){return\\\"undefined\\\"==typeof b||null===b?\\\"\\\":a.duration(b,c).humanize(d)}return c.$stateful=b.statefulFilters,c}]).filter(\\\"amTimeAgo\\\",[\\\"moment\\\",\\\"amMoment\\\",\\\"angularMomentConfig\\\",function(a,b,c){function d(c,d,e){if(\\\"undefined\\\"==typeof c||null===c)return\\\"\\\";c=b.preprocessDate(c,d);var f=a(c);return f.isValid()?b.applyTimezone(f).fromNow(e):\\\"\\\"}return d.$stateful=c.statefulFilters,d}])}\\\"function\\\"==typeof define&&define.amd?define([\\\"angular\\\",\\\"moment\\\"],a):\\\"undefined\\\"!=typeof module&&module&&module.exports?(a(angular,require(\\\"moment\\\")),module.exports=\\\"angularMoment\\\"):a(angular,window.moment)}();\\n//# sourceMappingURL=angular-moment.min.js.map\"\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDIuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ib3dlcl9jb21wb25lbnRzL2FuZ3VsYXItbW9tZW50L2FuZ3VsYXItbW9tZW50Lm1pbi5qcz8yYTI2Il0sInNvdXJjZXNDb250ZW50IjpbIm1vZHVsZS5leHBvcnRzID0gXCJcXFwiZm9ybWF0IGdsb2JhbFxcXCI7XFxcImRlcHMgYW5ndWxhclxcXCI7XFxcImRlcHMgbW9tZW50XFxcIjshZnVuY3Rpb24oKXtcXFwidXNlIHN0cmljdFxcXCI7ZnVuY3Rpb24gYShhLGIpe3JldHVybiBhLm1vZHVsZShcXFwiYW5ndWxhck1vbWVudFxcXCIsW10pLmNvbnN0YW50KFxcXCJhbmd1bGFyTW9tZW50Q29uZmlnXFxcIix7cHJlcHJvY2VzczpudWxsLHRpbWV6b25lOlxcXCJcXFwiLGZvcm1hdDpudWxsLHN0YXRlZnVsRmlsdGVyczohMH0pLmNvbnN0YW50KFxcXCJtb21lbnRcXFwiLGIpLmNvbnN0YW50KFxcXCJhbVRpbWVBZ29Db25maWdcXFwiLHt3aXRob3V0U3VmZml4OiExLHNlcnZlclRpbWU6bnVsbCx0aXRsZUZvcm1hdDpudWxsLGZ1bGxEYXRlVGhyZXNob2xkOm51bGwsZnVsbERhdGVGb3JtYXQ6bnVsbH0pLmRpcmVjdGl2ZShcXFwiYW1UaW1lQWdvXFxcIixbXFxcIiR3aW5kb3dcXFwiLFxcXCJtb21lbnRcXFwiLFxcXCJhbU1vbWVudFxcXCIsXFxcImFtVGltZUFnb0NvbmZpZ1xcXCIsXFxcImFuZ3VsYXJNb21lbnRDb25maWdcXFwiLGZ1bmN0aW9uKGIsYyxkLGUsZil7cmV0dXJuIGZ1bmN0aW9uKGcsaCxpKXtmdW5jdGlvbiBqKCl7dmFyIGE7aWYoZS5zZXJ2ZXJUaW1lKXt2YXIgYj0obmV3IERhdGUpLmdldFRpbWUoKSxkPWItditlLnNlcnZlclRpbWU7YT1jKGQpfWVsc2UgYT1jKCk7cmV0dXJuIGF9ZnVuY3Rpb24gaygpe3AmJihiLmNsZWFyVGltZW91dChwKSxwPW51bGwpfWZ1bmN0aW9uIGwoYSl7dmFyIGM9aigpLmRpZmYoYSxcXFwiZGF5XFxcIiksZD10JiZjPj10O2lmKGgudGV4dChkP2EuZm9ybWF0KHUpOmEuZnJvbShqKCkscikpLHMmJiFoLmF0dHIoXFxcInRpdGxlXFxcIikmJmguYXR0cihcXFwidGl0bGVcXFwiLGEubG9jYWwoKS5mb3JtYXQocykpLCFkKXt2YXIgZT1NYXRoLmFicyhqKCkuZGlmZihhLFxcXCJtaW51dGVcXFwiKSksZj0zNjAwOzE+ZT9mPTE6NjA+ZT9mPTMwOjE4MD5lJiYoZj0zMDApLHA9Yi5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7bChhKX0sMWUzKmYpfX1mdW5jdGlvbiBtKGEpe3kmJmguYXR0cihcXFwiZGF0ZXRpbWVcXFwiLGEpfWZ1bmN0aW9uIG4oKXtpZihrKCksbyl7dmFyIGE9ZC5wcmVwcm9jZXNzRGF0ZShvLHcscSk7bChhKSxtKGEudG9JU09TdHJpbmcoKSl9fXZhciBvLHA9bnVsbCxxPWYuZm9ybWF0LHI9ZS53aXRob3V0U3VmZml4LHM9ZS50aXRsZUZvcm1hdCx0PWUuZnVsbERhdGVUaHJlc2hvbGQsdT1lLmZ1bGxEYXRlRm9ybWF0LHY9KG5ldyBEYXRlKS5nZXRUaW1lKCksdz1mLnByZXByb2Nlc3MseD1pLmFtVGltZUFnbyx5PVxcXCJUSU1FXFxcIj09PWhbMF0ubm9kZU5hbWUudG9VcHBlckNhc2UoKTtnLiR3YXRjaCh4LGZ1bmN0aW9uKGEpe3JldHVyblxcXCJ1bmRlZmluZWRcXFwiPT10eXBlb2YgYXx8bnVsbD09PWF8fFxcXCJcXFwiPT09YT8oaygpLHZvaWQobyYmKGgudGV4dChcXFwiXFxcIiksbShcXFwiXFxcIiksbz1udWxsKSkpOihvPWEsdm9pZCBuKCkpfSksYS5pc0RlZmluZWQoaS5hbVdpdGhvdXRTdWZmaXgpJiZnLiR3YXRjaChpLmFtV2l0aG91dFN1ZmZpeCxmdW5jdGlvbihhKXtcXFwiYm9vbGVhblxcXCI9PXR5cGVvZiBhPyhyPWEsbigpKTpyPWUud2l0aG91dFN1ZmZpeH0pLGkuJG9ic2VydmUoXFxcImFtRm9ybWF0XFxcIixmdW5jdGlvbihhKXtcXFwidW5kZWZpbmVkXFxcIiE9dHlwZW9mIGEmJihxPWEsbigpKX0pLGkuJG9ic2VydmUoXFxcImFtUHJlcHJvY2Vzc1xcXCIsZnVuY3Rpb24oYSl7dz1hLG4oKX0pLGkuJG9ic2VydmUoXFxcImFtRnVsbERhdGVUaHJlc2hvbGRcXFwiLGZ1bmN0aW9uKGEpe3Q9YSxuKCl9KSxpLiRvYnNlcnZlKFxcXCJhbUZ1bGxEYXRlRm9ybWF0XFxcIixmdW5jdGlvbihhKXt1PWEsbigpfSksZy4kb24oXFxcIiRkZXN0cm95XFxcIixmdW5jdGlvbigpe2soKX0pLGcuJG9uKFxcXCJhbU1vbWVudDpsb2NhbGVDaGFuZ2VkXFxcIixmdW5jdGlvbigpe24oKX0pfX1dKS5zZXJ2aWNlKFxcXCJhbU1vbWVudFxcXCIsW1xcXCJtb21lbnRcXFwiLFxcXCIkcm9vdFNjb3BlXFxcIixcXFwiJGxvZ1xcXCIsXFxcImFuZ3VsYXJNb21lbnRDb25maWdcXFwiLGZ1bmN0aW9uKGIsYyxkLGUpe3RoaXMucHJlcHJvY2Vzc29ycz17dXRjOmIudXRjLHVuaXg6Yi51bml4fSx0aGlzLmNoYW5nZUxvY2FsZT1mdW5jdGlvbihkLGUpe3ZhciBmPWIubG9jYWxlKGQsZSk7cmV0dXJuIGEuaXNEZWZpbmVkKGQpJiZjLiRicm9hZGNhc3QoXFxcImFtTW9tZW50OmxvY2FsZUNoYW5nZWRcXFwiKSxmfSx0aGlzLmNoYW5nZVRpbWV6b25lPWZ1bmN0aW9uKGEpe2UudGltZXpvbmU9YSxjLiRicm9hZGNhc3QoXFxcImFtTW9tZW50OnRpbWV6b25lQ2hhbmdlZFxcXCIpfSx0aGlzLnByZXByb2Nlc3NEYXRlPWZ1bmN0aW9uKGMsZixnKXtyZXR1cm4gYS5pc1VuZGVmaW5lZChmKSYmKGY9ZS5wcmVwcm9jZXNzKSx0aGlzLnByZXByb2Nlc3NvcnNbZl0/dGhpcy5wcmVwcm9jZXNzb3JzW2ZdKGMsZyk6KGYmJmQud2FybihcXFwiYW5ndWxhci1tb21lbnQ6IElnbm9yaW5nIHVuc3VwcG9ydGVkIHZhbHVlIGZvciBwcmVwcm9jZXNzOiBcXFwiK2YpLCFpc05hTihwYXJzZUZsb2F0KGMpKSYmaXNGaW5pdGUoYyk/YihwYXJzZUludChjLDEwKSk6YihjLGcpKX0sdGhpcy5hcHBseVRpbWV6b25lPWZ1bmN0aW9uKGEpe3ZhciBiPWUudGltZXpvbmU7cmV0dXJuIGEmJmImJihhLnR6P2E9YS50eihiKTpkLndhcm4oXFxcImFuZ3VsYXItbW9tZW50OiB0aW1lem9uZSBzcGVjaWZpZWQgYnV0IG1vbWVudC50eigpIGlzIHVuZGVmaW5lZC4gRGlkIHlvdSBmb3JnZXQgdG8gaW5jbHVkZSBtb21lbnQtdGltZXpvbmUuanM/XFxcIikpLGF9fV0pLmZpbHRlcihcXFwiYW1DYWxlbmRhclxcXCIsW1xcXCJtb21lbnRcXFwiLFxcXCJhbU1vbWVudFxcXCIsXFxcImFuZ3VsYXJNb21lbnRDb25maWdcXFwiLGZ1bmN0aW9uKGEsYixjKXtmdW5jdGlvbiBkKGMsZCl7aWYoXFxcInVuZGVmaW5lZFxcXCI9PXR5cGVvZiBjfHxudWxsPT09YylyZXR1cm5cXFwiXFxcIjtjPWIucHJlcHJvY2Vzc0RhdGUoYyxkKTt2YXIgZT1hKGMpO3JldHVybiBlLmlzVmFsaWQoKT9iLmFwcGx5VGltZXpvbmUoZSkuY2FsZW5kYXIoKTpcXFwiXFxcIn1yZXR1cm4gZC4kc3RhdGVmdWw9Yy5zdGF0ZWZ1bEZpbHRlcnMsZH1dKS5maWx0ZXIoXFxcImFtRGlmZmVyZW5jZVxcXCIsW1xcXCJtb21lbnRcXFwiLFxcXCJhbU1vbWVudFxcXCIsXFxcImFuZ3VsYXJNb21lbnRDb25maWdcXFwiLGZ1bmN0aW9uKGEsYixjKXtmdW5jdGlvbiBkKGMsZCxlLGYsZyxoKXtpZihcXFwidW5kZWZpbmVkXFxcIj09dHlwZW9mIGN8fG51bGw9PT1jKXJldHVyblxcXCJcXFwiO2M9Yi5wcmVwcm9jZXNzRGF0ZShjLGcpO3ZhciBpPWEoYyk7aWYoIWkuaXNWYWxpZCgpKXJldHVyblxcXCJcXFwiO3ZhciBqO2lmKFxcXCJ1bmRlZmluZWRcXFwiPT10eXBlb2YgZHx8bnVsbD09PWQpaj1hKCk7ZWxzZSBpZihkPWIucHJlcHJvY2Vzc0RhdGUoZCxoKSxqPWEoZCksIWouaXNWYWxpZCgpKXJldHVyblxcXCJcXFwiO3JldHVybiBiLmFwcGx5VGltZXpvbmUoaSkuZGlmZihiLmFwcGx5VGltZXpvbmUoaiksZSxmKX1yZXR1cm4gZC4kc3RhdGVmdWw9Yy5zdGF0ZWZ1bEZpbHRlcnMsZH1dKS5maWx0ZXIoXFxcImFtRGF0ZUZvcm1hdFxcXCIsW1xcXCJtb21lbnRcXFwiLFxcXCJhbU1vbWVudFxcXCIsXFxcImFuZ3VsYXJNb21lbnRDb25maWdcXFwiLGZ1bmN0aW9uKGEsYixjKXtmdW5jdGlvbiBkKGMsZCxlKXtpZihcXFwidW5kZWZpbmVkXFxcIj09dHlwZW9mIGN8fG51bGw9PT1jKXJldHVyblxcXCJcXFwiO2M9Yi5wcmVwcm9jZXNzRGF0ZShjLGUpO3ZhciBmPWEoYyk7cmV0dXJuIGYuaXNWYWxpZCgpP2IuYXBwbHlUaW1lem9uZShmKS5mb3JtYXQoZCk6XFxcIlxcXCJ9cmV0dXJuIGQuJHN0YXRlZnVsPWMuc3RhdGVmdWxGaWx0ZXJzLGR9XSkuZmlsdGVyKFxcXCJhbUR1cmF0aW9uRm9ybWF0XFxcIixbXFxcIm1vbWVudFxcXCIsXFxcImFuZ3VsYXJNb21lbnRDb25maWdcXFwiLGZ1bmN0aW9uKGEsYil7ZnVuY3Rpb24gYyhiLGMsZCl7cmV0dXJuXFxcInVuZGVmaW5lZFxcXCI9PXR5cGVvZiBifHxudWxsPT09Yj9cXFwiXFxcIjphLmR1cmF0aW9uKGIsYykuaHVtYW5pemUoZCl9cmV0dXJuIGMuJHN0YXRlZnVsPWIuc3RhdGVmdWxGaWx0ZXJzLGN9XSkuZmlsdGVyKFxcXCJhbVRpbWVBZ29cXFwiLFtcXFwibW9tZW50XFxcIixcXFwiYW1Nb21lbnRcXFwiLFxcXCJhbmd1bGFyTW9tZW50Q29uZmlnXFxcIixmdW5jdGlvbihhLGIsYyl7ZnVuY3Rpb24gZChjLGQsZSl7aWYoXFxcInVuZGVmaW5lZFxcXCI9PXR5cGVvZiBjfHxudWxsPT09YylyZXR1cm5cXFwiXFxcIjtjPWIucHJlcHJvY2Vzc0RhdGUoYyxkKTt2YXIgZj1hKGMpO3JldHVybiBmLmlzVmFsaWQoKT9iLmFwcGx5VGltZXpvbmUoZikuZnJvbU5vdyhlKTpcXFwiXFxcIn1yZXR1cm4gZC4kc3RhdGVmdWw9Yy5zdGF0ZWZ1bEZpbHRlcnMsZH1dKX1cXFwiZnVuY3Rpb25cXFwiPT10eXBlb2YgZGVmaW5lJiZkZWZpbmUuYW1kP2RlZmluZShbXFxcImFuZ3VsYXJcXFwiLFxcXCJtb21lbnRcXFwiXSxhKTpcXFwidW5kZWZpbmVkXFxcIiE9dHlwZW9mIG1vZHVsZSYmbW9kdWxlJiZtb2R1bGUuZXhwb3J0cz8oYShhbmd1bGFyLHJlcXVpcmUoXFxcIm1vbWVudFxcXCIpKSxtb2R1bGUuZXhwb3J0cz1cXFwiYW5ndWxhck1vbWVudFxcXCIpOmEoYW5ndWxhcix3aW5kb3cubW9tZW50KX0oKTtcXG4vLyMgc291cmNlTWFwcGluZ1VSTD1hbmd1bGFyLW1vbWVudC5taW4uanMubWFwXCJcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9yYXctbG9hZGVyIS4vYm93ZXJfY29tcG9uZW50cy9hbmd1bGFyLW1vbWVudC9hbmd1bGFyLW1vbWVudC5taW4uanNcbiAqKiBtb2R1bGUgaWQgPSA0MlxuICoqIG1vZHVsZSBjaHVua3MgPSAyNFxuICoqLyJdLCJtYXBwaW5ncyI6IkFBQUEiLCJzb3VyY2VSb290IjoiIn0=");

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

	eval("/*\n AngularJS v1.4.6\n (c) 2010-2015 Google, Inc. http://angularjs.org\n License: MIT\n*/\n(function(n,h,p){'use strict';function E(a){var f=[];r(f,h.noop).chars(a);return f.join(\"\")}function g(a,f){var d={},c=a.split(\",\"),b;for(b=0;b<c.length;b++)d[f?h.lowercase(c[b]):c[b]]=!0;return d}function F(a,f){function d(a,b,d,l){b=h.lowercase(b);if(s[b])for(;e.last()&&t[e.last()];)c(\"\",e.last());u[b]&&e.last()==b&&c(\"\",b);(l=v[b]||!!l)||e.push(b);var m={};d.replace(G,function(b,a,f,c,d){m[a]=q(f||c||d||\"\")});f.start&&f.start(b,m,l)}function c(b,a){var c=0,d;if(a=h.lowercase(a))for(c=e.length-\n1;0<=c&&e[c]!=a;c--);if(0<=c){for(d=e.length-1;d>=c;d--)f.end&&f.end(e[d]);e.length=c}}\"string\"!==typeof a&&(a=null===a||\"undefined\"===typeof a?\"\":\"\"+a);var b,k,e=[],m=a,l;for(e.last=function(){return e[e.length-1]};a;){l=\"\";k=!0;if(e.last()&&w[e.last()])a=a.replace(new RegExp(\"([\\\\W\\\\w]*)<\\\\s*\\\\/\\\\s*\"+e.last()+\"[^>]*>\",\"i\"),function(a,b){b=b.replace(H,\"$1\").replace(I,\"$1\");f.chars&&f.chars(q(b));return\"\"}),c(\"\",e.last());else{if(0===a.indexOf(\"\\x3c!--\"))b=a.indexOf(\"--\",4),0<=b&&a.lastIndexOf(\"--\\x3e\",\nb)===b&&(f.comment&&f.comment(a.substring(4,b)),a=a.substring(b+3),k=!1);else if(x.test(a)){if(b=a.match(x))a=a.replace(b[0],\"\"),k=!1}else if(J.test(a)){if(b=a.match(y))a=a.substring(b[0].length),b[0].replace(y,c),k=!1}else K.test(a)&&((b=a.match(z))?(b[4]&&(a=a.substring(b[0].length),b[0].replace(z,d)),k=!1):(l+=\"<\",a=a.substring(1)));k&&(b=a.indexOf(\"<\"),l+=0>b?a:a.substring(0,b),a=0>b?\"\":a.substring(b),f.chars&&f.chars(q(l)))}if(a==m)throw L(\"badparse\",a);m=a}c()}function q(a){if(!a)return\"\";A.innerHTML=\na.replace(/</g,\"&lt;\");return A.textContent}function B(a){return a.replace(/&/g,\"&amp;\").replace(M,function(a){var d=a.charCodeAt(0);a=a.charCodeAt(1);return\"&#\"+(1024*(d-55296)+(a-56320)+65536)+\";\"}).replace(N,function(a){return\"&#\"+a.charCodeAt(0)+\";\"}).replace(/</g,\"&lt;\").replace(/>/g,\"&gt;\")}function r(a,f){var d=!1,c=h.bind(a,a.push);return{start:function(a,k,e){a=h.lowercase(a);!d&&w[a]&&(d=a);d||!0!==C[a]||(c(\"<\"),c(a),h.forEach(k,function(d,e){var k=h.lowercase(e),g=\"img\"===a&&\"src\"===k||\n\"background\"===k;!0!==O[k]||!0===D[k]&&!f(d,g)||(c(\" \"),c(e),c('=\"'),c(B(d)),c('\"'))}),c(e?\"/>\":\">\"))},end:function(a){a=h.lowercase(a);d||!0!==C[a]||(c(\"</\"),c(a),c(\">\"));a==d&&(d=!1)},chars:function(a){d||c(B(a))}}}var L=h.$$minErr(\"$sanitize\"),z=/^<((?:[a-zA-Z])[\\w:-]*)((?:\\s+[\\w:-]+(?:\\s*=\\s*(?:(?:\"[^\"]*\")|(?:'[^']*')|[^>\\s]+))?)*)\\s*(\\/?)\\s*(>?)/,y=/^<\\/\\s*([\\w:-]+)[^>]*>/,G=/([\\w:-]+)(?:\\s*=\\s*(?:(?:\"((?:[^\"])*)\")|(?:'((?:[^'])*)')|([^>\\s]+)))?/g,K=/^</,J=/^<\\//,H=/\\x3c!--(.*?)--\\x3e/g,x=/<!DOCTYPE([^>]*?)>/i,\nI=/<!\\[CDATA\\[(.*?)]]\\x3e/g,M=/[\\uD800-\\uDBFF][\\uDC00-\\uDFFF]/g,N=/([^\\#-~| |!])/g,v=g(\"area,br,col,hr,img,wbr\");n=g(\"colgroup,dd,dt,li,p,tbody,td,tfoot,th,thead,tr\");p=g(\"rp,rt\");var u=h.extend({},p,n),s=h.extend({},n,g(\"address,article,aside,blockquote,caption,center,del,dir,div,dl,figure,figcaption,footer,h1,h2,h3,h4,h5,h6,header,hgroup,hr,ins,map,menu,nav,ol,pre,script,section,table,ul\")),t=h.extend({},p,g(\"a,abbr,acronym,b,bdi,bdo,big,br,cite,code,del,dfn,em,font,i,img,ins,kbd,label,map,mark,q,ruby,rp,rt,s,samp,small,span,strike,strong,sub,sup,time,tt,u,var\"));\nn=g(\"circle,defs,desc,ellipse,font-face,font-face-name,font-face-src,g,glyph,hkern,image,linearGradient,line,marker,metadata,missing-glyph,mpath,path,polygon,polyline,radialGradient,rect,stop,svg,switch,text,title,tspan,use\");var w=g(\"script,style\"),C=h.extend({},v,s,t,u,n),D=g(\"background,cite,href,longdesc,src,usemap,xlink:href\");n=g(\"abbr,align,alt,axis,bgcolor,border,cellpadding,cellspacing,class,clear,color,cols,colspan,compact,coords,dir,face,headers,height,hreflang,hspace,ismap,lang,language,nohref,nowrap,rel,rev,rows,rowspan,rules,scope,scrolling,shape,size,span,start,summary,tabindex,target,title,type,valign,value,vspace,width\");\np=g(\"accent-height,accumulate,additive,alphabetic,arabic-form,ascent,baseProfile,bbox,begin,by,calcMode,cap-height,class,color,color-rendering,content,cx,cy,d,dx,dy,descent,display,dur,end,fill,fill-rule,font-family,font-size,font-stretch,font-style,font-variant,font-weight,from,fx,fy,g1,g2,glyph-name,gradientUnits,hanging,height,horiz-adv-x,horiz-origin-x,ideographic,k,keyPoints,keySplines,keyTimes,lang,marker-end,marker-mid,marker-start,markerHeight,markerUnits,markerWidth,mathematical,max,min,offset,opacity,orient,origin,overline-position,overline-thickness,panose-1,path,pathLength,points,preserveAspectRatio,r,refX,refY,repeatCount,repeatDur,requiredExtensions,requiredFeatures,restart,rotate,rx,ry,slope,stemh,stemv,stop-color,stop-opacity,strikethrough-position,strikethrough-thickness,stroke,stroke-dasharray,stroke-dashoffset,stroke-linecap,stroke-linejoin,stroke-miterlimit,stroke-opacity,stroke-width,systemLanguage,target,text-anchor,to,transform,type,u1,u2,underline-position,underline-thickness,unicode,unicode-range,units-per-em,values,version,viewBox,visibility,width,widths,x,x-height,x1,x2,xlink:actuate,xlink:arcrole,xlink:role,xlink:show,xlink:title,xlink:type,xml:base,xml:lang,xml:space,xmlns,xmlns:xlink,y,y1,y2,zoomAndPan\",\n!0);var O=h.extend({},D,p,n),A=document.createElement(\"pre\");h.module(\"ngSanitize\",[]).provider(\"$sanitize\",function(){this.$get=[\"$$sanitizeUri\",function(a){return function(f){var d=[];F(f,r(d,function(c,b){return!/^unsafe/.test(a(c,b))}));return d.join(\"\")}}]});h.module(\"ngSanitize\").filter(\"linky\",[\"$sanitize\",function(a){var f=/((ftp|https?):\\/\\/|(www\\.)|(mailto:)?[A-Za-z0-9._%+-]+@)\\S*[^\\s.;,(){}<>\"\\u201d\\u2019]/i,d=/^mailto:/i;return function(c,b){function k(a){a&&g.push(E(a))}function e(a,\nc){g.push(\"<a \");h.isDefined(b)&&g.push('target=\"',b,'\" ');g.push('href=\"',a.replace(/\"/g,\"&quot;\"),'\">');k(c);g.push(\"</a>\")}if(!c)return c;for(var m,l=c,g=[],n,p;m=l.match(f);)n=m[0],m[2]||m[4]||(n=(m[3]?\"http://\":\"mailto:\")+n),p=m.index,k(l.substr(0,p)),e(n,m[0].replace(d,\"\")),l=l.substring(p+m[0].length);k(l);return a(g.join(\"\"))}}])})(window,window.angular);\n//# sourceMappingURL=angular-sanitize.min.js.map\n\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ib3dlcl9jb21wb25lbnRzL2FuZ3VsYXItc2FuaXRpemUvYW5ndWxhci1zYW5pdGl6ZS5taW4uanM/M2JmMyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuIEFuZ3VsYXJKUyB2MS40LjZcbiAoYykgMjAxMC0yMDE1IEdvb2dsZSwgSW5jLiBodHRwOi8vYW5ndWxhcmpzLm9yZ1xuIExpY2Vuc2U6IE1JVFxuKi9cbihmdW5jdGlvbihuLGgscCl7J3VzZSBzdHJpY3QnO2Z1bmN0aW9uIEUoYSl7dmFyIGY9W107cihmLGgubm9vcCkuY2hhcnMoYSk7cmV0dXJuIGYuam9pbihcIlwiKX1mdW5jdGlvbiBnKGEsZil7dmFyIGQ9e30sYz1hLnNwbGl0KFwiLFwiKSxiO2ZvcihiPTA7YjxjLmxlbmd0aDtiKyspZFtmP2gubG93ZXJjYXNlKGNbYl0pOmNbYl1dPSEwO3JldHVybiBkfWZ1bmN0aW9uIEYoYSxmKXtmdW5jdGlvbiBkKGEsYixkLGwpe2I9aC5sb3dlcmNhc2UoYik7aWYoc1tiXSlmb3IoO2UubGFzdCgpJiZ0W2UubGFzdCgpXTspYyhcIlwiLGUubGFzdCgpKTt1W2JdJiZlLmxhc3QoKT09YiYmYyhcIlwiLGIpOyhsPXZbYl18fCEhbCl8fGUucHVzaChiKTt2YXIgbT17fTtkLnJlcGxhY2UoRyxmdW5jdGlvbihiLGEsZixjLGQpe21bYV09cShmfHxjfHxkfHxcIlwiKX0pO2Yuc3RhcnQmJmYuc3RhcnQoYixtLGwpfWZ1bmN0aW9uIGMoYixhKXt2YXIgYz0wLGQ7aWYoYT1oLmxvd2VyY2FzZShhKSlmb3IoYz1lLmxlbmd0aC1cbjE7MDw9YyYmZVtjXSE9YTtjLS0pO2lmKDA8PWMpe2ZvcihkPWUubGVuZ3RoLTE7ZD49YztkLS0pZi5lbmQmJmYuZW5kKGVbZF0pO2UubGVuZ3RoPWN9fVwic3RyaW5nXCIhPT10eXBlb2YgYSYmKGE9bnVsbD09PWF8fFwidW5kZWZpbmVkXCI9PT10eXBlb2YgYT9cIlwiOlwiXCIrYSk7dmFyIGIsayxlPVtdLG09YSxsO2ZvcihlLmxhc3Q9ZnVuY3Rpb24oKXtyZXR1cm4gZVtlLmxlbmd0aC0xXX07YTspe2w9XCJcIjtrPSEwO2lmKGUubGFzdCgpJiZ3W2UubGFzdCgpXSlhPWEucmVwbGFjZShuZXcgUmVnRXhwKFwiKFtcXFxcV1xcXFx3XSopPFxcXFxzKlxcXFwvXFxcXHMqXCIrZS5sYXN0KCkrXCJbXj5dKj5cIixcImlcIiksZnVuY3Rpb24oYSxiKXtiPWIucmVwbGFjZShILFwiJDFcIikucmVwbGFjZShJLFwiJDFcIik7Zi5jaGFycyYmZi5jaGFycyhxKGIpKTtyZXR1cm5cIlwifSksYyhcIlwiLGUubGFzdCgpKTtlbHNle2lmKDA9PT1hLmluZGV4T2YoXCJcXHgzYyEtLVwiKSliPWEuaW5kZXhPZihcIi0tXCIsNCksMDw9YiYmYS5sYXN0SW5kZXhPZihcIi0tXFx4M2VcIixcbmIpPT09YiYmKGYuY29tbWVudCYmZi5jb21tZW50KGEuc3Vic3RyaW5nKDQsYikpLGE9YS5zdWJzdHJpbmcoYiszKSxrPSExKTtlbHNlIGlmKHgudGVzdChhKSl7aWYoYj1hLm1hdGNoKHgpKWE9YS5yZXBsYWNlKGJbMF0sXCJcIiksaz0hMX1lbHNlIGlmKEoudGVzdChhKSl7aWYoYj1hLm1hdGNoKHkpKWE9YS5zdWJzdHJpbmcoYlswXS5sZW5ndGgpLGJbMF0ucmVwbGFjZSh5LGMpLGs9ITF9ZWxzZSBLLnRlc3QoYSkmJigoYj1hLm1hdGNoKHopKT8oYls0XSYmKGE9YS5zdWJzdHJpbmcoYlswXS5sZW5ndGgpLGJbMF0ucmVwbGFjZSh6LGQpKSxrPSExKToobCs9XCI8XCIsYT1hLnN1YnN0cmluZygxKSkpO2smJihiPWEuaW5kZXhPZihcIjxcIiksbCs9MD5iP2E6YS5zdWJzdHJpbmcoMCxiKSxhPTA+Yj9cIlwiOmEuc3Vic3RyaW5nKGIpLGYuY2hhcnMmJmYuY2hhcnMocShsKSkpfWlmKGE9PW0pdGhyb3cgTChcImJhZHBhcnNlXCIsYSk7bT1hfWMoKX1mdW5jdGlvbiBxKGEpe2lmKCFhKXJldHVyblwiXCI7QS5pbm5lckhUTUw9XG5hLnJlcGxhY2UoLzwvZyxcIiZsdDtcIik7cmV0dXJuIEEudGV4dENvbnRlbnR9ZnVuY3Rpb24gQihhKXtyZXR1cm4gYS5yZXBsYWNlKC8mL2csXCImYW1wO1wiKS5yZXBsYWNlKE0sZnVuY3Rpb24oYSl7dmFyIGQ9YS5jaGFyQ29kZUF0KDApO2E9YS5jaGFyQ29kZUF0KDEpO3JldHVyblwiJiNcIisoMTAyNCooZC01NTI5NikrKGEtNTYzMjApKzY1NTM2KStcIjtcIn0pLnJlcGxhY2UoTixmdW5jdGlvbihhKXtyZXR1cm5cIiYjXCIrYS5jaGFyQ29kZUF0KDApK1wiO1wifSkucmVwbGFjZSgvPC9nLFwiJmx0O1wiKS5yZXBsYWNlKC8+L2csXCImZ3Q7XCIpfWZ1bmN0aW9uIHIoYSxmKXt2YXIgZD0hMSxjPWguYmluZChhLGEucHVzaCk7cmV0dXJue3N0YXJ0OmZ1bmN0aW9uKGEsayxlKXthPWgubG93ZXJjYXNlKGEpOyFkJiZ3W2FdJiYoZD1hKTtkfHwhMCE9PUNbYV18fChjKFwiPFwiKSxjKGEpLGguZm9yRWFjaChrLGZ1bmN0aW9uKGQsZSl7dmFyIGs9aC5sb3dlcmNhc2UoZSksZz1cImltZ1wiPT09YSYmXCJzcmNcIj09PWt8fFxuXCJiYWNrZ3JvdW5kXCI9PT1rOyEwIT09T1trXXx8ITA9PT1EW2tdJiYhZihkLGcpfHwoYyhcIiBcIiksYyhlKSxjKCc9XCInKSxjKEIoZCkpLGMoJ1wiJykpfSksYyhlP1wiLz5cIjpcIj5cIikpfSxlbmQ6ZnVuY3Rpb24oYSl7YT1oLmxvd2VyY2FzZShhKTtkfHwhMCE9PUNbYV18fChjKFwiPC9cIiksYyhhKSxjKFwiPlwiKSk7YT09ZCYmKGQ9ITEpfSxjaGFyczpmdW5jdGlvbihhKXtkfHxjKEIoYSkpfX19dmFyIEw9aC4kJG1pbkVycihcIiRzYW5pdGl6ZVwiKSx6PS9ePCgoPzpbYS16QS1aXSlbXFx3Oi1dKikoKD86XFxzK1tcXHc6LV0rKD86XFxzKj1cXHMqKD86KD86XCJbXlwiXSpcIil8KD86J1teJ10qJyl8W14+XFxzXSspKT8pKilcXHMqKFxcLz8pXFxzKig+PykvLHk9L148XFwvXFxzKihbXFx3Oi1dKylbXj5dKj4vLEc9LyhbXFx3Oi1dKykoPzpcXHMqPVxccyooPzooPzpcIigoPzpbXlwiXSkqKVwiKXwoPzonKCg/OlteJ10pKiknKXwoW14+XFxzXSspKSk/L2csSz0vXjwvLEo9L148XFwvLyxIPS9cXHgzYyEtLSguKj8pLS1cXHgzZS9nLHg9LzwhRE9DVFlQRShbXj5dKj8pPi9pLFxuST0vPCFcXFtDREFUQVxcWyguKj8pXV1cXHgzZS9nLE09L1tcXHVEODAwLVxcdURCRkZdW1xcdURDMDAtXFx1REZGRl0vZyxOPS8oW15cXCMtfnwgfCFdKS9nLHY9ZyhcImFyZWEsYnIsY29sLGhyLGltZyx3YnJcIik7bj1nKFwiY29sZ3JvdXAsZGQsZHQsbGkscCx0Ym9keSx0ZCx0Zm9vdCx0aCx0aGVhZCx0clwiKTtwPWcoXCJycCxydFwiKTt2YXIgdT1oLmV4dGVuZCh7fSxwLG4pLHM9aC5leHRlbmQoe30sbixnKFwiYWRkcmVzcyxhcnRpY2xlLGFzaWRlLGJsb2NrcXVvdGUsY2FwdGlvbixjZW50ZXIsZGVsLGRpcixkaXYsZGwsZmlndXJlLGZpZ2NhcHRpb24sZm9vdGVyLGgxLGgyLGgzLGg0LGg1LGg2LGhlYWRlcixoZ3JvdXAsaHIsaW5zLG1hcCxtZW51LG5hdixvbCxwcmUsc2NyaXB0LHNlY3Rpb24sdGFibGUsdWxcIikpLHQ9aC5leHRlbmQoe30scCxnKFwiYSxhYmJyLGFjcm9ueW0sYixiZGksYmRvLGJpZyxicixjaXRlLGNvZGUsZGVsLGRmbixlbSxmb250LGksaW1nLGlucyxrYmQsbGFiZWwsbWFwLG1hcmsscSxydWJ5LHJwLHJ0LHMsc2FtcCxzbWFsbCxzcGFuLHN0cmlrZSxzdHJvbmcsc3ViLHN1cCx0aW1lLHR0LHUsdmFyXCIpKTtcbm49ZyhcImNpcmNsZSxkZWZzLGRlc2MsZWxsaXBzZSxmb250LWZhY2UsZm9udC1mYWNlLW5hbWUsZm9udC1mYWNlLXNyYyxnLGdseXBoLGhrZXJuLGltYWdlLGxpbmVhckdyYWRpZW50LGxpbmUsbWFya2VyLG1ldGFkYXRhLG1pc3NpbmctZ2x5cGgsbXBhdGgscGF0aCxwb2x5Z29uLHBvbHlsaW5lLHJhZGlhbEdyYWRpZW50LHJlY3Qsc3RvcCxzdmcsc3dpdGNoLHRleHQsdGl0bGUsdHNwYW4sdXNlXCIpO3ZhciB3PWcoXCJzY3JpcHQsc3R5bGVcIiksQz1oLmV4dGVuZCh7fSx2LHMsdCx1LG4pLEQ9ZyhcImJhY2tncm91bmQsY2l0ZSxocmVmLGxvbmdkZXNjLHNyYyx1c2VtYXAseGxpbms6aHJlZlwiKTtuPWcoXCJhYmJyLGFsaWduLGFsdCxheGlzLGJnY29sb3IsYm9yZGVyLGNlbGxwYWRkaW5nLGNlbGxzcGFjaW5nLGNsYXNzLGNsZWFyLGNvbG9yLGNvbHMsY29sc3Bhbixjb21wYWN0LGNvb3JkcyxkaXIsZmFjZSxoZWFkZXJzLGhlaWdodCxocmVmbGFuZyxoc3BhY2UsaXNtYXAsbGFuZyxsYW5ndWFnZSxub2hyZWYsbm93cmFwLHJlbCxyZXYscm93cyxyb3dzcGFuLHJ1bGVzLHNjb3BlLHNjcm9sbGluZyxzaGFwZSxzaXplLHNwYW4sc3RhcnQsc3VtbWFyeSx0YWJpbmRleCx0YXJnZXQsdGl0bGUsdHlwZSx2YWxpZ24sdmFsdWUsdnNwYWNlLHdpZHRoXCIpO1xucD1nKFwiYWNjZW50LWhlaWdodCxhY2N1bXVsYXRlLGFkZGl0aXZlLGFscGhhYmV0aWMsYXJhYmljLWZvcm0sYXNjZW50LGJhc2VQcm9maWxlLGJib3gsYmVnaW4sYnksY2FsY01vZGUsY2FwLWhlaWdodCxjbGFzcyxjb2xvcixjb2xvci1yZW5kZXJpbmcsY29udGVudCxjeCxjeSxkLGR4LGR5LGRlc2NlbnQsZGlzcGxheSxkdXIsZW5kLGZpbGwsZmlsbC1ydWxlLGZvbnQtZmFtaWx5LGZvbnQtc2l6ZSxmb250LXN0cmV0Y2gsZm9udC1zdHlsZSxmb250LXZhcmlhbnQsZm9udC13ZWlnaHQsZnJvbSxmeCxmeSxnMSxnMixnbHlwaC1uYW1lLGdyYWRpZW50VW5pdHMsaGFuZ2luZyxoZWlnaHQsaG9yaXotYWR2LXgsaG9yaXotb3JpZ2luLXgsaWRlb2dyYXBoaWMsayxrZXlQb2ludHMsa2V5U3BsaW5lcyxrZXlUaW1lcyxsYW5nLG1hcmtlci1lbmQsbWFya2VyLW1pZCxtYXJrZXItc3RhcnQsbWFya2VySGVpZ2h0LG1hcmtlclVuaXRzLG1hcmtlcldpZHRoLG1hdGhlbWF0aWNhbCxtYXgsbWluLG9mZnNldCxvcGFjaXR5LG9yaWVudCxvcmlnaW4sb3ZlcmxpbmUtcG9zaXRpb24sb3ZlcmxpbmUtdGhpY2tuZXNzLHBhbm9zZS0xLHBhdGgscGF0aExlbmd0aCxwb2ludHMscHJlc2VydmVBc3BlY3RSYXRpbyxyLHJlZlgscmVmWSxyZXBlYXRDb3VudCxyZXBlYXREdXIscmVxdWlyZWRFeHRlbnNpb25zLHJlcXVpcmVkRmVhdHVyZXMscmVzdGFydCxyb3RhdGUscngscnksc2xvcGUsc3RlbWgsc3RlbXYsc3RvcC1jb2xvcixzdG9wLW9wYWNpdHksc3RyaWtldGhyb3VnaC1wb3NpdGlvbixzdHJpa2V0aHJvdWdoLXRoaWNrbmVzcyxzdHJva2Usc3Ryb2tlLWRhc2hhcnJheSxzdHJva2UtZGFzaG9mZnNldCxzdHJva2UtbGluZWNhcCxzdHJva2UtbGluZWpvaW4sc3Ryb2tlLW1pdGVybGltaXQsc3Ryb2tlLW9wYWNpdHksc3Ryb2tlLXdpZHRoLHN5c3RlbUxhbmd1YWdlLHRhcmdldCx0ZXh0LWFuY2hvcix0byx0cmFuc2Zvcm0sdHlwZSx1MSx1Mix1bmRlcmxpbmUtcG9zaXRpb24sdW5kZXJsaW5lLXRoaWNrbmVzcyx1bmljb2RlLHVuaWNvZGUtcmFuZ2UsdW5pdHMtcGVyLWVtLHZhbHVlcyx2ZXJzaW9uLHZpZXdCb3gsdmlzaWJpbGl0eSx3aWR0aCx3aWR0aHMseCx4LWhlaWdodCx4MSx4Mix4bGluazphY3R1YXRlLHhsaW5rOmFyY3JvbGUseGxpbms6cm9sZSx4bGluazpzaG93LHhsaW5rOnRpdGxlLHhsaW5rOnR5cGUseG1sOmJhc2UseG1sOmxhbmcseG1sOnNwYWNlLHhtbG5zLHhtbG5zOnhsaW5rLHkseTEseTIsem9vbUFuZFBhblwiLFxuITApO3ZhciBPPWguZXh0ZW5kKHt9LEQscCxuKSxBPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJwcmVcIik7aC5tb2R1bGUoXCJuZ1Nhbml0aXplXCIsW10pLnByb3ZpZGVyKFwiJHNhbml0aXplXCIsZnVuY3Rpb24oKXt0aGlzLiRnZXQ9W1wiJCRzYW5pdGl6ZVVyaVwiLGZ1bmN0aW9uKGEpe3JldHVybiBmdW5jdGlvbihmKXt2YXIgZD1bXTtGKGYscihkLGZ1bmN0aW9uKGMsYil7cmV0dXJuIS9edW5zYWZlLy50ZXN0KGEoYyxiKSl9KSk7cmV0dXJuIGQuam9pbihcIlwiKX19XX0pO2gubW9kdWxlKFwibmdTYW5pdGl6ZVwiKS5maWx0ZXIoXCJsaW5reVwiLFtcIiRzYW5pdGl6ZVwiLGZ1bmN0aW9uKGEpe3ZhciBmPS8oKGZ0cHxodHRwcz8pOlxcL1xcL3wod3d3XFwuKXwobWFpbHRvOik/W0EtWmEtejAtOS5fJSstXStAKVxcUypbXlxccy47LCgpe308PlwiXFx1MjAxZFxcdTIwMTldL2ksZD0vXm1haWx0bzovaTtyZXR1cm4gZnVuY3Rpb24oYyxiKXtmdW5jdGlvbiBrKGEpe2EmJmcucHVzaChFKGEpKX1mdW5jdGlvbiBlKGEsXG5jKXtnLnB1c2goXCI8YSBcIik7aC5pc0RlZmluZWQoYikmJmcucHVzaCgndGFyZ2V0PVwiJyxiLCdcIiAnKTtnLnB1c2goJ2hyZWY9XCInLGEucmVwbGFjZSgvXCIvZyxcIiZxdW90O1wiKSwnXCI+Jyk7ayhjKTtnLnB1c2goXCI8L2E+XCIpfWlmKCFjKXJldHVybiBjO2Zvcih2YXIgbSxsPWMsZz1bXSxuLHA7bT1sLm1hdGNoKGYpOyluPW1bMF0sbVsyXXx8bVs0XXx8KG49KG1bM10/XCJodHRwOi8vXCI6XCJtYWlsdG86XCIpK24pLHA9bS5pbmRleCxrKGwuc3Vic3RyKDAscCkpLGUobixtWzBdLnJlcGxhY2UoZCxcIlwiKSksbD1sLnN1YnN0cmluZyhwK21bMF0ubGVuZ3RoKTtrKGwpO3JldHVybiBhKGcuam9pbihcIlwiKSl9fV0pfSkod2luZG93LHdpbmRvdy5hbmd1bGFyKTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWFuZ3VsYXItc2FuaXRpemUubWluLmpzLm1hcFxuXG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL2Jvd2VyX2NvbXBvbmVudHMvYW5ndWxhci1zYW5pdGl6ZS9hbmd1bGFyLXNhbml0aXplLm1pbi5qc1xuICoqIG1vZHVsZSBpZCA9IDQzXG4gKiogbW9kdWxlIGNodW5rcyA9IDI0XG4gKiovIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=");

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

	eval("/*\n AngularJS v1.4.6\n (c) 2010-2015 Google, Inc. http://angularjs.org\n License: MIT\n*/\n(function(x,s,y){'use strict';function t(f,k,p){n.directive(f,[\"$parse\",\"$swipe\",function(c,e){return function(l,m,g){function h(a){if(!b)return!1;var d=Math.abs(a.y-b.y);a=(a.x-b.x)*k;return r&&75>d&&0<a&&30<a&&.3>d/a}var d=c(g[f]),b,r,a=[\"touch\"];s.isDefined(g.ngSwipeDisableMouse)||a.push(\"mouse\");e.bind(m,{start:function(a,d){b=a;r=!0},cancel:function(a){r=!1},end:function(a,b){h(a)&&l.$apply(function(){m.triggerHandler(p);d(l,{$event:b})})}},a)}}])}var n=s.module(\"ngTouch\",[]);n.factory(\"$swipe\",\n[function(){function f(c){c=c.originalEvent||c;var e=c.touches&&c.touches.length?c.touches:[c];c=c.changedTouches&&c.changedTouches[0]||e[0];return{x:c.clientX,y:c.clientY}}function k(c,e){var l=[];s.forEach(c,function(c){(c=p[c][e])&&l.push(c)});return l.join(\" \")}var p={mouse:{start:\"mousedown\",move:\"mousemove\",end:\"mouseup\"},touch:{start:\"touchstart\",move:\"touchmove\",end:\"touchend\",cancel:\"touchcancel\"}};return{bind:function(c,e,l){var m,g,h,d,b=!1;l=l||[\"mouse\",\"touch\"];c.on(k(l,\"start\"),function(a){h=\nf(a);b=!0;g=m=0;d=h;e.start&&e.start(h,a)});var r=k(l,\"cancel\");if(r)c.on(r,function(a){b=!1;e.cancel&&e.cancel(a)});c.on(k(l,\"move\"),function(a){if(b&&h){var c=f(a);m+=Math.abs(c.x-d.x);g+=Math.abs(c.y-d.y);d=c;10>m&&10>g||(g>m?(b=!1,e.cancel&&e.cancel(a)):(a.preventDefault(),e.move&&e.move(c,a)))}});c.on(k(l,\"end\"),function(a){b&&(b=!1,e.end&&e.end(f(a),a))})}}}]);n.config([\"$provide\",function(f){f.decorator(\"ngClickDirective\",[\"$delegate\",function(k){k.shift();return k}])}]);n.directive(\"ngClick\",\n[\"$parse\",\"$timeout\",\"$rootElement\",function(f,k,p){function c(d,b,c){for(var a=0;a<d.length;a+=2){var e=d[a+1],g=c;if(25>Math.abs(d[a]-b)&&25>Math.abs(e-g))return d.splice(a,a+2),!0}return!1}function e(d){if(!(2500<Date.now()-m)){var b=d.touches&&d.touches.length?d.touches:[d],e=b[0].clientX,b=b[0].clientY;if(!(1>e&&1>b||h&&h[0]===e&&h[1]===b)){h&&(h=null);var a=d.target;\"label\"===s.lowercase(a.nodeName||a[0]&&a[0].nodeName)&&(h=[e,b]);c(g,e,b)||(d.stopPropagation(),d.preventDefault(),d.target&&\nd.target.blur&&d.target.blur())}}}function l(d){d=d.touches&&d.touches.length?d.touches:[d];var b=d[0].clientX,c=d[0].clientY;g.push(b,c);k(function(){for(var a=0;a<g.length;a+=2)if(g[a]==b&&g[a+1]==c){g.splice(a,a+2);break}},2500,!1)}var m,g,h;return function(d,b,h){var a=f(h.ngClick),k=!1,q,n,t,v;b.on(\"touchstart\",function(a){k=!0;q=a.target?a.target:a.srcElement;3==q.nodeType&&(q=q.parentNode);b.addClass(\"ng-click-active\");n=Date.now();a=a.originalEvent||a;a=(a.touches&&a.touches.length?a.touches:\n[a])[0];t=a.clientX;v=a.clientY});b.on(\"touchcancel\",function(a){k=!1;b.removeClass(\"ng-click-active\")});b.on(\"touchend\",function(a){var d=Date.now()-n,f=a.originalEvent||a,u=(f.changedTouches&&f.changedTouches.length?f.changedTouches:f.touches&&f.touches.length?f.touches:[f])[0],f=u.clientX,u=u.clientY,w=Math.sqrt(Math.pow(f-t,2)+Math.pow(u-v,2));k&&750>d&&12>w&&(g||(p[0].addEventListener(\"click\",e,!0),p[0].addEventListener(\"touchstart\",l,!0),g=[]),m=Date.now(),c(g,f,u),q&&q.blur(),s.isDefined(h.disabled)&&\n!1!==h.disabled||b.triggerHandler(\"click\",[a]));k=!1;b.removeClass(\"ng-click-active\")});b.onclick=function(a){};b.on(\"click\",function(b,c){d.$apply(function(){a(d,{$event:c||b})})});b.on(\"mousedown\",function(a){b.addClass(\"ng-click-active\")});b.on(\"mousemove mouseup\",function(a){b.removeClass(\"ng-click-active\")})}}]);t(\"ngSwipeLeft\",-1,\"swipeleft\");t(\"ngSwipeRight\",1,\"swiperight\")})(window,window.angular);\n//# sourceMappingURL=angular-touch.min.js.map\n\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDQuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ib3dlcl9jb21wb25lbnRzL2FuZ3VsYXItdG91Y2gvYW5ndWxhci10b3VjaC5taW4uanM/ODJlMiJdLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuIEFuZ3VsYXJKUyB2MS40LjZcbiAoYykgMjAxMC0yMDE1IEdvb2dsZSwgSW5jLiBodHRwOi8vYW5ndWxhcmpzLm9yZ1xuIExpY2Vuc2U6IE1JVFxuKi9cbihmdW5jdGlvbih4LHMseSl7J3VzZSBzdHJpY3QnO2Z1bmN0aW9uIHQoZixrLHApe24uZGlyZWN0aXZlKGYsW1wiJHBhcnNlXCIsXCIkc3dpcGVcIixmdW5jdGlvbihjLGUpe3JldHVybiBmdW5jdGlvbihsLG0sZyl7ZnVuY3Rpb24gaChhKXtpZighYilyZXR1cm4hMTt2YXIgZD1NYXRoLmFicyhhLnktYi55KTthPShhLngtYi54KSprO3JldHVybiByJiY3NT5kJiYwPGEmJjMwPGEmJi4zPmQvYX12YXIgZD1jKGdbZl0pLGIscixhPVtcInRvdWNoXCJdO3MuaXNEZWZpbmVkKGcubmdTd2lwZURpc2FibGVNb3VzZSl8fGEucHVzaChcIm1vdXNlXCIpO2UuYmluZChtLHtzdGFydDpmdW5jdGlvbihhLGQpe2I9YTtyPSEwfSxjYW5jZWw6ZnVuY3Rpb24oYSl7cj0hMX0sZW5kOmZ1bmN0aW9uKGEsYil7aChhKSYmbC4kYXBwbHkoZnVuY3Rpb24oKXttLnRyaWdnZXJIYW5kbGVyKHApO2QobCx7JGV2ZW50OmJ9KX0pfX0sYSl9fV0pfXZhciBuPXMubW9kdWxlKFwibmdUb3VjaFwiLFtdKTtuLmZhY3RvcnkoXCIkc3dpcGVcIixcbltmdW5jdGlvbigpe2Z1bmN0aW9uIGYoYyl7Yz1jLm9yaWdpbmFsRXZlbnR8fGM7dmFyIGU9Yy50b3VjaGVzJiZjLnRvdWNoZXMubGVuZ3RoP2MudG91Y2hlczpbY107Yz1jLmNoYW5nZWRUb3VjaGVzJiZjLmNoYW5nZWRUb3VjaGVzWzBdfHxlWzBdO3JldHVybnt4OmMuY2xpZW50WCx5OmMuY2xpZW50WX19ZnVuY3Rpb24gayhjLGUpe3ZhciBsPVtdO3MuZm9yRWFjaChjLGZ1bmN0aW9uKGMpeyhjPXBbY11bZV0pJiZsLnB1c2goYyl9KTtyZXR1cm4gbC5qb2luKFwiIFwiKX12YXIgcD17bW91c2U6e3N0YXJ0OlwibW91c2Vkb3duXCIsbW92ZTpcIm1vdXNlbW92ZVwiLGVuZDpcIm1vdXNldXBcIn0sdG91Y2g6e3N0YXJ0OlwidG91Y2hzdGFydFwiLG1vdmU6XCJ0b3VjaG1vdmVcIixlbmQ6XCJ0b3VjaGVuZFwiLGNhbmNlbDpcInRvdWNoY2FuY2VsXCJ9fTtyZXR1cm57YmluZDpmdW5jdGlvbihjLGUsbCl7dmFyIG0sZyxoLGQsYj0hMTtsPWx8fFtcIm1vdXNlXCIsXCJ0b3VjaFwiXTtjLm9uKGsobCxcInN0YXJ0XCIpLGZ1bmN0aW9uKGEpe2g9XG5mKGEpO2I9ITA7Zz1tPTA7ZD1oO2Uuc3RhcnQmJmUuc3RhcnQoaCxhKX0pO3ZhciByPWsobCxcImNhbmNlbFwiKTtpZihyKWMub24ocixmdW5jdGlvbihhKXtiPSExO2UuY2FuY2VsJiZlLmNhbmNlbChhKX0pO2Mub24oayhsLFwibW92ZVwiKSxmdW5jdGlvbihhKXtpZihiJiZoKXt2YXIgYz1mKGEpO20rPU1hdGguYWJzKGMueC1kLngpO2crPU1hdGguYWJzKGMueS1kLnkpO2Q9YzsxMD5tJiYxMD5nfHwoZz5tPyhiPSExLGUuY2FuY2VsJiZlLmNhbmNlbChhKSk6KGEucHJldmVudERlZmF1bHQoKSxlLm1vdmUmJmUubW92ZShjLGEpKSl9fSk7Yy5vbihrKGwsXCJlbmRcIiksZnVuY3Rpb24oYSl7YiYmKGI9ITEsZS5lbmQmJmUuZW5kKGYoYSksYSkpfSl9fX1dKTtuLmNvbmZpZyhbXCIkcHJvdmlkZVwiLGZ1bmN0aW9uKGYpe2YuZGVjb3JhdG9yKFwibmdDbGlja0RpcmVjdGl2ZVwiLFtcIiRkZWxlZ2F0ZVwiLGZ1bmN0aW9uKGspe2suc2hpZnQoKTtyZXR1cm4ga31dKX1dKTtuLmRpcmVjdGl2ZShcIm5nQ2xpY2tcIixcbltcIiRwYXJzZVwiLFwiJHRpbWVvdXRcIixcIiRyb290RWxlbWVudFwiLGZ1bmN0aW9uKGYsayxwKXtmdW5jdGlvbiBjKGQsYixjKXtmb3IodmFyIGE9MDthPGQubGVuZ3RoO2ErPTIpe3ZhciBlPWRbYSsxXSxnPWM7aWYoMjU+TWF0aC5hYnMoZFthXS1iKSYmMjU+TWF0aC5hYnMoZS1nKSlyZXR1cm4gZC5zcGxpY2UoYSxhKzIpLCEwfXJldHVybiExfWZ1bmN0aW9uIGUoZCl7aWYoISgyNTAwPERhdGUubm93KCktbSkpe3ZhciBiPWQudG91Y2hlcyYmZC50b3VjaGVzLmxlbmd0aD9kLnRvdWNoZXM6W2RdLGU9YlswXS5jbGllbnRYLGI9YlswXS5jbGllbnRZO2lmKCEoMT5lJiYxPmJ8fGgmJmhbMF09PT1lJiZoWzFdPT09Yikpe2gmJihoPW51bGwpO3ZhciBhPWQudGFyZ2V0O1wibGFiZWxcIj09PXMubG93ZXJjYXNlKGEubm9kZU5hbWV8fGFbMF0mJmFbMF0ubm9kZU5hbWUpJiYoaD1bZSxiXSk7YyhnLGUsYil8fChkLnN0b3BQcm9wYWdhdGlvbigpLGQucHJldmVudERlZmF1bHQoKSxkLnRhcmdldCYmXG5kLnRhcmdldC5ibHVyJiZkLnRhcmdldC5ibHVyKCkpfX19ZnVuY3Rpb24gbChkKXtkPWQudG91Y2hlcyYmZC50b3VjaGVzLmxlbmd0aD9kLnRvdWNoZXM6W2RdO3ZhciBiPWRbMF0uY2xpZW50WCxjPWRbMF0uY2xpZW50WTtnLnB1c2goYixjKTtrKGZ1bmN0aW9uKCl7Zm9yKHZhciBhPTA7YTxnLmxlbmd0aDthKz0yKWlmKGdbYV09PWImJmdbYSsxXT09Yyl7Zy5zcGxpY2UoYSxhKzIpO2JyZWFrfX0sMjUwMCwhMSl9dmFyIG0sZyxoO3JldHVybiBmdW5jdGlvbihkLGIsaCl7dmFyIGE9ZihoLm5nQ2xpY2spLGs9ITEscSxuLHQsdjtiLm9uKFwidG91Y2hzdGFydFwiLGZ1bmN0aW9uKGEpe2s9ITA7cT1hLnRhcmdldD9hLnRhcmdldDphLnNyY0VsZW1lbnQ7Mz09cS5ub2RlVHlwZSYmKHE9cS5wYXJlbnROb2RlKTtiLmFkZENsYXNzKFwibmctY2xpY2stYWN0aXZlXCIpO249RGF0ZS5ub3coKTthPWEub3JpZ2luYWxFdmVudHx8YTthPShhLnRvdWNoZXMmJmEudG91Y2hlcy5sZW5ndGg/YS50b3VjaGVzOlxuW2FdKVswXTt0PWEuY2xpZW50WDt2PWEuY2xpZW50WX0pO2Iub24oXCJ0b3VjaGNhbmNlbFwiLGZ1bmN0aW9uKGEpe2s9ITE7Yi5yZW1vdmVDbGFzcyhcIm5nLWNsaWNrLWFjdGl2ZVwiKX0pO2Iub24oXCJ0b3VjaGVuZFwiLGZ1bmN0aW9uKGEpe3ZhciBkPURhdGUubm93KCktbixmPWEub3JpZ2luYWxFdmVudHx8YSx1PShmLmNoYW5nZWRUb3VjaGVzJiZmLmNoYW5nZWRUb3VjaGVzLmxlbmd0aD9mLmNoYW5nZWRUb3VjaGVzOmYudG91Y2hlcyYmZi50b3VjaGVzLmxlbmd0aD9mLnRvdWNoZXM6W2ZdKVswXSxmPXUuY2xpZW50WCx1PXUuY2xpZW50WSx3PU1hdGguc3FydChNYXRoLnBvdyhmLXQsMikrTWF0aC5wb3codS12LDIpKTtrJiY3NTA+ZCYmMTI+dyYmKGd8fChwWzBdLmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLGUsITApLHBbMF0uYWRkRXZlbnRMaXN0ZW5lcihcInRvdWNoc3RhcnRcIixsLCEwKSxnPVtdKSxtPURhdGUubm93KCksYyhnLGYsdSkscSYmcS5ibHVyKCkscy5pc0RlZmluZWQoaC5kaXNhYmxlZCkmJlxuITEhPT1oLmRpc2FibGVkfHxiLnRyaWdnZXJIYW5kbGVyKFwiY2xpY2tcIixbYV0pKTtrPSExO2IucmVtb3ZlQ2xhc3MoXCJuZy1jbGljay1hY3RpdmVcIil9KTtiLm9uY2xpY2s9ZnVuY3Rpb24oYSl7fTtiLm9uKFwiY2xpY2tcIixmdW5jdGlvbihiLGMpe2QuJGFwcGx5KGZ1bmN0aW9uKCl7YShkLHskZXZlbnQ6Y3x8Yn0pfSl9KTtiLm9uKFwibW91c2Vkb3duXCIsZnVuY3Rpb24oYSl7Yi5hZGRDbGFzcyhcIm5nLWNsaWNrLWFjdGl2ZVwiKX0pO2Iub24oXCJtb3VzZW1vdmUgbW91c2V1cFwiLGZ1bmN0aW9uKGEpe2IucmVtb3ZlQ2xhc3MoXCJuZy1jbGljay1hY3RpdmVcIil9KX19XSk7dChcIm5nU3dpcGVMZWZ0XCIsLTEsXCJzd2lwZWxlZnRcIik7dChcIm5nU3dpcGVSaWdodFwiLDEsXCJzd2lwZXJpZ2h0XCIpfSkod2luZG93LHdpbmRvdy5hbmd1bGFyKTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWFuZ3VsYXItdG91Y2gubWluLmpzLm1hcFxuXG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL2Jvd2VyX2NvbXBvbmVudHMvYW5ndWxhci10b3VjaC9hbmd1bGFyLXRvdWNoLm1pbi5qc1xuICoqIG1vZHVsZSBpZCA9IDQ0XG4gKiogbW9kdWxlIGNodW5rcyA9IDI0XG4gKiovIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=");

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

	eval("/**\n * State-based routing for AngularJS\n * @version v0.2.18\n * @link http://angular-ui.github.com/\n * @license MIT License, http://www.opensource.org/licenses/MIT\n */\n\"undefined\"!=typeof module&&\"undefined\"!=typeof exports&&module.exports===exports&&(module.exports=\"ui.router\"),function(a,b,c){\"use strict\";function d(a,b){return R(new(R(function(){},{prototype:a})),b)}function e(a){return Q(arguments,function(b){b!==a&&Q(b,function(b,c){a.hasOwnProperty(c)||(a[c]=b)})}),a}function f(a,b){var c=[];for(var d in a.path){if(a.path[d]!==b.path[d])break;c.push(a.path[d])}return c}function g(a){if(Object.keys)return Object.keys(a);var b=[];return Q(a,function(a,c){b.push(c)}),b}function h(a,b){if(Array.prototype.indexOf)return a.indexOf(b,Number(arguments[2])||0);var c=a.length>>>0,d=Number(arguments[2])||0;for(d=0>d?Math.ceil(d):Math.floor(d),0>d&&(d+=c);c>d;d++)if(d in a&&a[d]===b)return d;return-1}function i(a,b,c,d){var e,i=f(c,d),j={},k=[];for(var l in i)if(i[l]&&i[l].params&&(e=g(i[l].params),e.length))for(var m in e)h(k,e[m])>=0||(k.push(e[m]),j[e[m]]=a[e[m]]);return R({},j,b)}function j(a,b,c){if(!c){c=[];for(var d in a)c.push(d)}for(var e=0;e<c.length;e++){var f=c[e];if(a[f]!=b[f])return!1}return!0}function k(a,b){var c={};return Q(a,function(a){c[a]=b[a]}),c}function l(a){var b={},c=Array.prototype.concat.apply(Array.prototype,Array.prototype.slice.call(arguments,1));return Q(c,function(c){c in a&&(b[c]=a[c])}),b}function m(a){var b={},c=Array.prototype.concat.apply(Array.prototype,Array.prototype.slice.call(arguments,1));for(var d in a)-1==h(c,d)&&(b[d]=a[d]);return b}function n(a,b){var c=P(a),d=c?[]:{};return Q(a,function(a,e){b(a,e)&&(d[c?d.length:e]=a)}),d}function o(a,b){var c=P(a)?[]:{};return Q(a,function(a,d){c[d]=b(a,d)}),c}function p(a,b){var d=1,f=2,i={},j=[],k=i,l=R(a.when(i),{$$promises:i,$$values:i});this.study=function(i){function n(a,c){if(s[c]!==f){if(r.push(c),s[c]===d)throw r.splice(0,h(r,c)),new Error(\"Cyclic dependency: \"+r.join(\" -> \"));if(s[c]=d,N(a))q.push(c,[function(){return b.get(a)}],j);else{var e=b.annotate(a);Q(e,function(a){a!==c&&i.hasOwnProperty(a)&&n(i[a],a)}),q.push(c,a,e)}r.pop(),s[c]=f}}function o(a){return O(a)&&a.then&&a.$$promises}if(!O(i))throw new Error(\"'invocables' must be an object\");var p=g(i||{}),q=[],r=[],s={};return Q(i,n),i=r=s=null,function(d,f,g){function h(){--u||(v||e(t,f.$$values),r.$$values=t,r.$$promises=r.$$promises||!0,delete r.$$inheritedValues,n.resolve(t))}function i(a){r.$$failure=a,n.reject(a)}function j(c,e,f){function j(a){l.reject(a),i(a)}function k(){if(!L(r.$$failure))try{l.resolve(b.invoke(e,g,t)),l.promise.then(function(a){t[c]=a,h()},j)}catch(a){j(a)}}var l=a.defer(),m=0;Q(f,function(a){s.hasOwnProperty(a)&&!d.hasOwnProperty(a)&&(m++,s[a].then(function(b){t[a]=b,--m||k()},j))}),m||k(),s[c]=l.promise}if(o(d)&&g===c&&(g=f,f=d,d=null),d){if(!O(d))throw new Error(\"'locals' must be an object\")}else d=k;if(f){if(!o(f))throw new Error(\"'parent' must be a promise returned by $resolve.resolve()\")}else f=l;var n=a.defer(),r=n.promise,s=r.$$promises={},t=R({},d),u=1+q.length/3,v=!1;if(L(f.$$failure))return i(f.$$failure),r;f.$$inheritedValues&&e(t,m(f.$$inheritedValues,p)),R(s,f.$$promises),f.$$values?(v=e(t,m(f.$$values,p)),r.$$inheritedValues=m(f.$$values,p),h()):(f.$$inheritedValues&&(r.$$inheritedValues=m(f.$$inheritedValues,p)),f.then(h,i));for(var w=0,x=q.length;x>w;w+=3)d.hasOwnProperty(q[w])?h():j(q[w],q[w+1],q[w+2]);return r}},this.resolve=function(a,b,c,d){return this.study(a)(b,c,d)}}function q(a,b,c){this.fromConfig=function(a,b,c){return L(a.template)?this.fromString(a.template,b):L(a.templateUrl)?this.fromUrl(a.templateUrl,b):L(a.templateProvider)?this.fromProvider(a.templateProvider,b,c):null},this.fromString=function(a,b){return M(a)?a(b):a},this.fromUrl=function(c,d){return M(c)&&(c=c(d)),null==c?null:a.get(c,{cache:b,headers:{Accept:\"text/html\"}}).then(function(a){return a.data})},this.fromProvider=function(a,b,d){return c.invoke(a,null,d||{params:b})}}function r(a,b,e){function f(b,c,d,e){if(q.push(b),o[b])return o[b];if(!/^\\w+([-.]+\\w+)*(?:\\[\\])?$/.test(b))throw new Error(\"Invalid parameter name '\"+b+\"' in pattern '\"+a+\"'\");if(p[b])throw new Error(\"Duplicate parameter name '\"+b+\"' in pattern '\"+a+\"'\");return p[b]=new U.Param(b,c,d,e),p[b]}function g(a,b,c,d){var e=[\"\",\"\"],f=a.replace(/[\\\\\\[\\]\\^$*+?.()|{}]/g,\"\\\\$&\");if(!b)return f;switch(c){case!1:e=[\"(\",\")\"+(d?\"?\":\"\")];break;case!0:f=f.replace(/\\/$/,\"\"),e=[\"(?:/(\",\")|/)?\"];break;default:e=[\"(\"+c+\"|\",\")?\"]}return f+e[0]+b+e[1]}function h(e,f){var g,h,i,j,k;return g=e[2]||e[3],k=b.params[g],i=a.substring(m,e.index),h=f?e[4]:e[4]||(\"*\"==e[1]?\".*\":null),h&&(j=U.type(h)||d(U.type(\"string\"),{pattern:new RegExp(h,b.caseInsensitive?\"i\":c)})),{id:g,regexp:h,segment:i,type:j,cfg:k}}b=R({params:{}},O(b)?b:{});var i,j=/([:*])([\\w\\[\\]]+)|\\{([\\w\\[\\]]+)(?:\\:\\s*((?:[^{}\\\\]+|\\\\.|\\{(?:[^{}\\\\]+|\\\\.)*\\})+))?\\}/g,k=/([:]?)([\\w\\[\\].-]+)|\\{([\\w\\[\\].-]+)(?:\\:\\s*((?:[^{}\\\\]+|\\\\.|\\{(?:[^{}\\\\]+|\\\\.)*\\})+))?\\}/g,l=\"^\",m=0,n=this.segments=[],o=e?e.params:{},p=this.params=e?e.params.$$new():new U.ParamSet,q=[];this.source=a;for(var r,s,t;(i=j.exec(a))&&(r=h(i,!1),!(r.segment.indexOf(\"?\")>=0));)s=f(r.id,r.type,r.cfg,\"path\"),l+=g(r.segment,s.type.pattern.source,s.squash,s.isOptional),n.push(r.segment),m=j.lastIndex;t=a.substring(m);var u=t.indexOf(\"?\");if(u>=0){var v=this.sourceSearch=t.substring(u);if(t=t.substring(0,u),this.sourcePath=a.substring(0,m+u),v.length>0)for(m=0;i=k.exec(v);)r=h(i,!0),s=f(r.id,r.type,r.cfg,\"search\"),m=j.lastIndex}else this.sourcePath=a,this.sourceSearch=\"\";l+=g(t)+(b.strict===!1?\"/?\":\"\")+\"$\",n.push(t),this.regexp=new RegExp(l,b.caseInsensitive?\"i\":c),this.prefix=n[0],this.$$paramNames=q}function s(a){R(this,a)}function t(){function a(a){return null!=a?a.toString().replace(/~/g,\"~~\").replace(/\\//g,\"~2F\"):a}function e(a){return null!=a?a.toString().replace(/~2F/g,\"/\").replace(/~~/g,\"~\"):a}function f(){return{strict:p,caseInsensitive:m}}function i(a){return M(a)||P(a)&&M(a[a.length-1])}function j(){for(;w.length;){var a=w.shift();if(a.pattern)throw new Error(\"You cannot override a type's .pattern at runtime.\");b.extend(u[a.name],l.invoke(a.def))}}function k(a){R(this,a||{})}U=this;var l,m=!1,p=!0,q=!1,u={},v=!0,w=[],x={string:{encode:a,decode:e,is:function(a){return null==a||!L(a)||\"string\"==typeof a},pattern:/[^\\/]*/},\"int\":{encode:a,decode:function(a){return parseInt(a,10)},is:function(a){return L(a)&&this.decode(a.toString())===a},pattern:/\\d+/},bool:{encode:function(a){return a?1:0},decode:function(a){return 0!==parseInt(a,10)},is:function(a){return a===!0||a===!1},pattern:/0|1/},date:{encode:function(a){return this.is(a)?[a.getFullYear(),(\"0\"+(a.getMonth()+1)).slice(-2),(\"0\"+a.getDate()).slice(-2)].join(\"-\"):c},decode:function(a){if(this.is(a))return a;var b=this.capture.exec(a);return b?new Date(b[1],b[2]-1,b[3]):c},is:function(a){return a instanceof Date&&!isNaN(a.valueOf())},equals:function(a,b){return this.is(a)&&this.is(b)&&a.toISOString()===b.toISOString()},pattern:/[0-9]{4}-(?:0[1-9]|1[0-2])-(?:0[1-9]|[1-2][0-9]|3[0-1])/,capture:/([0-9]{4})-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1])/},json:{encode:b.toJson,decode:b.fromJson,is:b.isObject,equals:b.equals,pattern:/[^\\/]*/},any:{encode:b.identity,decode:b.identity,equals:b.equals,pattern:/.*/}};t.$$getDefaultValue=function(a){if(!i(a.value))return a.value;if(!l)throw new Error(\"Injectable functions cannot be called at configuration time\");return l.invoke(a.value)},this.caseInsensitive=function(a){return L(a)&&(m=a),m},this.strictMode=function(a){return L(a)&&(p=a),p},this.defaultSquashPolicy=function(a){if(!L(a))return q;if(a!==!0&&a!==!1&&!N(a))throw new Error(\"Invalid squash policy: \"+a+\". Valid policies: false, true, arbitrary-string\");return q=a,a},this.compile=function(a,b){return new r(a,R(f(),b))},this.isMatcher=function(a){if(!O(a))return!1;var b=!0;return Q(r.prototype,function(c,d){M(c)&&(b=b&&L(a[d])&&M(a[d]))}),b},this.type=function(a,b,c){if(!L(b))return u[a];if(u.hasOwnProperty(a))throw new Error(\"A type named '\"+a+\"' has already been defined.\");return u[a]=new s(R({name:a},b)),c&&(w.push({name:a,def:c}),v||j()),this},Q(x,function(a,b){u[b]=new s(R({name:b},a))}),u=d(u,{}),this.$get=[\"$injector\",function(a){return l=a,v=!1,j(),Q(x,function(a,b){u[b]||(u[b]=new s(a))}),this}],this.Param=function(a,d,e,f){function j(a){var b=O(a)?g(a):[],c=-1===h(b,\"value\")&&-1===h(b,\"type\")&&-1===h(b,\"squash\")&&-1===h(b,\"array\");return c&&(a={value:a}),a.$$fn=i(a.value)?a.value:function(){return a.value},a}function k(c,d,e){if(c.type&&d)throw new Error(\"Param '\"+a+\"' has two type configurations.\");return d?d:c.type?b.isString(c.type)?u[c.type]:c.type instanceof s?c.type:new s(c.type):\"config\"===e?u.any:u.string}function m(){var b={array:\"search\"===f?\"auto\":!1},c=a.match(/\\[\\]$/)?{array:!0}:{};return R(b,c,e).array}function p(a,b){var c=a.squash;if(!b||c===!1)return!1;if(!L(c)||null==c)return q;if(c===!0||N(c))return c;throw new Error(\"Invalid squash policy: '\"+c+\"'. Valid policies: false, true, or arbitrary string\")}function r(a,b,d,e){var f,g,i=[{from:\"\",to:d||b?c:\"\"},{from:null,to:d||b?c:\"\"}];return f=P(a.replace)?a.replace:[],N(e)&&f.push({from:e,to:c}),g=o(f,function(a){return a.from}),n(i,function(a){return-1===h(g,a.from)}).concat(f)}function t(){if(!l)throw new Error(\"Injectable functions cannot be called at configuration time\");var a=l.invoke(e.$$fn);if(null!==a&&a!==c&&!x.type.is(a))throw new Error(\"Default value (\"+a+\") for parameter '\"+x.id+\"' is not an instance of Type (\"+x.type.name+\")\");return a}function v(a){function b(a){return function(b){return b.from===a}}function c(a){var c=o(n(x.replace,b(a)),function(a){return a.to});return c.length?c[0]:a}return a=c(a),L(a)?x.type.$normalize(a):t()}function w(){return\"{Param:\"+a+\" \"+d+\" squash: '\"+A+\"' optional: \"+z+\"}\"}var x=this;e=j(e),d=k(e,d,f);var y=m();d=y?d.$asArray(y,\"search\"===f):d,\"string\"!==d.name||y||\"path\"!==f||e.value!==c||(e.value=\"\");var z=e.value!==c,A=p(e,z),B=r(e,y,z,A);R(this,{id:a,type:d,location:f,array:y,squash:A,replace:B,isOptional:z,value:v,dynamic:c,config:e,toString:w})},k.prototype={$$new:function(){return d(this,R(new k,{$$parent:this}))},$$keys:function(){for(var a=[],b=[],c=this,d=g(k.prototype);c;)b.push(c),c=c.$$parent;return b.reverse(),Q(b,function(b){Q(g(b),function(b){-1===h(a,b)&&-1===h(d,b)&&a.push(b)})}),a},$$values:function(a){var b={},c=this;return Q(c.$$keys(),function(d){b[d]=c[d].value(a&&a[d])}),b},$$equals:function(a,b){var c=!0,d=this;return Q(d.$$keys(),function(e){var f=a&&a[e],g=b&&b[e];d[e].type.equals(f,g)||(c=!1)}),c},$$validates:function(a){var d,e,f,g,h,i=this.$$keys();for(d=0;d<i.length&&(e=this[i[d]],f=a[i[d]],f!==c&&null!==f||!e.isOptional);d++){if(g=e.type.$normalize(f),!e.type.is(g))return!1;if(h=e.type.encode(g),b.isString(h)&&!e.type.pattern.exec(h))return!1}return!0},$$parent:c},this.ParamSet=k}function u(a,d){function e(a){var b=/^\\^((?:\\\\[^a-zA-Z0-9]|[^\\\\\\[\\]\\^$*+?.()|{}]+)*)/.exec(a.source);return null!=b?b[1].replace(/\\\\(.)/g,\"$1\"):\"\"}function f(a,b){return a.replace(/\\$(\\$|\\d{1,2})/,function(a,c){return b[\"$\"===c?0:Number(c)]})}function g(a,b,c){if(!c)return!1;var d=a.invoke(b,b,{$match:c});return L(d)?d:!0}function h(d,e,f,g,h){function m(a,b,c){return\"/\"===q?a:b?q.slice(0,-1)+a:c?q.slice(1)+a:a}function n(a){function b(a){var b=a(f,d);return b?(N(b)&&d.replace().url(b),!0):!1}if(!a||!a.defaultPrevented){p&&d.url()===p;p=c;var e,g=j.length;for(e=0;g>e;e++)if(b(j[e]))return;k&&b(k)}}function o(){return i=i||e.$on(\"$locationChangeSuccess\",n)}var p,q=g.baseHref(),r=d.url();return l||o(),{sync:function(){n()},listen:function(){return o()},update:function(a){return a?void(r=d.url()):void(d.url()!==r&&(d.url(r),d.replace()))},push:function(a,b,e){var f=a.format(b||{});null!==f&&b&&b[\"#\"]&&(f+=\"#\"+b[\"#\"]),d.url(f),p=e&&e.$$avoidResync?d.url():c,e&&e.replace&&d.replace()},href:function(c,e,f){if(!c.validates(e))return null;var g=a.html5Mode();b.isObject(g)&&(g=g.enabled),g=g&&h.history;var i=c.format(e);if(f=f||{},g||null===i||(i=\"#\"+a.hashPrefix()+i),null!==i&&e&&e[\"#\"]&&(i+=\"#\"+e[\"#\"]),i=m(i,g,f.absolute),!f.absolute||!i)return i;var j=!g&&i?\"/\":\"\",k=d.port();return k=80===k||443===k?\"\":\":\"+k,[d.protocol(),\"://\",d.host(),k,j,i].join(\"\")}}}var i,j=[],k=null,l=!1;this.rule=function(a){if(!M(a))throw new Error(\"'rule' must be a function\");return j.push(a),this},this.otherwise=function(a){if(N(a)){var b=a;a=function(){return b}}else if(!M(a))throw new Error(\"'rule' must be a function\");return k=a,this},this.when=function(a,b){var c,h=N(b);if(N(a)&&(a=d.compile(a)),!h&&!M(b)&&!P(b))throw new Error(\"invalid 'handler' in when()\");var i={matcher:function(a,b){return h&&(c=d.compile(b),b=[\"$match\",function(a){return c.format(a)}]),R(function(c,d){return g(c,b,a.exec(d.path(),d.search()))},{prefix:N(a.prefix)?a.prefix:\"\"})},regex:function(a,b){if(a.global||a.sticky)throw new Error(\"when() RegExp must not be global or sticky\");return h&&(c=b,b=[\"$match\",function(a){return f(c,a)}]),R(function(c,d){return g(c,b,a.exec(d.path()))},{prefix:e(a)})}},j={matcher:d.isMatcher(a),regex:a instanceof RegExp};for(var k in j)if(j[k])return this.rule(i[k](a,b));throw new Error(\"invalid 'what' in when()\")},this.deferIntercept=function(a){a===c&&(a=!0),l=a},this.$get=h,h.$inject=[\"$location\",\"$rootScope\",\"$injector\",\"$browser\",\"$sniffer\"]}function v(a,e){function f(a){return 0===a.indexOf(\".\")||0===a.indexOf(\"^\")}function m(a,b){if(!a)return c;var d=N(a),e=d?a:a.name,g=f(e);if(g){if(!b)throw new Error(\"No reference point given for path '\"+e+\"'\");b=m(b);for(var h=e.split(\".\"),i=0,j=h.length,k=b;j>i;i++)if(\"\"!==h[i]||0!==i){if(\"^\"!==h[i])break;if(!k.parent)throw new Error(\"Path '\"+e+\"' not valid for state '\"+b.name+\"'\");k=k.parent}else k=b;h=h.slice(i).join(\".\"),e=k.name+(k.name&&h?\".\":\"\")+h}var l=z[e];return!l||!d&&(d||l!==a&&l.self!==a)?c:l}function n(a,b){A[a]||(A[a]=[]),A[a].push(b)}function p(a){for(var b=A[a]||[];b.length;)q(b.shift())}function q(b){b=d(b,{self:b,resolve:b.resolve||{},toString:function(){return this.name}});var c=b.name;if(!N(c)||c.indexOf(\"@\")>=0)throw new Error(\"State must have a valid name\");if(z.hasOwnProperty(c))throw new Error(\"State '\"+c+\"' is already defined\");var e=-1!==c.indexOf(\".\")?c.substring(0,c.lastIndexOf(\".\")):N(b.parent)?b.parent:O(b.parent)&&N(b.parent.name)?b.parent.name:\"\";if(e&&!z[e])return n(e,b.self);for(var f in C)M(C[f])&&(b[f]=C[f](b,C.$delegates[f]));return z[c]=b,!b[B]&&b.url&&a.when(b.url,[\"$match\",\"$stateParams\",function(a,c){y.$current.navigable==b&&j(a,c)||y.transitionTo(b,a,{inherit:!0,location:!1})}]),p(c),b}function r(a){return a.indexOf(\"*\")>-1}function s(a){for(var b=a.split(\".\"),c=y.$current.name.split(\".\"),d=0,e=b.length;e>d;d++)\"*\"===b[d]&&(c[d]=\"*\");return\"**\"===b[0]&&(c=c.slice(h(c,b[1])),c.unshift(\"**\")),\"**\"===b[b.length-1]&&(c.splice(h(c,b[b.length-2])+1,Number.MAX_VALUE),c.push(\"**\")),b.length!=c.length?!1:c.join(\"\")===b.join(\"\")}function t(a,b){return N(a)&&!L(b)?C[a]:M(b)&&N(a)?(C[a]&&!C.$delegates[a]&&(C.$delegates[a]=C[a]),C[a]=b,this):this}function u(a,b){return O(a)?b=a:b.name=a,q(b),this}function v(a,e,f,h,l,n,p,q,t){function u(b,c,d,f){var g=a.$broadcast(\"$stateNotFound\",b,c,d);if(g.defaultPrevented)return p.update(),D;if(!g.retry)return null;if(f.$retry)return p.update(),E;var h=y.transition=e.when(g.retry);return h.then(function(){return h!==y.transition?A:(b.options.$retry=!0,y.transitionTo(b.to,b.toParams,b.options))},function(){return D}),p.update(),h}function v(a,c,d,g,i,j){function m(){var c=[];return Q(a.views,function(d,e){var g=d.resolve&&d.resolve!==a.resolve?d.resolve:{};g.$template=[function(){return f.load(e,{view:d,locals:i.globals,params:n,notify:j.notify})||\"\"}],c.push(l.resolve(g,i.globals,i.resolve,a).then(function(c){if(M(d.controllerProvider)||P(d.controllerProvider)){var f=b.extend({},g,i.globals);c.$$controller=h.invoke(d.controllerProvider,null,f)}else c.$$controller=d.controller;c.$$state=a,c.$$controllerAs=d.controllerAs,i[e]=c}))}),e.all(c).then(function(){return i.globals})}var n=d?c:k(a.params.$$keys(),c),o={$stateParams:n};i.resolve=l.resolve(a.resolve,o,i.resolve,a);var p=[i.resolve.then(function(a){i.globals=a})];return g&&p.push(g),e.all(p).then(m).then(function(a){return i})}var A=e.reject(new Error(\"transition superseded\")),C=e.reject(new Error(\"transition prevented\")),D=e.reject(new Error(\"transition aborted\")),E=e.reject(new Error(\"transition failed\"));return x.locals={resolve:null,globals:{$stateParams:{}}},y={params:{},current:x.self,$current:x,transition:null},y.reload=function(a){return y.transitionTo(y.current,n,{reload:a||!0,inherit:!1,notify:!0})},y.go=function(a,b,c){return y.transitionTo(a,b,R({inherit:!0,relative:y.$current},c))},y.transitionTo=function(b,c,f){c=c||{},f=R({location:!0,inherit:!1,relative:null,notify:!0,reload:!1,$retry:!1},f||{});var g,j=y.$current,l=y.params,o=j.path,q=m(b,f.relative),r=c[\"#\"];if(!L(q)){var s={to:b,toParams:c,options:f},t=u(s,j.self,l,f);if(t)return t;if(b=s.to,c=s.toParams,f=s.options,q=m(b,f.relative),!L(q)){if(!f.relative)throw new Error(\"No such state '\"+b+\"'\");throw new Error(\"Could not resolve '\"+b+\"' from state '\"+f.relative+\"'\")}}if(q[B])throw new Error(\"Cannot transition to abstract state '\"+b+\"'\");if(f.inherit&&(c=i(n,c||{},y.$current,q)),!q.params.$$validates(c))return E;c=q.params.$$values(c),b=q;var z=b.path,D=0,F=z[D],G=x.locals,H=[];if(f.reload){if(N(f.reload)||O(f.reload)){if(O(f.reload)&&!f.reload.name)throw new Error(\"Invalid reload state object\");var I=f.reload===!0?o[0]:m(f.reload);if(f.reload&&!I)throw new Error(\"No such reload state '\"+(N(f.reload)?f.reload:f.reload.name)+\"'\");for(;F&&F===o[D]&&F!==I;)G=H[D]=F.locals,D++,F=z[D]}}else for(;F&&F===o[D]&&F.ownParams.$$equals(c,l);)G=H[D]=F.locals,D++,F=z[D];if(w(b,c,j,l,G,f))return r&&(c[\"#\"]=r),y.params=c,S(y.params,n),S(k(b.params.$$keys(),n),b.locals.globals.$stateParams),f.location&&b.navigable&&b.navigable.url&&(p.push(b.navigable.url,c,{$$avoidResync:!0,replace:\"replace\"===f.location}),p.update(!0)),y.transition=null,e.when(y.current);if(c=k(b.params.$$keys(),c||{}),r&&(c[\"#\"]=r),f.notify&&a.$broadcast(\"$stateChangeStart\",b.self,c,j.self,l,f).defaultPrevented)return a.$broadcast(\"$stateChangeCancel\",b.self,c,j.self,l),null==y.transition&&p.update(),C;for(var J=e.when(G),K=D;K<z.length;K++,F=z[K])G=H[K]=d(G),J=v(F,c,F===b,J,G,f);var M=y.transition=J.then(function(){var d,e,g;if(y.transition!==M)return A;for(d=o.length-1;d>=D;d--)g=o[d],g.self.onExit&&h.invoke(g.self.onExit,g.self,g.locals.globals),g.locals=null;for(d=D;d<z.length;d++)e=z[d],e.locals=H[d],e.self.onEnter&&h.invoke(e.self.onEnter,e.self,e.locals.globals);return y.transition!==M?A:(y.$current=b,y.current=b.self,y.params=c,S(y.params,n),y.transition=null,f.location&&b.navigable&&p.push(b.navigable.url,b.navigable.locals.globals.$stateParams,{$$avoidResync:!0,replace:\"replace\"===f.location}),f.notify&&a.$broadcast(\"$stateChangeSuccess\",b.self,c,j.self,l),p.update(!0),y.current)},function(d){return y.transition!==M?A:(y.transition=null,g=a.$broadcast(\"$stateChangeError\",b.self,c,j.self,l,d),g.defaultPrevented||p.update(),e.reject(d))});return M},y.is=function(a,b,d){d=R({relative:y.$current},d||{});var e=m(a,d.relative);return L(e)?y.$current!==e?!1:b?j(e.params.$$values(b),n):!0:c},y.includes=function(a,b,d){if(d=R({relative:y.$current},d||{}),N(a)&&r(a)){if(!s(a))return!1;a=y.$current.name}var e=m(a,d.relative);return L(e)?L(y.$current.includes[e.name])?b?j(e.params.$$values(b),n,g(b)):!0:!1:c},y.href=function(a,b,d){d=R({lossy:!0,inherit:!0,absolute:!1,relative:y.$current},d||{});var e=m(a,d.relative);if(!L(e))return null;d.inherit&&(b=i(n,b||{},y.$current,e));var f=e&&d.lossy?e.navigable:e;return f&&f.url!==c&&null!==f.url?p.href(f.url,k(e.params.$$keys().concat(\"#\"),b||{}),{absolute:d.absolute}):null},y.get=function(a,b){if(0===arguments.length)return o(g(z),function(a){return z[a].self});var c=m(a,b||y.$current);return c&&c.self?c.self:null},y}function w(a,b,c,d,e,f){function g(a,b,c){function d(b){return\"search\"!=a.params[b].location}var e=a.params.$$keys().filter(d),f=l.apply({},[a.params].concat(e)),g=new U.ParamSet(f);return g.$$equals(b,c)}return!f.reload&&a===c&&(e===c.locals||a.self.reloadOnSearch===!1&&g(c,d,b))?!0:void 0}var x,y,z={},A={},B=\"abstract\",C={parent:function(a){if(L(a.parent)&&a.parent)return m(a.parent);var b=/^(.+)\\.[^.]+$/.exec(a.name);return b?m(b[1]):x},data:function(a){return a.parent&&a.parent.data&&(a.data=a.self.data=d(a.parent.data,a.data)),a.data},url:function(a){var b=a.url,c={params:a.params||{}};if(N(b))return\"^\"==b.charAt(0)?e.compile(b.substring(1),c):(a.parent.navigable||x).url.concat(b,c);if(!b||e.isMatcher(b))return b;throw new Error(\"Invalid url '\"+b+\"' in state '\"+a+\"'\")},navigable:function(a){return a.url?a:a.parent?a.parent.navigable:null},ownParams:function(a){var b=a.url&&a.url.params||new U.ParamSet;return Q(a.params||{},function(a,c){b[c]||(b[c]=new U.Param(c,null,a,\"config\"))}),b},params:function(a){var b=l(a.ownParams,a.ownParams.$$keys());return a.parent&&a.parent.params?R(a.parent.params.$$new(),b):new U.ParamSet},views:function(a){var b={};return Q(L(a.views)?a.views:{\"\":a},function(c,d){d.indexOf(\"@\")<0&&(d+=\"@\"+a.parent.name),b[d]=c}),b},path:function(a){return a.parent?a.parent.path.concat(a):[]},includes:function(a){var b=a.parent?R({},a.parent.includes):{};return b[a.name]=!0,b},$delegates:{}};x=q({name:\"\",url:\"^\",views:null,\"abstract\":!0}),x.navigable=null,this.decorator=t,this.state=u,this.$get=v,v.$inject=[\"$rootScope\",\"$q\",\"$view\",\"$injector\",\"$resolve\",\"$stateParams\",\"$urlRouter\",\"$location\",\"$urlMatcherFactory\"]}function w(){function a(a,b){return{load:function(a,c){var d,e={template:null,controller:null,view:null,locals:null,notify:!0,async:!0,params:{}};return c=R(e,c),c.view&&(d=b.fromConfig(c.view,c.params,c.locals)),d}}}this.$get=a,a.$inject=[\"$rootScope\",\"$templateFactory\"]}function x(){var a=!1;this.useAnchorScroll=function(){a=!0},this.$get=[\"$anchorScroll\",\"$timeout\",function(b,c){return a?b:function(a){return c(function(){a[0].scrollIntoView()},0,!1)}}]}function y(a,c,d,e){function f(){return c.has?function(a){return c.has(a)?c.get(a):null}:function(a){try{return c.get(a)}catch(b){return null}}}function g(a,c){function d(a){return 1===V&&W>=4?!!j.enabled(a):1===V&&W>=2?!!j.enabled():!!i}var e={enter:function(a,b,c){b.after(a),c()},leave:function(a,b){a.remove(),b()}};if(a.noanimation)return e;if(j)return{enter:function(a,c,f){d(a)?b.version.minor>2?j.enter(a,null,c).then(f):j.enter(a,null,c,f):e.enter(a,c,f)},leave:function(a,c){d(a)?b.version.minor>2?j.leave(a).then(c):j.leave(a,c):e.leave(a,c)}};if(i){var f=i&&i(c,a);return{enter:function(a,b,c){f.enter(a,null,b),c()},leave:function(a,b){f.leave(a),b()}}}return e}var h=f(),i=h(\"$animator\"),j=h(\"$animate\"),k={restrict:\"ECA\",terminal:!0,priority:400,transclude:\"element\",compile:function(c,f,h){return function(c,f,i){function j(){function a(){b&&b.remove(),c&&c.$destroy()}var b=l,c=n;c&&(c._willBeDestroyed=!0),m?(r.leave(m,function(){a(),l=null}),l=m):(a(),l=null),m=null,n=null}function k(g){var k,l=A(c,i,f,e),s=l&&a.$current&&a.$current.locals[l];if((g||s!==o)&&!c._willBeDestroyed){k=c.$new(),o=a.$current.locals[l],k.$emit(\"$viewContentLoading\",l);var t=h(k,function(a){r.enter(a,f,function(){n&&n.$emit(\"$viewContentAnimationEnded\"),(b.isDefined(q)&&!q||c.$eval(q))&&d(a)}),j()});m=t,n=k,n.$emit(\"$viewContentLoaded\",l),n.$eval(p)}}var l,m,n,o,p=i.onload||\"\",q=i.autoscroll,r=g(i,c);c.$on(\"$stateChangeSuccess\",function(){k(!1)}),k(!0)}}};return k}function z(a,b,c,d){return{restrict:\"ECA\",priority:-400,compile:function(e){var f=e.html();return function(e,g,h){var i=c.$current,j=A(e,h,g,d),k=i&&i.locals[j];if(k){g.data(\"$uiView\",{name:j,state:k.$$state}),g.html(k.$template?k.$template:f);var l=a(g.contents());if(k.$$controller){k.$scope=e,k.$element=g;var m=b(k.$$controller,k);k.$$controllerAs&&(e[k.$$controllerAs]=m),g.data(\"$ngControllerController\",m),g.children().data(\"$ngControllerController\",m)}l(e)}}}}}function A(a,b,c,d){var e=d(b.uiView||b.name||\"\")(a),f=c.inheritedData(\"$uiView\");return e.indexOf(\"@\")>=0?e:e+\"@\"+(f?f.state.name:\"\")}function B(a,b){var c,d=a.match(/^\\s*({[^}]*})\\s*$/);if(d&&(a=b+\"(\"+d[1]+\")\"),c=a.replace(/\\n/g,\" \").match(/^([^(]+?)\\s*(\\((.*)\\))?$/),!c||4!==c.length)throw new Error(\"Invalid state ref '\"+a+\"'\");return{state:c[1],paramExpr:c[3]||null}}function C(a){var b=a.parent().inheritedData(\"$uiView\");return b&&b.state&&b.state.name?b.state:void 0}function D(a){var b=\"[object SVGAnimatedString]\"===Object.prototype.toString.call(a.prop(\"href\")),c=\"FORM\"===a[0].nodeName;return{attr:c?\"action\":b?\"xlink:href\":\"href\",isAnchor:\"A\"===a.prop(\"tagName\").toUpperCase(),clickable:!c}}function E(a,b,c,d,e){return function(f){var g=f.which||f.button,h=e();if(!(g>1||f.ctrlKey||f.metaKey||f.shiftKey||a.attr(\"target\"))){var i=c(function(){b.go(h.state,h.params,h.options)});f.preventDefault();var j=d.isAnchor&&!h.href?1:0;f.preventDefault=function(){j--<=0&&c.cancel(i)}}}}function F(a,b){return{relative:C(a)||b.$current,inherit:!0}}function G(a,c){return{restrict:\"A\",require:[\"?^uiSrefActive\",\"?^uiSrefActiveEq\"],link:function(d,e,f,g){var h=B(f.uiSref,a.current.name),i={state:h.state,href:null,params:null},j=D(e),k=g[1]||g[0];i.options=R(F(e,a),f.uiSrefOpts?d.$eval(f.uiSrefOpts):{});var l=function(c){c&&(i.params=b.copy(c)),i.href=a.href(h.state,i.params,i.options),k&&k.$$addStateInfo(h.state,i.params),null!==i.href&&f.$set(j.attr,i.href)};h.paramExpr&&(d.$watch(h.paramExpr,function(a){a!==i.params&&l(a)},!0),i.params=b.copy(d.$eval(h.paramExpr))),l(),j.clickable&&e.bind(\"click\",E(e,a,c,j,function(){return i}))}}}function H(a,b){return{restrict:\"A\",require:[\"?^uiSrefActive\",\"?^uiSrefActiveEq\"],link:function(c,d,e,f){function g(b){l.state=b[0],l.params=b[1],l.options=b[2],l.href=a.href(l.state,l.params,l.options),i&&i.$$addStateInfo(l.state,l.params),l.href&&e.$set(h.attr,l.href)}var h=D(d),i=f[1]||f[0],j=[e.uiState,e.uiStateParams||null,e.uiStateOpts||null],k=\"[\"+j.map(function(a){return a||\"null\"}).join(\", \")+\"]\",l={state:null,params:null,options:null,href:null};c.$watch(k,g,!0),g(c.$eval(k)),h.clickable&&d.bind(\"click\",E(d,a,b,h,function(){return l}))}}}function I(a,b,c){return{restrict:\"A\",controller:[\"$scope\",\"$element\",\"$attrs\",\"$timeout\",function(b,d,e,f){function g(b,c,e){var f=a.get(b,C(d)),g=h(b,c);p.push({state:f||{name:b},params:c,hash:g}),q[g]=e}function h(a,c){if(!N(a))throw new Error(\"state should be a string\");return O(c)?a+T(c):(c=b.$eval(c),O(c)?a+T(c):a)}function i(){for(var a=0;a<p.length;a++)l(p[a].state,p[a].params)?j(d,q[p[a].hash]):k(d,q[p[a].hash]),m(p[a].state,p[a].params)?j(d,n):k(d,n)}function j(a,b){f(function(){a.addClass(b)})}function k(a,b){a.removeClass(b)}function l(b,c){return a.includes(b.name,c)}function m(b,c){return a.is(b.name,c)}var n,o,p=[],q={};n=c(e.uiSrefActiveEq||\"\",!1)(b);try{o=b.$eval(e.uiSrefActive)}catch(r){}o=o||c(e.uiSrefActive||\"\",!1)(b),O(o)&&Q(o,function(c,d){if(N(c)){var e=B(c,a.current.name);g(e.state,b.$eval(e.paramExpr),d)}}),this.$$addStateInfo=function(a,b){O(o)&&p.length>0||(g(a,b,o),i())},b.$on(\"$stateChangeSuccess\",i),i()}]}}function J(a){var b=function(b,c){return a.is(b,c)};return b.$stateful=!0,b}function K(a){var b=function(b,c,d){return a.includes(b,c,d)};return b.$stateful=!0,b}var L=b.isDefined,M=b.isFunction,N=b.isString,O=b.isObject,P=b.isArray,Q=b.forEach,R=b.extend,S=b.copy,T=b.toJson;b.module(\"ui.router.util\",[\"ng\"]),b.module(\"ui.router.router\",[\"ui.router.util\"]),b.module(\"ui.router.state\",[\"ui.router.router\",\"ui.router.util\"]),b.module(\"ui.router\",[\"ui.router.state\"]),b.module(\"ui.router.compat\",[\"ui.router\"]),p.$inject=[\"$q\",\"$injector\"],b.module(\"ui.router.util\").service(\"$resolve\",p),q.$inject=[\"$http\",\"$templateCache\",\"$injector\"],b.module(\"ui.router.util\").service(\"$templateFactory\",q);var U;r.prototype.concat=function(a,b){var c={caseInsensitive:U.caseInsensitive(),strict:U.strictMode(),squash:U.defaultSquashPolicy()};return new r(this.sourcePath+a+this.sourceSearch,R(c,b),this)},r.prototype.toString=function(){return this.source},r.prototype.exec=function(a,b){function c(a){function b(a){return a.split(\"\").reverse().join(\"\")}function c(a){return a.replace(/\\\\-/g,\"-\")}var d=b(a).split(/-(?!\\\\)/),e=o(d,b);return o(e,c).reverse()}var d=this.regexp.exec(a);if(!d)return null;b=b||{};var e,f,g,h=this.parameters(),i=h.length,j=this.segments.length-1,k={};if(j!==d.length-1)throw new Error(\"Unbalanced capture group in route '\"+this.source+\"'\");var l,m;for(e=0;j>e;e++){for(g=h[e],l=this.params[g],m=d[e+1],f=0;f<l.replace.length;f++)l.replace[f].from===m&&(m=l.replace[f].to);m&&l.array===!0&&(m=c(m)),L(m)&&(m=l.type.decode(m)),k[g]=l.value(m)}for(;i>e;e++){for(g=h[e],k[g]=this.params[g].value(b[g]),l=this.params[g],m=b[g],f=0;f<l.replace.length;f++)l.replace[f].from===m&&(m=l.replace[f].to);L(m)&&(m=l.type.decode(m)),k[g]=l.value(m)}return k},r.prototype.parameters=function(a){return L(a)?this.params[a]||null:this.$$paramNames},r.prototype.validates=function(a){return this.params.$$validates(a)},r.prototype.format=function(a){function b(a){return encodeURIComponent(a).replace(/-/g,function(a){return\"%5C%\"+a.charCodeAt(0).toString(16).toUpperCase()})}a=a||{};var c=this.segments,d=this.parameters(),e=this.params;if(!this.validates(a))return null;var f,g=!1,h=c.length-1,i=d.length,j=c[0];for(f=0;i>f;f++){var k=h>f,l=d[f],m=e[l],n=m.value(a[l]),p=m.isOptional&&m.type.equals(m.value(),n),q=p?m.squash:!1,r=m.type.encode(n);if(k){var s=c[f+1],t=f+1===h;if(q===!1)null!=r&&(j+=P(r)?o(r,b).join(\"-\"):encodeURIComponent(r)),j+=s;else if(q===!0){var u=j.match(/\\/$/)?/\\/?(.*)/:/(.*)/;j+=s.match(u)[1]}else N(q)&&(j+=q+s);t&&m.squash===!0&&\"/\"===j.slice(-1)&&(j=j.slice(0,-1))}else{if(null==r||p&&q!==!1)continue;if(P(r)||(r=[r]),0===r.length)continue;r=o(r,encodeURIComponent).join(\"&\"+l+\"=\"),j+=(g?\"&\":\"?\")+(l+\"=\"+r),g=!0}}return j},s.prototype.is=function(a,b){return!0},s.prototype.encode=function(a,b){return a},s.prototype.decode=function(a,b){return a},s.prototype.equals=function(a,b){return a==b},s.prototype.$subPattern=function(){var a=this.pattern.toString();return a.substr(1,a.length-2)},s.prototype.pattern=/.*/,s.prototype.toString=function(){return\"{Type:\"+this.name+\"}\"},s.prototype.$normalize=function(a){return this.is(a)?a:this.decode(a)},s.prototype.$asArray=function(a,b){function d(a,b){function d(a,b){return function(){return a[b].apply(a,arguments)}}function e(a){return P(a)?a:L(a)?[a]:[]}function f(a){switch(a.length){case 0:return c;case 1:return\"auto\"===b?a[0]:a;default:return a}}function g(a){return!a}function h(a,b){return function(c){if(P(c)&&0===c.length)return c;c=e(c);var d=o(c,a);return b===!0?0===n(d,g).length:f(d)}}function i(a){return function(b,c){var d=e(b),f=e(c);if(d.length!==f.length)return!1;for(var g=0;g<d.length;g++)if(!a(d[g],f[g]))return!1;return!0}}this.encode=h(d(a,\"encode\")),this.decode=h(d(a,\"decode\")),this.is=h(d(a,\"is\"),!0),this.equals=i(d(a,\"equals\")),this.pattern=a.pattern,this.$normalize=h(d(a,\"$normalize\")),this.name=a.name,this.$arrayMode=b}if(!a)return this;if(\"auto\"===a&&!b)throw new Error(\"'auto' array mode is for query parameters only\");return new d(this,a)},b.module(\"ui.router.util\").provider(\"$urlMatcherFactory\",t),b.module(\"ui.router.util\").run([\"$urlMatcherFactory\",function(a){}]),u.$inject=[\"$locationProvider\",\"$urlMatcherFactoryProvider\"],b.module(\"ui.router.router\").provider(\"$urlRouter\",u),v.$inject=[\"$urlRouterProvider\",\"$urlMatcherFactoryProvider\"],b.module(\"ui.router.state\").factory(\"$stateParams\",function(){return{}}).provider(\"$state\",v),w.$inject=[],b.module(\"ui.router.state\").provider(\"$view\",w),b.module(\"ui.router.state\").provider(\"$uiViewScroll\",x);var V=b.version.major,W=b.version.minor;y.$inject=[\"$state\",\"$injector\",\"$uiViewScroll\",\"$interpolate\"],z.$inject=[\"$compile\",\"$controller\",\"$state\",\"$interpolate\"],b.module(\"ui.router.state\").directive(\"uiView\",y),b.module(\"ui.router.state\").directive(\"uiView\",z),G.$inject=[\"$state\",\"$timeout\"],H.$inject=[\"$state\",\"$timeout\"],I.$inject=[\"$state\",\"$stateParams\",\"$interpolate\"],b.module(\"ui.router.state\").directive(\"uiSref\",G).directive(\"uiSrefActive\",I).directive(\"uiSrefActiveEq\",I).directive(\"uiState\",H),\nJ.$inject=[\"$state\"],K.$inject=[\"$state\"],b.module(\"ui.router.state\").filter(\"isState\",J).filter(\"includedByState\",K)}(window,window.angular);\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDUuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9+L2FuZ3VsYXItdWktcm91dGVyL3JlbGVhc2UvYW5ndWxhci11aS1yb3V0ZXIubWluLmpzPzBiNzAiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBTdGF0ZS1iYXNlZCByb3V0aW5nIGZvciBBbmd1bGFySlNcbiAqIEB2ZXJzaW9uIHYwLjIuMThcbiAqIEBsaW5rIGh0dHA6Ly9hbmd1bGFyLXVpLmdpdGh1Yi5jb20vXG4gKiBAbGljZW5zZSBNSVQgTGljZW5zZSwgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVRcbiAqL1xuXCJ1bmRlZmluZWRcIiE9dHlwZW9mIG1vZHVsZSYmXCJ1bmRlZmluZWRcIiE9dHlwZW9mIGV4cG9ydHMmJm1vZHVsZS5leHBvcnRzPT09ZXhwb3J0cyYmKG1vZHVsZS5leHBvcnRzPVwidWkucm91dGVyXCIpLGZ1bmN0aW9uKGEsYixjKXtcInVzZSBzdHJpY3RcIjtmdW5jdGlvbiBkKGEsYil7cmV0dXJuIFIobmV3KFIoZnVuY3Rpb24oKXt9LHtwcm90b3R5cGU6YX0pKSxiKX1mdW5jdGlvbiBlKGEpe3JldHVybiBRKGFyZ3VtZW50cyxmdW5jdGlvbihiKXtiIT09YSYmUShiLGZ1bmN0aW9uKGIsYyl7YS5oYXNPd25Qcm9wZXJ0eShjKXx8KGFbY109Yil9KX0pLGF9ZnVuY3Rpb24gZihhLGIpe3ZhciBjPVtdO2Zvcih2YXIgZCBpbiBhLnBhdGgpe2lmKGEucGF0aFtkXSE9PWIucGF0aFtkXSlicmVhaztjLnB1c2goYS5wYXRoW2RdKX1yZXR1cm4gY31mdW5jdGlvbiBnKGEpe2lmKE9iamVjdC5rZXlzKXJldHVybiBPYmplY3Qua2V5cyhhKTt2YXIgYj1bXTtyZXR1cm4gUShhLGZ1bmN0aW9uKGEsYyl7Yi5wdXNoKGMpfSksYn1mdW5jdGlvbiBoKGEsYil7aWYoQXJyYXkucHJvdG90eXBlLmluZGV4T2YpcmV0dXJuIGEuaW5kZXhPZihiLE51bWJlcihhcmd1bWVudHNbMl0pfHwwKTt2YXIgYz1hLmxlbmd0aD4+PjAsZD1OdW1iZXIoYXJndW1lbnRzWzJdKXx8MDtmb3IoZD0wPmQ/TWF0aC5jZWlsKGQpOk1hdGguZmxvb3IoZCksMD5kJiYoZCs9Yyk7Yz5kO2QrKylpZihkIGluIGEmJmFbZF09PT1iKXJldHVybiBkO3JldHVybi0xfWZ1bmN0aW9uIGkoYSxiLGMsZCl7dmFyIGUsaT1mKGMsZCksaj17fSxrPVtdO2Zvcih2YXIgbCBpbiBpKWlmKGlbbF0mJmlbbF0ucGFyYW1zJiYoZT1nKGlbbF0ucGFyYW1zKSxlLmxlbmd0aCkpZm9yKHZhciBtIGluIGUpaChrLGVbbV0pPj0wfHwoay5wdXNoKGVbbV0pLGpbZVttXV09YVtlW21dXSk7cmV0dXJuIFIoe30saixiKX1mdW5jdGlvbiBqKGEsYixjKXtpZighYyl7Yz1bXTtmb3IodmFyIGQgaW4gYSljLnB1c2goZCl9Zm9yKHZhciBlPTA7ZTxjLmxlbmd0aDtlKyspe3ZhciBmPWNbZV07aWYoYVtmXSE9YltmXSlyZXR1cm4hMX1yZXR1cm4hMH1mdW5jdGlvbiBrKGEsYil7dmFyIGM9e307cmV0dXJuIFEoYSxmdW5jdGlvbihhKXtjW2FdPWJbYV19KSxjfWZ1bmN0aW9uIGwoYSl7dmFyIGI9e30sYz1BcnJheS5wcm90b3R5cGUuY29uY2F0LmFwcGx5KEFycmF5LnByb3RvdHlwZSxBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMSkpO3JldHVybiBRKGMsZnVuY3Rpb24oYyl7YyBpbiBhJiYoYltjXT1hW2NdKX0pLGJ9ZnVuY3Rpb24gbShhKXt2YXIgYj17fSxjPUFycmF5LnByb3RvdHlwZS5jb25jYXQuYXBwbHkoQXJyYXkucHJvdG90eXBlLEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywxKSk7Zm9yKHZhciBkIGluIGEpLTE9PWgoYyxkKSYmKGJbZF09YVtkXSk7cmV0dXJuIGJ9ZnVuY3Rpb24gbihhLGIpe3ZhciBjPVAoYSksZD1jP1tdOnt9O3JldHVybiBRKGEsZnVuY3Rpb24oYSxlKXtiKGEsZSkmJihkW2M/ZC5sZW5ndGg6ZV09YSl9KSxkfWZ1bmN0aW9uIG8oYSxiKXt2YXIgYz1QKGEpP1tdOnt9O3JldHVybiBRKGEsZnVuY3Rpb24oYSxkKXtjW2RdPWIoYSxkKX0pLGN9ZnVuY3Rpb24gcChhLGIpe3ZhciBkPTEsZj0yLGk9e30saj1bXSxrPWksbD1SKGEud2hlbihpKSx7JCRwcm9taXNlczppLCQkdmFsdWVzOml9KTt0aGlzLnN0dWR5PWZ1bmN0aW9uKGkpe2Z1bmN0aW9uIG4oYSxjKXtpZihzW2NdIT09Zil7aWYoci5wdXNoKGMpLHNbY109PT1kKXRocm93IHIuc3BsaWNlKDAsaChyLGMpKSxuZXcgRXJyb3IoXCJDeWNsaWMgZGVwZW5kZW5jeTogXCIrci5qb2luKFwiIC0+IFwiKSk7aWYoc1tjXT1kLE4oYSkpcS5wdXNoKGMsW2Z1bmN0aW9uKCl7cmV0dXJuIGIuZ2V0KGEpfV0saik7ZWxzZXt2YXIgZT1iLmFubm90YXRlKGEpO1EoZSxmdW5jdGlvbihhKXthIT09YyYmaS5oYXNPd25Qcm9wZXJ0eShhKSYmbihpW2FdLGEpfSkscS5wdXNoKGMsYSxlKX1yLnBvcCgpLHNbY109Zn19ZnVuY3Rpb24gbyhhKXtyZXR1cm4gTyhhKSYmYS50aGVuJiZhLiQkcHJvbWlzZXN9aWYoIU8oaSkpdGhyb3cgbmV3IEVycm9yKFwiJ2ludm9jYWJsZXMnIG11c3QgYmUgYW4gb2JqZWN0XCIpO3ZhciBwPWcoaXx8e30pLHE9W10scj1bXSxzPXt9O3JldHVybiBRKGksbiksaT1yPXM9bnVsbCxmdW5jdGlvbihkLGYsZyl7ZnVuY3Rpb24gaCgpey0tdXx8KHZ8fGUodCxmLiQkdmFsdWVzKSxyLiQkdmFsdWVzPXQsci4kJHByb21pc2VzPXIuJCRwcm9taXNlc3x8ITAsZGVsZXRlIHIuJCRpbmhlcml0ZWRWYWx1ZXMsbi5yZXNvbHZlKHQpKX1mdW5jdGlvbiBpKGEpe3IuJCRmYWlsdXJlPWEsbi5yZWplY3QoYSl9ZnVuY3Rpb24gaihjLGUsZil7ZnVuY3Rpb24gaihhKXtsLnJlamVjdChhKSxpKGEpfWZ1bmN0aW9uIGsoKXtpZighTChyLiQkZmFpbHVyZSkpdHJ5e2wucmVzb2x2ZShiLmludm9rZShlLGcsdCkpLGwucHJvbWlzZS50aGVuKGZ1bmN0aW9uKGEpe3RbY109YSxoKCl9LGopfWNhdGNoKGEpe2ooYSl9fXZhciBsPWEuZGVmZXIoKSxtPTA7UShmLGZ1bmN0aW9uKGEpe3MuaGFzT3duUHJvcGVydHkoYSkmJiFkLmhhc093blByb3BlcnR5KGEpJiYobSsrLHNbYV0udGhlbihmdW5jdGlvbihiKXt0W2FdPWIsLS1tfHxrKCl9LGopKX0pLG18fGsoKSxzW2NdPWwucHJvbWlzZX1pZihvKGQpJiZnPT09YyYmKGc9ZixmPWQsZD1udWxsKSxkKXtpZighTyhkKSl0aHJvdyBuZXcgRXJyb3IoXCInbG9jYWxzJyBtdXN0IGJlIGFuIG9iamVjdFwiKX1lbHNlIGQ9aztpZihmKXtpZighbyhmKSl0aHJvdyBuZXcgRXJyb3IoXCIncGFyZW50JyBtdXN0IGJlIGEgcHJvbWlzZSByZXR1cm5lZCBieSAkcmVzb2x2ZS5yZXNvbHZlKClcIil9ZWxzZSBmPWw7dmFyIG49YS5kZWZlcigpLHI9bi5wcm9taXNlLHM9ci4kJHByb21pc2VzPXt9LHQ9Uih7fSxkKSx1PTErcS5sZW5ndGgvMyx2PSExO2lmKEwoZi4kJGZhaWx1cmUpKXJldHVybiBpKGYuJCRmYWlsdXJlKSxyO2YuJCRpbmhlcml0ZWRWYWx1ZXMmJmUodCxtKGYuJCRpbmhlcml0ZWRWYWx1ZXMscCkpLFIocyxmLiQkcHJvbWlzZXMpLGYuJCR2YWx1ZXM/KHY9ZSh0LG0oZi4kJHZhbHVlcyxwKSksci4kJGluaGVyaXRlZFZhbHVlcz1tKGYuJCR2YWx1ZXMscCksaCgpKTooZi4kJGluaGVyaXRlZFZhbHVlcyYmKHIuJCRpbmhlcml0ZWRWYWx1ZXM9bShmLiQkaW5oZXJpdGVkVmFsdWVzLHApKSxmLnRoZW4oaCxpKSk7Zm9yKHZhciB3PTAseD1xLmxlbmd0aDt4Pnc7dys9MylkLmhhc093blByb3BlcnR5KHFbd10pP2goKTpqKHFbd10scVt3KzFdLHFbdysyXSk7cmV0dXJuIHJ9fSx0aGlzLnJlc29sdmU9ZnVuY3Rpb24oYSxiLGMsZCl7cmV0dXJuIHRoaXMuc3R1ZHkoYSkoYixjLGQpfX1mdW5jdGlvbiBxKGEsYixjKXt0aGlzLmZyb21Db25maWc9ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBMKGEudGVtcGxhdGUpP3RoaXMuZnJvbVN0cmluZyhhLnRlbXBsYXRlLGIpOkwoYS50ZW1wbGF0ZVVybCk/dGhpcy5mcm9tVXJsKGEudGVtcGxhdGVVcmwsYik6TChhLnRlbXBsYXRlUHJvdmlkZXIpP3RoaXMuZnJvbVByb3ZpZGVyKGEudGVtcGxhdGVQcm92aWRlcixiLGMpOm51bGx9LHRoaXMuZnJvbVN0cmluZz1mdW5jdGlvbihhLGIpe3JldHVybiBNKGEpP2EoYik6YX0sdGhpcy5mcm9tVXJsPWZ1bmN0aW9uKGMsZCl7cmV0dXJuIE0oYykmJihjPWMoZCkpLG51bGw9PWM/bnVsbDphLmdldChjLHtjYWNoZTpiLGhlYWRlcnM6e0FjY2VwdDpcInRleHQvaHRtbFwifX0pLnRoZW4oZnVuY3Rpb24oYSl7cmV0dXJuIGEuZGF0YX0pfSx0aGlzLmZyb21Qcm92aWRlcj1mdW5jdGlvbihhLGIsZCl7cmV0dXJuIGMuaW52b2tlKGEsbnVsbCxkfHx7cGFyYW1zOmJ9KX19ZnVuY3Rpb24gcihhLGIsZSl7ZnVuY3Rpb24gZihiLGMsZCxlKXtpZihxLnB1c2goYiksb1tiXSlyZXR1cm4gb1tiXTtpZighL15cXHcrKFstLl0rXFx3KykqKD86XFxbXFxdKT8kLy50ZXN0KGIpKXRocm93IG5ldyBFcnJvcihcIkludmFsaWQgcGFyYW1ldGVyIG5hbWUgJ1wiK2IrXCInIGluIHBhdHRlcm4gJ1wiK2ErXCInXCIpO2lmKHBbYl0pdGhyb3cgbmV3IEVycm9yKFwiRHVwbGljYXRlIHBhcmFtZXRlciBuYW1lICdcIitiK1wiJyBpbiBwYXR0ZXJuICdcIithK1wiJ1wiKTtyZXR1cm4gcFtiXT1uZXcgVS5QYXJhbShiLGMsZCxlKSxwW2JdfWZ1bmN0aW9uIGcoYSxiLGMsZCl7dmFyIGU9W1wiXCIsXCJcIl0sZj1hLnJlcGxhY2UoL1tcXFxcXFxbXFxdXFxeJCorPy4oKXx7fV0vZyxcIlxcXFwkJlwiKTtpZighYilyZXR1cm4gZjtzd2l0Y2goYyl7Y2FzZSExOmU9W1wiKFwiLFwiKVwiKyhkP1wiP1wiOlwiXCIpXTticmVhaztjYXNlITA6Zj1mLnJlcGxhY2UoL1xcLyQvLFwiXCIpLGU9W1wiKD86LyhcIixcIil8Lyk/XCJdO2JyZWFrO2RlZmF1bHQ6ZT1bXCIoXCIrYytcInxcIixcIik/XCJdfXJldHVybiBmK2VbMF0rYitlWzFdfWZ1bmN0aW9uIGgoZSxmKXt2YXIgZyxoLGksaixrO3JldHVybiBnPWVbMl18fGVbM10saz1iLnBhcmFtc1tnXSxpPWEuc3Vic3RyaW5nKG0sZS5pbmRleCksaD1mP2VbNF06ZVs0XXx8KFwiKlwiPT1lWzFdP1wiLipcIjpudWxsKSxoJiYoaj1VLnR5cGUoaCl8fGQoVS50eXBlKFwic3RyaW5nXCIpLHtwYXR0ZXJuOm5ldyBSZWdFeHAoaCxiLmNhc2VJbnNlbnNpdGl2ZT9cImlcIjpjKX0pKSx7aWQ6ZyxyZWdleHA6aCxzZWdtZW50OmksdHlwZTpqLGNmZzprfX1iPVIoe3BhcmFtczp7fX0sTyhiKT9iOnt9KTt2YXIgaSxqPS8oWzoqXSkoW1xcd1xcW1xcXV0rKXxcXHsoW1xcd1xcW1xcXV0rKSg/OlxcOlxccyooKD86W157fVxcXFxdK3xcXFxcLnxcXHsoPzpbXnt9XFxcXF0rfFxcXFwuKSpcXH0pKykpP1xcfS9nLGs9LyhbOl0/KShbXFx3XFxbXFxdLi1dKyl8XFx7KFtcXHdcXFtcXF0uLV0rKSg/OlxcOlxccyooKD86W157fVxcXFxdK3xcXFxcLnxcXHsoPzpbXnt9XFxcXF0rfFxcXFwuKSpcXH0pKykpP1xcfS9nLGw9XCJeXCIsbT0wLG49dGhpcy5zZWdtZW50cz1bXSxvPWU/ZS5wYXJhbXM6e30scD10aGlzLnBhcmFtcz1lP2UucGFyYW1zLiQkbmV3KCk6bmV3IFUuUGFyYW1TZXQscT1bXTt0aGlzLnNvdXJjZT1hO2Zvcih2YXIgcixzLHQ7KGk9ai5leGVjKGEpKSYmKHI9aChpLCExKSwhKHIuc2VnbWVudC5pbmRleE9mKFwiP1wiKT49MCkpOylzPWYoci5pZCxyLnR5cGUsci5jZmcsXCJwYXRoXCIpLGwrPWcoci5zZWdtZW50LHMudHlwZS5wYXR0ZXJuLnNvdXJjZSxzLnNxdWFzaCxzLmlzT3B0aW9uYWwpLG4ucHVzaChyLnNlZ21lbnQpLG09ai5sYXN0SW5kZXg7dD1hLnN1YnN0cmluZyhtKTt2YXIgdT10LmluZGV4T2YoXCI/XCIpO2lmKHU+PTApe3ZhciB2PXRoaXMuc291cmNlU2VhcmNoPXQuc3Vic3RyaW5nKHUpO2lmKHQ9dC5zdWJzdHJpbmcoMCx1KSx0aGlzLnNvdXJjZVBhdGg9YS5zdWJzdHJpbmcoMCxtK3UpLHYubGVuZ3RoPjApZm9yKG09MDtpPWsuZXhlYyh2KTspcj1oKGksITApLHM9ZihyLmlkLHIudHlwZSxyLmNmZyxcInNlYXJjaFwiKSxtPWoubGFzdEluZGV4fWVsc2UgdGhpcy5zb3VyY2VQYXRoPWEsdGhpcy5zb3VyY2VTZWFyY2g9XCJcIjtsKz1nKHQpKyhiLnN0cmljdD09PSExP1wiLz9cIjpcIlwiKStcIiRcIixuLnB1c2godCksdGhpcy5yZWdleHA9bmV3IFJlZ0V4cChsLGIuY2FzZUluc2Vuc2l0aXZlP1wiaVwiOmMpLHRoaXMucHJlZml4PW5bMF0sdGhpcy4kJHBhcmFtTmFtZXM9cX1mdW5jdGlvbiBzKGEpe1IodGhpcyxhKX1mdW5jdGlvbiB0KCl7ZnVuY3Rpb24gYShhKXtyZXR1cm4gbnVsbCE9YT9hLnRvU3RyaW5nKCkucmVwbGFjZSgvfi9nLFwifn5cIikucmVwbGFjZSgvXFwvL2csXCJ+MkZcIik6YX1mdW5jdGlvbiBlKGEpe3JldHVybiBudWxsIT1hP2EudG9TdHJpbmcoKS5yZXBsYWNlKC9+MkYvZyxcIi9cIikucmVwbGFjZSgvfn4vZyxcIn5cIik6YX1mdW5jdGlvbiBmKCl7cmV0dXJue3N0cmljdDpwLGNhc2VJbnNlbnNpdGl2ZTptfX1mdW5jdGlvbiBpKGEpe3JldHVybiBNKGEpfHxQKGEpJiZNKGFbYS5sZW5ndGgtMV0pfWZ1bmN0aW9uIGooKXtmb3IoO3cubGVuZ3RoOyl7dmFyIGE9dy5zaGlmdCgpO2lmKGEucGF0dGVybil0aHJvdyBuZXcgRXJyb3IoXCJZb3UgY2Fubm90IG92ZXJyaWRlIGEgdHlwZSdzIC5wYXR0ZXJuIGF0IHJ1bnRpbWUuXCIpO2IuZXh0ZW5kKHVbYS5uYW1lXSxsLmludm9rZShhLmRlZikpfX1mdW5jdGlvbiBrKGEpe1IodGhpcyxhfHx7fSl9VT10aGlzO3ZhciBsLG09ITEscD0hMCxxPSExLHU9e30sdj0hMCx3PVtdLHg9e3N0cmluZzp7ZW5jb2RlOmEsZGVjb2RlOmUsaXM6ZnVuY3Rpb24oYSl7cmV0dXJuIG51bGw9PWF8fCFMKGEpfHxcInN0cmluZ1wiPT10eXBlb2YgYX0scGF0dGVybjovW15cXC9dKi99LFwiaW50XCI6e2VuY29kZTphLGRlY29kZTpmdW5jdGlvbihhKXtyZXR1cm4gcGFyc2VJbnQoYSwxMCl9LGlzOmZ1bmN0aW9uKGEpe3JldHVybiBMKGEpJiZ0aGlzLmRlY29kZShhLnRvU3RyaW5nKCkpPT09YX0scGF0dGVybjovXFxkKy99LGJvb2w6e2VuY29kZTpmdW5jdGlvbihhKXtyZXR1cm4gYT8xOjB9LGRlY29kZTpmdW5jdGlvbihhKXtyZXR1cm4gMCE9PXBhcnNlSW50KGEsMTApfSxpczpmdW5jdGlvbihhKXtyZXR1cm4gYT09PSEwfHxhPT09ITF9LHBhdHRlcm46LzB8MS99LGRhdGU6e2VuY29kZTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5pcyhhKT9bYS5nZXRGdWxsWWVhcigpLChcIjBcIisoYS5nZXRNb250aCgpKzEpKS5zbGljZSgtMiksKFwiMFwiK2EuZ2V0RGF0ZSgpKS5zbGljZSgtMildLmpvaW4oXCItXCIpOmN9LGRlY29kZTpmdW5jdGlvbihhKXtpZih0aGlzLmlzKGEpKXJldHVybiBhO3ZhciBiPXRoaXMuY2FwdHVyZS5leGVjKGEpO3JldHVybiBiP25ldyBEYXRlKGJbMV0sYlsyXS0xLGJbM10pOmN9LGlzOmZ1bmN0aW9uKGEpe3JldHVybiBhIGluc3RhbmNlb2YgRGF0ZSYmIWlzTmFOKGEudmFsdWVPZigpKX0sZXF1YWxzOmZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMuaXMoYSkmJnRoaXMuaXMoYikmJmEudG9JU09TdHJpbmcoKT09PWIudG9JU09TdHJpbmcoKX0scGF0dGVybjovWzAtOV17NH0tKD86MFsxLTldfDFbMC0yXSktKD86MFsxLTldfFsxLTJdWzAtOV18M1swLTFdKS8sY2FwdHVyZTovKFswLTldezR9KS0oMFsxLTldfDFbMC0yXSktKDBbMS05XXxbMS0yXVswLTldfDNbMC0xXSkvfSxqc29uOntlbmNvZGU6Yi50b0pzb24sZGVjb2RlOmIuZnJvbUpzb24saXM6Yi5pc09iamVjdCxlcXVhbHM6Yi5lcXVhbHMscGF0dGVybjovW15cXC9dKi99LGFueTp7ZW5jb2RlOmIuaWRlbnRpdHksZGVjb2RlOmIuaWRlbnRpdHksZXF1YWxzOmIuZXF1YWxzLHBhdHRlcm46Ly4qL319O3QuJCRnZXREZWZhdWx0VmFsdWU9ZnVuY3Rpb24oYSl7aWYoIWkoYS52YWx1ZSkpcmV0dXJuIGEudmFsdWU7aWYoIWwpdGhyb3cgbmV3IEVycm9yKFwiSW5qZWN0YWJsZSBmdW5jdGlvbnMgY2Fubm90IGJlIGNhbGxlZCBhdCBjb25maWd1cmF0aW9uIHRpbWVcIik7cmV0dXJuIGwuaW52b2tlKGEudmFsdWUpfSx0aGlzLmNhc2VJbnNlbnNpdGl2ZT1mdW5jdGlvbihhKXtyZXR1cm4gTChhKSYmKG09YSksbX0sdGhpcy5zdHJpY3RNb2RlPWZ1bmN0aW9uKGEpe3JldHVybiBMKGEpJiYocD1hKSxwfSx0aGlzLmRlZmF1bHRTcXVhc2hQb2xpY3k9ZnVuY3Rpb24oYSl7aWYoIUwoYSkpcmV0dXJuIHE7aWYoYSE9PSEwJiZhIT09ITEmJiFOKGEpKXRocm93IG5ldyBFcnJvcihcIkludmFsaWQgc3F1YXNoIHBvbGljeTogXCIrYStcIi4gVmFsaWQgcG9saWNpZXM6IGZhbHNlLCB0cnVlLCBhcmJpdHJhcnktc3RyaW5nXCIpO3JldHVybiBxPWEsYX0sdGhpcy5jb21waWxlPWZ1bmN0aW9uKGEsYil7cmV0dXJuIG5ldyByKGEsUihmKCksYikpfSx0aGlzLmlzTWF0Y2hlcj1mdW5jdGlvbihhKXtpZighTyhhKSlyZXR1cm4hMTt2YXIgYj0hMDtyZXR1cm4gUShyLnByb3RvdHlwZSxmdW5jdGlvbihjLGQpe00oYykmJihiPWImJkwoYVtkXSkmJk0oYVtkXSkpfSksYn0sdGhpcy50eXBlPWZ1bmN0aW9uKGEsYixjKXtpZighTChiKSlyZXR1cm4gdVthXTtpZih1Lmhhc093blByb3BlcnR5KGEpKXRocm93IG5ldyBFcnJvcihcIkEgdHlwZSBuYW1lZCAnXCIrYStcIicgaGFzIGFscmVhZHkgYmVlbiBkZWZpbmVkLlwiKTtyZXR1cm4gdVthXT1uZXcgcyhSKHtuYW1lOmF9LGIpKSxjJiYody5wdXNoKHtuYW1lOmEsZGVmOmN9KSx2fHxqKCkpLHRoaXN9LFEoeCxmdW5jdGlvbihhLGIpe3VbYl09bmV3IHMoUih7bmFtZTpifSxhKSl9KSx1PWQodSx7fSksdGhpcy4kZ2V0PVtcIiRpbmplY3RvclwiLGZ1bmN0aW9uKGEpe3JldHVybiBsPWEsdj0hMSxqKCksUSh4LGZ1bmN0aW9uKGEsYil7dVtiXXx8KHVbYl09bmV3IHMoYSkpfSksdGhpc31dLHRoaXMuUGFyYW09ZnVuY3Rpb24oYSxkLGUsZil7ZnVuY3Rpb24gaihhKXt2YXIgYj1PKGEpP2coYSk6W10sYz0tMT09PWgoYixcInZhbHVlXCIpJiYtMT09PWgoYixcInR5cGVcIikmJi0xPT09aChiLFwic3F1YXNoXCIpJiYtMT09PWgoYixcImFycmF5XCIpO3JldHVybiBjJiYoYT17dmFsdWU6YX0pLGEuJCRmbj1pKGEudmFsdWUpP2EudmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gYS52YWx1ZX0sYX1mdW5jdGlvbiBrKGMsZCxlKXtpZihjLnR5cGUmJmQpdGhyb3cgbmV3IEVycm9yKFwiUGFyYW0gJ1wiK2ErXCInIGhhcyB0d28gdHlwZSBjb25maWd1cmF0aW9ucy5cIik7cmV0dXJuIGQ/ZDpjLnR5cGU/Yi5pc1N0cmluZyhjLnR5cGUpP3VbYy50eXBlXTpjLnR5cGUgaW5zdGFuY2VvZiBzP2MudHlwZTpuZXcgcyhjLnR5cGUpOlwiY29uZmlnXCI9PT1lP3UuYW55OnUuc3RyaW5nfWZ1bmN0aW9uIG0oKXt2YXIgYj17YXJyYXk6XCJzZWFyY2hcIj09PWY/XCJhdXRvXCI6ITF9LGM9YS5tYXRjaCgvXFxbXFxdJC8pP3thcnJheTohMH06e307cmV0dXJuIFIoYixjLGUpLmFycmF5fWZ1bmN0aW9uIHAoYSxiKXt2YXIgYz1hLnNxdWFzaDtpZighYnx8Yz09PSExKXJldHVybiExO2lmKCFMKGMpfHxudWxsPT1jKXJldHVybiBxO2lmKGM9PT0hMHx8TihjKSlyZXR1cm4gYzt0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIHNxdWFzaCBwb2xpY3k6ICdcIitjK1wiJy4gVmFsaWQgcG9saWNpZXM6IGZhbHNlLCB0cnVlLCBvciBhcmJpdHJhcnkgc3RyaW5nXCIpfWZ1bmN0aW9uIHIoYSxiLGQsZSl7dmFyIGYsZyxpPVt7ZnJvbTpcIlwiLHRvOmR8fGI/YzpcIlwifSx7ZnJvbTpudWxsLHRvOmR8fGI/YzpcIlwifV07cmV0dXJuIGY9UChhLnJlcGxhY2UpP2EucmVwbGFjZTpbXSxOKGUpJiZmLnB1c2goe2Zyb206ZSx0bzpjfSksZz1vKGYsZnVuY3Rpb24oYSl7cmV0dXJuIGEuZnJvbX0pLG4oaSxmdW5jdGlvbihhKXtyZXR1cm4tMT09PWgoZyxhLmZyb20pfSkuY29uY2F0KGYpfWZ1bmN0aW9uIHQoKXtpZighbCl0aHJvdyBuZXcgRXJyb3IoXCJJbmplY3RhYmxlIGZ1bmN0aW9ucyBjYW5ub3QgYmUgY2FsbGVkIGF0IGNvbmZpZ3VyYXRpb24gdGltZVwiKTt2YXIgYT1sLmludm9rZShlLiQkZm4pO2lmKG51bGwhPT1hJiZhIT09YyYmIXgudHlwZS5pcyhhKSl0aHJvdyBuZXcgRXJyb3IoXCJEZWZhdWx0IHZhbHVlIChcIithK1wiKSBmb3IgcGFyYW1ldGVyICdcIit4LmlkK1wiJyBpcyBub3QgYW4gaW5zdGFuY2Ugb2YgVHlwZSAoXCIreC50eXBlLm5hbWUrXCIpXCIpO3JldHVybiBhfWZ1bmN0aW9uIHYoYSl7ZnVuY3Rpb24gYihhKXtyZXR1cm4gZnVuY3Rpb24oYil7cmV0dXJuIGIuZnJvbT09PWF9fWZ1bmN0aW9uIGMoYSl7dmFyIGM9byhuKHgucmVwbGFjZSxiKGEpKSxmdW5jdGlvbihhKXtyZXR1cm4gYS50b30pO3JldHVybiBjLmxlbmd0aD9jWzBdOmF9cmV0dXJuIGE9YyhhKSxMKGEpP3gudHlwZS4kbm9ybWFsaXplKGEpOnQoKX1mdW5jdGlvbiB3KCl7cmV0dXJuXCJ7UGFyYW06XCIrYStcIiBcIitkK1wiIHNxdWFzaDogJ1wiK0ErXCInIG9wdGlvbmFsOiBcIit6K1wifVwifXZhciB4PXRoaXM7ZT1qKGUpLGQ9ayhlLGQsZik7dmFyIHk9bSgpO2Q9eT9kLiRhc0FycmF5KHksXCJzZWFyY2hcIj09PWYpOmQsXCJzdHJpbmdcIiE9PWQubmFtZXx8eXx8XCJwYXRoXCIhPT1mfHxlLnZhbHVlIT09Y3x8KGUudmFsdWU9XCJcIik7dmFyIHo9ZS52YWx1ZSE9PWMsQT1wKGUseiksQj1yKGUseSx6LEEpO1IodGhpcyx7aWQ6YSx0eXBlOmQsbG9jYXRpb246ZixhcnJheTp5LHNxdWFzaDpBLHJlcGxhY2U6Qixpc09wdGlvbmFsOnosdmFsdWU6dixkeW5hbWljOmMsY29uZmlnOmUsdG9TdHJpbmc6d30pfSxrLnByb3RvdHlwZT17JCRuZXc6ZnVuY3Rpb24oKXtyZXR1cm4gZCh0aGlzLFIobmV3IGsseyQkcGFyZW50OnRoaXN9KSl9LCQka2V5czpmdW5jdGlvbigpe2Zvcih2YXIgYT1bXSxiPVtdLGM9dGhpcyxkPWcoay5wcm90b3R5cGUpO2M7KWIucHVzaChjKSxjPWMuJCRwYXJlbnQ7cmV0dXJuIGIucmV2ZXJzZSgpLFEoYixmdW5jdGlvbihiKXtRKGcoYiksZnVuY3Rpb24oYil7LTE9PT1oKGEsYikmJi0xPT09aChkLGIpJiZhLnB1c2goYil9KX0pLGF9LCQkdmFsdWVzOmZ1bmN0aW9uKGEpe3ZhciBiPXt9LGM9dGhpcztyZXR1cm4gUShjLiQka2V5cygpLGZ1bmN0aW9uKGQpe2JbZF09Y1tkXS52YWx1ZShhJiZhW2RdKX0pLGJ9LCQkZXF1YWxzOmZ1bmN0aW9uKGEsYil7dmFyIGM9ITAsZD10aGlzO3JldHVybiBRKGQuJCRrZXlzKCksZnVuY3Rpb24oZSl7dmFyIGY9YSYmYVtlXSxnPWImJmJbZV07ZFtlXS50eXBlLmVxdWFscyhmLGcpfHwoYz0hMSl9KSxjfSwkJHZhbGlkYXRlczpmdW5jdGlvbihhKXt2YXIgZCxlLGYsZyxoLGk9dGhpcy4kJGtleXMoKTtmb3IoZD0wO2Q8aS5sZW5ndGgmJihlPXRoaXNbaVtkXV0sZj1hW2lbZF1dLGYhPT1jJiZudWxsIT09Znx8IWUuaXNPcHRpb25hbCk7ZCsrKXtpZihnPWUudHlwZS4kbm9ybWFsaXplKGYpLCFlLnR5cGUuaXMoZykpcmV0dXJuITE7aWYoaD1lLnR5cGUuZW5jb2RlKGcpLGIuaXNTdHJpbmcoaCkmJiFlLnR5cGUucGF0dGVybi5leGVjKGgpKXJldHVybiExfXJldHVybiEwfSwkJHBhcmVudDpjfSx0aGlzLlBhcmFtU2V0PWt9ZnVuY3Rpb24gdShhLGQpe2Z1bmN0aW9uIGUoYSl7dmFyIGI9L15cXF4oKD86XFxcXFteYS16QS1aMC05XXxbXlxcXFxcXFtcXF1cXF4kKis/LigpfHt9XSspKikvLmV4ZWMoYS5zb3VyY2UpO3JldHVybiBudWxsIT1iP2JbMV0ucmVwbGFjZSgvXFxcXCguKS9nLFwiJDFcIik6XCJcIn1mdW5jdGlvbiBmKGEsYil7cmV0dXJuIGEucmVwbGFjZSgvXFwkKFxcJHxcXGR7MSwyfSkvLGZ1bmN0aW9uKGEsYyl7cmV0dXJuIGJbXCIkXCI9PT1jPzA6TnVtYmVyKGMpXX0pfWZ1bmN0aW9uIGcoYSxiLGMpe2lmKCFjKXJldHVybiExO3ZhciBkPWEuaW52b2tlKGIsYix7JG1hdGNoOmN9KTtyZXR1cm4gTChkKT9kOiEwfWZ1bmN0aW9uIGgoZCxlLGYsZyxoKXtmdW5jdGlvbiBtKGEsYixjKXtyZXR1cm5cIi9cIj09PXE/YTpiP3Euc2xpY2UoMCwtMSkrYTpjP3Euc2xpY2UoMSkrYTphfWZ1bmN0aW9uIG4oYSl7ZnVuY3Rpb24gYihhKXt2YXIgYj1hKGYsZCk7cmV0dXJuIGI/KE4oYikmJmQucmVwbGFjZSgpLnVybChiKSwhMCk6ITF9aWYoIWF8fCFhLmRlZmF1bHRQcmV2ZW50ZWQpe3AmJmQudXJsKCk9PT1wO3A9Yzt2YXIgZSxnPWoubGVuZ3RoO2ZvcihlPTA7Zz5lO2UrKylpZihiKGpbZV0pKXJldHVybjtrJiZiKGspfX1mdW5jdGlvbiBvKCl7cmV0dXJuIGk9aXx8ZS4kb24oXCIkbG9jYXRpb25DaGFuZ2VTdWNjZXNzXCIsbil9dmFyIHAscT1nLmJhc2VIcmVmKCkscj1kLnVybCgpO3JldHVybiBsfHxvKCkse3N5bmM6ZnVuY3Rpb24oKXtuKCl9LGxpc3RlbjpmdW5jdGlvbigpe3JldHVybiBvKCl9LHVwZGF0ZTpmdW5jdGlvbihhKXtyZXR1cm4gYT92b2lkKHI9ZC51cmwoKSk6dm9pZChkLnVybCgpIT09ciYmKGQudXJsKHIpLGQucmVwbGFjZSgpKSl9LHB1c2g6ZnVuY3Rpb24oYSxiLGUpe3ZhciBmPWEuZm9ybWF0KGJ8fHt9KTtudWxsIT09ZiYmYiYmYltcIiNcIl0mJihmKz1cIiNcIitiW1wiI1wiXSksZC51cmwoZikscD1lJiZlLiQkYXZvaWRSZXN5bmM/ZC51cmwoKTpjLGUmJmUucmVwbGFjZSYmZC5yZXBsYWNlKCl9LGhyZWY6ZnVuY3Rpb24oYyxlLGYpe2lmKCFjLnZhbGlkYXRlcyhlKSlyZXR1cm4gbnVsbDt2YXIgZz1hLmh0bWw1TW9kZSgpO2IuaXNPYmplY3QoZykmJihnPWcuZW5hYmxlZCksZz1nJiZoLmhpc3Rvcnk7dmFyIGk9Yy5mb3JtYXQoZSk7aWYoZj1mfHx7fSxnfHxudWxsPT09aXx8KGk9XCIjXCIrYS5oYXNoUHJlZml4KCkraSksbnVsbCE9PWkmJmUmJmVbXCIjXCJdJiYoaSs9XCIjXCIrZVtcIiNcIl0pLGk9bShpLGcsZi5hYnNvbHV0ZSksIWYuYWJzb2x1dGV8fCFpKXJldHVybiBpO3ZhciBqPSFnJiZpP1wiL1wiOlwiXCIsaz1kLnBvcnQoKTtyZXR1cm4gaz04MD09PWt8fDQ0Mz09PWs/XCJcIjpcIjpcIitrLFtkLnByb3RvY29sKCksXCI6Ly9cIixkLmhvc3QoKSxrLGosaV0uam9pbihcIlwiKX19fXZhciBpLGo9W10saz1udWxsLGw9ITE7dGhpcy5ydWxlPWZ1bmN0aW9uKGEpe2lmKCFNKGEpKXRocm93IG5ldyBFcnJvcihcIidydWxlJyBtdXN0IGJlIGEgZnVuY3Rpb25cIik7cmV0dXJuIGoucHVzaChhKSx0aGlzfSx0aGlzLm90aGVyd2lzZT1mdW5jdGlvbihhKXtpZihOKGEpKXt2YXIgYj1hO2E9ZnVuY3Rpb24oKXtyZXR1cm4gYn19ZWxzZSBpZighTShhKSl0aHJvdyBuZXcgRXJyb3IoXCIncnVsZScgbXVzdCBiZSBhIGZ1bmN0aW9uXCIpO3JldHVybiBrPWEsdGhpc30sdGhpcy53aGVuPWZ1bmN0aW9uKGEsYil7dmFyIGMsaD1OKGIpO2lmKE4oYSkmJihhPWQuY29tcGlsZShhKSksIWgmJiFNKGIpJiYhUChiKSl0aHJvdyBuZXcgRXJyb3IoXCJpbnZhbGlkICdoYW5kbGVyJyBpbiB3aGVuKClcIik7dmFyIGk9e21hdGNoZXI6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gaCYmKGM9ZC5jb21waWxlKGIpLGI9W1wiJG1hdGNoXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGMuZm9ybWF0KGEpfV0pLFIoZnVuY3Rpb24oYyxkKXtyZXR1cm4gZyhjLGIsYS5leGVjKGQucGF0aCgpLGQuc2VhcmNoKCkpKX0se3ByZWZpeDpOKGEucHJlZml4KT9hLnByZWZpeDpcIlwifSl9LHJlZ2V4OmZ1bmN0aW9uKGEsYil7aWYoYS5nbG9iYWx8fGEuc3RpY2t5KXRocm93IG5ldyBFcnJvcihcIndoZW4oKSBSZWdFeHAgbXVzdCBub3QgYmUgZ2xvYmFsIG9yIHN0aWNreVwiKTtyZXR1cm4gaCYmKGM9YixiPVtcIiRtYXRjaFwiLGZ1bmN0aW9uKGEpe3JldHVybiBmKGMsYSl9XSksUihmdW5jdGlvbihjLGQpe3JldHVybiBnKGMsYixhLmV4ZWMoZC5wYXRoKCkpKX0se3ByZWZpeDplKGEpfSl9fSxqPXttYXRjaGVyOmQuaXNNYXRjaGVyKGEpLHJlZ2V4OmEgaW5zdGFuY2VvZiBSZWdFeHB9O2Zvcih2YXIgayBpbiBqKWlmKGpba10pcmV0dXJuIHRoaXMucnVsZShpW2tdKGEsYikpO3Rocm93IG5ldyBFcnJvcihcImludmFsaWQgJ3doYXQnIGluIHdoZW4oKVwiKX0sdGhpcy5kZWZlckludGVyY2VwdD1mdW5jdGlvbihhKXthPT09YyYmKGE9ITApLGw9YX0sdGhpcy4kZ2V0PWgsaC4kaW5qZWN0PVtcIiRsb2NhdGlvblwiLFwiJHJvb3RTY29wZVwiLFwiJGluamVjdG9yXCIsXCIkYnJvd3NlclwiLFwiJHNuaWZmZXJcIl19ZnVuY3Rpb24gdihhLGUpe2Z1bmN0aW9uIGYoYSl7cmV0dXJuIDA9PT1hLmluZGV4T2YoXCIuXCIpfHwwPT09YS5pbmRleE9mKFwiXlwiKX1mdW5jdGlvbiBtKGEsYil7aWYoIWEpcmV0dXJuIGM7dmFyIGQ9TihhKSxlPWQ/YTphLm5hbWUsZz1mKGUpO2lmKGcpe2lmKCFiKXRocm93IG5ldyBFcnJvcihcIk5vIHJlZmVyZW5jZSBwb2ludCBnaXZlbiBmb3IgcGF0aCAnXCIrZStcIidcIik7Yj1tKGIpO2Zvcih2YXIgaD1lLnNwbGl0KFwiLlwiKSxpPTAsaj1oLmxlbmd0aCxrPWI7aj5pO2krKylpZihcIlwiIT09aFtpXXx8MCE9PWkpe2lmKFwiXlwiIT09aFtpXSlicmVhaztpZighay5wYXJlbnQpdGhyb3cgbmV3IEVycm9yKFwiUGF0aCAnXCIrZStcIicgbm90IHZhbGlkIGZvciBzdGF0ZSAnXCIrYi5uYW1lK1wiJ1wiKTtrPWsucGFyZW50fWVsc2Ugaz1iO2g9aC5zbGljZShpKS5qb2luKFwiLlwiKSxlPWsubmFtZSsoay5uYW1lJiZoP1wiLlwiOlwiXCIpK2h9dmFyIGw9eltlXTtyZXR1cm4hbHx8IWQmJihkfHxsIT09YSYmbC5zZWxmIT09YSk/YzpsfWZ1bmN0aW9uIG4oYSxiKXtBW2FdfHwoQVthXT1bXSksQVthXS5wdXNoKGIpfWZ1bmN0aW9uIHAoYSl7Zm9yKHZhciBiPUFbYV18fFtdO2IubGVuZ3RoOylxKGIuc2hpZnQoKSl9ZnVuY3Rpb24gcShiKXtiPWQoYix7c2VsZjpiLHJlc29sdmU6Yi5yZXNvbHZlfHx7fSx0b1N0cmluZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLm5hbWV9fSk7dmFyIGM9Yi5uYW1lO2lmKCFOKGMpfHxjLmluZGV4T2YoXCJAXCIpPj0wKXRocm93IG5ldyBFcnJvcihcIlN0YXRlIG11c3QgaGF2ZSBhIHZhbGlkIG5hbWVcIik7aWYoei5oYXNPd25Qcm9wZXJ0eShjKSl0aHJvdyBuZXcgRXJyb3IoXCJTdGF0ZSAnXCIrYytcIicgaXMgYWxyZWFkeSBkZWZpbmVkXCIpO3ZhciBlPS0xIT09Yy5pbmRleE9mKFwiLlwiKT9jLnN1YnN0cmluZygwLGMubGFzdEluZGV4T2YoXCIuXCIpKTpOKGIucGFyZW50KT9iLnBhcmVudDpPKGIucGFyZW50KSYmTihiLnBhcmVudC5uYW1lKT9iLnBhcmVudC5uYW1lOlwiXCI7aWYoZSYmIXpbZV0pcmV0dXJuIG4oZSxiLnNlbGYpO2Zvcih2YXIgZiBpbiBDKU0oQ1tmXSkmJihiW2ZdPUNbZl0oYixDLiRkZWxlZ2F0ZXNbZl0pKTtyZXR1cm4geltjXT1iLCFiW0JdJiZiLnVybCYmYS53aGVuKGIudXJsLFtcIiRtYXRjaFwiLFwiJHN0YXRlUGFyYW1zXCIsZnVuY3Rpb24oYSxjKXt5LiRjdXJyZW50Lm5hdmlnYWJsZT09YiYmaihhLGMpfHx5LnRyYW5zaXRpb25UbyhiLGEse2luaGVyaXQ6ITAsbG9jYXRpb246ITF9KX1dKSxwKGMpLGJ9ZnVuY3Rpb24gcihhKXtyZXR1cm4gYS5pbmRleE9mKFwiKlwiKT4tMX1mdW5jdGlvbiBzKGEpe2Zvcih2YXIgYj1hLnNwbGl0KFwiLlwiKSxjPXkuJGN1cnJlbnQubmFtZS5zcGxpdChcIi5cIiksZD0wLGU9Yi5sZW5ndGg7ZT5kO2QrKylcIipcIj09PWJbZF0mJihjW2RdPVwiKlwiKTtyZXR1cm5cIioqXCI9PT1iWzBdJiYoYz1jLnNsaWNlKGgoYyxiWzFdKSksYy51bnNoaWZ0KFwiKipcIikpLFwiKipcIj09PWJbYi5sZW5ndGgtMV0mJihjLnNwbGljZShoKGMsYltiLmxlbmd0aC0yXSkrMSxOdW1iZXIuTUFYX1ZBTFVFKSxjLnB1c2goXCIqKlwiKSksYi5sZW5ndGghPWMubGVuZ3RoPyExOmMuam9pbihcIlwiKT09PWIuam9pbihcIlwiKX1mdW5jdGlvbiB0KGEsYil7cmV0dXJuIE4oYSkmJiFMKGIpP0NbYV06TShiKSYmTihhKT8oQ1thXSYmIUMuJGRlbGVnYXRlc1thXSYmKEMuJGRlbGVnYXRlc1thXT1DW2FdKSxDW2FdPWIsdGhpcyk6dGhpc31mdW5jdGlvbiB1KGEsYil7cmV0dXJuIE8oYSk/Yj1hOmIubmFtZT1hLHEoYiksdGhpc31mdW5jdGlvbiB2KGEsZSxmLGgsbCxuLHAscSx0KXtmdW5jdGlvbiB1KGIsYyxkLGYpe3ZhciBnPWEuJGJyb2FkY2FzdChcIiRzdGF0ZU5vdEZvdW5kXCIsYixjLGQpO2lmKGcuZGVmYXVsdFByZXZlbnRlZClyZXR1cm4gcC51cGRhdGUoKSxEO2lmKCFnLnJldHJ5KXJldHVybiBudWxsO2lmKGYuJHJldHJ5KXJldHVybiBwLnVwZGF0ZSgpLEU7dmFyIGg9eS50cmFuc2l0aW9uPWUud2hlbihnLnJldHJ5KTtyZXR1cm4gaC50aGVuKGZ1bmN0aW9uKCl7cmV0dXJuIGghPT15LnRyYW5zaXRpb24/QTooYi5vcHRpb25zLiRyZXRyeT0hMCx5LnRyYW5zaXRpb25UbyhiLnRvLGIudG9QYXJhbXMsYi5vcHRpb25zKSl9LGZ1bmN0aW9uKCl7cmV0dXJuIER9KSxwLnVwZGF0ZSgpLGh9ZnVuY3Rpb24gdihhLGMsZCxnLGksail7ZnVuY3Rpb24gbSgpe3ZhciBjPVtdO3JldHVybiBRKGEudmlld3MsZnVuY3Rpb24oZCxlKXt2YXIgZz1kLnJlc29sdmUmJmQucmVzb2x2ZSE9PWEucmVzb2x2ZT9kLnJlc29sdmU6e307Zy4kdGVtcGxhdGU9W2Z1bmN0aW9uKCl7cmV0dXJuIGYubG9hZChlLHt2aWV3OmQsbG9jYWxzOmkuZ2xvYmFscyxwYXJhbXM6bixub3RpZnk6ai5ub3RpZnl9KXx8XCJcIn1dLGMucHVzaChsLnJlc29sdmUoZyxpLmdsb2JhbHMsaS5yZXNvbHZlLGEpLnRoZW4oZnVuY3Rpb24oYyl7aWYoTShkLmNvbnRyb2xsZXJQcm92aWRlcil8fFAoZC5jb250cm9sbGVyUHJvdmlkZXIpKXt2YXIgZj1iLmV4dGVuZCh7fSxnLGkuZ2xvYmFscyk7Yy4kJGNvbnRyb2xsZXI9aC5pbnZva2UoZC5jb250cm9sbGVyUHJvdmlkZXIsbnVsbCxmKX1lbHNlIGMuJCRjb250cm9sbGVyPWQuY29udHJvbGxlcjtjLiQkc3RhdGU9YSxjLiQkY29udHJvbGxlckFzPWQuY29udHJvbGxlckFzLGlbZV09Y30pKX0pLGUuYWxsKGMpLnRoZW4oZnVuY3Rpb24oKXtyZXR1cm4gaS5nbG9iYWxzfSl9dmFyIG49ZD9jOmsoYS5wYXJhbXMuJCRrZXlzKCksYyksbz17JHN0YXRlUGFyYW1zOm59O2kucmVzb2x2ZT1sLnJlc29sdmUoYS5yZXNvbHZlLG8saS5yZXNvbHZlLGEpO3ZhciBwPVtpLnJlc29sdmUudGhlbihmdW5jdGlvbihhKXtpLmdsb2JhbHM9YX0pXTtyZXR1cm4gZyYmcC5wdXNoKGcpLGUuYWxsKHApLnRoZW4obSkudGhlbihmdW5jdGlvbihhKXtyZXR1cm4gaX0pfXZhciBBPWUucmVqZWN0KG5ldyBFcnJvcihcInRyYW5zaXRpb24gc3VwZXJzZWRlZFwiKSksQz1lLnJlamVjdChuZXcgRXJyb3IoXCJ0cmFuc2l0aW9uIHByZXZlbnRlZFwiKSksRD1lLnJlamVjdChuZXcgRXJyb3IoXCJ0cmFuc2l0aW9uIGFib3J0ZWRcIikpLEU9ZS5yZWplY3QobmV3IEVycm9yKFwidHJhbnNpdGlvbiBmYWlsZWRcIikpO3JldHVybiB4LmxvY2Fscz17cmVzb2x2ZTpudWxsLGdsb2JhbHM6eyRzdGF0ZVBhcmFtczp7fX19LHk9e3BhcmFtczp7fSxjdXJyZW50Onguc2VsZiwkY3VycmVudDp4LHRyYW5zaXRpb246bnVsbH0seS5yZWxvYWQ9ZnVuY3Rpb24oYSl7cmV0dXJuIHkudHJhbnNpdGlvblRvKHkuY3VycmVudCxuLHtyZWxvYWQ6YXx8ITAsaW5oZXJpdDohMSxub3RpZnk6ITB9KX0seS5nbz1mdW5jdGlvbihhLGIsYyl7cmV0dXJuIHkudHJhbnNpdGlvblRvKGEsYixSKHtpbmhlcml0OiEwLHJlbGF0aXZlOnkuJGN1cnJlbnR9LGMpKX0seS50cmFuc2l0aW9uVG89ZnVuY3Rpb24oYixjLGYpe2M9Y3x8e30sZj1SKHtsb2NhdGlvbjohMCxpbmhlcml0OiExLHJlbGF0aXZlOm51bGwsbm90aWZ5OiEwLHJlbG9hZDohMSwkcmV0cnk6ITF9LGZ8fHt9KTt2YXIgZyxqPXkuJGN1cnJlbnQsbD15LnBhcmFtcyxvPWoucGF0aCxxPW0oYixmLnJlbGF0aXZlKSxyPWNbXCIjXCJdO2lmKCFMKHEpKXt2YXIgcz17dG86Yix0b1BhcmFtczpjLG9wdGlvbnM6Zn0sdD11KHMsai5zZWxmLGwsZik7aWYodClyZXR1cm4gdDtpZihiPXMudG8sYz1zLnRvUGFyYW1zLGY9cy5vcHRpb25zLHE9bShiLGYucmVsYXRpdmUpLCFMKHEpKXtpZighZi5yZWxhdGl2ZSl0aHJvdyBuZXcgRXJyb3IoXCJObyBzdWNoIHN0YXRlICdcIitiK1wiJ1wiKTt0aHJvdyBuZXcgRXJyb3IoXCJDb3VsZCBub3QgcmVzb2x2ZSAnXCIrYitcIicgZnJvbSBzdGF0ZSAnXCIrZi5yZWxhdGl2ZStcIidcIil9fWlmKHFbQl0pdGhyb3cgbmV3IEVycm9yKFwiQ2Fubm90IHRyYW5zaXRpb24gdG8gYWJzdHJhY3Qgc3RhdGUgJ1wiK2IrXCInXCIpO2lmKGYuaW5oZXJpdCYmKGM9aShuLGN8fHt9LHkuJGN1cnJlbnQscSkpLCFxLnBhcmFtcy4kJHZhbGlkYXRlcyhjKSlyZXR1cm4gRTtjPXEucGFyYW1zLiQkdmFsdWVzKGMpLGI9cTt2YXIgej1iLnBhdGgsRD0wLEY9eltEXSxHPXgubG9jYWxzLEg9W107aWYoZi5yZWxvYWQpe2lmKE4oZi5yZWxvYWQpfHxPKGYucmVsb2FkKSl7aWYoTyhmLnJlbG9hZCkmJiFmLnJlbG9hZC5uYW1lKXRocm93IG5ldyBFcnJvcihcIkludmFsaWQgcmVsb2FkIHN0YXRlIG9iamVjdFwiKTt2YXIgST1mLnJlbG9hZD09PSEwP29bMF06bShmLnJlbG9hZCk7aWYoZi5yZWxvYWQmJiFJKXRocm93IG5ldyBFcnJvcihcIk5vIHN1Y2ggcmVsb2FkIHN0YXRlICdcIisoTihmLnJlbG9hZCk/Zi5yZWxvYWQ6Zi5yZWxvYWQubmFtZSkrXCInXCIpO2Zvcig7RiYmRj09PW9bRF0mJkYhPT1JOylHPUhbRF09Ri5sb2NhbHMsRCsrLEY9eltEXX19ZWxzZSBmb3IoO0YmJkY9PT1vW0RdJiZGLm93blBhcmFtcy4kJGVxdWFscyhjLGwpOylHPUhbRF09Ri5sb2NhbHMsRCsrLEY9eltEXTtpZih3KGIsYyxqLGwsRyxmKSlyZXR1cm4gciYmKGNbXCIjXCJdPXIpLHkucGFyYW1zPWMsUyh5LnBhcmFtcyxuKSxTKGsoYi5wYXJhbXMuJCRrZXlzKCksbiksYi5sb2NhbHMuZ2xvYmFscy4kc3RhdGVQYXJhbXMpLGYubG9jYXRpb24mJmIubmF2aWdhYmxlJiZiLm5hdmlnYWJsZS51cmwmJihwLnB1c2goYi5uYXZpZ2FibGUudXJsLGMseyQkYXZvaWRSZXN5bmM6ITAscmVwbGFjZTpcInJlcGxhY2VcIj09PWYubG9jYXRpb259KSxwLnVwZGF0ZSghMCkpLHkudHJhbnNpdGlvbj1udWxsLGUud2hlbih5LmN1cnJlbnQpO2lmKGM9ayhiLnBhcmFtcy4kJGtleXMoKSxjfHx7fSksciYmKGNbXCIjXCJdPXIpLGYubm90aWZ5JiZhLiRicm9hZGNhc3QoXCIkc3RhdGVDaGFuZ2VTdGFydFwiLGIuc2VsZixjLGouc2VsZixsLGYpLmRlZmF1bHRQcmV2ZW50ZWQpcmV0dXJuIGEuJGJyb2FkY2FzdChcIiRzdGF0ZUNoYW5nZUNhbmNlbFwiLGIuc2VsZixjLGouc2VsZixsKSxudWxsPT15LnRyYW5zaXRpb24mJnAudXBkYXRlKCksQztmb3IodmFyIEo9ZS53aGVuKEcpLEs9RDtLPHoubGVuZ3RoO0srKyxGPXpbS10pRz1IW0tdPWQoRyksSj12KEYsYyxGPT09YixKLEcsZik7dmFyIE09eS50cmFuc2l0aW9uPUoudGhlbihmdW5jdGlvbigpe3ZhciBkLGUsZztpZih5LnRyYW5zaXRpb24hPT1NKXJldHVybiBBO2ZvcihkPW8ubGVuZ3RoLTE7ZD49RDtkLS0pZz1vW2RdLGcuc2VsZi5vbkV4aXQmJmguaW52b2tlKGcuc2VsZi5vbkV4aXQsZy5zZWxmLGcubG9jYWxzLmdsb2JhbHMpLGcubG9jYWxzPW51bGw7Zm9yKGQ9RDtkPHoubGVuZ3RoO2QrKyllPXpbZF0sZS5sb2NhbHM9SFtkXSxlLnNlbGYub25FbnRlciYmaC5pbnZva2UoZS5zZWxmLm9uRW50ZXIsZS5zZWxmLGUubG9jYWxzLmdsb2JhbHMpO3JldHVybiB5LnRyYW5zaXRpb24hPT1NP0E6KHkuJGN1cnJlbnQ9Yix5LmN1cnJlbnQ9Yi5zZWxmLHkucGFyYW1zPWMsUyh5LnBhcmFtcyxuKSx5LnRyYW5zaXRpb249bnVsbCxmLmxvY2F0aW9uJiZiLm5hdmlnYWJsZSYmcC5wdXNoKGIubmF2aWdhYmxlLnVybCxiLm5hdmlnYWJsZS5sb2NhbHMuZ2xvYmFscy4kc3RhdGVQYXJhbXMseyQkYXZvaWRSZXN5bmM6ITAscmVwbGFjZTpcInJlcGxhY2VcIj09PWYubG9jYXRpb259KSxmLm5vdGlmeSYmYS4kYnJvYWRjYXN0KFwiJHN0YXRlQ2hhbmdlU3VjY2Vzc1wiLGIuc2VsZixjLGouc2VsZixsKSxwLnVwZGF0ZSghMCkseS5jdXJyZW50KX0sZnVuY3Rpb24oZCl7cmV0dXJuIHkudHJhbnNpdGlvbiE9PU0/QTooeS50cmFuc2l0aW9uPW51bGwsZz1hLiRicm9hZGNhc3QoXCIkc3RhdGVDaGFuZ2VFcnJvclwiLGIuc2VsZixjLGouc2VsZixsLGQpLGcuZGVmYXVsdFByZXZlbnRlZHx8cC51cGRhdGUoKSxlLnJlamVjdChkKSl9KTtyZXR1cm4gTX0seS5pcz1mdW5jdGlvbihhLGIsZCl7ZD1SKHtyZWxhdGl2ZTp5LiRjdXJyZW50fSxkfHx7fSk7dmFyIGU9bShhLGQucmVsYXRpdmUpO3JldHVybiBMKGUpP3kuJGN1cnJlbnQhPT1lPyExOmI/aihlLnBhcmFtcy4kJHZhbHVlcyhiKSxuKTohMDpjfSx5LmluY2x1ZGVzPWZ1bmN0aW9uKGEsYixkKXtpZihkPVIoe3JlbGF0aXZlOnkuJGN1cnJlbnR9LGR8fHt9KSxOKGEpJiZyKGEpKXtpZighcyhhKSlyZXR1cm4hMTthPXkuJGN1cnJlbnQubmFtZX12YXIgZT1tKGEsZC5yZWxhdGl2ZSk7cmV0dXJuIEwoZSk/TCh5LiRjdXJyZW50LmluY2x1ZGVzW2UubmFtZV0pP2I/aihlLnBhcmFtcy4kJHZhbHVlcyhiKSxuLGcoYikpOiEwOiExOmN9LHkuaHJlZj1mdW5jdGlvbihhLGIsZCl7ZD1SKHtsb3NzeTohMCxpbmhlcml0OiEwLGFic29sdXRlOiExLHJlbGF0aXZlOnkuJGN1cnJlbnR9LGR8fHt9KTt2YXIgZT1tKGEsZC5yZWxhdGl2ZSk7aWYoIUwoZSkpcmV0dXJuIG51bGw7ZC5pbmhlcml0JiYoYj1pKG4sYnx8e30seS4kY3VycmVudCxlKSk7dmFyIGY9ZSYmZC5sb3NzeT9lLm5hdmlnYWJsZTplO3JldHVybiBmJiZmLnVybCE9PWMmJm51bGwhPT1mLnVybD9wLmhyZWYoZi51cmwsayhlLnBhcmFtcy4kJGtleXMoKS5jb25jYXQoXCIjXCIpLGJ8fHt9KSx7YWJzb2x1dGU6ZC5hYnNvbHV0ZX0pOm51bGx9LHkuZ2V0PWZ1bmN0aW9uKGEsYil7aWYoMD09PWFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuIG8oZyh6KSxmdW5jdGlvbihhKXtyZXR1cm4gelthXS5zZWxmfSk7dmFyIGM9bShhLGJ8fHkuJGN1cnJlbnQpO3JldHVybiBjJiZjLnNlbGY/Yy5zZWxmOm51bGx9LHl9ZnVuY3Rpb24gdyhhLGIsYyxkLGUsZil7ZnVuY3Rpb24gZyhhLGIsYyl7ZnVuY3Rpb24gZChiKXtyZXR1cm5cInNlYXJjaFwiIT1hLnBhcmFtc1tiXS5sb2NhdGlvbn12YXIgZT1hLnBhcmFtcy4kJGtleXMoKS5maWx0ZXIoZCksZj1sLmFwcGx5KHt9LFthLnBhcmFtc10uY29uY2F0KGUpKSxnPW5ldyBVLlBhcmFtU2V0KGYpO3JldHVybiBnLiQkZXF1YWxzKGIsYyl9cmV0dXJuIWYucmVsb2FkJiZhPT09YyYmKGU9PT1jLmxvY2Fsc3x8YS5zZWxmLnJlbG9hZE9uU2VhcmNoPT09ITEmJmcoYyxkLGIpKT8hMDp2b2lkIDB9dmFyIHgseSx6PXt9LEE9e30sQj1cImFic3RyYWN0XCIsQz17cGFyZW50OmZ1bmN0aW9uKGEpe2lmKEwoYS5wYXJlbnQpJiZhLnBhcmVudClyZXR1cm4gbShhLnBhcmVudCk7dmFyIGI9L14oLispXFwuW14uXSskLy5leGVjKGEubmFtZSk7cmV0dXJuIGI/bShiWzFdKTp4fSxkYXRhOmZ1bmN0aW9uKGEpe3JldHVybiBhLnBhcmVudCYmYS5wYXJlbnQuZGF0YSYmKGEuZGF0YT1hLnNlbGYuZGF0YT1kKGEucGFyZW50LmRhdGEsYS5kYXRhKSksYS5kYXRhfSx1cmw6ZnVuY3Rpb24oYSl7dmFyIGI9YS51cmwsYz17cGFyYW1zOmEucGFyYW1zfHx7fX07aWYoTihiKSlyZXR1cm5cIl5cIj09Yi5jaGFyQXQoMCk/ZS5jb21waWxlKGIuc3Vic3RyaW5nKDEpLGMpOihhLnBhcmVudC5uYXZpZ2FibGV8fHgpLnVybC5jb25jYXQoYixjKTtpZighYnx8ZS5pc01hdGNoZXIoYikpcmV0dXJuIGI7dGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCB1cmwgJ1wiK2IrXCInIGluIHN0YXRlICdcIithK1wiJ1wiKX0sbmF2aWdhYmxlOmZ1bmN0aW9uKGEpe3JldHVybiBhLnVybD9hOmEucGFyZW50P2EucGFyZW50Lm5hdmlnYWJsZTpudWxsfSxvd25QYXJhbXM6ZnVuY3Rpb24oYSl7dmFyIGI9YS51cmwmJmEudXJsLnBhcmFtc3x8bmV3IFUuUGFyYW1TZXQ7cmV0dXJuIFEoYS5wYXJhbXN8fHt9LGZ1bmN0aW9uKGEsYyl7YltjXXx8KGJbY109bmV3IFUuUGFyYW0oYyxudWxsLGEsXCJjb25maWdcIikpfSksYn0scGFyYW1zOmZ1bmN0aW9uKGEpe3ZhciBiPWwoYS5vd25QYXJhbXMsYS5vd25QYXJhbXMuJCRrZXlzKCkpO3JldHVybiBhLnBhcmVudCYmYS5wYXJlbnQucGFyYW1zP1IoYS5wYXJlbnQucGFyYW1zLiQkbmV3KCksYik6bmV3IFUuUGFyYW1TZXR9LHZpZXdzOmZ1bmN0aW9uKGEpe3ZhciBiPXt9O3JldHVybiBRKEwoYS52aWV3cyk/YS52aWV3czp7XCJcIjphfSxmdW5jdGlvbihjLGQpe2QuaW5kZXhPZihcIkBcIik8MCYmKGQrPVwiQFwiK2EucGFyZW50Lm5hbWUpLGJbZF09Y30pLGJ9LHBhdGg6ZnVuY3Rpb24oYSl7cmV0dXJuIGEucGFyZW50P2EucGFyZW50LnBhdGguY29uY2F0KGEpOltdfSxpbmNsdWRlczpmdW5jdGlvbihhKXt2YXIgYj1hLnBhcmVudD9SKHt9LGEucGFyZW50LmluY2x1ZGVzKTp7fTtyZXR1cm4gYlthLm5hbWVdPSEwLGJ9LCRkZWxlZ2F0ZXM6e319O3g9cSh7bmFtZTpcIlwiLHVybDpcIl5cIix2aWV3czpudWxsLFwiYWJzdHJhY3RcIjohMH0pLHgubmF2aWdhYmxlPW51bGwsdGhpcy5kZWNvcmF0b3I9dCx0aGlzLnN0YXRlPXUsdGhpcy4kZ2V0PXYsdi4kaW5qZWN0PVtcIiRyb290U2NvcGVcIixcIiRxXCIsXCIkdmlld1wiLFwiJGluamVjdG9yXCIsXCIkcmVzb2x2ZVwiLFwiJHN0YXRlUGFyYW1zXCIsXCIkdXJsUm91dGVyXCIsXCIkbG9jYXRpb25cIixcIiR1cmxNYXRjaGVyRmFjdG9yeVwiXX1mdW5jdGlvbiB3KCl7ZnVuY3Rpb24gYShhLGIpe3JldHVybntsb2FkOmZ1bmN0aW9uKGEsYyl7dmFyIGQsZT17dGVtcGxhdGU6bnVsbCxjb250cm9sbGVyOm51bGwsdmlldzpudWxsLGxvY2FsczpudWxsLG5vdGlmeTohMCxhc3luYzohMCxwYXJhbXM6e319O3JldHVybiBjPVIoZSxjKSxjLnZpZXcmJihkPWIuZnJvbUNvbmZpZyhjLnZpZXcsYy5wYXJhbXMsYy5sb2NhbHMpKSxkfX19dGhpcy4kZ2V0PWEsYS4kaW5qZWN0PVtcIiRyb290U2NvcGVcIixcIiR0ZW1wbGF0ZUZhY3RvcnlcIl19ZnVuY3Rpb24geCgpe3ZhciBhPSExO3RoaXMudXNlQW5jaG9yU2Nyb2xsPWZ1bmN0aW9uKCl7YT0hMH0sdGhpcy4kZ2V0PVtcIiRhbmNob3JTY3JvbGxcIixcIiR0aW1lb3V0XCIsZnVuY3Rpb24oYixjKXtyZXR1cm4gYT9iOmZ1bmN0aW9uKGEpe3JldHVybiBjKGZ1bmN0aW9uKCl7YVswXS5zY3JvbGxJbnRvVmlldygpfSwwLCExKX19XX1mdW5jdGlvbiB5KGEsYyxkLGUpe2Z1bmN0aW9uIGYoKXtyZXR1cm4gYy5oYXM/ZnVuY3Rpb24oYSl7cmV0dXJuIGMuaGFzKGEpP2MuZ2V0KGEpOm51bGx9OmZ1bmN0aW9uKGEpe3RyeXtyZXR1cm4gYy5nZXQoYSl9Y2F0Y2goYil7cmV0dXJuIG51bGx9fX1mdW5jdGlvbiBnKGEsYyl7ZnVuY3Rpb24gZChhKXtyZXR1cm4gMT09PVYmJlc+PTQ/ISFqLmVuYWJsZWQoYSk6MT09PVYmJlc+PTI/ISFqLmVuYWJsZWQoKTohIWl9dmFyIGU9e2VudGVyOmZ1bmN0aW9uKGEsYixjKXtiLmFmdGVyKGEpLGMoKX0sbGVhdmU6ZnVuY3Rpb24oYSxiKXthLnJlbW92ZSgpLGIoKX19O2lmKGEubm9hbmltYXRpb24pcmV0dXJuIGU7aWYoailyZXR1cm57ZW50ZXI6ZnVuY3Rpb24oYSxjLGYpe2QoYSk/Yi52ZXJzaW9uLm1pbm9yPjI/ai5lbnRlcihhLG51bGwsYykudGhlbihmKTpqLmVudGVyKGEsbnVsbCxjLGYpOmUuZW50ZXIoYSxjLGYpfSxsZWF2ZTpmdW5jdGlvbihhLGMpe2QoYSk/Yi52ZXJzaW9uLm1pbm9yPjI/ai5sZWF2ZShhKS50aGVuKGMpOmoubGVhdmUoYSxjKTplLmxlYXZlKGEsYyl9fTtpZihpKXt2YXIgZj1pJiZpKGMsYSk7cmV0dXJue2VudGVyOmZ1bmN0aW9uKGEsYixjKXtmLmVudGVyKGEsbnVsbCxiKSxjKCl9LGxlYXZlOmZ1bmN0aW9uKGEsYil7Zi5sZWF2ZShhKSxiKCl9fX1yZXR1cm4gZX12YXIgaD1mKCksaT1oKFwiJGFuaW1hdG9yXCIpLGo9aChcIiRhbmltYXRlXCIpLGs9e3Jlc3RyaWN0OlwiRUNBXCIsdGVybWluYWw6ITAscHJpb3JpdHk6NDAwLHRyYW5zY2x1ZGU6XCJlbGVtZW50XCIsY29tcGlsZTpmdW5jdGlvbihjLGYsaCl7cmV0dXJuIGZ1bmN0aW9uKGMsZixpKXtmdW5jdGlvbiBqKCl7ZnVuY3Rpb24gYSgpe2ImJmIucmVtb3ZlKCksYyYmYy4kZGVzdHJveSgpfXZhciBiPWwsYz1uO2MmJihjLl93aWxsQmVEZXN0cm95ZWQ9ITApLG0/KHIubGVhdmUobSxmdW5jdGlvbigpe2EoKSxsPW51bGx9KSxsPW0pOihhKCksbD1udWxsKSxtPW51bGwsbj1udWxsfWZ1bmN0aW9uIGsoZyl7dmFyIGssbD1BKGMsaSxmLGUpLHM9bCYmYS4kY3VycmVudCYmYS4kY3VycmVudC5sb2NhbHNbbF07aWYoKGd8fHMhPT1vKSYmIWMuX3dpbGxCZURlc3Ryb3llZCl7az1jLiRuZXcoKSxvPWEuJGN1cnJlbnQubG9jYWxzW2xdLGsuJGVtaXQoXCIkdmlld0NvbnRlbnRMb2FkaW5nXCIsbCk7dmFyIHQ9aChrLGZ1bmN0aW9uKGEpe3IuZW50ZXIoYSxmLGZ1bmN0aW9uKCl7biYmbi4kZW1pdChcIiR2aWV3Q29udGVudEFuaW1hdGlvbkVuZGVkXCIpLChiLmlzRGVmaW5lZChxKSYmIXF8fGMuJGV2YWwocSkpJiZkKGEpfSksaigpfSk7bT10LG49ayxuLiRlbWl0KFwiJHZpZXdDb250ZW50TG9hZGVkXCIsbCksbi4kZXZhbChwKX19dmFyIGwsbSxuLG8scD1pLm9ubG9hZHx8XCJcIixxPWkuYXV0b3Njcm9sbCxyPWcoaSxjKTtjLiRvbihcIiRzdGF0ZUNoYW5nZVN1Y2Nlc3NcIixmdW5jdGlvbigpe2soITEpfSksayghMCl9fX07cmV0dXJuIGt9ZnVuY3Rpb24geihhLGIsYyxkKXtyZXR1cm57cmVzdHJpY3Q6XCJFQ0FcIixwcmlvcml0eTotNDAwLGNvbXBpbGU6ZnVuY3Rpb24oZSl7dmFyIGY9ZS5odG1sKCk7cmV0dXJuIGZ1bmN0aW9uKGUsZyxoKXt2YXIgaT1jLiRjdXJyZW50LGo9QShlLGgsZyxkKSxrPWkmJmkubG9jYWxzW2pdO2lmKGspe2cuZGF0YShcIiR1aVZpZXdcIix7bmFtZTpqLHN0YXRlOmsuJCRzdGF0ZX0pLGcuaHRtbChrLiR0ZW1wbGF0ZT9rLiR0ZW1wbGF0ZTpmKTt2YXIgbD1hKGcuY29udGVudHMoKSk7aWYoay4kJGNvbnRyb2xsZXIpe2suJHNjb3BlPWUsay4kZWxlbWVudD1nO3ZhciBtPWIoay4kJGNvbnRyb2xsZXIsayk7ay4kJGNvbnRyb2xsZXJBcyYmKGVbay4kJGNvbnRyb2xsZXJBc109bSksZy5kYXRhKFwiJG5nQ29udHJvbGxlckNvbnRyb2xsZXJcIixtKSxnLmNoaWxkcmVuKCkuZGF0YShcIiRuZ0NvbnRyb2xsZXJDb250cm9sbGVyXCIsbSl9bChlKX19fX19ZnVuY3Rpb24gQShhLGIsYyxkKXt2YXIgZT1kKGIudWlWaWV3fHxiLm5hbWV8fFwiXCIpKGEpLGY9Yy5pbmhlcml0ZWREYXRhKFwiJHVpVmlld1wiKTtyZXR1cm4gZS5pbmRleE9mKFwiQFwiKT49MD9lOmUrXCJAXCIrKGY/Zi5zdGF0ZS5uYW1lOlwiXCIpfWZ1bmN0aW9uIEIoYSxiKXt2YXIgYyxkPWEubWF0Y2goL15cXHMqKHtbXn1dKn0pXFxzKiQvKTtpZihkJiYoYT1iK1wiKFwiK2RbMV0rXCIpXCIpLGM9YS5yZXBsYWNlKC9cXG4vZyxcIiBcIikubWF0Y2goL14oW14oXSs/KVxccyooXFwoKC4qKVxcKSk/JC8pLCFjfHw0IT09Yy5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBzdGF0ZSByZWYgJ1wiK2ErXCInXCIpO3JldHVybntzdGF0ZTpjWzFdLHBhcmFtRXhwcjpjWzNdfHxudWxsfX1mdW5jdGlvbiBDKGEpe3ZhciBiPWEucGFyZW50KCkuaW5oZXJpdGVkRGF0YShcIiR1aVZpZXdcIik7cmV0dXJuIGImJmIuc3RhdGUmJmIuc3RhdGUubmFtZT9iLnN0YXRlOnZvaWQgMH1mdW5jdGlvbiBEKGEpe3ZhciBiPVwiW29iamVjdCBTVkdBbmltYXRlZFN0cmluZ11cIj09PU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChhLnByb3AoXCJocmVmXCIpKSxjPVwiRk9STVwiPT09YVswXS5ub2RlTmFtZTtyZXR1cm57YXR0cjpjP1wiYWN0aW9uXCI6Yj9cInhsaW5rOmhyZWZcIjpcImhyZWZcIixpc0FuY2hvcjpcIkFcIj09PWEucHJvcChcInRhZ05hbWVcIikudG9VcHBlckNhc2UoKSxjbGlja2FibGU6IWN9fWZ1bmN0aW9uIEUoYSxiLGMsZCxlKXtyZXR1cm4gZnVuY3Rpb24oZil7dmFyIGc9Zi53aGljaHx8Zi5idXR0b24saD1lKCk7aWYoIShnPjF8fGYuY3RybEtleXx8Zi5tZXRhS2V5fHxmLnNoaWZ0S2V5fHxhLmF0dHIoXCJ0YXJnZXRcIikpKXt2YXIgaT1jKGZ1bmN0aW9uKCl7Yi5nbyhoLnN0YXRlLGgucGFyYW1zLGgub3B0aW9ucyl9KTtmLnByZXZlbnREZWZhdWx0KCk7dmFyIGo9ZC5pc0FuY2hvciYmIWguaHJlZj8xOjA7Zi5wcmV2ZW50RGVmYXVsdD1mdW5jdGlvbigpe2otLTw9MCYmYy5jYW5jZWwoaSl9fX19ZnVuY3Rpb24gRihhLGIpe3JldHVybntyZWxhdGl2ZTpDKGEpfHxiLiRjdXJyZW50LGluaGVyaXQ6ITB9fWZ1bmN0aW9uIEcoYSxjKXtyZXR1cm57cmVzdHJpY3Q6XCJBXCIscmVxdWlyZTpbXCI/XnVpU3JlZkFjdGl2ZVwiLFwiP151aVNyZWZBY3RpdmVFcVwiXSxsaW5rOmZ1bmN0aW9uKGQsZSxmLGcpe3ZhciBoPUIoZi51aVNyZWYsYS5jdXJyZW50Lm5hbWUpLGk9e3N0YXRlOmguc3RhdGUsaHJlZjpudWxsLHBhcmFtczpudWxsfSxqPUQoZSksaz1nWzFdfHxnWzBdO2kub3B0aW9ucz1SKEYoZSxhKSxmLnVpU3JlZk9wdHM/ZC4kZXZhbChmLnVpU3JlZk9wdHMpOnt9KTt2YXIgbD1mdW5jdGlvbihjKXtjJiYoaS5wYXJhbXM9Yi5jb3B5KGMpKSxpLmhyZWY9YS5ocmVmKGguc3RhdGUsaS5wYXJhbXMsaS5vcHRpb25zKSxrJiZrLiQkYWRkU3RhdGVJbmZvKGguc3RhdGUsaS5wYXJhbXMpLG51bGwhPT1pLmhyZWYmJmYuJHNldChqLmF0dHIsaS5ocmVmKX07aC5wYXJhbUV4cHImJihkLiR3YXRjaChoLnBhcmFtRXhwcixmdW5jdGlvbihhKXthIT09aS5wYXJhbXMmJmwoYSl9LCEwKSxpLnBhcmFtcz1iLmNvcHkoZC4kZXZhbChoLnBhcmFtRXhwcikpKSxsKCksai5jbGlja2FibGUmJmUuYmluZChcImNsaWNrXCIsRShlLGEsYyxqLGZ1bmN0aW9uKCl7cmV0dXJuIGl9KSl9fX1mdW5jdGlvbiBIKGEsYil7cmV0dXJue3Jlc3RyaWN0OlwiQVwiLHJlcXVpcmU6W1wiP151aVNyZWZBY3RpdmVcIixcIj9edWlTcmVmQWN0aXZlRXFcIl0sbGluazpmdW5jdGlvbihjLGQsZSxmKXtmdW5jdGlvbiBnKGIpe2wuc3RhdGU9YlswXSxsLnBhcmFtcz1iWzFdLGwub3B0aW9ucz1iWzJdLGwuaHJlZj1hLmhyZWYobC5zdGF0ZSxsLnBhcmFtcyxsLm9wdGlvbnMpLGkmJmkuJCRhZGRTdGF0ZUluZm8obC5zdGF0ZSxsLnBhcmFtcyksbC5ocmVmJiZlLiRzZXQoaC5hdHRyLGwuaHJlZil9dmFyIGg9RChkKSxpPWZbMV18fGZbMF0saj1bZS51aVN0YXRlLGUudWlTdGF0ZVBhcmFtc3x8bnVsbCxlLnVpU3RhdGVPcHRzfHxudWxsXSxrPVwiW1wiK2oubWFwKGZ1bmN0aW9uKGEpe3JldHVybiBhfHxcIm51bGxcIn0pLmpvaW4oXCIsIFwiKStcIl1cIixsPXtzdGF0ZTpudWxsLHBhcmFtczpudWxsLG9wdGlvbnM6bnVsbCxocmVmOm51bGx9O2MuJHdhdGNoKGssZywhMCksZyhjLiRldmFsKGspKSxoLmNsaWNrYWJsZSYmZC5iaW5kKFwiY2xpY2tcIixFKGQsYSxiLGgsZnVuY3Rpb24oKXtyZXR1cm4gbH0pKX19fWZ1bmN0aW9uIEkoYSxiLGMpe3JldHVybntyZXN0cmljdDpcIkFcIixjb250cm9sbGVyOltcIiRzY29wZVwiLFwiJGVsZW1lbnRcIixcIiRhdHRyc1wiLFwiJHRpbWVvdXRcIixmdW5jdGlvbihiLGQsZSxmKXtmdW5jdGlvbiBnKGIsYyxlKXt2YXIgZj1hLmdldChiLEMoZCkpLGc9aChiLGMpO3AucHVzaCh7c3RhdGU6Znx8e25hbWU6Yn0scGFyYW1zOmMsaGFzaDpnfSkscVtnXT1lfWZ1bmN0aW9uIGgoYSxjKXtpZighTihhKSl0aHJvdyBuZXcgRXJyb3IoXCJzdGF0ZSBzaG91bGQgYmUgYSBzdHJpbmdcIik7cmV0dXJuIE8oYyk/YStUKGMpOihjPWIuJGV2YWwoYyksTyhjKT9hK1QoYyk6YSl9ZnVuY3Rpb24gaSgpe2Zvcih2YXIgYT0wO2E8cC5sZW5ndGg7YSsrKWwocFthXS5zdGF0ZSxwW2FdLnBhcmFtcyk/aihkLHFbcFthXS5oYXNoXSk6ayhkLHFbcFthXS5oYXNoXSksbShwW2FdLnN0YXRlLHBbYV0ucGFyYW1zKT9qKGQsbik6ayhkLG4pfWZ1bmN0aW9uIGooYSxiKXtmKGZ1bmN0aW9uKCl7YS5hZGRDbGFzcyhiKX0pfWZ1bmN0aW9uIGsoYSxiKXthLnJlbW92ZUNsYXNzKGIpfWZ1bmN0aW9uIGwoYixjKXtyZXR1cm4gYS5pbmNsdWRlcyhiLm5hbWUsYyl9ZnVuY3Rpb24gbShiLGMpe3JldHVybiBhLmlzKGIubmFtZSxjKX12YXIgbixvLHA9W10scT17fTtuPWMoZS51aVNyZWZBY3RpdmVFcXx8XCJcIiwhMSkoYik7dHJ5e289Yi4kZXZhbChlLnVpU3JlZkFjdGl2ZSl9Y2F0Y2gocil7fW89b3x8YyhlLnVpU3JlZkFjdGl2ZXx8XCJcIiwhMSkoYiksTyhvKSYmUShvLGZ1bmN0aW9uKGMsZCl7aWYoTihjKSl7dmFyIGU9QihjLGEuY3VycmVudC5uYW1lKTtnKGUuc3RhdGUsYi4kZXZhbChlLnBhcmFtRXhwciksZCl9fSksdGhpcy4kJGFkZFN0YXRlSW5mbz1mdW5jdGlvbihhLGIpe08obykmJnAubGVuZ3RoPjB8fChnKGEsYixvKSxpKCkpfSxiLiRvbihcIiRzdGF0ZUNoYW5nZVN1Y2Nlc3NcIixpKSxpKCl9XX19ZnVuY3Rpb24gSihhKXt2YXIgYj1mdW5jdGlvbihiLGMpe3JldHVybiBhLmlzKGIsYyl9O3JldHVybiBiLiRzdGF0ZWZ1bD0hMCxifWZ1bmN0aW9uIEsoYSl7dmFyIGI9ZnVuY3Rpb24oYixjLGQpe3JldHVybiBhLmluY2x1ZGVzKGIsYyxkKX07cmV0dXJuIGIuJHN0YXRlZnVsPSEwLGJ9dmFyIEw9Yi5pc0RlZmluZWQsTT1iLmlzRnVuY3Rpb24sTj1iLmlzU3RyaW5nLE89Yi5pc09iamVjdCxQPWIuaXNBcnJheSxRPWIuZm9yRWFjaCxSPWIuZXh0ZW5kLFM9Yi5jb3B5LFQ9Yi50b0pzb247Yi5tb2R1bGUoXCJ1aS5yb3V0ZXIudXRpbFwiLFtcIm5nXCJdKSxiLm1vZHVsZShcInVpLnJvdXRlci5yb3V0ZXJcIixbXCJ1aS5yb3V0ZXIudXRpbFwiXSksYi5tb2R1bGUoXCJ1aS5yb3V0ZXIuc3RhdGVcIixbXCJ1aS5yb3V0ZXIucm91dGVyXCIsXCJ1aS5yb3V0ZXIudXRpbFwiXSksYi5tb2R1bGUoXCJ1aS5yb3V0ZXJcIixbXCJ1aS5yb3V0ZXIuc3RhdGVcIl0pLGIubW9kdWxlKFwidWkucm91dGVyLmNvbXBhdFwiLFtcInVpLnJvdXRlclwiXSkscC4kaW5qZWN0PVtcIiRxXCIsXCIkaW5qZWN0b3JcIl0sYi5tb2R1bGUoXCJ1aS5yb3V0ZXIudXRpbFwiKS5zZXJ2aWNlKFwiJHJlc29sdmVcIixwKSxxLiRpbmplY3Q9W1wiJGh0dHBcIixcIiR0ZW1wbGF0ZUNhY2hlXCIsXCIkaW5qZWN0b3JcIl0sYi5tb2R1bGUoXCJ1aS5yb3V0ZXIudXRpbFwiKS5zZXJ2aWNlKFwiJHRlbXBsYXRlRmFjdG9yeVwiLHEpO3ZhciBVO3IucHJvdG90eXBlLmNvbmNhdD1mdW5jdGlvbihhLGIpe3ZhciBjPXtjYXNlSW5zZW5zaXRpdmU6VS5jYXNlSW5zZW5zaXRpdmUoKSxzdHJpY3Q6VS5zdHJpY3RNb2RlKCksc3F1YXNoOlUuZGVmYXVsdFNxdWFzaFBvbGljeSgpfTtyZXR1cm4gbmV3IHIodGhpcy5zb3VyY2VQYXRoK2ErdGhpcy5zb3VyY2VTZWFyY2gsUihjLGIpLHRoaXMpfSxyLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiB0aGlzLnNvdXJjZX0sci5wcm90b3R5cGUuZXhlYz1mdW5jdGlvbihhLGIpe2Z1bmN0aW9uIGMoYSl7ZnVuY3Rpb24gYihhKXtyZXR1cm4gYS5zcGxpdChcIlwiKS5yZXZlcnNlKCkuam9pbihcIlwiKX1mdW5jdGlvbiBjKGEpe3JldHVybiBhLnJlcGxhY2UoL1xcXFwtL2csXCItXCIpfXZhciBkPWIoYSkuc3BsaXQoLy0oPyFcXFxcKS8pLGU9byhkLGIpO3JldHVybiBvKGUsYykucmV2ZXJzZSgpfXZhciBkPXRoaXMucmVnZXhwLmV4ZWMoYSk7aWYoIWQpcmV0dXJuIG51bGw7Yj1ifHx7fTt2YXIgZSxmLGcsaD10aGlzLnBhcmFtZXRlcnMoKSxpPWgubGVuZ3RoLGo9dGhpcy5zZWdtZW50cy5sZW5ndGgtMSxrPXt9O2lmKGohPT1kLmxlbmd0aC0xKXRocm93IG5ldyBFcnJvcihcIlVuYmFsYW5jZWQgY2FwdHVyZSBncm91cCBpbiByb3V0ZSAnXCIrdGhpcy5zb3VyY2UrXCInXCIpO3ZhciBsLG07Zm9yKGU9MDtqPmU7ZSsrKXtmb3IoZz1oW2VdLGw9dGhpcy5wYXJhbXNbZ10sbT1kW2UrMV0sZj0wO2Y8bC5yZXBsYWNlLmxlbmd0aDtmKyspbC5yZXBsYWNlW2ZdLmZyb209PT1tJiYobT1sLnJlcGxhY2VbZl0udG8pO20mJmwuYXJyYXk9PT0hMCYmKG09YyhtKSksTChtKSYmKG09bC50eXBlLmRlY29kZShtKSksa1tnXT1sLnZhbHVlKG0pfWZvcig7aT5lO2UrKyl7Zm9yKGc9aFtlXSxrW2ddPXRoaXMucGFyYW1zW2ddLnZhbHVlKGJbZ10pLGw9dGhpcy5wYXJhbXNbZ10sbT1iW2ddLGY9MDtmPGwucmVwbGFjZS5sZW5ndGg7ZisrKWwucmVwbGFjZVtmXS5mcm9tPT09bSYmKG09bC5yZXBsYWNlW2ZdLnRvKTtMKG0pJiYobT1sLnR5cGUuZGVjb2RlKG0pKSxrW2ddPWwudmFsdWUobSl9cmV0dXJuIGt9LHIucHJvdG90eXBlLnBhcmFtZXRlcnM9ZnVuY3Rpb24oYSl7cmV0dXJuIEwoYSk/dGhpcy5wYXJhbXNbYV18fG51bGw6dGhpcy4kJHBhcmFtTmFtZXN9LHIucHJvdG90eXBlLnZhbGlkYXRlcz1mdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5wYXJhbXMuJCR2YWxpZGF0ZXMoYSl9LHIucHJvdG90eXBlLmZvcm1hdD1mdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEpe3JldHVybiBlbmNvZGVVUklDb21wb25lbnQoYSkucmVwbGFjZSgvLS9nLGZ1bmN0aW9uKGEpe3JldHVyblwiJTVDJVwiK2EuY2hhckNvZGVBdCgwKS50b1N0cmluZygxNikudG9VcHBlckNhc2UoKX0pfWE9YXx8e307dmFyIGM9dGhpcy5zZWdtZW50cyxkPXRoaXMucGFyYW1ldGVycygpLGU9dGhpcy5wYXJhbXM7aWYoIXRoaXMudmFsaWRhdGVzKGEpKXJldHVybiBudWxsO3ZhciBmLGc9ITEsaD1jLmxlbmd0aC0xLGk9ZC5sZW5ndGgsaj1jWzBdO2ZvcihmPTA7aT5mO2YrKyl7dmFyIGs9aD5mLGw9ZFtmXSxtPWVbbF0sbj1tLnZhbHVlKGFbbF0pLHA9bS5pc09wdGlvbmFsJiZtLnR5cGUuZXF1YWxzKG0udmFsdWUoKSxuKSxxPXA/bS5zcXVhc2g6ITEscj1tLnR5cGUuZW5jb2RlKG4pO2lmKGspe3ZhciBzPWNbZisxXSx0PWYrMT09PWg7aWYocT09PSExKW51bGwhPXImJihqKz1QKHIpP28ocixiKS5qb2luKFwiLVwiKTplbmNvZGVVUklDb21wb25lbnQocikpLGorPXM7ZWxzZSBpZihxPT09ITApe3ZhciB1PWoubWF0Y2goL1xcLyQvKT8vXFwvPyguKikvOi8oLiopLztqKz1zLm1hdGNoKHUpWzFdfWVsc2UgTihxKSYmKGorPXErcyk7dCYmbS5zcXVhc2g9PT0hMCYmXCIvXCI9PT1qLnNsaWNlKC0xKSYmKGo9ai5zbGljZSgwLC0xKSl9ZWxzZXtpZihudWxsPT1yfHxwJiZxIT09ITEpY29udGludWU7aWYoUChyKXx8KHI9W3JdKSwwPT09ci5sZW5ndGgpY29udGludWU7cj1vKHIsZW5jb2RlVVJJQ29tcG9uZW50KS5qb2luKFwiJlwiK2wrXCI9XCIpLGorPShnP1wiJlwiOlwiP1wiKSsobCtcIj1cIityKSxnPSEwfX1yZXR1cm4gan0scy5wcm90b3R5cGUuaXM9ZnVuY3Rpb24oYSxiKXtyZXR1cm4hMH0scy5wcm90b3R5cGUuZW5jb2RlPWZ1bmN0aW9uKGEsYil7cmV0dXJuIGF9LHMucHJvdG90eXBlLmRlY29kZT1mdW5jdGlvbihhLGIpe3JldHVybiBhfSxzLnByb3RvdHlwZS5lcXVhbHM9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYT09Yn0scy5wcm90b3R5cGUuJHN1YlBhdHRlcm49ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBhdHRlcm4udG9TdHJpbmcoKTtyZXR1cm4gYS5zdWJzdHIoMSxhLmxlbmd0aC0yKX0scy5wcm90b3R5cGUucGF0dGVybj0vLiovLHMucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuXCJ7VHlwZTpcIit0aGlzLm5hbWUrXCJ9XCJ9LHMucHJvdG90eXBlLiRub3JtYWxpemU9ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuaXMoYSk/YTp0aGlzLmRlY29kZShhKX0scy5wcm90b3R5cGUuJGFzQXJyYXk9ZnVuY3Rpb24oYSxiKXtmdW5jdGlvbiBkKGEsYil7ZnVuY3Rpb24gZChhLGIpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiBhW2JdLmFwcGx5KGEsYXJndW1lbnRzKX19ZnVuY3Rpb24gZShhKXtyZXR1cm4gUChhKT9hOkwoYSk/W2FdOltdfWZ1bmN0aW9uIGYoYSl7c3dpdGNoKGEubGVuZ3RoKXtjYXNlIDA6cmV0dXJuIGM7Y2FzZSAxOnJldHVyblwiYXV0b1wiPT09Yj9hWzBdOmE7ZGVmYXVsdDpyZXR1cm4gYX19ZnVuY3Rpb24gZyhhKXtyZXR1cm4hYX1mdW5jdGlvbiBoKGEsYil7cmV0dXJuIGZ1bmN0aW9uKGMpe2lmKFAoYykmJjA9PT1jLmxlbmd0aClyZXR1cm4gYztjPWUoYyk7dmFyIGQ9byhjLGEpO3JldHVybiBiPT09ITA/MD09PW4oZCxnKS5sZW5ndGg6ZihkKX19ZnVuY3Rpb24gaShhKXtyZXR1cm4gZnVuY3Rpb24oYixjKXt2YXIgZD1lKGIpLGY9ZShjKTtpZihkLmxlbmd0aCE9PWYubGVuZ3RoKXJldHVybiExO2Zvcih2YXIgZz0wO2c8ZC5sZW5ndGg7ZysrKWlmKCFhKGRbZ10sZltnXSkpcmV0dXJuITE7cmV0dXJuITB9fXRoaXMuZW5jb2RlPWgoZChhLFwiZW5jb2RlXCIpKSx0aGlzLmRlY29kZT1oKGQoYSxcImRlY29kZVwiKSksdGhpcy5pcz1oKGQoYSxcImlzXCIpLCEwKSx0aGlzLmVxdWFscz1pKGQoYSxcImVxdWFsc1wiKSksdGhpcy5wYXR0ZXJuPWEucGF0dGVybix0aGlzLiRub3JtYWxpemU9aChkKGEsXCIkbm9ybWFsaXplXCIpKSx0aGlzLm5hbWU9YS5uYW1lLHRoaXMuJGFycmF5TW9kZT1ifWlmKCFhKXJldHVybiB0aGlzO2lmKFwiYXV0b1wiPT09YSYmIWIpdGhyb3cgbmV3IEVycm9yKFwiJ2F1dG8nIGFycmF5IG1vZGUgaXMgZm9yIHF1ZXJ5IHBhcmFtZXRlcnMgb25seVwiKTtyZXR1cm4gbmV3IGQodGhpcyxhKX0sYi5tb2R1bGUoXCJ1aS5yb3V0ZXIudXRpbFwiKS5wcm92aWRlcihcIiR1cmxNYXRjaGVyRmFjdG9yeVwiLHQpLGIubW9kdWxlKFwidWkucm91dGVyLnV0aWxcIikucnVuKFtcIiR1cmxNYXRjaGVyRmFjdG9yeVwiLGZ1bmN0aW9uKGEpe31dKSx1LiRpbmplY3Q9W1wiJGxvY2F0aW9uUHJvdmlkZXJcIixcIiR1cmxNYXRjaGVyRmFjdG9yeVByb3ZpZGVyXCJdLGIubW9kdWxlKFwidWkucm91dGVyLnJvdXRlclwiKS5wcm92aWRlcihcIiR1cmxSb3V0ZXJcIix1KSx2LiRpbmplY3Q9W1wiJHVybFJvdXRlclByb3ZpZGVyXCIsXCIkdXJsTWF0Y2hlckZhY3RvcnlQcm92aWRlclwiXSxiLm1vZHVsZShcInVpLnJvdXRlci5zdGF0ZVwiKS5mYWN0b3J5KFwiJHN0YXRlUGFyYW1zXCIsZnVuY3Rpb24oKXtyZXR1cm57fX0pLnByb3ZpZGVyKFwiJHN0YXRlXCIsdiksdy4kaW5qZWN0PVtdLGIubW9kdWxlKFwidWkucm91dGVyLnN0YXRlXCIpLnByb3ZpZGVyKFwiJHZpZXdcIix3KSxiLm1vZHVsZShcInVpLnJvdXRlci5zdGF0ZVwiKS5wcm92aWRlcihcIiR1aVZpZXdTY3JvbGxcIix4KTt2YXIgVj1iLnZlcnNpb24ubWFqb3IsVz1iLnZlcnNpb24ubWlub3I7eS4kaW5qZWN0PVtcIiRzdGF0ZVwiLFwiJGluamVjdG9yXCIsXCIkdWlWaWV3U2Nyb2xsXCIsXCIkaW50ZXJwb2xhdGVcIl0sei4kaW5qZWN0PVtcIiRjb21waWxlXCIsXCIkY29udHJvbGxlclwiLFwiJHN0YXRlXCIsXCIkaW50ZXJwb2xhdGVcIl0sYi5tb2R1bGUoXCJ1aS5yb3V0ZXIuc3RhdGVcIikuZGlyZWN0aXZlKFwidWlWaWV3XCIseSksYi5tb2R1bGUoXCJ1aS5yb3V0ZXIuc3RhdGVcIikuZGlyZWN0aXZlKFwidWlWaWV3XCIseiksRy4kaW5qZWN0PVtcIiRzdGF0ZVwiLFwiJHRpbWVvdXRcIl0sSC4kaW5qZWN0PVtcIiRzdGF0ZVwiLFwiJHRpbWVvdXRcIl0sSS4kaW5qZWN0PVtcIiRzdGF0ZVwiLFwiJHN0YXRlUGFyYW1zXCIsXCIkaW50ZXJwb2xhdGVcIl0sYi5tb2R1bGUoXCJ1aS5yb3V0ZXIuc3RhdGVcIikuZGlyZWN0aXZlKFwidWlTcmVmXCIsRykuZGlyZWN0aXZlKFwidWlTcmVmQWN0aXZlXCIsSSkuZGlyZWN0aXZlKFwidWlTcmVmQWN0aXZlRXFcIixJKS5kaXJlY3RpdmUoXCJ1aVN0YXRlXCIsSCksXG5KLiRpbmplY3Q9W1wiJHN0YXRlXCJdLEsuJGluamVjdD1bXCIkc3RhdGVcIl0sYi5tb2R1bGUoXCJ1aS5yb3V0ZXIuc3RhdGVcIikuZmlsdGVyKFwiaXNTdGF0ZVwiLEopLmZpbHRlcihcImluY2x1ZGVkQnlTdGF0ZVwiLEspfSh3aW5kb3csd2luZG93LmFuZ3VsYXIpO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2FuZ3VsYXItdWktcm91dGVyL3JlbGVhc2UvYW5ndWxhci11aS1yb3V0ZXIubWluLmpzXG4gKiogbW9kdWxlIGlkID0gNDVcbiAqKiBtb2R1bGUgY2h1bmtzID0gMjRcbiAqKi8iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=");

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

	eval("/*!\n * ui-select\n * http://github.com/angular-ui/ui-select\n * Version: 0.14.1 - 2016-01-27T22:27:00.452Z\n * License: MIT\n */\n!function(){\"use strict\";var e={TAB:9,ENTER:13,ESC:27,SPACE:32,LEFT:37,UP:38,RIGHT:39,DOWN:40,SHIFT:16,CTRL:17,ALT:18,PAGE_UP:33,PAGE_DOWN:34,HOME:36,END:35,BACKSPACE:8,DELETE:46,COMMAND:91,MAP:{91:\"COMMAND\",8:\"BACKSPACE\",9:\"TAB\",13:\"ENTER\",16:\"SHIFT\",17:\"CTRL\",18:\"ALT\",19:\"PAUSEBREAK\",20:\"CAPSLOCK\",27:\"ESC\",32:\"SPACE\",33:\"PAGE_UP\",34:\"PAGE_DOWN\",35:\"END\",36:\"HOME\",37:\"LEFT\",38:\"UP\",39:\"RIGHT\",40:\"DOWN\",43:\"+\",44:\"PRINTSCREEN\",45:\"INSERT\",46:\"DELETE\",48:\"0\",49:\"1\",50:\"2\",51:\"3\",52:\"4\",53:\"5\",54:\"6\",55:\"7\",56:\"8\",57:\"9\",59:\";\",61:\"=\",65:\"A\",66:\"B\",67:\"C\",68:\"D\",69:\"E\",70:\"F\",71:\"G\",72:\"H\",73:\"I\",74:\"J\",75:\"K\",76:\"L\",77:\"M\",78:\"N\",79:\"O\",80:\"P\",81:\"Q\",82:\"R\",83:\"S\",84:\"T\",85:\"U\",86:\"V\",87:\"W\",88:\"X\",89:\"Y\",90:\"Z\",96:\"0\",97:\"1\",98:\"2\",99:\"3\",100:\"4\",101:\"5\",102:\"6\",103:\"7\",104:\"8\",105:\"9\",106:\"*\",107:\"+\",109:\"-\",110:\".\",111:\"/\",112:\"F1\",113:\"F2\",114:\"F3\",115:\"F4\",116:\"F5\",117:\"F6\",118:\"F7\",119:\"F8\",120:\"F9\",121:\"F10\",122:\"F11\",123:\"F12\",144:\"NUMLOCK\",145:\"SCROLLLOCK\",186:\";\",187:\"=\",188:\",\",189:\"-\",190:\".\",191:\"/\",192:\"`\",219:\"[\",220:\"\\\\\",221:\"]\",222:\"'\"},isControl:function(t){var i=t.which;switch(i){case e.COMMAND:case e.SHIFT:case e.CTRL:case e.ALT:return!0}return t.metaKey?!0:!1},isFunctionKey:function(e){return e=e.which?e.which:e,e>=112&&123>=e},isVerticalMovement:function(t){return~[e.UP,e.DOWN].indexOf(t)},isHorizontalMovement:function(t){return~[e.LEFT,e.RIGHT,e.BACKSPACE,e.DELETE].indexOf(t)},toSeparator:function(t){var i={ENTER:\"\\n\",TAB:\"\t\",SPACE:\" \"}[t];return i?i:e[t]?void 0:t}};void 0===angular.element.prototype.querySelectorAll&&(angular.element.prototype.querySelectorAll=function(e){return angular.element(this[0].querySelectorAll(e))}),void 0===angular.element.prototype.closest&&(angular.element.prototype.closest=function(e){for(var t=this[0],i=t.matches||t.webkitMatchesSelector||t.mozMatchesSelector||t.msMatchesSelector;t;){if(i.bind(t)(e))return t;t=t.parentElement}return!1});var t=0,i=angular.module(\"ui.select\",[]).constant(\"uiSelectConfig\",{theme:\"bootstrap\",searchEnabled:!0,sortable:!1,placeholder:\"\",refreshDelay:1e3,closeOnSelect:!0,dropdownPosition:\"auto\",generateId:function(){return t++},appendToBody:!1}).service(\"uiSelectMinErr\",function(){var e=angular.$$minErr(\"ui.select\");return function(){var t=e.apply(this,arguments),i=t.message.replace(new RegExp(\"\\nhttp://errors.angularjs.org/.*\"),\"\");return new Error(i)}}).directive(\"uisTranscludeAppend\",function(){return{link:function(e,t,i,c,s){s(e,function(e){t.append(e)})}}}).filter(\"highlight\",function(){function e(e){return e.replace(/([.?*+^$[\\]\\\\(){}|-])/g,\"\\\\$1\")}return function(t,i){return i&&t?(\"\"+t).replace(new RegExp(e(i),\"gi\"),'<span class=\"ui-select-highlight\">$&</span>'):t}}).factory(\"uisOffset\",[\"$document\",\"$window\",function(e,t){return function(i){var c=i[0].getBoundingClientRect();return{width:c.width||i.prop(\"offsetWidth\"),height:c.height||i.prop(\"offsetHeight\"),top:c.top+(t.pageYOffset||e[0].documentElement.scrollTop),left:c.left+(t.pageXOffset||e[0].documentElement.scrollLeft)}}}]);i.directive(\"uiSelectChoices\",[\"uiSelectConfig\",\"uisRepeatParser\",\"uiSelectMinErr\",\"$compile\",function(e,t,i,c){return{restrict:\"EA\",require:\"^uiSelect\",replace:!0,transclude:!0,templateUrl:function(t){var i=t.parent().attr(\"theme\")||e.theme;return i+\"/choices.tpl.html\"},compile:function(s,l){if(!l.repeat)throw i(\"repeat\",\"Expected 'repeat' expression.\");return function(s,l,n,a,r){var o=n.groupBy,u=n.groupFilter;if(a.parseRepeatAttr(n.repeat,o,u),a.disableChoiceExpression=n.uiDisableChoice,a.onHighlightCallback=n.onHighlight,a.dropdownPosition=n.position?n.position.toLowerCase():e.dropdownPosition,o){var d=l.querySelectorAll(\".ui-select-choices-group\");if(1!==d.length)throw i(\"rows\",\"Expected 1 .ui-select-choices-group but got '{0}'.\",d.length);d.attr(\"ng-repeat\",t.getGroupNgRepeatExpression())}var p=l.querySelectorAll(\".ui-select-choices-row\");if(1!==p.length)throw i(\"rows\",\"Expected 1 .ui-select-choices-row but got '{0}'.\",p.length);p.attr(\"ng-repeat\",a.parserResult.repeatExpression(o)).attr(\"ng-if\",\"$select.open\").attr(\"ng-click\",\"$select.select(\"+a.parserResult.itemName+\",false,$event)\");var h=l.querySelectorAll(\".ui-select-choices-row-inner\");if(1!==h.length)throw i(\"rows\",\"Expected 1 .ui-select-choices-row-inner but got '{0}'.\",h.length);h.attr(\"uis-transclude-append\",\"\"),c(l,r)(s),s.$watch(\"$select.search\",function(e){e&&!a.open&&a.multiple&&a.activate(!1,!0),a.activeIndex=a.tagging.isActivated?-1:0,!n.minimumInputLength||a.search.length>=n.minimumInputLength?a.refresh(n.refresh):a.items=[]}),n.$observe(\"refreshDelay\",function(){var t=s.$eval(n.refreshDelay);a.refreshDelay=void 0!==t?t:e.refreshDelay})}}}}]),i.controller(\"uiSelectCtrl\",[\"$scope\",\"$element\",\"$timeout\",\"$filter\",\"uisRepeatParser\",\"uiSelectMinErr\",\"uiSelectConfig\",\"$parse\",\"$injector\",function(t,i,c,s,l,n,a,r,o){function u(){(g.resetSearchInput||void 0===g.resetSearchInput&&a.resetSearchInput)&&(g.search=f,g.selected&&g.items.length&&!g.multiple&&(g.activeIndex=g.items.findIndex(function(e){return angular.equals(this,e)},g.selected)))}function d(e,t){var i,c,s=[];for(i=0;i<t.length;i++)for(c=0;c<e.length;c++)e[c].name==[t[i]]&&s.push(e[c]);return s}function p(t){var i=!0;switch(t){case e.DOWN:!g.open&&g.multiple?g.activate(!1,!0):g.activeIndex<g.items.length-1&&g.activeIndex++;break;case e.UP:!g.open&&g.multiple?g.activate(!1,!0):(g.activeIndex>0||0===g.search.length&&g.tagging.isActivated&&g.activeIndex>-1)&&g.activeIndex--;break;case e.TAB:(!g.multiple||g.open)&&g.select(g.items[g.activeIndex],!0);break;case e.ENTER:g.open&&(g.tagging.isActivated||g.activeIndex>=0)?g.select(g.items[g.activeIndex]):g.activate(!1,!0);break;case e.ESC:g.close();break;default:i=!1}return i}function h(){var e=i.querySelectorAll(\".ui-select-choices-content\"),t=e.querySelectorAll(\".ui-select-choices-row\");if(t.length<1)throw n(\"choices\",\"Expected multiple .ui-select-choices-row but got '{0}'.\",t.length);if(!(g.activeIndex<0)){var c=t[g.activeIndex],s=c.offsetTop+c.clientHeight-e[0].scrollTop,l=e[0].offsetHeight;s>l?e[0].scrollTop+=s-l:s<c.clientHeight&&(g.isGrouped&&0===g.activeIndex?e[0].scrollTop=0:e[0].scrollTop-=c.clientHeight-s)}}var g=this,f=\"\";if(g.placeholder=a.placeholder,g.searchEnabled=a.searchEnabled,g.sortable=a.sortable,g.refreshDelay=a.refreshDelay,g.removeSelected=!1,g.closeOnSelect=!0,g.search=f,g.activeIndex=0,g.items=[],g.open=!1,g.focus=!1,g.disabled=!1,g.selected=void 0,g.dropdownPosition=\"auto\",g.focusser=void 0,g.resetSearchInput=!0,g.multiple=void 0,g.disableChoiceExpression=void 0,g.tagging={isActivated:!1,fct:void 0},g.taggingTokens={isActivated:!1,tokens:void 0},g.lockChoiceExpression=void 0,g.clickTriggeredSelect=!1,g.$filter=s,g.$animate=function(){try{return o.get(\"$animate\")}catch(e){return null}}(),g.searchInput=i.querySelectorAll(\"input.ui-select-search\"),1!==g.searchInput.length)throw n(\"searchInput\",\"Expected 1 input.ui-select-search but got '{0}'.\",g.searchInput.length);g.isEmpty=function(){return angular.isUndefined(g.selected)||null===g.selected||\"\"===g.selected||g.multiple&&0===g.selected.length},g.activate=function(e,s){if(!g.disabled&&!g.open){s||u(),t.$broadcast(\"uis:activate\"),g.open=!0,g.activeIndex=g.activeIndex>=g.items.length?0:g.activeIndex,-1===g.activeIndex&&g.taggingLabel!==!1&&(g.activeIndex=0);var l=i.querySelectorAll(\".ui-select-choices-content\");g.$animate&&g.$animate.enabled(l[0])?g.$animate.on(\"enter\",l[0],function(t,i){\"close\"===i&&c(function(){g.focusSearchInput(e)})}):c(function(){g.focusSearchInput(e)})}},g.focusSearchInput=function(e){g.search=e||g.search,g.searchInput[0].focus(),!g.tagging.isActivated&&g.items.length>1&&h()},g.findGroupByName=function(e){return g.groups&&g.groups.filter(function(t){return t.name===e})[0]},g.parseRepeatAttr=function(e,i,c){function s(e){var s=t.$eval(i);if(g.groups=[],angular.forEach(e,function(e){var t=angular.isFunction(s)?s(e):e[s],i=g.findGroupByName(t);i?i.items.push(e):g.groups.push({name:t,items:[e]})}),c){var l=t.$eval(c);angular.isFunction(l)?g.groups=l(g.groups):angular.isArray(l)&&(g.groups=d(g.groups,l))}g.items=[],g.groups.forEach(function(e){g.items=g.items.concat(e.items)})}function a(e){g.items=e}g.setItemsFn=i?s:a,g.parserResult=l.parse(e),g.isGrouped=!!i,g.itemProperty=g.parserResult.itemName;var o=g.parserResult.source,u=function(){var e=o(t);t.$uisSource=Object.keys(e).map(function(t){var i={};return i[g.parserResult.keyName]=t,i.value=e[t],i})};g.parserResult.keyName&&(u(),g.parserResult.source=r(\"$uisSource\"+g.parserResult.filters),t.$watch(o,function(e,t){e!==t&&u()},!0)),g.refreshItems=function(e){e=e||g.parserResult.source(t);var i=g.selected;if(g.isEmpty()||angular.isArray(i)&&!i.length||!g.removeSelected)g.setItemsFn(e);else if(void 0!==e){var c=e.filter(function(e){return i&&i.indexOf(e)<0});g.setItemsFn(c)}(\"auto\"===g.dropdownPosition||\"up\"===g.dropdownPosition)&&t.calculateDropdownPos()},t.$watchCollection(g.parserResult.source,function(e){if(void 0===e||null===e)g.items=[];else{if(!angular.isArray(e))throw n(\"items\",\"Expected an array but got '{0}'.\",e);g.refreshItems(e),g.ngModel.$modelValue=null}})};var v;g.refresh=function(e){void 0!==e&&(v&&c.cancel(v),v=c(function(){t.$eval(e)},g.refreshDelay))},g.isActive=function(e){if(!g.open)return!1;var t=g.items.indexOf(e[g.itemProperty]),i=t==g.activeIndex;return!i||0>t&&g.taggingLabel!==!1||0>t&&g.taggingLabel===!1?!1:(i&&!angular.isUndefined(g.onHighlightCallback)&&e.$eval(g.onHighlightCallback),i)},g.isDisabled=function(e){if(g.open){var t,i=g.items.indexOf(e[g.itemProperty]),c=!1;return i>=0&&!angular.isUndefined(g.disableChoiceExpression)&&(t=g.items[i],c=!!e.$eval(g.disableChoiceExpression),t._uiSelectChoiceDisabled=c),c}},g.select=function(e,i,s){if(void 0===e||!e._uiSelectChoiceDisabled){if(!g.items&&!g.search&&!g.tagging.isActivated)return;if(!e||!e._uiSelectChoiceDisabled){if(g.tagging.isActivated){if(g.taggingLabel===!1)if(g.activeIndex<0){if(e=void 0!==g.tagging.fct?g.tagging.fct(g.search):g.search,!e||angular.equals(g.items[0],e))return}else e=g.items[g.activeIndex];else if(0===g.activeIndex){if(void 0===e)return;if(void 0!==g.tagging.fct&&\"string\"==typeof e){if(e=g.tagging.fct(g.search),!e)return}else\"string\"==typeof e&&(e=e.replace(g.taggingLabel,\"\").trim())}if(g.selected&&angular.isArray(g.selected)&&g.selected.filter(function(t){return angular.equals(t,e)}).length>0)return g.close(i),void 0}t.$broadcast(\"uis:select\",e);var l={};l[g.parserResult.itemName]=e,c(function(){g.onSelectCallback(t,{$item:e,$model:g.parserResult.modelMapper(t,l)})}),g.closeOnSelect&&g.close(i),s&&\"click\"===s.type&&(g.clickTriggeredSelect=!0)}}},g.close=function(e){g.open&&(g.ngModel&&g.ngModel.$setTouched&&g.ngModel.$setTouched(),u(),g.open=!1,t.$broadcast(\"uis:close\",e))},g.setFocus=function(){g.focus||g.focusInput[0].focus()},g.clear=function(e){g.select(void 0),e.stopPropagation(),c(function(){g.focusser[0].focus()},0,!1)},g.toggle=function(e){g.open?(g.close(),e.preventDefault(),e.stopPropagation()):g.activate()},g.isLocked=function(e,t){var i,c=g.selected[t];return c&&!angular.isUndefined(g.lockChoiceExpression)&&(i=!!e.$eval(g.lockChoiceExpression),c._uiSelectChoiceLocked=i),i};var m=null;g.sizeSearchInput=function(){var e=g.searchInput[0],i=g.searchInput.parent().parent()[0],s=function(){return i.clientWidth*!!e.offsetParent},l=function(t){if(0===t)return!1;var i=t-e.offsetLeft-10;return 50>i&&(i=t),g.searchInput.css(\"width\",i+\"px\"),!0};g.searchInput.css(\"width\",\"10px\"),c(function(){null!==m||l(s())||(m=t.$watch(s,function(e){l(e)&&(m(),m=null)}))})},g.searchInput.on(\"keydown\",function(i){var s=i.which;t.$apply(function(){var t=!1;if((g.items.length>0||g.tagging.isActivated)&&(p(s),g.taggingTokens.isActivated)){for(var l=0;l<g.taggingTokens.tokens.length;l++)g.taggingTokens.tokens[l]===e.MAP[i.keyCode]&&g.search.length>0&&(t=!0);t&&c(function(){g.searchInput.triggerHandler(\"tagged\");var t=g.search.replace(e.MAP[i.keyCode],\"\").trim();g.tagging.fct&&(t=g.tagging.fct(t)),t&&g.select(t,!0)})}}),e.isVerticalMovement(s)&&g.items.length>0&&h(),(s===e.ENTER||s===e.ESC)&&(i.preventDefault(),i.stopPropagation())}),g.searchInput.on(\"paste\",function(t){var i=t.originalEvent.clipboardData.getData(\"text/plain\");if(i&&i.length>0&&g.taggingTokens.isActivated){var c=e.toSeparator(g.taggingTokens.tokens[0]),s=i.split(c);if(s&&s.length>0){var l=g.search;angular.forEach(s,function(e){g.search=e,g.select(e,!0)}),g.search=l,t.preventDefault(),t.stopPropagation()}}}),g.searchInput.on(\"tagged\",function(){c(function(){u()})}),t.$on(\"$destroy\",function(){g.searchInput.off(\"keyup keydown tagged blur paste\")})}]),Array.prototype.findIndex||(Array.prototype.findIndex=function(e){if(null===this)throw new TypeError(\"Array.prototype.findIndex called on null or undefined\");if(\"function\"!=typeof e)throw new TypeError(\"predicate must be a function\");for(var t,i=Object(this),c=i.length>>>0,s=arguments[1],l=0;c>l;l++)if(t=i[l],e.call(s,t,l,i))return l;return-1}),i.directive(\"uiSelect\",[\"$document\",\"uiSelectConfig\",\"uiSelectMinErr\",\"uisOffset\",\"$compile\",\"$parse\",\"$timeout\",function(e,t,i,c,s,l,n){return{restrict:\"EA\",templateUrl:function(e,i){var c=i.theme||t.theme;return c+(angular.isDefined(i.multiple)?\"/select-multiple.tpl.html\":\"/select.tpl.html\")},replace:!0,transclude:!0,require:[\"uiSelect\",\"^ngModel\"],scope:!0,controller:\"uiSelectCtrl\",controllerAs:\"$select\",compile:function(s,a){return angular.isDefined(a.multiple)?s.append(\"<ui-select-multiple/>\").removeAttr(\"multiple\"):s.append(\"<ui-select-single/>\"),a.inputId&&(s.querySelectorAll(\"input.ui-select-search\")[0].id=a.inputId),function(s,a,r,o,u){function d(e){if(g.open){var t=!1;if(t=window.jQuery?window.jQuery.contains(a[0],e.target):a[0].contains(e.target),!t&&!g.clickTriggeredSelect){var i=[\"input\",\"button\",\"textarea\"],c=angular.element(e.target).controller(\"uiSelect\"),l=c&&c!==g;l||(l=~i.indexOf(e.target.tagName.toLowerCase())),g.close(l),s.$digest()}g.clickTriggeredSelect=!1}}function p(){var t=c(a);m=angular.element('<div class=\"ui-select-placeholder\"></div>'),m[0].style.width=t.width+\"px\",m[0].style.height=t.height+\"px\",a.after(m),$=a[0].style.width,e.find(\"body\").append(a),a[0].style.position=\"absolute\",a[0].style.left=t.left+\"px\",a[0].style.top=t.top+\"px\",a[0].style.width=t.width+\"px\"}function h(){null!==m&&(m.replaceWith(a),m=null,a[0].style.position=\"\",a[0].style.left=\"\",a[0].style.top=\"\",a[0].style.width=$)}var g=o[0],f=o[1];g.generatedId=t.generateId(),g.baseTitle=r.title||\"Select box\",g.focusserTitle=g.baseTitle+\" focus\",g.focusserId=\"focusser-\"+g.generatedId,g.closeOnSelect=function(){return angular.isDefined(r.closeOnSelect)?l(r.closeOnSelect)():t.closeOnSelect}(),g.onSelectCallback=l(r.onSelect),g.onRemoveCallback=l(r.onRemove),g.limit=angular.isDefined(r.limit)?parseInt(r.limit,10):void 0,g.ngModel=f,g.choiceGrouped=function(e){return g.isGrouped&&e&&e.name},r.tabindex&&r.$observe(\"tabindex\",function(e){g.focusInput.attr(\"tabindex\",e),a.removeAttr(\"tabindex\")}),s.$watch(\"searchEnabled\",function(){var e=s.$eval(r.searchEnabled);g.searchEnabled=void 0!==e?e:t.searchEnabled}),s.$watch(\"sortable\",function(){var e=s.$eval(r.sortable);g.sortable=void 0!==e?e:t.sortable}),r.$observe(\"disabled\",function(){g.disabled=void 0!==r.disabled?r.disabled:!1}),r.$observe(\"resetSearchInput\",function(){var e=s.$eval(r.resetSearchInput);g.resetSearchInput=void 0!==e?e:!0}),r.$observe(\"tagging\",function(){if(void 0!==r.tagging){var e=s.$eval(r.tagging);g.tagging={isActivated:!0,fct:e!==!0?e:void 0}}else g.tagging={isActivated:!1,fct:void 0}}),r.$observe(\"taggingLabel\",function(){void 0!==r.tagging&&(g.taggingLabel=\"false\"===r.taggingLabel?!1:void 0!==r.taggingLabel?r.taggingLabel:\"(new)\")}),r.$observe(\"taggingTokens\",function(){if(void 0!==r.tagging){var e=void 0!==r.taggingTokens?r.taggingTokens.split(\"|\"):[\",\",\"ENTER\"];g.taggingTokens={isActivated:!0,tokens:e}}}),angular.isDefined(r.autofocus)&&n(function(){g.setFocus()}),angular.isDefined(r.focusOn)&&s.$on(r.focusOn,function(){n(function(){g.setFocus()})}),e.on(\"click\",d),s.$on(\"$destroy\",function(){e.off(\"click\",d)}),u(s,function(e){var t=angular.element(\"<div>\").append(e),c=t.querySelectorAll(\".ui-select-match\");if(c.removeAttr(\"ui-select-match\"),c.removeAttr(\"data-ui-select-match\"),1!==c.length)throw i(\"transcluded\",\"Expected 1 .ui-select-match but got '{0}'.\",c.length);a.querySelectorAll(\".ui-select-match\").replaceWith(c);var s=t.querySelectorAll(\".ui-select-choices\");if(s.removeAttr(\"ui-select-choices\"),s.removeAttr(\"data-ui-select-choices\"),1!==s.length)throw i(\"transcluded\",\"Expected 1 .ui-select-choices but got '{0}'.\",s.length);a.querySelectorAll(\".ui-select-choices\").replaceWith(s)});var v=s.$eval(r.appendToBody);(void 0!==v?v:t.appendToBody)&&(s.$watch(\"$select.open\",function(e){e?p():h()}),s.$on(\"$destroy\",function(){h()}));var m=null,$=\"\",b=null,w=\"direction-up\";s.$watch(\"$select.open\",function(){(\"auto\"===g.dropdownPosition||\"up\"===g.dropdownPosition)&&s.calculateDropdownPos()});var x=function(e,t){e=e||c(a),t=t||c(b),b[0].style.position=\"absolute\",b[0].style.top=-1*t.height+\"px\",a.addClass(w)},y=function(e,t){a.removeClass(w),e=e||c(a),t=t||c(b),b[0].style.position=\"\",b[0].style.top=\"\"};s.calculateDropdownPos=function(){if(g.open){if(b=angular.element(a).querySelectorAll(\".ui-select-dropdown\"),0===b.length)return;b[0].style.opacity=0,n(function(){if(\"up\"===g.dropdownPosition)x();else{a.removeClass(w);var t=c(a),i=c(b),s=e[0].documentElement.scrollTop||e[0].body.scrollTop;t.top+t.height+i.height>s+e[0].documentElement.clientHeight?x(t,i):y(t,i)}b[0].style.opacity=1})}else{if(null===b||0===b.length)return;b[0].style.position=\"\",b[0].style.top=\"\",a.removeClass(w)}}}}}}]),i.directive(\"uiSelectMatch\",[\"uiSelectConfig\",function(e){return{restrict:\"EA\",require:\"^uiSelect\",replace:!0,transclude:!0,templateUrl:function(t){var i=t.parent().attr(\"theme\")||e.theme,c=t.parent().attr(\"multiple\");return i+(c?\"/match-multiple.tpl.html\":\"/match.tpl.html\")},link:function(t,i,c,s){function l(e){s.allowClear=angular.isDefined(e)?\"\"===e?!0:\"true\"===e.toLowerCase():!1}s.lockChoiceExpression=c.uiLockChoice,c.$observe(\"placeholder\",function(t){s.placeholder=void 0!==t?t:e.placeholder}),c.$observe(\"allowClear\",l),l(c.allowClear),s.multiple&&s.sizeSearchInput()}}}]),i.directive(\"uiSelectMultiple\",[\"uiSelectMinErr\",\"$timeout\",function(t,i){return{restrict:\"EA\",require:[\"^uiSelect\",\"^ngModel\"],controller:[\"$scope\",\"$timeout\",function(e,t){var i,c=this,s=e.$select;e.$evalAsync(function(){i=e.ngModel}),c.activeMatchIndex=-1,c.updateModel=function(){i.$setViewValue(Date.now()),c.refreshComponent()},c.refreshComponent=function(){s.refreshItems(),s.sizeSearchInput()},c.removeChoice=function(i){var l=s.selected[i];if(!l._uiSelectChoiceLocked){var n={};n[s.parserResult.itemName]=l,s.selected.splice(i,1),c.activeMatchIndex=-1,s.sizeSearchInput(),t(function(){s.onRemoveCallback(e,{$item:l,$model:s.parserResult.modelMapper(e,n)})}),c.updateModel()}},c.getPlaceholder=function(){return s.selected&&s.selected.length?void 0:s.placeholder}}],controllerAs:\"$selectMultiple\",link:function(c,s,l,n){function a(e){return angular.isNumber(e.selectionStart)?e.selectionStart:e.value.length}function r(t){function i(){switch(t){case e.LEFT:return~h.activeMatchIndex?u:n;case e.RIGHT:return~h.activeMatchIndex&&r!==n?o:(d.activate(),!1);case e.BACKSPACE:return~h.activeMatchIndex?(h.removeChoice(r),u):n;case e.DELETE:return~h.activeMatchIndex?(h.removeChoice(h.activeMatchIndex),r):!1}}var c=a(d.searchInput[0]),s=d.selected.length,l=0,n=s-1,r=h.activeMatchIndex,o=h.activeMatchIndex+1,u=h.activeMatchIndex-1,p=r;return c>0||d.search.length&&t==e.RIGHT?!1:(d.close(),p=i(),h.activeMatchIndex=d.selected.length&&p!==!1?Math.min(n,Math.max(l,p)):-1,!0)}function o(e){if(void 0===e||void 0===d.search)return!1;var t=e.filter(function(e){return void 0===d.search.toUpperCase()||void 0===e?!1:e.toUpperCase()===d.search.toUpperCase()}).length>0;return t}function u(e,t){var i=-1;if(angular.isArray(e))for(var c=angular.copy(e),s=0;s<c.length;s++)if(void 0===d.tagging.fct)c[s]+\" \"+d.taggingLabel===t&&(i=s);else{var l=c[s];angular.isObject(l)&&(l.isTag=!0),angular.equals(l,t)&&(i=s)}return i}var d=n[0],p=c.ngModel=n[1],h=c.$selectMultiple;d.multiple=!0,d.removeSelected=!0,d.focusInput=d.searchInput,p.$parsers.unshift(function(){for(var e,t={},i=[],s=d.selected.length-1;s>=0;s--)t={},t[d.parserResult.itemName]=d.selected[s],e=d.parserResult.modelMapper(c,t),i.unshift(e);return i}),p.$formatters.unshift(function(e){var t,i=d.parserResult.source(c,{$select:{search:\"\"}}),s={};if(!i)return e;var l=[],n=function(e,i){if(e&&e.length){for(var n=e.length-1;n>=0;n--){if(s[d.parserResult.itemName]=e[n],t=d.parserResult.modelMapper(c,s),d.parserResult.trackByExp){var a=/\\.(.+)/.exec(d.parserResult.trackByExp);if(a.length>0&&t[a[1]]==i[a[1]])return l.unshift(e[n]),!0}if(angular.equals(t,i))return l.unshift(e[n]),!0}return!1}};if(!e)return l;for(var a=e.length-1;a>=0;a--)n(d.selected,e[a])||n(i,e[a])||l.unshift(e[a]);return l}),c.$watchCollection(function(){return p.$modelValue},function(e,t){t!=e&&(p.$modelValue=null,h.refreshComponent())}),p.$render=function(){if(!angular.isArray(p.$viewValue)){if(!angular.isUndefined(p.$viewValue)&&null!==p.$viewValue)throw t(\"multiarr\",\"Expected model value to be array but got '{0}'\",p.$viewValue);d.selected=[]}d.selected=p.$viewValue,c.$evalAsync()},c.$on(\"uis:select\",function(e,t){d.selected.length>=d.limit||(d.selected.push(t),h.updateModel())}),c.$on(\"uis:activate\",function(){h.activeMatchIndex=-1}),c.$watch(\"$select.disabled\",function(e,t){t&&!e&&d.sizeSearchInput()}),d.searchInput.on(\"keydown\",function(t){var i=t.which;c.$apply(function(){var c=!1;e.isHorizontalMovement(i)&&(c=r(i)),c&&i!=e.TAB&&(t.preventDefault(),t.stopPropagation())})}),d.searchInput.on(\"keyup\",function(t){if(e.isVerticalMovement(t.which)||c.$evalAsync(function(){d.activeIndex=d.taggingLabel===!1?-1:0}),d.tagging.isActivated&&d.search.length>0){if(t.which===e.TAB||e.isControl(t)||e.isFunctionKey(t)||t.which===e.ESC||e.isVerticalMovement(t.which))return;if(d.activeIndex=d.taggingLabel===!1?-1:0,d.taggingLabel===!1)return;var i,s,l,n,a=angular.copy(d.items),r=angular.copy(d.items),p=!1,h=-1;if(void 0!==d.tagging.fct){if(l=d.$filter(\"filter\")(a,{isTag:!0}),l.length>0&&(n=l[0]),a.length>0&&n&&(p=!0,a=a.slice(1,a.length),r=r.slice(1,r.length)),i=d.tagging.fct(d.search),i.isTag=!0,r.filter(function(e){return angular.equals(e,d.tagging.fct(d.search))}).length>0)return;i.isTag=!0}else{if(l=d.$filter(\"filter\")(a,function(e){return e.match(d.taggingLabel)}),l.length>0&&(n=l[0]),s=a[0],void 0!==s&&a.length>0&&n&&(p=!0,a=a.slice(1,a.length),r=r.slice(1,r.length)),i=d.search+\" \"+d.taggingLabel,u(d.selected,d.search)>-1)return;if(o(r.concat(d.selected)))return p&&(a=r,c.$evalAsync(function(){d.activeIndex=0,d.items=a})),void 0;if(o(r))return p&&(d.items=r.slice(1,r.length)),void 0}p&&(h=u(d.selected,i)),h>-1?a=a.slice(h+1,a.length-1):(a=[],a.push(i),a=a.concat(r)),c.$evalAsync(function(){d.activeIndex=0,d.items=a})}}),d.searchInput.on(\"blur\",function(){i(function(){h.activeMatchIndex=-1})})}}}]),i.directive(\"uiSelectSingle\",[\"$timeout\",\"$compile\",function(t,i){return{restrict:\"EA\",require:[\"^uiSelect\",\"^ngModel\"],link:function(c,s,l,n){var a=n[0],r=n[1];r.$parsers.unshift(function(e){var t,i={};return i[a.parserResult.itemName]=e,t=a.parserResult.modelMapper(c,i)}),r.$formatters.unshift(function(e){var t,i=a.parserResult.source(c,{$select:{search:\"\"}}),s={};if(i){var l=function(i){return s[a.parserResult.itemName]=i,t=a.parserResult.modelMapper(c,s),t==e};if(a.selected&&l(a.selected))return a.selected;for(var n=i.length-1;n>=0;n--)if(l(i[n]))return i[n]}return e}),c.$watch(\"$select.selected\",function(e){r.$viewValue!==e&&r.$setViewValue(e)}),r.$render=function(){a.selected=r.$viewValue},c.$on(\"uis:select\",function(e,t){a.selected=t}),c.$on(\"uis:close\",function(e,i){t(function(){a.focusser.prop(\"disabled\",!1),i||a.focusser[0].focus()},0,!1)}),c.$on(\"uis:activate\",function(){o.prop(\"disabled\",!0)});var o=angular.element(\"<input ng-disabled='$select.disabled' class='ui-select-focusser ui-select-offscreen' type='text' id='{{ $select.focusserId }}' aria-label='{{ $select.focusserTitle }}' aria-haspopup='true' role='button' />\");i(o)(c),a.focusser=o,a.focusInput=o,s.parent().append(o),o.bind(\"focus\",function(){c.$evalAsync(function(){a.focus=!0})}),o.bind(\"blur\",function(){c.$evalAsync(function(){a.focus=!1})}),o.bind(\"keydown\",function(t){return t.which===e.BACKSPACE?(t.preventDefault(),t.stopPropagation(),a.select(void 0),c.$apply(),void 0):(t.which===e.TAB||e.isControl(t)||e.isFunctionKey(t)||t.which===e.ESC||((t.which==e.DOWN||t.which==e.UP||t.which==e.ENTER||t.which==e.SPACE)&&(t.preventDefault(),t.stopPropagation(),a.activate()),c.$digest()),void 0)}),o.bind(\"keyup input\",function(t){t.which===e.TAB||e.isControl(t)||e.isFunctionKey(t)||t.which===e.ESC||t.which==e.ENTER||t.which===e.BACKSPACE||(a.activate(o.val()),o.val(\"\"),c.$digest())})}}}]),i.directive(\"uiSelectSort\",[\"$timeout\",\"uiSelectConfig\",\"uiSelectMinErr\",function(e,t,i){return{require:\"^uiSelect\",link:function(t,c,s,l){if(null===t[s.uiSelectSort])throw i(\"sort\",\"Expected a list to sort\");var n=angular.extend({axis:\"horizontal\"},t.$eval(s.uiSelectSortOptions)),a=n.axis,r=\"dragging\",o=\"dropping\",u=\"dropping-before\",d=\"dropping-after\";t.$watch(function(){return l.sortable},function(e){e?c.attr(\"draggable\",!0):c.removeAttr(\"draggable\")}),c.on(\"dragstart\",function(e){c.addClass(r),(e.dataTransfer||e.originalEvent.dataTransfer).setData(\"text/plain\",t.$index)}),c.on(\"dragend\",function(){c.removeClass(r)});var p,h=function(e,t){this.splice(t,0,this.splice(e,1)[0])},g=function(e){e.preventDefault();var t=\"vertical\"===a?e.offsetY||e.layerY||(e.originalEvent?e.originalEvent.offsetY:0):e.offsetX||e.layerX||(e.originalEvent?e.originalEvent.offsetX:0);t<this[\"vertical\"===a?\"offsetHeight\":\"offsetWidth\"]/2?(c.removeClass(d),c.addClass(u)):(c.removeClass(u),c.addClass(d))},f=function(t){t.preventDefault();var i=parseInt((t.dataTransfer||t.originalEvent.dataTransfer).getData(\"text/plain\"),10);e.cancel(p),p=e(function(){v(i)},20)},v=function(e){var i=t.$eval(s.uiSelectSort),l=i[e],n=null;n=c.hasClass(u)?e<t.$index?t.$index-1:t.$index:e<t.$index?t.$index:t.$index+1,h.apply(i,[e,n]),t.$apply(function(){t.$emit(\"uiSelectSort:change\",{array:i,item:l,from:e,to:n})}),c.removeClass(o),c.removeClass(u),c.removeClass(d),c.off(\"drop\",f)};c.on(\"dragenter\",function(){c.hasClass(r)||(c.addClass(o),c.on(\"dragover\",g),c.on(\"drop\",f))}),c.on(\"dragleave\",function(e){e.target==c&&(c.removeClass(o),c.removeClass(u),c.removeClass(d),c.off(\"dragover\",g),c.off(\"drop\",f))})}}}]),i.service(\"uisRepeatParser\",[\"uiSelectMinErr\",\"$parse\",function(e,t){var i=this;i.parse=function(i){var c,s=/\\(\\s*([\\$\\w][\\$\\w]*)\\s*,\\s*([\\$\\w][\\$\\w]*)\\s*\\)/.test(i);if(c=i.match(/^\\s*(?:([\\s\\S]+?)\\s+as\\s+)?(?:([\\$\\w][\\$\\w]*)|(?:\\(\\s*([\\$\\w][\\$\\w]*)\\s*,\\s*([\\$\\w][\\$\\w]*)\\s*\\)))\\s+in\\s+(([\\w\\.]+)?\\s*(|\\s*[\\s\\S]+?))?(?:\\s+track\\s+by\\s+([\\s\\S]+?))?\\s*$/),!c)throw e(\"iexp\",\"Expected expression in form of '_item_ in _collection_[ track by _id_]' but got '{0}'.\",i);if(!c[6]&&s)throw e(\"iexp\",\"Expected expression in form of '_item_ as (_key_, _item_) in _ObjCollection_ [ track by _id_]' but got '{0}'.\",i);return{itemName:c[4]||c[2],keyName:c[3],source:t(c[3]?c[6]:c[5]),sourceName:c[6],filters:c[7],trackByExp:c[8],modelMapper:t(c[1]||c[4]||c[2]),repeatExpression:function(e){var t=this.itemName+\" in \"+(e?\"$group.items\":\"$select.items\");return this.trackByExp&&(t+=\" track by \"+this.trackByExp),t}}},i.getGroupNgRepeatExpression=function(){return\"$group in $select.groups\"}}])}(),angular.module(\"ui.select\").run([\"$templateCache\",function(e){e.put(\"bootstrap/choices.tpl.html\",'<ul class=\"ui-select-choices ui-select-choices-content ui-select-dropdown dropdown-menu\" role=\"listbox\" ng-show=\"$select.items.length > 0\"><li class=\"ui-select-choices-group\" id=\"ui-select-choices-{{ $select.generatedId }}\"><div class=\"divider\" ng-show=\"$select.isGrouped && $index > 0\"></div><div ng-show=\"$select.isGrouped\" class=\"ui-select-choices-group-label dropdown-header\" ng-bind=\"$group.name\"></div><div id=\"ui-select-choices-row-{{ $select.generatedId }}-{{$index}}\" class=\"ui-select-choices-row\" ng-class=\"{active: $select.isActive(this), disabled: $select.isDisabled(this)}\" role=\"option\"><a href=\"\" class=\"ui-select-choices-row-inner\"></a></div></li></ul>'),e.put(\"bootstrap/match-multiple.tpl.html\",'<span class=\"ui-select-match\"><span ng-repeat=\"$item in $select.selected\"><span class=\"ui-select-match-item btn btn-default btn-xs\" tabindex=\"-1\" type=\"button\" ng-disabled=\"$select.disabled\" ng-click=\"$selectMultiple.activeMatchIndex = $index;\" ng-class=\"{\\'btn-primary\\':$selectMultiple.activeMatchIndex === $index, \\'select-locked\\':$select.isLocked(this, $index)}\" ui-select-sort=\"$select.selected\"><span class=\"close ui-select-match-close\" ng-hide=\"$select.disabled\" ng-click=\"$selectMultiple.removeChoice($index)\">&nbsp;&times;</span> <span uis-transclude-append=\"\"></span></span></span></span>'),e.put(\"bootstrap/match.tpl.html\",'<div class=\"ui-select-match\" ng-hide=\"$select.open\" ng-disabled=\"$select.disabled\" ng-class=\"{\\'btn-default-focus\\':$select.focus}\"><span tabindex=\"-1\" class=\"btn btn-default form-control ui-select-toggle\" aria-label=\"{{ $select.baseTitle }} activate\" ng-disabled=\"$select.disabled\" ng-click=\"$select.activate()\" style=\"outline: 0;\"><span ng-show=\"$select.isEmpty()\" class=\"ui-select-placeholder text-muted\">{{$select.placeholder}}</span> <span ng-hide=\"$select.isEmpty()\" class=\"ui-select-match-text pull-left\" ng-class=\"{\\'ui-select-allow-clear\\': $select.allowClear && !$select.isEmpty()}\" ng-transclude=\"\"></span> <i class=\"caret pull-right\" ng-click=\"$select.toggle($event)\"></i> <a ng-show=\"$select.allowClear && !$select.isEmpty()\" aria-label=\"{{ $select.baseTitle }} clear\" style=\"margin-right: 10px\" ng-click=\"$select.clear($event)\" class=\"btn btn-xs btn-link pull-right\"><i class=\"glyphicon glyphicon-remove\" aria-hidden=\"true\"></i></a></span></div>'),e.put(\"bootstrap/select-multiple.tpl.html\",'<div class=\"ui-select-container ui-select-multiple ui-select-bootstrap dropdown form-control\" ng-class=\"{open: $select.open}\"><div><div class=\"ui-select-match\"></div><input type=\"text\" autocomplete=\"false\" autocorrect=\"off\" autocapitalize=\"off\" spellcheck=\"false\" class=\"ui-select-search input-xs\" placeholder=\"{{$selectMultiple.getPlaceholder()}}\" ng-disabled=\"$select.disabled\" ng-hide=\"$select.disabled\" ng-click=\"$select.activate()\" ng-model=\"$select.search\" role=\"combobox\" aria-label=\"{{ $select.baseTitle }}\" ondrop=\"return false;\"></div><div class=\"ui-select-choices\"></div></div>'),e.put(\"bootstrap/select.tpl.html\",'<div class=\"ui-select-container ui-select-bootstrap dropdown\" ng-class=\"{open: $select.open}\"><div class=\"ui-select-match\"></div><input type=\"text\" autocomplete=\"false\" tabindex=\"-1\" aria-expanded=\"true\" aria-label=\"{{ $select.baseTitle }}\" aria-owns=\"ui-select-choices-{{ $select.generatedId }}\" aria-activedescendant=\"ui-select-choices-row-{{ $select.generatedId }}-{{ $select.activeIndex }}\" class=\"form-control ui-select-search\" placeholder=\"{{$select.placeholder}}\" ng-model=\"$select.search\" ng-show=\"$select.searchEnabled && $select.open\"><div class=\"ui-select-choices\"></div></div>'),e.put(\"select2/choices.tpl.html\",'<ul class=\"ui-select-choices ui-select-choices-content select2-results\"><li class=\"ui-select-choices-group\" ng-class=\"{\\'select2-result-with-children\\': $select.choiceGrouped($group) }\"><div ng-show=\"$select.choiceGrouped($group)\" class=\"ui-select-choices-group-label select2-result-label\" ng-bind=\"$group.name\"></div><ul role=\"listbox\" id=\"ui-select-choices-{{ $select.generatedId }}\" ng-class=\"{\\'select2-result-sub\\': $select.choiceGrouped($group), \\'select2-result-single\\': !$select.choiceGrouped($group) }\"><li role=\"option\" id=\"ui-select-choices-row-{{ $select.generatedId }}-{{$index}}\" class=\"ui-select-choices-row\" ng-class=\"{\\'select2-highlighted\\': $select.isActive(this), \\'select2-disabled\\': $select.isDisabled(this)}\"><div class=\"select2-result-label ui-select-choices-row-inner\"></div></li></ul></li></ul>'),e.put(\"select2/match-multiple.tpl.html\",'<span class=\"ui-select-match\"><li class=\"ui-select-match-item select2-search-choice\" ng-repeat=\"$item in $select.selected\" ng-class=\"{\\'select2-search-choice-focus\\':$selectMultiple.activeMatchIndex === $index, \\'select2-locked\\':$select.isLocked(this, $index)}\" ui-select-sort=\"$select.selected\"><span uis-transclude-append=\"\"></span> <a href=\"javascript:;\" class=\"ui-select-match-close select2-search-choice-close\" ng-click=\"$selectMultiple.removeChoice($index)\" tabindex=\"-1\"></a></li></span>'),e.put(\"select2/match.tpl.html\",'<a class=\"select2-choice ui-select-match\" ng-class=\"{\\'select2-default\\': $select.isEmpty()}\" ng-click=\"$select.toggle($event)\" aria-label=\"{{ $select.baseTitle }} select\"><span ng-show=\"$select.isEmpty()\" class=\"select2-chosen\">{{$select.placeholder}}</span> <span ng-hide=\"$select.isEmpty()\" class=\"select2-chosen\" ng-transclude=\"\"></span> <abbr ng-if=\"$select.allowClear && !$select.isEmpty()\" class=\"select2-search-choice-close\" ng-click=\"$select.clear($event)\"></abbr> <span class=\"select2-arrow ui-select-toggle\"><b></b></span></a>'),e.put(\"select2/select-multiple.tpl.html\",'<div class=\"ui-select-container ui-select-multiple select2 select2-container select2-container-multi\" ng-class=\"{\\'select2-container-active select2-dropdown-open open\\': $select.open, \\'select2-container-disabled\\': $select.disabled}\"><ul class=\"select2-choices\"><span class=\"ui-select-match\"></span><li class=\"select2-search-field\"><input type=\"text\" autocomplete=\"false\" autocorrect=\"off\" autocapitalize=\"off\" spellcheck=\"false\" role=\"combobox\" aria-expanded=\"true\" aria-owns=\"ui-select-choices-{{ $select.generatedId }}\" aria-label=\"{{ $select.baseTitle }}\" aria-activedescendant=\"ui-select-choices-row-{{ $select.generatedId }}-{{ $select.activeIndex }}\" class=\"select2-input ui-select-search\" placeholder=\"{{$selectMultiple.getPlaceholder()}}\" ng-disabled=\"$select.disabled\" ng-hide=\"$select.disabled\" ng-model=\"$select.search\" ng-click=\"$select.activate()\" style=\"width: 34px;\" ondrop=\"return false;\"></li></ul><div class=\"ui-select-dropdown select2-drop select2-with-searchbox select2-drop-active\" ng-class=\"{\\'select2-display-none\\': !$select.open}\"><div class=\"ui-select-choices\"></div></div></div>'),e.put(\"select2/select.tpl.html\",'<div class=\"ui-select-container select2 select2-container\" ng-class=\"{\\'select2-container-active select2-dropdown-open open\\': $select.open, \\'select2-container-disabled\\': $select.disabled, \\'select2-container-active\\': $select.focus, \\'select2-allowclear\\': $select.allowClear && !$select.isEmpty()}\"><div class=\"ui-select-match\"></div><div class=\"ui-select-dropdown select2-drop select2-with-searchbox select2-drop-active\" ng-class=\"{\\'select2-display-none\\': !$select.open}\"><div class=\"select2-search\" ng-show=\"$select.searchEnabled\"><input type=\"text\" autocomplete=\"false\" autocorrect=\"false\" autocapitalize=\"off\" spellcheck=\"false\" role=\"combobox\" aria-expanded=\"true\" aria-owns=\"ui-select-choices-{{ $select.generatedId }}\" aria-label=\"{{ $select.baseTitle }}\" aria-activedescendant=\"ui-select-choices-row-{{ $select.generatedId }}-{{ $select.activeIndex }}\" class=\"ui-select-search select2-input\" ng-model=\"$select.search\"></div><div class=\"ui-select-choices\"></div></div></div>'),e.put(\"selectize/choices.tpl.html\",'<div ng-show=\"$select.open\" class=\"ui-select-choices ui-select-dropdown selectize-dropdown single\"><div class=\"ui-select-choices-content selectize-dropdown-content\"><div class=\"ui-select-choices-group optgroup\" role=\"listbox\"><div ng-show=\"$select.isGrouped\" class=\"ui-select-choices-group-label optgroup-header\" ng-bind=\"$group.name\"></div><div role=\"option\" class=\"ui-select-choices-row\" ng-class=\"{active: $select.isActive(this), disabled: $select.isDisabled(this)}\"><div class=\"option ui-select-choices-row-inner\" data-selectable=\"\"></div></div></div></div></div>'),e.put(\"selectize/match.tpl.html\",'<div ng-hide=\"($select.open || $select.isEmpty())\" class=\"ui-select-match\" ng-transclude=\"\"></div>'),e.put(\"selectize/select.tpl.html\",'<div class=\"ui-select-container selectize-control single\" ng-class=\"{\\'open\\': $select.open}\"><div class=\"selectize-input\" ng-class=\"{\\'focus\\': $select.open, \\'disabled\\': $select.disabled, \\'selectize-focus\\' : $select.focus}\" ng-click=\"$select.activate()\"><div class=\"ui-select-match\"></div><input type=\"text\" autocomplete=\"false\" tabindex=\"-1\" class=\"ui-select-search ui-select-toggle\" ng-click=\"$select.toggle($event)\" placeholder=\"{{$select.placeholder}}\" ng-model=\"$select.search\" ng-hide=\"!$select.searchEnabled || ($select.selected && !$select.open)\" ng-disabled=\"$select.disabled\" aria-label=\"{{ $select.baseTitle }}\"></div><div class=\"ui-select-choices\"></div></div>')\n}]);\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDYuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9+L3VpLXNlbGVjdC9kaXN0L3NlbGVjdC5taW4uanM/MTY3NSJdLCJzb3VyY2VzQ29udGVudCI6WyIvKiFcbiAqIHVpLXNlbGVjdFxuICogaHR0cDovL2dpdGh1Yi5jb20vYW5ndWxhci11aS91aS1zZWxlY3RcbiAqIFZlcnNpb246IDAuMTQuMSAtIDIwMTYtMDEtMjdUMjI6Mjc6MDAuNDUyWlxuICogTGljZW5zZTogTUlUXG4gKi9cbiFmdW5jdGlvbigpe1widXNlIHN0cmljdFwiO3ZhciBlPXtUQUI6OSxFTlRFUjoxMyxFU0M6MjcsU1BBQ0U6MzIsTEVGVDozNyxVUDozOCxSSUdIVDozOSxET1dOOjQwLFNISUZUOjE2LENUUkw6MTcsQUxUOjE4LFBBR0VfVVA6MzMsUEFHRV9ET1dOOjM0LEhPTUU6MzYsRU5EOjM1LEJBQ0tTUEFDRTo4LERFTEVURTo0NixDT01NQU5EOjkxLE1BUDp7OTE6XCJDT01NQU5EXCIsODpcIkJBQ0tTUEFDRVwiLDk6XCJUQUJcIiwxMzpcIkVOVEVSXCIsMTY6XCJTSElGVFwiLDE3OlwiQ1RSTFwiLDE4OlwiQUxUXCIsMTk6XCJQQVVTRUJSRUFLXCIsMjA6XCJDQVBTTE9DS1wiLDI3OlwiRVNDXCIsMzI6XCJTUEFDRVwiLDMzOlwiUEFHRV9VUFwiLDM0OlwiUEFHRV9ET1dOXCIsMzU6XCJFTkRcIiwzNjpcIkhPTUVcIiwzNzpcIkxFRlRcIiwzODpcIlVQXCIsMzk6XCJSSUdIVFwiLDQwOlwiRE9XTlwiLDQzOlwiK1wiLDQ0OlwiUFJJTlRTQ1JFRU5cIiw0NTpcIklOU0VSVFwiLDQ2OlwiREVMRVRFXCIsNDg6XCIwXCIsNDk6XCIxXCIsNTA6XCIyXCIsNTE6XCIzXCIsNTI6XCI0XCIsNTM6XCI1XCIsNTQ6XCI2XCIsNTU6XCI3XCIsNTY6XCI4XCIsNTc6XCI5XCIsNTk6XCI7XCIsNjE6XCI9XCIsNjU6XCJBXCIsNjY6XCJCXCIsNjc6XCJDXCIsNjg6XCJEXCIsNjk6XCJFXCIsNzA6XCJGXCIsNzE6XCJHXCIsNzI6XCJIXCIsNzM6XCJJXCIsNzQ6XCJKXCIsNzU6XCJLXCIsNzY6XCJMXCIsNzc6XCJNXCIsNzg6XCJOXCIsNzk6XCJPXCIsODA6XCJQXCIsODE6XCJRXCIsODI6XCJSXCIsODM6XCJTXCIsODQ6XCJUXCIsODU6XCJVXCIsODY6XCJWXCIsODc6XCJXXCIsODg6XCJYXCIsODk6XCJZXCIsOTA6XCJaXCIsOTY6XCIwXCIsOTc6XCIxXCIsOTg6XCIyXCIsOTk6XCIzXCIsMTAwOlwiNFwiLDEwMTpcIjVcIiwxMDI6XCI2XCIsMTAzOlwiN1wiLDEwNDpcIjhcIiwxMDU6XCI5XCIsMTA2OlwiKlwiLDEwNzpcIitcIiwxMDk6XCItXCIsMTEwOlwiLlwiLDExMTpcIi9cIiwxMTI6XCJGMVwiLDExMzpcIkYyXCIsMTE0OlwiRjNcIiwxMTU6XCJGNFwiLDExNjpcIkY1XCIsMTE3OlwiRjZcIiwxMTg6XCJGN1wiLDExOTpcIkY4XCIsMTIwOlwiRjlcIiwxMjE6XCJGMTBcIiwxMjI6XCJGMTFcIiwxMjM6XCJGMTJcIiwxNDQ6XCJOVU1MT0NLXCIsMTQ1OlwiU0NST0xMTE9DS1wiLDE4NjpcIjtcIiwxODc6XCI9XCIsMTg4OlwiLFwiLDE4OTpcIi1cIiwxOTA6XCIuXCIsMTkxOlwiL1wiLDE5MjpcImBcIiwyMTk6XCJbXCIsMjIwOlwiXFxcXFwiLDIyMTpcIl1cIiwyMjI6XCInXCJ9LGlzQ29udHJvbDpmdW5jdGlvbih0KXt2YXIgaT10LndoaWNoO3N3aXRjaChpKXtjYXNlIGUuQ09NTUFORDpjYXNlIGUuU0hJRlQ6Y2FzZSBlLkNUUkw6Y2FzZSBlLkFMVDpyZXR1cm4hMH1yZXR1cm4gdC5tZXRhS2V5PyEwOiExfSxpc0Z1bmN0aW9uS2V5OmZ1bmN0aW9uKGUpe3JldHVybiBlPWUud2hpY2g/ZS53aGljaDplLGU+PTExMiYmMTIzPj1lfSxpc1ZlcnRpY2FsTW92ZW1lbnQ6ZnVuY3Rpb24odCl7cmV0dXJufltlLlVQLGUuRE9XTl0uaW5kZXhPZih0KX0saXNIb3Jpem9udGFsTW92ZW1lbnQ6ZnVuY3Rpb24odCl7cmV0dXJufltlLkxFRlQsZS5SSUdIVCxlLkJBQ0tTUEFDRSxlLkRFTEVURV0uaW5kZXhPZih0KX0sdG9TZXBhcmF0b3I6ZnVuY3Rpb24odCl7dmFyIGk9e0VOVEVSOlwiXFxuXCIsVEFCOlwiXHRcIixTUEFDRTpcIiBcIn1bdF07cmV0dXJuIGk/aTplW3RdP3ZvaWQgMDp0fX07dm9pZCAwPT09YW5ndWxhci5lbGVtZW50LnByb3RvdHlwZS5xdWVyeVNlbGVjdG9yQWxsJiYoYW5ndWxhci5lbGVtZW50LnByb3RvdHlwZS5xdWVyeVNlbGVjdG9yQWxsPWZ1bmN0aW9uKGUpe3JldHVybiBhbmd1bGFyLmVsZW1lbnQodGhpc1swXS5xdWVyeVNlbGVjdG9yQWxsKGUpKX0pLHZvaWQgMD09PWFuZ3VsYXIuZWxlbWVudC5wcm90b3R5cGUuY2xvc2VzdCYmKGFuZ3VsYXIuZWxlbWVudC5wcm90b3R5cGUuY2xvc2VzdD1mdW5jdGlvbihlKXtmb3IodmFyIHQ9dGhpc1swXSxpPXQubWF0Y2hlc3x8dC53ZWJraXRNYXRjaGVzU2VsZWN0b3J8fHQubW96TWF0Y2hlc1NlbGVjdG9yfHx0Lm1zTWF0Y2hlc1NlbGVjdG9yO3Q7KXtpZihpLmJpbmQodCkoZSkpcmV0dXJuIHQ7dD10LnBhcmVudEVsZW1lbnR9cmV0dXJuITF9KTt2YXIgdD0wLGk9YW5ndWxhci5tb2R1bGUoXCJ1aS5zZWxlY3RcIixbXSkuY29uc3RhbnQoXCJ1aVNlbGVjdENvbmZpZ1wiLHt0aGVtZTpcImJvb3RzdHJhcFwiLHNlYXJjaEVuYWJsZWQ6ITAsc29ydGFibGU6ITEscGxhY2Vob2xkZXI6XCJcIixyZWZyZXNoRGVsYXk6MWUzLGNsb3NlT25TZWxlY3Q6ITAsZHJvcGRvd25Qb3NpdGlvbjpcImF1dG9cIixnZW5lcmF0ZUlkOmZ1bmN0aW9uKCl7cmV0dXJuIHQrK30sYXBwZW5kVG9Cb2R5OiExfSkuc2VydmljZShcInVpU2VsZWN0TWluRXJyXCIsZnVuY3Rpb24oKXt2YXIgZT1hbmd1bGFyLiQkbWluRXJyKFwidWkuc2VsZWN0XCIpO3JldHVybiBmdW5jdGlvbigpe3ZhciB0PWUuYXBwbHkodGhpcyxhcmd1bWVudHMpLGk9dC5tZXNzYWdlLnJlcGxhY2UobmV3IFJlZ0V4cChcIlxcbmh0dHA6Ly9lcnJvcnMuYW5ndWxhcmpzLm9yZy8uKlwiKSxcIlwiKTtyZXR1cm4gbmV3IEVycm9yKGkpfX0pLmRpcmVjdGl2ZShcInVpc1RyYW5zY2x1ZGVBcHBlbmRcIixmdW5jdGlvbigpe3JldHVybntsaW5rOmZ1bmN0aW9uKGUsdCxpLGMscyl7cyhlLGZ1bmN0aW9uKGUpe3QuYXBwZW5kKGUpfSl9fX0pLmZpbHRlcihcImhpZ2hsaWdodFwiLGZ1bmN0aW9uKCl7ZnVuY3Rpb24gZShlKXtyZXR1cm4gZS5yZXBsYWNlKC8oWy4/KiteJFtcXF1cXFxcKCl7fXwtXSkvZyxcIlxcXFwkMVwiKX1yZXR1cm4gZnVuY3Rpb24odCxpKXtyZXR1cm4gaSYmdD8oXCJcIit0KS5yZXBsYWNlKG5ldyBSZWdFeHAoZShpKSxcImdpXCIpLCc8c3BhbiBjbGFzcz1cInVpLXNlbGVjdC1oaWdobGlnaHRcIj4kJjwvc3Bhbj4nKTp0fX0pLmZhY3RvcnkoXCJ1aXNPZmZzZXRcIixbXCIkZG9jdW1lbnRcIixcIiR3aW5kb3dcIixmdW5jdGlvbihlLHQpe3JldHVybiBmdW5jdGlvbihpKXt2YXIgYz1pWzBdLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO3JldHVybnt3aWR0aDpjLndpZHRofHxpLnByb3AoXCJvZmZzZXRXaWR0aFwiKSxoZWlnaHQ6Yy5oZWlnaHR8fGkucHJvcChcIm9mZnNldEhlaWdodFwiKSx0b3A6Yy50b3ArKHQucGFnZVlPZmZzZXR8fGVbMF0uZG9jdW1lbnRFbGVtZW50LnNjcm9sbFRvcCksbGVmdDpjLmxlZnQrKHQucGFnZVhPZmZzZXR8fGVbMF0uZG9jdW1lbnRFbGVtZW50LnNjcm9sbExlZnQpfX19XSk7aS5kaXJlY3RpdmUoXCJ1aVNlbGVjdENob2ljZXNcIixbXCJ1aVNlbGVjdENvbmZpZ1wiLFwidWlzUmVwZWF0UGFyc2VyXCIsXCJ1aVNlbGVjdE1pbkVyclwiLFwiJGNvbXBpbGVcIixmdW5jdGlvbihlLHQsaSxjKXtyZXR1cm57cmVzdHJpY3Q6XCJFQVwiLHJlcXVpcmU6XCJedWlTZWxlY3RcIixyZXBsYWNlOiEwLHRyYW5zY2x1ZGU6ITAsdGVtcGxhdGVVcmw6ZnVuY3Rpb24odCl7dmFyIGk9dC5wYXJlbnQoKS5hdHRyKFwidGhlbWVcIil8fGUudGhlbWU7cmV0dXJuIGkrXCIvY2hvaWNlcy50cGwuaHRtbFwifSxjb21waWxlOmZ1bmN0aW9uKHMsbCl7aWYoIWwucmVwZWF0KXRocm93IGkoXCJyZXBlYXRcIixcIkV4cGVjdGVkICdyZXBlYXQnIGV4cHJlc3Npb24uXCIpO3JldHVybiBmdW5jdGlvbihzLGwsbixhLHIpe3ZhciBvPW4uZ3JvdXBCeSx1PW4uZ3JvdXBGaWx0ZXI7aWYoYS5wYXJzZVJlcGVhdEF0dHIobi5yZXBlYXQsbyx1KSxhLmRpc2FibGVDaG9pY2VFeHByZXNzaW9uPW4udWlEaXNhYmxlQ2hvaWNlLGEub25IaWdobGlnaHRDYWxsYmFjaz1uLm9uSGlnaGxpZ2h0LGEuZHJvcGRvd25Qb3NpdGlvbj1uLnBvc2l0aW9uP24ucG9zaXRpb24udG9Mb3dlckNhc2UoKTplLmRyb3Bkb3duUG9zaXRpb24sbyl7dmFyIGQ9bC5xdWVyeVNlbGVjdG9yQWxsKFwiLnVpLXNlbGVjdC1jaG9pY2VzLWdyb3VwXCIpO2lmKDEhPT1kLmxlbmd0aCl0aHJvdyBpKFwicm93c1wiLFwiRXhwZWN0ZWQgMSAudWktc2VsZWN0LWNob2ljZXMtZ3JvdXAgYnV0IGdvdCAnezB9Jy5cIixkLmxlbmd0aCk7ZC5hdHRyKFwibmctcmVwZWF0XCIsdC5nZXRHcm91cE5nUmVwZWF0RXhwcmVzc2lvbigpKX12YXIgcD1sLnF1ZXJ5U2VsZWN0b3JBbGwoXCIudWktc2VsZWN0LWNob2ljZXMtcm93XCIpO2lmKDEhPT1wLmxlbmd0aCl0aHJvdyBpKFwicm93c1wiLFwiRXhwZWN0ZWQgMSAudWktc2VsZWN0LWNob2ljZXMtcm93IGJ1dCBnb3QgJ3swfScuXCIscC5sZW5ndGgpO3AuYXR0cihcIm5nLXJlcGVhdFwiLGEucGFyc2VyUmVzdWx0LnJlcGVhdEV4cHJlc3Npb24obykpLmF0dHIoXCJuZy1pZlwiLFwiJHNlbGVjdC5vcGVuXCIpLmF0dHIoXCJuZy1jbGlja1wiLFwiJHNlbGVjdC5zZWxlY3QoXCIrYS5wYXJzZXJSZXN1bHQuaXRlbU5hbWUrXCIsZmFsc2UsJGV2ZW50KVwiKTt2YXIgaD1sLnF1ZXJ5U2VsZWN0b3JBbGwoXCIudWktc2VsZWN0LWNob2ljZXMtcm93LWlubmVyXCIpO2lmKDEhPT1oLmxlbmd0aCl0aHJvdyBpKFwicm93c1wiLFwiRXhwZWN0ZWQgMSAudWktc2VsZWN0LWNob2ljZXMtcm93LWlubmVyIGJ1dCBnb3QgJ3swfScuXCIsaC5sZW5ndGgpO2guYXR0cihcInVpcy10cmFuc2NsdWRlLWFwcGVuZFwiLFwiXCIpLGMobCxyKShzKSxzLiR3YXRjaChcIiRzZWxlY3Quc2VhcmNoXCIsZnVuY3Rpb24oZSl7ZSYmIWEub3BlbiYmYS5tdWx0aXBsZSYmYS5hY3RpdmF0ZSghMSwhMCksYS5hY3RpdmVJbmRleD1hLnRhZ2dpbmcuaXNBY3RpdmF0ZWQ/LTE6MCwhbi5taW5pbXVtSW5wdXRMZW5ndGh8fGEuc2VhcmNoLmxlbmd0aD49bi5taW5pbXVtSW5wdXRMZW5ndGg/YS5yZWZyZXNoKG4ucmVmcmVzaCk6YS5pdGVtcz1bXX0pLG4uJG9ic2VydmUoXCJyZWZyZXNoRGVsYXlcIixmdW5jdGlvbigpe3ZhciB0PXMuJGV2YWwobi5yZWZyZXNoRGVsYXkpO2EucmVmcmVzaERlbGF5PXZvaWQgMCE9PXQ/dDplLnJlZnJlc2hEZWxheX0pfX19fV0pLGkuY29udHJvbGxlcihcInVpU2VsZWN0Q3RybFwiLFtcIiRzY29wZVwiLFwiJGVsZW1lbnRcIixcIiR0aW1lb3V0XCIsXCIkZmlsdGVyXCIsXCJ1aXNSZXBlYXRQYXJzZXJcIixcInVpU2VsZWN0TWluRXJyXCIsXCJ1aVNlbGVjdENvbmZpZ1wiLFwiJHBhcnNlXCIsXCIkaW5qZWN0b3JcIixmdW5jdGlvbih0LGksYyxzLGwsbixhLHIsbyl7ZnVuY3Rpb24gdSgpeyhnLnJlc2V0U2VhcmNoSW5wdXR8fHZvaWQgMD09PWcucmVzZXRTZWFyY2hJbnB1dCYmYS5yZXNldFNlYXJjaElucHV0KSYmKGcuc2VhcmNoPWYsZy5zZWxlY3RlZCYmZy5pdGVtcy5sZW5ndGgmJiFnLm11bHRpcGxlJiYoZy5hY3RpdmVJbmRleD1nLml0ZW1zLmZpbmRJbmRleChmdW5jdGlvbihlKXtyZXR1cm4gYW5ndWxhci5lcXVhbHModGhpcyxlKX0sZy5zZWxlY3RlZCkpKX1mdW5jdGlvbiBkKGUsdCl7dmFyIGksYyxzPVtdO2ZvcihpPTA7aTx0Lmxlbmd0aDtpKyspZm9yKGM9MDtjPGUubGVuZ3RoO2MrKyllW2NdLm5hbWU9PVt0W2ldXSYmcy5wdXNoKGVbY10pO3JldHVybiBzfWZ1bmN0aW9uIHAodCl7dmFyIGk9ITA7c3dpdGNoKHQpe2Nhc2UgZS5ET1dOOiFnLm9wZW4mJmcubXVsdGlwbGU/Zy5hY3RpdmF0ZSghMSwhMCk6Zy5hY3RpdmVJbmRleDxnLml0ZW1zLmxlbmd0aC0xJiZnLmFjdGl2ZUluZGV4Kys7YnJlYWs7Y2FzZSBlLlVQOiFnLm9wZW4mJmcubXVsdGlwbGU/Zy5hY3RpdmF0ZSghMSwhMCk6KGcuYWN0aXZlSW5kZXg+MHx8MD09PWcuc2VhcmNoLmxlbmd0aCYmZy50YWdnaW5nLmlzQWN0aXZhdGVkJiZnLmFjdGl2ZUluZGV4Pi0xKSYmZy5hY3RpdmVJbmRleC0tO2JyZWFrO2Nhc2UgZS5UQUI6KCFnLm11bHRpcGxlfHxnLm9wZW4pJiZnLnNlbGVjdChnLml0ZW1zW2cuYWN0aXZlSW5kZXhdLCEwKTticmVhaztjYXNlIGUuRU5URVI6Zy5vcGVuJiYoZy50YWdnaW5nLmlzQWN0aXZhdGVkfHxnLmFjdGl2ZUluZGV4Pj0wKT9nLnNlbGVjdChnLml0ZW1zW2cuYWN0aXZlSW5kZXhdKTpnLmFjdGl2YXRlKCExLCEwKTticmVhaztjYXNlIGUuRVNDOmcuY2xvc2UoKTticmVhaztkZWZhdWx0Omk9ITF9cmV0dXJuIGl9ZnVuY3Rpb24gaCgpe3ZhciBlPWkucXVlcnlTZWxlY3RvckFsbChcIi51aS1zZWxlY3QtY2hvaWNlcy1jb250ZW50XCIpLHQ9ZS5xdWVyeVNlbGVjdG9yQWxsKFwiLnVpLXNlbGVjdC1jaG9pY2VzLXJvd1wiKTtpZih0Lmxlbmd0aDwxKXRocm93IG4oXCJjaG9pY2VzXCIsXCJFeHBlY3RlZCBtdWx0aXBsZSAudWktc2VsZWN0LWNob2ljZXMtcm93IGJ1dCBnb3QgJ3swfScuXCIsdC5sZW5ndGgpO2lmKCEoZy5hY3RpdmVJbmRleDwwKSl7dmFyIGM9dFtnLmFjdGl2ZUluZGV4XSxzPWMub2Zmc2V0VG9wK2MuY2xpZW50SGVpZ2h0LWVbMF0uc2Nyb2xsVG9wLGw9ZVswXS5vZmZzZXRIZWlnaHQ7cz5sP2VbMF0uc2Nyb2xsVG9wKz1zLWw6czxjLmNsaWVudEhlaWdodCYmKGcuaXNHcm91cGVkJiYwPT09Zy5hY3RpdmVJbmRleD9lWzBdLnNjcm9sbFRvcD0wOmVbMF0uc2Nyb2xsVG9wLT1jLmNsaWVudEhlaWdodC1zKX19dmFyIGc9dGhpcyxmPVwiXCI7aWYoZy5wbGFjZWhvbGRlcj1hLnBsYWNlaG9sZGVyLGcuc2VhcmNoRW5hYmxlZD1hLnNlYXJjaEVuYWJsZWQsZy5zb3J0YWJsZT1hLnNvcnRhYmxlLGcucmVmcmVzaERlbGF5PWEucmVmcmVzaERlbGF5LGcucmVtb3ZlU2VsZWN0ZWQ9ITEsZy5jbG9zZU9uU2VsZWN0PSEwLGcuc2VhcmNoPWYsZy5hY3RpdmVJbmRleD0wLGcuaXRlbXM9W10sZy5vcGVuPSExLGcuZm9jdXM9ITEsZy5kaXNhYmxlZD0hMSxnLnNlbGVjdGVkPXZvaWQgMCxnLmRyb3Bkb3duUG9zaXRpb249XCJhdXRvXCIsZy5mb2N1c3Nlcj12b2lkIDAsZy5yZXNldFNlYXJjaElucHV0PSEwLGcubXVsdGlwbGU9dm9pZCAwLGcuZGlzYWJsZUNob2ljZUV4cHJlc3Npb249dm9pZCAwLGcudGFnZ2luZz17aXNBY3RpdmF0ZWQ6ITEsZmN0OnZvaWQgMH0sZy50YWdnaW5nVG9rZW5zPXtpc0FjdGl2YXRlZDohMSx0b2tlbnM6dm9pZCAwfSxnLmxvY2tDaG9pY2VFeHByZXNzaW9uPXZvaWQgMCxnLmNsaWNrVHJpZ2dlcmVkU2VsZWN0PSExLGcuJGZpbHRlcj1zLGcuJGFuaW1hdGU9ZnVuY3Rpb24oKXt0cnl7cmV0dXJuIG8uZ2V0KFwiJGFuaW1hdGVcIil9Y2F0Y2goZSl7cmV0dXJuIG51bGx9fSgpLGcuc2VhcmNoSW5wdXQ9aS5xdWVyeVNlbGVjdG9yQWxsKFwiaW5wdXQudWktc2VsZWN0LXNlYXJjaFwiKSwxIT09Zy5zZWFyY2hJbnB1dC5sZW5ndGgpdGhyb3cgbihcInNlYXJjaElucHV0XCIsXCJFeHBlY3RlZCAxIGlucHV0LnVpLXNlbGVjdC1zZWFyY2ggYnV0IGdvdCAnezB9Jy5cIixnLnNlYXJjaElucHV0Lmxlbmd0aCk7Zy5pc0VtcHR5PWZ1bmN0aW9uKCl7cmV0dXJuIGFuZ3VsYXIuaXNVbmRlZmluZWQoZy5zZWxlY3RlZCl8fG51bGw9PT1nLnNlbGVjdGVkfHxcIlwiPT09Zy5zZWxlY3RlZHx8Zy5tdWx0aXBsZSYmMD09PWcuc2VsZWN0ZWQubGVuZ3RofSxnLmFjdGl2YXRlPWZ1bmN0aW9uKGUscyl7aWYoIWcuZGlzYWJsZWQmJiFnLm9wZW4pe3N8fHUoKSx0LiRicm9hZGNhc3QoXCJ1aXM6YWN0aXZhdGVcIiksZy5vcGVuPSEwLGcuYWN0aXZlSW5kZXg9Zy5hY3RpdmVJbmRleD49Zy5pdGVtcy5sZW5ndGg/MDpnLmFjdGl2ZUluZGV4LC0xPT09Zy5hY3RpdmVJbmRleCYmZy50YWdnaW5nTGFiZWwhPT0hMSYmKGcuYWN0aXZlSW5kZXg9MCk7dmFyIGw9aS5xdWVyeVNlbGVjdG9yQWxsKFwiLnVpLXNlbGVjdC1jaG9pY2VzLWNvbnRlbnRcIik7Zy4kYW5pbWF0ZSYmZy4kYW5pbWF0ZS5lbmFibGVkKGxbMF0pP2cuJGFuaW1hdGUub24oXCJlbnRlclwiLGxbMF0sZnVuY3Rpb24odCxpKXtcImNsb3NlXCI9PT1pJiZjKGZ1bmN0aW9uKCl7Zy5mb2N1c1NlYXJjaElucHV0KGUpfSl9KTpjKGZ1bmN0aW9uKCl7Zy5mb2N1c1NlYXJjaElucHV0KGUpfSl9fSxnLmZvY3VzU2VhcmNoSW5wdXQ9ZnVuY3Rpb24oZSl7Zy5zZWFyY2g9ZXx8Zy5zZWFyY2gsZy5zZWFyY2hJbnB1dFswXS5mb2N1cygpLCFnLnRhZ2dpbmcuaXNBY3RpdmF0ZWQmJmcuaXRlbXMubGVuZ3RoPjEmJmgoKX0sZy5maW5kR3JvdXBCeU5hbWU9ZnVuY3Rpb24oZSl7cmV0dXJuIGcuZ3JvdXBzJiZnLmdyb3Vwcy5maWx0ZXIoZnVuY3Rpb24odCl7cmV0dXJuIHQubmFtZT09PWV9KVswXX0sZy5wYXJzZVJlcGVhdEF0dHI9ZnVuY3Rpb24oZSxpLGMpe2Z1bmN0aW9uIHMoZSl7dmFyIHM9dC4kZXZhbChpKTtpZihnLmdyb3Vwcz1bXSxhbmd1bGFyLmZvckVhY2goZSxmdW5jdGlvbihlKXt2YXIgdD1hbmd1bGFyLmlzRnVuY3Rpb24ocyk/cyhlKTplW3NdLGk9Zy5maW5kR3JvdXBCeU5hbWUodCk7aT9pLml0ZW1zLnB1c2goZSk6Zy5ncm91cHMucHVzaCh7bmFtZTp0LGl0ZW1zOltlXX0pfSksYyl7dmFyIGw9dC4kZXZhbChjKTthbmd1bGFyLmlzRnVuY3Rpb24obCk/Zy5ncm91cHM9bChnLmdyb3Vwcyk6YW5ndWxhci5pc0FycmF5KGwpJiYoZy5ncm91cHM9ZChnLmdyb3VwcyxsKSl9Zy5pdGVtcz1bXSxnLmdyb3Vwcy5mb3JFYWNoKGZ1bmN0aW9uKGUpe2cuaXRlbXM9Zy5pdGVtcy5jb25jYXQoZS5pdGVtcyl9KX1mdW5jdGlvbiBhKGUpe2cuaXRlbXM9ZX1nLnNldEl0ZW1zRm49aT9zOmEsZy5wYXJzZXJSZXN1bHQ9bC5wYXJzZShlKSxnLmlzR3JvdXBlZD0hIWksZy5pdGVtUHJvcGVydHk9Zy5wYXJzZXJSZXN1bHQuaXRlbU5hbWU7dmFyIG89Zy5wYXJzZXJSZXN1bHQuc291cmNlLHU9ZnVuY3Rpb24oKXt2YXIgZT1vKHQpO3QuJHVpc1NvdXJjZT1PYmplY3Qua2V5cyhlKS5tYXAoZnVuY3Rpb24odCl7dmFyIGk9e307cmV0dXJuIGlbZy5wYXJzZXJSZXN1bHQua2V5TmFtZV09dCxpLnZhbHVlPWVbdF0saX0pfTtnLnBhcnNlclJlc3VsdC5rZXlOYW1lJiYodSgpLGcucGFyc2VyUmVzdWx0LnNvdXJjZT1yKFwiJHVpc1NvdXJjZVwiK2cucGFyc2VyUmVzdWx0LmZpbHRlcnMpLHQuJHdhdGNoKG8sZnVuY3Rpb24oZSx0KXtlIT09dCYmdSgpfSwhMCkpLGcucmVmcmVzaEl0ZW1zPWZ1bmN0aW9uKGUpe2U9ZXx8Zy5wYXJzZXJSZXN1bHQuc291cmNlKHQpO3ZhciBpPWcuc2VsZWN0ZWQ7aWYoZy5pc0VtcHR5KCl8fGFuZ3VsYXIuaXNBcnJheShpKSYmIWkubGVuZ3RofHwhZy5yZW1vdmVTZWxlY3RlZClnLnNldEl0ZW1zRm4oZSk7ZWxzZSBpZih2b2lkIDAhPT1lKXt2YXIgYz1lLmZpbHRlcihmdW5jdGlvbihlKXtyZXR1cm4gaSYmaS5pbmRleE9mKGUpPDB9KTtnLnNldEl0ZW1zRm4oYyl9KFwiYXV0b1wiPT09Zy5kcm9wZG93blBvc2l0aW9ufHxcInVwXCI9PT1nLmRyb3Bkb3duUG9zaXRpb24pJiZ0LmNhbGN1bGF0ZURyb3Bkb3duUG9zKCl9LHQuJHdhdGNoQ29sbGVjdGlvbihnLnBhcnNlclJlc3VsdC5zb3VyY2UsZnVuY3Rpb24oZSl7aWYodm9pZCAwPT09ZXx8bnVsbD09PWUpZy5pdGVtcz1bXTtlbHNle2lmKCFhbmd1bGFyLmlzQXJyYXkoZSkpdGhyb3cgbihcIml0ZW1zXCIsXCJFeHBlY3RlZCBhbiBhcnJheSBidXQgZ290ICd7MH0nLlwiLGUpO2cucmVmcmVzaEl0ZW1zKGUpLGcubmdNb2RlbC4kbW9kZWxWYWx1ZT1udWxsfX0pfTt2YXIgdjtnLnJlZnJlc2g9ZnVuY3Rpb24oZSl7dm9pZCAwIT09ZSYmKHYmJmMuY2FuY2VsKHYpLHY9YyhmdW5jdGlvbigpe3QuJGV2YWwoZSl9LGcucmVmcmVzaERlbGF5KSl9LGcuaXNBY3RpdmU9ZnVuY3Rpb24oZSl7aWYoIWcub3BlbilyZXR1cm4hMTt2YXIgdD1nLml0ZW1zLmluZGV4T2YoZVtnLml0ZW1Qcm9wZXJ0eV0pLGk9dD09Zy5hY3RpdmVJbmRleDtyZXR1cm4haXx8MD50JiZnLnRhZ2dpbmdMYWJlbCE9PSExfHwwPnQmJmcudGFnZ2luZ0xhYmVsPT09ITE/ITE6KGkmJiFhbmd1bGFyLmlzVW5kZWZpbmVkKGcub25IaWdobGlnaHRDYWxsYmFjaykmJmUuJGV2YWwoZy5vbkhpZ2hsaWdodENhbGxiYWNrKSxpKX0sZy5pc0Rpc2FibGVkPWZ1bmN0aW9uKGUpe2lmKGcub3Blbil7dmFyIHQsaT1nLml0ZW1zLmluZGV4T2YoZVtnLml0ZW1Qcm9wZXJ0eV0pLGM9ITE7cmV0dXJuIGk+PTAmJiFhbmd1bGFyLmlzVW5kZWZpbmVkKGcuZGlzYWJsZUNob2ljZUV4cHJlc3Npb24pJiYodD1nLml0ZW1zW2ldLGM9ISFlLiRldmFsKGcuZGlzYWJsZUNob2ljZUV4cHJlc3Npb24pLHQuX3VpU2VsZWN0Q2hvaWNlRGlzYWJsZWQ9YyksY319LGcuc2VsZWN0PWZ1bmN0aW9uKGUsaSxzKXtpZih2b2lkIDA9PT1lfHwhZS5fdWlTZWxlY3RDaG9pY2VEaXNhYmxlZCl7aWYoIWcuaXRlbXMmJiFnLnNlYXJjaCYmIWcudGFnZ2luZy5pc0FjdGl2YXRlZClyZXR1cm47aWYoIWV8fCFlLl91aVNlbGVjdENob2ljZURpc2FibGVkKXtpZihnLnRhZ2dpbmcuaXNBY3RpdmF0ZWQpe2lmKGcudGFnZ2luZ0xhYmVsPT09ITEpaWYoZy5hY3RpdmVJbmRleDwwKXtpZihlPXZvaWQgMCE9PWcudGFnZ2luZy5mY3Q/Zy50YWdnaW5nLmZjdChnLnNlYXJjaCk6Zy5zZWFyY2gsIWV8fGFuZ3VsYXIuZXF1YWxzKGcuaXRlbXNbMF0sZSkpcmV0dXJufWVsc2UgZT1nLml0ZW1zW2cuYWN0aXZlSW5kZXhdO2Vsc2UgaWYoMD09PWcuYWN0aXZlSW5kZXgpe2lmKHZvaWQgMD09PWUpcmV0dXJuO2lmKHZvaWQgMCE9PWcudGFnZ2luZy5mY3QmJlwic3RyaW5nXCI9PXR5cGVvZiBlKXtpZihlPWcudGFnZ2luZy5mY3QoZy5zZWFyY2gpLCFlKXJldHVybn1lbHNlXCJzdHJpbmdcIj09dHlwZW9mIGUmJihlPWUucmVwbGFjZShnLnRhZ2dpbmdMYWJlbCxcIlwiKS50cmltKCkpfWlmKGcuc2VsZWN0ZWQmJmFuZ3VsYXIuaXNBcnJheShnLnNlbGVjdGVkKSYmZy5zZWxlY3RlZC5maWx0ZXIoZnVuY3Rpb24odCl7cmV0dXJuIGFuZ3VsYXIuZXF1YWxzKHQsZSl9KS5sZW5ndGg+MClyZXR1cm4gZy5jbG9zZShpKSx2b2lkIDB9dC4kYnJvYWRjYXN0KFwidWlzOnNlbGVjdFwiLGUpO3ZhciBsPXt9O2xbZy5wYXJzZXJSZXN1bHQuaXRlbU5hbWVdPWUsYyhmdW5jdGlvbigpe2cub25TZWxlY3RDYWxsYmFjayh0LHskaXRlbTplLCRtb2RlbDpnLnBhcnNlclJlc3VsdC5tb2RlbE1hcHBlcih0LGwpfSl9KSxnLmNsb3NlT25TZWxlY3QmJmcuY2xvc2UoaSkscyYmXCJjbGlja1wiPT09cy50eXBlJiYoZy5jbGlja1RyaWdnZXJlZFNlbGVjdD0hMCl9fX0sZy5jbG9zZT1mdW5jdGlvbihlKXtnLm9wZW4mJihnLm5nTW9kZWwmJmcubmdNb2RlbC4kc2V0VG91Y2hlZCYmZy5uZ01vZGVsLiRzZXRUb3VjaGVkKCksdSgpLGcub3Blbj0hMSx0LiRicm9hZGNhc3QoXCJ1aXM6Y2xvc2VcIixlKSl9LGcuc2V0Rm9jdXM9ZnVuY3Rpb24oKXtnLmZvY3VzfHxnLmZvY3VzSW5wdXRbMF0uZm9jdXMoKX0sZy5jbGVhcj1mdW5jdGlvbihlKXtnLnNlbGVjdCh2b2lkIDApLGUuc3RvcFByb3BhZ2F0aW9uKCksYyhmdW5jdGlvbigpe2cuZm9jdXNzZXJbMF0uZm9jdXMoKX0sMCwhMSl9LGcudG9nZ2xlPWZ1bmN0aW9uKGUpe2cub3Blbj8oZy5jbG9zZSgpLGUucHJldmVudERlZmF1bHQoKSxlLnN0b3BQcm9wYWdhdGlvbigpKTpnLmFjdGl2YXRlKCl9LGcuaXNMb2NrZWQ9ZnVuY3Rpb24oZSx0KXt2YXIgaSxjPWcuc2VsZWN0ZWRbdF07cmV0dXJuIGMmJiFhbmd1bGFyLmlzVW5kZWZpbmVkKGcubG9ja0Nob2ljZUV4cHJlc3Npb24pJiYoaT0hIWUuJGV2YWwoZy5sb2NrQ2hvaWNlRXhwcmVzc2lvbiksYy5fdWlTZWxlY3RDaG9pY2VMb2NrZWQ9aSksaX07dmFyIG09bnVsbDtnLnNpemVTZWFyY2hJbnB1dD1mdW5jdGlvbigpe3ZhciBlPWcuc2VhcmNoSW5wdXRbMF0saT1nLnNlYXJjaElucHV0LnBhcmVudCgpLnBhcmVudCgpWzBdLHM9ZnVuY3Rpb24oKXtyZXR1cm4gaS5jbGllbnRXaWR0aCohIWUub2Zmc2V0UGFyZW50fSxsPWZ1bmN0aW9uKHQpe2lmKDA9PT10KXJldHVybiExO3ZhciBpPXQtZS5vZmZzZXRMZWZ0LTEwO3JldHVybiA1MD5pJiYoaT10KSxnLnNlYXJjaElucHV0LmNzcyhcIndpZHRoXCIsaStcInB4XCIpLCEwfTtnLnNlYXJjaElucHV0LmNzcyhcIndpZHRoXCIsXCIxMHB4XCIpLGMoZnVuY3Rpb24oKXtudWxsIT09bXx8bChzKCkpfHwobT10LiR3YXRjaChzLGZ1bmN0aW9uKGUpe2woZSkmJihtKCksbT1udWxsKX0pKX0pfSxnLnNlYXJjaElucHV0Lm9uKFwia2V5ZG93blwiLGZ1bmN0aW9uKGkpe3ZhciBzPWkud2hpY2g7dC4kYXBwbHkoZnVuY3Rpb24oKXt2YXIgdD0hMTtpZigoZy5pdGVtcy5sZW5ndGg+MHx8Zy50YWdnaW5nLmlzQWN0aXZhdGVkKSYmKHAocyksZy50YWdnaW5nVG9rZW5zLmlzQWN0aXZhdGVkKSl7Zm9yKHZhciBsPTA7bDxnLnRhZ2dpbmdUb2tlbnMudG9rZW5zLmxlbmd0aDtsKyspZy50YWdnaW5nVG9rZW5zLnRva2Vuc1tsXT09PWUuTUFQW2kua2V5Q29kZV0mJmcuc2VhcmNoLmxlbmd0aD4wJiYodD0hMCk7dCYmYyhmdW5jdGlvbigpe2cuc2VhcmNoSW5wdXQudHJpZ2dlckhhbmRsZXIoXCJ0YWdnZWRcIik7dmFyIHQ9Zy5zZWFyY2gucmVwbGFjZShlLk1BUFtpLmtleUNvZGVdLFwiXCIpLnRyaW0oKTtnLnRhZ2dpbmcuZmN0JiYodD1nLnRhZ2dpbmcuZmN0KHQpKSx0JiZnLnNlbGVjdCh0LCEwKX0pfX0pLGUuaXNWZXJ0aWNhbE1vdmVtZW50KHMpJiZnLml0ZW1zLmxlbmd0aD4wJiZoKCksKHM9PT1lLkVOVEVSfHxzPT09ZS5FU0MpJiYoaS5wcmV2ZW50RGVmYXVsdCgpLGkuc3RvcFByb3BhZ2F0aW9uKCkpfSksZy5zZWFyY2hJbnB1dC5vbihcInBhc3RlXCIsZnVuY3Rpb24odCl7dmFyIGk9dC5vcmlnaW5hbEV2ZW50LmNsaXBib2FyZERhdGEuZ2V0RGF0YShcInRleHQvcGxhaW5cIik7aWYoaSYmaS5sZW5ndGg+MCYmZy50YWdnaW5nVG9rZW5zLmlzQWN0aXZhdGVkKXt2YXIgYz1lLnRvU2VwYXJhdG9yKGcudGFnZ2luZ1Rva2Vucy50b2tlbnNbMF0pLHM9aS5zcGxpdChjKTtpZihzJiZzLmxlbmd0aD4wKXt2YXIgbD1nLnNlYXJjaDthbmd1bGFyLmZvckVhY2gocyxmdW5jdGlvbihlKXtnLnNlYXJjaD1lLGcuc2VsZWN0KGUsITApfSksZy5zZWFyY2g9bCx0LnByZXZlbnREZWZhdWx0KCksdC5zdG9wUHJvcGFnYXRpb24oKX19fSksZy5zZWFyY2hJbnB1dC5vbihcInRhZ2dlZFwiLGZ1bmN0aW9uKCl7YyhmdW5jdGlvbigpe3UoKX0pfSksdC4kb24oXCIkZGVzdHJveVwiLGZ1bmN0aW9uKCl7Zy5zZWFyY2hJbnB1dC5vZmYoXCJrZXl1cCBrZXlkb3duIHRhZ2dlZCBibHVyIHBhc3RlXCIpfSl9XSksQXJyYXkucHJvdG90eXBlLmZpbmRJbmRleHx8KEFycmF5LnByb3RvdHlwZS5maW5kSW5kZXg9ZnVuY3Rpb24oZSl7aWYobnVsbD09PXRoaXMpdGhyb3cgbmV3IFR5cGVFcnJvcihcIkFycmF5LnByb3RvdHlwZS5maW5kSW5kZXggY2FsbGVkIG9uIG51bGwgb3IgdW5kZWZpbmVkXCIpO2lmKFwiZnVuY3Rpb25cIiE9dHlwZW9mIGUpdGhyb3cgbmV3IFR5cGVFcnJvcihcInByZWRpY2F0ZSBtdXN0IGJlIGEgZnVuY3Rpb25cIik7Zm9yKHZhciB0LGk9T2JqZWN0KHRoaXMpLGM9aS5sZW5ndGg+Pj4wLHM9YXJndW1lbnRzWzFdLGw9MDtjPmw7bCsrKWlmKHQ9aVtsXSxlLmNhbGwocyx0LGwsaSkpcmV0dXJuIGw7cmV0dXJuLTF9KSxpLmRpcmVjdGl2ZShcInVpU2VsZWN0XCIsW1wiJGRvY3VtZW50XCIsXCJ1aVNlbGVjdENvbmZpZ1wiLFwidWlTZWxlY3RNaW5FcnJcIixcInVpc09mZnNldFwiLFwiJGNvbXBpbGVcIixcIiRwYXJzZVwiLFwiJHRpbWVvdXRcIixmdW5jdGlvbihlLHQsaSxjLHMsbCxuKXtyZXR1cm57cmVzdHJpY3Q6XCJFQVwiLHRlbXBsYXRlVXJsOmZ1bmN0aW9uKGUsaSl7dmFyIGM9aS50aGVtZXx8dC50aGVtZTtyZXR1cm4gYysoYW5ndWxhci5pc0RlZmluZWQoaS5tdWx0aXBsZSk/XCIvc2VsZWN0LW11bHRpcGxlLnRwbC5odG1sXCI6XCIvc2VsZWN0LnRwbC5odG1sXCIpfSxyZXBsYWNlOiEwLHRyYW5zY2x1ZGU6ITAscmVxdWlyZTpbXCJ1aVNlbGVjdFwiLFwiXm5nTW9kZWxcIl0sc2NvcGU6ITAsY29udHJvbGxlcjpcInVpU2VsZWN0Q3RybFwiLGNvbnRyb2xsZXJBczpcIiRzZWxlY3RcIixjb21waWxlOmZ1bmN0aW9uKHMsYSl7cmV0dXJuIGFuZ3VsYXIuaXNEZWZpbmVkKGEubXVsdGlwbGUpP3MuYXBwZW5kKFwiPHVpLXNlbGVjdC1tdWx0aXBsZS8+XCIpLnJlbW92ZUF0dHIoXCJtdWx0aXBsZVwiKTpzLmFwcGVuZChcIjx1aS1zZWxlY3Qtc2luZ2xlLz5cIiksYS5pbnB1dElkJiYocy5xdWVyeVNlbGVjdG9yQWxsKFwiaW5wdXQudWktc2VsZWN0LXNlYXJjaFwiKVswXS5pZD1hLmlucHV0SWQpLGZ1bmN0aW9uKHMsYSxyLG8sdSl7ZnVuY3Rpb24gZChlKXtpZihnLm9wZW4pe3ZhciB0PSExO2lmKHQ9d2luZG93LmpRdWVyeT93aW5kb3cualF1ZXJ5LmNvbnRhaW5zKGFbMF0sZS50YXJnZXQpOmFbMF0uY29udGFpbnMoZS50YXJnZXQpLCF0JiYhZy5jbGlja1RyaWdnZXJlZFNlbGVjdCl7dmFyIGk9W1wiaW5wdXRcIixcImJ1dHRvblwiLFwidGV4dGFyZWFcIl0sYz1hbmd1bGFyLmVsZW1lbnQoZS50YXJnZXQpLmNvbnRyb2xsZXIoXCJ1aVNlbGVjdFwiKSxsPWMmJmMhPT1nO2x8fChsPX5pLmluZGV4T2YoZS50YXJnZXQudGFnTmFtZS50b0xvd2VyQ2FzZSgpKSksZy5jbG9zZShsKSxzLiRkaWdlc3QoKX1nLmNsaWNrVHJpZ2dlcmVkU2VsZWN0PSExfX1mdW5jdGlvbiBwKCl7dmFyIHQ9YyhhKTttPWFuZ3VsYXIuZWxlbWVudCgnPGRpdiBjbGFzcz1cInVpLXNlbGVjdC1wbGFjZWhvbGRlclwiPjwvZGl2PicpLG1bMF0uc3R5bGUud2lkdGg9dC53aWR0aCtcInB4XCIsbVswXS5zdHlsZS5oZWlnaHQ9dC5oZWlnaHQrXCJweFwiLGEuYWZ0ZXIobSksJD1hWzBdLnN0eWxlLndpZHRoLGUuZmluZChcImJvZHlcIikuYXBwZW5kKGEpLGFbMF0uc3R5bGUucG9zaXRpb249XCJhYnNvbHV0ZVwiLGFbMF0uc3R5bGUubGVmdD10LmxlZnQrXCJweFwiLGFbMF0uc3R5bGUudG9wPXQudG9wK1wicHhcIixhWzBdLnN0eWxlLndpZHRoPXQud2lkdGgrXCJweFwifWZ1bmN0aW9uIGgoKXtudWxsIT09bSYmKG0ucmVwbGFjZVdpdGgoYSksbT1udWxsLGFbMF0uc3R5bGUucG9zaXRpb249XCJcIixhWzBdLnN0eWxlLmxlZnQ9XCJcIixhWzBdLnN0eWxlLnRvcD1cIlwiLGFbMF0uc3R5bGUud2lkdGg9JCl9dmFyIGc9b1swXSxmPW9bMV07Zy5nZW5lcmF0ZWRJZD10LmdlbmVyYXRlSWQoKSxnLmJhc2VUaXRsZT1yLnRpdGxlfHxcIlNlbGVjdCBib3hcIixnLmZvY3Vzc2VyVGl0bGU9Zy5iYXNlVGl0bGUrXCIgZm9jdXNcIixnLmZvY3Vzc2VySWQ9XCJmb2N1c3Nlci1cIitnLmdlbmVyYXRlZElkLGcuY2xvc2VPblNlbGVjdD1mdW5jdGlvbigpe3JldHVybiBhbmd1bGFyLmlzRGVmaW5lZChyLmNsb3NlT25TZWxlY3QpP2woci5jbG9zZU9uU2VsZWN0KSgpOnQuY2xvc2VPblNlbGVjdH0oKSxnLm9uU2VsZWN0Q2FsbGJhY2s9bChyLm9uU2VsZWN0KSxnLm9uUmVtb3ZlQ2FsbGJhY2s9bChyLm9uUmVtb3ZlKSxnLmxpbWl0PWFuZ3VsYXIuaXNEZWZpbmVkKHIubGltaXQpP3BhcnNlSW50KHIubGltaXQsMTApOnZvaWQgMCxnLm5nTW9kZWw9ZixnLmNob2ljZUdyb3VwZWQ9ZnVuY3Rpb24oZSl7cmV0dXJuIGcuaXNHcm91cGVkJiZlJiZlLm5hbWV9LHIudGFiaW5kZXgmJnIuJG9ic2VydmUoXCJ0YWJpbmRleFwiLGZ1bmN0aW9uKGUpe2cuZm9jdXNJbnB1dC5hdHRyKFwidGFiaW5kZXhcIixlKSxhLnJlbW92ZUF0dHIoXCJ0YWJpbmRleFwiKX0pLHMuJHdhdGNoKFwic2VhcmNoRW5hYmxlZFwiLGZ1bmN0aW9uKCl7dmFyIGU9cy4kZXZhbChyLnNlYXJjaEVuYWJsZWQpO2cuc2VhcmNoRW5hYmxlZD12b2lkIDAhPT1lP2U6dC5zZWFyY2hFbmFibGVkfSkscy4kd2F0Y2goXCJzb3J0YWJsZVwiLGZ1bmN0aW9uKCl7dmFyIGU9cy4kZXZhbChyLnNvcnRhYmxlKTtnLnNvcnRhYmxlPXZvaWQgMCE9PWU/ZTp0LnNvcnRhYmxlfSksci4kb2JzZXJ2ZShcImRpc2FibGVkXCIsZnVuY3Rpb24oKXtnLmRpc2FibGVkPXZvaWQgMCE9PXIuZGlzYWJsZWQ/ci5kaXNhYmxlZDohMX0pLHIuJG9ic2VydmUoXCJyZXNldFNlYXJjaElucHV0XCIsZnVuY3Rpb24oKXt2YXIgZT1zLiRldmFsKHIucmVzZXRTZWFyY2hJbnB1dCk7Zy5yZXNldFNlYXJjaElucHV0PXZvaWQgMCE9PWU/ZTohMH0pLHIuJG9ic2VydmUoXCJ0YWdnaW5nXCIsZnVuY3Rpb24oKXtpZih2b2lkIDAhPT1yLnRhZ2dpbmcpe3ZhciBlPXMuJGV2YWwoci50YWdnaW5nKTtnLnRhZ2dpbmc9e2lzQWN0aXZhdGVkOiEwLGZjdDplIT09ITA/ZTp2b2lkIDB9fWVsc2UgZy50YWdnaW5nPXtpc0FjdGl2YXRlZDohMSxmY3Q6dm9pZCAwfX0pLHIuJG9ic2VydmUoXCJ0YWdnaW5nTGFiZWxcIixmdW5jdGlvbigpe3ZvaWQgMCE9PXIudGFnZ2luZyYmKGcudGFnZ2luZ0xhYmVsPVwiZmFsc2VcIj09PXIudGFnZ2luZ0xhYmVsPyExOnZvaWQgMCE9PXIudGFnZ2luZ0xhYmVsP3IudGFnZ2luZ0xhYmVsOlwiKG5ldylcIil9KSxyLiRvYnNlcnZlKFwidGFnZ2luZ1Rva2Vuc1wiLGZ1bmN0aW9uKCl7aWYodm9pZCAwIT09ci50YWdnaW5nKXt2YXIgZT12b2lkIDAhPT1yLnRhZ2dpbmdUb2tlbnM/ci50YWdnaW5nVG9rZW5zLnNwbGl0KFwifFwiKTpbXCIsXCIsXCJFTlRFUlwiXTtnLnRhZ2dpbmdUb2tlbnM9e2lzQWN0aXZhdGVkOiEwLHRva2VuczplfX19KSxhbmd1bGFyLmlzRGVmaW5lZChyLmF1dG9mb2N1cykmJm4oZnVuY3Rpb24oKXtnLnNldEZvY3VzKCl9KSxhbmd1bGFyLmlzRGVmaW5lZChyLmZvY3VzT24pJiZzLiRvbihyLmZvY3VzT24sZnVuY3Rpb24oKXtuKGZ1bmN0aW9uKCl7Zy5zZXRGb2N1cygpfSl9KSxlLm9uKFwiY2xpY2tcIixkKSxzLiRvbihcIiRkZXN0cm95XCIsZnVuY3Rpb24oKXtlLm9mZihcImNsaWNrXCIsZCl9KSx1KHMsZnVuY3Rpb24oZSl7dmFyIHQ9YW5ndWxhci5lbGVtZW50KFwiPGRpdj5cIikuYXBwZW5kKGUpLGM9dC5xdWVyeVNlbGVjdG9yQWxsKFwiLnVpLXNlbGVjdC1tYXRjaFwiKTtpZihjLnJlbW92ZUF0dHIoXCJ1aS1zZWxlY3QtbWF0Y2hcIiksYy5yZW1vdmVBdHRyKFwiZGF0YS11aS1zZWxlY3QtbWF0Y2hcIiksMSE9PWMubGVuZ3RoKXRocm93IGkoXCJ0cmFuc2NsdWRlZFwiLFwiRXhwZWN0ZWQgMSAudWktc2VsZWN0LW1hdGNoIGJ1dCBnb3QgJ3swfScuXCIsYy5sZW5ndGgpO2EucXVlcnlTZWxlY3RvckFsbChcIi51aS1zZWxlY3QtbWF0Y2hcIikucmVwbGFjZVdpdGgoYyk7dmFyIHM9dC5xdWVyeVNlbGVjdG9yQWxsKFwiLnVpLXNlbGVjdC1jaG9pY2VzXCIpO2lmKHMucmVtb3ZlQXR0cihcInVpLXNlbGVjdC1jaG9pY2VzXCIpLHMucmVtb3ZlQXR0cihcImRhdGEtdWktc2VsZWN0LWNob2ljZXNcIiksMSE9PXMubGVuZ3RoKXRocm93IGkoXCJ0cmFuc2NsdWRlZFwiLFwiRXhwZWN0ZWQgMSAudWktc2VsZWN0LWNob2ljZXMgYnV0IGdvdCAnezB9Jy5cIixzLmxlbmd0aCk7YS5xdWVyeVNlbGVjdG9yQWxsKFwiLnVpLXNlbGVjdC1jaG9pY2VzXCIpLnJlcGxhY2VXaXRoKHMpfSk7dmFyIHY9cy4kZXZhbChyLmFwcGVuZFRvQm9keSk7KHZvaWQgMCE9PXY/djp0LmFwcGVuZFRvQm9keSkmJihzLiR3YXRjaChcIiRzZWxlY3Qub3BlblwiLGZ1bmN0aW9uKGUpe2U/cCgpOmgoKX0pLHMuJG9uKFwiJGRlc3Ryb3lcIixmdW5jdGlvbigpe2goKX0pKTt2YXIgbT1udWxsLCQ9XCJcIixiPW51bGwsdz1cImRpcmVjdGlvbi11cFwiO3MuJHdhdGNoKFwiJHNlbGVjdC5vcGVuXCIsZnVuY3Rpb24oKXsoXCJhdXRvXCI9PT1nLmRyb3Bkb3duUG9zaXRpb258fFwidXBcIj09PWcuZHJvcGRvd25Qb3NpdGlvbikmJnMuY2FsY3VsYXRlRHJvcGRvd25Qb3MoKX0pO3ZhciB4PWZ1bmN0aW9uKGUsdCl7ZT1lfHxjKGEpLHQ9dHx8YyhiKSxiWzBdLnN0eWxlLnBvc2l0aW9uPVwiYWJzb2x1dGVcIixiWzBdLnN0eWxlLnRvcD0tMSp0LmhlaWdodCtcInB4XCIsYS5hZGRDbGFzcyh3KX0seT1mdW5jdGlvbihlLHQpe2EucmVtb3ZlQ2xhc3ModyksZT1lfHxjKGEpLHQ9dHx8YyhiKSxiWzBdLnN0eWxlLnBvc2l0aW9uPVwiXCIsYlswXS5zdHlsZS50b3A9XCJcIn07cy5jYWxjdWxhdGVEcm9wZG93blBvcz1mdW5jdGlvbigpe2lmKGcub3Blbil7aWYoYj1hbmd1bGFyLmVsZW1lbnQoYSkucXVlcnlTZWxlY3RvckFsbChcIi51aS1zZWxlY3QtZHJvcGRvd25cIiksMD09PWIubGVuZ3RoKXJldHVybjtiWzBdLnN0eWxlLm9wYWNpdHk9MCxuKGZ1bmN0aW9uKCl7aWYoXCJ1cFwiPT09Zy5kcm9wZG93blBvc2l0aW9uKXgoKTtlbHNle2EucmVtb3ZlQ2xhc3Modyk7dmFyIHQ9YyhhKSxpPWMoYikscz1lWzBdLmRvY3VtZW50RWxlbWVudC5zY3JvbGxUb3B8fGVbMF0uYm9keS5zY3JvbGxUb3A7dC50b3ArdC5oZWlnaHQraS5oZWlnaHQ+cytlWzBdLmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQ/eCh0LGkpOnkodCxpKX1iWzBdLnN0eWxlLm9wYWNpdHk9MX0pfWVsc2V7aWYobnVsbD09PWJ8fDA9PT1iLmxlbmd0aClyZXR1cm47YlswXS5zdHlsZS5wb3NpdGlvbj1cIlwiLGJbMF0uc3R5bGUudG9wPVwiXCIsYS5yZW1vdmVDbGFzcyh3KX19fX19fV0pLGkuZGlyZWN0aXZlKFwidWlTZWxlY3RNYXRjaFwiLFtcInVpU2VsZWN0Q29uZmlnXCIsZnVuY3Rpb24oZSl7cmV0dXJue3Jlc3RyaWN0OlwiRUFcIixyZXF1aXJlOlwiXnVpU2VsZWN0XCIscmVwbGFjZTohMCx0cmFuc2NsdWRlOiEwLHRlbXBsYXRlVXJsOmZ1bmN0aW9uKHQpe3ZhciBpPXQucGFyZW50KCkuYXR0cihcInRoZW1lXCIpfHxlLnRoZW1lLGM9dC5wYXJlbnQoKS5hdHRyKFwibXVsdGlwbGVcIik7cmV0dXJuIGkrKGM/XCIvbWF0Y2gtbXVsdGlwbGUudHBsLmh0bWxcIjpcIi9tYXRjaC50cGwuaHRtbFwiKX0sbGluazpmdW5jdGlvbih0LGksYyxzKXtmdW5jdGlvbiBsKGUpe3MuYWxsb3dDbGVhcj1hbmd1bGFyLmlzRGVmaW5lZChlKT9cIlwiPT09ZT8hMDpcInRydWVcIj09PWUudG9Mb3dlckNhc2UoKTohMX1zLmxvY2tDaG9pY2VFeHByZXNzaW9uPWMudWlMb2NrQ2hvaWNlLGMuJG9ic2VydmUoXCJwbGFjZWhvbGRlclwiLGZ1bmN0aW9uKHQpe3MucGxhY2Vob2xkZXI9dm9pZCAwIT09dD90OmUucGxhY2Vob2xkZXJ9KSxjLiRvYnNlcnZlKFwiYWxsb3dDbGVhclwiLGwpLGwoYy5hbGxvd0NsZWFyKSxzLm11bHRpcGxlJiZzLnNpemVTZWFyY2hJbnB1dCgpfX19XSksaS5kaXJlY3RpdmUoXCJ1aVNlbGVjdE11bHRpcGxlXCIsW1widWlTZWxlY3RNaW5FcnJcIixcIiR0aW1lb3V0XCIsZnVuY3Rpb24odCxpKXtyZXR1cm57cmVzdHJpY3Q6XCJFQVwiLHJlcXVpcmU6W1wiXnVpU2VsZWN0XCIsXCJebmdNb2RlbFwiXSxjb250cm9sbGVyOltcIiRzY29wZVwiLFwiJHRpbWVvdXRcIixmdW5jdGlvbihlLHQpe3ZhciBpLGM9dGhpcyxzPWUuJHNlbGVjdDtlLiRldmFsQXN5bmMoZnVuY3Rpb24oKXtpPWUubmdNb2RlbH0pLGMuYWN0aXZlTWF0Y2hJbmRleD0tMSxjLnVwZGF0ZU1vZGVsPWZ1bmN0aW9uKCl7aS4kc2V0Vmlld1ZhbHVlKERhdGUubm93KCkpLGMucmVmcmVzaENvbXBvbmVudCgpfSxjLnJlZnJlc2hDb21wb25lbnQ9ZnVuY3Rpb24oKXtzLnJlZnJlc2hJdGVtcygpLHMuc2l6ZVNlYXJjaElucHV0KCl9LGMucmVtb3ZlQ2hvaWNlPWZ1bmN0aW9uKGkpe3ZhciBsPXMuc2VsZWN0ZWRbaV07aWYoIWwuX3VpU2VsZWN0Q2hvaWNlTG9ja2VkKXt2YXIgbj17fTtuW3MucGFyc2VyUmVzdWx0Lml0ZW1OYW1lXT1sLHMuc2VsZWN0ZWQuc3BsaWNlKGksMSksYy5hY3RpdmVNYXRjaEluZGV4PS0xLHMuc2l6ZVNlYXJjaElucHV0KCksdChmdW5jdGlvbigpe3Mub25SZW1vdmVDYWxsYmFjayhlLHskaXRlbTpsLCRtb2RlbDpzLnBhcnNlclJlc3VsdC5tb2RlbE1hcHBlcihlLG4pfSl9KSxjLnVwZGF0ZU1vZGVsKCl9fSxjLmdldFBsYWNlaG9sZGVyPWZ1bmN0aW9uKCl7cmV0dXJuIHMuc2VsZWN0ZWQmJnMuc2VsZWN0ZWQubGVuZ3RoP3ZvaWQgMDpzLnBsYWNlaG9sZGVyfX1dLGNvbnRyb2xsZXJBczpcIiRzZWxlY3RNdWx0aXBsZVwiLGxpbms6ZnVuY3Rpb24oYyxzLGwsbil7ZnVuY3Rpb24gYShlKXtyZXR1cm4gYW5ndWxhci5pc051bWJlcihlLnNlbGVjdGlvblN0YXJ0KT9lLnNlbGVjdGlvblN0YXJ0OmUudmFsdWUubGVuZ3RofWZ1bmN0aW9uIHIodCl7ZnVuY3Rpb24gaSgpe3N3aXRjaCh0KXtjYXNlIGUuTEVGVDpyZXR1cm5+aC5hY3RpdmVNYXRjaEluZGV4P3U6bjtjYXNlIGUuUklHSFQ6cmV0dXJufmguYWN0aXZlTWF0Y2hJbmRleCYmciE9PW4/bzooZC5hY3RpdmF0ZSgpLCExKTtjYXNlIGUuQkFDS1NQQUNFOnJldHVybn5oLmFjdGl2ZU1hdGNoSW5kZXg/KGgucmVtb3ZlQ2hvaWNlKHIpLHUpOm47Y2FzZSBlLkRFTEVURTpyZXR1cm5+aC5hY3RpdmVNYXRjaEluZGV4PyhoLnJlbW92ZUNob2ljZShoLmFjdGl2ZU1hdGNoSW5kZXgpLHIpOiExfX12YXIgYz1hKGQuc2VhcmNoSW5wdXRbMF0pLHM9ZC5zZWxlY3RlZC5sZW5ndGgsbD0wLG49cy0xLHI9aC5hY3RpdmVNYXRjaEluZGV4LG89aC5hY3RpdmVNYXRjaEluZGV4KzEsdT1oLmFjdGl2ZU1hdGNoSW5kZXgtMSxwPXI7cmV0dXJuIGM+MHx8ZC5zZWFyY2gubGVuZ3RoJiZ0PT1lLlJJR0hUPyExOihkLmNsb3NlKCkscD1pKCksaC5hY3RpdmVNYXRjaEluZGV4PWQuc2VsZWN0ZWQubGVuZ3RoJiZwIT09ITE/TWF0aC5taW4obixNYXRoLm1heChsLHApKTotMSwhMCl9ZnVuY3Rpb24gbyhlKXtpZih2b2lkIDA9PT1lfHx2b2lkIDA9PT1kLnNlYXJjaClyZXR1cm4hMTt2YXIgdD1lLmZpbHRlcihmdW5jdGlvbihlKXtyZXR1cm4gdm9pZCAwPT09ZC5zZWFyY2gudG9VcHBlckNhc2UoKXx8dm9pZCAwPT09ZT8hMTplLnRvVXBwZXJDYXNlKCk9PT1kLnNlYXJjaC50b1VwcGVyQ2FzZSgpfSkubGVuZ3RoPjA7cmV0dXJuIHR9ZnVuY3Rpb24gdShlLHQpe3ZhciBpPS0xO2lmKGFuZ3VsYXIuaXNBcnJheShlKSlmb3IodmFyIGM9YW5ndWxhci5jb3B5KGUpLHM9MDtzPGMubGVuZ3RoO3MrKylpZih2b2lkIDA9PT1kLnRhZ2dpbmcuZmN0KWNbc10rXCIgXCIrZC50YWdnaW5nTGFiZWw9PT10JiYoaT1zKTtlbHNle3ZhciBsPWNbc107YW5ndWxhci5pc09iamVjdChsKSYmKGwuaXNUYWc9ITApLGFuZ3VsYXIuZXF1YWxzKGwsdCkmJihpPXMpfXJldHVybiBpfXZhciBkPW5bMF0scD1jLm5nTW9kZWw9blsxXSxoPWMuJHNlbGVjdE11bHRpcGxlO2QubXVsdGlwbGU9ITAsZC5yZW1vdmVTZWxlY3RlZD0hMCxkLmZvY3VzSW5wdXQ9ZC5zZWFyY2hJbnB1dCxwLiRwYXJzZXJzLnVuc2hpZnQoZnVuY3Rpb24oKXtmb3IodmFyIGUsdD17fSxpPVtdLHM9ZC5zZWxlY3RlZC5sZW5ndGgtMTtzPj0wO3MtLSl0PXt9LHRbZC5wYXJzZXJSZXN1bHQuaXRlbU5hbWVdPWQuc2VsZWN0ZWRbc10sZT1kLnBhcnNlclJlc3VsdC5tb2RlbE1hcHBlcihjLHQpLGkudW5zaGlmdChlKTtyZXR1cm4gaX0pLHAuJGZvcm1hdHRlcnMudW5zaGlmdChmdW5jdGlvbihlKXt2YXIgdCxpPWQucGFyc2VyUmVzdWx0LnNvdXJjZShjLHskc2VsZWN0OntzZWFyY2g6XCJcIn19KSxzPXt9O2lmKCFpKXJldHVybiBlO3ZhciBsPVtdLG49ZnVuY3Rpb24oZSxpKXtpZihlJiZlLmxlbmd0aCl7Zm9yKHZhciBuPWUubGVuZ3RoLTE7bj49MDtuLS0pe2lmKHNbZC5wYXJzZXJSZXN1bHQuaXRlbU5hbWVdPWVbbl0sdD1kLnBhcnNlclJlc3VsdC5tb2RlbE1hcHBlcihjLHMpLGQucGFyc2VyUmVzdWx0LnRyYWNrQnlFeHApe3ZhciBhPS9cXC4oLispLy5leGVjKGQucGFyc2VyUmVzdWx0LnRyYWNrQnlFeHApO2lmKGEubGVuZ3RoPjAmJnRbYVsxXV09PWlbYVsxXV0pcmV0dXJuIGwudW5zaGlmdChlW25dKSwhMH1pZihhbmd1bGFyLmVxdWFscyh0LGkpKXJldHVybiBsLnVuc2hpZnQoZVtuXSksITB9cmV0dXJuITF9fTtpZighZSlyZXR1cm4gbDtmb3IodmFyIGE9ZS5sZW5ndGgtMTthPj0wO2EtLSluKGQuc2VsZWN0ZWQsZVthXSl8fG4oaSxlW2FdKXx8bC51bnNoaWZ0KGVbYV0pO3JldHVybiBsfSksYy4kd2F0Y2hDb2xsZWN0aW9uKGZ1bmN0aW9uKCl7cmV0dXJuIHAuJG1vZGVsVmFsdWV9LGZ1bmN0aW9uKGUsdCl7dCE9ZSYmKHAuJG1vZGVsVmFsdWU9bnVsbCxoLnJlZnJlc2hDb21wb25lbnQoKSl9KSxwLiRyZW5kZXI9ZnVuY3Rpb24oKXtpZighYW5ndWxhci5pc0FycmF5KHAuJHZpZXdWYWx1ZSkpe2lmKCFhbmd1bGFyLmlzVW5kZWZpbmVkKHAuJHZpZXdWYWx1ZSkmJm51bGwhPT1wLiR2aWV3VmFsdWUpdGhyb3cgdChcIm11bHRpYXJyXCIsXCJFeHBlY3RlZCBtb2RlbCB2YWx1ZSB0byBiZSBhcnJheSBidXQgZ290ICd7MH0nXCIscC4kdmlld1ZhbHVlKTtkLnNlbGVjdGVkPVtdfWQuc2VsZWN0ZWQ9cC4kdmlld1ZhbHVlLGMuJGV2YWxBc3luYygpfSxjLiRvbihcInVpczpzZWxlY3RcIixmdW5jdGlvbihlLHQpe2Quc2VsZWN0ZWQubGVuZ3RoPj1kLmxpbWl0fHwoZC5zZWxlY3RlZC5wdXNoKHQpLGgudXBkYXRlTW9kZWwoKSl9KSxjLiRvbihcInVpczphY3RpdmF0ZVwiLGZ1bmN0aW9uKCl7aC5hY3RpdmVNYXRjaEluZGV4PS0xfSksYy4kd2F0Y2goXCIkc2VsZWN0LmRpc2FibGVkXCIsZnVuY3Rpb24oZSx0KXt0JiYhZSYmZC5zaXplU2VhcmNoSW5wdXQoKX0pLGQuc2VhcmNoSW5wdXQub24oXCJrZXlkb3duXCIsZnVuY3Rpb24odCl7dmFyIGk9dC53aGljaDtjLiRhcHBseShmdW5jdGlvbigpe3ZhciBjPSExO2UuaXNIb3Jpem9udGFsTW92ZW1lbnQoaSkmJihjPXIoaSkpLGMmJmkhPWUuVEFCJiYodC5wcmV2ZW50RGVmYXVsdCgpLHQuc3RvcFByb3BhZ2F0aW9uKCkpfSl9KSxkLnNlYXJjaElucHV0Lm9uKFwia2V5dXBcIixmdW5jdGlvbih0KXtpZihlLmlzVmVydGljYWxNb3ZlbWVudCh0LndoaWNoKXx8Yy4kZXZhbEFzeW5jKGZ1bmN0aW9uKCl7ZC5hY3RpdmVJbmRleD1kLnRhZ2dpbmdMYWJlbD09PSExPy0xOjB9KSxkLnRhZ2dpbmcuaXNBY3RpdmF0ZWQmJmQuc2VhcmNoLmxlbmd0aD4wKXtpZih0LndoaWNoPT09ZS5UQUJ8fGUuaXNDb250cm9sKHQpfHxlLmlzRnVuY3Rpb25LZXkodCl8fHQud2hpY2g9PT1lLkVTQ3x8ZS5pc1ZlcnRpY2FsTW92ZW1lbnQodC53aGljaCkpcmV0dXJuO2lmKGQuYWN0aXZlSW5kZXg9ZC50YWdnaW5nTGFiZWw9PT0hMT8tMTowLGQudGFnZ2luZ0xhYmVsPT09ITEpcmV0dXJuO3ZhciBpLHMsbCxuLGE9YW5ndWxhci5jb3B5KGQuaXRlbXMpLHI9YW5ndWxhci5jb3B5KGQuaXRlbXMpLHA9ITEsaD0tMTtpZih2b2lkIDAhPT1kLnRhZ2dpbmcuZmN0KXtpZihsPWQuJGZpbHRlcihcImZpbHRlclwiKShhLHtpc1RhZzohMH0pLGwubGVuZ3RoPjAmJihuPWxbMF0pLGEubGVuZ3RoPjAmJm4mJihwPSEwLGE9YS5zbGljZSgxLGEubGVuZ3RoKSxyPXIuc2xpY2UoMSxyLmxlbmd0aCkpLGk9ZC50YWdnaW5nLmZjdChkLnNlYXJjaCksaS5pc1RhZz0hMCxyLmZpbHRlcihmdW5jdGlvbihlKXtyZXR1cm4gYW5ndWxhci5lcXVhbHMoZSxkLnRhZ2dpbmcuZmN0KGQuc2VhcmNoKSl9KS5sZW5ndGg+MClyZXR1cm47aS5pc1RhZz0hMH1lbHNle2lmKGw9ZC4kZmlsdGVyKFwiZmlsdGVyXCIpKGEsZnVuY3Rpb24oZSl7cmV0dXJuIGUubWF0Y2goZC50YWdnaW5nTGFiZWwpfSksbC5sZW5ndGg+MCYmKG49bFswXSkscz1hWzBdLHZvaWQgMCE9PXMmJmEubGVuZ3RoPjAmJm4mJihwPSEwLGE9YS5zbGljZSgxLGEubGVuZ3RoKSxyPXIuc2xpY2UoMSxyLmxlbmd0aCkpLGk9ZC5zZWFyY2grXCIgXCIrZC50YWdnaW5nTGFiZWwsdShkLnNlbGVjdGVkLGQuc2VhcmNoKT4tMSlyZXR1cm47aWYobyhyLmNvbmNhdChkLnNlbGVjdGVkKSkpcmV0dXJuIHAmJihhPXIsYy4kZXZhbEFzeW5jKGZ1bmN0aW9uKCl7ZC5hY3RpdmVJbmRleD0wLGQuaXRlbXM9YX0pKSx2b2lkIDA7aWYobyhyKSlyZXR1cm4gcCYmKGQuaXRlbXM9ci5zbGljZSgxLHIubGVuZ3RoKSksdm9pZCAwfXAmJihoPXUoZC5zZWxlY3RlZCxpKSksaD4tMT9hPWEuc2xpY2UoaCsxLGEubGVuZ3RoLTEpOihhPVtdLGEucHVzaChpKSxhPWEuY29uY2F0KHIpKSxjLiRldmFsQXN5bmMoZnVuY3Rpb24oKXtkLmFjdGl2ZUluZGV4PTAsZC5pdGVtcz1hfSl9fSksZC5zZWFyY2hJbnB1dC5vbihcImJsdXJcIixmdW5jdGlvbigpe2koZnVuY3Rpb24oKXtoLmFjdGl2ZU1hdGNoSW5kZXg9LTF9KX0pfX19XSksaS5kaXJlY3RpdmUoXCJ1aVNlbGVjdFNpbmdsZVwiLFtcIiR0aW1lb3V0XCIsXCIkY29tcGlsZVwiLGZ1bmN0aW9uKHQsaSl7cmV0dXJue3Jlc3RyaWN0OlwiRUFcIixyZXF1aXJlOltcIl51aVNlbGVjdFwiLFwiXm5nTW9kZWxcIl0sbGluazpmdW5jdGlvbihjLHMsbCxuKXt2YXIgYT1uWzBdLHI9blsxXTtyLiRwYXJzZXJzLnVuc2hpZnQoZnVuY3Rpb24oZSl7dmFyIHQsaT17fTtyZXR1cm4gaVthLnBhcnNlclJlc3VsdC5pdGVtTmFtZV09ZSx0PWEucGFyc2VyUmVzdWx0Lm1vZGVsTWFwcGVyKGMsaSl9KSxyLiRmb3JtYXR0ZXJzLnVuc2hpZnQoZnVuY3Rpb24oZSl7dmFyIHQsaT1hLnBhcnNlclJlc3VsdC5zb3VyY2UoYyx7JHNlbGVjdDp7c2VhcmNoOlwiXCJ9fSkscz17fTtpZihpKXt2YXIgbD1mdW5jdGlvbihpKXtyZXR1cm4gc1thLnBhcnNlclJlc3VsdC5pdGVtTmFtZV09aSx0PWEucGFyc2VyUmVzdWx0Lm1vZGVsTWFwcGVyKGMscyksdD09ZX07aWYoYS5zZWxlY3RlZCYmbChhLnNlbGVjdGVkKSlyZXR1cm4gYS5zZWxlY3RlZDtmb3IodmFyIG49aS5sZW5ndGgtMTtuPj0wO24tLSlpZihsKGlbbl0pKXJldHVybiBpW25dfXJldHVybiBlfSksYy4kd2F0Y2goXCIkc2VsZWN0LnNlbGVjdGVkXCIsZnVuY3Rpb24oZSl7ci4kdmlld1ZhbHVlIT09ZSYmci4kc2V0Vmlld1ZhbHVlKGUpfSksci4kcmVuZGVyPWZ1bmN0aW9uKCl7YS5zZWxlY3RlZD1yLiR2aWV3VmFsdWV9LGMuJG9uKFwidWlzOnNlbGVjdFwiLGZ1bmN0aW9uKGUsdCl7YS5zZWxlY3RlZD10fSksYy4kb24oXCJ1aXM6Y2xvc2VcIixmdW5jdGlvbihlLGkpe3QoZnVuY3Rpb24oKXthLmZvY3Vzc2VyLnByb3AoXCJkaXNhYmxlZFwiLCExKSxpfHxhLmZvY3Vzc2VyWzBdLmZvY3VzKCl9LDAsITEpfSksYy4kb24oXCJ1aXM6YWN0aXZhdGVcIixmdW5jdGlvbigpe28ucHJvcChcImRpc2FibGVkXCIsITApfSk7dmFyIG89YW5ndWxhci5lbGVtZW50KFwiPGlucHV0IG5nLWRpc2FibGVkPSckc2VsZWN0LmRpc2FibGVkJyBjbGFzcz0ndWktc2VsZWN0LWZvY3Vzc2VyIHVpLXNlbGVjdC1vZmZzY3JlZW4nIHR5cGU9J3RleHQnIGlkPSd7eyAkc2VsZWN0LmZvY3Vzc2VySWQgfX0nIGFyaWEtbGFiZWw9J3t7ICRzZWxlY3QuZm9jdXNzZXJUaXRsZSB9fScgYXJpYS1oYXNwb3B1cD0ndHJ1ZScgcm9sZT0nYnV0dG9uJyAvPlwiKTtpKG8pKGMpLGEuZm9jdXNzZXI9byxhLmZvY3VzSW5wdXQ9byxzLnBhcmVudCgpLmFwcGVuZChvKSxvLmJpbmQoXCJmb2N1c1wiLGZ1bmN0aW9uKCl7Yy4kZXZhbEFzeW5jKGZ1bmN0aW9uKCl7YS5mb2N1cz0hMH0pfSksby5iaW5kKFwiYmx1clwiLGZ1bmN0aW9uKCl7Yy4kZXZhbEFzeW5jKGZ1bmN0aW9uKCl7YS5mb2N1cz0hMX0pfSksby5iaW5kKFwia2V5ZG93blwiLGZ1bmN0aW9uKHQpe3JldHVybiB0LndoaWNoPT09ZS5CQUNLU1BBQ0U/KHQucHJldmVudERlZmF1bHQoKSx0LnN0b3BQcm9wYWdhdGlvbigpLGEuc2VsZWN0KHZvaWQgMCksYy4kYXBwbHkoKSx2b2lkIDApOih0LndoaWNoPT09ZS5UQUJ8fGUuaXNDb250cm9sKHQpfHxlLmlzRnVuY3Rpb25LZXkodCl8fHQud2hpY2g9PT1lLkVTQ3x8KCh0LndoaWNoPT1lLkRPV058fHQud2hpY2g9PWUuVVB8fHQud2hpY2g9PWUuRU5URVJ8fHQud2hpY2g9PWUuU1BBQ0UpJiYodC5wcmV2ZW50RGVmYXVsdCgpLHQuc3RvcFByb3BhZ2F0aW9uKCksYS5hY3RpdmF0ZSgpKSxjLiRkaWdlc3QoKSksdm9pZCAwKX0pLG8uYmluZChcImtleXVwIGlucHV0XCIsZnVuY3Rpb24odCl7dC53aGljaD09PWUuVEFCfHxlLmlzQ29udHJvbCh0KXx8ZS5pc0Z1bmN0aW9uS2V5KHQpfHx0LndoaWNoPT09ZS5FU0N8fHQud2hpY2g9PWUuRU5URVJ8fHQud2hpY2g9PT1lLkJBQ0tTUEFDRXx8KGEuYWN0aXZhdGUoby52YWwoKSksby52YWwoXCJcIiksYy4kZGlnZXN0KCkpfSl9fX1dKSxpLmRpcmVjdGl2ZShcInVpU2VsZWN0U29ydFwiLFtcIiR0aW1lb3V0XCIsXCJ1aVNlbGVjdENvbmZpZ1wiLFwidWlTZWxlY3RNaW5FcnJcIixmdW5jdGlvbihlLHQsaSl7cmV0dXJue3JlcXVpcmU6XCJedWlTZWxlY3RcIixsaW5rOmZ1bmN0aW9uKHQsYyxzLGwpe2lmKG51bGw9PT10W3MudWlTZWxlY3RTb3J0XSl0aHJvdyBpKFwic29ydFwiLFwiRXhwZWN0ZWQgYSBsaXN0IHRvIHNvcnRcIik7dmFyIG49YW5ndWxhci5leHRlbmQoe2F4aXM6XCJob3Jpem9udGFsXCJ9LHQuJGV2YWwocy51aVNlbGVjdFNvcnRPcHRpb25zKSksYT1uLmF4aXMscj1cImRyYWdnaW5nXCIsbz1cImRyb3BwaW5nXCIsdT1cImRyb3BwaW5nLWJlZm9yZVwiLGQ9XCJkcm9wcGluZy1hZnRlclwiO3QuJHdhdGNoKGZ1bmN0aW9uKCl7cmV0dXJuIGwuc29ydGFibGV9LGZ1bmN0aW9uKGUpe2U/Yy5hdHRyKFwiZHJhZ2dhYmxlXCIsITApOmMucmVtb3ZlQXR0cihcImRyYWdnYWJsZVwiKX0pLGMub24oXCJkcmFnc3RhcnRcIixmdW5jdGlvbihlKXtjLmFkZENsYXNzKHIpLChlLmRhdGFUcmFuc2Zlcnx8ZS5vcmlnaW5hbEV2ZW50LmRhdGFUcmFuc2Zlcikuc2V0RGF0YShcInRleHQvcGxhaW5cIix0LiRpbmRleCl9KSxjLm9uKFwiZHJhZ2VuZFwiLGZ1bmN0aW9uKCl7Yy5yZW1vdmVDbGFzcyhyKX0pO3ZhciBwLGg9ZnVuY3Rpb24oZSx0KXt0aGlzLnNwbGljZSh0LDAsdGhpcy5zcGxpY2UoZSwxKVswXSl9LGc9ZnVuY3Rpb24oZSl7ZS5wcmV2ZW50RGVmYXVsdCgpO3ZhciB0PVwidmVydGljYWxcIj09PWE/ZS5vZmZzZXRZfHxlLmxheWVyWXx8KGUub3JpZ2luYWxFdmVudD9lLm9yaWdpbmFsRXZlbnQub2Zmc2V0WTowKTplLm9mZnNldFh8fGUubGF5ZXJYfHwoZS5vcmlnaW5hbEV2ZW50P2Uub3JpZ2luYWxFdmVudC5vZmZzZXRYOjApO3Q8dGhpc1tcInZlcnRpY2FsXCI9PT1hP1wib2Zmc2V0SGVpZ2h0XCI6XCJvZmZzZXRXaWR0aFwiXS8yPyhjLnJlbW92ZUNsYXNzKGQpLGMuYWRkQ2xhc3ModSkpOihjLnJlbW92ZUNsYXNzKHUpLGMuYWRkQ2xhc3MoZCkpfSxmPWZ1bmN0aW9uKHQpe3QucHJldmVudERlZmF1bHQoKTt2YXIgaT1wYXJzZUludCgodC5kYXRhVHJhbnNmZXJ8fHQub3JpZ2luYWxFdmVudC5kYXRhVHJhbnNmZXIpLmdldERhdGEoXCJ0ZXh0L3BsYWluXCIpLDEwKTtlLmNhbmNlbChwKSxwPWUoZnVuY3Rpb24oKXt2KGkpfSwyMCl9LHY9ZnVuY3Rpb24oZSl7dmFyIGk9dC4kZXZhbChzLnVpU2VsZWN0U29ydCksbD1pW2VdLG49bnVsbDtuPWMuaGFzQ2xhc3ModSk/ZTx0LiRpbmRleD90LiRpbmRleC0xOnQuJGluZGV4OmU8dC4kaW5kZXg/dC4kaW5kZXg6dC4kaW5kZXgrMSxoLmFwcGx5KGksW2Usbl0pLHQuJGFwcGx5KGZ1bmN0aW9uKCl7dC4kZW1pdChcInVpU2VsZWN0U29ydDpjaGFuZ2VcIix7YXJyYXk6aSxpdGVtOmwsZnJvbTplLHRvOm59KX0pLGMucmVtb3ZlQ2xhc3MobyksYy5yZW1vdmVDbGFzcyh1KSxjLnJlbW92ZUNsYXNzKGQpLGMub2ZmKFwiZHJvcFwiLGYpfTtjLm9uKFwiZHJhZ2VudGVyXCIsZnVuY3Rpb24oKXtjLmhhc0NsYXNzKHIpfHwoYy5hZGRDbGFzcyhvKSxjLm9uKFwiZHJhZ292ZXJcIixnKSxjLm9uKFwiZHJvcFwiLGYpKX0pLGMub24oXCJkcmFnbGVhdmVcIixmdW5jdGlvbihlKXtlLnRhcmdldD09YyYmKGMucmVtb3ZlQ2xhc3MobyksYy5yZW1vdmVDbGFzcyh1KSxjLnJlbW92ZUNsYXNzKGQpLGMub2ZmKFwiZHJhZ292ZXJcIixnKSxjLm9mZihcImRyb3BcIixmKSl9KX19fV0pLGkuc2VydmljZShcInVpc1JlcGVhdFBhcnNlclwiLFtcInVpU2VsZWN0TWluRXJyXCIsXCIkcGFyc2VcIixmdW5jdGlvbihlLHQpe3ZhciBpPXRoaXM7aS5wYXJzZT1mdW5jdGlvbihpKXt2YXIgYyxzPS9cXChcXHMqKFtcXCRcXHddW1xcJFxcd10qKVxccyosXFxzKihbXFwkXFx3XVtcXCRcXHddKilcXHMqXFwpLy50ZXN0KGkpO2lmKGM9aS5tYXRjaCgvXlxccyooPzooW1xcc1xcU10rPylcXHMrYXNcXHMrKT8oPzooW1xcJFxcd11bXFwkXFx3XSopfCg/OlxcKFxccyooW1xcJFxcd11bXFwkXFx3XSopXFxzKixcXHMqKFtcXCRcXHddW1xcJFxcd10qKVxccypcXCkpKVxccytpblxccysoKFtcXHdcXC5dKyk/XFxzKih8XFxzKltcXHNcXFNdKz8pKT8oPzpcXHMrdHJhY2tcXHMrYnlcXHMrKFtcXHNcXFNdKz8pKT9cXHMqJC8pLCFjKXRocm93IGUoXCJpZXhwXCIsXCJFeHBlY3RlZCBleHByZXNzaW9uIGluIGZvcm0gb2YgJ19pdGVtXyBpbiBfY29sbGVjdGlvbl9bIHRyYWNrIGJ5IF9pZF9dJyBidXQgZ290ICd7MH0nLlwiLGkpO2lmKCFjWzZdJiZzKXRocm93IGUoXCJpZXhwXCIsXCJFeHBlY3RlZCBleHByZXNzaW9uIGluIGZvcm0gb2YgJ19pdGVtXyBhcyAoX2tleV8sIF9pdGVtXykgaW4gX09iakNvbGxlY3Rpb25fIFsgdHJhY2sgYnkgX2lkX10nIGJ1dCBnb3QgJ3swfScuXCIsaSk7cmV0dXJue2l0ZW1OYW1lOmNbNF18fGNbMl0sa2V5TmFtZTpjWzNdLHNvdXJjZTp0KGNbM10/Y1s2XTpjWzVdKSxzb3VyY2VOYW1lOmNbNl0sZmlsdGVyczpjWzddLHRyYWNrQnlFeHA6Y1s4XSxtb2RlbE1hcHBlcjp0KGNbMV18fGNbNF18fGNbMl0pLHJlcGVhdEV4cHJlc3Npb246ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5pdGVtTmFtZStcIiBpbiBcIisoZT9cIiRncm91cC5pdGVtc1wiOlwiJHNlbGVjdC5pdGVtc1wiKTtyZXR1cm4gdGhpcy50cmFja0J5RXhwJiYodCs9XCIgdHJhY2sgYnkgXCIrdGhpcy50cmFja0J5RXhwKSx0fX19LGkuZ2V0R3JvdXBOZ1JlcGVhdEV4cHJlc3Npb249ZnVuY3Rpb24oKXtyZXR1cm5cIiRncm91cCBpbiAkc2VsZWN0Lmdyb3Vwc1wifX1dKX0oKSxhbmd1bGFyLm1vZHVsZShcInVpLnNlbGVjdFwiKS5ydW4oW1wiJHRlbXBsYXRlQ2FjaGVcIixmdW5jdGlvbihlKXtlLnB1dChcImJvb3RzdHJhcC9jaG9pY2VzLnRwbC5odG1sXCIsJzx1bCBjbGFzcz1cInVpLXNlbGVjdC1jaG9pY2VzIHVpLXNlbGVjdC1jaG9pY2VzLWNvbnRlbnQgdWktc2VsZWN0LWRyb3Bkb3duIGRyb3Bkb3duLW1lbnVcIiByb2xlPVwibGlzdGJveFwiIG5nLXNob3c9XCIkc2VsZWN0Lml0ZW1zLmxlbmd0aCA+IDBcIj48bGkgY2xhc3M9XCJ1aS1zZWxlY3QtY2hvaWNlcy1ncm91cFwiIGlkPVwidWktc2VsZWN0LWNob2ljZXMte3sgJHNlbGVjdC5nZW5lcmF0ZWRJZCB9fVwiPjxkaXYgY2xhc3M9XCJkaXZpZGVyXCIgbmctc2hvdz1cIiRzZWxlY3QuaXNHcm91cGVkICYmICRpbmRleCA+IDBcIj48L2Rpdj48ZGl2IG5nLXNob3c9XCIkc2VsZWN0LmlzR3JvdXBlZFwiIGNsYXNzPVwidWktc2VsZWN0LWNob2ljZXMtZ3JvdXAtbGFiZWwgZHJvcGRvd24taGVhZGVyXCIgbmctYmluZD1cIiRncm91cC5uYW1lXCI+PC9kaXY+PGRpdiBpZD1cInVpLXNlbGVjdC1jaG9pY2VzLXJvdy17eyAkc2VsZWN0LmdlbmVyYXRlZElkIH19LXt7JGluZGV4fX1cIiBjbGFzcz1cInVpLXNlbGVjdC1jaG9pY2VzLXJvd1wiIG5nLWNsYXNzPVwie2FjdGl2ZTogJHNlbGVjdC5pc0FjdGl2ZSh0aGlzKSwgZGlzYWJsZWQ6ICRzZWxlY3QuaXNEaXNhYmxlZCh0aGlzKX1cIiByb2xlPVwib3B0aW9uXCI+PGEgaHJlZj1cIlwiIGNsYXNzPVwidWktc2VsZWN0LWNob2ljZXMtcm93LWlubmVyXCI+PC9hPjwvZGl2PjwvbGk+PC91bD4nKSxlLnB1dChcImJvb3RzdHJhcC9tYXRjaC1tdWx0aXBsZS50cGwuaHRtbFwiLCc8c3BhbiBjbGFzcz1cInVpLXNlbGVjdC1tYXRjaFwiPjxzcGFuIG5nLXJlcGVhdD1cIiRpdGVtIGluICRzZWxlY3Quc2VsZWN0ZWRcIj48c3BhbiBjbGFzcz1cInVpLXNlbGVjdC1tYXRjaC1pdGVtIGJ0biBidG4tZGVmYXVsdCBidG4teHNcIiB0YWJpbmRleD1cIi0xXCIgdHlwZT1cImJ1dHRvblwiIG5nLWRpc2FibGVkPVwiJHNlbGVjdC5kaXNhYmxlZFwiIG5nLWNsaWNrPVwiJHNlbGVjdE11bHRpcGxlLmFjdGl2ZU1hdGNoSW5kZXggPSAkaW5kZXg7XCIgbmctY2xhc3M9XCJ7XFwnYnRuLXByaW1hcnlcXCc6JHNlbGVjdE11bHRpcGxlLmFjdGl2ZU1hdGNoSW5kZXggPT09ICRpbmRleCwgXFwnc2VsZWN0LWxvY2tlZFxcJzokc2VsZWN0LmlzTG9ja2VkKHRoaXMsICRpbmRleCl9XCIgdWktc2VsZWN0LXNvcnQ9XCIkc2VsZWN0LnNlbGVjdGVkXCI+PHNwYW4gY2xhc3M9XCJjbG9zZSB1aS1zZWxlY3QtbWF0Y2gtY2xvc2VcIiBuZy1oaWRlPVwiJHNlbGVjdC5kaXNhYmxlZFwiIG5nLWNsaWNrPVwiJHNlbGVjdE11bHRpcGxlLnJlbW92ZUNob2ljZSgkaW5kZXgpXCI+Jm5ic3A7JnRpbWVzOzwvc3Bhbj4gPHNwYW4gdWlzLXRyYW5zY2x1ZGUtYXBwZW5kPVwiXCI+PC9zcGFuPjwvc3Bhbj48L3NwYW4+PC9zcGFuPicpLGUucHV0KFwiYm9vdHN0cmFwL21hdGNoLnRwbC5odG1sXCIsJzxkaXYgY2xhc3M9XCJ1aS1zZWxlY3QtbWF0Y2hcIiBuZy1oaWRlPVwiJHNlbGVjdC5vcGVuXCIgbmctZGlzYWJsZWQ9XCIkc2VsZWN0LmRpc2FibGVkXCIgbmctY2xhc3M9XCJ7XFwnYnRuLWRlZmF1bHQtZm9jdXNcXCc6JHNlbGVjdC5mb2N1c31cIj48c3BhbiB0YWJpbmRleD1cIi0xXCIgY2xhc3M9XCJidG4gYnRuLWRlZmF1bHQgZm9ybS1jb250cm9sIHVpLXNlbGVjdC10b2dnbGVcIiBhcmlhLWxhYmVsPVwie3sgJHNlbGVjdC5iYXNlVGl0bGUgfX0gYWN0aXZhdGVcIiBuZy1kaXNhYmxlZD1cIiRzZWxlY3QuZGlzYWJsZWRcIiBuZy1jbGljaz1cIiRzZWxlY3QuYWN0aXZhdGUoKVwiIHN0eWxlPVwib3V0bGluZTogMDtcIj48c3BhbiBuZy1zaG93PVwiJHNlbGVjdC5pc0VtcHR5KClcIiBjbGFzcz1cInVpLXNlbGVjdC1wbGFjZWhvbGRlciB0ZXh0LW11dGVkXCI+e3skc2VsZWN0LnBsYWNlaG9sZGVyfX08L3NwYW4+IDxzcGFuIG5nLWhpZGU9XCIkc2VsZWN0LmlzRW1wdHkoKVwiIGNsYXNzPVwidWktc2VsZWN0LW1hdGNoLXRleHQgcHVsbC1sZWZ0XCIgbmctY2xhc3M9XCJ7XFwndWktc2VsZWN0LWFsbG93LWNsZWFyXFwnOiAkc2VsZWN0LmFsbG93Q2xlYXIgJiYgISRzZWxlY3QuaXNFbXB0eSgpfVwiIG5nLXRyYW5zY2x1ZGU9XCJcIj48L3NwYW4+IDxpIGNsYXNzPVwiY2FyZXQgcHVsbC1yaWdodFwiIG5nLWNsaWNrPVwiJHNlbGVjdC50b2dnbGUoJGV2ZW50KVwiPjwvaT4gPGEgbmctc2hvdz1cIiRzZWxlY3QuYWxsb3dDbGVhciAmJiAhJHNlbGVjdC5pc0VtcHR5KClcIiBhcmlhLWxhYmVsPVwie3sgJHNlbGVjdC5iYXNlVGl0bGUgfX0gY2xlYXJcIiBzdHlsZT1cIm1hcmdpbi1yaWdodDogMTBweFwiIG5nLWNsaWNrPVwiJHNlbGVjdC5jbGVhcigkZXZlbnQpXCIgY2xhc3M9XCJidG4gYnRuLXhzIGJ0bi1saW5rIHB1bGwtcmlnaHRcIj48aSBjbGFzcz1cImdseXBoaWNvbiBnbHlwaGljb24tcmVtb3ZlXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPjwvYT48L3NwYW4+PC9kaXY+JyksZS5wdXQoXCJib290c3RyYXAvc2VsZWN0LW11bHRpcGxlLnRwbC5odG1sXCIsJzxkaXYgY2xhc3M9XCJ1aS1zZWxlY3QtY29udGFpbmVyIHVpLXNlbGVjdC1tdWx0aXBsZSB1aS1zZWxlY3QtYm9vdHN0cmFwIGRyb3Bkb3duIGZvcm0tY29udHJvbFwiIG5nLWNsYXNzPVwie29wZW46ICRzZWxlY3Qub3Blbn1cIj48ZGl2PjxkaXYgY2xhc3M9XCJ1aS1zZWxlY3QtbWF0Y2hcIj48L2Rpdj48aW5wdXQgdHlwZT1cInRleHRcIiBhdXRvY29tcGxldGU9XCJmYWxzZVwiIGF1dG9jb3JyZWN0PVwib2ZmXCIgYXV0b2NhcGl0YWxpemU9XCJvZmZcIiBzcGVsbGNoZWNrPVwiZmFsc2VcIiBjbGFzcz1cInVpLXNlbGVjdC1zZWFyY2ggaW5wdXQteHNcIiBwbGFjZWhvbGRlcj1cInt7JHNlbGVjdE11bHRpcGxlLmdldFBsYWNlaG9sZGVyKCl9fVwiIG5nLWRpc2FibGVkPVwiJHNlbGVjdC5kaXNhYmxlZFwiIG5nLWhpZGU9XCIkc2VsZWN0LmRpc2FibGVkXCIgbmctY2xpY2s9XCIkc2VsZWN0LmFjdGl2YXRlKClcIiBuZy1tb2RlbD1cIiRzZWxlY3Quc2VhcmNoXCIgcm9sZT1cImNvbWJvYm94XCIgYXJpYS1sYWJlbD1cInt7ICRzZWxlY3QuYmFzZVRpdGxlIH19XCIgb25kcm9wPVwicmV0dXJuIGZhbHNlO1wiPjwvZGl2PjxkaXYgY2xhc3M9XCJ1aS1zZWxlY3QtY2hvaWNlc1wiPjwvZGl2PjwvZGl2PicpLGUucHV0KFwiYm9vdHN0cmFwL3NlbGVjdC50cGwuaHRtbFwiLCc8ZGl2IGNsYXNzPVwidWktc2VsZWN0LWNvbnRhaW5lciB1aS1zZWxlY3QtYm9vdHN0cmFwIGRyb3Bkb3duXCIgbmctY2xhc3M9XCJ7b3BlbjogJHNlbGVjdC5vcGVufVwiPjxkaXYgY2xhc3M9XCJ1aS1zZWxlY3QtbWF0Y2hcIj48L2Rpdj48aW5wdXQgdHlwZT1cInRleHRcIiBhdXRvY29tcGxldGU9XCJmYWxzZVwiIHRhYmluZGV4PVwiLTFcIiBhcmlhLWV4cGFuZGVkPVwidHJ1ZVwiIGFyaWEtbGFiZWw9XCJ7eyAkc2VsZWN0LmJhc2VUaXRsZSB9fVwiIGFyaWEtb3ducz1cInVpLXNlbGVjdC1jaG9pY2VzLXt7ICRzZWxlY3QuZ2VuZXJhdGVkSWQgfX1cIiBhcmlhLWFjdGl2ZWRlc2NlbmRhbnQ9XCJ1aS1zZWxlY3QtY2hvaWNlcy1yb3cte3sgJHNlbGVjdC5nZW5lcmF0ZWRJZCB9fS17eyAkc2VsZWN0LmFjdGl2ZUluZGV4IH19XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2wgdWktc2VsZWN0LXNlYXJjaFwiIHBsYWNlaG9sZGVyPVwie3skc2VsZWN0LnBsYWNlaG9sZGVyfX1cIiBuZy1tb2RlbD1cIiRzZWxlY3Quc2VhcmNoXCIgbmctc2hvdz1cIiRzZWxlY3Quc2VhcmNoRW5hYmxlZCAmJiAkc2VsZWN0Lm9wZW5cIj48ZGl2IGNsYXNzPVwidWktc2VsZWN0LWNob2ljZXNcIj48L2Rpdj48L2Rpdj4nKSxlLnB1dChcInNlbGVjdDIvY2hvaWNlcy50cGwuaHRtbFwiLCc8dWwgY2xhc3M9XCJ1aS1zZWxlY3QtY2hvaWNlcyB1aS1zZWxlY3QtY2hvaWNlcy1jb250ZW50IHNlbGVjdDItcmVzdWx0c1wiPjxsaSBjbGFzcz1cInVpLXNlbGVjdC1jaG9pY2VzLWdyb3VwXCIgbmctY2xhc3M9XCJ7XFwnc2VsZWN0Mi1yZXN1bHQtd2l0aC1jaGlsZHJlblxcJzogJHNlbGVjdC5jaG9pY2VHcm91cGVkKCRncm91cCkgfVwiPjxkaXYgbmctc2hvdz1cIiRzZWxlY3QuY2hvaWNlR3JvdXBlZCgkZ3JvdXApXCIgY2xhc3M9XCJ1aS1zZWxlY3QtY2hvaWNlcy1ncm91cC1sYWJlbCBzZWxlY3QyLXJlc3VsdC1sYWJlbFwiIG5nLWJpbmQ9XCIkZ3JvdXAubmFtZVwiPjwvZGl2Pjx1bCByb2xlPVwibGlzdGJveFwiIGlkPVwidWktc2VsZWN0LWNob2ljZXMte3sgJHNlbGVjdC5nZW5lcmF0ZWRJZCB9fVwiIG5nLWNsYXNzPVwie1xcJ3NlbGVjdDItcmVzdWx0LXN1YlxcJzogJHNlbGVjdC5jaG9pY2VHcm91cGVkKCRncm91cCksIFxcJ3NlbGVjdDItcmVzdWx0LXNpbmdsZVxcJzogISRzZWxlY3QuY2hvaWNlR3JvdXBlZCgkZ3JvdXApIH1cIj48bGkgcm9sZT1cIm9wdGlvblwiIGlkPVwidWktc2VsZWN0LWNob2ljZXMtcm93LXt7ICRzZWxlY3QuZ2VuZXJhdGVkSWQgfX0te3skaW5kZXh9fVwiIGNsYXNzPVwidWktc2VsZWN0LWNob2ljZXMtcm93XCIgbmctY2xhc3M9XCJ7XFwnc2VsZWN0Mi1oaWdobGlnaHRlZFxcJzogJHNlbGVjdC5pc0FjdGl2ZSh0aGlzKSwgXFwnc2VsZWN0Mi1kaXNhYmxlZFxcJzogJHNlbGVjdC5pc0Rpc2FibGVkKHRoaXMpfVwiPjxkaXYgY2xhc3M9XCJzZWxlY3QyLXJlc3VsdC1sYWJlbCB1aS1zZWxlY3QtY2hvaWNlcy1yb3ctaW5uZXJcIj48L2Rpdj48L2xpPjwvdWw+PC9saT48L3VsPicpLGUucHV0KFwic2VsZWN0Mi9tYXRjaC1tdWx0aXBsZS50cGwuaHRtbFwiLCc8c3BhbiBjbGFzcz1cInVpLXNlbGVjdC1tYXRjaFwiPjxsaSBjbGFzcz1cInVpLXNlbGVjdC1tYXRjaC1pdGVtIHNlbGVjdDItc2VhcmNoLWNob2ljZVwiIG5nLXJlcGVhdD1cIiRpdGVtIGluICRzZWxlY3Quc2VsZWN0ZWRcIiBuZy1jbGFzcz1cIntcXCdzZWxlY3QyLXNlYXJjaC1jaG9pY2UtZm9jdXNcXCc6JHNlbGVjdE11bHRpcGxlLmFjdGl2ZU1hdGNoSW5kZXggPT09ICRpbmRleCwgXFwnc2VsZWN0Mi1sb2NrZWRcXCc6JHNlbGVjdC5pc0xvY2tlZCh0aGlzLCAkaW5kZXgpfVwiIHVpLXNlbGVjdC1zb3J0PVwiJHNlbGVjdC5zZWxlY3RlZFwiPjxzcGFuIHVpcy10cmFuc2NsdWRlLWFwcGVuZD1cIlwiPjwvc3Bhbj4gPGEgaHJlZj1cImphdmFzY3JpcHQ6O1wiIGNsYXNzPVwidWktc2VsZWN0LW1hdGNoLWNsb3NlIHNlbGVjdDItc2VhcmNoLWNob2ljZS1jbG9zZVwiIG5nLWNsaWNrPVwiJHNlbGVjdE11bHRpcGxlLnJlbW92ZUNob2ljZSgkaW5kZXgpXCIgdGFiaW5kZXg9XCItMVwiPjwvYT48L2xpPjwvc3Bhbj4nKSxlLnB1dChcInNlbGVjdDIvbWF0Y2gudHBsLmh0bWxcIiwnPGEgY2xhc3M9XCJzZWxlY3QyLWNob2ljZSB1aS1zZWxlY3QtbWF0Y2hcIiBuZy1jbGFzcz1cIntcXCdzZWxlY3QyLWRlZmF1bHRcXCc6ICRzZWxlY3QuaXNFbXB0eSgpfVwiIG5nLWNsaWNrPVwiJHNlbGVjdC50b2dnbGUoJGV2ZW50KVwiIGFyaWEtbGFiZWw9XCJ7eyAkc2VsZWN0LmJhc2VUaXRsZSB9fSBzZWxlY3RcIj48c3BhbiBuZy1zaG93PVwiJHNlbGVjdC5pc0VtcHR5KClcIiBjbGFzcz1cInNlbGVjdDItY2hvc2VuXCI+e3skc2VsZWN0LnBsYWNlaG9sZGVyfX08L3NwYW4+IDxzcGFuIG5nLWhpZGU9XCIkc2VsZWN0LmlzRW1wdHkoKVwiIGNsYXNzPVwic2VsZWN0Mi1jaG9zZW5cIiBuZy10cmFuc2NsdWRlPVwiXCI+PC9zcGFuPiA8YWJiciBuZy1pZj1cIiRzZWxlY3QuYWxsb3dDbGVhciAmJiAhJHNlbGVjdC5pc0VtcHR5KClcIiBjbGFzcz1cInNlbGVjdDItc2VhcmNoLWNob2ljZS1jbG9zZVwiIG5nLWNsaWNrPVwiJHNlbGVjdC5jbGVhcigkZXZlbnQpXCI+PC9hYmJyPiA8c3BhbiBjbGFzcz1cInNlbGVjdDItYXJyb3cgdWktc2VsZWN0LXRvZ2dsZVwiPjxiPjwvYj48L3NwYW4+PC9hPicpLGUucHV0KFwic2VsZWN0Mi9zZWxlY3QtbXVsdGlwbGUudHBsLmh0bWxcIiwnPGRpdiBjbGFzcz1cInVpLXNlbGVjdC1jb250YWluZXIgdWktc2VsZWN0LW11bHRpcGxlIHNlbGVjdDIgc2VsZWN0Mi1jb250YWluZXIgc2VsZWN0Mi1jb250YWluZXItbXVsdGlcIiBuZy1jbGFzcz1cIntcXCdzZWxlY3QyLWNvbnRhaW5lci1hY3RpdmUgc2VsZWN0Mi1kcm9wZG93bi1vcGVuIG9wZW5cXCc6ICRzZWxlY3Qub3BlbiwgXFwnc2VsZWN0Mi1jb250YWluZXItZGlzYWJsZWRcXCc6ICRzZWxlY3QuZGlzYWJsZWR9XCI+PHVsIGNsYXNzPVwic2VsZWN0Mi1jaG9pY2VzXCI+PHNwYW4gY2xhc3M9XCJ1aS1zZWxlY3QtbWF0Y2hcIj48L3NwYW4+PGxpIGNsYXNzPVwic2VsZWN0Mi1zZWFyY2gtZmllbGRcIj48aW5wdXQgdHlwZT1cInRleHRcIiBhdXRvY29tcGxldGU9XCJmYWxzZVwiIGF1dG9jb3JyZWN0PVwib2ZmXCIgYXV0b2NhcGl0YWxpemU9XCJvZmZcIiBzcGVsbGNoZWNrPVwiZmFsc2VcIiByb2xlPVwiY29tYm9ib3hcIiBhcmlhLWV4cGFuZGVkPVwidHJ1ZVwiIGFyaWEtb3ducz1cInVpLXNlbGVjdC1jaG9pY2VzLXt7ICRzZWxlY3QuZ2VuZXJhdGVkSWQgfX1cIiBhcmlhLWxhYmVsPVwie3sgJHNlbGVjdC5iYXNlVGl0bGUgfX1cIiBhcmlhLWFjdGl2ZWRlc2NlbmRhbnQ9XCJ1aS1zZWxlY3QtY2hvaWNlcy1yb3cte3sgJHNlbGVjdC5nZW5lcmF0ZWRJZCB9fS17eyAkc2VsZWN0LmFjdGl2ZUluZGV4IH19XCIgY2xhc3M9XCJzZWxlY3QyLWlucHV0IHVpLXNlbGVjdC1zZWFyY2hcIiBwbGFjZWhvbGRlcj1cInt7JHNlbGVjdE11bHRpcGxlLmdldFBsYWNlaG9sZGVyKCl9fVwiIG5nLWRpc2FibGVkPVwiJHNlbGVjdC5kaXNhYmxlZFwiIG5nLWhpZGU9XCIkc2VsZWN0LmRpc2FibGVkXCIgbmctbW9kZWw9XCIkc2VsZWN0LnNlYXJjaFwiIG5nLWNsaWNrPVwiJHNlbGVjdC5hY3RpdmF0ZSgpXCIgc3R5bGU9XCJ3aWR0aDogMzRweDtcIiBvbmRyb3A9XCJyZXR1cm4gZmFsc2U7XCI+PC9saT48L3VsPjxkaXYgY2xhc3M9XCJ1aS1zZWxlY3QtZHJvcGRvd24gc2VsZWN0Mi1kcm9wIHNlbGVjdDItd2l0aC1zZWFyY2hib3ggc2VsZWN0Mi1kcm9wLWFjdGl2ZVwiIG5nLWNsYXNzPVwie1xcJ3NlbGVjdDItZGlzcGxheS1ub25lXFwnOiAhJHNlbGVjdC5vcGVufVwiPjxkaXYgY2xhc3M9XCJ1aS1zZWxlY3QtY2hvaWNlc1wiPjwvZGl2PjwvZGl2PjwvZGl2PicpLGUucHV0KFwic2VsZWN0Mi9zZWxlY3QudHBsLmh0bWxcIiwnPGRpdiBjbGFzcz1cInVpLXNlbGVjdC1jb250YWluZXIgc2VsZWN0MiBzZWxlY3QyLWNvbnRhaW5lclwiIG5nLWNsYXNzPVwie1xcJ3NlbGVjdDItY29udGFpbmVyLWFjdGl2ZSBzZWxlY3QyLWRyb3Bkb3duLW9wZW4gb3BlblxcJzogJHNlbGVjdC5vcGVuLCBcXCdzZWxlY3QyLWNvbnRhaW5lci1kaXNhYmxlZFxcJzogJHNlbGVjdC5kaXNhYmxlZCwgXFwnc2VsZWN0Mi1jb250YWluZXItYWN0aXZlXFwnOiAkc2VsZWN0LmZvY3VzLCBcXCdzZWxlY3QyLWFsbG93Y2xlYXJcXCc6ICRzZWxlY3QuYWxsb3dDbGVhciAmJiAhJHNlbGVjdC5pc0VtcHR5KCl9XCI+PGRpdiBjbGFzcz1cInVpLXNlbGVjdC1tYXRjaFwiPjwvZGl2PjxkaXYgY2xhc3M9XCJ1aS1zZWxlY3QtZHJvcGRvd24gc2VsZWN0Mi1kcm9wIHNlbGVjdDItd2l0aC1zZWFyY2hib3ggc2VsZWN0Mi1kcm9wLWFjdGl2ZVwiIG5nLWNsYXNzPVwie1xcJ3NlbGVjdDItZGlzcGxheS1ub25lXFwnOiAhJHNlbGVjdC5vcGVufVwiPjxkaXYgY2xhc3M9XCJzZWxlY3QyLXNlYXJjaFwiIG5nLXNob3c9XCIkc2VsZWN0LnNlYXJjaEVuYWJsZWRcIj48aW5wdXQgdHlwZT1cInRleHRcIiBhdXRvY29tcGxldGU9XCJmYWxzZVwiIGF1dG9jb3JyZWN0PVwiZmFsc2VcIiBhdXRvY2FwaXRhbGl6ZT1cIm9mZlwiIHNwZWxsY2hlY2s9XCJmYWxzZVwiIHJvbGU9XCJjb21ib2JveFwiIGFyaWEtZXhwYW5kZWQ9XCJ0cnVlXCIgYXJpYS1vd25zPVwidWktc2VsZWN0LWNob2ljZXMte3sgJHNlbGVjdC5nZW5lcmF0ZWRJZCB9fVwiIGFyaWEtbGFiZWw9XCJ7eyAkc2VsZWN0LmJhc2VUaXRsZSB9fVwiIGFyaWEtYWN0aXZlZGVzY2VuZGFudD1cInVpLXNlbGVjdC1jaG9pY2VzLXJvdy17eyAkc2VsZWN0LmdlbmVyYXRlZElkIH19LXt7ICRzZWxlY3QuYWN0aXZlSW5kZXggfX1cIiBjbGFzcz1cInVpLXNlbGVjdC1zZWFyY2ggc2VsZWN0Mi1pbnB1dFwiIG5nLW1vZGVsPVwiJHNlbGVjdC5zZWFyY2hcIj48L2Rpdj48ZGl2IGNsYXNzPVwidWktc2VsZWN0LWNob2ljZXNcIj48L2Rpdj48L2Rpdj48L2Rpdj4nKSxlLnB1dChcInNlbGVjdGl6ZS9jaG9pY2VzLnRwbC5odG1sXCIsJzxkaXYgbmctc2hvdz1cIiRzZWxlY3Qub3BlblwiIGNsYXNzPVwidWktc2VsZWN0LWNob2ljZXMgdWktc2VsZWN0LWRyb3Bkb3duIHNlbGVjdGl6ZS1kcm9wZG93biBzaW5nbGVcIj48ZGl2IGNsYXNzPVwidWktc2VsZWN0LWNob2ljZXMtY29udGVudCBzZWxlY3RpemUtZHJvcGRvd24tY29udGVudFwiPjxkaXYgY2xhc3M9XCJ1aS1zZWxlY3QtY2hvaWNlcy1ncm91cCBvcHRncm91cFwiIHJvbGU9XCJsaXN0Ym94XCI+PGRpdiBuZy1zaG93PVwiJHNlbGVjdC5pc0dyb3VwZWRcIiBjbGFzcz1cInVpLXNlbGVjdC1jaG9pY2VzLWdyb3VwLWxhYmVsIG9wdGdyb3VwLWhlYWRlclwiIG5nLWJpbmQ9XCIkZ3JvdXAubmFtZVwiPjwvZGl2PjxkaXYgcm9sZT1cIm9wdGlvblwiIGNsYXNzPVwidWktc2VsZWN0LWNob2ljZXMtcm93XCIgbmctY2xhc3M9XCJ7YWN0aXZlOiAkc2VsZWN0LmlzQWN0aXZlKHRoaXMpLCBkaXNhYmxlZDogJHNlbGVjdC5pc0Rpc2FibGVkKHRoaXMpfVwiPjxkaXYgY2xhc3M9XCJvcHRpb24gdWktc2VsZWN0LWNob2ljZXMtcm93LWlubmVyXCIgZGF0YS1zZWxlY3RhYmxlPVwiXCI+PC9kaXY+PC9kaXY+PC9kaXY+PC9kaXY+PC9kaXY+JyksZS5wdXQoXCJzZWxlY3RpemUvbWF0Y2gudHBsLmh0bWxcIiwnPGRpdiBuZy1oaWRlPVwiKCRzZWxlY3Qub3BlbiB8fCAkc2VsZWN0LmlzRW1wdHkoKSlcIiBjbGFzcz1cInVpLXNlbGVjdC1tYXRjaFwiIG5nLXRyYW5zY2x1ZGU9XCJcIj48L2Rpdj4nKSxlLnB1dChcInNlbGVjdGl6ZS9zZWxlY3QudHBsLmh0bWxcIiwnPGRpdiBjbGFzcz1cInVpLXNlbGVjdC1jb250YWluZXIgc2VsZWN0aXplLWNvbnRyb2wgc2luZ2xlXCIgbmctY2xhc3M9XCJ7XFwnb3BlblxcJzogJHNlbGVjdC5vcGVufVwiPjxkaXYgY2xhc3M9XCJzZWxlY3RpemUtaW5wdXRcIiBuZy1jbGFzcz1cIntcXCdmb2N1c1xcJzogJHNlbGVjdC5vcGVuLCBcXCdkaXNhYmxlZFxcJzogJHNlbGVjdC5kaXNhYmxlZCwgXFwnc2VsZWN0aXplLWZvY3VzXFwnIDogJHNlbGVjdC5mb2N1c31cIiBuZy1jbGljaz1cIiRzZWxlY3QuYWN0aXZhdGUoKVwiPjxkaXYgY2xhc3M9XCJ1aS1zZWxlY3QtbWF0Y2hcIj48L2Rpdj48aW5wdXQgdHlwZT1cInRleHRcIiBhdXRvY29tcGxldGU9XCJmYWxzZVwiIHRhYmluZGV4PVwiLTFcIiBjbGFzcz1cInVpLXNlbGVjdC1zZWFyY2ggdWktc2VsZWN0LXRvZ2dsZVwiIG5nLWNsaWNrPVwiJHNlbGVjdC50b2dnbGUoJGV2ZW50KVwiIHBsYWNlaG9sZGVyPVwie3skc2VsZWN0LnBsYWNlaG9sZGVyfX1cIiBuZy1tb2RlbD1cIiRzZWxlY3Quc2VhcmNoXCIgbmctaGlkZT1cIiEkc2VsZWN0LnNlYXJjaEVuYWJsZWQgfHwgKCRzZWxlY3Quc2VsZWN0ZWQgJiYgISRzZWxlY3Qub3BlbilcIiBuZy1kaXNhYmxlZD1cIiRzZWxlY3QuZGlzYWJsZWRcIiBhcmlhLWxhYmVsPVwie3sgJHNlbGVjdC5iYXNlVGl0bGUgfX1cIj48L2Rpdj48ZGl2IGNsYXNzPVwidWktc2VsZWN0LWNob2ljZXNcIj48L2Rpdj48L2Rpdj4nKVxufV0pO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L3VpLXNlbGVjdC9kaXN0L3NlbGVjdC5taW4uanNcbiAqKiBtb2R1bGUgaWQgPSA0NlxuICoqIG1vZHVsZSBjaHVua3MgPSAyNFxuICoqLyJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");

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

	eval("// style-loader: Adds some css to the DOM by adding a <style> tag\n\n// load the styles\nvar content = __webpack_require__(48);\nif(typeof content === 'string') content = [[module.id, content, '']];\n// add the styles to the DOM\nvar update = __webpack_require__(50)(content, {});\nif(content.locals) module.exports = content.locals;\n// Hot Module Replacement\nif(false) {\n\t// When the styles change, update the <style> tags\n\tif(!content.locals) {\n\t\tmodule.hot.accept(\"!!./../../css-loader/index.js?-url!./select.min.css\", function() {\n\t\t\tvar newContent = require(\"!!./../../css-loader/index.js?-url!./select.min.css\");\n\t\t\tif(typeof newContent === 'string') newContent = [[module.id, newContent, '']];\n\t\t\tupdate(newContent);\n\t\t});\n\t}\n\t// When the module is disposed, remove the <style> tags\n\tmodule.hot.dispose(function() { update(); });\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDcuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9+L3VpLXNlbGVjdC9kaXN0L3NlbGVjdC5taW4uY3NzPzEwY2IiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gc3R5bGUtbG9hZGVyOiBBZGRzIHNvbWUgY3NzIHRvIHRoZSBET00gYnkgYWRkaW5nIGEgPHN0eWxlPiB0YWdcblxuLy8gbG9hZCB0aGUgc3R5bGVzXG52YXIgY29udGVudCA9IHJlcXVpcmUoXCIhIS4vLi4vLi4vY3NzLWxvYWRlci9pbmRleC5qcz8tdXJsIS4vc2VsZWN0Lm1pbi5jc3NcIik7XG5pZih0eXBlb2YgY29udGVudCA9PT0gJ3N0cmluZycpIGNvbnRlbnQgPSBbW21vZHVsZS5pZCwgY29udGVudCwgJyddXTtcbi8vIGFkZCB0aGUgc3R5bGVzIHRvIHRoZSBET01cbnZhciB1cGRhdGUgPSByZXF1aXJlKFwiIS4vLi4vLi4vc3R5bGUtbG9hZGVyL2FkZFN0eWxlcy5qc1wiKShjb250ZW50LCB7fSk7XG5pZihjb250ZW50LmxvY2FscykgbW9kdWxlLmV4cG9ydHMgPSBjb250ZW50LmxvY2Fscztcbi8vIEhvdCBNb2R1bGUgUmVwbGFjZW1lbnRcbmlmKG1vZHVsZS5ob3QpIHtcblx0Ly8gV2hlbiB0aGUgc3R5bGVzIGNoYW5nZSwgdXBkYXRlIHRoZSA8c3R5bGU+IHRhZ3Ncblx0aWYoIWNvbnRlbnQubG9jYWxzKSB7XG5cdFx0bW9kdWxlLmhvdC5hY2NlcHQoXCIhIS4vLi4vLi4vY3NzLWxvYWRlci9pbmRleC5qcz8tdXJsIS4vc2VsZWN0Lm1pbi5jc3NcIiwgZnVuY3Rpb24oKSB7XG5cdFx0XHR2YXIgbmV3Q29udGVudCA9IHJlcXVpcmUoXCIhIS4vLi4vLi4vY3NzLWxvYWRlci9pbmRleC5qcz8tdXJsIS4vc2VsZWN0Lm1pbi5jc3NcIik7XG5cdFx0XHRpZih0eXBlb2YgbmV3Q29udGVudCA9PT0gJ3N0cmluZycpIG5ld0NvbnRlbnQgPSBbW21vZHVsZS5pZCwgbmV3Q29udGVudCwgJyddXTtcblx0XHRcdHVwZGF0ZShuZXdDb250ZW50KTtcblx0XHR9KTtcblx0fVxuXHQvLyBXaGVuIHRoZSBtb2R1bGUgaXMgZGlzcG9zZWQsIHJlbW92ZSB0aGUgPHN0eWxlPiB0YWdzXG5cdG1vZHVsZS5ob3QuZGlzcG9zZShmdW5jdGlvbigpIHsgdXBkYXRlKCk7IH0pO1xufVxuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L3VpLXNlbGVjdC9kaXN0L3NlbGVjdC5taW4uY3NzXG4gKiogbW9kdWxlIGlkID0gNDdcbiAqKiBtb2R1bGUgY2h1bmtzID0gMjRcbiAqKi8iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");

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

	eval("exports = module.exports = __webpack_require__(49)();\n// imports\n\n\n// module\nexports.push([module.id, \"/*!\\n * ui-select\\n * http://github.com/angular-ui/ui-select\\n * Version: 0.14.1 - 2016-01-27T22:27:00.588Z\\n * License: MIT\\n */.ui-select-highlight{font-weight:700}.ui-select-offscreen{clip:rect(0 0 0 0)!important;width:1px!important;height:1px!important;border:0!important;margin:0!important;padding:0!important;overflow:hidden!important;position:absolute!important;outline:0!important;left:0!important;top:0!important}.ui-select-choices-row:hover{background-color:#f5f5f5}.ng-dirty.ng-invalid>a.select2-choice{border-color:#D44950}.select2-result-single{padding-left:0}.select-locked>.ui-select-match-close,.select2-locked>.select2-search-choice-close{display:none}body>.select2-container.open{z-index:9999}.ui-select-container[theme=select2].direction-up .ui-select-match{border-radius:0 0 4px 4px}.ui-select-container[theme=select2].direction-up .ui-select-dropdown{border-radius:4px 4px 0 0;border-top-width:1px;border-top-style:solid;box-shadow:0 -4px 8px rgba(0,0,0,.25);margin-top:-4px}.ui-select-container[theme=select2].direction-up .ui-select-dropdown .select2-search{margin-top:4px}.ui-select-container[theme=select2].direction-up.select2-dropdown-open .ui-select-match{border-bottom-color:#5897fb}.selectize-input.selectize-focus{border-color:#007FBB!important}.selectize-control>.selectize-dropdown,.selectize-control>.selectize-input>input{width:100%}.ng-dirty.ng-invalid>div.selectize-input{border-color:#D44950}.ui-select-container[theme=selectize].direction-up .ui-select-dropdown{box-shadow:0 -4px 8px rgba(0,0,0,.25);margin-top:-2px}.btn-default-focus{color:#333;background-color:#EBEBEB;border-color:#ADADAD;text-decoration:none;outline:-webkit-focus-ring-color auto 5px;outline-offset:-2px;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6)}.ui-select-bootstrap .ui-select-toggle{position:relative}.ui-select-bootstrap .ui-select-toggle>.caret{position:absolute;height:10px;top:50%;right:10px;margin-top:-2px}.input-group>.ui-select-bootstrap.dropdown{position:static}.input-group>.ui-select-bootstrap>input.ui-select-search.form-control{border-radius:4px 0 0 4px}.input-group>.ui-select-bootstrap>input.ui-select-search.form-control.direction-up{border-radius:4px 0 0 4px!important}.ui-select-bootstrap>.ui-select-match>.btn{text-align:left!important}.ui-select-bootstrap>.ui-select-match>.caret{position:absolute;top:45%;right:15px}.ui-select-bootstrap>.ui-select-choices{width:100%;height:auto;max-height:200px;overflow-x:hidden;margin-top:-1px}body>.ui-select-bootstrap.open{z-index:1000}.ui-select-multiple.ui-select-bootstrap{height:auto;padding:3px 3px 0}.ui-select-multiple.ui-select-bootstrap input.ui-select-search{background-color:transparent!important;border:none;outline:0;height:1.666666em;margin-bottom:3px}.ui-select-multiple.ui-select-bootstrap .ui-select-match .close{font-size:1.6em;line-height:.75}.ui-select-multiple.ui-select-bootstrap .ui-select-match-item{outline:0;margin:0 3px 3px 0}.ui-select-multiple .ui-select-match-item{position:relative}.ui-select-multiple .ui-select-match-item.dropping-before:before{content:\\\"\\\";position:absolute;top:0;right:100%;height:100%;margin-right:2px;border-left:1px solid #428bca}.ui-select-multiple .ui-select-match-item.dropping-after:after{content:\\\"\\\";position:absolute;top:0;left:100%;height:100%;margin-left:2px;border-right:1px solid #428bca}.ui-select-bootstrap .ui-select-choices-row>a{display:block;padding:3px 20px;clear:both;font-weight:400;line-height:1.42857143;color:#333;white-space:nowrap}.ui-select-bootstrap .ui-select-choices-row>a:focus,.ui-select-bootstrap .ui-select-choices-row>a:hover{text-decoration:none;color:#262626;background-color:#f5f5f5}.ui-select-bootstrap .ui-select-choices-row.active>a{color:#fff;text-decoration:none;outline:0;background-color:#428bca}.ui-select-bootstrap .ui-select-choices-row.active.disabled>a,.ui-select-bootstrap .ui-select-choices-row.disabled>a{color:#777;cursor:not-allowed;background-color:#fff}.ui-select-match.ng-hide-add,.ui-select-search.ng-hide-add{display:none!important}.ui-select-bootstrap.ng-dirty.ng-invalid>button.btn.ui-select-match{border-color:#D44950}.ui-select-container[theme=bootstrap].direction-up .ui-select-dropdown{box-shadow:0 -4px 8px rgba(0,0,0,.25)}\", \"\"]);\n\n// exports\n\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDguanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9+L3VpLXNlbGVjdC9kaXN0L3NlbGVjdC5taW4uY3NzPzZjZmYiXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0cyA9IG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcIi4vLi4vLi4vY3NzLWxvYWRlci9saWIvY3NzLWJhc2UuanNcIikoKTtcbi8vIGltcG9ydHNcblxuXG4vLyBtb2R1bGVcbmV4cG9ydHMucHVzaChbbW9kdWxlLmlkLCBcIi8qIVxcbiAqIHVpLXNlbGVjdFxcbiAqIGh0dHA6Ly9naXRodWIuY29tL2FuZ3VsYXItdWkvdWktc2VsZWN0XFxuICogVmVyc2lvbjogMC4xNC4xIC0gMjAxNi0wMS0yN1QyMjoyNzowMC41ODhaXFxuICogTGljZW5zZTogTUlUXFxuICovLnVpLXNlbGVjdC1oaWdobGlnaHR7Zm9udC13ZWlnaHQ6NzAwfS51aS1zZWxlY3Qtb2Zmc2NyZWVue2NsaXA6cmVjdCgwIDAgMCAwKSFpbXBvcnRhbnQ7d2lkdGg6MXB4IWltcG9ydGFudDtoZWlnaHQ6MXB4IWltcG9ydGFudDtib3JkZXI6MCFpbXBvcnRhbnQ7bWFyZ2luOjAhaW1wb3J0YW50O3BhZGRpbmc6MCFpbXBvcnRhbnQ7b3ZlcmZsb3c6aGlkZGVuIWltcG9ydGFudDtwb3NpdGlvbjphYnNvbHV0ZSFpbXBvcnRhbnQ7b3V0bGluZTowIWltcG9ydGFudDtsZWZ0OjAhaW1wb3J0YW50O3RvcDowIWltcG9ydGFudH0udWktc2VsZWN0LWNob2ljZXMtcm93OmhvdmVye2JhY2tncm91bmQtY29sb3I6I2Y1ZjVmNX0ubmctZGlydHkubmctaW52YWxpZD5hLnNlbGVjdDItY2hvaWNle2JvcmRlci1jb2xvcjojRDQ0OTUwfS5zZWxlY3QyLXJlc3VsdC1zaW5nbGV7cGFkZGluZy1sZWZ0OjB9LnNlbGVjdC1sb2NrZWQ+LnVpLXNlbGVjdC1tYXRjaC1jbG9zZSwuc2VsZWN0Mi1sb2NrZWQ+LnNlbGVjdDItc2VhcmNoLWNob2ljZS1jbG9zZXtkaXNwbGF5Om5vbmV9Ym9keT4uc2VsZWN0Mi1jb250YWluZXIub3Blbnt6LWluZGV4Ojk5OTl9LnVpLXNlbGVjdC1jb250YWluZXJbdGhlbWU9c2VsZWN0Ml0uZGlyZWN0aW9uLXVwIC51aS1zZWxlY3QtbWF0Y2h7Ym9yZGVyLXJhZGl1czowIDAgNHB4IDRweH0udWktc2VsZWN0LWNvbnRhaW5lclt0aGVtZT1zZWxlY3QyXS5kaXJlY3Rpb24tdXAgLnVpLXNlbGVjdC1kcm9wZG93bntib3JkZXItcmFkaXVzOjRweCA0cHggMCAwO2JvcmRlci10b3Atd2lkdGg6MXB4O2JvcmRlci10b3Atc3R5bGU6c29saWQ7Ym94LXNoYWRvdzowIC00cHggOHB4IHJnYmEoMCwwLDAsLjI1KTttYXJnaW4tdG9wOi00cHh9LnVpLXNlbGVjdC1jb250YWluZXJbdGhlbWU9c2VsZWN0Ml0uZGlyZWN0aW9uLXVwIC51aS1zZWxlY3QtZHJvcGRvd24gLnNlbGVjdDItc2VhcmNoe21hcmdpbi10b3A6NHB4fS51aS1zZWxlY3QtY29udGFpbmVyW3RoZW1lPXNlbGVjdDJdLmRpcmVjdGlvbi11cC5zZWxlY3QyLWRyb3Bkb3duLW9wZW4gLnVpLXNlbGVjdC1tYXRjaHtib3JkZXItYm90dG9tLWNvbG9yOiM1ODk3ZmJ9LnNlbGVjdGl6ZS1pbnB1dC5zZWxlY3RpemUtZm9jdXN7Ym9yZGVyLWNvbG9yOiMwMDdGQkIhaW1wb3J0YW50fS5zZWxlY3RpemUtY29udHJvbD4uc2VsZWN0aXplLWRyb3Bkb3duLC5zZWxlY3RpemUtY29udHJvbD4uc2VsZWN0aXplLWlucHV0PmlucHV0e3dpZHRoOjEwMCV9Lm5nLWRpcnR5Lm5nLWludmFsaWQ+ZGl2LnNlbGVjdGl6ZS1pbnB1dHtib3JkZXItY29sb3I6I0Q0NDk1MH0udWktc2VsZWN0LWNvbnRhaW5lclt0aGVtZT1zZWxlY3RpemVdLmRpcmVjdGlvbi11cCAudWktc2VsZWN0LWRyb3Bkb3due2JveC1zaGFkb3c6MCAtNHB4IDhweCByZ2JhKDAsMCwwLC4yNSk7bWFyZ2luLXRvcDotMnB4fS5idG4tZGVmYXVsdC1mb2N1c3tjb2xvcjojMzMzO2JhY2tncm91bmQtY29sb3I6I0VCRUJFQjtib3JkZXItY29sb3I6I0FEQURBRDt0ZXh0LWRlY29yYXRpb246bm9uZTtvdXRsaW5lOi13ZWJraXQtZm9jdXMtcmluZy1jb2xvciBhdXRvIDVweDtvdXRsaW5lLW9mZnNldDotMnB4O2JveC1zaGFkb3c6aW5zZXQgMCAxcHggMXB4IHJnYmEoMCwwLDAsLjA3NSksMCAwIDhweCByZ2JhKDEwMiwxNzUsMjMzLC42KX0udWktc2VsZWN0LWJvb3RzdHJhcCAudWktc2VsZWN0LXRvZ2dsZXtwb3NpdGlvbjpyZWxhdGl2ZX0udWktc2VsZWN0LWJvb3RzdHJhcCAudWktc2VsZWN0LXRvZ2dsZT4uY2FyZXR7cG9zaXRpb246YWJzb2x1dGU7aGVpZ2h0OjEwcHg7dG9wOjUwJTtyaWdodDoxMHB4O21hcmdpbi10b3A6LTJweH0uaW5wdXQtZ3JvdXA+LnVpLXNlbGVjdC1ib290c3RyYXAuZHJvcGRvd257cG9zaXRpb246c3RhdGljfS5pbnB1dC1ncm91cD4udWktc2VsZWN0LWJvb3RzdHJhcD5pbnB1dC51aS1zZWxlY3Qtc2VhcmNoLmZvcm0tY29udHJvbHtib3JkZXItcmFkaXVzOjRweCAwIDAgNHB4fS5pbnB1dC1ncm91cD4udWktc2VsZWN0LWJvb3RzdHJhcD5pbnB1dC51aS1zZWxlY3Qtc2VhcmNoLmZvcm0tY29udHJvbC5kaXJlY3Rpb24tdXB7Ym9yZGVyLXJhZGl1czo0cHggMCAwIDRweCFpbXBvcnRhbnR9LnVpLXNlbGVjdC1ib290c3RyYXA+LnVpLXNlbGVjdC1tYXRjaD4uYnRue3RleHQtYWxpZ246bGVmdCFpbXBvcnRhbnR9LnVpLXNlbGVjdC1ib290c3RyYXA+LnVpLXNlbGVjdC1tYXRjaD4uY2FyZXR7cG9zaXRpb246YWJzb2x1dGU7dG9wOjQ1JTtyaWdodDoxNXB4fS51aS1zZWxlY3QtYm9vdHN0cmFwPi51aS1zZWxlY3QtY2hvaWNlc3t3aWR0aDoxMDAlO2hlaWdodDphdXRvO21heC1oZWlnaHQ6MjAwcHg7b3ZlcmZsb3cteDpoaWRkZW47bWFyZ2luLXRvcDotMXB4fWJvZHk+LnVpLXNlbGVjdC1ib290c3RyYXAub3Blbnt6LWluZGV4OjEwMDB9LnVpLXNlbGVjdC1tdWx0aXBsZS51aS1zZWxlY3QtYm9vdHN0cmFwe2hlaWdodDphdXRvO3BhZGRpbmc6M3B4IDNweCAwfS51aS1zZWxlY3QtbXVsdGlwbGUudWktc2VsZWN0LWJvb3RzdHJhcCBpbnB1dC51aS1zZWxlY3Qtc2VhcmNoe2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnQhaW1wb3J0YW50O2JvcmRlcjpub25lO291dGxpbmU6MDtoZWlnaHQ6MS42NjY2NjZlbTttYXJnaW4tYm90dG9tOjNweH0udWktc2VsZWN0LW11bHRpcGxlLnVpLXNlbGVjdC1ib290c3RyYXAgLnVpLXNlbGVjdC1tYXRjaCAuY2xvc2V7Zm9udC1zaXplOjEuNmVtO2xpbmUtaGVpZ2h0Oi43NX0udWktc2VsZWN0LW11bHRpcGxlLnVpLXNlbGVjdC1ib290c3RyYXAgLnVpLXNlbGVjdC1tYXRjaC1pdGVte291dGxpbmU6MDttYXJnaW46MCAzcHggM3B4IDB9LnVpLXNlbGVjdC1tdWx0aXBsZSAudWktc2VsZWN0LW1hdGNoLWl0ZW17cG9zaXRpb246cmVsYXRpdmV9LnVpLXNlbGVjdC1tdWx0aXBsZSAudWktc2VsZWN0LW1hdGNoLWl0ZW0uZHJvcHBpbmctYmVmb3JlOmJlZm9yZXtjb250ZW50OlxcXCJcXFwiO3Bvc2l0aW9uOmFic29sdXRlO3RvcDowO3JpZ2h0OjEwMCU7aGVpZ2h0OjEwMCU7bWFyZ2luLXJpZ2h0OjJweDtib3JkZXItbGVmdDoxcHggc29saWQgIzQyOGJjYX0udWktc2VsZWN0LW11bHRpcGxlIC51aS1zZWxlY3QtbWF0Y2gtaXRlbS5kcm9wcGluZy1hZnRlcjphZnRlcntjb250ZW50OlxcXCJcXFwiO3Bvc2l0aW9uOmFic29sdXRlO3RvcDowO2xlZnQ6MTAwJTtoZWlnaHQ6MTAwJTttYXJnaW4tbGVmdDoycHg7Ym9yZGVyLXJpZ2h0OjFweCBzb2xpZCAjNDI4YmNhfS51aS1zZWxlY3QtYm9vdHN0cmFwIC51aS1zZWxlY3QtY2hvaWNlcy1yb3c+YXtkaXNwbGF5OmJsb2NrO3BhZGRpbmc6M3B4IDIwcHg7Y2xlYXI6Ym90aDtmb250LXdlaWdodDo0MDA7bGluZS1oZWlnaHQ6MS40Mjg1NzE0Mztjb2xvcjojMzMzO3doaXRlLXNwYWNlOm5vd3JhcH0udWktc2VsZWN0LWJvb3RzdHJhcCAudWktc2VsZWN0LWNob2ljZXMtcm93PmE6Zm9jdXMsLnVpLXNlbGVjdC1ib290c3RyYXAgLnVpLXNlbGVjdC1jaG9pY2VzLXJvdz5hOmhvdmVye3RleHQtZGVjb3JhdGlvbjpub25lO2NvbG9yOiMyNjI2MjY7YmFja2dyb3VuZC1jb2xvcjojZjVmNWY1fS51aS1zZWxlY3QtYm9vdHN0cmFwIC51aS1zZWxlY3QtY2hvaWNlcy1yb3cuYWN0aXZlPmF7Y29sb3I6I2ZmZjt0ZXh0LWRlY29yYXRpb246bm9uZTtvdXRsaW5lOjA7YmFja2dyb3VuZC1jb2xvcjojNDI4YmNhfS51aS1zZWxlY3QtYm9vdHN0cmFwIC51aS1zZWxlY3QtY2hvaWNlcy1yb3cuYWN0aXZlLmRpc2FibGVkPmEsLnVpLXNlbGVjdC1ib290c3RyYXAgLnVpLXNlbGVjdC1jaG9pY2VzLXJvdy5kaXNhYmxlZD5he2NvbG9yOiM3Nzc7Y3Vyc29yOm5vdC1hbGxvd2VkO2JhY2tncm91bmQtY29sb3I6I2ZmZn0udWktc2VsZWN0LW1hdGNoLm5nLWhpZGUtYWRkLC51aS1zZWxlY3Qtc2VhcmNoLm5nLWhpZGUtYWRke2Rpc3BsYXk6bm9uZSFpbXBvcnRhbnR9LnVpLXNlbGVjdC1ib290c3RyYXAubmctZGlydHkubmctaW52YWxpZD5idXR0b24uYnRuLnVpLXNlbGVjdC1tYXRjaHtib3JkZXItY29sb3I6I0Q0NDk1MH0udWktc2VsZWN0LWNvbnRhaW5lclt0aGVtZT1ib290c3RyYXBdLmRpcmVjdGlvbi11cCAudWktc2VsZWN0LWRyb3Bkb3due2JveC1zaGFkb3c6MCAtNHB4IDhweCByZ2JhKDAsMCwwLC4yNSl9XCIsIFwiXCJdKTtcblxuLy8gZXhwb3J0c1xuXG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vY3NzLWxvYWRlcj8tdXJsIS4vfi91aS1zZWxlY3QvZGlzdC9zZWxlY3QubWluLmNzc1xuICoqIG1vZHVsZSBpZCA9IDQ4XG4gKiogbW9kdWxlIGNodW5rcyA9IDI0XG4gKiovIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==");

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

	eval("/*\r\n\tMIT License http://www.opensource.org/licenses/mit-license.php\r\n\tAuthor Tobias Koppers @sokra\r\n*/\r\n// css base code, injected by the css-loader\r\nmodule.exports = function() {\r\n\tvar list = [];\r\n\r\n\t// return the list of modules as css string\r\n\tlist.toString = function toString() {\r\n\t\tvar result = [];\r\n\t\tfor(var i = 0; i < this.length; i++) {\r\n\t\t\tvar item = this[i];\r\n\t\t\tif(item[2]) {\r\n\t\t\t\tresult.push(\"@media \" + item[2] + \"{\" + item[1] + \"}\");\r\n\t\t\t} else {\r\n\t\t\t\tresult.push(item[1]);\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn result.join(\"\");\r\n\t};\r\n\r\n\t// import a list of modules into the list\r\n\tlist.i = function(modules, mediaQuery) {\r\n\t\tif(typeof modules === \"string\")\r\n\t\t\tmodules = [[null, modules, \"\"]];\r\n\t\tvar alreadyImportedModules = {};\r\n\t\tfor(var i = 0; i < this.length; i++) {\r\n\t\t\tvar id = this[i][0];\r\n\t\t\tif(typeof id === \"number\")\r\n\t\t\t\talreadyImportedModules[id] = true;\r\n\t\t}\r\n\t\tfor(i = 0; i < modules.length; i++) {\r\n\t\t\tvar item = modules[i];\r\n\t\t\t// skip already imported module\r\n\t\t\t// this implementation is not 100% perfect for weird media query combinations\r\n\t\t\t//  when a module is imported multiple times with different media queries.\r\n\t\t\t//  I hope this will never occur (Hey this way we have smaller bundles)\r\n\t\t\tif(typeof item[0] !== \"number\" || !alreadyImportedModules[item[0]]) {\r\n\t\t\t\tif(mediaQuery && !item[2]) {\r\n\t\t\t\t\titem[2] = mediaQuery;\r\n\t\t\t\t} else if(mediaQuery) {\r\n\t\t\t\t\titem[2] = \"(\" + item[2] + \") and (\" + mediaQuery + \")\";\r\n\t\t\t\t}\r\n\t\t\t\tlist.push(item);\r\n\t\t\t}\r\n\t\t}\r\n\t};\r\n\treturn list;\r\n};\r\n\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDkuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9+L2Nzcy1sb2FkZXIvbGliL2Nzcy1iYXNlLmpzP2RhMDQiXSwic291cmNlc0NvbnRlbnQiOlsiLypcclxuXHRNSVQgTGljZW5zZSBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL21pdC1saWNlbnNlLnBocFxyXG5cdEF1dGhvciBUb2JpYXMgS29wcGVycyBAc29rcmFcclxuKi9cclxuLy8gY3NzIGJhc2UgY29kZSwgaW5qZWN0ZWQgYnkgdGhlIGNzcy1sb2FkZXJcclxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbigpIHtcclxuXHR2YXIgbGlzdCA9IFtdO1xyXG5cclxuXHQvLyByZXR1cm4gdGhlIGxpc3Qgb2YgbW9kdWxlcyBhcyBjc3Mgc3RyaW5nXHJcblx0bGlzdC50b1N0cmluZyA9IGZ1bmN0aW9uIHRvU3RyaW5nKCkge1xyXG5cdFx0dmFyIHJlc3VsdCA9IFtdO1xyXG5cdFx0Zm9yKHZhciBpID0gMDsgaSA8IHRoaXMubGVuZ3RoOyBpKyspIHtcclxuXHRcdFx0dmFyIGl0ZW0gPSB0aGlzW2ldO1xyXG5cdFx0XHRpZihpdGVtWzJdKSB7XHJcblx0XHRcdFx0cmVzdWx0LnB1c2goXCJAbWVkaWEgXCIgKyBpdGVtWzJdICsgXCJ7XCIgKyBpdGVtWzFdICsgXCJ9XCIpO1xyXG5cdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdHJlc3VsdC5wdXNoKGl0ZW1bMV0pO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0XHRyZXR1cm4gcmVzdWx0LmpvaW4oXCJcIik7XHJcblx0fTtcclxuXHJcblx0Ly8gaW1wb3J0IGEgbGlzdCBvZiBtb2R1bGVzIGludG8gdGhlIGxpc3RcclxuXHRsaXN0LmkgPSBmdW5jdGlvbihtb2R1bGVzLCBtZWRpYVF1ZXJ5KSB7XHJcblx0XHRpZih0eXBlb2YgbW9kdWxlcyA9PT0gXCJzdHJpbmdcIilcclxuXHRcdFx0bW9kdWxlcyA9IFtbbnVsbCwgbW9kdWxlcywgXCJcIl1dO1xyXG5cdFx0dmFyIGFscmVhZHlJbXBvcnRlZE1vZHVsZXMgPSB7fTtcclxuXHRcdGZvcih2YXIgaSA9IDA7IGkgPCB0aGlzLmxlbmd0aDsgaSsrKSB7XHJcblx0XHRcdHZhciBpZCA9IHRoaXNbaV1bMF07XHJcblx0XHRcdGlmKHR5cGVvZiBpZCA9PT0gXCJudW1iZXJcIilcclxuXHRcdFx0XHRhbHJlYWR5SW1wb3J0ZWRNb2R1bGVzW2lkXSA9IHRydWU7XHJcblx0XHR9XHJcblx0XHRmb3IoaSA9IDA7IGkgPCBtb2R1bGVzLmxlbmd0aDsgaSsrKSB7XHJcblx0XHRcdHZhciBpdGVtID0gbW9kdWxlc1tpXTtcclxuXHRcdFx0Ly8gc2tpcCBhbHJlYWR5IGltcG9ydGVkIG1vZHVsZVxyXG5cdFx0XHQvLyB0aGlzIGltcGxlbWVudGF0aW9uIGlzIG5vdCAxMDAlIHBlcmZlY3QgZm9yIHdlaXJkIG1lZGlhIHF1ZXJ5IGNvbWJpbmF0aW9uc1xyXG5cdFx0XHQvLyAgd2hlbiBhIG1vZHVsZSBpcyBpbXBvcnRlZCBtdWx0aXBsZSB0aW1lcyB3aXRoIGRpZmZlcmVudCBtZWRpYSBxdWVyaWVzLlxyXG5cdFx0XHQvLyAgSSBob3BlIHRoaXMgd2lsbCBuZXZlciBvY2N1ciAoSGV5IHRoaXMgd2F5IHdlIGhhdmUgc21hbGxlciBidW5kbGVzKVxyXG5cdFx0XHRpZih0eXBlb2YgaXRlbVswXSAhPT0gXCJudW1iZXJcIiB8fCAhYWxyZWFkeUltcG9ydGVkTW9kdWxlc1tpdGVtWzBdXSkge1xyXG5cdFx0XHRcdGlmKG1lZGlhUXVlcnkgJiYgIWl0ZW1bMl0pIHtcclxuXHRcdFx0XHRcdGl0ZW1bMl0gPSBtZWRpYVF1ZXJ5O1xyXG5cdFx0XHRcdH0gZWxzZSBpZihtZWRpYVF1ZXJ5KSB7XHJcblx0XHRcdFx0XHRpdGVtWzJdID0gXCIoXCIgKyBpdGVtWzJdICsgXCIpIGFuZCAoXCIgKyBtZWRpYVF1ZXJ5ICsgXCIpXCI7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdGxpc3QucHVzaChpdGVtKTtcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cdH07XHJcblx0cmV0dXJuIGxpc3Q7XHJcbn07XHJcblxuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2Nzcy1sb2FkZXIvbGliL2Nzcy1iYXNlLmpzXG4gKiogbW9kdWxlIGlkID0gNDlcbiAqKiBtb2R1bGUgY2h1bmtzID0gMjRcbiAqKi8iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9");

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

	eval("/*\r\n\tMIT License http://www.opensource.org/licenses/mit-license.php\r\n\tAuthor Tobias Koppers @sokra\r\n*/\r\nvar stylesInDom = {},\r\n\tmemoize = function(fn) {\r\n\t\tvar memo;\r\n\t\treturn function () {\r\n\t\t\tif (typeof memo === \"undefined\") memo = fn.apply(this, arguments);\r\n\t\t\treturn memo;\r\n\t\t};\r\n\t},\r\n\tisOldIE = memoize(function() {\r\n\t\treturn /msie [6-9]\\b/.test(window.navigator.userAgent.toLowerCase());\r\n\t}),\r\n\tgetHeadElement = memoize(function () {\r\n\t\treturn document.head || document.getElementsByTagName(\"head\")[0];\r\n\t}),\r\n\tsingletonElement = null,\r\n\tsingletonCounter = 0,\r\n\tstyleElementsInsertedAtTop = [];\r\n\r\nmodule.exports = function(list, options) {\r\n\tif(false) {\r\n\t\tif(typeof document !== \"object\") throw new Error(\"The style-loader cannot be used in a non-browser environment\");\r\n\t}\r\n\r\n\toptions = options || {};\r\n\t// Force single-tag solution on IE6-9, which has a hard limit on the # of <style>\r\n\t// tags it will allow on a page\r\n\tif (typeof options.singleton === \"undefined\") options.singleton = isOldIE();\r\n\r\n\t// By default, add <style> tags to the bottom of <head>.\r\n\tif (typeof options.insertAt === \"undefined\") options.insertAt = \"bottom\";\r\n\r\n\tvar styles = listToStyles(list);\r\n\taddStylesToDom(styles, options);\r\n\r\n\treturn function update(newList) {\r\n\t\tvar mayRemove = [];\r\n\t\tfor(var i = 0; i < styles.length; i++) {\r\n\t\t\tvar item = styles[i];\r\n\t\t\tvar domStyle = stylesInDom[item.id];\r\n\t\t\tdomStyle.refs--;\r\n\t\t\tmayRemove.push(domStyle);\r\n\t\t}\r\n\t\tif(newList) {\r\n\t\t\tvar newStyles = listToStyles(newList);\r\n\t\t\taddStylesToDom(newStyles, options);\r\n\t\t}\r\n\t\tfor(var i = 0; i < mayRemove.length; i++) {\r\n\t\t\tvar domStyle = mayRemove[i];\r\n\t\t\tif(domStyle.refs === 0) {\r\n\t\t\t\tfor(var j = 0; j < domStyle.parts.length; j++)\r\n\t\t\t\t\tdomStyle.parts[j]();\r\n\t\t\t\tdelete stylesInDom[domStyle.id];\r\n\t\t\t}\r\n\t\t}\r\n\t};\r\n}\r\n\r\nfunction addStylesToDom(styles, options) {\r\n\tfor(var i = 0; i < styles.length; i++) {\r\n\t\tvar item = styles[i];\r\n\t\tvar domStyle = stylesInDom[item.id];\r\n\t\tif(domStyle) {\r\n\t\t\tdomStyle.refs++;\r\n\t\t\tfor(var j = 0; j < domStyle.parts.length; j++) {\r\n\t\t\t\tdomStyle.parts[j](item.parts[j]);\r\n\t\t\t}\r\n\t\t\tfor(; j < item.parts.length; j++) {\r\n\t\t\t\tdomStyle.parts.push(addStyle(item.parts[j], options));\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\tvar parts = [];\r\n\t\t\tfor(var j = 0; j < item.parts.length; j++) {\r\n\t\t\t\tparts.push(addStyle(item.parts[j], options));\r\n\t\t\t}\r\n\t\t\tstylesInDom[item.id] = {id: item.id, refs: 1, parts: parts};\r\n\t\t}\r\n\t}\r\n}\r\n\r\nfunction listToStyles(list) {\r\n\tvar styles = [];\r\n\tvar newStyles = {};\r\n\tfor(var i = 0; i < list.length; i++) {\r\n\t\tvar item = list[i];\r\n\t\tvar id = item[0];\r\n\t\tvar css = item[1];\r\n\t\tvar media = item[2];\r\n\t\tvar sourceMap = item[3];\r\n\t\tvar part = {css: css, media: media, sourceMap: sourceMap};\r\n\t\tif(!newStyles[id])\r\n\t\t\tstyles.push(newStyles[id] = {id: id, parts: [part]});\r\n\t\telse\r\n\t\t\tnewStyles[id].parts.push(part);\r\n\t}\r\n\treturn styles;\r\n}\r\n\r\nfunction insertStyleElement(options, styleElement) {\r\n\tvar head = getHeadElement();\r\n\tvar lastStyleElementInsertedAtTop = styleElementsInsertedAtTop[styleElementsInsertedAtTop.length - 1];\r\n\tif (options.insertAt === \"top\") {\r\n\t\tif(!lastStyleElementInsertedAtTop) {\r\n\t\t\thead.insertBefore(styleElement, head.firstChild);\r\n\t\t} else if(lastStyleElementInsertedAtTop.nextSibling) {\r\n\t\t\thead.insertBefore(styleElement, lastStyleElementInsertedAtTop.nextSibling);\r\n\t\t} else {\r\n\t\t\thead.appendChild(styleElement);\r\n\t\t}\r\n\t\tstyleElementsInsertedAtTop.push(styleElement);\r\n\t} else if (options.insertAt === \"bottom\") {\r\n\t\thead.appendChild(styleElement);\r\n\t} else {\r\n\t\tthrow new Error(\"Invalid value for parameter 'insertAt'. Must be 'top' or 'bottom'.\");\r\n\t}\r\n}\r\n\r\nfunction removeStyleElement(styleElement) {\r\n\tstyleElement.parentNode.removeChild(styleElement);\r\n\tvar idx = styleElementsInsertedAtTop.indexOf(styleElement);\r\n\tif(idx >= 0) {\r\n\t\tstyleElementsInsertedAtTop.splice(idx, 1);\r\n\t}\r\n}\r\n\r\nfunction createStyleElement(options) {\r\n\tvar styleElement = document.createElement(\"style\");\r\n\tstyleElement.type = \"text/css\";\r\n\tinsertStyleElement(options, styleElement);\r\n\treturn styleElement;\r\n}\r\n\r\nfunction createLinkElement(options) {\r\n\tvar linkElement = document.createElement(\"link\");\r\n\tlinkElement.rel = \"stylesheet\";\r\n\tinsertStyleElement(options, linkElement);\r\n\treturn linkElement;\r\n}\r\n\r\nfunction addStyle(obj, options) {\r\n\tvar styleElement, update, remove;\r\n\r\n\tif (options.singleton) {\r\n\t\tvar styleIndex = singletonCounter++;\r\n\t\tstyleElement = singletonElement || (singletonElement = createStyleElement(options));\r\n\t\tupdate = applyToSingletonTag.bind(null, styleElement, styleIndex, false);\r\n\t\tremove = applyToSingletonTag.bind(null, styleElement, styleIndex, true);\r\n\t} else if(obj.sourceMap &&\r\n\t\ttypeof URL === \"function\" &&\r\n\t\ttypeof URL.createObjectURL === \"function\" &&\r\n\t\ttypeof URL.revokeObjectURL === \"function\" &&\r\n\t\ttypeof Blob === \"function\" &&\r\n\t\ttypeof btoa === \"function\") {\r\n\t\tstyleElement = createLinkElement(options);\r\n\t\tupdate = updateLink.bind(null, styleElement);\r\n\t\tremove = function() {\r\n\t\t\tremoveStyleElement(styleElement);\r\n\t\t\tif(styleElement.href)\r\n\t\t\t\tURL.revokeObjectURL(styleElement.href);\r\n\t\t};\r\n\t} else {\r\n\t\tstyleElement = createStyleElement(options);\r\n\t\tupdate = applyToTag.bind(null, styleElement);\r\n\t\tremove = function() {\r\n\t\t\tremoveStyleElement(styleElement);\r\n\t\t};\r\n\t}\r\n\r\n\tupdate(obj);\r\n\r\n\treturn function updateStyle(newObj) {\r\n\t\tif(newObj) {\r\n\t\t\tif(newObj.css === obj.css && newObj.media === obj.media && newObj.sourceMap === obj.sourceMap)\r\n\t\t\t\treturn;\r\n\t\t\tupdate(obj = newObj);\r\n\t\t} else {\r\n\t\t\tremove();\r\n\t\t}\r\n\t};\r\n}\r\n\r\nvar replaceText = (function () {\r\n\tvar textStore = [];\r\n\r\n\treturn function (index, replacement) {\r\n\t\ttextStore[index] = replacement;\r\n\t\treturn textStore.filter(Boolean).join('\\n');\r\n\t};\r\n})();\r\n\r\nfunction applyToSingletonTag(styleElement, index, remove, obj) {\r\n\tvar css = remove ? \"\" : obj.css;\r\n\r\n\tif (styleElement.styleSheet) {\r\n\t\tstyleElement.styleSheet.cssText = replaceText(index, css);\r\n\t} else {\r\n\t\tvar cssNode = document.createTextNode(css);\r\n\t\tvar childNodes = styleElement.childNodes;\r\n\t\tif (childNodes[index]) styleElement.removeChild(childNodes[index]);\r\n\t\tif (childNodes.length) {\r\n\t\t\tstyleElement.insertBefore(cssNode, childNodes[index]);\r\n\t\t} else {\r\n\t\t\tstyleElement.appendChild(cssNode);\r\n\t\t}\r\n\t}\r\n}\r\n\r\nfunction applyToTag(styleElement, obj) {\r\n\tvar css = obj.css;\r\n\tvar media = obj.media;\r\n\r\n\tif(media) {\r\n\t\tstyleElement.setAttribute(\"media\", media)\r\n\t}\r\n\r\n\tif(styleElement.styleSheet) {\r\n\t\tstyleElement.styleSheet.cssText = css;\r\n\t} else {\r\n\t\twhile(styleElement.firstChild) {\r\n\t\t\tstyleElement.removeChild(styleElement.firstChild);\r\n\t\t}\r\n\t\tstyleElement.appendChild(document.createTextNode(css));\r\n\t}\r\n}\r\n\r\nfunction updateLink(linkElement, obj) {\r\n\tvar css = obj.css;\r\n\tvar sourceMap = obj.sourceMap;\r\n\r\n\tif(sourceMap) {\r\n\t\t// http://stackoverflow.com/a/26603875\r\n\t\tcss += \"\\n/*# sourceMappingURL=data:application/json;base64,\" + btoa(unescape(encodeURIComponent(JSON.stringify(sourceMap)))) + \" */\";\r\n\t}\r\n\r\n\tvar blob = new Blob([css], { type: \"text/css\" });\r\n\r\n\tvar oldSrc = linkElement.href;\r\n\r\n\tlinkElement.href = URL.createObjectURL(blob);\r\n\r\n\tif(oldSrc)\r\n\t\tURL.revokeObjectURL(oldSrc);\r\n}\r\n\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTAuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9+L3N0eWxlLWxvYWRlci9hZGRTdHlsZXMuanM/Yjk4MCJdLCJzb3VyY2VzQ29udGVudCI6WyIvKlxyXG5cdE1JVCBMaWNlbnNlIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbWl0LWxpY2Vuc2UucGhwXHJcblx0QXV0aG9yIFRvYmlhcyBLb3BwZXJzIEBzb2tyYVxyXG4qL1xyXG52YXIgc3R5bGVzSW5Eb20gPSB7fSxcclxuXHRtZW1vaXplID0gZnVuY3Rpb24oZm4pIHtcclxuXHRcdHZhciBtZW1vO1xyXG5cdFx0cmV0dXJuIGZ1bmN0aW9uICgpIHtcclxuXHRcdFx0aWYgKHR5cGVvZiBtZW1vID09PSBcInVuZGVmaW5lZFwiKSBtZW1vID0gZm4uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcclxuXHRcdFx0cmV0dXJuIG1lbW87XHJcblx0XHR9O1xyXG5cdH0sXHJcblx0aXNPbGRJRSA9IG1lbW9pemUoZnVuY3Rpb24oKSB7XHJcblx0XHRyZXR1cm4gL21zaWUgWzYtOV1cXGIvLnRlc3Qod2luZG93Lm5hdmlnYXRvci51c2VyQWdlbnQudG9Mb3dlckNhc2UoKSk7XHJcblx0fSksXHJcblx0Z2V0SGVhZEVsZW1lbnQgPSBtZW1vaXplKGZ1bmN0aW9uICgpIHtcclxuXHRcdHJldHVybiBkb2N1bWVudC5oZWFkIHx8IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKFwiaGVhZFwiKVswXTtcclxuXHR9KSxcclxuXHRzaW5nbGV0b25FbGVtZW50ID0gbnVsbCxcclxuXHRzaW5nbGV0b25Db3VudGVyID0gMCxcclxuXHRzdHlsZUVsZW1lbnRzSW5zZXJ0ZWRBdFRvcCA9IFtdO1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihsaXN0LCBvcHRpb25zKSB7XHJcblx0aWYodHlwZW9mIERFQlVHICE9PSBcInVuZGVmaW5lZFwiICYmIERFQlVHKSB7XHJcblx0XHRpZih0eXBlb2YgZG9jdW1lbnQgIT09IFwib2JqZWN0XCIpIHRocm93IG5ldyBFcnJvcihcIlRoZSBzdHlsZS1sb2FkZXIgY2Fubm90IGJlIHVzZWQgaW4gYSBub24tYnJvd3NlciBlbnZpcm9ubWVudFwiKTtcclxuXHR9XHJcblxyXG5cdG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xyXG5cdC8vIEZvcmNlIHNpbmdsZS10YWcgc29sdXRpb24gb24gSUU2LTksIHdoaWNoIGhhcyBhIGhhcmQgbGltaXQgb24gdGhlICMgb2YgPHN0eWxlPlxyXG5cdC8vIHRhZ3MgaXQgd2lsbCBhbGxvdyBvbiBhIHBhZ2VcclxuXHRpZiAodHlwZW9mIG9wdGlvbnMuc2luZ2xldG9uID09PSBcInVuZGVmaW5lZFwiKSBvcHRpb25zLnNpbmdsZXRvbiA9IGlzT2xkSUUoKTtcclxuXHJcblx0Ly8gQnkgZGVmYXVsdCwgYWRkIDxzdHlsZT4gdGFncyB0byB0aGUgYm90dG9tIG9mIDxoZWFkPi5cclxuXHRpZiAodHlwZW9mIG9wdGlvbnMuaW5zZXJ0QXQgPT09IFwidW5kZWZpbmVkXCIpIG9wdGlvbnMuaW5zZXJ0QXQgPSBcImJvdHRvbVwiO1xyXG5cclxuXHR2YXIgc3R5bGVzID0gbGlzdFRvU3R5bGVzKGxpc3QpO1xyXG5cdGFkZFN0eWxlc1RvRG9tKHN0eWxlcywgb3B0aW9ucyk7XHJcblxyXG5cdHJldHVybiBmdW5jdGlvbiB1cGRhdGUobmV3TGlzdCkge1xyXG5cdFx0dmFyIG1heVJlbW92ZSA9IFtdO1xyXG5cdFx0Zm9yKHZhciBpID0gMDsgaSA8IHN0eWxlcy5sZW5ndGg7IGkrKykge1xyXG5cdFx0XHR2YXIgaXRlbSA9IHN0eWxlc1tpXTtcclxuXHRcdFx0dmFyIGRvbVN0eWxlID0gc3R5bGVzSW5Eb21baXRlbS5pZF07XHJcblx0XHRcdGRvbVN0eWxlLnJlZnMtLTtcclxuXHRcdFx0bWF5UmVtb3ZlLnB1c2goZG9tU3R5bGUpO1xyXG5cdFx0fVxyXG5cdFx0aWYobmV3TGlzdCkge1xyXG5cdFx0XHR2YXIgbmV3U3R5bGVzID0gbGlzdFRvU3R5bGVzKG5ld0xpc3QpO1xyXG5cdFx0XHRhZGRTdHlsZXNUb0RvbShuZXdTdHlsZXMsIG9wdGlvbnMpO1xyXG5cdFx0fVxyXG5cdFx0Zm9yKHZhciBpID0gMDsgaSA8IG1heVJlbW92ZS5sZW5ndGg7IGkrKykge1xyXG5cdFx0XHR2YXIgZG9tU3R5bGUgPSBtYXlSZW1vdmVbaV07XHJcblx0XHRcdGlmKGRvbVN0eWxlLnJlZnMgPT09IDApIHtcclxuXHRcdFx0XHRmb3IodmFyIGogPSAwOyBqIDwgZG9tU3R5bGUucGFydHMubGVuZ3RoOyBqKyspXHJcblx0XHRcdFx0XHRkb21TdHlsZS5wYXJ0c1tqXSgpO1xyXG5cdFx0XHRcdGRlbGV0ZSBzdHlsZXNJbkRvbVtkb21TdHlsZS5pZF07XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHR9O1xyXG59XHJcblxyXG5mdW5jdGlvbiBhZGRTdHlsZXNUb0RvbShzdHlsZXMsIG9wdGlvbnMpIHtcclxuXHRmb3IodmFyIGkgPSAwOyBpIDwgc3R5bGVzLmxlbmd0aDsgaSsrKSB7XHJcblx0XHR2YXIgaXRlbSA9IHN0eWxlc1tpXTtcclxuXHRcdHZhciBkb21TdHlsZSA9IHN0eWxlc0luRG9tW2l0ZW0uaWRdO1xyXG5cdFx0aWYoZG9tU3R5bGUpIHtcclxuXHRcdFx0ZG9tU3R5bGUucmVmcysrO1xyXG5cdFx0XHRmb3IodmFyIGogPSAwOyBqIDwgZG9tU3R5bGUucGFydHMubGVuZ3RoOyBqKyspIHtcclxuXHRcdFx0XHRkb21TdHlsZS5wYXJ0c1tqXShpdGVtLnBhcnRzW2pdKTtcclxuXHRcdFx0fVxyXG5cdFx0XHRmb3IoOyBqIDwgaXRlbS5wYXJ0cy5sZW5ndGg7IGorKykge1xyXG5cdFx0XHRcdGRvbVN0eWxlLnBhcnRzLnB1c2goYWRkU3R5bGUoaXRlbS5wYXJ0c1tqXSwgb3B0aW9ucykpO1xyXG5cdFx0XHR9XHJcblx0XHR9IGVsc2Uge1xyXG5cdFx0XHR2YXIgcGFydHMgPSBbXTtcclxuXHRcdFx0Zm9yKHZhciBqID0gMDsgaiA8IGl0ZW0ucGFydHMubGVuZ3RoOyBqKyspIHtcclxuXHRcdFx0XHRwYXJ0cy5wdXNoKGFkZFN0eWxlKGl0ZW0ucGFydHNbal0sIG9wdGlvbnMpKTtcclxuXHRcdFx0fVxyXG5cdFx0XHRzdHlsZXNJbkRvbVtpdGVtLmlkXSA9IHtpZDogaXRlbS5pZCwgcmVmczogMSwgcGFydHM6IHBhcnRzfTtcclxuXHRcdH1cclxuXHR9XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGxpc3RUb1N0eWxlcyhsaXN0KSB7XHJcblx0dmFyIHN0eWxlcyA9IFtdO1xyXG5cdHZhciBuZXdTdHlsZXMgPSB7fTtcclxuXHRmb3IodmFyIGkgPSAwOyBpIDwgbGlzdC5sZW5ndGg7IGkrKykge1xyXG5cdFx0dmFyIGl0ZW0gPSBsaXN0W2ldO1xyXG5cdFx0dmFyIGlkID0gaXRlbVswXTtcclxuXHRcdHZhciBjc3MgPSBpdGVtWzFdO1xyXG5cdFx0dmFyIG1lZGlhID0gaXRlbVsyXTtcclxuXHRcdHZhciBzb3VyY2VNYXAgPSBpdGVtWzNdO1xyXG5cdFx0dmFyIHBhcnQgPSB7Y3NzOiBjc3MsIG1lZGlhOiBtZWRpYSwgc291cmNlTWFwOiBzb3VyY2VNYXB9O1xyXG5cdFx0aWYoIW5ld1N0eWxlc1tpZF0pXHJcblx0XHRcdHN0eWxlcy5wdXNoKG5ld1N0eWxlc1tpZF0gPSB7aWQ6IGlkLCBwYXJ0czogW3BhcnRdfSk7XHJcblx0XHRlbHNlXHJcblx0XHRcdG5ld1N0eWxlc1tpZF0ucGFydHMucHVzaChwYXJ0KTtcclxuXHR9XHJcblx0cmV0dXJuIHN0eWxlcztcclxufVxyXG5cclxuZnVuY3Rpb24gaW5zZXJ0U3R5bGVFbGVtZW50KG9wdGlvbnMsIHN0eWxlRWxlbWVudCkge1xyXG5cdHZhciBoZWFkID0gZ2V0SGVhZEVsZW1lbnQoKTtcclxuXHR2YXIgbGFzdFN0eWxlRWxlbWVudEluc2VydGVkQXRUb3AgPSBzdHlsZUVsZW1lbnRzSW5zZXJ0ZWRBdFRvcFtzdHlsZUVsZW1lbnRzSW5zZXJ0ZWRBdFRvcC5sZW5ndGggLSAxXTtcclxuXHRpZiAob3B0aW9ucy5pbnNlcnRBdCA9PT0gXCJ0b3BcIikge1xyXG5cdFx0aWYoIWxhc3RTdHlsZUVsZW1lbnRJbnNlcnRlZEF0VG9wKSB7XHJcblx0XHRcdGhlYWQuaW5zZXJ0QmVmb3JlKHN0eWxlRWxlbWVudCwgaGVhZC5maXJzdENoaWxkKTtcclxuXHRcdH0gZWxzZSBpZihsYXN0U3R5bGVFbGVtZW50SW5zZXJ0ZWRBdFRvcC5uZXh0U2libGluZykge1xyXG5cdFx0XHRoZWFkLmluc2VydEJlZm9yZShzdHlsZUVsZW1lbnQsIGxhc3RTdHlsZUVsZW1lbnRJbnNlcnRlZEF0VG9wLm5leHRTaWJsaW5nKTtcclxuXHRcdH0gZWxzZSB7XHJcblx0XHRcdGhlYWQuYXBwZW5kQ2hpbGQoc3R5bGVFbGVtZW50KTtcclxuXHRcdH1cclxuXHRcdHN0eWxlRWxlbWVudHNJbnNlcnRlZEF0VG9wLnB1c2goc3R5bGVFbGVtZW50KTtcclxuXHR9IGVsc2UgaWYgKG9wdGlvbnMuaW5zZXJ0QXQgPT09IFwiYm90dG9tXCIpIHtcclxuXHRcdGhlYWQuYXBwZW5kQ2hpbGQoc3R5bGVFbGVtZW50KTtcclxuXHR9IGVsc2Uge1xyXG5cdFx0dGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCB2YWx1ZSBmb3IgcGFyYW1ldGVyICdpbnNlcnRBdCcuIE11c3QgYmUgJ3RvcCcgb3IgJ2JvdHRvbScuXCIpO1xyXG5cdH1cclxufVxyXG5cclxuZnVuY3Rpb24gcmVtb3ZlU3R5bGVFbGVtZW50KHN0eWxlRWxlbWVudCkge1xyXG5cdHN0eWxlRWxlbWVudC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHN0eWxlRWxlbWVudCk7XHJcblx0dmFyIGlkeCA9IHN0eWxlRWxlbWVudHNJbnNlcnRlZEF0VG9wLmluZGV4T2Yoc3R5bGVFbGVtZW50KTtcclxuXHRpZihpZHggPj0gMCkge1xyXG5cdFx0c3R5bGVFbGVtZW50c0luc2VydGVkQXRUb3Auc3BsaWNlKGlkeCwgMSk7XHJcblx0fVxyXG59XHJcblxyXG5mdW5jdGlvbiBjcmVhdGVTdHlsZUVsZW1lbnQob3B0aW9ucykge1xyXG5cdHZhciBzdHlsZUVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3R5bGVcIik7XHJcblx0c3R5bGVFbGVtZW50LnR5cGUgPSBcInRleHQvY3NzXCI7XHJcblx0aW5zZXJ0U3R5bGVFbGVtZW50KG9wdGlvbnMsIHN0eWxlRWxlbWVudCk7XHJcblx0cmV0dXJuIHN0eWxlRWxlbWVudDtcclxufVxyXG5cclxuZnVuY3Rpb24gY3JlYXRlTGlua0VsZW1lbnQob3B0aW9ucykge1xyXG5cdHZhciBsaW5rRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJsaW5rXCIpO1xyXG5cdGxpbmtFbGVtZW50LnJlbCA9IFwic3R5bGVzaGVldFwiO1xyXG5cdGluc2VydFN0eWxlRWxlbWVudChvcHRpb25zLCBsaW5rRWxlbWVudCk7XHJcblx0cmV0dXJuIGxpbmtFbGVtZW50O1xyXG59XHJcblxyXG5mdW5jdGlvbiBhZGRTdHlsZShvYmosIG9wdGlvbnMpIHtcclxuXHR2YXIgc3R5bGVFbGVtZW50LCB1cGRhdGUsIHJlbW92ZTtcclxuXHJcblx0aWYgKG9wdGlvbnMuc2luZ2xldG9uKSB7XHJcblx0XHR2YXIgc3R5bGVJbmRleCA9IHNpbmdsZXRvbkNvdW50ZXIrKztcclxuXHRcdHN0eWxlRWxlbWVudCA9IHNpbmdsZXRvbkVsZW1lbnQgfHwgKHNpbmdsZXRvbkVsZW1lbnQgPSBjcmVhdGVTdHlsZUVsZW1lbnQob3B0aW9ucykpO1xyXG5cdFx0dXBkYXRlID0gYXBwbHlUb1NpbmdsZXRvblRhZy5iaW5kKG51bGwsIHN0eWxlRWxlbWVudCwgc3R5bGVJbmRleCwgZmFsc2UpO1xyXG5cdFx0cmVtb3ZlID0gYXBwbHlUb1NpbmdsZXRvblRhZy5iaW5kKG51bGwsIHN0eWxlRWxlbWVudCwgc3R5bGVJbmRleCwgdHJ1ZSk7XHJcblx0fSBlbHNlIGlmKG9iai5zb3VyY2VNYXAgJiZcclxuXHRcdHR5cGVvZiBVUkwgPT09IFwiZnVuY3Rpb25cIiAmJlxyXG5cdFx0dHlwZW9mIFVSTC5jcmVhdGVPYmplY3RVUkwgPT09IFwiZnVuY3Rpb25cIiAmJlxyXG5cdFx0dHlwZW9mIFVSTC5yZXZva2VPYmplY3RVUkwgPT09IFwiZnVuY3Rpb25cIiAmJlxyXG5cdFx0dHlwZW9mIEJsb2IgPT09IFwiZnVuY3Rpb25cIiAmJlxyXG5cdFx0dHlwZW9mIGJ0b2EgPT09IFwiZnVuY3Rpb25cIikge1xyXG5cdFx0c3R5bGVFbGVtZW50ID0gY3JlYXRlTGlua0VsZW1lbnQob3B0aW9ucyk7XHJcblx0XHR1cGRhdGUgPSB1cGRhdGVMaW5rLmJpbmQobnVsbCwgc3R5bGVFbGVtZW50KTtcclxuXHRcdHJlbW92ZSA9IGZ1bmN0aW9uKCkge1xyXG5cdFx0XHRyZW1vdmVTdHlsZUVsZW1lbnQoc3R5bGVFbGVtZW50KTtcclxuXHRcdFx0aWYoc3R5bGVFbGVtZW50LmhyZWYpXHJcblx0XHRcdFx0VVJMLnJldm9rZU9iamVjdFVSTChzdHlsZUVsZW1lbnQuaHJlZik7XHJcblx0XHR9O1xyXG5cdH0gZWxzZSB7XHJcblx0XHRzdHlsZUVsZW1lbnQgPSBjcmVhdGVTdHlsZUVsZW1lbnQob3B0aW9ucyk7XHJcblx0XHR1cGRhdGUgPSBhcHBseVRvVGFnLmJpbmQobnVsbCwgc3R5bGVFbGVtZW50KTtcclxuXHRcdHJlbW92ZSA9IGZ1bmN0aW9uKCkge1xyXG5cdFx0XHRyZW1vdmVTdHlsZUVsZW1lbnQoc3R5bGVFbGVtZW50KTtcclxuXHRcdH07XHJcblx0fVxyXG5cclxuXHR1cGRhdGUob2JqKTtcclxuXHJcblx0cmV0dXJuIGZ1bmN0aW9uIHVwZGF0ZVN0eWxlKG5ld09iaikge1xyXG5cdFx0aWYobmV3T2JqKSB7XHJcblx0XHRcdGlmKG5ld09iai5jc3MgPT09IG9iai5jc3MgJiYgbmV3T2JqLm1lZGlhID09PSBvYmoubWVkaWEgJiYgbmV3T2JqLnNvdXJjZU1hcCA9PT0gb2JqLnNvdXJjZU1hcClcclxuXHRcdFx0XHRyZXR1cm47XHJcblx0XHRcdHVwZGF0ZShvYmogPSBuZXdPYmopO1xyXG5cdFx0fSBlbHNlIHtcclxuXHRcdFx0cmVtb3ZlKCk7XHJcblx0XHR9XHJcblx0fTtcclxufVxyXG5cclxudmFyIHJlcGxhY2VUZXh0ID0gKGZ1bmN0aW9uICgpIHtcclxuXHR2YXIgdGV4dFN0b3JlID0gW107XHJcblxyXG5cdHJldHVybiBmdW5jdGlvbiAoaW5kZXgsIHJlcGxhY2VtZW50KSB7XHJcblx0XHR0ZXh0U3RvcmVbaW5kZXhdID0gcmVwbGFjZW1lbnQ7XHJcblx0XHRyZXR1cm4gdGV4dFN0b3JlLmZpbHRlcihCb29sZWFuKS5qb2luKCdcXG4nKTtcclxuXHR9O1xyXG59KSgpO1xyXG5cclxuZnVuY3Rpb24gYXBwbHlUb1NpbmdsZXRvblRhZyhzdHlsZUVsZW1lbnQsIGluZGV4LCByZW1vdmUsIG9iaikge1xyXG5cdHZhciBjc3MgPSByZW1vdmUgPyBcIlwiIDogb2JqLmNzcztcclxuXHJcblx0aWYgKHN0eWxlRWxlbWVudC5zdHlsZVNoZWV0KSB7XHJcblx0XHRzdHlsZUVsZW1lbnQuc3R5bGVTaGVldC5jc3NUZXh0ID0gcmVwbGFjZVRleHQoaW5kZXgsIGNzcyk7XHJcblx0fSBlbHNlIHtcclxuXHRcdHZhciBjc3NOb2RlID0gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoY3NzKTtcclxuXHRcdHZhciBjaGlsZE5vZGVzID0gc3R5bGVFbGVtZW50LmNoaWxkTm9kZXM7XHJcblx0XHRpZiAoY2hpbGROb2Rlc1tpbmRleF0pIHN0eWxlRWxlbWVudC5yZW1vdmVDaGlsZChjaGlsZE5vZGVzW2luZGV4XSk7XHJcblx0XHRpZiAoY2hpbGROb2Rlcy5sZW5ndGgpIHtcclxuXHRcdFx0c3R5bGVFbGVtZW50Lmluc2VydEJlZm9yZShjc3NOb2RlLCBjaGlsZE5vZGVzW2luZGV4XSk7XHJcblx0XHR9IGVsc2Uge1xyXG5cdFx0XHRzdHlsZUVsZW1lbnQuYXBwZW5kQ2hpbGQoY3NzTm9kZSk7XHJcblx0XHR9XHJcblx0fVxyXG59XHJcblxyXG5mdW5jdGlvbiBhcHBseVRvVGFnKHN0eWxlRWxlbWVudCwgb2JqKSB7XHJcblx0dmFyIGNzcyA9IG9iai5jc3M7XHJcblx0dmFyIG1lZGlhID0gb2JqLm1lZGlhO1xyXG5cclxuXHRpZihtZWRpYSkge1xyXG5cdFx0c3R5bGVFbGVtZW50LnNldEF0dHJpYnV0ZShcIm1lZGlhXCIsIG1lZGlhKVxyXG5cdH1cclxuXHJcblx0aWYoc3R5bGVFbGVtZW50LnN0eWxlU2hlZXQpIHtcclxuXHRcdHN0eWxlRWxlbWVudC5zdHlsZVNoZWV0LmNzc1RleHQgPSBjc3M7XHJcblx0fSBlbHNlIHtcclxuXHRcdHdoaWxlKHN0eWxlRWxlbWVudC5maXJzdENoaWxkKSB7XHJcblx0XHRcdHN0eWxlRWxlbWVudC5yZW1vdmVDaGlsZChzdHlsZUVsZW1lbnQuZmlyc3RDaGlsZCk7XHJcblx0XHR9XHJcblx0XHRzdHlsZUVsZW1lbnQuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoY3NzKSk7XHJcblx0fVxyXG59XHJcblxyXG5mdW5jdGlvbiB1cGRhdGVMaW5rKGxpbmtFbGVtZW50LCBvYmopIHtcclxuXHR2YXIgY3NzID0gb2JqLmNzcztcclxuXHR2YXIgc291cmNlTWFwID0gb2JqLnNvdXJjZU1hcDtcclxuXHJcblx0aWYoc291cmNlTWFwKSB7XHJcblx0XHQvLyBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vYS8yNjYwMzg3NVxyXG5cdFx0Y3NzICs9IFwiXFxuLyojIHNvdXJjZU1hcHBpbmdVUkw9ZGF0YTphcHBsaWNhdGlvbi9qc29uO2Jhc2U2NCxcIiArIGJ0b2EodW5lc2NhcGUoZW5jb2RlVVJJQ29tcG9uZW50KEpTT04uc3RyaW5naWZ5KHNvdXJjZU1hcCkpKSkgKyBcIiAqL1wiO1xyXG5cdH1cclxuXHJcblx0dmFyIGJsb2IgPSBuZXcgQmxvYihbY3NzXSwgeyB0eXBlOiBcInRleHQvY3NzXCIgfSk7XHJcblxyXG5cdHZhciBvbGRTcmMgPSBsaW5rRWxlbWVudC5ocmVmO1xyXG5cclxuXHRsaW5rRWxlbWVudC5ocmVmID0gVVJMLmNyZWF0ZU9iamVjdFVSTChibG9iKTtcclxuXHJcblx0aWYob2xkU3JjKVxyXG5cdFx0VVJMLnJldm9rZU9iamVjdFVSTChvbGRTcmMpO1xyXG59XHJcblxuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L3N0eWxlLWxvYWRlci9hZGRTdHlsZXMuanNcbiAqKiBtb2R1bGUgaWQgPSA1MFxuICoqIG1vZHVsZSBjaHVua3MgPSAyNFxuICoqLyJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==");

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

	eval("/**\n * angular-strap\n * @version v2.3.7 - 2016-01-16\n * @link http://mgcrea.github.io/angular-strap\n * @author Olivier Louvignes <olivier@mg-crea.com> (https://github.com/mgcrea)\n * @license MIT License, http://www.opensource.org/licenses/MIT\n */\n!function(e,t,n){'use strict';function a(e,n,a,o,i,r){function s(e,n){return angular.element((n||t).querySelectorAll(e))}function l(e){return u[e]?u[e]:u[e]=n.get(e,{cache:r}).then(function(e){return e.data})}this.compile=function(t){t.template&&/\\.html$/.test(t.template)&&(console.warn('Deprecated use of `template` option to pass a file. Please use the `templateUrl` option instead.'),t.templateUrl=t.template,t.template='');var n=t.templateUrl,r=t.template||'',u=t.controller,c=t.controllerAs,d=angular.copy(t.resolve||{}),f=angular.copy(t.locals||{}),p=t.transformTemplate||angular.identity,g=t.bindToController;if(angular.forEach(d,function(e,t){angular.isString(e)?d[t]=a.get(e):d[t]=a.invoke(e)}),angular.extend(d,f),r)d.$template=e.when(r);else{if(!n)throw new Error('Missing `template` / `templateUrl` option.');d.$template=l(n)}return t.contentTemplate&&(d.$template=e.all([d.$template,l(t.contentTemplate)]).then(function(e){var n=angular.element(e[0]),a=s('[ng-bind=\"content\"], [ng-bind=\"title\"]',n[0]).removeAttr('ng-bind').html(e[1]);return t.templateUrl||a.next().remove(),n[0].outerHTML})),e.all(d).then(function(e){var n=p(e.$template);t.html&&(n=n.replace(/ng-bind=\"/gi,'ng-bind-html=\"'));var a=angular.element('<div>').html(n.trim()).contents(),r=o(a);return{locals:e,element:a,link:function(t){if(e.$scope=t,u){var n=i(u,e,!0);g&&angular.extend(n.instance,e);var o=angular.isObject(n)?n:n();a.data('$ngControllerController',o),a.children().data('$ngControllerController',o),c&&(t[c]=o)}return r.apply(null,arguments)}}})};var u={}}a.$inject=['$q','$http','$injector','$compile','$controller','$templateCache'],angular.module('mgcrea.ngStrap.typeahead',['mgcrea.ngStrap.tooltip','mgcrea.ngStrap.helpers.parseOptions']).provider('$typeahead',function(){var e=this.defaults={animation:'am-fade',prefixClass:'typeahead',prefixEvent:'$typeahead',placement:'bottom-left',templateUrl:'typeahead/typeahead.tpl.html',trigger:'focus',container:!1,keyboard:!0,html:!1,delay:0,minLength:1,filter:'bsAsyncFilter',limit:6,autoSelect:!1,comparator:'',trimValue:!0};this.$get=['$window','$rootScope','$tooltip','$$rAF','$timeout',function(t,n,a,o,i){function r(t,n,r){var l={},u=angular.extend({},e,r);l=a(t,u);var c=r.scope,d=l.$scope;d.$resetMatches=function(){d.$matches=[],d.$activeIndex=u.autoSelect?0:-1},d.$resetMatches(),d.$activate=function(e){d.$$postDigest(function(){l.activate(e)})},d.$select=function(e,t){d.$$postDigest(function(){l.select(e)})},d.$isVisible=function(){return l.$isVisible()},l.update=function(e){d.$matches=e,d.$activeIndex>=e.length&&(d.$activeIndex=u.autoSelect?0:-1),s(d),o(l.$applyPlacement)},l.activate=function(e){d.$activeIndex=e},l.select=function(e){if(-1!==e){var t=d.$matches[e].value;n.$setViewValue(t),n.$render(),d.$resetMatches(),c&&c.$digest(),d.$emit(u.prefixEvent+'.select',t,e,l)}},l.$isVisible=function(){return u.minLength&&n?d.$matches.length&&angular.isString(n.$viewValue)&&n.$viewValue.length>=u.minLength:!!d.$matches.length},l.$getIndex=function(e){var t;for(t=d.$matches.length;t--&&!angular.equals(d.$matches[t].value,e););return t},l.$onMouseDown=function(e){e.preventDefault(),e.stopPropagation()},l.$onKeyDown=function(e){/(38|40|13)/.test(e.keyCode)&&(!l.$isVisible()||13===e.keyCode&&-1===d.$activeIndex||(e.preventDefault(),e.stopPropagation()),13===e.keyCode&&d.$matches.length?l.select(d.$activeIndex):38===e.keyCode&&d.$activeIndex>0?d.$activeIndex--:40===e.keyCode&&d.$activeIndex<d.$matches.length-1?d.$activeIndex++:angular.isUndefined(d.$activeIndex)&&(d.$activeIndex=0),d.$digest())};var f=l.show;l.show=function(){f(),i(function(){l.$element&&(l.$element.on('mousedown',l.$onMouseDown),u.keyboard&&t&&t.on('keydown',l.$onKeyDown))},0,!1)};var p=l.hide;return l.hide=function(){l.$element&&l.$element.off('mousedown',l.$onMouseDown),u.keyboard&&t&&t.off('keydown',l.$onKeyDown),u.autoSelect||l.activate(-1),p()},l}function s(e){e.$$phase||e.$root&&e.$root.$$phase||e.$digest()}return r.defaults=e,r}]}).filter('bsAsyncFilter',['$filter',function(e){return function(t,n,a){return t&&angular.isFunction(t.then)?t.then(function(t){return e('filter')(t,n,a)}):e('filter')(t,n,a)}}]).directive('bsTypeahead',['$window','$parse','$q','$typeahead','$parseOptions',function(e,t,n,a,o){var i=a.defaults;return{restrict:'EAC',require:'ngModel',link:function(e,t,n,r){var s={scope:e};angular.forEach(['template','templateUrl','controller','controllerAs','placement','container','delay','trigger','keyboard','html','animation','filter','limit','minLength','watchOptions','selectMode','autoSelect','comparator','id','prefixEvent','prefixClass'],function(e){angular.isDefined(n[e])&&(s[e]=n[e])});var l=/^(false|0|)$/i;angular.forEach(['html','container','trimValue'],function(e){angular.isDefined(n[e])&&l.test(n[e])&&(s[e]=!1)}),t.attr('autocomplete')||t.attr('autocomplete','off');var u=s.filter||i.filter,c=s.limit||i.limit,d=s.comparator||i.comparator,f=n.bsOptions;u&&(f+=' | '+u+':$viewValue'),d&&(f+=':'+d),c&&(f+=' | limitTo:'+c);var p=o(f),g=a(t,r,s);if(s.watchOptions){var m=p.$match[7].replace(/\\|.+/,'').replace(/\\(.*\\)/g,'').trim();e.$watchCollection(m,function(t,n){p.valuesFn(e,r).then(function(e){g.update(e),r.$render()})})}e.$watch(n.ngModel,function(t,n){e.$modelValue=t,p.valuesFn(e,r).then(function(e){return s.selectMode&&!e.length&&t.length>0?void r.$setViewValue(r.$viewValue.substring(0,r.$viewValue.length-1)):(e.length>c&&(e=e.slice(0,c)),g.update(e),void r.$render())})}),r.$formatters.push(function(e){var t=p.displayValue(e);return t?t:e&&'object'!=typeof e?e:''}),r.$render=function(){if(r.$isEmpty(r.$viewValue))return t.val('');var e=g.$getIndex(r.$modelValue),n=-1!==e?g.$scope.$matches[e].label:r.$viewValue;n=angular.isObject(n)?p.displayValue(n):n;var a=n?n.toString().replace(/<(?:.|\\n)*?>/gm,''):'';t.val(s.trimValue===!1?a:a.trim())},e.$on('$destroy',function(){g&&g.destroy(),s=null,g=null})}}}]),angular.module('mgcrea.ngStrap.tooltip',['mgcrea.ngStrap.core','mgcrea.ngStrap.helpers.dimensions']).provider('$tooltip',function(){var e=this.defaults={animation:'am-fade',customClass:'',prefixClass:'tooltip',prefixEvent:'tooltip',container:!1,target:!1,placement:'top',templateUrl:'tooltip/tooltip.tpl.html',template:'',contentTemplate:!1,trigger:'hover focus',keyboard:!1,html:!1,show:!1,title:'',type:'',delay:0,autoClose:!1,bsEnabled:!0,viewport:{selector:'body',padding:0}};this.$get=['$window','$rootScope','$bsCompiler','$q','$templateCache','$http','$animate','$sce','dimensions','$$rAF','$timeout',function(n,a,o,i,r,s,l,u,c,d,f){function p(i,r){function s(){I.$emit(V.prefixEvent+'.show',F)}function p(){if(I.$emit(V.prefixEvent+'.hide',F),R===j){if(z&&'focus'===V.trigger)return i[0].blur();A()}}function v(){var e=V.trigger.split(' ');angular.forEach(e,function(e){'click'===e?i.on('click',F.toggle):'manual'!==e&&(i.on('hover'===e?'mouseenter':'focus',F.enter),i.on('hover'===e?'mouseleave':'blur',F.leave),'button'===N&&'hover'!==e&&i.on($?'touchstart':'mousedown',F.$onFocusElementMouseDown))})}function w(){for(var e=V.trigger.split(' '),t=e.length;t--;){var n=e[t];'click'===n?i.off('click',F.toggle):'manual'!==n&&(i.off('hover'===n?'mouseenter':'focus',F.enter),i.off('hover'===n?'mouseleave':'blur',F.leave),'button'===N&&'hover'!==n&&i.off($?'touchstart':'mousedown',F.$onFocusElementMouseDown))}}function y(){'focus'!==V.trigger?R.on('keyup',F.$onKeyUp):i.on('keyup',F.$onFocusKeyUp)}function b(){'focus'!==V.trigger?R.off('keyup',F.$onKeyUp):i.off('keyup',F.$onFocusKeyUp)}function D(){f(function(){R.on('click',S),h.on('click',F.hide),K=!0},0,!1)}function k(){K&&(R.off('click',S),h.off('click',F.hide),K=!1)}function S(e){e.stopPropagation()}function x(e){e=e||V.target||i;var a=e[0],o='BODY'===a.tagName,r=a.getBoundingClientRect(),s={};for(var l in r)s[l]=r[l];null===s.width&&(s=angular.extend({},s,{width:r.right-r.left,height:r.bottom-r.top}));var u=o?{top:0,left:0}:c.offset(a),d={scroll:o?t.documentElement.scrollTop||t.body.scrollTop:e.prop('scrollTop')||0},f=o?{width:t.documentElement.clientWidth,height:n.innerHeight}:null;return angular.extend({},s,d,f,u)}function C(e,t,n,a){var o,i=e.split('-');switch(i[0]){case'right':o={top:t.top+t.height/2-a/2,left:t.left+t.width};break;case'bottom':o={top:t.top+t.height,left:t.left+t.width/2-n/2};break;case'left':o={top:t.top+t.height/2-a/2,left:t.left-n};break;default:o={top:t.top-a,left:t.left+t.width/2-n/2}}if(!i[1])return o;if('top'===i[0]||'bottom'===i[0])switch(i[1]){case'left':o.left=t.left;break;case'right':o.left=t.left+t.width-n}else if('left'===i[0]||'right'===i[0])switch(i[1]){case'top':o.top=t.top-a+t.height;break;case'bottom':o.top=t.top}return o}function T(e,t){var n=R[0],a=n.offsetWidth,o=n.offsetHeight,i=parseInt(c.css(n,'margin-top'),10),r=parseInt(c.css(n,'margin-left'),10);isNaN(i)&&(i=0),isNaN(r)&&(r=0),e.top=e.top+i,e.left=e.left+r,c.setOffset(n,angular.extend({using:function(e){R.css({top:Math.round(e.top)+'px',left:Math.round(e.left)+'px',right:''})}},e),0);var s=n.offsetWidth,l=n.offsetHeight;if('top'===t&&l!==o&&(e.top=e.top+o-l),!/top-left|top-right|bottom-left|bottom-right/.test(t)){var u=E(t,e,s,l);if(u.left?e.left+=u.left:e.top+=u.top,c.setOffset(n,e),/top|right|bottom|left/.test(t)){var d=/top|bottom/.test(t),f=d?2*u.left-a+s:2*u.top-o+l,p=d?'offsetWidth':'offsetHeight';M(f,n[p],d)}}}function E(e,t,n,a){var o={top:0,left:0};if(!F.$viewport)return o;var i=V.viewport&&V.viewport.padding||0,r=x(F.$viewport);if(/right|left/.test(e)){var s=t.top-i-r.scroll,l=t.top+i-r.scroll+a;s<r.top?o.top=r.top-s:l>r.top+r.height&&(o.top=r.top+r.height-l)}else{var u=t.left-i,c=t.left+i+n;u<r.left?o.left=r.left-u:c>r.right&&(o.left=r.left+r.width-c)}return o}function M(e,t,n){var a=m('.tooltip-arrow, .arrow',R[0]);a.css(n?'left':'top',50*(1-e/t)+'%').css(n?'top':'left','')}function A(){clearTimeout(H),F.$isShown&&null!==R&&(V.autoClose&&k(),V.keyboard&&b()),q&&(q.$destroy(),q=null),R&&(R.remove(),R=F.$element=null)}var F={},V=F.$options=angular.extend({},e,r),O=F.$promise=o.compile(V),I=F.$scope=V.scope&&V.scope.$new()||a.$new(),N=i[0].nodeName.toLowerCase();if(V.delay&&angular.isString(V.delay)){var P=V.delay.split(',').map(parseFloat);V.delay=P.length>1?{show:P[0],hide:P[1]}:P[0]}F.$id=V.id||i.attr('id')||'',V.title&&(I.title=u.trustAsHtml(V.title)),I.$setEnabled=function(e){I.$$postDigest(function(){F.setEnabled(e)})},I.$hide=function(){I.$$postDigest(function(){F.hide()})},I.$show=function(){I.$$postDigest(function(){F.show()})},I.$toggle=function(){I.$$postDigest(function(){F.toggle()})},F.$isShown=I.$isShown=!1;var H,L,U,R,Y,q;O.then(function(e){U=e,F.init()}),F.init=function(){V.delay&&angular.isNumber(V.delay)&&(V.delay={show:V.delay,hide:V.delay}),'self'===V.container?Y=i:angular.isElement(V.container)?Y=V.container:V.container&&(Y=m(V.container)),v(),V.target&&(V.target=angular.isElement(V.target)?V.target:m(V.target)),V.show&&I.$$postDigest(function(){'focus'===V.trigger?i[0].focus():F.show()})},F.destroy=function(){w(),A(),I.$destroy()},F.enter=function(){return clearTimeout(H),L='in',V.delay&&V.delay.show?void(H=setTimeout(function(){'in'===L&&F.show()},V.delay.show)):F.show()},F.show=function(){if(V.bsEnabled&&!F.$isShown){I.$emit(V.prefixEvent+'.show.before',F);var e,t;V.container?(e=Y,t=Y[0].lastChild?angular.element(Y[0].lastChild):null):(e=null,t=i),R&&A(),q=F.$scope.$new(),R=F.$element=U.link(q,function(e,t){}),R.css({top:'-9999px',left:'-9999px',right:'auto',display:'block',visibility:'hidden'}),V.animation&&R.addClass(V.animation),V.type&&R.addClass(V.prefixClass+'-'+V.type),V.customClass&&R.addClass(V.customClass),t?t.after(R):e.prepend(R),F.$isShown=I.$isShown=!0,g(I),F.$applyPlacement(),angular.version.minor<=2?l.enter(R,e,t,s):l.enter(R,e,t).then(s),g(I),d(function(){R&&R.css({visibility:'visible'}),V.keyboard&&('focus'!==V.trigger&&F.focus(),y())}),V.autoClose&&D()}},F.leave=function(){return clearTimeout(H),L='out',V.delay&&V.delay.hide?void(H=setTimeout(function(){'out'===L&&F.hide()},V.delay.hide)):F.hide()};var z,j;F.hide=function(e){F.$isShown&&(I.$emit(V.prefixEvent+'.hide.before',F),z=e,j=R,angular.version.minor<=2?l.leave(R,p):l.leave(R).then(p),F.$isShown=I.$isShown=!1,g(I),V.keyboard&&null!==R&&b(),V.autoClose&&null!==R&&k())},F.toggle=function(){F.$isShown?F.leave():F.enter()},F.focus=function(){R[0].focus()},F.setEnabled=function(e){V.bsEnabled=e},F.setViewport=function(e){V.viewport=e},F.$applyPlacement=function(){if(R){var t=V.placement,n=/\\s?auto?\\s?/i,a=n.test(t);a&&(t=t.replace(n,'')||e.placement),R.addClass(V.placement);var o=x(),i=R.prop('offsetWidth'),r=R.prop('offsetHeight');if(F.$viewport=V.viewport&&m(V.viewport.selector||V.viewport),a){var s=t,l=x(F.$viewport);/bottom/.test(s)&&o.bottom+r>l.bottom?t=s.replace('bottom','top'):/top/.test(s)&&o.top-r<l.top&&(t=s.replace('top','bottom')),/left/.test(s)&&o.left-i<l.left?t=t.replace('left','right'):/right/.test(s)&&o.right+i>l.width&&(t=t.replace('right','left')),R.removeClass(s).addClass(t)}var u=C(t,o,i,r);T(u,t)}},F.$onKeyUp=function(e){27===e.which&&F.$isShown&&(F.hide(),e.stopPropagation())},F.$onFocusKeyUp=function(e){27===e.which&&(i[0].blur(),e.stopPropagation())},F.$onFocusElementMouseDown=function(e){e.preventDefault(),e.stopPropagation(),F.$isShown?i[0].blur():i[0].focus()};var K=!1;return F}function g(e){e.$$phase||e.$root&&e.$root.$$phase||e.$digest()}function m(e,n){return angular.element((n||t).querySelectorAll(e))}var $='createTouch'in n.document,h=angular.element(n.document);return p}]}).directive('bsTooltip',['$window','$location','$sce','$tooltip','$$rAF',function(e,t,n,a,o){return{restrict:'EAC',scope:!0,link:function(e,t,i,r){var s,l={scope:e};angular.forEach(['template','templateUrl','controller','controllerAs','contentTemplate','placement','container','delay','trigger','html','animation','backdropAnimation','type','customClass','id'],function(e){angular.isDefined(i[e])&&(l[e]=i[e])});var u=/^(false|0|)$/i;angular.forEach(['html','container'],function(e){angular.isDefined(i[e])&&u.test(i[e])&&(l[e]=!1)});var c=t.attr('data-target');angular.isDefined(c)&&(u.test(c)?l.target=!1:l.target=c),e.hasOwnProperty('title')||(e.title=''),i.$observe('title',function(t){if(angular.isDefined(t)||!e.hasOwnProperty('title')){var a=e.title;e.title=n.trustAsHtml(t),angular.isDefined(a)&&o(function(){s&&s.$applyPlacement()})}}),i.bsTooltip&&e.$watch(i.bsTooltip,function(t,n){angular.isObject(t)?angular.extend(e,t):e.title=t,angular.isDefined(n)&&o(function(){s&&s.$applyPlacement()})},!0),i.bsShow&&e.$watch(i.bsShow,function(e,t){s&&angular.isDefined(e)&&(angular.isString(e)&&(e=!!e.match(/true|,?(tooltip),?/i)),e===!0?s.show():s.hide())}),i.bsEnabled&&e.$watch(i.bsEnabled,function(e,t){s&&angular.isDefined(e)&&(angular.isString(e)&&(e=!!e.match(/true|1|,?(tooltip),?/i)),e===!1?s.setEnabled(!1):s.setEnabled(!0))}),i.viewport&&e.$watch(i.viewport,function(e){s&&angular.isDefined(e)&&s.setViewport(e)}),s=a(t,l),e.$on('$destroy',function(){s&&s.destroy(),l=null,s=null})}}}]),angular.module('mgcrea.ngStrap.timepicker',['mgcrea.ngStrap.helpers.dateParser','mgcrea.ngStrap.helpers.dateFormatter','mgcrea.ngStrap.tooltip']).provider('$timepicker',function(){var e=this.defaults={animation:'am-fade',prefixClass:'timepicker',placement:'bottom-left',templateUrl:'timepicker/timepicker.tpl.html',trigger:'focus',container:!1,keyboard:!0,html:!1,delay:0,useNative:!0,timeType:'date',timeFormat:'shortTime',timezone:null,modelTimeFormat:null,autoclose:!1,minTime:-(1/0),maxTime:+(1/0),length:5,hourStep:1,minuteStep:5,secondStep:5,roundDisplay:!1,iconUp:'glyphicon glyphicon-chevron-up',iconDown:'glyphicon glyphicon-chevron-down',arrowBehavior:'pager'};this.$get=['$window','$document','$rootScope','$sce','$dateFormatter','$tooltip','$timeout',function(t,n,a,o,i,r,s){function l(t,n,a){function o(e){var t=6e4*g.minuteStep;return new Date(Math.floor(e.getTime()/t)*t)}function l(e,n){var a=e+n;if(t[0].createTextRange){var o=t[0].createTextRange();o.collapse(!0),o.moveStart('character',e),o.moveEnd('character',a),o.select()}else t[0].setSelectionRange?t[0].setSelectionRange(e,a):angular.isUndefined(t[0].selectionStart)&&(t[0].selectionStart=e,t[0].selectionEnd=a)}function d(){t[0].focus()}var f=r(t,angular.extend({},e,a)),p=a.scope,g=f.$options,m=f.$scope,$=g.lang,h=function(e,t,n){return i.formatDate(e,t,$,n)},v=0,w=g.roundDisplay?o(new Date):new Date,y=n.$dateValue||w,b={hour:y.getHours(),meridian:y.getHours()<12,minute:y.getMinutes(),second:y.getSeconds(),millisecond:y.getMilliseconds()},D=i.getDatetimeFormat(g.timeFormat,$),k=i.hoursFormat(D),S=i.timeSeparator(D),x=i.minutesFormat(D),C=i.secondsFormat(D),T=i.showSeconds(D),E=i.showAM(D);m.$iconUp=g.iconUp,m.$iconDown=g.iconDown,m.$select=function(e,t){f.select(e,t)},m.$moveIndex=function(e,t){f.$moveIndex(e,t)},m.$switchMeridian=function(e){f.switchMeridian(e)},f.update=function(e){angular.isDate(e)&&!isNaN(e.getTime())?(f.$date=e,angular.extend(b,{hour:e.getHours(),minute:e.getMinutes(),second:e.getSeconds(),millisecond:e.getMilliseconds()}),f.$build()):f.$isBuilt||f.$build()},f.select=function(e,t,a){(!n.$dateValue||isNaN(n.$dateValue.getTime()))&&(n.$dateValue=new Date(1970,0,1)),angular.isDate(e)||(e=new Date(e)),0===t?n.$dateValue.setHours(e.getHours()):1===t?n.$dateValue.setMinutes(e.getMinutes()):2===t&&n.$dateValue.setSeconds(e.getSeconds()),n.$setViewValue(angular.copy(n.$dateValue)),n.$render(),g.autoclose&&!a&&s(function(){f.hide(!0)})},f.switchMeridian=function(e){if(n.$dateValue&&!isNaN(n.$dateValue.getTime())){var t=(e||n.$dateValue).getHours();n.$dateValue.setHours(12>t?t+12:t-12),n.$setViewValue(angular.copy(n.$dateValue)),n.$render()}},f.$build=function(){var e,t,n=m.midIndex=parseInt(g.length/2,10),a=[];for(e=0;e<g.length;e++)t=new Date(1970,0,1,b.hour-(n-e)*g.hourStep),a.push({date:t,label:h(t,k),selected:f.$date&&f.$isSelected(t,0),disabled:f.$isDisabled(t,0)});var o,i=[];for(e=0;e<g.length;e++)o=new Date(1970,0,1,0,b.minute-(n-e)*g.minuteStep),i.push({date:o,label:h(o,x),selected:f.$date&&f.$isSelected(o,1),disabled:f.$isDisabled(o,1)});var r,s=[];for(e=0;e<g.length;e++)r=new Date(1970,0,1,0,0,b.second-(n-e)*g.secondStep),s.push({date:r,label:h(r,C),selected:f.$date&&f.$isSelected(r,2),disabled:f.$isDisabled(r,2)});var l=[];for(e=0;e<g.length;e++)T?l.push([a[e],i[e],s[e]]):l.push([a[e],i[e]]);m.rows=l,m.showSeconds=T,m.showAM=E,m.isAM=(f.$date||a[n].date).getHours()<12,m.timeSeparator=S,f.$isBuilt=!0},f.$isSelected=function(e,t){return f.$date?0===t?e.getHours()===f.$date.getHours():1===t?e.getMinutes()===f.$date.getMinutes():2===t?e.getSeconds()===f.$date.getSeconds():void 0:!1},f.$isDisabled=function(e,t){var n;return 0===t?n=e.getTime()+6e4*b.minute+1e3*b.second:1===t?n=e.getTime()+36e5*b.hour+1e3*b.second:2===t&&(n=e.getTime()+36e5*b.hour+6e4*b.minute),n<1*g.minTime||n>1*g.maxTime},m.$arrowAction=function(e,t){'picker'===g.arrowBehavior?f.$setTimeByStep(e,t):f.$moveIndex(e,t)},f.$setTimeByStep=function(e,t){var n=new Date(f.$date||y),a=n.getHours(),o=n.getMinutes(),i=n.getSeconds();0===t?n.setHours(a-parseInt(g.hourStep,10)*e):1===t?n.setMinutes(o-parseInt(g.minuteStep,10)*e):2===t&&n.setSeconds(i-parseInt(g.secondStep,10)*e),f.select(n,t,!0)},f.$moveIndex=function(e,t){var n;0===t?(n=new Date(1970,0,1,b.hour+e*g.length,b.minute,b.second),angular.extend(b,{hour:n.getHours()})):1===t?(n=new Date(1970,0,1,b.hour,b.minute+e*g.length*g.minuteStep,b.second),angular.extend(b,{minute:n.getMinutes()})):2===t&&(n=new Date(1970,0,1,b.hour,b.minute,b.second+e*g.length*g.secondStep),angular.extend(b,{second:n.getSeconds()})),f.$build()},f.$onMouseDown=function(e){if('input'!==e.target.nodeName.toLowerCase()&&e.preventDefault(),e.stopPropagation(),c){var t=angular.element(e.target);'button'!==t[0].nodeName.toLowerCase()&&(t=t.parent()),t.triggerHandler('click')}},f.$onKeyDown=function(e){if(/(38|37|39|40|13)/.test(e.keyCode)&&!e.shiftKey&&!e.altKey){if(e.preventDefault(),e.stopPropagation(),13===e.keyCode)return void f.hide(!0);var t=new Date(f.$date),n=t.getHours(),a=h(t,k).length,o=t.getMinutes(),i=h(t,x).length,r=t.getSeconds(),s=h(t,C).length,u=1,c=/(37|39)/.test(e.keyCode),d=2+1*T+1*E;c&&(37===e.keyCode?v=1>v?d-1:v-1:39===e.keyCode&&(v=d-1>v?v+1:0));var m=[0,a],$=0;38===e.keyCode&&($=-1),40===e.keyCode&&($=1);var w=2===v&&T,y=2===v&&!T||3===v&&T;0===v?(t.setHours(n+$*parseInt(g.hourStep,10)),a=h(t,k).length,m=[0,a]):1===v?(t.setMinutes(o+$*parseInt(g.minuteStep,10)),i=h(t,x).length,m=[a+u,i]):w?(t.setSeconds(r+$*parseInt(g.secondStep,10)),s=h(t,C).length,m=[a+u+i+u,s]):y&&(c||f.switchMeridian(),m=[a+u+i+u+(s+u)*T,2]),f.select(t,v,!0),l(m[0],m[1]),p.$digest()}};var M=f.init;f.init=function(){return u&&g.useNative?(t.prop('type','time'),void t.css('-webkit-appearance','textfield')):(c&&(t.prop('type','text'),t.attr('readonly','true'),t.on('click',d)),void M())};var A=f.destroy;f.destroy=function(){u&&g.useNative&&t.off('click',d),A()};var F=f.show;f.show=function(){!c&&t.attr('readonly')||t.attr('disabled')||(F(),s(function(){f.$element&&f.$element.on(c?'touchstart':'mousedown',f.$onMouseDown),g.keyboard&&t&&t.on('keydown',f.$onKeyDown)},0,!1))};var V=f.hide;return f.hide=function(e){f.$isShown&&(f.$element&&f.$element.off(c?'touchstart':'mousedown',f.$onMouseDown),g.keyboard&&t&&t.off('keydown',f.$onKeyDown),V(e))},f}var u=/(ip[ao]d|iphone|android)/gi.test(t.navigator.userAgent),c='createTouch'in t.document&&u;return e.lang||(e.lang=i.getDefaultLocale()),l.defaults=e,l}]}).directive('bsTimepicker',['$window','$parse','$q','$dateFormatter','$dateParser','$timepicker',function(e,t,a,o,i,r){var s=r.defaults,l=/(ip[ao]d|iphone|android)/gi.test(e.navigator.userAgent);return{restrict:'EAC',require:'ngModel',link:function(e,t,a,u){function c(e){if(angular.isDate(e)){var t=isNaN(f.minTime)||new Date(e.getTime()).setFullYear(1970,0,1)>=f.minTime,n=isNaN(f.maxTime)||new Date(e.getTime()).setFullYear(1970,0,1)<=f.maxTime,a=t&&n;u.$setValidity('date',a),u.$setValidity('min',t),u.$setValidity('max',n),a&&(u.$dateValue=e)}}function d(){return!u.$dateValue||isNaN(u.$dateValue.getTime())?'':$(u.$dateValue,f.timeFormat)}var f={scope:e};angular.forEach(['template','templateUrl','controller','controllerAs','placement','container','delay','trigger','keyboard','html','animation','autoclose','timeType','timeFormat','timezone','modelTimeFormat','useNative','hourStep','minuteStep','secondStep','length','arrowBehavior','iconUp','iconDown','roundDisplay','id','prefixClass','prefixEvent'],function(e){angular.isDefined(a[e])&&(f[e]=a[e])});var p=/^(false|0|)$/i;angular.forEach(['html','container','autoclose','useNative','roundDisplay'],function(e){angular.isDefined(a[e])&&p.test(a[e])&&(f[e]=!1)}),l&&(f.useNative||s.useNative)&&(f.timeFormat='HH:mm');var g=r(t,u,f);f=g.$options;var m=f.lang,$=function(e,t,n){return o.formatDate(e,t,m,n)};a.bsShow&&e.$watch(a.bsShow,function(e,t){g&&angular.isDefined(e)&&(angular.isString(e)&&(e=!!e.match(/true|,?(timepicker),?/i)),e===!0?g.show():g.hide())});var h=i({format:f.timeFormat,lang:m});angular.forEach(['minTime','maxTime'],function(e){angular.isDefined(a[e])&&a.$observe(e,function(t){g.$options[e]=h.getTimeForAttribute(e,t),isNaN(g.$options[e])||g.$build(),c(u.$dateValue)})}),e.$watch(a.ngModel,function(e,t){g.update(u.$dateValue)},!0),u.$parsers.unshift(function(e){var t;if(!e)return u.$setValidity('date',!0),null;var a=angular.isDate(e)?e:h.parse(e,u.$dateValue);return!a||isNaN(a.getTime())?(u.$setValidity('date',!1),n):(c(a),'string'===f.timeType?(t=h.timezoneOffsetAdjust(a,f.timezone,!0),$(t,f.modelTimeFormat||f.timeFormat)):(t=h.timezoneOffsetAdjust(u.$dateValue,f.timezone,!0),'number'===f.timeType?t.getTime():'unix'===f.timeType?t.getTime()/1e3:'iso'===f.timeType?t.toISOString():new Date(t)))}),u.$formatters.push(function(e){var t;return t=angular.isUndefined(e)||null===e?NaN:angular.isDate(e)?e:'string'===f.timeType?h.parse(e,null,f.modelTimeFormat):'unix'===f.timeType?new Date(1e3*e):new Date(e),u.$dateValue=h.timezoneOffsetAdjust(t,f.timezone),d()}),u.$render=function(){t.val(d())},e.$on('$destroy',function(){g&&g.destroy(),f=null,g=null})}}}]),angular.module('mgcrea.ngStrap.tab',[]).provider('$tab',function(){var e=this.defaults={animation:'am-fade',template:'tab/tab.tpl.html',navClass:'nav-tabs',activeClass:'active'},t=this.controller=function(t,n,a){var o=this;o.$options=angular.copy(e),angular.forEach(['animation','navClass','activeClass'],function(e){angular.isDefined(a[e])&&(o.$options[e]=a[e])}),t.$navClass=o.$options.navClass,t.$activeClass=o.$options.activeClass,o.$panes=t.$panes=[],o.$activePaneChangeListeners=o.$viewChangeListeners=[],o.$push=function(e){angular.isUndefined(o.$panes.$active)&&t.$setActive(e.name||0),o.$panes.push(e)},o.$remove=function(e){var t,n=o.$panes.indexOf(e),a=o.$panes.$active;t=angular.isString(a)?o.$panes.map(function(e){return e.name}).indexOf(a):o.$panes.$active,o.$panes.splice(n,1),t>n?t--:n===t&&t===o.$panes.length&&t--,t>=0&&t<o.$panes.length?o.$setActive(o.$panes[t].name||t):o.$setActive()},o.$setActive=t.$setActive=function(e){o.$panes.$active=e,o.$activePaneChangeListeners.forEach(function(e){e()})},o.$isActive=t.$isActive=function(e,t){return o.$panes.$active===e.name||o.$panes.$active===t}};this.$get=function(){var n={};return n.defaults=e,n.controller=t,n}}).directive('bsTabs',['$window','$animate','$tab','$parse',function(e,t,n,a){var o=n.defaults;return{require:['?ngModel','bsTabs'],transclude:!0,scope:!0,controller:['$scope','$element','$attrs',n.controller],templateUrl:function(e,t){return t.template||o.template},link:function(e,t,n,o){var i=o[0],r=o[1];if(i&&(r.$activePaneChangeListeners.push(function(){i.$setViewValue(r.$panes.$active)}),i.$formatters.push(function(e){return r.$setActive(e),e})),n.bsActivePane){var s=a(n.bsActivePane);r.$activePaneChangeListeners.push(function(){s.assign(e,r.$panes.$active)}),e.$watch(n.bsActivePane,function(e,t){r.$setActive(e)},!0)}}}}]).directive('bsPane',['$window','$animate','$sce',function(e,t,n){return{require:['^?ngModel','^bsTabs'],scope:!0,link:function(e,a,o,i){function r(){var n=s.$panes.indexOf(e);t[s.$isActive(e,n)?'addClass':'removeClass'](a,s.$options.activeClass)}var s=i[1];a.addClass('tab-pane'),o.$observe('title',function(t,a){e.title=n.trustAsHtml(t)}),e.name=o.name,s.$options.animation&&a.addClass(s.$options.animation),o.$observe('disabled',function(t,n){e.disabled=e.$eval(t)}),s.$push(e),e.$on('$destroy',function(){s.$remove(e)}),s.$activePaneChangeListeners.push(function(){r()}),r()}}}]),angular.module('mgcrea.ngStrap.select',['mgcrea.ngStrap.tooltip','mgcrea.ngStrap.helpers.parseOptions']).provider('$select',function(){var e=this.defaults={animation:'am-fade',prefixClass:'select',prefixEvent:'$select',placement:'bottom-left',templateUrl:'select/select.tpl.html',trigger:'focus',container:!1,keyboard:!0,html:!1,delay:0,multiple:!1,allNoneButtons:!1,sort:!0,caretHtml:'&nbsp;<span class=\"caret\"></span>',placeholder:'Choose among the following...',allText:'All',noneText:'None',maxLength:3,maxLengthHtml:'selected',iconCheckmark:'glyphicon glyphicon-ok'};this.$get=['$window','$document','$rootScope','$tooltip','$timeout',function(t,n,a,o,i){function r(a,r,s){var u={},c=angular.extend({},e,s);u=o(a,c);var d=u.$scope;d.$matches=[],c.multiple?d.$activeIndex=[]:d.$activeIndex=-1,d.$isMultiple=c.multiple,d.$showAllNoneButtons=c.allNoneButtons&&c.multiple,d.$iconCheckmark=c.iconCheckmark,d.$allText=c.allText,d.$noneText=c.noneText,d.$activate=function(e){d.$$postDigest(function(){u.activate(e)})},d.$select=function(e,t){d.$$postDigest(function(){u.select(e)})},d.$isVisible=function(){return u.$isVisible()},d.$isActive=function(e){return u.$isActive(e)},d.$selectAll=function(){for(var e=0;e<d.$matches.length;e++)d.$isActive(e)||d.$select(e)},d.$selectNone=function(){for(var e=0;e<d.$matches.length;e++)d.$isActive(e)&&d.$select(e)},u.update=function(e){d.$matches=e,u.$updateActiveIndex()},u.activate=function(e){return c.multiple?(u.$isActive(e)?d.$activeIndex.splice(d.$activeIndex.indexOf(e),1):d.$activeIndex.push(e),c.sort&&d.$activeIndex.sort(function(e,t){return e-t})):d.$activeIndex=e,d.$activeIndex},u.select=function(e){var t=d.$matches[e].value;d.$apply(function(){u.activate(e),c.multiple?r.$setViewValue(d.$activeIndex.map(function(e){return angular.isUndefined(d.$matches[e])?null:d.$matches[e].value})):(r.$setViewValue(t),u.hide())}),d.$emit(c.prefixEvent+'.select',t,e,u)},u.$updateActiveIndex=function(){c.multiple?angular.isArray(r.$modelValue)?d.$activeIndex=r.$modelValue.map(function(e){return u.$getIndex(e)}):d.$activeIndex=[]:angular.isDefined(r.$modelValue)&&d.$matches.length?d.$activeIndex=u.$getIndex(r.$modelValue):d.$activeIndex=-1},u.$isVisible=function(){return c.minLength&&r?d.$matches.length&&r.$viewValue.length>=c.minLength:d.$matches.length},u.$isActive=function(e){return c.multiple?-1!==d.$activeIndex.indexOf(e):d.$activeIndex===e},u.$getIndex=function(e){var t;for(t=d.$matches.length;t--&&!angular.equals(d.$matches[t].value,e););return t},u.$onMouseDown=function(e){if(e.preventDefault(),e.stopPropagation(),l){var t=angular.element(e.target);t.triggerHandler('click')}},u.$onKeyDown=function(e){return/(9|13|38|40)/.test(e.keyCode)?(9!==e.keyCode&&(e.preventDefault(),e.stopPropagation()),c.multiple&&9===e.keyCode?u.hide():c.multiple||13!==e.keyCode&&9!==e.keyCode?void(c.multiple||(38===e.keyCode&&d.$activeIndex>0?d.$activeIndex--:38===e.keyCode&&d.$activeIndex<0?d.$activeIndex=d.$matches.length-1:40===e.keyCode&&d.$activeIndex<d.$matches.length-1?d.$activeIndex++:angular.isUndefined(d.$activeIndex)&&(d.$activeIndex=0),d.$digest())):u.select(d.$activeIndex)):void 0},u.$isIE=function(){var e=t.navigator.userAgent;return e.indexOf('MSIE ')>0||e.indexOf('Trident/')>0||e.indexOf('Edge/')>0},u.$selectScrollFix=function(e){'UL'===n[0].activeElement.tagName&&(e.preventDefault(),e.stopImmediatePropagation(),e.target.focus())};var f=u.show;u.show=function(){f(),c.multiple&&u.$element.addClass('select-multiple'),i(function(){u.$element.on(l?'touchstart':'mousedown',u.$onMouseDown),c.keyboard&&a.on('keydown',u.$onKeyDown)},0,!1)};var p=u.hide;return u.hide=function(){!c.multiple&&angular.isUndefined(r.$modelValue)&&(d.$activeIndex=-1),u.$element.off(l?'touchstart':'mousedown',u.$onMouseDown),c.keyboard&&a.off('keydown',u.$onKeyDown),p(!0)},u}var s=/(ip[ao]d|iphone|android)/gi.test(t.navigator.userAgent),l='createTouch'in t.document&&s;return r.defaults=e,r}]}).directive('bsSelect',['$window','$parse','$q','$select','$parseOptions',function(e,t,n,a,o){var i=a.defaults;return{restrict:'EAC',require:'ngModel',link:function(e,t,n,r){var s={scope:e,placeholder:i.placeholder};angular.forEach(['template','templateUrl','controller','controllerAs','placement','container','delay','trigger','keyboard','html','animation','placeholder','allNoneButtons','maxLength','maxLengthHtml','allText','noneText','iconCheckmark','autoClose','id','sort','caretHtml','prefixClass','prefixEvent'],function(e){angular.isDefined(n[e])&&(s[e]=n[e])});var l=/^(false|0|)$/i;angular.forEach(['html','container','allNoneButtons','sort'],function(e){angular.isDefined(n[e])&&l.test(n[e])&&(s[e]=!1)});var u=t.attr('data-multiple');if(angular.isDefined(u)&&(l.test(u)?s.multiple=!1:s.multiple=u),'select'===t[0].nodeName.toLowerCase()){var c=t;c.css('display','none'),t=angular.element('<button type=\"button\" class=\"btn btn-default\"></button>'),c.after(t)}var d=o(n.bsOptions),f=a(t,r,s);f.$isIE()&&t[0].addEventListener('blur',f.$selectScrollFix);var p=d.$match[7].replace(/\\|.+/,'').trim();e.$watch(p,function(t,n){d.valuesFn(e,r).then(function(e){f.update(e),r.$render()})},!0),e.$watch(n.ngModel,function(e,t){f.$updateActiveIndex(),r.$render()},!0),r.$render=function(){var e,n;s.multiple&&angular.isArray(r.$modelValue)?(e=r.$modelValue.map(function(e){return n=f.$getIndex(e),-1!==n?f.$scope.$matches[n].label:!1}).filter(angular.isDefined),e=e.length>(s.maxLength||i.maxLength)?e.length+' '+(s.maxLengthHtml||i.maxLengthHtml):e.join(', ')):(n=f.$getIndex(r.$modelValue),\ne=-1!==n?f.$scope.$matches[n].label:!1),t.html((e?e:s.placeholder)+(s.caretHtml?s.caretHtml:i.caretHtml))},s.multiple&&(r.$isEmpty=function(e){return!e||0===e.length}),e.$on('$destroy',function(){f&&f.destroy(),s=null,f=null})}}}]),angular.module('mgcrea.ngStrap.popover',['mgcrea.ngStrap.tooltip']).provider('$popover',function(){var e=this.defaults={animation:'am-fade',customClass:'',container:!1,target:!1,placement:'right',templateUrl:'popover/popover.tpl.html',contentTemplate:!1,trigger:'click',keyboard:!0,html:!1,title:'',content:'',delay:0,autoClose:!1};this.$get=['$tooltip',function(t){function n(n,a){var o=angular.extend({},e,a),i=t(n,o);return o.content&&(i.$scope.content=o.content),i}return n}]}).directive('bsPopover',['$window','$sce','$popover',function(e,t,n){var a=e.requestAnimationFrame||e.setTimeout;return{restrict:'EAC',scope:!0,link:function(e,o,i){var r,s={scope:e};angular.forEach(['template','templateUrl','controller','controllerAs','contentTemplate','placement','container','delay','trigger','html','animation','customClass','autoClose','id','prefixClass','prefixEvent'],function(e){angular.isDefined(i[e])&&(s[e]=i[e])});var l=/^(false|0|)$/i;angular.forEach(['html','container','autoClose'],function(e){angular.isDefined(i[e])&&l.test(i[e])&&(s[e]=!1)});var u=o.attr('data-target');angular.isDefined(u)&&(l.test(u)?s.target=!1:s.target=u),angular.forEach(['title','content'],function(n){i[n]&&i.$observe(n,function(o,i){e[n]=t.trustAsHtml(o),angular.isDefined(i)&&a(function(){r&&r.$applyPlacement()})})}),i.bsPopover&&e.$watch(i.bsPopover,function(t,n){angular.isObject(t)?angular.extend(e,t):e.content=t,angular.isDefined(n)&&a(function(){r&&r.$applyPlacement()})},!0),i.bsShow&&e.$watch(i.bsShow,function(e,t){r&&angular.isDefined(e)&&(angular.isString(e)&&(e=!!e.match(/true|,?(popover),?/i)),e===!0?r.show():r.hide())}),i.viewport&&e.$watch(i.viewport,function(e){r&&angular.isDefined(e)&&r.setViewport(e)}),r=n(o,s),e.$on('$destroy',function(){r&&r.destroy(),s=null,r=null})}}}]),angular.module('mgcrea.ngStrap.scrollspy',['mgcrea.ngStrap.helpers.debounce','mgcrea.ngStrap.helpers.dimensions']).provider('$scrollspy',function(){var e=this.$$spies={},n=this.defaults={debounce:150,throttle:100,offset:100};this.$get=['$window','$document','$rootScope','dimensions','debounce','throttle',function(a,o,i,r,s,l){function u(e,t){return e[0].nodeName&&e[0].nodeName.toLowerCase()===t.toLowerCase()}function c(o){var c=angular.extend({},n,o);c.element||(c.element=p);var g=u(c.element,'body'),m=g?d:c.element,$=g?'window':c.id;if(e[$])return e[$].$$count++,e[$];var h,v,w,y,b,D,k,S,x={},C=x.$trackedElements=[],T=[];return x.init=function(){this.$$count=1,y=s(this.checkPosition,c.debounce),b=l(this.checkPosition,c.throttle),m.on('click',this.checkPositionWithEventLoop),d.on('resize',y),m.on('scroll',b),D=s(this.checkOffsets,c.debounce),h=i.$on('$viewContentLoaded',D),v=i.$on('$includeContentLoaded',D),D(),$&&(e[$]=x)},x.destroy=function(){this.$$count--,this.$$count>0||(m.off('click',this.checkPositionWithEventLoop),d.off('resize',y),m.off('scroll',b),h(),v(),$&&delete e[$])},x.checkPosition=function(){if(T.length){if(S=(g?a.pageYOffset:m.prop('scrollTop'))||0,k=Math.max(a.innerHeight,f.prop('clientHeight')),S<T[0].offsetTop&&w!==T[0].target)return x.$activateElement(T[0]);for(var e=T.length;e--;)if(!angular.isUndefined(T[e].offsetTop)&&null!==T[e].offsetTop&&w!==T[e].target&&!(S<T[e].offsetTop||T[e+1]&&S>T[e+1].offsetTop))return x.$activateElement(T[e])}},x.checkPositionWithEventLoop=function(){setTimeout(x.checkPosition,1)},x.$activateElement=function(e){if(w){var t=x.$getTrackedElement(w);t&&(t.source.removeClass('active'),u(t.source,'li')&&u(t.source.parent().parent(),'li')&&t.source.parent().parent().removeClass('active'))}w=e.target,e.source.addClass('active'),u(e.source,'li')&&u(e.source.parent().parent(),'li')&&e.source.parent().parent().addClass('active')},x.$getTrackedElement=function(e){return C.filter(function(t){return t.target===e})[0]},x.checkOffsets=function(){angular.forEach(C,function(e){var n=t.querySelector(e.target);e.offsetTop=n?r.offset(n).top:null,c.offset&&null!==e.offsetTop&&(e.offsetTop-=1*c.offset)}),T=C.filter(function(e){return null!==e.offsetTop}).sort(function(e,t){return e.offsetTop-t.offsetTop}),y()},x.trackElement=function(e,t){C.push({target:e,source:t})},x.untrackElement=function(e,t){for(var n,a=C.length;a--;)if(C[a].target===e&&C[a].source===t){n=a;break}C=C.splice(n,1)},x.activate=function(e){C[e].addClass('active')},x.init(),x}var d=angular.element(a),f=angular.element(o.prop('documentElement')),p=angular.element(a.document.body);return c}]}).directive('bsScrollspy',['$rootScope','debounce','dimensions','$scrollspy',function(e,t,n,a){return{restrict:'EAC',link:function(e,t,n){var o={scope:e};angular.forEach(['offset','target'],function(e){angular.isDefined(n[e])&&(o[e]=n[e])});var i=a(o);i.trackElement(o.target,t),e.$on('$destroy',function(){i&&(i.untrackElement(o.target,t),i.destroy()),o=null,i=null})}}}]).directive('bsScrollspyList',['$rootScope','debounce','dimensions','$scrollspy',function(e,t,n,a){return{restrict:'A',compile:function(e,t){var n=e[0].querySelectorAll('li > a[href]');angular.forEach(n,function(e){var t=angular.element(e);t.parent().attr('bs-scrollspy','').attr('data-target',t.attr('href'))})}}}]),angular.module('mgcrea.ngStrap.navbar',[]).provider('$navbar',function(){var e=this.defaults={activeClass:'active',routeAttr:'data-match-route',strict:!1};this.$get=function(){return{defaults:e}}}).directive('bsNavbar',['$window','$location','$navbar',function(e,t,n){var a=n.defaults;return{restrict:'A',link:function(e,n,o,i){var r=angular.copy(a);angular.forEach(Object.keys(a),function(e){angular.isDefined(o[e])&&(r[e]=o[e])}),e.$watch(function(){return t.path()},function(e,t){var a=n[0].querySelectorAll('li['+r.routeAttr+']');angular.forEach(a,function(t){var n=angular.element(t),a=n.attr(r.routeAttr).replace('/','\\\\/');r.strict&&(a='^'+a+'$');var o=new RegExp(a,'i');o.test(e)?n.addClass(r.activeClass):n.removeClass(r.activeClass)})})}}}]),angular.module('mgcrea.ngStrap.modal',['mgcrea.ngStrap.core','mgcrea.ngStrap.helpers.dimensions']).provider('$modal',function(){var e=this.defaults={animation:'am-fade',backdropAnimation:'am-fade',customClass:'',prefixClass:'modal',prefixEvent:'modal',placement:'top',templateUrl:'modal/modal.tpl.html',template:'',contentTemplate:!1,container:!1,element:null,backdrop:!0,keyboard:!0,html:!1,show:!0};this.$get=['$window','$rootScope','$bsCompiler','$animate','$timeout','$sce','dimensions',function(n,a,o,i,r,s,l){function u(t){function n(){C.$emit(S.prefixEvent+'.show',k)}function r(){C.$emit(S.prefixEvent+'.hide',k),g.removeClass(S.prefixClass+'-open'),S.animation&&g.removeClass(S.prefixClass+'-with-'+S.animation)}function l(){S.backdrop&&(E.on('click',y),A.on('click',y),A.on('wheel',b))}function u(){S.backdrop&&(E.off('click',y),A.off('click',y),A.off('wheel',b))}function v(){S.keyboard&&E.on('keyup',k.$onKeyUp)}function w(){S.keyboard&&E.off('keyup',k.$onKeyUp)}function y(e){e.target===e.currentTarget&&('static'===S.backdrop?k.focus():k.hide())}function b(e){e.preventDefault()}function D(){k.$isShown&&null!==E&&(u(),w()),M&&(M.$destroy(),M=null),E&&(E.remove(),E=k.$element=null)}var k={},S=k.$options=angular.extend({},e,t),x=k.$promise=o.compile(S),C=k.$scope=S.scope&&S.scope.$new()||a.$new();S.element||S.container||(S.container='body'),k.$id=S.id||S.element&&S.element.attr('id')||'',f(['title','content'],function(e){S[e]&&(C[e]=s.trustAsHtml(S[e]))}),C.$hide=function(){C.$$postDigest(function(){k.hide()})},C.$show=function(){C.$$postDigest(function(){k.show()})},C.$toggle=function(){C.$$postDigest(function(){k.toggle()})},k.$isShown=C.$isShown=!1;var T,E,M,A=angular.element('<div class=\"'+S.prefixClass+'-backdrop\"/>');return A.css({position:'fixed',top:'0px',left:'0px',bottom:'0px',right:'0px'}),x.then(function(e){T=e,k.init()}),k.init=function(){S.show&&C.$$postDigest(function(){k.show()})},k.destroy=function(){D(),A&&(A.remove(),A=null),C.$destroy()},k.show=function(){if(!k.$isShown){var e,t;if(angular.isElement(S.container)?(e=S.container,t=S.container[0].lastChild?angular.element(S.container[0].lastChild):null):S.container?(e=d(S.container),t=e[0]&&e[0].lastChild?angular.element(e[0].lastChild):null):(e=null,t=S.element),E&&D(),M=k.$scope.$new(),E=k.$element=T.link(M,function(e,t){}),S.backdrop&&(E.css({'z-index':$+20*m}),A.css({'z-index':h+20*m}),m++),!C.$emit(S.prefixEvent+'.show.before',k).defaultPrevented){E.css({display:'block'}).addClass(S.placement),S.customClass&&E.addClass(S.customClass),S.animation&&(S.backdrop&&A.addClass(S.backdropAnimation),E.addClass(S.animation)),S.backdrop&&i.enter(A,g,null),angular.version.minor<=2?i.enter(E,e,t,n):i.enter(E,e,t).then(n),k.$isShown=C.$isShown=!0,c(C);var a=E[0];p(function(){a.focus()}),g.addClass(S.prefixClass+'-open'),S.animation&&g.addClass(S.prefixClass+'-with-'+S.animation),l(),v()}}},k.hide=function(){k.$isShown&&(S.backdrop&&m--,C.$emit(S.prefixEvent+'.hide.before',k).defaultPrevented||(angular.version.minor<=2?i.leave(E,r):i.leave(E).then(r),S.backdrop&&i.leave(A),k.$isShown=C.$isShown=!1,c(C),u(),w()))},k.toggle=function(){k.$isShown?k.hide():k.show()},k.focus=function(){E[0].focus()},k.$onKeyUp=function(e){27===e.which&&k.$isShown&&(k.hide(),e.stopPropagation())},k}function c(e){e.$$phase||e.$root&&e.$root.$$phase||e.$digest()}function d(e,n){return angular.element((n||t).querySelectorAll(e))}var f=angular.forEach,p=n.requestAnimationFrame||n.setTimeout,g=angular.element(n.document.body),m=0,$=1050,h=1040;return u}]}).directive('bsModal',['$window','$sce','$modal',function(e,t,n){return{restrict:'EAC',scope:!0,link:function(e,a,o,i){var r={scope:e,element:a,show:!1};angular.forEach(['template','templateUrl','controller','controllerAs','contentTemplate','placement','backdrop','keyboard','html','container','animation','backdropAnimation','id','prefixEvent','prefixClass','customClass','modalClass'],function(e){angular.isDefined(o[e])&&(r[e]=o[e])}),r.modalClass&&(r.customClass=r.modalClass);var s=/^(false|0|)$/i;angular.forEach(['backdrop','keyboard','html','container'],function(e){angular.isDefined(o[e])&&s.test(o[e])&&(r[e]=!1)}),angular.forEach(['title','content'],function(n){o[n]&&o.$observe(n,function(a,o){e[n]=t.trustAsHtml(a)})}),o.bsModal&&e.$watch(o.bsModal,function(t,n){angular.isObject(t)?angular.extend(e,t):e.content=t},!0);var l=n(r);a.on(o.trigger||'click',l.toggle),e.$on('$destroy',function(){l&&l.destroy(),r=null,l=null})}}}]),angular.version.minor<3&&angular.version.dot<14&&angular.module('ng').factory('$$rAF',['$window','$timeout',function(e,t){var n=e.requestAnimationFrame||e.webkitRequestAnimationFrame||e.mozRequestAnimationFrame,a=e.cancelAnimationFrame||e.webkitCancelAnimationFrame||e.mozCancelAnimationFrame||e.webkitCancelRequestAnimationFrame,o=!!n,i=o?function(e){var t=n(e);return function(){a(t)}}:function(e){var n=t(e,16.66,!1);return function(){t.cancel(n)}};return i.supported=o,i}]),angular.module('mgcrea.ngStrap.helpers.parseOptions',[]).provider('$parseOptions',function(){var e=this.defaults={regexp:/^\\s*(.*?)(?:\\s+as\\s+(.*?))?(?:\\s+group\\s+by\\s+(.*))?\\s+for\\s+(?:([\\$\\w][\\$\\w]*)|(?:\\(\\s*([\\$\\w][\\$\\w]*)\\s*,\\s*([\\$\\w][\\$\\w]*)\\s*\\)))\\s+in\\s+(.*?)(?:\\s+track\\s+by\\s+(.*?))?$/};this.$get=['$parse','$q',function(t,n){function a(a,o){function i(e,t){return e.map(function(e,n){var a,o,i={};return i[c]=e,a=u(t,i),o=p(t,i),{label:a,value:o,index:n}})}var r={},s=angular.extend({},e,o);r.$values=[];var l,u,c,d,f,p,g;return r.init=function(){r.$match=l=a.match(s.regexp),u=t(l[2]||l[1]),c=l[4]||l[6],d=l[5],f=t(l[3]||''),p=t(l[2]?l[1]:c),g=t(l[7])},r.valuesFn=function(e,t){return n.when(g(e,t)).then(function(t){return angular.isArray(t)||(t=[]),r.$values=t.length?i(t,e):[],r.$values})},r.displayValue=function(e){var t={};return t[c]=e,u(t)},r.init(),r}return a}]}),angular.module('mgcrea.ngStrap.helpers.dimensions',[]).factory('dimensions',function(){function t(e){var t=e.ownerDocument,o=e.offsetParent||t;if(a(o,'#document'))return t.documentElement;for(;o&&!a(o,'html')&&'static'===n.css(o,'position');)o=o.offsetParent;return o||t.documentElement}var n={},a=n.nodeName=function(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()};return n.css=function(t,n,a){var o;return o=t.currentStyle?t.currentStyle[n]:e.getComputedStyle?e.getComputedStyle(t)[n]:t.style[n],a===!0?parseFloat(o)||0:o},n.offset=function(t){var n=t.getBoundingClientRect(),a=t.ownerDocument;return{width:n.width||t.offsetWidth,height:n.height||t.offsetHeight,top:n.top+(e.pageYOffset||a.documentElement.scrollTop)-(a.documentElement.clientTop||0),left:n.left+(e.pageXOffset||a.documentElement.scrollLeft)-(a.documentElement.clientLeft||0)}},n.setOffset=function(e,t,a){var o,i,r,s,l,u,c,d=n.css(e,'position'),f=angular.element(e),p={};'static'===d&&(e.style.position='relative'),l=n.offset(e),r=n.css(e,'top'),u=n.css(e,'left'),c=('absolute'===d||'fixed'===d)&&(r+u).indexOf('auto')>-1,c?(o=n.position(e),s=o.top,i=o.left):(s=parseFloat(r)||0,i=parseFloat(u)||0),angular.isFunction(t)&&(t=t.call(e,a,l)),null!==t.top&&(p.top=t.top-l.top+s),null!==t.left&&(p.left=t.left-l.left+i),'using'in t?t.using.call(f,p):f.css({top:p.top+'px',left:p.left+'px'})},n.position=function(e){var o,i,r={top:0,left:0};return'fixed'===n.css(e,'position')?i=e.getBoundingClientRect():(o=t(e),i=n.offset(e),a(o,'html')||(r=n.offset(o)),r.top+=n.css(o,'borderTopWidth',!0),r.left+=n.css(o,'borderLeftWidth',!0)),{width:e.offsetWidth,height:e.offsetHeight,top:i.top-r.top-n.css(e,'marginTop',!0),left:i.left-r.left-n.css(e,'marginLeft',!0)}},n.height=function(e,t){var a=e.offsetHeight;return t?a+=n.css(e,'marginTop',!0)+n.css(e,'marginBottom',!0):a-=n.css(e,'paddingTop',!0)+n.css(e,'paddingBottom',!0)+n.css(e,'borderTopWidth',!0)+n.css(e,'borderBottomWidth',!0),a},n.width=function(e,t){var a=e.offsetWidth;return t?a+=n.css(e,'marginLeft',!0)+n.css(e,'marginRight',!0):a-=n.css(e,'paddingLeft',!0)+n.css(e,'paddingRight',!0)+n.css(e,'borderLeftWidth',!0)+n.css(e,'borderRightWidth',!0),a},n}),angular.module('mgcrea.ngStrap.helpers.debounce',[]).factory('debounce',['$timeout',function(e){return function(t,n,a){var o=null;return function(){var i=this,r=arguments,s=a&&!o;return o&&e.cancel(o),o=e(function(){o=null,a||t.apply(i,r)},n,!1),s&&t.apply(i,r),o}}}]).factory('throttle',['$timeout',function(e){return function(t,n,a){var o=null;return a||(a={}),function(){var i=this,r=arguments;o||(a.leading!==!1&&t.apply(i,r),o=e(function(){o=null,a.trailing!==!1&&t.apply(i,r)},n,!1))}}}]),angular.module('mgcrea.ngStrap.helpers.dateParser',[]).provider('$dateParser',['$localeProvider',function(e){function t(){this.year=1970,this.month=0,this.day=1,this.hours=0,this.minutes=0,this.seconds=0,this.milliseconds=0}function n(){}function a(e){return!isNaN(parseFloat(e))&&isFinite(e)}function o(e,t){for(var n=e.length,a=t.toString().toLowerCase(),o=0;n>o;o++)if(e[o].toLowerCase()===a)return o;return-1}t.prototype.setMilliseconds=function(e){this.milliseconds=e},t.prototype.setSeconds=function(e){this.seconds=e},t.prototype.setMinutes=function(e){this.minutes=e},t.prototype.setHours=function(e){this.hours=e},t.prototype.getHours=function(){return this.hours},t.prototype.setDate=function(e){this.day=e},t.prototype.setMonth=function(e){this.month=e},t.prototype.setFullYear=function(e){this.year=e},t.prototype.fromDate=function(e){return this.year=e.getFullYear(),this.month=e.getMonth(),this.day=e.getDate(),this.hours=e.getHours(),this.minutes=e.getMinutes(),this.seconds=e.getSeconds(),this.milliseconds=e.getMilliseconds(),this},t.prototype.toDate=function(){return new Date(this.year,this.month,this.day,this.hours,this.minutes,this.seconds,this.milliseconds)};var i=t.prototype,r=this.defaults={format:'shortDate',strict:!1};this.$get=['$locale','dateFilter',function(e,s){var l=function(l){function u(e){var t=c(e);return g(t)}function c(e){var t=d(e),n=t.replace(/''/g,'\\\\\\''),a=/('(?:\\\\'|.)*?')/,o=n.split(a),i=Object.keys(b),r=[];return angular.forEach(o,function(e){if(f(e))e=p(e);else for(var t=0;t<i.length;t++)e=e.split(i[t]).join('${'+t+'}');r.push(e)}),r.join('')}function d(e){return e.replace(/\\\\/g,'[\\\\\\\\]').replace(/-/g,'[-]').replace(/\\./g,'[.]').replace(/\\*/g,'[*]').replace(/\\+/g,'[+]').replace(/\\?/g,'[?]').replace(/\\$/g,'[$]').replace(/\\^/g,'[^]').replace(/\\//g,'[/]').replace(/\\\\s/g,'[\\\\s]')}function f(e){return/^'.*'$/.test(e)}function p(e){return e.replace(/^'(.*)'$/,'$1')}function g(e){for(var t=Object.keys(b),n=e,a=0;a<t.length;a++)n=n.split('${'+a+'}').join('('+b[t[a]]+')');return new RegExp('^'+n+'$',['i'])}function m(e){var t=c(e);return $(t)}function $(e){for(var t,n,a,o,i=Object.keys(b),r=new RegExp('\\\\${(\\\\d+)}','g'),s=[];null!==(t=r.exec(e));)n=t[1],a=i[n],o=D[a],s.push(o);return s}var h,v,w=angular.extend({},r,l),y={},b={sss:'[0-9]{3}',ss:'[0-5][0-9]',s:w.strict?'[1-5]?[0-9]':'[0-9]|[0-5][0-9]',mm:'[0-5][0-9]',m:w.strict?'[1-5]?[0-9]':'[0-9]|[0-5][0-9]',HH:'[01][0-9]|2[0-3]',H:w.strict?'1?[0-9]|2[0-3]':'[01]?[0-9]|2[0-3]',hh:'[0][1-9]|[1][012]',h:w.strict?'[1-9]|1[012]':'0?[1-9]|1[012]',a:'AM|PM',EEEE:e.DATETIME_FORMATS.DAY.join('|'),EEE:e.DATETIME_FORMATS.SHORTDAY.join('|'),dd:'0[1-9]|[12][0-9]|3[01]',d:w.strict?'[1-9]|[1-2][0-9]|3[01]':'0?[1-9]|[1-2][0-9]|3[01]',MMMM:e.DATETIME_FORMATS.MONTH.join('|'),MMM:e.DATETIME_FORMATS.SHORTMONTH.join('|'),MM:'0[1-9]|1[012]',M:w.strict?'[1-9]|1[012]':'0?[1-9]|1[012]',yyyy:'[1]{1}[0-9]{3}|[2]{1}[0-9]{3}',yy:'[0-9]{2}',y:w.strict?'-?(0|[1-9][0-9]{0,3})':'-?0*[0-9]{1,4}'},D={sss:i.setMilliseconds,ss:i.setSeconds,s:i.setSeconds,mm:i.setMinutes,m:i.setMinutes,HH:i.setHours,H:i.setHours,hh:i.setHours,h:i.setHours,EEEE:n,EEE:n,dd:i.setDate,d:i.setDate,a:function(e){var t=this.getHours()%12;return this.setHours(e.match(/pm/i)?t+12:t)},MMMM:function(t){return this.setMonth(o(e.DATETIME_FORMATS.MONTH,t))},MMM:function(t){return this.setMonth(o(e.DATETIME_FORMATS.SHORTMONTH,t))},MM:function(e){return this.setMonth(1*e-1)},M:function(e){return this.setMonth(1*e-1)},yyyy:i.setFullYear,yy:function(e){return this.setFullYear(2e3+1*e)},y:function(e){return 50>=1*e&&2===e.length?this.setFullYear(2e3+1*e):this.setFullYear(1*e)}};return y.init=function(){y.$format=e.DATETIME_FORMATS[w.format]||w.format,h=u(y.$format),v=m(y.$format)},y.isValid=function(e){return angular.isDate(e)?!isNaN(e.getTime()):h.test(e)},y.parse=function(n,a,o,i){o&&(o=e.DATETIME_FORMATS[o]||o),angular.isDate(n)&&(n=s(n,o||y.$format,i));var r=o?u(o):h,l=o?m(o):v,c=r.exec(n);if(!c)return!1;for(var d=a&&!isNaN(a.getTime())?(new t).fromDate(a):(new t).fromDate(new Date(1970,0,1,0)),f=0;f<c.length-1;f++)l[f]&&l[f].call(d,c[f+1]);var p=d.toDate();return parseInt(d.day,10)!==p.getDate()?!1:p},y.getDateForAttribute=function(e,t){var n;if('today'===t){var o=new Date;n=new Date(o.getFullYear(),o.getMonth(),o.getDate()+('maxDate'===e?1:0),0,0,0,'minDate'===e?0:-1)}else n=angular.isString(t)&&t.match(/^\".+\"$/)?new Date(t.substr(1,t.length-2)):a(t)?new Date(parseInt(t,10)):angular.isString(t)&&0===t.length?'minDate'===e?-(1/0):+(1/0):new Date(t);return n},y.getTimeForAttribute=function(e,t){var n;return n='now'===t?(new Date).setFullYear(1970,0,1):angular.isString(t)&&t.match(/^\".+\"$/)?new Date(t.substr(1,t.length-2)).setFullYear(1970,0,1):a(t)?new Date(parseInt(t,10)).setFullYear(1970,0,1):angular.isString(t)&&0===t.length?'minTime'===e?-(1/0):+(1/0):y.parse(t,new Date(1970,0,1,0))},y.daylightSavingAdjust=function(e){return e?(e.setHours(e.getHours()>12?e.getHours()+2:0),e):null},y.timezoneOffsetAdjust=function(e,t,n){return e?(t&&'UTC'===t&&(e=new Date(e.getTime()),e.setMinutes(e.getMinutes()+(n?-1:1)*e.getTimezoneOffset())),e):null},y.init(),y};return l}]}]),angular.module('mgcrea.ngStrap.helpers.dateFormatter',[]).service('$dateFormatter',['$locale','dateFilter',function(e,t){function n(e){return/(h+)([:\\.])?(m+)([:\\.])?(s*)[ ]?(a?)/i.exec(e).slice(1)}this.getDefaultLocale=function(){return e.id},this.getDatetimeFormat=function(t,n){return e.DATETIME_FORMATS[t]||t},this.weekdaysShort=function(t){return e.DATETIME_FORMATS.SHORTDAY},this.hoursFormat=function(e){return n(e)[0]},this.minutesFormat=function(e){return n(e)[2]},this.secondsFormat=function(e){return n(e)[4]},this.timeSeparator=function(e){return n(e)[1]},this.showSeconds=function(e){return!!n(e)[4]},this.showAM=function(e){return!!n(e)[5]},this.formatDate=function(e,n,a,o){return t(e,n,o)}}]),angular.module('mgcrea.ngStrap.core',[]).service('$bsCompiler',a),angular.module('mgcrea.ngStrap.dropdown',['mgcrea.ngStrap.tooltip']).provider('$dropdown',function(){var e=this.defaults={animation:'am-fade',prefixClass:'dropdown',prefixEvent:'dropdown',placement:'bottom-left',templateUrl:'dropdown/dropdown.tpl.html',trigger:'click',container:!1,keyboard:!0,html:!1,delay:0};this.$get=['$window','$rootScope','$tooltip','$timeout',function(t,n,a,o){function i(t,i){function l(e){return e.target!==t[0]?e.target!==t[0]&&u.hide():void 0}var u={},c=angular.extend({},e,i);u.$scope=c.scope&&c.scope.$new()||n.$new(),u=a(t,c);var d=t.parent();u.$onKeyDown=function(e){if(/(38|40)/.test(e.keyCode)){e.preventDefault(),e.stopPropagation();var t=angular.element(u.$element[0].querySelectorAll('li:not(.divider) a'));if(t.length){var n;angular.forEach(t,function(e,t){s&&s.call(e,':focus')&&(n=t)}),38===e.keyCode&&n>0?n--:40===e.keyCode&&n<t.length-1?n++:angular.isUndefined(n)&&(n=0),t.eq(n)[0].focus()}}};var f=u.show;u.show=function(){f(),o(function(){c.keyboard&&u.$element&&u.$element.on('keydown',u.$onKeyDown),r.on('click',l)},0,!1),d.hasClass('dropdown')&&d.addClass('open')};var p=u.hide;u.hide=function(){u.$isShown&&(c.keyboard&&u.$element&&u.$element.off('keydown',u.$onKeyDown),r.off('click',l),d.hasClass('dropdown')&&d.removeClass('open'),p())};var g=u.destroy;return u.destroy=function(){r.off('click',l),g()},u}var r=angular.element(t.document.body),s=Element.prototype.matchesSelector||Element.prototype.webkitMatchesSelector||Element.prototype.mozMatchesSelector||Element.prototype.msMatchesSelector||Element.prototype.oMatchesSelector;return i}]}).directive('bsDropdown',['$window','$sce','$dropdown',function(e,t,a){return{restrict:'EAC',scope:!0,compile:function(e,t){if(!t.bsDropdown){for(var o=e[0].nextSibling;o&&1!==o.nodeType;)o=o.nextSibling;o&&o.classList.contains('dropdown-menu')&&(t.template=o.outerHTML,t.templateUrl=n,o.parentNode.removeChild(o))}return function(e,n,o){var i={scope:e};angular.forEach(['template','templateUrl','controller','controllerAs','placement','container','delay','trigger','keyboard','html','animation','id','autoClose'],function(e){angular.isDefined(t[e])&&(i[e]=t[e])});var r=/^(false|0|)$/i;angular.forEach(['html','container'],function(e){angular.isDefined(o[e])&&r.test(o[e])&&(i[e]=!1)}),o.bsDropdown&&e.$watch(o.bsDropdown,function(t,n){e.content=t},!0);var s=a(n,i);o.bsShow&&e.$watch(o.bsShow,function(e,t){s&&angular.isDefined(e)&&(angular.isString(e)&&(e=!!e.match(/true|,?(dropdown),?/i)),e===!0?s.show():s.hide())}),e.$on('$destroy',function(){s&&s.destroy(),i=null,s=null})}}}}]),angular.module('mgcrea.ngStrap.datepicker',['mgcrea.ngStrap.helpers.dateParser','mgcrea.ngStrap.helpers.dateFormatter','mgcrea.ngStrap.tooltip']).provider('$datepicker',function(){var e=this.defaults={animation:'am-fade',prefixClass:'datepicker',placement:'bottom-left',templateUrl:'datepicker/datepicker.tpl.html',trigger:'focus',container:!1,keyboard:!0,html:!1,delay:0,useNative:!1,dateType:'date',dateFormat:'shortDate',timezone:null,modelDateFormat:null,dayFormat:'dd',monthFormat:'MMM',yearFormat:'yyyy',monthTitleFormat:'MMMM yyyy',yearTitleFormat:'yyyy',strictFormat:!1,autoclose:!1,minDate:-(1/0),maxDate:+(1/0),startView:0,minView:0,startWeek:0,daysOfWeekDisabled:'',iconLeft:'glyphicon glyphicon-chevron-left',iconRight:'glyphicon glyphicon-chevron-right'};this.$get=['$window','$document','$rootScope','$sce','$dateFormatter','datepickerViews','$tooltip','$timeout',function(t,n,a,o,i,r,s,l){function u(t,n,a){function o(e){e.selected=u.$isSelected(e.date)}function i(){t[0].focus()}var u=s(t,angular.extend({},e,a)),f=a.scope,p=u.$options,g=u.$scope;p.startView&&(p.startView-=p.minView);var m=r(u);u.$views=m.views;var $=m.viewDate;g.$mode=p.startView,g.$iconLeft=p.iconLeft,g.$iconRight=p.iconRight;var h=u.$views[g.$mode];g.$select=function(e){u.select(e)},g.$selectPane=function(e){u.$selectPane(e)},g.$toggleMode=function(){u.setMode((g.$mode+1)%u.$views.length)},u.update=function(e){angular.isDate(e)&&!isNaN(e.getTime())&&(u.$date=e,h.update.call(h,e)),u.$build(!0)},u.updateDisabledDates=function(e){p.disabledDateRanges=e;for(var t=0,n=g.rows.length;n>t;t++)angular.forEach(g.rows[t],u.$setDisabledEl)},u.select=function(e,t){angular.isDate(n.$dateValue)||(n.$dateValue=new Date(e)),!g.$mode||t?(n.$setViewValue(angular.copy(e)),n.$render(),p.autoclose&&!t&&l(function(){u.hide(!0)})):(angular.extend($,{year:e.getFullYear(),month:e.getMonth(),date:e.getDate()}),u.setMode(g.$mode-1),u.$build())},u.setMode=function(e){g.$mode=e,h=u.$views[g.$mode],u.$build()},u.$build=function(e){e===!0&&h.built||(e!==!1||h.built)&&h.build.call(h)},u.$updateSelected=function(){for(var e=0,t=g.rows.length;t>e;e++)angular.forEach(g.rows[e],o)},u.$isSelected=function(e){return h.isSelected(e)},u.$setDisabledEl=function(e){e.disabled=h.isDisabled(e.date)},u.$selectPane=function(e){var t=h.steps,n=new Date(Date.UTC($.year+(t.year||0)*e,$.month+(t.month||0)*e,1));angular.extend($,{year:n.getUTCFullYear(),month:n.getUTCMonth(),date:n.getUTCDate()}),u.$build()},u.$onMouseDown=function(e){if(e.preventDefault(),e.stopPropagation(),d){var t=angular.element(e.target);'button'!==t[0].nodeName.toLowerCase()&&(t=t.parent()),t.triggerHandler('click')}},u.$onKeyDown=function(e){if(/(38|37|39|40|13)/.test(e.keyCode)&&!e.shiftKey&&!e.altKey){if(e.preventDefault(),e.stopPropagation(),13===e.keyCode)return void(g.$mode?g.$apply(function(){u.setMode(g.$mode-1)}):u.hide(!0));h.onKeyDown(e),f.$digest()}};var v=u.init;u.init=function(){return c&&p.useNative?(t.prop('type','date'),void t.css('-webkit-appearance','textfield')):(d&&(t.prop('type','text'),t.attr('readonly','true'),t.on('click',i)),void v())};var w=u.destroy;u.destroy=function(){c&&p.useNative&&t.off('click',i),w()};var y=u.show;u.show=function(){!d&&t.attr('readonly')||t.attr('disabled')||(y(),l(function(){u.$isShown&&(u.$element.on(d?'touchstart':'mousedown',u.$onMouseDown),p.keyboard&&t.on('keydown',u.$onKeyDown))},0,!1))};var b=u.hide;return u.hide=function(e){u.$isShown&&(u.$element.off(d?'touchstart':'mousedown',u.$onMouseDown),p.keyboard&&t.off('keydown',u.$onKeyDown),b(e))},u}var c=/(ip[ao]d|iphone|android)/gi.test(t.navigator.userAgent),d='createTouch'in t.document&&c;return e.lang||(e.lang=i.getDefaultLocale()),u.defaults=e,u}]}).directive('bsDatepicker',['$window','$parse','$q','$dateFormatter','$dateParser','$datepicker',function(e,t,n,a,o,i){var r=/(ip[ao]d|iphone|android)/gi.test(e.navigator.userAgent);return{restrict:'EAC',require:'ngModel',link:function(e,t,n,s){function l(e){return e&&e.length?e:null}function u(e){if(angular.isDate(e)){var t=isNaN(p.$options.minDate)||e.getTime()>=p.$options.minDate,n=isNaN(p.$options.maxDate)||e.getTime()<=p.$options.maxDate,a=t&&n;s.$setValidity('date',a),s.$setValidity('min',t),s.$setValidity('max',n),a&&(s.$dateValue=e)}}function c(){return!s.$dateValue||isNaN(s.$dateValue.getTime())?'':m(s.$dateValue,d.dateFormat)}var d={scope:e};angular.forEach(['template','templateUrl','controller','controllerAs','placement','container','delay','trigger','html','animation','autoclose','dateType','dateFormat','timezone','modelDateFormat','dayFormat','strictFormat','startWeek','startDate','useNative','lang','startView','minView','iconLeft','iconRight','daysOfWeekDisabled','id','prefixClass','prefixEvent'],function(e){angular.isDefined(n[e])&&(d[e]=n[e])});var f=/^(false|0|)$/i;angular.forEach(['html','container','autoclose','useNative'],function(e){angular.isDefined(n[e])&&f.test(n[e])&&(d[e]=!1)});var p=i(t,s,d);d=p.$options,r&&d.useNative&&(d.dateFormat='yyyy-MM-dd');var g=d.lang,m=function(e,t){return a.formatDate(e,t,g)},$=o({format:d.dateFormat,lang:g,strict:d.strictFormat});n.bsShow&&e.$watch(n.bsShow,function(e,t){p&&angular.isDefined(e)&&(angular.isString(e)&&(e=!!e.match(/true|,?(datepicker),?/i)),e===!0?p.show():p.hide())}),angular.forEach(['minDate','maxDate'],function(e){angular.isDefined(n[e])&&n.$observe(e,function(t){p.$options[e]=$.getDateForAttribute(e,t),isNaN(p.$options[e])||p.$build(!1),u(s.$dateValue)})}),angular.isDefined(n.dateFormat)&&n.$observe('dateFormat',function(e){p.$options.dateFormat=e}),e.$watch(n.ngModel,function(e,t){p.update(s.$dateValue)},!0),angular.isDefined(n.disabledDates)&&e.$watch(n.disabledDates,function(e,t){e=l(e),t=l(t),e&&p.updateDisabledDates(e)}),s.$parsers.unshift(function(e){var t;if(!e)return s.$setValidity('date',!0),null;var n=$.parse(e,s.$dateValue);return!n||isNaN(n.getTime())?void s.$setValidity('date',!1):(u(n),'string'===d.dateType?(t=$.timezoneOffsetAdjust(n,d.timezone,!0),m(t,d.modelDateFormat||d.dateFormat)):(t=$.timezoneOffsetAdjust(s.$dateValue,d.timezone,!0),'number'===d.dateType?t.getTime():'unix'===d.dateType?t.getTime()/1e3:'iso'===d.dateType?t.toISOString():new Date(t)))}),s.$formatters.push(function(e){var t;return t=angular.isUndefined(e)||null===e?NaN:angular.isDate(e)?e:'string'===d.dateType?$.parse(e,null,d.modelDateFormat):'unix'===d.dateType?new Date(1e3*e):new Date(e),s.$dateValue=$.timezoneOffsetAdjust(t,d.timezone),c()}),s.$render=function(){t.val(c())},e.$on('$destroy',function(){p&&p.destroy(),d=null,p=null})}}}]).provider('datepickerViews',function(){function e(e,t){for(var n=[];e.length>0;)n.push(e.splice(0,t));return n}function t(e,t){return(e%t+t)%t}this.$get=['$dateFormatter','$dateParser','$sce',function(n,a,o){return function(i){var r=i.$scope,s=i.$options,l=s.lang,u=function(e,t){return n.formatDate(e,t,l)},c=a({format:s.dateFormat,lang:l,strict:s.strictFormat}),d=n.weekdaysShort(l),f=d.slice(s.startWeek).concat(d.slice(0,s.startWeek)),p=o.trustAsHtml('<th class=\"dow text-center\">'+f.join('</th><th class=\"dow text-center\">')+'</th>'),g=i.$date||(s.startDate?c.getDateForAttribute('startDate',s.startDate):new Date),m={year:g.getFullYear(),month:g.getMonth(),date:g.getDate()},$=[{format:s.dayFormat,split:7,steps:{month:1},update:function(e,t){!this.built||t||e.getFullYear()!==m.year||e.getMonth()!==m.month?(angular.extend(m,{year:i.$date.getFullYear(),month:i.$date.getMonth(),date:i.$date.getDate()}),i.$build()):(e.getDate()!==m.date||1===e.getDate())&&(m.date=i.$date.getDate(),i.$updateSelected())},build:function(){var n=new Date(m.year,m.month,1),a=n.getTimezoneOffset(),o=new Date(+n-864e5*t(n.getDay()-s.startWeek,7)),l=o.getTimezoneOffset(),d=c.timezoneOffsetAdjust(new Date,s.timezone).toDateString();l!==a&&(o=new Date(+o+6e4*(l-a)));for(var f,g=[],$=0;42>$;$++)f=c.daylightSavingAdjust(new Date(o.getFullYear(),o.getMonth(),o.getDate()+$)),g.push({date:f,isToday:f.toDateString()===d,label:u(f,this.format),selected:i.$date&&this.isSelected(f),muted:f.getMonth()!==m.month,disabled:this.isDisabled(f)});r.title=u(n,s.monthTitleFormat),r.showLabels=!0,r.labels=p,r.rows=e(g,this.split),this.built=!0},isSelected:function(e){return i.$date&&e.getFullYear()===i.$date.getFullYear()&&e.getMonth()===i.$date.getMonth()&&e.getDate()===i.$date.getDate()},isDisabled:function(e){var t=e.getTime();if(t<s.minDate||t>s.maxDate)return!0;if(-1!==s.daysOfWeekDisabled.indexOf(e.getDay()))return!0;if(s.disabledDateRanges)for(var n=0;n<s.disabledDateRanges.length;n++)if(t>=s.disabledDateRanges[n].start&&t<=s.disabledDateRanges[n].end)return!0;return!1},onKeyDown:function(e){if(i.$date){var t,n=i.$date.getTime();37===e.keyCode?t=new Date(n-864e5):38===e.keyCode?t=new Date(n-6048e5):39===e.keyCode?t=new Date(n+864e5):40===e.keyCode&&(t=new Date(n+6048e5)),this.isDisabled(t)||i.select(t,!0);\n}}},{name:'month',format:s.monthFormat,split:4,steps:{year:1},update:function(e,t){this.built&&e.getFullYear()===m.year?e.getMonth()!==m.month&&(angular.extend(m,{month:i.$date.getMonth(),date:i.$date.getDate()}),i.$updateSelected()):(angular.extend(m,{year:i.$date.getFullYear(),month:i.$date.getMonth(),date:i.$date.getDate()}),i.$build())},build:function(){for(var t,n=[],a=0;12>a;a++)t=new Date(m.year,a,1),n.push({date:t,label:u(t,this.format),selected:i.$isSelected(t),disabled:this.isDisabled(t)});r.title=u(t,s.yearTitleFormat),r.showLabels=!1,r.rows=e(n,this.split),this.built=!0},isSelected:function(e){return i.$date&&e.getFullYear()===i.$date.getFullYear()&&e.getMonth()===i.$date.getMonth()},isDisabled:function(e){var t=+new Date(e.getFullYear(),e.getMonth()+1,0);return t<s.minDate||e.getTime()>s.maxDate},onKeyDown:function(e){if(i.$date){var t=i.$date.getMonth(),n=new Date(i.$date);37===e.keyCode?n.setMonth(t-1):38===e.keyCode?n.setMonth(t-4):39===e.keyCode?n.setMonth(t+1):40===e.keyCode&&n.setMonth(t+4),this.isDisabled(n)||i.select(n,!0)}}},{name:'year',format:s.yearFormat,split:4,steps:{year:12},update:function(e,t){!this.built||t||parseInt(e.getFullYear()/20,10)!==parseInt(m.year/20,10)?(angular.extend(m,{year:i.$date.getFullYear(),month:i.$date.getMonth(),date:i.$date.getDate()}),i.$build()):e.getFullYear()!==m.year&&(angular.extend(m,{year:i.$date.getFullYear(),month:i.$date.getMonth(),date:i.$date.getDate()}),i.$updateSelected())},build:function(){for(var t,n=m.year-m.year%(3*this.split),a=[],o=0;12>o;o++)t=new Date(n+o,0,1),a.push({date:t,label:u(t,this.format),selected:i.$isSelected(t),disabled:this.isDisabled(t)});r.title=a[0].label+'-'+a[a.length-1].label,r.showLabels=!1,r.rows=e(a,this.split),this.built=!0},isSelected:function(e){return i.$date&&e.getFullYear()===i.$date.getFullYear()},isDisabled:function(e){var t=+new Date(e.getFullYear()+1,0,0);return t<s.minDate||e.getTime()>s.maxDate},onKeyDown:function(e){if(i.$date){var t=i.$date.getFullYear(),n=new Date(i.$date);37===e.keyCode?n.setYear(t-1):38===e.keyCode?n.setYear(t-4):39===e.keyCode?n.setYear(t+1):40===e.keyCode&&n.setYear(t+4),this.isDisabled(n)||i.select(n,!0)}}}];return{views:s.minView?Array.prototype.slice.call($,s.minView):$,viewDate:m}}}]}),angular.module('mgcrea.ngStrap.collapse',[]).provider('$collapse',function(){var e=this.defaults={animation:'am-collapse',disallowToggle:!1,activeClass:'in',startCollapsed:!1,allowMultiple:!1},t=this.controller=function(t,n,a){function o(e){for(var t=l.$targets.$active,n=0;n<t.length;n++)e<t[n]&&(t[n]=t[n]-1),t[n]===l.$targets.length&&(t[n]=l.$targets.length-1)}function i(e){var t=l.$targets.$active;return-1===t.indexOf(e)?!1:!0}function r(e){var t=l.$targets.$active.indexOf(e);-1!==t&&l.$targets.$active.splice(t,1)}function s(e){l.$options.allowMultiple||l.$targets.$active.splice(0,1),-1===l.$targets.$active.indexOf(e)&&l.$targets.$active.push(e)}var l=this;l.$options=angular.copy(e),angular.forEach(['animation','disallowToggle','activeClass','startCollapsed','allowMultiple'],function(e){angular.isDefined(a[e])&&(l.$options[e]=a[e])});var u=/^(false|0|)$/i;angular.forEach(['disallowToggle','startCollapsed','allowMultiple'],function(e){angular.isDefined(a[e])&&u.test(a[e])&&(l.$options[e]=!1)}),l.$toggles=[],l.$targets=[],l.$viewChangeListeners=[],l.$registerToggle=function(e){l.$toggles.push(e)},l.$registerTarget=function(e){l.$targets.push(e)},l.$unregisterToggle=function(e){var t=l.$toggles.indexOf(e);l.$toggles.splice(t,1)},l.$unregisterTarget=function(e){var t=l.$targets.indexOf(e);l.$targets.splice(t,1),l.$options.allowMultiple&&r(e),o(t),l.$viewChangeListeners.forEach(function(e){e()})},l.$targets.$active=l.$options.startCollapsed?[]:[0],l.$setActive=t.$setActive=function(e){angular.isArray(e)?l.$targets.$active=e:!l.$options.disallowToggle&&i(e)?r(e):s(e),l.$viewChangeListeners.forEach(function(e){e()})},l.$activeIndexes=function(){return l.$options.allowMultiple?l.$targets.$active:1===l.$targets.$active.length?l.$targets.$active[0]:-1}};this.$get=function(){var n={};return n.defaults=e,n.controller=t,n}}).directive('bsCollapse',['$window','$animate','$collapse',function(e,t,n){return{require:['?ngModel','bsCollapse'],controller:['$scope','$element','$attrs',n.controller],link:function(e,t,n,a){var o=a[0],i=a[1];o&&(i.$viewChangeListeners.push(function(){o.$setViewValue(i.$activeIndexes())}),o.$formatters.push(function(e){if(angular.isArray(e))i.$setActive(e);else{var t=i.$activeIndexes();angular.isArray(t)?-1===t.indexOf(1*e)&&i.$setActive(1*e):t!==1*e&&i.$setActive(1*e)}return e}))}}}]).directive('bsCollapseToggle',function(){return{require:['^?ngModel','^bsCollapse'],link:function(e,t,n,a){var o=a[1];t.attr('data-toggle','collapse'),o.$registerToggle(t),e.$on('$destroy',function(){o.$unregisterToggle(t)}),t.on('click',function(){if(!n.disabled){var a=n.bsCollapseToggle&&'bs-collapse-toggle'!==n.bsCollapseToggle?n.bsCollapseToggle:o.$toggles.indexOf(t);o.$setActive(1*a),e.$apply()}})}}}).directive('bsCollapseTarget',['$animate',function(e){return{require:['^?ngModel','^bsCollapse'],link:function(t,n,a,o){function i(){var t=r.$targets.indexOf(n),a=r.$activeIndexes(),o='removeClass';angular.isArray(a)?-1!==a.indexOf(t)&&(o='addClass'):t===a&&(o='addClass'),e[o](n,r.$options.activeClass)}var r=o[1];n.addClass('collapse'),r.$options.animation&&n.addClass(r.$options.animation),r.$registerTarget(n),t.$on('$destroy',function(){r.$unregisterTarget(n)}),r.$viewChangeListeners.push(function(){i()}),i()}}}]),angular.module('mgcrea.ngStrap.button',[]).provider('$button',function(){var e=this.defaults={activeClass:'active',toggleEvent:'click'};this.$get=function(){return{defaults:e}}}).directive('bsCheckboxGroup',function(){return{restrict:'A',require:'ngModel',compile:function(e,t){e.attr('data-toggle','buttons'),e.removeAttr('ng-model');var n=e[0].querySelectorAll('input[type=\"checkbox\"]');angular.forEach(n,function(e){var n=angular.element(e);n.attr('bs-checkbox',''),n.attr('ng-model',t.ngModel+'.'+n.attr('value'))})}}}).directive('bsCheckbox',['$button','$$rAF',function(e,t){var n=e.defaults,a=/^(true|false|\\d+)$/;return{restrict:'A',require:'ngModel',link:function(e,o,i,r){var s=n,l='INPUT'===o[0].nodeName,u=l?o.parent():o,c=angular.isDefined(i.trueValue)?i.trueValue:!0;a.test(i.trueValue)&&(c=e.$eval(i.trueValue));var d=angular.isDefined(i.falseValue)?i.falseValue:!1;a.test(i.falseValue)&&(d=e.$eval(i.falseValue));var f='boolean'!=typeof c||'boolean'!=typeof d;f&&(r.$parsers.push(function(e){return e?c:d}),r.$formatters.push(function(e){return angular.equals(e,c)}),e.$watch(i.ngModel,function(e,t){r.$render()})),r.$render=function(){var e=angular.equals(r.$modelValue,c);t(function(){l&&(o[0].checked=e),u.toggleClass(s.activeClass,e)})},o.bind(s.toggleEvent,function(){e.$apply(function(){l||r.$setViewValue(!u.hasClass('active')),f||r.$render()})})}}}]).directive('bsRadioGroup',function(){return{restrict:'A',require:'ngModel',compile:function(e,t){e.attr('data-toggle','buttons'),e.removeAttr('ng-model');var n=e[0].querySelectorAll('input[type=\"radio\"]');angular.forEach(n,function(e){angular.element(e).attr('bs-radio',''),angular.element(e).attr('ng-model',t.ngModel)})}}}).directive('bsRadio',['$button','$$rAF',function(e,t){var n=e.defaults,a=/^(true|false|\\d+)$/;return{restrict:'A',require:'ngModel',link:function(e,o,i,r){var s,l=n,u='INPUT'===o[0].nodeName,c=u?o.parent():o;i.$observe('value',function(t){s=a.test(t)?e.$eval(t):t,r.$render()}),r.$render=function(){var e=angular.equals(r.$modelValue,s);t(function(){u&&(o[0].checked=e),c.toggleClass(l.activeClass,e)})},o.bind(l.toggleEvent,function(){e.$apply(function(){r.$setViewValue(s),r.$render()})})}}}]),angular.module('mgcrea.ngStrap.aside',['mgcrea.ngStrap.modal']).provider('$aside',function(){var e=this.defaults={animation:'am-fade-and-slide-right',prefixClass:'aside',prefixEvent:'aside',placement:'right',templateUrl:'aside/aside.tpl.html',contentTemplate:!1,container:!1,element:null,backdrop:!0,keyboard:!0,html:!1,show:!0};this.$get=['$modal',function(t){function n(n){var a={},o=angular.extend({},e,n);return a=t(o)}return n}]}).directive('bsAside',['$window','$sce','$aside',function(e,t,n){return{restrict:'EAC',scope:!0,link:function(e,a,o,i){var r={scope:e,element:a,show:!1};angular.forEach(['template','templateUrl','controller','controllerAs','contentTemplate','placement','backdrop','keyboard','html','container','animation'],function(e){angular.isDefined(o[e])&&(r[e]=o[e])});var s=/^(false|0|)$/i;angular.forEach(['backdrop','keyboard','html','container'],function(e){angular.isDefined(o[e])&&s.test(o[e])&&(r[e]=!1)}),angular.forEach(['title','content'],function(n){o[n]&&o.$observe(n,function(a,o){e[n]=t.trustAsHtml(a)})}),o.bsAside&&e.$watch(o.bsAside,function(t,n){angular.isObject(t)?angular.extend(e,t):e.content=t},!0);var l=n(r);a.on(o.trigger||'click',l.toggle),e.$on('$destroy',function(){l&&l.destroy(),r=null,l=null})}}}]),angular.module('mgcrea.ngStrap.alert',['mgcrea.ngStrap.modal']).provider('$alert',function(){var e=this.defaults={animation:'am-fade',prefixClass:'alert',prefixEvent:'alert',placement:null,templateUrl:'alert/alert.tpl.html',container:!1,element:null,backdrop:!1,keyboard:!0,show:!0,duration:!1,type:!1,dismissable:!0};this.$get=['$modal','$timeout',function(t,n){function a(a){var o={},i=angular.extend({},e,a);o=t(i),o.$scope.dismissable=!!i.dismissable,i.type&&(o.$scope.type=i.type);var r=o.show;return i.duration&&(o.show=function(){r(),n(function(){o.hide()},1e3*i.duration)}),o}return a}]}).directive('bsAlert',['$window','$sce','$alert',function(e,t,n){return{restrict:'EAC',scope:!0,link:function(e,a,o,i){var r={scope:e,element:a,show:!1};angular.forEach(['template','templateUrl','controller','controllerAs','placement','keyboard','html','container','animation','duration','dismissable'],function(e){angular.isDefined(o[e])&&(r[e]=o[e])});var s=/^(false|0|)$/i;angular.forEach(['keyboard','html','container','dismissable'],function(e){angular.isDefined(o[e])&&s.test(o[e])&&(r[e]=!1)}),e.hasOwnProperty('title')||(e.title=''),angular.forEach(['title','content','type'],function(n){o[n]&&o.$observe(n,function(a,o){e[n]=t.trustAsHtml(a)})}),o.bsAlert&&e.$watch(o.bsAlert,function(t,n){angular.isObject(t)?angular.extend(e,t):e.content=t},!0);var l=n(r);a.on(o.trigger||'click',l.toggle),e.$on('$destroy',function(){l&&l.destroy(),r=null,l=null})}}}]),angular.module('mgcrea.ngStrap.affix',['mgcrea.ngStrap.helpers.dimensions','mgcrea.ngStrap.helpers.debounce']).provider('$affix',function(){var e=this.defaults={offsetTop:'auto',inlineStyles:!0};this.$get=['$window','debounce','dimensions',function(t,n,a){function o(o,s){function l(e,t,n){var a=u(),o=c();return v>=a?'top':null!==e&&a+e<=t.top?'middle':null!==w&&t.top+n+$>=o-w?'bottom':'middle'}function u(){return p[0]===t?t.pageYOffset:p[0].scrollTop}function c(){return p[0]===t?t.document.body.scrollHeight:p[0].scrollHeight}var d={},f=angular.extend({},e,s),p=f.target,g='affix affix-top affix-bottom',m=!1,$=0,h=0,v=0,w=0,y=null,b=null,D=o.parent();if(f.offsetParent)if(f.offsetParent.match(/^\\d+$/))for(var k=0;k<1*f.offsetParent-1;k++)D=D.parent();else D=angular.element(f.offsetParent);return d.init=function(){this.$parseOffsets(),h=a.offset(o[0]).top+$,m=!o[0].style.width,p.on('scroll',this.checkPosition),p.on('click',this.checkPositionWithEventLoop),r.on('resize',this.$debouncedOnResize),this.checkPosition(),this.checkPositionWithEventLoop()},d.destroy=function(){p.off('scroll',this.checkPosition),p.off('click',this.checkPositionWithEventLoop),r.off('resize',this.$debouncedOnResize)},d.checkPositionWithEventLoop=function(){setTimeout(d.checkPosition,1)},d.checkPosition=function(){var e=u(),t=a.offset(o[0]),n=a.height(o[0]),r=l(b,t,n);y!==r&&(y=r,'top'===r?(b=null,m&&o.css('width',''),f.inlineStyles&&(o.css('position',f.offsetParent?'':'relative'),o.css('top',''))):'bottom'===r?(b=f.offsetUnpin?-(1*f.offsetUnpin):t.top-e,m&&o.css('width',''),f.inlineStyles&&(o.css('position',f.offsetParent?'':'relative'),o.css('top',f.offsetParent?'':i[0].offsetHeight-w-n-h+'px'))):(b=null,m&&o.css('width',o[0].offsetWidth+'px'),f.inlineStyles&&(o.css('position','fixed'),o.css('top',$+'px'))),o.removeClass(g).addClass('affix'+('middle'!==r?'-'+r:'')))},d.$onResize=function(){d.$parseOffsets(),d.checkPosition()},d.$debouncedOnResize=n(d.$onResize,50),d.$parseOffsets=function(){var e=o.css('position');f.inlineStyles&&o.css('position',f.offsetParent?'':'relative'),f.offsetTop&&('auto'===f.offsetTop&&(f.offsetTop='+0'),f.offsetTop.match(/^[-+]\\d+$/)?($=1*-f.offsetTop,v=f.offsetParent?a.offset(D[0]).top+1*f.offsetTop:a.offset(o[0]).top-a.css(o[0],'marginTop',!0)+1*f.offsetTop):v=1*f.offsetTop),f.offsetBottom&&(w=f.offsetParent&&f.offsetBottom.match(/^[-+]\\d+$/)?c()-(a.offset(D[0]).top+a.height(D[0]))+1*f.offsetBottom+1:1*f.offsetBottom),f.inlineStyles&&o.css('position',e)},d.init(),d}var i=angular.element(t.document.body),r=angular.element(t);return o}]}).directive('bsAffix',['$affix','$window',function(e,t){return{restrict:'EAC',require:'^?bsAffixTarget',link:function(n,a,o,i){var r={scope:n,target:i?i.$element:angular.element(t)};angular.forEach(['offsetTop','offsetBottom','offsetParent','offsetUnpin','inlineStyles'],function(e){if(angular.isDefined(o[e])){var t=o[e];/true/i.test(t)&&(t=!0),/false/i.test(t)&&(t=!1),r[e]=t}});var s=e(a,r);n.$on('$destroy',function(){s&&s.destroy(),r=null,s=null})}}}]).directive('bsAffixTarget',function(){return{controller:['$element',function(e){this.$element=e}]}}),angular.module('mgcrea.ngStrap',['mgcrea.ngStrap.modal','mgcrea.ngStrap.aside','mgcrea.ngStrap.alert','mgcrea.ngStrap.button','mgcrea.ngStrap.select','mgcrea.ngStrap.datepicker','mgcrea.ngStrap.timepicker','mgcrea.ngStrap.navbar','mgcrea.ngStrap.tooltip','mgcrea.ngStrap.popover','mgcrea.ngStrap.dropdown','mgcrea.ngStrap.typeahead','mgcrea.ngStrap.scrollspy','mgcrea.ngStrap.affix','mgcrea.ngStrap.tab','mgcrea.ngStrap.collapse'])}(window,document);\n//# sourceMappingURL=angular-strap.min.js.map\n\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTEuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ib3dlcl9jb21wb25lbnRzL2FuZ3VsYXItc3RyYXAvZGlzdC9hbmd1bGFyLXN0cmFwLm1pbi5qcz9iNTk0Il0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogYW5ndWxhci1zdHJhcFxuICogQHZlcnNpb24gdjIuMy43IC0gMjAxNi0wMS0xNlxuICogQGxpbmsgaHR0cDovL21nY3JlYS5naXRodWIuaW8vYW5ndWxhci1zdHJhcFxuICogQGF1dGhvciBPbGl2aWVyIExvdXZpZ25lcyA8b2xpdmllckBtZy1jcmVhLmNvbT4gKGh0dHBzOi8vZ2l0aHViLmNvbS9tZ2NyZWEpXG4gKiBAbGljZW5zZSBNSVQgTGljZW5zZSwgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVRcbiAqL1xuIWZ1bmN0aW9uKGUsdCxuKXsndXNlIHN0cmljdCc7ZnVuY3Rpb24gYShlLG4sYSxvLGkscil7ZnVuY3Rpb24gcyhlLG4pe3JldHVybiBhbmd1bGFyLmVsZW1lbnQoKG58fHQpLnF1ZXJ5U2VsZWN0b3JBbGwoZSkpfWZ1bmN0aW9uIGwoZSl7cmV0dXJuIHVbZV0/dVtlXTp1W2VdPW4uZ2V0KGUse2NhY2hlOnJ9KS50aGVuKGZ1bmN0aW9uKGUpe3JldHVybiBlLmRhdGF9KX10aGlzLmNvbXBpbGU9ZnVuY3Rpb24odCl7dC50ZW1wbGF0ZSYmL1xcLmh0bWwkLy50ZXN0KHQudGVtcGxhdGUpJiYoY29uc29sZS53YXJuKCdEZXByZWNhdGVkIHVzZSBvZiBgdGVtcGxhdGVgIG9wdGlvbiB0byBwYXNzIGEgZmlsZS4gUGxlYXNlIHVzZSB0aGUgYHRlbXBsYXRlVXJsYCBvcHRpb24gaW5zdGVhZC4nKSx0LnRlbXBsYXRlVXJsPXQudGVtcGxhdGUsdC50ZW1wbGF0ZT0nJyk7dmFyIG49dC50ZW1wbGF0ZVVybCxyPXQudGVtcGxhdGV8fCcnLHU9dC5jb250cm9sbGVyLGM9dC5jb250cm9sbGVyQXMsZD1hbmd1bGFyLmNvcHkodC5yZXNvbHZlfHx7fSksZj1hbmd1bGFyLmNvcHkodC5sb2NhbHN8fHt9KSxwPXQudHJhbnNmb3JtVGVtcGxhdGV8fGFuZ3VsYXIuaWRlbnRpdHksZz10LmJpbmRUb0NvbnRyb2xsZXI7aWYoYW5ndWxhci5mb3JFYWNoKGQsZnVuY3Rpb24oZSx0KXthbmd1bGFyLmlzU3RyaW5nKGUpP2RbdF09YS5nZXQoZSk6ZFt0XT1hLmludm9rZShlKX0pLGFuZ3VsYXIuZXh0ZW5kKGQsZikscilkLiR0ZW1wbGF0ZT1lLndoZW4ocik7ZWxzZXtpZighbil0aHJvdyBuZXcgRXJyb3IoJ01pc3NpbmcgYHRlbXBsYXRlYCAvIGB0ZW1wbGF0ZVVybGAgb3B0aW9uLicpO2QuJHRlbXBsYXRlPWwobil9cmV0dXJuIHQuY29udGVudFRlbXBsYXRlJiYoZC4kdGVtcGxhdGU9ZS5hbGwoW2QuJHRlbXBsYXRlLGwodC5jb250ZW50VGVtcGxhdGUpXSkudGhlbihmdW5jdGlvbihlKXt2YXIgbj1hbmd1bGFyLmVsZW1lbnQoZVswXSksYT1zKCdbbmctYmluZD1cImNvbnRlbnRcIl0sIFtuZy1iaW5kPVwidGl0bGVcIl0nLG5bMF0pLnJlbW92ZUF0dHIoJ25nLWJpbmQnKS5odG1sKGVbMV0pO3JldHVybiB0LnRlbXBsYXRlVXJsfHxhLm5leHQoKS5yZW1vdmUoKSxuWzBdLm91dGVySFRNTH0pKSxlLmFsbChkKS50aGVuKGZ1bmN0aW9uKGUpe3ZhciBuPXAoZS4kdGVtcGxhdGUpO3QuaHRtbCYmKG49bi5yZXBsYWNlKC9uZy1iaW5kPVwiL2dpLCduZy1iaW5kLWh0bWw9XCInKSk7dmFyIGE9YW5ndWxhci5lbGVtZW50KCc8ZGl2PicpLmh0bWwobi50cmltKCkpLmNvbnRlbnRzKCkscj1vKGEpO3JldHVybntsb2NhbHM6ZSxlbGVtZW50OmEsbGluazpmdW5jdGlvbih0KXtpZihlLiRzY29wZT10LHUpe3ZhciBuPWkodSxlLCEwKTtnJiZhbmd1bGFyLmV4dGVuZChuLmluc3RhbmNlLGUpO3ZhciBvPWFuZ3VsYXIuaXNPYmplY3Qobik/bjpuKCk7YS5kYXRhKCckbmdDb250cm9sbGVyQ29udHJvbGxlcicsbyksYS5jaGlsZHJlbigpLmRhdGEoJyRuZ0NvbnRyb2xsZXJDb250cm9sbGVyJyxvKSxjJiYodFtjXT1vKX1yZXR1cm4gci5hcHBseShudWxsLGFyZ3VtZW50cyl9fX0pfTt2YXIgdT17fX1hLiRpbmplY3Q9WyckcScsJyRodHRwJywnJGluamVjdG9yJywnJGNvbXBpbGUnLCckY29udHJvbGxlcicsJyR0ZW1wbGF0ZUNhY2hlJ10sYW5ndWxhci5tb2R1bGUoJ21nY3JlYS5uZ1N0cmFwLnR5cGVhaGVhZCcsWydtZ2NyZWEubmdTdHJhcC50b29sdGlwJywnbWdjcmVhLm5nU3RyYXAuaGVscGVycy5wYXJzZU9wdGlvbnMnXSkucHJvdmlkZXIoJyR0eXBlYWhlYWQnLGZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5kZWZhdWx0cz17YW5pbWF0aW9uOidhbS1mYWRlJyxwcmVmaXhDbGFzczondHlwZWFoZWFkJyxwcmVmaXhFdmVudDonJHR5cGVhaGVhZCcscGxhY2VtZW50Oidib3R0b20tbGVmdCcsdGVtcGxhdGVVcmw6J3R5cGVhaGVhZC90eXBlYWhlYWQudHBsLmh0bWwnLHRyaWdnZXI6J2ZvY3VzJyxjb250YWluZXI6ITEsa2V5Ym9hcmQ6ITAsaHRtbDohMSxkZWxheTowLG1pbkxlbmd0aDoxLGZpbHRlcjonYnNBc3luY0ZpbHRlcicsbGltaXQ6NixhdXRvU2VsZWN0OiExLGNvbXBhcmF0b3I6JycsdHJpbVZhbHVlOiEwfTt0aGlzLiRnZXQ9Wyckd2luZG93JywnJHJvb3RTY29wZScsJyR0b29sdGlwJywnJCRyQUYnLCckdGltZW91dCcsZnVuY3Rpb24odCxuLGEsbyxpKXtmdW5jdGlvbiByKHQsbixyKXt2YXIgbD17fSx1PWFuZ3VsYXIuZXh0ZW5kKHt9LGUscik7bD1hKHQsdSk7dmFyIGM9ci5zY29wZSxkPWwuJHNjb3BlO2QuJHJlc2V0TWF0Y2hlcz1mdW5jdGlvbigpe2QuJG1hdGNoZXM9W10sZC4kYWN0aXZlSW5kZXg9dS5hdXRvU2VsZWN0PzA6LTF9LGQuJHJlc2V0TWF0Y2hlcygpLGQuJGFjdGl2YXRlPWZ1bmN0aW9uKGUpe2QuJCRwb3N0RGlnZXN0KGZ1bmN0aW9uKCl7bC5hY3RpdmF0ZShlKX0pfSxkLiRzZWxlY3Q9ZnVuY3Rpb24oZSx0KXtkLiQkcG9zdERpZ2VzdChmdW5jdGlvbigpe2wuc2VsZWN0KGUpfSl9LGQuJGlzVmlzaWJsZT1mdW5jdGlvbigpe3JldHVybiBsLiRpc1Zpc2libGUoKX0sbC51cGRhdGU9ZnVuY3Rpb24oZSl7ZC4kbWF0Y2hlcz1lLGQuJGFjdGl2ZUluZGV4Pj1lLmxlbmd0aCYmKGQuJGFjdGl2ZUluZGV4PXUuYXV0b1NlbGVjdD8wOi0xKSxzKGQpLG8obC4kYXBwbHlQbGFjZW1lbnQpfSxsLmFjdGl2YXRlPWZ1bmN0aW9uKGUpe2QuJGFjdGl2ZUluZGV4PWV9LGwuc2VsZWN0PWZ1bmN0aW9uKGUpe2lmKC0xIT09ZSl7dmFyIHQ9ZC4kbWF0Y2hlc1tlXS52YWx1ZTtuLiRzZXRWaWV3VmFsdWUodCksbi4kcmVuZGVyKCksZC4kcmVzZXRNYXRjaGVzKCksYyYmYy4kZGlnZXN0KCksZC4kZW1pdCh1LnByZWZpeEV2ZW50Kycuc2VsZWN0Jyx0LGUsbCl9fSxsLiRpc1Zpc2libGU9ZnVuY3Rpb24oKXtyZXR1cm4gdS5taW5MZW5ndGgmJm4/ZC4kbWF0Y2hlcy5sZW5ndGgmJmFuZ3VsYXIuaXNTdHJpbmcobi4kdmlld1ZhbHVlKSYmbi4kdmlld1ZhbHVlLmxlbmd0aD49dS5taW5MZW5ndGg6ISFkLiRtYXRjaGVzLmxlbmd0aH0sbC4kZ2V0SW5kZXg9ZnVuY3Rpb24oZSl7dmFyIHQ7Zm9yKHQ9ZC4kbWF0Y2hlcy5sZW5ndGg7dC0tJiYhYW5ndWxhci5lcXVhbHMoZC4kbWF0Y2hlc1t0XS52YWx1ZSxlKTspO3JldHVybiB0fSxsLiRvbk1vdXNlRG93bj1mdW5jdGlvbihlKXtlLnByZXZlbnREZWZhdWx0KCksZS5zdG9wUHJvcGFnYXRpb24oKX0sbC4kb25LZXlEb3duPWZ1bmN0aW9uKGUpey8oMzh8NDB8MTMpLy50ZXN0KGUua2V5Q29kZSkmJighbC4kaXNWaXNpYmxlKCl8fDEzPT09ZS5rZXlDb2RlJiYtMT09PWQuJGFjdGl2ZUluZGV4fHwoZS5wcmV2ZW50RGVmYXVsdCgpLGUuc3RvcFByb3BhZ2F0aW9uKCkpLDEzPT09ZS5rZXlDb2RlJiZkLiRtYXRjaGVzLmxlbmd0aD9sLnNlbGVjdChkLiRhY3RpdmVJbmRleCk6Mzg9PT1lLmtleUNvZGUmJmQuJGFjdGl2ZUluZGV4PjA/ZC4kYWN0aXZlSW5kZXgtLTo0MD09PWUua2V5Q29kZSYmZC4kYWN0aXZlSW5kZXg8ZC4kbWF0Y2hlcy5sZW5ndGgtMT9kLiRhY3RpdmVJbmRleCsrOmFuZ3VsYXIuaXNVbmRlZmluZWQoZC4kYWN0aXZlSW5kZXgpJiYoZC4kYWN0aXZlSW5kZXg9MCksZC4kZGlnZXN0KCkpfTt2YXIgZj1sLnNob3c7bC5zaG93PWZ1bmN0aW9uKCl7ZigpLGkoZnVuY3Rpb24oKXtsLiRlbGVtZW50JiYobC4kZWxlbWVudC5vbignbW91c2Vkb3duJyxsLiRvbk1vdXNlRG93biksdS5rZXlib2FyZCYmdCYmdC5vbigna2V5ZG93bicsbC4kb25LZXlEb3duKSl9LDAsITEpfTt2YXIgcD1sLmhpZGU7cmV0dXJuIGwuaGlkZT1mdW5jdGlvbigpe2wuJGVsZW1lbnQmJmwuJGVsZW1lbnQub2ZmKCdtb3VzZWRvd24nLGwuJG9uTW91c2VEb3duKSx1LmtleWJvYXJkJiZ0JiZ0Lm9mZigna2V5ZG93bicsbC4kb25LZXlEb3duKSx1LmF1dG9TZWxlY3R8fGwuYWN0aXZhdGUoLTEpLHAoKX0sbH1mdW5jdGlvbiBzKGUpe2UuJCRwaGFzZXx8ZS4kcm9vdCYmZS4kcm9vdC4kJHBoYXNlfHxlLiRkaWdlc3QoKX1yZXR1cm4gci5kZWZhdWx0cz1lLHJ9XX0pLmZpbHRlcignYnNBc3luY0ZpbHRlcicsWyckZmlsdGVyJyxmdW5jdGlvbihlKXtyZXR1cm4gZnVuY3Rpb24odCxuLGEpe3JldHVybiB0JiZhbmd1bGFyLmlzRnVuY3Rpb24odC50aGVuKT90LnRoZW4oZnVuY3Rpb24odCl7cmV0dXJuIGUoJ2ZpbHRlcicpKHQsbixhKX0pOmUoJ2ZpbHRlcicpKHQsbixhKX19XSkuZGlyZWN0aXZlKCdic1R5cGVhaGVhZCcsWyckd2luZG93JywnJHBhcnNlJywnJHEnLCckdHlwZWFoZWFkJywnJHBhcnNlT3B0aW9ucycsZnVuY3Rpb24oZSx0LG4sYSxvKXt2YXIgaT1hLmRlZmF1bHRzO3JldHVybntyZXN0cmljdDonRUFDJyxyZXF1aXJlOiduZ01vZGVsJyxsaW5rOmZ1bmN0aW9uKGUsdCxuLHIpe3ZhciBzPXtzY29wZTplfTthbmd1bGFyLmZvckVhY2goWyd0ZW1wbGF0ZScsJ3RlbXBsYXRlVXJsJywnY29udHJvbGxlcicsJ2NvbnRyb2xsZXJBcycsJ3BsYWNlbWVudCcsJ2NvbnRhaW5lcicsJ2RlbGF5JywndHJpZ2dlcicsJ2tleWJvYXJkJywnaHRtbCcsJ2FuaW1hdGlvbicsJ2ZpbHRlcicsJ2xpbWl0JywnbWluTGVuZ3RoJywnd2F0Y2hPcHRpb25zJywnc2VsZWN0TW9kZScsJ2F1dG9TZWxlY3QnLCdjb21wYXJhdG9yJywnaWQnLCdwcmVmaXhFdmVudCcsJ3ByZWZpeENsYXNzJ10sZnVuY3Rpb24oZSl7YW5ndWxhci5pc0RlZmluZWQobltlXSkmJihzW2VdPW5bZV0pfSk7dmFyIGw9L14oZmFsc2V8MHwpJC9pO2FuZ3VsYXIuZm9yRWFjaChbJ2h0bWwnLCdjb250YWluZXInLCd0cmltVmFsdWUnXSxmdW5jdGlvbihlKXthbmd1bGFyLmlzRGVmaW5lZChuW2VdKSYmbC50ZXN0KG5bZV0pJiYoc1tlXT0hMSl9KSx0LmF0dHIoJ2F1dG9jb21wbGV0ZScpfHx0LmF0dHIoJ2F1dG9jb21wbGV0ZScsJ29mZicpO3ZhciB1PXMuZmlsdGVyfHxpLmZpbHRlcixjPXMubGltaXR8fGkubGltaXQsZD1zLmNvbXBhcmF0b3J8fGkuY29tcGFyYXRvcixmPW4uYnNPcHRpb25zO3UmJihmKz0nIHwgJyt1Kyc6JHZpZXdWYWx1ZScpLGQmJihmKz0nOicrZCksYyYmKGYrPScgfCBsaW1pdFRvOicrYyk7dmFyIHA9byhmKSxnPWEodCxyLHMpO2lmKHMud2F0Y2hPcHRpb25zKXt2YXIgbT1wLiRtYXRjaFs3XS5yZXBsYWNlKC9cXHwuKy8sJycpLnJlcGxhY2UoL1xcKC4qXFwpL2csJycpLnRyaW0oKTtlLiR3YXRjaENvbGxlY3Rpb24obSxmdW5jdGlvbih0LG4pe3AudmFsdWVzRm4oZSxyKS50aGVuKGZ1bmN0aW9uKGUpe2cudXBkYXRlKGUpLHIuJHJlbmRlcigpfSl9KX1lLiR3YXRjaChuLm5nTW9kZWwsZnVuY3Rpb24odCxuKXtlLiRtb2RlbFZhbHVlPXQscC52YWx1ZXNGbihlLHIpLnRoZW4oZnVuY3Rpb24oZSl7cmV0dXJuIHMuc2VsZWN0TW9kZSYmIWUubGVuZ3RoJiZ0Lmxlbmd0aD4wP3ZvaWQgci4kc2V0Vmlld1ZhbHVlKHIuJHZpZXdWYWx1ZS5zdWJzdHJpbmcoMCxyLiR2aWV3VmFsdWUubGVuZ3RoLTEpKTooZS5sZW5ndGg+YyYmKGU9ZS5zbGljZSgwLGMpKSxnLnVwZGF0ZShlKSx2b2lkIHIuJHJlbmRlcigpKX0pfSksci4kZm9ybWF0dGVycy5wdXNoKGZ1bmN0aW9uKGUpe3ZhciB0PXAuZGlzcGxheVZhbHVlKGUpO3JldHVybiB0P3Q6ZSYmJ29iamVjdCchPXR5cGVvZiBlP2U6Jyd9KSxyLiRyZW5kZXI9ZnVuY3Rpb24oKXtpZihyLiRpc0VtcHR5KHIuJHZpZXdWYWx1ZSkpcmV0dXJuIHQudmFsKCcnKTt2YXIgZT1nLiRnZXRJbmRleChyLiRtb2RlbFZhbHVlKSxuPS0xIT09ZT9nLiRzY29wZS4kbWF0Y2hlc1tlXS5sYWJlbDpyLiR2aWV3VmFsdWU7bj1hbmd1bGFyLmlzT2JqZWN0KG4pP3AuZGlzcGxheVZhbHVlKG4pOm47dmFyIGE9bj9uLnRvU3RyaW5nKCkucmVwbGFjZSgvPCg/Oi58XFxuKSo/Pi9nbSwnJyk6Jyc7dC52YWwocy50cmltVmFsdWU9PT0hMT9hOmEudHJpbSgpKX0sZS4kb24oJyRkZXN0cm95JyxmdW5jdGlvbigpe2cmJmcuZGVzdHJveSgpLHM9bnVsbCxnPW51bGx9KX19fV0pLGFuZ3VsYXIubW9kdWxlKCdtZ2NyZWEubmdTdHJhcC50b29sdGlwJyxbJ21nY3JlYS5uZ1N0cmFwLmNvcmUnLCdtZ2NyZWEubmdTdHJhcC5oZWxwZXJzLmRpbWVuc2lvbnMnXSkucHJvdmlkZXIoJyR0b29sdGlwJyxmdW5jdGlvbigpe3ZhciBlPXRoaXMuZGVmYXVsdHM9e2FuaW1hdGlvbjonYW0tZmFkZScsY3VzdG9tQ2xhc3M6JycscHJlZml4Q2xhc3M6J3Rvb2x0aXAnLHByZWZpeEV2ZW50Oid0b29sdGlwJyxjb250YWluZXI6ITEsdGFyZ2V0OiExLHBsYWNlbWVudDondG9wJyx0ZW1wbGF0ZVVybDondG9vbHRpcC90b29sdGlwLnRwbC5odG1sJyx0ZW1wbGF0ZTonJyxjb250ZW50VGVtcGxhdGU6ITEsdHJpZ2dlcjonaG92ZXIgZm9jdXMnLGtleWJvYXJkOiExLGh0bWw6ITEsc2hvdzohMSx0aXRsZTonJyx0eXBlOicnLGRlbGF5OjAsYXV0b0Nsb3NlOiExLGJzRW5hYmxlZDohMCx2aWV3cG9ydDp7c2VsZWN0b3I6J2JvZHknLHBhZGRpbmc6MH19O3RoaXMuJGdldD1bJyR3aW5kb3cnLCckcm9vdFNjb3BlJywnJGJzQ29tcGlsZXInLCckcScsJyR0ZW1wbGF0ZUNhY2hlJywnJGh0dHAnLCckYW5pbWF0ZScsJyRzY2UnLCdkaW1lbnNpb25zJywnJCRyQUYnLCckdGltZW91dCcsZnVuY3Rpb24obixhLG8saSxyLHMsbCx1LGMsZCxmKXtmdW5jdGlvbiBwKGkscil7ZnVuY3Rpb24gcygpe0kuJGVtaXQoVi5wcmVmaXhFdmVudCsnLnNob3cnLEYpfWZ1bmN0aW9uIHAoKXtpZihJLiRlbWl0KFYucHJlZml4RXZlbnQrJy5oaWRlJyxGKSxSPT09ail7aWYoeiYmJ2ZvY3VzJz09PVYudHJpZ2dlcilyZXR1cm4gaVswXS5ibHVyKCk7QSgpfX1mdW5jdGlvbiB2KCl7dmFyIGU9Vi50cmlnZ2VyLnNwbGl0KCcgJyk7YW5ndWxhci5mb3JFYWNoKGUsZnVuY3Rpb24oZSl7J2NsaWNrJz09PWU/aS5vbignY2xpY2snLEYudG9nZ2xlKTonbWFudWFsJyE9PWUmJihpLm9uKCdob3Zlcic9PT1lPydtb3VzZWVudGVyJzonZm9jdXMnLEYuZW50ZXIpLGkub24oJ2hvdmVyJz09PWU/J21vdXNlbGVhdmUnOidibHVyJyxGLmxlYXZlKSwnYnV0dG9uJz09PU4mJidob3ZlcichPT1lJiZpLm9uKCQ/J3RvdWNoc3RhcnQnOidtb3VzZWRvd24nLEYuJG9uRm9jdXNFbGVtZW50TW91c2VEb3duKSl9KX1mdW5jdGlvbiB3KCl7Zm9yKHZhciBlPVYudHJpZ2dlci5zcGxpdCgnICcpLHQ9ZS5sZW5ndGg7dC0tOyl7dmFyIG49ZVt0XTsnY2xpY2snPT09bj9pLm9mZignY2xpY2snLEYudG9nZ2xlKTonbWFudWFsJyE9PW4mJihpLm9mZignaG92ZXInPT09bj8nbW91c2VlbnRlcic6J2ZvY3VzJyxGLmVudGVyKSxpLm9mZignaG92ZXInPT09bj8nbW91c2VsZWF2ZSc6J2JsdXInLEYubGVhdmUpLCdidXR0b24nPT09TiYmJ2hvdmVyJyE9PW4mJmkub2ZmKCQ/J3RvdWNoc3RhcnQnOidtb3VzZWRvd24nLEYuJG9uRm9jdXNFbGVtZW50TW91c2VEb3duKSl9fWZ1bmN0aW9uIHkoKXsnZm9jdXMnIT09Vi50cmlnZ2VyP1Iub24oJ2tleXVwJyxGLiRvbktleVVwKTppLm9uKCdrZXl1cCcsRi4kb25Gb2N1c0tleVVwKX1mdW5jdGlvbiBiKCl7J2ZvY3VzJyE9PVYudHJpZ2dlcj9SLm9mZigna2V5dXAnLEYuJG9uS2V5VXApOmkub2ZmKCdrZXl1cCcsRi4kb25Gb2N1c0tleVVwKX1mdW5jdGlvbiBEKCl7ZihmdW5jdGlvbigpe1Iub24oJ2NsaWNrJyxTKSxoLm9uKCdjbGljaycsRi5oaWRlKSxLPSEwfSwwLCExKX1mdW5jdGlvbiBrKCl7SyYmKFIub2ZmKCdjbGljaycsUyksaC5vZmYoJ2NsaWNrJyxGLmhpZGUpLEs9ITEpfWZ1bmN0aW9uIFMoZSl7ZS5zdG9wUHJvcGFnYXRpb24oKX1mdW5jdGlvbiB4KGUpe2U9ZXx8Vi50YXJnZXR8fGk7dmFyIGE9ZVswXSxvPSdCT0RZJz09PWEudGFnTmFtZSxyPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkscz17fTtmb3IodmFyIGwgaW4gcilzW2xdPXJbbF07bnVsbD09PXMud2lkdGgmJihzPWFuZ3VsYXIuZXh0ZW5kKHt9LHMse3dpZHRoOnIucmlnaHQtci5sZWZ0LGhlaWdodDpyLmJvdHRvbS1yLnRvcH0pKTt2YXIgdT1vP3t0b3A6MCxsZWZ0OjB9OmMub2Zmc2V0KGEpLGQ9e3Njcm9sbDpvP3QuZG9jdW1lbnRFbGVtZW50LnNjcm9sbFRvcHx8dC5ib2R5LnNjcm9sbFRvcDplLnByb3AoJ3Njcm9sbFRvcCcpfHwwfSxmPW8/e3dpZHRoOnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoLGhlaWdodDpuLmlubmVySGVpZ2h0fTpudWxsO3JldHVybiBhbmd1bGFyLmV4dGVuZCh7fSxzLGQsZix1KX1mdW5jdGlvbiBDKGUsdCxuLGEpe3ZhciBvLGk9ZS5zcGxpdCgnLScpO3N3aXRjaChpWzBdKXtjYXNlJ3JpZ2h0JzpvPXt0b3A6dC50b3ArdC5oZWlnaHQvMi1hLzIsbGVmdDp0LmxlZnQrdC53aWR0aH07YnJlYWs7Y2FzZSdib3R0b20nOm89e3RvcDp0LnRvcCt0LmhlaWdodCxsZWZ0OnQubGVmdCt0LndpZHRoLzItbi8yfTticmVhaztjYXNlJ2xlZnQnOm89e3RvcDp0LnRvcCt0LmhlaWdodC8yLWEvMixsZWZ0OnQubGVmdC1ufTticmVhaztkZWZhdWx0Om89e3RvcDp0LnRvcC1hLGxlZnQ6dC5sZWZ0K3Qud2lkdGgvMi1uLzJ9fWlmKCFpWzFdKXJldHVybiBvO2lmKCd0b3AnPT09aVswXXx8J2JvdHRvbSc9PT1pWzBdKXN3aXRjaChpWzFdKXtjYXNlJ2xlZnQnOm8ubGVmdD10LmxlZnQ7YnJlYWs7Y2FzZSdyaWdodCc6by5sZWZ0PXQubGVmdCt0LndpZHRoLW59ZWxzZSBpZignbGVmdCc9PT1pWzBdfHwncmlnaHQnPT09aVswXSlzd2l0Y2goaVsxXSl7Y2FzZSd0b3AnOm8udG9wPXQudG9wLWErdC5oZWlnaHQ7YnJlYWs7Y2FzZSdib3R0b20nOm8udG9wPXQudG9wfXJldHVybiBvfWZ1bmN0aW9uIFQoZSx0KXt2YXIgbj1SWzBdLGE9bi5vZmZzZXRXaWR0aCxvPW4ub2Zmc2V0SGVpZ2h0LGk9cGFyc2VJbnQoYy5jc3MobiwnbWFyZ2luLXRvcCcpLDEwKSxyPXBhcnNlSW50KGMuY3NzKG4sJ21hcmdpbi1sZWZ0JyksMTApO2lzTmFOKGkpJiYoaT0wKSxpc05hTihyKSYmKHI9MCksZS50b3A9ZS50b3AraSxlLmxlZnQ9ZS5sZWZ0K3IsYy5zZXRPZmZzZXQobixhbmd1bGFyLmV4dGVuZCh7dXNpbmc6ZnVuY3Rpb24oZSl7Ui5jc3Moe3RvcDpNYXRoLnJvdW5kKGUudG9wKSsncHgnLGxlZnQ6TWF0aC5yb3VuZChlLmxlZnQpKydweCcscmlnaHQ6Jyd9KX19LGUpLDApO3ZhciBzPW4ub2Zmc2V0V2lkdGgsbD1uLm9mZnNldEhlaWdodDtpZigndG9wJz09PXQmJmwhPT1vJiYoZS50b3A9ZS50b3Arby1sKSwhL3RvcC1sZWZ0fHRvcC1yaWdodHxib3R0b20tbGVmdHxib3R0b20tcmlnaHQvLnRlc3QodCkpe3ZhciB1PUUodCxlLHMsbCk7aWYodS5sZWZ0P2UubGVmdCs9dS5sZWZ0OmUudG9wKz11LnRvcCxjLnNldE9mZnNldChuLGUpLC90b3B8cmlnaHR8Ym90dG9tfGxlZnQvLnRlc3QodCkpe3ZhciBkPS90b3B8Ym90dG9tLy50ZXN0KHQpLGY9ZD8yKnUubGVmdC1hK3M6Mip1LnRvcC1vK2wscD1kPydvZmZzZXRXaWR0aCc6J29mZnNldEhlaWdodCc7TShmLG5bcF0sZCl9fX1mdW5jdGlvbiBFKGUsdCxuLGEpe3ZhciBvPXt0b3A6MCxsZWZ0OjB9O2lmKCFGLiR2aWV3cG9ydClyZXR1cm4gbzt2YXIgaT1WLnZpZXdwb3J0JiZWLnZpZXdwb3J0LnBhZGRpbmd8fDAscj14KEYuJHZpZXdwb3J0KTtpZigvcmlnaHR8bGVmdC8udGVzdChlKSl7dmFyIHM9dC50b3AtaS1yLnNjcm9sbCxsPXQudG9wK2ktci5zY3JvbGwrYTtzPHIudG9wP28udG9wPXIudG9wLXM6bD5yLnRvcCtyLmhlaWdodCYmKG8udG9wPXIudG9wK3IuaGVpZ2h0LWwpfWVsc2V7dmFyIHU9dC5sZWZ0LWksYz10LmxlZnQraStuO3U8ci5sZWZ0P28ubGVmdD1yLmxlZnQtdTpjPnIucmlnaHQmJihvLmxlZnQ9ci5sZWZ0K3Iud2lkdGgtYyl9cmV0dXJuIG99ZnVuY3Rpb24gTShlLHQsbil7dmFyIGE9bSgnLnRvb2x0aXAtYXJyb3csIC5hcnJvdycsUlswXSk7YS5jc3Mobj8nbGVmdCc6J3RvcCcsNTAqKDEtZS90KSsnJScpLmNzcyhuPyd0b3AnOidsZWZ0JywnJyl9ZnVuY3Rpb24gQSgpe2NsZWFyVGltZW91dChIKSxGLiRpc1Nob3duJiZudWxsIT09UiYmKFYuYXV0b0Nsb3NlJiZrKCksVi5rZXlib2FyZCYmYigpKSxxJiYocS4kZGVzdHJveSgpLHE9bnVsbCksUiYmKFIucmVtb3ZlKCksUj1GLiRlbGVtZW50PW51bGwpfXZhciBGPXt9LFY9Ri4kb3B0aW9ucz1hbmd1bGFyLmV4dGVuZCh7fSxlLHIpLE89Ri4kcHJvbWlzZT1vLmNvbXBpbGUoViksST1GLiRzY29wZT1WLnNjb3BlJiZWLnNjb3BlLiRuZXcoKXx8YS4kbmV3KCksTj1pWzBdLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7aWYoVi5kZWxheSYmYW5ndWxhci5pc1N0cmluZyhWLmRlbGF5KSl7dmFyIFA9Vi5kZWxheS5zcGxpdCgnLCcpLm1hcChwYXJzZUZsb2F0KTtWLmRlbGF5PVAubGVuZ3RoPjE/e3Nob3c6UFswXSxoaWRlOlBbMV19OlBbMF19Ri4kaWQ9Vi5pZHx8aS5hdHRyKCdpZCcpfHwnJyxWLnRpdGxlJiYoSS50aXRsZT11LnRydXN0QXNIdG1sKFYudGl0bGUpKSxJLiRzZXRFbmFibGVkPWZ1bmN0aW9uKGUpe0kuJCRwb3N0RGlnZXN0KGZ1bmN0aW9uKCl7Ri5zZXRFbmFibGVkKGUpfSl9LEkuJGhpZGU9ZnVuY3Rpb24oKXtJLiQkcG9zdERpZ2VzdChmdW5jdGlvbigpe0YuaGlkZSgpfSl9LEkuJHNob3c9ZnVuY3Rpb24oKXtJLiQkcG9zdERpZ2VzdChmdW5jdGlvbigpe0Yuc2hvdygpfSl9LEkuJHRvZ2dsZT1mdW5jdGlvbigpe0kuJCRwb3N0RGlnZXN0KGZ1bmN0aW9uKCl7Ri50b2dnbGUoKX0pfSxGLiRpc1Nob3duPUkuJGlzU2hvd249ITE7dmFyIEgsTCxVLFIsWSxxO08udGhlbihmdW5jdGlvbihlKXtVPWUsRi5pbml0KCl9KSxGLmluaXQ9ZnVuY3Rpb24oKXtWLmRlbGF5JiZhbmd1bGFyLmlzTnVtYmVyKFYuZGVsYXkpJiYoVi5kZWxheT17c2hvdzpWLmRlbGF5LGhpZGU6Vi5kZWxheX0pLCdzZWxmJz09PVYuY29udGFpbmVyP1k9aTphbmd1bGFyLmlzRWxlbWVudChWLmNvbnRhaW5lcik/WT1WLmNvbnRhaW5lcjpWLmNvbnRhaW5lciYmKFk9bShWLmNvbnRhaW5lcikpLHYoKSxWLnRhcmdldCYmKFYudGFyZ2V0PWFuZ3VsYXIuaXNFbGVtZW50KFYudGFyZ2V0KT9WLnRhcmdldDptKFYudGFyZ2V0KSksVi5zaG93JiZJLiQkcG9zdERpZ2VzdChmdW5jdGlvbigpeydmb2N1cyc9PT1WLnRyaWdnZXI/aVswXS5mb2N1cygpOkYuc2hvdygpfSl9LEYuZGVzdHJveT1mdW5jdGlvbigpe3coKSxBKCksSS4kZGVzdHJveSgpfSxGLmVudGVyPWZ1bmN0aW9uKCl7cmV0dXJuIGNsZWFyVGltZW91dChIKSxMPSdpbicsVi5kZWxheSYmVi5kZWxheS5zaG93P3ZvaWQoSD1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7J2luJz09PUwmJkYuc2hvdygpfSxWLmRlbGF5LnNob3cpKTpGLnNob3coKX0sRi5zaG93PWZ1bmN0aW9uKCl7aWYoVi5ic0VuYWJsZWQmJiFGLiRpc1Nob3duKXtJLiRlbWl0KFYucHJlZml4RXZlbnQrJy5zaG93LmJlZm9yZScsRik7dmFyIGUsdDtWLmNvbnRhaW5lcj8oZT1ZLHQ9WVswXS5sYXN0Q2hpbGQ/YW5ndWxhci5lbGVtZW50KFlbMF0ubGFzdENoaWxkKTpudWxsKTooZT1udWxsLHQ9aSksUiYmQSgpLHE9Ri4kc2NvcGUuJG5ldygpLFI9Ri4kZWxlbWVudD1VLmxpbmsocSxmdW5jdGlvbihlLHQpe30pLFIuY3NzKHt0b3A6Jy05OTk5cHgnLGxlZnQ6Jy05OTk5cHgnLHJpZ2h0OidhdXRvJyxkaXNwbGF5OidibG9jaycsdmlzaWJpbGl0eTonaGlkZGVuJ30pLFYuYW5pbWF0aW9uJiZSLmFkZENsYXNzKFYuYW5pbWF0aW9uKSxWLnR5cGUmJlIuYWRkQ2xhc3MoVi5wcmVmaXhDbGFzcysnLScrVi50eXBlKSxWLmN1c3RvbUNsYXNzJiZSLmFkZENsYXNzKFYuY3VzdG9tQ2xhc3MpLHQ/dC5hZnRlcihSKTplLnByZXBlbmQoUiksRi4kaXNTaG93bj1JLiRpc1Nob3duPSEwLGcoSSksRi4kYXBwbHlQbGFjZW1lbnQoKSxhbmd1bGFyLnZlcnNpb24ubWlub3I8PTI/bC5lbnRlcihSLGUsdCxzKTpsLmVudGVyKFIsZSx0KS50aGVuKHMpLGcoSSksZChmdW5jdGlvbigpe1ImJlIuY3NzKHt2aXNpYmlsaXR5Oid2aXNpYmxlJ30pLFYua2V5Ym9hcmQmJignZm9jdXMnIT09Vi50cmlnZ2VyJiZGLmZvY3VzKCkseSgpKX0pLFYuYXV0b0Nsb3NlJiZEKCl9fSxGLmxlYXZlPWZ1bmN0aW9uKCl7cmV0dXJuIGNsZWFyVGltZW91dChIKSxMPSdvdXQnLFYuZGVsYXkmJlYuZGVsYXkuaGlkZT92b2lkKEg9c2V0VGltZW91dChmdW5jdGlvbigpeydvdXQnPT09TCYmRi5oaWRlKCl9LFYuZGVsYXkuaGlkZSkpOkYuaGlkZSgpfTt2YXIgeixqO0YuaGlkZT1mdW5jdGlvbihlKXtGLiRpc1Nob3duJiYoSS4kZW1pdChWLnByZWZpeEV2ZW50KycuaGlkZS5iZWZvcmUnLEYpLHo9ZSxqPVIsYW5ndWxhci52ZXJzaW9uLm1pbm9yPD0yP2wubGVhdmUoUixwKTpsLmxlYXZlKFIpLnRoZW4ocCksRi4kaXNTaG93bj1JLiRpc1Nob3duPSExLGcoSSksVi5rZXlib2FyZCYmbnVsbCE9PVImJmIoKSxWLmF1dG9DbG9zZSYmbnVsbCE9PVImJmsoKSl9LEYudG9nZ2xlPWZ1bmN0aW9uKCl7Ri4kaXNTaG93bj9GLmxlYXZlKCk6Ri5lbnRlcigpfSxGLmZvY3VzPWZ1bmN0aW9uKCl7UlswXS5mb2N1cygpfSxGLnNldEVuYWJsZWQ9ZnVuY3Rpb24oZSl7Vi5ic0VuYWJsZWQ9ZX0sRi5zZXRWaWV3cG9ydD1mdW5jdGlvbihlKXtWLnZpZXdwb3J0PWV9LEYuJGFwcGx5UGxhY2VtZW50PWZ1bmN0aW9uKCl7aWYoUil7dmFyIHQ9Vi5wbGFjZW1lbnQsbj0vXFxzP2F1dG8/XFxzPy9pLGE9bi50ZXN0KHQpO2EmJih0PXQucmVwbGFjZShuLCcnKXx8ZS5wbGFjZW1lbnQpLFIuYWRkQ2xhc3MoVi5wbGFjZW1lbnQpO3ZhciBvPXgoKSxpPVIucHJvcCgnb2Zmc2V0V2lkdGgnKSxyPVIucHJvcCgnb2Zmc2V0SGVpZ2h0Jyk7aWYoRi4kdmlld3BvcnQ9Vi52aWV3cG9ydCYmbShWLnZpZXdwb3J0LnNlbGVjdG9yfHxWLnZpZXdwb3J0KSxhKXt2YXIgcz10LGw9eChGLiR2aWV3cG9ydCk7L2JvdHRvbS8udGVzdChzKSYmby5ib3R0b20rcj5sLmJvdHRvbT90PXMucmVwbGFjZSgnYm90dG9tJywndG9wJyk6L3RvcC8udGVzdChzKSYmby50b3AtcjxsLnRvcCYmKHQ9cy5yZXBsYWNlKCd0b3AnLCdib3R0b20nKSksL2xlZnQvLnRlc3QocykmJm8ubGVmdC1pPGwubGVmdD90PXQucmVwbGFjZSgnbGVmdCcsJ3JpZ2h0Jyk6L3JpZ2h0Ly50ZXN0KHMpJiZvLnJpZ2h0K2k+bC53aWR0aCYmKHQ9dC5yZXBsYWNlKCdyaWdodCcsJ2xlZnQnKSksUi5yZW1vdmVDbGFzcyhzKS5hZGRDbGFzcyh0KX12YXIgdT1DKHQsbyxpLHIpO1QodSx0KX19LEYuJG9uS2V5VXA9ZnVuY3Rpb24oZSl7Mjc9PT1lLndoaWNoJiZGLiRpc1Nob3duJiYoRi5oaWRlKCksZS5zdG9wUHJvcGFnYXRpb24oKSl9LEYuJG9uRm9jdXNLZXlVcD1mdW5jdGlvbihlKXsyNz09PWUud2hpY2gmJihpWzBdLmJsdXIoKSxlLnN0b3BQcm9wYWdhdGlvbigpKX0sRi4kb25Gb2N1c0VsZW1lbnRNb3VzZURvd249ZnVuY3Rpb24oZSl7ZS5wcmV2ZW50RGVmYXVsdCgpLGUuc3RvcFByb3BhZ2F0aW9uKCksRi4kaXNTaG93bj9pWzBdLmJsdXIoKTppWzBdLmZvY3VzKCl9O3ZhciBLPSExO3JldHVybiBGfWZ1bmN0aW9uIGcoZSl7ZS4kJHBoYXNlfHxlLiRyb290JiZlLiRyb290LiQkcGhhc2V8fGUuJGRpZ2VzdCgpfWZ1bmN0aW9uIG0oZSxuKXtyZXR1cm4gYW5ndWxhci5lbGVtZW50KChufHx0KS5xdWVyeVNlbGVjdG9yQWxsKGUpKX12YXIgJD0nY3JlYXRlVG91Y2gnaW4gbi5kb2N1bWVudCxoPWFuZ3VsYXIuZWxlbWVudChuLmRvY3VtZW50KTtyZXR1cm4gcH1dfSkuZGlyZWN0aXZlKCdic1Rvb2x0aXAnLFsnJHdpbmRvdycsJyRsb2NhdGlvbicsJyRzY2UnLCckdG9vbHRpcCcsJyQkckFGJyxmdW5jdGlvbihlLHQsbixhLG8pe3JldHVybntyZXN0cmljdDonRUFDJyxzY29wZTohMCxsaW5rOmZ1bmN0aW9uKGUsdCxpLHIpe3ZhciBzLGw9e3Njb3BlOmV9O2FuZ3VsYXIuZm9yRWFjaChbJ3RlbXBsYXRlJywndGVtcGxhdGVVcmwnLCdjb250cm9sbGVyJywnY29udHJvbGxlckFzJywnY29udGVudFRlbXBsYXRlJywncGxhY2VtZW50JywnY29udGFpbmVyJywnZGVsYXknLCd0cmlnZ2VyJywnaHRtbCcsJ2FuaW1hdGlvbicsJ2JhY2tkcm9wQW5pbWF0aW9uJywndHlwZScsJ2N1c3RvbUNsYXNzJywnaWQnXSxmdW5jdGlvbihlKXthbmd1bGFyLmlzRGVmaW5lZChpW2VdKSYmKGxbZV09aVtlXSl9KTt2YXIgdT0vXihmYWxzZXwwfCkkL2k7YW5ndWxhci5mb3JFYWNoKFsnaHRtbCcsJ2NvbnRhaW5lciddLGZ1bmN0aW9uKGUpe2FuZ3VsYXIuaXNEZWZpbmVkKGlbZV0pJiZ1LnRlc3QoaVtlXSkmJihsW2VdPSExKX0pO3ZhciBjPXQuYXR0cignZGF0YS10YXJnZXQnKTthbmd1bGFyLmlzRGVmaW5lZChjKSYmKHUudGVzdChjKT9sLnRhcmdldD0hMTpsLnRhcmdldD1jKSxlLmhhc093blByb3BlcnR5KCd0aXRsZScpfHwoZS50aXRsZT0nJyksaS4kb2JzZXJ2ZSgndGl0bGUnLGZ1bmN0aW9uKHQpe2lmKGFuZ3VsYXIuaXNEZWZpbmVkKHQpfHwhZS5oYXNPd25Qcm9wZXJ0eSgndGl0bGUnKSl7dmFyIGE9ZS50aXRsZTtlLnRpdGxlPW4udHJ1c3RBc0h0bWwodCksYW5ndWxhci5pc0RlZmluZWQoYSkmJm8oZnVuY3Rpb24oKXtzJiZzLiRhcHBseVBsYWNlbWVudCgpfSl9fSksaS5ic1Rvb2x0aXAmJmUuJHdhdGNoKGkuYnNUb29sdGlwLGZ1bmN0aW9uKHQsbil7YW5ndWxhci5pc09iamVjdCh0KT9hbmd1bGFyLmV4dGVuZChlLHQpOmUudGl0bGU9dCxhbmd1bGFyLmlzRGVmaW5lZChuKSYmbyhmdW5jdGlvbigpe3MmJnMuJGFwcGx5UGxhY2VtZW50KCl9KX0sITApLGkuYnNTaG93JiZlLiR3YXRjaChpLmJzU2hvdyxmdW5jdGlvbihlLHQpe3MmJmFuZ3VsYXIuaXNEZWZpbmVkKGUpJiYoYW5ndWxhci5pc1N0cmluZyhlKSYmKGU9ISFlLm1hdGNoKC90cnVlfCw/KHRvb2x0aXApLD8vaSkpLGU9PT0hMD9zLnNob3coKTpzLmhpZGUoKSl9KSxpLmJzRW5hYmxlZCYmZS4kd2F0Y2goaS5ic0VuYWJsZWQsZnVuY3Rpb24oZSx0KXtzJiZhbmd1bGFyLmlzRGVmaW5lZChlKSYmKGFuZ3VsYXIuaXNTdHJpbmcoZSkmJihlPSEhZS5tYXRjaCgvdHJ1ZXwxfCw/KHRvb2x0aXApLD8vaSkpLGU9PT0hMT9zLnNldEVuYWJsZWQoITEpOnMuc2V0RW5hYmxlZCghMCkpfSksaS52aWV3cG9ydCYmZS4kd2F0Y2goaS52aWV3cG9ydCxmdW5jdGlvbihlKXtzJiZhbmd1bGFyLmlzRGVmaW5lZChlKSYmcy5zZXRWaWV3cG9ydChlKX0pLHM9YSh0LGwpLGUuJG9uKCckZGVzdHJveScsZnVuY3Rpb24oKXtzJiZzLmRlc3Ryb3koKSxsPW51bGwscz1udWxsfSl9fX1dKSxhbmd1bGFyLm1vZHVsZSgnbWdjcmVhLm5nU3RyYXAudGltZXBpY2tlcicsWydtZ2NyZWEubmdTdHJhcC5oZWxwZXJzLmRhdGVQYXJzZXInLCdtZ2NyZWEubmdTdHJhcC5oZWxwZXJzLmRhdGVGb3JtYXR0ZXInLCdtZ2NyZWEubmdTdHJhcC50b29sdGlwJ10pLnByb3ZpZGVyKCckdGltZXBpY2tlcicsZnVuY3Rpb24oKXt2YXIgZT10aGlzLmRlZmF1bHRzPXthbmltYXRpb246J2FtLWZhZGUnLHByZWZpeENsYXNzOid0aW1lcGlja2VyJyxwbGFjZW1lbnQ6J2JvdHRvbS1sZWZ0Jyx0ZW1wbGF0ZVVybDondGltZXBpY2tlci90aW1lcGlja2VyLnRwbC5odG1sJyx0cmlnZ2VyOidmb2N1cycsY29udGFpbmVyOiExLGtleWJvYXJkOiEwLGh0bWw6ITEsZGVsYXk6MCx1c2VOYXRpdmU6ITAsdGltZVR5cGU6J2RhdGUnLHRpbWVGb3JtYXQ6J3Nob3J0VGltZScsdGltZXpvbmU6bnVsbCxtb2RlbFRpbWVGb3JtYXQ6bnVsbCxhdXRvY2xvc2U6ITEsbWluVGltZTotKDEvMCksbWF4VGltZTorKDEvMCksbGVuZ3RoOjUsaG91clN0ZXA6MSxtaW51dGVTdGVwOjUsc2Vjb25kU3RlcDo1LHJvdW5kRGlzcGxheTohMSxpY29uVXA6J2dseXBoaWNvbiBnbHlwaGljb24tY2hldnJvbi11cCcsaWNvbkRvd246J2dseXBoaWNvbiBnbHlwaGljb24tY2hldnJvbi1kb3duJyxhcnJvd0JlaGF2aW9yOidwYWdlcid9O3RoaXMuJGdldD1bJyR3aW5kb3cnLCckZG9jdW1lbnQnLCckcm9vdFNjb3BlJywnJHNjZScsJyRkYXRlRm9ybWF0dGVyJywnJHRvb2x0aXAnLCckdGltZW91dCcsZnVuY3Rpb24odCxuLGEsbyxpLHIscyl7ZnVuY3Rpb24gbCh0LG4sYSl7ZnVuY3Rpb24gbyhlKXt2YXIgdD02ZTQqZy5taW51dGVTdGVwO3JldHVybiBuZXcgRGF0ZShNYXRoLmZsb29yKGUuZ2V0VGltZSgpL3QpKnQpfWZ1bmN0aW9uIGwoZSxuKXt2YXIgYT1lK247aWYodFswXS5jcmVhdGVUZXh0UmFuZ2Upe3ZhciBvPXRbMF0uY3JlYXRlVGV4dFJhbmdlKCk7by5jb2xsYXBzZSghMCksby5tb3ZlU3RhcnQoJ2NoYXJhY3RlcicsZSksby5tb3ZlRW5kKCdjaGFyYWN0ZXInLGEpLG8uc2VsZWN0KCl9ZWxzZSB0WzBdLnNldFNlbGVjdGlvblJhbmdlP3RbMF0uc2V0U2VsZWN0aW9uUmFuZ2UoZSxhKTphbmd1bGFyLmlzVW5kZWZpbmVkKHRbMF0uc2VsZWN0aW9uU3RhcnQpJiYodFswXS5zZWxlY3Rpb25TdGFydD1lLHRbMF0uc2VsZWN0aW9uRW5kPWEpfWZ1bmN0aW9uIGQoKXt0WzBdLmZvY3VzKCl9dmFyIGY9cih0LGFuZ3VsYXIuZXh0ZW5kKHt9LGUsYSkpLHA9YS5zY29wZSxnPWYuJG9wdGlvbnMsbT1mLiRzY29wZSwkPWcubGFuZyxoPWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gaS5mb3JtYXREYXRlKGUsdCwkLG4pfSx2PTAsdz1nLnJvdW5kRGlzcGxheT9vKG5ldyBEYXRlKTpuZXcgRGF0ZSx5PW4uJGRhdGVWYWx1ZXx8dyxiPXtob3VyOnkuZ2V0SG91cnMoKSxtZXJpZGlhbjp5LmdldEhvdXJzKCk8MTIsbWludXRlOnkuZ2V0TWludXRlcygpLHNlY29uZDp5LmdldFNlY29uZHMoKSxtaWxsaXNlY29uZDp5LmdldE1pbGxpc2Vjb25kcygpfSxEPWkuZ2V0RGF0ZXRpbWVGb3JtYXQoZy50aW1lRm9ybWF0LCQpLGs9aS5ob3Vyc0Zvcm1hdChEKSxTPWkudGltZVNlcGFyYXRvcihEKSx4PWkubWludXRlc0Zvcm1hdChEKSxDPWkuc2Vjb25kc0Zvcm1hdChEKSxUPWkuc2hvd1NlY29uZHMoRCksRT1pLnNob3dBTShEKTttLiRpY29uVXA9Zy5pY29uVXAsbS4kaWNvbkRvd249Zy5pY29uRG93bixtLiRzZWxlY3Q9ZnVuY3Rpb24oZSx0KXtmLnNlbGVjdChlLHQpfSxtLiRtb3ZlSW5kZXg9ZnVuY3Rpb24oZSx0KXtmLiRtb3ZlSW5kZXgoZSx0KX0sbS4kc3dpdGNoTWVyaWRpYW49ZnVuY3Rpb24oZSl7Zi5zd2l0Y2hNZXJpZGlhbihlKX0sZi51cGRhdGU9ZnVuY3Rpb24oZSl7YW5ndWxhci5pc0RhdGUoZSkmJiFpc05hTihlLmdldFRpbWUoKSk/KGYuJGRhdGU9ZSxhbmd1bGFyLmV4dGVuZChiLHtob3VyOmUuZ2V0SG91cnMoKSxtaW51dGU6ZS5nZXRNaW51dGVzKCksc2Vjb25kOmUuZ2V0U2Vjb25kcygpLG1pbGxpc2Vjb25kOmUuZ2V0TWlsbGlzZWNvbmRzKCl9KSxmLiRidWlsZCgpKTpmLiRpc0J1aWx0fHxmLiRidWlsZCgpfSxmLnNlbGVjdD1mdW5jdGlvbihlLHQsYSl7KCFuLiRkYXRlVmFsdWV8fGlzTmFOKG4uJGRhdGVWYWx1ZS5nZXRUaW1lKCkpKSYmKG4uJGRhdGVWYWx1ZT1uZXcgRGF0ZSgxOTcwLDAsMSkpLGFuZ3VsYXIuaXNEYXRlKGUpfHwoZT1uZXcgRGF0ZShlKSksMD09PXQ/bi4kZGF0ZVZhbHVlLnNldEhvdXJzKGUuZ2V0SG91cnMoKSk6MT09PXQ/bi4kZGF0ZVZhbHVlLnNldE1pbnV0ZXMoZS5nZXRNaW51dGVzKCkpOjI9PT10JiZuLiRkYXRlVmFsdWUuc2V0U2Vjb25kcyhlLmdldFNlY29uZHMoKSksbi4kc2V0Vmlld1ZhbHVlKGFuZ3VsYXIuY29weShuLiRkYXRlVmFsdWUpKSxuLiRyZW5kZXIoKSxnLmF1dG9jbG9zZSYmIWEmJnMoZnVuY3Rpb24oKXtmLmhpZGUoITApfSl9LGYuc3dpdGNoTWVyaWRpYW49ZnVuY3Rpb24oZSl7aWYobi4kZGF0ZVZhbHVlJiYhaXNOYU4obi4kZGF0ZVZhbHVlLmdldFRpbWUoKSkpe3ZhciB0PShlfHxuLiRkYXRlVmFsdWUpLmdldEhvdXJzKCk7bi4kZGF0ZVZhbHVlLnNldEhvdXJzKDEyPnQ/dCsxMjp0LTEyKSxuLiRzZXRWaWV3VmFsdWUoYW5ndWxhci5jb3B5KG4uJGRhdGVWYWx1ZSkpLG4uJHJlbmRlcigpfX0sZi4kYnVpbGQ9ZnVuY3Rpb24oKXt2YXIgZSx0LG49bS5taWRJbmRleD1wYXJzZUludChnLmxlbmd0aC8yLDEwKSxhPVtdO2ZvcihlPTA7ZTxnLmxlbmd0aDtlKyspdD1uZXcgRGF0ZSgxOTcwLDAsMSxiLmhvdXItKG4tZSkqZy5ob3VyU3RlcCksYS5wdXNoKHtkYXRlOnQsbGFiZWw6aCh0LGspLHNlbGVjdGVkOmYuJGRhdGUmJmYuJGlzU2VsZWN0ZWQodCwwKSxkaXNhYmxlZDpmLiRpc0Rpc2FibGVkKHQsMCl9KTt2YXIgbyxpPVtdO2ZvcihlPTA7ZTxnLmxlbmd0aDtlKyspbz1uZXcgRGF0ZSgxOTcwLDAsMSwwLGIubWludXRlLShuLWUpKmcubWludXRlU3RlcCksaS5wdXNoKHtkYXRlOm8sbGFiZWw6aChvLHgpLHNlbGVjdGVkOmYuJGRhdGUmJmYuJGlzU2VsZWN0ZWQobywxKSxkaXNhYmxlZDpmLiRpc0Rpc2FibGVkKG8sMSl9KTt2YXIgcixzPVtdO2ZvcihlPTA7ZTxnLmxlbmd0aDtlKyspcj1uZXcgRGF0ZSgxOTcwLDAsMSwwLDAsYi5zZWNvbmQtKG4tZSkqZy5zZWNvbmRTdGVwKSxzLnB1c2goe2RhdGU6cixsYWJlbDpoKHIsQyksc2VsZWN0ZWQ6Zi4kZGF0ZSYmZi4kaXNTZWxlY3RlZChyLDIpLGRpc2FibGVkOmYuJGlzRGlzYWJsZWQociwyKX0pO3ZhciBsPVtdO2ZvcihlPTA7ZTxnLmxlbmd0aDtlKyspVD9sLnB1c2goW2FbZV0saVtlXSxzW2VdXSk6bC5wdXNoKFthW2VdLGlbZV1dKTttLnJvd3M9bCxtLnNob3dTZWNvbmRzPVQsbS5zaG93QU09RSxtLmlzQU09KGYuJGRhdGV8fGFbbl0uZGF0ZSkuZ2V0SG91cnMoKTwxMixtLnRpbWVTZXBhcmF0b3I9UyxmLiRpc0J1aWx0PSEwfSxmLiRpc1NlbGVjdGVkPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIGYuJGRhdGU/MD09PXQ/ZS5nZXRIb3VycygpPT09Zi4kZGF0ZS5nZXRIb3VycygpOjE9PT10P2UuZ2V0TWludXRlcygpPT09Zi4kZGF0ZS5nZXRNaW51dGVzKCk6Mj09PXQ/ZS5nZXRTZWNvbmRzKCk9PT1mLiRkYXRlLmdldFNlY29uZHMoKTp2b2lkIDA6ITF9LGYuJGlzRGlzYWJsZWQ9ZnVuY3Rpb24oZSx0KXt2YXIgbjtyZXR1cm4gMD09PXQ/bj1lLmdldFRpbWUoKSs2ZTQqYi5taW51dGUrMWUzKmIuc2Vjb25kOjE9PT10P249ZS5nZXRUaW1lKCkrMzZlNSpiLmhvdXIrMWUzKmIuc2Vjb25kOjI9PT10JiYobj1lLmdldFRpbWUoKSszNmU1KmIuaG91cis2ZTQqYi5taW51dGUpLG48MSpnLm1pblRpbWV8fG4+MSpnLm1heFRpbWV9LG0uJGFycm93QWN0aW9uPWZ1bmN0aW9uKGUsdCl7J3BpY2tlcic9PT1nLmFycm93QmVoYXZpb3I/Zi4kc2V0VGltZUJ5U3RlcChlLHQpOmYuJG1vdmVJbmRleChlLHQpfSxmLiRzZXRUaW1lQnlTdGVwPWZ1bmN0aW9uKGUsdCl7dmFyIG49bmV3IERhdGUoZi4kZGF0ZXx8eSksYT1uLmdldEhvdXJzKCksbz1uLmdldE1pbnV0ZXMoKSxpPW4uZ2V0U2Vjb25kcygpOzA9PT10P24uc2V0SG91cnMoYS1wYXJzZUludChnLmhvdXJTdGVwLDEwKSplKToxPT09dD9uLnNldE1pbnV0ZXMoby1wYXJzZUludChnLm1pbnV0ZVN0ZXAsMTApKmUpOjI9PT10JiZuLnNldFNlY29uZHMoaS1wYXJzZUludChnLnNlY29uZFN0ZXAsMTApKmUpLGYuc2VsZWN0KG4sdCwhMCl9LGYuJG1vdmVJbmRleD1mdW5jdGlvbihlLHQpe3ZhciBuOzA9PT10PyhuPW5ldyBEYXRlKDE5NzAsMCwxLGIuaG91citlKmcubGVuZ3RoLGIubWludXRlLGIuc2Vjb25kKSxhbmd1bGFyLmV4dGVuZChiLHtob3VyOm4uZ2V0SG91cnMoKX0pKToxPT09dD8obj1uZXcgRGF0ZSgxOTcwLDAsMSxiLmhvdXIsYi5taW51dGUrZSpnLmxlbmd0aCpnLm1pbnV0ZVN0ZXAsYi5zZWNvbmQpLGFuZ3VsYXIuZXh0ZW5kKGIse21pbnV0ZTpuLmdldE1pbnV0ZXMoKX0pKToyPT09dCYmKG49bmV3IERhdGUoMTk3MCwwLDEsYi5ob3VyLGIubWludXRlLGIuc2Vjb25kK2UqZy5sZW5ndGgqZy5zZWNvbmRTdGVwKSxhbmd1bGFyLmV4dGVuZChiLHtzZWNvbmQ6bi5nZXRTZWNvbmRzKCl9KSksZi4kYnVpbGQoKX0sZi4kb25Nb3VzZURvd249ZnVuY3Rpb24oZSl7aWYoJ2lucHV0JyE9PWUudGFyZ2V0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkmJmUucHJldmVudERlZmF1bHQoKSxlLnN0b3BQcm9wYWdhdGlvbigpLGMpe3ZhciB0PWFuZ3VsYXIuZWxlbWVudChlLnRhcmdldCk7J2J1dHRvbichPT10WzBdLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkmJih0PXQucGFyZW50KCkpLHQudHJpZ2dlckhhbmRsZXIoJ2NsaWNrJyl9fSxmLiRvbktleURvd249ZnVuY3Rpb24oZSl7aWYoLygzOHwzN3wzOXw0MHwxMykvLnRlc3QoZS5rZXlDb2RlKSYmIWUuc2hpZnRLZXkmJiFlLmFsdEtleSl7aWYoZS5wcmV2ZW50RGVmYXVsdCgpLGUuc3RvcFByb3BhZ2F0aW9uKCksMTM9PT1lLmtleUNvZGUpcmV0dXJuIHZvaWQgZi5oaWRlKCEwKTt2YXIgdD1uZXcgRGF0ZShmLiRkYXRlKSxuPXQuZ2V0SG91cnMoKSxhPWgodCxrKS5sZW5ndGgsbz10LmdldE1pbnV0ZXMoKSxpPWgodCx4KS5sZW5ndGgscj10LmdldFNlY29uZHMoKSxzPWgodCxDKS5sZW5ndGgsdT0xLGM9LygzN3wzOSkvLnRlc3QoZS5rZXlDb2RlKSxkPTIrMSpUKzEqRTtjJiYoMzc9PT1lLmtleUNvZGU/dj0xPnY/ZC0xOnYtMTozOT09PWUua2V5Q29kZSYmKHY9ZC0xPnY/disxOjApKTt2YXIgbT1bMCxhXSwkPTA7Mzg9PT1lLmtleUNvZGUmJigkPS0xKSw0MD09PWUua2V5Q29kZSYmKCQ9MSk7dmFyIHc9Mj09PXYmJlQseT0yPT09diYmIVR8fDM9PT12JiZUOzA9PT12Pyh0LnNldEhvdXJzKG4rJCpwYXJzZUludChnLmhvdXJTdGVwLDEwKSksYT1oKHQsaykubGVuZ3RoLG09WzAsYV0pOjE9PT12Pyh0LnNldE1pbnV0ZXMobyskKnBhcnNlSW50KGcubWludXRlU3RlcCwxMCkpLGk9aCh0LHgpLmxlbmd0aCxtPVthK3UsaV0pOnc/KHQuc2V0U2Vjb25kcyhyKyQqcGFyc2VJbnQoZy5zZWNvbmRTdGVwLDEwKSkscz1oKHQsQykubGVuZ3RoLG09W2ErdStpK3Usc10pOnkmJihjfHxmLnN3aXRjaE1lcmlkaWFuKCksbT1bYSt1K2krdSsocyt1KSpULDJdKSxmLnNlbGVjdCh0LHYsITApLGwobVswXSxtWzFdKSxwLiRkaWdlc3QoKX19O3ZhciBNPWYuaW5pdDtmLmluaXQ9ZnVuY3Rpb24oKXtyZXR1cm4gdSYmZy51c2VOYXRpdmU/KHQucHJvcCgndHlwZScsJ3RpbWUnKSx2b2lkIHQuY3NzKCctd2Via2l0LWFwcGVhcmFuY2UnLCd0ZXh0ZmllbGQnKSk6KGMmJih0LnByb3AoJ3R5cGUnLCd0ZXh0JyksdC5hdHRyKCdyZWFkb25seScsJ3RydWUnKSx0Lm9uKCdjbGljaycsZCkpLHZvaWQgTSgpKX07dmFyIEE9Zi5kZXN0cm95O2YuZGVzdHJveT1mdW5jdGlvbigpe3UmJmcudXNlTmF0aXZlJiZ0Lm9mZignY2xpY2snLGQpLEEoKX07dmFyIEY9Zi5zaG93O2Yuc2hvdz1mdW5jdGlvbigpeyFjJiZ0LmF0dHIoJ3JlYWRvbmx5Jyl8fHQuYXR0cignZGlzYWJsZWQnKXx8KEYoKSxzKGZ1bmN0aW9uKCl7Zi4kZWxlbWVudCYmZi4kZWxlbWVudC5vbihjPyd0b3VjaHN0YXJ0JzonbW91c2Vkb3duJyxmLiRvbk1vdXNlRG93biksZy5rZXlib2FyZCYmdCYmdC5vbigna2V5ZG93bicsZi4kb25LZXlEb3duKX0sMCwhMSkpfTt2YXIgVj1mLmhpZGU7cmV0dXJuIGYuaGlkZT1mdW5jdGlvbihlKXtmLiRpc1Nob3duJiYoZi4kZWxlbWVudCYmZi4kZWxlbWVudC5vZmYoYz8ndG91Y2hzdGFydCc6J21vdXNlZG93bicsZi4kb25Nb3VzZURvd24pLGcua2V5Ym9hcmQmJnQmJnQub2ZmKCdrZXlkb3duJyxmLiRvbktleURvd24pLFYoZSkpfSxmfXZhciB1PS8oaXBbYW9dZHxpcGhvbmV8YW5kcm9pZCkvZ2kudGVzdCh0Lm5hdmlnYXRvci51c2VyQWdlbnQpLGM9J2NyZWF0ZVRvdWNoJ2luIHQuZG9jdW1lbnQmJnU7cmV0dXJuIGUubGFuZ3x8KGUubGFuZz1pLmdldERlZmF1bHRMb2NhbGUoKSksbC5kZWZhdWx0cz1lLGx9XX0pLmRpcmVjdGl2ZSgnYnNUaW1lcGlja2VyJyxbJyR3aW5kb3cnLCckcGFyc2UnLCckcScsJyRkYXRlRm9ybWF0dGVyJywnJGRhdGVQYXJzZXInLCckdGltZXBpY2tlcicsZnVuY3Rpb24oZSx0LGEsbyxpLHIpe3ZhciBzPXIuZGVmYXVsdHMsbD0vKGlwW2FvXWR8aXBob25lfGFuZHJvaWQpL2dpLnRlc3QoZS5uYXZpZ2F0b3IudXNlckFnZW50KTtyZXR1cm57cmVzdHJpY3Q6J0VBQycscmVxdWlyZTonbmdNb2RlbCcsbGluazpmdW5jdGlvbihlLHQsYSx1KXtmdW5jdGlvbiBjKGUpe2lmKGFuZ3VsYXIuaXNEYXRlKGUpKXt2YXIgdD1pc05hTihmLm1pblRpbWUpfHxuZXcgRGF0ZShlLmdldFRpbWUoKSkuc2V0RnVsbFllYXIoMTk3MCwwLDEpPj1mLm1pblRpbWUsbj1pc05hTihmLm1heFRpbWUpfHxuZXcgRGF0ZShlLmdldFRpbWUoKSkuc2V0RnVsbFllYXIoMTk3MCwwLDEpPD1mLm1heFRpbWUsYT10JiZuO3UuJHNldFZhbGlkaXR5KCdkYXRlJyxhKSx1LiRzZXRWYWxpZGl0eSgnbWluJyx0KSx1LiRzZXRWYWxpZGl0eSgnbWF4JyxuKSxhJiYodS4kZGF0ZVZhbHVlPWUpfX1mdW5jdGlvbiBkKCl7cmV0dXJuIXUuJGRhdGVWYWx1ZXx8aXNOYU4odS4kZGF0ZVZhbHVlLmdldFRpbWUoKSk/Jyc6JCh1LiRkYXRlVmFsdWUsZi50aW1lRm9ybWF0KX12YXIgZj17c2NvcGU6ZX07YW5ndWxhci5mb3JFYWNoKFsndGVtcGxhdGUnLCd0ZW1wbGF0ZVVybCcsJ2NvbnRyb2xsZXInLCdjb250cm9sbGVyQXMnLCdwbGFjZW1lbnQnLCdjb250YWluZXInLCdkZWxheScsJ3RyaWdnZXInLCdrZXlib2FyZCcsJ2h0bWwnLCdhbmltYXRpb24nLCdhdXRvY2xvc2UnLCd0aW1lVHlwZScsJ3RpbWVGb3JtYXQnLCd0aW1lem9uZScsJ21vZGVsVGltZUZvcm1hdCcsJ3VzZU5hdGl2ZScsJ2hvdXJTdGVwJywnbWludXRlU3RlcCcsJ3NlY29uZFN0ZXAnLCdsZW5ndGgnLCdhcnJvd0JlaGF2aW9yJywnaWNvblVwJywnaWNvbkRvd24nLCdyb3VuZERpc3BsYXknLCdpZCcsJ3ByZWZpeENsYXNzJywncHJlZml4RXZlbnQnXSxmdW5jdGlvbihlKXthbmd1bGFyLmlzRGVmaW5lZChhW2VdKSYmKGZbZV09YVtlXSl9KTt2YXIgcD0vXihmYWxzZXwwfCkkL2k7YW5ndWxhci5mb3JFYWNoKFsnaHRtbCcsJ2NvbnRhaW5lcicsJ2F1dG9jbG9zZScsJ3VzZU5hdGl2ZScsJ3JvdW5kRGlzcGxheSddLGZ1bmN0aW9uKGUpe2FuZ3VsYXIuaXNEZWZpbmVkKGFbZV0pJiZwLnRlc3QoYVtlXSkmJihmW2VdPSExKX0pLGwmJihmLnVzZU5hdGl2ZXx8cy51c2VOYXRpdmUpJiYoZi50aW1lRm9ybWF0PSdISDptbScpO3ZhciBnPXIodCx1LGYpO2Y9Zy4kb3B0aW9uczt2YXIgbT1mLmxhbmcsJD1mdW5jdGlvbihlLHQsbil7cmV0dXJuIG8uZm9ybWF0RGF0ZShlLHQsbSxuKX07YS5ic1Nob3cmJmUuJHdhdGNoKGEuYnNTaG93LGZ1bmN0aW9uKGUsdCl7ZyYmYW5ndWxhci5pc0RlZmluZWQoZSkmJihhbmd1bGFyLmlzU3RyaW5nKGUpJiYoZT0hIWUubWF0Y2goL3RydWV8LD8odGltZXBpY2tlciksPy9pKSksZT09PSEwP2cuc2hvdygpOmcuaGlkZSgpKX0pO3ZhciBoPWkoe2Zvcm1hdDpmLnRpbWVGb3JtYXQsbGFuZzptfSk7YW5ndWxhci5mb3JFYWNoKFsnbWluVGltZScsJ21heFRpbWUnXSxmdW5jdGlvbihlKXthbmd1bGFyLmlzRGVmaW5lZChhW2VdKSYmYS4kb2JzZXJ2ZShlLGZ1bmN0aW9uKHQpe2cuJG9wdGlvbnNbZV09aC5nZXRUaW1lRm9yQXR0cmlidXRlKGUsdCksaXNOYU4oZy4kb3B0aW9uc1tlXSl8fGcuJGJ1aWxkKCksYyh1LiRkYXRlVmFsdWUpfSl9KSxlLiR3YXRjaChhLm5nTW9kZWwsZnVuY3Rpb24oZSx0KXtnLnVwZGF0ZSh1LiRkYXRlVmFsdWUpfSwhMCksdS4kcGFyc2Vycy51bnNoaWZ0KGZ1bmN0aW9uKGUpe3ZhciB0O2lmKCFlKXJldHVybiB1LiRzZXRWYWxpZGl0eSgnZGF0ZScsITApLG51bGw7dmFyIGE9YW5ndWxhci5pc0RhdGUoZSk/ZTpoLnBhcnNlKGUsdS4kZGF0ZVZhbHVlKTtyZXR1cm4hYXx8aXNOYU4oYS5nZXRUaW1lKCkpPyh1LiRzZXRWYWxpZGl0eSgnZGF0ZScsITEpLG4pOihjKGEpLCdzdHJpbmcnPT09Zi50aW1lVHlwZT8odD1oLnRpbWV6b25lT2Zmc2V0QWRqdXN0KGEsZi50aW1lem9uZSwhMCksJCh0LGYubW9kZWxUaW1lRm9ybWF0fHxmLnRpbWVGb3JtYXQpKToodD1oLnRpbWV6b25lT2Zmc2V0QWRqdXN0KHUuJGRhdGVWYWx1ZSxmLnRpbWV6b25lLCEwKSwnbnVtYmVyJz09PWYudGltZVR5cGU/dC5nZXRUaW1lKCk6J3VuaXgnPT09Zi50aW1lVHlwZT90LmdldFRpbWUoKS8xZTM6J2lzbyc9PT1mLnRpbWVUeXBlP3QudG9JU09TdHJpbmcoKTpuZXcgRGF0ZSh0KSkpfSksdS4kZm9ybWF0dGVycy5wdXNoKGZ1bmN0aW9uKGUpe3ZhciB0O3JldHVybiB0PWFuZ3VsYXIuaXNVbmRlZmluZWQoZSl8fG51bGw9PT1lP05hTjphbmd1bGFyLmlzRGF0ZShlKT9lOidzdHJpbmcnPT09Zi50aW1lVHlwZT9oLnBhcnNlKGUsbnVsbCxmLm1vZGVsVGltZUZvcm1hdCk6J3VuaXgnPT09Zi50aW1lVHlwZT9uZXcgRGF0ZSgxZTMqZSk6bmV3IERhdGUoZSksdS4kZGF0ZVZhbHVlPWgudGltZXpvbmVPZmZzZXRBZGp1c3QodCxmLnRpbWV6b25lKSxkKCl9KSx1LiRyZW5kZXI9ZnVuY3Rpb24oKXt0LnZhbChkKCkpfSxlLiRvbignJGRlc3Ryb3knLGZ1bmN0aW9uKCl7ZyYmZy5kZXN0cm95KCksZj1udWxsLGc9bnVsbH0pfX19XSksYW5ndWxhci5tb2R1bGUoJ21nY3JlYS5uZ1N0cmFwLnRhYicsW10pLnByb3ZpZGVyKCckdGFiJyxmdW5jdGlvbigpe3ZhciBlPXRoaXMuZGVmYXVsdHM9e2FuaW1hdGlvbjonYW0tZmFkZScsdGVtcGxhdGU6J3RhYi90YWIudHBsLmh0bWwnLG5hdkNsYXNzOiduYXYtdGFicycsYWN0aXZlQ2xhc3M6J2FjdGl2ZSd9LHQ9dGhpcy5jb250cm9sbGVyPWZ1bmN0aW9uKHQsbixhKXt2YXIgbz10aGlzO28uJG9wdGlvbnM9YW5ndWxhci5jb3B5KGUpLGFuZ3VsYXIuZm9yRWFjaChbJ2FuaW1hdGlvbicsJ25hdkNsYXNzJywnYWN0aXZlQ2xhc3MnXSxmdW5jdGlvbihlKXthbmd1bGFyLmlzRGVmaW5lZChhW2VdKSYmKG8uJG9wdGlvbnNbZV09YVtlXSl9KSx0LiRuYXZDbGFzcz1vLiRvcHRpb25zLm5hdkNsYXNzLHQuJGFjdGl2ZUNsYXNzPW8uJG9wdGlvbnMuYWN0aXZlQ2xhc3Msby4kcGFuZXM9dC4kcGFuZXM9W10sby4kYWN0aXZlUGFuZUNoYW5nZUxpc3RlbmVycz1vLiR2aWV3Q2hhbmdlTGlzdGVuZXJzPVtdLG8uJHB1c2g9ZnVuY3Rpb24oZSl7YW5ndWxhci5pc1VuZGVmaW5lZChvLiRwYW5lcy4kYWN0aXZlKSYmdC4kc2V0QWN0aXZlKGUubmFtZXx8MCksby4kcGFuZXMucHVzaChlKX0sby4kcmVtb3ZlPWZ1bmN0aW9uKGUpe3ZhciB0LG49by4kcGFuZXMuaW5kZXhPZihlKSxhPW8uJHBhbmVzLiRhY3RpdmU7dD1hbmd1bGFyLmlzU3RyaW5nKGEpP28uJHBhbmVzLm1hcChmdW5jdGlvbihlKXtyZXR1cm4gZS5uYW1lfSkuaW5kZXhPZihhKTpvLiRwYW5lcy4kYWN0aXZlLG8uJHBhbmVzLnNwbGljZShuLDEpLHQ+bj90LS06bj09PXQmJnQ9PT1vLiRwYW5lcy5sZW5ndGgmJnQtLSx0Pj0wJiZ0PG8uJHBhbmVzLmxlbmd0aD9vLiRzZXRBY3RpdmUoby4kcGFuZXNbdF0ubmFtZXx8dCk6by4kc2V0QWN0aXZlKCl9LG8uJHNldEFjdGl2ZT10LiRzZXRBY3RpdmU9ZnVuY3Rpb24oZSl7by4kcGFuZXMuJGFjdGl2ZT1lLG8uJGFjdGl2ZVBhbmVDaGFuZ2VMaXN0ZW5lcnMuZm9yRWFjaChmdW5jdGlvbihlKXtlKCl9KX0sby4kaXNBY3RpdmU9dC4kaXNBY3RpdmU9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gby4kcGFuZXMuJGFjdGl2ZT09PWUubmFtZXx8by4kcGFuZXMuJGFjdGl2ZT09PXR9fTt0aGlzLiRnZXQ9ZnVuY3Rpb24oKXt2YXIgbj17fTtyZXR1cm4gbi5kZWZhdWx0cz1lLG4uY29udHJvbGxlcj10LG59fSkuZGlyZWN0aXZlKCdic1RhYnMnLFsnJHdpbmRvdycsJyRhbmltYXRlJywnJHRhYicsJyRwYXJzZScsZnVuY3Rpb24oZSx0LG4sYSl7dmFyIG89bi5kZWZhdWx0cztyZXR1cm57cmVxdWlyZTpbJz9uZ01vZGVsJywnYnNUYWJzJ10sdHJhbnNjbHVkZTohMCxzY29wZTohMCxjb250cm9sbGVyOlsnJHNjb3BlJywnJGVsZW1lbnQnLCckYXR0cnMnLG4uY29udHJvbGxlcl0sdGVtcGxhdGVVcmw6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdC50ZW1wbGF0ZXx8by50ZW1wbGF0ZX0sbGluazpmdW5jdGlvbihlLHQsbixvKXt2YXIgaT1vWzBdLHI9b1sxXTtpZihpJiYoci4kYWN0aXZlUGFuZUNoYW5nZUxpc3RlbmVycy5wdXNoKGZ1bmN0aW9uKCl7aS4kc2V0Vmlld1ZhbHVlKHIuJHBhbmVzLiRhY3RpdmUpfSksaS4kZm9ybWF0dGVycy5wdXNoKGZ1bmN0aW9uKGUpe3JldHVybiByLiRzZXRBY3RpdmUoZSksZX0pKSxuLmJzQWN0aXZlUGFuZSl7dmFyIHM9YShuLmJzQWN0aXZlUGFuZSk7ci4kYWN0aXZlUGFuZUNoYW5nZUxpc3RlbmVycy5wdXNoKGZ1bmN0aW9uKCl7cy5hc3NpZ24oZSxyLiRwYW5lcy4kYWN0aXZlKX0pLGUuJHdhdGNoKG4uYnNBY3RpdmVQYW5lLGZ1bmN0aW9uKGUsdCl7ci4kc2V0QWN0aXZlKGUpfSwhMCl9fX19XSkuZGlyZWN0aXZlKCdic1BhbmUnLFsnJHdpbmRvdycsJyRhbmltYXRlJywnJHNjZScsZnVuY3Rpb24oZSx0LG4pe3JldHVybntyZXF1aXJlOlsnXj9uZ01vZGVsJywnXmJzVGFicyddLHNjb3BlOiEwLGxpbms6ZnVuY3Rpb24oZSxhLG8saSl7ZnVuY3Rpb24gcigpe3ZhciBuPXMuJHBhbmVzLmluZGV4T2YoZSk7dFtzLiRpc0FjdGl2ZShlLG4pPydhZGRDbGFzcyc6J3JlbW92ZUNsYXNzJ10oYSxzLiRvcHRpb25zLmFjdGl2ZUNsYXNzKX12YXIgcz1pWzFdO2EuYWRkQ2xhc3MoJ3RhYi1wYW5lJyksby4kb2JzZXJ2ZSgndGl0bGUnLGZ1bmN0aW9uKHQsYSl7ZS50aXRsZT1uLnRydXN0QXNIdG1sKHQpfSksZS5uYW1lPW8ubmFtZSxzLiRvcHRpb25zLmFuaW1hdGlvbiYmYS5hZGRDbGFzcyhzLiRvcHRpb25zLmFuaW1hdGlvbiksby4kb2JzZXJ2ZSgnZGlzYWJsZWQnLGZ1bmN0aW9uKHQsbil7ZS5kaXNhYmxlZD1lLiRldmFsKHQpfSkscy4kcHVzaChlKSxlLiRvbignJGRlc3Ryb3knLGZ1bmN0aW9uKCl7cy4kcmVtb3ZlKGUpfSkscy4kYWN0aXZlUGFuZUNoYW5nZUxpc3RlbmVycy5wdXNoKGZ1bmN0aW9uKCl7cigpfSkscigpfX19XSksYW5ndWxhci5tb2R1bGUoJ21nY3JlYS5uZ1N0cmFwLnNlbGVjdCcsWydtZ2NyZWEubmdTdHJhcC50b29sdGlwJywnbWdjcmVhLm5nU3RyYXAuaGVscGVycy5wYXJzZU9wdGlvbnMnXSkucHJvdmlkZXIoJyRzZWxlY3QnLGZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5kZWZhdWx0cz17YW5pbWF0aW9uOidhbS1mYWRlJyxwcmVmaXhDbGFzczonc2VsZWN0JyxwcmVmaXhFdmVudDonJHNlbGVjdCcscGxhY2VtZW50Oidib3R0b20tbGVmdCcsdGVtcGxhdGVVcmw6J3NlbGVjdC9zZWxlY3QudHBsLmh0bWwnLHRyaWdnZXI6J2ZvY3VzJyxjb250YWluZXI6ITEsa2V5Ym9hcmQ6ITAsaHRtbDohMSxkZWxheTowLG11bHRpcGxlOiExLGFsbE5vbmVCdXR0b25zOiExLHNvcnQ6ITAsY2FyZXRIdG1sOicmbmJzcDs8c3BhbiBjbGFzcz1cImNhcmV0XCI+PC9zcGFuPicscGxhY2Vob2xkZXI6J0Nob29zZSBhbW9uZyB0aGUgZm9sbG93aW5nLi4uJyxhbGxUZXh0OidBbGwnLG5vbmVUZXh0OidOb25lJyxtYXhMZW5ndGg6MyxtYXhMZW5ndGhIdG1sOidzZWxlY3RlZCcsaWNvbkNoZWNrbWFyazonZ2x5cGhpY29uIGdseXBoaWNvbi1vayd9O3RoaXMuJGdldD1bJyR3aW5kb3cnLCckZG9jdW1lbnQnLCckcm9vdFNjb3BlJywnJHRvb2x0aXAnLCckdGltZW91dCcsZnVuY3Rpb24odCxuLGEsbyxpKXtmdW5jdGlvbiByKGEscixzKXt2YXIgdT17fSxjPWFuZ3VsYXIuZXh0ZW5kKHt9LGUscyk7dT1vKGEsYyk7dmFyIGQ9dS4kc2NvcGU7ZC4kbWF0Y2hlcz1bXSxjLm11bHRpcGxlP2QuJGFjdGl2ZUluZGV4PVtdOmQuJGFjdGl2ZUluZGV4PS0xLGQuJGlzTXVsdGlwbGU9Yy5tdWx0aXBsZSxkLiRzaG93QWxsTm9uZUJ1dHRvbnM9Yy5hbGxOb25lQnV0dG9ucyYmYy5tdWx0aXBsZSxkLiRpY29uQ2hlY2ttYXJrPWMuaWNvbkNoZWNrbWFyayxkLiRhbGxUZXh0PWMuYWxsVGV4dCxkLiRub25lVGV4dD1jLm5vbmVUZXh0LGQuJGFjdGl2YXRlPWZ1bmN0aW9uKGUpe2QuJCRwb3N0RGlnZXN0KGZ1bmN0aW9uKCl7dS5hY3RpdmF0ZShlKX0pfSxkLiRzZWxlY3Q9ZnVuY3Rpb24oZSx0KXtkLiQkcG9zdERpZ2VzdChmdW5jdGlvbigpe3Uuc2VsZWN0KGUpfSl9LGQuJGlzVmlzaWJsZT1mdW5jdGlvbigpe3JldHVybiB1LiRpc1Zpc2libGUoKX0sZC4kaXNBY3RpdmU9ZnVuY3Rpb24oZSl7cmV0dXJuIHUuJGlzQWN0aXZlKGUpfSxkLiRzZWxlY3RBbGw9ZnVuY3Rpb24oKXtmb3IodmFyIGU9MDtlPGQuJG1hdGNoZXMubGVuZ3RoO2UrKylkLiRpc0FjdGl2ZShlKXx8ZC4kc2VsZWN0KGUpfSxkLiRzZWxlY3ROb25lPWZ1bmN0aW9uKCl7Zm9yKHZhciBlPTA7ZTxkLiRtYXRjaGVzLmxlbmd0aDtlKyspZC4kaXNBY3RpdmUoZSkmJmQuJHNlbGVjdChlKX0sdS51cGRhdGU9ZnVuY3Rpb24oZSl7ZC4kbWF0Y2hlcz1lLHUuJHVwZGF0ZUFjdGl2ZUluZGV4KCl9LHUuYWN0aXZhdGU9ZnVuY3Rpb24oZSl7cmV0dXJuIGMubXVsdGlwbGU/KHUuJGlzQWN0aXZlKGUpP2QuJGFjdGl2ZUluZGV4LnNwbGljZShkLiRhY3RpdmVJbmRleC5pbmRleE9mKGUpLDEpOmQuJGFjdGl2ZUluZGV4LnB1c2goZSksYy5zb3J0JiZkLiRhY3RpdmVJbmRleC5zb3J0KGZ1bmN0aW9uKGUsdCl7cmV0dXJuIGUtdH0pKTpkLiRhY3RpdmVJbmRleD1lLGQuJGFjdGl2ZUluZGV4fSx1LnNlbGVjdD1mdW5jdGlvbihlKXt2YXIgdD1kLiRtYXRjaGVzW2VdLnZhbHVlO2QuJGFwcGx5KGZ1bmN0aW9uKCl7dS5hY3RpdmF0ZShlKSxjLm11bHRpcGxlP3IuJHNldFZpZXdWYWx1ZShkLiRhY3RpdmVJbmRleC5tYXAoZnVuY3Rpb24oZSl7cmV0dXJuIGFuZ3VsYXIuaXNVbmRlZmluZWQoZC4kbWF0Y2hlc1tlXSk/bnVsbDpkLiRtYXRjaGVzW2VdLnZhbHVlfSkpOihyLiRzZXRWaWV3VmFsdWUodCksdS5oaWRlKCkpfSksZC4kZW1pdChjLnByZWZpeEV2ZW50Kycuc2VsZWN0Jyx0LGUsdSl9LHUuJHVwZGF0ZUFjdGl2ZUluZGV4PWZ1bmN0aW9uKCl7Yy5tdWx0aXBsZT9hbmd1bGFyLmlzQXJyYXkoci4kbW9kZWxWYWx1ZSk/ZC4kYWN0aXZlSW5kZXg9ci4kbW9kZWxWYWx1ZS5tYXAoZnVuY3Rpb24oZSl7cmV0dXJuIHUuJGdldEluZGV4KGUpfSk6ZC4kYWN0aXZlSW5kZXg9W106YW5ndWxhci5pc0RlZmluZWQoci4kbW9kZWxWYWx1ZSkmJmQuJG1hdGNoZXMubGVuZ3RoP2QuJGFjdGl2ZUluZGV4PXUuJGdldEluZGV4KHIuJG1vZGVsVmFsdWUpOmQuJGFjdGl2ZUluZGV4PS0xfSx1LiRpc1Zpc2libGU9ZnVuY3Rpb24oKXtyZXR1cm4gYy5taW5MZW5ndGgmJnI/ZC4kbWF0Y2hlcy5sZW5ndGgmJnIuJHZpZXdWYWx1ZS5sZW5ndGg+PWMubWluTGVuZ3RoOmQuJG1hdGNoZXMubGVuZ3RofSx1LiRpc0FjdGl2ZT1mdW5jdGlvbihlKXtyZXR1cm4gYy5tdWx0aXBsZT8tMSE9PWQuJGFjdGl2ZUluZGV4LmluZGV4T2YoZSk6ZC4kYWN0aXZlSW5kZXg9PT1lfSx1LiRnZXRJbmRleD1mdW5jdGlvbihlKXt2YXIgdDtmb3IodD1kLiRtYXRjaGVzLmxlbmd0aDt0LS0mJiFhbmd1bGFyLmVxdWFscyhkLiRtYXRjaGVzW3RdLnZhbHVlLGUpOyk7cmV0dXJuIHR9LHUuJG9uTW91c2VEb3duPWZ1bmN0aW9uKGUpe2lmKGUucHJldmVudERlZmF1bHQoKSxlLnN0b3BQcm9wYWdhdGlvbigpLGwpe3ZhciB0PWFuZ3VsYXIuZWxlbWVudChlLnRhcmdldCk7dC50cmlnZ2VySGFuZGxlcignY2xpY2snKX19LHUuJG9uS2V5RG93bj1mdW5jdGlvbihlKXtyZXR1cm4vKDl8MTN8Mzh8NDApLy50ZXN0KGUua2V5Q29kZSk/KDkhPT1lLmtleUNvZGUmJihlLnByZXZlbnREZWZhdWx0KCksZS5zdG9wUHJvcGFnYXRpb24oKSksYy5tdWx0aXBsZSYmOT09PWUua2V5Q29kZT91LmhpZGUoKTpjLm11bHRpcGxlfHwxMyE9PWUua2V5Q29kZSYmOSE9PWUua2V5Q29kZT92b2lkKGMubXVsdGlwbGV8fCgzOD09PWUua2V5Q29kZSYmZC4kYWN0aXZlSW5kZXg+MD9kLiRhY3RpdmVJbmRleC0tOjM4PT09ZS5rZXlDb2RlJiZkLiRhY3RpdmVJbmRleDwwP2QuJGFjdGl2ZUluZGV4PWQuJG1hdGNoZXMubGVuZ3RoLTE6NDA9PT1lLmtleUNvZGUmJmQuJGFjdGl2ZUluZGV4PGQuJG1hdGNoZXMubGVuZ3RoLTE/ZC4kYWN0aXZlSW5kZXgrKzphbmd1bGFyLmlzVW5kZWZpbmVkKGQuJGFjdGl2ZUluZGV4KSYmKGQuJGFjdGl2ZUluZGV4PTApLGQuJGRpZ2VzdCgpKSk6dS5zZWxlY3QoZC4kYWN0aXZlSW5kZXgpKTp2b2lkIDB9LHUuJGlzSUU9ZnVuY3Rpb24oKXt2YXIgZT10Lm5hdmlnYXRvci51c2VyQWdlbnQ7cmV0dXJuIGUuaW5kZXhPZignTVNJRSAnKT4wfHxlLmluZGV4T2YoJ1RyaWRlbnQvJyk+MHx8ZS5pbmRleE9mKCdFZGdlLycpPjB9LHUuJHNlbGVjdFNjcm9sbEZpeD1mdW5jdGlvbihlKXsnVUwnPT09blswXS5hY3RpdmVFbGVtZW50LnRhZ05hbWUmJihlLnByZXZlbnREZWZhdWx0KCksZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKSxlLnRhcmdldC5mb2N1cygpKX07dmFyIGY9dS5zaG93O3Uuc2hvdz1mdW5jdGlvbigpe2YoKSxjLm11bHRpcGxlJiZ1LiRlbGVtZW50LmFkZENsYXNzKCdzZWxlY3QtbXVsdGlwbGUnKSxpKGZ1bmN0aW9uKCl7dS4kZWxlbWVudC5vbihsPyd0b3VjaHN0YXJ0JzonbW91c2Vkb3duJyx1LiRvbk1vdXNlRG93biksYy5rZXlib2FyZCYmYS5vbigna2V5ZG93bicsdS4kb25LZXlEb3duKX0sMCwhMSl9O3ZhciBwPXUuaGlkZTtyZXR1cm4gdS5oaWRlPWZ1bmN0aW9uKCl7IWMubXVsdGlwbGUmJmFuZ3VsYXIuaXNVbmRlZmluZWQoci4kbW9kZWxWYWx1ZSkmJihkLiRhY3RpdmVJbmRleD0tMSksdS4kZWxlbWVudC5vZmYobD8ndG91Y2hzdGFydCc6J21vdXNlZG93bicsdS4kb25Nb3VzZURvd24pLGMua2V5Ym9hcmQmJmEub2ZmKCdrZXlkb3duJyx1LiRvbktleURvd24pLHAoITApfSx1fXZhciBzPS8oaXBbYW9dZHxpcGhvbmV8YW5kcm9pZCkvZ2kudGVzdCh0Lm5hdmlnYXRvci51c2VyQWdlbnQpLGw9J2NyZWF0ZVRvdWNoJ2luIHQuZG9jdW1lbnQmJnM7cmV0dXJuIHIuZGVmYXVsdHM9ZSxyfV19KS5kaXJlY3RpdmUoJ2JzU2VsZWN0JyxbJyR3aW5kb3cnLCckcGFyc2UnLCckcScsJyRzZWxlY3QnLCckcGFyc2VPcHRpb25zJyxmdW5jdGlvbihlLHQsbixhLG8pe3ZhciBpPWEuZGVmYXVsdHM7cmV0dXJue3Jlc3RyaWN0OidFQUMnLHJlcXVpcmU6J25nTW9kZWwnLGxpbms6ZnVuY3Rpb24oZSx0LG4scil7dmFyIHM9e3Njb3BlOmUscGxhY2Vob2xkZXI6aS5wbGFjZWhvbGRlcn07YW5ndWxhci5mb3JFYWNoKFsndGVtcGxhdGUnLCd0ZW1wbGF0ZVVybCcsJ2NvbnRyb2xsZXInLCdjb250cm9sbGVyQXMnLCdwbGFjZW1lbnQnLCdjb250YWluZXInLCdkZWxheScsJ3RyaWdnZXInLCdrZXlib2FyZCcsJ2h0bWwnLCdhbmltYXRpb24nLCdwbGFjZWhvbGRlcicsJ2FsbE5vbmVCdXR0b25zJywnbWF4TGVuZ3RoJywnbWF4TGVuZ3RoSHRtbCcsJ2FsbFRleHQnLCdub25lVGV4dCcsJ2ljb25DaGVja21hcmsnLCdhdXRvQ2xvc2UnLCdpZCcsJ3NvcnQnLCdjYXJldEh0bWwnLCdwcmVmaXhDbGFzcycsJ3ByZWZpeEV2ZW50J10sZnVuY3Rpb24oZSl7YW5ndWxhci5pc0RlZmluZWQobltlXSkmJihzW2VdPW5bZV0pfSk7dmFyIGw9L14oZmFsc2V8MHwpJC9pO2FuZ3VsYXIuZm9yRWFjaChbJ2h0bWwnLCdjb250YWluZXInLCdhbGxOb25lQnV0dG9ucycsJ3NvcnQnXSxmdW5jdGlvbihlKXthbmd1bGFyLmlzRGVmaW5lZChuW2VdKSYmbC50ZXN0KG5bZV0pJiYoc1tlXT0hMSl9KTt2YXIgdT10LmF0dHIoJ2RhdGEtbXVsdGlwbGUnKTtpZihhbmd1bGFyLmlzRGVmaW5lZCh1KSYmKGwudGVzdCh1KT9zLm11bHRpcGxlPSExOnMubXVsdGlwbGU9dSksJ3NlbGVjdCc9PT10WzBdLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkpe3ZhciBjPXQ7Yy5jc3MoJ2Rpc3BsYXknLCdub25lJyksdD1hbmd1bGFyLmVsZW1lbnQoJzxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1kZWZhdWx0XCI+PC9idXR0b24+JyksYy5hZnRlcih0KX12YXIgZD1vKG4uYnNPcHRpb25zKSxmPWEodCxyLHMpO2YuJGlzSUUoKSYmdFswXS5hZGRFdmVudExpc3RlbmVyKCdibHVyJyxmLiRzZWxlY3RTY3JvbGxGaXgpO3ZhciBwPWQuJG1hdGNoWzddLnJlcGxhY2UoL1xcfC4rLywnJykudHJpbSgpO2UuJHdhdGNoKHAsZnVuY3Rpb24odCxuKXtkLnZhbHVlc0ZuKGUscikudGhlbihmdW5jdGlvbihlKXtmLnVwZGF0ZShlKSxyLiRyZW5kZXIoKX0pfSwhMCksZS4kd2F0Y2gobi5uZ01vZGVsLGZ1bmN0aW9uKGUsdCl7Zi4kdXBkYXRlQWN0aXZlSW5kZXgoKSxyLiRyZW5kZXIoKX0sITApLHIuJHJlbmRlcj1mdW5jdGlvbigpe3ZhciBlLG47cy5tdWx0aXBsZSYmYW5ndWxhci5pc0FycmF5KHIuJG1vZGVsVmFsdWUpPyhlPXIuJG1vZGVsVmFsdWUubWFwKGZ1bmN0aW9uKGUpe3JldHVybiBuPWYuJGdldEluZGV4KGUpLC0xIT09bj9mLiRzY29wZS4kbWF0Y2hlc1tuXS5sYWJlbDohMX0pLmZpbHRlcihhbmd1bGFyLmlzRGVmaW5lZCksZT1lLmxlbmd0aD4ocy5tYXhMZW5ndGh8fGkubWF4TGVuZ3RoKT9lLmxlbmd0aCsnICcrKHMubWF4TGVuZ3RoSHRtbHx8aS5tYXhMZW5ndGhIdG1sKTplLmpvaW4oJywgJykpOihuPWYuJGdldEluZGV4KHIuJG1vZGVsVmFsdWUpLFxuZT0tMSE9PW4/Zi4kc2NvcGUuJG1hdGNoZXNbbl0ubGFiZWw6ITEpLHQuaHRtbCgoZT9lOnMucGxhY2Vob2xkZXIpKyhzLmNhcmV0SHRtbD9zLmNhcmV0SHRtbDppLmNhcmV0SHRtbCkpfSxzLm11bHRpcGxlJiYoci4kaXNFbXB0eT1mdW5jdGlvbihlKXtyZXR1cm4hZXx8MD09PWUubGVuZ3RofSksZS4kb24oJyRkZXN0cm95JyxmdW5jdGlvbigpe2YmJmYuZGVzdHJveSgpLHM9bnVsbCxmPW51bGx9KX19fV0pLGFuZ3VsYXIubW9kdWxlKCdtZ2NyZWEubmdTdHJhcC5wb3BvdmVyJyxbJ21nY3JlYS5uZ1N0cmFwLnRvb2x0aXAnXSkucHJvdmlkZXIoJyRwb3BvdmVyJyxmdW5jdGlvbigpe3ZhciBlPXRoaXMuZGVmYXVsdHM9e2FuaW1hdGlvbjonYW0tZmFkZScsY3VzdG9tQ2xhc3M6JycsY29udGFpbmVyOiExLHRhcmdldDohMSxwbGFjZW1lbnQ6J3JpZ2h0Jyx0ZW1wbGF0ZVVybDoncG9wb3Zlci9wb3BvdmVyLnRwbC5odG1sJyxjb250ZW50VGVtcGxhdGU6ITEsdHJpZ2dlcjonY2xpY2snLGtleWJvYXJkOiEwLGh0bWw6ITEsdGl0bGU6JycsY29udGVudDonJyxkZWxheTowLGF1dG9DbG9zZTohMX07dGhpcy4kZ2V0PVsnJHRvb2x0aXAnLGZ1bmN0aW9uKHQpe2Z1bmN0aW9uIG4obixhKXt2YXIgbz1hbmd1bGFyLmV4dGVuZCh7fSxlLGEpLGk9dChuLG8pO3JldHVybiBvLmNvbnRlbnQmJihpLiRzY29wZS5jb250ZW50PW8uY29udGVudCksaX1yZXR1cm4gbn1dfSkuZGlyZWN0aXZlKCdic1BvcG92ZXInLFsnJHdpbmRvdycsJyRzY2UnLCckcG9wb3ZlcicsZnVuY3Rpb24oZSx0LG4pe3ZhciBhPWUucmVxdWVzdEFuaW1hdGlvbkZyYW1lfHxlLnNldFRpbWVvdXQ7cmV0dXJue3Jlc3RyaWN0OidFQUMnLHNjb3BlOiEwLGxpbms6ZnVuY3Rpb24oZSxvLGkpe3ZhciByLHM9e3Njb3BlOmV9O2FuZ3VsYXIuZm9yRWFjaChbJ3RlbXBsYXRlJywndGVtcGxhdGVVcmwnLCdjb250cm9sbGVyJywnY29udHJvbGxlckFzJywnY29udGVudFRlbXBsYXRlJywncGxhY2VtZW50JywnY29udGFpbmVyJywnZGVsYXknLCd0cmlnZ2VyJywnaHRtbCcsJ2FuaW1hdGlvbicsJ2N1c3RvbUNsYXNzJywnYXV0b0Nsb3NlJywnaWQnLCdwcmVmaXhDbGFzcycsJ3ByZWZpeEV2ZW50J10sZnVuY3Rpb24oZSl7YW5ndWxhci5pc0RlZmluZWQoaVtlXSkmJihzW2VdPWlbZV0pfSk7dmFyIGw9L14oZmFsc2V8MHwpJC9pO2FuZ3VsYXIuZm9yRWFjaChbJ2h0bWwnLCdjb250YWluZXInLCdhdXRvQ2xvc2UnXSxmdW5jdGlvbihlKXthbmd1bGFyLmlzRGVmaW5lZChpW2VdKSYmbC50ZXN0KGlbZV0pJiYoc1tlXT0hMSl9KTt2YXIgdT1vLmF0dHIoJ2RhdGEtdGFyZ2V0Jyk7YW5ndWxhci5pc0RlZmluZWQodSkmJihsLnRlc3QodSk/cy50YXJnZXQ9ITE6cy50YXJnZXQ9dSksYW5ndWxhci5mb3JFYWNoKFsndGl0bGUnLCdjb250ZW50J10sZnVuY3Rpb24obil7aVtuXSYmaS4kb2JzZXJ2ZShuLGZ1bmN0aW9uKG8saSl7ZVtuXT10LnRydXN0QXNIdG1sKG8pLGFuZ3VsYXIuaXNEZWZpbmVkKGkpJiZhKGZ1bmN0aW9uKCl7ciYmci4kYXBwbHlQbGFjZW1lbnQoKX0pfSl9KSxpLmJzUG9wb3ZlciYmZS4kd2F0Y2goaS5ic1BvcG92ZXIsZnVuY3Rpb24odCxuKXthbmd1bGFyLmlzT2JqZWN0KHQpP2FuZ3VsYXIuZXh0ZW5kKGUsdCk6ZS5jb250ZW50PXQsYW5ndWxhci5pc0RlZmluZWQobikmJmEoZnVuY3Rpb24oKXtyJiZyLiRhcHBseVBsYWNlbWVudCgpfSl9LCEwKSxpLmJzU2hvdyYmZS4kd2F0Y2goaS5ic1Nob3csZnVuY3Rpb24oZSx0KXtyJiZhbmd1bGFyLmlzRGVmaW5lZChlKSYmKGFuZ3VsYXIuaXNTdHJpbmcoZSkmJihlPSEhZS5tYXRjaCgvdHJ1ZXwsPyhwb3BvdmVyKSw/L2kpKSxlPT09ITA/ci5zaG93KCk6ci5oaWRlKCkpfSksaS52aWV3cG9ydCYmZS4kd2F0Y2goaS52aWV3cG9ydCxmdW5jdGlvbihlKXtyJiZhbmd1bGFyLmlzRGVmaW5lZChlKSYmci5zZXRWaWV3cG9ydChlKX0pLHI9bihvLHMpLGUuJG9uKCckZGVzdHJveScsZnVuY3Rpb24oKXtyJiZyLmRlc3Ryb3koKSxzPW51bGwscj1udWxsfSl9fX1dKSxhbmd1bGFyLm1vZHVsZSgnbWdjcmVhLm5nU3RyYXAuc2Nyb2xsc3B5JyxbJ21nY3JlYS5uZ1N0cmFwLmhlbHBlcnMuZGVib3VuY2UnLCdtZ2NyZWEubmdTdHJhcC5oZWxwZXJzLmRpbWVuc2lvbnMnXSkucHJvdmlkZXIoJyRzY3JvbGxzcHknLGZ1bmN0aW9uKCl7dmFyIGU9dGhpcy4kJHNwaWVzPXt9LG49dGhpcy5kZWZhdWx0cz17ZGVib3VuY2U6MTUwLHRocm90dGxlOjEwMCxvZmZzZXQ6MTAwfTt0aGlzLiRnZXQ9Wyckd2luZG93JywnJGRvY3VtZW50JywnJHJvb3RTY29wZScsJ2RpbWVuc2lvbnMnLCdkZWJvdW5jZScsJ3Rocm90dGxlJyxmdW5jdGlvbihhLG8saSxyLHMsbCl7ZnVuY3Rpb24gdShlLHQpe3JldHVybiBlWzBdLm5vZGVOYW1lJiZlWzBdLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT10LnRvTG93ZXJDYXNlKCl9ZnVuY3Rpb24gYyhvKXt2YXIgYz1hbmd1bGFyLmV4dGVuZCh7fSxuLG8pO2MuZWxlbWVudHx8KGMuZWxlbWVudD1wKTt2YXIgZz11KGMuZWxlbWVudCwnYm9keScpLG09Zz9kOmMuZWxlbWVudCwkPWc/J3dpbmRvdyc6Yy5pZDtpZihlWyRdKXJldHVybiBlWyRdLiQkY291bnQrKyxlWyRdO3ZhciBoLHYsdyx5LGIsRCxrLFMseD17fSxDPXguJHRyYWNrZWRFbGVtZW50cz1bXSxUPVtdO3JldHVybiB4LmluaXQ9ZnVuY3Rpb24oKXt0aGlzLiQkY291bnQ9MSx5PXModGhpcy5jaGVja1Bvc2l0aW9uLGMuZGVib3VuY2UpLGI9bCh0aGlzLmNoZWNrUG9zaXRpb24sYy50aHJvdHRsZSksbS5vbignY2xpY2snLHRoaXMuY2hlY2tQb3NpdGlvbldpdGhFdmVudExvb3ApLGQub24oJ3Jlc2l6ZScseSksbS5vbignc2Nyb2xsJyxiKSxEPXModGhpcy5jaGVja09mZnNldHMsYy5kZWJvdW5jZSksaD1pLiRvbignJHZpZXdDb250ZW50TG9hZGVkJyxEKSx2PWkuJG9uKCckaW5jbHVkZUNvbnRlbnRMb2FkZWQnLEQpLEQoKSwkJiYoZVskXT14KX0seC5kZXN0cm95PWZ1bmN0aW9uKCl7dGhpcy4kJGNvdW50LS0sdGhpcy4kJGNvdW50PjB8fChtLm9mZignY2xpY2snLHRoaXMuY2hlY2tQb3NpdGlvbldpdGhFdmVudExvb3ApLGQub2ZmKCdyZXNpemUnLHkpLG0ub2ZmKCdzY3JvbGwnLGIpLGgoKSx2KCksJCYmZGVsZXRlIGVbJF0pfSx4LmNoZWNrUG9zaXRpb249ZnVuY3Rpb24oKXtpZihULmxlbmd0aCl7aWYoUz0oZz9hLnBhZ2VZT2Zmc2V0Om0ucHJvcCgnc2Nyb2xsVG9wJykpfHwwLGs9TWF0aC5tYXgoYS5pbm5lckhlaWdodCxmLnByb3AoJ2NsaWVudEhlaWdodCcpKSxTPFRbMF0ub2Zmc2V0VG9wJiZ3IT09VFswXS50YXJnZXQpcmV0dXJuIHguJGFjdGl2YXRlRWxlbWVudChUWzBdKTtmb3IodmFyIGU9VC5sZW5ndGg7ZS0tOylpZighYW5ndWxhci5pc1VuZGVmaW5lZChUW2VdLm9mZnNldFRvcCkmJm51bGwhPT1UW2VdLm9mZnNldFRvcCYmdyE9PVRbZV0udGFyZ2V0JiYhKFM8VFtlXS5vZmZzZXRUb3B8fFRbZSsxXSYmUz5UW2UrMV0ub2Zmc2V0VG9wKSlyZXR1cm4geC4kYWN0aXZhdGVFbGVtZW50KFRbZV0pfX0seC5jaGVja1Bvc2l0aW9uV2l0aEV2ZW50TG9vcD1mdW5jdGlvbigpe3NldFRpbWVvdXQoeC5jaGVja1Bvc2l0aW9uLDEpfSx4LiRhY3RpdmF0ZUVsZW1lbnQ9ZnVuY3Rpb24oZSl7aWYodyl7dmFyIHQ9eC4kZ2V0VHJhY2tlZEVsZW1lbnQodyk7dCYmKHQuc291cmNlLnJlbW92ZUNsYXNzKCdhY3RpdmUnKSx1KHQuc291cmNlLCdsaScpJiZ1KHQuc291cmNlLnBhcmVudCgpLnBhcmVudCgpLCdsaScpJiZ0LnNvdXJjZS5wYXJlbnQoKS5wYXJlbnQoKS5yZW1vdmVDbGFzcygnYWN0aXZlJykpfXc9ZS50YXJnZXQsZS5zb3VyY2UuYWRkQ2xhc3MoJ2FjdGl2ZScpLHUoZS5zb3VyY2UsJ2xpJykmJnUoZS5zb3VyY2UucGFyZW50KCkucGFyZW50KCksJ2xpJykmJmUuc291cmNlLnBhcmVudCgpLnBhcmVudCgpLmFkZENsYXNzKCdhY3RpdmUnKX0seC4kZ2V0VHJhY2tlZEVsZW1lbnQ9ZnVuY3Rpb24oZSl7cmV0dXJuIEMuZmlsdGVyKGZ1bmN0aW9uKHQpe3JldHVybiB0LnRhcmdldD09PWV9KVswXX0seC5jaGVja09mZnNldHM9ZnVuY3Rpb24oKXthbmd1bGFyLmZvckVhY2goQyxmdW5jdGlvbihlKXt2YXIgbj10LnF1ZXJ5U2VsZWN0b3IoZS50YXJnZXQpO2Uub2Zmc2V0VG9wPW4/ci5vZmZzZXQobikudG9wOm51bGwsYy5vZmZzZXQmJm51bGwhPT1lLm9mZnNldFRvcCYmKGUub2Zmc2V0VG9wLT0xKmMub2Zmc2V0KX0pLFQ9Qy5maWx0ZXIoZnVuY3Rpb24oZSl7cmV0dXJuIG51bGwhPT1lLm9mZnNldFRvcH0pLnNvcnQoZnVuY3Rpb24oZSx0KXtyZXR1cm4gZS5vZmZzZXRUb3AtdC5vZmZzZXRUb3B9KSx5KCl9LHgudHJhY2tFbGVtZW50PWZ1bmN0aW9uKGUsdCl7Qy5wdXNoKHt0YXJnZXQ6ZSxzb3VyY2U6dH0pfSx4LnVudHJhY2tFbGVtZW50PWZ1bmN0aW9uKGUsdCl7Zm9yKHZhciBuLGE9Qy5sZW5ndGg7YS0tOylpZihDW2FdLnRhcmdldD09PWUmJkNbYV0uc291cmNlPT09dCl7bj1hO2JyZWFrfUM9Qy5zcGxpY2UobiwxKX0seC5hY3RpdmF0ZT1mdW5jdGlvbihlKXtDW2VdLmFkZENsYXNzKCdhY3RpdmUnKX0seC5pbml0KCkseH12YXIgZD1hbmd1bGFyLmVsZW1lbnQoYSksZj1hbmd1bGFyLmVsZW1lbnQoby5wcm9wKCdkb2N1bWVudEVsZW1lbnQnKSkscD1hbmd1bGFyLmVsZW1lbnQoYS5kb2N1bWVudC5ib2R5KTtyZXR1cm4gY31dfSkuZGlyZWN0aXZlKCdic1Njcm9sbHNweScsWyckcm9vdFNjb3BlJywnZGVib3VuY2UnLCdkaW1lbnNpb25zJywnJHNjcm9sbHNweScsZnVuY3Rpb24oZSx0LG4sYSl7cmV0dXJue3Jlc3RyaWN0OidFQUMnLGxpbms6ZnVuY3Rpb24oZSx0LG4pe3ZhciBvPXtzY29wZTplfTthbmd1bGFyLmZvckVhY2goWydvZmZzZXQnLCd0YXJnZXQnXSxmdW5jdGlvbihlKXthbmd1bGFyLmlzRGVmaW5lZChuW2VdKSYmKG9bZV09bltlXSl9KTt2YXIgaT1hKG8pO2kudHJhY2tFbGVtZW50KG8udGFyZ2V0LHQpLGUuJG9uKCckZGVzdHJveScsZnVuY3Rpb24oKXtpJiYoaS51bnRyYWNrRWxlbWVudChvLnRhcmdldCx0KSxpLmRlc3Ryb3koKSksbz1udWxsLGk9bnVsbH0pfX19XSkuZGlyZWN0aXZlKCdic1Njcm9sbHNweUxpc3QnLFsnJHJvb3RTY29wZScsJ2RlYm91bmNlJywnZGltZW5zaW9ucycsJyRzY3JvbGxzcHknLGZ1bmN0aW9uKGUsdCxuLGEpe3JldHVybntyZXN0cmljdDonQScsY29tcGlsZTpmdW5jdGlvbihlLHQpe3ZhciBuPWVbMF0ucXVlcnlTZWxlY3RvckFsbCgnbGkgPiBhW2hyZWZdJyk7YW5ndWxhci5mb3JFYWNoKG4sZnVuY3Rpb24oZSl7dmFyIHQ9YW5ndWxhci5lbGVtZW50KGUpO3QucGFyZW50KCkuYXR0cignYnMtc2Nyb2xsc3B5JywnJykuYXR0cignZGF0YS10YXJnZXQnLHQuYXR0cignaHJlZicpKX0pfX19XSksYW5ndWxhci5tb2R1bGUoJ21nY3JlYS5uZ1N0cmFwLm5hdmJhcicsW10pLnByb3ZpZGVyKCckbmF2YmFyJyxmdW5jdGlvbigpe3ZhciBlPXRoaXMuZGVmYXVsdHM9e2FjdGl2ZUNsYXNzOidhY3RpdmUnLHJvdXRlQXR0cjonZGF0YS1tYXRjaC1yb3V0ZScsc3RyaWN0OiExfTt0aGlzLiRnZXQ9ZnVuY3Rpb24oKXtyZXR1cm57ZGVmYXVsdHM6ZX19fSkuZGlyZWN0aXZlKCdic05hdmJhcicsWyckd2luZG93JywnJGxvY2F0aW9uJywnJG5hdmJhcicsZnVuY3Rpb24oZSx0LG4pe3ZhciBhPW4uZGVmYXVsdHM7cmV0dXJue3Jlc3RyaWN0OidBJyxsaW5rOmZ1bmN0aW9uKGUsbixvLGkpe3ZhciByPWFuZ3VsYXIuY29weShhKTthbmd1bGFyLmZvckVhY2goT2JqZWN0LmtleXMoYSksZnVuY3Rpb24oZSl7YW5ndWxhci5pc0RlZmluZWQob1tlXSkmJihyW2VdPW9bZV0pfSksZS4kd2F0Y2goZnVuY3Rpb24oKXtyZXR1cm4gdC5wYXRoKCl9LGZ1bmN0aW9uKGUsdCl7dmFyIGE9blswXS5xdWVyeVNlbGVjdG9yQWxsKCdsaVsnK3Iucm91dGVBdHRyKyddJyk7YW5ndWxhci5mb3JFYWNoKGEsZnVuY3Rpb24odCl7dmFyIG49YW5ndWxhci5lbGVtZW50KHQpLGE9bi5hdHRyKHIucm91dGVBdHRyKS5yZXBsYWNlKCcvJywnXFxcXC8nKTtyLnN0cmljdCYmKGE9J14nK2ErJyQnKTt2YXIgbz1uZXcgUmVnRXhwKGEsJ2knKTtvLnRlc3QoZSk/bi5hZGRDbGFzcyhyLmFjdGl2ZUNsYXNzKTpuLnJlbW92ZUNsYXNzKHIuYWN0aXZlQ2xhc3MpfSl9KX19fV0pLGFuZ3VsYXIubW9kdWxlKCdtZ2NyZWEubmdTdHJhcC5tb2RhbCcsWydtZ2NyZWEubmdTdHJhcC5jb3JlJywnbWdjcmVhLm5nU3RyYXAuaGVscGVycy5kaW1lbnNpb25zJ10pLnByb3ZpZGVyKCckbW9kYWwnLGZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5kZWZhdWx0cz17YW5pbWF0aW9uOidhbS1mYWRlJyxiYWNrZHJvcEFuaW1hdGlvbjonYW0tZmFkZScsY3VzdG9tQ2xhc3M6JycscHJlZml4Q2xhc3M6J21vZGFsJyxwcmVmaXhFdmVudDonbW9kYWwnLHBsYWNlbWVudDondG9wJyx0ZW1wbGF0ZVVybDonbW9kYWwvbW9kYWwudHBsLmh0bWwnLHRlbXBsYXRlOicnLGNvbnRlbnRUZW1wbGF0ZTohMSxjb250YWluZXI6ITEsZWxlbWVudDpudWxsLGJhY2tkcm9wOiEwLGtleWJvYXJkOiEwLGh0bWw6ITEsc2hvdzohMH07dGhpcy4kZ2V0PVsnJHdpbmRvdycsJyRyb290U2NvcGUnLCckYnNDb21waWxlcicsJyRhbmltYXRlJywnJHRpbWVvdXQnLCckc2NlJywnZGltZW5zaW9ucycsZnVuY3Rpb24obixhLG8saSxyLHMsbCl7ZnVuY3Rpb24gdSh0KXtmdW5jdGlvbiBuKCl7Qy4kZW1pdChTLnByZWZpeEV2ZW50Kycuc2hvdycsayl9ZnVuY3Rpb24gcigpe0MuJGVtaXQoUy5wcmVmaXhFdmVudCsnLmhpZGUnLGspLGcucmVtb3ZlQ2xhc3MoUy5wcmVmaXhDbGFzcysnLW9wZW4nKSxTLmFuaW1hdGlvbiYmZy5yZW1vdmVDbGFzcyhTLnByZWZpeENsYXNzKyctd2l0aC0nK1MuYW5pbWF0aW9uKX1mdW5jdGlvbiBsKCl7Uy5iYWNrZHJvcCYmKEUub24oJ2NsaWNrJyx5KSxBLm9uKCdjbGljaycseSksQS5vbignd2hlZWwnLGIpKX1mdW5jdGlvbiB1KCl7Uy5iYWNrZHJvcCYmKEUub2ZmKCdjbGljaycseSksQS5vZmYoJ2NsaWNrJyx5KSxBLm9mZignd2hlZWwnLGIpKX1mdW5jdGlvbiB2KCl7Uy5rZXlib2FyZCYmRS5vbigna2V5dXAnLGsuJG9uS2V5VXApfWZ1bmN0aW9uIHcoKXtTLmtleWJvYXJkJiZFLm9mZigna2V5dXAnLGsuJG9uS2V5VXApfWZ1bmN0aW9uIHkoZSl7ZS50YXJnZXQ9PT1lLmN1cnJlbnRUYXJnZXQmJignc3RhdGljJz09PVMuYmFja2Ryb3A/ay5mb2N1cygpOmsuaGlkZSgpKX1mdW5jdGlvbiBiKGUpe2UucHJldmVudERlZmF1bHQoKX1mdW5jdGlvbiBEKCl7ay4kaXNTaG93biYmbnVsbCE9PUUmJih1KCksdygpKSxNJiYoTS4kZGVzdHJveSgpLE09bnVsbCksRSYmKEUucmVtb3ZlKCksRT1rLiRlbGVtZW50PW51bGwpfXZhciBrPXt9LFM9ay4kb3B0aW9ucz1hbmd1bGFyLmV4dGVuZCh7fSxlLHQpLHg9ay4kcHJvbWlzZT1vLmNvbXBpbGUoUyksQz1rLiRzY29wZT1TLnNjb3BlJiZTLnNjb3BlLiRuZXcoKXx8YS4kbmV3KCk7Uy5lbGVtZW50fHxTLmNvbnRhaW5lcnx8KFMuY29udGFpbmVyPSdib2R5Jyksay4kaWQ9Uy5pZHx8Uy5lbGVtZW50JiZTLmVsZW1lbnQuYXR0cignaWQnKXx8JycsZihbJ3RpdGxlJywnY29udGVudCddLGZ1bmN0aW9uKGUpe1NbZV0mJihDW2VdPXMudHJ1c3RBc0h0bWwoU1tlXSkpfSksQy4kaGlkZT1mdW5jdGlvbigpe0MuJCRwb3N0RGlnZXN0KGZ1bmN0aW9uKCl7ay5oaWRlKCl9KX0sQy4kc2hvdz1mdW5jdGlvbigpe0MuJCRwb3N0RGlnZXN0KGZ1bmN0aW9uKCl7ay5zaG93KCl9KX0sQy4kdG9nZ2xlPWZ1bmN0aW9uKCl7Qy4kJHBvc3REaWdlc3QoZnVuY3Rpb24oKXtrLnRvZ2dsZSgpfSl9LGsuJGlzU2hvd249Qy4kaXNTaG93bj0hMTt2YXIgVCxFLE0sQT1hbmd1bGFyLmVsZW1lbnQoJzxkaXYgY2xhc3M9XCInK1MucHJlZml4Q2xhc3MrJy1iYWNrZHJvcFwiLz4nKTtyZXR1cm4gQS5jc3Moe3Bvc2l0aW9uOidmaXhlZCcsdG9wOicwcHgnLGxlZnQ6JzBweCcsYm90dG9tOicwcHgnLHJpZ2h0OicwcHgnfSkseC50aGVuKGZ1bmN0aW9uKGUpe1Q9ZSxrLmluaXQoKX0pLGsuaW5pdD1mdW5jdGlvbigpe1Muc2hvdyYmQy4kJHBvc3REaWdlc3QoZnVuY3Rpb24oKXtrLnNob3coKX0pfSxrLmRlc3Ryb3k9ZnVuY3Rpb24oKXtEKCksQSYmKEEucmVtb3ZlKCksQT1udWxsKSxDLiRkZXN0cm95KCl9LGsuc2hvdz1mdW5jdGlvbigpe2lmKCFrLiRpc1Nob3duKXt2YXIgZSx0O2lmKGFuZ3VsYXIuaXNFbGVtZW50KFMuY29udGFpbmVyKT8oZT1TLmNvbnRhaW5lcix0PVMuY29udGFpbmVyWzBdLmxhc3RDaGlsZD9hbmd1bGFyLmVsZW1lbnQoUy5jb250YWluZXJbMF0ubGFzdENoaWxkKTpudWxsKTpTLmNvbnRhaW5lcj8oZT1kKFMuY29udGFpbmVyKSx0PWVbMF0mJmVbMF0ubGFzdENoaWxkP2FuZ3VsYXIuZWxlbWVudChlWzBdLmxhc3RDaGlsZCk6bnVsbCk6KGU9bnVsbCx0PVMuZWxlbWVudCksRSYmRCgpLE09ay4kc2NvcGUuJG5ldygpLEU9ay4kZWxlbWVudD1ULmxpbmsoTSxmdW5jdGlvbihlLHQpe30pLFMuYmFja2Ryb3AmJihFLmNzcyh7J3otaW5kZXgnOiQrMjAqbX0pLEEuY3NzKHsnei1pbmRleCc6aCsyMCptfSksbSsrKSwhQy4kZW1pdChTLnByZWZpeEV2ZW50Kycuc2hvdy5iZWZvcmUnLGspLmRlZmF1bHRQcmV2ZW50ZWQpe0UuY3NzKHtkaXNwbGF5OidibG9jayd9KS5hZGRDbGFzcyhTLnBsYWNlbWVudCksUy5jdXN0b21DbGFzcyYmRS5hZGRDbGFzcyhTLmN1c3RvbUNsYXNzKSxTLmFuaW1hdGlvbiYmKFMuYmFja2Ryb3AmJkEuYWRkQ2xhc3MoUy5iYWNrZHJvcEFuaW1hdGlvbiksRS5hZGRDbGFzcyhTLmFuaW1hdGlvbikpLFMuYmFja2Ryb3AmJmkuZW50ZXIoQSxnLG51bGwpLGFuZ3VsYXIudmVyc2lvbi5taW5vcjw9Mj9pLmVudGVyKEUsZSx0LG4pOmkuZW50ZXIoRSxlLHQpLnRoZW4obiksay4kaXNTaG93bj1DLiRpc1Nob3duPSEwLGMoQyk7dmFyIGE9RVswXTtwKGZ1bmN0aW9uKCl7YS5mb2N1cygpfSksZy5hZGRDbGFzcyhTLnByZWZpeENsYXNzKyctb3BlbicpLFMuYW5pbWF0aW9uJiZnLmFkZENsYXNzKFMucHJlZml4Q2xhc3MrJy13aXRoLScrUy5hbmltYXRpb24pLGwoKSx2KCl9fX0say5oaWRlPWZ1bmN0aW9uKCl7ay4kaXNTaG93biYmKFMuYmFja2Ryb3AmJm0tLSxDLiRlbWl0KFMucHJlZml4RXZlbnQrJy5oaWRlLmJlZm9yZScsaykuZGVmYXVsdFByZXZlbnRlZHx8KGFuZ3VsYXIudmVyc2lvbi5taW5vcjw9Mj9pLmxlYXZlKEUscik6aS5sZWF2ZShFKS50aGVuKHIpLFMuYmFja2Ryb3AmJmkubGVhdmUoQSksay4kaXNTaG93bj1DLiRpc1Nob3duPSExLGMoQyksdSgpLHcoKSkpfSxrLnRvZ2dsZT1mdW5jdGlvbigpe2suJGlzU2hvd24/ay5oaWRlKCk6ay5zaG93KCl9LGsuZm9jdXM9ZnVuY3Rpb24oKXtFWzBdLmZvY3VzKCl9LGsuJG9uS2V5VXA9ZnVuY3Rpb24oZSl7Mjc9PT1lLndoaWNoJiZrLiRpc1Nob3duJiYoay5oaWRlKCksZS5zdG9wUHJvcGFnYXRpb24oKSl9LGt9ZnVuY3Rpb24gYyhlKXtlLiQkcGhhc2V8fGUuJHJvb3QmJmUuJHJvb3QuJCRwaGFzZXx8ZS4kZGlnZXN0KCl9ZnVuY3Rpb24gZChlLG4pe3JldHVybiBhbmd1bGFyLmVsZW1lbnQoKG58fHQpLnF1ZXJ5U2VsZWN0b3JBbGwoZSkpfXZhciBmPWFuZ3VsYXIuZm9yRWFjaCxwPW4ucmVxdWVzdEFuaW1hdGlvbkZyYW1lfHxuLnNldFRpbWVvdXQsZz1hbmd1bGFyLmVsZW1lbnQobi5kb2N1bWVudC5ib2R5KSxtPTAsJD0xMDUwLGg9MTA0MDtyZXR1cm4gdX1dfSkuZGlyZWN0aXZlKCdic01vZGFsJyxbJyR3aW5kb3cnLCckc2NlJywnJG1vZGFsJyxmdW5jdGlvbihlLHQsbil7cmV0dXJue3Jlc3RyaWN0OidFQUMnLHNjb3BlOiEwLGxpbms6ZnVuY3Rpb24oZSxhLG8saSl7dmFyIHI9e3Njb3BlOmUsZWxlbWVudDphLHNob3c6ITF9O2FuZ3VsYXIuZm9yRWFjaChbJ3RlbXBsYXRlJywndGVtcGxhdGVVcmwnLCdjb250cm9sbGVyJywnY29udHJvbGxlckFzJywnY29udGVudFRlbXBsYXRlJywncGxhY2VtZW50JywnYmFja2Ryb3AnLCdrZXlib2FyZCcsJ2h0bWwnLCdjb250YWluZXInLCdhbmltYXRpb24nLCdiYWNrZHJvcEFuaW1hdGlvbicsJ2lkJywncHJlZml4RXZlbnQnLCdwcmVmaXhDbGFzcycsJ2N1c3RvbUNsYXNzJywnbW9kYWxDbGFzcyddLGZ1bmN0aW9uKGUpe2FuZ3VsYXIuaXNEZWZpbmVkKG9bZV0pJiYocltlXT1vW2VdKX0pLHIubW9kYWxDbGFzcyYmKHIuY3VzdG9tQ2xhc3M9ci5tb2RhbENsYXNzKTt2YXIgcz0vXihmYWxzZXwwfCkkL2k7YW5ndWxhci5mb3JFYWNoKFsnYmFja2Ryb3AnLCdrZXlib2FyZCcsJ2h0bWwnLCdjb250YWluZXInXSxmdW5jdGlvbihlKXthbmd1bGFyLmlzRGVmaW5lZChvW2VdKSYmcy50ZXN0KG9bZV0pJiYocltlXT0hMSl9KSxhbmd1bGFyLmZvckVhY2goWyd0aXRsZScsJ2NvbnRlbnQnXSxmdW5jdGlvbihuKXtvW25dJiZvLiRvYnNlcnZlKG4sZnVuY3Rpb24oYSxvKXtlW25dPXQudHJ1c3RBc0h0bWwoYSl9KX0pLG8uYnNNb2RhbCYmZS4kd2F0Y2goby5ic01vZGFsLGZ1bmN0aW9uKHQsbil7YW5ndWxhci5pc09iamVjdCh0KT9hbmd1bGFyLmV4dGVuZChlLHQpOmUuY29udGVudD10fSwhMCk7dmFyIGw9bihyKTthLm9uKG8udHJpZ2dlcnx8J2NsaWNrJyxsLnRvZ2dsZSksZS4kb24oJyRkZXN0cm95JyxmdW5jdGlvbigpe2wmJmwuZGVzdHJveSgpLHI9bnVsbCxsPW51bGx9KX19fV0pLGFuZ3VsYXIudmVyc2lvbi5taW5vcjwzJiZhbmd1bGFyLnZlcnNpb24uZG90PDE0JiZhbmd1bGFyLm1vZHVsZSgnbmcnKS5mYWN0b3J5KCckJHJBRicsWyckd2luZG93JywnJHRpbWVvdXQnLGZ1bmN0aW9uKGUsdCl7dmFyIG49ZS5yZXF1ZXN0QW5pbWF0aW9uRnJhbWV8fGUud2Via2l0UmVxdWVzdEFuaW1hdGlvbkZyYW1lfHxlLm1velJlcXVlc3RBbmltYXRpb25GcmFtZSxhPWUuY2FuY2VsQW5pbWF0aW9uRnJhbWV8fGUud2Via2l0Q2FuY2VsQW5pbWF0aW9uRnJhbWV8fGUubW96Q2FuY2VsQW5pbWF0aW9uRnJhbWV8fGUud2Via2l0Q2FuY2VsUmVxdWVzdEFuaW1hdGlvbkZyYW1lLG89ISFuLGk9bz9mdW5jdGlvbihlKXt2YXIgdD1uKGUpO3JldHVybiBmdW5jdGlvbigpe2EodCl9fTpmdW5jdGlvbihlKXt2YXIgbj10KGUsMTYuNjYsITEpO3JldHVybiBmdW5jdGlvbigpe3QuY2FuY2VsKG4pfX07cmV0dXJuIGkuc3VwcG9ydGVkPW8saX1dKSxhbmd1bGFyLm1vZHVsZSgnbWdjcmVhLm5nU3RyYXAuaGVscGVycy5wYXJzZU9wdGlvbnMnLFtdKS5wcm92aWRlcignJHBhcnNlT3B0aW9ucycsZnVuY3Rpb24oKXt2YXIgZT10aGlzLmRlZmF1bHRzPXtyZWdleHA6L15cXHMqKC4qPykoPzpcXHMrYXNcXHMrKC4qPykpPyg/Olxccytncm91cFxccytieVxccysoLiopKT9cXHMrZm9yXFxzKyg/OihbXFwkXFx3XVtcXCRcXHddKil8KD86XFwoXFxzKihbXFwkXFx3XVtcXCRcXHddKilcXHMqLFxccyooW1xcJFxcd11bXFwkXFx3XSopXFxzKlxcKSkpXFxzK2luXFxzKyguKj8pKD86XFxzK3RyYWNrXFxzK2J5XFxzKyguKj8pKT8kL307dGhpcy4kZ2V0PVsnJHBhcnNlJywnJHEnLGZ1bmN0aW9uKHQsbil7ZnVuY3Rpb24gYShhLG8pe2Z1bmN0aW9uIGkoZSx0KXtyZXR1cm4gZS5tYXAoZnVuY3Rpb24oZSxuKXt2YXIgYSxvLGk9e307cmV0dXJuIGlbY109ZSxhPXUodCxpKSxvPXAodCxpKSx7bGFiZWw6YSx2YWx1ZTpvLGluZGV4Om59fSl9dmFyIHI9e30scz1hbmd1bGFyLmV4dGVuZCh7fSxlLG8pO3IuJHZhbHVlcz1bXTt2YXIgbCx1LGMsZCxmLHAsZztyZXR1cm4gci5pbml0PWZ1bmN0aW9uKCl7ci4kbWF0Y2g9bD1hLm1hdGNoKHMucmVnZXhwKSx1PXQobFsyXXx8bFsxXSksYz1sWzRdfHxsWzZdLGQ9bFs1XSxmPXQobFszXXx8JycpLHA9dChsWzJdP2xbMV06YyksZz10KGxbN10pfSxyLnZhbHVlc0ZuPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIG4ud2hlbihnKGUsdCkpLnRoZW4oZnVuY3Rpb24odCl7cmV0dXJuIGFuZ3VsYXIuaXNBcnJheSh0KXx8KHQ9W10pLHIuJHZhbHVlcz10Lmxlbmd0aD9pKHQsZSk6W10sci4kdmFsdWVzfSl9LHIuZGlzcGxheVZhbHVlPWZ1bmN0aW9uKGUpe3ZhciB0PXt9O3JldHVybiB0W2NdPWUsdSh0KX0sci5pbml0KCkscn1yZXR1cm4gYX1dfSksYW5ndWxhci5tb2R1bGUoJ21nY3JlYS5uZ1N0cmFwLmhlbHBlcnMuZGltZW5zaW9ucycsW10pLmZhY3RvcnkoJ2RpbWVuc2lvbnMnLGZ1bmN0aW9uKCl7ZnVuY3Rpb24gdChlKXt2YXIgdD1lLm93bmVyRG9jdW1lbnQsbz1lLm9mZnNldFBhcmVudHx8dDtpZihhKG8sJyNkb2N1bWVudCcpKXJldHVybiB0LmRvY3VtZW50RWxlbWVudDtmb3IoO28mJiFhKG8sJ2h0bWwnKSYmJ3N0YXRpYyc9PT1uLmNzcyhvLCdwb3NpdGlvbicpOylvPW8ub2Zmc2V0UGFyZW50O3JldHVybiBvfHx0LmRvY3VtZW50RWxlbWVudH12YXIgbj17fSxhPW4ubm9kZU5hbWU9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZS5ub2RlTmFtZSYmZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT09dC50b0xvd2VyQ2FzZSgpfTtyZXR1cm4gbi5jc3M9ZnVuY3Rpb24odCxuLGEpe3ZhciBvO3JldHVybiBvPXQuY3VycmVudFN0eWxlP3QuY3VycmVudFN0eWxlW25dOmUuZ2V0Q29tcHV0ZWRTdHlsZT9lLmdldENvbXB1dGVkU3R5bGUodClbbl06dC5zdHlsZVtuXSxhPT09ITA/cGFyc2VGbG9hdChvKXx8MDpvfSxuLm9mZnNldD1mdW5jdGlvbih0KXt2YXIgbj10LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGE9dC5vd25lckRvY3VtZW50O3JldHVybnt3aWR0aDpuLndpZHRofHx0Lm9mZnNldFdpZHRoLGhlaWdodDpuLmhlaWdodHx8dC5vZmZzZXRIZWlnaHQsdG9wOm4udG9wKyhlLnBhZ2VZT2Zmc2V0fHxhLmRvY3VtZW50RWxlbWVudC5zY3JvbGxUb3ApLShhLmRvY3VtZW50RWxlbWVudC5jbGllbnRUb3B8fDApLGxlZnQ6bi5sZWZ0KyhlLnBhZ2VYT2Zmc2V0fHxhLmRvY3VtZW50RWxlbWVudC5zY3JvbGxMZWZ0KS0oYS5kb2N1bWVudEVsZW1lbnQuY2xpZW50TGVmdHx8MCl9fSxuLnNldE9mZnNldD1mdW5jdGlvbihlLHQsYSl7dmFyIG8saSxyLHMsbCx1LGMsZD1uLmNzcyhlLCdwb3NpdGlvbicpLGY9YW5ndWxhci5lbGVtZW50KGUpLHA9e307J3N0YXRpYyc9PT1kJiYoZS5zdHlsZS5wb3NpdGlvbj0ncmVsYXRpdmUnKSxsPW4ub2Zmc2V0KGUpLHI9bi5jc3MoZSwndG9wJyksdT1uLmNzcyhlLCdsZWZ0JyksYz0oJ2Fic29sdXRlJz09PWR8fCdmaXhlZCc9PT1kKSYmKHIrdSkuaW5kZXhPZignYXV0bycpPi0xLGM/KG89bi5wb3NpdGlvbihlKSxzPW8udG9wLGk9by5sZWZ0KToocz1wYXJzZUZsb2F0KHIpfHwwLGk9cGFyc2VGbG9hdCh1KXx8MCksYW5ndWxhci5pc0Z1bmN0aW9uKHQpJiYodD10LmNhbGwoZSxhLGwpKSxudWxsIT09dC50b3AmJihwLnRvcD10LnRvcC1sLnRvcCtzKSxudWxsIT09dC5sZWZ0JiYocC5sZWZ0PXQubGVmdC1sLmxlZnQraSksJ3VzaW5nJ2luIHQ/dC51c2luZy5jYWxsKGYscCk6Zi5jc3Moe3RvcDpwLnRvcCsncHgnLGxlZnQ6cC5sZWZ0KydweCd9KX0sbi5wb3NpdGlvbj1mdW5jdGlvbihlKXt2YXIgbyxpLHI9e3RvcDowLGxlZnQ6MH07cmV0dXJuJ2ZpeGVkJz09PW4uY3NzKGUsJ3Bvc2l0aW9uJyk/aT1lLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOihvPXQoZSksaT1uLm9mZnNldChlKSxhKG8sJ2h0bWwnKXx8KHI9bi5vZmZzZXQobykpLHIudG9wKz1uLmNzcyhvLCdib3JkZXJUb3BXaWR0aCcsITApLHIubGVmdCs9bi5jc3MobywnYm9yZGVyTGVmdFdpZHRoJywhMCkpLHt3aWR0aDplLm9mZnNldFdpZHRoLGhlaWdodDplLm9mZnNldEhlaWdodCx0b3A6aS50b3Atci50b3Atbi5jc3MoZSwnbWFyZ2luVG9wJywhMCksbGVmdDppLmxlZnQtci5sZWZ0LW4uY3NzKGUsJ21hcmdpbkxlZnQnLCEwKX19LG4uaGVpZ2h0PWZ1bmN0aW9uKGUsdCl7dmFyIGE9ZS5vZmZzZXRIZWlnaHQ7cmV0dXJuIHQ/YSs9bi5jc3MoZSwnbWFyZ2luVG9wJywhMCkrbi5jc3MoZSwnbWFyZ2luQm90dG9tJywhMCk6YS09bi5jc3MoZSwncGFkZGluZ1RvcCcsITApK24uY3NzKGUsJ3BhZGRpbmdCb3R0b20nLCEwKStuLmNzcyhlLCdib3JkZXJUb3BXaWR0aCcsITApK24uY3NzKGUsJ2JvcmRlckJvdHRvbVdpZHRoJywhMCksYX0sbi53aWR0aD1mdW5jdGlvbihlLHQpe3ZhciBhPWUub2Zmc2V0V2lkdGg7cmV0dXJuIHQ/YSs9bi5jc3MoZSwnbWFyZ2luTGVmdCcsITApK24uY3NzKGUsJ21hcmdpblJpZ2h0JywhMCk6YS09bi5jc3MoZSwncGFkZGluZ0xlZnQnLCEwKStuLmNzcyhlLCdwYWRkaW5nUmlnaHQnLCEwKStuLmNzcyhlLCdib3JkZXJMZWZ0V2lkdGgnLCEwKStuLmNzcyhlLCdib3JkZXJSaWdodFdpZHRoJywhMCksYX0sbn0pLGFuZ3VsYXIubW9kdWxlKCdtZ2NyZWEubmdTdHJhcC5oZWxwZXJzLmRlYm91bmNlJyxbXSkuZmFjdG9yeSgnZGVib3VuY2UnLFsnJHRpbWVvdXQnLGZ1bmN0aW9uKGUpe3JldHVybiBmdW5jdGlvbih0LG4sYSl7dmFyIG89bnVsbDtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgaT10aGlzLHI9YXJndW1lbnRzLHM9YSYmIW87cmV0dXJuIG8mJmUuY2FuY2VsKG8pLG89ZShmdW5jdGlvbigpe289bnVsbCxhfHx0LmFwcGx5KGkscil9LG4sITEpLHMmJnQuYXBwbHkoaSxyKSxvfX19XSkuZmFjdG9yeSgndGhyb3R0bGUnLFsnJHRpbWVvdXQnLGZ1bmN0aW9uKGUpe3JldHVybiBmdW5jdGlvbih0LG4sYSl7dmFyIG89bnVsbDtyZXR1cm4gYXx8KGE9e30pLGZ1bmN0aW9uKCl7dmFyIGk9dGhpcyxyPWFyZ3VtZW50cztvfHwoYS5sZWFkaW5nIT09ITEmJnQuYXBwbHkoaSxyKSxvPWUoZnVuY3Rpb24oKXtvPW51bGwsYS50cmFpbGluZyE9PSExJiZ0LmFwcGx5KGkscil9LG4sITEpKX19fV0pLGFuZ3VsYXIubW9kdWxlKCdtZ2NyZWEubmdTdHJhcC5oZWxwZXJzLmRhdGVQYXJzZXInLFtdKS5wcm92aWRlcignJGRhdGVQYXJzZXInLFsnJGxvY2FsZVByb3ZpZGVyJyxmdW5jdGlvbihlKXtmdW5jdGlvbiB0KCl7dGhpcy55ZWFyPTE5NzAsdGhpcy5tb250aD0wLHRoaXMuZGF5PTEsdGhpcy5ob3Vycz0wLHRoaXMubWludXRlcz0wLHRoaXMuc2Vjb25kcz0wLHRoaXMubWlsbGlzZWNvbmRzPTB9ZnVuY3Rpb24gbigpe31mdW5jdGlvbiBhKGUpe3JldHVybiFpc05hTihwYXJzZUZsb2F0KGUpKSYmaXNGaW5pdGUoZSl9ZnVuY3Rpb24gbyhlLHQpe2Zvcih2YXIgbj1lLmxlbmd0aCxhPXQudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpLG89MDtuPm87bysrKWlmKGVbb10udG9Mb3dlckNhc2UoKT09PWEpcmV0dXJuIG87cmV0dXJuLTF9dC5wcm90b3R5cGUuc2V0TWlsbGlzZWNvbmRzPWZ1bmN0aW9uKGUpe3RoaXMubWlsbGlzZWNvbmRzPWV9LHQucHJvdG90eXBlLnNldFNlY29uZHM9ZnVuY3Rpb24oZSl7dGhpcy5zZWNvbmRzPWV9LHQucHJvdG90eXBlLnNldE1pbnV0ZXM9ZnVuY3Rpb24oZSl7dGhpcy5taW51dGVzPWV9LHQucHJvdG90eXBlLnNldEhvdXJzPWZ1bmN0aW9uKGUpe3RoaXMuaG91cnM9ZX0sdC5wcm90b3R5cGUuZ2V0SG91cnM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ob3Vyc30sdC5wcm90b3R5cGUuc2V0RGF0ZT1mdW5jdGlvbihlKXt0aGlzLmRheT1lfSx0LnByb3RvdHlwZS5zZXRNb250aD1mdW5jdGlvbihlKXt0aGlzLm1vbnRoPWV9LHQucHJvdG90eXBlLnNldEZ1bGxZZWFyPWZ1bmN0aW9uKGUpe3RoaXMueWVhcj1lfSx0LnByb3RvdHlwZS5mcm9tRGF0ZT1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy55ZWFyPWUuZ2V0RnVsbFllYXIoKSx0aGlzLm1vbnRoPWUuZ2V0TW9udGgoKSx0aGlzLmRheT1lLmdldERhdGUoKSx0aGlzLmhvdXJzPWUuZ2V0SG91cnMoKSx0aGlzLm1pbnV0ZXM9ZS5nZXRNaW51dGVzKCksdGhpcy5zZWNvbmRzPWUuZ2V0U2Vjb25kcygpLHRoaXMubWlsbGlzZWNvbmRzPWUuZ2V0TWlsbGlzZWNvbmRzKCksdGhpc30sdC5wcm90b3R5cGUudG9EYXRlPWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBEYXRlKHRoaXMueWVhcix0aGlzLm1vbnRoLHRoaXMuZGF5LHRoaXMuaG91cnMsdGhpcy5taW51dGVzLHRoaXMuc2Vjb25kcyx0aGlzLm1pbGxpc2Vjb25kcyl9O3ZhciBpPXQucHJvdG90eXBlLHI9dGhpcy5kZWZhdWx0cz17Zm9ybWF0OidzaG9ydERhdGUnLHN0cmljdDohMX07dGhpcy4kZ2V0PVsnJGxvY2FsZScsJ2RhdGVGaWx0ZXInLGZ1bmN0aW9uKGUscyl7dmFyIGw9ZnVuY3Rpb24obCl7ZnVuY3Rpb24gdShlKXt2YXIgdD1jKGUpO3JldHVybiBnKHQpfWZ1bmN0aW9uIGMoZSl7dmFyIHQ9ZChlKSxuPXQucmVwbGFjZSgvJycvZywnXFxcXFxcJycpLGE9LygnKD86XFxcXCd8LikqPycpLyxvPW4uc3BsaXQoYSksaT1PYmplY3Qua2V5cyhiKSxyPVtdO3JldHVybiBhbmd1bGFyLmZvckVhY2gobyxmdW5jdGlvbihlKXtpZihmKGUpKWU9cChlKTtlbHNlIGZvcih2YXIgdD0wO3Q8aS5sZW5ndGg7dCsrKWU9ZS5zcGxpdChpW3RdKS5qb2luKCckeycrdCsnfScpO3IucHVzaChlKX0pLHIuam9pbignJyl9ZnVuY3Rpb24gZChlKXtyZXR1cm4gZS5yZXBsYWNlKC9cXFxcL2csJ1tcXFxcXFxcXF0nKS5yZXBsYWNlKC8tL2csJ1stXScpLnJlcGxhY2UoL1xcLi9nLCdbLl0nKS5yZXBsYWNlKC9cXCovZywnWypdJykucmVwbGFjZSgvXFwrL2csJ1srXScpLnJlcGxhY2UoL1xcPy9nLCdbP10nKS5yZXBsYWNlKC9cXCQvZywnWyRdJykucmVwbGFjZSgvXFxeL2csJ1teXScpLnJlcGxhY2UoL1xcLy9nLCdbL10nKS5yZXBsYWNlKC9cXFxccy9nLCdbXFxcXHNdJyl9ZnVuY3Rpb24gZihlKXtyZXR1cm4vXicuKickLy50ZXN0KGUpfWZ1bmN0aW9uIHAoZSl7cmV0dXJuIGUucmVwbGFjZSgvXicoLiopJyQvLCckMScpfWZ1bmN0aW9uIGcoZSl7Zm9yKHZhciB0PU9iamVjdC5rZXlzKGIpLG49ZSxhPTA7YTx0Lmxlbmd0aDthKyspbj1uLnNwbGl0KCckeycrYSsnfScpLmpvaW4oJygnK2JbdFthXV0rJyknKTtyZXR1cm4gbmV3IFJlZ0V4cCgnXicrbisnJCcsWydpJ10pfWZ1bmN0aW9uIG0oZSl7dmFyIHQ9YyhlKTtyZXR1cm4gJCh0KX1mdW5jdGlvbiAkKGUpe2Zvcih2YXIgdCxuLGEsbyxpPU9iamVjdC5rZXlzKGIpLHI9bmV3IFJlZ0V4cCgnXFxcXCR7KFxcXFxkKyl9JywnZycpLHM9W107bnVsbCE9PSh0PXIuZXhlYyhlKSk7KW49dFsxXSxhPWlbbl0sbz1EW2FdLHMucHVzaChvKTtyZXR1cm4gc312YXIgaCx2LHc9YW5ndWxhci5leHRlbmQoe30scixsKSx5PXt9LGI9e3NzczonWzAtOV17M30nLHNzOidbMC01XVswLTldJyxzOncuc3RyaWN0PydbMS01XT9bMC05XSc6J1swLTldfFswLTVdWzAtOV0nLG1tOidbMC01XVswLTldJyxtOncuc3RyaWN0PydbMS01XT9bMC05XSc6J1swLTldfFswLTVdWzAtOV0nLEhIOidbMDFdWzAtOV18MlswLTNdJyxIOncuc3RyaWN0PycxP1swLTldfDJbMC0zXSc6J1swMV0/WzAtOV18MlswLTNdJyxoaDonWzBdWzEtOV18WzFdWzAxMl0nLGg6dy5zdHJpY3Q/J1sxLTldfDFbMDEyXSc6JzA/WzEtOV18MVswMTJdJyxhOidBTXxQTScsRUVFRTplLkRBVEVUSU1FX0ZPUk1BVFMuREFZLmpvaW4oJ3wnKSxFRUU6ZS5EQVRFVElNRV9GT1JNQVRTLlNIT1JUREFZLmpvaW4oJ3wnKSxkZDonMFsxLTldfFsxMl1bMC05XXwzWzAxXScsZDp3LnN0cmljdD8nWzEtOV18WzEtMl1bMC05XXwzWzAxXSc6JzA/WzEtOV18WzEtMl1bMC05XXwzWzAxXScsTU1NTTplLkRBVEVUSU1FX0ZPUk1BVFMuTU9OVEguam9pbignfCcpLE1NTTplLkRBVEVUSU1FX0ZPUk1BVFMuU0hPUlRNT05USC5qb2luKCd8JyksTU06JzBbMS05XXwxWzAxMl0nLE06dy5zdHJpY3Q/J1sxLTldfDFbMDEyXSc6JzA/WzEtOV18MVswMTJdJyx5eXl5OidbMV17MX1bMC05XXszfXxbMl17MX1bMC05XXszfScseXk6J1swLTldezJ9Jyx5Oncuc3RyaWN0PyctPygwfFsxLTldWzAtOV17MCwzfSknOictPzAqWzAtOV17MSw0fSd9LEQ9e3NzczppLnNldE1pbGxpc2Vjb25kcyxzczppLnNldFNlY29uZHMsczppLnNldFNlY29uZHMsbW06aS5zZXRNaW51dGVzLG06aS5zZXRNaW51dGVzLEhIOmkuc2V0SG91cnMsSDppLnNldEhvdXJzLGhoOmkuc2V0SG91cnMsaDppLnNldEhvdXJzLEVFRUU6bixFRUU6bixkZDppLnNldERhdGUsZDppLnNldERhdGUsYTpmdW5jdGlvbihlKXt2YXIgdD10aGlzLmdldEhvdXJzKCklMTI7cmV0dXJuIHRoaXMuc2V0SG91cnMoZS5tYXRjaCgvcG0vaSk/dCsxMjp0KX0sTU1NTTpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5zZXRNb250aChvKGUuREFURVRJTUVfRk9STUFUUy5NT05USCx0KSl9LE1NTTpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5zZXRNb250aChvKGUuREFURVRJTUVfRk9STUFUUy5TSE9SVE1PTlRILHQpKX0sTU06ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuc2V0TW9udGgoMSplLTEpfSxNOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLnNldE1vbnRoKDEqZS0xKX0seXl5eTppLnNldEZ1bGxZZWFyLHl5OmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLnNldEZ1bGxZZWFyKDJlMysxKmUpfSx5OmZ1bmN0aW9uKGUpe3JldHVybiA1MD49MSplJiYyPT09ZS5sZW5ndGg/dGhpcy5zZXRGdWxsWWVhcigyZTMrMSplKTp0aGlzLnNldEZ1bGxZZWFyKDEqZSl9fTtyZXR1cm4geS5pbml0PWZ1bmN0aW9uKCl7eS4kZm9ybWF0PWUuREFURVRJTUVfRk9STUFUU1t3LmZvcm1hdF18fHcuZm9ybWF0LGg9dSh5LiRmb3JtYXQpLHY9bSh5LiRmb3JtYXQpfSx5LmlzVmFsaWQ9ZnVuY3Rpb24oZSl7cmV0dXJuIGFuZ3VsYXIuaXNEYXRlKGUpPyFpc05hTihlLmdldFRpbWUoKSk6aC50ZXN0KGUpfSx5LnBhcnNlPWZ1bmN0aW9uKG4sYSxvLGkpe28mJihvPWUuREFURVRJTUVfRk9STUFUU1tvXXx8byksYW5ndWxhci5pc0RhdGUobikmJihuPXMobixvfHx5LiRmb3JtYXQsaSkpO3ZhciByPW8/dShvKTpoLGw9bz9tKG8pOnYsYz1yLmV4ZWMobik7aWYoIWMpcmV0dXJuITE7Zm9yKHZhciBkPWEmJiFpc05hTihhLmdldFRpbWUoKSk/KG5ldyB0KS5mcm9tRGF0ZShhKToobmV3IHQpLmZyb21EYXRlKG5ldyBEYXRlKDE5NzAsMCwxLDApKSxmPTA7ZjxjLmxlbmd0aC0xO2YrKylsW2ZdJiZsW2ZdLmNhbGwoZCxjW2YrMV0pO3ZhciBwPWQudG9EYXRlKCk7cmV0dXJuIHBhcnNlSW50KGQuZGF5LDEwKSE9PXAuZ2V0RGF0ZSgpPyExOnB9LHkuZ2V0RGF0ZUZvckF0dHJpYnV0ZT1mdW5jdGlvbihlLHQpe3ZhciBuO2lmKCd0b2RheSc9PT10KXt2YXIgbz1uZXcgRGF0ZTtuPW5ldyBEYXRlKG8uZ2V0RnVsbFllYXIoKSxvLmdldE1vbnRoKCksby5nZXREYXRlKCkrKCdtYXhEYXRlJz09PWU/MTowKSwwLDAsMCwnbWluRGF0ZSc9PT1lPzA6LTEpfWVsc2Ugbj1hbmd1bGFyLmlzU3RyaW5nKHQpJiZ0Lm1hdGNoKC9eXCIuK1wiJC8pP25ldyBEYXRlKHQuc3Vic3RyKDEsdC5sZW5ndGgtMikpOmEodCk/bmV3IERhdGUocGFyc2VJbnQodCwxMCkpOmFuZ3VsYXIuaXNTdHJpbmcodCkmJjA9PT10Lmxlbmd0aD8nbWluRGF0ZSc9PT1lPy0oMS8wKTorKDEvMCk6bmV3IERhdGUodCk7cmV0dXJuIG59LHkuZ2V0VGltZUZvckF0dHJpYnV0ZT1mdW5jdGlvbihlLHQpe3ZhciBuO3JldHVybiBuPSdub3cnPT09dD8obmV3IERhdGUpLnNldEZ1bGxZZWFyKDE5NzAsMCwxKTphbmd1bGFyLmlzU3RyaW5nKHQpJiZ0Lm1hdGNoKC9eXCIuK1wiJC8pP25ldyBEYXRlKHQuc3Vic3RyKDEsdC5sZW5ndGgtMikpLnNldEZ1bGxZZWFyKDE5NzAsMCwxKTphKHQpP25ldyBEYXRlKHBhcnNlSW50KHQsMTApKS5zZXRGdWxsWWVhcigxOTcwLDAsMSk6YW5ndWxhci5pc1N0cmluZyh0KSYmMD09PXQubGVuZ3RoPydtaW5UaW1lJz09PWU/LSgxLzApOisoMS8wKTp5LnBhcnNlKHQsbmV3IERhdGUoMTk3MCwwLDEsMCkpfSx5LmRheWxpZ2h0U2F2aW5nQWRqdXN0PWZ1bmN0aW9uKGUpe3JldHVybiBlPyhlLnNldEhvdXJzKGUuZ2V0SG91cnMoKT4xMj9lLmdldEhvdXJzKCkrMjowKSxlKTpudWxsfSx5LnRpbWV6b25lT2Zmc2V0QWRqdXN0PWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gZT8odCYmJ1VUQyc9PT10JiYoZT1uZXcgRGF0ZShlLmdldFRpbWUoKSksZS5zZXRNaW51dGVzKGUuZ2V0TWludXRlcygpKyhuPy0xOjEpKmUuZ2V0VGltZXpvbmVPZmZzZXQoKSkpLGUpOm51bGx9LHkuaW5pdCgpLHl9O3JldHVybiBsfV19XSksYW5ndWxhci5tb2R1bGUoJ21nY3JlYS5uZ1N0cmFwLmhlbHBlcnMuZGF0ZUZvcm1hdHRlcicsW10pLnNlcnZpY2UoJyRkYXRlRm9ybWF0dGVyJyxbJyRsb2NhbGUnLCdkYXRlRmlsdGVyJyxmdW5jdGlvbihlLHQpe2Z1bmN0aW9uIG4oZSl7cmV0dXJuLyhoKykoWzpcXC5dKT8obSspKFs6XFwuXSk/KHMqKVsgXT8oYT8pL2kuZXhlYyhlKS5zbGljZSgxKX10aGlzLmdldERlZmF1bHRMb2NhbGU9ZnVuY3Rpb24oKXtyZXR1cm4gZS5pZH0sdGhpcy5nZXREYXRldGltZUZvcm1hdD1mdW5jdGlvbih0LG4pe3JldHVybiBlLkRBVEVUSU1FX0ZPUk1BVFNbdF18fHR9LHRoaXMud2Vla2RheXNTaG9ydD1mdW5jdGlvbih0KXtyZXR1cm4gZS5EQVRFVElNRV9GT1JNQVRTLlNIT1JUREFZfSx0aGlzLmhvdXJzRm9ybWF0PWZ1bmN0aW9uKGUpe3JldHVybiBuKGUpWzBdfSx0aGlzLm1pbnV0ZXNGb3JtYXQ9ZnVuY3Rpb24oZSl7cmV0dXJuIG4oZSlbMl19LHRoaXMuc2Vjb25kc0Zvcm1hdD1mdW5jdGlvbihlKXtyZXR1cm4gbihlKVs0XX0sdGhpcy50aW1lU2VwYXJhdG9yPWZ1bmN0aW9uKGUpe3JldHVybiBuKGUpWzFdfSx0aGlzLnNob3dTZWNvbmRzPWZ1bmN0aW9uKGUpe3JldHVybiEhbihlKVs0XX0sdGhpcy5zaG93QU09ZnVuY3Rpb24oZSl7cmV0dXJuISFuKGUpWzVdfSx0aGlzLmZvcm1hdERhdGU9ZnVuY3Rpb24oZSxuLGEsbyl7cmV0dXJuIHQoZSxuLG8pfX1dKSxhbmd1bGFyLm1vZHVsZSgnbWdjcmVhLm5nU3RyYXAuY29yZScsW10pLnNlcnZpY2UoJyRic0NvbXBpbGVyJyxhKSxhbmd1bGFyLm1vZHVsZSgnbWdjcmVhLm5nU3RyYXAuZHJvcGRvd24nLFsnbWdjcmVhLm5nU3RyYXAudG9vbHRpcCddKS5wcm92aWRlcignJGRyb3Bkb3duJyxmdW5jdGlvbigpe3ZhciBlPXRoaXMuZGVmYXVsdHM9e2FuaW1hdGlvbjonYW0tZmFkZScscHJlZml4Q2xhc3M6J2Ryb3Bkb3duJyxwcmVmaXhFdmVudDonZHJvcGRvd24nLHBsYWNlbWVudDonYm90dG9tLWxlZnQnLHRlbXBsYXRlVXJsOidkcm9wZG93bi9kcm9wZG93bi50cGwuaHRtbCcsdHJpZ2dlcjonY2xpY2snLGNvbnRhaW5lcjohMSxrZXlib2FyZDohMCxodG1sOiExLGRlbGF5OjB9O3RoaXMuJGdldD1bJyR3aW5kb3cnLCckcm9vdFNjb3BlJywnJHRvb2x0aXAnLCckdGltZW91dCcsZnVuY3Rpb24odCxuLGEsbyl7ZnVuY3Rpb24gaSh0LGkpe2Z1bmN0aW9uIGwoZSl7cmV0dXJuIGUudGFyZ2V0IT09dFswXT9lLnRhcmdldCE9PXRbMF0mJnUuaGlkZSgpOnZvaWQgMH12YXIgdT17fSxjPWFuZ3VsYXIuZXh0ZW5kKHt9LGUsaSk7dS4kc2NvcGU9Yy5zY29wZSYmYy5zY29wZS4kbmV3KCl8fG4uJG5ldygpLHU9YSh0LGMpO3ZhciBkPXQucGFyZW50KCk7dS4kb25LZXlEb3duPWZ1bmN0aW9uKGUpe2lmKC8oMzh8NDApLy50ZXN0KGUua2V5Q29kZSkpe2UucHJldmVudERlZmF1bHQoKSxlLnN0b3BQcm9wYWdhdGlvbigpO3ZhciB0PWFuZ3VsYXIuZWxlbWVudCh1LiRlbGVtZW50WzBdLnF1ZXJ5U2VsZWN0b3JBbGwoJ2xpOm5vdCguZGl2aWRlcikgYScpKTtpZih0Lmxlbmd0aCl7dmFyIG47YW5ndWxhci5mb3JFYWNoKHQsZnVuY3Rpb24oZSx0KXtzJiZzLmNhbGwoZSwnOmZvY3VzJykmJihuPXQpfSksMzg9PT1lLmtleUNvZGUmJm4+MD9uLS06NDA9PT1lLmtleUNvZGUmJm48dC5sZW5ndGgtMT9uKys6YW5ndWxhci5pc1VuZGVmaW5lZChuKSYmKG49MCksdC5lcShuKVswXS5mb2N1cygpfX19O3ZhciBmPXUuc2hvdzt1LnNob3c9ZnVuY3Rpb24oKXtmKCksbyhmdW5jdGlvbigpe2Mua2V5Ym9hcmQmJnUuJGVsZW1lbnQmJnUuJGVsZW1lbnQub24oJ2tleWRvd24nLHUuJG9uS2V5RG93biksci5vbignY2xpY2snLGwpfSwwLCExKSxkLmhhc0NsYXNzKCdkcm9wZG93bicpJiZkLmFkZENsYXNzKCdvcGVuJyl9O3ZhciBwPXUuaGlkZTt1LmhpZGU9ZnVuY3Rpb24oKXt1LiRpc1Nob3duJiYoYy5rZXlib2FyZCYmdS4kZWxlbWVudCYmdS4kZWxlbWVudC5vZmYoJ2tleWRvd24nLHUuJG9uS2V5RG93biksci5vZmYoJ2NsaWNrJyxsKSxkLmhhc0NsYXNzKCdkcm9wZG93bicpJiZkLnJlbW92ZUNsYXNzKCdvcGVuJykscCgpKX07dmFyIGc9dS5kZXN0cm95O3JldHVybiB1LmRlc3Ryb3k9ZnVuY3Rpb24oKXtyLm9mZignY2xpY2snLGwpLGcoKX0sdX12YXIgcj1hbmd1bGFyLmVsZW1lbnQodC5kb2N1bWVudC5ib2R5KSxzPUVsZW1lbnQucHJvdG90eXBlLm1hdGNoZXNTZWxlY3Rvcnx8RWxlbWVudC5wcm90b3R5cGUud2Via2l0TWF0Y2hlc1NlbGVjdG9yfHxFbGVtZW50LnByb3RvdHlwZS5tb3pNYXRjaGVzU2VsZWN0b3J8fEVsZW1lbnQucHJvdG90eXBlLm1zTWF0Y2hlc1NlbGVjdG9yfHxFbGVtZW50LnByb3RvdHlwZS5vTWF0Y2hlc1NlbGVjdG9yO3JldHVybiBpfV19KS5kaXJlY3RpdmUoJ2JzRHJvcGRvd24nLFsnJHdpbmRvdycsJyRzY2UnLCckZHJvcGRvd24nLGZ1bmN0aW9uKGUsdCxhKXtyZXR1cm57cmVzdHJpY3Q6J0VBQycsc2NvcGU6ITAsY29tcGlsZTpmdW5jdGlvbihlLHQpe2lmKCF0LmJzRHJvcGRvd24pe2Zvcih2YXIgbz1lWzBdLm5leHRTaWJsaW5nO28mJjEhPT1vLm5vZGVUeXBlOylvPW8ubmV4dFNpYmxpbmc7byYmby5jbGFzc0xpc3QuY29udGFpbnMoJ2Ryb3Bkb3duLW1lbnUnKSYmKHQudGVtcGxhdGU9by5vdXRlckhUTUwsdC50ZW1wbGF0ZVVybD1uLG8ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChvKSl9cmV0dXJuIGZ1bmN0aW9uKGUsbixvKXt2YXIgaT17c2NvcGU6ZX07YW5ndWxhci5mb3JFYWNoKFsndGVtcGxhdGUnLCd0ZW1wbGF0ZVVybCcsJ2NvbnRyb2xsZXInLCdjb250cm9sbGVyQXMnLCdwbGFjZW1lbnQnLCdjb250YWluZXInLCdkZWxheScsJ3RyaWdnZXInLCdrZXlib2FyZCcsJ2h0bWwnLCdhbmltYXRpb24nLCdpZCcsJ2F1dG9DbG9zZSddLGZ1bmN0aW9uKGUpe2FuZ3VsYXIuaXNEZWZpbmVkKHRbZV0pJiYoaVtlXT10W2VdKX0pO3ZhciByPS9eKGZhbHNlfDB8KSQvaTthbmd1bGFyLmZvckVhY2goWydodG1sJywnY29udGFpbmVyJ10sZnVuY3Rpb24oZSl7YW5ndWxhci5pc0RlZmluZWQob1tlXSkmJnIudGVzdChvW2VdKSYmKGlbZV09ITEpfSksby5ic0Ryb3Bkb3duJiZlLiR3YXRjaChvLmJzRHJvcGRvd24sZnVuY3Rpb24odCxuKXtlLmNvbnRlbnQ9dH0sITApO3ZhciBzPWEobixpKTtvLmJzU2hvdyYmZS4kd2F0Y2goby5ic1Nob3csZnVuY3Rpb24oZSx0KXtzJiZhbmd1bGFyLmlzRGVmaW5lZChlKSYmKGFuZ3VsYXIuaXNTdHJpbmcoZSkmJihlPSEhZS5tYXRjaCgvdHJ1ZXwsPyhkcm9wZG93biksPy9pKSksZT09PSEwP3Muc2hvdygpOnMuaGlkZSgpKX0pLGUuJG9uKCckZGVzdHJveScsZnVuY3Rpb24oKXtzJiZzLmRlc3Ryb3koKSxpPW51bGwscz1udWxsfSl9fX19XSksYW5ndWxhci5tb2R1bGUoJ21nY3JlYS5uZ1N0cmFwLmRhdGVwaWNrZXInLFsnbWdjcmVhLm5nU3RyYXAuaGVscGVycy5kYXRlUGFyc2VyJywnbWdjcmVhLm5nU3RyYXAuaGVscGVycy5kYXRlRm9ybWF0dGVyJywnbWdjcmVhLm5nU3RyYXAudG9vbHRpcCddKS5wcm92aWRlcignJGRhdGVwaWNrZXInLGZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5kZWZhdWx0cz17YW5pbWF0aW9uOidhbS1mYWRlJyxwcmVmaXhDbGFzczonZGF0ZXBpY2tlcicscGxhY2VtZW50Oidib3R0b20tbGVmdCcsdGVtcGxhdGVVcmw6J2RhdGVwaWNrZXIvZGF0ZXBpY2tlci50cGwuaHRtbCcsdHJpZ2dlcjonZm9jdXMnLGNvbnRhaW5lcjohMSxrZXlib2FyZDohMCxodG1sOiExLGRlbGF5OjAsdXNlTmF0aXZlOiExLGRhdGVUeXBlOidkYXRlJyxkYXRlRm9ybWF0OidzaG9ydERhdGUnLHRpbWV6b25lOm51bGwsbW9kZWxEYXRlRm9ybWF0Om51bGwsZGF5Rm9ybWF0OidkZCcsbW9udGhGb3JtYXQ6J01NTScseWVhckZvcm1hdDoneXl5eScsbW9udGhUaXRsZUZvcm1hdDonTU1NTSB5eXl5Jyx5ZWFyVGl0bGVGb3JtYXQ6J3l5eXknLHN0cmljdEZvcm1hdDohMSxhdXRvY2xvc2U6ITEsbWluRGF0ZTotKDEvMCksbWF4RGF0ZTorKDEvMCksc3RhcnRWaWV3OjAsbWluVmlldzowLHN0YXJ0V2VlazowLGRheXNPZldlZWtEaXNhYmxlZDonJyxpY29uTGVmdDonZ2x5cGhpY29uIGdseXBoaWNvbi1jaGV2cm9uLWxlZnQnLGljb25SaWdodDonZ2x5cGhpY29uIGdseXBoaWNvbi1jaGV2cm9uLXJpZ2h0J307dGhpcy4kZ2V0PVsnJHdpbmRvdycsJyRkb2N1bWVudCcsJyRyb290U2NvcGUnLCckc2NlJywnJGRhdGVGb3JtYXR0ZXInLCdkYXRlcGlja2VyVmlld3MnLCckdG9vbHRpcCcsJyR0aW1lb3V0JyxmdW5jdGlvbih0LG4sYSxvLGkscixzLGwpe2Z1bmN0aW9uIHUodCxuLGEpe2Z1bmN0aW9uIG8oZSl7ZS5zZWxlY3RlZD11LiRpc1NlbGVjdGVkKGUuZGF0ZSl9ZnVuY3Rpb24gaSgpe3RbMF0uZm9jdXMoKX12YXIgdT1zKHQsYW5ndWxhci5leHRlbmQoe30sZSxhKSksZj1hLnNjb3BlLHA9dS4kb3B0aW9ucyxnPXUuJHNjb3BlO3Auc3RhcnRWaWV3JiYocC5zdGFydFZpZXctPXAubWluVmlldyk7dmFyIG09cih1KTt1LiR2aWV3cz1tLnZpZXdzO3ZhciAkPW0udmlld0RhdGU7Zy4kbW9kZT1wLnN0YXJ0VmlldyxnLiRpY29uTGVmdD1wLmljb25MZWZ0LGcuJGljb25SaWdodD1wLmljb25SaWdodDt2YXIgaD11LiR2aWV3c1tnLiRtb2RlXTtnLiRzZWxlY3Q9ZnVuY3Rpb24oZSl7dS5zZWxlY3QoZSl9LGcuJHNlbGVjdFBhbmU9ZnVuY3Rpb24oZSl7dS4kc2VsZWN0UGFuZShlKX0sZy4kdG9nZ2xlTW9kZT1mdW5jdGlvbigpe3Uuc2V0TW9kZSgoZy4kbW9kZSsxKSV1LiR2aWV3cy5sZW5ndGgpfSx1LnVwZGF0ZT1mdW5jdGlvbihlKXthbmd1bGFyLmlzRGF0ZShlKSYmIWlzTmFOKGUuZ2V0VGltZSgpKSYmKHUuJGRhdGU9ZSxoLnVwZGF0ZS5jYWxsKGgsZSkpLHUuJGJ1aWxkKCEwKX0sdS51cGRhdGVEaXNhYmxlZERhdGVzPWZ1bmN0aW9uKGUpe3AuZGlzYWJsZWREYXRlUmFuZ2VzPWU7Zm9yKHZhciB0PTAsbj1nLnJvd3MubGVuZ3RoO24+dDt0KyspYW5ndWxhci5mb3JFYWNoKGcucm93c1t0XSx1LiRzZXREaXNhYmxlZEVsKX0sdS5zZWxlY3Q9ZnVuY3Rpb24oZSx0KXthbmd1bGFyLmlzRGF0ZShuLiRkYXRlVmFsdWUpfHwobi4kZGF0ZVZhbHVlPW5ldyBEYXRlKGUpKSwhZy4kbW9kZXx8dD8obi4kc2V0Vmlld1ZhbHVlKGFuZ3VsYXIuY29weShlKSksbi4kcmVuZGVyKCkscC5hdXRvY2xvc2UmJiF0JiZsKGZ1bmN0aW9uKCl7dS5oaWRlKCEwKX0pKTooYW5ndWxhci5leHRlbmQoJCx7eWVhcjplLmdldEZ1bGxZZWFyKCksbW9udGg6ZS5nZXRNb250aCgpLGRhdGU6ZS5nZXREYXRlKCl9KSx1LnNldE1vZGUoZy4kbW9kZS0xKSx1LiRidWlsZCgpKX0sdS5zZXRNb2RlPWZ1bmN0aW9uKGUpe2cuJG1vZGU9ZSxoPXUuJHZpZXdzW2cuJG1vZGVdLHUuJGJ1aWxkKCl9LHUuJGJ1aWxkPWZ1bmN0aW9uKGUpe2U9PT0hMCYmaC5idWlsdHx8KGUhPT0hMXx8aC5idWlsdCkmJmguYnVpbGQuY2FsbChoKX0sdS4kdXBkYXRlU2VsZWN0ZWQ9ZnVuY3Rpb24oKXtmb3IodmFyIGU9MCx0PWcucm93cy5sZW5ndGg7dD5lO2UrKylhbmd1bGFyLmZvckVhY2goZy5yb3dzW2VdLG8pfSx1LiRpc1NlbGVjdGVkPWZ1bmN0aW9uKGUpe3JldHVybiBoLmlzU2VsZWN0ZWQoZSl9LHUuJHNldERpc2FibGVkRWw9ZnVuY3Rpb24oZSl7ZS5kaXNhYmxlZD1oLmlzRGlzYWJsZWQoZS5kYXRlKX0sdS4kc2VsZWN0UGFuZT1mdW5jdGlvbihlKXt2YXIgdD1oLnN0ZXBzLG49bmV3IERhdGUoRGF0ZS5VVEMoJC55ZWFyKyh0LnllYXJ8fDApKmUsJC5tb250aCsodC5tb250aHx8MCkqZSwxKSk7YW5ndWxhci5leHRlbmQoJCx7eWVhcjpuLmdldFVUQ0Z1bGxZZWFyKCksbW9udGg6bi5nZXRVVENNb250aCgpLGRhdGU6bi5nZXRVVENEYXRlKCl9KSx1LiRidWlsZCgpfSx1LiRvbk1vdXNlRG93bj1mdW5jdGlvbihlKXtpZihlLnByZXZlbnREZWZhdWx0KCksZS5zdG9wUHJvcGFnYXRpb24oKSxkKXt2YXIgdD1hbmd1bGFyLmVsZW1lbnQoZS50YXJnZXQpOydidXR0b24nIT09dFswXS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpJiYodD10LnBhcmVudCgpKSx0LnRyaWdnZXJIYW5kbGVyKCdjbGljaycpfX0sdS4kb25LZXlEb3duPWZ1bmN0aW9uKGUpe2lmKC8oMzh8Mzd8Mzl8NDB8MTMpLy50ZXN0KGUua2V5Q29kZSkmJiFlLnNoaWZ0S2V5JiYhZS5hbHRLZXkpe2lmKGUucHJldmVudERlZmF1bHQoKSxlLnN0b3BQcm9wYWdhdGlvbigpLDEzPT09ZS5rZXlDb2RlKXJldHVybiB2b2lkKGcuJG1vZGU/Zy4kYXBwbHkoZnVuY3Rpb24oKXt1LnNldE1vZGUoZy4kbW9kZS0xKX0pOnUuaGlkZSghMCkpO2gub25LZXlEb3duKGUpLGYuJGRpZ2VzdCgpfX07dmFyIHY9dS5pbml0O3UuaW5pdD1mdW5jdGlvbigpe3JldHVybiBjJiZwLnVzZU5hdGl2ZT8odC5wcm9wKCd0eXBlJywnZGF0ZScpLHZvaWQgdC5jc3MoJy13ZWJraXQtYXBwZWFyYW5jZScsJ3RleHRmaWVsZCcpKTooZCYmKHQucHJvcCgndHlwZScsJ3RleHQnKSx0LmF0dHIoJ3JlYWRvbmx5JywndHJ1ZScpLHQub24oJ2NsaWNrJyxpKSksdm9pZCB2KCkpfTt2YXIgdz11LmRlc3Ryb3k7dS5kZXN0cm95PWZ1bmN0aW9uKCl7YyYmcC51c2VOYXRpdmUmJnQub2ZmKCdjbGljaycsaSksdygpfTt2YXIgeT11LnNob3c7dS5zaG93PWZ1bmN0aW9uKCl7IWQmJnQuYXR0cigncmVhZG9ubHknKXx8dC5hdHRyKCdkaXNhYmxlZCcpfHwoeSgpLGwoZnVuY3Rpb24oKXt1LiRpc1Nob3duJiYodS4kZWxlbWVudC5vbihkPyd0b3VjaHN0YXJ0JzonbW91c2Vkb3duJyx1LiRvbk1vdXNlRG93bikscC5rZXlib2FyZCYmdC5vbigna2V5ZG93bicsdS4kb25LZXlEb3duKSl9LDAsITEpKX07dmFyIGI9dS5oaWRlO3JldHVybiB1LmhpZGU9ZnVuY3Rpb24oZSl7dS4kaXNTaG93biYmKHUuJGVsZW1lbnQub2ZmKGQ/J3RvdWNoc3RhcnQnOidtb3VzZWRvd24nLHUuJG9uTW91c2VEb3duKSxwLmtleWJvYXJkJiZ0Lm9mZigna2V5ZG93bicsdS4kb25LZXlEb3duKSxiKGUpKX0sdX12YXIgYz0vKGlwW2FvXWR8aXBob25lfGFuZHJvaWQpL2dpLnRlc3QodC5uYXZpZ2F0b3IudXNlckFnZW50KSxkPSdjcmVhdGVUb3VjaCdpbiB0LmRvY3VtZW50JiZjO3JldHVybiBlLmxhbmd8fChlLmxhbmc9aS5nZXREZWZhdWx0TG9jYWxlKCkpLHUuZGVmYXVsdHM9ZSx1fV19KS5kaXJlY3RpdmUoJ2JzRGF0ZXBpY2tlcicsWyckd2luZG93JywnJHBhcnNlJywnJHEnLCckZGF0ZUZvcm1hdHRlcicsJyRkYXRlUGFyc2VyJywnJGRhdGVwaWNrZXInLGZ1bmN0aW9uKGUsdCxuLGEsbyxpKXt2YXIgcj0vKGlwW2FvXWR8aXBob25lfGFuZHJvaWQpL2dpLnRlc3QoZS5uYXZpZ2F0b3IudXNlckFnZW50KTtyZXR1cm57cmVzdHJpY3Q6J0VBQycscmVxdWlyZTonbmdNb2RlbCcsbGluazpmdW5jdGlvbihlLHQsbixzKXtmdW5jdGlvbiBsKGUpe3JldHVybiBlJiZlLmxlbmd0aD9lOm51bGx9ZnVuY3Rpb24gdShlKXtpZihhbmd1bGFyLmlzRGF0ZShlKSl7dmFyIHQ9aXNOYU4ocC4kb3B0aW9ucy5taW5EYXRlKXx8ZS5nZXRUaW1lKCk+PXAuJG9wdGlvbnMubWluRGF0ZSxuPWlzTmFOKHAuJG9wdGlvbnMubWF4RGF0ZSl8fGUuZ2V0VGltZSgpPD1wLiRvcHRpb25zLm1heERhdGUsYT10JiZuO3MuJHNldFZhbGlkaXR5KCdkYXRlJyxhKSxzLiRzZXRWYWxpZGl0eSgnbWluJyx0KSxzLiRzZXRWYWxpZGl0eSgnbWF4JyxuKSxhJiYocy4kZGF0ZVZhbHVlPWUpfX1mdW5jdGlvbiBjKCl7cmV0dXJuIXMuJGRhdGVWYWx1ZXx8aXNOYU4ocy4kZGF0ZVZhbHVlLmdldFRpbWUoKSk/Jyc6bShzLiRkYXRlVmFsdWUsZC5kYXRlRm9ybWF0KX12YXIgZD17c2NvcGU6ZX07YW5ndWxhci5mb3JFYWNoKFsndGVtcGxhdGUnLCd0ZW1wbGF0ZVVybCcsJ2NvbnRyb2xsZXInLCdjb250cm9sbGVyQXMnLCdwbGFjZW1lbnQnLCdjb250YWluZXInLCdkZWxheScsJ3RyaWdnZXInLCdodG1sJywnYW5pbWF0aW9uJywnYXV0b2Nsb3NlJywnZGF0ZVR5cGUnLCdkYXRlRm9ybWF0JywndGltZXpvbmUnLCdtb2RlbERhdGVGb3JtYXQnLCdkYXlGb3JtYXQnLCdzdHJpY3RGb3JtYXQnLCdzdGFydFdlZWsnLCdzdGFydERhdGUnLCd1c2VOYXRpdmUnLCdsYW5nJywnc3RhcnRWaWV3JywnbWluVmlldycsJ2ljb25MZWZ0JywnaWNvblJpZ2h0JywnZGF5c09mV2Vla0Rpc2FibGVkJywnaWQnLCdwcmVmaXhDbGFzcycsJ3ByZWZpeEV2ZW50J10sZnVuY3Rpb24oZSl7YW5ndWxhci5pc0RlZmluZWQobltlXSkmJihkW2VdPW5bZV0pfSk7dmFyIGY9L14oZmFsc2V8MHwpJC9pO2FuZ3VsYXIuZm9yRWFjaChbJ2h0bWwnLCdjb250YWluZXInLCdhdXRvY2xvc2UnLCd1c2VOYXRpdmUnXSxmdW5jdGlvbihlKXthbmd1bGFyLmlzRGVmaW5lZChuW2VdKSYmZi50ZXN0KG5bZV0pJiYoZFtlXT0hMSl9KTt2YXIgcD1pKHQscyxkKTtkPXAuJG9wdGlvbnMsciYmZC51c2VOYXRpdmUmJihkLmRhdGVGb3JtYXQ9J3l5eXktTU0tZGQnKTt2YXIgZz1kLmxhbmcsbT1mdW5jdGlvbihlLHQpe3JldHVybiBhLmZvcm1hdERhdGUoZSx0LGcpfSwkPW8oe2Zvcm1hdDpkLmRhdGVGb3JtYXQsbGFuZzpnLHN0cmljdDpkLnN0cmljdEZvcm1hdH0pO24uYnNTaG93JiZlLiR3YXRjaChuLmJzU2hvdyxmdW5jdGlvbihlLHQpe3AmJmFuZ3VsYXIuaXNEZWZpbmVkKGUpJiYoYW5ndWxhci5pc1N0cmluZyhlKSYmKGU9ISFlLm1hdGNoKC90cnVlfCw/KGRhdGVwaWNrZXIpLD8vaSkpLGU9PT0hMD9wLnNob3coKTpwLmhpZGUoKSl9KSxhbmd1bGFyLmZvckVhY2goWydtaW5EYXRlJywnbWF4RGF0ZSddLGZ1bmN0aW9uKGUpe2FuZ3VsYXIuaXNEZWZpbmVkKG5bZV0pJiZuLiRvYnNlcnZlKGUsZnVuY3Rpb24odCl7cC4kb3B0aW9uc1tlXT0kLmdldERhdGVGb3JBdHRyaWJ1dGUoZSx0KSxpc05hTihwLiRvcHRpb25zW2VdKXx8cC4kYnVpbGQoITEpLHUocy4kZGF0ZVZhbHVlKX0pfSksYW5ndWxhci5pc0RlZmluZWQobi5kYXRlRm9ybWF0KSYmbi4kb2JzZXJ2ZSgnZGF0ZUZvcm1hdCcsZnVuY3Rpb24oZSl7cC4kb3B0aW9ucy5kYXRlRm9ybWF0PWV9KSxlLiR3YXRjaChuLm5nTW9kZWwsZnVuY3Rpb24oZSx0KXtwLnVwZGF0ZShzLiRkYXRlVmFsdWUpfSwhMCksYW5ndWxhci5pc0RlZmluZWQobi5kaXNhYmxlZERhdGVzKSYmZS4kd2F0Y2gobi5kaXNhYmxlZERhdGVzLGZ1bmN0aW9uKGUsdCl7ZT1sKGUpLHQ9bCh0KSxlJiZwLnVwZGF0ZURpc2FibGVkRGF0ZXMoZSl9KSxzLiRwYXJzZXJzLnVuc2hpZnQoZnVuY3Rpb24oZSl7dmFyIHQ7aWYoIWUpcmV0dXJuIHMuJHNldFZhbGlkaXR5KCdkYXRlJywhMCksbnVsbDt2YXIgbj0kLnBhcnNlKGUscy4kZGF0ZVZhbHVlKTtyZXR1cm4hbnx8aXNOYU4obi5nZXRUaW1lKCkpP3ZvaWQgcy4kc2V0VmFsaWRpdHkoJ2RhdGUnLCExKToodShuKSwnc3RyaW5nJz09PWQuZGF0ZVR5cGU/KHQ9JC50aW1lem9uZU9mZnNldEFkanVzdChuLGQudGltZXpvbmUsITApLG0odCxkLm1vZGVsRGF0ZUZvcm1hdHx8ZC5kYXRlRm9ybWF0KSk6KHQ9JC50aW1lem9uZU9mZnNldEFkanVzdChzLiRkYXRlVmFsdWUsZC50aW1lem9uZSwhMCksJ251bWJlcic9PT1kLmRhdGVUeXBlP3QuZ2V0VGltZSgpOid1bml4Jz09PWQuZGF0ZVR5cGU/dC5nZXRUaW1lKCkvMWUzOidpc28nPT09ZC5kYXRlVHlwZT90LnRvSVNPU3RyaW5nKCk6bmV3IERhdGUodCkpKX0pLHMuJGZvcm1hdHRlcnMucHVzaChmdW5jdGlvbihlKXt2YXIgdDtyZXR1cm4gdD1hbmd1bGFyLmlzVW5kZWZpbmVkKGUpfHxudWxsPT09ZT9OYU46YW5ndWxhci5pc0RhdGUoZSk/ZTonc3RyaW5nJz09PWQuZGF0ZVR5cGU/JC5wYXJzZShlLG51bGwsZC5tb2RlbERhdGVGb3JtYXQpOid1bml4Jz09PWQuZGF0ZVR5cGU/bmV3IERhdGUoMWUzKmUpOm5ldyBEYXRlKGUpLHMuJGRhdGVWYWx1ZT0kLnRpbWV6b25lT2Zmc2V0QWRqdXN0KHQsZC50aW1lem9uZSksYygpfSkscy4kcmVuZGVyPWZ1bmN0aW9uKCl7dC52YWwoYygpKX0sZS4kb24oJyRkZXN0cm95JyxmdW5jdGlvbigpe3AmJnAuZGVzdHJveSgpLGQ9bnVsbCxwPW51bGx9KX19fV0pLnByb3ZpZGVyKCdkYXRlcGlja2VyVmlld3MnLGZ1bmN0aW9uKCl7ZnVuY3Rpb24gZShlLHQpe2Zvcih2YXIgbj1bXTtlLmxlbmd0aD4wOyluLnB1c2goZS5zcGxpY2UoMCx0KSk7cmV0dXJuIG59ZnVuY3Rpb24gdChlLHQpe3JldHVybihlJXQrdCkldH10aGlzLiRnZXQ9WyckZGF0ZUZvcm1hdHRlcicsJyRkYXRlUGFyc2VyJywnJHNjZScsZnVuY3Rpb24obixhLG8pe3JldHVybiBmdW5jdGlvbihpKXt2YXIgcj1pLiRzY29wZSxzPWkuJG9wdGlvbnMsbD1zLmxhbmcsdT1mdW5jdGlvbihlLHQpe3JldHVybiBuLmZvcm1hdERhdGUoZSx0LGwpfSxjPWEoe2Zvcm1hdDpzLmRhdGVGb3JtYXQsbGFuZzpsLHN0cmljdDpzLnN0cmljdEZvcm1hdH0pLGQ9bi53ZWVrZGF5c1Nob3J0KGwpLGY9ZC5zbGljZShzLnN0YXJ0V2VlaykuY29uY2F0KGQuc2xpY2UoMCxzLnN0YXJ0V2VlaykpLHA9by50cnVzdEFzSHRtbCgnPHRoIGNsYXNzPVwiZG93IHRleHQtY2VudGVyXCI+JytmLmpvaW4oJzwvdGg+PHRoIGNsYXNzPVwiZG93IHRleHQtY2VudGVyXCI+JykrJzwvdGg+JyksZz1pLiRkYXRlfHwocy5zdGFydERhdGU/Yy5nZXREYXRlRm9yQXR0cmlidXRlKCdzdGFydERhdGUnLHMuc3RhcnREYXRlKTpuZXcgRGF0ZSksbT17eWVhcjpnLmdldEZ1bGxZZWFyKCksbW9udGg6Zy5nZXRNb250aCgpLGRhdGU6Zy5nZXREYXRlKCl9LCQ9W3tmb3JtYXQ6cy5kYXlGb3JtYXQsc3BsaXQ6NyxzdGVwczp7bW9udGg6MX0sdXBkYXRlOmZ1bmN0aW9uKGUsdCl7IXRoaXMuYnVpbHR8fHR8fGUuZ2V0RnVsbFllYXIoKSE9PW0ueWVhcnx8ZS5nZXRNb250aCgpIT09bS5tb250aD8oYW5ndWxhci5leHRlbmQobSx7eWVhcjppLiRkYXRlLmdldEZ1bGxZZWFyKCksbW9udGg6aS4kZGF0ZS5nZXRNb250aCgpLGRhdGU6aS4kZGF0ZS5nZXREYXRlKCl9KSxpLiRidWlsZCgpKTooZS5nZXREYXRlKCkhPT1tLmRhdGV8fDE9PT1lLmdldERhdGUoKSkmJihtLmRhdGU9aS4kZGF0ZS5nZXREYXRlKCksaS4kdXBkYXRlU2VsZWN0ZWQoKSl9LGJ1aWxkOmZ1bmN0aW9uKCl7dmFyIG49bmV3IERhdGUobS55ZWFyLG0ubW9udGgsMSksYT1uLmdldFRpbWV6b25lT2Zmc2V0KCksbz1uZXcgRGF0ZSgrbi04NjRlNSp0KG4uZ2V0RGF5KCktcy5zdGFydFdlZWssNykpLGw9by5nZXRUaW1lem9uZU9mZnNldCgpLGQ9Yy50aW1lem9uZU9mZnNldEFkanVzdChuZXcgRGF0ZSxzLnRpbWV6b25lKS50b0RhdGVTdHJpbmcoKTtsIT09YSYmKG89bmV3IERhdGUoK28rNmU0KihsLWEpKSk7Zm9yKHZhciBmLGc9W10sJD0wOzQyPiQ7JCsrKWY9Yy5kYXlsaWdodFNhdmluZ0FkanVzdChuZXcgRGF0ZShvLmdldEZ1bGxZZWFyKCksby5nZXRNb250aCgpLG8uZ2V0RGF0ZSgpKyQpKSxnLnB1c2goe2RhdGU6Zixpc1RvZGF5OmYudG9EYXRlU3RyaW5nKCk9PT1kLGxhYmVsOnUoZix0aGlzLmZvcm1hdCksc2VsZWN0ZWQ6aS4kZGF0ZSYmdGhpcy5pc1NlbGVjdGVkKGYpLG11dGVkOmYuZ2V0TW9udGgoKSE9PW0ubW9udGgsZGlzYWJsZWQ6dGhpcy5pc0Rpc2FibGVkKGYpfSk7ci50aXRsZT11KG4scy5tb250aFRpdGxlRm9ybWF0KSxyLnNob3dMYWJlbHM9ITAsci5sYWJlbHM9cCxyLnJvd3M9ZShnLHRoaXMuc3BsaXQpLHRoaXMuYnVpbHQ9ITB9LGlzU2VsZWN0ZWQ6ZnVuY3Rpb24oZSl7cmV0dXJuIGkuJGRhdGUmJmUuZ2V0RnVsbFllYXIoKT09PWkuJGRhdGUuZ2V0RnVsbFllYXIoKSYmZS5nZXRNb250aCgpPT09aS4kZGF0ZS5nZXRNb250aCgpJiZlLmdldERhdGUoKT09PWkuJGRhdGUuZ2V0RGF0ZSgpfSxpc0Rpc2FibGVkOmZ1bmN0aW9uKGUpe3ZhciB0PWUuZ2V0VGltZSgpO2lmKHQ8cy5taW5EYXRlfHx0PnMubWF4RGF0ZSlyZXR1cm4hMDtpZigtMSE9PXMuZGF5c09mV2Vla0Rpc2FibGVkLmluZGV4T2YoZS5nZXREYXkoKSkpcmV0dXJuITA7aWYocy5kaXNhYmxlZERhdGVSYW5nZXMpZm9yKHZhciBuPTA7bjxzLmRpc2FibGVkRGF0ZVJhbmdlcy5sZW5ndGg7bisrKWlmKHQ+PXMuZGlzYWJsZWREYXRlUmFuZ2VzW25dLnN0YXJ0JiZ0PD1zLmRpc2FibGVkRGF0ZVJhbmdlc1tuXS5lbmQpcmV0dXJuITA7cmV0dXJuITF9LG9uS2V5RG93bjpmdW5jdGlvbihlKXtpZihpLiRkYXRlKXt2YXIgdCxuPWkuJGRhdGUuZ2V0VGltZSgpOzM3PT09ZS5rZXlDb2RlP3Q9bmV3IERhdGUobi04NjRlNSk6Mzg9PT1lLmtleUNvZGU/dD1uZXcgRGF0ZShuLTYwNDhlNSk6Mzk9PT1lLmtleUNvZGU/dD1uZXcgRGF0ZShuKzg2NGU1KTo0MD09PWUua2V5Q29kZSYmKHQ9bmV3IERhdGUobis2MDQ4ZTUpKSx0aGlzLmlzRGlzYWJsZWQodCl8fGkuc2VsZWN0KHQsITApO1xufX19LHtuYW1lOidtb250aCcsZm9ybWF0OnMubW9udGhGb3JtYXQsc3BsaXQ6NCxzdGVwczp7eWVhcjoxfSx1cGRhdGU6ZnVuY3Rpb24oZSx0KXt0aGlzLmJ1aWx0JiZlLmdldEZ1bGxZZWFyKCk9PT1tLnllYXI/ZS5nZXRNb250aCgpIT09bS5tb250aCYmKGFuZ3VsYXIuZXh0ZW5kKG0se21vbnRoOmkuJGRhdGUuZ2V0TW9udGgoKSxkYXRlOmkuJGRhdGUuZ2V0RGF0ZSgpfSksaS4kdXBkYXRlU2VsZWN0ZWQoKSk6KGFuZ3VsYXIuZXh0ZW5kKG0se3llYXI6aS4kZGF0ZS5nZXRGdWxsWWVhcigpLG1vbnRoOmkuJGRhdGUuZ2V0TW9udGgoKSxkYXRlOmkuJGRhdGUuZ2V0RGF0ZSgpfSksaS4kYnVpbGQoKSl9LGJ1aWxkOmZ1bmN0aW9uKCl7Zm9yKHZhciB0LG49W10sYT0wOzEyPmE7YSsrKXQ9bmV3IERhdGUobS55ZWFyLGEsMSksbi5wdXNoKHtkYXRlOnQsbGFiZWw6dSh0LHRoaXMuZm9ybWF0KSxzZWxlY3RlZDppLiRpc1NlbGVjdGVkKHQpLGRpc2FibGVkOnRoaXMuaXNEaXNhYmxlZCh0KX0pO3IudGl0bGU9dSh0LHMueWVhclRpdGxlRm9ybWF0KSxyLnNob3dMYWJlbHM9ITEsci5yb3dzPWUobix0aGlzLnNwbGl0KSx0aGlzLmJ1aWx0PSEwfSxpc1NlbGVjdGVkOmZ1bmN0aW9uKGUpe3JldHVybiBpLiRkYXRlJiZlLmdldEZ1bGxZZWFyKCk9PT1pLiRkYXRlLmdldEZ1bGxZZWFyKCkmJmUuZ2V0TW9udGgoKT09PWkuJGRhdGUuZ2V0TW9udGgoKX0saXNEaXNhYmxlZDpmdW5jdGlvbihlKXt2YXIgdD0rbmV3IERhdGUoZS5nZXRGdWxsWWVhcigpLGUuZ2V0TW9udGgoKSsxLDApO3JldHVybiB0PHMubWluRGF0ZXx8ZS5nZXRUaW1lKCk+cy5tYXhEYXRlfSxvbktleURvd246ZnVuY3Rpb24oZSl7aWYoaS4kZGF0ZSl7dmFyIHQ9aS4kZGF0ZS5nZXRNb250aCgpLG49bmV3IERhdGUoaS4kZGF0ZSk7Mzc9PT1lLmtleUNvZGU/bi5zZXRNb250aCh0LTEpOjM4PT09ZS5rZXlDb2RlP24uc2V0TW9udGgodC00KTozOT09PWUua2V5Q29kZT9uLnNldE1vbnRoKHQrMSk6NDA9PT1lLmtleUNvZGUmJm4uc2V0TW9udGgodCs0KSx0aGlzLmlzRGlzYWJsZWQobil8fGkuc2VsZWN0KG4sITApfX19LHtuYW1lOid5ZWFyJyxmb3JtYXQ6cy55ZWFyRm9ybWF0LHNwbGl0OjQsc3RlcHM6e3llYXI6MTJ9LHVwZGF0ZTpmdW5jdGlvbihlLHQpeyF0aGlzLmJ1aWx0fHx0fHxwYXJzZUludChlLmdldEZ1bGxZZWFyKCkvMjAsMTApIT09cGFyc2VJbnQobS55ZWFyLzIwLDEwKT8oYW5ndWxhci5leHRlbmQobSx7eWVhcjppLiRkYXRlLmdldEZ1bGxZZWFyKCksbW9udGg6aS4kZGF0ZS5nZXRNb250aCgpLGRhdGU6aS4kZGF0ZS5nZXREYXRlKCl9KSxpLiRidWlsZCgpKTplLmdldEZ1bGxZZWFyKCkhPT1tLnllYXImJihhbmd1bGFyLmV4dGVuZChtLHt5ZWFyOmkuJGRhdGUuZ2V0RnVsbFllYXIoKSxtb250aDppLiRkYXRlLmdldE1vbnRoKCksZGF0ZTppLiRkYXRlLmdldERhdGUoKX0pLGkuJHVwZGF0ZVNlbGVjdGVkKCkpfSxidWlsZDpmdW5jdGlvbigpe2Zvcih2YXIgdCxuPW0ueWVhci1tLnllYXIlKDMqdGhpcy5zcGxpdCksYT1bXSxvPTA7MTI+bztvKyspdD1uZXcgRGF0ZShuK28sMCwxKSxhLnB1c2goe2RhdGU6dCxsYWJlbDp1KHQsdGhpcy5mb3JtYXQpLHNlbGVjdGVkOmkuJGlzU2VsZWN0ZWQodCksZGlzYWJsZWQ6dGhpcy5pc0Rpc2FibGVkKHQpfSk7ci50aXRsZT1hWzBdLmxhYmVsKyctJythW2EubGVuZ3RoLTFdLmxhYmVsLHIuc2hvd0xhYmVscz0hMSxyLnJvd3M9ZShhLHRoaXMuc3BsaXQpLHRoaXMuYnVpbHQ9ITB9LGlzU2VsZWN0ZWQ6ZnVuY3Rpb24oZSl7cmV0dXJuIGkuJGRhdGUmJmUuZ2V0RnVsbFllYXIoKT09PWkuJGRhdGUuZ2V0RnVsbFllYXIoKX0saXNEaXNhYmxlZDpmdW5jdGlvbihlKXt2YXIgdD0rbmV3IERhdGUoZS5nZXRGdWxsWWVhcigpKzEsMCwwKTtyZXR1cm4gdDxzLm1pbkRhdGV8fGUuZ2V0VGltZSgpPnMubWF4RGF0ZX0sb25LZXlEb3duOmZ1bmN0aW9uKGUpe2lmKGkuJGRhdGUpe3ZhciB0PWkuJGRhdGUuZ2V0RnVsbFllYXIoKSxuPW5ldyBEYXRlKGkuJGRhdGUpOzM3PT09ZS5rZXlDb2RlP24uc2V0WWVhcih0LTEpOjM4PT09ZS5rZXlDb2RlP24uc2V0WWVhcih0LTQpOjM5PT09ZS5rZXlDb2RlP24uc2V0WWVhcih0KzEpOjQwPT09ZS5rZXlDb2RlJiZuLnNldFllYXIodCs0KSx0aGlzLmlzRGlzYWJsZWQobil8fGkuc2VsZWN0KG4sITApfX19XTtyZXR1cm57dmlld3M6cy5taW5WaWV3P0FycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKCQscy5taW5WaWV3KTokLHZpZXdEYXRlOm19fX1dfSksYW5ndWxhci5tb2R1bGUoJ21nY3JlYS5uZ1N0cmFwLmNvbGxhcHNlJyxbXSkucHJvdmlkZXIoJyRjb2xsYXBzZScsZnVuY3Rpb24oKXt2YXIgZT10aGlzLmRlZmF1bHRzPXthbmltYXRpb246J2FtLWNvbGxhcHNlJyxkaXNhbGxvd1RvZ2dsZTohMSxhY3RpdmVDbGFzczonaW4nLHN0YXJ0Q29sbGFwc2VkOiExLGFsbG93TXVsdGlwbGU6ITF9LHQ9dGhpcy5jb250cm9sbGVyPWZ1bmN0aW9uKHQsbixhKXtmdW5jdGlvbiBvKGUpe2Zvcih2YXIgdD1sLiR0YXJnZXRzLiRhY3RpdmUsbj0wO248dC5sZW5ndGg7bisrKWU8dFtuXSYmKHRbbl09dFtuXS0xKSx0W25dPT09bC4kdGFyZ2V0cy5sZW5ndGgmJih0W25dPWwuJHRhcmdldHMubGVuZ3RoLTEpfWZ1bmN0aW9uIGkoZSl7dmFyIHQ9bC4kdGFyZ2V0cy4kYWN0aXZlO3JldHVybi0xPT09dC5pbmRleE9mKGUpPyExOiEwfWZ1bmN0aW9uIHIoZSl7dmFyIHQ9bC4kdGFyZ2V0cy4kYWN0aXZlLmluZGV4T2YoZSk7LTEhPT10JiZsLiR0YXJnZXRzLiRhY3RpdmUuc3BsaWNlKHQsMSl9ZnVuY3Rpb24gcyhlKXtsLiRvcHRpb25zLmFsbG93TXVsdGlwbGV8fGwuJHRhcmdldHMuJGFjdGl2ZS5zcGxpY2UoMCwxKSwtMT09PWwuJHRhcmdldHMuJGFjdGl2ZS5pbmRleE9mKGUpJiZsLiR0YXJnZXRzLiRhY3RpdmUucHVzaChlKX12YXIgbD10aGlzO2wuJG9wdGlvbnM9YW5ndWxhci5jb3B5KGUpLGFuZ3VsYXIuZm9yRWFjaChbJ2FuaW1hdGlvbicsJ2Rpc2FsbG93VG9nZ2xlJywnYWN0aXZlQ2xhc3MnLCdzdGFydENvbGxhcHNlZCcsJ2FsbG93TXVsdGlwbGUnXSxmdW5jdGlvbihlKXthbmd1bGFyLmlzRGVmaW5lZChhW2VdKSYmKGwuJG9wdGlvbnNbZV09YVtlXSl9KTt2YXIgdT0vXihmYWxzZXwwfCkkL2k7YW5ndWxhci5mb3JFYWNoKFsnZGlzYWxsb3dUb2dnbGUnLCdzdGFydENvbGxhcHNlZCcsJ2FsbG93TXVsdGlwbGUnXSxmdW5jdGlvbihlKXthbmd1bGFyLmlzRGVmaW5lZChhW2VdKSYmdS50ZXN0KGFbZV0pJiYobC4kb3B0aW9uc1tlXT0hMSl9KSxsLiR0b2dnbGVzPVtdLGwuJHRhcmdldHM9W10sbC4kdmlld0NoYW5nZUxpc3RlbmVycz1bXSxsLiRyZWdpc3RlclRvZ2dsZT1mdW5jdGlvbihlKXtsLiR0b2dnbGVzLnB1c2goZSl9LGwuJHJlZ2lzdGVyVGFyZ2V0PWZ1bmN0aW9uKGUpe2wuJHRhcmdldHMucHVzaChlKX0sbC4kdW5yZWdpc3RlclRvZ2dsZT1mdW5jdGlvbihlKXt2YXIgdD1sLiR0b2dnbGVzLmluZGV4T2YoZSk7bC4kdG9nZ2xlcy5zcGxpY2UodCwxKX0sbC4kdW5yZWdpc3RlclRhcmdldD1mdW5jdGlvbihlKXt2YXIgdD1sLiR0YXJnZXRzLmluZGV4T2YoZSk7bC4kdGFyZ2V0cy5zcGxpY2UodCwxKSxsLiRvcHRpb25zLmFsbG93TXVsdGlwbGUmJnIoZSksbyh0KSxsLiR2aWV3Q2hhbmdlTGlzdGVuZXJzLmZvckVhY2goZnVuY3Rpb24oZSl7ZSgpfSl9LGwuJHRhcmdldHMuJGFjdGl2ZT1sLiRvcHRpb25zLnN0YXJ0Q29sbGFwc2VkP1tdOlswXSxsLiRzZXRBY3RpdmU9dC4kc2V0QWN0aXZlPWZ1bmN0aW9uKGUpe2FuZ3VsYXIuaXNBcnJheShlKT9sLiR0YXJnZXRzLiRhY3RpdmU9ZTohbC4kb3B0aW9ucy5kaXNhbGxvd1RvZ2dsZSYmaShlKT9yKGUpOnMoZSksbC4kdmlld0NoYW5nZUxpc3RlbmVycy5mb3JFYWNoKGZ1bmN0aW9uKGUpe2UoKX0pfSxsLiRhY3RpdmVJbmRleGVzPWZ1bmN0aW9uKCl7cmV0dXJuIGwuJG9wdGlvbnMuYWxsb3dNdWx0aXBsZT9sLiR0YXJnZXRzLiRhY3RpdmU6MT09PWwuJHRhcmdldHMuJGFjdGl2ZS5sZW5ndGg/bC4kdGFyZ2V0cy4kYWN0aXZlWzBdOi0xfX07dGhpcy4kZ2V0PWZ1bmN0aW9uKCl7dmFyIG49e307cmV0dXJuIG4uZGVmYXVsdHM9ZSxuLmNvbnRyb2xsZXI9dCxufX0pLmRpcmVjdGl2ZSgnYnNDb2xsYXBzZScsWyckd2luZG93JywnJGFuaW1hdGUnLCckY29sbGFwc2UnLGZ1bmN0aW9uKGUsdCxuKXtyZXR1cm57cmVxdWlyZTpbJz9uZ01vZGVsJywnYnNDb2xsYXBzZSddLGNvbnRyb2xsZXI6Wyckc2NvcGUnLCckZWxlbWVudCcsJyRhdHRycycsbi5jb250cm9sbGVyXSxsaW5rOmZ1bmN0aW9uKGUsdCxuLGEpe3ZhciBvPWFbMF0saT1hWzFdO28mJihpLiR2aWV3Q2hhbmdlTGlzdGVuZXJzLnB1c2goZnVuY3Rpb24oKXtvLiRzZXRWaWV3VmFsdWUoaS4kYWN0aXZlSW5kZXhlcygpKX0pLG8uJGZvcm1hdHRlcnMucHVzaChmdW5jdGlvbihlKXtpZihhbmd1bGFyLmlzQXJyYXkoZSkpaS4kc2V0QWN0aXZlKGUpO2Vsc2V7dmFyIHQ9aS4kYWN0aXZlSW5kZXhlcygpO2FuZ3VsYXIuaXNBcnJheSh0KT8tMT09PXQuaW5kZXhPZigxKmUpJiZpLiRzZXRBY3RpdmUoMSplKTp0IT09MSplJiZpLiRzZXRBY3RpdmUoMSplKX1yZXR1cm4gZX0pKX19fV0pLmRpcmVjdGl2ZSgnYnNDb2xsYXBzZVRvZ2dsZScsZnVuY3Rpb24oKXtyZXR1cm57cmVxdWlyZTpbJ14/bmdNb2RlbCcsJ15ic0NvbGxhcHNlJ10sbGluazpmdW5jdGlvbihlLHQsbixhKXt2YXIgbz1hWzFdO3QuYXR0cignZGF0YS10b2dnbGUnLCdjb2xsYXBzZScpLG8uJHJlZ2lzdGVyVG9nZ2xlKHQpLGUuJG9uKCckZGVzdHJveScsZnVuY3Rpb24oKXtvLiR1bnJlZ2lzdGVyVG9nZ2xlKHQpfSksdC5vbignY2xpY2snLGZ1bmN0aW9uKCl7aWYoIW4uZGlzYWJsZWQpe3ZhciBhPW4uYnNDb2xsYXBzZVRvZ2dsZSYmJ2JzLWNvbGxhcHNlLXRvZ2dsZSchPT1uLmJzQ29sbGFwc2VUb2dnbGU/bi5ic0NvbGxhcHNlVG9nZ2xlOm8uJHRvZ2dsZXMuaW5kZXhPZih0KTtvLiRzZXRBY3RpdmUoMSphKSxlLiRhcHBseSgpfX0pfX19KS5kaXJlY3RpdmUoJ2JzQ29sbGFwc2VUYXJnZXQnLFsnJGFuaW1hdGUnLGZ1bmN0aW9uKGUpe3JldHVybntyZXF1aXJlOlsnXj9uZ01vZGVsJywnXmJzQ29sbGFwc2UnXSxsaW5rOmZ1bmN0aW9uKHQsbixhLG8pe2Z1bmN0aW9uIGkoKXt2YXIgdD1yLiR0YXJnZXRzLmluZGV4T2YobiksYT1yLiRhY3RpdmVJbmRleGVzKCksbz0ncmVtb3ZlQ2xhc3MnO2FuZ3VsYXIuaXNBcnJheShhKT8tMSE9PWEuaW5kZXhPZih0KSYmKG89J2FkZENsYXNzJyk6dD09PWEmJihvPSdhZGRDbGFzcycpLGVbb10obixyLiRvcHRpb25zLmFjdGl2ZUNsYXNzKX12YXIgcj1vWzFdO24uYWRkQ2xhc3MoJ2NvbGxhcHNlJyksci4kb3B0aW9ucy5hbmltYXRpb24mJm4uYWRkQ2xhc3Moci4kb3B0aW9ucy5hbmltYXRpb24pLHIuJHJlZ2lzdGVyVGFyZ2V0KG4pLHQuJG9uKCckZGVzdHJveScsZnVuY3Rpb24oKXtyLiR1bnJlZ2lzdGVyVGFyZ2V0KG4pfSksci4kdmlld0NoYW5nZUxpc3RlbmVycy5wdXNoKGZ1bmN0aW9uKCl7aSgpfSksaSgpfX19XSksYW5ndWxhci5tb2R1bGUoJ21nY3JlYS5uZ1N0cmFwLmJ1dHRvbicsW10pLnByb3ZpZGVyKCckYnV0dG9uJyxmdW5jdGlvbigpe3ZhciBlPXRoaXMuZGVmYXVsdHM9e2FjdGl2ZUNsYXNzOidhY3RpdmUnLHRvZ2dsZUV2ZW50OidjbGljayd9O3RoaXMuJGdldD1mdW5jdGlvbigpe3JldHVybntkZWZhdWx0czplfX19KS5kaXJlY3RpdmUoJ2JzQ2hlY2tib3hHcm91cCcsZnVuY3Rpb24oKXtyZXR1cm57cmVzdHJpY3Q6J0EnLHJlcXVpcmU6J25nTW9kZWwnLGNvbXBpbGU6ZnVuY3Rpb24oZSx0KXtlLmF0dHIoJ2RhdGEtdG9nZ2xlJywnYnV0dG9ucycpLGUucmVtb3ZlQXR0cignbmctbW9kZWwnKTt2YXIgbj1lWzBdLnF1ZXJ5U2VsZWN0b3JBbGwoJ2lucHV0W3R5cGU9XCJjaGVja2JveFwiXScpO2FuZ3VsYXIuZm9yRWFjaChuLGZ1bmN0aW9uKGUpe3ZhciBuPWFuZ3VsYXIuZWxlbWVudChlKTtuLmF0dHIoJ2JzLWNoZWNrYm94JywnJyksbi5hdHRyKCduZy1tb2RlbCcsdC5uZ01vZGVsKycuJytuLmF0dHIoJ3ZhbHVlJykpfSl9fX0pLmRpcmVjdGl2ZSgnYnNDaGVja2JveCcsWyckYnV0dG9uJywnJCRyQUYnLGZ1bmN0aW9uKGUsdCl7dmFyIG49ZS5kZWZhdWx0cyxhPS9eKHRydWV8ZmFsc2V8XFxkKykkLztyZXR1cm57cmVzdHJpY3Q6J0EnLHJlcXVpcmU6J25nTW9kZWwnLGxpbms6ZnVuY3Rpb24oZSxvLGkscil7dmFyIHM9bixsPSdJTlBVVCc9PT1vWzBdLm5vZGVOYW1lLHU9bD9vLnBhcmVudCgpOm8sYz1hbmd1bGFyLmlzRGVmaW5lZChpLnRydWVWYWx1ZSk/aS50cnVlVmFsdWU6ITA7YS50ZXN0KGkudHJ1ZVZhbHVlKSYmKGM9ZS4kZXZhbChpLnRydWVWYWx1ZSkpO3ZhciBkPWFuZ3VsYXIuaXNEZWZpbmVkKGkuZmFsc2VWYWx1ZSk/aS5mYWxzZVZhbHVlOiExO2EudGVzdChpLmZhbHNlVmFsdWUpJiYoZD1lLiRldmFsKGkuZmFsc2VWYWx1ZSkpO3ZhciBmPSdib29sZWFuJyE9dHlwZW9mIGN8fCdib29sZWFuJyE9dHlwZW9mIGQ7ZiYmKHIuJHBhcnNlcnMucHVzaChmdW5jdGlvbihlKXtyZXR1cm4gZT9jOmR9KSxyLiRmb3JtYXR0ZXJzLnB1c2goZnVuY3Rpb24oZSl7cmV0dXJuIGFuZ3VsYXIuZXF1YWxzKGUsYyl9KSxlLiR3YXRjaChpLm5nTW9kZWwsZnVuY3Rpb24oZSx0KXtyLiRyZW5kZXIoKX0pKSxyLiRyZW5kZXI9ZnVuY3Rpb24oKXt2YXIgZT1hbmd1bGFyLmVxdWFscyhyLiRtb2RlbFZhbHVlLGMpO3QoZnVuY3Rpb24oKXtsJiYob1swXS5jaGVja2VkPWUpLHUudG9nZ2xlQ2xhc3Mocy5hY3RpdmVDbGFzcyxlKX0pfSxvLmJpbmQocy50b2dnbGVFdmVudCxmdW5jdGlvbigpe2UuJGFwcGx5KGZ1bmN0aW9uKCl7bHx8ci4kc2V0Vmlld1ZhbHVlKCF1Lmhhc0NsYXNzKCdhY3RpdmUnKSksZnx8ci4kcmVuZGVyKCl9KX0pfX19XSkuZGlyZWN0aXZlKCdic1JhZGlvR3JvdXAnLGZ1bmN0aW9uKCl7cmV0dXJue3Jlc3RyaWN0OidBJyxyZXF1aXJlOiduZ01vZGVsJyxjb21waWxlOmZ1bmN0aW9uKGUsdCl7ZS5hdHRyKCdkYXRhLXRvZ2dsZScsJ2J1dHRvbnMnKSxlLnJlbW92ZUF0dHIoJ25nLW1vZGVsJyk7dmFyIG49ZVswXS5xdWVyeVNlbGVjdG9yQWxsKCdpbnB1dFt0eXBlPVwicmFkaW9cIl0nKTthbmd1bGFyLmZvckVhY2gobixmdW5jdGlvbihlKXthbmd1bGFyLmVsZW1lbnQoZSkuYXR0cignYnMtcmFkaW8nLCcnKSxhbmd1bGFyLmVsZW1lbnQoZSkuYXR0cignbmctbW9kZWwnLHQubmdNb2RlbCl9KX19fSkuZGlyZWN0aXZlKCdic1JhZGlvJyxbJyRidXR0b24nLCckJHJBRicsZnVuY3Rpb24oZSx0KXt2YXIgbj1lLmRlZmF1bHRzLGE9L14odHJ1ZXxmYWxzZXxcXGQrKSQvO3JldHVybntyZXN0cmljdDonQScscmVxdWlyZTonbmdNb2RlbCcsbGluazpmdW5jdGlvbihlLG8saSxyKXt2YXIgcyxsPW4sdT0nSU5QVVQnPT09b1swXS5ub2RlTmFtZSxjPXU/by5wYXJlbnQoKTpvO2kuJG9ic2VydmUoJ3ZhbHVlJyxmdW5jdGlvbih0KXtzPWEudGVzdCh0KT9lLiRldmFsKHQpOnQsci4kcmVuZGVyKCl9KSxyLiRyZW5kZXI9ZnVuY3Rpb24oKXt2YXIgZT1hbmd1bGFyLmVxdWFscyhyLiRtb2RlbFZhbHVlLHMpO3QoZnVuY3Rpb24oKXt1JiYob1swXS5jaGVja2VkPWUpLGMudG9nZ2xlQ2xhc3MobC5hY3RpdmVDbGFzcyxlKX0pfSxvLmJpbmQobC50b2dnbGVFdmVudCxmdW5jdGlvbigpe2UuJGFwcGx5KGZ1bmN0aW9uKCl7ci4kc2V0Vmlld1ZhbHVlKHMpLHIuJHJlbmRlcigpfSl9KX19fV0pLGFuZ3VsYXIubW9kdWxlKCdtZ2NyZWEubmdTdHJhcC5hc2lkZScsWydtZ2NyZWEubmdTdHJhcC5tb2RhbCddKS5wcm92aWRlcignJGFzaWRlJyxmdW5jdGlvbigpe3ZhciBlPXRoaXMuZGVmYXVsdHM9e2FuaW1hdGlvbjonYW0tZmFkZS1hbmQtc2xpZGUtcmlnaHQnLHByZWZpeENsYXNzOidhc2lkZScscHJlZml4RXZlbnQ6J2FzaWRlJyxwbGFjZW1lbnQ6J3JpZ2h0Jyx0ZW1wbGF0ZVVybDonYXNpZGUvYXNpZGUudHBsLmh0bWwnLGNvbnRlbnRUZW1wbGF0ZTohMSxjb250YWluZXI6ITEsZWxlbWVudDpudWxsLGJhY2tkcm9wOiEwLGtleWJvYXJkOiEwLGh0bWw6ITEsc2hvdzohMH07dGhpcy4kZ2V0PVsnJG1vZGFsJyxmdW5jdGlvbih0KXtmdW5jdGlvbiBuKG4pe3ZhciBhPXt9LG89YW5ndWxhci5leHRlbmQoe30sZSxuKTtyZXR1cm4gYT10KG8pfXJldHVybiBufV19KS5kaXJlY3RpdmUoJ2JzQXNpZGUnLFsnJHdpbmRvdycsJyRzY2UnLCckYXNpZGUnLGZ1bmN0aW9uKGUsdCxuKXtyZXR1cm57cmVzdHJpY3Q6J0VBQycsc2NvcGU6ITAsbGluazpmdW5jdGlvbihlLGEsbyxpKXt2YXIgcj17c2NvcGU6ZSxlbGVtZW50OmEsc2hvdzohMX07YW5ndWxhci5mb3JFYWNoKFsndGVtcGxhdGUnLCd0ZW1wbGF0ZVVybCcsJ2NvbnRyb2xsZXInLCdjb250cm9sbGVyQXMnLCdjb250ZW50VGVtcGxhdGUnLCdwbGFjZW1lbnQnLCdiYWNrZHJvcCcsJ2tleWJvYXJkJywnaHRtbCcsJ2NvbnRhaW5lcicsJ2FuaW1hdGlvbiddLGZ1bmN0aW9uKGUpe2FuZ3VsYXIuaXNEZWZpbmVkKG9bZV0pJiYocltlXT1vW2VdKX0pO3ZhciBzPS9eKGZhbHNlfDB8KSQvaTthbmd1bGFyLmZvckVhY2goWydiYWNrZHJvcCcsJ2tleWJvYXJkJywnaHRtbCcsJ2NvbnRhaW5lciddLGZ1bmN0aW9uKGUpe2FuZ3VsYXIuaXNEZWZpbmVkKG9bZV0pJiZzLnRlc3Qob1tlXSkmJihyW2VdPSExKX0pLGFuZ3VsYXIuZm9yRWFjaChbJ3RpdGxlJywnY29udGVudCddLGZ1bmN0aW9uKG4pe29bbl0mJm8uJG9ic2VydmUobixmdW5jdGlvbihhLG8pe2Vbbl09dC50cnVzdEFzSHRtbChhKX0pfSksby5ic0FzaWRlJiZlLiR3YXRjaChvLmJzQXNpZGUsZnVuY3Rpb24odCxuKXthbmd1bGFyLmlzT2JqZWN0KHQpP2FuZ3VsYXIuZXh0ZW5kKGUsdCk6ZS5jb250ZW50PXR9LCEwKTt2YXIgbD1uKHIpO2Eub24oby50cmlnZ2VyfHwnY2xpY2snLGwudG9nZ2xlKSxlLiRvbignJGRlc3Ryb3knLGZ1bmN0aW9uKCl7bCYmbC5kZXN0cm95KCkscj1udWxsLGw9bnVsbH0pfX19XSksYW5ndWxhci5tb2R1bGUoJ21nY3JlYS5uZ1N0cmFwLmFsZXJ0JyxbJ21nY3JlYS5uZ1N0cmFwLm1vZGFsJ10pLnByb3ZpZGVyKCckYWxlcnQnLGZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5kZWZhdWx0cz17YW5pbWF0aW9uOidhbS1mYWRlJyxwcmVmaXhDbGFzczonYWxlcnQnLHByZWZpeEV2ZW50OidhbGVydCcscGxhY2VtZW50Om51bGwsdGVtcGxhdGVVcmw6J2FsZXJ0L2FsZXJ0LnRwbC5odG1sJyxjb250YWluZXI6ITEsZWxlbWVudDpudWxsLGJhY2tkcm9wOiExLGtleWJvYXJkOiEwLHNob3c6ITAsZHVyYXRpb246ITEsdHlwZTohMSxkaXNtaXNzYWJsZTohMH07dGhpcy4kZ2V0PVsnJG1vZGFsJywnJHRpbWVvdXQnLGZ1bmN0aW9uKHQsbil7ZnVuY3Rpb24gYShhKXt2YXIgbz17fSxpPWFuZ3VsYXIuZXh0ZW5kKHt9LGUsYSk7bz10KGkpLG8uJHNjb3BlLmRpc21pc3NhYmxlPSEhaS5kaXNtaXNzYWJsZSxpLnR5cGUmJihvLiRzY29wZS50eXBlPWkudHlwZSk7dmFyIHI9by5zaG93O3JldHVybiBpLmR1cmF0aW9uJiYoby5zaG93PWZ1bmN0aW9uKCl7cigpLG4oZnVuY3Rpb24oKXtvLmhpZGUoKX0sMWUzKmkuZHVyYXRpb24pfSksb31yZXR1cm4gYX1dfSkuZGlyZWN0aXZlKCdic0FsZXJ0JyxbJyR3aW5kb3cnLCckc2NlJywnJGFsZXJ0JyxmdW5jdGlvbihlLHQsbil7cmV0dXJue3Jlc3RyaWN0OidFQUMnLHNjb3BlOiEwLGxpbms6ZnVuY3Rpb24oZSxhLG8saSl7dmFyIHI9e3Njb3BlOmUsZWxlbWVudDphLHNob3c6ITF9O2FuZ3VsYXIuZm9yRWFjaChbJ3RlbXBsYXRlJywndGVtcGxhdGVVcmwnLCdjb250cm9sbGVyJywnY29udHJvbGxlckFzJywncGxhY2VtZW50Jywna2V5Ym9hcmQnLCdodG1sJywnY29udGFpbmVyJywnYW5pbWF0aW9uJywnZHVyYXRpb24nLCdkaXNtaXNzYWJsZSddLGZ1bmN0aW9uKGUpe2FuZ3VsYXIuaXNEZWZpbmVkKG9bZV0pJiYocltlXT1vW2VdKX0pO3ZhciBzPS9eKGZhbHNlfDB8KSQvaTthbmd1bGFyLmZvckVhY2goWydrZXlib2FyZCcsJ2h0bWwnLCdjb250YWluZXInLCdkaXNtaXNzYWJsZSddLGZ1bmN0aW9uKGUpe2FuZ3VsYXIuaXNEZWZpbmVkKG9bZV0pJiZzLnRlc3Qob1tlXSkmJihyW2VdPSExKX0pLGUuaGFzT3duUHJvcGVydHkoJ3RpdGxlJyl8fChlLnRpdGxlPScnKSxhbmd1bGFyLmZvckVhY2goWyd0aXRsZScsJ2NvbnRlbnQnLCd0eXBlJ10sZnVuY3Rpb24obil7b1tuXSYmby4kb2JzZXJ2ZShuLGZ1bmN0aW9uKGEsbyl7ZVtuXT10LnRydXN0QXNIdG1sKGEpfSl9KSxvLmJzQWxlcnQmJmUuJHdhdGNoKG8uYnNBbGVydCxmdW5jdGlvbih0LG4pe2FuZ3VsYXIuaXNPYmplY3QodCk/YW5ndWxhci5leHRlbmQoZSx0KTplLmNvbnRlbnQ9dH0sITApO3ZhciBsPW4ocik7YS5vbihvLnRyaWdnZXJ8fCdjbGljaycsbC50b2dnbGUpLGUuJG9uKCckZGVzdHJveScsZnVuY3Rpb24oKXtsJiZsLmRlc3Ryb3koKSxyPW51bGwsbD1udWxsfSl9fX1dKSxhbmd1bGFyLm1vZHVsZSgnbWdjcmVhLm5nU3RyYXAuYWZmaXgnLFsnbWdjcmVhLm5nU3RyYXAuaGVscGVycy5kaW1lbnNpb25zJywnbWdjcmVhLm5nU3RyYXAuaGVscGVycy5kZWJvdW5jZSddKS5wcm92aWRlcignJGFmZml4JyxmdW5jdGlvbigpe3ZhciBlPXRoaXMuZGVmYXVsdHM9e29mZnNldFRvcDonYXV0bycsaW5saW5lU3R5bGVzOiEwfTt0aGlzLiRnZXQ9Wyckd2luZG93JywnZGVib3VuY2UnLCdkaW1lbnNpb25zJyxmdW5jdGlvbih0LG4sYSl7ZnVuY3Rpb24gbyhvLHMpe2Z1bmN0aW9uIGwoZSx0LG4pe3ZhciBhPXUoKSxvPWMoKTtyZXR1cm4gdj49YT8ndG9wJzpudWxsIT09ZSYmYStlPD10LnRvcD8nbWlkZGxlJzpudWxsIT09dyYmdC50b3ArbiskPj1vLXc/J2JvdHRvbSc6J21pZGRsZSd9ZnVuY3Rpb24gdSgpe3JldHVybiBwWzBdPT09dD90LnBhZ2VZT2Zmc2V0OnBbMF0uc2Nyb2xsVG9wfWZ1bmN0aW9uIGMoKXtyZXR1cm4gcFswXT09PXQ/dC5kb2N1bWVudC5ib2R5LnNjcm9sbEhlaWdodDpwWzBdLnNjcm9sbEhlaWdodH12YXIgZD17fSxmPWFuZ3VsYXIuZXh0ZW5kKHt9LGUscykscD1mLnRhcmdldCxnPSdhZmZpeCBhZmZpeC10b3AgYWZmaXgtYm90dG9tJyxtPSExLCQ9MCxoPTAsdj0wLHc9MCx5PW51bGwsYj1udWxsLEQ9by5wYXJlbnQoKTtpZihmLm9mZnNldFBhcmVudClpZihmLm9mZnNldFBhcmVudC5tYXRjaCgvXlxcZCskLykpZm9yKHZhciBrPTA7azwxKmYub2Zmc2V0UGFyZW50LTE7aysrKUQ9RC5wYXJlbnQoKTtlbHNlIEQ9YW5ndWxhci5lbGVtZW50KGYub2Zmc2V0UGFyZW50KTtyZXR1cm4gZC5pbml0PWZ1bmN0aW9uKCl7dGhpcy4kcGFyc2VPZmZzZXRzKCksaD1hLm9mZnNldChvWzBdKS50b3ArJCxtPSFvWzBdLnN0eWxlLndpZHRoLHAub24oJ3Njcm9sbCcsdGhpcy5jaGVja1Bvc2l0aW9uKSxwLm9uKCdjbGljaycsdGhpcy5jaGVja1Bvc2l0aW9uV2l0aEV2ZW50TG9vcCksci5vbigncmVzaXplJyx0aGlzLiRkZWJvdW5jZWRPblJlc2l6ZSksdGhpcy5jaGVja1Bvc2l0aW9uKCksdGhpcy5jaGVja1Bvc2l0aW9uV2l0aEV2ZW50TG9vcCgpfSxkLmRlc3Ryb3k9ZnVuY3Rpb24oKXtwLm9mZignc2Nyb2xsJyx0aGlzLmNoZWNrUG9zaXRpb24pLHAub2ZmKCdjbGljaycsdGhpcy5jaGVja1Bvc2l0aW9uV2l0aEV2ZW50TG9vcCksci5vZmYoJ3Jlc2l6ZScsdGhpcy4kZGVib3VuY2VkT25SZXNpemUpfSxkLmNoZWNrUG9zaXRpb25XaXRoRXZlbnRMb29wPWZ1bmN0aW9uKCl7c2V0VGltZW91dChkLmNoZWNrUG9zaXRpb24sMSl9LGQuY2hlY2tQb3NpdGlvbj1mdW5jdGlvbigpe3ZhciBlPXUoKSx0PWEub2Zmc2V0KG9bMF0pLG49YS5oZWlnaHQob1swXSkscj1sKGIsdCxuKTt5IT09ciYmKHk9ciwndG9wJz09PXI/KGI9bnVsbCxtJiZvLmNzcygnd2lkdGgnLCcnKSxmLmlubGluZVN0eWxlcyYmKG8uY3NzKCdwb3NpdGlvbicsZi5vZmZzZXRQYXJlbnQ/Jyc6J3JlbGF0aXZlJyksby5jc3MoJ3RvcCcsJycpKSk6J2JvdHRvbSc9PT1yPyhiPWYub2Zmc2V0VW5waW4/LSgxKmYub2Zmc2V0VW5waW4pOnQudG9wLWUsbSYmby5jc3MoJ3dpZHRoJywnJyksZi5pbmxpbmVTdHlsZXMmJihvLmNzcygncG9zaXRpb24nLGYub2Zmc2V0UGFyZW50PycnOidyZWxhdGl2ZScpLG8uY3NzKCd0b3AnLGYub2Zmc2V0UGFyZW50PycnOmlbMF0ub2Zmc2V0SGVpZ2h0LXctbi1oKydweCcpKSk6KGI9bnVsbCxtJiZvLmNzcygnd2lkdGgnLG9bMF0ub2Zmc2V0V2lkdGgrJ3B4JyksZi5pbmxpbmVTdHlsZXMmJihvLmNzcygncG9zaXRpb24nLCdmaXhlZCcpLG8uY3NzKCd0b3AnLCQrJ3B4JykpKSxvLnJlbW92ZUNsYXNzKGcpLmFkZENsYXNzKCdhZmZpeCcrKCdtaWRkbGUnIT09cj8nLScrcjonJykpKX0sZC4kb25SZXNpemU9ZnVuY3Rpb24oKXtkLiRwYXJzZU9mZnNldHMoKSxkLmNoZWNrUG9zaXRpb24oKX0sZC4kZGVib3VuY2VkT25SZXNpemU9bihkLiRvblJlc2l6ZSw1MCksZC4kcGFyc2VPZmZzZXRzPWZ1bmN0aW9uKCl7dmFyIGU9by5jc3MoJ3Bvc2l0aW9uJyk7Zi5pbmxpbmVTdHlsZXMmJm8uY3NzKCdwb3NpdGlvbicsZi5vZmZzZXRQYXJlbnQ/Jyc6J3JlbGF0aXZlJyksZi5vZmZzZXRUb3AmJignYXV0byc9PT1mLm9mZnNldFRvcCYmKGYub2Zmc2V0VG9wPScrMCcpLGYub2Zmc2V0VG9wLm1hdGNoKC9eWy0rXVxcZCskLyk/KCQ9MSotZi5vZmZzZXRUb3Asdj1mLm9mZnNldFBhcmVudD9hLm9mZnNldChEWzBdKS50b3ArMSpmLm9mZnNldFRvcDphLm9mZnNldChvWzBdKS50b3AtYS5jc3Mob1swXSwnbWFyZ2luVG9wJywhMCkrMSpmLm9mZnNldFRvcCk6dj0xKmYub2Zmc2V0VG9wKSxmLm9mZnNldEJvdHRvbSYmKHc9Zi5vZmZzZXRQYXJlbnQmJmYub2Zmc2V0Qm90dG9tLm1hdGNoKC9eWy0rXVxcZCskLyk/YygpLShhLm9mZnNldChEWzBdKS50b3ArYS5oZWlnaHQoRFswXSkpKzEqZi5vZmZzZXRCb3R0b20rMToxKmYub2Zmc2V0Qm90dG9tKSxmLmlubGluZVN0eWxlcyYmby5jc3MoJ3Bvc2l0aW9uJyxlKX0sZC5pbml0KCksZH12YXIgaT1hbmd1bGFyLmVsZW1lbnQodC5kb2N1bWVudC5ib2R5KSxyPWFuZ3VsYXIuZWxlbWVudCh0KTtyZXR1cm4gb31dfSkuZGlyZWN0aXZlKCdic0FmZml4JyxbJyRhZmZpeCcsJyR3aW5kb3cnLGZ1bmN0aW9uKGUsdCl7cmV0dXJue3Jlc3RyaWN0OidFQUMnLHJlcXVpcmU6J14/YnNBZmZpeFRhcmdldCcsbGluazpmdW5jdGlvbihuLGEsbyxpKXt2YXIgcj17c2NvcGU6bix0YXJnZXQ6aT9pLiRlbGVtZW50OmFuZ3VsYXIuZWxlbWVudCh0KX07YW5ndWxhci5mb3JFYWNoKFsnb2Zmc2V0VG9wJywnb2Zmc2V0Qm90dG9tJywnb2Zmc2V0UGFyZW50Jywnb2Zmc2V0VW5waW4nLCdpbmxpbmVTdHlsZXMnXSxmdW5jdGlvbihlKXtpZihhbmd1bGFyLmlzRGVmaW5lZChvW2VdKSl7dmFyIHQ9b1tlXTsvdHJ1ZS9pLnRlc3QodCkmJih0PSEwKSwvZmFsc2UvaS50ZXN0KHQpJiYodD0hMSkscltlXT10fX0pO3ZhciBzPWUoYSxyKTtuLiRvbignJGRlc3Ryb3knLGZ1bmN0aW9uKCl7cyYmcy5kZXN0cm95KCkscj1udWxsLHM9bnVsbH0pfX19XSkuZGlyZWN0aXZlKCdic0FmZml4VGFyZ2V0JyxmdW5jdGlvbigpe3JldHVybntjb250cm9sbGVyOlsnJGVsZW1lbnQnLGZ1bmN0aW9uKGUpe3RoaXMuJGVsZW1lbnQ9ZX1dfX0pLGFuZ3VsYXIubW9kdWxlKCdtZ2NyZWEubmdTdHJhcCcsWydtZ2NyZWEubmdTdHJhcC5tb2RhbCcsJ21nY3JlYS5uZ1N0cmFwLmFzaWRlJywnbWdjcmVhLm5nU3RyYXAuYWxlcnQnLCdtZ2NyZWEubmdTdHJhcC5idXR0b24nLCdtZ2NyZWEubmdTdHJhcC5zZWxlY3QnLCdtZ2NyZWEubmdTdHJhcC5kYXRlcGlja2VyJywnbWdjcmVhLm5nU3RyYXAudGltZXBpY2tlcicsJ21nY3JlYS5uZ1N0cmFwLm5hdmJhcicsJ21nY3JlYS5uZ1N0cmFwLnRvb2x0aXAnLCdtZ2NyZWEubmdTdHJhcC5wb3BvdmVyJywnbWdjcmVhLm5nU3RyYXAuZHJvcGRvd24nLCdtZ2NyZWEubmdTdHJhcC50eXBlYWhlYWQnLCdtZ2NyZWEubmdTdHJhcC5zY3JvbGxzcHknLCdtZ2NyZWEubmdTdHJhcC5hZmZpeCcsJ21nY3JlYS5uZ1N0cmFwLnRhYicsJ21nY3JlYS5uZ1N0cmFwLmNvbGxhcHNlJ10pfSh3aW5kb3csZG9jdW1lbnQpO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9YW5ndWxhci1zdHJhcC5taW4uanMubWFwXG5cblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vYm93ZXJfY29tcG9uZW50cy9hbmd1bGFyLXN0cmFwL2Rpc3QvYW5ndWxhci1zdHJhcC5taW4uanNcbiAqKiBtb2R1bGUgaWQgPSA1MVxuICoqIG1vZHVsZSBjaHVua3MgPSAyNFxuICoqLyJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=");

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

	eval("/**\n * angular-strap\n * @version v2.3.7 - 2016-01-16\n * @link http://mgcrea.github.io/angular-strap\n * @author Olivier Louvignes <olivier@mg-crea.com> (https://github.com/mgcrea)\n * @license MIT License, http://www.opensource.org/licenses/MIT\n */\n!function(t,e,n){'use strict';angular.module('mgcrea.ngStrap.alert').run(['$templateCache',function(t){t.put('alert/alert.tpl.html','<div class=\"alert\" ng-class=\"[type ? \\'alert-\\' + type : null]\"><button type=\"button\" class=\"close\" ng-if=\"dismissable\" ng-click=\"$hide()\">&times;</button> <strong ng-bind=\"title\"></strong>&nbsp;<span ng-bind-html=\"content\"></span></div>')}]),angular.module('mgcrea.ngStrap.aside').run(['$templateCache',function(t){t.put('aside/aside.tpl.html','<div class=\"aside\" tabindex=\"-1\" role=\"dialog\"><div class=\"aside-dialog\"><div class=\"aside-content\"><div class=\"aside-header\" ng-show=\"title\"><button type=\"button\" class=\"close\" ng-click=\"$hide()\">&times;</button><h4 class=\"aside-title\" ng-bind=\"title\"></h4></div><div class=\"aside-body\" ng-bind=\"content\"></div><div class=\"aside-footer\"><button type=\"button\" class=\"btn btn-default\" ng-click=\"$hide()\">Close</button></div></div></div></div>')}]),angular.module('mgcrea.ngStrap.datepicker').run(['$templateCache',function(t){t.put('datepicker/datepicker.tpl.html','<div class=\"dropdown-menu datepicker\" ng-class=\"\\'datepicker-mode-\\' + $mode\" style=\"max-width: 320px\"><table style=\"table-layout: fixed; height: 100%; width: 100%\"><thead><tr class=\"text-center\"><th><button tabindex=\"-1\" type=\"button\" class=\"btn btn-default pull-left\" ng-click=\"$selectPane(-1)\"><i class=\"{{$iconLeft}}\"></i></button></th><th colspan=\"{{ rows[0].length - 2 }}\"><button tabindex=\"-1\" type=\"button\" class=\"btn btn-default btn-block text-strong\" ng-click=\"$toggleMode()\"><strong style=\"text-transform: capitalize\" ng-bind=\"title\"></strong></button></th><th><button tabindex=\"-1\" type=\"button\" class=\"btn btn-default pull-right\" ng-click=\"$selectPane(+1)\"><i class=\"{{$iconRight}}\"></i></button></th></tr><tr ng-if=\"showLabels\" ng-bind-html=\"labels\"></tr></thead><tbody><tr ng-repeat=\"(i, row) in rows\" height=\"{{ 100 / rows.length }}%\"><td class=\"text-center\" ng-repeat=\"(j, el) in row\"><button tabindex=\"-1\" type=\"button\" class=\"btn btn-default\" style=\"width: 100%\" ng-class=\"{\\'btn-primary\\': el.selected, \\'btn-info btn-today\\': el.isToday && !el.selected}\" ng-click=\"$select(el.date)\" ng-disabled=\"el.disabled\"><span ng-class=\"{\\'text-muted\\': el.muted}\" ng-bind=\"el.label\"></span></button></td></tr></tbody></table></div>')}]),angular.module('mgcrea.ngStrap.dropdown').run(['$templateCache',function(t){t.put('dropdown/dropdown.tpl.html','<ul tabindex=\"-1\" class=\"dropdown-menu\" role=\"menu\" ng-show=\"content && content.length\"><li role=\"presentation\" ng-class=\"{divider: item.divider, active: item.active}\" ng-repeat=\"item in content\"><a role=\"menuitem\" tabindex=\"-1\" ng-href=\"{{item.href}}\" ng-if=\"!item.divider && item.href\" target=\"{{item.target || \\'\\'}}\" ng-bind=\"item.text\"></a> <a role=\"menuitem\" tabindex=\"-1\" href=\"javascript:void(0)\" ng-if=\"!item.divider && item.click\" ng-click=\"$eval(item.click);$hide()\" ng-bind=\"item.text\"></a></li></ul>')}]),angular.module('mgcrea.ngStrap.modal').run(['$templateCache',function(t){t.put('modal/modal.tpl.html','<div class=\"modal\" tabindex=\"-1\" role=\"dialog\" aria-hidden=\"true\"><div class=\"modal-dialog\"><div class=\"modal-content\"><div class=\"modal-header\" ng-show=\"title\"><button type=\"button\" class=\"close\" aria-label=\"Close\" ng-click=\"$hide()\"><span aria-hidden=\"true\">&times;</span></button><h4 class=\"modal-title\" ng-bind=\"title\"></h4></div><div class=\"modal-body\" ng-bind=\"content\"></div><div class=\"modal-footer\"><button type=\"button\" class=\"btn btn-default\" ng-click=\"$hide()\">Close</button></div></div></div></div>')}]),angular.module('mgcrea.ngStrap.popover').run(['$templateCache',function(t){t.put('popover/popover.tpl.html','<div class=\"popover\" tabindex=\"-1\"><div class=\"arrow\"></div><h3 class=\"popover-title\" ng-bind=\"title\" ng-show=\"title\"></h3><div class=\"popover-content\" ng-bind=\"content\"></div></div>')}]),angular.module('mgcrea.ngStrap.select').run(['$templateCache',function(t){t.put('select/select.tpl.html','<ul tabindex=\"-1\" class=\"select dropdown-menu\" ng-show=\"$isVisible()\" role=\"select\"><li ng-if=\"$showAllNoneButtons\"><div class=\"btn-group\" style=\"margin-bottom: 5px; margin-left: 5px\"><button type=\"button\" class=\"btn btn-default btn-xs\" ng-click=\"$selectAll()\">{{$allText}}</button> <button type=\"button\" class=\"btn btn-default btn-xs\" ng-click=\"$selectNone()\">{{$noneText}}</button></div></li><li role=\"presentation\" ng-repeat=\"match in $matches\" ng-class=\"{active: $isActive($index)}\"><a style=\"cursor: default\" role=\"menuitem\" tabindex=\"-1\" ng-click=\"$select($index, $event)\"><i class=\"{{$iconCheckmark}} pull-right\" ng-if=\"$isMultiple && $isActive($index)\"></i> <span ng-bind=\"match.label\"></span></a></li></ul>')}]),angular.module('mgcrea.ngStrap.tab').run(['$templateCache',function(t){t.put('tab/tab.tpl.html','<ul class=\"nav\" ng-class=\"$navClass\" role=\"tablist\"><li role=\"presentation\" ng-repeat=\"$pane in $panes track by $index\" ng-class=\"[ $isActive($pane, $index) ? $activeClass : \\'\\', $pane.disabled ? \\'disabled\\' : \\'\\' ]\"><a role=\"tab\" data-toggle=\"tab\" ng-click=\"!$pane.disabled && $setActive($pane.name || $index)\" data-index=\"{{ $index }}\" ng-bind-html=\"$pane.title\" aria-controls=\"$pane.title\"></a></li></ul><div ng-transclude class=\"tab-content\"></div>')}]),angular.module('mgcrea.ngStrap.timepicker').run(['$templateCache',function(t){t.put('timepicker/timepicker.tpl.html','<div class=\"dropdown-menu timepicker\" style=\"min-width: 0px;width: auto\"><table height=\"100%\"><thead><tr class=\"text-center\"><th><button tabindex=\"-1\" type=\"button\" class=\"btn btn-default pull-left\" ng-click=\"$arrowAction(-1, 0)\"><i class=\"{{ $iconUp }}\"></i></button></th><th>&nbsp;</th><th><button tabindex=\"-1\" type=\"button\" class=\"btn btn-default pull-left\" ng-click=\"$arrowAction(-1, 1)\"><i class=\"{{ $iconUp }}\"></i></button></th><th>&nbsp;</th><th><button ng-if=\"showSeconds\" tabindex=\"-1\" type=\"button\" class=\"btn btn-default pull-left\" ng-click=\"$arrowAction(-1, 2)\"><i class=\"{{ $iconUp }}\"></i></button></th></tr></thead><tbody><tr ng-repeat=\"(i, row) in rows\"><td class=\"text-center\"><button tabindex=\"-1\" style=\"width: 100%\" type=\"button\" class=\"btn btn-default\" ng-class=\"{\\'btn-primary\\': row[0].selected}\" ng-click=\"$select(row[0].date, 0)\" ng-disabled=\"row[0].disabled\"><span ng-class=\"{\\'text-muted\\': row[0].muted}\" ng-bind=\"row[0].label\"></span></button></td><td><span ng-bind=\"i == midIndex ? timeSeparator : \\' \\'\"></span></td><td class=\"text-center\"><button tabindex=\"-1\" ng-if=\"row[1].date\" style=\"width: 100%\" type=\"button\" class=\"btn btn-default\" ng-class=\"{\\'btn-primary\\': row[1].selected}\" ng-click=\"$select(row[1].date, 1)\" ng-disabled=\"row[1].disabled\"><span ng-class=\"{\\'text-muted\\': row[1].muted}\" ng-bind=\"row[1].label\"></span></button></td><td><span ng-bind=\"i == midIndex ? timeSeparator : \\' \\'\"></span></td><td class=\"text-center\"><button tabindex=\"-1\" ng-if=\"showSeconds && row[2].date\" style=\"width: 100%\" type=\"button\" class=\"btn btn-default\" ng-class=\"{\\'btn-primary\\': row[2].selected}\" ng-click=\"$select(row[2].date, 2)\" ng-disabled=\"row[2].disabled\"><span ng-class=\"{\\'text-muted\\': row[2].muted}\" ng-bind=\"row[2].label\"></span></button></td><td ng-if=\"showAM\">&nbsp;</td><td ng-if=\"showAM\"><button tabindex=\"-1\" ng-show=\"i == midIndex - !isAM * 1\" style=\"width: 100%\" type=\"button\" ng-class=\"{\\'btn-primary\\': !!isAM}\" class=\"btn btn-default\" ng-click=\"$switchMeridian()\" ng-disabled=\"el.disabled\">AM</button> <button tabindex=\"-1\" ng-show=\"i == midIndex + 1 - !isAM * 1\" style=\"width: 100%\" type=\"button\" ng-class=\"{\\'btn-primary\\': !isAM}\" class=\"btn btn-default\" ng-click=\"$switchMeridian()\" ng-disabled=\"el.disabled\">PM</button></td></tr></tbody><tfoot><tr class=\"text-center\"><th><button tabindex=\"-1\" type=\"button\" class=\"btn btn-default pull-left\" ng-click=\"$arrowAction(1, 0)\"><i class=\"{{ $iconDown }}\"></i></button></th><th>&nbsp;</th><th><button tabindex=\"-1\" type=\"button\" class=\"btn btn-default pull-left\" ng-click=\"$arrowAction(1, 1)\"><i class=\"{{ $iconDown }}\"></i></button></th><th>&nbsp;</th><th><button ng-if=\"showSeconds\" tabindex=\"-1\" type=\"button\" class=\"btn btn-default pull-left\" ng-click=\"$arrowAction(1, 2)\"><i class=\"{{ $iconDown }}\"></i></button></th></tr></tfoot></table></div>')}]),angular.module('mgcrea.ngStrap.tooltip').run(['$templateCache',function(t){t.put('tooltip/tooltip.tpl.html','<div class=\"tooltip in\" ng-show=\"title\"><div class=\"tooltip-arrow\"></div><div class=\"tooltip-inner\" ng-bind=\"title\"></div></div>')}]),angular.module('mgcrea.ngStrap.typeahead').run(['$templateCache',function(t){t.put('typeahead/typeahead.tpl.html','<ul tabindex=\"-1\" class=\"typeahead dropdown-menu\" ng-show=\"$isVisible()\" role=\"select\"><li role=\"presentation\" ng-repeat=\"match in $matches\" ng-class=\"{active: $index == $activeIndex}\"><a role=\"menuitem\" tabindex=\"-1\" ng-click=\"$select($index, $event)\" ng-bind=\"match.label\"></a></li></ul>')}])}(window,document);\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTIuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ib3dlcl9jb21wb25lbnRzL2FuZ3VsYXItc3RyYXAvZGlzdC9hbmd1bGFyLXN0cmFwLnRwbC5taW4uanM/ZjNiZiJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIGFuZ3VsYXItc3RyYXBcbiAqIEB2ZXJzaW9uIHYyLjMuNyAtIDIwMTYtMDEtMTZcbiAqIEBsaW5rIGh0dHA6Ly9tZ2NyZWEuZ2l0aHViLmlvL2FuZ3VsYXItc3RyYXBcbiAqIEBhdXRob3IgT2xpdmllciBMb3V2aWduZXMgPG9saXZpZXJAbWctY3JlYS5jb20+IChodHRwczovL2dpdGh1Yi5jb20vbWdjcmVhKVxuICogQGxpY2Vuc2UgTUlUIExpY2Vuc2UsIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUXG4gKi9cbiFmdW5jdGlvbih0LGUsbil7J3VzZSBzdHJpY3QnO2FuZ3VsYXIubW9kdWxlKCdtZ2NyZWEubmdTdHJhcC5hbGVydCcpLnJ1bihbJyR0ZW1wbGF0ZUNhY2hlJyxmdW5jdGlvbih0KXt0LnB1dCgnYWxlcnQvYWxlcnQudHBsLmh0bWwnLCc8ZGl2IGNsYXNzPVwiYWxlcnRcIiBuZy1jbGFzcz1cIlt0eXBlID8gXFwnYWxlcnQtXFwnICsgdHlwZSA6IG51bGxdXCI+PGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJjbG9zZVwiIG5nLWlmPVwiZGlzbWlzc2FibGVcIiBuZy1jbGljaz1cIiRoaWRlKClcIj4mdGltZXM7PC9idXR0b24+IDxzdHJvbmcgbmctYmluZD1cInRpdGxlXCI+PC9zdHJvbmc+Jm5ic3A7PHNwYW4gbmctYmluZC1odG1sPVwiY29udGVudFwiPjwvc3Bhbj48L2Rpdj4nKX1dKSxhbmd1bGFyLm1vZHVsZSgnbWdjcmVhLm5nU3RyYXAuYXNpZGUnKS5ydW4oWyckdGVtcGxhdGVDYWNoZScsZnVuY3Rpb24odCl7dC5wdXQoJ2FzaWRlL2FzaWRlLnRwbC5odG1sJywnPGRpdiBjbGFzcz1cImFzaWRlXCIgdGFiaW5kZXg9XCItMVwiIHJvbGU9XCJkaWFsb2dcIj48ZGl2IGNsYXNzPVwiYXNpZGUtZGlhbG9nXCI+PGRpdiBjbGFzcz1cImFzaWRlLWNvbnRlbnRcIj48ZGl2IGNsYXNzPVwiYXNpZGUtaGVhZGVyXCIgbmctc2hvdz1cInRpdGxlXCI+PGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJjbG9zZVwiIG5nLWNsaWNrPVwiJGhpZGUoKVwiPiZ0aW1lczs8L2J1dHRvbj48aDQgY2xhc3M9XCJhc2lkZS10aXRsZVwiIG5nLWJpbmQ9XCJ0aXRsZVwiPjwvaDQ+PC9kaXY+PGRpdiBjbGFzcz1cImFzaWRlLWJvZHlcIiBuZy1iaW5kPVwiY29udGVudFwiPjwvZGl2PjxkaXYgY2xhc3M9XCJhc2lkZS1mb290ZXJcIj48YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tZGVmYXVsdFwiIG5nLWNsaWNrPVwiJGhpZGUoKVwiPkNsb3NlPC9idXR0b24+PC9kaXY+PC9kaXY+PC9kaXY+PC9kaXY+Jyl9XSksYW5ndWxhci5tb2R1bGUoJ21nY3JlYS5uZ1N0cmFwLmRhdGVwaWNrZXInKS5ydW4oWyckdGVtcGxhdGVDYWNoZScsZnVuY3Rpb24odCl7dC5wdXQoJ2RhdGVwaWNrZXIvZGF0ZXBpY2tlci50cGwuaHRtbCcsJzxkaXYgY2xhc3M9XCJkcm9wZG93bi1tZW51IGRhdGVwaWNrZXJcIiBuZy1jbGFzcz1cIlxcJ2RhdGVwaWNrZXItbW9kZS1cXCcgKyAkbW9kZVwiIHN0eWxlPVwibWF4LXdpZHRoOiAzMjBweFwiPjx0YWJsZSBzdHlsZT1cInRhYmxlLWxheW91dDogZml4ZWQ7IGhlaWdodDogMTAwJTsgd2lkdGg6IDEwMCVcIj48dGhlYWQ+PHRyIGNsYXNzPVwidGV4dC1jZW50ZXJcIj48dGg+PGJ1dHRvbiB0YWJpbmRleD1cIi0xXCIgdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1kZWZhdWx0IHB1bGwtbGVmdFwiIG5nLWNsaWNrPVwiJHNlbGVjdFBhbmUoLTEpXCI+PGkgY2xhc3M9XCJ7eyRpY29uTGVmdH19XCI+PC9pPjwvYnV0dG9uPjwvdGg+PHRoIGNvbHNwYW49XCJ7eyByb3dzWzBdLmxlbmd0aCAtIDIgfX1cIj48YnV0dG9uIHRhYmluZGV4PVwiLTFcIiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLWRlZmF1bHQgYnRuLWJsb2NrIHRleHQtc3Ryb25nXCIgbmctY2xpY2s9XCIkdG9nZ2xlTW9kZSgpXCI+PHN0cm9uZyBzdHlsZT1cInRleHQtdHJhbnNmb3JtOiBjYXBpdGFsaXplXCIgbmctYmluZD1cInRpdGxlXCI+PC9zdHJvbmc+PC9idXR0b24+PC90aD48dGg+PGJ1dHRvbiB0YWJpbmRleD1cIi0xXCIgdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1kZWZhdWx0IHB1bGwtcmlnaHRcIiBuZy1jbGljaz1cIiRzZWxlY3RQYW5lKCsxKVwiPjxpIGNsYXNzPVwie3skaWNvblJpZ2h0fX1cIj48L2k+PC9idXR0b24+PC90aD48L3RyPjx0ciBuZy1pZj1cInNob3dMYWJlbHNcIiBuZy1iaW5kLWh0bWw9XCJsYWJlbHNcIj48L3RyPjwvdGhlYWQ+PHRib2R5Pjx0ciBuZy1yZXBlYXQ9XCIoaSwgcm93KSBpbiByb3dzXCIgaGVpZ2h0PVwie3sgMTAwIC8gcm93cy5sZW5ndGggfX0lXCI+PHRkIGNsYXNzPVwidGV4dC1jZW50ZXJcIiBuZy1yZXBlYXQ9XCIoaiwgZWwpIGluIHJvd1wiPjxidXR0b24gdGFiaW5kZXg9XCItMVwiIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tZGVmYXVsdFwiIHN0eWxlPVwid2lkdGg6IDEwMCVcIiBuZy1jbGFzcz1cIntcXCdidG4tcHJpbWFyeVxcJzogZWwuc2VsZWN0ZWQsIFxcJ2J0bi1pbmZvIGJ0bi10b2RheVxcJzogZWwuaXNUb2RheSAmJiAhZWwuc2VsZWN0ZWR9XCIgbmctY2xpY2s9XCIkc2VsZWN0KGVsLmRhdGUpXCIgbmctZGlzYWJsZWQ9XCJlbC5kaXNhYmxlZFwiPjxzcGFuIG5nLWNsYXNzPVwie1xcJ3RleHQtbXV0ZWRcXCc6IGVsLm11dGVkfVwiIG5nLWJpbmQ9XCJlbC5sYWJlbFwiPjwvc3Bhbj48L2J1dHRvbj48L3RkPjwvdHI+PC90Ym9keT48L3RhYmxlPjwvZGl2PicpfV0pLGFuZ3VsYXIubW9kdWxlKCdtZ2NyZWEubmdTdHJhcC5kcm9wZG93bicpLnJ1bihbJyR0ZW1wbGF0ZUNhY2hlJyxmdW5jdGlvbih0KXt0LnB1dCgnZHJvcGRvd24vZHJvcGRvd24udHBsLmh0bWwnLCc8dWwgdGFiaW5kZXg9XCItMVwiIGNsYXNzPVwiZHJvcGRvd24tbWVudVwiIHJvbGU9XCJtZW51XCIgbmctc2hvdz1cImNvbnRlbnQgJiYgY29udGVudC5sZW5ndGhcIj48bGkgcm9sZT1cInByZXNlbnRhdGlvblwiIG5nLWNsYXNzPVwie2RpdmlkZXI6IGl0ZW0uZGl2aWRlciwgYWN0aXZlOiBpdGVtLmFjdGl2ZX1cIiBuZy1yZXBlYXQ9XCJpdGVtIGluIGNvbnRlbnRcIj48YSByb2xlPVwibWVudWl0ZW1cIiB0YWJpbmRleD1cIi0xXCIgbmctaHJlZj1cInt7aXRlbS5ocmVmfX1cIiBuZy1pZj1cIiFpdGVtLmRpdmlkZXIgJiYgaXRlbS5ocmVmXCIgdGFyZ2V0PVwie3tpdGVtLnRhcmdldCB8fCBcXCdcXCd9fVwiIG5nLWJpbmQ9XCJpdGVtLnRleHRcIj48L2E+IDxhIHJvbGU9XCJtZW51aXRlbVwiIHRhYmluZGV4PVwiLTFcIiBocmVmPVwiamF2YXNjcmlwdDp2b2lkKDApXCIgbmctaWY9XCIhaXRlbS5kaXZpZGVyICYmIGl0ZW0uY2xpY2tcIiBuZy1jbGljaz1cIiRldmFsKGl0ZW0uY2xpY2spOyRoaWRlKClcIiBuZy1iaW5kPVwiaXRlbS50ZXh0XCI+PC9hPjwvbGk+PC91bD4nKX1dKSxhbmd1bGFyLm1vZHVsZSgnbWdjcmVhLm5nU3RyYXAubW9kYWwnKS5ydW4oWyckdGVtcGxhdGVDYWNoZScsZnVuY3Rpb24odCl7dC5wdXQoJ21vZGFsL21vZGFsLnRwbC5odG1sJywnPGRpdiBjbGFzcz1cIm1vZGFsXCIgdGFiaW5kZXg9XCItMVwiIHJvbGU9XCJkaWFsb2dcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48ZGl2IGNsYXNzPVwibW9kYWwtZGlhbG9nXCI+PGRpdiBjbGFzcz1cIm1vZGFsLWNvbnRlbnRcIj48ZGl2IGNsYXNzPVwibW9kYWwtaGVhZGVyXCIgbmctc2hvdz1cInRpdGxlXCI+PGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJjbG9zZVwiIGFyaWEtbGFiZWw9XCJDbG9zZVwiIG5nLWNsaWNrPVwiJGhpZGUoKVwiPjxzcGFuIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPiZ0aW1lczs8L3NwYW4+PC9idXR0b24+PGg0IGNsYXNzPVwibW9kYWwtdGl0bGVcIiBuZy1iaW5kPVwidGl0bGVcIj48L2g0PjwvZGl2PjxkaXYgY2xhc3M9XCJtb2RhbC1ib2R5XCIgbmctYmluZD1cImNvbnRlbnRcIj48L2Rpdj48ZGl2IGNsYXNzPVwibW9kYWwtZm9vdGVyXCI+PGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLWRlZmF1bHRcIiBuZy1jbGljaz1cIiRoaWRlKClcIj5DbG9zZTwvYnV0dG9uPjwvZGl2PjwvZGl2PjwvZGl2PjwvZGl2PicpfV0pLGFuZ3VsYXIubW9kdWxlKCdtZ2NyZWEubmdTdHJhcC5wb3BvdmVyJykucnVuKFsnJHRlbXBsYXRlQ2FjaGUnLGZ1bmN0aW9uKHQpe3QucHV0KCdwb3BvdmVyL3BvcG92ZXIudHBsLmh0bWwnLCc8ZGl2IGNsYXNzPVwicG9wb3ZlclwiIHRhYmluZGV4PVwiLTFcIj48ZGl2IGNsYXNzPVwiYXJyb3dcIj48L2Rpdj48aDMgY2xhc3M9XCJwb3BvdmVyLXRpdGxlXCIgbmctYmluZD1cInRpdGxlXCIgbmctc2hvdz1cInRpdGxlXCI+PC9oMz48ZGl2IGNsYXNzPVwicG9wb3Zlci1jb250ZW50XCIgbmctYmluZD1cImNvbnRlbnRcIj48L2Rpdj48L2Rpdj4nKX1dKSxhbmd1bGFyLm1vZHVsZSgnbWdjcmVhLm5nU3RyYXAuc2VsZWN0JykucnVuKFsnJHRlbXBsYXRlQ2FjaGUnLGZ1bmN0aW9uKHQpe3QucHV0KCdzZWxlY3Qvc2VsZWN0LnRwbC5odG1sJywnPHVsIHRhYmluZGV4PVwiLTFcIiBjbGFzcz1cInNlbGVjdCBkcm9wZG93bi1tZW51XCIgbmctc2hvdz1cIiRpc1Zpc2libGUoKVwiIHJvbGU9XCJzZWxlY3RcIj48bGkgbmctaWY9XCIkc2hvd0FsbE5vbmVCdXR0b25zXCI+PGRpdiBjbGFzcz1cImJ0bi1ncm91cFwiIHN0eWxlPVwibWFyZ2luLWJvdHRvbTogNXB4OyBtYXJnaW4tbGVmdDogNXB4XCI+PGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLWRlZmF1bHQgYnRuLXhzXCIgbmctY2xpY2s9XCIkc2VsZWN0QWxsKClcIj57eyRhbGxUZXh0fX08L2J1dHRvbj4gPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLWRlZmF1bHQgYnRuLXhzXCIgbmctY2xpY2s9XCIkc2VsZWN0Tm9uZSgpXCI+e3skbm9uZVRleHR9fTwvYnV0dG9uPjwvZGl2PjwvbGk+PGxpIHJvbGU9XCJwcmVzZW50YXRpb25cIiBuZy1yZXBlYXQ9XCJtYXRjaCBpbiAkbWF0Y2hlc1wiIG5nLWNsYXNzPVwie2FjdGl2ZTogJGlzQWN0aXZlKCRpbmRleCl9XCI+PGEgc3R5bGU9XCJjdXJzb3I6IGRlZmF1bHRcIiByb2xlPVwibWVudWl0ZW1cIiB0YWJpbmRleD1cIi0xXCIgbmctY2xpY2s9XCIkc2VsZWN0KCRpbmRleCwgJGV2ZW50KVwiPjxpIGNsYXNzPVwie3skaWNvbkNoZWNrbWFya319IHB1bGwtcmlnaHRcIiBuZy1pZj1cIiRpc011bHRpcGxlICYmICRpc0FjdGl2ZSgkaW5kZXgpXCI+PC9pPiA8c3BhbiBuZy1iaW5kPVwibWF0Y2gubGFiZWxcIj48L3NwYW4+PC9hPjwvbGk+PC91bD4nKX1dKSxhbmd1bGFyLm1vZHVsZSgnbWdjcmVhLm5nU3RyYXAudGFiJykucnVuKFsnJHRlbXBsYXRlQ2FjaGUnLGZ1bmN0aW9uKHQpe3QucHV0KCd0YWIvdGFiLnRwbC5odG1sJywnPHVsIGNsYXNzPVwibmF2XCIgbmctY2xhc3M9XCIkbmF2Q2xhc3NcIiByb2xlPVwidGFibGlzdFwiPjxsaSByb2xlPVwicHJlc2VudGF0aW9uXCIgbmctcmVwZWF0PVwiJHBhbmUgaW4gJHBhbmVzIHRyYWNrIGJ5ICRpbmRleFwiIG5nLWNsYXNzPVwiWyAkaXNBY3RpdmUoJHBhbmUsICRpbmRleCkgPyAkYWN0aXZlQ2xhc3MgOiBcXCdcXCcsICRwYW5lLmRpc2FibGVkID8gXFwnZGlzYWJsZWRcXCcgOiBcXCdcXCcgXVwiPjxhIHJvbGU9XCJ0YWJcIiBkYXRhLXRvZ2dsZT1cInRhYlwiIG5nLWNsaWNrPVwiISRwYW5lLmRpc2FibGVkICYmICRzZXRBY3RpdmUoJHBhbmUubmFtZSB8fCAkaW5kZXgpXCIgZGF0YS1pbmRleD1cInt7ICRpbmRleCB9fVwiIG5nLWJpbmQtaHRtbD1cIiRwYW5lLnRpdGxlXCIgYXJpYS1jb250cm9scz1cIiRwYW5lLnRpdGxlXCI+PC9hPjwvbGk+PC91bD48ZGl2IG5nLXRyYW5zY2x1ZGUgY2xhc3M9XCJ0YWItY29udGVudFwiPjwvZGl2PicpfV0pLGFuZ3VsYXIubW9kdWxlKCdtZ2NyZWEubmdTdHJhcC50aW1lcGlja2VyJykucnVuKFsnJHRlbXBsYXRlQ2FjaGUnLGZ1bmN0aW9uKHQpe3QucHV0KCd0aW1lcGlja2VyL3RpbWVwaWNrZXIudHBsLmh0bWwnLCc8ZGl2IGNsYXNzPVwiZHJvcGRvd24tbWVudSB0aW1lcGlja2VyXCIgc3R5bGU9XCJtaW4td2lkdGg6IDBweDt3aWR0aDogYXV0b1wiPjx0YWJsZSBoZWlnaHQ9XCIxMDAlXCI+PHRoZWFkPjx0ciBjbGFzcz1cInRleHQtY2VudGVyXCI+PHRoPjxidXR0b24gdGFiaW5kZXg9XCItMVwiIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tZGVmYXVsdCBwdWxsLWxlZnRcIiBuZy1jbGljaz1cIiRhcnJvd0FjdGlvbigtMSwgMClcIj48aSBjbGFzcz1cInt7ICRpY29uVXAgfX1cIj48L2k+PC9idXR0b24+PC90aD48dGg+Jm5ic3A7PC90aD48dGg+PGJ1dHRvbiB0YWJpbmRleD1cIi0xXCIgdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1kZWZhdWx0IHB1bGwtbGVmdFwiIG5nLWNsaWNrPVwiJGFycm93QWN0aW9uKC0xLCAxKVwiPjxpIGNsYXNzPVwie3sgJGljb25VcCB9fVwiPjwvaT48L2J1dHRvbj48L3RoPjx0aD4mbmJzcDs8L3RoPjx0aD48YnV0dG9uIG5nLWlmPVwic2hvd1NlY29uZHNcIiB0YWJpbmRleD1cIi0xXCIgdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1kZWZhdWx0IHB1bGwtbGVmdFwiIG5nLWNsaWNrPVwiJGFycm93QWN0aW9uKC0xLCAyKVwiPjxpIGNsYXNzPVwie3sgJGljb25VcCB9fVwiPjwvaT48L2J1dHRvbj48L3RoPjwvdHI+PC90aGVhZD48dGJvZHk+PHRyIG5nLXJlcGVhdD1cIihpLCByb3cpIGluIHJvd3NcIj48dGQgY2xhc3M9XCJ0ZXh0LWNlbnRlclwiPjxidXR0b24gdGFiaW5kZXg9XCItMVwiIHN0eWxlPVwid2lkdGg6IDEwMCVcIiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLWRlZmF1bHRcIiBuZy1jbGFzcz1cIntcXCdidG4tcHJpbWFyeVxcJzogcm93WzBdLnNlbGVjdGVkfVwiIG5nLWNsaWNrPVwiJHNlbGVjdChyb3dbMF0uZGF0ZSwgMClcIiBuZy1kaXNhYmxlZD1cInJvd1swXS5kaXNhYmxlZFwiPjxzcGFuIG5nLWNsYXNzPVwie1xcJ3RleHQtbXV0ZWRcXCc6IHJvd1swXS5tdXRlZH1cIiBuZy1iaW5kPVwicm93WzBdLmxhYmVsXCI+PC9zcGFuPjwvYnV0dG9uPjwvdGQ+PHRkPjxzcGFuIG5nLWJpbmQ9XCJpID09IG1pZEluZGV4ID8gdGltZVNlcGFyYXRvciA6IFxcJyBcXCdcIj48L3NwYW4+PC90ZD48dGQgY2xhc3M9XCJ0ZXh0LWNlbnRlclwiPjxidXR0b24gdGFiaW5kZXg9XCItMVwiIG5nLWlmPVwicm93WzFdLmRhdGVcIiBzdHlsZT1cIndpZHRoOiAxMDAlXCIgdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1kZWZhdWx0XCIgbmctY2xhc3M9XCJ7XFwnYnRuLXByaW1hcnlcXCc6IHJvd1sxXS5zZWxlY3RlZH1cIiBuZy1jbGljaz1cIiRzZWxlY3Qocm93WzFdLmRhdGUsIDEpXCIgbmctZGlzYWJsZWQ9XCJyb3dbMV0uZGlzYWJsZWRcIj48c3BhbiBuZy1jbGFzcz1cIntcXCd0ZXh0LW11dGVkXFwnOiByb3dbMV0ubXV0ZWR9XCIgbmctYmluZD1cInJvd1sxXS5sYWJlbFwiPjwvc3Bhbj48L2J1dHRvbj48L3RkPjx0ZD48c3BhbiBuZy1iaW5kPVwiaSA9PSBtaWRJbmRleCA/IHRpbWVTZXBhcmF0b3IgOiBcXCcgXFwnXCI+PC9zcGFuPjwvdGQ+PHRkIGNsYXNzPVwidGV4dC1jZW50ZXJcIj48YnV0dG9uIHRhYmluZGV4PVwiLTFcIiBuZy1pZj1cInNob3dTZWNvbmRzICYmIHJvd1syXS5kYXRlXCIgc3R5bGU9XCJ3aWR0aDogMTAwJVwiIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tZGVmYXVsdFwiIG5nLWNsYXNzPVwie1xcJ2J0bi1wcmltYXJ5XFwnOiByb3dbMl0uc2VsZWN0ZWR9XCIgbmctY2xpY2s9XCIkc2VsZWN0KHJvd1syXS5kYXRlLCAyKVwiIG5nLWRpc2FibGVkPVwicm93WzJdLmRpc2FibGVkXCI+PHNwYW4gbmctY2xhc3M9XCJ7XFwndGV4dC1tdXRlZFxcJzogcm93WzJdLm11dGVkfVwiIG5nLWJpbmQ9XCJyb3dbMl0ubGFiZWxcIj48L3NwYW4+PC9idXR0b24+PC90ZD48dGQgbmctaWY9XCJzaG93QU1cIj4mbmJzcDs8L3RkPjx0ZCBuZy1pZj1cInNob3dBTVwiPjxidXR0b24gdGFiaW5kZXg9XCItMVwiIG5nLXNob3c9XCJpID09IG1pZEluZGV4IC0gIWlzQU0gKiAxXCIgc3R5bGU9XCJ3aWR0aDogMTAwJVwiIHR5cGU9XCJidXR0b25cIiBuZy1jbGFzcz1cIntcXCdidG4tcHJpbWFyeVxcJzogISFpc0FNfVwiIGNsYXNzPVwiYnRuIGJ0bi1kZWZhdWx0XCIgbmctY2xpY2s9XCIkc3dpdGNoTWVyaWRpYW4oKVwiIG5nLWRpc2FibGVkPVwiZWwuZGlzYWJsZWRcIj5BTTwvYnV0dG9uPiA8YnV0dG9uIHRhYmluZGV4PVwiLTFcIiBuZy1zaG93PVwiaSA9PSBtaWRJbmRleCArIDEgLSAhaXNBTSAqIDFcIiBzdHlsZT1cIndpZHRoOiAxMDAlXCIgdHlwZT1cImJ1dHRvblwiIG5nLWNsYXNzPVwie1xcJ2J0bi1wcmltYXJ5XFwnOiAhaXNBTX1cIiBjbGFzcz1cImJ0biBidG4tZGVmYXVsdFwiIG5nLWNsaWNrPVwiJHN3aXRjaE1lcmlkaWFuKClcIiBuZy1kaXNhYmxlZD1cImVsLmRpc2FibGVkXCI+UE08L2J1dHRvbj48L3RkPjwvdHI+PC90Ym9keT48dGZvb3Q+PHRyIGNsYXNzPVwidGV4dC1jZW50ZXJcIj48dGg+PGJ1dHRvbiB0YWJpbmRleD1cIi0xXCIgdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1kZWZhdWx0IHB1bGwtbGVmdFwiIG5nLWNsaWNrPVwiJGFycm93QWN0aW9uKDEsIDApXCI+PGkgY2xhc3M9XCJ7eyAkaWNvbkRvd24gfX1cIj48L2k+PC9idXR0b24+PC90aD48dGg+Jm5ic3A7PC90aD48dGg+PGJ1dHRvbiB0YWJpbmRleD1cIi0xXCIgdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1kZWZhdWx0IHB1bGwtbGVmdFwiIG5nLWNsaWNrPVwiJGFycm93QWN0aW9uKDEsIDEpXCI+PGkgY2xhc3M9XCJ7eyAkaWNvbkRvd24gfX1cIj48L2k+PC9idXR0b24+PC90aD48dGg+Jm5ic3A7PC90aD48dGg+PGJ1dHRvbiBuZy1pZj1cInNob3dTZWNvbmRzXCIgdGFiaW5kZXg9XCItMVwiIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tZGVmYXVsdCBwdWxsLWxlZnRcIiBuZy1jbGljaz1cIiRhcnJvd0FjdGlvbigxLCAyKVwiPjxpIGNsYXNzPVwie3sgJGljb25Eb3duIH19XCI+PC9pPjwvYnV0dG9uPjwvdGg+PC90cj48L3Rmb290PjwvdGFibGU+PC9kaXY+Jyl9XSksYW5ndWxhci5tb2R1bGUoJ21nY3JlYS5uZ1N0cmFwLnRvb2x0aXAnKS5ydW4oWyckdGVtcGxhdGVDYWNoZScsZnVuY3Rpb24odCl7dC5wdXQoJ3Rvb2x0aXAvdG9vbHRpcC50cGwuaHRtbCcsJzxkaXYgY2xhc3M9XCJ0b29sdGlwIGluXCIgbmctc2hvdz1cInRpdGxlXCI+PGRpdiBjbGFzcz1cInRvb2x0aXAtYXJyb3dcIj48L2Rpdj48ZGl2IGNsYXNzPVwidG9vbHRpcC1pbm5lclwiIG5nLWJpbmQ9XCJ0aXRsZVwiPjwvZGl2PjwvZGl2PicpfV0pLGFuZ3VsYXIubW9kdWxlKCdtZ2NyZWEubmdTdHJhcC50eXBlYWhlYWQnKS5ydW4oWyckdGVtcGxhdGVDYWNoZScsZnVuY3Rpb24odCl7dC5wdXQoJ3R5cGVhaGVhZC90eXBlYWhlYWQudHBsLmh0bWwnLCc8dWwgdGFiaW5kZXg9XCItMVwiIGNsYXNzPVwidHlwZWFoZWFkIGRyb3Bkb3duLW1lbnVcIiBuZy1zaG93PVwiJGlzVmlzaWJsZSgpXCIgcm9sZT1cInNlbGVjdFwiPjxsaSByb2xlPVwicHJlc2VudGF0aW9uXCIgbmctcmVwZWF0PVwibWF0Y2ggaW4gJG1hdGNoZXNcIiBuZy1jbGFzcz1cInthY3RpdmU6ICRpbmRleCA9PSAkYWN0aXZlSW5kZXh9XCI+PGEgcm9sZT1cIm1lbnVpdGVtXCIgdGFiaW5kZXg9XCItMVwiIG5nLWNsaWNrPVwiJHNlbGVjdCgkaW5kZXgsICRldmVudClcIiBuZy1iaW5kPVwibWF0Y2gubGFiZWxcIj48L2E+PC9saT48L3VsPicpfV0pfSh3aW5kb3csZG9jdW1lbnQpO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9ib3dlcl9jb21wb25lbnRzL2FuZ3VsYXItc3RyYXAvZGlzdC9hbmd1bGFyLXN0cmFwLnRwbC5taW4uanNcbiAqKiBtb2R1bGUgaWQgPSA1MlxuICoqIG1vZHVsZSBjaHVua3MgPSAyNFxuICoqLyJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");

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

	eval("'use strict';\n\n/**\n * A directive for adding google places autocomplete to a text box\n * google places autocomplete info: https://developers.google.com/maps/documentation/javascript/places\n *\n * Usage:\n *\n * <input type=\"text\"  ng-autocomplete ng-model=\"autocomplete\" options=\"options\" details=\"details/>\n *\n * + ng-model - autocomplete textbox value\n *\n * + details - more detailed autocomplete result, includes address parts, latlng, etc. (Optional)\n *\n * + options - configuration for the autocomplete (Optional)\n *\n *       + types: type,        String, values can be 'geocode', 'establishment', '(regions)', or '(cities)'\n *       + bounds: bounds,     Google maps LatLngBounds Object, biases results to bounds, but may return results outside these bounds\n *       + country: country    String, ISO 3166-1 Alpha-2 compatible country code. examples; 'ca', 'us', 'gb'\n *       + watchEnter:         Boolean, true; on Enter select top autocomplete result. false(default); enter ends autocomplete\n *\n * example:\n *\n *    options = {\n *        types: '(cities)',\n *        country: 'ca'\n *    }\n**/\n\nangular.module( \"ngAutocomplete\", [])\n  .directive('ngAutocomplete', function() {\n    return {\n      require: 'ngModel',\n      scope: {\n        ngModel: '=',\n        options: '=?',\n        details: '=?'\n      },\n\n      link: function(scope, element, attrs, controller) {\n\n        //options for autocomplete\n        var opts\n        var watchEnter = false\n        //convert options provided to opts\n        var initOpts = function() {\n\n          opts = {}\n          if (scope.options) {\n\n            if (scope.options.watchEnter !== true) {\n              watchEnter = false\n            } else {\n              watchEnter = true\n            }\n\n            if (scope.options.types) {\n              opts.types = []\n              opts.types.push(scope.options.types)\n              scope.gPlace.setTypes(opts.types)\n            } else {\n              scope.gPlace.setTypes([])\n            }\n\n            if (scope.options.bounds) {\n              opts.bounds = scope.options.bounds\n              scope.gPlace.setBounds(opts.bounds)\n            } else {\n              scope.gPlace.setBounds(null)\n            }\n\n            if (scope.options.country) {\n              opts.componentRestrictions = {\n                country: scope.options.country\n              }\n              scope.gPlace.setComponentRestrictions(opts.componentRestrictions)\n            } else {\n              scope.gPlace.setComponentRestrictions(null)\n            }\n          }\n        }\n\n        if (scope.gPlace == undefined) {\n          scope.gPlace = new google.maps.places.Autocomplete(element[0], {});\n        }\n        google.maps.event.addListener(scope.gPlace, 'place_changed', function() {\n          var result = scope.gPlace.getPlace();\n          if (result !== undefined) {\n            if (result.address_components !== undefined) {\n\n              scope.$apply(function() {\n\n                scope.details = result;\n\n                controller.$setViewValue(element.val());\n              });\n            }\n            else {\n              if (watchEnter) {\n                getPlace(result)\n              }\n            }\n          }\n        })\n\n        //function to get retrieve the autocompletes first result using the AutocompleteService \n        var getPlace = function(result) {\n          var autocompleteService = new google.maps.places.AutocompleteService();\n          if (result.name.length > 0){\n            autocompleteService.getPlacePredictions(\n              {\n                input: result.name,\n                offset: result.name.length\n              },\n              function listentoresult(list, status) {\n                if(list == null || list.length == 0) {\n\n                  scope.$apply(function() {\n                    scope.details = null;\n                  });\n\n                } else {\n                  var placesService = new google.maps.places.PlacesService(element[0]);\n                  placesService.getDetails(\n                    {'reference': list[0].reference},\n                    function detailsresult(detailsResult, placesServiceStatus) {\n\n                      if (placesServiceStatus == google.maps.GeocoderStatus.OK) {\n                        scope.$apply(function() {\n\n                          controller.$setViewValue(detailsResult.formatted_address);\n                          element.val(detailsResult.formatted_address);\n\n                          scope.details = detailsResult;\n\n                          //on focusout the value reverts, need to set it again.\n                          var watchFocusOut = element.on('focusout', function(event) {\n                            element.val(detailsResult.formatted_address);\n                            element.unbind('focusout')\n                          })\n\n                        });\n                      }\n                    }\n                  );\n                }\n              });\n          }\n        }\n\n        controller.$render = function () {\n          var location = controller.$viewValue;\n          element.val(location);\n        };\n\n        //watch options provided to directive\n        scope.watchOptions = function () {\n          return scope.options\n        };\n        scope.$watch(scope.watchOptions, function () {\n          initOpts()\n        }, true);\n\n      }\n    };\n  });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ib3dlcl9jb21wb25lbnRzL25nQXV0b2NvbXBsZXRlL3NyYy9uZ0F1dG9jb21wbGV0ZS5qcz9lODk2Il0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcblxuLyoqXG4gKiBBIGRpcmVjdGl2ZSBmb3IgYWRkaW5nIGdvb2dsZSBwbGFjZXMgYXV0b2NvbXBsZXRlIHRvIGEgdGV4dCBib3hcbiAqIGdvb2dsZSBwbGFjZXMgYXV0b2NvbXBsZXRlIGluZm86IGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL21hcHMvZG9jdW1lbnRhdGlvbi9qYXZhc2NyaXB0L3BsYWNlc1xuICpcbiAqIFVzYWdlOlxuICpcbiAqIDxpbnB1dCB0eXBlPVwidGV4dFwiICBuZy1hdXRvY29tcGxldGUgbmctbW9kZWw9XCJhdXRvY29tcGxldGVcIiBvcHRpb25zPVwib3B0aW9uc1wiIGRldGFpbHM9XCJkZXRhaWxzLz5cbiAqXG4gKiArIG5nLW1vZGVsIC0gYXV0b2NvbXBsZXRlIHRleHRib3ggdmFsdWVcbiAqXG4gKiArIGRldGFpbHMgLSBtb3JlIGRldGFpbGVkIGF1dG9jb21wbGV0ZSByZXN1bHQsIGluY2x1ZGVzIGFkZHJlc3MgcGFydHMsIGxhdGxuZywgZXRjLiAoT3B0aW9uYWwpXG4gKlxuICogKyBvcHRpb25zIC0gY29uZmlndXJhdGlvbiBmb3IgdGhlIGF1dG9jb21wbGV0ZSAoT3B0aW9uYWwpXG4gKlxuICogICAgICAgKyB0eXBlczogdHlwZSwgICAgICAgIFN0cmluZywgdmFsdWVzIGNhbiBiZSAnZ2VvY29kZScsICdlc3RhYmxpc2htZW50JywgJyhyZWdpb25zKScsIG9yICcoY2l0aWVzKSdcbiAqICAgICAgICsgYm91bmRzOiBib3VuZHMsICAgICBHb29nbGUgbWFwcyBMYXRMbmdCb3VuZHMgT2JqZWN0LCBiaWFzZXMgcmVzdWx0cyB0byBib3VuZHMsIGJ1dCBtYXkgcmV0dXJuIHJlc3VsdHMgb3V0c2lkZSB0aGVzZSBib3VuZHNcbiAqICAgICAgICsgY291bnRyeTogY291bnRyeSAgICBTdHJpbmcsIElTTyAzMTY2LTEgQWxwaGEtMiBjb21wYXRpYmxlIGNvdW50cnkgY29kZS4gZXhhbXBsZXM7ICdjYScsICd1cycsICdnYidcbiAqICAgICAgICsgd2F0Y2hFbnRlcjogICAgICAgICBCb29sZWFuLCB0cnVlOyBvbiBFbnRlciBzZWxlY3QgdG9wIGF1dG9jb21wbGV0ZSByZXN1bHQuIGZhbHNlKGRlZmF1bHQpOyBlbnRlciBlbmRzIGF1dG9jb21wbGV0ZVxuICpcbiAqIGV4YW1wbGU6XG4gKlxuICogICAgb3B0aW9ucyA9IHtcbiAqICAgICAgICB0eXBlczogJyhjaXRpZXMpJyxcbiAqICAgICAgICBjb3VudHJ5OiAnY2EnXG4gKiAgICB9XG4qKi9cblxuYW5ndWxhci5tb2R1bGUoIFwibmdBdXRvY29tcGxldGVcIiwgW10pXG4gIC5kaXJlY3RpdmUoJ25nQXV0b2NvbXBsZXRlJywgZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHJlcXVpcmU6ICduZ01vZGVsJyxcbiAgICAgIHNjb3BlOiB7XG4gICAgICAgIG5nTW9kZWw6ICc9JyxcbiAgICAgICAgb3B0aW9uczogJz0/JyxcbiAgICAgICAgZGV0YWlsczogJz0/J1xuICAgICAgfSxcblxuICAgICAgbGluazogZnVuY3Rpb24oc2NvcGUsIGVsZW1lbnQsIGF0dHJzLCBjb250cm9sbGVyKSB7XG5cbiAgICAgICAgLy9vcHRpb25zIGZvciBhdXRvY29tcGxldGVcbiAgICAgICAgdmFyIG9wdHNcbiAgICAgICAgdmFyIHdhdGNoRW50ZXIgPSBmYWxzZVxuICAgICAgICAvL2NvbnZlcnQgb3B0aW9ucyBwcm92aWRlZCB0byBvcHRzXG4gICAgICAgIHZhciBpbml0T3B0cyA9IGZ1bmN0aW9uKCkge1xuXG4gICAgICAgICAgb3B0cyA9IHt9XG4gICAgICAgICAgaWYgKHNjb3BlLm9wdGlvbnMpIHtcblxuICAgICAgICAgICAgaWYgKHNjb3BlLm9wdGlvbnMud2F0Y2hFbnRlciAhPT0gdHJ1ZSkge1xuICAgICAgICAgICAgICB3YXRjaEVudGVyID0gZmFsc2VcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHdhdGNoRW50ZXIgPSB0cnVlXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChzY29wZS5vcHRpb25zLnR5cGVzKSB7XG4gICAgICAgICAgICAgIG9wdHMudHlwZXMgPSBbXVxuICAgICAgICAgICAgICBvcHRzLnR5cGVzLnB1c2goc2NvcGUub3B0aW9ucy50eXBlcylcbiAgICAgICAgICAgICAgc2NvcGUuZ1BsYWNlLnNldFR5cGVzKG9wdHMudHlwZXMpXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBzY29wZS5nUGxhY2Uuc2V0VHlwZXMoW10pXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChzY29wZS5vcHRpb25zLmJvdW5kcykge1xuICAgICAgICAgICAgICBvcHRzLmJvdW5kcyA9IHNjb3BlLm9wdGlvbnMuYm91bmRzXG4gICAgICAgICAgICAgIHNjb3BlLmdQbGFjZS5zZXRCb3VuZHMob3B0cy5ib3VuZHMpXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBzY29wZS5nUGxhY2Uuc2V0Qm91bmRzKG51bGwpXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChzY29wZS5vcHRpb25zLmNvdW50cnkpIHtcbiAgICAgICAgICAgICAgb3B0cy5jb21wb25lbnRSZXN0cmljdGlvbnMgPSB7XG4gICAgICAgICAgICAgICAgY291bnRyeTogc2NvcGUub3B0aW9ucy5jb3VudHJ5XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgc2NvcGUuZ1BsYWNlLnNldENvbXBvbmVudFJlc3RyaWN0aW9ucyhvcHRzLmNvbXBvbmVudFJlc3RyaWN0aW9ucylcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHNjb3BlLmdQbGFjZS5zZXRDb21wb25lbnRSZXN0cmljdGlvbnMobnVsbClcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoc2NvcGUuZ1BsYWNlID09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHNjb3BlLmdQbGFjZSA9IG5ldyBnb29nbGUubWFwcy5wbGFjZXMuQXV0b2NvbXBsZXRlKGVsZW1lbnRbMF0sIHt9KTtcbiAgICAgICAgfVxuICAgICAgICBnb29nbGUubWFwcy5ldmVudC5hZGRMaXN0ZW5lcihzY29wZS5nUGxhY2UsICdwbGFjZV9jaGFuZ2VkJywgZnVuY3Rpb24oKSB7XG4gICAgICAgICAgdmFyIHJlc3VsdCA9IHNjb3BlLmdQbGFjZS5nZXRQbGFjZSgpO1xuICAgICAgICAgIGlmIChyZXN1bHQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgaWYgKHJlc3VsdC5hZGRyZXNzX2NvbXBvbmVudHMgIT09IHVuZGVmaW5lZCkge1xuXG4gICAgICAgICAgICAgIHNjb3BlLiRhcHBseShmdW5jdGlvbigpIHtcblxuICAgICAgICAgICAgICAgIHNjb3BlLmRldGFpbHMgPSByZXN1bHQ7XG5cbiAgICAgICAgICAgICAgICBjb250cm9sbGVyLiRzZXRWaWV3VmFsdWUoZWxlbWVudC52YWwoKSk7XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgIGlmICh3YXRjaEVudGVyKSB7XG4gICAgICAgICAgICAgICAgZ2V0UGxhY2UocmVzdWx0KVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9KVxuXG4gICAgICAgIC8vZnVuY3Rpb24gdG8gZ2V0IHJldHJpZXZlIHRoZSBhdXRvY29tcGxldGVzIGZpcnN0IHJlc3VsdCB1c2luZyB0aGUgQXV0b2NvbXBsZXRlU2VydmljZSBcbiAgICAgICAgdmFyIGdldFBsYWNlID0gZnVuY3Rpb24ocmVzdWx0KSB7XG4gICAgICAgICAgdmFyIGF1dG9jb21wbGV0ZVNlcnZpY2UgPSBuZXcgZ29vZ2xlLm1hcHMucGxhY2VzLkF1dG9jb21wbGV0ZVNlcnZpY2UoKTtcbiAgICAgICAgICBpZiAocmVzdWx0Lm5hbWUubGVuZ3RoID4gMCl7XG4gICAgICAgICAgICBhdXRvY29tcGxldGVTZXJ2aWNlLmdldFBsYWNlUHJlZGljdGlvbnMoXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBpbnB1dDogcmVzdWx0Lm5hbWUsXG4gICAgICAgICAgICAgICAgb2Zmc2V0OiByZXN1bHQubmFtZS5sZW5ndGhcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgZnVuY3Rpb24gbGlzdGVudG9yZXN1bHQobGlzdCwgc3RhdHVzKSB7XG4gICAgICAgICAgICAgICAgaWYobGlzdCA9PSBudWxsIHx8IGxpc3QubGVuZ3RoID09IDApIHtcblxuICAgICAgICAgICAgICAgICAgc2NvcGUuJGFwcGx5KGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICBzY29wZS5kZXRhaWxzID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIHZhciBwbGFjZXNTZXJ2aWNlID0gbmV3IGdvb2dsZS5tYXBzLnBsYWNlcy5QbGFjZXNTZXJ2aWNlKGVsZW1lbnRbMF0pO1xuICAgICAgICAgICAgICAgICAgcGxhY2VzU2VydmljZS5nZXREZXRhaWxzKFxuICAgICAgICAgICAgICAgICAgICB7J3JlZmVyZW5jZSc6IGxpc3RbMF0ucmVmZXJlbmNlfSxcbiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gZGV0YWlsc3Jlc3VsdChkZXRhaWxzUmVzdWx0LCBwbGFjZXNTZXJ2aWNlU3RhdHVzKSB7XG5cbiAgICAgICAgICAgICAgICAgICAgICBpZiAocGxhY2VzU2VydmljZVN0YXR1cyA9PSBnb29nbGUubWFwcy5HZW9jb2RlclN0YXR1cy5PSykge1xuICAgICAgICAgICAgICAgICAgICAgICAgc2NvcGUuJGFwcGx5KGZ1bmN0aW9uKCkge1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIuJHNldFZpZXdWYWx1ZShkZXRhaWxzUmVzdWx0LmZvcm1hdHRlZF9hZGRyZXNzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudC52YWwoZGV0YWlsc1Jlc3VsdC5mb3JtYXR0ZWRfYWRkcmVzcyk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgc2NvcGUuZGV0YWlscyA9IGRldGFpbHNSZXN1bHQ7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy9vbiBmb2N1c291dCB0aGUgdmFsdWUgcmV2ZXJ0cywgbmVlZCB0byBzZXQgaXQgYWdhaW4uXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB3YXRjaEZvY3VzT3V0ID0gZWxlbWVudC5vbignZm9jdXNvdXQnLCBmdW5jdGlvbihldmVudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQudmFsKGRldGFpbHNSZXN1bHQuZm9ybWF0dGVkX2FkZHJlc3MpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQudW5iaW5kKCdmb2N1c291dCcpXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH0pXG5cbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnRyb2xsZXIuJHJlbmRlciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICB2YXIgbG9jYXRpb24gPSBjb250cm9sbGVyLiR2aWV3VmFsdWU7XG4gICAgICAgICAgZWxlbWVudC52YWwobG9jYXRpb24pO1xuICAgICAgICB9O1xuXG4gICAgICAgIC8vd2F0Y2ggb3B0aW9ucyBwcm92aWRlZCB0byBkaXJlY3RpdmVcbiAgICAgICAgc2NvcGUud2F0Y2hPcHRpb25zID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHJldHVybiBzY29wZS5vcHRpb25zXG4gICAgICAgIH07XG4gICAgICAgIHNjb3BlLiR3YXRjaChzY29wZS53YXRjaE9wdGlvbnMsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBpbml0T3B0cygpXG4gICAgICAgIH0sIHRydWUpO1xuXG4gICAgICB9XG4gICAgfTtcbiAgfSk7XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL2Jvd2VyX2NvbXBvbmVudHMvbmdBdXRvY29tcGxldGUvc3JjL25nQXV0b2NvbXBsZXRlLmpzXG4gKiogbW9kdWxlIGlkID0gNTNcbiAqKiBtb2R1bGUgY2h1bmtzID0gMjRcbiAqKi8iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");

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

	eval("(function(root) {\n\t'use strict';\n\tvar angular = root.angular;\n\t\n\treturn angular\n\t\t.module('angular-uri', [])\n\t\t.factory('URI', function(){\n\t\t\treturn root.URI;\n\t\t});\n})(window);\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTQuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ib3dlcl9jb21wb25lbnRzL2FuZ3VsYXItdXJpL2FuZ3VsYXItdXJpLmpzPzVmODMiXSwic291cmNlc0NvbnRlbnQiOlsiKGZ1bmN0aW9uKHJvb3QpIHtcblx0J3VzZSBzdHJpY3QnO1xuXHR2YXIgYW5ndWxhciA9IHJvb3QuYW5ndWxhcjtcblx0XG5cdHJldHVybiBhbmd1bGFyXG5cdFx0Lm1vZHVsZSgnYW5ndWxhci11cmknLCBbXSlcblx0XHQuZmFjdG9yeSgnVVJJJywgZnVuY3Rpb24oKXtcblx0XHRcdHJldHVybiByb290LlVSSTtcblx0XHR9KTtcbn0pKHdpbmRvdyk7XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL2Jvd2VyX2NvbXBvbmVudHMvYW5ndWxhci11cmkvYW5ndWxhci11cmkuanNcbiAqKiBtb2R1bGUgaWQgPSA1NFxuICoqIG1vZHVsZSBjaHVua3MgPSAyNFxuICoqLyJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=");

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

	eval("/**\n * angular-recaptcha build:2016-02-08 \n * https://github.com/vividcortex/angular-recaptcha \n * Copyright (c) 2016 VividCortex \n**/\n\n!function(a){\"use strict\";a.module(\"vcRecaptcha\",[])}(angular),function(a){\"use strict\";var b=a.module(\"vcRecaptcha\");b.service(\"vcRecaptchaService\",[\"$window\",\"$q\",function(b,c){function d(){return f?c.when(f):h}function e(){if(!f)throw new Error(\"reCaptcha has not been loaded yet.\")}var f,g=c.defer(),h=g.promise;b.vcRecaptchaApiLoadedCallback=b.vcRecaptchaApiLoadedCallback||[];var i=function(){f=b.grecaptcha,g.resolve(f)};return b.vcRecaptchaApiLoadedCallback.push(i),b.vcRecaptchaApiLoaded=function(){b.vcRecaptchaApiLoadedCallback.forEach(function(a){a()})},a.isDefined(b.grecaptcha)&&i(),{create:function(a,b,c,e){return e.callback=c,e.sitekey=b,d().then(function(b){return b.render(a,e)})},reload:function(a){e(),f.reset(a)},getResponse:function(a){return e(),f.getResponse(a)}}}])}(angular),function(a){\"use strict\";function b(){throw new Error('You need to set the \"key\" attribute to your public reCaptcha key. If you don\\'t have a key, please get one from https://www.google.com/recaptcha/admin/create')}var c=a.module(\"vcRecaptcha\");c.directive(\"vcRecaptcha\",[\"$document\",\"$timeout\",\"vcRecaptchaService\",function(a,c,d){return{restrict:\"A\",require:\"?^^form\",scope:{response:\"=?ngModel\",key:\"=\",stoken:\"=?\",theme:\"=?\",size:\"=?\",type:\"=?\",tabindex:\"=?\",required:\"=?\",onCreate:\"&\",onSuccess:\"&\",onExpire:\"&\"},link:function(e,f,g,h){function i(){h&&h.$setValidity(\"recaptcha\",null),l()}function j(){e.response=\"\",k(),e.onExpire({widgetId:e.widgetId})}function k(){h&&h.$setValidity(\"recaptcha\",e.required===!1?null:Boolean(e.response))}function l(){angular.element(a[0].querySelectorAll(\".pls-container\")).parent().remove()}g.hasOwnProperty(\"key\")||b(),e.widgetId=null,h&&angular.isDefined(g.required)&&e.$watch(\"required\",k);var m=e.$watch(\"key\",function(a){if(a){40!==a.length&&b();var h=function(a){c(function(){e.response=a,k(),e.onSuccess({response:a,widgetId:e.widgetId})})};d.create(f[0],a,h,{stoken:e.stoken||g.stoken||null,theme:e.theme||g.theme||null,type:e.type||g.type||null,tabindex:e.tabindex||g.tabindex||null,size:e.size||g.size||null,\"expired-callback\":j}).then(function(a){k(),e.widgetId=a,e.onCreate({widgetId:a}),e.$on(\"$destroy\",i)}),m()}})}}}])}(angular);\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTUuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ib3dlcl9jb21wb25lbnRzL2FuZ3VsYXItcmVjYXB0Y2hhL3JlbGVhc2UvYW5ndWxhci1yZWNhcHRjaGEubWluLmpzP2E1YmQiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBhbmd1bGFyLXJlY2FwdGNoYSBidWlsZDoyMDE2LTAyLTA4IFxuICogaHR0cHM6Ly9naXRodWIuY29tL3ZpdmlkY29ydGV4L2FuZ3VsYXItcmVjYXB0Y2hhIFxuICogQ29weXJpZ2h0IChjKSAyMDE2IFZpdmlkQ29ydGV4IFxuKiovXG5cbiFmdW5jdGlvbihhKXtcInVzZSBzdHJpY3RcIjthLm1vZHVsZShcInZjUmVjYXB0Y2hhXCIsW10pfShhbmd1bGFyKSxmdW5jdGlvbihhKXtcInVzZSBzdHJpY3RcIjt2YXIgYj1hLm1vZHVsZShcInZjUmVjYXB0Y2hhXCIpO2Iuc2VydmljZShcInZjUmVjYXB0Y2hhU2VydmljZVwiLFtcIiR3aW5kb3dcIixcIiRxXCIsZnVuY3Rpb24oYixjKXtmdW5jdGlvbiBkKCl7cmV0dXJuIGY/Yy53aGVuKGYpOmh9ZnVuY3Rpb24gZSgpe2lmKCFmKXRocm93IG5ldyBFcnJvcihcInJlQ2FwdGNoYSBoYXMgbm90IGJlZW4gbG9hZGVkIHlldC5cIil9dmFyIGYsZz1jLmRlZmVyKCksaD1nLnByb21pc2U7Yi52Y1JlY2FwdGNoYUFwaUxvYWRlZENhbGxiYWNrPWIudmNSZWNhcHRjaGFBcGlMb2FkZWRDYWxsYmFja3x8W107dmFyIGk9ZnVuY3Rpb24oKXtmPWIuZ3JlY2FwdGNoYSxnLnJlc29sdmUoZil9O3JldHVybiBiLnZjUmVjYXB0Y2hhQXBpTG9hZGVkQ2FsbGJhY2sucHVzaChpKSxiLnZjUmVjYXB0Y2hhQXBpTG9hZGVkPWZ1bmN0aW9uKCl7Yi52Y1JlY2FwdGNoYUFwaUxvYWRlZENhbGxiYWNrLmZvckVhY2goZnVuY3Rpb24oYSl7YSgpfSl9LGEuaXNEZWZpbmVkKGIuZ3JlY2FwdGNoYSkmJmkoKSx7Y3JlYXRlOmZ1bmN0aW9uKGEsYixjLGUpe3JldHVybiBlLmNhbGxiYWNrPWMsZS5zaXRla2V5PWIsZCgpLnRoZW4oZnVuY3Rpb24oYil7cmV0dXJuIGIucmVuZGVyKGEsZSl9KX0scmVsb2FkOmZ1bmN0aW9uKGEpe2UoKSxmLnJlc2V0KGEpfSxnZXRSZXNwb25zZTpmdW5jdGlvbihhKXtyZXR1cm4gZSgpLGYuZ2V0UmVzcG9uc2UoYSl9fX1dKX0oYW5ndWxhciksZnVuY3Rpb24oYSl7XCJ1c2Ugc3RyaWN0XCI7ZnVuY3Rpb24gYigpe3Rocm93IG5ldyBFcnJvcignWW91IG5lZWQgdG8gc2V0IHRoZSBcImtleVwiIGF0dHJpYnV0ZSB0byB5b3VyIHB1YmxpYyByZUNhcHRjaGEga2V5LiBJZiB5b3UgZG9uXFwndCBoYXZlIGEga2V5LCBwbGVhc2UgZ2V0IG9uZSBmcm9tIGh0dHBzOi8vd3d3Lmdvb2dsZS5jb20vcmVjYXB0Y2hhL2FkbWluL2NyZWF0ZScpfXZhciBjPWEubW9kdWxlKFwidmNSZWNhcHRjaGFcIik7Yy5kaXJlY3RpdmUoXCJ2Y1JlY2FwdGNoYVwiLFtcIiRkb2N1bWVudFwiLFwiJHRpbWVvdXRcIixcInZjUmVjYXB0Y2hhU2VydmljZVwiLGZ1bmN0aW9uKGEsYyxkKXtyZXR1cm57cmVzdHJpY3Q6XCJBXCIscmVxdWlyZTpcIj9eXmZvcm1cIixzY29wZTp7cmVzcG9uc2U6XCI9P25nTW9kZWxcIixrZXk6XCI9XCIsc3Rva2VuOlwiPT9cIix0aGVtZTpcIj0/XCIsc2l6ZTpcIj0/XCIsdHlwZTpcIj0/XCIsdGFiaW5kZXg6XCI9P1wiLHJlcXVpcmVkOlwiPT9cIixvbkNyZWF0ZTpcIiZcIixvblN1Y2Nlc3M6XCImXCIsb25FeHBpcmU6XCImXCJ9LGxpbms6ZnVuY3Rpb24oZSxmLGcsaCl7ZnVuY3Rpb24gaSgpe2gmJmguJHNldFZhbGlkaXR5KFwicmVjYXB0Y2hhXCIsbnVsbCksbCgpfWZ1bmN0aW9uIGooKXtlLnJlc3BvbnNlPVwiXCIsaygpLGUub25FeHBpcmUoe3dpZGdldElkOmUud2lkZ2V0SWR9KX1mdW5jdGlvbiBrKCl7aCYmaC4kc2V0VmFsaWRpdHkoXCJyZWNhcHRjaGFcIixlLnJlcXVpcmVkPT09ITE/bnVsbDpCb29sZWFuKGUucmVzcG9uc2UpKX1mdW5jdGlvbiBsKCl7YW5ndWxhci5lbGVtZW50KGFbMF0ucXVlcnlTZWxlY3RvckFsbChcIi5wbHMtY29udGFpbmVyXCIpKS5wYXJlbnQoKS5yZW1vdmUoKX1nLmhhc093blByb3BlcnR5KFwia2V5XCIpfHxiKCksZS53aWRnZXRJZD1udWxsLGgmJmFuZ3VsYXIuaXNEZWZpbmVkKGcucmVxdWlyZWQpJiZlLiR3YXRjaChcInJlcXVpcmVkXCIsayk7dmFyIG09ZS4kd2F0Y2goXCJrZXlcIixmdW5jdGlvbihhKXtpZihhKXs0MCE9PWEubGVuZ3RoJiZiKCk7dmFyIGg9ZnVuY3Rpb24oYSl7YyhmdW5jdGlvbigpe2UucmVzcG9uc2U9YSxrKCksZS5vblN1Y2Nlc3Moe3Jlc3BvbnNlOmEsd2lkZ2V0SWQ6ZS53aWRnZXRJZH0pfSl9O2QuY3JlYXRlKGZbMF0sYSxoLHtzdG9rZW46ZS5zdG9rZW58fGcuc3Rva2VufHxudWxsLHRoZW1lOmUudGhlbWV8fGcudGhlbWV8fG51bGwsdHlwZTplLnR5cGV8fGcudHlwZXx8bnVsbCx0YWJpbmRleDplLnRhYmluZGV4fHxnLnRhYmluZGV4fHxudWxsLHNpemU6ZS5zaXplfHxnLnNpemV8fG51bGwsXCJleHBpcmVkLWNhbGxiYWNrXCI6an0pLnRoZW4oZnVuY3Rpb24oYSl7aygpLGUud2lkZ2V0SWQ9YSxlLm9uQ3JlYXRlKHt3aWRnZXRJZDphfSksZS4kb24oXCIkZGVzdHJveVwiLGkpfSksbSgpfX0pfX19XSl9KGFuZ3VsYXIpO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9ib3dlcl9jb21wb25lbnRzL2FuZ3VsYXItcmVjYXB0Y2hhL3JlbGVhc2UvYW5ndWxhci1yZWNhcHRjaGEubWluLmpzXG4gKiogbW9kdWxlIGlkID0gNTVcbiAqKiBtb2R1bGUgY2h1bmtzID0gMjRcbiAqKi8iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");

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

	eval("/**\n * @license Angulartics v0.19.2\n * (c) 2013 Luis Farzati http://luisfarzati.github.io/angulartics\n * License: MIT\n */\n(function(angular, analytics) {\n'use strict';\n\nvar angulartics = window.angulartics || (window.angulartics = {});\nangulartics.waitForVendorCount = 0;\nangulartics.waitForVendorApi = function (objectName, delay, containsField, registerFn, onTimeout) {\n  if (!onTimeout) { angulartics.waitForVendorCount++; }\n  if (!registerFn) { registerFn = containsField; containsField = undefined; }\n  if (!Object.prototype.hasOwnProperty.call(window, objectName) || (containsField !== undefined && window[objectName][containsField] === undefined)) {\n    setTimeout(function () { angulartics.waitForVendorApi(objectName, delay, containsField, registerFn, true); }, delay);\n  }\n  else {\n    angulartics.waitForVendorCount--;\n    registerFn(window[objectName]);\n  }\n};\n\n/**\n * @ngdoc overview\n * @name angulartics\n */\nangular.module('angulartics', [])\n.provider('$analytics', function () {\n  var settings = {\n    pageTracking: {\n      autoTrackFirstPage: true,\n      autoTrackVirtualPages: true,\n      trackRelativePath: false,\n      autoBasePath: false,\n      basePath: ''\n    },\n    eventTracking: {},\n    bufferFlushDelay: 1000, // Support only one configuration for buffer flush delay to simplify buffering\n    developerMode: false // Prevent sending data in local/development environment\n  };\n\n  // List of known handlers that plugins can register themselves for\n  var knownHandlers = [\n    'pageTrack',\n    'eventTrack',\n    'setAlias',\n    'setUsername',\n    'setUserProperties',\n    'setUserPropertiesOnce',\n    'setSuperProperties',\n    'setSuperPropertiesOnce'\n  ];\n  // Cache and handler properties will match values in 'knownHandlers' as the buffering functons are installed.\n  var cache = {};\n  var handlers = {};\n\n  // General buffering handler\n  var bufferedHandler = function(handlerName){\n    return function(){\n      if(angulartics.waitForVendorCount){\n        if(!cache[handlerName]){ cache[handlerName] = []; }\n        cache[handlerName].push(arguments);\n      }\n    };\n  };\n\n  // As handlers are installed by plugins, they get pushed into a list and invoked in order.\n  var updateHandlers = function(handlerName, fn){\n    if(!handlers[handlerName]){\n      handlers[handlerName] = [];\n    }\n    handlers[handlerName].push(fn);\n    return function(){\n      var handlerArgs = arguments;\n      angular.forEach(handlers[handlerName], function(handler){\n        handler.apply(this, handlerArgs);\n      }, this);\n    };\n  };\n\n  // The api (returned by this provider) gets populated with handlers below.\n  var api = {\n    settings: settings\n  };\n\n  // Will run setTimeout if delay is > 0\n  // Runs immediately if no delay to make sure cache/buffer is flushed before anything else.\n  // Plugins should take care to register handlers by order of precedence.\n  var onTimeout = function(fn, delay){\n    if(delay){\n      setTimeout(fn, delay);\n    } else {\n      fn();\n    }\n  };\n\n  var provider = {\n    $get: function($injector) {\n      return apiWithInjector($injector);\n    },\n    api: api,\n    settings: settings,\n    virtualPageviews: function (value) { this.settings.pageTracking.autoTrackVirtualPages = value; },\n    firstPageview: function (value) { this.settings.pageTracking.autoTrackFirstPage = value; },\n    withBase: function (value) {\n      this.settings.pageTracking.basePath = (value) ? angular.element(document).find('base').attr('href') : '';\n    },\n    withAutoBase: function (value) { this.settings.pageTracking.autoBasePath = value; },\n    developerMode: function(value) { this.settings.developerMode = value; }\n  };\n\n  // General function to register plugin handlers. Flushes buffers immediately upon registration according to the specified delay.\n  var register = function(handlerName, fn){\n    api[handlerName] = updateHandlers(handlerName, fn);\n    var handlerSettings = settings[handlerName];\n    var handlerDelay = (handlerSettings) ? handlerSettings.bufferFlushDelay : null;\n    var delay = (handlerDelay !== null) ? handlerDelay : settings.bufferFlushDelay;\n    angular.forEach(cache[handlerName], function (args, index) {\n      onTimeout(function () { fn.apply(this, args); }, index * delay);\n    });\n  };\n\n  var capitalize = function (input) {\n      return input.replace(/^./, function (match) {\n          return match.toUpperCase();\n      });\n  };\n\n  //provide a method to inject services into handlers\n  var apiWithInjector = function(injector) {\n    return angular.extend(api, {\n      '$inject': injector.invoke\n    });\n  };\n\n  // Adds to the provider a 'register#{handlerName}' function that manages multiple plugins and buffer flushing.\n  var installHandlerRegisterFunction = function(handlerName){\n    var registerName = 'register'+capitalize(handlerName);\n    provider[registerName] = function(fn){\n      register(handlerName, fn);\n    };\n    api[handlerName] = updateHandlers(handlerName, bufferedHandler(handlerName));\n  };\n\n  // Set up register functions for each known handler\n  angular.forEach(knownHandlers, installHandlerRegisterFunction);\n  return provider;\n})\n\n.run(['$rootScope', '$window', '$analytics', '$injector', function ($rootScope, $window, $analytics, $injector) {\n  if ($analytics.settings.pageTracking.autoTrackFirstPage) {\n    $injector.invoke(['$location', function ($location) {\n      /* Only track the 'first page' if there are no routes or states on the page */\n      var noRoutesOrStates = true;\n      if ($injector.has('$route')) {\n         var $route = $injector.get('$route');\n         for (var route in $route.routes) {\n           noRoutesOrStates = false;\n           break;\n         }\n      } else if ($injector.has('$state')) {\n        var $state = $injector.get('$state');\n        for (var state in $state.get()) {\n          noRoutesOrStates = false;\n          break;\n        }\n      }\n      if (noRoutesOrStates) {\n        if ($analytics.settings.pageTracking.autoBasePath) {\n          $analytics.settings.pageTracking.basePath = $window.location.pathname;\n        }\n        if ($analytics.settings.pageTracking.trackRelativePath) {\n          var url = $analytics.settings.pageTracking.basePath + $location.url();\n          $analytics.pageTrack(url, $location);\n        } else {\n          $analytics.pageTrack($location.absUrl(), $location);\n        }\n      }\n    }]);\n  }\n\n  if ($analytics.settings.pageTracking.autoTrackVirtualPages) {\n    $injector.invoke(['$location', function ($location) {\n      if ($analytics.settings.pageTracking.autoBasePath) {\n        /* Add the full route to the base. */\n        $analytics.settings.pageTracking.basePath = $window.location.pathname + \"#\";\n      }\n      var noRoutesOrStates = true;\n      if ($injector.has('$route')) {\n        var $route = $injector.get('$route');\n        for (var route in $route.routes) {\n          noRoutesOrStates = false;\n          break;\n        }\n        $rootScope.$on('$routeChangeSuccess', function (event, current) {\n          if (current && (current.$$route||current).redirectTo) return;\n          var url = $analytics.settings.pageTracking.basePath + $location.url();\n          $analytics.pageTrack(url, $location);\n        });\n      }\n      if ($injector.has('$state')) {\n        noRoutesOrStates = false;\n        $rootScope.$on('$stateChangeSuccess', function (event, current) {\n          var url = $analytics.settings.pageTracking.basePath + $location.url();\n          $analytics.pageTrack(url, $location);\n        });\n      }\n      if (noRoutesOrStates) {\n        $rootScope.$on('$locationChangeSuccess', function (event, current) {\n          if (current && (current.$$route || current).redirectTo) return;\n          if ($analytics.settings.pageTracking.trackRelativePath) {\n            var url = $analytics.settings.pageTracking.basePath + $location.url();\n            $analytics.pageTrack(url, $location);\n          } else {\n            $analytics.pageTrack($location.absUrl(), $location);\n          }\n        });\n      }\n    }]);\n  }\n  if ($analytics.settings.developerMode) {\n    angular.forEach($analytics, function(attr, name) {\n      if (typeof attr === 'function') {\n        $analytics[name] = function(){};\n      }\n    });\n  }\n}])\n\n.directive('analyticsOn', ['$analytics', function ($analytics) {\n  function isCommand(element) {\n    return ['a:','button:','button:button','button:submit','input:button','input:submit'].indexOf(\n      element.tagName.toLowerCase()+':'+(element.type||'')) >= 0;\n  }\n\n  function inferEventType(element) {\n    if (isCommand(element)) return 'click';\n    return 'click';\n  }\n\n  function inferEventName(element) {\n    if (isCommand(element)) return element.innerText || element.value;\n    return element.id || element.name || element.tagName;\n  }\n\n  function isProperty(name) {\n    return name.substr(0, 9) === 'analytics' && ['On', 'Event', 'If', 'Properties', 'EventType'].indexOf(name.substr(9)) === -1;\n  }\n\n  function propertyName(name) {\n    var s = name.slice(9); // slice off the 'analytics' prefix\n    if (typeof s !== 'undefined' && s!==null && s.length > 0) {\n      return s.substring(0, 1).toLowerCase() + s.substring(1);\n    }\n    else {\n      return s;\n    }\n  }\n\n  return {\n    restrict: 'A',\n    link: function ($scope, $element, $attrs) {\n      var eventType = $attrs.analyticsOn || inferEventType($element[0]);\n      var trackingData = {};\n\n      angular.forEach($attrs.$attr, function(attr, name) {\n        if (isProperty(name)) {\n          trackingData[propertyName(name)] = $attrs[name];\n          $attrs.$observe(name, function(value){\n            trackingData[propertyName(name)] = value;\n          });\n        }\n      });\n\n      angular.element($element[0]).bind(eventType, function ($event) {\n        var eventName = $attrs.analyticsEvent || inferEventName($element[0]);\n        trackingData.eventType = $event.type;\n\n        if($attrs.analyticsIf){\n          if(! $scope.$eval($attrs.analyticsIf)){\n            return; // Cancel this event if we don't pass the analytics-if condition\n          }\n        }\n        // Allow components to pass through an expression that gets merged on to the event properties\n        // eg. analytics-properites='myComponentScope.someConfigExpression.$analyticsProperties'\n        if($attrs.analyticsProperties){\n          angular.extend(trackingData, $scope.$eval($attrs.analyticsProperties));\n        }\n        $analytics.eventTrack(eventName, trackingData);\n      });\n    }\n  };\n}]);\n})(angular);\n\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTYuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ib3dlcl9jb21wb25lbnRzL2FuZ3VsYXJ0aWNzL3NyYy9hbmd1bGFydGljcy5qcz8zODdkIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2UgQW5ndWxhcnRpY3MgdjAuMTkuMlxuICogKGMpIDIwMTMgTHVpcyBGYXJ6YXRpIGh0dHA6Ly9sdWlzZmFyemF0aS5naXRodWIuaW8vYW5ndWxhcnRpY3NcbiAqIExpY2Vuc2U6IE1JVFxuICovXG4oZnVuY3Rpb24oYW5ndWxhciwgYW5hbHl0aWNzKSB7XG4ndXNlIHN0cmljdCc7XG5cbnZhciBhbmd1bGFydGljcyA9IHdpbmRvdy5hbmd1bGFydGljcyB8fCAod2luZG93LmFuZ3VsYXJ0aWNzID0ge30pO1xuYW5ndWxhcnRpY3Mud2FpdEZvclZlbmRvckNvdW50ID0gMDtcbmFuZ3VsYXJ0aWNzLndhaXRGb3JWZW5kb3JBcGkgPSBmdW5jdGlvbiAob2JqZWN0TmFtZSwgZGVsYXksIGNvbnRhaW5zRmllbGQsIHJlZ2lzdGVyRm4sIG9uVGltZW91dCkge1xuICBpZiAoIW9uVGltZW91dCkgeyBhbmd1bGFydGljcy53YWl0Rm9yVmVuZG9yQ291bnQrKzsgfVxuICBpZiAoIXJlZ2lzdGVyRm4pIHsgcmVnaXN0ZXJGbiA9IGNvbnRhaW5zRmllbGQ7IGNvbnRhaW5zRmllbGQgPSB1bmRlZmluZWQ7IH1cbiAgaWYgKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwod2luZG93LCBvYmplY3ROYW1lKSB8fCAoY29udGFpbnNGaWVsZCAhPT0gdW5kZWZpbmVkICYmIHdpbmRvd1tvYmplY3ROYW1lXVtjb250YWluc0ZpZWxkXSA9PT0gdW5kZWZpbmVkKSkge1xuICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgeyBhbmd1bGFydGljcy53YWl0Rm9yVmVuZG9yQXBpKG9iamVjdE5hbWUsIGRlbGF5LCBjb250YWluc0ZpZWxkLCByZWdpc3RlckZuLCB0cnVlKTsgfSwgZGVsYXkpO1xuICB9XG4gIGVsc2Uge1xuICAgIGFuZ3VsYXJ0aWNzLndhaXRGb3JWZW5kb3JDb3VudC0tO1xuICAgIHJlZ2lzdGVyRm4od2luZG93W29iamVjdE5hbWVdKTtcbiAgfVxufTtcblxuLyoqXG4gKiBAbmdkb2Mgb3ZlcnZpZXdcbiAqIEBuYW1lIGFuZ3VsYXJ0aWNzXG4gKi9cbmFuZ3VsYXIubW9kdWxlKCdhbmd1bGFydGljcycsIFtdKVxuLnByb3ZpZGVyKCckYW5hbHl0aWNzJywgZnVuY3Rpb24gKCkge1xuICB2YXIgc2V0dGluZ3MgPSB7XG4gICAgcGFnZVRyYWNraW5nOiB7XG4gICAgICBhdXRvVHJhY2tGaXJzdFBhZ2U6IHRydWUsXG4gICAgICBhdXRvVHJhY2tWaXJ0dWFsUGFnZXM6IHRydWUsXG4gICAgICB0cmFja1JlbGF0aXZlUGF0aDogZmFsc2UsXG4gICAgICBhdXRvQmFzZVBhdGg6IGZhbHNlLFxuICAgICAgYmFzZVBhdGg6ICcnXG4gICAgfSxcbiAgICBldmVudFRyYWNraW5nOiB7fSxcbiAgICBidWZmZXJGbHVzaERlbGF5OiAxMDAwLCAvLyBTdXBwb3J0IG9ubHkgb25lIGNvbmZpZ3VyYXRpb24gZm9yIGJ1ZmZlciBmbHVzaCBkZWxheSB0byBzaW1wbGlmeSBidWZmZXJpbmdcbiAgICBkZXZlbG9wZXJNb2RlOiBmYWxzZSAvLyBQcmV2ZW50IHNlbmRpbmcgZGF0YSBpbiBsb2NhbC9kZXZlbG9wbWVudCBlbnZpcm9ubWVudFxuICB9O1xuXG4gIC8vIExpc3Qgb2Yga25vd24gaGFuZGxlcnMgdGhhdCBwbHVnaW5zIGNhbiByZWdpc3RlciB0aGVtc2VsdmVzIGZvclxuICB2YXIga25vd25IYW5kbGVycyA9IFtcbiAgICAncGFnZVRyYWNrJyxcbiAgICAnZXZlbnRUcmFjaycsXG4gICAgJ3NldEFsaWFzJyxcbiAgICAnc2V0VXNlcm5hbWUnLFxuICAgICdzZXRVc2VyUHJvcGVydGllcycsXG4gICAgJ3NldFVzZXJQcm9wZXJ0aWVzT25jZScsXG4gICAgJ3NldFN1cGVyUHJvcGVydGllcycsXG4gICAgJ3NldFN1cGVyUHJvcGVydGllc09uY2UnXG4gIF07XG4gIC8vIENhY2hlIGFuZCBoYW5kbGVyIHByb3BlcnRpZXMgd2lsbCBtYXRjaCB2YWx1ZXMgaW4gJ2tub3duSGFuZGxlcnMnIGFzIHRoZSBidWZmZXJpbmcgZnVuY3RvbnMgYXJlIGluc3RhbGxlZC5cbiAgdmFyIGNhY2hlID0ge307XG4gIHZhciBoYW5kbGVycyA9IHt9O1xuXG4gIC8vIEdlbmVyYWwgYnVmZmVyaW5nIGhhbmRsZXJcbiAgdmFyIGJ1ZmZlcmVkSGFuZGxlciA9IGZ1bmN0aW9uKGhhbmRsZXJOYW1lKXtcbiAgICByZXR1cm4gZnVuY3Rpb24oKXtcbiAgICAgIGlmKGFuZ3VsYXJ0aWNzLndhaXRGb3JWZW5kb3JDb3VudCl7XG4gICAgICAgIGlmKCFjYWNoZVtoYW5kbGVyTmFtZV0peyBjYWNoZVtoYW5kbGVyTmFtZV0gPSBbXTsgfVxuICAgICAgICBjYWNoZVtoYW5kbGVyTmFtZV0ucHVzaChhcmd1bWVudHMpO1xuICAgICAgfVxuICAgIH07XG4gIH07XG5cbiAgLy8gQXMgaGFuZGxlcnMgYXJlIGluc3RhbGxlZCBieSBwbHVnaW5zLCB0aGV5IGdldCBwdXNoZWQgaW50byBhIGxpc3QgYW5kIGludm9rZWQgaW4gb3JkZXIuXG4gIHZhciB1cGRhdGVIYW5kbGVycyA9IGZ1bmN0aW9uKGhhbmRsZXJOYW1lLCBmbil7XG4gICAgaWYoIWhhbmRsZXJzW2hhbmRsZXJOYW1lXSl7XG4gICAgICBoYW5kbGVyc1toYW5kbGVyTmFtZV0gPSBbXTtcbiAgICB9XG4gICAgaGFuZGxlcnNbaGFuZGxlck5hbWVdLnB1c2goZm4pO1xuICAgIHJldHVybiBmdW5jdGlvbigpe1xuICAgICAgdmFyIGhhbmRsZXJBcmdzID0gYXJndW1lbnRzO1xuICAgICAgYW5ndWxhci5mb3JFYWNoKGhhbmRsZXJzW2hhbmRsZXJOYW1lXSwgZnVuY3Rpb24oaGFuZGxlcil7XG4gICAgICAgIGhhbmRsZXIuYXBwbHkodGhpcywgaGFuZGxlckFyZ3MpO1xuICAgICAgfSwgdGhpcyk7XG4gICAgfTtcbiAgfTtcblxuICAvLyBUaGUgYXBpIChyZXR1cm5lZCBieSB0aGlzIHByb3ZpZGVyKSBnZXRzIHBvcHVsYXRlZCB3aXRoIGhhbmRsZXJzIGJlbG93LlxuICB2YXIgYXBpID0ge1xuICAgIHNldHRpbmdzOiBzZXR0aW5nc1xuICB9O1xuXG4gIC8vIFdpbGwgcnVuIHNldFRpbWVvdXQgaWYgZGVsYXkgaXMgPiAwXG4gIC8vIFJ1bnMgaW1tZWRpYXRlbHkgaWYgbm8gZGVsYXkgdG8gbWFrZSBzdXJlIGNhY2hlL2J1ZmZlciBpcyBmbHVzaGVkIGJlZm9yZSBhbnl0aGluZyBlbHNlLlxuICAvLyBQbHVnaW5zIHNob3VsZCB0YWtlIGNhcmUgdG8gcmVnaXN0ZXIgaGFuZGxlcnMgYnkgb3JkZXIgb2YgcHJlY2VkZW5jZS5cbiAgdmFyIG9uVGltZW91dCA9IGZ1bmN0aW9uKGZuLCBkZWxheSl7XG4gICAgaWYoZGVsYXkpe1xuICAgICAgc2V0VGltZW91dChmbiwgZGVsYXkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBmbigpO1xuICAgIH1cbiAgfTtcblxuICB2YXIgcHJvdmlkZXIgPSB7XG4gICAgJGdldDogZnVuY3Rpb24oJGluamVjdG9yKSB7XG4gICAgICByZXR1cm4gYXBpV2l0aEluamVjdG9yKCRpbmplY3Rvcik7XG4gICAgfSxcbiAgICBhcGk6IGFwaSxcbiAgICBzZXR0aW5nczogc2V0dGluZ3MsXG4gICAgdmlydHVhbFBhZ2V2aWV3czogZnVuY3Rpb24gKHZhbHVlKSB7IHRoaXMuc2V0dGluZ3MucGFnZVRyYWNraW5nLmF1dG9UcmFja1ZpcnR1YWxQYWdlcyA9IHZhbHVlOyB9LFxuICAgIGZpcnN0UGFnZXZpZXc6IGZ1bmN0aW9uICh2YWx1ZSkgeyB0aGlzLnNldHRpbmdzLnBhZ2VUcmFja2luZy5hdXRvVHJhY2tGaXJzdFBhZ2UgPSB2YWx1ZTsgfSxcbiAgICB3aXRoQmFzZTogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICB0aGlzLnNldHRpbmdzLnBhZ2VUcmFja2luZy5iYXNlUGF0aCA9ICh2YWx1ZSkgPyBhbmd1bGFyLmVsZW1lbnQoZG9jdW1lbnQpLmZpbmQoJ2Jhc2UnKS5hdHRyKCdocmVmJykgOiAnJztcbiAgICB9LFxuICAgIHdpdGhBdXRvQmFzZTogZnVuY3Rpb24gKHZhbHVlKSB7IHRoaXMuc2V0dGluZ3MucGFnZVRyYWNraW5nLmF1dG9CYXNlUGF0aCA9IHZhbHVlOyB9LFxuICAgIGRldmVsb3Blck1vZGU6IGZ1bmN0aW9uKHZhbHVlKSB7IHRoaXMuc2V0dGluZ3MuZGV2ZWxvcGVyTW9kZSA9IHZhbHVlOyB9XG4gIH07XG5cbiAgLy8gR2VuZXJhbCBmdW5jdGlvbiB0byByZWdpc3RlciBwbHVnaW4gaGFuZGxlcnMuIEZsdXNoZXMgYnVmZmVycyBpbW1lZGlhdGVseSB1cG9uIHJlZ2lzdHJhdGlvbiBhY2NvcmRpbmcgdG8gdGhlIHNwZWNpZmllZCBkZWxheS5cbiAgdmFyIHJlZ2lzdGVyID0gZnVuY3Rpb24oaGFuZGxlck5hbWUsIGZuKXtcbiAgICBhcGlbaGFuZGxlck5hbWVdID0gdXBkYXRlSGFuZGxlcnMoaGFuZGxlck5hbWUsIGZuKTtcbiAgICB2YXIgaGFuZGxlclNldHRpbmdzID0gc2V0dGluZ3NbaGFuZGxlck5hbWVdO1xuICAgIHZhciBoYW5kbGVyRGVsYXkgPSAoaGFuZGxlclNldHRpbmdzKSA/IGhhbmRsZXJTZXR0aW5ncy5idWZmZXJGbHVzaERlbGF5IDogbnVsbDtcbiAgICB2YXIgZGVsYXkgPSAoaGFuZGxlckRlbGF5ICE9PSBudWxsKSA/IGhhbmRsZXJEZWxheSA6IHNldHRpbmdzLmJ1ZmZlckZsdXNoRGVsYXk7XG4gICAgYW5ndWxhci5mb3JFYWNoKGNhY2hlW2hhbmRsZXJOYW1lXSwgZnVuY3Rpb24gKGFyZ3MsIGluZGV4KSB7XG4gICAgICBvblRpbWVvdXQoZnVuY3Rpb24gKCkgeyBmbi5hcHBseSh0aGlzLCBhcmdzKTsgfSwgaW5kZXggKiBkZWxheSk7XG4gICAgfSk7XG4gIH07XG5cbiAgdmFyIGNhcGl0YWxpemUgPSBmdW5jdGlvbiAoaW5wdXQpIHtcbiAgICAgIHJldHVybiBpbnB1dC5yZXBsYWNlKC9eLi8sIGZ1bmN0aW9uIChtYXRjaCkge1xuICAgICAgICAgIHJldHVybiBtYXRjaC50b1VwcGVyQ2FzZSgpO1xuICAgICAgfSk7XG4gIH07XG5cbiAgLy9wcm92aWRlIGEgbWV0aG9kIHRvIGluamVjdCBzZXJ2aWNlcyBpbnRvIGhhbmRsZXJzXG4gIHZhciBhcGlXaXRoSW5qZWN0b3IgPSBmdW5jdGlvbihpbmplY3Rvcikge1xuICAgIHJldHVybiBhbmd1bGFyLmV4dGVuZChhcGksIHtcbiAgICAgICckaW5qZWN0JzogaW5qZWN0b3IuaW52b2tlXG4gICAgfSk7XG4gIH07XG5cbiAgLy8gQWRkcyB0byB0aGUgcHJvdmlkZXIgYSAncmVnaXN0ZXIje2hhbmRsZXJOYW1lfScgZnVuY3Rpb24gdGhhdCBtYW5hZ2VzIG11bHRpcGxlIHBsdWdpbnMgYW5kIGJ1ZmZlciBmbHVzaGluZy5cbiAgdmFyIGluc3RhbGxIYW5kbGVyUmVnaXN0ZXJGdW5jdGlvbiA9IGZ1bmN0aW9uKGhhbmRsZXJOYW1lKXtcbiAgICB2YXIgcmVnaXN0ZXJOYW1lID0gJ3JlZ2lzdGVyJytjYXBpdGFsaXplKGhhbmRsZXJOYW1lKTtcbiAgICBwcm92aWRlcltyZWdpc3Rlck5hbWVdID0gZnVuY3Rpb24oZm4pe1xuICAgICAgcmVnaXN0ZXIoaGFuZGxlck5hbWUsIGZuKTtcbiAgICB9O1xuICAgIGFwaVtoYW5kbGVyTmFtZV0gPSB1cGRhdGVIYW5kbGVycyhoYW5kbGVyTmFtZSwgYnVmZmVyZWRIYW5kbGVyKGhhbmRsZXJOYW1lKSk7XG4gIH07XG5cbiAgLy8gU2V0IHVwIHJlZ2lzdGVyIGZ1bmN0aW9ucyBmb3IgZWFjaCBrbm93biBoYW5kbGVyXG4gIGFuZ3VsYXIuZm9yRWFjaChrbm93bkhhbmRsZXJzLCBpbnN0YWxsSGFuZGxlclJlZ2lzdGVyRnVuY3Rpb24pO1xuICByZXR1cm4gcHJvdmlkZXI7XG59KVxuXG4ucnVuKFsnJHJvb3RTY29wZScsICckd2luZG93JywgJyRhbmFseXRpY3MnLCAnJGluamVjdG9yJywgZnVuY3Rpb24gKCRyb290U2NvcGUsICR3aW5kb3csICRhbmFseXRpY3MsICRpbmplY3Rvcikge1xuICBpZiAoJGFuYWx5dGljcy5zZXR0aW5ncy5wYWdlVHJhY2tpbmcuYXV0b1RyYWNrRmlyc3RQYWdlKSB7XG4gICAgJGluamVjdG9yLmludm9rZShbJyRsb2NhdGlvbicsIGZ1bmN0aW9uICgkbG9jYXRpb24pIHtcbiAgICAgIC8qIE9ubHkgdHJhY2sgdGhlICdmaXJzdCBwYWdlJyBpZiB0aGVyZSBhcmUgbm8gcm91dGVzIG9yIHN0YXRlcyBvbiB0aGUgcGFnZSAqL1xuICAgICAgdmFyIG5vUm91dGVzT3JTdGF0ZXMgPSB0cnVlO1xuICAgICAgaWYgKCRpbmplY3Rvci5oYXMoJyRyb3V0ZScpKSB7XG4gICAgICAgICB2YXIgJHJvdXRlID0gJGluamVjdG9yLmdldCgnJHJvdXRlJyk7XG4gICAgICAgICBmb3IgKHZhciByb3V0ZSBpbiAkcm91dGUucm91dGVzKSB7XG4gICAgICAgICAgIG5vUm91dGVzT3JTdGF0ZXMgPSBmYWxzZTtcbiAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKCRpbmplY3Rvci5oYXMoJyRzdGF0ZScpKSB7XG4gICAgICAgIHZhciAkc3RhdGUgPSAkaW5qZWN0b3IuZ2V0KCckc3RhdGUnKTtcbiAgICAgICAgZm9yICh2YXIgc3RhdGUgaW4gJHN0YXRlLmdldCgpKSB7XG4gICAgICAgICAgbm9Sb3V0ZXNPclN0YXRlcyA9IGZhbHNlO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAobm9Sb3V0ZXNPclN0YXRlcykge1xuICAgICAgICBpZiAoJGFuYWx5dGljcy5zZXR0aW5ncy5wYWdlVHJhY2tpbmcuYXV0b0Jhc2VQYXRoKSB7XG4gICAgICAgICAgJGFuYWx5dGljcy5zZXR0aW5ncy5wYWdlVHJhY2tpbmcuYmFzZVBhdGggPSAkd2luZG93LmxvY2F0aW9uLnBhdGhuYW1lO1xuICAgICAgICB9XG4gICAgICAgIGlmICgkYW5hbHl0aWNzLnNldHRpbmdzLnBhZ2VUcmFja2luZy50cmFja1JlbGF0aXZlUGF0aCkge1xuICAgICAgICAgIHZhciB1cmwgPSAkYW5hbHl0aWNzLnNldHRpbmdzLnBhZ2VUcmFja2luZy5iYXNlUGF0aCArICRsb2NhdGlvbi51cmwoKTtcbiAgICAgICAgICAkYW5hbHl0aWNzLnBhZ2VUcmFjayh1cmwsICRsb2NhdGlvbik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgJGFuYWx5dGljcy5wYWdlVHJhY2soJGxvY2F0aW9uLmFic1VybCgpLCAkbG9jYXRpb24pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfV0pO1xuICB9XG5cbiAgaWYgKCRhbmFseXRpY3Muc2V0dGluZ3MucGFnZVRyYWNraW5nLmF1dG9UcmFja1ZpcnR1YWxQYWdlcykge1xuICAgICRpbmplY3Rvci5pbnZva2UoWyckbG9jYXRpb24nLCBmdW5jdGlvbiAoJGxvY2F0aW9uKSB7XG4gICAgICBpZiAoJGFuYWx5dGljcy5zZXR0aW5ncy5wYWdlVHJhY2tpbmcuYXV0b0Jhc2VQYXRoKSB7XG4gICAgICAgIC8qIEFkZCB0aGUgZnVsbCByb3V0ZSB0byB0aGUgYmFzZS4gKi9cbiAgICAgICAgJGFuYWx5dGljcy5zZXR0aW5ncy5wYWdlVHJhY2tpbmcuYmFzZVBhdGggPSAkd2luZG93LmxvY2F0aW9uLnBhdGhuYW1lICsgXCIjXCI7XG4gICAgICB9XG4gICAgICB2YXIgbm9Sb3V0ZXNPclN0YXRlcyA9IHRydWU7XG4gICAgICBpZiAoJGluamVjdG9yLmhhcygnJHJvdXRlJykpIHtcbiAgICAgICAgdmFyICRyb3V0ZSA9ICRpbmplY3Rvci5nZXQoJyRyb3V0ZScpO1xuICAgICAgICBmb3IgKHZhciByb3V0ZSBpbiAkcm91dGUucm91dGVzKSB7XG4gICAgICAgICAgbm9Sb3V0ZXNPclN0YXRlcyA9IGZhbHNlO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgICRyb290U2NvcGUuJG9uKCckcm91dGVDaGFuZ2VTdWNjZXNzJywgZnVuY3Rpb24gKGV2ZW50LCBjdXJyZW50KSB7XG4gICAgICAgICAgaWYgKGN1cnJlbnQgJiYgKGN1cnJlbnQuJCRyb3V0ZXx8Y3VycmVudCkucmVkaXJlY3RUbykgcmV0dXJuO1xuICAgICAgICAgIHZhciB1cmwgPSAkYW5hbHl0aWNzLnNldHRpbmdzLnBhZ2VUcmFja2luZy5iYXNlUGF0aCArICRsb2NhdGlvbi51cmwoKTtcbiAgICAgICAgICAkYW5hbHl0aWNzLnBhZ2VUcmFjayh1cmwsICRsb2NhdGlvbik7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgaWYgKCRpbmplY3Rvci5oYXMoJyRzdGF0ZScpKSB7XG4gICAgICAgIG5vUm91dGVzT3JTdGF0ZXMgPSBmYWxzZTtcbiAgICAgICAgJHJvb3RTY29wZS4kb24oJyRzdGF0ZUNoYW5nZVN1Y2Nlc3MnLCBmdW5jdGlvbiAoZXZlbnQsIGN1cnJlbnQpIHtcbiAgICAgICAgICB2YXIgdXJsID0gJGFuYWx5dGljcy5zZXR0aW5ncy5wYWdlVHJhY2tpbmcuYmFzZVBhdGggKyAkbG9jYXRpb24udXJsKCk7XG4gICAgICAgICAgJGFuYWx5dGljcy5wYWdlVHJhY2sodXJsLCAkbG9jYXRpb24pO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGlmIChub1JvdXRlc09yU3RhdGVzKSB7XG4gICAgICAgICRyb290U2NvcGUuJG9uKCckbG9jYXRpb25DaGFuZ2VTdWNjZXNzJywgZnVuY3Rpb24gKGV2ZW50LCBjdXJyZW50KSB7XG4gICAgICAgICAgaWYgKGN1cnJlbnQgJiYgKGN1cnJlbnQuJCRyb3V0ZSB8fCBjdXJyZW50KS5yZWRpcmVjdFRvKSByZXR1cm47XG4gICAgICAgICAgaWYgKCRhbmFseXRpY3Muc2V0dGluZ3MucGFnZVRyYWNraW5nLnRyYWNrUmVsYXRpdmVQYXRoKSB7XG4gICAgICAgICAgICB2YXIgdXJsID0gJGFuYWx5dGljcy5zZXR0aW5ncy5wYWdlVHJhY2tpbmcuYmFzZVBhdGggKyAkbG9jYXRpb24udXJsKCk7XG4gICAgICAgICAgICAkYW5hbHl0aWNzLnBhZ2VUcmFjayh1cmwsICRsb2NhdGlvbik7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICRhbmFseXRpY3MucGFnZVRyYWNrKCRsb2NhdGlvbi5hYnNVcmwoKSwgJGxvY2F0aW9uKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1dKTtcbiAgfVxuICBpZiAoJGFuYWx5dGljcy5zZXR0aW5ncy5kZXZlbG9wZXJNb2RlKSB7XG4gICAgYW5ndWxhci5mb3JFYWNoKCRhbmFseXRpY3MsIGZ1bmN0aW9uKGF0dHIsIG5hbWUpIHtcbiAgICAgIGlmICh0eXBlb2YgYXR0ciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAkYW5hbHl0aWNzW25hbWVdID0gZnVuY3Rpb24oKXt9O1xuICAgICAgfVxuICAgIH0pO1xuICB9XG59XSlcblxuLmRpcmVjdGl2ZSgnYW5hbHl0aWNzT24nLCBbJyRhbmFseXRpY3MnLCBmdW5jdGlvbiAoJGFuYWx5dGljcykge1xuICBmdW5jdGlvbiBpc0NvbW1hbmQoZWxlbWVudCkge1xuICAgIHJldHVybiBbJ2E6JywnYnV0dG9uOicsJ2J1dHRvbjpidXR0b24nLCdidXR0b246c3VibWl0JywnaW5wdXQ6YnV0dG9uJywnaW5wdXQ6c3VibWl0J10uaW5kZXhPZihcbiAgICAgIGVsZW1lbnQudGFnTmFtZS50b0xvd2VyQ2FzZSgpKyc6JysoZWxlbWVudC50eXBlfHwnJykpID49IDA7XG4gIH1cblxuICBmdW5jdGlvbiBpbmZlckV2ZW50VHlwZShlbGVtZW50KSB7XG4gICAgaWYgKGlzQ29tbWFuZChlbGVtZW50KSkgcmV0dXJuICdjbGljayc7XG4gICAgcmV0dXJuICdjbGljayc7XG4gIH1cblxuICBmdW5jdGlvbiBpbmZlckV2ZW50TmFtZShlbGVtZW50KSB7XG4gICAgaWYgKGlzQ29tbWFuZChlbGVtZW50KSkgcmV0dXJuIGVsZW1lbnQuaW5uZXJUZXh0IHx8IGVsZW1lbnQudmFsdWU7XG4gICAgcmV0dXJuIGVsZW1lbnQuaWQgfHwgZWxlbWVudC5uYW1lIHx8IGVsZW1lbnQudGFnTmFtZTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGlzUHJvcGVydHkobmFtZSkge1xuICAgIHJldHVybiBuYW1lLnN1YnN0cigwLCA5KSA9PT0gJ2FuYWx5dGljcycgJiYgWydPbicsICdFdmVudCcsICdJZicsICdQcm9wZXJ0aWVzJywgJ0V2ZW50VHlwZSddLmluZGV4T2YobmFtZS5zdWJzdHIoOSkpID09PSAtMTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHByb3BlcnR5TmFtZShuYW1lKSB7XG4gICAgdmFyIHMgPSBuYW1lLnNsaWNlKDkpOyAvLyBzbGljZSBvZmYgdGhlICdhbmFseXRpY3MnIHByZWZpeFxuICAgIGlmICh0eXBlb2YgcyAhPT0gJ3VuZGVmaW5lZCcgJiYgcyE9PW51bGwgJiYgcy5sZW5ndGggPiAwKSB7XG4gICAgICByZXR1cm4gcy5zdWJzdHJpbmcoMCwgMSkudG9Mb3dlckNhc2UoKSArIHMuc3Vic3RyaW5nKDEpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHJldHVybiBzO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB7XG4gICAgcmVzdHJpY3Q6ICdBJyxcbiAgICBsaW5rOiBmdW5jdGlvbiAoJHNjb3BlLCAkZWxlbWVudCwgJGF0dHJzKSB7XG4gICAgICB2YXIgZXZlbnRUeXBlID0gJGF0dHJzLmFuYWx5dGljc09uIHx8IGluZmVyRXZlbnRUeXBlKCRlbGVtZW50WzBdKTtcbiAgICAgIHZhciB0cmFja2luZ0RhdGEgPSB7fTtcblxuICAgICAgYW5ndWxhci5mb3JFYWNoKCRhdHRycy4kYXR0ciwgZnVuY3Rpb24oYXR0ciwgbmFtZSkge1xuICAgICAgICBpZiAoaXNQcm9wZXJ0eShuYW1lKSkge1xuICAgICAgICAgIHRyYWNraW5nRGF0YVtwcm9wZXJ0eU5hbWUobmFtZSldID0gJGF0dHJzW25hbWVdO1xuICAgICAgICAgICRhdHRycy4kb2JzZXJ2ZShuYW1lLCBmdW5jdGlvbih2YWx1ZSl7XG4gICAgICAgICAgICB0cmFja2luZ0RhdGFbcHJvcGVydHlOYW1lKG5hbWUpXSA9IHZhbHVlO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgYW5ndWxhci5lbGVtZW50KCRlbGVtZW50WzBdKS5iaW5kKGV2ZW50VHlwZSwgZnVuY3Rpb24gKCRldmVudCkge1xuICAgICAgICB2YXIgZXZlbnROYW1lID0gJGF0dHJzLmFuYWx5dGljc0V2ZW50IHx8IGluZmVyRXZlbnROYW1lKCRlbGVtZW50WzBdKTtcbiAgICAgICAgdHJhY2tpbmdEYXRhLmV2ZW50VHlwZSA9ICRldmVudC50eXBlO1xuXG4gICAgICAgIGlmKCRhdHRycy5hbmFseXRpY3NJZil7XG4gICAgICAgICAgaWYoISAkc2NvcGUuJGV2YWwoJGF0dHJzLmFuYWx5dGljc0lmKSl7XG4gICAgICAgICAgICByZXR1cm47IC8vIENhbmNlbCB0aGlzIGV2ZW50IGlmIHdlIGRvbid0IHBhc3MgdGhlIGFuYWx5dGljcy1pZiBjb25kaXRpb25cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gQWxsb3cgY29tcG9uZW50cyB0byBwYXNzIHRocm91Z2ggYW4gZXhwcmVzc2lvbiB0aGF0IGdldHMgbWVyZ2VkIG9uIHRvIHRoZSBldmVudCBwcm9wZXJ0aWVzXG4gICAgICAgIC8vIGVnLiBhbmFseXRpY3MtcHJvcGVyaXRlcz0nbXlDb21wb25lbnRTY29wZS5zb21lQ29uZmlnRXhwcmVzc2lvbi4kYW5hbHl0aWNzUHJvcGVydGllcydcbiAgICAgICAgaWYoJGF0dHJzLmFuYWx5dGljc1Byb3BlcnRpZXMpe1xuICAgICAgICAgIGFuZ3VsYXIuZXh0ZW5kKHRyYWNraW5nRGF0YSwgJHNjb3BlLiRldmFsKCRhdHRycy5hbmFseXRpY3NQcm9wZXJ0aWVzKSk7XG4gICAgICAgIH1cbiAgICAgICAgJGFuYWx5dGljcy5ldmVudFRyYWNrKGV2ZW50TmFtZSwgdHJhY2tpbmdEYXRhKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfTtcbn1dKTtcbn0pKGFuZ3VsYXIpO1xuXG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL2Jvd2VyX2NvbXBvbmVudHMvYW5ndWxhcnRpY3Mvc3JjL2FuZ3VsYXJ0aWNzLmpzXG4gKiogbW9kdWxlIGlkID0gNTZcbiAqKiBtb2R1bGUgY2h1bmtzID0gMjRcbiAqKi8iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=");

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

	eval("/**\n * @license AngularJS v1.4.6\n * (c) 2010-2015 Google, Inc. http://angularjs.org\n * License: MIT\n */\n(function(window, angular, undefined) {'use strict';\n\nvar $resourceMinErr = angular.$$minErr('$resource');\n\n// Helper functions and regex to lookup a dotted path on an object\n// stopping at undefined/null.  The path must be composed of ASCII\n// identifiers (just like $parse)\nvar MEMBER_NAME_REGEX = /^(\\.[a-zA-Z_$@][0-9a-zA-Z_$@]*)+$/;\n\nfunction isValidDottedPath(path) {\n  return (path != null && path !== '' && path !== 'hasOwnProperty' &&\n      MEMBER_NAME_REGEX.test('.' + path));\n}\n\nfunction lookupDottedPath(obj, path) {\n  if (!isValidDottedPath(path)) {\n    throw $resourceMinErr('badmember', 'Dotted member path \"@{0}\" is invalid.', path);\n  }\n  var keys = path.split('.');\n  for (var i = 0, ii = keys.length; i < ii && angular.isDefined(obj); i++) {\n    var key = keys[i];\n    obj = (obj !== null) ? obj[key] : undefined;\n  }\n  return obj;\n}\n\n/**\n * Create a shallow copy of an object and clear other fields from the destination\n */\nfunction shallowClearAndCopy(src, dst) {\n  dst = dst || {};\n\n  angular.forEach(dst, function(value, key) {\n    delete dst[key];\n  });\n\n  for (var key in src) {\n    if (src.hasOwnProperty(key) && !(key.charAt(0) === '$' && key.charAt(1) === '$')) {\n      dst[key] = src[key];\n    }\n  }\n\n  return dst;\n}\n\n/**\n * @ngdoc module\n * @name ngResource\n * @description\n *\n * # ngResource\n *\n * The `ngResource` module provides interaction support with RESTful services\n * via the $resource service.\n *\n *\n * <div doc-module-components=\"ngResource\"></div>\n *\n * See {@link ngResource.$resource `$resource`} for usage.\n */\n\n/**\n * @ngdoc service\n * @name $resource\n * @requires $http\n *\n * @description\n * A factory which creates a resource object that lets you interact with\n * [RESTful](http://en.wikipedia.org/wiki/Representational_State_Transfer) server-side data sources.\n *\n * The returned resource object has action methods which provide high-level behaviors without\n * the need to interact with the low level {@link ng.$http $http} service.\n *\n * Requires the {@link ngResource `ngResource`} module to be installed.\n *\n * By default, trailing slashes will be stripped from the calculated URLs,\n * which can pose problems with server backends that do not expect that\n * behavior.  This can be disabled by configuring the `$resourceProvider` like\n * this:\n *\n * ```js\n     app.config(['$resourceProvider', function($resourceProvider) {\n       // Don't strip trailing slashes from calculated URLs\n       $resourceProvider.defaults.stripTrailingSlashes = false;\n     }]);\n * ```\n *\n * @param {string} url A parameterized URL template with parameters prefixed by `:` as in\n *   `/user/:username`. If you are using a URL with a port number (e.g.\n *   `http://example.com:8080/api`), it will be respected.\n *\n *   If you are using a url with a suffix, just add the suffix, like this:\n *   `$resource('http://example.com/resource.json')` or `$resource('http://example.com/:id.json')`\n *   or even `$resource('http://example.com/resource/:resource_id.:format')`\n *   If the parameter before the suffix is empty, :resource_id in this case, then the `/.` will be\n *   collapsed down to a single `.`.  If you need this sequence to appear and not collapse then you\n *   can escape it with `/\\.`.\n *\n * @param {Object=} paramDefaults Default values for `url` parameters. These can be overridden in\n *   `actions` methods. If any of the parameter value is a function, it will be executed every time\n *   when a param value needs to be obtained for a request (unless the param was overridden).\n *\n *   Each key value in the parameter object is first bound to url template if present and then any\n *   excess keys are appended to the url search query after the `?`.\n *\n *   Given a template `/path/:verb` and parameter `{verb:'greet', salutation:'Hello'}` results in\n *   URL `/path/greet?salutation=Hello`.\n *\n *   If the parameter value is prefixed with `@` then the value for that parameter will be extracted\n *   from the corresponding property on the `data` object (provided when calling an action method).  For\n *   example, if the `defaultParam` object is `{someParam: '@someProp'}` then the value of `someParam`\n *   will be `data.someProp`.\n *\n * @param {Object.<Object>=} actions Hash with declaration of custom actions that should extend\n *   the default set of resource actions. The declaration should be created in the format of {@link\n *   ng.$http#usage $http.config}:\n *\n *       {action1: {method:?, params:?, isArray:?, headers:?, ...},\n *        action2: {method:?, params:?, isArray:?, headers:?, ...},\n *        ...}\n *\n *   Where:\n *\n *   - **`action`** – {string} – The name of action. This name becomes the name of the method on\n *     your resource object.\n *   - **`method`** – {string} – Case insensitive HTTP method (e.g. `GET`, `POST`, `PUT`,\n *     `DELETE`, `JSONP`, etc).\n *   - **`params`** – {Object=} – Optional set of pre-bound parameters for this action. If any of\n *     the parameter value is a function, it will be executed every time when a param value needs to\n *     be obtained for a request (unless the param was overridden).\n *   - **`url`** – {string} – action specific `url` override. The url templating is supported just\n *     like for the resource-level urls.\n *   - **`isArray`** – {boolean=} – If true then the returned object for this action is an array,\n *     see `returns` section.\n *   - **`transformRequest`** –\n *     `{function(data, headersGetter)|Array.<function(data, headersGetter)>}` –\n *     transform function or an array of such functions. The transform function takes the http\n *     request body and headers and returns its transformed (typically serialized) version.\n *     By default, transformRequest will contain one function that checks if the request data is\n *     an object and serializes to using `angular.toJson`. To prevent this behavior, set\n *     `transformRequest` to an empty array: `transformRequest: []`\n *   - **`transformResponse`** –\n *     `{function(data, headersGetter)|Array.<function(data, headersGetter)>}` –\n *     transform function or an array of such functions. The transform function takes the http\n *     response body and headers and returns its transformed (typically deserialized) version.\n *     By default, transformResponse will contain one function that checks if the response looks like\n *     a JSON string and deserializes it using `angular.fromJson`. To prevent this behavior, set\n *     `transformResponse` to an empty array: `transformResponse: []`\n *   - **`cache`** – `{boolean|Cache}` – If true, a default $http cache will be used to cache the\n *     GET request, otherwise if a cache instance built with\n *     {@link ng.$cacheFactory $cacheFactory}, this cache will be used for\n *     caching.\n *   - **`timeout`** – `{number|Promise}` – timeout in milliseconds, or {@link ng.$q promise} that\n *     should abort the request when resolved.\n *   - **`withCredentials`** - `{boolean}` - whether to set the `withCredentials` flag on the\n *     XHR object. See\n *     [requests with credentials](https://developer.mozilla.org/en/http_access_control#section_5)\n *     for more information.\n *   - **`responseType`** - `{string}` - see\n *     [requestType](https://developer.mozilla.org/en-US/docs/DOM/XMLHttpRequest#responseType).\n *   - **`interceptor`** - `{Object=}` - The interceptor object has two optional methods -\n *     `response` and `responseError`. Both `response` and `responseError` interceptors get called\n *     with `http response` object. See {@link ng.$http $http interceptors}.\n *\n * @param {Object} options Hash with custom settings that should extend the\n *   default `$resourceProvider` behavior.  The only supported option is\n *\n *   Where:\n *\n *   - **`stripTrailingSlashes`** – {boolean} – If true then the trailing\n *   slashes from any calculated URL will be stripped. (Defaults to true.)\n *\n * @returns {Object} A resource \"class\" object with methods for the default set of resource actions\n *   optionally extended with custom `actions`. The default set contains these actions:\n *   ```js\n *   { 'get':    {method:'GET'},\n *     'save':   {method:'POST'},\n *     'query':  {method:'GET', isArray:true},\n *     'remove': {method:'DELETE'},\n *     'delete': {method:'DELETE'} };\n *   ```\n *\n *   Calling these methods invoke an {@link ng.$http} with the specified http method,\n *   destination and parameters. When the data is returned from the server then the object is an\n *   instance of the resource class. The actions `save`, `remove` and `delete` are available on it\n *   as  methods with the `$` prefix. This allows you to easily perform CRUD operations (create,\n *   read, update, delete) on server-side data like this:\n *   ```js\n *   var User = $resource('/user/:userId', {userId:'@id'});\n *   var user = User.get({userId:123}, function() {\n *     user.abc = true;\n *     user.$save();\n *   });\n *   ```\n *\n *   It is important to realize that invoking a $resource object method immediately returns an\n *   empty reference (object or array depending on `isArray`). Once the data is returned from the\n *   server the existing reference is populated with the actual data. This is a useful trick since\n *   usually the resource is assigned to a model which is then rendered by the view. Having an empty\n *   object results in no rendering, once the data arrives from the server then the object is\n *   populated with the data and the view automatically re-renders itself showing the new data. This\n *   means that in most cases one never has to write a callback function for the action methods.\n *\n *   The action methods on the class object or instance object can be invoked with the following\n *   parameters:\n *\n *   - HTTP GET \"class\" actions: `Resource.action([parameters], [success], [error])`\n *   - non-GET \"class\" actions: `Resource.action([parameters], postData, [success], [error])`\n *   - non-GET instance actions:  `instance.$action([parameters], [success], [error])`\n *\n *\n *   Success callback is called with (value, responseHeaders) arguments, where the value is\n *   the populated resource instance or collection object. The error callback is called\n *   with (httpResponse) argument.\n *\n *   Class actions return empty instance (with additional properties below).\n *   Instance actions return promise of the action.\n *\n *   The Resource instances and collection have these additional properties:\n *\n *   - `$promise`: the {@link ng.$q promise} of the original server interaction that created this\n *     instance or collection.\n *\n *     On success, the promise is resolved with the same resource instance or collection object,\n *     updated with data from server. This makes it easy to use in\n *     {@link ngRoute.$routeProvider resolve section of $routeProvider.when()} to defer view\n *     rendering until the resource(s) are loaded.\n *\n *     On failure, the promise is resolved with the {@link ng.$http http response} object, without\n *     the `resource` property.\n *\n *     If an interceptor object was provided, the promise will instead be resolved with the value\n *     returned by the interceptor.\n *\n *   - `$resolved`: `true` after first server interaction is completed (either with success or\n *      rejection), `false` before that. Knowing if the Resource has been resolved is useful in\n *      data-binding.\n *\n * @example\n *\n * # Credit card resource\n *\n * ```js\n     // Define CreditCard class\n     var CreditCard = $resource('/user/:userId/card/:cardId',\n      {userId:123, cardId:'@id'}, {\n       charge: {method:'POST', params:{charge:true}}\n      });\n\n     // We can retrieve a collection from the server\n     var cards = CreditCard.query(function() {\n       // GET: /user/123/card\n       // server returns: [ {id:456, number:'1234', name:'Smith'} ];\n\n       var card = cards[0];\n       // each item is an instance of CreditCard\n       expect(card instanceof CreditCard).toEqual(true);\n       card.name = \"J. Smith\";\n       // non GET methods are mapped onto the instances\n       card.$save();\n       // POST: /user/123/card/456 {id:456, number:'1234', name:'J. Smith'}\n       // server returns: {id:456, number:'1234', name: 'J. Smith'};\n\n       // our custom method is mapped as well.\n       card.$charge({amount:9.99});\n       // POST: /user/123/card/456?amount=9.99&charge=true {id:456, number:'1234', name:'J. Smith'}\n     });\n\n     // we can create an instance as well\n     var newCard = new CreditCard({number:'0123'});\n     newCard.name = \"Mike Smith\";\n     newCard.$save();\n     // POST: /user/123/card {number:'0123', name:'Mike Smith'}\n     // server returns: {id:789, number:'0123', name: 'Mike Smith'};\n     expect(newCard.id).toEqual(789);\n * ```\n *\n * The object returned from this function execution is a resource \"class\" which has \"static\" method\n * for each action in the definition.\n *\n * Calling these methods invoke `$http` on the `url` template with the given `method`, `params` and\n * `headers`.\n * When the data is returned from the server then the object is an instance of the resource type and\n * all of the non-GET methods are available with `$` prefix. This allows you to easily support CRUD\n * operations (create, read, update, delete) on server-side data.\n\n   ```js\n     var User = $resource('/user/:userId', {userId:'@id'});\n     User.get({userId:123}, function(user) {\n       user.abc = true;\n       user.$save();\n     });\n   ```\n *\n * It's worth noting that the success callback for `get`, `query` and other methods gets passed\n * in the response that came from the server as well as $http header getter function, so one\n * could rewrite the above example and get access to http headers as:\n *\n   ```js\n     var User = $resource('/user/:userId', {userId:'@id'});\n     User.get({userId:123}, function(u, getResponseHeaders){\n       u.abc = true;\n       u.$save(function(u, putResponseHeaders) {\n         //u => saved user object\n         //putResponseHeaders => $http header getter\n       });\n     });\n   ```\n *\n * You can also access the raw `$http` promise via the `$promise` property on the object returned\n *\n   ```\n     var User = $resource('/user/:userId', {userId:'@id'});\n     User.get({userId:123})\n         .$promise.then(function(user) {\n           $scope.user = user;\n         });\n   ```\n\n * # Creating a custom 'PUT' request\n * In this example we create a custom method on our resource to make a PUT request\n * ```js\n *    var app = angular.module('app', ['ngResource', 'ngRoute']);\n *\n *    // Some APIs expect a PUT request in the format URL/object/ID\n *    // Here we are creating an 'update' method\n *    app.factory('Notes', ['$resource', function($resource) {\n *    return $resource('/notes/:id', null,\n *        {\n *            'update': { method:'PUT' }\n *        });\n *    }]);\n *\n *    // In our controller we get the ID from the URL using ngRoute and $routeParams\n *    // We pass in $routeParams and our Notes factory along with $scope\n *    app.controller('NotesCtrl', ['$scope', '$routeParams', 'Notes',\n                                      function($scope, $routeParams, Notes) {\n *    // First get a note object from the factory\n *    var note = Notes.get({ id:$routeParams.id });\n *    $id = note.id;\n *\n *    // Now call update passing in the ID first then the object you are updating\n *    Notes.update({ id:$id }, note);\n *\n *    // This will PUT /notes/ID with the note object in the request payload\n *    }]);\n * ```\n */\nangular.module('ngResource', ['ng']).\n  provider('$resource', function() {\n    var PROTOCOL_AND_DOMAIN_REGEX = /^https?:\\/\\/[^\\/]*/;\n    var provider = this;\n\n    this.defaults = {\n      // Strip slashes by default\n      stripTrailingSlashes: true,\n\n      // Default actions configuration\n      actions: {\n        'get': {method: 'GET'},\n        'save': {method: 'POST'},\n        'query': {method: 'GET', isArray: true},\n        'remove': {method: 'DELETE'},\n        'delete': {method: 'DELETE'}\n      }\n    };\n\n    this.$get = ['$http', '$q', function($http, $q) {\n\n      var noop = angular.noop,\n        forEach = angular.forEach,\n        extend = angular.extend,\n        copy = angular.copy,\n        isFunction = angular.isFunction;\n\n      /**\n       * We need our custom method because encodeURIComponent is too aggressive and doesn't follow\n       * http://www.ietf.org/rfc/rfc3986.txt with regards to the character set\n       * (pchar) allowed in path segments:\n       *    segment       = *pchar\n       *    pchar         = unreserved / pct-encoded / sub-delims / \":\" / \"@\"\n       *    pct-encoded   = \"%\" HEXDIG HEXDIG\n       *    unreserved    = ALPHA / DIGIT / \"-\" / \".\" / \"_\" / \"~\"\n       *    sub-delims    = \"!\" / \"$\" / \"&\" / \"'\" / \"(\" / \")\"\n       *                     / \"*\" / \"+\" / \",\" / \";\" / \"=\"\n       */\n      function encodeUriSegment(val) {\n        return encodeUriQuery(val, true).\n          replace(/%26/gi, '&').\n          replace(/%3D/gi, '=').\n          replace(/%2B/gi, '+');\n      }\n\n\n      /**\n       * This method is intended for encoding *key* or *value* parts of query component. We need a\n       * custom method because encodeURIComponent is too aggressive and encodes stuff that doesn't\n       * have to be encoded per http://tools.ietf.org/html/rfc3986:\n       *    query       = *( pchar / \"/\" / \"?\" )\n       *    pchar         = unreserved / pct-encoded / sub-delims / \":\" / \"@\"\n       *    unreserved    = ALPHA / DIGIT / \"-\" / \".\" / \"_\" / \"~\"\n       *    pct-encoded   = \"%\" HEXDIG HEXDIG\n       *    sub-delims    = \"!\" / \"$\" / \"&\" / \"'\" / \"(\" / \")\"\n       *                     / \"*\" / \"+\" / \",\" / \";\" / \"=\"\n       */\n      function encodeUriQuery(val, pctEncodeSpaces) {\n        return encodeURIComponent(val).\n          replace(/%40/gi, '@').\n          replace(/%3A/gi, ':').\n          replace(/%24/g, '$').\n          replace(/%2C/gi, ',').\n          replace(/%20/g, (pctEncodeSpaces ? '%20' : '+'));\n      }\n\n      function Route(template, defaults) {\n        this.template = template;\n        this.defaults = extend({}, provider.defaults, defaults);\n        this.urlParams = {};\n      }\n\n      Route.prototype = {\n        setUrlParams: function(config, params, actionUrl) {\n          var self = this,\n            url = actionUrl || self.template,\n            val,\n            encodedVal,\n            protocolAndDomain = '';\n\n          var urlParams = self.urlParams = {};\n          forEach(url.split(/\\W/), function(param) {\n            if (param === 'hasOwnProperty') {\n              throw $resourceMinErr('badname', \"hasOwnProperty is not a valid parameter name.\");\n            }\n            if (!(new RegExp(\"^\\\\d+$\").test(param)) && param &&\n              (new RegExp(\"(^|[^\\\\\\\\]):\" + param + \"(\\\\W|$)\").test(url))) {\n              urlParams[param] = true;\n            }\n          });\n          url = url.replace(/\\\\:/g, ':');\n          url = url.replace(PROTOCOL_AND_DOMAIN_REGEX, function(match) {\n            protocolAndDomain = match;\n            return '';\n          });\n\n          params = params || {};\n          forEach(self.urlParams, function(_, urlParam) {\n            val = params.hasOwnProperty(urlParam) ? params[urlParam] : self.defaults[urlParam];\n            if (angular.isDefined(val) && val !== null) {\n              encodedVal = encodeUriSegment(val);\n              url = url.replace(new RegExp(\":\" + urlParam + \"(\\\\W|$)\", \"g\"), function(match, p1) {\n                return encodedVal + p1;\n              });\n            } else {\n              url = url.replace(new RegExp(\"(\\/?):\" + urlParam + \"(\\\\W|$)\", \"g\"), function(match,\n                  leadingSlashes, tail) {\n                if (tail.charAt(0) == '/') {\n                  return tail;\n                } else {\n                  return leadingSlashes + tail;\n                }\n              });\n            }\n          });\n\n          // strip trailing slashes and set the url (unless this behavior is specifically disabled)\n          if (self.defaults.stripTrailingSlashes) {\n            url = url.replace(/\\/+$/, '') || '/';\n          }\n\n          // then replace collapse `/.` if found in the last URL path segment before the query\n          // E.g. `http://url.com/id./format?q=x` becomes `http://url.com/id.format?q=x`\n          url = url.replace(/\\/\\.(?=\\w+($|\\?))/, '.');\n          // replace escaped `/\\.` with `/.`\n          config.url = protocolAndDomain + url.replace(/\\/\\\\\\./, '/.');\n\n\n          // set params - delegate param encoding to $http\n          forEach(params, function(value, key) {\n            if (!self.urlParams[key]) {\n              config.params = config.params || {};\n              config.params[key] = value;\n            }\n          });\n        }\n      };\n\n\n      function resourceFactory(url, paramDefaults, actions, options) {\n        var route = new Route(url, options);\n\n        actions = extend({}, provider.defaults.actions, actions);\n\n        function extractParams(data, actionParams) {\n          var ids = {};\n          actionParams = extend({}, paramDefaults, actionParams);\n          forEach(actionParams, function(value, key) {\n            if (isFunction(value)) { value = value(); }\n            ids[key] = value && value.charAt && value.charAt(0) == '@' ?\n              lookupDottedPath(data, value.substr(1)) : value;\n          });\n          return ids;\n        }\n\n        function defaultResponseInterceptor(response) {\n          return response.resource;\n        }\n\n        function Resource(value) {\n          shallowClearAndCopy(value || {}, this);\n        }\n\n        Resource.prototype.toJSON = function() {\n          var data = extend({}, this);\n          delete data.$promise;\n          delete data.$resolved;\n          return data;\n        };\n\n        forEach(actions, function(action, name) {\n          var hasBody = /^(POST|PUT|PATCH)$/i.test(action.method);\n\n          Resource[name] = function(a1, a2, a3, a4) {\n            var params = {}, data, success, error;\n\n            /* jshint -W086 */ /* (purposefully fall through case statements) */\n            switch (arguments.length) {\n              case 4:\n                error = a4;\n                success = a3;\n              //fallthrough\n              case 3:\n              case 2:\n                if (isFunction(a2)) {\n                  if (isFunction(a1)) {\n                    success = a1;\n                    error = a2;\n                    break;\n                  }\n\n                  success = a2;\n                  error = a3;\n                  //fallthrough\n                } else {\n                  params = a1;\n                  data = a2;\n                  success = a3;\n                  break;\n                }\n              case 1:\n                if (isFunction(a1)) success = a1;\n                else if (hasBody) data = a1;\n                else params = a1;\n                break;\n              case 0: break;\n              default:\n                throw $resourceMinErr('badargs',\n                  \"Expected up to 4 arguments [params, data, success, error], got {0} arguments\",\n                  arguments.length);\n            }\n            /* jshint +W086 */ /* (purposefully fall through case statements) */\n\n            var isInstanceCall = this instanceof Resource;\n            var value = isInstanceCall ? data : (action.isArray ? [] : new Resource(data));\n            var httpConfig = {};\n            var responseInterceptor = action.interceptor && action.interceptor.response ||\n              defaultResponseInterceptor;\n            var responseErrorInterceptor = action.interceptor && action.interceptor.responseError ||\n              undefined;\n\n            forEach(action, function(value, key) {\n              if (key != 'params' && key != 'isArray' && key != 'interceptor') {\n                httpConfig[key] = copy(value);\n              }\n            });\n\n            if (hasBody) httpConfig.data = data;\n            route.setUrlParams(httpConfig,\n              extend({}, extractParams(data, action.params || {}), params),\n              action.url);\n\n            var promise = $http(httpConfig).then(function(response) {\n              var data = response.data,\n                promise = value.$promise;\n\n              if (data) {\n                // Need to convert action.isArray to boolean in case it is undefined\n                // jshint -W018\n                if (angular.isArray(data) !== (!!action.isArray)) {\n                  throw $resourceMinErr('badcfg',\n                      'Error in resource configuration for action `{0}`. Expected response to ' +\n                      'contain an {1} but got an {2} (Request: {3} {4})', name, action.isArray ? 'array' : 'object',\n                    angular.isArray(data) ? 'array' : 'object', httpConfig.method, httpConfig.url);\n                }\n                // jshint +W018\n                if (action.isArray) {\n                  value.length = 0;\n                  forEach(data, function(item) {\n                    if (typeof item === \"object\") {\n                      value.push(new Resource(item));\n                    } else {\n                      // Valid JSON values may be string literals, and these should not be converted\n                      // into objects. These items will not have access to the Resource prototype\n                      // methods, but unfortunately there\n                      value.push(item);\n                    }\n                  });\n                } else {\n                  shallowClearAndCopy(data, value);\n                  value.$promise = promise;\n                }\n              }\n\n              value.$resolved = true;\n\n              response.resource = value;\n\n              return response;\n            }, function(response) {\n              value.$resolved = true;\n\n              (error || noop)(response);\n\n              return $q.reject(response);\n            });\n\n            promise = promise.then(\n              function(response) {\n                var value = responseInterceptor(response);\n                (success || noop)(value, response.headers);\n                return value;\n              },\n              responseErrorInterceptor);\n\n            if (!isInstanceCall) {\n              // we are creating instance / collection\n              // - set the initial promise\n              // - return the instance / collection\n              value.$promise = promise;\n              value.$resolved = false;\n\n              return value;\n            }\n\n            // instance call\n            return promise;\n          };\n\n\n          Resource.prototype['$' + name] = function(params, success, error) {\n            if (isFunction(params)) {\n              error = success; success = params; params = {};\n            }\n            var result = Resource[name].call(this, params, this, success, error);\n            return result.$promise || result;\n          };\n        });\n\n        Resource.bind = function(additionalParamDefaults) {\n          return resourceFactory(url, extend({}, paramDefaults, additionalParamDefaults), actions);\n        };\n\n        return Resource;\n      }\n\n      return resourceFactory;\n    }];\n  });\n\n\n})(window, window.angular);\n\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTcuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ib3dlcl9jb21wb25lbnRzL2FuZ3VsYXItcmVzb3VyY2UvYW5ndWxhci1yZXNvdXJjZS5qcz9lNzY2Il0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2UgQW5ndWxhckpTIHYxLjQuNlxuICogKGMpIDIwMTAtMjAxNSBHb29nbGUsIEluYy4gaHR0cDovL2FuZ3VsYXJqcy5vcmdcbiAqIExpY2Vuc2U6IE1JVFxuICovXG4oZnVuY3Rpb24od2luZG93LCBhbmd1bGFyLCB1bmRlZmluZWQpIHsndXNlIHN0cmljdCc7XG5cbnZhciAkcmVzb3VyY2VNaW5FcnIgPSBhbmd1bGFyLiQkbWluRXJyKCckcmVzb3VyY2UnKTtcblxuLy8gSGVscGVyIGZ1bmN0aW9ucyBhbmQgcmVnZXggdG8gbG9va3VwIGEgZG90dGVkIHBhdGggb24gYW4gb2JqZWN0XG4vLyBzdG9wcGluZyBhdCB1bmRlZmluZWQvbnVsbC4gIFRoZSBwYXRoIG11c3QgYmUgY29tcG9zZWQgb2YgQVNDSUlcbi8vIGlkZW50aWZpZXJzIChqdXN0IGxpa2UgJHBhcnNlKVxudmFyIE1FTUJFUl9OQU1FX1JFR0VYID0gL14oXFwuW2EtekEtWl8kQF1bMC05YS16QS1aXyRAXSopKyQvO1xuXG5mdW5jdGlvbiBpc1ZhbGlkRG90dGVkUGF0aChwYXRoKSB7XG4gIHJldHVybiAocGF0aCAhPSBudWxsICYmIHBhdGggIT09ICcnICYmIHBhdGggIT09ICdoYXNPd25Qcm9wZXJ0eScgJiZcbiAgICAgIE1FTUJFUl9OQU1FX1JFR0VYLnRlc3QoJy4nICsgcGF0aCkpO1xufVxuXG5mdW5jdGlvbiBsb29rdXBEb3R0ZWRQYXRoKG9iaiwgcGF0aCkge1xuICBpZiAoIWlzVmFsaWREb3R0ZWRQYXRoKHBhdGgpKSB7XG4gICAgdGhyb3cgJHJlc291cmNlTWluRXJyKCdiYWRtZW1iZXInLCAnRG90dGVkIG1lbWJlciBwYXRoIFwiQHswfVwiIGlzIGludmFsaWQuJywgcGF0aCk7XG4gIH1cbiAgdmFyIGtleXMgPSBwYXRoLnNwbGl0KCcuJyk7XG4gIGZvciAodmFyIGkgPSAwLCBpaSA9IGtleXMubGVuZ3RoOyBpIDwgaWkgJiYgYW5ndWxhci5pc0RlZmluZWQob2JqKTsgaSsrKSB7XG4gICAgdmFyIGtleSA9IGtleXNbaV07XG4gICAgb2JqID0gKG9iaiAhPT0gbnVsbCkgPyBvYmpba2V5XSA6IHVuZGVmaW5lZDtcbiAgfVxuICByZXR1cm4gb2JqO1xufVxuXG4vKipcbiAqIENyZWF0ZSBhIHNoYWxsb3cgY29weSBvZiBhbiBvYmplY3QgYW5kIGNsZWFyIG90aGVyIGZpZWxkcyBmcm9tIHRoZSBkZXN0aW5hdGlvblxuICovXG5mdW5jdGlvbiBzaGFsbG93Q2xlYXJBbmRDb3B5KHNyYywgZHN0KSB7XG4gIGRzdCA9IGRzdCB8fCB7fTtcblxuICBhbmd1bGFyLmZvckVhY2goZHN0LCBmdW5jdGlvbih2YWx1ZSwga2V5KSB7XG4gICAgZGVsZXRlIGRzdFtrZXldO1xuICB9KTtcblxuICBmb3IgKHZhciBrZXkgaW4gc3JjKSB7XG4gICAgaWYgKHNyYy5oYXNPd25Qcm9wZXJ0eShrZXkpICYmICEoa2V5LmNoYXJBdCgwKSA9PT0gJyQnICYmIGtleS5jaGFyQXQoMSkgPT09ICckJykpIHtcbiAgICAgIGRzdFtrZXldID0gc3JjW2tleV07XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGRzdDtcbn1cblxuLyoqXG4gKiBAbmdkb2MgbW9kdWxlXG4gKiBAbmFtZSBuZ1Jlc291cmNlXG4gKiBAZGVzY3JpcHRpb25cbiAqXG4gKiAjIG5nUmVzb3VyY2VcbiAqXG4gKiBUaGUgYG5nUmVzb3VyY2VgIG1vZHVsZSBwcm92aWRlcyBpbnRlcmFjdGlvbiBzdXBwb3J0IHdpdGggUkVTVGZ1bCBzZXJ2aWNlc1xuICogdmlhIHRoZSAkcmVzb3VyY2Ugc2VydmljZS5cbiAqXG4gKlxuICogPGRpdiBkb2MtbW9kdWxlLWNvbXBvbmVudHM9XCJuZ1Jlc291cmNlXCI+PC9kaXY+XG4gKlxuICogU2VlIHtAbGluayBuZ1Jlc291cmNlLiRyZXNvdXJjZSBgJHJlc291cmNlYH0gZm9yIHVzYWdlLlxuICovXG5cbi8qKlxuICogQG5nZG9jIHNlcnZpY2VcbiAqIEBuYW1lICRyZXNvdXJjZVxuICogQHJlcXVpcmVzICRodHRwXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBBIGZhY3Rvcnkgd2hpY2ggY3JlYXRlcyBhIHJlc291cmNlIG9iamVjdCB0aGF0IGxldHMgeW91IGludGVyYWN0IHdpdGhcbiAqIFtSRVNUZnVsXShodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1JlcHJlc2VudGF0aW9uYWxfU3RhdGVfVHJhbnNmZXIpIHNlcnZlci1zaWRlIGRhdGEgc291cmNlcy5cbiAqXG4gKiBUaGUgcmV0dXJuZWQgcmVzb3VyY2Ugb2JqZWN0IGhhcyBhY3Rpb24gbWV0aG9kcyB3aGljaCBwcm92aWRlIGhpZ2gtbGV2ZWwgYmVoYXZpb3JzIHdpdGhvdXRcbiAqIHRoZSBuZWVkIHRvIGludGVyYWN0IHdpdGggdGhlIGxvdyBsZXZlbCB7QGxpbmsgbmcuJGh0dHAgJGh0dHB9IHNlcnZpY2UuXG4gKlxuICogUmVxdWlyZXMgdGhlIHtAbGluayBuZ1Jlc291cmNlIGBuZ1Jlc291cmNlYH0gbW9kdWxlIHRvIGJlIGluc3RhbGxlZC5cbiAqXG4gKiBCeSBkZWZhdWx0LCB0cmFpbGluZyBzbGFzaGVzIHdpbGwgYmUgc3RyaXBwZWQgZnJvbSB0aGUgY2FsY3VsYXRlZCBVUkxzLFxuICogd2hpY2ggY2FuIHBvc2UgcHJvYmxlbXMgd2l0aCBzZXJ2ZXIgYmFja2VuZHMgdGhhdCBkbyBub3QgZXhwZWN0IHRoYXRcbiAqIGJlaGF2aW9yLiAgVGhpcyBjYW4gYmUgZGlzYWJsZWQgYnkgY29uZmlndXJpbmcgdGhlIGAkcmVzb3VyY2VQcm92aWRlcmAgbGlrZVxuICogdGhpczpcbiAqXG4gKiBgYGBqc1xuICAgICBhcHAuY29uZmlnKFsnJHJlc291cmNlUHJvdmlkZXInLCBmdW5jdGlvbigkcmVzb3VyY2VQcm92aWRlcikge1xuICAgICAgIC8vIERvbid0IHN0cmlwIHRyYWlsaW5nIHNsYXNoZXMgZnJvbSBjYWxjdWxhdGVkIFVSTHNcbiAgICAgICAkcmVzb3VyY2VQcm92aWRlci5kZWZhdWx0cy5zdHJpcFRyYWlsaW5nU2xhc2hlcyA9IGZhbHNlO1xuICAgICB9XSk7XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gdXJsIEEgcGFyYW1ldGVyaXplZCBVUkwgdGVtcGxhdGUgd2l0aCBwYXJhbWV0ZXJzIHByZWZpeGVkIGJ5IGA6YCBhcyBpblxuICogICBgL3VzZXIvOnVzZXJuYW1lYC4gSWYgeW91IGFyZSB1c2luZyBhIFVSTCB3aXRoIGEgcG9ydCBudW1iZXIgKGUuZy5cbiAqICAgYGh0dHA6Ly9leGFtcGxlLmNvbTo4MDgwL2FwaWApLCBpdCB3aWxsIGJlIHJlc3BlY3RlZC5cbiAqXG4gKiAgIElmIHlvdSBhcmUgdXNpbmcgYSB1cmwgd2l0aCBhIHN1ZmZpeCwganVzdCBhZGQgdGhlIHN1ZmZpeCwgbGlrZSB0aGlzOlxuICogICBgJHJlc291cmNlKCdodHRwOi8vZXhhbXBsZS5jb20vcmVzb3VyY2UuanNvbicpYCBvciBgJHJlc291cmNlKCdodHRwOi8vZXhhbXBsZS5jb20vOmlkLmpzb24nKWBcbiAqICAgb3IgZXZlbiBgJHJlc291cmNlKCdodHRwOi8vZXhhbXBsZS5jb20vcmVzb3VyY2UvOnJlc291cmNlX2lkLjpmb3JtYXQnKWBcbiAqICAgSWYgdGhlIHBhcmFtZXRlciBiZWZvcmUgdGhlIHN1ZmZpeCBpcyBlbXB0eSwgOnJlc291cmNlX2lkIGluIHRoaXMgY2FzZSwgdGhlbiB0aGUgYC8uYCB3aWxsIGJlXG4gKiAgIGNvbGxhcHNlZCBkb3duIHRvIGEgc2luZ2xlIGAuYC4gIElmIHlvdSBuZWVkIHRoaXMgc2VxdWVuY2UgdG8gYXBwZWFyIGFuZCBub3QgY29sbGFwc2UgdGhlbiB5b3VcbiAqICAgY2FuIGVzY2FwZSBpdCB3aXRoIGAvXFwuYC5cbiAqXG4gKiBAcGFyYW0ge09iamVjdD19IHBhcmFtRGVmYXVsdHMgRGVmYXVsdCB2YWx1ZXMgZm9yIGB1cmxgIHBhcmFtZXRlcnMuIFRoZXNlIGNhbiBiZSBvdmVycmlkZGVuIGluXG4gKiAgIGBhY3Rpb25zYCBtZXRob2RzLiBJZiBhbnkgb2YgdGhlIHBhcmFtZXRlciB2YWx1ZSBpcyBhIGZ1bmN0aW9uLCBpdCB3aWxsIGJlIGV4ZWN1dGVkIGV2ZXJ5IHRpbWVcbiAqICAgd2hlbiBhIHBhcmFtIHZhbHVlIG5lZWRzIHRvIGJlIG9idGFpbmVkIGZvciBhIHJlcXVlc3QgKHVubGVzcyB0aGUgcGFyYW0gd2FzIG92ZXJyaWRkZW4pLlxuICpcbiAqICAgRWFjaCBrZXkgdmFsdWUgaW4gdGhlIHBhcmFtZXRlciBvYmplY3QgaXMgZmlyc3QgYm91bmQgdG8gdXJsIHRlbXBsYXRlIGlmIHByZXNlbnQgYW5kIHRoZW4gYW55XG4gKiAgIGV4Y2VzcyBrZXlzIGFyZSBhcHBlbmRlZCB0byB0aGUgdXJsIHNlYXJjaCBxdWVyeSBhZnRlciB0aGUgYD9gLlxuICpcbiAqICAgR2l2ZW4gYSB0ZW1wbGF0ZSBgL3BhdGgvOnZlcmJgIGFuZCBwYXJhbWV0ZXIgYHt2ZXJiOidncmVldCcsIHNhbHV0YXRpb246J0hlbGxvJ31gIHJlc3VsdHMgaW5cbiAqICAgVVJMIGAvcGF0aC9ncmVldD9zYWx1dGF0aW9uPUhlbGxvYC5cbiAqXG4gKiAgIElmIHRoZSBwYXJhbWV0ZXIgdmFsdWUgaXMgcHJlZml4ZWQgd2l0aCBgQGAgdGhlbiB0aGUgdmFsdWUgZm9yIHRoYXQgcGFyYW1ldGVyIHdpbGwgYmUgZXh0cmFjdGVkXG4gKiAgIGZyb20gdGhlIGNvcnJlc3BvbmRpbmcgcHJvcGVydHkgb24gdGhlIGBkYXRhYCBvYmplY3QgKHByb3ZpZGVkIHdoZW4gY2FsbGluZyBhbiBhY3Rpb24gbWV0aG9kKS4gIEZvclxuICogICBleGFtcGxlLCBpZiB0aGUgYGRlZmF1bHRQYXJhbWAgb2JqZWN0IGlzIGB7c29tZVBhcmFtOiAnQHNvbWVQcm9wJ31gIHRoZW4gdGhlIHZhbHVlIG9mIGBzb21lUGFyYW1gXG4gKiAgIHdpbGwgYmUgYGRhdGEuc29tZVByb3BgLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0LjxPYmplY3Q+PX0gYWN0aW9ucyBIYXNoIHdpdGggZGVjbGFyYXRpb24gb2YgY3VzdG9tIGFjdGlvbnMgdGhhdCBzaG91bGQgZXh0ZW5kXG4gKiAgIHRoZSBkZWZhdWx0IHNldCBvZiByZXNvdXJjZSBhY3Rpb25zLiBUaGUgZGVjbGFyYXRpb24gc2hvdWxkIGJlIGNyZWF0ZWQgaW4gdGhlIGZvcm1hdCBvZiB7QGxpbmtcbiAqICAgbmcuJGh0dHAjdXNhZ2UgJGh0dHAuY29uZmlnfTpcbiAqXG4gKiAgICAgICB7YWN0aW9uMToge21ldGhvZDo/LCBwYXJhbXM6PywgaXNBcnJheTo/LCBoZWFkZXJzOj8sIC4uLn0sXG4gKiAgICAgICAgYWN0aW9uMjoge21ldGhvZDo/LCBwYXJhbXM6PywgaXNBcnJheTo/LCBoZWFkZXJzOj8sIC4uLn0sXG4gKiAgICAgICAgLi4ufVxuICpcbiAqICAgV2hlcmU6XG4gKlxuICogICAtICoqYGFjdGlvbmAqKiDigJMge3N0cmluZ30g4oCTIFRoZSBuYW1lIG9mIGFjdGlvbi4gVGhpcyBuYW1lIGJlY29tZXMgdGhlIG5hbWUgb2YgdGhlIG1ldGhvZCBvblxuICogICAgIHlvdXIgcmVzb3VyY2Ugb2JqZWN0LlxuICogICAtICoqYG1ldGhvZGAqKiDigJMge3N0cmluZ30g4oCTIENhc2UgaW5zZW5zaXRpdmUgSFRUUCBtZXRob2QgKGUuZy4gYEdFVGAsIGBQT1NUYCwgYFBVVGAsXG4gKiAgICAgYERFTEVURWAsIGBKU09OUGAsIGV0YykuXG4gKiAgIC0gKipgcGFyYW1zYCoqIOKAkyB7T2JqZWN0PX0g4oCTIE9wdGlvbmFsIHNldCBvZiBwcmUtYm91bmQgcGFyYW1ldGVycyBmb3IgdGhpcyBhY3Rpb24uIElmIGFueSBvZlxuICogICAgIHRoZSBwYXJhbWV0ZXIgdmFsdWUgaXMgYSBmdW5jdGlvbiwgaXQgd2lsbCBiZSBleGVjdXRlZCBldmVyeSB0aW1lIHdoZW4gYSBwYXJhbSB2YWx1ZSBuZWVkcyB0b1xuICogICAgIGJlIG9idGFpbmVkIGZvciBhIHJlcXVlc3QgKHVubGVzcyB0aGUgcGFyYW0gd2FzIG92ZXJyaWRkZW4pLlxuICogICAtICoqYHVybGAqKiDigJMge3N0cmluZ30g4oCTIGFjdGlvbiBzcGVjaWZpYyBgdXJsYCBvdmVycmlkZS4gVGhlIHVybCB0ZW1wbGF0aW5nIGlzIHN1cHBvcnRlZCBqdXN0XG4gKiAgICAgbGlrZSBmb3IgdGhlIHJlc291cmNlLWxldmVsIHVybHMuXG4gKiAgIC0gKipgaXNBcnJheWAqKiDigJMge2Jvb2xlYW49fSDigJMgSWYgdHJ1ZSB0aGVuIHRoZSByZXR1cm5lZCBvYmplY3QgZm9yIHRoaXMgYWN0aW9uIGlzIGFuIGFycmF5LFxuICogICAgIHNlZSBgcmV0dXJuc2Agc2VjdGlvbi5cbiAqICAgLSAqKmB0cmFuc2Zvcm1SZXF1ZXN0YCoqIOKAk1xuICogICAgIGB7ZnVuY3Rpb24oZGF0YSwgaGVhZGVyc0dldHRlcil8QXJyYXkuPGZ1bmN0aW9uKGRhdGEsIGhlYWRlcnNHZXR0ZXIpPn1gIOKAk1xuICogICAgIHRyYW5zZm9ybSBmdW5jdGlvbiBvciBhbiBhcnJheSBvZiBzdWNoIGZ1bmN0aW9ucy4gVGhlIHRyYW5zZm9ybSBmdW5jdGlvbiB0YWtlcyB0aGUgaHR0cFxuICogICAgIHJlcXVlc3QgYm9keSBhbmQgaGVhZGVycyBhbmQgcmV0dXJucyBpdHMgdHJhbnNmb3JtZWQgKHR5cGljYWxseSBzZXJpYWxpemVkKSB2ZXJzaW9uLlxuICogICAgIEJ5IGRlZmF1bHQsIHRyYW5zZm9ybVJlcXVlc3Qgd2lsbCBjb250YWluIG9uZSBmdW5jdGlvbiB0aGF0IGNoZWNrcyBpZiB0aGUgcmVxdWVzdCBkYXRhIGlzXG4gKiAgICAgYW4gb2JqZWN0IGFuZCBzZXJpYWxpemVzIHRvIHVzaW5nIGBhbmd1bGFyLnRvSnNvbmAuIFRvIHByZXZlbnQgdGhpcyBiZWhhdmlvciwgc2V0XG4gKiAgICAgYHRyYW5zZm9ybVJlcXVlc3RgIHRvIGFuIGVtcHR5IGFycmF5OiBgdHJhbnNmb3JtUmVxdWVzdDogW11gXG4gKiAgIC0gKipgdHJhbnNmb3JtUmVzcG9uc2VgKiog4oCTXG4gKiAgICAgYHtmdW5jdGlvbihkYXRhLCBoZWFkZXJzR2V0dGVyKXxBcnJheS48ZnVuY3Rpb24oZGF0YSwgaGVhZGVyc0dldHRlcik+fWAg4oCTXG4gKiAgICAgdHJhbnNmb3JtIGZ1bmN0aW9uIG9yIGFuIGFycmF5IG9mIHN1Y2ggZnVuY3Rpb25zLiBUaGUgdHJhbnNmb3JtIGZ1bmN0aW9uIHRha2VzIHRoZSBodHRwXG4gKiAgICAgcmVzcG9uc2UgYm9keSBhbmQgaGVhZGVycyBhbmQgcmV0dXJucyBpdHMgdHJhbnNmb3JtZWQgKHR5cGljYWxseSBkZXNlcmlhbGl6ZWQpIHZlcnNpb24uXG4gKiAgICAgQnkgZGVmYXVsdCwgdHJhbnNmb3JtUmVzcG9uc2Ugd2lsbCBjb250YWluIG9uZSBmdW5jdGlvbiB0aGF0IGNoZWNrcyBpZiB0aGUgcmVzcG9uc2UgbG9va3MgbGlrZVxuICogICAgIGEgSlNPTiBzdHJpbmcgYW5kIGRlc2VyaWFsaXplcyBpdCB1c2luZyBgYW5ndWxhci5mcm9tSnNvbmAuIFRvIHByZXZlbnQgdGhpcyBiZWhhdmlvciwgc2V0XG4gKiAgICAgYHRyYW5zZm9ybVJlc3BvbnNlYCB0byBhbiBlbXB0eSBhcnJheTogYHRyYW5zZm9ybVJlc3BvbnNlOiBbXWBcbiAqICAgLSAqKmBjYWNoZWAqKiDigJMgYHtib29sZWFufENhY2hlfWAg4oCTIElmIHRydWUsIGEgZGVmYXVsdCAkaHR0cCBjYWNoZSB3aWxsIGJlIHVzZWQgdG8gY2FjaGUgdGhlXG4gKiAgICAgR0VUIHJlcXVlc3QsIG90aGVyd2lzZSBpZiBhIGNhY2hlIGluc3RhbmNlIGJ1aWx0IHdpdGhcbiAqICAgICB7QGxpbmsgbmcuJGNhY2hlRmFjdG9yeSAkY2FjaGVGYWN0b3J5fSwgdGhpcyBjYWNoZSB3aWxsIGJlIHVzZWQgZm9yXG4gKiAgICAgY2FjaGluZy5cbiAqICAgLSAqKmB0aW1lb3V0YCoqIOKAkyBge251bWJlcnxQcm9taXNlfWAg4oCTIHRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzLCBvciB7QGxpbmsgbmcuJHEgcHJvbWlzZX0gdGhhdFxuICogICAgIHNob3VsZCBhYm9ydCB0aGUgcmVxdWVzdCB3aGVuIHJlc29sdmVkLlxuICogICAtICoqYHdpdGhDcmVkZW50aWFsc2AqKiAtIGB7Ym9vbGVhbn1gIC0gd2hldGhlciB0byBzZXQgdGhlIGB3aXRoQ3JlZGVudGlhbHNgIGZsYWcgb24gdGhlXG4gKiAgICAgWEhSIG9iamVjdC4gU2VlXG4gKiAgICAgW3JlcXVlc3RzIHdpdGggY3JlZGVudGlhbHNdKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuL2h0dHBfYWNjZXNzX2NvbnRyb2wjc2VjdGlvbl81KVxuICogICAgIGZvciBtb3JlIGluZm9ybWF0aW9uLlxuICogICAtICoqYHJlc3BvbnNlVHlwZWAqKiAtIGB7c3RyaW5nfWAgLSBzZWVcbiAqICAgICBbcmVxdWVzdFR5cGVdKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvRE9NL1hNTEh0dHBSZXF1ZXN0I3Jlc3BvbnNlVHlwZSkuXG4gKiAgIC0gKipgaW50ZXJjZXB0b3JgKiogLSBge09iamVjdD19YCAtIFRoZSBpbnRlcmNlcHRvciBvYmplY3QgaGFzIHR3byBvcHRpb25hbCBtZXRob2RzIC1cbiAqICAgICBgcmVzcG9uc2VgIGFuZCBgcmVzcG9uc2VFcnJvcmAuIEJvdGggYHJlc3BvbnNlYCBhbmQgYHJlc3BvbnNlRXJyb3JgIGludGVyY2VwdG9ycyBnZXQgY2FsbGVkXG4gKiAgICAgd2l0aCBgaHR0cCByZXNwb25zZWAgb2JqZWN0LiBTZWUge0BsaW5rIG5nLiRodHRwICRodHRwIGludGVyY2VwdG9yc30uXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgSGFzaCB3aXRoIGN1c3RvbSBzZXR0aW5ncyB0aGF0IHNob3VsZCBleHRlbmQgdGhlXG4gKiAgIGRlZmF1bHQgYCRyZXNvdXJjZVByb3ZpZGVyYCBiZWhhdmlvci4gIFRoZSBvbmx5IHN1cHBvcnRlZCBvcHRpb24gaXNcbiAqXG4gKiAgIFdoZXJlOlxuICpcbiAqICAgLSAqKmBzdHJpcFRyYWlsaW5nU2xhc2hlc2AqKiDigJMge2Jvb2xlYW59IOKAkyBJZiB0cnVlIHRoZW4gdGhlIHRyYWlsaW5nXG4gKiAgIHNsYXNoZXMgZnJvbSBhbnkgY2FsY3VsYXRlZCBVUkwgd2lsbCBiZSBzdHJpcHBlZC4gKERlZmF1bHRzIHRvIHRydWUuKVxuICpcbiAqIEByZXR1cm5zIHtPYmplY3R9IEEgcmVzb3VyY2UgXCJjbGFzc1wiIG9iamVjdCB3aXRoIG1ldGhvZHMgZm9yIHRoZSBkZWZhdWx0IHNldCBvZiByZXNvdXJjZSBhY3Rpb25zXG4gKiAgIG9wdGlvbmFsbHkgZXh0ZW5kZWQgd2l0aCBjdXN0b20gYGFjdGlvbnNgLiBUaGUgZGVmYXVsdCBzZXQgY29udGFpbnMgdGhlc2UgYWN0aW9uczpcbiAqICAgYGBganNcbiAqICAgeyAnZ2V0JzogICAge21ldGhvZDonR0VUJ30sXG4gKiAgICAgJ3NhdmUnOiAgIHttZXRob2Q6J1BPU1QnfSxcbiAqICAgICAncXVlcnknOiAge21ldGhvZDonR0VUJywgaXNBcnJheTp0cnVlfSxcbiAqICAgICAncmVtb3ZlJzoge21ldGhvZDonREVMRVRFJ30sXG4gKiAgICAgJ2RlbGV0ZSc6IHttZXRob2Q6J0RFTEVURSd9IH07XG4gKiAgIGBgYFxuICpcbiAqICAgQ2FsbGluZyB0aGVzZSBtZXRob2RzIGludm9rZSBhbiB7QGxpbmsgbmcuJGh0dHB9IHdpdGggdGhlIHNwZWNpZmllZCBodHRwIG1ldGhvZCxcbiAqICAgZGVzdGluYXRpb24gYW5kIHBhcmFtZXRlcnMuIFdoZW4gdGhlIGRhdGEgaXMgcmV0dXJuZWQgZnJvbSB0aGUgc2VydmVyIHRoZW4gdGhlIG9iamVjdCBpcyBhblxuICogICBpbnN0YW5jZSBvZiB0aGUgcmVzb3VyY2UgY2xhc3MuIFRoZSBhY3Rpb25zIGBzYXZlYCwgYHJlbW92ZWAgYW5kIGBkZWxldGVgIGFyZSBhdmFpbGFibGUgb24gaXRcbiAqICAgYXMgIG1ldGhvZHMgd2l0aCB0aGUgYCRgIHByZWZpeC4gVGhpcyBhbGxvd3MgeW91IHRvIGVhc2lseSBwZXJmb3JtIENSVUQgb3BlcmF0aW9ucyAoY3JlYXRlLFxuICogICByZWFkLCB1cGRhdGUsIGRlbGV0ZSkgb24gc2VydmVyLXNpZGUgZGF0YSBsaWtlIHRoaXM6XG4gKiAgIGBgYGpzXG4gKiAgIHZhciBVc2VyID0gJHJlc291cmNlKCcvdXNlci86dXNlcklkJywge3VzZXJJZDonQGlkJ30pO1xuICogICB2YXIgdXNlciA9IFVzZXIuZ2V0KHt1c2VySWQ6MTIzfSwgZnVuY3Rpb24oKSB7XG4gKiAgICAgdXNlci5hYmMgPSB0cnVlO1xuICogICAgIHVzZXIuJHNhdmUoKTtcbiAqICAgfSk7XG4gKiAgIGBgYFxuICpcbiAqICAgSXQgaXMgaW1wb3J0YW50IHRvIHJlYWxpemUgdGhhdCBpbnZva2luZyBhICRyZXNvdXJjZSBvYmplY3QgbWV0aG9kIGltbWVkaWF0ZWx5IHJldHVybnMgYW5cbiAqICAgZW1wdHkgcmVmZXJlbmNlIChvYmplY3Qgb3IgYXJyYXkgZGVwZW5kaW5nIG9uIGBpc0FycmF5YCkuIE9uY2UgdGhlIGRhdGEgaXMgcmV0dXJuZWQgZnJvbSB0aGVcbiAqICAgc2VydmVyIHRoZSBleGlzdGluZyByZWZlcmVuY2UgaXMgcG9wdWxhdGVkIHdpdGggdGhlIGFjdHVhbCBkYXRhLiBUaGlzIGlzIGEgdXNlZnVsIHRyaWNrIHNpbmNlXG4gKiAgIHVzdWFsbHkgdGhlIHJlc291cmNlIGlzIGFzc2lnbmVkIHRvIGEgbW9kZWwgd2hpY2ggaXMgdGhlbiByZW5kZXJlZCBieSB0aGUgdmlldy4gSGF2aW5nIGFuIGVtcHR5XG4gKiAgIG9iamVjdCByZXN1bHRzIGluIG5vIHJlbmRlcmluZywgb25jZSB0aGUgZGF0YSBhcnJpdmVzIGZyb20gdGhlIHNlcnZlciB0aGVuIHRoZSBvYmplY3QgaXNcbiAqICAgcG9wdWxhdGVkIHdpdGggdGhlIGRhdGEgYW5kIHRoZSB2aWV3IGF1dG9tYXRpY2FsbHkgcmUtcmVuZGVycyBpdHNlbGYgc2hvd2luZyB0aGUgbmV3IGRhdGEuIFRoaXNcbiAqICAgbWVhbnMgdGhhdCBpbiBtb3N0IGNhc2VzIG9uZSBuZXZlciBoYXMgdG8gd3JpdGUgYSBjYWxsYmFjayBmdW5jdGlvbiBmb3IgdGhlIGFjdGlvbiBtZXRob2RzLlxuICpcbiAqICAgVGhlIGFjdGlvbiBtZXRob2RzIG9uIHRoZSBjbGFzcyBvYmplY3Qgb3IgaW5zdGFuY2Ugb2JqZWN0IGNhbiBiZSBpbnZva2VkIHdpdGggdGhlIGZvbGxvd2luZ1xuICogICBwYXJhbWV0ZXJzOlxuICpcbiAqICAgLSBIVFRQIEdFVCBcImNsYXNzXCIgYWN0aW9uczogYFJlc291cmNlLmFjdGlvbihbcGFyYW1ldGVyc10sIFtzdWNjZXNzXSwgW2Vycm9yXSlgXG4gKiAgIC0gbm9uLUdFVCBcImNsYXNzXCIgYWN0aW9uczogYFJlc291cmNlLmFjdGlvbihbcGFyYW1ldGVyc10sIHBvc3REYXRhLCBbc3VjY2Vzc10sIFtlcnJvcl0pYFxuICogICAtIG5vbi1HRVQgaW5zdGFuY2UgYWN0aW9uczogIGBpbnN0YW5jZS4kYWN0aW9uKFtwYXJhbWV0ZXJzXSwgW3N1Y2Nlc3NdLCBbZXJyb3JdKWBcbiAqXG4gKlxuICogICBTdWNjZXNzIGNhbGxiYWNrIGlzIGNhbGxlZCB3aXRoICh2YWx1ZSwgcmVzcG9uc2VIZWFkZXJzKSBhcmd1bWVudHMsIHdoZXJlIHRoZSB2YWx1ZSBpc1xuICogICB0aGUgcG9wdWxhdGVkIHJlc291cmNlIGluc3RhbmNlIG9yIGNvbGxlY3Rpb24gb2JqZWN0LiBUaGUgZXJyb3IgY2FsbGJhY2sgaXMgY2FsbGVkXG4gKiAgIHdpdGggKGh0dHBSZXNwb25zZSkgYXJndW1lbnQuXG4gKlxuICogICBDbGFzcyBhY3Rpb25zIHJldHVybiBlbXB0eSBpbnN0YW5jZSAod2l0aCBhZGRpdGlvbmFsIHByb3BlcnRpZXMgYmVsb3cpLlxuICogICBJbnN0YW5jZSBhY3Rpb25zIHJldHVybiBwcm9taXNlIG9mIHRoZSBhY3Rpb24uXG4gKlxuICogICBUaGUgUmVzb3VyY2UgaW5zdGFuY2VzIGFuZCBjb2xsZWN0aW9uIGhhdmUgdGhlc2UgYWRkaXRpb25hbCBwcm9wZXJ0aWVzOlxuICpcbiAqICAgLSBgJHByb21pc2VgOiB0aGUge0BsaW5rIG5nLiRxIHByb21pc2V9IG9mIHRoZSBvcmlnaW5hbCBzZXJ2ZXIgaW50ZXJhY3Rpb24gdGhhdCBjcmVhdGVkIHRoaXNcbiAqICAgICBpbnN0YW5jZSBvciBjb2xsZWN0aW9uLlxuICpcbiAqICAgICBPbiBzdWNjZXNzLCB0aGUgcHJvbWlzZSBpcyByZXNvbHZlZCB3aXRoIHRoZSBzYW1lIHJlc291cmNlIGluc3RhbmNlIG9yIGNvbGxlY3Rpb24gb2JqZWN0LFxuICogICAgIHVwZGF0ZWQgd2l0aCBkYXRhIGZyb20gc2VydmVyLiBUaGlzIG1ha2VzIGl0IGVhc3kgdG8gdXNlIGluXG4gKiAgICAge0BsaW5rIG5nUm91dGUuJHJvdXRlUHJvdmlkZXIgcmVzb2x2ZSBzZWN0aW9uIG9mICRyb3V0ZVByb3ZpZGVyLndoZW4oKX0gdG8gZGVmZXIgdmlld1xuICogICAgIHJlbmRlcmluZyB1bnRpbCB0aGUgcmVzb3VyY2UocykgYXJlIGxvYWRlZC5cbiAqXG4gKiAgICAgT24gZmFpbHVyZSwgdGhlIHByb21pc2UgaXMgcmVzb2x2ZWQgd2l0aCB0aGUge0BsaW5rIG5nLiRodHRwIGh0dHAgcmVzcG9uc2V9IG9iamVjdCwgd2l0aG91dFxuICogICAgIHRoZSBgcmVzb3VyY2VgIHByb3BlcnR5LlxuICpcbiAqICAgICBJZiBhbiBpbnRlcmNlcHRvciBvYmplY3Qgd2FzIHByb3ZpZGVkLCB0aGUgcHJvbWlzZSB3aWxsIGluc3RlYWQgYmUgcmVzb2x2ZWQgd2l0aCB0aGUgdmFsdWVcbiAqICAgICByZXR1cm5lZCBieSB0aGUgaW50ZXJjZXB0b3IuXG4gKlxuICogICAtIGAkcmVzb2x2ZWRgOiBgdHJ1ZWAgYWZ0ZXIgZmlyc3Qgc2VydmVyIGludGVyYWN0aW9uIGlzIGNvbXBsZXRlZCAoZWl0aGVyIHdpdGggc3VjY2VzcyBvclxuICogICAgICByZWplY3Rpb24pLCBgZmFsc2VgIGJlZm9yZSB0aGF0LiBLbm93aW5nIGlmIHRoZSBSZXNvdXJjZSBoYXMgYmVlbiByZXNvbHZlZCBpcyB1c2VmdWwgaW5cbiAqICAgICAgZGF0YS1iaW5kaW5nLlxuICpcbiAqIEBleGFtcGxlXG4gKlxuICogIyBDcmVkaXQgY2FyZCByZXNvdXJjZVxuICpcbiAqIGBgYGpzXG4gICAgIC8vIERlZmluZSBDcmVkaXRDYXJkIGNsYXNzXG4gICAgIHZhciBDcmVkaXRDYXJkID0gJHJlc291cmNlKCcvdXNlci86dXNlcklkL2NhcmQvOmNhcmRJZCcsXG4gICAgICB7dXNlcklkOjEyMywgY2FyZElkOidAaWQnfSwge1xuICAgICAgIGNoYXJnZToge21ldGhvZDonUE9TVCcsIHBhcmFtczp7Y2hhcmdlOnRydWV9fVxuICAgICAgfSk7XG5cbiAgICAgLy8gV2UgY2FuIHJldHJpZXZlIGEgY29sbGVjdGlvbiBmcm9tIHRoZSBzZXJ2ZXJcbiAgICAgdmFyIGNhcmRzID0gQ3JlZGl0Q2FyZC5xdWVyeShmdW5jdGlvbigpIHtcbiAgICAgICAvLyBHRVQ6IC91c2VyLzEyMy9jYXJkXG4gICAgICAgLy8gc2VydmVyIHJldHVybnM6IFsge2lkOjQ1NiwgbnVtYmVyOicxMjM0JywgbmFtZTonU21pdGgnfSBdO1xuXG4gICAgICAgdmFyIGNhcmQgPSBjYXJkc1swXTtcbiAgICAgICAvLyBlYWNoIGl0ZW0gaXMgYW4gaW5zdGFuY2Ugb2YgQ3JlZGl0Q2FyZFxuICAgICAgIGV4cGVjdChjYXJkIGluc3RhbmNlb2YgQ3JlZGl0Q2FyZCkudG9FcXVhbCh0cnVlKTtcbiAgICAgICBjYXJkLm5hbWUgPSBcIkouIFNtaXRoXCI7XG4gICAgICAgLy8gbm9uIEdFVCBtZXRob2RzIGFyZSBtYXBwZWQgb250byB0aGUgaW5zdGFuY2VzXG4gICAgICAgY2FyZC4kc2F2ZSgpO1xuICAgICAgIC8vIFBPU1Q6IC91c2VyLzEyMy9jYXJkLzQ1NiB7aWQ6NDU2LCBudW1iZXI6JzEyMzQnLCBuYW1lOidKLiBTbWl0aCd9XG4gICAgICAgLy8gc2VydmVyIHJldHVybnM6IHtpZDo0NTYsIG51bWJlcjonMTIzNCcsIG5hbWU6ICdKLiBTbWl0aCd9O1xuXG4gICAgICAgLy8gb3VyIGN1c3RvbSBtZXRob2QgaXMgbWFwcGVkIGFzIHdlbGwuXG4gICAgICAgY2FyZC4kY2hhcmdlKHthbW91bnQ6OS45OX0pO1xuICAgICAgIC8vIFBPU1Q6IC91c2VyLzEyMy9jYXJkLzQ1Nj9hbW91bnQ9OS45OSZjaGFyZ2U9dHJ1ZSB7aWQ6NDU2LCBudW1iZXI6JzEyMzQnLCBuYW1lOidKLiBTbWl0aCd9XG4gICAgIH0pO1xuXG4gICAgIC8vIHdlIGNhbiBjcmVhdGUgYW4gaW5zdGFuY2UgYXMgd2VsbFxuICAgICB2YXIgbmV3Q2FyZCA9IG5ldyBDcmVkaXRDYXJkKHtudW1iZXI6JzAxMjMnfSk7XG4gICAgIG5ld0NhcmQubmFtZSA9IFwiTWlrZSBTbWl0aFwiO1xuICAgICBuZXdDYXJkLiRzYXZlKCk7XG4gICAgIC8vIFBPU1Q6IC91c2VyLzEyMy9jYXJkIHtudW1iZXI6JzAxMjMnLCBuYW1lOidNaWtlIFNtaXRoJ31cbiAgICAgLy8gc2VydmVyIHJldHVybnM6IHtpZDo3ODksIG51bWJlcjonMDEyMycsIG5hbWU6ICdNaWtlIFNtaXRoJ307XG4gICAgIGV4cGVjdChuZXdDYXJkLmlkKS50b0VxdWFsKDc4OSk7XG4gKiBgYGBcbiAqXG4gKiBUaGUgb2JqZWN0IHJldHVybmVkIGZyb20gdGhpcyBmdW5jdGlvbiBleGVjdXRpb24gaXMgYSByZXNvdXJjZSBcImNsYXNzXCIgd2hpY2ggaGFzIFwic3RhdGljXCIgbWV0aG9kXG4gKiBmb3IgZWFjaCBhY3Rpb24gaW4gdGhlIGRlZmluaXRpb24uXG4gKlxuICogQ2FsbGluZyB0aGVzZSBtZXRob2RzIGludm9rZSBgJGh0dHBgIG9uIHRoZSBgdXJsYCB0ZW1wbGF0ZSB3aXRoIHRoZSBnaXZlbiBgbWV0aG9kYCwgYHBhcmFtc2AgYW5kXG4gKiBgaGVhZGVyc2AuXG4gKiBXaGVuIHRoZSBkYXRhIGlzIHJldHVybmVkIGZyb20gdGhlIHNlcnZlciB0aGVuIHRoZSBvYmplY3QgaXMgYW4gaW5zdGFuY2Ugb2YgdGhlIHJlc291cmNlIHR5cGUgYW5kXG4gKiBhbGwgb2YgdGhlIG5vbi1HRVQgbWV0aG9kcyBhcmUgYXZhaWxhYmxlIHdpdGggYCRgIHByZWZpeC4gVGhpcyBhbGxvd3MgeW91IHRvIGVhc2lseSBzdXBwb3J0IENSVURcbiAqIG9wZXJhdGlvbnMgKGNyZWF0ZSwgcmVhZCwgdXBkYXRlLCBkZWxldGUpIG9uIHNlcnZlci1zaWRlIGRhdGEuXG5cbiAgIGBgYGpzXG4gICAgIHZhciBVc2VyID0gJHJlc291cmNlKCcvdXNlci86dXNlcklkJywge3VzZXJJZDonQGlkJ30pO1xuICAgICBVc2VyLmdldCh7dXNlcklkOjEyM30sIGZ1bmN0aW9uKHVzZXIpIHtcbiAgICAgICB1c2VyLmFiYyA9IHRydWU7XG4gICAgICAgdXNlci4kc2F2ZSgpO1xuICAgICB9KTtcbiAgIGBgYFxuICpcbiAqIEl0J3Mgd29ydGggbm90aW5nIHRoYXQgdGhlIHN1Y2Nlc3MgY2FsbGJhY2sgZm9yIGBnZXRgLCBgcXVlcnlgIGFuZCBvdGhlciBtZXRob2RzIGdldHMgcGFzc2VkXG4gKiBpbiB0aGUgcmVzcG9uc2UgdGhhdCBjYW1lIGZyb20gdGhlIHNlcnZlciBhcyB3ZWxsIGFzICRodHRwIGhlYWRlciBnZXR0ZXIgZnVuY3Rpb24sIHNvIG9uZVxuICogY291bGQgcmV3cml0ZSB0aGUgYWJvdmUgZXhhbXBsZSBhbmQgZ2V0IGFjY2VzcyB0byBodHRwIGhlYWRlcnMgYXM6XG4gKlxuICAgYGBganNcbiAgICAgdmFyIFVzZXIgPSAkcmVzb3VyY2UoJy91c2VyLzp1c2VySWQnLCB7dXNlcklkOidAaWQnfSk7XG4gICAgIFVzZXIuZ2V0KHt1c2VySWQ6MTIzfSwgZnVuY3Rpb24odSwgZ2V0UmVzcG9uc2VIZWFkZXJzKXtcbiAgICAgICB1LmFiYyA9IHRydWU7XG4gICAgICAgdS4kc2F2ZShmdW5jdGlvbih1LCBwdXRSZXNwb25zZUhlYWRlcnMpIHtcbiAgICAgICAgIC8vdSA9PiBzYXZlZCB1c2VyIG9iamVjdFxuICAgICAgICAgLy9wdXRSZXNwb25zZUhlYWRlcnMgPT4gJGh0dHAgaGVhZGVyIGdldHRlclxuICAgICAgIH0pO1xuICAgICB9KTtcbiAgIGBgYFxuICpcbiAqIFlvdSBjYW4gYWxzbyBhY2Nlc3MgdGhlIHJhdyBgJGh0dHBgIHByb21pc2UgdmlhIHRoZSBgJHByb21pc2VgIHByb3BlcnR5IG9uIHRoZSBvYmplY3QgcmV0dXJuZWRcbiAqXG4gICBgYGBcbiAgICAgdmFyIFVzZXIgPSAkcmVzb3VyY2UoJy91c2VyLzp1c2VySWQnLCB7dXNlcklkOidAaWQnfSk7XG4gICAgIFVzZXIuZ2V0KHt1c2VySWQ6MTIzfSlcbiAgICAgICAgIC4kcHJvbWlzZS50aGVuKGZ1bmN0aW9uKHVzZXIpIHtcbiAgICAgICAgICAgJHNjb3BlLnVzZXIgPSB1c2VyO1xuICAgICAgICAgfSk7XG4gICBgYGBcblxuICogIyBDcmVhdGluZyBhIGN1c3RvbSAnUFVUJyByZXF1ZXN0XG4gKiBJbiB0aGlzIGV4YW1wbGUgd2UgY3JlYXRlIGEgY3VzdG9tIG1ldGhvZCBvbiBvdXIgcmVzb3VyY2UgdG8gbWFrZSBhIFBVVCByZXF1ZXN0XG4gKiBgYGBqc1xuICogICAgdmFyIGFwcCA9IGFuZ3VsYXIubW9kdWxlKCdhcHAnLCBbJ25nUmVzb3VyY2UnLCAnbmdSb3V0ZSddKTtcbiAqXG4gKiAgICAvLyBTb21lIEFQSXMgZXhwZWN0IGEgUFVUIHJlcXVlc3QgaW4gdGhlIGZvcm1hdCBVUkwvb2JqZWN0L0lEXG4gKiAgICAvLyBIZXJlIHdlIGFyZSBjcmVhdGluZyBhbiAndXBkYXRlJyBtZXRob2RcbiAqICAgIGFwcC5mYWN0b3J5KCdOb3RlcycsIFsnJHJlc291cmNlJywgZnVuY3Rpb24oJHJlc291cmNlKSB7XG4gKiAgICByZXR1cm4gJHJlc291cmNlKCcvbm90ZXMvOmlkJywgbnVsbCxcbiAqICAgICAgICB7XG4gKiAgICAgICAgICAgICd1cGRhdGUnOiB7IG1ldGhvZDonUFVUJyB9XG4gKiAgICAgICAgfSk7XG4gKiAgICB9XSk7XG4gKlxuICogICAgLy8gSW4gb3VyIGNvbnRyb2xsZXIgd2UgZ2V0IHRoZSBJRCBmcm9tIHRoZSBVUkwgdXNpbmcgbmdSb3V0ZSBhbmQgJHJvdXRlUGFyYW1zXG4gKiAgICAvLyBXZSBwYXNzIGluICRyb3V0ZVBhcmFtcyBhbmQgb3VyIE5vdGVzIGZhY3RvcnkgYWxvbmcgd2l0aCAkc2NvcGVcbiAqICAgIGFwcC5jb250cm9sbGVyKCdOb3Rlc0N0cmwnLCBbJyRzY29wZScsICckcm91dGVQYXJhbXMnLCAnTm90ZXMnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbigkc2NvcGUsICRyb3V0ZVBhcmFtcywgTm90ZXMpIHtcbiAqICAgIC8vIEZpcnN0IGdldCBhIG5vdGUgb2JqZWN0IGZyb20gdGhlIGZhY3RvcnlcbiAqICAgIHZhciBub3RlID0gTm90ZXMuZ2V0KHsgaWQ6JHJvdXRlUGFyYW1zLmlkIH0pO1xuICogICAgJGlkID0gbm90ZS5pZDtcbiAqXG4gKiAgICAvLyBOb3cgY2FsbCB1cGRhdGUgcGFzc2luZyBpbiB0aGUgSUQgZmlyc3QgdGhlbiB0aGUgb2JqZWN0IHlvdSBhcmUgdXBkYXRpbmdcbiAqICAgIE5vdGVzLnVwZGF0ZSh7IGlkOiRpZCB9LCBub3RlKTtcbiAqXG4gKiAgICAvLyBUaGlzIHdpbGwgUFVUIC9ub3Rlcy9JRCB3aXRoIHRoZSBub3RlIG9iamVjdCBpbiB0aGUgcmVxdWVzdCBwYXlsb2FkXG4gKiAgICB9XSk7XG4gKiBgYGBcbiAqL1xuYW5ndWxhci5tb2R1bGUoJ25nUmVzb3VyY2UnLCBbJ25nJ10pLlxuICBwcm92aWRlcignJHJlc291cmNlJywgZnVuY3Rpb24oKSB7XG4gICAgdmFyIFBST1RPQ09MX0FORF9ET01BSU5fUkVHRVggPSAvXmh0dHBzPzpcXC9cXC9bXlxcL10qLztcbiAgICB2YXIgcHJvdmlkZXIgPSB0aGlzO1xuXG4gICAgdGhpcy5kZWZhdWx0cyA9IHtcbiAgICAgIC8vIFN0cmlwIHNsYXNoZXMgYnkgZGVmYXVsdFxuICAgICAgc3RyaXBUcmFpbGluZ1NsYXNoZXM6IHRydWUsXG5cbiAgICAgIC8vIERlZmF1bHQgYWN0aW9ucyBjb25maWd1cmF0aW9uXG4gICAgICBhY3Rpb25zOiB7XG4gICAgICAgICdnZXQnOiB7bWV0aG9kOiAnR0VUJ30sXG4gICAgICAgICdzYXZlJzoge21ldGhvZDogJ1BPU1QnfSxcbiAgICAgICAgJ3F1ZXJ5Jzoge21ldGhvZDogJ0dFVCcsIGlzQXJyYXk6IHRydWV9LFxuICAgICAgICAncmVtb3ZlJzoge21ldGhvZDogJ0RFTEVURSd9LFxuICAgICAgICAnZGVsZXRlJzoge21ldGhvZDogJ0RFTEVURSd9XG4gICAgICB9XG4gICAgfTtcblxuICAgIHRoaXMuJGdldCA9IFsnJGh0dHAnLCAnJHEnLCBmdW5jdGlvbigkaHR0cCwgJHEpIHtcblxuICAgICAgdmFyIG5vb3AgPSBhbmd1bGFyLm5vb3AsXG4gICAgICAgIGZvckVhY2ggPSBhbmd1bGFyLmZvckVhY2gsXG4gICAgICAgIGV4dGVuZCA9IGFuZ3VsYXIuZXh0ZW5kLFxuICAgICAgICBjb3B5ID0gYW5ndWxhci5jb3B5LFxuICAgICAgICBpc0Z1bmN0aW9uID0gYW5ndWxhci5pc0Z1bmN0aW9uO1xuXG4gICAgICAvKipcbiAgICAgICAqIFdlIG5lZWQgb3VyIGN1c3RvbSBtZXRob2QgYmVjYXVzZSBlbmNvZGVVUklDb21wb25lbnQgaXMgdG9vIGFnZ3Jlc3NpdmUgYW5kIGRvZXNuJ3QgZm9sbG93XG4gICAgICAgKiBodHRwOi8vd3d3LmlldGYub3JnL3JmYy9yZmMzOTg2LnR4dCB3aXRoIHJlZ2FyZHMgdG8gdGhlIGNoYXJhY3RlciBzZXRcbiAgICAgICAqIChwY2hhcikgYWxsb3dlZCBpbiBwYXRoIHNlZ21lbnRzOlxuICAgICAgICogICAgc2VnbWVudCAgICAgICA9ICpwY2hhclxuICAgICAgICogICAgcGNoYXIgICAgICAgICA9IHVucmVzZXJ2ZWQgLyBwY3QtZW5jb2RlZCAvIHN1Yi1kZWxpbXMgLyBcIjpcIiAvIFwiQFwiXG4gICAgICAgKiAgICBwY3QtZW5jb2RlZCAgID0gXCIlXCIgSEVYRElHIEhFWERJR1xuICAgICAgICogICAgdW5yZXNlcnZlZCAgICA9IEFMUEhBIC8gRElHSVQgLyBcIi1cIiAvIFwiLlwiIC8gXCJfXCIgLyBcIn5cIlxuICAgICAgICogICAgc3ViLWRlbGltcyAgICA9IFwiIVwiIC8gXCIkXCIgLyBcIiZcIiAvIFwiJ1wiIC8gXCIoXCIgLyBcIilcIlxuICAgICAgICogICAgICAgICAgICAgICAgICAgICAvIFwiKlwiIC8gXCIrXCIgLyBcIixcIiAvIFwiO1wiIC8gXCI9XCJcbiAgICAgICAqL1xuICAgICAgZnVuY3Rpb24gZW5jb2RlVXJpU2VnbWVudCh2YWwpIHtcbiAgICAgICAgcmV0dXJuIGVuY29kZVVyaVF1ZXJ5KHZhbCwgdHJ1ZSkuXG4gICAgICAgICAgcmVwbGFjZSgvJTI2L2dpLCAnJicpLlxuICAgICAgICAgIHJlcGxhY2UoLyUzRC9naSwgJz0nKS5cbiAgICAgICAgICByZXBsYWNlKC8lMkIvZ2ksICcrJyk7XG4gICAgICB9XG5cblxuICAgICAgLyoqXG4gICAgICAgKiBUaGlzIG1ldGhvZCBpcyBpbnRlbmRlZCBmb3IgZW5jb2RpbmcgKmtleSogb3IgKnZhbHVlKiBwYXJ0cyBvZiBxdWVyeSBjb21wb25lbnQuIFdlIG5lZWQgYVxuICAgICAgICogY3VzdG9tIG1ldGhvZCBiZWNhdXNlIGVuY29kZVVSSUNvbXBvbmVudCBpcyB0b28gYWdncmVzc2l2ZSBhbmQgZW5jb2RlcyBzdHVmZiB0aGF0IGRvZXNuJ3RcbiAgICAgICAqIGhhdmUgdG8gYmUgZW5jb2RlZCBwZXIgaHR0cDovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjMzk4NjpcbiAgICAgICAqICAgIHF1ZXJ5ICAgICAgID0gKiggcGNoYXIgLyBcIi9cIiAvIFwiP1wiIClcbiAgICAgICAqICAgIHBjaGFyICAgICAgICAgPSB1bnJlc2VydmVkIC8gcGN0LWVuY29kZWQgLyBzdWItZGVsaW1zIC8gXCI6XCIgLyBcIkBcIlxuICAgICAgICogICAgdW5yZXNlcnZlZCAgICA9IEFMUEhBIC8gRElHSVQgLyBcIi1cIiAvIFwiLlwiIC8gXCJfXCIgLyBcIn5cIlxuICAgICAgICogICAgcGN0LWVuY29kZWQgICA9IFwiJVwiIEhFWERJRyBIRVhESUdcbiAgICAgICAqICAgIHN1Yi1kZWxpbXMgICAgPSBcIiFcIiAvIFwiJFwiIC8gXCImXCIgLyBcIidcIiAvIFwiKFwiIC8gXCIpXCJcbiAgICAgICAqICAgICAgICAgICAgICAgICAgICAgLyBcIipcIiAvIFwiK1wiIC8gXCIsXCIgLyBcIjtcIiAvIFwiPVwiXG4gICAgICAgKi9cbiAgICAgIGZ1bmN0aW9uIGVuY29kZVVyaVF1ZXJ5KHZhbCwgcGN0RW5jb2RlU3BhY2VzKSB7XG4gICAgICAgIHJldHVybiBlbmNvZGVVUklDb21wb25lbnQodmFsKS5cbiAgICAgICAgICByZXBsYWNlKC8lNDAvZ2ksICdAJykuXG4gICAgICAgICAgcmVwbGFjZSgvJTNBL2dpLCAnOicpLlxuICAgICAgICAgIHJlcGxhY2UoLyUyNC9nLCAnJCcpLlxuICAgICAgICAgIHJlcGxhY2UoLyUyQy9naSwgJywnKS5cbiAgICAgICAgICByZXBsYWNlKC8lMjAvZywgKHBjdEVuY29kZVNwYWNlcyA/ICclMjAnIDogJysnKSk7XG4gICAgICB9XG5cbiAgICAgIGZ1bmN0aW9uIFJvdXRlKHRlbXBsYXRlLCBkZWZhdWx0cykge1xuICAgICAgICB0aGlzLnRlbXBsYXRlID0gdGVtcGxhdGU7XG4gICAgICAgIHRoaXMuZGVmYXVsdHMgPSBleHRlbmQoe30sIHByb3ZpZGVyLmRlZmF1bHRzLCBkZWZhdWx0cyk7XG4gICAgICAgIHRoaXMudXJsUGFyYW1zID0ge307XG4gICAgICB9XG5cbiAgICAgIFJvdXRlLnByb3RvdHlwZSA9IHtcbiAgICAgICAgc2V0VXJsUGFyYW1zOiBmdW5jdGlvbihjb25maWcsIHBhcmFtcywgYWN0aW9uVXJsKSB7XG4gICAgICAgICAgdmFyIHNlbGYgPSB0aGlzLFxuICAgICAgICAgICAgdXJsID0gYWN0aW9uVXJsIHx8IHNlbGYudGVtcGxhdGUsXG4gICAgICAgICAgICB2YWwsXG4gICAgICAgICAgICBlbmNvZGVkVmFsLFxuICAgICAgICAgICAgcHJvdG9jb2xBbmREb21haW4gPSAnJztcblxuICAgICAgICAgIHZhciB1cmxQYXJhbXMgPSBzZWxmLnVybFBhcmFtcyA9IHt9O1xuICAgICAgICAgIGZvckVhY2godXJsLnNwbGl0KC9cXFcvKSwgZnVuY3Rpb24ocGFyYW0pIHtcbiAgICAgICAgICAgIGlmIChwYXJhbSA9PT0gJ2hhc093blByb3BlcnR5Jykge1xuICAgICAgICAgICAgICB0aHJvdyAkcmVzb3VyY2VNaW5FcnIoJ2JhZG5hbWUnLCBcImhhc093blByb3BlcnR5IGlzIG5vdCBhIHZhbGlkIHBhcmFtZXRlciBuYW1lLlwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghKG5ldyBSZWdFeHAoXCJeXFxcXGQrJFwiKS50ZXN0KHBhcmFtKSkgJiYgcGFyYW0gJiZcbiAgICAgICAgICAgICAgKG5ldyBSZWdFeHAoXCIoXnxbXlxcXFxcXFxcXSk6XCIgKyBwYXJhbSArIFwiKFxcXFxXfCQpXCIpLnRlc3QodXJsKSkpIHtcbiAgICAgICAgICAgICAgdXJsUGFyYW1zW3BhcmFtXSA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgdXJsID0gdXJsLnJlcGxhY2UoL1xcXFw6L2csICc6Jyk7XG4gICAgICAgICAgdXJsID0gdXJsLnJlcGxhY2UoUFJPVE9DT0xfQU5EX0RPTUFJTl9SRUdFWCwgZnVuY3Rpb24obWF0Y2gpIHtcbiAgICAgICAgICAgIHByb3RvY29sQW5kRG9tYWluID0gbWF0Y2g7XG4gICAgICAgICAgICByZXR1cm4gJyc7XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICBwYXJhbXMgPSBwYXJhbXMgfHwge307XG4gICAgICAgICAgZm9yRWFjaChzZWxmLnVybFBhcmFtcywgZnVuY3Rpb24oXywgdXJsUGFyYW0pIHtcbiAgICAgICAgICAgIHZhbCA9IHBhcmFtcy5oYXNPd25Qcm9wZXJ0eSh1cmxQYXJhbSkgPyBwYXJhbXNbdXJsUGFyYW1dIDogc2VsZi5kZWZhdWx0c1t1cmxQYXJhbV07XG4gICAgICAgICAgICBpZiAoYW5ndWxhci5pc0RlZmluZWQodmFsKSAmJiB2YWwgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgZW5jb2RlZFZhbCA9IGVuY29kZVVyaVNlZ21lbnQodmFsKTtcbiAgICAgICAgICAgICAgdXJsID0gdXJsLnJlcGxhY2UobmV3IFJlZ0V4cChcIjpcIiArIHVybFBhcmFtICsgXCIoXFxcXFd8JClcIiwgXCJnXCIpLCBmdW5jdGlvbihtYXRjaCwgcDEpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZW5jb2RlZFZhbCArIHAxO1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHVybCA9IHVybC5yZXBsYWNlKG5ldyBSZWdFeHAoXCIoXFwvPyk6XCIgKyB1cmxQYXJhbSArIFwiKFxcXFxXfCQpXCIsIFwiZ1wiKSwgZnVuY3Rpb24obWF0Y2gsXG4gICAgICAgICAgICAgICAgICBsZWFkaW5nU2xhc2hlcywgdGFpbCkge1xuICAgICAgICAgICAgICAgIGlmICh0YWlsLmNoYXJBdCgwKSA9PSAnLycpIHtcbiAgICAgICAgICAgICAgICAgIHJldHVybiB0YWlsO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICByZXR1cm4gbGVhZGluZ1NsYXNoZXMgKyB0YWlsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICAvLyBzdHJpcCB0cmFpbGluZyBzbGFzaGVzIGFuZCBzZXQgdGhlIHVybCAodW5sZXNzIHRoaXMgYmVoYXZpb3IgaXMgc3BlY2lmaWNhbGx5IGRpc2FibGVkKVxuICAgICAgICAgIGlmIChzZWxmLmRlZmF1bHRzLnN0cmlwVHJhaWxpbmdTbGFzaGVzKSB7XG4gICAgICAgICAgICB1cmwgPSB1cmwucmVwbGFjZSgvXFwvKyQvLCAnJykgfHwgJy8nO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIHRoZW4gcmVwbGFjZSBjb2xsYXBzZSBgLy5gIGlmIGZvdW5kIGluIHRoZSBsYXN0IFVSTCBwYXRoIHNlZ21lbnQgYmVmb3JlIHRoZSBxdWVyeVxuICAgICAgICAgIC8vIEUuZy4gYGh0dHA6Ly91cmwuY29tL2lkLi9mb3JtYXQ/cT14YCBiZWNvbWVzIGBodHRwOi8vdXJsLmNvbS9pZC5mb3JtYXQ/cT14YFxuICAgICAgICAgIHVybCA9IHVybC5yZXBsYWNlKC9cXC9cXC4oPz1cXHcrKCR8XFw/KSkvLCAnLicpO1xuICAgICAgICAgIC8vIHJlcGxhY2UgZXNjYXBlZCBgL1xcLmAgd2l0aCBgLy5gXG4gICAgICAgICAgY29uZmlnLnVybCA9IHByb3RvY29sQW5kRG9tYWluICsgdXJsLnJlcGxhY2UoL1xcL1xcXFxcXC4vLCAnLy4nKTtcblxuXG4gICAgICAgICAgLy8gc2V0IHBhcmFtcyAtIGRlbGVnYXRlIHBhcmFtIGVuY29kaW5nIHRvICRodHRwXG4gICAgICAgICAgZm9yRWFjaChwYXJhbXMsIGZ1bmN0aW9uKHZhbHVlLCBrZXkpIHtcbiAgICAgICAgICAgIGlmICghc2VsZi51cmxQYXJhbXNba2V5XSkge1xuICAgICAgICAgICAgICBjb25maWcucGFyYW1zID0gY29uZmlnLnBhcmFtcyB8fCB7fTtcbiAgICAgICAgICAgICAgY29uZmlnLnBhcmFtc1trZXldID0gdmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH07XG5cblxuICAgICAgZnVuY3Rpb24gcmVzb3VyY2VGYWN0b3J5KHVybCwgcGFyYW1EZWZhdWx0cywgYWN0aW9ucywgb3B0aW9ucykge1xuICAgICAgICB2YXIgcm91dGUgPSBuZXcgUm91dGUodXJsLCBvcHRpb25zKTtcblxuICAgICAgICBhY3Rpb25zID0gZXh0ZW5kKHt9LCBwcm92aWRlci5kZWZhdWx0cy5hY3Rpb25zLCBhY3Rpb25zKTtcblxuICAgICAgICBmdW5jdGlvbiBleHRyYWN0UGFyYW1zKGRhdGEsIGFjdGlvblBhcmFtcykge1xuICAgICAgICAgIHZhciBpZHMgPSB7fTtcbiAgICAgICAgICBhY3Rpb25QYXJhbXMgPSBleHRlbmQoe30sIHBhcmFtRGVmYXVsdHMsIGFjdGlvblBhcmFtcyk7XG4gICAgICAgICAgZm9yRWFjaChhY3Rpb25QYXJhbXMsIGZ1bmN0aW9uKHZhbHVlLCBrZXkpIHtcbiAgICAgICAgICAgIGlmIChpc0Z1bmN0aW9uKHZhbHVlKSkgeyB2YWx1ZSA9IHZhbHVlKCk7IH1cbiAgICAgICAgICAgIGlkc1trZXldID0gdmFsdWUgJiYgdmFsdWUuY2hhckF0ICYmIHZhbHVlLmNoYXJBdCgwKSA9PSAnQCcgP1xuICAgICAgICAgICAgICBsb29rdXBEb3R0ZWRQYXRoKGRhdGEsIHZhbHVlLnN1YnN0cigxKSkgOiB2YWx1ZTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICByZXR1cm4gaWRzO1xuICAgICAgICB9XG5cbiAgICAgICAgZnVuY3Rpb24gZGVmYXVsdFJlc3BvbnNlSW50ZXJjZXB0b3IocmVzcG9uc2UpIHtcbiAgICAgICAgICByZXR1cm4gcmVzcG9uc2UucmVzb3VyY2U7XG4gICAgICAgIH1cblxuICAgICAgICBmdW5jdGlvbiBSZXNvdXJjZSh2YWx1ZSkge1xuICAgICAgICAgIHNoYWxsb3dDbGVhckFuZENvcHkodmFsdWUgfHwge30sIHRoaXMpO1xuICAgICAgICB9XG5cbiAgICAgICAgUmVzb3VyY2UucHJvdG90eXBlLnRvSlNPTiA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgIHZhciBkYXRhID0gZXh0ZW5kKHt9LCB0aGlzKTtcbiAgICAgICAgICBkZWxldGUgZGF0YS4kcHJvbWlzZTtcbiAgICAgICAgICBkZWxldGUgZGF0YS4kcmVzb2x2ZWQ7XG4gICAgICAgICAgcmV0dXJuIGRhdGE7XG4gICAgICAgIH07XG5cbiAgICAgICAgZm9yRWFjaChhY3Rpb25zLCBmdW5jdGlvbihhY3Rpb24sIG5hbWUpIHtcbiAgICAgICAgICB2YXIgaGFzQm9keSA9IC9eKFBPU1R8UFVUfFBBVENIKSQvaS50ZXN0KGFjdGlvbi5tZXRob2QpO1xuXG4gICAgICAgICAgUmVzb3VyY2VbbmFtZV0gPSBmdW5jdGlvbihhMSwgYTIsIGEzLCBhNCkge1xuICAgICAgICAgICAgdmFyIHBhcmFtcyA9IHt9LCBkYXRhLCBzdWNjZXNzLCBlcnJvcjtcblxuICAgICAgICAgICAgLyoganNoaW50IC1XMDg2ICovIC8qIChwdXJwb3NlZnVsbHkgZmFsbCB0aHJvdWdoIGNhc2Ugc3RhdGVtZW50cykgKi9cbiAgICAgICAgICAgIHN3aXRjaCAoYXJndW1lbnRzLmxlbmd0aCkge1xuICAgICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgICAgZXJyb3IgPSBhNDtcbiAgICAgICAgICAgICAgICBzdWNjZXNzID0gYTM7XG4gICAgICAgICAgICAgIC8vZmFsbHRocm91Z2hcbiAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgaWYgKGlzRnVuY3Rpb24oYTIpKSB7XG4gICAgICAgICAgICAgICAgICBpZiAoaXNGdW5jdGlvbihhMSkpIHtcbiAgICAgICAgICAgICAgICAgICAgc3VjY2VzcyA9IGExO1xuICAgICAgICAgICAgICAgICAgICBlcnJvciA9IGEyO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgc3VjY2VzcyA9IGEyO1xuICAgICAgICAgICAgICAgICAgZXJyb3IgPSBhMztcbiAgICAgICAgICAgICAgICAgIC8vZmFsbHRocm91Z2hcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgcGFyYW1zID0gYTE7XG4gICAgICAgICAgICAgICAgICBkYXRhID0gYTI7XG4gICAgICAgICAgICAgICAgICBzdWNjZXNzID0gYTM7XG4gICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICBpZiAoaXNGdW5jdGlvbihhMSkpIHN1Y2Nlc3MgPSBhMTtcbiAgICAgICAgICAgICAgICBlbHNlIGlmIChoYXNCb2R5KSBkYXRhID0gYTE7XG4gICAgICAgICAgICAgICAgZWxzZSBwYXJhbXMgPSBhMTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgY2FzZSAwOiBicmVhaztcbiAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICB0aHJvdyAkcmVzb3VyY2VNaW5FcnIoJ2JhZGFyZ3MnLFxuICAgICAgICAgICAgICAgICAgXCJFeHBlY3RlZCB1cCB0byA0IGFyZ3VtZW50cyBbcGFyYW1zLCBkYXRhLCBzdWNjZXNzLCBlcnJvcl0sIGdvdCB7MH0gYXJndW1lbnRzXCIsXG4gICAgICAgICAgICAgICAgICBhcmd1bWVudHMubGVuZ3RoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8qIGpzaGludCArVzA4NiAqLyAvKiAocHVycG9zZWZ1bGx5IGZhbGwgdGhyb3VnaCBjYXNlIHN0YXRlbWVudHMpICovXG5cbiAgICAgICAgICAgIHZhciBpc0luc3RhbmNlQ2FsbCA9IHRoaXMgaW5zdGFuY2VvZiBSZXNvdXJjZTtcbiAgICAgICAgICAgIHZhciB2YWx1ZSA9IGlzSW5zdGFuY2VDYWxsID8gZGF0YSA6IChhY3Rpb24uaXNBcnJheSA/IFtdIDogbmV3IFJlc291cmNlKGRhdGEpKTtcbiAgICAgICAgICAgIHZhciBodHRwQ29uZmlnID0ge307XG4gICAgICAgICAgICB2YXIgcmVzcG9uc2VJbnRlcmNlcHRvciA9IGFjdGlvbi5pbnRlcmNlcHRvciAmJiBhY3Rpb24uaW50ZXJjZXB0b3IucmVzcG9uc2UgfHxcbiAgICAgICAgICAgICAgZGVmYXVsdFJlc3BvbnNlSW50ZXJjZXB0b3I7XG4gICAgICAgICAgICB2YXIgcmVzcG9uc2VFcnJvckludGVyY2VwdG9yID0gYWN0aW9uLmludGVyY2VwdG9yICYmIGFjdGlvbi5pbnRlcmNlcHRvci5yZXNwb25zZUVycm9yIHx8XG4gICAgICAgICAgICAgIHVuZGVmaW5lZDtcblxuICAgICAgICAgICAgZm9yRWFjaChhY3Rpb24sIGZ1bmN0aW9uKHZhbHVlLCBrZXkpIHtcbiAgICAgICAgICAgICAgaWYgKGtleSAhPSAncGFyYW1zJyAmJiBrZXkgIT0gJ2lzQXJyYXknICYmIGtleSAhPSAnaW50ZXJjZXB0b3InKSB7XG4gICAgICAgICAgICAgICAgaHR0cENvbmZpZ1trZXldID0gY29weSh2YWx1ZSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBpZiAoaGFzQm9keSkgaHR0cENvbmZpZy5kYXRhID0gZGF0YTtcbiAgICAgICAgICAgIHJvdXRlLnNldFVybFBhcmFtcyhodHRwQ29uZmlnLFxuICAgICAgICAgICAgICBleHRlbmQoe30sIGV4dHJhY3RQYXJhbXMoZGF0YSwgYWN0aW9uLnBhcmFtcyB8fCB7fSksIHBhcmFtcyksXG4gICAgICAgICAgICAgIGFjdGlvbi51cmwpO1xuXG4gICAgICAgICAgICB2YXIgcHJvbWlzZSA9ICRodHRwKGh0dHBDb25maWcpLnRoZW4oZnVuY3Rpb24ocmVzcG9uc2UpIHtcbiAgICAgICAgICAgICAgdmFyIGRhdGEgPSByZXNwb25zZS5kYXRhLFxuICAgICAgICAgICAgICAgIHByb21pc2UgPSB2YWx1ZS4kcHJvbWlzZTtcblxuICAgICAgICAgICAgICBpZiAoZGF0YSkge1xuICAgICAgICAgICAgICAgIC8vIE5lZWQgdG8gY29udmVydCBhY3Rpb24uaXNBcnJheSB0byBib29sZWFuIGluIGNhc2UgaXQgaXMgdW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgLy8ganNoaW50IC1XMDE4XG4gICAgICAgICAgICAgICAgaWYgKGFuZ3VsYXIuaXNBcnJheShkYXRhKSAhPT0gKCEhYWN0aW9uLmlzQXJyYXkpKSB7XG4gICAgICAgICAgICAgICAgICB0aHJvdyAkcmVzb3VyY2VNaW5FcnIoJ2JhZGNmZycsXG4gICAgICAgICAgICAgICAgICAgICAgJ0Vycm9yIGluIHJlc291cmNlIGNvbmZpZ3VyYXRpb24gZm9yIGFjdGlvbiBgezB9YC4gRXhwZWN0ZWQgcmVzcG9uc2UgdG8gJyArXG4gICAgICAgICAgICAgICAgICAgICAgJ2NvbnRhaW4gYW4gezF9IGJ1dCBnb3QgYW4gezJ9IChSZXF1ZXN0OiB7M30gezR9KScsIG5hbWUsIGFjdGlvbi5pc0FycmF5ID8gJ2FycmF5JyA6ICdvYmplY3QnLFxuICAgICAgICAgICAgICAgICAgICBhbmd1bGFyLmlzQXJyYXkoZGF0YSkgPyAnYXJyYXknIDogJ29iamVjdCcsIGh0dHBDb25maWcubWV0aG9kLCBodHRwQ29uZmlnLnVybCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIGpzaGludCArVzAxOFxuICAgICAgICAgICAgICAgIGlmIChhY3Rpb24uaXNBcnJheSkge1xuICAgICAgICAgICAgICAgICAgdmFsdWUubGVuZ3RoID0gMDtcbiAgICAgICAgICAgICAgICAgIGZvckVhY2goZGF0YSwgZnVuY3Rpb24oaXRlbSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGl0ZW0gPT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICB2YWx1ZS5wdXNoKG5ldyBSZXNvdXJjZShpdGVtKSk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgLy8gVmFsaWQgSlNPTiB2YWx1ZXMgbWF5IGJlIHN0cmluZyBsaXRlcmFscywgYW5kIHRoZXNlIHNob3VsZCBub3QgYmUgY29udmVydGVkXG4gICAgICAgICAgICAgICAgICAgICAgLy8gaW50byBvYmplY3RzLiBUaGVzZSBpdGVtcyB3aWxsIG5vdCBoYXZlIGFjY2VzcyB0byB0aGUgUmVzb3VyY2UgcHJvdG90eXBlXG4gICAgICAgICAgICAgICAgICAgICAgLy8gbWV0aG9kcywgYnV0IHVuZm9ydHVuYXRlbHkgdGhlcmVcbiAgICAgICAgICAgICAgICAgICAgICB2YWx1ZS5wdXNoKGl0ZW0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgc2hhbGxvd0NsZWFyQW5kQ29weShkYXRhLCB2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICB2YWx1ZS4kcHJvbWlzZSA9IHByb21pc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgdmFsdWUuJHJlc29sdmVkID0gdHJ1ZTtcblxuICAgICAgICAgICAgICByZXNwb25zZS5yZXNvdXJjZSA9IHZhbHVlO1xuXG4gICAgICAgICAgICAgIHJldHVybiByZXNwb25zZTtcbiAgICAgICAgICAgIH0sIGZ1bmN0aW9uKHJlc3BvbnNlKSB7XG4gICAgICAgICAgICAgIHZhbHVlLiRyZXNvbHZlZCA9IHRydWU7XG5cbiAgICAgICAgICAgICAgKGVycm9yIHx8IG5vb3ApKHJlc3BvbnNlKTtcblxuICAgICAgICAgICAgICByZXR1cm4gJHEucmVqZWN0KHJlc3BvbnNlKTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBwcm9taXNlID0gcHJvbWlzZS50aGVuKFxuICAgICAgICAgICAgICBmdW5jdGlvbihyZXNwb25zZSkge1xuICAgICAgICAgICAgICAgIHZhciB2YWx1ZSA9IHJlc3BvbnNlSW50ZXJjZXB0b3IocmVzcG9uc2UpO1xuICAgICAgICAgICAgICAgIChzdWNjZXNzIHx8IG5vb3ApKHZhbHVlLCByZXNwb25zZS5oZWFkZXJzKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHJlc3BvbnNlRXJyb3JJbnRlcmNlcHRvcik7XG5cbiAgICAgICAgICAgIGlmICghaXNJbnN0YW5jZUNhbGwpIHtcbiAgICAgICAgICAgICAgLy8gd2UgYXJlIGNyZWF0aW5nIGluc3RhbmNlIC8gY29sbGVjdGlvblxuICAgICAgICAgICAgICAvLyAtIHNldCB0aGUgaW5pdGlhbCBwcm9taXNlXG4gICAgICAgICAgICAgIC8vIC0gcmV0dXJuIHRoZSBpbnN0YW5jZSAvIGNvbGxlY3Rpb25cbiAgICAgICAgICAgICAgdmFsdWUuJHByb21pc2UgPSBwcm9taXNlO1xuICAgICAgICAgICAgICB2YWx1ZS4kcmVzb2x2ZWQgPSBmYWxzZTtcblxuICAgICAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIGluc3RhbmNlIGNhbGxcbiAgICAgICAgICAgIHJldHVybiBwcm9taXNlO1xuICAgICAgICAgIH07XG5cblxuICAgICAgICAgIFJlc291cmNlLnByb3RvdHlwZVsnJCcgKyBuYW1lXSA9IGZ1bmN0aW9uKHBhcmFtcywgc3VjY2VzcywgZXJyb3IpIHtcbiAgICAgICAgICAgIGlmIChpc0Z1bmN0aW9uKHBhcmFtcykpIHtcbiAgICAgICAgICAgICAgZXJyb3IgPSBzdWNjZXNzOyBzdWNjZXNzID0gcGFyYW1zOyBwYXJhbXMgPSB7fTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciByZXN1bHQgPSBSZXNvdXJjZVtuYW1lXS5jYWxsKHRoaXMsIHBhcmFtcywgdGhpcywgc3VjY2VzcywgZXJyb3IpO1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC4kcHJvbWlzZSB8fCByZXN1bHQ7XG4gICAgICAgICAgfTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgUmVzb3VyY2UuYmluZCA9IGZ1bmN0aW9uKGFkZGl0aW9uYWxQYXJhbURlZmF1bHRzKSB7XG4gICAgICAgICAgcmV0dXJuIHJlc291cmNlRmFjdG9yeSh1cmwsIGV4dGVuZCh7fSwgcGFyYW1EZWZhdWx0cywgYWRkaXRpb25hbFBhcmFtRGVmYXVsdHMpLCBhY3Rpb25zKTtcbiAgICAgICAgfTtcblxuICAgICAgICByZXR1cm4gUmVzb3VyY2U7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByZXNvdXJjZUZhY3Rvcnk7XG4gICAgfV07XG4gIH0pO1xuXG5cbn0pKHdpbmRvdywgd2luZG93LmFuZ3VsYXIpO1xuXG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL2Jvd2VyX2NvbXBvbmVudHMvYW5ndWxhci1yZXNvdXJjZS9hbmd1bGFyLXJlc291cmNlLmpzXG4gKiogbW9kdWxlIGlkID0gNTdcbiAqKiBtb2R1bGUgY2h1bmtzID0gMjRcbiAqKi8iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=");

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

	eval("/**\n * A resource factory inspired by $resource from AngularJS\n * @version v2.0.0 - 2015-02-11\n * @link https://github.com/FineLinePrototyping/angularjs-rails-resource.git\n * @author \n */\n\n(function (undefined) {\n    angular.module('rails', ['ng']);\n}());\n\n\n\n(function (undefined) {\n    angular.module('rails').factory('RailsInflector', function() {\n        function camelize(key) {\n            if (!angular.isString(key)) {\n                return key;\n            }\n\n            // should this match more than word and digit characters?\n            return key.replace(/_[\\w\\d]/g, function (match, index, string) {\n                return index === 0 ? match : string.charAt(index + 1).toUpperCase();\n            });\n        }\n\n        function underscore(key) {\n            if (!angular.isString(key)) {\n                return key;\n            }\n\n            // TODO match the latest logic from Active Support\n            return key.replace(/[A-Z]/g, function (match, index) {\n                return index === 0 ? match : '_' + match.toLowerCase();\n            });\n        }\n\n        function pluralize(value) {\n            // TODO match Active Support\n            return value + 's';\n        }\n\n        return {\n            camelize: camelize,\n            underscore: underscore,\n            pluralize: pluralize\n        };\n    });\n}());\n(function (undefined) {\n    angular.module('rails').factory('RailsResourceInjector', ['$injector', function($injector) {\n        /**\n         * Allow dependencies to be referenced by name or instance.  If referenced by name AngularJS $injector\n         * is used to retrieve the dependency.\n         *\n         * @param dependency (string | function) The dependency to retrieve\n         * @returns {*} The dependency\n         */\n        function getDependency(dependency) {\n            if (dependency) {\n                return angular.isString(dependency) ? $injector.get(dependency) : dependency;\n            }\n\n            return undefined;\n        }\n\n        /**\n         * Looks up and instantiates an instance of the requested service.  If the service is not a string then it is\n         * assumed to be a constructor function.\n         *\n         * @param {String|function|Object} service  The service to instantiate\n         * @returns {*} A new instance of the requested service\n         */\n        function createService(service) {\n            if (service) {\n                return $injector.instantiate(getDependency(service));\n            }\n\n            return undefined;\n        }\n\n        /**\n         * Looks up and instantiates an instance of the requested service if .\n         * @param {String|function|Object} service The service to instantiate\n         * @returns {*}\n         */\n        function getService(service) {\n            // strings and functions are not considered objects by angular.isObject()\n            if (angular.isObject(service)) {\n                return service;\n            } else if (service) {\n                return createService(service);\n            }\n\n            return undefined;\n        }\n\n        return {\n            createService: createService,\n            getService: getService,\n            getDependency: getDependency\n        };\n    }]);\n}());\n/**\n * @ngdoc function\n * @name rails.railsUrlBuilder\n * @function\n * @requires $interpolate\n *\n * @description\n *\n * Compiles a URL template string into an interpolation function using $interpolate.  If no interpolation bindings\n * found then {{id}} is appended to the url string.\n *\n   <pre>\n       expect(railsUrlBuilder('/books')()).toEqual('/books')\n       expect(railsUrlBuilder('/books')({id: 1})).toEqual('/books/1')\n       expect(railsUrlBuilder('/authors/{{authorId}}/books/{{id}}')({id: 1, authorId: 2})).toEqual('/authors/2/books/1')\n   </pre>\n *\n * If the $interpolate startSymbol and endSymbol have been customized those values should be used instead of {{ and }}\n *\n * @param {string|function} url If the url is a function then that function is returned.  Otherwise the url string\n *    is passed to $interpolate as an expression.\n *\n * @returns {function(context)} As stated by $interpolate documentation:\n *    An interpolation function which is used to compute the interpolated\n *    string. The function has these parameters:\n *\n *    * `context`: an object against which any expressions embedded in the strings are evaluated\n *      against.\n *\n */\n(function (undefined) {\n    angular.module('rails').factory('railsUrlBuilder', ['$interpolate', function($interpolate) {\n        return function (config) {\n            var url = config.url,\n              idAttribute = config.idAttribute,\n              expression;\n\n            if (angular.isFunction(url) || angular.isUndefined(url)) {\n                return url;\n            }\n\n            if (url.indexOf($interpolate.startSymbol()) === -1) {\n                url = url + '/' + $interpolate.startSymbol() + idAttribute + $interpolate.endSymbol();\n            }\n\n            expression = $interpolate(url);\n\n            return function (params) {\n                url = expression(params);\n\n                if (url.charAt(url.length - 1) === '/') {\n                    url = url.substr(0, url.length - 1);\n                }\n\n                return url;\n            };\n        };\n    }]);\n}());\n\n(function (undefined) {\n    angular.module('rails').provider('railsSerializer', function() {\n        var defaultOptions = {\n            underscore: undefined,\n            camelize: undefined,\n            pluralize: undefined,\n            exclusionMatchers: []\n        };\n\n        /**\n         * Configures the underscore method used by the serializer.  If not defined then <code>RailsInflector.underscore</code>\n         * will be used.\n         *\n         * @param {function(string):string} fn The function to use for underscore conversion\n         * @returns {railsSerializerProvider} The provider for chaining\n         */\n        this.underscore = function(fn) {\n            defaultOptions.underscore = fn;\n            return this;\n        };\n\n        /**\n         * Configures the camelize method used by the serializer.  If not defined then <code>RailsInflector.camelize</code>\n         * will be used.\n         *\n         * @param {function(string):string} fn The function to use for camelize conversion\n         * @returns {railsSerializerProvider} The provider for chaining\n         */\n        this.camelize = function(fn) {\n            defaultOptions.camelize = fn;\n            return this;\n        };\n\n        /**\n         * Configures the pluralize method used by the serializer.  If not defined then <code>RailsInflector.pluralize</code>\n         * will be used.\n         *\n         * @param {function(string):string} fn The function to use for pluralizing strings.\n         * @returns {railsSerializerProvider} The provider for chaining\n         */\n        this.pluralize = function(fn) {\n            defaultOptions.pluralize = fn;\n            return this;\n        };\n\n        /**\n         * Configures the array exclusion matchers by the serializer.  Exclusion matchers can be one of the following:\n         * * string - Defines a prefix that is used to test for exclusion\n         * * RegExp - A custom regular expression that is tested against the attribute name\n         * * function - A custom function that accepts a string argument and returns a boolean with true indicating exclusion.\n         *\n         * @param {Array.<string|function(string):boolean|RegExp} exclusions An array of exclusion matchers\n         * @returns {railsSerializerProvider} The provider for chaining\n         */\n        this.exclusionMatchers = function(exclusions) {\n            defaultOptions.exclusionMatchers = exclusions;\n            return this;\n        };\n\n        this.$get = ['$injector', 'RailsInflector', 'RailsResourceInjector', function ($injector, RailsInflector, RailsResourceInjector) {\n            defaultOptions.underscore = defaultOptions.underscore || RailsInflector.underscore;\n            defaultOptions.camelize = defaultOptions.camelize || RailsInflector.camelize;\n            defaultOptions.pluralize = defaultOptions.pluralize || RailsInflector.pluralize;\n\n            function railsSerializer(options, customizer) {\n\n                function Serializer() {\n                    if (angular.isFunction(options)) {\n                        customizer = options;\n                        options = {};\n                    }\n\n                    this.exclusions = {};\n                    this.inclusions = {};\n                    this.serializeMappings = {};\n                    this.deserializeMappings = {};\n                    this.customSerializedAttributes = {};\n                    this.preservedAttributes = {};\n                    this.customSerializers = {};\n                    this.nestedResources = {};\n                    this.options = angular.extend({excludeByDefault: false}, defaultOptions, options || {});\n\n                    if (customizer) {\n                        customizer.call(this, this);\n                    }\n                }\n\n                /**\n                 * Accepts a variable list of attribute names to exclude from JSON serialization.\n                 *\n                 * @param attributeNames... {string} Variable number of attribute name parameters\n                 * @returns {Serializer} this for chaining support\n                 */\n                Serializer.prototype.exclude = function () {\n                    var exclusions = this.exclusions;\n\n                    angular.forEach(arguments, function (attributeName) {\n                        exclusions[attributeName] = false;\n                    });\n\n                    return this;\n                };\n\n                /**\n                 * Accepts a variable list of attribute names that should be included in JSON serialization.\n                 * Using this method will by default exclude all other attributes and only the ones explicitly included using <code>only</code> will be serialized.\n                 * @param attributeNames... {string} Variable number of attribute name parameters\n                 * @returns {Serializer} this for chaining support\n                 */\n                Serializer.prototype.only = function () {\n                    var inclusions = this.inclusions;\n                    this.options.excludeByDefault = true;\n\n                    angular.forEach(arguments, function (attributeName) {\n                        inclusions[attributeName] = true;\n                    });\n\n                    return this;\n                };\n\n                /**\n                 * This is a shortcut for rename that allows you to specify a variable number of attributes that should all be renamed to\n                 * <code>{attributeName}_attributes</code> to work with the Rails nested_attributes feature.\n                 * @param attributeNames... {string} Variable number of attribute name parameters\n                 * @returns {Serializer} this for chaining support\n                 */\n                Serializer.prototype.nestedAttribute = function () {\n                    var self = this;\n\n                    angular.forEach(arguments, function (attributeName) {\n                        self.rename(attributeName, attributeName + '_attributes');\n                    });\n\n                    return this;\n                };\n\n                /**\n                 * Specifies an attribute that is a nested resource within the parent object.\n                 * Nested resources do not imply nested attributes, if you want both you still have to specify call <code>nestedAttribute</code> as well.\n                 *\n                 * A nested resource serves two purposes.  First, it defines the resource that should be used when constructing resources from the server.\n                 * Second, it specifies how the nested object should be serialized.\n                 *\n                 * An optional third parameter <code>serializer</code> is available to override the serialization logic\n                 * of the resource in case you need to serialize it differently in multiple contexts.\n                 *\n                 * @param attributeName {string} The name of the attribute that is a nested resource\n                 * @param resource {string | Resource} A reference to the resource that the attribute is a type of.\n                 * @param serializer {string | Serializer} (optional) An optional serializer reference to override the nested resource's default serializer\n                 * @returns {Serializer} this for chaining support\n                 */\n                Serializer.prototype.resource = function (attributeName, resource, serializer) {\n                    this.nestedResources[attributeName] = resource;\n\n                    if (serializer) {\n                        this.serializeWith(attributeName, serializer);\n                    }\n\n                    return this;\n                };\n\n                /**\n                 * Specifies a custom name mapping for an attribute.\n                 * On serializing to JSON the jsonName will be used.\n                 * On deserialization, if jsonName is seen then it will be renamed as javascriptName in the resulting resource.\n                 *\n                 * @param javascriptName {string} The attribute name as it appears in the JavaScript object\n                 * @param jsonName {string} The attribute name as it should appear in JSON\n                 * @param bidirectional {boolean} (optional) Allows turning off the bidirectional renaming, defaults to true.\n                 * @returns {Serializer} this for chaining support\n                 */\n                Serializer.prototype.rename = function (javascriptName, jsonName, bidirectional) {\n                    this.serializeMappings[javascriptName] = jsonName;\n\n                    if (bidirectional || bidirectional === undefined) {\n                        this.deserializeMappings[jsonName] = javascriptName;\n                    }\n                    return this;\n                };\n\n                /**\n                 * Allows custom attribute creation as part of the serialization to JSON.\n                 *\n                 * @param attributeName {string} The name of the attribute to add\n                 * @param value {*} The value to add, if specified as a function then the function will be called during serialization\n                 *     and should return the value to add.\n                 * @returns {Serializer} this for chaining support\n                 */\n                Serializer.prototype.add = function (attributeName, value) {\n                    this.customSerializedAttributes[attributeName] = value;\n                    return this;\n                };\n\n\n                /**\n                 * Allows the attribute to be preserved unmodified in the resulting object.\n                 *\n                 * @param attributeName {string} The name of the attribute to add\n                 * @returns {Serializer} this for chaining support\n                 */\n                Serializer.prototype.preserve = function(attributeName) {\n                    this.preservedAttributes[attributeName] =  true;\n                    return this;\n                };\n\n                /**\n                 * Specify a custom serializer to use for an attribute.\n                 *\n                 * @param attributeName {string} The name of the attribute\n                 * @param serializer {string | function} A reference to the custom serializer to use for the attribute.\n                 * @returns {Serializer} this for chaining support\n                 */\n                Serializer.prototype.serializeWith = function (attributeName, serializer) {\n                    this.customSerializers[attributeName] = serializer;\n                    return this;\n                };\n\n                /**\n                 * Determines whether or not an attribute should be excluded.\n                 *\n                 * If the option excludeByDefault has been set then attributes will default to excluded and will only\n                 * be included if they have been included using the \"only\" customization function.\n                 *\n                 * If the option excludeByDefault has not been set then attributes must be explicitly excluded using the \"exclude\"\n                 * customization function or must be matched by one of the exclusionMatchers.\n                 *\n                 * @param attributeName The name of the attribute to check for exclusion\n                 * @returns {boolean} true if excluded, false otherwise\n                 */\n                Serializer.prototype.isExcludedFromSerialization = function (attributeName) {\n                    if ((this.options.excludeByDefault && !this.inclusions.hasOwnProperty(attributeName)) || this.exclusions.hasOwnProperty(attributeName)) {\n                        return true;\n                    }\n\n                    if (this.options.exclusionMatchers) {\n                        var excluded = false;\n\n                        angular.forEach(this.options.exclusionMatchers, function (matcher) {\n                            if (angular.isString(matcher)) {\n                                excluded = excluded || attributeName.indexOf(matcher) === 0;\n                            } else if (angular.isFunction(matcher)) {\n                                excluded = excluded || matcher.call(undefined, attributeName);\n                            } else if (matcher instanceof RegExp) {\n                                excluded = excluded || matcher.test(attributeName);\n                            }\n                        });\n\n                        return excluded;\n                    }\n\n                    return false;\n                };\n\n                /**\n                 * Remaps the attribute name to the serialized form which includes:\n                 *   - checking for exclusion\n                 *   - remapping to a custom value specified by the rename customization function\n                 *   - underscoring the name\n                 *\n                 * @param attributeName The current attribute name\n                 * @returns {*} undefined if the attribute should be excluded or the mapped attribute name\n                 */\n                Serializer.prototype.getSerializedAttributeName = function (attributeName) {\n                    var mappedName = this.serializeMappings[attributeName] || attributeName;\n\n                    var mappedNameExcluded = this.isExcludedFromSerialization(mappedName),\n                        attributeNameExcluded = this.isExcludedFromSerialization(attributeName);\n\n                    if(this.options.excludeByDefault) {\n                        if(mappedNameExcluded && attributeNameExcluded) {\n                            return undefined;\n                        }\n                    } else {\n                        if (mappedNameExcluded || attributeNameExcluded) {\n                            return undefined;\n                        }\n                    }\n\n                    return this.underscore(mappedName);\n                };\n\n                /**\n                 * Determines whether or not an attribute should be excluded from deserialization.\n                 *\n                 * By default, we do not exclude any attributes from deserialization.\n                 *\n                 * @param attributeName The name of the attribute to check for exclusion\n                 * @returns {boolean} true if excluded, false otherwise\n                 */\n                Serializer.prototype.isExcludedFromDeserialization = function (attributeName) {\n                    return false;\n                };\n\n                /**\n                 * Remaps the attribute name to the deserialized form which includes:\n                 *   - camelizing the name\n                 *   - checking for exclusion\n                 *   - remapping to a custom value specified by the rename customization function\n                 *\n                 * @param attributeName The current attribute name\n                 * @returns {*} undefined if the attribute should be excluded or the mapped attribute name\n                 */\n                Serializer.prototype.getDeserializedAttributeName = function (attributeName) {\n                    var camelizedName = this.camelize(attributeName);\n\n                    camelizedName = this.deserializeMappings[attributeName] ||\n                        this.deserializeMappings[camelizedName] ||\n                        camelizedName;\n\n                    if (this.isExcludedFromDeserialization(attributeName) || this.isExcludedFromDeserialization(camelizedName)) {\n                        return undefined;\n                    }\n\n                    return camelizedName;\n                };\n\n                /**\n                 * Returns a reference to the nested resource that has been specified for the attribute.\n                 * @param attributeName The attribute name\n                 * @returns {*} undefined if no nested resource has been specified or a reference to the nested resource class\n                 */\n                Serializer.prototype.getNestedResource = function (attributeName) {\n                    return RailsResourceInjector.getDependency(this.nestedResources[attributeName]);\n                };\n\n                /**\n                 * Returns a custom serializer for the attribute if one has been specified.  Custom serializers can be specified\n                 * in one of two ways.  The serializeWith customization method allows specifying a custom serializer for any attribute.\n                 * Or an attribute could have been specified as a nested resource in which case the nested resource's serializer\n                 * is used.  Custom serializers specified using serializeWith take precedence over the nested resource serializer.\n                 *\n                 * @param attributeName The attribute name\n                 * @returns {*} undefined if no custom serializer has been specified or an instance of the Serializer\n                 */\n                Serializer.prototype.getAttributeSerializer = function (attributeName) {\n                    var resource = this.getNestedResource(attributeName),\n                        serializer = this.customSerializers[attributeName];\n\n                    // custom serializer takes precedence over resource serializer\n                    if (serializer) {\n                        return RailsResourceInjector.createService(serializer);\n                    } else if (resource) {\n                        return resource.config.serializer;\n                    }\n\n                    return undefined;\n                };\n\n\n                /**\n                 * Prepares the data for serialization to JSON.\n                 *\n                 * @param data The data to prepare\n                 * @returns {*} A new object or array that is ready for JSON serialization\n                 */\n                Serializer.prototype.serializeData = function (data) {\n                    var result = data,\n                        self = this;\n\n                    if (angular.isArray(data)) {\n                        result = [];\n\n                        angular.forEach(data, function (value) {\n                            result.push(self.serializeData(value));\n                        });\n                    } else if (angular.isObject(data)) {\n                        if (angular.isDate(data)) {\n                            return data;\n                        }\n                        result = {};\n\n                        this.serializeObject(result, data);\n\n                    }\n\n                    return result;\n                };\n\n                Serializer.prototype.serializeObject = function(result, data){\n\n\n                    var tthis = this;\n                    angular.forEach(data, function (value, key) {\n                        // if the value is a function then it can't be serialized to JSON so we'll just skip it\n                        if (!angular.isFunction(value)) {\n                            tthis.serializeAttribute(result, key, value);\n                        }\n                    });\n                    return data;\n                };\n\n                /**\n                 * Transforms an attribute and its value and stores it on the parent data object.  The attribute will be\n                 * renamed as needed and the value itself will be serialized as well.\n                 *\n                 * @param data The object that the attribute will be added to\n                 * @param attribute The attribute to transform\n                 * @param value The current value of the attribute\n                 */\n                Serializer.prototype.serializeAttribute = function (data, attribute, value) {\n                    var serializer = this.getAttributeSerializer(attribute),\n                        serializedAttributeName = this.getSerializedAttributeName(attribute);\n\n                    // undefined means the attribute should be excluded from serialization\n                    if (serializedAttributeName === undefined) {\n                        return;\n                    }\n\n                    data[serializedAttributeName] = serializer ? serializer.serialize(value) : this.serializeData(value);\n                };\n\n                /**\n                 * Serializes the data by applying various transformations such as:\n                 *   - Underscoring attribute names\n                 *   - attribute renaming\n                 *   - attribute exclusion\n                 *   - custom attribute addition\n                 *\n                 * @param data The data to prepare\n                 * @returns {*} A new object or array that is ready for JSON serialization\n                 */\n                Serializer.prototype.serialize = function (data) {\n                    var result = angular.copy(data),\n                        self = this;\n\n                    if (angular.isObject(result)) {\n                        angular.forEach(this.customSerializedAttributes, function (value, key) {\n                            if (angular.isArray(result)) {\n                                angular.forEach(result, function (item, index) {\n                                    var itemValue = value;\n                                    if (angular.isFunction(value)) {\n                                        itemValue = itemValue.call(item, item);\n                                    }\n\n                                    self.serializeAttribute(item, key, itemValue);\n                                });\n                            } else {\n                                if (angular.isFunction(value)) {\n                                    value = value.call(data, data);\n                                }\n\n                                self.serializeAttribute(result, key, value);\n                            }\n                        });\n                    }\n\n                    result = this.serializeData(result);\n\n                    return result;\n                };\n\n                /**\n                 * Iterates over the data deserializing each entry on arrays and each key/value on objects.\n                 *\n                 * @param data The object to deserialize\n                 * @param Resource (optional) The resource type to deserialize the result into\n                 * @returns {*} A new object or an instance of Resource populated with deserialized data.\n                 */\n                Serializer.prototype.deserializeData = function (data, Resource) {\n                    var result = data,\n                        self = this;\n\n                    if (angular.isArray(data)) {\n                        result = [];\n\n                        angular.forEach(data, function (value) {\n                            result.push(self.deserializeData(value, Resource));\n                        });\n                    } else if (angular.isObject(data)) {\n                        if (angular.isDate(data)) {\n                            return data;\n                        }\n                        result = {};\n\n                        if (Resource) {\n                            result = new Resource.config.resourceConstructor();\n                        }\n\n                        this.deserializeObject(result, data);\n\n                    }\n\n                    return result;\n                };\n\n                Serializer.prototype.deserializeObject = function (result, data) {\n\n                    var tthis = this;\n                    angular.forEach(data, function (value, key) {\n                        tthis.deserializeAttribute(result, key, value);\n                    });\n                    return data;\n                };\n\n\n                /**\n                 * Transforms an attribute and its value and stores it on the parent data object.  The attribute will be\n                 * renamed as needed and the value itself will be deserialized as well.\n                 *\n                 * @param data The object that the attribute will be added to\n                 * @param attribute The attribute to transform\n                 * @param value The current value of the attribute\n                 */\n                Serializer.prototype.deserializeAttribute = function (data, attribute, value) {\n                    var serializer,\n                        NestedResource,\n                        attributeName = this.getDeserializedAttributeName(attribute);\n\n                    // undefined means the attribute should be excluded from serialization\n                    if (attributeName === undefined) {\n                        return;\n                    }\n\n                    serializer = this.getAttributeSerializer(attributeName);\n                    NestedResource = this.getNestedResource(attributeName);\n\n                    // preserved attributes are assigned unmodified\n                    if (this.preservedAttributes[attributeName]) {\n                        data[attributeName] = value;\n                    } else {\n                        data[attributeName] = serializer ? serializer.deserialize(value, NestedResource) : this.deserializeData(value, NestedResource);\n                    }\n                };\n\n                /**\n                 * Deserializes the data by applying various transformations such as:\n                 *   - Camelizing attribute names\n                 *   - attribute renaming\n                 *   - attribute exclusion\n                 *   - nested resource creation\n                 *\n                 * @param data The object to deserialize\n                 * @param Resource (optional) The resource type to deserialize the result into\n                 * @returns {*} A new object or an instance of Resource populated with deserialized data\n                 */\n                Serializer.prototype.deserialize = function (data, Resource) {\n                    // just calls deserializeValue for now so we can more easily add on custom attribute logic for deserialize too\n                    return this.deserializeData(data, Resource);\n                };\n\n                Serializer.prototype.pluralize = function (value) {\n                    if (this.options.pluralize) {\n                        return this.options.pluralize(value);\n                    }\n                    return value;\n                };\n\n                Serializer.prototype.underscore = function (value) {\n                    if (this.options.underscore) {\n                        return this.options.underscore(value);\n                    }\n                    return value;\n                };\n\n                Serializer.prototype.camelize = function (value) {\n                    if (this.options.camelize) {\n                        return this.options.camelize(value);\n                    }\n                    return value;\n                };\n\n                return Serializer;\n            }\n\n            railsSerializer.defaultOptions = defaultOptions;\n            return railsSerializer;\n        }];\n    });\n}());\n(function (undefined) {\n    angular.module('rails').factory('railsRootWrapper', function () {\n        return {\n            wrap: function (data, resource) {\n                var result = {};\n                result[angular.isArray(data) ? resource.config.pluralName : resource.config.name] = data;\n                return result;\n            },\n            unwrap: function (response, resource, isObject) {\n                if (response.data && response.data.hasOwnProperty(resource.config.name)) {\n                    response.data = response.data[resource.config.name];\n                } else if (response.data && response.data.hasOwnProperty(resource.config.pluralName) && !isObject) {\n                    response.data = response.data[resource.config.pluralName];\n                }\n\n                return response;\n            }\n        };\n    });\n\n    angular.module('rails').provider('RailsResource', function () {\n        var defaultOptions = {\n            rootWrapping: true,\n            updateMethod: 'put',\n            httpConfig: {},\n            defaultParams: undefined,\n            underscoreParams: true,\n            fullResponse: false,\n            extensions: []\n        };\n\n        /**\n         * Enables or disables root wrapping by default for RailsResources\n         * Defaults to true.\n         * @param {boolean} value true to enable root wrapping, false to disable\n         * @returns {RailsResourceProvider} The provider instance\n         */\n        this.rootWrapping = function (value) {\n            defaultOptions.rootWrapping = value;\n            return this;\n        };\n\n        /**\n         * Configures what HTTP operation should be used for update by default for RailsResources.\n         * Defaults to 'put'\n         * @param value\n         * @returns {RailsResourceProvider} The provider instance\n         */\n        this.updateMethod = function (value) {\n            defaultOptions.updateMethod = value;\n            return this;\n        };\n\n        /**\n         * Configures default HTTP configuration operations for all RailsResources.\n         *\n         * @param {Object} value See $http for available configuration options.\n         * @returns {RailsResourceProvider} The provider instance\n         */\n        this.httpConfig = function (value) {\n            defaultOptions.httpConfig = value;\n            return this;\n        };\n\n        /**\n         * Configures default HTTP query parameters for all RailsResources.\n         *\n         * @param {Object} value Object of key/value pairs representing the HTTP query parameters for all HTTP operations.\n         * @returns {RailsResourceProvider} The provider instance\n         */\n        this.defaultParams = function (value) {\n            defaultOptions.defaultParams = value;\n            return this;\n        };\n\n        /**\n         * Configures whether or not underscore query parameters\n         * @param {boolean} value true to underscore.  Defaults to true.\n         * @returns {RailsResourceProvider} The provider instance\n         */\n        this.underscoreParams = function (value) {\n            defaultOptions.underscoreParams = value;\n            return this;\n        };\n\n        /**\n         * Configures whether the full response from $http is returned or just the result data.\n         * @param {boolean} value true to return full $http response.  Defaults to false.\n         * @returns {RailsResourceProvider} The provider instance\n         */\n        this.fullResponse = function (value) {\n            defaultOptions.fullResponse = value;\n            return this;\n        };\n\n        /**\n         * List of RailsResource extensions to include by default.\n         *\n         * @param {...string} extensions One or more extension names to include\n         * @returns {*}\n         */\n        this.extensions = function () {\n            defaultOptions.extensions = [];\n            angular.forEach(arguments, function (value) {\n                defaultOptions.extensions = defaultOptions.extensions.concat(value);\n            });\n            return this;\n        };\n\n        this.$get = ['$http', '$q', 'railsUrlBuilder', 'railsSerializer', 'railsRootWrapper', 'RailsResourceInjector',\n            function ($http, $q, railsUrlBuilder, railsSerializer, railsRootWrapper, RailsResourceInjector) {\n\n                function RailsResource(value) {\n                    if (value) {\n                        var response = this.constructor.deserialize({data: value});\n                        if (this.constructor.config.rootWrapping) {\n                            response = railsRootWrapper.unwrap(response, this.constructor, true);\n                        }\n                        angular.extend(this, response.data);\n                    }\n                }\n\n                /**\n                 * Extends the RailsResource to the child constructor function making the child constructor a subclass of\n                 * RailsResource.  This is modeled off of CoffeeScript's class extend function.  All RailsResource\n                 * class properties defined are copied to the child class and the child's prototype chain is configured\n                 * to allow instances of the child class to have all of the instance methods of RailsResource.\n                 *\n                 * Like CoffeeScript, a __super__ property is set on the child class to the parent resource's prototype chain.\n                 * This is done to allow subclasses to extend the functionality of instance methods and still\n                 * call back to the original method using:\n                 *\n                 *     Class.__super__.method.apply(this, arguments);\n                 *\n                 * @param {function} child Child constructor function\n                 * @returns {function} Child constructor function\n                 */\n                RailsResource.extendTo = function (child) {\n                    angular.forEach(this, function (value, key) {\n                        child[key] = value;\n                    });\n\n                    if (angular.isArray(this.$modules)) {\n                        child.$modules = this.$modules.slice(0);\n                    }\n\n                    function ctor() {\n                        this.constructor = child;\n                    }\n\n                    ctor.prototype = this.prototype;\n                    child.prototype = new ctor();\n                    child.__super__ = this.prototype;\n                    return child;\n                };\n\n                /**\n                 * Copies a mixin's properties to the resource.\n                 *\n                 * If module is a String then we it will be loaded using Angular's dependency injection.  If the name is\n                 * not valid then Angular will throw an error.\n                 *\n                 * @param {...String|function|Object} mixins The mixin or name of the mixin to add.\n                 * @returns {RailsResource} this\n                 */\n                RailsResource.extend = function () {\n                    angular.forEach(arguments, function (mixin) {\n                        addMixin(this, this, mixin, function (Resource, mixin) {\n                            if (angular.isFunction(mixin.extended)) {\n                                mixin.extended(Resource);\n                            }\n                        });\n                    }, this);\n\n                    return this;\n                };\n\n                /**\n                 * Copies a mixin's properties to the resource's prototype chain.\n                 *\n                 * If module is a String then we it will be loaded using Angular's dependency injection.  If the name is\n                 * not valid then Angular will throw an error.\n                 *\n                 * @param {...String|function|Object} mixins The mixin or name of the mixin to add\n                 * @returns {RailsResource} this\n                 */\n                RailsResource.include = function () {\n                    angular.forEach(arguments, function (mixin) {\n                        addMixin(this, this.prototype, mixin, function (Resource, mixin) {\n                            if (angular.isFunction(mixin.included)) {\n                                mixin.included(Resource);\n                            }\n                        });\n                    }, this);\n\n                    return this;\n                };\n\n                /**\n                 * Sets configuration options.  This method may be called multiple times to set additional options or to\n                 * override previous values (such as the case with inherited resources).\n                 * @param cfg\n                 */\n                RailsResource.configure = function (cfg) {\n                    cfg = cfg || {};\n\n                    if (this.config) {\n                        cfg = angular.extend({}, this.config, cfg);\n                    }\n\n                    this.config = {};\n                    this.config.idAttribute = cfg.idAttribute || 'id';\n                    this.config.url = cfg.url;\n                    this.config.rootWrapping = booleanParam(cfg.rootWrapping, defaultOptions.rootWrapping); // using undefined check because config.rootWrapping || true would be true when config.rootWrapping === false\n                    this.config.httpConfig = cfg.httpConfig || defaultOptions.httpConfig;\n                    this.config.httpConfig.headers = angular.extend({'Accept': 'application/json', 'Content-Type': 'application/json'}, this.config.httpConfig.headers || {});\n                    this.config.defaultParams = cfg.defaultParams || defaultOptions.defaultParams;\n                    this.config.underscoreParams = booleanParam(cfg.underscoreParams, defaultOptions.underscoreParams);\n                    this.config.updateMethod = (cfg.updateMethod || defaultOptions.updateMethod).toLowerCase();\n                    this.config.fullResponse = booleanParam(cfg.fullResponse, defaultOptions.fullResponse);\n\n                    this.config.requestTransformers = cfg.requestTransformers ? cfg.requestTransformers.slice(0) : [];\n                    this.config.responseInterceptors = cfg.responseInterceptors ? cfg.responseInterceptors.slice(0) : [];\n                    this.config.afterResponseInterceptors = cfg.afterResponseInterceptors ? cfg.afterResponseInterceptors.slice(0) : [];\n                    this.config.interceptors = cfg.interceptors ? cfg.interceptors.slice(0) : [];\n\n                    this.config.serializer = RailsResourceInjector.getService(cfg.serializer || railsSerializer());\n\n                    this.config.name = this.config.serializer.underscore(cfg.name);\n\n                    // we don't want to turn undefined name into \"undefineds\" then the plural name won't update when the name is set\n                    if (this.config.name) {\n                        this.config.pluralName = this.config.serializer.underscore(cfg.pluralName || this.config.serializer.pluralize(this.config.name));\n                    }\n\n                    this.config.urlBuilder = railsUrlBuilder(this.config);\n                    this.config.resourceConstructor = this;\n\n                    this.extend.apply(this, loadExtensions((cfg.extensions || []).concat(defaultOptions.extensions)));\n\n                    angular.forEach(this.$mixins, function (mixin) {\n                        if (angular.isFunction(mixin.configure)) {\n                            mixin.configure(this.config, cfg);\n                        }\n                    }, this);\n                };\n\n                /**\n                 * Configures the URL for the resource.\n                 * @param {String|function} url The url string or function.\n                 */\n                RailsResource.setUrl = function (url) {\n                    this.configure({url: url});\n                };\n\n                RailsResource.buildUrl = function (context) {\n                    return this.config.urlBuilder(context);\n                };\n\n                /**\n                 * Interceptors utilize $q promises to allow for both synchronous and asynchronous processing during\n                 * a request / response cycle.\n                 *\n                 * Interceptors can be added as a service factory name or as an object with properties matching one\n                 * or more of the phases.  Each property should have a value of a function to be called during that phase.\n                 *\n                 * There are multiple phases for both request and response.  In addition, each phase has a corresponding\n                 * error phase to handle promise rejections.\n                 *\n                 * Each request phase interceptor is called with the $http config object, the resource constructor, and if\n                 * applicable the resource instance.  The interceptor is free to modify the config or create a new one.\n                 * The interceptor function must return a valid $http config or a promise that will eventually resolve\n                 * to a config object.\n                 *\n                 * The valid request phases are:\n                 *\n                 * * beforeRequest: Interceptors are called prior to any data serialization or root wrapping.\n                 * * beforeRequestError: Interceptors get called when a previous interceptor threw an error or\n                 *      resolved with a rejection.\n                 * * beforeRequestWrapping: Interceptors are called after data serialization but before root wrapping.\n                 * * beforeRequestWrappingError: Interceptors get called when a previous interceptor threw an error or\n                 *      resolved with a rejection.\n                 * * request:  Interceptors are called after any data serialization and root wrapping have been performed.\n                 * * requestError: Interceptors get called when a previous interceptor threw an error or\n                 *      resolved with a rejection.\n                 *\n                 * The beforeResponse and response interceptors are called with the $http response object,\n                 * the resource constructor, and if applicable the resource instance.  The afterResponse interceptors\n                 * are typically called with the response data instead of the full response object unless the config option\n                 * fullResponse has been set to true.  Like the request interceptor callbacks the response callbacks can\n                 * manipulate the data or return new data.  The interceptor function must return\n                 *\n                 * The valid response phases are:\n                 *\n                 * * beforeResponse: Interceptors are called prior to any data processing.\n                 * * beforeResponseError: Interceptors get called when a previous interceptor threw an error or\n                 *      resolved with a rejection.\n                 * * beforeResponseDeserialize: Interceptors are called after root unwrapping but prior to data deserializing.\n                 * * beforeResponseDeserializeError: Interceptors get called when a previous interceptor threw an error or\n                 *      resolved with a rejection.\n                 * * response:  Interceptors are called after the data has been deserialized and root unwrapped but\n                 *      prior to the data being copied to the resource instance if applicable.\n                 * * responseError: Interceptors get called when a previous interceptor threw an error or\n                 *      resolved with a rejection.\n                 * * afterResponse:  Interceptors are called at the very end of the response chain after all processing\n                 *      has been completed.  The value of the first parameter is one of the following:\n                 *       - resource instance: When fullResponse is false and the operation was called on a resource instance.\n                 *       - response data: When fullResponse is false and the operation was called on the resource class.\n                 *       - $http response: When fullResponse is true\n                 * * afterResponseError: Interceptors get called when a previous interceptor threw an error or\n                 *      resolved with a rejection.\n                 *\n                 * @param {String | Object} interceptor\n                 */\n                RailsResource.addInterceptor = function (interceptor) {\n                    this.config.interceptors.push(interceptor);\n                };\n\n                /**\n                 * Adds an interceptor callback function for the specified phase.\n                 * @param {String} phase The interceptor phase, one of:\n                 *      beforeRequest, request, beforeResponse, response, afterResponse\n                 * @param fn The function to call.\n                 */\n                RailsResource.intercept = function (phase, fn) {\n                    var interceptor = {};\n                    fn = RailsResourceInjector.getDependency(fn);\n\n                    interceptor[phase] = function (value, resourceConstructor, context) {\n                        return fn(value, resourceConstructor, context) || value;\n                    };\n\n                    this.addInterceptor(interceptor);\n                };\n\n                /**\n                 * Adds interceptor on 'beforeRequest' phase.\n                 * @param fn(httpConfig, constructor, context) - httpConfig is the config object to pass to $http,\n                 *      constructor is the resource class calling the function,\n                 *      context is the resource instance of the calling method (create, update, delete) or undefined if the method was a class method (get, query)\n                 */\n                RailsResource.interceptBeforeRequest = function (fn) {\n                    this.intercept('beforeRequest', fn);\n                };\n\n                /**\n                 * Adds interceptor on 'beforeRequestWrapping' phase.\n                 * @param fn(httpConfig, constructor, context) - httpConfig is the config object to pass to $http,\n                 *      constructor is the resource class calling the function,\n                 *      context is the resource instance of the calling method (create, update, delete) or undefined if the method was a class method (get, query)\n                 */\n                RailsResource.interceptBeforeRequestWrapping = function (fn) {\n                    this.intercept('beforeRequestWrapping', fn);\n                };\n\n                /**\n                 * Adds interceptor on 'request' phase.\n                 * @param fn(httpConfig, constructor, context) - httpConfig is the config object to pass to $http,\n                 *      constructor is the resource class calling the function,\n                 *      context is the resource instance of the calling method (create, update, delete) or undefined if the method was a class method (get, query)\n                 */\n                RailsResource.interceptRequest = function (fn) {\n                    this.intercept('request', fn);\n                };\n\n                /**\n                 * Adds interceptor on 'beforeResponse' phase.\n                 * @param fn(response data, constructor, context) - response data is either the resource instance returned or an array of resource instances,\n                 *      constructor is the resource class calling the function,\n                 *      context is the resource instance of the calling method (create, update, delete) or undefined if the method was a class method (get, query)\n                 */\n                RailsResource.interceptBeforeResponse = function (fn) {\n                    this.intercept('beforeResponse', fn);\n                };\n\n                /**\n                 * Adds interceptor on 'beforeResponseDeserialize' phase.\n                 * @param fn(response data, constructor, context) - response data is either the resource instance returned or an array of resource instances,\n                 *      constructor is the resource class calling the function,\n                 *      context is the resource instance of the calling method (create, update, delete) or undefined if the method was a class method (get, query)\n                 */\n                RailsResource.interceptBeforeResponseDeserialize = function (fn) {\n                    this.intercept('beforeResponseDeserialize', fn);\n                };\n\n                /**\n                 * Adds interceptor on 'response' phase.\n                 * @param fn(response data, constructor, context) - response data is either the resource instance returned or an array of resource instances,\n                 *      constructor is the resource class calling the function,\n                 *      context is the resource instance of the calling method (create, update, delete) or undefined if the method was a class method (get, query)\n                 */\n                RailsResource.interceptResponse = function (fn) {\n                    this.intercept('response', fn);\n                };\n\n                /**\n                 * Adds interceptor on 'afterResponse' phase.\n                 * @param fn(response data, constructor, context) - response data is either the resource instance returned or an array of resource instances,\n                 *      constructor is the resource class calling the function,\n                 *      context is the resource instance of the calling method (create, update, delete) or undefined if the method was a class method (get, query)\n                 */\n                RailsResource.interceptAfterResponse = function (fn) {\n                    this.intercept('afterResponse', fn);\n                };\n\n                /**\n                 * Deprecated, see interceptors\n                 * Add a callback to run on response.\n                 * @deprecated since version 1.0.0, use interceptResponse instead\n                 * @param fn(response data, constructor, context) - response data is either the resource instance returned or an array of resource instances,\n                 *      constructor is the resource class calling the function,\n                 *      context is the resource instance of the calling method (create, update, delete) or undefined if the method was a class method (get, query)\n                 */\n                RailsResource.beforeResponse = function (fn) {\n                    fn = RailsResourceInjector.getDependency(fn);\n                    this.interceptResponse(function (response, resource, context) {\n                        fn(response.data, resource.config.resourceConstructor, context);\n                        return response;\n                    });\n                };\n\n                /**\n                 * Deprecated, see interceptors\n                 * Add a callback to run after response has been processed.  These callbacks are not called on object construction.\n                 * @deprecated since version 1.0.0, use interceptAfterResponse instead\n                 * @param fn(response data, constructor) - response data is either the resource instance returned or an array of resource instances and constructor is the resource class calling the function\n                 */\n                RailsResource.afterResponse = function (fn) {\n                    fn = RailsResourceInjector.getDependency(fn);\n                    this.interceptAfterResponse(function (response, resource, context) {\n                        fn(response, resource.config.resourceConstructor, context);\n                        return response;\n                    });\n                };\n\n                /**\n                 * Deprecated, see interceptors\n                 * Adds a function to run after serializing the data to send to the server, but before root-wrapping it.\n                 * @deprecated since version 1.0.0, use interceptBeforeRequestWrapping instead\n                 * @param fn (data, constructor) - data object is the serialized resource instance, and constructor the resource class calling the function\n                 */\n                RailsResource.beforeRequest = function (fn) {\n                    fn = RailsResourceInjector.getDependency(fn);\n                    this.interceptBeforeRequestWrapping(function (httpConfig, resource) {\n                        httpConfig.data = fn(httpConfig.data, resource.config.resourceConstructor) || httpConfig.data;\n                        return httpConfig;\n                    });\n                };\n\n                RailsResource.serialize = function (httpConfig) {\n                    if (httpConfig.data) {\n                        httpConfig.data = this.config.serializer.serialize(httpConfig.data);\n                    }\n\n                    return httpConfig;\n                };\n\n                /**\n                 * Deserializes the response data on the $http response.  Stores the original version of the data\n                 * on the response as \"originalData\" and sets the deserialized data in the \"data\" property.\n                 * @param response The $http response object\n                 * @returns {*} The $http response\n                 */\n                RailsResource.deserialize = function (response) {\n                    response.data = this.config.serializer.deserialize(response.data, this.config.resourceConstructor);\n                    return response;\n                };\n\n                /**\n                 * Deprecated, see interceptors\n                 * Transform data after response has been converted to a resource instance\n                 * @deprecated\n                 * @param promise\n                 * @param context\n                 */\n                RailsResource.callResponseInterceptors = function (promise, context) {\n                    var config = this.config;\n                    forEachDependency(config.responseInterceptors, function (interceptor) {\n                        promise.resource = config.resourceConstructor;\n                        promise.context = context;\n                        promise = interceptor(promise);\n                    });\n                    return promise;\n                };\n\n                /**\n                 * Deprecated, see interceptors\n                 * Transform data after response has been converted to a resource instance\n                 * @deprecated\n                 * @param promise\n                 * @param context\n                 */\n                RailsResource.callAfterResponseInterceptors = function (promise) {\n                    var config = this.config;\n                    // data is now deserialized. call response interceptors including afterResponse\n                    forEachDependency(config.afterResponseInterceptors, function (interceptor) {\n                        promise.resource = config.resourceConstructor;\n                        promise = interceptor(promise);\n                    });\n\n                    return promise;\n                };\n\n                RailsResource.runInterceptorPhase = function (phase, context, promise) {\n                    var config = this.config, chain = [];\n\n                    forEachDependency(config.interceptors, function (interceptor) {\n                        if (interceptor[phase] || interceptor[phase + 'Error']) {\n                            chain.push(interceptor[phase], interceptor[phase + 'Error']);\n                        }\n                    });\n\n                    while (chain.length) {\n                        var thenFn = chain.shift();\n                        var rejectFn = chain.shift();\n\n                        promise = promise.then(createInterceptorSuccessCallback(thenFn, config.resourceConstructor, context),\n                            createInterceptorRejectionCallback(rejectFn, config.resourceConstructor, context));\n                    }\n\n                    return promise;\n                };\n\n                /**\n                 * Executes an HTTP request using $http.\n                 *\n                 * This method is used by all RailsResource operations that execute HTTP requests.  Handles serializing\n                 * the request data using the resource serializer, root wrapping (if enabled), deserializing the response\n                 * data using the resource serializer, root unwrapping (if enabled), and copying the result back into the\n                 * resource context if applicable.  Executes interceptors at each phase of the request / response to allow\n                 * users to build synchronous & asynchronous customizations to manipulate the data as necessary.\n                 *\n                 * @param httpConfig The config to pass to $http, see $http docs for details\n                 * @param context An optional reference to the resource instance that is the context for the operation.\n                 *      If specified, the result data will be copied into the context during the response handling.\n                 * @param resourceConfigOverrides An optional set of RailsResource configuration options overrides.\n                 *      These overrides allow users to build custom operations more easily with different resource settings.\n                 * @returns {Promise} The promise that will eventually be resolved after all request / response handling\n                 *      has completed.\n                 */\n                RailsResource.$http = function (httpConfig, context, resourceConfigOverrides) {\n                    var config = angular.extend(angular.copy(this.config), resourceConfigOverrides || {}),\n                        resourceConstructor = config.resourceConstructor,\n                        promise = $q.when(httpConfig);\n\n                    if (!config.skipRequestProcessing) {\n\n                        promise = this.runInterceptorPhase('beforeRequest', context, promise).then(function (httpConfig) {\n                            httpConfig = resourceConstructor.serialize(httpConfig);\n\n                            forEachDependency(config.requestTransformers, function (transformer) {\n                                httpConfig.data = transformer(httpConfig.data, config.resourceConstructor);\n                            });\n\n                            return httpConfig;\n                        });\n\n                        promise = this.runInterceptorPhase('beforeRequestWrapping', context, promise);\n\n                        if (config.rootWrapping) {\n                            promise = promise.then(function (httpConfig) {\n                                httpConfig.data = railsRootWrapper.wrap(httpConfig.data, config.resourceConstructor);\n                                return httpConfig;\n                            });\n                        }\n\n                        promise = this.runInterceptorPhase('request', context, promise).then(function (httpConfig) {\n                            return $http(httpConfig);\n                        });\n\n                    } else {\n\n                        promise = $http(httpConfig);\n\n                    }\n\n                    promise = this.runInterceptorPhase('beforeResponse', context, promise).then(function (response) {\n                      // store off the data so we don't lose access to it after deserializing and unwrapping\n                      response.originalData = response.data;\n                      return response;\n                    });\n\n                    if (config.rootWrapping) {\n                        promise = promise.then(function (response) {\n                            return railsRootWrapper.unwrap(response, config.resourceConstructor, false);\n                        });\n                    }\n\n                    promise = this.runInterceptorPhase('beforeResponseDeserialize', context, promise).then(function (response) {\n                        return resourceConstructor.deserialize(response);\n                    });\n\n                    promise = this.callResponseInterceptors(promise, context);\n                    promise = this.runInterceptorPhase('response', context, promise).then(function (response) {\n                        if (context) {\n                            // we may not have response data\n                            if (response.hasOwnProperty('data') && angular.isObject(response.data)) {\n                                angular.extend(context, response.data);\n                            }\n                        }\n\n                        return config.fullResponse ? response : (context || response.data);\n                    });\n\n                    promise = this.callAfterResponseInterceptors(promise, context);\n                    promise = this.runInterceptorPhase('afterResponse', context, promise);\n                    promise.resource = config.resourceConstructor;\n                    promise.context = context;\n                    return promise;\n                };\n\n                /**\n                 * Processes query parameters before request.  You can override to modify\n                 * the query params or return a new object.\n                 *\n                 * @param {Object} queryParams - The query parameters for the request\n                 * @returns {Object} The query parameters for the request\n                 */\n                RailsResource.processParameters = function (queryParams) {\n                    var newParams = {};\n\n                    if (angular.isObject(queryParams) && this.config.underscoreParams) {\n                        angular.forEach(queryParams, function (v, k) {\n                            newParams[this.config.serializer.underscore(k)] = v;\n                        }, this);\n\n                        return newParams;\n                    }\n\n                    return queryParams;\n                };\n\n                RailsResource.getParameters = function (queryParams) {\n                    var params;\n\n                    if (this.config.defaultParams) {\n                        // we need to clone it so we don't modify it when we add the additional\n                        // query params below\n                        params = angular.copy(this.config.defaultParams);\n                    }\n\n                    if (angular.isObject(queryParams)) {\n                        params = angular.extend(params || {}, queryParams);\n                    }\n\n                    return this.processParameters(params);\n                };\n\n                RailsResource.getHttpConfig = function (queryParams) {\n                    var params = this.getParameters(queryParams);\n\n                    if (params) {\n                        return angular.extend({params: params}, this.config.httpConfig);\n                    }\n\n                    return angular.copy(this.config.httpConfig);\n                };\n\n                /**\n                 * Returns a URL from the given parameters.  You can override this method on your resource definitions to provide\n                 * custom logic for building your URLs or you can utilize the parameterized url strings to substitute values in the\n                 * URL string.\n                 *\n                 * The parameters in the URL string follow the normal Angular binding expression using {{ and }} for the start/end symbols.\n                 *\n                 * If the context is a number and the URL string does not contain an id parameter then the number is appended\n                 * to the URL string.\n                 *\n                 * If the context is a number and the URL string does\n                 * @param context\n                 * @param path {string} (optional) An additional path to append to the URL\n                 * @return {string}\n                 */\n                RailsResource.$url = RailsResource.resourceUrl = function (context, path) {\n                    if (!angular.isObject(context)) {\n                        context = {id: context};\n                    }\n\n                    return appendPath(this.buildUrl(context || {}), path);\n                };\n\n                RailsResource.$get = function (url, queryParams) {\n                    return this.$http(angular.extend({method: 'get', url: url}, this.getHttpConfig(queryParams)));\n                };\n\n                RailsResource.query = function (queryParams, context) {\n                    return this.$get(this.resourceUrl(context), queryParams);\n                };\n\n                RailsResource.get = function (context, queryParams) {\n                    return this.$get(this.resourceUrl(context), queryParams);\n                };\n\n                /**\n                 * Returns the URL for this resource.\n                 *\n                 * @param path {string} (optional) An additional path to append to the URL\n                 * @returns {string} The URL for the resource\n                 */\n                RailsResource.prototype.$url = function (path) {\n                    return appendPath(this.constructor.resourceUrl(this), path);\n                };\n\n                /**\n                 * Executes $http with the resource instance as the context.\n                 *\n                 * @param httpConfig The config to pass to $http, see $http docs for details\n                 * @param context An optional reference to the resource instance that is the context for the operation.\n                 *      If specified, the result data will be copied into the context during the response handling.\n                 * @param resourceConfigOverrides An optional set of RailsResource configuration options overrides.\n                 *      These overrides allow users to build custom operations more easily with different resource settings.\n                 * @returns {Promise} The promise that will eventually be resolved after all request / response handling\n                 *      has completed.\n                 */\n                RailsResource.prototype.$http = function (httpConfig, resourceConfigOverrides) {\n                    return this.constructor.$http(httpConfig, this, resourceConfigOverrides);\n                };\n\n                angular.forEach(['post', 'put', 'patch'], function (method) {\n                    RailsResource['$' + method] = function (url, data, resourceConfigOverrides) {\n                        // clone so we can manipulate w/o modifying the actual instance\n                        data = angular.copy(data);\n                        return this.$http(angular.extend({method: method, url: url, data: data}, this.getHttpConfig()), null, resourceConfigOverrides);\n                    };\n\n                    RailsResource.prototype['$' + method] = function (url) {\n                        // clone so we can manipulate w/o modifying the actual instance\n                        var data = angular.copy(this, {});\n                        return this.constructor.$http(angular.extend({method: method, url: url, data: data}, this.constructor.getHttpConfig()), this);\n\n                    };\n                });\n\n                RailsResource.prototype.create = function () {\n                    return this.$post(this.$url(), this);\n                };\n\n                RailsResource.prototype.update = function () {\n                    return this['$' + this.constructor.config.updateMethod](this.$url(), this);\n                };\n\n                RailsResource.prototype.get = function () {\n                    return this.constructor.$http(angular.extend({method: 'GET', url: this.$url()}, this.constructor.getHttpConfig()), this);\n                };\n\n                RailsResource.prototype.isNew = function () {\n                    var idAttribute = this.constructor.config.idAttribute;\n                    return angular.isUndefined(this[idAttribute]) ||\n                        this[idAttribute] === null;\n                };\n\n                RailsResource.prototype.save = function () {\n                    if (this.isNew()) {\n                        return this.create();\n                    } else {\n                        return this.update();\n                    }\n                };\n\n                RailsResource.$delete = function (url, queryParams) {\n                    return this.$http(angular.extend({method: 'delete', url: url}, this.getHttpConfig(queryParams)));\n                };\n\n                RailsResource.prototype.$delete = function (url, queryParams) {\n                    return this.constructor.$http(angular.extend({method: 'delete', url: url}, this.constructor.getHttpConfig(queryParams)), this);\n                };\n\n                //using ['delete'] instead of .delete for IE7/8 compatibility\n                RailsResource.prototype.remove = RailsResource.prototype['delete'] = function () {\n                    return this.$delete(this.$url());\n                };\n\n                return RailsResource;\n\n                function appendPath(url, path) {\n                    if (path) {\n                        if (path[0] !== '/') {\n                            url += '/';\n                        }\n\n                        url += path;\n                    }\n\n                    return url;\n                }\n\n                function forEachDependency(list, callback) {\n                    var dependency;\n\n                    for (var i = 0, len = list.length; i < len; i++) {\n                        dependency = list[i];\n\n                        if (angular.isString(dependency)) {\n                            dependency = list[i] = RailsResourceInjector.getDependency(dependency);\n                        }\n\n                        callback(dependency);\n                    }\n                }\n\n                function addMixin(Resource, destination, mixin, callback) {\n                    var excludedKeys = ['included', 'extended,', 'configure'];\n\n                    if (!Resource.$mixins) {\n                        Resource.$mixins = [];\n                    }\n\n                    if (angular.isString(mixin)) {\n                        mixin = RailsResourceInjector.getDependency(mixin);\n                    }\n\n                    if (mixin && Resource.$mixins.indexOf(mixin) === -1) {\n                        angular.forEach(mixin, function (value, key) {\n                            if (excludedKeys.indexOf(key) === -1) {\n                                destination[key] = value;\n                            }\n                        });\n\n                        Resource.$mixins.push(mixin);\n\n                        if (angular.isFunction(callback)) {\n                            callback(Resource, mixin);\n                        }\n                    }\n                }\n\n                function loadExtensions(extensions) {\n                    var modules = [];\n\n                    angular.forEach(extensions, function (extensionName) {\n                        extensionName = 'RailsResource' + extensionName.charAt(0).toUpperCase() + extensionName.slice(1) + 'Mixin';\n\n                        modules.push(RailsResourceInjector.getDependency(extensionName));\n                    });\n\n                    return modules;\n                }\n\n                function booleanParam(value, defaultValue) {\n                    return angular.isUndefined(value) ? defaultValue : value;\n                }\n\n                function createInterceptorSuccessCallback(thenFn, resourceConstructor, context) {\n                    return function (data) {\n                        return (thenFn || angular.identity)(data, resourceConstructor, context);\n                    };\n                }\n\n                function createInterceptorRejectionCallback(rejectFn, resourceConstructor, context) {\n                    return function (rejection) {\n                        // can't use identity because we need to return a rejected promise to keep the error chain going\n                        return rejectFn ? rejectFn(rejection, resourceConstructor, context) : $q.reject(rejection);\n                    };\n                }\n            }];\n    });\n\n    angular.module('rails').factory('railsResourceFactory', ['RailsResource', function (RailsResource) {\n        return function (config) {\n            function Resource() {\n                Resource.__super__.constructor.apply(this, arguments);\n            }\n\n            RailsResource.extendTo(Resource);\n            Resource.configure(config);\n\n            return Resource;\n        };\n    }]);\n\n}());\n\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTguanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ib3dlcl9jb21wb25lbnRzL2FuZ3VsYXJqcy1yYWlscy1yZXNvdXJjZS9hbmd1bGFyanMtcmFpbHMtcmVzb3VyY2UuanM/NjE5ZiJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEEgcmVzb3VyY2UgZmFjdG9yeSBpbnNwaXJlZCBieSAkcmVzb3VyY2UgZnJvbSBBbmd1bGFySlNcbiAqIEB2ZXJzaW9uIHYyLjAuMCAtIDIwMTUtMDItMTFcbiAqIEBsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS9GaW5lTGluZVByb3RvdHlwaW5nL2FuZ3VsYXJqcy1yYWlscy1yZXNvdXJjZS5naXRcbiAqIEBhdXRob3IgXG4gKi9cblxuKGZ1bmN0aW9uICh1bmRlZmluZWQpIHtcbiAgICBhbmd1bGFyLm1vZHVsZSgncmFpbHMnLCBbJ25nJ10pO1xufSgpKTtcblxuXG5cbihmdW5jdGlvbiAodW5kZWZpbmVkKSB7XG4gICAgYW5ndWxhci5tb2R1bGUoJ3JhaWxzJykuZmFjdG9yeSgnUmFpbHNJbmZsZWN0b3InLCBmdW5jdGlvbigpIHtcbiAgICAgICAgZnVuY3Rpb24gY2FtZWxpemUoa2V5KSB7XG4gICAgICAgICAgICBpZiAoIWFuZ3VsYXIuaXNTdHJpbmcoa2V5KSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBrZXk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIHNob3VsZCB0aGlzIG1hdGNoIG1vcmUgdGhhbiB3b3JkIGFuZCBkaWdpdCBjaGFyYWN0ZXJzP1xuICAgICAgICAgICAgcmV0dXJuIGtleS5yZXBsYWNlKC9fW1xcd1xcZF0vZywgZnVuY3Rpb24gKG1hdGNoLCBpbmRleCwgc3RyaW5nKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGluZGV4ID09PSAwID8gbWF0Y2ggOiBzdHJpbmcuY2hhckF0KGluZGV4ICsgMSkudG9VcHBlckNhc2UoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgZnVuY3Rpb24gdW5kZXJzY29yZShrZXkpIHtcbiAgICAgICAgICAgIGlmICghYW5ndWxhci5pc1N0cmluZyhrZXkpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGtleTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gVE9ETyBtYXRjaCB0aGUgbGF0ZXN0IGxvZ2ljIGZyb20gQWN0aXZlIFN1cHBvcnRcbiAgICAgICAgICAgIHJldHVybiBrZXkucmVwbGFjZSgvW0EtWl0vZywgZnVuY3Rpb24gKG1hdGNoLCBpbmRleCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBpbmRleCA9PT0gMCA/IG1hdGNoIDogJ18nICsgbWF0Y2gudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgZnVuY3Rpb24gcGx1cmFsaXplKHZhbHVlKSB7XG4gICAgICAgICAgICAvLyBUT0RPIG1hdGNoIEFjdGl2ZSBTdXBwb3J0XG4gICAgICAgICAgICByZXR1cm4gdmFsdWUgKyAncyc7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgY2FtZWxpemU6IGNhbWVsaXplLFxuICAgICAgICAgICAgdW5kZXJzY29yZTogdW5kZXJzY29yZSxcbiAgICAgICAgICAgIHBsdXJhbGl6ZTogcGx1cmFsaXplXG4gICAgICAgIH07XG4gICAgfSk7XG59KCkpO1xuKGZ1bmN0aW9uICh1bmRlZmluZWQpIHtcbiAgICBhbmd1bGFyLm1vZHVsZSgncmFpbHMnKS5mYWN0b3J5KCdSYWlsc1Jlc291cmNlSW5qZWN0b3InLCBbJyRpbmplY3RvcicsIGZ1bmN0aW9uKCRpbmplY3Rvcikge1xuICAgICAgICAvKipcbiAgICAgICAgICogQWxsb3cgZGVwZW5kZW5jaWVzIHRvIGJlIHJlZmVyZW5jZWQgYnkgbmFtZSBvciBpbnN0YW5jZS4gIElmIHJlZmVyZW5jZWQgYnkgbmFtZSBBbmd1bGFySlMgJGluamVjdG9yXG4gICAgICAgICAqIGlzIHVzZWQgdG8gcmV0cmlldmUgdGhlIGRlcGVuZGVuY3kuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBwYXJhbSBkZXBlbmRlbmN5IChzdHJpbmcgfCBmdW5jdGlvbikgVGhlIGRlcGVuZGVuY3kgdG8gcmV0cmlldmVcbiAgICAgICAgICogQHJldHVybnMgeyp9IFRoZSBkZXBlbmRlbmN5XG4gICAgICAgICAqL1xuICAgICAgICBmdW5jdGlvbiBnZXREZXBlbmRlbmN5KGRlcGVuZGVuY3kpIHtcbiAgICAgICAgICAgIGlmIChkZXBlbmRlbmN5KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGFuZ3VsYXIuaXNTdHJpbmcoZGVwZW5kZW5jeSkgPyAkaW5qZWN0b3IuZ2V0KGRlcGVuZGVuY3kpIDogZGVwZW5kZW5jeTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBMb29rcyB1cCBhbmQgaW5zdGFudGlhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSByZXF1ZXN0ZWQgc2VydmljZS4gIElmIHRoZSBzZXJ2aWNlIGlzIG5vdCBhIHN0cmluZyB0aGVuIGl0IGlzXG4gICAgICAgICAqIGFzc3VtZWQgdG8gYmUgYSBjb25zdHJ1Y3RvciBmdW5jdGlvbi5cbiAgICAgICAgICpcbiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd8ZnVuY3Rpb258T2JqZWN0fSBzZXJ2aWNlICBUaGUgc2VydmljZSB0byBpbnN0YW50aWF0ZVxuICAgICAgICAgKiBAcmV0dXJucyB7Kn0gQSBuZXcgaW5zdGFuY2Ugb2YgdGhlIHJlcXVlc3RlZCBzZXJ2aWNlXG4gICAgICAgICAqL1xuICAgICAgICBmdW5jdGlvbiBjcmVhdGVTZXJ2aWNlKHNlcnZpY2UpIHtcbiAgICAgICAgICAgIGlmIChzZXJ2aWNlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICRpbmplY3Rvci5pbnN0YW50aWF0ZShnZXREZXBlbmRlbmN5KHNlcnZpY2UpKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBMb29rcyB1cCBhbmQgaW5zdGFudGlhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSByZXF1ZXN0ZWQgc2VydmljZSBpZiAuXG4gICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfGZ1bmN0aW9ufE9iamVjdH0gc2VydmljZSBUaGUgc2VydmljZSB0byBpbnN0YW50aWF0ZVxuICAgICAgICAgKiBAcmV0dXJucyB7Kn1cbiAgICAgICAgICovXG4gICAgICAgIGZ1bmN0aW9uIGdldFNlcnZpY2Uoc2VydmljZSkge1xuICAgICAgICAgICAgLy8gc3RyaW5ncyBhbmQgZnVuY3Rpb25zIGFyZSBub3QgY29uc2lkZXJlZCBvYmplY3RzIGJ5IGFuZ3VsYXIuaXNPYmplY3QoKVxuICAgICAgICAgICAgaWYgKGFuZ3VsYXIuaXNPYmplY3Qoc2VydmljZSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gc2VydmljZTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoc2VydmljZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBjcmVhdGVTZXJ2aWNlKHNlcnZpY2UpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGNyZWF0ZVNlcnZpY2U6IGNyZWF0ZVNlcnZpY2UsXG4gICAgICAgICAgICBnZXRTZXJ2aWNlOiBnZXRTZXJ2aWNlLFxuICAgICAgICAgICAgZ2V0RGVwZW5kZW5jeTogZ2V0RGVwZW5kZW5jeVxuICAgICAgICB9O1xuICAgIH1dKTtcbn0oKSk7XG4vKipcbiAqIEBuZ2RvYyBmdW5jdGlvblxuICogQG5hbWUgcmFpbHMucmFpbHNVcmxCdWlsZGVyXG4gKiBAZnVuY3Rpb25cbiAqIEByZXF1aXJlcyAkaW50ZXJwb2xhdGVcbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqXG4gKiBDb21waWxlcyBhIFVSTCB0ZW1wbGF0ZSBzdHJpbmcgaW50byBhbiBpbnRlcnBvbGF0aW9uIGZ1bmN0aW9uIHVzaW5nICRpbnRlcnBvbGF0ZS4gIElmIG5vIGludGVycG9sYXRpb24gYmluZGluZ3NcbiAqIGZvdW5kIHRoZW4ge3tpZH19IGlzIGFwcGVuZGVkIHRvIHRoZSB1cmwgc3RyaW5nLlxuICpcbiAgIDxwcmU+XG4gICAgICAgZXhwZWN0KHJhaWxzVXJsQnVpbGRlcignL2Jvb2tzJykoKSkudG9FcXVhbCgnL2Jvb2tzJylcbiAgICAgICBleHBlY3QocmFpbHNVcmxCdWlsZGVyKCcvYm9va3MnKSh7aWQ6IDF9KSkudG9FcXVhbCgnL2Jvb2tzLzEnKVxuICAgICAgIGV4cGVjdChyYWlsc1VybEJ1aWxkZXIoJy9hdXRob3JzL3t7YXV0aG9ySWR9fS9ib29rcy97e2lkfX0nKSh7aWQ6IDEsIGF1dGhvcklkOiAyfSkpLnRvRXF1YWwoJy9hdXRob3JzLzIvYm9va3MvMScpXG4gICA8L3ByZT5cbiAqXG4gKiBJZiB0aGUgJGludGVycG9sYXRlIHN0YXJ0U3ltYm9sIGFuZCBlbmRTeW1ib2wgaGF2ZSBiZWVuIGN1c3RvbWl6ZWQgdGhvc2UgdmFsdWVzIHNob3VsZCBiZSB1c2VkIGluc3RlYWQgb2Yge3sgYW5kIH19XG4gKlxuICogQHBhcmFtIHtzdHJpbmd8ZnVuY3Rpb259IHVybCBJZiB0aGUgdXJsIGlzIGEgZnVuY3Rpb24gdGhlbiB0aGF0IGZ1bmN0aW9uIGlzIHJldHVybmVkLiAgT3RoZXJ3aXNlIHRoZSB1cmwgc3RyaW5nXG4gKiAgICBpcyBwYXNzZWQgdG8gJGludGVycG9sYXRlIGFzIGFuIGV4cHJlc3Npb24uXG4gKlxuICogQHJldHVybnMge2Z1bmN0aW9uKGNvbnRleHQpfSBBcyBzdGF0ZWQgYnkgJGludGVycG9sYXRlIGRvY3VtZW50YXRpb246XG4gKiAgICBBbiBpbnRlcnBvbGF0aW9uIGZ1bmN0aW9uIHdoaWNoIGlzIHVzZWQgdG8gY29tcHV0ZSB0aGUgaW50ZXJwb2xhdGVkXG4gKiAgICBzdHJpbmcuIFRoZSBmdW5jdGlvbiBoYXMgdGhlc2UgcGFyYW1ldGVyczpcbiAqXG4gKiAgICAqIGBjb250ZXh0YDogYW4gb2JqZWN0IGFnYWluc3Qgd2hpY2ggYW55IGV4cHJlc3Npb25zIGVtYmVkZGVkIGluIHRoZSBzdHJpbmdzIGFyZSBldmFsdWF0ZWRcbiAqICAgICAgYWdhaW5zdC5cbiAqXG4gKi9cbihmdW5jdGlvbiAodW5kZWZpbmVkKSB7XG4gICAgYW5ndWxhci5tb2R1bGUoJ3JhaWxzJykuZmFjdG9yeSgncmFpbHNVcmxCdWlsZGVyJywgWyckaW50ZXJwb2xhdGUnLCBmdW5jdGlvbigkaW50ZXJwb2xhdGUpIHtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChjb25maWcpIHtcbiAgICAgICAgICAgIHZhciB1cmwgPSBjb25maWcudXJsLFxuICAgICAgICAgICAgICBpZEF0dHJpYnV0ZSA9IGNvbmZpZy5pZEF0dHJpYnV0ZSxcbiAgICAgICAgICAgICAgZXhwcmVzc2lvbjtcblxuICAgICAgICAgICAgaWYgKGFuZ3VsYXIuaXNGdW5jdGlvbih1cmwpIHx8IGFuZ3VsYXIuaXNVbmRlZmluZWQodXJsKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB1cmw7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh1cmwuaW5kZXhPZigkaW50ZXJwb2xhdGUuc3RhcnRTeW1ib2woKSkgPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgdXJsID0gdXJsICsgJy8nICsgJGludGVycG9sYXRlLnN0YXJ0U3ltYm9sKCkgKyBpZEF0dHJpYnV0ZSArICRpbnRlcnBvbGF0ZS5lbmRTeW1ib2woKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZXhwcmVzc2lvbiA9ICRpbnRlcnBvbGF0ZSh1cmwpO1xuXG4gICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKHBhcmFtcykge1xuICAgICAgICAgICAgICAgIHVybCA9IGV4cHJlc3Npb24ocGFyYW1zKTtcblxuICAgICAgICAgICAgICAgIGlmICh1cmwuY2hhckF0KHVybC5sZW5ndGggLSAxKSA9PT0gJy8nKSB7XG4gICAgICAgICAgICAgICAgICAgIHVybCA9IHVybC5zdWJzdHIoMCwgdXJsLmxlbmd0aCAtIDEpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHJldHVybiB1cmw7XG4gICAgICAgICAgICB9O1xuICAgICAgICB9O1xuICAgIH1dKTtcbn0oKSk7XG5cbihmdW5jdGlvbiAodW5kZWZpbmVkKSB7XG4gICAgYW5ndWxhci5tb2R1bGUoJ3JhaWxzJykucHJvdmlkZXIoJ3JhaWxzU2VyaWFsaXplcicsIGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgZGVmYXVsdE9wdGlvbnMgPSB7XG4gICAgICAgICAgICB1bmRlcnNjb3JlOiB1bmRlZmluZWQsXG4gICAgICAgICAgICBjYW1lbGl6ZTogdW5kZWZpbmVkLFxuICAgICAgICAgICAgcGx1cmFsaXplOiB1bmRlZmluZWQsXG4gICAgICAgICAgICBleGNsdXNpb25NYXRjaGVyczogW11cbiAgICAgICAgfTtcblxuICAgICAgICAvKipcbiAgICAgICAgICogQ29uZmlndXJlcyB0aGUgdW5kZXJzY29yZSBtZXRob2QgdXNlZCBieSB0aGUgc2VyaWFsaXplci4gIElmIG5vdCBkZWZpbmVkIHRoZW4gPGNvZGU+UmFpbHNJbmZsZWN0b3IudW5kZXJzY29yZTwvY29kZT5cbiAgICAgICAgICogd2lsbCBiZSB1c2VkLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0ge2Z1bmN0aW9uKHN0cmluZyk6c3RyaW5nfSBmbiBUaGUgZnVuY3Rpb24gdG8gdXNlIGZvciB1bmRlcnNjb3JlIGNvbnZlcnNpb25cbiAgICAgICAgICogQHJldHVybnMge3JhaWxzU2VyaWFsaXplclByb3ZpZGVyfSBUaGUgcHJvdmlkZXIgZm9yIGNoYWluaW5nXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLnVuZGVyc2NvcmUgPSBmdW5jdGlvbihmbikge1xuICAgICAgICAgICAgZGVmYXVsdE9wdGlvbnMudW5kZXJzY29yZSA9IGZuO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH07XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIENvbmZpZ3VyZXMgdGhlIGNhbWVsaXplIG1ldGhvZCB1c2VkIGJ5IHRoZSBzZXJpYWxpemVyLiAgSWYgbm90IGRlZmluZWQgdGhlbiA8Y29kZT5SYWlsc0luZmxlY3Rvci5jYW1lbGl6ZTwvY29kZT5cbiAgICAgICAgICogd2lsbCBiZSB1c2VkLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0ge2Z1bmN0aW9uKHN0cmluZyk6c3RyaW5nfSBmbiBUaGUgZnVuY3Rpb24gdG8gdXNlIGZvciBjYW1lbGl6ZSBjb252ZXJzaW9uXG4gICAgICAgICAqIEByZXR1cm5zIHtyYWlsc1NlcmlhbGl6ZXJQcm92aWRlcn0gVGhlIHByb3ZpZGVyIGZvciBjaGFpbmluZ1xuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5jYW1lbGl6ZSA9IGZ1bmN0aW9uKGZuKSB7XG4gICAgICAgICAgICBkZWZhdWx0T3B0aW9ucy5jYW1lbGl6ZSA9IGZuO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH07XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIENvbmZpZ3VyZXMgdGhlIHBsdXJhbGl6ZSBtZXRob2QgdXNlZCBieSB0aGUgc2VyaWFsaXplci4gIElmIG5vdCBkZWZpbmVkIHRoZW4gPGNvZGU+UmFpbHNJbmZsZWN0b3IucGx1cmFsaXplPC9jb2RlPlxuICAgICAgICAgKiB3aWxsIGJlIHVzZWQuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBwYXJhbSB7ZnVuY3Rpb24oc3RyaW5nKTpzdHJpbmd9IGZuIFRoZSBmdW5jdGlvbiB0byB1c2UgZm9yIHBsdXJhbGl6aW5nIHN0cmluZ3MuXG4gICAgICAgICAqIEByZXR1cm5zIHtyYWlsc1NlcmlhbGl6ZXJQcm92aWRlcn0gVGhlIHByb3ZpZGVyIGZvciBjaGFpbmluZ1xuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5wbHVyYWxpemUgPSBmdW5jdGlvbihmbikge1xuICAgICAgICAgICAgZGVmYXVsdE9wdGlvbnMucGx1cmFsaXplID0gZm47XG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfTtcblxuICAgICAgICAvKipcbiAgICAgICAgICogQ29uZmlndXJlcyB0aGUgYXJyYXkgZXhjbHVzaW9uIG1hdGNoZXJzIGJ5IHRoZSBzZXJpYWxpemVyLiAgRXhjbHVzaW9uIG1hdGNoZXJzIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZzpcbiAgICAgICAgICogKiBzdHJpbmcgLSBEZWZpbmVzIGEgcHJlZml4IHRoYXQgaXMgdXNlZCB0byB0ZXN0IGZvciBleGNsdXNpb25cbiAgICAgICAgICogKiBSZWdFeHAgLSBBIGN1c3RvbSByZWd1bGFyIGV4cHJlc3Npb24gdGhhdCBpcyB0ZXN0ZWQgYWdhaW5zdCB0aGUgYXR0cmlidXRlIG5hbWVcbiAgICAgICAgICogKiBmdW5jdGlvbiAtIEEgY3VzdG9tIGZ1bmN0aW9uIHRoYXQgYWNjZXB0cyBhIHN0cmluZyBhcmd1bWVudCBhbmQgcmV0dXJucyBhIGJvb2xlYW4gd2l0aCB0cnVlIGluZGljYXRpbmcgZXhjbHVzaW9uLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0ge0FycmF5LjxzdHJpbmd8ZnVuY3Rpb24oc3RyaW5nKTpib29sZWFufFJlZ0V4cH0gZXhjbHVzaW9ucyBBbiBhcnJheSBvZiBleGNsdXNpb24gbWF0Y2hlcnNcbiAgICAgICAgICogQHJldHVybnMge3JhaWxzU2VyaWFsaXplclByb3ZpZGVyfSBUaGUgcHJvdmlkZXIgZm9yIGNoYWluaW5nXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmV4Y2x1c2lvbk1hdGNoZXJzID0gZnVuY3Rpb24oZXhjbHVzaW9ucykge1xuICAgICAgICAgICAgZGVmYXVsdE9wdGlvbnMuZXhjbHVzaW9uTWF0Y2hlcnMgPSBleGNsdXNpb25zO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH07XG5cbiAgICAgICAgdGhpcy4kZ2V0ID0gWyckaW5qZWN0b3InLCAnUmFpbHNJbmZsZWN0b3InLCAnUmFpbHNSZXNvdXJjZUluamVjdG9yJywgZnVuY3Rpb24gKCRpbmplY3RvciwgUmFpbHNJbmZsZWN0b3IsIFJhaWxzUmVzb3VyY2VJbmplY3Rvcikge1xuICAgICAgICAgICAgZGVmYXVsdE9wdGlvbnMudW5kZXJzY29yZSA9IGRlZmF1bHRPcHRpb25zLnVuZGVyc2NvcmUgfHwgUmFpbHNJbmZsZWN0b3IudW5kZXJzY29yZTtcbiAgICAgICAgICAgIGRlZmF1bHRPcHRpb25zLmNhbWVsaXplID0gZGVmYXVsdE9wdGlvbnMuY2FtZWxpemUgfHwgUmFpbHNJbmZsZWN0b3IuY2FtZWxpemU7XG4gICAgICAgICAgICBkZWZhdWx0T3B0aW9ucy5wbHVyYWxpemUgPSBkZWZhdWx0T3B0aW9ucy5wbHVyYWxpemUgfHwgUmFpbHNJbmZsZWN0b3IucGx1cmFsaXplO1xuXG4gICAgICAgICAgICBmdW5jdGlvbiByYWlsc1NlcmlhbGl6ZXIob3B0aW9ucywgY3VzdG9taXplcikge1xuXG4gICAgICAgICAgICAgICAgZnVuY3Rpb24gU2VyaWFsaXplcigpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGFuZ3VsYXIuaXNGdW5jdGlvbihvcHRpb25zKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY3VzdG9taXplciA9IG9wdGlvbnM7XG4gICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zID0ge307XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICB0aGlzLmV4Y2x1c2lvbnMgPSB7fTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pbmNsdXNpb25zID0ge307XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2VyaWFsaXplTWFwcGluZ3MgPSB7fTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kZXNlcmlhbGl6ZU1hcHBpbmdzID0ge307XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY3VzdG9tU2VyaWFsaXplZEF0dHJpYnV0ZXMgPSB7fTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wcmVzZXJ2ZWRBdHRyaWJ1dGVzID0ge307XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY3VzdG9tU2VyaWFsaXplcnMgPSB7fTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5uZXN0ZWRSZXNvdXJjZXMgPSB7fTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zID0gYW5ndWxhci5leHRlbmQoe2V4Y2x1ZGVCeURlZmF1bHQ6IGZhbHNlfSwgZGVmYXVsdE9wdGlvbnMsIG9wdGlvbnMgfHwge30pO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChjdXN0b21pemVyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjdXN0b21pemVyLmNhbGwodGhpcywgdGhpcyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAgICAgKiBBY2NlcHRzIGEgdmFyaWFibGUgbGlzdCBvZiBhdHRyaWJ1dGUgbmFtZXMgdG8gZXhjbHVkZSBmcm9tIEpTT04gc2VyaWFsaXphdGlvbi5cbiAgICAgICAgICAgICAgICAgKlxuICAgICAgICAgICAgICAgICAqIEBwYXJhbSBhdHRyaWJ1dGVOYW1lcy4uLiB7c3RyaW5nfSBWYXJpYWJsZSBudW1iZXIgb2YgYXR0cmlidXRlIG5hbWUgcGFyYW1ldGVyc1xuICAgICAgICAgICAgICAgICAqIEByZXR1cm5zIHtTZXJpYWxpemVyfSB0aGlzIGZvciBjaGFpbmluZyBzdXBwb3J0XG4gICAgICAgICAgICAgICAgICovXG4gICAgICAgICAgICAgICAgU2VyaWFsaXplci5wcm90b3R5cGUuZXhjbHVkZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGV4Y2x1c2lvbnMgPSB0aGlzLmV4Y2x1c2lvbnM7XG5cbiAgICAgICAgICAgICAgICAgICAgYW5ndWxhci5mb3JFYWNoKGFyZ3VtZW50cywgZnVuY3Rpb24gKGF0dHJpYnV0ZU5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2x1c2lvbnNbYXR0cmlidXRlTmFtZV0gPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICAgICAqIEFjY2VwdHMgYSB2YXJpYWJsZSBsaXN0IG9mIGF0dHJpYnV0ZSBuYW1lcyB0aGF0IHNob3VsZCBiZSBpbmNsdWRlZCBpbiBKU09OIHNlcmlhbGl6YXRpb24uXG4gICAgICAgICAgICAgICAgICogVXNpbmcgdGhpcyBtZXRob2Qgd2lsbCBieSBkZWZhdWx0IGV4Y2x1ZGUgYWxsIG90aGVyIGF0dHJpYnV0ZXMgYW5kIG9ubHkgdGhlIG9uZXMgZXhwbGljaXRseSBpbmNsdWRlZCB1c2luZyA8Y29kZT5vbmx5PC9jb2RlPiB3aWxsIGJlIHNlcmlhbGl6ZWQuXG4gICAgICAgICAgICAgICAgICogQHBhcmFtIGF0dHJpYnV0ZU5hbWVzLi4uIHtzdHJpbmd9IFZhcmlhYmxlIG51bWJlciBvZiBhdHRyaWJ1dGUgbmFtZSBwYXJhbWV0ZXJzXG4gICAgICAgICAgICAgICAgICogQHJldHVybnMge1NlcmlhbGl6ZXJ9IHRoaXMgZm9yIGNoYWluaW5nIHN1cHBvcnRcbiAgICAgICAgICAgICAgICAgKi9cbiAgICAgICAgICAgICAgICBTZXJpYWxpemVyLnByb3RvdHlwZS5vbmx5ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgaW5jbHVzaW9ucyA9IHRoaXMuaW5jbHVzaW9ucztcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmV4Y2x1ZGVCeURlZmF1bHQgPSB0cnVlO1xuXG4gICAgICAgICAgICAgICAgICAgIGFuZ3VsYXIuZm9yRWFjaChhcmd1bWVudHMsIGZ1bmN0aW9uIChhdHRyaWJ1dGVOYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpbmNsdXNpb25zW2F0dHJpYnV0ZU5hbWVdID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICAgICAqIFRoaXMgaXMgYSBzaG9ydGN1dCBmb3IgcmVuYW1lIHRoYXQgYWxsb3dzIHlvdSB0byBzcGVjaWZ5IGEgdmFyaWFibGUgbnVtYmVyIG9mIGF0dHJpYnV0ZXMgdGhhdCBzaG91bGQgYWxsIGJlIHJlbmFtZWQgdG9cbiAgICAgICAgICAgICAgICAgKiA8Y29kZT57YXR0cmlidXRlTmFtZX1fYXR0cmlidXRlczwvY29kZT4gdG8gd29yayB3aXRoIHRoZSBSYWlscyBuZXN0ZWRfYXR0cmlidXRlcyBmZWF0dXJlLlxuICAgICAgICAgICAgICAgICAqIEBwYXJhbSBhdHRyaWJ1dGVOYW1lcy4uLiB7c3RyaW5nfSBWYXJpYWJsZSBudW1iZXIgb2YgYXR0cmlidXRlIG5hbWUgcGFyYW1ldGVyc1xuICAgICAgICAgICAgICAgICAqIEByZXR1cm5zIHtTZXJpYWxpemVyfSB0aGlzIGZvciBjaGFpbmluZyBzdXBwb3J0XG4gICAgICAgICAgICAgICAgICovXG4gICAgICAgICAgICAgICAgU2VyaWFsaXplci5wcm90b3R5cGUubmVzdGVkQXR0cmlidXRlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7XG5cbiAgICAgICAgICAgICAgICAgICAgYW5ndWxhci5mb3JFYWNoKGFyZ3VtZW50cywgZnVuY3Rpb24gKGF0dHJpYnV0ZU5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucmVuYW1lKGF0dHJpYnV0ZU5hbWUsIGF0dHJpYnV0ZU5hbWUgKyAnX2F0dHJpYnV0ZXMnKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICAgICAqIFNwZWNpZmllcyBhbiBhdHRyaWJ1dGUgdGhhdCBpcyBhIG5lc3RlZCByZXNvdXJjZSB3aXRoaW4gdGhlIHBhcmVudCBvYmplY3QuXG4gICAgICAgICAgICAgICAgICogTmVzdGVkIHJlc291cmNlcyBkbyBub3QgaW1wbHkgbmVzdGVkIGF0dHJpYnV0ZXMsIGlmIHlvdSB3YW50IGJvdGggeW91IHN0aWxsIGhhdmUgdG8gc3BlY2lmeSBjYWxsIDxjb2RlPm5lc3RlZEF0dHJpYnV0ZTwvY29kZT4gYXMgd2VsbC5cbiAgICAgICAgICAgICAgICAgKlxuICAgICAgICAgICAgICAgICAqIEEgbmVzdGVkIHJlc291cmNlIHNlcnZlcyB0d28gcHVycG9zZXMuICBGaXJzdCwgaXQgZGVmaW5lcyB0aGUgcmVzb3VyY2UgdGhhdCBzaG91bGQgYmUgdXNlZCB3aGVuIGNvbnN0cnVjdGluZyByZXNvdXJjZXMgZnJvbSB0aGUgc2VydmVyLlxuICAgICAgICAgICAgICAgICAqIFNlY29uZCwgaXQgc3BlY2lmaWVzIGhvdyB0aGUgbmVzdGVkIG9iamVjdCBzaG91bGQgYmUgc2VyaWFsaXplZC5cbiAgICAgICAgICAgICAgICAgKlxuICAgICAgICAgICAgICAgICAqIEFuIG9wdGlvbmFsIHRoaXJkIHBhcmFtZXRlciA8Y29kZT5zZXJpYWxpemVyPC9jb2RlPiBpcyBhdmFpbGFibGUgdG8gb3ZlcnJpZGUgdGhlIHNlcmlhbGl6YXRpb24gbG9naWNcbiAgICAgICAgICAgICAgICAgKiBvZiB0aGUgcmVzb3VyY2UgaW4gY2FzZSB5b3UgbmVlZCB0byBzZXJpYWxpemUgaXQgZGlmZmVyZW50bHkgaW4gbXVsdGlwbGUgY29udGV4dHMuXG4gICAgICAgICAgICAgICAgICpcbiAgICAgICAgICAgICAgICAgKiBAcGFyYW0gYXR0cmlidXRlTmFtZSB7c3RyaW5nfSBUaGUgbmFtZSBvZiB0aGUgYXR0cmlidXRlIHRoYXQgaXMgYSBuZXN0ZWQgcmVzb3VyY2VcbiAgICAgICAgICAgICAgICAgKiBAcGFyYW0gcmVzb3VyY2Uge3N0cmluZyB8IFJlc291cmNlfSBBIHJlZmVyZW5jZSB0byB0aGUgcmVzb3VyY2UgdGhhdCB0aGUgYXR0cmlidXRlIGlzIGEgdHlwZSBvZi5cbiAgICAgICAgICAgICAgICAgKiBAcGFyYW0gc2VyaWFsaXplciB7c3RyaW5nIHwgU2VyaWFsaXplcn0gKG9wdGlvbmFsKSBBbiBvcHRpb25hbCBzZXJpYWxpemVyIHJlZmVyZW5jZSB0byBvdmVycmlkZSB0aGUgbmVzdGVkIHJlc291cmNlJ3MgZGVmYXVsdCBzZXJpYWxpemVyXG4gICAgICAgICAgICAgICAgICogQHJldHVybnMge1NlcmlhbGl6ZXJ9IHRoaXMgZm9yIGNoYWluaW5nIHN1cHBvcnRcbiAgICAgICAgICAgICAgICAgKi9cbiAgICAgICAgICAgICAgICBTZXJpYWxpemVyLnByb3RvdHlwZS5yZXNvdXJjZSA9IGZ1bmN0aW9uIChhdHRyaWJ1dGVOYW1lLCByZXNvdXJjZSwgc2VyaWFsaXplcikge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm5lc3RlZFJlc291cmNlc1thdHRyaWJ1dGVOYW1lXSA9IHJlc291cmNlO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChzZXJpYWxpemVyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNlcmlhbGl6ZVdpdGgoYXR0cmlidXRlTmFtZSwgc2VyaWFsaXplcik7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgICAgICogU3BlY2lmaWVzIGEgY3VzdG9tIG5hbWUgbWFwcGluZyBmb3IgYW4gYXR0cmlidXRlLlxuICAgICAgICAgICAgICAgICAqIE9uIHNlcmlhbGl6aW5nIHRvIEpTT04gdGhlIGpzb25OYW1lIHdpbGwgYmUgdXNlZC5cbiAgICAgICAgICAgICAgICAgKiBPbiBkZXNlcmlhbGl6YXRpb24sIGlmIGpzb25OYW1lIGlzIHNlZW4gdGhlbiBpdCB3aWxsIGJlIHJlbmFtZWQgYXMgamF2YXNjcmlwdE5hbWUgaW4gdGhlIHJlc3VsdGluZyByZXNvdXJjZS5cbiAgICAgICAgICAgICAgICAgKlxuICAgICAgICAgICAgICAgICAqIEBwYXJhbSBqYXZhc2NyaXB0TmFtZSB7c3RyaW5nfSBUaGUgYXR0cmlidXRlIG5hbWUgYXMgaXQgYXBwZWFycyBpbiB0aGUgSmF2YVNjcmlwdCBvYmplY3RcbiAgICAgICAgICAgICAgICAgKiBAcGFyYW0ganNvbk5hbWUge3N0cmluZ30gVGhlIGF0dHJpYnV0ZSBuYW1lIGFzIGl0IHNob3VsZCBhcHBlYXIgaW4gSlNPTlxuICAgICAgICAgICAgICAgICAqIEBwYXJhbSBiaWRpcmVjdGlvbmFsIHtib29sZWFufSAob3B0aW9uYWwpIEFsbG93cyB0dXJuaW5nIG9mZiB0aGUgYmlkaXJlY3Rpb25hbCByZW5hbWluZywgZGVmYXVsdHMgdG8gdHJ1ZS5cbiAgICAgICAgICAgICAgICAgKiBAcmV0dXJucyB7U2VyaWFsaXplcn0gdGhpcyBmb3IgY2hhaW5pbmcgc3VwcG9ydFxuICAgICAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgICAgIFNlcmlhbGl6ZXIucHJvdG90eXBlLnJlbmFtZSA9IGZ1bmN0aW9uIChqYXZhc2NyaXB0TmFtZSwganNvbk5hbWUsIGJpZGlyZWN0aW9uYWwpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXJpYWxpemVNYXBwaW5nc1tqYXZhc2NyaXB0TmFtZV0gPSBqc29uTmFtZTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoYmlkaXJlY3Rpb25hbCB8fCBiaWRpcmVjdGlvbmFsID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGVzZXJpYWxpemVNYXBwaW5nc1tqc29uTmFtZV0gPSBqYXZhc2NyaXB0TmFtZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgICAgICogQWxsb3dzIGN1c3RvbSBhdHRyaWJ1dGUgY3JlYXRpb24gYXMgcGFydCBvZiB0aGUgc2VyaWFsaXphdGlvbiB0byBKU09OLlxuICAgICAgICAgICAgICAgICAqXG4gICAgICAgICAgICAgICAgICogQHBhcmFtIGF0dHJpYnV0ZU5hbWUge3N0cmluZ30gVGhlIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZSB0byBhZGRcbiAgICAgICAgICAgICAgICAgKiBAcGFyYW0gdmFsdWUgeyp9IFRoZSB2YWx1ZSB0byBhZGQsIGlmIHNwZWNpZmllZCBhcyBhIGZ1bmN0aW9uIHRoZW4gdGhlIGZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkIGR1cmluZyBzZXJpYWxpemF0aW9uXG4gICAgICAgICAgICAgICAgICogICAgIGFuZCBzaG91bGQgcmV0dXJuIHRoZSB2YWx1ZSB0byBhZGQuXG4gICAgICAgICAgICAgICAgICogQHJldHVybnMge1NlcmlhbGl6ZXJ9IHRoaXMgZm9yIGNoYWluaW5nIHN1cHBvcnRcbiAgICAgICAgICAgICAgICAgKi9cbiAgICAgICAgICAgICAgICBTZXJpYWxpemVyLnByb3RvdHlwZS5hZGQgPSBmdW5jdGlvbiAoYXR0cmlidXRlTmFtZSwgdmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jdXN0b21TZXJpYWxpemVkQXR0cmlidXRlc1thdHRyaWJ1dGVOYW1lXSA9IHZhbHVlO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgICAgICAgICB9O1xuXG5cbiAgICAgICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAgICAgKiBBbGxvd3MgdGhlIGF0dHJpYnV0ZSB0byBiZSBwcmVzZXJ2ZWQgdW5tb2RpZmllZCBpbiB0aGUgcmVzdWx0aW5nIG9iamVjdC5cbiAgICAgICAgICAgICAgICAgKlxuICAgICAgICAgICAgICAgICAqIEBwYXJhbSBhdHRyaWJ1dGVOYW1lIHtzdHJpbmd9IFRoZSBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUgdG8gYWRkXG4gICAgICAgICAgICAgICAgICogQHJldHVybnMge1NlcmlhbGl6ZXJ9IHRoaXMgZm9yIGNoYWluaW5nIHN1cHBvcnRcbiAgICAgICAgICAgICAgICAgKi9cbiAgICAgICAgICAgICAgICBTZXJpYWxpemVyLnByb3RvdHlwZS5wcmVzZXJ2ZSA9IGZ1bmN0aW9uKGF0dHJpYnV0ZU5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wcmVzZXJ2ZWRBdHRyaWJ1dGVzW2F0dHJpYnV0ZU5hbWVdID0gIHRydWU7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAgICAgKiBTcGVjaWZ5IGEgY3VzdG9tIHNlcmlhbGl6ZXIgdG8gdXNlIGZvciBhbiBhdHRyaWJ1dGUuXG4gICAgICAgICAgICAgICAgICpcbiAgICAgICAgICAgICAgICAgKiBAcGFyYW0gYXR0cmlidXRlTmFtZSB7c3RyaW5nfSBUaGUgbmFtZSBvZiB0aGUgYXR0cmlidXRlXG4gICAgICAgICAgICAgICAgICogQHBhcmFtIHNlcmlhbGl6ZXIge3N0cmluZyB8IGZ1bmN0aW9ufSBBIHJlZmVyZW5jZSB0byB0aGUgY3VzdG9tIHNlcmlhbGl6ZXIgdG8gdXNlIGZvciB0aGUgYXR0cmlidXRlLlxuICAgICAgICAgICAgICAgICAqIEByZXR1cm5zIHtTZXJpYWxpemVyfSB0aGlzIGZvciBjaGFpbmluZyBzdXBwb3J0XG4gICAgICAgICAgICAgICAgICovXG4gICAgICAgICAgICAgICAgU2VyaWFsaXplci5wcm90b3R5cGUuc2VyaWFsaXplV2l0aCA9IGZ1bmN0aW9uIChhdHRyaWJ1dGVOYW1lLCBzZXJpYWxpemVyKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY3VzdG9tU2VyaWFsaXplcnNbYXR0cmlidXRlTmFtZV0gPSBzZXJpYWxpemVyO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgICAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIG9yIG5vdCBhbiBhdHRyaWJ1dGUgc2hvdWxkIGJlIGV4Y2x1ZGVkLlxuICAgICAgICAgICAgICAgICAqXG4gICAgICAgICAgICAgICAgICogSWYgdGhlIG9wdGlvbiBleGNsdWRlQnlEZWZhdWx0IGhhcyBiZWVuIHNldCB0aGVuIGF0dHJpYnV0ZXMgd2lsbCBkZWZhdWx0IHRvIGV4Y2x1ZGVkIGFuZCB3aWxsIG9ubHlcbiAgICAgICAgICAgICAgICAgKiBiZSBpbmNsdWRlZCBpZiB0aGV5IGhhdmUgYmVlbiBpbmNsdWRlZCB1c2luZyB0aGUgXCJvbmx5XCIgY3VzdG9taXphdGlvbiBmdW5jdGlvbi5cbiAgICAgICAgICAgICAgICAgKlxuICAgICAgICAgICAgICAgICAqIElmIHRoZSBvcHRpb24gZXhjbHVkZUJ5RGVmYXVsdCBoYXMgbm90IGJlZW4gc2V0IHRoZW4gYXR0cmlidXRlcyBtdXN0IGJlIGV4cGxpY2l0bHkgZXhjbHVkZWQgdXNpbmcgdGhlIFwiZXhjbHVkZVwiXG4gICAgICAgICAgICAgICAgICogY3VzdG9taXphdGlvbiBmdW5jdGlvbiBvciBtdXN0IGJlIG1hdGNoZWQgYnkgb25lIG9mIHRoZSBleGNsdXNpb25NYXRjaGVycy5cbiAgICAgICAgICAgICAgICAgKlxuICAgICAgICAgICAgICAgICAqIEBwYXJhbSBhdHRyaWJ1dGVOYW1lIFRoZSBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUgdG8gY2hlY2sgZm9yIGV4Y2x1c2lvblxuICAgICAgICAgICAgICAgICAqIEByZXR1cm5zIHtib29sZWFufSB0cnVlIGlmIGV4Y2x1ZGVkLCBmYWxzZSBvdGhlcndpc2VcbiAgICAgICAgICAgICAgICAgKi9cbiAgICAgICAgICAgICAgICBTZXJpYWxpemVyLnByb3RvdHlwZS5pc0V4Y2x1ZGVkRnJvbVNlcmlhbGl6YXRpb24gPSBmdW5jdGlvbiAoYXR0cmlidXRlTmFtZSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoKHRoaXMub3B0aW9ucy5leGNsdWRlQnlEZWZhdWx0ICYmICF0aGlzLmluY2x1c2lvbnMuaGFzT3duUHJvcGVydHkoYXR0cmlidXRlTmFtZSkpIHx8IHRoaXMuZXhjbHVzaW9ucy5oYXNPd25Qcm9wZXJ0eShhdHRyaWJ1dGVOYW1lKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmV4Y2x1c2lvbk1hdGNoZXJzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgZXhjbHVkZWQgPSBmYWxzZTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgYW5ndWxhci5mb3JFYWNoKHRoaXMub3B0aW9ucy5leGNsdXNpb25NYXRjaGVycywgZnVuY3Rpb24gKG1hdGNoZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYW5ndWxhci5pc1N0cmluZyhtYXRjaGVyKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGNsdWRlZCA9IGV4Y2x1ZGVkIHx8IGF0dHJpYnV0ZU5hbWUuaW5kZXhPZihtYXRjaGVyKSA9PT0gMDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGFuZ3VsYXIuaXNGdW5jdGlvbihtYXRjaGVyKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGNsdWRlZCA9IGV4Y2x1ZGVkIHx8IG1hdGNoZXIuY2FsbCh1bmRlZmluZWQsIGF0dHJpYnV0ZU5hbWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobWF0Y2hlciBpbnN0YW5jZW9mIFJlZ0V4cCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGNsdWRlZCA9IGV4Y2x1ZGVkIHx8IG1hdGNoZXIudGVzdChhdHRyaWJ1dGVOYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGV4Y2x1ZGVkO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAgICAgKiBSZW1hcHMgdGhlIGF0dHJpYnV0ZSBuYW1lIHRvIHRoZSBzZXJpYWxpemVkIGZvcm0gd2hpY2ggaW5jbHVkZXM6XG4gICAgICAgICAgICAgICAgICogICAtIGNoZWNraW5nIGZvciBleGNsdXNpb25cbiAgICAgICAgICAgICAgICAgKiAgIC0gcmVtYXBwaW5nIHRvIGEgY3VzdG9tIHZhbHVlIHNwZWNpZmllZCBieSB0aGUgcmVuYW1lIGN1c3RvbWl6YXRpb24gZnVuY3Rpb25cbiAgICAgICAgICAgICAgICAgKiAgIC0gdW5kZXJzY29yaW5nIHRoZSBuYW1lXG4gICAgICAgICAgICAgICAgICpcbiAgICAgICAgICAgICAgICAgKiBAcGFyYW0gYXR0cmlidXRlTmFtZSBUaGUgY3VycmVudCBhdHRyaWJ1dGUgbmFtZVxuICAgICAgICAgICAgICAgICAqIEByZXR1cm5zIHsqfSB1bmRlZmluZWQgaWYgdGhlIGF0dHJpYnV0ZSBzaG91bGQgYmUgZXhjbHVkZWQgb3IgdGhlIG1hcHBlZCBhdHRyaWJ1dGUgbmFtZVxuICAgICAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgICAgIFNlcmlhbGl6ZXIucHJvdG90eXBlLmdldFNlcmlhbGl6ZWRBdHRyaWJ1dGVOYW1lID0gZnVuY3Rpb24gKGF0dHJpYnV0ZU5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIG1hcHBlZE5hbWUgPSB0aGlzLnNlcmlhbGl6ZU1hcHBpbmdzW2F0dHJpYnV0ZU5hbWVdIHx8IGF0dHJpYnV0ZU5hbWU7XG5cbiAgICAgICAgICAgICAgICAgICAgdmFyIG1hcHBlZE5hbWVFeGNsdWRlZCA9IHRoaXMuaXNFeGNsdWRlZEZyb21TZXJpYWxpemF0aW9uKG1hcHBlZE5hbWUpLFxuICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlTmFtZUV4Y2x1ZGVkID0gdGhpcy5pc0V4Y2x1ZGVkRnJvbVNlcmlhbGl6YXRpb24oYXR0cmlidXRlTmFtZSk7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYodGhpcy5vcHRpb25zLmV4Y2x1ZGVCeURlZmF1bHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmKG1hcHBlZE5hbWVFeGNsdWRlZCAmJiBhdHRyaWJ1dGVOYW1lRXhjbHVkZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1hcHBlZE5hbWVFeGNsdWRlZCB8fCBhdHRyaWJ1dGVOYW1lRXhjbHVkZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudW5kZXJzY29yZShtYXBwZWROYW1lKTtcbiAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgICAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIG9yIG5vdCBhbiBhdHRyaWJ1dGUgc2hvdWxkIGJlIGV4Y2x1ZGVkIGZyb20gZGVzZXJpYWxpemF0aW9uLlxuICAgICAgICAgICAgICAgICAqXG4gICAgICAgICAgICAgICAgICogQnkgZGVmYXVsdCwgd2UgZG8gbm90IGV4Y2x1ZGUgYW55IGF0dHJpYnV0ZXMgZnJvbSBkZXNlcmlhbGl6YXRpb24uXG4gICAgICAgICAgICAgICAgICpcbiAgICAgICAgICAgICAgICAgKiBAcGFyYW0gYXR0cmlidXRlTmFtZSBUaGUgbmFtZSBvZiB0aGUgYXR0cmlidXRlIHRvIGNoZWNrIGZvciBleGNsdXNpb25cbiAgICAgICAgICAgICAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gdHJ1ZSBpZiBleGNsdWRlZCwgZmFsc2Ugb3RoZXJ3aXNlXG4gICAgICAgICAgICAgICAgICovXG4gICAgICAgICAgICAgICAgU2VyaWFsaXplci5wcm90b3R5cGUuaXNFeGNsdWRlZEZyb21EZXNlcmlhbGl6YXRpb24gPSBmdW5jdGlvbiAoYXR0cmlidXRlTmFtZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICAgICAqIFJlbWFwcyB0aGUgYXR0cmlidXRlIG5hbWUgdG8gdGhlIGRlc2VyaWFsaXplZCBmb3JtIHdoaWNoIGluY2x1ZGVzOlxuICAgICAgICAgICAgICAgICAqICAgLSBjYW1lbGl6aW5nIHRoZSBuYW1lXG4gICAgICAgICAgICAgICAgICogICAtIGNoZWNraW5nIGZvciBleGNsdXNpb25cbiAgICAgICAgICAgICAgICAgKiAgIC0gcmVtYXBwaW5nIHRvIGEgY3VzdG9tIHZhbHVlIHNwZWNpZmllZCBieSB0aGUgcmVuYW1lIGN1c3RvbWl6YXRpb24gZnVuY3Rpb25cbiAgICAgICAgICAgICAgICAgKlxuICAgICAgICAgICAgICAgICAqIEBwYXJhbSBhdHRyaWJ1dGVOYW1lIFRoZSBjdXJyZW50IGF0dHJpYnV0ZSBuYW1lXG4gICAgICAgICAgICAgICAgICogQHJldHVybnMgeyp9IHVuZGVmaW5lZCBpZiB0aGUgYXR0cmlidXRlIHNob3VsZCBiZSBleGNsdWRlZCBvciB0aGUgbWFwcGVkIGF0dHJpYnV0ZSBuYW1lXG4gICAgICAgICAgICAgICAgICovXG4gICAgICAgICAgICAgICAgU2VyaWFsaXplci5wcm90b3R5cGUuZ2V0RGVzZXJpYWxpemVkQXR0cmlidXRlTmFtZSA9IGZ1bmN0aW9uIChhdHRyaWJ1dGVOYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBjYW1lbGl6ZWROYW1lID0gdGhpcy5jYW1lbGl6ZShhdHRyaWJ1dGVOYW1lKTtcblxuICAgICAgICAgICAgICAgICAgICBjYW1lbGl6ZWROYW1lID0gdGhpcy5kZXNlcmlhbGl6ZU1hcHBpbmdzW2F0dHJpYnV0ZU5hbWVdIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRlc2VyaWFsaXplTWFwcGluZ3NbY2FtZWxpemVkTmFtZV0gfHxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhbWVsaXplZE5hbWU7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuaXNFeGNsdWRlZEZyb21EZXNlcmlhbGl6YXRpb24oYXR0cmlidXRlTmFtZSkgfHwgdGhpcy5pc0V4Y2x1ZGVkRnJvbURlc2VyaWFsaXphdGlvbihjYW1lbGl6ZWROYW1lKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBjYW1lbGl6ZWROYW1lO1xuICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAgICAgKiBSZXR1cm5zIGEgcmVmZXJlbmNlIHRvIHRoZSBuZXN0ZWQgcmVzb3VyY2UgdGhhdCBoYXMgYmVlbiBzcGVjaWZpZWQgZm9yIHRoZSBhdHRyaWJ1dGUuXG4gICAgICAgICAgICAgICAgICogQHBhcmFtIGF0dHJpYnV0ZU5hbWUgVGhlIGF0dHJpYnV0ZSBuYW1lXG4gICAgICAgICAgICAgICAgICogQHJldHVybnMgeyp9IHVuZGVmaW5lZCBpZiBubyBuZXN0ZWQgcmVzb3VyY2UgaGFzIGJlZW4gc3BlY2lmaWVkIG9yIGEgcmVmZXJlbmNlIHRvIHRoZSBuZXN0ZWQgcmVzb3VyY2UgY2xhc3NcbiAgICAgICAgICAgICAgICAgKi9cbiAgICAgICAgICAgICAgICBTZXJpYWxpemVyLnByb3RvdHlwZS5nZXROZXN0ZWRSZXNvdXJjZSA9IGZ1bmN0aW9uIChhdHRyaWJ1dGVOYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBSYWlsc1Jlc291cmNlSW5qZWN0b3IuZ2V0RGVwZW5kZW5jeSh0aGlzLm5lc3RlZFJlc291cmNlc1thdHRyaWJ1dGVOYW1lXSk7XG4gICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICAgICAqIFJldHVybnMgYSBjdXN0b20gc2VyaWFsaXplciBmb3IgdGhlIGF0dHJpYnV0ZSBpZiBvbmUgaGFzIGJlZW4gc3BlY2lmaWVkLiAgQ3VzdG9tIHNlcmlhbGl6ZXJzIGNhbiBiZSBzcGVjaWZpZWRcbiAgICAgICAgICAgICAgICAgKiBpbiBvbmUgb2YgdHdvIHdheXMuICBUaGUgc2VyaWFsaXplV2l0aCBjdXN0b21pemF0aW9uIG1ldGhvZCBhbGxvd3Mgc3BlY2lmeWluZyBhIGN1c3RvbSBzZXJpYWxpemVyIGZvciBhbnkgYXR0cmlidXRlLlxuICAgICAgICAgICAgICAgICAqIE9yIGFuIGF0dHJpYnV0ZSBjb3VsZCBoYXZlIGJlZW4gc3BlY2lmaWVkIGFzIGEgbmVzdGVkIHJlc291cmNlIGluIHdoaWNoIGNhc2UgdGhlIG5lc3RlZCByZXNvdXJjZSdzIHNlcmlhbGl6ZXJcbiAgICAgICAgICAgICAgICAgKiBpcyB1c2VkLiAgQ3VzdG9tIHNlcmlhbGl6ZXJzIHNwZWNpZmllZCB1c2luZyBzZXJpYWxpemVXaXRoIHRha2UgcHJlY2VkZW5jZSBvdmVyIHRoZSBuZXN0ZWQgcmVzb3VyY2Ugc2VyaWFsaXplci5cbiAgICAgICAgICAgICAgICAgKlxuICAgICAgICAgICAgICAgICAqIEBwYXJhbSBhdHRyaWJ1dGVOYW1lIFRoZSBhdHRyaWJ1dGUgbmFtZVxuICAgICAgICAgICAgICAgICAqIEByZXR1cm5zIHsqfSB1bmRlZmluZWQgaWYgbm8gY3VzdG9tIHNlcmlhbGl6ZXIgaGFzIGJlZW4gc3BlY2lmaWVkIG9yIGFuIGluc3RhbmNlIG9mIHRoZSBTZXJpYWxpemVyXG4gICAgICAgICAgICAgICAgICovXG4gICAgICAgICAgICAgICAgU2VyaWFsaXplci5wcm90b3R5cGUuZ2V0QXR0cmlidXRlU2VyaWFsaXplciA9IGZ1bmN0aW9uIChhdHRyaWJ1dGVOYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciByZXNvdXJjZSA9IHRoaXMuZ2V0TmVzdGVkUmVzb3VyY2UoYXR0cmlidXRlTmFtZSksXG4gICAgICAgICAgICAgICAgICAgICAgICBzZXJpYWxpemVyID0gdGhpcy5jdXN0b21TZXJpYWxpemVyc1thdHRyaWJ1dGVOYW1lXTtcblxuICAgICAgICAgICAgICAgICAgICAvLyBjdXN0b20gc2VyaWFsaXplciB0YWtlcyBwcmVjZWRlbmNlIG92ZXIgcmVzb3VyY2Ugc2VyaWFsaXplclxuICAgICAgICAgICAgICAgICAgICBpZiAoc2VyaWFsaXplcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJhaWxzUmVzb3VyY2VJbmplY3Rvci5jcmVhdGVTZXJ2aWNlKHNlcmlhbGl6ZXIpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHJlc291cmNlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzb3VyY2UuY29uZmlnLnNlcmlhbGl6ZXI7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIH07XG5cblxuICAgICAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICAgICAqIFByZXBhcmVzIHRoZSBkYXRhIGZvciBzZXJpYWxpemF0aW9uIHRvIEpTT04uXG4gICAgICAgICAgICAgICAgICpcbiAgICAgICAgICAgICAgICAgKiBAcGFyYW0gZGF0YSBUaGUgZGF0YSB0byBwcmVwYXJlXG4gICAgICAgICAgICAgICAgICogQHJldHVybnMgeyp9IEEgbmV3IG9iamVjdCBvciBhcnJheSB0aGF0IGlzIHJlYWR5IGZvciBKU09OIHNlcmlhbGl6YXRpb25cbiAgICAgICAgICAgICAgICAgKi9cbiAgICAgICAgICAgICAgICBTZXJpYWxpemVyLnByb3RvdHlwZS5zZXJpYWxpemVEYXRhID0gZnVuY3Rpb24gKGRhdGEpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGRhdGEsXG4gICAgICAgICAgICAgICAgICAgICAgICBzZWxmID0gdGhpcztcblxuICAgICAgICAgICAgICAgICAgICBpZiAoYW5ndWxhci5pc0FycmF5KGRhdGEpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBbXTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgYW5ndWxhci5mb3JFYWNoKGRhdGEsIGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHNlbGYuc2VyaWFsaXplRGF0YSh2YWx1ZSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYW5ndWxhci5pc09iamVjdChkYXRhKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFuZ3VsYXIuaXNEYXRlKGRhdGEpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRhdGE7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSB7fTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXJpYWxpemVPYmplY3QocmVzdWx0LCBkYXRhKTtcblxuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgU2VyaWFsaXplci5wcm90b3R5cGUuc2VyaWFsaXplT2JqZWN0ID0gZnVuY3Rpb24ocmVzdWx0LCBkYXRhKXtcblxuXG4gICAgICAgICAgICAgICAgICAgIHZhciB0dGhpcyA9IHRoaXM7XG4gICAgICAgICAgICAgICAgICAgIGFuZ3VsYXIuZm9yRWFjaChkYXRhLCBmdW5jdGlvbiAodmFsdWUsIGtleSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhlIHZhbHVlIGlzIGEgZnVuY3Rpb24gdGhlbiBpdCBjYW4ndCBiZSBzZXJpYWxpemVkIHRvIEpTT04gc28gd2UnbGwganVzdCBza2lwIGl0XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWFuZ3VsYXIuaXNGdW5jdGlvbih2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0dGhpcy5zZXJpYWxpemVBdHRyaWJ1dGUocmVzdWx0LCBrZXksIHZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBkYXRhO1xuICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAgICAgKiBUcmFuc2Zvcm1zIGFuIGF0dHJpYnV0ZSBhbmQgaXRzIHZhbHVlIGFuZCBzdG9yZXMgaXQgb24gdGhlIHBhcmVudCBkYXRhIG9iamVjdC4gIFRoZSBhdHRyaWJ1dGUgd2lsbCBiZVxuICAgICAgICAgICAgICAgICAqIHJlbmFtZWQgYXMgbmVlZGVkIGFuZCB0aGUgdmFsdWUgaXRzZWxmIHdpbGwgYmUgc2VyaWFsaXplZCBhcyB3ZWxsLlxuICAgICAgICAgICAgICAgICAqXG4gICAgICAgICAgICAgICAgICogQHBhcmFtIGRhdGEgVGhlIG9iamVjdCB0aGF0IHRoZSBhdHRyaWJ1dGUgd2lsbCBiZSBhZGRlZCB0b1xuICAgICAgICAgICAgICAgICAqIEBwYXJhbSBhdHRyaWJ1dGUgVGhlIGF0dHJpYnV0ZSB0byB0cmFuc2Zvcm1cbiAgICAgICAgICAgICAgICAgKiBAcGFyYW0gdmFsdWUgVGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIGF0dHJpYnV0ZVxuICAgICAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgICAgIFNlcmlhbGl6ZXIucHJvdG90eXBlLnNlcmlhbGl6ZUF0dHJpYnV0ZSA9IGZ1bmN0aW9uIChkYXRhLCBhdHRyaWJ1dGUsIHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBzZXJpYWxpemVyID0gdGhpcy5nZXRBdHRyaWJ1dGVTZXJpYWxpemVyKGF0dHJpYnV0ZSksXG4gICAgICAgICAgICAgICAgICAgICAgICBzZXJpYWxpemVkQXR0cmlidXRlTmFtZSA9IHRoaXMuZ2V0U2VyaWFsaXplZEF0dHJpYnV0ZU5hbWUoYXR0cmlidXRlKTtcblxuICAgICAgICAgICAgICAgICAgICAvLyB1bmRlZmluZWQgbWVhbnMgdGhlIGF0dHJpYnV0ZSBzaG91bGQgYmUgZXhjbHVkZWQgZnJvbSBzZXJpYWxpemF0aW9uXG4gICAgICAgICAgICAgICAgICAgIGlmIChzZXJpYWxpemVkQXR0cmlidXRlTmFtZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBkYXRhW3NlcmlhbGl6ZWRBdHRyaWJ1dGVOYW1lXSA9IHNlcmlhbGl6ZXIgPyBzZXJpYWxpemVyLnNlcmlhbGl6ZSh2YWx1ZSkgOiB0aGlzLnNlcmlhbGl6ZURhdGEodmFsdWUpO1xuICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAgICAgKiBTZXJpYWxpemVzIHRoZSBkYXRhIGJ5IGFwcGx5aW5nIHZhcmlvdXMgdHJhbnNmb3JtYXRpb25zIHN1Y2ggYXM6XG4gICAgICAgICAgICAgICAgICogICAtIFVuZGVyc2NvcmluZyBhdHRyaWJ1dGUgbmFtZXNcbiAgICAgICAgICAgICAgICAgKiAgIC0gYXR0cmlidXRlIHJlbmFtaW5nXG4gICAgICAgICAgICAgICAgICogICAtIGF0dHJpYnV0ZSBleGNsdXNpb25cbiAgICAgICAgICAgICAgICAgKiAgIC0gY3VzdG9tIGF0dHJpYnV0ZSBhZGRpdGlvblxuICAgICAgICAgICAgICAgICAqXG4gICAgICAgICAgICAgICAgICogQHBhcmFtIGRhdGEgVGhlIGRhdGEgdG8gcHJlcGFyZVxuICAgICAgICAgICAgICAgICAqIEByZXR1cm5zIHsqfSBBIG5ldyBvYmplY3Qgb3IgYXJyYXkgdGhhdCBpcyByZWFkeSBmb3IgSlNPTiBzZXJpYWxpemF0aW9uXG4gICAgICAgICAgICAgICAgICovXG4gICAgICAgICAgICAgICAgU2VyaWFsaXplci5wcm90b3R5cGUuc2VyaWFsaXplID0gZnVuY3Rpb24gKGRhdGEpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGFuZ3VsYXIuY29weShkYXRhKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYgPSB0aGlzO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChhbmd1bGFyLmlzT2JqZWN0KHJlc3VsdCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFuZ3VsYXIuZm9yRWFjaCh0aGlzLmN1c3RvbVNlcmlhbGl6ZWRBdHRyaWJ1dGVzLCBmdW5jdGlvbiAodmFsdWUsIGtleSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhbmd1bGFyLmlzQXJyYXkocmVzdWx0KSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmd1bGFyLmZvckVhY2gocmVzdWx0LCBmdW5jdGlvbiAoaXRlbSwgaW5kZXgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpdGVtVmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhbmd1bGFyLmlzRnVuY3Rpb24odmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbVZhbHVlID0gaXRlbVZhbHVlLmNhbGwoaXRlbSwgaXRlbSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuc2VyaWFsaXplQXR0cmlidXRlKGl0ZW0sIGtleSwgaXRlbVZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFuZ3VsYXIuaXNGdW5jdGlvbih2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gdmFsdWUuY2FsbChkYXRhLCBkYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuc2VyaWFsaXplQXR0cmlidXRlKHJlc3VsdCwga2V5LCB2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSB0aGlzLnNlcmlhbGl6ZURhdGEocmVzdWx0KTtcblxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAgICAgKiBJdGVyYXRlcyBvdmVyIHRoZSBkYXRhIGRlc2VyaWFsaXppbmcgZWFjaCBlbnRyeSBvbiBhcnJheXMgYW5kIGVhY2gga2V5L3ZhbHVlIG9uIG9iamVjdHMuXG4gICAgICAgICAgICAgICAgICpcbiAgICAgICAgICAgICAgICAgKiBAcGFyYW0gZGF0YSBUaGUgb2JqZWN0IHRvIGRlc2VyaWFsaXplXG4gICAgICAgICAgICAgICAgICogQHBhcmFtIFJlc291cmNlIChvcHRpb25hbCkgVGhlIHJlc291cmNlIHR5cGUgdG8gZGVzZXJpYWxpemUgdGhlIHJlc3VsdCBpbnRvXG4gICAgICAgICAgICAgICAgICogQHJldHVybnMgeyp9IEEgbmV3IG9iamVjdCBvciBhbiBpbnN0YW5jZSBvZiBSZXNvdXJjZSBwb3B1bGF0ZWQgd2l0aCBkZXNlcmlhbGl6ZWQgZGF0YS5cbiAgICAgICAgICAgICAgICAgKi9cbiAgICAgICAgICAgICAgICBTZXJpYWxpemVyLnByb3RvdHlwZS5kZXNlcmlhbGl6ZURhdGEgPSBmdW5jdGlvbiAoZGF0YSwgUmVzb3VyY2UpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGRhdGEsXG4gICAgICAgICAgICAgICAgICAgICAgICBzZWxmID0gdGhpcztcblxuICAgICAgICAgICAgICAgICAgICBpZiAoYW5ndWxhci5pc0FycmF5KGRhdGEpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBbXTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgYW5ndWxhci5mb3JFYWNoKGRhdGEsIGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHNlbGYuZGVzZXJpYWxpemVEYXRhKHZhbHVlLCBSZXNvdXJjZSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYW5ndWxhci5pc09iamVjdChkYXRhKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFuZ3VsYXIuaXNEYXRlKGRhdGEpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRhdGE7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSB7fTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFJlc291cmNlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gbmV3IFJlc291cmNlLmNvbmZpZy5yZXNvdXJjZUNvbnN0cnVjdG9yKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGVzZXJpYWxpemVPYmplY3QocmVzdWx0LCBkYXRhKTtcblxuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgU2VyaWFsaXplci5wcm90b3R5cGUuZGVzZXJpYWxpemVPYmplY3QgPSBmdW5jdGlvbiAocmVzdWx0LCBkYXRhKSB7XG5cbiAgICAgICAgICAgICAgICAgICAgdmFyIHR0aGlzID0gdGhpcztcbiAgICAgICAgICAgICAgICAgICAgYW5ndWxhci5mb3JFYWNoKGRhdGEsIGZ1bmN0aW9uICh2YWx1ZSwga2V5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0dGhpcy5kZXNlcmlhbGl6ZUF0dHJpYnV0ZShyZXN1bHQsIGtleSwgdmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRhdGE7XG4gICAgICAgICAgICAgICAgfTtcblxuXG4gICAgICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgICAgICogVHJhbnNmb3JtcyBhbiBhdHRyaWJ1dGUgYW5kIGl0cyB2YWx1ZSBhbmQgc3RvcmVzIGl0IG9uIHRoZSBwYXJlbnQgZGF0YSBvYmplY3QuICBUaGUgYXR0cmlidXRlIHdpbGwgYmVcbiAgICAgICAgICAgICAgICAgKiByZW5hbWVkIGFzIG5lZWRlZCBhbmQgdGhlIHZhbHVlIGl0c2VsZiB3aWxsIGJlIGRlc2VyaWFsaXplZCBhcyB3ZWxsLlxuICAgICAgICAgICAgICAgICAqXG4gICAgICAgICAgICAgICAgICogQHBhcmFtIGRhdGEgVGhlIG9iamVjdCB0aGF0IHRoZSBhdHRyaWJ1dGUgd2lsbCBiZSBhZGRlZCB0b1xuICAgICAgICAgICAgICAgICAqIEBwYXJhbSBhdHRyaWJ1dGUgVGhlIGF0dHJpYnV0ZSB0byB0cmFuc2Zvcm1cbiAgICAgICAgICAgICAgICAgKiBAcGFyYW0gdmFsdWUgVGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIGF0dHJpYnV0ZVxuICAgICAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgICAgIFNlcmlhbGl6ZXIucHJvdG90eXBlLmRlc2VyaWFsaXplQXR0cmlidXRlID0gZnVuY3Rpb24gKGRhdGEsIGF0dHJpYnV0ZSwgdmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHNlcmlhbGl6ZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICBOZXN0ZWRSZXNvdXJjZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZU5hbWUgPSB0aGlzLmdldERlc2VyaWFsaXplZEF0dHJpYnV0ZU5hbWUoYXR0cmlidXRlKTtcblxuICAgICAgICAgICAgICAgICAgICAvLyB1bmRlZmluZWQgbWVhbnMgdGhlIGF0dHJpYnV0ZSBzaG91bGQgYmUgZXhjbHVkZWQgZnJvbSBzZXJpYWxpemF0aW9uXG4gICAgICAgICAgICAgICAgICAgIGlmIChhdHRyaWJ1dGVOYW1lID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIHNlcmlhbGl6ZXIgPSB0aGlzLmdldEF0dHJpYnV0ZVNlcmlhbGl6ZXIoYXR0cmlidXRlTmFtZSk7XG4gICAgICAgICAgICAgICAgICAgIE5lc3RlZFJlc291cmNlID0gdGhpcy5nZXROZXN0ZWRSZXNvdXJjZShhdHRyaWJ1dGVOYW1lKTtcblxuICAgICAgICAgICAgICAgICAgICAvLyBwcmVzZXJ2ZWQgYXR0cmlidXRlcyBhcmUgYXNzaWduZWQgdW5tb2RpZmllZFxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5wcmVzZXJ2ZWRBdHRyaWJ1dGVzW2F0dHJpYnV0ZU5hbWVdKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRhW2F0dHJpYnV0ZU5hbWVdID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRhW2F0dHJpYnV0ZU5hbWVdID0gc2VyaWFsaXplciA/IHNlcmlhbGl6ZXIuZGVzZXJpYWxpemUodmFsdWUsIE5lc3RlZFJlc291cmNlKSA6IHRoaXMuZGVzZXJpYWxpemVEYXRhKHZhbHVlLCBOZXN0ZWRSZXNvdXJjZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgICAgICogRGVzZXJpYWxpemVzIHRoZSBkYXRhIGJ5IGFwcGx5aW5nIHZhcmlvdXMgdHJhbnNmb3JtYXRpb25zIHN1Y2ggYXM6XG4gICAgICAgICAgICAgICAgICogICAtIENhbWVsaXppbmcgYXR0cmlidXRlIG5hbWVzXG4gICAgICAgICAgICAgICAgICogICAtIGF0dHJpYnV0ZSByZW5hbWluZ1xuICAgICAgICAgICAgICAgICAqICAgLSBhdHRyaWJ1dGUgZXhjbHVzaW9uXG4gICAgICAgICAgICAgICAgICogICAtIG5lc3RlZCByZXNvdXJjZSBjcmVhdGlvblxuICAgICAgICAgICAgICAgICAqXG4gICAgICAgICAgICAgICAgICogQHBhcmFtIGRhdGEgVGhlIG9iamVjdCB0byBkZXNlcmlhbGl6ZVxuICAgICAgICAgICAgICAgICAqIEBwYXJhbSBSZXNvdXJjZSAob3B0aW9uYWwpIFRoZSByZXNvdXJjZSB0eXBlIHRvIGRlc2VyaWFsaXplIHRoZSByZXN1bHQgaW50b1xuICAgICAgICAgICAgICAgICAqIEByZXR1cm5zIHsqfSBBIG5ldyBvYmplY3Qgb3IgYW4gaW5zdGFuY2Ugb2YgUmVzb3VyY2UgcG9wdWxhdGVkIHdpdGggZGVzZXJpYWxpemVkIGRhdGFcbiAgICAgICAgICAgICAgICAgKi9cbiAgICAgICAgICAgICAgICBTZXJpYWxpemVyLnByb3RvdHlwZS5kZXNlcmlhbGl6ZSA9IGZ1bmN0aW9uIChkYXRhLCBSZXNvdXJjZSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBqdXN0IGNhbGxzIGRlc2VyaWFsaXplVmFsdWUgZm9yIG5vdyBzbyB3ZSBjYW4gbW9yZSBlYXNpbHkgYWRkIG9uIGN1c3RvbSBhdHRyaWJ1dGUgbG9naWMgZm9yIGRlc2VyaWFsaXplIHRvb1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5kZXNlcmlhbGl6ZURhdGEoZGF0YSwgUmVzb3VyY2UpO1xuICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICBTZXJpYWxpemVyLnByb3RvdHlwZS5wbHVyYWxpemUgPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5wbHVyYWxpemUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLm9wdGlvbnMucGx1cmFsaXplKHZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgIFNlcmlhbGl6ZXIucHJvdG90eXBlLnVuZGVyc2NvcmUgPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy51bmRlcnNjb3JlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5vcHRpb25zLnVuZGVyc2NvcmUodmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgU2VyaWFsaXplci5wcm90b3R5cGUuY2FtZWxpemUgPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5jYW1lbGl6ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMub3B0aW9ucy5jYW1lbGl6ZSh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gU2VyaWFsaXplcjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmFpbHNTZXJpYWxpemVyLmRlZmF1bHRPcHRpb25zID0gZGVmYXVsdE9wdGlvbnM7XG4gICAgICAgICAgICByZXR1cm4gcmFpbHNTZXJpYWxpemVyO1xuICAgICAgICB9XTtcbiAgICB9KTtcbn0oKSk7XG4oZnVuY3Rpb24gKHVuZGVmaW5lZCkge1xuICAgIGFuZ3VsYXIubW9kdWxlKCdyYWlscycpLmZhY3RvcnkoJ3JhaWxzUm9vdFdyYXBwZXInLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB3cmFwOiBmdW5jdGlvbiAoZGF0YSwgcmVzb3VyY2UpIHtcbiAgICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0ge307XG4gICAgICAgICAgICAgICAgcmVzdWx0W2FuZ3VsYXIuaXNBcnJheShkYXRhKSA/IHJlc291cmNlLmNvbmZpZy5wbHVyYWxOYW1lIDogcmVzb3VyY2UuY29uZmlnLm5hbWVdID0gZGF0YTtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHVud3JhcDogZnVuY3Rpb24gKHJlc3BvbnNlLCByZXNvdXJjZSwgaXNPYmplY3QpIHtcbiAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2UuZGF0YSAmJiByZXNwb25zZS5kYXRhLmhhc093blByb3BlcnR5KHJlc291cmNlLmNvbmZpZy5uYW1lKSkge1xuICAgICAgICAgICAgICAgICAgICByZXNwb25zZS5kYXRhID0gcmVzcG9uc2UuZGF0YVtyZXNvdXJjZS5jb25maWcubmFtZV07XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChyZXNwb25zZS5kYXRhICYmIHJlc3BvbnNlLmRhdGEuaGFzT3duUHJvcGVydHkocmVzb3VyY2UuY29uZmlnLnBsdXJhbE5hbWUpICYmICFpc09iamVjdCkge1xuICAgICAgICAgICAgICAgICAgICByZXNwb25zZS5kYXRhID0gcmVzcG9uc2UuZGF0YVtyZXNvdXJjZS5jb25maWcucGx1cmFsTmFtZV07XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3BvbnNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgIH0pO1xuXG4gICAgYW5ndWxhci5tb2R1bGUoJ3JhaWxzJykucHJvdmlkZXIoJ1JhaWxzUmVzb3VyY2UnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBkZWZhdWx0T3B0aW9ucyA9IHtcbiAgICAgICAgICAgIHJvb3RXcmFwcGluZzogdHJ1ZSxcbiAgICAgICAgICAgIHVwZGF0ZU1ldGhvZDogJ3B1dCcsXG4gICAgICAgICAgICBodHRwQ29uZmlnOiB7fSxcbiAgICAgICAgICAgIGRlZmF1bHRQYXJhbXM6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIHVuZGVyc2NvcmVQYXJhbXM6IHRydWUsXG4gICAgICAgICAgICBmdWxsUmVzcG9uc2U6IGZhbHNlLFxuICAgICAgICAgICAgZXh0ZW5zaW9uczogW11cbiAgICAgICAgfTtcblxuICAgICAgICAvKipcbiAgICAgICAgICogRW5hYmxlcyBvciBkaXNhYmxlcyByb290IHdyYXBwaW5nIGJ5IGRlZmF1bHQgZm9yIFJhaWxzUmVzb3VyY2VzXG4gICAgICAgICAqIERlZmF1bHRzIHRvIHRydWUuXG4gICAgICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gdmFsdWUgdHJ1ZSB0byBlbmFibGUgcm9vdCB3cmFwcGluZywgZmFsc2UgdG8gZGlzYWJsZVxuICAgICAgICAgKiBAcmV0dXJucyB7UmFpbHNSZXNvdXJjZVByb3ZpZGVyfSBUaGUgcHJvdmlkZXIgaW5zdGFuY2VcbiAgICAgICAgICovXG4gICAgICAgIHRoaXMucm9vdFdyYXBwaW5nID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICBkZWZhdWx0T3B0aW9ucy5yb290V3JhcHBpbmcgPSB2YWx1ZTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9O1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDb25maWd1cmVzIHdoYXQgSFRUUCBvcGVyYXRpb24gc2hvdWxkIGJlIHVzZWQgZm9yIHVwZGF0ZSBieSBkZWZhdWx0IGZvciBSYWlsc1Jlc291cmNlcy5cbiAgICAgICAgICogRGVmYXVsdHMgdG8gJ3B1dCdcbiAgICAgICAgICogQHBhcmFtIHZhbHVlXG4gICAgICAgICAqIEByZXR1cm5zIHtSYWlsc1Jlc291cmNlUHJvdmlkZXJ9IFRoZSBwcm92aWRlciBpbnN0YW5jZVxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy51cGRhdGVNZXRob2QgPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgIGRlZmF1bHRPcHRpb25zLnVwZGF0ZU1ldGhvZCA9IHZhbHVlO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH07XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIENvbmZpZ3VyZXMgZGVmYXVsdCBIVFRQIGNvbmZpZ3VyYXRpb24gb3BlcmF0aW9ucyBmb3IgYWxsIFJhaWxzUmVzb3VyY2VzLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gdmFsdWUgU2VlICRodHRwIGZvciBhdmFpbGFibGUgY29uZmlndXJhdGlvbiBvcHRpb25zLlxuICAgICAgICAgKiBAcmV0dXJucyB7UmFpbHNSZXNvdXJjZVByb3ZpZGVyfSBUaGUgcHJvdmlkZXIgaW5zdGFuY2VcbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuaHR0cENvbmZpZyA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgZGVmYXVsdE9wdGlvbnMuaHR0cENvbmZpZyA9IHZhbHVlO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH07XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIENvbmZpZ3VyZXMgZGVmYXVsdCBIVFRQIHF1ZXJ5IHBhcmFtZXRlcnMgZm9yIGFsbCBSYWlsc1Jlc291cmNlcy5cbiAgICAgICAgICpcbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IHZhbHVlIE9iamVjdCBvZiBrZXkvdmFsdWUgcGFpcnMgcmVwcmVzZW50aW5nIHRoZSBIVFRQIHF1ZXJ5IHBhcmFtZXRlcnMgZm9yIGFsbCBIVFRQIG9wZXJhdGlvbnMuXG4gICAgICAgICAqIEByZXR1cm5zIHtSYWlsc1Jlc291cmNlUHJvdmlkZXJ9IFRoZSBwcm92aWRlciBpbnN0YW5jZVxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5kZWZhdWx0UGFyYW1zID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICBkZWZhdWx0T3B0aW9ucy5kZWZhdWx0UGFyYW1zID0gdmFsdWU7XG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfTtcblxuICAgICAgICAvKipcbiAgICAgICAgICogQ29uZmlndXJlcyB3aGV0aGVyIG9yIG5vdCB1bmRlcnNjb3JlIHF1ZXJ5IHBhcmFtZXRlcnNcbiAgICAgICAgICogQHBhcmFtIHtib29sZWFufSB2YWx1ZSB0cnVlIHRvIHVuZGVyc2NvcmUuICBEZWZhdWx0cyB0byB0cnVlLlxuICAgICAgICAgKiBAcmV0dXJucyB7UmFpbHNSZXNvdXJjZVByb3ZpZGVyfSBUaGUgcHJvdmlkZXIgaW5zdGFuY2VcbiAgICAgICAgICovXG4gICAgICAgIHRoaXMudW5kZXJzY29yZVBhcmFtcyA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgZGVmYXVsdE9wdGlvbnMudW5kZXJzY29yZVBhcmFtcyA9IHZhbHVlO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH07XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIENvbmZpZ3VyZXMgd2hldGhlciB0aGUgZnVsbCByZXNwb25zZSBmcm9tICRodHRwIGlzIHJldHVybmVkIG9yIGp1c3QgdGhlIHJlc3VsdCBkYXRhLlxuICAgICAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IHZhbHVlIHRydWUgdG8gcmV0dXJuIGZ1bGwgJGh0dHAgcmVzcG9uc2UuICBEZWZhdWx0cyB0byBmYWxzZS5cbiAgICAgICAgICogQHJldHVybnMge1JhaWxzUmVzb3VyY2VQcm92aWRlcn0gVGhlIHByb3ZpZGVyIGluc3RhbmNlXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmZ1bGxSZXNwb25zZSA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgZGVmYXVsdE9wdGlvbnMuZnVsbFJlc3BvbnNlID0gdmFsdWU7XG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfTtcblxuICAgICAgICAvKipcbiAgICAgICAgICogTGlzdCBvZiBSYWlsc1Jlc291cmNlIGV4dGVuc2lvbnMgdG8gaW5jbHVkZSBieSBkZWZhdWx0LlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0gey4uLnN0cmluZ30gZXh0ZW5zaW9ucyBPbmUgb3IgbW9yZSBleHRlbnNpb24gbmFtZXMgdG8gaW5jbHVkZVxuICAgICAgICAgKiBAcmV0dXJucyB7Kn1cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuZXh0ZW5zaW9ucyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGRlZmF1bHRPcHRpb25zLmV4dGVuc2lvbnMgPSBbXTtcbiAgICAgICAgICAgIGFuZ3VsYXIuZm9yRWFjaChhcmd1bWVudHMsIGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIGRlZmF1bHRPcHRpb25zLmV4dGVuc2lvbnMgPSBkZWZhdWx0T3B0aW9ucy5leHRlbnNpb25zLmNvbmNhdCh2YWx1ZSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9O1xuXG4gICAgICAgIHRoaXMuJGdldCA9IFsnJGh0dHAnLCAnJHEnLCAncmFpbHNVcmxCdWlsZGVyJywgJ3JhaWxzU2VyaWFsaXplcicsICdyYWlsc1Jvb3RXcmFwcGVyJywgJ1JhaWxzUmVzb3VyY2VJbmplY3RvcicsXG4gICAgICAgICAgICBmdW5jdGlvbiAoJGh0dHAsICRxLCByYWlsc1VybEJ1aWxkZXIsIHJhaWxzU2VyaWFsaXplciwgcmFpbHNSb290V3JhcHBlciwgUmFpbHNSZXNvdXJjZUluamVjdG9yKSB7XG5cbiAgICAgICAgICAgICAgICBmdW5jdGlvbiBSYWlsc1Jlc291cmNlKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHJlc3BvbnNlID0gdGhpcy5jb25zdHJ1Y3Rvci5kZXNlcmlhbGl6ZSh7ZGF0YTogdmFsdWV9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmNvbnN0cnVjdG9yLmNvbmZpZy5yb290V3JhcHBpbmcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZSA9IHJhaWxzUm9vdFdyYXBwZXIudW53cmFwKHJlc3BvbnNlLCB0aGlzLmNvbnN0cnVjdG9yLCB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGFuZ3VsYXIuZXh0ZW5kKHRoaXMsIHJlc3BvbnNlLmRhdGEpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgICAgICogRXh0ZW5kcyB0aGUgUmFpbHNSZXNvdXJjZSB0byB0aGUgY2hpbGQgY29uc3RydWN0b3IgZnVuY3Rpb24gbWFraW5nIHRoZSBjaGlsZCBjb25zdHJ1Y3RvciBhIHN1YmNsYXNzIG9mXG4gICAgICAgICAgICAgICAgICogUmFpbHNSZXNvdXJjZS4gIFRoaXMgaXMgbW9kZWxlZCBvZmYgb2YgQ29mZmVlU2NyaXB0J3MgY2xhc3MgZXh0ZW5kIGZ1bmN0aW9uLiAgQWxsIFJhaWxzUmVzb3VyY2VcbiAgICAgICAgICAgICAgICAgKiBjbGFzcyBwcm9wZXJ0aWVzIGRlZmluZWQgYXJlIGNvcGllZCB0byB0aGUgY2hpbGQgY2xhc3MgYW5kIHRoZSBjaGlsZCdzIHByb3RvdHlwZSBjaGFpbiBpcyBjb25maWd1cmVkXG4gICAgICAgICAgICAgICAgICogdG8gYWxsb3cgaW5zdGFuY2VzIG9mIHRoZSBjaGlsZCBjbGFzcyB0byBoYXZlIGFsbCBvZiB0aGUgaW5zdGFuY2UgbWV0aG9kcyBvZiBSYWlsc1Jlc291cmNlLlxuICAgICAgICAgICAgICAgICAqXG4gICAgICAgICAgICAgICAgICogTGlrZSBDb2ZmZWVTY3JpcHQsIGEgX19zdXBlcl9fIHByb3BlcnR5IGlzIHNldCBvbiB0aGUgY2hpbGQgY2xhc3MgdG8gdGhlIHBhcmVudCByZXNvdXJjZSdzIHByb3RvdHlwZSBjaGFpbi5cbiAgICAgICAgICAgICAgICAgKiBUaGlzIGlzIGRvbmUgdG8gYWxsb3cgc3ViY2xhc3NlcyB0byBleHRlbmQgdGhlIGZ1bmN0aW9uYWxpdHkgb2YgaW5zdGFuY2UgbWV0aG9kcyBhbmQgc3RpbGxcbiAgICAgICAgICAgICAgICAgKiBjYWxsIGJhY2sgdG8gdGhlIG9yaWdpbmFsIG1ldGhvZCB1c2luZzpcbiAgICAgICAgICAgICAgICAgKlxuICAgICAgICAgICAgICAgICAqICAgICBDbGFzcy5fX3N1cGVyX18ubWV0aG9kLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICAgICAgICAgICAgICpcbiAgICAgICAgICAgICAgICAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBjaGlsZCBDaGlsZCBjb25zdHJ1Y3RvciBmdW5jdGlvblxuICAgICAgICAgICAgICAgICAqIEByZXR1cm5zIHtmdW5jdGlvbn0gQ2hpbGQgY29uc3RydWN0b3IgZnVuY3Rpb25cbiAgICAgICAgICAgICAgICAgKi9cbiAgICAgICAgICAgICAgICBSYWlsc1Jlc291cmNlLmV4dGVuZFRvID0gZnVuY3Rpb24gKGNoaWxkKSB7XG4gICAgICAgICAgICAgICAgICAgIGFuZ3VsYXIuZm9yRWFjaCh0aGlzLCBmdW5jdGlvbiAodmFsdWUsIGtleSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGRba2V5XSA9IHZhbHVlO1xuICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoYW5ndWxhci5pc0FycmF5KHRoaXMuJG1vZHVsZXMpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC4kbW9kdWxlcyA9IHRoaXMuJG1vZHVsZXMuc2xpY2UoMCk7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBjdG9yKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb25zdHJ1Y3RvciA9IGNoaWxkO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgY3Rvci5wcm90b3R5cGUgPSB0aGlzLnByb3RvdHlwZTtcbiAgICAgICAgICAgICAgICAgICAgY2hpbGQucHJvdG90eXBlID0gbmV3IGN0b3IoKTtcbiAgICAgICAgICAgICAgICAgICAgY2hpbGQuX19zdXBlcl9fID0gdGhpcy5wcm90b3R5cGU7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBjaGlsZDtcbiAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgICAgICogQ29waWVzIGEgbWl4aW4ncyBwcm9wZXJ0aWVzIHRvIHRoZSByZXNvdXJjZS5cbiAgICAgICAgICAgICAgICAgKlxuICAgICAgICAgICAgICAgICAqIElmIG1vZHVsZSBpcyBhIFN0cmluZyB0aGVuIHdlIGl0IHdpbGwgYmUgbG9hZGVkIHVzaW5nIEFuZ3VsYXIncyBkZXBlbmRlbmN5IGluamVjdGlvbi4gIElmIHRoZSBuYW1lIGlzXG4gICAgICAgICAgICAgICAgICogbm90IHZhbGlkIHRoZW4gQW5ndWxhciB3aWxsIHRocm93IGFuIGVycm9yLlxuICAgICAgICAgICAgICAgICAqXG4gICAgICAgICAgICAgICAgICogQHBhcmFtIHsuLi5TdHJpbmd8ZnVuY3Rpb258T2JqZWN0fSBtaXhpbnMgVGhlIG1peGluIG9yIG5hbWUgb2YgdGhlIG1peGluIHRvIGFkZC5cbiAgICAgICAgICAgICAgICAgKiBAcmV0dXJucyB7UmFpbHNSZXNvdXJjZX0gdGhpc1xuICAgICAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgICAgIFJhaWxzUmVzb3VyY2UuZXh0ZW5kID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICBhbmd1bGFyLmZvckVhY2goYXJndW1lbnRzLCBmdW5jdGlvbiAobWl4aW4pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFkZE1peGluKHRoaXMsIHRoaXMsIG1peGluLCBmdW5jdGlvbiAoUmVzb3VyY2UsIG1peGluKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFuZ3VsYXIuaXNGdW5jdGlvbihtaXhpbi5leHRlbmRlZCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWl4aW4uZXh0ZW5kZWQoUmVzb3VyY2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9LCB0aGlzKTtcblxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgICAgICogQ29waWVzIGEgbWl4aW4ncyBwcm9wZXJ0aWVzIHRvIHRoZSByZXNvdXJjZSdzIHByb3RvdHlwZSBjaGFpbi5cbiAgICAgICAgICAgICAgICAgKlxuICAgICAgICAgICAgICAgICAqIElmIG1vZHVsZSBpcyBhIFN0cmluZyB0aGVuIHdlIGl0IHdpbGwgYmUgbG9hZGVkIHVzaW5nIEFuZ3VsYXIncyBkZXBlbmRlbmN5IGluamVjdGlvbi4gIElmIHRoZSBuYW1lIGlzXG4gICAgICAgICAgICAgICAgICogbm90IHZhbGlkIHRoZW4gQW5ndWxhciB3aWxsIHRocm93IGFuIGVycm9yLlxuICAgICAgICAgICAgICAgICAqXG4gICAgICAgICAgICAgICAgICogQHBhcmFtIHsuLi5TdHJpbmd8ZnVuY3Rpb258T2JqZWN0fSBtaXhpbnMgVGhlIG1peGluIG9yIG5hbWUgb2YgdGhlIG1peGluIHRvIGFkZFxuICAgICAgICAgICAgICAgICAqIEByZXR1cm5zIHtSYWlsc1Jlc291cmNlfSB0aGlzXG4gICAgICAgICAgICAgICAgICovXG4gICAgICAgICAgICAgICAgUmFpbHNSZXNvdXJjZS5pbmNsdWRlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICBhbmd1bGFyLmZvckVhY2goYXJndW1lbnRzLCBmdW5jdGlvbiAobWl4aW4pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFkZE1peGluKHRoaXMsIHRoaXMucHJvdG90eXBlLCBtaXhpbiwgZnVuY3Rpb24gKFJlc291cmNlLCBtaXhpbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhbmd1bGFyLmlzRnVuY3Rpb24obWl4aW4uaW5jbHVkZWQpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1peGluLmluY2x1ZGVkKFJlc291cmNlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfSwgdGhpcyk7XG5cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICAgICAqIFNldHMgY29uZmlndXJhdGlvbiBvcHRpb25zLiAgVGhpcyBtZXRob2QgbWF5IGJlIGNhbGxlZCBtdWx0aXBsZSB0aW1lcyB0byBzZXQgYWRkaXRpb25hbCBvcHRpb25zIG9yIHRvXG4gICAgICAgICAgICAgICAgICogb3ZlcnJpZGUgcHJldmlvdXMgdmFsdWVzIChzdWNoIGFzIHRoZSBjYXNlIHdpdGggaW5oZXJpdGVkIHJlc291cmNlcykuXG4gICAgICAgICAgICAgICAgICogQHBhcmFtIGNmZ1xuICAgICAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgICAgIFJhaWxzUmVzb3VyY2UuY29uZmlndXJlID0gZnVuY3Rpb24gKGNmZykge1xuICAgICAgICAgICAgICAgICAgICBjZmcgPSBjZmcgfHwge307XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuY29uZmlnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjZmcgPSBhbmd1bGFyLmV4dGVuZCh7fSwgdGhpcy5jb25maWcsIGNmZyk7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbmZpZyA9IHt9O1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbmZpZy5pZEF0dHJpYnV0ZSA9IGNmZy5pZEF0dHJpYnV0ZSB8fCAnaWQnO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbmZpZy51cmwgPSBjZmcudXJsO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbmZpZy5yb290V3JhcHBpbmcgPSBib29sZWFuUGFyYW0oY2ZnLnJvb3RXcmFwcGluZywgZGVmYXVsdE9wdGlvbnMucm9vdFdyYXBwaW5nKTsgLy8gdXNpbmcgdW5kZWZpbmVkIGNoZWNrIGJlY2F1c2UgY29uZmlnLnJvb3RXcmFwcGluZyB8fCB0cnVlIHdvdWxkIGJlIHRydWUgd2hlbiBjb25maWcucm9vdFdyYXBwaW5nID09PSBmYWxzZVxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbmZpZy5odHRwQ29uZmlnID0gY2ZnLmh0dHBDb25maWcgfHwgZGVmYXVsdE9wdGlvbnMuaHR0cENvbmZpZztcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb25maWcuaHR0cENvbmZpZy5oZWFkZXJzID0gYW5ndWxhci5leHRlbmQoeydBY2NlcHQnOiAnYXBwbGljYXRpb24vanNvbicsICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbid9LCB0aGlzLmNvbmZpZy5odHRwQ29uZmlnLmhlYWRlcnMgfHwge30pO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbmZpZy5kZWZhdWx0UGFyYW1zID0gY2ZnLmRlZmF1bHRQYXJhbXMgfHwgZGVmYXVsdE9wdGlvbnMuZGVmYXVsdFBhcmFtcztcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb25maWcudW5kZXJzY29yZVBhcmFtcyA9IGJvb2xlYW5QYXJhbShjZmcudW5kZXJzY29yZVBhcmFtcywgZGVmYXVsdE9wdGlvbnMudW5kZXJzY29yZVBhcmFtcyk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY29uZmlnLnVwZGF0ZU1ldGhvZCA9IChjZmcudXBkYXRlTWV0aG9kIHx8IGRlZmF1bHRPcHRpb25zLnVwZGF0ZU1ldGhvZCkudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb25maWcuZnVsbFJlc3BvbnNlID0gYm9vbGVhblBhcmFtKGNmZy5mdWxsUmVzcG9uc2UsIGRlZmF1bHRPcHRpb25zLmZ1bGxSZXNwb25zZSk7XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb25maWcucmVxdWVzdFRyYW5zZm9ybWVycyA9IGNmZy5yZXF1ZXN0VHJhbnNmb3JtZXJzID8gY2ZnLnJlcXVlc3RUcmFuc2Zvcm1lcnMuc2xpY2UoMCkgOiBbXTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb25maWcucmVzcG9uc2VJbnRlcmNlcHRvcnMgPSBjZmcucmVzcG9uc2VJbnRlcmNlcHRvcnMgPyBjZmcucmVzcG9uc2VJbnRlcmNlcHRvcnMuc2xpY2UoMCkgOiBbXTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb25maWcuYWZ0ZXJSZXNwb25zZUludGVyY2VwdG9ycyA9IGNmZy5hZnRlclJlc3BvbnNlSW50ZXJjZXB0b3JzID8gY2ZnLmFmdGVyUmVzcG9uc2VJbnRlcmNlcHRvcnMuc2xpY2UoMCkgOiBbXTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb25maWcuaW50ZXJjZXB0b3JzID0gY2ZnLmludGVyY2VwdG9ycyA/IGNmZy5pbnRlcmNlcHRvcnMuc2xpY2UoMCkgOiBbXTtcblxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbmZpZy5zZXJpYWxpemVyID0gUmFpbHNSZXNvdXJjZUluamVjdG9yLmdldFNlcnZpY2UoY2ZnLnNlcmlhbGl6ZXIgfHwgcmFpbHNTZXJpYWxpemVyKCkpO1xuXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY29uZmlnLm5hbWUgPSB0aGlzLmNvbmZpZy5zZXJpYWxpemVyLnVuZGVyc2NvcmUoY2ZnLm5hbWUpO1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIHdlIGRvbid0IHdhbnQgdG8gdHVybiB1bmRlZmluZWQgbmFtZSBpbnRvIFwidW5kZWZpbmVkc1wiIHRoZW4gdGhlIHBsdXJhbCBuYW1lIHdvbid0IHVwZGF0ZSB3aGVuIHRoZSBuYW1lIGlzIHNldFxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5jb25maWcubmFtZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb25maWcucGx1cmFsTmFtZSA9IHRoaXMuY29uZmlnLnNlcmlhbGl6ZXIudW5kZXJzY29yZShjZmcucGx1cmFsTmFtZSB8fCB0aGlzLmNvbmZpZy5zZXJpYWxpemVyLnBsdXJhbGl6ZSh0aGlzLmNvbmZpZy5uYW1lKSk7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbmZpZy51cmxCdWlsZGVyID0gcmFpbHNVcmxCdWlsZGVyKHRoaXMuY29uZmlnKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb25maWcucmVzb3VyY2VDb25zdHJ1Y3RvciA9IHRoaXM7XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5leHRlbmQuYXBwbHkodGhpcywgbG9hZEV4dGVuc2lvbnMoKGNmZy5leHRlbnNpb25zIHx8IFtdKS5jb25jYXQoZGVmYXVsdE9wdGlvbnMuZXh0ZW5zaW9ucykpKTtcblxuICAgICAgICAgICAgICAgICAgICBhbmd1bGFyLmZvckVhY2godGhpcy4kbWl4aW5zLCBmdW5jdGlvbiAobWl4aW4pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhbmd1bGFyLmlzRnVuY3Rpb24obWl4aW4uY29uZmlndXJlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1peGluLmNvbmZpZ3VyZSh0aGlzLmNvbmZpZywgY2ZnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSwgdGhpcyk7XG4gICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICAgICAqIENvbmZpZ3VyZXMgdGhlIFVSTCBmb3IgdGhlIHJlc291cmNlLlxuICAgICAgICAgICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfGZ1bmN0aW9ufSB1cmwgVGhlIHVybCBzdHJpbmcgb3IgZnVuY3Rpb24uXG4gICAgICAgICAgICAgICAgICovXG4gICAgICAgICAgICAgICAgUmFpbHNSZXNvdXJjZS5zZXRVcmwgPSBmdW5jdGlvbiAodXJsKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY29uZmlndXJlKHt1cmw6IHVybH0pO1xuICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICBSYWlsc1Jlc291cmNlLmJ1aWxkVXJsID0gZnVuY3Rpb24gKGNvbnRleHQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29uZmlnLnVybEJ1aWxkZXIoY29udGV4dCk7XG4gICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICAgICAqIEludGVyY2VwdG9ycyB1dGlsaXplICRxIHByb21pc2VzIHRvIGFsbG93IGZvciBib3RoIHN5bmNocm9ub3VzIGFuZCBhc3luY2hyb25vdXMgcHJvY2Vzc2luZyBkdXJpbmdcbiAgICAgICAgICAgICAgICAgKiBhIHJlcXVlc3QgLyByZXNwb25zZSBjeWNsZS5cbiAgICAgICAgICAgICAgICAgKlxuICAgICAgICAgICAgICAgICAqIEludGVyY2VwdG9ycyBjYW4gYmUgYWRkZWQgYXMgYSBzZXJ2aWNlIGZhY3RvcnkgbmFtZSBvciBhcyBhbiBvYmplY3Qgd2l0aCBwcm9wZXJ0aWVzIG1hdGNoaW5nIG9uZVxuICAgICAgICAgICAgICAgICAqIG9yIG1vcmUgb2YgdGhlIHBoYXNlcy4gIEVhY2ggcHJvcGVydHkgc2hvdWxkIGhhdmUgYSB2YWx1ZSBvZiBhIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZCBkdXJpbmcgdGhhdCBwaGFzZS5cbiAgICAgICAgICAgICAgICAgKlxuICAgICAgICAgICAgICAgICAqIFRoZXJlIGFyZSBtdWx0aXBsZSBwaGFzZXMgZm9yIGJvdGggcmVxdWVzdCBhbmQgcmVzcG9uc2UuICBJbiBhZGRpdGlvbiwgZWFjaCBwaGFzZSBoYXMgYSBjb3JyZXNwb25kaW5nXG4gICAgICAgICAgICAgICAgICogZXJyb3IgcGhhc2UgdG8gaGFuZGxlIHByb21pc2UgcmVqZWN0aW9ucy5cbiAgICAgICAgICAgICAgICAgKlxuICAgICAgICAgICAgICAgICAqIEVhY2ggcmVxdWVzdCBwaGFzZSBpbnRlcmNlcHRvciBpcyBjYWxsZWQgd2l0aCB0aGUgJGh0dHAgY29uZmlnIG9iamVjdCwgdGhlIHJlc291cmNlIGNvbnN0cnVjdG9yLCBhbmQgaWZcbiAgICAgICAgICAgICAgICAgKiBhcHBsaWNhYmxlIHRoZSByZXNvdXJjZSBpbnN0YW5jZS4gIFRoZSBpbnRlcmNlcHRvciBpcyBmcmVlIHRvIG1vZGlmeSB0aGUgY29uZmlnIG9yIGNyZWF0ZSBhIG5ldyBvbmUuXG4gICAgICAgICAgICAgICAgICogVGhlIGludGVyY2VwdG9yIGZ1bmN0aW9uIG11c3QgcmV0dXJuIGEgdmFsaWQgJGh0dHAgY29uZmlnIG9yIGEgcHJvbWlzZSB0aGF0IHdpbGwgZXZlbnR1YWxseSByZXNvbHZlXG4gICAgICAgICAgICAgICAgICogdG8gYSBjb25maWcgb2JqZWN0LlxuICAgICAgICAgICAgICAgICAqXG4gICAgICAgICAgICAgICAgICogVGhlIHZhbGlkIHJlcXVlc3QgcGhhc2VzIGFyZTpcbiAgICAgICAgICAgICAgICAgKlxuICAgICAgICAgICAgICAgICAqICogYmVmb3JlUmVxdWVzdDogSW50ZXJjZXB0b3JzIGFyZSBjYWxsZWQgcHJpb3IgdG8gYW55IGRhdGEgc2VyaWFsaXphdGlvbiBvciByb290IHdyYXBwaW5nLlxuICAgICAgICAgICAgICAgICAqICogYmVmb3JlUmVxdWVzdEVycm9yOiBJbnRlcmNlcHRvcnMgZ2V0IGNhbGxlZCB3aGVuIGEgcHJldmlvdXMgaW50ZXJjZXB0b3IgdGhyZXcgYW4gZXJyb3Igb3JcbiAgICAgICAgICAgICAgICAgKiAgICAgIHJlc29sdmVkIHdpdGggYSByZWplY3Rpb24uXG4gICAgICAgICAgICAgICAgICogKiBiZWZvcmVSZXF1ZXN0V3JhcHBpbmc6IEludGVyY2VwdG9ycyBhcmUgY2FsbGVkIGFmdGVyIGRhdGEgc2VyaWFsaXphdGlvbiBidXQgYmVmb3JlIHJvb3Qgd3JhcHBpbmcuXG4gICAgICAgICAgICAgICAgICogKiBiZWZvcmVSZXF1ZXN0V3JhcHBpbmdFcnJvcjogSW50ZXJjZXB0b3JzIGdldCBjYWxsZWQgd2hlbiBhIHByZXZpb3VzIGludGVyY2VwdG9yIHRocmV3IGFuIGVycm9yIG9yXG4gICAgICAgICAgICAgICAgICogICAgICByZXNvbHZlZCB3aXRoIGEgcmVqZWN0aW9uLlxuICAgICAgICAgICAgICAgICAqICogcmVxdWVzdDogIEludGVyY2VwdG9ycyBhcmUgY2FsbGVkIGFmdGVyIGFueSBkYXRhIHNlcmlhbGl6YXRpb24gYW5kIHJvb3Qgd3JhcHBpbmcgaGF2ZSBiZWVuIHBlcmZvcm1lZC5cbiAgICAgICAgICAgICAgICAgKiAqIHJlcXVlc3RFcnJvcjogSW50ZXJjZXB0b3JzIGdldCBjYWxsZWQgd2hlbiBhIHByZXZpb3VzIGludGVyY2VwdG9yIHRocmV3IGFuIGVycm9yIG9yXG4gICAgICAgICAgICAgICAgICogICAgICByZXNvbHZlZCB3aXRoIGEgcmVqZWN0aW9uLlxuICAgICAgICAgICAgICAgICAqXG4gICAgICAgICAgICAgICAgICogVGhlIGJlZm9yZVJlc3BvbnNlIGFuZCByZXNwb25zZSBpbnRlcmNlcHRvcnMgYXJlIGNhbGxlZCB3aXRoIHRoZSAkaHR0cCByZXNwb25zZSBvYmplY3QsXG4gICAgICAgICAgICAgICAgICogdGhlIHJlc291cmNlIGNvbnN0cnVjdG9yLCBhbmQgaWYgYXBwbGljYWJsZSB0aGUgcmVzb3VyY2UgaW5zdGFuY2UuICBUaGUgYWZ0ZXJSZXNwb25zZSBpbnRlcmNlcHRvcnNcbiAgICAgICAgICAgICAgICAgKiBhcmUgdHlwaWNhbGx5IGNhbGxlZCB3aXRoIHRoZSByZXNwb25zZSBkYXRhIGluc3RlYWQgb2YgdGhlIGZ1bGwgcmVzcG9uc2Ugb2JqZWN0IHVubGVzcyB0aGUgY29uZmlnIG9wdGlvblxuICAgICAgICAgICAgICAgICAqIGZ1bGxSZXNwb25zZSBoYXMgYmVlbiBzZXQgdG8gdHJ1ZS4gIExpa2UgdGhlIHJlcXVlc3QgaW50ZXJjZXB0b3IgY2FsbGJhY2tzIHRoZSByZXNwb25zZSBjYWxsYmFja3MgY2FuXG4gICAgICAgICAgICAgICAgICogbWFuaXB1bGF0ZSB0aGUgZGF0YSBvciByZXR1cm4gbmV3IGRhdGEuICBUaGUgaW50ZXJjZXB0b3IgZnVuY3Rpb24gbXVzdCByZXR1cm5cbiAgICAgICAgICAgICAgICAgKlxuICAgICAgICAgICAgICAgICAqIFRoZSB2YWxpZCByZXNwb25zZSBwaGFzZXMgYXJlOlxuICAgICAgICAgICAgICAgICAqXG4gICAgICAgICAgICAgICAgICogKiBiZWZvcmVSZXNwb25zZTogSW50ZXJjZXB0b3JzIGFyZSBjYWxsZWQgcHJpb3IgdG8gYW55IGRhdGEgcHJvY2Vzc2luZy5cbiAgICAgICAgICAgICAgICAgKiAqIGJlZm9yZVJlc3BvbnNlRXJyb3I6IEludGVyY2VwdG9ycyBnZXQgY2FsbGVkIHdoZW4gYSBwcmV2aW91cyBpbnRlcmNlcHRvciB0aHJldyBhbiBlcnJvciBvclxuICAgICAgICAgICAgICAgICAqICAgICAgcmVzb2x2ZWQgd2l0aCBhIHJlamVjdGlvbi5cbiAgICAgICAgICAgICAgICAgKiAqIGJlZm9yZVJlc3BvbnNlRGVzZXJpYWxpemU6IEludGVyY2VwdG9ycyBhcmUgY2FsbGVkIGFmdGVyIHJvb3QgdW53cmFwcGluZyBidXQgcHJpb3IgdG8gZGF0YSBkZXNlcmlhbGl6aW5nLlxuICAgICAgICAgICAgICAgICAqICogYmVmb3JlUmVzcG9uc2VEZXNlcmlhbGl6ZUVycm9yOiBJbnRlcmNlcHRvcnMgZ2V0IGNhbGxlZCB3aGVuIGEgcHJldmlvdXMgaW50ZXJjZXB0b3IgdGhyZXcgYW4gZXJyb3Igb3JcbiAgICAgICAgICAgICAgICAgKiAgICAgIHJlc29sdmVkIHdpdGggYSByZWplY3Rpb24uXG4gICAgICAgICAgICAgICAgICogKiByZXNwb25zZTogIEludGVyY2VwdG9ycyBhcmUgY2FsbGVkIGFmdGVyIHRoZSBkYXRhIGhhcyBiZWVuIGRlc2VyaWFsaXplZCBhbmQgcm9vdCB1bndyYXBwZWQgYnV0XG4gICAgICAgICAgICAgICAgICogICAgICBwcmlvciB0byB0aGUgZGF0YSBiZWluZyBjb3BpZWQgdG8gdGhlIHJlc291cmNlIGluc3RhbmNlIGlmIGFwcGxpY2FibGUuXG4gICAgICAgICAgICAgICAgICogKiByZXNwb25zZUVycm9yOiBJbnRlcmNlcHRvcnMgZ2V0IGNhbGxlZCB3aGVuIGEgcHJldmlvdXMgaW50ZXJjZXB0b3IgdGhyZXcgYW4gZXJyb3Igb3JcbiAgICAgICAgICAgICAgICAgKiAgICAgIHJlc29sdmVkIHdpdGggYSByZWplY3Rpb24uXG4gICAgICAgICAgICAgICAgICogKiBhZnRlclJlc3BvbnNlOiAgSW50ZXJjZXB0b3JzIGFyZSBjYWxsZWQgYXQgdGhlIHZlcnkgZW5kIG9mIHRoZSByZXNwb25zZSBjaGFpbiBhZnRlciBhbGwgcHJvY2Vzc2luZ1xuICAgICAgICAgICAgICAgICAqICAgICAgaGFzIGJlZW4gY29tcGxldGVkLiAgVGhlIHZhbHVlIG9mIHRoZSBmaXJzdCBwYXJhbWV0ZXIgaXMgb25lIG9mIHRoZSBmb2xsb3dpbmc6XG4gICAgICAgICAgICAgICAgICogICAgICAgLSByZXNvdXJjZSBpbnN0YW5jZTogV2hlbiBmdWxsUmVzcG9uc2UgaXMgZmFsc2UgYW5kIHRoZSBvcGVyYXRpb24gd2FzIGNhbGxlZCBvbiBhIHJlc291cmNlIGluc3RhbmNlLlxuICAgICAgICAgICAgICAgICAqICAgICAgIC0gcmVzcG9uc2UgZGF0YTogV2hlbiBmdWxsUmVzcG9uc2UgaXMgZmFsc2UgYW5kIHRoZSBvcGVyYXRpb24gd2FzIGNhbGxlZCBvbiB0aGUgcmVzb3VyY2UgY2xhc3MuXG4gICAgICAgICAgICAgICAgICogICAgICAgLSAkaHR0cCByZXNwb25zZTogV2hlbiBmdWxsUmVzcG9uc2UgaXMgdHJ1ZVxuICAgICAgICAgICAgICAgICAqICogYWZ0ZXJSZXNwb25zZUVycm9yOiBJbnRlcmNlcHRvcnMgZ2V0IGNhbGxlZCB3aGVuIGEgcHJldmlvdXMgaW50ZXJjZXB0b3IgdGhyZXcgYW4gZXJyb3Igb3JcbiAgICAgICAgICAgICAgICAgKiAgICAgIHJlc29sdmVkIHdpdGggYSByZWplY3Rpb24uXG4gICAgICAgICAgICAgICAgICpcbiAgICAgICAgICAgICAgICAgKiBAcGFyYW0ge1N0cmluZyB8IE9iamVjdH0gaW50ZXJjZXB0b3JcbiAgICAgICAgICAgICAgICAgKi9cbiAgICAgICAgICAgICAgICBSYWlsc1Jlc291cmNlLmFkZEludGVyY2VwdG9yID0gZnVuY3Rpb24gKGludGVyY2VwdG9yKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY29uZmlnLmludGVyY2VwdG9ycy5wdXNoKGludGVyY2VwdG9yKTtcbiAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgICAgICogQWRkcyBhbiBpbnRlcmNlcHRvciBjYWxsYmFjayBmdW5jdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBwaGFzZS5cbiAgICAgICAgICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gcGhhc2UgVGhlIGludGVyY2VwdG9yIHBoYXNlLCBvbmUgb2Y6XG4gICAgICAgICAgICAgICAgICogICAgICBiZWZvcmVSZXF1ZXN0LCByZXF1ZXN0LCBiZWZvcmVSZXNwb25zZSwgcmVzcG9uc2UsIGFmdGVyUmVzcG9uc2VcbiAgICAgICAgICAgICAgICAgKiBAcGFyYW0gZm4gVGhlIGZ1bmN0aW9uIHRvIGNhbGwuXG4gICAgICAgICAgICAgICAgICovXG4gICAgICAgICAgICAgICAgUmFpbHNSZXNvdXJjZS5pbnRlcmNlcHQgPSBmdW5jdGlvbiAocGhhc2UsIGZuKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBpbnRlcmNlcHRvciA9IHt9O1xuICAgICAgICAgICAgICAgICAgICBmbiA9IFJhaWxzUmVzb3VyY2VJbmplY3Rvci5nZXREZXBlbmRlbmN5KGZuKTtcblxuICAgICAgICAgICAgICAgICAgICBpbnRlcmNlcHRvcltwaGFzZV0gPSBmdW5jdGlvbiAodmFsdWUsIHJlc291cmNlQ29uc3RydWN0b3IsIGNvbnRleHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmbih2YWx1ZSwgcmVzb3VyY2VDb25zdHJ1Y3RvciwgY29udGV4dCkgfHwgdmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hZGRJbnRlcmNlcHRvcihpbnRlcmNlcHRvcik7XG4gICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICAgICAqIEFkZHMgaW50ZXJjZXB0b3Igb24gJ2JlZm9yZVJlcXVlc3QnIHBoYXNlLlxuICAgICAgICAgICAgICAgICAqIEBwYXJhbSBmbihodHRwQ29uZmlnLCBjb25zdHJ1Y3RvciwgY29udGV4dCkgLSBodHRwQ29uZmlnIGlzIHRoZSBjb25maWcgb2JqZWN0IHRvIHBhc3MgdG8gJGh0dHAsXG4gICAgICAgICAgICAgICAgICogICAgICBjb25zdHJ1Y3RvciBpcyB0aGUgcmVzb3VyY2UgY2xhc3MgY2FsbGluZyB0aGUgZnVuY3Rpb24sXG4gICAgICAgICAgICAgICAgICogICAgICBjb250ZXh0IGlzIHRoZSByZXNvdXJjZSBpbnN0YW5jZSBvZiB0aGUgY2FsbGluZyBtZXRob2QgKGNyZWF0ZSwgdXBkYXRlLCBkZWxldGUpIG9yIHVuZGVmaW5lZCBpZiB0aGUgbWV0aG9kIHdhcyBhIGNsYXNzIG1ldGhvZCAoZ2V0LCBxdWVyeSlcbiAgICAgICAgICAgICAgICAgKi9cbiAgICAgICAgICAgICAgICBSYWlsc1Jlc291cmNlLmludGVyY2VwdEJlZm9yZVJlcXVlc3QgPSBmdW5jdGlvbiAoZm4pIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pbnRlcmNlcHQoJ2JlZm9yZVJlcXVlc3QnLCBmbik7XG4gICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICAgICAqIEFkZHMgaW50ZXJjZXB0b3Igb24gJ2JlZm9yZVJlcXVlc3RXcmFwcGluZycgcGhhc2UuXG4gICAgICAgICAgICAgICAgICogQHBhcmFtIGZuKGh0dHBDb25maWcsIGNvbnN0cnVjdG9yLCBjb250ZXh0KSAtIGh0dHBDb25maWcgaXMgdGhlIGNvbmZpZyBvYmplY3QgdG8gcGFzcyB0byAkaHR0cCxcbiAgICAgICAgICAgICAgICAgKiAgICAgIGNvbnN0cnVjdG9yIGlzIHRoZSByZXNvdXJjZSBjbGFzcyBjYWxsaW5nIHRoZSBmdW5jdGlvbixcbiAgICAgICAgICAgICAgICAgKiAgICAgIGNvbnRleHQgaXMgdGhlIHJlc291cmNlIGluc3RhbmNlIG9mIHRoZSBjYWxsaW5nIG1ldGhvZCAoY3JlYXRlLCB1cGRhdGUsIGRlbGV0ZSkgb3IgdW5kZWZpbmVkIGlmIHRoZSBtZXRob2Qgd2FzIGEgY2xhc3MgbWV0aG9kIChnZXQsIHF1ZXJ5KVxuICAgICAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgICAgIFJhaWxzUmVzb3VyY2UuaW50ZXJjZXB0QmVmb3JlUmVxdWVzdFdyYXBwaW5nID0gZnVuY3Rpb24gKGZuKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaW50ZXJjZXB0KCdiZWZvcmVSZXF1ZXN0V3JhcHBpbmcnLCBmbik7XG4gICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICAgICAqIEFkZHMgaW50ZXJjZXB0b3Igb24gJ3JlcXVlc3QnIHBoYXNlLlxuICAgICAgICAgICAgICAgICAqIEBwYXJhbSBmbihodHRwQ29uZmlnLCBjb25zdHJ1Y3RvciwgY29udGV4dCkgLSBodHRwQ29uZmlnIGlzIHRoZSBjb25maWcgb2JqZWN0IHRvIHBhc3MgdG8gJGh0dHAsXG4gICAgICAgICAgICAgICAgICogICAgICBjb25zdHJ1Y3RvciBpcyB0aGUgcmVzb3VyY2UgY2xhc3MgY2FsbGluZyB0aGUgZnVuY3Rpb24sXG4gICAgICAgICAgICAgICAgICogICAgICBjb250ZXh0IGlzIHRoZSByZXNvdXJjZSBpbnN0YW5jZSBvZiB0aGUgY2FsbGluZyBtZXRob2QgKGNyZWF0ZSwgdXBkYXRlLCBkZWxldGUpIG9yIHVuZGVmaW5lZCBpZiB0aGUgbWV0aG9kIHdhcyBhIGNsYXNzIG1ldGhvZCAoZ2V0LCBxdWVyeSlcbiAgICAgICAgICAgICAgICAgKi9cbiAgICAgICAgICAgICAgICBSYWlsc1Jlc291cmNlLmludGVyY2VwdFJlcXVlc3QgPSBmdW5jdGlvbiAoZm4pIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pbnRlcmNlcHQoJ3JlcXVlc3QnLCBmbik7XG4gICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICAgICAqIEFkZHMgaW50ZXJjZXB0b3Igb24gJ2JlZm9yZVJlc3BvbnNlJyBwaGFzZS5cbiAgICAgICAgICAgICAgICAgKiBAcGFyYW0gZm4ocmVzcG9uc2UgZGF0YSwgY29uc3RydWN0b3IsIGNvbnRleHQpIC0gcmVzcG9uc2UgZGF0YSBpcyBlaXRoZXIgdGhlIHJlc291cmNlIGluc3RhbmNlIHJldHVybmVkIG9yIGFuIGFycmF5IG9mIHJlc291cmNlIGluc3RhbmNlcyxcbiAgICAgICAgICAgICAgICAgKiAgICAgIGNvbnN0cnVjdG9yIGlzIHRoZSByZXNvdXJjZSBjbGFzcyBjYWxsaW5nIHRoZSBmdW5jdGlvbixcbiAgICAgICAgICAgICAgICAgKiAgICAgIGNvbnRleHQgaXMgdGhlIHJlc291cmNlIGluc3RhbmNlIG9mIHRoZSBjYWxsaW5nIG1ldGhvZCAoY3JlYXRlLCB1cGRhdGUsIGRlbGV0ZSkgb3IgdW5kZWZpbmVkIGlmIHRoZSBtZXRob2Qgd2FzIGEgY2xhc3MgbWV0aG9kIChnZXQsIHF1ZXJ5KVxuICAgICAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgICAgIFJhaWxzUmVzb3VyY2UuaW50ZXJjZXB0QmVmb3JlUmVzcG9uc2UgPSBmdW5jdGlvbiAoZm4pIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pbnRlcmNlcHQoJ2JlZm9yZVJlc3BvbnNlJywgZm4pO1xuICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAgICAgKiBBZGRzIGludGVyY2VwdG9yIG9uICdiZWZvcmVSZXNwb25zZURlc2VyaWFsaXplJyBwaGFzZS5cbiAgICAgICAgICAgICAgICAgKiBAcGFyYW0gZm4ocmVzcG9uc2UgZGF0YSwgY29uc3RydWN0b3IsIGNvbnRleHQpIC0gcmVzcG9uc2UgZGF0YSBpcyBlaXRoZXIgdGhlIHJlc291cmNlIGluc3RhbmNlIHJldHVybmVkIG9yIGFuIGFycmF5IG9mIHJlc291cmNlIGluc3RhbmNlcyxcbiAgICAgICAgICAgICAgICAgKiAgICAgIGNvbnN0cnVjdG9yIGlzIHRoZSByZXNvdXJjZSBjbGFzcyBjYWxsaW5nIHRoZSBmdW5jdGlvbixcbiAgICAgICAgICAgICAgICAgKiAgICAgIGNvbnRleHQgaXMgdGhlIHJlc291cmNlIGluc3RhbmNlIG9mIHRoZSBjYWxsaW5nIG1ldGhvZCAoY3JlYXRlLCB1cGRhdGUsIGRlbGV0ZSkgb3IgdW5kZWZpbmVkIGlmIHRoZSBtZXRob2Qgd2FzIGEgY2xhc3MgbWV0aG9kIChnZXQsIHF1ZXJ5KVxuICAgICAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgICAgIFJhaWxzUmVzb3VyY2UuaW50ZXJjZXB0QmVmb3JlUmVzcG9uc2VEZXNlcmlhbGl6ZSA9IGZ1bmN0aW9uIChmbikge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmludGVyY2VwdCgnYmVmb3JlUmVzcG9uc2VEZXNlcmlhbGl6ZScsIGZuKTtcbiAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgICAgICogQWRkcyBpbnRlcmNlcHRvciBvbiAncmVzcG9uc2UnIHBoYXNlLlxuICAgICAgICAgICAgICAgICAqIEBwYXJhbSBmbihyZXNwb25zZSBkYXRhLCBjb25zdHJ1Y3RvciwgY29udGV4dCkgLSByZXNwb25zZSBkYXRhIGlzIGVpdGhlciB0aGUgcmVzb3VyY2UgaW5zdGFuY2UgcmV0dXJuZWQgb3IgYW4gYXJyYXkgb2YgcmVzb3VyY2UgaW5zdGFuY2VzLFxuICAgICAgICAgICAgICAgICAqICAgICAgY29uc3RydWN0b3IgaXMgdGhlIHJlc291cmNlIGNsYXNzIGNhbGxpbmcgdGhlIGZ1bmN0aW9uLFxuICAgICAgICAgICAgICAgICAqICAgICAgY29udGV4dCBpcyB0aGUgcmVzb3VyY2UgaW5zdGFuY2Ugb2YgdGhlIGNhbGxpbmcgbWV0aG9kIChjcmVhdGUsIHVwZGF0ZSwgZGVsZXRlKSBvciB1bmRlZmluZWQgaWYgdGhlIG1ldGhvZCB3YXMgYSBjbGFzcyBtZXRob2QgKGdldCwgcXVlcnkpXG4gICAgICAgICAgICAgICAgICovXG4gICAgICAgICAgICAgICAgUmFpbHNSZXNvdXJjZS5pbnRlcmNlcHRSZXNwb25zZSA9IGZ1bmN0aW9uIChmbikge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmludGVyY2VwdCgncmVzcG9uc2UnLCBmbik7XG4gICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICAgICAqIEFkZHMgaW50ZXJjZXB0b3Igb24gJ2FmdGVyUmVzcG9uc2UnIHBoYXNlLlxuICAgICAgICAgICAgICAgICAqIEBwYXJhbSBmbihyZXNwb25zZSBkYXRhLCBjb25zdHJ1Y3RvciwgY29udGV4dCkgLSByZXNwb25zZSBkYXRhIGlzIGVpdGhlciB0aGUgcmVzb3VyY2UgaW5zdGFuY2UgcmV0dXJuZWQgb3IgYW4gYXJyYXkgb2YgcmVzb3VyY2UgaW5zdGFuY2VzLFxuICAgICAgICAgICAgICAgICAqICAgICAgY29uc3RydWN0b3IgaXMgdGhlIHJlc291cmNlIGNsYXNzIGNhbGxpbmcgdGhlIGZ1bmN0aW9uLFxuICAgICAgICAgICAgICAgICAqICAgICAgY29udGV4dCBpcyB0aGUgcmVzb3VyY2UgaW5zdGFuY2Ugb2YgdGhlIGNhbGxpbmcgbWV0aG9kIChjcmVhdGUsIHVwZGF0ZSwgZGVsZXRlKSBvciB1bmRlZmluZWQgaWYgdGhlIG1ldGhvZCB3YXMgYSBjbGFzcyBtZXRob2QgKGdldCwgcXVlcnkpXG4gICAgICAgICAgICAgICAgICovXG4gICAgICAgICAgICAgICAgUmFpbHNSZXNvdXJjZS5pbnRlcmNlcHRBZnRlclJlc3BvbnNlID0gZnVuY3Rpb24gKGZuKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaW50ZXJjZXB0KCdhZnRlclJlc3BvbnNlJywgZm4pO1xuICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAgICAgKiBEZXByZWNhdGVkLCBzZWUgaW50ZXJjZXB0b3JzXG4gICAgICAgICAgICAgICAgICogQWRkIGEgY2FsbGJhY2sgdG8gcnVuIG9uIHJlc3BvbnNlLlxuICAgICAgICAgICAgICAgICAqIEBkZXByZWNhdGVkIHNpbmNlIHZlcnNpb24gMS4wLjAsIHVzZSBpbnRlcmNlcHRSZXNwb25zZSBpbnN0ZWFkXG4gICAgICAgICAgICAgICAgICogQHBhcmFtIGZuKHJlc3BvbnNlIGRhdGEsIGNvbnN0cnVjdG9yLCBjb250ZXh0KSAtIHJlc3BvbnNlIGRhdGEgaXMgZWl0aGVyIHRoZSByZXNvdXJjZSBpbnN0YW5jZSByZXR1cm5lZCBvciBhbiBhcnJheSBvZiByZXNvdXJjZSBpbnN0YW5jZXMsXG4gICAgICAgICAgICAgICAgICogICAgICBjb25zdHJ1Y3RvciBpcyB0aGUgcmVzb3VyY2UgY2xhc3MgY2FsbGluZyB0aGUgZnVuY3Rpb24sXG4gICAgICAgICAgICAgICAgICogICAgICBjb250ZXh0IGlzIHRoZSByZXNvdXJjZSBpbnN0YW5jZSBvZiB0aGUgY2FsbGluZyBtZXRob2QgKGNyZWF0ZSwgdXBkYXRlLCBkZWxldGUpIG9yIHVuZGVmaW5lZCBpZiB0aGUgbWV0aG9kIHdhcyBhIGNsYXNzIG1ldGhvZCAoZ2V0LCBxdWVyeSlcbiAgICAgICAgICAgICAgICAgKi9cbiAgICAgICAgICAgICAgICBSYWlsc1Jlc291cmNlLmJlZm9yZVJlc3BvbnNlID0gZnVuY3Rpb24gKGZuKSB7XG4gICAgICAgICAgICAgICAgICAgIGZuID0gUmFpbHNSZXNvdXJjZUluamVjdG9yLmdldERlcGVuZGVuY3koZm4pO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmludGVyY2VwdFJlc3BvbnNlKGZ1bmN0aW9uIChyZXNwb25zZSwgcmVzb3VyY2UsIGNvbnRleHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZuKHJlc3BvbnNlLmRhdGEsIHJlc291cmNlLmNvbmZpZy5yZXNvdXJjZUNvbnN0cnVjdG9yLCBjb250ZXh0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXNwb25zZTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICAgICAqIERlcHJlY2F0ZWQsIHNlZSBpbnRlcmNlcHRvcnNcbiAgICAgICAgICAgICAgICAgKiBBZGQgYSBjYWxsYmFjayB0byBydW4gYWZ0ZXIgcmVzcG9uc2UgaGFzIGJlZW4gcHJvY2Vzc2VkLiAgVGhlc2UgY2FsbGJhY2tzIGFyZSBub3QgY2FsbGVkIG9uIG9iamVjdCBjb25zdHJ1Y3Rpb24uXG4gICAgICAgICAgICAgICAgICogQGRlcHJlY2F0ZWQgc2luY2UgdmVyc2lvbiAxLjAuMCwgdXNlIGludGVyY2VwdEFmdGVyUmVzcG9uc2UgaW5zdGVhZFxuICAgICAgICAgICAgICAgICAqIEBwYXJhbSBmbihyZXNwb25zZSBkYXRhLCBjb25zdHJ1Y3RvcikgLSByZXNwb25zZSBkYXRhIGlzIGVpdGhlciB0aGUgcmVzb3VyY2UgaW5zdGFuY2UgcmV0dXJuZWQgb3IgYW4gYXJyYXkgb2YgcmVzb3VyY2UgaW5zdGFuY2VzIGFuZCBjb25zdHJ1Y3RvciBpcyB0aGUgcmVzb3VyY2UgY2xhc3MgY2FsbGluZyB0aGUgZnVuY3Rpb25cbiAgICAgICAgICAgICAgICAgKi9cbiAgICAgICAgICAgICAgICBSYWlsc1Jlc291cmNlLmFmdGVyUmVzcG9uc2UgPSBmdW5jdGlvbiAoZm4pIHtcbiAgICAgICAgICAgICAgICAgICAgZm4gPSBSYWlsc1Jlc291cmNlSW5qZWN0b3IuZ2V0RGVwZW5kZW5jeShmbik7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaW50ZXJjZXB0QWZ0ZXJSZXNwb25zZShmdW5jdGlvbiAocmVzcG9uc2UsIHJlc291cmNlLCBjb250ZXh0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmbihyZXNwb25zZSwgcmVzb3VyY2UuY29uZmlnLnJlc291cmNlQ29uc3RydWN0b3IsIGNvbnRleHQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3BvbnNlO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgICAgICogRGVwcmVjYXRlZCwgc2VlIGludGVyY2VwdG9yc1xuICAgICAgICAgICAgICAgICAqIEFkZHMgYSBmdW5jdGlvbiB0byBydW4gYWZ0ZXIgc2VyaWFsaXppbmcgdGhlIGRhdGEgdG8gc2VuZCB0byB0aGUgc2VydmVyLCBidXQgYmVmb3JlIHJvb3Qtd3JhcHBpbmcgaXQuXG4gICAgICAgICAgICAgICAgICogQGRlcHJlY2F0ZWQgc2luY2UgdmVyc2lvbiAxLjAuMCwgdXNlIGludGVyY2VwdEJlZm9yZVJlcXVlc3RXcmFwcGluZyBpbnN0ZWFkXG4gICAgICAgICAgICAgICAgICogQHBhcmFtIGZuIChkYXRhLCBjb25zdHJ1Y3RvcikgLSBkYXRhIG9iamVjdCBpcyB0aGUgc2VyaWFsaXplZCByZXNvdXJjZSBpbnN0YW5jZSwgYW5kIGNvbnN0cnVjdG9yIHRoZSByZXNvdXJjZSBjbGFzcyBjYWxsaW5nIHRoZSBmdW5jdGlvblxuICAgICAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgICAgIFJhaWxzUmVzb3VyY2UuYmVmb3JlUmVxdWVzdCA9IGZ1bmN0aW9uIChmbikge1xuICAgICAgICAgICAgICAgICAgICBmbiA9IFJhaWxzUmVzb3VyY2VJbmplY3Rvci5nZXREZXBlbmRlbmN5KGZuKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pbnRlcmNlcHRCZWZvcmVSZXF1ZXN0V3JhcHBpbmcoZnVuY3Rpb24gKGh0dHBDb25maWcsIHJlc291cmNlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBodHRwQ29uZmlnLmRhdGEgPSBmbihodHRwQ29uZmlnLmRhdGEsIHJlc291cmNlLmNvbmZpZy5yZXNvdXJjZUNvbnN0cnVjdG9yKSB8fCBodHRwQ29uZmlnLmRhdGE7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaHR0cENvbmZpZztcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgIFJhaWxzUmVzb3VyY2Uuc2VyaWFsaXplID0gZnVuY3Rpb24gKGh0dHBDb25maWcpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGh0dHBDb25maWcuZGF0YSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaHR0cENvbmZpZy5kYXRhID0gdGhpcy5jb25maWcuc2VyaWFsaXplci5zZXJpYWxpemUoaHR0cENvbmZpZy5kYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBodHRwQ29uZmlnO1xuICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAgICAgKiBEZXNlcmlhbGl6ZXMgdGhlIHJlc3BvbnNlIGRhdGEgb24gdGhlICRodHRwIHJlc3BvbnNlLiAgU3RvcmVzIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoZSBkYXRhXG4gICAgICAgICAgICAgICAgICogb24gdGhlIHJlc3BvbnNlIGFzIFwib3JpZ2luYWxEYXRhXCIgYW5kIHNldHMgdGhlIGRlc2VyaWFsaXplZCBkYXRhIGluIHRoZSBcImRhdGFcIiBwcm9wZXJ0eS5cbiAgICAgICAgICAgICAgICAgKiBAcGFyYW0gcmVzcG9uc2UgVGhlICRodHRwIHJlc3BvbnNlIG9iamVjdFxuICAgICAgICAgICAgICAgICAqIEByZXR1cm5zIHsqfSBUaGUgJGh0dHAgcmVzcG9uc2VcbiAgICAgICAgICAgICAgICAgKi9cbiAgICAgICAgICAgICAgICBSYWlsc1Jlc291cmNlLmRlc2VyaWFsaXplID0gZnVuY3Rpb24gKHJlc3BvbnNlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlLmRhdGEgPSB0aGlzLmNvbmZpZy5zZXJpYWxpemVyLmRlc2VyaWFsaXplKHJlc3BvbnNlLmRhdGEsIHRoaXMuY29uZmlnLnJlc291cmNlQ29uc3RydWN0b3IpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzcG9uc2U7XG4gICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICAgICAqIERlcHJlY2F0ZWQsIHNlZSBpbnRlcmNlcHRvcnNcbiAgICAgICAgICAgICAgICAgKiBUcmFuc2Zvcm0gZGF0YSBhZnRlciByZXNwb25zZSBoYXMgYmVlbiBjb252ZXJ0ZWQgdG8gYSByZXNvdXJjZSBpbnN0YW5jZVxuICAgICAgICAgICAgICAgICAqIEBkZXByZWNhdGVkXG4gICAgICAgICAgICAgICAgICogQHBhcmFtIHByb21pc2VcbiAgICAgICAgICAgICAgICAgKiBAcGFyYW0gY29udGV4dFxuICAgICAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgICAgIFJhaWxzUmVzb3VyY2UuY2FsbFJlc3BvbnNlSW50ZXJjZXB0b3JzID0gZnVuY3Rpb24gKHByb21pc2UsIGNvbnRleHQpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGNvbmZpZyA9IHRoaXMuY29uZmlnO1xuICAgICAgICAgICAgICAgICAgICBmb3JFYWNoRGVwZW5kZW5jeShjb25maWcucmVzcG9uc2VJbnRlcmNlcHRvcnMsIGZ1bmN0aW9uIChpbnRlcmNlcHRvcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgcHJvbWlzZS5yZXNvdXJjZSA9IGNvbmZpZy5yZXNvdXJjZUNvbnN0cnVjdG9yO1xuICAgICAgICAgICAgICAgICAgICAgICAgcHJvbWlzZS5jb250ZXh0ID0gY29udGV4dDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb21pc2UgPSBpbnRlcmNlcHRvcihwcm9taXNlKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBwcm9taXNlO1xuICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAgICAgKiBEZXByZWNhdGVkLCBzZWUgaW50ZXJjZXB0b3JzXG4gICAgICAgICAgICAgICAgICogVHJhbnNmb3JtIGRhdGEgYWZ0ZXIgcmVzcG9uc2UgaGFzIGJlZW4gY29udmVydGVkIHRvIGEgcmVzb3VyY2UgaW5zdGFuY2VcbiAgICAgICAgICAgICAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAgICAgICAgICAgICAqIEBwYXJhbSBwcm9taXNlXG4gICAgICAgICAgICAgICAgICogQHBhcmFtIGNvbnRleHRcbiAgICAgICAgICAgICAgICAgKi9cbiAgICAgICAgICAgICAgICBSYWlsc1Jlc291cmNlLmNhbGxBZnRlclJlc3BvbnNlSW50ZXJjZXB0b3JzID0gZnVuY3Rpb24gKHByb21pc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGNvbmZpZyA9IHRoaXMuY29uZmlnO1xuICAgICAgICAgICAgICAgICAgICAvLyBkYXRhIGlzIG5vdyBkZXNlcmlhbGl6ZWQuIGNhbGwgcmVzcG9uc2UgaW50ZXJjZXB0b3JzIGluY2x1ZGluZyBhZnRlclJlc3BvbnNlXG4gICAgICAgICAgICAgICAgICAgIGZvckVhY2hEZXBlbmRlbmN5KGNvbmZpZy5hZnRlclJlc3BvbnNlSW50ZXJjZXB0b3JzLCBmdW5jdGlvbiAoaW50ZXJjZXB0b3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb21pc2UucmVzb3VyY2UgPSBjb25maWcucmVzb3VyY2VDb25zdHJ1Y3RvcjtcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb21pc2UgPSBpbnRlcmNlcHRvcihwcm9taXNlKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHByb21pc2U7XG4gICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgIFJhaWxzUmVzb3VyY2UucnVuSW50ZXJjZXB0b3JQaGFzZSA9IGZ1bmN0aW9uIChwaGFzZSwgY29udGV4dCwgcHJvbWlzZSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgY29uZmlnID0gdGhpcy5jb25maWcsIGNoYWluID0gW107XG5cbiAgICAgICAgICAgICAgICAgICAgZm9yRWFjaERlcGVuZGVuY3koY29uZmlnLmludGVyY2VwdG9ycywgZnVuY3Rpb24gKGludGVyY2VwdG9yKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW50ZXJjZXB0b3JbcGhhc2VdIHx8IGludGVyY2VwdG9yW3BoYXNlICsgJ0Vycm9yJ10pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFpbi5wdXNoKGludGVyY2VwdG9yW3BoYXNlXSwgaW50ZXJjZXB0b3JbcGhhc2UgKyAnRXJyb3InXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgIHdoaWxlIChjaGFpbi5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0aGVuRm4gPSBjaGFpbi5zaGlmdCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHJlamVjdEZuID0gY2hhaW4uc2hpZnQoKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgcHJvbWlzZSA9IHByb21pc2UudGhlbihjcmVhdGVJbnRlcmNlcHRvclN1Y2Nlc3NDYWxsYmFjayh0aGVuRm4sIGNvbmZpZy5yZXNvdXJjZUNvbnN0cnVjdG9yLCBjb250ZXh0KSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGVJbnRlcmNlcHRvclJlamVjdGlvbkNhbGxiYWNrKHJlamVjdEZuLCBjb25maWcucmVzb3VyY2VDb25zdHJ1Y3RvciwgY29udGV4dCkpO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHByb21pc2U7XG4gICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICAgICAqIEV4ZWN1dGVzIGFuIEhUVFAgcmVxdWVzdCB1c2luZyAkaHR0cC5cbiAgICAgICAgICAgICAgICAgKlxuICAgICAgICAgICAgICAgICAqIFRoaXMgbWV0aG9kIGlzIHVzZWQgYnkgYWxsIFJhaWxzUmVzb3VyY2Ugb3BlcmF0aW9ucyB0aGF0IGV4ZWN1dGUgSFRUUCByZXF1ZXN0cy4gIEhhbmRsZXMgc2VyaWFsaXppbmdcbiAgICAgICAgICAgICAgICAgKiB0aGUgcmVxdWVzdCBkYXRhIHVzaW5nIHRoZSByZXNvdXJjZSBzZXJpYWxpemVyLCByb290IHdyYXBwaW5nIChpZiBlbmFibGVkKSwgZGVzZXJpYWxpemluZyB0aGUgcmVzcG9uc2VcbiAgICAgICAgICAgICAgICAgKiBkYXRhIHVzaW5nIHRoZSByZXNvdXJjZSBzZXJpYWxpemVyLCByb290IHVud3JhcHBpbmcgKGlmIGVuYWJsZWQpLCBhbmQgY29weWluZyB0aGUgcmVzdWx0IGJhY2sgaW50byB0aGVcbiAgICAgICAgICAgICAgICAgKiByZXNvdXJjZSBjb250ZXh0IGlmIGFwcGxpY2FibGUuICBFeGVjdXRlcyBpbnRlcmNlcHRvcnMgYXQgZWFjaCBwaGFzZSBvZiB0aGUgcmVxdWVzdCAvIHJlc3BvbnNlIHRvIGFsbG93XG4gICAgICAgICAgICAgICAgICogdXNlcnMgdG8gYnVpbGQgc3luY2hyb25vdXMgJiBhc3luY2hyb25vdXMgY3VzdG9taXphdGlvbnMgdG8gbWFuaXB1bGF0ZSB0aGUgZGF0YSBhcyBuZWNlc3NhcnkuXG4gICAgICAgICAgICAgICAgICpcbiAgICAgICAgICAgICAgICAgKiBAcGFyYW0gaHR0cENvbmZpZyBUaGUgY29uZmlnIHRvIHBhc3MgdG8gJGh0dHAsIHNlZSAkaHR0cCBkb2NzIGZvciBkZXRhaWxzXG4gICAgICAgICAgICAgICAgICogQHBhcmFtIGNvbnRleHQgQW4gb3B0aW9uYWwgcmVmZXJlbmNlIHRvIHRoZSByZXNvdXJjZSBpbnN0YW5jZSB0aGF0IGlzIHRoZSBjb250ZXh0IGZvciB0aGUgb3BlcmF0aW9uLlxuICAgICAgICAgICAgICAgICAqICAgICAgSWYgc3BlY2lmaWVkLCB0aGUgcmVzdWx0IGRhdGEgd2lsbCBiZSBjb3BpZWQgaW50byB0aGUgY29udGV4dCBkdXJpbmcgdGhlIHJlc3BvbnNlIGhhbmRsaW5nLlxuICAgICAgICAgICAgICAgICAqIEBwYXJhbSByZXNvdXJjZUNvbmZpZ092ZXJyaWRlcyBBbiBvcHRpb25hbCBzZXQgb2YgUmFpbHNSZXNvdXJjZSBjb25maWd1cmF0aW9uIG9wdGlvbnMgb3ZlcnJpZGVzLlxuICAgICAgICAgICAgICAgICAqICAgICAgVGhlc2Ugb3ZlcnJpZGVzIGFsbG93IHVzZXJzIHRvIGJ1aWxkIGN1c3RvbSBvcGVyYXRpb25zIG1vcmUgZWFzaWx5IHdpdGggZGlmZmVyZW50IHJlc291cmNlIHNldHRpbmdzLlxuICAgICAgICAgICAgICAgICAqIEByZXR1cm5zIHtQcm9taXNlfSBUaGUgcHJvbWlzZSB0aGF0IHdpbGwgZXZlbnR1YWxseSBiZSByZXNvbHZlZCBhZnRlciBhbGwgcmVxdWVzdCAvIHJlc3BvbnNlIGhhbmRsaW5nXG4gICAgICAgICAgICAgICAgICogICAgICBoYXMgY29tcGxldGVkLlxuICAgICAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgICAgIFJhaWxzUmVzb3VyY2UuJGh0dHAgPSBmdW5jdGlvbiAoaHR0cENvbmZpZywgY29udGV4dCwgcmVzb3VyY2VDb25maWdPdmVycmlkZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGNvbmZpZyA9IGFuZ3VsYXIuZXh0ZW5kKGFuZ3VsYXIuY29weSh0aGlzLmNvbmZpZyksIHJlc291cmNlQ29uZmlnT3ZlcnJpZGVzIHx8IHt9KSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc291cmNlQ29uc3RydWN0b3IgPSBjb25maWcucmVzb3VyY2VDb25zdHJ1Y3RvcixcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb21pc2UgPSAkcS53aGVuKGh0dHBDb25maWcpO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmICghY29uZmlnLnNraXBSZXF1ZXN0UHJvY2Vzc2luZykge1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBwcm9taXNlID0gdGhpcy5ydW5JbnRlcmNlcHRvclBoYXNlKCdiZWZvcmVSZXF1ZXN0JywgY29udGV4dCwgcHJvbWlzZSkudGhlbihmdW5jdGlvbiAoaHR0cENvbmZpZykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGh0dHBDb25maWcgPSByZXNvdXJjZUNvbnN0cnVjdG9yLnNlcmlhbGl6ZShodHRwQ29uZmlnKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvckVhY2hEZXBlbmRlbmN5KGNvbmZpZy5yZXF1ZXN0VHJhbnNmb3JtZXJzLCBmdW5jdGlvbiAodHJhbnNmb3JtZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHR0cENvbmZpZy5kYXRhID0gdHJhbnNmb3JtZXIoaHR0cENvbmZpZy5kYXRhLCBjb25maWcucmVzb3VyY2VDb25zdHJ1Y3Rvcik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaHR0cENvbmZpZztcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBwcm9taXNlID0gdGhpcy5ydW5JbnRlcmNlcHRvclBoYXNlKCdiZWZvcmVSZXF1ZXN0V3JhcHBpbmcnLCBjb250ZXh0LCBwcm9taXNlKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbmZpZy5yb290V3JhcHBpbmcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9taXNlID0gcHJvbWlzZS50aGVuKGZ1bmN0aW9uIChodHRwQ29uZmlnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGh0dHBDb25maWcuZGF0YSA9IHJhaWxzUm9vdFdyYXBwZXIud3JhcChodHRwQ29uZmlnLmRhdGEsIGNvbmZpZy5yZXNvdXJjZUNvbnN0cnVjdG9yKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGh0dHBDb25maWc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHByb21pc2UgPSB0aGlzLnJ1bkludGVyY2VwdG9yUGhhc2UoJ3JlcXVlc3QnLCBjb250ZXh0LCBwcm9taXNlKS50aGVuKGZ1bmN0aW9uIChodHRwQ29uZmlnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICRodHRwKGh0dHBDb25maWcpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcblxuICAgICAgICAgICAgICAgICAgICAgICAgcHJvbWlzZSA9ICRodHRwKGh0dHBDb25maWcpO1xuXG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBwcm9taXNlID0gdGhpcy5ydW5JbnRlcmNlcHRvclBoYXNlKCdiZWZvcmVSZXNwb25zZScsIGNvbnRleHQsIHByb21pc2UpLnRoZW4oZnVuY3Rpb24gKHJlc3BvbnNlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgLy8gc3RvcmUgb2ZmIHRoZSBkYXRhIHNvIHdlIGRvbid0IGxvc2UgYWNjZXNzIHRvIGl0IGFmdGVyIGRlc2VyaWFsaXppbmcgYW5kIHVud3JhcHBpbmdcbiAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZS5vcmlnaW5hbERhdGEgPSByZXNwb25zZS5kYXRhO1xuICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXNwb25zZTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKGNvbmZpZy5yb290V3JhcHBpbmcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb21pc2UgPSBwcm9taXNlLnRoZW4oZnVuY3Rpb24gKHJlc3BvbnNlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJhaWxzUm9vdFdyYXBwZXIudW53cmFwKHJlc3BvbnNlLCBjb25maWcucmVzb3VyY2VDb25zdHJ1Y3RvciwgZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBwcm9taXNlID0gdGhpcy5ydW5JbnRlcmNlcHRvclBoYXNlKCdiZWZvcmVSZXNwb25zZURlc2VyaWFsaXplJywgY29udGV4dCwgcHJvbWlzZSkudGhlbihmdW5jdGlvbiAocmVzcG9uc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXNvdXJjZUNvbnN0cnVjdG9yLmRlc2VyaWFsaXplKHJlc3BvbnNlKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgcHJvbWlzZSA9IHRoaXMuY2FsbFJlc3BvbnNlSW50ZXJjZXB0b3JzKHByb21pc2UsIGNvbnRleHQpO1xuICAgICAgICAgICAgICAgICAgICBwcm9taXNlID0gdGhpcy5ydW5JbnRlcmNlcHRvclBoYXNlKCdyZXNwb25zZScsIGNvbnRleHQsIHByb21pc2UpLnRoZW4oZnVuY3Rpb24gKHJlc3BvbnNlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29udGV4dCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdlIG1heSBub3QgaGF2ZSByZXNwb25zZSBkYXRhXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlLmhhc093blByb3BlcnR5KCdkYXRhJykgJiYgYW5ndWxhci5pc09iamVjdChyZXNwb25zZS5kYXRhKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmd1bGFyLmV4dGVuZChjb250ZXh0LCByZXNwb25zZS5kYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjb25maWcuZnVsbFJlc3BvbnNlID8gcmVzcG9uc2UgOiAoY29udGV4dCB8fCByZXNwb25zZS5kYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgcHJvbWlzZSA9IHRoaXMuY2FsbEFmdGVyUmVzcG9uc2VJbnRlcmNlcHRvcnMocHJvbWlzZSwgY29udGV4dCk7XG4gICAgICAgICAgICAgICAgICAgIHByb21pc2UgPSB0aGlzLnJ1bkludGVyY2VwdG9yUGhhc2UoJ2FmdGVyUmVzcG9uc2UnLCBjb250ZXh0LCBwcm9taXNlKTtcbiAgICAgICAgICAgICAgICAgICAgcHJvbWlzZS5yZXNvdXJjZSA9IGNvbmZpZy5yZXNvdXJjZUNvbnN0cnVjdG9yO1xuICAgICAgICAgICAgICAgICAgICBwcm9taXNlLmNvbnRleHQgPSBjb250ZXh0O1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcHJvbWlzZTtcbiAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgICAgICogUHJvY2Vzc2VzIHF1ZXJ5IHBhcmFtZXRlcnMgYmVmb3JlIHJlcXVlc3QuICBZb3UgY2FuIG92ZXJyaWRlIHRvIG1vZGlmeVxuICAgICAgICAgICAgICAgICAqIHRoZSBxdWVyeSBwYXJhbXMgb3IgcmV0dXJuIGEgbmV3IG9iamVjdC5cbiAgICAgICAgICAgICAgICAgKlxuICAgICAgICAgICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBxdWVyeVBhcmFtcyAtIFRoZSBxdWVyeSBwYXJhbWV0ZXJzIGZvciB0aGUgcmVxdWVzdFxuICAgICAgICAgICAgICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFRoZSBxdWVyeSBwYXJhbWV0ZXJzIGZvciB0aGUgcmVxdWVzdFxuICAgICAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgICAgIFJhaWxzUmVzb3VyY2UucHJvY2Vzc1BhcmFtZXRlcnMgPSBmdW5jdGlvbiAocXVlcnlQYXJhbXMpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIG5ld1BhcmFtcyA9IHt9O1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChhbmd1bGFyLmlzT2JqZWN0KHF1ZXJ5UGFyYW1zKSAmJiB0aGlzLmNvbmZpZy51bmRlcnNjb3JlUGFyYW1zKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhbmd1bGFyLmZvckVhY2gocXVlcnlQYXJhbXMsIGZ1bmN0aW9uICh2LCBrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3UGFyYW1zW3RoaXMuY29uZmlnLnNlcmlhbGl6ZXIudW5kZXJzY29yZShrKV0gPSB2O1xuICAgICAgICAgICAgICAgICAgICAgICAgfSwgdGhpcyk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXdQYXJhbXM7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcXVlcnlQYXJhbXM7XG4gICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgIFJhaWxzUmVzb3VyY2UuZ2V0UGFyYW1ldGVycyA9IGZ1bmN0aW9uIChxdWVyeVBhcmFtcykge1xuICAgICAgICAgICAgICAgICAgICB2YXIgcGFyYW1zO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmNvbmZpZy5kZWZhdWx0UGFyYW1zKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB3ZSBuZWVkIHRvIGNsb25lIGl0IHNvIHdlIGRvbid0IG1vZGlmeSBpdCB3aGVuIHdlIGFkZCB0aGUgYWRkaXRpb25hbFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcXVlcnkgcGFyYW1zIGJlbG93XG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXMgPSBhbmd1bGFyLmNvcHkodGhpcy5jb25maWcuZGVmYXVsdFBhcmFtcyk7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBpZiAoYW5ndWxhci5pc09iamVjdChxdWVyeVBhcmFtcykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtcyA9IGFuZ3VsYXIuZXh0ZW5kKHBhcmFtcyB8fCB7fSwgcXVlcnlQYXJhbXMpO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucHJvY2Vzc1BhcmFtZXRlcnMocGFyYW1zKTtcbiAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgUmFpbHNSZXNvdXJjZS5nZXRIdHRwQ29uZmlnID0gZnVuY3Rpb24gKHF1ZXJ5UGFyYW1zKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBwYXJhbXMgPSB0aGlzLmdldFBhcmFtZXRlcnMocXVlcnlQYXJhbXMpO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChwYXJhbXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhbmd1bGFyLmV4dGVuZCh7cGFyYW1zOiBwYXJhbXN9LCB0aGlzLmNvbmZpZy5odHRwQ29uZmlnKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBhbmd1bGFyLmNvcHkodGhpcy5jb25maWcuaHR0cENvbmZpZyk7XG4gICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICAgICAqIFJldHVybnMgYSBVUkwgZnJvbSB0aGUgZ2l2ZW4gcGFyYW1ldGVycy4gIFlvdSBjYW4gb3ZlcnJpZGUgdGhpcyBtZXRob2Qgb24geW91ciByZXNvdXJjZSBkZWZpbml0aW9ucyB0byBwcm92aWRlXG4gICAgICAgICAgICAgICAgICogY3VzdG9tIGxvZ2ljIGZvciBidWlsZGluZyB5b3VyIFVSTHMgb3IgeW91IGNhbiB1dGlsaXplIHRoZSBwYXJhbWV0ZXJpemVkIHVybCBzdHJpbmdzIHRvIHN1YnN0aXR1dGUgdmFsdWVzIGluIHRoZVxuICAgICAgICAgICAgICAgICAqIFVSTCBzdHJpbmcuXG4gICAgICAgICAgICAgICAgICpcbiAgICAgICAgICAgICAgICAgKiBUaGUgcGFyYW1ldGVycyBpbiB0aGUgVVJMIHN0cmluZyBmb2xsb3cgdGhlIG5vcm1hbCBBbmd1bGFyIGJpbmRpbmcgZXhwcmVzc2lvbiB1c2luZyB7eyBhbmQgfX0gZm9yIHRoZSBzdGFydC9lbmQgc3ltYm9scy5cbiAgICAgICAgICAgICAgICAgKlxuICAgICAgICAgICAgICAgICAqIElmIHRoZSBjb250ZXh0IGlzIGEgbnVtYmVyIGFuZCB0aGUgVVJMIHN0cmluZyBkb2VzIG5vdCBjb250YWluIGFuIGlkIHBhcmFtZXRlciB0aGVuIHRoZSBudW1iZXIgaXMgYXBwZW5kZWRcbiAgICAgICAgICAgICAgICAgKiB0byB0aGUgVVJMIHN0cmluZy5cbiAgICAgICAgICAgICAgICAgKlxuICAgICAgICAgICAgICAgICAqIElmIHRoZSBjb250ZXh0IGlzIGEgbnVtYmVyIGFuZCB0aGUgVVJMIHN0cmluZyBkb2VzXG4gICAgICAgICAgICAgICAgICogQHBhcmFtIGNvbnRleHRcbiAgICAgICAgICAgICAgICAgKiBAcGFyYW0gcGF0aCB7c3RyaW5nfSAob3B0aW9uYWwpIEFuIGFkZGl0aW9uYWwgcGF0aCB0byBhcHBlbmQgdG8gdGhlIFVSTFxuICAgICAgICAgICAgICAgICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICAgICAgICAgICAgICAgKi9cbiAgICAgICAgICAgICAgICBSYWlsc1Jlc291cmNlLiR1cmwgPSBSYWlsc1Jlc291cmNlLnJlc291cmNlVXJsID0gZnVuY3Rpb24gKGNvbnRleHQsIHBhdGgpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFhbmd1bGFyLmlzT2JqZWN0KGNvbnRleHQpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0ID0ge2lkOiBjb250ZXh0fTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBhcHBlbmRQYXRoKHRoaXMuYnVpbGRVcmwoY29udGV4dCB8fCB7fSksIHBhdGgpO1xuICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICBSYWlsc1Jlc291cmNlLiRnZXQgPSBmdW5jdGlvbiAodXJsLCBxdWVyeVBhcmFtcykge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy4kaHR0cChhbmd1bGFyLmV4dGVuZCh7bWV0aG9kOiAnZ2V0JywgdXJsOiB1cmx9LCB0aGlzLmdldEh0dHBDb25maWcocXVlcnlQYXJhbXMpKSk7XG4gICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgIFJhaWxzUmVzb3VyY2UucXVlcnkgPSBmdW5jdGlvbiAocXVlcnlQYXJhbXMsIGNvbnRleHQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuJGdldCh0aGlzLnJlc291cmNlVXJsKGNvbnRleHQpLCBxdWVyeVBhcmFtcyk7XG4gICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgIFJhaWxzUmVzb3VyY2UuZ2V0ID0gZnVuY3Rpb24gKGNvbnRleHQsIHF1ZXJ5UGFyYW1zKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLiRnZXQodGhpcy5yZXNvdXJjZVVybChjb250ZXh0KSwgcXVlcnlQYXJhbXMpO1xuICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAgICAgKiBSZXR1cm5zIHRoZSBVUkwgZm9yIHRoaXMgcmVzb3VyY2UuXG4gICAgICAgICAgICAgICAgICpcbiAgICAgICAgICAgICAgICAgKiBAcGFyYW0gcGF0aCB7c3RyaW5nfSAob3B0aW9uYWwpIEFuIGFkZGl0aW9uYWwgcGF0aCB0byBhcHBlbmQgdG8gdGhlIFVSTFxuICAgICAgICAgICAgICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFRoZSBVUkwgZm9yIHRoZSByZXNvdXJjZVxuICAgICAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgICAgIFJhaWxzUmVzb3VyY2UucHJvdG90eXBlLiR1cmwgPSBmdW5jdGlvbiAocGF0aCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXBwZW5kUGF0aCh0aGlzLmNvbnN0cnVjdG9yLnJlc291cmNlVXJsKHRoaXMpLCBwYXRoKTtcbiAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgICAgICogRXhlY3V0ZXMgJGh0dHAgd2l0aCB0aGUgcmVzb3VyY2UgaW5zdGFuY2UgYXMgdGhlIGNvbnRleHQuXG4gICAgICAgICAgICAgICAgICpcbiAgICAgICAgICAgICAgICAgKiBAcGFyYW0gaHR0cENvbmZpZyBUaGUgY29uZmlnIHRvIHBhc3MgdG8gJGh0dHAsIHNlZSAkaHR0cCBkb2NzIGZvciBkZXRhaWxzXG4gICAgICAgICAgICAgICAgICogQHBhcmFtIGNvbnRleHQgQW4gb3B0aW9uYWwgcmVmZXJlbmNlIHRvIHRoZSByZXNvdXJjZSBpbnN0YW5jZSB0aGF0IGlzIHRoZSBjb250ZXh0IGZvciB0aGUgb3BlcmF0aW9uLlxuICAgICAgICAgICAgICAgICAqICAgICAgSWYgc3BlY2lmaWVkLCB0aGUgcmVzdWx0IGRhdGEgd2lsbCBiZSBjb3BpZWQgaW50byB0aGUgY29udGV4dCBkdXJpbmcgdGhlIHJlc3BvbnNlIGhhbmRsaW5nLlxuICAgICAgICAgICAgICAgICAqIEBwYXJhbSByZXNvdXJjZUNvbmZpZ092ZXJyaWRlcyBBbiBvcHRpb25hbCBzZXQgb2YgUmFpbHNSZXNvdXJjZSBjb25maWd1cmF0aW9uIG9wdGlvbnMgb3ZlcnJpZGVzLlxuICAgICAgICAgICAgICAgICAqICAgICAgVGhlc2Ugb3ZlcnJpZGVzIGFsbG93IHVzZXJzIHRvIGJ1aWxkIGN1c3RvbSBvcGVyYXRpb25zIG1vcmUgZWFzaWx5IHdpdGggZGlmZmVyZW50IHJlc291cmNlIHNldHRpbmdzLlxuICAgICAgICAgICAgICAgICAqIEByZXR1cm5zIHtQcm9taXNlfSBUaGUgcHJvbWlzZSB0aGF0IHdpbGwgZXZlbnR1YWxseSBiZSByZXNvbHZlZCBhZnRlciBhbGwgcmVxdWVzdCAvIHJlc3BvbnNlIGhhbmRsaW5nXG4gICAgICAgICAgICAgICAgICogICAgICBoYXMgY29tcGxldGVkLlxuICAgICAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgICAgIFJhaWxzUmVzb3VyY2UucHJvdG90eXBlLiRodHRwID0gZnVuY3Rpb24gKGh0dHBDb25maWcsIHJlc291cmNlQ29uZmlnT3ZlcnJpZGVzKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbnN0cnVjdG9yLiRodHRwKGh0dHBDb25maWcsIHRoaXMsIHJlc291cmNlQ29uZmlnT3ZlcnJpZGVzKTtcbiAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgYW5ndWxhci5mb3JFYWNoKFsncG9zdCcsICdwdXQnLCAncGF0Y2gnXSwgZnVuY3Rpb24gKG1ldGhvZCkge1xuICAgICAgICAgICAgICAgICAgICBSYWlsc1Jlc291cmNlWyckJyArIG1ldGhvZF0gPSBmdW5jdGlvbiAodXJsLCBkYXRhLCByZXNvdXJjZUNvbmZpZ092ZXJyaWRlcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2xvbmUgc28gd2UgY2FuIG1hbmlwdWxhdGUgdy9vIG1vZGlmeWluZyB0aGUgYWN0dWFsIGluc3RhbmNlXG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gYW5ndWxhci5jb3B5KGRhdGEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuJGh0dHAoYW5ndWxhci5leHRlbmQoe21ldGhvZDogbWV0aG9kLCB1cmw6IHVybCwgZGF0YTogZGF0YX0sIHRoaXMuZ2V0SHR0cENvbmZpZygpKSwgbnVsbCwgcmVzb3VyY2VDb25maWdPdmVycmlkZXMpO1xuICAgICAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgICAgIFJhaWxzUmVzb3VyY2UucHJvdG90eXBlWyckJyArIG1ldGhvZF0gPSBmdW5jdGlvbiAodXJsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBjbG9uZSBzbyB3ZSBjYW4gbWFuaXB1bGF0ZSB3L28gbW9kaWZ5aW5nIHRoZSBhY3R1YWwgaW5zdGFuY2VcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBkYXRhID0gYW5ndWxhci5jb3B5KHRoaXMsIHt9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbnN0cnVjdG9yLiRodHRwKGFuZ3VsYXIuZXh0ZW5kKHttZXRob2Q6IG1ldGhvZCwgdXJsOiB1cmwsIGRhdGE6IGRhdGF9LCB0aGlzLmNvbnN0cnVjdG9yLmdldEh0dHBDb25maWcoKSksIHRoaXMpO1xuXG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICBSYWlsc1Jlc291cmNlLnByb3RvdHlwZS5jcmVhdGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLiRwb3N0KHRoaXMuJHVybCgpLCB0aGlzKTtcbiAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgUmFpbHNSZXNvdXJjZS5wcm90b3R5cGUudXBkYXRlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpc1snJCcgKyB0aGlzLmNvbnN0cnVjdG9yLmNvbmZpZy51cGRhdGVNZXRob2RdKHRoaXMuJHVybCgpLCB0aGlzKTtcbiAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgUmFpbHNSZXNvdXJjZS5wcm90b3R5cGUuZ2V0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5jb25zdHJ1Y3Rvci4kaHR0cChhbmd1bGFyLmV4dGVuZCh7bWV0aG9kOiAnR0VUJywgdXJsOiB0aGlzLiR1cmwoKX0sIHRoaXMuY29uc3RydWN0b3IuZ2V0SHR0cENvbmZpZygpKSwgdGhpcyk7XG4gICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgIFJhaWxzUmVzb3VyY2UucHJvdG90eXBlLmlzTmV3ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgaWRBdHRyaWJ1dGUgPSB0aGlzLmNvbnN0cnVjdG9yLmNvbmZpZy5pZEF0dHJpYnV0ZTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFuZ3VsYXIuaXNVbmRlZmluZWQodGhpc1tpZEF0dHJpYnV0ZV0pIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzW2lkQXR0cmlidXRlXSA9PT0gbnVsbDtcbiAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgUmFpbHNSZXNvdXJjZS5wcm90b3R5cGUuc2F2ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuaXNOZXcoKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlKCk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy51cGRhdGUoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICBSYWlsc1Jlc291cmNlLiRkZWxldGUgPSBmdW5jdGlvbiAodXJsLCBxdWVyeVBhcmFtcykge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy4kaHR0cChhbmd1bGFyLmV4dGVuZCh7bWV0aG9kOiAnZGVsZXRlJywgdXJsOiB1cmx9LCB0aGlzLmdldEh0dHBDb25maWcocXVlcnlQYXJhbXMpKSk7XG4gICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgIFJhaWxzUmVzb3VyY2UucHJvdG90eXBlLiRkZWxldGUgPSBmdW5jdGlvbiAodXJsLCBxdWVyeVBhcmFtcykge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5jb25zdHJ1Y3Rvci4kaHR0cChhbmd1bGFyLmV4dGVuZCh7bWV0aG9kOiAnZGVsZXRlJywgdXJsOiB1cmx9LCB0aGlzLmNvbnN0cnVjdG9yLmdldEh0dHBDb25maWcocXVlcnlQYXJhbXMpKSwgdGhpcyk7XG4gICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgIC8vdXNpbmcgWydkZWxldGUnXSBpbnN0ZWFkIG9mIC5kZWxldGUgZm9yIElFNy84IGNvbXBhdGliaWxpdHlcbiAgICAgICAgICAgICAgICBSYWlsc1Jlc291cmNlLnByb3RvdHlwZS5yZW1vdmUgPSBSYWlsc1Jlc291cmNlLnByb3RvdHlwZVsnZGVsZXRlJ10gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLiRkZWxldGUodGhpcy4kdXJsKCkpO1xuICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gUmFpbHNSZXNvdXJjZTtcblxuICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGFwcGVuZFBhdGgodXJsLCBwYXRoKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChwYXRoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocGF0aFswXSAhPT0gJy8nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXJsICs9ICcvJztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgdXJsICs9IHBhdGg7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdXJsO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGZvckVhY2hEZXBlbmRlbmN5KGxpc3QsIGNhbGxiYWNrKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBkZXBlbmRlbmN5O1xuXG4gICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwLCBsZW4gPSBsaXN0Lmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkZXBlbmRlbmN5ID0gbGlzdFtpXTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFuZ3VsYXIuaXNTdHJpbmcoZGVwZW5kZW5jeSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXBlbmRlbmN5ID0gbGlzdFtpXSA9IFJhaWxzUmVzb3VyY2VJbmplY3Rvci5nZXREZXBlbmRlbmN5KGRlcGVuZGVuY3kpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhkZXBlbmRlbmN5KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGFkZE1peGluKFJlc291cmNlLCBkZXN0aW5hdGlvbiwgbWl4aW4sIGNhbGxiYWNrKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBleGNsdWRlZEtleXMgPSBbJ2luY2x1ZGVkJywgJ2V4dGVuZGVkLCcsICdjb25maWd1cmUnXTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoIVJlc291cmNlLiRtaXhpbnMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIFJlc291cmNlLiRtaXhpbnMgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGlmIChhbmd1bGFyLmlzU3RyaW5nKG1peGluKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbWl4aW4gPSBSYWlsc1Jlc291cmNlSW5qZWN0b3IuZ2V0RGVwZW5kZW5jeShtaXhpbik7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBpZiAobWl4aW4gJiYgUmVzb3VyY2UuJG1peGlucy5pbmRleE9mKG1peGluKSA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFuZ3VsYXIuZm9yRWFjaChtaXhpbiwgZnVuY3Rpb24gKHZhbHVlLCBrZXkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXhjbHVkZWRLZXlzLmluZGV4T2Yoa2V5KSA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdGluYXRpb25ba2V5XSA9IHZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBSZXNvdXJjZS4kbWl4aW5zLnB1c2gobWl4aW4pO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYW5ndWxhci5pc0Z1bmN0aW9uKGNhbGxiYWNrKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKFJlc291cmNlLCBtaXhpbik7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBmdW5jdGlvbiBsb2FkRXh0ZW5zaW9ucyhleHRlbnNpb25zKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBtb2R1bGVzID0gW107XG5cbiAgICAgICAgICAgICAgICAgICAgYW5ndWxhci5mb3JFYWNoKGV4dGVuc2lvbnMsIGZ1bmN0aW9uIChleHRlbnNpb25OYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBleHRlbnNpb25OYW1lID0gJ1JhaWxzUmVzb3VyY2UnICsgZXh0ZW5zaW9uTmFtZS5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIGV4dGVuc2lvbk5hbWUuc2xpY2UoMSkgKyAnTWl4aW4nO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVzLnB1c2goUmFpbHNSZXNvdXJjZUluamVjdG9yLmdldERlcGVuZGVuY3koZXh0ZW5zaW9uTmFtZSkpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbW9kdWxlcztcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBmdW5jdGlvbiBib29sZWFuUGFyYW0odmFsdWUsIGRlZmF1bHRWYWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYW5ndWxhci5pc1VuZGVmaW5lZCh2YWx1ZSkgPyBkZWZhdWx0VmFsdWUgOiB2YWx1ZTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBmdW5jdGlvbiBjcmVhdGVJbnRlcmNlcHRvclN1Y2Nlc3NDYWxsYmFjayh0aGVuRm4sIHJlc291cmNlQ29uc3RydWN0b3IsIGNvbnRleHQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKHRoZW5GbiB8fCBhbmd1bGFyLmlkZW50aXR5KShkYXRhLCByZXNvdXJjZUNvbnN0cnVjdG9yLCBjb250ZXh0KTtcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBmdW5jdGlvbiBjcmVhdGVJbnRlcmNlcHRvclJlamVjdGlvbkNhbGxiYWNrKHJlamVjdEZuLCByZXNvdXJjZUNvbnN0cnVjdG9yLCBjb250ZXh0KSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAocmVqZWN0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBjYW4ndCB1c2UgaWRlbnRpdHkgYmVjYXVzZSB3ZSBuZWVkIHRvIHJldHVybiBhIHJlamVjdGVkIHByb21pc2UgdG8ga2VlcCB0aGUgZXJyb3IgY2hhaW4gZ29pbmdcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZWplY3RGbiA/IHJlamVjdEZuKHJlamVjdGlvbiwgcmVzb3VyY2VDb25zdHJ1Y3RvciwgY29udGV4dCkgOiAkcS5yZWplY3QocmVqZWN0aW9uKTtcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XTtcbiAgICB9KTtcblxuICAgIGFuZ3VsYXIubW9kdWxlKCdyYWlscycpLmZhY3RvcnkoJ3JhaWxzUmVzb3VyY2VGYWN0b3J5JywgWydSYWlsc1Jlc291cmNlJywgZnVuY3Rpb24gKFJhaWxzUmVzb3VyY2UpIHtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChjb25maWcpIHtcbiAgICAgICAgICAgIGZ1bmN0aW9uIFJlc291cmNlKCkge1xuICAgICAgICAgICAgICAgIFJlc291cmNlLl9fc3VwZXJfXy5jb25zdHJ1Y3Rvci5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBSYWlsc1Jlc291cmNlLmV4dGVuZFRvKFJlc291cmNlKTtcbiAgICAgICAgICAgIFJlc291cmNlLmNvbmZpZ3VyZShjb25maWcpO1xuXG4gICAgICAgICAgICByZXR1cm4gUmVzb3VyY2U7XG4gICAgICAgIH07XG4gICAgfV0pO1xuXG59KCkpO1xuXG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL2Jvd2VyX2NvbXBvbmVudHMvYW5ndWxhcmpzLXJhaWxzLXJlc291cmNlL2FuZ3VsYXJqcy1yYWlscy1yZXNvdXJjZS5qc1xuICoqIG1vZHVsZSBpZCA9IDU4XG4gKiogbW9kdWxlIGNodW5rcyA9IDI0XG4gKiovIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==");

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

	eval("!function(window,angular,undefined){\"use strict\";angular.module(\"angulartics.google.analytics\",[\"angulartics\"]).config([\"$analyticsProvider\",function($analyticsProvider){$analyticsProvider.settings.pageTracking.trackRelativePath=!0,$analyticsProvider.settings.ga={additionalAccountNames:undefined,userId:null},$analyticsProvider.registerPageTrack(function(path){window._gaq&&(_gaq.push([\"_trackPageview\",path]),angular.forEach($analyticsProvider.settings.ga.additionalAccountNames,function(accountName){_gaq.push([accountName+\"._trackPageview\",path])})),window.ga&&($analyticsProvider.settings.ga.userId&&ga(\"set\",\"&uid\",$analyticsProvider.settings.ga.userId),ga(\"send\",\"pageview\",path),angular.forEach($analyticsProvider.settings.ga.additionalAccountNames,function(accountName){ga(accountName+\".send\",\"pageview\",path)}))}),$analyticsProvider.registerEventTrack(function(action,properties){if(properties&&properties.category||(properties=properties||{},properties.category=\"Event\"),properties.value){var parsed=parseInt(properties.value,10);properties.value=isNaN(parsed)?0:parsed}if(window.ga){for(var eventOptions={eventCategory:properties.category,eventAction:action,eventLabel:properties.label,eventValue:properties.value,nonInteraction:properties.noninteraction,page:properties.page||window.location.hash.substring(1)||window.location.pathname,userId:$analyticsProvider.settings.ga.userId},idx=1;20>=idx;idx++)properties[\"dimension\"+idx.toString()]&&(eventOptions[\"dimension\"+idx.toString()]=properties[\"dimension\"+idx.toString()]),properties[\"metric\"+idx.toString()]&&(eventOptions[\"metric\"+idx.toString()]=properties[\"metric\"+idx.toString()]);ga(\"send\",\"event\",eventOptions),angular.forEach($analyticsProvider.settings.ga.additionalAccountNames,function(accountName){ga(accountName+\".send\",\"event\",eventOptions)})}else window._gaq&&_gaq.push([\"_trackEvent\",properties.category,action,properties.label,properties.value,properties.noninteraction])}),$analyticsProvider.registerSetUsername(function(userId){$analyticsProvider.settings.ga.userId=userId})}])}(window,window.angular);\n//# sourceMappingURL=../dist/angulartics-google-analytics.min.js.map\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTkuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ib3dlcl9jb21wb25lbnRzL2FuZ3VsYXJ0aWNzLWdvb2dsZS1hbmFseXRpY3MvZGlzdC9hbmd1bGFydGljcy1nb29nbGUtYW5hbHl0aWNzLm1pbi5qcz9mMzk4Il0sInNvdXJjZXNDb250ZW50IjpbIiFmdW5jdGlvbih3aW5kb3csYW5ndWxhcix1bmRlZmluZWQpe1widXNlIHN0cmljdFwiO2FuZ3VsYXIubW9kdWxlKFwiYW5ndWxhcnRpY3MuZ29vZ2xlLmFuYWx5dGljc1wiLFtcImFuZ3VsYXJ0aWNzXCJdKS5jb25maWcoW1wiJGFuYWx5dGljc1Byb3ZpZGVyXCIsZnVuY3Rpb24oJGFuYWx5dGljc1Byb3ZpZGVyKXskYW5hbHl0aWNzUHJvdmlkZXIuc2V0dGluZ3MucGFnZVRyYWNraW5nLnRyYWNrUmVsYXRpdmVQYXRoPSEwLCRhbmFseXRpY3NQcm92aWRlci5zZXR0aW5ncy5nYT17YWRkaXRpb25hbEFjY291bnROYW1lczp1bmRlZmluZWQsdXNlcklkOm51bGx9LCRhbmFseXRpY3NQcm92aWRlci5yZWdpc3RlclBhZ2VUcmFjayhmdW5jdGlvbihwYXRoKXt3aW5kb3cuX2dhcSYmKF9nYXEucHVzaChbXCJfdHJhY2tQYWdldmlld1wiLHBhdGhdKSxhbmd1bGFyLmZvckVhY2goJGFuYWx5dGljc1Byb3ZpZGVyLnNldHRpbmdzLmdhLmFkZGl0aW9uYWxBY2NvdW50TmFtZXMsZnVuY3Rpb24oYWNjb3VudE5hbWUpe19nYXEucHVzaChbYWNjb3VudE5hbWUrXCIuX3RyYWNrUGFnZXZpZXdcIixwYXRoXSl9KSksd2luZG93LmdhJiYoJGFuYWx5dGljc1Byb3ZpZGVyLnNldHRpbmdzLmdhLnVzZXJJZCYmZ2EoXCJzZXRcIixcIiZ1aWRcIiwkYW5hbHl0aWNzUHJvdmlkZXIuc2V0dGluZ3MuZ2EudXNlcklkKSxnYShcInNlbmRcIixcInBhZ2V2aWV3XCIscGF0aCksYW5ndWxhci5mb3JFYWNoKCRhbmFseXRpY3NQcm92aWRlci5zZXR0aW5ncy5nYS5hZGRpdGlvbmFsQWNjb3VudE5hbWVzLGZ1bmN0aW9uKGFjY291bnROYW1lKXtnYShhY2NvdW50TmFtZStcIi5zZW5kXCIsXCJwYWdldmlld1wiLHBhdGgpfSkpfSksJGFuYWx5dGljc1Byb3ZpZGVyLnJlZ2lzdGVyRXZlbnRUcmFjayhmdW5jdGlvbihhY3Rpb24scHJvcGVydGllcyl7aWYocHJvcGVydGllcyYmcHJvcGVydGllcy5jYXRlZ29yeXx8KHByb3BlcnRpZXM9cHJvcGVydGllc3x8e30scHJvcGVydGllcy5jYXRlZ29yeT1cIkV2ZW50XCIpLHByb3BlcnRpZXMudmFsdWUpe3ZhciBwYXJzZWQ9cGFyc2VJbnQocHJvcGVydGllcy52YWx1ZSwxMCk7cHJvcGVydGllcy52YWx1ZT1pc05hTihwYXJzZWQpPzA6cGFyc2VkfWlmKHdpbmRvdy5nYSl7Zm9yKHZhciBldmVudE9wdGlvbnM9e2V2ZW50Q2F0ZWdvcnk6cHJvcGVydGllcy5jYXRlZ29yeSxldmVudEFjdGlvbjphY3Rpb24sZXZlbnRMYWJlbDpwcm9wZXJ0aWVzLmxhYmVsLGV2ZW50VmFsdWU6cHJvcGVydGllcy52YWx1ZSxub25JbnRlcmFjdGlvbjpwcm9wZXJ0aWVzLm5vbmludGVyYWN0aW9uLHBhZ2U6cHJvcGVydGllcy5wYWdlfHx3aW5kb3cubG9jYXRpb24uaGFzaC5zdWJzdHJpbmcoMSl8fHdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZSx1c2VySWQ6JGFuYWx5dGljc1Byb3ZpZGVyLnNldHRpbmdzLmdhLnVzZXJJZH0saWR4PTE7MjA+PWlkeDtpZHgrKylwcm9wZXJ0aWVzW1wiZGltZW5zaW9uXCIraWR4LnRvU3RyaW5nKCldJiYoZXZlbnRPcHRpb25zW1wiZGltZW5zaW9uXCIraWR4LnRvU3RyaW5nKCldPXByb3BlcnRpZXNbXCJkaW1lbnNpb25cIitpZHgudG9TdHJpbmcoKV0pLHByb3BlcnRpZXNbXCJtZXRyaWNcIitpZHgudG9TdHJpbmcoKV0mJihldmVudE9wdGlvbnNbXCJtZXRyaWNcIitpZHgudG9TdHJpbmcoKV09cHJvcGVydGllc1tcIm1ldHJpY1wiK2lkeC50b1N0cmluZygpXSk7Z2EoXCJzZW5kXCIsXCJldmVudFwiLGV2ZW50T3B0aW9ucyksYW5ndWxhci5mb3JFYWNoKCRhbmFseXRpY3NQcm92aWRlci5zZXR0aW5ncy5nYS5hZGRpdGlvbmFsQWNjb3VudE5hbWVzLGZ1bmN0aW9uKGFjY291bnROYW1lKXtnYShhY2NvdW50TmFtZStcIi5zZW5kXCIsXCJldmVudFwiLGV2ZW50T3B0aW9ucyl9KX1lbHNlIHdpbmRvdy5fZ2FxJiZfZ2FxLnB1c2goW1wiX3RyYWNrRXZlbnRcIixwcm9wZXJ0aWVzLmNhdGVnb3J5LGFjdGlvbixwcm9wZXJ0aWVzLmxhYmVsLHByb3BlcnRpZXMudmFsdWUscHJvcGVydGllcy5ub25pbnRlcmFjdGlvbl0pfSksJGFuYWx5dGljc1Byb3ZpZGVyLnJlZ2lzdGVyU2V0VXNlcm5hbWUoZnVuY3Rpb24odXNlcklkKXskYW5hbHl0aWNzUHJvdmlkZXIuc2V0dGluZ3MuZ2EudXNlcklkPXVzZXJJZH0pfV0pfSh3aW5kb3csd2luZG93LmFuZ3VsYXIpO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Li4vZGlzdC9hbmd1bGFydGljcy1nb29nbGUtYW5hbHl0aWNzLm1pbi5qcy5tYXBcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vYm93ZXJfY29tcG9uZW50cy9hbmd1bGFydGljcy1nb29nbGUtYW5hbHl0aWNzL2Rpc3QvYW5ndWxhcnRpY3MtZ29vZ2xlLWFuYWx5dGljcy5taW4uanNcbiAqKiBtb2R1bGUgaWQgPSA1OVxuICoqIG1vZHVsZSBjaHVua3MgPSAyNFxuICoqLyJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");

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

	eval("angular.module('angular-clipboard', [])\n    .directive('clipboard', ['$document', function ($document) {\n        return {\n            restrict: 'A',\n            scope: {\n                onCopied: '&',\n                onError: '&',\n                text: '='\n            },\n            link: function (scope, element) {\n                function createNode(text) {\n                    var node = $document[0].createElement('textarea');\n                    node.style.position = 'absolute';\n                    node.style.left = '-10000px';\n                    node.textContent = text;\n                    return node;\n                }\n\n                function copyNode(node) {\n                    // Set inline style to override css styles\n                    $document[0].body.style.webkitUserSelect = 'initial';\n\n                    var selection = $document[0].getSelection();\n                    selection.removeAllRanges();\n                    node.select();\n\n                    if(!$document[0].execCommand('copy')) {\n                      throw('failure copy');\n                    }\n                    selection.removeAllRanges();\n\n                    // Reset inline style\n                    $document[0].body.style.webkitUserSelect = '';\n                }\n\n                function copyText(text) {\n                    var node = createNode(text);\n                    $document[0].body.appendChild(node);\n                    copyNode(node);\n                    $document[0].body.removeChild(node);\n                }\n\n                element.on('click', function (event) {\n                    try {\n                        copyText(scope.text);\n                        if (angular.isFunction(scope.onCopied)) {\n                            scope.$evalAsync(scope.onCopied());\n                        }\n                    } catch (err) {\n                        if (angular.isFunction(scope.onError)) {\n                            scope.$evalAsync(scope.onError({err: err}));\n                        }\n                    }\n                });\n            }\n        };\n    }]);\n\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjAuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ib3dlcl9jb21wb25lbnRzL2FuZ3VsYXItY2xpcGJvYXJkL2FuZ3VsYXItY2xpcGJvYXJkLmpzPzM3MWEiXSwic291cmNlc0NvbnRlbnQiOlsiYW5ndWxhci5tb2R1bGUoJ2FuZ3VsYXItY2xpcGJvYXJkJywgW10pXG4gICAgLmRpcmVjdGl2ZSgnY2xpcGJvYXJkJywgWyckZG9jdW1lbnQnLCBmdW5jdGlvbiAoJGRvY3VtZW50KSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICByZXN0cmljdDogJ0EnLFxuICAgICAgICAgICAgc2NvcGU6IHtcbiAgICAgICAgICAgICAgICBvbkNvcGllZDogJyYnLFxuICAgICAgICAgICAgICAgIG9uRXJyb3I6ICcmJyxcbiAgICAgICAgICAgICAgICB0ZXh0OiAnPSdcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBsaW5rOiBmdW5jdGlvbiAoc2NvcGUsIGVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICBmdW5jdGlvbiBjcmVhdGVOb2RlKHRleHQpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIG5vZGUgPSAkZG9jdW1lbnRbMF0uY3JlYXRlRWxlbWVudCgndGV4dGFyZWEnKTtcbiAgICAgICAgICAgICAgICAgICAgbm9kZS5zdHlsZS5wb3NpdGlvbiA9ICdhYnNvbHV0ZSc7XG4gICAgICAgICAgICAgICAgICAgIG5vZGUuc3R5bGUubGVmdCA9ICctMTAwMDBweCc7XG4gICAgICAgICAgICAgICAgICAgIG5vZGUudGV4dENvbnRlbnQgPSB0ZXh0O1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbm9kZTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBmdW5jdGlvbiBjb3B5Tm9kZShub2RlKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFNldCBpbmxpbmUgc3R5bGUgdG8gb3ZlcnJpZGUgY3NzIHN0eWxlc1xuICAgICAgICAgICAgICAgICAgICAkZG9jdW1lbnRbMF0uYm9keS5zdHlsZS53ZWJraXRVc2VyU2VsZWN0ID0gJ2luaXRpYWwnO1xuXG4gICAgICAgICAgICAgICAgICAgIHZhciBzZWxlY3Rpb24gPSAkZG9jdW1lbnRbMF0uZ2V0U2VsZWN0aW9uKCk7XG4gICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbi5yZW1vdmVBbGxSYW5nZXMoKTtcbiAgICAgICAgICAgICAgICAgICAgbm9kZS5zZWxlY3QoKTtcblxuICAgICAgICAgICAgICAgICAgICBpZighJGRvY3VtZW50WzBdLmV4ZWNDb21tYW5kKCdjb3B5JykpIHtcbiAgICAgICAgICAgICAgICAgICAgICB0aHJvdygnZmFpbHVyZSBjb3B5Jyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uLnJlbW92ZUFsbFJhbmdlcygpO1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIFJlc2V0IGlubGluZSBzdHlsZVxuICAgICAgICAgICAgICAgICAgICAkZG9jdW1lbnRbMF0uYm9keS5zdHlsZS53ZWJraXRVc2VyU2VsZWN0ID0gJyc7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgZnVuY3Rpb24gY29weVRleHQodGV4dCkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgbm9kZSA9IGNyZWF0ZU5vZGUodGV4dCk7XG4gICAgICAgICAgICAgICAgICAgICRkb2N1bWVudFswXS5ib2R5LmFwcGVuZENoaWxkKG5vZGUpO1xuICAgICAgICAgICAgICAgICAgICBjb3B5Tm9kZShub2RlKTtcbiAgICAgICAgICAgICAgICAgICAgJGRvY3VtZW50WzBdLmJvZHkucmVtb3ZlQ2hpbGQobm9kZSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgZWxlbWVudC5vbignY2xpY2snLCBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvcHlUZXh0KHNjb3BlLnRleHQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFuZ3VsYXIuaXNGdW5jdGlvbihzY29wZS5vbkNvcGllZCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY29wZS4kZXZhbEFzeW5jKHNjb3BlLm9uQ29waWVkKCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhbmd1bGFyLmlzRnVuY3Rpb24oc2NvcGUub25FcnJvcikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY29wZS4kZXZhbEFzeW5jKHNjb3BlLm9uRXJyb3Ioe2VycjogZXJyfSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgfV0pO1xuXG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL2Jvd2VyX2NvbXBvbmVudHMvYW5ndWxhci1jbGlwYm9hcmQvYW5ndWxhci1jbGlwYm9hcmQuanNcbiAqKiBtb2R1bGUgaWQgPSA2MFxuICoqIG1vZHVsZSBjaHVua3MgPSAyNFxuICoqLyJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==");

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

	eval("'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = utilsModule;\n\nvar _svgSpriteInjector = __webpack_require__(62);\n\nvar _svgSpriteInjector2 = _interopRequireDefault(_svgSpriteInjector);\n\nvar _iggAffixDirectives = __webpack_require__(63);\n\nvar _iggAffixDirectives2 = _interopRequireDefault(_iggAffixDirectives);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar requireables = [//$ ls ancillary/utils/*service.* | xargs -I {} basename {} '.js'\n'ckeditor-directive', 'cl-image-directive', 'cl-uploadable-image-directive', 'clamp-directive', 'compare-to-directive', 'copy-url-directive', 'cute-flash-directive', 'dotdotdot-directive', 'enter-keypress-directive', 'fb-tracking-pixel-directive', 'analytics/ga-content-group-directive', 'analytics/ga-raw-directive', 'igg-popover-directive', 'igg-project-card-directive', 'ignore-dirty-directive', 'individual-avatar-directive', 'info-message-directive', 'insights-contrib-awareness-message-notification-directive', 'konami-directive', 'link-to-directive', 'link-to-unless-directive', 'pagination-directive', 'share-banner-directive', 'shared-economics-interest-message-notification-directive', 'shipping-info-directive', 'simple-image-upload-directive', 'split-directive', 'svg-icon-directive', 'page-title-section-directive', 'cloudinary-image-upload-directive', 'browser-factory', 'cache-factory', 'categories-factory', 'cloudinary-factory', 'csrf-token-factory', 'currencies-factory', 'data-store-factory', 'embedly-factory', 'embeddable-link-html-factory', 'fb-factory', 'flash-factory', 'froogaloop-factory', 'analytics/gogo-events-service', 'analytics/theta-service', 'gogo-location-factory', 'gplus-factory', 'igg-ckeditor-config-factory', 'igg-external-factory', 'job-status-api-factory', 'job-status-poller-factory', 'project-card-factory', 'regions-factory', 'split-factory', 'signup-factory', 'starts-with-factory', 'strip-tags-factory', 'twitter-factory', 'typeahead-utils-factory', 'user-service-config-factory', 'youtube-factory', 'abbrev-num-fmt-filter', 'char-counter-filter', 'currency-display-filter', 'html-wrapped-filter', 'igg-currency-filter', 'search-expression-filter', 'truncate-filter']; /* global console */\n\n\nfunction configureUtils(utils) {\n  utils.config(['$logProvider', '$httpProvider', function ($logProvider, $httpProvider) {\n    $logProvider.debugEnabled(false); // Set to true to see debug statements\n\n    var csrfToken = $('meta[name=csrf-token]').attr('content');\n    $httpProvider.defaults.headers.post['X-CSRF-Token'] = csrfToken;\n    $httpProvider.defaults.headers.put['X-CSRF-Token'] = csrfToken;\n    $httpProvider.defaults.headers.patch['X-CSRF-Token'] = csrfToken;\n    $httpProvider.defaults.headers.delete = { 'X-CSRF-Token': csrfToken };\n  }]).config(['$httpProvider', function ($httpProvider) {\n    $httpProvider.interceptors.push('cache');\n  }]).run(['$window', 'gon', function ($window, gon) {\n    $window.igg = $window.igg || {};\n    $window.igg.externalService = $window.igg.externalService || function (callback) {\n      callback.apply(this, arguments);\n    };\n    if (gon.domain !== 'generosity') {\n      (function () {\n        var assetUrl = $('link[rel=svg]').attr('href');\n        if (assetUrl) {\n          $window.igg.externalService(function () {\n            return (0, _svgSpriteInjector2.default)(assetUrl);\n          });\n        }\n      })();\n    }\n  }]).constant('lodash', window._).constant('_', window._).value('gon', window.gon || {}).value('ga', function () {\n    if (window.ga) {\n      // window.ga is undefined in our test environments\n      window.ga.apply(this, arguments);\n    }\n  }).value('fbq', function () {\n    window.fbq.apply(this, arguments);\n  }).value('CKEDITOR', window.CKEDITOR).constant('I18nRails', window.I18n).constant('serverHost', window.location.host);\n}\n\nfunction utilsModule(utils) {\n  configureUtils(utils);\n  var requireContext = __webpack_require__(64);\n  requireables.forEach(function (requireable) {\n    var moduleName = _.camelCase(requireable.replace(/-(service|directive|filter|factory)$/, '').split('/').slice(-1).pop());\n    var invokeMatch = requireable.match(/(service|directive|filter|factory)/);\n    if (!invokeMatch) {\n      console.warn('No service, directory, or factory inferred from ' + requireable);\n    }\n    var invokeFnName = invokeMatch[0];\n    var required = requireContext('./' + requireable + '.js').default;\n    var fn = utils[invokeFnName];\n    fn(moduleName, required);\n  });\n\n  (0, _iggAffixDirectives2.default)(utils);\n\n  utils.factory('i18n', __webpack_require__(111).default).factory('EmailSubscriber', __webpack_require__(97).default).factory('dateService', __webpack_require__(95).default).factory('pledgeShareService', __webpack_require__(157).default).factory('iggCKEditorConfig', __webpack_require__(128).default).service('userService', __webpack_require__(180).default).service('countriesService', __webpack_require__(88).default).service('backupBeforeUnloadService', __webpack_require__(73).default).service('safeGa', __webpack_require__(71).default).factory('iggAirbrake', __webpack_require__(112).default).directive('gaEventOn', __webpack_require__(70).default).directive('eventOn', __webpack_require__(66).default).directive('iggAutofocus', __webpack_require__(127).default).directive('i18n', __webpack_require__(110).default).filter('htmlCharCounter', __webpack_require__(108).default).factory('$exceptionHandler', [\"iggAirbrake\", function (iggAirbrake) {\n    return iggAirbrake.handle;\n  }]);\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjEuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9hbmNpbGxhcnkvdXRpbHMvaW5kZXguanM/ZmNiYyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKiBnbG9iYWwgY29uc29sZSAqL1xuaW1wb3J0IHN2Z1Nwcml0ZUluamVjdG9yIGZyb20gJ3N2Zy1zcHJpdGUtaW5qZWN0b3InO1xuXG5cbmxldCByZXF1aXJlYWJsZXMgPSBbIC8vJCBscyBhbmNpbGxhcnkvdXRpbHMvKnNlcnZpY2UuKiB8IHhhcmdzIC1JIHt9IGJhc2VuYW1lIHt9ICcuanMnXG4gICdja2VkaXRvci1kaXJlY3RpdmUnLFxuICAnY2wtaW1hZ2UtZGlyZWN0aXZlJyxcbiAgJ2NsLXVwbG9hZGFibGUtaW1hZ2UtZGlyZWN0aXZlJyxcbiAgJ2NsYW1wLWRpcmVjdGl2ZScsXG4gICdjb21wYXJlLXRvLWRpcmVjdGl2ZScsXG4gICdjb3B5LXVybC1kaXJlY3RpdmUnLFxuICAnY3V0ZS1mbGFzaC1kaXJlY3RpdmUnLFxuICAnZG90ZG90ZG90LWRpcmVjdGl2ZScsXG4gICdlbnRlci1rZXlwcmVzcy1kaXJlY3RpdmUnLFxuICAnZmItdHJhY2tpbmctcGl4ZWwtZGlyZWN0aXZlJyxcbiAgJ2FuYWx5dGljcy9nYS1jb250ZW50LWdyb3VwLWRpcmVjdGl2ZScsXG4gICdhbmFseXRpY3MvZ2EtcmF3LWRpcmVjdGl2ZScsXG4gICdpZ2ctcG9wb3Zlci1kaXJlY3RpdmUnLFxuICAnaWdnLXByb2plY3QtY2FyZC1kaXJlY3RpdmUnLFxuICAnaWdub3JlLWRpcnR5LWRpcmVjdGl2ZScsXG4gICdpbmRpdmlkdWFsLWF2YXRhci1kaXJlY3RpdmUnLFxuICAnaW5mby1tZXNzYWdlLWRpcmVjdGl2ZScsXG4gICdpbnNpZ2h0cy1jb250cmliLWF3YXJlbmVzcy1tZXNzYWdlLW5vdGlmaWNhdGlvbi1kaXJlY3RpdmUnLFxuICAna29uYW1pLWRpcmVjdGl2ZScsXG4gICdsaW5rLXRvLWRpcmVjdGl2ZScsXG4gICdsaW5rLXRvLXVubGVzcy1kaXJlY3RpdmUnLFxuICAncGFnaW5hdGlvbi1kaXJlY3RpdmUnLFxuICAnc2hhcmUtYmFubmVyLWRpcmVjdGl2ZScsXG4gICdzaGFyZWQtZWNvbm9taWNzLWludGVyZXN0LW1lc3NhZ2Utbm90aWZpY2F0aW9uLWRpcmVjdGl2ZScsXG4gICdzaGlwcGluZy1pbmZvLWRpcmVjdGl2ZScsXG4gICdzaW1wbGUtaW1hZ2UtdXBsb2FkLWRpcmVjdGl2ZScsXG4gICdzcGxpdC1kaXJlY3RpdmUnLFxuICAnc3ZnLWljb24tZGlyZWN0aXZlJyxcbiAgJ3BhZ2UtdGl0bGUtc2VjdGlvbi1kaXJlY3RpdmUnLFxuICAnY2xvdWRpbmFyeS1pbWFnZS11cGxvYWQtZGlyZWN0aXZlJyxcblxuICAnYnJvd3Nlci1mYWN0b3J5JyxcbiAgJ2NhY2hlLWZhY3RvcnknLFxuICAnY2F0ZWdvcmllcy1mYWN0b3J5JyxcbiAgJ2Nsb3VkaW5hcnktZmFjdG9yeScsXG4gICdjc3JmLXRva2VuLWZhY3RvcnknLFxuICAnY3VycmVuY2llcy1mYWN0b3J5JyxcbiAgJ2RhdGEtc3RvcmUtZmFjdG9yeScsXG4gICdlbWJlZGx5LWZhY3RvcnknLFxuICAnZW1iZWRkYWJsZS1saW5rLWh0bWwtZmFjdG9yeScsXG4gICdmYi1mYWN0b3J5JyxcbiAgJ2ZsYXNoLWZhY3RvcnknLFxuICAnZnJvb2dhbG9vcC1mYWN0b3J5JyxcbiAgJ2FuYWx5dGljcy9nb2dvLWV2ZW50cy1zZXJ2aWNlJyxcbiAgJ2FuYWx5dGljcy90aGV0YS1zZXJ2aWNlJyxcbiAgJ2dvZ28tbG9jYXRpb24tZmFjdG9yeScsXG4gICdncGx1cy1mYWN0b3J5JyxcbiAgJ2lnZy1ja2VkaXRvci1jb25maWctZmFjdG9yeScsXG4gICdpZ2ctZXh0ZXJuYWwtZmFjdG9yeScsXG4gICdqb2Itc3RhdHVzLWFwaS1mYWN0b3J5JyxcbiAgJ2pvYi1zdGF0dXMtcG9sbGVyLWZhY3RvcnknLFxuICAncHJvamVjdC1jYXJkLWZhY3RvcnknLFxuICAncmVnaW9ucy1mYWN0b3J5JyxcbiAgJ3NwbGl0LWZhY3RvcnknLFxuICAnc2lnbnVwLWZhY3RvcnknLFxuICAnc3RhcnRzLXdpdGgtZmFjdG9yeScsXG4gICdzdHJpcC10YWdzLWZhY3RvcnknLFxuICAndHdpdHRlci1mYWN0b3J5JyxcbiAgJ3R5cGVhaGVhZC11dGlscy1mYWN0b3J5JyxcbiAgJ3VzZXItc2VydmljZS1jb25maWctZmFjdG9yeScsXG4gICd5b3V0dWJlLWZhY3RvcnknLFxuXG4gICdhYmJyZXYtbnVtLWZtdC1maWx0ZXInLFxuICAnY2hhci1jb3VudGVyLWZpbHRlcicsXG4gICdjdXJyZW5jeS1kaXNwbGF5LWZpbHRlcicsXG4gICdodG1sLXdyYXBwZWQtZmlsdGVyJyxcbiAgJ2lnZy1jdXJyZW5jeS1maWx0ZXInLFxuICAnc2VhcmNoLWV4cHJlc3Npb24tZmlsdGVyJyxcbiAgJ3RydW5jYXRlLWZpbHRlcidcbl07XG5cblxuaW1wb3J0IGlnZ0FmZml4RGlyZWN0aXZlcyBmcm9tICcuL2lnZy1hZmZpeC1kaXJlY3RpdmVzJztcblxuZnVuY3Rpb24gY29uZmlndXJlVXRpbHModXRpbHMpIHtcbiAgdXRpbHNcbiAgICAuY29uZmlnKFsnJGxvZ1Byb3ZpZGVyJywgJyRodHRwUHJvdmlkZXInLFxuICAgICAgZnVuY3Rpb24gKCRsb2dQcm92aWRlciwgJGh0dHBQcm92aWRlcikge1xuICAgICAgICAkbG9nUHJvdmlkZXIuZGVidWdFbmFibGVkKGZhbHNlKTsgLy8gU2V0IHRvIHRydWUgdG8gc2VlIGRlYnVnIHN0YXRlbWVudHNcblxuICAgICAgICB2YXIgY3NyZlRva2VuID0gJCgnbWV0YVtuYW1lPWNzcmYtdG9rZW5dJykuYXR0cignY29udGVudCcpO1xuICAgICAgICAkaHR0cFByb3ZpZGVyLmRlZmF1bHRzLmhlYWRlcnMucG9zdFsnWC1DU1JGLVRva2VuJ10gPSBjc3JmVG9rZW47XG4gICAgICAgICRodHRwUHJvdmlkZXIuZGVmYXVsdHMuaGVhZGVycy5wdXRbJ1gtQ1NSRi1Ub2tlbiddID0gY3NyZlRva2VuO1xuICAgICAgICAkaHR0cFByb3ZpZGVyLmRlZmF1bHRzLmhlYWRlcnMucGF0Y2hbJ1gtQ1NSRi1Ub2tlbiddID0gY3NyZlRva2VuO1xuICAgICAgICAkaHR0cFByb3ZpZGVyLmRlZmF1bHRzLmhlYWRlcnMuZGVsZXRlID0geydYLUNTUkYtVG9rZW4nOiBjc3JmVG9rZW59O1xuICAgIH1dKVxuICAgIC5jb25maWcoWyckaHR0cFByb3ZpZGVyJywgZnVuY3Rpb24oJGh0dHBQcm92aWRlcikge1xuICAgICAgJGh0dHBQcm92aWRlci5pbnRlcmNlcHRvcnMucHVzaCgnY2FjaGUnKTtcbiAgICB9XSlcbiAgICAucnVuKFsnJHdpbmRvdycsICdnb24nLCBmdW5jdGlvbigkd2luZG93LCBnb24pIHtcbiAgICAgICR3aW5kb3cuaWdnID0gJHdpbmRvdy5pZ2cgfHwge307XG4gICAgICAkd2luZG93LmlnZy5leHRlcm5hbFNlcnZpY2UgPSAkd2luZG93LmlnZy5leHRlcm5hbFNlcnZpY2UgfHwgZnVuY3Rpb24oY2FsbGJhY2spIHtcbiAgICAgICAgY2FsbGJhY2suYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgIH07XG4gICAgICBpZiAoZ29uLmRvbWFpbiAhPT0gJ2dlbmVyb3NpdHknKSB7XG4gICAgICAgIGxldCBhc3NldFVybCA9ICQoJ2xpbmtbcmVsPXN2Z10nKS5hdHRyKCdocmVmJyk7XG4gICAgICAgIGlmIChhc3NldFVybCkge1xuICAgICAgICAgICR3aW5kb3cuaWdnLmV4dGVybmFsU2VydmljZSgoKSA9PiBzdmdTcHJpdGVJbmplY3Rvcihhc3NldFVybCkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfV0pXG4gICAgLmNvbnN0YW50KCdsb2Rhc2gnLCB3aW5kb3cuXylcbiAgICAuY29uc3RhbnQoJ18nLCB3aW5kb3cuXylcbiAgICAudmFsdWUoJ2dvbicsIHdpbmRvdy5nb24gfHwge30pXG4gICAgLnZhbHVlKCdnYScsIGZ1bmN0aW9uKCkge1xuICAgICAgaWYgKHdpbmRvdy5nYSkgeyAvLyB3aW5kb3cuZ2EgaXMgdW5kZWZpbmVkIGluIG91ciB0ZXN0IGVudmlyb25tZW50c1xuICAgICAgICB3aW5kb3cuZ2EuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgIH1cbiAgICB9KVxuICAgIC52YWx1ZSgnZmJxJywgZnVuY3Rpb24oKSB7IHdpbmRvdy5mYnEuYXBwbHkodGhpcywgYXJndW1lbnRzKTsgfSlcbiAgICAudmFsdWUoJ0NLRURJVE9SJywgd2luZG93LkNLRURJVE9SKVxuICAgIC5jb25zdGFudCgnSTE4blJhaWxzJywgd2luZG93LkkxOG4pXG4gICAgLmNvbnN0YW50KCdzZXJ2ZXJIb3N0Jywgd2luZG93LmxvY2F0aW9uLmhvc3QpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB1dGlsc01vZHVsZSh1dGlscykge1xuICBjb25maWd1cmVVdGlscyh1dGlscyk7XG4gIHZhciByZXF1aXJlQ29udGV4dCA9IHJlcXVpcmUuY29udGV4dCgnLi8nLCB0cnVlLCAvLipcXC0oc2VydmljZXxkaXJlY3RpdmV8ZmlsdGVyfGZhY3RvcnkpXFwuanMkLyk7XG4gIHJlcXVpcmVhYmxlcy5mb3JFYWNoKGZ1bmN0aW9uKHJlcXVpcmVhYmxlKSB7XG4gICAgbGV0IG1vZHVsZU5hbWUgPSBfLmNhbWVsQ2FzZShyZXF1aXJlYWJsZS5yZXBsYWNlKC8tKHNlcnZpY2V8ZGlyZWN0aXZlfGZpbHRlcnxmYWN0b3J5KSQvLCAnJykuc3BsaXQoJy8nKS5zbGljZSgtMSkucG9wKCkpO1xuICAgIGxldCBpbnZva2VNYXRjaCA9IHJlcXVpcmVhYmxlLm1hdGNoKC8oc2VydmljZXxkaXJlY3RpdmV8ZmlsdGVyfGZhY3RvcnkpLyk7XG4gICAgaWYgKCFpbnZva2VNYXRjaCkge1xuICAgICAgY29uc29sZS53YXJuKGBObyBzZXJ2aWNlLCBkaXJlY3RvcnksIG9yIGZhY3RvcnkgaW5mZXJyZWQgZnJvbSAke3JlcXVpcmVhYmxlfWApO1xuICAgIH1cbiAgICBsZXQgaW52b2tlRm5OYW1lID0gaW52b2tlTWF0Y2hbMF07XG4gICAgdmFyIHJlcXVpcmVkID0gcmVxdWlyZUNvbnRleHQoJy4vJyArIHJlcXVpcmVhYmxlICsgJy5qcycpLmRlZmF1bHQ7XG4gICAgbGV0IGZuID0gdXRpbHNbaW52b2tlRm5OYW1lXTtcbiAgICBmbihtb2R1bGVOYW1lLCByZXF1aXJlZCk7XG4gIH0pO1xuXG4gIGlnZ0FmZml4RGlyZWN0aXZlcyh1dGlscyk7XG5cbiAgdXRpbHNcbiAgICAuZmFjdG9yeSgnaTE4bicsIHJlcXVpcmUoJy4vaTE4bi1mYWN0b3J5JykuZGVmYXVsdClcbiAgICAuZmFjdG9yeSgnRW1haWxTdWJzY3JpYmVyJywgcmVxdWlyZSgnLi9lbWFpbC1zdWJzY3JpYmVyLWZhY3RvcnknKS5kZWZhdWx0KVxuICAgIC5mYWN0b3J5KCdkYXRlU2VydmljZScsIHJlcXVpcmUoJy4vZGF0ZS1mYWN0b3J5JykuZGVmYXVsdClcbiAgICAuZmFjdG9yeSgncGxlZGdlU2hhcmVTZXJ2aWNlJywgcmVxdWlyZSgnLi9wbGVkZ2Utc2hhcmUtc2VydmljZScpLmRlZmF1bHQpXG4gICAgLmZhY3RvcnkoJ2lnZ0NLRWRpdG9yQ29uZmlnJywgcmVxdWlyZSgnLi9pZ2ctY2tlZGl0b3ItY29uZmlnLWZhY3RvcnknKS5kZWZhdWx0KVxuICAgIC5zZXJ2aWNlKCd1c2VyU2VydmljZScsIHJlcXVpcmUoJy4vdXNlci1zZXJ2aWNlJykuZGVmYXVsdClcbiAgICAuc2VydmljZSgnY291bnRyaWVzU2VydmljZScsIHJlcXVpcmUoJy4vY291bnRyaWVzLXNlcnZpY2UnKS5kZWZhdWx0KVxuICAgIC5zZXJ2aWNlKCdiYWNrdXBCZWZvcmVVbmxvYWRTZXJ2aWNlJywgcmVxdWlyZSgnLi9iYWNrdXAtYmVmb3JlLXVubG9hZC1zZXJ2aWNlJykuZGVmYXVsdClcbiAgICAuc2VydmljZSgnc2FmZUdhJywgcmVxdWlyZSgnLi9hbmFseXRpY3Mvc2FmZS1nYS1zZXJ2aWNlJykuZGVmYXVsdClcbiAgICAuZmFjdG9yeSgnaWdnQWlyYnJha2UnLCByZXF1aXJlKCcuL2lnZy1haXJicmFrZS1zZXJ2aWNlJykuZGVmYXVsdClcbiAgICAuZGlyZWN0aXZlKCdnYUV2ZW50T24nLCByZXF1aXJlKCcuL2FuYWx5dGljcy9nb29nbGUtYW5hbHl0aWNzLWRpcmVjdGl2ZScpLmRlZmF1bHQpXG4gICAgLmRpcmVjdGl2ZSgnZXZlbnRPbicsIHJlcXVpcmUoJy4vYW5hbHl0aWNzL2V2ZW50LWRpcmVjdGl2ZScpLmRlZmF1bHQpXG4gICAgLmRpcmVjdGl2ZSgnaWdnQXV0b2ZvY3VzJywgcmVxdWlyZSgnLi9pZ2ctYXV0b2ZvY3VzLWRpcmVjdGl2ZScpLmRlZmF1bHQpXG4gICAgLmRpcmVjdGl2ZSgnaTE4bicsIHJlcXVpcmUoJy4vaTE4bi1kaXJlY3RpdmUnKS5kZWZhdWx0KVxuICAgIC5maWx0ZXIoJ2h0bWxDaGFyQ291bnRlcicsIHJlcXVpcmUoJy4vaHRtbC1jaGFyLWNvdW50ZXItZmlsdGVyJykuZGVmYXVsdClcbiAgICAuZmFjdG9yeSgnJGV4Y2VwdGlvbkhhbmRsZXInLCBmdW5jdGlvbiAoaWdnQWlyYnJha2UpIHtcbiAgICAgIHJldHVybiBpZ2dBaXJicmFrZS5oYW5kbGU7XG4gICAgfSk7XG59XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiAuL2FuY2lsbGFyeS91dGlscy9pbmRleC5qc1xuICoqLyJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUxBO0FBQ0E7QUFPQTtBQUNBO0FBbUVBO0FBQ0E7QUFqRUE7QUFDQTtBQUNBO0FBQ0E7QUFaQTtBQUNBO0FBQ0E7QUFDQTtBQXdFQTtBQUNBO0FBR0E7QUFDQTtBQUZBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUE3REE7QUE4REE7QUFDQTtBQUNBO0FBNURBOzs7OztBQWdFQTtBQUlBOztBQUNBOztBQUdBO0FBQUE7QUFDQTs7O0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBaUJBOztBQWxDQSIsInNvdXJjZVJvb3QiOiIifQ==");

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

	eval(";(function(window, document) {\r\n\t'use strict';\r\n\r\n\tvar isSvg = document.createElementNS && document.createElementNS( 'http://www.w3.org/2000/svg', 'svg' ).createSVGRect;\r\n\tvar localStorage = 'localStorage' in window && window['localStorage'] !== null ? window.localStorage : false;\r\n\r\n\tfunction svgSpriteInjector(source, opts) {\r\n\t\tvar file;\r\n\t\topts = opts || {};\r\n\r\n\t\tif (source instanceof Node) {\r\n\t\t\tfile = source.getAttribute('data-svg-sprite');\r\n\t\t\topts.revision = source.getAttribute('data-svg-sprite-revision') || opts.revision;\r\n\t\t} else if (typeof source === 'string') {\r\n\t\t\tfile = source;\r\n\t\t}\r\n\r\n\t\tif (isSvg) {\r\n\t\t\tif (file) {\r\n\t\t\t\tinjector(file, opts);\r\n\t\t\t} else {\r\n\t\t\t\tconsole.error('svg-sprite-injector: undefined sprite filename!');\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\tconsole.error('svg-sprite-injector require ie9 or greater!');\r\n\t\t}\r\n\t};\r\n\r\n\tfunction injector(filepath, opts) {\r\n\t\tvar name = 'injectedSVGSprite' + filepath,\r\n\t\t\trevision = opts.revision,\r\n\t\t\trequest;\r\n\r\n\t\t// localStorage cache\r\n\t\tif (revision !== undefined && localStorage && localStorage[name + 'Rev'] == revision) {\r\n\t\t\treturn injectOnLoad(localStorage[name]);\r\n\t\t}\r\n\r\n\t\t// Async load\r\n\t\trequest = new XMLHttpRequest();\r\n\t\trequest.open('GET', filepath, true);\r\n\t\trequest.onreadystatechange = function (e) {\r\n\t\t\tvar data;\r\n\r\n\t\t\tif (request.readyState === 4 && request.status >= 200 && request.status < 400) {\r\n\t\t\t\tinjectOnLoad(data = request.responseText);\r\n\t\t\t\tif (revision !== undefined && localStorage) {\r\n\t\t\t\t\tlocalStorage[name] = data;\r\n\t\t\t\t\tlocalStorage[name + 'Rev'] = revision;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t};\r\n\t\trequest.send();\r\n\t}\r\n\r\n\tfunction injectOnLoad(data) {\r\n\t\tif (data) {\r\n\t\t\tif (document.body) {\r\n\t\t\t\tinjectData(data);\r\n\t\t\t} else {\r\n\t\t\t\tdocument.addEventListener('DOMContentLoaded', injectData.bind(null, data));\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\tfunction injectData(data) {\r\n\t\tvar body = document.body;\r\n\t\tbody.insertAdjacentHTML('afterbegin', data);\r\n\t\tif (body.firstChild.tagName === 'svg') {\r\n\t\t\tbody.firstChild.style.display = 'none';\r\n\t\t}\r\n\t}\r\n\r\n\tif (true) {\r\n\t\tmodule.exports = svgSpriteInjector;\r\n\t} else {\r\n\t\twindow.svgSpriteInjector = svgSpriteInjector;\r\n\t}\r\n\r\n} (window, document));\r\n\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjIuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9+L3N2Zy1zcHJpdGUtaW5qZWN0b3Ivc3ZnLXNwcml0ZS1pbmplY3Rvci5qcz8xM2NkIl0sInNvdXJjZXNDb250ZW50IjpbIjsoZnVuY3Rpb24od2luZG93LCBkb2N1bWVudCkge1xyXG5cdCd1c2Ugc3RyaWN0JztcclxuXHJcblx0dmFyIGlzU3ZnID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TICYmIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyggJ2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJywgJ3N2ZycgKS5jcmVhdGVTVkdSZWN0O1xyXG5cdHZhciBsb2NhbFN0b3JhZ2UgPSAnbG9jYWxTdG9yYWdlJyBpbiB3aW5kb3cgJiYgd2luZG93Wydsb2NhbFN0b3JhZ2UnXSAhPT0gbnVsbCA/IHdpbmRvdy5sb2NhbFN0b3JhZ2UgOiBmYWxzZTtcclxuXHJcblx0ZnVuY3Rpb24gc3ZnU3ByaXRlSW5qZWN0b3Ioc291cmNlLCBvcHRzKSB7XHJcblx0XHR2YXIgZmlsZTtcclxuXHRcdG9wdHMgPSBvcHRzIHx8IHt9O1xyXG5cclxuXHRcdGlmIChzb3VyY2UgaW5zdGFuY2VvZiBOb2RlKSB7XHJcblx0XHRcdGZpbGUgPSBzb3VyY2UuZ2V0QXR0cmlidXRlKCdkYXRhLXN2Zy1zcHJpdGUnKTtcclxuXHRcdFx0b3B0cy5yZXZpc2lvbiA9IHNvdXJjZS5nZXRBdHRyaWJ1dGUoJ2RhdGEtc3ZnLXNwcml0ZS1yZXZpc2lvbicpIHx8IG9wdHMucmV2aXNpb247XHJcblx0XHR9IGVsc2UgaWYgKHR5cGVvZiBzb3VyY2UgPT09ICdzdHJpbmcnKSB7XHJcblx0XHRcdGZpbGUgPSBzb3VyY2U7XHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKGlzU3ZnKSB7XHJcblx0XHRcdGlmIChmaWxlKSB7XHJcblx0XHRcdFx0aW5qZWN0b3IoZmlsZSwgb3B0cyk7XHJcblx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0Y29uc29sZS5lcnJvcignc3ZnLXNwcml0ZS1pbmplY3RvcjogdW5kZWZpbmVkIHNwcml0ZSBmaWxlbmFtZSEnKTtcclxuXHRcdFx0fVxyXG5cdFx0fSBlbHNlIHtcclxuXHRcdFx0Y29uc29sZS5lcnJvcignc3ZnLXNwcml0ZS1pbmplY3RvciByZXF1aXJlIGllOSBvciBncmVhdGVyIScpO1xyXG5cdFx0fVxyXG5cdH07XHJcblxyXG5cdGZ1bmN0aW9uIGluamVjdG9yKGZpbGVwYXRoLCBvcHRzKSB7XHJcblx0XHR2YXIgbmFtZSA9ICdpbmplY3RlZFNWR1Nwcml0ZScgKyBmaWxlcGF0aCxcclxuXHRcdFx0cmV2aXNpb24gPSBvcHRzLnJldmlzaW9uLFxyXG5cdFx0XHRyZXF1ZXN0O1xyXG5cclxuXHRcdC8vIGxvY2FsU3RvcmFnZSBjYWNoZVxyXG5cdFx0aWYgKHJldmlzaW9uICE9PSB1bmRlZmluZWQgJiYgbG9jYWxTdG9yYWdlICYmIGxvY2FsU3RvcmFnZVtuYW1lICsgJ1JldiddID09IHJldmlzaW9uKSB7XHJcblx0XHRcdHJldHVybiBpbmplY3RPbkxvYWQobG9jYWxTdG9yYWdlW25hbWVdKTtcclxuXHRcdH1cclxuXHJcblx0XHQvLyBBc3luYyBsb2FkXHJcblx0XHRyZXF1ZXN0ID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7XHJcblx0XHRyZXF1ZXN0Lm9wZW4oJ0dFVCcsIGZpbGVwYXRoLCB0cnVlKTtcclxuXHRcdHJlcXVlc3Qub25yZWFkeXN0YXRlY2hhbmdlID0gZnVuY3Rpb24gKGUpIHtcclxuXHRcdFx0dmFyIGRhdGE7XHJcblxyXG5cdFx0XHRpZiAocmVxdWVzdC5yZWFkeVN0YXRlID09PSA0ICYmIHJlcXVlc3Quc3RhdHVzID49IDIwMCAmJiByZXF1ZXN0LnN0YXR1cyA8IDQwMCkge1xyXG5cdFx0XHRcdGluamVjdE9uTG9hZChkYXRhID0gcmVxdWVzdC5yZXNwb25zZVRleHQpO1xyXG5cdFx0XHRcdGlmIChyZXZpc2lvbiAhPT0gdW5kZWZpbmVkICYmIGxvY2FsU3RvcmFnZSkge1xyXG5cdFx0XHRcdFx0bG9jYWxTdG9yYWdlW25hbWVdID0gZGF0YTtcclxuXHRcdFx0XHRcdGxvY2FsU3RvcmFnZVtuYW1lICsgJ1JldiddID0gcmV2aXNpb247XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHR9O1xyXG5cdFx0cmVxdWVzdC5zZW5kKCk7XHJcblx0fVxyXG5cclxuXHRmdW5jdGlvbiBpbmplY3RPbkxvYWQoZGF0YSkge1xyXG5cdFx0aWYgKGRhdGEpIHtcclxuXHRcdFx0aWYgKGRvY3VtZW50LmJvZHkpIHtcclxuXHRcdFx0XHRpbmplY3REYXRhKGRhdGEpO1xyXG5cdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ0RPTUNvbnRlbnRMb2FkZWQnLCBpbmplY3REYXRhLmJpbmQobnVsbCwgZGF0YSkpO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHRmdW5jdGlvbiBpbmplY3REYXRhKGRhdGEpIHtcclxuXHRcdHZhciBib2R5ID0gZG9jdW1lbnQuYm9keTtcclxuXHRcdGJvZHkuaW5zZXJ0QWRqYWNlbnRIVE1MKCdhZnRlcmJlZ2luJywgZGF0YSk7XHJcblx0XHRpZiAoYm9keS5maXJzdENoaWxkLnRhZ05hbWUgPT09ICdzdmcnKSB7XHJcblx0XHRcdGJvZHkuZmlyc3RDaGlsZC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0aWYgKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0Jykge1xyXG5cdFx0bW9kdWxlLmV4cG9ydHMgPSBzdmdTcHJpdGVJbmplY3RvcjtcclxuXHR9IGVsc2Uge1xyXG5cdFx0d2luZG93LnN2Z1Nwcml0ZUluamVjdG9yID0gc3ZnU3ByaXRlSW5qZWN0b3I7XHJcblx0fVxyXG5cclxufSAod2luZG93LCBkb2N1bWVudCkpO1xyXG5cblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9zdmctc3ByaXRlLWluamVjdG9yL3N2Zy1zcHJpdGUtaW5qZWN0b3IuanNcbiAqKiBtb2R1bGUgaWQgPSA2MlxuICoqIG1vZHVsZSBjaHVua3MgPSAyNFxuICoqLyJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=");

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

	eval("'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = iggAffixDirectives;\nfunction iggAffixDirectives(utilities) {\n  utilities.directive('iggAffixContainer', function () {\n    return {\n      restrict: 'A',\n      controller: ['$scope', '$element', function (scope, element) {\n        this.element = element;\n      }]\n    };\n  });\n\n  utilities.directive('iggAffix', ['$window', '$interval', 'lodash', function ($window, $interval, _) {\n    return {\n      restrict: 'A',\n      scope: {\n        showOnScroll: \"@iggAffixShowOnScroll\",\n        minParentHeight: \"@iggAffixMinParentHeight\"\n      },\n      require: '^iggAffixContainer',\n      link: function link(scope, element, attrs, iggAffixContainerCtrl) {\n        var win = angular.element($window),\n            affixed;\n\n        scope.containerEl = iggAffixContainerCtrl.element;\n\n        function checkPosition() {\n          scope.offsetTop = scope.containerEl.offset().top;\n          scope.offsetBottom = scope.offsetTop + scope.containerEl.height();\n\n          var scrollTop = $window.pageYOffset,\n              scrollBottom = scrollTop + element.outerHeight();\n\n          if (scrollTop >= scope.offsetTop && scrollBottom <= scope.offsetBottom) {\n            affixed = true;\n            element.css({ position: 'fixed', top: '0px', bottom: '' });\n          } else if (scrollBottom > scope.offsetBottom) {\n            affixed = true;\n            var bottom = win.height() - (scope.offsetBottom - scrollTop);\n            element.css({ position: 'fixed', bottom: bottom + 'px', top: '' });\n          } else {\n            affixed = false;\n            element.css({ position: '', bottom: '', top: '' });\n          }\n\n          var isParentTallEnough = _.isUndefined(scope.minParentHeight) || scope.containerEl.height() >= scope.minParentHeight;\n\n          element.toggle(isParentTallEnough && (affixed || !scope.showOnScroll));\n          element.toggleClass('igg-affix', affixed);\n        }\n\n        win.bind('resize', checkPosition);\n        win.bind('scroll', checkPosition);\n        win.bind('click', checkPosition);\n\n        $interval(checkPosition, 100);\n      }\n    };\n  }]);\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9hbmNpbGxhcnkvdXRpbHMvaWdnLWFmZml4LWRpcmVjdGl2ZXMuanM/MmZiOSJdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBpZ2dBZmZpeERpcmVjdGl2ZXModXRpbGl0aWVzKSB7XG4gIHV0aWxpdGllcy5kaXJlY3RpdmUoJ2lnZ0FmZml4Q29udGFpbmVyJywgZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB7XG4gICAgICByZXN0cmljdDogJ0EnLFxuICAgICAgY29udHJvbGxlcjogWyckc2NvcGUnLCAnJGVsZW1lbnQnLCBmdW5jdGlvbiAoc2NvcGUsIGVsZW1lbnQpIHtcbiAgICAgICAgdGhpcy5lbGVtZW50ID0gZWxlbWVudDtcbiAgICAgIH1dXG4gICAgfTtcbiAgfSk7XG5cbiAgdXRpbGl0aWVzLmRpcmVjdGl2ZSgnaWdnQWZmaXgnLCBbJyR3aW5kb3cnLCAnJGludGVydmFsJywgJ2xvZGFzaCcsIGZ1bmN0aW9uICgkd2luZG93LCAkaW50ZXJ2YWwsIF8pIHtcbiAgICByZXR1cm4ge1xuICAgICAgcmVzdHJpY3Q6ICdBJyxcbiAgICAgIHNjb3BlOiB7XG4gICAgICAgIHNob3dPblNjcm9sbDogXCJAaWdnQWZmaXhTaG93T25TY3JvbGxcIixcbiAgICAgICAgbWluUGFyZW50SGVpZ2h0OiBcIkBpZ2dBZmZpeE1pblBhcmVudEhlaWdodFwiXG4gICAgICB9LFxuICAgICAgcmVxdWlyZTogJ15pZ2dBZmZpeENvbnRhaW5lcicsXG4gICAgICBsaW5rOiBmdW5jdGlvbiAoc2NvcGUsIGVsZW1lbnQsIGF0dHJzLCBpZ2dBZmZpeENvbnRhaW5lckN0cmwpIHtcbiAgICAgICAgdmFyIHdpbiA9IGFuZ3VsYXIuZWxlbWVudCgkd2luZG93KSxcbiAgICAgICAgICBhZmZpeGVkO1xuXG4gICAgICAgIHNjb3BlLmNvbnRhaW5lckVsID0gaWdnQWZmaXhDb250YWluZXJDdHJsLmVsZW1lbnQ7XG5cbiAgICAgICAgZnVuY3Rpb24gY2hlY2tQb3NpdGlvbiAoKSB7XG4gICAgICAgICAgc2NvcGUub2Zmc2V0VG9wID0gc2NvcGUuY29udGFpbmVyRWwub2Zmc2V0KCkudG9wO1xuICAgICAgICAgIHNjb3BlLm9mZnNldEJvdHRvbSA9IHNjb3BlLm9mZnNldFRvcCArIHNjb3BlLmNvbnRhaW5lckVsLmhlaWdodCgpO1xuXG4gICAgICAgICAgdmFyIHNjcm9sbFRvcCA9ICR3aW5kb3cucGFnZVlPZmZzZXQsXG4gICAgICAgICAgICBzY3JvbGxCb3R0b20gPSBzY3JvbGxUb3AgKyBlbGVtZW50Lm91dGVySGVpZ2h0KCk7XG5cbiAgICAgICAgICBpZiAoIHNjcm9sbFRvcCA+PSBzY29wZS5vZmZzZXRUb3AgJiYgc2Nyb2xsQm90dG9tIDw9IHNjb3BlLm9mZnNldEJvdHRvbSApIHtcbiAgICAgICAgICAgIGFmZml4ZWQgPSB0cnVlO1xuICAgICAgICAgICAgZWxlbWVudC5jc3Moe3Bvc2l0aW9uOiAnZml4ZWQnLCB0b3A6ICcwcHgnLCBib3R0b206ICcnfSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGVsc2UgaWYgKCBzY3JvbGxCb3R0b20gPiBzY29wZS5vZmZzZXRCb3R0b20gKSB7XG4gICAgICAgICAgICBhZmZpeGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIHZhciBib3R0b20gPSB3aW4uaGVpZ2h0KCkgLSAoc2NvcGUub2Zmc2V0Qm90dG9tIC0gc2Nyb2xsVG9wKTtcbiAgICAgICAgICAgIGVsZW1lbnQuY3NzKHtwb3NpdGlvbjogJ2ZpeGVkJywgYm90dG9tOiBib3R0b20gKyAncHgnLCB0b3A6ICcnfSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgYWZmaXhlZCA9IGZhbHNlO1xuICAgICAgICAgICAgZWxlbWVudC5jc3Moe3Bvc2l0aW9uOiAnJywgYm90dG9tOiAnJywgdG9wOiAnJ30pO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHZhciBpc1BhcmVudFRhbGxFbm91Z2ggPSAoXy5pc1VuZGVmaW5lZChzY29wZS5taW5QYXJlbnRIZWlnaHQpIHx8IHNjb3BlLmNvbnRhaW5lckVsLmhlaWdodCgpID49IHNjb3BlLm1pblBhcmVudEhlaWdodCk7XG5cbiAgICAgICAgICBlbGVtZW50LnRvZ2dsZShpc1BhcmVudFRhbGxFbm91Z2ggJiYgKGFmZml4ZWQgfHwgIXNjb3BlLnNob3dPblNjcm9sbCkpO1xuICAgICAgICAgIGVsZW1lbnQudG9nZ2xlQ2xhc3MoJ2lnZy1hZmZpeCcsIGFmZml4ZWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgd2luLmJpbmQoJ3Jlc2l6ZScsIGNoZWNrUG9zaXRpb24pO1xuICAgICAgICB3aW4uYmluZCgnc2Nyb2xsJywgY2hlY2tQb3NpdGlvbik7XG4gICAgICAgIHdpbi5iaW5kKCdjbGljaycsIGNoZWNrUG9zaXRpb24pO1xuXG4gICAgICAgICRpbnRlcnZhbChjaGVja1Bvc2l0aW9uLCAxMDApO1xuICAgICAgfVxuICAgIH07XG4gIH1dKTtcblxufVxuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogLi9hbmNpbGxhcnkvdXRpbHMvaWdnLWFmZml4LWRpcmVjdGl2ZXMuanNcbiAqKi8iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBTEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7OztBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FBdkRBIiwic291cmNlUm9vdCI6IiJ9");

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

	eval("var map = {\n\t\"./abbrev-num-fmt-filter.js\": 65,\n\t\"./analytics/event-directive.js\": 66,\n\t\"./analytics/ga-content-group-directive.js\": 67,\n\t\"./analytics/ga-raw-directive.js\": 68,\n\t\"./analytics/gogo-events-service.js\": 69,\n\t\"./analytics/google-analytics-directive.js\": 70,\n\t\"./analytics/safe-ga-service.js\": 71,\n\t\"./analytics/theta-service.js\": 72,\n\t\"./backup-before-unload-service.js\": 73,\n\t\"./browser-factory.js\": 74,\n\t\"./cache-factory.js\": 75,\n\t\"./categories-factory.js\": 76,\n\t\"./char-counter-filter.js\": 77,\n\t\"./ckeditor-directive.js\": 78,\n\t\"./cl-image-directive.js\": 79,\n\t\"./cl-uploadable-image-directive.js\": 80,\n\t\"./clamp-directive.js\": 82,\n\t\"./cloudinary-factory.js\": 84,\n\t\"./cloudinary-image-upload-directive.js\": 85,\n\t\"./compare-to-directive.js\": 86,\n\t\"./copy-url-directive.js\": 87,\n\t\"./countries-service.js\": 88,\n\t\"./csrf-token-factory.js\": 89,\n\t\"./currencies-factory.js\": 90,\n\t\"./currency-display-filter.js\": 91,\n\t\"./cute-flash-directive.js\": 92,\n\t\"./data-store-factory.js\": 94,\n\t\"./date-factory.js\": 95,\n\t\"./dotdotdot-directive.js\": 96,\n\t\"./email-subscriber-factory.js\": 97,\n\t\"./embeddable-link-html-factory.js\": 98,\n\t\"./embedly-factory.js\": 99,\n\t\"./enter-keypress-directive.js\": 100,\n\t\"./fb-factory.js\": 101,\n\t\"./fb-tracking-pixel-directive.js\": 102,\n\t\"./flash-factory.js\": 104,\n\t\"./froogaloop-factory.js\": 105,\n\t\"./gogo-location-factory.js\": 106,\n\t\"./gplus-factory.js\": 107,\n\t\"./html-char-counter-filter.js\": 108,\n\t\"./html-wrapped-filter.js\": 109,\n\t\"./i18n-directive.js\": 110,\n\t\"./i18n-factory.js\": 111,\n\t\"./igg-airbrake-service.js\": 112,\n\t\"./igg-autofocus-directive.js\": 127,\n\t\"./igg-ckeditor-config-factory.js\": 128,\n\t\"./igg-currency-filter.js\": 130,\n\t\"./igg-external-factory.js\": 131,\n\t\"./igg-popover-directive.js\": 132,\n\t\"./igg-project-card-directive.js\": 136,\n\t\"./ignore-dirty-directive.js\": 137,\n\t\"./individual-avatar-directive.js\": 138,\n\t\"./info-message-directive.js\": 140,\n\t\"./insights-contrib-awareness-message-notification-directive.js\": 142,\n\t\"./job-status-api-factory.js\": 144,\n\t\"./job-status-poller-factory.js\": 145,\n\t\"./konami-directive.js\": 146,\n\t\"./link-to-directive.js\": 147,\n\t\"./link-to-unless-directive.js\": 149,\n\t\"./page-title-section-directive.js\": 151,\n\t\"./pagination-directive.js\": 155,\n\t\"./pledge-share-service.js\": 157,\n\t\"./project-card-factory.js\": 158,\n\t\"./regions-factory.js\": 159,\n\t\"./search-expression-filter.js\": 160,\n\t\"./share-banner-directive.js\": 161,\n\t\"./shared-economics-interest-message-notification-directive.js\": 163,\n\t\"./shipping-info-directive.js\": 165,\n\t\"./signup-factory.js\": 167,\n\t\"./simple-image-upload-directive.js\": 168,\n\t\"./split-directive.js\": 170,\n\t\"./split-factory.js\": 171,\n\t\"./starts-with-factory.js\": 173,\n\t\"./strip-tags-factory.js\": 174,\n\t\"./svg-icon-directive.js\": 175,\n\t\"./truncate-filter.js\": 176,\n\t\"./twitter-factory.js\": 177,\n\t\"./typeahead-utils-factory.js\": 178,\n\t\"./user-service-config-factory.js\": 179,\n\t\"./user-service.js\": 180,\n\t\"./youtube-factory.js\": 181\n};\nfunction webpackContext(req) {\n\treturn __webpack_require__(webpackContextResolve(req));\n};\nfunction webpackContextResolve(req) {\n\treturn map[req] || (function() { throw new Error(\"Cannot find module '\" + req + \"'.\") }());\n};\nwebpackContext.keys = function webpackContextKeys() {\n\treturn Object.keys(map);\n};\nwebpackContext.resolve = webpackContextResolve;\nmodule.exports = webpackContext;\nwebpackContext.id = 64;\n\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjQuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9hbmNpbGxhcnkvdXRpbHMgLipcXC0oc2VydmljZXxkaXJlY3RpdmV8ZmlsdGVyfGZhY3RvcnkpXFwuanMkP2JhN2YiXSwic291cmNlc0NvbnRlbnQiOlsidmFyIG1hcCA9IHtcblx0XCIuL2FiYnJldi1udW0tZm10LWZpbHRlci5qc1wiOiA2NSxcblx0XCIuL2FuYWx5dGljcy9ldmVudC1kaXJlY3RpdmUuanNcIjogNjYsXG5cdFwiLi9hbmFseXRpY3MvZ2EtY29udGVudC1ncm91cC1kaXJlY3RpdmUuanNcIjogNjcsXG5cdFwiLi9hbmFseXRpY3MvZ2EtcmF3LWRpcmVjdGl2ZS5qc1wiOiA2OCxcblx0XCIuL2FuYWx5dGljcy9nb2dvLWV2ZW50cy1zZXJ2aWNlLmpzXCI6IDY5LFxuXHRcIi4vYW5hbHl0aWNzL2dvb2dsZS1hbmFseXRpY3MtZGlyZWN0aXZlLmpzXCI6IDcwLFxuXHRcIi4vYW5hbHl0aWNzL3NhZmUtZ2Etc2VydmljZS5qc1wiOiA3MSxcblx0XCIuL2FuYWx5dGljcy90aGV0YS1zZXJ2aWNlLmpzXCI6IDcyLFxuXHRcIi4vYmFja3VwLWJlZm9yZS11bmxvYWQtc2VydmljZS5qc1wiOiA3Myxcblx0XCIuL2Jyb3dzZXItZmFjdG9yeS5qc1wiOiA3NCxcblx0XCIuL2NhY2hlLWZhY3RvcnkuanNcIjogNzUsXG5cdFwiLi9jYXRlZ29yaWVzLWZhY3RvcnkuanNcIjogNzYsXG5cdFwiLi9jaGFyLWNvdW50ZXItZmlsdGVyLmpzXCI6IDc3LFxuXHRcIi4vY2tlZGl0b3ItZGlyZWN0aXZlLmpzXCI6IDc4LFxuXHRcIi4vY2wtaW1hZ2UtZGlyZWN0aXZlLmpzXCI6IDc5LFxuXHRcIi4vY2wtdXBsb2FkYWJsZS1pbWFnZS1kaXJlY3RpdmUuanNcIjogODAsXG5cdFwiLi9jbGFtcC1kaXJlY3RpdmUuanNcIjogODIsXG5cdFwiLi9jbG91ZGluYXJ5LWZhY3RvcnkuanNcIjogODQsXG5cdFwiLi9jbG91ZGluYXJ5LWltYWdlLXVwbG9hZC1kaXJlY3RpdmUuanNcIjogODUsXG5cdFwiLi9jb21wYXJlLXRvLWRpcmVjdGl2ZS5qc1wiOiA4Nixcblx0XCIuL2NvcHktdXJsLWRpcmVjdGl2ZS5qc1wiOiA4Nyxcblx0XCIuL2NvdW50cmllcy1zZXJ2aWNlLmpzXCI6IDg4LFxuXHRcIi4vY3NyZi10b2tlbi1mYWN0b3J5LmpzXCI6IDg5LFxuXHRcIi4vY3VycmVuY2llcy1mYWN0b3J5LmpzXCI6IDkwLFxuXHRcIi4vY3VycmVuY3ktZGlzcGxheS1maWx0ZXIuanNcIjogOTEsXG5cdFwiLi9jdXRlLWZsYXNoLWRpcmVjdGl2ZS5qc1wiOiA5Mixcblx0XCIuL2RhdGEtc3RvcmUtZmFjdG9yeS5qc1wiOiA5NCxcblx0XCIuL2RhdGUtZmFjdG9yeS5qc1wiOiA5NSxcblx0XCIuL2RvdGRvdGRvdC1kaXJlY3RpdmUuanNcIjogOTYsXG5cdFwiLi9lbWFpbC1zdWJzY3JpYmVyLWZhY3RvcnkuanNcIjogOTcsXG5cdFwiLi9lbWJlZGRhYmxlLWxpbmstaHRtbC1mYWN0b3J5LmpzXCI6IDk4LFxuXHRcIi4vZW1iZWRseS1mYWN0b3J5LmpzXCI6IDk5LFxuXHRcIi4vZW50ZXIta2V5cHJlc3MtZGlyZWN0aXZlLmpzXCI6IDEwMCxcblx0XCIuL2ZiLWZhY3RvcnkuanNcIjogMTAxLFxuXHRcIi4vZmItdHJhY2tpbmctcGl4ZWwtZGlyZWN0aXZlLmpzXCI6IDEwMixcblx0XCIuL2ZsYXNoLWZhY3RvcnkuanNcIjogMTA0LFxuXHRcIi4vZnJvb2dhbG9vcC1mYWN0b3J5LmpzXCI6IDEwNSxcblx0XCIuL2dvZ28tbG9jYXRpb24tZmFjdG9yeS5qc1wiOiAxMDYsXG5cdFwiLi9ncGx1cy1mYWN0b3J5LmpzXCI6IDEwNyxcblx0XCIuL2h0bWwtY2hhci1jb3VudGVyLWZpbHRlci5qc1wiOiAxMDgsXG5cdFwiLi9odG1sLXdyYXBwZWQtZmlsdGVyLmpzXCI6IDEwOSxcblx0XCIuL2kxOG4tZGlyZWN0aXZlLmpzXCI6IDExMCxcblx0XCIuL2kxOG4tZmFjdG9yeS5qc1wiOiAxMTEsXG5cdFwiLi9pZ2ctYWlyYnJha2Utc2VydmljZS5qc1wiOiAxMTIsXG5cdFwiLi9pZ2ctYXV0b2ZvY3VzLWRpcmVjdGl2ZS5qc1wiOiAxMjcsXG5cdFwiLi9pZ2ctY2tlZGl0b3ItY29uZmlnLWZhY3RvcnkuanNcIjogMTI4LFxuXHRcIi4vaWdnLWN1cnJlbmN5LWZpbHRlci5qc1wiOiAxMzAsXG5cdFwiLi9pZ2ctZXh0ZXJuYWwtZmFjdG9yeS5qc1wiOiAxMzEsXG5cdFwiLi9pZ2ctcG9wb3Zlci1kaXJlY3RpdmUuanNcIjogMTMyLFxuXHRcIi4vaWdnLXByb2plY3QtY2FyZC1kaXJlY3RpdmUuanNcIjogMTM2LFxuXHRcIi4vaWdub3JlLWRpcnR5LWRpcmVjdGl2ZS5qc1wiOiAxMzcsXG5cdFwiLi9pbmRpdmlkdWFsLWF2YXRhci1kaXJlY3RpdmUuanNcIjogMTM4LFxuXHRcIi4vaW5mby1tZXNzYWdlLWRpcmVjdGl2ZS5qc1wiOiAxNDAsXG5cdFwiLi9pbnNpZ2h0cy1jb250cmliLWF3YXJlbmVzcy1tZXNzYWdlLW5vdGlmaWNhdGlvbi1kaXJlY3RpdmUuanNcIjogMTQyLFxuXHRcIi4vam9iLXN0YXR1cy1hcGktZmFjdG9yeS5qc1wiOiAxNDQsXG5cdFwiLi9qb2Itc3RhdHVzLXBvbGxlci1mYWN0b3J5LmpzXCI6IDE0NSxcblx0XCIuL2tvbmFtaS1kaXJlY3RpdmUuanNcIjogMTQ2LFxuXHRcIi4vbGluay10by1kaXJlY3RpdmUuanNcIjogMTQ3LFxuXHRcIi4vbGluay10by11bmxlc3MtZGlyZWN0aXZlLmpzXCI6IDE0OSxcblx0XCIuL3BhZ2UtdGl0bGUtc2VjdGlvbi1kaXJlY3RpdmUuanNcIjogMTUxLFxuXHRcIi4vcGFnaW5hdGlvbi1kaXJlY3RpdmUuanNcIjogMTU1LFxuXHRcIi4vcGxlZGdlLXNoYXJlLXNlcnZpY2UuanNcIjogMTU3LFxuXHRcIi4vcHJvamVjdC1jYXJkLWZhY3RvcnkuanNcIjogMTU4LFxuXHRcIi4vcmVnaW9ucy1mYWN0b3J5LmpzXCI6IDE1OSxcblx0XCIuL3NlYXJjaC1leHByZXNzaW9uLWZpbHRlci5qc1wiOiAxNjAsXG5cdFwiLi9zaGFyZS1iYW5uZXItZGlyZWN0aXZlLmpzXCI6IDE2MSxcblx0XCIuL3NoYXJlZC1lY29ub21pY3MtaW50ZXJlc3QtbWVzc2FnZS1ub3RpZmljYXRpb24tZGlyZWN0aXZlLmpzXCI6IDE2Myxcblx0XCIuL3NoaXBwaW5nLWluZm8tZGlyZWN0aXZlLmpzXCI6IDE2NSxcblx0XCIuL3NpZ251cC1mYWN0b3J5LmpzXCI6IDE2Nyxcblx0XCIuL3NpbXBsZS1pbWFnZS11cGxvYWQtZGlyZWN0aXZlLmpzXCI6IDE2OCxcblx0XCIuL3NwbGl0LWRpcmVjdGl2ZS5qc1wiOiAxNzAsXG5cdFwiLi9zcGxpdC1mYWN0b3J5LmpzXCI6IDE3MSxcblx0XCIuL3N0YXJ0cy13aXRoLWZhY3RvcnkuanNcIjogMTczLFxuXHRcIi4vc3RyaXAtdGFncy1mYWN0b3J5LmpzXCI6IDE3NCxcblx0XCIuL3N2Zy1pY29uLWRpcmVjdGl2ZS5qc1wiOiAxNzUsXG5cdFwiLi90cnVuY2F0ZS1maWx0ZXIuanNcIjogMTc2LFxuXHRcIi4vdHdpdHRlci1mYWN0b3J5LmpzXCI6IDE3Nyxcblx0XCIuL3R5cGVhaGVhZC11dGlscy1mYWN0b3J5LmpzXCI6IDE3OCxcblx0XCIuL3VzZXItc2VydmljZS1jb25maWctZmFjdG9yeS5qc1wiOiAxNzksXG5cdFwiLi91c2VyLXNlcnZpY2UuanNcIjogMTgwLFxuXHRcIi4veW91dHViZS1mYWN0b3J5LmpzXCI6IDE4MVxufTtcbmZ1bmN0aW9uIHdlYnBhY2tDb250ZXh0KHJlcSkge1xuXHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXyh3ZWJwYWNrQ29udGV4dFJlc29sdmUocmVxKSk7XG59O1xuZnVuY3Rpb24gd2VicGFja0NvbnRleHRSZXNvbHZlKHJlcSkge1xuXHRyZXR1cm4gbWFwW3JlcV0gfHwgKGZ1bmN0aW9uKCkgeyB0aHJvdyBuZXcgRXJyb3IoXCJDYW5ub3QgZmluZCBtb2R1bGUgJ1wiICsgcmVxICsgXCInLlwiKSB9KCkpO1xufTtcbndlYnBhY2tDb250ZXh0LmtleXMgPSBmdW5jdGlvbiB3ZWJwYWNrQ29udGV4dEtleXMoKSB7XG5cdHJldHVybiBPYmplY3Qua2V5cyhtYXApO1xufTtcbndlYnBhY2tDb250ZXh0LnJlc29sdmUgPSB3ZWJwYWNrQ29udGV4dFJlc29sdmU7XG5tb2R1bGUuZXhwb3J0cyA9IHdlYnBhY2tDb250ZXh0O1xud2VicGFja0NvbnRleHQuaWQgPSA2NDtcblxuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9hbmNpbGxhcnkvdXRpbHMgLipcXC0oc2VydmljZXxkaXJlY3RpdmV8ZmlsdGVyfGZhY3RvcnkpXFwuanMkXG4gKiogbW9kdWxlIGlkID0gNjRcbiAqKiBtb2R1bGUgY2h1bmtzID0gMjRcbiAqKi8iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9");

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

	eval("'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = abbrevNumFmt;\n/*@ngInject*/\nfunction abbrevNumFmt() {\n  return function (input) {\n    var num_after_decimal = 1;\n    var million = 1000000;\n    var thousand = 1000;\n\n    if (input >= million) {\n      if (input / million >= 100 || input % million < 50000) {\n        num_after_decimal = 0;\n      }\n      return (input / million).toFixed(num_after_decimal) + 'M';\n    } else if (input >= thousand) {\n      if (input / thousand >= 100 || input % 1000 < 50) {\n        num_after_decimal = 0;\n      }\n      return (input / thousand).toFixed(num_after_decimal) + 'k';\n    } else if (input === null) {\n      return '';\n    } else if (input <= 0) {\n      return '0';\n    } else {\n      return '' + input;\n    }\n  };\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjUuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9hbmNpbGxhcnkvdXRpbHMvYWJicmV2LW51bS1mbXQtZmlsdGVyLmpzP2U4ZWQiXSwic291cmNlc0NvbnRlbnQiOlsiLypAbmdJbmplY3QqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gYWJicmV2TnVtRm10KCkge1xuICAgIHJldHVybiBmdW5jdGlvbihpbnB1dCkge1xuICAgICAgdmFyIG51bV9hZnRlcl9kZWNpbWFsID0gMTtcbiAgICAgIHZhciBtaWxsaW9uID0gMTAwMDAwMDtcbiAgICAgIHZhciB0aG91c2FuZCA9IDEwMDA7XG5cblxuICAgICAgaWYgKGlucHV0ID49IG1pbGxpb24pIHtcbiAgICAgICAgaWYgKGlucHV0L21pbGxpb24gPj0gMTAwIHx8IGlucHV0ICUgbWlsbGlvbiA8IDUwMDAwKSB7XG4gICAgICAgICAgbnVtX2FmdGVyX2RlY2ltYWwgPSAwO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAoaW5wdXQgLyBtaWxsaW9uKS50b0ZpeGVkKG51bV9hZnRlcl9kZWNpbWFsKSArICdNJztcbiAgICAgIH0gZWxzZSBpZiAoaW5wdXQgPj0gdGhvdXNhbmQpIHtcbiAgICAgICAgaWYgKGlucHV0L3Rob3VzYW5kID49IDEwMCB8fCBpbnB1dCAlIDEwMDAgPCA1MCl7XG4gICAgICAgICAgbnVtX2FmdGVyX2RlY2ltYWwgPSAwO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAoaW5wdXQgLyB0aG91c2FuZCkudG9GaXhlZChudW1fYWZ0ZXJfZGVjaW1hbCkgKyAnayc7XG4gICAgICB9IGVsc2UgaWYgKGlucHV0ID09PSBudWxsKSB7XG4gICAgICAgIHJldHVybiAnJztcbiAgICAgIH0gZWxzZSBpZiAoaW5wdXQgPD0gMCkge1xuICAgICAgICByZXR1cm4gJzAnO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuICcnICsgaW5wdXQ7XG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogLi9hbmNpbGxhcnkvdXRpbHMvYWJicmV2LW51bS1mbXQtZmlsdGVyLmpzXG4gKiovIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFKQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQXRCQSIsInNvdXJjZVJvb3QiOiIifQ==");

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

	eval("'use strict';\n\nevent.$inject = [\"gogoEvents\"];\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = event;\n/*@ngInject*/\nfunction event(gogoEvents) {\n  function isCommand(element) {\n    return ['a:', 'button:', 'button:button', 'button:submit', 'input:button', 'input:submit'].indexOf(element.tagName.toLowerCase() + ':' + (element.type || '')) >= 0;\n  }\n\n  function inferEventName(element) {\n    if (isCommand(element)) return element.innerText || element.value;\n    return element.id || element.name || element.tagName;\n  }\n\n  function isProperty(name) {\n    return name.substr(0, 5) === 'event' && ['On', 'If', 'Tags', 'Name'].indexOf(name.substr(5)) === -1;\n  }\n\n  function extractPropertyName(name) {\n    // slice off the 'event' prefix, lower case first letter\n    return name.slice(5, 6).toLowerCase() + name.slice(6);\n  }\n\n  return {\n    restrict: 'A',\n    link: function link($scope, $element, $attrs) {\n\n      var eventType = $attrs.eventOn;\n      var trackingData = {};\n\n      angular.forEach($attrs.$attr, function (attr, name) {\n        if (isProperty(name)) {\n          trackingData[extractPropertyName(name)] = $attrs[name];\n          $attrs.$observe(name, function (value) {\n            trackingData[extractPropertyName(name)] = value;\n          });\n        }\n      });\n\n      angular.element($element[0]).bind(eventType, function ($event) {\n        var eventName = $attrs.eventName || inferEventName($element[0]);\n\n        if ($attrs.eventIf) {\n          if (!$scope.$eval($attrs.eventIf)) {\n            return; // Cancel this event if we don't pass the event-if condition\n          }\n        }\n        // Allow components to pass through an expression that gets merged on to the event properties\n        // eg. event-tags='{{eventTags()}}'\n        if ($attrs.eventTags) {\n          angular.extend(trackingData, $scope.$eval($attrs.eventTags));\n        }\n\n        gogoEvents.track(_.merge(trackingData, { thetaName: eventName }));\n      });\n    }\n  };\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjYuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9hbmNpbGxhcnkvdXRpbHMvYW5hbHl0aWNzL2V2ZW50LWRpcmVjdGl2ZS5qcz84OWFkIl0sInNvdXJjZXNDb250ZW50IjpbIi8qQG5nSW5qZWN0Ki9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGV2ZW50KGdvZ29FdmVudHMpIHtcbiAgZnVuY3Rpb24gaXNDb21tYW5kKGVsZW1lbnQpIHtcbiAgICByZXR1cm4gWydhOicsICdidXR0b246JywgJ2J1dHRvbjpidXR0b24nLCAnYnV0dG9uOnN1Ym1pdCcsICdpbnB1dDpidXR0b24nLCAnaW5wdXQ6c3VibWl0J10uaW5kZXhPZihcbiAgICAgICAgZWxlbWVudC50YWdOYW1lLnRvTG93ZXJDYXNlKCkgKyAnOicgKyAoZWxlbWVudC50eXBlIHx8ICcnKSkgPj0gMDtcbiAgfVxuXG4gIGZ1bmN0aW9uIGluZmVyRXZlbnROYW1lKGVsZW1lbnQpIHtcbiAgICBpZiAoaXNDb21tYW5kKGVsZW1lbnQpKSByZXR1cm4gZWxlbWVudC5pbm5lclRleHQgfHwgZWxlbWVudC52YWx1ZTtcbiAgICByZXR1cm4gZWxlbWVudC5pZCB8fCBlbGVtZW50Lm5hbWUgfHwgZWxlbWVudC50YWdOYW1lO1xuICB9XG5cbiAgZnVuY3Rpb24gaXNQcm9wZXJ0eShuYW1lKSB7XG4gICAgcmV0dXJuIG5hbWUuc3Vic3RyKDAsIDUpID09PSAnZXZlbnQnICYmIFsnT24nLCAnSWYnLCAnVGFncycsICdOYW1lJ10uaW5kZXhPZihuYW1lLnN1YnN0cig1KSkgPT09IC0xO1xuICB9XG5cbiAgZnVuY3Rpb24gZXh0cmFjdFByb3BlcnR5TmFtZShuYW1lKSB7XG4gICAgLy8gc2xpY2Ugb2ZmIHRoZSAnZXZlbnQnIHByZWZpeCwgbG93ZXIgY2FzZSBmaXJzdCBsZXR0ZXJcbiAgICByZXR1cm4gbmFtZS5zbGljZSg1LDYpLnRvTG93ZXJDYXNlKCkgKyBuYW1lLnNsaWNlKDYpO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICByZXN0cmljdDogJ0EnLFxuICAgIGxpbms6IGZ1bmN0aW9uICgkc2NvcGUsICRlbGVtZW50LCAkYXR0cnMpIHtcblxuICAgICAgdmFyIGV2ZW50VHlwZSA9ICRhdHRycy5ldmVudE9uO1xuICAgICAgdmFyIHRyYWNraW5nRGF0YSA9IHt9O1xuXG4gICAgICBhbmd1bGFyLmZvckVhY2goJGF0dHJzLiRhdHRyLCBmdW5jdGlvbiAoYXR0ciwgbmFtZSkge1xuICAgICAgICBpZiAoaXNQcm9wZXJ0eShuYW1lKSkge1xuICAgICAgICAgIHRyYWNraW5nRGF0YVtleHRyYWN0UHJvcGVydHlOYW1lKG5hbWUpXSA9ICRhdHRyc1tuYW1lXTtcbiAgICAgICAgICAkYXR0cnMuJG9ic2VydmUobmFtZSwgZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICB0cmFja2luZ0RhdGFbZXh0cmFjdFByb3BlcnR5TmFtZShuYW1lKV0gPSB2YWx1ZTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIGFuZ3VsYXIuZWxlbWVudCgkZWxlbWVudFswXSkuYmluZChldmVudFR5cGUsIGZ1bmN0aW9uICgkZXZlbnQpIHtcbiAgICAgICAgdmFyIGV2ZW50TmFtZSA9ICRhdHRycy5ldmVudE5hbWUgfHwgaW5mZXJFdmVudE5hbWUoJGVsZW1lbnRbMF0pO1xuXG4gICAgICAgIGlmICgkYXR0cnMuZXZlbnRJZikge1xuICAgICAgICAgIGlmICghJHNjb3BlLiRldmFsKCRhdHRycy5ldmVudElmKSkge1xuICAgICAgICAgICAgcmV0dXJuOyAvLyBDYW5jZWwgdGhpcyBldmVudCBpZiB3ZSBkb24ndCBwYXNzIHRoZSBldmVudC1pZiBjb25kaXRpb25cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gQWxsb3cgY29tcG9uZW50cyB0byBwYXNzIHRocm91Z2ggYW4gZXhwcmVzc2lvbiB0aGF0IGdldHMgbWVyZ2VkIG9uIHRvIHRoZSBldmVudCBwcm9wZXJ0aWVzXG4gICAgICAgIC8vIGVnLiBldmVudC10YWdzPSd7e2V2ZW50VGFncygpfX0nXG4gICAgICAgIGlmICgkYXR0cnMuZXZlbnRUYWdzKSB7XG4gICAgICAgICAgYW5ndWxhci5leHRlbmQodHJhY2tpbmdEYXRhLCAkc2NvcGUuJGV2YWwoJGF0dHJzLmV2ZW50VGFncykpO1xuICAgICAgICB9XG5cbiAgICAgICAgZ29nb0V2ZW50cy50cmFjayhfLm1lcmdlKHRyYWNraW5nRGF0YSwge3RoZXRhTmFtZTogZXZlbnROYW1lfSkpO1xuICAgICAgfSk7XG4gICAgfVxuICB9O1xufVxuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogLi9hbmNpbGxhcnkvdXRpbHMvYW5hbHl0aWNzL2V2ZW50LWRpcmVjdGl2ZS5qc1xuICoqLyJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTs7QUFDQTtBQUNBOztBQUVBOztBQUpBO0FBQ0E7QUFDQTs7O0FBSUE7QUFDQTtBQUNBOzs7QUFHQTtBQUNBOzs7QUFHQTs7QUFFQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7OztBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7QUFMQTtBQVdBOzs7QUFHQTs7OztBQWxEQSIsInNvdXJjZVJvb3QiOiIifQ==");

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

	eval("'use strict';\n\ngaContentGroup.$inject = [\"ga\"];\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = gaContentGroup;\n/*@ngInject*/\nfunction gaContentGroup(ga) {\n  return {\n    scope: {},\n    link: function link(scope, element, attrs) {\n      // TODO EVENTS: id=qua6f fixtype=infra subsystem=analytics . maybe move gaContentGroup to superproperties\n      ga('set', 'contentGroup1', attrs.gaContentGroup);\n    }\n  };\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjcuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9hbmNpbGxhcnkvdXRpbHMvYW5hbHl0aWNzL2dhLWNvbnRlbnQtZ3JvdXAtZGlyZWN0aXZlLmpzPzliYTAiXSwic291cmNlc0NvbnRlbnQiOlsiLypAbmdJbmplY3QqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZ2FDb250ZW50R3JvdXAoZ2EpIHtcbiAgcmV0dXJuIHtcbiAgICBzY29wZToge30sXG4gICAgbGluazogZnVuY3Rpb24oc2NvcGUsIGVsZW1lbnQsIGF0dHJzKSB7XG4gICAgICAvLyBUT0RPIEVWRU5UUzogaWQ9cXVhNmYgZml4dHlwZT1pbmZyYSBzdWJzeXN0ZW09YW5hbHl0aWNzIC4gbWF5YmUgbW92ZSBnYUNvbnRlbnRHcm91cCB0byBzdXBlcnByb3BlcnRpZXNcbiAgICAgIGdhKCdzZXQnLCAnY29udGVudEdyb3VwMScsIGF0dHJzLmdhQ29udGVudEdyb3VwKTtcbiAgICB9XG4gIH07XG59XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiAuL2FuY2lsbGFyeS91dGlscy9hbmFseXRpY3MvZ2EtY29udGVudC1ncm91cC1kaXJlY3RpdmUuanNcbiAqKi8iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7O0FBQ0E7QUFDQTs7QUFFQTs7QUFKQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7O0FBTEEiLCJzb3VyY2VSb290IjoiIn0=");

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

	eval("'use strict';\n\ngaRaw.$inject = [\"$window\"];\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = gaRaw;\n/*@ngInject*/\nfunction gaRaw($window) {\n  return {\n    scope: {\n      'gaRawOn': '@',\n      'gaRaw': '@'\n    },\n    link: function link($scope, $element, $attrs) {\n      $element.on($attrs.gaRawOn || 'click', function () {\n        var args = $scope.$eval($scope.gaRaw);\n        $window.ga.apply(ga, args);\n      });\n    }\n  };\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjguanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9hbmNpbGxhcnkvdXRpbHMvYW5hbHl0aWNzL2dhLXJhdy1kaXJlY3RpdmUuanM/ZTc4NiJdLCJzb3VyY2VzQ29udGVudCI6WyIvKkBuZ0luamVjdCovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnYVJhdygkd2luZG93KSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHNjb3BlOiB7XG4gICAgICAgICdnYVJhd09uJzogJ0AnLFxuICAgICAgICAnZ2FSYXcnOiAnQCdcbiAgICAgIH0sXG4gICAgICBsaW5rOiBmdW5jdGlvbigkc2NvcGUsICRlbGVtZW50LCAkYXR0cnMpIHtcbiAgICAgICAgJGVsZW1lbnQub24oJGF0dHJzLmdhUmF3T24gfHwgJ2NsaWNrJywgZnVuY3Rpb24oKSB7XG4gICAgICAgICAgdmFyIGFyZ3MgPSAkc2NvcGUuJGV2YWwoJHNjb3BlLmdhUmF3KTtcbiAgICAgICAgICAkd2luZG93LmdhLmFwcGx5KGdhLCBhcmdzKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogLi9hbmNpbGxhcnkvdXRpbHMvYW5hbHl0aWNzL2dhLXJhdy1kaXJlY3RpdmUuanNcbiAqKi8iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7O0FBQ0E7QUFDQTs7QUFFQTs7QUFKQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOzs7O0FBVEEiLCJzb3VyY2VSb290IjoiIn0=");

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

	eval("'use strict';\n\ngogoEvents.$inject = [\"$http\", \"$q\", \"$timeout\", \"gon\", \"ga\", \"theta\", \"iggAirbrake\", \"split\", \"_\"];\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = gogoEvents;\n/*@ngInject*/\n\nfunction gogoEvents($http, $q, $timeout, gon, ga, theta, iggAirbrake, split, _) {\n  var service = {};\n  var defaultAnnotations = ['request_remote_ip', 'request_user_agent', 'request_host', 'source_bot', 'source_locale', 'source_country', 'source_region', 'source_browser', 'source_mobile', 'visitor_id', 'session_id'];\n  var DEFAULT_TIMEOUT = 2000;\n\n  service._overrideSubmit = false;\n\n  var defaultEventTags = function defaultEventTags() {\n    var tags = _.clone(gon.default_event_tags) || {};\n    if (split.appVersion !== '') {\n      tags = _.merge(tags, { app_version: split.appVersion });\n    }\n    return tags;\n  };\n\n  service.captureEvent = function (eventName, properties) {\n    if (typeof eventName === 'undefined') {\n      throw new Error('Theta event name is undefined. You must specify an analytics-name on your DOM element.');\n    }\n    var eventProperties = angular.extend(defaultEventTags(), properties);\n\n    return theta.send({\n      event_types: [eventName],\n      event_data: eventProperties,\n      annotations: defaultAnnotations\n    }, defaultEventTags()).then(function () {\n      return true;\n    }, function () {\n      return false;\n    });\n  };\n\n  service.track = function () {\n    var properties = arguments.length <= 0 || arguments[0] === undefined ? {} : arguments[0];\n\n    var _ref = arguments.length <= 1 || arguments[1] === undefined ? { timeout: DEFAULT_TIMEOUT, skipGa: false } : arguments[1];\n\n    var timeout = _ref.timeout;\n    var skipGa = _ref.skipGa;\n\n    var options = { timeout: timeout, skipGa: skipGa };\n    var promises = {};\n    promises.ga = sendGaEvent(properties, options);\n    promises.theta = sendThetaEvent(properties, options);\n    return $q.all(promises);\n  };\n\n  var sendGaEvent = function sendGaEvent(properties, options) {\n    var deferred = $q.defer();\n\n    if (options.skipGa) {\n      deferred.resolve();\n      return deferred.promise;\n    }\n\n    if (properties && (!properties.gaEventCategory || !properties.gaEventAction)) {\n      var context = { properties: properties, options: options };\n      throwAnalyticsException('Google Analytics requires both a gaEventCategory and a gaEventAction.', context);\n      deferred.resolve();\n      return deferred.promise;\n    }\n\n    var eventOptions = {\n      eventCategory: properties.gaEventCategory,\n      eventAction: properties.gaEventAction,\n      eventLabel: properties.gaEventLabel,\n      eventValue: properties.gaEventValue\n    };\n\n    var listOfErrors = validateGaEvent(properties);\n    if (listOfErrors.length !== 0) {\n      throwAnalyticsException(listOfErrors.join('\\n'), { properties: properties, options: options });\n    }\n\n    ga('send', 'event', _.extend(eventOptions, { hitCallback: deferred.resolve }));\n\n    $timeout(deferred.resolve('timeout'), options.timeout);\n\n    return deferred.promise;\n  };\n\n  var submitThetaHttp = function submitThetaHttp(thetaName, thetaProperties, defaultAnnotations, deferred) {\n    theta.send({\n      event_types: [thetaName],\n      event_data: thetaProperties,\n      annotations: defaultAnnotations\n    }, defaultEventTags()).finally(function () {\n      deferred.resolve();\n    });\n  };\n\n  var sendThetaEvent = function sendThetaEvent(properties, options) {\n    var deferred = $q.defer();\n\n    properties = stripEmptyValuedKeys(properties);\n\n    if (!properties.thetaName) {\n      var context = { properties: properties, options: options };\n      throwAnalyticsException('Theta event name is undefined. You must specify a theta name in your track properties.', context);\n      deferred.resolve();\n      return deferred.promise;\n    }\n\n    var listOfInvalidations = validateThetaEvent(properties);\n    if (listOfInvalidations.length !== 0) {\n      throwAnalyticsException(listOfInvalidations.join('\\n'), { properties: properties, options: options });\n    }\n\n    var thetaName = properties.thetaName;\n    var inputProperties = convertKeysToSnakeCase(_.omit(properties, 'thetaName'));\n    var thetaProperties = _.extend(defaultEventTags(), inputProperties);\n\n    if (service._overrideSubmit) {\n      submitThetaHttp(thetaName, thetaProperties, defaultAnnotations, deferred);\n    } else {\n      igg.externalService(function () {\n        submitThetaHttp(thetaName, thetaProperties, defaultAnnotations, deferred);\n      });\n    }\n\n    $timeout(deferred.resolve('timeout'), options.timeout);\n\n    return deferred.promise;\n  };\n\n  var validateThetaEvent = function validateThetaEvent(properties) {\n    return errorList(thetaValidations(properties));\n  };\n  var validateGaEvent = function validateGaEvent(properties) {\n    return errorList(gaValidations(properties));\n  };\n\n  var errorList = function errorList(validations) {\n    return validations.filter(function (validation) {\n      return validation.condition === true;\n    }).map(function (validation) {\n      return validation.message;\n    });\n  };\n\n  var throwAnalyticsException = function throwAnalyticsException(errorMessage, context) {\n    var exception = new Error('[invalid event] ' + errorMessage);\n    iggAirbrake.handle(exception, null, { errorMessage: errorMessage, context: context });\n  };\n\n  var hasUnderscore = function hasUnderscore(string) {\n    return (/_/g.test(string)\n    );\n  };\n\n  var keysWithUnderscores = function keysWithUnderscores(properties) {\n    return Object.keys(properties).filter(hasUnderscore);\n  };\n\n  var hasKeysWithUnderscores = function hasKeysWithUnderscores(properties) {\n    return keysWithUnderscores(properties).length > 0;\n  };\n\n  var convertKeysToSnakeCase = function convertKeysToSnakeCase(properties) {\n    return _.reduce(properties, function (result, value, key) {\n      result[_.snakeCase(key)] = value;\n      return result;\n    }, {});\n  };\n\n  var isEmpty = function isEmpty(object) {\n    if (_.isFinite(object)) {\n      return false;\n    }\n\n    if (typeof object === 'boolean') {\n      return false;\n    }\n\n    return !object;\n  };\n\n  var stripEmptyValuedKeys = function stripEmptyValuedKeys(properties) {\n    return _.reduce(properties, function (result, value, key) {\n      if (!isEmpty(value)) {\n        result[key] = value;\n      }\n      return result;\n    }, {});\n  };\n\n  var sharedValidations = function sharedValidations(properties) {\n    return [{\n      condition: hasKeysWithUnderscores(properties),\n      message: 'Event properties cannot be formatted in snake_case. Offending properties include: [ ' + keysWithUnderscores(properties).join(\", \") + ' ]'\n    }];\n  };\n\n  var gaValidations = function gaValidations(properties) {\n    return [{\n      condition: properties.gaEventValue && !Number.isInteger(properties.gaEventValue),\n      message: 'GA value must be an integer.'\n    }].concat(sharedValidations(properties));\n  };\n\n  var thetaValidations = function thetaValidations(properties) {\n    return [{\n      condition: properties.hasOwnProperty('projectId') && !Number.isInteger(properties.projectId),\n      message: 'Theta Event projectId must be an integer.'\n    }, {\n      condition: properties.hasOwnProperty('pledgeId') && !Number.isInteger(properties.pledgeId),\n      message: 'Theta Event pledgeId must be an integer.'\n    }, {\n      condition: properties.hasOwnProperty('perkId') && !Number.isInteger(properties.perkId),\n      message: 'Theta Event perkId must be an integer.'\n    }, {\n      condition: properties.hasOwnProperty('accountId') && !Number.isInteger(properties.accountId),\n      message: 'Theta Event accountId must be an integer.'\n    }].concat(sharedValidations(properties));\n  };\n\n  return service;\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjkuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9hbmNpbGxhcnkvdXRpbHMvYW5hbHl0aWNzL2dvZ28tZXZlbnRzLXNlcnZpY2UuanM/YjE0NCJdLCJzb3VyY2VzQ29udGVudCI6WyIvKkBuZ0luamVjdCovXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdvZ29FdmVudHMoJGh0dHAsICRxLCAkdGltZW91dCwgZ29uLCBnYSwgdGhldGEsIGlnZ0FpcmJyYWtlLCBzcGxpdCwgXykge1xuICB2YXIgc2VydmljZSA9IHt9O1xuICB2YXIgZGVmYXVsdEFubm90YXRpb25zID0gW1xuICAgICdyZXF1ZXN0X3JlbW90ZV9pcCcsXG4gICAgJ3JlcXVlc3RfdXNlcl9hZ2VudCcsXG4gICAgJ3JlcXVlc3RfaG9zdCcsXG4gICAgJ3NvdXJjZV9ib3QnLFxuICAgICdzb3VyY2VfbG9jYWxlJyxcbiAgICAnc291cmNlX2NvdW50cnknLFxuICAgICdzb3VyY2VfcmVnaW9uJyxcbiAgICAnc291cmNlX2Jyb3dzZXInLFxuICAgICdzb3VyY2VfbW9iaWxlJyxcbiAgICAndmlzaXRvcl9pZCcsXG4gICAgJ3Nlc3Npb25faWQnXG4gIF07XG4gIHZhciBERUZBVUxUX1RJTUVPVVQgPSAyMDAwO1xuXG4gIHNlcnZpY2UuX292ZXJyaWRlU3VibWl0ID0gZmFsc2U7XG5cbiAgdmFyIGRlZmF1bHRFdmVudFRhZ3MgPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgdGFncyA9IF8uY2xvbmUoZ29uLmRlZmF1bHRfZXZlbnRfdGFncykgfHwge307XG4gICAgaWYgKHNwbGl0LmFwcFZlcnNpb24gIT09ICcnKSB7XG4gICAgICB0YWdzID0gXy5tZXJnZSh0YWdzLCB7IGFwcF92ZXJzaW9uOiBzcGxpdC5hcHBWZXJzaW9uIH0pO1xuICAgIH1cbiAgICByZXR1cm4gdGFncztcbiAgfTtcblxuICBzZXJ2aWNlLmNhcHR1cmVFdmVudCA9IGZ1bmN0aW9uIChldmVudE5hbWUsIHByb3BlcnRpZXMpIHtcbiAgICBpZiAodHlwZW9mKGV2ZW50TmFtZSkgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoZXRhIGV2ZW50IG5hbWUgaXMgdW5kZWZpbmVkLiBZb3UgbXVzdCBzcGVjaWZ5IGFuIGFuYWx5dGljcy1uYW1lIG9uIHlvdXIgRE9NIGVsZW1lbnQuJyk7XG4gICAgfVxuICAgIHZhciBldmVudFByb3BlcnRpZXMgPSBhbmd1bGFyLmV4dGVuZChkZWZhdWx0RXZlbnRUYWdzKCksIHByb3BlcnRpZXMpO1xuXG4gICAgcmV0dXJuIHRoZXRhLnNlbmQoe1xuICAgICAgICBldmVudF90eXBlczogW2V2ZW50TmFtZV0sXG4gICAgICAgIGV2ZW50X2RhdGE6IGV2ZW50UHJvcGVydGllcyxcbiAgICAgICAgYW5ub3RhdGlvbnM6IGRlZmF1bHRBbm5vdGF0aW9uc1xuICAgICAgfSwgZGVmYXVsdEV2ZW50VGFncygpKVxuICAgICAgLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH0sIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfSk7XG4gIH07XG5cbiAgc2VydmljZS50cmFjayA9IGZ1bmN0aW9uIChwcm9wZXJ0aWVzPXt9LCB7dGltZW91dCwgc2tpcEdhfT17dGltZW91dDogREVGQVVMVF9USU1FT1VULCBza2lwR2E6IGZhbHNlfSkge1xuICAgIHZhciBvcHRpb25zID0ge3RpbWVvdXQsIHNraXBHYX07XG4gICAgdmFyIHByb21pc2VzID0ge307XG4gICAgcHJvbWlzZXMuZ2EgPSBzZW5kR2FFdmVudChwcm9wZXJ0aWVzLCBvcHRpb25zKTtcbiAgICBwcm9taXNlcy50aGV0YSA9IHNlbmRUaGV0YUV2ZW50KHByb3BlcnRpZXMsIG9wdGlvbnMpO1xuICAgIHJldHVybiAkcS5hbGwocHJvbWlzZXMpO1xuICB9O1xuXG4gIHZhciBzZW5kR2FFdmVudCA9IChwcm9wZXJ0aWVzLCBvcHRpb25zKSA9PiB7XG4gICAgdmFyIGRlZmVycmVkID0gJHEuZGVmZXIoKTtcblxuICAgIGlmKG9wdGlvbnMuc2tpcEdhKSB7XG4gICAgICBkZWZlcnJlZC5yZXNvbHZlKCk7XG4gICAgICByZXR1cm4gZGVmZXJyZWQucHJvbWlzZTtcbiAgICB9XG5cbiAgICBpZiAocHJvcGVydGllcyAmJiAoIXByb3BlcnRpZXMuZ2FFdmVudENhdGVnb3J5IHx8ICFwcm9wZXJ0aWVzLmdhRXZlbnRBY3Rpb24pKSB7XG4gICAgICB2YXIgY29udGV4dCA9IHtwcm9wZXJ0aWVzLCBvcHRpb25zfTtcbiAgICAgIHRocm93QW5hbHl0aWNzRXhjZXB0aW9uKCdHb29nbGUgQW5hbHl0aWNzIHJlcXVpcmVzIGJvdGggYSBnYUV2ZW50Q2F0ZWdvcnkgYW5kIGEgZ2FFdmVudEFjdGlvbi4nLCBjb250ZXh0KTtcbiAgICAgIGRlZmVycmVkLnJlc29sdmUoKTtcbiAgICAgIHJldHVybiBkZWZlcnJlZC5wcm9taXNlO1xuICAgIH1cblxuICAgIHZhciBldmVudE9wdGlvbnMgPSB7XG4gICAgICBldmVudENhdGVnb3J5OiBwcm9wZXJ0aWVzLmdhRXZlbnRDYXRlZ29yeSxcbiAgICAgIGV2ZW50QWN0aW9uOiBwcm9wZXJ0aWVzLmdhRXZlbnRBY3Rpb24sXG4gICAgICBldmVudExhYmVsOiBwcm9wZXJ0aWVzLmdhRXZlbnRMYWJlbCxcbiAgICAgIGV2ZW50VmFsdWU6IHByb3BlcnRpZXMuZ2FFdmVudFZhbHVlXG4gICAgfTtcblxuICAgIHZhciBsaXN0T2ZFcnJvcnMgPSB2YWxpZGF0ZUdhRXZlbnQocHJvcGVydGllcyk7XG4gICAgaWYgKGxpc3RPZkVycm9ycy5sZW5ndGggIT09IDApIHtcbiAgICAgIHRocm93QW5hbHl0aWNzRXhjZXB0aW9uKGxpc3RPZkVycm9ycy5qb2luKCdcXG4nKSwgeyBwcm9wZXJ0aWVzLCBvcHRpb25zIH0pO1xuICAgIH1cblxuICAgIGdhKCdzZW5kJywgJ2V2ZW50JywgXy5leHRlbmQoZXZlbnRPcHRpb25zLCB7aGl0Q2FsbGJhY2s6IGRlZmVycmVkLnJlc29sdmV9KSk7XG5cbiAgICAkdGltZW91dChkZWZlcnJlZC5yZXNvbHZlKCd0aW1lb3V0JyksIG9wdGlvbnMudGltZW91dCk7XG5cbiAgICByZXR1cm4gZGVmZXJyZWQucHJvbWlzZTtcbiAgfTtcblxuICB2YXIgc3VibWl0VGhldGFIdHRwID0gKHRoZXRhTmFtZSwgdGhldGFQcm9wZXJ0aWVzLCBkZWZhdWx0QW5ub3RhdGlvbnMsIGRlZmVycmVkKSA9PiB7XG4gICAgdGhldGEuc2VuZCh7XG4gICAgICBldmVudF90eXBlczogW3RoZXRhTmFtZV0sXG4gICAgICBldmVudF9kYXRhOiB0aGV0YVByb3BlcnRpZXMsXG4gICAgICBhbm5vdGF0aW9uczogZGVmYXVsdEFubm90YXRpb25zXG4gICAgfSwgZGVmYXVsdEV2ZW50VGFncygpKS5maW5hbGx5KCgpID0+IHtcbiAgICAgIGRlZmVycmVkLnJlc29sdmUoKTtcbiAgICB9KTtcbiAgfTtcblxuICB2YXIgc2VuZFRoZXRhRXZlbnQgPSAocHJvcGVydGllcywgb3B0aW9ucykgPT4ge1xuICAgIHZhciBkZWZlcnJlZCA9ICRxLmRlZmVyKCk7XG5cbiAgICBwcm9wZXJ0aWVzID0gc3RyaXBFbXB0eVZhbHVlZEtleXMocHJvcGVydGllcyk7XG5cbiAgICBpZiAoIXByb3BlcnRpZXMudGhldGFOYW1lKSB7XG4gICAgICB2YXIgY29udGV4dCA9IHtwcm9wZXJ0aWVzLCBvcHRpb25zfTtcbiAgICAgIHRocm93QW5hbHl0aWNzRXhjZXB0aW9uKCdUaGV0YSBldmVudCBuYW1lIGlzIHVuZGVmaW5lZC4gWW91IG11c3Qgc3BlY2lmeSBhIHRoZXRhIG5hbWUgaW4geW91ciB0cmFjayBwcm9wZXJ0aWVzLicsIGNvbnRleHQpO1xuICAgICAgZGVmZXJyZWQucmVzb2x2ZSgpO1xuICAgICAgcmV0dXJuIGRlZmVycmVkLnByb21pc2U7XG4gICAgfVxuXG4gICAgdmFyIGxpc3RPZkludmFsaWRhdGlvbnMgPSB2YWxpZGF0ZVRoZXRhRXZlbnQocHJvcGVydGllcyk7XG4gICAgaWYgKGxpc3RPZkludmFsaWRhdGlvbnMubGVuZ3RoICE9PSAwKSB7XG4gICAgICB0aHJvd0FuYWx5dGljc0V4Y2VwdGlvbihsaXN0T2ZJbnZhbGlkYXRpb25zLmpvaW4oJ1xcbicpLCB7cHJvcGVydGllcywgb3B0aW9uc30pO1xuICAgIH1cblxuICAgIHZhciB0aGV0YU5hbWUgPSBwcm9wZXJ0aWVzLnRoZXRhTmFtZTtcbiAgICB2YXIgaW5wdXRQcm9wZXJ0aWVzID0gY29udmVydEtleXNUb1NuYWtlQ2FzZShfLm9taXQocHJvcGVydGllcywgJ3RoZXRhTmFtZScpKTtcbiAgICB2YXIgdGhldGFQcm9wZXJ0aWVzID0gXy5leHRlbmQoXG4gICAgICBkZWZhdWx0RXZlbnRUYWdzKCksXG4gICAgICBpbnB1dFByb3BlcnRpZXNcbiAgICApO1xuXG4gICAgaWYoc2VydmljZS5fb3ZlcnJpZGVTdWJtaXQpIHtcbiAgICAgIHN1Ym1pdFRoZXRhSHR0cCh0aGV0YU5hbWUsIHRoZXRhUHJvcGVydGllcywgZGVmYXVsdEFubm90YXRpb25zLCBkZWZlcnJlZCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlnZy5leHRlcm5hbFNlcnZpY2UoZnVuY3Rpb24oKSB7XG4gICAgICAgIHN1Ym1pdFRoZXRhSHR0cCh0aGV0YU5hbWUsIHRoZXRhUHJvcGVydGllcywgZGVmYXVsdEFubm90YXRpb25zLCBkZWZlcnJlZCk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAkdGltZW91dChkZWZlcnJlZC5yZXNvbHZlKCd0aW1lb3V0JyksIG9wdGlvbnMudGltZW91dCk7XG5cbiAgICByZXR1cm4gZGVmZXJyZWQucHJvbWlzZTtcbiAgfTtcblxuICB2YXIgdmFsaWRhdGVUaGV0YUV2ZW50ID0gcHJvcGVydGllcyA9PiBlcnJvckxpc3QodGhldGFWYWxpZGF0aW9ucyhwcm9wZXJ0aWVzKSk7XG4gIHZhciB2YWxpZGF0ZUdhRXZlbnQgPSBwcm9wZXJ0aWVzID0+IGVycm9yTGlzdChnYVZhbGlkYXRpb25zKHByb3BlcnRpZXMpKTtcblxuICB2YXIgZXJyb3JMaXN0ID0gdmFsaWRhdGlvbnMgPT4ge1xuICAgIHJldHVybiB2YWxpZGF0aW9uc1xuICAgICAgLmZpbHRlciggdmFsaWRhdGlvbiA9PiB2YWxpZGF0aW9uLmNvbmRpdGlvbiA9PT0gdHJ1ZSlcbiAgICAgIC5tYXAoIHZhbGlkYXRpb24gPT4gdmFsaWRhdGlvbi5tZXNzYWdlICk7XG4gIH07XG5cbiAgdmFyIHRocm93QW5hbHl0aWNzRXhjZXB0aW9uID0gKGVycm9yTWVzc2FnZSwgY29udGV4dCk9PiB7XG4gICAgdmFyIGV4Y2VwdGlvbiA9IG5ldyBFcnJvcignW2ludmFsaWQgZXZlbnRdICcgKyBlcnJvck1lc3NhZ2UpO1xuICAgIGlnZ0FpcmJyYWtlLmhhbmRsZShleGNlcHRpb24sIG51bGwsIHtlcnJvck1lc3NhZ2UsIGNvbnRleHR9KTtcbiAgfTtcblxuICB2YXIgaGFzVW5kZXJzY29yZSA9IHN0cmluZyA9PiAvXy9nLnRlc3Qoc3RyaW5nKTtcblxuICB2YXIga2V5c1dpdGhVbmRlcnNjb3JlcyA9IHByb3BlcnRpZXMgPT4ge1xuICAgIHJldHVybiBPYmplY3Qua2V5cyhwcm9wZXJ0aWVzKS5maWx0ZXIoaGFzVW5kZXJzY29yZSk7XG4gIH07XG5cbiAgdmFyIGhhc0tleXNXaXRoVW5kZXJzY29yZXMgPSBwcm9wZXJ0aWVzID0+IHtcbiAgICByZXR1cm4gKGtleXNXaXRoVW5kZXJzY29yZXMocHJvcGVydGllcykubGVuZ3RoID4gMCk7XG4gIH07XG5cbiAgdmFyIGNvbnZlcnRLZXlzVG9TbmFrZUNhc2UgPSBwcm9wZXJ0aWVzID0+IHtcbiAgICByZXR1cm4gXy5yZWR1Y2UocHJvcGVydGllcywgZnVuY3Rpb24gKHJlc3VsdCwgdmFsdWUsIGtleSkge1xuICAgICAgcmVzdWx0W18uc25ha2VDYXNlKGtleSldID0gdmFsdWU7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0sIHt9KTtcbiAgfTtcblxuICB2YXIgaXNFbXB0eSA9IG9iamVjdCA9PiB7XG4gICAgaWYgKF8uaXNGaW5pdGUob2JqZWN0KSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2Ygb2JqZWN0ID09PSAnYm9vbGVhbicpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICByZXR1cm4gIW9iamVjdDtcbiAgfTtcblxuICB2YXIgc3RyaXBFbXB0eVZhbHVlZEtleXMgPSBwcm9wZXJ0aWVzID0+IHtcbiAgICByZXR1cm4gXy5yZWR1Y2UocHJvcGVydGllcywgZnVuY3Rpb24gKHJlc3VsdCwgdmFsdWUsIGtleSkge1xuICAgICAgaWYgKCFpc0VtcHR5KHZhbHVlKSkge1xuICAgICAgICByZXN1bHRba2V5XSA9IHZhbHVlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9LCB7fSk7XG4gIH07XG5cbiAgdmFyIHNoYXJlZFZhbGlkYXRpb25zID0gcHJvcGVydGllcyA9PiB7XG4gICAgcmV0dXJuIFtcbiAgICAgIHtcbiAgICAgICAgY29uZGl0aW9uOiBoYXNLZXlzV2l0aFVuZGVyc2NvcmVzKHByb3BlcnRpZXMpLFxuICAgICAgICBtZXNzYWdlOiAnRXZlbnQgcHJvcGVydGllcyBjYW5ub3QgYmUgZm9ybWF0dGVkIGluIHNuYWtlX2Nhc2UuIE9mZmVuZGluZyBwcm9wZXJ0aWVzIGluY2x1ZGU6IFsgJyArIGtleXNXaXRoVW5kZXJzY29yZXMocHJvcGVydGllcykuam9pbihcIiwgXCIpICsgJyBdJ1xuICAgICAgfVxuICAgIF07XG4gIH07XG5cbiAgdmFyIGdhVmFsaWRhdGlvbnMgPSBwcm9wZXJ0aWVzID0+IHtcbiAgICByZXR1cm4gW1xuICAgICAge1xuICAgICAgICBjb25kaXRpb246IHByb3BlcnRpZXMuZ2FFdmVudFZhbHVlICYmICFOdW1iZXIuaXNJbnRlZ2VyKHByb3BlcnRpZXMuZ2FFdmVudFZhbHVlKSxcbiAgICAgICAgbWVzc2FnZTogJ0dBIHZhbHVlIG11c3QgYmUgYW4gaW50ZWdlci4nXG4gICAgICB9XG4gICAgXS5jb25jYXQoc2hhcmVkVmFsaWRhdGlvbnMocHJvcGVydGllcykpO1xuICB9O1xuXG4gIHZhciB0aGV0YVZhbGlkYXRpb25zID0gcHJvcGVydGllcyA9PiB7XG4gICAgcmV0dXJuIFtcbiAgICAgIHtcbiAgICAgICAgY29uZGl0aW9uOiAocHJvcGVydGllcy5oYXNPd25Qcm9wZXJ0eSgncHJvamVjdElkJykgJiYgIU51bWJlci5pc0ludGVnZXIocHJvcGVydGllcy5wcm9qZWN0SWQpKSxcbiAgICAgICAgbWVzc2FnZTogJ1RoZXRhIEV2ZW50IHByb2plY3RJZCBtdXN0IGJlIGFuIGludGVnZXIuJ1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgY29uZGl0aW9uOiAocHJvcGVydGllcy5oYXNPd25Qcm9wZXJ0eSgncGxlZGdlSWQnKSAmJiAhTnVtYmVyLmlzSW50ZWdlcihwcm9wZXJ0aWVzLnBsZWRnZUlkKSksXG4gICAgICAgIG1lc3NhZ2U6ICdUaGV0YSBFdmVudCBwbGVkZ2VJZCBtdXN0IGJlIGFuIGludGVnZXIuJ1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgY29uZGl0aW9uOiAocHJvcGVydGllcy5oYXNPd25Qcm9wZXJ0eSgncGVya0lkJykgJiYgIU51bWJlci5pc0ludGVnZXIocHJvcGVydGllcy5wZXJrSWQpKSxcbiAgICAgICAgbWVzc2FnZTogJ1RoZXRhIEV2ZW50IHBlcmtJZCBtdXN0IGJlIGFuIGludGVnZXIuJ1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgY29uZGl0aW9uOiAocHJvcGVydGllcy5oYXNPd25Qcm9wZXJ0eSgnYWNjb3VudElkJykgJiYgIU51bWJlci5pc0ludGVnZXIocHJvcGVydGllcy5hY2NvdW50SWQpKSxcbiAgICAgICAgbWVzc2FnZTogJ1RoZXRhIEV2ZW50IGFjY291bnRJZCBtdXN0IGJlIGFuIGludGVnZXIuJ1xuICAgICAgfVxuICAgIF0uY29uY2F0KHNoYXJlZFZhbGlkYXRpb25zKHByb3BlcnRpZXMpKTtcbiAgfTtcblxuICByZXR1cm4gc2VydmljZTtcbn1cblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIC4vYW5jaWxsYXJ5L3V0aWxzL2FuYWx5dGljcy9nb2dvLWV2ZW50cy1zZXJ2aWNlLmpzXG4gKiovIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBOztBQUNBO0FBQ0E7O0FBRUE7OztBQUhBO0FBQ0E7QUFDQTtBQWFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7OztBQUdBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTs7OztBQUlBO0FBTkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUFJQTtBQUNBO0FBQ0E7OztBQUdBO0FBRkE7O0FBR0E7QUFBQTs7O0FBRUE7QUFDQTtBQUVBO0FBQUE7QUFFQTs7OztBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFJQTs7OztBQUZBO0FBQ0E7OztBQUdBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTs7O0FBR0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7OztBQUdBO0FBQ0E7QUFFQTtBQUNBOzs7O0FBS0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTs7O0FBR0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTs7O0FBR0E7QUFqT0EiLCJzb3VyY2VSb290IjoiIn0=");

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

	eval("'use strict';\n\ngoogleAnalytics.$inject = [\"ga\"];\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = googleAnalytics;\n/*@ngInject*/\nfunction googleAnalytics(ga) {\n  function sendGAEvent(scope, ga, target) {\n    var params = ['category', 'action', 'label', 'value'];\n    var gaArgs = ['send', 'event'];\n\n    var perform = scope.performIf();\n    if (perform === undefined) {\n      // if not present, perform unconditionally\n      perform = true;\n    }\n    if (!perform) {\n      // skip submitting this event because criteria aren't right\n      return;\n    }\n\n    // Add Category, Action, Label, and Value GA parameters, in this order.\n    // Stop looking and proceed when any of the four are not present.\n    for (var i = 0; i < params.length; i++) {\n      var val = scope.$eval(params[i]);\n\n      if (!val) {\n        // skip if parameter not present\n        break;\n      }\n\n      gaArgs.push(val);\n    }\n\n    // only send events that have a category (3rd argument)\n    if (gaArgs.length > 2) {\n      ga.apply(target, gaArgs);\n    }\n  }\n\n  return {\n    restrict: 'A',\n    scope: {\n      category: '@gaEventCategory',\n      action: '@gaEventAction',\n      label: '@gaEventLabel',\n      value: '@gaEventValue',\n      performIf: '&gaEventIf'\n    },\n    link: function link(scope, element, attrs) {\n      // jQuery DOM event like click, blur, hover\n      var onEvent = attrs.gaEventOn.toLowerCase();\n      if (onEvent === 'load') {\n        sendGAEvent(scope, ga, this);\n      } else {\n        element.bind(onEvent, function () {\n          sendGAEvent(scope, ga, this);\n        });\n      }\n    }\n  };\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNzAuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9hbmNpbGxhcnkvdXRpbHMvYW5hbHl0aWNzL2dvb2dsZS1hbmFseXRpY3MtZGlyZWN0aXZlLmpzPzRhNzEiXSwic291cmNlc0NvbnRlbnQiOlsiLypAbmdJbmplY3QqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZ29vZ2xlQW5hbHl0aWNzKGdhKSB7XG4gIGZ1bmN0aW9uIHNlbmRHQUV2ZW50KHNjb3BlLCBnYSwgdGFyZ2V0KSB7XG4gICAgICB2YXIgcGFyYW1zID0gWydjYXRlZ29yeScsICdhY3Rpb24nLCAnbGFiZWwnLCAndmFsdWUnXTtcbiAgICAgIHZhciBnYUFyZ3MgPSBbJ3NlbmQnLCAnZXZlbnQnXTtcblxuICAgICAgdmFyIHBlcmZvcm0gPSBzY29wZS5wZXJmb3JtSWYoKTtcbiAgICAgIGlmIChwZXJmb3JtID09PSB1bmRlZmluZWQpIHsgLy8gaWYgbm90IHByZXNlbnQsIHBlcmZvcm0gdW5jb25kaXRpb25hbGx5XG4gICAgICAgICAgcGVyZm9ybSA9IHRydWU7XG4gICAgICB9XG4gICAgICBpZiAoIXBlcmZvcm0pIHsgLy8gc2tpcCBzdWJtaXR0aW5nIHRoaXMgZXZlbnQgYmVjYXVzZSBjcml0ZXJpYSBhcmVuJ3QgcmlnaHRcbiAgICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIEFkZCBDYXRlZ29yeSwgQWN0aW9uLCBMYWJlbCwgYW5kIFZhbHVlIEdBIHBhcmFtZXRlcnMsIGluIHRoaXMgb3JkZXIuXG4gICAgICAvLyBTdG9wIGxvb2tpbmcgYW5kIHByb2NlZWQgd2hlbiBhbnkgb2YgdGhlIGZvdXIgYXJlIG5vdCBwcmVzZW50LlxuICAgICAgZm9yICh2YXIgaT0wOyBpIDwgcGFyYW1zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgdmFyIHZhbCA9IHNjb3BlLiRldmFsKHBhcmFtc1tpXSk7XG5cbiAgICAgICAgICBpZiAoIXZhbCApIHsgLy8gc2tpcCBpZiBwYXJhbWV0ZXIgbm90IHByZXNlbnRcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgZ2FBcmdzLnB1c2godmFsKTtcbiAgICAgIH1cblxuICAgICAgLy8gb25seSBzZW5kIGV2ZW50cyB0aGF0IGhhdmUgYSBjYXRlZ29yeSAoM3JkIGFyZ3VtZW50KVxuICAgICAgaWYgKGdhQXJncy5sZW5ndGggPiAyKSB7XG4gICAgICAgICAgZ2EuYXBwbHkodGFyZ2V0LCBnYUFyZ3MpO1xuICAgICAgfVxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICByZXN0cmljdDogJ0EnLFxuICAgIHNjb3BlOiB7XG4gICAgICBjYXRlZ29yeTogJ0BnYUV2ZW50Q2F0ZWdvcnknLFxuICAgICAgYWN0aW9uOiAnQGdhRXZlbnRBY3Rpb24nLFxuICAgICAgbGFiZWw6ICdAZ2FFdmVudExhYmVsJyxcbiAgICAgIHZhbHVlOiAnQGdhRXZlbnRWYWx1ZScsXG4gICAgICBwZXJmb3JtSWY6ICcmZ2FFdmVudElmJ1xuICAgIH0sXG4gICAgbGluazogZnVuY3Rpb24oc2NvcGUsIGVsZW1lbnQsIGF0dHJzKSB7XG4gICAgICAvLyBqUXVlcnkgRE9NIGV2ZW50IGxpa2UgY2xpY2ssIGJsdXIsIGhvdmVyXG4gICAgICB2YXIgb25FdmVudCA9IGF0dHJzLmdhRXZlbnRPbi50b0xvd2VyQ2FzZSgpO1xuICAgICAgaWYgKG9uRXZlbnQgPT09ICdsb2FkJykge1xuICAgICAgICBzZW5kR0FFdmVudChzY29wZSwgZ2EsIHRoaXMpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZWxlbWVudC5iaW5kKG9uRXZlbnQsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBzZW5kR0FFdmVudChzY29wZSwgZ2EsIHRoaXMpO1xuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgIH1cbiAgfTtcbn1cblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIC4vYW5jaWxsYXJ5L3V0aWxzL2FuYWx5dGljcy9nb29nbGUtYW5hbHl0aWNzLWRpcmVjdGl2ZS5qc1xuICoqLyJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTs7QUFDQTtBQUNBOztBQUVBOztBQUpBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUNBOztBQUVBOztBQUNBOzs7OztBQVRBO0FBZUE7QUFDQTtBQUNBOztBQUNBOzs7QUFHQTs7OztBQXJCQTtBQTBCQTs7OztBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7OztBQS9DQSIsInNvdXJjZVJvb3QiOiIifQ==");

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

	eval("'use strict';\n\nsafeGa.$inject = [\"ga\", \"$timeout\"];\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = safeGa;\n/*@ngInject*/\n// TODO EVENTS: id=ooc6b fixtype=infra subsystem=analytics . safeGa functionality stays but is less exposed\nfunction safeGa(ga, $timeout) {\n  this.sendEvent = function (action, category, label, callback) {\n    if (typeof callback === 'undefined') {\n      callback = angular.noop;\n    }\n\n    // wrap the callback https://developers.google.com/analytics/devguides/collection/analyticsjs/field-reference#hitCallback\n    var alreadyCalled = false;\n    function callMeOnce() {\n      if (alreadyCalled) return;\n      alreadyCalled = true;\n      callback();\n    }\n\n    ga('send', 'event', action, category, label, {\n      hitCallback: callMeOnce\n    });\n\n    // make sure callback happens after 2 seconds even if something with ga went catastrophically wrong\n    $timeout(callMeOnce, 2000);\n  };\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNzEuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9hbmNpbGxhcnkvdXRpbHMvYW5hbHl0aWNzL3NhZmUtZ2Etc2VydmljZS5qcz83YzFmIl0sInNvdXJjZXNDb250ZW50IjpbIi8qQG5nSW5qZWN0Ki9cbi8vIFRPRE8gRVZFTlRTOiBpZD1vb2M2YiBmaXh0eXBlPWluZnJhIHN1YnN5c3RlbT1hbmFseXRpY3MgLiBzYWZlR2EgZnVuY3Rpb25hbGl0eSBzdGF5cyBidXQgaXMgbGVzcyBleHBvc2VkXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBzYWZlR2EgKGdhLCAkdGltZW91dCkge1xuICAgIHRoaXMuc2VuZEV2ZW50ID0gZnVuY3Rpb24oYWN0aW9uLCBjYXRlZ29yeSwgbGFiZWwsIGNhbGxiYWNrKSB7XG4gICAgICBpZiAodHlwZW9mIGNhbGxiYWNrID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICBjYWxsYmFjayA9IGFuZ3VsYXIubm9vcDtcbiAgICAgIH1cblxuICAgICAgLy8gd3JhcCB0aGUgY2FsbGJhY2sgaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vYW5hbHl0aWNzL2Rldmd1aWRlcy9jb2xsZWN0aW9uL2FuYWx5dGljc2pzL2ZpZWxkLXJlZmVyZW5jZSNoaXRDYWxsYmFja1xuICAgICAgdmFyIGFscmVhZHlDYWxsZWQgPSBmYWxzZTtcbiAgICAgIGZ1bmN0aW9uIGNhbGxNZU9uY2UoKSB7XG4gICAgICAgIGlmIChhbHJlYWR5Q2FsbGVkKSByZXR1cm47XG4gICAgICAgIGFscmVhZHlDYWxsZWQgPSB0cnVlO1xuICAgICAgICBjYWxsYmFjaygpO1xuICAgICAgfVxuXG4gICAgICBnYSgnc2VuZCcsICdldmVudCcsIGFjdGlvbiwgY2F0ZWdvcnksIGxhYmVsLCB7XG4gICAgICAgIGhpdENhbGxiYWNrOiBjYWxsTWVPbmNlXG4gICAgICB9KTtcblxuICAgICAgLy8gbWFrZSBzdXJlIGNhbGxiYWNrIGhhcHBlbnMgYWZ0ZXIgMiBzZWNvbmRzIGV2ZW4gaWYgc29tZXRoaW5nIHdpdGggZ2Egd2VudCBjYXRhc3Ryb3BoaWNhbGx5IHdyb25nXG4gICAgICAkdGltZW91dChjYWxsTWVPbmNlLCAyMDAwKTtcbiAgICB9O1xuICB9XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiAuL2FuY2lsbGFyeS91dGlscy9hbmFseXRpY3Mvc2FmZS1nYS1zZXJ2aWNlLmpzXG4gKiovIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBOztBQUNBO0FBQ0E7O0FBRUE7OztBQUhBO0FBQ0E7QUFDQTtBQUNBOzs7O0FBRkE7QUFPQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTs7OztBQWRBOztBQURBIiwic291cmNlUm9vdCI6IiJ9");

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

	eval("'use strict';\n\ntheta.$inject = [\"$http\", \"$cookies\", \"$log\", \"$q\"];\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = theta;\n/*@ngInject*/\nfunction theta($http, $cookies, $log, $q) {\n  var service = {};\n\n  //event = {\n  //  event_types: [string1, string2, ...],\n  //  event_data: {key1: value1, key2: value2, ...},\n  //  annotations: [string1, string2, ... ]\n  //};\n  service.send = function (event, eventTags) {\n    var deferred = $q.defer();\n    var thetaName = event.event_types[0];\n    logThetaEvent(thetaName, event.event_data, eventTags);\n    $http.post('/analytics/events/batch', { events: [event] }).then(function () {\n      logThetaSuccess(thetaName);\n      deferred.resolve('success');\n    }, function () {\n      logThetaFailure(thetaName);\n      deferred.reject('failure');\n    });\n    return deferred.promise;\n  };\n\n  var logThetaEvent = function logThetaEvent(thetaName, properties, eventTags) {\n    logAnalytics(function () {\n      console.group(\"Sending Theta Event: \" + thetaName);\n      console.group(\"Input Properties\");\n      var inputProperties = stripDefaultEventTags(properties, eventTags);\n      _.forEach(inputProperties, function (value, key) {\n        $log.info(\"%c\" + key, \"font-weight:bold;\", \"\\n\" + value);\n      });\n      console.groupEnd();\n      console.groupCollapsed(\"Default Events and Annotations\");\n      _.forEach(eventTags, function (value, key) {\n        $log.info(\"%c\" + key, \"font-weight:bold;\", \"\\n\" + value);\n      });\n      console.groupEnd();\n      console.groupEnd();\n    });\n  };\n\n  var stripDefaultEventTags = function stripDefaultEventTags(properties, eventTags) {\n    return _.reduce(properties, function (result, value, key) {\n      if (!_.keys(eventTags).includes(key)) {\n        result[key] = value;\n      }\n      return result;\n    }, {});\n  };\n\n  var logThetaFailure = function logThetaFailure(thetaName) {\n    logAnalytics(function () {\n      $log.info(\"%cTheta Event: \" + thetaName + \" - Failed\", \"color: Red\");\n    });\n  };\n\n  var logThetaSuccess = function logThetaSuccess(thetaName) {\n    logAnalytics(function () {\n      $log.info(\"%cTheta Event: \" + thetaName + \" - Succeeded\", \"color: Green\");\n    });\n  };\n\n  var analyticsDebug = function analyticsDebug() {\n    return $cookies.get('analytics_debug') === '1';\n  };\n\n  var logAnalytics = function logAnalytics(func) {\n    if (analyticsDebug()) {\n      func();\n    }\n  };\n\n  return service;\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNzIuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9hbmNpbGxhcnkvdXRpbHMvYW5hbHl0aWNzL3RoZXRhLXNlcnZpY2UuanM/OGEzNCJdLCJzb3VyY2VzQ29udGVudCI6WyIvKkBuZ0luamVjdCovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB0aGV0YSgkaHR0cCwgJGNvb2tpZXMsICRsb2csICRxKSB7XG4gIHZhciBzZXJ2aWNlID0ge307XG5cbiAgLy9ldmVudCA9IHtcbiAgLy8gIGV2ZW50X3R5cGVzOiBbc3RyaW5nMSwgc3RyaW5nMiwgLi4uXSxcbiAgLy8gIGV2ZW50X2RhdGE6IHtrZXkxOiB2YWx1ZTEsIGtleTI6IHZhbHVlMiwgLi4ufSxcbiAgLy8gIGFubm90YXRpb25zOiBbc3RyaW5nMSwgc3RyaW5nMiwgLi4uIF1cbiAgLy99O1xuICBzZXJ2aWNlLnNlbmQgPSAoZXZlbnQsIGV2ZW50VGFncykgPT4ge1xuICAgIHZhciBkZWZlcnJlZCA9ICRxLmRlZmVyKCk7XG4gICAgdmFyIHRoZXRhTmFtZSA9IGV2ZW50LmV2ZW50X3R5cGVzWzBdO1xuICAgIGxvZ1RoZXRhRXZlbnQodGhldGFOYW1lLCBldmVudC5ldmVudF9kYXRhLCBldmVudFRhZ3MpO1xuICAgICRodHRwLnBvc3QoJy9hbmFseXRpY3MvZXZlbnRzL2JhdGNoJywge2V2ZW50czogW2V2ZW50XX0pLnRoZW4oKCkgPT4ge1xuICAgICAgbG9nVGhldGFTdWNjZXNzKHRoZXRhTmFtZSk7XG4gICAgICBkZWZlcnJlZC5yZXNvbHZlKCdzdWNjZXNzJyk7XG4gICAgfSwgKCkgPT4ge1xuICAgICAgbG9nVGhldGFGYWlsdXJlKHRoZXRhTmFtZSk7XG4gICAgICBkZWZlcnJlZC5yZWplY3QoJ2ZhaWx1cmUnKTtcbiAgICB9KTtcbiAgICByZXR1cm4gZGVmZXJyZWQucHJvbWlzZTtcbiAgfTtcblxuICB2YXIgbG9nVGhldGFFdmVudCA9ICh0aGV0YU5hbWUsIHByb3BlcnRpZXMsIGV2ZW50VGFncykgPT4ge1xuICAgIGxvZ0FuYWx5dGljcyhmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zb2xlLmdyb3VwKFwiU2VuZGluZyBUaGV0YSBFdmVudDogXCIgKyB0aGV0YU5hbWUpO1xuICAgICAgY29uc29sZS5ncm91cChcIklucHV0IFByb3BlcnRpZXNcIik7XG4gICAgICB2YXIgaW5wdXRQcm9wZXJ0aWVzID0gc3RyaXBEZWZhdWx0RXZlbnRUYWdzKHByb3BlcnRpZXMsIGV2ZW50VGFncyk7XG4gICAgICBfLmZvckVhY2goaW5wdXRQcm9wZXJ0aWVzLCBmdW5jdGlvbih2YWx1ZSwga2V5KSB7XG4gICAgICAgICRsb2cuaW5mbyhcIiVjXCIgKyBrZXksIFwiZm9udC13ZWlnaHQ6Ym9sZDtcIiwgXCJcXG5cIiArIHZhbHVlKTtcbiAgICAgIH0pO1xuICAgICAgY29uc29sZS5ncm91cEVuZCgpO1xuICAgICAgY29uc29sZS5ncm91cENvbGxhcHNlZChcIkRlZmF1bHQgRXZlbnRzIGFuZCBBbm5vdGF0aW9uc1wiKTtcbiAgICAgIF8uZm9yRWFjaChldmVudFRhZ3MsIGZ1bmN0aW9uKHZhbHVlLCBrZXkpIHtcbiAgICAgICAgJGxvZy5pbmZvKFwiJWNcIiArIGtleSwgXCJmb250LXdlaWdodDpib2xkO1wiLCBcIlxcblwiICsgdmFsdWUpO1xuICAgICAgfSk7XG4gICAgICBjb25zb2xlLmdyb3VwRW5kKCk7XG4gICAgICBjb25zb2xlLmdyb3VwRW5kKCk7XG4gICAgfSk7XG4gIH07XG5cbiAgdmFyIHN0cmlwRGVmYXVsdEV2ZW50VGFncyA9IChwcm9wZXJ0aWVzLCBldmVudFRhZ3MpID0+IHtcbiAgICByZXR1cm4gXy5yZWR1Y2UocHJvcGVydGllcywgZnVuY3Rpb24gKHJlc3VsdCwgdmFsdWUsIGtleSkge1xuICAgICAgaWYgKCFfLmtleXMoZXZlbnRUYWdzKS5pbmNsdWRlcyhrZXkpKSB7XG4gICAgICAgIHJlc3VsdFtrZXldID0gdmFsdWU7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0sIHt9KTtcbiAgfTtcblxuICB2YXIgbG9nVGhldGFGYWlsdXJlID0gdGhldGFOYW1lID0+IHtcbiAgICBsb2dBbmFseXRpY3MoZnVuY3Rpb24gKCkge1xuICAgICAgJGxvZy5pbmZvKFwiJWNUaGV0YSBFdmVudDogXCIgKyB0aGV0YU5hbWUgKyBcIiAtIEZhaWxlZFwiLCBcImNvbG9yOiBSZWRcIik7XG4gICAgfSk7XG4gIH07XG5cbiAgdmFyIGxvZ1RoZXRhU3VjY2VzcyA9IHRoZXRhTmFtZSA9PiB7XG4gICAgbG9nQW5hbHl0aWNzKGZ1bmN0aW9uICgpIHtcbiAgICAgICRsb2cuaW5mbyhcIiVjVGhldGEgRXZlbnQ6IFwiICsgdGhldGFOYW1lICsgXCIgLSBTdWNjZWVkZWRcIiwgXCJjb2xvcjogR3JlZW5cIik7XG4gICAgfSk7XG4gIH07XG5cbiAgdmFyIGFuYWx5dGljc0RlYnVnID0gKCkgPT4ge1xuICAgIHJldHVybiAoJGNvb2tpZXMuZ2V0KCdhbmFseXRpY3NfZGVidWcnKSA9PT0gJzEnKTtcbiAgfTtcblxuICB2YXIgbG9nQW5hbHl0aWNzID0gZnVuY3Rpb24oZnVuYykge1xuICAgIGlmIChhbmFseXRpY3NEZWJ1ZygpKSB7IGZ1bmMoKTsgfVxuICB9O1xuXG4gIHJldHVybiBzZXJ2aWNlO1xufVxuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogLi9hbmNpbGxhcnkvdXRpbHMvYW5hbHl0aWNzL3RoZXRhLXNlcnZpY2UuanNcbiAqKi8iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7O0FBQ0E7QUFDQTs7QUFFQTs7QUFKQTtBQUNBO0FBQ0E7Ozs7OztBQUZBO0FBU0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOzs7O0FBSUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7O0FBR0E7QUFDQTtBQUNBOzs7O0FBSUE7QUFDQTtBQUNBOzs7O0FBSUE7QUFDQTs7O0FBR0E7QUFDQTtBQUFBOzs7O0FBR0E7QUFyRUEiLCJzb3VyY2VSb290IjoiIn0=");

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

	eval("'use strict';\n\nbackupBeforeUnloadService.$inject = [\"_\", \"$window\"];\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = backupBeforeUnloadService;\n/*@ngInject*/\nfunction backupBeforeUnloadService(_, $window) {\n  var self = this;\n  var _objects = {};\n  var storageElement = angular.element('#contribution-backup input');\n\n  function setStorageElement(element) {\n    storageElement = element;\n  }\n\n  function saveJson(json) {\n    return storageElement.val(json);\n  }\n\n  function loadJson() {\n    return storageElement.val();\n  }\n\n  function saveState() {\n    var current = {};\n\n    _.each(_.keys(_objects), function (objectName) {\n      var objectToBackup;\n      if (typeof _objects[objectName] === 'function') {\n        objectToBackup = _objects[objectName]();\n      } else {\n        objectToBackup = _objects[objectName];\n      }\n\n      if (!_.isUndefined(objectToBackup.campaign)) {\n        //TODO: make backupservice smart enough to not save certain unwanted attributes.\n        delete objectToBackup.campaign;\n      }\n\n      current[objectName] = objectToBackup;\n    });\n    var json = JSON.stringify(current);\n    self.saveJson(json);\n  }\n\n  function restoreStateIfSaved(objectName, object) {\n    try {\n      var data = JSON.parse(self.loadJson());\n      var objectToRestore = data[objectName];\n      if (!_.isUndefined(objectToRestore.campaign)) {\n        //TODO: make backupservice smart enough to not save certain unwanted attributes.\n        delete objectToRestore.campaign;\n      }\n      _.merge(object, objectToRestore);\n      return true;\n    } catch (e) {\n      return false;\n    }\n  }\n\n  function register(obj) {\n    _.merge(_objects, obj);\n  }\n\n  function pointerRegister(obj) {\n    for (var key in obj) {\n      _objects[key] = obj[key];\n    }\n  }\n\n  _.merge(self, {\n    objects: function objects() {\n      return _objects;\n    },\n    setStorageElement: setStorageElement,\n    saveState: saveState,\n    saveJson: saveJson,\n    loadJson: loadJson,\n    restoreStateIfSaved: restoreStateIfSaved,\n    pointerRegister: pointerRegister,\n    register: register\n  });\n\n  $window.onbeforeunload = function () {\n    self.saveState();\n  };\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNzMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9hbmNpbGxhcnkvdXRpbHMvYmFja3VwLWJlZm9yZS11bmxvYWQtc2VydmljZS5qcz81ZGJkIl0sInNvdXJjZXNDb250ZW50IjpbIi8qQG5nSW5qZWN0Ki9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGJhY2t1cEJlZm9yZVVubG9hZFNlcnZpY2UgKF8sICR3aW5kb3cpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgdmFyIG9iamVjdHMgPSB7fTtcbiAgICB2YXIgc3RvcmFnZUVsZW1lbnQgPSBhbmd1bGFyLmVsZW1lbnQoJyNjb250cmlidXRpb24tYmFja3VwIGlucHV0Jyk7XG5cbiAgICBmdW5jdGlvbiBzZXRTdG9yYWdlRWxlbWVudChlbGVtZW50KSB7XG4gICAgICBzdG9yYWdlRWxlbWVudCA9IGVsZW1lbnQ7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gc2F2ZUpzb24oanNvbikge1xuICAgICAgcmV0dXJuIHN0b3JhZ2VFbGVtZW50LnZhbChqc29uKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBsb2FkSnNvbigpIHtcbiAgICAgIHJldHVybiBzdG9yYWdlRWxlbWVudC52YWwoKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBzYXZlU3RhdGUoKSB7XG4gICAgICB2YXIgY3VycmVudCA9IHt9O1xuXG4gICAgICBfLmVhY2goXy5rZXlzKG9iamVjdHMpLCBmdW5jdGlvbiAob2JqZWN0TmFtZSkge1xuICAgICAgICB2YXIgb2JqZWN0VG9CYWNrdXA7XG4gICAgICAgIGlmICh0eXBlb2Ygb2JqZWN0c1tvYmplY3ROYW1lXSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIG9iamVjdFRvQmFja3VwID0gb2JqZWN0c1tvYmplY3ROYW1lXSgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG9iamVjdFRvQmFja3VwID0gb2JqZWN0c1tvYmplY3ROYW1lXTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghXy5pc1VuZGVmaW5lZChvYmplY3RUb0JhY2t1cC5jYW1wYWlnbikpIHtcbiAgICAgICAgICAvL1RPRE86IG1ha2UgYmFja3Vwc2VydmljZSBzbWFydCBlbm91Z2ggdG8gbm90IHNhdmUgY2VydGFpbiB1bndhbnRlZCBhdHRyaWJ1dGVzLlxuICAgICAgICAgIGRlbGV0ZSBvYmplY3RUb0JhY2t1cC5jYW1wYWlnbjtcbiAgICAgICAgfVxuXG4gICAgICAgIGN1cnJlbnRbb2JqZWN0TmFtZV0gPSBvYmplY3RUb0JhY2t1cDtcbiAgICAgIH0pO1xuICAgICAgdmFyIGpzb24gPSBKU09OLnN0cmluZ2lmeShjdXJyZW50KTtcbiAgICAgIHNlbGYuc2F2ZUpzb24oanNvbik7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcmVzdG9yZVN0YXRlSWZTYXZlZChvYmplY3ROYW1lLCBvYmplY3QpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHZhciBkYXRhID0gSlNPTi5wYXJzZShzZWxmLmxvYWRKc29uKCkpO1xuICAgICAgICB2YXIgb2JqZWN0VG9SZXN0b3JlID0gZGF0YVtvYmplY3ROYW1lXTtcbiAgICAgICAgaWYgKCFfLmlzVW5kZWZpbmVkKG9iamVjdFRvUmVzdG9yZS5jYW1wYWlnbikpIHtcbiAgICAgICAgICAvL1RPRE86IG1ha2UgYmFja3Vwc2VydmljZSBzbWFydCBlbm91Z2ggdG8gbm90IHNhdmUgY2VydGFpbiB1bndhbnRlZCBhdHRyaWJ1dGVzLlxuICAgICAgICAgIGRlbGV0ZSBvYmplY3RUb1Jlc3RvcmUuY2FtcGFpZ247XG4gICAgICAgIH1cbiAgICAgICAgXy5tZXJnZShvYmplY3QsIG9iamVjdFRvUmVzdG9yZSk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcmVnaXN0ZXIob2JqKSB7XG4gICAgICBfLm1lcmdlKG9iamVjdHMsIG9iaik7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcG9pbnRlclJlZ2lzdGVyKG9iaikge1xuICAgICAgZm9yICh2YXIga2V5IGluIG9iaikge1xuICAgICAgICBvYmplY3RzW2tleV0gPSBvYmpba2V5XTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBfLm1lcmdlKHNlbGYsIHtcbiAgICAgIG9iamVjdHM6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIG9iamVjdHM7XG4gICAgICB9LFxuICAgICAgc2V0U3RvcmFnZUVsZW1lbnQ6IHNldFN0b3JhZ2VFbGVtZW50LFxuICAgICAgc2F2ZVN0YXRlOiBzYXZlU3RhdGUsXG4gICAgICBzYXZlSnNvbjogc2F2ZUpzb24sXG4gICAgICBsb2FkSnNvbjogbG9hZEpzb24sXG4gICAgICByZXN0b3JlU3RhdGVJZlNhdmVkOiByZXN0b3JlU3RhdGVJZlNhdmVkLFxuICAgICAgcG9pbnRlclJlZ2lzdGVyOiBwb2ludGVyUmVnaXN0ZXIsXG4gICAgICByZWdpc3RlcjogcmVnaXN0ZXJcbiAgICB9KTtcblxuICAgICR3aW5kb3cub25iZWZvcmV1bmxvYWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBzZWxmLnNhdmVTdGF0ZSgpO1xuICAgIH07XG4gIH1cblxuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogLi9hbmNpbGxhcnkvdXRpbHMvYmFja3VwLWJlZm9yZS11bmxvYWQtc2VydmljZS5qc1xuICoqLyJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTs7QUFDQTtBQUNBOztBQUVBOztBQUpBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBOzs7QUFHQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBOztBQUVBOzs7QUFHQTs7QUFFQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOzs7O0FBSUE7QUFDQTs7O0FBR0E7QUFDQTtBQUNBOzs7O0FBSUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBOztBQTlFQSIsInNvdXJjZVJvb3QiOiIifQ==");

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

	eval("\"use strict\";\n\nbrowser.$inject = [\"$window\", \"$cookies\", \"gon\"];\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = browser;\n/*@ngInject*/\nfunction browser($window, $cookies, gon) {\n  return {\n    isDesktopPlus: function isDesktopPlus() {\n      return $window.innerWidth >= 1280;\n    },\n    isDesktop: function isDesktop() {\n      return $window.innerWidth >= 1002;\n    },\n    isTabletPlus: function isTabletPlus() {\n      return $window.innerWidth >= 768;\n    },\n    isMobile: function isMobile() {\n      return $window.innerWidth < 768;\n    },\n    isMobilePortrait: function isMobilePortrait() {\n      return $window.innerWidth < 480;\n    },\n    height: function height() {\n      return $window.innerHeight;\n    },\n    onResize: function onResize(callback) {\n      angular.element($window).on(\"resize\", callback);\n    },\n    onLoad: function onLoad(callback) {\n      angular.element($window).on(\"load\", callback);\n    },\n    isAndroid: function isAndroid() {\n      var ua = $window.navigator.userAgent.toLowerCase();\n      return ua.indexOf(\"android\") > -1;\n    },\n    isIOS: function isIOS() {\n      return !!window.navigator.userAgent.match(/iPhone|iPod|iPad/g);\n    },\n    isMacOS: function isMacOS() {\n      return $window.navigator.userAgent.includes('Mac OS');\n    },\n    isIphone: function isIphone() {\n      return !!($window.navigator.userAgent.match(/iPhone|iPod/g) && !$window.navigator.userAgent.match(/iPad/g));\n    },\n    isEmbeddedInNativeMobileApp: function isEmbeddedInNativeMobileApp() {\n      return $cookies.get('embedded_in_native_mobile_app') === '1';\n    },\n    isNativeMobile: function isNativeMobile() {\n      return gon.is_native_mobile;\n    },\n    currentPath: function currentPath() {\n      return $window.location.pathname;\n    },\n    scrollToTop: function scrollToTop(element) {\n      var elementToScroll = element || angular.element('html,body');\n      elementToScroll.animate({ scrollTop: 0 });\n    },\n    currentHref: function currentHref() {\n      return $window.location.href;\n    },\n    redirectTo: function redirectTo(url) {\n      $window.location.href = url;\n    },\n    refreshPage: function refreshPage() {\n      $window.location.reload();\n    },\n    refreshWithoutParams: function refreshWithoutParams() {\n      $window.location = $window.location.pathname;\n    },\n    openTab: function openTab(url) {\n      $window.open(url, '_blank');\n    },\n    openWindow: function openWindow(url, name, options) {\n      options = options || {};\n      var width = options.width || 670;\n      var height = options.height || 400;\n      var size = 'width=' + width + ',height=' + height + ',' + 'top=' + (screen.height / 2 - height / 2) + ',' + 'left=' + (screen.width / 2 - width / 2);\n\n      $window.open(url, name, size);\n    },\n    close: function close() {\n      $window.close();\n    },\n\n    scrollY: function scrollY() {\n      return $window.pageYOffset;\n    },\n\n    onScroll: function onScroll(callback) {\n      angular.element($window).bind(\"scroll\", function () {\n        /* callback with no arguments to prevent exposing the $window directly */\n        callback();\n      });\n    },\n    getDevicefromScreenSize: function getDevicefromScreenSize() {\n      if (this.isDesktop()) {\n        return 'desktop';\n      } else if (this.isTabletPlus()) {\n        return 'tablet';\n      } else if (this.isMobile()) {\n        return 'mobile';\n      }\n    },\n    onBeforeUnload: function onBeforeUnload(callback) {\n      $window.onbeforeunload = callback;\n      return $window.onbeforeunload;\n    }\n  };\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNzQuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9hbmNpbGxhcnkvdXRpbHMvYnJvd3Nlci1mYWN0b3J5LmpzPzY1OTEiLCJ3ZWJwYWNrOi8vLz9kNDFkIl0sInNvdXJjZXNDb250ZW50IjpbIi8qQG5nSW5qZWN0Ki9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGJyb3dzZXIoJHdpbmRvdywgJGNvb2tpZXMsIGdvbikge1xuICByZXR1cm4ge1xuICAgIGlzRGVza3RvcFBsdXM6IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiAkd2luZG93LmlubmVyV2lkdGggPj0gMTI4MDtcbiAgICB9LFxuICAgIGlzRGVza3RvcDogZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuICR3aW5kb3cuaW5uZXJXaWR0aCA+PSAxMDAyO1xuICAgIH0sXG4gICAgaXNUYWJsZXRQbHVzOiBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gJHdpbmRvdy5pbm5lcldpZHRoID49IDc2ODtcbiAgICB9LFxuICAgIGlzTW9iaWxlOiBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gJHdpbmRvdy5pbm5lcldpZHRoIDwgNzY4O1xuICAgIH0sXG4gICAgaXNNb2JpbGVQb3J0cmFpdDogZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuICR3aW5kb3cuaW5uZXJXaWR0aCA8IDQ4MDtcbiAgICB9LFxuICAgIGhlaWdodDogZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuICR3aW5kb3cuaW5uZXJIZWlnaHQ7XG4gICAgfSxcbiAgICBvblJlc2l6ZTogZnVuY3Rpb24gKGNhbGxiYWNrKSB7XG4gICAgICBhbmd1bGFyLmVsZW1lbnQoJHdpbmRvdykub24oXCJyZXNpemVcIiwgY2FsbGJhY2spO1xuICAgIH0sXG4gICAgb25Mb2FkOiBmdW5jdGlvbiAoY2FsbGJhY2spIHtcbiAgICAgIGFuZ3VsYXIuZWxlbWVudCgkd2luZG93KS5vbihcImxvYWRcIiwgY2FsbGJhY2spO1xuICAgIH0sXG4gICAgaXNBbmRyb2lkOiBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgdWEgPSAkd2luZG93Lm5hdmlnYXRvci51c2VyQWdlbnQudG9Mb3dlckNhc2UoKTtcbiAgICAgIHJldHVybiB1YS5pbmRleE9mKFwiYW5kcm9pZFwiKSA+IC0xO1xuICAgIH0sXG4gICAgaXNJT1M6IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiAhISh3aW5kb3cubmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvaVBob25lfGlQb2R8aVBhZC9nKSk7XG4gICAgfSxcbiAgICBpc01hY09TOiBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gJHdpbmRvdy5uYXZpZ2F0b3IudXNlckFnZW50LmluY2x1ZGVzKCdNYWMgT1MnKTtcbiAgICB9LFxuICAgIGlzSXBob25lOiBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gISEoJHdpbmRvdy5uYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9pUGhvbmV8aVBvZC9nKSAmJiAhJHdpbmRvdy5uYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9pUGFkL2cpKTtcbiAgICB9LFxuICAgIGlzRW1iZWRkZWRJbk5hdGl2ZU1vYmlsZUFwcDogZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuICRjb29raWVzLmdldCgnZW1iZWRkZWRfaW5fbmF0aXZlX21vYmlsZV9hcHAnKSA9PT0gJzEnO1xuICAgIH0sXG4gICAgaXNOYXRpdmVNb2JpbGU6IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBnb24uaXNfbmF0aXZlX21vYmlsZTtcbiAgICB9LFxuICAgIGN1cnJlbnRQYXRoOiBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gJHdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZTtcbiAgICB9LFxuICAgIHNjcm9sbFRvVG9wOiBmdW5jdGlvbiAoZWxlbWVudCkge1xuICAgICAgdmFyIGVsZW1lbnRUb1Njcm9sbCA9IGVsZW1lbnQgfHwgYW5ndWxhci5lbGVtZW50KCdodG1sLGJvZHknKTtcbiAgICAgIGVsZW1lbnRUb1Njcm9sbC5hbmltYXRlKHtzY3JvbGxUb3A6IDB9KTtcbiAgICB9LFxuICAgIGN1cnJlbnRIcmVmOiBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gJHdpbmRvdy5sb2NhdGlvbi5ocmVmO1xuICAgIH0sXG4gICAgcmVkaXJlY3RUbzogZnVuY3Rpb24gKHVybCkge1xuICAgICAgJHdpbmRvdy5sb2NhdGlvbi5ocmVmID0gdXJsO1xuICAgIH0sXG4gICAgcmVmcmVzaFBhZ2U6IGZ1bmN0aW9uICgpIHtcbiAgICAgICR3aW5kb3cubG9jYXRpb24ucmVsb2FkKCk7XG4gICAgfSxcbiAgICByZWZyZXNoV2l0aG91dFBhcmFtczogZnVuY3Rpb24gKCkge1xuICAgICAgJHdpbmRvdy5sb2NhdGlvbiA9ICR3aW5kb3cubG9jYXRpb24ucGF0aG5hbWU7XG4gICAgfSxcbiAgICBvcGVuVGFiOiBmdW5jdGlvbiAodXJsKSB7XG4gICAgICAkd2luZG93Lm9wZW4odXJsLCAnX2JsYW5rJyk7XG4gICAgfSxcbiAgICBvcGVuV2luZG93OiBmdW5jdGlvbiAodXJsLCBuYW1lLCBvcHRpb25zKSB7XG4gICAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgICAgIHZhciB3aWR0aCA9IChvcHRpb25zLndpZHRoIHx8IDY3MCk7XG4gICAgICB2YXIgaGVpZ2h0ID0gKG9wdGlvbnMuaGVpZ2h0IHx8IDQwMCk7XG4gICAgICB2YXIgc2l6ZSA9ICd3aWR0aD0nICsgd2lkdGggKyAnLGhlaWdodD0nICsgaGVpZ2h0ICsgJywnICtcbiAgICAgICAgJ3RvcD0nICsgKHNjcmVlbi5oZWlnaHQgLyAyIC0gaGVpZ2h0IC8gMikgKyAnLCcgK1xuICAgICAgICAnbGVmdD0nICsgKHNjcmVlbi53aWR0aCAvIDIgLSB3aWR0aCAvIDIpO1xuXG4gICAgICAkd2luZG93Lm9wZW4odXJsLCBuYW1lLCBzaXplKTtcbiAgICB9LFxuICAgIGNsb3NlOiBmdW5jdGlvbiAoKSB7XG4gICAgICAkd2luZG93LmNsb3NlKCk7XG4gICAgfSxcblxuICAgIHNjcm9sbFk6IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiAkd2luZG93LnBhZ2VZT2Zmc2V0O1xuICAgIH0sXG5cbiAgICBvblNjcm9sbDogZnVuY3Rpb24gKGNhbGxiYWNrKSB7XG4gICAgICBhbmd1bGFyLmVsZW1lbnQoJHdpbmRvdykuYmluZChcInNjcm9sbFwiLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIC8qIGNhbGxiYWNrIHdpdGggbm8gYXJndW1lbnRzIHRvIHByZXZlbnQgZXhwb3NpbmcgdGhlICR3aW5kb3cgZGlyZWN0bHkgKi9cbiAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgIH0pO1xuICAgIH0sXG4gICAgZ2V0RGV2aWNlZnJvbVNjcmVlblNpemU6IGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmICh0aGlzLmlzRGVza3RvcCgpKSB7XG4gICAgICAgIHJldHVybiAnZGVza3RvcCc7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMuaXNUYWJsZXRQbHVzKCkpIHtcbiAgICAgICAgcmV0dXJuICd0YWJsZXQnO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLmlzTW9iaWxlKCkpIHtcbiAgICAgICAgcmV0dXJuICdtb2JpbGUnO1xuICAgICAgfVxuICAgIH0sXG4gICAgb25CZWZvcmVVbmxvYWQ6IGZ1bmN0aW9uIChjYWxsYmFjaykge1xuICAgICAgJHdpbmRvdy5vbmJlZm9yZXVubG9hZCA9IGNhbGxiYWNrO1xuICAgICAgcmV0dXJuICR3aW5kb3cub25iZWZvcmV1bmxvYWQ7XG4gICAgfVxuICB9O1xufVxuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogLi9hbmNpbGxhcnkvdXRpbHMvYnJvd3Nlci1mYWN0b3J5LmpzXG4gKiovIiwidW5kZWZpbmVkXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogXG4gKiovIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBOztBQUNBO0FBQ0E7O0FBRUE7O0FBSkE7QUNDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTs7QUFFQTtBQUNBOzs7QUFHQTtBQUNBOzs7QUFHQTtBQUNBOztBQUVBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBOzs7QUFHQSIsInNvdXJjZVJvb3QiOiIifQ==");

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

	eval("'use strict';\n\ncache.$inject = [\"serverHost\", \"URI\", \"$cookies\", \"i18n\"];\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = cache;\n/*@ngInject*/\nfunction cache(serverHost, URI, $cookies, i18n) {\n  function isRequestToCurrentServer(requestURL) {\n    var uri = new URI(requestURL);\n    return uri.is(\"relative\") || uri.host() == serverHost;\n  }\n\n  var request = function request(config) {\n    if (isRequestToCurrentServer(config.url)) {\n      if ($cookies.get('has_account') == 'true') {\n        config.headers['X-Has-Account'] = 'true';\n      }\n      config.headers['X-Locale'] = i18n.locale;\n    }\n\n    return config;\n  };\n\n  return {\n    request: request\n  };\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNzUuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9hbmNpbGxhcnkvdXRpbHMvY2FjaGUtZmFjdG9yeS5qcz8zNTFlIl0sInNvdXJjZXNDb250ZW50IjpbIi8qQG5nSW5qZWN0Ki9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGNhY2hlIChzZXJ2ZXJIb3N0LCBVUkksICRjb29raWVzLCBpMThuKSB7XG4gICAgZnVuY3Rpb24gaXNSZXF1ZXN0VG9DdXJyZW50U2VydmVyIChyZXF1ZXN0VVJMKSB7XG4gICAgICB2YXIgdXJpID0gbmV3IFVSSShyZXF1ZXN0VVJMKTtcbiAgICAgICAgcmV0dXJuICh1cmkuaXMoXCJyZWxhdGl2ZVwiKSB8fCAodXJpLmhvc3QoKSA9PSBzZXJ2ZXJIb3N0KSk7XG4gICAgfVxuXG4gICAgdmFyIHJlcXVlc3QgPSBmdW5jdGlvbiByZXF1ZXN0KGNvbmZpZykge1xuICAgICAgaWYgKGlzUmVxdWVzdFRvQ3VycmVudFNlcnZlcihjb25maWcudXJsKSkge1xuICAgICAgICBpZiAoJGNvb2tpZXMuZ2V0KCdoYXNfYWNjb3VudCcpID09ICd0cnVlJykge1xuICAgICAgICAgIGNvbmZpZy5oZWFkZXJzWydYLUhhcy1BY2NvdW50J10gPSAndHJ1ZSc7XG4gICAgICAgIH1cbiAgICAgICAgY29uZmlnLmhlYWRlcnNbJ1gtTG9jYWxlJ10gPSBpMThuLmxvY2FsZTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGNvbmZpZztcbiAgICB9O1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHJlcXVlc3Q6IHJlcXVlc3RcbiAgICB9O1xuICB9XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiAuL2FuY2lsbGFyeS91dGlscy9jYWNoZS1mYWN0b3J5LmpzXG4gKiovIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBOztBQUNBO0FBQ0E7O0FBRUE7O0FBSkE7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOzs7QUFHQTs7O0FBR0E7QUFDQTs7QUFsQkEiLCJzb3VyY2VSb290IjoiIn0=");

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

	eval("'use strict';\n\ncategories.$inject = [\"gon\", \"i18n\"];\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = categories;\n/*@ngInject*/\nfunction categories(gon, i18n) {\n  function CategoriesService(initialCategories) {\n    var categories;\n\n    this.setCategories = function (cats) {\n      categories = cats;\n      this.initializeI18n();\n    };\n\n    this.getCategories = function () {\n      return categories;\n    };\n\n    this.asOptions = function () {\n      return _.map(categories, function (category) {\n        return { value: category.id, text: category.name };\n      });\n    };\n\n    this.asUiSelectItems = function () {\n      this.initializeI18n();\n      return _.map(categories, function (category) {\n        return { value: category.id, text: category.name, label: category.label };\n      });\n    };\n\n    this.forId = function (id) {\n      return _.find(categories, { id: parseInt(id) });\n    };\n\n    this.initializeI18n = function () {\n      _.each(categories, function (category) {\n        category.label = i18n.t(category.slug);\n\n        if (i18n.locale === 'en') {\n          category.tagline = i18n.t('explorepage.taglines.' + category.slug);\n        } else {\n          category.tagline = i18n.t(category.slug);\n        }\n      });\n    };\n\n    this.setCategories(initialCategories);\n  }\n\n  return new CategoriesService(gon && gon.services && gon.services.categories || []);\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNzYuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9hbmNpbGxhcnkvdXRpbHMvY2F0ZWdvcmllcy1mYWN0b3J5LmpzPzVhNmEiXSwic291cmNlc0NvbnRlbnQiOlsiLypAbmdJbmplY3QqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gY2F0ZWdvcmllcyhnb24sIGkxOG4pIHtcbiAgICBmdW5jdGlvbiBDYXRlZ29yaWVzU2VydmljZShpbml0aWFsQ2F0ZWdvcmllcykge1xuICAgICAgdmFyIGNhdGVnb3JpZXM7XG5cbiAgICAgIHRoaXMuc2V0Q2F0ZWdvcmllcyA9IGZ1bmN0aW9uIChjYXRzKSB7XG4gICAgICAgIGNhdGVnb3JpZXMgPSBjYXRzO1xuICAgICAgICB0aGlzLmluaXRpYWxpemVJMThuKCk7XG4gICAgICB9O1xuXG4gICAgICB0aGlzLmdldENhdGVnb3JpZXMgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIGNhdGVnb3JpZXM7XG4gICAgICB9O1xuXG4gICAgICB0aGlzLmFzT3B0aW9ucyA9IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gIF8ubWFwKGNhdGVnb3JpZXMsIGZ1bmN0aW9uIChjYXRlZ29yeSkge1xuICAgICAgICAgIHJldHVybiB7IHZhbHVlOiBjYXRlZ29yeS5pZCwgdGV4dDogY2F0ZWdvcnkubmFtZSB9O1xuICAgICAgICB9KTtcbiAgICAgIH07XG5cbiAgICAgIHRoaXMuYXNVaVNlbGVjdEl0ZW1zID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIHRoaXMuaW5pdGlhbGl6ZUkxOG4oKTtcbiAgICAgICAgcmV0dXJuICBfLm1hcChjYXRlZ29yaWVzLCBmdW5jdGlvbiAoY2F0ZWdvcnkpIHtcbiAgICAgICAgICByZXR1cm4geyB2YWx1ZTogY2F0ZWdvcnkuaWQsIHRleHQ6IGNhdGVnb3J5Lm5hbWUsIGxhYmVsOiBjYXRlZ29yeS5sYWJlbCB9O1xuICAgICAgICB9KTtcbiAgICAgIH07XG5cbiAgICAgIHRoaXMuZm9ySWQgPSBmdW5jdGlvbihpZCkge1xuICAgICAgICByZXR1cm4gXy5maW5kKGNhdGVnb3JpZXMsIHtpZDogcGFyc2VJbnQoaWQpfSk7XG4gICAgICB9O1xuXG4gICAgICB0aGlzLmluaXRpYWxpemVJMThuID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBfLmVhY2goY2F0ZWdvcmllcywgZnVuY3Rpb24oY2F0ZWdvcnkpIHtcbiAgICAgICAgICBjYXRlZ29yeS5sYWJlbCA9IGkxOG4udChjYXRlZ29yeS5zbHVnKTtcblxuICAgICAgICAgIGlmIChpMThuLmxvY2FsZSA9PT0gJ2VuJykge1xuICAgICAgICAgICAgY2F0ZWdvcnkudGFnbGluZSA9IGkxOG4udCgnZXhwbG9yZXBhZ2UudGFnbGluZXMuJyArIGNhdGVnb3J5LnNsdWcpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGNhdGVnb3J5LnRhZ2xpbmUgPSBpMThuLnQoY2F0ZWdvcnkuc2x1Zyk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH07XG5cbiAgICAgIHRoaXMuc2V0Q2F0ZWdvcmllcyhpbml0aWFsQ2F0ZWdvcmllcyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBDYXRlZ29yaWVzU2VydmljZShnb24gJiYgZ29uLnNlcnZpY2VzICYmIGdvbi5zZXJ2aWNlcy5jYXRlZ29yaWVzIHx8IFtdKTtcbiAgfVxuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogLi9hbmNpbGxhcnkvdXRpbHMvY2F0ZWdvcmllcy1mYWN0b3J5LmpzXG4gKiovIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBOztBQUNBO0FBQ0E7O0FBRUE7O0FBSkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTs7OztBQUlBO0FBQ0E7QUFDQTtBQUNBOzs7O0FBSUE7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTs7Ozs7QUFLQTs7O0FBR0E7QUE5Q0EiLCJzb3VyY2VSb290IjoiIn0=");

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

	eval("\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = charCounter;\n/*@ngInject*/\nfunction charCounter() {\n  return function (input, maxLength, delimiter) {\n    delimiter = delimiter ? \" \" + delimiter + \" \" : \" / \";\n    var charsLeft = input ? maxLength - input.length : maxLength;\n    return charsLeft.toString() + delimiter + maxLength;\n  };\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNzcuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9hbmNpbGxhcnkvdXRpbHMvY2hhci1jb3VudGVyLWZpbHRlci5qcz8wMzVkIl0sInNvdXJjZXNDb250ZW50IjpbIi8qQG5nSW5qZWN0Ki9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGNoYXJDb3VudGVyKCkge1xuICByZXR1cm4gZnVuY3Rpb24oaW5wdXQsIG1heExlbmd0aCwgZGVsaW1pdGVyKSB7XG4gICAgZGVsaW1pdGVyID0gZGVsaW1pdGVyID8gXCIgXCIgKyBkZWxpbWl0ZXIgKyBcIiBcIiA6IFwiIC8gXCI7XG4gICAgdmFyIGNoYXJzTGVmdCA9IGlucHV0ID8gbWF4TGVuZ3RoIC0gaW5wdXQubGVuZ3RoIDogbWF4TGVuZ3RoO1xuICAgIHJldHVybiBjaGFyc0xlZnQudG9TdHJpbmcoKSArIGRlbGltaXRlciArIG1heExlbmd0aDtcbiAgfTtcbn1cblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIC4vYW5jaWxsYXJ5L3V0aWxzL2NoYXItY291bnRlci1maWx0ZXIuanNcbiAqKi8iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUpBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBSkEiLCJzb3VyY2VSb290IjoiIn0=");

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

	eval("'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nexports.default = function (CKEDITOR, iggCKEditorConfig, $timeout, $q) {\n  return {\n    require: 'ngModel',\n    scope: {\n      onCkReady: '&'\n    },\n\n    /*\n     * most of this is borrowed from the angular-ckeditor project. the most\n     * important change is the actual creation of the editor. this directive\n     * gives us control over the exact configuration data, where the\n     * angular-ckeditor instance required a json object literal to be passed as\n     * an html attribute.\n     */\n    link: function link(scope, element, attrs, controller) {\n      var editor = CKEDITOR.replace(element[0], iggCKEditorConfig.defaultOptions);\n      var ready = $q.defer();\n\n      function editorReady() {\n        return ready.promise;\n      }\n\n      function onCkEvent(event, listener) {\n        editor.on(event, function () {\n          var args = arguments;\n          /*\n           * $timeout ensures that we call $apply in the background, and not\n           * during an active $apply cycle\n           */\n          $timeout(function () {\n            scope.$apply(function () {\n              listener.apply(null, args);\n            });\n          });\n        });\n      }\n\n      // Set editor data when view data change.\n      controller.$render = function () {\n        editorReady().then(function () {\n          editor.setData(controller.$viewValue || '', {\n            noSnapshot: true,\n            callback: function callback() {\n              editor.fire('updateSnapshot');\n            }\n          });\n        });\n      };\n\n      editorReady().then(function () {\n        // manually sync model on certain ckeditor events\n        ['change', 'saveSnapshot'].forEach(function (event) {\n          onCkEvent(event, function () {\n            controller.$setViewValue(editor.getData() || '');\n          });\n        });\n\n        // make ckeditor readonly when the element is readonly\n        editor.setReadOnly(!!attrs.readonly);\n        attrs.$observe('readonly', function (readonly) {\n          editor.setReadOnly(!!readonly);\n        });\n\n        /*\n         * invoke the onCkReady callback referenced in the element attributes\n         * the $timeout trick ensures this happens in the background, and not\n         * during an active $apply cycle\n         */\n        $timeout(function () {\n          iggCKEditorConfig.onReady(editor, scope.onCkReady(scope));\n        });\n      });\n\n      scope.$on('$destroy', function () {\n        editorReady().then(function () {\n          editor.destroy(false);\n        });\n      });\n\n      onCkEvent('instanceReady', function () {\n        ready.resolve(true);\n      });\n    }\n  };\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNzguanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9hbmNpbGxhcnkvdXRpbHMvY2tlZGl0b3ItZGlyZWN0aXZlLmpzP2EyMmQiXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oQ0tFRElUT1IsIGlnZ0NLRWRpdG9yQ29uZmlnLCAkdGltZW91dCwgJHEpIHtcbiAgcmV0dXJuIHtcbiAgICByZXF1aXJlOiAnbmdNb2RlbCcsXG4gICAgc2NvcGU6IHtcbiAgICAgIG9uQ2tSZWFkeTogJyYnXG4gICAgfSxcblxuICAgIC8qXG4gICAgICogbW9zdCBvZiB0aGlzIGlzIGJvcnJvd2VkIGZyb20gdGhlIGFuZ3VsYXItY2tlZGl0b3IgcHJvamVjdC4gdGhlIG1vc3RcbiAgICAgKiBpbXBvcnRhbnQgY2hhbmdlIGlzIHRoZSBhY3R1YWwgY3JlYXRpb24gb2YgdGhlIGVkaXRvci4gdGhpcyBkaXJlY3RpdmVcbiAgICAgKiBnaXZlcyB1cyBjb250cm9sIG92ZXIgdGhlIGV4YWN0IGNvbmZpZ3VyYXRpb24gZGF0YSwgd2hlcmUgdGhlXG4gICAgICogYW5ndWxhci1ja2VkaXRvciBpbnN0YW5jZSByZXF1aXJlZCBhIGpzb24gb2JqZWN0IGxpdGVyYWwgdG8gYmUgcGFzc2VkIGFzXG4gICAgICogYW4gaHRtbCBhdHRyaWJ1dGUuXG4gICAgICovXG4gICAgbGluazogZnVuY3Rpb24oc2NvcGUsIGVsZW1lbnQsIGF0dHJzLCBjb250cm9sbGVyKSB7XG4gICAgICB2YXIgZWRpdG9yID0gQ0tFRElUT1IucmVwbGFjZShlbGVtZW50WzBdLCBpZ2dDS0VkaXRvckNvbmZpZy5kZWZhdWx0T3B0aW9ucyk7XG4gICAgICB2YXIgcmVhZHkgID0gJHEuZGVmZXIoKTtcblxuICAgICAgZnVuY3Rpb24gZWRpdG9yUmVhZHkoKSB7XG4gICAgICAgIHJldHVybiByZWFkeS5wcm9taXNlO1xuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiBvbkNrRXZlbnQoZXZlbnQsIGxpc3RlbmVyKSB7XG4gICAgICAgIGVkaXRvci5vbihldmVudCwgZnVuY3Rpb24oKSB7XG4gICAgICAgICAgdmFyIGFyZ3MgPSBhcmd1bWVudHM7XG4gICAgICAgICAgLypcbiAgICAgICAgICAgKiAkdGltZW91dCBlbnN1cmVzIHRoYXQgd2UgY2FsbCAkYXBwbHkgaW4gdGhlIGJhY2tncm91bmQsIGFuZCBub3RcbiAgICAgICAgICAgKiBkdXJpbmcgYW4gYWN0aXZlICRhcHBseSBjeWNsZVxuICAgICAgICAgICAqL1xuICAgICAgICAgICR0aW1lb3V0KGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgc2NvcGUuJGFwcGx5KGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICBsaXN0ZW5lci5hcHBseShudWxsLCBhcmdzKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgLy8gU2V0IGVkaXRvciBkYXRhIHdoZW4gdmlldyBkYXRhIGNoYW5nZS5cbiAgICAgIGNvbnRyb2xsZXIuJHJlbmRlciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgZWRpdG9yUmVhZHkoKS50aGVuKGZ1bmN0aW9uKCkge1xuICAgICAgICAgIGVkaXRvci5zZXREYXRhKGNvbnRyb2xsZXIuJHZpZXdWYWx1ZSB8fCAnJywge1xuICAgICAgICAgICAgbm9TbmFwc2hvdDogdHJ1ZSxcbiAgICAgICAgICAgIGNhbGxiYWNrOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgIGVkaXRvci5maXJlKCd1cGRhdGVTbmFwc2hvdCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgIH07XG5cbiAgICAgIGVkaXRvclJlYWR5KCkudGhlbihmdW5jdGlvbigpIHtcbiAgICAgICAgLy8gbWFudWFsbHkgc3luYyBtb2RlbCBvbiBjZXJ0YWluIGNrZWRpdG9yIGV2ZW50c1xuICAgICAgICBbJ2NoYW5nZScsICdzYXZlU25hcHNob3QnXS5mb3JFYWNoKGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICAgIG9uQ2tFdmVudChldmVudCwgZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICBjb250cm9sbGVyLiRzZXRWaWV3VmFsdWUoZWRpdG9yLmdldERhdGEoKSB8fCAnJyk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIG1ha2UgY2tlZGl0b3IgcmVhZG9ubHkgd2hlbiB0aGUgZWxlbWVudCBpcyByZWFkb25seVxuICAgICAgICBlZGl0b3Iuc2V0UmVhZE9ubHkoISFhdHRycy5yZWFkb25seSk7XG4gICAgICAgIGF0dHJzLiRvYnNlcnZlKCdyZWFkb25seScsIGZ1bmN0aW9uIChyZWFkb25seSkge1xuICAgICAgICAgIGVkaXRvci5zZXRSZWFkT25seSghIXJlYWRvbmx5KTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLypcbiAgICAgICAgICogaW52b2tlIHRoZSBvbkNrUmVhZHkgY2FsbGJhY2sgcmVmZXJlbmNlZCBpbiB0aGUgZWxlbWVudCBhdHRyaWJ1dGVzXG4gICAgICAgICAqIHRoZSAkdGltZW91dCB0cmljayBlbnN1cmVzIHRoaXMgaGFwcGVucyBpbiB0aGUgYmFja2dyb3VuZCwgYW5kIG5vdFxuICAgICAgICAgKiBkdXJpbmcgYW4gYWN0aXZlICRhcHBseSBjeWNsZVxuICAgICAgICAgKi9cbiAgICAgICAgJHRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgaWdnQ0tFZGl0b3JDb25maWcub25SZWFkeShlZGl0b3IsIHNjb3BlLm9uQ2tSZWFkeShzY29wZSkpO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuXG4gICAgICBzY29wZS4kb24oJyRkZXN0cm95JywgZnVuY3Rpb24oKSB7XG4gICAgICAgIGVkaXRvclJlYWR5KCkudGhlbihmdW5jdGlvbigpIHtcbiAgICAgICAgICBlZGl0b3IuZGVzdHJveShmYWxzZSk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG5cbiAgICAgIG9uQ2tFdmVudCgnaW5zdGFuY2VSZWFkeScsIGZ1bmN0aW9uKCkge1xuICAgICAgICByZWFkeS5yZXNvbHZlKHRydWUpO1xuICAgICAgfSk7XG4gICAgfVxuICB9O1xufVxuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogLi9hbmNpbGxhcnkvdXRpbHMvY2tlZGl0b3ItZGlyZWN0aXZlLmpzXG4gKiovIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFMQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7OztBQVVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBOzs7OztBQURBO0FBT0E7QUFDQTs7Ozs7OztBQWpCQTtBQXlCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7QUFNQTs7QUFFQTtBQUNBO0FBQ0E7Ozs7O0FBSkE7QUFVQTtBQUNBOzs7Ozs7OztBQVhBO0FBb0JBOzs7O0FBSUE7QUFDQTtBQUNBOzs7O0FBSUE7QUFDQTs7OztBQWhGQSIsInNvdXJjZVJvb3QiOiIifQ==");

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

	eval("\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = clImage;\n/*@ngInject*/\nfunction clImage() {\n  return {\n    restrict: 'A',\n    scope: {\n      publicId: \"=\",\n      placeholderPath: \"@\",\n      width: '@',\n      height: '@',\n      crop: '@',\n      background: '@'\n    },\n\n    link: function link(scope, element) {\n      scope.$watch('publicId', function (newPublicId) {\n        if (newPublicId) {\n          element.webpify(_.extend({ 'width': scope.width, 'height': scope.height, 'crop': scope.crop, 'background': scope.background }, { 'src': newPublicId + '.jpg' }, { 'secure': true }));\n        } else if (scope.placeholderPath) {\n          element.attr('src', scope.placeholderPath);\n        }\n      });\n      scope.$on('imageReceived', function (event, imageModel) {\n        element.webpify(_.extend({ width: scope.width,\n          height: scope.height,\n          crop: scope.crop,\n          background: scope.background\n        }, { src: imageModel.public_id + '.jpg' }, { secure: true }));\n      });\n    }\n  };\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNzkuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9hbmNpbGxhcnkvdXRpbHMvY2wtaW1hZ2UtZGlyZWN0aXZlLmpzPzYzMGIiXSwic291cmNlc0NvbnRlbnQiOlsiLypAbmdJbmplY3QqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gY2xJbWFnZSgpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHJlc3RyaWN0OiAnQScsXG4gICAgICAgIHNjb3BlOiB7XG4gICAgICAgICAgcHVibGljSWQ6IFwiPVwiLFxuICAgICAgICAgIHBsYWNlaG9sZGVyUGF0aDogXCJAXCIsXG4gICAgICAgICAgd2lkdGg6ICdAJyxcbiAgICAgICAgICBoZWlnaHQ6ICdAJyxcbiAgICAgICAgICBjcm9wOiAnQCcsXG4gICAgICAgICAgYmFja2dyb3VuZDogJ0AnXG4gICAgICAgIH0sXG5cbiAgICAgICAgbGluazogZnVuY3Rpb24gKHNjb3BlLCBlbGVtZW50KSB7XG4gICAgICAgICAgc2NvcGUuJHdhdGNoKCdwdWJsaWNJZCcsIGZ1bmN0aW9uIChuZXdQdWJsaWNJZCkge1xuICAgICAgICAgICAgaWYgKG5ld1B1YmxpY0lkKSB7XG4gICAgICAgICAgICAgIGVsZW1lbnQud2VicGlmeShfLmV4dGVuZCh7J3dpZHRoJzogc2NvcGUud2lkdGgsICdoZWlnaHQnOiBzY29wZS5oZWlnaHQsICdjcm9wJzogc2NvcGUuY3JvcCwgJ2JhY2tncm91bmQnOiBzY29wZS5iYWNrZ3JvdW5kfSwgeydzcmMnOiBuZXdQdWJsaWNJZCArICcuanBnJ30sIHsnc2VjdXJlJzogdHJ1ZX0pKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoc2NvcGUucGxhY2Vob2xkZXJQYXRoKSB7XG4gICAgICAgICAgICAgIGVsZW1lbnQuYXR0cignc3JjJywgc2NvcGUucGxhY2Vob2xkZXJQYXRoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgICBzY29wZS4kb24oJ2ltYWdlUmVjZWl2ZWQnLCBmdW5jdGlvbihldmVudCwgaW1hZ2VNb2RlbCkge1xuICAgICAgICAgICAgICBlbGVtZW50LndlYnBpZnkoXy5leHRlbmQoeyB3aWR0aDogc2NvcGUud2lkdGgsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodDogc2NvcGUuaGVpZ2h0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcm9wOiBzY29wZS5jcm9wLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kOiBzY29wZS5iYWNrZ3JvdW5kXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBzcmM6IGltYWdlTW9kZWwucHVibGljX2lkICsgJy5qcGcnIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IHNlY3VyZTogdHJ1ZSB9XG4gICAgICAgICAgICAgICkpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgIH1cblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIC4vYW5jaWxsYXJ5L3V0aWxzL2NsLWltYWdlLWRpcmVjdGl2ZS5qc1xuICoqLyJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBSkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOzs7O0FBMUJBIiwic291cmNlUm9vdCI6IiJ9");

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

	eval("\"use strict\";\n\nuploadableImage.$inject = [\"i18n\", \"cloudinary\", \"$window\"];\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = uploadableImage;\n/*@ngInject*/\nfunction uploadableImage(i18n, cloudinary, $window) {\n  return {\n    restrict: 'A',\n    scope: {\n      imageModel: \"=\",\n      missingImagePath: \"@\",\n      showDelete: '=',\n      showError: '=',\n      showUploadIcon: '=?',\n      dirtyOnUpload: '=',\n      width: '@',\n      height: '@',\n      crop: '@'\n    },\n    template: __webpack_require__(81),\n    link: function link(scope, element) {\n      scope.testOverride = $window.test_override;\n      if (typeof scope.showDelete === 'undefined') {\n        scope.showDelete = true;\n      }\n      if (typeof scope.showUploadIcon === 'undefined') {\n        scope.showUploadIcon = true;\n      }\n      scope.i18n = i18n;\n      scope.showSpinner = false;\n      scope.cloudinaryError = null;\n      scope.triggerFileUpload = function () {\n        element.find('.cloudinary-fileupload').trigger('click');\n      };\n      scope.setImage = function (imageJson) {\n        scope.imageModel = imageJson;\n        if (scope.dirtyOnUpload !== false) {\n          scope.$emit('setFormDirty');\n        }\n      };\n      scope.triggerUploadIfBlankImage = function () {\n        if (scope.imageModel === null) {\n          scope.triggerFileUpload();\n        }\n      };\n      scope.resetImageFile = function (clickEvent) {\n        scope.setImage(null);\n        if (clickEvent) clickEvent.stopPropagation();\n      };\n\n      var $dropZone = element.find(\"img\");\n      cloudinary.forFileInput(element.find('.cloudinary-fileupload'), $dropZone).onUploadStart(function () {\n        scope.showSpinner = true;\n      }).onUploadComplete(function (result) {\n        if (result) {\n          result.publicId = result.public_id;\n          scope.setImage(result);\n          scope.$apply();\n        }\n        scope.cloudinaryError = null;\n        scope.showSpinner = false;\n      }).onUploadFail(function (response) {\n        scope.showSpinner = false;\n        if (response && response.files) {\n          var fileType = response.files[0].name.split('.').pop();\n          if (fileType && fileType != 'jpg' && fileType != 'png') {\n            scope.cloudinaryError = i18n.t('campaign_editor.misc.error.cloudinary_file_type');\n            return;\n          }\n        }\n        scope.cloudinaryError = i18n.t('campaign_editor.misc.error.cloudinary_generic');\n      });\n    }\n  };\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiODAuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9hbmNpbGxhcnkvdXRpbHMvY2wtdXBsb2FkYWJsZS1pbWFnZS1kaXJlY3RpdmUuanM/NzMxNSJdLCJzb3VyY2VzQ29udGVudCI6WyIvKkBuZ0luamVjdCovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB1cGxvYWRhYmxlSW1hZ2UoaTE4biwgY2xvdWRpbmFyeSwgJHdpbmRvdykge1xuICAgIHJldHVybiB7XG4gICAgICByZXN0cmljdDogJ0EnLFxuICAgICAgc2NvcGU6IHtcbiAgICAgICAgaW1hZ2VNb2RlbDogXCI9XCIsXG4gICAgICAgIG1pc3NpbmdJbWFnZVBhdGg6IFwiQFwiLFxuICAgICAgICBzaG93RGVsZXRlOiAnPScsXG4gICAgICAgIHNob3dFcnJvcjogJz0nLFxuICAgICAgICBzaG93VXBsb2FkSWNvbjogJz0/JyxcbiAgICAgICAgZGlydHlPblVwbG9hZDogJz0nLFxuICAgICAgICB3aWR0aDogJ0AnLFxuICAgICAgICBoZWlnaHQ6ICdAJyxcbiAgICAgICAgY3JvcDogJ0AnXG4gICAgICB9LFxuICAgICAgdGVtcGxhdGU6IHJlcXVpcmUoJy4vY2wtdXBsb2FkYWJsZS1pbWFnZS5odG1sJyksXG4gICAgICBsaW5rOiBmdW5jdGlvbihzY29wZSwgZWxlbWVudCkge1xuICAgICAgICBzY29wZS50ZXN0T3ZlcnJpZGUgPSAkd2luZG93LnRlc3Rfb3ZlcnJpZGU7XG4gICAgICAgIGlmICh0eXBlb2Yoc2NvcGUuc2hvd0RlbGV0ZSkgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgc2NvcGUuc2hvd0RlbGV0ZSA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZihzY29wZS5zaG93VXBsb2FkSWNvbikgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgc2NvcGUuc2hvd1VwbG9hZEljb24gPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHNjb3BlLmkxOG4gPSBpMThuO1xuICAgICAgICBzY29wZS5zaG93U3Bpbm5lciA9IGZhbHNlO1xuICAgICAgICBzY29wZS5jbG91ZGluYXJ5RXJyb3IgPSBudWxsO1xuICAgICAgICBzY29wZS50cmlnZ2VyRmlsZVVwbG9hZCA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgIGVsZW1lbnQuZmluZCgnLmNsb3VkaW5hcnktZmlsZXVwbG9hZCcpLnRyaWdnZXIoJ2NsaWNrJyk7XG4gICAgICAgIH07XG4gICAgICAgIHNjb3BlLnNldEltYWdlID0gZnVuY3Rpb24oaW1hZ2VKc29uKSB7XG4gICAgICAgICAgc2NvcGUuaW1hZ2VNb2RlbCA9IGltYWdlSnNvbjtcbiAgICAgICAgICBpZihzY29wZS5kaXJ0eU9uVXBsb2FkICE9PSBmYWxzZSkge1xuICAgICAgICAgICAgc2NvcGUuJGVtaXQoJ3NldEZvcm1EaXJ0eScpO1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgc2NvcGUudHJpZ2dlclVwbG9hZElmQmxhbmtJbWFnZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBpZiAoc2NvcGUuaW1hZ2VNb2RlbCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgc2NvcGUudHJpZ2dlckZpbGVVcGxvYWQoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIHNjb3BlLnJlc2V0SW1hZ2VGaWxlID0gZnVuY3Rpb24gKGNsaWNrRXZlbnQpIHtcbiAgICAgICAgICBzY29wZS5zZXRJbWFnZShudWxsKTtcbiAgICAgICAgICBpZiAoY2xpY2tFdmVudCkgY2xpY2tFdmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgfTtcblxuICAgICAgICB2YXIgJGRyb3Bab25lID0gZWxlbWVudC5maW5kKFwiaW1nXCIpO1xuICAgICAgICBjbG91ZGluYXJ5LmZvckZpbGVJbnB1dChlbGVtZW50LmZpbmQoJy5jbG91ZGluYXJ5LWZpbGV1cGxvYWQnKSwgJGRyb3Bab25lKS5cbiAgICAgICAgICBvblVwbG9hZFN0YXJ0KGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgc2NvcGUuc2hvd1NwaW5uZXIgPSB0cnVlO1xuICAgICAgICAgIH0pLlxuICAgICAgICAgIG9uVXBsb2FkQ29tcGxldGUoZnVuY3Rpb24ocmVzdWx0KSB7XG4gICAgICAgICAgICBpZihyZXN1bHQpIHtcbiAgICAgICAgICAgICAgcmVzdWx0LnB1YmxpY0lkID0gcmVzdWx0LnB1YmxpY19pZDtcbiAgICAgICAgICAgICAgc2NvcGUuc2V0SW1hZ2UocmVzdWx0KTtcbiAgICAgICAgICAgICAgc2NvcGUuJGFwcGx5KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzY29wZS5jbG91ZGluYXJ5RXJyb3IgPSBudWxsO1xuICAgICAgICAgICAgc2NvcGUuc2hvd1NwaW5uZXIgPSBmYWxzZTtcbiAgICAgICAgICB9KS5cbiAgICAgICAgICBvblVwbG9hZEZhaWwoZnVuY3Rpb24ocmVzcG9uc2UpIHtcbiAgICAgICAgICAgIHNjb3BlLnNob3dTcGlubmVyID0gZmFsc2U7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2UgJiYgcmVzcG9uc2UuZmlsZXMpIHtcbiAgICAgICAgICAgICAgdmFyIGZpbGVUeXBlID0gcmVzcG9uc2UuZmlsZXNbMF0ubmFtZS5zcGxpdCgnLicpLnBvcCgpO1xuICAgICAgICAgICAgICBpZiAoZmlsZVR5cGUgJiYgZmlsZVR5cGUgIT0gJ2pwZycgJiYgZmlsZVR5cGUgIT0gJ3BuZycpIHtcbiAgICAgICAgICAgICAgICBzY29wZS5jbG91ZGluYXJ5RXJyb3IgPSBpMThuLnQoJ2NhbXBhaWduX2VkaXRvci5taXNjLmVycm9yLmNsb3VkaW5hcnlfZmlsZV90eXBlJyk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzY29wZS5jbG91ZGluYXJ5RXJyb3IgPSBpMThuLnQoJ2NhbXBhaWduX2VkaXRvci5taXNjLmVycm9yLmNsb3VkaW5hcnlfZ2VuZXJpYycpO1xuICAgICAgICAgIH0pO1xuICAgICAgfVxuICAgIH07XG4gIH1cblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIC4vYW5jaWxsYXJ5L3V0aWxzL2NsLXVwbG9hZGFibGUtaW1hZ2UtZGlyZWN0aXZlLmpzXG4gKiovIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBOztBQUNBO0FBQ0E7O0FBRUE7O0FBSkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7Ozs7QUFwRUEiLCJzb3VyY2VSb290IjoiIn0=");

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

	eval("module.exports = \"<div class=\\\"image-container\\\" ng-click=\\\"triggerUploadIfBlankImage()\\\"\\n     ng-class=\\\"{'not-empty': imageModel !== null, 'i-field-error': showError || cloudinaryError}\\\">\\n  <div ng-if=\\\"imageModel == undefined && missingImagePath == undefined\\\" class=\\\"clImageUploader-placeholder\\\"><svg><use xlink:href=\\\"#icon-icon-create-photo\\\"></use></svg></div>\\n  <img cl-image width=\\\"{{width}}\\\" height=\\\"{{height}}\\\" crop=\\\"{{crop}}\\\"\\n       public-id=\\\"imageModel.publicId\\\" alt=\\\"{{i18n.t('upload_an_image')}}\\\"\\n       placeholder-path=\\\"{{missingImagePath}}\\\"/>\\n\\n  <i class=\\\"i-fa-centered i-fa-gogenta fa fa-spinner fa-4x fa-spin\\\" ng-show=\\\"showSpinner\\\"></i>\\n\\n  <div ng-if=\\\"imageModel !== null\\\">\\n    <a ng-if=\\\"showDelete\\\" ng-click=\\\"resetImageFile($event)\\\" class=\\\"miniBtnAction miniBtnAction--delete miniBtnTopRight\\\"><svg><use xlink:href=\\\"#icon-icon-close\\\"></use></svg></a>\\n    <a ng-if=\\\"showUploadIcon\\\" ng-click=\\\"triggerFileUpload()\\\" class=\\\"miniBtnAction miniBtnAction--edit miniBtn2ndFromRight\\\"><svg><use xlink:href=\\\"#icon-icon-edit\\\"></use></svg></a>\\n  </div>\\n</div>\\n\\n<div class=\\\"i-uploader-button\\\" ng-show=\\\"imageModel === null || testOverride\\\">\\n  <button type=\\\"button\\\" ng-click=\\\"triggerFileUpload()\\\" class=\\\"i-cta-1 btn-upload\\\">{{::i18n.t('campaign_editor.buttons.upload_an_image')}}</button>\\n  <input class=\\\"cloudinary-fileupload\\\" name=\\\"file\\\" type=\\\"file\\\" data-cloudinary-field=\\\"image_id\\\"/>\\n</div>\\n<div class=\\\"i-error-text\\\" ng-show=\\\"cloudinaryError\\\">{{cloudinaryError}}</div>\\n\";\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiODEuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9hbmNpbGxhcnkvdXRpbHMvY2wtdXBsb2FkYWJsZS1pbWFnZS5odG1sP2YzN2YiXSwic291cmNlc0NvbnRlbnQiOlsibW9kdWxlLmV4cG9ydHMgPSBcIjxkaXYgY2xhc3M9XFxcImltYWdlLWNvbnRhaW5lclxcXCIgbmctY2xpY2s9XFxcInRyaWdnZXJVcGxvYWRJZkJsYW5rSW1hZ2UoKVxcXCJcXG4gICAgIG5nLWNsYXNzPVxcXCJ7J25vdC1lbXB0eSc6IGltYWdlTW9kZWwgIT09IG51bGwsICdpLWZpZWxkLWVycm9yJzogc2hvd0Vycm9yIHx8IGNsb3VkaW5hcnlFcnJvcn1cXFwiPlxcbiAgPGRpdiBuZy1pZj1cXFwiaW1hZ2VNb2RlbCA9PSB1bmRlZmluZWQgJiYgbWlzc2luZ0ltYWdlUGF0aCA9PSB1bmRlZmluZWRcXFwiIGNsYXNzPVxcXCJjbEltYWdlVXBsb2FkZXItcGxhY2Vob2xkZXJcXFwiPjxzdmc+PHVzZSB4bGluazpocmVmPVxcXCIjaWNvbi1pY29uLWNyZWF0ZS1waG90b1xcXCI+PC91c2U+PC9zdmc+PC9kaXY+XFxuICA8aW1nIGNsLWltYWdlIHdpZHRoPVxcXCJ7e3dpZHRofX1cXFwiIGhlaWdodD1cXFwie3toZWlnaHR9fVxcXCIgY3JvcD1cXFwie3tjcm9wfX1cXFwiXFxuICAgICAgIHB1YmxpYy1pZD1cXFwiaW1hZ2VNb2RlbC5wdWJsaWNJZFxcXCIgYWx0PVxcXCJ7e2kxOG4udCgndXBsb2FkX2FuX2ltYWdlJyl9fVxcXCJcXG4gICAgICAgcGxhY2Vob2xkZXItcGF0aD1cXFwie3ttaXNzaW5nSW1hZ2VQYXRofX1cXFwiLz5cXG5cXG4gIDxpIGNsYXNzPVxcXCJpLWZhLWNlbnRlcmVkIGktZmEtZ29nZW50YSBmYSBmYS1zcGlubmVyIGZhLTR4IGZhLXNwaW5cXFwiIG5nLXNob3c9XFxcInNob3dTcGlubmVyXFxcIj48L2k+XFxuXFxuICA8ZGl2IG5nLWlmPVxcXCJpbWFnZU1vZGVsICE9PSBudWxsXFxcIj5cXG4gICAgPGEgbmctaWY9XFxcInNob3dEZWxldGVcXFwiIG5nLWNsaWNrPVxcXCJyZXNldEltYWdlRmlsZSgkZXZlbnQpXFxcIiBjbGFzcz1cXFwibWluaUJ0bkFjdGlvbiBtaW5pQnRuQWN0aW9uLS1kZWxldGUgbWluaUJ0blRvcFJpZ2h0XFxcIj48c3ZnPjx1c2UgeGxpbms6aHJlZj1cXFwiI2ljb24taWNvbi1jbG9zZVxcXCI+PC91c2U+PC9zdmc+PC9hPlxcbiAgICA8YSBuZy1pZj1cXFwic2hvd1VwbG9hZEljb25cXFwiIG5nLWNsaWNrPVxcXCJ0cmlnZ2VyRmlsZVVwbG9hZCgpXFxcIiBjbGFzcz1cXFwibWluaUJ0bkFjdGlvbiBtaW5pQnRuQWN0aW9uLS1lZGl0IG1pbmlCdG4ybmRGcm9tUmlnaHRcXFwiPjxzdmc+PHVzZSB4bGluazpocmVmPVxcXCIjaWNvbi1pY29uLWVkaXRcXFwiPjwvdXNlPjwvc3ZnPjwvYT5cXG4gIDwvZGl2PlxcbjwvZGl2PlxcblxcbjxkaXYgY2xhc3M9XFxcImktdXBsb2FkZXItYnV0dG9uXFxcIiBuZy1zaG93PVxcXCJpbWFnZU1vZGVsID09PSBudWxsIHx8IHRlc3RPdmVycmlkZVxcXCI+XFxuICA8YnV0dG9uIHR5cGU9XFxcImJ1dHRvblxcXCIgbmctY2xpY2s9XFxcInRyaWdnZXJGaWxlVXBsb2FkKClcXFwiIGNsYXNzPVxcXCJpLWN0YS0xIGJ0bi11cGxvYWRcXFwiPnt7OjppMThuLnQoJ2NhbXBhaWduX2VkaXRvci5idXR0b25zLnVwbG9hZF9hbl9pbWFnZScpfX08L2J1dHRvbj5cXG4gIDxpbnB1dCBjbGFzcz1cXFwiY2xvdWRpbmFyeS1maWxldXBsb2FkXFxcIiBuYW1lPVxcXCJmaWxlXFxcIiB0eXBlPVxcXCJmaWxlXFxcIiBkYXRhLWNsb3VkaW5hcnktZmllbGQ9XFxcImltYWdlX2lkXFxcIi8+XFxuPC9kaXY+XFxuPGRpdiBjbGFzcz1cXFwiaS1lcnJvci10ZXh0XFxcIiBuZy1zaG93PVxcXCJjbG91ZGluYXJ5RXJyb3JcXFwiPnt7Y2xvdWRpbmFyeUVycm9yfX08L2Rpdj5cXG5cIjtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vYW5jaWxsYXJ5L3V0aWxzL2NsLXVwbG9hZGFibGUtaW1hZ2UuaHRtbFxuICoqIG1vZHVsZSBpZCA9IDgxXG4gKiogbW9kdWxlIGNodW5rcyA9IDI0XG4gKiovIl0sIm1hcHBpbmdzIjoiQUFBQSIsInNvdXJjZVJvb3QiOiIifQ==");

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

	eval("'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nexports.default = function () {\n  return {\n    restrict: 'A',\n    scope: {\n      'clamp': '@'\n    },\n    link: function link($scope, elem, attrs) {\n      var lineLimit = $scope.clamp || 'auto';\n      (0, _clampJs2.default)(elem[0], { clamp: lineLimit });\n    }\n  };\n};\n\nvar _clampJs = __webpack_require__(83);\n\nvar _clampJs2 = _interopRequireDefault(_clampJs);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiODIuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9hbmNpbGxhcnkvdXRpbHMvY2xhbXAtZGlyZWN0aXZlLmpzPzM4MGQiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICRjbGFtcCBmcm9tICdjbGFtcC1qcyc7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKCkge1xuICByZXR1cm4ge1xuICAgIHJlc3RyaWN0OiAnQScsXG4gICAgc2NvcGU6IHtcbiAgICAgICdjbGFtcCc6ICdAJ1xuICAgIH0sXG4gICAgbGluazogZnVuY3Rpb24oJHNjb3BlLCBlbGVtLCBhdHRycykge1xuICAgICAgbGV0IGxpbmVMaW1pdCA9ICRzY29wZS5jbGFtcCB8fCAnYXV0byc7XG4gICAgICAkY2xhbXAoZWxlbVswXSwge2NsYW1wOiBsaW5lTGltaXR9KTtcbiAgICB9XG4gIH07XG59XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiAuL2FuY2lsbGFyeS91dGlscy9jbGFtcC1kaXJlY3RpdmUuanNcbiAqKi8iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUhBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7Ozs7QUFWQTtBQUNBO0FBb0JBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9");

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

	eval("var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/*!\n * Clamp.js 0.7.0\n *\n * Copyright 2011-2013, Joseph Schmitt http://joe.sh\n * Released under the WTFPL license\n * http://sam.zoy.org/wtfpl/\n */\n\n(function(root, factory) {\n  if (true) {\n    // AMD\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    // Node, CommonJS-like\n    module.exports = factory();\n  } else {\n    // Browser globals\n    root.$clamp = factory();\n  }\n}(this, function() {\n  /**\n   * Clamps a text node.\n   * @param {HTMLElement} element. Element containing the text node to clamp.\n   * @param {Object} options. Options to pass to the clamper.\n   */\n  function clamp(element, options) {\n    options = options || {};\n\n    var self = this,\n      win = window,\n      opt = {\n        clamp: options.clamp || 2,\n        useNativeClamp: typeof(options.useNativeClamp) != 'undefined' ? options.useNativeClamp : true,\n        splitOnChars: options.splitOnChars || ['.', '-', '–', '—', ' '], //Split on sentences (periods), hypens, en-dashes, em-dashes, and words (spaces).\n        animate: options.animate || false,\n        truncationChar: options.truncationChar || '…',\n        truncationHTML: options.truncationHTML\n      },\n\n      sty = element.style,\n      originalText = element.innerHTML,\n\n      supportsNativeClamp = typeof(element.style.webkitLineClamp) != 'undefined',\n      clampValue = opt.clamp,\n      isCSSValue = clampValue.indexOf && (clampValue.indexOf('px') > -1 || clampValue.indexOf('em') > -1),\n      truncationHTMLContainer;\n\n    if (opt.truncationHTML) {\n      truncationHTMLContainer = document.createElement('span');\n      truncationHTMLContainer.innerHTML = opt.truncationHTML;\n    }\n\n\n    // UTILITY FUNCTIONS __________________________________________________________\n\n    /**\n     * Return the current style for an element.\n     * @param {HTMLElement} elem The element to compute.\n     * @param {string} prop The style property.\n     * @returns {number}\n     */\n    function computeStyle(elem, prop) {\n      if (!win.getComputedStyle) {\n        win.getComputedStyle = function(el, pseudo) {\n          this.el = el;\n          this.getPropertyValue = function(prop) {\n            var re = /(\\-([a-z]){1})/g;\n            if (prop == 'float') prop = 'styleFloat';\n            if (re.test(prop)) {\n              prop = prop.replace(re, function() {\n                return arguments[2].toUpperCase();\n              });\n            }\n            return el.currentStyle && el.currentStyle[prop] ? el.currentStyle[prop] : null;\n          };\n          return this;\n        };\n      }\n\n      return win.getComputedStyle(elem, null).getPropertyValue(prop);\n    }\n\n    /**\n     * Returns the maximum number of lines of text that should be rendered based\n     * on the current height of the element and the line-height of the text.\n     */\n    function getMaxLines(height) {\n      var availHeight = height || element.clientHeight,\n        lineHeight = getLineHeight(element);\n\n      return Math.max(Math.floor(availHeight / lineHeight), 0);\n    }\n\n    /**\n     * Returns the maximum height a given element should have based on the line-\n     * height of the text and the given clamp value.\n     */\n    function getMaxHeight(clmp) {\n      var lineHeight = getLineHeight(element);\n      return lineHeight * clmp;\n    }\n\n    /**\n     * Returns the line-height of an element as an integer.\n     */\n    function getLineHeight(elem) {\n      var lh = computeStyle(elem, 'line-height');\n      if (lh == 'normal') {\n        // Normal line heights vary from browser to browser. The spec recommends\n        // a value between 1.0 and 1.2 of the font size. Using 1.1 to split the diff.\n        lh = parseInt(computeStyle(elem, 'font-size')) * 1.2;\n      }\n      return parseInt(lh);\n    }\n\n\n    // MEAT AND POTATOES (MMMM, POTATOES...) ______________________________________\n    var splitOnChars = opt.splitOnChars.slice(0),\n      splitChar = splitOnChars[0],\n      chunks,\n      lastChunk;\n\n    /**\n     * Gets an element's last child. That may be another node or a node's contents.\n     */\n    function getLastChild(elem) {\n      //Current element has children, need to go deeper and get last child as a text node\n      if (elem.lastChild.children && elem.lastChild.children.length > 0) {\n        return getLastChild(Array.prototype.slice.call(elem.children).pop());\n      }\n      //This is the absolute last child, a text node, but something's wrong with it. Remove it and keep trying\n      else if (!elem.lastChild || !elem.lastChild.nodeValue || elem.lastChild.nodeValue === '' || elem.lastChild.nodeValue == opt.truncationChar) {\n        elem.lastChild.parentNode.removeChild(elem.lastChild);\n        return getLastChild(element);\n      }\n      //This is the last child we want, return it\n      else {\n        return elem.lastChild;\n      }\n    }\n\n    /**\n     * Removes one character at a time from the text until its width or\n     * height is beneath the passed-in max param.\n     */\n    function truncate(target, maxHeight) {\n      if (!maxHeight) {\n        return;\n      }\n\n      /**\n       * Resets global variables.\n       */\n      function reset() {\n        splitOnChars = opt.splitOnChars.slice(0);\n        splitChar = splitOnChars[0];\n        chunks = null;\n        lastChunk = null;\n      }\n\n      var nodeValue = target.nodeValue.replace(opt.truncationChar, '');\n\n      //Grab the next chunks\n      if (!chunks) {\n        //If there are more characters to try, grab the next one\n        if (splitOnChars.length > 0) {\n          splitChar = splitOnChars.shift();\n        }\n        //No characters to chunk by. Go character-by-character\n        else {\n          splitChar = '';\n        }\n\n        chunks = nodeValue.split(splitChar);\n      }\n\n      //If there are chunks left to remove, remove the last one and see if\n      // the nodeValue fits.\n      if (chunks.length > 1) {\n        // console.log('chunks', chunks);\n        lastChunk = chunks.pop();\n        // console.log('lastChunk', lastChunk);\n        applyEllipsis(target, chunks.join(splitChar));\n      }\n      //No more chunks can be removed using this character\n      else {\n        chunks = null;\n      }\n\n      //Insert the custom HTML before the truncation character\n      if (truncationHTMLContainer) {\n        target.nodeValue = target.nodeValue.replace(opt.truncationChar, '');\n        element.innerHTML = target.nodeValue + ' ' + truncationHTMLContainer.innerHTML + opt.truncationChar;\n      }\n\n      //Search produced valid chunks\n      if (chunks) {\n        //It fits\n        if (element.clientHeight <= maxHeight) {\n          //There's still more characters to try splitting on, not quite done yet\n          if (splitOnChars.length >= 0 && splitChar !== '') {\n            applyEllipsis(target, chunks.join(splitChar) + splitChar + lastChunk);\n            chunks = null;\n          }\n          //Finished!\n          else {\n            return element.innerHTML;\n          }\n        }\n      }\n      //No valid chunks produced\n      else {\n        //No valid chunks even when splitting by letter, time to move\n        //on to the next node\n        if (splitChar === '') {\n          applyEllipsis(target, '');\n          target = getLastChild(element);\n\n          reset();\n        }\n      }\n\n      //If you get here it means still too big, let's keep truncating\n      if (opt.animate) {\n        setTimeout(function() {\n          truncate(target, maxHeight);\n        }, opt.animate === true ? 10 : opt.animate);\n      } else {\n        return truncate(target, maxHeight);\n      }\n    }\n\n    function applyEllipsis(elem, str) {\n      elem.nodeValue = str + opt.truncationChar;\n    }\n\n\n    // CONSTRUCTOR ________________________________________________________________\n\n    if (clampValue == 'auto') {\n      clampValue = getMaxLines();\n    } else if (isCSSValue) {\n      clampValue = getMaxLines(parseInt(clampValue));\n    }\n\n    var clampedText;\n    if (supportsNativeClamp && opt.useNativeClamp) {\n      sty.overflow = 'hidden';\n      sty.textOverflow = 'ellipsis';\n      sty.webkitBoxOrient = 'vertical';\n      sty.display = '-webkit-box';\n      sty.webkitLineClamp = clampValue;\n\n      if (isCSSValue) {\n        sty.height = opt.clamp + 'px';\n      }\n    } else {\n      var height = getMaxHeight(clampValue);\n      if (height <= element.clientHeight) {\n        clampedText = truncate(getLastChild(element), height);\n      }\n    }\n\n    return {\n      'original': originalText,\n      'clamped': clampedText\n    };\n  }\n\n  return clamp;\n}));\n\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiODMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9+L2NsYW1wLWpzL2NsYW1wLmpzPzg1MTIiXSwic291cmNlc0NvbnRlbnQiOlsiLyohXG4gKiBDbGFtcC5qcyAwLjcuMFxuICpcbiAqIENvcHlyaWdodCAyMDExLTIwMTMsIEpvc2VwaCBTY2htaXR0IGh0dHA6Ly9qb2Uuc2hcbiAqIFJlbGVhc2VkIHVuZGVyIHRoZSBXVEZQTCBsaWNlbnNlXG4gKiBodHRwOi8vc2FtLnpveS5vcmcvd3RmcGwvXG4gKi9cblxuKGZ1bmN0aW9uKHJvb3QsIGZhY3RvcnkpIHtcbiAgaWYgKHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCkge1xuICAgIC8vIEFNRFxuICAgIGRlZmluZShbXSwgZmFjdG9yeSk7XG4gIH0gZWxzZSBpZiAodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnKSB7XG4gICAgLy8gTm9kZSwgQ29tbW9uSlMtbGlrZVxuICAgIG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeSgpO1xuICB9IGVsc2Uge1xuICAgIC8vIEJyb3dzZXIgZ2xvYmFsc1xuICAgIHJvb3QuJGNsYW1wID0gZmFjdG9yeSgpO1xuICB9XG59KHRoaXMsIGZ1bmN0aW9uKCkge1xuICAvKipcbiAgICogQ2xhbXBzIGEgdGV4dCBub2RlLlxuICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbGVtZW50LiBFbGVtZW50IGNvbnRhaW5pbmcgdGhlIHRleHQgbm9kZSB0byBjbGFtcC5cbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMuIE9wdGlvbnMgdG8gcGFzcyB0byB0aGUgY2xhbXBlci5cbiAgICovXG4gIGZ1bmN0aW9uIGNsYW1wKGVsZW1lbnQsIG9wdGlvbnMpIHtcbiAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcblxuICAgIHZhciBzZWxmID0gdGhpcyxcbiAgICAgIHdpbiA9IHdpbmRvdyxcbiAgICAgIG9wdCA9IHtcbiAgICAgICAgY2xhbXA6IG9wdGlvbnMuY2xhbXAgfHwgMixcbiAgICAgICAgdXNlTmF0aXZlQ2xhbXA6IHR5cGVvZihvcHRpb25zLnVzZU5hdGl2ZUNsYW1wKSAhPSAndW5kZWZpbmVkJyA/IG9wdGlvbnMudXNlTmF0aXZlQ2xhbXAgOiB0cnVlLFxuICAgICAgICBzcGxpdE9uQ2hhcnM6IG9wdGlvbnMuc3BsaXRPbkNoYXJzIHx8IFsnLicsICctJywgJ+KAkycsICfigJQnLCAnICddLCAvL1NwbGl0IG9uIHNlbnRlbmNlcyAocGVyaW9kcyksIGh5cGVucywgZW4tZGFzaGVzLCBlbS1kYXNoZXMsIGFuZCB3b3JkcyAoc3BhY2VzKS5cbiAgICAgICAgYW5pbWF0ZTogb3B0aW9ucy5hbmltYXRlIHx8IGZhbHNlLFxuICAgICAgICB0cnVuY2F0aW9uQ2hhcjogb3B0aW9ucy50cnVuY2F0aW9uQ2hhciB8fCAn4oCmJyxcbiAgICAgICAgdHJ1bmNhdGlvbkhUTUw6IG9wdGlvbnMudHJ1bmNhdGlvbkhUTUxcbiAgICAgIH0sXG5cbiAgICAgIHN0eSA9IGVsZW1lbnQuc3R5bGUsXG4gICAgICBvcmlnaW5hbFRleHQgPSBlbGVtZW50LmlubmVySFRNTCxcblxuICAgICAgc3VwcG9ydHNOYXRpdmVDbGFtcCA9IHR5cGVvZihlbGVtZW50LnN0eWxlLndlYmtpdExpbmVDbGFtcCkgIT0gJ3VuZGVmaW5lZCcsXG4gICAgICBjbGFtcFZhbHVlID0gb3B0LmNsYW1wLFxuICAgICAgaXNDU1NWYWx1ZSA9IGNsYW1wVmFsdWUuaW5kZXhPZiAmJiAoY2xhbXBWYWx1ZS5pbmRleE9mKCdweCcpID4gLTEgfHwgY2xhbXBWYWx1ZS5pbmRleE9mKCdlbScpID4gLTEpLFxuICAgICAgdHJ1bmNhdGlvbkhUTUxDb250YWluZXI7XG5cbiAgICBpZiAob3B0LnRydW5jYXRpb25IVE1MKSB7XG4gICAgICB0cnVuY2F0aW9uSFRNTENvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTtcbiAgICAgIHRydW5jYXRpb25IVE1MQ29udGFpbmVyLmlubmVySFRNTCA9IG9wdC50cnVuY2F0aW9uSFRNTDtcbiAgICB9XG5cblxuICAgIC8vIFVUSUxJVFkgRlVOQ1RJT05TIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19cblxuICAgIC8qKlxuICAgICAqIFJldHVybiB0aGUgY3VycmVudCBzdHlsZSBmb3IgYW4gZWxlbWVudC5cbiAgICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbGVtIFRoZSBlbGVtZW50IHRvIGNvbXB1dGUuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHByb3AgVGhlIHN0eWxlIHByb3BlcnR5LlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9XG4gICAgICovXG4gICAgZnVuY3Rpb24gY29tcHV0ZVN0eWxlKGVsZW0sIHByb3ApIHtcbiAgICAgIGlmICghd2luLmdldENvbXB1dGVkU3R5bGUpIHtcbiAgICAgICAgd2luLmdldENvbXB1dGVkU3R5bGUgPSBmdW5jdGlvbihlbCwgcHNldWRvKSB7XG4gICAgICAgICAgdGhpcy5lbCA9IGVsO1xuICAgICAgICAgIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZSA9IGZ1bmN0aW9uKHByb3ApIHtcbiAgICAgICAgICAgIHZhciByZSA9IC8oXFwtKFthLXpdKXsxfSkvZztcbiAgICAgICAgICAgIGlmIChwcm9wID09ICdmbG9hdCcpIHByb3AgPSAnc3R5bGVGbG9hdCc7XG4gICAgICAgICAgICBpZiAocmUudGVzdChwcm9wKSkge1xuICAgICAgICAgICAgICBwcm9wID0gcHJvcC5yZXBsYWNlKHJlLCBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gYXJndW1lbnRzWzJdLnRvVXBwZXJDYXNlKCk7XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGVsLmN1cnJlbnRTdHlsZSAmJiBlbC5jdXJyZW50U3R5bGVbcHJvcF0gPyBlbC5jdXJyZW50U3R5bGVbcHJvcF0gOiBudWxsO1xuICAgICAgICAgIH07XG4gICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB3aW4uZ2V0Q29tcHV0ZWRTdHlsZShlbGVtLCBudWxsKS5nZXRQcm9wZXJ0eVZhbHVlKHByb3ApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIG1heGltdW0gbnVtYmVyIG9mIGxpbmVzIG9mIHRleHQgdGhhdCBzaG91bGQgYmUgcmVuZGVyZWQgYmFzZWRcbiAgICAgKiBvbiB0aGUgY3VycmVudCBoZWlnaHQgb2YgdGhlIGVsZW1lbnQgYW5kIHRoZSBsaW5lLWhlaWdodCBvZiB0aGUgdGV4dC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBnZXRNYXhMaW5lcyhoZWlnaHQpIHtcbiAgICAgIHZhciBhdmFpbEhlaWdodCA9IGhlaWdodCB8fCBlbGVtZW50LmNsaWVudEhlaWdodCxcbiAgICAgICAgbGluZUhlaWdodCA9IGdldExpbmVIZWlnaHQoZWxlbWVudCk7XG5cbiAgICAgIHJldHVybiBNYXRoLm1heChNYXRoLmZsb29yKGF2YWlsSGVpZ2h0IC8gbGluZUhlaWdodCksIDApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIG1heGltdW0gaGVpZ2h0IGEgZ2l2ZW4gZWxlbWVudCBzaG91bGQgaGF2ZSBiYXNlZCBvbiB0aGUgbGluZS1cbiAgICAgKiBoZWlnaHQgb2YgdGhlIHRleHQgYW5kIHRoZSBnaXZlbiBjbGFtcCB2YWx1ZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBnZXRNYXhIZWlnaHQoY2xtcCkge1xuICAgICAgdmFyIGxpbmVIZWlnaHQgPSBnZXRMaW5lSGVpZ2h0KGVsZW1lbnQpO1xuICAgICAgcmV0dXJuIGxpbmVIZWlnaHQgKiBjbG1wO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIGxpbmUtaGVpZ2h0IG9mIGFuIGVsZW1lbnQgYXMgYW4gaW50ZWdlci5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBnZXRMaW5lSGVpZ2h0KGVsZW0pIHtcbiAgICAgIHZhciBsaCA9IGNvbXB1dGVTdHlsZShlbGVtLCAnbGluZS1oZWlnaHQnKTtcbiAgICAgIGlmIChsaCA9PSAnbm9ybWFsJykge1xuICAgICAgICAvLyBOb3JtYWwgbGluZSBoZWlnaHRzIHZhcnkgZnJvbSBicm93c2VyIHRvIGJyb3dzZXIuIFRoZSBzcGVjIHJlY29tbWVuZHNcbiAgICAgICAgLy8gYSB2YWx1ZSBiZXR3ZWVuIDEuMCBhbmQgMS4yIG9mIHRoZSBmb250IHNpemUuIFVzaW5nIDEuMSB0byBzcGxpdCB0aGUgZGlmZi5cbiAgICAgICAgbGggPSBwYXJzZUludChjb21wdXRlU3R5bGUoZWxlbSwgJ2ZvbnQtc2l6ZScpKSAqIDEuMjtcbiAgICAgIH1cbiAgICAgIHJldHVybiBwYXJzZUludChsaCk7XG4gICAgfVxuXG5cbiAgICAvLyBNRUFUIEFORCBQT1RBVE9FUyAoTU1NTSwgUE9UQVRPRVMuLi4pIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXG4gICAgdmFyIHNwbGl0T25DaGFycyA9IG9wdC5zcGxpdE9uQ2hhcnMuc2xpY2UoMCksXG4gICAgICBzcGxpdENoYXIgPSBzcGxpdE9uQ2hhcnNbMF0sXG4gICAgICBjaHVua3MsXG4gICAgICBsYXN0Q2h1bms7XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIGFuIGVsZW1lbnQncyBsYXN0IGNoaWxkLiBUaGF0IG1heSBiZSBhbm90aGVyIG5vZGUgb3IgYSBub2RlJ3MgY29udGVudHMuXG4gICAgICovXG4gICAgZnVuY3Rpb24gZ2V0TGFzdENoaWxkKGVsZW0pIHtcbiAgICAgIC8vQ3VycmVudCBlbGVtZW50IGhhcyBjaGlsZHJlbiwgbmVlZCB0byBnbyBkZWVwZXIgYW5kIGdldCBsYXN0IGNoaWxkIGFzIGEgdGV4dCBub2RlXG4gICAgICBpZiAoZWxlbS5sYXN0Q2hpbGQuY2hpbGRyZW4gJiYgZWxlbS5sYXN0Q2hpbGQuY2hpbGRyZW4ubGVuZ3RoID4gMCkge1xuICAgICAgICByZXR1cm4gZ2V0TGFzdENoaWxkKEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGVsZW0uY2hpbGRyZW4pLnBvcCgpKTtcbiAgICAgIH1cbiAgICAgIC8vVGhpcyBpcyB0aGUgYWJzb2x1dGUgbGFzdCBjaGlsZCwgYSB0ZXh0IG5vZGUsIGJ1dCBzb21ldGhpbmcncyB3cm9uZyB3aXRoIGl0LiBSZW1vdmUgaXQgYW5kIGtlZXAgdHJ5aW5nXG4gICAgICBlbHNlIGlmICghZWxlbS5sYXN0Q2hpbGQgfHwgIWVsZW0ubGFzdENoaWxkLm5vZGVWYWx1ZSB8fCBlbGVtLmxhc3RDaGlsZC5ub2RlVmFsdWUgPT09ICcnIHx8IGVsZW0ubGFzdENoaWxkLm5vZGVWYWx1ZSA9PSBvcHQudHJ1bmNhdGlvbkNoYXIpIHtcbiAgICAgICAgZWxlbS5sYXN0Q2hpbGQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChlbGVtLmxhc3RDaGlsZCk7XG4gICAgICAgIHJldHVybiBnZXRMYXN0Q2hpbGQoZWxlbWVudCk7XG4gICAgICB9XG4gICAgICAvL1RoaXMgaXMgdGhlIGxhc3QgY2hpbGQgd2Ugd2FudCwgcmV0dXJuIGl0XG4gICAgICBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGVsZW0ubGFzdENoaWxkO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgb25lIGNoYXJhY3RlciBhdCBhIHRpbWUgZnJvbSB0aGUgdGV4dCB1bnRpbCBpdHMgd2lkdGggb3JcbiAgICAgKiBoZWlnaHQgaXMgYmVuZWF0aCB0aGUgcGFzc2VkLWluIG1heCBwYXJhbS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiB0cnVuY2F0ZSh0YXJnZXQsIG1heEhlaWdodCkge1xuICAgICAgaWYgKCFtYXhIZWlnaHQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvKipcbiAgICAgICAqIFJlc2V0cyBnbG9iYWwgdmFyaWFibGVzLlxuICAgICAgICovXG4gICAgICBmdW5jdGlvbiByZXNldCgpIHtcbiAgICAgICAgc3BsaXRPbkNoYXJzID0gb3B0LnNwbGl0T25DaGFycy5zbGljZSgwKTtcbiAgICAgICAgc3BsaXRDaGFyID0gc3BsaXRPbkNoYXJzWzBdO1xuICAgICAgICBjaHVua3MgPSBudWxsO1xuICAgICAgICBsYXN0Q2h1bmsgPSBudWxsO1xuICAgICAgfVxuXG4gICAgICB2YXIgbm9kZVZhbHVlID0gdGFyZ2V0Lm5vZGVWYWx1ZS5yZXBsYWNlKG9wdC50cnVuY2F0aW9uQ2hhciwgJycpO1xuXG4gICAgICAvL0dyYWIgdGhlIG5leHQgY2h1bmtzXG4gICAgICBpZiAoIWNodW5rcykge1xuICAgICAgICAvL0lmIHRoZXJlIGFyZSBtb3JlIGNoYXJhY3RlcnMgdG8gdHJ5LCBncmFiIHRoZSBuZXh0IG9uZVxuICAgICAgICBpZiAoc3BsaXRPbkNoYXJzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBzcGxpdENoYXIgPSBzcGxpdE9uQ2hhcnMuc2hpZnQoKTtcbiAgICAgICAgfVxuICAgICAgICAvL05vIGNoYXJhY3RlcnMgdG8gY2h1bmsgYnkuIEdvIGNoYXJhY3Rlci1ieS1jaGFyYWN0ZXJcbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgc3BsaXRDaGFyID0gJyc7XG4gICAgICAgIH1cblxuICAgICAgICBjaHVua3MgPSBub2RlVmFsdWUuc3BsaXQoc3BsaXRDaGFyKTtcbiAgICAgIH1cblxuICAgICAgLy9JZiB0aGVyZSBhcmUgY2h1bmtzIGxlZnQgdG8gcmVtb3ZlLCByZW1vdmUgdGhlIGxhc3Qgb25lIGFuZCBzZWUgaWZcbiAgICAgIC8vIHRoZSBub2RlVmFsdWUgZml0cy5cbiAgICAgIGlmIChjaHVua3MubGVuZ3RoID4gMSkge1xuICAgICAgICAvLyBjb25zb2xlLmxvZygnY2h1bmtzJywgY2h1bmtzKTtcbiAgICAgICAgbGFzdENodW5rID0gY2h1bmtzLnBvcCgpO1xuICAgICAgICAvLyBjb25zb2xlLmxvZygnbGFzdENodW5rJywgbGFzdENodW5rKTtcbiAgICAgICAgYXBwbHlFbGxpcHNpcyh0YXJnZXQsIGNodW5rcy5qb2luKHNwbGl0Q2hhcikpO1xuICAgICAgfVxuICAgICAgLy9ObyBtb3JlIGNodW5rcyBjYW4gYmUgcmVtb3ZlZCB1c2luZyB0aGlzIGNoYXJhY3RlclxuICAgICAgZWxzZSB7XG4gICAgICAgIGNodW5rcyA9IG51bGw7XG4gICAgICB9XG5cbiAgICAgIC8vSW5zZXJ0IHRoZSBjdXN0b20gSFRNTCBiZWZvcmUgdGhlIHRydW5jYXRpb24gY2hhcmFjdGVyXG4gICAgICBpZiAodHJ1bmNhdGlvbkhUTUxDb250YWluZXIpIHtcbiAgICAgICAgdGFyZ2V0Lm5vZGVWYWx1ZSA9IHRhcmdldC5ub2RlVmFsdWUucmVwbGFjZShvcHQudHJ1bmNhdGlvbkNoYXIsICcnKTtcbiAgICAgICAgZWxlbWVudC5pbm5lckhUTUwgPSB0YXJnZXQubm9kZVZhbHVlICsgJyAnICsgdHJ1bmNhdGlvbkhUTUxDb250YWluZXIuaW5uZXJIVE1MICsgb3B0LnRydW5jYXRpb25DaGFyO1xuICAgICAgfVxuXG4gICAgICAvL1NlYXJjaCBwcm9kdWNlZCB2YWxpZCBjaHVua3NcbiAgICAgIGlmIChjaHVua3MpIHtcbiAgICAgICAgLy9JdCBmaXRzXG4gICAgICAgIGlmIChlbGVtZW50LmNsaWVudEhlaWdodCA8PSBtYXhIZWlnaHQpIHtcbiAgICAgICAgICAvL1RoZXJlJ3Mgc3RpbGwgbW9yZSBjaGFyYWN0ZXJzIHRvIHRyeSBzcGxpdHRpbmcgb24sIG5vdCBxdWl0ZSBkb25lIHlldFxuICAgICAgICAgIGlmIChzcGxpdE9uQ2hhcnMubGVuZ3RoID49IDAgJiYgc3BsaXRDaGFyICE9PSAnJykge1xuICAgICAgICAgICAgYXBwbHlFbGxpcHNpcyh0YXJnZXQsIGNodW5rcy5qb2luKHNwbGl0Q2hhcikgKyBzcGxpdENoYXIgKyBsYXN0Q2h1bmspO1xuICAgICAgICAgICAgY2h1bmtzID0gbnVsbDtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy9GaW5pc2hlZCFcbiAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBlbGVtZW50LmlubmVySFRNTDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vTm8gdmFsaWQgY2h1bmtzIHByb2R1Y2VkXG4gICAgICBlbHNlIHtcbiAgICAgICAgLy9ObyB2YWxpZCBjaHVua3MgZXZlbiB3aGVuIHNwbGl0dGluZyBieSBsZXR0ZXIsIHRpbWUgdG8gbW92ZVxuICAgICAgICAvL29uIHRvIHRoZSBuZXh0IG5vZGVcbiAgICAgICAgaWYgKHNwbGl0Q2hhciA9PT0gJycpIHtcbiAgICAgICAgICBhcHBseUVsbGlwc2lzKHRhcmdldCwgJycpO1xuICAgICAgICAgIHRhcmdldCA9IGdldExhc3RDaGlsZChlbGVtZW50KTtcblxuICAgICAgICAgIHJlc2V0KCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy9JZiB5b3UgZ2V0IGhlcmUgaXQgbWVhbnMgc3RpbGwgdG9vIGJpZywgbGV0J3Mga2VlcCB0cnVuY2F0aW5nXG4gICAgICBpZiAob3B0LmFuaW1hdGUpIHtcbiAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgICAgICB0cnVuY2F0ZSh0YXJnZXQsIG1heEhlaWdodCk7XG4gICAgICAgIH0sIG9wdC5hbmltYXRlID09PSB0cnVlID8gMTAgOiBvcHQuYW5pbWF0ZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gdHJ1bmNhdGUodGFyZ2V0LCBtYXhIZWlnaHQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGFwcGx5RWxsaXBzaXMoZWxlbSwgc3RyKSB7XG4gICAgICBlbGVtLm5vZGVWYWx1ZSA9IHN0ciArIG9wdC50cnVuY2F0aW9uQ2hhcjtcbiAgICB9XG5cblxuICAgIC8vIENPTlNUUlVDVE9SIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19cblxuICAgIGlmIChjbGFtcFZhbHVlID09ICdhdXRvJykge1xuICAgICAgY2xhbXBWYWx1ZSA9IGdldE1heExpbmVzKCk7XG4gICAgfSBlbHNlIGlmIChpc0NTU1ZhbHVlKSB7XG4gICAgICBjbGFtcFZhbHVlID0gZ2V0TWF4TGluZXMocGFyc2VJbnQoY2xhbXBWYWx1ZSkpO1xuICAgIH1cblxuICAgIHZhciBjbGFtcGVkVGV4dDtcbiAgICBpZiAoc3VwcG9ydHNOYXRpdmVDbGFtcCAmJiBvcHQudXNlTmF0aXZlQ2xhbXApIHtcbiAgICAgIHN0eS5vdmVyZmxvdyA9ICdoaWRkZW4nO1xuICAgICAgc3R5LnRleHRPdmVyZmxvdyA9ICdlbGxpcHNpcyc7XG4gICAgICBzdHkud2Via2l0Qm94T3JpZW50ID0gJ3ZlcnRpY2FsJztcbiAgICAgIHN0eS5kaXNwbGF5ID0gJy13ZWJraXQtYm94JztcbiAgICAgIHN0eS53ZWJraXRMaW5lQ2xhbXAgPSBjbGFtcFZhbHVlO1xuXG4gICAgICBpZiAoaXNDU1NWYWx1ZSkge1xuICAgICAgICBzdHkuaGVpZ2h0ID0gb3B0LmNsYW1wICsgJ3B4JztcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIGhlaWdodCA9IGdldE1heEhlaWdodChjbGFtcFZhbHVlKTtcbiAgICAgIGlmIChoZWlnaHQgPD0gZWxlbWVudC5jbGllbnRIZWlnaHQpIHtcbiAgICAgICAgY2xhbXBlZFRleHQgPSB0cnVuY2F0ZShnZXRMYXN0Q2hpbGQoZWxlbWVudCksIGhlaWdodCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgICdvcmlnaW5hbCc6IG9yaWdpbmFsVGV4dCxcbiAgICAgICdjbGFtcGVkJzogY2xhbXBlZFRleHRcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIGNsYW1wO1xufSkpO1xuXG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vY2xhbXAtanMvY2xhbXAuanNcbiAqKiBtb2R1bGUgaWQgPSA4M1xuICoqIG1vZHVsZSBjaHVua3MgPSAyNFxuICoqLyJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9");

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

	eval("\"use strict\";\n\ncloudinary.$inject = [\"gon\"];\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = cloudinary;\n/*@ngInject*/\nfunction cloudinary(gon) {\n\n  var cloudinaryOptions = {};\n  if (gon && gon.services && gon.services.cloudinary) {\n    cloudinaryOptions = {\n      url: gon.services.cloudinary.data.url,\n      cloudName: gon.services.cloudinary.data.cloud_name,\n      formData: gon.services.cloudinary.data.form_data\n    };\n  }\n\n  return {\n    setCloudinaryOptions: function setCloudinaryOptions(options) {\n      cloudinaryOptions = options;\n    },\n    forFileInput: function forFileInput($fileInput, $dropzone) {\n      $fileInput.cloudinary_fileupload(angular.extend({ headers: { \"X-Requested-With\": \"XMLHttpRequest\" }, dropZone: $dropzone, pasteZone: $dropzone }, cloudinaryOptions));\n      return {\n        onUploadStart: function onUploadStart(callback) {\n          $fileInput.on('cloudinarystart', callback);\n          return this;\n        },\n        onUploadComplete: function onUploadComplete(callback) {\n          $fileInput.on('cloudinarydone', function (e, response) {\n            callback(response.result);\n          });\n          return this;\n        },\n        onUploadFail: function onUploadFail(callback) {\n          $fileInput.on('cloudinaryfail', function (e, response) {\n            callback(response);\n          });\n          return this;\n        }\n      };\n    }\n  };\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiODQuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9hbmNpbGxhcnkvdXRpbHMvY2xvdWRpbmFyeS1mYWN0b3J5LmpzP2QzYTMiXSwic291cmNlc0NvbnRlbnQiOlsiLypAbmdJbmplY3QqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gY2xvdWRpbmFyeSAoZ29uKSB7XG5cbiAgdmFyIGNsb3VkaW5hcnlPcHRpb25zID0ge307XG4gICAgaWYgKGdvbiAmJiBnb24uc2VydmljZXMgJiYgZ29uLnNlcnZpY2VzLmNsb3VkaW5hcnkpIHtcbiAgICAgIGNsb3VkaW5hcnlPcHRpb25zID0ge1xuICAgICAgICB1cmw6IGdvbi5zZXJ2aWNlcy5jbG91ZGluYXJ5LmRhdGEudXJsLFxuICAgICAgICBjbG91ZE5hbWU6IGdvbi5zZXJ2aWNlcy5jbG91ZGluYXJ5LmRhdGEuY2xvdWRfbmFtZSxcbiAgICAgICAgZm9ybURhdGE6IGdvbi5zZXJ2aWNlcy5jbG91ZGluYXJ5LmRhdGEuZm9ybV9kYXRhXG4gICAgICB9O1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBzZXRDbG91ZGluYXJ5T3B0aW9uczogZnVuY3Rpb24ob3B0aW9ucykge1xuICAgICAgICBjbG91ZGluYXJ5T3B0aW9ucyA9IG9wdGlvbnM7XG4gICAgICB9LFxuICAgICAgZm9yRmlsZUlucHV0OiBmdW5jdGlvbigkZmlsZUlucHV0LCAkZHJvcHpvbmUpIHtcbiAgICAgICAgJGZpbGVJbnB1dC5jbG91ZGluYXJ5X2ZpbGV1cGxvYWQoXG4gICAgICAgICAgYW5ndWxhci5leHRlbmQoXG4gICAgICAgICAgICB7IGhlYWRlcnM6IHtcIlgtUmVxdWVzdGVkLVdpdGhcIjogXCJYTUxIdHRwUmVxdWVzdFwifSwgZHJvcFpvbmU6ICRkcm9wem9uZSwgcGFzdGVab25lOiAkZHJvcHpvbmUgfSxcbiAgICAgICAgICAgIGNsb3VkaW5hcnlPcHRpb25zKVxuICAgICAgICApO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIG9uVXBsb2FkU3RhcnQ6IGZ1bmN0aW9uKGNhbGxiYWNrKSB7XG4gICAgICAgICAgICAkZmlsZUlucHV0Lm9uKCdjbG91ZGluYXJ5c3RhcnQnLCBjYWxsYmFjayk7XG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgICB9LFxuICAgICAgICAgIG9uVXBsb2FkQ29tcGxldGU6IGZ1bmN0aW9uKGNhbGxiYWNrKSB7XG4gICAgICAgICAgICAkZmlsZUlucHV0Lm9uKCdjbG91ZGluYXJ5ZG9uZScsIGZ1bmN0aW9uKGUsIHJlc3BvbnNlKSB7XG4gICAgICAgICAgICAgIGNhbGxiYWNrKHJlc3BvbnNlLnJlc3VsdCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgb25VcGxvYWRGYWlsOiBmdW5jdGlvbihjYWxsYmFjaykge1xuICAgICAgICAgICAgJGZpbGVJbnB1dC5vbignY2xvdWRpbmFyeWZhaWwnLCBmdW5jdGlvbihlLCByZXNwb25zZSkge1xuICAgICAgICAgICAgICBjYWxsYmFjayhyZXNwb25zZSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9O1xuICB9XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiAuL2FuY2lsbGFyeS91dGlscy9jbG91ZGluYXJ5LWZhY3RvcnkuanNcbiAqKi8iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7O0FBQ0E7QUFDQTs7QUFFQTs7QUFKQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FBSUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFLQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBOzs7OztBQXBDQSIsInNvdXJjZVJvb3QiOiIifQ==");

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

	eval("\"use strict\";\n\ncloudinaryImageUploadDirective.$inject = [\"cloudinary\"];\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = cloudinaryImageUploadDirective;\n/*@ngInject*/\n\nfunction cloudinaryImageUploadDirective(cloudinary) {\n  return {\n    scope: {\n      onCompleteFn: \"&onCompleteFn\",\n      status: \"=imageUploadStatus\"\n    },\n    transclude: true,\n    template: '<div ng-transclude ng-click=\"status.loading || clickPhoto()\"></div><input type=\"file\" name=\"file\" class=\"i-hide-offscreen\" data-cloudinary-field=\"image_id\" />',\n    link: function link(scope, element) {\n      var fileInput = element.find(\"input\");\n      var fileUploader = cloudinary.forFileInput(fileInput, element);\n\n      fileUploader.onUploadStart(function () {\n        scope.status.loading = true;\n        scope.$apply();\n      }).onUploadComplete(function (result) {\n        scope.status.loading = false;\n        scope.status.publicId = result.public_id;\n        fileInput = element.find(\"input\");\n        scope.onCompleteFn()(result);\n        scope.$apply();\n      }).onUploadFail(function () {\n        scope.status.loading = false;\n        fileInput = element.find(\"input\");\n      });\n\n      scope.clickPhoto = function () {\n        fileInput.trigger('click');\n      };\n    }\n  };\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiODUuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9hbmNpbGxhcnkvdXRpbHMvY2xvdWRpbmFyeS1pbWFnZS11cGxvYWQtZGlyZWN0aXZlLmpzPzZjOTgiXSwic291cmNlc0NvbnRlbnQiOlsiLypAbmdJbmplY3QqL1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBjbG91ZGluYXJ5SW1hZ2VVcGxvYWREaXJlY3RpdmUoY2xvdWRpbmFyeSkge1xuICByZXR1cm4ge1xuICAgIHNjb3BlOiB7XG4gICAgICBvbkNvbXBsZXRlRm46IFwiJm9uQ29tcGxldGVGblwiLFxuICAgICAgc3RhdHVzOiBcIj1pbWFnZVVwbG9hZFN0YXR1c1wiXG4gICAgfSxcbiAgICB0cmFuc2NsdWRlOiB0cnVlLFxuICAgIHRlbXBsYXRlOiAnPGRpdiBuZy10cmFuc2NsdWRlIG5nLWNsaWNrPVwic3RhdHVzLmxvYWRpbmcgfHwgY2xpY2tQaG90bygpXCI+PC9kaXY+PGlucHV0IHR5cGU9XCJmaWxlXCIgbmFtZT1cImZpbGVcIiBjbGFzcz1cImktaGlkZS1vZmZzY3JlZW5cIiBkYXRhLWNsb3VkaW5hcnktZmllbGQ9XCJpbWFnZV9pZFwiIC8+JyxcbiAgICBsaW5rOiBmdW5jdGlvbiAoc2NvcGUsIGVsZW1lbnQpIHtcbiAgICAgIHZhciBmaWxlSW5wdXQgPSBlbGVtZW50LmZpbmQoXCJpbnB1dFwiKTtcbiAgICAgIHZhciBmaWxlVXBsb2FkZXIgPSBjbG91ZGluYXJ5LmZvckZpbGVJbnB1dChmaWxlSW5wdXQsIGVsZW1lbnQpO1xuXG4gICAgICBmaWxlVXBsb2FkZXIub25VcGxvYWRTdGFydChmdW5jdGlvbiAoKSB7XG4gICAgICAgIHNjb3BlLnN0YXR1cy5sb2FkaW5nID0gdHJ1ZTtcbiAgICAgICAgc2NvcGUuJGFwcGx5KCk7XG4gICAgICB9KS5vblVwbG9hZENvbXBsZXRlKGZ1bmN0aW9uIChyZXN1bHQpIHtcbiAgICAgICAgc2NvcGUuc3RhdHVzLmxvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgc2NvcGUuc3RhdHVzLnB1YmxpY0lkID0gcmVzdWx0LnB1YmxpY19pZDtcbiAgICAgICAgZmlsZUlucHV0ID0gZWxlbWVudC5maW5kKFwiaW5wdXRcIik7XG4gICAgICAgIHNjb3BlLm9uQ29tcGxldGVGbigpKHJlc3VsdCk7XG4gICAgICAgIHNjb3BlLiRhcHBseSgpO1xuICAgICAgfSkub25VcGxvYWRGYWlsKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgc2NvcGUuc3RhdHVzLmxvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgZmlsZUlucHV0ID0gZWxlbWVudC5maW5kKFwiaW5wdXRcIik7XG4gICAgICB9KTtcblxuICAgICAgc2NvcGUuY2xpY2tQaG90byA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgZmlsZUlucHV0LnRyaWdnZXIoJ2NsaWNrJyk7XG4gICAgICB9O1xuICAgIH1cbiAgfTtcbn1cblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIC4vYW5jaWxsYXJ5L3V0aWxzL2Nsb3VkaW5hcnktaW1hZ2UtdXBsb2FkLWRpcmVjdGl2ZS5qc1xuICoqLyJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTs7QUFDQTtBQUNBOztBQUVBOzs7QUFIQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTs7OztBQTNCQSIsInNvdXJjZVJvb3QiOiIifQ==");

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

	eval("\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = compareTo;\n/*@ngInject*/\nfunction compareTo() {\n  return {\n    require: \"ngModel\",\n    scope: {\n      otherModelValue: \"=compareTo\"\n    },\n    link: function link(scope, element, attributes, ngModel) {\n\n      ngModel.$validators.compareTo = function (modelValue) {\n        return modelValue == scope.otherModelValue;\n      };\n\n      scope.$watch(\"otherModelValue\", function () {\n        ngModel.$validate();\n      });\n    }\n  };\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiODYuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9hbmNpbGxhcnkvdXRpbHMvY29tcGFyZS10by1kaXJlY3RpdmUuanM/MjgyNCJdLCJzb3VyY2VzQ29udGVudCI6WyIvKkBuZ0luamVjdCovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBjb21wYXJlVG8oKSB7XG4gIHJldHVybiB7XG4gICAgcmVxdWlyZTogXCJuZ01vZGVsXCIsXG4gICAgc2NvcGU6IHtcbiAgICAgIG90aGVyTW9kZWxWYWx1ZTogXCI9Y29tcGFyZVRvXCJcbiAgICB9LFxuICAgIGxpbms6IGZ1bmN0aW9uKHNjb3BlLCBlbGVtZW50LCBhdHRyaWJ1dGVzLCBuZ01vZGVsKSB7XG5cbiAgICAgIG5nTW9kZWwuJHZhbGlkYXRvcnMuY29tcGFyZVRvID0gZnVuY3Rpb24obW9kZWxWYWx1ZSkge1xuICAgICAgICByZXR1cm4gbW9kZWxWYWx1ZSA9PSBzY29wZS5vdGhlck1vZGVsVmFsdWU7XG4gICAgICB9O1xuXG4gICAgICBzY29wZS4kd2F0Y2goXCJvdGhlck1vZGVsVmFsdWVcIiwgZnVuY3Rpb24oKSB7XG4gICAgICAgIG5nTW9kZWwuJHZhbGlkYXRlKCk7XG4gICAgICB9KTtcbiAgICB9XG4gIH07XG59XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiAuL2FuY2lsbGFyeS91dGlscy9jb21wYXJlLXRvLWRpcmVjdGl2ZS5qc1xuICoqLyJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBSkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTs7OztBQWJBIiwic291cmNlUm9vdCI6IiJ9");

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

	eval("'use strict';\n\ncopyUrl.$inject = [\"$http\", \"gon\", \"i18n\", \"fb\", \"twitter\", \"gplus\", \"$timeout\", \"$window\", \"browser\"];\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = copyUrl;\n/*@ngInject*/\nfunction copyUrl($http, gon, i18n, fb, twitter, gplus, $timeout, $window, browser) {\n\n  return {\n    restrict: 'A',\n    link: function link(scope, element, attrs) {\n      element.on('click', function () {\n        $window.prompt(\"Copy link, then click OK.\", attrs.copyUrl);\n      });\n    }\n  };\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiODcuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9hbmNpbGxhcnkvdXRpbHMvY29weS11cmwtZGlyZWN0aXZlLmpzP2IyYmEiXSwic291cmNlc0NvbnRlbnQiOlsiLypAbmdJbmplY3QqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gY29weVVybCAoJGh0dHAsIGdvbiwgaTE4biwgZmIsIHR3aXR0ZXIsIGdwbHVzLCAkdGltZW91dCwgJHdpbmRvdywgYnJvd3Nlcikge1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICByZXN0cmljdDogJ0EnLFxuICAgICAgICBsaW5rOiBmdW5jdGlvbihzY29wZSwgZWxlbWVudCwgYXR0cnMpIHtcbiAgICAgICAgICBlbGVtZW50Lm9uKCdjbGljaycsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICR3aW5kb3cucHJvbXB0KFwiQ29weSBsaW5rLCB0aGVuIGNsaWNrIE9LLlwiLCBhdHRycy5jb3B5VXJsKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgIH1cblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIC4vYW5jaWxsYXJ5L3V0aWxzL2NvcHktdXJsLWRpcmVjdGl2ZS5qc1xuICoqLyJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTs7QUFDQTtBQUNBOztBQUVBOztBQUpBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FBTkEiLCJzb3VyY2VSb290IjoiIn0=");

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

	eval("\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\n/*@ngInject*/\nexports.default = function (i18n) {\n  var localizedCountries = _.map(countries, function (country) {\n    return {\n      \"country_code_alpha_2\": country.alpha_2,\n      \"country_code\": 'CTRY_' + country.alpha_2,\n      \"text\": country.locales[i18n.locale || 'en'],\n      \"common\": _.include(country.tags, \"common\"),\n      \"tags\": country.tags,\n      \"european\": _.include(country.tags, \"european_union\")\n    };\n  });\n\n  var sortedCountries = _.sortBy(localizedCountries, function (country) {\n    return country.country_code_alpha_2 === 'US' ? '' : country.text;\n  });\n  var commonChoices = _.select(sortedCountries, function (country) {\n    return country.common;\n  });\n  var remainingChoices = _.select(sortedCountries, function (country) {\n    return !country.common;\n  });\n  var europeanCountries = _.select(sortedCountries, function (country) {\n    return country.european;\n  });\n\n  var divider = {\n    \"country_code_alpha_2\": null,\n    \"text\": \"—\",\n    ships_to: false,\n    isDisabled: true,\n    tags: [\"divider\"]\n  };\n\n  var all = function all() {\n    return _.union(commonChoices, remainingChoices);\n  };\n\n  var asUiSelectItems = function asUiSelectItems(options) {\n    if (options && options.grouped) {\n      return all();\n    } else {\n      return _.union(commonChoices, [divider], remainingChoices);\n    }\n  };\n\n  var countryGrouping = function countryGrouping(item) {\n    return item.common ? i18n.t('country_groups.common') : i18n.t('country_groups.other');\n  };\n  var findByAlpha2 = function findByAlpha2(alpha2) {\n    return _.find(all(), { country_code_alpha_2: alpha2 });\n  };\n  var findByText = function findByText(text) {\n    return _.find(all(), function (country) {\n      return country.text.toLowerCase() === text.toLowerCase();\n    });\n  };\n  var findByCode = function findByCode(code) {\n    return _.find(all(), { country_code_alpha_2: code && code.substring(5) });\n  };\n  var findByTwoLetterCode = function findByTwoLetterCode(twoLetter) {\n    return findByCode('CTRY_' + twoLetter);\n  };\n  var europeanUnion = function europeanUnion() {\n    return _.map(europeanCountries, function (country) {\n      return country.country_code_alpha_2;\n    });\n  };\n  var alpha2InEU = function alpha2InEU(code) {\n    return !!_.contains(europeanUnion(), code);\n  };\n  var alphabetized = function alphabetized() {\n    return _.sortBy(localizedCountries, function (ctry) {\n      return ctry.text;\n    });\n  };\n\n  var zipCodeLabelKey = function zipCodeLabelKey(countryCode) {\n    if (countryCode === '' || countryCode === 'CTRY_US') {\n      return 'zip_code';\n    } else if (countryCode === 'CTRY_CA') {\n      return 'postal_code';\n    } else {\n      var postalCodeOverrides = {\n        CTRY_GB: 'post_code',\n        CTRY_PH: 'zip_code',\n        CTRY_IN: 'pin_code'\n      };\n      return postalCodeOverrides[countryCode] || 'postal_code';\n    }\n  };\n\n  var simplifyForTests = function simplifyForTests(optionalAlpha2s) {\n    var alpha2s = optionalAlpha2s || ['AD', 'JP', 'IT', 'LI'];\n    remainingChoices = _.select(remainingChoices, function (choice) {\n      return _.include(alpha2s, choice.country_code_alpha_2);\n    });\n  };\n\n  return {\n    all: all,\n    asUiSelectItems: asUiSelectItems,\n    countryGrouping: countryGrouping,\n    findByText: findByText,\n    findByAlpha2: findByAlpha2,\n    findByCode: findByCode,\n    findByTwoLetterCode: findByTwoLetterCode,\n    europeanUnion: europeanUnion,\n    alpha2InEU: alpha2InEU,\n    alphabetized: alphabetized,\n    zipCodeLabelKey: zipCodeLabelKey,\n    simplifyForTests: simplifyForTests\n  };\n};\nexports.default.$inject = [\"i18n\"];\n\n/* To refresh, open up a Rails console and type \"puts JSON.pretty_generate(Country.in_order.map(&:as_country_service_json))\" */\n\n\nvar countries = [{\n  \"alpha_2\": \"US\",\n  \"locales\": {\n    \"en\": \"United States\",\n    \"fr\": \"Etats-Unis\",\n    \"de\": \"Vereinigte Staaten\",\n    \"es\": \"Estados Unidos\"\n  },\n  \"tags\": [\"common\"]\n}, {\n  \"alpha_2\": \"AU\",\n  \"locales\": {\n    \"en\": \"Australia\",\n    \"fr\": \"Australie\",\n    \"de\": \"Australien\",\n    \"es\": \"Australia\"\n  },\n  \"tags\": [\"common\"]\n}, {\n  \"alpha_2\": \"CA\",\n  \"locales\": {\n    \"en\": \"Canada\",\n    \"fr\": \"Canada\",\n    \"de\": \"Kanada\",\n    \"es\": \"Canadá\"\n  },\n  \"tags\": [\"common\"]\n}, {\n  \"alpha_2\": \"DE\",\n  \"locales\": {\n    \"en\": \"Germany\",\n    \"fr\": \"Allemagne\",\n    \"de\": \"Deutschland\",\n    \"es\": \"Alemania\"\n  },\n  \"tags\": [\"common\", \"european_union\"]\n}, {\n  \"alpha_2\": \"GB\",\n  \"locales\": {\n    \"en\": \"United Kingdom\",\n    \"fr\": \"Royaume-Uni\",\n    \"de\": \"Großbritannien\",\n    \"es\": \"Reino Unido\"\n  },\n  \"tags\": [\"common\", \"european_union\"]\n}, {\n  \"alpha_2\": \"AF\",\n  \"locales\": {\n    \"en\": \"Afghanistan\",\n    \"fr\": \"Afghanistan\",\n    \"de\": \"Afghanistan\",\n    \"es\": \"Afganistán\"\n  },\n  \"tags\": []\n}, {\n  \"alpha_2\": \"AX\",\n  \"locales\": {\n    \"en\": \"Aland Islands\",\n    \"fr\": \"Aland\",\n    \"de\": \"Alandinseln\",\n    \"es\": \"Islas Aland\"\n  },\n  \"tags\": []\n}, {\n  \"alpha_2\": \"AL\",\n  \"locales\": {\n    \"en\": \"Albania\",\n    \"fr\": \"Albanie\",\n    \"de\": \"Albanien\",\n    \"es\": \"Albania\"\n  },\n  \"tags\": []\n}, {\n  \"alpha_2\": \"DZ\",\n  \"locales\": {\n    \"en\": \"Algeria\",\n    \"fr\": \"Algérie\",\n    \"de\": \"Algerien\",\n    \"es\": \"Argelia\"\n  },\n  \"tags\": []\n}, {\n  \"alpha_2\": \"AS\",\n  \"locales\": {\n    \"en\": \"American Samoa\",\n    \"fr\": \"Samoa américaines\",\n    \"de\": \"Amerikanisch-Samoa\",\n    \"es\": \"Samoa Americana\"\n  },\n  \"tags\": []\n}, {\n  \"alpha_2\": \"AD\",\n  \"locales\": {\n    \"en\": \"Andorra\",\n    \"fr\": \"Andorre\",\n    \"de\": \"Andorra\",\n    \"es\": \"Andorra\"\n  },\n  \"tags\": []\n}, {\n  \"alpha_2\": \"AO\",\n  \"locales\": {\n    \"en\": \"Angola\",\n    \"fr\": \"Angola\",\n    \"de\": \"Angola\",\n    \"es\": \"Angola\"\n  },\n  \"tags\": []\n}, {\n  \"alpha_2\": \"AI\",\n  \"locales\": {\n    \"en\": \"Anguilla\",\n    \"fr\": \"Anguilla\",\n    \"de\": \"Anguilla\",\n    \"es\": \"Anguila\"\n  },\n  \"tags\": []\n}, {\n  \"alpha_2\": \"AQ\",\n  \"locales\": {\n    \"en\": \"Antarctica\",\n    \"fr\": \"Antarctique\",\n    \"de\": \"Antarktis\",\n    \"es\": \"Antártida\"\n  },\n  \"tags\": []\n}, {\n  \"alpha_2\": \"AG\",\n  \"locales\": {\n    \"en\": \"Antigua and Barbuda\",\n    \"fr\": \"Antigua-et-Barbuda\",\n    \"de\": \"Antigua und Barbuda\",\n    \"es\": \"Antigua y Barbuda\"\n  },\n  \"tags\": []\n}, {\n  \"alpha_2\": \"AR\",\n  \"locales\": {\n    \"en\": \"Argentina\",\n    \"fr\": \"Argentine\",\n    \"de\": \"Argentinien\",\n    \"es\": \"Argentina\"\n  },\n  \"tags\": []\n}, {\n  \"alpha_2\": \"AM\",\n  \"locales\": {\n    \"en\": \"Armenia\",\n    \"fr\": \"Arménie\",\n    \"de\": \"Armenien\",\n    \"es\": \"Armenia\"\n  },\n  \"tags\": []\n}, {\n  \"alpha_2\": \"AW\",\n  \"locales\": {\n    \"en\": \"Aruba\",\n    \"fr\": \"Aruba\",\n    \"de\": \"Aruba\",\n    \"es\": \"Aruba\"\n  },\n  \"tags\": []\n}, {\n  \"alpha_2\": \"AT\",\n  \"locales\": {\n    \"en\": \"Austria\",\n    \"fr\": \"Autriche\",\n    \"de\": \"Österreich\",\n    \"es\": \"Austria\"\n  },\n  \"tags\": [\"european_union\"]\n}, {\n  \"alpha_2\": \"AZ\",\n  \"locales\": {\n    \"en\": \"Azerbaijan\",\n    \"fr\": \"Azerbaïdjan\",\n    \"de\": \"Aserbaidschan\",\n    \"es\": \"Azerbaiyán\"\n  },\n  \"tags\": []\n}, {\n  \"alpha_2\": \"BS\",\n  \"locales\": {\n    \"en\": \"Bahamas\",\n    \"fr\": \"Bahams\",\n    \"de\": \"Bahamas\",\n    \"es\": \"Bahamas\"\n  },\n  \"tags\": []\n}, {\n  \"alpha_2\": \"BH\",\n  \"locales\": {\n    \"en\": \"Bahrain\",\n    \"fr\": \"Bahreïn\",\n    \"de\": \"Bahrain\",\n    \"es\": \"Bahréin\"\n  },\n  \"tags\": []\n}, {\n  \"alpha_2\": \"BD\",\n  \"locales\": {\n    \"en\": \"Bangladesh\",\n    \"fr\": \"Bangladesh\",\n    \"de\": \"Bangladesh\",\n    \"es\": \"Bangladesh\"\n  },\n  \"tags\": []\n}, {\n  \"alpha_2\": \"BB\",\n  \"locales\": {\n    \"en\": \"Barbados\",\n    \"fr\": \"Barbade\",\n    \"de\": \"Barbados\",\n    \"es\": \"Barbados\"\n  },\n  \"tags\": []\n}, {\n  \"alpha_2\": \"BY\",\n  \"locales\": {\n    \"en\": \"Belarus\",\n    \"fr\": \"Biélorussie\",\n    \"de\": \"Belarus\",\n    \"es\": \"Belarús\"\n  },\n  \"tags\": []\n}, {\n  \"alpha_2\": \"BE\",\n  \"locales\": {\n    \"en\": \"Belgium\",\n    \"fr\": \"Belgique\",\n    \"de\": \"Belgien\",\n    \"es\": \"Bélgica\"\n  },\n  \"tags\": [\"european_union\"]\n}, {\n  \"alpha_2\": \"BZ\",\n  \"locales\": {\n    \"en\": \"Belize\",\n    \"fr\": \"Belize\",\n    \"de\": \"Belize\",\n    \"es\": \"Belice\"\n  },\n  \"tags\": []\n}, {\n  \"alpha_2\": \"BJ\",\n  \"locales\": {\n    \"en\": \"Benin\",\n    \"fr\": \"Bénin\",\n    \"de\": \"Benin\",\n    \"es\": \"Benín\"\n  },\n  \"tags\": []\n}, {\n  \"alpha_2\": \"BM\",\n  \"locales\": {\n    \"en\": \"Bermuda\",\n    \"fr\": \"Bermudes\",\n    \"de\": \"Bermuda\",\n    \"es\": \"Bermudas\"\n  },\n  \"tags\": []\n}, {\n  \"alpha_2\": \"BT\",\n  \"locales\": {\n    \"en\": \"Bhutan\",\n    \"fr\": \"Bhoutan\",\n    \"de\": \"Bhutan\",\n    \"es\": \"Bután\"\n  },\n  \"tags\": []\n}, {\n  \"alpha_2\": \"BO\",\n  \"locales\": {\n    \"en\": \"Bolivia\",\n    \"fr\": \"Bolivie\",\n    \"de\": \"Bolivien\",\n    \"es\": \"Bolivia\"\n  },\n  \"tags\": []\n}, {\n  \"alpha_2\": \"BA\",\n  \"locales\": {\n    \"en\": \"Bosnia and Herzegovina\",\n    \"fr\": \"Bosnie-Herzégovine\",\n    \"de\": \"Bosnien-Herzegowina\",\n    \"es\": \"Bosnia y Herzegovina\"\n  },\n  \"tags\": []\n}, {\n  \"alpha_2\": \"BW\",\n  \"locales\": {\n    \"en\": \"Botswana\",\n    \"fr\": \"Botswana\",\n    \"de\": \"Botswana\",\n    \"es\": \"Botsuana\"\n  },\n  \"tags\": []\n}, {\n  \"alpha_2\": \"BV\",\n  \"locales\": {\n    \"en\": \"Bouvet Island\",\n    \"fr\": \"Île Bouvet\",\n    \"de\": \"Bouvetinsel\",\n    \"es\": \"Isla Bouvet\"\n  },\n  \"tags\": []\n}, {\n  \"alpha_2\": \"BR\",\n  \"locales\": {\n    \"en\": \"Brazil\",\n    \"fr\": \"Brésil\",\n    \"de\": \"Brasilien\",\n    \"es\": \"Brasil\"\n  },\n  \"tags\": []\n}, {\n  \"alpha_2\": \"IO\",\n  \"locales\": {\n    \"en\": \"British Indian Ocean Territory\",\n    \"fr\": \"Territoire britannique de l'océan Indien\",\n    \"de\": \"Britisches Territorium im Indischen Ozean\",\n    \"es\": \"Territorio Británico del Océano Índico\"\n  },\n  \"tags\": []\n}, {\n  \"alpha_2\": \"BN\",\n  \"locales\": {\n    \"en\": \"Brunei Darussalam\",\n    \"fr\": \"Brunei\",\n    \"de\": \"Brunei Darussalam\",\n    \"es\": \"Brunei Darussalam\"\n  },\n  \"tags\": []\n}, {\n  \"alpha_2\": \"BG\",\n  \"locales\": {\n    \"en\": \"Bulgaria\",\n    \"fr\": \"Bulgarie\",\n    \"de\": \"Bulgarien\",\n    \"es\": \"Bulgaria\"\n  },\n  \"tags\": [\"european_union\"]\n}, {\n  \"alpha_2\": \"BF\",\n  \"locales\": {\n    \"en\": \"Burkina Faso\",\n    \"fr\": \"Burkina Faso\",\n    \"de\": \"Burkina Faso\",\n    \"es\": \"Burkina Faso\"\n  },\n  \"tags\": []\n}, {\n  \"alpha_2\": \"BI\",\n  \"locales\": {\n    \"en\": \"Burundi\",\n    \"fr\": \"Burundi\",\n    \"de\": \"Burundi\",\n    \"es\": \"Burundi\"\n  },\n  \"tags\": []\n}, {\n  \"alpha_2\": \"KH\",\n  \"locales\": {\n    \"en\": \"Cambodia\",\n    \"fr\": \"Cambodge\",\n    \"de\": \"Kambodscha\",\n    \"es\": \"Camboya\"\n  },\n  \"tags\": []\n}, {\n  \"alpha_2\": \"CM\",\n  \"locales\": {\n    \"en\": \"Cameroon\",\n    \"fr\": \"Cameroun\",\n    \"de\": \"Kamerun\",\n    \"es\": \"Camerún\"\n  },\n  \"tags\": []\n}, {\n  \"alpha_2\": \"CV\",\n  \"locales\": {\n    \"en\": \"Cape Verde\",\n    \"fr\": \"Cap-Vert\",\n    \"de\": \"Kap Verde\",\n    \"es\": \"Cabo Verde\"\n  },\n  \"tags\": []\n}, {\n  \"alpha_2\": \"KY\",\n  \"locales\": {\n    \"en\": \"Cayman Islands\",\n    \"fr\": \"Îles Caïman\",\n    \"de\": \"Kaimaninseln\",\n    \"es\": \"Islas Caimán\"\n  },\n  \"tags\": []\n}, {\n  \"alpha_2\": \"CF\",\n  \"locales\": {\n    \"en\": \"Central African Republic\",\n    \"fr\": \"Centrafrique\",\n    \"de\": \"Zentralafrikanische Republik\",\n    \"es\": \"República Centroafricana\"\n  },\n  \"tags\": []\n}, {\n  \"alpha_2\": \"TD\",\n  \"locales\": {\n    \"en\": \"Chad\",\n    \"fr\": \"Tchad\",\n    \"de\": \"Tschad\",\n    \"es\": \"Chad\"\n  },\n  \"tags\": []\n}, {\n  \"alpha_2\": \"CL\",\n  \"locales\": {\n    \"en\": \"Chile\",\n    \"fr\": \"Chili\",\n    \"de\": \"Chile\",\n    \"es\": \"Chile\"\n  },\n  \"tags\": []\n}, {\n  \"alpha_2\": \"CN\",\n  \"locales\": {\n    \"en\": \"China\",\n    \"fr\": \"Chine\",\n    \"de\": \"China\",\n    \"es\": \"China\"\n  },\n  \"tags\": []\n}, {\n  \"alpha_2\": \"CX\",\n  \"locales\": {\n    \"en\": \"Christmas Island\",\n    \"fr\": \"Île Christmas\",\n    \"de\": \"Weihnachtsinsel\",\n    \"es\": \"Isla de Navidad\"\n  },\n  \"tags\": []\n}, {\n  \"alpha_2\": \"CC\",\n  \"locales\": {\n    \"en\": \"Cocos (Keeling) Islands\",\n    \"fr\": \"Îles Cocos\",\n    \"de\": \"Cocosinseln\",\n    \"es\": \"Islas Cocos (Keeling)\"\n  },\n  \"tags\": []\n}, {\n  \"alpha_2\": \"CO\",\n  \"locales\": {\n    \"en\": \"Colombia\",\n    \"fr\": \"Colombie\",\n    \"de\": \"Kolumbien\",\n    \"es\": \"Colombia\"\n  },\n  \"tags\": []\n}, {\n  \"alpha_2\": \"KM\",\n  \"locales\": {\n    \"en\": \"Comoros\",\n    \"fr\": \"Comores\",\n    \"de\": \"Komoren\",\n    \"es\": \"Comoras\"\n  },\n  \"tags\": []\n}, {\n  \"alpha_2\": \"CG\",\n  \"locales\": {\n    \"en\": \"Congo\",\n    \"fr\": \"Congo\",\n    \"de\": \"Kongo\",\n    \"es\": \"Congo\"\n  },\n  \"tags\": []\n}, {\n  \"alpha_2\": \"CD\",\n  \"locales\": {\n    \"en\": \"Congo, the Democratic Republic of the\",\n    \"fr\": \"République Démocratique du Congo\",\n    \"de\": \"Kongo, demokratische Republik\",\n    \"es\": \"República Democrática del Congo\"\n  },\n  \"tags\": []\n}, {\n  \"alpha_2\": \"CK\",\n  \"locales\": {\n    \"en\": \"Cook Islands\",\n    \"fr\": \"Îles Cook\",\n    \"de\": \"Cookinseln\",\n    \"es\": \"Islas Cook\"\n  },\n  \"tags\": []\n}, {\n  \"alpha_2\": \"CR\",\n  \"locales\": {\n    \"en\": \"Costa Rica\",\n    \"fr\": \"Costa Rica\",\n    \"de\": \"Costa Rica\",\n    \"es\": \"Costa Rica\"\n  },\n  \"tags\": []\n}, {\n  \"alpha_2\": \"CI\",\n  \"locales\": {\n    \"en\": \"Cote d'Ivoire\",\n    \"fr\": \"Côte d'Ivoire\",\n    \"de\": \"Elfenbeinküste\",\n    \"es\": \"Costa de Marfil\"\n  },\n  \"tags\": []\n}, {\n  \"alpha_2\": \"HR\",\n  \"locales\": {\n    \"en\": \"Croatia\",\n    \"fr\": \"Croatie\",\n    \"de\": \"Kroatien\",\n    \"es\": \"Croacia\"\n  },\n  \"tags\": [\"european_union\"]\n}, {\n  \"alpha_2\": \"CW\",\n  \"locales\": {\n    \"en\": \"Curacao\",\n    \"fr\": \"Curaçao\",\n    \"de\": \"Curacao\",\n    \"es\": \"Curacao\"\n  },\n  \"tags\": []\n}, {\n  \"alpha_2\": \"CY\",\n  \"locales\": {\n    \"en\": \"Cyprus\",\n    \"fr\": \"Chypre\",\n    \"de\": \"Zypern\",\n    \"es\": \"Chipre\"\n  },\n  \"tags\": [\"european_union\"]\n}, {\n  \"alpha_2\": \"CZ\",\n  \"locales\": {\n    \"en\": \"Czech Republic\",\n    \"fr\": \"République Tchèque\",\n    \"de\": \"Tschechische Republik\",\n    \"es\": \"República Checa\"\n  },\n  \"tags\": [\"european_union\"]\n}, {\n  \"alpha_2\": \"DK\",\n  \"locales\": {\n    \"en\": \"Denmark\",\n    \"fr\": \"Danemark\",\n    \"de\": \"Dänemark\",\n    \"es\": \"Dinamarca\"\n  },\n  \"tags\": [\"european_union\"]\n}, {\n  \"alpha_2\": \"DJ\",\n  \"locales\": {\n    \"en\": \"Djibouti\",\n    \"fr\": \"Djibouti\",\n    \"de\": \"Dschibuti\",\n    \"es\": \"Yibuti\"\n  },\n  \"tags\": []\n}, {\n  \"alpha_2\": \"DM\",\n  \"locales\": {\n    \"en\": \"Dominica\",\n    \"fr\": \"Dominique\",\n    \"de\": \"Dominica\",\n    \"es\": \"Dominica\"\n  },\n  \"tags\": []\n}, {\n  \"alpha_2\": \"DO\",\n  \"locales\": {\n    \"en\": \"Dominican Republic\",\n    \"fr\": \"République Dominicaine\",\n    \"de\": \"Dominikanische Republik\",\n    \"es\": \"República Dominicana\"\n  },\n  \"tags\": []\n}, {\n  \"alpha_2\": \"EC\",\n  \"locales\": {\n    \"en\": \"Ecuador\",\n    \"fr\": \"Equateur\",\n    \"de\": \"Ecuador\",\n    \"es\": \"Ecuador\"\n  },\n  \"tags\": []\n}, {\n  \"alpha_2\": \"EG\",\n  \"locales\": {\n    \"en\": \"Egypt\",\n    \"fr\": \"Egypte\",\n    \"de\": \"Ägypten\",\n    \"es\": \"Egipto\"\n  },\n  \"tags\": []\n}, {\n  \"alpha_2\": \"SV\",\n  \"locales\": {\n    \"en\": \"El Salvador\",\n    \"fr\": \"El Salvador\",\n    \"de\": \"El Salvador\",\n    \"es\": \"El Salvador\"\n  },\n  \"tags\": []\n}, {\n  \"alpha_2\": \"GQ\",\n  \"locales\": {\n    \"en\": \"Equatorial Guinea\",\n    \"fr\": \"Guinée équatoriale\",\n    \"de\": \"Äquatorialguinea\",\n    \"es\": \"Guinea Ecuatorial\"\n  },\n  \"tags\": []\n}, {\n  \"alpha_2\": \"ER\",\n  \"locales\": {\n    \"en\": \"Eritrea\",\n    \"fr\": \"Erythrée\",\n    \"de\": \"Eritrea\",\n    \"es\": \"Eritrea\"\n  },\n  \"tags\": []\n}, {\n  \"alpha_2\": \"EE\",\n  \"locales\": {\n    \"en\": \"Estonia\",\n    \"fr\": \"Estonie\",\n    \"de\": \"Estland\",\n    \"es\": \"Estonia\"\n  },\n  \"tags\": [\"european_union\"]\n}, {\n  \"alpha_2\": \"ET\",\n  \"locales\": {\n    \"en\": \"Ethiopia\",\n    \"fr\": \"Ethiopie\",\n    \"de\": \"Äthiopien\",\n    \"es\": \"Etiopía\"\n  },\n  \"tags\": []\n}, {\n  \"alpha_2\": \"FK\",\n  \"locales\": {\n    \"en\": \"Falkland Islands (Malvinas)\",\n    \"fr\": \"Îles Falkland (Malouines)\",\n    \"de\": \"Falklandinseln (Malwinen)\",\n    \"es\": \"Islas Malvinas (Falkland)\"\n  },\n  \"tags\": []\n}, {\n  \"alpha_2\": \"FO\",\n  \"locales\": {\n    \"en\": \"Faroe Islands\",\n    \"fr\": \"Îles Faroe\",\n    \"de\": \"Färöer Inseln\",\n    \"es\": \"Islas Feroe\"\n  },\n  \"tags\": []\n}, {\n  \"alpha_2\": \"FJ\",\n  \"locales\": {\n    \"en\": \"Fiji\",\n    \"fr\": \"Fidji\",\n    \"de\": \"Fidschi\",\n    \"es\": \"Fiji\"\n  },\n  \"tags\": []\n}, {\n  \"alpha_2\": \"FI\",\n  \"locales\": {\n    \"en\": \"Finland\",\n    \"fr\": \"Finlande\",\n    \"de\": \"Finnland\",\n    \"es\": \"Finlandia\"\n  },\n  \"tags\": [\"european_union\"]\n}, {\n  \"alpha_2\": \"FR\",\n  \"locales\": {\n    \"en\": \"France\",\n    \"fr\": \"France\",\n    \"de\": \"Frankreich\",\n    \"es\": \"Francia\"\n  },\n  \"tags\": [\"european_union\"]\n}, {\n  \"alpha_2\": \"GF\",\n  \"locales\": {\n    \"en\": \"French Guiana\",\n    \"fr\": \"Guyane\",\n    \"de\": \"Französisch-Guayana\",\n    \"es\": \"Guayana Francesa\"\n  },\n  \"tags\": []\n}, {\n  \"alpha_2\": \"PF\",\n  \"locales\": {\n    \"en\": \"French Polynesia\",\n    \"fr\": \"Polynésie française\",\n    \"de\": \"Französisch-Polynesien\",\n    \"es\": \"Polinesia Francesa\"\n  },\n  \"tags\": []\n}, {\n  \"alpha_2\": \"TF\",\n  \"locales\": {\n    \"en\": \"French Southern Territories\",\n    \"fr\": \"Terres australes et antarctiques françaises\",\n    \"de\": \"Französische Südpolar-Territorien\",\n    \"es\": \"Territorios Australes Franceses\"\n  },\n  \"tags\": []\n}, {\n  \"alpha_2\": \"GA\",\n  \"locales\": {\n    \"en\": \"Gabon\",\n    \"fr\": \"Gabon\",\n    \"de\": \"Gabun\",\n    \"es\": \"Gabón\"\n  },\n  \"tags\": []\n}, {\n  \"alpha_2\": \"GM\",\n  \"locales\": {\n    \"en\": \"Gambia\",\n    \"fr\": \"Gambie\",\n    \"de\": \"Gambia\",\n    \"es\": \"Gambia\"\n  },\n  \"tags\": []\n}, {\n  \"alpha_2\": \"GE\",\n  \"locales\": {\n    \"en\": \"Georgia\",\n    \"fr\": \"Géorgie\",\n    \"de\": \"Georgien\",\n    \"es\": \"Georgia\"\n  },\n  \"tags\": []\n}, {\n  \"alpha_2\": \"GH\",\n  \"locales\": {\n    \"en\": \"Ghana\",\n    \"fr\": \"Ghana\",\n    \"de\": \"Ghana\",\n    \"es\": \"Ghana\"\n  },\n  \"tags\": []\n}, {\n  \"alpha_2\": \"GI\",\n  \"locales\": {\n    \"en\": \"Gibraltar\",\n    \"fr\": \"Gibraltar\",\n    \"de\": \"Gibraltar\",\n    \"es\": \"Gibraltar\"\n  },\n  \"tags\": []\n}, {\n  \"alpha_2\": \"GR\",\n  \"locales\": {\n    \"en\": \"Greece\",\n    \"fr\": \"Grèce\",\n    \"de\": \"Griechenland\",\n    \"es\": \"Grecia\"\n  },\n  \"tags\": [\"european_union\"]\n}, {\n  \"alpha_2\": \"GL\",\n  \"locales\": {\n    \"en\": \"Greenland\",\n    \"fr\": \"Groenland\",\n    \"de\": \"Grönland\",\n    \"es\": \"Groenlandia\"\n  },\n  \"tags\": []\n}, {\n  \"alpha_2\": \"GD\",\n  \"locales\": {\n    \"en\": \"Grenada\",\n    \"fr\": \"Grenade\",\n    \"de\": \"Grenada\",\n    \"es\": \"Granada\"\n  },\n  \"tags\": []\n}, {\n  \"alpha_2\": \"GP\",\n  \"locales\": {\n    \"en\": \"Guadeloupe\",\n    \"fr\": \"Guadeloupe\",\n    \"de\": \"Guadeloupe\",\n    \"es\": \"Guadalupe\"\n  },\n  \"tags\": []\n}, {\n  \"alpha_2\": \"GU\",\n  \"locales\": {\n    \"en\": \"Guam\",\n    \"fr\": \"Guam\",\n    \"de\": \"Guam\",\n    \"es\": \"Guam\"\n  },\n  \"tags\": []\n}, {\n  \"alpha_2\": \"GT\",\n  \"locales\": {\n    \"en\": \"Guatemala\",\n    \"fr\": \"Guatemala\",\n    \"de\": \"Guatemala\",\n    \"es\": \"Guatemala\"\n  },\n  \"tags\": []\n}, {\n  \"alpha_2\": \"GN\",\n  \"locales\": {\n    \"en\": \"Guinea\",\n    \"fr\": \"Guinée\",\n    \"de\": \"Guinea\",\n    \"es\": \"Guinea\"\n  },\n  \"tags\": []\n}, {\n  \"alpha_2\": \"GW\",\n  \"locales\": {\n    \"en\": \"Guinea-Bissau\",\n    \"fr\": \"Guinée-Bissau\",\n    \"de\": \"Guinea-Bissau\",\n    \"es\": \"Guinea-Bissau\"\n  },\n  \"tags\": []\n}, {\n  \"alpha_2\": \"GY\",\n  \"locales\": {\n    \"en\": \"Guyana\",\n    \"fr\": \"Guyana\",\n    \"de\": \"Guyana\",\n    \"es\": \"Guayana\"\n  },\n  \"tags\": []\n}, {\n  \"alpha_2\": \"HT\",\n  \"locales\": {\n    \"en\": \"Haiti\",\n    \"fr\": \"Haïti\",\n    \"de\": \"Haiti\",\n    \"es\": \"Haití\"\n  },\n  \"tags\": []\n}, {\n  \"alpha_2\": \"HM\",\n  \"locales\": {\n    \"en\": \"Heard Island and McDonald Islands\",\n    \"fr\": \"Îles Heard-et-MacDonald\",\n    \"de\": \"Heard-Insel und McDonald-Inseln\",\n    \"es\": \"Islas Heard y McDonald\"\n  },\n  \"tags\": []\n}, {\n  \"alpha_2\": \"VA\",\n  \"locales\": {\n    \"en\": \"Holy See (Vatican City State)\",\n    \"fr\": \"Saint-Siège (Etat du Vatican)\",\n    \"de\": \"Vatikanstadt\",\n    \"es\": \"Santa Sede (Ciudad del Vaticano)\"\n  },\n  \"tags\": []\n}, {\n  \"alpha_2\": \"HN\",\n  \"locales\": {\n    \"en\": \"Honduras\",\n    \"fr\": \"Honduras\",\n    \"de\": \"Honduras\",\n    \"es\": \"Honduras\"\n  },\n  \"tags\": []\n}, {\n  \"alpha_2\": \"HK\",\n  \"locales\": {\n    \"en\": \"Hong Kong\",\n    \"fr\": \"Hong Kong\",\n    \"de\": \"Hong Kong\",\n    \"es\": \"Hong Kong\"\n  },\n  \"tags\": []\n}, {\n  \"alpha_2\": \"HU\",\n  \"locales\": {\n    \"en\": \"Hungary\",\n    \"fr\": \"Hongrie\",\n    \"de\": \"Ungarn\",\n    \"es\": \"Hungría\"\n  },\n  \"tags\": [\"european_union\"]\n}, {\n  \"alpha_2\": \"IS\",\n  \"locales\": {\n    \"en\": \"Iceland\",\n    \"fr\": \"Islande\",\n    \"de\": \"Island\",\n    \"es\": \"Islandia\"\n  },\n  \"tags\": []\n}, {\n  \"alpha_2\": \"IN\",\n  \"locales\": {\n    \"en\": \"India\",\n    \"fr\": \"Inde\",\n    \"de\": \"Indien\",\n    \"es\": \"India\"\n  },\n  \"tags\": []\n}, {\n  \"alpha_2\": \"ID\",\n  \"locales\": {\n    \"en\": \"Indonesia\",\n    \"fr\": \"Indonésie\",\n    \"de\": \"Indonesien\",\n    \"es\": \"Indonesia\"\n  },\n  \"tags\": []\n}, {\n  \"alpha_2\": \"IQ\",\n  \"locales\": {\n    \"en\": \"Iraq\",\n    \"fr\": \"Irak\",\n    \"de\": \"Irak\",\n    \"es\": \"Iraq\"\n  },\n  \"tags\": []\n}, {\n  \"alpha_2\": \"IE\",\n  \"locales\": {\n    \"en\": \"Ireland\",\n    \"fr\": \"Irlande\",\n    \"de\": \"Irland\",\n    \"es\": \"Irlanda\"\n  },\n  \"tags\": [\"european_union\"]\n}, {\n  \"alpha_2\": \"IL\",\n  \"locales\": {\n    \"en\": \"Israel\",\n    \"fr\": \"Israël\",\n    \"de\": \"Israel\",\n    \"es\": \"Israel\"\n  },\n  \"tags\": []\n}, {\n  \"alpha_2\": \"IT\",\n  \"locales\": {\n    \"en\": \"Italy\",\n    \"fr\": \"Italie\",\n    \"de\": \"Italien\",\n    \"es\": \"Italia\"\n  },\n  \"tags\": [\"european_union\"]\n}, {\n  \"alpha_2\": \"JM\",\n  \"locales\": {\n    \"en\": \"Jamaica\",\n    \"fr\": \"Jamaïque\",\n    \"de\": \"Jamaica\",\n    \"es\": \"Jamaica\"\n  },\n  \"tags\": []\n}, {\n  \"alpha_2\": \"JP\",\n  \"locales\": {\n    \"en\": \"Japan\",\n    \"fr\": \"Japon\",\n    \"de\": \"Japan\",\n    \"es\": \"Japón\"\n  },\n  \"tags\": []\n}, {\n  \"alpha_2\": \"JO\",\n  \"locales\": {\n    \"en\": \"Jordan\",\n    \"fr\": \"Jordanie\",\n    \"de\": \"Jordanien\",\n    \"es\": \"Jordania\"\n  },\n  \"tags\": []\n}, {\n  \"alpha_2\": \"KZ\",\n  \"locales\": {\n    \"en\": \"Kazakhstan\",\n    \"fr\": \"Kazakhstan\",\n    \"de\": \"Kasachstan\",\n    \"es\": \"Kazajistán\"\n  },\n  \"tags\": []\n}, {\n  \"alpha_2\": \"KE\",\n  \"locales\": {\n    \"en\": \"Kenya\",\n    \"fr\": \"Kenya\",\n    \"de\": \"Kenia\",\n    \"es\": \"Kenia\"\n  },\n  \"tags\": []\n}, {\n  \"alpha_2\": \"KI\",\n  \"locales\": {\n    \"en\": \"Kiribati\",\n    \"fr\": \"Kiribati\",\n    \"de\": \"Kiribati\",\n    \"es\": \"Kiribati\"\n  },\n  \"tags\": []\n}, {\n  \"alpha_2\": \"KR\",\n  \"locales\": {\n    \"en\": \"Korea, Republic of\",\n    \"fr\": \"République de Corée\",\n    \"de\": \"Korea, Republik\",\n    \"es\": \"República de Corea\"\n  },\n  \"tags\": []\n}, {\n  \"alpha_2\": \"XK\",\n  \"locales\": {\n    \"en\": \"Kosovo\",\n    \"fr\": \"Kosovo\",\n    \"de\": \"Kosovo\",\n    \"es\": \"Kosovo\"\n  },\n  \"tags\": []\n}, {\n  \"alpha_2\": \"KW\",\n  \"locales\": {\n    \"en\": \"Kuwait\",\n    \"fr\": \"Koweït\",\n    \"de\": \"Kuwait\",\n    \"es\": \"Kuwait\"\n  },\n  \"tags\": []\n}, {\n  \"alpha_2\": \"KG\",\n  \"locales\": {\n    \"en\": \"Kyrgyzstan\",\n    \"fr\": \"Kirghizistan\",\n    \"de\": \"Kirgisistan\",\n    \"es\": \"Kirguistán\"\n  },\n  \"tags\": []\n}, {\n  \"alpha_2\": \"LA\",\n  \"locales\": {\n    \"en\": \"Lao People's Democratic Republic\",\n    \"fr\": \"Laos\",\n    \"de\": \"Laos\",\n    \"es\": \"República Democrática Popular Lao\"\n  },\n  \"tags\": []\n}, {\n  \"alpha_2\": \"LV\",\n  \"locales\": {\n    \"en\": \"Latvia\",\n    \"fr\": \"Lettonie\",\n    \"de\": \"Lettland\",\n    \"es\": \"Letonia\"\n  },\n  \"tags\": [\"european_union\"]\n}, {\n  \"alpha_2\": \"LB\",\n  \"locales\": {\n    \"en\": \"Lebanon\",\n    \"fr\": \"Liban\",\n    \"de\": \"Libanon\",\n    \"es\": \"Líbano\"\n  },\n  \"tags\": []\n}, {\n  \"alpha_2\": \"LS\",\n  \"locales\": {\n    \"en\": \"Lesotho\",\n    \"fr\": \"Lesotho\",\n    \"de\": \"Lesotho\",\n    \"es\": \"Lesoto\"\n  },\n  \"tags\": []\n}, {\n  \"alpha_2\": \"LR\",\n  \"locales\": {\n    \"en\": \"Liberia\",\n    \"fr\": \"Liberia\",\n    \"de\": \"Liberien\",\n    \"es\": \"Liberia\"\n  },\n  \"tags\": []\n}, {\n  \"alpha_2\": \"LY\",\n  \"locales\": {\n    \"en\": \"Libya\",\n    \"fr\": \"Libye\",\n    \"de\": \"Libyen\",\n    \"es\": \"Libia\"\n  },\n  \"tags\": []\n}, {\n  \"alpha_2\": \"LI\",\n  \"locales\": {\n    \"en\": \"Liechtenstein\",\n    \"fr\": \"Liechtenstein\",\n    \"de\": \"Liechtenstein\",\n    \"es\": \"Liechtenstein\"\n  },\n  \"tags\": []\n}, {\n  \"alpha_2\": \"LT\",\n  \"locales\": {\n    \"en\": \"Lithuania\",\n    \"fr\": \"Lituanie\",\n    \"de\": \"Litauen\",\n    \"es\": \"Lituania\"\n  },\n  \"tags\": [\"european_union\"]\n}, {\n  \"alpha_2\": \"LU\",\n  \"locales\": {\n    \"en\": \"Luxembourg\",\n    \"fr\": \"Luxembourg\",\n    \"de\": \"Luxembourg\",\n    \"es\": \"Luxemburgo\"\n  },\n  \"tags\": [\"european_union\"]\n}, {\n  \"alpha_2\": \"MO\",\n  \"locales\": {\n    \"en\": \"Macao\",\n    \"fr\": \"Macao\",\n    \"de\": \"Macau\",\n    \"es\": \"Macao\"\n  },\n  \"tags\": []\n}, {\n  \"alpha_2\": \"MK\",\n  \"locales\": {\n    \"en\": \"Macedonia\",\n    \"fr\": \"Macédoine\",\n    \"de\": \"Mazedonien\",\n    \"es\": \"Macedonia\"\n  },\n  \"tags\": []\n}, {\n  \"alpha_2\": \"MG\",\n  \"locales\": {\n    \"en\": \"Madagascar\",\n    \"fr\": \"Madagascar\",\n    \"de\": \"Madagaskar\",\n    \"es\": \"Madagascar\"\n  },\n  \"tags\": []\n}, {\n  \"alpha_2\": \"MW\",\n  \"locales\": {\n    \"en\": \"Malawi\",\n    \"fr\": \"Malawi\",\n    \"de\": \"Malawi\",\n    \"es\": \"Malawi\"\n  },\n  \"tags\": []\n}, {\n  \"alpha_2\": \"MY\",\n  \"locales\": {\n    \"en\": \"Malaysia\",\n    \"fr\": \"Malaisie\",\n    \"de\": \"Malaysia\",\n    \"es\": \"Malasia\"\n  },\n  \"tags\": []\n}, {\n  \"alpha_2\": \"MV\",\n  \"locales\": {\n    \"en\": \"Maldives\",\n    \"fr\": \"Maldives\",\n    \"de\": \"Malediven\",\n    \"es\": \"Maldivas\"\n  },\n  \"tags\": []\n}, {\n  \"alpha_2\": \"ML\",\n  \"locales\": {\n    \"en\": \"Mali\",\n    \"fr\": \"Mali\",\n    \"de\": \"Mali\",\n    \"es\": \"Mali\"\n  },\n  \"tags\": []\n}, {\n  \"alpha_2\": \"MT\",\n  \"locales\": {\n    \"en\": \"Malta\",\n    \"fr\": \"Malte\",\n    \"de\": \"Malta\",\n    \"es\": \"Malta\"\n  },\n  \"tags\": [\"european_union\"]\n}, {\n  \"alpha_2\": \"MH\",\n  \"locales\": {\n    \"en\": \"Marshall Islands\",\n    \"fr\": \"Îles Marshall\",\n    \"de\": \"Marshallinseln\",\n    \"es\": \"Islas Marshall\"\n  },\n  \"tags\": []\n}, {\n  \"alpha_2\": \"MQ\",\n  \"locales\": {\n    \"en\": \"Martinique\",\n    \"fr\": \"Martinique\",\n    \"de\": \"Martinique\",\n    \"es\": \"Martinica\"\n  },\n  \"tags\": []\n}, {\n  \"alpha_2\": \"MR\",\n  \"locales\": {\n    \"en\": \"Mauritania\",\n    \"fr\": \"Mauritanie\",\n    \"de\": \"Mauritanien\",\n    \"es\": \"Mauritania\"\n  },\n  \"tags\": []\n}, {\n  \"alpha_2\": \"MU\",\n  \"locales\": {\n    \"en\": \"Mauritius\",\n    \"fr\": \"Île Maurice\",\n    \"de\": \"Mauritius\",\n    \"es\": \"Mauricio\"\n  },\n  \"tags\": []\n}, {\n  \"alpha_2\": \"YT\",\n  \"locales\": {\n    \"en\": \"Mayotte\",\n    \"fr\": \"Mayotte\",\n    \"de\": \"Mayotte\",\n    \"es\": \"Mayotte\"\n  },\n  \"tags\": []\n}, {\n  \"alpha_2\": \"MX\",\n  \"locales\": {\n    \"en\": \"Mexico\",\n    \"fr\": \"Mexique\",\n    \"de\": \"Mexiko\",\n    \"es\": \"México\"\n  },\n  \"tags\": []\n}, {\n  \"alpha_2\": \"FM\",\n  \"locales\": {\n    \"en\": \"Micronesia, Federated States of\",\n    \"fr\": \"Micronésie (Etats fédéraux de)\",\n    \"de\": \"Mikronesien\",\n    \"es\": \"Estados Federados de Micronesia\"\n  },\n  \"tags\": []\n}, {\n  \"alpha_2\": \"MD\",\n  \"locales\": {\n    \"en\": \"Moldova, Republic of\",\n    \"fr\": \"Moldavie (République de)\",\n    \"de\": \"Moldawien\",\n    \"es\": \"Moldavia, República de\"\n  },\n  \"tags\": []\n}, {\n  \"alpha_2\": \"MC\",\n  \"locales\": {\n    \"en\": \"Monaco\",\n    \"fr\": \"Monaco\",\n    \"de\": \"Monaco\",\n    \"es\": \"Mónaco\"\n  },\n  \"tags\": []\n}, {\n  \"alpha_2\": \"MN\",\n  \"locales\": {\n    \"en\": \"Mongolia\",\n    \"fr\": \"Mongolie\",\n    \"de\": \"Mongolei\",\n    \"es\": \"Mongolia\"\n  },\n  \"tags\": []\n}, {\n  \"alpha_2\": \"ME\",\n  \"locales\": {\n    \"en\": \"Montenegro\",\n    \"fr\": \"Monténégro\",\n    \"de\": \"Montenegro\",\n    \"es\": \"Montenegro\"\n  },\n  \"tags\": []\n}, {\n  \"alpha_2\": \"MS\",\n  \"locales\": {\n    \"en\": \"Montserrat\",\n    \"fr\": \"Montserrat\",\n    \"de\": \"Montserrat\",\n    \"es\": \"Montserrat\"\n  },\n  \"tags\": []\n}, {\n  \"alpha_2\": \"MA\",\n  \"locales\": {\n    \"en\": \"Morocco\",\n    \"fr\": \"Maroc\",\n    \"de\": \"Marokko\",\n    \"es\": \"Marruecos\"\n  },\n  \"tags\": []\n}, {\n  \"alpha_2\": \"MZ\",\n  \"locales\": {\n    \"en\": \"Mozambique\",\n    \"fr\": \"Mozambique\",\n    \"de\": \"Mosambik\",\n    \"es\": \"Mozambique\"\n  },\n  \"tags\": []\n}, {\n  \"alpha_2\": \"MM\",\n  \"locales\": {\n    \"en\": \"Myanmar\",\n    \"fr\": \"Myanmar\",\n    \"de\": \"Myanmar\",\n    \"es\": \"Birmania\"\n  },\n  \"tags\": []\n}, {\n  \"alpha_2\": \"NA\",\n  \"locales\": {\n    \"en\": \"Namibia\",\n    \"fr\": \"Namibie\",\n    \"de\": \"Namibia\",\n    \"es\": \"Namibia\"\n  },\n  \"tags\": []\n}, {\n  \"alpha_2\": \"NR\",\n  \"locales\": {\n    \"en\": \"Nauru\",\n    \"fr\": \"Nauru\",\n    \"de\": \"Nauru\",\n    \"es\": \"Nauru\"\n  },\n  \"tags\": []\n}, {\n  \"alpha_2\": \"NP\",\n  \"locales\": {\n    \"en\": \"Nepal\",\n    \"fr\": \"Népal\",\n    \"de\": \"Nepal\",\n    \"es\": \"Nepal\"\n  },\n  \"tags\": []\n}, {\n  \"alpha_2\": \"NL\",\n  \"locales\": {\n    \"en\": \"Netherlands\",\n    \"fr\": \"Pays-Bas\",\n    \"de\": \"Niederlande\",\n    \"es\": \"Países Bajos\"\n  },\n  \"tags\": [\"european_union\"]\n}, {\n  \"alpha_2\": \"AN\",\n  \"locales\": {\n    \"en\": \"Netherlands Antilles\",\n    \"fr\": \"Pays-Bas antillais\",\n    \"de\": \"Niederländische Antillen\",\n    \"es\": \"Antillas Neerlandesas\"\n  },\n  \"tags\": []\n}, {\n  \"alpha_2\": \"NC\",\n  \"locales\": {\n    \"en\": \"New Caledonia\",\n    \"fr\": \"Nouvelle-Calédonie\",\n    \"de\": \"Neukaledonien\",\n    \"es\": \"Nueva Caledonia\"\n  },\n  \"tags\": []\n}, {\n  \"alpha_2\": \"NZ\",\n  \"locales\": {\n    \"en\": \"New Zealand\",\n    \"fr\": \"Nouvelle-Zélande\",\n    \"de\": \"Neuseeland\",\n    \"es\": \"Nueva Zelandia\"\n  },\n  \"tags\": []\n}, {\n  \"alpha_2\": \"NI\",\n  \"locales\": {\n    \"en\": \"Nicaragua\",\n    \"fr\": \"Nicaragua\",\n    \"de\": \"Nicaragua\",\n    \"es\": \"Nicaragua\"\n  },\n  \"tags\": []\n}, {\n  \"alpha_2\": \"NE\",\n  \"locales\": {\n    \"en\": \"Niger\",\n    \"fr\": \"Niger\",\n    \"de\": \"Niger\",\n    \"es\": \"Níger\"\n  },\n  \"tags\": []\n}, {\n  \"alpha_2\": \"NG\",\n  \"locales\": {\n    \"en\": \"Nigeria\",\n    \"fr\": \"Nigeria\",\n    \"de\": \"Nigeria\",\n    \"es\": \"Nigeria\"\n  },\n  \"tags\": []\n}, {\n  \"alpha_2\": \"NU\",\n  \"locales\": {\n    \"en\": \"Niue\",\n    \"fr\": \"Niue\",\n    \"de\": \"Niue\",\n    \"es\": \"Niue\"\n  },\n  \"tags\": []\n}, {\n  \"alpha_2\": \"NF\",\n  \"locales\": {\n    \"en\": \"Norfolk Island\",\n    \"fr\": \"Île de Norfolk\",\n    \"de\": \"Norfolkinseln\",\n    \"es\": \"Isla Norfolk\"\n  },\n  \"tags\": []\n}, {\n  \"alpha_2\": \"MP\",\n  \"locales\": {\n    \"en\": \"Northern Mariana Islands\",\n    \"fr\": \"Îles Mariannes du Nord\",\n    \"de\": \"Nördliche Marianen\",\n    \"es\": \"Islas Marianas del Norte\"\n  },\n  \"tags\": []\n}, {\n  \"alpha_2\": \"NO\",\n  \"locales\": {\n    \"en\": \"Norway\",\n    \"fr\": \"Norvège\",\n    \"de\": \"Norwegen\",\n    \"es\": \"Noruega\"\n  },\n  \"tags\": []\n}, {\n  \"alpha_2\": \"OM\",\n  \"locales\": {\n    \"en\": \"Oman\",\n    \"fr\": \"Oman\",\n    \"de\": \"Oman\",\n    \"es\": \"Omán\"\n  },\n  \"tags\": []\n}, {\n  \"alpha_2\": \"PK\",\n  \"locales\": {\n    \"en\": \"Pakistan\",\n    \"fr\": \"Pakistan\",\n    \"de\": \"Pakistan\",\n    \"es\": \"Pakistán\"\n  },\n  \"tags\": []\n}, {\n  \"alpha_2\": \"PW\",\n  \"locales\": {\n    \"en\": \"Palau\",\n    \"fr\": \"Palaos\",\n    \"de\": \"Palau\",\n    \"es\": \"Palau\"\n  },\n  \"tags\": []\n}, {\n  \"alpha_2\": \"PS\",\n  \"locales\": {\n    \"en\": \"Palestine, State of\",\n    \"fr\": \"Etat de Palestine\",\n    \"de\": \"Staat Palästina\",\n    \"es\": \"Estado de Palestina\"\n  },\n  \"tags\": []\n}, {\n  \"alpha_2\": \"PA\",\n  \"locales\": {\n    \"en\": \"Panama\",\n    \"fr\": \"Panama\",\n    \"de\": \"Panama\",\n    \"es\": \"Panamá\"\n  },\n  \"tags\": []\n}, {\n  \"alpha_2\": \"PG\",\n  \"locales\": {\n    \"en\": \"Papua New Guinea\",\n    \"fr\": \"Papouasie-Nouvelle Guinée\",\n    \"de\": \"Papua-Neuguinea\",\n    \"es\": \"Papúa Nueva Guinea\"\n  },\n  \"tags\": []\n}, {\n  \"alpha_2\": \"PY\",\n  \"locales\": {\n    \"en\": \"Paraguay\",\n    \"fr\": \"Paraguay\",\n    \"de\": \"Paraguay\",\n    \"es\": \"Paraguay\"\n  },\n  \"tags\": []\n}, {\n  \"alpha_2\": \"PE\",\n  \"locales\": {\n    \"en\": \"Peru\",\n    \"fr\": \"Pérou\",\n    \"de\": \"Peru\",\n    \"es\": \"Perú\"\n  },\n  \"tags\": []\n}, {\n  \"alpha_2\": \"PH\",\n  \"locales\": {\n    \"en\": \"Philippines\",\n    \"fr\": \"Philippines\",\n    \"de\": \"Philippinen\",\n    \"es\": \"Filipinas\"\n  },\n  \"tags\": []\n}, {\n  \"alpha_2\": \"PN\",\n  \"locales\": {\n    \"en\": \"Pitcairn\",\n    \"fr\": \"Île Pitcairn\",\n    \"de\": \"Pitcairninseln\",\n    \"es\": \"Islas Pitcairn\"\n  },\n  \"tags\": []\n}, {\n  \"alpha_2\": \"PL\",\n  \"locales\": {\n    \"en\": \"Poland\",\n    \"fr\": \"Pologne\",\n    \"de\": \"Polen\",\n    \"es\": \"Polonia\"\n  },\n  \"tags\": [\"european_union\"]\n}, {\n  \"alpha_2\": \"PT\",\n  \"locales\": {\n    \"en\": \"Portugal\",\n    \"fr\": \"Portugal\",\n    \"de\": \"Portugal\",\n    \"es\": \"Portugal\"\n  },\n  \"tags\": [\"european_union\"]\n}, {\n  \"alpha_2\": \"PR\",\n  \"locales\": {\n    \"en\": \"Puerto Rico\",\n    \"fr\": \"Porto Rico\",\n    \"de\": \"Puerto Rico\",\n    \"es\": \"Puerto Rico\"\n  },\n  \"tags\": []\n}, {\n  \"alpha_2\": \"QA\",\n  \"locales\": {\n    \"en\": \"Qatar\",\n    \"fr\": \"Qatar\",\n    \"de\": \"Katar\",\n    \"es\": \"Qatar\"\n  },\n  \"tags\": []\n}, {\n  \"alpha_2\": \"RO\",\n  \"locales\": {\n    \"en\": \"Romania\",\n    \"fr\": \"Roumanie\",\n    \"de\": \"Rumänien\",\n    \"es\": \"Rumania\"\n  },\n  \"tags\": [\"european_union\"]\n}, {\n  \"alpha_2\": \"RU\",\n  \"locales\": {\n    \"en\": \"Russian Federation\",\n    \"fr\": \"Russie (Fédération de)\",\n    \"de\": \"Russische Federation\",\n    \"es\": \"Federación Rusa\"\n  },\n  \"tags\": []\n}, {\n  \"alpha_2\": \"RW\",\n  \"locales\": {\n    \"en\": \"Rwanda\",\n    \"fr\": \"Rwanda\",\n    \"de\": \"Ruanda\",\n    \"es\": \"Ruanda\"\n  },\n  \"tags\": []\n}, {\n  \"alpha_2\": \"RE\",\n  \"locales\": {\n    \"en\": \"Réunion\",\n    \"fr\": \"La Réunion\",\n    \"de\": \"Réunion\",\n    \"es\": \"Reunión\"\n  },\n  \"tags\": []\n}, {\n  \"alpha_2\": \"BL\",\n  \"locales\": {\n    \"en\": \"Saint Barthélemy\",\n    \"fr\": \"Saint-Barthélemy\",\n    \"de\": \"Saint-Barthélemy\",\n    \"es\": \"San Bartolomé\"\n  },\n  \"tags\": []\n}, {\n  \"alpha_2\": \"SH\",\n  \"locales\": {\n    \"en\": \"Saint Helena\",\n    \"fr\": \"Saint-Hélène\",\n    \"de\": \"St. Helena\",\n    \"es\": \"Santa Helena\"\n  },\n  \"tags\": []\n}, {\n  \"alpha_2\": \"KN\",\n  \"locales\": {\n    \"en\": \"Saint Kitts and Nevis\",\n    \"fr\": \"Saint-Christophe-et-Niévès\",\n    \"de\": \"St. Kitts und Nevis\",\n    \"es\": \"San Cristóbal y Nieves\"\n  },\n  \"tags\": []\n}, {\n  \"alpha_2\": \"LC\",\n  \"locales\": {\n    \"en\": \"Saint Lucia\",\n    \"fr\": \"Sainte-Lucie\",\n    \"de\": \"St. Lucia\",\n    \"es\": \"Santa Lucía\"\n  },\n  \"tags\": []\n}, {\n  \"alpha_2\": \"PM\",\n  \"locales\": {\n    \"en\": \"Saint Pierre and Miquelon\",\n    \"fr\": \"Saint-Pierre-et-Miquelon\",\n    \"de\": \"Saint Pierre und Miquelon\",\n    \"es\": \"San Pedro y Miquelón\"\n  },\n  \"tags\": []\n}, {\n  \"alpha_2\": \"VC\",\n  \"locales\": {\n    \"en\": \"Saint Vincent and the Grenadines\",\n    \"fr\": \"Saint-Vincent-et-les-Grenadines\",\n    \"de\": \"St. Vincent und die Grenadinen\",\n    \"es\": \"San Vicente y las Granadinas\"\n  },\n  \"tags\": []\n}, {\n  \"alpha_2\": \"WS\",\n  \"locales\": {\n    \"en\": \"Samoa\",\n    \"fr\": \"Samoa\",\n    \"de\": \"Samoa\",\n    \"es\": \"Samoa\"\n  },\n  \"tags\": []\n}, {\n  \"alpha_2\": \"SM\",\n  \"locales\": {\n    \"en\": \"San Marino\",\n    \"fr\": \"Saint-Marin\",\n    \"de\": \"San Marino\",\n    \"es\": \"San Marino\"\n  },\n  \"tags\": []\n}, {\n  \"alpha_2\": \"ST\",\n  \"locales\": {\n    \"en\": \"Sao Tome and Principe\",\n    \"fr\": \"Sao Tomé-et-Principe\",\n    \"de\": \"Sao Tome und Principe\",\n    \"es\": \"Santo Tomé y Príncipe\"\n  },\n  \"tags\": []\n}, {\n  \"alpha_2\": \"SA\",\n  \"locales\": {\n    \"en\": \"Saudi Arabia\",\n    \"fr\": \"Arabie Saoudite\",\n    \"de\": \"Saudi Arabien\",\n    \"es\": \"Arabia Saudita\"\n  },\n  \"tags\": []\n}, {\n  \"alpha_2\": \"SN\",\n  \"locales\": {\n    \"en\": \"Senegal\",\n    \"fr\": \"Sénégal\",\n    \"de\": \"Senegal\",\n    \"es\": \"Senegal\"\n  },\n  \"tags\": []\n}, {\n  \"alpha_2\": \"RS\",\n  \"locales\": {\n    \"en\": \"Serbia\",\n    \"fr\": \"Serbie\",\n    \"de\": \"Serbien\",\n    \"es\": \"Serbia\"\n  },\n  \"tags\": []\n}, {\n  \"alpha_2\": \"SC\",\n  \"locales\": {\n    \"en\": \"Seychelles\",\n    \"fr\": \"Seychelles\",\n    \"de\": \"Seychellen\",\n    \"es\": \"Seychelles\"\n  },\n  \"tags\": []\n}, {\n  \"alpha_2\": \"SL\",\n  \"locales\": {\n    \"en\": \"Sierra Leone\",\n    \"fr\": \"Sierra Leone\",\n    \"de\": \"Sierra Leone\",\n    \"es\": \"Sierra Leona\"\n  },\n  \"tags\": []\n}, {\n  \"alpha_2\": \"SG\",\n  \"locales\": {\n    \"en\": \"Singapore\",\n    \"fr\": \"Singapour\",\n    \"de\": \"Singapur\",\n    \"es\": \"Singapur\"\n  },\n  \"tags\": []\n}, {\n  \"alpha_2\": \"SX\",\n  \"locales\": {\n    \"en\": \"Sint Maarten\",\n    \"fr\": \"Sint Maarten\",\n    \"de\": \"Sint Maarten\",\n    \"es\": \"Sint Maarten\"\n  },\n  \"tags\": []\n}, {\n  \"alpha_2\": \"SK\",\n  \"locales\": {\n    \"en\": \"Slovakia\",\n    \"fr\": \"Slovaque\",\n    \"de\": \"Slowakei\",\n    \"es\": \"Eslovaquia\"\n  },\n  \"tags\": [\"european_union\"]\n}, {\n  \"alpha_2\": \"SI\",\n  \"locales\": {\n    \"en\": \"Slovenia\",\n    \"fr\": \"Slovénie\",\n    \"de\": \"Slowenien\",\n    \"es\": \"Eslovenia\"\n  },\n  \"tags\": [\"european_union\"]\n}, {\n  \"alpha_2\": \"SB\",\n  \"locales\": {\n    \"en\": \"Solomon Islands\",\n    \"fr\": \"Îles Salomon\",\n    \"de\": \"Salomoninseln\",\n    \"es\": \"Islas Salomón\"\n  },\n  \"tags\": []\n}, {\n  \"alpha_2\": \"SO\",\n  \"locales\": {\n    \"en\": \"Somalia\",\n    \"fr\": \"Somalie\",\n    \"de\": \"Somalia\",\n    \"es\": \"Somalia\"\n  },\n  \"tags\": []\n}, {\n  \"alpha_2\": \"ZA\",\n  \"locales\": {\n    \"en\": \"South Africa\",\n    \"fr\": \"Afrique du Sud\",\n    \"de\": \"Südafrika\",\n    \"es\": \"Sudáfrica\"\n  },\n  \"tags\": []\n}, {\n  \"alpha_2\": \"GS\",\n  \"locales\": {\n    \"en\": \"South Georgia and the South Sandwich Islands\",\n    \"fr\": \"Géorgie du Sud-et-les Îles Sandwich du Sud\",\n    \"de\": \"Süd-Georgien und südliche Sandwichinseln\",\n    \"es\": \"Islas Georgia del Sur y Sandwich del Sur\"\n  },\n  \"tags\": []\n}, {\n  \"alpha_2\": \"ES\",\n  \"locales\": {\n    \"en\": \"Spain\",\n    \"fr\": \"Espagne\",\n    \"de\": \"Spanien\",\n    \"es\": \"España\"\n  },\n  \"tags\": [\"european_union\"]\n}, {\n  \"alpha_2\": \"LK\",\n  \"locales\": {\n    \"en\": \"Sri Lanka\",\n    \"fr\": \"Sri Lanka\",\n    \"de\": \"Sri Lanka\",\n    \"es\": \"Sri Lanka\"\n  },\n  \"tags\": []\n}, {\n  \"alpha_2\": \"SR\",\n  \"locales\": {\n    \"en\": \"Suriname\",\n    \"fr\": \"Surinam\",\n    \"de\": \"Suriname\",\n    \"es\": \"Surinam\"\n  },\n  \"tags\": []\n}, {\n  \"alpha_2\": \"SJ\",\n  \"locales\": {\n    \"en\": \"Svalbard and Jan Mayen\",\n    \"fr\": \"Svalbard et île Jan Mayen\",\n    \"de\": \"Svalbard und Jan Mayen Insel\",\n    \"es\": \"Svalbard y Jan Mayen\"\n  },\n  \"tags\": []\n}, {\n  \"alpha_2\": \"SZ\",\n  \"locales\": {\n    \"en\": \"Swaziland\",\n    \"fr\": \"Swaziland\",\n    \"de\": \"Swaziland\",\n    \"es\": \"Swazilandia\"\n  },\n  \"tags\": []\n}, {\n  \"alpha_2\": \"SE\",\n  \"locales\": {\n    \"en\": \"Sweden\",\n    \"fr\": \"Suède\",\n    \"de\": \"Schweden\",\n    \"es\": \"Suecia\"\n  },\n  \"tags\": [\"european_union\"]\n}, {\n  \"alpha_2\": \"CH\",\n  \"locales\": {\n    \"en\": \"Switzerland\",\n    \"fr\": \"Suisse\",\n    \"de\": \"Schweiz\",\n    \"es\": \"Suiza\"\n  },\n  \"tags\": []\n}, {\n  \"alpha_2\": \"TW\",\n  \"locales\": {\n    \"en\": \"Taiwan\",\n    \"fr\": \"Taïwan\",\n    \"de\": \"Taiwan\",\n    \"es\": \"Taiwán\"\n  },\n  \"tags\": []\n}, {\n  \"alpha_2\": \"TJ\",\n  \"locales\": {\n    \"en\": \"Tajikistan\",\n    \"fr\": \"Tadjikistan\",\n    \"de\": \"Tadshikistan\",\n    \"es\": \"Tayikistán\"\n  },\n  \"tags\": []\n}, {\n  \"alpha_2\": \"TZ\",\n  \"locales\": {\n    \"en\": \"Tanzania, United Republic of\",\n    \"fr\": \"Tanzanie (République unie de)\",\n    \"de\": \"Tansania\",\n    \"es\": \"República Unida de Tanzania\"\n  },\n  \"tags\": []\n}, {\n  \"alpha_2\": \"TH\",\n  \"locales\": {\n    \"en\": \"Thailand\",\n    \"fr\": \"Thaïlande\",\n    \"de\": \"Thailand\",\n    \"es\": \"Tailandia\"\n  },\n  \"tags\": []\n}, {\n  \"alpha_2\": \"NL\",\n  \"locales\": {\n    \"en\": \"The Netherlands\",\n    \"fr\": \"Pays-Bas\",\n    \"de\": \"Niederlande\",\n    \"es\": \"Países Bajos\"\n  },\n  \"tags\": [\"european_union\"]\n}, {\n  \"alpha_2\": \"TL\",\n  \"locales\": {\n    \"en\": \"Timor-Leste\",\n    \"fr\": \"Timor-Oriental\",\n    \"de\": \"Timor-Leste\",\n    \"es\": \"Timor Oriental\"\n  },\n  \"tags\": []\n}, {\n  \"alpha_2\": \"TG\",\n  \"locales\": {\n    \"en\": \"Togo\",\n    \"fr\": \"Togo\",\n    \"de\": \"Togo\",\n    \"es\": \"Togo\"\n  },\n  \"tags\": []\n}, {\n  \"alpha_2\": \"TK\",\n  \"locales\": {\n    \"en\": \"Tokelau\",\n    \"fr\": \"Tokelau\",\n    \"de\": \"Tokelau\",\n    \"es\": \"Tokelau\"\n  },\n  \"tags\": []\n}, {\n  \"alpha_2\": \"TO\",\n  \"locales\": {\n    \"en\": \"Tonga\",\n    \"fr\": \"Tonga\",\n    \"de\": \"Tonga\",\n    \"es\": \"Tonga\"\n  },\n  \"tags\": []\n}, {\n  \"alpha_2\": \"TT\",\n  \"locales\": {\n    \"en\": \"Trinidad and Tobago\",\n    \"fr\": \"Trinidad-et-Tobago\",\n    \"de\": \"Trinidad und Tobago\",\n    \"es\": \"Trinidad y Tobago\"\n  },\n  \"tags\": []\n}, {\n  \"alpha_2\": \"TN\",\n  \"locales\": {\n    \"en\": \"Tunisia\",\n    \"fr\": \"Tunisie\",\n    \"de\": \"Tunesien\",\n    \"es\": \"Túnez\"\n  },\n  \"tags\": []\n}, {\n  \"alpha_2\": \"TR\",\n  \"locales\": {\n    \"en\": \"Turkey\",\n    \"fr\": \"Turquie\",\n    \"de\": \"Türkei\",\n    \"es\": \"Turquía\"\n  },\n  \"tags\": []\n}, {\n  \"alpha_2\": \"TM\",\n  \"locales\": {\n    \"en\": \"Turkmenistan\",\n    \"fr\": \"Turkménistan\",\n    \"de\": \"Turkmenistan\",\n    \"es\": \"Turkmenistán\"\n  },\n  \"tags\": []\n}, {\n  \"alpha_2\": \"TC\",\n  \"locales\": {\n    \"en\": \"Turks and Caicos Islands\",\n    \"fr\": \"Îles Turques-et-Caïques\",\n    \"de\": \"Turks- und Caicosinseln\",\n    \"es\": \"Islas Turcos y Caicos\"\n  },\n  \"tags\": []\n}, {\n  \"alpha_2\": \"TV\",\n  \"locales\": {\n    \"en\": \"Tuvalu\",\n    \"fr\": \"Tuvalu\",\n    \"de\": \"Tuvalu\",\n    \"es\": \"Tuvalu\"\n  },\n  \"tags\": []\n}, {\n  \"alpha_2\": \"UG\",\n  \"locales\": {\n    \"en\": \"Uganda\",\n    \"fr\": \"Ouganda\",\n    \"de\": \"Uganda\",\n    \"es\": \"Uganda\"\n  },\n  \"tags\": []\n}, {\n  \"alpha_2\": \"UA\",\n  \"locales\": {\n    \"en\": \"Ukraine\",\n    \"fr\": \"Ukraine\",\n    \"de\": \"Ukraine\",\n    \"es\": \"Ucrania\"\n  },\n  \"tags\": []\n}, {\n  \"alpha_2\": \"AE\",\n  \"locales\": {\n    \"en\": \"United Arab Emirates\",\n    \"fr\": \"Emirats Arabes Unis\",\n    \"de\": \"Vereinte Arabische Emirate\",\n    \"es\": \"Emiratos Árabes Unidos\"\n  },\n  \"tags\": []\n}, {\n  \"alpha_2\": \"UM\",\n  \"locales\": {\n    \"en\": \"United States Minor Outlying Islands\",\n    \"fr\": \"Îles mineures éloignées des Etats-Unis\",\n    \"de\": \"Amerikanisch-Ozeanien\",\n    \"es\": \"Islas Ultramarinas Menores de Estados Unidos\"\n  },\n  \"tags\": []\n}, {\n  \"alpha_2\": \"UY\",\n  \"locales\": {\n    \"en\": \"Uruguay\",\n    \"fr\": \"Uruguay\",\n    \"de\": \"Uruguay\",\n    \"es\": \"Uruguay\"\n  },\n  \"tags\": []\n}, {\n  \"alpha_2\": \"UZ\",\n  \"locales\": {\n    \"en\": \"Uzbekistan\",\n    \"fr\": \"Ouzbékistan\",\n    \"de\": \"Usbekistan\",\n    \"es\": \"Uzbekistán\"\n  },\n  \"tags\": []\n}, {\n  \"alpha_2\": \"VU\",\n  \"locales\": {\n    \"en\": \"Vanuatu\",\n    \"fr\": \"Vanuatu\",\n    \"de\": \"Vanuatu\",\n    \"es\": \"Vanuatu\"\n  },\n  \"tags\": []\n}, {\n  \"alpha_2\": \"VE\",\n  \"locales\": {\n    \"en\": \"Venezuela\",\n    \"fr\": \"Vénézuela\",\n    \"de\": \"Venezuela\",\n    \"es\": \"Venezuela\"\n  },\n  \"tags\": []\n}, {\n  \"alpha_2\": \"VN\",\n  \"locales\": {\n    \"en\": \"Vietnam\",\n    \"fr\": \"Viêtnam\",\n    \"de\": \"Vietnam\",\n    \"es\": \"Vietnam\"\n  },\n  \"tags\": []\n}, {\n  \"alpha_2\": \"VG\",\n  \"locales\": {\n    \"en\": \"Virgin Islands, British\",\n    \"fr\": \"Îles Vierges britanniques\",\n    \"de\": \"Britische Jungferninseln\",\n    \"es\": \"Islas Vírgenes Británicas\"\n  },\n  \"tags\": []\n}, {\n  \"alpha_2\": \"VI\",\n  \"locales\": {\n    \"en\": \"Virgin Islands, U.S.\",\n    \"fr\": \"Îles Vierges américaines\",\n    \"de\": \"US-Jungferninseln\",\n    \"es\": \"Islas Vírgenes de los EE.UU.\"\n  },\n  \"tags\": []\n}, {\n  \"alpha_2\": \"WF\",\n  \"locales\": {\n    \"en\": \"Wallis and Futuna\",\n    \"fr\": \"Wallis-et-Futuna\",\n    \"de\": \"Wallis und Futuna\",\n    \"es\": \"Wallis y Futuna\"\n  },\n  \"tags\": []\n}, {\n  \"alpha_2\": \"EH\",\n  \"locales\": {\n    \"en\": \"Western Sahara\",\n    \"fr\": \"Sahara occidental\",\n    \"de\": \"Westsahara\",\n    \"es\": \"Sahara Occidental\"\n  },\n  \"tags\": []\n}, {\n  \"alpha_2\": \"YE\",\n  \"locales\": {\n    \"en\": \"Yemen\",\n    \"fr\": \"Yémen\",\n    \"de\": \"Jemen\",\n    \"es\": \"Yemen\"\n  },\n  \"tags\": []\n}, {\n  \"alpha_2\": \"ZM\",\n  \"locales\": {\n    \"en\": \"Zambia\",\n    \"fr\": \"Zambie\",\n    \"de\": \"Sambia\",\n    \"es\": \"Zambia\"\n  },\n  \"tags\": []\n}, {\n  \"alpha_2\": \"ZW\",\n  \"locales\": {\n    \"en\": \"Zimbabwe\",\n    \"fr\": \"Zimbabwe\",\n    \"de\": \"Simbabwe\",\n    \"es\": \"Zimbabue\"\n  },\n  \"tags\": []\n}];\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiODguanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9hbmNpbGxhcnkvdXRpbHMvY291bnRyaWVzLXNlcnZpY2UuanM/OGJlZSIsIndlYnBhY2s6Ly8vP2Q0MWQiXSwic291cmNlc0NvbnRlbnQiOlsiLypAbmdJbmplY3QqL1xuZXhwb3J0IGRlZmF1bHQgKGkxOG4pID0+IHtcbiAgbGV0IGxvY2FsaXplZENvdW50cmllcyA9IF8ubWFwKGNvdW50cmllcywgKGNvdW50cnkpID0+IHtcbiAgICByZXR1cm4ge1xuICAgICAgXCJjb3VudHJ5X2NvZGVfYWxwaGFfMlwiOiBjb3VudHJ5LmFscGhhXzIsXG4gICAgICBcImNvdW50cnlfY29kZVwiOiAnQ1RSWV8nICsgY291bnRyeS5hbHBoYV8yLFxuICAgICAgXCJ0ZXh0XCI6IGNvdW50cnkubG9jYWxlc1tpMThuLmxvY2FsZSB8fCAnZW4nXSxcbiAgICAgIFwiY29tbW9uXCI6IF8uaW5jbHVkZShjb3VudHJ5LnRhZ3MsIFwiY29tbW9uXCIpLFxuICAgICAgXCJ0YWdzXCI6IGNvdW50cnkudGFncyxcbiAgICAgIFwiZXVyb3BlYW5cIjogXy5pbmNsdWRlKGNvdW50cnkudGFncywgXCJldXJvcGVhbl91bmlvblwiKVxuICAgIH07XG4gIH0pO1xuXG4gIGxldCBzb3J0ZWRDb3VudHJpZXMgPSBfLnNvcnRCeShsb2NhbGl6ZWRDb3VudHJpZXMsIChjb3VudHJ5KSA9PiB7XG4gICAgcmV0dXJuIChjb3VudHJ5LmNvdW50cnlfY29kZV9hbHBoYV8yID09PSAnVVMnID8gJycgOiBjb3VudHJ5LnRleHQpO1xuICB9KTtcbiAgbGV0IGNvbW1vbkNob2ljZXMgPSBfLnNlbGVjdChzb3J0ZWRDb3VudHJpZXMsIChjb3VudHJ5KSA9PiBjb3VudHJ5LmNvbW1vbik7XG4gIGxldCByZW1haW5pbmdDaG9pY2VzID0gXy5zZWxlY3Qoc29ydGVkQ291bnRyaWVzLCAoY291bnRyeSkgPT4gIWNvdW50cnkuY29tbW9uKTtcbiAgbGV0IGV1cm9wZWFuQ291bnRyaWVzID0gXy5zZWxlY3Qoc29ydGVkQ291bnRyaWVzLCAoY291bnRyeSkgPT4gY291bnRyeS5ldXJvcGVhbik7XG5cbiAgbGV0IGRpdmlkZXIgPSB7XG4gICAgXCJjb3VudHJ5X2NvZGVfYWxwaGFfMlwiOiBudWxsLFxuICAgIFwidGV4dFwiOiBcIuKAlFwiLFxuICAgIHNoaXBzX3RvOiBmYWxzZSxcbiAgICBpc0Rpc2FibGVkOiB0cnVlLFxuICAgIHRhZ3M6IFtcImRpdmlkZXJcIl1cbiAgfTtcblxuICBsZXQgYWxsID0gKCkgPT4gXy51bmlvbihjb21tb25DaG9pY2VzLCByZW1haW5pbmdDaG9pY2VzKTtcblxuICBsZXQgYXNVaVNlbGVjdEl0ZW1zID0gKG9wdGlvbnMpID0+IHtcbiAgICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLmdyb3VwZWQpIHtcbiAgICAgIHJldHVybiBhbGwoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIF8udW5pb24oY29tbW9uQ2hvaWNlcywgW2RpdmlkZXJdLCByZW1haW5pbmdDaG9pY2VzKTtcbiAgICB9XG4gIH07XG5cbiAgbGV0IGNvdW50cnlHcm91cGluZyA9IChpdGVtKSA9PiBpdGVtLmNvbW1vbiA/IGkxOG4udCgnY291bnRyeV9ncm91cHMuY29tbW9uJykgOiBpMThuLnQoJ2NvdW50cnlfZ3JvdXBzLm90aGVyJyk7XG4gIGxldCBmaW5kQnlBbHBoYTIgPSAoYWxwaGEyKSA9PiBfLmZpbmQoYWxsKCksIHtjb3VudHJ5X2NvZGVfYWxwaGFfMjogYWxwaGEyfSk7XG4gIGxldCBmaW5kQnlUZXh0ID0gKHRleHQpID0+IF8uZmluZChhbGwoKSwgKGNvdW50cnkpID0+IHtcbiAgICByZXR1cm4gY291bnRyeS50ZXh0LnRvTG93ZXJDYXNlKCkgPT09IHRleHQudG9Mb3dlckNhc2UoKTtcbiAgfSk7XG4gIGxldCBmaW5kQnlDb2RlID0gKGNvZGUpID0+IF8uZmluZChhbGwoKSwge2NvdW50cnlfY29kZV9hbHBoYV8yOiBjb2RlICYmIGNvZGUuc3Vic3RyaW5nKDUpfSk7XG4gIGxldCBmaW5kQnlUd29MZXR0ZXJDb2RlID0gKHR3b0xldHRlcikgPT4gZmluZEJ5Q29kZSgnQ1RSWV8nICsgdHdvTGV0dGVyKTtcbiAgbGV0IGV1cm9wZWFuVW5pb24gPSAoKSA9PiBfLm1hcChldXJvcGVhbkNvdW50cmllcywgKGNvdW50cnkpID0+IGNvdW50cnkuY291bnRyeV9jb2RlX2FscGhhXzIpO1xuICBsZXQgYWxwaGEySW5FVSA9IChjb2RlKSA9PiAhIV8uY29udGFpbnMoZXVyb3BlYW5VbmlvbigpLCBjb2RlKTtcbiAgbGV0IGFscGhhYmV0aXplZCA9ICgpID0+IF8uc29ydEJ5KGxvY2FsaXplZENvdW50cmllcywgKGN0cnkpID0+IGN0cnkudGV4dCk7XG5cbiAgbGV0IHppcENvZGVMYWJlbEtleSA9IChjb3VudHJ5Q29kZSkgPT4ge1xuICAgIGlmIChjb3VudHJ5Q29kZSA9PT0gJycgfHwgY291bnRyeUNvZGUgPT09ICdDVFJZX1VTJykge1xuICAgICAgcmV0dXJuICd6aXBfY29kZSc7XG4gICAgfSBlbHNlIGlmIChjb3VudHJ5Q29kZSA9PT0gJ0NUUllfQ0EnKSB7XG4gICAgICByZXR1cm4gJ3Bvc3RhbF9jb2RlJztcbiAgICB9IGVsc2Uge1xuICAgICAgbGV0IHBvc3RhbENvZGVPdmVycmlkZXMgPSB7XG4gICAgICAgIENUUllfR0I6ICdwb3N0X2NvZGUnLFxuICAgICAgICBDVFJZX1BIOiAnemlwX2NvZGUnLFxuICAgICAgICBDVFJZX0lOOiAncGluX2NvZGUnXG4gICAgICB9O1xuICAgICAgcmV0dXJuIHBvc3RhbENvZGVPdmVycmlkZXNbY291bnRyeUNvZGVdIHx8ICdwb3N0YWxfY29kZSc7XG4gICAgfVxuICB9O1xuXG4gIGxldCBzaW1wbGlmeUZvclRlc3RzPSAob3B0aW9uYWxBbHBoYTJzKSA9PiB7XG4gICAgbGV0IGFscGhhMnMgPSBvcHRpb25hbEFscGhhMnMgfHwgWydBRCcsICdKUCcsICdJVCcsICdMSSddO1xuICAgIHJlbWFpbmluZ0Nob2ljZXMgPSBfLnNlbGVjdChyZW1haW5pbmdDaG9pY2VzLCAoY2hvaWNlKSA9PiB7XG4gICAgICByZXR1cm4gXy5pbmNsdWRlKGFscGhhMnMsIGNob2ljZS5jb3VudHJ5X2NvZGVfYWxwaGFfMik7XG4gICAgfSk7XG4gIH07XG5cbiAgcmV0dXJuIHtcbiAgICBhbGw6IGFsbCxcbiAgICBhc1VpU2VsZWN0SXRlbXM6IGFzVWlTZWxlY3RJdGVtcyxcbiAgICBjb3VudHJ5R3JvdXBpbmc6IGNvdW50cnlHcm91cGluZyxcbiAgICBmaW5kQnlUZXh0OiBmaW5kQnlUZXh0LFxuICAgIGZpbmRCeUFscGhhMjogZmluZEJ5QWxwaGEyLFxuICAgIGZpbmRCeUNvZGU6IGZpbmRCeUNvZGUsXG4gICAgZmluZEJ5VHdvTGV0dGVyQ29kZTogZmluZEJ5VHdvTGV0dGVyQ29kZSxcbiAgICBldXJvcGVhblVuaW9uOiBldXJvcGVhblVuaW9uLFxuICAgIGFscGhhMkluRVU6IGFscGhhMkluRVUsXG4gICAgYWxwaGFiZXRpemVkOiBhbHBoYWJldGl6ZWQsXG4gICAgemlwQ29kZUxhYmVsS2V5OiB6aXBDb2RlTGFiZWxLZXksXG4gICAgc2ltcGxpZnlGb3JUZXN0czogc2ltcGxpZnlGb3JUZXN0c1xuICB9O1xufTtcblxuLyogVG8gcmVmcmVzaCwgb3BlbiB1cCBhIFJhaWxzIGNvbnNvbGUgYW5kIHR5cGUgXCJwdXRzIEpTT04ucHJldHR5X2dlbmVyYXRlKENvdW50cnkuaW5fb3JkZXIubWFwKCY6YXNfY291bnRyeV9zZXJ2aWNlX2pzb24pKVwiICovXG5sZXQgY291bnRyaWVzID1cbiAgW1xuICB7XG4gICAgXCJhbHBoYV8yXCI6IFwiVVNcIixcbiAgICBcImxvY2FsZXNcIjoge1xuICAgICAgXCJlblwiOiBcIlVuaXRlZCBTdGF0ZXNcIixcbiAgICAgIFwiZnJcIjogXCJFdGF0cy1VbmlzXCIsXG4gICAgICBcImRlXCI6IFwiVmVyZWluaWd0ZSBTdGFhdGVuXCIsXG4gICAgICBcImVzXCI6IFwiRXN0YWRvcyBVbmlkb3NcIlxuICAgIH0sXG4gICAgXCJ0YWdzXCI6IFtcbiAgICAgIFwiY29tbW9uXCJcbiAgICBdXG4gIH0sXG4gIHtcbiAgICBcImFscGhhXzJcIjogXCJBVVwiLFxuICAgIFwibG9jYWxlc1wiOiB7XG4gICAgICBcImVuXCI6IFwiQXVzdHJhbGlhXCIsXG4gICAgICBcImZyXCI6IFwiQXVzdHJhbGllXCIsXG4gICAgICBcImRlXCI6IFwiQXVzdHJhbGllblwiLFxuICAgICAgXCJlc1wiOiBcIkF1c3RyYWxpYVwiXG4gICAgfSxcbiAgICBcInRhZ3NcIjogW1xuICAgICAgXCJjb21tb25cIlxuICAgIF1cbiAgfSxcbiAge1xuICAgIFwiYWxwaGFfMlwiOiBcIkNBXCIsXG4gICAgXCJsb2NhbGVzXCI6IHtcbiAgICAgIFwiZW5cIjogXCJDYW5hZGFcIixcbiAgICAgIFwiZnJcIjogXCJDYW5hZGFcIixcbiAgICAgIFwiZGVcIjogXCJLYW5hZGFcIixcbiAgICAgIFwiZXNcIjogXCJDYW5hZMOhXCJcbiAgICB9LFxuICAgIFwidGFnc1wiOiBbXG4gICAgICBcImNvbW1vblwiXG4gICAgXVxuICB9LFxuICB7XG4gICAgXCJhbHBoYV8yXCI6IFwiREVcIixcbiAgICBcImxvY2FsZXNcIjoge1xuICAgICAgXCJlblwiOiBcIkdlcm1hbnlcIixcbiAgICAgIFwiZnJcIjogXCJBbGxlbWFnbmVcIixcbiAgICAgIFwiZGVcIjogXCJEZXV0c2NobGFuZFwiLFxuICAgICAgXCJlc1wiOiBcIkFsZW1hbmlhXCJcbiAgICB9LFxuICAgIFwidGFnc1wiOiBbXG4gICAgICBcImNvbW1vblwiLFxuICAgICAgXCJldXJvcGVhbl91bmlvblwiXG4gICAgXVxuICB9LFxuICB7XG4gICAgXCJhbHBoYV8yXCI6IFwiR0JcIixcbiAgICBcImxvY2FsZXNcIjoge1xuICAgICAgXCJlblwiOiBcIlVuaXRlZCBLaW5nZG9tXCIsXG4gICAgICBcImZyXCI6IFwiUm95YXVtZS1VbmlcIixcbiAgICAgIFwiZGVcIjogXCJHcm/Dn2JyaXRhbm5pZW5cIixcbiAgICAgIFwiZXNcIjogXCJSZWlubyBVbmlkb1wiXG4gICAgfSxcbiAgICBcInRhZ3NcIjogW1xuICAgICAgXCJjb21tb25cIixcbiAgICAgIFwiZXVyb3BlYW5fdW5pb25cIlxuICAgIF1cbiAgfSxcbiAge1xuICAgIFwiYWxwaGFfMlwiOiBcIkFGXCIsXG4gICAgXCJsb2NhbGVzXCI6IHtcbiAgICAgIFwiZW5cIjogXCJBZmdoYW5pc3RhblwiLFxuICAgICAgXCJmclwiOiBcIkFmZ2hhbmlzdGFuXCIsXG4gICAgICBcImRlXCI6IFwiQWZnaGFuaXN0YW5cIixcbiAgICAgIFwiZXNcIjogXCJBZmdhbmlzdMOhblwiXG4gICAgfSxcbiAgICBcInRhZ3NcIjogW1xuXG4gICAgXVxuICB9LFxuICB7XG4gICAgXCJhbHBoYV8yXCI6IFwiQVhcIixcbiAgICBcImxvY2FsZXNcIjoge1xuICAgICAgXCJlblwiOiBcIkFsYW5kIElzbGFuZHNcIixcbiAgICAgIFwiZnJcIjogXCJBbGFuZFwiLFxuICAgICAgXCJkZVwiOiBcIkFsYW5kaW5zZWxuXCIsXG4gICAgICBcImVzXCI6IFwiSXNsYXMgQWxhbmRcIlxuICAgIH0sXG4gICAgXCJ0YWdzXCI6IFtcblxuICAgIF1cbiAgfSxcbiAge1xuICAgIFwiYWxwaGFfMlwiOiBcIkFMXCIsXG4gICAgXCJsb2NhbGVzXCI6IHtcbiAgICAgIFwiZW5cIjogXCJBbGJhbmlhXCIsXG4gICAgICBcImZyXCI6IFwiQWxiYW5pZVwiLFxuICAgICAgXCJkZVwiOiBcIkFsYmFuaWVuXCIsXG4gICAgICBcImVzXCI6IFwiQWxiYW5pYVwiXG4gICAgfSxcbiAgICBcInRhZ3NcIjogW1xuXG4gICAgXVxuICB9LFxuICB7XG4gICAgXCJhbHBoYV8yXCI6IFwiRFpcIixcbiAgICBcImxvY2FsZXNcIjoge1xuICAgICAgXCJlblwiOiBcIkFsZ2VyaWFcIixcbiAgICAgIFwiZnJcIjogXCJBbGfDqXJpZVwiLFxuICAgICAgXCJkZVwiOiBcIkFsZ2VyaWVuXCIsXG4gICAgICBcImVzXCI6IFwiQXJnZWxpYVwiXG4gICAgfSxcbiAgICBcInRhZ3NcIjogW1xuXG4gICAgXVxuICB9LFxuICB7XG4gICAgXCJhbHBoYV8yXCI6IFwiQVNcIixcbiAgICBcImxvY2FsZXNcIjoge1xuICAgICAgXCJlblwiOiBcIkFtZXJpY2FuIFNhbW9hXCIsXG4gICAgICBcImZyXCI6IFwiU2Ftb2EgYW3DqXJpY2FpbmVzXCIsXG4gICAgICBcImRlXCI6IFwiQW1lcmlrYW5pc2NoLVNhbW9hXCIsXG4gICAgICBcImVzXCI6IFwiU2Ftb2EgQW1lcmljYW5hXCJcbiAgICB9LFxuICAgIFwidGFnc1wiOiBbXG5cbiAgICBdXG4gIH0sXG4gIHtcbiAgICBcImFscGhhXzJcIjogXCJBRFwiLFxuICAgIFwibG9jYWxlc1wiOiB7XG4gICAgICBcImVuXCI6IFwiQW5kb3JyYVwiLFxuICAgICAgXCJmclwiOiBcIkFuZG9ycmVcIixcbiAgICAgIFwiZGVcIjogXCJBbmRvcnJhXCIsXG4gICAgICBcImVzXCI6IFwiQW5kb3JyYVwiXG4gICAgfSxcbiAgICBcInRhZ3NcIjogW1xuXG4gICAgXVxuICB9LFxuICB7XG4gICAgXCJhbHBoYV8yXCI6IFwiQU9cIixcbiAgICBcImxvY2FsZXNcIjoge1xuICAgICAgXCJlblwiOiBcIkFuZ29sYVwiLFxuICAgICAgXCJmclwiOiBcIkFuZ29sYVwiLFxuICAgICAgXCJkZVwiOiBcIkFuZ29sYVwiLFxuICAgICAgXCJlc1wiOiBcIkFuZ29sYVwiXG4gICAgfSxcbiAgICBcInRhZ3NcIjogW1xuXG4gICAgXVxuICB9LFxuICB7XG4gICAgXCJhbHBoYV8yXCI6IFwiQUlcIixcbiAgICBcImxvY2FsZXNcIjoge1xuICAgICAgXCJlblwiOiBcIkFuZ3VpbGxhXCIsXG4gICAgICBcImZyXCI6IFwiQW5ndWlsbGFcIixcbiAgICAgIFwiZGVcIjogXCJBbmd1aWxsYVwiLFxuICAgICAgXCJlc1wiOiBcIkFuZ3VpbGFcIlxuICAgIH0sXG4gICAgXCJ0YWdzXCI6IFtcblxuICAgIF1cbiAgfSxcbiAge1xuICAgIFwiYWxwaGFfMlwiOiBcIkFRXCIsXG4gICAgXCJsb2NhbGVzXCI6IHtcbiAgICAgIFwiZW5cIjogXCJBbnRhcmN0aWNhXCIsXG4gICAgICBcImZyXCI6IFwiQW50YXJjdGlxdWVcIixcbiAgICAgIFwiZGVcIjogXCJBbnRhcmt0aXNcIixcbiAgICAgIFwiZXNcIjogXCJBbnTDoXJ0aWRhXCJcbiAgICB9LFxuICAgIFwidGFnc1wiOiBbXG5cbiAgICBdXG4gIH0sXG4gIHtcbiAgICBcImFscGhhXzJcIjogXCJBR1wiLFxuICAgIFwibG9jYWxlc1wiOiB7XG4gICAgICBcImVuXCI6IFwiQW50aWd1YSBhbmQgQmFyYnVkYVwiLFxuICAgICAgXCJmclwiOiBcIkFudGlndWEtZXQtQmFyYnVkYVwiLFxuICAgICAgXCJkZVwiOiBcIkFudGlndWEgdW5kIEJhcmJ1ZGFcIixcbiAgICAgIFwiZXNcIjogXCJBbnRpZ3VhIHkgQmFyYnVkYVwiXG4gICAgfSxcbiAgICBcInRhZ3NcIjogW1xuXG4gICAgXVxuICB9LFxuICB7XG4gICAgXCJhbHBoYV8yXCI6IFwiQVJcIixcbiAgICBcImxvY2FsZXNcIjoge1xuICAgICAgXCJlblwiOiBcIkFyZ2VudGluYVwiLFxuICAgICAgXCJmclwiOiBcIkFyZ2VudGluZVwiLFxuICAgICAgXCJkZVwiOiBcIkFyZ2VudGluaWVuXCIsXG4gICAgICBcImVzXCI6IFwiQXJnZW50aW5hXCJcbiAgICB9LFxuICAgIFwidGFnc1wiOiBbXG5cbiAgICBdXG4gIH0sXG4gIHtcbiAgICBcImFscGhhXzJcIjogXCJBTVwiLFxuICAgIFwibG9jYWxlc1wiOiB7XG4gICAgICBcImVuXCI6IFwiQXJtZW5pYVwiLFxuICAgICAgXCJmclwiOiBcIkFybcOpbmllXCIsXG4gICAgICBcImRlXCI6IFwiQXJtZW5pZW5cIixcbiAgICAgIFwiZXNcIjogXCJBcm1lbmlhXCJcbiAgICB9LFxuICAgIFwidGFnc1wiOiBbXG5cbiAgICBdXG4gIH0sXG4gIHtcbiAgICBcImFscGhhXzJcIjogXCJBV1wiLFxuICAgIFwibG9jYWxlc1wiOiB7XG4gICAgICBcImVuXCI6IFwiQXJ1YmFcIixcbiAgICAgIFwiZnJcIjogXCJBcnViYVwiLFxuICAgICAgXCJkZVwiOiBcIkFydWJhXCIsXG4gICAgICBcImVzXCI6IFwiQXJ1YmFcIlxuICAgIH0sXG4gICAgXCJ0YWdzXCI6IFtcblxuICAgIF1cbiAgfSxcbiAge1xuICAgIFwiYWxwaGFfMlwiOiBcIkFUXCIsXG4gICAgXCJsb2NhbGVzXCI6IHtcbiAgICAgIFwiZW5cIjogXCJBdXN0cmlhXCIsXG4gICAgICBcImZyXCI6IFwiQXV0cmljaGVcIixcbiAgICAgIFwiZGVcIjogXCLDlnN0ZXJyZWljaFwiLFxuICAgICAgXCJlc1wiOiBcIkF1c3RyaWFcIlxuICAgIH0sXG4gICAgXCJ0YWdzXCI6IFtcbiAgICAgIFwiZXVyb3BlYW5fdW5pb25cIlxuICAgIF1cbiAgfSxcbiAge1xuICAgIFwiYWxwaGFfMlwiOiBcIkFaXCIsXG4gICAgXCJsb2NhbGVzXCI6IHtcbiAgICAgIFwiZW5cIjogXCJBemVyYmFpamFuXCIsXG4gICAgICBcImZyXCI6IFwiQXplcmJhw69kamFuXCIsXG4gICAgICBcImRlXCI6IFwiQXNlcmJhaWRzY2hhblwiLFxuICAgICAgXCJlc1wiOiBcIkF6ZXJiYWl5w6FuXCJcbiAgICB9LFxuICAgIFwidGFnc1wiOiBbXG5cbiAgICBdXG4gIH0sXG4gIHtcbiAgICBcImFscGhhXzJcIjogXCJCU1wiLFxuICAgIFwibG9jYWxlc1wiOiB7XG4gICAgICBcImVuXCI6IFwiQmFoYW1hc1wiLFxuICAgICAgXCJmclwiOiBcIkJhaGFtc1wiLFxuICAgICAgXCJkZVwiOiBcIkJhaGFtYXNcIixcbiAgICAgIFwiZXNcIjogXCJCYWhhbWFzXCJcbiAgICB9LFxuICAgIFwidGFnc1wiOiBbXG5cbiAgICBdXG4gIH0sXG4gIHtcbiAgICBcImFscGhhXzJcIjogXCJCSFwiLFxuICAgIFwibG9jYWxlc1wiOiB7XG4gICAgICBcImVuXCI6IFwiQmFocmFpblwiLFxuICAgICAgXCJmclwiOiBcIkJhaHJlw69uXCIsXG4gICAgICBcImRlXCI6IFwiQmFocmFpblwiLFxuICAgICAgXCJlc1wiOiBcIkJhaHLDqWluXCJcbiAgICB9LFxuICAgIFwidGFnc1wiOiBbXG5cbiAgICBdXG4gIH0sXG4gIHtcbiAgICBcImFscGhhXzJcIjogXCJCRFwiLFxuICAgIFwibG9jYWxlc1wiOiB7XG4gICAgICBcImVuXCI6IFwiQmFuZ2xhZGVzaFwiLFxuICAgICAgXCJmclwiOiBcIkJhbmdsYWRlc2hcIixcbiAgICAgIFwiZGVcIjogXCJCYW5nbGFkZXNoXCIsXG4gICAgICBcImVzXCI6IFwiQmFuZ2xhZGVzaFwiXG4gICAgfSxcbiAgICBcInRhZ3NcIjogW1xuXG4gICAgXVxuICB9LFxuICB7XG4gICAgXCJhbHBoYV8yXCI6IFwiQkJcIixcbiAgICBcImxvY2FsZXNcIjoge1xuICAgICAgXCJlblwiOiBcIkJhcmJhZG9zXCIsXG4gICAgICBcImZyXCI6IFwiQmFyYmFkZVwiLFxuICAgICAgXCJkZVwiOiBcIkJhcmJhZG9zXCIsXG4gICAgICBcImVzXCI6IFwiQmFyYmFkb3NcIlxuICAgIH0sXG4gICAgXCJ0YWdzXCI6IFtcblxuICAgIF1cbiAgfSxcbiAge1xuICAgIFwiYWxwaGFfMlwiOiBcIkJZXCIsXG4gICAgXCJsb2NhbGVzXCI6IHtcbiAgICAgIFwiZW5cIjogXCJCZWxhcnVzXCIsXG4gICAgICBcImZyXCI6IFwiQmnDqWxvcnVzc2llXCIsXG4gICAgICBcImRlXCI6IFwiQmVsYXJ1c1wiLFxuICAgICAgXCJlc1wiOiBcIkJlbGFyw7pzXCJcbiAgICB9LFxuICAgIFwidGFnc1wiOiBbXG5cbiAgICBdXG4gIH0sXG4gIHtcbiAgICBcImFscGhhXzJcIjogXCJCRVwiLFxuICAgIFwibG9jYWxlc1wiOiB7XG4gICAgICBcImVuXCI6IFwiQmVsZ2l1bVwiLFxuICAgICAgXCJmclwiOiBcIkJlbGdpcXVlXCIsXG4gICAgICBcImRlXCI6IFwiQmVsZ2llblwiLFxuICAgICAgXCJlc1wiOiBcIkLDqWxnaWNhXCJcbiAgICB9LFxuICAgIFwidGFnc1wiOiBbXG4gICAgICBcImV1cm9wZWFuX3VuaW9uXCJcbiAgICBdXG4gIH0sXG4gIHtcbiAgICBcImFscGhhXzJcIjogXCJCWlwiLFxuICAgIFwibG9jYWxlc1wiOiB7XG4gICAgICBcImVuXCI6IFwiQmVsaXplXCIsXG4gICAgICBcImZyXCI6IFwiQmVsaXplXCIsXG4gICAgICBcImRlXCI6IFwiQmVsaXplXCIsXG4gICAgICBcImVzXCI6IFwiQmVsaWNlXCJcbiAgICB9LFxuICAgIFwidGFnc1wiOiBbXG5cbiAgICBdXG4gIH0sXG4gIHtcbiAgICBcImFscGhhXzJcIjogXCJCSlwiLFxuICAgIFwibG9jYWxlc1wiOiB7XG4gICAgICBcImVuXCI6IFwiQmVuaW5cIixcbiAgICAgIFwiZnJcIjogXCJCw6luaW5cIixcbiAgICAgIFwiZGVcIjogXCJCZW5pblwiLFxuICAgICAgXCJlc1wiOiBcIkJlbsOtblwiXG4gICAgfSxcbiAgICBcInRhZ3NcIjogW1xuXG4gICAgXVxuICB9LFxuICB7XG4gICAgXCJhbHBoYV8yXCI6IFwiQk1cIixcbiAgICBcImxvY2FsZXNcIjoge1xuICAgICAgXCJlblwiOiBcIkJlcm11ZGFcIixcbiAgICAgIFwiZnJcIjogXCJCZXJtdWRlc1wiLFxuICAgICAgXCJkZVwiOiBcIkJlcm11ZGFcIixcbiAgICAgIFwiZXNcIjogXCJCZXJtdWRhc1wiXG4gICAgfSxcbiAgICBcInRhZ3NcIjogW1xuXG4gICAgXVxuICB9LFxuICB7XG4gICAgXCJhbHBoYV8yXCI6IFwiQlRcIixcbiAgICBcImxvY2FsZXNcIjoge1xuICAgICAgXCJlblwiOiBcIkJodXRhblwiLFxuICAgICAgXCJmclwiOiBcIkJob3V0YW5cIixcbiAgICAgIFwiZGVcIjogXCJCaHV0YW5cIixcbiAgICAgIFwiZXNcIjogXCJCdXTDoW5cIlxuICAgIH0sXG4gICAgXCJ0YWdzXCI6IFtcblxuICAgIF1cbiAgfSxcbiAge1xuICAgIFwiYWxwaGFfMlwiOiBcIkJPXCIsXG4gICAgXCJsb2NhbGVzXCI6IHtcbiAgICAgIFwiZW5cIjogXCJCb2xpdmlhXCIsXG4gICAgICBcImZyXCI6IFwiQm9saXZpZVwiLFxuICAgICAgXCJkZVwiOiBcIkJvbGl2aWVuXCIsXG4gICAgICBcImVzXCI6IFwiQm9saXZpYVwiXG4gICAgfSxcbiAgICBcInRhZ3NcIjogW1xuXG4gICAgXVxuICB9LFxuICB7XG4gICAgXCJhbHBoYV8yXCI6IFwiQkFcIixcbiAgICBcImxvY2FsZXNcIjoge1xuICAgICAgXCJlblwiOiBcIkJvc25pYSBhbmQgSGVyemVnb3ZpbmFcIixcbiAgICAgIFwiZnJcIjogXCJCb3NuaWUtSGVyesOpZ292aW5lXCIsXG4gICAgICBcImRlXCI6IFwiQm9zbmllbi1IZXJ6ZWdvd2luYVwiLFxuICAgICAgXCJlc1wiOiBcIkJvc25pYSB5IEhlcnplZ292aW5hXCJcbiAgICB9LFxuICAgIFwidGFnc1wiOiBbXG5cbiAgICBdXG4gIH0sXG4gIHtcbiAgICBcImFscGhhXzJcIjogXCJCV1wiLFxuICAgIFwibG9jYWxlc1wiOiB7XG4gICAgICBcImVuXCI6IFwiQm90c3dhbmFcIixcbiAgICAgIFwiZnJcIjogXCJCb3Rzd2FuYVwiLFxuICAgICAgXCJkZVwiOiBcIkJvdHN3YW5hXCIsXG4gICAgICBcImVzXCI6IFwiQm90c3VhbmFcIlxuICAgIH0sXG4gICAgXCJ0YWdzXCI6IFtcblxuICAgIF1cbiAgfSxcbiAge1xuICAgIFwiYWxwaGFfMlwiOiBcIkJWXCIsXG4gICAgXCJsb2NhbGVzXCI6IHtcbiAgICAgIFwiZW5cIjogXCJCb3V2ZXQgSXNsYW5kXCIsXG4gICAgICBcImZyXCI6IFwiw45sZSBCb3V2ZXRcIixcbiAgICAgIFwiZGVcIjogXCJCb3V2ZXRpbnNlbFwiLFxuICAgICAgXCJlc1wiOiBcIklzbGEgQm91dmV0XCJcbiAgICB9LFxuICAgIFwidGFnc1wiOiBbXG5cbiAgICBdXG4gIH0sXG4gIHtcbiAgICBcImFscGhhXzJcIjogXCJCUlwiLFxuICAgIFwibG9jYWxlc1wiOiB7XG4gICAgICBcImVuXCI6IFwiQnJhemlsXCIsXG4gICAgICBcImZyXCI6IFwiQnLDqXNpbFwiLFxuICAgICAgXCJkZVwiOiBcIkJyYXNpbGllblwiLFxuICAgICAgXCJlc1wiOiBcIkJyYXNpbFwiXG4gICAgfSxcbiAgICBcInRhZ3NcIjogW1xuXG4gICAgXVxuICB9LFxuICB7XG4gICAgXCJhbHBoYV8yXCI6IFwiSU9cIixcbiAgICBcImxvY2FsZXNcIjoge1xuICAgICAgXCJlblwiOiBcIkJyaXRpc2ggSW5kaWFuIE9jZWFuIFRlcnJpdG9yeVwiLFxuICAgICAgXCJmclwiOiBcIlRlcnJpdG9pcmUgYnJpdGFubmlxdWUgZGUgbCdvY8OpYW4gSW5kaWVuXCIsXG4gICAgICBcImRlXCI6IFwiQnJpdGlzY2hlcyBUZXJyaXRvcml1bSBpbSBJbmRpc2NoZW4gT3plYW5cIixcbiAgICAgIFwiZXNcIjogXCJUZXJyaXRvcmlvIEJyaXTDoW5pY28gZGVsIE9jw6lhbm8gw41uZGljb1wiXG4gICAgfSxcbiAgICBcInRhZ3NcIjogW1xuXG4gICAgXVxuICB9LFxuICB7XG4gICAgXCJhbHBoYV8yXCI6IFwiQk5cIixcbiAgICBcImxvY2FsZXNcIjoge1xuICAgICAgXCJlblwiOiBcIkJydW5laSBEYXJ1c3NhbGFtXCIsXG4gICAgICBcImZyXCI6IFwiQnJ1bmVpXCIsXG4gICAgICBcImRlXCI6IFwiQnJ1bmVpIERhcnVzc2FsYW1cIixcbiAgICAgIFwiZXNcIjogXCJCcnVuZWkgRGFydXNzYWxhbVwiXG4gICAgfSxcbiAgICBcInRhZ3NcIjogW1xuXG4gICAgXVxuICB9LFxuICB7XG4gICAgXCJhbHBoYV8yXCI6IFwiQkdcIixcbiAgICBcImxvY2FsZXNcIjoge1xuICAgICAgXCJlblwiOiBcIkJ1bGdhcmlhXCIsXG4gICAgICBcImZyXCI6IFwiQnVsZ2FyaWVcIixcbiAgICAgIFwiZGVcIjogXCJCdWxnYXJpZW5cIixcbiAgICAgIFwiZXNcIjogXCJCdWxnYXJpYVwiXG4gICAgfSxcbiAgICBcInRhZ3NcIjogW1xuICAgICAgXCJldXJvcGVhbl91bmlvblwiXG4gICAgXVxuICB9LFxuICB7XG4gICAgXCJhbHBoYV8yXCI6IFwiQkZcIixcbiAgICBcImxvY2FsZXNcIjoge1xuICAgICAgXCJlblwiOiBcIkJ1cmtpbmEgRmFzb1wiLFxuICAgICAgXCJmclwiOiBcIkJ1cmtpbmEgRmFzb1wiLFxuICAgICAgXCJkZVwiOiBcIkJ1cmtpbmEgRmFzb1wiLFxuICAgICAgXCJlc1wiOiBcIkJ1cmtpbmEgRmFzb1wiXG4gICAgfSxcbiAgICBcInRhZ3NcIjogW1xuXG4gICAgXVxuICB9LFxuICB7XG4gICAgXCJhbHBoYV8yXCI6IFwiQklcIixcbiAgICBcImxvY2FsZXNcIjoge1xuICAgICAgXCJlblwiOiBcIkJ1cnVuZGlcIixcbiAgICAgIFwiZnJcIjogXCJCdXJ1bmRpXCIsXG4gICAgICBcImRlXCI6IFwiQnVydW5kaVwiLFxuICAgICAgXCJlc1wiOiBcIkJ1cnVuZGlcIlxuICAgIH0sXG4gICAgXCJ0YWdzXCI6IFtcblxuICAgIF1cbiAgfSxcbiAge1xuICAgIFwiYWxwaGFfMlwiOiBcIktIXCIsXG4gICAgXCJsb2NhbGVzXCI6IHtcbiAgICAgIFwiZW5cIjogXCJDYW1ib2RpYVwiLFxuICAgICAgXCJmclwiOiBcIkNhbWJvZGdlXCIsXG4gICAgICBcImRlXCI6IFwiS2FtYm9kc2NoYVwiLFxuICAgICAgXCJlc1wiOiBcIkNhbWJveWFcIlxuICAgIH0sXG4gICAgXCJ0YWdzXCI6IFtcblxuICAgIF1cbiAgfSxcbiAge1xuICAgIFwiYWxwaGFfMlwiOiBcIkNNXCIsXG4gICAgXCJsb2NhbGVzXCI6IHtcbiAgICAgIFwiZW5cIjogXCJDYW1lcm9vblwiLFxuICAgICAgXCJmclwiOiBcIkNhbWVyb3VuXCIsXG4gICAgICBcImRlXCI6IFwiS2FtZXJ1blwiLFxuICAgICAgXCJlc1wiOiBcIkNhbWVyw7puXCJcbiAgICB9LFxuICAgIFwidGFnc1wiOiBbXG5cbiAgICBdXG4gIH0sXG4gIHtcbiAgICBcImFscGhhXzJcIjogXCJDVlwiLFxuICAgIFwibG9jYWxlc1wiOiB7XG4gICAgICBcImVuXCI6IFwiQ2FwZSBWZXJkZVwiLFxuICAgICAgXCJmclwiOiBcIkNhcC1WZXJ0XCIsXG4gICAgICBcImRlXCI6IFwiS2FwIFZlcmRlXCIsXG4gICAgICBcImVzXCI6IFwiQ2FibyBWZXJkZVwiXG4gICAgfSxcbiAgICBcInRhZ3NcIjogW1xuXG4gICAgXVxuICB9LFxuICB7XG4gICAgXCJhbHBoYV8yXCI6IFwiS1lcIixcbiAgICBcImxvY2FsZXNcIjoge1xuICAgICAgXCJlblwiOiBcIkNheW1hbiBJc2xhbmRzXCIsXG4gICAgICBcImZyXCI6IFwiw45sZXMgQ2HDr21hblwiLFxuICAgICAgXCJkZVwiOiBcIkthaW1hbmluc2VsblwiLFxuICAgICAgXCJlc1wiOiBcIklzbGFzIENhaW3DoW5cIlxuICAgIH0sXG4gICAgXCJ0YWdzXCI6IFtcblxuICAgIF1cbiAgfSxcbiAge1xuICAgIFwiYWxwaGFfMlwiOiBcIkNGXCIsXG4gICAgXCJsb2NhbGVzXCI6IHtcbiAgICAgIFwiZW5cIjogXCJDZW50cmFsIEFmcmljYW4gUmVwdWJsaWNcIixcbiAgICAgIFwiZnJcIjogXCJDZW50cmFmcmlxdWVcIixcbiAgICAgIFwiZGVcIjogXCJaZW50cmFsYWZyaWthbmlzY2hlIFJlcHVibGlrXCIsXG4gICAgICBcImVzXCI6IFwiUmVww7pibGljYSBDZW50cm9hZnJpY2FuYVwiXG4gICAgfSxcbiAgICBcInRhZ3NcIjogW1xuXG4gICAgXVxuICB9LFxuICB7XG4gICAgXCJhbHBoYV8yXCI6IFwiVERcIixcbiAgICBcImxvY2FsZXNcIjoge1xuICAgICAgXCJlblwiOiBcIkNoYWRcIixcbiAgICAgIFwiZnJcIjogXCJUY2hhZFwiLFxuICAgICAgXCJkZVwiOiBcIlRzY2hhZFwiLFxuICAgICAgXCJlc1wiOiBcIkNoYWRcIlxuICAgIH0sXG4gICAgXCJ0YWdzXCI6IFtcblxuICAgIF1cbiAgfSxcbiAge1xuICAgIFwiYWxwaGFfMlwiOiBcIkNMXCIsXG4gICAgXCJsb2NhbGVzXCI6IHtcbiAgICAgIFwiZW5cIjogXCJDaGlsZVwiLFxuICAgICAgXCJmclwiOiBcIkNoaWxpXCIsXG4gICAgICBcImRlXCI6IFwiQ2hpbGVcIixcbiAgICAgIFwiZXNcIjogXCJDaGlsZVwiXG4gICAgfSxcbiAgICBcInRhZ3NcIjogW1xuXG4gICAgXVxuICB9LFxuICB7XG4gICAgXCJhbHBoYV8yXCI6IFwiQ05cIixcbiAgICBcImxvY2FsZXNcIjoge1xuICAgICAgXCJlblwiOiBcIkNoaW5hXCIsXG4gICAgICBcImZyXCI6IFwiQ2hpbmVcIixcbiAgICAgIFwiZGVcIjogXCJDaGluYVwiLFxuICAgICAgXCJlc1wiOiBcIkNoaW5hXCJcbiAgICB9LFxuICAgIFwidGFnc1wiOiBbXG5cbiAgICBdXG4gIH0sXG4gIHtcbiAgICBcImFscGhhXzJcIjogXCJDWFwiLFxuICAgIFwibG9jYWxlc1wiOiB7XG4gICAgICBcImVuXCI6IFwiQ2hyaXN0bWFzIElzbGFuZFwiLFxuICAgICAgXCJmclwiOiBcIsOObGUgQ2hyaXN0bWFzXCIsXG4gICAgICBcImRlXCI6IFwiV2VpaG5hY2h0c2luc2VsXCIsXG4gICAgICBcImVzXCI6IFwiSXNsYSBkZSBOYXZpZGFkXCJcbiAgICB9LFxuICAgIFwidGFnc1wiOiBbXG5cbiAgICBdXG4gIH0sXG4gIHtcbiAgICBcImFscGhhXzJcIjogXCJDQ1wiLFxuICAgIFwibG9jYWxlc1wiOiB7XG4gICAgICBcImVuXCI6IFwiQ29jb3MgKEtlZWxpbmcpIElzbGFuZHNcIixcbiAgICAgIFwiZnJcIjogXCLDjmxlcyBDb2Nvc1wiLFxuICAgICAgXCJkZVwiOiBcIkNvY29zaW5zZWxuXCIsXG4gICAgICBcImVzXCI6IFwiSXNsYXMgQ29jb3MgKEtlZWxpbmcpXCJcbiAgICB9LFxuICAgIFwidGFnc1wiOiBbXG5cbiAgICBdXG4gIH0sXG4gIHtcbiAgICBcImFscGhhXzJcIjogXCJDT1wiLFxuICAgIFwibG9jYWxlc1wiOiB7XG4gICAgICBcImVuXCI6IFwiQ29sb21iaWFcIixcbiAgICAgIFwiZnJcIjogXCJDb2xvbWJpZVwiLFxuICAgICAgXCJkZVwiOiBcIktvbHVtYmllblwiLFxuICAgICAgXCJlc1wiOiBcIkNvbG9tYmlhXCJcbiAgICB9LFxuICAgIFwidGFnc1wiOiBbXG5cbiAgICBdXG4gIH0sXG4gIHtcbiAgICBcImFscGhhXzJcIjogXCJLTVwiLFxuICAgIFwibG9jYWxlc1wiOiB7XG4gICAgICBcImVuXCI6IFwiQ29tb3Jvc1wiLFxuICAgICAgXCJmclwiOiBcIkNvbW9yZXNcIixcbiAgICAgIFwiZGVcIjogXCJLb21vcmVuXCIsXG4gICAgICBcImVzXCI6IFwiQ29tb3Jhc1wiXG4gICAgfSxcbiAgICBcInRhZ3NcIjogW1xuXG4gICAgXVxuICB9LFxuICB7XG4gICAgXCJhbHBoYV8yXCI6IFwiQ0dcIixcbiAgICBcImxvY2FsZXNcIjoge1xuICAgICAgXCJlblwiOiBcIkNvbmdvXCIsXG4gICAgICBcImZyXCI6IFwiQ29uZ29cIixcbiAgICAgIFwiZGVcIjogXCJLb25nb1wiLFxuICAgICAgXCJlc1wiOiBcIkNvbmdvXCJcbiAgICB9LFxuICAgIFwidGFnc1wiOiBbXG5cbiAgICBdXG4gIH0sXG4gIHtcbiAgICBcImFscGhhXzJcIjogXCJDRFwiLFxuICAgIFwibG9jYWxlc1wiOiB7XG4gICAgICBcImVuXCI6IFwiQ29uZ28sIHRoZSBEZW1vY3JhdGljIFJlcHVibGljIG9mIHRoZVwiLFxuICAgICAgXCJmclwiOiBcIlLDqXB1YmxpcXVlIETDqW1vY3JhdGlxdWUgZHUgQ29uZ29cIixcbiAgICAgIFwiZGVcIjogXCJLb25nbywgZGVtb2tyYXRpc2NoZSBSZXB1Ymxpa1wiLFxuICAgICAgXCJlc1wiOiBcIlJlcMO6YmxpY2EgRGVtb2Nyw6F0aWNhIGRlbCBDb25nb1wiXG4gICAgfSxcbiAgICBcInRhZ3NcIjogW1xuXG4gICAgXVxuICB9LFxuICB7XG4gICAgXCJhbHBoYV8yXCI6IFwiQ0tcIixcbiAgICBcImxvY2FsZXNcIjoge1xuICAgICAgXCJlblwiOiBcIkNvb2sgSXNsYW5kc1wiLFxuICAgICAgXCJmclwiOiBcIsOObGVzIENvb2tcIixcbiAgICAgIFwiZGVcIjogXCJDb29raW5zZWxuXCIsXG4gICAgICBcImVzXCI6IFwiSXNsYXMgQ29va1wiXG4gICAgfSxcbiAgICBcInRhZ3NcIjogW1xuXG4gICAgXVxuICB9LFxuICB7XG4gICAgXCJhbHBoYV8yXCI6IFwiQ1JcIixcbiAgICBcImxvY2FsZXNcIjoge1xuICAgICAgXCJlblwiOiBcIkNvc3RhIFJpY2FcIixcbiAgICAgIFwiZnJcIjogXCJDb3N0YSBSaWNhXCIsXG4gICAgICBcImRlXCI6IFwiQ29zdGEgUmljYVwiLFxuICAgICAgXCJlc1wiOiBcIkNvc3RhIFJpY2FcIlxuICAgIH0sXG4gICAgXCJ0YWdzXCI6IFtcblxuICAgIF1cbiAgfSxcbiAge1xuICAgIFwiYWxwaGFfMlwiOiBcIkNJXCIsXG4gICAgXCJsb2NhbGVzXCI6IHtcbiAgICAgIFwiZW5cIjogXCJDb3RlIGQnSXZvaXJlXCIsXG4gICAgICBcImZyXCI6IFwiQ8O0dGUgZCdJdm9pcmVcIixcbiAgICAgIFwiZGVcIjogXCJFbGZlbmJlaW5rw7xzdGVcIixcbiAgICAgIFwiZXNcIjogXCJDb3N0YSBkZSBNYXJmaWxcIlxuICAgIH0sXG4gICAgXCJ0YWdzXCI6IFtcblxuICAgIF1cbiAgfSxcbiAge1xuICAgIFwiYWxwaGFfMlwiOiBcIkhSXCIsXG4gICAgXCJsb2NhbGVzXCI6IHtcbiAgICAgIFwiZW5cIjogXCJDcm9hdGlhXCIsXG4gICAgICBcImZyXCI6IFwiQ3JvYXRpZVwiLFxuICAgICAgXCJkZVwiOiBcIktyb2F0aWVuXCIsXG4gICAgICBcImVzXCI6IFwiQ3JvYWNpYVwiXG4gICAgfSxcbiAgICBcInRhZ3NcIjogW1xuICAgICAgXCJldXJvcGVhbl91bmlvblwiXG4gICAgXVxuICB9LFxuICB7XG4gICAgXCJhbHBoYV8yXCI6IFwiQ1dcIixcbiAgICBcImxvY2FsZXNcIjoge1xuICAgICAgXCJlblwiOiBcIkN1cmFjYW9cIixcbiAgICAgIFwiZnJcIjogXCJDdXJhw6dhb1wiLFxuICAgICAgXCJkZVwiOiBcIkN1cmFjYW9cIixcbiAgICAgIFwiZXNcIjogXCJDdXJhY2FvXCJcbiAgICB9LFxuICAgIFwidGFnc1wiOiBbXG5cbiAgICBdXG4gIH0sXG4gIHtcbiAgICBcImFscGhhXzJcIjogXCJDWVwiLFxuICAgIFwibG9jYWxlc1wiOiB7XG4gICAgICBcImVuXCI6IFwiQ3lwcnVzXCIsXG4gICAgICBcImZyXCI6IFwiQ2h5cHJlXCIsXG4gICAgICBcImRlXCI6IFwiWnlwZXJuXCIsXG4gICAgICBcImVzXCI6IFwiQ2hpcHJlXCJcbiAgICB9LFxuICAgIFwidGFnc1wiOiBbXG4gICAgICBcImV1cm9wZWFuX3VuaW9uXCJcbiAgICBdXG4gIH0sXG4gIHtcbiAgICBcImFscGhhXzJcIjogXCJDWlwiLFxuICAgIFwibG9jYWxlc1wiOiB7XG4gICAgICBcImVuXCI6IFwiQ3plY2ggUmVwdWJsaWNcIixcbiAgICAgIFwiZnJcIjogXCJSw6lwdWJsaXF1ZSBUY2jDqHF1ZVwiLFxuICAgICAgXCJkZVwiOiBcIlRzY2hlY2hpc2NoZSBSZXB1Ymxpa1wiLFxuICAgICAgXCJlc1wiOiBcIlJlcMO6YmxpY2EgQ2hlY2FcIlxuICAgIH0sXG4gICAgXCJ0YWdzXCI6IFtcbiAgICAgIFwiZXVyb3BlYW5fdW5pb25cIlxuICAgIF1cbiAgfSxcbiAge1xuICAgIFwiYWxwaGFfMlwiOiBcIkRLXCIsXG4gICAgXCJsb2NhbGVzXCI6IHtcbiAgICAgIFwiZW5cIjogXCJEZW5tYXJrXCIsXG4gICAgICBcImZyXCI6IFwiRGFuZW1hcmtcIixcbiAgICAgIFwiZGVcIjogXCJEw6RuZW1hcmtcIixcbiAgICAgIFwiZXNcIjogXCJEaW5hbWFyY2FcIlxuICAgIH0sXG4gICAgXCJ0YWdzXCI6IFtcbiAgICAgIFwiZXVyb3BlYW5fdW5pb25cIlxuICAgIF1cbiAgfSxcbiAge1xuICAgIFwiYWxwaGFfMlwiOiBcIkRKXCIsXG4gICAgXCJsb2NhbGVzXCI6IHtcbiAgICAgIFwiZW5cIjogXCJEamlib3V0aVwiLFxuICAgICAgXCJmclwiOiBcIkRqaWJvdXRpXCIsXG4gICAgICBcImRlXCI6IFwiRHNjaGlidXRpXCIsXG4gICAgICBcImVzXCI6IFwiWWlidXRpXCJcbiAgICB9LFxuICAgIFwidGFnc1wiOiBbXG5cbiAgICBdXG4gIH0sXG4gIHtcbiAgICBcImFscGhhXzJcIjogXCJETVwiLFxuICAgIFwibG9jYWxlc1wiOiB7XG4gICAgICBcImVuXCI6IFwiRG9taW5pY2FcIixcbiAgICAgIFwiZnJcIjogXCJEb21pbmlxdWVcIixcbiAgICAgIFwiZGVcIjogXCJEb21pbmljYVwiLFxuICAgICAgXCJlc1wiOiBcIkRvbWluaWNhXCJcbiAgICB9LFxuICAgIFwidGFnc1wiOiBbXG5cbiAgICBdXG4gIH0sXG4gIHtcbiAgICBcImFscGhhXzJcIjogXCJET1wiLFxuICAgIFwibG9jYWxlc1wiOiB7XG4gICAgICBcImVuXCI6IFwiRG9taW5pY2FuIFJlcHVibGljXCIsXG4gICAgICBcImZyXCI6IFwiUsOpcHVibGlxdWUgRG9taW5pY2FpbmVcIixcbiAgICAgIFwiZGVcIjogXCJEb21pbmlrYW5pc2NoZSBSZXB1Ymxpa1wiLFxuICAgICAgXCJlc1wiOiBcIlJlcMO6YmxpY2EgRG9taW5pY2FuYVwiXG4gICAgfSxcbiAgICBcInRhZ3NcIjogW1xuXG4gICAgXVxuICB9LFxuICB7XG4gICAgXCJhbHBoYV8yXCI6IFwiRUNcIixcbiAgICBcImxvY2FsZXNcIjoge1xuICAgICAgXCJlblwiOiBcIkVjdWFkb3JcIixcbiAgICAgIFwiZnJcIjogXCJFcXVhdGV1clwiLFxuICAgICAgXCJkZVwiOiBcIkVjdWFkb3JcIixcbiAgICAgIFwiZXNcIjogXCJFY3VhZG9yXCJcbiAgICB9LFxuICAgIFwidGFnc1wiOiBbXG5cbiAgICBdXG4gIH0sXG4gIHtcbiAgICBcImFscGhhXzJcIjogXCJFR1wiLFxuICAgIFwibG9jYWxlc1wiOiB7XG4gICAgICBcImVuXCI6IFwiRWd5cHRcIixcbiAgICAgIFwiZnJcIjogXCJFZ3lwdGVcIixcbiAgICAgIFwiZGVcIjogXCLDhGd5cHRlblwiLFxuICAgICAgXCJlc1wiOiBcIkVnaXB0b1wiXG4gICAgfSxcbiAgICBcInRhZ3NcIjogW1xuXG4gICAgXVxuICB9LFxuICB7XG4gICAgXCJhbHBoYV8yXCI6IFwiU1ZcIixcbiAgICBcImxvY2FsZXNcIjoge1xuICAgICAgXCJlblwiOiBcIkVsIFNhbHZhZG9yXCIsXG4gICAgICBcImZyXCI6IFwiRWwgU2FsdmFkb3JcIixcbiAgICAgIFwiZGVcIjogXCJFbCBTYWx2YWRvclwiLFxuICAgICAgXCJlc1wiOiBcIkVsIFNhbHZhZG9yXCJcbiAgICB9LFxuICAgIFwidGFnc1wiOiBbXG5cbiAgICBdXG4gIH0sXG4gIHtcbiAgICBcImFscGhhXzJcIjogXCJHUVwiLFxuICAgIFwibG9jYWxlc1wiOiB7XG4gICAgICBcImVuXCI6IFwiRXF1YXRvcmlhbCBHdWluZWFcIixcbiAgICAgIFwiZnJcIjogXCJHdWluw6llIMOpcXVhdG9yaWFsZVwiLFxuICAgICAgXCJkZVwiOiBcIsOEcXVhdG9yaWFsZ3VpbmVhXCIsXG4gICAgICBcImVzXCI6IFwiR3VpbmVhIEVjdWF0b3JpYWxcIlxuICAgIH0sXG4gICAgXCJ0YWdzXCI6IFtcblxuICAgIF1cbiAgfSxcbiAge1xuICAgIFwiYWxwaGFfMlwiOiBcIkVSXCIsXG4gICAgXCJsb2NhbGVzXCI6IHtcbiAgICAgIFwiZW5cIjogXCJFcml0cmVhXCIsXG4gICAgICBcImZyXCI6IFwiRXJ5dGhyw6llXCIsXG4gICAgICBcImRlXCI6IFwiRXJpdHJlYVwiLFxuICAgICAgXCJlc1wiOiBcIkVyaXRyZWFcIlxuICAgIH0sXG4gICAgXCJ0YWdzXCI6IFtcblxuICAgIF1cbiAgfSxcbiAge1xuICAgIFwiYWxwaGFfMlwiOiBcIkVFXCIsXG4gICAgXCJsb2NhbGVzXCI6IHtcbiAgICAgIFwiZW5cIjogXCJFc3RvbmlhXCIsXG4gICAgICBcImZyXCI6IFwiRXN0b25pZVwiLFxuICAgICAgXCJkZVwiOiBcIkVzdGxhbmRcIixcbiAgICAgIFwiZXNcIjogXCJFc3RvbmlhXCJcbiAgICB9LFxuICAgIFwidGFnc1wiOiBbXG4gICAgICBcImV1cm9wZWFuX3VuaW9uXCJcbiAgICBdXG4gIH0sXG4gIHtcbiAgICBcImFscGhhXzJcIjogXCJFVFwiLFxuICAgIFwibG9jYWxlc1wiOiB7XG4gICAgICBcImVuXCI6IFwiRXRoaW9waWFcIixcbiAgICAgIFwiZnJcIjogXCJFdGhpb3BpZVwiLFxuICAgICAgXCJkZVwiOiBcIsOEdGhpb3BpZW5cIixcbiAgICAgIFwiZXNcIjogXCJFdGlvcMOtYVwiXG4gICAgfSxcbiAgICBcInRhZ3NcIjogW1xuXG4gICAgXVxuICB9LFxuICB7XG4gICAgXCJhbHBoYV8yXCI6IFwiRktcIixcbiAgICBcImxvY2FsZXNcIjoge1xuICAgICAgXCJlblwiOiBcIkZhbGtsYW5kIElzbGFuZHMgKE1hbHZpbmFzKVwiLFxuICAgICAgXCJmclwiOiBcIsOObGVzIEZhbGtsYW5kIChNYWxvdWluZXMpXCIsXG4gICAgICBcImRlXCI6IFwiRmFsa2xhbmRpbnNlbG4gKE1hbHdpbmVuKVwiLFxuICAgICAgXCJlc1wiOiBcIklzbGFzIE1hbHZpbmFzIChGYWxrbGFuZClcIlxuICAgIH0sXG4gICAgXCJ0YWdzXCI6IFtcblxuICAgIF1cbiAgfSxcbiAge1xuICAgIFwiYWxwaGFfMlwiOiBcIkZPXCIsXG4gICAgXCJsb2NhbGVzXCI6IHtcbiAgICAgIFwiZW5cIjogXCJGYXJvZSBJc2xhbmRzXCIsXG4gICAgICBcImZyXCI6IFwiw45sZXMgRmFyb2VcIixcbiAgICAgIFwiZGVcIjogXCJGw6Ryw7ZlciBJbnNlbG5cIixcbiAgICAgIFwiZXNcIjogXCJJc2xhcyBGZXJvZVwiXG4gICAgfSxcbiAgICBcInRhZ3NcIjogW1xuXG4gICAgXVxuICB9LFxuICB7XG4gICAgXCJhbHBoYV8yXCI6IFwiRkpcIixcbiAgICBcImxvY2FsZXNcIjoge1xuICAgICAgXCJlblwiOiBcIkZpamlcIixcbiAgICAgIFwiZnJcIjogXCJGaWRqaVwiLFxuICAgICAgXCJkZVwiOiBcIkZpZHNjaGlcIixcbiAgICAgIFwiZXNcIjogXCJGaWppXCJcbiAgICB9LFxuICAgIFwidGFnc1wiOiBbXG5cbiAgICBdXG4gIH0sXG4gIHtcbiAgICBcImFscGhhXzJcIjogXCJGSVwiLFxuICAgIFwibG9jYWxlc1wiOiB7XG4gICAgICBcImVuXCI6IFwiRmlubGFuZFwiLFxuICAgICAgXCJmclwiOiBcIkZpbmxhbmRlXCIsXG4gICAgICBcImRlXCI6IFwiRmlubmxhbmRcIixcbiAgICAgIFwiZXNcIjogXCJGaW5sYW5kaWFcIlxuICAgIH0sXG4gICAgXCJ0YWdzXCI6IFtcbiAgICAgIFwiZXVyb3BlYW5fdW5pb25cIlxuICAgIF1cbiAgfSxcbiAge1xuICAgIFwiYWxwaGFfMlwiOiBcIkZSXCIsXG4gICAgXCJsb2NhbGVzXCI6IHtcbiAgICAgIFwiZW5cIjogXCJGcmFuY2VcIixcbiAgICAgIFwiZnJcIjogXCJGcmFuY2VcIixcbiAgICAgIFwiZGVcIjogXCJGcmFua3JlaWNoXCIsXG4gICAgICBcImVzXCI6IFwiRnJhbmNpYVwiXG4gICAgfSxcbiAgICBcInRhZ3NcIjogW1xuICAgICAgXCJldXJvcGVhbl91bmlvblwiXG4gICAgXVxuICB9LFxuICB7XG4gICAgXCJhbHBoYV8yXCI6IFwiR0ZcIixcbiAgICBcImxvY2FsZXNcIjoge1xuICAgICAgXCJlblwiOiBcIkZyZW5jaCBHdWlhbmFcIixcbiAgICAgIFwiZnJcIjogXCJHdXlhbmVcIixcbiAgICAgIFwiZGVcIjogXCJGcmFuesO2c2lzY2gtR3VheWFuYVwiLFxuICAgICAgXCJlc1wiOiBcIkd1YXlhbmEgRnJhbmNlc2FcIlxuICAgIH0sXG4gICAgXCJ0YWdzXCI6IFtcblxuICAgIF1cbiAgfSxcbiAge1xuICAgIFwiYWxwaGFfMlwiOiBcIlBGXCIsXG4gICAgXCJsb2NhbGVzXCI6IHtcbiAgICAgIFwiZW5cIjogXCJGcmVuY2ggUG9seW5lc2lhXCIsXG4gICAgICBcImZyXCI6IFwiUG9seW7DqXNpZSBmcmFuw6dhaXNlXCIsXG4gICAgICBcImRlXCI6IFwiRnJhbnrDtnNpc2NoLVBvbHluZXNpZW5cIixcbiAgICAgIFwiZXNcIjogXCJQb2xpbmVzaWEgRnJhbmNlc2FcIlxuICAgIH0sXG4gICAgXCJ0YWdzXCI6IFtcblxuICAgIF1cbiAgfSxcbiAge1xuICAgIFwiYWxwaGFfMlwiOiBcIlRGXCIsXG4gICAgXCJsb2NhbGVzXCI6IHtcbiAgICAgIFwiZW5cIjogXCJGcmVuY2ggU291dGhlcm4gVGVycml0b3JpZXNcIixcbiAgICAgIFwiZnJcIjogXCJUZXJyZXMgYXVzdHJhbGVzIGV0IGFudGFyY3RpcXVlcyBmcmFuw6dhaXNlc1wiLFxuICAgICAgXCJkZVwiOiBcIkZyYW56w7ZzaXNjaGUgU8O8ZHBvbGFyLVRlcnJpdG9yaWVuXCIsXG4gICAgICBcImVzXCI6IFwiVGVycml0b3Jpb3MgQXVzdHJhbGVzIEZyYW5jZXNlc1wiXG4gICAgfSxcbiAgICBcInRhZ3NcIjogW1xuXG4gICAgXVxuICB9LFxuICB7XG4gICAgXCJhbHBoYV8yXCI6IFwiR0FcIixcbiAgICBcImxvY2FsZXNcIjoge1xuICAgICAgXCJlblwiOiBcIkdhYm9uXCIsXG4gICAgICBcImZyXCI6IFwiR2Fib25cIixcbiAgICAgIFwiZGVcIjogXCJHYWJ1blwiLFxuICAgICAgXCJlc1wiOiBcIkdhYsOzblwiXG4gICAgfSxcbiAgICBcInRhZ3NcIjogW1xuXG4gICAgXVxuICB9LFxuICB7XG4gICAgXCJhbHBoYV8yXCI6IFwiR01cIixcbiAgICBcImxvY2FsZXNcIjoge1xuICAgICAgXCJlblwiOiBcIkdhbWJpYVwiLFxuICAgICAgXCJmclwiOiBcIkdhbWJpZVwiLFxuICAgICAgXCJkZVwiOiBcIkdhbWJpYVwiLFxuICAgICAgXCJlc1wiOiBcIkdhbWJpYVwiXG4gICAgfSxcbiAgICBcInRhZ3NcIjogW1xuXG4gICAgXVxuICB9LFxuICB7XG4gICAgXCJhbHBoYV8yXCI6IFwiR0VcIixcbiAgICBcImxvY2FsZXNcIjoge1xuICAgICAgXCJlblwiOiBcIkdlb3JnaWFcIixcbiAgICAgIFwiZnJcIjogXCJHw6lvcmdpZVwiLFxuICAgICAgXCJkZVwiOiBcIkdlb3JnaWVuXCIsXG4gICAgICBcImVzXCI6IFwiR2VvcmdpYVwiXG4gICAgfSxcbiAgICBcInRhZ3NcIjogW1xuXG4gICAgXVxuICB9LFxuICB7XG4gICAgXCJhbHBoYV8yXCI6IFwiR0hcIixcbiAgICBcImxvY2FsZXNcIjoge1xuICAgICAgXCJlblwiOiBcIkdoYW5hXCIsXG4gICAgICBcImZyXCI6IFwiR2hhbmFcIixcbiAgICAgIFwiZGVcIjogXCJHaGFuYVwiLFxuICAgICAgXCJlc1wiOiBcIkdoYW5hXCJcbiAgICB9LFxuICAgIFwidGFnc1wiOiBbXG5cbiAgICBdXG4gIH0sXG4gIHtcbiAgICBcImFscGhhXzJcIjogXCJHSVwiLFxuICAgIFwibG9jYWxlc1wiOiB7XG4gICAgICBcImVuXCI6IFwiR2licmFsdGFyXCIsXG4gICAgICBcImZyXCI6IFwiR2licmFsdGFyXCIsXG4gICAgICBcImRlXCI6IFwiR2licmFsdGFyXCIsXG4gICAgICBcImVzXCI6IFwiR2licmFsdGFyXCJcbiAgICB9LFxuICAgIFwidGFnc1wiOiBbXG5cbiAgICBdXG4gIH0sXG4gIHtcbiAgICBcImFscGhhXzJcIjogXCJHUlwiLFxuICAgIFwibG9jYWxlc1wiOiB7XG4gICAgICBcImVuXCI6IFwiR3JlZWNlXCIsXG4gICAgICBcImZyXCI6IFwiR3LDqGNlXCIsXG4gICAgICBcImRlXCI6IFwiR3JpZWNoZW5sYW5kXCIsXG4gICAgICBcImVzXCI6IFwiR3JlY2lhXCJcbiAgICB9LFxuICAgIFwidGFnc1wiOiBbXG4gICAgICBcImV1cm9wZWFuX3VuaW9uXCJcbiAgICBdXG4gIH0sXG4gIHtcbiAgICBcImFscGhhXzJcIjogXCJHTFwiLFxuICAgIFwibG9jYWxlc1wiOiB7XG4gICAgICBcImVuXCI6IFwiR3JlZW5sYW5kXCIsXG4gICAgICBcImZyXCI6IFwiR3JvZW5sYW5kXCIsXG4gICAgICBcImRlXCI6IFwiR3LDtm5sYW5kXCIsXG4gICAgICBcImVzXCI6IFwiR3JvZW5sYW5kaWFcIlxuICAgIH0sXG4gICAgXCJ0YWdzXCI6IFtcblxuICAgIF1cbiAgfSxcbiAge1xuICAgIFwiYWxwaGFfMlwiOiBcIkdEXCIsXG4gICAgXCJsb2NhbGVzXCI6IHtcbiAgICAgIFwiZW5cIjogXCJHcmVuYWRhXCIsXG4gICAgICBcImZyXCI6IFwiR3JlbmFkZVwiLFxuICAgICAgXCJkZVwiOiBcIkdyZW5hZGFcIixcbiAgICAgIFwiZXNcIjogXCJHcmFuYWRhXCJcbiAgICB9LFxuICAgIFwidGFnc1wiOiBbXG5cbiAgICBdXG4gIH0sXG4gIHtcbiAgICBcImFscGhhXzJcIjogXCJHUFwiLFxuICAgIFwibG9jYWxlc1wiOiB7XG4gICAgICBcImVuXCI6IFwiR3VhZGVsb3VwZVwiLFxuICAgICAgXCJmclwiOiBcIkd1YWRlbG91cGVcIixcbiAgICAgIFwiZGVcIjogXCJHdWFkZWxvdXBlXCIsXG4gICAgICBcImVzXCI6IFwiR3VhZGFsdXBlXCJcbiAgICB9LFxuICAgIFwidGFnc1wiOiBbXG5cbiAgICBdXG4gIH0sXG4gIHtcbiAgICBcImFscGhhXzJcIjogXCJHVVwiLFxuICAgIFwibG9jYWxlc1wiOiB7XG4gICAgICBcImVuXCI6IFwiR3VhbVwiLFxuICAgICAgXCJmclwiOiBcIkd1YW1cIixcbiAgICAgIFwiZGVcIjogXCJHdWFtXCIsXG4gICAgICBcImVzXCI6IFwiR3VhbVwiXG4gICAgfSxcbiAgICBcInRhZ3NcIjogW1xuXG4gICAgXVxuICB9LFxuICB7XG4gICAgXCJhbHBoYV8yXCI6IFwiR1RcIixcbiAgICBcImxvY2FsZXNcIjoge1xuICAgICAgXCJlblwiOiBcIkd1YXRlbWFsYVwiLFxuICAgICAgXCJmclwiOiBcIkd1YXRlbWFsYVwiLFxuICAgICAgXCJkZVwiOiBcIkd1YXRlbWFsYVwiLFxuICAgICAgXCJlc1wiOiBcIkd1YXRlbWFsYVwiXG4gICAgfSxcbiAgICBcInRhZ3NcIjogW1xuXG4gICAgXVxuICB9LFxuICB7XG4gICAgXCJhbHBoYV8yXCI6IFwiR05cIixcbiAgICBcImxvY2FsZXNcIjoge1xuICAgICAgXCJlblwiOiBcIkd1aW5lYVwiLFxuICAgICAgXCJmclwiOiBcIkd1aW7DqWVcIixcbiAgICAgIFwiZGVcIjogXCJHdWluZWFcIixcbiAgICAgIFwiZXNcIjogXCJHdWluZWFcIlxuICAgIH0sXG4gICAgXCJ0YWdzXCI6IFtcblxuICAgIF1cbiAgfSxcbiAge1xuICAgIFwiYWxwaGFfMlwiOiBcIkdXXCIsXG4gICAgXCJsb2NhbGVzXCI6IHtcbiAgICAgIFwiZW5cIjogXCJHdWluZWEtQmlzc2F1XCIsXG4gICAgICBcImZyXCI6IFwiR3VpbsOpZS1CaXNzYXVcIixcbiAgICAgIFwiZGVcIjogXCJHdWluZWEtQmlzc2F1XCIsXG4gICAgICBcImVzXCI6IFwiR3VpbmVhLUJpc3NhdVwiXG4gICAgfSxcbiAgICBcInRhZ3NcIjogW1xuXG4gICAgXVxuICB9LFxuICB7XG4gICAgXCJhbHBoYV8yXCI6IFwiR1lcIixcbiAgICBcImxvY2FsZXNcIjoge1xuICAgICAgXCJlblwiOiBcIkd1eWFuYVwiLFxuICAgICAgXCJmclwiOiBcIkd1eWFuYVwiLFxuICAgICAgXCJkZVwiOiBcIkd1eWFuYVwiLFxuICAgICAgXCJlc1wiOiBcIkd1YXlhbmFcIlxuICAgIH0sXG4gICAgXCJ0YWdzXCI6IFtcblxuICAgIF1cbiAgfSxcbiAge1xuICAgIFwiYWxwaGFfMlwiOiBcIkhUXCIsXG4gICAgXCJsb2NhbGVzXCI6IHtcbiAgICAgIFwiZW5cIjogXCJIYWl0aVwiLFxuICAgICAgXCJmclwiOiBcIkhhw690aVwiLFxuICAgICAgXCJkZVwiOiBcIkhhaXRpXCIsXG4gICAgICBcImVzXCI6IFwiSGFpdMOtXCJcbiAgICB9LFxuICAgIFwidGFnc1wiOiBbXG5cbiAgICBdXG4gIH0sXG4gIHtcbiAgICBcImFscGhhXzJcIjogXCJITVwiLFxuICAgIFwibG9jYWxlc1wiOiB7XG4gICAgICBcImVuXCI6IFwiSGVhcmQgSXNsYW5kIGFuZCBNY0RvbmFsZCBJc2xhbmRzXCIsXG4gICAgICBcImZyXCI6IFwiw45sZXMgSGVhcmQtZXQtTWFjRG9uYWxkXCIsXG4gICAgICBcImRlXCI6IFwiSGVhcmQtSW5zZWwgdW5kIE1jRG9uYWxkLUluc2VsblwiLFxuICAgICAgXCJlc1wiOiBcIklzbGFzIEhlYXJkIHkgTWNEb25hbGRcIlxuICAgIH0sXG4gICAgXCJ0YWdzXCI6IFtcblxuICAgIF1cbiAgfSxcbiAge1xuICAgIFwiYWxwaGFfMlwiOiBcIlZBXCIsXG4gICAgXCJsb2NhbGVzXCI6IHtcbiAgICAgIFwiZW5cIjogXCJIb2x5IFNlZSAoVmF0aWNhbiBDaXR5IFN0YXRlKVwiLFxuICAgICAgXCJmclwiOiBcIlNhaW50LVNpw6hnZSAoRXRhdCBkdSBWYXRpY2FuKVwiLFxuICAgICAgXCJkZVwiOiBcIlZhdGlrYW5zdGFkdFwiLFxuICAgICAgXCJlc1wiOiBcIlNhbnRhIFNlZGUgKENpdWRhZCBkZWwgVmF0aWNhbm8pXCJcbiAgICB9LFxuICAgIFwidGFnc1wiOiBbXG5cbiAgICBdXG4gIH0sXG4gIHtcbiAgICBcImFscGhhXzJcIjogXCJITlwiLFxuICAgIFwibG9jYWxlc1wiOiB7XG4gICAgICBcImVuXCI6IFwiSG9uZHVyYXNcIixcbiAgICAgIFwiZnJcIjogXCJIb25kdXJhc1wiLFxuICAgICAgXCJkZVwiOiBcIkhvbmR1cmFzXCIsXG4gICAgICBcImVzXCI6IFwiSG9uZHVyYXNcIlxuICAgIH0sXG4gICAgXCJ0YWdzXCI6IFtcblxuICAgIF1cbiAgfSxcbiAge1xuICAgIFwiYWxwaGFfMlwiOiBcIkhLXCIsXG4gICAgXCJsb2NhbGVzXCI6IHtcbiAgICAgIFwiZW5cIjogXCJIb25nIEtvbmdcIixcbiAgICAgIFwiZnJcIjogXCJIb25nIEtvbmdcIixcbiAgICAgIFwiZGVcIjogXCJIb25nIEtvbmdcIixcbiAgICAgIFwiZXNcIjogXCJIb25nIEtvbmdcIlxuICAgIH0sXG4gICAgXCJ0YWdzXCI6IFtcblxuICAgIF1cbiAgfSxcbiAge1xuICAgIFwiYWxwaGFfMlwiOiBcIkhVXCIsXG4gICAgXCJsb2NhbGVzXCI6IHtcbiAgICAgIFwiZW5cIjogXCJIdW5nYXJ5XCIsXG4gICAgICBcImZyXCI6IFwiSG9uZ3JpZVwiLFxuICAgICAgXCJkZVwiOiBcIlVuZ2FyblwiLFxuICAgICAgXCJlc1wiOiBcIkh1bmdyw61hXCJcbiAgICB9LFxuICAgIFwidGFnc1wiOiBbXG4gICAgICBcImV1cm9wZWFuX3VuaW9uXCJcbiAgICBdXG4gIH0sXG4gIHtcbiAgICBcImFscGhhXzJcIjogXCJJU1wiLFxuICAgIFwibG9jYWxlc1wiOiB7XG4gICAgICBcImVuXCI6IFwiSWNlbGFuZFwiLFxuICAgICAgXCJmclwiOiBcIklzbGFuZGVcIixcbiAgICAgIFwiZGVcIjogXCJJc2xhbmRcIixcbiAgICAgIFwiZXNcIjogXCJJc2xhbmRpYVwiXG4gICAgfSxcbiAgICBcInRhZ3NcIjogW1xuXG4gICAgXVxuICB9LFxuICB7XG4gICAgXCJhbHBoYV8yXCI6IFwiSU5cIixcbiAgICBcImxvY2FsZXNcIjoge1xuICAgICAgXCJlblwiOiBcIkluZGlhXCIsXG4gICAgICBcImZyXCI6IFwiSW5kZVwiLFxuICAgICAgXCJkZVwiOiBcIkluZGllblwiLFxuICAgICAgXCJlc1wiOiBcIkluZGlhXCJcbiAgICB9LFxuICAgIFwidGFnc1wiOiBbXG5cbiAgICBdXG4gIH0sXG4gIHtcbiAgICBcImFscGhhXzJcIjogXCJJRFwiLFxuICAgIFwibG9jYWxlc1wiOiB7XG4gICAgICBcImVuXCI6IFwiSW5kb25lc2lhXCIsXG4gICAgICBcImZyXCI6IFwiSW5kb27DqXNpZVwiLFxuICAgICAgXCJkZVwiOiBcIkluZG9uZXNpZW5cIixcbiAgICAgIFwiZXNcIjogXCJJbmRvbmVzaWFcIlxuICAgIH0sXG4gICAgXCJ0YWdzXCI6IFtcblxuICAgIF1cbiAgfSxcbiAge1xuICAgIFwiYWxwaGFfMlwiOiBcIklRXCIsXG4gICAgXCJsb2NhbGVzXCI6IHtcbiAgICAgIFwiZW5cIjogXCJJcmFxXCIsXG4gICAgICBcImZyXCI6IFwiSXJha1wiLFxuICAgICAgXCJkZVwiOiBcIklyYWtcIixcbiAgICAgIFwiZXNcIjogXCJJcmFxXCJcbiAgICB9LFxuICAgIFwidGFnc1wiOiBbXG5cbiAgICBdXG4gIH0sXG4gIHtcbiAgICBcImFscGhhXzJcIjogXCJJRVwiLFxuICAgIFwibG9jYWxlc1wiOiB7XG4gICAgICBcImVuXCI6IFwiSXJlbGFuZFwiLFxuICAgICAgXCJmclwiOiBcIklybGFuZGVcIixcbiAgICAgIFwiZGVcIjogXCJJcmxhbmRcIixcbiAgICAgIFwiZXNcIjogXCJJcmxhbmRhXCJcbiAgICB9LFxuICAgIFwidGFnc1wiOiBbXG4gICAgICBcImV1cm9wZWFuX3VuaW9uXCJcbiAgICBdXG4gIH0sXG4gIHtcbiAgICBcImFscGhhXzJcIjogXCJJTFwiLFxuICAgIFwibG9jYWxlc1wiOiB7XG4gICAgICBcImVuXCI6IFwiSXNyYWVsXCIsXG4gICAgICBcImZyXCI6IFwiSXNyYcOrbFwiLFxuICAgICAgXCJkZVwiOiBcIklzcmFlbFwiLFxuICAgICAgXCJlc1wiOiBcIklzcmFlbFwiXG4gICAgfSxcbiAgICBcInRhZ3NcIjogW1xuXG4gICAgXVxuICB9LFxuICB7XG4gICAgXCJhbHBoYV8yXCI6IFwiSVRcIixcbiAgICBcImxvY2FsZXNcIjoge1xuICAgICAgXCJlblwiOiBcIkl0YWx5XCIsXG4gICAgICBcImZyXCI6IFwiSXRhbGllXCIsXG4gICAgICBcImRlXCI6IFwiSXRhbGllblwiLFxuICAgICAgXCJlc1wiOiBcIkl0YWxpYVwiXG4gICAgfSxcbiAgICBcInRhZ3NcIjogW1xuICAgICAgXCJldXJvcGVhbl91bmlvblwiXG4gICAgXVxuICB9LFxuICB7XG4gICAgXCJhbHBoYV8yXCI6IFwiSk1cIixcbiAgICBcImxvY2FsZXNcIjoge1xuICAgICAgXCJlblwiOiBcIkphbWFpY2FcIixcbiAgICAgIFwiZnJcIjogXCJKYW1hw69xdWVcIixcbiAgICAgIFwiZGVcIjogXCJKYW1haWNhXCIsXG4gICAgICBcImVzXCI6IFwiSmFtYWljYVwiXG4gICAgfSxcbiAgICBcInRhZ3NcIjogW1xuXG4gICAgXVxuICB9LFxuICB7XG4gICAgXCJhbHBoYV8yXCI6IFwiSlBcIixcbiAgICBcImxvY2FsZXNcIjoge1xuICAgICAgXCJlblwiOiBcIkphcGFuXCIsXG4gICAgICBcImZyXCI6IFwiSmFwb25cIixcbiAgICAgIFwiZGVcIjogXCJKYXBhblwiLFxuICAgICAgXCJlc1wiOiBcIkphcMOzblwiXG4gICAgfSxcbiAgICBcInRhZ3NcIjogW1xuXG4gICAgXVxuICB9LFxuICB7XG4gICAgXCJhbHBoYV8yXCI6IFwiSk9cIixcbiAgICBcImxvY2FsZXNcIjoge1xuICAgICAgXCJlblwiOiBcIkpvcmRhblwiLFxuICAgICAgXCJmclwiOiBcIkpvcmRhbmllXCIsXG4gICAgICBcImRlXCI6IFwiSm9yZGFuaWVuXCIsXG4gICAgICBcImVzXCI6IFwiSm9yZGFuaWFcIlxuICAgIH0sXG4gICAgXCJ0YWdzXCI6IFtcblxuICAgIF1cbiAgfSxcbiAge1xuICAgIFwiYWxwaGFfMlwiOiBcIktaXCIsXG4gICAgXCJsb2NhbGVzXCI6IHtcbiAgICAgIFwiZW5cIjogXCJLYXpha2hzdGFuXCIsXG4gICAgICBcImZyXCI6IFwiS2F6YWtoc3RhblwiLFxuICAgICAgXCJkZVwiOiBcIkthc2FjaHN0YW5cIixcbiAgICAgIFwiZXNcIjogXCJLYXphamlzdMOhblwiXG4gICAgfSxcbiAgICBcInRhZ3NcIjogW1xuXG4gICAgXVxuICB9LFxuICB7XG4gICAgXCJhbHBoYV8yXCI6IFwiS0VcIixcbiAgICBcImxvY2FsZXNcIjoge1xuICAgICAgXCJlblwiOiBcIktlbnlhXCIsXG4gICAgICBcImZyXCI6IFwiS2VueWFcIixcbiAgICAgIFwiZGVcIjogXCJLZW5pYVwiLFxuICAgICAgXCJlc1wiOiBcIktlbmlhXCJcbiAgICB9LFxuICAgIFwidGFnc1wiOiBbXG5cbiAgICBdXG4gIH0sXG4gIHtcbiAgICBcImFscGhhXzJcIjogXCJLSVwiLFxuICAgIFwibG9jYWxlc1wiOiB7XG4gICAgICBcImVuXCI6IFwiS2lyaWJhdGlcIixcbiAgICAgIFwiZnJcIjogXCJLaXJpYmF0aVwiLFxuICAgICAgXCJkZVwiOiBcIktpcmliYXRpXCIsXG4gICAgICBcImVzXCI6IFwiS2lyaWJhdGlcIlxuICAgIH0sXG4gICAgXCJ0YWdzXCI6IFtcblxuICAgIF1cbiAgfSxcbiAge1xuICAgIFwiYWxwaGFfMlwiOiBcIktSXCIsXG4gICAgXCJsb2NhbGVzXCI6IHtcbiAgICAgIFwiZW5cIjogXCJLb3JlYSwgUmVwdWJsaWMgb2ZcIixcbiAgICAgIFwiZnJcIjogXCJSw6lwdWJsaXF1ZSBkZSBDb3LDqWVcIixcbiAgICAgIFwiZGVcIjogXCJLb3JlYSwgUmVwdWJsaWtcIixcbiAgICAgIFwiZXNcIjogXCJSZXDDumJsaWNhIGRlIENvcmVhXCJcbiAgICB9LFxuICAgIFwidGFnc1wiOiBbXG5cbiAgICBdXG4gIH0sXG4gIHtcbiAgICBcImFscGhhXzJcIjogXCJYS1wiLFxuICAgIFwibG9jYWxlc1wiOiB7XG4gICAgICBcImVuXCI6IFwiS29zb3ZvXCIsXG4gICAgICBcImZyXCI6IFwiS29zb3ZvXCIsXG4gICAgICBcImRlXCI6IFwiS29zb3ZvXCIsXG4gICAgICBcImVzXCI6IFwiS29zb3ZvXCJcbiAgICB9LFxuICAgIFwidGFnc1wiOiBbXG5cbiAgICBdXG4gIH0sXG4gIHtcbiAgICBcImFscGhhXzJcIjogXCJLV1wiLFxuICAgIFwibG9jYWxlc1wiOiB7XG4gICAgICBcImVuXCI6IFwiS3V3YWl0XCIsXG4gICAgICBcImZyXCI6IFwiS293ZcOvdFwiLFxuICAgICAgXCJkZVwiOiBcIkt1d2FpdFwiLFxuICAgICAgXCJlc1wiOiBcIkt1d2FpdFwiXG4gICAgfSxcbiAgICBcInRhZ3NcIjogW1xuXG4gICAgXVxuICB9LFxuICB7XG4gICAgXCJhbHBoYV8yXCI6IFwiS0dcIixcbiAgICBcImxvY2FsZXNcIjoge1xuICAgICAgXCJlblwiOiBcIkt5cmd5enN0YW5cIixcbiAgICAgIFwiZnJcIjogXCJLaXJnaGl6aXN0YW5cIixcbiAgICAgIFwiZGVcIjogXCJLaXJnaXNpc3RhblwiLFxuICAgICAgXCJlc1wiOiBcIktpcmd1aXN0w6FuXCJcbiAgICB9LFxuICAgIFwidGFnc1wiOiBbXG5cbiAgICBdXG4gIH0sXG4gIHtcbiAgICBcImFscGhhXzJcIjogXCJMQVwiLFxuICAgIFwibG9jYWxlc1wiOiB7XG4gICAgICBcImVuXCI6IFwiTGFvIFBlb3BsZSdzIERlbW9jcmF0aWMgUmVwdWJsaWNcIixcbiAgICAgIFwiZnJcIjogXCJMYW9zXCIsXG4gICAgICBcImRlXCI6IFwiTGFvc1wiLFxuICAgICAgXCJlc1wiOiBcIlJlcMO6YmxpY2EgRGVtb2Nyw6F0aWNhIFBvcHVsYXIgTGFvXCJcbiAgICB9LFxuICAgIFwidGFnc1wiOiBbXG5cbiAgICBdXG4gIH0sXG4gIHtcbiAgICBcImFscGhhXzJcIjogXCJMVlwiLFxuICAgIFwibG9jYWxlc1wiOiB7XG4gICAgICBcImVuXCI6IFwiTGF0dmlhXCIsXG4gICAgICBcImZyXCI6IFwiTGV0dG9uaWVcIixcbiAgICAgIFwiZGVcIjogXCJMZXR0bGFuZFwiLFxuICAgICAgXCJlc1wiOiBcIkxldG9uaWFcIlxuICAgIH0sXG4gICAgXCJ0YWdzXCI6IFtcbiAgICAgIFwiZXVyb3BlYW5fdW5pb25cIlxuICAgIF1cbiAgfSxcbiAge1xuICAgIFwiYWxwaGFfMlwiOiBcIkxCXCIsXG4gICAgXCJsb2NhbGVzXCI6IHtcbiAgICAgIFwiZW5cIjogXCJMZWJhbm9uXCIsXG4gICAgICBcImZyXCI6IFwiTGliYW5cIixcbiAgICAgIFwiZGVcIjogXCJMaWJhbm9uXCIsXG4gICAgICBcImVzXCI6IFwiTMOtYmFub1wiXG4gICAgfSxcbiAgICBcInRhZ3NcIjogW1xuXG4gICAgXVxuICB9LFxuICB7XG4gICAgXCJhbHBoYV8yXCI6IFwiTFNcIixcbiAgICBcImxvY2FsZXNcIjoge1xuICAgICAgXCJlblwiOiBcIkxlc290aG9cIixcbiAgICAgIFwiZnJcIjogXCJMZXNvdGhvXCIsXG4gICAgICBcImRlXCI6IFwiTGVzb3Rob1wiLFxuICAgICAgXCJlc1wiOiBcIkxlc290b1wiXG4gICAgfSxcbiAgICBcInRhZ3NcIjogW1xuXG4gICAgXVxuICB9LFxuICB7XG4gICAgXCJhbHBoYV8yXCI6IFwiTFJcIixcbiAgICBcImxvY2FsZXNcIjoge1xuICAgICAgXCJlblwiOiBcIkxpYmVyaWFcIixcbiAgICAgIFwiZnJcIjogXCJMaWJlcmlhXCIsXG4gICAgICBcImRlXCI6IFwiTGliZXJpZW5cIixcbiAgICAgIFwiZXNcIjogXCJMaWJlcmlhXCJcbiAgICB9LFxuICAgIFwidGFnc1wiOiBbXG5cbiAgICBdXG4gIH0sXG4gIHtcbiAgICBcImFscGhhXzJcIjogXCJMWVwiLFxuICAgIFwibG9jYWxlc1wiOiB7XG4gICAgICBcImVuXCI6IFwiTGlieWFcIixcbiAgICAgIFwiZnJcIjogXCJMaWJ5ZVwiLFxuICAgICAgXCJkZVwiOiBcIkxpYnllblwiLFxuICAgICAgXCJlc1wiOiBcIkxpYmlhXCJcbiAgICB9LFxuICAgIFwidGFnc1wiOiBbXG5cbiAgICBdXG4gIH0sXG4gIHtcbiAgICBcImFscGhhXzJcIjogXCJMSVwiLFxuICAgIFwibG9jYWxlc1wiOiB7XG4gICAgICBcImVuXCI6IFwiTGllY2h0ZW5zdGVpblwiLFxuICAgICAgXCJmclwiOiBcIkxpZWNodGVuc3RlaW5cIixcbiAgICAgIFwiZGVcIjogXCJMaWVjaHRlbnN0ZWluXCIsXG4gICAgICBcImVzXCI6IFwiTGllY2h0ZW5zdGVpblwiXG4gICAgfSxcbiAgICBcInRhZ3NcIjogW1xuXG4gICAgXVxuICB9LFxuICB7XG4gICAgXCJhbHBoYV8yXCI6IFwiTFRcIixcbiAgICBcImxvY2FsZXNcIjoge1xuICAgICAgXCJlblwiOiBcIkxpdGh1YW5pYVwiLFxuICAgICAgXCJmclwiOiBcIkxpdHVhbmllXCIsXG4gICAgICBcImRlXCI6IFwiTGl0YXVlblwiLFxuICAgICAgXCJlc1wiOiBcIkxpdHVhbmlhXCJcbiAgICB9LFxuICAgIFwidGFnc1wiOiBbXG4gICAgICBcImV1cm9wZWFuX3VuaW9uXCJcbiAgICBdXG4gIH0sXG4gIHtcbiAgICBcImFscGhhXzJcIjogXCJMVVwiLFxuICAgIFwibG9jYWxlc1wiOiB7XG4gICAgICBcImVuXCI6IFwiTHV4ZW1ib3VyZ1wiLFxuICAgICAgXCJmclwiOiBcIkx1eGVtYm91cmdcIixcbiAgICAgIFwiZGVcIjogXCJMdXhlbWJvdXJnXCIsXG4gICAgICBcImVzXCI6IFwiTHV4ZW1idXJnb1wiXG4gICAgfSxcbiAgICBcInRhZ3NcIjogW1xuICAgICAgXCJldXJvcGVhbl91bmlvblwiXG4gICAgXVxuICB9LFxuICB7XG4gICAgXCJhbHBoYV8yXCI6IFwiTU9cIixcbiAgICBcImxvY2FsZXNcIjoge1xuICAgICAgXCJlblwiOiBcIk1hY2FvXCIsXG4gICAgICBcImZyXCI6IFwiTWFjYW9cIixcbiAgICAgIFwiZGVcIjogXCJNYWNhdVwiLFxuICAgICAgXCJlc1wiOiBcIk1hY2FvXCJcbiAgICB9LFxuICAgIFwidGFnc1wiOiBbXG5cbiAgICBdXG4gIH0sXG4gIHtcbiAgICBcImFscGhhXzJcIjogXCJNS1wiLFxuICAgIFwibG9jYWxlc1wiOiB7XG4gICAgICBcImVuXCI6IFwiTWFjZWRvbmlhXCIsXG4gICAgICBcImZyXCI6IFwiTWFjw6lkb2luZVwiLFxuICAgICAgXCJkZVwiOiBcIk1hemVkb25pZW5cIixcbiAgICAgIFwiZXNcIjogXCJNYWNlZG9uaWFcIlxuICAgIH0sXG4gICAgXCJ0YWdzXCI6IFtcblxuICAgIF1cbiAgfSxcbiAge1xuICAgIFwiYWxwaGFfMlwiOiBcIk1HXCIsXG4gICAgXCJsb2NhbGVzXCI6IHtcbiAgICAgIFwiZW5cIjogXCJNYWRhZ2FzY2FyXCIsXG4gICAgICBcImZyXCI6IFwiTWFkYWdhc2NhclwiLFxuICAgICAgXCJkZVwiOiBcIk1hZGFnYXNrYXJcIixcbiAgICAgIFwiZXNcIjogXCJNYWRhZ2FzY2FyXCJcbiAgICB9LFxuICAgIFwidGFnc1wiOiBbXG5cbiAgICBdXG4gIH0sXG4gIHtcbiAgICBcImFscGhhXzJcIjogXCJNV1wiLFxuICAgIFwibG9jYWxlc1wiOiB7XG4gICAgICBcImVuXCI6IFwiTWFsYXdpXCIsXG4gICAgICBcImZyXCI6IFwiTWFsYXdpXCIsXG4gICAgICBcImRlXCI6IFwiTWFsYXdpXCIsXG4gICAgICBcImVzXCI6IFwiTWFsYXdpXCJcbiAgICB9LFxuICAgIFwidGFnc1wiOiBbXG5cbiAgICBdXG4gIH0sXG4gIHtcbiAgICBcImFscGhhXzJcIjogXCJNWVwiLFxuICAgIFwibG9jYWxlc1wiOiB7XG4gICAgICBcImVuXCI6IFwiTWFsYXlzaWFcIixcbiAgICAgIFwiZnJcIjogXCJNYWxhaXNpZVwiLFxuICAgICAgXCJkZVwiOiBcIk1hbGF5c2lhXCIsXG4gICAgICBcImVzXCI6IFwiTWFsYXNpYVwiXG4gICAgfSxcbiAgICBcInRhZ3NcIjogW1xuXG4gICAgXVxuICB9LFxuICB7XG4gICAgXCJhbHBoYV8yXCI6IFwiTVZcIixcbiAgICBcImxvY2FsZXNcIjoge1xuICAgICAgXCJlblwiOiBcIk1hbGRpdmVzXCIsXG4gICAgICBcImZyXCI6IFwiTWFsZGl2ZXNcIixcbiAgICAgIFwiZGVcIjogXCJNYWxlZGl2ZW5cIixcbiAgICAgIFwiZXNcIjogXCJNYWxkaXZhc1wiXG4gICAgfSxcbiAgICBcInRhZ3NcIjogW1xuXG4gICAgXVxuICB9LFxuICB7XG4gICAgXCJhbHBoYV8yXCI6IFwiTUxcIixcbiAgICBcImxvY2FsZXNcIjoge1xuICAgICAgXCJlblwiOiBcIk1hbGlcIixcbiAgICAgIFwiZnJcIjogXCJNYWxpXCIsXG4gICAgICBcImRlXCI6IFwiTWFsaVwiLFxuICAgICAgXCJlc1wiOiBcIk1hbGlcIlxuICAgIH0sXG4gICAgXCJ0YWdzXCI6IFtcblxuICAgIF1cbiAgfSxcbiAge1xuICAgIFwiYWxwaGFfMlwiOiBcIk1UXCIsXG4gICAgXCJsb2NhbGVzXCI6IHtcbiAgICAgIFwiZW5cIjogXCJNYWx0YVwiLFxuICAgICAgXCJmclwiOiBcIk1hbHRlXCIsXG4gICAgICBcImRlXCI6IFwiTWFsdGFcIixcbiAgICAgIFwiZXNcIjogXCJNYWx0YVwiXG4gICAgfSxcbiAgICBcInRhZ3NcIjogW1xuICAgICAgXCJldXJvcGVhbl91bmlvblwiXG4gICAgXVxuICB9LFxuICB7XG4gICAgXCJhbHBoYV8yXCI6IFwiTUhcIixcbiAgICBcImxvY2FsZXNcIjoge1xuICAgICAgXCJlblwiOiBcIk1hcnNoYWxsIElzbGFuZHNcIixcbiAgICAgIFwiZnJcIjogXCLDjmxlcyBNYXJzaGFsbFwiLFxuICAgICAgXCJkZVwiOiBcIk1hcnNoYWxsaW5zZWxuXCIsXG4gICAgICBcImVzXCI6IFwiSXNsYXMgTWFyc2hhbGxcIlxuICAgIH0sXG4gICAgXCJ0YWdzXCI6IFtcblxuICAgIF1cbiAgfSxcbiAge1xuICAgIFwiYWxwaGFfMlwiOiBcIk1RXCIsXG4gICAgXCJsb2NhbGVzXCI6IHtcbiAgICAgIFwiZW5cIjogXCJNYXJ0aW5pcXVlXCIsXG4gICAgICBcImZyXCI6IFwiTWFydGluaXF1ZVwiLFxuICAgICAgXCJkZVwiOiBcIk1hcnRpbmlxdWVcIixcbiAgICAgIFwiZXNcIjogXCJNYXJ0aW5pY2FcIlxuICAgIH0sXG4gICAgXCJ0YWdzXCI6IFtcblxuICAgIF1cbiAgfSxcbiAge1xuICAgIFwiYWxwaGFfMlwiOiBcIk1SXCIsXG4gICAgXCJsb2NhbGVzXCI6IHtcbiAgICAgIFwiZW5cIjogXCJNYXVyaXRhbmlhXCIsXG4gICAgICBcImZyXCI6IFwiTWF1cml0YW5pZVwiLFxuICAgICAgXCJkZVwiOiBcIk1hdXJpdGFuaWVuXCIsXG4gICAgICBcImVzXCI6IFwiTWF1cml0YW5pYVwiXG4gICAgfSxcbiAgICBcInRhZ3NcIjogW1xuXG4gICAgXVxuICB9LFxuICB7XG4gICAgXCJhbHBoYV8yXCI6IFwiTVVcIixcbiAgICBcImxvY2FsZXNcIjoge1xuICAgICAgXCJlblwiOiBcIk1hdXJpdGl1c1wiLFxuICAgICAgXCJmclwiOiBcIsOObGUgTWF1cmljZVwiLFxuICAgICAgXCJkZVwiOiBcIk1hdXJpdGl1c1wiLFxuICAgICAgXCJlc1wiOiBcIk1hdXJpY2lvXCJcbiAgICB9LFxuICAgIFwidGFnc1wiOiBbXG5cbiAgICBdXG4gIH0sXG4gIHtcbiAgICBcImFscGhhXzJcIjogXCJZVFwiLFxuICAgIFwibG9jYWxlc1wiOiB7XG4gICAgICBcImVuXCI6IFwiTWF5b3R0ZVwiLFxuICAgICAgXCJmclwiOiBcIk1heW90dGVcIixcbiAgICAgIFwiZGVcIjogXCJNYXlvdHRlXCIsXG4gICAgICBcImVzXCI6IFwiTWF5b3R0ZVwiXG4gICAgfSxcbiAgICBcInRhZ3NcIjogW1xuXG4gICAgXVxuICB9LFxuICB7XG4gICAgXCJhbHBoYV8yXCI6IFwiTVhcIixcbiAgICBcImxvY2FsZXNcIjoge1xuICAgICAgXCJlblwiOiBcIk1leGljb1wiLFxuICAgICAgXCJmclwiOiBcIk1leGlxdWVcIixcbiAgICAgIFwiZGVcIjogXCJNZXhpa29cIixcbiAgICAgIFwiZXNcIjogXCJNw6l4aWNvXCJcbiAgICB9LFxuICAgIFwidGFnc1wiOiBbXG5cbiAgICBdXG4gIH0sXG4gIHtcbiAgICBcImFscGhhXzJcIjogXCJGTVwiLFxuICAgIFwibG9jYWxlc1wiOiB7XG4gICAgICBcImVuXCI6IFwiTWljcm9uZXNpYSwgRmVkZXJhdGVkIFN0YXRlcyBvZlwiLFxuICAgICAgXCJmclwiOiBcIk1pY3JvbsOpc2llIChFdGF0cyBmw6lkw6lyYXV4IGRlKVwiLFxuICAgICAgXCJkZVwiOiBcIk1pa3JvbmVzaWVuXCIsXG4gICAgICBcImVzXCI6IFwiRXN0YWRvcyBGZWRlcmFkb3MgZGUgTWljcm9uZXNpYVwiXG4gICAgfSxcbiAgICBcInRhZ3NcIjogW1xuXG4gICAgXVxuICB9LFxuICB7XG4gICAgXCJhbHBoYV8yXCI6IFwiTURcIixcbiAgICBcImxvY2FsZXNcIjoge1xuICAgICAgXCJlblwiOiBcIk1vbGRvdmEsIFJlcHVibGljIG9mXCIsXG4gICAgICBcImZyXCI6IFwiTW9sZGF2aWUgKFLDqXB1YmxpcXVlIGRlKVwiLFxuICAgICAgXCJkZVwiOiBcIk1vbGRhd2llblwiLFxuICAgICAgXCJlc1wiOiBcIk1vbGRhdmlhLCBSZXDDumJsaWNhIGRlXCJcbiAgICB9LFxuICAgIFwidGFnc1wiOiBbXG5cbiAgICBdXG4gIH0sXG4gIHtcbiAgICBcImFscGhhXzJcIjogXCJNQ1wiLFxuICAgIFwibG9jYWxlc1wiOiB7XG4gICAgICBcImVuXCI6IFwiTW9uYWNvXCIsXG4gICAgICBcImZyXCI6IFwiTW9uYWNvXCIsXG4gICAgICBcImRlXCI6IFwiTW9uYWNvXCIsXG4gICAgICBcImVzXCI6IFwiTcOzbmFjb1wiXG4gICAgfSxcbiAgICBcInRhZ3NcIjogW1xuXG4gICAgXVxuICB9LFxuICB7XG4gICAgXCJhbHBoYV8yXCI6IFwiTU5cIixcbiAgICBcImxvY2FsZXNcIjoge1xuICAgICAgXCJlblwiOiBcIk1vbmdvbGlhXCIsXG4gICAgICBcImZyXCI6IFwiTW9uZ29saWVcIixcbiAgICAgIFwiZGVcIjogXCJNb25nb2xlaVwiLFxuICAgICAgXCJlc1wiOiBcIk1vbmdvbGlhXCJcbiAgICB9LFxuICAgIFwidGFnc1wiOiBbXG5cbiAgICBdXG4gIH0sXG4gIHtcbiAgICBcImFscGhhXzJcIjogXCJNRVwiLFxuICAgIFwibG9jYWxlc1wiOiB7XG4gICAgICBcImVuXCI6IFwiTW9udGVuZWdyb1wiLFxuICAgICAgXCJmclwiOiBcIk1vbnTDqW7DqWdyb1wiLFxuICAgICAgXCJkZVwiOiBcIk1vbnRlbmVncm9cIixcbiAgICAgIFwiZXNcIjogXCJNb250ZW5lZ3JvXCJcbiAgICB9LFxuICAgIFwidGFnc1wiOiBbXG5cbiAgICBdXG4gIH0sXG4gIHtcbiAgICBcImFscGhhXzJcIjogXCJNU1wiLFxuICAgIFwibG9jYWxlc1wiOiB7XG4gICAgICBcImVuXCI6IFwiTW9udHNlcnJhdFwiLFxuICAgICAgXCJmclwiOiBcIk1vbnRzZXJyYXRcIixcbiAgICAgIFwiZGVcIjogXCJNb250c2VycmF0XCIsXG4gICAgICBcImVzXCI6IFwiTW9udHNlcnJhdFwiXG4gICAgfSxcbiAgICBcInRhZ3NcIjogW1xuXG4gICAgXVxuICB9LFxuICB7XG4gICAgXCJhbHBoYV8yXCI6IFwiTUFcIixcbiAgICBcImxvY2FsZXNcIjoge1xuICAgICAgXCJlblwiOiBcIk1vcm9jY29cIixcbiAgICAgIFwiZnJcIjogXCJNYXJvY1wiLFxuICAgICAgXCJkZVwiOiBcIk1hcm9ra29cIixcbiAgICAgIFwiZXNcIjogXCJNYXJydWVjb3NcIlxuICAgIH0sXG4gICAgXCJ0YWdzXCI6IFtcblxuICAgIF1cbiAgfSxcbiAge1xuICAgIFwiYWxwaGFfMlwiOiBcIk1aXCIsXG4gICAgXCJsb2NhbGVzXCI6IHtcbiAgICAgIFwiZW5cIjogXCJNb3phbWJpcXVlXCIsXG4gICAgICBcImZyXCI6IFwiTW96YW1iaXF1ZVwiLFxuICAgICAgXCJkZVwiOiBcIk1vc2FtYmlrXCIsXG4gICAgICBcImVzXCI6IFwiTW96YW1iaXF1ZVwiXG4gICAgfSxcbiAgICBcInRhZ3NcIjogW1xuXG4gICAgXVxuICB9LFxuICB7XG4gICAgXCJhbHBoYV8yXCI6IFwiTU1cIixcbiAgICBcImxvY2FsZXNcIjoge1xuICAgICAgXCJlblwiOiBcIk15YW5tYXJcIixcbiAgICAgIFwiZnJcIjogXCJNeWFubWFyXCIsXG4gICAgICBcImRlXCI6IFwiTXlhbm1hclwiLFxuICAgICAgXCJlc1wiOiBcIkJpcm1hbmlhXCJcbiAgICB9LFxuICAgIFwidGFnc1wiOiBbXG5cbiAgICBdXG4gIH0sXG4gIHtcbiAgICBcImFscGhhXzJcIjogXCJOQVwiLFxuICAgIFwibG9jYWxlc1wiOiB7XG4gICAgICBcImVuXCI6IFwiTmFtaWJpYVwiLFxuICAgICAgXCJmclwiOiBcIk5hbWliaWVcIixcbiAgICAgIFwiZGVcIjogXCJOYW1pYmlhXCIsXG4gICAgICBcImVzXCI6IFwiTmFtaWJpYVwiXG4gICAgfSxcbiAgICBcInRhZ3NcIjogW1xuXG4gICAgXVxuICB9LFxuICB7XG4gICAgXCJhbHBoYV8yXCI6IFwiTlJcIixcbiAgICBcImxvY2FsZXNcIjoge1xuICAgICAgXCJlblwiOiBcIk5hdXJ1XCIsXG4gICAgICBcImZyXCI6IFwiTmF1cnVcIixcbiAgICAgIFwiZGVcIjogXCJOYXVydVwiLFxuICAgICAgXCJlc1wiOiBcIk5hdXJ1XCJcbiAgICB9LFxuICAgIFwidGFnc1wiOiBbXG5cbiAgICBdXG4gIH0sXG4gIHtcbiAgICBcImFscGhhXzJcIjogXCJOUFwiLFxuICAgIFwibG9jYWxlc1wiOiB7XG4gICAgICBcImVuXCI6IFwiTmVwYWxcIixcbiAgICAgIFwiZnJcIjogXCJOw6lwYWxcIixcbiAgICAgIFwiZGVcIjogXCJOZXBhbFwiLFxuICAgICAgXCJlc1wiOiBcIk5lcGFsXCJcbiAgICB9LFxuICAgIFwidGFnc1wiOiBbXG5cbiAgICBdXG4gIH0sXG4gIHtcbiAgICBcImFscGhhXzJcIjogXCJOTFwiLFxuICAgIFwibG9jYWxlc1wiOiB7XG4gICAgICBcImVuXCI6IFwiTmV0aGVybGFuZHNcIixcbiAgICAgIFwiZnJcIjogXCJQYXlzLUJhc1wiLFxuICAgICAgXCJkZVwiOiBcIk5pZWRlcmxhbmRlXCIsXG4gICAgICBcImVzXCI6IFwiUGHDrXNlcyBCYWpvc1wiXG4gICAgfSxcbiAgICBcInRhZ3NcIjogW1xuICAgICAgXCJldXJvcGVhbl91bmlvblwiXG4gICAgXVxuICB9LFxuICB7XG4gICAgXCJhbHBoYV8yXCI6IFwiQU5cIixcbiAgICBcImxvY2FsZXNcIjoge1xuICAgICAgXCJlblwiOiBcIk5ldGhlcmxhbmRzIEFudGlsbGVzXCIsXG4gICAgICBcImZyXCI6IFwiUGF5cy1CYXMgYW50aWxsYWlzXCIsXG4gICAgICBcImRlXCI6IFwiTmllZGVybMOkbmRpc2NoZSBBbnRpbGxlblwiLFxuICAgICAgXCJlc1wiOiBcIkFudGlsbGFzIE5lZXJsYW5kZXNhc1wiXG4gICAgfSxcbiAgICBcInRhZ3NcIjogW1xuXG4gICAgXVxuICB9LFxuICB7XG4gICAgXCJhbHBoYV8yXCI6IFwiTkNcIixcbiAgICBcImxvY2FsZXNcIjoge1xuICAgICAgXCJlblwiOiBcIk5ldyBDYWxlZG9uaWFcIixcbiAgICAgIFwiZnJcIjogXCJOb3V2ZWxsZS1DYWzDqWRvbmllXCIsXG4gICAgICBcImRlXCI6IFwiTmV1a2FsZWRvbmllblwiLFxuICAgICAgXCJlc1wiOiBcIk51ZXZhIENhbGVkb25pYVwiXG4gICAgfSxcbiAgICBcInRhZ3NcIjogW1xuXG4gICAgXVxuICB9LFxuICB7XG4gICAgXCJhbHBoYV8yXCI6IFwiTlpcIixcbiAgICBcImxvY2FsZXNcIjoge1xuICAgICAgXCJlblwiOiBcIk5ldyBaZWFsYW5kXCIsXG4gICAgICBcImZyXCI6IFwiTm91dmVsbGUtWsOpbGFuZGVcIixcbiAgICAgIFwiZGVcIjogXCJOZXVzZWVsYW5kXCIsXG4gICAgICBcImVzXCI6IFwiTnVldmEgWmVsYW5kaWFcIlxuICAgIH0sXG4gICAgXCJ0YWdzXCI6IFtcblxuICAgIF1cbiAgfSxcbiAge1xuICAgIFwiYWxwaGFfMlwiOiBcIk5JXCIsXG4gICAgXCJsb2NhbGVzXCI6IHtcbiAgICAgIFwiZW5cIjogXCJOaWNhcmFndWFcIixcbiAgICAgIFwiZnJcIjogXCJOaWNhcmFndWFcIixcbiAgICAgIFwiZGVcIjogXCJOaWNhcmFndWFcIixcbiAgICAgIFwiZXNcIjogXCJOaWNhcmFndWFcIlxuICAgIH0sXG4gICAgXCJ0YWdzXCI6IFtcblxuICAgIF1cbiAgfSxcbiAge1xuICAgIFwiYWxwaGFfMlwiOiBcIk5FXCIsXG4gICAgXCJsb2NhbGVzXCI6IHtcbiAgICAgIFwiZW5cIjogXCJOaWdlclwiLFxuICAgICAgXCJmclwiOiBcIk5pZ2VyXCIsXG4gICAgICBcImRlXCI6IFwiTmlnZXJcIixcbiAgICAgIFwiZXNcIjogXCJOw61nZXJcIlxuICAgIH0sXG4gICAgXCJ0YWdzXCI6IFtcblxuICAgIF1cbiAgfSxcbiAge1xuICAgIFwiYWxwaGFfMlwiOiBcIk5HXCIsXG4gICAgXCJsb2NhbGVzXCI6IHtcbiAgICAgIFwiZW5cIjogXCJOaWdlcmlhXCIsXG4gICAgICBcImZyXCI6IFwiTmlnZXJpYVwiLFxuICAgICAgXCJkZVwiOiBcIk5pZ2VyaWFcIixcbiAgICAgIFwiZXNcIjogXCJOaWdlcmlhXCJcbiAgICB9LFxuICAgIFwidGFnc1wiOiBbXG5cbiAgICBdXG4gIH0sXG4gIHtcbiAgICBcImFscGhhXzJcIjogXCJOVVwiLFxuICAgIFwibG9jYWxlc1wiOiB7XG4gICAgICBcImVuXCI6IFwiTml1ZVwiLFxuICAgICAgXCJmclwiOiBcIk5pdWVcIixcbiAgICAgIFwiZGVcIjogXCJOaXVlXCIsXG4gICAgICBcImVzXCI6IFwiTml1ZVwiXG4gICAgfSxcbiAgICBcInRhZ3NcIjogW1xuXG4gICAgXVxuICB9LFxuICB7XG4gICAgXCJhbHBoYV8yXCI6IFwiTkZcIixcbiAgICBcImxvY2FsZXNcIjoge1xuICAgICAgXCJlblwiOiBcIk5vcmZvbGsgSXNsYW5kXCIsXG4gICAgICBcImZyXCI6IFwiw45sZSBkZSBOb3Jmb2xrXCIsXG4gICAgICBcImRlXCI6IFwiTm9yZm9sa2luc2VsblwiLFxuICAgICAgXCJlc1wiOiBcIklzbGEgTm9yZm9sa1wiXG4gICAgfSxcbiAgICBcInRhZ3NcIjogW1xuXG4gICAgXVxuICB9LFxuICB7XG4gICAgXCJhbHBoYV8yXCI6IFwiTVBcIixcbiAgICBcImxvY2FsZXNcIjoge1xuICAgICAgXCJlblwiOiBcIk5vcnRoZXJuIE1hcmlhbmEgSXNsYW5kc1wiLFxuICAgICAgXCJmclwiOiBcIsOObGVzIE1hcmlhbm5lcyBkdSBOb3JkXCIsXG4gICAgICBcImRlXCI6IFwiTsO2cmRsaWNoZSBNYXJpYW5lblwiLFxuICAgICAgXCJlc1wiOiBcIklzbGFzIE1hcmlhbmFzIGRlbCBOb3J0ZVwiXG4gICAgfSxcbiAgICBcInRhZ3NcIjogW1xuXG4gICAgXVxuICB9LFxuICB7XG4gICAgXCJhbHBoYV8yXCI6IFwiTk9cIixcbiAgICBcImxvY2FsZXNcIjoge1xuICAgICAgXCJlblwiOiBcIk5vcndheVwiLFxuICAgICAgXCJmclwiOiBcIk5vcnbDqGdlXCIsXG4gICAgICBcImRlXCI6IFwiTm9yd2VnZW5cIixcbiAgICAgIFwiZXNcIjogXCJOb3J1ZWdhXCJcbiAgICB9LFxuICAgIFwidGFnc1wiOiBbXG5cbiAgICBdXG4gIH0sXG4gIHtcbiAgICBcImFscGhhXzJcIjogXCJPTVwiLFxuICAgIFwibG9jYWxlc1wiOiB7XG4gICAgICBcImVuXCI6IFwiT21hblwiLFxuICAgICAgXCJmclwiOiBcIk9tYW5cIixcbiAgICAgIFwiZGVcIjogXCJPbWFuXCIsXG4gICAgICBcImVzXCI6IFwiT23DoW5cIlxuICAgIH0sXG4gICAgXCJ0YWdzXCI6IFtcblxuICAgIF1cbiAgfSxcbiAge1xuICAgIFwiYWxwaGFfMlwiOiBcIlBLXCIsXG4gICAgXCJsb2NhbGVzXCI6IHtcbiAgICAgIFwiZW5cIjogXCJQYWtpc3RhblwiLFxuICAgICAgXCJmclwiOiBcIlBha2lzdGFuXCIsXG4gICAgICBcImRlXCI6IFwiUGFraXN0YW5cIixcbiAgICAgIFwiZXNcIjogXCJQYWtpc3TDoW5cIlxuICAgIH0sXG4gICAgXCJ0YWdzXCI6IFtcblxuICAgIF1cbiAgfSxcbiAge1xuICAgIFwiYWxwaGFfMlwiOiBcIlBXXCIsXG4gICAgXCJsb2NhbGVzXCI6IHtcbiAgICAgIFwiZW5cIjogXCJQYWxhdVwiLFxuICAgICAgXCJmclwiOiBcIlBhbGFvc1wiLFxuICAgICAgXCJkZVwiOiBcIlBhbGF1XCIsXG4gICAgICBcImVzXCI6IFwiUGFsYXVcIlxuICAgIH0sXG4gICAgXCJ0YWdzXCI6IFtcblxuICAgIF1cbiAgfSxcbiAge1xuICAgIFwiYWxwaGFfMlwiOiBcIlBTXCIsXG4gICAgXCJsb2NhbGVzXCI6IHtcbiAgICAgIFwiZW5cIjogXCJQYWxlc3RpbmUsIFN0YXRlIG9mXCIsXG4gICAgICBcImZyXCI6IFwiRXRhdCBkZSBQYWxlc3RpbmVcIixcbiAgICAgIFwiZGVcIjogXCJTdGFhdCBQYWzDpHN0aW5hXCIsXG4gICAgICBcImVzXCI6IFwiRXN0YWRvIGRlIFBhbGVzdGluYVwiXG4gICAgfSxcbiAgICBcInRhZ3NcIjogW1xuXG4gICAgXVxuICB9LFxuICB7XG4gICAgXCJhbHBoYV8yXCI6IFwiUEFcIixcbiAgICBcImxvY2FsZXNcIjoge1xuICAgICAgXCJlblwiOiBcIlBhbmFtYVwiLFxuICAgICAgXCJmclwiOiBcIlBhbmFtYVwiLFxuICAgICAgXCJkZVwiOiBcIlBhbmFtYVwiLFxuICAgICAgXCJlc1wiOiBcIlBhbmFtw6FcIlxuICAgIH0sXG4gICAgXCJ0YWdzXCI6IFtcblxuICAgIF1cbiAgfSxcbiAge1xuICAgIFwiYWxwaGFfMlwiOiBcIlBHXCIsXG4gICAgXCJsb2NhbGVzXCI6IHtcbiAgICAgIFwiZW5cIjogXCJQYXB1YSBOZXcgR3VpbmVhXCIsXG4gICAgICBcImZyXCI6IFwiUGFwb3Vhc2llLU5vdXZlbGxlIEd1aW7DqWVcIixcbiAgICAgIFwiZGVcIjogXCJQYXB1YS1OZXVndWluZWFcIixcbiAgICAgIFwiZXNcIjogXCJQYXDDumEgTnVldmEgR3VpbmVhXCJcbiAgICB9LFxuICAgIFwidGFnc1wiOiBbXG5cbiAgICBdXG4gIH0sXG4gIHtcbiAgICBcImFscGhhXzJcIjogXCJQWVwiLFxuICAgIFwibG9jYWxlc1wiOiB7XG4gICAgICBcImVuXCI6IFwiUGFyYWd1YXlcIixcbiAgICAgIFwiZnJcIjogXCJQYXJhZ3VheVwiLFxuICAgICAgXCJkZVwiOiBcIlBhcmFndWF5XCIsXG4gICAgICBcImVzXCI6IFwiUGFyYWd1YXlcIlxuICAgIH0sXG4gICAgXCJ0YWdzXCI6IFtcblxuICAgIF1cbiAgfSxcbiAge1xuICAgIFwiYWxwaGFfMlwiOiBcIlBFXCIsXG4gICAgXCJsb2NhbGVzXCI6IHtcbiAgICAgIFwiZW5cIjogXCJQZXJ1XCIsXG4gICAgICBcImZyXCI6IFwiUMOpcm91XCIsXG4gICAgICBcImRlXCI6IFwiUGVydVwiLFxuICAgICAgXCJlc1wiOiBcIlBlcsO6XCJcbiAgICB9LFxuICAgIFwidGFnc1wiOiBbXG5cbiAgICBdXG4gIH0sXG4gIHtcbiAgICBcImFscGhhXzJcIjogXCJQSFwiLFxuICAgIFwibG9jYWxlc1wiOiB7XG4gICAgICBcImVuXCI6IFwiUGhpbGlwcGluZXNcIixcbiAgICAgIFwiZnJcIjogXCJQaGlsaXBwaW5lc1wiLFxuICAgICAgXCJkZVwiOiBcIlBoaWxpcHBpbmVuXCIsXG4gICAgICBcImVzXCI6IFwiRmlsaXBpbmFzXCJcbiAgICB9LFxuICAgIFwidGFnc1wiOiBbXG5cbiAgICBdXG4gIH0sXG4gIHtcbiAgICBcImFscGhhXzJcIjogXCJQTlwiLFxuICAgIFwibG9jYWxlc1wiOiB7XG4gICAgICBcImVuXCI6IFwiUGl0Y2Fpcm5cIixcbiAgICAgIFwiZnJcIjogXCLDjmxlIFBpdGNhaXJuXCIsXG4gICAgICBcImRlXCI6IFwiUGl0Y2Fpcm5pbnNlbG5cIixcbiAgICAgIFwiZXNcIjogXCJJc2xhcyBQaXRjYWlyblwiXG4gICAgfSxcbiAgICBcInRhZ3NcIjogW1xuXG4gICAgXVxuICB9LFxuICB7XG4gICAgXCJhbHBoYV8yXCI6IFwiUExcIixcbiAgICBcImxvY2FsZXNcIjoge1xuICAgICAgXCJlblwiOiBcIlBvbGFuZFwiLFxuICAgICAgXCJmclwiOiBcIlBvbG9nbmVcIixcbiAgICAgIFwiZGVcIjogXCJQb2xlblwiLFxuICAgICAgXCJlc1wiOiBcIlBvbG9uaWFcIlxuICAgIH0sXG4gICAgXCJ0YWdzXCI6IFtcbiAgICAgIFwiZXVyb3BlYW5fdW5pb25cIlxuICAgIF1cbiAgfSxcbiAge1xuICAgIFwiYWxwaGFfMlwiOiBcIlBUXCIsXG4gICAgXCJsb2NhbGVzXCI6IHtcbiAgICAgIFwiZW5cIjogXCJQb3J0dWdhbFwiLFxuICAgICAgXCJmclwiOiBcIlBvcnR1Z2FsXCIsXG4gICAgICBcImRlXCI6IFwiUG9ydHVnYWxcIixcbiAgICAgIFwiZXNcIjogXCJQb3J0dWdhbFwiXG4gICAgfSxcbiAgICBcInRhZ3NcIjogW1xuICAgICAgXCJldXJvcGVhbl91bmlvblwiXG4gICAgXVxuICB9LFxuICB7XG4gICAgXCJhbHBoYV8yXCI6IFwiUFJcIixcbiAgICBcImxvY2FsZXNcIjoge1xuICAgICAgXCJlblwiOiBcIlB1ZXJ0byBSaWNvXCIsXG4gICAgICBcImZyXCI6IFwiUG9ydG8gUmljb1wiLFxuICAgICAgXCJkZVwiOiBcIlB1ZXJ0byBSaWNvXCIsXG4gICAgICBcImVzXCI6IFwiUHVlcnRvIFJpY29cIlxuICAgIH0sXG4gICAgXCJ0YWdzXCI6IFtcblxuICAgIF1cbiAgfSxcbiAge1xuICAgIFwiYWxwaGFfMlwiOiBcIlFBXCIsXG4gICAgXCJsb2NhbGVzXCI6IHtcbiAgICAgIFwiZW5cIjogXCJRYXRhclwiLFxuICAgICAgXCJmclwiOiBcIlFhdGFyXCIsXG4gICAgICBcImRlXCI6IFwiS2F0YXJcIixcbiAgICAgIFwiZXNcIjogXCJRYXRhclwiXG4gICAgfSxcbiAgICBcInRhZ3NcIjogW1xuXG4gICAgXVxuICB9LFxuICB7XG4gICAgXCJhbHBoYV8yXCI6IFwiUk9cIixcbiAgICBcImxvY2FsZXNcIjoge1xuICAgICAgXCJlblwiOiBcIlJvbWFuaWFcIixcbiAgICAgIFwiZnJcIjogXCJSb3VtYW5pZVwiLFxuICAgICAgXCJkZVwiOiBcIlJ1bcOkbmllblwiLFxuICAgICAgXCJlc1wiOiBcIlJ1bWFuaWFcIlxuICAgIH0sXG4gICAgXCJ0YWdzXCI6IFtcbiAgICAgIFwiZXVyb3BlYW5fdW5pb25cIlxuICAgIF1cbiAgfSxcbiAge1xuICAgIFwiYWxwaGFfMlwiOiBcIlJVXCIsXG4gICAgXCJsb2NhbGVzXCI6IHtcbiAgICAgIFwiZW5cIjogXCJSdXNzaWFuIEZlZGVyYXRpb25cIixcbiAgICAgIFwiZnJcIjogXCJSdXNzaWUgKEbDqWTDqXJhdGlvbiBkZSlcIixcbiAgICAgIFwiZGVcIjogXCJSdXNzaXNjaGUgRmVkZXJhdGlvblwiLFxuICAgICAgXCJlc1wiOiBcIkZlZGVyYWNpw7NuIFJ1c2FcIlxuICAgIH0sXG4gICAgXCJ0YWdzXCI6IFtcblxuICAgIF1cbiAgfSxcbiAge1xuICAgIFwiYWxwaGFfMlwiOiBcIlJXXCIsXG4gICAgXCJsb2NhbGVzXCI6IHtcbiAgICAgIFwiZW5cIjogXCJSd2FuZGFcIixcbiAgICAgIFwiZnJcIjogXCJSd2FuZGFcIixcbiAgICAgIFwiZGVcIjogXCJSdWFuZGFcIixcbiAgICAgIFwiZXNcIjogXCJSdWFuZGFcIlxuICAgIH0sXG4gICAgXCJ0YWdzXCI6IFtcblxuICAgIF1cbiAgfSxcbiAge1xuICAgIFwiYWxwaGFfMlwiOiBcIlJFXCIsXG4gICAgXCJsb2NhbGVzXCI6IHtcbiAgICAgIFwiZW5cIjogXCJSw6l1bmlvblwiLFxuICAgICAgXCJmclwiOiBcIkxhIFLDqXVuaW9uXCIsXG4gICAgICBcImRlXCI6IFwiUsOpdW5pb25cIixcbiAgICAgIFwiZXNcIjogXCJSZXVuacOzblwiXG4gICAgfSxcbiAgICBcInRhZ3NcIjogW1xuXG4gICAgXVxuICB9LFxuICB7XG4gICAgXCJhbHBoYV8yXCI6IFwiQkxcIixcbiAgICBcImxvY2FsZXNcIjoge1xuICAgICAgXCJlblwiOiBcIlNhaW50IEJhcnRow6lsZW15XCIsXG4gICAgICBcImZyXCI6IFwiU2FpbnQtQmFydGjDqWxlbXlcIixcbiAgICAgIFwiZGVcIjogXCJTYWludC1CYXJ0aMOpbGVteVwiLFxuICAgICAgXCJlc1wiOiBcIlNhbiBCYXJ0b2xvbcOpXCJcbiAgICB9LFxuICAgIFwidGFnc1wiOiBbXG5cbiAgICBdXG4gIH0sXG4gIHtcbiAgICBcImFscGhhXzJcIjogXCJTSFwiLFxuICAgIFwibG9jYWxlc1wiOiB7XG4gICAgICBcImVuXCI6IFwiU2FpbnQgSGVsZW5hXCIsXG4gICAgICBcImZyXCI6IFwiU2FpbnQtSMOpbMOobmVcIixcbiAgICAgIFwiZGVcIjogXCJTdC4gSGVsZW5hXCIsXG4gICAgICBcImVzXCI6IFwiU2FudGEgSGVsZW5hXCJcbiAgICB9LFxuICAgIFwidGFnc1wiOiBbXG5cbiAgICBdXG4gIH0sXG4gIHtcbiAgICBcImFscGhhXzJcIjogXCJLTlwiLFxuICAgIFwibG9jYWxlc1wiOiB7XG4gICAgICBcImVuXCI6IFwiU2FpbnQgS2l0dHMgYW5kIE5ldmlzXCIsXG4gICAgICBcImZyXCI6IFwiU2FpbnQtQ2hyaXN0b3BoZS1ldC1OacOpdsOoc1wiLFxuICAgICAgXCJkZVwiOiBcIlN0LiBLaXR0cyB1bmQgTmV2aXNcIixcbiAgICAgIFwiZXNcIjogXCJTYW4gQ3Jpc3TDs2JhbCB5IE5pZXZlc1wiXG4gICAgfSxcbiAgICBcInRhZ3NcIjogW1xuXG4gICAgXVxuICB9LFxuICB7XG4gICAgXCJhbHBoYV8yXCI6IFwiTENcIixcbiAgICBcImxvY2FsZXNcIjoge1xuICAgICAgXCJlblwiOiBcIlNhaW50IEx1Y2lhXCIsXG4gICAgICBcImZyXCI6IFwiU2FpbnRlLUx1Y2llXCIsXG4gICAgICBcImRlXCI6IFwiU3QuIEx1Y2lhXCIsXG4gICAgICBcImVzXCI6IFwiU2FudGEgTHVjw61hXCJcbiAgICB9LFxuICAgIFwidGFnc1wiOiBbXG5cbiAgICBdXG4gIH0sXG4gIHtcbiAgICBcImFscGhhXzJcIjogXCJQTVwiLFxuICAgIFwibG9jYWxlc1wiOiB7XG4gICAgICBcImVuXCI6IFwiU2FpbnQgUGllcnJlIGFuZCBNaXF1ZWxvblwiLFxuICAgICAgXCJmclwiOiBcIlNhaW50LVBpZXJyZS1ldC1NaXF1ZWxvblwiLFxuICAgICAgXCJkZVwiOiBcIlNhaW50IFBpZXJyZSB1bmQgTWlxdWVsb25cIixcbiAgICAgIFwiZXNcIjogXCJTYW4gUGVkcm8geSBNaXF1ZWzDs25cIlxuICAgIH0sXG4gICAgXCJ0YWdzXCI6IFtcblxuICAgIF1cbiAgfSxcbiAge1xuICAgIFwiYWxwaGFfMlwiOiBcIlZDXCIsXG4gICAgXCJsb2NhbGVzXCI6IHtcbiAgICAgIFwiZW5cIjogXCJTYWludCBWaW5jZW50IGFuZCB0aGUgR3JlbmFkaW5lc1wiLFxuICAgICAgXCJmclwiOiBcIlNhaW50LVZpbmNlbnQtZXQtbGVzLUdyZW5hZGluZXNcIixcbiAgICAgIFwiZGVcIjogXCJTdC4gVmluY2VudCB1bmQgZGllIEdyZW5hZGluZW5cIixcbiAgICAgIFwiZXNcIjogXCJTYW4gVmljZW50ZSB5IGxhcyBHcmFuYWRpbmFzXCJcbiAgICB9LFxuICAgIFwidGFnc1wiOiBbXG5cbiAgICBdXG4gIH0sXG4gIHtcbiAgICBcImFscGhhXzJcIjogXCJXU1wiLFxuICAgIFwibG9jYWxlc1wiOiB7XG4gICAgICBcImVuXCI6IFwiU2Ftb2FcIixcbiAgICAgIFwiZnJcIjogXCJTYW1vYVwiLFxuICAgICAgXCJkZVwiOiBcIlNhbW9hXCIsXG4gICAgICBcImVzXCI6IFwiU2Ftb2FcIlxuICAgIH0sXG4gICAgXCJ0YWdzXCI6IFtcblxuICAgIF1cbiAgfSxcbiAge1xuICAgIFwiYWxwaGFfMlwiOiBcIlNNXCIsXG4gICAgXCJsb2NhbGVzXCI6IHtcbiAgICAgIFwiZW5cIjogXCJTYW4gTWFyaW5vXCIsXG4gICAgICBcImZyXCI6IFwiU2FpbnQtTWFyaW5cIixcbiAgICAgIFwiZGVcIjogXCJTYW4gTWFyaW5vXCIsXG4gICAgICBcImVzXCI6IFwiU2FuIE1hcmlub1wiXG4gICAgfSxcbiAgICBcInRhZ3NcIjogW1xuXG4gICAgXVxuICB9LFxuICB7XG4gICAgXCJhbHBoYV8yXCI6IFwiU1RcIixcbiAgICBcImxvY2FsZXNcIjoge1xuICAgICAgXCJlblwiOiBcIlNhbyBUb21lIGFuZCBQcmluY2lwZVwiLFxuICAgICAgXCJmclwiOiBcIlNhbyBUb23DqS1ldC1QcmluY2lwZVwiLFxuICAgICAgXCJkZVwiOiBcIlNhbyBUb21lIHVuZCBQcmluY2lwZVwiLFxuICAgICAgXCJlc1wiOiBcIlNhbnRvIFRvbcOpIHkgUHLDrW5jaXBlXCJcbiAgICB9LFxuICAgIFwidGFnc1wiOiBbXG5cbiAgICBdXG4gIH0sXG4gIHtcbiAgICBcImFscGhhXzJcIjogXCJTQVwiLFxuICAgIFwibG9jYWxlc1wiOiB7XG4gICAgICBcImVuXCI6IFwiU2F1ZGkgQXJhYmlhXCIsXG4gICAgICBcImZyXCI6IFwiQXJhYmllIFNhb3VkaXRlXCIsXG4gICAgICBcImRlXCI6IFwiU2F1ZGkgQXJhYmllblwiLFxuICAgICAgXCJlc1wiOiBcIkFyYWJpYSBTYXVkaXRhXCJcbiAgICB9LFxuICAgIFwidGFnc1wiOiBbXG5cbiAgICBdXG4gIH0sXG4gIHtcbiAgICBcImFscGhhXzJcIjogXCJTTlwiLFxuICAgIFwibG9jYWxlc1wiOiB7XG4gICAgICBcImVuXCI6IFwiU2VuZWdhbFwiLFxuICAgICAgXCJmclwiOiBcIlPDqW7DqWdhbFwiLFxuICAgICAgXCJkZVwiOiBcIlNlbmVnYWxcIixcbiAgICAgIFwiZXNcIjogXCJTZW5lZ2FsXCJcbiAgICB9LFxuICAgIFwidGFnc1wiOiBbXG5cbiAgICBdXG4gIH0sXG4gIHtcbiAgICBcImFscGhhXzJcIjogXCJSU1wiLFxuICAgIFwibG9jYWxlc1wiOiB7XG4gICAgICBcImVuXCI6IFwiU2VyYmlhXCIsXG4gICAgICBcImZyXCI6IFwiU2VyYmllXCIsXG4gICAgICBcImRlXCI6IFwiU2VyYmllblwiLFxuICAgICAgXCJlc1wiOiBcIlNlcmJpYVwiXG4gICAgfSxcbiAgICBcInRhZ3NcIjogW1xuXG4gICAgXVxuICB9LFxuICB7XG4gICAgXCJhbHBoYV8yXCI6IFwiU0NcIixcbiAgICBcImxvY2FsZXNcIjoge1xuICAgICAgXCJlblwiOiBcIlNleWNoZWxsZXNcIixcbiAgICAgIFwiZnJcIjogXCJTZXljaGVsbGVzXCIsXG4gICAgICBcImRlXCI6IFwiU2V5Y2hlbGxlblwiLFxuICAgICAgXCJlc1wiOiBcIlNleWNoZWxsZXNcIlxuICAgIH0sXG4gICAgXCJ0YWdzXCI6IFtcblxuICAgIF1cbiAgfSxcbiAge1xuICAgIFwiYWxwaGFfMlwiOiBcIlNMXCIsXG4gICAgXCJsb2NhbGVzXCI6IHtcbiAgICAgIFwiZW5cIjogXCJTaWVycmEgTGVvbmVcIixcbiAgICAgIFwiZnJcIjogXCJTaWVycmEgTGVvbmVcIixcbiAgICAgIFwiZGVcIjogXCJTaWVycmEgTGVvbmVcIixcbiAgICAgIFwiZXNcIjogXCJTaWVycmEgTGVvbmFcIlxuICAgIH0sXG4gICAgXCJ0YWdzXCI6IFtcblxuICAgIF1cbiAgfSxcbiAge1xuICAgIFwiYWxwaGFfMlwiOiBcIlNHXCIsXG4gICAgXCJsb2NhbGVzXCI6IHtcbiAgICAgIFwiZW5cIjogXCJTaW5nYXBvcmVcIixcbiAgICAgIFwiZnJcIjogXCJTaW5nYXBvdXJcIixcbiAgICAgIFwiZGVcIjogXCJTaW5nYXB1clwiLFxuICAgICAgXCJlc1wiOiBcIlNpbmdhcHVyXCJcbiAgICB9LFxuICAgIFwidGFnc1wiOiBbXG5cbiAgICBdXG4gIH0sXG4gIHtcbiAgICBcImFscGhhXzJcIjogXCJTWFwiLFxuICAgIFwibG9jYWxlc1wiOiB7XG4gICAgICBcImVuXCI6IFwiU2ludCBNYWFydGVuXCIsXG4gICAgICBcImZyXCI6IFwiU2ludCBNYWFydGVuXCIsXG4gICAgICBcImRlXCI6IFwiU2ludCBNYWFydGVuXCIsXG4gICAgICBcImVzXCI6IFwiU2ludCBNYWFydGVuXCJcbiAgICB9LFxuICAgIFwidGFnc1wiOiBbXG5cbiAgICBdXG4gIH0sXG4gIHtcbiAgICBcImFscGhhXzJcIjogXCJTS1wiLFxuICAgIFwibG9jYWxlc1wiOiB7XG4gICAgICBcImVuXCI6IFwiU2xvdmFraWFcIixcbiAgICAgIFwiZnJcIjogXCJTbG92YXF1ZVwiLFxuICAgICAgXCJkZVwiOiBcIlNsb3dha2VpXCIsXG4gICAgICBcImVzXCI6IFwiRXNsb3ZhcXVpYVwiXG4gICAgfSxcbiAgICBcInRhZ3NcIjogW1xuICAgICAgXCJldXJvcGVhbl91bmlvblwiXG4gICAgXVxuICB9LFxuICB7XG4gICAgXCJhbHBoYV8yXCI6IFwiU0lcIixcbiAgICBcImxvY2FsZXNcIjoge1xuICAgICAgXCJlblwiOiBcIlNsb3ZlbmlhXCIsXG4gICAgICBcImZyXCI6IFwiU2xvdsOpbmllXCIsXG4gICAgICBcImRlXCI6IFwiU2xvd2VuaWVuXCIsXG4gICAgICBcImVzXCI6IFwiRXNsb3ZlbmlhXCJcbiAgICB9LFxuICAgIFwidGFnc1wiOiBbXG4gICAgICBcImV1cm9wZWFuX3VuaW9uXCJcbiAgICBdXG4gIH0sXG4gIHtcbiAgICBcImFscGhhXzJcIjogXCJTQlwiLFxuICAgIFwibG9jYWxlc1wiOiB7XG4gICAgICBcImVuXCI6IFwiU29sb21vbiBJc2xhbmRzXCIsXG4gICAgICBcImZyXCI6IFwiw45sZXMgU2Fsb21vblwiLFxuICAgICAgXCJkZVwiOiBcIlNhbG9tb25pbnNlbG5cIixcbiAgICAgIFwiZXNcIjogXCJJc2xhcyBTYWxvbcOzblwiXG4gICAgfSxcbiAgICBcInRhZ3NcIjogW1xuXG4gICAgXVxuICB9LFxuICB7XG4gICAgXCJhbHBoYV8yXCI6IFwiU09cIixcbiAgICBcImxvY2FsZXNcIjoge1xuICAgICAgXCJlblwiOiBcIlNvbWFsaWFcIixcbiAgICAgIFwiZnJcIjogXCJTb21hbGllXCIsXG4gICAgICBcImRlXCI6IFwiU29tYWxpYVwiLFxuICAgICAgXCJlc1wiOiBcIlNvbWFsaWFcIlxuICAgIH0sXG4gICAgXCJ0YWdzXCI6IFtcblxuICAgIF1cbiAgfSxcbiAge1xuICAgIFwiYWxwaGFfMlwiOiBcIlpBXCIsXG4gICAgXCJsb2NhbGVzXCI6IHtcbiAgICAgIFwiZW5cIjogXCJTb3V0aCBBZnJpY2FcIixcbiAgICAgIFwiZnJcIjogXCJBZnJpcXVlIGR1IFN1ZFwiLFxuICAgICAgXCJkZVwiOiBcIlPDvGRhZnJpa2FcIixcbiAgICAgIFwiZXNcIjogXCJTdWTDoWZyaWNhXCJcbiAgICB9LFxuICAgIFwidGFnc1wiOiBbXG5cbiAgICBdXG4gIH0sXG4gIHtcbiAgICBcImFscGhhXzJcIjogXCJHU1wiLFxuICAgIFwibG9jYWxlc1wiOiB7XG4gICAgICBcImVuXCI6IFwiU291dGggR2VvcmdpYSBhbmQgdGhlIFNvdXRoIFNhbmR3aWNoIElzbGFuZHNcIixcbiAgICAgIFwiZnJcIjogXCJHw6lvcmdpZSBkdSBTdWQtZXQtbGVzIMOObGVzIFNhbmR3aWNoIGR1IFN1ZFwiLFxuICAgICAgXCJkZVwiOiBcIlPDvGQtR2VvcmdpZW4gdW5kIHPDvGRsaWNoZSBTYW5kd2ljaGluc2VsblwiLFxuICAgICAgXCJlc1wiOiBcIklzbGFzIEdlb3JnaWEgZGVsIFN1ciB5IFNhbmR3aWNoIGRlbCBTdXJcIlxuICAgIH0sXG4gICAgXCJ0YWdzXCI6IFtcblxuICAgIF1cbiAgfSxcbiAge1xuICAgIFwiYWxwaGFfMlwiOiBcIkVTXCIsXG4gICAgXCJsb2NhbGVzXCI6IHtcbiAgICAgIFwiZW5cIjogXCJTcGFpblwiLFxuICAgICAgXCJmclwiOiBcIkVzcGFnbmVcIixcbiAgICAgIFwiZGVcIjogXCJTcGFuaWVuXCIsXG4gICAgICBcImVzXCI6IFwiRXNwYcOxYVwiXG4gICAgfSxcbiAgICBcInRhZ3NcIjogW1xuICAgICAgXCJldXJvcGVhbl91bmlvblwiXG4gICAgXVxuICB9LFxuICB7XG4gICAgXCJhbHBoYV8yXCI6IFwiTEtcIixcbiAgICBcImxvY2FsZXNcIjoge1xuICAgICAgXCJlblwiOiBcIlNyaSBMYW5rYVwiLFxuICAgICAgXCJmclwiOiBcIlNyaSBMYW5rYVwiLFxuICAgICAgXCJkZVwiOiBcIlNyaSBMYW5rYVwiLFxuICAgICAgXCJlc1wiOiBcIlNyaSBMYW5rYVwiXG4gICAgfSxcbiAgICBcInRhZ3NcIjogW1xuXG4gICAgXVxuICB9LFxuICB7XG4gICAgXCJhbHBoYV8yXCI6IFwiU1JcIixcbiAgICBcImxvY2FsZXNcIjoge1xuICAgICAgXCJlblwiOiBcIlN1cmluYW1lXCIsXG4gICAgICBcImZyXCI6IFwiU3VyaW5hbVwiLFxuICAgICAgXCJkZVwiOiBcIlN1cmluYW1lXCIsXG4gICAgICBcImVzXCI6IFwiU3VyaW5hbVwiXG4gICAgfSxcbiAgICBcInRhZ3NcIjogW1xuXG4gICAgXVxuICB9LFxuICB7XG4gICAgXCJhbHBoYV8yXCI6IFwiU0pcIixcbiAgICBcImxvY2FsZXNcIjoge1xuICAgICAgXCJlblwiOiBcIlN2YWxiYXJkIGFuZCBKYW4gTWF5ZW5cIixcbiAgICAgIFwiZnJcIjogXCJTdmFsYmFyZCBldCDDrmxlIEphbiBNYXllblwiLFxuICAgICAgXCJkZVwiOiBcIlN2YWxiYXJkIHVuZCBKYW4gTWF5ZW4gSW5zZWxcIixcbiAgICAgIFwiZXNcIjogXCJTdmFsYmFyZCB5IEphbiBNYXllblwiXG4gICAgfSxcbiAgICBcInRhZ3NcIjogW1xuXG4gICAgXVxuICB9LFxuICB7XG4gICAgXCJhbHBoYV8yXCI6IFwiU1pcIixcbiAgICBcImxvY2FsZXNcIjoge1xuICAgICAgXCJlblwiOiBcIlN3YXppbGFuZFwiLFxuICAgICAgXCJmclwiOiBcIlN3YXppbGFuZFwiLFxuICAgICAgXCJkZVwiOiBcIlN3YXppbGFuZFwiLFxuICAgICAgXCJlc1wiOiBcIlN3YXppbGFuZGlhXCJcbiAgICB9LFxuICAgIFwidGFnc1wiOiBbXG5cbiAgICBdXG4gIH0sXG4gIHtcbiAgICBcImFscGhhXzJcIjogXCJTRVwiLFxuICAgIFwibG9jYWxlc1wiOiB7XG4gICAgICBcImVuXCI6IFwiU3dlZGVuXCIsXG4gICAgICBcImZyXCI6IFwiU3XDqGRlXCIsXG4gICAgICBcImRlXCI6IFwiU2Nod2VkZW5cIixcbiAgICAgIFwiZXNcIjogXCJTdWVjaWFcIlxuICAgIH0sXG4gICAgXCJ0YWdzXCI6IFtcbiAgICAgIFwiZXVyb3BlYW5fdW5pb25cIlxuICAgIF1cbiAgfSxcbiAge1xuICAgIFwiYWxwaGFfMlwiOiBcIkNIXCIsXG4gICAgXCJsb2NhbGVzXCI6IHtcbiAgICAgIFwiZW5cIjogXCJTd2l0emVybGFuZFwiLFxuICAgICAgXCJmclwiOiBcIlN1aXNzZVwiLFxuICAgICAgXCJkZVwiOiBcIlNjaHdlaXpcIixcbiAgICAgIFwiZXNcIjogXCJTdWl6YVwiXG4gICAgfSxcbiAgICBcInRhZ3NcIjogW1xuXG4gICAgXVxuICB9LFxuICB7XG4gICAgXCJhbHBoYV8yXCI6IFwiVFdcIixcbiAgICBcImxvY2FsZXNcIjoge1xuICAgICAgXCJlblwiOiBcIlRhaXdhblwiLFxuICAgICAgXCJmclwiOiBcIlRhw693YW5cIixcbiAgICAgIFwiZGVcIjogXCJUYWl3YW5cIixcbiAgICAgIFwiZXNcIjogXCJUYWl3w6FuXCJcbiAgICB9LFxuICAgIFwidGFnc1wiOiBbXG5cbiAgICBdXG4gIH0sXG4gIHtcbiAgICBcImFscGhhXzJcIjogXCJUSlwiLFxuICAgIFwibG9jYWxlc1wiOiB7XG4gICAgICBcImVuXCI6IFwiVGFqaWtpc3RhblwiLFxuICAgICAgXCJmclwiOiBcIlRhZGppa2lzdGFuXCIsXG4gICAgICBcImRlXCI6IFwiVGFkc2hpa2lzdGFuXCIsXG4gICAgICBcImVzXCI6IFwiVGF5aWtpc3TDoW5cIlxuICAgIH0sXG4gICAgXCJ0YWdzXCI6IFtcblxuICAgIF1cbiAgfSxcbiAge1xuICAgIFwiYWxwaGFfMlwiOiBcIlRaXCIsXG4gICAgXCJsb2NhbGVzXCI6IHtcbiAgICAgIFwiZW5cIjogXCJUYW56YW5pYSwgVW5pdGVkIFJlcHVibGljIG9mXCIsXG4gICAgICBcImZyXCI6IFwiVGFuemFuaWUgKFLDqXB1YmxpcXVlIHVuaWUgZGUpXCIsXG4gICAgICBcImRlXCI6IFwiVGFuc2FuaWFcIixcbiAgICAgIFwiZXNcIjogXCJSZXDDumJsaWNhIFVuaWRhIGRlIFRhbnphbmlhXCJcbiAgICB9LFxuICAgIFwidGFnc1wiOiBbXG5cbiAgICBdXG4gIH0sXG4gIHtcbiAgICBcImFscGhhXzJcIjogXCJUSFwiLFxuICAgIFwibG9jYWxlc1wiOiB7XG4gICAgICBcImVuXCI6IFwiVGhhaWxhbmRcIixcbiAgICAgIFwiZnJcIjogXCJUaGHDr2xhbmRlXCIsXG4gICAgICBcImRlXCI6IFwiVGhhaWxhbmRcIixcbiAgICAgIFwiZXNcIjogXCJUYWlsYW5kaWFcIlxuICAgIH0sXG4gICAgXCJ0YWdzXCI6IFtcblxuICAgIF1cbiAgfSxcbiAge1xuICAgIFwiYWxwaGFfMlwiOiBcIk5MXCIsXG4gICAgXCJsb2NhbGVzXCI6IHtcbiAgICAgIFwiZW5cIjogXCJUaGUgTmV0aGVybGFuZHNcIixcbiAgICAgIFwiZnJcIjogXCJQYXlzLUJhc1wiLFxuICAgICAgXCJkZVwiOiBcIk5pZWRlcmxhbmRlXCIsXG4gICAgICBcImVzXCI6IFwiUGHDrXNlcyBCYWpvc1wiXG4gICAgfSxcbiAgICBcInRhZ3NcIjogW1xuICAgICAgXCJldXJvcGVhbl91bmlvblwiXG4gICAgXVxuICB9LFxuICB7XG4gICAgXCJhbHBoYV8yXCI6IFwiVExcIixcbiAgICBcImxvY2FsZXNcIjoge1xuICAgICAgXCJlblwiOiBcIlRpbW9yLUxlc3RlXCIsXG4gICAgICBcImZyXCI6IFwiVGltb3ItT3JpZW50YWxcIixcbiAgICAgIFwiZGVcIjogXCJUaW1vci1MZXN0ZVwiLFxuICAgICAgXCJlc1wiOiBcIlRpbW9yIE9yaWVudGFsXCJcbiAgICB9LFxuICAgIFwidGFnc1wiOiBbXG5cbiAgICBdXG4gIH0sXG4gIHtcbiAgICBcImFscGhhXzJcIjogXCJUR1wiLFxuICAgIFwibG9jYWxlc1wiOiB7XG4gICAgICBcImVuXCI6IFwiVG9nb1wiLFxuICAgICAgXCJmclwiOiBcIlRvZ29cIixcbiAgICAgIFwiZGVcIjogXCJUb2dvXCIsXG4gICAgICBcImVzXCI6IFwiVG9nb1wiXG4gICAgfSxcbiAgICBcInRhZ3NcIjogW1xuXG4gICAgXVxuICB9LFxuICB7XG4gICAgXCJhbHBoYV8yXCI6IFwiVEtcIixcbiAgICBcImxvY2FsZXNcIjoge1xuICAgICAgXCJlblwiOiBcIlRva2VsYXVcIixcbiAgICAgIFwiZnJcIjogXCJUb2tlbGF1XCIsXG4gICAgICBcImRlXCI6IFwiVG9rZWxhdVwiLFxuICAgICAgXCJlc1wiOiBcIlRva2VsYXVcIlxuICAgIH0sXG4gICAgXCJ0YWdzXCI6IFtcblxuICAgIF1cbiAgfSxcbiAge1xuICAgIFwiYWxwaGFfMlwiOiBcIlRPXCIsXG4gICAgXCJsb2NhbGVzXCI6IHtcbiAgICAgIFwiZW5cIjogXCJUb25nYVwiLFxuICAgICAgXCJmclwiOiBcIlRvbmdhXCIsXG4gICAgICBcImRlXCI6IFwiVG9uZ2FcIixcbiAgICAgIFwiZXNcIjogXCJUb25nYVwiXG4gICAgfSxcbiAgICBcInRhZ3NcIjogW1xuXG4gICAgXVxuICB9LFxuICB7XG4gICAgXCJhbHBoYV8yXCI6IFwiVFRcIixcbiAgICBcImxvY2FsZXNcIjoge1xuICAgICAgXCJlblwiOiBcIlRyaW5pZGFkIGFuZCBUb2JhZ29cIixcbiAgICAgIFwiZnJcIjogXCJUcmluaWRhZC1ldC1Ub2JhZ29cIixcbiAgICAgIFwiZGVcIjogXCJUcmluaWRhZCB1bmQgVG9iYWdvXCIsXG4gICAgICBcImVzXCI6IFwiVHJpbmlkYWQgeSBUb2JhZ29cIlxuICAgIH0sXG4gICAgXCJ0YWdzXCI6IFtcblxuICAgIF1cbiAgfSxcbiAge1xuICAgIFwiYWxwaGFfMlwiOiBcIlROXCIsXG4gICAgXCJsb2NhbGVzXCI6IHtcbiAgICAgIFwiZW5cIjogXCJUdW5pc2lhXCIsXG4gICAgICBcImZyXCI6IFwiVHVuaXNpZVwiLFxuICAgICAgXCJkZVwiOiBcIlR1bmVzaWVuXCIsXG4gICAgICBcImVzXCI6IFwiVMO6bmV6XCJcbiAgICB9LFxuICAgIFwidGFnc1wiOiBbXG5cbiAgICBdXG4gIH0sXG4gIHtcbiAgICBcImFscGhhXzJcIjogXCJUUlwiLFxuICAgIFwibG9jYWxlc1wiOiB7XG4gICAgICBcImVuXCI6IFwiVHVya2V5XCIsXG4gICAgICBcImZyXCI6IFwiVHVycXVpZVwiLFxuICAgICAgXCJkZVwiOiBcIlTDvHJrZWlcIixcbiAgICAgIFwiZXNcIjogXCJUdXJxdcOtYVwiXG4gICAgfSxcbiAgICBcInRhZ3NcIjogW1xuXG4gICAgXVxuICB9LFxuICB7XG4gICAgXCJhbHBoYV8yXCI6IFwiVE1cIixcbiAgICBcImxvY2FsZXNcIjoge1xuICAgICAgXCJlblwiOiBcIlR1cmttZW5pc3RhblwiLFxuICAgICAgXCJmclwiOiBcIlR1cmttw6luaXN0YW5cIixcbiAgICAgIFwiZGVcIjogXCJUdXJrbWVuaXN0YW5cIixcbiAgICAgIFwiZXNcIjogXCJUdXJrbWVuaXN0w6FuXCJcbiAgICB9LFxuICAgIFwidGFnc1wiOiBbXG5cbiAgICBdXG4gIH0sXG4gIHtcbiAgICBcImFscGhhXzJcIjogXCJUQ1wiLFxuICAgIFwibG9jYWxlc1wiOiB7XG4gICAgICBcImVuXCI6IFwiVHVya3MgYW5kIENhaWNvcyBJc2xhbmRzXCIsXG4gICAgICBcImZyXCI6IFwiw45sZXMgVHVycXVlcy1ldC1DYcOvcXVlc1wiLFxuICAgICAgXCJkZVwiOiBcIlR1cmtzLSB1bmQgQ2FpY29zaW5zZWxuXCIsXG4gICAgICBcImVzXCI6IFwiSXNsYXMgVHVyY29zIHkgQ2FpY29zXCJcbiAgICB9LFxuICAgIFwidGFnc1wiOiBbXG5cbiAgICBdXG4gIH0sXG4gIHtcbiAgICBcImFscGhhXzJcIjogXCJUVlwiLFxuICAgIFwibG9jYWxlc1wiOiB7XG4gICAgICBcImVuXCI6IFwiVHV2YWx1XCIsXG4gICAgICBcImZyXCI6IFwiVHV2YWx1XCIsXG4gICAgICBcImRlXCI6IFwiVHV2YWx1XCIsXG4gICAgICBcImVzXCI6IFwiVHV2YWx1XCJcbiAgICB9LFxuICAgIFwidGFnc1wiOiBbXG5cbiAgICBdXG4gIH0sXG4gIHtcbiAgICBcImFscGhhXzJcIjogXCJVR1wiLFxuICAgIFwibG9jYWxlc1wiOiB7XG4gICAgICBcImVuXCI6IFwiVWdhbmRhXCIsXG4gICAgICBcImZyXCI6IFwiT3VnYW5kYVwiLFxuICAgICAgXCJkZVwiOiBcIlVnYW5kYVwiLFxuICAgICAgXCJlc1wiOiBcIlVnYW5kYVwiXG4gICAgfSxcbiAgICBcInRhZ3NcIjogW1xuXG4gICAgXVxuICB9LFxuICB7XG4gICAgXCJhbHBoYV8yXCI6IFwiVUFcIixcbiAgICBcImxvY2FsZXNcIjoge1xuICAgICAgXCJlblwiOiBcIlVrcmFpbmVcIixcbiAgICAgIFwiZnJcIjogXCJVa3JhaW5lXCIsXG4gICAgICBcImRlXCI6IFwiVWtyYWluZVwiLFxuICAgICAgXCJlc1wiOiBcIlVjcmFuaWFcIlxuICAgIH0sXG4gICAgXCJ0YWdzXCI6IFtcblxuICAgIF1cbiAgfSxcbiAge1xuICAgIFwiYWxwaGFfMlwiOiBcIkFFXCIsXG4gICAgXCJsb2NhbGVzXCI6IHtcbiAgICAgIFwiZW5cIjogXCJVbml0ZWQgQXJhYiBFbWlyYXRlc1wiLFxuICAgICAgXCJmclwiOiBcIkVtaXJhdHMgQXJhYmVzIFVuaXNcIixcbiAgICAgIFwiZGVcIjogXCJWZXJlaW50ZSBBcmFiaXNjaGUgRW1pcmF0ZVwiLFxuICAgICAgXCJlc1wiOiBcIkVtaXJhdG9zIMOBcmFiZXMgVW5pZG9zXCJcbiAgICB9LFxuICAgIFwidGFnc1wiOiBbXG5cbiAgICBdXG4gIH0sXG4gIHtcbiAgICBcImFscGhhXzJcIjogXCJVTVwiLFxuICAgIFwibG9jYWxlc1wiOiB7XG4gICAgICBcImVuXCI6IFwiVW5pdGVkIFN0YXRlcyBNaW5vciBPdXRseWluZyBJc2xhbmRzXCIsXG4gICAgICBcImZyXCI6IFwiw45sZXMgbWluZXVyZXMgw6lsb2lnbsOpZXMgZGVzIEV0YXRzLVVuaXNcIixcbiAgICAgIFwiZGVcIjogXCJBbWVyaWthbmlzY2gtT3plYW5pZW5cIixcbiAgICAgIFwiZXNcIjogXCJJc2xhcyBVbHRyYW1hcmluYXMgTWVub3JlcyBkZSBFc3RhZG9zIFVuaWRvc1wiXG4gICAgfSxcbiAgICBcInRhZ3NcIjogW1xuXG4gICAgXVxuICB9LFxuICB7XG4gICAgXCJhbHBoYV8yXCI6IFwiVVlcIixcbiAgICBcImxvY2FsZXNcIjoge1xuICAgICAgXCJlblwiOiBcIlVydWd1YXlcIixcbiAgICAgIFwiZnJcIjogXCJVcnVndWF5XCIsXG4gICAgICBcImRlXCI6IFwiVXJ1Z3VheVwiLFxuICAgICAgXCJlc1wiOiBcIlVydWd1YXlcIlxuICAgIH0sXG4gICAgXCJ0YWdzXCI6IFtcblxuICAgIF1cbiAgfSxcbiAge1xuICAgIFwiYWxwaGFfMlwiOiBcIlVaXCIsXG4gICAgXCJsb2NhbGVzXCI6IHtcbiAgICAgIFwiZW5cIjogXCJVemJla2lzdGFuXCIsXG4gICAgICBcImZyXCI6IFwiT3V6YsOpa2lzdGFuXCIsXG4gICAgICBcImRlXCI6IFwiVXNiZWtpc3RhblwiLFxuICAgICAgXCJlc1wiOiBcIlV6YmVraXN0w6FuXCJcbiAgICB9LFxuICAgIFwidGFnc1wiOiBbXG5cbiAgICBdXG4gIH0sXG4gIHtcbiAgICBcImFscGhhXzJcIjogXCJWVVwiLFxuICAgIFwibG9jYWxlc1wiOiB7XG4gICAgICBcImVuXCI6IFwiVmFudWF0dVwiLFxuICAgICAgXCJmclwiOiBcIlZhbnVhdHVcIixcbiAgICAgIFwiZGVcIjogXCJWYW51YXR1XCIsXG4gICAgICBcImVzXCI6IFwiVmFudWF0dVwiXG4gICAgfSxcbiAgICBcInRhZ3NcIjogW1xuXG4gICAgXVxuICB9LFxuICB7XG4gICAgXCJhbHBoYV8yXCI6IFwiVkVcIixcbiAgICBcImxvY2FsZXNcIjoge1xuICAgICAgXCJlblwiOiBcIlZlbmV6dWVsYVwiLFxuICAgICAgXCJmclwiOiBcIlbDqW7DqXp1ZWxhXCIsXG4gICAgICBcImRlXCI6IFwiVmVuZXp1ZWxhXCIsXG4gICAgICBcImVzXCI6IFwiVmVuZXp1ZWxhXCJcbiAgICB9LFxuICAgIFwidGFnc1wiOiBbXG5cbiAgICBdXG4gIH0sXG4gIHtcbiAgICBcImFscGhhXzJcIjogXCJWTlwiLFxuICAgIFwibG9jYWxlc1wiOiB7XG4gICAgICBcImVuXCI6IFwiVmlldG5hbVwiLFxuICAgICAgXCJmclwiOiBcIlZpw6p0bmFtXCIsXG4gICAgICBcImRlXCI6IFwiVmlldG5hbVwiLFxuICAgICAgXCJlc1wiOiBcIlZpZXRuYW1cIlxuICAgIH0sXG4gICAgXCJ0YWdzXCI6IFtcblxuICAgIF1cbiAgfSxcbiAge1xuICAgIFwiYWxwaGFfMlwiOiBcIlZHXCIsXG4gICAgXCJsb2NhbGVzXCI6IHtcbiAgICAgIFwiZW5cIjogXCJWaXJnaW4gSXNsYW5kcywgQnJpdGlzaFwiLFxuICAgICAgXCJmclwiOiBcIsOObGVzIFZpZXJnZXMgYnJpdGFubmlxdWVzXCIsXG4gICAgICBcImRlXCI6IFwiQnJpdGlzY2hlIEp1bmdmZXJuaW5zZWxuXCIsXG4gICAgICBcImVzXCI6IFwiSXNsYXMgVsOtcmdlbmVzIEJyaXTDoW5pY2FzXCJcbiAgICB9LFxuICAgIFwidGFnc1wiOiBbXG5cbiAgICBdXG4gIH0sXG4gIHtcbiAgICBcImFscGhhXzJcIjogXCJWSVwiLFxuICAgIFwibG9jYWxlc1wiOiB7XG4gICAgICBcImVuXCI6IFwiVmlyZ2luIElzbGFuZHMsIFUuUy5cIixcbiAgICAgIFwiZnJcIjogXCLDjmxlcyBWaWVyZ2VzIGFtw6lyaWNhaW5lc1wiLFxuICAgICAgXCJkZVwiOiBcIlVTLUp1bmdmZXJuaW5zZWxuXCIsXG4gICAgICBcImVzXCI6IFwiSXNsYXMgVsOtcmdlbmVzIGRlIGxvcyBFRS5VVS5cIlxuICAgIH0sXG4gICAgXCJ0YWdzXCI6IFtcblxuICAgIF1cbiAgfSxcbiAge1xuICAgIFwiYWxwaGFfMlwiOiBcIldGXCIsXG4gICAgXCJsb2NhbGVzXCI6IHtcbiAgICAgIFwiZW5cIjogXCJXYWxsaXMgYW5kIEZ1dHVuYVwiLFxuICAgICAgXCJmclwiOiBcIldhbGxpcy1ldC1GdXR1bmFcIixcbiAgICAgIFwiZGVcIjogXCJXYWxsaXMgdW5kIEZ1dHVuYVwiLFxuICAgICAgXCJlc1wiOiBcIldhbGxpcyB5IEZ1dHVuYVwiXG4gICAgfSxcbiAgICBcInRhZ3NcIjogW1xuXG4gICAgXVxuICB9LFxuICB7XG4gICAgXCJhbHBoYV8yXCI6IFwiRUhcIixcbiAgICBcImxvY2FsZXNcIjoge1xuICAgICAgXCJlblwiOiBcIldlc3Rlcm4gU2FoYXJhXCIsXG4gICAgICBcImZyXCI6IFwiU2FoYXJhIG9jY2lkZW50YWxcIixcbiAgICAgIFwiZGVcIjogXCJXZXN0c2FoYXJhXCIsXG4gICAgICBcImVzXCI6IFwiU2FoYXJhIE9jY2lkZW50YWxcIlxuICAgIH0sXG4gICAgXCJ0YWdzXCI6IFtcblxuICAgIF1cbiAgfSxcbiAge1xuICAgIFwiYWxwaGFfMlwiOiBcIllFXCIsXG4gICAgXCJsb2NhbGVzXCI6IHtcbiAgICAgIFwiZW5cIjogXCJZZW1lblwiLFxuICAgICAgXCJmclwiOiBcIlnDqW1lblwiLFxuICAgICAgXCJkZVwiOiBcIkplbWVuXCIsXG4gICAgICBcImVzXCI6IFwiWWVtZW5cIlxuICAgIH0sXG4gICAgXCJ0YWdzXCI6IFtcblxuICAgIF1cbiAgfSxcbiAge1xuICAgIFwiYWxwaGFfMlwiOiBcIlpNXCIsXG4gICAgXCJsb2NhbGVzXCI6IHtcbiAgICAgIFwiZW5cIjogXCJaYW1iaWFcIixcbiAgICAgIFwiZnJcIjogXCJaYW1iaWVcIixcbiAgICAgIFwiZGVcIjogXCJTYW1iaWFcIixcbiAgICAgIFwiZXNcIjogXCJaYW1iaWFcIlxuICAgIH0sXG4gICAgXCJ0YWdzXCI6IFtcblxuICAgIF1cbiAgfSxcbiAge1xuICAgIFwiYWxwaGFfMlwiOiBcIlpXXCIsXG4gICAgXCJsb2NhbGVzXCI6IHtcbiAgICAgIFwiZW5cIjogXCJaaW1iYWJ3ZVwiLFxuICAgICAgXCJmclwiOiBcIlppbWJhYndlXCIsXG4gICAgICBcImRlXCI6IFwiU2ltYmFid2VcIixcbiAgICAgIFwiZXNcIjogXCJaaW1iYWJ1ZVwiXG4gICAgfSxcbiAgICBcInRhZ3NcIjogW1xuXG4gICAgXVxuICB9XG5dO1xuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogLi9hbmNpbGxhcnkvdXRpbHMvY291bnRyaWVzLXNlcnZpY2UuanNcbiAqKi8iLCJ1bmRlZmluZWRcblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiBcbiAqKi8iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBOzs7O0FBSUE7QUFMQTtBQ0NBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FBSUE7QUFDQTs7QUFFQTtBQUFBOztBQUNBO0FBQUE7O0FBQ0E7QUFBQTs7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUFBOzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FBSUE7QUFBQTs7QUFDQTtBQUFBOztBQUNBO0FBQUE7QUFDQTs7O0FBRUE7QUFBQTs7QUFDQTtBQUFBOztBQUNBO0FBQUE7QUFBQTs7O0FBQ0E7QUFBQTs7QUFDQTtBQUFBO0FBQUE7Ozs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7OztBQUlBO0FBQ0E7QUFDQTtBQUNBOzs7O0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7O0FBS0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUE1MEZBIiwic291cmNlUm9vdCI6IiJ9");

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

	eval("'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = csrfToken;\n/*@ngInject*/\nfunction csrfToken() {\n  var csrfTokenService = {};\n  var _token = $('meta[name=csrf-token]').attr('content');\n\n  csrfTokenService.getToken = function () {\n    return _token;\n  };\n\n  csrfTokenService.headerConfig = function () {\n    return { headers: { 'X-CSRF-Token': _token } };\n  };\n\n  csrfTokenService.setToken = function (newToken) {\n    _token = newToken;\n  };\n\n  return csrfTokenService;\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiODkuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9hbmNpbGxhcnkvdXRpbHMvY3NyZi10b2tlbi1mYWN0b3J5LmpzP2JmYjEiXSwic291cmNlc0NvbnRlbnQiOlsiLypAbmdJbmplY3QqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gY3NyZlRva2VuICgpIHtcbiAgICB2YXIgY3NyZlRva2VuU2VydmljZSA9IHt9O1xuICAgIHZhciBfdG9rZW4gPSAkKCdtZXRhW25hbWU9Y3NyZi10b2tlbl0nKS5hdHRyKCdjb250ZW50Jyk7XG5cbiAgICBjc3JmVG9rZW5TZXJ2aWNlLmdldFRva2VuID0gZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gX3Rva2VuO1xuICAgIH07XG5cbiAgICBjc3JmVG9rZW5TZXJ2aWNlLmhlYWRlckNvbmZpZyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiB7aGVhZGVyczogeydYLUNTUkYtVG9rZW4nOiBfdG9rZW59fTtcbiAgICB9O1xuXG4gICAgY3NyZlRva2VuU2VydmljZS5zZXRUb2tlbiA9IGZ1bmN0aW9uKG5ld1Rva2VuKSB7XG4gICAgICBfdG9rZW4gPSBuZXdUb2tlbjtcbiAgICB9O1xuXG4gICAgcmV0dXJuIGNzcmZUb2tlblNlcnZpY2U7XG4gIH1cblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIC4vYW5jaWxsYXJ5L3V0aWxzL2NzcmYtdG9rZW4tZmFjdG9yeS5qc1xuICoqLyJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBSkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBOzs7QUFHQTtBQUNBOzs7QUFHQTtBQWhCQSIsInNvdXJjZVJvb3QiOiIifQ==");

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

	eval("\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = currencies;\nfunction currencies() {\n  function CurrenciesService() {\n    /* To refresh, open up a Rails console and type \"puts JSON.pretty_generate(Currency.visible_list.map { |cur| CurrencySerializer.new(cur).serializable_hash })\" */\n    var currencies = [{\n      \"iso_num\": 840,\n      \"symbol\": \"$\",\n      \"iso_code\": \"USD\"\n    }, {\n      \"iso_num\": 978,\n      \"symbol\": \"€\",\n      \"iso_code\": \"EUR\"\n    }, {\n      \"iso_num\": 826,\n      \"symbol\": \"£\",\n      \"iso_code\": \"GBP\"\n    }, {\n      \"iso_num\": 124,\n      \"symbol\": \"$\",\n      \"iso_code\": \"CAD\"\n    }, {\n      \"iso_num\": 36,\n      \"symbol\": \"$\",\n      \"iso_code\": \"AUD\"\n    }];\n\n    this.asOptions = function () {\n      return _.map(currencies, function (currency) {\n        return { value: currency.iso_num, text: currency.iso_code };\n      });\n    };\n\n    this.all = function () {\n      return currencies;\n    };\n\n    this.asPartnerOptions = function () {\n      return _.map(currencies, function (currency) {\n        return { value: currency.id, text: currency.iso_code + ' (' + currency.symbol + ')' };\n      });\n    };\n\n    this.asSimpleOptions = function () {\n      return _.select(this.asOptions(), function (currencyOption) {\n        return currencyOption.text === 'USD' || currencyOption.text === 'CAD' || currencyOption.text === 'GBP';\n      });\n    };\n\n    this.forIsoNum = function (isoNum) {\n      return _.find(currencies, { iso_num: parseInt(isoNum) });\n    };\n\n    this.forIsoCode = function (isoCode) {\n      return _.find(currencies, { iso_code: isoCode });\n    };\n  }\n\n  return new CurrenciesService();\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiOTAuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9hbmNpbGxhcnkvdXRpbHMvY3VycmVuY2llcy1mYWN0b3J5LmpzPzhmNDgiXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gY3VycmVuY2llcyAoKSB7XG4gICAgZnVuY3Rpb24gQ3VycmVuY2llc1NlcnZpY2UoKSB7XG4gICAgICAvKiBUbyByZWZyZXNoLCBvcGVuIHVwIGEgUmFpbHMgY29uc29sZSBhbmQgdHlwZSBcInB1dHMgSlNPTi5wcmV0dHlfZ2VuZXJhdGUoQ3VycmVuY3kudmlzaWJsZV9saXN0Lm1hcCB7IHxjdXJ8IEN1cnJlbmN5U2VyaWFsaXplci5uZXcoY3VyKS5zZXJpYWxpemFibGVfaGFzaCB9KVwiICovXG4gICAgICB2YXIgY3VycmVuY2llcyA9IFtcbiAgICAgICAge1xuICAgICAgICAgIFwiaXNvX251bVwiOiA4NDAsXG4gICAgICAgICAgXCJzeW1ib2xcIjogXCIkXCIsXG4gICAgICAgICAgXCJpc29fY29kZVwiOiBcIlVTRFwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBcImlzb19udW1cIjogOTc4LFxuICAgICAgICAgIFwic3ltYm9sXCI6IFwi4oKsXCIsXG4gICAgICAgICAgXCJpc29fY29kZVwiOiBcIkVVUlwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBcImlzb19udW1cIjogODI2LFxuICAgICAgICAgIFwic3ltYm9sXCI6IFwiwqNcIixcbiAgICAgICAgICBcImlzb19jb2RlXCI6IFwiR0JQXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIFwiaXNvX251bVwiOiAxMjQsXG4gICAgICAgICAgXCJzeW1ib2xcIjogXCIkXCIsXG4gICAgICAgICAgXCJpc29fY29kZVwiOiBcIkNBRFwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBcImlzb19udW1cIjogMzYsXG4gICAgICAgICAgXCJzeW1ib2xcIjogXCIkXCIsXG4gICAgICAgICAgXCJpc29fY29kZVwiOiBcIkFVRFwiXG4gICAgICAgIH1cbiAgICAgIF07XG5cbiAgICAgIHRoaXMuYXNPcHRpb25zID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gXy5tYXAoY3VycmVuY2llcywgZnVuY3Rpb24gKGN1cnJlbmN5KSB7XG4gICAgICAgICAgcmV0dXJuIHsgdmFsdWU6IGN1cnJlbmN5Lmlzb19udW0sIHRleHQ6IGN1cnJlbmN5Lmlzb19jb2RlIH07XG4gICAgICAgIH0pO1xuICAgICAgfTtcblxuICAgICAgdGhpcy5hbGwgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBjdXJyZW5jaWVzO1xuICAgICAgfTtcblxuICAgICAgdGhpcy5hc1BhcnRuZXJPcHRpb25zID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gXy5tYXAoY3VycmVuY2llcywgZnVuY3Rpb24gKGN1cnJlbmN5KSB7XG4gICAgICAgICAgcmV0dXJuIHsgdmFsdWU6IGN1cnJlbmN5LmlkLCB0ZXh0OiAoY3VycmVuY3kuaXNvX2NvZGUgKyAnICgnICsgY3VycmVuY3kuc3ltYm9sICsgJyknKX07XG4gICAgICAgIH0pO1xuICAgICAgfTtcblxuICAgICAgdGhpcy5hc1NpbXBsZU9wdGlvbnMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBfLnNlbGVjdCh0aGlzLmFzT3B0aW9ucygpLCBmdW5jdGlvbiAoY3VycmVuY3lPcHRpb24pIHtcbiAgICAgICAgICByZXR1cm4gY3VycmVuY3lPcHRpb24udGV4dCA9PT0gJ1VTRCcgfHxcbiAgICAgICAgICAgIGN1cnJlbmN5T3B0aW9uLnRleHQgPT09ICdDQUQnIHx8XG4gICAgICAgICAgICBjdXJyZW5jeU9wdGlvbi50ZXh0ID09PSAnR0JQJztcbiAgICAgICAgfSk7XG4gICAgICB9O1xuXG4gICAgICB0aGlzLmZvcklzb051bSA9IGZ1bmN0aW9uIChpc29OdW0pIHtcbiAgICAgICAgcmV0dXJuIF8uZmluZChjdXJyZW5jaWVzLCB7aXNvX251bTogcGFyc2VJbnQoaXNvTnVtKX0pO1xuICAgICAgfTtcblxuICAgICAgdGhpcy5mb3JJc29Db2RlID0gZnVuY3Rpb24gKGlzb0NvZGUpIHtcbiAgICAgICAgcmV0dXJuIF8uZmluZChjdXJyZW5jaWVzLCB7aXNvX2NvZGU6IGlzb0NvZGV9KTtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBDdXJyZW5jaWVzU2VydmljZSgpO1xuICB9XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiAuL2FuY2lsbGFyeS91dGlscy9jdXJyZW5jaWVzLWZhY3RvcnkuanNcbiAqKi8iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBTEE7QUFDQTs7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBOzs7QUFJQTtBQUNBO0FBQ0E7Ozs7QUFJQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7Ozs7QUFJQTtBQUNBO0FBQ0E7Ozs7QUFNQTtBQUNBOzs7QUFHQTtBQUNBOzs7O0FBSUE7QUFoRUEiLCJzb3VyY2VSb290IjoiIn0=");

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

	eval("'use strict';\n\ncurrencyDisplay.$inject = [\"currencies\"];\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = currencyDisplay;\n/*@ngInject*/\nfunction currencyDisplay(currencies) {\n  return function (input, property) {\n    var currentCurrency = currencies.forIsoNum(input.currency_iso_num);\n    return currentCurrency[property || 'symbol'];\n  };\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiOTEuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9hbmNpbGxhcnkvdXRpbHMvY3VycmVuY3ktZGlzcGxheS1maWx0ZXIuanM/OTJmOSJdLCJzb3VyY2VzQ29udGVudCI6WyIvKkBuZ0luamVjdCovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBjdXJyZW5jeURpc3BsYXkoY3VycmVuY2llcykge1xuICAgIHJldHVybiBmdW5jdGlvbihpbnB1dCwgcHJvcGVydHkpIHtcbiAgICAgIHZhciBjdXJyZW50Q3VycmVuY3kgPSBjdXJyZW5jaWVzLmZvcklzb051bShpbnB1dC5jdXJyZW5jeV9pc29fbnVtKTtcbiAgICAgIHJldHVybiBjdXJyZW50Q3VycmVuY3lbcHJvcGVydHkgfHwgJ3N5bWJvbCddO1xuICAgIH07XG4gIH1cblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIC4vYW5jaWxsYXJ5L3V0aWxzL2N1cnJlbmN5LWRpc3BsYXktZmlsdGVyLmpzXG4gKiovIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBOztBQUNBO0FBQ0E7O0FBRUE7O0FBSkE7QUFDQTtBQUNBO0FBQ0E7O0FBSEEiLCJzb3VyY2VSb290IjoiIn0=");

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

	eval("'use strict';\n\ncuteFlash.$inject = [\"$timeout\", \"i18n\"];\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = cuteFlash;\n/*@ngInject*/\nfunction cuteFlash($timeout, i18n) {\n  return {\n    restrict: 'A',\n    scope: {},\n    template: __webpack_require__(93),\n    link: function link(scope) {\n      scope.i18n = i18n;\n      scope.showFlash = false;\n      scope.flashSuccess = false;\n      scope.flashMessage = '';\n\n      var DISMISS_TIMEOUT = 3000;\n\n      scope.$on('flash', function (event, args) {\n        scope.showFlash = true;\n\n        scope.flashSuccess = args.status === 'success';\n        scope.flashMessage = args.message;\n\n        $timeout(function () {\n          scope.showFlash = false;\n          scope.flashSuccess = true;\n        }, DISMISS_TIMEOUT);\n      });\n    }\n  };\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiOTIuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9hbmNpbGxhcnkvdXRpbHMvY3V0ZS1mbGFzaC1kaXJlY3RpdmUuanM/MGJkOSJdLCJzb3VyY2VzQ29udGVudCI6WyIvKkBuZ0luamVjdCovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBjdXRlRmxhc2goJHRpbWVvdXQsIGkxOG4pIHtcbiAgcmV0dXJuIHtcbiAgICByZXN0cmljdDogJ0EnLFxuICAgIHNjb3BlOiB7fSxcbiAgICB0ZW1wbGF0ZTogcmVxdWlyZSgnLi9jdXRlLWZsYXNoLWRpcmVjdGl2ZS5odG1sJyksXG4gICAgbGluazogZnVuY3Rpb24gKHNjb3BlKSB7XG4gICAgICBzY29wZS5pMThuID0gaTE4bjtcbiAgICAgIHNjb3BlLnNob3dGbGFzaCA9IGZhbHNlO1xuICAgICAgc2NvcGUuZmxhc2hTdWNjZXNzID0gZmFsc2U7XG4gICAgICBzY29wZS5mbGFzaE1lc3NhZ2UgPSAnJztcblxuICAgICAgdmFyIERJU01JU1NfVElNRU9VVCA9IDMwMDA7XG5cbiAgICAgIHNjb3BlLiRvbignZmxhc2gnLCBmdW5jdGlvbiAoZXZlbnQsIGFyZ3MpIHtcbiAgICAgICAgc2NvcGUuc2hvd0ZsYXNoID0gdHJ1ZTtcblxuICAgICAgICBzY29wZS5mbGFzaFN1Y2Nlc3MgPSAoYXJncy5zdGF0dXMgPT09ICdzdWNjZXNzJyk7XG4gICAgICAgIHNjb3BlLmZsYXNoTWVzc2FnZSA9IGFyZ3MubWVzc2FnZTtcblxuICAgICAgICAkdGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgc2NvcGUuc2hvd0ZsYXNoID0gZmFsc2U7XG4gICAgICAgICAgc2NvcGUuZmxhc2hTdWNjZXNzID0gdHJ1ZTtcbiAgICAgICAgfSwgRElTTUlTU19USU1FT1VUKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfTtcbn1cblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIC4vYW5jaWxsYXJ5L3V0aWxzL2N1dGUtZmxhc2gtZGlyZWN0aXZlLmpzXG4gKiovIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBOztBQUNBO0FBQ0E7O0FBRUE7O0FBSkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQXRCQSIsInNvdXJjZVJvb3QiOiIifQ==");

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

	eval("module.exports = \"<div class=\\\"cute-flash-relative-container am-fade\\\" ng-if=\\\"showFlash\\\">\\n  <div class=\\\"cute-flash-absolute-container\\\">\\n    <div class=\\\"messageNotification cute-flash\\\" ng-class=\\\"{'messageNotification--success': flashSuccess, 'messageNotification--error': !flashSuccess}\\\">\\n      <div class=\\\"messageNotification-header\\\">{{flashMessage}}</div>\\n    </div>\\n  </div>\\n</div>\\n\";\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiOTMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9hbmNpbGxhcnkvdXRpbHMvY3V0ZS1mbGFzaC1kaXJlY3RpdmUuaHRtbD85OWNlIl0sInNvdXJjZXNDb250ZW50IjpbIm1vZHVsZS5leHBvcnRzID0gXCI8ZGl2IGNsYXNzPVxcXCJjdXRlLWZsYXNoLXJlbGF0aXZlLWNvbnRhaW5lciBhbS1mYWRlXFxcIiBuZy1pZj1cXFwic2hvd0ZsYXNoXFxcIj5cXG4gIDxkaXYgY2xhc3M9XFxcImN1dGUtZmxhc2gtYWJzb2x1dGUtY29udGFpbmVyXFxcIj5cXG4gICAgPGRpdiBjbGFzcz1cXFwibWVzc2FnZU5vdGlmaWNhdGlvbiBjdXRlLWZsYXNoXFxcIiBuZy1jbGFzcz1cXFwieydtZXNzYWdlTm90aWZpY2F0aW9uLS1zdWNjZXNzJzogZmxhc2hTdWNjZXNzLCAnbWVzc2FnZU5vdGlmaWNhdGlvbi0tZXJyb3InOiAhZmxhc2hTdWNjZXNzfVxcXCI+XFxuICAgICAgPGRpdiBjbGFzcz1cXFwibWVzc2FnZU5vdGlmaWNhdGlvbi1oZWFkZXJcXFwiPnt7Zmxhc2hNZXNzYWdlfX08L2Rpdj5cXG4gICAgPC9kaXY+XFxuICA8L2Rpdj5cXG48L2Rpdj5cXG5cIjtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vYW5jaWxsYXJ5L3V0aWxzL2N1dGUtZmxhc2gtZGlyZWN0aXZlLmh0bWxcbiAqKiBtb2R1bGUgaWQgPSA5M1xuICoqIG1vZHVsZSBjaHVua3MgPSAyNFxuICoqLyJdLCJtYXBwaW5ncyI6IkFBQUEiLCJzb3VyY2VSb290IjoiIn0=");

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

	eval("\"use strict\";\n\ndataStore.$inject = [\"$cookies\"];\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = dataStore;\n/*@ngInject*/\n\nfunction dataStore($cookies) {\n  return {\n    getValueForKey: function getValueForKey(key) {\n      return $cookies.get(key);\n    },\n    setValueForKey: function setValueForKey(key, value) {\n      return $cookies.put(key, value);\n    }\n  };\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiOTQuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9hbmNpbGxhcnkvdXRpbHMvZGF0YS1zdG9yZS1mYWN0b3J5LmpzPzA3ZWQiXSwic291cmNlc0NvbnRlbnQiOlsiLypAbmdJbmplY3QqL1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBkYXRhU3RvcmUgKCRjb29raWVzKSB7XG4gIHJldHVybiB7XG4gICAgZ2V0VmFsdWVGb3JLZXk6IGZ1bmN0aW9uKGtleSkge1xuICAgICAgcmV0dXJuICRjb29raWVzLmdldChrZXkpO1xuICAgIH0sXG4gICAgc2V0VmFsdWVGb3JLZXk6IGZ1bmN0aW9uKGtleSwgdmFsdWUpIHtcbiAgICAgIHJldHVybiAkY29va2llcy5wdXQoa2V5LCB2YWx1ZSk7XG4gICAgfVxuICB9O1xufVxuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogLi9hbmNpbGxhcnkvdXRpbHMvZGF0YS1zdG9yZS1mYWN0b3J5LmpzXG4gKiovIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBOztBQUNBO0FBQ0E7O0FBRUE7OztBQUhBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7OztBQU5BIiwic291cmNlUm9vdCI6IiJ9");

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

	eval("'use strict';\n\ndate.$inject = [\"$rootScope\", \"_\", \"i18n\"];\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = date;\n/*@ngInject*/\nfunction date($rootScope, _, i18n) {\n  var today = new Date();\n  var months = [{ id: '', text: i18n.t('campaign_editor.misc.month'), days: 0 }, { id: 0, text: i18n.t('campaign_editor.misc.date_options.january'), days: 31 }, { id: 1, text: i18n.t('campaign_editor.misc.date_options.february'), days: 28 }, { id: 2, text: i18n.t('campaign_editor.misc.date_options.march'), days: 31 }, { id: 3, text: i18n.t('campaign_editor.misc.date_options.april'), days: 30 }, { id: 4, text: i18n.t('campaign_editor.misc.date_options.may'), days: 31 }, { id: 5, text: i18n.t('campaign_editor.misc.date_options.june'), days: 30 }, { id: 6, text: i18n.t('campaign_editor.misc.date_options.july'), days: 31 }, { id: 7, text: i18n.t('campaign_editor.misc.date_options.august'), days: 31 }, { id: 8, text: i18n.t('campaign_editor.misc.date_options.september'), days: 30 }, { id: 9, text: i18n.t('campaign_editor.misc.date_options.october'), days: 31 }, { id: 10, text: i18n.t('campaign_editor.misc.date_options.november'), days: 30 }, { id: 11, text: i18n.t('campaign_editor.misc.date_options.december'), days: 31 }];\n\n  var monthById = function monthById(id) {\n    return _.find(months, function (m) {\n      return m.id === id;\n    });\n  };\n\n  return {\n    today: today,\n    years: function years(range) {\n      var years = [{ id: '', text: i18n.t('campaign_editor.misc.year') }];\n      var startYear = today.getFullYear();\n      var endYear = startYear;\n\n      if (range > 0) endYear += range;else startYear += range;\n\n      for (var i = startYear; i <= endYear; i++) {\n        years.push({ id: i, text: i.toString() });\n      }return years;\n    },\n    months: months,\n    days: function days(month, year) {\n      var days = [{ id: '', text: i18n.t('campaign_editor.misc.day') }];\n      var startOfNextMonth = new Date(year, month + 1, 1);\n      startOfNextMonth.setDate(-1);\n      for (var i = 1; i <= startOfNextMonth.getDate() + 1; i++) {\n        days.push({ id: i, text: i.toString() });\n      }return days;\n    },\n    daysWithoutText: function daysWithoutText(monthId, year) {\n      var month = monthById(monthId);\n\n      var numberOfDays = month && month.days || 31;\n      if (year && year % 4 === 0 && month && month.id === 1) {\n        //leap years\n        numberOfDays++;\n      }\n      return _.range(1, numberOfDays + 1);\n    },\n    isNull: function isNull(option) {\n      return _.isNull(option) || _.isUndefined(option) || option.id === '';\n    },\n    dayById: function dayById(id, days) {\n      return _.find(days, function (d) {\n        return d.id === id;\n      });\n    },\n    dayByDate: function dayByDate(d, days) {\n      return this.dayById(d.getDate(), days);\n    },\n    monthById: monthById,\n    monthByDate: function monthByDate(d) {\n      return this.monthById(d.getMonth());\n    },\n    yearById: function yearById(id, years) {\n      return _.find(years, function (y) {\n        return y.id === id;\n      });\n    },\n    yearByDate: function yearByDate(d, year) {\n      return this.yearById(d.getFullYear(), year);\n    }\n  };\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiOTUuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9hbmNpbGxhcnkvdXRpbHMvZGF0ZS1mYWN0b3J5LmpzPzQyYjYiXSwic291cmNlc0NvbnRlbnQiOlsiLypAbmdJbmplY3QqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZGF0ZSAoJHJvb3RTY29wZSwgXywgaTE4bikge1xuICAgICAgdmFyIHRvZGF5ID0gbmV3IERhdGUoKTtcbiAgICAgIHZhciBtb250aHMgPVxuICAgICAgICBbXG4gICAgICAgICAge2lkOiAnJywgdGV4dDogaTE4bi50KCdjYW1wYWlnbl9lZGl0b3IubWlzYy5tb250aCcpLCBkYXlzOiAwfSxcbiAgICAgICAgICB7aWQ6IDAsIHRleHQ6IGkxOG4udCgnY2FtcGFpZ25fZWRpdG9yLm1pc2MuZGF0ZV9vcHRpb25zLmphbnVhcnknKSwgZGF5czogMzF9LFxuICAgICAgICAgIHtpZDogMSwgdGV4dDogaTE4bi50KCdjYW1wYWlnbl9lZGl0b3IubWlzYy5kYXRlX29wdGlvbnMuZmVicnVhcnknKSwgZGF5czogMjh9LFxuICAgICAgICAgIHtpZDogMiwgdGV4dDogaTE4bi50KCdjYW1wYWlnbl9lZGl0b3IubWlzYy5kYXRlX29wdGlvbnMubWFyY2gnKSwgZGF5czogMzF9LFxuICAgICAgICAgIHtpZDogMywgdGV4dDogaTE4bi50KCdjYW1wYWlnbl9lZGl0b3IubWlzYy5kYXRlX29wdGlvbnMuYXByaWwnKSwgZGF5czogMzB9LFxuICAgICAgICAgIHtpZDogNCwgdGV4dDogaTE4bi50KCdjYW1wYWlnbl9lZGl0b3IubWlzYy5kYXRlX29wdGlvbnMubWF5JyksIGRheXM6IDMxfSxcbiAgICAgICAgICB7aWQ6IDUsIHRleHQ6IGkxOG4udCgnY2FtcGFpZ25fZWRpdG9yLm1pc2MuZGF0ZV9vcHRpb25zLmp1bmUnKSwgZGF5czogMzB9LFxuICAgICAgICAgIHtpZDogNiwgdGV4dDogaTE4bi50KCdjYW1wYWlnbl9lZGl0b3IubWlzYy5kYXRlX29wdGlvbnMuanVseScpLCBkYXlzOiAzMX0sXG4gICAgICAgICAge2lkOiA3LCB0ZXh0OiBpMThuLnQoJ2NhbXBhaWduX2VkaXRvci5taXNjLmRhdGVfb3B0aW9ucy5hdWd1c3QnKSwgZGF5czogMzF9LFxuICAgICAgICAgIHtpZDogOCwgdGV4dDogaTE4bi50KCdjYW1wYWlnbl9lZGl0b3IubWlzYy5kYXRlX29wdGlvbnMuc2VwdGVtYmVyJyksIGRheXM6IDMwfSxcbiAgICAgICAgICB7aWQ6IDksIHRleHQ6IGkxOG4udCgnY2FtcGFpZ25fZWRpdG9yLm1pc2MuZGF0ZV9vcHRpb25zLm9jdG9iZXInKSwgZGF5czogMzF9LFxuICAgICAgICAgIHtpZDogMTAsIHRleHQ6IGkxOG4udCgnY2FtcGFpZ25fZWRpdG9yLm1pc2MuZGF0ZV9vcHRpb25zLm5vdmVtYmVyJyksIGRheXM6IDMwfSxcbiAgICAgICAgICB7aWQ6IDExLCB0ZXh0OiBpMThuLnQoJ2NhbXBhaWduX2VkaXRvci5taXNjLmRhdGVfb3B0aW9ucy5kZWNlbWJlcicpLCBkYXlzOiAzMX1cbiAgICAgICAgXTtcblxuICAgICAgdmFyIG1vbnRoQnlJZCA9IGZ1bmN0aW9uIChpZCkge1xuICAgICAgICByZXR1cm4gXy5maW5kKG1vbnRocywgZnVuY3Rpb24gKG0pIHtcbiAgICAgICAgICByZXR1cm4gbS5pZCA9PT0gaWQ7XG4gICAgICAgIH0pO1xuICAgICAgfTtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdG9kYXk6IHRvZGF5LFxuICAgICAgICB5ZWFyczogZnVuY3Rpb24gKHJhbmdlKSB7XG4gICAgICAgICAgdmFyIHllYXJzID0gW3tpZDogJycsIHRleHQ6IGkxOG4udCgnY2FtcGFpZ25fZWRpdG9yLm1pc2MueWVhcicpfV07XG4gICAgICAgICAgdmFyIHN0YXJ0WWVhciA9IHRvZGF5LmdldEZ1bGxZZWFyKCk7XG4gICAgICAgICAgdmFyIGVuZFllYXIgPSBzdGFydFllYXI7XG5cbiAgICAgICAgICBpZiAocmFuZ2UgPiAwKVxuICAgICAgICAgICAgZW5kWWVhciArPSByYW5nZTtcbiAgICAgICAgICBlbHNlXG4gICAgICAgICAgICBzdGFydFllYXIgKz0gcmFuZ2U7XG5cbiAgICAgICAgICBmb3IgKHZhciBpID0gc3RhcnRZZWFyOyBpIDw9IGVuZFllYXI7IGkrKylcbiAgICAgICAgICAgIHllYXJzLnB1c2goe2lkOiBpLCB0ZXh0OiBpLnRvU3RyaW5nKCl9KTtcblxuICAgICAgICAgIHJldHVybiB5ZWFycztcbiAgICAgICAgfSxcbiAgICAgICAgbW9udGhzOiBtb250aHMsXG4gICAgICAgIGRheXM6IGZ1bmN0aW9uIChtb250aCwgeWVhcikge1xuICAgICAgICAgIHZhciBkYXlzID0gW3tpZDogJycsIHRleHQ6IGkxOG4udCgnY2FtcGFpZ25fZWRpdG9yLm1pc2MuZGF5Jyl9XTtcbiAgICAgICAgICB2YXIgc3RhcnRPZk5leHRNb250aCA9IG5ldyBEYXRlKHllYXIsIG1vbnRoICsgMSwgMSk7XG4gICAgICAgICAgc3RhcnRPZk5leHRNb250aC5zZXREYXRlKC0xKTtcbiAgICAgICAgICBmb3IgKHZhciBpID0gMTsgaSA8PSBzdGFydE9mTmV4dE1vbnRoLmdldERhdGUoKSArIDE7IGkrKylcbiAgICAgICAgICAgIGRheXMucHVzaCh7aWQ6IGksIHRleHQ6IGkudG9TdHJpbmcoKX0pO1xuXG4gICAgICAgICAgcmV0dXJuIGRheXM7XG4gICAgICAgIH0sXG4gICAgICAgIGRheXNXaXRob3V0VGV4dDogZnVuY3Rpb24obW9udGhJZCwgeWVhcikge1xuICAgICAgICAgIHZhciBtb250aCA9IG1vbnRoQnlJZChtb250aElkKTtcblxuICAgICAgICAgIHZhciBudW1iZXJPZkRheXMgPSAobW9udGggJiYgbW9udGguZGF5cykgfHwgMzE7XG4gICAgICAgICAgaWYgKHllYXIgJiYgeWVhciAlIDQgPT09IDAgJiYgbW9udGggJiYgbW9udGguaWQgPT09IDEgKSB7IC8vbGVhcCB5ZWFyc1xuICAgICAgICAgICAgbnVtYmVyT2ZEYXlzKys7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBfLnJhbmdlKDEsIG51bWJlck9mRGF5cyArIDEpO1xuICAgICAgICB9LFxuICAgICAgICBpc051bGw6IGZ1bmN0aW9uIChvcHRpb24pIHtcbiAgICAgICAgICByZXR1cm4gXy5pc051bGwob3B0aW9uKSB8fCBfLmlzVW5kZWZpbmVkKG9wdGlvbikgfHwgb3B0aW9uLmlkID09PSAnJztcbiAgICAgICAgfSxcbiAgICAgICAgZGF5QnlJZDogZnVuY3Rpb24gKGlkLCBkYXlzKSB7XG4gICAgICAgICAgcmV0dXJuIF8uZmluZChkYXlzLCBmdW5jdGlvbiAoZCkge1xuICAgICAgICAgICAgcmV0dXJuIGQuaWQgPT09IGlkO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuICAgICAgICBkYXlCeURhdGU6IGZ1bmN0aW9uIChkLCBkYXlzKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuZGF5QnlJZChkLmdldERhdGUoKSwgZGF5cyk7XG4gICAgICAgIH0sXG4gICAgICAgIG1vbnRoQnlJZDogbW9udGhCeUlkLFxuICAgICAgICBtb250aEJ5RGF0ZTogZnVuY3Rpb24gKGQpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5tb250aEJ5SWQoZC5nZXRNb250aCgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgeWVhckJ5SWQ6IGZ1bmN0aW9uIChpZCwgeWVhcnMpIHtcbiAgICAgICAgICByZXR1cm4gXy5maW5kKHllYXJzLCBmdW5jdGlvbiAoeSkge1xuICAgICAgICAgICAgcmV0dXJuIHkuaWQgPT09IGlkO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuICAgICAgICB5ZWFyQnlEYXRlOiBmdW5jdGlvbiAoZCwgeWVhcikge1xuICAgICAgICAgIHJldHVybiB0aGlzLnllYXJCeUlkKGQuZ2V0RnVsbFllYXIoKSwgeWVhcik7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfVxuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogLi9hbmNpbGxhcnkvdXRpbHMvZGF0ZS1mYWN0b3J5LmpzXG4gKiovIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBOztBQUNBO0FBQ0E7O0FBRUE7O0FBSkE7QUFDQTtBQUNBO0FBQ0E7QUFnQkE7QUFDQTtBQUNBOzs7O0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSUE7QUFDQTtBQURBOztBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBREE7O0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOzs7QUFHQTtBQUNBOzs7QUFsRkEiLCJzb3VyY2VSb290IjoiIn0=");

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

	eval("'use strict';\n\ndotdotdot.$inject = [\"$timeout\"];\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = dotdotdot;\n/*@ngInject*/\nfunction dotdotdot($timeout) {\n  return {\n    restrict: 'A',\n    scope: {\n      numLines: '=dotdotdotNumLines'\n    },\n    link: function link(scope, element) {\n      if (typeof scope.numLines === 'undefined') {\n        element.dotdotdot();\n      } else {\n        $timeout(function () {\n          var desiredTotalHeight = parseInt(element.css(\"line-height\")) * scope.numLines;\n          element.dotdotdot({\n            height: desiredTotalHeight,\n            wrap: \"letter\",\n            watch: \"window\"\n          });\n        });\n      }\n    }\n  };\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiOTYuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9hbmNpbGxhcnkvdXRpbHMvZG90ZG90ZG90LWRpcmVjdGl2ZS5qcz8xMzBlIl0sInNvdXJjZXNDb250ZW50IjpbIi8qQG5nSW5qZWN0Ki9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGRvdGRvdGRvdCAoJHRpbWVvdXQpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHJlc3RyaWN0OiAnQScsXG4gICAgICAgIHNjb3BlOiB7XG4gICAgICAgICAgbnVtTGluZXM6ICc9ZG90ZG90ZG90TnVtTGluZXMnXG4gICAgICAgIH0sXG4gICAgICAgIGxpbms6IGZ1bmN0aW9uKHNjb3BlLCBlbGVtZW50KSB7XG4gICAgICAgICAgaWYgKHR5cGVvZiBzY29wZS5udW1MaW5lcyA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIGVsZW1lbnQuZG90ZG90ZG90KCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICR0aW1lb3V0KGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICB2YXIgZGVzaXJlZFRvdGFsSGVpZ2h0ID0gcGFyc2VJbnQoZWxlbWVudC5jc3MoXCJsaW5lLWhlaWdodFwiKSkgKiBzY29wZS5udW1MaW5lcztcbiAgICAgICAgICAgICAgZWxlbWVudC5kb3Rkb3Rkb3Qoe1xuICAgICAgICAgICAgICAgIGhlaWdodDogZGVzaXJlZFRvdGFsSGVpZ2h0LFxuICAgICAgICAgICAgICAgIHdyYXA6IFwibGV0dGVyXCIsXG4gICAgICAgICAgICAgICAgd2F0Y2g6IFwid2luZG93XCJcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfVxuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogLi9hbmNpbGxhcnkvdXRpbHMvZG90ZG90ZG90LWRpcmVjdGl2ZS5qc1xuICoqLyJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTs7QUFDQTtBQUNBOztBQUVBOztBQUpBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7OztBQWZBIiwic291cmNlUm9vdCI6IiJ9");

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

	eval("'use strict';\n\nemailSubscriber.$inject = [\"$rootScope\", \"$http\", \"$window\", \"browser\", \"i18n\"];\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = emailSubscriber;\n/*@ngInject*/\nfunction emailSubscriber($rootScope, $http, $window, browser, i18n) {\n  var campaignSlug = $window.location.pathname.split('/')[2];\n  var baseUrl = '/private_api/campaigns/' + campaignSlug;\n\n  var button_text = i18n.t('email_subscriber.sign_up');\n  var placeholder = i18n.t('email_subscriber.your_email_address');\n\n  function setOptions(options) {\n    button_text = options.button_text || button_text;\n    placeholder = options.placeholder || placeholder;\n    $rootScope.$broadcast('EmailOptionsUpdated');\n  }\n\n  function getOptions() {\n    return {\n      button_text: button_text,\n      placeholder: placeholder\n    };\n  }\n\n  function getEmails() {\n    var csvUrl = baseUrl + '/email_subscribers';\n    browser.redirectTo(csvUrl);\n  }\n\n  function subscribeEmail(subscriber, source) {\n    source = source || 'unknown';\n    subscriber.source = source;\n    return $http.post(baseUrl + '/subscribe', { email_subscriber: subscriber });\n  }\n\n  return {\n    subscribeEmail: subscribeEmail,\n    getEmails: getEmails,\n    setOptions: setOptions,\n    getOptions: getOptions\n  };\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiOTcuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9hbmNpbGxhcnkvdXRpbHMvZW1haWwtc3Vic2NyaWJlci1mYWN0b3J5LmpzPzY5MmIiXSwic291cmNlc0NvbnRlbnQiOlsiLypAbmdJbmplY3QqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZW1haWxTdWJzY3JpYmVyKCRyb290U2NvcGUsICRodHRwLCAkd2luZG93LCBicm93c2VyLCBpMThuKSB7XG4gICAgdmFyIGNhbXBhaWduU2x1ZyA9ICR3aW5kb3cubG9jYXRpb24ucGF0aG5hbWUuc3BsaXQoJy8nKVsyXTtcbiAgICB2YXIgYmFzZVVybCA9ICcvcHJpdmF0ZV9hcGkvY2FtcGFpZ25zLycgKyBjYW1wYWlnblNsdWc7XG5cbiAgICB2YXIgYnV0dG9uX3RleHQgPSBpMThuLnQoJ2VtYWlsX3N1YnNjcmliZXIuc2lnbl91cCcpO1xuICAgIHZhciBwbGFjZWhvbGRlciA9IGkxOG4udCgnZW1haWxfc3Vic2NyaWJlci55b3VyX2VtYWlsX2FkZHJlc3MnKTtcblxuICAgIGZ1bmN0aW9uIHNldE9wdGlvbnMob3B0aW9ucykge1xuICAgICAgYnV0dG9uX3RleHQgPSBvcHRpb25zLmJ1dHRvbl90ZXh0IHx8IGJ1dHRvbl90ZXh0O1xuICAgICAgcGxhY2Vob2xkZXIgPSBvcHRpb25zLnBsYWNlaG9sZGVyIHx8IHBsYWNlaG9sZGVyO1xuICAgICAgJHJvb3RTY29wZS4kYnJvYWRjYXN0KCdFbWFpbE9wdGlvbnNVcGRhdGVkJyk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2V0T3B0aW9ucygpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGJ1dHRvbl90ZXh0OiBidXR0b25fdGV4dCxcbiAgICAgICAgcGxhY2Vob2xkZXI6IHBsYWNlaG9sZGVyXG4gICAgICB9O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGdldEVtYWlscygpIHtcbiAgICAgIHZhciBjc3ZVcmwgPSBiYXNlVXJsICsgJy9lbWFpbF9zdWJzY3JpYmVycyc7XG4gICAgICBicm93c2VyLnJlZGlyZWN0VG8oY3N2VXJsKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBzdWJzY3JpYmVFbWFpbChzdWJzY3JpYmVyLCBzb3VyY2Upe1xuICAgICAgc291cmNlID0gc291cmNlIHx8ICd1bmtub3duJztcbiAgICAgIHN1YnNjcmliZXIuc291cmNlID0gc291cmNlO1xuICAgICAgcmV0dXJuICRodHRwLnBvc3QoYmFzZVVybCArICcvc3Vic2NyaWJlJywge2VtYWlsX3N1YnNjcmliZXI6IHN1YnNjcmliZXJ9KTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgc3Vic2NyaWJlRW1haWw6IHN1YnNjcmliZUVtYWlsLFxuICAgICAgZ2V0RW1haWxzOiBnZXRFbWFpbHMsXG4gICAgICBzZXRPcHRpb25zOiBzZXRPcHRpb25zLFxuICAgICAgZ2V0T3B0aW9uczogZ2V0T3B0aW9uc1xuICAgIH07XG4gIH1cblxuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogLi9hbmNpbGxhcnkvdXRpbHMvZW1haWwtc3Vic2NyaWJlci1mYWN0b3J5LmpzXG4gKiovIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBOztBQUNBO0FBQ0E7O0FBRUE7O0FBSkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUFJQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQW5DQSIsInNvdXJjZVJvb3QiOiIifQ==");

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

	eval("'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = embeddableLinkHtml;\n/*@ngInject*/\nfunction embeddableLinkHtml() {\n  return function (linkText, href) {\n    var wrapperDiv = $('<div><a target=\"_blank\"></a></div>');\n    var link = wrapperDiv.find('a');\n    link.attr('href', href);\n    link.text(linkText);\n    return wrapperDiv.html();\n  };\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiOTguanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9hbmNpbGxhcnkvdXRpbHMvZW1iZWRkYWJsZS1saW5rLWh0bWwtZmFjdG9yeS5qcz9lYmUxIl0sInNvdXJjZXNDb250ZW50IjpbIi8qQG5nSW5qZWN0Ki9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGVtYmVkZGFibGVMaW5rSHRtbCgpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKGxpbmtUZXh0LCBocmVmKSB7XG4gICAgdmFyIHdyYXBwZXJEaXYgPSAkKCc8ZGl2PjxhIHRhcmdldD1cIl9ibGFua1wiPjwvYT48L2Rpdj4nKTtcbiAgICB2YXIgbGluayA9IHdyYXBwZXJEaXYuZmluZCgnYScpO1xuICAgIGxpbmsuYXR0cignaHJlZicsIGhyZWYpO1xuICAgIGxpbmsudGV4dChsaW5rVGV4dCk7XG4gICAgcmV0dXJuIHdyYXBwZXJEaXYuaHRtbCgpO1xuICB9O1xufVxuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogLi9hbmNpbGxhcnkvdXRpbHMvZW1iZWRkYWJsZS1saW5rLWh0bWwtZmFjdG9yeS5qc1xuICoqLyJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBSkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBTkEiLCJzb3VyY2VSb290IjoiIn0=");

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

	eval("'use strict';\n\nembedly.$inject = [\"gon\", \"$http\", \"$q\"];\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = embedly;\n/*@ngInject*/\nfunction embedly(gon, $http, $q) {\n\n  var embedlyConf = {\n    apiKey: gon && gon.embedly_conf && gon.embedly_conf.api_key,\n    apiUrl: \"https://api.embed.ly/1/oembed\"\n  };\n\n  return {\n    fetchVideoHtml: function fetchVideoHtml(videoUrl, width, height) {\n      var params = {\n        'key': embedlyConf.apiKey,\n        'url': videoUrl,\n        'width': width,\n        'height': height\n      };\n\n      var deferred = $q.defer();\n      $http.get(embedlyConf.apiUrl, { params: params }).success(function (response) {\n        if (_.isUndefined(response.html)) {\n          deferred.reject();\n        } else {\n          deferred.resolve(response);\n        }\n      }).error(function () {\n        deferred.reject();\n      });\n      return deferred.promise;\n    }\n  };\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiOTkuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9hbmNpbGxhcnkvdXRpbHMvZW1iZWRseS1mYWN0b3J5LmpzP2IwYTIiXSwic291cmNlc0NvbnRlbnQiOlsiLypAbmdJbmplY3QqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZW1iZWRseSAoZ29uLCAkaHR0cCwgJHEpIHtcblxuICAgIHZhciBlbWJlZGx5Q29uZiA9IHtcbiAgICAgIGFwaUtleTogZ29uICYmIGdvbi5lbWJlZGx5X2NvbmYgJiYgZ29uLmVtYmVkbHlfY29uZi5hcGlfa2V5LFxuICAgICAgYXBpVXJsOiBcImh0dHBzOi8vYXBpLmVtYmVkLmx5LzEvb2VtYmVkXCJcbiAgICB9O1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGZldGNoVmlkZW9IdG1sOiBmdW5jdGlvbih2aWRlb1VybCwgd2lkdGgsIGhlaWdodCkge1xuICAgICAgICB2YXIgcGFyYW1zID0ge1xuICAgICAgICAgICdrZXknOiBlbWJlZGx5Q29uZi5hcGlLZXksXG4gICAgICAgICAgJ3VybCc6IHZpZGVvVXJsLFxuICAgICAgICAgICd3aWR0aCc6IHdpZHRoLFxuICAgICAgICAgICdoZWlnaHQnOiBoZWlnaHRcbiAgICAgICAgfTtcblxuICAgICAgICB2YXIgZGVmZXJyZWQgPSAkcS5kZWZlcigpO1xuICAgICAgICAkaHR0cC5nZXQoZW1iZWRseUNvbmYuYXBpVXJsLCB7IHBhcmFtczogcGFyYW1zIH0pXG4gICAgICAgICAgLnN1Y2Nlc3MoZnVuY3Rpb24gKHJlc3BvbnNlKSB7XG4gICAgICAgICAgICBpZiAoXy5pc1VuZGVmaW5lZChyZXNwb25zZS5odG1sKSkge1xuICAgICAgICAgICAgICBkZWZlcnJlZC5yZWplY3QoKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGRlZmVycmVkLnJlc29sdmUocmVzcG9uc2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pLmVycm9yKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGRlZmVycmVkLnJlamVjdCgpO1xuICAgICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gZGVmZXJyZWQucHJvbWlzZTtcbiAgICAgIH1cbiAgICB9O1xuICB9XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiAuL2FuY2lsbGFyeS91dGlscy9lbWJlZGx5LWZhY3RvcnkuanNcbiAqKi8iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7O0FBQ0E7QUFDQTs7QUFFQTs7QUFKQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7OztBQTNCQSIsInNvdXJjZVJvb3QiOiIifQ==");

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

	eval("\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = keys;\n/*@ngInject*/\nfunction keys() {\n  return {\n    restrict: 'A',\n    link: function link(scope, element, attrs) {\n      element.bind(\"keyup\", function (event) {\n        if (event.which === 13) {\n          scope.$apply(function () {\n            scope.$eval(attrs.enterKeypress);\n          });\n          event.preventDefault();\n        }\n      });\n    }\n  };\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTAwLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vYW5jaWxsYXJ5L3V0aWxzL2VudGVyLWtleXByZXNzLWRpcmVjdGl2ZS5qcz8xYTA2Il0sInNvdXJjZXNDb250ZW50IjpbIi8qQG5nSW5qZWN0Ki9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGtleXMoKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICByZXN0cmljdDogJ0EnLFxuICAgICAgICBsaW5rOiBmdW5jdGlvbihzY29wZSwgZWxlbWVudCwgYXR0cnMpIHtcbiAgICAgICAgICBlbGVtZW50LmJpbmQoXCJrZXl1cFwiLCBmdW5jdGlvbihldmVudCkge1xuICAgICAgICAgICAgaWYgKGV2ZW50LndoaWNoID09PSAxMykge1xuICAgICAgICAgICAgICBzY29wZS4kYXBwbHkoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgc2NvcGUuJGV2YWwoYXR0cnMuZW50ZXJLZXlwcmVzcyk7XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgIH1cblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIC4vYW5jaWxsYXJ5L3V0aWxzL2VudGVyLWtleXByZXNzLWRpcmVjdGl2ZS5qc1xuICoqLyJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBSkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7Ozs7QUFUQSIsInNvdXJjZVJvb3QiOiIifQ==");

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

	eval("'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nexports.default = function ($http, $q, gon, $timeout) {\n  var fb = {\n    shareCount: null\n  };\n\n  var shareCountFetched = false;\n  var shareCountUrl = null;\n\n  fb.setUrls = function (urls) {\n    shareCountUrl = urls.shareCount;\n  };\n\n  fb.login = function (args) {\n    var deferred = $q.defer();\n    FB.login(function (response) {\n      deferred.resolve(response);\n    }, args);\n    return deferred.promise;\n  };\n\n  fb.share = function (uri, options) {\n    options = options || {};\n    var queryPrefix = '?';\n    if (uri.includes('?')) {\n      queryPrefix = '&';\n    }\n    var ref = queryPrefix.concat('ref=gogo__', options.iggref || 'fblk');\n    ref = options.account_id ? ref.concat('__', options.account_id) : ref;\n    var utms = options.utm_query_string ? '&'.concat(options.utm_query_string) : '';\n    var params = {\n      method: 'share',\n      href: uri + ref + utms,\n      redirect_uri: uri\n    };\n    return fb.ui(params);\n  };\n\n  fb.ui = function (params) {\n    var deferred = $q.defer();\n    $timeout(function () {\n      // http://stackoverflow.com/a/18996042\n      FB.ui(params, function (response) {\n        if (response && !response.error_code) {\n          deferred.resolve(response);\n        } else {\n          deferred.reject(response);\n        }\n      });\n    });\n    return deferred.promise;\n  };\n\n  fb.fetchShareCount = function () {\n    if (!shareCountFetched) {\n      /* lets remove the gon dependency from this service by allowing\n       * shareCountUrl to be specified from the outside. For now,\n       * fallback to looking on the gon when that's not present\n       */\n      var url = shareCountUrl || gon.urls && gon.urls.fb_share_count_url;\n      $http.get(url).then(function (res) {\n        fb.shareCount = res.data.fb_share_count;\n      });\n    }\n\n    shareCountFetched = true;\n  };\n\n  fb.refreshAllWidgets = function () {\n    try {\n      FB.XFBML.parse();\n    } catch (ex) {}\n  };\n\n  return fb;\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTAxLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vYW5jaWxsYXJ5L3V0aWxzL2ZiLWZhY3RvcnkuanM/OWRlYSJdLCJzb3VyY2VzQ29udGVudCI6WyIvKkBuZ0luamVjdCovXG4vKiBnbG9iYWwgRkI6ZmFsc2UgKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uICgkaHR0cCwgJHEsIGdvbiwgJHRpbWVvdXQpIHtcbiAgICB2YXIgZmIgPSB7XG4gICAgICBzaGFyZUNvdW50OiBudWxsXG4gICAgfTtcblxuICAgIHZhciBzaGFyZUNvdW50RmV0Y2hlZCA9IGZhbHNlO1xuICAgIHZhciBzaGFyZUNvdW50VXJsID0gbnVsbDtcblxuICAgIGZiLnNldFVybHMgPSBmdW5jdGlvbih1cmxzKSB7XG4gICAgICBzaGFyZUNvdW50VXJsID0gdXJscy5zaGFyZUNvdW50O1xuICAgIH07XG5cbiAgICBmYi5sb2dpbiA9IGZ1bmN0aW9uIChhcmdzKSB7XG4gICAgICB2YXIgZGVmZXJyZWQgPSAkcS5kZWZlcigpO1xuICAgICAgRkIubG9naW4oZnVuY3Rpb24gKHJlc3BvbnNlKSB7XG4gICAgICAgIGRlZmVycmVkLnJlc29sdmUocmVzcG9uc2UpO1xuICAgICAgfSwgYXJncyk7XG4gICAgICByZXR1cm4gZGVmZXJyZWQucHJvbWlzZTtcbiAgICB9O1xuXG4gICAgZmIuc2hhcmUgPSBmdW5jdGlvbiAodXJpLCBvcHRpb25zKSB7XG4gICAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgICAgIHZhciBxdWVyeVByZWZpeCA9ICc/JztcbiAgICAgIGlmICh1cmkuaW5jbHVkZXMoJz8nKSkge1xuICAgICAgICBxdWVyeVByZWZpeCA9ICcmJztcbiAgICAgIH1cbiAgICAgIHZhciByZWYgPSBxdWVyeVByZWZpeC5jb25jYXQoJ3JlZj1nb2dvX18nLCBvcHRpb25zLmlnZ3JlZiB8fCAnZmJsaycpO1xuICAgICAgcmVmID0gb3B0aW9ucy5hY2NvdW50X2lkID8gcmVmLmNvbmNhdCgnX18nLCBvcHRpb25zLmFjY291bnRfaWQpIDogcmVmO1xuICAgICAgdmFyIHV0bXMgPSBvcHRpb25zLnV0bV9xdWVyeV9zdHJpbmcgPyAnJicuY29uY2F0KG9wdGlvbnMudXRtX3F1ZXJ5X3N0cmluZykgOiAnJztcbiAgICAgIHZhciBwYXJhbXMgPSB7XG4gICAgICAgIG1ldGhvZDogJ3NoYXJlJyxcbiAgICAgICAgaHJlZjogdXJpICsgcmVmICsgdXRtcyxcbiAgICAgICAgcmVkaXJlY3RfdXJpOiB1cmlcbiAgICAgIH07XG4gICAgICByZXR1cm4gZmIudWkocGFyYW1zKTtcbiAgICB9O1xuXG4gICAgZmIudWkgPSBmdW5jdGlvbiAocGFyYW1zKSB7XG4gICAgICB2YXIgZGVmZXJyZWQgPSAkcS5kZWZlcigpO1xuICAgICAgJHRpbWVvdXQoKCkgPT4geyAvLyBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vYS8xODk5NjA0MlxuICAgICAgICBGQi51aShwYXJhbXMsIGZ1bmN0aW9uIChyZXNwb25zZSkge1xuICAgICAgICAgIGlmIChyZXNwb25zZSAmJiAhcmVzcG9uc2UuZXJyb3JfY29kZSkge1xuICAgICAgICAgICAgZGVmZXJyZWQucmVzb2x2ZShyZXNwb25zZSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGRlZmVycmVkLnJlamVjdChyZXNwb25zZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIGRlZmVycmVkLnByb21pc2U7XG4gICAgfTtcblxuICAgIGZiLmZldGNoU2hhcmVDb3VudCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmICghc2hhcmVDb3VudEZldGNoZWQpIHtcbiAgICAgICAgLyogbGV0cyByZW1vdmUgdGhlIGdvbiBkZXBlbmRlbmN5IGZyb20gdGhpcyBzZXJ2aWNlIGJ5IGFsbG93aW5nXG4gICAgICAgICAqIHNoYXJlQ291bnRVcmwgdG8gYmUgc3BlY2lmaWVkIGZyb20gdGhlIG91dHNpZGUuIEZvciBub3csXG4gICAgICAgICAqIGZhbGxiYWNrIHRvIGxvb2tpbmcgb24gdGhlIGdvbiB3aGVuIHRoYXQncyBub3QgcHJlc2VudFxuICAgICAgICAgKi9cbiAgICAgICAgdmFyIHVybCA9IHNoYXJlQ291bnRVcmwgfHwgKGdvbi51cmxzICYmIGdvbi51cmxzLmZiX3NoYXJlX2NvdW50X3VybCk7XG4gICAgICAgICRodHRwLmdldCh1cmwpLnRoZW4oZnVuY3Rpb24ocmVzKSB7XG4gICAgICAgICAgZmIuc2hhcmVDb3VudCA9IHJlcy5kYXRhLmZiX3NoYXJlX2NvdW50O1xuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgc2hhcmVDb3VudEZldGNoZWQgPSB0cnVlO1xuICAgIH07XG5cbiAgICBmYi5yZWZyZXNoQWxsV2lkZ2V0cyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIEZCLlhGQk1MLnBhcnNlKCk7XG4gICAgICB9IGNhdGNoIChleCkge1xuICAgICAgfVxuICAgIH07XG5cbiAgICByZXR1cm4gZmI7XG4gIH1cblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIC4vYW5jaWxsYXJ5L3V0aWxzL2ZiLWZhY3RvcnkuanNcbiAqKi8iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUhBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7O0FBR0E7QUFDQTtBQUNBOztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUFJQTs7O0FBR0E7QUFDQTs7Ozs7QUFLQTtBQUNBO0FBQ0E7Ozs7QUFJQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7OztBQUlBO0FBekVBIiwic291cmNlUm9vdCI6IiJ9");

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

	eval("'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nfunction fbTrackingPixel($window, $log, gon) {\n  return {\n    restrict: 'E',\n    scope: {},\n    template: __webpack_require__(103),\n    link: function link(scope, element, attrs) {\n      scope.shouldTrack = gon.tracking_info && gon.tracking_info.fb_pixel_id && (gon.tracking_info.amount || gon.tracking_info.amount === 0) && gon.tracking_info.currency_iso_code;\n\n      angular.element(document).ready(function () {\n        if (scope.shouldTrack) {\n          var _fbq;\n          if (!$window._fbq) {\n            $window._fbq = [];\n          }\n          _fbq = $window._fbq;\n          if (!_fbq.loaded) {\n            var fbds = void 0;\n            fbds = document.createElement('script');\n            fbds.async = true;\n            fbds.src = '//connect.facebook.net/en_US/fbds.js';\n            var s = document.getElementsByTagName('script')[0];\n            s.parentNode.insertBefore(fbds, s);\n            _fbq.loaded = true;\n          }\n          $window._fbq = $window._fbq || [];\n          _fbq.push(['track', gon.tracking_info.fb_pixel_id, {\n            'value': gon.tracking_info.amount,\n            'currency': gon.tracking_info.currency_iso_code\n          }]);\n        } else {\n          $log.debug('fbTrackingPixel directive rendered without required attributes: pixel-id, amount, currencyIsoCode');\n        }\n      });\n\n      scope.fbTrackingPixelUrl = function () {\n        return \"https://www.facebook.com/tr?ev=\" + gon.tracking_info.fb_pixel_id + \"&cd[value]=\" + gon.tracking_info.amount + \"&cd[currency]=\" + gon.tracking_info.currency_iso_code + \"&noscript=1\";\n      };\n    }\n  };\n}\nfbTrackingPixel.$inject = ['$window', '$log', 'gon'];\n\nexports.default = fbTrackingPixel;\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTAyLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vYW5jaWxsYXJ5L3V0aWxzL2ZiLXRyYWNraW5nLXBpeGVsLWRpcmVjdGl2ZS5qcz9jNDczIl0sInNvdXJjZXNDb250ZW50IjpbImZ1bmN0aW9uIGZiVHJhY2tpbmdQaXhlbCAoJHdpbmRvdywgJGxvZywgZ29uKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHJlc3RyaWN0OiAnRScsXG4gICAgICBzY29wZToge30sXG4gICAgICB0ZW1wbGF0ZTogcmVxdWlyZSgnLi9mYl90cmFja2luZ19waXhlbC5odG1sJyksXG4gICAgICBsaW5rOiBmdW5jdGlvbihzY29wZSwgZWxlbWVudCwgYXR0cnMpIHtcbiAgICAgICAgc2NvcGUuc2hvdWxkVHJhY2sgPSBnb24udHJhY2tpbmdfaW5mbyAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvbi50cmFja2luZ19pbmZvLmZiX3BpeGVsX2lkICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGdvbi50cmFja2luZ19pbmZvLmFtb3VudCB8fCBnb24udHJhY2tpbmdfaW5mby5hbW91bnQgPT09IDApICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ29uLnRyYWNraW5nX2luZm8uY3VycmVuY3lfaXNvX2NvZGU7XG5cbiAgICAgICAgYW5ndWxhci5lbGVtZW50KGRvY3VtZW50KS5yZWFkeShmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgaWYgKHNjb3BlLnNob3VsZFRyYWNrKSB7XG4gICAgICAgICAgICB2YXIgX2ZicTtcbiAgICAgICAgICAgIGlmICghJHdpbmRvdy5fZmJxKSB7XG4gICAgICAgICAgICAgICR3aW5kb3cuX2ZicSA9IFtdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgX2ZicSA9ICR3aW5kb3cuX2ZicTtcbiAgICAgICAgICAgIGlmICghX2ZicS5sb2FkZWQpIHtcbiAgICAgICAgICAgICAgbGV0IGZiZHM7XG4gICAgICAgICAgICAgIGZiZHMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzY3JpcHQnKTtcbiAgICAgICAgICAgICAgZmJkcy5hc3luYyA9IHRydWU7XG4gICAgICAgICAgICAgIGZiZHMuc3JjID0gJy8vY29ubmVjdC5mYWNlYm9vay5uZXQvZW5fVVMvZmJkcy5qcyc7XG4gICAgICAgICAgICAgIHZhciBzID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ3NjcmlwdCcpWzBdO1xuICAgICAgICAgICAgICBzLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGZiZHMsIHMpO1xuICAgICAgICAgICAgICBfZmJxLmxvYWRlZCA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAkd2luZG93Ll9mYnEgPSAkd2luZG93Ll9mYnEgfHwgW107XG4gICAgICAgICAgICBfZmJxLnB1c2goWyd0cmFjaycsIGdvbi50cmFja2luZ19pbmZvLmZiX3BpeGVsX2lkLCB7XG4gICAgICAgICAgICAgICd2YWx1ZSc6IGdvbi50cmFja2luZ19pbmZvLmFtb3VudCxcbiAgICAgICAgICAgICAgJ2N1cnJlbmN5JzogZ29uLnRyYWNraW5nX2luZm8uY3VycmVuY3lfaXNvX2NvZGVcbiAgICAgICAgICAgIH1dKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgJGxvZy5kZWJ1ZygnZmJUcmFja2luZ1BpeGVsIGRpcmVjdGl2ZSByZW5kZXJlZCB3aXRob3V0IHJlcXVpcmVkIGF0dHJpYnV0ZXM6IHBpeGVsLWlkLCBhbW91bnQsIGN1cnJlbmN5SXNvQ29kZScpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgc2NvcGUuZmJUcmFja2luZ1BpeGVsVXJsID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgcmV0dXJuIFwiaHR0cHM6Ly93d3cuZmFjZWJvb2suY29tL3RyP2V2PVwiICsgZ29uLnRyYWNraW5nX2luZm8uZmJfcGl4ZWxfaWQgK1xuICAgICAgICAgICAgXCImY2RbdmFsdWVdPVwiICsgZ29uLnRyYWNraW5nX2luZm8uYW1vdW50ICtcbiAgICAgICAgICAgIFwiJmNkW2N1cnJlbmN5XT1cIiArIGdvbi50cmFja2luZ19pbmZvLmN1cnJlbmN5X2lzb19jb2RlICtcbiAgICAgICAgICAgIFwiJm5vc2NyaXB0PTFcIjtcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9O1xuICB9XG5mYlRyYWNraW5nUGl4ZWwuJGluamVjdCA9IFsnJHdpbmRvdycsICckbG9nJywgJ2dvbiddO1xuXG5leHBvcnQgZGVmYXVsdCBmYlRyYWNraW5nUGl4ZWw7XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiAuL2FuY2lsbGFyeS91dGlscy9mYi10cmFja2luZy1waXhlbC1kaXJlY3RpdmUuanNcbiAqKi8iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBOztBQUhBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOzs7O0FBSUE7QUFDQTs7Ozs7QUFRQTtBQUNBO0FBQUEiLCJzb3VyY2VSb290IjoiIn0=");

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

	eval("module.exports = \"<noscript ng-if=\\\"shouldTrack\\\"><img height=\\\"1\\\" width=\\\"1\\\" alt=\\\"\\\" style=\\\"display:none\\\" src=\\\"{{fbTrackingPixelUrl()}}\\\"></noscript>\\n\";\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTAzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vYW5jaWxsYXJ5L3V0aWxzL2ZiX3RyYWNraW5nX3BpeGVsLmh0bWw/Y2VlZCJdLCJzb3VyY2VzQ29udGVudCI6WyJtb2R1bGUuZXhwb3J0cyA9IFwiPG5vc2NyaXB0IG5nLWlmPVxcXCJzaG91bGRUcmFja1xcXCI+PGltZyBoZWlnaHQ9XFxcIjFcXFwiIHdpZHRoPVxcXCIxXFxcIiBhbHQ9XFxcIlxcXCIgc3R5bGU9XFxcImRpc3BsYXk6bm9uZVxcXCIgc3JjPVxcXCJ7e2ZiVHJhY2tpbmdQaXhlbFVybCgpfX1cXFwiPjwvbm9zY3JpcHQ+XFxuXCI7XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL2FuY2lsbGFyeS91dGlscy9mYl90cmFja2luZ19waXhlbC5odG1sXG4gKiogbW9kdWxlIGlkID0gMTAzXG4gKiogbW9kdWxlIGNodW5rcyA9IDI0XG4gKiovIl0sIm1hcHBpbmdzIjoiQUFBQSIsInNvdXJjZVJvb3QiOiIifQ==");

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

	eval("'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nexports.default = function (browser, $sce, $rootScope, $window, $cookies) {\n  var flashService = {};\n  flashService.flashes = [];\n\n  flashService.replaceMessage = function (alertLevel, message, options) {\n    _.remove(flashService.flashes, function () {\n      return true;\n    });\n    flashService.addMessage(alertLevel, message, options);\n  };\n\n  flashService.addMessage = function (alertLevel, message, options) {\n    options = _.merge({}, options);\n    if (options.html) {\n      flashService.flashes.push({\n        messageHtml: $sce.trustAsHtml(message),\n        alertLevel: alertLevel\n      });\n    } else {\n      flashService.flashes.push({\n        messageText: message,\n        alertLevel: alertLevel\n      });\n    }\n    if (options.fromOutsideAngular) {\n      $rootScope.$digest();\n    }\n    browser.scrollToTop();\n  };\n\n  flashService.addMessageForAfterRedirect = function (alertLevel, message, options) {\n    $cookies.putObject('flash', { alertLevel: alertLevel, messageText: message, options: options });\n  };\n\n  flashService.getMessageForAfterRedirect = function () {\n    var previousFlash = $cookies.getObject('flash');\n\n    if (previousFlash !== undefined) {\n      $cookies.remove('flash');\n    }\n\n    return previousFlash;\n  };\n\n  $window.showFlashMessage = function (args) {\n    flashService.addMessage(args.alertLevel, args.messageText, { fromOutsideAngular: true, html: args.html });\n  };\n\n  var previousFlash = flashService.getMessageForAfterRedirect();\n\n  if (previousFlash !== undefined) {\n    flashService.addMessage(previousFlash.alertLevel, previousFlash.messageText, previousFlash.options);\n  }\n\n  return flashService;\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTA0LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vYW5jaWxsYXJ5L3V0aWxzL2ZsYXNoLWZhY3RvcnkuanM/ZWIzNiJdLCJzb3VyY2VzQ29udGVudCI6WyIvKkBuZ0luamVjdCovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiAoYnJvd3NlciwgJHNjZSwgJHJvb3RTY29wZSwgJHdpbmRvdywgJGNvb2tpZXMpIHtcbiAgICB2YXIgZmxhc2hTZXJ2aWNlID0ge307XG4gICAgZmxhc2hTZXJ2aWNlLmZsYXNoZXMgPSBbXTtcblxuICAgIGZsYXNoU2VydmljZS5yZXBsYWNlTWVzc2FnZSA9IGZ1bmN0aW9uIChhbGVydExldmVsLCBtZXNzYWdlLCBvcHRpb25zKSB7XG4gICAgICBfLnJlbW92ZShmbGFzaFNlcnZpY2UuZmxhc2hlcywgZnVuY3Rpb24oKSB7IHJldHVybiB0cnVlOyB9KTtcbiAgICAgIGZsYXNoU2VydmljZS5hZGRNZXNzYWdlKGFsZXJ0TGV2ZWwsIG1lc3NhZ2UsIG9wdGlvbnMpO1xuICAgIH07XG5cbiAgICBmbGFzaFNlcnZpY2UuYWRkTWVzc2FnZSA9IGZ1bmN0aW9uIChhbGVydExldmVsLCBtZXNzYWdlLCBvcHRpb25zKSB7XG4gICAgICBvcHRpb25zID0gXy5tZXJnZSh7fSwgb3B0aW9ucyk7XG4gICAgICBpZiAob3B0aW9ucy5odG1sKSB7XG4gICAgICAgIGZsYXNoU2VydmljZS5mbGFzaGVzLnB1c2goe1xuICAgICAgICAgIG1lc3NhZ2VIdG1sOiAkc2NlLnRydXN0QXNIdG1sKG1lc3NhZ2UpLFxuICAgICAgICAgIGFsZXJ0TGV2ZWw6IGFsZXJ0TGV2ZWxcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBmbGFzaFNlcnZpY2UuZmxhc2hlcy5wdXNoKHtcbiAgICAgICAgICBtZXNzYWdlVGV4dDogbWVzc2FnZSxcbiAgICAgICAgICBhbGVydExldmVsOiBhbGVydExldmVsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgaWYgKG9wdGlvbnMuZnJvbU91dHNpZGVBbmd1bGFyKSB7XG4gICAgICAgICRyb290U2NvcGUuJGRpZ2VzdCgpO1xuICAgICAgfVxuICAgICAgYnJvd3Nlci5zY3JvbGxUb1RvcCgpO1xuICAgIH07XG5cbiAgICBmbGFzaFNlcnZpY2UuYWRkTWVzc2FnZUZvckFmdGVyUmVkaXJlY3QgPSBmdW5jdGlvbiAoYWxlcnRMZXZlbCwgbWVzc2FnZSwgb3B0aW9ucykge1xuICAgICAgJGNvb2tpZXMucHV0T2JqZWN0KCdmbGFzaCcsIHsgYWxlcnRMZXZlbDogYWxlcnRMZXZlbCwgbWVzc2FnZVRleHQ6IG1lc3NhZ2UsIG9wdGlvbnM6IG9wdGlvbnMgfSk7XG4gICAgfTtcblxuICAgIGZsYXNoU2VydmljZS5nZXRNZXNzYWdlRm9yQWZ0ZXJSZWRpcmVjdCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBwcmV2aW91c0ZsYXNoID0gJGNvb2tpZXMuZ2V0T2JqZWN0KCdmbGFzaCcpO1xuXG4gICAgICBpZiAocHJldmlvdXNGbGFzaCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICRjb29raWVzLnJlbW92ZSgnZmxhc2gnKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHByZXZpb3VzRmxhc2g7XG4gICAgfTtcblxuICAgICR3aW5kb3cuc2hvd0ZsYXNoTWVzc2FnZSA9IGZ1bmN0aW9uKGFyZ3MpIHtcbiAgICAgIGZsYXNoU2VydmljZS5hZGRNZXNzYWdlKGFyZ3MuYWxlcnRMZXZlbCwgYXJncy5tZXNzYWdlVGV4dCwge2Zyb21PdXRzaWRlQW5ndWxhcjogdHJ1ZSwgaHRtbDogYXJncy5odG1sfSk7XG4gICAgfTtcblxuICAgIHZhciBwcmV2aW91c0ZsYXNoID0gZmxhc2hTZXJ2aWNlLmdldE1lc3NhZ2VGb3JBZnRlclJlZGlyZWN0KCk7XG5cbiAgICBpZiAocHJldmlvdXNGbGFzaCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBmbGFzaFNlcnZpY2UuYWRkTWVzc2FnZShwcmV2aW91c0ZsYXNoLmFsZXJ0TGV2ZWwsIHByZXZpb3VzRmxhc2gubWVzc2FnZVRleHQsIHByZXZpb3VzRmxhc2gub3B0aW9ucyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZsYXNoU2VydmljZTtcbiAgfVxuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogLi9hbmNpbGxhcnkvdXRpbHMvZmxhc2gtZmFjdG9yeS5qc1xuICoqLyJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBSkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBOztBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7O0FBRUE7OztBQUdBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBOzs7QUFHQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFwREEiLCJzb3VyY2VSb290IjoiIn0=");

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

	eval("\"use strict\";\n\nfroogaloop.$inject = [\"$window\"];\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = froogaloop;\n/*@ngInject*/\nfunction froogaloop($window) {\n  return function (sel) {\n    return $window.$f(sel);\n  };\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTA1LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vYW5jaWxsYXJ5L3V0aWxzL2Zyb29nYWxvb3AtZmFjdG9yeS5qcz9iNjkyIl0sInNvdXJjZXNDb250ZW50IjpbIi8qQG5nSW5qZWN0Ki9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGZyb29nYWxvb3AoJHdpbmRvdykge1xuICAgIHJldHVybiBmdW5jdGlvbihzZWwpIHtcbiAgICAgIHJldHVybiAkd2luZG93LiRmKHNlbCk7XG4gICAgfTtcbiAgfVxuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogLi9hbmNpbGxhcnkvdXRpbHMvZnJvb2dhbG9vcC1mYWN0b3J5LmpzXG4gKiovIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBOztBQUNBO0FBQ0E7O0FBRUE7O0FBSkE7QUFDQTtBQUNBOztBQUZBIiwic291cmNlUm9vdCI6IiJ9");

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

	eval("\"use strict\";\n\ngogoLocation.$inject = [\"$window\"];\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nexports.default = gogoLocation;\n/*@ngInject*/\nfunction gogoLocation($window) {\n    return $window.location;\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTA2LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vYW5jaWxsYXJ5L3V0aWxzL2dvZ28tbG9jYXRpb24tZmFjdG9yeS5qcz8zMmQ0Il0sInNvdXJjZXNDb250ZW50IjpbIi8qQG5nSW5qZWN0Ki9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdvZ29Mb2NhdGlvbiAoJHdpbmRvdykge1xuICAgIHJldHVybiAkd2luZG93LmxvY2F0aW9uO1xuICB9XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiAuL2FuY2lsbGFyeS91dGlscy9nb2dvLWxvY2F0aW9uLWZhY3RvcnkuanNcbiAqKi8iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7O0FBQ0E7QUFDQTs7QUFFQTs7QUFKQTtBQUNBO0FBREEiLCJzb3VyY2VSb290IjoiIn0=");

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

	eval("'use strict';\n\ngplus.$inject = [\"$window\"];\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = gplus;\n/*@ngInject*/\nfunction gplus($window) {\n  return {\n    refreshAllWidgets: function refreshAllWidgets() {\n      var gapi = $window.gapi;\n      if (typeof gapi !== 'undefined') {\n        gapi.plusone.go();\n      }\n    }\n  };\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTA3LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vYW5jaWxsYXJ5L3V0aWxzL2dwbHVzLWZhY3RvcnkuanM/MjE5NyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKkBuZ0luamVjdCovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBncGx1cygkd2luZG93KSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHJlZnJlc2hBbGxXaWRnZXRzOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBnYXBpID0gJHdpbmRvdy5nYXBpO1xuICAgICAgICBpZiAodHlwZW9mKGdhcGkpICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgIGdhcGkucGx1c29uZS5nbygpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogLi9hbmNpbGxhcnkvdXRpbHMvZ3BsdXMtZmFjdG9yeS5qc1xuICoqLyJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTs7QUFDQTtBQUNBOztBQUVBOztBQUpBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQUxBIiwic291cmNlUm9vdCI6IiJ9");

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

	eval("'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = htmlCharCounter;\n/*@ngInject*/\nfunction htmlCharCounter() {\n  function stripTags(html) {\n    return $('<div>' + html + '</div>').text().replace(/\\t+/g, \" \").replace(/\\n/g, \"\").replace(/^\\s/g, \"\");\n  }\n\n  return function (input, maxLength, delimiter) {\n    var charsLeft = maxLength;\n\n    if (input) {\n      charsLeft = maxLength - stripTags(input).length;\n    }\n\n    return charsLeft.toString() + \" \" + (delimiter ? delimiter : \"/\") + \" \" + maxLength;\n  };\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTA4LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vYW5jaWxsYXJ5L3V0aWxzL2h0bWwtY2hhci1jb3VudGVyLWZpbHRlci5qcz9kMDRjIl0sInNvdXJjZXNDb250ZW50IjpbIi8qQG5nSW5qZWN0Ki9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGh0bWxDaGFyQ291bnRlcigpIHtcbiAgZnVuY3Rpb24gc3RyaXBUYWdzKGh0bWwpIHtcbiAgICByZXR1cm4gJCgnPGRpdj4nICsgaHRtbCArICc8L2Rpdj4nKS50ZXh0KCkucmVwbGFjZSgvXFx0Ky9nLCBcIiBcIikucmVwbGFjZSgvXFxuL2csIFwiXCIpLnJlcGxhY2UoL15cXHMvZywgXCJcIik7XG4gIH1cblxuICByZXR1cm4gZnVuY3Rpb24oaW5wdXQsIG1heExlbmd0aCwgZGVsaW1pdGVyKSB7XG4gICAgdmFyIGNoYXJzTGVmdCA9IG1heExlbmd0aDtcblxuICAgIGlmKGlucHV0KSB7XG4gICAgICBjaGFyc0xlZnQgPSBtYXhMZW5ndGggLSBzdHJpcFRhZ3MoaW5wdXQpLmxlbmd0aDtcbiAgICB9XG5cbiAgICByZXR1cm4gY2hhcnNMZWZ0LnRvU3RyaW5nKCkgKyBcIiBcIiArIChkZWxpbWl0ZXIgPyBkZWxpbWl0ZXIgOiBcIi9cIikgKyBcIiBcIiArIG1heExlbmd0aDtcbiAgfTtcbn1cblxuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogLi9hbmNpbGxhcnkvdXRpbHMvaHRtbC1jaGFyLWNvdW50ZXItZmlsdGVyLmpzXG4gKiovIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFKQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBOztBQVpBIiwic291cmNlUm9vdCI6IiJ9");

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

	eval("\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = htmlWrapped;\n/*@ngInject*/\nfunction htmlWrapped() {\n  return function (text, tag) {\n    var tagEl = $(tag);\n    tagEl.text(text);\n    var wrapperEl = $(\"<div>\");\n    wrapperEl.append(tagEl);\n    return wrapperEl.html();\n  };\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTA5LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vYW5jaWxsYXJ5L3V0aWxzL2h0bWwtd3JhcHBlZC1maWx0ZXIuanM/OTkzNCJdLCJzb3VyY2VzQ29udGVudCI6WyIvKkBuZ0luamVjdCovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBodG1sV3JhcHBlZCgpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24odGV4dCwgdGFnKSB7XG4gICAgICB2YXIgdGFnRWwgPSAkKHRhZyk7XG4gICAgICB0YWdFbC50ZXh0KHRleHQpO1xuICAgICAgdmFyIHdyYXBwZXJFbCA9ICQoXCI8ZGl2PlwiKTtcbiAgICAgIHdyYXBwZXJFbC5hcHBlbmQodGFnRWwpO1xuICAgICAgcmV0dXJuIHdyYXBwZXJFbC5odG1sKCk7XG4gICAgfTtcbiAgfVxuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogLi9hbmNpbGxhcnkvdXRpbHMvaHRtbC13cmFwcGVkLWZpbHRlci5qc1xuICoqLyJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBSkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBTkEiLCJzb3VyY2VSb290IjoiIn0=");

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

	eval("\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nexports.default = function (i18n) {\n  return {\n    scope: true,\n    link: function link($scope) {\n      $scope.i18n = i18n;\n    }\n  };\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTEwLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vYW5jaWxsYXJ5L3V0aWxzL2kxOG4tZGlyZWN0aXZlLmpzPzI3NWQiXSwic291cmNlc0NvbnRlbnQiOlsiLypAbmdJbmplY3QqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gKGkxOG4pIHtcbiAgICByZXR1cm4ge1xuICAgICAgc2NvcGU6IHRydWUsXG4gICAgICBsaW5rOiBmdW5jdGlvbigkc2NvcGUpIHtcbiAgICAgICAgJHNjb3BlLmkxOG4gPSBpMThuO1xuICAgICAgfVxuICAgIH07XG59XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiAuL2FuY2lsbGFyeS91dGlscy9pMThuLWRpcmVjdGl2ZS5qc1xuICoqLyJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBSkE7QUFDQTtBQUNBO0FBQ0E7OztBQUpBIiwic291cmNlUm9vdCI6IiJ9");

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

	eval("'use strict';\n\ni18n.$inject = [\"$sce\", \"gon\", \"I18nRails\", \"$window\"];\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = i18n;\n/*@ngInject*/\nfunction i18n($sce, gon, I18nRails, $window) {\n  var currentLocale = I18nRails.locale;\n  if ($window.moment) {\n    $window.moment.locale(currentLocale);\n  }\n  var domain = gon.domain;\n\n  function translateAdjustingKeyForGenerosity(key, options) {\n    if (typeof gon !== 'undefined' && domain === 'generosity') {\n      return generosityTranslate(key, options);\n    } else {\n      return translate(key, options);\n    }\n  }\n\n  function generosityTranslate(key, options) {\n    var genKey = 'generosity.' + key;\n    return translate(genKey, options);\n  }\n\n  function localeGlobalSafe(func) {\n    var oldLocale = I18nRails.locale;\n    var returnVal = null;\n    I18nRails.locale = currentLocale;\n    try {\n      returnVal = func();\n    } finally {\n      I18nRails.locale = oldLocale;\n    }\n    return returnVal;\n  }\n\n  function translate(key, options) {\n    return localeGlobalSafe(function () {\n      var translation = I18nRails.t(key, options);\n      if (key.match(/html$/)) {\n        return $sce.trustAsHtml(translation);\n      } else {\n        return translation;\n      }\n    });\n  }\n\n  function strftime(object, format) {\n    return localeGlobalSafe(function () {\n      return I18nRails.strftime(object, format);\n    });\n  }\n\n  function setLocale(newLocale) {\n    currentLocale = newLocale || I18nRails.defaultLocale;\n    this.locale = currentLocale;\n    $window.moment.locale(currentLocale);\n  }\n\n  function localize(date, options) {\n    return localeGlobalSafe(function () {\n      var format = I18nRails.lookup('date.formats.' + options.format);\n      return strftime(date, format);\n    });\n  }\n\n  return {\n    locale: currentLocale,\n    setLocale: setLocale,\n    strftime: strftime,\n    t: translate,\n    l: localize,\n    pt: translateAdjustingKeyForGenerosity\n  };\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTExLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vYW5jaWxsYXJ5L3V0aWxzL2kxOG4tZmFjdG9yeS5qcz84NTFjIl0sInNvdXJjZXNDb250ZW50IjpbIi8qQG5nSW5qZWN0Ki9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGkxOG4gKCRzY2UsIGdvbiwgSTE4blJhaWxzLCAkd2luZG93KSB7XG4gICAgdmFyIGN1cnJlbnRMb2NhbGUgPSBJMThuUmFpbHMubG9jYWxlO1xuICAgIGlmICgkd2luZG93Lm1vbWVudCkge1xuICAgICAkd2luZG93Lm1vbWVudC5sb2NhbGUoY3VycmVudExvY2FsZSk7XG4gICAgfVxuICAgIHZhciBkb21haW4gPSBnb24uZG9tYWluO1xuXG4gICAgZnVuY3Rpb24gdHJhbnNsYXRlQWRqdXN0aW5nS2V5Rm9yR2VuZXJvc2l0eSAoa2V5LCBvcHRpb25zKSB7XG4gICAgICBpZiAodHlwZW9mKGdvbikgIT09ICd1bmRlZmluZWQnICYmIGRvbWFpbiA9PT0gJ2dlbmVyb3NpdHknKSB7XG4gICAgICAgIHJldHVybiBnZW5lcm9zaXR5VHJhbnNsYXRlKGtleSwgb3B0aW9ucyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gdHJhbnNsYXRlKGtleSwgb3B0aW9ucyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2VuZXJvc2l0eVRyYW5zbGF0ZShrZXksIG9wdGlvbnMpIHtcbiAgICAgIHZhciBnZW5LZXkgPSAnZ2VuZXJvc2l0eS4nICsga2V5O1xuICAgICAgcmV0dXJuIHRyYW5zbGF0ZShnZW5LZXksIG9wdGlvbnMpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGxvY2FsZUdsb2JhbFNhZmUoZnVuYykge1xuICAgICAgdmFyIG9sZExvY2FsZSA9IEkxOG5SYWlscy5sb2NhbGU7XG4gICAgICB2YXIgcmV0dXJuVmFsID0gbnVsbDtcbiAgICAgIEkxOG5SYWlscy5sb2NhbGUgPSBjdXJyZW50TG9jYWxlO1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuVmFsID0gZnVuYygpO1xuICAgICAgfVxuICAgICAgZmluYWxseSB7XG4gICAgICAgIEkxOG5SYWlscy5sb2NhbGUgPSBvbGRMb2NhbGU7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmV0dXJuVmFsO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHRyYW5zbGF0ZSAoa2V5LCBvcHRpb25zKSB7XG4gICAgICByZXR1cm4gbG9jYWxlR2xvYmFsU2FmZShmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIHRyYW5zbGF0aW9uID0gSTE4blJhaWxzLnQoa2V5LCBvcHRpb25zKTtcbiAgICAgICAgaWYgKGtleS5tYXRjaCgvaHRtbCQvKSkge1xuICAgICAgICAgIHJldHVybiAkc2NlLnRydXN0QXNIdG1sKHRyYW5zbGF0aW9uKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gdHJhbnNsYXRpb247XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHN0cmZ0aW1lIChvYmplY3QsIGZvcm1hdCkge1xuICAgICAgcmV0dXJuIGxvY2FsZUdsb2JhbFNhZmUoZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gSTE4blJhaWxzLnN0cmZ0aW1lKG9iamVjdCwgZm9ybWF0KTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHNldExvY2FsZSAobmV3TG9jYWxlKSB7XG4gICAgICBjdXJyZW50TG9jYWxlID0gbmV3TG9jYWxlIHx8IEkxOG5SYWlscy5kZWZhdWx0TG9jYWxlO1xuICAgICAgdGhpcy5sb2NhbGUgPSBjdXJyZW50TG9jYWxlO1xuICAgICAgJHdpbmRvdy5tb21lbnQubG9jYWxlKGN1cnJlbnRMb2NhbGUpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGxvY2FsaXplKGRhdGUsIG9wdGlvbnMpIHtcbiAgICAgIHJldHVybiBsb2NhbGVHbG9iYWxTYWZlKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGZvcm1hdCA9IEkxOG5SYWlscy5sb29rdXAoJ2RhdGUuZm9ybWF0cy4nICsgb3B0aW9ucy5mb3JtYXQpO1xuICAgICAgICByZXR1cm4gc3RyZnRpbWUoZGF0ZSwgZm9ybWF0KTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBsb2NhbGU6IGN1cnJlbnRMb2NhbGUsXG4gICAgICBzZXRMb2NhbGU6IHNldExvY2FsZSxcbiAgICAgIHN0cmZ0aW1lOiBzdHJmdGltZSxcbiAgICAgIHQ6IHRyYW5zbGF0ZSxcbiAgICAgIGw6IGxvY2FsaXplLFxuICAgICAgcHQ6IHRyYW5zbGF0ZUFkanVzdGluZ0tleUZvckdlbmVyb3NpdHlcbiAgICB9O1xuICB9XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiAuL2FuY2lsbGFyeS91dGlscy9pMThuLWZhY3RvcnkuanNcbiAqKi8iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7O0FBQ0E7QUFDQTs7QUFFQTs7QUFKQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQUlBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTs7QUFFQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7O0FBS0E7QUFDQTtBQUNBOzs7O0FBSUE7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBOzs7O0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBckVBIiwic291cmNlUm9vdCI6IiJ9");

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

	eval("'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n   value: true\n});\n\nexports.default = function ($log, $window, gon) {\n   var iggAirbrake = new _iggAirbrake2.default($log, $window, gon);\n   return iggAirbrake;\n};\n\nvar _iggAirbrake = __webpack_require__(113);\n\nvar _iggAirbrake2 = _interopRequireDefault(_iggAirbrake);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTEyLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vYW5jaWxsYXJ5L3V0aWxzL2lnZy1haXJicmFrZS1zZXJ2aWNlLmpzPzg5MjIiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IElnZ0FpcmJyYWtlIGZyb20gJy4vaWdnLWFpcmJyYWtlLnRzJztcbi8qQG5nSW5qZWN0Ki9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKCRsb2csICR3aW5kb3csIGdvbikge1xuICAgbGV0IGlnZ0FpcmJyYWtlID0gbmV3IElnZ0FpcmJyYWtlKCRsb2csICR3aW5kb3csIGdvbik7XG4gICByZXR1cm4gaWdnQWlyYnJha2U7XG59XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiAuL2FuY2lsbGFyeS91dGlscy9pZ2ctYWlyYnJha2Utc2VydmljZS5qc1xuICoqLyJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBSEE7QUFDQTs7O0FBSkE7QUFDQTtBQVlBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9");

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

	eval("\"use strict\";\n__webpack_require__(114);\nvar igg_airbrake_exception_filter_ts_1 = __webpack_require__(126);\nvar isProduction = function (hostname) { return /.com$/g.test(hostname); };\nvar isStaging = function (hostname) { return /.net$/g.test(hostname); };\nvar IggAirbrake = (function () {\n    function IggAirbrake($log, $window, gon) {\n        var _this = this;\n        this.$log = $log;\n        this.$window = $window;\n        this.gon = gon;\n        this._client = function () {\n            var client = new _this.$window.airbrakeClient({\n                projectId: _this.gon.airbrake_conf.javascript_project_id,\n                projectKey: _this.gon.airbrake_conf.javascript_api_key\n            });\n            client.addFilter(function (notice) {\n                notice.context.environment = _this.gon.airbrake_conf.environment;\n                return notice;\n            });\n            var exceptionFilter = _this.exceptionFilter.filter.bind(_this.exceptionFilter);\n            client.addFilter(exceptionFilter);\n            return client;\n        };\n        this.handle = this.handle.bind(this);\n        this.exceptionFilter = new igg_airbrake_exception_filter_ts_1.default();\n    }\n    IggAirbrake.prototype.shouldLogErrors = function () {\n        try {\n            var hostname = this.$window.location.hostname;\n            return isProduction(hostname) || isStaging(hostname);\n        }\n        catch (err) {\n            return false;\n        }\n    };\n    IggAirbrake.prototype.canLogErrors = function () {\n        return (this.gon.airbrake_conf && this.gon.airbrake_conf.javascript_api_key && this.$window.airbrakeClient);\n    };\n    IggAirbrake.prototype._notifyClient = function (error, params) {\n        this.$log.error(error.message);\n        try {\n            this._client().notify({\n                error: error,\n                params: params\n            });\n        }\n        catch (e) {\n            this.$log.error(\"Failed to notify Airbrake due to the following error\");\n            this.$log.error(e);\n        }\n    };\n    IggAirbrake.prototype.addExceptionFilter = function (regex) {\n        this.exceptionFilter.addExceptionFilter(regex);\n    };\n    IggAirbrake.prototype.handle = function (exception, cause, notificationParams) {\n        if (notificationParams === void 0) { notificationParams = {}; }\n        if (this.canLogErrors() && this.shouldLogErrors()) {\n            var params = notificationParams;\n            if (cause) {\n                params.angular_cause = cause;\n            }\n            if (this.gon.current_user) {\n                params.current_user_id = this.gon.current_user.id;\n            }\n            this._notifyClient(exception, params);\n        }\n        else if (this.$window.skipExceptions !== true) {\n            throw exception;\n        }\n    };\n    IggAirbrake.prototype.logError = function (message, errorParams) {\n        if (errorParams === void 0) { errorParams = {}; }\n        if (message && this.canLogErrors() && this.shouldLogErrors()) {\n            var error = new Error(message);\n            this._notifyClient(error, errorParams);\n        }\n    };\n    return IggAirbrake;\n}());\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.default = IggAirbrake;\n\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTEzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vYW5jaWxsYXJ5L3V0aWxzL2lnZy1haXJicmFrZS50cz9iOTQxIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBcImV4cG9zZT9haXJicmFrZUNsaWVudCFhaXJicmFrZS1qc1wiO1xuaW1wb3J0IElnZ0FpcmJyYWtlRXhjZXB0aW9uRmlsdGVyIGZyb20gXCIuL2lnZy1haXJicmFrZS1leGNlcHRpb24tZmlsdGVyLnRzXCI7XG5cbmxldCBpc1Byb2R1Y3Rpb24gPSAoaG9zdG5hbWU6IHN0cmluZykgPT4gLy5jb20kL2cudGVzdChob3N0bmFtZSk7XG5sZXQgaXNTdGFnaW5nID0gKGhvc3RuYW1lOiBzdHJpbmcpID0+IC8ubmV0JC9nLnRlc3QoaG9zdG5hbWUpO1xuXG5pbnRlcmZhY2UgSWdnV2luZG93IGV4dGVuZHMgV2luZG93IHtcbiAgYWlyYnJha2VDbGllbnQ6IGFueTtcbiAgc2tpcEV4Y2VwdGlvbnM6IGJvb2xlYW47XG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIElnZ0FpcmJyYWtlIHtcbiAgZXhjZXB0aW9uRmlsdGVyOiBJZ2dBaXJicmFrZUV4Y2VwdGlvbkZpbHRlcjtcblxuICBjb25zdHJ1Y3RvcihwdWJsaWMgJGxvZzogYW5ndWxhci5JTG9nU2VydmljZSwgcHVibGljICR3aW5kb3c6IElnZ1dpbmRvdywgcHVibGljIGdvbikge1xuICAgIHRoaXMuaGFuZGxlID0gdGhpcy5oYW5kbGUuYmluZCh0aGlzKTtcbiAgICB0aGlzLmV4Y2VwdGlvbkZpbHRlciA9IG5ldyBJZ2dBaXJicmFrZUV4Y2VwdGlvbkZpbHRlcigpO1xuICB9XG5cbiAgc2hvdWxkTG9nRXJyb3JzKCkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBob3N0bmFtZSA9IHRoaXMuJHdpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZTtcbiAgICAgIHJldHVybiBpc1Byb2R1Y3Rpb24oaG9zdG5hbWUpIHx8IGlzU3RhZ2luZyhob3N0bmFtZSk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgY2FuTG9nRXJyb3JzKCkge1xuICAgIHJldHVybiAodGhpcy5nb24uYWlyYnJha2VfY29uZiAmJiB0aGlzLmdvbi5haXJicmFrZV9jb25mLmphdmFzY3JpcHRfYXBpX2tleSAmJiB0aGlzLiR3aW5kb3cuYWlyYnJha2VDbGllbnQpO1xuICB9XG5cbiAgX2NsaWVudCA9ICgpID0+IHtcbiAgICBsZXQgY2xpZW50ID0gbmV3IHRoaXMuJHdpbmRvdy5haXJicmFrZUNsaWVudCh7XG4gICAgICBwcm9qZWN0SWQ6IHRoaXMuZ29uLmFpcmJyYWtlX2NvbmYuamF2YXNjcmlwdF9wcm9qZWN0X2lkLFxuICAgICAgcHJvamVjdEtleTogdGhpcy5nb24uYWlyYnJha2VfY29uZi5qYXZhc2NyaXB0X2FwaV9rZXlcbiAgICB9KTtcbiAgICBjbGllbnQuYWRkRmlsdGVyKCAobm90aWNlKSA9PiB7XG4gICAgICBub3RpY2UuY29udGV4dC5lbnZpcm9ubWVudCA9IHRoaXMuZ29uLmFpcmJyYWtlX2NvbmYuZW52aXJvbm1lbnQ7XG4gICAgICByZXR1cm4gbm90aWNlO1xuICAgIH0pO1xuICAgIGxldCBleGNlcHRpb25GaWx0ZXIgPSB0aGlzLmV4Y2VwdGlvbkZpbHRlci5maWx0ZXIuYmluZCh0aGlzLmV4Y2VwdGlvbkZpbHRlcik7XG4gICAgY2xpZW50LmFkZEZpbHRlcihleGNlcHRpb25GaWx0ZXIpO1xuICAgIHJldHVybiBjbGllbnQ7XG4gIH07XG5cbiAgX25vdGlmeUNsaWVudChlcnJvciwgcGFyYW1zKSB7XG4gICAgdGhpcy4kbG9nLmVycm9yKGVycm9yLm1lc3NhZ2UpO1xuICAgIHRyeSB7XG4gICAgICB0aGlzLl9jbGllbnQoKS5ub3RpZnkoe1xuICAgICAgICBlcnJvcjogZXJyb3IsXG4gICAgICAgIHBhcmFtczogcGFyYW1zXG4gICAgICB9KTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0aGlzLiRsb2cuZXJyb3IoXCJGYWlsZWQgdG8gbm90aWZ5IEFpcmJyYWtlIGR1ZSB0byB0aGUgZm9sbG93aW5nIGVycm9yXCIpO1xuICAgICAgdGhpcy4kbG9nLmVycm9yKGUpO1xuICAgIH1cbiAgfVxuXG4gIGFkZEV4Y2VwdGlvbkZpbHRlcihyZWdleDogUmVnRXhwKSB7XG4gICAgdGhpcy5leGNlcHRpb25GaWx0ZXIuYWRkRXhjZXB0aW9uRmlsdGVyKHJlZ2V4KTtcbiAgfVxuXG4gIGhhbmRsZShleGNlcHRpb246IEVycm9yLCBjYXVzZTogc3RyaW5nLCBub3RpZmljYXRpb25QYXJhbXM6IGFueSA9IHt9KSB7XG4gICAgaWYgKHRoaXMuY2FuTG9nRXJyb3JzKCkgJiYgdGhpcy5zaG91bGRMb2dFcnJvcnMoKSkge1xuICAgICAgbGV0IHBhcmFtcyA9IG5vdGlmaWNhdGlvblBhcmFtcztcbiAgICAgIGlmIChjYXVzZSkge1xuICAgICAgICBwYXJhbXMuYW5ndWxhcl9jYXVzZSA9IGNhdXNlO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMuZ29uLmN1cnJlbnRfdXNlcikge1xuICAgICAgICBwYXJhbXMuY3VycmVudF91c2VyX2lkID0gdGhpcy5nb24uY3VycmVudF91c2VyLmlkO1xuICAgICAgfVxuICAgICAgdGhpcy5fbm90aWZ5Q2xpZW50KGV4Y2VwdGlvbiwgcGFyYW1zKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuJHdpbmRvdy5za2lwRXhjZXB0aW9ucyAhPT0gdHJ1ZSkge1xuICAgICAgdGhyb3cgZXhjZXB0aW9uO1xuICAgIH1cbiAgfVxuXG4gIGxvZ0Vycm9yKG1lc3NhZ2UsIGVycm9yUGFyYW1zID0ge30pIHtcbiAgICBpZiAobWVzc2FnZSAmJiB0aGlzLmNhbkxvZ0Vycm9ycygpICYmIHRoaXMuc2hvdWxkTG9nRXJyb3JzKCkpIHtcbiAgICAgIGxldCBlcnJvciA9IG5ldyBFcnJvcihtZXNzYWdlKTtcbiAgICAgIHRoaXMuX25vdGlmeUNsaWVudChlcnJvciwgZXJyb3JQYXJhbXMpO1xuICAgIH1cbiAgfVxufVxuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogLi9+L3RzbGludC1sb2FkZXIhLi9hbmNpbGxhcnkvdXRpbHMvaWdnLWFpcmJyYWtlLnRzXG4gKiovIl0sIm1hcHBpbmdzIjoiO0FBQUE7QUFDQTtBQUVBO0FBQ0E7QUFPQTtBQUdBO0FBSEE7QUFHQTtBQUFBO0FBQUE7QUFrQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUE3QkE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBZ0JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUF6RUE7QUF5RUE7Iiwic291cmNlUm9vdCI6IiJ9");

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

	eval("/* WEBPACK VAR INJECTION */(function(global) {module.exports = global[\"airbrakeClient\"] = __webpack_require__(115);\n/* WEBPACK VAR INJECTION */}.call(exports, (function() { return this; }())))\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTE0LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9haXJicmFrZS1qcy9saWIvY2xpZW50LmpzP2M5NzMiXSwic291cmNlc0NvbnRlbnQiOlsibW9kdWxlLmV4cG9ydHMgPSBnbG9iYWxbXCJhaXJicmFrZUNsaWVudFwiXSA9IHJlcXVpcmUoXCItIS9ob21lL2RlcGxveWVyL2RlcGxveW1lbnQvanMvbm9kZV9tb2R1bGVzL2FpcmJyYWtlLWpzL2xpYi9jbGllbnQuanNcIik7XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vZXhwb3NlLWxvYWRlcj9haXJicmFrZUNsaWVudCEuL34vYWlyYnJha2UtanMvbGliL2NsaWVudC5qc1xuICoqIG1vZHVsZSBpZCA9IDExNFxuICoqIG1vZHVsZSBjaHVua3MgPSAyNFxuICoqLyJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");

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

	eval("/* WEBPACK VAR INJECTION */(function(global) {(function() {\n  var Client, Promise, makeOnErrorHandler, merge;\n\n  __webpack_require__(116);\n\n  merge = __webpack_require__(117);\n\n  Promise = __webpack_require__(118);\n\n  makeOnErrorHandler = function(notifier) {\n    return function(message, file, line, column, error) {\n      if (error) {\n        return notifier.notify(error);\n      } else {\n        return notifier.notify({\n          error: {\n            message: message,\n            fileName: file,\n            lineNumber: line,\n            columnNumber: column || 0\n          }\n        });\n      }\n    };\n  };\n\n  Client = (function() {\n    function Client(opts) {\n      var reporter;\n      if (opts == null) {\n        opts = {};\n      }\n      this._projectId = opts.projectId || 0;\n      this._projectKey = opts.projectKey || '';\n      this._host = opts.host || 'https://api.airbrake.io';\n      this._processor = null;\n      this._reporters = [];\n      this._filters = [];\n      if (opts.processor !== void 0) {\n        this._processor = opts.processor;\n      } else {\n        this._processor = __webpack_require__(119);\n      }\n      if (opts.reporter !== void 0) {\n        this.addReporter(opts.reporter);\n      } else {\n        if ('withCredentials' in new global.XMLHttpRequest()) {\n          reporter = 'compat';\n        } else {\n          reporter = 'jsonp';\n        }\n        this.addReporter(reporter);\n      }\n      this.addFilter(__webpack_require__(120));\n      this.onerror = makeOnErrorHandler(this);\n      if ((global.onerror == null) && opts.onerror !== false) {\n        global.onerror = this.onerror;\n      }\n    }\n\n    Client.prototype.setProject = function(id, key) {\n      this._projectId = id;\n      return this._projectKey = key;\n    };\n\n    Client.prototype.setHost = function(host) {\n      return this._host = host;\n    };\n\n    Client.prototype.addContext = function(context) {\n      if (typeof console !== \"undefined\" && console !== null) {\n        if (typeof console.warn === \"function\") {\n          console.warn('airbrake: addContext is deprecated, please use addFilter');\n        }\n      }\n      return this.addFilter(function(notice) {\n        notice.context = merge({}, context, notice.context);\n        return notice;\n      });\n    };\n\n    Client.prototype.setEnvironmentName = function(envName) {\n      if (typeof console !== \"undefined\" && console !== null) {\n        if (typeof console.warn === \"function\") {\n          console.warn('airbrake: setEnvironmentName is deprecated, please use addFilter');\n        }\n      }\n      return this.addFilter(function(notice) {\n        if (notice.context.environment == null) {\n          notice.context.environment = envName;\n        }\n        return notice;\n      });\n    };\n\n    Client.prototype.addParams = function(params) {\n      if (typeof console !== \"undefined\" && console !== null) {\n        if (typeof console.warn === \"function\") {\n          console.warn('airbrake: addParams is deprecated, please use addFilter');\n        }\n      }\n      return this.addFilter(function(notice) {\n        notice.params = merge({}, params, notice.params);\n        return notice;\n      });\n    };\n\n    Client.prototype.addEnvironment = function(env) {\n      if (typeof console !== \"undefined\" && console !== null) {\n        if (typeof console.warn === \"function\") {\n          console.warn('airbrake: addEnvironment is deprecated, please use addFilter');\n        }\n      }\n      return this.addFilter(function(notice) {\n        notice.environment = merge({}, env, notice.environment);\n        return notice;\n      });\n    };\n\n    Client.prototype.addSession = function(session) {\n      if (typeof console !== \"undefined\" && console !== null) {\n        if (typeof console.warn === \"function\") {\n          console.warn('airbrake: addSession is deprecated, please use addFilter');\n        }\n      }\n      return this.addFilter(function(notice) {\n        notice.session = merge({}, session, notice.session);\n        return notice;\n      });\n    };\n\n    Client.prototype.addReporter = function(reporter) {\n      switch (reporter) {\n        case 'compat':\n          reporter = __webpack_require__(121);\n          break;\n        case 'xhr':\n          reporter = __webpack_require__(124);\n          break;\n        case 'jsonp':\n          reporter = __webpack_require__(125);\n      }\n      return this._reporters.push(reporter);\n    };\n\n    Client.prototype.addFilter = function(filter) {\n      return this._filters.push(filter);\n    };\n\n    Client.prototype.notify = function(err) {\n      var defContext, promise, ref;\n      defContext = {\n        language: 'JavaScript',\n        sourceMapEnabled: true\n      };\n      if ((ref = global.navigator) != null ? ref.userAgent : void 0) {\n        defContext.userAgent = global.navigator.userAgent;\n      }\n      if (global.location) {\n        defContext.url = String(global.location);\n        defContext.rootDirectory = global.location.protocol + '//' + global.location.host;\n      }\n      promise = new Promise();\n      this._processor(err.error || err, (function(_this) {\n        return function(processorName, errInfo) {\n          var filterFn, j, k, len, len1, n, notice, opts, ref1, ref2, reporterFn;\n          notice = {\n            errors: [errInfo],\n            context: merge(defContext, err.context),\n            params: err.params || {},\n            environment: err.environment || {},\n            session: err.session || {}\n          };\n          notice.context.notifier = {\n            name: 'airbrake-js-' + processorName,\n            version: '0.5.9',\n            url: 'https://github.com/airbrake/airbrake-js'\n          };\n          ref1 = _this._filters;\n          for (j = 0, len = ref1.length; j < len; j++) {\n            filterFn = ref1[j];\n            n = filterFn(notice);\n            if (n === null || n === false) {\n              return;\n            }\n            if (n.errors != null) {\n              notice = n;\n            } else {\n              if (typeof console !== \"undefined\" && console !== null) {\n                if (typeof console.warn === \"function\") {\n                  console.warn('airbrake: filter must return notice or null to ignore the notice');\n                }\n              }\n            }\n          }\n          opts = {\n            projectId: _this._projectId,\n            projectKey: _this._projectKey,\n            host: _this._host\n          };\n          ref2 = _this._reporters;\n          for (k = 0, len1 = ref2.length; k < len1; k++) {\n            reporterFn = ref2[k];\n            reporterFn(notice, opts, promise);\n          }\n        };\n      })(this));\n      return promise;\n    };\n\n    Client.prototype.push = function(err) {\n      if (typeof console !== \"undefined\" && console !== null) {\n        if (typeof console.warn === \"function\") {\n          console.warn('airbrake: push is deprecated, please use notify');\n        }\n      }\n      return this.notify(err);\n    };\n\n    Client.prototype._wrapArguments = function(args) {\n      var arg, i, j, len;\n      for (i = j = 0, len = args.length; j < len; i = ++j) {\n        arg = args[i];\n        if (typeof arg === 'function') {\n          args[i] = this.wrap(arg);\n        }\n      }\n      return args;\n    };\n\n    Client.prototype.wrap = function(fn) {\n      var airbrakeWrapper, prop, self;\n      if (fn.__airbrake__) {\n        return fn;\n      }\n      self = this;\n      airbrakeWrapper = function() {\n        var args, exc;\n        args = self._wrapArguments(arguments);\n        try {\n          return fn.apply(this, args);\n        } catch (_error) {\n          exc = _error;\n          args = Array.prototype.slice.call(arguments);\n          self.notify({\n            error: exc,\n            params: {\n              \"arguments\": args\n            }\n          });\n        }\n      };\n      for (prop in fn) {\n        if (fn.hasOwnProperty(prop)) {\n          airbrakeWrapper[prop] = fn[prop];\n        }\n      }\n      airbrakeWrapper.__airbrake__ = true;\n      airbrakeWrapper.__inner__ = fn;\n      return airbrakeWrapper;\n    };\n\n    return Client;\n\n  })();\n\n  module.exports = Client;\n\n}).call(this);\n\n/* WEBPACK VAR INJECTION */}.call(exports, (function() { return this; }())))\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTE1LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9haXJicmFrZS1qcy9saWIvY2xpZW50LmpzPzI0M2IiXSwic291cmNlc0NvbnRlbnQiOlsiKGZ1bmN0aW9uKCkge1xuICB2YXIgQ2xpZW50LCBQcm9taXNlLCBtYWtlT25FcnJvckhhbmRsZXIsIG1lcmdlO1xuXG4gIHJlcXVpcmUoJy4vaW50ZXJuYWwvY29tcGF0Jyk7XG5cbiAgbWVyZ2UgPSByZXF1aXJlKCcuL2ludGVybmFsL21lcmdlJyk7XG5cbiAgUHJvbWlzZSA9IHJlcXVpcmUoJy4vaW50ZXJuYWwvcHJvbWlzZScpO1xuXG4gIG1ha2VPbkVycm9ySGFuZGxlciA9IGZ1bmN0aW9uKG5vdGlmaWVyKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKG1lc3NhZ2UsIGZpbGUsIGxpbmUsIGNvbHVtbiwgZXJyb3IpIHtcbiAgICAgIGlmIChlcnJvcikge1xuICAgICAgICByZXR1cm4gbm90aWZpZXIubm90aWZ5KGVycm9yKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBub3RpZmllci5ub3RpZnkoe1xuICAgICAgICAgIGVycm9yOiB7XG4gICAgICAgICAgICBtZXNzYWdlOiBtZXNzYWdlLFxuICAgICAgICAgICAgZmlsZU5hbWU6IGZpbGUsXG4gICAgICAgICAgICBsaW5lTnVtYmVyOiBsaW5lLFxuICAgICAgICAgICAgY29sdW1uTnVtYmVyOiBjb2x1bW4gfHwgMFxuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfTtcbiAgfTtcblxuICBDbGllbnQgPSAoZnVuY3Rpb24oKSB7XG4gICAgZnVuY3Rpb24gQ2xpZW50KG9wdHMpIHtcbiAgICAgIHZhciByZXBvcnRlcjtcbiAgICAgIGlmIChvcHRzID09IG51bGwpIHtcbiAgICAgICAgb3B0cyA9IHt9O1xuICAgICAgfVxuICAgICAgdGhpcy5fcHJvamVjdElkID0gb3B0cy5wcm9qZWN0SWQgfHwgMDtcbiAgICAgIHRoaXMuX3Byb2plY3RLZXkgPSBvcHRzLnByb2plY3RLZXkgfHwgJyc7XG4gICAgICB0aGlzLl9ob3N0ID0gb3B0cy5ob3N0IHx8ICdodHRwczovL2FwaS5haXJicmFrZS5pbyc7XG4gICAgICB0aGlzLl9wcm9jZXNzb3IgPSBudWxsO1xuICAgICAgdGhpcy5fcmVwb3J0ZXJzID0gW107XG4gICAgICB0aGlzLl9maWx0ZXJzID0gW107XG4gICAgICBpZiAob3B0cy5wcm9jZXNzb3IgIT09IHZvaWQgMCkge1xuICAgICAgICB0aGlzLl9wcm9jZXNzb3IgPSBvcHRzLnByb2Nlc3NvcjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuX3Byb2Nlc3NvciA9IHJlcXVpcmUoJy4vcHJvY2Vzc29ycy9zdGFjaycpO1xuICAgICAgfVxuICAgICAgaWYgKG9wdHMucmVwb3J0ZXIgIT09IHZvaWQgMCkge1xuICAgICAgICB0aGlzLmFkZFJlcG9ydGVyKG9wdHMucmVwb3J0ZXIpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKCd3aXRoQ3JlZGVudGlhbHMnIGluIG5ldyBnbG9iYWwuWE1MSHR0cFJlcXVlc3QoKSkge1xuICAgICAgICAgIHJlcG9ydGVyID0gJ2NvbXBhdCc7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVwb3J0ZXIgPSAnanNvbnAnO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuYWRkUmVwb3J0ZXIocmVwb3J0ZXIpO1xuICAgICAgfVxuICAgICAgdGhpcy5hZGRGaWx0ZXIocmVxdWlyZSgnLi9pbnRlcm5hbC9kZWZhdWx0X2ZpbHRlcicpKTtcbiAgICAgIHRoaXMub25lcnJvciA9IG1ha2VPbkVycm9ySGFuZGxlcih0aGlzKTtcbiAgICAgIGlmICgoZ2xvYmFsLm9uZXJyb3IgPT0gbnVsbCkgJiYgb3B0cy5vbmVycm9yICE9PSBmYWxzZSkge1xuICAgICAgICBnbG9iYWwub25lcnJvciA9IHRoaXMub25lcnJvcjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBDbGllbnQucHJvdG90eXBlLnNldFByb2plY3QgPSBmdW5jdGlvbihpZCwga2V5KSB7XG4gICAgICB0aGlzLl9wcm9qZWN0SWQgPSBpZDtcbiAgICAgIHJldHVybiB0aGlzLl9wcm9qZWN0S2V5ID0ga2V5O1xuICAgIH07XG5cbiAgICBDbGllbnQucHJvdG90eXBlLnNldEhvc3QgPSBmdW5jdGlvbihob3N0KSB7XG4gICAgICByZXR1cm4gdGhpcy5faG9zdCA9IGhvc3Q7XG4gICAgfTtcblxuICAgIENsaWVudC5wcm90b3R5cGUuYWRkQ29udGV4dCA9IGZ1bmN0aW9uKGNvbnRleHQpIHtcbiAgICAgIGlmICh0eXBlb2YgY29uc29sZSAhPT0gXCJ1bmRlZmluZWRcIiAmJiBjb25zb2xlICE9PSBudWxsKSB7XG4gICAgICAgIGlmICh0eXBlb2YgY29uc29sZS53YXJuID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICBjb25zb2xlLndhcm4oJ2FpcmJyYWtlOiBhZGRDb250ZXh0IGlzIGRlcHJlY2F0ZWQsIHBsZWFzZSB1c2UgYWRkRmlsdGVyJyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzLmFkZEZpbHRlcihmdW5jdGlvbihub3RpY2UpIHtcbiAgICAgICAgbm90aWNlLmNvbnRleHQgPSBtZXJnZSh7fSwgY29udGV4dCwgbm90aWNlLmNvbnRleHQpO1xuICAgICAgICByZXR1cm4gbm90aWNlO1xuICAgICAgfSk7XG4gICAgfTtcblxuICAgIENsaWVudC5wcm90b3R5cGUuc2V0RW52aXJvbm1lbnROYW1lID0gZnVuY3Rpb24oZW52TmFtZSkge1xuICAgICAgaWYgKHR5cGVvZiBjb25zb2xlICE9PSBcInVuZGVmaW5lZFwiICYmIGNvbnNvbGUgIT09IG51bGwpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBjb25zb2xlLndhcm4gPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgIGNvbnNvbGUud2FybignYWlyYnJha2U6IHNldEVudmlyb25tZW50TmFtZSBpcyBkZXByZWNhdGVkLCBwbGVhc2UgdXNlIGFkZEZpbHRlcicpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcy5hZGRGaWx0ZXIoZnVuY3Rpb24obm90aWNlKSB7XG4gICAgICAgIGlmIChub3RpY2UuY29udGV4dC5lbnZpcm9ubWVudCA9PSBudWxsKSB7XG4gICAgICAgICAgbm90aWNlLmNvbnRleHQuZW52aXJvbm1lbnQgPSBlbnZOYW1lO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBub3RpY2U7XG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgQ2xpZW50LnByb3RvdHlwZS5hZGRQYXJhbXMgPSBmdW5jdGlvbihwYXJhbXMpIHtcbiAgICAgIGlmICh0eXBlb2YgY29uc29sZSAhPT0gXCJ1bmRlZmluZWRcIiAmJiBjb25zb2xlICE9PSBudWxsKSB7XG4gICAgICAgIGlmICh0eXBlb2YgY29uc29sZS53YXJuID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICBjb25zb2xlLndhcm4oJ2FpcmJyYWtlOiBhZGRQYXJhbXMgaXMgZGVwcmVjYXRlZCwgcGxlYXNlIHVzZSBhZGRGaWx0ZXInKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMuYWRkRmlsdGVyKGZ1bmN0aW9uKG5vdGljZSkge1xuICAgICAgICBub3RpY2UucGFyYW1zID0gbWVyZ2Uoe30sIHBhcmFtcywgbm90aWNlLnBhcmFtcyk7XG4gICAgICAgIHJldHVybiBub3RpY2U7XG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgQ2xpZW50LnByb3RvdHlwZS5hZGRFbnZpcm9ubWVudCA9IGZ1bmN0aW9uKGVudikge1xuICAgICAgaWYgKHR5cGVvZiBjb25zb2xlICE9PSBcInVuZGVmaW5lZFwiICYmIGNvbnNvbGUgIT09IG51bGwpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBjb25zb2xlLndhcm4gPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgIGNvbnNvbGUud2FybignYWlyYnJha2U6IGFkZEVudmlyb25tZW50IGlzIGRlcHJlY2F0ZWQsIHBsZWFzZSB1c2UgYWRkRmlsdGVyJyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzLmFkZEZpbHRlcihmdW5jdGlvbihub3RpY2UpIHtcbiAgICAgICAgbm90aWNlLmVudmlyb25tZW50ID0gbWVyZ2Uoe30sIGVudiwgbm90aWNlLmVudmlyb25tZW50KTtcbiAgICAgICAgcmV0dXJuIG5vdGljZTtcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICBDbGllbnQucHJvdG90eXBlLmFkZFNlc3Npb24gPSBmdW5jdGlvbihzZXNzaW9uKSB7XG4gICAgICBpZiAodHlwZW9mIGNvbnNvbGUgIT09IFwidW5kZWZpbmVkXCIgJiYgY29uc29sZSAhPT0gbnVsbCkge1xuICAgICAgICBpZiAodHlwZW9mIGNvbnNvbGUud2FybiA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgY29uc29sZS53YXJuKCdhaXJicmFrZTogYWRkU2Vzc2lvbiBpcyBkZXByZWNhdGVkLCBwbGVhc2UgdXNlIGFkZEZpbHRlcicpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcy5hZGRGaWx0ZXIoZnVuY3Rpb24obm90aWNlKSB7XG4gICAgICAgIG5vdGljZS5zZXNzaW9uID0gbWVyZ2Uoe30sIHNlc3Npb24sIG5vdGljZS5zZXNzaW9uKTtcbiAgICAgICAgcmV0dXJuIG5vdGljZTtcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICBDbGllbnQucHJvdG90eXBlLmFkZFJlcG9ydGVyID0gZnVuY3Rpb24ocmVwb3J0ZXIpIHtcbiAgICAgIHN3aXRjaCAocmVwb3J0ZXIpIHtcbiAgICAgICAgY2FzZSAnY29tcGF0JzpcbiAgICAgICAgICByZXBvcnRlciA9IHJlcXVpcmUoJy4vcmVwb3J0ZXJzL2NvbXBhdCcpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICd4aHInOlxuICAgICAgICAgIHJlcG9ydGVyID0gcmVxdWlyZSgnLi9yZXBvcnRlcnMveGhyJyk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ2pzb25wJzpcbiAgICAgICAgICByZXBvcnRlciA9IHJlcXVpcmUoJy4vcmVwb3J0ZXJzL2pzb25wJyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcy5fcmVwb3J0ZXJzLnB1c2gocmVwb3J0ZXIpO1xuICAgIH07XG5cbiAgICBDbGllbnQucHJvdG90eXBlLmFkZEZpbHRlciA9IGZ1bmN0aW9uKGZpbHRlcikge1xuICAgICAgcmV0dXJuIHRoaXMuX2ZpbHRlcnMucHVzaChmaWx0ZXIpO1xuICAgIH07XG5cbiAgICBDbGllbnQucHJvdG90eXBlLm5vdGlmeSA9IGZ1bmN0aW9uKGVycikge1xuICAgICAgdmFyIGRlZkNvbnRleHQsIHByb21pc2UsIHJlZjtcbiAgICAgIGRlZkNvbnRleHQgPSB7XG4gICAgICAgIGxhbmd1YWdlOiAnSmF2YVNjcmlwdCcsXG4gICAgICAgIHNvdXJjZU1hcEVuYWJsZWQ6IHRydWVcbiAgICAgIH07XG4gICAgICBpZiAoKHJlZiA9IGdsb2JhbC5uYXZpZ2F0b3IpICE9IG51bGwgPyByZWYudXNlckFnZW50IDogdm9pZCAwKSB7XG4gICAgICAgIGRlZkNvbnRleHQudXNlckFnZW50ID0gZ2xvYmFsLm5hdmlnYXRvci51c2VyQWdlbnQ7XG4gICAgICB9XG4gICAgICBpZiAoZ2xvYmFsLmxvY2F0aW9uKSB7XG4gICAgICAgIGRlZkNvbnRleHQudXJsID0gU3RyaW5nKGdsb2JhbC5sb2NhdGlvbik7XG4gICAgICAgIGRlZkNvbnRleHQucm9vdERpcmVjdG9yeSA9IGdsb2JhbC5sb2NhdGlvbi5wcm90b2NvbCArICcvLycgKyBnbG9iYWwubG9jYXRpb24uaG9zdDtcbiAgICAgIH1cbiAgICAgIHByb21pc2UgPSBuZXcgUHJvbWlzZSgpO1xuICAgICAgdGhpcy5fcHJvY2Vzc29yKGVyci5lcnJvciB8fCBlcnIsIChmdW5jdGlvbihfdGhpcykge1xuICAgICAgICByZXR1cm4gZnVuY3Rpb24ocHJvY2Vzc29yTmFtZSwgZXJySW5mbykge1xuICAgICAgICAgIHZhciBmaWx0ZXJGbiwgaiwgaywgbGVuLCBsZW4xLCBuLCBub3RpY2UsIG9wdHMsIHJlZjEsIHJlZjIsIHJlcG9ydGVyRm47XG4gICAgICAgICAgbm90aWNlID0ge1xuICAgICAgICAgICAgZXJyb3JzOiBbZXJySW5mb10sXG4gICAgICAgICAgICBjb250ZXh0OiBtZXJnZShkZWZDb250ZXh0LCBlcnIuY29udGV4dCksXG4gICAgICAgICAgICBwYXJhbXM6IGVyci5wYXJhbXMgfHwge30sXG4gICAgICAgICAgICBlbnZpcm9ubWVudDogZXJyLmVudmlyb25tZW50IHx8IHt9LFxuICAgICAgICAgICAgc2Vzc2lvbjogZXJyLnNlc3Npb24gfHwge31cbiAgICAgICAgICB9O1xuICAgICAgICAgIG5vdGljZS5jb250ZXh0Lm5vdGlmaWVyID0ge1xuICAgICAgICAgICAgbmFtZTogJ2FpcmJyYWtlLWpzLScgKyBwcm9jZXNzb3JOYW1lLFxuICAgICAgICAgICAgdmVyc2lvbjogJzAuNS45JyxcbiAgICAgICAgICAgIHVybDogJ2h0dHBzOi8vZ2l0aHViLmNvbS9haXJicmFrZS9haXJicmFrZS1qcydcbiAgICAgICAgICB9O1xuICAgICAgICAgIHJlZjEgPSBfdGhpcy5fZmlsdGVycztcbiAgICAgICAgICBmb3IgKGogPSAwLCBsZW4gPSByZWYxLmxlbmd0aDsgaiA8IGxlbjsgaisrKSB7XG4gICAgICAgICAgICBmaWx0ZXJGbiA9IHJlZjFbal07XG4gICAgICAgICAgICBuID0gZmlsdGVyRm4obm90aWNlKTtcbiAgICAgICAgICAgIGlmIChuID09PSBudWxsIHx8IG4gPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChuLmVycm9ycyAhPSBudWxsKSB7XG4gICAgICAgICAgICAgIG5vdGljZSA9IG47XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBpZiAodHlwZW9mIGNvbnNvbGUgIT09IFwidW5kZWZpbmVkXCIgJiYgY29uc29sZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgY29uc29sZS53YXJuID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybignYWlyYnJha2U6IGZpbHRlciBtdXN0IHJldHVybiBub3RpY2Ugb3IgbnVsbCB0byBpZ25vcmUgdGhlIG5vdGljZScpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBvcHRzID0ge1xuICAgICAgICAgICAgcHJvamVjdElkOiBfdGhpcy5fcHJvamVjdElkLFxuICAgICAgICAgICAgcHJvamVjdEtleTogX3RoaXMuX3Byb2plY3RLZXksXG4gICAgICAgICAgICBob3N0OiBfdGhpcy5faG9zdFxuICAgICAgICAgIH07XG4gICAgICAgICAgcmVmMiA9IF90aGlzLl9yZXBvcnRlcnM7XG4gICAgICAgICAgZm9yIChrID0gMCwgbGVuMSA9IHJlZjIubGVuZ3RoOyBrIDwgbGVuMTsgaysrKSB7XG4gICAgICAgICAgICByZXBvcnRlckZuID0gcmVmMltrXTtcbiAgICAgICAgICAgIHJlcG9ydGVyRm4obm90aWNlLCBvcHRzLCBwcm9taXNlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICB9KSh0aGlzKSk7XG4gICAgICByZXR1cm4gcHJvbWlzZTtcbiAgICB9O1xuXG4gICAgQ2xpZW50LnByb3RvdHlwZS5wdXNoID0gZnVuY3Rpb24oZXJyKSB7XG4gICAgICBpZiAodHlwZW9mIGNvbnNvbGUgIT09IFwidW5kZWZpbmVkXCIgJiYgY29uc29sZSAhPT0gbnVsbCkge1xuICAgICAgICBpZiAodHlwZW9mIGNvbnNvbGUud2FybiA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgY29uc29sZS53YXJuKCdhaXJicmFrZTogcHVzaCBpcyBkZXByZWNhdGVkLCBwbGVhc2UgdXNlIG5vdGlmeScpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcy5ub3RpZnkoZXJyKTtcbiAgICB9O1xuXG4gICAgQ2xpZW50LnByb3RvdHlwZS5fd3JhcEFyZ3VtZW50cyA9IGZ1bmN0aW9uKGFyZ3MpIHtcbiAgICAgIHZhciBhcmcsIGksIGosIGxlbjtcbiAgICAgIGZvciAoaSA9IGogPSAwLCBsZW4gPSBhcmdzLmxlbmd0aDsgaiA8IGxlbjsgaSA9ICsraikge1xuICAgICAgICBhcmcgPSBhcmdzW2ldO1xuICAgICAgICBpZiAodHlwZW9mIGFyZyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIGFyZ3NbaV0gPSB0aGlzLndyYXAoYXJnKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGFyZ3M7XG4gICAgfTtcblxuICAgIENsaWVudC5wcm90b3R5cGUud3JhcCA9IGZ1bmN0aW9uKGZuKSB7XG4gICAgICB2YXIgYWlyYnJha2VXcmFwcGVyLCBwcm9wLCBzZWxmO1xuICAgICAgaWYgKGZuLl9fYWlyYnJha2VfXykge1xuICAgICAgICByZXR1cm4gZm47XG4gICAgICB9XG4gICAgICBzZWxmID0gdGhpcztcbiAgICAgIGFpcmJyYWtlV3JhcHBlciA9IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgYXJncywgZXhjO1xuICAgICAgICBhcmdzID0gc2VsZi5fd3JhcEFyZ3VtZW50cyhhcmd1bWVudHMpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHJldHVybiBmbi5hcHBseSh0aGlzLCBhcmdzKTtcbiAgICAgICAgfSBjYXRjaCAoX2Vycm9yKSB7XG4gICAgICAgICAgZXhjID0gX2Vycm9yO1xuICAgICAgICAgIGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO1xuICAgICAgICAgIHNlbGYubm90aWZ5KHtcbiAgICAgICAgICAgIGVycm9yOiBleGMsXG4gICAgICAgICAgICBwYXJhbXM6IHtcbiAgICAgICAgICAgICAgXCJhcmd1bWVudHNcIjogYXJnc1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgICAgZm9yIChwcm9wIGluIGZuKSB7XG4gICAgICAgIGlmIChmbi5oYXNPd25Qcm9wZXJ0eShwcm9wKSkge1xuICAgICAgICAgIGFpcmJyYWtlV3JhcHBlcltwcm9wXSA9IGZuW3Byb3BdO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBhaXJicmFrZVdyYXBwZXIuX19haXJicmFrZV9fID0gdHJ1ZTtcbiAgICAgIGFpcmJyYWtlV3JhcHBlci5fX2lubmVyX18gPSBmbjtcbiAgICAgIHJldHVybiBhaXJicmFrZVdyYXBwZXI7XG4gICAgfTtcblxuICAgIHJldHVybiBDbGllbnQ7XG5cbiAgfSkoKTtcblxuICBtb2R1bGUuZXhwb3J0cyA9IENsaWVudDtcblxufSkuY2FsbCh0aGlzKTtcblxuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2FpcmJyYWtlLWpzL2xpYi9jbGllbnQuanNcbiAqKiBtb2R1bGUgaWQgPSAxMTVcbiAqKiBtb2R1bGUgY2h1bmtzID0gMjRcbiAqKi8iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");

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

	eval("(function() {\n  var base;\n\n  if ((base = Array.prototype).indexOf == null) {\n    base.indexOf = function(obj, start) {\n      var i, j, ref, ref1;\n      start = start || 0;\n      for (i = j = ref = start, ref1 = this.length; ref <= ref1 ? j < ref1 : j > ref1; i = ref <= ref1 ? ++j : --j) {\n        if (this[i] === obj) {\n          return i;\n        }\n      }\n      return -1;\n    };\n  }\n\n}).call(this);\n\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTE2LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9haXJicmFrZS1qcy9saWIvaW50ZXJuYWwvY29tcGF0LmpzP2FhNjgiXSwic291cmNlc0NvbnRlbnQiOlsiKGZ1bmN0aW9uKCkge1xuICB2YXIgYmFzZTtcblxuICBpZiAoKGJhc2UgPSBBcnJheS5wcm90b3R5cGUpLmluZGV4T2YgPT0gbnVsbCkge1xuICAgIGJhc2UuaW5kZXhPZiA9IGZ1bmN0aW9uKG9iaiwgc3RhcnQpIHtcbiAgICAgIHZhciBpLCBqLCByZWYsIHJlZjE7XG4gICAgICBzdGFydCA9IHN0YXJ0IHx8IDA7XG4gICAgICBmb3IgKGkgPSBqID0gcmVmID0gc3RhcnQsIHJlZjEgPSB0aGlzLmxlbmd0aDsgcmVmIDw9IHJlZjEgPyBqIDwgcmVmMSA6IGogPiByZWYxOyBpID0gcmVmIDw9IHJlZjEgPyArK2ogOiAtLWopIHtcbiAgICAgICAgaWYgKHRoaXNbaV0gPT09IG9iaikge1xuICAgICAgICAgIHJldHVybiBpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gLTE7XG4gICAgfTtcbiAgfVxuXG59KS5jYWxsKHRoaXMpO1xuXG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYWlyYnJha2UtanMvbGliL2ludGVybmFsL2NvbXBhdC5qc1xuICoqIG1vZHVsZSBpZCA9IDExNlxuICoqIG1vZHVsZSBjaHVua3MgPSAyNFxuICoqLyJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=");

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

	eval("(function() {\n  var merge;\n\n  merge = function() {\n    var dst, i, key, len, obj, objs;\n    objs = Array.prototype.slice.call(arguments);\n    dst = objs.shift() || {};\n    for (i = 0, len = objs.length; i < len; i++) {\n      obj = objs[i];\n      for (key in obj) {\n        if (Object.prototype.hasOwnProperty.call(obj, key)) {\n          dst[key] = obj[key];\n        }\n      }\n    }\n    return dst;\n  };\n\n  module.exports = merge;\n\n}).call(this);\n\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTE3LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9haXJicmFrZS1qcy9saWIvaW50ZXJuYWwvbWVyZ2UuanM/YjA2NiJdLCJzb3VyY2VzQ29udGVudCI6WyIoZnVuY3Rpb24oKSB7XG4gIHZhciBtZXJnZTtcblxuICBtZXJnZSA9IGZ1bmN0aW9uKCkge1xuICAgIHZhciBkc3QsIGksIGtleSwgbGVuLCBvYmosIG9ianM7XG4gICAgb2JqcyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7XG4gICAgZHN0ID0gb2Jqcy5zaGlmdCgpIHx8IHt9O1xuICAgIGZvciAoaSA9IDAsIGxlbiA9IG9ianMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgIG9iaiA9IG9ianNbaV07XG4gICAgICBmb3IgKGtleSBpbiBvYmopIHtcbiAgICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIGtleSkpIHtcbiAgICAgICAgICBkc3Rba2V5XSA9IG9ialtrZXldO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBkc3Q7XG4gIH07XG5cbiAgbW9kdWxlLmV4cG9ydHMgPSBtZXJnZTtcblxufSkuY2FsbCh0aGlzKTtcblxuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2FpcmJyYWtlLWpzL2xpYi9pbnRlcm5hbC9tZXJnZS5qc1xuICoqIG1vZHVsZSBpZCA9IDExN1xuICoqIG1vZHVsZSBjaHVua3MgPSAyNFxuICoqLyJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==");

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

	eval("(function() {\n  var Promise;\n\n  Promise = (function() {\n    function Promise(executor) {\n      var reject, resolve;\n      this._onResolved = [];\n      this._onRejected = [];\n      resolve = (function(_this) {\n        return function() {\n          return _this.resolve.apply(_this, arguments);\n        };\n      })(this);\n      reject = (function(_this) {\n        return function() {\n          return _this.reject.apply(_this, arguments);\n        };\n      })(this);\n      if (executor != null) {\n        executor(resolve, reject);\n      }\n    }\n\n    Promise.prototype.then = function(onResolved, onRejected) {\n      if (onResolved) {\n        if (this._resolvedWith != null) {\n          onResolved(this._resolvedWith);\n        }\n        this._onResolved.push(onResolved);\n      }\n      if (onRejected) {\n        if (this._rejectedWith != null) {\n          onRejected(this._resolvedWith);\n        }\n        this._onRejected.push(onRejected);\n      }\n      return this;\n    };\n\n    Promise.prototype[\"catch\"] = function(onRejected) {\n      if (this._rejectedWith != null) {\n        onRejected(this._rejectedWith);\n      }\n      this._onRejected.push(onRejected);\n      return this;\n    };\n\n    Promise.prototype.resolve = function() {\n      var fn, i, len, ref;\n      this._resolvedWith = arguments;\n      ref = this._onResolved;\n      for (i = 0, len = ref.length; i < len; i++) {\n        fn = ref[i];\n        fn.apply(this, this._resolvedWith);\n      }\n      return this;\n    };\n\n    Promise.prototype.reject = function() {\n      var fn, i, len, ref;\n      this._rejectedWith = arguments;\n      ref = this._onRejected;\n      for (i = 0, len = ref.length; i < len; i++) {\n        fn = ref[i];\n        fn.apply(this, this._rejectedWith);\n      }\n      return this;\n    };\n\n    return Promise;\n\n  })();\n\n  module.exports = Promise;\n\n}).call(this);\n\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTE4LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9haXJicmFrZS1qcy9saWIvaW50ZXJuYWwvcHJvbWlzZS5qcz8xOTAwIl0sInNvdXJjZXNDb250ZW50IjpbIihmdW5jdGlvbigpIHtcbiAgdmFyIFByb21pc2U7XG5cbiAgUHJvbWlzZSA9IChmdW5jdGlvbigpIHtcbiAgICBmdW5jdGlvbiBQcm9taXNlKGV4ZWN1dG9yKSB7XG4gICAgICB2YXIgcmVqZWN0LCByZXNvbHZlO1xuICAgICAgdGhpcy5fb25SZXNvbHZlZCA9IFtdO1xuICAgICAgdGhpcy5fb25SZWplY3RlZCA9IFtdO1xuICAgICAgcmVzb2x2ZSA9IChmdW5jdGlvbihfdGhpcykge1xuICAgICAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgcmV0dXJuIF90aGlzLnJlc29sdmUuYXBwbHkoX3RoaXMsIGFyZ3VtZW50cyk7XG4gICAgICAgIH07XG4gICAgICB9KSh0aGlzKTtcbiAgICAgIHJlamVjdCA9IChmdW5jdGlvbihfdGhpcykge1xuICAgICAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgcmV0dXJuIF90aGlzLnJlamVjdC5hcHBseShfdGhpcywgYXJndW1lbnRzKTtcbiAgICAgICAgfTtcbiAgICAgIH0pKHRoaXMpO1xuICAgICAgaWYgKGV4ZWN1dG9yICE9IG51bGwpIHtcbiAgICAgICAgZXhlY3V0b3IocmVzb2x2ZSwgcmVqZWN0KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBQcm9taXNlLnByb3RvdHlwZS50aGVuID0gZnVuY3Rpb24ob25SZXNvbHZlZCwgb25SZWplY3RlZCkge1xuICAgICAgaWYgKG9uUmVzb2x2ZWQpIHtcbiAgICAgICAgaWYgKHRoaXMuX3Jlc29sdmVkV2l0aCAhPSBudWxsKSB7XG4gICAgICAgICAgb25SZXNvbHZlZCh0aGlzLl9yZXNvbHZlZFdpdGgpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX29uUmVzb2x2ZWQucHVzaChvblJlc29sdmVkKTtcbiAgICAgIH1cbiAgICAgIGlmIChvblJlamVjdGVkKSB7XG4gICAgICAgIGlmICh0aGlzLl9yZWplY3RlZFdpdGggIT0gbnVsbCkge1xuICAgICAgICAgIG9uUmVqZWN0ZWQodGhpcy5fcmVzb2x2ZWRXaXRoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9vblJlamVjdGVkLnB1c2gob25SZWplY3RlZCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuXG4gICAgUHJvbWlzZS5wcm90b3R5cGVbXCJjYXRjaFwiXSA9IGZ1bmN0aW9uKG9uUmVqZWN0ZWQpIHtcbiAgICAgIGlmICh0aGlzLl9yZWplY3RlZFdpdGggIT0gbnVsbCkge1xuICAgICAgICBvblJlamVjdGVkKHRoaXMuX3JlamVjdGVkV2l0aCk7XG4gICAgICB9XG4gICAgICB0aGlzLl9vblJlamVjdGVkLnB1c2gob25SZWplY3RlZCk7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuXG4gICAgUHJvbWlzZS5wcm90b3R5cGUucmVzb2x2ZSA9IGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIGZuLCBpLCBsZW4sIHJlZjtcbiAgICAgIHRoaXMuX3Jlc29sdmVkV2l0aCA9IGFyZ3VtZW50cztcbiAgICAgIHJlZiA9IHRoaXMuX29uUmVzb2x2ZWQ7XG4gICAgICBmb3IgKGkgPSAwLCBsZW4gPSByZWYubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgZm4gPSByZWZbaV07XG4gICAgICAgIGZuLmFwcGx5KHRoaXMsIHRoaXMuX3Jlc29sdmVkV2l0aCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuXG4gICAgUHJvbWlzZS5wcm90b3R5cGUucmVqZWN0ID0gZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgZm4sIGksIGxlbiwgcmVmO1xuICAgICAgdGhpcy5fcmVqZWN0ZWRXaXRoID0gYXJndW1lbnRzO1xuICAgICAgcmVmID0gdGhpcy5fb25SZWplY3RlZDtcbiAgICAgIGZvciAoaSA9IDAsIGxlbiA9IHJlZi5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgICBmbiA9IHJlZltpXTtcbiAgICAgICAgZm4uYXBwbHkodGhpcywgdGhpcy5fcmVqZWN0ZWRXaXRoKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG5cbiAgICByZXR1cm4gUHJvbWlzZTtcblxuICB9KSgpO1xuXG4gIG1vZHVsZS5leHBvcnRzID0gUHJvbWlzZTtcblxufSkuY2FsbCh0aGlzKTtcblxuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2FpcmJyYWtlLWpzL2xpYi9pbnRlcm5hbC9wcm9taXNlLmpzXG4gKiogbW9kdWxlIGlkID0gMTE4XG4gKiogbW9kdWxlIGNodW5rcyA9IDI0XG4gKiovIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=");

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

	eval("(function() {\n  var processor, rules, typeMessageRe;\n\n  rules = [\n    {\n      name: 'v8',\n      re: /^\\s*at\\s(.+?)\\s\\((?:(?:(.+):(\\d+):(\\d+))|(.+))\\)$/,\n      fn: function(m) {\n        return {\n          \"function\": m[1],\n          file: m[2] || m[5],\n          line: m[3] && parseInt(m[3], 10) || 0,\n          column: m[4] && parseInt(m[4], 10) || 0\n        };\n      }\n    }, {\n      name: 'firefox30',\n      re: /^(.*)@(.+):(\\d+):(\\d+)$/,\n      fn: function(m) {\n        var evaledRe, file, func, mm;\n        func = m[1];\n        file = m[2];\n        evaledRe = /^(\\S+)\\s(line\\s\\d+\\s>\\seval.*)$/;\n        if (mm = file.match(evaledRe)) {\n          if (func.length > 0) {\n            func = func + ' ' + mm[2];\n          } else {\n            func = mm[2];\n          }\n          file = mm[1];\n        }\n        return {\n          \"function\": func,\n          file: file,\n          line: parseInt(m[3], 10),\n          column: parseInt(m[4], 10)\n        };\n      }\n    }, {\n      name: 'firefox14',\n      re: /^(.*)@(.+):(\\d+)$/,\n      fn: function(m, i, e) {\n        var column;\n        if (i === 0) {\n          column = e.columnNumber || 0;\n        } else {\n          column = 0;\n        }\n        return {\n          \"function\": m[1],\n          file: m[2],\n          line: parseInt(m[3], 10),\n          column: column\n        };\n      }\n    }, {\n      name: 'v8-short',\n      re: /^\\s*at\\s(.+):(\\d+):(\\d+)$/,\n      fn: function(m) {\n        return {\n          \"function\": '',\n          file: m[1],\n          line: parseInt(m[2], 10),\n          column: parseInt(m[3], 10)\n        };\n      }\n    }, {\n      name: 'phantomjs',\n      re: /^\\s*at\\s(.+):(\\d+)$/,\n      fn: function(m) {\n        return {\n          \"function\": '',\n          file: m[1],\n          line: parseInt(m[2], 10),\n          column: 0\n        };\n      }\n    }, {\n      name: 'default',\n      re: /.+/,\n      fn: function(m) {\n        return {\n          \"function\": m[0],\n          file: '',\n          line: 0,\n          column: 0\n        };\n      }\n    }\n  ];\n\n  typeMessageRe = /^\\S+:\\s.+$/;\n\n  processor = function(e, cb) {\n    var backtrace, i, j, k, len, len1, line, lines, m, msg, processorName, rule, stack, type, uncaughtExcRe;\n    processorName = 'nostack';\n    stack = e.stack || '';\n    lines = stack.split('\\n');\n    backtrace = [];\n    for (i = j = 0, len = lines.length; j < len; i = ++j) {\n      line = lines[i];\n      if (line === '') {\n        continue;\n      }\n      for (k = 0, len1 = rules.length; k < len1; k++) {\n        rule = rules[k];\n        m = line.match(rule.re);\n        if (!m) {\n          continue;\n        }\n        processorName = rule.name;\n        backtrace.push(rule.fn(m, i, e));\n        break;\n      }\n    }\n    if ((processorName === 'v8' || processorName === 'v8-short') && backtrace.length > 0 && backtrace[0][\"function\"].match(typeMessageRe)) {\n      backtrace = backtrace.slice(1);\n    }\n    if (backtrace.length === 0 && ((e.fileName != null) || (e.lineNumber != null) || (e.columnNumber != null))) {\n      backtrace.push({\n        \"function\": '',\n        file: e.fileName || '',\n        line: parseInt(e.lineNumber, 10) || 0,\n        column: parseInt(e.columnNumber, 10) || 0\n      });\n    }\n    if (backtrace.length === 0 && ((e.filename != null) || (e.lineno != null) || (e.column != null) || (e.colno != null))) {\n      backtrace.push({\n        \"function\": '',\n        file: e.filename || '',\n        line: parseInt(e.lineno, 10) || 0,\n        column: parseInt(e.column || e.colno, 10) || 0\n      });\n    }\n    if (e.message != null) {\n      msg = e.message;\n    } else {\n      msg = String(e);\n    }\n    if ((e.name != null) && e.name !== '') {\n      type = e.name;\n    } else {\n      uncaughtExcRe = /^Uncaught\\s(.+?):\\s(.+)$/;\n      m = msg.match(uncaughtExcRe);\n      if (m) {\n        type = m[1];\n        msg = m[2];\n      } else {\n        type = '';\n      }\n    }\n    if (type === '' && msg === '' && backtrace.length === 0) {\n      if (typeof console !== \"undefined\" && console !== null) {\n        if (typeof console.warn === \"function\") {\n          console.warn(\"airbrake: can't process error\", e);\n        }\n      }\n      return;\n    }\n    return cb(processorName, {\n      'type': type,\n      'message': msg,\n      'backtrace': backtrace\n    });\n  };\n\n  module.exports = processor;\n\n}).call(this);\n\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTE5LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9haXJicmFrZS1qcy9saWIvcHJvY2Vzc29ycy9zdGFjay5qcz8yNjNiIl0sInNvdXJjZXNDb250ZW50IjpbIihmdW5jdGlvbigpIHtcbiAgdmFyIHByb2Nlc3NvciwgcnVsZXMsIHR5cGVNZXNzYWdlUmU7XG5cbiAgcnVsZXMgPSBbXG4gICAge1xuICAgICAgbmFtZTogJ3Y4JyxcbiAgICAgIHJlOiAvXlxccyphdFxccyguKz8pXFxzXFwoKD86KD86KC4rKTooXFxkKyk6KFxcZCspKXwoLispKVxcKSQvLFxuICAgICAgZm46IGZ1bmN0aW9uKG0pIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBcImZ1bmN0aW9uXCI6IG1bMV0sXG4gICAgICAgICAgZmlsZTogbVsyXSB8fCBtWzVdLFxuICAgICAgICAgIGxpbmU6IG1bM10gJiYgcGFyc2VJbnQobVszXSwgMTApIHx8IDAsXG4gICAgICAgICAgY29sdW1uOiBtWzRdICYmIHBhcnNlSW50KG1bNF0sIDEwKSB8fCAwXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfSwge1xuICAgICAgbmFtZTogJ2ZpcmVmb3gzMCcsXG4gICAgICByZTogL14oLiopQCguKyk6KFxcZCspOihcXGQrKSQvLFxuICAgICAgZm46IGZ1bmN0aW9uKG0pIHtcbiAgICAgICAgdmFyIGV2YWxlZFJlLCBmaWxlLCBmdW5jLCBtbTtcbiAgICAgICAgZnVuYyA9IG1bMV07XG4gICAgICAgIGZpbGUgPSBtWzJdO1xuICAgICAgICBldmFsZWRSZSA9IC9eKFxcUyspXFxzKGxpbmVcXHNcXGQrXFxzPlxcc2V2YWwuKikkLztcbiAgICAgICAgaWYgKG1tID0gZmlsZS5tYXRjaChldmFsZWRSZSkpIHtcbiAgICAgICAgICBpZiAoZnVuYy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBmdW5jID0gZnVuYyArICcgJyArIG1tWzJdO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBmdW5jID0gbW1bMl07XG4gICAgICAgICAgfVxuICAgICAgICAgIGZpbGUgPSBtbVsxXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIFwiZnVuY3Rpb25cIjogZnVuYyxcbiAgICAgICAgICBmaWxlOiBmaWxlLFxuICAgICAgICAgIGxpbmU6IHBhcnNlSW50KG1bM10sIDEwKSxcbiAgICAgICAgICBjb2x1bW46IHBhcnNlSW50KG1bNF0sIDEwKVxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH0sIHtcbiAgICAgIG5hbWU6ICdmaXJlZm94MTQnLFxuICAgICAgcmU6IC9eKC4qKUAoLispOihcXGQrKSQvLFxuICAgICAgZm46IGZ1bmN0aW9uKG0sIGksIGUpIHtcbiAgICAgICAgdmFyIGNvbHVtbjtcbiAgICAgICAgaWYgKGkgPT09IDApIHtcbiAgICAgICAgICBjb2x1bW4gPSBlLmNvbHVtbk51bWJlciB8fCAwO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbHVtbiA9IDA7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBcImZ1bmN0aW9uXCI6IG1bMV0sXG4gICAgICAgICAgZmlsZTogbVsyXSxcbiAgICAgICAgICBsaW5lOiBwYXJzZUludChtWzNdLCAxMCksXG4gICAgICAgICAgY29sdW1uOiBjb2x1bW5cbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9LCB7XG4gICAgICBuYW1lOiAndjgtc2hvcnQnLFxuICAgICAgcmU6IC9eXFxzKmF0XFxzKC4rKTooXFxkKyk6KFxcZCspJC8sXG4gICAgICBmbjogZnVuY3Rpb24obSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIFwiZnVuY3Rpb25cIjogJycsXG4gICAgICAgICAgZmlsZTogbVsxXSxcbiAgICAgICAgICBsaW5lOiBwYXJzZUludChtWzJdLCAxMCksXG4gICAgICAgICAgY29sdW1uOiBwYXJzZUludChtWzNdLCAxMClcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9LCB7XG4gICAgICBuYW1lOiAncGhhbnRvbWpzJyxcbiAgICAgIHJlOiAvXlxccyphdFxccyguKyk6KFxcZCspJC8sXG4gICAgICBmbjogZnVuY3Rpb24obSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIFwiZnVuY3Rpb25cIjogJycsXG4gICAgICAgICAgZmlsZTogbVsxXSxcbiAgICAgICAgICBsaW5lOiBwYXJzZUludChtWzJdLCAxMCksXG4gICAgICAgICAgY29sdW1uOiAwXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfSwge1xuICAgICAgbmFtZTogJ2RlZmF1bHQnLFxuICAgICAgcmU6IC8uKy8sXG4gICAgICBmbjogZnVuY3Rpb24obSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIFwiZnVuY3Rpb25cIjogbVswXSxcbiAgICAgICAgICBmaWxlOiAnJyxcbiAgICAgICAgICBsaW5lOiAwLFxuICAgICAgICAgIGNvbHVtbjogMFxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH1cbiAgXTtcblxuICB0eXBlTWVzc2FnZVJlID0gL15cXFMrOlxccy4rJC87XG5cbiAgcHJvY2Vzc29yID0gZnVuY3Rpb24oZSwgY2IpIHtcbiAgICB2YXIgYmFja3RyYWNlLCBpLCBqLCBrLCBsZW4sIGxlbjEsIGxpbmUsIGxpbmVzLCBtLCBtc2csIHByb2Nlc3Nvck5hbWUsIHJ1bGUsIHN0YWNrLCB0eXBlLCB1bmNhdWdodEV4Y1JlO1xuICAgIHByb2Nlc3Nvck5hbWUgPSAnbm9zdGFjayc7XG4gICAgc3RhY2sgPSBlLnN0YWNrIHx8ICcnO1xuICAgIGxpbmVzID0gc3RhY2suc3BsaXQoJ1xcbicpO1xuICAgIGJhY2t0cmFjZSA9IFtdO1xuICAgIGZvciAoaSA9IGogPSAwLCBsZW4gPSBsaW5lcy5sZW5ndGg7IGogPCBsZW47IGkgPSArK2opIHtcbiAgICAgIGxpbmUgPSBsaW5lc1tpXTtcbiAgICAgIGlmIChsaW5lID09PSAnJykge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGZvciAoayA9IDAsIGxlbjEgPSBydWxlcy5sZW5ndGg7IGsgPCBsZW4xOyBrKyspIHtcbiAgICAgICAgcnVsZSA9IHJ1bGVzW2tdO1xuICAgICAgICBtID0gbGluZS5tYXRjaChydWxlLnJlKTtcbiAgICAgICAgaWYgKCFtKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgcHJvY2Vzc29yTmFtZSA9IHJ1bGUubmFtZTtcbiAgICAgICAgYmFja3RyYWNlLnB1c2gocnVsZS5mbihtLCBpLCBlKSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoKHByb2Nlc3Nvck5hbWUgPT09ICd2OCcgfHwgcHJvY2Vzc29yTmFtZSA9PT0gJ3Y4LXNob3J0JykgJiYgYmFja3RyYWNlLmxlbmd0aCA+IDAgJiYgYmFja3RyYWNlWzBdW1wiZnVuY3Rpb25cIl0ubWF0Y2godHlwZU1lc3NhZ2VSZSkpIHtcbiAgICAgIGJhY2t0cmFjZSA9IGJhY2t0cmFjZS5zbGljZSgxKTtcbiAgICB9XG4gICAgaWYgKGJhY2t0cmFjZS5sZW5ndGggPT09IDAgJiYgKChlLmZpbGVOYW1lICE9IG51bGwpIHx8IChlLmxpbmVOdW1iZXIgIT0gbnVsbCkgfHwgKGUuY29sdW1uTnVtYmVyICE9IG51bGwpKSkge1xuICAgICAgYmFja3RyYWNlLnB1c2goe1xuICAgICAgICBcImZ1bmN0aW9uXCI6ICcnLFxuICAgICAgICBmaWxlOiBlLmZpbGVOYW1lIHx8ICcnLFxuICAgICAgICBsaW5lOiBwYXJzZUludChlLmxpbmVOdW1iZXIsIDEwKSB8fCAwLFxuICAgICAgICBjb2x1bW46IHBhcnNlSW50KGUuY29sdW1uTnVtYmVyLCAxMCkgfHwgMFxuICAgICAgfSk7XG4gICAgfVxuICAgIGlmIChiYWNrdHJhY2UubGVuZ3RoID09PSAwICYmICgoZS5maWxlbmFtZSAhPSBudWxsKSB8fCAoZS5saW5lbm8gIT0gbnVsbCkgfHwgKGUuY29sdW1uICE9IG51bGwpIHx8IChlLmNvbG5vICE9IG51bGwpKSkge1xuICAgICAgYmFja3RyYWNlLnB1c2goe1xuICAgICAgICBcImZ1bmN0aW9uXCI6ICcnLFxuICAgICAgICBmaWxlOiBlLmZpbGVuYW1lIHx8ICcnLFxuICAgICAgICBsaW5lOiBwYXJzZUludChlLmxpbmVubywgMTApIHx8IDAsXG4gICAgICAgIGNvbHVtbjogcGFyc2VJbnQoZS5jb2x1bW4gfHwgZS5jb2xubywgMTApIHx8IDBcbiAgICAgIH0pO1xuICAgIH1cbiAgICBpZiAoZS5tZXNzYWdlICE9IG51bGwpIHtcbiAgICAgIG1zZyA9IGUubWVzc2FnZTtcbiAgICB9IGVsc2Uge1xuICAgICAgbXNnID0gU3RyaW5nKGUpO1xuICAgIH1cbiAgICBpZiAoKGUubmFtZSAhPSBudWxsKSAmJiBlLm5hbWUgIT09ICcnKSB7XG4gICAgICB0eXBlID0gZS5uYW1lO1xuICAgIH0gZWxzZSB7XG4gICAgICB1bmNhdWdodEV4Y1JlID0gL15VbmNhdWdodFxccyguKz8pOlxccyguKykkLztcbiAgICAgIG0gPSBtc2cubWF0Y2godW5jYXVnaHRFeGNSZSk7XG4gICAgICBpZiAobSkge1xuICAgICAgICB0eXBlID0gbVsxXTtcbiAgICAgICAgbXNnID0gbVsyXTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHR5cGUgPSAnJztcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHR5cGUgPT09ICcnICYmIG1zZyA9PT0gJycgJiYgYmFja3RyYWNlLmxlbmd0aCA9PT0gMCkge1xuICAgICAgaWYgKHR5cGVvZiBjb25zb2xlICE9PSBcInVuZGVmaW5lZFwiICYmIGNvbnNvbGUgIT09IG51bGwpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBjb25zb2xlLndhcm4gPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgIGNvbnNvbGUud2FybihcImFpcmJyYWtlOiBjYW4ndCBwcm9jZXNzIGVycm9yXCIsIGUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHJldHVybiBjYihwcm9jZXNzb3JOYW1lLCB7XG4gICAgICAndHlwZSc6IHR5cGUsXG4gICAgICAnbWVzc2FnZSc6IG1zZyxcbiAgICAgICdiYWNrdHJhY2UnOiBiYWNrdHJhY2VcbiAgICB9KTtcbiAgfTtcblxuICBtb2R1bGUuZXhwb3J0cyA9IHByb2Nlc3NvcjtcblxufSkuY2FsbCh0aGlzKTtcblxuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2FpcmJyYWtlLWpzL2xpYi9wcm9jZXNzb3JzL3N0YWNrLmpzXG4gKiogbW9kdWxlIGlkID0gMTE5XG4gKiogbW9kdWxlIGNodW5rcyA9IDI0XG4gKiovIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=");

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

	eval("(function() {\n  var IGNORED_MESSAGES, filter,\n    indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; };\n\n  IGNORED_MESSAGES = ['Script error', 'Script error.'];\n\n  filter = function(notice) {\n    var msg;\n    msg = notice.errors[0].message;\n    if (indexOf.call(IGNORED_MESSAGES, msg) >= 0) {\n      return null;\n    }\n    return notice;\n  };\n\n  module.exports = filter;\n\n}).call(this);\n\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTIwLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9haXJicmFrZS1qcy9saWIvaW50ZXJuYWwvZGVmYXVsdF9maWx0ZXIuanM/MTgzZiJdLCJzb3VyY2VzQ29udGVudCI6WyIoZnVuY3Rpb24oKSB7XG4gIHZhciBJR05PUkVEX01FU1NBR0VTLCBmaWx0ZXIsXG4gICAgaW5kZXhPZiA9IFtdLmluZGV4T2YgfHwgZnVuY3Rpb24oaXRlbSkgeyBmb3IgKHZhciBpID0gMCwgbCA9IHRoaXMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7IGlmIChpIGluIHRoaXMgJiYgdGhpc1tpXSA9PT0gaXRlbSkgcmV0dXJuIGk7IH0gcmV0dXJuIC0xOyB9O1xuXG4gIElHTk9SRURfTUVTU0FHRVMgPSBbJ1NjcmlwdCBlcnJvcicsICdTY3JpcHQgZXJyb3IuJ107XG5cbiAgZmlsdGVyID0gZnVuY3Rpb24obm90aWNlKSB7XG4gICAgdmFyIG1zZztcbiAgICBtc2cgPSBub3RpY2UuZXJyb3JzWzBdLm1lc3NhZ2U7XG4gICAgaWYgKGluZGV4T2YuY2FsbChJR05PUkVEX01FU1NBR0VTLCBtc2cpID49IDApIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gbm90aWNlO1xuICB9O1xuXG4gIG1vZHVsZS5leHBvcnRzID0gZmlsdGVyO1xuXG59KS5jYWxsKHRoaXMpO1xuXG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYWlyYnJha2UtanMvbGliL2ludGVybmFsL2RlZmF1bHRfZmlsdGVyLmpzXG4gKiogbW9kdWxlIGlkID0gMTIwXG4gKiogbW9kdWxlIGNodW5rcyA9IDI0XG4gKiovIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9");

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

	eval("/* WEBPACK VAR INJECTION */(function(global) {(function() {\n  var jsonifyNotice, report;\n\n  jsonifyNotice = __webpack_require__(122);\n\n  report = function(notice, opts, promise) {\n    var payload, req, url;\n    url = opts.host + \"/api/v3/projects/\" + opts.projectId + \"/create-notice?key=\" + opts.projectKey;\n    payload = jsonifyNotice(notice);\n    req = new global.XMLHttpRequest();\n    req.open('POST', url, true);\n    req.send(payload);\n    return req.onreadystatechange = function() {\n      var resp;\n      if (req.readyState === 4 && req.status === 200) {\n        resp = JSON.parse(req.responseText);\n        notice.id = resp.id;\n        return promise.resolve(notice);\n      }\n    };\n  };\n\n  module.exports = report;\n\n}).call(this);\n\n/* WEBPACK VAR INJECTION */}.call(exports, (function() { return this; }())))\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTIxLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9haXJicmFrZS1qcy9saWIvcmVwb3J0ZXJzL2NvbXBhdC5qcz8yNjFiIl0sInNvdXJjZXNDb250ZW50IjpbIihmdW5jdGlvbigpIHtcbiAgdmFyIGpzb25pZnlOb3RpY2UsIHJlcG9ydDtcblxuICBqc29uaWZ5Tm90aWNlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWwvanNvbmlmeV9ub3RpY2UnKTtcblxuICByZXBvcnQgPSBmdW5jdGlvbihub3RpY2UsIG9wdHMsIHByb21pc2UpIHtcbiAgICB2YXIgcGF5bG9hZCwgcmVxLCB1cmw7XG4gICAgdXJsID0gb3B0cy5ob3N0ICsgXCIvYXBpL3YzL3Byb2plY3RzL1wiICsgb3B0cy5wcm9qZWN0SWQgKyBcIi9jcmVhdGUtbm90aWNlP2tleT1cIiArIG9wdHMucHJvamVjdEtleTtcbiAgICBwYXlsb2FkID0ganNvbmlmeU5vdGljZShub3RpY2UpO1xuICAgIHJlcSA9IG5ldyBnbG9iYWwuWE1MSHR0cFJlcXVlc3QoKTtcbiAgICByZXEub3BlbignUE9TVCcsIHVybCwgdHJ1ZSk7XG4gICAgcmVxLnNlbmQocGF5bG9hZCk7XG4gICAgcmV0dXJuIHJlcS5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBmdW5jdGlvbigpIHtcbiAgICAgIHZhciByZXNwO1xuICAgICAgaWYgKHJlcS5yZWFkeVN0YXRlID09PSA0ICYmIHJlcS5zdGF0dXMgPT09IDIwMCkge1xuICAgICAgICByZXNwID0gSlNPTi5wYXJzZShyZXEucmVzcG9uc2VUZXh0KTtcbiAgICAgICAgbm90aWNlLmlkID0gcmVzcC5pZDtcbiAgICAgICAgcmV0dXJuIHByb21pc2UucmVzb2x2ZShub3RpY2UpO1xuICAgICAgfVxuICAgIH07XG4gIH07XG5cbiAgbW9kdWxlLmV4cG9ydHMgPSByZXBvcnQ7XG5cbn0pLmNhbGwodGhpcyk7XG5cblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9haXJicmFrZS1qcy9saWIvcmVwb3J0ZXJzL2NvbXBhdC5qc1xuICoqIG1vZHVsZSBpZCA9IDEyMVxuICoqIG1vZHVsZSBjaHVua3MgPSAyNFxuICoqLyJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");

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

	eval("(function() {\n  var jsonifyNotice, truncate, truncateObj;\n\n  truncate = __webpack_require__(123);\n\n  truncateObj = function(obj, n) {\n    var dst, key;\n    if (n == null) {\n      n = 1000;\n    }\n    dst = {};\n    for (key in obj) {\n      dst[key] = truncate(obj[key], n = n);\n    }\n    return dst;\n  };\n\n  jsonifyNotice = function(notice, n, maxLength) {\n    var err, s;\n    if (n == null) {\n      n = 1000;\n    }\n    if (maxLength == null) {\n      maxLength = 64000;\n    }\n    while (true) {\n      notice.params = truncateObj(notice.params, n = n);\n      notice.environment = truncateObj(notice.environment, n = n);\n      notice.session = truncateObj(notice.session, n = n);\n      s = JSON.stringify(notice);\n      if (s.length < maxLength) {\n        return s;\n      }\n      if (n === 0) {\n        break;\n      }\n      n = Math.floor(n / 2);\n    }\n    err = new Error(\"airbrake-js: cannot jsonify notice (length=\" + s.length + \" maxLength=\" + maxLength + \")\");\n    err.params = {\n      json: s.slice(0, +Math.floor(n / 2) + 1 || 9e9) + '...'\n    };\n    throw err;\n  };\n\n  module.exports = jsonifyNotice;\n\n}).call(this);\n\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTIyLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9haXJicmFrZS1qcy9saWIvaW50ZXJuYWwvanNvbmlmeV9ub3RpY2UuanM/ZmQ4OSJdLCJzb3VyY2VzQ29udGVudCI6WyIoZnVuY3Rpb24oKSB7XG4gIHZhciBqc29uaWZ5Tm90aWNlLCB0cnVuY2F0ZSwgdHJ1bmNhdGVPYmo7XG5cbiAgdHJ1bmNhdGUgPSByZXF1aXJlKCcuL3RydW5jYXRlJyk7XG5cbiAgdHJ1bmNhdGVPYmogPSBmdW5jdGlvbihvYmosIG4pIHtcbiAgICB2YXIgZHN0LCBrZXk7XG4gICAgaWYgKG4gPT0gbnVsbCkge1xuICAgICAgbiA9IDEwMDA7XG4gICAgfVxuICAgIGRzdCA9IHt9O1xuICAgIGZvciAoa2V5IGluIG9iaikge1xuICAgICAgZHN0W2tleV0gPSB0cnVuY2F0ZShvYmpba2V5XSwgbiA9IG4pO1xuICAgIH1cbiAgICByZXR1cm4gZHN0O1xuICB9O1xuXG4gIGpzb25pZnlOb3RpY2UgPSBmdW5jdGlvbihub3RpY2UsIG4sIG1heExlbmd0aCkge1xuICAgIHZhciBlcnIsIHM7XG4gICAgaWYgKG4gPT0gbnVsbCkge1xuICAgICAgbiA9IDEwMDA7XG4gICAgfVxuICAgIGlmIChtYXhMZW5ndGggPT0gbnVsbCkge1xuICAgICAgbWF4TGVuZ3RoID0gNjQwMDA7XG4gICAgfVxuICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICBub3RpY2UucGFyYW1zID0gdHJ1bmNhdGVPYmoobm90aWNlLnBhcmFtcywgbiA9IG4pO1xuICAgICAgbm90aWNlLmVudmlyb25tZW50ID0gdHJ1bmNhdGVPYmoobm90aWNlLmVudmlyb25tZW50LCBuID0gbik7XG4gICAgICBub3RpY2Uuc2Vzc2lvbiA9IHRydW5jYXRlT2JqKG5vdGljZS5zZXNzaW9uLCBuID0gbik7XG4gICAgICBzID0gSlNPTi5zdHJpbmdpZnkobm90aWNlKTtcbiAgICAgIGlmIChzLmxlbmd0aCA8IG1heExlbmd0aCkge1xuICAgICAgICByZXR1cm4gcztcbiAgICAgIH1cbiAgICAgIGlmIChuID09PSAwKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgbiA9IE1hdGguZmxvb3IobiAvIDIpO1xuICAgIH1cbiAgICBlcnIgPSBuZXcgRXJyb3IoXCJhaXJicmFrZS1qczogY2Fubm90IGpzb25pZnkgbm90aWNlIChsZW5ndGg9XCIgKyBzLmxlbmd0aCArIFwiIG1heExlbmd0aD1cIiArIG1heExlbmd0aCArIFwiKVwiKTtcbiAgICBlcnIucGFyYW1zID0ge1xuICAgICAganNvbjogcy5zbGljZSgwLCArTWF0aC5mbG9vcihuIC8gMikgKyAxIHx8IDllOSkgKyAnLi4uJ1xuICAgIH07XG4gICAgdGhyb3cgZXJyO1xuICB9O1xuXG4gIG1vZHVsZS5leHBvcnRzID0ganNvbmlmeU5vdGljZTtcblxufSkuY2FsbCh0aGlzKTtcblxuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2FpcmJyYWtlLWpzL2xpYi9pbnRlcm5hbC9qc29uaWZ5X25vdGljZS5qc1xuICoqIG1vZHVsZSBpZCA9IDEyMlxuICoqIG1vZHVsZSBjaHVua3MgPSAyNFxuICoqLyJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==");

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

	eval("(function() {\n  var getAttr, truncate;\n\n  getAttr = function(obj, attr) {\n    var exc;\n    try {\n      return obj[attr];\n    } catch (_error) {\n      exc = _error;\n      return void 0;\n    }\n  };\n\n  truncate = function(value, n, depth) {\n    var fn, getPath, keys, nn, seen;\n    if (n == null) {\n      n = 1000;\n    }\n    if (depth == null) {\n      depth = 5;\n    }\n    nn = 0;\n    keys = [];\n    seen = [];\n    getPath = function(value) {\n      var i, index, j, path, ref;\n      index = seen.indexOf(value);\n      path = [keys[index]];\n      for (i = j = ref = index; ref <= 0 ? j <= 0 : j >= 0; i = ref <= 0 ? ++j : --j) {\n        if (seen[i] && getAttr(seen[i], path[0]) === value) {\n          value = seen[i];\n          path.unshift(keys[i]);\n        }\n      }\n      return '~' + path.join('.');\n    };\n    fn = function(value, key, dd) {\n      var dst, el, i, j, len, val;\n      if (key == null) {\n        key = '';\n      }\n      if (dd == null) {\n        dd = 0;\n      }\n      nn++;\n      if (nn > n) {\n        return '[Truncated]';\n      }\n      if (value === null || value === void 0) {\n        return value;\n      }\n      switch (typeof value) {\n        case 'boolean':\n        case 'number':\n        case 'string':\n        case 'function':\n          return value;\n        case 'object':\n          break;\n        default:\n          return String(value);\n      }\n      if (value instanceof Boolean || value instanceof Number || value instanceof String || value instanceof Date || value instanceof RegExp) {\n        return value;\n      }\n      if (seen.indexOf(value) >= 0) {\n        return \"[Circular \" + (getPath(value)) + \"]\";\n      }\n      dd++;\n      if (dd > depth) {\n        return '[Truncated]';\n      }\n      keys.push(key);\n      seen.push(value);\n      nn--;\n      if (Object.prototype.toString.apply(value) === '[object Array]') {\n        dst = [];\n        for (i = j = 0, len = value.length; j < len; i = ++j) {\n          el = value[i];\n          nn++;\n          if (nn >= n) {\n            break;\n          }\n          dst.push(fn(el, key = i, dd));\n        }\n        return dst;\n      }\n      dst = {};\n      for (key in value) {\n        if (!Object.prototype.hasOwnProperty.call(value, key)) {\n          continue;\n        }\n        nn++;\n        if (nn >= n) {\n          break;\n        }\n        val = getAttr(value, key);\n        if (val !== void 0) {\n          dst[key] = fn(val, key = key, dd);\n        }\n      }\n      return dst;\n    };\n    return fn(value);\n  };\n\n  module.exports = truncate;\n\n}).call(this);\n\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTIzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9haXJicmFrZS1qcy9saWIvaW50ZXJuYWwvdHJ1bmNhdGUuanM/ZWE1MCJdLCJzb3VyY2VzQ29udGVudCI6WyIoZnVuY3Rpb24oKSB7XG4gIHZhciBnZXRBdHRyLCB0cnVuY2F0ZTtcblxuICBnZXRBdHRyID0gZnVuY3Rpb24ob2JqLCBhdHRyKSB7XG4gICAgdmFyIGV4YztcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIG9ialthdHRyXTtcbiAgICB9IGNhdGNoIChfZXJyb3IpIHtcbiAgICAgIGV4YyA9IF9lcnJvcjtcbiAgICAgIHJldHVybiB2b2lkIDA7XG4gICAgfVxuICB9O1xuXG4gIHRydW5jYXRlID0gZnVuY3Rpb24odmFsdWUsIG4sIGRlcHRoKSB7XG4gICAgdmFyIGZuLCBnZXRQYXRoLCBrZXlzLCBubiwgc2VlbjtcbiAgICBpZiAobiA9PSBudWxsKSB7XG4gICAgICBuID0gMTAwMDtcbiAgICB9XG4gICAgaWYgKGRlcHRoID09IG51bGwpIHtcbiAgICAgIGRlcHRoID0gNTtcbiAgICB9XG4gICAgbm4gPSAwO1xuICAgIGtleXMgPSBbXTtcbiAgICBzZWVuID0gW107XG4gICAgZ2V0UGF0aCA9IGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICB2YXIgaSwgaW5kZXgsIGosIHBhdGgsIHJlZjtcbiAgICAgIGluZGV4ID0gc2Vlbi5pbmRleE9mKHZhbHVlKTtcbiAgICAgIHBhdGggPSBba2V5c1tpbmRleF1dO1xuICAgICAgZm9yIChpID0gaiA9IHJlZiA9IGluZGV4OyByZWYgPD0gMCA/IGogPD0gMCA6IGogPj0gMDsgaSA9IHJlZiA8PSAwID8gKytqIDogLS1qKSB7XG4gICAgICAgIGlmIChzZWVuW2ldICYmIGdldEF0dHIoc2VlbltpXSwgcGF0aFswXSkgPT09IHZhbHVlKSB7XG4gICAgICAgICAgdmFsdWUgPSBzZWVuW2ldO1xuICAgICAgICAgIHBhdGgudW5zaGlmdChrZXlzW2ldKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuICd+JyArIHBhdGguam9pbignLicpO1xuICAgIH07XG4gICAgZm4gPSBmdW5jdGlvbih2YWx1ZSwga2V5LCBkZCkge1xuICAgICAgdmFyIGRzdCwgZWwsIGksIGosIGxlbiwgdmFsO1xuICAgICAgaWYgKGtleSA9PSBudWxsKSB7XG4gICAgICAgIGtleSA9ICcnO1xuICAgICAgfVxuICAgICAgaWYgKGRkID09IG51bGwpIHtcbiAgICAgICAgZGQgPSAwO1xuICAgICAgfVxuICAgICAgbm4rKztcbiAgICAgIGlmIChubiA+IG4pIHtcbiAgICAgICAgcmV0dXJuICdbVHJ1bmNhdGVkXSc7XG4gICAgICB9XG4gICAgICBpZiAodmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IHZvaWQgMCkge1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICB9XG4gICAgICBzd2l0Y2ggKHR5cGVvZiB2YWx1ZSkge1xuICAgICAgICBjYXNlICdib29sZWFuJzpcbiAgICAgICAgY2FzZSAnbnVtYmVyJzpcbiAgICAgICAgY2FzZSAnc3RyaW5nJzpcbiAgICAgICAgY2FzZSAnZnVuY3Rpb24nOlxuICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgY2FzZSAnb2JqZWN0JzpcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICByZXR1cm4gU3RyaW5nKHZhbHVlKTtcbiAgICAgIH1cbiAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEJvb2xlYW4gfHwgdmFsdWUgaW5zdGFuY2VvZiBOdW1iZXIgfHwgdmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcgfHwgdmFsdWUgaW5zdGFuY2VvZiBEYXRlIHx8IHZhbHVlIGluc3RhbmNlb2YgUmVnRXhwKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgIH1cbiAgICAgIGlmIChzZWVuLmluZGV4T2YodmFsdWUpID49IDApIHtcbiAgICAgICAgcmV0dXJuIFwiW0NpcmN1bGFyIFwiICsgKGdldFBhdGgodmFsdWUpKSArIFwiXVwiO1xuICAgICAgfVxuICAgICAgZGQrKztcbiAgICAgIGlmIChkZCA+IGRlcHRoKSB7XG4gICAgICAgIHJldHVybiAnW1RydW5jYXRlZF0nO1xuICAgICAgfVxuICAgICAga2V5cy5wdXNoKGtleSk7XG4gICAgICBzZWVuLnB1c2godmFsdWUpO1xuICAgICAgbm4tLTtcbiAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmFwcGx5KHZhbHVlKSA9PT0gJ1tvYmplY3QgQXJyYXldJykge1xuICAgICAgICBkc3QgPSBbXTtcbiAgICAgICAgZm9yIChpID0gaiA9IDAsIGxlbiA9IHZhbHVlLmxlbmd0aDsgaiA8IGxlbjsgaSA9ICsraikge1xuICAgICAgICAgIGVsID0gdmFsdWVbaV07XG4gICAgICAgICAgbm4rKztcbiAgICAgICAgICBpZiAobm4gPj0gbikge1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICAgIGRzdC5wdXNoKGZuKGVsLCBrZXkgPSBpLCBkZCkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBkc3Q7XG4gICAgICB9XG4gICAgICBkc3QgPSB7fTtcbiAgICAgIGZvciAoa2V5IGluIHZhbHVlKSB7XG4gICAgICAgIGlmICghT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHZhbHVlLCBrZXkpKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgbm4rKztcbiAgICAgICAgaWYgKG5uID49IG4pIHtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICB2YWwgPSBnZXRBdHRyKHZhbHVlLCBrZXkpO1xuICAgICAgICBpZiAodmFsICE9PSB2b2lkIDApIHtcbiAgICAgICAgICBkc3Rba2V5XSA9IGZuKHZhbCwga2V5ID0ga2V5LCBkZCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBkc3Q7XG4gICAgfTtcbiAgICByZXR1cm4gZm4odmFsdWUpO1xuICB9O1xuXG4gIG1vZHVsZS5leHBvcnRzID0gdHJ1bmNhdGU7XG5cbn0pLmNhbGwodGhpcyk7XG5cblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9haXJicmFrZS1qcy9saWIvaW50ZXJuYWwvdHJ1bmNhdGUuanNcbiAqKiBtb2R1bGUgaWQgPSAxMjNcbiAqKiBtb2R1bGUgY2h1bmtzID0gMjRcbiAqKi8iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==");

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

	eval("/* WEBPACK VAR INJECTION */(function(global) {(function() {\n  var jsonifyNotice, report;\n\n  jsonifyNotice = __webpack_require__(122);\n\n  report = function(notice, opts, promise) {\n    var payload, req, url;\n    url = opts.host + \"/api/v3/projects/\" + opts.projectId + \"/notices?key=\" + opts.projectKey;\n    payload = jsonifyNotice(notice);\n    req = new global.XMLHttpRequest();\n    req.open('POST', url, true);\n    req.setRequestHeader('Content-Type', 'application/json');\n    req.send(payload);\n    return req.onreadystatechange = function() {\n      var resp;\n      if (req.readyState === 4 && req.status === 201) {\n        resp = JSON.parse(req.responseText);\n        notice.id = resp.id;\n        return promise.resolve(notice);\n      }\n    };\n  };\n\n  module.exports = report;\n\n}).call(this);\n\n/* WEBPACK VAR INJECTION */}.call(exports, (function() { return this; }())))\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTI0LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9haXJicmFrZS1qcy9saWIvcmVwb3J0ZXJzL3hoci5qcz9jMDYxIl0sInNvdXJjZXNDb250ZW50IjpbIihmdW5jdGlvbigpIHtcbiAgdmFyIGpzb25pZnlOb3RpY2UsIHJlcG9ydDtcblxuICBqc29uaWZ5Tm90aWNlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWwvanNvbmlmeV9ub3RpY2UnKTtcblxuICByZXBvcnQgPSBmdW5jdGlvbihub3RpY2UsIG9wdHMsIHByb21pc2UpIHtcbiAgICB2YXIgcGF5bG9hZCwgcmVxLCB1cmw7XG4gICAgdXJsID0gb3B0cy5ob3N0ICsgXCIvYXBpL3YzL3Byb2plY3RzL1wiICsgb3B0cy5wcm9qZWN0SWQgKyBcIi9ub3RpY2VzP2tleT1cIiArIG9wdHMucHJvamVjdEtleTtcbiAgICBwYXlsb2FkID0ganNvbmlmeU5vdGljZShub3RpY2UpO1xuICAgIHJlcSA9IG5ldyBnbG9iYWwuWE1MSHR0cFJlcXVlc3QoKTtcbiAgICByZXEub3BlbignUE9TVCcsIHVybCwgdHJ1ZSk7XG4gICAgcmVxLnNldFJlcXVlc3RIZWFkZXIoJ0NvbnRlbnQtVHlwZScsICdhcHBsaWNhdGlvbi9qc29uJyk7XG4gICAgcmVxLnNlbmQocGF5bG9hZCk7XG4gICAgcmV0dXJuIHJlcS5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBmdW5jdGlvbigpIHtcbiAgICAgIHZhciByZXNwO1xuICAgICAgaWYgKHJlcS5yZWFkeVN0YXRlID09PSA0ICYmIHJlcS5zdGF0dXMgPT09IDIwMSkge1xuICAgICAgICByZXNwID0gSlNPTi5wYXJzZShyZXEucmVzcG9uc2VUZXh0KTtcbiAgICAgICAgbm90aWNlLmlkID0gcmVzcC5pZDtcbiAgICAgICAgcmV0dXJuIHByb21pc2UucmVzb2x2ZShub3RpY2UpO1xuICAgICAgfVxuICAgIH07XG4gIH07XG5cbiAgbW9kdWxlLmV4cG9ydHMgPSByZXBvcnQ7XG5cbn0pLmNhbGwodGhpcyk7XG5cblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9haXJicmFrZS1qcy9saWIvcmVwb3J0ZXJzL3hoci5qc1xuICoqIG1vZHVsZSBpZCA9IDEyNFxuICoqIG1vZHVsZSBjaHVua3MgPSAyNFxuICoqLyJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=");

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

	eval("/* WEBPACK VAR INJECTION */(function(global) {(function() {\n  var cbCount, jsonifyNotice, report;\n\n  jsonifyNotice = __webpack_require__(122);\n\n  cbCount = 0;\n\n  report = function(notice, opts, promise) {\n    var cbName, document, head, payload, removeScript, script, url;\n    cbCount++;\n    cbName = 'airbrakeCb' + String(cbCount);\n    global[cbName] = function(resp) {\n      var _;\n      notice.id = resp.id;\n      promise.resolve(notice);\n      try {\n        return delete global[cbName];\n      } catch (_error) {\n        _ = _error;\n        return global[cbName] = void 0;\n      }\n    };\n    payload = encodeURIComponent(jsonifyNotice(notice));\n    url = opts.host + \"/api/v3/projects/\" + opts.projectId + \"/create-notice?key=\" + opts.projectKey + \"&callback=\" + cbName + \"&body=\" + payload;\n    document = global.document;\n    head = document.getElementsByTagName('head')[0];\n    script = document.createElement('script');\n    script.src = url;\n    removeScript = function() {\n      return head.removeChild(script);\n    };\n    script.onload = removeScript;\n    script.onerror = removeScript;\n    return head.appendChild(script);\n  };\n\n  module.exports = report;\n\n}).call(this);\n\n/* WEBPACK VAR INJECTION */}.call(exports, (function() { return this; }())))\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTI1LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9haXJicmFrZS1qcy9saWIvcmVwb3J0ZXJzL2pzb25wLmpzP2NmMjMiXSwic291cmNlc0NvbnRlbnQiOlsiKGZ1bmN0aW9uKCkge1xuICB2YXIgY2JDb3VudCwganNvbmlmeU5vdGljZSwgcmVwb3J0O1xuXG4gIGpzb25pZnlOb3RpY2UgPSByZXF1aXJlKCcuLi9pbnRlcm5hbC9qc29uaWZ5X25vdGljZScpO1xuXG4gIGNiQ291bnQgPSAwO1xuXG4gIHJlcG9ydCA9IGZ1bmN0aW9uKG5vdGljZSwgb3B0cywgcHJvbWlzZSkge1xuICAgIHZhciBjYk5hbWUsIGRvY3VtZW50LCBoZWFkLCBwYXlsb2FkLCByZW1vdmVTY3JpcHQsIHNjcmlwdCwgdXJsO1xuICAgIGNiQ291bnQrKztcbiAgICBjYk5hbWUgPSAnYWlyYnJha2VDYicgKyBTdHJpbmcoY2JDb3VudCk7XG4gICAgZ2xvYmFsW2NiTmFtZV0gPSBmdW5jdGlvbihyZXNwKSB7XG4gICAgICB2YXIgXztcbiAgICAgIG5vdGljZS5pZCA9IHJlc3AuaWQ7XG4gICAgICBwcm9taXNlLnJlc29sdmUobm90aWNlKTtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBkZWxldGUgZ2xvYmFsW2NiTmFtZV07XG4gICAgICB9IGNhdGNoIChfZXJyb3IpIHtcbiAgICAgICAgXyA9IF9lcnJvcjtcbiAgICAgICAgcmV0dXJuIGdsb2JhbFtjYk5hbWVdID0gdm9pZCAwO1xuICAgICAgfVxuICAgIH07XG4gICAgcGF5bG9hZCA9IGVuY29kZVVSSUNvbXBvbmVudChqc29uaWZ5Tm90aWNlKG5vdGljZSkpO1xuICAgIHVybCA9IG9wdHMuaG9zdCArIFwiL2FwaS92My9wcm9qZWN0cy9cIiArIG9wdHMucHJvamVjdElkICsgXCIvY3JlYXRlLW5vdGljZT9rZXk9XCIgKyBvcHRzLnByb2plY3RLZXkgKyBcIiZjYWxsYmFjaz1cIiArIGNiTmFtZSArIFwiJmJvZHk9XCIgKyBwYXlsb2FkO1xuICAgIGRvY3VtZW50ID0gZ2xvYmFsLmRvY3VtZW50O1xuICAgIGhlYWQgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnaGVhZCcpWzBdO1xuICAgIHNjcmlwdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NjcmlwdCcpO1xuICAgIHNjcmlwdC5zcmMgPSB1cmw7XG4gICAgcmVtb3ZlU2NyaXB0ID0gZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gaGVhZC5yZW1vdmVDaGlsZChzY3JpcHQpO1xuICAgIH07XG4gICAgc2NyaXB0Lm9ubG9hZCA9IHJlbW92ZVNjcmlwdDtcbiAgICBzY3JpcHQub25lcnJvciA9IHJlbW92ZVNjcmlwdDtcbiAgICByZXR1cm4gaGVhZC5hcHBlbmRDaGlsZChzY3JpcHQpO1xuICB9O1xuXG4gIG1vZHVsZS5leHBvcnRzID0gcmVwb3J0O1xuXG59KS5jYWxsKHRoaXMpO1xuXG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYWlyYnJha2UtanMvbGliL3JlcG9ydGVycy9qc29ucC5qc1xuICoqIG1vZHVsZSBpZCA9IDEyNVxuICoqIG1vZHVsZSBjaHVua3MgPSAyNFxuICoqLyJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");

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

	eval("\"use strict\";\nvar IggAirbrakeExceptionFilter = (function () {\n    function IggAirbrakeExceptionFilter() {\n        this.filteredExceptionPatterns = [];\n    }\n    IggAirbrakeExceptionFilter.prototype.addExceptionFilter = function (regex) {\n        this.filteredExceptionPatterns.push(regex);\n    };\n    IggAirbrakeExceptionFilter.prototype.filter = function (notice) {\n        if (this.filteredExceptionPatterns.length > 0 && notice.errors.length > 0) {\n            var errorMessage_1 = notice.errors[0].message;\n            var matchingFilters = this.filteredExceptionPatterns.filter(function (pattern) { return pattern.test(errorMessage_1); });\n            if (matchingFilters.length > 0) {\n                return null;\n            }\n        }\n        return notice;\n    };\n    return IggAirbrakeExceptionFilter;\n}());\nexports.IggAirbrakeExceptionFilter = IggAirbrakeExceptionFilter;\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.default = IggAirbrakeExceptionFilter;\n\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTI2LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vYW5jaWxsYXJ5L3V0aWxzL2lnZy1haXJicmFrZS1leGNlcHRpb24tZmlsdGVyLnRzP2U4YjEiXSwic291cmNlc0NvbnRlbnQiOlsiXG5leHBvcnQgZGVjbGFyZSBpbnRlcmZhY2UgRXJyb3Ige1xuICBtZXNzYWdlOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBkZWNsYXJlIGludGVyZmFjZSBOb3RpY2Uge1xuICBlcnJvcnM6IEVycm9yW107XG59XG5cbmV4cG9ydCBjbGFzcyBJZ2dBaXJicmFrZUV4Y2VwdGlvbkZpbHRlciB7XG4gIGZpbHRlcmVkRXhjZXB0aW9uUGF0dGVybnM6IEFycmF5PFJlZ0V4cD47XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICB0aGlzLmZpbHRlcmVkRXhjZXB0aW9uUGF0dGVybnMgPSBbXTtcbiAgfVxuXG4gIGFkZEV4Y2VwdGlvbkZpbHRlcihyZWdleDogUmVnRXhwKSB7XG4gICB0aGlzLmZpbHRlcmVkRXhjZXB0aW9uUGF0dGVybnMucHVzaChyZWdleCk7XG4gIH1cblxuICBmaWx0ZXIobm90aWNlOiBOb3RpY2UpIHtcbiAgIGlmICh0aGlzLmZpbHRlcmVkRXhjZXB0aW9uUGF0dGVybnMubGVuZ3RoID4gMCAmJiBub3RpY2UuZXJyb3JzLmxlbmd0aCA+IDApIHtcbiAgICAgbGV0IGVycm9yTWVzc2FnZSA9IG5vdGljZS5lcnJvcnNbMF0ubWVzc2FnZTtcbiAgICAgbGV0IG1hdGNoaW5nRmlsdGVycyA9IHRoaXMuZmlsdGVyZWRFeGNlcHRpb25QYXR0ZXJucy5maWx0ZXIocGF0dGVybiA9PiBwYXR0ZXJuLnRlc3QoZXJyb3JNZXNzYWdlKSk7XG4gICAgIGlmIChtYXRjaGluZ0ZpbHRlcnMubGVuZ3RoID4gMCkge1xuICAgICAgIHJldHVybiBudWxsO1xuICAgICB9XG4gICB9XG4gICByZXR1cm4gbm90aWNlO1xuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IElnZ0FpcmJyYWtlRXhjZXB0aW9uRmlsdGVyO1xuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogLi9+L3RzbGludC1sb2FkZXIhLi9hbmNpbGxhcnkvdXRpbHMvaWdnLWFpcmJyYWtlLWV4Y2VwdGlvbi1maWx0ZXIudHNcbiAqKi8iXSwibWFwcGluZ3MiOiI7QUFTQTtBQUdBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQXJCQTtBQXVCQTtBQUFBOyIsInNvdXJjZVJvb3QiOiIifQ==");

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

	eval("'use strict';\n\niggAutofocusDirective.$inject = [\"$timeout\"];\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = iggAutofocusDirective;\n/*@ngInject*/\nfunction iggAutofocusDirective($timeout) {\n  return {\n    restrict: 'A',\n    scope: {},\n    link: function link(scope, element) {\n      $timeout(function () {\n        element[0].focus();\n      });\n    }\n  };\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTI3LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vYW5jaWxsYXJ5L3V0aWxzL2lnZy1hdXRvZm9jdXMtZGlyZWN0aXZlLmpzP2NiOGUiXSwic291cmNlc0NvbnRlbnQiOlsiLypAbmdJbmplY3QqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gaWdnQXV0b2ZvY3VzRGlyZWN0aXZlKCR0aW1lb3V0KSB7XG4gIHJldHVybiB7XG4gICAgcmVzdHJpY3Q6ICdBJyxcbiAgICBzY29wZToge30sXG4gICAgbGluazogZnVuY3Rpb24gKHNjb3BlLCBlbGVtZW50KSB7XG4gICAgICAkdGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgICAgZWxlbWVudFswXS5mb2N1cygpO1xuICAgICAgfSk7XG4gICAgfVxuICB9O1xufVxuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogLi9hbmNpbGxhcnkvdXRpbHMvaWdnLWF1dG9mb2N1cy1kaXJlY3RpdmUuanNcbiAqKi8iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7O0FBQ0E7QUFDQTs7QUFFQTs7QUFKQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQU5BIiwic291cmNlUm9vdCI6IiJ9");

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

	eval("'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nexports.default = function (CKEDITOR, csrfToken) {\n  if (_.isUndefined(CKEDITOR)) {\n    return {};\n  }\n  return {\n    defaultOptions: {\n      language: 'en',\n      allowedContent: true,\n      entities: false,\n      forcePasteAsPlainText: true,\n      uploadUrl: (0, _metal.ckeditorUploadImagePath)(),\n      filebrowserUploadUrl: (0, _metal.ckeditorUploadDialogImagePath)(),\n      removeDialogTabs: 'image:advanced;link:advanced;image:Link',\n      removeButtons: 'Subscript,Superscript',\n      toolbarGroups: [{ name: 'clipboard', groups: ['clipboard', 'undo'] }, { name: 'editing', groups: ['find', 'selection', 'spellchecker'] }, { name: 'links' }, { name: 'insert' }, { name: 'forms' }, { name: 'tools' }, { name: 'document', groups: ['mode', 'document', 'doctools'] }, { name: 'others' }, '/', { name: 'basicstyles', groups: ['basicstyles', 'cleanup'] }, { name: 'paragraph', groups: ['list', 'indent', 'blocks', 'align', 'bidi'] }, { name: 'styles' }, { name: 'colors' }, { name: 'about' }],\n      toolbar: [{ name: 'basicstyles', items: ['Bold', 'Italic', 'Underline'] }, { name: 'styles', items: ['Format'] }, { name: 'links', items: ['Link', 'Unlink'] }, { name: 'paragraph', items: ['NumberedList', 'BulletedList', '-', 'Outdent', 'Indent', '-', 'Blockquote', 'JustifyLeft', 'JustifyCenter', 'JustifyRight'] }, { name: 'insert', items: ['Image', 'VideoDetector'] }, { name: 'source', items: ['Source'] }],\n      format_tags: 'p;h2;h3',\n      enterMode: CKEDITOR.ENTER_P,\n      extraPlugins: 'videodetector,image,filebrowser,popup,sourcearea,uploadimage',\n      coreStyles_italic: {\n        element: 'i',\n        attributes: { 'class': 'cke_italic' }\n      }\n    },\n\n    onReady: function onReady(editor, onReadyCallback) {\n      editor.uploadRepository.editor.on('fileUploadRequest', function (event) {\n        event.data.fileLoader.xhr.setRequestHeader('X-CSRF-Token', csrfToken.getToken());\n      });\n\n      CKEDITOR.lang.en.format.tag_p = 'Paragraph';\n      CKEDITOR.lang.en.format.tag_h2 = 'Header 1';\n      CKEDITOR.lang.en.format.tag_h3 = 'Header 2';\n\n      if (onReadyCallback) {\n        onReadyCallback(editor);\n      }\n    }\n  };\n};\n\nvar _metal = __webpack_require__(129);\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTI4LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vYW5jaWxsYXJ5L3V0aWxzL2lnZy1ja2VkaXRvci1jb25maWctZmFjdG9yeS5qcz9mN2VjIiwid2VicGFjazovLy8/ZDQxZCJdLCJzb3VyY2VzQ29udGVudCI6WyIvKkBuZ0luamVjdCovXG5cbmltcG9ydCB7IGNrZWRpdG9yVXBsb2FkSW1hZ2VQYXRoLCBja2VkaXRvclVwbG9hZERpYWxvZ0ltYWdlUGF0aCB9IGZyb20gJ3JvdXRlcy9tZXRhbC50cyc7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKENLRURJVE9SLCBjc3JmVG9rZW4pIHtcbiAgaWYgKF8uaXNVbmRlZmluZWQoQ0tFRElUT1IpKSB7XG4gICAgcmV0dXJuIHt9O1xuICB9XG4gIHJldHVybiB7XG4gICAgZGVmYXVsdE9wdGlvbnMgOiB7XG4gICAgICBsYW5ndWFnZTogJ2VuJyxcbiAgICAgIGFsbG93ZWRDb250ZW50OiB0cnVlLFxuICAgICAgZW50aXRpZXM6IGZhbHNlLFxuICAgICAgZm9yY2VQYXN0ZUFzUGxhaW5UZXh0OiB0cnVlLFxuICAgICAgdXBsb2FkVXJsOiBja2VkaXRvclVwbG9hZEltYWdlUGF0aCgpLFxuICAgICAgZmlsZWJyb3dzZXJVcGxvYWRVcmw6IGNrZWRpdG9yVXBsb2FkRGlhbG9nSW1hZ2VQYXRoKCksXG4gICAgICByZW1vdmVEaWFsb2dUYWJzOiAnaW1hZ2U6YWR2YW5jZWQ7bGluazphZHZhbmNlZDtpbWFnZTpMaW5rJyxcbiAgICAgIHJlbW92ZUJ1dHRvbnM6ICdTdWJzY3JpcHQsU3VwZXJzY3JpcHQnLFxuICAgICAgdG9vbGJhckdyb3VwczogW1xuICAgICAgICB7IG5hbWU6ICdjbGlwYm9hcmQnLCAgIGdyb3VwczogWyAnY2xpcGJvYXJkJywgJ3VuZG8nIF0gfSxcbiAgICAgICAgeyBuYW1lOiAnZWRpdGluZycsICAgICBncm91cHM6IFsgJ2ZpbmQnLCAnc2VsZWN0aW9uJywgJ3NwZWxsY2hlY2tlcicgXSB9LFxuICAgICAgICB7IG5hbWU6ICdsaW5rcycgfSxcbiAgICAgICAgeyBuYW1lOiAnaW5zZXJ0JyB9LFxuICAgICAgICB7IG5hbWU6ICdmb3JtcycgfSxcbiAgICAgICAgeyBuYW1lOiAndG9vbHMnIH0sXG4gICAgICAgIHsgbmFtZTogJ2RvY3VtZW50JywgICAgZ3JvdXBzOiBbICdtb2RlJywgJ2RvY3VtZW50JywgJ2RvY3Rvb2xzJyBdIH0sXG4gICAgICAgIHsgbmFtZTogJ290aGVycycgfSxcbiAgICAgICAgJy8nLFxuICAgICAgICB7IG5hbWU6ICdiYXNpY3N0eWxlcycsIGdyb3VwczogWyAnYmFzaWNzdHlsZXMnLCAnY2xlYW51cCcgXSB9LFxuICAgICAgICB7IG5hbWU6ICdwYXJhZ3JhcGgnLCAgIGdyb3VwczogWyAnbGlzdCcsICdpbmRlbnQnLCAnYmxvY2tzJywgJ2FsaWduJywgJ2JpZGknIF0gfSxcbiAgICAgICAgeyBuYW1lOiAnc3R5bGVzJyB9LFxuICAgICAgICB7IG5hbWU6ICdjb2xvcnMnIH0sXG4gICAgICAgIHsgbmFtZTogJ2Fib3V0JyB9XG4gICAgICBdLFxuICAgICAgdG9vbGJhcjogW1xuICAgICAgICB7IG5hbWU6ICdiYXNpY3N0eWxlcycsIGl0ZW1zOiBbICdCb2xkJywgJ0l0YWxpYycsICdVbmRlcmxpbmUnIF0gfSxcbiAgICAgICAgeyBuYW1lOiAnc3R5bGVzJywgaXRlbXM6IFsgJ0Zvcm1hdCcgXSB9LFxuICAgICAgICB7IG5hbWU6ICdsaW5rcycsIGl0ZW1zOiBbICdMaW5rJywgJ1VubGluaycgXSB9LFxuICAgICAgICB7IG5hbWU6ICdwYXJhZ3JhcGgnLCBpdGVtczogWyAnTnVtYmVyZWRMaXN0JywgJ0J1bGxldGVkTGlzdCcsICctJywgJ091dGRlbnQnLCAnSW5kZW50JywgJy0nLCAnQmxvY2txdW90ZScsICdKdXN0aWZ5TGVmdCcsICdKdXN0aWZ5Q2VudGVyJywgJ0p1c3RpZnlSaWdodCcgXSB9LFxuICAgICAgICB7IG5hbWU6ICdpbnNlcnQnLCBpdGVtczogWyAnSW1hZ2UnLCAnVmlkZW9EZXRlY3RvcicgXSB9LFxuICAgICAgICB7IG5hbWU6ICdzb3VyY2UnLCBpdGVtczogWyAnU291cmNlJyBdIH1cbiAgICAgIF0sXG4gICAgICBmb3JtYXRfdGFnczogJ3A7aDI7aDMnLFxuICAgICAgZW50ZXJNb2RlOiBDS0VESVRPUi5FTlRFUl9QLFxuICAgICAgZXh0cmFQbHVnaW5zOiAndmlkZW9kZXRlY3RvcixpbWFnZSxmaWxlYnJvd3Nlcixwb3B1cCxzb3VyY2VhcmVhLHVwbG9hZGltYWdlJyxcbiAgICAgIGNvcmVTdHlsZXNfaXRhbGljOiB7XG4gICAgICAgIGVsZW1lbnQ6ICdpJyxcbiAgICAgICAgYXR0cmlidXRlczogeyAnY2xhc3MnOiAnY2tlX2l0YWxpYycgfVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBvblJlYWR5OiBmdW5jdGlvbihlZGl0b3IsIG9uUmVhZHlDYWxsYmFjaykge1xuICAgICAgZWRpdG9yLnVwbG9hZFJlcG9zaXRvcnkuZWRpdG9yLm9uKCdmaWxlVXBsb2FkUmVxdWVzdCcsIGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgICAgIGV2ZW50LmRhdGEuZmlsZUxvYWRlci54aHIuc2V0UmVxdWVzdEhlYWRlcignWC1DU1JGLVRva2VuJywgY3NyZlRva2VuLmdldFRva2VuKCkpO1xuICAgICAgfSk7XG5cbiAgICAgIENLRURJVE9SLmxhbmcuZW4uZm9ybWF0LnRhZ19wICA9ICdQYXJhZ3JhcGgnO1xuICAgICAgQ0tFRElUT1IubGFuZy5lbi5mb3JtYXQudGFnX2gyID0gJ0hlYWRlciAxJztcbiAgICAgIENLRURJVE9SLmxhbmcuZW4uZm9ybWF0LnRhZ19oMyA9ICdIZWFkZXIgMic7XG5cbiAgICAgIGlmIChvblJlYWR5Q2FsbGJhY2spIHtcbiAgICAgICAgb25SZWFkeUNhbGxiYWNrKGVkaXRvcik7XG4gICAgICB9XG4gICAgfVxuICB9O1xufVxuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogLi9hbmNpbGxhcnkvdXRpbHMvaWdnLWNrZWRpdG9yLWNvbmZpZy1mYWN0b3J5LmpzXG4gKiovIiwidW5kZWZpbmVkXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogXG4gKiovIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUNEQTtBRENBOztBQUVBO0FBQ0E7QUNDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFnQkE7QUFRQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUFJQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7O0FBM0RBIiwic291cmNlUm9vdCI6IiJ9");

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

	eval("\"use strict\";\nfunction ckeditorUploadDialogImagePath() {\n    return \"/ckeditor/upload_dialog_image\";\n}\nexports.ckeditorUploadDialogImagePath = ckeditorUploadDialogImagePath;\nfunction ckeditorUploadImagePath() {\n    return \"/ckeditor/upload_image\";\n}\nexports.ckeditorUploadImagePath = ckeditorUploadImagePath;\nfunction redactorEmbedPath() {\n    return \"/redactor/embed\";\n}\nexports.redactorEmbedPath = redactorEmbedPath;\nfunction redactorUploadImagePath() {\n    return \"/redactor/upload_image\";\n}\nexports.redactorUploadImagePath = redactorUploadImagePath;\n\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTI5LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vY29tcG9uZW50cy9yb3V0ZXMvbWV0YWwudHM/MTU0YyJdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgZnVuY3Rpb24gY2tlZGl0b3JVcGxvYWREaWFsb2dJbWFnZVBhdGgoKSB7XG4gIHJldHVybiBgL2NrZWRpdG9yL3VwbG9hZF9kaWFsb2dfaW1hZ2VgO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGNrZWRpdG9yVXBsb2FkSW1hZ2VQYXRoKCkge1xuICByZXR1cm4gYC9ja2VkaXRvci91cGxvYWRfaW1hZ2VgO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHJlZGFjdG9yRW1iZWRQYXRoKCkge1xuICByZXR1cm4gYC9yZWRhY3Rvci9lbWJlZGA7XG59XG5leHBvcnQgZnVuY3Rpb24gcmVkYWN0b3JVcGxvYWRJbWFnZVBhdGgoKSB7XG4gIHJldHVybiBgL3JlZGFjdG9yL3VwbG9hZF9pbWFnZWA7XG59XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiAuL34vdHNsaW50LWxvYWRlciEuL2NvbXBvbmVudHMvcm91dGVzL21ldGFsLnRzXG4gKiovIl0sIm1hcHBpbmdzIjoiO0FBQUE7QUFDQTtBQUNBO0FBRkE7QUFHQTtBQUNBO0FBQ0E7QUFGQTtBQUdBO0FBQ0E7QUFDQTtBQUZBO0FBR0E7QUFDQTtBQUNBO0FBRkE7Iiwic291cmNlUm9vdCI6IiJ9");

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

	eval("\"use strict\";\n\niggCurrency.$inject = [\"currencies\", \"numberFilter\", \"$sce\"];\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = iggCurrency;\n/*@ngInject*/\nfunction iggCurrency(currencies, numberFilter, $sce) {\n  return function (input, isoNumber, optionsString) {\n    var options = (optionsString || '').split(\",\");\n    var currentCurrency = currencies.forIsoNum(isoNumber);\n\n    var precision = options.indexOf(\"cents\") >= 0 ? 2 : 0;\n    var value = numberFilter(input || 0, precision);\n    var symbolicValue = currentCurrency.symbol + value;\n    var isoCode = currentCurrency.iso_code;\n\n    if (options.indexOf(\"html\") >= 0) {\n      var markup = '<span class=\"currency\"><span>' + symbolicValue + '</span><em>' + isoCode + '</em></span>';\n      return $sce.trustAsHtml(markup);\n    } else if (options.indexOf(\"separated\") >= 0) {\n      return { \"symbolicValue\": symbolicValue, \"isoCode\": isoCode };\n    } else if (options.indexOf('noIso') >= 0) {\n      return symbolicValue;\n    } else {\n      return symbolicValue + \" \" + isoCode;\n    }\n  };\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTMwLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vYW5jaWxsYXJ5L3V0aWxzL2lnZy1jdXJyZW5jeS1maWx0ZXIuanM/MWZkZiJdLCJzb3VyY2VzQ29udGVudCI6WyIvKkBuZ0luamVjdCovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBpZ2dDdXJyZW5jeShjdXJyZW5jaWVzLCBudW1iZXJGaWx0ZXIsICRzY2UpIHtcbiAgICAgIHJldHVybiBmdW5jdGlvbihpbnB1dCwgaXNvTnVtYmVyLCBvcHRpb25zU3RyaW5nKSB7XG4gICAgICAgIHZhciBvcHRpb25zID0gKG9wdGlvbnNTdHJpbmcgfHwgJycpLnNwbGl0KFwiLFwiKTtcbiAgICAgICAgdmFyIGN1cnJlbnRDdXJyZW5jeSA9IGN1cnJlbmNpZXMuZm9ySXNvTnVtKGlzb051bWJlcik7XG5cbiAgICAgICAgdmFyIHByZWNpc2lvbiA9IG9wdGlvbnMuaW5kZXhPZihcImNlbnRzXCIpID49IDAgPyAyIDogMDtcbiAgICAgICAgdmFyIHZhbHVlID0gbnVtYmVyRmlsdGVyKChpbnB1dCB8fCAwKSwgcHJlY2lzaW9uKTtcbiAgICAgICAgdmFyIHN5bWJvbGljVmFsdWUgPSBjdXJyZW50Q3VycmVuY3kuc3ltYm9sICsgdmFsdWU7XG4gICAgICAgIHZhciBpc29Db2RlID0gY3VycmVudEN1cnJlbmN5Lmlzb19jb2RlO1xuXG4gICAgICAgIGlmIChvcHRpb25zLmluZGV4T2YoXCJodG1sXCIpID49IDApIHtcbiAgICAgICAgICB2YXIgbWFya3VwID0gJzxzcGFuIGNsYXNzPVwiY3VycmVuY3lcIj48c3Bhbj4nICsgc3ltYm9saWNWYWx1ZSArICc8L3NwYW4+PGVtPicgK1xuICAgICAgICAgICAgaXNvQ29kZSArICc8L2VtPjwvc3Bhbj4nO1xuICAgICAgICAgIHJldHVybiAkc2NlLnRydXN0QXNIdG1sKG1hcmt1cCk7XG4gICAgICAgIH0gZWxzZSBpZihvcHRpb25zLmluZGV4T2YoXCJzZXBhcmF0ZWRcIikgPj0gMCkge1xuICAgICAgICAgIHJldHVybiB7XCJzeW1ib2xpY1ZhbHVlXCI6IHN5bWJvbGljVmFsdWUsIFwiaXNvQ29kZVwiOiBpc29Db2RlfTtcbiAgICAgICAgfSBlbHNlIGlmIChvcHRpb25zLmluZGV4T2YoJ25vSXNvJykgPj0gMCkge1xuICAgICAgICAgIHJldHVybiBzeW1ib2xpY1ZhbHVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiBzeW1ib2xpY1ZhbHVlICsgXCIgXCIgKyBpc29Db2RlO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgIH1cblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIC4vYW5jaWxsYXJ5L3V0aWxzL2lnZy1jdXJyZW5jeS1maWx0ZXIuanNcbiAqKi8iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7O0FBQ0E7QUFDQTs7QUFFQTs7QUFKQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBbkJBIiwic291cmNlUm9vdCI6IiJ9");

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

	eval("\"use strict\";\n\niggExternal.$inject = [\"callback\"];\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = iggExternal;\n/*@ngInject*/\nfunction iggExternal(callback) {\n  callback.apply(this, arguments);\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTMxLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vYW5jaWxsYXJ5L3V0aWxzL2lnZy1leHRlcm5hbC1mYWN0b3J5LmpzPzQzNDIiXSwic291cmNlc0NvbnRlbnQiOlsiLypAbmdJbmplY3QqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gaWdnRXh0ZXJuYWwoY2FsbGJhY2spIHtcbiAgY2FsbGJhY2suYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn1cblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIC4vYW5jaWxsYXJ5L3V0aWxzL2lnZy1leHRlcm5hbC1mYWN0b3J5LmpzXG4gKiovIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBOztBQUNBO0FBQ0E7O0FBRUE7O0FBSkE7QUFDQTtBQURBIiwic291cmNlUm9vdCI6IiJ9");

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

	eval("'use strict';\n\niggPopover.$inject = [\"$popover\", \"$sce\", \"$compile\", \"$timeout\"];\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = iggPopover;\n/*@ngInject*/\nfunction iggPopover($popover, $sce, $compile, $timeout) {\n  return {\n    restrict: 'A',\n    transclude: true,\n    replace: true,\n    template: function template(elem, attrs) {\n      if (attrs.text) {\n        return __webpack_require__(133);\n      } else if (attrs.html) {\n        return __webpack_require__(134);\n      } else {\n        return __webpack_require__(135);\n      }\n    },\n    scope: {\n      placement: '@',\n      text: '@',\n      entre: '='\n    },\n    link: function link(scope, element, attributes, controller, transclude) {\n      var placement = scope.placement || 'right';\n      if (attributes.html) {\n        scope.trustedHtml = $sce.trustAsHtml(attributes.html);\n      }\n      transclude(function (clone) {\n        var ctx = $(\"<div></div>\");\n        clone.appendTo(ctx);\n        var compiledElement = $compile(ctx)(scope);\n        element.show();\n        $timeout(function () {\n          var popoverOptions = {\n            content: $sce.trustAsHtml(compiledElement.html()),\n            trigger: 'hover click',\n            html: true,\n            placement: placement,\n            autoClose: false\n          };\n          if (typeof attributes.closeDelay !== 'undefined') {\n            popoverOptions.delay = { show: 0, hide: 1500 };\n          }\n          $popover(element, popoverOptions);\n        });\n      });\n    }\n  };\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTMyLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vYW5jaWxsYXJ5L3V0aWxzL2lnZy1wb3BvdmVyLWRpcmVjdGl2ZS5qcz9kYTk5Il0sInNvdXJjZXNDb250ZW50IjpbIi8qQG5nSW5qZWN0Ki9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGlnZ1BvcG92ZXIgKCRwb3BvdmVyLCAkc2NlLCAkY29tcGlsZSwgJHRpbWVvdXQpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICByZXN0cmljdDogJ0EnLFxuICAgICAgICAgIHRyYW5zY2x1ZGU6IHRydWUsXG4gICAgICAgICAgcmVwbGFjZTogdHJ1ZSxcbiAgICAgICAgICB0ZW1wbGF0ZTogZnVuY3Rpb24oZWxlbSwgYXR0cnMpIHtcbiAgICAgICAgICAgIGlmIChhdHRycy50ZXh0KSB7XG4gICAgICAgICAgICAgIHJldHVybiByZXF1aXJlKCcuL2lnZy1wb3BvdmVyLXRleHQuaHRtbCcpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChhdHRycy5odG1sKSB7XG4gICAgICAgICAgICAgIHJldHVybiByZXF1aXJlKCcuL2lnZy1wb3BvdmVyLWh0bWwuaHRtbCcpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHJlcXVpcmUoJy4vaWdnLXBvcG92ZXItaWNvbi5odG1sJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSxcbiAgICAgICAgICBzY29wZToge1xuICAgICAgICAgICAgcGxhY2VtZW50OiAnQCcsXG4gICAgICAgICAgICB0ZXh0OiAnQCcsXG4gICAgICAgICAgICBlbnRyZTogJz0nXG4gICAgICAgICAgfSxcbiAgICAgICAgICBsaW5rOiBmdW5jdGlvbiAoc2NvcGUsIGVsZW1lbnQsIGF0dHJpYnV0ZXMsIGNvbnRyb2xsZXIsIHRyYW5zY2x1ZGUpIHtcbiAgICAgICAgICAgIHZhciBwbGFjZW1lbnQgPSBzY29wZS5wbGFjZW1lbnQgfHwgJ3JpZ2h0JztcbiAgICAgICAgICAgIGlmIChhdHRyaWJ1dGVzLmh0bWwpIHtcbiAgICAgICAgICAgICAgc2NvcGUudHJ1c3RlZEh0bWwgPSAkc2NlLnRydXN0QXNIdG1sKGF0dHJpYnV0ZXMuaHRtbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0cmFuc2NsdWRlKGZ1bmN0aW9uIChjbG9uZSkge1xuICAgICAgICAgICAgICB2YXIgY3R4ID0gJChcIjxkaXY+PC9kaXY+XCIpO1xuICAgICAgICAgICAgICBjbG9uZS5hcHBlbmRUbyhjdHgpO1xuICAgICAgICAgICAgICB2YXIgY29tcGlsZWRFbGVtZW50ID0gJGNvbXBpbGUoY3R4KShzY29wZSk7XG4gICAgICAgICAgICAgIGVsZW1lbnQuc2hvdygpO1xuICAgICAgICAgICAgICAkdGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgdmFyIHBvcG92ZXJPcHRpb25zID0ge1xuICAgICAgICAgICAgICAgICAgY29udGVudDogJHNjZS50cnVzdEFzSHRtbChjb21waWxlZEVsZW1lbnQuaHRtbCgpKSxcbiAgICAgICAgICAgICAgICAgIHRyaWdnZXI6ICdob3ZlciBjbGljaycsXG4gICAgICAgICAgICAgICAgICBodG1sOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgcGxhY2VtZW50OiBwbGFjZW1lbnQsXG4gICAgICAgICAgICAgICAgICBhdXRvQ2xvc2U6IGZhbHNlXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mKGF0dHJpYnV0ZXMuY2xvc2VEZWxheSkgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgICBwb3BvdmVyT3B0aW9ucy5kZWxheSA9IHtzaG93OiAwLCBoaWRlOiAxNTAwfTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgJHBvcG92ZXIoZWxlbWVudCwgcG9wb3Zlck9wdGlvbnMpO1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgIH07XG4gICAgfVxuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogLi9hbmNpbGxhcnkvdXRpbHMvaWdnLXBvcG92ZXItZGlyZWN0aXZlLmpzXG4gKiovIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBOztBQUNBO0FBQ0E7O0FBRUE7O0FBSkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7Ozs7QUF4Q0EiLCJzb3VyY2VSb290IjoiIn0=");

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

	eval("module.exports = \"<span class=\\\"iggPopoverText\\\" ng-class=\\\"{ 'entreTooltip' : entre }\\\">{{text}}</span>\\n\";\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTMzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vYW5jaWxsYXJ5L3V0aWxzL2lnZy1wb3BvdmVyLXRleHQuaHRtbD85MGEzIl0sInNvdXJjZXNDb250ZW50IjpbIm1vZHVsZS5leHBvcnRzID0gXCI8c3BhbiBjbGFzcz1cXFwiaWdnUG9wb3ZlclRleHRcXFwiIG5nLWNsYXNzPVxcXCJ7ICdlbnRyZVRvb2x0aXAnIDogZW50cmUgfVxcXCI+e3t0ZXh0fX08L3NwYW4+XFxuXCI7XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL2FuY2lsbGFyeS91dGlscy9pZ2ctcG9wb3Zlci10ZXh0Lmh0bWxcbiAqKiBtb2R1bGUgaWQgPSAxMzNcbiAqKiBtb2R1bGUgY2h1bmtzID0gMjRcbiAqKi8iXSwibWFwcGluZ3MiOiJBQUFBIiwic291cmNlUm9vdCI6IiJ9");

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

	eval("module.exports = \"<span class=\\\"iggPopoverHtml\\\" ng-class=\\\"{ 'entreTooltip' : entre }\\\" ng-bind-html=\\\"trustedHtml\\\"></span>\\n\";\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTM0LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vYW5jaWxsYXJ5L3V0aWxzL2lnZy1wb3BvdmVyLWh0bWwuaHRtbD9kZWNmIl0sInNvdXJjZXNDb250ZW50IjpbIm1vZHVsZS5leHBvcnRzID0gXCI8c3BhbiBjbGFzcz1cXFwiaWdnUG9wb3Zlckh0bWxcXFwiIG5nLWNsYXNzPVxcXCJ7ICdlbnRyZVRvb2x0aXAnIDogZW50cmUgfVxcXCIgbmctYmluZC1odG1sPVxcXCJ0cnVzdGVkSHRtbFxcXCI+PC9zcGFuPlxcblwiO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9hbmNpbGxhcnkvdXRpbHMvaWdnLXBvcG92ZXItaHRtbC5odG1sXG4gKiogbW9kdWxlIGlkID0gMTM0XG4gKiogbW9kdWxlIGNodW5rcyA9IDI0XG4gKiovIl0sIm1hcHBpbmdzIjoiQUFBQSIsInNvdXJjZVJvb3QiOiIifQ==");

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

	eval("module.exports = \"<span class=\\\"infoBubble\\\" ng-class=\\\"{ 'entreTooltip' : entre }\\\">\\n  <svg-icon icon=\\\"icon-icon-help\\\" ng-if=\\\"!entre\\\"></svg-icon>\\n  <svg-icon icon=\\\"icon-tooltip-question\\\" ng-if=\\\"entre\\\"></svg-icon>\\n</span>\\n\";\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTM1LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vYW5jaWxsYXJ5L3V0aWxzL2lnZy1wb3BvdmVyLWljb24uaHRtbD80ZmZiIl0sInNvdXJjZXNDb250ZW50IjpbIm1vZHVsZS5leHBvcnRzID0gXCI8c3BhbiBjbGFzcz1cXFwiaW5mb0J1YmJsZVxcXCIgbmctY2xhc3M9XFxcInsgJ2VudHJlVG9vbHRpcCcgOiBlbnRyZSB9XFxcIj5cXG4gIDxzdmctaWNvbiBpY29uPVxcXCJpY29uLWljb24taGVscFxcXCIgbmctaWY9XFxcIiFlbnRyZVxcXCI+PC9zdmctaWNvbj5cXG4gIDxzdmctaWNvbiBpY29uPVxcXCJpY29uLXRvb2x0aXAtcXVlc3Rpb25cXFwiIG5nLWlmPVxcXCJlbnRyZVxcXCI+PC9zdmctaWNvbj5cXG48L3NwYW4+XFxuXCI7XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL2FuY2lsbGFyeS91dGlscy9pZ2ctcG9wb3Zlci1pY29uLmh0bWxcbiAqKiBtb2R1bGUgaWQgPSAxMzVcbiAqKiBtb2R1bGUgY2h1bmtzID0gMjRcbiAqKi8iXSwibWFwcGluZ3MiOiJBQUFBIiwic291cmNlUm9vdCI6IiJ9");

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

	eval("'use strict';\n\niggProjectCard.$inject = [\"projectCard\"];\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = iggProjectCard;\n/*@ngInject*/\nfunction iggProjectCard(projectCard) {\n  return {\n    restrict: 'A',\n    link: function link(scope, element) {\n      projectCard.setupDelayedImageLoad(element);\n      projectCard.ellipsizeProjectCardTagline(element);\n    }\n  };\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTM2LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vYW5jaWxsYXJ5L3V0aWxzL2lnZy1wcm9qZWN0LWNhcmQtZGlyZWN0aXZlLmpzP2I1OTMiXSwic291cmNlc0NvbnRlbnQiOlsiLypAbmdJbmplY3QqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gaWdnUHJvamVjdENhcmQgKHByb2plY3RDYXJkKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgcmVzdHJpY3Q6ICdBJyxcbiAgICAgICAgICBsaW5rOiBmdW5jdGlvbiAoc2NvcGUsIGVsZW1lbnQpIHtcbiAgICAgICAgICAgIHByb2plY3RDYXJkLnNldHVwRGVsYXllZEltYWdlTG9hZChlbGVtZW50KTtcbiAgICAgICAgICAgIHByb2plY3RDYXJkLmVsbGlwc2l6ZVByb2plY3RDYXJkVGFnbGluZShlbGVtZW50KTtcbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICB9XG5cblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIC4vYW5jaWxsYXJ5L3V0aWxzL2lnZy1wcm9qZWN0LWNhcmQtZGlyZWN0aXZlLmpzXG4gKiovIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBOztBQUNBO0FBQ0E7O0FBRUE7O0FBSkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFMQSIsInNvdXJjZVJvb3QiOiIifQ==");

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

	eval("'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = ignoreDirty;\n/*@ngInject*/\nfunction ignoreDirty() {\n  return {\n    restrict: 'A',\n    require: 'ngModel',\n    link: function link(scope, element, attributes, ngModel) {\n      ngModel.$setPristine = function () {};\n      ngModel.$pristine = false;\n    }\n  };\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTM3LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vYW5jaWxsYXJ5L3V0aWxzL2lnbm9yZS1kaXJ0eS1kaXJlY3RpdmUuanM/MGFjMCJdLCJzb3VyY2VzQ29udGVudCI6WyIvKkBuZ0luamVjdCovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBpZ25vcmVEaXJ0eSgpIHtcbiAgcmV0dXJuIHtcbiAgICByZXN0cmljdDogJ0EnLFxuICAgIHJlcXVpcmU6ICduZ01vZGVsJyxcbiAgICBsaW5rOiBmdW5jdGlvbihzY29wZSwgZWxlbWVudCwgYXR0cmlidXRlcywgbmdNb2RlbCkge1xuICAgICAgbmdNb2RlbC4kc2V0UHJpc3RpbmUgPSBmdW5jdGlvbigpIHt9O1xuICAgICAgbmdNb2RlbC4kcHJpc3RpbmUgPSBmYWxzZTtcbiAgICB9XG4gIH07XG59XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiAuL2FuY2lsbGFyeS91dGlscy9pZ25vcmUtZGlydHktZGlyZWN0aXZlLmpzXG4gKiovIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFKQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBTkEiLCJzb3VyY2VSb290IjoiIn0=");

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

	eval("'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = individualAvatar;\n/*@ngInject*/\nfunction individualAvatar() {\n  return {\n    scope: {\n      individualAvatar: '@'\n    },\n    template: __webpack_require__(139),\n    restrict: 'A',\n    replace: true,\n    link: function link($scope, $element) {}\n  };\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTM4LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vYW5jaWxsYXJ5L3V0aWxzL2luZGl2aWR1YWwtYXZhdGFyLWRpcmVjdGl2ZS5qcz8xYTg2Il0sInNvdXJjZXNDb250ZW50IjpbIi8qQG5nSW5qZWN0Ki9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGluZGl2aWR1YWxBdmF0YXIoKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBzY29wZToge1xuICAgICAgICAgIGluZGl2aWR1YWxBdmF0YXI6ICdAJ1xuICAgICAgICB9LFxuICAgICAgICB0ZW1wbGF0ZTogcmVxdWlyZSgnLi9pbmRpdmlkdWFsLWF2YXRhci1kaXJlY3RpdmUuaHRtbCcpLFxuICAgICAgICByZXN0cmljdDogJ0EnLFxuICAgICAgICByZXBsYWNlOiB0cnVlLFxuICAgICAgICBsaW5rOiBmdW5jdGlvbigkc2NvcGUsICRlbGVtZW50KSB7XG5cbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiAuL2FuY2lsbGFyeS91dGlscy9pbmRpdmlkdWFsLWF2YXRhci1kaXJlY3RpdmUuanNcbiAqKi8iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUpBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQVJBIiwic291cmNlUm9vdCI6IiJ9");

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

	eval("module.exports = \"<div class=\\\"individualAvatar\\\">\\n  <img ng-if=\\\"individualAvatar\\\" ng-src=\\\"{{individualAvatar}}\\\" />\\n  <span class=\\\"missingAvatar\\\" ng-if=\\\"!individualAvatar\\\"></span>\\n</div>\\n\";\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTM5LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vYW5jaWxsYXJ5L3V0aWxzL2luZGl2aWR1YWwtYXZhdGFyLWRpcmVjdGl2ZS5odG1sPzRiYjYiXSwic291cmNlc0NvbnRlbnQiOlsibW9kdWxlLmV4cG9ydHMgPSBcIjxkaXYgY2xhc3M9XFxcImluZGl2aWR1YWxBdmF0YXJcXFwiPlxcbiAgPGltZyBuZy1pZj1cXFwiaW5kaXZpZHVhbEF2YXRhclxcXCIgbmctc3JjPVxcXCJ7e2luZGl2aWR1YWxBdmF0YXJ9fVxcXCIgLz5cXG4gIDxzcGFuIGNsYXNzPVxcXCJtaXNzaW5nQXZhdGFyXFxcIiBuZy1pZj1cXFwiIWluZGl2aWR1YWxBdmF0YXJcXFwiPjwvc3Bhbj5cXG48L2Rpdj5cXG5cIjtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vYW5jaWxsYXJ5L3V0aWxzL2luZGl2aWR1YWwtYXZhdGFyLWRpcmVjdGl2ZS5odG1sXG4gKiogbW9kdWxlIGlkID0gMTM5XG4gKiogbW9kdWxlIGNodW5rcyA9IDI0XG4gKiovIl0sIm1hcHBpbmdzIjoiQUFBQSIsInNvdXJjZVJvb3QiOiIifQ==");

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

	eval("'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nexports.default = function () {\n  return {\n    scope: {\n      message: '@',\n      linkText: '@',\n      link: '@',\n      onGenerosity: '@'\n    },\n    template: __webpack_require__(141),\n    link: function link(scope, element) {\n      scope.hideMessage = function () {\n        element.addClass('hidden');\n      };\n    }\n  };\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTQwLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vYW5jaWxsYXJ5L3V0aWxzL2luZm8tbWVzc2FnZS1kaXJlY3RpdmUuanM/YzYwZCJdLCJzb3VyY2VzQ29udGVudCI6WyIvKkBuZ0luamVjdCovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4ge1xuICAgICAgc2NvcGU6IHtcbiAgICAgICAgbWVzc2FnZTogJ0AnLFxuICAgICAgICBsaW5rVGV4dDogJ0AnLFxuICAgICAgICBsaW5rOiAnQCcsXG4gICAgICAgIG9uR2VuZXJvc2l0eTogJ0AnXG4gICAgICB9LFxuICAgICAgdGVtcGxhdGU6IHJlcXVpcmUoJy4vaW5mby1tZXNzYWdlLmh0bWwnKSxcbiAgICAgIGxpbms6IGZ1bmN0aW9uKHNjb3BlLCBlbGVtZW50KSB7XG4gICAgICAgIHNjb3BlLmhpZGVNZXNzYWdlID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgZWxlbWVudC5hZGRDbGFzcygnaGlkZGVuJyk7XG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogLi9hbmNpbGxhcnkvdXRpbHMvaW5mby1tZXNzYWdlLWRpcmVjdGl2ZS5qc1xuICoqLyJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBSkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOzs7O0FBWEEiLCJzb3VyY2VSb290IjoiIn0=");

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

	eval("module.exports = \"<div class=\\\"container i-info-message-container\\\">\\n  <span class=\\\"info-message-text i-info-message-text\\\">\\n    <span class=\\\"info-message-message\\\">{{::message}}</span> <a ng-href=\\\"{{::link}}\\\" class=\\\"info-message-link i-cta-1 i-cta-1--ghostWhite small-ghost-cta--dark\\\" ng-if=\\\"link\\\">{{::linkText}}</a>\\n  </span>\\n  <svg-icon icon=\\\"icon-icon-close\\\" ng-class=\\\"{'container': onGenerosity}\\\" ng-click=\\\"hideMessage()\\\"></svg-icon>\\n</div>\\n\";\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTQxLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vYW5jaWxsYXJ5L3V0aWxzL2luZm8tbWVzc2FnZS5odG1sP2JkOWIiXSwic291cmNlc0NvbnRlbnQiOlsibW9kdWxlLmV4cG9ydHMgPSBcIjxkaXYgY2xhc3M9XFxcImNvbnRhaW5lciBpLWluZm8tbWVzc2FnZS1jb250YWluZXJcXFwiPlxcbiAgPHNwYW4gY2xhc3M9XFxcImluZm8tbWVzc2FnZS10ZXh0IGktaW5mby1tZXNzYWdlLXRleHRcXFwiPlxcbiAgICA8c3BhbiBjbGFzcz1cXFwiaW5mby1tZXNzYWdlLW1lc3NhZ2VcXFwiPnt7OjptZXNzYWdlfX08L3NwYW4+IDxhIG5nLWhyZWY9XFxcInt7OjpsaW5rfX1cXFwiIGNsYXNzPVxcXCJpbmZvLW1lc3NhZ2UtbGluayBpLWN0YS0xIGktY3RhLTEtLWdob3N0V2hpdGUgc21hbGwtZ2hvc3QtY3RhLS1kYXJrXFxcIiBuZy1pZj1cXFwibGlua1xcXCI+e3s6OmxpbmtUZXh0fX08L2E+XFxuICA8L3NwYW4+XFxuICA8c3ZnLWljb24gaWNvbj1cXFwiaWNvbi1pY29uLWNsb3NlXFxcIiBuZy1jbGFzcz1cXFwieydjb250YWluZXInOiBvbkdlbmVyb3NpdHl9XFxcIiBuZy1jbGljaz1cXFwiaGlkZU1lc3NhZ2UoKVxcXCI+PC9zdmctaWNvbj5cXG48L2Rpdj5cXG5cIjtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vYW5jaWxsYXJ5L3V0aWxzL2luZm8tbWVzc2FnZS5odG1sXG4gKiogbW9kdWxlIGlkID0gMTQxXG4gKiogbW9kdWxlIGNodW5rcyA9IDI0XG4gKiovIl0sIm1hcHBpbmdzIjoiQUFBQSIsInNvdXJjZVJvb3QiOiIifQ==");

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

	eval("'use strict';\n\ninsightsContribAwarenessMessageNotification.$inject = [\"$timeout\", \"i18n\", \"$cookies\", \"gogoEvents\"];\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = insightsContribAwarenessMessageNotification;\n/*@ngInject*/\nfunction insightsContribAwarenessMessageNotification($timeout, i18n, $cookies, gogoEvents) {\n  return {\n    restrict: 'E',\n    scope: {\n      projectSlug: '@'\n    },\n    template: __webpack_require__(143),\n    transclude: true,\n    replace: true,\n    link: function link(scope) {\n      scope.i18n = i18n;\n      scope.hideBanner = false;\n      scope.messageHeader = i18n.t('insights_contrib_awareness.banner.did_you_know');\n      scope.messageDescription = i18n.t('insights_contrib_awareness.banner.description');\n\n      gogoEvents.track({\n        thetaName: 'command-center-insights.campaign-page-prompt/view',\n        gaEventCategory: 'Command Center Insights',\n        gaEventAction: 'Campaign Page Prompt',\n        gaEventLabel: 'View'\n      });\n\n      scope.goToDashboard = function () {\n        $cookies.put('insights_contrib_awareness_prompted', 'true'); // persist in a cookie since it's not in the db\n        gogoEvents.track({\n          thetaName: 'command-center-insights.campaign-page-prompt-view-dashboard/click',\n          gaEventCategory: 'Command Center Insights',\n          gaEventAction: 'Campaign Page Prompt View Dashboard',\n          gaEventLabel: 'Click'\n        });\n        window.location = \"/command_center/\" + scope.projectSlug + '#/insights?utm_source=igg&utm_medium=banner&utm_content=CTA&utm_campaign=dashboardnotification';\n      };\n\n      scope.gotIt = function () {\n        $cookies.put('insights_contrib_awareness_prompted', 'true'); // persist in a cookie since it's not in the db\n        gogoEvents.track({\n          thetaName: 'command-center-insights.campaign-page-prompt-got-it/click',\n          gaEventCategory: 'Command Center Insights',\n          gaEventAction: 'Campaign Page Prompt Got It',\n          gaEventLabel: 'Click'\n        });\n\n        scope.hideBanner = true;\n      };\n    }\n  };\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTQyLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vYW5jaWxsYXJ5L3V0aWxzL2luc2lnaHRzLWNvbnRyaWItYXdhcmVuZXNzLW1lc3NhZ2Utbm90aWZpY2F0aW9uLWRpcmVjdGl2ZS5qcz84ZGRjIl0sInNvdXJjZXNDb250ZW50IjpbIi8qQG5nSW5qZWN0Ki9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGluc2lnaHRzQ29udHJpYkF3YXJlbmVzc01lc3NhZ2VOb3RpZmljYXRpb24oJHRpbWVvdXQsIGkxOG4sICRjb29raWVzLCBnb2dvRXZlbnRzKSB7XG4gIHJldHVybiB7XG4gICAgcmVzdHJpY3Q6ICdFJyxcbiAgICBzY29wZToge1xuICAgICAgcHJvamVjdFNsdWc6ICdAJ1xuICAgIH0sXG4gICAgdGVtcGxhdGU6IHJlcXVpcmUoJy4vaW5zaWdodHMtY29udHJpYi1hd2FyZW5lc3MtbWVzc2FnZS1ub3RpZmljYXRpb24uaHRtbCcpLFxuICAgIHRyYW5zY2x1ZGU6IHRydWUsXG4gICAgcmVwbGFjZTogdHJ1ZSxcbiAgICBsaW5rOiBmdW5jdGlvbiAoc2NvcGUpIHtcbiAgICAgIHNjb3BlLmkxOG4gPSBpMThuO1xuICAgICAgc2NvcGUuaGlkZUJhbm5lciA9IGZhbHNlO1xuICAgICAgc2NvcGUubWVzc2FnZUhlYWRlciA9IGkxOG4udCgnaW5zaWdodHNfY29udHJpYl9hd2FyZW5lc3MuYmFubmVyLmRpZF95b3Vfa25vdycpO1xuICAgICAgc2NvcGUubWVzc2FnZURlc2NyaXB0aW9uID0gaTE4bi50KCdpbnNpZ2h0c19jb250cmliX2F3YXJlbmVzcy5iYW5uZXIuZGVzY3JpcHRpb24nKTtcblxuICAgICAgZ29nb0V2ZW50cy50cmFjayh7XG4gICAgICAgIHRoZXRhTmFtZTogJ2NvbW1hbmQtY2VudGVyLWluc2lnaHRzLmNhbXBhaWduLXBhZ2UtcHJvbXB0L3ZpZXcnLFxuICAgICAgICBnYUV2ZW50Q2F0ZWdvcnk6ICdDb21tYW5kIENlbnRlciBJbnNpZ2h0cycsXG4gICAgICAgIGdhRXZlbnRBY3Rpb246ICdDYW1wYWlnbiBQYWdlIFByb21wdCcsXG4gICAgICAgIGdhRXZlbnRMYWJlbDogJ1ZpZXcnXG4gICAgICB9KTtcblxuICAgICAgc2NvcGUuZ29Ub0Rhc2hib2FyZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgJGNvb2tpZXMucHV0KCdpbnNpZ2h0c19jb250cmliX2F3YXJlbmVzc19wcm9tcHRlZCcsICd0cnVlJyk7IC8vIHBlcnNpc3QgaW4gYSBjb29raWUgc2luY2UgaXQncyBub3QgaW4gdGhlIGRiXG4gICAgICAgIGdvZ29FdmVudHMudHJhY2soe1xuICAgICAgICAgIHRoZXRhTmFtZTogJ2NvbW1hbmQtY2VudGVyLWluc2lnaHRzLmNhbXBhaWduLXBhZ2UtcHJvbXB0LXZpZXctZGFzaGJvYXJkL2NsaWNrJyxcbiAgICAgICAgICBnYUV2ZW50Q2F0ZWdvcnk6ICdDb21tYW5kIENlbnRlciBJbnNpZ2h0cycsXG4gICAgICAgICAgZ2FFdmVudEFjdGlvbjogJ0NhbXBhaWduIFBhZ2UgUHJvbXB0IFZpZXcgRGFzaGJvYXJkJyxcbiAgICAgICAgICBnYUV2ZW50TGFiZWw6ICdDbGljaydcbiAgICAgICAgfSk7XG4gICAgICAgIHdpbmRvdy5sb2NhdGlvbiA9IFwiL2NvbW1hbmRfY2VudGVyL1wiICsgc2NvcGUucHJvamVjdFNsdWcgKyAnIy9pbnNpZ2h0cz91dG1fc291cmNlPWlnZyZ1dG1fbWVkaXVtPWJhbm5lciZ1dG1fY29udGVudD1DVEEmdXRtX2NhbXBhaWduPWRhc2hib2FyZG5vdGlmaWNhdGlvbic7XG4gICAgICB9O1xuXG4gICAgICBzY29wZS5nb3RJdCA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAkY29va2llcy5wdXQoJ2luc2lnaHRzX2NvbnRyaWJfYXdhcmVuZXNzX3Byb21wdGVkJywgJ3RydWUnKTsgLy8gcGVyc2lzdCBpbiBhIGNvb2tpZSBzaW5jZSBpdCdzIG5vdCBpbiB0aGUgZGJcbiAgICAgICAgZ29nb0V2ZW50cy50cmFjayh7XG4gICAgICAgICAgdGhldGFOYW1lOiAnY29tbWFuZC1jZW50ZXItaW5zaWdodHMuY2FtcGFpZ24tcGFnZS1wcm9tcHQtZ290LWl0L2NsaWNrJyxcbiAgICAgICAgICBnYUV2ZW50Q2F0ZWdvcnk6ICdDb21tYW5kIENlbnRlciBJbnNpZ2h0cycsXG4gICAgICAgICAgZ2FFdmVudEFjdGlvbjogJ0NhbXBhaWduIFBhZ2UgUHJvbXB0IEdvdCBJdCcsXG4gICAgICAgICAgZ2FFdmVudExhYmVsOiAnQ2xpY2snXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHNjb3BlLmhpZGVCYW5uZXIgPSB0cnVlO1xuICAgICAgfTtcbiAgICB9XG4gIH07XG59XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiAuL2FuY2lsbGFyeS91dGlscy9pbnNpZ2h0cy1jb250cmliLWF3YXJlbmVzcy1tZXNzYWdlLW5vdGlmaWNhdGlvbi1kaXJlY3RpdmUuanNcbiAqKi8iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7O0FBQ0E7QUFDQTs7QUFFQTs7QUFKQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFEQTtBQUdBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOzs7QUFHQTtBQUNBO0FBREE7QUFHQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7Ozs7QUExQ0EiLCJzb3VyY2VSb290IjoiIn0=");

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

	eval("module.exports = \"<div ng-hide=\\\"hideBanner\\\">\\n  <div class=\\\"messageNotification messageNotification--info messageNotification--raised messageNotification--fixedHeight\\\">\\n    <div class=\\\"container\\\">\\n      <div class=\\\"col-md-12\\\">\\n        <div class=\\\"messageNotification-header\\\">{{messageHeader}}</div>\\n        {{messageDescription}}\\n        <div class=\\\"messageNotification-buttons\\\">\\n          <button class=\\\"cta-4 cta-4--small cta-4--purple\\\" ng-click=\\\"goToDashboard()\\\">{{::i18n.t('view_dashboard')}}</button> <button class=\\\"cta-4 cta-4-secondary cta-4-secondary--purple cta-4-secondary--small\\\" ng-click=\\\"gotIt()\\\">{{::i18n.t('got_it')}}</button>\\n        </div>\\n      </div>\\n    </div>\\n  </div>\\n</div>\\n\";\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTQzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vYW5jaWxsYXJ5L3V0aWxzL2luc2lnaHRzLWNvbnRyaWItYXdhcmVuZXNzLW1lc3NhZ2Utbm90aWZpY2F0aW9uLmh0bWw/ZDcyYiJdLCJzb3VyY2VzQ29udGVudCI6WyJtb2R1bGUuZXhwb3J0cyA9IFwiPGRpdiBuZy1oaWRlPVxcXCJoaWRlQmFubmVyXFxcIj5cXG4gIDxkaXYgY2xhc3M9XFxcIm1lc3NhZ2VOb3RpZmljYXRpb24gbWVzc2FnZU5vdGlmaWNhdGlvbi0taW5mbyBtZXNzYWdlTm90aWZpY2F0aW9uLS1yYWlzZWQgbWVzc2FnZU5vdGlmaWNhdGlvbi0tZml4ZWRIZWlnaHRcXFwiPlxcbiAgICA8ZGl2IGNsYXNzPVxcXCJjb250YWluZXJcXFwiPlxcbiAgICAgIDxkaXYgY2xhc3M9XFxcImNvbC1tZC0xMlxcXCI+XFxuICAgICAgICA8ZGl2IGNsYXNzPVxcXCJtZXNzYWdlTm90aWZpY2F0aW9uLWhlYWRlclxcXCI+e3ttZXNzYWdlSGVhZGVyfX08L2Rpdj5cXG4gICAgICAgIHt7bWVzc2FnZURlc2NyaXB0aW9ufX1cXG4gICAgICAgIDxkaXYgY2xhc3M9XFxcIm1lc3NhZ2VOb3RpZmljYXRpb24tYnV0dG9uc1xcXCI+XFxuICAgICAgICAgIDxidXR0b24gY2xhc3M9XFxcImN0YS00IGN0YS00LS1zbWFsbCBjdGEtNC0tcHVycGxlXFxcIiBuZy1jbGljaz1cXFwiZ29Ub0Rhc2hib2FyZCgpXFxcIj57ezo6aTE4bi50KCd2aWV3X2Rhc2hib2FyZCcpfX08L2J1dHRvbj4gPGJ1dHRvbiBjbGFzcz1cXFwiY3RhLTQgY3RhLTQtc2Vjb25kYXJ5IGN0YS00LXNlY29uZGFyeS0tcHVycGxlIGN0YS00LXNlY29uZGFyeS0tc21hbGxcXFwiIG5nLWNsaWNrPVxcXCJnb3RJdCgpXFxcIj57ezo6aTE4bi50KCdnb3RfaXQnKX19PC9idXR0b24+XFxuICAgICAgICA8L2Rpdj5cXG4gICAgICA8L2Rpdj5cXG4gICAgPC9kaXY+XFxuICA8L2Rpdj5cXG48L2Rpdj5cXG5cIjtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vYW5jaWxsYXJ5L3V0aWxzL2luc2lnaHRzLWNvbnRyaWItYXdhcmVuZXNzLW1lc3NhZ2Utbm90aWZpY2F0aW9uLmh0bWxcbiAqKiBtb2R1bGUgaWQgPSAxNDNcbiAqKiBtb2R1bGUgY2h1bmtzID0gMjRcbiAqKi8iXSwibWFwcGluZ3MiOiJBQUFBIiwic291cmNlUm9vdCI6IiJ9");

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

	eval("'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nexports.default = function ($http, $interpolate) {\n  var urls = { show: null };\n\n  return {\n    setUrls: function setUrls(u) {\n      if (angular.isUndefined(u.show)) {\n        throw new Error('a show url is required');\n      }\n\n      urls.show = u.show;\n    },\n\n    get: function get(jobId) {\n      var url = $interpolate(urls.show)({ id: jobId });\n      return $http.get(url);\n    }\n  };\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTQ0LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vYW5jaWxsYXJ5L3V0aWxzL2pvYi1zdGF0dXMtYXBpLWZhY3RvcnkuanM/MGQ3OSJdLCJzb3VyY2VzQ29udGVudCI6WyIvKkBuZ0luamVjdCovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbigkaHR0cCwgJGludGVycG9sYXRlKSB7XG4gICAgdmFyIHVybHMgPSB7IHNob3c6IG51bGwgfTtcblxuICAgIHJldHVybiB7XG4gICAgICBzZXRVcmxzIDogZnVuY3Rpb24odSkge1xuICAgICAgICBpZihhbmd1bGFyLmlzVW5kZWZpbmVkKHUuc2hvdykpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2Egc2hvdyB1cmwgaXMgcmVxdWlyZWQnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHVybHMuc2hvdyA9IHUuc2hvdztcbiAgICAgIH0sXG5cbiAgICAgIGdldCA6IGZ1bmN0aW9uKGpvYklkKSB7XG4gICAgICAgIHZhciB1cmwgPSAkaW50ZXJwb2xhdGUodXJscy5zaG93KSh7IGlkOiBqb2JJZCB9KTtcbiAgICAgICAgcmV0dXJuICRodHRwLmdldCh1cmwpO1xuICAgICAgfVxuICAgIH07XG4gIH1cblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIC4vYW5jaWxsYXJ5L3V0aWxzL2pvYi1zdGF0dXMtYXBpLWZhY3RvcnkuanNcbiAqKi8iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUpBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7OztBQUdBO0FBQ0E7QUFDQTs7O0FBZEEiLCJzb3VyY2VSb290IjoiIn0=");

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

	eval("'use strict';\n\njobStatusPoller.$inject = [\"$timeout\", \"jobStatusApi\"];\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = jobStatusPoller;\n/*@ngInject*/\nfunction jobStatusPoller($timeout, jobStatusApi) {\n  var canceled = false;\n\n  return {\n    poll: function poll(uuid, period, callback) {\n      if (typeof callback !== 'function') {\n        throw new Error('a callback function is required');\n      }\n\n      function onSuccess(response) {\n        if (response.data.status === 'queued' || response.data.status === 'working') {\n          $timeout(function () {\n            if (!canceled) {\n              jobStatusApi.get(uuid).then(onSuccess, onFailure);\n            }\n          }, period);\n        }\n        callback(response);\n      }\n\n      function onFailure(response) {\n        callback(null);\n      }\n\n      jobStatusApi.get(uuid).then(onSuccess, onFailure);\n    },\n    cancel: function cancel() {\n      canceled = true;\n    },\n    reset: function reset() {\n      canceled = false;\n    }\n  };\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTQ1LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vYW5jaWxsYXJ5L3V0aWxzL2pvYi1zdGF0dXMtcG9sbGVyLWZhY3RvcnkuanM/MjAyMCJdLCJzb3VyY2VzQ29udGVudCI6WyIvKkBuZ0luamVjdCovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBqb2JTdGF0dXNQb2xsZXIoJHRpbWVvdXQsIGpvYlN0YXR1c0FwaSkge1xuICAgIHZhciBjYW5jZWxlZCA9IGZhbHNlO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHBvbGwgOiBmdW5jdGlvbih1dWlkLCBwZXJpb2QsIGNhbGxiYWNrKSB7XG4gICAgICAgIGlmKHR5cGVvZiBjYWxsYmFjayAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignYSBjYWxsYmFjayBmdW5jdGlvbiBpcyByZXF1aXJlZCcpO1xuICAgICAgICB9XG5cbiAgICAgICAgZnVuY3Rpb24gb25TdWNjZXNzKHJlc3BvbnNlKSB7XG4gICAgICAgICAgaWYgKHJlc3BvbnNlLmRhdGEuc3RhdHVzID09PSAncXVldWVkJyB8fCByZXNwb25zZS5kYXRhLnN0YXR1cyA9PT0gJ3dvcmtpbmcnKSB7XG4gICAgICAgICAgICAkdGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgaWYgKCFjYW5jZWxlZCkge1xuICAgICAgICAgICAgICAgIGpvYlN0YXR1c0FwaS5nZXQodXVpZCkudGhlbihvblN1Y2Nlc3MsIG9uRmFpbHVyZSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sIHBlcmlvZCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNhbGxiYWNrKHJlc3BvbnNlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZ1bmN0aW9uIG9uRmFpbHVyZShyZXNwb25zZSkge1xuICAgICAgICAgIGNhbGxiYWNrKG51bGwpO1xuICAgICAgICB9XG5cbiAgICAgICAgam9iU3RhdHVzQXBpLmdldCh1dWlkKS50aGVuKG9uU3VjY2Vzcywgb25GYWlsdXJlKTtcbiAgICAgIH0sXG4gICAgICBjYW5jZWwgOiBmdW5jdGlvbigpIHtcbiAgICAgICAgY2FuY2VsZWQgPSB0cnVlO1xuICAgICAgfSxcbiAgICAgIHJlc2V0IDogZnVuY3Rpb24oKSB7XG4gICAgICAgIGNhbmNlbGVkID0gZmFsc2U7XG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogLi9hbmNpbGxhcnkvdXRpbHMvam9iLXN0YXR1cy1wb2xsZXItZmFjdG9yeS5qc1xuICoqLyJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTs7QUFDQTtBQUNBOztBQUVBOztBQUpBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBOzs7QUFHQTtBQUNBOzs7QUFHQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7OztBQTlCQSIsInNvdXJjZVJvb3QiOiIifQ==");

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

	eval("'use strict';\n\nkonami.$inject = [\"browser\"];\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = konami;\n/*@ngInject*/\nfunction konami(browser) {\n  return {\n    restrict: 'A',\n    link: function link(scope, element, attrs) {\n      var konamiSequence = [38, 38, 40, 40, 37, 39, 37, 39, 66, 65];\n      var sequenceIndex = 0;\n\n      $(element).on('keydown', function (ev) {\n        if (ev.keyCode === konamiSequence[sequenceIndex]) {\n          sequenceIndex += 1;\n          if (sequenceIndex === konamiSequence.length) {\n            browser.redirectTo('https://www.indiegogo.com/explore/gaming');\n          }\n        } else {\n          sequenceIndex = 0;\n        }\n      });\n    }\n  };\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTQ2LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vYW5jaWxsYXJ5L3V0aWxzL2tvbmFtaS1kaXJlY3RpdmUuanM/ZGFiMCJdLCJzb3VyY2VzQ29udGVudCI6WyIvKkBuZ0luamVjdCovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBrb25hbWkoYnJvd3Nlcikge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgcmVzdHJpY3Q6ICdBJyxcbiAgICAgICAgbGluazogZnVuY3Rpb24oc2NvcGUsIGVsZW1lbnQsIGF0dHJzKSB7XG4gICAgICAgICAgdmFyIGtvbmFtaVNlcXVlbmNlID0gWzM4LCAzOCwgNDAsIDQwLCAzNywgMzksIDM3LCAzOSwgNjYsIDY1XTtcbiAgICAgICAgICB2YXIgc2VxdWVuY2VJbmRleCA9IDA7XG5cbiAgICAgICAgICAkKGVsZW1lbnQpLm9uKCdrZXlkb3duJywgZnVuY3Rpb24oZXYpIHtcbiAgICAgICAgICAgIGlmIChldi5rZXlDb2RlID09PSBrb25hbWlTZXF1ZW5jZVtzZXF1ZW5jZUluZGV4XSkge1xuICAgICAgICAgICAgICBzZXF1ZW5jZUluZGV4ICs9IDE7XG4gICAgICAgICAgICAgIGlmIChzZXF1ZW5jZUluZGV4ID09PSBrb25hbWlTZXF1ZW5jZS5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBicm93c2VyLnJlZGlyZWN0VG8oJ2h0dHBzOi8vd3d3LmluZGllZ29nby5jb20vZXhwbG9yZS9nYW1pbmcnKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgc2VxdWVuY2VJbmRleCA9IDA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiAuL2FuY2lsbGFyeS91dGlscy9rb25hbWktZGlyZWN0aXZlLmpzXG4gKiovIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBOztBQUNBO0FBQ0E7O0FBRUE7O0FBSkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7Ozs7O0FBZEEiLCJzb3VyY2VSb290IjoiIn0=");

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

	eval("\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = linkTo;\n/*@ngInject*/\nfunction linkTo() {\n  return {\n    restrict: 'A',\n    scope: {\n      redirectLink: \"@\",\n      displayText: \"@\"\n    },\n    template: __webpack_require__(148),\n    link: function link(scope) {}\n  };\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTQ3LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vYW5jaWxsYXJ5L3V0aWxzL2xpbmstdG8tZGlyZWN0aXZlLmpzPzEzOWUiXSwic291cmNlc0NvbnRlbnQiOlsiLypAbmdJbmplY3QqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gbGlua1RvKCkge1xuICByZXR1cm4ge1xuICAgIHJlc3RyaWN0OiAnQScsXG4gICAgc2NvcGU6IHtcbiAgICAgIHJlZGlyZWN0TGluazogXCJAXCIsXG4gICAgICBkaXNwbGF5VGV4dDogXCJAXCJcbiAgICB9LFxuICAgIHRlbXBsYXRlOiByZXF1aXJlKCcuL2xpbmstdG8uaHRtbCcpLFxuICAgIGxpbms6IGZ1bmN0aW9uIChzY29wZSkge1xuICAgIH1cbiAgfTtcbn1cblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIC4vYW5jaWxsYXJ5L3V0aWxzL2xpbmstdG8tZGlyZWN0aXZlLmpzXG4gKiovIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFKQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFSQSIsInNvdXJjZVJvb3QiOiIifQ==");

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

	eval("module.exports = \"<a ng-href=\\\"{{ redirectLink }}\\\">\\n  {{ displayText }}\\n</a>\";\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTQ4LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vYW5jaWxsYXJ5L3V0aWxzL2xpbmstdG8uaHRtbD81MjkyIl0sInNvdXJjZXNDb250ZW50IjpbIm1vZHVsZS5leHBvcnRzID0gXCI8YSBuZy1ocmVmPVxcXCJ7eyByZWRpcmVjdExpbmsgfX1cXFwiPlxcbiAge3sgZGlzcGxheVRleHQgfX1cXG48L2E+XCI7XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL2FuY2lsbGFyeS91dGlscy9saW5rLXRvLmh0bWxcbiAqKiBtb2R1bGUgaWQgPSAxNDhcbiAqKiBtb2R1bGUgY2h1bmtzID0gMjRcbiAqKi8iXSwibWFwcGluZ3MiOiJBQUFBIiwic291cmNlUm9vdCI6IiJ9");

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

	eval("\"use strict\";\n\nlinkToUnless.$inject = [\"browser\"];\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = linkToUnless;\n/*@ngInject*/\nfunction linkToUnless(browser) {\n  return {\n    restrict: 'A',\n    scope: {\n      redirectLink: \"=\",\n      displayText: \"@\"\n    },\n    template: __webpack_require__(150),\n    link: function link(scope) {\n      scope.redirect = browser.currentPath().includes(scope.redirectLink) ? false : true;\n    }\n  };\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTQ5LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vYW5jaWxsYXJ5L3V0aWxzL2xpbmstdG8tdW5sZXNzLWRpcmVjdGl2ZS5qcz8wZTUxIl0sInNvdXJjZXNDb250ZW50IjpbIi8qQG5nSW5qZWN0Ki9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGxpbmtUb1VubGVzcyhicm93c2VyKSB7XG4gIHJldHVybiB7XG4gICAgcmVzdHJpY3Q6ICdBJyxcbiAgICBzY29wZToge1xuICAgICAgcmVkaXJlY3RMaW5rOiBcIj1cIixcbiAgICAgIGRpc3BsYXlUZXh0OiBcIkBcIlxuICAgIH0sXG4gICAgdGVtcGxhdGU6IHJlcXVpcmUoJy4vbGluay10by11bmxlc3MuaHRtbCcpLFxuICAgIGxpbms6IGZ1bmN0aW9uIChzY29wZSkge1xuICAgICAgc2NvcGUucmVkaXJlY3QgPSBicm93c2VyLmN1cnJlbnRQYXRoKCkuaW5jbHVkZXMoc2NvcGUucmVkaXJlY3RMaW5rKSA/IGZhbHNlIDogdHJ1ZTtcbiAgICB9XG4gIH07XG59XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiAuL2FuY2lsbGFyeS91dGlscy9saW5rLXRvLXVubGVzcy1kaXJlY3RpdmUuanNcbiAqKi8iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7O0FBQ0E7QUFDQTs7QUFFQTs7QUFKQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOzs7QUFUQSIsInNvdXJjZVJvb3QiOiIifQ==");

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

	eval("module.exports = \"<a ng-if=\\\"redirect\\\" ng-href=\\\"{{ redirectLink }}\\\">\\n  {{ displayText }}\\n</a>\\n<span ng-if=\\\"!redirect\\\" class=\\\"dashboard--selected\\\" >\\n  {{ displayText  }}\\n</span>\\n\";\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTUwLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vYW5jaWxsYXJ5L3V0aWxzL2xpbmstdG8tdW5sZXNzLmh0bWw/YzU0NyJdLCJzb3VyY2VzQ29udGVudCI6WyJtb2R1bGUuZXhwb3J0cyA9IFwiPGEgbmctaWY9XFxcInJlZGlyZWN0XFxcIiBuZy1ocmVmPVxcXCJ7eyByZWRpcmVjdExpbmsgfX1cXFwiPlxcbiAge3sgZGlzcGxheVRleHQgfX1cXG48L2E+XFxuPHNwYW4gbmctaWY9XFxcIiFyZWRpcmVjdFxcXCIgY2xhc3M9XFxcImRhc2hib2FyZC0tc2VsZWN0ZWRcXFwiID5cXG4gIHt7IGRpc3BsYXlUZXh0ICB9fVxcbjwvc3Bhbj5cXG5cIjtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vYW5jaWxsYXJ5L3V0aWxzL2xpbmstdG8tdW5sZXNzLmh0bWxcbiAqKiBtb2R1bGUgaWQgPSAxNTBcbiAqKiBtb2R1bGUgY2h1bmtzID0gMjRcbiAqKi8iXSwibWFwcGluZ3MiOiJBQUFBIiwic291cmNlUm9vdCI6IiJ9");

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

	eval("'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = pageTitleSection;\n\n__webpack_require__(152);\n\nfunction pageTitleSection(i18n) {\n  return {\n    scope: {\n      titleTranslationKey: '@',\n      subtitleTranslationKey: '@'\n    },\n    template: __webpack_require__(154),\n    link: function link(scope) {\n      scope.i18n = i18n;\n    }\n  };\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTUxLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vYW5jaWxsYXJ5L3V0aWxzL3BhZ2UtdGl0bGUtc2VjdGlvbi1kaXJlY3RpdmUuanM/M2I1ZSJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgJ3V0aWxzL19wYWdlLXRpdGxlLXNlY3Rpb24ubGVzcyc7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHBhZ2VUaXRsZVNlY3Rpb24oaTE4bikge1xuICByZXR1cm4ge1xuICAgIHNjb3BlOiB7XG4gICAgICB0aXRsZVRyYW5zbGF0aW9uS2V5OiAnQCcsXG4gICAgICBzdWJ0aXRsZVRyYW5zbGF0aW9uS2V5OiAnQCdcbiAgICB9LFxuICAgIHRlbXBsYXRlOiByZXF1aXJlKCcuL3BhZ2UtdGl0bGUtc2VjdGlvbi5odG1sJyksXG4gICAgbGluazogZnVuY3Rpb24oc2NvcGUpIHtcbiAgICAgIHNjb3BlLmkxOG4gPSBpMThuO1xuICAgIH1cbiAgfTtcbn1cblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIC4vYW5jaWxsYXJ5L3V0aWxzL3BhZ2UtdGl0bGUtc2VjdGlvbi1kaXJlY3RpdmUuanNcbiAqKi8iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFOQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7OztBQVJBIiwic291cmNlUm9vdCI6IiJ9");

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

	eval("// style-loader: Adds some css to the DOM by adding a <style> tag\n\n// load the styles\nvar content = __webpack_require__(153);\nif(typeof content === 'string') content = [[module.id, content, '']];\n// add the styles to the DOM\nvar update = __webpack_require__(50)(content, {});\nif(content.locals) module.exports = content.locals;\n// Hot Module Replacement\nif(false) {\n\t// When the styles change, update the <style> tags\n\tif(!content.locals) {\n\t\tmodule.hot.accept(\"!!./../../../node_modules/css-loader/index.js!./../../../node_modules/less-loader/index.js!./_page-title-section.less\", function() {\n\t\t\tvar newContent = require(\"!!./../../../node_modules/css-loader/index.js!./../../../node_modules/less-loader/index.js!./_page-title-section.less\");\n\t\t\tif(typeof newContent === 'string') newContent = [[module.id, newContent, '']];\n\t\t\tupdate(newContent);\n\t\t});\n\t}\n\t// When the module is disposed, remove the <style> tags\n\tmodule.hot.dispose(function() { update(); });\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTUyLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vYXNzZXRzL3N0eWxlc2hlZXRzL3V0aWxzL19wYWdlLXRpdGxlLXNlY3Rpb24ubGVzcz8xY2U2Il0sInNvdXJjZXNDb250ZW50IjpbIi8vIHN0eWxlLWxvYWRlcjogQWRkcyBzb21lIGNzcyB0byB0aGUgRE9NIGJ5IGFkZGluZyBhIDxzdHlsZT4gdGFnXG5cbi8vIGxvYWQgdGhlIHN0eWxlc1xudmFyIGNvbnRlbnQgPSByZXF1aXJlKFwiISEuLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2luZGV4LmpzIS4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2xlc3MtbG9hZGVyL2luZGV4LmpzIS4vX3BhZ2UtdGl0bGUtc2VjdGlvbi5sZXNzXCIpO1xuaWYodHlwZW9mIGNvbnRlbnQgPT09ICdzdHJpbmcnKSBjb250ZW50ID0gW1ttb2R1bGUuaWQsIGNvbnRlbnQsICcnXV07XG4vLyBhZGQgdGhlIHN0eWxlcyB0byB0aGUgRE9NXG52YXIgdXBkYXRlID0gcmVxdWlyZShcIiEuLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvYWRkU3R5bGVzLmpzXCIpKGNvbnRlbnQsIHt9KTtcbmlmKGNvbnRlbnQubG9jYWxzKSBtb2R1bGUuZXhwb3J0cyA9IGNvbnRlbnQubG9jYWxzO1xuLy8gSG90IE1vZHVsZSBSZXBsYWNlbWVudFxuaWYobW9kdWxlLmhvdCkge1xuXHQvLyBXaGVuIHRoZSBzdHlsZXMgY2hhbmdlLCB1cGRhdGUgdGhlIDxzdHlsZT4gdGFnc1xuXHRpZighY29udGVudC5sb2NhbHMpIHtcblx0XHRtb2R1bGUuaG90LmFjY2VwdChcIiEhLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9pbmRleC5qcyEuLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9sZXNzLWxvYWRlci9pbmRleC5qcyEuL19wYWdlLXRpdGxlLXNlY3Rpb24ubGVzc1wiLCBmdW5jdGlvbigpIHtcblx0XHRcdHZhciBuZXdDb250ZW50ID0gcmVxdWlyZShcIiEhLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9pbmRleC5qcyEuLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9sZXNzLWxvYWRlci9pbmRleC5qcyEuL19wYWdlLXRpdGxlLXNlY3Rpb24ubGVzc1wiKTtcblx0XHRcdGlmKHR5cGVvZiBuZXdDb250ZW50ID09PSAnc3RyaW5nJykgbmV3Q29udGVudCA9IFtbbW9kdWxlLmlkLCBuZXdDb250ZW50LCAnJ11dO1xuXHRcdFx0dXBkYXRlKG5ld0NvbnRlbnQpO1xuXHRcdH0pO1xuXHR9XG5cdC8vIFdoZW4gdGhlIG1vZHVsZSBpcyBkaXNwb3NlZCwgcmVtb3ZlIHRoZSA8c3R5bGU+IHRhZ3Ncblx0bW9kdWxlLmhvdC5kaXNwb3NlKGZ1bmN0aW9uKCkgeyB1cGRhdGUoKTsgfSk7XG59XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL2Fzc2V0cy9zdHlsZXNoZWV0cy91dGlscy9fcGFnZS10aXRsZS1zZWN0aW9uLmxlc3NcbiAqKiBtb2R1bGUgaWQgPSAxNTJcbiAqKiBtb2R1bGUgY2h1bmtzID0gMjRcbiAqKi8iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");

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

	eval("exports = module.exports = __webpack_require__(49)();\n// imports\n\n\n// module\nexports.push([module.id, \"/* Antenna Font Family Variations */\\n/* Benton Font Family Variations */\\n/** Perk Store mobile header text **/\\n/** Only mobile campaign/contributions **/\\n/* We can define top-left-dimple or left-top-dimple etc as necessary */\\n.titleSection-header {\\n  color: #000000;\\n  padding-top: 20px;\\n  padding-bottom: 20px;\\n}\\n@media (min-width: 768px) {\\n  .titleSection-header {\\n    padding-top: 50px;\\n    padding-bottom: 50px;\\n    text-align: center;\\n  }\\n}\\n.titleSection-title {\\n  font-family: \\\"Benton Sans\\\", \\\"Helvetica\\\", \\\"sans-serif\\\";\\n  font-size: 18px;\\n  font-weight: bold;\\n  line-height: 26px;\\n  letter-spacing: normal;\\n}\\n@media (min-width: 768px) {\\n  .titleSection-title {\\n    font-family: \\\"Antenna Cond Black\\\", \\\"Helvetica\\\", \\\"sans-serif\\\";\\n    font-size: 50px;\\n    line-height: 58px;\\n    letter-spacing: 1px;\\n    margin-bottom: 5px;\\n  }\\n}\\n.titleSection-subtitle {\\n  font-family: \\\"Benton Sans\\\", \\\"Helvetica\\\", \\\"sans-serif\\\";\\n  font-size: 14px;\\n  font-weight: normal;\\n  line-height: 20px;\\n}\\n@media (min-width: 768px) {\\n  .titleSection-subtitle {\\n    font-family: \\\"Benton Sans\\\", \\\"Helvetica\\\", \\\"sans-serif\\\";\\n    font-size: 16px;\\n    font-weight: bold;\\n    line-height: 26px;\\n    letter-spacing: 0;\\n  }\\n}\\n\", \"\"]);\n\n// exports\n\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTUzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vYXNzZXRzL3N0eWxlc2hlZXRzL3V0aWxzL19wYWdlLXRpdGxlLXNlY3Rpb24ubGVzcz8zMzFlIl0sInNvdXJjZXNDb250ZW50IjpbImV4cG9ydHMgPSBtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCIuLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2xpYi9jc3MtYmFzZS5qc1wiKSgpO1xuLy8gaW1wb3J0c1xuXG5cbi8vIG1vZHVsZVxuZXhwb3J0cy5wdXNoKFttb2R1bGUuaWQsIFwiLyogQW50ZW5uYSBGb250IEZhbWlseSBWYXJpYXRpb25zICovXFxuLyogQmVudG9uIEZvbnQgRmFtaWx5IFZhcmlhdGlvbnMgKi9cXG4vKiogUGVyayBTdG9yZSBtb2JpbGUgaGVhZGVyIHRleHQgKiovXFxuLyoqIE9ubHkgbW9iaWxlIGNhbXBhaWduL2NvbnRyaWJ1dGlvbnMgKiovXFxuLyogV2UgY2FuIGRlZmluZSB0b3AtbGVmdC1kaW1wbGUgb3IgbGVmdC10b3AtZGltcGxlIGV0YyBhcyBuZWNlc3NhcnkgKi9cXG4udGl0bGVTZWN0aW9uLWhlYWRlciB7XFxuICBjb2xvcjogIzAwMDAwMDtcXG4gIHBhZGRpbmctdG9wOiAyMHB4O1xcbiAgcGFkZGluZy1ib3R0b206IDIwcHg7XFxufVxcbkBtZWRpYSAobWluLXdpZHRoOiA3NjhweCkge1xcbiAgLnRpdGxlU2VjdGlvbi1oZWFkZXIge1xcbiAgICBwYWRkaW5nLXRvcDogNTBweDtcXG4gICAgcGFkZGluZy1ib3R0b206IDUwcHg7XFxuICAgIHRleHQtYWxpZ246IGNlbnRlcjtcXG4gIH1cXG59XFxuLnRpdGxlU2VjdGlvbi10aXRsZSB7XFxuICBmb250LWZhbWlseTogXFxcIkJlbnRvbiBTYW5zXFxcIiwgXFxcIkhlbHZldGljYVxcXCIsIFxcXCJzYW5zLXNlcmlmXFxcIjtcXG4gIGZvbnQtc2l6ZTogMThweDtcXG4gIGZvbnQtd2VpZ2h0OiBib2xkO1xcbiAgbGluZS1oZWlnaHQ6IDI2cHg7XFxuICBsZXR0ZXItc3BhY2luZzogbm9ybWFsO1xcbn1cXG5AbWVkaWEgKG1pbi13aWR0aDogNzY4cHgpIHtcXG4gIC50aXRsZVNlY3Rpb24tdGl0bGUge1xcbiAgICBmb250LWZhbWlseTogXFxcIkFudGVubmEgQ29uZCBCbGFja1xcXCIsIFxcXCJIZWx2ZXRpY2FcXFwiLCBcXFwic2Fucy1zZXJpZlxcXCI7XFxuICAgIGZvbnQtc2l6ZTogNTBweDtcXG4gICAgbGluZS1oZWlnaHQ6IDU4cHg7XFxuICAgIGxldHRlci1zcGFjaW5nOiAxcHg7XFxuICAgIG1hcmdpbi1ib3R0b206IDVweDtcXG4gIH1cXG59XFxuLnRpdGxlU2VjdGlvbi1zdWJ0aXRsZSB7XFxuICBmb250LWZhbWlseTogXFxcIkJlbnRvbiBTYW5zXFxcIiwgXFxcIkhlbHZldGljYVxcXCIsIFxcXCJzYW5zLXNlcmlmXFxcIjtcXG4gIGZvbnQtc2l6ZTogMTRweDtcXG4gIGZvbnQtd2VpZ2h0OiBub3JtYWw7XFxuICBsaW5lLWhlaWdodDogMjBweDtcXG59XFxuQG1lZGlhIChtaW4td2lkdGg6IDc2OHB4KSB7XFxuICAudGl0bGVTZWN0aW9uLXN1YnRpdGxlIHtcXG4gICAgZm9udC1mYW1pbHk6IFxcXCJCZW50b24gU2Fuc1xcXCIsIFxcXCJIZWx2ZXRpY2FcXFwiLCBcXFwic2Fucy1zZXJpZlxcXCI7XFxuICAgIGZvbnQtc2l6ZTogMTZweDtcXG4gICAgZm9udC13ZWlnaHQ6IGJvbGQ7XFxuICAgIGxpbmUtaGVpZ2h0OiAyNnB4O1xcbiAgICBsZXR0ZXItc3BhY2luZzogMDtcXG4gIH1cXG59XFxuXCIsIFwiXCJdKTtcblxuLy8gZXhwb3J0c1xuXG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vY3NzLWxvYWRlciEuL34vbGVzcy1sb2FkZXIhLi9hc3NldHMvc3R5bGVzaGVldHMvdXRpbHMvX3BhZ2UtdGl0bGUtc2VjdGlvbi5sZXNzXG4gKiogbW9kdWxlIGlkID0gMTUzXG4gKiogbW9kdWxlIGNodW5rcyA9IDI0XG4gKiovIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==");

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

	eval("module.exports = \"<div class=\\\"titleSection-header i-mobile-container--15\\\">\\n  <h1 class=\\\"titleSection-title\\\">\\n    {{ ::i18n.t(titleTranslationKey) }}\\n  </h1>\\n  <div class=\\\"titleSection-subtitle\\\">\\n    {{ ::i18n.t(subtitleTranslationKey) }}\\n  </div>\\n</div>\\n\";\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTU0LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vYW5jaWxsYXJ5L3V0aWxzL3BhZ2UtdGl0bGUtc2VjdGlvbi5odG1sPzk4YTEiXSwic291cmNlc0NvbnRlbnQiOlsibW9kdWxlLmV4cG9ydHMgPSBcIjxkaXYgY2xhc3M9XFxcInRpdGxlU2VjdGlvbi1oZWFkZXIgaS1tb2JpbGUtY29udGFpbmVyLS0xNVxcXCI+XFxuICA8aDEgY2xhc3M9XFxcInRpdGxlU2VjdGlvbi10aXRsZVxcXCI+XFxuICAgIHt7IDo6aTE4bi50KHRpdGxlVHJhbnNsYXRpb25LZXkpIH19XFxuICA8L2gxPlxcbiAgPGRpdiBjbGFzcz1cXFwidGl0bGVTZWN0aW9uLXN1YnRpdGxlXFxcIj5cXG4gICAge3sgOjppMThuLnQoc3VidGl0bGVUcmFuc2xhdGlvbktleSkgfX1cXG4gIDwvZGl2PlxcbjwvZGl2PlxcblwiO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9hbmNpbGxhcnkvdXRpbHMvcGFnZS10aXRsZS1zZWN0aW9uLmh0bWxcbiAqKiBtb2R1bGUgaWQgPSAxNTRcbiAqKiBtb2R1bGUgY2h1bmtzID0gMjRcbiAqKi8iXSwibWFwcGluZ3MiOiJBQUFBIiwic291cmNlUm9vdCI6IiJ9");

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

	eval("'use strict';\n\npagination.$inject = [\"i18n\"];\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = pagination;\n/*@ngInject*/\nfunction pagination(i18n) {\n  return {\n    restrict: 'A',\n    scope: {\n      pagination: \"=\"\n    },\n    transclude: false,\n    replace: false,\n    template: __webpack_require__(156),\n    link: function link(scope, element, attrs, nullController, transclude) {\n      scope.i18n = i18n;\n      var MAX_PAGES = 9;\n      var SURROUNDING_PAGES = Math.floor(MAX_PAGES / 2);\n\n      var inMiddle = function inMiddle(pagination) {\n        // there are more than 4 pages to either side of the current page\n        return pagination.data.current - SURROUNDING_PAGES >= 1 && pagination.data.current + SURROUNDING_PAGES <= pagination.data.pages;\n      };\n\n      var morePages = function morePages(pagination) {\n        return pagination.data.pages > MAX_PAGES;\n      };\n\n      var atEnd = function atEnd(pagination) {\n        return pagination.data.current >= pagination.data.pages - SURROUNDING_PAGES;\n      };\n\n      scope.generatePageRange = function (pagination) {\n        if (inMiddle(pagination)) {\n          // the current page can fit comfortably in the middle of all pages\n          // (as defined by SURROUNDING_PAGES, so there need to be 4 pages on either side)\n          var start = pagination.data.current - SURROUNDING_PAGES;\n          var end = pagination.data.current + SURROUNDING_PAGES;\n          return _.range(start, end + 1);\n        } else if (atEnd(pagination) && morePages(pagination)) {\n          return _.range(pagination.data.pages - MAX_PAGES + 1, pagination.data.pages + 1);\n        }\n\n        // the normal case is to just return the number of pages we have, starting at 1.\n        return _.range(1, Math.min(MAX_PAGES, pagination.data.pages) + 1);\n      };\n\n      scope.isCurrentPage = function (pageNumber) {\n        return scope.pagination.data.current === pageNumber;\n      };\n\n      scope.showBeginningPageGap = function (pagination) {\n        return scope.generatePageRange(pagination)[0] != 1;\n      };\n\n      scope.showEndingPageGap = function (pagination) {\n        var range = scope.generatePageRange(pagination);\n        return range[range.length - 1] != pagination.data.pages;\n      };\n    }\n  };\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTU1LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vYW5jaWxsYXJ5L3V0aWxzL3BhZ2luYXRpb24tZGlyZWN0aXZlLmpzPzY2MzQiXSwic291cmNlc0NvbnRlbnQiOlsiLypAbmdJbmplY3QqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gcGFnaW5hdGlvbiAoaTE4bikge1xuICAgIHJldHVybiB7XG4gICAgICByZXN0cmljdDogJ0EnLFxuICAgICAgc2NvcGU6IHtcbiAgICAgICAgcGFnaW5hdGlvbjogXCI9XCJcbiAgICAgIH0sXG4gICAgICB0cmFuc2NsdWRlOiBmYWxzZSxcbiAgICAgIHJlcGxhY2U6IGZhbHNlLFxuICAgICAgdGVtcGxhdGU6IHJlcXVpcmUoJy4vcGFnaW5hdGlvbi1kaXJlY3RpdmUuaHRtbCcpLFxuICAgICAgbGluazogZnVuY3Rpb24oc2NvcGUsIGVsZW1lbnQsIGF0dHJzLCBudWxsQ29udHJvbGxlciwgdHJhbnNjbHVkZSkge1xuICAgICAgICBzY29wZS5pMThuID0gaTE4bjtcbiAgICAgICAgdmFyIE1BWF9QQUdFUyA9IDk7XG4gICAgICAgIHZhciBTVVJST1VORElOR19QQUdFUyA9IE1hdGguZmxvb3IoTUFYX1BBR0VTIC8gMik7XG5cbiAgICAgICAgdmFyIGluTWlkZGxlID0gZnVuY3Rpb24ocGFnaW5hdGlvbikge1xuICAgICAgICAgIC8vIHRoZXJlIGFyZSBtb3JlIHRoYW4gNCBwYWdlcyB0byBlaXRoZXIgc2lkZSBvZiB0aGUgY3VycmVudCBwYWdlXG4gICAgICAgICAgcmV0dXJuIHBhZ2luYXRpb24uZGF0YS5jdXJyZW50IC0gU1VSUk9VTkRJTkdfUEFHRVMgPj0gMSAmJlxuICAgICAgICAgICAgcGFnaW5hdGlvbi5kYXRhLmN1cnJlbnQgKyBTVVJST1VORElOR19QQUdFUyA8PSBwYWdpbmF0aW9uLmRhdGEucGFnZXM7XG4gICAgICAgIH07XG5cbiAgICAgICAgdmFyIG1vcmVQYWdlcyA9IGZ1bmN0aW9uKHBhZ2luYXRpb24pIHtcbiAgICAgICAgICByZXR1cm4gcGFnaW5hdGlvbi5kYXRhLnBhZ2VzID4gTUFYX1BBR0VTO1xuICAgICAgICB9O1xuXG4gICAgICAgIHZhciBhdEVuZCA9IGZ1bmN0aW9uKHBhZ2luYXRpb24pIHtcbiAgICAgICAgICByZXR1cm4gcGFnaW5hdGlvbi5kYXRhLmN1cnJlbnQgPj0gKHBhZ2luYXRpb24uZGF0YS5wYWdlcyAtIFNVUlJPVU5ESU5HX1BBR0VTKTtcbiAgICAgICAgfTtcblxuICAgICAgICBzY29wZS5nZW5lcmF0ZVBhZ2VSYW5nZSA9IGZ1bmN0aW9uKHBhZ2luYXRpb24pIHtcbiAgICAgICAgICBpZiAoaW5NaWRkbGUocGFnaW5hdGlvbikpIHtcbiAgICAgICAgICAgIC8vIHRoZSBjdXJyZW50IHBhZ2UgY2FuIGZpdCBjb21mb3J0YWJseSBpbiB0aGUgbWlkZGxlIG9mIGFsbCBwYWdlc1xuICAgICAgICAgICAgLy8gKGFzIGRlZmluZWQgYnkgU1VSUk9VTkRJTkdfUEFHRVMsIHNvIHRoZXJlIG5lZWQgdG8gYmUgNCBwYWdlcyBvbiBlaXRoZXIgc2lkZSlcbiAgICAgICAgICAgIHZhciBzdGFydCA9IHBhZ2luYXRpb24uZGF0YS5jdXJyZW50IC0gU1VSUk9VTkRJTkdfUEFHRVM7XG4gICAgICAgICAgICB2YXIgZW5kID0gcGFnaW5hdGlvbi5kYXRhLmN1cnJlbnQgKyBTVVJST1VORElOR19QQUdFUztcbiAgICAgICAgICAgIHJldHVybiBfLnJhbmdlKHN0YXJ0LCBlbmQgKyAxKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKGF0RW5kKHBhZ2luYXRpb24pICYmIG1vcmVQYWdlcyhwYWdpbmF0aW9uKSkge1xuICAgICAgICAgICAgcmV0dXJuIF8ucmFuZ2UocGFnaW5hdGlvbi5kYXRhLnBhZ2VzIC0gTUFYX1BBR0VTICsgMSwgcGFnaW5hdGlvbi5kYXRhLnBhZ2VzICsgMSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gdGhlIG5vcm1hbCBjYXNlIGlzIHRvIGp1c3QgcmV0dXJuIHRoZSBudW1iZXIgb2YgcGFnZXMgd2UgaGF2ZSwgc3RhcnRpbmcgYXQgMS5cbiAgICAgICAgICByZXR1cm4gXy5yYW5nZSgxLCBNYXRoLm1pbihNQVhfUEFHRVMsIHBhZ2luYXRpb24uZGF0YS5wYWdlcykgKyAxKTtcbiAgICAgICAgfTtcblxuICAgICAgICBzY29wZS5pc0N1cnJlbnRQYWdlID0gZnVuY3Rpb24ocGFnZU51bWJlcikge1xuICAgICAgICAgIHJldHVybiBzY29wZS5wYWdpbmF0aW9uLmRhdGEuY3VycmVudCA9PT0gcGFnZU51bWJlcjtcbiAgICAgICAgfTtcblxuICAgICAgICBzY29wZS5zaG93QmVnaW5uaW5nUGFnZUdhcCA9IGZ1bmN0aW9uKHBhZ2luYXRpb24pIHtcbiAgICAgICAgICByZXR1cm4gc2NvcGUuZ2VuZXJhdGVQYWdlUmFuZ2UocGFnaW5hdGlvbilbMF0gIT0gMTtcbiAgICAgICAgfTtcblxuICAgICAgICBzY29wZS5zaG93RW5kaW5nUGFnZUdhcCA9IGZ1bmN0aW9uKHBhZ2luYXRpb24pIHtcbiAgICAgICAgICB2YXIgcmFuZ2UgPSBzY29wZS5nZW5lcmF0ZVBhZ2VSYW5nZShwYWdpbmF0aW9uKTtcbiAgICAgICAgICByZXR1cm4gcmFuZ2VbcmFuZ2UubGVuZ3RoIC0gMV0gIT0gcGFnaW5hdGlvbi5kYXRhLnBhZ2VzO1xuICAgICAgICB9O1xuICAgICAgfVxuICAgIH07XG4gIH1cblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIC4vYW5jaWxsYXJ5L3V0aWxzL3BhZ2luYXRpb24tZGlyZWN0aXZlLmpzXG4gKiovIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBOztBQUNBO0FBQ0E7O0FBRUE7O0FBSkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7OztBQUlBO0FBQ0E7OztBQUdBO0FBQ0E7OztBQUdBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUFSQTs7O0FBZUE7QUFDQTs7O0FBR0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBOzs7O0FBckRBIiwic291cmNlUm9vdCI6IiJ9");

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

	eval("module.exports = \"<div class=\\\"js-pagination-links i-pagination-directive-links\\\" ng-if=\\\"pagination.data.pages > 1\\\">\\n  <div class=\\\"pagination-previous\\\" ng-if=\\\"pagination.data.previous\\\" class=\\\"pagination-previous\\\">\\n    <a class=\\\"first-link unselected\\\" ng-click=\\\"pagination.getPage({ page: 1 })\\\">{{i18n.t('will_paginate.first_label')}}</a>\\n    <a class=\\\"previous-link unselected\\\" ng-click=\\\"pagination.getPage({ page: pagination.data.previous })\\\">{{i18n.t('will_paginate.previous_label')}}</a><span class=\\\"page-gap\\\" ng-if=\\\"showBeginningPageGap(pagination)\\\">{{i18n.t('will_paginate.page_gap')}}</span>\\n  </div>\\n  <div ng-class=\\\"{'selected-page-number': isCurrentPage(pageNumber), 'page-number': true}\\\" ng-repeat=\\\"pageNumber in generatePageRange(pagination)\\\">\\n    <div ng-if=\\\"!isCurrentPage(pageNumber)\\\">\\n      <a class=\\\"page-link page-{{pageNumber}} unselected\\\" ng-click=\\\"pagination.getPage({page: pageNumber})\\\">{{ pageNumber}}</a>\\n    </div>\\n    <div ng-if=\\\"isCurrentPage(pageNumber)\\\">\\n      <span class=\\\"current selected\\\">{{pageNumber}}</span>\\n    </div>\\n  </div>\\n  <div ng-class=\\\"{'pagination-next': true, 'i-hidden' : !pagination.data.next}\\\">\\n    <span class=\\\"page-gap\\\" ng-if=\\\"showEndingPageGap(pagination)\\\">{{i18n.t('will_paginate.page_gap')}}</span>\\n    <a class=\\\"next-link unselected\\\" ng-click=\\\"pagination.getPage({page: pagination.data.next})\\\">{{i18n.t('will_paginate.next_label')}}</a>\\n    <a class=\\\"last-link unselected\\\" ng-click=\\\"pagination.getPage({page: pagination.data.pages})\\\">{{i18n.t('will_paginate.last_label')}}</a>\\n  </div>\\n</div>\\n\";\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTU2LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vYW5jaWxsYXJ5L3V0aWxzL3BhZ2luYXRpb24tZGlyZWN0aXZlLmh0bWw/ODUwOCJdLCJzb3VyY2VzQ29udGVudCI6WyJtb2R1bGUuZXhwb3J0cyA9IFwiPGRpdiBjbGFzcz1cXFwianMtcGFnaW5hdGlvbi1saW5rcyBpLXBhZ2luYXRpb24tZGlyZWN0aXZlLWxpbmtzXFxcIiBuZy1pZj1cXFwicGFnaW5hdGlvbi5kYXRhLnBhZ2VzID4gMVxcXCI+XFxuICA8ZGl2IGNsYXNzPVxcXCJwYWdpbmF0aW9uLXByZXZpb3VzXFxcIiBuZy1pZj1cXFwicGFnaW5hdGlvbi5kYXRhLnByZXZpb3VzXFxcIiBjbGFzcz1cXFwicGFnaW5hdGlvbi1wcmV2aW91c1xcXCI+XFxuICAgIDxhIGNsYXNzPVxcXCJmaXJzdC1saW5rIHVuc2VsZWN0ZWRcXFwiIG5nLWNsaWNrPVxcXCJwYWdpbmF0aW9uLmdldFBhZ2UoeyBwYWdlOiAxIH0pXFxcIj57e2kxOG4udCgnd2lsbF9wYWdpbmF0ZS5maXJzdF9sYWJlbCcpfX08L2E+XFxuICAgIDxhIGNsYXNzPVxcXCJwcmV2aW91cy1saW5rIHVuc2VsZWN0ZWRcXFwiIG5nLWNsaWNrPVxcXCJwYWdpbmF0aW9uLmdldFBhZ2UoeyBwYWdlOiBwYWdpbmF0aW9uLmRhdGEucHJldmlvdXMgfSlcXFwiPnt7aTE4bi50KCd3aWxsX3BhZ2luYXRlLnByZXZpb3VzX2xhYmVsJyl9fTwvYT48c3BhbiBjbGFzcz1cXFwicGFnZS1nYXBcXFwiIG5nLWlmPVxcXCJzaG93QmVnaW5uaW5nUGFnZUdhcChwYWdpbmF0aW9uKVxcXCI+e3tpMThuLnQoJ3dpbGxfcGFnaW5hdGUucGFnZV9nYXAnKX19PC9zcGFuPlxcbiAgPC9kaXY+XFxuICA8ZGl2IG5nLWNsYXNzPVxcXCJ7J3NlbGVjdGVkLXBhZ2UtbnVtYmVyJzogaXNDdXJyZW50UGFnZShwYWdlTnVtYmVyKSwgJ3BhZ2UtbnVtYmVyJzogdHJ1ZX1cXFwiIG5nLXJlcGVhdD1cXFwicGFnZU51bWJlciBpbiBnZW5lcmF0ZVBhZ2VSYW5nZShwYWdpbmF0aW9uKVxcXCI+XFxuICAgIDxkaXYgbmctaWY9XFxcIiFpc0N1cnJlbnRQYWdlKHBhZ2VOdW1iZXIpXFxcIj5cXG4gICAgICA8YSBjbGFzcz1cXFwicGFnZS1saW5rIHBhZ2Ute3twYWdlTnVtYmVyfX0gdW5zZWxlY3RlZFxcXCIgbmctY2xpY2s9XFxcInBhZ2luYXRpb24uZ2V0UGFnZSh7cGFnZTogcGFnZU51bWJlcn0pXFxcIj57eyBwYWdlTnVtYmVyfX08L2E+XFxuICAgIDwvZGl2PlxcbiAgICA8ZGl2IG5nLWlmPVxcXCJpc0N1cnJlbnRQYWdlKHBhZ2VOdW1iZXIpXFxcIj5cXG4gICAgICA8c3BhbiBjbGFzcz1cXFwiY3VycmVudCBzZWxlY3RlZFxcXCI+e3twYWdlTnVtYmVyfX08L3NwYW4+XFxuICAgIDwvZGl2PlxcbiAgPC9kaXY+XFxuICA8ZGl2IG5nLWNsYXNzPVxcXCJ7J3BhZ2luYXRpb24tbmV4dCc6IHRydWUsICdpLWhpZGRlbicgOiAhcGFnaW5hdGlvbi5kYXRhLm5leHR9XFxcIj5cXG4gICAgPHNwYW4gY2xhc3M9XFxcInBhZ2UtZ2FwXFxcIiBuZy1pZj1cXFwic2hvd0VuZGluZ1BhZ2VHYXAocGFnaW5hdGlvbilcXFwiPnt7aTE4bi50KCd3aWxsX3BhZ2luYXRlLnBhZ2VfZ2FwJyl9fTwvc3Bhbj5cXG4gICAgPGEgY2xhc3M9XFxcIm5leHQtbGluayB1bnNlbGVjdGVkXFxcIiBuZy1jbGljaz1cXFwicGFnaW5hdGlvbi5nZXRQYWdlKHtwYWdlOiBwYWdpbmF0aW9uLmRhdGEubmV4dH0pXFxcIj57e2kxOG4udCgnd2lsbF9wYWdpbmF0ZS5uZXh0X2xhYmVsJyl9fTwvYT5cXG4gICAgPGEgY2xhc3M9XFxcImxhc3QtbGluayB1bnNlbGVjdGVkXFxcIiBuZy1jbGljaz1cXFwicGFnaW5hdGlvbi5nZXRQYWdlKHtwYWdlOiBwYWdpbmF0aW9uLmRhdGEucGFnZXN9KVxcXCI+e3tpMThuLnQoJ3dpbGxfcGFnaW5hdGUubGFzdF9sYWJlbCcpfX08L2E+XFxuICA8L2Rpdj5cXG48L2Rpdj5cXG5cIjtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vYW5jaWxsYXJ5L3V0aWxzL3BhZ2luYXRpb24tZGlyZWN0aXZlLmh0bWxcbiAqKiBtb2R1bGUgaWQgPSAxNTZcbiAqKiBtb2R1bGUgY2h1bmtzID0gMjRcbiAqKi8iXSwibWFwcGluZ3MiOiJBQUFBIiwic291cmNlUm9vdCI6IiJ9");

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

	eval("'use strict';\n\npledgeShareService.$inject = [\"gon\", \"i18n\", \"fb\"];\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = pledgeShareService;\n/*@ngInject*/\nfunction pledgeShareService(gon, i18n, fb) {\n  return {\n    postToFacebook: function postToFacebook(options) {\n      var namespaceAction = gon.domain === 'generosity' ? 'donate' : 'contribute';\n      var campaignActionProp = gon.domain === 'generosity' ? 'fundraiser' : 'campaign';\n      var actionProps = {};\n      actionProps[campaignActionProp] = options.url;\n      actionProps.contributor = options.contributor_url;\n\n      var params = {\n        method: 'share_open_graph',\n        display: 'popup',\n        name: i18n.t(\"help_make_it_happen_for_\") + \" \" + options.title,\n        picture: options.picture_url,\n        caption: options.title,\n        description: options.tagline,\n        action_type: options.namespace + ':' + namespaceAction,\n        action_properties: JSON.stringify(actionProps)\n      };\n      return fb.ui(params);\n    },\n    twitterHref: function twitterHref(project) {\n      if (gon.domain === 'generosity') {\n        return \"https://twitter.com/intent/tweet?text=\" + encodeURIComponent(i18n.t(\"generosity.social.twitter\", {\n          fundraiser_title: project.title,\n          fundraiser_url: project.url\n        })) + \"&counturl=\" + encodeURIComponent(project.counturl);\n      } else {\n        return \"https://twitter.com/intent/tweet?url=\" + encodeURIComponent(project.url) + \"&text=\" + encodeURIComponent(i18n.t(\"help_make_it_happen_for_\") + \" \" + project.title) + \"&via=indiegogo&related=indiegogo&hashtags=indiegogo&counturl=\" + encodeURIComponent(project.counturl);\n      }\n    },\n    emailHref: function emailHref(project) {\n      var body, subject;\n      if (gon.domain === 'generosity') {\n        body = i18n.t('generosity.social.email', {\n          fundraiser_url: project.url,\n          fundraiser_title: project.title\n        });\n        subject = i18n.t('generosity.social.email_subject', { project_title: project.title });\n      } else {\n        body = i18n.t('email_share_body', {\n          project_title: project.title,\n          project_url: project.url\n        });\n        subject = i18n.t('email_share_subject', { project_title: project.title });\n      }\n      return \"mailto:?body=\" + encodeURIComponent(body) + \"&subject=\" + encodeURIComponent(subject);\n    }\n  };\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTU3LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vYW5jaWxsYXJ5L3V0aWxzL3BsZWRnZS1zaGFyZS1zZXJ2aWNlLmpzPzVlMWEiXSwic291cmNlc0NvbnRlbnQiOlsiLypAbmdJbmplY3QqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gcGxlZGdlU2hhcmVTZXJ2aWNlKGdvbiwgaTE4biwgZmIpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHBvc3RUb0ZhY2Vib29rOiBmdW5jdGlvbihvcHRpb25zKSB7XG4gICAgICAgICAgdmFyIG5hbWVzcGFjZUFjdGlvbiA9IGdvbi5kb21haW4gPT09ICdnZW5lcm9zaXR5JyA/ICdkb25hdGUnIDogJ2NvbnRyaWJ1dGUnO1xuICAgICAgICAgIHZhciBjYW1wYWlnbkFjdGlvblByb3AgPSBnb24uZG9tYWluID09PSAnZ2VuZXJvc2l0eScgPyAnZnVuZHJhaXNlcicgOiAnY2FtcGFpZ24nO1xuICAgICAgICAgIHZhciBhY3Rpb25Qcm9wcyA9IHt9O1xuICAgICAgICAgIGFjdGlvblByb3BzW2NhbXBhaWduQWN0aW9uUHJvcF0gPSBvcHRpb25zLnVybDtcbiAgICAgICAgICBhY3Rpb25Qcm9wcy5jb250cmlidXRvciA9IG9wdGlvbnMuY29udHJpYnV0b3JfdXJsO1xuXG4gICAgICAgICAgdmFyIHBhcmFtcyA9IHtcbiAgICAgICAgICAgIG1ldGhvZDogJ3NoYXJlX29wZW5fZ3JhcGgnLFxuICAgICAgICAgICAgZGlzcGxheTogJ3BvcHVwJyxcbiAgICAgICAgICAgIG5hbWU6IGkxOG4udChcImhlbHBfbWFrZV9pdF9oYXBwZW5fZm9yX1wiKSArIFwiIFwiICsgb3B0aW9ucy50aXRsZSxcbiAgICAgICAgICAgIHBpY3R1cmU6IG9wdGlvbnMucGljdHVyZV91cmwsXG4gICAgICAgICAgICBjYXB0aW9uOiBvcHRpb25zLnRpdGxlLFxuICAgICAgICAgICAgZGVzY3JpcHRpb246IG9wdGlvbnMudGFnbGluZSxcbiAgICAgICAgICAgIGFjdGlvbl90eXBlOiBvcHRpb25zLm5hbWVzcGFjZSArICc6JyArIG5hbWVzcGFjZUFjdGlvbixcbiAgICAgICAgICAgIGFjdGlvbl9wcm9wZXJ0aWVzOiBKU09OLnN0cmluZ2lmeShhY3Rpb25Qcm9wcylcbiAgICAgICAgICB9O1xuICAgICAgICAgIHJldHVybiBmYi51aShwYXJhbXMpO1xuICAgICAgICB9LFxuICAgICAgICB0d2l0dGVySHJlZjogZnVuY3Rpb24ocHJvamVjdCkge1xuICAgICAgICAgIGlmIChnb24uZG9tYWluID09PSAnZ2VuZXJvc2l0eScpIHtcbiAgICAgICAgICAgIHJldHVybiBcImh0dHBzOi8vdHdpdHRlci5jb20vaW50ZW50L3R3ZWV0P3RleHQ9XCIgKyBlbmNvZGVVUklDb21wb25lbnQoaTE4bi50KFwiZ2VuZXJvc2l0eS5zb2NpYWwudHdpdHRlclwiLCB7XG4gICAgICAgICAgICAgICAgZnVuZHJhaXNlcl90aXRsZTogcHJvamVjdC50aXRsZSxcbiAgICAgICAgICAgICAgICBmdW5kcmFpc2VyX3VybDogcHJvamVjdC51cmxcbiAgICAgICAgICAgICAgfSkpICsgXCImY291bnR1cmw9XCIgKyBlbmNvZGVVUklDb21wb25lbnQocHJvamVjdC5jb3VudHVybCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBcImh0dHBzOi8vdHdpdHRlci5jb20vaW50ZW50L3R3ZWV0P3VybD1cIiArIGVuY29kZVVSSUNvbXBvbmVudChwcm9qZWN0LnVybCkgK1xuICAgICAgICAgICAgICBcIiZ0ZXh0PVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KGkxOG4udChcImhlbHBfbWFrZV9pdF9oYXBwZW5fZm9yX1wiKSArIFwiIFwiICsgcHJvamVjdC50aXRsZSkgK1xuICAgICAgICAgICAgICBcIiZ2aWE9aW5kaWVnb2dvJnJlbGF0ZWQ9aW5kaWVnb2dvJmhhc2h0YWdzPWluZGllZ29nbyZjb3VudHVybD1cIiArIGVuY29kZVVSSUNvbXBvbmVudChwcm9qZWN0LmNvdW50dXJsKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIGVtYWlsSHJlZjogZnVuY3Rpb24ocHJvamVjdCkge1xuICAgICAgICAgIHZhciBib2R5LCBzdWJqZWN0O1xuICAgICAgICAgIGlmIChnb24uZG9tYWluID09PSAnZ2VuZXJvc2l0eScpIHtcbiAgICAgICAgICAgIGJvZHkgPSBpMThuLnQoJ2dlbmVyb3NpdHkuc29jaWFsLmVtYWlsJywge1xuICAgICAgICAgICAgICBmdW5kcmFpc2VyX3VybDogcHJvamVjdC51cmwsXG4gICAgICAgICAgICAgIGZ1bmRyYWlzZXJfdGl0bGU6IHByb2plY3QudGl0bGVcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgc3ViamVjdCA9IGkxOG4udCgnZ2VuZXJvc2l0eS5zb2NpYWwuZW1haWxfc3ViamVjdCcsIHtwcm9qZWN0X3RpdGxlOiBwcm9qZWN0LnRpdGxlfSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGJvZHkgPSBpMThuLnQoJ2VtYWlsX3NoYXJlX2JvZHknLCB7XG4gICAgICAgICAgICAgIHByb2plY3RfdGl0bGU6IHByb2plY3QudGl0bGUsXG4gICAgICAgICAgICAgIHByb2plY3RfdXJsOiBwcm9qZWN0LnVybFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBzdWJqZWN0ID0gaTE4bi50KCdlbWFpbF9zaGFyZV9zdWJqZWN0Jywge3Byb2plY3RfdGl0bGU6IHByb2plY3QudGl0bGV9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIFwibWFpbHRvOj9ib2R5PVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KGJvZHkpICsgXCImc3ViamVjdD1cIiArIGVuY29kZVVSSUNvbXBvbmVudChzdWJqZWN0KTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiAuL2FuY2lsbGFyeS91dGlscy9wbGVkZ2Utc2hhcmUtc2VydmljZS5qc1xuICoqLyJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTs7QUFDQTtBQUNBOztBQUVBOztBQUpBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTs7O0FBaERBIiwic291cmNlUm9vdCI6IiJ9");

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

	eval("\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = projectCard;\n/*@ngInject*/\nfunction projectCard() {\n  function setupDelayedImageLoad(element) {\n    var $imgContainer = element.find(\".i-img\");\n    if ($imgContainer.length > 0) {\n      var $img = $(\"<img />\");\n      $img.attr(\"src\", $imgContainer.data(\"src\"));\n      $imgContainer.replaceWith($img);\n    }\n  }\n\n  function ellipsizeProjectCardTagline(element) {\n    var $content = element.find(\".i-content\");\n    var $title = $content.find(\".i-title\");\n    var titleLineHeight = parseInt($title.css(\"line-height\"));\n    $title.dotdotdot({\n      height: titleLineHeight * 3,\n      wrap: \"letter\",\n      watch: \"window\"\n    });\n\n    var $tagline = $content.find(\".i-tagline\");\n    var taglineHeight = $content.height() - $title.height();\n\n    var $partner = $content.find(\".i-partner-name\");\n    if ($partner.length > 0) {\n      var partnerLineHeight = parseInt($partner.css(\"line-height\"));\n      $partner.dotdotdot({\n        height: partnerLineHeight * 1,\n        watch: \"window\"\n      });\n      taglineHeight = taglineHeight - $partner.height() - parseInt($partner.css(\"margin-top\"));\n    }\n    $tagline.css(\"max-height\", taglineHeight);\n    $tagline.dotdotdot({\n      watch: 'window'\n    });\n  }\n\n  return {\n    setupDelayedImageLoad: setupDelayedImageLoad,\n    ellipsizeProjectCardTagline: ellipsizeProjectCardTagline\n  };\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTU4LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vYW5jaWxsYXJ5L3V0aWxzL3Byb2plY3QtY2FyZC1mYWN0b3J5LmpzP2I2ZWYiXSwic291cmNlc0NvbnRlbnQiOlsiLypAbmdJbmplY3QqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gcHJvamVjdENhcmQoKSB7XG4gICAgZnVuY3Rpb24gc2V0dXBEZWxheWVkSW1hZ2VMb2FkKGVsZW1lbnQpIHtcbiAgICAgIHZhciAkaW1nQ29udGFpbmVyID0gZWxlbWVudC5maW5kKFwiLmktaW1nXCIpO1xuICAgICAgaWYgKCRpbWdDb250YWluZXIubGVuZ3RoID4gMCkge1xuICAgICAgICB2YXIgJGltZyA9ICQoXCI8aW1nIC8+XCIpO1xuICAgICAgICAkaW1nLmF0dHIoXCJzcmNcIiwgJGltZ0NvbnRhaW5lci5kYXRhKFwic3JjXCIpKTtcbiAgICAgICAgJGltZ0NvbnRhaW5lci5yZXBsYWNlV2l0aCgkaW1nKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBlbGxpcHNpemVQcm9qZWN0Q2FyZFRhZ2xpbmUoZWxlbWVudCkge1xuICAgICAgdmFyICRjb250ZW50ID0gZWxlbWVudC5maW5kKFwiLmktY29udGVudFwiKTtcbiAgICAgIHZhciAkdGl0bGUgPSAkY29udGVudC5maW5kKFwiLmktdGl0bGVcIik7XG4gICAgICB2YXIgdGl0bGVMaW5lSGVpZ2h0ID0gcGFyc2VJbnQoJHRpdGxlLmNzcyhcImxpbmUtaGVpZ2h0XCIpKTtcbiAgICAgICR0aXRsZS5kb3Rkb3Rkb3Qoe1xuICAgICAgICBoZWlnaHQ6IHRpdGxlTGluZUhlaWdodCozLFxuICAgICAgICB3cmFwOiBcImxldHRlclwiLFxuICAgICAgICB3YXRjaDogXCJ3aW5kb3dcIlxuICAgICAgfSk7XG5cbiAgICAgIHZhciAkdGFnbGluZSA9ICRjb250ZW50LmZpbmQoXCIuaS10YWdsaW5lXCIpO1xuICAgICAgdmFyIHRhZ2xpbmVIZWlnaHQgPSAkY29udGVudC5oZWlnaHQoKSAtICR0aXRsZS5oZWlnaHQoKTtcblxuICAgICAgdmFyICRwYXJ0bmVyID0gJGNvbnRlbnQuZmluZChcIi5pLXBhcnRuZXItbmFtZVwiKTtcbiAgICAgIGlmICgkcGFydG5lci5sZW5ndGggPiAwKSB7XG4gICAgICAgIHZhciBwYXJ0bmVyTGluZUhlaWdodCA9IHBhcnNlSW50KCRwYXJ0bmVyLmNzcyhcImxpbmUtaGVpZ2h0XCIpKTtcbiAgICAgICAgJHBhcnRuZXIuZG90ZG90ZG90KHtcbiAgICAgICAgICBoZWlnaHQ6IHBhcnRuZXJMaW5lSGVpZ2h0KjEsXG4gICAgICAgICAgd2F0Y2g6IFwid2luZG93XCJcbiAgICAgICAgfSk7XG4gICAgICAgIHRhZ2xpbmVIZWlnaHQgPSB0YWdsaW5lSGVpZ2h0IC0gJHBhcnRuZXIuaGVpZ2h0KCkgLSBwYXJzZUludCgkcGFydG5lci5jc3MoXCJtYXJnaW4tdG9wXCIpKTtcbiAgICAgIH1cbiAgICAgICR0YWdsaW5lLmNzcyhcIm1heC1oZWlnaHRcIiwgdGFnbGluZUhlaWdodCk7XG4gICAgICAkdGFnbGluZS5kb3Rkb3Rkb3Qoe1xuICAgICAgICB3YXRjaDogJ3dpbmRvdydcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBzZXR1cERlbGF5ZWRJbWFnZUxvYWQ6IHNldHVwRGVsYXllZEltYWdlTG9hZCxcbiAgICAgIGVsbGlwc2l6ZVByb2plY3RDYXJkVGFnbGluZTogZWxsaXBzaXplUHJvamVjdENhcmRUYWdsaW5lXG4gICAgfTtcbiAgfVxuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogLi9hbmNpbGxhcnkvdXRpbHMvcHJvamVjdC1jYXJkLWZhY3RvcnkuanNcbiAqKi8iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUpBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7OztBQUlBO0FBQ0E7QUFDQTs7QUF4Q0EiLCJzb3VyY2VSb290IjoiIn0=");

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

	eval("\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n/*@ngInject*/\n\nexports.default = function () {\n  function RegionsService() {\n    var _this = this;\n\n    /* To refresh, open up a Rails console and type \"puts JSON.pretty_generate(Code.region_service_json_hash)\" */\n    var regions = [{\n      \"code\": \"STTE_CAAB\",\n      \"text\": \"Alberta\",\n      \"two_letter\": \"AB\",\n      \"country\": \"ca\"\n    }, {\n      \"code\": \"STTE_CABC\",\n      \"text\": \"British Columbia\",\n      \"two_letter\": \"BC\",\n      \"country\": \"ca\"\n    }, {\n      \"code\": \"STTE_CAMB\",\n      \"text\": \"Manitoba\",\n      \"two_letter\": \"MB\",\n      \"country\": \"ca\"\n    }, {\n      \"code\": \"STTE_CANB\",\n      \"text\": \"New Brunswick\",\n      \"two_letter\": \"NB\",\n      \"country\": \"ca\"\n    }, {\n      \"code\": \"STTE_CANL\",\n      \"text\": \"Newfoundland and Labrador\",\n      \"two_letter\": \"NL\",\n      \"country\": \"ca\"\n    }, {\n      \"code\": \"STTE_CANS\",\n      \"text\": \"Nova Scotia\",\n      \"two_letter\": \"NS\",\n      \"country\": \"ca\"\n    }, {\n      \"code\": \"STTE_CANT\",\n      \"text\": \"Northwest Territories\",\n      \"two_letter\": \"NT\",\n      \"country\": \"ca\"\n    }, {\n      \"code\": \"STTE_CANU\",\n      \"text\": \"Nunavut\",\n      \"two_letter\": \"NU\",\n      \"country\": \"ca\"\n    }, {\n      \"code\": \"STTE_CAON\",\n      \"text\": \"Ontario\",\n      \"two_letter\": \"ON\",\n      \"country\": \"ca\"\n    }, {\n      \"code\": \"STTE_CAPE\",\n      \"text\": \"Prince Edward Island\",\n      \"two_letter\": \"PE\",\n      \"country\": \"ca\"\n    }, {\n      \"code\": \"STTE_CAQC\",\n      \"text\": \"Quebec\",\n      \"two_letter\": \"QC\",\n      \"country\": \"ca\"\n    }, {\n      \"code\": \"STTE_CASK\",\n      \"text\": \"Saskatchewan\",\n      \"two_letter\": \"SK\",\n      \"country\": \"ca\"\n    }, {\n      \"code\": \"STTE_CAYT\",\n      \"text\": \"Yukon\",\n      \"two_letter\": \"YT\",\n      \"country\": \"ca\"\n    }, {\n      \"code\": \"STTE_USAK\",\n      \"text\": \"Alaska\",\n      \"two_letter\": \"AK\",\n      \"country\": \"us\"\n    }, {\n      \"code\": \"STTE_USAL\",\n      \"text\": \"Alabama\",\n      \"two_letter\": \"AL\",\n      \"country\": \"us\"\n    }, {\n      \"code\": \"STTE_USAR\",\n      \"text\": \"Arkansas\",\n      \"two_letter\": \"AR\",\n      \"country\": \"us\"\n    }, {\n      \"code\": \"STTE_USAZ\",\n      \"text\": \"Arizona\",\n      \"two_letter\": \"AZ\",\n      \"country\": \"us\"\n    }, {\n      \"code\": \"STTE_USCA\",\n      \"text\": \"California\",\n      \"two_letter\": \"CA\",\n      \"country\": \"us\"\n    }, {\n      \"code\": \"STTE_USCO\",\n      \"text\": \"Colorado\",\n      \"two_letter\": \"CO\",\n      \"country\": \"us\"\n    }, {\n      \"code\": \"STTE_USCT\",\n      \"text\": \"Connecticut\",\n      \"two_letter\": \"CT\",\n      \"country\": \"us\"\n    }, {\n      \"code\": \"STTE_USDC\",\n      \"text\": \"District of Columbia\",\n      \"two_letter\": \"DC\",\n      \"country\": \"us\"\n    }, {\n      \"code\": \"STTE_USDE\",\n      \"text\": \"Delaware\",\n      \"two_letter\": \"DE\",\n      \"country\": \"us\"\n    }, {\n      \"code\": \"STTE_USFL\",\n      \"text\": \"Florida\",\n      \"two_letter\": \"FL\",\n      \"country\": \"us\"\n    }, {\n      \"code\": \"STTE_USGA\",\n      \"text\": \"Georgia\",\n      \"two_letter\": \"GA\",\n      \"country\": \"us\"\n    }, {\n      \"code\": \"STTE_USHI\",\n      \"text\": \"Hawaii\",\n      \"two_letter\": \"HI\",\n      \"country\": \"us\"\n    }, {\n      \"code\": \"STTE_USIA\",\n      \"text\": \"Iowa\",\n      \"two_letter\": \"IA\",\n      \"country\": \"us\"\n    }, {\n      \"code\": \"STTE_USID\",\n      \"text\": \"Idaho\",\n      \"two_letter\": \"ID\",\n      \"country\": \"us\"\n    }, {\n      \"code\": \"STTE_USIL\",\n      \"text\": \"Illinois\",\n      \"two_letter\": \"IL\",\n      \"country\": \"us\"\n    }, {\n      \"code\": \"STTE_USIN\",\n      \"text\": \"Indiana\",\n      \"two_letter\": \"IN\",\n      \"country\": \"us\"\n    }, {\n      \"code\": \"STTE_USKS\",\n      \"text\": \"Kansas\",\n      \"two_letter\": \"KS\",\n      \"country\": \"us\"\n    }, {\n      \"code\": \"STTE_USKY\",\n      \"text\": \"Kentucky\",\n      \"two_letter\": \"KY\",\n      \"country\": \"us\"\n    }, {\n      \"code\": \"STTE_USLA\",\n      \"text\": \"Louisiana\",\n      \"two_letter\": \"LA\",\n      \"country\": \"us\"\n    }, {\n      \"code\": \"STTE_USMA\",\n      \"text\": \"Massachusetts\",\n      \"two_letter\": \"MA\",\n      \"country\": \"us\"\n    }, {\n      \"code\": \"STTE_USMD\",\n      \"text\": \"Maryland\",\n      \"two_letter\": \"MD\",\n      \"country\": \"us\"\n    }, {\n      \"code\": \"STTE_USME\",\n      \"text\": \"Maine\",\n      \"two_letter\": \"ME\",\n      \"country\": \"us\"\n    }, {\n      \"code\": \"STTE_USMI\",\n      \"text\": \"Michigan\",\n      \"two_letter\": \"MI\",\n      \"country\": \"us\"\n    }, {\n      \"code\": \"STTE_USMN\",\n      \"text\": \"Minnesota\",\n      \"two_letter\": \"MN\",\n      \"country\": \"us\"\n    }, {\n      \"code\": \"STTE_USMO\",\n      \"text\": \"Missouri\",\n      \"two_letter\": \"MO\",\n      \"country\": \"us\"\n    }, {\n      \"code\": \"STTE_USMS\",\n      \"text\": \"Mississippi\",\n      \"two_letter\": \"MS\",\n      \"country\": \"us\"\n    }, {\n      \"code\": \"STTE_USMT\",\n      \"text\": \"Montana\",\n      \"two_letter\": \"MT\",\n      \"country\": \"us\"\n    }, {\n      \"code\": \"STTE_USNC\",\n      \"text\": \"North Carolina\",\n      \"two_letter\": \"NC\",\n      \"country\": \"us\"\n    }, {\n      \"code\": \"STTE_USND\",\n      \"text\": \"North Dakota\",\n      \"two_letter\": \"ND\",\n      \"country\": \"us\"\n    }, {\n      \"code\": \"STTE_USNE\",\n      \"text\": \"Nebraska\",\n      \"two_letter\": \"NE\",\n      \"country\": \"us\"\n    }, {\n      \"code\": \"STTE_USNH\",\n      \"text\": \"New Hampshire\",\n      \"two_letter\": \"NH\",\n      \"country\": \"us\"\n    }, {\n      \"code\": \"STTE_USNJ\",\n      \"text\": \"New Jersey\",\n      \"two_letter\": \"NJ\",\n      \"country\": \"us\"\n    }, {\n      \"code\": \"STTE_USNM\",\n      \"text\": \"New Mexico\",\n      \"two_letter\": \"NM\",\n      \"country\": \"us\"\n    }, {\n      \"code\": \"STTE_USNV\",\n      \"text\": \"Nevada\",\n      \"two_letter\": \"NV\",\n      \"country\": \"us\"\n    }, {\n      \"code\": \"STTE_USNY\",\n      \"text\": \"New York\",\n      \"two_letter\": \"NY\",\n      \"country\": \"us\"\n    }, {\n      \"code\": \"STTE_USOH\",\n      \"text\": \"Ohio\",\n      \"two_letter\": \"OH\",\n      \"country\": \"us\"\n    }, {\n      \"code\": \"STTE_USOK\",\n      \"text\": \"Oklahoma\",\n      \"two_letter\": \"OK\",\n      \"country\": \"us\"\n    }, {\n      \"code\": \"STTE_USOR\",\n      \"text\": \"Oregon\",\n      \"two_letter\": \"OR\",\n      \"country\": \"us\"\n    }, {\n      \"code\": \"STTE_USPA\",\n      \"text\": \"Pennsylvania\",\n      \"two_letter\": \"PA\",\n      \"country\": \"us\"\n    }, {\n      \"code\": \"STTE_USRI\",\n      \"text\": \"Rhode Island\",\n      \"two_letter\": \"RI\",\n      \"country\": \"us\"\n    }, {\n      \"code\": \"STTE_USSC\",\n      \"text\": \"South Carolina\",\n      \"two_letter\": \"SC\",\n      \"country\": \"us\"\n    }, {\n      \"code\": \"STTE_USSD\",\n      \"text\": \"South Dakota\",\n      \"two_letter\": \"SD\",\n      \"country\": \"us\"\n    }, {\n      \"code\": \"STTE_USTN\",\n      \"text\": \"Tennessee\",\n      \"two_letter\": \"TN\",\n      \"country\": \"us\"\n    }, {\n      \"code\": \"STTE_USTX\",\n      \"text\": \"Texas\",\n      \"two_letter\": \"TX\",\n      \"country\": \"us\"\n    }, {\n      \"code\": \"STTE_USUT\",\n      \"text\": \"Utah\",\n      \"two_letter\": \"UT\",\n      \"country\": \"us\"\n    }, {\n      \"code\": \"STTE_USVA\",\n      \"text\": \"Virginia\",\n      \"two_letter\": \"VA\",\n      \"country\": \"us\"\n    }, {\n      \"code\": \"STTE_USVT\",\n      \"text\": \"Vermont\",\n      \"two_letter\": \"VT\",\n      \"country\": \"us\"\n    }, {\n      \"code\": \"STTE_USWA\",\n      \"text\": \"Washington\",\n      \"two_letter\": \"WA\",\n      \"country\": \"us\"\n    }, {\n      \"code\": \"STTE_USWI\",\n      \"text\": \"Wisconsin\",\n      \"two_letter\": \"WI\",\n      \"country\": \"us\"\n    }, {\n      \"code\": \"STTE_USWV\",\n      \"text\": \"West Virginia\",\n      \"two_letter\": \"WV\",\n      \"country\": \"us\"\n    }, {\n      \"code\": \"STTE_USWY\",\n      \"text\": \"Wyoming\",\n      \"two_letter\": \"WY\",\n      \"country\": \"us\"\n    }];\n\n    var states = _.select(regions, function (region) {\n      return region.country === 'us';\n    });\n    var provinces = _.select(regions, function (region) {\n      return region.country === 'ca';\n    });\n\n    var regionsAsOptions = function regionsAsOptions(regions) {\n      return _.map(regions, function (region) {\n        return {\n          value: region.code,\n          text: region.text,\n          two_letter: region.two_letter\n        };\n      });\n    };\n\n    this.all = function () {\n      return regions;\n    };\n    this.getStates = function () {\n      return states;\n    };\n    this.getProvinces = function () {\n      return provinces;\n    };\n    this.statesAsOptions = function () {\n      return regionsAsOptions(states);\n    };\n    this.provincesAsOptions = function () {\n      return regionsAsOptions(provinces);\n    };\n    this.byCode = function (code) {\n      return _.find(regions, { code: code });\n    };\n\n    this.byTwoLetterCode = function (code) {\n      code = code && code.toUpperCase();\n      if (code && code.match(/^STTE_/)) {\n        return _this.byCode(code);\n      }\n      return _.find(regions, { two_letter: code });\n    };\n\n    this.byText = function (text) {\n      return _.find(regions, function (region) {\n        return region.text.toLowerCase() === text.toLowerCase();\n      });\n    };\n\n    this.toCode = function (region, country) {\n      return [\"STTE_\", country, region].join('');\n    };\n  }\n\n  return new RegionsService();\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTU5LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vYW5jaWxsYXJ5L3V0aWxzL3JlZ2lvbnMtZmFjdG9yeS5qcz84ZTUyIl0sInNvdXJjZXNDb250ZW50IjpbIi8qQG5nSW5qZWN0Ki9cbmV4cG9ydCBkZWZhdWx0ICgpID0+IHtcbiAgZnVuY3Rpb24gUmVnaW9uc1NlcnZpY2UoKSB7XG4gICAgLyogVG8gcmVmcmVzaCwgb3BlbiB1cCBhIFJhaWxzIGNvbnNvbGUgYW5kIHR5cGUgXCJwdXRzIEpTT04ucHJldHR5X2dlbmVyYXRlKENvZGUucmVnaW9uX3NlcnZpY2VfanNvbl9oYXNoKVwiICovXG4gICAgbGV0IHJlZ2lvbnMgPSBbXG4gICAgICB7XG4gICAgICAgIFwiY29kZVwiOiBcIlNUVEVfQ0FBQlwiLFxuICAgICAgICBcInRleHRcIjogXCJBbGJlcnRhXCIsXG4gICAgICAgIFwidHdvX2xldHRlclwiOiBcIkFCXCIsXG4gICAgICAgIFwiY291bnRyeVwiOiBcImNhXCJcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIFwiY29kZVwiOiBcIlNUVEVfQ0FCQ1wiLFxuICAgICAgICBcInRleHRcIjogXCJCcml0aXNoIENvbHVtYmlhXCIsXG4gICAgICAgIFwidHdvX2xldHRlclwiOiBcIkJDXCIsXG4gICAgICAgIFwiY291bnRyeVwiOiBcImNhXCJcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIFwiY29kZVwiOiBcIlNUVEVfQ0FNQlwiLFxuICAgICAgICBcInRleHRcIjogXCJNYW5pdG9iYVwiLFxuICAgICAgICBcInR3b19sZXR0ZXJcIjogXCJNQlwiLFxuICAgICAgICBcImNvdW50cnlcIjogXCJjYVwiXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBcImNvZGVcIjogXCJTVFRFX0NBTkJcIixcbiAgICAgICAgXCJ0ZXh0XCI6IFwiTmV3IEJydW5zd2lja1wiLFxuICAgICAgICBcInR3b19sZXR0ZXJcIjogXCJOQlwiLFxuICAgICAgICBcImNvdW50cnlcIjogXCJjYVwiXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBcImNvZGVcIjogXCJTVFRFX0NBTkxcIixcbiAgICAgICAgXCJ0ZXh0XCI6IFwiTmV3Zm91bmRsYW5kIGFuZCBMYWJyYWRvclwiLFxuICAgICAgICBcInR3b19sZXR0ZXJcIjogXCJOTFwiLFxuICAgICAgICBcImNvdW50cnlcIjogXCJjYVwiXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBcImNvZGVcIjogXCJTVFRFX0NBTlNcIixcbiAgICAgICAgXCJ0ZXh0XCI6IFwiTm92YSBTY290aWFcIixcbiAgICAgICAgXCJ0d29fbGV0dGVyXCI6IFwiTlNcIixcbiAgICAgICAgXCJjb3VudHJ5XCI6IFwiY2FcIlxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgXCJjb2RlXCI6IFwiU1RURV9DQU5UXCIsXG4gICAgICAgIFwidGV4dFwiOiBcIk5vcnRod2VzdCBUZXJyaXRvcmllc1wiLFxuICAgICAgICBcInR3b19sZXR0ZXJcIjogXCJOVFwiLFxuICAgICAgICBcImNvdW50cnlcIjogXCJjYVwiXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBcImNvZGVcIjogXCJTVFRFX0NBTlVcIixcbiAgICAgICAgXCJ0ZXh0XCI6IFwiTnVuYXZ1dFwiLFxuICAgICAgICBcInR3b19sZXR0ZXJcIjogXCJOVVwiLFxuICAgICAgICBcImNvdW50cnlcIjogXCJjYVwiXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBcImNvZGVcIjogXCJTVFRFX0NBT05cIixcbiAgICAgICAgXCJ0ZXh0XCI6IFwiT250YXJpb1wiLFxuICAgICAgICBcInR3b19sZXR0ZXJcIjogXCJPTlwiLFxuICAgICAgICBcImNvdW50cnlcIjogXCJjYVwiXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBcImNvZGVcIjogXCJTVFRFX0NBUEVcIixcbiAgICAgICAgXCJ0ZXh0XCI6IFwiUHJpbmNlIEVkd2FyZCBJc2xhbmRcIixcbiAgICAgICAgXCJ0d29fbGV0dGVyXCI6IFwiUEVcIixcbiAgICAgICAgXCJjb3VudHJ5XCI6IFwiY2FcIlxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgXCJjb2RlXCI6IFwiU1RURV9DQVFDXCIsXG4gICAgICAgIFwidGV4dFwiOiBcIlF1ZWJlY1wiLFxuICAgICAgICBcInR3b19sZXR0ZXJcIjogXCJRQ1wiLFxuICAgICAgICBcImNvdW50cnlcIjogXCJjYVwiXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBcImNvZGVcIjogXCJTVFRFX0NBU0tcIixcbiAgICAgICAgXCJ0ZXh0XCI6IFwiU2Fza2F0Y2hld2FuXCIsXG4gICAgICAgIFwidHdvX2xldHRlclwiOiBcIlNLXCIsXG4gICAgICAgIFwiY291bnRyeVwiOiBcImNhXCJcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIFwiY29kZVwiOiBcIlNUVEVfQ0FZVFwiLFxuICAgICAgICBcInRleHRcIjogXCJZdWtvblwiLFxuICAgICAgICBcInR3b19sZXR0ZXJcIjogXCJZVFwiLFxuICAgICAgICBcImNvdW50cnlcIjogXCJjYVwiXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBcImNvZGVcIjogXCJTVFRFX1VTQUtcIixcbiAgICAgICAgXCJ0ZXh0XCI6IFwiQWxhc2thXCIsXG4gICAgICAgIFwidHdvX2xldHRlclwiOiBcIkFLXCIsXG4gICAgICAgIFwiY291bnRyeVwiOiBcInVzXCJcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIFwiY29kZVwiOiBcIlNUVEVfVVNBTFwiLFxuICAgICAgICBcInRleHRcIjogXCJBbGFiYW1hXCIsXG4gICAgICAgIFwidHdvX2xldHRlclwiOiBcIkFMXCIsXG4gICAgICAgIFwiY291bnRyeVwiOiBcInVzXCJcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIFwiY29kZVwiOiBcIlNUVEVfVVNBUlwiLFxuICAgICAgICBcInRleHRcIjogXCJBcmthbnNhc1wiLFxuICAgICAgICBcInR3b19sZXR0ZXJcIjogXCJBUlwiLFxuICAgICAgICBcImNvdW50cnlcIjogXCJ1c1wiXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBcImNvZGVcIjogXCJTVFRFX1VTQVpcIixcbiAgICAgICAgXCJ0ZXh0XCI6IFwiQXJpem9uYVwiLFxuICAgICAgICBcInR3b19sZXR0ZXJcIjogXCJBWlwiLFxuICAgICAgICBcImNvdW50cnlcIjogXCJ1c1wiXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBcImNvZGVcIjogXCJTVFRFX1VTQ0FcIixcbiAgICAgICAgXCJ0ZXh0XCI6IFwiQ2FsaWZvcm5pYVwiLFxuICAgICAgICBcInR3b19sZXR0ZXJcIjogXCJDQVwiLFxuICAgICAgICBcImNvdW50cnlcIjogXCJ1c1wiXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBcImNvZGVcIjogXCJTVFRFX1VTQ09cIixcbiAgICAgICAgXCJ0ZXh0XCI6IFwiQ29sb3JhZG9cIixcbiAgICAgICAgXCJ0d29fbGV0dGVyXCI6IFwiQ09cIixcbiAgICAgICAgXCJjb3VudHJ5XCI6IFwidXNcIlxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgXCJjb2RlXCI6IFwiU1RURV9VU0NUXCIsXG4gICAgICAgIFwidGV4dFwiOiBcIkNvbm5lY3RpY3V0XCIsXG4gICAgICAgIFwidHdvX2xldHRlclwiOiBcIkNUXCIsXG4gICAgICAgIFwiY291bnRyeVwiOiBcInVzXCJcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIFwiY29kZVwiOiBcIlNUVEVfVVNEQ1wiLFxuICAgICAgICBcInRleHRcIjogXCJEaXN0cmljdCBvZiBDb2x1bWJpYVwiLFxuICAgICAgICBcInR3b19sZXR0ZXJcIjogXCJEQ1wiLFxuICAgICAgICBcImNvdW50cnlcIjogXCJ1c1wiXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBcImNvZGVcIjogXCJTVFRFX1VTREVcIixcbiAgICAgICAgXCJ0ZXh0XCI6IFwiRGVsYXdhcmVcIixcbiAgICAgICAgXCJ0d29fbGV0dGVyXCI6IFwiREVcIixcbiAgICAgICAgXCJjb3VudHJ5XCI6IFwidXNcIlxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgXCJjb2RlXCI6IFwiU1RURV9VU0ZMXCIsXG4gICAgICAgIFwidGV4dFwiOiBcIkZsb3JpZGFcIixcbiAgICAgICAgXCJ0d29fbGV0dGVyXCI6IFwiRkxcIixcbiAgICAgICAgXCJjb3VudHJ5XCI6IFwidXNcIlxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgXCJjb2RlXCI6IFwiU1RURV9VU0dBXCIsXG4gICAgICAgIFwidGV4dFwiOiBcIkdlb3JnaWFcIixcbiAgICAgICAgXCJ0d29fbGV0dGVyXCI6IFwiR0FcIixcbiAgICAgICAgXCJjb3VudHJ5XCI6IFwidXNcIlxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgXCJjb2RlXCI6IFwiU1RURV9VU0hJXCIsXG4gICAgICAgIFwidGV4dFwiOiBcIkhhd2FpaVwiLFxuICAgICAgICBcInR3b19sZXR0ZXJcIjogXCJISVwiLFxuICAgICAgICBcImNvdW50cnlcIjogXCJ1c1wiXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBcImNvZGVcIjogXCJTVFRFX1VTSUFcIixcbiAgICAgICAgXCJ0ZXh0XCI6IFwiSW93YVwiLFxuICAgICAgICBcInR3b19sZXR0ZXJcIjogXCJJQVwiLFxuICAgICAgICBcImNvdW50cnlcIjogXCJ1c1wiXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBcImNvZGVcIjogXCJTVFRFX1VTSURcIixcbiAgICAgICAgXCJ0ZXh0XCI6IFwiSWRhaG9cIixcbiAgICAgICAgXCJ0d29fbGV0dGVyXCI6IFwiSURcIixcbiAgICAgICAgXCJjb3VudHJ5XCI6IFwidXNcIlxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgXCJjb2RlXCI6IFwiU1RURV9VU0lMXCIsXG4gICAgICAgIFwidGV4dFwiOiBcIklsbGlub2lzXCIsXG4gICAgICAgIFwidHdvX2xldHRlclwiOiBcIklMXCIsXG4gICAgICAgIFwiY291bnRyeVwiOiBcInVzXCJcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIFwiY29kZVwiOiBcIlNUVEVfVVNJTlwiLFxuICAgICAgICBcInRleHRcIjogXCJJbmRpYW5hXCIsXG4gICAgICAgIFwidHdvX2xldHRlclwiOiBcIklOXCIsXG4gICAgICAgIFwiY291bnRyeVwiOiBcInVzXCJcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIFwiY29kZVwiOiBcIlNUVEVfVVNLU1wiLFxuICAgICAgICBcInRleHRcIjogXCJLYW5zYXNcIixcbiAgICAgICAgXCJ0d29fbGV0dGVyXCI6IFwiS1NcIixcbiAgICAgICAgXCJjb3VudHJ5XCI6IFwidXNcIlxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgXCJjb2RlXCI6IFwiU1RURV9VU0tZXCIsXG4gICAgICAgIFwidGV4dFwiOiBcIktlbnR1Y2t5XCIsXG4gICAgICAgIFwidHdvX2xldHRlclwiOiBcIktZXCIsXG4gICAgICAgIFwiY291bnRyeVwiOiBcInVzXCJcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIFwiY29kZVwiOiBcIlNUVEVfVVNMQVwiLFxuICAgICAgICBcInRleHRcIjogXCJMb3Vpc2lhbmFcIixcbiAgICAgICAgXCJ0d29fbGV0dGVyXCI6IFwiTEFcIixcbiAgICAgICAgXCJjb3VudHJ5XCI6IFwidXNcIlxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgXCJjb2RlXCI6IFwiU1RURV9VU01BXCIsXG4gICAgICAgIFwidGV4dFwiOiBcIk1hc3NhY2h1c2V0dHNcIixcbiAgICAgICAgXCJ0d29fbGV0dGVyXCI6IFwiTUFcIixcbiAgICAgICAgXCJjb3VudHJ5XCI6IFwidXNcIlxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgXCJjb2RlXCI6IFwiU1RURV9VU01EXCIsXG4gICAgICAgIFwidGV4dFwiOiBcIk1hcnlsYW5kXCIsXG4gICAgICAgIFwidHdvX2xldHRlclwiOiBcIk1EXCIsXG4gICAgICAgIFwiY291bnRyeVwiOiBcInVzXCJcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIFwiY29kZVwiOiBcIlNUVEVfVVNNRVwiLFxuICAgICAgICBcInRleHRcIjogXCJNYWluZVwiLFxuICAgICAgICBcInR3b19sZXR0ZXJcIjogXCJNRVwiLFxuICAgICAgICBcImNvdW50cnlcIjogXCJ1c1wiXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBcImNvZGVcIjogXCJTVFRFX1VTTUlcIixcbiAgICAgICAgXCJ0ZXh0XCI6IFwiTWljaGlnYW5cIixcbiAgICAgICAgXCJ0d29fbGV0dGVyXCI6IFwiTUlcIixcbiAgICAgICAgXCJjb3VudHJ5XCI6IFwidXNcIlxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgXCJjb2RlXCI6IFwiU1RURV9VU01OXCIsXG4gICAgICAgIFwidGV4dFwiOiBcIk1pbm5lc290YVwiLFxuICAgICAgICBcInR3b19sZXR0ZXJcIjogXCJNTlwiLFxuICAgICAgICBcImNvdW50cnlcIjogXCJ1c1wiXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBcImNvZGVcIjogXCJTVFRFX1VTTU9cIixcbiAgICAgICAgXCJ0ZXh0XCI6IFwiTWlzc291cmlcIixcbiAgICAgICAgXCJ0d29fbGV0dGVyXCI6IFwiTU9cIixcbiAgICAgICAgXCJjb3VudHJ5XCI6IFwidXNcIlxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgXCJjb2RlXCI6IFwiU1RURV9VU01TXCIsXG4gICAgICAgIFwidGV4dFwiOiBcIk1pc3Npc3NpcHBpXCIsXG4gICAgICAgIFwidHdvX2xldHRlclwiOiBcIk1TXCIsXG4gICAgICAgIFwiY291bnRyeVwiOiBcInVzXCJcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIFwiY29kZVwiOiBcIlNUVEVfVVNNVFwiLFxuICAgICAgICBcInRleHRcIjogXCJNb250YW5hXCIsXG4gICAgICAgIFwidHdvX2xldHRlclwiOiBcIk1UXCIsXG4gICAgICAgIFwiY291bnRyeVwiOiBcInVzXCJcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIFwiY29kZVwiOiBcIlNUVEVfVVNOQ1wiLFxuICAgICAgICBcInRleHRcIjogXCJOb3J0aCBDYXJvbGluYVwiLFxuICAgICAgICBcInR3b19sZXR0ZXJcIjogXCJOQ1wiLFxuICAgICAgICBcImNvdW50cnlcIjogXCJ1c1wiXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBcImNvZGVcIjogXCJTVFRFX1VTTkRcIixcbiAgICAgICAgXCJ0ZXh0XCI6IFwiTm9ydGggRGFrb3RhXCIsXG4gICAgICAgIFwidHdvX2xldHRlclwiOiBcIk5EXCIsXG4gICAgICAgIFwiY291bnRyeVwiOiBcInVzXCJcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIFwiY29kZVwiOiBcIlNUVEVfVVNORVwiLFxuICAgICAgICBcInRleHRcIjogXCJOZWJyYXNrYVwiLFxuICAgICAgICBcInR3b19sZXR0ZXJcIjogXCJORVwiLFxuICAgICAgICBcImNvdW50cnlcIjogXCJ1c1wiXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBcImNvZGVcIjogXCJTVFRFX1VTTkhcIixcbiAgICAgICAgXCJ0ZXh0XCI6IFwiTmV3IEhhbXBzaGlyZVwiLFxuICAgICAgICBcInR3b19sZXR0ZXJcIjogXCJOSFwiLFxuICAgICAgICBcImNvdW50cnlcIjogXCJ1c1wiXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBcImNvZGVcIjogXCJTVFRFX1VTTkpcIixcbiAgICAgICAgXCJ0ZXh0XCI6IFwiTmV3IEplcnNleVwiLFxuICAgICAgICBcInR3b19sZXR0ZXJcIjogXCJOSlwiLFxuICAgICAgICBcImNvdW50cnlcIjogXCJ1c1wiXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBcImNvZGVcIjogXCJTVFRFX1VTTk1cIixcbiAgICAgICAgXCJ0ZXh0XCI6IFwiTmV3IE1leGljb1wiLFxuICAgICAgICBcInR3b19sZXR0ZXJcIjogXCJOTVwiLFxuICAgICAgICBcImNvdW50cnlcIjogXCJ1c1wiXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBcImNvZGVcIjogXCJTVFRFX1VTTlZcIixcbiAgICAgICAgXCJ0ZXh0XCI6IFwiTmV2YWRhXCIsXG4gICAgICAgIFwidHdvX2xldHRlclwiOiBcIk5WXCIsXG4gICAgICAgIFwiY291bnRyeVwiOiBcInVzXCJcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIFwiY29kZVwiOiBcIlNUVEVfVVNOWVwiLFxuICAgICAgICBcInRleHRcIjogXCJOZXcgWW9ya1wiLFxuICAgICAgICBcInR3b19sZXR0ZXJcIjogXCJOWVwiLFxuICAgICAgICBcImNvdW50cnlcIjogXCJ1c1wiXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBcImNvZGVcIjogXCJTVFRFX1VTT0hcIixcbiAgICAgICAgXCJ0ZXh0XCI6IFwiT2hpb1wiLFxuICAgICAgICBcInR3b19sZXR0ZXJcIjogXCJPSFwiLFxuICAgICAgICBcImNvdW50cnlcIjogXCJ1c1wiXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBcImNvZGVcIjogXCJTVFRFX1VTT0tcIixcbiAgICAgICAgXCJ0ZXh0XCI6IFwiT2tsYWhvbWFcIixcbiAgICAgICAgXCJ0d29fbGV0dGVyXCI6IFwiT0tcIixcbiAgICAgICAgXCJjb3VudHJ5XCI6IFwidXNcIlxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgXCJjb2RlXCI6IFwiU1RURV9VU09SXCIsXG4gICAgICAgIFwidGV4dFwiOiBcIk9yZWdvblwiLFxuICAgICAgICBcInR3b19sZXR0ZXJcIjogXCJPUlwiLFxuICAgICAgICBcImNvdW50cnlcIjogXCJ1c1wiXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBcImNvZGVcIjogXCJTVFRFX1VTUEFcIixcbiAgICAgICAgXCJ0ZXh0XCI6IFwiUGVubnN5bHZhbmlhXCIsXG4gICAgICAgIFwidHdvX2xldHRlclwiOiBcIlBBXCIsXG4gICAgICAgIFwiY291bnRyeVwiOiBcInVzXCJcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIFwiY29kZVwiOiBcIlNUVEVfVVNSSVwiLFxuICAgICAgICBcInRleHRcIjogXCJSaG9kZSBJc2xhbmRcIixcbiAgICAgICAgXCJ0d29fbGV0dGVyXCI6IFwiUklcIixcbiAgICAgICAgXCJjb3VudHJ5XCI6IFwidXNcIlxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgXCJjb2RlXCI6IFwiU1RURV9VU1NDXCIsXG4gICAgICAgIFwidGV4dFwiOiBcIlNvdXRoIENhcm9saW5hXCIsXG4gICAgICAgIFwidHdvX2xldHRlclwiOiBcIlNDXCIsXG4gICAgICAgIFwiY291bnRyeVwiOiBcInVzXCJcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIFwiY29kZVwiOiBcIlNUVEVfVVNTRFwiLFxuICAgICAgICBcInRleHRcIjogXCJTb3V0aCBEYWtvdGFcIixcbiAgICAgICAgXCJ0d29fbGV0dGVyXCI6IFwiU0RcIixcbiAgICAgICAgXCJjb3VudHJ5XCI6IFwidXNcIlxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgXCJjb2RlXCI6IFwiU1RURV9VU1ROXCIsXG4gICAgICAgIFwidGV4dFwiOiBcIlRlbm5lc3NlZVwiLFxuICAgICAgICBcInR3b19sZXR0ZXJcIjogXCJUTlwiLFxuICAgICAgICBcImNvdW50cnlcIjogXCJ1c1wiXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBcImNvZGVcIjogXCJTVFRFX1VTVFhcIixcbiAgICAgICAgXCJ0ZXh0XCI6IFwiVGV4YXNcIixcbiAgICAgICAgXCJ0d29fbGV0dGVyXCI6IFwiVFhcIixcbiAgICAgICAgXCJjb3VudHJ5XCI6IFwidXNcIlxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgXCJjb2RlXCI6IFwiU1RURV9VU1VUXCIsXG4gICAgICAgIFwidGV4dFwiOiBcIlV0YWhcIixcbiAgICAgICAgXCJ0d29fbGV0dGVyXCI6IFwiVVRcIixcbiAgICAgICAgXCJjb3VudHJ5XCI6IFwidXNcIlxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgXCJjb2RlXCI6IFwiU1RURV9VU1ZBXCIsXG4gICAgICAgIFwidGV4dFwiOiBcIlZpcmdpbmlhXCIsXG4gICAgICAgIFwidHdvX2xldHRlclwiOiBcIlZBXCIsXG4gICAgICAgIFwiY291bnRyeVwiOiBcInVzXCJcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIFwiY29kZVwiOiBcIlNUVEVfVVNWVFwiLFxuICAgICAgICBcInRleHRcIjogXCJWZXJtb250XCIsXG4gICAgICAgIFwidHdvX2xldHRlclwiOiBcIlZUXCIsXG4gICAgICAgIFwiY291bnRyeVwiOiBcInVzXCJcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIFwiY29kZVwiOiBcIlNUVEVfVVNXQVwiLFxuICAgICAgICBcInRleHRcIjogXCJXYXNoaW5ndG9uXCIsXG4gICAgICAgIFwidHdvX2xldHRlclwiOiBcIldBXCIsXG4gICAgICAgIFwiY291bnRyeVwiOiBcInVzXCJcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIFwiY29kZVwiOiBcIlNUVEVfVVNXSVwiLFxuICAgICAgICBcInRleHRcIjogXCJXaXNjb25zaW5cIixcbiAgICAgICAgXCJ0d29fbGV0dGVyXCI6IFwiV0lcIixcbiAgICAgICAgXCJjb3VudHJ5XCI6IFwidXNcIlxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgXCJjb2RlXCI6IFwiU1RURV9VU1dWXCIsXG4gICAgICAgIFwidGV4dFwiOiBcIldlc3QgVmlyZ2luaWFcIixcbiAgICAgICAgXCJ0d29fbGV0dGVyXCI6IFwiV1ZcIixcbiAgICAgICAgXCJjb3VudHJ5XCI6IFwidXNcIlxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgXCJjb2RlXCI6IFwiU1RURV9VU1dZXCIsXG4gICAgICAgIFwidGV4dFwiOiBcIld5b21pbmdcIixcbiAgICAgICAgXCJ0d29fbGV0dGVyXCI6IFwiV1lcIixcbiAgICAgICAgXCJjb3VudHJ5XCI6IFwidXNcIlxuICAgICAgfVxuICAgIF07XG5cbiAgICBsZXQgc3RhdGVzID0gXy5zZWxlY3QocmVnaW9ucywgKHJlZ2lvbikgPT4gcmVnaW9uLmNvdW50cnkgPT09ICd1cycpO1xuICAgIGxldCBwcm92aW5jZXMgPSBfLnNlbGVjdChyZWdpb25zLCAocmVnaW9uKSA9PiByZWdpb24uY291bnRyeSA9PT0gJ2NhJyk7XG5cbiAgICBsZXQgcmVnaW9uc0FzT3B0aW9ucyA9IChyZWdpb25zKSA9PiB7XG4gICAgICByZXR1cm4gXy5tYXAocmVnaW9ucywgKHJlZ2lvbikgPT4ge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHZhbHVlOiByZWdpb24uY29kZSxcbiAgICAgICAgICB0ZXh0OiByZWdpb24udGV4dCxcbiAgICAgICAgICB0d29fbGV0dGVyOiByZWdpb24udHdvX2xldHRlclxuICAgICAgICB9O1xuICAgICAgfSk7XG4gICAgfTtcblxuICAgIHRoaXMuYWxsID0gKCkgPT4gcmVnaW9ucztcbiAgICB0aGlzLmdldFN0YXRlcyA9ICgpID0+IHN0YXRlcztcbiAgICB0aGlzLmdldFByb3ZpbmNlcyA9ICgpID0+IHByb3ZpbmNlcztcbiAgICB0aGlzLnN0YXRlc0FzT3B0aW9ucyA9ICgpID0+IHJlZ2lvbnNBc09wdGlvbnMoc3RhdGVzKTtcbiAgICB0aGlzLnByb3ZpbmNlc0FzT3B0aW9ucyA9ICgpID0+IHJlZ2lvbnNBc09wdGlvbnMocHJvdmluY2VzKTtcbiAgICB0aGlzLmJ5Q29kZSA9IChjb2RlKSA9PiBfLmZpbmQocmVnaW9ucywge2NvZGU6IGNvZGV9KTtcblxuICAgIHRoaXMuYnlUd29MZXR0ZXJDb2RlID0gKGNvZGUpID0+IHtcbiAgICAgIGNvZGUgPSBjb2RlICYmIGNvZGUudG9VcHBlckNhc2UoKTtcbiAgICAgIGlmKGNvZGUgJiYgY29kZS5tYXRjaCgvXlNUVEVfLykpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYnlDb2RlKGNvZGUpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIF8uZmluZChyZWdpb25zLCB7dHdvX2xldHRlcjogY29kZX0pO1xuICAgIH07XG5cbiAgICB0aGlzLmJ5VGV4dCA9ICh0ZXh0KSA9PiB7XG4gICAgICByZXR1cm4gXy5maW5kKHJlZ2lvbnMsIChyZWdpb24pID0+IHJlZ2lvbi50ZXh0LnRvTG93ZXJDYXNlKCkgPT09IHRleHQudG9Mb3dlckNhc2UoKSk7XG4gICAgfTtcblxuICAgIHRoaXMudG9Db2RlID0gKHJlZ2lvbiwgY291bnRyeSkgPT4gW1wiU1RURV9cIiwgY291bnRyeSwgcmVnaW9uXS5qb2luKCcnKTtcbiAgfVxuXG4gIHJldHVybiBuZXcgUmVnaW9uc1NlcnZpY2UoKTtcbn07XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiAuL2FuY2lsbGFyeS91dGlscy9yZWdpb25zLWZhY3RvcnkuanNcbiAqKi8iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBOzs7O0FBSUE7QUFMQTtBQU9BO0FBQ0E7O0FBTkE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBSUE7QUF4REE7O0FBeURBO0FBdERBOzs7QUF3REE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7OztBQUtBO0FBcERBOztBQXFEQTtBQWxEQTs7QUFtREE7QUFoREE7O0FBaURBO0FBOUNBOztBQStDQTtBQTVDQTs7QUE2Q0E7QUExQ0E7OztBQTRDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7O0FBR0E7QUFDQTtBQXhDQTs7OztBQTJDQTtBQXRDQTs7OztBQXlDQTtBQXphQSIsInNvdXJjZVJvb3QiOiIifQ==");

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

	eval("'use strict';\n\nsearchExpression.$inject = [\"i18n\", \"countriesService\"];\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = searchExpression;\n/*@ngInject*/\nfunction searchExpression(i18n, countriesService) {\n  var countries = countriesService;\n  function addFilter(filterList, text, whenToAdd) {\n    if (whenToAdd) {\n      filterList.push(text);\n    }\n  }\n\n  function quotedList(filterList) {\n    var finalList = [];\n    filterList.forEach(function (item) {\n      if (item && !_.isEmpty(item)) {\n        finalList.push('\"' + item + '\"');\n      }\n    });\n    return finalList.join(\", \");\n  }\n\n  function notBlank(field) {\n    return field && !_.isEmpty(field);\n  }\n\n  return function (searchParams) {\n    var filterList = [];\n    addFilter(filterList, searchParams.filter_category, !!searchParams.filter_category);\n    var location = [];\n    if (notBlank(searchParams.filter_city)) {\n      location.push(searchParams.filter_city);\n    }\n    if (notBlank(searchParams.filter_country)) {\n      var country = countries.findByCode(searchParams.filter_country).text;\n      if (country) {\n        location.push(country);\n      }\n    }\n    if (location.length > 0) {\n      filterList.push(location.join(\", \"));\n    }\n    addFilter(filterList, '50% - 75%', searchParams.filter_percent_funded === '50_to_75');\n    addFilter(filterList, '75% - 100+%', searchParams.filter_percent_funded === '75_to_100_plus');\n    addFilter(filterList, i18n.t('adv_search.funding_open'), searchParams.filter_status === 'open');\n    addFilter(filterList, i18n.t('adv_search.funding_ended'), searchParams.filter_status === 'ended');\n    addFilter(filterList, i18n.t('flexible'), searchParams.filter_funding === 'flexible');\n    addFilter(filterList, i18n.t('fixed'), searchParams.filter_funding === 'fixed');\n    addFilter(filterList, i18n.t('verified_nonprofit'), searchParams.filter_nonprofit === 'nonprofit');\n    addFilter(filterList, i18n.t('in_demand_label'), !!searchParams.filter_forever_funding_active);\n\n    if (notBlank(searchParams.search_text)) {\n      var quotedTitle = '\"' + searchParams.search_text + '\"';\n      if (filterList.length > 0) {\n        return i18n.t('x_in_category', { x: quotedTitle, category: quotedList(filterList) });\n      } else {\n        return quotedTitle;\n      }\n    } else {\n      if (notBlank(searchParams.filter_quick)) {\n        var quickKey = searchParams.filter_quick;\n        if (quickKey === 'popular_all') {\n          quickKey = 'trending';\n        }\n        filterList.push(i18n.t(\"quick_pick_filters.\" + quickKey));\n      }\n      return quotedList(filterList);\n    }\n  };\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTYwLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vYW5jaWxsYXJ5L3V0aWxzL3NlYXJjaC1leHByZXNzaW9uLWZpbHRlci5qcz83NDZmIl0sInNvdXJjZXNDb250ZW50IjpbIi8qQG5nSW5qZWN0Ki9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHNlYXJjaEV4cHJlc3Npb24oaTE4biwgY291bnRyaWVzU2VydmljZSkge1xuICAgICAgbGV0IGNvdW50cmllcyA9IGNvdW50cmllc1NlcnZpY2U7XG4gICAgICBmdW5jdGlvbiBhZGRGaWx0ZXIoZmlsdGVyTGlzdCwgdGV4dCwgd2hlblRvQWRkKSB7XG4gICAgICAgIGlmICh3aGVuVG9BZGQpIHtcbiAgICAgICAgICBmaWx0ZXJMaXN0LnB1c2godGV4dCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgZnVuY3Rpb24gcXVvdGVkTGlzdChmaWx0ZXJMaXN0KSB7XG4gICAgICAgIHZhciBmaW5hbExpc3QgPSBbXTtcbiAgICAgICAgZmlsdGVyTGlzdC5mb3JFYWNoKGZ1bmN0aW9uKGl0ZW0pIHtcbiAgICAgICAgICBpZiAoaXRlbSAmJiAhXy5pc0VtcHR5KGl0ZW0pKSB7XG4gICAgICAgICAgICBmaW5hbExpc3QucHVzaCgnXCInICsgaXRlbSArICdcIicpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBmaW5hbExpc3Quam9pbihcIiwgXCIpO1xuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiBub3RCbGFuayhmaWVsZCkge1xuICAgICAgICByZXR1cm4gZmllbGQgJiYgIV8uaXNFbXB0eShmaWVsZCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBmdW5jdGlvbihzZWFyY2hQYXJhbXMpIHtcbiAgICAgICAgdmFyIGZpbHRlckxpc3QgPSBbXTtcbiAgICAgICAgYWRkRmlsdGVyKGZpbHRlckxpc3QsIHNlYXJjaFBhcmFtcy5maWx0ZXJfY2F0ZWdvcnksICEhc2VhcmNoUGFyYW1zLmZpbHRlcl9jYXRlZ29yeSk7XG4gICAgICAgIHZhciBsb2NhdGlvbiA9IFtdO1xuICAgICAgICBpZiAobm90Qmxhbmsoc2VhcmNoUGFyYW1zLmZpbHRlcl9jaXR5KSkge1xuICAgICAgICAgIGxvY2F0aW9uLnB1c2goc2VhcmNoUGFyYW1zLmZpbHRlcl9jaXR5KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobm90Qmxhbmsoc2VhcmNoUGFyYW1zLmZpbHRlcl9jb3VudHJ5KSkge1xuICAgICAgICAgIHZhciBjb3VudHJ5ID0gY291bnRyaWVzLmZpbmRCeUNvZGUoc2VhcmNoUGFyYW1zLmZpbHRlcl9jb3VudHJ5KS50ZXh0O1xuICAgICAgICAgIGlmIChjb3VudHJ5KSB7XG4gICAgICAgICAgICBsb2NhdGlvbi5wdXNoKGNvdW50cnkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAobG9jYXRpb24ubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGZpbHRlckxpc3QucHVzaChsb2NhdGlvbi5qb2luKFwiLCBcIikpO1xuICAgICAgICB9XG4gICAgICAgIGFkZEZpbHRlcihmaWx0ZXJMaXN0LCAnNTAlIC0gNzUlJywgc2VhcmNoUGFyYW1zLmZpbHRlcl9wZXJjZW50X2Z1bmRlZCA9PT0gJzUwX3RvXzc1Jyk7XG4gICAgICAgIGFkZEZpbHRlcihmaWx0ZXJMaXN0LCAnNzUlIC0gMTAwKyUnLCBzZWFyY2hQYXJhbXMuZmlsdGVyX3BlcmNlbnRfZnVuZGVkID09PSAnNzVfdG9fMTAwX3BsdXMnKTtcbiAgICAgICAgYWRkRmlsdGVyKGZpbHRlckxpc3QsIGkxOG4udCgnYWR2X3NlYXJjaC5mdW5kaW5nX29wZW4nKSwgc2VhcmNoUGFyYW1zLmZpbHRlcl9zdGF0dXMgPT09ICdvcGVuJyk7XG4gICAgICAgIGFkZEZpbHRlcihmaWx0ZXJMaXN0LCBpMThuLnQoJ2Fkdl9zZWFyY2guZnVuZGluZ19lbmRlZCcpLCBzZWFyY2hQYXJhbXMuZmlsdGVyX3N0YXR1cyA9PT0gJ2VuZGVkJyk7XG4gICAgICAgIGFkZEZpbHRlcihmaWx0ZXJMaXN0LCBpMThuLnQoJ2ZsZXhpYmxlJyksIHNlYXJjaFBhcmFtcy5maWx0ZXJfZnVuZGluZyA9PT0gJ2ZsZXhpYmxlJyk7XG4gICAgICAgIGFkZEZpbHRlcihmaWx0ZXJMaXN0LCBpMThuLnQoJ2ZpeGVkJyksIHNlYXJjaFBhcmFtcy5maWx0ZXJfZnVuZGluZyA9PT0gJ2ZpeGVkJyk7XG4gICAgICAgIGFkZEZpbHRlcihmaWx0ZXJMaXN0LCBpMThuLnQoJ3ZlcmlmaWVkX25vbnByb2ZpdCcpLCBzZWFyY2hQYXJhbXMuZmlsdGVyX25vbnByb2ZpdCA9PT0gJ25vbnByb2ZpdCcpO1xuICAgICAgICBhZGRGaWx0ZXIoZmlsdGVyTGlzdCwgaTE4bi50KCdpbl9kZW1hbmRfbGFiZWwnKSwgISFzZWFyY2hQYXJhbXMuZmlsdGVyX2ZvcmV2ZXJfZnVuZGluZ19hY3RpdmUpO1xuXG4gICAgICAgIGlmIChub3RCbGFuayhzZWFyY2hQYXJhbXMuc2VhcmNoX3RleHQpKSB7XG4gICAgICAgICAgdmFyIHF1b3RlZFRpdGxlID0gJ1wiJyArIHNlYXJjaFBhcmFtcy5zZWFyY2hfdGV4dCArICdcIic7XG4gICAgICAgICAgaWYgKGZpbHRlckxpc3QubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgcmV0dXJuIGkxOG4udCgneF9pbl9jYXRlZ29yeScsIHt4OiBxdW90ZWRUaXRsZSwgY2F0ZWdvcnk6IHF1b3RlZExpc3QoZmlsdGVyTGlzdCl9KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHF1b3RlZFRpdGxlO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAobm90Qmxhbmsoc2VhcmNoUGFyYW1zLmZpbHRlcl9xdWljaykpIHtcbiAgICAgICAgICAgIHZhciBxdWlja0tleSA9IHNlYXJjaFBhcmFtcy5maWx0ZXJfcXVpY2s7XG4gICAgICAgICAgICBpZiAocXVpY2tLZXkgPT09ICdwb3B1bGFyX2FsbCcpIHtcbiAgICAgICAgICAgICAgcXVpY2tLZXkgPSAndHJlbmRpbmcnO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZmlsdGVyTGlzdC5wdXNoKGkxOG4udChcInF1aWNrX3BpY2tfZmlsdGVycy5cIiArIHF1aWNrS2V5KSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBxdW90ZWRMaXN0KGZpbHRlckxpc3QpO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgIH1cblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIC4vYW5jaWxsYXJ5L3V0aWxzL3NlYXJjaC1leHByZXNzaW9uLWZpbHRlci5qc1xuICoqLyJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTs7QUFDQTtBQUNBOztBQUVBOztBQUpBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTs7O0FBR0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBOzs7QUE5REEiLCJzb3VyY2VSb290IjoiIn0=");

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

	eval("'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = shareBanner;\n/*@ngInject*/\nfunction shareBanner() {\n  return {\n    scope: {\n      labelText: '@',\n      labelHoverText: '@',\n      variant: '@',\n      hideLabel: '='\n    },\n    template: __webpack_require__(162),\n    restrict: 'A',\n    link: function link(scope, element, attrs) {\n      scope.xhref = '#' + attrs.icon;\n    }\n  };\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTYxLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vYW5jaWxsYXJ5L3V0aWxzL3NoYXJlLWJhbm5lci1kaXJlY3RpdmUuanM/ZDA2NCJdLCJzb3VyY2VzQ29udGVudCI6WyIvKkBuZ0luamVjdCovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBzaGFyZUJhbm5lcigpIHtcbiAgICByZXR1cm4ge1xuICAgICAgc2NvcGU6IHtcbiAgICAgICAgbGFiZWxUZXh0OiAnQCcsXG4gICAgICAgIGxhYmVsSG92ZXJUZXh0OiAnQCcsXG4gICAgICAgIHZhcmlhbnQ6ICdAJyxcbiAgICAgICAgaGlkZUxhYmVsOiAnPSdcbiAgICAgIH0sXG4gICAgICB0ZW1wbGF0ZTogcmVxdWlyZSgnLi9zaGFyZS1iYW5uZXIuaHRtbCcpLFxuICAgICAgcmVzdHJpY3Q6ICdBJyxcbiAgICAgIGxpbms6IGZ1bmN0aW9uKHNjb3BlLCBlbGVtZW50LCBhdHRycykge1xuICAgICAgICBzY29wZS54aHJlZiA9ICcjJyArIGF0dHJzLmljb247XG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogLi9hbmNpbGxhcnkvdXRpbHMvc2hhcmUtYmFubmVyLWRpcmVjdGl2ZS5qc1xuICoqLyJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBSkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7OztBQVhBIiwic291cmNlUm9vdCI6IiJ9");

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

	eval("module.exports = \"<div class=\\\"shareBanner\\\" ng-class=\\\"variant ? 'shareBanner--' + variant : null\\\">\\n  <div class=\\\"shareBanner-icon\\\">\\n    <svg><use xlink:href=\\\"{{xhref}}\\\"></use></svg>\\n  </div>\\n  <div ng-if=\\\"!hideLabel\\\" class=\\\"shareBanner-label shareBanner-label--hoverable\\\">\\n    <div class=\\\"shareBanner-labelDimple\\\">\\n      <svg><use xlink:href=\\\"#dimple\\\"></use></svg>\\n    </div>\\n    <div class=\\\"shareBanner-labelText\\\">{{labelText}}</div>\\n  </div>\\n  <div ng-if=\\\"!hideLabel\\\" class=\\\"shareBanner-label shareBanner-label--hover\\\">\\n    <div class=\\\"shareBanner-labelDimple\\\">\\n      <svg><use xlink:href=\\\"#dimple\\\"></use></svg>\\n    </div>\\n    <div class=\\\"shareBanner-labelText\\\">{{labelHoverText || labelText}}</div>\\n  </div>\\n</div>\\n\";\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTYyLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vYW5jaWxsYXJ5L3V0aWxzL3NoYXJlLWJhbm5lci5odG1sPzc1ZGQiXSwic291cmNlc0NvbnRlbnQiOlsibW9kdWxlLmV4cG9ydHMgPSBcIjxkaXYgY2xhc3M9XFxcInNoYXJlQmFubmVyXFxcIiBuZy1jbGFzcz1cXFwidmFyaWFudCA/ICdzaGFyZUJhbm5lci0tJyArIHZhcmlhbnQgOiBudWxsXFxcIj5cXG4gIDxkaXYgY2xhc3M9XFxcInNoYXJlQmFubmVyLWljb25cXFwiPlxcbiAgICA8c3ZnPjx1c2UgeGxpbms6aHJlZj1cXFwie3t4aHJlZn19XFxcIj48L3VzZT48L3N2Zz5cXG4gIDwvZGl2PlxcbiAgPGRpdiBuZy1pZj1cXFwiIWhpZGVMYWJlbFxcXCIgY2xhc3M9XFxcInNoYXJlQmFubmVyLWxhYmVsIHNoYXJlQmFubmVyLWxhYmVsLS1ob3ZlcmFibGVcXFwiPlxcbiAgICA8ZGl2IGNsYXNzPVxcXCJzaGFyZUJhbm5lci1sYWJlbERpbXBsZVxcXCI+XFxuICAgICAgPHN2Zz48dXNlIHhsaW5rOmhyZWY9XFxcIiNkaW1wbGVcXFwiPjwvdXNlPjwvc3ZnPlxcbiAgICA8L2Rpdj5cXG4gICAgPGRpdiBjbGFzcz1cXFwic2hhcmVCYW5uZXItbGFiZWxUZXh0XFxcIj57e2xhYmVsVGV4dH19PC9kaXY+XFxuICA8L2Rpdj5cXG4gIDxkaXYgbmctaWY9XFxcIiFoaWRlTGFiZWxcXFwiIGNsYXNzPVxcXCJzaGFyZUJhbm5lci1sYWJlbCBzaGFyZUJhbm5lci1sYWJlbC0taG92ZXJcXFwiPlxcbiAgICA8ZGl2IGNsYXNzPVxcXCJzaGFyZUJhbm5lci1sYWJlbERpbXBsZVxcXCI+XFxuICAgICAgPHN2Zz48dXNlIHhsaW5rOmhyZWY9XFxcIiNkaW1wbGVcXFwiPjwvdXNlPjwvc3ZnPlxcbiAgICA8L2Rpdj5cXG4gICAgPGRpdiBjbGFzcz1cXFwic2hhcmVCYW5uZXItbGFiZWxUZXh0XFxcIj57e2xhYmVsSG92ZXJUZXh0IHx8IGxhYmVsVGV4dH19PC9kaXY+XFxuICA8L2Rpdj5cXG48L2Rpdj5cXG5cIjtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vYW5jaWxsYXJ5L3V0aWxzL3NoYXJlLWJhbm5lci5odG1sXG4gKiogbW9kdWxlIGlkID0gMTYyXG4gKiogbW9kdWxlIGNodW5rcyA9IDI0XG4gKiovIl0sIm1hcHBpbmdzIjoiQUFBQSIsInNvdXJjZVJvb3QiOiIifQ==");

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

	eval("'use strict';\n\nsharedEconomicsInterestMessageNotification.$inject = [\"$timeout\", \"i18n\", \"$cookies\", \"gogoEvents\"];\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = sharedEconomicsInterestMessageNotification;\n/*@ngInject*/\nfunction sharedEconomicsInterestMessageNotification($timeout, i18n, $cookies, gogoEvents) {\n  return {\n    restrict: 'E',\n    template: __webpack_require__(164),\n    transclude: true,\n    replace: true,\n    link: function link(scope) {\n      scope.showAny = true;\n      scope.showButtons = true;\n      scope.messageHeader = i18n.t('shared_economics_interest_prompt_header');\n      scope.messageDescription = i18n.t('shared_economics_interest_prompt_description');\n\n      gogoEvents.track({\n        thetaName: 'campaign_page_shared_economics_interest_prompt',\n        gaEventCategory: 'Campaign Page',\n        gaEventAction: 'Prompt',\n        gaEventLabel: 'Shared Economics Interest'\n      });\n\n      scope.indicateSharedEconomicsInterest = function (interestValue) {\n        var charValue, intValue;\n\n        if (interestValue) {\n          scope.showButtons = false;\n          scope.messageHeader = i18n.t('shared_economics_interest_confirmation_header');\n          scope.messageDescription = i18n.t('shared_economics_interest_confirmation_description');\n          $timeout(function () {\n            scope.showAny = false;\n          }, 3000); // disappear after a delay\n          charValue = 'true';\n          intValue = 1;\n        } else {\n          scope.showAny = false; // disappear immediately\n          charValue = 'false';\n          intValue = 0;\n        }\n\n        $cookies.put('shared_economics_interest', charValue); // persist in a cookie since it's not in the db\n        gogoEvents.track({\n          thetaName: 'campaign_page_shared_economics_interest_click_' + charValue,\n          gaEventCategory: 'Campaign Page',\n          gaEventAction: 'Click',\n          gaEventLabel: 'Shared Economics Interest',\n          gaEventValue: intValue\n        });\n      };\n    }\n  };\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTYzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vYW5jaWxsYXJ5L3V0aWxzL3NoYXJlZC1lY29ub21pY3MtaW50ZXJlc3QtbWVzc2FnZS1ub3RpZmljYXRpb24tZGlyZWN0aXZlLmpzPzIyZTgiXSwic291cmNlc0NvbnRlbnQiOlsiLypAbmdJbmplY3QqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gc2hhcmVkRWNvbm9taWNzSW50ZXJlc3RNZXNzYWdlTm90aWZpY2F0aW9uKCR0aW1lb3V0LCBpMThuLCAkY29va2llcywgZ29nb0V2ZW50cykge1xuICByZXR1cm4ge1xuICAgIHJlc3RyaWN0OiAnRScsXG4gICAgdGVtcGxhdGU6IHJlcXVpcmUoJy4vc2hhcmVkLWVjb25vbWljcy1pbnRlcmVzdC1tZXNzYWdlLW5vdGlmaWNhdGlvbi5odG1sJyksXG4gICAgdHJhbnNjbHVkZTogdHJ1ZSxcbiAgICByZXBsYWNlOiB0cnVlLFxuICAgIGxpbms6IGZ1bmN0aW9uIChzY29wZSkge1xuICAgICAgc2NvcGUuc2hvd0FueSA9IHRydWU7XG4gICAgICBzY29wZS5zaG93QnV0dG9ucyA9IHRydWU7XG4gICAgICBzY29wZS5tZXNzYWdlSGVhZGVyID0gaTE4bi50KCdzaGFyZWRfZWNvbm9taWNzX2ludGVyZXN0X3Byb21wdF9oZWFkZXInKTtcbiAgICAgIHNjb3BlLm1lc3NhZ2VEZXNjcmlwdGlvbiA9IGkxOG4udCgnc2hhcmVkX2Vjb25vbWljc19pbnRlcmVzdF9wcm9tcHRfZGVzY3JpcHRpb24nKTtcblxuICAgICAgZ29nb0V2ZW50cy50cmFjayh7XG4gICAgICAgIHRoZXRhTmFtZTogJ2NhbXBhaWduX3BhZ2Vfc2hhcmVkX2Vjb25vbWljc19pbnRlcmVzdF9wcm9tcHQnLFxuICAgICAgICBnYUV2ZW50Q2F0ZWdvcnk6ICdDYW1wYWlnbiBQYWdlJyxcbiAgICAgICAgZ2FFdmVudEFjdGlvbjogJ1Byb21wdCcsXG4gICAgICAgIGdhRXZlbnRMYWJlbDogJ1NoYXJlZCBFY29ub21pY3MgSW50ZXJlc3QnXG4gICAgICB9KTtcblxuICAgICAgc2NvcGUuaW5kaWNhdGVTaGFyZWRFY29ub21pY3NJbnRlcmVzdCA9IGZ1bmN0aW9uIChpbnRlcmVzdFZhbHVlKSB7XG4gICAgICAgIHZhciBjaGFyVmFsdWUsIGludFZhbHVlO1xuXG4gICAgICAgIGlmIChpbnRlcmVzdFZhbHVlKSB7XG4gICAgICAgICAgc2NvcGUuc2hvd0J1dHRvbnMgPSBmYWxzZTtcbiAgICAgICAgICBzY29wZS5tZXNzYWdlSGVhZGVyID0gaTE4bi50KCdzaGFyZWRfZWNvbm9taWNzX2ludGVyZXN0X2NvbmZpcm1hdGlvbl9oZWFkZXInKTtcbiAgICAgICAgICBzY29wZS5tZXNzYWdlRGVzY3JpcHRpb24gPSBpMThuLnQoJ3NoYXJlZF9lY29ub21pY3NfaW50ZXJlc3RfY29uZmlybWF0aW9uX2Rlc2NyaXB0aW9uJyk7XG4gICAgICAgICAgJHRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgc2NvcGUuc2hvd0FueSA9IGZhbHNlO1xuICAgICAgICAgIH0sIDMwMDApOyAvLyBkaXNhcHBlYXIgYWZ0ZXIgYSBkZWxheVxuICAgICAgICAgIGNoYXJWYWx1ZSA9ICd0cnVlJztcbiAgICAgICAgICBpbnRWYWx1ZSA9IDE7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc2NvcGUuc2hvd0FueSA9IGZhbHNlOyAvLyBkaXNhcHBlYXIgaW1tZWRpYXRlbHlcbiAgICAgICAgICBjaGFyVmFsdWUgPSAnZmFsc2UnO1xuICAgICAgICAgIGludFZhbHVlID0gMDtcbiAgICAgICAgfVxuXG4gICAgICAgICRjb29raWVzLnB1dCgnc2hhcmVkX2Vjb25vbWljc19pbnRlcmVzdCcsIGNoYXJWYWx1ZSk7IC8vIHBlcnNpc3QgaW4gYSBjb29raWUgc2luY2UgaXQncyBub3QgaW4gdGhlIGRiXG4gICAgICAgIGdvZ29FdmVudHMudHJhY2soe1xuICAgICAgICAgIHRoZXRhTmFtZTogJ2NhbXBhaWduX3BhZ2Vfc2hhcmVkX2Vjb25vbWljc19pbnRlcmVzdF9jbGlja18nICsgY2hhclZhbHVlLFxuICAgICAgICAgIGdhRXZlbnRDYXRlZ29yeTogJ0NhbXBhaWduIFBhZ2UnLFxuICAgICAgICAgIGdhRXZlbnRBY3Rpb246ICdDbGljaycsXG4gICAgICAgICAgZ2FFdmVudExhYmVsOiAnU2hhcmVkIEVjb25vbWljcyBJbnRlcmVzdCcsXG4gICAgICAgICAgZ2FFdmVudFZhbHVlOiBpbnRWYWx1ZVxuICAgICAgICB9KTtcbiAgICAgIH07XG4gICAgfVxuICB9O1xufVxuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogLi9hbmNpbGxhcnkvdXRpbHMvc2hhcmVkLWVjb25vbWljcy1pbnRlcmVzdC1tZXNzYWdlLW5vdGlmaWNhdGlvbi1kaXJlY3RpdmUuanNcbiAqKi8iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7O0FBQ0E7QUFDQTs7QUFFQTs7QUFKQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQU5BO0FBUUE7QUFDQTtBQUNBO0FBREE7QUFHQTs7O0FBR0E7QUFsQkE7QUFvQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7QUEzQ0EiLCJzb3VyY2VSb290IjoiIn0=");

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

	eval("module.exports = \"<div>\\n  <div class=\\\"messageNotification messageNotification--info messageNotification--raised messageNotification--fixedHeight\\\">\\n    <div class=\\\"container\\\">\\n      <div class=\\\"col-md-12\\\">\\n        <div class=\\\"messageNotification-header\\\">{{messageHeader}}</div>\\n        {{messageDescription}}\\n        <div class=\\\"messageNotification-buttons\\\" ng-show=\\\"showButtons\\\">\\n          <button id=\\\"enable-shared-economics-interest-yes\\\" ng-click=\\\"indicateSharedEconomicsInterest(true)\\\" class=\\\"cta-4 cta-4--small cta-4--purple\\\">{{::i18n.t('shared_economics_interest_prompt_yes')}}</button> <button id=\\\"enable-shared-economics-interest-no\\\" ng-click=\\\"indicateSharedEconomicsInterest(false)\\\" class=\\\"cta-4 cta-4-secondary cta-4-secondary--small cta-4-secondary--purple\\\">{{::i18n.t('shared_economics_interest_prompt_no')}}</button>\\n        </div>\\n      </div>\\n    </div>\\n  </div>\\n</div>\\n\";\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTY0LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vYW5jaWxsYXJ5L3V0aWxzL3NoYXJlZC1lY29ub21pY3MtaW50ZXJlc3QtbWVzc2FnZS1ub3RpZmljYXRpb24uaHRtbD9lMDcyIl0sInNvdXJjZXNDb250ZW50IjpbIm1vZHVsZS5leHBvcnRzID0gXCI8ZGl2PlxcbiAgPGRpdiBjbGFzcz1cXFwibWVzc2FnZU5vdGlmaWNhdGlvbiBtZXNzYWdlTm90aWZpY2F0aW9uLS1pbmZvIG1lc3NhZ2VOb3RpZmljYXRpb24tLXJhaXNlZCBtZXNzYWdlTm90aWZpY2F0aW9uLS1maXhlZEhlaWdodFxcXCI+XFxuICAgIDxkaXYgY2xhc3M9XFxcImNvbnRhaW5lclxcXCI+XFxuICAgICAgPGRpdiBjbGFzcz1cXFwiY29sLW1kLTEyXFxcIj5cXG4gICAgICAgIDxkaXYgY2xhc3M9XFxcIm1lc3NhZ2VOb3RpZmljYXRpb24taGVhZGVyXFxcIj57e21lc3NhZ2VIZWFkZXJ9fTwvZGl2PlxcbiAgICAgICAge3ttZXNzYWdlRGVzY3JpcHRpb259fVxcbiAgICAgICAgPGRpdiBjbGFzcz1cXFwibWVzc2FnZU5vdGlmaWNhdGlvbi1idXR0b25zXFxcIiBuZy1zaG93PVxcXCJzaG93QnV0dG9uc1xcXCI+XFxuICAgICAgICAgIDxidXR0b24gaWQ9XFxcImVuYWJsZS1zaGFyZWQtZWNvbm9taWNzLWludGVyZXN0LXllc1xcXCIgbmctY2xpY2s9XFxcImluZGljYXRlU2hhcmVkRWNvbm9taWNzSW50ZXJlc3QodHJ1ZSlcXFwiIGNsYXNzPVxcXCJjdGEtNCBjdGEtNC0tc21hbGwgY3RhLTQtLXB1cnBsZVxcXCI+e3s6OmkxOG4udCgnc2hhcmVkX2Vjb25vbWljc19pbnRlcmVzdF9wcm9tcHRfeWVzJyl9fTwvYnV0dG9uPiA8YnV0dG9uIGlkPVxcXCJlbmFibGUtc2hhcmVkLWVjb25vbWljcy1pbnRlcmVzdC1ub1xcXCIgbmctY2xpY2s9XFxcImluZGljYXRlU2hhcmVkRWNvbm9taWNzSW50ZXJlc3QoZmFsc2UpXFxcIiBjbGFzcz1cXFwiY3RhLTQgY3RhLTQtc2Vjb25kYXJ5IGN0YS00LXNlY29uZGFyeS0tc21hbGwgY3RhLTQtc2Vjb25kYXJ5LS1wdXJwbGVcXFwiPnt7OjppMThuLnQoJ3NoYXJlZF9lY29ub21pY3NfaW50ZXJlc3RfcHJvbXB0X25vJyl9fTwvYnV0dG9uPlxcbiAgICAgICAgPC9kaXY+XFxuICAgICAgPC9kaXY+XFxuICAgIDwvZGl2PlxcbiAgPC9kaXY+XFxuPC9kaXY+XFxuXCI7XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL2FuY2lsbGFyeS91dGlscy9zaGFyZWQtZWNvbm9taWNzLWludGVyZXN0LW1lc3NhZ2Utbm90aWZpY2F0aW9uLmh0bWxcbiAqKiBtb2R1bGUgaWQgPSAxNjRcbiAqKiBtb2R1bGUgY2h1bmtzID0gMjRcbiAqKi8iXSwibWFwcGluZ3MiOiJBQUFBIiwic291cmNlUm9vdCI6IiJ9");

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

	eval("'use strict';\n\nshippingInfo.$inject = [\"countriesService\", \"regions\"];\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = shippingInfo;\n/*@ngInject*/\nfunction shippingInfo(countriesService, regions) {\n  return {\n    restrict: 'E',\n    scope: {\n      shipping: '='\n    },\n    template: __webpack_require__(166),\n    link: function link(scope, element, attrs, nullController) {\n      scope.countries = countriesService;\n      scope.regions = regions;\n    }\n  };\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTY1LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vYW5jaWxsYXJ5L3V0aWxzL3NoaXBwaW5nLWluZm8tZGlyZWN0aXZlLmpzP2VjMWMiXSwic291cmNlc0NvbnRlbnQiOlsiLypAbmdJbmplY3QqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gc2hpcHBpbmdJbmZvKGNvdW50cmllc1NlcnZpY2UsIHJlZ2lvbnMpIHtcbiAgICByZXR1cm4ge1xuICAgICAgcmVzdHJpY3Q6ICdFJyxcbiAgICAgIHNjb3BlOiB7XG4gICAgICAgIHNoaXBwaW5nOiAnPSdcbiAgICAgIH0sXG4gICAgICB0ZW1wbGF0ZTogcmVxdWlyZSgnLi9zaGlwcGluZy1pbmZvLWRpcmVjdGl2ZS5odG1sJyksXG4gICAgICBsaW5rOiBmdW5jdGlvbihzY29wZSwgZWxlbWVudCwgYXR0cnMsIG51bGxDb250cm9sbGVyKSB7XG4gICAgICAgIHNjb3BlLmNvdW50cmllcyA9IGNvdW50cmllc1NlcnZpY2U7XG4gICAgICAgIHNjb3BlLnJlZ2lvbnMgPSByZWdpb25zO1xuICAgICAgfVxuICAgIH07XG4gIH1cblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIC4vYW5jaWxsYXJ5L3V0aWxzL3NoaXBwaW5nLWluZm8tZGlyZWN0aXZlLmpzXG4gKiovIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBOztBQUNBO0FBQ0E7O0FBRUE7O0FBSkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7O0FBVEEiLCJzb3VyY2VSb290IjoiIn0=");

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

	eval("module.exports = \"<span>{{shipping.name}}</span><br />\\n<span> {{shipping.address}}</span> <br />\\n<span ng-if=\\\"shipping.address2\\\"> {{shipping.address2}}<br /></span>\\n<span>{{shipping.city}}</span><span ng-if=\\\"shipping.state\\\">, {{regions.byTwoLetterCode(shipping.state).two_letter}}</span> <span>{{shipping.zipcode}}</span><br />\\n<span>{{countries.findByTwoLetterCode(shipping.country).text}}</span>\\n\";\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTY2LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vYW5jaWxsYXJ5L3V0aWxzL3NoaXBwaW5nLWluZm8tZGlyZWN0aXZlLmh0bWw/OTg0ZSJdLCJzb3VyY2VzQ29udGVudCI6WyJtb2R1bGUuZXhwb3J0cyA9IFwiPHNwYW4+e3tzaGlwcGluZy5uYW1lfX08L3NwYW4+PGJyIC8+XFxuPHNwYW4+IHt7c2hpcHBpbmcuYWRkcmVzc319PC9zcGFuPiA8YnIgLz5cXG48c3BhbiBuZy1pZj1cXFwic2hpcHBpbmcuYWRkcmVzczJcXFwiPiB7e3NoaXBwaW5nLmFkZHJlc3MyfX08YnIgLz48L3NwYW4+XFxuPHNwYW4+e3tzaGlwcGluZy5jaXR5fX08L3NwYW4+PHNwYW4gbmctaWY9XFxcInNoaXBwaW5nLnN0YXRlXFxcIj4sIHt7cmVnaW9ucy5ieVR3b0xldHRlckNvZGUoc2hpcHBpbmcuc3RhdGUpLnR3b19sZXR0ZXJ9fTwvc3Bhbj4gPHNwYW4+e3tzaGlwcGluZy56aXBjb2RlfX08L3NwYW4+PGJyIC8+XFxuPHNwYW4+e3tjb3VudHJpZXMuZmluZEJ5VHdvTGV0dGVyQ29kZShzaGlwcGluZy5jb3VudHJ5KS50ZXh0fX08L3NwYW4+XFxuXCI7XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL2FuY2lsbGFyeS91dGlscy9zaGlwcGluZy1pbmZvLWRpcmVjdGl2ZS5odG1sXG4gKiogbW9kdWxlIGlkID0gMTY2XG4gKiogbW9kdWxlIGNodW5rcyA9IDI0XG4gKiovIl0sIm1hcHBpbmdzIjoiQUFBQSIsInNvdXJjZVJvb3QiOiIifQ==");

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

	eval("'use strict';\n\nsignup.$inject = [\"i18n\", \"gon\", \"$sce\", \"$http\", \"embeddableLinkHtml\"];\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol ? \"symbol\" : typeof obj; };\n\nexports.default = signup;\n/*@ngInject*/\nfunction signup(i18n, gon, $sce, $http, embeddableLinkHtml) {\n  function safeBasicSignupParams(account) {\n    var params = {\n      timestamp: gon.negative_captcha.timestamp,\n      spinner: gon.negative_captcha.spinner,\n      email: null,\n      password: null\n    };\n    params[gon.negative_captcha.fields.email] = account.email;\n    params[gon.negative_captcha.fields.password] = account.password;\n    return params;\n  }\n\n  return {\n    submitSignup: function submitSignup(account, domainCode) {\n      var params = safeBasicSignupParams(account);\n      params.domain_code = domainCode;\n      params.account = {\n        firstname: account.firstname,\n        lastname: account.lastname,\n        general_opt_in: account.general_opt_in\n      };\n      return $http.post(gon.session_modal.signup_url, params);\n    },\n    termsHtml: function termsHtml(sentenceKey) {\n      if (!gon.session_modal) {\n        return null;\n      }\n      var rawText = i18n.t(sentenceKey, {\n        terms_of_service_url: embeddableLinkHtml(i18n.t('content_for_title.terms_of_use'), gon.session_modal.terms_url),\n        privacy_policy_link: embeddableLinkHtml(i18n.t('content_for_title.privacy_policy'), gon.session_modal.privacy_policy_url)\n      });\n      if ((typeof rawText === 'undefined' ? 'undefined' : _typeof(rawText)) === 'object') {\n        return rawText;\n      } else {\n        return $sce.trustAsHtml(rawText);\n      }\n    }\n  };\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTY3LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vYW5jaWxsYXJ5L3V0aWxzL3NpZ251cC1mYWN0b3J5LmpzPzdiNTIiXSwic291cmNlc0NvbnRlbnQiOlsiLypAbmdJbmplY3QqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gc2lnbnVwKGkxOG4sIGdvbiwgJHNjZSwgJGh0dHAsIGVtYmVkZGFibGVMaW5rSHRtbCkge1xuICAgIGZ1bmN0aW9uIHNhZmVCYXNpY1NpZ251cFBhcmFtcyhhY2NvdW50KSB7XG4gICAgICB2YXIgcGFyYW1zID0ge1xuICAgICAgICB0aW1lc3RhbXA6IGdvbi5uZWdhdGl2ZV9jYXB0Y2hhLnRpbWVzdGFtcCxcbiAgICAgICAgc3Bpbm5lcjogZ29uLm5lZ2F0aXZlX2NhcHRjaGEuc3Bpbm5lcixcbiAgICAgICAgZW1haWw6IG51bGwsXG4gICAgICAgIHBhc3N3b3JkOiBudWxsXG4gICAgICB9O1xuICAgICAgcGFyYW1zW2dvbi5uZWdhdGl2ZV9jYXB0Y2hhLmZpZWxkcy5lbWFpbF0gPSBhY2NvdW50LmVtYWlsO1xuICAgICAgcGFyYW1zW2dvbi5uZWdhdGl2ZV9jYXB0Y2hhLmZpZWxkcy5wYXNzd29yZF0gPSBhY2NvdW50LnBhc3N3b3JkO1xuICAgICAgcmV0dXJuIHBhcmFtcztcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgc3VibWl0U2lnbnVwOiBmdW5jdGlvbihhY2NvdW50LCBkb21haW5Db2RlKSB7XG4gICAgICAgIHZhciBwYXJhbXMgPSBzYWZlQmFzaWNTaWdudXBQYXJhbXMoYWNjb3VudCk7XG4gICAgICAgIHBhcmFtcy5kb21haW5fY29kZSA9IGRvbWFpbkNvZGU7XG4gICAgICAgIHBhcmFtcy5hY2NvdW50ID0ge1xuICAgICAgICAgIGZpcnN0bmFtZTogYWNjb3VudC5maXJzdG5hbWUsXG4gICAgICAgICAgbGFzdG5hbWU6IGFjY291bnQubGFzdG5hbWUsXG4gICAgICAgICAgZ2VuZXJhbF9vcHRfaW46IGFjY291bnQuZ2VuZXJhbF9vcHRfaW5cbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuICRodHRwLnBvc3QoZ29uLnNlc3Npb25fbW9kYWwuc2lnbnVwX3VybCwgcGFyYW1zKTtcbiAgICAgIH0sXG4gICAgICB0ZXJtc0h0bWw6IGZ1bmN0aW9uIChzZW50ZW5jZUtleSkge1xuICAgICAgICBpZiAoIWdvbi5zZXNzaW9uX21vZGFsKSB7XG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHJhd1RleHQgPSBpMThuLnQoc2VudGVuY2VLZXksIHtcbiAgICAgICAgICB0ZXJtc19vZl9zZXJ2aWNlX3VybDogZW1iZWRkYWJsZUxpbmtIdG1sKGkxOG4udCgnY29udGVudF9mb3JfdGl0bGUudGVybXNfb2ZfdXNlJyksIGdvbi5zZXNzaW9uX21vZGFsLnRlcm1zX3VybCksXG4gICAgICAgICAgcHJpdmFjeV9wb2xpY3lfbGluazogZW1iZWRkYWJsZUxpbmtIdG1sKGkxOG4udCgnY29udGVudF9mb3JfdGl0bGUucHJpdmFjeV9wb2xpY3knKSwgZ29uLnNlc3Npb25fbW9kYWwucHJpdmFjeV9wb2xpY3lfdXJsKVxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKHR5cGVvZihyYXdUZXh0KSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICByZXR1cm4gcmF3VGV4dDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gJHNjZS50cnVzdEFzSHRtbChyYXdUZXh0KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG4gIH1cblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIC4vYW5jaWxsYXJ5L3V0aWxzL3NpZ251cC1mYWN0b3J5LmpzXG4gKiovIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBOztBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTs7QUFQQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7OztBQW5DQSIsInNvdXJjZVJvb3QiOiIifQ==");

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

	eval("'use strict';\n\nsimpleImageUpload.$inject = [\"cloudinary\", \"$http\", \"i18n\"];\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = simpleImageUpload;\n/*@ngInject*/\nfunction simpleImageUpload(cloudinary, $http, i18n) {\n  return {\n    restrict: 'A',\n    scope: {\n      imagePublicId: '@',\n      updateImagePath: '@',\n      placeholderPath: '@',\n      attr: '@',\n      width: '@',\n      height: '@',\n      crop: '@'\n    },\n    template: __webpack_require__(169),\n    link: function link(scope, element) {\n      scope.i18n = i18n;\n      var fileInput = element.find(\"input\");\n      scope.status = { loading: false, publicId: scope.imagePublicId };\n\n      function setupFileUpload() {\n        var fileUploader = cloudinary.forFileInput(fileInput, element);\n\n        fileUploader.onUploadStart(function () {\n          scope.status.loading = true;\n        }).onUploadComplete(function (result) {\n          scope.status.loading = false;\n          scope.status.publicId = result.public_id;\n          scope.$apply();\n          var data = { image_params: result };\n          if (scope.attr) {\n            data.attr = scope.attr;\n          }\n          $http.post(scope.updateImagePath, data);\n          fileInput = element.find(\"input\");\n        }).onUploadFail(function () {\n          scope.status.loading = false;\n          fileInput = element.find(\"input\");\n        });\n      }\n      setupFileUpload();\n\n      scope.clickPhoto = function () {\n        fileInput.trigger('click');\n      };\n    }\n  };\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTY4LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vYW5jaWxsYXJ5L3V0aWxzL3NpbXBsZS1pbWFnZS11cGxvYWQtZGlyZWN0aXZlLmpzPzg1ZTMiXSwic291cmNlc0NvbnRlbnQiOlsiLypAbmdJbmplY3QqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gc2ltcGxlSW1hZ2VVcGxvYWQoY2xvdWRpbmFyeSwgJGh0dHAsIGkxOG4pIHtcbiAgICByZXR1cm4ge1xuICAgICAgcmVzdHJpY3Q6ICdBJyxcbiAgICAgIHNjb3BlOiB7XG4gICAgICAgIGltYWdlUHVibGljSWQ6ICdAJyxcbiAgICAgICAgdXBkYXRlSW1hZ2VQYXRoOiAnQCcsXG4gICAgICAgIHBsYWNlaG9sZGVyUGF0aDogJ0AnLFxuICAgICAgICBhdHRyOiAnQCcsXG4gICAgICAgIHdpZHRoOiAnQCcsXG4gICAgICAgIGhlaWdodDogJ0AnLFxuICAgICAgICBjcm9wOiAnQCdcbiAgICAgIH0sXG4gICAgICB0ZW1wbGF0ZTogcmVxdWlyZSgnLi9zaW1wbGUtaW1hZ2UtdXBsb2FkLmh0bWwnKSxcbiAgICAgIGxpbms6IGZ1bmN0aW9uKHNjb3BlLCBlbGVtZW50KSB7XG4gICAgICAgIHNjb3BlLmkxOG4gPSBpMThuO1xuICAgICAgICB2YXIgZmlsZUlucHV0ID0gZWxlbWVudC5maW5kKFwiaW5wdXRcIik7XG4gICAgICAgIHNjb3BlLnN0YXR1cyA9IHtsb2FkaW5nOiBmYWxzZSwgcHVibGljSWQ6IHNjb3BlLmltYWdlUHVibGljSWR9O1xuXG4gICAgICAgIGZ1bmN0aW9uIHNldHVwRmlsZVVwbG9hZCgpIHtcbiAgICAgICAgICB2YXIgZmlsZVVwbG9hZGVyID0gY2xvdWRpbmFyeS5mb3JGaWxlSW5wdXQoZmlsZUlucHV0LCBlbGVtZW50KTtcblxuICAgICAgICAgIGZpbGVVcGxvYWRlci5vblVwbG9hZFN0YXJ0KGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgc2NvcGUuc3RhdHVzLmxvYWRpbmcgPSB0cnVlO1xuICAgICAgICAgIH0pLm9uVXBsb2FkQ29tcGxldGUoZnVuY3Rpb24ocmVzdWx0KSB7XG4gICAgICAgICAgICBzY29wZS5zdGF0dXMubG9hZGluZyA9IGZhbHNlO1xuICAgICAgICAgICAgc2NvcGUuc3RhdHVzLnB1YmxpY0lkID0gcmVzdWx0LnB1YmxpY19pZDtcbiAgICAgICAgICAgIHNjb3BlLiRhcHBseSgpO1xuICAgICAgICAgICAgdmFyIGRhdGEgPSB7aW1hZ2VfcGFyYW1zOiByZXN1bHR9O1xuICAgICAgICAgICAgaWYgKHNjb3BlLmF0dHIpIHtcbiAgICAgICAgICAgICAgZGF0YS5hdHRyID0gc2NvcGUuYXR0cjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgICRodHRwLnBvc3Qoc2NvcGUudXBkYXRlSW1hZ2VQYXRoLCBkYXRhKTtcbiAgICAgICAgICAgIGZpbGVJbnB1dCA9IGVsZW1lbnQuZmluZChcImlucHV0XCIpO1xuICAgICAgICAgIH0pLm9uVXBsb2FkRmFpbChmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHNjb3BlLnN0YXR1cy5sb2FkaW5nID0gZmFsc2U7XG4gICAgICAgICAgICBmaWxlSW5wdXQgPSBlbGVtZW50LmZpbmQoXCJpbnB1dFwiKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBzZXR1cEZpbGVVcGxvYWQoKTtcblxuICAgICAgICBzY29wZS5jbGlja1Bob3RvID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgZmlsZUlucHV0LnRyaWdnZXIoJ2NsaWNrJyk7XG4gICAgICAgIH07XG4gICAgICB9XG4gIH07XG59XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiAuL2FuY2lsbGFyeS91dGlscy9zaW1wbGUtaW1hZ2UtdXBsb2FkLWRpcmVjdGl2ZS5qc1xuICoqLyJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTs7QUFDQTtBQUNBOztBQUVBOztBQUpBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBOzs7O0FBekNBIiwic291cmNlUm9vdCI6IiJ9");

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

	eval("module.exports = \"<div class=\\\"i-cloudinaryUploader-image\\\" ng-click=\\\"clickPhoto()\\\">\\n  <img ng-if=\\\"placeholderPath && !status.publicId\\\" ng-src=\\\"{{placeholderPath}}\\\" width=\\\"{{width}}\\\" height=\\\"{{height}}\\\" />\\n  <img ng-if=\\\"status.publicId\\\" cl-image width=\\\"{{width}}\\\" height=\\\"{{height}}\\\" crop=\\\"{{crop}}\\\" public-id=\\\"status.publicId\\\" />\\n  <div ng-if=\\\"!placeholderPath && !status.publicId\\\" class=\\\"i-cloudinaryUploader-placeholder\\\" ng-style=\\\"{width: width + 'px', height: height + 'px'}\\\"></div>\\n  <i class=\\\"i-fa-centered i-fa-gogenta fa fa-spinner fa-4x fa-spin\\\" ng-show=\\\"status.loading\\\"></i>\\n</div><input type=\\\"file\\\" name=\\\"file\\\" class=\\\"i-hide-offscreen\\\" data-cloudinary-field=\\\"image_id\\\" />\\n<button type=\\\"button\\\" ng-click=\\\"clickPhoto()\\\" class=\\\"i-cta-1 i-cloudinaryUploader-button\\\">\\n  <span ng-if=\\\"status.publicId\\\">{{::i18n.t('change_image')}}</span>\\n  <span ng-if=\\\"!status.publicId\\\">{{::i18n.t('add_image')}}</span>\\n</button>\\n\";\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTY5LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vYW5jaWxsYXJ5L3V0aWxzL3NpbXBsZS1pbWFnZS11cGxvYWQuaHRtbD9iZjExIl0sInNvdXJjZXNDb250ZW50IjpbIm1vZHVsZS5leHBvcnRzID0gXCI8ZGl2IGNsYXNzPVxcXCJpLWNsb3VkaW5hcnlVcGxvYWRlci1pbWFnZVxcXCIgbmctY2xpY2s9XFxcImNsaWNrUGhvdG8oKVxcXCI+XFxuICA8aW1nIG5nLWlmPVxcXCJwbGFjZWhvbGRlclBhdGggJiYgIXN0YXR1cy5wdWJsaWNJZFxcXCIgbmctc3JjPVxcXCJ7e3BsYWNlaG9sZGVyUGF0aH19XFxcIiB3aWR0aD1cXFwie3t3aWR0aH19XFxcIiBoZWlnaHQ9XFxcInt7aGVpZ2h0fX1cXFwiIC8+XFxuICA8aW1nIG5nLWlmPVxcXCJzdGF0dXMucHVibGljSWRcXFwiIGNsLWltYWdlIHdpZHRoPVxcXCJ7e3dpZHRofX1cXFwiIGhlaWdodD1cXFwie3toZWlnaHR9fVxcXCIgY3JvcD1cXFwie3tjcm9wfX1cXFwiIHB1YmxpYy1pZD1cXFwic3RhdHVzLnB1YmxpY0lkXFxcIiAvPlxcbiAgPGRpdiBuZy1pZj1cXFwiIXBsYWNlaG9sZGVyUGF0aCAmJiAhc3RhdHVzLnB1YmxpY0lkXFxcIiBjbGFzcz1cXFwiaS1jbG91ZGluYXJ5VXBsb2FkZXItcGxhY2Vob2xkZXJcXFwiIG5nLXN0eWxlPVxcXCJ7d2lkdGg6IHdpZHRoICsgJ3B4JywgaGVpZ2h0OiBoZWlnaHQgKyAncHgnfVxcXCI+PC9kaXY+XFxuICA8aSBjbGFzcz1cXFwiaS1mYS1jZW50ZXJlZCBpLWZhLWdvZ2VudGEgZmEgZmEtc3Bpbm5lciBmYS00eCBmYS1zcGluXFxcIiBuZy1zaG93PVxcXCJzdGF0dXMubG9hZGluZ1xcXCI+PC9pPlxcbjwvZGl2PjxpbnB1dCB0eXBlPVxcXCJmaWxlXFxcIiBuYW1lPVxcXCJmaWxlXFxcIiBjbGFzcz1cXFwiaS1oaWRlLW9mZnNjcmVlblxcXCIgZGF0YS1jbG91ZGluYXJ5LWZpZWxkPVxcXCJpbWFnZV9pZFxcXCIgLz5cXG48YnV0dG9uIHR5cGU9XFxcImJ1dHRvblxcXCIgbmctY2xpY2s9XFxcImNsaWNrUGhvdG8oKVxcXCIgY2xhc3M9XFxcImktY3RhLTEgaS1jbG91ZGluYXJ5VXBsb2FkZXItYnV0dG9uXFxcIj5cXG4gIDxzcGFuIG5nLWlmPVxcXCJzdGF0dXMucHVibGljSWRcXFwiPnt7OjppMThuLnQoJ2NoYW5nZV9pbWFnZScpfX08L3NwYW4+XFxuICA8c3BhbiBuZy1pZj1cXFwiIXN0YXR1cy5wdWJsaWNJZFxcXCI+e3s6OmkxOG4udCgnYWRkX2ltYWdlJyl9fTwvc3Bhbj5cXG48L2J1dHRvbj5cXG5cIjtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vYW5jaWxsYXJ5L3V0aWxzL3NpbXBsZS1pbWFnZS11cGxvYWQuaHRtbFxuICoqIG1vZHVsZSBpZCA9IDE2OVxuICoqIG1vZHVsZSBjaHVua3MgPSAyNFxuICoqLyJdLCJtYXBwaW5ncyI6IkFBQUEiLCJzb3VyY2VSb290IjoiIn0=");

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

	eval("'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nexports.default = function (split) {\n  return {\n    /*@ngInject*/\n    scope: {\n      experiment: '@',\n      variant: '@',\n      variants: '='\n    },\n    transclude: true,\n    template: '<div ng-transclude ng-if=\"variantActive\"></div>',\n    link: function link($scope) {\n      $scope.variantActive = false;\n      var variants;\n      if ($scope.variant) {\n        variants = [$scope.variant];\n      } else if ($scope.variants) {\n        variants = $scope.variants;\n      }\n      $scope.$watch(function () {\n        return split.checkVariantState($scope.experiment);\n      }, function (state) {\n        $scope.variantActive = _.includes(variants, state);\n      });\n    }\n  };\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTcwLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vYW5jaWxsYXJ5L3V0aWxzL3NwbGl0LWRpcmVjdGl2ZS5qcz8wNTA1Il0sInNvdXJjZXNDb250ZW50IjpbIi8qQG5nSW5qZWN0Ki9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIChzcGxpdCkge1xuICByZXR1cm4ge1xuICAgIC8qQG5nSW5qZWN0Ki9cbiAgICBzY29wZToge1xuICAgICAgZXhwZXJpbWVudDogJ0AnLFxuICAgICAgdmFyaWFudDogJ0AnLFxuICAgICAgdmFyaWFudHM6ICc9J1xuICAgIH0sXG4gICAgdHJhbnNjbHVkZTogdHJ1ZSxcbiAgICB0ZW1wbGF0ZTogJzxkaXYgbmctdHJhbnNjbHVkZSBuZy1pZj1cInZhcmlhbnRBY3RpdmVcIj48L2Rpdj4nLFxuICAgIGxpbms6IGZ1bmN0aW9uKCRzY29wZSkge1xuICAgICAgJHNjb3BlLnZhcmlhbnRBY3RpdmUgPSBmYWxzZTtcbiAgICAgIHZhciB2YXJpYW50cztcbiAgICAgIGlmICgkc2NvcGUudmFyaWFudCkge1xuICAgICAgICB2YXJpYW50cyA9IFskc2NvcGUudmFyaWFudF07XG4gICAgICB9IGVsc2UgaWYgKCRzY29wZS52YXJpYW50cykge1xuICAgICAgICB2YXJpYW50cyA9ICRzY29wZS52YXJpYW50cztcbiAgICAgIH1cbiAgICAgICRzY29wZS4kd2F0Y2goZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiBzcGxpdC5jaGVja1ZhcmlhbnRTdGF0ZSgkc2NvcGUuZXhwZXJpbWVudCk7XG4gICAgICB9LCBmdW5jdGlvbihzdGF0ZSkge1xuICAgICAgICAkc2NvcGUudmFyaWFudEFjdGl2ZSA9IF8uaW5jbHVkZXModmFyaWFudHMsIHN0YXRlKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfTtcbn1cblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIC4vYW5jaWxsYXJ5L3V0aWxzL3NwbGl0LWRpcmVjdGl2ZS5qc1xuICoqLyJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBSkE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOzs7O0FBckJBIiwic291cmNlUm9vdCI6IiJ9");

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

	eval("'use strict';\n\nsplit.$inject = [\"$http\", \"$q\"];\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = split;\n\nvar _privateApi = __webpack_require__(172);\n\n/*@ngInject*/\nfunction split($http, $q) {\n  var service = {\n    experimentBuckets: {},\n    appVersion: \"\"\n  };\n\n  service.checkVariantState = function (name) {\n    if (!service.experimentBuckets[name]) {\n      service.experimentBuckets[name] = '$loading';\n      $http.put((0, _privateApi.privateApiExperimentsFetchAndUpdatePath)(), { name: name }).then(function (_response_) {\n        if (!_response_.data.response) {\n          return $q.reject();\n        }\n        var response = _response_.data.response;\n        return { buckets: response.buckets, app_version: response.app_version };\n      }).then(function (response) {\n        service.experimentBuckets = _.merge(service.experimentBuckets, response.buckets);\n        service.appVersion = response.app_version;\n      }).catch(function (error) {\n        service.experimentBuckets[name] = 'control';\n      });\n    }\n    return service.experimentBuckets[name];\n  };\n\n  service.variantStatePromise = function (name) {\n    var deferred = $q.defer();\n    var variant = service.experimentBuckets[name];\n    if (!variant || variant === '$loading') {\n      service.fetchVariantState(name).then(function (fetchedVariant) {\n        deferred.resolve(fetchedVariant);\n      });\n    } else {\n      deferred.resolve(variant);\n    }\n    return deferred.promise;\n  };\n\n  service.fetchVariantState = function (name) {\n    return $http.put((0, _privateApi.privateApiExperimentsFetchAndUpdatePath)(), { name: name }).then(function (response) {\n      var buckets = response.data.response.buckets;\n      return buckets[name];\n    });\n  };\n\n  service.getVariantState = function (name) {\n    return $http.get((0, _privateApi.privateApiExperimentPath)({ id: name })).then(function (response) {\n      return response.data.response.bucket;\n    });\n  };\n\n  function projectVariant(name, projectId) {\n    return $http({\n      url: (0, _privateApi.splitBucketPrivateApiCampaignPath)({ id: projectId }),\n      method: 'GET',\n      params: { name: name }\n    });\n  }\n  service.projectVariant = projectVariant;\n\n  return service;\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTcxLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vYW5jaWxsYXJ5L3V0aWxzL3NwbGl0LWZhY3RvcnkuanM/YTMyZCIsIndlYnBhY2s6Ly8vP2Q0MWQiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgcHJpdmF0ZUFwaUV4cGVyaW1lbnRQYXRoLFxuICBwcml2YXRlQXBpRXhwZXJpbWVudHNGZXRjaEFuZFVwZGF0ZVBhdGgsXG4gIHNwbGl0QnVja2V0UHJpdmF0ZUFwaUNhbXBhaWduUGF0aFxufSBmcm9tICdyb3V0ZXMvcHJpdmF0ZS1hcGkudHMnO1xuXG4vKkBuZ0luamVjdCovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBzcGxpdCgkaHR0cCwgJHEpIHtcbiAgbGV0IHNlcnZpY2UgPSB7XG4gICAgZXhwZXJpbWVudEJ1Y2tldHM6IHt9LFxuICAgIGFwcFZlcnNpb246IFwiXCJcbiAgfTtcblxuICBzZXJ2aWNlLmNoZWNrVmFyaWFudFN0YXRlID0gKG5hbWUpID0+IHtcbiAgICBpZiAoIXNlcnZpY2UuZXhwZXJpbWVudEJ1Y2tldHNbbmFtZV0pIHtcbiAgICAgIHNlcnZpY2UuZXhwZXJpbWVudEJ1Y2tldHNbbmFtZV0gPSAnJGxvYWRpbmcnO1xuICAgICAgJGh0dHAucHV0KHByaXZhdGVBcGlFeHBlcmltZW50c0ZldGNoQW5kVXBkYXRlUGF0aCgpLCB7bmFtZX0pLnRoZW4oKF9yZXNwb25zZV8pID0+IHtcbiAgICAgICAgaWYgKCFfcmVzcG9uc2VfLmRhdGEucmVzcG9uc2UpIHtcbiAgICAgICAgICByZXR1cm4gJHEucmVqZWN0KCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBfcmVzcG9uc2VfLmRhdGEucmVzcG9uc2U7XG4gICAgICAgIHJldHVybiB7YnVja2V0czogcmVzcG9uc2UuYnVja2V0cywgYXBwX3ZlcnNpb246IHJlc3BvbnNlLmFwcF92ZXJzaW9ufTtcbiAgICAgIH0pLnRoZW4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICAgIHNlcnZpY2UuZXhwZXJpbWVudEJ1Y2tldHMgPSBfLm1lcmdlKHNlcnZpY2UuZXhwZXJpbWVudEJ1Y2tldHMsIHJlc3BvbnNlLmJ1Y2tldHMpO1xuICAgICAgICBzZXJ2aWNlLmFwcFZlcnNpb24gPSByZXNwb25zZS5hcHBfdmVyc2lvbjtcbiAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uKGVycm9yKSB7XG4gICAgICAgIHNlcnZpY2UuZXhwZXJpbWVudEJ1Y2tldHNbbmFtZV0gPSAnY29udHJvbCc7XG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHNlcnZpY2UuZXhwZXJpbWVudEJ1Y2tldHNbbmFtZV07XG4gIH07XG5cbiAgc2VydmljZS52YXJpYW50U3RhdGVQcm9taXNlID0gKG5hbWUpID0+IHtcbiAgICB2YXIgZGVmZXJyZWQgPSAkcS5kZWZlcigpO1xuICAgIHZhciB2YXJpYW50ID0gc2VydmljZS5leHBlcmltZW50QnVja2V0c1tuYW1lXTtcbiAgICBpZiAoIXZhcmlhbnQgfHwgdmFyaWFudCA9PT0gJyRsb2FkaW5nJykge1xuICAgICAgc2VydmljZS5mZXRjaFZhcmlhbnRTdGF0ZShuYW1lKS50aGVuKChmZXRjaGVkVmFyaWFudCkgPT4ge1xuICAgICAgICBkZWZlcnJlZC5yZXNvbHZlKGZldGNoZWRWYXJpYW50KTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBkZWZlcnJlZC5yZXNvbHZlKHZhcmlhbnQpO1xuICAgIH1cbiAgICByZXR1cm4gZGVmZXJyZWQucHJvbWlzZTtcbiAgfTtcblxuICBzZXJ2aWNlLmZldGNoVmFyaWFudFN0YXRlID0gKG5hbWUpID0+IHtcbiAgICByZXR1cm4gJGh0dHAucHV0KHByaXZhdGVBcGlFeHBlcmltZW50c0ZldGNoQW5kVXBkYXRlUGF0aCgpLCB7bmFtZX0pLnRoZW4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICBjb25zdCBidWNrZXRzID0gcmVzcG9uc2UuZGF0YS5yZXNwb25zZS5idWNrZXRzO1xuICAgICAgcmV0dXJuIGJ1Y2tldHNbbmFtZV07XG4gICAgfSk7XG4gIH07XG5cbiAgc2VydmljZS5nZXRWYXJpYW50U3RhdGUgPSAobmFtZSkgPT4ge1xuICAgIHJldHVybiAkaHR0cC5nZXQocHJpdmF0ZUFwaUV4cGVyaW1lbnRQYXRoKHtpZDogbmFtZX0pKS50aGVuKChyZXNwb25zZSkgPT4ge1xuICAgICAgcmV0dXJuIHJlc3BvbnNlLmRhdGEucmVzcG9uc2UuYnVja2V0O1xuICAgIH0pO1xuICB9O1xuXG4gIGZ1bmN0aW9uIHByb2plY3RWYXJpYW50KG5hbWUsIHByb2plY3RJZCl7XG4gICAgcmV0dXJuICRodHRwKHtcbiAgICAgIHVybDogc3BsaXRCdWNrZXRQcml2YXRlQXBpQ2FtcGFpZ25QYXRoKHtpZDogcHJvamVjdElkfSksXG4gICAgICBtZXRob2Q6ICdHRVQnLFxuICAgICAgcGFyYW1zOiB7bmFtZTogbmFtZX1cbiAgICB9KTtcbiAgfVxuICBzZXJ2aWNlLnByb2plY3RWYXJpYW50ID0gcHJvamVjdFZhcmlhbnQ7XG5cbiAgcmV0dXJuIHNlcnZpY2U7XG59XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiAuL2FuY2lsbGFyeS91dGlscy9zcGxpdC1mYWN0b3J5LmpzXG4gKiovIiwidW5kZWZpbmVkXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogXG4gKiovIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBOztBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQU5BO0FBQ0E7O0FBTUE7QUNDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTs7OztBQUlBO0FBQ0E7QUFDQTs7OztBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=");

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

	eval("\"use strict\";\nfunction activatePreOrderPrivateApiCampaignPath(args) {\n    return \"/private_api/campaigns/\" + args.id + \"/activate_pre_order\";\n}\nexports.activatePreOrderPrivateApiCampaignPath = activatePreOrderPrivateApiCampaignPath;\nfunction analyticsPrivateApiPaymentsContributionPath(args) {\n    return \"/private_api/payments/contributions/\" + args.id + \"/analytics\";\n}\nexports.analyticsPrivateApiPaymentsContributionPath = analyticsPrivateApiPaymentsContributionPath;\nfunction approveProductStagePrivateApiAdminProjectPath(args) {\n    return \"/private_api/admin/projects/\" + args.id + \"/approve_product_stage\";\n}\nexports.approveProductStagePrivateApiAdminProjectPath = approveProductStagePrivateApiAdminProjectPath;\nfunction batchUpdatePrivateApiCampaignOrdersPath(args) {\n    return \"/private_api/campaigns/\" + args.campaignId + \"/orders/batch_update\";\n}\nexports.batchUpdatePrivateApiCampaignOrdersPath = batchUpdatePrivateApiCampaignOrdersPath;\nfunction campaignSharePrivateApiPaymentsContributionPath(args) {\n    return \"/private_api/payments/contributions/\" + args.id + \"/campaign_share\";\n}\nexports.campaignSharePrivateApiPaymentsContributionPath = campaignSharePrivateApiPaymentsContributionPath;\nfunction campaignsPrivateApiPartnerDashboardPath(args) {\n    return \"/private_api/partners/\" + args.partnerId + \"/dashboard/campaigns\";\n}\nexports.campaignsPrivateApiPartnerDashboardPath = campaignsPrivateApiPartnerDashboardPath;\nfunction canMessagePrivateApiProjectsCampaignMessagesPath(args) {\n    return \"/private_api/projects/\" + args.id + \"/campaign_messages/can_message\";\n}\nexports.canMessagePrivateApiProjectsCampaignMessagesPath = canMessagePrivateApiProjectsCampaignMessagesPath;\nfunction changeTopPerkPrivateApiCommandCenterPerkPath(args) {\n    return \"/private_api/command_center/\" + args.commandCenterId + \"/perks/\" + args.id + \"/change_top_perk\";\n}\nexports.changeTopPerkPrivateApiCommandCenterPerkPath = changeTopPerkPrivateApiCommandCenterPerkPath;\nfunction checkPerkItemsEligibilityPrivateApiCampaignPath(args) {\n    return \"/private_api/campaigns/\" + args.id + \"/check_perk_items_eligibility\";\n}\nexports.checkPerkItemsEligibilityPrivateApiCampaignPath = checkPerkItemsEligibilityPrivateApiCampaignPath;\nfunction clearTopPerkPrivateApiCommandCenterPerksPath(args) {\n    return \"/private_api/command_center/\" + args.commandCenterId + \"/perks/clear_top_perk\";\n}\nexports.clearTopPerkPrivateApiCommandCenterPerksPath = clearTopPerkPrivateApiCommandCenterPerksPath;\nfunction contributionsPrivateApiPartnerDashboardPath(args) {\n    return \"/private_api/partners/\" + args.partnerId + \"/dashboard/contributions\";\n}\nexports.contributionsPrivateApiPartnerDashboardPath = contributionsPrivateApiPartnerDashboardPath;\nfunction createReplyPrivateApiCampaignCommentsPath(args) {\n    return \"/private_api/campaigns/\" + args.campaignId + \"/comments/create_reply\";\n}\nexports.createReplyPrivateApiCampaignCommentsPath = createReplyPrivateApiCampaignCommentsPath;\nfunction currentAccountFollowingPrivateApiCampaignCollectionPath(args) {\n    return \"/private_api/campaign_collections/\" + args.id + \"/current_account_following\";\n}\nexports.currentAccountFollowingPrivateApiCampaignCollectionPath = currentAccountFollowingPrivateApiCampaignCollectionPath;\nfunction deactivatePreOrderPrivateApiCampaignPath(args) {\n    return \"/private_api/campaigns/\" + args.id + \"/deactivate_pre_order\";\n}\nexports.deactivatePreOrderPrivateApiCampaignPath = deactivatePreOrderPrivateApiCampaignPath;\nfunction deleteReplyPrivateApiCampaignCommentsPath(args) {\n    return \"/private_api/campaigns/\" + args.campaignId + \"/comments/delete_reply\";\n}\nexports.deleteReplyPrivateApiCampaignCommentsPath = deleteReplyPrivateApiCampaignCommentsPath;\nfunction demotePrivateApiPartnerTeamMemberPath(args) {\n    return \"/private_api/partners/\" + args.partnerId + \"/team_members/\" + args.id + \"/demote\";\n}\nexports.demotePrivateApiPartnerTeamMemberPath = demotePrivateApiPartnerTeamMemberPath;\nfunction descriptionPrivateApiCampaignPath(args) {\n    return \"/private_api/campaigns/\" + args.id + \"/description\";\n}\nexports.descriptionPrivateApiCampaignPath = descriptionPrivateApiCampaignPath;\nfunction disablePreviewPrivateApiCampaignPath(args) {\n    return \"/private_api/campaigns/\" + args.id + \"/disable_preview\";\n}\nexports.disablePreviewPrivateApiCampaignPath = disablePreviewPrivateApiCampaignPath;\nfunction disinvitePrivateApiCampaignPath(args) {\n    return \"/private_api/campaigns/\" + args.id + \"/disinvite\";\n}\nexports.disinvitePrivateApiCampaignPath = disinvitePrivateApiCampaignPath;\nfunction editPrivateApiAccountPath(args) {\n    return \"/private_api/accounts/\" + args.id + \"/edit\";\n}\nexports.editPrivateApiAccountPath = editPrivateApiAccountPath;\nfunction editPrivateApiExternalCampaignPath(args) {\n    return \"/private_api/external_campaigns/\" + args.id + \"/edit\";\n}\nexports.editPrivateApiExternalCampaignPath = editPrivateApiExternalCampaignPath;\nfunction editPrivateApiProjectsPath(args) {\n    return \"/private_api/projects/\" + args.id + \"/edit\";\n}\nexports.editPrivateApiProjectsPath = editPrivateApiProjectsPath;\nfunction enablePreviewPrivateApiCampaignPath(args) {\n    return \"/private_api/campaigns/\" + args.id + \"/enable_preview\";\n}\nexports.enablePreviewPrivateApiCampaignPath = enablePreviewPrivateApiCampaignPath;\nfunction exportPrivateApiCampaignContributionsPath(args) {\n    return \"/private_api/campaigns/\" + args.campaignId + \"/contributions/export\";\n}\nexports.exportPrivateApiCampaignContributionsPath = exportPrivateApiCampaignContributionsPath;\nfunction findPartnerNameByEinPrivateApiCampaignPath(args) {\n    return \"/private_api/campaigns/\" + args.id + \"/find_partner_name_by_ein\";\n}\nexports.findPartnerNameByEinPrivateApiCampaignPath = findPartnerNameByEinPrivateApiCampaignPath;\nfunction followPrivateApiCampaignCollectionPath(args) {\n    return \"/private_api/campaign_collections/\" + args.id + \"/follow\";\n}\nexports.followPrivateApiCampaignCollectionPath = followPrivateApiCampaignCollectionPath;\nfunction followPrivateApiProjectsPath(args) {\n    return \"/private_api/projects/\" + args.id + \"/follow\";\n}\nexports.followPrivateApiProjectsPath = followPrivateApiProjectsPath;\nfunction fulfillmentPrivateApiPartnerDashboardPath(args) {\n    return \"/private_api/partners/\" + args.partnerId + \"/dashboard/fulfillment\";\n}\nexports.fulfillmentPrivateApiPartnerDashboardPath = fulfillmentPrivateApiPartnerDashboardPath;\nfunction hidePrivateApiCampaignEditorPerkPath(args) {\n    return \"/private_api/campaign_editor/\" + args.campaignEditorCampaignId + \"/perks/\" + args.id + \"/hide\";\n}\nexports.hidePrivateApiCampaignEditorPerkPath = hidePrivateApiCampaignEditorPerkPath;\nfunction importPrivateApiExternalCampaignsPath() {\n    return \"/private_api/external_campaigns/import\";\n}\nexports.importPrivateApiExternalCampaignsPath = importPrivateApiExternalCampaignsPath;\nfunction invitePrivateApiCampaignPath(args) {\n    return \"/private_api/campaigns/\" + args.id + \"/invite\";\n}\nexports.invitePrivateApiCampaignPath = invitePrivateApiCampaignPath;\nfunction markRefundedPrivateApiCampaignContributionPath(args) {\n    return \"/private_api/campaigns/\" + args.campaignId + \"/contributions/\" + args.id + \"/mark_refunded\";\n}\nexports.markRefundedPrivateApiCampaignContributionPath = markRefundedPrivateApiCampaignContributionPath;\nfunction mePrivateApiCredentialsPath() {\n    return \"/private_api/me\";\n}\nexports.mePrivateApiCredentialsPath = mePrivateApiCredentialsPath;\nfunction newPrivateApiAccountPath() {\n    return \"/private_api/accounts/new\";\n}\nexports.newPrivateApiAccountPath = newPrivateApiAccountPath;\nfunction newPrivateApiExternalCampaignPath() {\n    return \"/private_api/external_campaigns/new\";\n}\nexports.newPrivateApiExternalCampaignPath = newPrivateApiExternalCampaignPath;\nfunction newPrivateApiProjectsPath(args) {\n    return \"/private_api/projects/\" + args.id + \"/new\";\n}\nexports.newPrivateApiProjectsPath = newPrivateApiProjectsPath;\nfunction previewPrivateApiCampaignUpdatesPath(args) {\n    return \"/private_api/campaigns/\" + args.campaignId + \"/updates/preview\";\n}\nexports.previewPrivateApiCampaignUpdatesPath = previewPrivateApiCampaignUpdatesPath;\nfunction privateApiAccountPath(args) {\n    return \"/private_api/accounts/\" + args.id;\n}\nexports.privateApiAccountPath = privateApiAccountPath;\nfunction privateApiAccountAddressPath(args) {\n    return \"/private_api/accounts/\" + args.accountId + \"/addresses/\" + args.id;\n}\nexports.privateApiAccountAddressPath = privateApiAccountAddressPath;\nfunction privateApiAccountAddressesPath(args) {\n    return \"/private_api/accounts/\" + args.accountId + \"/addresses\";\n}\nexports.privateApiAccountAddressesPath = privateApiAccountAddressesPath;\nfunction privateApiAccountContributionPath(args) {\n    return \"/private_api/accounts/\" + args.accountId + \"/contributions/\" + args.id;\n}\nexports.privateApiAccountContributionPath = privateApiAccountContributionPath;\nfunction privateApiAccountCreditCardPath(args) {\n    return \"/private_api/accounts/\" + args.accountId + \"/credit_cards/\" + args.id;\n}\nexports.privateApiAccountCreditCardPath = privateApiAccountCreditCardPath;\nfunction privateApiAccountCreditCardsPath(args) {\n    return \"/private_api/accounts/\" + args.accountId + \"/credit_cards\";\n}\nexports.privateApiAccountCreditCardsPath = privateApiAccountCreditCardsPath;\nfunction privateApiAccountsPath() {\n    return \"/private_api/accounts\";\n}\nexports.privateApiAccountsPath = privateApiAccountsPath;\nfunction privateApiAdminAccountPath(args) {\n    return \"/private_api/admin/accounts/\" + args.id;\n}\nexports.privateApiAdminAccountPath = privateApiAdminAccountPath;\nfunction privateApiAdminAccountRolePath(args) {\n    return \"/private_api/admin/account_roles/\" + args.id;\n}\nexports.privateApiAdminAccountRolePath = privateApiAdminAccountRolePath;\nfunction privateApiAdminCampaignStrategistPath(args) {\n    return \"/private_api/admin/campaign_strategist/\" + args.id;\n}\nexports.privateApiAdminCampaignStrategistPath = privateApiAdminCampaignStrategistPath;\nfunction privateApiAdminCampaignStrategistIndexPath() {\n    return \"/private_api/admin/campaign_strategist\";\n}\nexports.privateApiAdminCampaignStrategistIndexPath = privateApiAdminCampaignStrategistIndexPath;\nfunction privateApiAdminProjectPath(args) {\n    return \"/private_api/admin/projects/\" + args.id;\n}\nexports.privateApiAdminProjectPath = privateApiAdminProjectPath;\nfunction privateApiAdminProjectItemPath(args) {\n    return \"/private_api/admin/projects/\" + args.projectId + \"/items/\" + args.id;\n}\nexports.privateApiAdminProjectItemPath = privateApiAdminProjectItemPath;\nfunction privateApiAdminProjectItemsPath(args) {\n    return \"/private_api/admin/projects/\" + args.projectId + \"/items\";\n}\nexports.privateApiAdminProjectItemsPath = privateApiAdminProjectItemsPath;\nfunction privateApiAdminProjectPerkPath(args) {\n    return \"/private_api/admin/projects/\" + args.projectId + \"/perks/\" + args.id;\n}\nexports.privateApiAdminProjectPerkPath = privateApiAdminProjectPerkPath;\nfunction privateApiAdminProjectPerksPath(args) {\n    return \"/private_api/admin/projects/\" + args.projectId + \"/perks\";\n}\nexports.privateApiAdminProjectPerksPath = privateApiAdminProjectPerksPath;\nfunction privateApiAdminProjectSponsorPath(args) {\n    return \"/private_api/admin/projects/\" + args.id + \"/project_sponsors/\" + args.projectSponsorId;\n}\nexports.privateApiAdminProjectSponsorPath = privateApiAdminProjectSponsorPath;\nfunction privateApiAdminProjectSponsorSponsorCertificationPath(args) {\n    return \"/private_api/admin/project_sponsors/\" + args.projectSponsorId + \"/sponsor_certifications/\" + args.id;\n}\nexports.privateApiAdminProjectSponsorSponsorCertificationPath = privateApiAdminProjectSponsorSponsorCertificationPath;\nfunction privateApiAdminProjectSponsorSponsorCertificationsPath(args) {\n    return \"/private_api/admin/project_sponsors/\" + args.projectSponsorId + \"/sponsor_certifications\";\n}\nexports.privateApiAdminProjectSponsorSponsorCertificationsPath = privateApiAdminProjectSponsorSponsorCertificationsPath;\nfunction privateApiAdminProjectSponsorsPath(args) {\n    return \"/private_api/admin/projects/\" + args.id + \"/project_sponsors\";\n}\nexports.privateApiAdminProjectSponsorsPath = privateApiAdminProjectSponsorsPath;\nfunction privateApiAdminSearchAnythingIndexPath() {\n    return \"/private_api/admin/search_anything\";\n}\nexports.privateApiAdminSearchAnythingIndexPath = privateApiAdminSearchAnythingIndexPath;\nfunction privateApiAdminSponsorPath(args) {\n    return \"/private_api/admin/sponsors/\" + args.id;\n}\nexports.privateApiAdminSponsorPath = privateApiAdminSponsorPath;\nfunction privateApiAdminSponsorLevelsPath() {\n    return \"/private_api/admin/sponsor_levels\";\n}\nexports.privateApiAdminSponsorLevelsPath = privateApiAdminSponsorLevelsPath;\nfunction privateApiAdminSponsorSponsorCertificationPath(args) {\n    return \"/private_api/admin/sponsors/\" + args.sponsorId + \"/sponsor_certifications/\" + args.id;\n}\nexports.privateApiAdminSponsorSponsorCertificationPath = privateApiAdminSponsorSponsorCertificationPath;\nfunction privateApiAdminSponsorSponsorCertificationsPath(args) {\n    return \"/private_api/admin/sponsors/\" + args.sponsorId + \"/sponsor_certifications\";\n}\nexports.privateApiAdminSponsorSponsorCertificationsPath = privateApiAdminSponsorSponsorCertificationsPath;\nfunction privateApiAdminSponsorsPath() {\n    return \"/private_api/admin/sponsors\";\n}\nexports.privateApiAdminSponsorsPath = privateApiAdminSponsorsPath;\nfunction privateApiCampaignPath(args) {\n    return \"/private_api/campaigns/\" + args.id;\n}\nexports.privateApiCampaignPath = privateApiCampaignPath;\nfunction privateApiCampaignBankAccountsPath(args) {\n    return \"/private_api/campaigns/\" + args.campaignId + \"/bank_accounts\";\n}\nexports.privateApiCampaignBankAccountsPath = privateApiCampaignBankAccountsPath;\nfunction privateApiCampaignBankInfosPath(args) {\n    return \"/private_api/campaigns/\" + args.campaignId + \"/bank_infos\";\n}\nexports.privateApiCampaignBankInfosPath = privateApiCampaignBankInfosPath;\nfunction privateApiCampaignCampaignPerkAvailabilityIndexPath(args) {\n    return \"/private_api/campaigns/\" + args.campaignId + \"/campaign_perk_availability\";\n}\nexports.privateApiCampaignCampaignPerkAvailabilityIndexPath = privateApiCampaignCampaignPerkAvailabilityIndexPath;\nfunction privateApiCampaignCertificationsPath(args) {\n    return \"/private_api/campaigns/\" + args.campaignId + \"/certifications\";\n}\nexports.privateApiCampaignCertificationsPath = privateApiCampaignCertificationsPath;\nfunction privateApiCampaignCollectionPath(args) {\n    return \"/private_api/campaign_collections/\" + args.id;\n}\nexports.privateApiCampaignCollectionPath = privateApiCampaignCollectionPath;\nfunction privateApiCampaignCollectionCampaignsPath(args) {\n    return \"/private_api/campaign_collections/\" + args.campaignCollectionId + \"/campaigns\";\n}\nexports.privateApiCampaignCollectionCampaignsPath = privateApiCampaignCollectionCampaignsPath;\nfunction privateApiCampaignCollectionsPath() {\n    return \"/private_api/campaign_collections\";\n}\nexports.privateApiCampaignCollectionsPath = privateApiCampaignCollectionsPath;\nfunction privateApiCampaignComingSoonPath(args) {\n    return \"/private_api/campaigns/\" + args.campaignId + \"/coming_soon\";\n}\nexports.privateApiCampaignComingSoonPath = privateApiCampaignComingSoonPath;\nfunction privateApiCampaignCommentPath(args) {\n    return \"/private_api/campaigns/\" + args.campaignId + \"/comments/\" + args.id;\n}\nexports.privateApiCampaignCommentPath = privateApiCampaignCommentPath;\nfunction privateApiCampaignCommentsPath(args) {\n    return \"/private_api/campaigns/\" + args.campaignId + \"/comments\";\n}\nexports.privateApiCampaignCommentsPath = privateApiCampaignCommentsPath;\nfunction privateApiCampaignContributionPath(args) {\n    return \"/private_api/campaigns/\" + args.campaignId + \"/contributions/\" + args.id;\n}\nexports.privateApiCampaignContributionPath = privateApiCampaignContributionPath;\nfunction privateApiCampaignContributionsPath(args) {\n    return \"/private_api/campaigns/\" + args.campaignId + \"/contributions\";\n}\nexports.privateApiCampaignContributionsPath = privateApiCampaignContributionsPath;\nfunction privateApiCampaignDisbursementsPath(args) {\n    return \"/private_api/campaigns/\" + args.campaignId + \"/disbursements\";\n}\nexports.privateApiCampaignDisbursementsPath = privateApiCampaignDisbursementsPath;\nfunction privateApiCampaignEditorPerkPath(args) {\n    return \"/private_api/campaign_editor/\" + args.campaignEditorCampaignId + \"/perks/\" + args.id;\n}\nexports.privateApiCampaignEditorPerkPath = privateApiCampaignEditorPerkPath;\nfunction privateApiCampaignEditorPerksPath(args) {\n    return \"/private_api/campaign_editor/\" + args.campaignEditorCampaignId + \"/perks\";\n}\nexports.privateApiCampaignEditorPerksPath = privateApiCampaignEditorPerksPath;\nfunction privateApiCampaignEmailSubscribersPath(args) {\n    return \"/private_api/campaigns/\" + args.campaignId + \"/email_subscribers\";\n}\nexports.privateApiCampaignEmailSubscribersPath = privateApiCampaignEmailSubscribersPath;\nfunction privateApiCampaignFundsPath(args) {\n    return \"/private_api/campaigns/\" + args.campaignId + \"/funds\";\n}\nexports.privateApiCampaignFundsPath = privateApiCampaignFundsPath;\nfunction privateApiCampaignGalleryPath(args) {\n    return \"/private_api/campaigns/\" + args.campaignId + \"/gallery\";\n}\nexports.privateApiCampaignGalleryPath = privateApiCampaignGalleryPath;\nfunction privateApiCampaignIdentityVerificationPath(args) {\n    return \"/private_api/campaigns/\" + args.campaignId + \"/identity_verification\";\n}\nexports.privateApiCampaignIdentityVerificationPath = privateApiCampaignIdentityVerificationPath;\nfunction privateApiCampaignOrderPath(args) {\n    return \"/private_api/campaigns/\" + args.campaignId + \"/orders/\" + args.id;\n}\nexports.privateApiCampaignOrderPath = privateApiCampaignOrderPath;\nfunction privateApiCampaignOrdersPath(args) {\n    return \"/private_api/campaigns/\" + args.campaignId + \"/orders\";\n}\nexports.privateApiCampaignOrdersPath = privateApiCampaignOrdersPath;\nfunction privateApiCampaignPayoutRecordsPath(args) {\n    return \"/private_api/campaigns/\" + args.campaignId + \"/payout_records\";\n}\nexports.privateApiCampaignPayoutRecordsPath = privateApiCampaignPayoutRecordsPath;\nfunction privateApiCampaignPerkItemPath(args) {\n    return \"/private_api/campaigns/\" + args.campaignId + \"/perk_items/\" + args.id;\n}\nexports.privateApiCampaignPerkItemPath = privateApiCampaignPerkItemPath;\nfunction privateApiCampaignPerkItemsPath(args) {\n    return \"/private_api/campaigns/\" + args.campaignId + \"/perk_items\";\n}\nexports.privateApiCampaignPerkItemsPath = privateApiCampaignPerkItemsPath;\nfunction privateApiCampaignPerkItemsEligibilityPath(args) {\n    return \"/private_api/campaigns/\" + args.campaignId + \"/perk_items_eligibility\";\n}\nexports.privateApiCampaignPerkItemsEligibilityPath = privateApiCampaignPerkItemsEligibilityPath;\nfunction privateApiCampaignPerksPath(args) {\n    return \"/private_api/campaigns/\" + args.campaignId + \"/perks\";\n}\nexports.privateApiCampaignPerksPath = privateApiCampaignPerksPath;\nfunction privateApiCampaignPledgesPath(args) {\n    return \"/private_api/campaigns/\" + args.campaignId + \"/pledges\";\n}\nexports.privateApiCampaignPledgesPath = privateApiCampaignPledgesPath;\nfunction privateApiCampaignSubscribePath(args) {\n    return \"/private_api/campaigns/\" + args.campaignId + \"/subscribe\";\n}\nexports.privateApiCampaignSubscribePath = privateApiCampaignSubscribePath;\nfunction privateApiCampaignUpdatePath(args) {\n    return \"/private_api/campaigns/\" + args.campaignId + \"/updates/\" + args.id;\n}\nexports.privateApiCampaignUpdatePath = privateApiCampaignUpdatePath;\nfunction privateApiCampaignUpdatesPath(args) {\n    return \"/private_api/campaigns/\" + args.campaignId + \"/updates\";\n}\nexports.privateApiCampaignUpdatesPath = privateApiCampaignUpdatesPath;\nfunction privateApiCampaignsPath() {\n    return \"/private_api/campaigns\";\n}\nexports.privateApiCampaignsPath = privateApiCampaignsPath;\nfunction privateApiCommandCenterAnalyticsPath(args) {\n    return \"/private_api/command_center/\" + args.commandCenterId + \"/analytics\";\n}\nexports.privateApiCommandCenterAnalyticsPath = privateApiCommandCenterAnalyticsPath;\nfunction privateApiCommandCenterCountriesPath(args) {\n    return \"/private_api/command_center/\" + args.commandCenterId + \"/countries\";\n}\nexports.privateApiCommandCenterCountriesPath = privateApiCommandCenterCountriesPath;\nfunction privateApiCommandCenterDomainsPath(args) {\n    return \"/private_api/command_center/\" + args.commandCenterId + \"/domains\";\n}\nexports.privateApiCommandCenterDomainsPath = privateApiCommandCenterDomainsPath;\nfunction privateApiCommandCenterFundsPath(args) {\n    return \"/private_api/command_center/\" + args.commandCenterId + \"/funds\";\n}\nexports.privateApiCommandCenterFundsPath = privateApiCommandCenterFundsPath;\nfunction privateApiCommandCenterPerksPath(args) {\n    return \"/private_api/command_center/\" + args.commandCenterId + \"/perks\";\n}\nexports.privateApiCommandCenterPerksPath = privateApiCommandCenterPerksPath;\nfunction privateApiCommandCenterReferrersPath(args) {\n    return \"/private_api/command_center/\" + args.commandCenterId + \"/referrers\";\n}\nexports.privateApiCommandCenterReferrersPath = privateApiCommandCenterReferrersPath;\nfunction privateApiCommandCenterStatsPath(args) {\n    return \"/private_api/command_center/\" + args.commandCenterId + \"/stats\";\n}\nexports.privateApiCommandCenterStatsPath = privateApiCommandCenterStatsPath;\nfunction privateApiContactsPath() {\n    return \"/private_api/contacts\";\n}\nexports.privateApiContactsPath = privateApiContactsPath;\nfunction privateApiEmailContactsPath() {\n    return \"/private_api/email_contacts\";\n}\nexports.privateApiEmailContactsPath = privateApiEmailContactsPath;\nfunction privateApiExperimentPath(args) {\n    return \"/private_api/experiments/\" + args.id;\n}\nexports.privateApiExperimentPath = privateApiExperimentPath;\nfunction privateApiExperimentsFetchAndUpdatePath() {\n    return \"/private_api/experiments/fetch_and_update\";\n}\nexports.privateApiExperimentsFetchAndUpdatePath = privateApiExperimentsFetchAndUpdatePath;\nfunction privateApiExplorePath() {\n    return \"/private_api/explore\";\n}\nexports.privateApiExplorePath = privateApiExplorePath;\nfunction privateApiExploreCollectionsPath() {\n    return \"/private_api/explore/collections\";\n}\nexports.privateApiExploreCollectionsPath = privateApiExploreCollectionsPath;\nfunction privateApiExploreStatsPath() {\n    return \"/private_api/explore/stats\";\n}\nexports.privateApiExploreStatsPath = privateApiExploreStatsPath;\nfunction privateApiExternalCampaignPath(args) {\n    return \"/private_api/external_campaigns/\" + args.id;\n}\nexports.privateApiExternalCampaignPath = privateApiExternalCampaignPath;\nfunction privateApiExternalCampaignsPath() {\n    return \"/private_api/external_campaigns\";\n}\nexports.privateApiExternalCampaignsPath = privateApiExternalCampaignsPath;\nfunction privateApiFacebookCountPath(args) {\n    return \"/private_api/facebook_count/\" + args.id;\n}\nexports.privateApiFacebookCountPath = privateApiFacebookCountPath;\nfunction privateApiFbDynamicProductAdPath(args) {\n    return \"/private_api/fb_dynamic_product_ads/\" + args.id;\n}\nexports.privateApiFbDynamicProductAdPath = privateApiFbDynamicProductAdPath;\nfunction privateApiFbDynamicProductAdsPath() {\n    return \"/private_api/fb_dynamic_product_ads\";\n}\nexports.privateApiFbDynamicProductAdsPath = privateApiFbDynamicProductAdsPath;\nfunction privateApiFundraiserDashboardDisbursementInfoPath(args) {\n    return \"/private_api/fundraiser/\" + args.fundraiserId + \"/dashboard/disbursement_info\";\n}\nexports.privateApiFundraiserDashboardDisbursementInfoPath = privateApiFundraiserDashboardDisbursementInfoPath;\nfunction privateApiHomePath() {\n    return \"/private_api/home\";\n}\nexports.privateApiHomePath = privateApiHomePath;\nfunction privateApiHomePerksPath() {\n    return \"/private_api/home/perks\";\n}\nexports.privateApiHomePerksPath = privateApiHomePerksPath;\nfunction privateApiHomeSlotsPath() {\n    return \"/private_api/home/slots\";\n}\nexports.privateApiHomeSlotsPath = privateApiHomeSlotsPath;\nfunction privateApiJobStatusPath(args) {\n    return \"/private_api/job_statuses/\" + args.id;\n}\nexports.privateApiJobStatusPath = privateApiJobStatusPath;\nfunction privateApiPartnerTeamInvitationPath(args) {\n    return \"/private_api/partners/\" + args.partnerId + \"/team_invitations/\" + args.id;\n}\nexports.privateApiPartnerTeamInvitationPath = privateApiPartnerTeamInvitationPath;\nfunction privateApiPartnerTeamInvitationsPath(args) {\n    return \"/private_api/partners/\" + args.partnerId + \"/team_invitations\";\n}\nexports.privateApiPartnerTeamInvitationsPath = privateApiPartnerTeamInvitationsPath;\nfunction privateApiPartnerTeamMemberPath(args) {\n    return \"/private_api/partners/\" + args.partnerId + \"/team_members/\" + args.id;\n}\nexports.privateApiPartnerTeamMemberPath = privateApiPartnerTeamMemberPath;\nfunction privateApiPaymentsCreditCardsNewPath() {\n    return \"/private_api/payments/credit_cards/new\";\n}\nexports.privateApiPaymentsCreditCardsNewPath = privateApiPaymentsCreditCardsNewPath;\nfunction privateApiPaymentsCreditCardsSavedPath() {\n    return \"/private_api/payments/credit_cards/saved\";\n}\nexports.privateApiPaymentsCreditCardsSavedPath = privateApiPaymentsCreditCardsSavedPath;\nfunction privateApiPaymentsGuestSignupsPath() {\n    return \"/private_api/payments/guest_signups\";\n}\nexports.privateApiPaymentsGuestSignupsPath = privateApiPaymentsGuestSignupsPath;\nfunction privateApiPaymentsPaypalPath() {\n    return \"/private_api/payments/paypal\";\n}\nexports.privateApiPaymentsPaypalPath = privateApiPaymentsPaypalPath;\nfunction privateApiPaymentsProjectPath(args) {\n    return \"/private_api/payments/projects/\" + args.id;\n}\nexports.privateApiPaymentsProjectPath = privateApiPaymentsProjectPath;\nfunction privateApiPerkItemsPath(args) {\n    return \"/private_api/perks/\" + args.perkId + \"/items\";\n}\nexports.privateApiPerkItemsPath = privateApiPerkItemsPath;\nfunction privateApiProfilePath(args) {\n    return \"/private_api/profiles/\" + args.id;\n}\nexports.privateApiProfilePath = privateApiProfilePath;\nfunction privateApiProfileCommentsPath(args) {\n    return \"/private_api/profiles/\" + args.profileId + \"/comments\";\n}\nexports.privateApiProfileCommentsPath = privateApiProfileCommentsPath;\nfunction privateApiProfileEmailPreferencesPath(args) {\n    return \"/private_api/profiles/\" + args.profileId + \"/email_preferences\";\n}\nexports.privateApiProfileEmailPreferencesPath = privateApiProfileEmailPreferencesPath;\nfunction privateApiProfileFacebooksPath(args) {\n    return \"/private_api/profiles/\" + args.profileId + \"/facebooks\";\n}\nexports.privateApiProfileFacebooksPath = privateApiProfileFacebooksPath;\nfunction privateApiProfileLinkedinsPath(args) {\n    return \"/private_api/profiles/\" + args.profileId + \"/linkedins\";\n}\nexports.privateApiProfileLinkedinsPath = privateApiProfileLinkedinsPath;\nfunction privateApiProjectsPath(args) {\n    return \"/private_api/projects/\" + args.id;\n}\nexports.privateApiProjectsPath = privateApiProjectsPath;\nfunction privateApiProjectsAutomaticFacebookPostsPath(args) {\n    return \"/private_api/projects/\" + args.id + \"/automatic_facebook_posts\";\n}\nexports.privateApiProjectsAutomaticFacebookPostsPath = privateApiProjectsAutomaticFacebookPostsPath;\nfunction privateApiProjectsCampaignMessagesPath(args) {\n    return \"/private_api/projects/\" + args.id + \"/campaign_messages\";\n}\nexports.privateApiProjectsCampaignMessagesPath = privateApiProjectsCampaignMessagesPath;\nfunction privateApiSearchPath() {\n    return \"/private_api/search\";\n}\nexports.privateApiSearchPath = privateApiSearchPath;\nfunction privateApiSimpleCampaignPath(args) {\n    return \"/private_api/simple_campaigns/\" + args.id;\n}\nexports.privateApiSimpleCampaignPath = privateApiSimpleCampaignPath;\nfunction productStagesPrivateApiAdminProjectPath(args) {\n    return \"/private_api/admin/projects/\" + args.id + \"/product_stages\";\n}\nexports.productStagesPrivateApiAdminProjectPath = productStagesPrivateApiAdminProjectPath;\nfunction projectTodoItemsPrivateApiProjectsPath(args) {\n    return \"/private_api/projects/\" + args.id + \"/todo_items/\" + args.itemName;\n}\nexports.projectTodoItemsPrivateApiProjectsPath = projectTodoItemsPrivateApiProjectsPath;\nfunction promotePrivateApiPartnerTeamMemberPath(args) {\n    return \"/private_api/partners/\" + args.partnerId + \"/team_members/\" + args.id + \"/promote\";\n}\nexports.promotePrivateApiPartnerTeamMemberPath = promotePrivateApiPartnerTeamMemberPath;\nfunction publishPrivateApiCampaignPath(args) {\n    return \"/private_api/campaigns/\" + args.id + \"/publish\";\n}\nexports.publishPrivateApiCampaignPath = publishPrivateApiCampaignPath;\nfunction publishPrivateApiExternalCampaignPath(args) {\n    return \"/private_api/external_campaigns/\" + args.id + \"/publish\";\n}\nexports.publishPrivateApiExternalCampaignPath = publishPrivateApiExternalCampaignPath;\nfunction publishPrivateApiSimpleCampaignPath(args) {\n    return \"/private_api/simple_campaigns/\" + args.id + \"/publish\";\n}\nexports.publishPrivateApiSimpleCampaignPath = publishPrivateApiSimpleCampaignPath;\nfunction recommendationsPrivateApiCampaignPath(args) {\n    return \"/private_api/campaigns/\" + args.id + \"/recommendations\";\n}\nexports.recommendationsPrivateApiCampaignPath = recommendationsPrivateApiCampaignPath;\nfunction refundPrivateApiCampaignContributionPath(args) {\n    return \"/private_api/campaigns/\" + args.campaignId + \"/contributions/\" + args.id + \"/refund\";\n}\nexports.refundPrivateApiCampaignContributionPath = refundPrivateApiCampaignContributionPath;\nfunction resendConfirmationEmailPrivateApiAccountPath(args) {\n    return \"/private_api/accounts/\" + args.id + \"/resend_confirmation_email\";\n}\nexports.resendConfirmationEmailPrivateApiAccountPath = resendConfirmationEmailPrivateApiAccountPath;\nfunction resendConfirmationEmailPrivateApiCampaignOrderPath(args) {\n    return \"/private_api/campaigns/\" + args.campaignId + \"/orders/\" + args.id + \"/resend_confirmation_email\";\n}\nexports.resendConfirmationEmailPrivateApiCampaignOrderPath = resendConfirmationEmailPrivateApiCampaignOrderPath;\nfunction resendPrivateApiPartnerTeamInvitationPath(args) {\n    return \"/private_api/partners/\" + args.partnerId + \"/team_invitations/\" + args.id + \"/resend\";\n}\nexports.resendPrivateApiPartnerTeamInvitationPath = resendPrivateApiPartnerTeamInvitationPath;\nfunction scheduleNextPostDatePrivateApiProjectsAutomaticFacebookPostsPath(args) {\n    return \"/private_api/projects/\" + args.id + \"/automatic_facebook_posts/schedule_next_post_date\";\n}\nexports.scheduleNextPostDatePrivateApiProjectsAutomaticFacebookPostsPath = scheduleNextPostDatePrivateApiProjectsAutomaticFacebookPostsPath;\nfunction searchPrivateApiTagsPath() {\n    return \"/private_api/tags/search\";\n}\nexports.searchPrivateApiTagsPath = searchPrivateApiTagsPath;\nfunction sendAllConfirmationEmailsPrivateApiCampaignOrdersPath(args) {\n    return \"/private_api/campaigns/\" + args.campaignId + \"/orders/send_all_confirmation_emails\";\n}\nexports.sendAllConfirmationEmailsPrivateApiCampaignOrdersPath = sendAllConfirmationEmailsPrivateApiCampaignOrdersPath;\nfunction sendEmailPrivateApiContactsPath() {\n    return \"/private_api/contacts/send_email\";\n}\nexports.sendEmailPrivateApiContactsPath = sendEmailPrivateApiContactsPath;\nfunction sendPreviewPrivateApiCampaignUpdatesPath(args) {\n    return \"/private_api/campaigns/\" + args.campaignId + \"/updates/send_preview\";\n}\nexports.sendPreviewPrivateApiCampaignUpdatesPath = sendPreviewPrivateApiCampaignUpdatesPath;\nfunction setFeePrivateApiExternalCampaignPath(args) {\n    return \"/private_api/external_campaigns/\" + args.id + \"/set_fee\";\n}\nexports.setFeePrivateApiExternalCampaignPath = setFeePrivateApiExternalCampaignPath;\nfunction setTopPerkPrivateApiCampaignEditorPerksPath(args) {\n    return \"/private_api/campaign_editor/\" + args.campaignEditorCampaignId + \"/perks/set_top_perk\";\n}\nexports.setTopPerkPrivateApiCampaignEditorPerksPath = setTopPerkPrivateApiCampaignEditorPerksPath;\nfunction splitBucketPrivateApiCampaignPath(args) {\n    return \"/private_api/campaigns/\" + args.id + \"/split_bucket\";\n}\nexports.splitBucketPrivateApiCampaignPath = splitBucketPrivateApiCampaignPath;\nfunction submitForApprovalPrivateApiCampaignPath(args) {\n    return \"/private_api/campaigns/\" + args.id + \"/submit_for_approval\";\n}\nexports.submitForApprovalPrivateApiCampaignPath = submitForApprovalPrivateApiCampaignPath;\nfunction toggleSpamPrivateApiCampaignCommentsPath(args) {\n    return \"/private_api/campaigns/\" + args.campaignId + \"/comments/toggle_spam\";\n}\nexports.toggleSpamPrivateApiCampaignCommentsPath = toggleSpamPrivateApiCampaignCommentsPath;\nfunction unfollowPrivateApiCampaignCollectionPath(args) {\n    return \"/private_api/campaign_collections/\" + args.id + \"/unfollow\";\n}\nexports.unfollowPrivateApiCampaignCollectionPath = unfollowPrivateApiCampaignCollectionPath;\nfunction unfollowPrivateApiProjectsPath(args) {\n    return \"/private_api/projects/\" + args.id + \"/unfollow\";\n}\nexports.unfollowPrivateApiProjectsPath = unfollowPrivateApiProjectsPath;\nfunction updateCloudinaryImagePrivateApiProfilePath(args) {\n    return \"/private_api/profiles/\" + args.id + \"/update_cloudinary_image\";\n}\nexports.updateCloudinaryImagePrivateApiProfilePath = updateCloudinaryImagePrivateApiProfilePath;\nfunction updateDeadlinePrivateApiCampaignPath(args) {\n    return \"/private_api/campaigns/\" + args.id + \"/update_deadline\";\n}\nexports.updateDeadlinePrivateApiCampaignPath = updateDeadlinePrivateApiCampaignPath;\nfunction verifyPaypalPrivateApiCampaignPath(args) {\n    return \"/private_api/campaigns/\" + args.id + \"/verify_paypal\";\n}\nexports.verifyPaypalPrivateApiCampaignPath = verifyPaypalPrivateApiCampaignPath;\n\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTcyLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vY29tcG9uZW50cy9yb3V0ZXMvcHJpdmF0ZS1hcGkudHM/NzQwMSJdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgZnVuY3Rpb24gYWN0aXZhdGVQcmVPcmRlclByaXZhdGVBcGlDYW1wYWlnblBhdGgoYXJncykge1xuICByZXR1cm4gYC9wcml2YXRlX2FwaS9jYW1wYWlnbnMvJHthcmdzLmlkfS9hY3RpdmF0ZV9wcmVfb3JkZXJgO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGFuYWx5dGljc1ByaXZhdGVBcGlQYXltZW50c0NvbnRyaWJ1dGlvblBhdGgoYXJncykge1xuICByZXR1cm4gYC9wcml2YXRlX2FwaS9wYXltZW50cy9jb250cmlidXRpb25zLyR7YXJncy5pZH0vYW5hbHl0aWNzYDtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhcHByb3ZlUHJvZHVjdFN0YWdlUHJpdmF0ZUFwaUFkbWluUHJvamVjdFBhdGgoYXJncykge1xuICByZXR1cm4gYC9wcml2YXRlX2FwaS9hZG1pbi9wcm9qZWN0cy8ke2FyZ3MuaWR9L2FwcHJvdmVfcHJvZHVjdF9zdGFnZWA7XG59XG5leHBvcnQgZnVuY3Rpb24gYmF0Y2hVcGRhdGVQcml2YXRlQXBpQ2FtcGFpZ25PcmRlcnNQYXRoKGFyZ3MpIHtcbiAgcmV0dXJuIGAvcHJpdmF0ZV9hcGkvY2FtcGFpZ25zLyR7YXJncy5jYW1wYWlnbklkfS9vcmRlcnMvYmF0Y2hfdXBkYXRlYDtcbn1cbmV4cG9ydCBmdW5jdGlvbiBjYW1wYWlnblNoYXJlUHJpdmF0ZUFwaVBheW1lbnRzQ29udHJpYnV0aW9uUGF0aChhcmdzKSB7XG4gIHJldHVybiBgL3ByaXZhdGVfYXBpL3BheW1lbnRzL2NvbnRyaWJ1dGlvbnMvJHthcmdzLmlkfS9jYW1wYWlnbl9zaGFyZWA7XG59XG5leHBvcnQgZnVuY3Rpb24gY2FtcGFpZ25zUHJpdmF0ZUFwaVBhcnRuZXJEYXNoYm9hcmRQYXRoKGFyZ3MpIHtcbiAgcmV0dXJuIGAvcHJpdmF0ZV9hcGkvcGFydG5lcnMvJHthcmdzLnBhcnRuZXJJZH0vZGFzaGJvYXJkL2NhbXBhaWduc2A7XG59XG5leHBvcnQgZnVuY3Rpb24gY2FuTWVzc2FnZVByaXZhdGVBcGlQcm9qZWN0c0NhbXBhaWduTWVzc2FnZXNQYXRoKGFyZ3MpIHtcbiAgcmV0dXJuIGAvcHJpdmF0ZV9hcGkvcHJvamVjdHMvJHthcmdzLmlkfS9jYW1wYWlnbl9tZXNzYWdlcy9jYW5fbWVzc2FnZWA7XG59XG5leHBvcnQgZnVuY3Rpb24gY2hhbmdlVG9wUGVya1ByaXZhdGVBcGlDb21tYW5kQ2VudGVyUGVya1BhdGgoYXJncykge1xuICByZXR1cm4gYC9wcml2YXRlX2FwaS9jb21tYW5kX2NlbnRlci8ke2FyZ3MuY29tbWFuZENlbnRlcklkfS9wZXJrcy8ke2FyZ3MuaWR9L2NoYW5nZV90b3BfcGVya2A7XG59XG5leHBvcnQgZnVuY3Rpb24gY2hlY2tQZXJrSXRlbXNFbGlnaWJpbGl0eVByaXZhdGVBcGlDYW1wYWlnblBhdGgoYXJncykge1xuICByZXR1cm4gYC9wcml2YXRlX2FwaS9jYW1wYWlnbnMvJHthcmdzLmlkfS9jaGVja19wZXJrX2l0ZW1zX2VsaWdpYmlsaXR5YDtcbn1cbmV4cG9ydCBmdW5jdGlvbiBjbGVhclRvcFBlcmtQcml2YXRlQXBpQ29tbWFuZENlbnRlclBlcmtzUGF0aChhcmdzKSB7XG4gIHJldHVybiBgL3ByaXZhdGVfYXBpL2NvbW1hbmRfY2VudGVyLyR7YXJncy5jb21tYW5kQ2VudGVySWR9L3BlcmtzL2NsZWFyX3RvcF9wZXJrYDtcbn1cbmV4cG9ydCBmdW5jdGlvbiBjb250cmlidXRpb25zUHJpdmF0ZUFwaVBhcnRuZXJEYXNoYm9hcmRQYXRoKGFyZ3MpIHtcbiAgcmV0dXJuIGAvcHJpdmF0ZV9hcGkvcGFydG5lcnMvJHthcmdzLnBhcnRuZXJJZH0vZGFzaGJvYXJkL2NvbnRyaWJ1dGlvbnNgO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVJlcGx5UHJpdmF0ZUFwaUNhbXBhaWduQ29tbWVudHNQYXRoKGFyZ3MpIHtcbiAgcmV0dXJuIGAvcHJpdmF0ZV9hcGkvY2FtcGFpZ25zLyR7YXJncy5jYW1wYWlnbklkfS9jb21tZW50cy9jcmVhdGVfcmVwbHlgO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGN1cnJlbnRBY2NvdW50Rm9sbG93aW5nUHJpdmF0ZUFwaUNhbXBhaWduQ29sbGVjdGlvblBhdGgoYXJncykge1xuICByZXR1cm4gYC9wcml2YXRlX2FwaS9jYW1wYWlnbl9jb2xsZWN0aW9ucy8ke2FyZ3MuaWR9L2N1cnJlbnRfYWNjb3VudF9mb2xsb3dpbmdgO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGRlYWN0aXZhdGVQcmVPcmRlclByaXZhdGVBcGlDYW1wYWlnblBhdGgoYXJncykge1xuICByZXR1cm4gYC9wcml2YXRlX2FwaS9jYW1wYWlnbnMvJHthcmdzLmlkfS9kZWFjdGl2YXRlX3ByZV9vcmRlcmA7XG59XG5leHBvcnQgZnVuY3Rpb24gZGVsZXRlUmVwbHlQcml2YXRlQXBpQ2FtcGFpZ25Db21tZW50c1BhdGgoYXJncykge1xuICByZXR1cm4gYC9wcml2YXRlX2FwaS9jYW1wYWlnbnMvJHthcmdzLmNhbXBhaWduSWR9L2NvbW1lbnRzL2RlbGV0ZV9yZXBseWA7XG59XG5leHBvcnQgZnVuY3Rpb24gZGVtb3RlUHJpdmF0ZUFwaVBhcnRuZXJUZWFtTWVtYmVyUGF0aChhcmdzKSB7XG4gIHJldHVybiBgL3ByaXZhdGVfYXBpL3BhcnRuZXJzLyR7YXJncy5wYXJ0bmVySWR9L3RlYW1fbWVtYmVycy8ke2FyZ3MuaWR9L2RlbW90ZWA7XG59XG5leHBvcnQgZnVuY3Rpb24gZGVzY3JpcHRpb25Qcml2YXRlQXBpQ2FtcGFpZ25QYXRoKGFyZ3MpIHtcbiAgcmV0dXJuIGAvcHJpdmF0ZV9hcGkvY2FtcGFpZ25zLyR7YXJncy5pZH0vZGVzY3JpcHRpb25gO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGRpc2FibGVQcmV2aWV3UHJpdmF0ZUFwaUNhbXBhaWduUGF0aChhcmdzKSB7XG4gIHJldHVybiBgL3ByaXZhdGVfYXBpL2NhbXBhaWducy8ke2FyZ3MuaWR9L2Rpc2FibGVfcHJldmlld2A7XG59XG5leHBvcnQgZnVuY3Rpb24gZGlzaW52aXRlUHJpdmF0ZUFwaUNhbXBhaWduUGF0aChhcmdzKSB7XG4gIHJldHVybiBgL3ByaXZhdGVfYXBpL2NhbXBhaWducy8ke2FyZ3MuaWR9L2Rpc2ludml0ZWA7XG59XG5leHBvcnQgZnVuY3Rpb24gZWRpdFByaXZhdGVBcGlBY2NvdW50UGF0aChhcmdzKSB7XG4gIHJldHVybiBgL3ByaXZhdGVfYXBpL2FjY291bnRzLyR7YXJncy5pZH0vZWRpdGA7XG59XG5leHBvcnQgZnVuY3Rpb24gZWRpdFByaXZhdGVBcGlFeHRlcm5hbENhbXBhaWduUGF0aChhcmdzKSB7XG4gIHJldHVybiBgL3ByaXZhdGVfYXBpL2V4dGVybmFsX2NhbXBhaWducy8ke2FyZ3MuaWR9L2VkaXRgO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGVkaXRQcml2YXRlQXBpUHJvamVjdHNQYXRoKGFyZ3MpIHtcbiAgcmV0dXJuIGAvcHJpdmF0ZV9hcGkvcHJvamVjdHMvJHthcmdzLmlkfS9lZGl0YDtcbn1cbmV4cG9ydCBmdW5jdGlvbiBlbmFibGVQcmV2aWV3UHJpdmF0ZUFwaUNhbXBhaWduUGF0aChhcmdzKSB7XG4gIHJldHVybiBgL3ByaXZhdGVfYXBpL2NhbXBhaWducy8ke2FyZ3MuaWR9L2VuYWJsZV9wcmV2aWV3YDtcbn1cbmV4cG9ydCBmdW5jdGlvbiBleHBvcnRQcml2YXRlQXBpQ2FtcGFpZ25Db250cmlidXRpb25zUGF0aChhcmdzKSB7XG4gIHJldHVybiBgL3ByaXZhdGVfYXBpL2NhbXBhaWducy8ke2FyZ3MuY2FtcGFpZ25JZH0vY29udHJpYnV0aW9ucy9leHBvcnRgO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGZpbmRQYXJ0bmVyTmFtZUJ5RWluUHJpdmF0ZUFwaUNhbXBhaWduUGF0aChhcmdzKSB7XG4gIHJldHVybiBgL3ByaXZhdGVfYXBpL2NhbXBhaWducy8ke2FyZ3MuaWR9L2ZpbmRfcGFydG5lcl9uYW1lX2J5X2VpbmA7XG59XG5leHBvcnQgZnVuY3Rpb24gZm9sbG93UHJpdmF0ZUFwaUNhbXBhaWduQ29sbGVjdGlvblBhdGgoYXJncykge1xuICByZXR1cm4gYC9wcml2YXRlX2FwaS9jYW1wYWlnbl9jb2xsZWN0aW9ucy8ke2FyZ3MuaWR9L2ZvbGxvd2A7XG59XG5leHBvcnQgZnVuY3Rpb24gZm9sbG93UHJpdmF0ZUFwaVByb2plY3RzUGF0aChhcmdzKSB7XG4gIHJldHVybiBgL3ByaXZhdGVfYXBpL3Byb2plY3RzLyR7YXJncy5pZH0vZm9sbG93YDtcbn1cbmV4cG9ydCBmdW5jdGlvbiBmdWxmaWxsbWVudFByaXZhdGVBcGlQYXJ0bmVyRGFzaGJvYXJkUGF0aChhcmdzKSB7XG4gIHJldHVybiBgL3ByaXZhdGVfYXBpL3BhcnRuZXJzLyR7YXJncy5wYXJ0bmVySWR9L2Rhc2hib2FyZC9mdWxmaWxsbWVudGA7XG59XG5leHBvcnQgZnVuY3Rpb24gaGlkZVByaXZhdGVBcGlDYW1wYWlnbkVkaXRvclBlcmtQYXRoKGFyZ3MpIHtcbiAgcmV0dXJuIGAvcHJpdmF0ZV9hcGkvY2FtcGFpZ25fZWRpdG9yLyR7YXJncy5jYW1wYWlnbkVkaXRvckNhbXBhaWduSWR9L3BlcmtzLyR7YXJncy5pZH0vaGlkZWA7XG59XG5leHBvcnQgZnVuY3Rpb24gaW1wb3J0UHJpdmF0ZUFwaUV4dGVybmFsQ2FtcGFpZ25zUGF0aCgpIHtcbiAgcmV0dXJuIGAvcHJpdmF0ZV9hcGkvZXh0ZXJuYWxfY2FtcGFpZ25zL2ltcG9ydGA7XG59XG5leHBvcnQgZnVuY3Rpb24gaW52aXRlUHJpdmF0ZUFwaUNhbXBhaWduUGF0aChhcmdzKSB7XG4gIHJldHVybiBgL3ByaXZhdGVfYXBpL2NhbXBhaWducy8ke2FyZ3MuaWR9L2ludml0ZWA7XG59XG5leHBvcnQgZnVuY3Rpb24gbWFya1JlZnVuZGVkUHJpdmF0ZUFwaUNhbXBhaWduQ29udHJpYnV0aW9uUGF0aChhcmdzKSB7XG4gIHJldHVybiBgL3ByaXZhdGVfYXBpL2NhbXBhaWducy8ke2FyZ3MuY2FtcGFpZ25JZH0vY29udHJpYnV0aW9ucy8ke2FyZ3MuaWR9L21hcmtfcmVmdW5kZWRgO1xufVxuZXhwb3J0IGZ1bmN0aW9uIG1lUHJpdmF0ZUFwaUNyZWRlbnRpYWxzUGF0aCgpIHtcbiAgcmV0dXJuIGAvcHJpdmF0ZV9hcGkvbWVgO1xufVxuZXhwb3J0IGZ1bmN0aW9uIG5ld1ByaXZhdGVBcGlBY2NvdW50UGF0aCgpIHtcbiAgcmV0dXJuIGAvcHJpdmF0ZV9hcGkvYWNjb3VudHMvbmV3YDtcbn1cbmV4cG9ydCBmdW5jdGlvbiBuZXdQcml2YXRlQXBpRXh0ZXJuYWxDYW1wYWlnblBhdGgoKSB7XG4gIHJldHVybiBgL3ByaXZhdGVfYXBpL2V4dGVybmFsX2NhbXBhaWducy9uZXdgO1xufVxuZXhwb3J0IGZ1bmN0aW9uIG5ld1ByaXZhdGVBcGlQcm9qZWN0c1BhdGgoYXJncykge1xuICByZXR1cm4gYC9wcml2YXRlX2FwaS9wcm9qZWN0cy8ke2FyZ3MuaWR9L25ld2A7XG59XG5leHBvcnQgZnVuY3Rpb24gcHJldmlld1ByaXZhdGVBcGlDYW1wYWlnblVwZGF0ZXNQYXRoKGFyZ3MpIHtcbiAgcmV0dXJuIGAvcHJpdmF0ZV9hcGkvY2FtcGFpZ25zLyR7YXJncy5jYW1wYWlnbklkfS91cGRhdGVzL3ByZXZpZXdgO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHByaXZhdGVBcGlBY2NvdW50UGF0aChhcmdzKSB7XG4gIHJldHVybiBgL3ByaXZhdGVfYXBpL2FjY291bnRzLyR7YXJncy5pZH1gO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHByaXZhdGVBcGlBY2NvdW50QWRkcmVzc1BhdGgoYXJncykge1xuICByZXR1cm4gYC9wcml2YXRlX2FwaS9hY2NvdW50cy8ke2FyZ3MuYWNjb3VudElkfS9hZGRyZXNzZXMvJHthcmdzLmlkfWA7XG59XG5leHBvcnQgZnVuY3Rpb24gcHJpdmF0ZUFwaUFjY291bnRBZGRyZXNzZXNQYXRoKGFyZ3MpIHtcbiAgcmV0dXJuIGAvcHJpdmF0ZV9hcGkvYWNjb3VudHMvJHthcmdzLmFjY291bnRJZH0vYWRkcmVzc2VzYDtcbn1cbmV4cG9ydCBmdW5jdGlvbiBwcml2YXRlQXBpQWNjb3VudENvbnRyaWJ1dGlvblBhdGgoYXJncykge1xuICByZXR1cm4gYC9wcml2YXRlX2FwaS9hY2NvdW50cy8ke2FyZ3MuYWNjb3VudElkfS9jb250cmlidXRpb25zLyR7YXJncy5pZH1gO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHByaXZhdGVBcGlBY2NvdW50Q3JlZGl0Q2FyZFBhdGgoYXJncykge1xuICByZXR1cm4gYC9wcml2YXRlX2FwaS9hY2NvdW50cy8ke2FyZ3MuYWNjb3VudElkfS9jcmVkaXRfY2FyZHMvJHthcmdzLmlkfWA7XG59XG5leHBvcnQgZnVuY3Rpb24gcHJpdmF0ZUFwaUFjY291bnRDcmVkaXRDYXJkc1BhdGgoYXJncykge1xuICByZXR1cm4gYC9wcml2YXRlX2FwaS9hY2NvdW50cy8ke2FyZ3MuYWNjb3VudElkfS9jcmVkaXRfY2FyZHNgO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHByaXZhdGVBcGlBY2NvdW50c1BhdGgoKSB7XG4gIHJldHVybiBgL3ByaXZhdGVfYXBpL2FjY291bnRzYDtcbn1cbmV4cG9ydCBmdW5jdGlvbiBwcml2YXRlQXBpQWRtaW5BY2NvdW50UGF0aChhcmdzKSB7XG4gIHJldHVybiBgL3ByaXZhdGVfYXBpL2FkbWluL2FjY291bnRzLyR7YXJncy5pZH1gO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHByaXZhdGVBcGlBZG1pbkFjY291bnRSb2xlUGF0aChhcmdzKSB7XG4gIHJldHVybiBgL3ByaXZhdGVfYXBpL2FkbWluL2FjY291bnRfcm9sZXMvJHthcmdzLmlkfWA7XG59XG5leHBvcnQgZnVuY3Rpb24gcHJpdmF0ZUFwaUFkbWluQ2FtcGFpZ25TdHJhdGVnaXN0UGF0aChhcmdzKSB7XG4gIHJldHVybiBgL3ByaXZhdGVfYXBpL2FkbWluL2NhbXBhaWduX3N0cmF0ZWdpc3QvJHthcmdzLmlkfWA7XG59XG5leHBvcnQgZnVuY3Rpb24gcHJpdmF0ZUFwaUFkbWluQ2FtcGFpZ25TdHJhdGVnaXN0SW5kZXhQYXRoKCkge1xuICByZXR1cm4gYC9wcml2YXRlX2FwaS9hZG1pbi9jYW1wYWlnbl9zdHJhdGVnaXN0YDtcbn1cbmV4cG9ydCBmdW5jdGlvbiBwcml2YXRlQXBpQWRtaW5Qcm9qZWN0UGF0aChhcmdzKSB7XG4gIHJldHVybiBgL3ByaXZhdGVfYXBpL2FkbWluL3Byb2plY3RzLyR7YXJncy5pZH1gO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHByaXZhdGVBcGlBZG1pblByb2plY3RJdGVtUGF0aChhcmdzKSB7XG4gIHJldHVybiBgL3ByaXZhdGVfYXBpL2FkbWluL3Byb2plY3RzLyR7YXJncy5wcm9qZWN0SWR9L2l0ZW1zLyR7YXJncy5pZH1gO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHByaXZhdGVBcGlBZG1pblByb2plY3RJdGVtc1BhdGgoYXJncykge1xuICByZXR1cm4gYC9wcml2YXRlX2FwaS9hZG1pbi9wcm9qZWN0cy8ke2FyZ3MucHJvamVjdElkfS9pdGVtc2A7XG59XG5leHBvcnQgZnVuY3Rpb24gcHJpdmF0ZUFwaUFkbWluUHJvamVjdFBlcmtQYXRoKGFyZ3MpIHtcbiAgcmV0dXJuIGAvcHJpdmF0ZV9hcGkvYWRtaW4vcHJvamVjdHMvJHthcmdzLnByb2plY3RJZH0vcGVya3MvJHthcmdzLmlkfWA7XG59XG5leHBvcnQgZnVuY3Rpb24gcHJpdmF0ZUFwaUFkbWluUHJvamVjdFBlcmtzUGF0aChhcmdzKSB7XG4gIHJldHVybiBgL3ByaXZhdGVfYXBpL2FkbWluL3Byb2plY3RzLyR7YXJncy5wcm9qZWN0SWR9L3BlcmtzYDtcbn1cbmV4cG9ydCBmdW5jdGlvbiBwcml2YXRlQXBpQWRtaW5Qcm9qZWN0U3BvbnNvclBhdGgoYXJncykge1xuICByZXR1cm4gYC9wcml2YXRlX2FwaS9hZG1pbi9wcm9qZWN0cy8ke2FyZ3MuaWR9L3Byb2plY3Rfc3BvbnNvcnMvJHthcmdzLnByb2plY3RTcG9uc29ySWR9YDtcbn1cbmV4cG9ydCBmdW5jdGlvbiBwcml2YXRlQXBpQWRtaW5Qcm9qZWN0U3BvbnNvclNwb25zb3JDZXJ0aWZpY2F0aW9uUGF0aChhcmdzKSB7XG4gIHJldHVybiBgL3ByaXZhdGVfYXBpL2FkbWluL3Byb2plY3Rfc3BvbnNvcnMvJHthcmdzLnByb2plY3RTcG9uc29ySWR9L3Nwb25zb3JfY2VydGlmaWNhdGlvbnMvJHthcmdzLmlkfWA7XG59XG5leHBvcnQgZnVuY3Rpb24gcHJpdmF0ZUFwaUFkbWluUHJvamVjdFNwb25zb3JTcG9uc29yQ2VydGlmaWNhdGlvbnNQYXRoKGFyZ3MpIHtcbiAgcmV0dXJuIGAvcHJpdmF0ZV9hcGkvYWRtaW4vcHJvamVjdF9zcG9uc29ycy8ke2FyZ3MucHJvamVjdFNwb25zb3JJZH0vc3BvbnNvcl9jZXJ0aWZpY2F0aW9uc2A7XG59XG5leHBvcnQgZnVuY3Rpb24gcHJpdmF0ZUFwaUFkbWluUHJvamVjdFNwb25zb3JzUGF0aChhcmdzKSB7XG4gIHJldHVybiBgL3ByaXZhdGVfYXBpL2FkbWluL3Byb2plY3RzLyR7YXJncy5pZH0vcHJvamVjdF9zcG9uc29yc2A7XG59XG5leHBvcnQgZnVuY3Rpb24gcHJpdmF0ZUFwaUFkbWluU2VhcmNoQW55dGhpbmdJbmRleFBhdGgoKSB7XG4gIHJldHVybiBgL3ByaXZhdGVfYXBpL2FkbWluL3NlYXJjaF9hbnl0aGluZ2A7XG59XG5leHBvcnQgZnVuY3Rpb24gcHJpdmF0ZUFwaUFkbWluU3BvbnNvclBhdGgoYXJncykge1xuICByZXR1cm4gYC9wcml2YXRlX2FwaS9hZG1pbi9zcG9uc29ycy8ke2FyZ3MuaWR9YDtcbn1cbmV4cG9ydCBmdW5jdGlvbiBwcml2YXRlQXBpQWRtaW5TcG9uc29yTGV2ZWxzUGF0aCgpIHtcbiAgcmV0dXJuIGAvcHJpdmF0ZV9hcGkvYWRtaW4vc3BvbnNvcl9sZXZlbHNgO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHByaXZhdGVBcGlBZG1pblNwb25zb3JTcG9uc29yQ2VydGlmaWNhdGlvblBhdGgoYXJncykge1xuICByZXR1cm4gYC9wcml2YXRlX2FwaS9hZG1pbi9zcG9uc29ycy8ke2FyZ3Muc3BvbnNvcklkfS9zcG9uc29yX2NlcnRpZmljYXRpb25zLyR7YXJncy5pZH1gO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHByaXZhdGVBcGlBZG1pblNwb25zb3JTcG9uc29yQ2VydGlmaWNhdGlvbnNQYXRoKGFyZ3MpIHtcbiAgcmV0dXJuIGAvcHJpdmF0ZV9hcGkvYWRtaW4vc3BvbnNvcnMvJHthcmdzLnNwb25zb3JJZH0vc3BvbnNvcl9jZXJ0aWZpY2F0aW9uc2A7XG59XG5leHBvcnQgZnVuY3Rpb24gcHJpdmF0ZUFwaUFkbWluU3BvbnNvcnNQYXRoKCkge1xuICByZXR1cm4gYC9wcml2YXRlX2FwaS9hZG1pbi9zcG9uc29yc2A7XG59XG5leHBvcnQgZnVuY3Rpb24gcHJpdmF0ZUFwaUNhbXBhaWduUGF0aChhcmdzKSB7XG4gIHJldHVybiBgL3ByaXZhdGVfYXBpL2NhbXBhaWducy8ke2FyZ3MuaWR9YDtcbn1cbmV4cG9ydCBmdW5jdGlvbiBwcml2YXRlQXBpQ2FtcGFpZ25CYW5rQWNjb3VudHNQYXRoKGFyZ3MpIHtcbiAgcmV0dXJuIGAvcHJpdmF0ZV9hcGkvY2FtcGFpZ25zLyR7YXJncy5jYW1wYWlnbklkfS9iYW5rX2FjY291bnRzYDtcbn1cbmV4cG9ydCBmdW5jdGlvbiBwcml2YXRlQXBpQ2FtcGFpZ25CYW5rSW5mb3NQYXRoKGFyZ3MpIHtcbiAgcmV0dXJuIGAvcHJpdmF0ZV9hcGkvY2FtcGFpZ25zLyR7YXJncy5jYW1wYWlnbklkfS9iYW5rX2luZm9zYDtcbn1cbmV4cG9ydCBmdW5jdGlvbiBwcml2YXRlQXBpQ2FtcGFpZ25DYW1wYWlnblBlcmtBdmFpbGFiaWxpdHlJbmRleFBhdGgoYXJncykge1xuICByZXR1cm4gYC9wcml2YXRlX2FwaS9jYW1wYWlnbnMvJHthcmdzLmNhbXBhaWduSWR9L2NhbXBhaWduX3BlcmtfYXZhaWxhYmlsaXR5YDtcbn1cbmV4cG9ydCBmdW5jdGlvbiBwcml2YXRlQXBpQ2FtcGFpZ25DZXJ0aWZpY2F0aW9uc1BhdGgoYXJncykge1xuICByZXR1cm4gYC9wcml2YXRlX2FwaS9jYW1wYWlnbnMvJHthcmdzLmNhbXBhaWduSWR9L2NlcnRpZmljYXRpb25zYDtcbn1cbmV4cG9ydCBmdW5jdGlvbiBwcml2YXRlQXBpQ2FtcGFpZ25Db2xsZWN0aW9uUGF0aChhcmdzKSB7XG4gIHJldHVybiBgL3ByaXZhdGVfYXBpL2NhbXBhaWduX2NvbGxlY3Rpb25zLyR7YXJncy5pZH1gO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHByaXZhdGVBcGlDYW1wYWlnbkNvbGxlY3Rpb25DYW1wYWlnbnNQYXRoKGFyZ3MpIHtcbiAgcmV0dXJuIGAvcHJpdmF0ZV9hcGkvY2FtcGFpZ25fY29sbGVjdGlvbnMvJHthcmdzLmNhbXBhaWduQ29sbGVjdGlvbklkfS9jYW1wYWlnbnNgO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHByaXZhdGVBcGlDYW1wYWlnbkNvbGxlY3Rpb25zUGF0aCgpIHtcbiAgcmV0dXJuIGAvcHJpdmF0ZV9hcGkvY2FtcGFpZ25fY29sbGVjdGlvbnNgO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHByaXZhdGVBcGlDYW1wYWlnbkNvbWluZ1Nvb25QYXRoKGFyZ3MpIHtcbiAgcmV0dXJuIGAvcHJpdmF0ZV9hcGkvY2FtcGFpZ25zLyR7YXJncy5jYW1wYWlnbklkfS9jb21pbmdfc29vbmA7XG59XG5leHBvcnQgZnVuY3Rpb24gcHJpdmF0ZUFwaUNhbXBhaWduQ29tbWVudFBhdGgoYXJncykge1xuICByZXR1cm4gYC9wcml2YXRlX2FwaS9jYW1wYWlnbnMvJHthcmdzLmNhbXBhaWduSWR9L2NvbW1lbnRzLyR7YXJncy5pZH1gO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHByaXZhdGVBcGlDYW1wYWlnbkNvbW1lbnRzUGF0aChhcmdzKSB7XG4gIHJldHVybiBgL3ByaXZhdGVfYXBpL2NhbXBhaWducy8ke2FyZ3MuY2FtcGFpZ25JZH0vY29tbWVudHNgO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHByaXZhdGVBcGlDYW1wYWlnbkNvbnRyaWJ1dGlvblBhdGgoYXJncykge1xuICByZXR1cm4gYC9wcml2YXRlX2FwaS9jYW1wYWlnbnMvJHthcmdzLmNhbXBhaWduSWR9L2NvbnRyaWJ1dGlvbnMvJHthcmdzLmlkfWA7XG59XG5leHBvcnQgZnVuY3Rpb24gcHJpdmF0ZUFwaUNhbXBhaWduQ29udHJpYnV0aW9uc1BhdGgoYXJncykge1xuICByZXR1cm4gYC9wcml2YXRlX2FwaS9jYW1wYWlnbnMvJHthcmdzLmNhbXBhaWduSWR9L2NvbnRyaWJ1dGlvbnNgO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHByaXZhdGVBcGlDYW1wYWlnbkRpc2J1cnNlbWVudHNQYXRoKGFyZ3MpIHtcbiAgcmV0dXJuIGAvcHJpdmF0ZV9hcGkvY2FtcGFpZ25zLyR7YXJncy5jYW1wYWlnbklkfS9kaXNidXJzZW1lbnRzYDtcbn1cbmV4cG9ydCBmdW5jdGlvbiBwcml2YXRlQXBpQ2FtcGFpZ25FZGl0b3JQZXJrUGF0aChhcmdzKSB7XG4gIHJldHVybiBgL3ByaXZhdGVfYXBpL2NhbXBhaWduX2VkaXRvci8ke2FyZ3MuY2FtcGFpZ25FZGl0b3JDYW1wYWlnbklkfS9wZXJrcy8ke2FyZ3MuaWR9YDtcbn1cbmV4cG9ydCBmdW5jdGlvbiBwcml2YXRlQXBpQ2FtcGFpZ25FZGl0b3JQZXJrc1BhdGgoYXJncykge1xuICByZXR1cm4gYC9wcml2YXRlX2FwaS9jYW1wYWlnbl9lZGl0b3IvJHthcmdzLmNhbXBhaWduRWRpdG9yQ2FtcGFpZ25JZH0vcGVya3NgO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHByaXZhdGVBcGlDYW1wYWlnbkVtYWlsU3Vic2NyaWJlcnNQYXRoKGFyZ3MpIHtcbiAgcmV0dXJuIGAvcHJpdmF0ZV9hcGkvY2FtcGFpZ25zLyR7YXJncy5jYW1wYWlnbklkfS9lbWFpbF9zdWJzY3JpYmVyc2A7XG59XG5leHBvcnQgZnVuY3Rpb24gcHJpdmF0ZUFwaUNhbXBhaWduRnVuZHNQYXRoKGFyZ3MpIHtcbiAgcmV0dXJuIGAvcHJpdmF0ZV9hcGkvY2FtcGFpZ25zLyR7YXJncy5jYW1wYWlnbklkfS9mdW5kc2A7XG59XG5leHBvcnQgZnVuY3Rpb24gcHJpdmF0ZUFwaUNhbXBhaWduR2FsbGVyeVBhdGgoYXJncykge1xuICByZXR1cm4gYC9wcml2YXRlX2FwaS9jYW1wYWlnbnMvJHthcmdzLmNhbXBhaWduSWR9L2dhbGxlcnlgO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHByaXZhdGVBcGlDYW1wYWlnbklkZW50aXR5VmVyaWZpY2F0aW9uUGF0aChhcmdzKSB7XG4gIHJldHVybiBgL3ByaXZhdGVfYXBpL2NhbXBhaWducy8ke2FyZ3MuY2FtcGFpZ25JZH0vaWRlbnRpdHlfdmVyaWZpY2F0aW9uYDtcbn1cbmV4cG9ydCBmdW5jdGlvbiBwcml2YXRlQXBpQ2FtcGFpZ25PcmRlclBhdGgoYXJncykge1xuICByZXR1cm4gYC9wcml2YXRlX2FwaS9jYW1wYWlnbnMvJHthcmdzLmNhbXBhaWduSWR9L29yZGVycy8ke2FyZ3MuaWR9YDtcbn1cbmV4cG9ydCBmdW5jdGlvbiBwcml2YXRlQXBpQ2FtcGFpZ25PcmRlcnNQYXRoKGFyZ3MpIHtcbiAgcmV0dXJuIGAvcHJpdmF0ZV9hcGkvY2FtcGFpZ25zLyR7YXJncy5jYW1wYWlnbklkfS9vcmRlcnNgO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHByaXZhdGVBcGlDYW1wYWlnblBheW91dFJlY29yZHNQYXRoKGFyZ3MpIHtcbiAgcmV0dXJuIGAvcHJpdmF0ZV9hcGkvY2FtcGFpZ25zLyR7YXJncy5jYW1wYWlnbklkfS9wYXlvdXRfcmVjb3Jkc2A7XG59XG5leHBvcnQgZnVuY3Rpb24gcHJpdmF0ZUFwaUNhbXBhaWduUGVya0l0ZW1QYXRoKGFyZ3MpIHtcbiAgcmV0dXJuIGAvcHJpdmF0ZV9hcGkvY2FtcGFpZ25zLyR7YXJncy5jYW1wYWlnbklkfS9wZXJrX2l0ZW1zLyR7YXJncy5pZH1gO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHByaXZhdGVBcGlDYW1wYWlnblBlcmtJdGVtc1BhdGgoYXJncykge1xuICByZXR1cm4gYC9wcml2YXRlX2FwaS9jYW1wYWlnbnMvJHthcmdzLmNhbXBhaWduSWR9L3BlcmtfaXRlbXNgO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHByaXZhdGVBcGlDYW1wYWlnblBlcmtJdGVtc0VsaWdpYmlsaXR5UGF0aChhcmdzKSB7XG4gIHJldHVybiBgL3ByaXZhdGVfYXBpL2NhbXBhaWducy8ke2FyZ3MuY2FtcGFpZ25JZH0vcGVya19pdGVtc19lbGlnaWJpbGl0eWA7XG59XG5leHBvcnQgZnVuY3Rpb24gcHJpdmF0ZUFwaUNhbXBhaWduUGVya3NQYXRoKGFyZ3MpIHtcbiAgcmV0dXJuIGAvcHJpdmF0ZV9hcGkvY2FtcGFpZ25zLyR7YXJncy5jYW1wYWlnbklkfS9wZXJrc2A7XG59XG5leHBvcnQgZnVuY3Rpb24gcHJpdmF0ZUFwaUNhbXBhaWduUGxlZGdlc1BhdGgoYXJncykge1xuICByZXR1cm4gYC9wcml2YXRlX2FwaS9jYW1wYWlnbnMvJHthcmdzLmNhbXBhaWduSWR9L3BsZWRnZXNgO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHByaXZhdGVBcGlDYW1wYWlnblN1YnNjcmliZVBhdGgoYXJncykge1xuICByZXR1cm4gYC9wcml2YXRlX2FwaS9jYW1wYWlnbnMvJHthcmdzLmNhbXBhaWduSWR9L3N1YnNjcmliZWA7XG59XG5leHBvcnQgZnVuY3Rpb24gcHJpdmF0ZUFwaUNhbXBhaWduVXBkYXRlUGF0aChhcmdzKSB7XG4gIHJldHVybiBgL3ByaXZhdGVfYXBpL2NhbXBhaWducy8ke2FyZ3MuY2FtcGFpZ25JZH0vdXBkYXRlcy8ke2FyZ3MuaWR9YDtcbn1cbmV4cG9ydCBmdW5jdGlvbiBwcml2YXRlQXBpQ2FtcGFpZ25VcGRhdGVzUGF0aChhcmdzKSB7XG4gIHJldHVybiBgL3ByaXZhdGVfYXBpL2NhbXBhaWducy8ke2FyZ3MuY2FtcGFpZ25JZH0vdXBkYXRlc2A7XG59XG5leHBvcnQgZnVuY3Rpb24gcHJpdmF0ZUFwaUNhbXBhaWduc1BhdGgoKSB7XG4gIHJldHVybiBgL3ByaXZhdGVfYXBpL2NhbXBhaWduc2A7XG59XG5leHBvcnQgZnVuY3Rpb24gcHJpdmF0ZUFwaUNvbW1hbmRDZW50ZXJBbmFseXRpY3NQYXRoKGFyZ3MpIHtcbiAgcmV0dXJuIGAvcHJpdmF0ZV9hcGkvY29tbWFuZF9jZW50ZXIvJHthcmdzLmNvbW1hbmRDZW50ZXJJZH0vYW5hbHl0aWNzYDtcbn1cbmV4cG9ydCBmdW5jdGlvbiBwcml2YXRlQXBpQ29tbWFuZENlbnRlckNvdW50cmllc1BhdGgoYXJncykge1xuICByZXR1cm4gYC9wcml2YXRlX2FwaS9jb21tYW5kX2NlbnRlci8ke2FyZ3MuY29tbWFuZENlbnRlcklkfS9jb3VudHJpZXNgO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHByaXZhdGVBcGlDb21tYW5kQ2VudGVyRG9tYWluc1BhdGgoYXJncykge1xuICByZXR1cm4gYC9wcml2YXRlX2FwaS9jb21tYW5kX2NlbnRlci8ke2FyZ3MuY29tbWFuZENlbnRlcklkfS9kb21haW5zYDtcbn1cbmV4cG9ydCBmdW5jdGlvbiBwcml2YXRlQXBpQ29tbWFuZENlbnRlckZ1bmRzUGF0aChhcmdzKSB7XG4gIHJldHVybiBgL3ByaXZhdGVfYXBpL2NvbW1hbmRfY2VudGVyLyR7YXJncy5jb21tYW5kQ2VudGVySWR9L2Z1bmRzYDtcbn1cbmV4cG9ydCBmdW5jdGlvbiBwcml2YXRlQXBpQ29tbWFuZENlbnRlclBlcmtzUGF0aChhcmdzKSB7XG4gIHJldHVybiBgL3ByaXZhdGVfYXBpL2NvbW1hbmRfY2VudGVyLyR7YXJncy5jb21tYW5kQ2VudGVySWR9L3BlcmtzYDtcbn1cbmV4cG9ydCBmdW5jdGlvbiBwcml2YXRlQXBpQ29tbWFuZENlbnRlclJlZmVycmVyc1BhdGgoYXJncykge1xuICByZXR1cm4gYC9wcml2YXRlX2FwaS9jb21tYW5kX2NlbnRlci8ke2FyZ3MuY29tbWFuZENlbnRlcklkfS9yZWZlcnJlcnNgO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHByaXZhdGVBcGlDb21tYW5kQ2VudGVyU3RhdHNQYXRoKGFyZ3MpIHtcbiAgcmV0dXJuIGAvcHJpdmF0ZV9hcGkvY29tbWFuZF9jZW50ZXIvJHthcmdzLmNvbW1hbmRDZW50ZXJJZH0vc3RhdHNgO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHByaXZhdGVBcGlDb250YWN0c1BhdGgoKSB7XG4gIHJldHVybiBgL3ByaXZhdGVfYXBpL2NvbnRhY3RzYDtcbn1cbmV4cG9ydCBmdW5jdGlvbiBwcml2YXRlQXBpRW1haWxDb250YWN0c1BhdGgoKSB7XG4gIHJldHVybiBgL3ByaXZhdGVfYXBpL2VtYWlsX2NvbnRhY3RzYDtcbn1cbmV4cG9ydCBmdW5jdGlvbiBwcml2YXRlQXBpRXhwZXJpbWVudFBhdGgoYXJncykge1xuICByZXR1cm4gYC9wcml2YXRlX2FwaS9leHBlcmltZW50cy8ke2FyZ3MuaWR9YDtcbn1cbmV4cG9ydCBmdW5jdGlvbiBwcml2YXRlQXBpRXhwZXJpbWVudHNGZXRjaEFuZFVwZGF0ZVBhdGgoKSB7XG4gIHJldHVybiBgL3ByaXZhdGVfYXBpL2V4cGVyaW1lbnRzL2ZldGNoX2FuZF91cGRhdGVgO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHByaXZhdGVBcGlFeHBsb3JlUGF0aCgpIHtcbiAgcmV0dXJuIGAvcHJpdmF0ZV9hcGkvZXhwbG9yZWA7XG59XG5leHBvcnQgZnVuY3Rpb24gcHJpdmF0ZUFwaUV4cGxvcmVDb2xsZWN0aW9uc1BhdGgoKSB7XG4gIHJldHVybiBgL3ByaXZhdGVfYXBpL2V4cGxvcmUvY29sbGVjdGlvbnNgO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHByaXZhdGVBcGlFeHBsb3JlU3RhdHNQYXRoKCkge1xuICByZXR1cm4gYC9wcml2YXRlX2FwaS9leHBsb3JlL3N0YXRzYDtcbn1cbmV4cG9ydCBmdW5jdGlvbiBwcml2YXRlQXBpRXh0ZXJuYWxDYW1wYWlnblBhdGgoYXJncykge1xuICByZXR1cm4gYC9wcml2YXRlX2FwaS9leHRlcm5hbF9jYW1wYWlnbnMvJHthcmdzLmlkfWA7XG59XG5leHBvcnQgZnVuY3Rpb24gcHJpdmF0ZUFwaUV4dGVybmFsQ2FtcGFpZ25zUGF0aCgpIHtcbiAgcmV0dXJuIGAvcHJpdmF0ZV9hcGkvZXh0ZXJuYWxfY2FtcGFpZ25zYDtcbn1cbmV4cG9ydCBmdW5jdGlvbiBwcml2YXRlQXBpRmFjZWJvb2tDb3VudFBhdGgoYXJncykge1xuICByZXR1cm4gYC9wcml2YXRlX2FwaS9mYWNlYm9va19jb3VudC8ke2FyZ3MuaWR9YDtcbn1cbmV4cG9ydCBmdW5jdGlvbiBwcml2YXRlQXBpRmJEeW5hbWljUHJvZHVjdEFkUGF0aChhcmdzKSB7XG4gIHJldHVybiBgL3ByaXZhdGVfYXBpL2ZiX2R5bmFtaWNfcHJvZHVjdF9hZHMvJHthcmdzLmlkfWA7XG59XG5leHBvcnQgZnVuY3Rpb24gcHJpdmF0ZUFwaUZiRHluYW1pY1Byb2R1Y3RBZHNQYXRoKCkge1xuICByZXR1cm4gYC9wcml2YXRlX2FwaS9mYl9keW5hbWljX3Byb2R1Y3RfYWRzYDtcbn1cbmV4cG9ydCBmdW5jdGlvbiBwcml2YXRlQXBpRnVuZHJhaXNlckRhc2hib2FyZERpc2J1cnNlbWVudEluZm9QYXRoKGFyZ3MpIHtcbiAgcmV0dXJuIGAvcHJpdmF0ZV9hcGkvZnVuZHJhaXNlci8ke2FyZ3MuZnVuZHJhaXNlcklkfS9kYXNoYm9hcmQvZGlzYnVyc2VtZW50X2luZm9gO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHByaXZhdGVBcGlIb21lUGF0aCgpIHtcbiAgcmV0dXJuIGAvcHJpdmF0ZV9hcGkvaG9tZWA7XG59XG5leHBvcnQgZnVuY3Rpb24gcHJpdmF0ZUFwaUhvbWVQZXJrc1BhdGgoKSB7XG4gIHJldHVybiBgL3ByaXZhdGVfYXBpL2hvbWUvcGVya3NgO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHByaXZhdGVBcGlIb21lU2xvdHNQYXRoKCkge1xuICByZXR1cm4gYC9wcml2YXRlX2FwaS9ob21lL3Nsb3RzYDtcbn1cbmV4cG9ydCBmdW5jdGlvbiBwcml2YXRlQXBpSm9iU3RhdHVzUGF0aChhcmdzKSB7XG4gIHJldHVybiBgL3ByaXZhdGVfYXBpL2pvYl9zdGF0dXNlcy8ke2FyZ3MuaWR9YDtcbn1cbmV4cG9ydCBmdW5jdGlvbiBwcml2YXRlQXBpUGFydG5lclRlYW1JbnZpdGF0aW9uUGF0aChhcmdzKSB7XG4gIHJldHVybiBgL3ByaXZhdGVfYXBpL3BhcnRuZXJzLyR7YXJncy5wYXJ0bmVySWR9L3RlYW1faW52aXRhdGlvbnMvJHthcmdzLmlkfWA7XG59XG5leHBvcnQgZnVuY3Rpb24gcHJpdmF0ZUFwaVBhcnRuZXJUZWFtSW52aXRhdGlvbnNQYXRoKGFyZ3MpIHtcbiAgcmV0dXJuIGAvcHJpdmF0ZV9hcGkvcGFydG5lcnMvJHthcmdzLnBhcnRuZXJJZH0vdGVhbV9pbnZpdGF0aW9uc2A7XG59XG5leHBvcnQgZnVuY3Rpb24gcHJpdmF0ZUFwaVBhcnRuZXJUZWFtTWVtYmVyUGF0aChhcmdzKSB7XG4gIHJldHVybiBgL3ByaXZhdGVfYXBpL3BhcnRuZXJzLyR7YXJncy5wYXJ0bmVySWR9L3RlYW1fbWVtYmVycy8ke2FyZ3MuaWR9YDtcbn1cbmV4cG9ydCBmdW5jdGlvbiBwcml2YXRlQXBpUGF5bWVudHNDcmVkaXRDYXJkc05ld1BhdGgoKSB7XG4gIHJldHVybiBgL3ByaXZhdGVfYXBpL3BheW1lbnRzL2NyZWRpdF9jYXJkcy9uZXdgO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHByaXZhdGVBcGlQYXltZW50c0NyZWRpdENhcmRzU2F2ZWRQYXRoKCkge1xuICByZXR1cm4gYC9wcml2YXRlX2FwaS9wYXltZW50cy9jcmVkaXRfY2FyZHMvc2F2ZWRgO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHByaXZhdGVBcGlQYXltZW50c0d1ZXN0U2lnbnVwc1BhdGgoKSB7XG4gIHJldHVybiBgL3ByaXZhdGVfYXBpL3BheW1lbnRzL2d1ZXN0X3NpZ251cHNgO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHByaXZhdGVBcGlQYXltZW50c1BheXBhbFBhdGgoKSB7XG4gIHJldHVybiBgL3ByaXZhdGVfYXBpL3BheW1lbnRzL3BheXBhbGA7XG59XG5leHBvcnQgZnVuY3Rpb24gcHJpdmF0ZUFwaVBheW1lbnRzUHJvamVjdFBhdGgoYXJncykge1xuICByZXR1cm4gYC9wcml2YXRlX2FwaS9wYXltZW50cy9wcm9qZWN0cy8ke2FyZ3MuaWR9YDtcbn1cbmV4cG9ydCBmdW5jdGlvbiBwcml2YXRlQXBpUGVya0l0ZW1zUGF0aChhcmdzKSB7XG4gIHJldHVybiBgL3ByaXZhdGVfYXBpL3BlcmtzLyR7YXJncy5wZXJrSWR9L2l0ZW1zYDtcbn1cbmV4cG9ydCBmdW5jdGlvbiBwcml2YXRlQXBpUHJvZmlsZVBhdGgoYXJncykge1xuICByZXR1cm4gYC9wcml2YXRlX2FwaS9wcm9maWxlcy8ke2FyZ3MuaWR9YDtcbn1cbmV4cG9ydCBmdW5jdGlvbiBwcml2YXRlQXBpUHJvZmlsZUNvbW1lbnRzUGF0aChhcmdzKSB7XG4gIHJldHVybiBgL3ByaXZhdGVfYXBpL3Byb2ZpbGVzLyR7YXJncy5wcm9maWxlSWR9L2NvbW1lbnRzYDtcbn1cbmV4cG9ydCBmdW5jdGlvbiBwcml2YXRlQXBpUHJvZmlsZUVtYWlsUHJlZmVyZW5jZXNQYXRoKGFyZ3MpIHtcbiAgcmV0dXJuIGAvcHJpdmF0ZV9hcGkvcHJvZmlsZXMvJHthcmdzLnByb2ZpbGVJZH0vZW1haWxfcHJlZmVyZW5jZXNgO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHByaXZhdGVBcGlQcm9maWxlRmFjZWJvb2tzUGF0aChhcmdzKSB7XG4gIHJldHVybiBgL3ByaXZhdGVfYXBpL3Byb2ZpbGVzLyR7YXJncy5wcm9maWxlSWR9L2ZhY2Vib29rc2A7XG59XG5leHBvcnQgZnVuY3Rpb24gcHJpdmF0ZUFwaVByb2ZpbGVMaW5rZWRpbnNQYXRoKGFyZ3MpIHtcbiAgcmV0dXJuIGAvcHJpdmF0ZV9hcGkvcHJvZmlsZXMvJHthcmdzLnByb2ZpbGVJZH0vbGlua2VkaW5zYDtcbn1cbmV4cG9ydCBmdW5jdGlvbiBwcml2YXRlQXBpUHJvamVjdHNQYXRoKGFyZ3MpIHtcbiAgcmV0dXJuIGAvcHJpdmF0ZV9hcGkvcHJvamVjdHMvJHthcmdzLmlkfWA7XG59XG5leHBvcnQgZnVuY3Rpb24gcHJpdmF0ZUFwaVByb2plY3RzQXV0b21hdGljRmFjZWJvb2tQb3N0c1BhdGgoYXJncykge1xuICByZXR1cm4gYC9wcml2YXRlX2FwaS9wcm9qZWN0cy8ke2FyZ3MuaWR9L2F1dG9tYXRpY19mYWNlYm9va19wb3N0c2A7XG59XG5leHBvcnQgZnVuY3Rpb24gcHJpdmF0ZUFwaVByb2plY3RzQ2FtcGFpZ25NZXNzYWdlc1BhdGgoYXJncykge1xuICByZXR1cm4gYC9wcml2YXRlX2FwaS9wcm9qZWN0cy8ke2FyZ3MuaWR9L2NhbXBhaWduX21lc3NhZ2VzYDtcbn1cbmV4cG9ydCBmdW5jdGlvbiBwcml2YXRlQXBpU2VhcmNoUGF0aCgpIHtcbiAgcmV0dXJuIGAvcHJpdmF0ZV9hcGkvc2VhcmNoYDtcbn1cbmV4cG9ydCBmdW5jdGlvbiBwcml2YXRlQXBpU2ltcGxlQ2FtcGFpZ25QYXRoKGFyZ3MpIHtcbiAgcmV0dXJuIGAvcHJpdmF0ZV9hcGkvc2ltcGxlX2NhbXBhaWducy8ke2FyZ3MuaWR9YDtcbn1cbmV4cG9ydCBmdW5jdGlvbiBwcm9kdWN0U3RhZ2VzUHJpdmF0ZUFwaUFkbWluUHJvamVjdFBhdGgoYXJncykge1xuICByZXR1cm4gYC9wcml2YXRlX2FwaS9hZG1pbi9wcm9qZWN0cy8ke2FyZ3MuaWR9L3Byb2R1Y3Rfc3RhZ2VzYDtcbn1cbmV4cG9ydCBmdW5jdGlvbiBwcm9qZWN0VG9kb0l0ZW1zUHJpdmF0ZUFwaVByb2plY3RzUGF0aChhcmdzKSB7XG4gIHJldHVybiBgL3ByaXZhdGVfYXBpL3Byb2plY3RzLyR7YXJncy5pZH0vdG9kb19pdGVtcy8ke2FyZ3MuaXRlbU5hbWV9YDtcbn1cbmV4cG9ydCBmdW5jdGlvbiBwcm9tb3RlUHJpdmF0ZUFwaVBhcnRuZXJUZWFtTWVtYmVyUGF0aChhcmdzKSB7XG4gIHJldHVybiBgL3ByaXZhdGVfYXBpL3BhcnRuZXJzLyR7YXJncy5wYXJ0bmVySWR9L3RlYW1fbWVtYmVycy8ke2FyZ3MuaWR9L3Byb21vdGVgO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHB1Ymxpc2hQcml2YXRlQXBpQ2FtcGFpZ25QYXRoKGFyZ3MpIHtcbiAgcmV0dXJuIGAvcHJpdmF0ZV9hcGkvY2FtcGFpZ25zLyR7YXJncy5pZH0vcHVibGlzaGA7XG59XG5leHBvcnQgZnVuY3Rpb24gcHVibGlzaFByaXZhdGVBcGlFeHRlcm5hbENhbXBhaWduUGF0aChhcmdzKSB7XG4gIHJldHVybiBgL3ByaXZhdGVfYXBpL2V4dGVybmFsX2NhbXBhaWducy8ke2FyZ3MuaWR9L3B1Ymxpc2hgO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHB1Ymxpc2hQcml2YXRlQXBpU2ltcGxlQ2FtcGFpZ25QYXRoKGFyZ3MpIHtcbiAgcmV0dXJuIGAvcHJpdmF0ZV9hcGkvc2ltcGxlX2NhbXBhaWducy8ke2FyZ3MuaWR9L3B1Ymxpc2hgO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHJlY29tbWVuZGF0aW9uc1ByaXZhdGVBcGlDYW1wYWlnblBhdGgoYXJncykge1xuICByZXR1cm4gYC9wcml2YXRlX2FwaS9jYW1wYWlnbnMvJHthcmdzLmlkfS9yZWNvbW1lbmRhdGlvbnNgO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHJlZnVuZFByaXZhdGVBcGlDYW1wYWlnbkNvbnRyaWJ1dGlvblBhdGgoYXJncykge1xuICByZXR1cm4gYC9wcml2YXRlX2FwaS9jYW1wYWlnbnMvJHthcmdzLmNhbXBhaWduSWR9L2NvbnRyaWJ1dGlvbnMvJHthcmdzLmlkfS9yZWZ1bmRgO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHJlc2VuZENvbmZpcm1hdGlvbkVtYWlsUHJpdmF0ZUFwaUFjY291bnRQYXRoKGFyZ3MpIHtcbiAgcmV0dXJuIGAvcHJpdmF0ZV9hcGkvYWNjb3VudHMvJHthcmdzLmlkfS9yZXNlbmRfY29uZmlybWF0aW9uX2VtYWlsYDtcbn1cbmV4cG9ydCBmdW5jdGlvbiByZXNlbmRDb25maXJtYXRpb25FbWFpbFByaXZhdGVBcGlDYW1wYWlnbk9yZGVyUGF0aChhcmdzKSB7XG4gIHJldHVybiBgL3ByaXZhdGVfYXBpL2NhbXBhaWducy8ke2FyZ3MuY2FtcGFpZ25JZH0vb3JkZXJzLyR7YXJncy5pZH0vcmVzZW5kX2NvbmZpcm1hdGlvbl9lbWFpbGA7XG59XG5leHBvcnQgZnVuY3Rpb24gcmVzZW5kUHJpdmF0ZUFwaVBhcnRuZXJUZWFtSW52aXRhdGlvblBhdGgoYXJncykge1xuICByZXR1cm4gYC9wcml2YXRlX2FwaS9wYXJ0bmVycy8ke2FyZ3MucGFydG5lcklkfS90ZWFtX2ludml0YXRpb25zLyR7YXJncy5pZH0vcmVzZW5kYDtcbn1cbmV4cG9ydCBmdW5jdGlvbiBzY2hlZHVsZU5leHRQb3N0RGF0ZVByaXZhdGVBcGlQcm9qZWN0c0F1dG9tYXRpY0ZhY2Vib29rUG9zdHNQYXRoKGFyZ3MpIHtcbiAgcmV0dXJuIGAvcHJpdmF0ZV9hcGkvcHJvamVjdHMvJHthcmdzLmlkfS9hdXRvbWF0aWNfZmFjZWJvb2tfcG9zdHMvc2NoZWR1bGVfbmV4dF9wb3N0X2RhdGVgO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHNlYXJjaFByaXZhdGVBcGlUYWdzUGF0aCgpIHtcbiAgcmV0dXJuIGAvcHJpdmF0ZV9hcGkvdGFncy9zZWFyY2hgO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHNlbmRBbGxDb25maXJtYXRpb25FbWFpbHNQcml2YXRlQXBpQ2FtcGFpZ25PcmRlcnNQYXRoKGFyZ3MpIHtcbiAgcmV0dXJuIGAvcHJpdmF0ZV9hcGkvY2FtcGFpZ25zLyR7YXJncy5jYW1wYWlnbklkfS9vcmRlcnMvc2VuZF9hbGxfY29uZmlybWF0aW9uX2VtYWlsc2A7XG59XG5leHBvcnQgZnVuY3Rpb24gc2VuZEVtYWlsUHJpdmF0ZUFwaUNvbnRhY3RzUGF0aCgpIHtcbiAgcmV0dXJuIGAvcHJpdmF0ZV9hcGkvY29udGFjdHMvc2VuZF9lbWFpbGA7XG59XG5leHBvcnQgZnVuY3Rpb24gc2VuZFByZXZpZXdQcml2YXRlQXBpQ2FtcGFpZ25VcGRhdGVzUGF0aChhcmdzKSB7XG4gIHJldHVybiBgL3ByaXZhdGVfYXBpL2NhbXBhaWducy8ke2FyZ3MuY2FtcGFpZ25JZH0vdXBkYXRlcy9zZW5kX3ByZXZpZXdgO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHNldEZlZVByaXZhdGVBcGlFeHRlcm5hbENhbXBhaWduUGF0aChhcmdzKSB7XG4gIHJldHVybiBgL3ByaXZhdGVfYXBpL2V4dGVybmFsX2NhbXBhaWducy8ke2FyZ3MuaWR9L3NldF9mZWVgO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHNldFRvcFBlcmtQcml2YXRlQXBpQ2FtcGFpZ25FZGl0b3JQZXJrc1BhdGgoYXJncykge1xuICByZXR1cm4gYC9wcml2YXRlX2FwaS9jYW1wYWlnbl9lZGl0b3IvJHthcmdzLmNhbXBhaWduRWRpdG9yQ2FtcGFpZ25JZH0vcGVya3Mvc2V0X3RvcF9wZXJrYDtcbn1cbmV4cG9ydCBmdW5jdGlvbiBzcGxpdEJ1Y2tldFByaXZhdGVBcGlDYW1wYWlnblBhdGgoYXJncykge1xuICByZXR1cm4gYC9wcml2YXRlX2FwaS9jYW1wYWlnbnMvJHthcmdzLmlkfS9zcGxpdF9idWNrZXRgO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHN1Ym1pdEZvckFwcHJvdmFsUHJpdmF0ZUFwaUNhbXBhaWduUGF0aChhcmdzKSB7XG4gIHJldHVybiBgL3ByaXZhdGVfYXBpL2NhbXBhaWducy8ke2FyZ3MuaWR9L3N1Ym1pdF9mb3JfYXBwcm92YWxgO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHRvZ2dsZVNwYW1Qcml2YXRlQXBpQ2FtcGFpZ25Db21tZW50c1BhdGgoYXJncykge1xuICByZXR1cm4gYC9wcml2YXRlX2FwaS9jYW1wYWlnbnMvJHthcmdzLmNhbXBhaWduSWR9L2NvbW1lbnRzL3RvZ2dsZV9zcGFtYDtcbn1cbmV4cG9ydCBmdW5jdGlvbiB1bmZvbGxvd1ByaXZhdGVBcGlDYW1wYWlnbkNvbGxlY3Rpb25QYXRoKGFyZ3MpIHtcbiAgcmV0dXJuIGAvcHJpdmF0ZV9hcGkvY2FtcGFpZ25fY29sbGVjdGlvbnMvJHthcmdzLmlkfS91bmZvbGxvd2A7XG59XG5leHBvcnQgZnVuY3Rpb24gdW5mb2xsb3dQcml2YXRlQXBpUHJvamVjdHNQYXRoKGFyZ3MpIHtcbiAgcmV0dXJuIGAvcHJpdmF0ZV9hcGkvcHJvamVjdHMvJHthcmdzLmlkfS91bmZvbGxvd2A7XG59XG5leHBvcnQgZnVuY3Rpb24gdXBkYXRlQ2xvdWRpbmFyeUltYWdlUHJpdmF0ZUFwaVByb2ZpbGVQYXRoKGFyZ3MpIHtcbiAgcmV0dXJuIGAvcHJpdmF0ZV9hcGkvcHJvZmlsZXMvJHthcmdzLmlkfS91cGRhdGVfY2xvdWRpbmFyeV9pbWFnZWA7XG59XG5leHBvcnQgZnVuY3Rpb24gdXBkYXRlRGVhZGxpbmVQcml2YXRlQXBpQ2FtcGFpZ25QYXRoKGFyZ3MpIHtcbiAgcmV0dXJuIGAvcHJpdmF0ZV9hcGkvY2FtcGFpZ25zLyR7YXJncy5pZH0vdXBkYXRlX2RlYWRsaW5lYDtcbn1cbmV4cG9ydCBmdW5jdGlvbiB2ZXJpZnlQYXlwYWxQcml2YXRlQXBpQ2FtcGFpZ25QYXRoKGFyZ3MpIHtcbiAgcmV0dXJuIGAvcHJpdmF0ZV9hcGkvY2FtcGFpZ25zLyR7YXJncy5pZH0vdmVyaWZ5X3BheXBhbGA7XG59XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiAuL34vdHNsaW50LWxvYWRlciEuL2NvbXBvbmVudHMvcm91dGVzL3ByaXZhdGUtYXBpLnRzXG4gKiovIl0sIm1hcHBpbmdzIjoiO0FBQUE7QUFDQTtBQUNBO0FBRkE7QUFHQTtBQUNBO0FBQ0E7QUFGQTtBQUdBO0FBQ0E7QUFDQTtBQUZBO0FBR0E7QUFDQTtBQUNBO0FBRkE7QUFHQTtBQUNBO0FBQ0E7QUFGQTtBQUdBO0FBQ0E7QUFDQTtBQUZBO0FBR0E7QUFDQTtBQUNBO0FBRkE7QUFHQTtBQUNBO0FBQ0E7QUFGQTtBQUdBO0FBQ0E7QUFDQTtBQUZBO0FBR0E7QUFDQTtBQUNBO0FBRkE7QUFHQTtBQUNBO0FBQ0E7QUFGQTtBQUdBO0FBQ0E7QUFDQTtBQUZBO0FBR0E7QUFDQTtBQUNBO0FBRkE7QUFHQTtBQUNBO0FBQ0E7QUFGQTtBQUdBO0FBQ0E7QUFDQTtBQUZBO0FBR0E7QUFDQTtBQUNBO0FBRkE7QUFHQTtBQUNBO0FBQ0E7QUFGQTtBQUdBO0FBQ0E7QUFDQTtBQUZBO0FBR0E7QUFDQTtBQUNBO0FBRkE7QUFHQTtBQUNBO0FBQ0E7QUFGQTtBQUdBO0FBQ0E7QUFDQTtBQUZBO0FBR0E7QUFDQTtBQUNBO0FBRkE7QUFHQTtBQUNBO0FBQ0E7QUFGQTtBQUdBO0FBQ0E7QUFDQTtBQUZBO0FBR0E7QUFDQTtBQUNBO0FBRkE7QUFHQTtBQUNBO0FBQ0E7QUFGQTtBQUdBO0FBQ0E7QUFDQTtBQUZBO0FBR0E7QUFDQTtBQUNBO0FBRkE7QUFHQTtBQUNBO0FBQ0E7QUFGQTtBQUdBO0FBQ0E7QUFDQTtBQUZBO0FBR0E7QUFDQTtBQUNBO0FBRkE7QUFHQTtBQUNBO0FBQ0E7QUFGQTtBQUdBO0FBQ0E7QUFDQTtBQUZBO0FBR0E7QUFDQTtBQUNBO0FBRkE7QUFHQTtBQUNBO0FBQ0E7QUFGQTtBQUdBO0FBQ0E7QUFDQTtBQUZBO0FBR0E7QUFDQTtBQUNBO0FBRkE7QUFHQTtBQUNBO0FBQ0E7QUFGQTtBQUdBO0FBQ0E7QUFDQTtBQUZBO0FBR0E7QUFDQTtBQUNBO0FBRkE7QUFHQTtBQUNBO0FBQ0E7QUFGQTtBQUdBO0FBQ0E7QUFDQTtBQUZBO0FBR0E7QUFDQTtBQUNBO0FBRkE7QUFHQTtBQUNBO0FBQ0E7QUFGQTtBQUdBO0FBQ0E7QUFDQTtBQUZBO0FBR0E7QUFDQTtBQUNBO0FBRkE7QUFHQTtBQUNBO0FBQ0E7QUFGQTtBQUdBO0FBQ0E7QUFDQTtBQUZBO0FBR0E7QUFDQTtBQUNBO0FBRkE7QUFHQTtBQUNBO0FBQ0E7QUFGQTtBQUdBO0FBQ0E7QUFDQTtBQUZBO0FBR0E7QUFDQTtBQUNBO0FBRkE7QUFHQTtBQUNBO0FBQ0E7QUFGQTtBQUdBO0FBQ0E7QUFDQTtBQUZBO0FBR0E7QUFDQTtBQUNBO0FBRkE7QUFHQTtBQUNBO0FBQ0E7QUFGQTtBQUdBO0FBQ0E7QUFDQTtBQUZBO0FBR0E7QUFDQTtBQUNBO0FBRkE7QUFHQTtBQUNBO0FBQ0E7QUFGQTtBQUdBO0FBQ0E7QUFDQTtBQUZBO0FBR0E7QUFDQTtBQUNBO0FBRkE7QUFHQTtBQUNBO0FBQ0E7QUFGQTtBQUdBO0FBQ0E7QUFDQTtBQUZBO0FBR0E7QUFDQTtBQUNBO0FBRkE7QUFHQTtBQUNBO0FBQ0E7QUFGQTtBQUdBO0FBQ0E7QUFDQTtBQUZBO0FBR0E7QUFDQTtBQUNBO0FBRkE7QUFHQTtBQUNBO0FBQ0E7QUFGQTtBQUdBO0FBQ0E7QUFDQTtBQUZBO0FBR0E7QUFDQTtBQUNBO0FBRkE7QUFHQTtBQUNBO0FBQ0E7QUFGQTtBQUdBO0FBQ0E7QUFDQTtBQUZBO0FBR0E7QUFDQTtBQUNBO0FBRkE7QUFHQTtBQUNBO0FBQ0E7QUFGQTtBQUdBO0FBQ0E7QUFDQTtBQUZBO0FBR0E7QUFDQTtBQUNBO0FBRkE7QUFHQTtBQUNBO0FBQ0E7QUFGQTtBQUdBO0FBQ0E7QUFDQTtBQUZBO0FBR0E7QUFDQTtBQUNBO0FBRkE7QUFHQTtBQUNBO0FBQ0E7QUFGQTtBQUdBO0FBQ0E7QUFDQTtBQUZBO0FBR0E7QUFDQTtBQUNBO0FBRkE7QUFHQTtBQUNBO0FBQ0E7QUFGQTtBQUdBO0FBQ0E7QUFDQTtBQUZBO0FBR0E7QUFDQTtBQUNBO0FBRkE7QUFHQTtBQUNBO0FBQ0E7QUFGQTtBQUdBO0FBQ0E7QUFDQTtBQUZBO0FBR0E7QUFDQTtBQUNBO0FBRkE7QUFHQTtBQUNBO0FBQ0E7QUFGQTtBQUdBO0FBQ0E7QUFDQTtBQUZBO0FBR0E7QUFDQTtBQUNBO0FBRkE7QUFHQTtBQUNBO0FBQ0E7QUFGQTtBQUdBO0FBQ0E7QUFDQTtBQUZBO0FBR0E7QUFDQTtBQUNBO0FBRkE7QUFHQTtBQUNBO0FBQ0E7QUFGQTtBQUdBO0FBQ0E7QUFDQTtBQUZBO0FBR0E7QUFDQTtBQUNBO0FBRkE7QUFHQTtBQUNBO0FBQ0E7QUFGQTtBQUdBO0FBQ0E7QUFDQTtBQUZBO0FBR0E7QUFDQTtBQUNBO0FBRkE7QUFHQTtBQUNBO0FBQ0E7QUFGQTtBQUdBO0FBQ0E7QUFDQTtBQUZBO0FBR0E7QUFDQTtBQUNBO0FBRkE7QUFHQTtBQUNBO0FBQ0E7QUFGQTtBQUdBO0FBQ0E7QUFDQTtBQUZBO0FBR0E7QUFDQTtBQUNBO0FBRkE7QUFHQTtBQUNBO0FBQ0E7QUFGQTtBQUdBO0FBQ0E7QUFDQTtBQUZBO0FBR0E7QUFDQTtBQUNBO0FBRkE7QUFHQTtBQUNBO0FBQ0E7QUFGQTtBQUdBO0FBQ0E7QUFDQTtBQUZBO0FBR0E7QUFDQTtBQUNBO0FBRkE7QUFHQTtBQUNBO0FBQ0E7QUFGQTtBQUdBO0FBQ0E7QUFDQTtBQUZBO0FBR0E7QUFDQTtBQUNBO0FBRkE7QUFHQTtBQUNBO0FBQ0E7QUFGQTtBQUdBO0FBQ0E7QUFDQTtBQUZBO0FBR0E7QUFDQTtBQUNBO0FBRkE7QUFHQTtBQUNBO0FBQ0E7QUFGQTtBQUdBO0FBQ0E7QUFDQTtBQUZBO0FBR0E7QUFDQTtBQUNBO0FBRkE7QUFHQTtBQUNBO0FBQ0E7QUFGQTtBQUdBO0FBQ0E7QUFDQTtBQUZBO0FBR0E7QUFDQTtBQUNBO0FBRkE7QUFHQTtBQUNBO0FBQ0E7QUFGQTtBQUdBO0FBQ0E7QUFDQTtBQUZBO0FBR0E7QUFDQTtBQUNBO0FBRkE7QUFHQTtBQUNBO0FBQ0E7QUFGQTtBQUdBO0FBQ0E7QUFDQTtBQUZBO0FBR0E7QUFDQTtBQUNBO0FBRkE7QUFHQTtBQUNBO0FBQ0E7QUFGQTtBQUdBO0FBQ0E7QUFDQTtBQUZBO0FBR0E7QUFDQTtBQUNBO0FBRkE7QUFHQTtBQUNBO0FBQ0E7QUFGQTtBQUdBO0FBQ0E7QUFDQTtBQUZBO0FBR0E7QUFDQTtBQUNBO0FBRkE7QUFHQTtBQUNBO0FBQ0E7QUFGQTtBQUdBO0FBQ0E7QUFDQTtBQUZBO0FBR0E7QUFDQTtBQUNBO0FBRkE7QUFHQTtBQUNBO0FBQ0E7QUFGQTtBQUdBO0FBQ0E7QUFDQTtBQUZBO0FBR0E7QUFDQTtBQUNBO0FBRkE7QUFHQTtBQUNBO0FBQ0E7QUFGQTtBQUdBO0FBQ0E7QUFDQTtBQUZBO0FBR0E7QUFDQTtBQUNBO0FBRkE7QUFHQTtBQUNBO0FBQ0E7QUFGQTtBQUdBO0FBQ0E7QUFDQTtBQUZBO0FBR0E7QUFDQTtBQUNBO0FBRkE7QUFHQTtBQUNBO0FBQ0E7QUFGQTtBQUdBO0FBQ0E7QUFDQTtBQUZBO0FBR0E7QUFDQTtBQUNBO0FBRkE7QUFHQTtBQUNBO0FBQ0E7QUFGQTtBQUdBO0FBQ0E7QUFDQTtBQUZBO0FBR0E7QUFDQTtBQUNBO0FBRkE7QUFHQTtBQUNBO0FBQ0E7QUFGQTtBQUdBO0FBQ0E7QUFDQTtBQUZBO0FBR0E7QUFDQTtBQUNBO0FBRkE7QUFHQTtBQUNBO0FBQ0E7QUFGQTtBQUdBO0FBQ0E7QUFDQTtBQUZBO0FBR0E7QUFDQTtBQUNBO0FBRkE7QUFHQTtBQUNBO0FBQ0E7QUFGQTtBQUdBO0FBQ0E7QUFDQTtBQUZBO0FBR0E7QUFDQTtBQUNBO0FBRkE7QUFHQTtBQUNBO0FBQ0E7QUFGQTsiLCJzb3VyY2VSb290IjoiIn0=");

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

	eval("\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = startsWith;\n/*@ngInject*/\nfunction startsWith() {\n  return function (actual, expected) {\n    var lowerStr = (actual + \"\").toLowerCase();\n    return lowerStr.indexOf(expected.toLowerCase()) === 0;\n  };\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTczLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vYW5jaWxsYXJ5L3V0aWxzL3N0YXJ0cy13aXRoLWZhY3RvcnkuanM/MzE5OSJdLCJzb3VyY2VzQ29udGVudCI6WyIvKkBuZ0luamVjdCovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBzdGFydHNXaXRoKCkge1xuICAgIHJldHVybiBmdW5jdGlvbiAoYWN0dWFsLCBleHBlY3RlZCkge1xuICAgICAgdmFyIGxvd2VyU3RyID0gKGFjdHVhbCArIFwiXCIpLnRvTG93ZXJDYXNlKCk7XG4gICAgICByZXR1cm4gbG93ZXJTdHIuaW5kZXhPZihleHBlY3RlZC50b0xvd2VyQ2FzZSgpKSA9PT0gMDtcbiAgICB9O1xuICB9XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiAuL2FuY2lsbGFyeS91dGlscy9zdGFydHMtd2l0aC1mYWN0b3J5LmpzXG4gKiovIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFKQTtBQUNBO0FBQ0E7QUFDQTs7QUFIQSIsInNvdXJjZVJvb3QiOiIifQ==");

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

	eval("'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = stripTags;\n/*@ngInject*/\nfunction stripTags() {\n  return function (html) {\n    return $('<div>' + html + '</div>').text().replace(/\\t+/g, \" \").replace(/\\n/g, \"\").replace(/^\\s/g, \"\");\n  };\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTc0LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vYW5jaWxsYXJ5L3V0aWxzL3N0cmlwLXRhZ3MtZmFjdG9yeS5qcz9kNDU4Il0sInNvdXJjZXNDb250ZW50IjpbIi8qQG5nSW5qZWN0Ki9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHN0cmlwVGFncygpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKGh0bWwpIHtcbiAgICByZXR1cm4gJCgnPGRpdj4nICsgaHRtbCArICc8L2Rpdj4nKS50ZXh0KCkucmVwbGFjZSgvXFx0Ky9nLCBcIiBcIikucmVwbGFjZSgvXFxuL2csIFwiXCIpLnJlcGxhY2UoL15cXHMvZywgXCJcIik7XG4gIH07XG59XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiAuL2FuY2lsbGFyeS91dGlscy9zdHJpcC10YWdzLWZhY3RvcnkuanNcbiAqKi8iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUpBO0FBQ0E7QUFDQTs7QUFGQSIsInNvdXJjZVJvb3QiOiIifQ==");

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

	eval("'use strict';\n\nsvgIcon.$inject = [\"$sce\"];\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = svgIcon;\n/*@ngInject*/\nfunction svgIcon($sce) {\n  return {\n    template: '<svg><use xlink:href=\"{{iconName}}\"></svg>',\n    scope: { icon: '@' },\n    link: function link(scope) {\n      scope.iconName = $sce.trustAsResourceUrl('#' + scope.icon);\n    }\n  };\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTc1LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vYW5jaWxsYXJ5L3V0aWxzL3N2Zy1pY29uLWRpcmVjdGl2ZS5qcz8xMmM4Il0sInNvdXJjZXNDb250ZW50IjpbIi8qQG5nSW5qZWN0Ki9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHN2Z0ljb24oJHNjZSkge1xuICAgIHJldHVybiB7XG4gICAgICB0ZW1wbGF0ZTogJzxzdmc+PHVzZSB4bGluazpocmVmPVwie3tpY29uTmFtZX19XCI+PC9zdmc+JyxcbiAgICAgIHNjb3BlOiB7aWNvbjogJ0AnfSxcbiAgICAgIGxpbms6IGZ1bmN0aW9uKHNjb3BlKSB7XG4gICAgICAgIHNjb3BlLmljb25OYW1lID0gJHNjZS50cnVzdEFzUmVzb3VyY2VVcmwoJyMnICsgc2NvcGUuaWNvbik7XG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogLi9hbmNpbGxhcnkvdXRpbHMvc3ZnLWljb24tZGlyZWN0aXZlLmpzXG4gKiovIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBOztBQUNBO0FBQ0E7O0FBRUE7O0FBSkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFMQSIsInNvdXJjZVJvb3QiOiIifQ==");

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

	eval("'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = truncateFilter;\n/*@ngInject*/\nfunction truncateFilter() {\n  return function (text, length, end) {\n    if (isNaN(length)) {\n      length = 10;\n    }\n\n    if (_.isNull(text) || _.isUndefined(text)) {\n      return text;\n    }\n\n    if (end === undefined) {\n      end = '…';\n    }\n\n    if (text.length <= length || text.length - end.length <= length) {\n      return text;\n    } else {\n      return String(text).substring(0, length - end.length) + end;\n    }\n  };\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTc2LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vYW5jaWxsYXJ5L3V0aWxzL3RydW5jYXRlLWZpbHRlci5qcz9jMWI2Il0sInNvdXJjZXNDb250ZW50IjpbIi8qQG5nSW5qZWN0Ki9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHRydW5jYXRlRmlsdGVyKCkge1xuICByZXR1cm4gZnVuY3Rpb24odGV4dCwgbGVuZ3RoLCBlbmQpIHtcbiAgICBpZiAoaXNOYU4obGVuZ3RoKSkge1xuICAgICAgbGVuZ3RoID0gMTA7XG4gICAgfVxuXG4gICAgaWYgKF8uaXNOdWxsKHRleHQpIHx8IF8uaXNVbmRlZmluZWQodGV4dCkpIHtcbiAgICAgIHJldHVybiB0ZXh0O1xuICAgIH1cblxuICAgIGlmIChlbmQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgZW5kID0gJ+KApic7XG4gICAgfVxuXG4gICAgaWYgKHRleHQubGVuZ3RoIDw9IGxlbmd0aCB8fCB0ZXh0Lmxlbmd0aCAtIGVuZC5sZW5ndGggPD0gbGVuZ3RoKSB7XG4gICAgICByZXR1cm4gdGV4dDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIFN0cmluZyh0ZXh0KS5zdWJzdHJpbmcoMCwgbGVuZ3RoLWVuZC5sZW5ndGgpICsgZW5kO1xuICAgIH1cbiAgfTtcbn1cblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIC4vYW5jaWxsYXJ5L3V0aWxzL3RydW5jYXRlLWZpbHRlci5qc1xuICoqLyJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBSkE7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7OztBQUdBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBOzs7QUFqQkEiLCJzb3VyY2VSb290IjoiIn0=");

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

	eval("'use strict';\n\ntwitter.$inject = [\"$window\", \"$http\", \"$timeout\"];\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = twitter;\n/*@ngInject*/\nfunction twitter($window, $http, $timeout) {\n  return {\n    onTweet: function onTweet(callback) {\n      $window.twttr.ready(function (twttr) {\n        twttr.events.bind('tweet', callback);\n      });\n    },\n    refreshAllWidgets: function refreshAllWidgets() {\n      $window.twttr.ready(function (twttr) {\n        twttr.widgets.load();\n      });\n    },\n    countForUrl: function countForUrl(url) {\n      return $http.jsonp('https://urls.api.twitter.com/1/urls/count.json?url=' + $window.escape(url) + '&callback=JSON_CALLBACK').then(function (response) {\n        return response.data.count;\n      });\n    },\n    shareTwitter: function shareTwitter(url, text, from) {\n      var originalReferrer = from || $window.location.toString();\n      var escapedOriginalReferrer = $window.escape(originalReferrer);\n      var escapedUrl = $window.escape(url);\n      var shareUrl = 'https://twitter.com/intent/tweet?original_referer=' + escapedOriginalReferrer + '&text=' + text + '&url=' + escapedUrl + '&related=indiegogo%3AIndiegogo';\n\n      $timeout(function () {\n        // http://stackoverflow.com/a/18996042\n        $window.open(shareUrl, 'twitter_share', 'height=450, width=550');\n      });\n    }\n  };\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTc3LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vYW5jaWxsYXJ5L3V0aWxzL3R3aXR0ZXItZmFjdG9yeS5qcz82YjgxIl0sInNvdXJjZXNDb250ZW50IjpbIi8qQG5nSW5qZWN0Ki9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHR3aXR0ZXIoJHdpbmRvdywgJGh0dHAsICR0aW1lb3V0KSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG9uVHdlZXQ6IGZ1bmN0aW9uIChjYWxsYmFjaykge1xuICAgICAgICAkd2luZG93LnR3dHRyLnJlYWR5KGZ1bmN0aW9uICh0d3R0cikge1xuICAgICAgICAgIHR3dHRyLmV2ZW50cy5iaW5kKCd0d2VldCcsIGNhbGxiYWNrKTtcbiAgICAgICAgfSk7XG4gICAgICB9LFxuICAgICAgcmVmcmVzaEFsbFdpZGdldHM6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgJHdpbmRvdy50d3R0ci5yZWFkeShmdW5jdGlvbiAodHd0dHIpIHtcbiAgICAgICAgICB0d3R0ci53aWRnZXRzLmxvYWQoKTtcbiAgICAgICAgfSk7XG4gICAgICB9LFxuICAgICAgY291bnRGb3JVcmw6IGZ1bmN0aW9uKHVybCkge1xuICAgICAgICByZXR1cm4gJGh0dHAuanNvbnAoJ2h0dHBzOi8vdXJscy5hcGkudHdpdHRlci5jb20vMS91cmxzL2NvdW50Lmpzb24/dXJsPScgKyAkd2luZG93LmVzY2FwZSh1cmwpICsgJyZjYWxsYmFjaz1KU09OX0NBTExCQUNLJykudGhlbihmdW5jdGlvbihyZXNwb25zZSkge1xuICAgICAgICAgIHJldHVybiByZXNwb25zZS5kYXRhLmNvdW50O1xuICAgICAgICB9KTtcbiAgICAgIH0sXG4gICAgICBzaGFyZVR3aXR0ZXI6IGZ1bmN0aW9uKHVybCwgdGV4dCwgZnJvbSkge1xuICAgICAgICB2YXIgb3JpZ2luYWxSZWZlcnJlciA9IGZyb20gfHwgJHdpbmRvdy5sb2NhdGlvbi50b1N0cmluZygpO1xuICAgICAgICB2YXIgZXNjYXBlZE9yaWdpbmFsUmVmZXJyZXIgPSAgJHdpbmRvdy5lc2NhcGUob3JpZ2luYWxSZWZlcnJlcik7XG4gICAgICAgIHZhciBlc2NhcGVkVXJsID0gJHdpbmRvdy5lc2NhcGUodXJsKTtcbiAgICAgICAgdmFyIHNoYXJlVXJsID0gYGh0dHBzOi8vdHdpdHRlci5jb20vaW50ZW50L3R3ZWV0P29yaWdpbmFsX3JlZmVyZXI9JHsgZXNjYXBlZE9yaWdpbmFsUmVmZXJyZXIgfSZ0ZXh0PSR7dGV4dH0mdXJsPSR7ZXNjYXBlZFVybH0mcmVsYXRlZD1pbmRpZWdvZ28lM0FJbmRpZWdvZ29gO1xuXG4gICAgICAgICR0aW1lb3V0KCgpID0+IHsgLy8gaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL2EvMTg5OTYwNDJcbiAgICAgICAgICAkd2luZG93Lm9wZW4oc2hhcmVVcmwsICd0d2l0dGVyX3NoYXJlJywgJ2hlaWdodD00NTAsIHdpZHRoPTU1MCcpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9O1xuICB9XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiAuL2FuY2lsbGFyeS91dGlscy90d2l0dGVyLWZhY3RvcnkuanNcbiAqKi8iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7O0FBQ0E7QUFDQTs7QUFFQTs7QUFKQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBQ0E7Ozs7QUF4QkEiLCJzb3VyY2VSb290IjoiIn0=");

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

	eval("'use strict';\n\ntypeaheadUtils.$inject = [\"startsWith\"];\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = typeaheadUtils;\n/*@ngInject*/\nfunction typeaheadUtils(startsWith) {\n  return {\n    startsWith: {\n      country: function country(actual, expected) {\n        if (!_.isString(actual)) {\n          return false;\n        }\n        if (_.isString(actual) && actual.indexOf('CTRY_') === 0) {\n          return false;\n        }\n        if (actual === 'common') {\n          return false;\n        }\n        return startsWith(actual, expected);\n      },\n      region: function region(actual, expected) {\n        if (_.isString(actual) && actual.indexOf('STTE_') === 0) {\n          return false;\n        }\n        if (actual === 'us' || actual === 'ca') {\n          return false;\n        }\n        return startsWith(actual, expected);\n      },\n      basic: startsWith\n    }\n  };\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTc4LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vYW5jaWxsYXJ5L3V0aWxzL3R5cGVhaGVhZC11dGlscy1mYWN0b3J5LmpzPzVhMjMiXSwic291cmNlc0NvbnRlbnQiOlsiLypAbmdJbmplY3QqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdHlwZWFoZWFkVXRpbHMoc3RhcnRzV2l0aCkge1xuICByZXR1cm4ge1xuICAgIHN0YXJ0c1dpdGg6IHtcbiAgICAgIGNvdW50cnk6IGZ1bmN0aW9uKGFjdHVhbCwgZXhwZWN0ZWQpIHtcbiAgICAgICAgaWYgKCFfLmlzU3RyaW5nKGFjdHVhbCkpIHsgcmV0dXJuIGZhbHNlOyB9XG4gICAgICAgIGlmIChfLmlzU3RyaW5nKGFjdHVhbCkgJiYgYWN0dWFsLmluZGV4T2YoJ0NUUllfJykgPT09IDApIHsgcmV0dXJuIGZhbHNlOyB9XG4gICAgICAgIGlmIChhY3R1YWwgPT09ICdjb21tb24nKSB7IHJldHVybiBmYWxzZTsgfVxuICAgICAgICByZXR1cm4gc3RhcnRzV2l0aChhY3R1YWwsIGV4cGVjdGVkKTtcbiAgICAgIH0sXG4gICAgICByZWdpb246IGZ1bmN0aW9uKGFjdHVhbCwgZXhwZWN0ZWQpIHtcbiAgICAgICAgaWYgKF8uaXNTdHJpbmcoYWN0dWFsKSAmJiBhY3R1YWwuaW5kZXhPZignU1RURV8nKSA9PT0gMCkgeyByZXR1cm4gZmFsc2U7IH1cbiAgICAgICAgaWYgKGFjdHVhbCA9PT0gJ3VzJyB8fCBhY3R1YWwgPT09ICdjYScpIHsgcmV0dXJuIGZhbHNlOyB9XG4gICAgICAgIHJldHVybiBzdGFydHNXaXRoKGFjdHVhbCwgZXhwZWN0ZWQpO1xuICAgICAgfSxcbiAgICAgIGJhc2ljOiBzdGFydHNXaXRoXG4gICAgfVxuICB9O1xufVxuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogLi9hbmNpbGxhcnkvdXRpbHMvdHlwZWFoZWFkLXV0aWxzLWZhY3RvcnkuanNcbiAqKi8iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7O0FBQ0E7QUFDQTs7QUFFQTs7QUFKQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7O0FBQ0E7QUFBQTs7QUFDQTtBQUFBOztBQUNBOztBQUVBO0FBQ0E7QUFBQTs7QUFDQTtBQUFBOztBQUNBOztBQUVBOzs7QUFkQSIsInNvdXJjZVJvb3QiOiIifQ==");

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

	eval("\"use strict\";\n\nuserConfig.$inject = [\"gon\"];\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = userConfig;\n/*@ngInject*/\nfunction userConfig(gon) {\n  if (gon && gon.services && gon.services.user_service) {\n    return _.cloneDeep(gon.services.user_service);\n  } else {\n    return { urls: {} };\n  }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTc5LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vYW5jaWxsYXJ5L3V0aWxzL3VzZXItc2VydmljZS1jb25maWctZmFjdG9yeS5qcz9kMzlhIl0sInNvdXJjZXNDb250ZW50IjpbIi8qQG5nSW5qZWN0Ki9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHVzZXJDb25maWcgKGdvbikge1xuICAgICAgaWYgKGdvbiAmJiBnb24uc2VydmljZXMgJiYgZ29uLnNlcnZpY2VzLnVzZXJfc2VydmljZSkge1xuICAgICAgICByZXR1cm4gXy5jbG9uZURlZXAoZ29uLnNlcnZpY2VzLnVzZXJfc2VydmljZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4ge3VybHM6IHt9fTtcbiAgICAgIH1cbiAgICB9XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiAuL2FuY2lsbGFyeS91dGlscy91c2VyLXNlcnZpY2UtY29uZmlnLWZhY3RvcnkuanNcbiAqKi8iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7O0FBQ0E7QUFDQTs7QUFFQTs7QUFKQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUpBIiwic291cmNlUm9vdCI6IiJ9");

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

	eval("'use strict';\n\nuserService.$inject = [\"$http\", \"$q\", \"$log\", \"userServiceConfig\", \"backupBeforeUnloadService\", \"gon\", \"fb\"];\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = userService;\n/*@ngInject*/\nfunction userService($http, $q, $log, userServiceConfig, backupBeforeUnloadService, gon, fb) {\n  var oauthServiceEndpoint = userServiceConfig.urls.oauth_service + '/oauth/token';\n  var token = '';\n  var user = {};\n\n  function load() {\n    backupBeforeUnloadService.restoreStateIfSaved('user', user);\n    if (_.isEmpty(user)) {\n      if (gon.contribution && gon.contribution.contributor) {\n        setUser(gon.contribution.contributor.account_privileged);\n      } else if (gon.current_user) {\n        setUser(gon.current_user);\n      }\n    }\n  }\n\n  function oauthLogInPromise(email, password) {\n    var deferred = $q.defer();\n\n    $http.post(oauthServiceEndpoint, {\n      credential_type: 'email',\n      grant_type: 'password',\n      email: email,\n      password: password\n    }).success(function (data) {\n      token = data.access_token;\n      $http.get(userServiceConfig.urls.current_user + '?access_token=' + token).success(function (data) {\n        setUser(data.response);\n        deferred.resolve(user);\n      }).error(function (data) {\n        deferred.reject('Rejected in credentials: ', data);\n      });\n    }).error(function (data) {\n      deferred.reject(data.error);\n    });\n\n    return deferred.promise;\n  }\n\n  function logInPromise(email, password) {\n    var deferred = $q.defer();\n\n    $http.post(userServiceConfig.urls.signin, {\n      account: {\n        email: email,\n        password: password\n      }\n    }).success(function success(data) {\n      setUser(data.account);\n      deferred.resolve(user);\n    }).error(function error(data) {\n      deferred.reject(data.error);\n    });\n\n    return deferred.promise;\n  }\n\n  function logOut() {\n    var oauthDeferred = $q.defer();\n    if (token) {\n      $http.post(userServiceConfig.urls.oauth_service + '/oauth/revoke', {\n        token: token,\n        access_token: token\n      }).success(function (data) {\n        oauthDeferred.resolve(data);\n      }).error(function (error) {\n        $log.debug('revoke error');\n        oauthDeferred.reject(error);\n      });\n    } else {\n      oauthDeferred.resolve('No oauth credentials');\n    }\n\n    var sessionDeferred = $q.defer();\n    $http.delete(userServiceConfig.urls.signout).success(function (data) {\n      setUser(null);\n      token = null;\n      sessionDeferred.resolve(data);\n    }).error(function (error) {\n      $log.debug('logout rejected', error);\n      sessionDeferred.reject(error);\n    });\n\n    return $q.all([oauthDeferred.promise, sessionDeferred.promise]);\n  }\n\n  function signUp(firstname, lastname, email, password, newsletterOptIn) {\n    var deferred = $q.defer();\n\n    $http.post(userServiceConfig.urls.signup + '?api_token=' + userServiceConfig.api_token, {\n      account: {\n        fullname: [firstname, lastname].join(' '),\n        email: email,\n        password: password,\n        general_opt_in: newsletterOptIn\n      }\n    }).success(function () {\n      oauthLogInPromise(email, password).then(deferred.resolve(user));\n    }).error(function (data) {\n      deferred.reject(data.messages);\n    });\n\n    return deferred.promise;\n  }\n\n  function facebookLogin() {\n    var deferred = $q.defer();\n\n    fb.login({ scope: 'email', state: 'abc123' }).then(function (response) {\n      if (response.authResponse) {\n        var callbackUrl = userServiceConfig.urls.facebook_callback;\n        $log.debug('Connected! Hitting OmniAuth callback (GET ' + callbackUrl + ')...');\n        // since we have cookies enabled, this request will allow omniauth to parse\n        // out the auth code from the signed request in the fbsr_XXX cookie\n        $http.get(userServiceConfig.urls.facebook_callback, { headers: { Accept: 'application/json' } }).success(function (json) {\n          $log.debug('Connected! Callback complete.');\n          $log.debug(JSON.stringify(json));\n          setUser(json.account_privileged);\n          deferred.resolve(json.account_privileged);\n        }).error(function (error) {\n          $log.debug('error getting ' + callbackUrl);\n          $log.debug(error);\n          deferred.reject(error);\n        });\n      }\n    });\n\n    return deferred.promise;\n  }\n\n  function resetPassword(resetPasswordToken, password, passwordConfirmation) {\n    var deferred = $q.defer();\n\n    $http.put(userServiceConfig.urls.change_password, {\n      account: {\n        reset_password_token: resetPasswordToken,\n        password: password,\n        password_confirmation: passwordConfirmation\n      }\n    }).then(function (successResponse) {\n      deferred.resolve(successResponse);\n    }, function (failureResponse) {\n      deferred.reject(failureResponse);\n    });\n\n    return deferred.promise;\n  }\n\n  function setUser(data) {\n    if (data === null) {\n      _.each(_.keys(user), function (k) {\n        delete user[k];\n      });\n    } else {\n      var displayName = data.display_for_feed || data.firstname || data.email;\n      user.id = data.id;\n      user.firstname = data.firstname;\n      user.lastname = data.lastname;\n      user.email = data.email;\n      user.avatarUrl = data.avatar_url;\n      user.displayName = displayName;\n    }\n  }\n\n  function current() {\n    return user;\n  }\n\n  function authToken() {\n    return token;\n  }\n\n  _.merge(this, {\n    oauthLogIn: oauthLogInPromise,\n    logIn: logInPromise,\n    logOut: logOut,\n    signUp: signUp,\n    facebookLogin: facebookLogin,\n    resetPassword: resetPassword,\n    current: current,\n    authToken: authToken,\n    setUser: setUser,\n    load: load\n  });\n\n  load();\n\n  backupBeforeUnloadService.register({ user: this.current });\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTgwLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vYW5jaWxsYXJ5L3V0aWxzL3VzZXItc2VydmljZS5qcz8xZTI1Il0sInNvdXJjZXNDb250ZW50IjpbIi8qQG5nSW5qZWN0Ki9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHVzZXJTZXJ2aWNlKCRodHRwLCAkcSwgJGxvZywgdXNlclNlcnZpY2VDb25maWcsIGJhY2t1cEJlZm9yZVVubG9hZFNlcnZpY2UsIGdvbiwgZmIpIHtcbiAgdmFyIG9hdXRoU2VydmljZUVuZHBvaW50ID0gdXNlclNlcnZpY2VDb25maWcudXJscy5vYXV0aF9zZXJ2aWNlICsgJy9vYXV0aC90b2tlbic7XG4gIHZhciB0b2tlbiA9ICcnO1xuICB2YXIgdXNlciA9IHt9O1xuXG4gIGZ1bmN0aW9uIGxvYWQoKSB7XG4gICAgYmFja3VwQmVmb3JlVW5sb2FkU2VydmljZS5yZXN0b3JlU3RhdGVJZlNhdmVkKCd1c2VyJywgdXNlcik7XG4gICAgaWYgKF8uaXNFbXB0eSh1c2VyKSkge1xuICAgICAgaWYgKGdvbi5jb250cmlidXRpb24gJiYgZ29uLmNvbnRyaWJ1dGlvbi5jb250cmlidXRvcikge1xuICAgICAgICBzZXRVc2VyKGdvbi5jb250cmlidXRpb24uY29udHJpYnV0b3IuYWNjb3VudF9wcml2aWxlZ2VkKTtcbiAgICAgIH0gZWxzZSBpZiAoZ29uLmN1cnJlbnRfdXNlcikge1xuICAgICAgICBzZXRVc2VyKGdvbi5jdXJyZW50X3VzZXIpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIG9hdXRoTG9nSW5Qcm9taXNlKGVtYWlsLCBwYXNzd29yZCkge1xuICAgIHZhciBkZWZlcnJlZCA9ICRxLmRlZmVyKCk7XG5cbiAgICAkaHR0cC5wb3N0KG9hdXRoU2VydmljZUVuZHBvaW50LFxuICAgICAge1xuICAgICAgICBjcmVkZW50aWFsX3R5cGU6ICdlbWFpbCcsXG4gICAgICAgIGdyYW50X3R5cGU6ICdwYXNzd29yZCcsXG4gICAgICAgIGVtYWlsOiBlbWFpbCxcbiAgICAgICAgcGFzc3dvcmQ6IHBhc3N3b3JkXG4gICAgICB9KVxuICAgICAgLnN1Y2Nlc3MoZnVuY3Rpb24gKGRhdGEpIHtcbiAgICAgICAgdG9rZW4gPSBkYXRhLmFjY2Vzc190b2tlbjtcbiAgICAgICAgJGh0dHAuZ2V0KHVzZXJTZXJ2aWNlQ29uZmlnLnVybHMuY3VycmVudF91c2VyICsgJz9hY2Nlc3NfdG9rZW49JyArIHRva2VuKVxuICAgICAgICAgIC5zdWNjZXNzKGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgICAgICAgICBzZXRVc2VyKGRhdGEucmVzcG9uc2UpO1xuICAgICAgICAgICAgZGVmZXJyZWQucmVzb2x2ZSh1c2VyKTtcbiAgICAgICAgICB9KVxuICAgICAgICAgIC5lcnJvcihmdW5jdGlvbiAoZGF0YSkge1xuICAgICAgICAgICAgZGVmZXJyZWQucmVqZWN0KCdSZWplY3RlZCBpbiBjcmVkZW50aWFsczogJywgZGF0YSk7XG4gICAgICAgICAgfSk7XG4gICAgICB9KVxuICAgICAgLmVycm9yKGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgICAgIGRlZmVycmVkLnJlamVjdChkYXRhLmVycm9yKTtcbiAgICAgIH0pO1xuXG4gICAgcmV0dXJuIGRlZmVycmVkLnByb21pc2U7XG4gIH1cblxuICBmdW5jdGlvbiBsb2dJblByb21pc2UoZW1haWwsIHBhc3N3b3JkKSB7XG4gICAgdmFyIGRlZmVycmVkID0gJHEuZGVmZXIoKTtcblxuICAgICRodHRwLnBvc3QodXNlclNlcnZpY2VDb25maWcudXJscy5zaWduaW4sXG4gICAgICB7XG4gICAgICAgIGFjY291bnQ6IHtcbiAgICAgICAgICBlbWFpbDogZW1haWwsXG4gICAgICAgICAgcGFzc3dvcmQ6IHBhc3N3b3JkXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgICAuc3VjY2VzcyhmdW5jdGlvbiBzdWNjZXNzKGRhdGEpIHtcbiAgICAgICAgc2V0VXNlcihkYXRhLmFjY291bnQpO1xuICAgICAgICBkZWZlcnJlZC5yZXNvbHZlKHVzZXIpO1xuICAgICAgfSlcbiAgICAgIC5lcnJvcihmdW5jdGlvbiBlcnJvcihkYXRhKSB7XG4gICAgICAgIGRlZmVycmVkLnJlamVjdChkYXRhLmVycm9yKTtcbiAgICAgIH0pO1xuXG4gICAgcmV0dXJuIGRlZmVycmVkLnByb21pc2U7XG4gIH1cblxuICBmdW5jdGlvbiBsb2dPdXQoKXtcbiAgICB2YXIgb2F1dGhEZWZlcnJlZCA9ICRxLmRlZmVyKCk7XG4gICAgaWYgKHRva2VuKSB7XG4gICAgICAkaHR0cC5wb3N0KHVzZXJTZXJ2aWNlQ29uZmlnLnVybHMub2F1dGhfc2VydmljZSArICcvb2F1dGgvcmV2b2tlJywge1xuICAgICAgICB0b2tlbjogdG9rZW4sXG4gICAgICAgIGFjY2Vzc190b2tlbjogdG9rZW5cbiAgICAgIH0pLnN1Y2Nlc3MoZnVuY3Rpb24gKGRhdGEpIHtcbiAgICAgICAgb2F1dGhEZWZlcnJlZC5yZXNvbHZlKGRhdGEpO1xuICAgICAgfSkuZXJyb3IoZnVuY3Rpb24gKGVycm9yKSB7XG4gICAgICAgICRsb2cuZGVidWcoJ3Jldm9rZSBlcnJvcicpO1xuICAgICAgICBvYXV0aERlZmVycmVkLnJlamVjdChlcnJvcik7XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgb2F1dGhEZWZlcnJlZC5yZXNvbHZlKCdObyBvYXV0aCBjcmVkZW50aWFscycpO1xuICAgIH1cblxuICAgIHZhciBzZXNzaW9uRGVmZXJyZWQgPSAkcS5kZWZlcigpO1xuICAgICRodHRwLmRlbGV0ZSh1c2VyU2VydmljZUNvbmZpZy51cmxzLnNpZ25vdXQpLnN1Y2Nlc3MoZnVuY3Rpb24gKGRhdGEpIHtcbiAgICAgIHNldFVzZXIobnVsbCk7XG4gICAgICB0b2tlbiA9IG51bGw7XG4gICAgICBzZXNzaW9uRGVmZXJyZWQucmVzb2x2ZShkYXRhKTtcbiAgICB9KS5lcnJvcihmdW5jdGlvbiAoZXJyb3IpIHtcbiAgICAgICRsb2cuZGVidWcoJ2xvZ291dCByZWplY3RlZCcsIGVycm9yKTtcbiAgICAgIHNlc3Npb25EZWZlcnJlZC5yZWplY3QoZXJyb3IpO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuICRxLmFsbChbb2F1dGhEZWZlcnJlZC5wcm9taXNlLCBzZXNzaW9uRGVmZXJyZWQucHJvbWlzZV0pO1xuICB9XG5cbiAgZnVuY3Rpb24gc2lnblVwKGZpcnN0bmFtZSwgbGFzdG5hbWUsIGVtYWlsLCBwYXNzd29yZCwgbmV3c2xldHRlck9wdEluKSB7XG4gICAgdmFyIGRlZmVycmVkID0gJHEuZGVmZXIoKTtcblxuICAgICRodHRwLnBvc3QodXNlclNlcnZpY2VDb25maWcudXJscy5zaWdudXAgKyAnP2FwaV90b2tlbj0nICsgdXNlclNlcnZpY2VDb25maWcuYXBpX3Rva2VuLFxuICAgICAge1xuICAgICAgICBhY2NvdW50OiB7XG4gICAgICAgICAgZnVsbG5hbWU6IFtmaXJzdG5hbWUsIGxhc3RuYW1lXS5qb2luKCcgJyksXG4gICAgICAgICAgZW1haWw6IGVtYWlsLFxuICAgICAgICAgIHBhc3N3b3JkOiBwYXNzd29yZCxcbiAgICAgICAgICBnZW5lcmFsX29wdF9pbjogbmV3c2xldHRlck9wdEluXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgICAuc3VjY2VzcyhmdW5jdGlvbiAoKSB7XG4gICAgICAgIG9hdXRoTG9nSW5Qcm9taXNlKGVtYWlsLCBwYXNzd29yZCkudGhlbihkZWZlcnJlZC5yZXNvbHZlKHVzZXIpKTtcbiAgICAgIH0pXG4gICAgICAuZXJyb3IoZnVuY3Rpb24gKGRhdGEpIHtcbiAgICAgICAgZGVmZXJyZWQucmVqZWN0KGRhdGEubWVzc2FnZXMpO1xuICAgICAgfSk7XG5cbiAgICByZXR1cm4gZGVmZXJyZWQucHJvbWlzZTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGZhY2Vib29rTG9naW4oKSB7XG4gICAgdmFyIGRlZmVycmVkID0gJHEuZGVmZXIoKTtcblxuICAgIGZiLmxvZ2luKHsgc2NvcGU6ICdlbWFpbCcsIHN0YXRlOiAnYWJjMTIzJyB9KS50aGVuKGZ1bmN0aW9uIChyZXNwb25zZSkge1xuICAgICAgaWYgKHJlc3BvbnNlLmF1dGhSZXNwb25zZSkge1xuICAgICAgICB2YXIgY2FsbGJhY2tVcmwgPSB1c2VyU2VydmljZUNvbmZpZy51cmxzLmZhY2Vib29rX2NhbGxiYWNrO1xuICAgICAgICAkbG9nLmRlYnVnKCdDb25uZWN0ZWQhIEhpdHRpbmcgT21uaUF1dGggY2FsbGJhY2sgKEdFVCAnICsgY2FsbGJhY2tVcmwgKyAnKS4uLicpO1xuICAgICAgICAvLyBzaW5jZSB3ZSBoYXZlIGNvb2tpZXMgZW5hYmxlZCwgdGhpcyByZXF1ZXN0IHdpbGwgYWxsb3cgb21uaWF1dGggdG8gcGFyc2VcbiAgICAgICAgLy8gb3V0IHRoZSBhdXRoIGNvZGUgZnJvbSB0aGUgc2lnbmVkIHJlcXVlc3QgaW4gdGhlIGZic3JfWFhYIGNvb2tpZVxuICAgICAgICAkaHR0cC5nZXQodXNlclNlcnZpY2VDb25maWcudXJscy5mYWNlYm9va19jYWxsYmFjayxcbiAgICAgICAgICB7aGVhZGVyczoge0FjY2VwdDogJ2FwcGxpY2F0aW9uL2pzb24nfX0pXG4gICAgICAgICAgLnN1Y2Nlc3MoZnVuY3Rpb24gKGpzb24pIHtcbiAgICAgICAgICAgICRsb2cuZGVidWcoJ0Nvbm5lY3RlZCEgQ2FsbGJhY2sgY29tcGxldGUuJyk7XG4gICAgICAgICAgICAkbG9nLmRlYnVnKEpTT04uc3RyaW5naWZ5KGpzb24pKTtcbiAgICAgICAgICAgIHNldFVzZXIoanNvbi5hY2NvdW50X3ByaXZpbGVnZWQpO1xuICAgICAgICAgICAgZGVmZXJyZWQucmVzb2x2ZShqc29uLmFjY291bnRfcHJpdmlsZWdlZCk7XG4gICAgICAgICAgfSlcbiAgICAgICAgICAuZXJyb3IoZnVuY3Rpb24oZXJyb3IpIHtcbiAgICAgICAgICAgICRsb2cuZGVidWcoJ2Vycm9yIGdldHRpbmcgJyArIGNhbGxiYWNrVXJsKTtcbiAgICAgICAgICAgICRsb2cuZGVidWcoZXJyb3IpO1xuICAgICAgICAgICAgZGVmZXJyZWQucmVqZWN0KGVycm9yKTtcbiAgICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiBkZWZlcnJlZC5wcm9taXNlO1xuICB9XG5cbiAgZnVuY3Rpb24gcmVzZXRQYXNzd29yZChyZXNldFBhc3N3b3JkVG9rZW4sIHBhc3N3b3JkLCBwYXNzd29yZENvbmZpcm1hdGlvbikge1xuICAgIHZhciBkZWZlcnJlZCA9ICRxLmRlZmVyKCk7XG5cbiAgICAkaHR0cC5wdXQodXNlclNlcnZpY2VDb25maWcudXJscy5jaGFuZ2VfcGFzc3dvcmQsIHtcbiAgICAgIGFjY291bnQ6IHtcbiAgICAgICAgcmVzZXRfcGFzc3dvcmRfdG9rZW46IHJlc2V0UGFzc3dvcmRUb2tlbixcbiAgICAgICAgcGFzc3dvcmQ6IHBhc3N3b3JkLFxuICAgICAgICBwYXNzd29yZF9jb25maXJtYXRpb246IHBhc3N3b3JkQ29uZmlybWF0aW9uXG4gICAgICB9XG4gICAgfSkudGhlbihmdW5jdGlvbihzdWNjZXNzUmVzcG9uc2UpIHtcbiAgICAgICAgZGVmZXJyZWQucmVzb2x2ZShzdWNjZXNzUmVzcG9uc2UpO1xuICAgICAgfSxcbiAgICAgIGZ1bmN0aW9uKGZhaWx1cmVSZXNwb25zZSkge1xuICAgICAgICBkZWZlcnJlZC5yZWplY3QoZmFpbHVyZVJlc3BvbnNlKTtcbiAgICAgIH0pO1xuXG4gICAgcmV0dXJuIGRlZmVycmVkLnByb21pc2U7XG4gIH1cblxuICBmdW5jdGlvbiBzZXRVc2VyKGRhdGEpIHtcbiAgICBpZiAoZGF0YSA9PT0gbnVsbCl7XG4gICAgICBfLmVhY2goXy5rZXlzKHVzZXIpLCBmdW5jdGlvbiAoaykgeyBkZWxldGUgdXNlcltrXTsgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBkaXNwbGF5TmFtZSA9IGRhdGEuZGlzcGxheV9mb3JfZmVlZCB8fCBkYXRhLmZpcnN0bmFtZSB8fCBkYXRhLmVtYWlsO1xuICAgICAgdXNlci5pZCA9IGRhdGEuaWQ7XG4gICAgICB1c2VyLmZpcnN0bmFtZSA9IGRhdGEuZmlyc3RuYW1lO1xuICAgICAgdXNlci5sYXN0bmFtZSA9IGRhdGEubGFzdG5hbWU7XG4gICAgICB1c2VyLmVtYWlsID0gZGF0YS5lbWFpbDtcbiAgICAgIHVzZXIuYXZhdGFyVXJsID0gZGF0YS5hdmF0YXJfdXJsO1xuICAgICAgdXNlci5kaXNwbGF5TmFtZSA9IGRpc3BsYXlOYW1lO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGN1cnJlbnQoKSB7XG4gICAgcmV0dXJuIHVzZXI7XG4gIH1cblxuICBmdW5jdGlvbiBhdXRoVG9rZW4oKSB7XG4gICAgcmV0dXJuIHRva2VuO1xuICB9XG5cbiAgXy5tZXJnZSh0aGlzLCB7XG4gICAgb2F1dGhMb2dJbjogb2F1dGhMb2dJblByb21pc2UsXG4gICAgbG9nSW46IGxvZ0luUHJvbWlzZSxcbiAgICBsb2dPdXQ6IGxvZ091dCxcbiAgICBzaWduVXA6IHNpZ25VcCxcbiAgICBmYWNlYm9va0xvZ2luOiBmYWNlYm9va0xvZ2luLFxuICAgIHJlc2V0UGFzc3dvcmQ6IHJlc2V0UGFzc3dvcmQsXG4gICAgY3VycmVudDogY3VycmVudCxcbiAgICBhdXRoVG9rZW46IGF1dGhUb2tlbixcbiAgICBzZXRVc2VyOiBzZXRVc2VyLFxuICAgIGxvYWQ6IGxvYWRcbiAgfSk7XG5cbiAgbG9hZCgpO1xuXG4gIGJhY2t1cEJlZm9yZVVubG9hZFNlcnZpY2UucmVnaXN0ZXIoeyB1c2VyOiB0aGlzLmN1cnJlbnQgfSk7XG59XG5cblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIC4vYW5jaWxsYXJ5L3V0aWxzL3VzZXItc2VydmljZS5qc1xuICoqLyJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTs7QUFDQTtBQUNBOztBQUVBOztBQUpBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7O0FBR0E7QUFDQTs7O0FBR0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBOztBQUdBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7OztBQUdBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBR0E7QUFDQTtBQUVBO0FBQ0E7OztBQUdBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBRkE7QUFRQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBOzs7OztBQUtBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFFQTtBQUNBOzs7QUFHQTs7O0FBR0E7QUFDQTtBQUNBO0FBQUE7O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQUlBO0FBQ0E7OztBQUdBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQXhNQSIsInNvdXJjZVJvb3QiOiIifQ==");

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

	eval("'use strict';\n\nyoutube.$inject = [\"$window\"];\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = youtube;\n/*@ngInject*/\nfunction youtube($window) {\n\n  $window.iframeAPIIncluded = false;\n\n  $window.onYouTubeIframeAPIReady = function () {\n    for (var i = 0; i < $window.youtubeIframeApiCallbacks.length; ++i) {\n      $window.youtubeIframeApiCallbacks[i]();\n    }\n    $window.youtubeApiReady = true;\n  };\n\n  return {\n    onReady: function onReady(callback, include) {\n      if (typeof include === 'undefined') {\n        include = true;\n      }\n\n      if (include && !$window.iframeAPIIncluded) {\n        // This code loads the IFrame Player API code asynchronously.\n        var tag = document.createElement('script');\n        tag.src = \"https://www.youtube.com/iframe_api\";\n        var firstScriptTag = document.getElementsByTagName('script')[0];\n        firstScriptTag.parentNode.insertBefore(tag, firstScriptTag);\n        $window.iframeAPIIncluded = true;\n      }\n\n      if ($window.youtubeApiReady) {\n        callback();\n      } else {\n        $window.youtubeIframeApiCallbacks = $window.youtubeIframeApiCallbacks || [];\n        $window.youtubeIframeApiCallbacks.push(function () {\n          $window.youtubeApiReady = true;\n        });\n        $window.youtubeIframeApiCallbacks.push(callback);\n      }\n    }\n  };\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTgxLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vYW5jaWxsYXJ5L3V0aWxzL3lvdXR1YmUtZmFjdG9yeS5qcz9hZTVjIl0sInNvdXJjZXNDb250ZW50IjpbIi8qQG5nSW5qZWN0Ki9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHlvdXR1YmUoJHdpbmRvdykge1xuXG4gICAgJHdpbmRvdy5pZnJhbWVBUElJbmNsdWRlZCA9IGZhbHNlO1xuXG4gICAgJHdpbmRvdy5vbllvdVR1YmVJZnJhbWVBUElSZWFkeSA9IGZ1bmN0aW9uKCkge1xuICAgICAgZm9yICh2YXIgaT0wOyBpPCR3aW5kb3cueW91dHViZUlmcmFtZUFwaUNhbGxiYWNrcy5sZW5ndGg7ICsraSkge1xuICAgICAgICAkd2luZG93LnlvdXR1YmVJZnJhbWVBcGlDYWxsYmFja3NbaV0oKTtcbiAgICAgIH1cbiAgICAgICR3aW5kb3cueW91dHViZUFwaVJlYWR5ID0gdHJ1ZTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIG9uUmVhZHk6IGZ1bmN0aW9uIChjYWxsYmFjaywgaW5jbHVkZSkge1xuICAgICAgICBpZiAodHlwZW9mKGluY2x1ZGUpID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgIGluY2x1ZGUgPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGluY2x1ZGUgJiYgISR3aW5kb3cuaWZyYW1lQVBJSW5jbHVkZWQpIHtcbiAgICAgICAgICAvLyBUaGlzIGNvZGUgbG9hZHMgdGhlIElGcmFtZSBQbGF5ZXIgQVBJIGNvZGUgYXN5bmNocm9ub3VzbHkuXG4gICAgICAgICAgdmFyIHRhZyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NjcmlwdCcpO1xuICAgICAgICAgIHRhZy5zcmMgPSBcImh0dHBzOi8vd3d3LnlvdXR1YmUuY29tL2lmcmFtZV9hcGlcIjtcbiAgICAgICAgICB2YXIgZmlyc3RTY3JpcHRUYWcgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnc2NyaXB0JylbMF07XG4gICAgICAgICAgZmlyc3RTY3JpcHRUYWcucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUodGFnLCBmaXJzdFNjcmlwdFRhZyk7XG4gICAgICAgICAgJHdpbmRvdy5pZnJhbWVBUElJbmNsdWRlZCA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoJHdpbmRvdy55b3V0dWJlQXBpUmVhZHkpIHtcbiAgICAgICAgICBjYWxsYmFjaygpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICR3aW5kb3cueW91dHViZUlmcmFtZUFwaUNhbGxiYWNrcyA9ICR3aW5kb3cueW91dHViZUlmcmFtZUFwaUNhbGxiYWNrcyB8fCBbXTtcbiAgICAgICAgICAkd2luZG93LnlvdXR1YmVJZnJhbWVBcGlDYWxsYmFja3MucHVzaChmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAkd2luZG93LnlvdXR1YmVBcGlSZWFkeSA9IHRydWU7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgJHdpbmRvdy55b3V0dWJlSWZyYW1lQXBpQ2FsbGJhY2tzLnB1c2goY2FsbGJhY2spO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcblxuICB9XG5cblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIC4vYW5jaWxsYXJ5L3V0aWxzL3lvdXR1YmUtZmFjdG9yeS5qc1xuICoqLyJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTs7QUFDQTtBQUNBOztBQUVBOztBQUpBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOzs7O0FBakNBIiwic291cmNlUm9vdCI6IiJ9");

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

	eval("'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = h;\n\nvar _leftNavToggler = __webpack_require__(183);\n\nvar _leftNavToggler2 = _interopRequireDefault(_leftNavToggler);\n\nvar _deleteLinkDirective = __webpack_require__(185);\n\nvar _deleteLinkDirective2 = _interopRequireDefault(_deleteLinkDirective);\n\nvar _headerMainDirective = __webpack_require__(186);\n\nvar _headerMainDirective2 = _interopRequireDefault(_headerMainDirective);\n\nvar _headerSearchFormDirective = __webpack_require__(187);\n\nvar _headerSearchFormDirective2 = _interopRequireDefault(_headerSearchFormDirective);\n\nvar _loginFormDirective = __webpack_require__(200);\n\nvar _loginFormDirective2 = _interopRequireDefault(_loginFormDirective);\n\nvar _sessionModalDirective = __webpack_require__(202);\n\nvar _sessionModalDirective2 = _interopRequireDefault(_sessionModalDirective);\n\nvar _sessionModalLinkDirective = __webpack_require__(203);\n\nvar _sessionModalLinkDirective2 = _interopRequireDefault(_sessionModalLinkDirective);\n\nvar _signupFormDirective = __webpack_require__(204);\n\nvar _signupFormDirective2 = _interopRequireDefault(_signupFormDirective);\n\nvar _headerFlashDirectives = __webpack_require__(205);\n\nvar _headerFlashDirectives2 = _interopRequireDefault(_headerFlashDirectives);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n(0, _leftNavToggler2.default)(angular);\n\nfunction h(header) {\n  (0, _headerFlashDirectives2.default)(header);\n  header.directive('deleteLink', _deleteLinkDirective2.default).directive('headerMain', _headerMainDirective2.default).directive('headerSearchForm', _headerSearchFormDirective2.default).directive('loginForm', _loginFormDirective2.default).directive('sessionModal', _sessionModalDirective2.default).directive('sessionModalLink', _sessionModalLinkDirective2.default).directive('signupForm', _signupFormDirective2.default);\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTgyLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vYW5jaWxsYXJ5L2hlYWRlci9pbmRleC5qcz83YzAxIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBsZWZ0TmF2VG9nZ2xlciBmcm9tICcuLi8uLi9jb21wb25lbnRzL2xlZnQtbmF2LXRvZ2dsZXInO1xuaW1wb3J0IGRlbGV0ZUxpbmsgZnJvbSAnLi9kZWxldGUtbGluay1kaXJlY3RpdmUnO1xuaW1wb3J0IGhlYWRlck1haW4gZnJvbSAnLi9oZWFkZXItbWFpbi1kaXJlY3RpdmUnO1xuaW1wb3J0IGhlYWRlclNlYXJjaEZvcm0gZnJvbSAnLi9oZWFkZXItc2VhcmNoLWZvcm0tZGlyZWN0aXZlJztcbmltcG9ydCBsb2dpbkZvcm0gZnJvbSAnLi9sb2dpbi1mb3JtLWRpcmVjdGl2ZSc7XG5pbXBvcnQgc2Vzc2lvbk1vZGFsIGZyb20gJy4vc2Vzc2lvbi1tb2RhbC1kaXJlY3RpdmUnO1xuaW1wb3J0IHNlc3Npb25Nb2RhbExpbmsgZnJvbSAnLi9zZXNzaW9uLW1vZGFsLWxpbmstZGlyZWN0aXZlJztcbmltcG9ydCBzaWdudXBGb3JtIGZyb20gJy4vc2lnbnVwLWZvcm0tZGlyZWN0aXZlJztcblxuaW1wb3J0IGhlYWRlckZsYXNoIGZyb20gJy4vaGVhZGVyLWZsYXNoLWRpcmVjdGl2ZXMnO1xuXG5sZWZ0TmF2VG9nZ2xlcihhbmd1bGFyKTtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gaChoZWFkZXIpIHtcbiAgaGVhZGVyRmxhc2goaGVhZGVyKTtcbiAgaGVhZGVyXG4gICAgLmRpcmVjdGl2ZSgnZGVsZXRlTGluaycsIGRlbGV0ZUxpbmspXG4gICAgLmRpcmVjdGl2ZSgnaGVhZGVyTWFpbicsIGhlYWRlck1haW4pXG4gICAgLmRpcmVjdGl2ZSgnaGVhZGVyU2VhcmNoRm9ybScsIGhlYWRlclNlYXJjaEZvcm0pXG4gICAgLmRpcmVjdGl2ZSgnbG9naW5Gb3JtJywgbG9naW5Gb3JtKVxuICAgIC5kaXJlY3RpdmUoJ3Nlc3Npb25Nb2RhbCcsIHNlc3Npb25Nb2RhbClcbiAgICAuZGlyZWN0aXZlKCdzZXNzaW9uTW9kYWxMaW5rJywgc2Vzc2lvbk1vZGFsTGluaylcbiAgICAuZGlyZWN0aXZlKCdzaWdudXBGb3JtJywgc2lnbnVwRm9ybSk7XG59XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiAuL2FuY2lsbGFyeS9oZWFkZXIvaW5kZXguanNcbiAqKi8iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFOQTtBQUNBO0FBUUE7QUFDQTtBQVRBO0FBQ0E7QUFXQTtBQUNBO0FBWkE7QUFDQTtBQWNBO0FBQ0E7QUFmQTtBQUNBO0FBaUJBO0FBQ0E7QUFsQkE7QUFDQTtBQW9CQTtBQUNBO0FBckJBO0FBQ0E7QUF1QkE7QUFDQTtBQXhCQTtBQUNBO0FBMEJBO0FBQ0E7QUEzQkE7QUFDQTtBQTZCQTtBQUNBO0FBN0JBO0FBQ0E7QUErQkE7QUFDQTtBQUNBO0FBQ0E7QUFqQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUZBIiwic291cmNlUm9vdCI6IiJ9");

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

	eval("'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nexports.default = function (angular) {\n  angular.module('indiegogo.components.leftNavToggler', ['utils']).factory('navState', _navStateService2.default);\n};\n\nvar _navStateService = __webpack_require__(184);\n\nvar _navStateService2 = _interopRequireDefault(_navStateService);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTgzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vY29tcG9uZW50cy9sZWZ0LW5hdi10b2dnbGVyL2luZGV4LmpzP2U3MjIiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IG5hdlN0YXRlIGZyb20gJy4vbmF2LXN0YXRlLXNlcnZpY2UuanMnO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihhbmd1bGFyKSB7XG4gIGFuZ3VsYXIubW9kdWxlKCdpbmRpZWdvZ28uY29tcG9uZW50cy5sZWZ0TmF2VG9nZ2xlcicsIFsndXRpbHMnXSlcbiAgICAuZmFjdG9yeSgnbmF2U3RhdGUnLCBuYXZTdGF0ZSk7XG59XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiAuL2NvbXBvbmVudHMvbGVmdC1uYXYtdG9nZ2xlci9pbmRleC5qc1xuICoqLyJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBSEE7OztBQUhBO0FBQ0E7QUFXQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==");

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

	eval("\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = navStateService;\n/*@ngInject*/\n\nfunction navStateService() {\n  var service = {};\n\n  service.isShowing = true;\n\n  service.toggleShow = function () {\n    this.isShowing = !this.isShowing;\n  };\n\n  return service;\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTg0LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vY29tcG9uZW50cy9sZWZ0LW5hdi10b2dnbGVyL25hdi1zdGF0ZS1zZXJ2aWNlLmpzPzY4NTkiXSwic291cmNlc0NvbnRlbnQiOlsiLypAbmdJbmplY3QqL1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBuYXZTdGF0ZVNlcnZpY2UoKSB7XG4gIGxldCBzZXJ2aWNlID0ge307XG5cbiAgc2VydmljZS5pc1Nob3dpbmcgPSB0cnVlO1xuXG4gIHNlcnZpY2UudG9nZ2xlU2hvdyA9IGZ1bmN0aW9uKCkge1xuICAgIHRoaXMuaXNTaG93aW5nID0gIXRoaXMuaXNTaG93aW5nO1xuICB9O1xuXG4gIHJldHVybiBzZXJ2aWNlO1xufVxuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogLi9jb21wb25lbnRzL2xlZnQtbmF2LXRvZ2dsZXIvbmF2LXN0YXRlLXNlcnZpY2UuanNcbiAqKi8iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOzs7QUFIQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFUQSIsInNvdXJjZVJvb3QiOiIifQ==");

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

	eval("\"use strict\";\n\ndeleteLink.$inject = [\"$window\", \"$http\"];\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = deleteLink;\n/*@ngInject*/\nfunction deleteLink($window, $http) {\n  return {\n    restrict: \"A\",\n    scope: {},\n    link: function link(scope, element, attrs) {\n      function performDeleteRequest() {\n        $http.delete(element.attr(\"href\")).then(function () {\n          $window.location.href = attrs.deleteLinkHref || '/';\n        });\n      }\n\n      element.on(\"click\", function (e) {\n        e.preventDefault();\n        e.stopImmediatePropagation();\n        if (attrs.deleteLinkConfirm) {\n          if ($window.confirm(attrs.deleteLinkConfirm)) {\n            performDeleteRequest();\n          }\n        } else {\n          performDeleteRequest();\n        }\n      });\n    }\n  };\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTg1LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vYW5jaWxsYXJ5L2hlYWRlci9kZWxldGUtbGluay1kaXJlY3RpdmUuanM/YzU5ZSJdLCJzb3VyY2VzQ29udGVudCI6WyIvKkBuZ0luamVjdCovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBkZWxldGVMaW5rKCR3aW5kb3csICRodHRwKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICByZXN0cmljdDogXCJBXCIsXG4gICAgICAgIHNjb3BlOiB7fSxcbiAgICAgICAgbGluazogZnVuY3Rpb24oc2NvcGUsIGVsZW1lbnQsIGF0dHJzKSB7XG4gICAgICAgICAgZnVuY3Rpb24gcGVyZm9ybURlbGV0ZVJlcXVlc3QoKSB7XG4gICAgICAgICAgICAkaHR0cC5kZWxldGUoZWxlbWVudC5hdHRyKFwiaHJlZlwiKSkudGhlbihmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgJHdpbmRvdy5sb2NhdGlvbi5ocmVmID0gYXR0cnMuZGVsZXRlTGlua0hyZWYgfHwgJy8nO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgZWxlbWVudC5vbihcImNsaWNrXCIsIGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICBlLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xuICAgICAgICAgICAgaWYgKGF0dHJzLmRlbGV0ZUxpbmtDb25maXJtKSB7XG4gICAgICAgICAgICAgIGlmICgkd2luZG93LmNvbmZpcm0oYXR0cnMuZGVsZXRlTGlua0NvbmZpcm0pKSB7XG4gICAgICAgICAgICAgICAgcGVyZm9ybURlbGV0ZVJlcXVlc3QoKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcGVyZm9ybURlbGV0ZVJlcXVlc3QoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiAuL2FuY2lsbGFyeS9oZWFkZXIvZGVsZXRlLWxpbmstZGlyZWN0aXZlLmpzXG4gKiovIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBOztBQUNBO0FBQ0E7O0FBRUE7O0FBSkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOzs7OztBQW5CQSIsInNvdXJjZVJvb3QiOiIifQ==");

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

	eval("\"use strict\";\n\nheaderMain.$inject = [\"navState\"];\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = headerMain;\n/*@ngInject*/\nfunction headerMain(navState) {\n  return {\n    restrict: \"A\",\n    scope: false,\n    link: function link(scope) {\n      scope.navState = navState;\n      scope.inSearchMode = false;\n\n      scope.toggleSearchMode = function () {\n        scope.inSearchMode = !scope.inSearchMode;\n      };\n\n      scope.$on('dropdownOpen', function () {\n        scope.inSearchMode = false;\n        scope.$digest();\n      });\n\n      scope.eatTofurkeyBurger = function () {\n        navState.toggleShow();\n      };\n    }\n  };\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTg2LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vYW5jaWxsYXJ5L2hlYWRlci9oZWFkZXItbWFpbi1kaXJlY3RpdmUuanM/OWE4MiJdLCJzb3VyY2VzQ29udGVudCI6WyIvKkBuZ0luamVjdCovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBoZWFkZXJNYWluKG5hdlN0YXRlKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICByZXN0cmljdDogXCJBXCIsXG4gICAgICAgIHNjb3BlOiBmYWxzZSxcbiAgICAgICAgbGluazogZnVuY3Rpb24oc2NvcGUpIHtcbiAgICAgICAgICBzY29wZS5uYXZTdGF0ZSA9IG5hdlN0YXRlO1xuICAgICAgICAgIHNjb3BlLmluU2VhcmNoTW9kZSA9IGZhbHNlO1xuXG4gICAgICAgICAgc2NvcGUudG9nZ2xlU2VhcmNoTW9kZSA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgc2NvcGUuaW5TZWFyY2hNb2RlID0gIXNjb3BlLmluU2VhcmNoTW9kZTtcbiAgICAgICAgICB9O1xuXG4gICAgICAgICAgc2NvcGUuJG9uKCdkcm9wZG93bk9wZW4nLCBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHNjb3BlLmluU2VhcmNoTW9kZSA9IGZhbHNlO1xuICAgICAgICAgICAgc2NvcGUuJGRpZ2VzdCgpO1xuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgc2NvcGUuZWF0VG9mdXJrZXlCdXJnZXIgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIG5hdlN0YXRlLnRvZ2dsZVNob3coKTtcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICB9O1xuICAgIH1cblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIC4vYW5jaWxsYXJ5L2hlYWRlci9oZWFkZXItbWFpbi1kaXJlY3RpdmUuanNcbiAqKi8iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7O0FBQ0E7QUFDQTs7QUFFQTs7QUFKQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBOzs7O0FBbEJBIiwic291cmNlUm9vdCI6IiJ9");

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

	eval("'use strict';\n\nheaderSearchForm.$inject = [\"i18n\", \"browser\", \"$timeout\"];\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = headerSearchForm;\n/*@ngInject*/\nfunction headerSearchForm(i18n, browser, $timeout) {\n  return {\n    restrict: 'A',\n    scope: true,\n    template: function template(elem, attrs) {\n      return __webpack_require__(188)(\"./\" + attrs.template + '.html');\n    },\n    link: function link(scope, element, attrs) {\n      scope.$watch('inSearchMode', function (subsequent, last) {\n        if (!last && subsequent) {\n\n          // element is required to be visible before focusing.\n          $timeout(function () {\n            element.find('input').focus();\n          }, 100, false);\n        }\n      });\n\n      scope.i18n = i18n;\n      scope.searchTerm = attrs.term;\n      scope.inputName = attrs.inputName;\n      scope.reset = function () {\n        scope.searchTerm = '';\n        if (attrs.term && attrs.term.length > 0) {\n          browser.redirectTo(attrs.action);\n        }\n      };\n      scope.go = function () {\n        element.submit();\n      };\n    }\n  };\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTg3LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vYW5jaWxsYXJ5L2hlYWRlci9oZWFkZXItc2VhcmNoLWZvcm0tZGlyZWN0aXZlLmpzP2M2YTQiXSwic291cmNlc0NvbnRlbnQiOlsiLypAbmdJbmplY3QqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gaGVhZGVyU2VhcmNoRm9ybShpMThuLCBicm93c2VyLCAkdGltZW91dCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHJlc3RyaWN0OiAnQScsXG4gICAgICAgICAgc2NvcGU6IHRydWUsXG4gICAgICAgICAgdGVtcGxhdGU6IGZ1bmN0aW9uKGVsZW0sIGF0dHJzKSB7XG4gICAgICAgICAgICByZXR1cm4gcmVxdWlyZSgnLi8nICsgYXR0cnMudGVtcGxhdGUgKyAnLmh0bWwnKTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIGxpbms6IGZ1bmN0aW9uKHNjb3BlLCBlbGVtZW50LCBhdHRycykge1xuICAgICAgICAgICAgc2NvcGUuJHdhdGNoKCdpblNlYXJjaE1vZGUnLCBmdW5jdGlvbihzdWJzZXF1ZW50LCBsYXN0KSB7XG4gICAgICAgICAgICAgIGlmICghbGFzdCAmJiBzdWJzZXF1ZW50KSB7XG5cbiAgICAgICAgICAgICAgICAvLyBlbGVtZW50IGlzIHJlcXVpcmVkIHRvIGJlIHZpc2libGUgYmVmb3JlIGZvY3VzaW5nLlxuICAgICAgICAgICAgICAgICR0aW1lb3V0KGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgZWxlbWVudC5maW5kKCdpbnB1dCcpLmZvY3VzKCk7XG4gICAgICAgICAgICAgICAgfSwgMTAwLCBmYWxzZSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBzY29wZS5pMThuID0gaTE4bjtcbiAgICAgICAgICAgIHNjb3BlLnNlYXJjaFRlcm0gPSBhdHRycy50ZXJtO1xuICAgICAgICAgICAgc2NvcGUuaW5wdXROYW1lID0gYXR0cnMuaW5wdXROYW1lO1xuICAgICAgICAgICAgc2NvcGUucmVzZXQgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgc2NvcGUuc2VhcmNoVGVybSA9ICcnO1xuICAgICAgICAgICAgICBpZiAoYXR0cnMudGVybSAmJiBhdHRycy50ZXJtLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBicm93c2VyLnJlZGlyZWN0VG8oYXR0cnMuYWN0aW9uKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHNjb3BlLmdvID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgIGVsZW1lbnQuc3VibWl0KCk7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgIH1cblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIC4vYW5jaWxsYXJ5L2hlYWRlci9oZWFkZXItc2VhcmNoLWZvcm0tZGlyZWN0aXZlLmpzXG4gKiovIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBOztBQUNBO0FBQ0E7O0FBRUE7O0FBSkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7OztBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBOzs7O0FBNUJBIiwic291cmNlUm9vdCI6IiJ9");

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

	eval("var map = {\n\t\"./generosity-header-search-dropdown.html\": 189,\n\t\"./header-flash-container.html\": 190,\n\t\"./header-flash.html\": 191,\n\t\"./header-search-dropdown.html\": 192,\n\t\"./header-search-form.html\": 193,\n\t\"./login-form-generosity.html\": 194,\n\t\"./login-form-indiegogo.html\": 195,\n\t\"./session-modal-generosity.html\": 196,\n\t\"./session-modal-indiegogo.html\": 197,\n\t\"./signup-form-generosity.html\": 198,\n\t\"./signup-form-indiegogo.html\": 199\n};\nfunction webpackContext(req) {\n\treturn __webpack_require__(webpackContextResolve(req));\n};\nfunction webpackContextResolve(req) {\n\treturn map[req] || (function() { throw new Error(\"Cannot find module '\" + req + \"'.\") }());\n};\nwebpackContext.keys = function webpackContextKeys() {\n\treturn Object.keys(map);\n};\nwebpackContext.resolve = webpackContextResolve;\nmodule.exports = webpackContext;\nwebpackContext.id = 188;\n\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTg4LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vYW5jaWxsYXJ5L2hlYWRlciBeXFwuXFwvLipcXC5odG1sJD9kMjFhIl0sInNvdXJjZXNDb250ZW50IjpbInZhciBtYXAgPSB7XG5cdFwiLi9nZW5lcm9zaXR5LWhlYWRlci1zZWFyY2gtZHJvcGRvd24uaHRtbFwiOiAxODksXG5cdFwiLi9oZWFkZXItZmxhc2gtY29udGFpbmVyLmh0bWxcIjogMTkwLFxuXHRcIi4vaGVhZGVyLWZsYXNoLmh0bWxcIjogMTkxLFxuXHRcIi4vaGVhZGVyLXNlYXJjaC1kcm9wZG93bi5odG1sXCI6IDE5Mixcblx0XCIuL2hlYWRlci1zZWFyY2gtZm9ybS5odG1sXCI6IDE5Myxcblx0XCIuL2xvZ2luLWZvcm0tZ2VuZXJvc2l0eS5odG1sXCI6IDE5NCxcblx0XCIuL2xvZ2luLWZvcm0taW5kaWVnb2dvLmh0bWxcIjogMTk1LFxuXHRcIi4vc2Vzc2lvbi1tb2RhbC1nZW5lcm9zaXR5Lmh0bWxcIjogMTk2LFxuXHRcIi4vc2Vzc2lvbi1tb2RhbC1pbmRpZWdvZ28uaHRtbFwiOiAxOTcsXG5cdFwiLi9zaWdudXAtZm9ybS1nZW5lcm9zaXR5Lmh0bWxcIjogMTk4LFxuXHRcIi4vc2lnbnVwLWZvcm0taW5kaWVnb2dvLmh0bWxcIjogMTk5XG59O1xuZnVuY3Rpb24gd2VicGFja0NvbnRleHQocmVxKSB7XG5cdHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKHdlYnBhY2tDb250ZXh0UmVzb2x2ZShyZXEpKTtcbn07XG5mdW5jdGlvbiB3ZWJwYWNrQ29udGV4dFJlc29sdmUocmVxKSB7XG5cdHJldHVybiBtYXBbcmVxXSB8fCAoZnVuY3Rpb24oKSB7IHRocm93IG5ldyBFcnJvcihcIkNhbm5vdCBmaW5kIG1vZHVsZSAnXCIgKyByZXEgKyBcIicuXCIpIH0oKSk7XG59O1xud2VicGFja0NvbnRleHQua2V5cyA9IGZ1bmN0aW9uIHdlYnBhY2tDb250ZXh0S2V5cygpIHtcblx0cmV0dXJuIE9iamVjdC5rZXlzKG1hcCk7XG59O1xud2VicGFja0NvbnRleHQucmVzb2x2ZSA9IHdlYnBhY2tDb250ZXh0UmVzb2x2ZTtcbm1vZHVsZS5leHBvcnRzID0gd2VicGFja0NvbnRleHQ7XG53ZWJwYWNrQ29udGV4dC5pZCA9IDE4ODtcblxuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9hbmNpbGxhcnkvaGVhZGVyIF5cXC5cXC8uKlxcLmh0bWwkXG4gKiogbW9kdWxlIGlkID0gMTg4XG4gKiogbW9kdWxlIGNodW5rcyA9IDI0XG4gKiovIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=");

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

	eval("module.exports = \"<input class=\\\"siteSearch-text\\\" type=\\\"text\\\" name=\\\"filter_title\\\" placeholder='{{::i18n.t(\\\"search_by_title\\\")}}' ng-model=\\\"searchTerm\\\" maxlength=\\\"300\\\" />\\n<a class=\\\"small-cta siteSearch-cta\\\" ng-click=\\\"go()\\\">{{::i18n.t('go')}}</a>\\n\";\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTg5LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vYW5jaWxsYXJ5L2hlYWRlci9nZW5lcm9zaXR5LWhlYWRlci1zZWFyY2gtZHJvcGRvd24uaHRtbD8zN2EyIl0sInNvdXJjZXNDb250ZW50IjpbIm1vZHVsZS5leHBvcnRzID0gXCI8aW5wdXQgY2xhc3M9XFxcInNpdGVTZWFyY2gtdGV4dFxcXCIgdHlwZT1cXFwidGV4dFxcXCIgbmFtZT1cXFwiZmlsdGVyX3RpdGxlXFxcIiBwbGFjZWhvbGRlcj0ne3s6OmkxOG4udChcXFwic2VhcmNoX2J5X3RpdGxlXFxcIil9fScgbmctbW9kZWw9XFxcInNlYXJjaFRlcm1cXFwiIG1heGxlbmd0aD1cXFwiMzAwXFxcIiAvPlxcbjxhIGNsYXNzPVxcXCJzbWFsbC1jdGEgc2l0ZVNlYXJjaC1jdGFcXFwiIG5nLWNsaWNrPVxcXCJnbygpXFxcIj57ezo6aTE4bi50KCdnbycpfX08L2E+XFxuXCI7XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL2FuY2lsbGFyeS9oZWFkZXIvZ2VuZXJvc2l0eS1oZWFkZXItc2VhcmNoLWRyb3Bkb3duLmh0bWxcbiAqKiBtb2R1bGUgaWQgPSAxODlcbiAqKiBtb2R1bGUgY2h1bmtzID0gMjRcbiAqKi8iXSwibWFwcGluZ3MiOiJBQUFBIiwic291cmNlUm9vdCI6IiJ9");

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

	eval("module.exports = \"<div ng-transclude></div>\\n<div header-flash\\n  header-flash-level=\\\"{{flash.alertLevel}}\\\"\\n  ng-repeat=\\\"flash in flash.flashes\\\">\\n    <span ng-if=\\\"::flash.messageHtml\\\" ng-bind-html=\\\"::flash.messageHtml\\\"></span>\\n    <span ng-if=\\\"::flash.messageText\\\" ng-bind=\\\"::flash.messageText\\\"></span>\\n</div>\\n\";\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTkwLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vYW5jaWxsYXJ5L2hlYWRlci9oZWFkZXItZmxhc2gtY29udGFpbmVyLmh0bWw/ZjU5YiJdLCJzb3VyY2VzQ29udGVudCI6WyJtb2R1bGUuZXhwb3J0cyA9IFwiPGRpdiBuZy10cmFuc2NsdWRlPjwvZGl2PlxcbjxkaXYgaGVhZGVyLWZsYXNoXFxuICBoZWFkZXItZmxhc2gtbGV2ZWw9XFxcInt7Zmxhc2guYWxlcnRMZXZlbH19XFxcIlxcbiAgbmctcmVwZWF0PVxcXCJmbGFzaCBpbiBmbGFzaC5mbGFzaGVzXFxcIj5cXG4gICAgPHNwYW4gbmctaWY9XFxcIjo6Zmxhc2gubWVzc2FnZUh0bWxcXFwiIG5nLWJpbmQtaHRtbD1cXFwiOjpmbGFzaC5tZXNzYWdlSHRtbFxcXCI+PC9zcGFuPlxcbiAgICA8c3BhbiBuZy1pZj1cXFwiOjpmbGFzaC5tZXNzYWdlVGV4dFxcXCIgbmctYmluZD1cXFwiOjpmbGFzaC5tZXNzYWdlVGV4dFxcXCI+PC9zcGFuPlxcbjwvZGl2PlxcblwiO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9hbmNpbGxhcnkvaGVhZGVyL2hlYWRlci1mbGFzaC1jb250YWluZXIuaHRtbFxuICoqIG1vZHVsZSBpZCA9IDE5MFxuICoqIG1vZHVsZSBjaHVua3MgPSAyNFxuICoqLyJdLCJtYXBwaW5ncyI6IkFBQUEiLCJzb3VyY2VSb290IjoiIn0=");

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

	eval("module.exports = \"<div class=\\\"messageNotification messageNotification--fullWidth\\\" ng-class=\\\"style\\\" ng-if=\\\"open\\\">\\n  <div class=\\\"container\\\">\\n    <div class=\\\"messageNotification--leftRight\\\" gogo-test=\\\"flash_message\\\">\\n      <span ng-transclude />\\n      <a class=\\\"messageNotification-close\\\" href=\\\"\\\" ng-click=\\\"closeFlash()\\\">\\n        <svg><use xlink:href=\\\"#icon-icon-close\\\"></use></svg>\\n      </a>\\n    </div>\\n  </div>\\n</div>\\n\";\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTkxLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vYW5jaWxsYXJ5L2hlYWRlci9oZWFkZXItZmxhc2guaHRtbD83MTcxIl0sInNvdXJjZXNDb250ZW50IjpbIm1vZHVsZS5leHBvcnRzID0gXCI8ZGl2IGNsYXNzPVxcXCJtZXNzYWdlTm90aWZpY2F0aW9uIG1lc3NhZ2VOb3RpZmljYXRpb24tLWZ1bGxXaWR0aFxcXCIgbmctY2xhc3M9XFxcInN0eWxlXFxcIiBuZy1pZj1cXFwib3BlblxcXCI+XFxuICA8ZGl2IGNsYXNzPVxcXCJjb250YWluZXJcXFwiPlxcbiAgICA8ZGl2IGNsYXNzPVxcXCJtZXNzYWdlTm90aWZpY2F0aW9uLS1sZWZ0UmlnaHRcXFwiIGdvZ28tdGVzdD1cXFwiZmxhc2hfbWVzc2FnZVxcXCI+XFxuICAgICAgPHNwYW4gbmctdHJhbnNjbHVkZSAvPlxcbiAgICAgIDxhIGNsYXNzPVxcXCJtZXNzYWdlTm90aWZpY2F0aW9uLWNsb3NlXFxcIiBocmVmPVxcXCJcXFwiIG5nLWNsaWNrPVxcXCJjbG9zZUZsYXNoKClcXFwiPlxcbiAgICAgICAgPHN2Zz48dXNlIHhsaW5rOmhyZWY9XFxcIiNpY29uLWljb24tY2xvc2VcXFwiPjwvdXNlPjwvc3ZnPlxcbiAgICAgIDwvYT5cXG4gICAgPC9kaXY+XFxuICA8L2Rpdj5cXG48L2Rpdj5cXG5cIjtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vYW5jaWxsYXJ5L2hlYWRlci9oZWFkZXItZmxhc2guaHRtbFxuICoqIG1vZHVsZSBpZCA9IDE5MVxuICoqIG1vZHVsZSBjaHVua3MgPSAyNFxuICoqLyJdLCJtYXBwaW5ncyI6IkFBQUEiLCJzb3VyY2VSb290IjoiIn0=");

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

	eval("module.exports = \"<div class=\\\"i-search-box\\\">\\n  <div class=\\\"i-search-cell\\\">\\n    <div class=\\\"i-search-close\\\" ng-show=\\\"searchTerm.length > 0\\\" ng-click=\\\"reset()\\\">\\n      <svg class=\\\"i-search-close-icon\\\"><use xlink:href=\\\"#icon-icon-close\\\"></use></svg>\\n    </div>\\n    <input type=\\\"text\\\" name=\\\"{{::inputName}}\\\" ng-model=\\\"searchTerm\\\" maxlength=\\\"300\\\" />\\n  </div>\\n  <div class=\\\"i-go-cell\\\">\\n    <!-- TODO EVENTS: id=coaw4 fixtype=ga-event-dir action=Complete.Search category=Mobile.Web.Campaign.Page trigger=click dom=div subsystem=explore name-new=TBD . -->\\n    <div class=\\\"i-search-go\\\"\\n         ng-click=\\\"go()\\\"\\n         ga-event-on=\\\"click\\\"\\n         ga-event-category=\\\"Mobile Web Campaign Page\\\"\\n         ga-event-action=\\\"Complete Search\\\">\\n      <a href=\\\"\\\">{{::i18n.t('go')}}</a>\\n    </div>\\n  </div>\\n</div>\\n\";\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTkyLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vYW5jaWxsYXJ5L2hlYWRlci9oZWFkZXItc2VhcmNoLWRyb3Bkb3duLmh0bWw/Y2NjZiJdLCJzb3VyY2VzQ29udGVudCI6WyJtb2R1bGUuZXhwb3J0cyA9IFwiPGRpdiBjbGFzcz1cXFwiaS1zZWFyY2gtYm94XFxcIj5cXG4gIDxkaXYgY2xhc3M9XFxcImktc2VhcmNoLWNlbGxcXFwiPlxcbiAgICA8ZGl2IGNsYXNzPVxcXCJpLXNlYXJjaC1jbG9zZVxcXCIgbmctc2hvdz1cXFwic2VhcmNoVGVybS5sZW5ndGggPiAwXFxcIiBuZy1jbGljaz1cXFwicmVzZXQoKVxcXCI+XFxuICAgICAgPHN2ZyBjbGFzcz1cXFwiaS1zZWFyY2gtY2xvc2UtaWNvblxcXCI+PHVzZSB4bGluazpocmVmPVxcXCIjaWNvbi1pY29uLWNsb3NlXFxcIj48L3VzZT48L3N2Zz5cXG4gICAgPC9kaXY+XFxuICAgIDxpbnB1dCB0eXBlPVxcXCJ0ZXh0XFxcIiBuYW1lPVxcXCJ7ezo6aW5wdXROYW1lfX1cXFwiIG5nLW1vZGVsPVxcXCJzZWFyY2hUZXJtXFxcIiBtYXhsZW5ndGg9XFxcIjMwMFxcXCIgLz5cXG4gIDwvZGl2PlxcbiAgPGRpdiBjbGFzcz1cXFwiaS1nby1jZWxsXFxcIj5cXG4gICAgPCEtLSBUT0RPIEVWRU5UUzogaWQ9Y29hdzQgZml4dHlwZT1nYS1ldmVudC1kaXIgYWN0aW9uPUNvbXBsZXRlLlNlYXJjaCBjYXRlZ29yeT1Nb2JpbGUuV2ViLkNhbXBhaWduLlBhZ2UgdHJpZ2dlcj1jbGljayBkb209ZGl2IHN1YnN5c3RlbT1leHBsb3JlIG5hbWUtbmV3PVRCRCAuIC0tPlxcbiAgICA8ZGl2IGNsYXNzPVxcXCJpLXNlYXJjaC1nb1xcXCJcXG4gICAgICAgICBuZy1jbGljaz1cXFwiZ28oKVxcXCJcXG4gICAgICAgICBnYS1ldmVudC1vbj1cXFwiY2xpY2tcXFwiXFxuICAgICAgICAgZ2EtZXZlbnQtY2F0ZWdvcnk9XFxcIk1vYmlsZSBXZWIgQ2FtcGFpZ24gUGFnZVxcXCJcXG4gICAgICAgICBnYS1ldmVudC1hY3Rpb249XFxcIkNvbXBsZXRlIFNlYXJjaFxcXCI+XFxuICAgICAgPGEgaHJlZj1cXFwiXFxcIj57ezo6aTE4bi50KCdnbycpfX08L2E+XFxuICAgIDwvZGl2PlxcbiAgPC9kaXY+XFxuPC9kaXY+XFxuXCI7XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL2FuY2lsbGFyeS9oZWFkZXIvaGVhZGVyLXNlYXJjaC1kcm9wZG93bi5odG1sXG4gKiogbW9kdWxlIGlkID0gMTkyXG4gKiogbW9kdWxlIGNodW5rcyA9IDI0XG4gKiovIl0sIm1hcHBpbmdzIjoiQUFBQSIsInNvdXJjZVJvb3QiOiIifQ==");

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

	eval("module.exports = \"<label class=\\\"visible-only-to-screenreader\\\" for=\\\"search_term\\\">{{i18n.t('search')}}</label>\\n<input type=\\\"text\\\" name=\\\"{{::inputName}}\\\" id=\\\"search_term\\\" ng-model=\\\"searchTerm\\\" maxlength=\\\"300\\\" class=\\\"i-text-field i-text-field--searchBar\\\" />\\n<svg class=\\\"siteHeader-search-icon\\\"><use xlink:href=\\\"#icon-icon-search\\\"></use></svg>\\n<a class=\\\"siteHeader-search-close\\\" href=\\\"\\\" ng-click=\\\"reset()\\\" ng-show=\\\"searchTerm.length > 0\\\"><svg><use xlink:href=\\\"#icon-icon-close\\\"></use></svg></a>\\n\";\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTkzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vYW5jaWxsYXJ5L2hlYWRlci9oZWFkZXItc2VhcmNoLWZvcm0uaHRtbD8yOGRmIl0sInNvdXJjZXNDb250ZW50IjpbIm1vZHVsZS5leHBvcnRzID0gXCI8bGFiZWwgY2xhc3M9XFxcInZpc2libGUtb25seS10by1zY3JlZW5yZWFkZXJcXFwiIGZvcj1cXFwic2VhcmNoX3Rlcm1cXFwiPnt7aTE4bi50KCdzZWFyY2gnKX19PC9sYWJlbD5cXG48aW5wdXQgdHlwZT1cXFwidGV4dFxcXCIgbmFtZT1cXFwie3s6OmlucHV0TmFtZX19XFxcIiBpZD1cXFwic2VhcmNoX3Rlcm1cXFwiIG5nLW1vZGVsPVxcXCJzZWFyY2hUZXJtXFxcIiBtYXhsZW5ndGg9XFxcIjMwMFxcXCIgY2xhc3M9XFxcImktdGV4dC1maWVsZCBpLXRleHQtZmllbGQtLXNlYXJjaEJhclxcXCIgLz5cXG48c3ZnIGNsYXNzPVxcXCJzaXRlSGVhZGVyLXNlYXJjaC1pY29uXFxcIj48dXNlIHhsaW5rOmhyZWY9XFxcIiNpY29uLWljb24tc2VhcmNoXFxcIj48L3VzZT48L3N2Zz5cXG48YSBjbGFzcz1cXFwic2l0ZUhlYWRlci1zZWFyY2gtY2xvc2VcXFwiIGhyZWY9XFxcIlxcXCIgbmctY2xpY2s9XFxcInJlc2V0KClcXFwiIG5nLXNob3c9XFxcInNlYXJjaFRlcm0ubGVuZ3RoID4gMFxcXCI+PHN2Zz48dXNlIHhsaW5rOmhyZWY9XFxcIiNpY29uLWljb24tY2xvc2VcXFwiPjwvdXNlPjwvc3ZnPjwvYT5cXG5cIjtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vYW5jaWxsYXJ5L2hlYWRlci9oZWFkZXItc2VhcmNoLWZvcm0uaHRtbFxuICoqIG1vZHVsZSBpZCA9IDE5M1xuICoqIG1vZHVsZSBjaHVua3MgPSAyNFxuICoqLyJdLCJtYXBwaW5ncyI6IkFBQUEiLCJzb3VyY2VSb290IjoiIn0=");

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

	eval("module.exports = \"<p class=\\\"sign-up-with-email divider\\\"><span class=\\\"divider-line\\\">{{::i18n.t('or_log_in_with_email') }}</span></p>\\n<form name=\\\"loginForm\\\" novalidate ng-submit=\\\"submitLogin()\\\">\\n  <p class=\\\"i-error\\\" ng-show=\\\"loginFailed\\\">{{::i18n.t('login_modal.invalid_email_or_password')}}</p>\\n  <p class=\\\"i-error\\\" ng-show=\\\"securityMessage\\\">{{securityMessage}}</p>\\n  <label class=\\\"hide i-error signup\\\"></label>\\n\\n  <input name=\\\"emailField\\\" id=\\\"account_email\\\" type=\\\"email\\\" class=\\\"i-text-field\\\" placeholder=\\\"{{::i18n.t('email_caps')}}\\\"\\n         ng-model=\\\"loginAccount.email\\\" required />\\n  <label for=\\\"account_email\\\" class=\\\"i-error\\\" ng-if=\\\"loginForm.emailField.$error.email\\\">{{::i18n.t('login_modal.please_enter_a_valid_email_address')}}</label>\\n  <label for=\\\"account_email\\\" class=\\\"i-error\\\" ng-if=\\\"loginForm.emailField.$error.required && loginForm.emailField.$dirty\\\">{{::i18n.t('login_modal.this_field_is_required')}}</label>\\n\\n  <input name=\\\"passwordField\\\" id=\\\"account_password\\\" type=\\\"password\\\" ng-minlength=\\\"6\\\" class=\\\"i-text-field\\\" ng-model=\\\"loginAccount.password\\\" required placeholder=\\\"{{::i18n.t('password')}}\\\" autocomplete=\\\"off\\\" />\\n  <label for=\\\"account_password\\\" class=\\\"i-error\\\" ng-if=\\\"loginForm.passwordField.$error.minlength\\\">{{::i18n.t('must_be_at_least_6_characters_long')}}</label>\\n  <label for=\\\"account_password\\\" class=\\\"i-error\\\" ng-if=\\\"loginForm.passwordField.$error.required && loginForm.passwordField.$dirty\\\">{{::i18n.t('login_modal.this_field_is_required')}}</label>\\n\\n  <div class=\\\"i-field-row splitApart\\\">\\n    <div class=\\\"i-checkbox-with-label\\\">\\n      <input type=\\\"checkbox\\\" id=\\\"rememberme\\\" ng-model=\\\"loginAccount.rememberme\\\" />\\n      <label for=\\\"rememberme\\\">{{::i18n.t('remember_me')}}</label>\\n    </div>\\n    <div class=\\\"i-forgot\\\">\\n      <a ng-href=\\\"{{::forgotPasswordUrl}}\\\">{{::i18n.t('forgot_password')}}</a>\\n    </div>\\n  </div>\\n\\n  <input type=\\\"submit\\\" class=\\\"small-cta\\\" value=\\\"{{::i18n.t('log_in')}}\\\" />\\n</form>\\n\";\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTk0LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vYW5jaWxsYXJ5L2hlYWRlci9sb2dpbi1mb3JtLWdlbmVyb3NpdHkuaHRtbD85NmFlIl0sInNvdXJjZXNDb250ZW50IjpbIm1vZHVsZS5leHBvcnRzID0gXCI8cCBjbGFzcz1cXFwic2lnbi11cC13aXRoLWVtYWlsIGRpdmlkZXJcXFwiPjxzcGFuIGNsYXNzPVxcXCJkaXZpZGVyLWxpbmVcXFwiPnt7OjppMThuLnQoJ29yX2xvZ19pbl93aXRoX2VtYWlsJykgfX08L3NwYW4+PC9wPlxcbjxmb3JtIG5hbWU9XFxcImxvZ2luRm9ybVxcXCIgbm92YWxpZGF0ZSBuZy1zdWJtaXQ9XFxcInN1Ym1pdExvZ2luKClcXFwiPlxcbiAgPHAgY2xhc3M9XFxcImktZXJyb3JcXFwiIG5nLXNob3c9XFxcImxvZ2luRmFpbGVkXFxcIj57ezo6aTE4bi50KCdsb2dpbl9tb2RhbC5pbnZhbGlkX2VtYWlsX29yX3Bhc3N3b3JkJyl9fTwvcD5cXG4gIDxwIGNsYXNzPVxcXCJpLWVycm9yXFxcIiBuZy1zaG93PVxcXCJzZWN1cml0eU1lc3NhZ2VcXFwiPnt7c2VjdXJpdHlNZXNzYWdlfX08L3A+XFxuICA8bGFiZWwgY2xhc3M9XFxcImhpZGUgaS1lcnJvciBzaWdudXBcXFwiPjwvbGFiZWw+XFxuXFxuICA8aW5wdXQgbmFtZT1cXFwiZW1haWxGaWVsZFxcXCIgaWQ9XFxcImFjY291bnRfZW1haWxcXFwiIHR5cGU9XFxcImVtYWlsXFxcIiBjbGFzcz1cXFwiaS10ZXh0LWZpZWxkXFxcIiBwbGFjZWhvbGRlcj1cXFwie3s6OmkxOG4udCgnZW1haWxfY2FwcycpfX1cXFwiXFxuICAgICAgICAgbmctbW9kZWw9XFxcImxvZ2luQWNjb3VudC5lbWFpbFxcXCIgcmVxdWlyZWQgLz5cXG4gIDxsYWJlbCBmb3I9XFxcImFjY291bnRfZW1haWxcXFwiIGNsYXNzPVxcXCJpLWVycm9yXFxcIiBuZy1pZj1cXFwibG9naW5Gb3JtLmVtYWlsRmllbGQuJGVycm9yLmVtYWlsXFxcIj57ezo6aTE4bi50KCdsb2dpbl9tb2RhbC5wbGVhc2VfZW50ZXJfYV92YWxpZF9lbWFpbF9hZGRyZXNzJyl9fTwvbGFiZWw+XFxuICA8bGFiZWwgZm9yPVxcXCJhY2NvdW50X2VtYWlsXFxcIiBjbGFzcz1cXFwiaS1lcnJvclxcXCIgbmctaWY9XFxcImxvZ2luRm9ybS5lbWFpbEZpZWxkLiRlcnJvci5yZXF1aXJlZCAmJiBsb2dpbkZvcm0uZW1haWxGaWVsZC4kZGlydHlcXFwiPnt7OjppMThuLnQoJ2xvZ2luX21vZGFsLnRoaXNfZmllbGRfaXNfcmVxdWlyZWQnKX19PC9sYWJlbD5cXG5cXG4gIDxpbnB1dCBuYW1lPVxcXCJwYXNzd29yZEZpZWxkXFxcIiBpZD1cXFwiYWNjb3VudF9wYXNzd29yZFxcXCIgdHlwZT1cXFwicGFzc3dvcmRcXFwiIG5nLW1pbmxlbmd0aD1cXFwiNlxcXCIgY2xhc3M9XFxcImktdGV4dC1maWVsZFxcXCIgbmctbW9kZWw9XFxcImxvZ2luQWNjb3VudC5wYXNzd29yZFxcXCIgcmVxdWlyZWQgcGxhY2Vob2xkZXI9XFxcInt7OjppMThuLnQoJ3Bhc3N3b3JkJyl9fVxcXCIgYXV0b2NvbXBsZXRlPVxcXCJvZmZcXFwiIC8+XFxuICA8bGFiZWwgZm9yPVxcXCJhY2NvdW50X3Bhc3N3b3JkXFxcIiBjbGFzcz1cXFwiaS1lcnJvclxcXCIgbmctaWY9XFxcImxvZ2luRm9ybS5wYXNzd29yZEZpZWxkLiRlcnJvci5taW5sZW5ndGhcXFwiPnt7OjppMThuLnQoJ211c3RfYmVfYXRfbGVhc3RfNl9jaGFyYWN0ZXJzX2xvbmcnKX19PC9sYWJlbD5cXG4gIDxsYWJlbCBmb3I9XFxcImFjY291bnRfcGFzc3dvcmRcXFwiIGNsYXNzPVxcXCJpLWVycm9yXFxcIiBuZy1pZj1cXFwibG9naW5Gb3JtLnBhc3N3b3JkRmllbGQuJGVycm9yLnJlcXVpcmVkICYmIGxvZ2luRm9ybS5wYXNzd29yZEZpZWxkLiRkaXJ0eVxcXCI+e3s6OmkxOG4udCgnbG9naW5fbW9kYWwudGhpc19maWVsZF9pc19yZXF1aXJlZCcpfX08L2xhYmVsPlxcblxcbiAgPGRpdiBjbGFzcz1cXFwiaS1maWVsZC1yb3cgc3BsaXRBcGFydFxcXCI+XFxuICAgIDxkaXYgY2xhc3M9XFxcImktY2hlY2tib3gtd2l0aC1sYWJlbFxcXCI+XFxuICAgICAgPGlucHV0IHR5cGU9XFxcImNoZWNrYm94XFxcIiBpZD1cXFwicmVtZW1iZXJtZVxcXCIgbmctbW9kZWw9XFxcImxvZ2luQWNjb3VudC5yZW1lbWJlcm1lXFxcIiAvPlxcbiAgICAgIDxsYWJlbCBmb3I9XFxcInJlbWVtYmVybWVcXFwiPnt7OjppMThuLnQoJ3JlbWVtYmVyX21lJyl9fTwvbGFiZWw+XFxuICAgIDwvZGl2PlxcbiAgICA8ZGl2IGNsYXNzPVxcXCJpLWZvcmdvdFxcXCI+XFxuICAgICAgPGEgbmctaHJlZj1cXFwie3s6OmZvcmdvdFBhc3N3b3JkVXJsfX1cXFwiPnt7OjppMThuLnQoJ2ZvcmdvdF9wYXNzd29yZCcpfX08L2E+XFxuICAgIDwvZGl2PlxcbiAgPC9kaXY+XFxuXFxuICA8aW5wdXQgdHlwZT1cXFwic3VibWl0XFxcIiBjbGFzcz1cXFwic21hbGwtY3RhXFxcIiB2YWx1ZT1cXFwie3s6OmkxOG4udCgnbG9nX2luJyl9fVxcXCIgLz5cXG48L2Zvcm0+XFxuXCI7XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL2FuY2lsbGFyeS9oZWFkZXIvbG9naW4tZm9ybS1nZW5lcm9zaXR5Lmh0bWxcbiAqKiBtb2R1bGUgaWQgPSAxOTRcbiAqKiBtb2R1bGUgY2h1bmtzID0gMjRcbiAqKi8iXSwibWFwcGluZ3MiOiJBQUFBIiwic291cmNlUm9vdCI6IiJ9");

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

	eval("module.exports = \"<p class=\\\"sign-up-with-email divider\\\"><span class=\\\"divider-line\\\">{{::i18n.t('or_log_in_with_email')}}</span></p>\\n<form name=\\\"loginForm\\\" novalidate ng-submit=\\\"submitLogin()\\\">\\n  <p class=\\\"i-error\\\" ng-show=\\\"loginFailed\\\">{{::i18n.t('login_modal.invalid_email_or_password')}}</p>\\n  <p class=\\\"i-error\\\" ng-show=\\\"securityMessage\\\">{{securityMessage}}</p>\\n  <label class=\\\"hide i-error signup\\\"></label>\\n\\n  <input name=\\\"emailField\\\" id=\\\"account_email\\\" type=\\\"email\\\" class=\\\"i-text-field\\\" placeholder=\\\"{{::i18n.t('email_caps')}}\\\"\\n         ng-model=\\\"loginAccount.email\\\" required gogo-test=\\\"email\\\" />\\n  <label for=\\\"account_email\\\" class=\\\"i-input-error-subtext i-error\\\" ng-if=\\\"loginForm.emailField.$error.email\\\">{{::i18n.t('login_modal.please_enter_a_valid_email_address')}}</label>\\n  <label for=\\\"account_email\\\" class=\\\"i-input-error-subtext i-error\\\" ng-if=\\\"loginForm.emailField.$error.required && loginForm.emailField.$dirty\\\">{{::i18n.t('login_modal.this_field_is_required')}}</label>\\n\\n  <input name=\\\"passwordField\\\" id=\\\"account_password\\\" type=\\\"password\\\" ng-minlength=\\\"6\\\" class=\\\"i-text-field\\\" ng-model=\\\"loginAccount.password\\\" required placeholder=\\\"{{::i18n.t('password')}}\\\" autocomplete=\\\"off\\\" gogo-test=\\\"password\\\" />\\n  <label for=\\\"account_password\\\" class=\\\"i-input-error-subtext i-error\\\" ng-if=\\\"loginForm.passwordField.$error.minlength\\\">{{::i18n.t('must_be_at_least_6_characters_long')}}</label>\\n  <label for=\\\"account_password\\\" class=\\\"i-input-error-subtext i-error\\\" ng-if=\\\"loginForm.passwordField.$error.required && loginForm.passwordField.$dirty\\\">{{::i18n.t('login_modal.this_field_is_required')}}</label>\\n\\n  <div class=\\\"i-field-row\\\">\\n    <div class=\\\"col-sm-6 i-checkbox-with-label\\\">\\n      <input type=\\\"checkbox\\\" id=\\\"rememberme\\\" ng-model=\\\"loginAccount.rememberme\\\" />\\n      <label for=\\\"rememberme\\\">{{::i18n.t('remember_me')}}</label>\\n    </div>\\n    <div class=\\\"col-sm-6 i-forgot\\\">\\n      <a class=\\\"i-aqua-link\\\" ng-href=\\\"{{::forgotPasswordUrl}}\\\">{{::i18n.t('forgot_password')}}</a>\\n    </div>\\n  </div>\\n\\n  <input type=\\\"submit\\\" class=\\\"i-cta-1 login\\\" value=\\\"{{::i18n.t('log_in')}}\\\" gogo-test=\\\"log_in\\\" />\\n</form>\\n\";\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTk1LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vYW5jaWxsYXJ5L2hlYWRlci9sb2dpbi1mb3JtLWluZGllZ29nby5odG1sP2M5NTciXSwic291cmNlc0NvbnRlbnQiOlsibW9kdWxlLmV4cG9ydHMgPSBcIjxwIGNsYXNzPVxcXCJzaWduLXVwLXdpdGgtZW1haWwgZGl2aWRlclxcXCI+PHNwYW4gY2xhc3M9XFxcImRpdmlkZXItbGluZVxcXCI+e3s6OmkxOG4udCgnb3JfbG9nX2luX3dpdGhfZW1haWwnKX19PC9zcGFuPjwvcD5cXG48Zm9ybSBuYW1lPVxcXCJsb2dpbkZvcm1cXFwiIG5vdmFsaWRhdGUgbmctc3VibWl0PVxcXCJzdWJtaXRMb2dpbigpXFxcIj5cXG4gIDxwIGNsYXNzPVxcXCJpLWVycm9yXFxcIiBuZy1zaG93PVxcXCJsb2dpbkZhaWxlZFxcXCI+e3s6OmkxOG4udCgnbG9naW5fbW9kYWwuaW52YWxpZF9lbWFpbF9vcl9wYXNzd29yZCcpfX08L3A+XFxuICA8cCBjbGFzcz1cXFwiaS1lcnJvclxcXCIgbmctc2hvdz1cXFwic2VjdXJpdHlNZXNzYWdlXFxcIj57e3NlY3VyaXR5TWVzc2FnZX19PC9wPlxcbiAgPGxhYmVsIGNsYXNzPVxcXCJoaWRlIGktZXJyb3Igc2lnbnVwXFxcIj48L2xhYmVsPlxcblxcbiAgPGlucHV0IG5hbWU9XFxcImVtYWlsRmllbGRcXFwiIGlkPVxcXCJhY2NvdW50X2VtYWlsXFxcIiB0eXBlPVxcXCJlbWFpbFxcXCIgY2xhc3M9XFxcImktdGV4dC1maWVsZFxcXCIgcGxhY2Vob2xkZXI9XFxcInt7OjppMThuLnQoJ2VtYWlsX2NhcHMnKX19XFxcIlxcbiAgICAgICAgIG5nLW1vZGVsPVxcXCJsb2dpbkFjY291bnQuZW1haWxcXFwiIHJlcXVpcmVkIGdvZ28tdGVzdD1cXFwiZW1haWxcXFwiIC8+XFxuICA8bGFiZWwgZm9yPVxcXCJhY2NvdW50X2VtYWlsXFxcIiBjbGFzcz1cXFwiaS1pbnB1dC1lcnJvci1zdWJ0ZXh0IGktZXJyb3JcXFwiIG5nLWlmPVxcXCJsb2dpbkZvcm0uZW1haWxGaWVsZC4kZXJyb3IuZW1haWxcXFwiPnt7OjppMThuLnQoJ2xvZ2luX21vZGFsLnBsZWFzZV9lbnRlcl9hX3ZhbGlkX2VtYWlsX2FkZHJlc3MnKX19PC9sYWJlbD5cXG4gIDxsYWJlbCBmb3I9XFxcImFjY291bnRfZW1haWxcXFwiIGNsYXNzPVxcXCJpLWlucHV0LWVycm9yLXN1YnRleHQgaS1lcnJvclxcXCIgbmctaWY9XFxcImxvZ2luRm9ybS5lbWFpbEZpZWxkLiRlcnJvci5yZXF1aXJlZCAmJiBsb2dpbkZvcm0uZW1haWxGaWVsZC4kZGlydHlcXFwiPnt7OjppMThuLnQoJ2xvZ2luX21vZGFsLnRoaXNfZmllbGRfaXNfcmVxdWlyZWQnKX19PC9sYWJlbD5cXG5cXG4gIDxpbnB1dCBuYW1lPVxcXCJwYXNzd29yZEZpZWxkXFxcIiBpZD1cXFwiYWNjb3VudF9wYXNzd29yZFxcXCIgdHlwZT1cXFwicGFzc3dvcmRcXFwiIG5nLW1pbmxlbmd0aD1cXFwiNlxcXCIgY2xhc3M9XFxcImktdGV4dC1maWVsZFxcXCIgbmctbW9kZWw9XFxcImxvZ2luQWNjb3VudC5wYXNzd29yZFxcXCIgcmVxdWlyZWQgcGxhY2Vob2xkZXI9XFxcInt7OjppMThuLnQoJ3Bhc3N3b3JkJyl9fVxcXCIgYXV0b2NvbXBsZXRlPVxcXCJvZmZcXFwiIGdvZ28tdGVzdD1cXFwicGFzc3dvcmRcXFwiIC8+XFxuICA8bGFiZWwgZm9yPVxcXCJhY2NvdW50X3Bhc3N3b3JkXFxcIiBjbGFzcz1cXFwiaS1pbnB1dC1lcnJvci1zdWJ0ZXh0IGktZXJyb3JcXFwiIG5nLWlmPVxcXCJsb2dpbkZvcm0ucGFzc3dvcmRGaWVsZC4kZXJyb3IubWlubGVuZ3RoXFxcIj57ezo6aTE4bi50KCdtdXN0X2JlX2F0X2xlYXN0XzZfY2hhcmFjdGVyc19sb25nJyl9fTwvbGFiZWw+XFxuICA8bGFiZWwgZm9yPVxcXCJhY2NvdW50X3Bhc3N3b3JkXFxcIiBjbGFzcz1cXFwiaS1pbnB1dC1lcnJvci1zdWJ0ZXh0IGktZXJyb3JcXFwiIG5nLWlmPVxcXCJsb2dpbkZvcm0ucGFzc3dvcmRGaWVsZC4kZXJyb3IucmVxdWlyZWQgJiYgbG9naW5Gb3JtLnBhc3N3b3JkRmllbGQuJGRpcnR5XFxcIj57ezo6aTE4bi50KCdsb2dpbl9tb2RhbC50aGlzX2ZpZWxkX2lzX3JlcXVpcmVkJyl9fTwvbGFiZWw+XFxuXFxuICA8ZGl2IGNsYXNzPVxcXCJpLWZpZWxkLXJvd1xcXCI+XFxuICAgIDxkaXYgY2xhc3M9XFxcImNvbC1zbS02IGktY2hlY2tib3gtd2l0aC1sYWJlbFxcXCI+XFxuICAgICAgPGlucHV0IHR5cGU9XFxcImNoZWNrYm94XFxcIiBpZD1cXFwicmVtZW1iZXJtZVxcXCIgbmctbW9kZWw9XFxcImxvZ2luQWNjb3VudC5yZW1lbWJlcm1lXFxcIiAvPlxcbiAgICAgIDxsYWJlbCBmb3I9XFxcInJlbWVtYmVybWVcXFwiPnt7OjppMThuLnQoJ3JlbWVtYmVyX21lJyl9fTwvbGFiZWw+XFxuICAgIDwvZGl2PlxcbiAgICA8ZGl2IGNsYXNzPVxcXCJjb2wtc20tNiBpLWZvcmdvdFxcXCI+XFxuICAgICAgPGEgY2xhc3M9XFxcImktYXF1YS1saW5rXFxcIiBuZy1ocmVmPVxcXCJ7ezo6Zm9yZ290UGFzc3dvcmRVcmx9fVxcXCI+e3s6OmkxOG4udCgnZm9yZ290X3Bhc3N3b3JkJyl9fTwvYT5cXG4gICAgPC9kaXY+XFxuICA8L2Rpdj5cXG5cXG4gIDxpbnB1dCB0eXBlPVxcXCJzdWJtaXRcXFwiIGNsYXNzPVxcXCJpLWN0YS0xIGxvZ2luXFxcIiB2YWx1ZT1cXFwie3s6OmkxOG4udCgnbG9nX2luJyl9fVxcXCIgZ29nby10ZXN0PVxcXCJsb2dfaW5cXFwiIC8+XFxuPC9mb3JtPlxcblwiO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9hbmNpbGxhcnkvaGVhZGVyL2xvZ2luLWZvcm0taW5kaWVnb2dvLmh0bWxcbiAqKiBtb2R1bGUgaWQgPSAxOTVcbiAqKiBtb2R1bGUgY2h1bmtzID0gMjRcbiAqKi8iXSwibWFwcGluZ3MiOiJBQUFBIiwic291cmNlUm9vdCI6IiJ9");

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

	eval("module.exports = \"<div id=\\\"session_modal\\\" class=\\\"modal i-session-modal\\\">\\n  <div class=\\\"modal-dialog\\\">\\n    <div class=\\\"modal-content auth-modal\\\">\\n      <a class=\\\"modal-close\\\" data-dismiss=\\\"modal\\\" aria-hidden=\\\"true\\\" ng-click=\\\"$hide()\\\"><svg-icon icon=\\\"icon-icon-close\\\"></svg-icon></a>\\n\\n      <div class=\\\"i-security-message center-text\\\" ng-show=\\\"securityMessage\\\">\\n        <svg-icon icon=\\\"icon-icon-lock\\\"></svg-icon>\\n        <h4>{{::i18n.t('session_modal.check_your_email')}}</h4>\\n        <div ng-bind=\\\"securityMessage\\\"></div>\\n        <a class=\\\"primary-cta\\\" ng-href=\\\"{{securityUrl}}\\\">{{::i18n.t('learn_more')}}</a>\\n      </div>\\n      <div ng-hide=\\\"securityMessage\\\">\\n        <div class=\\\"center-text fb-auth\\\">\\n          <a href=\\\"#\\\" ng-click=\\\"attemptFbLogin()\\\" class=\\\"small-cta small-cta--fbConnect\\\">\\n            <svg-icon icon=\\\"icon-icon-facebook\\\"></svg-icon>\\n            <span>{{::i18n.t('continue_with_facebook')}}</span>\\n          </a>\\n          <p>{{::i18n.t(\\\"generosity.login_page.facebook_intro_2\\\")}}</p>\\n        </div>\\n\\n        <div class=\\\"auth-fields\\\">\\n          <div id=\\\"loginSession\\\" ng-if=\\\"currentForm === 'loginForm'\\\">\\n            <login-form template-url=\\\"login-form-generosity.html\\\"\\n                        modal=\\\"modal\\\"\\n                        callbacks=\\\"sessionCallbacks\\\"\\n            ></login-form>\\n            <div class=\\\"topborder\\\">\\n              {{::i18n.t('generosity.session_modal.new_to_generosity') }}\\n              <a href=\\\"\\\" ng-click=\\\"switchForm('signupForm')\\\" class=\\\"toggler\\\">{{::i18n.t('sign_up')}}</a>\\n            </div>\\n          </div>\\n          <div id=\\\"signUpSession\\\" ng-if=\\\"currentForm === 'signupForm'\\\">\\n            <signup-form template-url=\\\"signup-form-generosity.html\\\"\\n                         domain-code=\\\"generosity\\\"\\n                         modal=\\\"modal\\\"\\n                         callbacks=\\\"sessionCallbacks\\\"\\n            ></signup-form>\\n            <div class=\\\"topborder\\\">\\n              {{::i18n.t('already_have_an_account')}}\\n              <a href=\\\"\\\" ng-click=\\\"switchForm('loginForm')\\\" class=\\\"toggler\\\">{{::i18n.t('log_in')}}</a>\\n            </div>\\n          </div>\\n        </div>\\n      </div>\\n    </div>\\n  </div>\\n</div>\\n\";\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTk2LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vYW5jaWxsYXJ5L2hlYWRlci9zZXNzaW9uLW1vZGFsLWdlbmVyb3NpdHkuaHRtbD9lYjI3Il0sInNvdXJjZXNDb250ZW50IjpbIm1vZHVsZS5leHBvcnRzID0gXCI8ZGl2IGlkPVxcXCJzZXNzaW9uX21vZGFsXFxcIiBjbGFzcz1cXFwibW9kYWwgaS1zZXNzaW9uLW1vZGFsXFxcIj5cXG4gIDxkaXYgY2xhc3M9XFxcIm1vZGFsLWRpYWxvZ1xcXCI+XFxuICAgIDxkaXYgY2xhc3M9XFxcIm1vZGFsLWNvbnRlbnQgYXV0aC1tb2RhbFxcXCI+XFxuICAgICAgPGEgY2xhc3M9XFxcIm1vZGFsLWNsb3NlXFxcIiBkYXRhLWRpc21pc3M9XFxcIm1vZGFsXFxcIiBhcmlhLWhpZGRlbj1cXFwidHJ1ZVxcXCIgbmctY2xpY2s9XFxcIiRoaWRlKClcXFwiPjxzdmctaWNvbiBpY29uPVxcXCJpY29uLWljb24tY2xvc2VcXFwiPjwvc3ZnLWljb24+PC9hPlxcblxcbiAgICAgIDxkaXYgY2xhc3M9XFxcImktc2VjdXJpdHktbWVzc2FnZSBjZW50ZXItdGV4dFxcXCIgbmctc2hvdz1cXFwic2VjdXJpdHlNZXNzYWdlXFxcIj5cXG4gICAgICAgIDxzdmctaWNvbiBpY29uPVxcXCJpY29uLWljb24tbG9ja1xcXCI+PC9zdmctaWNvbj5cXG4gICAgICAgIDxoND57ezo6aTE4bi50KCdzZXNzaW9uX21vZGFsLmNoZWNrX3lvdXJfZW1haWwnKX19PC9oND5cXG4gICAgICAgIDxkaXYgbmctYmluZD1cXFwic2VjdXJpdHlNZXNzYWdlXFxcIj48L2Rpdj5cXG4gICAgICAgIDxhIGNsYXNzPVxcXCJwcmltYXJ5LWN0YVxcXCIgbmctaHJlZj1cXFwie3tzZWN1cml0eVVybH19XFxcIj57ezo6aTE4bi50KCdsZWFybl9tb3JlJyl9fTwvYT5cXG4gICAgICA8L2Rpdj5cXG4gICAgICA8ZGl2IG5nLWhpZGU9XFxcInNlY3VyaXR5TWVzc2FnZVxcXCI+XFxuICAgICAgICA8ZGl2IGNsYXNzPVxcXCJjZW50ZXItdGV4dCBmYi1hdXRoXFxcIj5cXG4gICAgICAgICAgPGEgaHJlZj1cXFwiI1xcXCIgbmctY2xpY2s9XFxcImF0dGVtcHRGYkxvZ2luKClcXFwiIGNsYXNzPVxcXCJzbWFsbC1jdGEgc21hbGwtY3RhLS1mYkNvbm5lY3RcXFwiPlxcbiAgICAgICAgICAgIDxzdmctaWNvbiBpY29uPVxcXCJpY29uLWljb24tZmFjZWJvb2tcXFwiPjwvc3ZnLWljb24+XFxuICAgICAgICAgICAgPHNwYW4+e3s6OmkxOG4udCgnY29udGludWVfd2l0aF9mYWNlYm9vaycpfX08L3NwYW4+XFxuICAgICAgICAgIDwvYT5cXG4gICAgICAgICAgPHA+e3s6OmkxOG4udChcXFwiZ2VuZXJvc2l0eS5sb2dpbl9wYWdlLmZhY2Vib29rX2ludHJvXzJcXFwiKX19PC9wPlxcbiAgICAgICAgPC9kaXY+XFxuXFxuICAgICAgICA8ZGl2IGNsYXNzPVxcXCJhdXRoLWZpZWxkc1xcXCI+XFxuICAgICAgICAgIDxkaXYgaWQ9XFxcImxvZ2luU2Vzc2lvblxcXCIgbmctaWY9XFxcImN1cnJlbnRGb3JtID09PSAnbG9naW5Gb3JtJ1xcXCI+XFxuICAgICAgICAgICAgPGxvZ2luLWZvcm0gdGVtcGxhdGUtdXJsPVxcXCJsb2dpbi1mb3JtLWdlbmVyb3NpdHkuaHRtbFxcXCJcXG4gICAgICAgICAgICAgICAgICAgICAgICBtb2RhbD1cXFwibW9kYWxcXFwiXFxuICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2tzPVxcXCJzZXNzaW9uQ2FsbGJhY2tzXFxcIlxcbiAgICAgICAgICAgID48L2xvZ2luLWZvcm0+XFxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwidG9wYm9yZGVyXFxcIj5cXG4gICAgICAgICAgICAgIHt7OjppMThuLnQoJ2dlbmVyb3NpdHkuc2Vzc2lvbl9tb2RhbC5uZXdfdG9fZ2VuZXJvc2l0eScpIH19XFxuICAgICAgICAgICAgICA8YSBocmVmPVxcXCJcXFwiIG5nLWNsaWNrPVxcXCJzd2l0Y2hGb3JtKCdzaWdudXBGb3JtJylcXFwiIGNsYXNzPVxcXCJ0b2dnbGVyXFxcIj57ezo6aTE4bi50KCdzaWduX3VwJyl9fTwvYT5cXG4gICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgPC9kaXY+XFxuICAgICAgICAgIDxkaXYgaWQ9XFxcInNpZ25VcFNlc3Npb25cXFwiIG5nLWlmPVxcXCJjdXJyZW50Rm9ybSA9PT0gJ3NpZ251cEZvcm0nXFxcIj5cXG4gICAgICAgICAgICA8c2lnbnVwLWZvcm0gdGVtcGxhdGUtdXJsPVxcXCJzaWdudXAtZm9ybS1nZW5lcm9zaXR5Lmh0bWxcXFwiXFxuICAgICAgICAgICAgICAgICAgICAgICAgIGRvbWFpbi1jb2RlPVxcXCJnZW5lcm9zaXR5XFxcIlxcbiAgICAgICAgICAgICAgICAgICAgICAgICBtb2RhbD1cXFwibW9kYWxcXFwiXFxuICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrcz1cXFwic2Vzc2lvbkNhbGxiYWNrc1xcXCJcXG4gICAgICAgICAgICA+PC9zaWdudXAtZm9ybT5cXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJ0b3Bib3JkZXJcXFwiPlxcbiAgICAgICAgICAgICAge3s6OmkxOG4udCgnYWxyZWFkeV9oYXZlX2FuX2FjY291bnQnKX19XFxuICAgICAgICAgICAgICA8YSBocmVmPVxcXCJcXFwiIG5nLWNsaWNrPVxcXCJzd2l0Y2hGb3JtKCdsb2dpbkZvcm0nKVxcXCIgY2xhc3M9XFxcInRvZ2dsZXJcXFwiPnt7OjppMThuLnQoJ2xvZ19pbicpfX08L2E+XFxuICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgPC9kaXY+XFxuICAgICAgPC9kaXY+XFxuICAgIDwvZGl2PlxcbiAgPC9kaXY+XFxuPC9kaXY+XFxuXCI7XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL2FuY2lsbGFyeS9oZWFkZXIvc2Vzc2lvbi1tb2RhbC1nZW5lcm9zaXR5Lmh0bWxcbiAqKiBtb2R1bGUgaWQgPSAxOTZcbiAqKiBtb2R1bGUgY2h1bmtzID0gMjRcbiAqKi8iXSwibWFwcGluZ3MiOiJBQUFBIiwic291cmNlUm9vdCI6IiJ9");

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

	eval("module.exports = \"<div id=\\\"session_modal\\\" class=\\\"modal i-modal i-session-modal\\\" gogo-test=\\\"{{gogoTestModalLabel}}\\\">\\n  <div class=\\\"modal-dialog\\\">\\n    <div class=\\\"modal-content auth-modal\\\">\\n      <a class=\\\"modal-close\\\" data-dismiss=\\\"modal\\\" aria-hidden=\\\"true\\\" ng-click=\\\"$hide()\\\"><svg><use xlink:href=\\\"#icon-icon-close\\\"></use></svg></a>\\n      <div ng-if=\\\"banner\\\" class=\\\"modal-banner\\\">{{banner}}</div>\\n\\n      <div class=\\\"securityMessage\\\" ng-show=\\\"securityMessage\\\">\\n        <svg class=\\\"securityMessage-lock\\\"><use xlink:href=\\\"#icon-icon-lock\\\"></use></svg>\\n        <div class=\\\"securityMessage-header\\\">{{::i18n.t('session_modal.check_your_email')}}</div>\\n        <div ng-bind=\\\"securityMessage\\\"></div>\\n        <a class=\\\"i-cta-1 securityMessage-cta\\\" target=\\\"_blank\\\" ng-href=\\\"{{securityUrl}}\\\">{{::i18n.t('learn_more')}}</a>\\n      </div>\\n      <div ng-hide=\\\"securityMessage\\\">\\n        <div class=\\\"center-text fb-auth\\\">\\n          <a href=\\\"#\\\" ng-click=\\\"attemptFbLogin()\\\" class=\\\"i-cta-1 i-cta-1--iconed i-cta-1--facebook i-cta-1--fullWidth i-cta-1--authFacebook authModal-facebook\\\">\\n            <svg class=\\\"i-cta-1-icon\\\"><use xlink:href=\\\"#icon-icon-facebook\\\"></use></svg>\\n            <span>{{::i18n.t('continue_with_facebook')}}</span>\\n          </a>\\n          <p>{{::i18n.t(\\\"login_page.facebook_intro_2\\\") }}</p>\\n        </div>\\n\\n        <div class=\\\"auth-fields\\\">\\n          <div id=\\\"loginSession\\\" ng-if=\\\"currentForm === 'loginForm'\\\">\\n            <login-form template-url=\\\"login-form-indiegogo.html\\\"\\n                        modal=\\\"modal\\\"\\n                        callbacks=\\\"sessionCallbacks\\\"\\n                        login-status=\\\"authStatus\\\"\\n              ></login-form>\\n            <div class=\\\"topborder\\\">\\n              {{::i18n.t('new_to_igg')}}\\n              <a href=\\\"\\\" ng-click=\\\"switchForm('signupForm')\\\" class=\\\"toggler\\\">{{::i18n.t('sign_up')}}</a>\\n            </div>\\n          </div>\\n\\n          <div id=\\\"signUpSession\\\" ng-if=\\\"currentForm === 'signupForm'\\\">\\n            <signup-form template-url=\\\"signup-form-indiegogo.html\\\"\\n                         domain-code=\\\"www\\\"\\n                         modal=\\\"modal\\\"\\n                         callbacks=\\\"sessionCallbacks\\\"\\n                         signup-status=\\\"authStatus\\\"\\n              ></signup-form>\\n            <div class=\\\"topborder\\\">\\n              {{::i18n.t('already_have_an_account')}}\\n              <a href=\\\"\\\" ng-click=\\\"switchForm('loginForm')\\\" class=\\\"toggler\\\">{{::i18n.t('log_in')}}</a>\\n            </div>\\n          </div>\\n        </div>\\n      </div>\\n    </div>\\n  </div>\\n</div>\\n\";\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTk3LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vYW5jaWxsYXJ5L2hlYWRlci9zZXNzaW9uLW1vZGFsLWluZGllZ29nby5odG1sPzBmNjciXSwic291cmNlc0NvbnRlbnQiOlsibW9kdWxlLmV4cG9ydHMgPSBcIjxkaXYgaWQ9XFxcInNlc3Npb25fbW9kYWxcXFwiIGNsYXNzPVxcXCJtb2RhbCBpLW1vZGFsIGktc2Vzc2lvbi1tb2RhbFxcXCIgZ29nby10ZXN0PVxcXCJ7e2dvZ29UZXN0TW9kYWxMYWJlbH19XFxcIj5cXG4gIDxkaXYgY2xhc3M9XFxcIm1vZGFsLWRpYWxvZ1xcXCI+XFxuICAgIDxkaXYgY2xhc3M9XFxcIm1vZGFsLWNvbnRlbnQgYXV0aC1tb2RhbFxcXCI+XFxuICAgICAgPGEgY2xhc3M9XFxcIm1vZGFsLWNsb3NlXFxcIiBkYXRhLWRpc21pc3M9XFxcIm1vZGFsXFxcIiBhcmlhLWhpZGRlbj1cXFwidHJ1ZVxcXCIgbmctY2xpY2s9XFxcIiRoaWRlKClcXFwiPjxzdmc+PHVzZSB4bGluazpocmVmPVxcXCIjaWNvbi1pY29uLWNsb3NlXFxcIj48L3VzZT48L3N2Zz48L2E+XFxuICAgICAgPGRpdiBuZy1pZj1cXFwiYmFubmVyXFxcIiBjbGFzcz1cXFwibW9kYWwtYmFubmVyXFxcIj57e2Jhbm5lcn19PC9kaXY+XFxuXFxuICAgICAgPGRpdiBjbGFzcz1cXFwic2VjdXJpdHlNZXNzYWdlXFxcIiBuZy1zaG93PVxcXCJzZWN1cml0eU1lc3NhZ2VcXFwiPlxcbiAgICAgICAgPHN2ZyBjbGFzcz1cXFwic2VjdXJpdHlNZXNzYWdlLWxvY2tcXFwiPjx1c2UgeGxpbms6aHJlZj1cXFwiI2ljb24taWNvbi1sb2NrXFxcIj48L3VzZT48L3N2Zz5cXG4gICAgICAgIDxkaXYgY2xhc3M9XFxcInNlY3VyaXR5TWVzc2FnZS1oZWFkZXJcXFwiPnt7OjppMThuLnQoJ3Nlc3Npb25fbW9kYWwuY2hlY2tfeW91cl9lbWFpbCcpfX08L2Rpdj5cXG4gICAgICAgIDxkaXYgbmctYmluZD1cXFwic2VjdXJpdHlNZXNzYWdlXFxcIj48L2Rpdj5cXG4gICAgICAgIDxhIGNsYXNzPVxcXCJpLWN0YS0xIHNlY3VyaXR5TWVzc2FnZS1jdGFcXFwiIHRhcmdldD1cXFwiX2JsYW5rXFxcIiBuZy1ocmVmPVxcXCJ7e3NlY3VyaXR5VXJsfX1cXFwiPnt7OjppMThuLnQoJ2xlYXJuX21vcmUnKX19PC9hPlxcbiAgICAgIDwvZGl2PlxcbiAgICAgIDxkaXYgbmctaGlkZT1cXFwic2VjdXJpdHlNZXNzYWdlXFxcIj5cXG4gICAgICAgIDxkaXYgY2xhc3M9XFxcImNlbnRlci10ZXh0IGZiLWF1dGhcXFwiPlxcbiAgICAgICAgICA8YSBocmVmPVxcXCIjXFxcIiBuZy1jbGljaz1cXFwiYXR0ZW1wdEZiTG9naW4oKVxcXCIgY2xhc3M9XFxcImktY3RhLTEgaS1jdGEtMS0taWNvbmVkIGktY3RhLTEtLWZhY2Vib29rIGktY3RhLTEtLWZ1bGxXaWR0aCBpLWN0YS0xLS1hdXRoRmFjZWJvb2sgYXV0aE1vZGFsLWZhY2Vib29rXFxcIj5cXG4gICAgICAgICAgICA8c3ZnIGNsYXNzPVxcXCJpLWN0YS0xLWljb25cXFwiPjx1c2UgeGxpbms6aHJlZj1cXFwiI2ljb24taWNvbi1mYWNlYm9va1xcXCI+PC91c2U+PC9zdmc+XFxuICAgICAgICAgICAgPHNwYW4+e3s6OmkxOG4udCgnY29udGludWVfd2l0aF9mYWNlYm9vaycpfX08L3NwYW4+XFxuICAgICAgICAgIDwvYT5cXG4gICAgICAgICAgPHA+e3s6OmkxOG4udChcXFwibG9naW5fcGFnZS5mYWNlYm9va19pbnRyb18yXFxcIikgfX08L3A+XFxuICAgICAgICA8L2Rpdj5cXG5cXG4gICAgICAgIDxkaXYgY2xhc3M9XFxcImF1dGgtZmllbGRzXFxcIj5cXG4gICAgICAgICAgPGRpdiBpZD1cXFwibG9naW5TZXNzaW9uXFxcIiBuZy1pZj1cXFwiY3VycmVudEZvcm0gPT09ICdsb2dpbkZvcm0nXFxcIj5cXG4gICAgICAgICAgICA8bG9naW4tZm9ybSB0ZW1wbGF0ZS11cmw9XFxcImxvZ2luLWZvcm0taW5kaWVnb2dvLmh0bWxcXFwiXFxuICAgICAgICAgICAgICAgICAgICAgICAgbW9kYWw9XFxcIm1vZGFsXFxcIlxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrcz1cXFwic2Vzc2lvbkNhbGxiYWNrc1xcXCJcXG4gICAgICAgICAgICAgICAgICAgICAgICBsb2dpbi1zdGF0dXM9XFxcImF1dGhTdGF0dXNcXFwiXFxuICAgICAgICAgICAgICA+PC9sb2dpbi1mb3JtPlxcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcInRvcGJvcmRlclxcXCI+XFxuICAgICAgICAgICAgICB7ezo6aTE4bi50KCduZXdfdG9faWdnJyl9fVxcbiAgICAgICAgICAgICAgPGEgaHJlZj1cXFwiXFxcIiBuZy1jbGljaz1cXFwic3dpdGNoRm9ybSgnc2lnbnVwRm9ybScpXFxcIiBjbGFzcz1cXFwidG9nZ2xlclxcXCI+e3s6OmkxOG4udCgnc2lnbl91cCcpfX08L2E+XFxuICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICAgIDwvZGl2PlxcblxcbiAgICAgICAgICA8ZGl2IGlkPVxcXCJzaWduVXBTZXNzaW9uXFxcIiBuZy1pZj1cXFwiY3VycmVudEZvcm0gPT09ICdzaWdudXBGb3JtJ1xcXCI+XFxuICAgICAgICAgICAgPHNpZ251cC1mb3JtIHRlbXBsYXRlLXVybD1cXFwic2lnbnVwLWZvcm0taW5kaWVnb2dvLmh0bWxcXFwiXFxuICAgICAgICAgICAgICAgICAgICAgICAgIGRvbWFpbi1jb2RlPVxcXCJ3d3dcXFwiXFxuICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGFsPVxcXCJtb2RhbFxcXCJcXG4gICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2tzPVxcXCJzZXNzaW9uQ2FsbGJhY2tzXFxcIlxcbiAgICAgICAgICAgICAgICAgICAgICAgICBzaWdudXAtc3RhdHVzPVxcXCJhdXRoU3RhdHVzXFxcIlxcbiAgICAgICAgICAgICAgPjwvc2lnbnVwLWZvcm0+XFxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwidG9wYm9yZGVyXFxcIj5cXG4gICAgICAgICAgICAgIHt7OjppMThuLnQoJ2FscmVhZHlfaGF2ZV9hbl9hY2NvdW50Jyl9fVxcbiAgICAgICAgICAgICAgPGEgaHJlZj1cXFwiXFxcIiBuZy1jbGljaz1cXFwic3dpdGNoRm9ybSgnbG9naW5Gb3JtJylcXFwiIGNsYXNzPVxcXCJ0b2dnbGVyXFxcIj57ezo6aTE4bi50KCdsb2dfaW4nKX19PC9hPlxcbiAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgIDwvZGl2PlxcbiAgICAgIDwvZGl2PlxcbiAgICA8L2Rpdj5cXG4gIDwvZGl2PlxcbjwvZGl2PlxcblwiO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9hbmNpbGxhcnkvaGVhZGVyL3Nlc3Npb24tbW9kYWwtaW5kaWVnb2dvLmh0bWxcbiAqKiBtb2R1bGUgaWQgPSAxOTdcbiAqKiBtb2R1bGUgY2h1bmtzID0gMjRcbiAqKi8iXSwibWFwcGluZ3MiOiJBQUFBIiwic291cmNlUm9vdCI6IiJ9");

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

	eval("module.exports = \"<p class=\\\"sign-up-with-email divider\\\"><span class=\\\"divider-line\\\">{{::i18n.t('or_sign_up_with_email') }}</span></p>\\n<form name=\\\"signupForm\\\" novalidate ng-submit=\\\"submitSignup()\\\">\\n\\n  <p class=\\\"i-error\\\" ng-if=\\\"errorMessage\\\" ng-bind=\\\"errorMessage\\\"></p>\\n  <input type=\\\"text\\\" name=\\\"firstnameField\\\" id=\\\"account_firstname\\\" class=\\\"i-text-field\\\" placeholder=\\\"{{::i18n.t('first_name')}}\\\" ng-model=\\\"signupAccount.firstname\\\" required />\\n  <label for=\\\"account_firstname\\\" class=\\\"i-error\\\" ng-if=\\\"signupForm.firstnameField.$error.required && signupForm.firstnameField.$dirty\\\">{{::i18n.t('signup_modal.this_field_is_required')}}</label>\\n\\n  <input type=\\\"text\\\" name=\\\"lastnameField\\\" id=\\\"account_lastname\\\" class=\\\"i-text-field\\\" placeholder=\\\"{{::i18n.t('last_name')}}\\\" ng-model=\\\"signupAccount.lastname\\\" required />\\n  <label for=\\\"account_lastname\\\" class=\\\"i-error\\\" ng-if=\\\"signupForm.lastnameField.$error.required && signupForm['account[lastname]'].$dirty\\\">{{::i18n.t('signup_modal.this_field_is_required')}}</label>\\n\\n  <input type=\\\"text\\\" name=\\\"emailField\\\" id=\\\"account_email\\\" class=\\\"i-text-field\\\" placeholder=\\\"{{::i18n.t('email_caps')}}\\\" ng-model=\\\"signupAccount.email\\\" required />\\n  <label for=\\\"account_email\\\" class=\\\"i-error\\\" ng-if=\\\"signupFailed && !signupAccount.emailValid()\\\">{{::i18n.t('signup_modal.please_enter_a_valid_email_address')}}</label>\\n  <label for=\\\"account_email\\\" class=\\\"i-error\\\" ng-if=\\\"signupFailed && !signupAccount.email\\\">{{::i18n.t('signup_modal.this_field_is_required')}}</label>\\n\\n  <input type=\\\"password\\\" name=\\\"passwordField\\\" id=\\\"take\\\" class=\\\"i-text-field\\\" minlength=\\\"6\\\" autocomplete=\\\"off\\\" placeholder=\\\"{{::i18n.t('password')}}\\\" ng-model=\\\"signupAccount.password\\\" required />\\n  <label for=\\\"take\\\" class=\\\"i-error\\\" ng-if=\\\"signupFailed && !signupAccount.passwordValid()\\\">{{::i18n.t('must_be_between_6_and_40_characters')}}</label>\\n  <label for=\\\"take\\\" class=\\\"i-error\\\" ng-if=\\\"signupFailed && !signupAccount.password\\\">{{::i18n.t('signup_modal.invalid_password')}}</label>\\n\\n  <div class=\\\"i-field-row checkboxWithLabel\\\">\\n    <input type=\\\"checkbox\\\" ng-model=\\\"signupAccount.general_opt_in\\\" id=\\\"optIn\\\" />\\n    <label for=\\\"optIn\\\">{{::i18n.t('generosity.login_page.sign_me_up_for_newsletter')}}</label>\\n  </div>\\n  <input type=\\\"submit\\\" value=\\\"{{::i18n.t('create_an_account')}}\\\" class=\\\"small-cta\\\" />\\n\\n  <div class=\\\"finePrint\\\">\\n    {{::i18n.t('generosity.session_modal.fee_signup_info')}}\\n    <span ng-bind-html=\\\"boilerplateHtml\\\"></span>\\n  </div>\\n</form>\\n\";\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTk4LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vYW5jaWxsYXJ5L2hlYWRlci9zaWdudXAtZm9ybS1nZW5lcm9zaXR5Lmh0bWw/ZDg5NiJdLCJzb3VyY2VzQ29udGVudCI6WyJtb2R1bGUuZXhwb3J0cyA9IFwiPHAgY2xhc3M9XFxcInNpZ24tdXAtd2l0aC1lbWFpbCBkaXZpZGVyXFxcIj48c3BhbiBjbGFzcz1cXFwiZGl2aWRlci1saW5lXFxcIj57ezo6aTE4bi50KCdvcl9zaWduX3VwX3dpdGhfZW1haWwnKSB9fTwvc3Bhbj48L3A+XFxuPGZvcm0gbmFtZT1cXFwic2lnbnVwRm9ybVxcXCIgbm92YWxpZGF0ZSBuZy1zdWJtaXQ9XFxcInN1Ym1pdFNpZ251cCgpXFxcIj5cXG5cXG4gIDxwIGNsYXNzPVxcXCJpLWVycm9yXFxcIiBuZy1pZj1cXFwiZXJyb3JNZXNzYWdlXFxcIiBuZy1iaW5kPVxcXCJlcnJvck1lc3NhZ2VcXFwiPjwvcD5cXG4gIDxpbnB1dCB0eXBlPVxcXCJ0ZXh0XFxcIiBuYW1lPVxcXCJmaXJzdG5hbWVGaWVsZFxcXCIgaWQ9XFxcImFjY291bnRfZmlyc3RuYW1lXFxcIiBjbGFzcz1cXFwiaS10ZXh0LWZpZWxkXFxcIiBwbGFjZWhvbGRlcj1cXFwie3s6OmkxOG4udCgnZmlyc3RfbmFtZScpfX1cXFwiIG5nLW1vZGVsPVxcXCJzaWdudXBBY2NvdW50LmZpcnN0bmFtZVxcXCIgcmVxdWlyZWQgLz5cXG4gIDxsYWJlbCBmb3I9XFxcImFjY291bnRfZmlyc3RuYW1lXFxcIiBjbGFzcz1cXFwiaS1lcnJvclxcXCIgbmctaWY9XFxcInNpZ251cEZvcm0uZmlyc3RuYW1lRmllbGQuJGVycm9yLnJlcXVpcmVkICYmIHNpZ251cEZvcm0uZmlyc3RuYW1lRmllbGQuJGRpcnR5XFxcIj57ezo6aTE4bi50KCdzaWdudXBfbW9kYWwudGhpc19maWVsZF9pc19yZXF1aXJlZCcpfX08L2xhYmVsPlxcblxcbiAgPGlucHV0IHR5cGU9XFxcInRleHRcXFwiIG5hbWU9XFxcImxhc3RuYW1lRmllbGRcXFwiIGlkPVxcXCJhY2NvdW50X2xhc3RuYW1lXFxcIiBjbGFzcz1cXFwiaS10ZXh0LWZpZWxkXFxcIiBwbGFjZWhvbGRlcj1cXFwie3s6OmkxOG4udCgnbGFzdF9uYW1lJyl9fVxcXCIgbmctbW9kZWw9XFxcInNpZ251cEFjY291bnQubGFzdG5hbWVcXFwiIHJlcXVpcmVkIC8+XFxuICA8bGFiZWwgZm9yPVxcXCJhY2NvdW50X2xhc3RuYW1lXFxcIiBjbGFzcz1cXFwiaS1lcnJvclxcXCIgbmctaWY9XFxcInNpZ251cEZvcm0ubGFzdG5hbWVGaWVsZC4kZXJyb3IucmVxdWlyZWQgJiYgc2lnbnVwRm9ybVsnYWNjb3VudFtsYXN0bmFtZV0nXS4kZGlydHlcXFwiPnt7OjppMThuLnQoJ3NpZ251cF9tb2RhbC50aGlzX2ZpZWxkX2lzX3JlcXVpcmVkJyl9fTwvbGFiZWw+XFxuXFxuICA8aW5wdXQgdHlwZT1cXFwidGV4dFxcXCIgbmFtZT1cXFwiZW1haWxGaWVsZFxcXCIgaWQ9XFxcImFjY291bnRfZW1haWxcXFwiIGNsYXNzPVxcXCJpLXRleHQtZmllbGRcXFwiIHBsYWNlaG9sZGVyPVxcXCJ7ezo6aTE4bi50KCdlbWFpbF9jYXBzJyl9fVxcXCIgbmctbW9kZWw9XFxcInNpZ251cEFjY291bnQuZW1haWxcXFwiIHJlcXVpcmVkIC8+XFxuICA8bGFiZWwgZm9yPVxcXCJhY2NvdW50X2VtYWlsXFxcIiBjbGFzcz1cXFwiaS1lcnJvclxcXCIgbmctaWY9XFxcInNpZ251cEZhaWxlZCAmJiAhc2lnbnVwQWNjb3VudC5lbWFpbFZhbGlkKClcXFwiPnt7OjppMThuLnQoJ3NpZ251cF9tb2RhbC5wbGVhc2VfZW50ZXJfYV92YWxpZF9lbWFpbF9hZGRyZXNzJyl9fTwvbGFiZWw+XFxuICA8bGFiZWwgZm9yPVxcXCJhY2NvdW50X2VtYWlsXFxcIiBjbGFzcz1cXFwiaS1lcnJvclxcXCIgbmctaWY9XFxcInNpZ251cEZhaWxlZCAmJiAhc2lnbnVwQWNjb3VudC5lbWFpbFxcXCI+e3s6OmkxOG4udCgnc2lnbnVwX21vZGFsLnRoaXNfZmllbGRfaXNfcmVxdWlyZWQnKX19PC9sYWJlbD5cXG5cXG4gIDxpbnB1dCB0eXBlPVxcXCJwYXNzd29yZFxcXCIgbmFtZT1cXFwicGFzc3dvcmRGaWVsZFxcXCIgaWQ9XFxcInRha2VcXFwiIGNsYXNzPVxcXCJpLXRleHQtZmllbGRcXFwiIG1pbmxlbmd0aD1cXFwiNlxcXCIgYXV0b2NvbXBsZXRlPVxcXCJvZmZcXFwiIHBsYWNlaG9sZGVyPVxcXCJ7ezo6aTE4bi50KCdwYXNzd29yZCcpfX1cXFwiIG5nLW1vZGVsPVxcXCJzaWdudXBBY2NvdW50LnBhc3N3b3JkXFxcIiByZXF1aXJlZCAvPlxcbiAgPGxhYmVsIGZvcj1cXFwidGFrZVxcXCIgY2xhc3M9XFxcImktZXJyb3JcXFwiIG5nLWlmPVxcXCJzaWdudXBGYWlsZWQgJiYgIXNpZ251cEFjY291bnQucGFzc3dvcmRWYWxpZCgpXFxcIj57ezo6aTE4bi50KCdtdXN0X2JlX2JldHdlZW5fNl9hbmRfNDBfY2hhcmFjdGVycycpfX08L2xhYmVsPlxcbiAgPGxhYmVsIGZvcj1cXFwidGFrZVxcXCIgY2xhc3M9XFxcImktZXJyb3JcXFwiIG5nLWlmPVxcXCJzaWdudXBGYWlsZWQgJiYgIXNpZ251cEFjY291bnQucGFzc3dvcmRcXFwiPnt7OjppMThuLnQoJ3NpZ251cF9tb2RhbC5pbnZhbGlkX3Bhc3N3b3JkJyl9fTwvbGFiZWw+XFxuXFxuICA8ZGl2IGNsYXNzPVxcXCJpLWZpZWxkLXJvdyBjaGVja2JveFdpdGhMYWJlbFxcXCI+XFxuICAgIDxpbnB1dCB0eXBlPVxcXCJjaGVja2JveFxcXCIgbmctbW9kZWw9XFxcInNpZ251cEFjY291bnQuZ2VuZXJhbF9vcHRfaW5cXFwiIGlkPVxcXCJvcHRJblxcXCIgLz5cXG4gICAgPGxhYmVsIGZvcj1cXFwib3B0SW5cXFwiPnt7OjppMThuLnQoJ2dlbmVyb3NpdHkubG9naW5fcGFnZS5zaWduX21lX3VwX2Zvcl9uZXdzbGV0dGVyJyl9fTwvbGFiZWw+XFxuICA8L2Rpdj5cXG4gIDxpbnB1dCB0eXBlPVxcXCJzdWJtaXRcXFwiIHZhbHVlPVxcXCJ7ezo6aTE4bi50KCdjcmVhdGVfYW5fYWNjb3VudCcpfX1cXFwiIGNsYXNzPVxcXCJzbWFsbC1jdGFcXFwiIC8+XFxuXFxuICA8ZGl2IGNsYXNzPVxcXCJmaW5lUHJpbnRcXFwiPlxcbiAgICB7ezo6aTE4bi50KCdnZW5lcm9zaXR5LnNlc3Npb25fbW9kYWwuZmVlX3NpZ251cF9pbmZvJyl9fVxcbiAgICA8c3BhbiBuZy1iaW5kLWh0bWw9XFxcImJvaWxlcnBsYXRlSHRtbFxcXCI+PC9zcGFuPlxcbiAgPC9kaXY+XFxuPC9mb3JtPlxcblwiO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9hbmNpbGxhcnkvaGVhZGVyL3NpZ251cC1mb3JtLWdlbmVyb3NpdHkuaHRtbFxuICoqIG1vZHVsZSBpZCA9IDE5OFxuICoqIG1vZHVsZSBjaHVua3MgPSAyNFxuICoqLyJdLCJtYXBwaW5ncyI6IkFBQUEiLCJzb3VyY2VSb290IjoiIn0=");

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

	eval("module.exports = \"<p class=\\\"sign-up-with-email divider\\\"><span class=\\\"divider-line\\\">{{::i18n.t('or_sign_up_with_email') }}</span></p>\\n<form name=\\\"signupForm\\\" novalidate ng-submit=\\\"submitSignup()\\\">\\n\\n  <p class=\\\"i-error\\\" ng-if=\\\"errorMessage\\\" ng-bind=\\\"errorMessage\\\"></p>\\n  <input type=\\\"text\\\" name=\\\"firstnameField\\\" id=\\\"account_firstname\\\" class=\\\"i-text-field\\\" placeholder=\\\"{{::i18n.t('first_name')}}\\\" ng-model=\\\"signupAccount.firstname\\\" required />\\n  <label for=\\\"account_firstname\\\" class=\\\"i-input-error-subtext i-error\\\" ng-if=\\\"signupForm.firstnameField.$error.required && (signupFailed || signupForm.firstnameField.$dirty)\\\">{{::i18n.t('signup_modal.this_field_is_required')}}</label>\\n\\n  <input type=\\\"text\\\" name=\\\"lastnameField\\\" id=\\\"account_lastname\\\" class=\\\"i-text-field\\\" placeholder=\\\"{{::i18n.t('last_name')}}\\\" ng-model=\\\"signupAccount.lastname\\\" required />\\n  <label for=\\\"account_lastname\\\" class=\\\"i-input-error-subtext i-error\\\" ng-if=\\\"signupForm.lastnameField.$error.required && (signupFailed || signupForm.lastnameField.$dirty)\\\">{{::i18n.t('signup_modal.this_field_is_required')}}</label>\\n\\n  <input type=\\\"text\\\" name=\\\"emailField\\\" id=\\\"account_email\\\" class=\\\"i-text-field\\\" placeholder=\\\"{{::i18n.t('email_caps')}}\\\" ng-model=\\\"signupAccount.email\\\" required />\\n  <label for=\\\"account_email\\\" class=\\\"i-input-error-subtext i-error\\\" ng-if=\\\"signupFailed && !signupAccount.emailValid()\\\">{{::i18n.t('signup_modal.please_enter_a_valid_email_address')}}</label>\\n  <label for=\\\"account_email\\\" class=\\\"i-input-error-subtext i-error\\\" ng-if=\\\"signupFailed && !signupAccount.email\\\">{{::i18n.t('signup_modal.this_field_is_required')}}</label>\\n\\n  <input type=\\\"password\\\" name=\\\"passwordField\\\" id=\\\"take\\\" class=\\\"i-text-field\\\" minlength=\\\"6\\\" autocomplete=\\\"off\\\" placeholder=\\\"{{::i18n.t('password')}}\\\" ng-model=\\\"signupAccount.password\\\" required />\\n  <label for=\\\"take\\\" class=\\\"i-input-error-subtext i-error\\\" ng-if=\\\"signupFailed && !signupAccount.passwordValid()\\\">{{::i18n.t('must_be_between_6_and_40_characters')}}</label>\\n  <label for=\\\"take\\\" class=\\\"i-input-error-subtext i-error\\\" ng-if=\\\"signupFailed && !signupAccount.password\\\">{{::i18n.t('signup_modal.invalid_password')}}</label>\\n\\n  <div class=\\\"i-field-row i-checkbox-with-label\\\">\\n    <input type=\\\"checkbox\\\" ng-model=\\\"signupAccount.general_opt_in\\\" id=\\\"optIn\\\" />\\n    <label for=\\\"optIn\\\">{{::i18n.t('sign_me_up_for_newsletter')}}</label>\\n  </div>\\n  <input ng-disabled=\\\"disableSignUp\\\" type=\\\"submit\\\" value=\\\"{{::i18n.t('create_an_account')}}\\\" class=\\\"i-cta-1\\\" />\\n\\n  <div class=\\\"i-fine-print\\\">\\n    <span ng-bind-html=\\\"boilerplateHtml\\\"></span>\\n  </div>\\n</form>\\n\";\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTk5LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vYW5jaWxsYXJ5L2hlYWRlci9zaWdudXAtZm9ybS1pbmRpZWdvZ28uaHRtbD9lNDM0Il0sInNvdXJjZXNDb250ZW50IjpbIm1vZHVsZS5leHBvcnRzID0gXCI8cCBjbGFzcz1cXFwic2lnbi11cC13aXRoLWVtYWlsIGRpdmlkZXJcXFwiPjxzcGFuIGNsYXNzPVxcXCJkaXZpZGVyLWxpbmVcXFwiPnt7OjppMThuLnQoJ29yX3NpZ25fdXBfd2l0aF9lbWFpbCcpIH19PC9zcGFuPjwvcD5cXG48Zm9ybSBuYW1lPVxcXCJzaWdudXBGb3JtXFxcIiBub3ZhbGlkYXRlIG5nLXN1Ym1pdD1cXFwic3VibWl0U2lnbnVwKClcXFwiPlxcblxcbiAgPHAgY2xhc3M9XFxcImktZXJyb3JcXFwiIG5nLWlmPVxcXCJlcnJvck1lc3NhZ2VcXFwiIG5nLWJpbmQ9XFxcImVycm9yTWVzc2FnZVxcXCI+PC9wPlxcbiAgPGlucHV0IHR5cGU9XFxcInRleHRcXFwiIG5hbWU9XFxcImZpcnN0bmFtZUZpZWxkXFxcIiBpZD1cXFwiYWNjb3VudF9maXJzdG5hbWVcXFwiIGNsYXNzPVxcXCJpLXRleHQtZmllbGRcXFwiIHBsYWNlaG9sZGVyPVxcXCJ7ezo6aTE4bi50KCdmaXJzdF9uYW1lJyl9fVxcXCIgbmctbW9kZWw9XFxcInNpZ251cEFjY291bnQuZmlyc3RuYW1lXFxcIiByZXF1aXJlZCAvPlxcbiAgPGxhYmVsIGZvcj1cXFwiYWNjb3VudF9maXJzdG5hbWVcXFwiIGNsYXNzPVxcXCJpLWlucHV0LWVycm9yLXN1YnRleHQgaS1lcnJvclxcXCIgbmctaWY9XFxcInNpZ251cEZvcm0uZmlyc3RuYW1lRmllbGQuJGVycm9yLnJlcXVpcmVkICYmIChzaWdudXBGYWlsZWQgfHwgc2lnbnVwRm9ybS5maXJzdG5hbWVGaWVsZC4kZGlydHkpXFxcIj57ezo6aTE4bi50KCdzaWdudXBfbW9kYWwudGhpc19maWVsZF9pc19yZXF1aXJlZCcpfX08L2xhYmVsPlxcblxcbiAgPGlucHV0IHR5cGU9XFxcInRleHRcXFwiIG5hbWU9XFxcImxhc3RuYW1lRmllbGRcXFwiIGlkPVxcXCJhY2NvdW50X2xhc3RuYW1lXFxcIiBjbGFzcz1cXFwiaS10ZXh0LWZpZWxkXFxcIiBwbGFjZWhvbGRlcj1cXFwie3s6OmkxOG4udCgnbGFzdF9uYW1lJyl9fVxcXCIgbmctbW9kZWw9XFxcInNpZ251cEFjY291bnQubGFzdG5hbWVcXFwiIHJlcXVpcmVkIC8+XFxuICA8bGFiZWwgZm9yPVxcXCJhY2NvdW50X2xhc3RuYW1lXFxcIiBjbGFzcz1cXFwiaS1pbnB1dC1lcnJvci1zdWJ0ZXh0IGktZXJyb3JcXFwiIG5nLWlmPVxcXCJzaWdudXBGb3JtLmxhc3RuYW1lRmllbGQuJGVycm9yLnJlcXVpcmVkICYmIChzaWdudXBGYWlsZWQgfHwgc2lnbnVwRm9ybS5sYXN0bmFtZUZpZWxkLiRkaXJ0eSlcXFwiPnt7OjppMThuLnQoJ3NpZ251cF9tb2RhbC50aGlzX2ZpZWxkX2lzX3JlcXVpcmVkJyl9fTwvbGFiZWw+XFxuXFxuICA8aW5wdXQgdHlwZT1cXFwidGV4dFxcXCIgbmFtZT1cXFwiZW1haWxGaWVsZFxcXCIgaWQ9XFxcImFjY291bnRfZW1haWxcXFwiIGNsYXNzPVxcXCJpLXRleHQtZmllbGRcXFwiIHBsYWNlaG9sZGVyPVxcXCJ7ezo6aTE4bi50KCdlbWFpbF9jYXBzJyl9fVxcXCIgbmctbW9kZWw9XFxcInNpZ251cEFjY291bnQuZW1haWxcXFwiIHJlcXVpcmVkIC8+XFxuICA8bGFiZWwgZm9yPVxcXCJhY2NvdW50X2VtYWlsXFxcIiBjbGFzcz1cXFwiaS1pbnB1dC1lcnJvci1zdWJ0ZXh0IGktZXJyb3JcXFwiIG5nLWlmPVxcXCJzaWdudXBGYWlsZWQgJiYgIXNpZ251cEFjY291bnQuZW1haWxWYWxpZCgpXFxcIj57ezo6aTE4bi50KCdzaWdudXBfbW9kYWwucGxlYXNlX2VudGVyX2FfdmFsaWRfZW1haWxfYWRkcmVzcycpfX08L2xhYmVsPlxcbiAgPGxhYmVsIGZvcj1cXFwiYWNjb3VudF9lbWFpbFxcXCIgY2xhc3M9XFxcImktaW5wdXQtZXJyb3Itc3VidGV4dCBpLWVycm9yXFxcIiBuZy1pZj1cXFwic2lnbnVwRmFpbGVkICYmICFzaWdudXBBY2NvdW50LmVtYWlsXFxcIj57ezo6aTE4bi50KCdzaWdudXBfbW9kYWwudGhpc19maWVsZF9pc19yZXF1aXJlZCcpfX08L2xhYmVsPlxcblxcbiAgPGlucHV0IHR5cGU9XFxcInBhc3N3b3JkXFxcIiBuYW1lPVxcXCJwYXNzd29yZEZpZWxkXFxcIiBpZD1cXFwidGFrZVxcXCIgY2xhc3M9XFxcImktdGV4dC1maWVsZFxcXCIgbWlubGVuZ3RoPVxcXCI2XFxcIiBhdXRvY29tcGxldGU9XFxcIm9mZlxcXCIgcGxhY2Vob2xkZXI9XFxcInt7OjppMThuLnQoJ3Bhc3N3b3JkJyl9fVxcXCIgbmctbW9kZWw9XFxcInNpZ251cEFjY291bnQucGFzc3dvcmRcXFwiIHJlcXVpcmVkIC8+XFxuICA8bGFiZWwgZm9yPVxcXCJ0YWtlXFxcIiBjbGFzcz1cXFwiaS1pbnB1dC1lcnJvci1zdWJ0ZXh0IGktZXJyb3JcXFwiIG5nLWlmPVxcXCJzaWdudXBGYWlsZWQgJiYgIXNpZ251cEFjY291bnQucGFzc3dvcmRWYWxpZCgpXFxcIj57ezo6aTE4bi50KCdtdXN0X2JlX2JldHdlZW5fNl9hbmRfNDBfY2hhcmFjdGVycycpfX08L2xhYmVsPlxcbiAgPGxhYmVsIGZvcj1cXFwidGFrZVxcXCIgY2xhc3M9XFxcImktaW5wdXQtZXJyb3Itc3VidGV4dCBpLWVycm9yXFxcIiBuZy1pZj1cXFwic2lnbnVwRmFpbGVkICYmICFzaWdudXBBY2NvdW50LnBhc3N3b3JkXFxcIj57ezo6aTE4bi50KCdzaWdudXBfbW9kYWwuaW52YWxpZF9wYXNzd29yZCcpfX08L2xhYmVsPlxcblxcbiAgPGRpdiBjbGFzcz1cXFwiaS1maWVsZC1yb3cgaS1jaGVja2JveC13aXRoLWxhYmVsXFxcIj5cXG4gICAgPGlucHV0IHR5cGU9XFxcImNoZWNrYm94XFxcIiBuZy1tb2RlbD1cXFwic2lnbnVwQWNjb3VudC5nZW5lcmFsX29wdF9pblxcXCIgaWQ9XFxcIm9wdEluXFxcIiAvPlxcbiAgICA8bGFiZWwgZm9yPVxcXCJvcHRJblxcXCI+e3s6OmkxOG4udCgnc2lnbl9tZV91cF9mb3JfbmV3c2xldHRlcicpfX08L2xhYmVsPlxcbiAgPC9kaXY+XFxuICA8aW5wdXQgbmctZGlzYWJsZWQ9XFxcImRpc2FibGVTaWduVXBcXFwiIHR5cGU9XFxcInN1Ym1pdFxcXCIgdmFsdWU9XFxcInt7OjppMThuLnQoJ2NyZWF0ZV9hbl9hY2NvdW50Jyl9fVxcXCIgY2xhc3M9XFxcImktY3RhLTFcXFwiIC8+XFxuXFxuICA8ZGl2IGNsYXNzPVxcXCJpLWZpbmUtcHJpbnRcXFwiPlxcbiAgICA8c3BhbiBuZy1iaW5kLWh0bWw9XFxcImJvaWxlcnBsYXRlSHRtbFxcXCI+PC9zcGFuPlxcbiAgPC9kaXY+XFxuPC9mb3JtPlxcblwiO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9hbmNpbGxhcnkvaGVhZGVyL3NpZ251cC1mb3JtLWluZGllZ29nby5odG1sXG4gKiogbW9kdWxlIGlkID0gMTk5XG4gKiogbW9kdWxlIGNodW5rcyA9IDI0XG4gKiovIl0sIm1hcHBpbmdzIjoiQUFBQSIsInNvdXJjZVJvb3QiOiIifQ==");

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

	eval("'use strict';\n\nloginForm.$inject = [\"i18n\", \"csrfToken\", \"$http\", \"gon\", \"safeGa\", \"browser\", \"gogoEvents\"];\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = loginForm;\n/*@ngInject*/\nfunction loginForm(i18n, csrfToken, $http, gon, safeGa, browser, gogoEvents) {\n  return {\n    scope: {\n      modal: '=modal',\n      callbacks: '=callbacks',\n      loginStatus: '=loginStatus'\n    },\n    template: function template(element, attrs) {\n      return __webpack_require__(201)('./' + attrs.templateUrl);\n    },\n    link: function link(scope) {\n      scope.loginAccount = {\n        password: null,\n        rememberme: true\n      };\n\n      function handleLoginSuccess(headerRedirect) {\n        var cb = function cb() {\n          return browser.refreshPage();\n        };\n\n        if (scope.callbacks && scope.callbacks.successCallback) {\n          cb = scope.callbacks.successCallback;\n        } else if (headerRedirect) {\n          cb = function cb() {\n            return browser.redirectTo(headerRedirect);\n          };\n        }\n\n        var beforeReloadCallback = scope.callbacks && scope.callbacks.beforeReloadCallback;\n        // TODO EVENTS: id=lie7a category=Account.Login action=login_complete subsystem=accounts label=dynamic fixtype=review name=login.complete name-new=account_login_complete . needs tests!\n        gogoEvents.track({\n          thetaName: 'login complete',\n          gaEventCategory: 'Account Login',\n          gaEventAction: 'login complete',\n          gaEventLabel: browser.currentHref()\n        }).then(beforeReloadCallback).then(cb);\n      }\n\n      function loginSuccess(response) {\n        if (scope.loginStatus) {\n          scope.loginStatus.success = true;\n        }\n        scope.modal.hide();\n        csrfToken.setToken(response.headers()['x-csrf-token']);\n        handleLoginSuccess(response.headers().location);\n      }\n\n      function loginError(response) {\n        scope.loginFailed = true;\n        var error = response && response.data && response.data.error;\n        // TODO EVENTS: id=ohw0a category=Account.Login action=error label=dynamic fixtype=safega-only subsystem=accounts name-new=TBD .\n        safeGa.sendEvent('Account Login', 'error', error);\n        if (error == \"resource_owner_credentials_revoked\") {\n          scope.loginFailed = false;\n          scope.securityMessage = response.data.error_description;\n        }\n      }\n\n      scope.i18n = i18n;\n      scope.forgotPasswordUrl = gon.session_modal.forgot_password_url;\n\n      scope.submitLogin = function () {\n        $http.post(gon.session_modal.login_url, {\n          from: gon.session_modal.from,\n          account: scope.loginAccount\n        }).then(loginSuccess, loginError);\n      };\n    }\n  };\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjAwLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vYW5jaWxsYXJ5L2hlYWRlci9sb2dpbi1mb3JtLWRpcmVjdGl2ZS5qcz9mNzk2Il0sInNvdXJjZXNDb250ZW50IjpbIi8qQG5nSW5qZWN0Ki9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGxvZ2luRm9ybShpMThuLCBjc3JmVG9rZW4sICRodHRwLCBnb24sIHNhZmVHYSwgYnJvd3NlciwgZ29nb0V2ZW50cykge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc2NvcGU6IHtcbiAgICAgICAgICBtb2RhbDogJz1tb2RhbCcsXG4gICAgICAgICAgY2FsbGJhY2tzOiAnPWNhbGxiYWNrcycsXG4gICAgICAgICAgbG9naW5TdGF0dXM6ICc9bG9naW5TdGF0dXMnXG4gICAgICAgIH0sXG4gICAgICAgIHRlbXBsYXRlOiBmdW5jdGlvbihlbGVtZW50LCBhdHRycykge1xuICAgICAgICAgIHJldHVybiByZXF1aXJlLmNvbnRleHQoJy4vJywgZmFsc2UsIC8uKlxcLmh0bWwvKSgnLi8nICsgYXR0cnMudGVtcGxhdGVVcmwpO1xuICAgICAgICB9LFxuICAgICAgICBsaW5rOiBmdW5jdGlvbiAoc2NvcGUpIHtcbiAgICAgICAgICBzY29wZS5sb2dpbkFjY291bnQgPSB7XG4gICAgICAgICAgICBwYXNzd29yZDogbnVsbCxcbiAgICAgICAgICAgIHJlbWVtYmVybWU6IHRydWVcbiAgICAgICAgICB9O1xuXG4gICAgICAgICAgZnVuY3Rpb24gaGFuZGxlTG9naW5TdWNjZXNzKGhlYWRlclJlZGlyZWN0KSB7XG4gICAgICAgICAgICB2YXIgY2IgPSAoKSA9PiBicm93c2VyLnJlZnJlc2hQYWdlKCk7XG5cbiAgICAgICAgICAgIGlmIChzY29wZS5jYWxsYmFja3MgJiYgc2NvcGUuY2FsbGJhY2tzLnN1Y2Nlc3NDYWxsYmFjaykge1xuICAgICAgICAgICAgICBjYiA9IHNjb3BlLmNhbGxiYWNrcy5zdWNjZXNzQ2FsbGJhY2s7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGhlYWRlclJlZGlyZWN0KSB7XG4gICAgICAgICAgICAgIGNiID0gKCkgPT4gYnJvd3Nlci5yZWRpcmVjdFRvKGhlYWRlclJlZGlyZWN0KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbGV0IGJlZm9yZVJlbG9hZENhbGxiYWNrID0gc2NvcGUuY2FsbGJhY2tzICYmIHNjb3BlLmNhbGxiYWNrcy5iZWZvcmVSZWxvYWRDYWxsYmFjaztcbiAgICAgICAgICAgIC8vIFRPRE8gRVZFTlRTOiBpZD1saWU3YSBjYXRlZ29yeT1BY2NvdW50LkxvZ2luIGFjdGlvbj1sb2dpbl9jb21wbGV0ZSBzdWJzeXN0ZW09YWNjb3VudHMgbGFiZWw9ZHluYW1pYyBmaXh0eXBlPXJldmlldyBuYW1lPWxvZ2luLmNvbXBsZXRlIG5hbWUtbmV3PWFjY291bnRfbG9naW5fY29tcGxldGUgLiBuZWVkcyB0ZXN0cyFcbiAgICAgICAgICAgIGdvZ29FdmVudHMudHJhY2soe1xuICAgICAgICAgICAgICB0aGV0YU5hbWU6ICdsb2dpbiBjb21wbGV0ZScsXG4gICAgICAgICAgICAgIGdhRXZlbnRDYXRlZ29yeTogJ0FjY291bnQgTG9naW4nLFxuICAgICAgICAgICAgICBnYUV2ZW50QWN0aW9uOiAnbG9naW4gY29tcGxldGUnLFxuICAgICAgICAgICAgICBnYUV2ZW50TGFiZWw6IGJyb3dzZXIuY3VycmVudEhyZWYoKVxuICAgICAgICAgICAgfSkudGhlbihiZWZvcmVSZWxvYWRDYWxsYmFjaykudGhlbihjYik7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgZnVuY3Rpb24gbG9naW5TdWNjZXNzKHJlc3BvbnNlKSB7XG4gICAgICAgICAgICBpZiAoc2NvcGUubG9naW5TdGF0dXMpIHtcbiAgICAgICAgICAgICAgc2NvcGUubG9naW5TdGF0dXMuc3VjY2VzcyA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzY29wZS5tb2RhbC5oaWRlKCk7XG4gICAgICAgICAgICBjc3JmVG9rZW4uc2V0VG9rZW4ocmVzcG9uc2UuaGVhZGVycygpWyd4LWNzcmYtdG9rZW4nXSk7XG4gICAgICAgICAgICBoYW5kbGVMb2dpblN1Y2Nlc3MocmVzcG9uc2UuaGVhZGVycygpLmxvY2F0aW9uKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBmdW5jdGlvbiBsb2dpbkVycm9yKHJlc3BvbnNlKSB7XG4gICAgICAgICAgICBzY29wZS5sb2dpbkZhaWxlZCA9IHRydWU7XG4gICAgICAgICAgICBsZXQgZXJyb3IgPSByZXNwb25zZSAmJiByZXNwb25zZS5kYXRhICYmIHJlc3BvbnNlLmRhdGEuZXJyb3I7XG4gICAgICAgICAgICAvLyBUT0RPIEVWRU5UUzogaWQ9b2h3MGEgY2F0ZWdvcnk9QWNjb3VudC5Mb2dpbiBhY3Rpb249ZXJyb3IgbGFiZWw9ZHluYW1pYyBmaXh0eXBlPXNhZmVnYS1vbmx5IHN1YnN5c3RlbT1hY2NvdW50cyBuYW1lLW5ldz1UQkQgLlxuICAgICAgICAgICAgc2FmZUdhLnNlbmRFdmVudCgnQWNjb3VudCBMb2dpbicsICdlcnJvcicsIGVycm9yKTtcbiAgICAgICAgICAgIGlmKGVycm9yID09IFwicmVzb3VyY2Vfb3duZXJfY3JlZGVudGlhbHNfcmV2b2tlZFwiKSB7XG4gICAgICAgICAgICAgIHNjb3BlLmxvZ2luRmFpbGVkID0gZmFsc2U7XG4gICAgICAgICAgICAgIHNjb3BlLnNlY3VyaXR5TWVzc2FnZSA9IHJlc3BvbnNlLmRhdGEuZXJyb3JfZGVzY3JpcHRpb247XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgc2NvcGUuaTE4biA9IGkxOG47XG4gICAgICAgICAgc2NvcGUuZm9yZ290UGFzc3dvcmRVcmwgPSBnb24uc2Vzc2lvbl9tb2RhbC5mb3Jnb3RfcGFzc3dvcmRfdXJsO1xuXG4gICAgICAgICAgc2NvcGUuc3VibWl0TG9naW4gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAkaHR0cC5wb3N0KGdvbi5zZXNzaW9uX21vZGFsLmxvZ2luX3VybCwge1xuICAgICAgICAgICAgICBmcm9tOiBnb24uc2Vzc2lvbl9tb2RhbC5mcm9tLFxuICAgICAgICAgICAgICBhY2NvdW50OiBzY29wZS5sb2dpbkFjY291bnRcbiAgICAgICAgICAgIH0pLnRoZW4obG9naW5TdWNjZXNzLCBsb2dpbkVycm9yKTtcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICB9O1xuICAgIH1cblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIC4vYW5jaWxsYXJ5L2hlYWRlci9sb2dpbi1mb3JtLWRpcmVjdGl2ZS5qc1xuICoqLyJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTs7QUFDQTtBQUNBOztBQUVBOztBQUpBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBT0E7OztBQUxBO0FBQ0E7QUFDQTtBQUNBO0FBU0E7Ozs7QUFOQTs7QUFUQTtBQVlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTs7QUFGQTtBQUtBO0FBQ0E7QUFDQTs7OztBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUE5REEiLCJzb3VyY2VSb290IjoiIn0=");

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

	eval("var map = {\n\t\"./generosity-header-search-dropdown.html\": 189,\n\t\"./header-flash-container.html\": 190,\n\t\"./header-flash.html\": 191,\n\t\"./header-search-dropdown.html\": 192,\n\t\"./header-search-form.html\": 193,\n\t\"./login-form-generosity.html\": 194,\n\t\"./login-form-indiegogo.html\": 195,\n\t\"./session-modal-generosity.html\": 196,\n\t\"./session-modal-indiegogo.html\": 197,\n\t\"./signup-form-generosity.html\": 198,\n\t\"./signup-form-indiegogo.html\": 199\n};\nfunction webpackContext(req) {\n\treturn __webpack_require__(webpackContextResolve(req));\n};\nfunction webpackContextResolve(req) {\n\treturn map[req] || (function() { throw new Error(\"Cannot find module '\" + req + \"'.\") }());\n};\nwebpackContext.keys = function webpackContextKeys() {\n\treturn Object.keys(map);\n};\nwebpackContext.resolve = webpackContextResolve;\nmodule.exports = webpackContext;\nwebpackContext.id = 201;\n\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjAxLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vYW5jaWxsYXJ5L2hlYWRlciBub25yZWN1cnNpdmUgLipcXC5odG1sPzljYTYiXSwic291cmNlc0NvbnRlbnQiOlsidmFyIG1hcCA9IHtcblx0XCIuL2dlbmVyb3NpdHktaGVhZGVyLXNlYXJjaC1kcm9wZG93bi5odG1sXCI6IDE4OSxcblx0XCIuL2hlYWRlci1mbGFzaC1jb250YWluZXIuaHRtbFwiOiAxOTAsXG5cdFwiLi9oZWFkZXItZmxhc2guaHRtbFwiOiAxOTEsXG5cdFwiLi9oZWFkZXItc2VhcmNoLWRyb3Bkb3duLmh0bWxcIjogMTkyLFxuXHRcIi4vaGVhZGVyLXNlYXJjaC1mb3JtLmh0bWxcIjogMTkzLFxuXHRcIi4vbG9naW4tZm9ybS1nZW5lcm9zaXR5Lmh0bWxcIjogMTk0LFxuXHRcIi4vbG9naW4tZm9ybS1pbmRpZWdvZ28uaHRtbFwiOiAxOTUsXG5cdFwiLi9zZXNzaW9uLW1vZGFsLWdlbmVyb3NpdHkuaHRtbFwiOiAxOTYsXG5cdFwiLi9zZXNzaW9uLW1vZGFsLWluZGllZ29nby5odG1sXCI6IDE5Nyxcblx0XCIuL3NpZ251cC1mb3JtLWdlbmVyb3NpdHkuaHRtbFwiOiAxOTgsXG5cdFwiLi9zaWdudXAtZm9ybS1pbmRpZWdvZ28uaHRtbFwiOiAxOTlcbn07XG5mdW5jdGlvbiB3ZWJwYWNrQ29udGV4dChyZXEpIHtcblx0cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18od2VicGFja0NvbnRleHRSZXNvbHZlKHJlcSkpO1xufTtcbmZ1bmN0aW9uIHdlYnBhY2tDb250ZXh0UmVzb2x2ZShyZXEpIHtcblx0cmV0dXJuIG1hcFtyZXFdIHx8IChmdW5jdGlvbigpIHsgdGhyb3cgbmV3IEVycm9yKFwiQ2Fubm90IGZpbmQgbW9kdWxlICdcIiArIHJlcSArIFwiJy5cIikgfSgpKTtcbn07XG53ZWJwYWNrQ29udGV4dC5rZXlzID0gZnVuY3Rpb24gd2VicGFja0NvbnRleHRLZXlzKCkge1xuXHRyZXR1cm4gT2JqZWN0LmtleXMobWFwKTtcbn07XG53ZWJwYWNrQ29udGV4dC5yZXNvbHZlID0gd2VicGFja0NvbnRleHRSZXNvbHZlO1xubW9kdWxlLmV4cG9ydHMgPSB3ZWJwYWNrQ29udGV4dDtcbndlYnBhY2tDb250ZXh0LmlkID0gMjAxO1xuXG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL2FuY2lsbGFyeS9oZWFkZXIgbm9ucmVjdXJzaXZlIC4qXFwuaHRtbFxuICoqIG1vZHVsZSBpZCA9IDIwMVxuICoqIG1vZHVsZSBjaHVua3MgPSAyNFxuICoqLyJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9");

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

	eval("'use strict';\n\nsessionModal.$inject = [\"$modal\", \"gon\", \"gogoEvents\", \"safeGa\", \"$http\", \"browser\", \"i18n\", \"localStorageService\", \"$timeout\", \"$window\"];\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = sessionModal;\n/*@ngInject*/\nfunction sessionModal($modal, gon, gogoEvents, safeGa, $http, browser, i18n, localStorageService, $timeout, $window) {\n  var modalTemplateUrl;\n  if (gon.domain === 'generosity') {\n    modalTemplateUrl = 'session-modal-generosity.html';\n  } else {\n    modalTemplateUrl = 'session-modal-indiegogo.html';\n  }\n\n  return {\n    restrict: 'E',\n    scope: {\n      status: '=',\n      banner: '=',\n      gogoTestModalLabel: '@'\n    },\n    link: function link(scope) {\n      scope.authStatus = { success: false };\n      scope.i18n = i18n;\n      scope.fbAuthUrl = gon && gon.session_modal && gon.session_modal.fb_auth_url;\n      scope.securityUrl = gon && gon.session_modal && gon.session_modal.security_url;\n\n      scope.switchForm = function (newForm) {\n        scope.currentForm = newForm;\n        sendGaForForm(scope.currentForm);\n      };\n\n      function sendGaForForm(currentForm) {\n        if (currentForm == 'loginForm') {\n          // TODO EVENTS: id=ieni2 fixtype=safega-only subsystem=accounts category=Account.Login action=view label=dynamic subsystem=accounts name-new=TBD .\n          safeGa.sendEvent('Account Login', 'view', browser.currentHref());\n        } else {\n          // TODO EVENTS: id=quou5 fixtype=safega-only subsystem=accounts category=Account.Sign-up action=view label=dynamic name-new=TBD subsystem=accounts name-new=TBD .\n          safeGa.sendEvent('Account Sign-up', 'view', browser.currentHref());\n        }\n      }\n\n      var afterReloadCallbackKey = \"afterReloadCallback\";\n      var afterReloadCallbackValue = $window.location.pathname;\n\n      var cancelCallback = function cancelCallback() {\n        return scope.status.callbacks && scope.status.callbacks.cancelCallback;\n      };\n      var afterReloadCallback = function afterReloadCallback() {\n        return scope.status.callbacks && scope.status.callbacks.afterReloadCallback;\n      };\n\n      function onLoginSuccessBeforeReload() {\n        if (afterReloadCallback()) {\n          localStorageService.set(afterReloadCallbackKey, afterReloadCallbackValue);\n        }\n      }\n\n      scope.attemptFbLogin = function () {\n        onLoginSuccessBeforeReload();\n        browser.redirectTo(scope.fbAuthUrl);\n      };\n\n      var afterReloadMarker = localStorageService.get(afterReloadCallbackKey);\n      $timeout(function () {\n        if (afterReloadMarker) {\n          var isLoggedIn = gon.current_user;\n          var loggedInFromCurrentPage = afterReloadMarker == afterReloadCallbackValue;\n          if (afterReloadCallback() && isLoggedIn && loggedInFromCurrentPage) {\n            afterReloadCallback()();\n          }\n          localStorageService.remove(afterReloadCallbackKey);\n        }\n      });\n\n      function openModal() {\n        scope.currentForm = scope.status.startingForm || 'loginForm';\n        sendGaForForm(scope.currentForm);\n        scope.modal = $modal({\n          template: __webpack_require__(201)('./' + modalTemplateUrl),\n          scope: scope\n        });\n      }\n\n      scope.$on('modal.hide', function () {\n        if (!scope.authStatus.success && cancelCallback()) {\n          cancelCallback()();\n        }\n      });\n\n      scope.$watch('status.open', function (newVal) {\n        if (newVal) {\n          openModal();\n          scope.status.open = false; // Since we're watching for status.open to change, we need to reset this to false every time we open the modal so that subsequent setting of status.open to true triggers the change. Without this line, the modal only ever opens once on the page.\n        }\n      });\n\n      scope.$watch('status.callbacks', function (newVal) {\n        scope.sessionCallbacks = _.merge({ beforeReloadCallback: onLoginSuccessBeforeReload }, newVal);\n      });\n    }\n  };\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjAyLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vYW5jaWxsYXJ5L2hlYWRlci9zZXNzaW9uLW1vZGFsLWRpcmVjdGl2ZS5qcz80NjBjIl0sInNvdXJjZXNDb250ZW50IjpbIi8qQG5nSW5qZWN0Ki9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHNlc3Npb25Nb2RhbCgkbW9kYWwsIGdvbiwgZ29nb0V2ZW50cywgc2FmZUdhLCAkaHR0cCwgYnJvd3NlciwgaTE4biwgbG9jYWxTdG9yYWdlU2VydmljZSwgJHRpbWVvdXQsICR3aW5kb3cpIHtcbiAgdmFyIG1vZGFsVGVtcGxhdGVVcmw7XG4gIGlmIChnb24uZG9tYWluID09PSAnZ2VuZXJvc2l0eScpIHtcbiAgICBtb2RhbFRlbXBsYXRlVXJsID0gJ3Nlc3Npb24tbW9kYWwtZ2VuZXJvc2l0eS5odG1sJztcbiAgfSBlbHNlIHtcbiAgICBtb2RhbFRlbXBsYXRlVXJsID0gJ3Nlc3Npb24tbW9kYWwtaW5kaWVnb2dvLmh0bWwnO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICByZXN0cmljdDogJ0UnLFxuICAgIHNjb3BlOiB7XG4gICAgICBzdGF0dXM6ICc9JyxcbiAgICAgIGJhbm5lcjogJz0nLFxuICAgICAgZ29nb1Rlc3RNb2RhbExhYmVsOiAnQCdcbiAgICB9LFxuICAgIGxpbms6IGZ1bmN0aW9uKHNjb3BlKSB7XG4gICAgICBzY29wZS5hdXRoU3RhdHVzID0geyBzdWNjZXNzIDogZmFsc2V9O1xuICAgICAgc2NvcGUuaTE4biA9IGkxOG47XG4gICAgICBzY29wZS5mYkF1dGhVcmwgPSBnb24gJiYgZ29uLnNlc3Npb25fbW9kYWwgJiYgZ29uLnNlc3Npb25fbW9kYWwuZmJfYXV0aF91cmw7XG4gICAgICBzY29wZS5zZWN1cml0eVVybCA9IGdvbiAmJiBnb24uc2Vzc2lvbl9tb2RhbCAmJiBnb24uc2Vzc2lvbl9tb2RhbC5zZWN1cml0eV91cmw7XG5cbiAgICAgIHNjb3BlLnN3aXRjaEZvcm0gPSBmdW5jdGlvbihuZXdGb3JtKSB7XG4gICAgICAgIHNjb3BlLmN1cnJlbnRGb3JtID0gbmV3Rm9ybTtcbiAgICAgICAgc2VuZEdhRm9yRm9ybShzY29wZS5jdXJyZW50Rm9ybSk7XG4gICAgICB9O1xuXG4gICAgICBmdW5jdGlvbiBzZW5kR2FGb3JGb3JtKGN1cnJlbnRGb3JtKSB7XG4gICAgICAgIGlmIChjdXJyZW50Rm9ybSA9PSAnbG9naW5Gb3JtJykge1xuICAgICAgICAgIC8vIFRPRE8gRVZFTlRTOiBpZD1pZW5pMiBmaXh0eXBlPXNhZmVnYS1vbmx5IHN1YnN5c3RlbT1hY2NvdW50cyBjYXRlZ29yeT1BY2NvdW50LkxvZ2luIGFjdGlvbj12aWV3IGxhYmVsPWR5bmFtaWMgc3Vic3lzdGVtPWFjY291bnRzIG5hbWUtbmV3PVRCRCAuXG4gICAgICAgICAgc2FmZUdhLnNlbmRFdmVudCgnQWNjb3VudCBMb2dpbicsICd2aWV3JywgYnJvd3Nlci5jdXJyZW50SHJlZigpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBUT0RPIEVWRU5UUzogaWQ9cXVvdTUgZml4dHlwZT1zYWZlZ2Etb25seSBzdWJzeXN0ZW09YWNjb3VudHMgY2F0ZWdvcnk9QWNjb3VudC5TaWduLXVwIGFjdGlvbj12aWV3IGxhYmVsPWR5bmFtaWMgbmFtZS1uZXc9VEJEIHN1YnN5c3RlbT1hY2NvdW50cyBuYW1lLW5ldz1UQkQgLlxuICAgICAgICAgIHNhZmVHYS5zZW5kRXZlbnQoJ0FjY291bnQgU2lnbi11cCcsICd2aWV3JywgYnJvd3Nlci5jdXJyZW50SHJlZigpKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBsZXQgYWZ0ZXJSZWxvYWRDYWxsYmFja0tleSA9IFwiYWZ0ZXJSZWxvYWRDYWxsYmFja1wiO1xuICAgICAgbGV0IGFmdGVyUmVsb2FkQ2FsbGJhY2tWYWx1ZSA9ICR3aW5kb3cubG9jYXRpb24ucGF0aG5hbWU7XG5cbiAgICAgIGxldCBjYW5jZWxDYWxsYmFjayA9ICgpID0+IHNjb3BlLnN0YXR1cy5jYWxsYmFja3MgJiYgc2NvcGUuc3RhdHVzLmNhbGxiYWNrcy5jYW5jZWxDYWxsYmFjaztcbiAgICAgIGxldCBhZnRlclJlbG9hZENhbGxiYWNrID0gKCkgPT4gc2NvcGUuc3RhdHVzLmNhbGxiYWNrcyAmJiBzY29wZS5zdGF0dXMuY2FsbGJhY2tzLmFmdGVyUmVsb2FkQ2FsbGJhY2s7XG5cbiAgICAgIGZ1bmN0aW9uIG9uTG9naW5TdWNjZXNzQmVmb3JlUmVsb2FkKCkge1xuICAgICAgICBpZihhZnRlclJlbG9hZENhbGxiYWNrKCkpIHtcbiAgICAgICAgICBsb2NhbFN0b3JhZ2VTZXJ2aWNlLnNldChhZnRlclJlbG9hZENhbGxiYWNrS2V5LCBhZnRlclJlbG9hZENhbGxiYWNrVmFsdWUpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHNjb3BlLmF0dGVtcHRGYkxvZ2luID0gKCkgPT4ge1xuICAgICAgICBvbkxvZ2luU3VjY2Vzc0JlZm9yZVJlbG9hZCgpO1xuICAgICAgICBicm93c2VyLnJlZGlyZWN0VG8oc2NvcGUuZmJBdXRoVXJsKTtcbiAgICAgIH07XG5cbiAgICAgIGxldCBhZnRlclJlbG9hZE1hcmtlciA9IGxvY2FsU3RvcmFnZVNlcnZpY2UuZ2V0KGFmdGVyUmVsb2FkQ2FsbGJhY2tLZXkpO1xuICAgICAgJHRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgICAgIGlmKGFmdGVyUmVsb2FkTWFya2VyKSB7XG4gICAgICAgICAgbGV0IGlzTG9nZ2VkSW4gPSBnb24uY3VycmVudF91c2VyO1xuICAgICAgICAgIGxldCBsb2dnZWRJbkZyb21DdXJyZW50UGFnZSA9IGFmdGVyUmVsb2FkTWFya2VyID09IGFmdGVyUmVsb2FkQ2FsbGJhY2tWYWx1ZTtcbiAgICAgICAgICBpZihhZnRlclJlbG9hZENhbGxiYWNrKCkgJiYgaXNMb2dnZWRJbiAmJiBsb2dnZWRJbkZyb21DdXJyZW50UGFnZSkge1xuICAgICAgICAgICAgYWZ0ZXJSZWxvYWRDYWxsYmFjaygpKCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGxvY2FsU3RvcmFnZVNlcnZpY2UucmVtb3ZlKGFmdGVyUmVsb2FkQ2FsbGJhY2tLZXkpO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgZnVuY3Rpb24gb3Blbk1vZGFsKCkge1xuICAgICAgICBzY29wZS5jdXJyZW50Rm9ybSA9IHNjb3BlLnN0YXR1cy5zdGFydGluZ0Zvcm0gfHwgJ2xvZ2luRm9ybSc7XG4gICAgICAgIHNlbmRHYUZvckZvcm0oc2NvcGUuY3VycmVudEZvcm0pO1xuICAgICAgICBzY29wZS5tb2RhbCA9ICRtb2RhbCh7XG4gICAgICAgICAgdGVtcGxhdGU6IHJlcXVpcmUuY29udGV4dCgnLi8nLCBmYWxzZSwgLy4qXFwuaHRtbC8pKCcuLycgKyBtb2RhbFRlbXBsYXRlVXJsKSxcbiAgICAgICAgICBzY29wZTogc2NvcGVcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIHNjb3BlLiRvbignbW9kYWwuaGlkZScsZnVuY3Rpb24oKXtcbiAgICAgICAgaWYgKCFzY29wZS5hdXRoU3RhdHVzLnN1Y2Nlc3MgJiYgY2FuY2VsQ2FsbGJhY2soKSkge1xuICAgICAgICAgIGNhbmNlbENhbGxiYWNrKCkoKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIHNjb3BlLiR3YXRjaCgnc3RhdHVzLm9wZW4nLCBmdW5jdGlvbihuZXdWYWwpIHtcbiAgICAgICAgaWYgKG5ld1ZhbCkge1xuICAgICAgICAgIG9wZW5Nb2RhbCgpO1xuICAgICAgICAgIHNjb3BlLnN0YXR1cy5vcGVuID0gZmFsc2U7IC8vIFNpbmNlIHdlJ3JlIHdhdGNoaW5nIGZvciBzdGF0dXMub3BlbiB0byBjaGFuZ2UsIHdlIG5lZWQgdG8gcmVzZXQgdGhpcyB0byBmYWxzZSBldmVyeSB0aW1lIHdlIG9wZW4gdGhlIG1vZGFsIHNvIHRoYXQgc3Vic2VxdWVudCBzZXR0aW5nIG9mIHN0YXR1cy5vcGVuIHRvIHRydWUgdHJpZ2dlcnMgdGhlIGNoYW5nZS4gV2l0aG91dCB0aGlzIGxpbmUsIHRoZSBtb2RhbCBvbmx5IGV2ZXIgb3BlbnMgb25jZSBvbiB0aGUgcGFnZS5cbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIHNjb3BlLiR3YXRjaCgnc3RhdHVzLmNhbGxiYWNrcycsIGZ1bmN0aW9uKG5ld1ZhbCkge1xuICAgICAgICBzY29wZS5zZXNzaW9uQ2FsbGJhY2tzID0gXy5tZXJnZSh7IGJlZm9yZVJlbG9hZENhbGxiYWNrOiBvbkxvZ2luU3VjY2Vzc0JlZm9yZVJlbG9hZH0sIG5ld1ZhbCk7XG4gICAgICB9KTtcbiAgICB9XG4gIH07XG59XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiAuL2FuY2lsbGFyeS9oZWFkZXIvc2Vzc2lvbi1tb2RhbC1kaXJlY3RpdmUuanNcbiAqKi8iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7O0FBQ0E7QUFDQTs7QUFFQTs7QUFKQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7OztBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBT0E7O0FBTkE7QUFTQTs7O0FBUEE7QUFDQTtBQUNBOzs7O0FBSUE7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7OztBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQUlBO0FBQ0E7QUFDQTs7OztBQUlBO0FBQ0E7QUFDQTtBQUNBOzs7O0FBSUE7QUFDQTs7OztBQXhGQSIsInNvdXJjZVJvb3QiOiIifQ==");

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

	eval("'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = sessionModalLink;\n/*@ngInject*/\nfunction sessionModalLink() {\n  return {\n    scope: {\n      startingForm: '@',\n      gogoTestLinkLabel: '@',\n      gogoTestModalLabel: '@'\n    },\n    restrict: 'A',\n    template: '<a href=\"\" class=\"siteHeader-link\" ng-click=\"openModal()\" ng-transclude gogo-test=\"{{gogoTestLinkLabel}}\"></a><session-modal gogo-test-modal-label=\"{{gogoTestModalLabel}}\" status=\"status\"></session-modal>',\n    transclude: true,\n    link: function link(scope) {\n      scope.status = {\n        startingForm: scope.startingForm,\n        open: false\n      };\n\n      scope.openModal = function () {\n        scope.status.open = true;\n      };\n    }\n  };\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjAzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vYW5jaWxsYXJ5L2hlYWRlci9zZXNzaW9uLW1vZGFsLWxpbmstZGlyZWN0aXZlLmpzPzcwNzkiXSwic291cmNlc0NvbnRlbnQiOlsiLypAbmdJbmplY3QqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gc2Vzc2lvbk1vZGFsTGluaygpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHNjb3BlOiB7XG4gICAgICAgICAgc3RhcnRpbmdGb3JtOiAnQCcsXG4gICAgICAgICAgZ29nb1Rlc3RMaW5rTGFiZWw6ICdAJyxcbiAgICAgICAgICBnb2dvVGVzdE1vZGFsTGFiZWw6ICdAJ1xuICAgICAgICB9LFxuICAgICAgICByZXN0cmljdDogJ0EnLFxuICAgICAgICB0ZW1wbGF0ZTogJzxhIGhyZWY9XCJcIiBjbGFzcz1cInNpdGVIZWFkZXItbGlua1wiIG5nLWNsaWNrPVwib3Blbk1vZGFsKClcIiBuZy10cmFuc2NsdWRlIGdvZ28tdGVzdD1cInt7Z29nb1Rlc3RMaW5rTGFiZWx9fVwiPjwvYT48c2Vzc2lvbi1tb2RhbCBnb2dvLXRlc3QtbW9kYWwtbGFiZWw9XCJ7e2dvZ29UZXN0TW9kYWxMYWJlbH19XCIgc3RhdHVzPVwic3RhdHVzXCI+PC9zZXNzaW9uLW1vZGFsPicsXG4gICAgICAgIHRyYW5zY2x1ZGU6IHRydWUsXG4gICAgICAgIGxpbms6IGZ1bmN0aW9uKHNjb3BlKSB7XG4gICAgICAgICAgc2NvcGUuc3RhdHVzID0ge1xuICAgICAgICAgICAgc3RhcnRpbmdGb3JtOiBzY29wZS5zdGFydGluZ0Zvcm0sXG4gICAgICAgICAgICBvcGVuOiBmYWxzZVxuICAgICAgICAgIH07XG5cbiAgICAgICAgICBzY29wZS5vcGVuTW9kYWwgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBzY29wZS5zdGF0dXMub3BlbiA9IHRydWU7XG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiAuL2FuY2lsbGFyeS9oZWFkZXIvc2Vzc2lvbi1tb2RhbC1saW5rLWRpcmVjdGl2ZS5qc1xuICoqLyJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBSkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBOzs7O0FBakJBIiwic291cmNlUm9vdCI6IiJ9");

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

	eval("'use strict';\n\nsignupForm.$inject = [\"i18n\", \"csrfToken\", \"$http\", \"gon\", \"safeGa\", \"browser\", \"gogoEvents\", \"signup\"];\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = signupForm;\n/*@ngInject*/\nfunction signupForm(i18n, csrfToken, $http, gon, safeGa, browser, gogoEvents, signup) {\n  var EMAIL_REGEXP = /^[a-z0-9!#$%&'*+\\/=?^_`{|}~.-]+@[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$/i;\n\n  return {\n    scope: {\n      domainCode: '@domainCode',\n      modal: '=modal',\n      callbacks: '=callbacks',\n      signupStatus: '=signupStatus'\n    },\n    template: function template(element, attrs) {\n      return __webpack_require__(201)('./' + attrs.templateUrl);\n    },\n    link: function link(scope) {\n      scope.disableSignUp = false;\n\n      function sendGaForSignupSuccess(headerRedirect) {\n        var cb = function cb() {\n          return browser.refreshPage();\n        };\n\n        if (scope.callbacks && scope.callbacks.successCallback) {\n          cb = scope.callbacks.successCallback;\n        } else if (headerRedirect) {\n          cb = function cb() {\n            return browser.redirectTo(headerRedirect);\n          };\n        }\n\n        var beforeReloadCallback = scope.callbacks && scope.callbacks.beforeReloadCallback;\n        // TODO EVENTS: id=cei2b fixtype=review subsystem=accounts category=Account_Sign-up action=sign-up_complete label=dynamic name=sign-up!complete new-name=account_sign_up_complete .\n        gogoEvents.track({\n          thetaName: 'sign-up complete',\n          gaEventCategory: 'Account Sign-up',\n          gaEventAction: 'sign-up complete',\n          gaEventLabel: browser.currentHref()\n        }).then(beforeReloadCallback).then(cb);\n      }\n\n      function signupSuccess(response) {\n        if (scope.signupStatus) {\n          scope.signupStatus.success = true;\n        }\n        scope.modal.hide();\n        csrfToken.setToken(response.headers()['x-csrf-token']);\n        sendGaForSignupSuccess(response.headers().location);\n      }\n\n      function signupError(response) {\n        scope.signupFailed = false;\n        scope.errorMessage = response.data.error;\n        // TODO EVENTS: id=roo0r fixtype=safega-only subsystem=accounts category=Account_Sign-up action=error label=dynamic subsystem=accounts name-new=TBD .\n        safeGa.sendEvent('Account Sign-up', 'error', response.data.error);\n      }\n\n      scope.i18n = i18n;\n      scope.signupFailed = false;\n      scope.signupAccount = {\n        general_opt_in: true,\n        emailValid: function emailValid() {\n          if (_.isUndefined(this.email)) {\n            return true;\n          } else {\n            return EMAIL_REGEXP.test(this.email);\n          }\n        },\n\n        passwordValid: function passwordValid() {\n          if (_.isUndefined(this.password)) {\n            return true;\n          } else {\n            var length = this.password.length;\n            return length >= 6 && length <= 40;\n          }\n        },\n\n        allFieldsPresent: function allFieldsPresent() {\n          return !!(this.firstname && this.lastname && this.email && this.password);\n        }\n      };\n\n      scope.boilerplateHtml = signup.termsHtml('by_signing_up_html');\n      scope.submitSignup = function () {\n        var account = scope.signupAccount;\n        if (account.passwordValid() && account.emailValid() && account.allFieldsPresent()) {\n          scope.disableSignUp = true;\n          signup.submitSignup(account, scope.domainCode).then(signupSuccess, signupError).finally(function () {\n            scope.disableSignUp = false;\n          });\n        } else {\n          scope.signupFailed = true;\n        }\n      };\n    }\n  };\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjA0LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vYW5jaWxsYXJ5L2hlYWRlci9zaWdudXAtZm9ybS1kaXJlY3RpdmUuanM/MDM5NyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKkBuZ0luamVjdCovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBzaWdudXBGb3JtKGkxOG4sIGNzcmZUb2tlbiwgJGh0dHAsIGdvbiwgc2FmZUdhLCBicm93c2VyLCBnb2dvRXZlbnRzLCBzaWdudXApIHtcbiAgICAgIHZhciBFTUFJTF9SRUdFWFAgPSAvXlthLXowLTkhIyQlJicqK1xcLz0/Xl9ge3x9fi4tXStAW2EtejAtOV0oW2EtejAtOS1dKlthLXowLTldKT8oXFwuW2EtejAtOV0oW2EtejAtOS1dKlthLXowLTldKT8pKiQvaTtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc2NvcGU6IHtcbiAgICAgICAgICBkb21haW5Db2RlOiAnQGRvbWFpbkNvZGUnLFxuICAgICAgICAgIG1vZGFsOiAnPW1vZGFsJyxcbiAgICAgICAgICBjYWxsYmFja3M6ICc9Y2FsbGJhY2tzJyxcbiAgICAgICAgICBzaWdudXBTdGF0dXM6ICc9c2lnbnVwU3RhdHVzJ1xuICAgICAgICB9LFxuICAgICAgICB0ZW1wbGF0ZTogZnVuY3Rpb24oZWxlbWVudCwgYXR0cnMpIHtcbiAgICAgICAgICByZXR1cm4gcmVxdWlyZS5jb250ZXh0KCcuLycsIGZhbHNlLCAvLipcXC5odG1sLykoJy4vJyArIGF0dHJzLnRlbXBsYXRlVXJsKTtcbiAgICAgICAgfSxcbiAgICAgICAgbGluazogZnVuY3Rpb24oc2NvcGUpIHtcbiAgICAgICAgICBzY29wZS5kaXNhYmxlU2lnblVwID0gZmFsc2U7XG5cbiAgICAgICAgICBmdW5jdGlvbiBzZW5kR2FGb3JTaWdudXBTdWNjZXNzKGhlYWRlclJlZGlyZWN0KSB7XG4gICAgICAgICAgICB2YXIgY2IgPSAoKSA9PiBicm93c2VyLnJlZnJlc2hQYWdlKCk7XG5cbiAgICAgICAgICAgIGlmIChzY29wZS5jYWxsYmFja3MgJiYgc2NvcGUuY2FsbGJhY2tzLnN1Y2Nlc3NDYWxsYmFjaykge1xuICAgICAgICAgICAgICBjYiA9IHNjb3BlLmNhbGxiYWNrcy5zdWNjZXNzQ2FsbGJhY2s7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGhlYWRlclJlZGlyZWN0KSB7XG4gICAgICAgICAgICAgIGNiID0gKCkgPT4gYnJvd3Nlci5yZWRpcmVjdFRvKGhlYWRlclJlZGlyZWN0KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbGV0IGJlZm9yZVJlbG9hZENhbGxiYWNrID0gc2NvcGUuY2FsbGJhY2tzICYmIHNjb3BlLmNhbGxiYWNrcy5iZWZvcmVSZWxvYWRDYWxsYmFjaztcbiAgICAgICAgICAgIC8vIFRPRE8gRVZFTlRTOiBpZD1jZWkyYiBmaXh0eXBlPXJldmlldyBzdWJzeXN0ZW09YWNjb3VudHMgY2F0ZWdvcnk9QWNjb3VudF9TaWduLXVwIGFjdGlvbj1zaWduLXVwX2NvbXBsZXRlIGxhYmVsPWR5bmFtaWMgbmFtZT1zaWduLXVwIWNvbXBsZXRlIG5ldy1uYW1lPWFjY291bnRfc2lnbl91cF9jb21wbGV0ZSAuXG4gICAgICAgICAgICBnb2dvRXZlbnRzLnRyYWNrKHtcbiAgICAgICAgICAgICAgdGhldGFOYW1lOiAnc2lnbi11cCBjb21wbGV0ZScsXG4gICAgICAgICAgICAgIGdhRXZlbnRDYXRlZ29yeTogJ0FjY291bnQgU2lnbi11cCcsXG4gICAgICAgICAgICAgIGdhRXZlbnRBY3Rpb246ICdzaWduLXVwIGNvbXBsZXRlJyxcbiAgICAgICAgICAgICAgZ2FFdmVudExhYmVsOiBicm93c2VyLmN1cnJlbnRIcmVmKClcbiAgICAgICAgICAgIH0pLnRoZW4oYmVmb3JlUmVsb2FkQ2FsbGJhY2spLnRoZW4oY2IpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGZ1bmN0aW9uIHNpZ251cFN1Y2Nlc3MocmVzcG9uc2UpIHtcbiAgICAgICAgICAgIGlmIChzY29wZS5zaWdudXBTdGF0dXMpIHtcbiAgICAgICAgICAgICAgc2NvcGUuc2lnbnVwU3RhdHVzLnN1Y2Nlc3MgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc2NvcGUubW9kYWwuaGlkZSgpO1xuICAgICAgICAgICAgY3NyZlRva2VuLnNldFRva2VuKHJlc3BvbnNlLmhlYWRlcnMoKVsneC1jc3JmLXRva2VuJ10pO1xuICAgICAgICAgICAgc2VuZEdhRm9yU2lnbnVwU3VjY2VzcyhyZXNwb25zZS5oZWFkZXJzKCkubG9jYXRpb24pO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGZ1bmN0aW9uIHNpZ251cEVycm9yKHJlc3BvbnNlKSB7XG4gICAgICAgICAgICBzY29wZS5zaWdudXBGYWlsZWQgPSBmYWxzZTtcbiAgICAgICAgICAgIHNjb3BlLmVycm9yTWVzc2FnZSA9IHJlc3BvbnNlLmRhdGEuZXJyb3I7XG4gICAgICAgICAgICAvLyBUT0RPIEVWRU5UUzogaWQ9cm9vMHIgZml4dHlwZT1zYWZlZ2Etb25seSBzdWJzeXN0ZW09YWNjb3VudHMgY2F0ZWdvcnk9QWNjb3VudF9TaWduLXVwIGFjdGlvbj1lcnJvciBsYWJlbD1keW5hbWljIHN1YnN5c3RlbT1hY2NvdW50cyBuYW1lLW5ldz1UQkQgLlxuICAgICAgICAgICAgc2FmZUdhLnNlbmRFdmVudCgnQWNjb3VudCBTaWduLXVwJywgJ2Vycm9yJywgcmVzcG9uc2UuZGF0YS5lcnJvcik7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgc2NvcGUuaTE4biA9IGkxOG47XG4gICAgICAgICAgc2NvcGUuc2lnbnVwRmFpbGVkID0gZmFsc2U7XG4gICAgICAgICAgc2NvcGUuc2lnbnVwQWNjb3VudCA9IHtcbiAgICAgICAgICAgIGdlbmVyYWxfb3B0X2luOiB0cnVlLFxuICAgICAgICAgICAgZW1haWxWYWxpZDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICBpZihfLmlzVW5kZWZpbmVkKHRoaXMuZW1haWwpKXtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gRU1BSUxfUkVHRVhQLnRlc3QodGhpcy5lbWFpbCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIHBhc3N3b3JkVmFsaWQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgaWYoXy5pc1VuZGVmaW5lZCh0aGlzLnBhc3N3b3JkKSl7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdmFyIGxlbmd0aCA9IHRoaXMucGFzc3dvcmQubGVuZ3RoO1xuICAgICAgICAgICAgICAgIHJldHVybiAobGVuZ3RoID49IDYpICYmIChsZW5ndGggPD0gNDApO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICBhbGxGaWVsZHNQcmVzZW50OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgIHJldHVybiAhISh0aGlzLmZpcnN0bmFtZSAmJiB0aGlzLmxhc3RuYW1lICYmIHRoaXMuZW1haWwgJiYgdGhpcy5wYXNzd29yZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfTtcblxuICAgICAgICAgIHNjb3BlLmJvaWxlcnBsYXRlSHRtbCA9IHNpZ251cC50ZXJtc0h0bWwoJ2J5X3NpZ25pbmdfdXBfaHRtbCcpO1xuICAgICAgICAgIHNjb3BlLnN1Ym1pdFNpZ251cCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBhY2NvdW50ID0gc2NvcGUuc2lnbnVwQWNjb3VudDtcbiAgICAgICAgICAgIGlmKGFjY291bnQucGFzc3dvcmRWYWxpZCgpICYmIGFjY291bnQuZW1haWxWYWxpZCgpICYmIGFjY291bnQuYWxsRmllbGRzUHJlc2VudCgpKSB7XG4gICAgICAgICAgICAgIHNjb3BlLmRpc2FibGVTaWduVXAgPSB0cnVlO1xuICAgICAgICAgICAgICBzaWdudXAuc3VibWl0U2lnbnVwKGFjY291bnQsIHNjb3BlLmRvbWFpbkNvZGUpLnRoZW4oc2lnbnVwU3VjY2Vzcywgc2lnbnVwRXJyb3IpLmZpbmFsbHkoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgc2NvcGUuZGlzYWJsZVNpZ25VcCA9IGZhbHNlO1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHNjb3BlLnNpZ251cEZhaWxlZCA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9XG5cblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIC4vYW5jaWxsYXJ5L2hlYWRlci9zaWdudXAtZm9ybS1kaXJlY3RpdmUuanNcbiAqKi8iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7O0FBQ0E7QUFDQTs7QUFFQTs7QUFKQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBT0E7OztBQUxBO0FBQ0E7QUFDQTtBQUNBO0FBU0E7Ozs7QUFOQTs7QUFUQTtBQVlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTs7QUFGQTs7O0FBT0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FBSUE7QUFDQTs7OztBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7Ozs7O0FBdEZBIiwic291cmNlUm9vdCI6IiJ9");

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

	eval("'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = headerFlashDirectives;\nfunction headerFlashDirectives(headerModule) {\n  headerModule.directive(\"headerFlashContainer\", ['flash', function (flash) {\n    return {\n      restrict: 'A',\n      scope: {},\n      template: __webpack_require__(190),\n      transclude: true,\n      link: function link(scope, element) {\n        element.removeClass(\"hidden\");\n        scope.flash = flash;\n      }\n    };\n  }]);\n\n  headerModule.directive(\"headerFlash\", function () {\n    return {\n      restrict: 'A',\n      scope: {\n        level: \"@headerFlashLevel\"\n      },\n      template: __webpack_require__(191),\n      transclude: true,\n      link: function link(scope) {\n        if (scope.level === \"alert\" || scope.level === \"error\") {\n          scope.style = \"messageNotification--error\";\n        } else if (scope.level === 'warn') {\n          scope.style = \"messageNotification--warning\";\n        } else {\n          scope.style = \"messageNotification--success\";\n        }\n\n        scope.open = true;\n        scope.closeFlash = function () {\n          scope.open = false;\n        };\n      }\n    };\n  });\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjA1LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vYW5jaWxsYXJ5L2hlYWRlci9oZWFkZXItZmxhc2gtZGlyZWN0aXZlcy5qcz8zODI2Il0sInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGhlYWRlckZsYXNoRGlyZWN0aXZlcyhoZWFkZXJNb2R1bGUpIHtcbiAgaGVhZGVyTW9kdWxlLmRpcmVjdGl2ZShcImhlYWRlckZsYXNoQ29udGFpbmVyXCIsIFsnZmxhc2gnLCBmdW5jdGlvbihmbGFzaCkge1xuICAgIHJldHVybiB7XG4gICAgICByZXN0cmljdDogJ0EnLFxuICAgICAgc2NvcGU6IHtcbiAgICAgIH0sXG4gICAgICB0ZW1wbGF0ZTogcmVxdWlyZSgnLi9oZWFkZXItZmxhc2gtY29udGFpbmVyLmh0bWwnKSxcbiAgICAgIHRyYW5zY2x1ZGU6IHRydWUsXG4gICAgICBsaW5rOiBmdW5jdGlvbihzY29wZSwgZWxlbWVudCkge1xuICAgICAgICBlbGVtZW50LnJlbW92ZUNsYXNzKFwiaGlkZGVuXCIpO1xuICAgICAgICBzY29wZS5mbGFzaCA9IGZsYXNoO1xuICAgICAgfVxuICAgIH07XG4gIH1dKTtcblxuICBoZWFkZXJNb2R1bGUuZGlyZWN0aXZlKFwiaGVhZGVyRmxhc2hcIiwgZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHJlc3RyaWN0OiAnQScsXG4gICAgICBzY29wZToge1xuICAgICAgICBsZXZlbDogXCJAaGVhZGVyRmxhc2hMZXZlbFwiXG4gICAgICB9LFxuICAgICAgdGVtcGxhdGU6IHJlcXVpcmUoJy4vaGVhZGVyLWZsYXNoLmh0bWwnKSxcbiAgICAgIHRyYW5zY2x1ZGU6IHRydWUsXG4gICAgICBsaW5rOiBmdW5jdGlvbiAoc2NvcGUpIHtcbiAgICAgICAgaWYgKHNjb3BlLmxldmVsID09PSBcImFsZXJ0XCIgfHwgc2NvcGUubGV2ZWwgPT09IFwiZXJyb3JcIikge1xuICAgICAgICAgIHNjb3BlLnN0eWxlID0gXCJtZXNzYWdlTm90aWZpY2F0aW9uLS1lcnJvclwiO1xuICAgICAgICB9IGVsc2UgaWYgKHNjb3BlLmxldmVsID09PSAnd2FybicpIHtcbiAgICAgICAgICBzY29wZS5zdHlsZSA9IFwibWVzc2FnZU5vdGlmaWNhdGlvbi0td2FybmluZ1wiO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHNjb3BlLnN0eWxlID0gXCJtZXNzYWdlTm90aWZpY2F0aW9uLS1zdWNjZXNzXCI7XG4gICAgICAgIH1cblxuICAgICAgICBzY29wZS5vcGVuID0gdHJ1ZTtcbiAgICAgICAgc2NvcGUuY2xvc2VGbGFzaCA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgIHNjb3BlLm9wZW4gPSBmYWxzZTtcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9O1xuICB9KTtcbn1cblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIC4vYW5jaWxsYXJ5L2hlYWRlci9oZWFkZXItZmxhc2gtZGlyZWN0aXZlcy5qc1xuICoqLyJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFMQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBOzs7OztBQWxDQSIsInNvdXJjZVJvb3QiOiIifQ==");

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

	eval("'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nexports.default = function (footer) {\n  footer.directive('footerLocaleDropdown', _footerLocaleDropdownDirective2.default).directive('footerNewsletterForm', _footerNewsletterFormDirective2.default).directive('footerTrustBbb', _footerTrustBbbDirective2.default);\n};\n\nvar _footerLocaleDropdownDirective = __webpack_require__(207);\n\nvar _footerLocaleDropdownDirective2 = _interopRequireDefault(_footerLocaleDropdownDirective);\n\nvar _footerNewsletterFormDirective = __webpack_require__(209);\n\nvar _footerNewsletterFormDirective2 = _interopRequireDefault(_footerNewsletterFormDirective);\n\nvar _footerTrustBbbDirective = __webpack_require__(210);\n\nvar _footerTrustBbbDirective2 = _interopRequireDefault(_footerTrustBbbDirective);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjA2LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vYW5jaWxsYXJ5L2Zvb3Rlci9pbmRleC5qcz9jNzMxIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBmb290ZXJMb2NhbGVEcm9wZG93biBmcm9tICcuL2Zvb3Rlci1sb2NhbGUtZHJvcGRvd24tZGlyZWN0aXZlJztcbmltcG9ydCBmb290ZXJOZXdzbGV0dGVyRm9ybSBmcm9tICcuL2Zvb3Rlci1uZXdzbGV0dGVyLWZvcm0tZGlyZWN0aXZlJztcbmltcG9ydCBmb290ZXJUcnVzdEJiYiBmcm9tICcuL2Zvb3Rlci10cnVzdC1iYmItZGlyZWN0aXZlJztcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oZm9vdGVyKSB7XG4gIGZvb3RlclxuICAgIC5kaXJlY3RpdmUoJ2Zvb3RlckxvY2FsZURyb3Bkb3duJywgZm9vdGVyTG9jYWxlRHJvcGRvd24pXG4gICAgLmRpcmVjdGl2ZSgnZm9vdGVyTmV3c2xldHRlckZvcm0nLCBmb290ZXJOZXdzbGV0dGVyRm9ybSlcbiAgICAuZGlyZWN0aXZlKCdmb290ZXJUcnVzdEJiYicsIGZvb3RlclRydXN0QmJiKTtcbn1cblxuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogLi9hbmNpbGxhcnkvZm9vdGVyL2luZGV4LmpzXG4gKiovIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFEQTs7O0FBTEE7QUFDQTtBQVdBO0FBQ0E7QUFaQTtBQUNBO0FBY0E7QUFDQTtBQWZBO0FBQ0E7QUFpQkE7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=");

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

	eval("'use strict';\n\nfooterLocaleDropdown.$inject = [\"$window\", \"i18n\", \"browser\"];\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = footerLocaleDropdown;\n/*@ngInject*/\nfunction footerLocaleDropdown($window, i18n, browser) {\n  return {\n    restrict: 'A',\n    template: __webpack_require__(208),\n    scope: {},\n    link: function link(scope, element, attrs) {\n      var localeHash = JSON.parse(attrs.localeOptions);\n      var localeOptions = [];\n      for (var localeKey in localeHash) {\n        localeOptions.push({ key: localeKey, value: localeHash[localeKey] });\n      }\n      scope.localeOptions = _.sortBy(localeOptions, 'key');\n      scope.currentLocale = localeHash[i18n.locale];\n\n      var localeUrl = function localeUrl(locale) {\n        var location = $window.location;\n        var queryParams = location.search === \"\" ? [] : location.search.substring(1).split(\"&\");\n        queryParams = _.reject(queryParams, function (param) {\n          return param.indexOf(\"locale\") != -1;\n        });\n        queryParams.push(\"locale=\" + locale);\n        return location.protocol + \"//\" + location.host + location.pathname + \"?\" + queryParams.join(\"&\");\n      };\n\n      scope.selectLocale = function (locale) {\n        browser.redirectTo(localeUrl(locale));\n      };\n    }\n  };\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjA3LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vYW5jaWxsYXJ5L2Zvb3Rlci9mb290ZXItbG9jYWxlLWRyb3Bkb3duLWRpcmVjdGl2ZS5qcz81NWY3Il0sInNvdXJjZXNDb250ZW50IjpbIi8qQG5nSW5qZWN0Ki9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGZvb3RlckxvY2FsZURyb3Bkb3duKCR3aW5kb3csIGkxOG4sIGJyb3dzZXIpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHJlc3RyaWN0OiAnQScsXG4gICAgICAgIHRlbXBsYXRlOiByZXF1aXJlKFwiLi9mb290ZXItbG9jYWxlLWRyb3Bkb3duLmh0bWxcIiksXG4gICAgICAgIHNjb3BlOiB7fSxcbiAgICAgICAgbGluazogZnVuY3Rpb24gKHNjb3BlLCBlbGVtZW50LCBhdHRycykge1xuICAgICAgICAgIHZhciBsb2NhbGVIYXNoID0gSlNPTi5wYXJzZShhdHRycy5sb2NhbGVPcHRpb25zKTtcbiAgICAgICAgICB2YXIgbG9jYWxlT3B0aW9ucyA9IFtdO1xuICAgICAgICAgIGZvciAodmFyIGxvY2FsZUtleSBpbiBsb2NhbGVIYXNoKSB7XG4gICAgICAgICAgICBsb2NhbGVPcHRpb25zLnB1c2goe2tleTogbG9jYWxlS2V5LCB2YWx1ZTogbG9jYWxlSGFzaFtsb2NhbGVLZXldfSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHNjb3BlLmxvY2FsZU9wdGlvbnMgPSBfLnNvcnRCeShsb2NhbGVPcHRpb25zLCAna2V5Jyk7XG4gICAgICAgICAgc2NvcGUuY3VycmVudExvY2FsZSA9IGxvY2FsZUhhc2hbaTE4bi5sb2NhbGVdO1xuXG4gICAgICAgICAgdmFyIGxvY2FsZVVybCA9IGZ1bmN0aW9uIChsb2NhbGUpIHtcbiAgICAgICAgICAgIHZhciBsb2NhdGlvbiA9ICR3aW5kb3cubG9jYXRpb247XG4gICAgICAgICAgICB2YXIgcXVlcnlQYXJhbXMgPSAobG9jYXRpb24uc2VhcmNoID09PSBcIlwiKSA/IFtdIDogbG9jYXRpb24uc2VhcmNoLnN1YnN0cmluZygxKS5zcGxpdChcIiZcIik7XG4gICAgICAgICAgICBxdWVyeVBhcmFtcyA9IF8ucmVqZWN0KHF1ZXJ5UGFyYW1zLCBmdW5jdGlvbiAocGFyYW0pIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHBhcmFtLmluZGV4T2YoXCJsb2NhbGVcIikgIT0gLTE7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHF1ZXJ5UGFyYW1zLnB1c2goXCJsb2NhbGU9XCIgKyBsb2NhbGUpO1xuICAgICAgICAgICAgcmV0dXJuIGxvY2F0aW9uLnByb3RvY29sICsgXCIvL1wiICsgbG9jYXRpb24uaG9zdCArIGxvY2F0aW9uLnBhdGhuYW1lICtcbiAgICAgICAgICAgICAgXCI/XCIgKyBxdWVyeVBhcmFtcy5qb2luKFwiJlwiKTtcbiAgICAgICAgICB9O1xuXG4gICAgICAgICAgc2NvcGUuc2VsZWN0TG9jYWxlID0gZnVuY3Rpb24gKGxvY2FsZSkge1xuICAgICAgICAgICAgYnJvd3Nlci5yZWRpcmVjdFRvKGxvY2FsZVVybChsb2NhbGUpKTtcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICB9O1xuICAgIH1cblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIC4vYW5jaWxsYXJ5L2Zvb3Rlci9mb290ZXItbG9jYWxlLWRyb3Bkb3duLWRpcmVjdGl2ZS5qc1xuICoqLyJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTs7QUFDQTtBQUNBOztBQUVBOztBQUpBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7O0FBSUE7QUFDQTs7OztBQTFCQSIsInNvdXJjZVJvb3QiOiIifQ==");

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

	eval("module.exports = \"<a href=\\\"\\\" bs-dropdown>\\n  <span>{{::currentLocale}}</span>\\n  <svg-icon icon=\\\"down-caret\\\"></svg-icon>\\n</a>\\n<ul class=\\\"dropdown-menu\\\">\\n  <li ng-repeat=\\\"localeOption in localeOptions\\\">\\n    <a href=\\\"\\\" ng-click=\\\"selectLocale(localeOption.key)\\\">{{::localeOption.value}}</a>\\n  </li>\\n</ul>\\n\";\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjA4LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vYW5jaWxsYXJ5L2Zvb3Rlci9mb290ZXItbG9jYWxlLWRyb3Bkb3duLmh0bWw/NDliNCJdLCJzb3VyY2VzQ29udGVudCI6WyJtb2R1bGUuZXhwb3J0cyA9IFwiPGEgaHJlZj1cXFwiXFxcIiBicy1kcm9wZG93bj5cXG4gIDxzcGFuPnt7OjpjdXJyZW50TG9jYWxlfX08L3NwYW4+XFxuICA8c3ZnLWljb24gaWNvbj1cXFwiZG93bi1jYXJldFxcXCI+PC9zdmctaWNvbj5cXG48L2E+XFxuPHVsIGNsYXNzPVxcXCJkcm9wZG93bi1tZW51XFxcIj5cXG4gIDxsaSBuZy1yZXBlYXQ9XFxcImxvY2FsZU9wdGlvbiBpbiBsb2NhbGVPcHRpb25zXFxcIj5cXG4gICAgPGEgaHJlZj1cXFwiXFxcIiBuZy1jbGljaz1cXFwic2VsZWN0TG9jYWxlKGxvY2FsZU9wdGlvbi5rZXkpXFxcIj57ezo6bG9jYWxlT3B0aW9uLnZhbHVlfX08L2E+XFxuICA8L2xpPlxcbjwvdWw+XFxuXCI7XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL2FuY2lsbGFyeS9mb290ZXIvZm9vdGVyLWxvY2FsZS1kcm9wZG93bi5odG1sXG4gKiogbW9kdWxlIGlkID0gMjA4XG4gKiogbW9kdWxlIGNodW5rcyA9IDI0XG4gKiovIl0sIm1hcHBpbmdzIjoiQUFBQSIsInNvdXJjZVJvb3QiOiIifQ==");

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

	eval("'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nexports.default = function () {\n  return {\n    restrict: 'A',\n    link: function link(scope, element) {\n      scope.submitForm = function () {\n        element.submit();\n      };\n    }\n  };\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjA5LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vYW5jaWxsYXJ5L2Zvb3Rlci9mb290ZXItbmV3c2xldHRlci1mb3JtLWRpcmVjdGl2ZS5qcz9mZGJhIl0sInNvdXJjZXNDb250ZW50IjpbIi8qQG5nSW5qZWN0Ki9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHJlc3RyaWN0OiAnQScsXG4gICAgICAgIGxpbms6IGZ1bmN0aW9uIChzY29wZSwgZWxlbWVudCkge1xuICAgICAgICAgIHNjb3BlLnN1Ym1pdEZvcm0gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBlbGVtZW50LnN1Ym1pdCgpO1xuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfVxuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogLi9hbmNpbGxhcnkvZm9vdGVyL2Zvb3Rlci1uZXdzbGV0dGVyLWZvcm0tZGlyZWN0aXZlLmpzXG4gKiovIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFKQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FBTEEiLCJzb3VyY2VSb290IjoiIn0=");

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

	eval("'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nexports.default = function (i18n) {\n  return {\n    restrict: 'A',\n    template: __webpack_require__(211),\n    scope: {\n      bbbImageUrl: \"@footerTrustBbbImageUrl\"\n    },\n    link: function link(scope) {\n      igg.externalService(function () {\n        // TRUSTe logo in footer\n        var tl = document.createElement('script');\n        tl.type = 'text/javascript';\n        tl.src = '//privacy-policy.truste.com/privacy-seal/Indiegogo,-Inc-/asc?rid=f11cda4f-ffd6-4d45-b3c3-dea39f0b8194';\n        tl.async = true;\n        var s = document.getElementsByTagName('script')[0];\n        s.parentNode.insertBefore(tl, s);\n      });\n      scope.inEnglish = i18n.locale === 'en';\n    }\n  };\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjEwLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vYW5jaWxsYXJ5L2Zvb3Rlci9mb290ZXItdHJ1c3QtYmJiLWRpcmVjdGl2ZS5qcz84NTExIl0sInNvdXJjZXNDb250ZW50IjpbIi8qQG5nSW5qZWN0Ki9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIChpMThuKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICByZXN0cmljdDogJ0EnLFxuICAgICAgICB0ZW1wbGF0ZTogcmVxdWlyZSgnLi9mb290ZXItdHJ1c3QtYmJiLmh0bWwnKSxcbiAgICAgICAgc2NvcGU6IHtcbiAgICAgICAgICBiYmJJbWFnZVVybDogXCJAZm9vdGVyVHJ1c3RCYmJJbWFnZVVybFwiXG4gICAgICAgIH0sXG4gICAgICAgIGxpbms6IGZ1bmN0aW9uIChzY29wZSkge1xuICAgICAgICAgIGlnZy5leHRlcm5hbFNlcnZpY2UoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAvLyBUUlVTVGUgbG9nbyBpbiBmb290ZXJcbiAgICAgICAgICAgIHZhciB0bCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NjcmlwdCcpO1xuICAgICAgICAgICAgdGwudHlwZSA9ICd0ZXh0L2phdmFzY3JpcHQnO1xuICAgICAgICAgICAgdGwuc3JjID0gJy8vcHJpdmFjeS1wb2xpY3kudHJ1c3RlLmNvbS9wcml2YWN5LXNlYWwvSW5kaWVnb2dvLC1JbmMtL2FzYz9yaWQ9ZjExY2RhNGYtZmZkNi00ZDQ1LWIzYzMtZGVhMzlmMGI4MTk0JztcbiAgICAgICAgICAgIHRsLmFzeW5jID0gdHJ1ZTtcbiAgICAgICAgICAgIHZhciBzID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ3NjcmlwdCcpWzBdO1xuICAgICAgICAgICAgcy5wYXJlbnROb2RlLmluc2VydEJlZm9yZSh0bCwgcyk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgc2NvcGUuaW5FbmdsaXNoID0gaTE4bi5sb2NhbGUgPT09ICdlbic7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfVxuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogLi9hbmNpbGxhcnkvZm9vdGVyL2Zvb3Rlci10cnVzdC1iYmItZGlyZWN0aXZlLmpzXG4gKiovIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFKQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOzs7QUFqQkEiLCJzb3VyY2VSb290IjoiIn0=");

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

	eval("module.exports = \"<a id=\\\"bbblink\\\" class=\\\"bbb sehzbus\\\" href=\\\"http://www.bbb.org/greater-san-francisco/business-reviews/internet-services/indiegogo-in-san-francisco-ca-372843#bbblogo\\\" target=\\\"_blank\\\"><img id=\\\"bbblinkimg\\\" ng-src=\\\"{{bbbImageUrl}}\\\" width=\\\"100\\\" height=\\\"38\\\" alt=\\\"{{::i18n.t('footer.bbb')}}\\\"/></a>\\n<div ng-if=\\\"::inEnglish\\\" id=\\\"f11cda4f-ffd6-4d45-b3c3-dea39f0b8194\\\" class=\\\"truste\\\"><a href=\\\"//privacy.truste.com/privacy-seal/Indiegogo,-Inc-/validation?rid=6d279abc-bf79-4648-bbc3-ac58bb077a34\\\" title=\\\"TRUSTe European Safe Harbor certification\\\" target=\\\"_blank\\\"><img style=\\\"border: none\\\" src=\\\"//privacy-policy.truste.com/privacy-seal/Indiegogo,-Inc-/seal?rid=6d279abc-bf79-4648-bbc3-ac58bb077a34\\\" height=\\\"38\\\" alt=\\\"TRUSTe European Safe Harbor certification\\\"/></a></div>\\n\";\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjExLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vYW5jaWxsYXJ5L2Zvb3Rlci9mb290ZXItdHJ1c3QtYmJiLmh0bWw/MzQ5MSJdLCJzb3VyY2VzQ29udGVudCI6WyJtb2R1bGUuZXhwb3J0cyA9IFwiPGEgaWQ9XFxcImJiYmxpbmtcXFwiIGNsYXNzPVxcXCJiYmIgc2VoemJ1c1xcXCIgaHJlZj1cXFwiaHR0cDovL3d3dy5iYmIub3JnL2dyZWF0ZXItc2FuLWZyYW5jaXNjby9idXNpbmVzcy1yZXZpZXdzL2ludGVybmV0LXNlcnZpY2VzL2luZGllZ29nby1pbi1zYW4tZnJhbmNpc2NvLWNhLTM3Mjg0MyNiYmJsb2dvXFxcIiB0YXJnZXQ9XFxcIl9ibGFua1xcXCI+PGltZyBpZD1cXFwiYmJibGlua2ltZ1xcXCIgbmctc3JjPVxcXCJ7e2JiYkltYWdlVXJsfX1cXFwiIHdpZHRoPVxcXCIxMDBcXFwiIGhlaWdodD1cXFwiMzhcXFwiIGFsdD1cXFwie3s6OmkxOG4udCgnZm9vdGVyLmJiYicpfX1cXFwiLz48L2E+XFxuPGRpdiBuZy1pZj1cXFwiOjppbkVuZ2xpc2hcXFwiIGlkPVxcXCJmMTFjZGE0Zi1mZmQ2LTRkNDUtYjNjMy1kZWEzOWYwYjgxOTRcXFwiIGNsYXNzPVxcXCJ0cnVzdGVcXFwiPjxhIGhyZWY9XFxcIi8vcHJpdmFjeS50cnVzdGUuY29tL3ByaXZhY3ktc2VhbC9JbmRpZWdvZ28sLUluYy0vdmFsaWRhdGlvbj9yaWQ9NmQyNzlhYmMtYmY3OS00NjQ4LWJiYzMtYWM1OGJiMDc3YTM0XFxcIiB0aXRsZT1cXFwiVFJVU1RlIEV1cm9wZWFuIFNhZmUgSGFyYm9yIGNlcnRpZmljYXRpb25cXFwiIHRhcmdldD1cXFwiX2JsYW5rXFxcIj48aW1nIHN0eWxlPVxcXCJib3JkZXI6IG5vbmVcXFwiIHNyYz1cXFwiLy9wcml2YWN5LXBvbGljeS50cnVzdGUuY29tL3ByaXZhY3ktc2VhbC9JbmRpZWdvZ28sLUluYy0vc2VhbD9yaWQ9NmQyNzlhYmMtYmY3OS00NjQ4LWJiYzMtYWM1OGJiMDc3YTM0XFxcIiBoZWlnaHQ9XFxcIjM4XFxcIiBhbHQ9XFxcIlRSVVNUZSBFdXJvcGVhbiBTYWZlIEhhcmJvciBjZXJ0aWZpY2F0aW9uXFxcIi8+PC9hPjwvZGl2PlxcblwiO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9hbmNpbGxhcnkvZm9vdGVyL2Zvb3Rlci10cnVzdC1iYmIuaHRtbFxuICoqIG1vZHVsZSBpZCA9IDIxMVxuICoqIG1vZHVsZSBjaHVua3MgPSAyNFxuICoqLyJdLCJtYXBwaW5ncyI6IkFBQUEiLCJzb3VyY2VSb290IjoiIn0=");

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

	eval("/* WEBPACK VAR INJECTION */(function(global) {\"use strict\";\n\n__webpack_require__(213);\n\n__webpack_require__(400);\n\nif (global._babelPolyfill) {\n  throw new Error(\"only one instance of babel-polyfill is allowed\");\n}\nglobal._babelPolyfill = true;\n/* WEBPACK VAR INJECTION */}.call(exports, (function() { return this; }())))\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjEyLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1wb2x5ZmlsbC9saWIvaW5kZXguanM/MzcxNyJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcblxucmVxdWlyZShcImNvcmUtanMvc2hpbVwiKTtcblxucmVxdWlyZShcImJhYmVsLXJlZ2VuZXJhdG9yLXJ1bnRpbWVcIik7XG5cbmlmIChnbG9iYWwuX2JhYmVsUG9seWZpbGwpIHtcbiAgdGhyb3cgbmV3IEVycm9yKFwib25seSBvbmUgaW5zdGFuY2Ugb2YgYmFiZWwtcG9seWZpbGwgaXMgYWxsb3dlZFwiKTtcbn1cbmdsb2JhbC5fYmFiZWxQb2x5ZmlsbCA9IHRydWU7XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcG9seWZpbGwvbGliL2luZGV4LmpzXG4gKiogbW9kdWxlIGlkID0gMjEyXG4gKiogbW9kdWxlIGNodW5rcyA9IDI0XG4gKiovIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");

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

	eval("__webpack_require__(214);\n__webpack_require__(247);\n__webpack_require__(253);\n__webpack_require__(255);\n__webpack_require__(257);\n__webpack_require__(259);\n__webpack_require__(261);\n__webpack_require__(263);\n__webpack_require__(264);\n__webpack_require__(265);\n__webpack_require__(266);\n__webpack_require__(267);\n__webpack_require__(268);\n__webpack_require__(269);\n__webpack_require__(270);\n__webpack_require__(271);\n__webpack_require__(272);\n__webpack_require__(273);\n__webpack_require__(274);\n__webpack_require__(277);\n__webpack_require__(278);\n__webpack_require__(279);\n__webpack_require__(281);\n__webpack_require__(282);\n__webpack_require__(283);\n__webpack_require__(284);\n__webpack_require__(285);\n__webpack_require__(286);\n__webpack_require__(287);\n__webpack_require__(289);\n__webpack_require__(290);\n__webpack_require__(291);\n__webpack_require__(293);\n__webpack_require__(294);\n__webpack_require__(295);\n__webpack_require__(297);\n__webpack_require__(298);\n__webpack_require__(299);\n__webpack_require__(300);\n__webpack_require__(301);\n__webpack_require__(302);\n__webpack_require__(303);\n__webpack_require__(304);\n__webpack_require__(305);\n__webpack_require__(306);\n__webpack_require__(307);\n__webpack_require__(308);\n__webpack_require__(309);\n__webpack_require__(310);\n__webpack_require__(315);\n__webpack_require__(316);\n__webpack_require__(320);\n__webpack_require__(321);\n__webpack_require__(323);\n__webpack_require__(324);\n__webpack_require__(329);\n__webpack_require__(330);\n__webpack_require__(333);\n__webpack_require__(335);\n__webpack_require__(337);\n__webpack_require__(339);\n__webpack_require__(340);\n__webpack_require__(341);\n__webpack_require__(343);\n__webpack_require__(344);\n__webpack_require__(346);\n__webpack_require__(347);\n__webpack_require__(348);\n__webpack_require__(349);\n__webpack_require__(356);\n__webpack_require__(359);\n__webpack_require__(360);\n__webpack_require__(362);\n__webpack_require__(363);\n__webpack_require__(364);\n__webpack_require__(365);\n__webpack_require__(366);\n__webpack_require__(367);\n__webpack_require__(368);\n__webpack_require__(369);\n__webpack_require__(370);\n__webpack_require__(371);\n__webpack_require__(372);\n__webpack_require__(373);\n__webpack_require__(375);\n__webpack_require__(376);\n__webpack_require__(377);\n__webpack_require__(378);\n__webpack_require__(379);\n__webpack_require__(380);\n__webpack_require__(382);\n__webpack_require__(383);\n__webpack_require__(384);\n__webpack_require__(385);\n__webpack_require__(387);\n__webpack_require__(388);\n__webpack_require__(390);\n__webpack_require__(391);\n__webpack_require__(393);\n__webpack_require__(394);\n__webpack_require__(395);\n__webpack_require__(398);\n__webpack_require__(399);\nmodule.exports = __webpack_require__(218);\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjEzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL3NoaW0uanM/NzI2ZiJdLCJzb3VyY2VzQ29udGVudCI6WyJyZXF1aXJlKCcuL21vZHVsZXMvZXM1Jyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LnN5bWJvbCcpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5vYmplY3QuYXNzaWduJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2Lm9iamVjdC5pcycpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5vYmplY3Quc2V0LXByb3RvdHlwZS1vZicpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5vYmplY3QudG8tc3RyaW5nJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2Lm9iamVjdC5mcmVlemUnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYub2JqZWN0LnNlYWwnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYub2JqZWN0LnByZXZlbnQtZXh0ZW5zaW9ucycpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5vYmplY3QuaXMtZnJvemVuJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2Lm9iamVjdC5pcy1zZWFsZWQnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYub2JqZWN0LmlzLWV4dGVuc2libGUnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYub2JqZWN0LmdldC1vd24tcHJvcGVydHktZGVzY3JpcHRvcicpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5vYmplY3QuZ2V0LXByb3RvdHlwZS1vZicpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5vYmplY3Qua2V5cycpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5vYmplY3QuZ2V0LW93bi1wcm9wZXJ0eS1uYW1lcycpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5mdW5jdGlvbi5uYW1lJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LmZ1bmN0aW9uLmhhcy1pbnN0YW5jZScpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5udW1iZXIuY29uc3RydWN0b3InKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYubnVtYmVyLmVwc2lsb24nKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYubnVtYmVyLmlzLWZpbml0ZScpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5udW1iZXIuaXMtaW50ZWdlcicpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5udW1iZXIuaXMtbmFuJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2Lm51bWJlci5pcy1zYWZlLWludGVnZXInKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYubnVtYmVyLm1heC1zYWZlLWludGVnZXInKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYubnVtYmVyLm1pbi1zYWZlLWludGVnZXInKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYubnVtYmVyLnBhcnNlLWZsb2F0Jyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2Lm51bWJlci5wYXJzZS1pbnQnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYubWF0aC5hY29zaCcpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5tYXRoLmFzaW5oJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2Lm1hdGguYXRhbmgnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYubWF0aC5jYnJ0Jyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2Lm1hdGguY2x6MzInKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYubWF0aC5jb3NoJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2Lm1hdGguZXhwbTEnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYubWF0aC5mcm91bmQnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYubWF0aC5oeXBvdCcpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5tYXRoLmltdWwnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYubWF0aC5sb2cxMCcpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5tYXRoLmxvZzFwJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2Lm1hdGgubG9nMicpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5tYXRoLnNpZ24nKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYubWF0aC5zaW5oJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2Lm1hdGgudGFuaCcpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5tYXRoLnRydW5jJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LnN0cmluZy5mcm9tLWNvZGUtcG9pbnQnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYuc3RyaW5nLnJhdycpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5zdHJpbmcudHJpbScpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5zdHJpbmcuaXRlcmF0b3InKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYuc3RyaW5nLmNvZGUtcG9pbnQtYXQnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYuc3RyaW5nLmVuZHMtd2l0aCcpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5zdHJpbmcuaW5jbHVkZXMnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYuc3RyaW5nLnJlcGVhdCcpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5zdHJpbmcuc3RhcnRzLXdpdGgnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYuYXJyYXkuZnJvbScpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5hcnJheS5vZicpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5hcnJheS5pdGVyYXRvcicpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5hcnJheS5zcGVjaWVzJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LmFycmF5LmNvcHktd2l0aGluJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LmFycmF5LmZpbGwnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYuYXJyYXkuZmluZCcpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5hcnJheS5maW5kLWluZGV4Jyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LnJlZ2V4cC5jb25zdHJ1Y3RvcicpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5yZWdleHAuZmxhZ3MnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYucmVnZXhwLm1hdGNoJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LnJlZ2V4cC5yZXBsYWNlJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LnJlZ2V4cC5zZWFyY2gnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYucmVnZXhwLnNwbGl0Jyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LnByb21pc2UnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYubWFwJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LnNldCcpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi53ZWFrLW1hcCcpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi53ZWFrLXNldCcpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5yZWZsZWN0LmFwcGx5Jyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LnJlZmxlY3QuY29uc3RydWN0Jyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LnJlZmxlY3QuZGVmaW5lLXByb3BlcnR5Jyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LnJlZmxlY3QuZGVsZXRlLXByb3BlcnR5Jyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LnJlZmxlY3QuZW51bWVyYXRlJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LnJlZmxlY3QuZ2V0Jyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LnJlZmxlY3QuZ2V0LW93bi1wcm9wZXJ0eS1kZXNjcmlwdG9yJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LnJlZmxlY3QuZ2V0LXByb3RvdHlwZS1vZicpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5yZWZsZWN0LmhhcycpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5yZWZsZWN0LmlzLWV4dGVuc2libGUnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYucmVmbGVjdC5vd24ta2V5cycpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5yZWZsZWN0LnByZXZlbnQtZXh0ZW5zaW9ucycpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5yZWZsZWN0LnNldCcpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5yZWZsZWN0LnNldC1wcm90b3R5cGUtb2YnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczcuYXJyYXkuaW5jbHVkZXMnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczcuc3RyaW5nLmF0Jyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM3LnN0cmluZy5wYWQtbGVmdCcpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNy5zdHJpbmcucGFkLXJpZ2h0Jyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM3LnN0cmluZy50cmltLWxlZnQnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczcuc3RyaW5nLnRyaW0tcmlnaHQnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczcucmVnZXhwLmVzY2FwZScpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNy5vYmplY3QuZ2V0LW93bi1wcm9wZXJ0eS1kZXNjcmlwdG9ycycpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNy5vYmplY3QudmFsdWVzJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM3Lm9iamVjdC5lbnRyaWVzJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM3Lm1hcC50by1qc29uJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM3LnNldC50by1qc29uJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvanMuYXJyYXkuc3RhdGljcycpO1xucmVxdWlyZSgnLi9tb2R1bGVzL3dlYi50aW1lcnMnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy93ZWIuaW1tZWRpYXRlJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvd2ViLmRvbS5pdGVyYWJsZScpO1xubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL21vZHVsZXMvJC5jb3JlJyk7XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vY29yZS1qcy9zaGltLmpzXG4gKiogbW9kdWxlIGlkID0gMjEzXG4gKiogbW9kdWxlIGNodW5rcyA9IDI0XG4gKiovIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");

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

	eval("'use strict';\nvar $                 = __webpack_require__(215)\n  , $export           = __webpack_require__(216)\n  , DESCRIPTORS       = __webpack_require__(221)\n  , createDesc        = __webpack_require__(220)\n  , html              = __webpack_require__(227)\n  , cel               = __webpack_require__(228)\n  , has               = __webpack_require__(230)\n  , cof               = __webpack_require__(231)\n  , invoke            = __webpack_require__(232)\n  , fails             = __webpack_require__(222)\n  , anObject          = __webpack_require__(233)\n  , aFunction         = __webpack_require__(226)\n  , isObject          = __webpack_require__(229)\n  , toObject          = __webpack_require__(234)\n  , toIObject         = __webpack_require__(236)\n  , toInteger         = __webpack_require__(238)\n  , toIndex           = __webpack_require__(239)\n  , toLength          = __webpack_require__(240)\n  , IObject           = __webpack_require__(237)\n  , IE_PROTO          = __webpack_require__(224)('__proto__')\n  , createArrayMethod = __webpack_require__(241)\n  , arrayIndexOf      = __webpack_require__(246)(false)\n  , ObjectProto       = Object.prototype\n  , ArrayProto        = Array.prototype\n  , arraySlice        = ArrayProto.slice\n  , arrayJoin         = ArrayProto.join\n  , defineProperty    = $.setDesc\n  , getOwnDescriptor  = $.getDesc\n  , defineProperties  = $.setDescs\n  , factories         = {}\n  , IE8_DOM_DEFINE;\n\nif(!DESCRIPTORS){\n  IE8_DOM_DEFINE = !fails(function(){\n    return defineProperty(cel('div'), 'a', {get: function(){ return 7; }}).a != 7;\n  });\n  $.setDesc = function(O, P, Attributes){\n    if(IE8_DOM_DEFINE)try {\n      return defineProperty(O, P, Attributes);\n    } catch(e){ /* empty */ }\n    if('get' in Attributes || 'set' in Attributes)throw TypeError('Accessors not supported!');\n    if('value' in Attributes)anObject(O)[P] = Attributes.value;\n    return O;\n  };\n  $.getDesc = function(O, P){\n    if(IE8_DOM_DEFINE)try {\n      return getOwnDescriptor(O, P);\n    } catch(e){ /* empty */ }\n    if(has(O, P))return createDesc(!ObjectProto.propertyIsEnumerable.call(O, P), O[P]);\n  };\n  $.setDescs = defineProperties = function(O, Properties){\n    anObject(O);\n    var keys   = $.getKeys(Properties)\n      , length = keys.length\n      , i = 0\n      , P;\n    while(length > i)$.setDesc(O, P = keys[i++], Properties[P]);\n    return O;\n  };\n}\n$export($export.S + $export.F * !DESCRIPTORS, 'Object', {\n  // 19.1.2.6 / 15.2.3.3 Object.getOwnPropertyDescriptor(O, P)\n  getOwnPropertyDescriptor: $.getDesc,\n  // 19.1.2.4 / 15.2.3.6 Object.defineProperty(O, P, Attributes)\n  defineProperty: $.setDesc,\n  // 19.1.2.3 / 15.2.3.7 Object.defineProperties(O, Properties)\n  defineProperties: defineProperties\n});\n\n  // IE 8- don't enum bug keys\nvar keys1 = ('constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,' +\n            'toLocaleString,toString,valueOf').split(',')\n  // Additional keys for getOwnPropertyNames\n  , keys2 = keys1.concat('length', 'prototype')\n  , keysLen1 = keys1.length;\n\n// Create object with `null` prototype: use iframe Object with cleared prototype\nvar createDict = function(){\n  // Thrash, waste and sodomy: IE GC bug\n  var iframe = cel('iframe')\n    , i      = keysLen1\n    , gt     = '>'\n    , iframeDocument;\n  iframe.style.display = 'none';\n  html.appendChild(iframe);\n  iframe.src = 'javascript:'; // eslint-disable-line no-script-url\n  // createDict = iframe.contentWindow.Object;\n  // html.removeChild(iframe);\n  iframeDocument = iframe.contentWindow.document;\n  iframeDocument.open();\n  iframeDocument.write('<script>document.F=Object</script' + gt);\n  iframeDocument.close();\n  createDict = iframeDocument.F;\n  while(i--)delete createDict.prototype[keys1[i]];\n  return createDict();\n};\nvar createGetKeys = function(names, length){\n  return function(object){\n    var O      = toIObject(object)\n      , i      = 0\n      , result = []\n      , key;\n    for(key in O)if(key != IE_PROTO)has(O, key) && result.push(key);\n    // Don't enum bug & hidden keys\n    while(length > i)if(has(O, key = names[i++])){\n      ~arrayIndexOf(result, key) || result.push(key);\n    }\n    return result;\n  };\n};\nvar Empty = function(){};\n$export($export.S, 'Object', {\n  // 19.1.2.9 / 15.2.3.2 Object.getPrototypeOf(O)\n  getPrototypeOf: $.getProto = $.getProto || function(O){\n    O = toObject(O);\n    if(has(O, IE_PROTO))return O[IE_PROTO];\n    if(typeof O.constructor == 'function' && O instanceof O.constructor){\n      return O.constructor.prototype;\n    } return O instanceof Object ? ObjectProto : null;\n  },\n  // 19.1.2.7 / 15.2.3.4 Object.getOwnPropertyNames(O)\n  getOwnPropertyNames: $.getNames = $.getNames || createGetKeys(keys2, keys2.length, true),\n  // 19.1.2.2 / 15.2.3.5 Object.create(O [, Properties])\n  create: $.create = $.create || function(O, /*?*/Properties){\n    var result;\n    if(O !== null){\n      Empty.prototype = anObject(O);\n      result = new Empty();\n      Empty.prototype = null;\n      // add \"__proto__\" for Object.getPrototypeOf shim\n      result[IE_PROTO] = O;\n    } else result = createDict();\n    return Properties === undefined ? result : defineProperties(result, Properties);\n  },\n  // 19.1.2.14 / 15.2.3.14 Object.keys(O)\n  keys: $.getKeys = $.getKeys || createGetKeys(keys1, keysLen1, false)\n});\n\nvar construct = function(F, len, args){\n  if(!(len in factories)){\n    for(var n = [], i = 0; i < len; i++)n[i] = 'a[' + i + ']';\n    factories[len] = Function('F,a', 'return new F(' + n.join(',') + ')');\n  }\n  return factories[len](F, args);\n};\n\n// 19.2.3.2 / 15.3.4.5 Function.prototype.bind(thisArg, args...)\n$export($export.P, 'Function', {\n  bind: function bind(that /*, args... */){\n    var fn       = aFunction(this)\n      , partArgs = arraySlice.call(arguments, 1);\n    var bound = function(/* args... */){\n      var args = partArgs.concat(arraySlice.call(arguments));\n      return this instanceof bound ? construct(fn, args.length, args) : invoke(fn, args, that);\n    };\n    if(isObject(fn.prototype))bound.prototype = fn.prototype;\n    return bound;\n  }\n});\n\n// fallback for not array-like ES3 strings and DOM objects\n$export($export.P + $export.F * fails(function(){\n  if(html)arraySlice.call(html);\n}), 'Array', {\n  slice: function(begin, end){\n    var len   = toLength(this.length)\n      , klass = cof(this);\n    end = end === undefined ? len : end;\n    if(klass == 'Array')return arraySlice.call(this, begin, end);\n    var start  = toIndex(begin, len)\n      , upTo   = toIndex(end, len)\n      , size   = toLength(upTo - start)\n      , cloned = Array(size)\n      , i      = 0;\n    for(; i < size; i++)cloned[i] = klass == 'String'\n      ? this.charAt(start + i)\n      : this[start + i];\n    return cloned;\n  }\n});\n$export($export.P + $export.F * (IObject != Object), 'Array', {\n  join: function join(separator){\n    return arrayJoin.call(IObject(this), separator === undefined ? ',' : separator);\n  }\n});\n\n// 22.1.2.2 / 15.4.3.2 Array.isArray(arg)\n$export($export.S, 'Array', {isArray: __webpack_require__(243)});\n\nvar createArrayReduce = function(isRight){\n  return function(callbackfn, memo){\n    aFunction(callbackfn);\n    var O      = IObject(this)\n      , length = toLength(O.length)\n      , index  = isRight ? length - 1 : 0\n      , i      = isRight ? -1 : 1;\n    if(arguments.length < 2)for(;;){\n      if(index in O){\n        memo = O[index];\n        index += i;\n        break;\n      }\n      index += i;\n      if(isRight ? index < 0 : length <= index){\n        throw TypeError('Reduce of empty array with no initial value');\n      }\n    }\n    for(;isRight ? index >= 0 : length > index; index += i)if(index in O){\n      memo = callbackfn(memo, O[index], index, this);\n    }\n    return memo;\n  };\n};\n\nvar methodize = function($fn){\n  return function(arg1/*, arg2 = undefined */){\n    return $fn(this, arg1, arguments[1]);\n  };\n};\n\n$export($export.P, 'Array', {\n  // 22.1.3.10 / 15.4.4.18 Array.prototype.forEach(callbackfn [, thisArg])\n  forEach: $.each = $.each || methodize(createArrayMethod(0)),\n  // 22.1.3.15 / 15.4.4.19 Array.prototype.map(callbackfn [, thisArg])\n  map: methodize(createArrayMethod(1)),\n  // 22.1.3.7 / 15.4.4.20 Array.prototype.filter(callbackfn [, thisArg])\n  filter: methodize(createArrayMethod(2)),\n  // 22.1.3.23 / 15.4.4.17 Array.prototype.some(callbackfn [, thisArg])\n  some: methodize(createArrayMethod(3)),\n  // 22.1.3.5 / 15.4.4.16 Array.prototype.every(callbackfn [, thisArg])\n  every: methodize(createArrayMethod(4)),\n  // 22.1.3.18 / 15.4.4.21 Array.prototype.reduce(callbackfn [, initialValue])\n  reduce: createArrayReduce(false),\n  // 22.1.3.19 / 15.4.4.22 Array.prototype.reduceRight(callbackfn [, initialValue])\n  reduceRight: createArrayReduce(true),\n  // 22.1.3.11 / 15.4.4.14 Array.prototype.indexOf(searchElement [, fromIndex])\n  indexOf: methodize(arrayIndexOf),\n  // 22.1.3.14 / 15.4.4.15 Array.prototype.lastIndexOf(searchElement [, fromIndex])\n  lastIndexOf: function(el, fromIndex /* = @[*-1] */){\n    var O      = toIObject(this)\n      , length = toLength(O.length)\n      , index  = length - 1;\n    if(arguments.length > 1)index = Math.min(index, toInteger(fromIndex));\n    if(index < 0)index = toLength(length + index);\n    for(;index >= 0; index--)if(index in O)if(O[index] === el)return index;\n    return -1;\n  }\n});\n\n// 20.3.3.1 / 15.9.4.4 Date.now()\n$export($export.S, 'Date', {now: function(){ return +new Date; }});\n\nvar lz = function(num){\n  return num > 9 ? num : '0' + num;\n};\n\n// 20.3.4.36 / 15.9.5.43 Date.prototype.toISOString()\n// PhantomJS / old WebKit has a broken implementations\n$export($export.P + $export.F * (fails(function(){\n  return new Date(-5e13 - 1).toISOString() != '0385-07-25T07:06:39.999Z';\n}) || !fails(function(){\n  new Date(NaN).toISOString();\n})), 'Date', {\n  toISOString: function toISOString(){\n    if(!isFinite(this))throw RangeError('Invalid time value');\n    var d = this\n      , y = d.getUTCFullYear()\n      , m = d.getUTCMilliseconds()\n      , s = y < 0 ? '-' : y > 9999 ? '+' : '';\n    return s + ('00000' + Math.abs(y)).slice(s ? -6 : -4) +\n      '-' + lz(d.getUTCMonth() + 1) + '-' + lz(d.getUTCDate()) +\n      'T' + lz(d.getUTCHours()) + ':' + lz(d.getUTCMinutes()) +\n      ':' + lz(d.getUTCSeconds()) + '.' + (m > 99 ? m : '0' + lz(m)) + 'Z';\n  }\n});\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjE0LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvZXM1LmpzPzc2YjciXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xudmFyICQgICAgICAgICAgICAgICAgID0gcmVxdWlyZSgnLi8kJylcbiAgLCAkZXhwb3J0ICAgICAgICAgICA9IHJlcXVpcmUoJy4vJC5leHBvcnQnKVxuICAsIERFU0NSSVBUT1JTICAgICAgID0gcmVxdWlyZSgnLi8kLmRlc2NyaXB0b3JzJylcbiAgLCBjcmVhdGVEZXNjICAgICAgICA9IHJlcXVpcmUoJy4vJC5wcm9wZXJ0eS1kZXNjJylcbiAgLCBodG1sICAgICAgICAgICAgICA9IHJlcXVpcmUoJy4vJC5odG1sJylcbiAgLCBjZWwgICAgICAgICAgICAgICA9IHJlcXVpcmUoJy4vJC5kb20tY3JlYXRlJylcbiAgLCBoYXMgICAgICAgICAgICAgICA9IHJlcXVpcmUoJy4vJC5oYXMnKVxuICAsIGNvZiAgICAgICAgICAgICAgID0gcmVxdWlyZSgnLi8kLmNvZicpXG4gICwgaW52b2tlICAgICAgICAgICAgPSByZXF1aXJlKCcuLyQuaW52b2tlJylcbiAgLCBmYWlscyAgICAgICAgICAgICA9IHJlcXVpcmUoJy4vJC5mYWlscycpXG4gICwgYW5PYmplY3QgICAgICAgICAgPSByZXF1aXJlKCcuLyQuYW4tb2JqZWN0JylcbiAgLCBhRnVuY3Rpb24gICAgICAgICA9IHJlcXVpcmUoJy4vJC5hLWZ1bmN0aW9uJylcbiAgLCBpc09iamVjdCAgICAgICAgICA9IHJlcXVpcmUoJy4vJC5pcy1vYmplY3QnKVxuICAsIHRvT2JqZWN0ICAgICAgICAgID0gcmVxdWlyZSgnLi8kLnRvLW9iamVjdCcpXG4gICwgdG9JT2JqZWN0ICAgICAgICAgPSByZXF1aXJlKCcuLyQudG8taW9iamVjdCcpXG4gICwgdG9JbnRlZ2VyICAgICAgICAgPSByZXF1aXJlKCcuLyQudG8taW50ZWdlcicpXG4gICwgdG9JbmRleCAgICAgICAgICAgPSByZXF1aXJlKCcuLyQudG8taW5kZXgnKVxuICAsIHRvTGVuZ3RoICAgICAgICAgID0gcmVxdWlyZSgnLi8kLnRvLWxlbmd0aCcpXG4gICwgSU9iamVjdCAgICAgICAgICAgPSByZXF1aXJlKCcuLyQuaW9iamVjdCcpXG4gICwgSUVfUFJPVE8gICAgICAgICAgPSByZXF1aXJlKCcuLyQudWlkJykoJ19fcHJvdG9fXycpXG4gICwgY3JlYXRlQXJyYXlNZXRob2QgPSByZXF1aXJlKCcuLyQuYXJyYXktbWV0aG9kcycpXG4gICwgYXJyYXlJbmRleE9mICAgICAgPSByZXF1aXJlKCcuLyQuYXJyYXktaW5jbHVkZXMnKShmYWxzZSlcbiAgLCBPYmplY3RQcm90byAgICAgICA9IE9iamVjdC5wcm90b3R5cGVcbiAgLCBBcnJheVByb3RvICAgICAgICA9IEFycmF5LnByb3RvdHlwZVxuICAsIGFycmF5U2xpY2UgICAgICAgID0gQXJyYXlQcm90by5zbGljZVxuICAsIGFycmF5Sm9pbiAgICAgICAgID0gQXJyYXlQcm90by5qb2luXG4gICwgZGVmaW5lUHJvcGVydHkgICAgPSAkLnNldERlc2NcbiAgLCBnZXRPd25EZXNjcmlwdG9yICA9ICQuZ2V0RGVzY1xuICAsIGRlZmluZVByb3BlcnRpZXMgID0gJC5zZXREZXNjc1xuICAsIGZhY3RvcmllcyAgICAgICAgID0ge31cbiAgLCBJRThfRE9NX0RFRklORTtcblxuaWYoIURFU0NSSVBUT1JTKXtcbiAgSUU4X0RPTV9ERUZJTkUgPSAhZmFpbHMoZnVuY3Rpb24oKXtcbiAgICByZXR1cm4gZGVmaW5lUHJvcGVydHkoY2VsKCdkaXYnKSwgJ2EnLCB7Z2V0OiBmdW5jdGlvbigpeyByZXR1cm4gNzsgfX0pLmEgIT0gNztcbiAgfSk7XG4gICQuc2V0RGVzYyA9IGZ1bmN0aW9uKE8sIFAsIEF0dHJpYnV0ZXMpe1xuICAgIGlmKElFOF9ET01fREVGSU5FKXRyeSB7XG4gICAgICByZXR1cm4gZGVmaW5lUHJvcGVydHkoTywgUCwgQXR0cmlidXRlcyk7XG4gICAgfSBjYXRjaChlKXsgLyogZW1wdHkgKi8gfVxuICAgIGlmKCdnZXQnIGluIEF0dHJpYnV0ZXMgfHwgJ3NldCcgaW4gQXR0cmlidXRlcyl0aHJvdyBUeXBlRXJyb3IoJ0FjY2Vzc29ycyBub3Qgc3VwcG9ydGVkIScpO1xuICAgIGlmKCd2YWx1ZScgaW4gQXR0cmlidXRlcylhbk9iamVjdChPKVtQXSA9IEF0dHJpYnV0ZXMudmFsdWU7XG4gICAgcmV0dXJuIE87XG4gIH07XG4gICQuZ2V0RGVzYyA9IGZ1bmN0aW9uKE8sIFApe1xuICAgIGlmKElFOF9ET01fREVGSU5FKXRyeSB7XG4gICAgICByZXR1cm4gZ2V0T3duRGVzY3JpcHRvcihPLCBQKTtcbiAgICB9IGNhdGNoKGUpeyAvKiBlbXB0eSAqLyB9XG4gICAgaWYoaGFzKE8sIFApKXJldHVybiBjcmVhdGVEZXNjKCFPYmplY3RQcm90by5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKE8sIFApLCBPW1BdKTtcbiAgfTtcbiAgJC5zZXREZXNjcyA9IGRlZmluZVByb3BlcnRpZXMgPSBmdW5jdGlvbihPLCBQcm9wZXJ0aWVzKXtcbiAgICBhbk9iamVjdChPKTtcbiAgICB2YXIga2V5cyAgID0gJC5nZXRLZXlzKFByb3BlcnRpZXMpXG4gICAgICAsIGxlbmd0aCA9IGtleXMubGVuZ3RoXG4gICAgICAsIGkgPSAwXG4gICAgICAsIFA7XG4gICAgd2hpbGUobGVuZ3RoID4gaSkkLnNldERlc2MoTywgUCA9IGtleXNbaSsrXSwgUHJvcGVydGllc1tQXSk7XG4gICAgcmV0dXJuIE87XG4gIH07XG59XG4kZXhwb3J0KCRleHBvcnQuUyArICRleHBvcnQuRiAqICFERVNDUklQVE9SUywgJ09iamVjdCcsIHtcbiAgLy8gMTkuMS4yLjYgLyAxNS4yLjMuMyBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKE8sIFApXG4gIGdldE93blByb3BlcnR5RGVzY3JpcHRvcjogJC5nZXREZXNjLFxuICAvLyAxOS4xLjIuNCAvIDE1LjIuMy42IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShPLCBQLCBBdHRyaWJ1dGVzKVxuICBkZWZpbmVQcm9wZXJ0eTogJC5zZXREZXNjLFxuICAvLyAxOS4xLjIuMyAvIDE1LjIuMy43IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKE8sIFByb3BlcnRpZXMpXG4gIGRlZmluZVByb3BlcnRpZXM6IGRlZmluZVByb3BlcnRpZXNcbn0pO1xuXG4gIC8vIElFIDgtIGRvbid0IGVudW0gYnVnIGtleXNcbnZhciBrZXlzMSA9ICgnY29uc3RydWN0b3IsaGFzT3duUHJvcGVydHksaXNQcm90b3R5cGVPZixwcm9wZXJ0eUlzRW51bWVyYWJsZSwnICtcbiAgICAgICAgICAgICd0b0xvY2FsZVN0cmluZyx0b1N0cmluZyx2YWx1ZU9mJykuc3BsaXQoJywnKVxuICAvLyBBZGRpdGlvbmFsIGtleXMgZm9yIGdldE93blByb3BlcnR5TmFtZXNcbiAgLCBrZXlzMiA9IGtleXMxLmNvbmNhdCgnbGVuZ3RoJywgJ3Byb3RvdHlwZScpXG4gICwga2V5c0xlbjEgPSBrZXlzMS5sZW5ndGg7XG5cbi8vIENyZWF0ZSBvYmplY3Qgd2l0aCBgbnVsbGAgcHJvdG90eXBlOiB1c2UgaWZyYW1lIE9iamVjdCB3aXRoIGNsZWFyZWQgcHJvdG90eXBlXG52YXIgY3JlYXRlRGljdCA9IGZ1bmN0aW9uKCl7XG4gIC8vIFRocmFzaCwgd2FzdGUgYW5kIHNvZG9teTogSUUgR0MgYnVnXG4gIHZhciBpZnJhbWUgPSBjZWwoJ2lmcmFtZScpXG4gICAgLCBpICAgICAgPSBrZXlzTGVuMVxuICAgICwgZ3QgICAgID0gJz4nXG4gICAgLCBpZnJhbWVEb2N1bWVudDtcbiAgaWZyYW1lLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gIGh0bWwuYXBwZW5kQ2hpbGQoaWZyYW1lKTtcbiAgaWZyYW1lLnNyYyA9ICdqYXZhc2NyaXB0Oic7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tc2NyaXB0LXVybFxuICAvLyBjcmVhdGVEaWN0ID0gaWZyYW1lLmNvbnRlbnRXaW5kb3cuT2JqZWN0O1xuICAvLyBodG1sLnJlbW92ZUNoaWxkKGlmcmFtZSk7XG4gIGlmcmFtZURvY3VtZW50ID0gaWZyYW1lLmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQ7XG4gIGlmcmFtZURvY3VtZW50Lm9wZW4oKTtcbiAgaWZyYW1lRG9jdW1lbnQud3JpdGUoJzxzY3JpcHQ+ZG9jdW1lbnQuRj1PYmplY3Q8L3NjcmlwdCcgKyBndCk7XG4gIGlmcmFtZURvY3VtZW50LmNsb3NlKCk7XG4gIGNyZWF0ZURpY3QgPSBpZnJhbWVEb2N1bWVudC5GO1xuICB3aGlsZShpLS0pZGVsZXRlIGNyZWF0ZURpY3QucHJvdG90eXBlW2tleXMxW2ldXTtcbiAgcmV0dXJuIGNyZWF0ZURpY3QoKTtcbn07XG52YXIgY3JlYXRlR2V0S2V5cyA9IGZ1bmN0aW9uKG5hbWVzLCBsZW5ndGgpe1xuICByZXR1cm4gZnVuY3Rpb24ob2JqZWN0KXtcbiAgICB2YXIgTyAgICAgID0gdG9JT2JqZWN0KG9iamVjdClcbiAgICAgICwgaSAgICAgID0gMFxuICAgICAgLCByZXN1bHQgPSBbXVxuICAgICAgLCBrZXk7XG4gICAgZm9yKGtleSBpbiBPKWlmKGtleSAhPSBJRV9QUk9UTyloYXMoTywga2V5KSAmJiByZXN1bHQucHVzaChrZXkpO1xuICAgIC8vIERvbid0IGVudW0gYnVnICYgaGlkZGVuIGtleXNcbiAgICB3aGlsZShsZW5ndGggPiBpKWlmKGhhcyhPLCBrZXkgPSBuYW1lc1tpKytdKSl7XG4gICAgICB+YXJyYXlJbmRleE9mKHJlc3VsdCwga2V5KSB8fCByZXN1bHQucHVzaChrZXkpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9O1xufTtcbnZhciBFbXB0eSA9IGZ1bmN0aW9uKCl7fTtcbiRleHBvcnQoJGV4cG9ydC5TLCAnT2JqZWN0Jywge1xuICAvLyAxOS4xLjIuOSAvIDE1LjIuMy4yIE9iamVjdC5nZXRQcm90b3R5cGVPZihPKVxuICBnZXRQcm90b3R5cGVPZjogJC5nZXRQcm90byA9ICQuZ2V0UHJvdG8gfHwgZnVuY3Rpb24oTyl7XG4gICAgTyA9IHRvT2JqZWN0KE8pO1xuICAgIGlmKGhhcyhPLCBJRV9QUk9UTykpcmV0dXJuIE9bSUVfUFJPVE9dO1xuICAgIGlmKHR5cGVvZiBPLmNvbnN0cnVjdG9yID09ICdmdW5jdGlvbicgJiYgTyBpbnN0YW5jZW9mIE8uY29uc3RydWN0b3Ipe1xuICAgICAgcmV0dXJuIE8uY29uc3RydWN0b3IucHJvdG90eXBlO1xuICAgIH0gcmV0dXJuIE8gaW5zdGFuY2VvZiBPYmplY3QgPyBPYmplY3RQcm90byA6IG51bGw7XG4gIH0sXG4gIC8vIDE5LjEuMi43IC8gMTUuMi4zLjQgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoTylcbiAgZ2V0T3duUHJvcGVydHlOYW1lczogJC5nZXROYW1lcyA9ICQuZ2V0TmFtZXMgfHwgY3JlYXRlR2V0S2V5cyhrZXlzMiwga2V5czIubGVuZ3RoLCB0cnVlKSxcbiAgLy8gMTkuMS4yLjIgLyAxNS4yLjMuNSBPYmplY3QuY3JlYXRlKE8gWywgUHJvcGVydGllc10pXG4gIGNyZWF0ZTogJC5jcmVhdGUgPSAkLmNyZWF0ZSB8fCBmdW5jdGlvbihPLCAvKj8qL1Byb3BlcnRpZXMpe1xuICAgIHZhciByZXN1bHQ7XG4gICAgaWYoTyAhPT0gbnVsbCl7XG4gICAgICBFbXB0eS5wcm90b3R5cGUgPSBhbk9iamVjdChPKTtcbiAgICAgIHJlc3VsdCA9IG5ldyBFbXB0eSgpO1xuICAgICAgRW1wdHkucHJvdG90eXBlID0gbnVsbDtcbiAgICAgIC8vIGFkZCBcIl9fcHJvdG9fX1wiIGZvciBPYmplY3QuZ2V0UHJvdG90eXBlT2Ygc2hpbVxuICAgICAgcmVzdWx0W0lFX1BST1RPXSA9IE87XG4gICAgfSBlbHNlIHJlc3VsdCA9IGNyZWF0ZURpY3QoKTtcbiAgICByZXR1cm4gUHJvcGVydGllcyA9PT0gdW5kZWZpbmVkID8gcmVzdWx0IDogZGVmaW5lUHJvcGVydGllcyhyZXN1bHQsIFByb3BlcnRpZXMpO1xuICB9LFxuICAvLyAxOS4xLjIuMTQgLyAxNS4yLjMuMTQgT2JqZWN0LmtleXMoTylcbiAga2V5czogJC5nZXRLZXlzID0gJC5nZXRLZXlzIHx8IGNyZWF0ZUdldEtleXMoa2V5czEsIGtleXNMZW4xLCBmYWxzZSlcbn0pO1xuXG52YXIgY29uc3RydWN0ID0gZnVuY3Rpb24oRiwgbGVuLCBhcmdzKXtcbiAgaWYoIShsZW4gaW4gZmFjdG9yaWVzKSl7XG4gICAgZm9yKHZhciBuID0gW10sIGkgPSAwOyBpIDwgbGVuOyBpKyspbltpXSA9ICdhWycgKyBpICsgJ10nO1xuICAgIGZhY3Rvcmllc1tsZW5dID0gRnVuY3Rpb24oJ0YsYScsICdyZXR1cm4gbmV3IEYoJyArIG4uam9pbignLCcpICsgJyknKTtcbiAgfVxuICByZXR1cm4gZmFjdG9yaWVzW2xlbl0oRiwgYXJncyk7XG59O1xuXG4vLyAxOS4yLjMuMiAvIDE1LjMuNC41IEZ1bmN0aW9uLnByb3RvdHlwZS5iaW5kKHRoaXNBcmcsIGFyZ3MuLi4pXG4kZXhwb3J0KCRleHBvcnQuUCwgJ0Z1bmN0aW9uJywge1xuICBiaW5kOiBmdW5jdGlvbiBiaW5kKHRoYXQgLyosIGFyZ3MuLi4gKi8pe1xuICAgIHZhciBmbiAgICAgICA9IGFGdW5jdGlvbih0aGlzKVxuICAgICAgLCBwYXJ0QXJncyA9IGFycmF5U2xpY2UuY2FsbChhcmd1bWVudHMsIDEpO1xuICAgIHZhciBib3VuZCA9IGZ1bmN0aW9uKC8qIGFyZ3MuLi4gKi8pe1xuICAgICAgdmFyIGFyZ3MgPSBwYXJ0QXJncy5jb25jYXQoYXJyYXlTbGljZS5jYWxsKGFyZ3VtZW50cykpO1xuICAgICAgcmV0dXJuIHRoaXMgaW5zdGFuY2VvZiBib3VuZCA/IGNvbnN0cnVjdChmbiwgYXJncy5sZW5ndGgsIGFyZ3MpIDogaW52b2tlKGZuLCBhcmdzLCB0aGF0KTtcbiAgICB9O1xuICAgIGlmKGlzT2JqZWN0KGZuLnByb3RvdHlwZSkpYm91bmQucHJvdG90eXBlID0gZm4ucHJvdG90eXBlO1xuICAgIHJldHVybiBib3VuZDtcbiAgfVxufSk7XG5cbi8vIGZhbGxiYWNrIGZvciBub3QgYXJyYXktbGlrZSBFUzMgc3RyaW5ncyBhbmQgRE9NIG9iamVjdHNcbiRleHBvcnQoJGV4cG9ydC5QICsgJGV4cG9ydC5GICogZmFpbHMoZnVuY3Rpb24oKXtcbiAgaWYoaHRtbClhcnJheVNsaWNlLmNhbGwoaHRtbCk7XG59KSwgJ0FycmF5Jywge1xuICBzbGljZTogZnVuY3Rpb24oYmVnaW4sIGVuZCl7XG4gICAgdmFyIGxlbiAgID0gdG9MZW5ndGgodGhpcy5sZW5ndGgpXG4gICAgICAsIGtsYXNzID0gY29mKHRoaXMpO1xuICAgIGVuZCA9IGVuZCA9PT0gdW5kZWZpbmVkID8gbGVuIDogZW5kO1xuICAgIGlmKGtsYXNzID09ICdBcnJheScpcmV0dXJuIGFycmF5U2xpY2UuY2FsbCh0aGlzLCBiZWdpbiwgZW5kKTtcbiAgICB2YXIgc3RhcnQgID0gdG9JbmRleChiZWdpbiwgbGVuKVxuICAgICAgLCB1cFRvICAgPSB0b0luZGV4KGVuZCwgbGVuKVxuICAgICAgLCBzaXplICAgPSB0b0xlbmd0aCh1cFRvIC0gc3RhcnQpXG4gICAgICAsIGNsb25lZCA9IEFycmF5KHNpemUpXG4gICAgICAsIGkgICAgICA9IDA7XG4gICAgZm9yKDsgaSA8IHNpemU7IGkrKyljbG9uZWRbaV0gPSBrbGFzcyA9PSAnU3RyaW5nJ1xuICAgICAgPyB0aGlzLmNoYXJBdChzdGFydCArIGkpXG4gICAgICA6IHRoaXNbc3RhcnQgKyBpXTtcbiAgICByZXR1cm4gY2xvbmVkO1xuICB9XG59KTtcbiRleHBvcnQoJGV4cG9ydC5QICsgJGV4cG9ydC5GICogKElPYmplY3QgIT0gT2JqZWN0KSwgJ0FycmF5Jywge1xuICBqb2luOiBmdW5jdGlvbiBqb2luKHNlcGFyYXRvcil7XG4gICAgcmV0dXJuIGFycmF5Sm9pbi5jYWxsKElPYmplY3QodGhpcyksIHNlcGFyYXRvciA9PT0gdW5kZWZpbmVkID8gJywnIDogc2VwYXJhdG9yKTtcbiAgfVxufSk7XG5cbi8vIDIyLjEuMi4yIC8gMTUuNC4zLjIgQXJyYXkuaXNBcnJheShhcmcpXG4kZXhwb3J0KCRleHBvcnQuUywgJ0FycmF5Jywge2lzQXJyYXk6IHJlcXVpcmUoJy4vJC5pcy1hcnJheScpfSk7XG5cbnZhciBjcmVhdGVBcnJheVJlZHVjZSA9IGZ1bmN0aW9uKGlzUmlnaHQpe1xuICByZXR1cm4gZnVuY3Rpb24oY2FsbGJhY2tmbiwgbWVtbyl7XG4gICAgYUZ1bmN0aW9uKGNhbGxiYWNrZm4pO1xuICAgIHZhciBPICAgICAgPSBJT2JqZWN0KHRoaXMpXG4gICAgICAsIGxlbmd0aCA9IHRvTGVuZ3RoKE8ubGVuZ3RoKVxuICAgICAgLCBpbmRleCAgPSBpc1JpZ2h0ID8gbGVuZ3RoIC0gMSA6IDBcbiAgICAgICwgaSAgICAgID0gaXNSaWdodCA/IC0xIDogMTtcbiAgICBpZihhcmd1bWVudHMubGVuZ3RoIDwgMilmb3IoOzspe1xuICAgICAgaWYoaW5kZXggaW4gTyl7XG4gICAgICAgIG1lbW8gPSBPW2luZGV4XTtcbiAgICAgICAgaW5kZXggKz0gaTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBpbmRleCArPSBpO1xuICAgICAgaWYoaXNSaWdodCA/IGluZGV4IDwgMCA6IGxlbmd0aCA8PSBpbmRleCl7XG4gICAgICAgIHRocm93IFR5cGVFcnJvcignUmVkdWNlIG9mIGVtcHR5IGFycmF5IHdpdGggbm8gaW5pdGlhbCB2YWx1ZScpO1xuICAgICAgfVxuICAgIH1cbiAgICBmb3IoO2lzUmlnaHQgPyBpbmRleCA+PSAwIDogbGVuZ3RoID4gaW5kZXg7IGluZGV4ICs9IGkpaWYoaW5kZXggaW4gTyl7XG4gICAgICBtZW1vID0gY2FsbGJhY2tmbihtZW1vLCBPW2luZGV4XSwgaW5kZXgsIHRoaXMpO1xuICAgIH1cbiAgICByZXR1cm4gbWVtbztcbiAgfTtcbn07XG5cbnZhciBtZXRob2RpemUgPSBmdW5jdGlvbigkZm4pe1xuICByZXR1cm4gZnVuY3Rpb24oYXJnMS8qLCBhcmcyID0gdW5kZWZpbmVkICovKXtcbiAgICByZXR1cm4gJGZuKHRoaXMsIGFyZzEsIGFyZ3VtZW50c1sxXSk7XG4gIH07XG59O1xuXG4kZXhwb3J0KCRleHBvcnQuUCwgJ0FycmF5Jywge1xuICAvLyAyMi4xLjMuMTAgLyAxNS40LjQuMTggQXJyYXkucHJvdG90eXBlLmZvckVhY2goY2FsbGJhY2tmbiBbLCB0aGlzQXJnXSlcbiAgZm9yRWFjaDogJC5lYWNoID0gJC5lYWNoIHx8IG1ldGhvZGl6ZShjcmVhdGVBcnJheU1ldGhvZCgwKSksXG4gIC8vIDIyLjEuMy4xNSAvIDE1LjQuNC4xOSBBcnJheS5wcm90b3R5cGUubWFwKGNhbGxiYWNrZm4gWywgdGhpc0FyZ10pXG4gIG1hcDogbWV0aG9kaXplKGNyZWF0ZUFycmF5TWV0aG9kKDEpKSxcbiAgLy8gMjIuMS4zLjcgLyAxNS40LjQuMjAgQXJyYXkucHJvdG90eXBlLmZpbHRlcihjYWxsYmFja2ZuIFssIHRoaXNBcmddKVxuICBmaWx0ZXI6IG1ldGhvZGl6ZShjcmVhdGVBcnJheU1ldGhvZCgyKSksXG4gIC8vIDIyLjEuMy4yMyAvIDE1LjQuNC4xNyBBcnJheS5wcm90b3R5cGUuc29tZShjYWxsYmFja2ZuIFssIHRoaXNBcmddKVxuICBzb21lOiBtZXRob2RpemUoY3JlYXRlQXJyYXlNZXRob2QoMykpLFxuICAvLyAyMi4xLjMuNSAvIDE1LjQuNC4xNiBBcnJheS5wcm90b3R5cGUuZXZlcnkoY2FsbGJhY2tmbiBbLCB0aGlzQXJnXSlcbiAgZXZlcnk6IG1ldGhvZGl6ZShjcmVhdGVBcnJheU1ldGhvZCg0KSksXG4gIC8vIDIyLjEuMy4xOCAvIDE1LjQuNC4yMSBBcnJheS5wcm90b3R5cGUucmVkdWNlKGNhbGxiYWNrZm4gWywgaW5pdGlhbFZhbHVlXSlcbiAgcmVkdWNlOiBjcmVhdGVBcnJheVJlZHVjZShmYWxzZSksXG4gIC8vIDIyLjEuMy4xOSAvIDE1LjQuNC4yMiBBcnJheS5wcm90b3R5cGUucmVkdWNlUmlnaHQoY2FsbGJhY2tmbiBbLCBpbml0aWFsVmFsdWVdKVxuICByZWR1Y2VSaWdodDogY3JlYXRlQXJyYXlSZWR1Y2UodHJ1ZSksXG4gIC8vIDIyLjEuMy4xMSAvIDE1LjQuNC4xNCBBcnJheS5wcm90b3R5cGUuaW5kZXhPZihzZWFyY2hFbGVtZW50IFssIGZyb21JbmRleF0pXG4gIGluZGV4T2Y6IG1ldGhvZGl6ZShhcnJheUluZGV4T2YpLFxuICAvLyAyMi4xLjMuMTQgLyAxNS40LjQuMTUgQXJyYXkucHJvdG90eXBlLmxhc3RJbmRleE9mKHNlYXJjaEVsZW1lbnQgWywgZnJvbUluZGV4XSlcbiAgbGFzdEluZGV4T2Y6IGZ1bmN0aW9uKGVsLCBmcm9tSW5kZXggLyogPSBAWyotMV0gKi8pe1xuICAgIHZhciBPICAgICAgPSB0b0lPYmplY3QodGhpcylcbiAgICAgICwgbGVuZ3RoID0gdG9MZW5ndGgoTy5sZW5ndGgpXG4gICAgICAsIGluZGV4ICA9IGxlbmd0aCAtIDE7XG4gICAgaWYoYXJndW1lbnRzLmxlbmd0aCA+IDEpaW5kZXggPSBNYXRoLm1pbihpbmRleCwgdG9JbnRlZ2VyKGZyb21JbmRleCkpO1xuICAgIGlmKGluZGV4IDwgMClpbmRleCA9IHRvTGVuZ3RoKGxlbmd0aCArIGluZGV4KTtcbiAgICBmb3IoO2luZGV4ID49IDA7IGluZGV4LS0paWYoaW5kZXggaW4gTylpZihPW2luZGV4XSA9PT0gZWwpcmV0dXJuIGluZGV4O1xuICAgIHJldHVybiAtMTtcbiAgfVxufSk7XG5cbi8vIDIwLjMuMy4xIC8gMTUuOS40LjQgRGF0ZS5ub3coKVxuJGV4cG9ydCgkZXhwb3J0LlMsICdEYXRlJywge25vdzogZnVuY3Rpb24oKXsgcmV0dXJuICtuZXcgRGF0ZTsgfX0pO1xuXG52YXIgbHogPSBmdW5jdGlvbihudW0pe1xuICByZXR1cm4gbnVtID4gOSA/IG51bSA6ICcwJyArIG51bTtcbn07XG5cbi8vIDIwLjMuNC4zNiAvIDE1LjkuNS40MyBEYXRlLnByb3RvdHlwZS50b0lTT1N0cmluZygpXG4vLyBQaGFudG9tSlMgLyBvbGQgV2ViS2l0IGhhcyBhIGJyb2tlbiBpbXBsZW1lbnRhdGlvbnNcbiRleHBvcnQoJGV4cG9ydC5QICsgJGV4cG9ydC5GICogKGZhaWxzKGZ1bmN0aW9uKCl7XG4gIHJldHVybiBuZXcgRGF0ZSgtNWUxMyAtIDEpLnRvSVNPU3RyaW5nKCkgIT0gJzAzODUtMDctMjVUMDc6MDY6MzkuOTk5Wic7XG59KSB8fCAhZmFpbHMoZnVuY3Rpb24oKXtcbiAgbmV3IERhdGUoTmFOKS50b0lTT1N0cmluZygpO1xufSkpLCAnRGF0ZScsIHtcbiAgdG9JU09TdHJpbmc6IGZ1bmN0aW9uIHRvSVNPU3RyaW5nKCl7XG4gICAgaWYoIWlzRmluaXRlKHRoaXMpKXRocm93IFJhbmdlRXJyb3IoJ0ludmFsaWQgdGltZSB2YWx1ZScpO1xuICAgIHZhciBkID0gdGhpc1xuICAgICAgLCB5ID0gZC5nZXRVVENGdWxsWWVhcigpXG4gICAgICAsIG0gPSBkLmdldFVUQ01pbGxpc2Vjb25kcygpXG4gICAgICAsIHMgPSB5IDwgMCA/ICctJyA6IHkgPiA5OTk5ID8gJysnIDogJyc7XG4gICAgcmV0dXJuIHMgKyAoJzAwMDAwJyArIE1hdGguYWJzKHkpKS5zbGljZShzID8gLTYgOiAtNCkgK1xuICAgICAgJy0nICsgbHooZC5nZXRVVENNb250aCgpICsgMSkgKyAnLScgKyBseihkLmdldFVUQ0RhdGUoKSkgK1xuICAgICAgJ1QnICsgbHooZC5nZXRVVENIb3VycygpKSArICc6JyArIGx6KGQuZ2V0VVRDTWludXRlcygpKSArXG4gICAgICAnOicgKyBseihkLmdldFVUQ1NlY29uZHMoKSkgKyAnLicgKyAobSA+IDk5ID8gbSA6ICcwJyArIGx6KG0pKSArICdaJztcbiAgfVxufSk7XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vY29yZS1qcy9tb2R1bGVzL2VzNS5qc1xuICoqIG1vZHVsZSBpZCA9IDIxNFxuICoqIG1vZHVsZSBjaHVua3MgPSAyNFxuICoqLyJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");

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

	eval("var $Object = Object;\nmodule.exports = {\n  create:     $Object.create,\n  getProto:   $Object.getPrototypeOf,\n  isEnum:     {}.propertyIsEnumerable,\n  getDesc:    $Object.getOwnPropertyDescriptor,\n  setDesc:    $Object.defineProperty,\n  setDescs:   $Object.defineProperties,\n  getKeys:    $Object.keys,\n  getNames:   $Object.getOwnPropertyNames,\n  getSymbols: $Object.getOwnPropertySymbols,\n  each:       [].forEach\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjE1LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvJC5qcz81M2VjIl0sInNvdXJjZXNDb250ZW50IjpbInZhciAkT2JqZWN0ID0gT2JqZWN0O1xubW9kdWxlLmV4cG9ydHMgPSB7XG4gIGNyZWF0ZTogICAgICRPYmplY3QuY3JlYXRlLFxuICBnZXRQcm90bzogICAkT2JqZWN0LmdldFByb3RvdHlwZU9mLFxuICBpc0VudW06ICAgICB7fS5wcm9wZXJ0eUlzRW51bWVyYWJsZSxcbiAgZ2V0RGVzYzogICAgJE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IsXG4gIHNldERlc2M6ICAgICRPYmplY3QuZGVmaW5lUHJvcGVydHksXG4gIHNldERlc2NzOiAgICRPYmplY3QuZGVmaW5lUHJvcGVydGllcyxcbiAgZ2V0S2V5czogICAgJE9iamVjdC5rZXlzLFxuICBnZXROYW1lczogICAkT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMsXG4gIGdldFN5bWJvbHM6ICRPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzLFxuICBlYWNoOiAgICAgICBbXS5mb3JFYWNoXG59O1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2NvcmUtanMvbW9kdWxlcy8kLmpzXG4gKiogbW9kdWxlIGlkID0gMjE1XG4gKiogbW9kdWxlIGNodW5rcyA9IDI0XG4gKiovIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");

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

	eval("var global    = __webpack_require__(217)\n  , core      = __webpack_require__(218)\n  , hide      = __webpack_require__(219)\n  , redefine  = __webpack_require__(223)\n  , ctx       = __webpack_require__(225)\n  , PROTOTYPE = 'prototype';\n\nvar $export = function(type, name, source){\n  var IS_FORCED = type & $export.F\n    , IS_GLOBAL = type & $export.G\n    , IS_STATIC = type & $export.S\n    , IS_PROTO  = type & $export.P\n    , IS_BIND   = type & $export.B\n    , target    = IS_GLOBAL ? global : IS_STATIC ? global[name] || (global[name] = {}) : (global[name] || {})[PROTOTYPE]\n    , exports   = IS_GLOBAL ? core : core[name] || (core[name] = {})\n    , expProto  = exports[PROTOTYPE] || (exports[PROTOTYPE] = {})\n    , key, own, out, exp;\n  if(IS_GLOBAL)source = name;\n  for(key in source){\n    // contains in native\n    own = !IS_FORCED && target && key in target;\n    // export native or passed\n    out = (own ? target : source)[key];\n    // bind timers to global for call from export context\n    exp = IS_BIND && own ? ctx(out, global) : IS_PROTO && typeof out == 'function' ? ctx(Function.call, out) : out;\n    // extend global\n    if(target && !own)redefine(target, key, out);\n    // export\n    if(exports[key] != out)hide(exports, key, exp);\n    if(IS_PROTO && expProto[key] != out)expProto[key] = out;\n  }\n};\nglobal.core = core;\n// type bitmap\n$export.F = 1;  // forced\n$export.G = 2;  // global\n$export.S = 4;  // static\n$export.P = 8;  // proto\n$export.B = 16; // bind\n$export.W = 32; // wrap\nmodule.exports = $export;\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjE2LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvJC5leHBvcnQuanM/M2JkMiJdLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgZ2xvYmFsICAgID0gcmVxdWlyZSgnLi8kLmdsb2JhbCcpXG4gICwgY29yZSAgICAgID0gcmVxdWlyZSgnLi8kLmNvcmUnKVxuICAsIGhpZGUgICAgICA9IHJlcXVpcmUoJy4vJC5oaWRlJylcbiAgLCByZWRlZmluZSAgPSByZXF1aXJlKCcuLyQucmVkZWZpbmUnKVxuICAsIGN0eCAgICAgICA9IHJlcXVpcmUoJy4vJC5jdHgnKVxuICAsIFBST1RPVFlQRSA9ICdwcm90b3R5cGUnO1xuXG52YXIgJGV4cG9ydCA9IGZ1bmN0aW9uKHR5cGUsIG5hbWUsIHNvdXJjZSl7XG4gIHZhciBJU19GT1JDRUQgPSB0eXBlICYgJGV4cG9ydC5GXG4gICAgLCBJU19HTE9CQUwgPSB0eXBlICYgJGV4cG9ydC5HXG4gICAgLCBJU19TVEFUSUMgPSB0eXBlICYgJGV4cG9ydC5TXG4gICAgLCBJU19QUk9UTyAgPSB0eXBlICYgJGV4cG9ydC5QXG4gICAgLCBJU19CSU5EICAgPSB0eXBlICYgJGV4cG9ydC5CXG4gICAgLCB0YXJnZXQgICAgPSBJU19HTE9CQUwgPyBnbG9iYWwgOiBJU19TVEFUSUMgPyBnbG9iYWxbbmFtZV0gfHwgKGdsb2JhbFtuYW1lXSA9IHt9KSA6IChnbG9iYWxbbmFtZV0gfHwge30pW1BST1RPVFlQRV1cbiAgICAsIGV4cG9ydHMgICA9IElTX0dMT0JBTCA/IGNvcmUgOiBjb3JlW25hbWVdIHx8IChjb3JlW25hbWVdID0ge30pXG4gICAgLCBleHBQcm90byAgPSBleHBvcnRzW1BST1RPVFlQRV0gfHwgKGV4cG9ydHNbUFJPVE9UWVBFXSA9IHt9KVxuICAgICwga2V5LCBvd24sIG91dCwgZXhwO1xuICBpZihJU19HTE9CQUwpc291cmNlID0gbmFtZTtcbiAgZm9yKGtleSBpbiBzb3VyY2Upe1xuICAgIC8vIGNvbnRhaW5zIGluIG5hdGl2ZVxuICAgIG93biA9ICFJU19GT1JDRUQgJiYgdGFyZ2V0ICYmIGtleSBpbiB0YXJnZXQ7XG4gICAgLy8gZXhwb3J0IG5hdGl2ZSBvciBwYXNzZWRcbiAgICBvdXQgPSAob3duID8gdGFyZ2V0IDogc291cmNlKVtrZXldO1xuICAgIC8vIGJpbmQgdGltZXJzIHRvIGdsb2JhbCBmb3IgY2FsbCBmcm9tIGV4cG9ydCBjb250ZXh0XG4gICAgZXhwID0gSVNfQklORCAmJiBvd24gPyBjdHgob3V0LCBnbG9iYWwpIDogSVNfUFJPVE8gJiYgdHlwZW9mIG91dCA9PSAnZnVuY3Rpb24nID8gY3R4KEZ1bmN0aW9uLmNhbGwsIG91dCkgOiBvdXQ7XG4gICAgLy8gZXh0ZW5kIGdsb2JhbFxuICAgIGlmKHRhcmdldCAmJiAhb3duKXJlZGVmaW5lKHRhcmdldCwga2V5LCBvdXQpO1xuICAgIC8vIGV4cG9ydFxuICAgIGlmKGV4cG9ydHNba2V5XSAhPSBvdXQpaGlkZShleHBvcnRzLCBrZXksIGV4cCk7XG4gICAgaWYoSVNfUFJPVE8gJiYgZXhwUHJvdG9ba2V5XSAhPSBvdXQpZXhwUHJvdG9ba2V5XSA9IG91dDtcbiAgfVxufTtcbmdsb2JhbC5jb3JlID0gY29yZTtcbi8vIHR5cGUgYml0bWFwXG4kZXhwb3J0LkYgPSAxOyAgLy8gZm9yY2VkXG4kZXhwb3J0LkcgPSAyOyAgLy8gZ2xvYmFsXG4kZXhwb3J0LlMgPSA0OyAgLy8gc3RhdGljXG4kZXhwb3J0LlAgPSA4OyAgLy8gcHJvdG9cbiRleHBvcnQuQiA9IDE2OyAvLyBiaW5kXG4kZXhwb3J0LlcgPSAzMjsgLy8gd3JhcFxubW9kdWxlLmV4cG9ydHMgPSAkZXhwb3J0O1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2NvcmUtanMvbW9kdWxlcy8kLmV4cG9ydC5qc1xuICoqIG1vZHVsZSBpZCA9IDIxNlxuICoqIG1vZHVsZSBjaHVua3MgPSAyNFxuICoqLyJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");

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

	eval("// https://github.com/zloirock/core-js/issues/86#issuecomment-115759028\nvar global = module.exports = typeof window != 'undefined' && window.Math == Math\n  ? window : typeof self != 'undefined' && self.Math == Math ? self : Function('return this')();\nif(typeof __g == 'number')__g = global; // eslint-disable-line no-undef\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjE3LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvJC5nbG9iYWwuanM/YjcwYyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBodHRwczovL2dpdGh1Yi5jb20vemxvaXJvY2svY29yZS1qcy9pc3N1ZXMvODYjaXNzdWVjb21tZW50LTExNTc1OTAyOFxudmFyIGdsb2JhbCA9IG1vZHVsZS5leHBvcnRzID0gdHlwZW9mIHdpbmRvdyAhPSAndW5kZWZpbmVkJyAmJiB3aW5kb3cuTWF0aCA9PSBNYXRoXG4gID8gd2luZG93IDogdHlwZW9mIHNlbGYgIT0gJ3VuZGVmaW5lZCcgJiYgc2VsZi5NYXRoID09IE1hdGggPyBzZWxmIDogRnVuY3Rpb24oJ3JldHVybiB0aGlzJykoKTtcbmlmKHR5cGVvZiBfX2cgPT0gJ251bWJlcicpX19nID0gZ2xvYmFsOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVuZGVmXG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vY29yZS1qcy9tb2R1bGVzLyQuZ2xvYmFsLmpzXG4gKiogbW9kdWxlIGlkID0gMjE3XG4gKiogbW9kdWxlIGNodW5rcyA9IDI0XG4gKiovIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");

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

	eval("var core = module.exports = {version: '1.2.6'};\nif(typeof __e == 'number')__e = core; // eslint-disable-line no-undef\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjE4LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvJC5jb3JlLmpzP2RjYWIiXSwic291cmNlc0NvbnRlbnQiOlsidmFyIGNvcmUgPSBtb2R1bGUuZXhwb3J0cyA9IHt2ZXJzaW9uOiAnMS4yLjYnfTtcbmlmKHR5cGVvZiBfX2UgPT0gJ251bWJlcicpX19lID0gY29yZTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bmRlZlxuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2NvcmUtanMvbW9kdWxlcy8kLmNvcmUuanNcbiAqKiBtb2R1bGUgaWQgPSAyMThcbiAqKiBtb2R1bGUgY2h1bmtzID0gMjRcbiAqKi8iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=");

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

	eval("var $          = __webpack_require__(215)\n  , createDesc = __webpack_require__(220);\nmodule.exports = __webpack_require__(221) ? function(object, key, value){\n  return $.setDesc(object, key, createDesc(1, value));\n} : function(object, key, value){\n  object[key] = value;\n  return object;\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjE5LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvJC5oaWRlLmpzPzUzOTAiXSwic291cmNlc0NvbnRlbnQiOlsidmFyICQgICAgICAgICAgPSByZXF1aXJlKCcuLyQnKVxuICAsIGNyZWF0ZURlc2MgPSByZXF1aXJlKCcuLyQucHJvcGVydHktZGVzYycpO1xubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuLyQuZGVzY3JpcHRvcnMnKSA/IGZ1bmN0aW9uKG9iamVjdCwga2V5LCB2YWx1ZSl7XG4gIHJldHVybiAkLnNldERlc2Mob2JqZWN0LCBrZXksIGNyZWF0ZURlc2MoMSwgdmFsdWUpKTtcbn0gOiBmdW5jdGlvbihvYmplY3QsIGtleSwgdmFsdWUpe1xuICBvYmplY3Rba2V5XSA9IHZhbHVlO1xuICByZXR1cm4gb2JqZWN0O1xufTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9jb3JlLWpzL21vZHVsZXMvJC5oaWRlLmpzXG4gKiogbW9kdWxlIGlkID0gMjE5XG4gKiogbW9kdWxlIGNodW5rcyA9IDI0XG4gKiovIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");

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

	eval("module.exports = function(bitmap, value){\n  return {\n    enumerable  : !(bitmap & 1),\n    configurable: !(bitmap & 2),\n    writable    : !(bitmap & 4),\n    value       : value\n  };\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjIwLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvJC5wcm9wZXJ0eS1kZXNjLmpzP2Q2YWEiXSwic291cmNlc0NvbnRlbnQiOlsibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihiaXRtYXAsIHZhbHVlKXtcbiAgcmV0dXJuIHtcbiAgICBlbnVtZXJhYmxlICA6ICEoYml0bWFwICYgMSksXG4gICAgY29uZmlndXJhYmxlOiAhKGJpdG1hcCAmIDIpLFxuICAgIHdyaXRhYmxlICAgIDogIShiaXRtYXAgJiA0KSxcbiAgICB2YWx1ZSAgICAgICA6IHZhbHVlXG4gIH07XG59O1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2NvcmUtanMvbW9kdWxlcy8kLnByb3BlcnR5LWRlc2MuanNcbiAqKiBtb2R1bGUgaWQgPSAyMjBcbiAqKiBtb2R1bGUgY2h1bmtzID0gMjRcbiAqKi8iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=");

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

	eval("// Thank's IE8 for his funny defineProperty\nmodule.exports = !__webpack_require__(222)(function(){\n  return Object.defineProperty({}, 'a', {get: function(){ return 7; }}).a != 7;\n});\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjIxLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvJC5kZXNjcmlwdG9ycy5qcz83ODZjIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIFRoYW5rJ3MgSUU4IGZvciBoaXMgZnVubnkgZGVmaW5lUHJvcGVydHlcbm1vZHVsZS5leHBvcnRzID0gIXJlcXVpcmUoJy4vJC5mYWlscycpKGZ1bmN0aW9uKCl7XG4gIHJldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydHkoe30sICdhJywge2dldDogZnVuY3Rpb24oKXsgcmV0dXJuIDc7IH19KS5hICE9IDc7XG59KTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9jb3JlLWpzL21vZHVsZXMvJC5kZXNjcmlwdG9ycy5qc1xuICoqIG1vZHVsZSBpZCA9IDIyMVxuICoqIG1vZHVsZSBjaHVua3MgPSAyNFxuICoqLyJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=");

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

	eval("module.exports = function(exec){\n  try {\n    return !!exec();\n  } catch(e){\n    return true;\n  }\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjIyLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvJC5mYWlscy5qcz9kYjY0Il0sInNvdXJjZXNDb250ZW50IjpbIm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oZXhlYyl7XG4gIHRyeSB7XG4gICAgcmV0dXJuICEhZXhlYygpO1xuICB9IGNhdGNoKGUpe1xuICAgIHJldHVybiB0cnVlO1xuICB9XG59O1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2NvcmUtanMvbW9kdWxlcy8kLmZhaWxzLmpzXG4gKiogbW9kdWxlIGlkID0gMjIyXG4gKiogbW9kdWxlIGNodW5rcyA9IDI0XG4gKiovIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");

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

	eval("// add fake Function#toString\n// for correct work wrapped methods / constructors with methods like LoDash isNative\nvar global    = __webpack_require__(217)\n  , hide      = __webpack_require__(219)\n  , SRC       = __webpack_require__(224)('src')\n  , TO_STRING = 'toString'\n  , $toString = Function[TO_STRING]\n  , TPL       = ('' + $toString).split(TO_STRING);\n\n__webpack_require__(218).inspectSource = function(it){\n  return $toString.call(it);\n};\n\n(module.exports = function(O, key, val, safe){\n  if(typeof val == 'function'){\n    val.hasOwnProperty(SRC) || hide(val, SRC, O[key] ? '' + O[key] : TPL.join(String(key)));\n    val.hasOwnProperty('name') || hide(val, 'name', key);\n  }\n  if(O === global){\n    O[key] = val;\n  } else {\n    if(!safe)delete O[key];\n    hide(O, key, val);\n  }\n})(Function.prototype, TO_STRING, function toString(){\n  return typeof this == 'function' && this[SRC] || $toString.call(this);\n});\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjIzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvJC5yZWRlZmluZS5qcz84MTQ5Il0sInNvdXJjZXNDb250ZW50IjpbIi8vIGFkZCBmYWtlIEZ1bmN0aW9uI3RvU3RyaW5nXG4vLyBmb3IgY29ycmVjdCB3b3JrIHdyYXBwZWQgbWV0aG9kcyAvIGNvbnN0cnVjdG9ycyB3aXRoIG1ldGhvZHMgbGlrZSBMb0Rhc2ggaXNOYXRpdmVcbnZhciBnbG9iYWwgICAgPSByZXF1aXJlKCcuLyQuZ2xvYmFsJylcbiAgLCBoaWRlICAgICAgPSByZXF1aXJlKCcuLyQuaGlkZScpXG4gICwgU1JDICAgICAgID0gcmVxdWlyZSgnLi8kLnVpZCcpKCdzcmMnKVxuICAsIFRPX1NUUklORyA9ICd0b1N0cmluZydcbiAgLCAkdG9TdHJpbmcgPSBGdW5jdGlvbltUT19TVFJJTkddXG4gICwgVFBMICAgICAgID0gKCcnICsgJHRvU3RyaW5nKS5zcGxpdChUT19TVFJJTkcpO1xuXG5yZXF1aXJlKCcuLyQuY29yZScpLmluc3BlY3RTb3VyY2UgPSBmdW5jdGlvbihpdCl7XG4gIHJldHVybiAkdG9TdHJpbmcuY2FsbChpdCk7XG59O1xuXG4obW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihPLCBrZXksIHZhbCwgc2FmZSl7XG4gIGlmKHR5cGVvZiB2YWwgPT0gJ2Z1bmN0aW9uJyl7XG4gICAgdmFsLmhhc093blByb3BlcnR5KFNSQykgfHwgaGlkZSh2YWwsIFNSQywgT1trZXldID8gJycgKyBPW2tleV0gOiBUUEwuam9pbihTdHJpbmcoa2V5KSkpO1xuICAgIHZhbC5oYXNPd25Qcm9wZXJ0eSgnbmFtZScpIHx8IGhpZGUodmFsLCAnbmFtZScsIGtleSk7XG4gIH1cbiAgaWYoTyA9PT0gZ2xvYmFsKXtcbiAgICBPW2tleV0gPSB2YWw7XG4gIH0gZWxzZSB7XG4gICAgaWYoIXNhZmUpZGVsZXRlIE9ba2V5XTtcbiAgICBoaWRlKE8sIGtleSwgdmFsKTtcbiAgfVxufSkoRnVuY3Rpb24ucHJvdG90eXBlLCBUT19TVFJJTkcsIGZ1bmN0aW9uIHRvU3RyaW5nKCl7XG4gIHJldHVybiB0eXBlb2YgdGhpcyA9PSAnZnVuY3Rpb24nICYmIHRoaXNbU1JDXSB8fCAkdG9TdHJpbmcuY2FsbCh0aGlzKTtcbn0pO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2NvcmUtanMvbW9kdWxlcy8kLnJlZGVmaW5lLmpzXG4gKiogbW9kdWxlIGlkID0gMjIzXG4gKiogbW9kdWxlIGNodW5rcyA9IDI0XG4gKiovIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=");

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

	eval("var id = 0\n  , px = Math.random();\nmodule.exports = function(key){\n  return 'Symbol('.concat(key === undefined ? '' : key, ')_', (++id + px).toString(36));\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjI0LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvJC51aWQuanM/MzIzOCJdLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgaWQgPSAwXG4gICwgcHggPSBNYXRoLnJhbmRvbSgpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihrZXkpe1xuICByZXR1cm4gJ1N5bWJvbCgnLmNvbmNhdChrZXkgPT09IHVuZGVmaW5lZCA/ICcnIDoga2V5LCAnKV8nLCAoKytpZCArIHB4KS50b1N0cmluZygzNikpO1xufTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9jb3JlLWpzL21vZHVsZXMvJC51aWQuanNcbiAqKiBtb2R1bGUgaWQgPSAyMjRcbiAqKiBtb2R1bGUgY2h1bmtzID0gMjRcbiAqKi8iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=");

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

	eval("// optional / simple context binding\nvar aFunction = __webpack_require__(226);\nmodule.exports = function(fn, that, length){\n  aFunction(fn);\n  if(that === undefined)return fn;\n  switch(length){\n    case 1: return function(a){\n      return fn.call(that, a);\n    };\n    case 2: return function(a, b){\n      return fn.call(that, a, b);\n    };\n    case 3: return function(a, b, c){\n      return fn.call(that, a, b, c);\n    };\n  }\n  return function(/* ...args */){\n    return fn.apply(that, arguments);\n  };\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjI1LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvJC5jdHguanM/NmFhNiJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBvcHRpb25hbCAvIHNpbXBsZSBjb250ZXh0IGJpbmRpbmdcbnZhciBhRnVuY3Rpb24gPSByZXF1aXJlKCcuLyQuYS1mdW5jdGlvbicpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihmbiwgdGhhdCwgbGVuZ3RoKXtcbiAgYUZ1bmN0aW9uKGZuKTtcbiAgaWYodGhhdCA9PT0gdW5kZWZpbmVkKXJldHVybiBmbjtcbiAgc3dpdGNoKGxlbmd0aCl7XG4gICAgY2FzZSAxOiByZXR1cm4gZnVuY3Rpb24oYSl7XG4gICAgICByZXR1cm4gZm4uY2FsbCh0aGF0LCBhKTtcbiAgICB9O1xuICAgIGNhc2UgMjogcmV0dXJuIGZ1bmN0aW9uKGEsIGIpe1xuICAgICAgcmV0dXJuIGZuLmNhbGwodGhhdCwgYSwgYik7XG4gICAgfTtcbiAgICBjYXNlIDM6IHJldHVybiBmdW5jdGlvbihhLCBiLCBjKXtcbiAgICAgIHJldHVybiBmbi5jYWxsKHRoYXQsIGEsIGIsIGMpO1xuICAgIH07XG4gIH1cbiAgcmV0dXJuIGZ1bmN0aW9uKC8qIC4uLmFyZ3MgKi8pe1xuICAgIHJldHVybiBmbi5hcHBseSh0aGF0LCBhcmd1bWVudHMpO1xuICB9O1xufTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9jb3JlLWpzL21vZHVsZXMvJC5jdHguanNcbiAqKiBtb2R1bGUgaWQgPSAyMjVcbiAqKiBtb2R1bGUgY2h1bmtzID0gMjRcbiAqKi8iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=");

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

	eval("module.exports = function(it){\n  if(typeof it != 'function')throw TypeError(it + ' is not a function!');\n  return it;\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjI2LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvJC5hLWZ1bmN0aW9uLmpzPzU3NjciXSwic291cmNlc0NvbnRlbnQiOlsibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihpdCl7XG4gIGlmKHR5cGVvZiBpdCAhPSAnZnVuY3Rpb24nKXRocm93IFR5cGVFcnJvcihpdCArICcgaXMgbm90IGEgZnVuY3Rpb24hJyk7XG4gIHJldHVybiBpdDtcbn07XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vY29yZS1qcy9tb2R1bGVzLyQuYS1mdW5jdGlvbi5qc1xuICoqIG1vZHVsZSBpZCA9IDIyNlxuICoqIG1vZHVsZSBjaHVua3MgPSAyNFxuICoqLyJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=");

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

	eval("module.exports = __webpack_require__(217).document && document.documentElement;\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjI3LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvJC5odG1sLmpzPzdmMWYiXSwic291cmNlc0NvbnRlbnQiOlsibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuLyQuZ2xvYmFsJykuZG9jdW1lbnQgJiYgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50O1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2NvcmUtanMvbW9kdWxlcy8kLmh0bWwuanNcbiAqKiBtb2R1bGUgaWQgPSAyMjdcbiAqKiBtb2R1bGUgY2h1bmtzID0gMjRcbiAqKi8iXSwibWFwcGluZ3MiOiJBQUFBIiwic291cmNlUm9vdCI6IiJ9");

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

	eval("var isObject = __webpack_require__(229)\n  , document = __webpack_require__(217).document\n  // in old IE typeof document.createElement is 'object'\n  , is = isObject(document) && isObject(document.createElement);\nmodule.exports = function(it){\n  return is ? document.createElement(it) : {};\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjI4LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvJC5kb20tY3JlYXRlLmpzPzM4NTkiXSwic291cmNlc0NvbnRlbnQiOlsidmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi8kLmlzLW9iamVjdCcpXG4gICwgZG9jdW1lbnQgPSByZXF1aXJlKCcuLyQuZ2xvYmFsJykuZG9jdW1lbnRcbiAgLy8gaW4gb2xkIElFIHR5cGVvZiBkb2N1bWVudC5jcmVhdGVFbGVtZW50IGlzICdvYmplY3QnXG4gICwgaXMgPSBpc09iamVjdChkb2N1bWVudCkgJiYgaXNPYmplY3QoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGl0KXtcbiAgcmV0dXJuIGlzID8gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChpdCkgOiB7fTtcbn07XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vY29yZS1qcy9tb2R1bGVzLyQuZG9tLWNyZWF0ZS5qc1xuICoqIG1vZHVsZSBpZCA9IDIyOFxuICoqIG1vZHVsZSBjaHVua3MgPSAyNFxuICoqLyJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=");

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

	eval("module.exports = function(it){\n  return typeof it === 'object' ? it !== null : typeof it === 'function';\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjI5LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvJC5pcy1vYmplY3QuanM/NDYyYyJdLCJzb3VyY2VzQ29udGVudCI6WyJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGl0KXtcbiAgcmV0dXJuIHR5cGVvZiBpdCA9PT0gJ29iamVjdCcgPyBpdCAhPT0gbnVsbCA6IHR5cGVvZiBpdCA9PT0gJ2Z1bmN0aW9uJztcbn07XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vY29yZS1qcy9tb2R1bGVzLyQuaXMtb2JqZWN0LmpzXG4gKiogbW9kdWxlIGlkID0gMjI5XG4gKiogbW9kdWxlIGNodW5rcyA9IDI0XG4gKiovIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=");

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

	eval("var hasOwnProperty = {}.hasOwnProperty;\nmodule.exports = function(it, key){\n  return hasOwnProperty.call(it, key);\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjMwLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvJC5oYXMuanM/N2JlMiJdLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgaGFzT3duUHJvcGVydHkgPSB7fS5oYXNPd25Qcm9wZXJ0eTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oaXQsIGtleSl7XG4gIHJldHVybiBoYXNPd25Qcm9wZXJ0eS5jYWxsKGl0LCBrZXkpO1xufTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9jb3JlLWpzL21vZHVsZXMvJC5oYXMuanNcbiAqKiBtb2R1bGUgaWQgPSAyMzBcbiAqKiBtb2R1bGUgY2h1bmtzID0gMjRcbiAqKi8iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");

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

	eval("var toString = {}.toString;\n\nmodule.exports = function(it){\n  return toString.call(it).slice(8, -1);\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjMxLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvJC5jb2YuanM/ZWIzZCJdLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgdG9TdHJpbmcgPSB7fS50b1N0cmluZztcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihpdCl7XG4gIHJldHVybiB0b1N0cmluZy5jYWxsKGl0KS5zbGljZSg4LCAtMSk7XG59O1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2NvcmUtanMvbW9kdWxlcy8kLmNvZi5qc1xuICoqIG1vZHVsZSBpZCA9IDIzMVxuICoqIG1vZHVsZSBjaHVua3MgPSAyNFxuICoqLyJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");

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

	eval("// fast apply, http://jsperf.lnkit.com/fast-apply/5\nmodule.exports = function(fn, args, that){\n  var un = that === undefined;\n  switch(args.length){\n    case 0: return un ? fn()\n                      : fn.call(that);\n    case 1: return un ? fn(args[0])\n                      : fn.call(that, args[0]);\n    case 2: return un ? fn(args[0], args[1])\n                      : fn.call(that, args[0], args[1]);\n    case 3: return un ? fn(args[0], args[1], args[2])\n                      : fn.call(that, args[0], args[1], args[2]);\n    case 4: return un ? fn(args[0], args[1], args[2], args[3])\n                      : fn.call(that, args[0], args[1], args[2], args[3]);\n  } return              fn.apply(that, args);\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjMyLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvJC5pbnZva2UuanM/NDU0NCJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBmYXN0IGFwcGx5LCBodHRwOi8vanNwZXJmLmxua2l0LmNvbS9mYXN0LWFwcGx5LzVcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oZm4sIGFyZ3MsIHRoYXQpe1xuICB2YXIgdW4gPSB0aGF0ID09PSB1bmRlZmluZWQ7XG4gIHN3aXRjaChhcmdzLmxlbmd0aCl7XG4gICAgY2FzZSAwOiByZXR1cm4gdW4gPyBmbigpXG4gICAgICAgICAgICAgICAgICAgICAgOiBmbi5jYWxsKHRoYXQpO1xuICAgIGNhc2UgMTogcmV0dXJuIHVuID8gZm4oYXJnc1swXSlcbiAgICAgICAgICAgICAgICAgICAgICA6IGZuLmNhbGwodGhhdCwgYXJnc1swXSk7XG4gICAgY2FzZSAyOiByZXR1cm4gdW4gPyBmbihhcmdzWzBdLCBhcmdzWzFdKVxuICAgICAgICAgICAgICAgICAgICAgIDogZm4uY2FsbCh0aGF0LCBhcmdzWzBdLCBhcmdzWzFdKTtcbiAgICBjYXNlIDM6IHJldHVybiB1biA/IGZuKGFyZ3NbMF0sIGFyZ3NbMV0sIGFyZ3NbMl0pXG4gICAgICAgICAgICAgICAgICAgICAgOiBmbi5jYWxsKHRoYXQsIGFyZ3NbMF0sIGFyZ3NbMV0sIGFyZ3NbMl0pO1xuICAgIGNhc2UgNDogcmV0dXJuIHVuID8gZm4oYXJnc1swXSwgYXJnc1sxXSwgYXJnc1syXSwgYXJnc1szXSlcbiAgICAgICAgICAgICAgICAgICAgICA6IGZuLmNhbGwodGhhdCwgYXJnc1swXSwgYXJnc1sxXSwgYXJnc1syXSwgYXJnc1szXSk7XG4gIH0gcmV0dXJuICAgICAgICAgICAgICBmbi5hcHBseSh0aGF0LCBhcmdzKTtcbn07XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vY29yZS1qcy9tb2R1bGVzLyQuaW52b2tlLmpzXG4gKiogbW9kdWxlIGlkID0gMjMyXG4gKiogbW9kdWxlIGNodW5rcyA9IDI0XG4gKiovIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");

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

	eval("var isObject = __webpack_require__(229);\nmodule.exports = function(it){\n  if(!isObject(it))throw TypeError(it + ' is not an object!');\n  return it;\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjMzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvJC5hbi1vYmplY3QuanM/NjYwNSJdLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuLyQuaXMtb2JqZWN0Jyk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGl0KXtcbiAgaWYoIWlzT2JqZWN0KGl0KSl0aHJvdyBUeXBlRXJyb3IoaXQgKyAnIGlzIG5vdCBhbiBvYmplY3QhJyk7XG4gIHJldHVybiBpdDtcbn07XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vY29yZS1qcy9tb2R1bGVzLyQuYW4tb2JqZWN0LmpzXG4gKiogbW9kdWxlIGlkID0gMjMzXG4gKiogbW9kdWxlIGNodW5rcyA9IDI0XG4gKiovIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");

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

	eval("// 7.1.13 ToObject(argument)\nvar defined = __webpack_require__(235);\nmodule.exports = function(it){\n  return Object(defined(it));\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjM0LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvJC50by1vYmplY3QuanM/MjU1OSJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyA3LjEuMTMgVG9PYmplY3QoYXJndW1lbnQpXG52YXIgZGVmaW5lZCA9IHJlcXVpcmUoJy4vJC5kZWZpbmVkJyk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGl0KXtcbiAgcmV0dXJuIE9iamVjdChkZWZpbmVkKGl0KSk7XG59O1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2NvcmUtanMvbW9kdWxlcy8kLnRvLW9iamVjdC5qc1xuICoqIG1vZHVsZSBpZCA9IDIzNFxuICoqIG1vZHVsZSBjaHVua3MgPSAyNFxuICoqLyJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");

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

	eval("// 7.2.1 RequireObjectCoercible(argument)\nmodule.exports = function(it){\n  if(it == undefined)throw TypeError(\"Can't call method on  \" + it);\n  return it;\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjM1LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvJC5kZWZpbmVkLmpzPzBiMGMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gNy4yLjEgUmVxdWlyZU9iamVjdENvZXJjaWJsZShhcmd1bWVudClcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oaXQpe1xuICBpZihpdCA9PSB1bmRlZmluZWQpdGhyb3cgVHlwZUVycm9yKFwiQ2FuJ3QgY2FsbCBtZXRob2Qgb24gIFwiICsgaXQpO1xuICByZXR1cm4gaXQ7XG59O1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2NvcmUtanMvbW9kdWxlcy8kLmRlZmluZWQuanNcbiAqKiBtb2R1bGUgaWQgPSAyMzVcbiAqKiBtb2R1bGUgY2h1bmtzID0gMjRcbiAqKi8iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=");

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

	eval("// to indexed object, toObject with fallback for non-array-like ES3 strings\nvar IObject = __webpack_require__(237)\n  , defined = __webpack_require__(235);\nmodule.exports = function(it){\n  return IObject(defined(it));\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjM2LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvJC50by1pb2JqZWN0LmpzP2FhMmMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gdG8gaW5kZXhlZCBvYmplY3QsIHRvT2JqZWN0IHdpdGggZmFsbGJhY2sgZm9yIG5vbi1hcnJheS1saWtlIEVTMyBzdHJpbmdzXG52YXIgSU9iamVjdCA9IHJlcXVpcmUoJy4vJC5pb2JqZWN0JylcbiAgLCBkZWZpbmVkID0gcmVxdWlyZSgnLi8kLmRlZmluZWQnKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oaXQpe1xuICByZXR1cm4gSU9iamVjdChkZWZpbmVkKGl0KSk7XG59O1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2NvcmUtanMvbW9kdWxlcy8kLnRvLWlvYmplY3QuanNcbiAqKiBtb2R1bGUgaWQgPSAyMzZcbiAqKiBtb2R1bGUgY2h1bmtzID0gMjRcbiAqKi8iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");

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

	eval("// fallback for non-array-like ES3 and non-enumerable old V8 strings\nvar cof = __webpack_require__(231);\nmodule.exports = Object('z').propertyIsEnumerable(0) ? Object : function(it){\n  return cof(it) == 'String' ? it.split('') : Object(it);\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjM3LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvJC5pb2JqZWN0LmpzP2NiOWUiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gZmFsbGJhY2sgZm9yIG5vbi1hcnJheS1saWtlIEVTMyBhbmQgbm9uLWVudW1lcmFibGUgb2xkIFY4IHN0cmluZ3NcbnZhciBjb2YgPSByZXF1aXJlKCcuLyQuY29mJyk7XG5tb2R1bGUuZXhwb3J0cyA9IE9iamVjdCgneicpLnByb3BlcnR5SXNFbnVtZXJhYmxlKDApID8gT2JqZWN0IDogZnVuY3Rpb24oaXQpe1xuICByZXR1cm4gY29mKGl0KSA9PSAnU3RyaW5nJyA/IGl0LnNwbGl0KCcnKSA6IE9iamVjdChpdCk7XG59O1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2NvcmUtanMvbW9kdWxlcy8kLmlvYmplY3QuanNcbiAqKiBtb2R1bGUgaWQgPSAyMzdcbiAqKiBtb2R1bGUgY2h1bmtzID0gMjRcbiAqKi8iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=");

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

	eval("// 7.1.4 ToInteger\nvar ceil  = Math.ceil\n  , floor = Math.floor;\nmodule.exports = function(it){\n  return isNaN(it = +it) ? 0 : (it > 0 ? floor : ceil)(it);\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjM4LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvJC50by1pbnRlZ2VyLmpzPzg5MDciXSwic291cmNlc0NvbnRlbnQiOlsiLy8gNy4xLjQgVG9JbnRlZ2VyXG52YXIgY2VpbCAgPSBNYXRoLmNlaWxcbiAgLCBmbG9vciA9IE1hdGguZmxvb3I7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGl0KXtcbiAgcmV0dXJuIGlzTmFOKGl0ID0gK2l0KSA/IDAgOiAoaXQgPiAwID8gZmxvb3IgOiBjZWlsKShpdCk7XG59O1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2NvcmUtanMvbW9kdWxlcy8kLnRvLWludGVnZXIuanNcbiAqKiBtb2R1bGUgaWQgPSAyMzhcbiAqKiBtb2R1bGUgY2h1bmtzID0gMjRcbiAqKi8iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");

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

	eval("var toInteger = __webpack_require__(238)\n  , max       = Math.max\n  , min       = Math.min;\nmodule.exports = function(index, length){\n  index = toInteger(index);\n  return index < 0 ? max(index + length, 0) : min(index, length);\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjM5LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvJC50by1pbmRleC5qcz80MDdkIl0sInNvdXJjZXNDb250ZW50IjpbInZhciB0b0ludGVnZXIgPSByZXF1aXJlKCcuLyQudG8taW50ZWdlcicpXG4gICwgbWF4ICAgICAgID0gTWF0aC5tYXhcbiAgLCBtaW4gICAgICAgPSBNYXRoLm1pbjtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oaW5kZXgsIGxlbmd0aCl7XG4gIGluZGV4ID0gdG9JbnRlZ2VyKGluZGV4KTtcbiAgcmV0dXJuIGluZGV4IDwgMCA/IG1heChpbmRleCArIGxlbmd0aCwgMCkgOiBtaW4oaW5kZXgsIGxlbmd0aCk7XG59O1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2NvcmUtanMvbW9kdWxlcy8kLnRvLWluZGV4LmpzXG4gKiogbW9kdWxlIGlkID0gMjM5XG4gKiogbW9kdWxlIGNodW5rcyA9IDI0XG4gKiovIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");

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

	eval("// 7.1.15 ToLength\nvar toInteger = __webpack_require__(238)\n  , min       = Math.min;\nmodule.exports = function(it){\n  return it > 0 ? min(toInteger(it), 0x1fffffffffffff) : 0; // pow(2, 53) - 1 == 9007199254740991\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjQwLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvJC50by1sZW5ndGguanM/N2NjYSJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyA3LjEuMTUgVG9MZW5ndGhcbnZhciB0b0ludGVnZXIgPSByZXF1aXJlKCcuLyQudG8taW50ZWdlcicpXG4gICwgbWluICAgICAgID0gTWF0aC5taW47XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGl0KXtcbiAgcmV0dXJuIGl0ID4gMCA/IG1pbih0b0ludGVnZXIoaXQpLCAweDFmZmZmZmZmZmZmZmZmKSA6IDA7IC8vIHBvdygyLCA1MykgLSAxID09IDkwMDcxOTkyNTQ3NDA5OTFcbn07XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vY29yZS1qcy9tb2R1bGVzLyQudG8tbGVuZ3RoLmpzXG4gKiogbW9kdWxlIGlkID0gMjQwXG4gKiogbW9kdWxlIGNodW5rcyA9IDI0XG4gKiovIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=");

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

	eval("// 0 -> Array#forEach\n// 1 -> Array#map\n// 2 -> Array#filter\n// 3 -> Array#some\n// 4 -> Array#every\n// 5 -> Array#find\n// 6 -> Array#findIndex\nvar ctx      = __webpack_require__(225)\n  , IObject  = __webpack_require__(237)\n  , toObject = __webpack_require__(234)\n  , toLength = __webpack_require__(240)\n  , asc      = __webpack_require__(242);\nmodule.exports = function(TYPE){\n  var IS_MAP        = TYPE == 1\n    , IS_FILTER     = TYPE == 2\n    , IS_SOME       = TYPE == 3\n    , IS_EVERY      = TYPE == 4\n    , IS_FIND_INDEX = TYPE == 6\n    , NO_HOLES      = TYPE == 5 || IS_FIND_INDEX;\n  return function($this, callbackfn, that){\n    var O      = toObject($this)\n      , self   = IObject(O)\n      , f      = ctx(callbackfn, that, 3)\n      , length = toLength(self.length)\n      , index  = 0\n      , result = IS_MAP ? asc($this, length) : IS_FILTER ? asc($this, 0) : undefined\n      , val, res;\n    for(;length > index; index++)if(NO_HOLES || index in self){\n      val = self[index];\n      res = f(val, index, O);\n      if(TYPE){\n        if(IS_MAP)result[index] = res;            // map\n        else if(res)switch(TYPE){\n          case 3: return true;                    // some\n          case 5: return val;                     // find\n          case 6: return index;                   // findIndex\n          case 2: result.push(val);               // filter\n        } else if(IS_EVERY)return false;          // every\n      }\n    }\n    return IS_FIND_INDEX ? -1 : IS_SOME || IS_EVERY ? IS_EVERY : result;\n  };\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjQxLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvJC5hcnJheS1tZXRob2RzLmpzPzcwYzEiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gMCAtPiBBcnJheSNmb3JFYWNoXG4vLyAxIC0+IEFycmF5I21hcFxuLy8gMiAtPiBBcnJheSNmaWx0ZXJcbi8vIDMgLT4gQXJyYXkjc29tZVxuLy8gNCAtPiBBcnJheSNldmVyeVxuLy8gNSAtPiBBcnJheSNmaW5kXG4vLyA2IC0+IEFycmF5I2ZpbmRJbmRleFxudmFyIGN0eCAgICAgID0gcmVxdWlyZSgnLi8kLmN0eCcpXG4gICwgSU9iamVjdCAgPSByZXF1aXJlKCcuLyQuaW9iamVjdCcpXG4gICwgdG9PYmplY3QgPSByZXF1aXJlKCcuLyQudG8tb2JqZWN0JylcbiAgLCB0b0xlbmd0aCA9IHJlcXVpcmUoJy4vJC50by1sZW5ndGgnKVxuICAsIGFzYyAgICAgID0gcmVxdWlyZSgnLi8kLmFycmF5LXNwZWNpZXMtY3JlYXRlJyk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKFRZUEUpe1xuICB2YXIgSVNfTUFQICAgICAgICA9IFRZUEUgPT0gMVxuICAgICwgSVNfRklMVEVSICAgICA9IFRZUEUgPT0gMlxuICAgICwgSVNfU09NRSAgICAgICA9IFRZUEUgPT0gM1xuICAgICwgSVNfRVZFUlkgICAgICA9IFRZUEUgPT0gNFxuICAgICwgSVNfRklORF9JTkRFWCA9IFRZUEUgPT0gNlxuICAgICwgTk9fSE9MRVMgICAgICA9IFRZUEUgPT0gNSB8fCBJU19GSU5EX0lOREVYO1xuICByZXR1cm4gZnVuY3Rpb24oJHRoaXMsIGNhbGxiYWNrZm4sIHRoYXQpe1xuICAgIHZhciBPICAgICAgPSB0b09iamVjdCgkdGhpcylcbiAgICAgICwgc2VsZiAgID0gSU9iamVjdChPKVxuICAgICAgLCBmICAgICAgPSBjdHgoY2FsbGJhY2tmbiwgdGhhdCwgMylcbiAgICAgICwgbGVuZ3RoID0gdG9MZW5ndGgoc2VsZi5sZW5ndGgpXG4gICAgICAsIGluZGV4ICA9IDBcbiAgICAgICwgcmVzdWx0ID0gSVNfTUFQID8gYXNjKCR0aGlzLCBsZW5ndGgpIDogSVNfRklMVEVSID8gYXNjKCR0aGlzLCAwKSA6IHVuZGVmaW5lZFxuICAgICAgLCB2YWwsIHJlcztcbiAgICBmb3IoO2xlbmd0aCA+IGluZGV4OyBpbmRleCsrKWlmKE5PX0hPTEVTIHx8IGluZGV4IGluIHNlbGYpe1xuICAgICAgdmFsID0gc2VsZltpbmRleF07XG4gICAgICByZXMgPSBmKHZhbCwgaW5kZXgsIE8pO1xuICAgICAgaWYoVFlQRSl7XG4gICAgICAgIGlmKElTX01BUClyZXN1bHRbaW5kZXhdID0gcmVzOyAgICAgICAgICAgIC8vIG1hcFxuICAgICAgICBlbHNlIGlmKHJlcylzd2l0Y2goVFlQRSl7XG4gICAgICAgICAgY2FzZSAzOiByZXR1cm4gdHJ1ZTsgICAgICAgICAgICAgICAgICAgIC8vIHNvbWVcbiAgICAgICAgICBjYXNlIDU6IHJldHVybiB2YWw7ICAgICAgICAgICAgICAgICAgICAgLy8gZmluZFxuICAgICAgICAgIGNhc2UgNjogcmV0dXJuIGluZGV4OyAgICAgICAgICAgICAgICAgICAvLyBmaW5kSW5kZXhcbiAgICAgICAgICBjYXNlIDI6IHJlc3VsdC5wdXNoKHZhbCk7ICAgICAgICAgICAgICAgLy8gZmlsdGVyXG4gICAgICAgIH0gZWxzZSBpZihJU19FVkVSWSlyZXR1cm4gZmFsc2U7ICAgICAgICAgIC8vIGV2ZXJ5XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBJU19GSU5EX0lOREVYID8gLTEgOiBJU19TT01FIHx8IElTX0VWRVJZID8gSVNfRVZFUlkgOiByZXN1bHQ7XG4gIH07XG59O1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2NvcmUtanMvbW9kdWxlcy8kLmFycmF5LW1ldGhvZHMuanNcbiAqKiBtb2R1bGUgaWQgPSAyNDFcbiAqKiBtb2R1bGUgY2h1bmtzID0gMjRcbiAqKi8iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");

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

	eval("// 9.4.2.3 ArraySpeciesCreate(originalArray, length)\nvar isObject = __webpack_require__(229)\n  , isArray  = __webpack_require__(243)\n  , SPECIES  = __webpack_require__(244)('species');\nmodule.exports = function(original, length){\n  var C;\n  if(isArray(original)){\n    C = original.constructor;\n    // cross-realm fallback\n    if(typeof C == 'function' && (C === Array || isArray(C.prototype)))C = undefined;\n    if(isObject(C)){\n      C = C[SPECIES];\n      if(C === null)C = undefined;\n    }\n  } return new (C === undefined ? Array : C)(length);\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjQyLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvJC5hcnJheS1zcGVjaWVzLWNyZWF0ZS5qcz84MjRkIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIDkuNC4yLjMgQXJyYXlTcGVjaWVzQ3JlYXRlKG9yaWdpbmFsQXJyYXksIGxlbmd0aClcbnZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4vJC5pcy1vYmplY3QnKVxuICAsIGlzQXJyYXkgID0gcmVxdWlyZSgnLi8kLmlzLWFycmF5JylcbiAgLCBTUEVDSUVTICA9IHJlcXVpcmUoJy4vJC53a3MnKSgnc3BlY2llcycpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihvcmlnaW5hbCwgbGVuZ3RoKXtcbiAgdmFyIEM7XG4gIGlmKGlzQXJyYXkob3JpZ2luYWwpKXtcbiAgICBDID0gb3JpZ2luYWwuY29uc3RydWN0b3I7XG4gICAgLy8gY3Jvc3MtcmVhbG0gZmFsbGJhY2tcbiAgICBpZih0eXBlb2YgQyA9PSAnZnVuY3Rpb24nICYmIChDID09PSBBcnJheSB8fCBpc0FycmF5KEMucHJvdG90eXBlKSkpQyA9IHVuZGVmaW5lZDtcbiAgICBpZihpc09iamVjdChDKSl7XG4gICAgICBDID0gQ1tTUEVDSUVTXTtcbiAgICAgIGlmKEMgPT09IG51bGwpQyA9IHVuZGVmaW5lZDtcbiAgICB9XG4gIH0gcmV0dXJuIG5ldyAoQyA9PT0gdW5kZWZpbmVkID8gQXJyYXkgOiBDKShsZW5ndGgpO1xufTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9jb3JlLWpzL21vZHVsZXMvJC5hcnJheS1zcGVjaWVzLWNyZWF0ZS5qc1xuICoqIG1vZHVsZSBpZCA9IDI0MlxuICoqIG1vZHVsZSBjaHVua3MgPSAyNFxuICoqLyJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=");

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

	eval("// 7.2.2 IsArray(argument)\nvar cof = __webpack_require__(231);\nmodule.exports = Array.isArray || function(arg){\n  return cof(arg) == 'Array';\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjQzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvJC5pcy1hcnJheS5qcz8wZmRiIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIDcuMi4yIElzQXJyYXkoYXJndW1lbnQpXG52YXIgY29mID0gcmVxdWlyZSgnLi8kLmNvZicpO1xubW9kdWxlLmV4cG9ydHMgPSBBcnJheS5pc0FycmF5IHx8IGZ1bmN0aW9uKGFyZyl7XG4gIHJldHVybiBjb2YoYXJnKSA9PSAnQXJyYXknO1xufTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9jb3JlLWpzL21vZHVsZXMvJC5pcy1hcnJheS5qc1xuICoqIG1vZHVsZSBpZCA9IDI0M1xuICoqIG1vZHVsZSBjaHVua3MgPSAyNFxuICoqLyJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");

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

	eval("var store  = __webpack_require__(245)('wks')\n  , uid    = __webpack_require__(224)\n  , Symbol = __webpack_require__(217).Symbol;\nmodule.exports = function(name){\n  return store[name] || (store[name] =\n    Symbol && Symbol[name] || (Symbol || uid)('Symbol.' + name));\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjQ0LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvJC53a3MuanM/YjlkYyJdLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgc3RvcmUgID0gcmVxdWlyZSgnLi8kLnNoYXJlZCcpKCd3a3MnKVxuICAsIHVpZCAgICA9IHJlcXVpcmUoJy4vJC51aWQnKVxuICAsIFN5bWJvbCA9IHJlcXVpcmUoJy4vJC5nbG9iYWwnKS5TeW1ib2w7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKG5hbWUpe1xuICByZXR1cm4gc3RvcmVbbmFtZV0gfHwgKHN0b3JlW25hbWVdID1cbiAgICBTeW1ib2wgJiYgU3ltYm9sW25hbWVdIHx8IChTeW1ib2wgfHwgdWlkKSgnU3ltYm9sLicgKyBuYW1lKSk7XG59O1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2NvcmUtanMvbW9kdWxlcy8kLndrcy5qc1xuICoqIG1vZHVsZSBpZCA9IDI0NFxuICoqIG1vZHVsZSBjaHVua3MgPSAyNFxuICoqLyJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=");

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

	eval("var global = __webpack_require__(217)\n  , SHARED = '__core-js_shared__'\n  , store  = global[SHARED] || (global[SHARED] = {});\nmodule.exports = function(key){\n  return store[key] || (store[key] = {});\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjQ1LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvJC5zaGFyZWQuanM/YmVlMCJdLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi8kLmdsb2JhbCcpXG4gICwgU0hBUkVEID0gJ19fY29yZS1qc19zaGFyZWRfXydcbiAgLCBzdG9yZSAgPSBnbG9iYWxbU0hBUkVEXSB8fCAoZ2xvYmFsW1NIQVJFRF0gPSB7fSk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGtleSl7XG4gIHJldHVybiBzdG9yZVtrZXldIHx8IChzdG9yZVtrZXldID0ge30pO1xufTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9jb3JlLWpzL21vZHVsZXMvJC5zaGFyZWQuanNcbiAqKiBtb2R1bGUgaWQgPSAyNDVcbiAqKiBtb2R1bGUgY2h1bmtzID0gMjRcbiAqKi8iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");

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

	eval("// false -> Array#indexOf\n// true  -> Array#includes\nvar toIObject = __webpack_require__(236)\n  , toLength  = __webpack_require__(240)\n  , toIndex   = __webpack_require__(239);\nmodule.exports = function(IS_INCLUDES){\n  return function($this, el, fromIndex){\n    var O      = toIObject($this)\n      , length = toLength(O.length)\n      , index  = toIndex(fromIndex, length)\n      , value;\n    // Array#includes uses SameValueZero equality algorithm\n    if(IS_INCLUDES && el != el)while(length > index){\n      value = O[index++];\n      if(value != value)return true;\n    // Array#toIndex ignores holes, Array#includes - not\n    } else for(;length > index; index++)if(IS_INCLUDES || index in O){\n      if(O[index] === el)return IS_INCLUDES || index;\n    } return !IS_INCLUDES && -1;\n  };\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjQ2LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvJC5hcnJheS1pbmNsdWRlcy5qcz9iNjhjIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIGZhbHNlIC0+IEFycmF5I2luZGV4T2Zcbi8vIHRydWUgIC0+IEFycmF5I2luY2x1ZGVzXG52YXIgdG9JT2JqZWN0ID0gcmVxdWlyZSgnLi8kLnRvLWlvYmplY3QnKVxuICAsIHRvTGVuZ3RoICA9IHJlcXVpcmUoJy4vJC50by1sZW5ndGgnKVxuICAsIHRvSW5kZXggICA9IHJlcXVpcmUoJy4vJC50by1pbmRleCcpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihJU19JTkNMVURFUyl7XG4gIHJldHVybiBmdW5jdGlvbigkdGhpcywgZWwsIGZyb21JbmRleCl7XG4gICAgdmFyIE8gICAgICA9IHRvSU9iamVjdCgkdGhpcylcbiAgICAgICwgbGVuZ3RoID0gdG9MZW5ndGgoTy5sZW5ndGgpXG4gICAgICAsIGluZGV4ICA9IHRvSW5kZXgoZnJvbUluZGV4LCBsZW5ndGgpXG4gICAgICAsIHZhbHVlO1xuICAgIC8vIEFycmF5I2luY2x1ZGVzIHVzZXMgU2FtZVZhbHVlWmVybyBlcXVhbGl0eSBhbGdvcml0aG1cbiAgICBpZihJU19JTkNMVURFUyAmJiBlbCAhPSBlbCl3aGlsZShsZW5ndGggPiBpbmRleCl7XG4gICAgICB2YWx1ZSA9IE9baW5kZXgrK107XG4gICAgICBpZih2YWx1ZSAhPSB2YWx1ZSlyZXR1cm4gdHJ1ZTtcbiAgICAvLyBBcnJheSN0b0luZGV4IGlnbm9yZXMgaG9sZXMsIEFycmF5I2luY2x1ZGVzIC0gbm90XG4gICAgfSBlbHNlIGZvcig7bGVuZ3RoID4gaW5kZXg7IGluZGV4KyspaWYoSVNfSU5DTFVERVMgfHwgaW5kZXggaW4gTyl7XG4gICAgICBpZihPW2luZGV4XSA9PT0gZWwpcmV0dXJuIElTX0lOQ0xVREVTIHx8IGluZGV4O1xuICAgIH0gcmV0dXJuICFJU19JTkNMVURFUyAmJiAtMTtcbiAgfTtcbn07XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vY29yZS1qcy9tb2R1bGVzLyQuYXJyYXktaW5jbHVkZXMuanNcbiAqKiBtb2R1bGUgaWQgPSAyNDZcbiAqKiBtb2R1bGUgY2h1bmtzID0gMjRcbiAqKi8iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");

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

	eval("'use strict';\n// ECMAScript 6 symbols shim\nvar $              = __webpack_require__(215)\n  , global         = __webpack_require__(217)\n  , has            = __webpack_require__(230)\n  , DESCRIPTORS    = __webpack_require__(221)\n  , $export        = __webpack_require__(216)\n  , redefine       = __webpack_require__(223)\n  , $fails         = __webpack_require__(222)\n  , shared         = __webpack_require__(245)\n  , setToStringTag = __webpack_require__(248)\n  , uid            = __webpack_require__(224)\n  , wks            = __webpack_require__(244)\n  , keyOf          = __webpack_require__(249)\n  , $names         = __webpack_require__(250)\n  , enumKeys       = __webpack_require__(251)\n  , isArray        = __webpack_require__(243)\n  , anObject       = __webpack_require__(233)\n  , toIObject      = __webpack_require__(236)\n  , createDesc     = __webpack_require__(220)\n  , getDesc        = $.getDesc\n  , setDesc        = $.setDesc\n  , _create        = $.create\n  , getNames       = $names.get\n  , $Symbol        = global.Symbol\n  , $JSON          = global.JSON\n  , _stringify     = $JSON && $JSON.stringify\n  , setter         = false\n  , HIDDEN         = wks('_hidden')\n  , isEnum         = $.isEnum\n  , SymbolRegistry = shared('symbol-registry')\n  , AllSymbols     = shared('symbols')\n  , useNative      = typeof $Symbol == 'function'\n  , ObjectProto    = Object.prototype;\n\n// fallback for old Android, https://code.google.com/p/v8/issues/detail?id=687\nvar setSymbolDesc = DESCRIPTORS && $fails(function(){\n  return _create(setDesc({}, 'a', {\n    get: function(){ return setDesc(this, 'a', {value: 7}).a; }\n  })).a != 7;\n}) ? function(it, key, D){\n  var protoDesc = getDesc(ObjectProto, key);\n  if(protoDesc)delete ObjectProto[key];\n  setDesc(it, key, D);\n  if(protoDesc && it !== ObjectProto)setDesc(ObjectProto, key, protoDesc);\n} : setDesc;\n\nvar wrap = function(tag){\n  var sym = AllSymbols[tag] = _create($Symbol.prototype);\n  sym._k = tag;\n  DESCRIPTORS && setter && setSymbolDesc(ObjectProto, tag, {\n    configurable: true,\n    set: function(value){\n      if(has(this, HIDDEN) && has(this[HIDDEN], tag))this[HIDDEN][tag] = false;\n      setSymbolDesc(this, tag, createDesc(1, value));\n    }\n  });\n  return sym;\n};\n\nvar isSymbol = function(it){\n  return typeof it == 'symbol';\n};\n\nvar $defineProperty = function defineProperty(it, key, D){\n  if(D && has(AllSymbols, key)){\n    if(!D.enumerable){\n      if(!has(it, HIDDEN))setDesc(it, HIDDEN, createDesc(1, {}));\n      it[HIDDEN][key] = true;\n    } else {\n      if(has(it, HIDDEN) && it[HIDDEN][key])it[HIDDEN][key] = false;\n      D = _create(D, {enumerable: createDesc(0, false)});\n    } return setSymbolDesc(it, key, D);\n  } return setDesc(it, key, D);\n};\nvar $defineProperties = function defineProperties(it, P){\n  anObject(it);\n  var keys = enumKeys(P = toIObject(P))\n    , i    = 0\n    , l = keys.length\n    , key;\n  while(l > i)$defineProperty(it, key = keys[i++], P[key]);\n  return it;\n};\nvar $create = function create(it, P){\n  return P === undefined ? _create(it) : $defineProperties(_create(it), P);\n};\nvar $propertyIsEnumerable = function propertyIsEnumerable(key){\n  var E = isEnum.call(this, key);\n  return E || !has(this, key) || !has(AllSymbols, key) || has(this, HIDDEN) && this[HIDDEN][key]\n    ? E : true;\n};\nvar $getOwnPropertyDescriptor = function getOwnPropertyDescriptor(it, key){\n  var D = getDesc(it = toIObject(it), key);\n  if(D && has(AllSymbols, key) && !(has(it, HIDDEN) && it[HIDDEN][key]))D.enumerable = true;\n  return D;\n};\nvar $getOwnPropertyNames = function getOwnPropertyNames(it){\n  var names  = getNames(toIObject(it))\n    , result = []\n    , i      = 0\n    , key;\n  while(names.length > i)if(!has(AllSymbols, key = names[i++]) && key != HIDDEN)result.push(key);\n  return result;\n};\nvar $getOwnPropertySymbols = function getOwnPropertySymbols(it){\n  var names  = getNames(toIObject(it))\n    , result = []\n    , i      = 0\n    , key;\n  while(names.length > i)if(has(AllSymbols, key = names[i++]))result.push(AllSymbols[key]);\n  return result;\n};\nvar $stringify = function stringify(it){\n  if(it === undefined || isSymbol(it))return; // IE8 returns string on undefined\n  var args = [it]\n    , i    = 1\n    , $$   = arguments\n    , replacer, $replacer;\n  while($$.length > i)args.push($$[i++]);\n  replacer = args[1];\n  if(typeof replacer == 'function')$replacer = replacer;\n  if($replacer || !isArray(replacer))replacer = function(key, value){\n    if($replacer)value = $replacer.call(this, key, value);\n    if(!isSymbol(value))return value;\n  };\n  args[1] = replacer;\n  return _stringify.apply($JSON, args);\n};\nvar buggyJSON = $fails(function(){\n  var S = $Symbol();\n  // MS Edge converts symbol values to JSON as {}\n  // WebKit converts symbol values to JSON as null\n  // V8 throws on boxed symbols\n  return _stringify([S]) != '[null]' || _stringify({a: S}) != '{}' || _stringify(Object(S)) != '{}';\n});\n\n// 19.4.1.1 Symbol([description])\nif(!useNative){\n  $Symbol = function Symbol(){\n    if(isSymbol(this))throw TypeError('Symbol is not a constructor');\n    return wrap(uid(arguments.length > 0 ? arguments[0] : undefined));\n  };\n  redefine($Symbol.prototype, 'toString', function toString(){\n    return this._k;\n  });\n\n  isSymbol = function(it){\n    return it instanceof $Symbol;\n  };\n\n  $.create     = $create;\n  $.isEnum     = $propertyIsEnumerable;\n  $.getDesc    = $getOwnPropertyDescriptor;\n  $.setDesc    = $defineProperty;\n  $.setDescs   = $defineProperties;\n  $.getNames   = $names.get = $getOwnPropertyNames;\n  $.getSymbols = $getOwnPropertySymbols;\n\n  if(DESCRIPTORS && !__webpack_require__(252)){\n    redefine(ObjectProto, 'propertyIsEnumerable', $propertyIsEnumerable, true);\n  }\n}\n\nvar symbolStatics = {\n  // 19.4.2.1 Symbol.for(key)\n  'for': function(key){\n    return has(SymbolRegistry, key += '')\n      ? SymbolRegistry[key]\n      : SymbolRegistry[key] = $Symbol(key);\n  },\n  // 19.4.2.5 Symbol.keyFor(sym)\n  keyFor: function keyFor(key){\n    return keyOf(SymbolRegistry, key);\n  },\n  useSetter: function(){ setter = true; },\n  useSimple: function(){ setter = false; }\n};\n// 19.4.2.2 Symbol.hasInstance\n// 19.4.2.3 Symbol.isConcatSpreadable\n// 19.4.2.4 Symbol.iterator\n// 19.4.2.6 Symbol.match\n// 19.4.2.8 Symbol.replace\n// 19.4.2.9 Symbol.search\n// 19.4.2.10 Symbol.species\n// 19.4.2.11 Symbol.split\n// 19.4.2.12 Symbol.toPrimitive\n// 19.4.2.13 Symbol.toStringTag\n// 19.4.2.14 Symbol.unscopables\n$.each.call((\n  'hasInstance,isConcatSpreadable,iterator,match,replace,search,' +\n  'species,split,toPrimitive,toStringTag,unscopables'\n).split(','), function(it){\n  var sym = wks(it);\n  symbolStatics[it] = useNative ? sym : wrap(sym);\n});\n\nsetter = true;\n\n$export($export.G + $export.W, {Symbol: $Symbol});\n\n$export($export.S, 'Symbol', symbolStatics);\n\n$export($export.S + $export.F * !useNative, 'Object', {\n  // 19.1.2.2 Object.create(O [, Properties])\n  create: $create,\n  // 19.1.2.4 Object.defineProperty(O, P, Attributes)\n  defineProperty: $defineProperty,\n  // 19.1.2.3 Object.defineProperties(O, Properties)\n  defineProperties: $defineProperties,\n  // 19.1.2.6 Object.getOwnPropertyDescriptor(O, P)\n  getOwnPropertyDescriptor: $getOwnPropertyDescriptor,\n  // 19.1.2.7 Object.getOwnPropertyNames(O)\n  getOwnPropertyNames: $getOwnPropertyNames,\n  // 19.1.2.8 Object.getOwnPropertySymbols(O)\n  getOwnPropertySymbols: $getOwnPropertySymbols\n});\n\n// 24.3.2 JSON.stringify(value [, replacer [, space]])\n$JSON && $export($export.S + $export.F * (!useNative || buggyJSON), 'JSON', {stringify: $stringify});\n\n// 19.4.3.5 Symbol.prototype[@@toStringTag]\nsetToStringTag($Symbol, 'Symbol');\n// 20.2.1.9 Math[@@toStringTag]\nsetToStringTag(Math, 'Math', true);\n// 24.3.3 JSON[@@toStringTag]\nsetToStringTag(global.JSON, 'JSON', true);\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjQ3LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvZXM2LnN5bWJvbC5qcz9hNjU3Il0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0Jztcbi8vIEVDTUFTY3JpcHQgNiBzeW1ib2xzIHNoaW1cbnZhciAkICAgICAgICAgICAgICA9IHJlcXVpcmUoJy4vJCcpXG4gICwgZ2xvYmFsICAgICAgICAgPSByZXF1aXJlKCcuLyQuZ2xvYmFsJylcbiAgLCBoYXMgICAgICAgICAgICA9IHJlcXVpcmUoJy4vJC5oYXMnKVxuICAsIERFU0NSSVBUT1JTICAgID0gcmVxdWlyZSgnLi8kLmRlc2NyaXB0b3JzJylcbiAgLCAkZXhwb3J0ICAgICAgICA9IHJlcXVpcmUoJy4vJC5leHBvcnQnKVxuICAsIHJlZGVmaW5lICAgICAgID0gcmVxdWlyZSgnLi8kLnJlZGVmaW5lJylcbiAgLCAkZmFpbHMgICAgICAgICA9IHJlcXVpcmUoJy4vJC5mYWlscycpXG4gICwgc2hhcmVkICAgICAgICAgPSByZXF1aXJlKCcuLyQuc2hhcmVkJylcbiAgLCBzZXRUb1N0cmluZ1RhZyA9IHJlcXVpcmUoJy4vJC5zZXQtdG8tc3RyaW5nLXRhZycpXG4gICwgdWlkICAgICAgICAgICAgPSByZXF1aXJlKCcuLyQudWlkJylcbiAgLCB3a3MgICAgICAgICAgICA9IHJlcXVpcmUoJy4vJC53a3MnKVxuICAsIGtleU9mICAgICAgICAgID0gcmVxdWlyZSgnLi8kLmtleW9mJylcbiAgLCAkbmFtZXMgICAgICAgICA9IHJlcXVpcmUoJy4vJC5nZXQtbmFtZXMnKVxuICAsIGVudW1LZXlzICAgICAgID0gcmVxdWlyZSgnLi8kLmVudW0ta2V5cycpXG4gICwgaXNBcnJheSAgICAgICAgPSByZXF1aXJlKCcuLyQuaXMtYXJyYXknKVxuICAsIGFuT2JqZWN0ICAgICAgID0gcmVxdWlyZSgnLi8kLmFuLW9iamVjdCcpXG4gICwgdG9JT2JqZWN0ICAgICAgPSByZXF1aXJlKCcuLyQudG8taW9iamVjdCcpXG4gICwgY3JlYXRlRGVzYyAgICAgPSByZXF1aXJlKCcuLyQucHJvcGVydHktZGVzYycpXG4gICwgZ2V0RGVzYyAgICAgICAgPSAkLmdldERlc2NcbiAgLCBzZXREZXNjICAgICAgICA9ICQuc2V0RGVzY1xuICAsIF9jcmVhdGUgICAgICAgID0gJC5jcmVhdGVcbiAgLCBnZXROYW1lcyAgICAgICA9ICRuYW1lcy5nZXRcbiAgLCAkU3ltYm9sICAgICAgICA9IGdsb2JhbC5TeW1ib2xcbiAgLCAkSlNPTiAgICAgICAgICA9IGdsb2JhbC5KU09OXG4gICwgX3N0cmluZ2lmeSAgICAgPSAkSlNPTiAmJiAkSlNPTi5zdHJpbmdpZnlcbiAgLCBzZXR0ZXIgICAgICAgICA9IGZhbHNlXG4gICwgSElEREVOICAgICAgICAgPSB3a3MoJ19oaWRkZW4nKVxuICAsIGlzRW51bSAgICAgICAgID0gJC5pc0VudW1cbiAgLCBTeW1ib2xSZWdpc3RyeSA9IHNoYXJlZCgnc3ltYm9sLXJlZ2lzdHJ5JylcbiAgLCBBbGxTeW1ib2xzICAgICA9IHNoYXJlZCgnc3ltYm9scycpXG4gICwgdXNlTmF0aXZlICAgICAgPSB0eXBlb2YgJFN5bWJvbCA9PSAnZnVuY3Rpb24nXG4gICwgT2JqZWN0UHJvdG8gICAgPSBPYmplY3QucHJvdG90eXBlO1xuXG4vLyBmYWxsYmFjayBmb3Igb2xkIEFuZHJvaWQsIGh0dHBzOi8vY29kZS5nb29nbGUuY29tL3AvdjgvaXNzdWVzL2RldGFpbD9pZD02ODdcbnZhciBzZXRTeW1ib2xEZXNjID0gREVTQ1JJUFRPUlMgJiYgJGZhaWxzKGZ1bmN0aW9uKCl7XG4gIHJldHVybiBfY3JlYXRlKHNldERlc2Moe30sICdhJywge1xuICAgIGdldDogZnVuY3Rpb24oKXsgcmV0dXJuIHNldERlc2ModGhpcywgJ2EnLCB7dmFsdWU6IDd9KS5hOyB9XG4gIH0pKS5hICE9IDc7XG59KSA/IGZ1bmN0aW9uKGl0LCBrZXksIEQpe1xuICB2YXIgcHJvdG9EZXNjID0gZ2V0RGVzYyhPYmplY3RQcm90bywga2V5KTtcbiAgaWYocHJvdG9EZXNjKWRlbGV0ZSBPYmplY3RQcm90b1trZXldO1xuICBzZXREZXNjKGl0LCBrZXksIEQpO1xuICBpZihwcm90b0Rlc2MgJiYgaXQgIT09IE9iamVjdFByb3RvKXNldERlc2MoT2JqZWN0UHJvdG8sIGtleSwgcHJvdG9EZXNjKTtcbn0gOiBzZXREZXNjO1xuXG52YXIgd3JhcCA9IGZ1bmN0aW9uKHRhZyl7XG4gIHZhciBzeW0gPSBBbGxTeW1ib2xzW3RhZ10gPSBfY3JlYXRlKCRTeW1ib2wucHJvdG90eXBlKTtcbiAgc3ltLl9rID0gdGFnO1xuICBERVNDUklQVE9SUyAmJiBzZXR0ZXIgJiYgc2V0U3ltYm9sRGVzYyhPYmplY3RQcm90bywgdGFnLCB7XG4gICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgIHNldDogZnVuY3Rpb24odmFsdWUpe1xuICAgICAgaWYoaGFzKHRoaXMsIEhJRERFTikgJiYgaGFzKHRoaXNbSElEREVOXSwgdGFnKSl0aGlzW0hJRERFTl1bdGFnXSA9IGZhbHNlO1xuICAgICAgc2V0U3ltYm9sRGVzYyh0aGlzLCB0YWcsIGNyZWF0ZURlc2MoMSwgdmFsdWUpKTtcbiAgICB9XG4gIH0pO1xuICByZXR1cm4gc3ltO1xufTtcblxudmFyIGlzU3ltYm9sID0gZnVuY3Rpb24oaXQpe1xuICByZXR1cm4gdHlwZW9mIGl0ID09ICdzeW1ib2wnO1xufTtcblxudmFyICRkZWZpbmVQcm9wZXJ0eSA9IGZ1bmN0aW9uIGRlZmluZVByb3BlcnR5KGl0LCBrZXksIEQpe1xuICBpZihEICYmIGhhcyhBbGxTeW1ib2xzLCBrZXkpKXtcbiAgICBpZighRC5lbnVtZXJhYmxlKXtcbiAgICAgIGlmKCFoYXMoaXQsIEhJRERFTikpc2V0RGVzYyhpdCwgSElEREVOLCBjcmVhdGVEZXNjKDEsIHt9KSk7XG4gICAgICBpdFtISURERU5dW2tleV0gPSB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZihoYXMoaXQsIEhJRERFTikgJiYgaXRbSElEREVOXVtrZXldKWl0W0hJRERFTl1ba2V5XSA9IGZhbHNlO1xuICAgICAgRCA9IF9jcmVhdGUoRCwge2VudW1lcmFibGU6IGNyZWF0ZURlc2MoMCwgZmFsc2UpfSk7XG4gICAgfSByZXR1cm4gc2V0U3ltYm9sRGVzYyhpdCwga2V5LCBEKTtcbiAgfSByZXR1cm4gc2V0RGVzYyhpdCwga2V5LCBEKTtcbn07XG52YXIgJGRlZmluZVByb3BlcnRpZXMgPSBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0aWVzKGl0LCBQKXtcbiAgYW5PYmplY3QoaXQpO1xuICB2YXIga2V5cyA9IGVudW1LZXlzKFAgPSB0b0lPYmplY3QoUCkpXG4gICAgLCBpICAgID0gMFxuICAgICwgbCA9IGtleXMubGVuZ3RoXG4gICAgLCBrZXk7XG4gIHdoaWxlKGwgPiBpKSRkZWZpbmVQcm9wZXJ0eShpdCwga2V5ID0ga2V5c1tpKytdLCBQW2tleV0pO1xuICByZXR1cm4gaXQ7XG59O1xudmFyICRjcmVhdGUgPSBmdW5jdGlvbiBjcmVhdGUoaXQsIFApe1xuICByZXR1cm4gUCA9PT0gdW5kZWZpbmVkID8gX2NyZWF0ZShpdCkgOiAkZGVmaW5lUHJvcGVydGllcyhfY3JlYXRlKGl0KSwgUCk7XG59O1xudmFyICRwcm9wZXJ0eUlzRW51bWVyYWJsZSA9IGZ1bmN0aW9uIHByb3BlcnR5SXNFbnVtZXJhYmxlKGtleSl7XG4gIHZhciBFID0gaXNFbnVtLmNhbGwodGhpcywga2V5KTtcbiAgcmV0dXJuIEUgfHwgIWhhcyh0aGlzLCBrZXkpIHx8ICFoYXMoQWxsU3ltYm9scywga2V5KSB8fCBoYXModGhpcywgSElEREVOKSAmJiB0aGlzW0hJRERFTl1ba2V5XVxuICAgID8gRSA6IHRydWU7XG59O1xudmFyICRnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IgPSBmdW5jdGlvbiBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoaXQsIGtleSl7XG4gIHZhciBEID0gZ2V0RGVzYyhpdCA9IHRvSU9iamVjdChpdCksIGtleSk7XG4gIGlmKEQgJiYgaGFzKEFsbFN5bWJvbHMsIGtleSkgJiYgIShoYXMoaXQsIEhJRERFTikgJiYgaXRbSElEREVOXVtrZXldKSlELmVudW1lcmFibGUgPSB0cnVlO1xuICByZXR1cm4gRDtcbn07XG52YXIgJGdldE93blByb3BlcnR5TmFtZXMgPSBmdW5jdGlvbiBnZXRPd25Qcm9wZXJ0eU5hbWVzKGl0KXtcbiAgdmFyIG5hbWVzICA9IGdldE5hbWVzKHRvSU9iamVjdChpdCkpXG4gICAgLCByZXN1bHQgPSBbXVxuICAgICwgaSAgICAgID0gMFxuICAgICwga2V5O1xuICB3aGlsZShuYW1lcy5sZW5ndGggPiBpKWlmKCFoYXMoQWxsU3ltYm9scywga2V5ID0gbmFtZXNbaSsrXSkgJiYga2V5ICE9IEhJRERFTilyZXN1bHQucHVzaChrZXkpO1xuICByZXR1cm4gcmVzdWx0O1xufTtcbnZhciAkZ2V0T3duUHJvcGVydHlTeW1ib2xzID0gZnVuY3Rpb24gZ2V0T3duUHJvcGVydHlTeW1ib2xzKGl0KXtcbiAgdmFyIG5hbWVzICA9IGdldE5hbWVzKHRvSU9iamVjdChpdCkpXG4gICAgLCByZXN1bHQgPSBbXVxuICAgICwgaSAgICAgID0gMFxuICAgICwga2V5O1xuICB3aGlsZShuYW1lcy5sZW5ndGggPiBpKWlmKGhhcyhBbGxTeW1ib2xzLCBrZXkgPSBuYW1lc1tpKytdKSlyZXN1bHQucHVzaChBbGxTeW1ib2xzW2tleV0pO1xuICByZXR1cm4gcmVzdWx0O1xufTtcbnZhciAkc3RyaW5naWZ5ID0gZnVuY3Rpb24gc3RyaW5naWZ5KGl0KXtcbiAgaWYoaXQgPT09IHVuZGVmaW5lZCB8fCBpc1N5bWJvbChpdCkpcmV0dXJuOyAvLyBJRTggcmV0dXJucyBzdHJpbmcgb24gdW5kZWZpbmVkXG4gIHZhciBhcmdzID0gW2l0XVxuICAgICwgaSAgICA9IDFcbiAgICAsICQkICAgPSBhcmd1bWVudHNcbiAgICAsIHJlcGxhY2VyLCAkcmVwbGFjZXI7XG4gIHdoaWxlKCQkLmxlbmd0aCA+IGkpYXJncy5wdXNoKCQkW2krK10pO1xuICByZXBsYWNlciA9IGFyZ3NbMV07XG4gIGlmKHR5cGVvZiByZXBsYWNlciA9PSAnZnVuY3Rpb24nKSRyZXBsYWNlciA9IHJlcGxhY2VyO1xuICBpZigkcmVwbGFjZXIgfHwgIWlzQXJyYXkocmVwbGFjZXIpKXJlcGxhY2VyID0gZnVuY3Rpb24oa2V5LCB2YWx1ZSl7XG4gICAgaWYoJHJlcGxhY2VyKXZhbHVlID0gJHJlcGxhY2VyLmNhbGwodGhpcywga2V5LCB2YWx1ZSk7XG4gICAgaWYoIWlzU3ltYm9sKHZhbHVlKSlyZXR1cm4gdmFsdWU7XG4gIH07XG4gIGFyZ3NbMV0gPSByZXBsYWNlcjtcbiAgcmV0dXJuIF9zdHJpbmdpZnkuYXBwbHkoJEpTT04sIGFyZ3MpO1xufTtcbnZhciBidWdneUpTT04gPSAkZmFpbHMoZnVuY3Rpb24oKXtcbiAgdmFyIFMgPSAkU3ltYm9sKCk7XG4gIC8vIE1TIEVkZ2UgY29udmVydHMgc3ltYm9sIHZhbHVlcyB0byBKU09OIGFzIHt9XG4gIC8vIFdlYktpdCBjb252ZXJ0cyBzeW1ib2wgdmFsdWVzIHRvIEpTT04gYXMgbnVsbFxuICAvLyBWOCB0aHJvd3Mgb24gYm94ZWQgc3ltYm9sc1xuICByZXR1cm4gX3N0cmluZ2lmeShbU10pICE9ICdbbnVsbF0nIHx8IF9zdHJpbmdpZnkoe2E6IFN9KSAhPSAne30nIHx8IF9zdHJpbmdpZnkoT2JqZWN0KFMpKSAhPSAne30nO1xufSk7XG5cbi8vIDE5LjQuMS4xIFN5bWJvbChbZGVzY3JpcHRpb25dKVxuaWYoIXVzZU5hdGl2ZSl7XG4gICRTeW1ib2wgPSBmdW5jdGlvbiBTeW1ib2woKXtcbiAgICBpZihpc1N5bWJvbCh0aGlzKSl0aHJvdyBUeXBlRXJyb3IoJ1N5bWJvbCBpcyBub3QgYSBjb25zdHJ1Y3RvcicpO1xuICAgIHJldHVybiB3cmFwKHVpZChhcmd1bWVudHMubGVuZ3RoID4gMCA/IGFyZ3VtZW50c1swXSA6IHVuZGVmaW5lZCkpO1xuICB9O1xuICByZWRlZmluZSgkU3ltYm9sLnByb3RvdHlwZSwgJ3RvU3RyaW5nJywgZnVuY3Rpb24gdG9TdHJpbmcoKXtcbiAgICByZXR1cm4gdGhpcy5faztcbiAgfSk7XG5cbiAgaXNTeW1ib2wgPSBmdW5jdGlvbihpdCl7XG4gICAgcmV0dXJuIGl0IGluc3RhbmNlb2YgJFN5bWJvbDtcbiAgfTtcblxuICAkLmNyZWF0ZSAgICAgPSAkY3JlYXRlO1xuICAkLmlzRW51bSAgICAgPSAkcHJvcGVydHlJc0VudW1lcmFibGU7XG4gICQuZ2V0RGVzYyAgICA9ICRnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I7XG4gICQuc2V0RGVzYyAgICA9ICRkZWZpbmVQcm9wZXJ0eTtcbiAgJC5zZXREZXNjcyAgID0gJGRlZmluZVByb3BlcnRpZXM7XG4gICQuZ2V0TmFtZXMgICA9ICRuYW1lcy5nZXQgPSAkZ2V0T3duUHJvcGVydHlOYW1lcztcbiAgJC5nZXRTeW1ib2xzID0gJGdldE93blByb3BlcnR5U3ltYm9scztcblxuICBpZihERVNDUklQVE9SUyAmJiAhcmVxdWlyZSgnLi8kLmxpYnJhcnknKSl7XG4gICAgcmVkZWZpbmUoT2JqZWN0UHJvdG8sICdwcm9wZXJ0eUlzRW51bWVyYWJsZScsICRwcm9wZXJ0eUlzRW51bWVyYWJsZSwgdHJ1ZSk7XG4gIH1cbn1cblxudmFyIHN5bWJvbFN0YXRpY3MgPSB7XG4gIC8vIDE5LjQuMi4xIFN5bWJvbC5mb3Ioa2V5KVxuICAnZm9yJzogZnVuY3Rpb24oa2V5KXtcbiAgICByZXR1cm4gaGFzKFN5bWJvbFJlZ2lzdHJ5LCBrZXkgKz0gJycpXG4gICAgICA/IFN5bWJvbFJlZ2lzdHJ5W2tleV1cbiAgICAgIDogU3ltYm9sUmVnaXN0cnlba2V5XSA9ICRTeW1ib2woa2V5KTtcbiAgfSxcbiAgLy8gMTkuNC4yLjUgU3ltYm9sLmtleUZvcihzeW0pXG4gIGtleUZvcjogZnVuY3Rpb24ga2V5Rm9yKGtleSl7XG4gICAgcmV0dXJuIGtleU9mKFN5bWJvbFJlZ2lzdHJ5LCBrZXkpO1xuICB9LFxuICB1c2VTZXR0ZXI6IGZ1bmN0aW9uKCl7IHNldHRlciA9IHRydWU7IH0sXG4gIHVzZVNpbXBsZTogZnVuY3Rpb24oKXsgc2V0dGVyID0gZmFsc2U7IH1cbn07XG4vLyAxOS40LjIuMiBTeW1ib2wuaGFzSW5zdGFuY2Vcbi8vIDE5LjQuMi4zIFN5bWJvbC5pc0NvbmNhdFNwcmVhZGFibGVcbi8vIDE5LjQuMi40IFN5bWJvbC5pdGVyYXRvclxuLy8gMTkuNC4yLjYgU3ltYm9sLm1hdGNoXG4vLyAxOS40LjIuOCBTeW1ib2wucmVwbGFjZVxuLy8gMTkuNC4yLjkgU3ltYm9sLnNlYXJjaFxuLy8gMTkuNC4yLjEwIFN5bWJvbC5zcGVjaWVzXG4vLyAxOS40LjIuMTEgU3ltYm9sLnNwbGl0XG4vLyAxOS40LjIuMTIgU3ltYm9sLnRvUHJpbWl0aXZlXG4vLyAxOS40LjIuMTMgU3ltYm9sLnRvU3RyaW5nVGFnXG4vLyAxOS40LjIuMTQgU3ltYm9sLnVuc2NvcGFibGVzXG4kLmVhY2guY2FsbCgoXG4gICdoYXNJbnN0YW5jZSxpc0NvbmNhdFNwcmVhZGFibGUsaXRlcmF0b3IsbWF0Y2gscmVwbGFjZSxzZWFyY2gsJyArXG4gICdzcGVjaWVzLHNwbGl0LHRvUHJpbWl0aXZlLHRvU3RyaW5nVGFnLHVuc2NvcGFibGVzJ1xuKS5zcGxpdCgnLCcpLCBmdW5jdGlvbihpdCl7XG4gIHZhciBzeW0gPSB3a3MoaXQpO1xuICBzeW1ib2xTdGF0aWNzW2l0XSA9IHVzZU5hdGl2ZSA/IHN5bSA6IHdyYXAoc3ltKTtcbn0pO1xuXG5zZXR0ZXIgPSB0cnVlO1xuXG4kZXhwb3J0KCRleHBvcnQuRyArICRleHBvcnQuVywge1N5bWJvbDogJFN5bWJvbH0pO1xuXG4kZXhwb3J0KCRleHBvcnQuUywgJ1N5bWJvbCcsIHN5bWJvbFN0YXRpY3MpO1xuXG4kZXhwb3J0KCRleHBvcnQuUyArICRleHBvcnQuRiAqICF1c2VOYXRpdmUsICdPYmplY3QnLCB7XG4gIC8vIDE5LjEuMi4yIE9iamVjdC5jcmVhdGUoTyBbLCBQcm9wZXJ0aWVzXSlcbiAgY3JlYXRlOiAkY3JlYXRlLFxuICAvLyAxOS4xLjIuNCBPYmplY3QuZGVmaW5lUHJvcGVydHkoTywgUCwgQXR0cmlidXRlcylcbiAgZGVmaW5lUHJvcGVydHk6ICRkZWZpbmVQcm9wZXJ0eSxcbiAgLy8gMTkuMS4yLjMgT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoTywgUHJvcGVydGllcylcbiAgZGVmaW5lUHJvcGVydGllczogJGRlZmluZVByb3BlcnRpZXMsXG4gIC8vIDE5LjEuMi42IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoTywgUClcbiAgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yOiAkZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yLFxuICAvLyAxOS4xLjIuNyBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhPKVxuICBnZXRPd25Qcm9wZXJ0eU5hbWVzOiAkZ2V0T3duUHJvcGVydHlOYW1lcyxcbiAgLy8gMTkuMS4yLjggT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhPKVxuICBnZXRPd25Qcm9wZXJ0eVN5bWJvbHM6ICRnZXRPd25Qcm9wZXJ0eVN5bWJvbHNcbn0pO1xuXG4vLyAyNC4zLjIgSlNPTi5zdHJpbmdpZnkodmFsdWUgWywgcmVwbGFjZXIgWywgc3BhY2VdXSlcbiRKU09OICYmICRleHBvcnQoJGV4cG9ydC5TICsgJGV4cG9ydC5GICogKCF1c2VOYXRpdmUgfHwgYnVnZ3lKU09OKSwgJ0pTT04nLCB7c3RyaW5naWZ5OiAkc3RyaW5naWZ5fSk7XG5cbi8vIDE5LjQuMy41IFN5bWJvbC5wcm90b3R5cGVbQEB0b1N0cmluZ1RhZ11cbnNldFRvU3RyaW5nVGFnKCRTeW1ib2wsICdTeW1ib2wnKTtcbi8vIDIwLjIuMS45IE1hdGhbQEB0b1N0cmluZ1RhZ11cbnNldFRvU3RyaW5nVGFnKE1hdGgsICdNYXRoJywgdHJ1ZSk7XG4vLyAyNC4zLjMgSlNPTltAQHRvU3RyaW5nVGFnXVxuc2V0VG9TdHJpbmdUYWcoZ2xvYmFsLkpTT04sICdKU09OJywgdHJ1ZSk7XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vY29yZS1qcy9tb2R1bGVzL2VzNi5zeW1ib2wuanNcbiAqKiBtb2R1bGUgaWQgPSAyNDdcbiAqKiBtb2R1bGUgY2h1bmtzID0gMjRcbiAqKi8iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=");

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

	eval("var def = __webpack_require__(215).setDesc\n  , has = __webpack_require__(230)\n  , TAG = __webpack_require__(244)('toStringTag');\n\nmodule.exports = function(it, tag, stat){\n  if(it && !has(it = stat ? it : it.prototype, TAG))def(it, TAG, {configurable: true, value: tag});\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjQ4LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvJC5zZXQtdG8tc3RyaW5nLXRhZy5qcz9hOGVhIl0sInNvdXJjZXNDb250ZW50IjpbInZhciBkZWYgPSByZXF1aXJlKCcuLyQnKS5zZXREZXNjXG4gICwgaGFzID0gcmVxdWlyZSgnLi8kLmhhcycpXG4gICwgVEFHID0gcmVxdWlyZSgnLi8kLndrcycpKCd0b1N0cmluZ1RhZycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGl0LCB0YWcsIHN0YXQpe1xuICBpZihpdCAmJiAhaGFzKGl0ID0gc3RhdCA/IGl0IDogaXQucHJvdG90eXBlLCBUQUcpKWRlZihpdCwgVEFHLCB7Y29uZmlndXJhYmxlOiB0cnVlLCB2YWx1ZTogdGFnfSk7XG59O1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2NvcmUtanMvbW9kdWxlcy8kLnNldC10by1zdHJpbmctdGFnLmpzXG4gKiogbW9kdWxlIGlkID0gMjQ4XG4gKiogbW9kdWxlIGNodW5rcyA9IDI0XG4gKiovIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");

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

	eval("var $         = __webpack_require__(215)\n  , toIObject = __webpack_require__(236);\nmodule.exports = function(object, el){\n  var O      = toIObject(object)\n    , keys   = $.getKeys(O)\n    , length = keys.length\n    , index  = 0\n    , key;\n  while(length > index)if(O[key = keys[index++]] === el)return key;\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjQ5LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvJC5rZXlvZi5qcz8zMmVkIl0sInNvdXJjZXNDb250ZW50IjpbInZhciAkICAgICAgICAgPSByZXF1aXJlKCcuLyQnKVxuICAsIHRvSU9iamVjdCA9IHJlcXVpcmUoJy4vJC50by1pb2JqZWN0Jyk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKG9iamVjdCwgZWwpe1xuICB2YXIgTyAgICAgID0gdG9JT2JqZWN0KG9iamVjdClcbiAgICAsIGtleXMgICA9ICQuZ2V0S2V5cyhPKVxuICAgICwgbGVuZ3RoID0ga2V5cy5sZW5ndGhcbiAgICAsIGluZGV4ICA9IDBcbiAgICAsIGtleTtcbiAgd2hpbGUobGVuZ3RoID4gaW5kZXgpaWYoT1trZXkgPSBrZXlzW2luZGV4KytdXSA9PT0gZWwpcmV0dXJuIGtleTtcbn07XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vY29yZS1qcy9tb2R1bGVzLyQua2V5b2YuanNcbiAqKiBtb2R1bGUgaWQgPSAyNDlcbiAqKiBtb2R1bGUgY2h1bmtzID0gMjRcbiAqKi8iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");

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

	eval("// fallback for IE11 buggy Object.getOwnPropertyNames with iframe and window\nvar toIObject = __webpack_require__(236)\n  , getNames  = __webpack_require__(215).getNames\n  , toString  = {}.toString;\n\nvar windowNames = typeof window == 'object' && Object.getOwnPropertyNames\n  ? Object.getOwnPropertyNames(window) : [];\n\nvar getWindowNames = function(it){\n  try {\n    return getNames(it);\n  } catch(e){\n    return windowNames.slice();\n  }\n};\n\nmodule.exports.get = function getOwnPropertyNames(it){\n  if(windowNames && toString.call(it) == '[object Window]')return getWindowNames(it);\n  return getNames(toIObject(it));\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjUwLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvJC5nZXQtbmFtZXMuanM/MDJiOSJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBmYWxsYmFjayBmb3IgSUUxMSBidWdneSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyB3aXRoIGlmcmFtZSBhbmQgd2luZG93XG52YXIgdG9JT2JqZWN0ID0gcmVxdWlyZSgnLi8kLnRvLWlvYmplY3QnKVxuICAsIGdldE5hbWVzICA9IHJlcXVpcmUoJy4vJCcpLmdldE5hbWVzXG4gICwgdG9TdHJpbmcgID0ge30udG9TdHJpbmc7XG5cbnZhciB3aW5kb3dOYW1lcyA9IHR5cGVvZiB3aW5kb3cgPT0gJ29iamVjdCcgJiYgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXNcbiAgPyBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyh3aW5kb3cpIDogW107XG5cbnZhciBnZXRXaW5kb3dOYW1lcyA9IGZ1bmN0aW9uKGl0KXtcbiAgdHJ5IHtcbiAgICByZXR1cm4gZ2V0TmFtZXMoaXQpO1xuICB9IGNhdGNoKGUpe1xuICAgIHJldHVybiB3aW5kb3dOYW1lcy5zbGljZSgpO1xuICB9XG59O1xuXG5tb2R1bGUuZXhwb3J0cy5nZXQgPSBmdW5jdGlvbiBnZXRPd25Qcm9wZXJ0eU5hbWVzKGl0KXtcbiAgaWYod2luZG93TmFtZXMgJiYgdG9TdHJpbmcuY2FsbChpdCkgPT0gJ1tvYmplY3QgV2luZG93XScpcmV0dXJuIGdldFdpbmRvd05hbWVzKGl0KTtcbiAgcmV0dXJuIGdldE5hbWVzKHRvSU9iamVjdChpdCkpO1xufTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9jb3JlLWpzL21vZHVsZXMvJC5nZXQtbmFtZXMuanNcbiAqKiBtb2R1bGUgaWQgPSAyNTBcbiAqKiBtb2R1bGUgY2h1bmtzID0gMjRcbiAqKi8iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=");

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

	eval("// all enumerable object keys, includes symbols\nvar $ = __webpack_require__(215);\nmodule.exports = function(it){\n  var keys       = $.getKeys(it)\n    , getSymbols = $.getSymbols;\n  if(getSymbols){\n    var symbols = getSymbols(it)\n      , isEnum  = $.isEnum\n      , i       = 0\n      , key;\n    while(symbols.length > i)if(isEnum.call(it, key = symbols[i++]))keys.push(key);\n  }\n  return keys;\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjUxLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvJC5lbnVtLWtleXMuanM/NzJlMyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBhbGwgZW51bWVyYWJsZSBvYmplY3Qga2V5cywgaW5jbHVkZXMgc3ltYm9sc1xudmFyICQgPSByZXF1aXJlKCcuLyQnKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oaXQpe1xuICB2YXIga2V5cyAgICAgICA9ICQuZ2V0S2V5cyhpdClcbiAgICAsIGdldFN5bWJvbHMgPSAkLmdldFN5bWJvbHM7XG4gIGlmKGdldFN5bWJvbHMpe1xuICAgIHZhciBzeW1ib2xzID0gZ2V0U3ltYm9scyhpdClcbiAgICAgICwgaXNFbnVtICA9ICQuaXNFbnVtXG4gICAgICAsIGkgICAgICAgPSAwXG4gICAgICAsIGtleTtcbiAgICB3aGlsZShzeW1ib2xzLmxlbmd0aCA+IGkpaWYoaXNFbnVtLmNhbGwoaXQsIGtleSA9IHN5bWJvbHNbaSsrXSkpa2V5cy5wdXNoKGtleSk7XG4gIH1cbiAgcmV0dXJuIGtleXM7XG59O1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2NvcmUtanMvbW9kdWxlcy8kLmVudW0ta2V5cy5qc1xuICoqIG1vZHVsZSBpZCA9IDI1MVxuICoqIG1vZHVsZSBjaHVua3MgPSAyNFxuICoqLyJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");

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

	eval("module.exports = false;\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjUyLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvJC5saWJyYXJ5LmpzPzJmMWQiXSwic291cmNlc0NvbnRlbnQiOlsibW9kdWxlLmV4cG9ydHMgPSBmYWxzZTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9jb3JlLWpzL21vZHVsZXMvJC5saWJyYXJ5LmpzXG4gKiogbW9kdWxlIGlkID0gMjUyXG4gKiogbW9kdWxlIGNodW5rcyA9IDI0XG4gKiovIl0sIm1hcHBpbmdzIjoiQUFBQSIsInNvdXJjZVJvb3QiOiIifQ==");

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

	eval("// 19.1.3.1 Object.assign(target, source)\nvar $export = __webpack_require__(216);\n\n$export($export.S + $export.F, 'Object', {assign: __webpack_require__(254)});\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjUzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvZXM2Lm9iamVjdC5hc3NpZ24uanM/YjFiZSJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyAxOS4xLjMuMSBPYmplY3QuYXNzaWduKHRhcmdldCwgc291cmNlKVxudmFyICRleHBvcnQgPSByZXF1aXJlKCcuLyQuZXhwb3J0Jyk7XG5cbiRleHBvcnQoJGV4cG9ydC5TICsgJGV4cG9ydC5GLCAnT2JqZWN0Jywge2Fzc2lnbjogcmVxdWlyZSgnLi8kLm9iamVjdC1hc3NpZ24nKX0pO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2NvcmUtanMvbW9kdWxlcy9lczYub2JqZWN0LmFzc2lnbi5qc1xuICoqIG1vZHVsZSBpZCA9IDI1M1xuICoqIG1vZHVsZSBjaHVua3MgPSAyNFxuICoqLyJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=");

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

	eval("// 19.1.2.1 Object.assign(target, source, ...)\nvar $        = __webpack_require__(215)\n  , toObject = __webpack_require__(234)\n  , IObject  = __webpack_require__(237);\n\n// should work with symbols and should have deterministic property order (V8 bug)\nmodule.exports = __webpack_require__(222)(function(){\n  var a = Object.assign\n    , A = {}\n    , B = {}\n    , S = Symbol()\n    , K = 'abcdefghijklmnopqrst';\n  A[S] = 7;\n  K.split('').forEach(function(k){ B[k] = k; });\n  return a({}, A)[S] != 7 || Object.keys(a({}, B)).join('') != K;\n}) ? function assign(target, source){ // eslint-disable-line no-unused-vars\n  var T     = toObject(target)\n    , $$    = arguments\n    , $$len = $$.length\n    , index = 1\n    , getKeys    = $.getKeys\n    , getSymbols = $.getSymbols\n    , isEnum     = $.isEnum;\n  while($$len > index){\n    var S      = IObject($$[index++])\n      , keys   = getSymbols ? getKeys(S).concat(getSymbols(S)) : getKeys(S)\n      , length = keys.length\n      , j      = 0\n      , key;\n    while(length > j)if(isEnum.call(S, key = keys[j++]))T[key] = S[key];\n  }\n  return T;\n} : Object.assign;\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjU0LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvJC5vYmplY3QtYXNzaWduLmpzP2JmZGUiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gMTkuMS4yLjEgT2JqZWN0LmFzc2lnbih0YXJnZXQsIHNvdXJjZSwgLi4uKVxudmFyICQgICAgICAgID0gcmVxdWlyZSgnLi8kJylcbiAgLCB0b09iamVjdCA9IHJlcXVpcmUoJy4vJC50by1vYmplY3QnKVxuICAsIElPYmplY3QgID0gcmVxdWlyZSgnLi8kLmlvYmplY3QnKTtcblxuLy8gc2hvdWxkIHdvcmsgd2l0aCBzeW1ib2xzIGFuZCBzaG91bGQgaGF2ZSBkZXRlcm1pbmlzdGljIHByb3BlcnR5IG9yZGVyIChWOCBidWcpXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vJC5mYWlscycpKGZ1bmN0aW9uKCl7XG4gIHZhciBhID0gT2JqZWN0LmFzc2lnblxuICAgICwgQSA9IHt9XG4gICAgLCBCID0ge31cbiAgICAsIFMgPSBTeW1ib2woKVxuICAgICwgSyA9ICdhYmNkZWZnaGlqa2xtbm9wcXJzdCc7XG4gIEFbU10gPSA3O1xuICBLLnNwbGl0KCcnKS5mb3JFYWNoKGZ1bmN0aW9uKGspeyBCW2tdID0gazsgfSk7XG4gIHJldHVybiBhKHt9LCBBKVtTXSAhPSA3IHx8IE9iamVjdC5rZXlzKGEoe30sIEIpKS5qb2luKCcnKSAhPSBLO1xufSkgPyBmdW5jdGlvbiBhc3NpZ24odGFyZ2V0LCBzb3VyY2UpeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVudXNlZC12YXJzXG4gIHZhciBUICAgICA9IHRvT2JqZWN0KHRhcmdldClcbiAgICAsICQkICAgID0gYXJndW1lbnRzXG4gICAgLCAkJGxlbiA9ICQkLmxlbmd0aFxuICAgICwgaW5kZXggPSAxXG4gICAgLCBnZXRLZXlzICAgID0gJC5nZXRLZXlzXG4gICAgLCBnZXRTeW1ib2xzID0gJC5nZXRTeW1ib2xzXG4gICAgLCBpc0VudW0gICAgID0gJC5pc0VudW07XG4gIHdoaWxlKCQkbGVuID4gaW5kZXgpe1xuICAgIHZhciBTICAgICAgPSBJT2JqZWN0KCQkW2luZGV4KytdKVxuICAgICAgLCBrZXlzICAgPSBnZXRTeW1ib2xzID8gZ2V0S2V5cyhTKS5jb25jYXQoZ2V0U3ltYm9scyhTKSkgOiBnZXRLZXlzKFMpXG4gICAgICAsIGxlbmd0aCA9IGtleXMubGVuZ3RoXG4gICAgICAsIGogICAgICA9IDBcbiAgICAgICwga2V5O1xuICAgIHdoaWxlKGxlbmd0aCA+IGopaWYoaXNFbnVtLmNhbGwoUywga2V5ID0ga2V5c1tqKytdKSlUW2tleV0gPSBTW2tleV07XG4gIH1cbiAgcmV0dXJuIFQ7XG59IDogT2JqZWN0LmFzc2lnbjtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9jb3JlLWpzL21vZHVsZXMvJC5vYmplY3QtYXNzaWduLmpzXG4gKiogbW9kdWxlIGlkID0gMjU0XG4gKiogbW9kdWxlIGNodW5rcyA9IDI0XG4gKiovIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=");

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

	eval("// 19.1.3.10 Object.is(value1, value2)\nvar $export = __webpack_require__(216);\n$export($export.S, 'Object', {is: __webpack_require__(256)});\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjU1LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvZXM2Lm9iamVjdC5pcy5qcz9hZjczIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIDE5LjEuMy4xMCBPYmplY3QuaXModmFsdWUxLCB2YWx1ZTIpXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vJC5leHBvcnQnKTtcbiRleHBvcnQoJGV4cG9ydC5TLCAnT2JqZWN0Jywge2lzOiByZXF1aXJlKCcuLyQuc2FtZS12YWx1ZScpfSk7XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vY29yZS1qcy9tb2R1bGVzL2VzNi5vYmplY3QuaXMuanNcbiAqKiBtb2R1bGUgaWQgPSAyNTVcbiAqKiBtb2R1bGUgY2h1bmtzID0gMjRcbiAqKi8iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");

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

	eval("// 7.2.9 SameValue(x, y)\nmodule.exports = Object.is || function is(x, y){\n  return x === y ? x !== 0 || 1 / x === 1 / y : x != x && y != y;\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjU2LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvJC5zYW1lLXZhbHVlLmpzPzc5YjciXSwic291cmNlc0NvbnRlbnQiOlsiLy8gNy4yLjkgU2FtZVZhbHVlKHgsIHkpXG5tb2R1bGUuZXhwb3J0cyA9IE9iamVjdC5pcyB8fCBmdW5jdGlvbiBpcyh4LCB5KXtcbiAgcmV0dXJuIHggPT09IHkgPyB4ICE9PSAwIHx8IDEgLyB4ID09PSAxIC8geSA6IHggIT0geCAmJiB5ICE9IHk7XG59O1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2NvcmUtanMvbW9kdWxlcy8kLnNhbWUtdmFsdWUuanNcbiAqKiBtb2R1bGUgaWQgPSAyNTZcbiAqKiBtb2R1bGUgY2h1bmtzID0gMjRcbiAqKi8iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");

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

	eval("// 19.1.3.19 Object.setPrototypeOf(O, proto)\nvar $export = __webpack_require__(216);\n$export($export.S, 'Object', {setPrototypeOf: __webpack_require__(258).set});\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjU3LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvZXM2Lm9iamVjdC5zZXQtcHJvdG90eXBlLW9mLmpzP2M1NWUiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gMTkuMS4zLjE5IE9iamVjdC5zZXRQcm90b3R5cGVPZihPLCBwcm90bylcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi8kLmV4cG9ydCcpO1xuJGV4cG9ydCgkZXhwb3J0LlMsICdPYmplY3QnLCB7c2V0UHJvdG90eXBlT2Y6IHJlcXVpcmUoJy4vJC5zZXQtcHJvdG8nKS5zZXR9KTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9jb3JlLWpzL21vZHVsZXMvZXM2Lm9iamVjdC5zZXQtcHJvdG90eXBlLW9mLmpzXG4gKiogbW9kdWxlIGlkID0gMjU3XG4gKiogbW9kdWxlIGNodW5rcyA9IDI0XG4gKiovIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=");

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

	eval("// Works with __proto__ only. Old v8 can't work with null proto objects.\n/* eslint-disable no-proto */\nvar getDesc  = __webpack_require__(215).getDesc\n  , isObject = __webpack_require__(229)\n  , anObject = __webpack_require__(233);\nvar check = function(O, proto){\n  anObject(O);\n  if(!isObject(proto) && proto !== null)throw TypeError(proto + \": can't set as prototype!\");\n};\nmodule.exports = {\n  set: Object.setPrototypeOf || ('__proto__' in {} ? // eslint-disable-line\n    function(test, buggy, set){\n      try {\n        set = __webpack_require__(225)(Function.call, getDesc(Object.prototype, '__proto__').set, 2);\n        set(test, []);\n        buggy = !(test instanceof Array);\n      } catch(e){ buggy = true; }\n      return function setPrototypeOf(O, proto){\n        check(O, proto);\n        if(buggy)O.__proto__ = proto;\n        else set(O, proto);\n        return O;\n      };\n    }({}, false) : undefined),\n  check: check\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjU4LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvJC5zZXQtcHJvdG8uanM/NDhmNCJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBXb3JrcyB3aXRoIF9fcHJvdG9fXyBvbmx5LiBPbGQgdjggY2FuJ3Qgd29yayB3aXRoIG51bGwgcHJvdG8gb2JqZWN0cy5cbi8qIGVzbGludC1kaXNhYmxlIG5vLXByb3RvICovXG52YXIgZ2V0RGVzYyAgPSByZXF1aXJlKCcuLyQnKS5nZXREZXNjXG4gICwgaXNPYmplY3QgPSByZXF1aXJlKCcuLyQuaXMtb2JqZWN0JylcbiAgLCBhbk9iamVjdCA9IHJlcXVpcmUoJy4vJC5hbi1vYmplY3QnKTtcbnZhciBjaGVjayA9IGZ1bmN0aW9uKE8sIHByb3RvKXtcbiAgYW5PYmplY3QoTyk7XG4gIGlmKCFpc09iamVjdChwcm90bykgJiYgcHJvdG8gIT09IG51bGwpdGhyb3cgVHlwZUVycm9yKHByb3RvICsgXCI6IGNhbid0IHNldCBhcyBwcm90b3R5cGUhXCIpO1xufTtcbm1vZHVsZS5leHBvcnRzID0ge1xuICBzZXQ6IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fCAoJ19fcHJvdG9fXycgaW4ge30gPyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lXG4gICAgZnVuY3Rpb24odGVzdCwgYnVnZ3ksIHNldCl7XG4gICAgICB0cnkge1xuICAgICAgICBzZXQgPSByZXF1aXJlKCcuLyQuY3R4JykoRnVuY3Rpb24uY2FsbCwgZ2V0RGVzYyhPYmplY3QucHJvdG90eXBlLCAnX19wcm90b19fJykuc2V0LCAyKTtcbiAgICAgICAgc2V0KHRlc3QsIFtdKTtcbiAgICAgICAgYnVnZ3kgPSAhKHRlc3QgaW5zdGFuY2VvZiBBcnJheSk7XG4gICAgICB9IGNhdGNoKGUpeyBidWdneSA9IHRydWU7IH1cbiAgICAgIHJldHVybiBmdW5jdGlvbiBzZXRQcm90b3R5cGVPZihPLCBwcm90byl7XG4gICAgICAgIGNoZWNrKE8sIHByb3RvKTtcbiAgICAgICAgaWYoYnVnZ3kpTy5fX3Byb3RvX18gPSBwcm90bztcbiAgICAgICAgZWxzZSBzZXQoTywgcHJvdG8pO1xuICAgICAgICByZXR1cm4gTztcbiAgICAgIH07XG4gICAgfSh7fSwgZmFsc2UpIDogdW5kZWZpbmVkKSxcbiAgY2hlY2s6IGNoZWNrXG59O1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2NvcmUtanMvbW9kdWxlcy8kLnNldC1wcm90by5qc1xuICoqIG1vZHVsZSBpZCA9IDI1OFxuICoqIG1vZHVsZSBjaHVua3MgPSAyNFxuICoqLyJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");

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

	eval("'use strict';\n// 19.1.3.6 Object.prototype.toString()\nvar classof = __webpack_require__(260)\n  , test    = {};\ntest[__webpack_require__(244)('toStringTag')] = 'z';\nif(test + '' != '[object z]'){\n  __webpack_require__(223)(Object.prototype, 'toString', function toString(){\n    return '[object ' + classof(this) + ']';\n  }, true);\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjU5LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvZXM2Lm9iamVjdC50by1zdHJpbmcuanM/NDE1NiJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG4vLyAxOS4xLjMuNiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nKClcbnZhciBjbGFzc29mID0gcmVxdWlyZSgnLi8kLmNsYXNzb2YnKVxuICAsIHRlc3QgICAgPSB7fTtcbnRlc3RbcmVxdWlyZSgnLi8kLndrcycpKCd0b1N0cmluZ1RhZycpXSA9ICd6JztcbmlmKHRlc3QgKyAnJyAhPSAnW29iamVjdCB6XScpe1xuICByZXF1aXJlKCcuLyQucmVkZWZpbmUnKShPYmplY3QucHJvdG90eXBlLCAndG9TdHJpbmcnLCBmdW5jdGlvbiB0b1N0cmluZygpe1xuICAgIHJldHVybiAnW29iamVjdCAnICsgY2xhc3NvZih0aGlzKSArICddJztcbiAgfSwgdHJ1ZSk7XG59XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vY29yZS1qcy9tb2R1bGVzL2VzNi5vYmplY3QudG8tc3RyaW5nLmpzXG4gKiogbW9kdWxlIGlkID0gMjU5XG4gKiogbW9kdWxlIGNodW5rcyA9IDI0XG4gKiovIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");

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

	eval("// getting tag from 19.1.3.6 Object.prototype.toString()\nvar cof = __webpack_require__(231)\n  , TAG = __webpack_require__(244)('toStringTag')\n  // ES3 wrong here\n  , ARG = cof(function(){ return arguments; }()) == 'Arguments';\n\nmodule.exports = function(it){\n  var O, T, B;\n  return it === undefined ? 'Undefined' : it === null ? 'Null'\n    // @@toStringTag case\n    : typeof (T = (O = Object(it))[TAG]) == 'string' ? T\n    // builtinTag case\n    : ARG ? cof(O)\n    // ES3 arguments fallback\n    : (B = cof(O)) == 'Object' && typeof O.callee == 'function' ? 'Arguments' : B;\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjYwLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvJC5jbGFzc29mLmpzPzU1MzMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gZ2V0dGluZyB0YWcgZnJvbSAxOS4xLjMuNiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nKClcbnZhciBjb2YgPSByZXF1aXJlKCcuLyQuY29mJylcbiAgLCBUQUcgPSByZXF1aXJlKCcuLyQud2tzJykoJ3RvU3RyaW5nVGFnJylcbiAgLy8gRVMzIHdyb25nIGhlcmVcbiAgLCBBUkcgPSBjb2YoZnVuY3Rpb24oKXsgcmV0dXJuIGFyZ3VtZW50czsgfSgpKSA9PSAnQXJndW1lbnRzJztcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihpdCl7XG4gIHZhciBPLCBULCBCO1xuICByZXR1cm4gaXQgPT09IHVuZGVmaW5lZCA/ICdVbmRlZmluZWQnIDogaXQgPT09IG51bGwgPyAnTnVsbCdcbiAgICAvLyBAQHRvU3RyaW5nVGFnIGNhc2VcbiAgICA6IHR5cGVvZiAoVCA9IChPID0gT2JqZWN0KGl0KSlbVEFHXSkgPT0gJ3N0cmluZycgPyBUXG4gICAgLy8gYnVpbHRpblRhZyBjYXNlXG4gICAgOiBBUkcgPyBjb2YoTylcbiAgICAvLyBFUzMgYXJndW1lbnRzIGZhbGxiYWNrXG4gICAgOiAoQiA9IGNvZihPKSkgPT0gJ09iamVjdCcgJiYgdHlwZW9mIE8uY2FsbGVlID09ICdmdW5jdGlvbicgPyAnQXJndW1lbnRzJyA6IEI7XG59O1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2NvcmUtanMvbW9kdWxlcy8kLmNsYXNzb2YuanNcbiAqKiBtb2R1bGUgaWQgPSAyNjBcbiAqKiBtb2R1bGUgY2h1bmtzID0gMjRcbiAqKi8iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");

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

	eval("// 19.1.2.5 Object.freeze(O)\nvar isObject = __webpack_require__(229);\n\n__webpack_require__(262)('freeze', function($freeze){\n  return function freeze(it){\n    return $freeze && isObject(it) ? $freeze(it) : it;\n  };\n});\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjYxLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvZXM2Lm9iamVjdC5mcmVlemUuanM/NDY4ZSJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyAxOS4xLjIuNSBPYmplY3QuZnJlZXplKE8pXG52YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuLyQuaXMtb2JqZWN0Jyk7XG5cbnJlcXVpcmUoJy4vJC5vYmplY3Qtc2FwJykoJ2ZyZWV6ZScsIGZ1bmN0aW9uKCRmcmVlemUpe1xuICByZXR1cm4gZnVuY3Rpb24gZnJlZXplKGl0KXtcbiAgICByZXR1cm4gJGZyZWV6ZSAmJiBpc09iamVjdChpdCkgPyAkZnJlZXplKGl0KSA6IGl0O1xuICB9O1xufSk7XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vY29yZS1qcy9tb2R1bGVzL2VzNi5vYmplY3QuZnJlZXplLmpzXG4gKiogbW9kdWxlIGlkID0gMjYxXG4gKiogbW9kdWxlIGNodW5rcyA9IDI0XG4gKiovIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");

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

	eval("// most Object methods by ES6 should accept primitives\nvar $export = __webpack_require__(216)\n  , core    = __webpack_require__(218)\n  , fails   = __webpack_require__(222);\nmodule.exports = function(KEY, exec){\n  var fn  = (core.Object || {})[KEY] || Object[KEY]\n    , exp = {};\n  exp[KEY] = exec(fn);\n  $export($export.S + $export.F * fails(function(){ fn(1); }), 'Object', exp);\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjYyLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvJC5vYmplY3Qtc2FwLmpzPzM2YmUiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gbW9zdCBPYmplY3QgbWV0aG9kcyBieSBFUzYgc2hvdWxkIGFjY2VwdCBwcmltaXRpdmVzXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vJC5leHBvcnQnKVxuICAsIGNvcmUgICAgPSByZXF1aXJlKCcuLyQuY29yZScpXG4gICwgZmFpbHMgICA9IHJlcXVpcmUoJy4vJC5mYWlscycpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihLRVksIGV4ZWMpe1xuICB2YXIgZm4gID0gKGNvcmUuT2JqZWN0IHx8IHt9KVtLRVldIHx8IE9iamVjdFtLRVldXG4gICAgLCBleHAgPSB7fTtcbiAgZXhwW0tFWV0gPSBleGVjKGZuKTtcbiAgJGV4cG9ydCgkZXhwb3J0LlMgKyAkZXhwb3J0LkYgKiBmYWlscyhmdW5jdGlvbigpeyBmbigxKTsgfSksICdPYmplY3QnLCBleHApO1xufTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9jb3JlLWpzL21vZHVsZXMvJC5vYmplY3Qtc2FwLmpzXG4gKiogbW9kdWxlIGlkID0gMjYyXG4gKiogbW9kdWxlIGNodW5rcyA9IDI0XG4gKiovIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");

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

	eval("// 19.1.2.17 Object.seal(O)\nvar isObject = __webpack_require__(229);\n\n__webpack_require__(262)('seal', function($seal){\n  return function seal(it){\n    return $seal && isObject(it) ? $seal(it) : it;\n  };\n});\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjYzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvZXM2Lm9iamVjdC5zZWFsLmpzPzA1YjQiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gMTkuMS4yLjE3IE9iamVjdC5zZWFsKE8pXG52YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuLyQuaXMtb2JqZWN0Jyk7XG5cbnJlcXVpcmUoJy4vJC5vYmplY3Qtc2FwJykoJ3NlYWwnLCBmdW5jdGlvbigkc2VhbCl7XG4gIHJldHVybiBmdW5jdGlvbiBzZWFsKGl0KXtcbiAgICByZXR1cm4gJHNlYWwgJiYgaXNPYmplY3QoaXQpID8gJHNlYWwoaXQpIDogaXQ7XG4gIH07XG59KTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9jb3JlLWpzL21vZHVsZXMvZXM2Lm9iamVjdC5zZWFsLmpzXG4gKiogbW9kdWxlIGlkID0gMjYzXG4gKiogbW9kdWxlIGNodW5rcyA9IDI0XG4gKiovIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");

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

	eval("// 19.1.2.15 Object.preventExtensions(O)\nvar isObject = __webpack_require__(229);\n\n__webpack_require__(262)('preventExtensions', function($preventExtensions){\n  return function preventExtensions(it){\n    return $preventExtensions && isObject(it) ? $preventExtensions(it) : it;\n  };\n});\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjY0LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvZXM2Lm9iamVjdC5wcmV2ZW50LWV4dGVuc2lvbnMuanM/YjdlNiJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyAxOS4xLjIuMTUgT2JqZWN0LnByZXZlbnRFeHRlbnNpb25zKE8pXG52YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuLyQuaXMtb2JqZWN0Jyk7XG5cbnJlcXVpcmUoJy4vJC5vYmplY3Qtc2FwJykoJ3ByZXZlbnRFeHRlbnNpb25zJywgZnVuY3Rpb24oJHByZXZlbnRFeHRlbnNpb25zKXtcbiAgcmV0dXJuIGZ1bmN0aW9uIHByZXZlbnRFeHRlbnNpb25zKGl0KXtcbiAgICByZXR1cm4gJHByZXZlbnRFeHRlbnNpb25zICYmIGlzT2JqZWN0KGl0KSA/ICRwcmV2ZW50RXh0ZW5zaW9ucyhpdCkgOiBpdDtcbiAgfTtcbn0pO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2NvcmUtanMvbW9kdWxlcy9lczYub2JqZWN0LnByZXZlbnQtZXh0ZW5zaW9ucy5qc1xuICoqIG1vZHVsZSBpZCA9IDI2NFxuICoqIG1vZHVsZSBjaHVua3MgPSAyNFxuICoqLyJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");

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

	eval("// 19.1.2.12 Object.isFrozen(O)\nvar isObject = __webpack_require__(229);\n\n__webpack_require__(262)('isFrozen', function($isFrozen){\n  return function isFrozen(it){\n    return isObject(it) ? $isFrozen ? $isFrozen(it) : false : true;\n  };\n});\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjY1LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvZXM2Lm9iamVjdC5pcy1mcm96ZW4uanM/ZGFhYSJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyAxOS4xLjIuMTIgT2JqZWN0LmlzRnJvemVuKE8pXG52YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuLyQuaXMtb2JqZWN0Jyk7XG5cbnJlcXVpcmUoJy4vJC5vYmplY3Qtc2FwJykoJ2lzRnJvemVuJywgZnVuY3Rpb24oJGlzRnJvemVuKXtcbiAgcmV0dXJuIGZ1bmN0aW9uIGlzRnJvemVuKGl0KXtcbiAgICByZXR1cm4gaXNPYmplY3QoaXQpID8gJGlzRnJvemVuID8gJGlzRnJvemVuKGl0KSA6IGZhbHNlIDogdHJ1ZTtcbiAgfTtcbn0pO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2NvcmUtanMvbW9kdWxlcy9lczYub2JqZWN0LmlzLWZyb3plbi5qc1xuICoqIG1vZHVsZSBpZCA9IDI2NVxuICoqIG1vZHVsZSBjaHVua3MgPSAyNFxuICoqLyJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");

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

	eval("// 19.1.2.13 Object.isSealed(O)\nvar isObject = __webpack_require__(229);\n\n__webpack_require__(262)('isSealed', function($isSealed){\n  return function isSealed(it){\n    return isObject(it) ? $isSealed ? $isSealed(it) : false : true;\n  };\n});\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjY2LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvZXM2Lm9iamVjdC5pcy1zZWFsZWQuanM/NmY1NCJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyAxOS4xLjIuMTMgT2JqZWN0LmlzU2VhbGVkKE8pXG52YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuLyQuaXMtb2JqZWN0Jyk7XG5cbnJlcXVpcmUoJy4vJC5vYmplY3Qtc2FwJykoJ2lzU2VhbGVkJywgZnVuY3Rpb24oJGlzU2VhbGVkKXtcbiAgcmV0dXJuIGZ1bmN0aW9uIGlzU2VhbGVkKGl0KXtcbiAgICByZXR1cm4gaXNPYmplY3QoaXQpID8gJGlzU2VhbGVkID8gJGlzU2VhbGVkKGl0KSA6IGZhbHNlIDogdHJ1ZTtcbiAgfTtcbn0pO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2NvcmUtanMvbW9kdWxlcy9lczYub2JqZWN0LmlzLXNlYWxlZC5qc1xuICoqIG1vZHVsZSBpZCA9IDI2NlxuICoqIG1vZHVsZSBjaHVua3MgPSAyNFxuICoqLyJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");

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

	eval("// 19.1.2.11 Object.isExtensible(O)\nvar isObject = __webpack_require__(229);\n\n__webpack_require__(262)('isExtensible', function($isExtensible){\n  return function isExtensible(it){\n    return isObject(it) ? $isExtensible ? $isExtensible(it) : true : false;\n  };\n});\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjY3LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvZXM2Lm9iamVjdC5pcy1leHRlbnNpYmxlLmpzP2VkODEiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gMTkuMS4yLjExIE9iamVjdC5pc0V4dGVuc2libGUoTylcbnZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4vJC5pcy1vYmplY3QnKTtcblxucmVxdWlyZSgnLi8kLm9iamVjdC1zYXAnKSgnaXNFeHRlbnNpYmxlJywgZnVuY3Rpb24oJGlzRXh0ZW5zaWJsZSl7XG4gIHJldHVybiBmdW5jdGlvbiBpc0V4dGVuc2libGUoaXQpe1xuICAgIHJldHVybiBpc09iamVjdChpdCkgPyAkaXNFeHRlbnNpYmxlID8gJGlzRXh0ZW5zaWJsZShpdCkgOiB0cnVlIDogZmFsc2U7XG4gIH07XG59KTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9jb3JlLWpzL21vZHVsZXMvZXM2Lm9iamVjdC5pcy1leHRlbnNpYmxlLmpzXG4gKiogbW9kdWxlIGlkID0gMjY3XG4gKiogbW9kdWxlIGNodW5rcyA9IDI0XG4gKiovIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");

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

	eval("// 19.1.2.6 Object.getOwnPropertyDescriptor(O, P)\nvar toIObject = __webpack_require__(236);\n\n__webpack_require__(262)('getOwnPropertyDescriptor', function($getOwnPropertyDescriptor){\n  return function getOwnPropertyDescriptor(it, key){\n    return $getOwnPropertyDescriptor(toIObject(it), key);\n  };\n});\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjY4LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvZXM2Lm9iamVjdC5nZXQtb3duLXByb3BlcnR5LWRlc2NyaXB0b3IuanM/ZmFiNiJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyAxOS4xLjIuNiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKE8sIFApXG52YXIgdG9JT2JqZWN0ID0gcmVxdWlyZSgnLi8kLnRvLWlvYmplY3QnKTtcblxucmVxdWlyZSgnLi8kLm9iamVjdC1zYXAnKSgnZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yJywgZnVuY3Rpb24oJGdldE93blByb3BlcnR5RGVzY3JpcHRvcil7XG4gIHJldHVybiBmdW5jdGlvbiBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoaXQsIGtleSl7XG4gICAgcmV0dXJuICRnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodG9JT2JqZWN0KGl0KSwga2V5KTtcbiAgfTtcbn0pO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2NvcmUtanMvbW9kdWxlcy9lczYub2JqZWN0LmdldC1vd24tcHJvcGVydHktZGVzY3JpcHRvci5qc1xuICoqIG1vZHVsZSBpZCA9IDI2OFxuICoqIG1vZHVsZSBjaHVua3MgPSAyNFxuICoqLyJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");

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

	eval("// 19.1.2.9 Object.getPrototypeOf(O)\nvar toObject = __webpack_require__(234);\n\n__webpack_require__(262)('getPrototypeOf', function($getPrototypeOf){\n  return function getPrototypeOf(it){\n    return $getPrototypeOf(toObject(it));\n  };\n});\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjY5LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvZXM2Lm9iamVjdC5nZXQtcHJvdG90eXBlLW9mLmpzPzliOGYiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gMTkuMS4yLjkgT2JqZWN0LmdldFByb3RvdHlwZU9mKE8pXG52YXIgdG9PYmplY3QgPSByZXF1aXJlKCcuLyQudG8tb2JqZWN0Jyk7XG5cbnJlcXVpcmUoJy4vJC5vYmplY3Qtc2FwJykoJ2dldFByb3RvdHlwZU9mJywgZnVuY3Rpb24oJGdldFByb3RvdHlwZU9mKXtcbiAgcmV0dXJuIGZ1bmN0aW9uIGdldFByb3RvdHlwZU9mKGl0KXtcbiAgICByZXR1cm4gJGdldFByb3RvdHlwZU9mKHRvT2JqZWN0KGl0KSk7XG4gIH07XG59KTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9jb3JlLWpzL21vZHVsZXMvZXM2Lm9iamVjdC5nZXQtcHJvdG90eXBlLW9mLmpzXG4gKiogbW9kdWxlIGlkID0gMjY5XG4gKiogbW9kdWxlIGNodW5rcyA9IDI0XG4gKiovIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");

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

	eval("// 19.1.2.14 Object.keys(O)\nvar toObject = __webpack_require__(234);\n\n__webpack_require__(262)('keys', function($keys){\n  return function keys(it){\n    return $keys(toObject(it));\n  };\n});\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjcwLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvZXM2Lm9iamVjdC5rZXlzLmpzPzY5NWYiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gMTkuMS4yLjE0IE9iamVjdC5rZXlzKE8pXG52YXIgdG9PYmplY3QgPSByZXF1aXJlKCcuLyQudG8tb2JqZWN0Jyk7XG5cbnJlcXVpcmUoJy4vJC5vYmplY3Qtc2FwJykoJ2tleXMnLCBmdW5jdGlvbigka2V5cyl7XG4gIHJldHVybiBmdW5jdGlvbiBrZXlzKGl0KXtcbiAgICByZXR1cm4gJGtleXModG9PYmplY3QoaXQpKTtcbiAgfTtcbn0pO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2NvcmUtanMvbW9kdWxlcy9lczYub2JqZWN0LmtleXMuanNcbiAqKiBtb2R1bGUgaWQgPSAyNzBcbiAqKiBtb2R1bGUgY2h1bmtzID0gMjRcbiAqKi8iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=");

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

	eval("// 19.1.2.7 Object.getOwnPropertyNames(O)\n__webpack_require__(262)('getOwnPropertyNames', function(){\n  return __webpack_require__(250).get;\n});\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjcxLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvZXM2Lm9iamVjdC5nZXQtb3duLXByb3BlcnR5LW5hbWVzLmpzPzk4YzUiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gMTkuMS4yLjcgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoTylcbnJlcXVpcmUoJy4vJC5vYmplY3Qtc2FwJykoJ2dldE93blByb3BlcnR5TmFtZXMnLCBmdW5jdGlvbigpe1xuICByZXR1cm4gcmVxdWlyZSgnLi8kLmdldC1uYW1lcycpLmdldDtcbn0pO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2NvcmUtanMvbW9kdWxlcy9lczYub2JqZWN0LmdldC1vd24tcHJvcGVydHktbmFtZXMuanNcbiAqKiBtb2R1bGUgaWQgPSAyNzFcbiAqKiBtb2R1bGUgY2h1bmtzID0gMjRcbiAqKi8iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");

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

	eval("var setDesc    = __webpack_require__(215).setDesc\n  , createDesc = __webpack_require__(220)\n  , has        = __webpack_require__(230)\n  , FProto     = Function.prototype\n  , nameRE     = /^\\s*function ([^ (]*)/\n  , NAME       = 'name';\n// 19.2.4.2 name\nNAME in FProto || __webpack_require__(221) && setDesc(FProto, NAME, {\n  configurable: true,\n  get: function(){\n    var match = ('' + this).match(nameRE)\n      , name  = match ? match[1] : '';\n    has(this, NAME) || setDesc(this, NAME, createDesc(5, name));\n    return name;\n  }\n});\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjcyLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvZXM2LmZ1bmN0aW9uLm5hbWUuanM/OWQ3MSJdLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgc2V0RGVzYyAgICA9IHJlcXVpcmUoJy4vJCcpLnNldERlc2NcbiAgLCBjcmVhdGVEZXNjID0gcmVxdWlyZSgnLi8kLnByb3BlcnR5LWRlc2MnKVxuICAsIGhhcyAgICAgICAgPSByZXF1aXJlKCcuLyQuaGFzJylcbiAgLCBGUHJvdG8gICAgID0gRnVuY3Rpb24ucHJvdG90eXBlXG4gICwgbmFtZVJFICAgICA9IC9eXFxzKmZ1bmN0aW9uIChbXiAoXSopL1xuICAsIE5BTUUgICAgICAgPSAnbmFtZSc7XG4vLyAxOS4yLjQuMiBuYW1lXG5OQU1FIGluIEZQcm90byB8fCByZXF1aXJlKCcuLyQuZGVzY3JpcHRvcnMnKSAmJiBzZXREZXNjKEZQcm90bywgTkFNRSwge1xuICBjb25maWd1cmFibGU6IHRydWUsXG4gIGdldDogZnVuY3Rpb24oKXtcbiAgICB2YXIgbWF0Y2ggPSAoJycgKyB0aGlzKS5tYXRjaChuYW1lUkUpXG4gICAgICAsIG5hbWUgID0gbWF0Y2ggPyBtYXRjaFsxXSA6ICcnO1xuICAgIGhhcyh0aGlzLCBOQU1FKSB8fCBzZXREZXNjKHRoaXMsIE5BTUUsIGNyZWF0ZURlc2MoNSwgbmFtZSkpO1xuICAgIHJldHVybiBuYW1lO1xuICB9XG59KTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9jb3JlLWpzL21vZHVsZXMvZXM2LmZ1bmN0aW9uLm5hbWUuanNcbiAqKiBtb2R1bGUgaWQgPSAyNzJcbiAqKiBtb2R1bGUgY2h1bmtzID0gMjRcbiAqKi8iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");

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

	eval("'use strict';\nvar $             = __webpack_require__(215)\n  , isObject      = __webpack_require__(229)\n  , HAS_INSTANCE  = __webpack_require__(244)('hasInstance')\n  , FunctionProto = Function.prototype;\n// 19.2.3.6 Function.prototype[@@hasInstance](V)\nif(!(HAS_INSTANCE in FunctionProto))$.setDesc(FunctionProto, HAS_INSTANCE, {value: function(O){\n  if(typeof this != 'function' || !isObject(O))return false;\n  if(!isObject(this.prototype))return O instanceof this;\n  // for environment w/o native `@@hasInstance` logic enough `instanceof`, but add this:\n  while(O = $.getProto(O))if(this.prototype === O)return true;\n  return false;\n}});\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjczLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvZXM2LmZ1bmN0aW9uLmhhcy1pbnN0YW5jZS5qcz80OGU3Il0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcbnZhciAkICAgICAgICAgICAgID0gcmVxdWlyZSgnLi8kJylcbiAgLCBpc09iamVjdCAgICAgID0gcmVxdWlyZSgnLi8kLmlzLW9iamVjdCcpXG4gICwgSEFTX0lOU1RBTkNFICA9IHJlcXVpcmUoJy4vJC53a3MnKSgnaGFzSW5zdGFuY2UnKVxuICAsIEZ1bmN0aW9uUHJvdG8gPSBGdW5jdGlvbi5wcm90b3R5cGU7XG4vLyAxOS4yLjMuNiBGdW5jdGlvbi5wcm90b3R5cGVbQEBoYXNJbnN0YW5jZV0oVilcbmlmKCEoSEFTX0lOU1RBTkNFIGluIEZ1bmN0aW9uUHJvdG8pKSQuc2V0RGVzYyhGdW5jdGlvblByb3RvLCBIQVNfSU5TVEFOQ0UsIHt2YWx1ZTogZnVuY3Rpb24oTyl7XG4gIGlmKHR5cGVvZiB0aGlzICE9ICdmdW5jdGlvbicgfHwgIWlzT2JqZWN0KE8pKXJldHVybiBmYWxzZTtcbiAgaWYoIWlzT2JqZWN0KHRoaXMucHJvdG90eXBlKSlyZXR1cm4gTyBpbnN0YW5jZW9mIHRoaXM7XG4gIC8vIGZvciBlbnZpcm9ubWVudCB3L28gbmF0aXZlIGBAQGhhc0luc3RhbmNlYCBsb2dpYyBlbm91Z2ggYGluc3RhbmNlb2ZgLCBidXQgYWRkIHRoaXM6XG4gIHdoaWxlKE8gPSAkLmdldFByb3RvKE8pKWlmKHRoaXMucHJvdG90eXBlID09PSBPKXJldHVybiB0cnVlO1xuICByZXR1cm4gZmFsc2U7XG59fSk7XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vY29yZS1qcy9tb2R1bGVzL2VzNi5mdW5jdGlvbi5oYXMtaW5zdGFuY2UuanNcbiAqKiBtb2R1bGUgaWQgPSAyNzNcbiAqKiBtb2R1bGUgY2h1bmtzID0gMjRcbiAqKi8iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");

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

	eval("'use strict';\nvar $           = __webpack_require__(215)\n  , global      = __webpack_require__(217)\n  , has         = __webpack_require__(230)\n  , cof         = __webpack_require__(231)\n  , toPrimitive = __webpack_require__(275)\n  , fails       = __webpack_require__(222)\n  , $trim       = __webpack_require__(276).trim\n  , NUMBER      = 'Number'\n  , $Number     = global[NUMBER]\n  , Base        = $Number\n  , proto       = $Number.prototype\n  // Opera ~12 has broken Object#toString\n  , BROKEN_COF  = cof($.create(proto)) == NUMBER\n  , TRIM        = 'trim' in String.prototype;\n\n// 7.1.3 ToNumber(argument)\nvar toNumber = function(argument){\n  var it = toPrimitive(argument, false);\n  if(typeof it == 'string' && it.length > 2){\n    it = TRIM ? it.trim() : $trim(it, 3);\n    var first = it.charCodeAt(0)\n      , third, radix, maxCode;\n    if(first === 43 || first === 45){\n      third = it.charCodeAt(2);\n      if(third === 88 || third === 120)return NaN; // Number('+0x1') should be NaN, old V8 fix\n    } else if(first === 48){\n      switch(it.charCodeAt(1)){\n        case 66 : case 98  : radix = 2; maxCode = 49; break; // fast equal /^0b[01]+$/i\n        case 79 : case 111 : radix = 8; maxCode = 55; break; // fast equal /^0o[0-7]+$/i\n        default : return +it;\n      }\n      for(var digits = it.slice(2), i = 0, l = digits.length, code; i < l; i++){\n        code = digits.charCodeAt(i);\n        // parseInt parses a string to a first unavailable symbol\n        // but ToNumber should return NaN if a string contains unavailable symbols\n        if(code < 48 || code > maxCode)return NaN;\n      } return parseInt(digits, radix);\n    }\n  } return +it;\n};\n\nif(!$Number(' 0o1') || !$Number('0b1') || $Number('+0x1')){\n  $Number = function Number(value){\n    var it = arguments.length < 1 ? 0 : value\n      , that = this;\n    return that instanceof $Number\n      // check on 1..constructor(foo) case\n      && (BROKEN_COF ? fails(function(){ proto.valueOf.call(that); }) : cof(that) != NUMBER)\n        ? new Base(toNumber(it)) : toNumber(it);\n  };\n  $.each.call(__webpack_require__(221) ? $.getNames(Base) : (\n    // ES3:\n    'MAX_VALUE,MIN_VALUE,NaN,NEGATIVE_INFINITY,POSITIVE_INFINITY,' +\n    // ES6 (in case, if modules with ES6 Number statics required before):\n    'EPSILON,isFinite,isInteger,isNaN,isSafeInteger,MAX_SAFE_INTEGER,' +\n    'MIN_SAFE_INTEGER,parseFloat,parseInt,isInteger'\n  ).split(','), function(key){\n    if(has(Base, key) && !has($Number, key)){\n      $.setDesc($Number, key, $.getDesc(Base, key));\n    }\n  });\n  $Number.prototype = proto;\n  proto.constructor = $Number;\n  __webpack_require__(223)(global, NUMBER, $Number);\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjc0LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvZXM2Lm51bWJlci5jb25zdHJ1Y3Rvci5qcz8zOWI4Il0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcbnZhciAkICAgICAgICAgICA9IHJlcXVpcmUoJy4vJCcpXG4gICwgZ2xvYmFsICAgICAgPSByZXF1aXJlKCcuLyQuZ2xvYmFsJylcbiAgLCBoYXMgICAgICAgICA9IHJlcXVpcmUoJy4vJC5oYXMnKVxuICAsIGNvZiAgICAgICAgID0gcmVxdWlyZSgnLi8kLmNvZicpXG4gICwgdG9QcmltaXRpdmUgPSByZXF1aXJlKCcuLyQudG8tcHJpbWl0aXZlJylcbiAgLCBmYWlscyAgICAgICA9IHJlcXVpcmUoJy4vJC5mYWlscycpXG4gICwgJHRyaW0gICAgICAgPSByZXF1aXJlKCcuLyQuc3RyaW5nLXRyaW0nKS50cmltXG4gICwgTlVNQkVSICAgICAgPSAnTnVtYmVyJ1xuICAsICROdW1iZXIgICAgID0gZ2xvYmFsW05VTUJFUl1cbiAgLCBCYXNlICAgICAgICA9ICROdW1iZXJcbiAgLCBwcm90byAgICAgICA9ICROdW1iZXIucHJvdG90eXBlXG4gIC8vIE9wZXJhIH4xMiBoYXMgYnJva2VuIE9iamVjdCN0b1N0cmluZ1xuICAsIEJST0tFTl9DT0YgID0gY29mKCQuY3JlYXRlKHByb3RvKSkgPT0gTlVNQkVSXG4gICwgVFJJTSAgICAgICAgPSAndHJpbScgaW4gU3RyaW5nLnByb3RvdHlwZTtcblxuLy8gNy4xLjMgVG9OdW1iZXIoYXJndW1lbnQpXG52YXIgdG9OdW1iZXIgPSBmdW5jdGlvbihhcmd1bWVudCl7XG4gIHZhciBpdCA9IHRvUHJpbWl0aXZlKGFyZ3VtZW50LCBmYWxzZSk7XG4gIGlmKHR5cGVvZiBpdCA9PSAnc3RyaW5nJyAmJiBpdC5sZW5ndGggPiAyKXtcbiAgICBpdCA9IFRSSU0gPyBpdC50cmltKCkgOiAkdHJpbShpdCwgMyk7XG4gICAgdmFyIGZpcnN0ID0gaXQuY2hhckNvZGVBdCgwKVxuICAgICAgLCB0aGlyZCwgcmFkaXgsIG1heENvZGU7XG4gICAgaWYoZmlyc3QgPT09IDQzIHx8IGZpcnN0ID09PSA0NSl7XG4gICAgICB0aGlyZCA9IGl0LmNoYXJDb2RlQXQoMik7XG4gICAgICBpZih0aGlyZCA9PT0gODggfHwgdGhpcmQgPT09IDEyMClyZXR1cm4gTmFOOyAvLyBOdW1iZXIoJysweDEnKSBzaG91bGQgYmUgTmFOLCBvbGQgVjggZml4XG4gICAgfSBlbHNlIGlmKGZpcnN0ID09PSA0OCl7XG4gICAgICBzd2l0Y2goaXQuY2hhckNvZGVBdCgxKSl7XG4gICAgICAgIGNhc2UgNjYgOiBjYXNlIDk4ICA6IHJhZGl4ID0gMjsgbWF4Q29kZSA9IDQ5OyBicmVhazsgLy8gZmFzdCBlcXVhbCAvXjBiWzAxXSskL2lcbiAgICAgICAgY2FzZSA3OSA6IGNhc2UgMTExIDogcmFkaXggPSA4OyBtYXhDb2RlID0gNTU7IGJyZWFrOyAvLyBmYXN0IGVxdWFsIC9eMG9bMC03XSskL2lcbiAgICAgICAgZGVmYXVsdCA6IHJldHVybiAraXQ7XG4gICAgICB9XG4gICAgICBmb3IodmFyIGRpZ2l0cyA9IGl0LnNsaWNlKDIpLCBpID0gMCwgbCA9IGRpZ2l0cy5sZW5ndGgsIGNvZGU7IGkgPCBsOyBpKyspe1xuICAgICAgICBjb2RlID0gZGlnaXRzLmNoYXJDb2RlQXQoaSk7XG4gICAgICAgIC8vIHBhcnNlSW50IHBhcnNlcyBhIHN0cmluZyB0byBhIGZpcnN0IHVuYXZhaWxhYmxlIHN5bWJvbFxuICAgICAgICAvLyBidXQgVG9OdW1iZXIgc2hvdWxkIHJldHVybiBOYU4gaWYgYSBzdHJpbmcgY29udGFpbnMgdW5hdmFpbGFibGUgc3ltYm9sc1xuICAgICAgICBpZihjb2RlIDwgNDggfHwgY29kZSA+IG1heENvZGUpcmV0dXJuIE5hTjtcbiAgICAgIH0gcmV0dXJuIHBhcnNlSW50KGRpZ2l0cywgcmFkaXgpO1xuICAgIH1cbiAgfSByZXR1cm4gK2l0O1xufTtcblxuaWYoISROdW1iZXIoJyAwbzEnKSB8fCAhJE51bWJlcignMGIxJykgfHwgJE51bWJlcignKzB4MScpKXtcbiAgJE51bWJlciA9IGZ1bmN0aW9uIE51bWJlcih2YWx1ZSl7XG4gICAgdmFyIGl0ID0gYXJndW1lbnRzLmxlbmd0aCA8IDEgPyAwIDogdmFsdWVcbiAgICAgICwgdGhhdCA9IHRoaXM7XG4gICAgcmV0dXJuIHRoYXQgaW5zdGFuY2VvZiAkTnVtYmVyXG4gICAgICAvLyBjaGVjayBvbiAxLi5jb25zdHJ1Y3Rvcihmb28pIGNhc2VcbiAgICAgICYmIChCUk9LRU5fQ09GID8gZmFpbHMoZnVuY3Rpb24oKXsgcHJvdG8udmFsdWVPZi5jYWxsKHRoYXQpOyB9KSA6IGNvZih0aGF0KSAhPSBOVU1CRVIpXG4gICAgICAgID8gbmV3IEJhc2UodG9OdW1iZXIoaXQpKSA6IHRvTnVtYmVyKGl0KTtcbiAgfTtcbiAgJC5lYWNoLmNhbGwocmVxdWlyZSgnLi8kLmRlc2NyaXB0b3JzJykgPyAkLmdldE5hbWVzKEJhc2UpIDogKFxuICAgIC8vIEVTMzpcbiAgICAnTUFYX1ZBTFVFLE1JTl9WQUxVRSxOYU4sTkVHQVRJVkVfSU5GSU5JVFksUE9TSVRJVkVfSU5GSU5JVFksJyArXG4gICAgLy8gRVM2IChpbiBjYXNlLCBpZiBtb2R1bGVzIHdpdGggRVM2IE51bWJlciBzdGF0aWNzIHJlcXVpcmVkIGJlZm9yZSk6XG4gICAgJ0VQU0lMT04saXNGaW5pdGUsaXNJbnRlZ2VyLGlzTmFOLGlzU2FmZUludGVnZXIsTUFYX1NBRkVfSU5URUdFUiwnICtcbiAgICAnTUlOX1NBRkVfSU5URUdFUixwYXJzZUZsb2F0LHBhcnNlSW50LGlzSW50ZWdlcidcbiAgKS5zcGxpdCgnLCcpLCBmdW5jdGlvbihrZXkpe1xuICAgIGlmKGhhcyhCYXNlLCBrZXkpICYmICFoYXMoJE51bWJlciwga2V5KSl7XG4gICAgICAkLnNldERlc2MoJE51bWJlciwga2V5LCAkLmdldERlc2MoQmFzZSwga2V5KSk7XG4gICAgfVxuICB9KTtcbiAgJE51bWJlci5wcm90b3R5cGUgPSBwcm90bztcbiAgcHJvdG8uY29uc3RydWN0b3IgPSAkTnVtYmVyO1xuICByZXF1aXJlKCcuLyQucmVkZWZpbmUnKShnbG9iYWwsIE5VTUJFUiwgJE51bWJlcik7XG59XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vY29yZS1qcy9tb2R1bGVzL2VzNi5udW1iZXIuY29uc3RydWN0b3IuanNcbiAqKiBtb2R1bGUgaWQgPSAyNzRcbiAqKiBtb2R1bGUgY2h1bmtzID0gMjRcbiAqKi8iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");

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

	eval("// 7.1.1 ToPrimitive(input [, PreferredType])\nvar isObject = __webpack_require__(229);\n// instead of the ES6 spec version, we didn't implement @@toPrimitive case\n// and the second argument - flag - preferred type is a string\nmodule.exports = function(it, S){\n  if(!isObject(it))return it;\n  var fn, val;\n  if(S && typeof (fn = it.toString) == 'function' && !isObject(val = fn.call(it)))return val;\n  if(typeof (fn = it.valueOf) == 'function' && !isObject(val = fn.call(it)))return val;\n  if(!S && typeof (fn = it.toString) == 'function' && !isObject(val = fn.call(it)))return val;\n  throw TypeError(\"Can't convert object to primitive value\");\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjc1LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvJC50by1wcmltaXRpdmUuanM/MDMzYiJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyA3LjEuMSBUb1ByaW1pdGl2ZShpbnB1dCBbLCBQcmVmZXJyZWRUeXBlXSlcbnZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4vJC5pcy1vYmplY3QnKTtcbi8vIGluc3RlYWQgb2YgdGhlIEVTNiBzcGVjIHZlcnNpb24sIHdlIGRpZG4ndCBpbXBsZW1lbnQgQEB0b1ByaW1pdGl2ZSBjYXNlXG4vLyBhbmQgdGhlIHNlY29uZCBhcmd1bWVudCAtIGZsYWcgLSBwcmVmZXJyZWQgdHlwZSBpcyBhIHN0cmluZ1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihpdCwgUyl7XG4gIGlmKCFpc09iamVjdChpdCkpcmV0dXJuIGl0O1xuICB2YXIgZm4sIHZhbDtcbiAgaWYoUyAmJiB0eXBlb2YgKGZuID0gaXQudG9TdHJpbmcpID09ICdmdW5jdGlvbicgJiYgIWlzT2JqZWN0KHZhbCA9IGZuLmNhbGwoaXQpKSlyZXR1cm4gdmFsO1xuICBpZih0eXBlb2YgKGZuID0gaXQudmFsdWVPZikgPT0gJ2Z1bmN0aW9uJyAmJiAhaXNPYmplY3QodmFsID0gZm4uY2FsbChpdCkpKXJldHVybiB2YWw7XG4gIGlmKCFTICYmIHR5cGVvZiAoZm4gPSBpdC50b1N0cmluZykgPT0gJ2Z1bmN0aW9uJyAmJiAhaXNPYmplY3QodmFsID0gZm4uY2FsbChpdCkpKXJldHVybiB2YWw7XG4gIHRocm93IFR5cGVFcnJvcihcIkNhbid0IGNvbnZlcnQgb2JqZWN0IHRvIHByaW1pdGl2ZSB2YWx1ZVwiKTtcbn07XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vY29yZS1qcy9tb2R1bGVzLyQudG8tcHJpbWl0aXZlLmpzXG4gKiogbW9kdWxlIGlkID0gMjc1XG4gKiogbW9kdWxlIGNodW5rcyA9IDI0XG4gKiovIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=");

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

	eval("var $export = __webpack_require__(216)\n  , defined = __webpack_require__(235)\n  , fails   = __webpack_require__(222)\n  , spaces  = '\\x09\\x0A\\x0B\\x0C\\x0D\\x20\\xA0\\u1680\\u180E\\u2000\\u2001\\u2002\\u2003' +\n      '\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200A\\u202F\\u205F\\u3000\\u2028\\u2029\\uFEFF'\n  , space   = '[' + spaces + ']'\n  , non     = '\\u200b\\u0085'\n  , ltrim   = RegExp('^' + space + space + '*')\n  , rtrim   = RegExp(space + space + '*$');\n\nvar exporter = function(KEY, exec){\n  var exp  = {};\n  exp[KEY] = exec(trim);\n  $export($export.P + $export.F * fails(function(){\n    return !!spaces[KEY]() || non[KEY]() != non;\n  }), 'String', exp);\n};\n\n// 1 -> String#trimLeft\n// 2 -> String#trimRight\n// 3 -> String#trim\nvar trim = exporter.trim = function(string, TYPE){\n  string = String(defined(string));\n  if(TYPE & 1)string = string.replace(ltrim, '');\n  if(TYPE & 2)string = string.replace(rtrim, '');\n  return string;\n};\n\nmodule.exports = exporter;\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjc2LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvJC5zdHJpbmctdHJpbS5qcz82ZGRjIl0sInNvdXJjZXNDb250ZW50IjpbInZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi8kLmV4cG9ydCcpXG4gICwgZGVmaW5lZCA9IHJlcXVpcmUoJy4vJC5kZWZpbmVkJylcbiAgLCBmYWlscyAgID0gcmVxdWlyZSgnLi8kLmZhaWxzJylcbiAgLCBzcGFjZXMgID0gJ1xceDA5XFx4MEFcXHgwQlxceDBDXFx4MERcXHgyMFxceEEwXFx1MTY4MFxcdTE4MEVcXHUyMDAwXFx1MjAwMVxcdTIwMDJcXHUyMDAzJyArXG4gICAgICAnXFx1MjAwNFxcdTIwMDVcXHUyMDA2XFx1MjAwN1xcdTIwMDhcXHUyMDA5XFx1MjAwQVxcdTIwMkZcXHUyMDVGXFx1MzAwMFxcdTIwMjhcXHUyMDI5XFx1RkVGRidcbiAgLCBzcGFjZSAgID0gJ1snICsgc3BhY2VzICsgJ10nXG4gICwgbm9uICAgICA9ICdcXHUyMDBiXFx1MDA4NSdcbiAgLCBsdHJpbSAgID0gUmVnRXhwKCdeJyArIHNwYWNlICsgc3BhY2UgKyAnKicpXG4gICwgcnRyaW0gICA9IFJlZ0V4cChzcGFjZSArIHNwYWNlICsgJyokJyk7XG5cbnZhciBleHBvcnRlciA9IGZ1bmN0aW9uKEtFWSwgZXhlYyl7XG4gIHZhciBleHAgID0ge307XG4gIGV4cFtLRVldID0gZXhlYyh0cmltKTtcbiAgJGV4cG9ydCgkZXhwb3J0LlAgKyAkZXhwb3J0LkYgKiBmYWlscyhmdW5jdGlvbigpe1xuICAgIHJldHVybiAhIXNwYWNlc1tLRVldKCkgfHwgbm9uW0tFWV0oKSAhPSBub247XG4gIH0pLCAnU3RyaW5nJywgZXhwKTtcbn07XG5cbi8vIDEgLT4gU3RyaW5nI3RyaW1MZWZ0XG4vLyAyIC0+IFN0cmluZyN0cmltUmlnaHRcbi8vIDMgLT4gU3RyaW5nI3RyaW1cbnZhciB0cmltID0gZXhwb3J0ZXIudHJpbSA9IGZ1bmN0aW9uKHN0cmluZywgVFlQRSl7XG4gIHN0cmluZyA9IFN0cmluZyhkZWZpbmVkKHN0cmluZykpO1xuICBpZihUWVBFICYgMSlzdHJpbmcgPSBzdHJpbmcucmVwbGFjZShsdHJpbSwgJycpO1xuICBpZihUWVBFICYgMilzdHJpbmcgPSBzdHJpbmcucmVwbGFjZShydHJpbSwgJycpO1xuICByZXR1cm4gc3RyaW5nO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRlcjtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9jb3JlLWpzL21vZHVsZXMvJC5zdHJpbmctdHJpbS5qc1xuICoqIG1vZHVsZSBpZCA9IDI3NlxuICoqIG1vZHVsZSBjaHVua3MgPSAyNFxuICoqLyJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");

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

	eval("// 20.1.2.1 Number.EPSILON\nvar $export = __webpack_require__(216);\n\n$export($export.S, 'Number', {EPSILON: Math.pow(2, -52)});\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjc3LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvZXM2Lm51bWJlci5lcHNpbG9uLmpzPzZlZDEiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gMjAuMS4yLjEgTnVtYmVyLkVQU0lMT05cbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi8kLmV4cG9ydCcpO1xuXG4kZXhwb3J0KCRleHBvcnQuUywgJ051bWJlcicsIHtFUFNJTE9OOiBNYXRoLnBvdygyLCAtNTIpfSk7XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vY29yZS1qcy9tb2R1bGVzL2VzNi5udW1iZXIuZXBzaWxvbi5qc1xuICoqIG1vZHVsZSBpZCA9IDI3N1xuICoqIG1vZHVsZSBjaHVua3MgPSAyNFxuICoqLyJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=");

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

	eval("// 20.1.2.2 Number.isFinite(number)\nvar $export   = __webpack_require__(216)\n  , _isFinite = __webpack_require__(217).isFinite;\n\n$export($export.S, 'Number', {\n  isFinite: function isFinite(it){\n    return typeof it == 'number' && _isFinite(it);\n  }\n});\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjc4LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvZXM2Lm51bWJlci5pcy1maW5pdGUuanM/NDcxZSJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyAyMC4xLjIuMiBOdW1iZXIuaXNGaW5pdGUobnVtYmVyKVxudmFyICRleHBvcnQgICA9IHJlcXVpcmUoJy4vJC5leHBvcnQnKVxuICAsIF9pc0Zpbml0ZSA9IHJlcXVpcmUoJy4vJC5nbG9iYWwnKS5pc0Zpbml0ZTtcblxuJGV4cG9ydCgkZXhwb3J0LlMsICdOdW1iZXInLCB7XG4gIGlzRmluaXRlOiBmdW5jdGlvbiBpc0Zpbml0ZShpdCl7XG4gICAgcmV0dXJuIHR5cGVvZiBpdCA9PSAnbnVtYmVyJyAmJiBfaXNGaW5pdGUoaXQpO1xuICB9XG59KTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9jb3JlLWpzL21vZHVsZXMvZXM2Lm51bWJlci5pcy1maW5pdGUuanNcbiAqKiBtb2R1bGUgaWQgPSAyNzhcbiAqKiBtb2R1bGUgY2h1bmtzID0gMjRcbiAqKi8iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");

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

	eval("// 20.1.2.3 Number.isInteger(number)\nvar $export = __webpack_require__(216);\n\n$export($export.S, 'Number', {isInteger: __webpack_require__(280)});\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjc5LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvZXM2Lm51bWJlci5pcy1pbnRlZ2VyLmpzP2RmNzgiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gMjAuMS4yLjMgTnVtYmVyLmlzSW50ZWdlcihudW1iZXIpXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vJC5leHBvcnQnKTtcblxuJGV4cG9ydCgkZXhwb3J0LlMsICdOdW1iZXInLCB7aXNJbnRlZ2VyOiByZXF1aXJlKCcuLyQuaXMtaW50ZWdlcicpfSk7XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vY29yZS1qcy9tb2R1bGVzL2VzNi5udW1iZXIuaXMtaW50ZWdlci5qc1xuICoqIG1vZHVsZSBpZCA9IDI3OVxuICoqIG1vZHVsZSBjaHVua3MgPSAyNFxuICoqLyJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=");

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

	eval("// 20.1.2.3 Number.isInteger(number)\nvar isObject = __webpack_require__(229)\n  , floor    = Math.floor;\nmodule.exports = function isInteger(it){\n  return !isObject(it) && isFinite(it) && floor(it) === it;\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjgwLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvJC5pcy1pbnRlZ2VyLmpzPzMyNjQiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gMjAuMS4yLjMgTnVtYmVyLmlzSW50ZWdlcihudW1iZXIpXG52YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuLyQuaXMtb2JqZWN0JylcbiAgLCBmbG9vciAgICA9IE1hdGguZmxvb3I7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGlzSW50ZWdlcihpdCl7XG4gIHJldHVybiAhaXNPYmplY3QoaXQpICYmIGlzRmluaXRlKGl0KSAmJiBmbG9vcihpdCkgPT09IGl0O1xufTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9jb3JlLWpzL21vZHVsZXMvJC5pcy1pbnRlZ2VyLmpzXG4gKiogbW9kdWxlIGlkID0gMjgwXG4gKiogbW9kdWxlIGNodW5rcyA9IDI0XG4gKiovIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=");

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

	eval("// 20.1.2.4 Number.isNaN(number)\nvar $export = __webpack_require__(216);\n\n$export($export.S, 'Number', {\n  isNaN: function isNaN(number){\n    return number != number;\n  }\n});\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjgxLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvZXM2Lm51bWJlci5pcy1uYW4uanM/NDE4MyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyAyMC4xLjIuNCBOdW1iZXIuaXNOYU4obnVtYmVyKVxudmFyICRleHBvcnQgPSByZXF1aXJlKCcuLyQuZXhwb3J0Jyk7XG5cbiRleHBvcnQoJGV4cG9ydC5TLCAnTnVtYmVyJywge1xuICBpc05hTjogZnVuY3Rpb24gaXNOYU4obnVtYmVyKXtcbiAgICByZXR1cm4gbnVtYmVyICE9IG51bWJlcjtcbiAgfVxufSk7XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vY29yZS1qcy9tb2R1bGVzL2VzNi5udW1iZXIuaXMtbmFuLmpzXG4gKiogbW9kdWxlIGlkID0gMjgxXG4gKiogbW9kdWxlIGNodW5rcyA9IDI0XG4gKiovIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");

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

	eval("// 20.1.2.5 Number.isSafeInteger(number)\nvar $export   = __webpack_require__(216)\n  , isInteger = __webpack_require__(280)\n  , abs       = Math.abs;\n\n$export($export.S, 'Number', {\n  isSafeInteger: function isSafeInteger(number){\n    return isInteger(number) && abs(number) <= 0x1fffffffffffff;\n  }\n});\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjgyLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvZXM2Lm51bWJlci5pcy1zYWZlLWludGVnZXIuanM/ZTdiZiJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyAyMC4xLjIuNSBOdW1iZXIuaXNTYWZlSW50ZWdlcihudW1iZXIpXG52YXIgJGV4cG9ydCAgID0gcmVxdWlyZSgnLi8kLmV4cG9ydCcpXG4gICwgaXNJbnRlZ2VyID0gcmVxdWlyZSgnLi8kLmlzLWludGVnZXInKVxuICAsIGFicyAgICAgICA9IE1hdGguYWJzO1xuXG4kZXhwb3J0KCRleHBvcnQuUywgJ051bWJlcicsIHtcbiAgaXNTYWZlSW50ZWdlcjogZnVuY3Rpb24gaXNTYWZlSW50ZWdlcihudW1iZXIpe1xuICAgIHJldHVybiBpc0ludGVnZXIobnVtYmVyKSAmJiBhYnMobnVtYmVyKSA8PSAweDFmZmZmZmZmZmZmZmZmO1xuICB9XG59KTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9jb3JlLWpzL21vZHVsZXMvZXM2Lm51bWJlci5pcy1zYWZlLWludGVnZXIuanNcbiAqKiBtb2R1bGUgaWQgPSAyODJcbiAqKiBtb2R1bGUgY2h1bmtzID0gMjRcbiAqKi8iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");

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

	eval("// 20.1.2.6 Number.MAX_SAFE_INTEGER\nvar $export = __webpack_require__(216);\n\n$export($export.S, 'Number', {MAX_SAFE_INTEGER: 0x1fffffffffffff});\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjgzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvZXM2Lm51bWJlci5tYXgtc2FmZS1pbnRlZ2VyLmpzPzZiNTciXSwic291cmNlc0NvbnRlbnQiOlsiLy8gMjAuMS4yLjYgTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVJcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi8kLmV4cG9ydCcpO1xuXG4kZXhwb3J0KCRleHBvcnQuUywgJ051bWJlcicsIHtNQVhfU0FGRV9JTlRFR0VSOiAweDFmZmZmZmZmZmZmZmZmfSk7XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vY29yZS1qcy9tb2R1bGVzL2VzNi5udW1iZXIubWF4LXNhZmUtaW50ZWdlci5qc1xuICoqIG1vZHVsZSBpZCA9IDI4M1xuICoqIG1vZHVsZSBjaHVua3MgPSAyNFxuICoqLyJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=");

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

	eval("// 20.1.2.10 Number.MIN_SAFE_INTEGER\nvar $export = __webpack_require__(216);\n\n$export($export.S, 'Number', {MIN_SAFE_INTEGER: -0x1fffffffffffff});\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjg0LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvZXM2Lm51bWJlci5taW4tc2FmZS1pbnRlZ2VyLmpzPzc4MTEiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gMjAuMS4yLjEwIE51bWJlci5NSU5fU0FGRV9JTlRFR0VSXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vJC5leHBvcnQnKTtcblxuJGV4cG9ydCgkZXhwb3J0LlMsICdOdW1iZXInLCB7TUlOX1NBRkVfSU5URUdFUjogLTB4MWZmZmZmZmZmZmZmZmZ9KTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9jb3JlLWpzL21vZHVsZXMvZXM2Lm51bWJlci5taW4tc2FmZS1pbnRlZ2VyLmpzXG4gKiogbW9kdWxlIGlkID0gMjg0XG4gKiogbW9kdWxlIGNodW5rcyA9IDI0XG4gKiovIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");

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

	eval("// 20.1.2.12 Number.parseFloat(string)\nvar $export = __webpack_require__(216);\n\n$export($export.S, 'Number', {parseFloat: parseFloat});\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjg1LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvZXM2Lm51bWJlci5wYXJzZS1mbG9hdC5qcz82NGMxIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIDIwLjEuMi4xMiBOdW1iZXIucGFyc2VGbG9hdChzdHJpbmcpXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vJC5leHBvcnQnKTtcblxuJGV4cG9ydCgkZXhwb3J0LlMsICdOdW1iZXInLCB7cGFyc2VGbG9hdDogcGFyc2VGbG9hdH0pO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2NvcmUtanMvbW9kdWxlcy9lczYubnVtYmVyLnBhcnNlLWZsb2F0LmpzXG4gKiogbW9kdWxlIGlkID0gMjg1XG4gKiogbW9kdWxlIGNodW5rcyA9IDI0XG4gKiovIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");

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

	eval("// 20.1.2.13 Number.parseInt(string, radix)\nvar $export = __webpack_require__(216);\n\n$export($export.S, 'Number', {parseInt: parseInt});\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjg2LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvZXM2Lm51bWJlci5wYXJzZS1pbnQuanM/MGUwYiJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyAyMC4xLjIuMTMgTnVtYmVyLnBhcnNlSW50KHN0cmluZywgcmFkaXgpXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vJC5leHBvcnQnKTtcblxuJGV4cG9ydCgkZXhwb3J0LlMsICdOdW1iZXInLCB7cGFyc2VJbnQ6IHBhcnNlSW50fSk7XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vY29yZS1qcy9tb2R1bGVzL2VzNi5udW1iZXIucGFyc2UtaW50LmpzXG4gKiogbW9kdWxlIGlkID0gMjg2XG4gKiogbW9kdWxlIGNodW5rcyA9IDI0XG4gKiovIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");

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

	eval("// 20.2.2.3 Math.acosh(x)\nvar $export = __webpack_require__(216)\n  , log1p   = __webpack_require__(288)\n  , sqrt    = Math.sqrt\n  , $acosh  = Math.acosh;\n\n// V8 bug https://code.google.com/p/v8/issues/detail?id=3509\n$export($export.S + $export.F * !($acosh && Math.floor($acosh(Number.MAX_VALUE)) == 710), 'Math', {\n  acosh: function acosh(x){\n    return (x = +x) < 1 ? NaN : x > 94906265.62425156\n      ? Math.log(x) + Math.LN2\n      : log1p(x - 1 + sqrt(x - 1) * sqrt(x + 1));\n  }\n});\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjg3LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvZXM2Lm1hdGguYWNvc2guanM/NzM5NiJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyAyMC4yLjIuMyBNYXRoLmFjb3NoKHgpXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vJC5leHBvcnQnKVxuICAsIGxvZzFwICAgPSByZXF1aXJlKCcuLyQubWF0aC1sb2cxcCcpXG4gICwgc3FydCAgICA9IE1hdGguc3FydFxuICAsICRhY29zaCAgPSBNYXRoLmFjb3NoO1xuXG4vLyBWOCBidWcgaHR0cHM6Ly9jb2RlLmdvb2dsZS5jb20vcC92OC9pc3N1ZXMvZGV0YWlsP2lkPTM1MDlcbiRleHBvcnQoJGV4cG9ydC5TICsgJGV4cG9ydC5GICogISgkYWNvc2ggJiYgTWF0aC5mbG9vcigkYWNvc2goTnVtYmVyLk1BWF9WQUxVRSkpID09IDcxMCksICdNYXRoJywge1xuICBhY29zaDogZnVuY3Rpb24gYWNvc2goeCl7XG4gICAgcmV0dXJuICh4ID0gK3gpIDwgMSA/IE5hTiA6IHggPiA5NDkwNjI2NS42MjQyNTE1NlxuICAgICAgPyBNYXRoLmxvZyh4KSArIE1hdGguTE4yXG4gICAgICA6IGxvZzFwKHggLSAxICsgc3FydCh4IC0gMSkgKiBzcXJ0KHggKyAxKSk7XG4gIH1cbn0pO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2NvcmUtanMvbW9kdWxlcy9lczYubWF0aC5hY29zaC5qc1xuICoqIG1vZHVsZSBpZCA9IDI4N1xuICoqIG1vZHVsZSBjaHVua3MgPSAyNFxuICoqLyJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");

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

	eval("// 20.2.2.20 Math.log1p(x)\nmodule.exports = Math.log1p || function log1p(x){\n  return (x = +x) > -1e-8 && x < 1e-8 ? x - x * x / 2 : Math.log(1 + x);\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjg4LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvJC5tYXRoLWxvZzFwLmpzPzYyYzIiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gMjAuMi4yLjIwIE1hdGgubG9nMXAoeClcbm1vZHVsZS5leHBvcnRzID0gTWF0aC5sb2cxcCB8fCBmdW5jdGlvbiBsb2cxcCh4KXtcbiAgcmV0dXJuICh4ID0gK3gpID4gLTFlLTggJiYgeCA8IDFlLTggPyB4IC0geCAqIHggLyAyIDogTWF0aC5sb2coMSArIHgpO1xufTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9jb3JlLWpzL21vZHVsZXMvJC5tYXRoLWxvZzFwLmpzXG4gKiogbW9kdWxlIGlkID0gMjg4XG4gKiogbW9kdWxlIGNodW5rcyA9IDI0XG4gKiovIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");

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

	eval("// 20.2.2.5 Math.asinh(x)\nvar $export = __webpack_require__(216);\n\nfunction asinh(x){\n  return !isFinite(x = +x) || x == 0 ? x : x < 0 ? -asinh(-x) : Math.log(x + Math.sqrt(x * x + 1));\n}\n\n$export($export.S, 'Math', {asinh: asinh});\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjg5LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvZXM2Lm1hdGguYXNpbmguanM/ODZmYSJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyAyMC4yLjIuNSBNYXRoLmFzaW5oKHgpXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vJC5leHBvcnQnKTtcblxuZnVuY3Rpb24gYXNpbmgoeCl7XG4gIHJldHVybiAhaXNGaW5pdGUoeCA9ICt4KSB8fCB4ID09IDAgPyB4IDogeCA8IDAgPyAtYXNpbmgoLXgpIDogTWF0aC5sb2coeCArIE1hdGguc3FydCh4ICogeCArIDEpKTtcbn1cblxuJGV4cG9ydCgkZXhwb3J0LlMsICdNYXRoJywge2FzaW5oOiBhc2luaH0pO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2NvcmUtanMvbW9kdWxlcy9lczYubWF0aC5hc2luaC5qc1xuICoqIG1vZHVsZSBpZCA9IDI4OVxuICoqIG1vZHVsZSBjaHVua3MgPSAyNFxuICoqLyJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");

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

	eval("// 20.2.2.7 Math.atanh(x)\nvar $export = __webpack_require__(216);\n\n$export($export.S, 'Math', {\n  atanh: function atanh(x){\n    return (x = +x) == 0 ? x : Math.log((1 + x) / (1 - x)) / 2;\n  }\n});\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjkwLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvZXM2Lm1hdGguYXRhbmguanM/MTgzYiJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyAyMC4yLjIuNyBNYXRoLmF0YW5oKHgpXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vJC5leHBvcnQnKTtcblxuJGV4cG9ydCgkZXhwb3J0LlMsICdNYXRoJywge1xuICBhdGFuaDogZnVuY3Rpb24gYXRhbmgoeCl7XG4gICAgcmV0dXJuICh4ID0gK3gpID09IDAgPyB4IDogTWF0aC5sb2coKDEgKyB4KSAvICgxIC0geCkpIC8gMjtcbiAgfVxufSk7XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vY29yZS1qcy9tb2R1bGVzL2VzNi5tYXRoLmF0YW5oLmpzXG4gKiogbW9kdWxlIGlkID0gMjkwXG4gKiogbW9kdWxlIGNodW5rcyA9IDI0XG4gKiovIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");

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

	eval("// 20.2.2.9 Math.cbrt(x)\nvar $export = __webpack_require__(216)\n  , sign    = __webpack_require__(292);\n\n$export($export.S, 'Math', {\n  cbrt: function cbrt(x){\n    return sign(x = +x) * Math.pow(Math.abs(x), 1 / 3);\n  }\n});\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjkxLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvZXM2Lm1hdGguY2JydC5qcz80OWIwIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIDIwLjIuMi45IE1hdGguY2JydCh4KVxudmFyICRleHBvcnQgPSByZXF1aXJlKCcuLyQuZXhwb3J0JylcbiAgLCBzaWduICAgID0gcmVxdWlyZSgnLi8kLm1hdGgtc2lnbicpO1xuXG4kZXhwb3J0KCRleHBvcnQuUywgJ01hdGgnLCB7XG4gIGNicnQ6IGZ1bmN0aW9uIGNicnQoeCl7XG4gICAgcmV0dXJuIHNpZ24oeCA9ICt4KSAqIE1hdGgucG93KE1hdGguYWJzKHgpLCAxIC8gMyk7XG4gIH1cbn0pO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2NvcmUtanMvbW9kdWxlcy9lczYubWF0aC5jYnJ0LmpzXG4gKiogbW9kdWxlIGlkID0gMjkxXG4gKiogbW9kdWxlIGNodW5rcyA9IDI0XG4gKiovIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=");

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

	eval("// 20.2.2.28 Math.sign(x)\nmodule.exports = Math.sign || function sign(x){\n  return (x = +x) == 0 || x != x ? x : x < 0 ? -1 : 1;\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjkyLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvJC5tYXRoLXNpZ24uanM/ZGE0YiJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyAyMC4yLjIuMjggTWF0aC5zaWduKHgpXG5tb2R1bGUuZXhwb3J0cyA9IE1hdGguc2lnbiB8fCBmdW5jdGlvbiBzaWduKHgpe1xuICByZXR1cm4gKHggPSAreCkgPT0gMCB8fCB4ICE9IHggPyB4IDogeCA8IDAgPyAtMSA6IDE7XG59O1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2NvcmUtanMvbW9kdWxlcy8kLm1hdGgtc2lnbi5qc1xuICoqIG1vZHVsZSBpZCA9IDI5MlxuICoqIG1vZHVsZSBjaHVua3MgPSAyNFxuICoqLyJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=");

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

	eval("// 20.2.2.11 Math.clz32(x)\nvar $export = __webpack_require__(216);\n\n$export($export.S, 'Math', {\n  clz32: function clz32(x){\n    return (x >>>= 0) ? 31 - Math.floor(Math.log(x + 0.5) * Math.LOG2E) : 32;\n  }\n});\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjkzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvZXM2Lm1hdGguY2x6MzIuanM/MjNhMyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyAyMC4yLjIuMTEgTWF0aC5jbHozMih4KVxudmFyICRleHBvcnQgPSByZXF1aXJlKCcuLyQuZXhwb3J0Jyk7XG5cbiRleHBvcnQoJGV4cG9ydC5TLCAnTWF0aCcsIHtcbiAgY2x6MzI6IGZ1bmN0aW9uIGNsejMyKHgpe1xuICAgIHJldHVybiAoeCA+Pj49IDApID8gMzEgLSBNYXRoLmZsb29yKE1hdGgubG9nKHggKyAwLjUpICogTWF0aC5MT0cyRSkgOiAzMjtcbiAgfVxufSk7XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vY29yZS1qcy9tb2R1bGVzL2VzNi5tYXRoLmNsejMyLmpzXG4gKiogbW9kdWxlIGlkID0gMjkzXG4gKiogbW9kdWxlIGNodW5rcyA9IDI0XG4gKiovIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");

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

	eval("// 20.2.2.12 Math.cosh(x)\nvar $export = __webpack_require__(216)\n  , exp     = Math.exp;\n\n$export($export.S, 'Math', {\n  cosh: function cosh(x){\n    return (exp(x = +x) + exp(-x)) / 2;\n  }\n});\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjk0LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvZXM2Lm1hdGguY29zaC5qcz8zMDkwIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIDIwLjIuMi4xMiBNYXRoLmNvc2goeClcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi8kLmV4cG9ydCcpXG4gICwgZXhwICAgICA9IE1hdGguZXhwO1xuXG4kZXhwb3J0KCRleHBvcnQuUywgJ01hdGgnLCB7XG4gIGNvc2g6IGZ1bmN0aW9uIGNvc2goeCl7XG4gICAgcmV0dXJuIChleHAoeCA9ICt4KSArIGV4cCgteCkpIC8gMjtcbiAgfVxufSk7XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vY29yZS1qcy9tb2R1bGVzL2VzNi5tYXRoLmNvc2guanNcbiAqKiBtb2R1bGUgaWQgPSAyOTRcbiAqKiBtb2R1bGUgY2h1bmtzID0gMjRcbiAqKi8iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");

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

	eval("// 20.2.2.14 Math.expm1(x)\nvar $export = __webpack_require__(216);\n\n$export($export.S, 'Math', {expm1: __webpack_require__(296)});\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjk1LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvZXM2Lm1hdGguZXhwbTEuanM/N2NjYSJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyAyMC4yLjIuMTQgTWF0aC5leHBtMSh4KVxudmFyICRleHBvcnQgPSByZXF1aXJlKCcuLyQuZXhwb3J0Jyk7XG5cbiRleHBvcnQoJGV4cG9ydC5TLCAnTWF0aCcsIHtleHBtMTogcmVxdWlyZSgnLi8kLm1hdGgtZXhwbTEnKX0pO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2NvcmUtanMvbW9kdWxlcy9lczYubWF0aC5leHBtMS5qc1xuICoqIG1vZHVsZSBpZCA9IDI5NVxuICoqIG1vZHVsZSBjaHVua3MgPSAyNFxuICoqLyJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=");

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

	eval("// 20.2.2.14 Math.expm1(x)\nmodule.exports = Math.expm1 || function expm1(x){\n  return (x = +x) == 0 ? x : x > -1e-6 && x < 1e-6 ? x + x * x / 2 : Math.exp(x) - 1;\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjk2LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvJC5tYXRoLWV4cG0xLmpzP2Y3MTciXSwic291cmNlc0NvbnRlbnQiOlsiLy8gMjAuMi4yLjE0IE1hdGguZXhwbTEoeClcbm1vZHVsZS5leHBvcnRzID0gTWF0aC5leHBtMSB8fCBmdW5jdGlvbiBleHBtMSh4KXtcbiAgcmV0dXJuICh4ID0gK3gpID09IDAgPyB4IDogeCA+IC0xZS02ICYmIHggPCAxZS02ID8geCArIHggKiB4IC8gMiA6IE1hdGguZXhwKHgpIC0gMTtcbn07XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vY29yZS1qcy9tb2R1bGVzLyQubWF0aC1leHBtMS5qc1xuICoqIG1vZHVsZSBpZCA9IDI5NlxuICoqIG1vZHVsZSBjaHVua3MgPSAyNFxuICoqLyJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=");

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

	eval("// 20.2.2.16 Math.fround(x)\nvar $export   = __webpack_require__(216)\n  , sign      = __webpack_require__(292)\n  , pow       = Math.pow\n  , EPSILON   = pow(2, -52)\n  , EPSILON32 = pow(2, -23)\n  , MAX32     = pow(2, 127) * (2 - EPSILON32)\n  , MIN32     = pow(2, -126);\n\nvar roundTiesToEven = function(n){\n  return n + 1 / EPSILON - 1 / EPSILON;\n};\n\n\n$export($export.S, 'Math', {\n  fround: function fround(x){\n    var $abs  = Math.abs(x)\n      , $sign = sign(x)\n      , a, result;\n    if($abs < MIN32)return $sign * roundTiesToEven($abs / MIN32 / EPSILON32) * MIN32 * EPSILON32;\n    a = (1 + EPSILON32 / EPSILON) * $abs;\n    result = a - (a - $abs);\n    if(result > MAX32 || result != result)return $sign * Infinity;\n    return $sign * result;\n  }\n});\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjk3LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvZXM2Lm1hdGguZnJvdW5kLmpzP2I3YzQiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gMjAuMi4yLjE2IE1hdGguZnJvdW5kKHgpXG52YXIgJGV4cG9ydCAgID0gcmVxdWlyZSgnLi8kLmV4cG9ydCcpXG4gICwgc2lnbiAgICAgID0gcmVxdWlyZSgnLi8kLm1hdGgtc2lnbicpXG4gICwgcG93ICAgICAgID0gTWF0aC5wb3dcbiAgLCBFUFNJTE9OICAgPSBwb3coMiwgLTUyKVxuICAsIEVQU0lMT04zMiA9IHBvdygyLCAtMjMpXG4gICwgTUFYMzIgICAgID0gcG93KDIsIDEyNykgKiAoMiAtIEVQU0lMT04zMilcbiAgLCBNSU4zMiAgICAgPSBwb3coMiwgLTEyNik7XG5cbnZhciByb3VuZFRpZXNUb0V2ZW4gPSBmdW5jdGlvbihuKXtcbiAgcmV0dXJuIG4gKyAxIC8gRVBTSUxPTiAtIDEgLyBFUFNJTE9OO1xufTtcblxuXG4kZXhwb3J0KCRleHBvcnQuUywgJ01hdGgnLCB7XG4gIGZyb3VuZDogZnVuY3Rpb24gZnJvdW5kKHgpe1xuICAgIHZhciAkYWJzICA9IE1hdGguYWJzKHgpXG4gICAgICAsICRzaWduID0gc2lnbih4KVxuICAgICAgLCBhLCByZXN1bHQ7XG4gICAgaWYoJGFicyA8IE1JTjMyKXJldHVybiAkc2lnbiAqIHJvdW5kVGllc1RvRXZlbigkYWJzIC8gTUlOMzIgLyBFUFNJTE9OMzIpICogTUlOMzIgKiBFUFNJTE9OMzI7XG4gICAgYSA9ICgxICsgRVBTSUxPTjMyIC8gRVBTSUxPTikgKiAkYWJzO1xuICAgIHJlc3VsdCA9IGEgLSAoYSAtICRhYnMpO1xuICAgIGlmKHJlc3VsdCA+IE1BWDMyIHx8IHJlc3VsdCAhPSByZXN1bHQpcmV0dXJuICRzaWduICogSW5maW5pdHk7XG4gICAgcmV0dXJuICRzaWduICogcmVzdWx0O1xuICB9XG59KTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9jb3JlLWpzL21vZHVsZXMvZXM2Lm1hdGguZnJvdW5kLmpzXG4gKiogbW9kdWxlIGlkID0gMjk3XG4gKiogbW9kdWxlIGNodW5rcyA9IDI0XG4gKiovIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");

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

	eval("// 20.2.2.17 Math.hypot([value1[, value2[, … ]]])\nvar $export = __webpack_require__(216)\n  , abs     = Math.abs;\n\n$export($export.S, 'Math', {\n  hypot: function hypot(value1, value2){ // eslint-disable-line no-unused-vars\n    var sum   = 0\n      , i     = 0\n      , $$    = arguments\n      , $$len = $$.length\n      , larg  = 0\n      , arg, div;\n    while(i < $$len){\n      arg = abs($$[i++]);\n      if(larg < arg){\n        div  = larg / arg;\n        sum  = sum * div * div + 1;\n        larg = arg;\n      } else if(arg > 0){\n        div  = arg / larg;\n        sum += div * div;\n      } else sum += arg;\n    }\n    return larg === Infinity ? Infinity : larg * Math.sqrt(sum);\n  }\n});\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjk4LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvZXM2Lm1hdGguaHlwb3QuanM/OWZkZSJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyAyMC4yLjIuMTcgTWF0aC5oeXBvdChbdmFsdWUxWywgdmFsdWUyWywg4oCmIF1dXSlcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi8kLmV4cG9ydCcpXG4gICwgYWJzICAgICA9IE1hdGguYWJzO1xuXG4kZXhwb3J0KCRleHBvcnQuUywgJ01hdGgnLCB7XG4gIGh5cG90OiBmdW5jdGlvbiBoeXBvdCh2YWx1ZTEsIHZhbHVlMil7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW51c2VkLXZhcnNcbiAgICB2YXIgc3VtICAgPSAwXG4gICAgICAsIGkgICAgID0gMFxuICAgICAgLCAkJCAgICA9IGFyZ3VtZW50c1xuICAgICAgLCAkJGxlbiA9ICQkLmxlbmd0aFxuICAgICAgLCBsYXJnICA9IDBcbiAgICAgICwgYXJnLCBkaXY7XG4gICAgd2hpbGUoaSA8ICQkbGVuKXtcbiAgICAgIGFyZyA9IGFicygkJFtpKytdKTtcbiAgICAgIGlmKGxhcmcgPCBhcmcpe1xuICAgICAgICBkaXYgID0gbGFyZyAvIGFyZztcbiAgICAgICAgc3VtICA9IHN1bSAqIGRpdiAqIGRpdiArIDE7XG4gICAgICAgIGxhcmcgPSBhcmc7XG4gICAgICB9IGVsc2UgaWYoYXJnID4gMCl7XG4gICAgICAgIGRpdiAgPSBhcmcgLyBsYXJnO1xuICAgICAgICBzdW0gKz0gZGl2ICogZGl2O1xuICAgICAgfSBlbHNlIHN1bSArPSBhcmc7XG4gICAgfVxuICAgIHJldHVybiBsYXJnID09PSBJbmZpbml0eSA/IEluZmluaXR5IDogbGFyZyAqIE1hdGguc3FydChzdW0pO1xuICB9XG59KTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9jb3JlLWpzL21vZHVsZXMvZXM2Lm1hdGguaHlwb3QuanNcbiAqKiBtb2R1bGUgaWQgPSAyOThcbiAqKiBtb2R1bGUgY2h1bmtzID0gMjRcbiAqKi8iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=");

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

	eval("// 20.2.2.18 Math.imul(x, y)\nvar $export = __webpack_require__(216)\n  , $imul   = Math.imul;\n\n// some WebKit versions fails with big numbers, some has wrong arity\n$export($export.S + $export.F * __webpack_require__(222)(function(){\n  return $imul(0xffffffff, 5) != -5 || $imul.length != 2;\n}), 'Math', {\n  imul: function imul(x, y){\n    var UINT16 = 0xffff\n      , xn = +x\n      , yn = +y\n      , xl = UINT16 & xn\n      , yl = UINT16 & yn;\n    return 0 | xl * yl + ((UINT16 & xn >>> 16) * yl + xl * (UINT16 & yn >>> 16) << 16 >>> 0);\n  }\n});\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjk5LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvZXM2Lm1hdGguaW11bC5qcz81MzM2Il0sInNvdXJjZXNDb250ZW50IjpbIi8vIDIwLjIuMi4xOCBNYXRoLmltdWwoeCwgeSlcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi8kLmV4cG9ydCcpXG4gICwgJGltdWwgICA9IE1hdGguaW11bDtcblxuLy8gc29tZSBXZWJLaXQgdmVyc2lvbnMgZmFpbHMgd2l0aCBiaWcgbnVtYmVycywgc29tZSBoYXMgd3JvbmcgYXJpdHlcbiRleHBvcnQoJGV4cG9ydC5TICsgJGV4cG9ydC5GICogcmVxdWlyZSgnLi8kLmZhaWxzJykoZnVuY3Rpb24oKXtcbiAgcmV0dXJuICRpbXVsKDB4ZmZmZmZmZmYsIDUpICE9IC01IHx8ICRpbXVsLmxlbmd0aCAhPSAyO1xufSksICdNYXRoJywge1xuICBpbXVsOiBmdW5jdGlvbiBpbXVsKHgsIHkpe1xuICAgIHZhciBVSU5UMTYgPSAweGZmZmZcbiAgICAgICwgeG4gPSAreFxuICAgICAgLCB5biA9ICt5XG4gICAgICAsIHhsID0gVUlOVDE2ICYgeG5cbiAgICAgICwgeWwgPSBVSU5UMTYgJiB5bjtcbiAgICByZXR1cm4gMCB8IHhsICogeWwgKyAoKFVJTlQxNiAmIHhuID4+PiAxNikgKiB5bCArIHhsICogKFVJTlQxNiAmIHluID4+PiAxNikgPDwgMTYgPj4+IDApO1xuICB9XG59KTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9jb3JlLWpzL21vZHVsZXMvZXM2Lm1hdGguaW11bC5qc1xuICoqIG1vZHVsZSBpZCA9IDI5OVxuICoqIG1vZHVsZSBjaHVua3MgPSAyNFxuICoqLyJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");

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

	eval("// 20.2.2.21 Math.log10(x)\nvar $export = __webpack_require__(216);\n\n$export($export.S, 'Math', {\n  log10: function log10(x){\n    return Math.log(x) / Math.LN10;\n  }\n});\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzAwLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvZXM2Lm1hdGgubG9nMTAuanM/ZGJlMSJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyAyMC4yLjIuMjEgTWF0aC5sb2cxMCh4KVxudmFyICRleHBvcnQgPSByZXF1aXJlKCcuLyQuZXhwb3J0Jyk7XG5cbiRleHBvcnQoJGV4cG9ydC5TLCAnTWF0aCcsIHtcbiAgbG9nMTA6IGZ1bmN0aW9uIGxvZzEwKHgpe1xuICAgIHJldHVybiBNYXRoLmxvZyh4KSAvIE1hdGguTE4xMDtcbiAgfVxufSk7XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vY29yZS1qcy9tb2R1bGVzL2VzNi5tYXRoLmxvZzEwLmpzXG4gKiogbW9kdWxlIGlkID0gMzAwXG4gKiogbW9kdWxlIGNodW5rcyA9IDI0XG4gKiovIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");

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

	eval("// 20.2.2.20 Math.log1p(x)\nvar $export = __webpack_require__(216);\n\n$export($export.S, 'Math', {log1p: __webpack_require__(288)});\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzAxLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvZXM2Lm1hdGgubG9nMXAuanM/YTgwNSJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyAyMC4yLjIuMjAgTWF0aC5sb2cxcCh4KVxudmFyICRleHBvcnQgPSByZXF1aXJlKCcuLyQuZXhwb3J0Jyk7XG5cbiRleHBvcnQoJGV4cG9ydC5TLCAnTWF0aCcsIHtsb2cxcDogcmVxdWlyZSgnLi8kLm1hdGgtbG9nMXAnKX0pO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2NvcmUtanMvbW9kdWxlcy9lczYubWF0aC5sb2cxcC5qc1xuICoqIG1vZHVsZSBpZCA9IDMwMVxuICoqIG1vZHVsZSBjaHVua3MgPSAyNFxuICoqLyJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=");

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

	eval("// 20.2.2.22 Math.log2(x)\nvar $export = __webpack_require__(216);\n\n$export($export.S, 'Math', {\n  log2: function log2(x){\n    return Math.log(x) / Math.LN2;\n  }\n});\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzAyLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvZXM2Lm1hdGgubG9nMi5qcz9mMzA1Il0sInNvdXJjZXNDb250ZW50IjpbIi8vIDIwLjIuMi4yMiBNYXRoLmxvZzIoeClcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi8kLmV4cG9ydCcpO1xuXG4kZXhwb3J0KCRleHBvcnQuUywgJ01hdGgnLCB7XG4gIGxvZzI6IGZ1bmN0aW9uIGxvZzIoeCl7XG4gICAgcmV0dXJuIE1hdGgubG9nKHgpIC8gTWF0aC5MTjI7XG4gIH1cbn0pO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2NvcmUtanMvbW9kdWxlcy9lczYubWF0aC5sb2cyLmpzXG4gKiogbW9kdWxlIGlkID0gMzAyXG4gKiogbW9kdWxlIGNodW5rcyA9IDI0XG4gKiovIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");

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

	eval("// 20.2.2.28 Math.sign(x)\nvar $export = __webpack_require__(216);\n\n$export($export.S, 'Math', {sign: __webpack_require__(292)});\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzAzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvZXM2Lm1hdGguc2lnbi5qcz9lOWU4Il0sInNvdXJjZXNDb250ZW50IjpbIi8vIDIwLjIuMi4yOCBNYXRoLnNpZ24oeClcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi8kLmV4cG9ydCcpO1xuXG4kZXhwb3J0KCRleHBvcnQuUywgJ01hdGgnLCB7c2lnbjogcmVxdWlyZSgnLi8kLm1hdGgtc2lnbicpfSk7XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vY29yZS1qcy9tb2R1bGVzL2VzNi5tYXRoLnNpZ24uanNcbiAqKiBtb2R1bGUgaWQgPSAzMDNcbiAqKiBtb2R1bGUgY2h1bmtzID0gMjRcbiAqKi8iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");

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

	eval("// 20.2.2.30 Math.sinh(x)\nvar $export = __webpack_require__(216)\n  , expm1   = __webpack_require__(296)\n  , exp     = Math.exp;\n\n// V8 near Chromium 38 has a problem with very small numbers\n$export($export.S + $export.F * __webpack_require__(222)(function(){\n  return !Math.sinh(-2e-17) != -2e-17;\n}), 'Math', {\n  sinh: function sinh(x){\n    return Math.abs(x = +x) < 1\n      ? (expm1(x) - expm1(-x)) / 2\n      : (exp(x - 1) - exp(-x - 1)) * (Math.E / 2);\n  }\n});\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzA0LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvZXM2Lm1hdGguc2luaC5qcz80ZTQ2Il0sInNvdXJjZXNDb250ZW50IjpbIi8vIDIwLjIuMi4zMCBNYXRoLnNpbmgoeClcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi8kLmV4cG9ydCcpXG4gICwgZXhwbTEgICA9IHJlcXVpcmUoJy4vJC5tYXRoLWV4cG0xJylcbiAgLCBleHAgICAgID0gTWF0aC5leHA7XG5cbi8vIFY4IG5lYXIgQ2hyb21pdW0gMzggaGFzIGEgcHJvYmxlbSB3aXRoIHZlcnkgc21hbGwgbnVtYmVyc1xuJGV4cG9ydCgkZXhwb3J0LlMgKyAkZXhwb3J0LkYgKiByZXF1aXJlKCcuLyQuZmFpbHMnKShmdW5jdGlvbigpe1xuICByZXR1cm4gIU1hdGguc2luaCgtMmUtMTcpICE9IC0yZS0xNztcbn0pLCAnTWF0aCcsIHtcbiAgc2luaDogZnVuY3Rpb24gc2luaCh4KXtcbiAgICByZXR1cm4gTWF0aC5hYnMoeCA9ICt4KSA8IDFcbiAgICAgID8gKGV4cG0xKHgpIC0gZXhwbTEoLXgpKSAvIDJcbiAgICAgIDogKGV4cCh4IC0gMSkgLSBleHAoLXggLSAxKSkgKiAoTWF0aC5FIC8gMik7XG4gIH1cbn0pO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2NvcmUtanMvbW9kdWxlcy9lczYubWF0aC5zaW5oLmpzXG4gKiogbW9kdWxlIGlkID0gMzA0XG4gKiogbW9kdWxlIGNodW5rcyA9IDI0XG4gKiovIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=");

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

	eval("// 20.2.2.33 Math.tanh(x)\nvar $export = __webpack_require__(216)\n  , expm1   = __webpack_require__(296)\n  , exp     = Math.exp;\n\n$export($export.S, 'Math', {\n  tanh: function tanh(x){\n    var a = expm1(x = +x)\n      , b = expm1(-x);\n    return a == Infinity ? 1 : b == Infinity ? -1 : (a - b) / (exp(x) + exp(-x));\n  }\n});\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzA1LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvZXM2Lm1hdGgudGFuaC5qcz83MTY0Il0sInNvdXJjZXNDb250ZW50IjpbIi8vIDIwLjIuMi4zMyBNYXRoLnRhbmgoeClcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi8kLmV4cG9ydCcpXG4gICwgZXhwbTEgICA9IHJlcXVpcmUoJy4vJC5tYXRoLWV4cG0xJylcbiAgLCBleHAgICAgID0gTWF0aC5leHA7XG5cbiRleHBvcnQoJGV4cG9ydC5TLCAnTWF0aCcsIHtcbiAgdGFuaDogZnVuY3Rpb24gdGFuaCh4KXtcbiAgICB2YXIgYSA9IGV4cG0xKHggPSAreClcbiAgICAgICwgYiA9IGV4cG0xKC14KTtcbiAgICByZXR1cm4gYSA9PSBJbmZpbml0eSA/IDEgOiBiID09IEluZmluaXR5ID8gLTEgOiAoYSAtIGIpIC8gKGV4cCh4KSArIGV4cCgteCkpO1xuICB9XG59KTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9jb3JlLWpzL21vZHVsZXMvZXM2Lm1hdGgudGFuaC5qc1xuICoqIG1vZHVsZSBpZCA9IDMwNVxuICoqIG1vZHVsZSBjaHVua3MgPSAyNFxuICoqLyJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");

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

	eval("// 20.2.2.34 Math.trunc(x)\nvar $export = __webpack_require__(216);\n\n$export($export.S, 'Math', {\n  trunc: function trunc(it){\n    return (it > 0 ? Math.floor : Math.ceil)(it);\n  }\n});\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzA2LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvZXM2Lm1hdGgudHJ1bmMuanM/NmUxNCJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyAyMC4yLjIuMzQgTWF0aC50cnVuYyh4KVxudmFyICRleHBvcnQgPSByZXF1aXJlKCcuLyQuZXhwb3J0Jyk7XG5cbiRleHBvcnQoJGV4cG9ydC5TLCAnTWF0aCcsIHtcbiAgdHJ1bmM6IGZ1bmN0aW9uIHRydW5jKGl0KXtcbiAgICByZXR1cm4gKGl0ID4gMCA/IE1hdGguZmxvb3IgOiBNYXRoLmNlaWwpKGl0KTtcbiAgfVxufSk7XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vY29yZS1qcy9tb2R1bGVzL2VzNi5tYXRoLnRydW5jLmpzXG4gKiogbW9kdWxlIGlkID0gMzA2XG4gKiogbW9kdWxlIGNodW5rcyA9IDI0XG4gKiovIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");

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

	eval("var $export        = __webpack_require__(216)\n  , toIndex        = __webpack_require__(239)\n  , fromCharCode   = String.fromCharCode\n  , $fromCodePoint = String.fromCodePoint;\n\n// length should be 1, old FF problem\n$export($export.S + $export.F * (!!$fromCodePoint && $fromCodePoint.length != 1), 'String', {\n  // 21.1.2.2 String.fromCodePoint(...codePoints)\n  fromCodePoint: function fromCodePoint(x){ // eslint-disable-line no-unused-vars\n    var res   = []\n      , $$    = arguments\n      , $$len = $$.length\n      , i     = 0\n      , code;\n    while($$len > i){\n      code = +$$[i++];\n      if(toIndex(code, 0x10ffff) !== code)throw RangeError(code + ' is not a valid code point');\n      res.push(code < 0x10000\n        ? fromCharCode(code)\n        : fromCharCode(((code -= 0x10000) >> 10) + 0xd800, code % 0x400 + 0xdc00)\n      );\n    } return res.join('');\n  }\n});\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzA3LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvZXM2LnN0cmluZy5mcm9tLWNvZGUtcG9pbnQuanM/MGIzMSJdLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgJGV4cG9ydCAgICAgICAgPSByZXF1aXJlKCcuLyQuZXhwb3J0JylcbiAgLCB0b0luZGV4ICAgICAgICA9IHJlcXVpcmUoJy4vJC50by1pbmRleCcpXG4gICwgZnJvbUNoYXJDb2RlICAgPSBTdHJpbmcuZnJvbUNoYXJDb2RlXG4gICwgJGZyb21Db2RlUG9pbnQgPSBTdHJpbmcuZnJvbUNvZGVQb2ludDtcblxuLy8gbGVuZ3RoIHNob3VsZCBiZSAxLCBvbGQgRkYgcHJvYmxlbVxuJGV4cG9ydCgkZXhwb3J0LlMgKyAkZXhwb3J0LkYgKiAoISEkZnJvbUNvZGVQb2ludCAmJiAkZnJvbUNvZGVQb2ludC5sZW5ndGggIT0gMSksICdTdHJpbmcnLCB7XG4gIC8vIDIxLjEuMi4yIFN0cmluZy5mcm9tQ29kZVBvaW50KC4uLmNvZGVQb2ludHMpXG4gIGZyb21Db2RlUG9pbnQ6IGZ1bmN0aW9uIGZyb21Db2RlUG9pbnQoeCl7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW51c2VkLXZhcnNcbiAgICB2YXIgcmVzICAgPSBbXVxuICAgICAgLCAkJCAgICA9IGFyZ3VtZW50c1xuICAgICAgLCAkJGxlbiA9ICQkLmxlbmd0aFxuICAgICAgLCBpICAgICA9IDBcbiAgICAgICwgY29kZTtcbiAgICB3aGlsZSgkJGxlbiA+IGkpe1xuICAgICAgY29kZSA9ICskJFtpKytdO1xuICAgICAgaWYodG9JbmRleChjb2RlLCAweDEwZmZmZikgIT09IGNvZGUpdGhyb3cgUmFuZ2VFcnJvcihjb2RlICsgJyBpcyBub3QgYSB2YWxpZCBjb2RlIHBvaW50Jyk7XG4gICAgICByZXMucHVzaChjb2RlIDwgMHgxMDAwMFxuICAgICAgICA/IGZyb21DaGFyQ29kZShjb2RlKVxuICAgICAgICA6IGZyb21DaGFyQ29kZSgoKGNvZGUgLT0gMHgxMDAwMCkgPj4gMTApICsgMHhkODAwLCBjb2RlICUgMHg0MDAgKyAweGRjMDApXG4gICAgICApO1xuICAgIH0gcmV0dXJuIHJlcy5qb2luKCcnKTtcbiAgfVxufSk7XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vY29yZS1qcy9tb2R1bGVzL2VzNi5zdHJpbmcuZnJvbS1jb2RlLXBvaW50LmpzXG4gKiogbW9kdWxlIGlkID0gMzA3XG4gKiogbW9kdWxlIGNodW5rcyA9IDI0XG4gKiovIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=");

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

	eval("var $export   = __webpack_require__(216)\n  , toIObject = __webpack_require__(236)\n  , toLength  = __webpack_require__(240);\n\n$export($export.S, 'String', {\n  // 21.1.2.4 String.raw(callSite, ...substitutions)\n  raw: function raw(callSite){\n    var tpl   = toIObject(callSite.raw)\n      , len   = toLength(tpl.length)\n      , $$    = arguments\n      , $$len = $$.length\n      , res   = []\n      , i     = 0;\n    while(len > i){\n      res.push(String(tpl[i++]));\n      if(i < $$len)res.push(String($$[i]));\n    } return res.join('');\n  }\n});\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzA4LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvZXM2LnN0cmluZy5yYXcuanM/YmRkOCJdLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgJGV4cG9ydCAgID0gcmVxdWlyZSgnLi8kLmV4cG9ydCcpXG4gICwgdG9JT2JqZWN0ID0gcmVxdWlyZSgnLi8kLnRvLWlvYmplY3QnKVxuICAsIHRvTGVuZ3RoICA9IHJlcXVpcmUoJy4vJC50by1sZW5ndGgnKTtcblxuJGV4cG9ydCgkZXhwb3J0LlMsICdTdHJpbmcnLCB7XG4gIC8vIDIxLjEuMi40IFN0cmluZy5yYXcoY2FsbFNpdGUsIC4uLnN1YnN0aXR1dGlvbnMpXG4gIHJhdzogZnVuY3Rpb24gcmF3KGNhbGxTaXRlKXtcbiAgICB2YXIgdHBsICAgPSB0b0lPYmplY3QoY2FsbFNpdGUucmF3KVxuICAgICAgLCBsZW4gICA9IHRvTGVuZ3RoKHRwbC5sZW5ndGgpXG4gICAgICAsICQkICAgID0gYXJndW1lbnRzXG4gICAgICAsICQkbGVuID0gJCQubGVuZ3RoXG4gICAgICAsIHJlcyAgID0gW11cbiAgICAgICwgaSAgICAgPSAwO1xuICAgIHdoaWxlKGxlbiA+IGkpe1xuICAgICAgcmVzLnB1c2goU3RyaW5nKHRwbFtpKytdKSk7XG4gICAgICBpZihpIDwgJCRsZW4pcmVzLnB1c2goU3RyaW5nKCQkW2ldKSk7XG4gICAgfSByZXR1cm4gcmVzLmpvaW4oJycpO1xuICB9XG59KTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9jb3JlLWpzL21vZHVsZXMvZXM2LnN0cmluZy5yYXcuanNcbiAqKiBtb2R1bGUgaWQgPSAzMDhcbiAqKiBtb2R1bGUgY2h1bmtzID0gMjRcbiAqKi8iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");

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

	eval("'use strict';\n// 21.1.3.25 String.prototype.trim()\n__webpack_require__(276)('trim', function($trim){\n  return function trim(){\n    return $trim(this, 3);\n  };\n});\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzA5LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvZXM2LnN0cmluZy50cmltLmpzPzRiZTEiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuLy8gMjEuMS4zLjI1IFN0cmluZy5wcm90b3R5cGUudHJpbSgpXG5yZXF1aXJlKCcuLyQuc3RyaW5nLXRyaW0nKSgndHJpbScsIGZ1bmN0aW9uKCR0cmltKXtcbiAgcmV0dXJuIGZ1bmN0aW9uIHRyaW0oKXtcbiAgICByZXR1cm4gJHRyaW0odGhpcywgMyk7XG4gIH07XG59KTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9jb3JlLWpzL21vZHVsZXMvZXM2LnN0cmluZy50cmltLmpzXG4gKiogbW9kdWxlIGlkID0gMzA5XG4gKiogbW9kdWxlIGNodW5rcyA9IDI0XG4gKiovIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");

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

	eval("'use strict';\nvar $at  = __webpack_require__(311)(true);\n\n// 21.1.3.27 String.prototype[@@iterator]()\n__webpack_require__(312)(String, 'String', function(iterated){\n  this._t = String(iterated); // target\n  this._i = 0;                // next index\n// 21.1.5.2.1 %StringIteratorPrototype%.next()\n}, function(){\n  var O     = this._t\n    , index = this._i\n    , point;\n  if(index >= O.length)return {value: undefined, done: true};\n  point = $at(O, index);\n  this._i += point.length;\n  return {value: point, done: false};\n});\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzEwLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvZXM2LnN0cmluZy5pdGVyYXRvci5qcz8yM2U4Il0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcbnZhciAkYXQgID0gcmVxdWlyZSgnLi8kLnN0cmluZy1hdCcpKHRydWUpO1xuXG4vLyAyMS4xLjMuMjcgU3RyaW5nLnByb3RvdHlwZVtAQGl0ZXJhdG9yXSgpXG5yZXF1aXJlKCcuLyQuaXRlci1kZWZpbmUnKShTdHJpbmcsICdTdHJpbmcnLCBmdW5jdGlvbihpdGVyYXRlZCl7XG4gIHRoaXMuX3QgPSBTdHJpbmcoaXRlcmF0ZWQpOyAvLyB0YXJnZXRcbiAgdGhpcy5faSA9IDA7ICAgICAgICAgICAgICAgIC8vIG5leHQgaW5kZXhcbi8vIDIxLjEuNS4yLjEgJVN0cmluZ0l0ZXJhdG9yUHJvdG90eXBlJS5uZXh0KClcbn0sIGZ1bmN0aW9uKCl7XG4gIHZhciBPICAgICA9IHRoaXMuX3RcbiAgICAsIGluZGV4ID0gdGhpcy5faVxuICAgICwgcG9pbnQ7XG4gIGlmKGluZGV4ID49IE8ubGVuZ3RoKXJldHVybiB7dmFsdWU6IHVuZGVmaW5lZCwgZG9uZTogdHJ1ZX07XG4gIHBvaW50ID0gJGF0KE8sIGluZGV4KTtcbiAgdGhpcy5faSArPSBwb2ludC5sZW5ndGg7XG4gIHJldHVybiB7dmFsdWU6IHBvaW50LCBkb25lOiBmYWxzZX07XG59KTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9jb3JlLWpzL21vZHVsZXMvZXM2LnN0cmluZy5pdGVyYXRvci5qc1xuICoqIG1vZHVsZSBpZCA9IDMxMFxuICoqIG1vZHVsZSBjaHVua3MgPSAyNFxuICoqLyJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");

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

	eval("var toInteger = __webpack_require__(238)\n  , defined   = __webpack_require__(235);\n// true  -> String#at\n// false -> String#codePointAt\nmodule.exports = function(TO_STRING){\n  return function(that, pos){\n    var s = String(defined(that))\n      , i = toInteger(pos)\n      , l = s.length\n      , a, b;\n    if(i < 0 || i >= l)return TO_STRING ? '' : undefined;\n    a = s.charCodeAt(i);\n    return a < 0xd800 || a > 0xdbff || i + 1 === l || (b = s.charCodeAt(i + 1)) < 0xdc00 || b > 0xdfff\n      ? TO_STRING ? s.charAt(i) : a\n      : TO_STRING ? s.slice(i, i + 2) : (a - 0xd800 << 10) + (b - 0xdc00) + 0x10000;\n  };\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzExLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvJC5zdHJpbmctYXQuanM/NDg5NCJdLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgdG9JbnRlZ2VyID0gcmVxdWlyZSgnLi8kLnRvLWludGVnZXInKVxuICAsIGRlZmluZWQgICA9IHJlcXVpcmUoJy4vJC5kZWZpbmVkJyk7XG4vLyB0cnVlICAtPiBTdHJpbmcjYXRcbi8vIGZhbHNlIC0+IFN0cmluZyNjb2RlUG9pbnRBdFxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihUT19TVFJJTkcpe1xuICByZXR1cm4gZnVuY3Rpb24odGhhdCwgcG9zKXtcbiAgICB2YXIgcyA9IFN0cmluZyhkZWZpbmVkKHRoYXQpKVxuICAgICAgLCBpID0gdG9JbnRlZ2VyKHBvcylcbiAgICAgICwgbCA9IHMubGVuZ3RoXG4gICAgICAsIGEsIGI7XG4gICAgaWYoaSA8IDAgfHwgaSA+PSBsKXJldHVybiBUT19TVFJJTkcgPyAnJyA6IHVuZGVmaW5lZDtcbiAgICBhID0gcy5jaGFyQ29kZUF0KGkpO1xuICAgIHJldHVybiBhIDwgMHhkODAwIHx8IGEgPiAweGRiZmYgfHwgaSArIDEgPT09IGwgfHwgKGIgPSBzLmNoYXJDb2RlQXQoaSArIDEpKSA8IDB4ZGMwMCB8fCBiID4gMHhkZmZmXG4gICAgICA/IFRPX1NUUklORyA/IHMuY2hhckF0KGkpIDogYVxuICAgICAgOiBUT19TVFJJTkcgPyBzLnNsaWNlKGksIGkgKyAyKSA6IChhIC0gMHhkODAwIDw8IDEwKSArIChiIC0gMHhkYzAwKSArIDB4MTAwMDA7XG4gIH07XG59O1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2NvcmUtanMvbW9kdWxlcy8kLnN0cmluZy1hdC5qc1xuICoqIG1vZHVsZSBpZCA9IDMxMVxuICoqIG1vZHVsZSBjaHVua3MgPSAyNFxuICoqLyJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");

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

	eval("'use strict';\nvar LIBRARY        = __webpack_require__(252)\n  , $export        = __webpack_require__(216)\n  , redefine       = __webpack_require__(223)\n  , hide           = __webpack_require__(219)\n  , has            = __webpack_require__(230)\n  , Iterators      = __webpack_require__(313)\n  , $iterCreate    = __webpack_require__(314)\n  , setToStringTag = __webpack_require__(248)\n  , getProto       = __webpack_require__(215).getProto\n  , ITERATOR       = __webpack_require__(244)('iterator')\n  , BUGGY          = !([].keys && 'next' in [].keys()) // Safari has buggy iterators w/o `next`\n  , FF_ITERATOR    = '@@iterator'\n  , KEYS           = 'keys'\n  , VALUES         = 'values';\n\nvar returnThis = function(){ return this; };\n\nmodule.exports = function(Base, NAME, Constructor, next, DEFAULT, IS_SET, FORCED){\n  $iterCreate(Constructor, NAME, next);\n  var getMethod = function(kind){\n    if(!BUGGY && kind in proto)return proto[kind];\n    switch(kind){\n      case KEYS: return function keys(){ return new Constructor(this, kind); };\n      case VALUES: return function values(){ return new Constructor(this, kind); };\n    } return function entries(){ return new Constructor(this, kind); };\n  };\n  var TAG        = NAME + ' Iterator'\n    , DEF_VALUES = DEFAULT == VALUES\n    , VALUES_BUG = false\n    , proto      = Base.prototype\n    , $native    = proto[ITERATOR] || proto[FF_ITERATOR] || DEFAULT && proto[DEFAULT]\n    , $default   = $native || getMethod(DEFAULT)\n    , methods, key;\n  // Fix native\n  if($native){\n    var IteratorPrototype = getProto($default.call(new Base));\n    // Set @@toStringTag to native iterators\n    setToStringTag(IteratorPrototype, TAG, true);\n    // FF fix\n    if(!LIBRARY && has(proto, FF_ITERATOR))hide(IteratorPrototype, ITERATOR, returnThis);\n    // fix Array#{values, @@iterator}.name in V8 / FF\n    if(DEF_VALUES && $native.name !== VALUES){\n      VALUES_BUG = true;\n      $default = function values(){ return $native.call(this); };\n    }\n  }\n  // Define iterator\n  if((!LIBRARY || FORCED) && (BUGGY || VALUES_BUG || !proto[ITERATOR])){\n    hide(proto, ITERATOR, $default);\n  }\n  // Plug for library\n  Iterators[NAME] = $default;\n  Iterators[TAG]  = returnThis;\n  if(DEFAULT){\n    methods = {\n      values:  DEF_VALUES  ? $default : getMethod(VALUES),\n      keys:    IS_SET      ? $default : getMethod(KEYS),\n      entries: !DEF_VALUES ? $default : getMethod('entries')\n    };\n    if(FORCED)for(key in methods){\n      if(!(key in proto))redefine(proto, key, methods[key]);\n    } else $export($export.P + $export.F * (BUGGY || VALUES_BUG), NAME, methods);\n  }\n  return methods;\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzEyLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvJC5pdGVyLWRlZmluZS5qcz9iYTg5Il0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcbnZhciBMSUJSQVJZICAgICAgICA9IHJlcXVpcmUoJy4vJC5saWJyYXJ5JylcbiAgLCAkZXhwb3J0ICAgICAgICA9IHJlcXVpcmUoJy4vJC5leHBvcnQnKVxuICAsIHJlZGVmaW5lICAgICAgID0gcmVxdWlyZSgnLi8kLnJlZGVmaW5lJylcbiAgLCBoaWRlICAgICAgICAgICA9IHJlcXVpcmUoJy4vJC5oaWRlJylcbiAgLCBoYXMgICAgICAgICAgICA9IHJlcXVpcmUoJy4vJC5oYXMnKVxuICAsIEl0ZXJhdG9ycyAgICAgID0gcmVxdWlyZSgnLi8kLml0ZXJhdG9ycycpXG4gICwgJGl0ZXJDcmVhdGUgICAgPSByZXF1aXJlKCcuLyQuaXRlci1jcmVhdGUnKVxuICAsIHNldFRvU3RyaW5nVGFnID0gcmVxdWlyZSgnLi8kLnNldC10by1zdHJpbmctdGFnJylcbiAgLCBnZXRQcm90byAgICAgICA9IHJlcXVpcmUoJy4vJCcpLmdldFByb3RvXG4gICwgSVRFUkFUT1IgICAgICAgPSByZXF1aXJlKCcuLyQud2tzJykoJ2l0ZXJhdG9yJylcbiAgLCBCVUdHWSAgICAgICAgICA9ICEoW10ua2V5cyAmJiAnbmV4dCcgaW4gW10ua2V5cygpKSAvLyBTYWZhcmkgaGFzIGJ1Z2d5IGl0ZXJhdG9ycyB3L28gYG5leHRgXG4gICwgRkZfSVRFUkFUT1IgICAgPSAnQEBpdGVyYXRvcidcbiAgLCBLRVlTICAgICAgICAgICA9ICdrZXlzJ1xuICAsIFZBTFVFUyAgICAgICAgID0gJ3ZhbHVlcyc7XG5cbnZhciByZXR1cm5UaGlzID0gZnVuY3Rpb24oKXsgcmV0dXJuIHRoaXM7IH07XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oQmFzZSwgTkFNRSwgQ29uc3RydWN0b3IsIG5leHQsIERFRkFVTFQsIElTX1NFVCwgRk9SQ0VEKXtcbiAgJGl0ZXJDcmVhdGUoQ29uc3RydWN0b3IsIE5BTUUsIG5leHQpO1xuICB2YXIgZ2V0TWV0aG9kID0gZnVuY3Rpb24oa2luZCl7XG4gICAgaWYoIUJVR0dZICYmIGtpbmQgaW4gcHJvdG8pcmV0dXJuIHByb3RvW2tpbmRdO1xuICAgIHN3aXRjaChraW5kKXtcbiAgICAgIGNhc2UgS0VZUzogcmV0dXJuIGZ1bmN0aW9uIGtleXMoKXsgcmV0dXJuIG5ldyBDb25zdHJ1Y3Rvcih0aGlzLCBraW5kKTsgfTtcbiAgICAgIGNhc2UgVkFMVUVTOiByZXR1cm4gZnVuY3Rpb24gdmFsdWVzKCl7IHJldHVybiBuZXcgQ29uc3RydWN0b3IodGhpcywga2luZCk7IH07XG4gICAgfSByZXR1cm4gZnVuY3Rpb24gZW50cmllcygpeyByZXR1cm4gbmV3IENvbnN0cnVjdG9yKHRoaXMsIGtpbmQpOyB9O1xuICB9O1xuICB2YXIgVEFHICAgICAgICA9IE5BTUUgKyAnIEl0ZXJhdG9yJ1xuICAgICwgREVGX1ZBTFVFUyA9IERFRkFVTFQgPT0gVkFMVUVTXG4gICAgLCBWQUxVRVNfQlVHID0gZmFsc2VcbiAgICAsIHByb3RvICAgICAgPSBCYXNlLnByb3RvdHlwZVxuICAgICwgJG5hdGl2ZSAgICA9IHByb3RvW0lURVJBVE9SXSB8fCBwcm90b1tGRl9JVEVSQVRPUl0gfHwgREVGQVVMVCAmJiBwcm90b1tERUZBVUxUXVxuICAgICwgJGRlZmF1bHQgICA9ICRuYXRpdmUgfHwgZ2V0TWV0aG9kKERFRkFVTFQpXG4gICAgLCBtZXRob2RzLCBrZXk7XG4gIC8vIEZpeCBuYXRpdmVcbiAgaWYoJG5hdGl2ZSl7XG4gICAgdmFyIEl0ZXJhdG9yUHJvdG90eXBlID0gZ2V0UHJvdG8oJGRlZmF1bHQuY2FsbChuZXcgQmFzZSkpO1xuICAgIC8vIFNldCBAQHRvU3RyaW5nVGFnIHRvIG5hdGl2ZSBpdGVyYXRvcnNcbiAgICBzZXRUb1N0cmluZ1RhZyhJdGVyYXRvclByb3RvdHlwZSwgVEFHLCB0cnVlKTtcbiAgICAvLyBGRiBmaXhcbiAgICBpZighTElCUkFSWSAmJiBoYXMocHJvdG8sIEZGX0lURVJBVE9SKSloaWRlKEl0ZXJhdG9yUHJvdG90eXBlLCBJVEVSQVRPUiwgcmV0dXJuVGhpcyk7XG4gICAgLy8gZml4IEFycmF5I3t2YWx1ZXMsIEBAaXRlcmF0b3J9Lm5hbWUgaW4gVjggLyBGRlxuICAgIGlmKERFRl9WQUxVRVMgJiYgJG5hdGl2ZS5uYW1lICE9PSBWQUxVRVMpe1xuICAgICAgVkFMVUVTX0JVRyA9IHRydWU7XG4gICAgICAkZGVmYXVsdCA9IGZ1bmN0aW9uIHZhbHVlcygpeyByZXR1cm4gJG5hdGl2ZS5jYWxsKHRoaXMpOyB9O1xuICAgIH1cbiAgfVxuICAvLyBEZWZpbmUgaXRlcmF0b3JcbiAgaWYoKCFMSUJSQVJZIHx8IEZPUkNFRCkgJiYgKEJVR0dZIHx8IFZBTFVFU19CVUcgfHwgIXByb3RvW0lURVJBVE9SXSkpe1xuICAgIGhpZGUocHJvdG8sIElURVJBVE9SLCAkZGVmYXVsdCk7XG4gIH1cbiAgLy8gUGx1ZyBmb3IgbGlicmFyeVxuICBJdGVyYXRvcnNbTkFNRV0gPSAkZGVmYXVsdDtcbiAgSXRlcmF0b3JzW1RBR10gID0gcmV0dXJuVGhpcztcbiAgaWYoREVGQVVMVCl7XG4gICAgbWV0aG9kcyA9IHtcbiAgICAgIHZhbHVlczogIERFRl9WQUxVRVMgID8gJGRlZmF1bHQgOiBnZXRNZXRob2QoVkFMVUVTKSxcbiAgICAgIGtleXM6ICAgIElTX1NFVCAgICAgID8gJGRlZmF1bHQgOiBnZXRNZXRob2QoS0VZUyksXG4gICAgICBlbnRyaWVzOiAhREVGX1ZBTFVFUyA/ICRkZWZhdWx0IDogZ2V0TWV0aG9kKCdlbnRyaWVzJylcbiAgICB9O1xuICAgIGlmKEZPUkNFRClmb3Ioa2V5IGluIG1ldGhvZHMpe1xuICAgICAgaWYoIShrZXkgaW4gcHJvdG8pKXJlZGVmaW5lKHByb3RvLCBrZXksIG1ldGhvZHNba2V5XSk7XG4gICAgfSBlbHNlICRleHBvcnQoJGV4cG9ydC5QICsgJGV4cG9ydC5GICogKEJVR0dZIHx8IFZBTFVFU19CVUcpLCBOQU1FLCBtZXRob2RzKTtcbiAgfVxuICByZXR1cm4gbWV0aG9kcztcbn07XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vY29yZS1qcy9tb2R1bGVzLyQuaXRlci1kZWZpbmUuanNcbiAqKiBtb2R1bGUgaWQgPSAzMTJcbiAqKiBtb2R1bGUgY2h1bmtzID0gMjRcbiAqKi8iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");

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

	eval("module.exports = {};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzEzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvJC5pdGVyYXRvcnMuanM/MTJkNiJdLCJzb3VyY2VzQ29udGVudCI6WyJtb2R1bGUuZXhwb3J0cyA9IHt9O1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2NvcmUtanMvbW9kdWxlcy8kLml0ZXJhdG9ycy5qc1xuICoqIG1vZHVsZSBpZCA9IDMxM1xuICoqIG1vZHVsZSBjaHVua3MgPSAyNFxuICoqLyJdLCJtYXBwaW5ncyI6IkFBQUEiLCJzb3VyY2VSb290IjoiIn0=");

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

	eval("'use strict';\nvar $              = __webpack_require__(215)\n  , descriptor     = __webpack_require__(220)\n  , setToStringTag = __webpack_require__(248)\n  , IteratorPrototype = {};\n\n// 25.1.2.1.1 %IteratorPrototype%[@@iterator]()\n__webpack_require__(219)(IteratorPrototype, __webpack_require__(244)('iterator'), function(){ return this; });\n\nmodule.exports = function(Constructor, NAME, next){\n  Constructor.prototype = $.create(IteratorPrototype, {next: descriptor(1, next)});\n  setToStringTag(Constructor, NAME + ' Iterator');\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzE0LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvJC5pdGVyLWNyZWF0ZS5qcz81YWUxIl0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcbnZhciAkICAgICAgICAgICAgICA9IHJlcXVpcmUoJy4vJCcpXG4gICwgZGVzY3JpcHRvciAgICAgPSByZXF1aXJlKCcuLyQucHJvcGVydHktZGVzYycpXG4gICwgc2V0VG9TdHJpbmdUYWcgPSByZXF1aXJlKCcuLyQuc2V0LXRvLXN0cmluZy10YWcnKVxuICAsIEl0ZXJhdG9yUHJvdG90eXBlID0ge307XG5cbi8vIDI1LjEuMi4xLjEgJUl0ZXJhdG9yUHJvdG90eXBlJVtAQGl0ZXJhdG9yXSgpXG5yZXF1aXJlKCcuLyQuaGlkZScpKEl0ZXJhdG9yUHJvdG90eXBlLCByZXF1aXJlKCcuLyQud2tzJykoJ2l0ZXJhdG9yJyksIGZ1bmN0aW9uKCl7IHJldHVybiB0aGlzOyB9KTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihDb25zdHJ1Y3RvciwgTkFNRSwgbmV4dCl7XG4gIENvbnN0cnVjdG9yLnByb3RvdHlwZSA9ICQuY3JlYXRlKEl0ZXJhdG9yUHJvdG90eXBlLCB7bmV4dDogZGVzY3JpcHRvcigxLCBuZXh0KX0pO1xuICBzZXRUb1N0cmluZ1RhZyhDb25zdHJ1Y3RvciwgTkFNRSArICcgSXRlcmF0b3InKTtcbn07XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vY29yZS1qcy9tb2R1bGVzLyQuaXRlci1jcmVhdGUuanNcbiAqKiBtb2R1bGUgaWQgPSAzMTRcbiAqKiBtb2R1bGUgY2h1bmtzID0gMjRcbiAqKi8iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");

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

	eval("'use strict';\nvar $export = __webpack_require__(216)\n  , $at     = __webpack_require__(311)(false);\n$export($export.P, 'String', {\n  // 21.1.3.3 String.prototype.codePointAt(pos)\n  codePointAt: function codePointAt(pos){\n    return $at(this, pos);\n  }\n});\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzE1LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvZXM2LnN0cmluZy5jb2RlLXBvaW50LWF0LmpzP2M3OWQiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xudmFyICRleHBvcnQgPSByZXF1aXJlKCcuLyQuZXhwb3J0JylcbiAgLCAkYXQgICAgID0gcmVxdWlyZSgnLi8kLnN0cmluZy1hdCcpKGZhbHNlKTtcbiRleHBvcnQoJGV4cG9ydC5QLCAnU3RyaW5nJywge1xuICAvLyAyMS4xLjMuMyBTdHJpbmcucHJvdG90eXBlLmNvZGVQb2ludEF0KHBvcylcbiAgY29kZVBvaW50QXQ6IGZ1bmN0aW9uIGNvZGVQb2ludEF0KHBvcyl7XG4gICAgcmV0dXJuICRhdCh0aGlzLCBwb3MpO1xuICB9XG59KTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9jb3JlLWpzL21vZHVsZXMvZXM2LnN0cmluZy5jb2RlLXBvaW50LWF0LmpzXG4gKiogbW9kdWxlIGlkID0gMzE1XG4gKiogbW9kdWxlIGNodW5rcyA9IDI0XG4gKiovIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=");

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

	eval("// 21.1.3.6 String.prototype.endsWith(searchString [, endPosition])\n'use strict';\nvar $export   = __webpack_require__(216)\n  , toLength  = __webpack_require__(240)\n  , context   = __webpack_require__(317)\n  , ENDS_WITH = 'endsWith'\n  , $endsWith = ''[ENDS_WITH];\n\n$export($export.P + $export.F * __webpack_require__(319)(ENDS_WITH), 'String', {\n  endsWith: function endsWith(searchString /*, endPosition = @length */){\n    var that = context(this, searchString, ENDS_WITH)\n      , $$   = arguments\n      , endPosition = $$.length > 1 ? $$[1] : undefined\n      , len    = toLength(that.length)\n      , end    = endPosition === undefined ? len : Math.min(toLength(endPosition), len)\n      , search = String(searchString);\n    return $endsWith\n      ? $endsWith.call(that, search, end)\n      : that.slice(end - search.length, end) === search;\n  }\n});\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzE2LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvZXM2LnN0cmluZy5lbmRzLXdpdGguanM/NjNkZiJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyAyMS4xLjMuNiBTdHJpbmcucHJvdG90eXBlLmVuZHNXaXRoKHNlYXJjaFN0cmluZyBbLCBlbmRQb3NpdGlvbl0pXG4ndXNlIHN0cmljdCc7XG52YXIgJGV4cG9ydCAgID0gcmVxdWlyZSgnLi8kLmV4cG9ydCcpXG4gICwgdG9MZW5ndGggID0gcmVxdWlyZSgnLi8kLnRvLWxlbmd0aCcpXG4gICwgY29udGV4dCAgID0gcmVxdWlyZSgnLi8kLnN0cmluZy1jb250ZXh0JylcbiAgLCBFTkRTX1dJVEggPSAnZW5kc1dpdGgnXG4gICwgJGVuZHNXaXRoID0gJydbRU5EU19XSVRIXTtcblxuJGV4cG9ydCgkZXhwb3J0LlAgKyAkZXhwb3J0LkYgKiByZXF1aXJlKCcuLyQuZmFpbHMtaXMtcmVnZXhwJykoRU5EU19XSVRIKSwgJ1N0cmluZycsIHtcbiAgZW5kc1dpdGg6IGZ1bmN0aW9uIGVuZHNXaXRoKHNlYXJjaFN0cmluZyAvKiwgZW5kUG9zaXRpb24gPSBAbGVuZ3RoICovKXtcbiAgICB2YXIgdGhhdCA9IGNvbnRleHQodGhpcywgc2VhcmNoU3RyaW5nLCBFTkRTX1dJVEgpXG4gICAgICAsICQkICAgPSBhcmd1bWVudHNcbiAgICAgICwgZW5kUG9zaXRpb24gPSAkJC5sZW5ndGggPiAxID8gJCRbMV0gOiB1bmRlZmluZWRcbiAgICAgICwgbGVuICAgID0gdG9MZW5ndGgodGhhdC5sZW5ndGgpXG4gICAgICAsIGVuZCAgICA9IGVuZFBvc2l0aW9uID09PSB1bmRlZmluZWQgPyBsZW4gOiBNYXRoLm1pbih0b0xlbmd0aChlbmRQb3NpdGlvbiksIGxlbilcbiAgICAgICwgc2VhcmNoID0gU3RyaW5nKHNlYXJjaFN0cmluZyk7XG4gICAgcmV0dXJuICRlbmRzV2l0aFxuICAgICAgPyAkZW5kc1dpdGguY2FsbCh0aGF0LCBzZWFyY2gsIGVuZClcbiAgICAgIDogdGhhdC5zbGljZShlbmQgLSBzZWFyY2gubGVuZ3RoLCBlbmQpID09PSBzZWFyY2g7XG4gIH1cbn0pO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2NvcmUtanMvbW9kdWxlcy9lczYuc3RyaW5nLmVuZHMtd2l0aC5qc1xuICoqIG1vZHVsZSBpZCA9IDMxNlxuICoqIG1vZHVsZSBjaHVua3MgPSAyNFxuICoqLyJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");

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

	eval("// helper for String#{startsWith, endsWith, includes}\nvar isRegExp = __webpack_require__(318)\n  , defined  = __webpack_require__(235);\n\nmodule.exports = function(that, searchString, NAME){\n  if(isRegExp(searchString))throw TypeError('String#' + NAME + \" doesn't accept regex!\");\n  return String(defined(that));\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzE3LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvJC5zdHJpbmctY29udGV4dC5qcz82MWViIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIGhlbHBlciBmb3IgU3RyaW5nI3tzdGFydHNXaXRoLCBlbmRzV2l0aCwgaW5jbHVkZXN9XG52YXIgaXNSZWdFeHAgPSByZXF1aXJlKCcuLyQuaXMtcmVnZXhwJylcbiAgLCBkZWZpbmVkICA9IHJlcXVpcmUoJy4vJC5kZWZpbmVkJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24odGhhdCwgc2VhcmNoU3RyaW5nLCBOQU1FKXtcbiAgaWYoaXNSZWdFeHAoc2VhcmNoU3RyaW5nKSl0aHJvdyBUeXBlRXJyb3IoJ1N0cmluZyMnICsgTkFNRSArIFwiIGRvZXNuJ3QgYWNjZXB0IHJlZ2V4IVwiKTtcbiAgcmV0dXJuIFN0cmluZyhkZWZpbmVkKHRoYXQpKTtcbn07XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vY29yZS1qcy9tb2R1bGVzLyQuc3RyaW5nLWNvbnRleHQuanNcbiAqKiBtb2R1bGUgaWQgPSAzMTdcbiAqKiBtb2R1bGUgY2h1bmtzID0gMjRcbiAqKi8iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=");

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

	eval("// 7.2.8 IsRegExp(argument)\nvar isObject = __webpack_require__(229)\n  , cof      = __webpack_require__(231)\n  , MATCH    = __webpack_require__(244)('match');\nmodule.exports = function(it){\n  var isRegExp;\n  return isObject(it) && ((isRegExp = it[MATCH]) !== undefined ? !!isRegExp : cof(it) == 'RegExp');\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzE4LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvJC5pcy1yZWdleHAuanM/ZmNiZiJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyA3LjIuOCBJc1JlZ0V4cChhcmd1bWVudClcbnZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4vJC5pcy1vYmplY3QnKVxuICAsIGNvZiAgICAgID0gcmVxdWlyZSgnLi8kLmNvZicpXG4gICwgTUFUQ0ggICAgPSByZXF1aXJlKCcuLyQud2tzJykoJ21hdGNoJyk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGl0KXtcbiAgdmFyIGlzUmVnRXhwO1xuICByZXR1cm4gaXNPYmplY3QoaXQpICYmICgoaXNSZWdFeHAgPSBpdFtNQVRDSF0pICE9PSB1bmRlZmluZWQgPyAhIWlzUmVnRXhwIDogY29mKGl0KSA9PSAnUmVnRXhwJyk7XG59O1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2NvcmUtanMvbW9kdWxlcy8kLmlzLXJlZ2V4cC5qc1xuICoqIG1vZHVsZSBpZCA9IDMxOFxuICoqIG1vZHVsZSBjaHVua3MgPSAyNFxuICoqLyJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");

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

	eval("var MATCH = __webpack_require__(244)('match');\nmodule.exports = function(KEY){\n  var re = /./;\n  try {\n    '/./'[KEY](re);\n  } catch(e){\n    try {\n      re[MATCH] = false;\n      return !'/./'[KEY](re);\n    } catch(f){ /* empty */ }\n  } return true;\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzE5LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvJC5mYWlscy1pcy1yZWdleHAuanM/YTAyNSJdLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgTUFUQ0ggPSByZXF1aXJlKCcuLyQud2tzJykoJ21hdGNoJyk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKEtFWSl7XG4gIHZhciByZSA9IC8uLztcbiAgdHJ5IHtcbiAgICAnLy4vJ1tLRVldKHJlKTtcbiAgfSBjYXRjaChlKXtcbiAgICB0cnkge1xuICAgICAgcmVbTUFUQ0hdID0gZmFsc2U7XG4gICAgICByZXR1cm4gIScvLi8nW0tFWV0ocmUpO1xuICAgIH0gY2F0Y2goZil7IC8qIGVtcHR5ICovIH1cbiAgfSByZXR1cm4gdHJ1ZTtcbn07XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vY29yZS1qcy9tb2R1bGVzLyQuZmFpbHMtaXMtcmVnZXhwLmpzXG4gKiogbW9kdWxlIGlkID0gMzE5XG4gKiogbW9kdWxlIGNodW5rcyA9IDI0XG4gKiovIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=");

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

	eval("// 21.1.3.7 String.prototype.includes(searchString, position = 0)\n'use strict';\nvar $export  = __webpack_require__(216)\n  , context  = __webpack_require__(317)\n  , INCLUDES = 'includes';\n\n$export($export.P + $export.F * __webpack_require__(319)(INCLUDES), 'String', {\n  includes: function includes(searchString /*, position = 0 */){\n    return !!~context(this, searchString, INCLUDES)\n      .indexOf(searchString, arguments.length > 1 ? arguments[1] : undefined);\n  }\n});\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzIwLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvZXM2LnN0cmluZy5pbmNsdWRlcy5qcz85NWY1Il0sInNvdXJjZXNDb250ZW50IjpbIi8vIDIxLjEuMy43IFN0cmluZy5wcm90b3R5cGUuaW5jbHVkZXMoc2VhcmNoU3RyaW5nLCBwb3NpdGlvbiA9IDApXG4ndXNlIHN0cmljdCc7XG52YXIgJGV4cG9ydCAgPSByZXF1aXJlKCcuLyQuZXhwb3J0JylcbiAgLCBjb250ZXh0ICA9IHJlcXVpcmUoJy4vJC5zdHJpbmctY29udGV4dCcpXG4gICwgSU5DTFVERVMgPSAnaW5jbHVkZXMnO1xuXG4kZXhwb3J0KCRleHBvcnQuUCArICRleHBvcnQuRiAqIHJlcXVpcmUoJy4vJC5mYWlscy1pcy1yZWdleHAnKShJTkNMVURFUyksICdTdHJpbmcnLCB7XG4gIGluY2x1ZGVzOiBmdW5jdGlvbiBpbmNsdWRlcyhzZWFyY2hTdHJpbmcgLyosIHBvc2l0aW9uID0gMCAqLyl7XG4gICAgcmV0dXJuICEhfmNvbnRleHQodGhpcywgc2VhcmNoU3RyaW5nLCBJTkNMVURFUylcbiAgICAgIC5pbmRleE9mKHNlYXJjaFN0cmluZywgYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQpO1xuICB9XG59KTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9jb3JlLWpzL21vZHVsZXMvZXM2LnN0cmluZy5pbmNsdWRlcy5qc1xuICoqIG1vZHVsZSBpZCA9IDMyMFxuICoqIG1vZHVsZSBjaHVua3MgPSAyNFxuICoqLyJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");

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

	eval("var $export = __webpack_require__(216);\n\n$export($export.P, 'String', {\n  // 21.1.3.13 String.prototype.repeat(count)\n  repeat: __webpack_require__(322)\n});\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzIxLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvZXM2LnN0cmluZy5yZXBlYXQuanM/NTBmMyJdLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vJC5leHBvcnQnKTtcblxuJGV4cG9ydCgkZXhwb3J0LlAsICdTdHJpbmcnLCB7XG4gIC8vIDIxLjEuMy4xMyBTdHJpbmcucHJvdG90eXBlLnJlcGVhdChjb3VudClcbiAgcmVwZWF0OiByZXF1aXJlKCcuLyQuc3RyaW5nLXJlcGVhdCcpXG59KTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9jb3JlLWpzL21vZHVsZXMvZXM2LnN0cmluZy5yZXBlYXQuanNcbiAqKiBtb2R1bGUgaWQgPSAzMjFcbiAqKiBtb2R1bGUgY2h1bmtzID0gMjRcbiAqKi8iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");

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

	eval("'use strict';\nvar toInteger = __webpack_require__(238)\n  , defined   = __webpack_require__(235);\n\nmodule.exports = function repeat(count){\n  var str = String(defined(this))\n    , res = ''\n    , n   = toInteger(count);\n  if(n < 0 || n == Infinity)throw RangeError(\"Count can't be negative\");\n  for(;n > 0; (n >>>= 1) && (str += str))if(n & 1)res += str;\n  return res;\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzIyLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvJC5zdHJpbmctcmVwZWF0LmpzPzFkMWQiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xudmFyIHRvSW50ZWdlciA9IHJlcXVpcmUoJy4vJC50by1pbnRlZ2VyJylcbiAgLCBkZWZpbmVkICAgPSByZXF1aXJlKCcuLyQuZGVmaW5lZCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIHJlcGVhdChjb3VudCl7XG4gIHZhciBzdHIgPSBTdHJpbmcoZGVmaW5lZCh0aGlzKSlcbiAgICAsIHJlcyA9ICcnXG4gICAgLCBuICAgPSB0b0ludGVnZXIoY291bnQpO1xuICBpZihuIDwgMCB8fCBuID09IEluZmluaXR5KXRocm93IFJhbmdlRXJyb3IoXCJDb3VudCBjYW4ndCBiZSBuZWdhdGl2ZVwiKTtcbiAgZm9yKDtuID4gMDsgKG4gPj4+PSAxKSAmJiAoc3RyICs9IHN0cikpaWYobiAmIDEpcmVzICs9IHN0cjtcbiAgcmV0dXJuIHJlcztcbn07XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vY29yZS1qcy9tb2R1bGVzLyQuc3RyaW5nLXJlcGVhdC5qc1xuICoqIG1vZHVsZSBpZCA9IDMyMlxuICoqIG1vZHVsZSBjaHVua3MgPSAyNFxuICoqLyJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");

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

	eval("// 21.1.3.18 String.prototype.startsWith(searchString [, position ])\n'use strict';\nvar $export     = __webpack_require__(216)\n  , toLength    = __webpack_require__(240)\n  , context     = __webpack_require__(317)\n  , STARTS_WITH = 'startsWith'\n  , $startsWith = ''[STARTS_WITH];\n\n$export($export.P + $export.F * __webpack_require__(319)(STARTS_WITH), 'String', {\n  startsWith: function startsWith(searchString /*, position = 0 */){\n    var that   = context(this, searchString, STARTS_WITH)\n      , $$     = arguments\n      , index  = toLength(Math.min($$.length > 1 ? $$[1] : undefined, that.length))\n      , search = String(searchString);\n    return $startsWith\n      ? $startsWith.call(that, search, index)\n      : that.slice(index, index + search.length) === search;\n  }\n});\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzIzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvZXM2LnN0cmluZy5zdGFydHMtd2l0aC5qcz82NzJmIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIDIxLjEuMy4xOCBTdHJpbmcucHJvdG90eXBlLnN0YXJ0c1dpdGgoc2VhcmNoU3RyaW5nIFssIHBvc2l0aW9uIF0pXG4ndXNlIHN0cmljdCc7XG52YXIgJGV4cG9ydCAgICAgPSByZXF1aXJlKCcuLyQuZXhwb3J0JylcbiAgLCB0b0xlbmd0aCAgICA9IHJlcXVpcmUoJy4vJC50by1sZW5ndGgnKVxuICAsIGNvbnRleHQgICAgID0gcmVxdWlyZSgnLi8kLnN0cmluZy1jb250ZXh0JylcbiAgLCBTVEFSVFNfV0lUSCA9ICdzdGFydHNXaXRoJ1xuICAsICRzdGFydHNXaXRoID0gJydbU1RBUlRTX1dJVEhdO1xuXG4kZXhwb3J0KCRleHBvcnQuUCArICRleHBvcnQuRiAqIHJlcXVpcmUoJy4vJC5mYWlscy1pcy1yZWdleHAnKShTVEFSVFNfV0lUSCksICdTdHJpbmcnLCB7XG4gIHN0YXJ0c1dpdGg6IGZ1bmN0aW9uIHN0YXJ0c1dpdGgoc2VhcmNoU3RyaW5nIC8qLCBwb3NpdGlvbiA9IDAgKi8pe1xuICAgIHZhciB0aGF0ICAgPSBjb250ZXh0KHRoaXMsIHNlYXJjaFN0cmluZywgU1RBUlRTX1dJVEgpXG4gICAgICAsICQkICAgICA9IGFyZ3VtZW50c1xuICAgICAgLCBpbmRleCAgPSB0b0xlbmd0aChNYXRoLm1pbigkJC5sZW5ndGggPiAxID8gJCRbMV0gOiB1bmRlZmluZWQsIHRoYXQubGVuZ3RoKSlcbiAgICAgICwgc2VhcmNoID0gU3RyaW5nKHNlYXJjaFN0cmluZyk7XG4gICAgcmV0dXJuICRzdGFydHNXaXRoXG4gICAgICA/ICRzdGFydHNXaXRoLmNhbGwodGhhdCwgc2VhcmNoLCBpbmRleClcbiAgICAgIDogdGhhdC5zbGljZShpbmRleCwgaW5kZXggKyBzZWFyY2gubGVuZ3RoKSA9PT0gc2VhcmNoO1xuICB9XG59KTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9jb3JlLWpzL21vZHVsZXMvZXM2LnN0cmluZy5zdGFydHMtd2l0aC5qc1xuICoqIG1vZHVsZSBpZCA9IDMyM1xuICoqIG1vZHVsZSBjaHVua3MgPSAyNFxuICoqLyJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=");

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

	eval("'use strict';\nvar ctx         = __webpack_require__(225)\n  , $export     = __webpack_require__(216)\n  , toObject    = __webpack_require__(234)\n  , call        = __webpack_require__(325)\n  , isArrayIter = __webpack_require__(326)\n  , toLength    = __webpack_require__(240)\n  , getIterFn   = __webpack_require__(327);\n$export($export.S + $export.F * !__webpack_require__(328)(function(iter){ Array.from(iter); }), 'Array', {\n  // 22.1.2.1 Array.from(arrayLike, mapfn = undefined, thisArg = undefined)\n  from: function from(arrayLike/*, mapfn = undefined, thisArg = undefined*/){\n    var O       = toObject(arrayLike)\n      , C       = typeof this == 'function' ? this : Array\n      , $$      = arguments\n      , $$len   = $$.length\n      , mapfn   = $$len > 1 ? $$[1] : undefined\n      , mapping = mapfn !== undefined\n      , index   = 0\n      , iterFn  = getIterFn(O)\n      , length, result, step, iterator;\n    if(mapping)mapfn = ctx(mapfn, $$len > 2 ? $$[2] : undefined, 2);\n    // if object isn't iterable or it's array with default iterator - use simple case\n    if(iterFn != undefined && !(C == Array && isArrayIter(iterFn))){\n      for(iterator = iterFn.call(O), result = new C; !(step = iterator.next()).done; index++){\n        result[index] = mapping ? call(iterator, mapfn, [step.value, index], true) : step.value;\n      }\n    } else {\n      length = toLength(O.length);\n      for(result = new C(length); length > index; index++){\n        result[index] = mapping ? mapfn(O[index], index) : O[index];\n      }\n    }\n    result.length = index;\n    return result;\n  }\n});\n\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzI0LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvZXM2LmFycmF5LmZyb20uanM/YzU4NiJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG52YXIgY3R4ICAgICAgICAgPSByZXF1aXJlKCcuLyQuY3R4JylcbiAgLCAkZXhwb3J0ICAgICA9IHJlcXVpcmUoJy4vJC5leHBvcnQnKVxuICAsIHRvT2JqZWN0ICAgID0gcmVxdWlyZSgnLi8kLnRvLW9iamVjdCcpXG4gICwgY2FsbCAgICAgICAgPSByZXF1aXJlKCcuLyQuaXRlci1jYWxsJylcbiAgLCBpc0FycmF5SXRlciA9IHJlcXVpcmUoJy4vJC5pcy1hcnJheS1pdGVyJylcbiAgLCB0b0xlbmd0aCAgICA9IHJlcXVpcmUoJy4vJC50by1sZW5ndGgnKVxuICAsIGdldEl0ZXJGbiAgID0gcmVxdWlyZSgnLi9jb3JlLmdldC1pdGVyYXRvci1tZXRob2QnKTtcbiRleHBvcnQoJGV4cG9ydC5TICsgJGV4cG9ydC5GICogIXJlcXVpcmUoJy4vJC5pdGVyLWRldGVjdCcpKGZ1bmN0aW9uKGl0ZXIpeyBBcnJheS5mcm9tKGl0ZXIpOyB9KSwgJ0FycmF5Jywge1xuICAvLyAyMi4xLjIuMSBBcnJheS5mcm9tKGFycmF5TGlrZSwgbWFwZm4gPSB1bmRlZmluZWQsIHRoaXNBcmcgPSB1bmRlZmluZWQpXG4gIGZyb206IGZ1bmN0aW9uIGZyb20oYXJyYXlMaWtlLyosIG1hcGZuID0gdW5kZWZpbmVkLCB0aGlzQXJnID0gdW5kZWZpbmVkKi8pe1xuICAgIHZhciBPICAgICAgID0gdG9PYmplY3QoYXJyYXlMaWtlKVxuICAgICAgLCBDICAgICAgID0gdHlwZW9mIHRoaXMgPT0gJ2Z1bmN0aW9uJyA/IHRoaXMgOiBBcnJheVxuICAgICAgLCAkJCAgICAgID0gYXJndW1lbnRzXG4gICAgICAsICQkbGVuICAgPSAkJC5sZW5ndGhcbiAgICAgICwgbWFwZm4gICA9ICQkbGVuID4gMSA/ICQkWzFdIDogdW5kZWZpbmVkXG4gICAgICAsIG1hcHBpbmcgPSBtYXBmbiAhPT0gdW5kZWZpbmVkXG4gICAgICAsIGluZGV4ICAgPSAwXG4gICAgICAsIGl0ZXJGbiAgPSBnZXRJdGVyRm4oTylcbiAgICAgICwgbGVuZ3RoLCByZXN1bHQsIHN0ZXAsIGl0ZXJhdG9yO1xuICAgIGlmKG1hcHBpbmcpbWFwZm4gPSBjdHgobWFwZm4sICQkbGVuID4gMiA/ICQkWzJdIDogdW5kZWZpbmVkLCAyKTtcbiAgICAvLyBpZiBvYmplY3QgaXNuJ3QgaXRlcmFibGUgb3IgaXQncyBhcnJheSB3aXRoIGRlZmF1bHQgaXRlcmF0b3IgLSB1c2Ugc2ltcGxlIGNhc2VcbiAgICBpZihpdGVyRm4gIT0gdW5kZWZpbmVkICYmICEoQyA9PSBBcnJheSAmJiBpc0FycmF5SXRlcihpdGVyRm4pKSl7XG4gICAgICBmb3IoaXRlcmF0b3IgPSBpdGVyRm4uY2FsbChPKSwgcmVzdWx0ID0gbmV3IEM7ICEoc3RlcCA9IGl0ZXJhdG9yLm5leHQoKSkuZG9uZTsgaW5kZXgrKyl7XG4gICAgICAgIHJlc3VsdFtpbmRleF0gPSBtYXBwaW5nID8gY2FsbChpdGVyYXRvciwgbWFwZm4sIFtzdGVwLnZhbHVlLCBpbmRleF0sIHRydWUpIDogc3RlcC52YWx1ZTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgbGVuZ3RoID0gdG9MZW5ndGgoTy5sZW5ndGgpO1xuICAgICAgZm9yKHJlc3VsdCA9IG5ldyBDKGxlbmd0aCk7IGxlbmd0aCA+IGluZGV4OyBpbmRleCsrKXtcbiAgICAgICAgcmVzdWx0W2luZGV4XSA9IG1hcHBpbmcgPyBtYXBmbihPW2luZGV4XSwgaW5kZXgpIDogT1tpbmRleF07XG4gICAgICB9XG4gICAgfVxuICAgIHJlc3VsdC5sZW5ndGggPSBpbmRleDtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG59KTtcblxuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2NvcmUtanMvbW9kdWxlcy9lczYuYXJyYXkuZnJvbS5qc1xuICoqIG1vZHVsZSBpZCA9IDMyNFxuICoqIG1vZHVsZSBjaHVua3MgPSAyNFxuICoqLyJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==");

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

	eval("// call something on iterator step with safe closing on error\nvar anObject = __webpack_require__(233);\nmodule.exports = function(iterator, fn, value, entries){\n  try {\n    return entries ? fn(anObject(value)[0], value[1]) : fn(value);\n  // 7.4.6 IteratorClose(iterator, completion)\n  } catch(e){\n    var ret = iterator['return'];\n    if(ret !== undefined)anObject(ret.call(iterator));\n    throw e;\n  }\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzI1LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvJC5pdGVyLWNhbGwuanM/NWIzZCJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBjYWxsIHNvbWV0aGluZyBvbiBpdGVyYXRvciBzdGVwIHdpdGggc2FmZSBjbG9zaW5nIG9uIGVycm9yXG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuLyQuYW4tb2JqZWN0Jyk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGl0ZXJhdG9yLCBmbiwgdmFsdWUsIGVudHJpZXMpe1xuICB0cnkge1xuICAgIHJldHVybiBlbnRyaWVzID8gZm4oYW5PYmplY3QodmFsdWUpWzBdLCB2YWx1ZVsxXSkgOiBmbih2YWx1ZSk7XG4gIC8vIDcuNC42IEl0ZXJhdG9yQ2xvc2UoaXRlcmF0b3IsIGNvbXBsZXRpb24pXG4gIH0gY2F0Y2goZSl7XG4gICAgdmFyIHJldCA9IGl0ZXJhdG9yWydyZXR1cm4nXTtcbiAgICBpZihyZXQgIT09IHVuZGVmaW5lZClhbk9iamVjdChyZXQuY2FsbChpdGVyYXRvcikpO1xuICAgIHRocm93IGU7XG4gIH1cbn07XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vY29yZS1qcy9tb2R1bGVzLyQuaXRlci1jYWxsLmpzXG4gKiogbW9kdWxlIGlkID0gMzI1XG4gKiogbW9kdWxlIGNodW5rcyA9IDI0XG4gKiovIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=");

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

	eval("// check on default Array iterator\nvar Iterators  = __webpack_require__(313)\n  , ITERATOR   = __webpack_require__(244)('iterator')\n  , ArrayProto = Array.prototype;\n\nmodule.exports = function(it){\n  return it !== undefined && (Iterators.Array === it || ArrayProto[ITERATOR] === it);\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzI2LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvJC5pcy1hcnJheS1pdGVyLmpzP2NlYTgiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gY2hlY2sgb24gZGVmYXVsdCBBcnJheSBpdGVyYXRvclxudmFyIEl0ZXJhdG9ycyAgPSByZXF1aXJlKCcuLyQuaXRlcmF0b3JzJylcbiAgLCBJVEVSQVRPUiAgID0gcmVxdWlyZSgnLi8kLndrcycpKCdpdGVyYXRvcicpXG4gICwgQXJyYXlQcm90byA9IEFycmF5LnByb3RvdHlwZTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihpdCl7XG4gIHJldHVybiBpdCAhPT0gdW5kZWZpbmVkICYmIChJdGVyYXRvcnMuQXJyYXkgPT09IGl0IHx8IEFycmF5UHJvdG9bSVRFUkFUT1JdID09PSBpdCk7XG59O1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2NvcmUtanMvbW9kdWxlcy8kLmlzLWFycmF5LWl0ZXIuanNcbiAqKiBtb2R1bGUgaWQgPSAzMjZcbiAqKiBtb2R1bGUgY2h1bmtzID0gMjRcbiAqKi8iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=");

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

	eval("var classof   = __webpack_require__(260)\n  , ITERATOR  = __webpack_require__(244)('iterator')\n  , Iterators = __webpack_require__(313);\nmodule.exports = __webpack_require__(218).getIteratorMethod = function(it){\n  if(it != undefined)return it[ITERATOR]\n    || it['@@iterator']\n    || Iterators[classof(it)];\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzI3LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvY29yZS5nZXQtaXRlcmF0b3ItbWV0aG9kLmpzPzY5M2EiXSwic291cmNlc0NvbnRlbnQiOlsidmFyIGNsYXNzb2YgICA9IHJlcXVpcmUoJy4vJC5jbGFzc29mJylcbiAgLCBJVEVSQVRPUiAgPSByZXF1aXJlKCcuLyQud2tzJykoJ2l0ZXJhdG9yJylcbiAgLCBJdGVyYXRvcnMgPSByZXF1aXJlKCcuLyQuaXRlcmF0b3JzJyk7XG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vJC5jb3JlJykuZ2V0SXRlcmF0b3JNZXRob2QgPSBmdW5jdGlvbihpdCl7XG4gIGlmKGl0ICE9IHVuZGVmaW5lZClyZXR1cm4gaXRbSVRFUkFUT1JdXG4gICAgfHwgaXRbJ0BAaXRlcmF0b3InXVxuICAgIHx8IEl0ZXJhdG9yc1tjbGFzc29mKGl0KV07XG59O1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2NvcmUtanMvbW9kdWxlcy9jb3JlLmdldC1pdGVyYXRvci1tZXRob2QuanNcbiAqKiBtb2R1bGUgaWQgPSAzMjdcbiAqKiBtb2R1bGUgY2h1bmtzID0gMjRcbiAqKi8iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=");

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

	eval("var ITERATOR     = __webpack_require__(244)('iterator')\n  , SAFE_CLOSING = false;\n\ntry {\n  var riter = [7][ITERATOR]();\n  riter['return'] = function(){ SAFE_CLOSING = true; };\n  Array.from(riter, function(){ throw 2; });\n} catch(e){ /* empty */ }\n\nmodule.exports = function(exec, skipClosing){\n  if(!skipClosing && !SAFE_CLOSING)return false;\n  var safe = false;\n  try {\n    var arr  = [7]\n      , iter = arr[ITERATOR]();\n    iter.next = function(){ return {done: safe = true}; };\n    arr[ITERATOR] = function(){ return iter; };\n    exec(arr);\n  } catch(e){ /* empty */ }\n  return safe;\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzI4LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvJC5pdGVyLWRldGVjdC5qcz8xMjJmIl0sInNvdXJjZXNDb250ZW50IjpbInZhciBJVEVSQVRPUiAgICAgPSByZXF1aXJlKCcuLyQud2tzJykoJ2l0ZXJhdG9yJylcbiAgLCBTQUZFX0NMT1NJTkcgPSBmYWxzZTtcblxudHJ5IHtcbiAgdmFyIHJpdGVyID0gWzddW0lURVJBVE9SXSgpO1xuICByaXRlclsncmV0dXJuJ10gPSBmdW5jdGlvbigpeyBTQUZFX0NMT1NJTkcgPSB0cnVlOyB9O1xuICBBcnJheS5mcm9tKHJpdGVyLCBmdW5jdGlvbigpeyB0aHJvdyAyOyB9KTtcbn0gY2F0Y2goZSl7IC8qIGVtcHR5ICovIH1cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihleGVjLCBza2lwQ2xvc2luZyl7XG4gIGlmKCFza2lwQ2xvc2luZyAmJiAhU0FGRV9DTE9TSU5HKXJldHVybiBmYWxzZTtcbiAgdmFyIHNhZmUgPSBmYWxzZTtcbiAgdHJ5IHtcbiAgICB2YXIgYXJyICA9IFs3XVxuICAgICAgLCBpdGVyID0gYXJyW0lURVJBVE9SXSgpO1xuICAgIGl0ZXIubmV4dCA9IGZ1bmN0aW9uKCl7IHJldHVybiB7ZG9uZTogc2FmZSA9IHRydWV9OyB9O1xuICAgIGFycltJVEVSQVRPUl0gPSBmdW5jdGlvbigpeyByZXR1cm4gaXRlcjsgfTtcbiAgICBleGVjKGFycik7XG4gIH0gY2F0Y2goZSl7IC8qIGVtcHR5ICovIH1cbiAgcmV0dXJuIHNhZmU7XG59O1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2NvcmUtanMvbW9kdWxlcy8kLml0ZXItZGV0ZWN0LmpzXG4gKiogbW9kdWxlIGlkID0gMzI4XG4gKiogbW9kdWxlIGNodW5rcyA9IDI0XG4gKiovIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=");

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

	eval("'use strict';\nvar $export = __webpack_require__(216);\n\n// WebKit Array.of isn't generic\n$export($export.S + $export.F * __webpack_require__(222)(function(){\n  function F(){}\n  return !(Array.of.call(F) instanceof F);\n}), 'Array', {\n  // 22.1.2.3 Array.of( ...items)\n  of: function of(/* ...args */){\n    var index  = 0\n      , $$     = arguments\n      , $$len  = $$.length\n      , result = new (typeof this == 'function' ? this : Array)($$len);\n    while($$len > index)result[index] = $$[index++];\n    result.length = $$len;\n    return result;\n  }\n});\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzI5LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvZXM2LmFycmF5Lm9mLmpzP2U4NzQiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xudmFyICRleHBvcnQgPSByZXF1aXJlKCcuLyQuZXhwb3J0Jyk7XG5cbi8vIFdlYktpdCBBcnJheS5vZiBpc24ndCBnZW5lcmljXG4kZXhwb3J0KCRleHBvcnQuUyArICRleHBvcnQuRiAqIHJlcXVpcmUoJy4vJC5mYWlscycpKGZ1bmN0aW9uKCl7XG4gIGZ1bmN0aW9uIEYoKXt9XG4gIHJldHVybiAhKEFycmF5Lm9mLmNhbGwoRikgaW5zdGFuY2VvZiBGKTtcbn0pLCAnQXJyYXknLCB7XG4gIC8vIDIyLjEuMi4zIEFycmF5Lm9mKCAuLi5pdGVtcylcbiAgb2Y6IGZ1bmN0aW9uIG9mKC8qIC4uLmFyZ3MgKi8pe1xuICAgIHZhciBpbmRleCAgPSAwXG4gICAgICAsICQkICAgICA9IGFyZ3VtZW50c1xuICAgICAgLCAkJGxlbiAgPSAkJC5sZW5ndGhcbiAgICAgICwgcmVzdWx0ID0gbmV3ICh0eXBlb2YgdGhpcyA9PSAnZnVuY3Rpb24nID8gdGhpcyA6IEFycmF5KSgkJGxlbik7XG4gICAgd2hpbGUoJCRsZW4gPiBpbmRleClyZXN1bHRbaW5kZXhdID0gJCRbaW5kZXgrK107XG4gICAgcmVzdWx0Lmxlbmd0aCA9ICQkbGVuO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbn0pO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2NvcmUtanMvbW9kdWxlcy9lczYuYXJyYXkub2YuanNcbiAqKiBtb2R1bGUgaWQgPSAzMjlcbiAqKiBtb2R1bGUgY2h1bmtzID0gMjRcbiAqKi8iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");

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

	eval("'use strict';\nvar addToUnscopables = __webpack_require__(331)\n  , step             = __webpack_require__(332)\n  , Iterators        = __webpack_require__(313)\n  , toIObject        = __webpack_require__(236);\n\n// 22.1.3.4 Array.prototype.entries()\n// 22.1.3.13 Array.prototype.keys()\n// 22.1.3.29 Array.prototype.values()\n// 22.1.3.30 Array.prototype[@@iterator]()\nmodule.exports = __webpack_require__(312)(Array, 'Array', function(iterated, kind){\n  this._t = toIObject(iterated); // target\n  this._i = 0;                   // next index\n  this._k = kind;                // kind\n// 22.1.5.2.1 %ArrayIteratorPrototype%.next()\n}, function(){\n  var O     = this._t\n    , kind  = this._k\n    , index = this._i++;\n  if(!O || index >= O.length){\n    this._t = undefined;\n    return step(1);\n  }\n  if(kind == 'keys'  )return step(0, index);\n  if(kind == 'values')return step(0, O[index]);\n  return step(0, [index, O[index]]);\n}, 'values');\n\n// argumentsList[@@iterator] is %ArrayProto_values% (9.4.4.6, 9.4.4.7)\nIterators.Arguments = Iterators.Array;\n\naddToUnscopables('keys');\naddToUnscopables('values');\naddToUnscopables('entries');\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzMwLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvZXM2LmFycmF5Lml0ZXJhdG9yLmpzPzcwOGIiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xudmFyIGFkZFRvVW5zY29wYWJsZXMgPSByZXF1aXJlKCcuLyQuYWRkLXRvLXVuc2NvcGFibGVzJylcbiAgLCBzdGVwICAgICAgICAgICAgID0gcmVxdWlyZSgnLi8kLml0ZXItc3RlcCcpXG4gICwgSXRlcmF0b3JzICAgICAgICA9IHJlcXVpcmUoJy4vJC5pdGVyYXRvcnMnKVxuICAsIHRvSU9iamVjdCAgICAgICAgPSByZXF1aXJlKCcuLyQudG8taW9iamVjdCcpO1xuXG4vLyAyMi4xLjMuNCBBcnJheS5wcm90b3R5cGUuZW50cmllcygpXG4vLyAyMi4xLjMuMTMgQXJyYXkucHJvdG90eXBlLmtleXMoKVxuLy8gMjIuMS4zLjI5IEFycmF5LnByb3RvdHlwZS52YWx1ZXMoKVxuLy8gMjIuMS4zLjMwIEFycmF5LnByb3RvdHlwZVtAQGl0ZXJhdG9yXSgpXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vJC5pdGVyLWRlZmluZScpKEFycmF5LCAnQXJyYXknLCBmdW5jdGlvbihpdGVyYXRlZCwga2luZCl7XG4gIHRoaXMuX3QgPSB0b0lPYmplY3QoaXRlcmF0ZWQpOyAvLyB0YXJnZXRcbiAgdGhpcy5faSA9IDA7ICAgICAgICAgICAgICAgICAgIC8vIG5leHQgaW5kZXhcbiAgdGhpcy5fayA9IGtpbmQ7ICAgICAgICAgICAgICAgIC8vIGtpbmRcbi8vIDIyLjEuNS4yLjEgJUFycmF5SXRlcmF0b3JQcm90b3R5cGUlLm5leHQoKVxufSwgZnVuY3Rpb24oKXtcbiAgdmFyIE8gICAgID0gdGhpcy5fdFxuICAgICwga2luZCAgPSB0aGlzLl9rXG4gICAgLCBpbmRleCA9IHRoaXMuX2krKztcbiAgaWYoIU8gfHwgaW5kZXggPj0gTy5sZW5ndGgpe1xuICAgIHRoaXMuX3QgPSB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIHN0ZXAoMSk7XG4gIH1cbiAgaWYoa2luZCA9PSAna2V5cycgIClyZXR1cm4gc3RlcCgwLCBpbmRleCk7XG4gIGlmKGtpbmQgPT0gJ3ZhbHVlcycpcmV0dXJuIHN0ZXAoMCwgT1tpbmRleF0pO1xuICByZXR1cm4gc3RlcCgwLCBbaW5kZXgsIE9baW5kZXhdXSk7XG59LCAndmFsdWVzJyk7XG5cbi8vIGFyZ3VtZW50c0xpc3RbQEBpdGVyYXRvcl0gaXMgJUFycmF5UHJvdG9fdmFsdWVzJSAoOS40LjQuNiwgOS40LjQuNylcbkl0ZXJhdG9ycy5Bcmd1bWVudHMgPSBJdGVyYXRvcnMuQXJyYXk7XG5cbmFkZFRvVW5zY29wYWJsZXMoJ2tleXMnKTtcbmFkZFRvVW5zY29wYWJsZXMoJ3ZhbHVlcycpO1xuYWRkVG9VbnNjb3BhYmxlcygnZW50cmllcycpO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2NvcmUtanMvbW9kdWxlcy9lczYuYXJyYXkuaXRlcmF0b3IuanNcbiAqKiBtb2R1bGUgaWQgPSAzMzBcbiAqKiBtb2R1bGUgY2h1bmtzID0gMjRcbiAqKi8iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");

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

	eval("// 22.1.3.31 Array.prototype[@@unscopables]\nvar UNSCOPABLES = __webpack_require__(244)('unscopables')\n  , ArrayProto  = Array.prototype;\nif(ArrayProto[UNSCOPABLES] == undefined)__webpack_require__(219)(ArrayProto, UNSCOPABLES, {});\nmodule.exports = function(key){\n  ArrayProto[UNSCOPABLES][key] = true;\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzMxLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvJC5hZGQtdG8tdW5zY29wYWJsZXMuanM/ZDY0MyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyAyMi4xLjMuMzEgQXJyYXkucHJvdG90eXBlW0BAdW5zY29wYWJsZXNdXG52YXIgVU5TQ09QQUJMRVMgPSByZXF1aXJlKCcuLyQud2tzJykoJ3Vuc2NvcGFibGVzJylcbiAgLCBBcnJheVByb3RvICA9IEFycmF5LnByb3RvdHlwZTtcbmlmKEFycmF5UHJvdG9bVU5TQ09QQUJMRVNdID09IHVuZGVmaW5lZClyZXF1aXJlKCcuLyQuaGlkZScpKEFycmF5UHJvdG8sIFVOU0NPUEFCTEVTLCB7fSk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGtleSl7XG4gIEFycmF5UHJvdG9bVU5TQ09QQUJMRVNdW2tleV0gPSB0cnVlO1xufTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9jb3JlLWpzL21vZHVsZXMvJC5hZGQtdG8tdW5zY29wYWJsZXMuanNcbiAqKiBtb2R1bGUgaWQgPSAzMzFcbiAqKiBtb2R1bGUgY2h1bmtzID0gMjRcbiAqKi8iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");

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

	eval("module.exports = function(done, value){\n  return {value: value, done: !!done};\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzMyLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvJC5pdGVyLXN0ZXAuanM/N2I1NyJdLCJzb3VyY2VzQ29udGVudCI6WyJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGRvbmUsIHZhbHVlKXtcbiAgcmV0dXJuIHt2YWx1ZTogdmFsdWUsIGRvbmU6ICEhZG9uZX07XG59O1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2NvcmUtanMvbW9kdWxlcy8kLml0ZXItc3RlcC5qc1xuICoqIG1vZHVsZSBpZCA9IDMzMlxuICoqIG1vZHVsZSBjaHVua3MgPSAyNFxuICoqLyJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");

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

	eval("__webpack_require__(334)('Array');\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzMzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvZXM2LmFycmF5LnNwZWNpZXMuanM/MDA3NSJdLCJzb3VyY2VzQ29udGVudCI6WyJyZXF1aXJlKCcuLyQuc2V0LXNwZWNpZXMnKSgnQXJyYXknKTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9jb3JlLWpzL21vZHVsZXMvZXM2LmFycmF5LnNwZWNpZXMuanNcbiAqKiBtb2R1bGUgaWQgPSAzMzNcbiAqKiBtb2R1bGUgY2h1bmtzID0gMjRcbiAqKi8iXSwibWFwcGluZ3MiOiJBQUFBIiwic291cmNlUm9vdCI6IiJ9");

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

	eval("'use strict';\nvar global      = __webpack_require__(217)\n  , $           = __webpack_require__(215)\n  , DESCRIPTORS = __webpack_require__(221)\n  , SPECIES     = __webpack_require__(244)('species');\n\nmodule.exports = function(KEY){\n  var C = global[KEY];\n  if(DESCRIPTORS && C && !C[SPECIES])$.setDesc(C, SPECIES, {\n    configurable: true,\n    get: function(){ return this; }\n  });\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzM0LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvJC5zZXQtc3BlY2llcy5qcz9hZDY3Il0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcbnZhciBnbG9iYWwgICAgICA9IHJlcXVpcmUoJy4vJC5nbG9iYWwnKVxuICAsICQgICAgICAgICAgID0gcmVxdWlyZSgnLi8kJylcbiAgLCBERVNDUklQVE9SUyA9IHJlcXVpcmUoJy4vJC5kZXNjcmlwdG9ycycpXG4gICwgU1BFQ0lFUyAgICAgPSByZXF1aXJlKCcuLyQud2tzJykoJ3NwZWNpZXMnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihLRVkpe1xuICB2YXIgQyA9IGdsb2JhbFtLRVldO1xuICBpZihERVNDUklQVE9SUyAmJiBDICYmICFDW1NQRUNJRVNdKSQuc2V0RGVzYyhDLCBTUEVDSUVTLCB7XG4gICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgIGdldDogZnVuY3Rpb24oKXsgcmV0dXJuIHRoaXM7IH1cbiAgfSk7XG59O1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2NvcmUtanMvbW9kdWxlcy8kLnNldC1zcGVjaWVzLmpzXG4gKiogbW9kdWxlIGlkID0gMzM0XG4gKiogbW9kdWxlIGNodW5rcyA9IDI0XG4gKiovIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");

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

	eval("// 22.1.3.3 Array.prototype.copyWithin(target, start, end = this.length)\nvar $export = __webpack_require__(216);\n\n$export($export.P, 'Array', {copyWithin: __webpack_require__(336)});\n\n__webpack_require__(331)('copyWithin');\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzM1LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvZXM2LmFycmF5LmNvcHktd2l0aGluLmpzP2ZlNzEiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gMjIuMS4zLjMgQXJyYXkucHJvdG90eXBlLmNvcHlXaXRoaW4odGFyZ2V0LCBzdGFydCwgZW5kID0gdGhpcy5sZW5ndGgpXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vJC5leHBvcnQnKTtcblxuJGV4cG9ydCgkZXhwb3J0LlAsICdBcnJheScsIHtjb3B5V2l0aGluOiByZXF1aXJlKCcuLyQuYXJyYXktY29weS13aXRoaW4nKX0pO1xuXG5yZXF1aXJlKCcuLyQuYWRkLXRvLXVuc2NvcGFibGVzJykoJ2NvcHlXaXRoaW4nKTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9jb3JlLWpzL21vZHVsZXMvZXM2LmFycmF5LmNvcHktd2l0aGluLmpzXG4gKiogbW9kdWxlIGlkID0gMzM1XG4gKiogbW9kdWxlIGNodW5rcyA9IDI0XG4gKiovIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=");

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

	eval("// 22.1.3.3 Array.prototype.copyWithin(target, start, end = this.length)\n'use strict';\nvar toObject = __webpack_require__(234)\n  , toIndex  = __webpack_require__(239)\n  , toLength = __webpack_require__(240);\n\nmodule.exports = [].copyWithin || function copyWithin(target/*= 0*/, start/*= 0, end = @length*/){\n  var O     = toObject(this)\n    , len   = toLength(O.length)\n    , to    = toIndex(target, len)\n    , from  = toIndex(start, len)\n    , $$    = arguments\n    , end   = $$.length > 2 ? $$[2] : undefined\n    , count = Math.min((end === undefined ? len : toIndex(end, len)) - from, len - to)\n    , inc   = 1;\n  if(from < to && to < from + count){\n    inc  = -1;\n    from += count - 1;\n    to   += count - 1;\n  }\n  while(count-- > 0){\n    if(from in O)O[to] = O[from];\n    else delete O[to];\n    to   += inc;\n    from += inc;\n  } return O;\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzM2LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvJC5hcnJheS1jb3B5LXdpdGhpbi5qcz85YzYxIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIDIyLjEuMy4zIEFycmF5LnByb3RvdHlwZS5jb3B5V2l0aGluKHRhcmdldCwgc3RhcnQsIGVuZCA9IHRoaXMubGVuZ3RoKVxuJ3VzZSBzdHJpY3QnO1xudmFyIHRvT2JqZWN0ID0gcmVxdWlyZSgnLi8kLnRvLW9iamVjdCcpXG4gICwgdG9JbmRleCAgPSByZXF1aXJlKCcuLyQudG8taW5kZXgnKVxuICAsIHRvTGVuZ3RoID0gcmVxdWlyZSgnLi8kLnRvLWxlbmd0aCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFtdLmNvcHlXaXRoaW4gfHwgZnVuY3Rpb24gY29weVdpdGhpbih0YXJnZXQvKj0gMCovLCBzdGFydC8qPSAwLCBlbmQgPSBAbGVuZ3RoKi8pe1xuICB2YXIgTyAgICAgPSB0b09iamVjdCh0aGlzKVxuICAgICwgbGVuICAgPSB0b0xlbmd0aChPLmxlbmd0aClcbiAgICAsIHRvICAgID0gdG9JbmRleCh0YXJnZXQsIGxlbilcbiAgICAsIGZyb20gID0gdG9JbmRleChzdGFydCwgbGVuKVxuICAgICwgJCQgICAgPSBhcmd1bWVudHNcbiAgICAsIGVuZCAgID0gJCQubGVuZ3RoID4gMiA/ICQkWzJdIDogdW5kZWZpbmVkXG4gICAgLCBjb3VudCA9IE1hdGgubWluKChlbmQgPT09IHVuZGVmaW5lZCA/IGxlbiA6IHRvSW5kZXgoZW5kLCBsZW4pKSAtIGZyb20sIGxlbiAtIHRvKVxuICAgICwgaW5jICAgPSAxO1xuICBpZihmcm9tIDwgdG8gJiYgdG8gPCBmcm9tICsgY291bnQpe1xuICAgIGluYyAgPSAtMTtcbiAgICBmcm9tICs9IGNvdW50IC0gMTtcbiAgICB0byAgICs9IGNvdW50IC0gMTtcbiAgfVxuICB3aGlsZShjb3VudC0tID4gMCl7XG4gICAgaWYoZnJvbSBpbiBPKU9bdG9dID0gT1tmcm9tXTtcbiAgICBlbHNlIGRlbGV0ZSBPW3RvXTtcbiAgICB0byAgICs9IGluYztcbiAgICBmcm9tICs9IGluYztcbiAgfSByZXR1cm4gTztcbn07XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vY29yZS1qcy9tb2R1bGVzLyQuYXJyYXktY29weS13aXRoaW4uanNcbiAqKiBtb2R1bGUgaWQgPSAzMzZcbiAqKiBtb2R1bGUgY2h1bmtzID0gMjRcbiAqKi8iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");

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

	eval("// 22.1.3.6 Array.prototype.fill(value, start = 0, end = this.length)\nvar $export = __webpack_require__(216);\n\n$export($export.P, 'Array', {fill: __webpack_require__(338)});\n\n__webpack_require__(331)('fill');\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzM3LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvZXM2LmFycmF5LmZpbGwuanM/Yzc5NSJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyAyMi4xLjMuNiBBcnJheS5wcm90b3R5cGUuZmlsbCh2YWx1ZSwgc3RhcnQgPSAwLCBlbmQgPSB0aGlzLmxlbmd0aClcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi8kLmV4cG9ydCcpO1xuXG4kZXhwb3J0KCRleHBvcnQuUCwgJ0FycmF5Jywge2ZpbGw6IHJlcXVpcmUoJy4vJC5hcnJheS1maWxsJyl9KTtcblxucmVxdWlyZSgnLi8kLmFkZC10by11bnNjb3BhYmxlcycpKCdmaWxsJyk7XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vY29yZS1qcy9tb2R1bGVzL2VzNi5hcnJheS5maWxsLmpzXG4gKiogbW9kdWxlIGlkID0gMzM3XG4gKiogbW9kdWxlIGNodW5rcyA9IDI0XG4gKiovIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=");

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

	eval("// 22.1.3.6 Array.prototype.fill(value, start = 0, end = this.length)\n'use strict';\nvar toObject = __webpack_require__(234)\n  , toIndex  = __webpack_require__(239)\n  , toLength = __webpack_require__(240);\nmodule.exports = [].fill || function fill(value /*, start = 0, end = @length */){\n  var O      = toObject(this)\n    , length = toLength(O.length)\n    , $$     = arguments\n    , $$len  = $$.length\n    , index  = toIndex($$len > 1 ? $$[1] : undefined, length)\n    , end    = $$len > 2 ? $$[2] : undefined\n    , endPos = end === undefined ? length : toIndex(end, length);\n  while(endPos > index)O[index++] = value;\n  return O;\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzM4LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvJC5hcnJheS1maWxsLmpzP2NiOWIiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gMjIuMS4zLjYgQXJyYXkucHJvdG90eXBlLmZpbGwodmFsdWUsIHN0YXJ0ID0gMCwgZW5kID0gdGhpcy5sZW5ndGgpXG4ndXNlIHN0cmljdCc7XG52YXIgdG9PYmplY3QgPSByZXF1aXJlKCcuLyQudG8tb2JqZWN0JylcbiAgLCB0b0luZGV4ICA9IHJlcXVpcmUoJy4vJC50by1pbmRleCcpXG4gICwgdG9MZW5ndGggPSByZXF1aXJlKCcuLyQudG8tbGVuZ3RoJyk7XG5tb2R1bGUuZXhwb3J0cyA9IFtdLmZpbGwgfHwgZnVuY3Rpb24gZmlsbCh2YWx1ZSAvKiwgc3RhcnQgPSAwLCBlbmQgPSBAbGVuZ3RoICovKXtcbiAgdmFyIE8gICAgICA9IHRvT2JqZWN0KHRoaXMpXG4gICAgLCBsZW5ndGggPSB0b0xlbmd0aChPLmxlbmd0aClcbiAgICAsICQkICAgICA9IGFyZ3VtZW50c1xuICAgICwgJCRsZW4gID0gJCQubGVuZ3RoXG4gICAgLCBpbmRleCAgPSB0b0luZGV4KCQkbGVuID4gMSA/ICQkWzFdIDogdW5kZWZpbmVkLCBsZW5ndGgpXG4gICAgLCBlbmQgICAgPSAkJGxlbiA+IDIgPyAkJFsyXSA6IHVuZGVmaW5lZFxuICAgICwgZW5kUG9zID0gZW5kID09PSB1bmRlZmluZWQgPyBsZW5ndGggOiB0b0luZGV4KGVuZCwgbGVuZ3RoKTtcbiAgd2hpbGUoZW5kUG9zID4gaW5kZXgpT1tpbmRleCsrXSA9IHZhbHVlO1xuICByZXR1cm4gTztcbn07XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vY29yZS1qcy9tb2R1bGVzLyQuYXJyYXktZmlsbC5qc1xuICoqIG1vZHVsZSBpZCA9IDMzOFxuICoqIG1vZHVsZSBjaHVua3MgPSAyNFxuICoqLyJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=");

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

	eval("'use strict';\n// 22.1.3.8 Array.prototype.find(predicate, thisArg = undefined)\nvar $export = __webpack_require__(216)\n  , $find   = __webpack_require__(241)(5)\n  , KEY     = 'find'\n  , forced  = true;\n// Shouldn't skip holes\nif(KEY in [])Array(1)[KEY](function(){ forced = false; });\n$export($export.P + $export.F * forced, 'Array', {\n  find: function find(callbackfn/*, that = undefined */){\n    return $find(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n  }\n});\n__webpack_require__(331)(KEY);\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzM5LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvZXM2LmFycmF5LmZpbmQuanM/MGQ2OCJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG4vLyAyMi4xLjMuOCBBcnJheS5wcm90b3R5cGUuZmluZChwcmVkaWNhdGUsIHRoaXNBcmcgPSB1bmRlZmluZWQpXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vJC5leHBvcnQnKVxuICAsICRmaW5kICAgPSByZXF1aXJlKCcuLyQuYXJyYXktbWV0aG9kcycpKDUpXG4gICwgS0VZICAgICA9ICdmaW5kJ1xuICAsIGZvcmNlZCAgPSB0cnVlO1xuLy8gU2hvdWxkbid0IHNraXAgaG9sZXNcbmlmKEtFWSBpbiBbXSlBcnJheSgxKVtLRVldKGZ1bmN0aW9uKCl7IGZvcmNlZCA9IGZhbHNlOyB9KTtcbiRleHBvcnQoJGV4cG9ydC5QICsgJGV4cG9ydC5GICogZm9yY2VkLCAnQXJyYXknLCB7XG4gIGZpbmQ6IGZ1bmN0aW9uIGZpbmQoY2FsbGJhY2tmbi8qLCB0aGF0ID0gdW5kZWZpbmVkICovKXtcbiAgICByZXR1cm4gJGZpbmQodGhpcywgY2FsbGJhY2tmbiwgYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQpO1xuICB9XG59KTtcbnJlcXVpcmUoJy4vJC5hZGQtdG8tdW5zY29wYWJsZXMnKShLRVkpO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2NvcmUtanMvbW9kdWxlcy9lczYuYXJyYXkuZmluZC5qc1xuICoqIG1vZHVsZSBpZCA9IDMzOVxuICoqIG1vZHVsZSBjaHVua3MgPSAyNFxuICoqLyJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");

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

	eval("'use strict';\n// 22.1.3.9 Array.prototype.findIndex(predicate, thisArg = undefined)\nvar $export = __webpack_require__(216)\n  , $find   = __webpack_require__(241)(6)\n  , KEY     = 'findIndex'\n  , forced  = true;\n// Shouldn't skip holes\nif(KEY in [])Array(1)[KEY](function(){ forced = false; });\n$export($export.P + $export.F * forced, 'Array', {\n  findIndex: function findIndex(callbackfn/*, that = undefined */){\n    return $find(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n  }\n});\n__webpack_require__(331)(KEY);\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzQwLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvZXM2LmFycmF5LmZpbmQtaW5kZXguanM/N2Y2OCJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG4vLyAyMi4xLjMuOSBBcnJheS5wcm90b3R5cGUuZmluZEluZGV4KHByZWRpY2F0ZSwgdGhpc0FyZyA9IHVuZGVmaW5lZClcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi8kLmV4cG9ydCcpXG4gICwgJGZpbmQgICA9IHJlcXVpcmUoJy4vJC5hcnJheS1tZXRob2RzJykoNilcbiAgLCBLRVkgICAgID0gJ2ZpbmRJbmRleCdcbiAgLCBmb3JjZWQgID0gdHJ1ZTtcbi8vIFNob3VsZG4ndCBza2lwIGhvbGVzXG5pZihLRVkgaW4gW10pQXJyYXkoMSlbS0VZXShmdW5jdGlvbigpeyBmb3JjZWQgPSBmYWxzZTsgfSk7XG4kZXhwb3J0KCRleHBvcnQuUCArICRleHBvcnQuRiAqIGZvcmNlZCwgJ0FycmF5Jywge1xuICBmaW5kSW5kZXg6IGZ1bmN0aW9uIGZpbmRJbmRleChjYWxsYmFja2ZuLyosIHRoYXQgPSB1bmRlZmluZWQgKi8pe1xuICAgIHJldHVybiAkZmluZCh0aGlzLCBjYWxsYmFja2ZuLCBhcmd1bWVudHMubGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IHVuZGVmaW5lZCk7XG4gIH1cbn0pO1xucmVxdWlyZSgnLi8kLmFkZC10by11bnNjb3BhYmxlcycpKEtFWSk7XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vY29yZS1qcy9tb2R1bGVzL2VzNi5hcnJheS5maW5kLWluZGV4LmpzXG4gKiogbW9kdWxlIGlkID0gMzQwXG4gKiogbW9kdWxlIGNodW5rcyA9IDI0XG4gKiovIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");

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

	eval("var $        = __webpack_require__(215)\n  , global   = __webpack_require__(217)\n  , isRegExp = __webpack_require__(318)\n  , $flags   = __webpack_require__(342)\n  , $RegExp  = global.RegExp\n  , Base     = $RegExp\n  , proto    = $RegExp.prototype\n  , re1      = /a/g\n  , re2      = /a/g\n  // \"new\" creates a new object, old webkit buggy here\n  , CORRECT_NEW = new $RegExp(re1) !== re1;\n\nif(__webpack_require__(221) && (!CORRECT_NEW || __webpack_require__(222)(function(){\n  re2[__webpack_require__(244)('match')] = false;\n  // RegExp constructor can alter flags and IsRegExp works correct with @@match\n  return $RegExp(re1) != re1 || $RegExp(re2) == re2 || $RegExp(re1, 'i') != '/a/i';\n}))){\n  $RegExp = function RegExp(p, f){\n    var piRE = isRegExp(p)\n      , fiU  = f === undefined;\n    return !(this instanceof $RegExp) && piRE && p.constructor === $RegExp && fiU ? p\n      : CORRECT_NEW\n        ? new Base(piRE && !fiU ? p.source : p, f)\n        : Base((piRE = p instanceof $RegExp) ? p.source : p, piRE && fiU ? $flags.call(p) : f);\n  };\n  $.each.call($.getNames(Base), function(key){\n    key in $RegExp || $.setDesc($RegExp, key, {\n      configurable: true,\n      get: function(){ return Base[key]; },\n      set: function(it){ Base[key] = it; }\n    });\n  });\n  proto.constructor = $RegExp;\n  $RegExp.prototype = proto;\n  __webpack_require__(223)(global, 'RegExp', $RegExp);\n}\n\n__webpack_require__(334)('RegExp');\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzQxLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvZXM2LnJlZ2V4cC5jb25zdHJ1Y3Rvci5qcz8wZDNjIl0sInNvdXJjZXNDb250ZW50IjpbInZhciAkICAgICAgICA9IHJlcXVpcmUoJy4vJCcpXG4gICwgZ2xvYmFsICAgPSByZXF1aXJlKCcuLyQuZ2xvYmFsJylcbiAgLCBpc1JlZ0V4cCA9IHJlcXVpcmUoJy4vJC5pcy1yZWdleHAnKVxuICAsICRmbGFncyAgID0gcmVxdWlyZSgnLi8kLmZsYWdzJylcbiAgLCAkUmVnRXhwICA9IGdsb2JhbC5SZWdFeHBcbiAgLCBCYXNlICAgICA9ICRSZWdFeHBcbiAgLCBwcm90byAgICA9ICRSZWdFeHAucHJvdG90eXBlXG4gICwgcmUxICAgICAgPSAvYS9nXG4gICwgcmUyICAgICAgPSAvYS9nXG4gIC8vIFwibmV3XCIgY3JlYXRlcyBhIG5ldyBvYmplY3QsIG9sZCB3ZWJraXQgYnVnZ3kgaGVyZVxuICAsIENPUlJFQ1RfTkVXID0gbmV3ICRSZWdFeHAocmUxKSAhPT0gcmUxO1xuXG5pZihyZXF1aXJlKCcuLyQuZGVzY3JpcHRvcnMnKSAmJiAoIUNPUlJFQ1RfTkVXIHx8IHJlcXVpcmUoJy4vJC5mYWlscycpKGZ1bmN0aW9uKCl7XG4gIHJlMltyZXF1aXJlKCcuLyQud2tzJykoJ21hdGNoJyldID0gZmFsc2U7XG4gIC8vIFJlZ0V4cCBjb25zdHJ1Y3RvciBjYW4gYWx0ZXIgZmxhZ3MgYW5kIElzUmVnRXhwIHdvcmtzIGNvcnJlY3Qgd2l0aCBAQG1hdGNoXG4gIHJldHVybiAkUmVnRXhwKHJlMSkgIT0gcmUxIHx8ICRSZWdFeHAocmUyKSA9PSByZTIgfHwgJFJlZ0V4cChyZTEsICdpJykgIT0gJy9hL2knO1xufSkpKXtcbiAgJFJlZ0V4cCA9IGZ1bmN0aW9uIFJlZ0V4cChwLCBmKXtcbiAgICB2YXIgcGlSRSA9IGlzUmVnRXhwKHApXG4gICAgICAsIGZpVSAgPSBmID09PSB1bmRlZmluZWQ7XG4gICAgcmV0dXJuICEodGhpcyBpbnN0YW5jZW9mICRSZWdFeHApICYmIHBpUkUgJiYgcC5jb25zdHJ1Y3RvciA9PT0gJFJlZ0V4cCAmJiBmaVUgPyBwXG4gICAgICA6IENPUlJFQ1RfTkVXXG4gICAgICAgID8gbmV3IEJhc2UocGlSRSAmJiAhZmlVID8gcC5zb3VyY2UgOiBwLCBmKVxuICAgICAgICA6IEJhc2UoKHBpUkUgPSBwIGluc3RhbmNlb2YgJFJlZ0V4cCkgPyBwLnNvdXJjZSA6IHAsIHBpUkUgJiYgZmlVID8gJGZsYWdzLmNhbGwocCkgOiBmKTtcbiAgfTtcbiAgJC5lYWNoLmNhbGwoJC5nZXROYW1lcyhCYXNlKSwgZnVuY3Rpb24oa2V5KXtcbiAgICBrZXkgaW4gJFJlZ0V4cCB8fCAkLnNldERlc2MoJFJlZ0V4cCwga2V5LCB7XG4gICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICBnZXQ6IGZ1bmN0aW9uKCl7IHJldHVybiBCYXNlW2tleV07IH0sXG4gICAgICBzZXQ6IGZ1bmN0aW9uKGl0KXsgQmFzZVtrZXldID0gaXQ7IH1cbiAgICB9KTtcbiAgfSk7XG4gIHByb3RvLmNvbnN0cnVjdG9yID0gJFJlZ0V4cDtcbiAgJFJlZ0V4cC5wcm90b3R5cGUgPSBwcm90bztcbiAgcmVxdWlyZSgnLi8kLnJlZGVmaW5lJykoZ2xvYmFsLCAnUmVnRXhwJywgJFJlZ0V4cCk7XG59XG5cbnJlcXVpcmUoJy4vJC5zZXQtc3BlY2llcycpKCdSZWdFeHAnKTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9jb3JlLWpzL21vZHVsZXMvZXM2LnJlZ2V4cC5jb25zdHJ1Y3Rvci5qc1xuICoqIG1vZHVsZSBpZCA9IDM0MVxuICoqIG1vZHVsZSBjaHVua3MgPSAyNFxuICoqLyJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");

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

	eval("'use strict';\n// 21.2.5.3 get RegExp.prototype.flags\nvar anObject = __webpack_require__(233);\nmodule.exports = function(){\n  var that   = anObject(this)\n    , result = '';\n  if(that.global)     result += 'g';\n  if(that.ignoreCase) result += 'i';\n  if(that.multiline)  result += 'm';\n  if(that.unicode)    result += 'u';\n  if(that.sticky)     result += 'y';\n  return result;\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzQyLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvJC5mbGFncy5qcz8zOTJhIl0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0Jztcbi8vIDIxLjIuNS4zIGdldCBSZWdFeHAucHJvdG90eXBlLmZsYWdzXG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuLyQuYW4tb2JqZWN0Jyk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKCl7XG4gIHZhciB0aGF0ICAgPSBhbk9iamVjdCh0aGlzKVxuICAgICwgcmVzdWx0ID0gJyc7XG4gIGlmKHRoYXQuZ2xvYmFsKSAgICAgcmVzdWx0ICs9ICdnJztcbiAgaWYodGhhdC5pZ25vcmVDYXNlKSByZXN1bHQgKz0gJ2knO1xuICBpZih0aGF0Lm11bHRpbGluZSkgIHJlc3VsdCArPSAnbSc7XG4gIGlmKHRoYXQudW5pY29kZSkgICAgcmVzdWx0ICs9ICd1JztcbiAgaWYodGhhdC5zdGlja3kpICAgICByZXN1bHQgKz0gJ3knO1xuICByZXR1cm4gcmVzdWx0O1xufTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9jb3JlLWpzL21vZHVsZXMvJC5mbGFncy5qc1xuICoqIG1vZHVsZSBpZCA9IDM0MlxuICoqIG1vZHVsZSBjaHVua3MgPSAyNFxuICoqLyJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=");

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

	eval("// 21.2.5.3 get RegExp.prototype.flags()\nvar $ = __webpack_require__(215);\nif(__webpack_require__(221) && /./g.flags != 'g')$.setDesc(RegExp.prototype, 'flags', {\n  configurable: true,\n  get: __webpack_require__(342)\n});\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzQzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvZXM2LnJlZ2V4cC5mbGFncy5qcz84M2I0Il0sInNvdXJjZXNDb250ZW50IjpbIi8vIDIxLjIuNS4zIGdldCBSZWdFeHAucHJvdG90eXBlLmZsYWdzKClcbnZhciAkID0gcmVxdWlyZSgnLi8kJyk7XG5pZihyZXF1aXJlKCcuLyQuZGVzY3JpcHRvcnMnKSAmJiAvLi9nLmZsYWdzICE9ICdnJykkLnNldERlc2MoUmVnRXhwLnByb3RvdHlwZSwgJ2ZsYWdzJywge1xuICBjb25maWd1cmFibGU6IHRydWUsXG4gIGdldDogcmVxdWlyZSgnLi8kLmZsYWdzJylcbn0pO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2NvcmUtanMvbW9kdWxlcy9lczYucmVnZXhwLmZsYWdzLmpzXG4gKiogbW9kdWxlIGlkID0gMzQzXG4gKiogbW9kdWxlIGNodW5rcyA9IDI0XG4gKiovIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=");

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

	eval("// @@match logic\n__webpack_require__(345)('match', 1, function(defined, MATCH){\n  // 21.1.3.11 String.prototype.match(regexp)\n  return function match(regexp){\n    'use strict';\n    var O  = defined(this)\n      , fn = regexp == undefined ? undefined : regexp[MATCH];\n    return fn !== undefined ? fn.call(regexp, O) : new RegExp(regexp)[MATCH](String(O));\n  };\n});\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzQ0LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvZXM2LnJlZ2V4cC5tYXRjaC5qcz84MGMwIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIEBAbWF0Y2ggbG9naWNcbnJlcXVpcmUoJy4vJC5maXgtcmUtd2tzJykoJ21hdGNoJywgMSwgZnVuY3Rpb24oZGVmaW5lZCwgTUFUQ0gpe1xuICAvLyAyMS4xLjMuMTEgU3RyaW5nLnByb3RvdHlwZS5tYXRjaChyZWdleHApXG4gIHJldHVybiBmdW5jdGlvbiBtYXRjaChyZWdleHApe1xuICAgICd1c2Ugc3RyaWN0JztcbiAgICB2YXIgTyAgPSBkZWZpbmVkKHRoaXMpXG4gICAgICAsIGZuID0gcmVnZXhwID09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IHJlZ2V4cFtNQVRDSF07XG4gICAgcmV0dXJuIGZuICE9PSB1bmRlZmluZWQgPyBmbi5jYWxsKHJlZ2V4cCwgTykgOiBuZXcgUmVnRXhwKHJlZ2V4cClbTUFUQ0hdKFN0cmluZyhPKSk7XG4gIH07XG59KTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9jb3JlLWpzL21vZHVsZXMvZXM2LnJlZ2V4cC5tYXRjaC5qc1xuICoqIG1vZHVsZSBpZCA9IDM0NFxuICoqIG1vZHVsZSBjaHVua3MgPSAyNFxuICoqLyJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=");

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

	eval("'use strict';\nvar hide     = __webpack_require__(219)\n  , redefine = __webpack_require__(223)\n  , fails    = __webpack_require__(222)\n  , defined  = __webpack_require__(235)\n  , wks      = __webpack_require__(244);\n\nmodule.exports = function(KEY, length, exec){\n  var SYMBOL   = wks(KEY)\n    , original = ''[KEY];\n  if(fails(function(){\n    var O = {};\n    O[SYMBOL] = function(){ return 7; };\n    return ''[KEY](O) != 7;\n  })){\n    redefine(String.prototype, KEY, exec(defined, SYMBOL, original));\n    hide(RegExp.prototype, SYMBOL, length == 2\n      // 21.2.5.8 RegExp.prototype[@@replace](string, replaceValue)\n      // 21.2.5.11 RegExp.prototype[@@split](string, limit)\n      ? function(string, arg){ return original.call(string, this, arg); }\n      // 21.2.5.6 RegExp.prototype[@@match](string)\n      // 21.2.5.9 RegExp.prototype[@@search](string)\n      : function(string){ return original.call(string, this); }\n    );\n  }\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzQ1LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvJC5maXgtcmUtd2tzLmpzP2NiNDMiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xudmFyIGhpZGUgICAgID0gcmVxdWlyZSgnLi8kLmhpZGUnKVxuICAsIHJlZGVmaW5lID0gcmVxdWlyZSgnLi8kLnJlZGVmaW5lJylcbiAgLCBmYWlscyAgICA9IHJlcXVpcmUoJy4vJC5mYWlscycpXG4gICwgZGVmaW5lZCAgPSByZXF1aXJlKCcuLyQuZGVmaW5lZCcpXG4gICwgd2tzICAgICAgPSByZXF1aXJlKCcuLyQud2tzJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oS0VZLCBsZW5ndGgsIGV4ZWMpe1xuICB2YXIgU1lNQk9MICAgPSB3a3MoS0VZKVxuICAgICwgb3JpZ2luYWwgPSAnJ1tLRVldO1xuICBpZihmYWlscyhmdW5jdGlvbigpe1xuICAgIHZhciBPID0ge307XG4gICAgT1tTWU1CT0xdID0gZnVuY3Rpb24oKXsgcmV0dXJuIDc7IH07XG4gICAgcmV0dXJuICcnW0tFWV0oTykgIT0gNztcbiAgfSkpe1xuICAgIHJlZGVmaW5lKFN0cmluZy5wcm90b3R5cGUsIEtFWSwgZXhlYyhkZWZpbmVkLCBTWU1CT0wsIG9yaWdpbmFsKSk7XG4gICAgaGlkZShSZWdFeHAucHJvdG90eXBlLCBTWU1CT0wsIGxlbmd0aCA9PSAyXG4gICAgICAvLyAyMS4yLjUuOCBSZWdFeHAucHJvdG90eXBlW0BAcmVwbGFjZV0oc3RyaW5nLCByZXBsYWNlVmFsdWUpXG4gICAgICAvLyAyMS4yLjUuMTEgUmVnRXhwLnByb3RvdHlwZVtAQHNwbGl0XShzdHJpbmcsIGxpbWl0KVxuICAgICAgPyBmdW5jdGlvbihzdHJpbmcsIGFyZyl7IHJldHVybiBvcmlnaW5hbC5jYWxsKHN0cmluZywgdGhpcywgYXJnKTsgfVxuICAgICAgLy8gMjEuMi41LjYgUmVnRXhwLnByb3RvdHlwZVtAQG1hdGNoXShzdHJpbmcpXG4gICAgICAvLyAyMS4yLjUuOSBSZWdFeHAucHJvdG90eXBlW0BAc2VhcmNoXShzdHJpbmcpXG4gICAgICA6IGZ1bmN0aW9uKHN0cmluZyl7IHJldHVybiBvcmlnaW5hbC5jYWxsKHN0cmluZywgdGhpcyk7IH1cbiAgICApO1xuICB9XG59O1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2NvcmUtanMvbW9kdWxlcy8kLmZpeC1yZS13a3MuanNcbiAqKiBtb2R1bGUgaWQgPSAzNDVcbiAqKiBtb2R1bGUgY2h1bmtzID0gMjRcbiAqKi8iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=");

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

	eval("// @@replace logic\n__webpack_require__(345)('replace', 2, function(defined, REPLACE, $replace){\n  // 21.1.3.14 String.prototype.replace(searchValue, replaceValue)\n  return function replace(searchValue, replaceValue){\n    'use strict';\n    var O  = defined(this)\n      , fn = searchValue == undefined ? undefined : searchValue[REPLACE];\n    return fn !== undefined\n      ? fn.call(searchValue, O, replaceValue)\n      : $replace.call(String(O), searchValue, replaceValue);\n  };\n});\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzQ2LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvZXM2LnJlZ2V4cC5yZXBsYWNlLmpzP2RkMTkiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gQEByZXBsYWNlIGxvZ2ljXG5yZXF1aXJlKCcuLyQuZml4LXJlLXdrcycpKCdyZXBsYWNlJywgMiwgZnVuY3Rpb24oZGVmaW5lZCwgUkVQTEFDRSwgJHJlcGxhY2Upe1xuICAvLyAyMS4xLjMuMTQgU3RyaW5nLnByb3RvdHlwZS5yZXBsYWNlKHNlYXJjaFZhbHVlLCByZXBsYWNlVmFsdWUpXG4gIHJldHVybiBmdW5jdGlvbiByZXBsYWNlKHNlYXJjaFZhbHVlLCByZXBsYWNlVmFsdWUpe1xuICAgICd1c2Ugc3RyaWN0JztcbiAgICB2YXIgTyAgPSBkZWZpbmVkKHRoaXMpXG4gICAgICAsIGZuID0gc2VhcmNoVmFsdWUgPT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogc2VhcmNoVmFsdWVbUkVQTEFDRV07XG4gICAgcmV0dXJuIGZuICE9PSB1bmRlZmluZWRcbiAgICAgID8gZm4uY2FsbChzZWFyY2hWYWx1ZSwgTywgcmVwbGFjZVZhbHVlKVxuICAgICAgOiAkcmVwbGFjZS5jYWxsKFN0cmluZyhPKSwgc2VhcmNoVmFsdWUsIHJlcGxhY2VWYWx1ZSk7XG4gIH07XG59KTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9jb3JlLWpzL21vZHVsZXMvZXM2LnJlZ2V4cC5yZXBsYWNlLmpzXG4gKiogbW9kdWxlIGlkID0gMzQ2XG4gKiogbW9kdWxlIGNodW5rcyA9IDI0XG4gKiovIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=");

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

	eval("// @@search logic\n__webpack_require__(345)('search', 1, function(defined, SEARCH){\n  // 21.1.3.15 String.prototype.search(regexp)\n  return function search(regexp){\n    'use strict';\n    var O  = defined(this)\n      , fn = regexp == undefined ? undefined : regexp[SEARCH];\n    return fn !== undefined ? fn.call(regexp, O) : new RegExp(regexp)[SEARCH](String(O));\n  };\n});\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzQ3LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvZXM2LnJlZ2V4cC5zZWFyY2guanM/YWZmNiJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAQHNlYXJjaCBsb2dpY1xucmVxdWlyZSgnLi8kLmZpeC1yZS13a3MnKSgnc2VhcmNoJywgMSwgZnVuY3Rpb24oZGVmaW5lZCwgU0VBUkNIKXtcbiAgLy8gMjEuMS4zLjE1IFN0cmluZy5wcm90b3R5cGUuc2VhcmNoKHJlZ2V4cClcbiAgcmV0dXJuIGZ1bmN0aW9uIHNlYXJjaChyZWdleHApe1xuICAgICd1c2Ugc3RyaWN0JztcbiAgICB2YXIgTyAgPSBkZWZpbmVkKHRoaXMpXG4gICAgICAsIGZuID0gcmVnZXhwID09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IHJlZ2V4cFtTRUFSQ0hdO1xuICAgIHJldHVybiBmbiAhPT0gdW5kZWZpbmVkID8gZm4uY2FsbChyZWdleHAsIE8pIDogbmV3IFJlZ0V4cChyZWdleHApW1NFQVJDSF0oU3RyaW5nKE8pKTtcbiAgfTtcbn0pO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2NvcmUtanMvbW9kdWxlcy9lczYucmVnZXhwLnNlYXJjaC5qc1xuICoqIG1vZHVsZSBpZCA9IDM0N1xuICoqIG1vZHVsZSBjaHVua3MgPSAyNFxuICoqLyJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=");

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

	eval("// @@split logic\n__webpack_require__(345)('split', 2, function(defined, SPLIT, $split){\n  // 21.1.3.17 String.prototype.split(separator, limit)\n  return function split(separator, limit){\n    'use strict';\n    var O  = defined(this)\n      , fn = separator == undefined ? undefined : separator[SPLIT];\n    return fn !== undefined\n      ? fn.call(separator, O, limit)\n      : $split.call(String(O), separator, limit);\n  };\n});\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzQ4LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvZXM2LnJlZ2V4cC5zcGxpdC5qcz80YTAyIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIEBAc3BsaXQgbG9naWNcbnJlcXVpcmUoJy4vJC5maXgtcmUtd2tzJykoJ3NwbGl0JywgMiwgZnVuY3Rpb24oZGVmaW5lZCwgU1BMSVQsICRzcGxpdCl7XG4gIC8vIDIxLjEuMy4xNyBTdHJpbmcucHJvdG90eXBlLnNwbGl0KHNlcGFyYXRvciwgbGltaXQpXG4gIHJldHVybiBmdW5jdGlvbiBzcGxpdChzZXBhcmF0b3IsIGxpbWl0KXtcbiAgICAndXNlIHN0cmljdCc7XG4gICAgdmFyIE8gID0gZGVmaW5lZCh0aGlzKVxuICAgICAgLCBmbiA9IHNlcGFyYXRvciA9PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiBzZXBhcmF0b3JbU1BMSVRdO1xuICAgIHJldHVybiBmbiAhPT0gdW5kZWZpbmVkXG4gICAgICA/IGZuLmNhbGwoc2VwYXJhdG9yLCBPLCBsaW1pdClcbiAgICAgIDogJHNwbGl0LmNhbGwoU3RyaW5nKE8pLCBzZXBhcmF0b3IsIGxpbWl0KTtcbiAgfTtcbn0pO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2NvcmUtanMvbW9kdWxlcy9lczYucmVnZXhwLnNwbGl0LmpzXG4gKiogbW9kdWxlIGlkID0gMzQ4XG4gKiogbW9kdWxlIGNodW5rcyA9IDI0XG4gKiovIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=");

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

	eval("'use strict';\nvar $          = __webpack_require__(215)\n  , LIBRARY    = __webpack_require__(252)\n  , global     = __webpack_require__(217)\n  , ctx        = __webpack_require__(225)\n  , classof    = __webpack_require__(260)\n  , $export    = __webpack_require__(216)\n  , isObject   = __webpack_require__(229)\n  , anObject   = __webpack_require__(233)\n  , aFunction  = __webpack_require__(226)\n  , strictNew  = __webpack_require__(350)\n  , forOf      = __webpack_require__(351)\n  , setProto   = __webpack_require__(258).set\n  , same       = __webpack_require__(256)\n  , SPECIES    = __webpack_require__(244)('species')\n  , speciesConstructor = __webpack_require__(352)\n  , asap       = __webpack_require__(353)\n  , PROMISE    = 'Promise'\n  , process    = global.process\n  , isNode     = classof(process) == 'process'\n  , P          = global[PROMISE]\n  , empty      = function(){ /* empty */ }\n  , Wrapper;\n\nvar testResolve = function(sub){\n  var test = new P(empty), promise;\n  if(sub)test.constructor = function(exec){\n    exec(empty, empty);\n  };\n  (promise = P.resolve(test))['catch'](empty);\n  return promise === test;\n};\n\nvar USE_NATIVE = function(){\n  var works = false;\n  function P2(x){\n    var self = new P(x);\n    setProto(self, P2.prototype);\n    return self;\n  }\n  try {\n    works = P && P.resolve && testResolve();\n    setProto(P2, P);\n    P2.prototype = $.create(P.prototype, {constructor: {value: P2}});\n    // actual Firefox has broken subclass support, test that\n    if(!(P2.resolve(5).then(function(){}) instanceof P2)){\n      works = false;\n    }\n    // actual V8 bug, https://code.google.com/p/v8/issues/detail?id=4162\n    if(works && __webpack_require__(221)){\n      var thenableThenGotten = false;\n      P.resolve($.setDesc({}, 'then', {\n        get: function(){ thenableThenGotten = true; }\n      }));\n      works = thenableThenGotten;\n    }\n  } catch(e){ works = false; }\n  return works;\n}();\n\n// helpers\nvar sameConstructor = function(a, b){\n  // library wrapper special case\n  if(LIBRARY && a === P && b === Wrapper)return true;\n  return same(a, b);\n};\nvar getConstructor = function(C){\n  var S = anObject(C)[SPECIES];\n  return S != undefined ? S : C;\n};\nvar isThenable = function(it){\n  var then;\n  return isObject(it) && typeof (then = it.then) == 'function' ? then : false;\n};\nvar PromiseCapability = function(C){\n  var resolve, reject;\n  this.promise = new C(function($$resolve, $$reject){\n    if(resolve !== undefined || reject !== undefined)throw TypeError('Bad Promise constructor');\n    resolve = $$resolve;\n    reject  = $$reject;\n  });\n  this.resolve = aFunction(resolve),\n  this.reject  = aFunction(reject)\n};\nvar perform = function(exec){\n  try {\n    exec();\n  } catch(e){\n    return {error: e};\n  }\n};\nvar notify = function(record, isReject){\n  if(record.n)return;\n  record.n = true;\n  var chain = record.c;\n  asap(function(){\n    var value = record.v\n      , ok    = record.s == 1\n      , i     = 0;\n    var run = function(reaction){\n      var handler = ok ? reaction.ok : reaction.fail\n        , resolve = reaction.resolve\n        , reject  = reaction.reject\n        , result, then;\n      try {\n        if(handler){\n          if(!ok)record.h = true;\n          result = handler === true ? value : handler(value);\n          if(result === reaction.promise){\n            reject(TypeError('Promise-chain cycle'));\n          } else if(then = isThenable(result)){\n            then.call(result, resolve, reject);\n          } else resolve(result);\n        } else reject(value);\n      } catch(e){\n        reject(e);\n      }\n    };\n    while(chain.length > i)run(chain[i++]); // variable length - can't use forEach\n    chain.length = 0;\n    record.n = false;\n    if(isReject)setTimeout(function(){\n      var promise = record.p\n        , handler, console;\n      if(isUnhandled(promise)){\n        if(isNode){\n          process.emit('unhandledRejection', value, promise);\n        } else if(handler = global.onunhandledrejection){\n          handler({promise: promise, reason: value});\n        } else if((console = global.console) && console.error){\n          console.error('Unhandled promise rejection', value);\n        }\n      } record.a = undefined;\n    }, 1);\n  });\n};\nvar isUnhandled = function(promise){\n  var record = promise._d\n    , chain  = record.a || record.c\n    , i      = 0\n    , reaction;\n  if(record.h)return false;\n  while(chain.length > i){\n    reaction = chain[i++];\n    if(reaction.fail || !isUnhandled(reaction.promise))return false;\n  } return true;\n};\nvar $reject = function(value){\n  var record = this;\n  if(record.d)return;\n  record.d = true;\n  record = record.r || record; // unwrap\n  record.v = value;\n  record.s = 2;\n  record.a = record.c.slice();\n  notify(record, true);\n};\nvar $resolve = function(value){\n  var record = this\n    , then;\n  if(record.d)return;\n  record.d = true;\n  record = record.r || record; // unwrap\n  try {\n    if(record.p === value)throw TypeError(\"Promise can't be resolved itself\");\n    if(then = isThenable(value)){\n      asap(function(){\n        var wrapper = {r: record, d: false}; // wrap\n        try {\n          then.call(value, ctx($resolve, wrapper, 1), ctx($reject, wrapper, 1));\n        } catch(e){\n          $reject.call(wrapper, e);\n        }\n      });\n    } else {\n      record.v = value;\n      record.s = 1;\n      notify(record, false);\n    }\n  } catch(e){\n    $reject.call({r: record, d: false}, e); // wrap\n  }\n};\n\n// constructor polyfill\nif(!USE_NATIVE){\n  // 25.4.3.1 Promise(executor)\n  P = function Promise(executor){\n    aFunction(executor);\n    var record = this._d = {\n      p: strictNew(this, P, PROMISE),         // <- promise\n      c: [],                                  // <- awaiting reactions\n      a: undefined,                           // <- checked in isUnhandled reactions\n      s: 0,                                   // <- state\n      d: false,                               // <- done\n      v: undefined,                           // <- value\n      h: false,                               // <- handled rejection\n      n: false                                // <- notify\n    };\n    try {\n      executor(ctx($resolve, record, 1), ctx($reject, record, 1));\n    } catch(err){\n      $reject.call(record, err);\n    }\n  };\n  __webpack_require__(355)(P.prototype, {\n    // 25.4.5.3 Promise.prototype.then(onFulfilled, onRejected)\n    then: function then(onFulfilled, onRejected){\n      var reaction = new PromiseCapability(speciesConstructor(this, P))\n        , promise  = reaction.promise\n        , record   = this._d;\n      reaction.ok   = typeof onFulfilled == 'function' ? onFulfilled : true;\n      reaction.fail = typeof onRejected == 'function' && onRejected;\n      record.c.push(reaction);\n      if(record.a)record.a.push(reaction);\n      if(record.s)notify(record, false);\n      return promise;\n    },\n    // 25.4.5.1 Promise.prototype.catch(onRejected)\n    'catch': function(onRejected){\n      return this.then(undefined, onRejected);\n    }\n  });\n}\n\n$export($export.G + $export.W + $export.F * !USE_NATIVE, {Promise: P});\n__webpack_require__(248)(P, PROMISE);\n__webpack_require__(334)(PROMISE);\nWrapper = __webpack_require__(218)[PROMISE];\n\n// statics\n$export($export.S + $export.F * !USE_NATIVE, PROMISE, {\n  // 25.4.4.5 Promise.reject(r)\n  reject: function reject(r){\n    var capability = new PromiseCapability(this)\n      , $$reject   = capability.reject;\n    $$reject(r);\n    return capability.promise;\n  }\n});\n$export($export.S + $export.F * (!USE_NATIVE || testResolve(true)), PROMISE, {\n  // 25.4.4.6 Promise.resolve(x)\n  resolve: function resolve(x){\n    // instanceof instead of internal slot check because we should fix it without replacement native Promise core\n    if(x instanceof P && sameConstructor(x.constructor, this))return x;\n    var capability = new PromiseCapability(this)\n      , $$resolve  = capability.resolve;\n    $$resolve(x);\n    return capability.promise;\n  }\n});\n$export($export.S + $export.F * !(USE_NATIVE && __webpack_require__(328)(function(iter){\n  P.all(iter)['catch'](function(){});\n})), PROMISE, {\n  // 25.4.4.1 Promise.all(iterable)\n  all: function all(iterable){\n    var C          = getConstructor(this)\n      , capability = new PromiseCapability(C)\n      , resolve    = capability.resolve\n      , reject     = capability.reject\n      , values     = [];\n    var abrupt = perform(function(){\n      forOf(iterable, false, values.push, values);\n      var remaining = values.length\n        , results   = Array(remaining);\n      if(remaining)$.each.call(values, function(promise, index){\n        var alreadyCalled = false;\n        C.resolve(promise).then(function(value){\n          if(alreadyCalled)return;\n          alreadyCalled = true;\n          results[index] = value;\n          --remaining || resolve(results);\n        }, reject);\n      });\n      else resolve(results);\n    });\n    if(abrupt)reject(abrupt.error);\n    return capability.promise;\n  },\n  // 25.4.4.4 Promise.race(iterable)\n  race: function race(iterable){\n    var C          = getConstructor(this)\n      , capability = new PromiseCapability(C)\n      , reject     = capability.reject;\n    var abrupt = perform(function(){\n      forOf(iterable, false, function(promise){\n        C.resolve(promise).then(capability.resolve, reject);\n      });\n    });\n    if(abrupt)reject(abrupt.error);\n    return capability.promise;\n  }\n});\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzQ5LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvZXM2LnByb21pc2UuanM/YmMwMSJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG52YXIgJCAgICAgICAgICA9IHJlcXVpcmUoJy4vJCcpXG4gICwgTElCUkFSWSAgICA9IHJlcXVpcmUoJy4vJC5saWJyYXJ5JylcbiAgLCBnbG9iYWwgICAgID0gcmVxdWlyZSgnLi8kLmdsb2JhbCcpXG4gICwgY3R4ICAgICAgICA9IHJlcXVpcmUoJy4vJC5jdHgnKVxuICAsIGNsYXNzb2YgICAgPSByZXF1aXJlKCcuLyQuY2xhc3NvZicpXG4gICwgJGV4cG9ydCAgICA9IHJlcXVpcmUoJy4vJC5leHBvcnQnKVxuICAsIGlzT2JqZWN0ICAgPSByZXF1aXJlKCcuLyQuaXMtb2JqZWN0JylcbiAgLCBhbk9iamVjdCAgID0gcmVxdWlyZSgnLi8kLmFuLW9iamVjdCcpXG4gICwgYUZ1bmN0aW9uICA9IHJlcXVpcmUoJy4vJC5hLWZ1bmN0aW9uJylcbiAgLCBzdHJpY3ROZXcgID0gcmVxdWlyZSgnLi8kLnN0cmljdC1uZXcnKVxuICAsIGZvck9mICAgICAgPSByZXF1aXJlKCcuLyQuZm9yLW9mJylcbiAgLCBzZXRQcm90byAgID0gcmVxdWlyZSgnLi8kLnNldC1wcm90bycpLnNldFxuICAsIHNhbWUgICAgICAgPSByZXF1aXJlKCcuLyQuc2FtZS12YWx1ZScpXG4gICwgU1BFQ0lFUyAgICA9IHJlcXVpcmUoJy4vJC53a3MnKSgnc3BlY2llcycpXG4gICwgc3BlY2llc0NvbnN0cnVjdG9yID0gcmVxdWlyZSgnLi8kLnNwZWNpZXMtY29uc3RydWN0b3InKVxuICAsIGFzYXAgICAgICAgPSByZXF1aXJlKCcuLyQubWljcm90YXNrJylcbiAgLCBQUk9NSVNFICAgID0gJ1Byb21pc2UnXG4gICwgcHJvY2VzcyAgICA9IGdsb2JhbC5wcm9jZXNzXG4gICwgaXNOb2RlICAgICA9IGNsYXNzb2YocHJvY2VzcykgPT0gJ3Byb2Nlc3MnXG4gICwgUCAgICAgICAgICA9IGdsb2JhbFtQUk9NSVNFXVxuICAsIGVtcHR5ICAgICAgPSBmdW5jdGlvbigpeyAvKiBlbXB0eSAqLyB9XG4gICwgV3JhcHBlcjtcblxudmFyIHRlc3RSZXNvbHZlID0gZnVuY3Rpb24oc3ViKXtcbiAgdmFyIHRlc3QgPSBuZXcgUChlbXB0eSksIHByb21pc2U7XG4gIGlmKHN1Yil0ZXN0LmNvbnN0cnVjdG9yID0gZnVuY3Rpb24oZXhlYyl7XG4gICAgZXhlYyhlbXB0eSwgZW1wdHkpO1xuICB9O1xuICAocHJvbWlzZSA9IFAucmVzb2x2ZSh0ZXN0KSlbJ2NhdGNoJ10oZW1wdHkpO1xuICByZXR1cm4gcHJvbWlzZSA9PT0gdGVzdDtcbn07XG5cbnZhciBVU0VfTkFUSVZFID0gZnVuY3Rpb24oKXtcbiAgdmFyIHdvcmtzID0gZmFsc2U7XG4gIGZ1bmN0aW9uIFAyKHgpe1xuICAgIHZhciBzZWxmID0gbmV3IFAoeCk7XG4gICAgc2V0UHJvdG8oc2VsZiwgUDIucHJvdG90eXBlKTtcbiAgICByZXR1cm4gc2VsZjtcbiAgfVxuICB0cnkge1xuICAgIHdvcmtzID0gUCAmJiBQLnJlc29sdmUgJiYgdGVzdFJlc29sdmUoKTtcbiAgICBzZXRQcm90byhQMiwgUCk7XG4gICAgUDIucHJvdG90eXBlID0gJC5jcmVhdGUoUC5wcm90b3R5cGUsIHtjb25zdHJ1Y3Rvcjoge3ZhbHVlOiBQMn19KTtcbiAgICAvLyBhY3R1YWwgRmlyZWZveCBoYXMgYnJva2VuIHN1YmNsYXNzIHN1cHBvcnQsIHRlc3QgdGhhdFxuICAgIGlmKCEoUDIucmVzb2x2ZSg1KS50aGVuKGZ1bmN0aW9uKCl7fSkgaW5zdGFuY2VvZiBQMikpe1xuICAgICAgd29ya3MgPSBmYWxzZTtcbiAgICB9XG4gICAgLy8gYWN0dWFsIFY4IGJ1ZywgaHR0cHM6Ly9jb2RlLmdvb2dsZS5jb20vcC92OC9pc3N1ZXMvZGV0YWlsP2lkPTQxNjJcbiAgICBpZih3b3JrcyAmJiByZXF1aXJlKCcuLyQuZGVzY3JpcHRvcnMnKSl7XG4gICAgICB2YXIgdGhlbmFibGVUaGVuR290dGVuID0gZmFsc2U7XG4gICAgICBQLnJlc29sdmUoJC5zZXREZXNjKHt9LCAndGhlbicsIHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbigpeyB0aGVuYWJsZVRoZW5Hb3R0ZW4gPSB0cnVlOyB9XG4gICAgICB9KSk7XG4gICAgICB3b3JrcyA9IHRoZW5hYmxlVGhlbkdvdHRlbjtcbiAgICB9XG4gIH0gY2F0Y2goZSl7IHdvcmtzID0gZmFsc2U7IH1cbiAgcmV0dXJuIHdvcmtzO1xufSgpO1xuXG4vLyBoZWxwZXJzXG52YXIgc2FtZUNvbnN0cnVjdG9yID0gZnVuY3Rpb24oYSwgYil7XG4gIC8vIGxpYnJhcnkgd3JhcHBlciBzcGVjaWFsIGNhc2VcbiAgaWYoTElCUkFSWSAmJiBhID09PSBQICYmIGIgPT09IFdyYXBwZXIpcmV0dXJuIHRydWU7XG4gIHJldHVybiBzYW1lKGEsIGIpO1xufTtcbnZhciBnZXRDb25zdHJ1Y3RvciA9IGZ1bmN0aW9uKEMpe1xuICB2YXIgUyA9IGFuT2JqZWN0KEMpW1NQRUNJRVNdO1xuICByZXR1cm4gUyAhPSB1bmRlZmluZWQgPyBTIDogQztcbn07XG52YXIgaXNUaGVuYWJsZSA9IGZ1bmN0aW9uKGl0KXtcbiAgdmFyIHRoZW47XG4gIHJldHVybiBpc09iamVjdChpdCkgJiYgdHlwZW9mICh0aGVuID0gaXQudGhlbikgPT0gJ2Z1bmN0aW9uJyA/IHRoZW4gOiBmYWxzZTtcbn07XG52YXIgUHJvbWlzZUNhcGFiaWxpdHkgPSBmdW5jdGlvbihDKXtcbiAgdmFyIHJlc29sdmUsIHJlamVjdDtcbiAgdGhpcy5wcm9taXNlID0gbmV3IEMoZnVuY3Rpb24oJCRyZXNvbHZlLCAkJHJlamVjdCl7XG4gICAgaWYocmVzb2x2ZSAhPT0gdW5kZWZpbmVkIHx8IHJlamVjdCAhPT0gdW5kZWZpbmVkKXRocm93IFR5cGVFcnJvcignQmFkIFByb21pc2UgY29uc3RydWN0b3InKTtcbiAgICByZXNvbHZlID0gJCRyZXNvbHZlO1xuICAgIHJlamVjdCAgPSAkJHJlamVjdDtcbiAgfSk7XG4gIHRoaXMucmVzb2x2ZSA9IGFGdW5jdGlvbihyZXNvbHZlKSxcbiAgdGhpcy5yZWplY3QgID0gYUZ1bmN0aW9uKHJlamVjdClcbn07XG52YXIgcGVyZm9ybSA9IGZ1bmN0aW9uKGV4ZWMpe1xuICB0cnkge1xuICAgIGV4ZWMoKTtcbiAgfSBjYXRjaChlKXtcbiAgICByZXR1cm4ge2Vycm9yOiBlfTtcbiAgfVxufTtcbnZhciBub3RpZnkgPSBmdW5jdGlvbihyZWNvcmQsIGlzUmVqZWN0KXtcbiAgaWYocmVjb3JkLm4pcmV0dXJuO1xuICByZWNvcmQubiA9IHRydWU7XG4gIHZhciBjaGFpbiA9IHJlY29yZC5jO1xuICBhc2FwKGZ1bmN0aW9uKCl7XG4gICAgdmFyIHZhbHVlID0gcmVjb3JkLnZcbiAgICAgICwgb2sgICAgPSByZWNvcmQucyA9PSAxXG4gICAgICAsIGkgICAgID0gMDtcbiAgICB2YXIgcnVuID0gZnVuY3Rpb24ocmVhY3Rpb24pe1xuICAgICAgdmFyIGhhbmRsZXIgPSBvayA/IHJlYWN0aW9uLm9rIDogcmVhY3Rpb24uZmFpbFxuICAgICAgICAsIHJlc29sdmUgPSByZWFjdGlvbi5yZXNvbHZlXG4gICAgICAgICwgcmVqZWN0ICA9IHJlYWN0aW9uLnJlamVjdFxuICAgICAgICAsIHJlc3VsdCwgdGhlbjtcbiAgICAgIHRyeSB7XG4gICAgICAgIGlmKGhhbmRsZXIpe1xuICAgICAgICAgIGlmKCFvaylyZWNvcmQuaCA9IHRydWU7XG4gICAgICAgICAgcmVzdWx0ID0gaGFuZGxlciA9PT0gdHJ1ZSA/IHZhbHVlIDogaGFuZGxlcih2YWx1ZSk7XG4gICAgICAgICAgaWYocmVzdWx0ID09PSByZWFjdGlvbi5wcm9taXNlKXtcbiAgICAgICAgICAgIHJlamVjdChUeXBlRXJyb3IoJ1Byb21pc2UtY2hhaW4gY3ljbGUnKSk7XG4gICAgICAgICAgfSBlbHNlIGlmKHRoZW4gPSBpc1RoZW5hYmxlKHJlc3VsdCkpe1xuICAgICAgICAgICAgdGhlbi5jYWxsKHJlc3VsdCwgcmVzb2x2ZSwgcmVqZWN0KTtcbiAgICAgICAgICB9IGVsc2UgcmVzb2x2ZShyZXN1bHQpO1xuICAgICAgICB9IGVsc2UgcmVqZWN0KHZhbHVlKTtcbiAgICAgIH0gY2F0Y2goZSl7XG4gICAgICAgIHJlamVjdChlKTtcbiAgICAgIH1cbiAgICB9O1xuICAgIHdoaWxlKGNoYWluLmxlbmd0aCA+IGkpcnVuKGNoYWluW2krK10pOyAvLyB2YXJpYWJsZSBsZW5ndGggLSBjYW4ndCB1c2UgZm9yRWFjaFxuICAgIGNoYWluLmxlbmd0aCA9IDA7XG4gICAgcmVjb3JkLm4gPSBmYWxzZTtcbiAgICBpZihpc1JlamVjdClzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7XG4gICAgICB2YXIgcHJvbWlzZSA9IHJlY29yZC5wXG4gICAgICAgICwgaGFuZGxlciwgY29uc29sZTtcbiAgICAgIGlmKGlzVW5oYW5kbGVkKHByb21pc2UpKXtcbiAgICAgICAgaWYoaXNOb2RlKXtcbiAgICAgICAgICBwcm9jZXNzLmVtaXQoJ3VuaGFuZGxlZFJlamVjdGlvbicsIHZhbHVlLCBwcm9taXNlKTtcbiAgICAgICAgfSBlbHNlIGlmKGhhbmRsZXIgPSBnbG9iYWwub251bmhhbmRsZWRyZWplY3Rpb24pe1xuICAgICAgICAgIGhhbmRsZXIoe3Byb21pc2U6IHByb21pc2UsIHJlYXNvbjogdmFsdWV9KTtcbiAgICAgICAgfSBlbHNlIGlmKChjb25zb2xlID0gZ2xvYmFsLmNvbnNvbGUpICYmIGNvbnNvbGUuZXJyb3Ipe1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1VuaGFuZGxlZCBwcm9taXNlIHJlamVjdGlvbicsIHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgfSByZWNvcmQuYSA9IHVuZGVmaW5lZDtcbiAgICB9LCAxKTtcbiAgfSk7XG59O1xudmFyIGlzVW5oYW5kbGVkID0gZnVuY3Rpb24ocHJvbWlzZSl7XG4gIHZhciByZWNvcmQgPSBwcm9taXNlLl9kXG4gICAgLCBjaGFpbiAgPSByZWNvcmQuYSB8fCByZWNvcmQuY1xuICAgICwgaSAgICAgID0gMFxuICAgICwgcmVhY3Rpb247XG4gIGlmKHJlY29yZC5oKXJldHVybiBmYWxzZTtcbiAgd2hpbGUoY2hhaW4ubGVuZ3RoID4gaSl7XG4gICAgcmVhY3Rpb24gPSBjaGFpbltpKytdO1xuICAgIGlmKHJlYWN0aW9uLmZhaWwgfHwgIWlzVW5oYW5kbGVkKHJlYWN0aW9uLnByb21pc2UpKXJldHVybiBmYWxzZTtcbiAgfSByZXR1cm4gdHJ1ZTtcbn07XG52YXIgJHJlamVjdCA9IGZ1bmN0aW9uKHZhbHVlKXtcbiAgdmFyIHJlY29yZCA9IHRoaXM7XG4gIGlmKHJlY29yZC5kKXJldHVybjtcbiAgcmVjb3JkLmQgPSB0cnVlO1xuICByZWNvcmQgPSByZWNvcmQuciB8fCByZWNvcmQ7IC8vIHVud3JhcFxuICByZWNvcmQudiA9IHZhbHVlO1xuICByZWNvcmQucyA9IDI7XG4gIHJlY29yZC5hID0gcmVjb3JkLmMuc2xpY2UoKTtcbiAgbm90aWZ5KHJlY29yZCwgdHJ1ZSk7XG59O1xudmFyICRyZXNvbHZlID0gZnVuY3Rpb24odmFsdWUpe1xuICB2YXIgcmVjb3JkID0gdGhpc1xuICAgICwgdGhlbjtcbiAgaWYocmVjb3JkLmQpcmV0dXJuO1xuICByZWNvcmQuZCA9IHRydWU7XG4gIHJlY29yZCA9IHJlY29yZC5yIHx8IHJlY29yZDsgLy8gdW53cmFwXG4gIHRyeSB7XG4gICAgaWYocmVjb3JkLnAgPT09IHZhbHVlKXRocm93IFR5cGVFcnJvcihcIlByb21pc2UgY2FuJ3QgYmUgcmVzb2x2ZWQgaXRzZWxmXCIpO1xuICAgIGlmKHRoZW4gPSBpc1RoZW5hYmxlKHZhbHVlKSl7XG4gICAgICBhc2FwKGZ1bmN0aW9uKCl7XG4gICAgICAgIHZhciB3cmFwcGVyID0ge3I6IHJlY29yZCwgZDogZmFsc2V9OyAvLyB3cmFwXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgdGhlbi5jYWxsKHZhbHVlLCBjdHgoJHJlc29sdmUsIHdyYXBwZXIsIDEpLCBjdHgoJHJlamVjdCwgd3JhcHBlciwgMSkpO1xuICAgICAgICB9IGNhdGNoKGUpe1xuICAgICAgICAgICRyZWplY3QuY2FsbCh3cmFwcGVyLCBlKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlY29yZC52ID0gdmFsdWU7XG4gICAgICByZWNvcmQucyA9IDE7XG4gICAgICBub3RpZnkocmVjb3JkLCBmYWxzZSk7XG4gICAgfVxuICB9IGNhdGNoKGUpe1xuICAgICRyZWplY3QuY2FsbCh7cjogcmVjb3JkLCBkOiBmYWxzZX0sIGUpOyAvLyB3cmFwXG4gIH1cbn07XG5cbi8vIGNvbnN0cnVjdG9yIHBvbHlmaWxsXG5pZighVVNFX05BVElWRSl7XG4gIC8vIDI1LjQuMy4xIFByb21pc2UoZXhlY3V0b3IpXG4gIFAgPSBmdW5jdGlvbiBQcm9taXNlKGV4ZWN1dG9yKXtcbiAgICBhRnVuY3Rpb24oZXhlY3V0b3IpO1xuICAgIHZhciByZWNvcmQgPSB0aGlzLl9kID0ge1xuICAgICAgcDogc3RyaWN0TmV3KHRoaXMsIFAsIFBST01JU0UpLCAgICAgICAgIC8vIDwtIHByb21pc2VcbiAgICAgIGM6IFtdLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyA8LSBhd2FpdGluZyByZWFjdGlvbnNcbiAgICAgIGE6IHVuZGVmaW5lZCwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyA8LSBjaGVja2VkIGluIGlzVW5oYW5kbGVkIHJlYWN0aW9uc1xuICAgICAgczogMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDwtIHN0YXRlXG4gICAgICBkOiBmYWxzZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gPC0gZG9uZVxuICAgICAgdjogdW5kZWZpbmVkLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDwtIHZhbHVlXG4gICAgICBoOiBmYWxzZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gPC0gaGFuZGxlZCByZWplY3Rpb25cbiAgICAgIG46IGZhbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyA8LSBub3RpZnlcbiAgICB9O1xuICAgIHRyeSB7XG4gICAgICBleGVjdXRvcihjdHgoJHJlc29sdmUsIHJlY29yZCwgMSksIGN0eCgkcmVqZWN0LCByZWNvcmQsIDEpKTtcbiAgICB9IGNhdGNoKGVycil7XG4gICAgICAkcmVqZWN0LmNhbGwocmVjb3JkLCBlcnIpO1xuICAgIH1cbiAgfTtcbiAgcmVxdWlyZSgnLi8kLnJlZGVmaW5lLWFsbCcpKFAucHJvdG90eXBlLCB7XG4gICAgLy8gMjUuNC41LjMgUHJvbWlzZS5wcm90b3R5cGUudGhlbihvbkZ1bGZpbGxlZCwgb25SZWplY3RlZClcbiAgICB0aGVuOiBmdW5jdGlvbiB0aGVuKG9uRnVsZmlsbGVkLCBvblJlamVjdGVkKXtcbiAgICAgIHZhciByZWFjdGlvbiA9IG5ldyBQcm9taXNlQ2FwYWJpbGl0eShzcGVjaWVzQ29uc3RydWN0b3IodGhpcywgUCkpXG4gICAgICAgICwgcHJvbWlzZSAgPSByZWFjdGlvbi5wcm9taXNlXG4gICAgICAgICwgcmVjb3JkICAgPSB0aGlzLl9kO1xuICAgICAgcmVhY3Rpb24ub2sgICA9IHR5cGVvZiBvbkZ1bGZpbGxlZCA9PSAnZnVuY3Rpb24nID8gb25GdWxmaWxsZWQgOiB0cnVlO1xuICAgICAgcmVhY3Rpb24uZmFpbCA9IHR5cGVvZiBvblJlamVjdGVkID09ICdmdW5jdGlvbicgJiYgb25SZWplY3RlZDtcbiAgICAgIHJlY29yZC5jLnB1c2gocmVhY3Rpb24pO1xuICAgICAgaWYocmVjb3JkLmEpcmVjb3JkLmEucHVzaChyZWFjdGlvbik7XG4gICAgICBpZihyZWNvcmQucylub3RpZnkocmVjb3JkLCBmYWxzZSk7XG4gICAgICByZXR1cm4gcHJvbWlzZTtcbiAgICB9LFxuICAgIC8vIDI1LjQuNS4xIFByb21pc2UucHJvdG90eXBlLmNhdGNoKG9uUmVqZWN0ZWQpXG4gICAgJ2NhdGNoJzogZnVuY3Rpb24ob25SZWplY3RlZCl7XG4gICAgICByZXR1cm4gdGhpcy50aGVuKHVuZGVmaW5lZCwgb25SZWplY3RlZCk7XG4gICAgfVxuICB9KTtcbn1cblxuJGV4cG9ydCgkZXhwb3J0LkcgKyAkZXhwb3J0LlcgKyAkZXhwb3J0LkYgKiAhVVNFX05BVElWRSwge1Byb21pc2U6IFB9KTtcbnJlcXVpcmUoJy4vJC5zZXQtdG8tc3RyaW5nLXRhZycpKFAsIFBST01JU0UpO1xucmVxdWlyZSgnLi8kLnNldC1zcGVjaWVzJykoUFJPTUlTRSk7XG5XcmFwcGVyID0gcmVxdWlyZSgnLi8kLmNvcmUnKVtQUk9NSVNFXTtcblxuLy8gc3RhdGljc1xuJGV4cG9ydCgkZXhwb3J0LlMgKyAkZXhwb3J0LkYgKiAhVVNFX05BVElWRSwgUFJPTUlTRSwge1xuICAvLyAyNS40LjQuNSBQcm9taXNlLnJlamVjdChyKVxuICByZWplY3Q6IGZ1bmN0aW9uIHJlamVjdChyKXtcbiAgICB2YXIgY2FwYWJpbGl0eSA9IG5ldyBQcm9taXNlQ2FwYWJpbGl0eSh0aGlzKVxuICAgICAgLCAkJHJlamVjdCAgID0gY2FwYWJpbGl0eS5yZWplY3Q7XG4gICAgJCRyZWplY3Qocik7XG4gICAgcmV0dXJuIGNhcGFiaWxpdHkucHJvbWlzZTtcbiAgfVxufSk7XG4kZXhwb3J0KCRleHBvcnQuUyArICRleHBvcnQuRiAqICghVVNFX05BVElWRSB8fCB0ZXN0UmVzb2x2ZSh0cnVlKSksIFBST01JU0UsIHtcbiAgLy8gMjUuNC40LjYgUHJvbWlzZS5yZXNvbHZlKHgpXG4gIHJlc29sdmU6IGZ1bmN0aW9uIHJlc29sdmUoeCl7XG4gICAgLy8gaW5zdGFuY2VvZiBpbnN0ZWFkIG9mIGludGVybmFsIHNsb3QgY2hlY2sgYmVjYXVzZSB3ZSBzaG91bGQgZml4IGl0IHdpdGhvdXQgcmVwbGFjZW1lbnQgbmF0aXZlIFByb21pc2UgY29yZVxuICAgIGlmKHggaW5zdGFuY2VvZiBQICYmIHNhbWVDb25zdHJ1Y3Rvcih4LmNvbnN0cnVjdG9yLCB0aGlzKSlyZXR1cm4geDtcbiAgICB2YXIgY2FwYWJpbGl0eSA9IG5ldyBQcm9taXNlQ2FwYWJpbGl0eSh0aGlzKVxuICAgICAgLCAkJHJlc29sdmUgID0gY2FwYWJpbGl0eS5yZXNvbHZlO1xuICAgICQkcmVzb2x2ZSh4KTtcbiAgICByZXR1cm4gY2FwYWJpbGl0eS5wcm9taXNlO1xuICB9XG59KTtcbiRleHBvcnQoJGV4cG9ydC5TICsgJGV4cG9ydC5GICogIShVU0VfTkFUSVZFICYmIHJlcXVpcmUoJy4vJC5pdGVyLWRldGVjdCcpKGZ1bmN0aW9uKGl0ZXIpe1xuICBQLmFsbChpdGVyKVsnY2F0Y2gnXShmdW5jdGlvbigpe30pO1xufSkpLCBQUk9NSVNFLCB7XG4gIC8vIDI1LjQuNC4xIFByb21pc2UuYWxsKGl0ZXJhYmxlKVxuICBhbGw6IGZ1bmN0aW9uIGFsbChpdGVyYWJsZSl7XG4gICAgdmFyIEMgICAgICAgICAgPSBnZXRDb25zdHJ1Y3Rvcih0aGlzKVxuICAgICAgLCBjYXBhYmlsaXR5ID0gbmV3IFByb21pc2VDYXBhYmlsaXR5KEMpXG4gICAgICAsIHJlc29sdmUgICAgPSBjYXBhYmlsaXR5LnJlc29sdmVcbiAgICAgICwgcmVqZWN0ICAgICA9IGNhcGFiaWxpdHkucmVqZWN0XG4gICAgICAsIHZhbHVlcyAgICAgPSBbXTtcbiAgICB2YXIgYWJydXB0ID0gcGVyZm9ybShmdW5jdGlvbigpe1xuICAgICAgZm9yT2YoaXRlcmFibGUsIGZhbHNlLCB2YWx1ZXMucHVzaCwgdmFsdWVzKTtcbiAgICAgIHZhciByZW1haW5pbmcgPSB2YWx1ZXMubGVuZ3RoXG4gICAgICAgICwgcmVzdWx0cyAgID0gQXJyYXkocmVtYWluaW5nKTtcbiAgICAgIGlmKHJlbWFpbmluZykkLmVhY2guY2FsbCh2YWx1ZXMsIGZ1bmN0aW9uKHByb21pc2UsIGluZGV4KXtcbiAgICAgICAgdmFyIGFscmVhZHlDYWxsZWQgPSBmYWxzZTtcbiAgICAgICAgQy5yZXNvbHZlKHByb21pc2UpLnRoZW4oZnVuY3Rpb24odmFsdWUpe1xuICAgICAgICAgIGlmKGFscmVhZHlDYWxsZWQpcmV0dXJuO1xuICAgICAgICAgIGFscmVhZHlDYWxsZWQgPSB0cnVlO1xuICAgICAgICAgIHJlc3VsdHNbaW5kZXhdID0gdmFsdWU7XG4gICAgICAgICAgLS1yZW1haW5pbmcgfHwgcmVzb2x2ZShyZXN1bHRzKTtcbiAgICAgICAgfSwgcmVqZWN0KTtcbiAgICAgIH0pO1xuICAgICAgZWxzZSByZXNvbHZlKHJlc3VsdHMpO1xuICAgIH0pO1xuICAgIGlmKGFicnVwdClyZWplY3QoYWJydXB0LmVycm9yKTtcbiAgICByZXR1cm4gY2FwYWJpbGl0eS5wcm9taXNlO1xuICB9LFxuICAvLyAyNS40LjQuNCBQcm9taXNlLnJhY2UoaXRlcmFibGUpXG4gIHJhY2U6IGZ1bmN0aW9uIHJhY2UoaXRlcmFibGUpe1xuICAgIHZhciBDICAgICAgICAgID0gZ2V0Q29uc3RydWN0b3IodGhpcylcbiAgICAgICwgY2FwYWJpbGl0eSA9IG5ldyBQcm9taXNlQ2FwYWJpbGl0eShDKVxuICAgICAgLCByZWplY3QgICAgID0gY2FwYWJpbGl0eS5yZWplY3Q7XG4gICAgdmFyIGFicnVwdCA9IHBlcmZvcm0oZnVuY3Rpb24oKXtcbiAgICAgIGZvck9mKGl0ZXJhYmxlLCBmYWxzZSwgZnVuY3Rpb24ocHJvbWlzZSl7XG4gICAgICAgIEMucmVzb2x2ZShwcm9taXNlKS50aGVuKGNhcGFiaWxpdHkucmVzb2x2ZSwgcmVqZWN0KTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICAgIGlmKGFicnVwdClyZWplY3QoYWJydXB0LmVycm9yKTtcbiAgICByZXR1cm4gY2FwYWJpbGl0eS5wcm9taXNlO1xuICB9XG59KTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9jb3JlLWpzL21vZHVsZXMvZXM2LnByb21pc2UuanNcbiAqKiBtb2R1bGUgaWQgPSAzNDlcbiAqKiBtb2R1bGUgY2h1bmtzID0gMjRcbiAqKi8iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=");

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

	eval("module.exports = function(it, Constructor, name){\n  if(!(it instanceof Constructor))throw TypeError(name + \": use the 'new' operator!\");\n  return it;\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzUwLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvJC5zdHJpY3QtbmV3LmpzPzQ2MWMiXSwic291cmNlc0NvbnRlbnQiOlsibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihpdCwgQ29uc3RydWN0b3IsIG5hbWUpe1xuICBpZighKGl0IGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKXRocm93IFR5cGVFcnJvcihuYW1lICsgXCI6IHVzZSB0aGUgJ25ldycgb3BlcmF0b3IhXCIpO1xuICByZXR1cm4gaXQ7XG59O1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2NvcmUtanMvbW9kdWxlcy8kLnN0cmljdC1uZXcuanNcbiAqKiBtb2R1bGUgaWQgPSAzNTBcbiAqKiBtb2R1bGUgY2h1bmtzID0gMjRcbiAqKi8iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");

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

	eval("var ctx         = __webpack_require__(225)\n  , call        = __webpack_require__(325)\n  , isArrayIter = __webpack_require__(326)\n  , anObject    = __webpack_require__(233)\n  , toLength    = __webpack_require__(240)\n  , getIterFn   = __webpack_require__(327);\nmodule.exports = function(iterable, entries, fn, that){\n  var iterFn = getIterFn(iterable)\n    , f      = ctx(fn, that, entries ? 2 : 1)\n    , index  = 0\n    , length, step, iterator;\n  if(typeof iterFn != 'function')throw TypeError(iterable + ' is not iterable!');\n  // fast case for arrays with default iterator\n  if(isArrayIter(iterFn))for(length = toLength(iterable.length); length > index; index++){\n    entries ? f(anObject(step = iterable[index])[0], step[1]) : f(iterable[index]);\n  } else for(iterator = iterFn.call(iterable); !(step = iterator.next()).done; ){\n    call(iterator, f, step.value, entries);\n  }\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzUxLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvJC5mb3Itb2YuanM/NjE5NyJdLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgY3R4ICAgICAgICAgPSByZXF1aXJlKCcuLyQuY3R4JylcbiAgLCBjYWxsICAgICAgICA9IHJlcXVpcmUoJy4vJC5pdGVyLWNhbGwnKVxuICAsIGlzQXJyYXlJdGVyID0gcmVxdWlyZSgnLi8kLmlzLWFycmF5LWl0ZXInKVxuICAsIGFuT2JqZWN0ICAgID0gcmVxdWlyZSgnLi8kLmFuLW9iamVjdCcpXG4gICwgdG9MZW5ndGggICAgPSByZXF1aXJlKCcuLyQudG8tbGVuZ3RoJylcbiAgLCBnZXRJdGVyRm4gICA9IHJlcXVpcmUoJy4vY29yZS5nZXQtaXRlcmF0b3ItbWV0aG9kJyk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGl0ZXJhYmxlLCBlbnRyaWVzLCBmbiwgdGhhdCl7XG4gIHZhciBpdGVyRm4gPSBnZXRJdGVyRm4oaXRlcmFibGUpXG4gICAgLCBmICAgICAgPSBjdHgoZm4sIHRoYXQsIGVudHJpZXMgPyAyIDogMSlcbiAgICAsIGluZGV4ICA9IDBcbiAgICAsIGxlbmd0aCwgc3RlcCwgaXRlcmF0b3I7XG4gIGlmKHR5cGVvZiBpdGVyRm4gIT0gJ2Z1bmN0aW9uJyl0aHJvdyBUeXBlRXJyb3IoaXRlcmFibGUgKyAnIGlzIG5vdCBpdGVyYWJsZSEnKTtcbiAgLy8gZmFzdCBjYXNlIGZvciBhcnJheXMgd2l0aCBkZWZhdWx0IGl0ZXJhdG9yXG4gIGlmKGlzQXJyYXlJdGVyKGl0ZXJGbikpZm9yKGxlbmd0aCA9IHRvTGVuZ3RoKGl0ZXJhYmxlLmxlbmd0aCk7IGxlbmd0aCA+IGluZGV4OyBpbmRleCsrKXtcbiAgICBlbnRyaWVzID8gZihhbk9iamVjdChzdGVwID0gaXRlcmFibGVbaW5kZXhdKVswXSwgc3RlcFsxXSkgOiBmKGl0ZXJhYmxlW2luZGV4XSk7XG4gIH0gZWxzZSBmb3IoaXRlcmF0b3IgPSBpdGVyRm4uY2FsbChpdGVyYWJsZSk7ICEoc3RlcCA9IGl0ZXJhdG9yLm5leHQoKSkuZG9uZTsgKXtcbiAgICBjYWxsKGl0ZXJhdG9yLCBmLCBzdGVwLnZhbHVlLCBlbnRyaWVzKTtcbiAgfVxufTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9jb3JlLWpzL21vZHVsZXMvJC5mb3Itb2YuanNcbiAqKiBtb2R1bGUgaWQgPSAzNTFcbiAqKiBtb2R1bGUgY2h1bmtzID0gMjRcbiAqKi8iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");

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

	eval("// 7.3.20 SpeciesConstructor(O, defaultConstructor)\nvar anObject  = __webpack_require__(233)\n  , aFunction = __webpack_require__(226)\n  , SPECIES   = __webpack_require__(244)('species');\nmodule.exports = function(O, D){\n  var C = anObject(O).constructor, S;\n  return C === undefined || (S = anObject(C)[SPECIES]) == undefined ? D : aFunction(S);\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzUyLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvJC5zcGVjaWVzLWNvbnN0cnVjdG9yLmpzPzA5NzUiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gNy4zLjIwIFNwZWNpZXNDb25zdHJ1Y3RvcihPLCBkZWZhdWx0Q29uc3RydWN0b3IpXG52YXIgYW5PYmplY3QgID0gcmVxdWlyZSgnLi8kLmFuLW9iamVjdCcpXG4gICwgYUZ1bmN0aW9uID0gcmVxdWlyZSgnLi8kLmEtZnVuY3Rpb24nKVxuICAsIFNQRUNJRVMgICA9IHJlcXVpcmUoJy4vJC53a3MnKSgnc3BlY2llcycpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihPLCBEKXtcbiAgdmFyIEMgPSBhbk9iamVjdChPKS5jb25zdHJ1Y3RvciwgUztcbiAgcmV0dXJuIEMgPT09IHVuZGVmaW5lZCB8fCAoUyA9IGFuT2JqZWN0KEMpW1NQRUNJRVNdKSA9PSB1bmRlZmluZWQgPyBEIDogYUZ1bmN0aW9uKFMpO1xufTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9jb3JlLWpzL21vZHVsZXMvJC5zcGVjaWVzLWNvbnN0cnVjdG9yLmpzXG4gKiogbW9kdWxlIGlkID0gMzUyXG4gKiogbW9kdWxlIGNodW5rcyA9IDI0XG4gKiovIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");

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

	eval("var global    = __webpack_require__(217)\n  , macrotask = __webpack_require__(354).set\n  , Observer  = global.MutationObserver || global.WebKitMutationObserver\n  , process   = global.process\n  , Promise   = global.Promise\n  , isNode    = __webpack_require__(231)(process) == 'process'\n  , head, last, notify;\n\nvar flush = function(){\n  var parent, domain, fn;\n  if(isNode && (parent = process.domain)){\n    process.domain = null;\n    parent.exit();\n  }\n  while(head){\n    domain = head.domain;\n    fn     = head.fn;\n    if(domain)domain.enter();\n    fn(); // <- currently we use it only for Promise - try / catch not required\n    if(domain)domain.exit();\n    head = head.next;\n  } last = undefined;\n  if(parent)parent.enter();\n};\n\n// Node.js\nif(isNode){\n  notify = function(){\n    process.nextTick(flush);\n  };\n// browsers with MutationObserver\n} else if(Observer){\n  var toggle = 1\n    , node   = document.createTextNode('');\n  new Observer(flush).observe(node, {characterData: true}); // eslint-disable-line no-new\n  notify = function(){\n    node.data = toggle = -toggle;\n  };\n// environments with maybe non-completely correct, but existent Promise\n} else if(Promise && Promise.resolve){\n  notify = function(){\n    Promise.resolve().then(flush);\n  };\n// for other environments - macrotask based on:\n// - setImmediate\n// - MessageChannel\n// - window.postMessag\n// - onreadystatechange\n// - setTimeout\n} else {\n  notify = function(){\n    // strange IE + webpack dev server bug - use .call(global)\n    macrotask.call(global, flush);\n  };\n}\n\nmodule.exports = function asap(fn){\n  var task = {fn: fn, next: undefined, domain: isNode && process.domain};\n  if(last)last.next = task;\n  if(!head){\n    head = task;\n    notify();\n  } last = task;\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzUzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvJC5taWNyb3Rhc2suanM/YzRhNSJdLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgZ2xvYmFsICAgID0gcmVxdWlyZSgnLi8kLmdsb2JhbCcpXG4gICwgbWFjcm90YXNrID0gcmVxdWlyZSgnLi8kLnRhc2snKS5zZXRcbiAgLCBPYnNlcnZlciAgPSBnbG9iYWwuTXV0YXRpb25PYnNlcnZlciB8fCBnbG9iYWwuV2ViS2l0TXV0YXRpb25PYnNlcnZlclxuICAsIHByb2Nlc3MgICA9IGdsb2JhbC5wcm9jZXNzXG4gICwgUHJvbWlzZSAgID0gZ2xvYmFsLlByb21pc2VcbiAgLCBpc05vZGUgICAgPSByZXF1aXJlKCcuLyQuY29mJykocHJvY2VzcykgPT0gJ3Byb2Nlc3MnXG4gICwgaGVhZCwgbGFzdCwgbm90aWZ5O1xuXG52YXIgZmx1c2ggPSBmdW5jdGlvbigpe1xuICB2YXIgcGFyZW50LCBkb21haW4sIGZuO1xuICBpZihpc05vZGUgJiYgKHBhcmVudCA9IHByb2Nlc3MuZG9tYWluKSl7XG4gICAgcHJvY2Vzcy5kb21haW4gPSBudWxsO1xuICAgIHBhcmVudC5leGl0KCk7XG4gIH1cbiAgd2hpbGUoaGVhZCl7XG4gICAgZG9tYWluID0gaGVhZC5kb21haW47XG4gICAgZm4gICAgID0gaGVhZC5mbjtcbiAgICBpZihkb21haW4pZG9tYWluLmVudGVyKCk7XG4gICAgZm4oKTsgLy8gPC0gY3VycmVudGx5IHdlIHVzZSBpdCBvbmx5IGZvciBQcm9taXNlIC0gdHJ5IC8gY2F0Y2ggbm90IHJlcXVpcmVkXG4gICAgaWYoZG9tYWluKWRvbWFpbi5leGl0KCk7XG4gICAgaGVhZCA9IGhlYWQubmV4dDtcbiAgfSBsYXN0ID0gdW5kZWZpbmVkO1xuICBpZihwYXJlbnQpcGFyZW50LmVudGVyKCk7XG59O1xuXG4vLyBOb2RlLmpzXG5pZihpc05vZGUpe1xuICBub3RpZnkgPSBmdW5jdGlvbigpe1xuICAgIHByb2Nlc3MubmV4dFRpY2soZmx1c2gpO1xuICB9O1xuLy8gYnJvd3NlcnMgd2l0aCBNdXRhdGlvbk9ic2VydmVyXG59IGVsc2UgaWYoT2JzZXJ2ZXIpe1xuICB2YXIgdG9nZ2xlID0gMVxuICAgICwgbm9kZSAgID0gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoJycpO1xuICBuZXcgT2JzZXJ2ZXIoZmx1c2gpLm9ic2VydmUobm9kZSwge2NoYXJhY3RlckRhdGE6IHRydWV9KTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1uZXdcbiAgbm90aWZ5ID0gZnVuY3Rpb24oKXtcbiAgICBub2RlLmRhdGEgPSB0b2dnbGUgPSAtdG9nZ2xlO1xuICB9O1xuLy8gZW52aXJvbm1lbnRzIHdpdGggbWF5YmUgbm9uLWNvbXBsZXRlbHkgY29ycmVjdCwgYnV0IGV4aXN0ZW50IFByb21pc2Vcbn0gZWxzZSBpZihQcm9taXNlICYmIFByb21pc2UucmVzb2x2ZSl7XG4gIG5vdGlmeSA9IGZ1bmN0aW9uKCl7XG4gICAgUHJvbWlzZS5yZXNvbHZlKCkudGhlbihmbHVzaCk7XG4gIH07XG4vLyBmb3Igb3RoZXIgZW52aXJvbm1lbnRzIC0gbWFjcm90YXNrIGJhc2VkIG9uOlxuLy8gLSBzZXRJbW1lZGlhdGVcbi8vIC0gTWVzc2FnZUNoYW5uZWxcbi8vIC0gd2luZG93LnBvc3RNZXNzYWdcbi8vIC0gb25yZWFkeXN0YXRlY2hhbmdlXG4vLyAtIHNldFRpbWVvdXRcbn0gZWxzZSB7XG4gIG5vdGlmeSA9IGZ1bmN0aW9uKCl7XG4gICAgLy8gc3RyYW5nZSBJRSArIHdlYnBhY2sgZGV2IHNlcnZlciBidWcgLSB1c2UgLmNhbGwoZ2xvYmFsKVxuICAgIG1hY3JvdGFzay5jYWxsKGdsb2JhbCwgZmx1c2gpO1xuICB9O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGFzYXAoZm4pe1xuICB2YXIgdGFzayA9IHtmbjogZm4sIG5leHQ6IHVuZGVmaW5lZCwgZG9tYWluOiBpc05vZGUgJiYgcHJvY2Vzcy5kb21haW59O1xuICBpZihsYXN0KWxhc3QubmV4dCA9IHRhc2s7XG4gIGlmKCFoZWFkKXtcbiAgICBoZWFkID0gdGFzaztcbiAgICBub3RpZnkoKTtcbiAgfSBsYXN0ID0gdGFzaztcbn07XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vY29yZS1qcy9tb2R1bGVzLyQubWljcm90YXNrLmpzXG4gKiogbW9kdWxlIGlkID0gMzUzXG4gKiogbW9kdWxlIGNodW5rcyA9IDI0XG4gKiovIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");

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

	eval("var ctx                = __webpack_require__(225)\n  , invoke             = __webpack_require__(232)\n  , html               = __webpack_require__(227)\n  , cel                = __webpack_require__(228)\n  , global             = __webpack_require__(217)\n  , process            = global.process\n  , setTask            = global.setImmediate\n  , clearTask          = global.clearImmediate\n  , MessageChannel     = global.MessageChannel\n  , counter            = 0\n  , queue              = {}\n  , ONREADYSTATECHANGE = 'onreadystatechange'\n  , defer, channel, port;\nvar run = function(){\n  var id = +this;\n  if(queue.hasOwnProperty(id)){\n    var fn = queue[id];\n    delete queue[id];\n    fn();\n  }\n};\nvar listner = function(event){\n  run.call(event.data);\n};\n// Node.js 0.9+ & IE10+ has setImmediate, otherwise:\nif(!setTask || !clearTask){\n  setTask = function setImmediate(fn){\n    var args = [], i = 1;\n    while(arguments.length > i)args.push(arguments[i++]);\n    queue[++counter] = function(){\n      invoke(typeof fn == 'function' ? fn : Function(fn), args);\n    };\n    defer(counter);\n    return counter;\n  };\n  clearTask = function clearImmediate(id){\n    delete queue[id];\n  };\n  // Node.js 0.8-\n  if(__webpack_require__(231)(process) == 'process'){\n    defer = function(id){\n      process.nextTick(ctx(run, id, 1));\n    };\n  // Browsers with MessageChannel, includes WebWorkers\n  } else if(MessageChannel){\n    channel = new MessageChannel;\n    port    = channel.port2;\n    channel.port1.onmessage = listner;\n    defer = ctx(port.postMessage, port, 1);\n  // Browsers with postMessage, skip WebWorkers\n  // IE8 has postMessage, but it's sync & typeof its postMessage is 'object'\n  } else if(global.addEventListener && typeof postMessage == 'function' && !global.importScripts){\n    defer = function(id){\n      global.postMessage(id + '', '*');\n    };\n    global.addEventListener('message', listner, false);\n  // IE8-\n  } else if(ONREADYSTATECHANGE in cel('script')){\n    defer = function(id){\n      html.appendChild(cel('script'))[ONREADYSTATECHANGE] = function(){\n        html.removeChild(this);\n        run.call(id);\n      };\n    };\n  // Rest old browsers\n  } else {\n    defer = function(id){\n      setTimeout(ctx(run, id, 1), 0);\n    };\n  }\n}\nmodule.exports = {\n  set:   setTask,\n  clear: clearTask\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzU0LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvJC50YXNrLmpzPzVmYjQiXSwic291cmNlc0NvbnRlbnQiOlsidmFyIGN0eCAgICAgICAgICAgICAgICA9IHJlcXVpcmUoJy4vJC5jdHgnKVxuICAsIGludm9rZSAgICAgICAgICAgICA9IHJlcXVpcmUoJy4vJC5pbnZva2UnKVxuICAsIGh0bWwgICAgICAgICAgICAgICA9IHJlcXVpcmUoJy4vJC5odG1sJylcbiAgLCBjZWwgICAgICAgICAgICAgICAgPSByZXF1aXJlKCcuLyQuZG9tLWNyZWF0ZScpXG4gICwgZ2xvYmFsICAgICAgICAgICAgID0gcmVxdWlyZSgnLi8kLmdsb2JhbCcpXG4gICwgcHJvY2VzcyAgICAgICAgICAgID0gZ2xvYmFsLnByb2Nlc3NcbiAgLCBzZXRUYXNrICAgICAgICAgICAgPSBnbG9iYWwuc2V0SW1tZWRpYXRlXG4gICwgY2xlYXJUYXNrICAgICAgICAgID0gZ2xvYmFsLmNsZWFySW1tZWRpYXRlXG4gICwgTWVzc2FnZUNoYW5uZWwgICAgID0gZ2xvYmFsLk1lc3NhZ2VDaGFubmVsXG4gICwgY291bnRlciAgICAgICAgICAgID0gMFxuICAsIHF1ZXVlICAgICAgICAgICAgICA9IHt9XG4gICwgT05SRUFEWVNUQVRFQ0hBTkdFID0gJ29ucmVhZHlzdGF0ZWNoYW5nZSdcbiAgLCBkZWZlciwgY2hhbm5lbCwgcG9ydDtcbnZhciBydW4gPSBmdW5jdGlvbigpe1xuICB2YXIgaWQgPSArdGhpcztcbiAgaWYocXVldWUuaGFzT3duUHJvcGVydHkoaWQpKXtcbiAgICB2YXIgZm4gPSBxdWV1ZVtpZF07XG4gICAgZGVsZXRlIHF1ZXVlW2lkXTtcbiAgICBmbigpO1xuICB9XG59O1xudmFyIGxpc3RuZXIgPSBmdW5jdGlvbihldmVudCl7XG4gIHJ1bi5jYWxsKGV2ZW50LmRhdGEpO1xufTtcbi8vIE5vZGUuanMgMC45KyAmIElFMTArIGhhcyBzZXRJbW1lZGlhdGUsIG90aGVyd2lzZTpcbmlmKCFzZXRUYXNrIHx8ICFjbGVhclRhc2spe1xuICBzZXRUYXNrID0gZnVuY3Rpb24gc2V0SW1tZWRpYXRlKGZuKXtcbiAgICB2YXIgYXJncyA9IFtdLCBpID0gMTtcbiAgICB3aGlsZShhcmd1bWVudHMubGVuZ3RoID4gaSlhcmdzLnB1c2goYXJndW1lbnRzW2krK10pO1xuICAgIHF1ZXVlWysrY291bnRlcl0gPSBmdW5jdGlvbigpe1xuICAgICAgaW52b2tlKHR5cGVvZiBmbiA9PSAnZnVuY3Rpb24nID8gZm4gOiBGdW5jdGlvbihmbiksIGFyZ3MpO1xuICAgIH07XG4gICAgZGVmZXIoY291bnRlcik7XG4gICAgcmV0dXJuIGNvdW50ZXI7XG4gIH07XG4gIGNsZWFyVGFzayA9IGZ1bmN0aW9uIGNsZWFySW1tZWRpYXRlKGlkKXtcbiAgICBkZWxldGUgcXVldWVbaWRdO1xuICB9O1xuICAvLyBOb2RlLmpzIDAuOC1cbiAgaWYocmVxdWlyZSgnLi8kLmNvZicpKHByb2Nlc3MpID09ICdwcm9jZXNzJyl7XG4gICAgZGVmZXIgPSBmdW5jdGlvbihpZCl7XG4gICAgICBwcm9jZXNzLm5leHRUaWNrKGN0eChydW4sIGlkLCAxKSk7XG4gICAgfTtcbiAgLy8gQnJvd3NlcnMgd2l0aCBNZXNzYWdlQ2hhbm5lbCwgaW5jbHVkZXMgV2ViV29ya2Vyc1xuICB9IGVsc2UgaWYoTWVzc2FnZUNoYW5uZWwpe1xuICAgIGNoYW5uZWwgPSBuZXcgTWVzc2FnZUNoYW5uZWw7XG4gICAgcG9ydCAgICA9IGNoYW5uZWwucG9ydDI7XG4gICAgY2hhbm5lbC5wb3J0MS5vbm1lc3NhZ2UgPSBsaXN0bmVyO1xuICAgIGRlZmVyID0gY3R4KHBvcnQucG9zdE1lc3NhZ2UsIHBvcnQsIDEpO1xuICAvLyBCcm93c2VycyB3aXRoIHBvc3RNZXNzYWdlLCBza2lwIFdlYldvcmtlcnNcbiAgLy8gSUU4IGhhcyBwb3N0TWVzc2FnZSwgYnV0IGl0J3Mgc3luYyAmIHR5cGVvZiBpdHMgcG9zdE1lc3NhZ2UgaXMgJ29iamVjdCdcbiAgfSBlbHNlIGlmKGdsb2JhbC5hZGRFdmVudExpc3RlbmVyICYmIHR5cGVvZiBwb3N0TWVzc2FnZSA9PSAnZnVuY3Rpb24nICYmICFnbG9iYWwuaW1wb3J0U2NyaXB0cyl7XG4gICAgZGVmZXIgPSBmdW5jdGlvbihpZCl7XG4gICAgICBnbG9iYWwucG9zdE1lc3NhZ2UoaWQgKyAnJywgJyonKTtcbiAgICB9O1xuICAgIGdsb2JhbC5hZGRFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgbGlzdG5lciwgZmFsc2UpO1xuICAvLyBJRTgtXG4gIH0gZWxzZSBpZihPTlJFQURZU1RBVEVDSEFOR0UgaW4gY2VsKCdzY3JpcHQnKSl7XG4gICAgZGVmZXIgPSBmdW5jdGlvbihpZCl7XG4gICAgICBodG1sLmFwcGVuZENoaWxkKGNlbCgnc2NyaXB0JykpW09OUkVBRFlTVEFURUNIQU5HRV0gPSBmdW5jdGlvbigpe1xuICAgICAgICBodG1sLnJlbW92ZUNoaWxkKHRoaXMpO1xuICAgICAgICBydW4uY2FsbChpZCk7XG4gICAgICB9O1xuICAgIH07XG4gIC8vIFJlc3Qgb2xkIGJyb3dzZXJzXG4gIH0gZWxzZSB7XG4gICAgZGVmZXIgPSBmdW5jdGlvbihpZCl7XG4gICAgICBzZXRUaW1lb3V0KGN0eChydW4sIGlkLCAxKSwgMCk7XG4gICAgfTtcbiAgfVxufVxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIHNldDogICBzZXRUYXNrLFxuICBjbGVhcjogY2xlYXJUYXNrXG59O1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2NvcmUtanMvbW9kdWxlcy8kLnRhc2suanNcbiAqKiBtb2R1bGUgaWQgPSAzNTRcbiAqKiBtb2R1bGUgY2h1bmtzID0gMjRcbiAqKi8iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");

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

	eval("var redefine = __webpack_require__(223);\nmodule.exports = function(target, src){\n  for(var key in src)redefine(target, key, src[key]);\n  return target;\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzU1LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvJC5yZWRlZmluZS1hbGwuanM/NmIxMiJdLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgcmVkZWZpbmUgPSByZXF1aXJlKCcuLyQucmVkZWZpbmUnKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24odGFyZ2V0LCBzcmMpe1xuICBmb3IodmFyIGtleSBpbiBzcmMpcmVkZWZpbmUodGFyZ2V0LCBrZXksIHNyY1trZXldKTtcbiAgcmV0dXJuIHRhcmdldDtcbn07XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vY29yZS1qcy9tb2R1bGVzLyQucmVkZWZpbmUtYWxsLmpzXG4gKiogbW9kdWxlIGlkID0gMzU1XG4gKiogbW9kdWxlIGNodW5rcyA9IDI0XG4gKiovIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");

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

	eval("'use strict';\nvar strong = __webpack_require__(357);\n\n// 23.1 Map Objects\n__webpack_require__(358)('Map', function(get){\n  return function Map(){ return get(this, arguments.length > 0 ? arguments[0] : undefined); };\n}, {\n  // 23.1.3.6 Map.prototype.get(key)\n  get: function get(key){\n    var entry = strong.getEntry(this, key);\n    return entry && entry.v;\n  },\n  // 23.1.3.9 Map.prototype.set(key, value)\n  set: function set(key, value){\n    return strong.def(this, key === 0 ? 0 : key, value);\n  }\n}, strong, true);\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzU2LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvZXM2Lm1hcC5qcz9mY2MwIl0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcbnZhciBzdHJvbmcgPSByZXF1aXJlKCcuLyQuY29sbGVjdGlvbi1zdHJvbmcnKTtcblxuLy8gMjMuMSBNYXAgT2JqZWN0c1xucmVxdWlyZSgnLi8kLmNvbGxlY3Rpb24nKSgnTWFwJywgZnVuY3Rpb24oZ2V0KXtcbiAgcmV0dXJuIGZ1bmN0aW9uIE1hcCgpeyByZXR1cm4gZ2V0KHRoaXMsIGFyZ3VtZW50cy5sZW5ndGggPiAwID8gYXJndW1lbnRzWzBdIDogdW5kZWZpbmVkKTsgfTtcbn0sIHtcbiAgLy8gMjMuMS4zLjYgTWFwLnByb3RvdHlwZS5nZXQoa2V5KVxuICBnZXQ6IGZ1bmN0aW9uIGdldChrZXkpe1xuICAgIHZhciBlbnRyeSA9IHN0cm9uZy5nZXRFbnRyeSh0aGlzLCBrZXkpO1xuICAgIHJldHVybiBlbnRyeSAmJiBlbnRyeS52O1xuICB9LFxuICAvLyAyMy4xLjMuOSBNYXAucHJvdG90eXBlLnNldChrZXksIHZhbHVlKVxuICBzZXQ6IGZ1bmN0aW9uIHNldChrZXksIHZhbHVlKXtcbiAgICByZXR1cm4gc3Ryb25nLmRlZih0aGlzLCBrZXkgPT09IDAgPyAwIDoga2V5LCB2YWx1ZSk7XG4gIH1cbn0sIHN0cm9uZywgdHJ1ZSk7XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vY29yZS1qcy9tb2R1bGVzL2VzNi5tYXAuanNcbiAqKiBtb2R1bGUgaWQgPSAzNTZcbiAqKiBtb2R1bGUgY2h1bmtzID0gMjRcbiAqKi8iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=");

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

	eval("'use strict';\nvar $            = __webpack_require__(215)\n  , hide         = __webpack_require__(219)\n  , redefineAll  = __webpack_require__(355)\n  , ctx          = __webpack_require__(225)\n  , strictNew    = __webpack_require__(350)\n  , defined      = __webpack_require__(235)\n  , forOf        = __webpack_require__(351)\n  , $iterDefine  = __webpack_require__(312)\n  , step         = __webpack_require__(332)\n  , ID           = __webpack_require__(224)('id')\n  , $has         = __webpack_require__(230)\n  , isObject     = __webpack_require__(229)\n  , setSpecies   = __webpack_require__(334)\n  , DESCRIPTORS  = __webpack_require__(221)\n  , isExtensible = Object.isExtensible || isObject\n  , SIZE         = DESCRIPTORS ? '_s' : 'size'\n  , id           = 0;\n\nvar fastKey = function(it, create){\n  // return primitive with prefix\n  if(!isObject(it))return typeof it == 'symbol' ? it : (typeof it == 'string' ? 'S' : 'P') + it;\n  if(!$has(it, ID)){\n    // can't set id to frozen object\n    if(!isExtensible(it))return 'F';\n    // not necessary to add id\n    if(!create)return 'E';\n    // add missing object id\n    hide(it, ID, ++id);\n  // return object id with prefix\n  } return 'O' + it[ID];\n};\n\nvar getEntry = function(that, key){\n  // fast case\n  var index = fastKey(key), entry;\n  if(index !== 'F')return that._i[index];\n  // frozen object case\n  for(entry = that._f; entry; entry = entry.n){\n    if(entry.k == key)return entry;\n  }\n};\n\nmodule.exports = {\n  getConstructor: function(wrapper, NAME, IS_MAP, ADDER){\n    var C = wrapper(function(that, iterable){\n      strictNew(that, C, NAME);\n      that._i = $.create(null); // index\n      that._f = undefined;      // first entry\n      that._l = undefined;      // last entry\n      that[SIZE] = 0;           // size\n      if(iterable != undefined)forOf(iterable, IS_MAP, that[ADDER], that);\n    });\n    redefineAll(C.prototype, {\n      // 23.1.3.1 Map.prototype.clear()\n      // 23.2.3.2 Set.prototype.clear()\n      clear: function clear(){\n        for(var that = this, data = that._i, entry = that._f; entry; entry = entry.n){\n          entry.r = true;\n          if(entry.p)entry.p = entry.p.n = undefined;\n          delete data[entry.i];\n        }\n        that._f = that._l = undefined;\n        that[SIZE] = 0;\n      },\n      // 23.1.3.3 Map.prototype.delete(key)\n      // 23.2.3.4 Set.prototype.delete(value)\n      'delete': function(key){\n        var that  = this\n          , entry = getEntry(that, key);\n        if(entry){\n          var next = entry.n\n            , prev = entry.p;\n          delete that._i[entry.i];\n          entry.r = true;\n          if(prev)prev.n = next;\n          if(next)next.p = prev;\n          if(that._f == entry)that._f = next;\n          if(that._l == entry)that._l = prev;\n          that[SIZE]--;\n        } return !!entry;\n      },\n      // 23.2.3.6 Set.prototype.forEach(callbackfn, thisArg = undefined)\n      // 23.1.3.5 Map.prototype.forEach(callbackfn, thisArg = undefined)\n      forEach: function forEach(callbackfn /*, that = undefined */){\n        var f = ctx(callbackfn, arguments.length > 1 ? arguments[1] : undefined, 3)\n          , entry;\n        while(entry = entry ? entry.n : this._f){\n          f(entry.v, entry.k, this);\n          // revert to the last existing entry\n          while(entry && entry.r)entry = entry.p;\n        }\n      },\n      // 23.1.3.7 Map.prototype.has(key)\n      // 23.2.3.7 Set.prototype.has(value)\n      has: function has(key){\n        return !!getEntry(this, key);\n      }\n    });\n    if(DESCRIPTORS)$.setDesc(C.prototype, 'size', {\n      get: function(){\n        return defined(this[SIZE]);\n      }\n    });\n    return C;\n  },\n  def: function(that, key, value){\n    var entry = getEntry(that, key)\n      , prev, index;\n    // change existing entry\n    if(entry){\n      entry.v = value;\n    // create new entry\n    } else {\n      that._l = entry = {\n        i: index = fastKey(key, true), // <- index\n        k: key,                        // <- key\n        v: value,                      // <- value\n        p: prev = that._l,             // <- previous entry\n        n: undefined,                  // <- next entry\n        r: false                       // <- removed\n      };\n      if(!that._f)that._f = entry;\n      if(prev)prev.n = entry;\n      that[SIZE]++;\n      // add to index\n      if(index !== 'F')that._i[index] = entry;\n    } return that;\n  },\n  getEntry: getEntry,\n  setStrong: function(C, NAME, IS_MAP){\n    // add .keys, .values, .entries, [@@iterator]\n    // 23.1.3.4, 23.1.3.8, 23.1.3.11, 23.1.3.12, 23.2.3.5, 23.2.3.8, 23.2.3.10, 23.2.3.11\n    $iterDefine(C, NAME, function(iterated, kind){\n      this._t = iterated;  // target\n      this._k = kind;      // kind\n      this._l = undefined; // previous\n    }, function(){\n      var that  = this\n        , kind  = that._k\n        , entry = that._l;\n      // revert to the last existing entry\n      while(entry && entry.r)entry = entry.p;\n      // get next entry\n      if(!that._t || !(that._l = entry = entry ? entry.n : that._t._f)){\n        // or finish the iteration\n        that._t = undefined;\n        return step(1);\n      }\n      // return step by kind\n      if(kind == 'keys'  )return step(0, entry.k);\n      if(kind == 'values')return step(0, entry.v);\n      return step(0, [entry.k, entry.v]);\n    }, IS_MAP ? 'entries' : 'values' , !IS_MAP, true);\n\n    // add [@@species], 23.1.2.2, 23.2.2.2\n    setSpecies(NAME);\n  }\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzU3LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvJC5jb2xsZWN0aW9uLXN0cm9uZy5qcz8xNjZhIl0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcbnZhciAkICAgICAgICAgICAgPSByZXF1aXJlKCcuLyQnKVxuICAsIGhpZGUgICAgICAgICA9IHJlcXVpcmUoJy4vJC5oaWRlJylcbiAgLCByZWRlZmluZUFsbCAgPSByZXF1aXJlKCcuLyQucmVkZWZpbmUtYWxsJylcbiAgLCBjdHggICAgICAgICAgPSByZXF1aXJlKCcuLyQuY3R4JylcbiAgLCBzdHJpY3ROZXcgICAgPSByZXF1aXJlKCcuLyQuc3RyaWN0LW5ldycpXG4gICwgZGVmaW5lZCAgICAgID0gcmVxdWlyZSgnLi8kLmRlZmluZWQnKVxuICAsIGZvck9mICAgICAgICA9IHJlcXVpcmUoJy4vJC5mb3Itb2YnKVxuICAsICRpdGVyRGVmaW5lICA9IHJlcXVpcmUoJy4vJC5pdGVyLWRlZmluZScpXG4gICwgc3RlcCAgICAgICAgID0gcmVxdWlyZSgnLi8kLml0ZXItc3RlcCcpXG4gICwgSUQgICAgICAgICAgID0gcmVxdWlyZSgnLi8kLnVpZCcpKCdpZCcpXG4gICwgJGhhcyAgICAgICAgID0gcmVxdWlyZSgnLi8kLmhhcycpXG4gICwgaXNPYmplY3QgICAgID0gcmVxdWlyZSgnLi8kLmlzLW9iamVjdCcpXG4gICwgc2V0U3BlY2llcyAgID0gcmVxdWlyZSgnLi8kLnNldC1zcGVjaWVzJylcbiAgLCBERVNDUklQVE9SUyAgPSByZXF1aXJlKCcuLyQuZGVzY3JpcHRvcnMnKVxuICAsIGlzRXh0ZW5zaWJsZSA9IE9iamVjdC5pc0V4dGVuc2libGUgfHwgaXNPYmplY3RcbiAgLCBTSVpFICAgICAgICAgPSBERVNDUklQVE9SUyA/ICdfcycgOiAnc2l6ZSdcbiAgLCBpZCAgICAgICAgICAgPSAwO1xuXG52YXIgZmFzdEtleSA9IGZ1bmN0aW9uKGl0LCBjcmVhdGUpe1xuICAvLyByZXR1cm4gcHJpbWl0aXZlIHdpdGggcHJlZml4XG4gIGlmKCFpc09iamVjdChpdCkpcmV0dXJuIHR5cGVvZiBpdCA9PSAnc3ltYm9sJyA/IGl0IDogKHR5cGVvZiBpdCA9PSAnc3RyaW5nJyA/ICdTJyA6ICdQJykgKyBpdDtcbiAgaWYoISRoYXMoaXQsIElEKSl7XG4gICAgLy8gY2FuJ3Qgc2V0IGlkIHRvIGZyb3plbiBvYmplY3RcbiAgICBpZighaXNFeHRlbnNpYmxlKGl0KSlyZXR1cm4gJ0YnO1xuICAgIC8vIG5vdCBuZWNlc3NhcnkgdG8gYWRkIGlkXG4gICAgaWYoIWNyZWF0ZSlyZXR1cm4gJ0UnO1xuICAgIC8vIGFkZCBtaXNzaW5nIG9iamVjdCBpZFxuICAgIGhpZGUoaXQsIElELCArK2lkKTtcbiAgLy8gcmV0dXJuIG9iamVjdCBpZCB3aXRoIHByZWZpeFxuICB9IHJldHVybiAnTycgKyBpdFtJRF07XG59O1xuXG52YXIgZ2V0RW50cnkgPSBmdW5jdGlvbih0aGF0LCBrZXkpe1xuICAvLyBmYXN0IGNhc2VcbiAgdmFyIGluZGV4ID0gZmFzdEtleShrZXkpLCBlbnRyeTtcbiAgaWYoaW5kZXggIT09ICdGJylyZXR1cm4gdGhhdC5faVtpbmRleF07XG4gIC8vIGZyb3plbiBvYmplY3QgY2FzZVxuICBmb3IoZW50cnkgPSB0aGF0Ll9mOyBlbnRyeTsgZW50cnkgPSBlbnRyeS5uKXtcbiAgICBpZihlbnRyeS5rID09IGtleSlyZXR1cm4gZW50cnk7XG4gIH1cbn07XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBnZXRDb25zdHJ1Y3RvcjogZnVuY3Rpb24od3JhcHBlciwgTkFNRSwgSVNfTUFQLCBBRERFUil7XG4gICAgdmFyIEMgPSB3cmFwcGVyKGZ1bmN0aW9uKHRoYXQsIGl0ZXJhYmxlKXtcbiAgICAgIHN0cmljdE5ldyh0aGF0LCBDLCBOQU1FKTtcbiAgICAgIHRoYXQuX2kgPSAkLmNyZWF0ZShudWxsKTsgLy8gaW5kZXhcbiAgICAgIHRoYXQuX2YgPSB1bmRlZmluZWQ7ICAgICAgLy8gZmlyc3QgZW50cnlcbiAgICAgIHRoYXQuX2wgPSB1bmRlZmluZWQ7ICAgICAgLy8gbGFzdCBlbnRyeVxuICAgICAgdGhhdFtTSVpFXSA9IDA7ICAgICAgICAgICAvLyBzaXplXG4gICAgICBpZihpdGVyYWJsZSAhPSB1bmRlZmluZWQpZm9yT2YoaXRlcmFibGUsIElTX01BUCwgdGhhdFtBRERFUl0sIHRoYXQpO1xuICAgIH0pO1xuICAgIHJlZGVmaW5lQWxsKEMucHJvdG90eXBlLCB7XG4gICAgICAvLyAyMy4xLjMuMSBNYXAucHJvdG90eXBlLmNsZWFyKClcbiAgICAgIC8vIDIzLjIuMy4yIFNldC5wcm90b3R5cGUuY2xlYXIoKVxuICAgICAgY2xlYXI6IGZ1bmN0aW9uIGNsZWFyKCl7XG4gICAgICAgIGZvcih2YXIgdGhhdCA9IHRoaXMsIGRhdGEgPSB0aGF0Ll9pLCBlbnRyeSA9IHRoYXQuX2Y7IGVudHJ5OyBlbnRyeSA9IGVudHJ5Lm4pe1xuICAgICAgICAgIGVudHJ5LnIgPSB0cnVlO1xuICAgICAgICAgIGlmKGVudHJ5LnApZW50cnkucCA9IGVudHJ5LnAubiA9IHVuZGVmaW5lZDtcbiAgICAgICAgICBkZWxldGUgZGF0YVtlbnRyeS5pXTtcbiAgICAgICAgfVxuICAgICAgICB0aGF0Ll9mID0gdGhhdC5fbCA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhhdFtTSVpFXSA9IDA7XG4gICAgICB9LFxuICAgICAgLy8gMjMuMS4zLjMgTWFwLnByb3RvdHlwZS5kZWxldGUoa2V5KVxuICAgICAgLy8gMjMuMi4zLjQgU2V0LnByb3RvdHlwZS5kZWxldGUodmFsdWUpXG4gICAgICAnZGVsZXRlJzogZnVuY3Rpb24oa2V5KXtcbiAgICAgICAgdmFyIHRoYXQgID0gdGhpc1xuICAgICAgICAgICwgZW50cnkgPSBnZXRFbnRyeSh0aGF0LCBrZXkpO1xuICAgICAgICBpZihlbnRyeSl7XG4gICAgICAgICAgdmFyIG5leHQgPSBlbnRyeS5uXG4gICAgICAgICAgICAsIHByZXYgPSBlbnRyeS5wO1xuICAgICAgICAgIGRlbGV0ZSB0aGF0Ll9pW2VudHJ5LmldO1xuICAgICAgICAgIGVudHJ5LnIgPSB0cnVlO1xuICAgICAgICAgIGlmKHByZXYpcHJldi5uID0gbmV4dDtcbiAgICAgICAgICBpZihuZXh0KW5leHQucCA9IHByZXY7XG4gICAgICAgICAgaWYodGhhdC5fZiA9PSBlbnRyeSl0aGF0Ll9mID0gbmV4dDtcbiAgICAgICAgICBpZih0aGF0Ll9sID09IGVudHJ5KXRoYXQuX2wgPSBwcmV2O1xuICAgICAgICAgIHRoYXRbU0laRV0tLTtcbiAgICAgICAgfSByZXR1cm4gISFlbnRyeTtcbiAgICAgIH0sXG4gICAgICAvLyAyMy4yLjMuNiBTZXQucHJvdG90eXBlLmZvckVhY2goY2FsbGJhY2tmbiwgdGhpc0FyZyA9IHVuZGVmaW5lZClcbiAgICAgIC8vIDIzLjEuMy41IE1hcC5wcm90b3R5cGUuZm9yRWFjaChjYWxsYmFja2ZuLCB0aGlzQXJnID0gdW5kZWZpbmVkKVxuICAgICAgZm9yRWFjaDogZnVuY3Rpb24gZm9yRWFjaChjYWxsYmFja2ZuIC8qLCB0aGF0ID0gdW5kZWZpbmVkICovKXtcbiAgICAgICAgdmFyIGYgPSBjdHgoY2FsbGJhY2tmbiwgYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQsIDMpXG4gICAgICAgICAgLCBlbnRyeTtcbiAgICAgICAgd2hpbGUoZW50cnkgPSBlbnRyeSA/IGVudHJ5Lm4gOiB0aGlzLl9mKXtcbiAgICAgICAgICBmKGVudHJ5LnYsIGVudHJ5LmssIHRoaXMpO1xuICAgICAgICAgIC8vIHJldmVydCB0byB0aGUgbGFzdCBleGlzdGluZyBlbnRyeVxuICAgICAgICAgIHdoaWxlKGVudHJ5ICYmIGVudHJ5LnIpZW50cnkgPSBlbnRyeS5wO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgLy8gMjMuMS4zLjcgTWFwLnByb3RvdHlwZS5oYXMoa2V5KVxuICAgICAgLy8gMjMuMi4zLjcgU2V0LnByb3RvdHlwZS5oYXModmFsdWUpXG4gICAgICBoYXM6IGZ1bmN0aW9uIGhhcyhrZXkpe1xuICAgICAgICByZXR1cm4gISFnZXRFbnRyeSh0aGlzLCBrZXkpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIGlmKERFU0NSSVBUT1JTKSQuc2V0RGVzYyhDLnByb3RvdHlwZSwgJ3NpemUnLCB7XG4gICAgICBnZXQ6IGZ1bmN0aW9uKCl7XG4gICAgICAgIHJldHVybiBkZWZpbmVkKHRoaXNbU0laRV0pO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBDO1xuICB9LFxuICBkZWY6IGZ1bmN0aW9uKHRoYXQsIGtleSwgdmFsdWUpe1xuICAgIHZhciBlbnRyeSA9IGdldEVudHJ5KHRoYXQsIGtleSlcbiAgICAgICwgcHJldiwgaW5kZXg7XG4gICAgLy8gY2hhbmdlIGV4aXN0aW5nIGVudHJ5XG4gICAgaWYoZW50cnkpe1xuICAgICAgZW50cnkudiA9IHZhbHVlO1xuICAgIC8vIGNyZWF0ZSBuZXcgZW50cnlcbiAgICB9IGVsc2Uge1xuICAgICAgdGhhdC5fbCA9IGVudHJ5ID0ge1xuICAgICAgICBpOiBpbmRleCA9IGZhc3RLZXkoa2V5LCB0cnVlKSwgLy8gPC0gaW5kZXhcbiAgICAgICAgazoga2V5LCAgICAgICAgICAgICAgICAgICAgICAgIC8vIDwtIGtleVxuICAgICAgICB2OiB2YWx1ZSwgICAgICAgICAgICAgICAgICAgICAgLy8gPC0gdmFsdWVcbiAgICAgICAgcDogcHJldiA9IHRoYXQuX2wsICAgICAgICAgICAgIC8vIDwtIHByZXZpb3VzIGVudHJ5XG4gICAgICAgIG46IHVuZGVmaW5lZCwgICAgICAgICAgICAgICAgICAvLyA8LSBuZXh0IGVudHJ5XG4gICAgICAgIHI6IGZhbHNlICAgICAgICAgICAgICAgICAgICAgICAvLyA8LSByZW1vdmVkXG4gICAgICB9O1xuICAgICAgaWYoIXRoYXQuX2YpdGhhdC5fZiA9IGVudHJ5O1xuICAgICAgaWYocHJldilwcmV2Lm4gPSBlbnRyeTtcbiAgICAgIHRoYXRbU0laRV0rKztcbiAgICAgIC8vIGFkZCB0byBpbmRleFxuICAgICAgaWYoaW5kZXggIT09ICdGJyl0aGF0Ll9pW2luZGV4XSA9IGVudHJ5O1xuICAgIH0gcmV0dXJuIHRoYXQ7XG4gIH0sXG4gIGdldEVudHJ5OiBnZXRFbnRyeSxcbiAgc2V0U3Ryb25nOiBmdW5jdGlvbihDLCBOQU1FLCBJU19NQVApe1xuICAgIC8vIGFkZCAua2V5cywgLnZhbHVlcywgLmVudHJpZXMsIFtAQGl0ZXJhdG9yXVxuICAgIC8vIDIzLjEuMy40LCAyMy4xLjMuOCwgMjMuMS4zLjExLCAyMy4xLjMuMTIsIDIzLjIuMy41LCAyMy4yLjMuOCwgMjMuMi4zLjEwLCAyMy4yLjMuMTFcbiAgICAkaXRlckRlZmluZShDLCBOQU1FLCBmdW5jdGlvbihpdGVyYXRlZCwga2luZCl7XG4gICAgICB0aGlzLl90ID0gaXRlcmF0ZWQ7ICAvLyB0YXJnZXRcbiAgICAgIHRoaXMuX2sgPSBraW5kOyAgICAgIC8vIGtpbmRcbiAgICAgIHRoaXMuX2wgPSB1bmRlZmluZWQ7IC8vIHByZXZpb3VzXG4gICAgfSwgZnVuY3Rpb24oKXtcbiAgICAgIHZhciB0aGF0ICA9IHRoaXNcbiAgICAgICAgLCBraW5kICA9IHRoYXQuX2tcbiAgICAgICAgLCBlbnRyeSA9IHRoYXQuX2w7XG4gICAgICAvLyByZXZlcnQgdG8gdGhlIGxhc3QgZXhpc3RpbmcgZW50cnlcbiAgICAgIHdoaWxlKGVudHJ5ICYmIGVudHJ5LnIpZW50cnkgPSBlbnRyeS5wO1xuICAgICAgLy8gZ2V0IG5leHQgZW50cnlcbiAgICAgIGlmKCF0aGF0Ll90IHx8ICEodGhhdC5fbCA9IGVudHJ5ID0gZW50cnkgPyBlbnRyeS5uIDogdGhhdC5fdC5fZikpe1xuICAgICAgICAvLyBvciBmaW5pc2ggdGhlIGl0ZXJhdGlvblxuICAgICAgICB0aGF0Ll90ID0gdW5kZWZpbmVkO1xuICAgICAgICByZXR1cm4gc3RlcCgxKTtcbiAgICAgIH1cbiAgICAgIC8vIHJldHVybiBzdGVwIGJ5IGtpbmRcbiAgICAgIGlmKGtpbmQgPT0gJ2tleXMnICApcmV0dXJuIHN0ZXAoMCwgZW50cnkuayk7XG4gICAgICBpZihraW5kID09ICd2YWx1ZXMnKXJldHVybiBzdGVwKDAsIGVudHJ5LnYpO1xuICAgICAgcmV0dXJuIHN0ZXAoMCwgW2VudHJ5LmssIGVudHJ5LnZdKTtcbiAgICB9LCBJU19NQVAgPyAnZW50cmllcycgOiAndmFsdWVzJyAsICFJU19NQVAsIHRydWUpO1xuXG4gICAgLy8gYWRkIFtAQHNwZWNpZXNdLCAyMy4xLjIuMiwgMjMuMi4yLjJcbiAgICBzZXRTcGVjaWVzKE5BTUUpO1xuICB9XG59O1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2NvcmUtanMvbW9kdWxlcy8kLmNvbGxlY3Rpb24tc3Ryb25nLmpzXG4gKiogbW9kdWxlIGlkID0gMzU3XG4gKiogbW9kdWxlIGNodW5rcyA9IDI0XG4gKiovIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=");

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

	eval("'use strict';\nvar global         = __webpack_require__(217)\n  , $export        = __webpack_require__(216)\n  , redefine       = __webpack_require__(223)\n  , redefineAll    = __webpack_require__(355)\n  , forOf          = __webpack_require__(351)\n  , strictNew      = __webpack_require__(350)\n  , isObject       = __webpack_require__(229)\n  , fails          = __webpack_require__(222)\n  , $iterDetect    = __webpack_require__(328)\n  , setToStringTag = __webpack_require__(248);\n\nmodule.exports = function(NAME, wrapper, methods, common, IS_MAP, IS_WEAK){\n  var Base  = global[NAME]\n    , C     = Base\n    , ADDER = IS_MAP ? 'set' : 'add'\n    , proto = C && C.prototype\n    , O     = {};\n  var fixMethod = function(KEY){\n    var fn = proto[KEY];\n    redefine(proto, KEY,\n      KEY == 'delete' ? function(a){\n        return IS_WEAK && !isObject(a) ? false : fn.call(this, a === 0 ? 0 : a);\n      } : KEY == 'has' ? function has(a){\n        return IS_WEAK && !isObject(a) ? false : fn.call(this, a === 0 ? 0 : a);\n      } : KEY == 'get' ? function get(a){\n        return IS_WEAK && !isObject(a) ? undefined : fn.call(this, a === 0 ? 0 : a);\n      } : KEY == 'add' ? function add(a){ fn.call(this, a === 0 ? 0 : a); return this; }\n        : function set(a, b){ fn.call(this, a === 0 ? 0 : a, b); return this; }\n    );\n  };\n  if(typeof C != 'function' || !(IS_WEAK || proto.forEach && !fails(function(){\n    new C().entries().next();\n  }))){\n    // create collection constructor\n    C = common.getConstructor(wrapper, NAME, IS_MAP, ADDER);\n    redefineAll(C.prototype, methods);\n  } else {\n    var instance             = new C\n      // early implementations not supports chaining\n      , HASNT_CHAINING       = instance[ADDER](IS_WEAK ? {} : -0, 1) != instance\n      // V8 ~  Chromium 40- weak-collections throws on primitives, but should return false\n      , THROWS_ON_PRIMITIVES = fails(function(){ instance.has(1); })\n      // most early implementations doesn't supports iterables, most modern - not close it correctly\n      , ACCEPT_ITERABLES     = $iterDetect(function(iter){ new C(iter); }) // eslint-disable-line no-new\n      // for early implementations -0 and +0 not the same\n      , BUGGY_ZERO;\n    if(!ACCEPT_ITERABLES){ \n      C = wrapper(function(target, iterable){\n        strictNew(target, C, NAME);\n        var that = new Base;\n        if(iterable != undefined)forOf(iterable, IS_MAP, that[ADDER], that);\n        return that;\n      });\n      C.prototype = proto;\n      proto.constructor = C;\n    }\n    IS_WEAK || instance.forEach(function(val, key){\n      BUGGY_ZERO = 1 / key === -Infinity;\n    });\n    if(THROWS_ON_PRIMITIVES || BUGGY_ZERO){\n      fixMethod('delete');\n      fixMethod('has');\n      IS_MAP && fixMethod('get');\n    }\n    if(BUGGY_ZERO || HASNT_CHAINING)fixMethod(ADDER);\n    // weak collections should not contains .clear method\n    if(IS_WEAK && proto.clear)delete proto.clear;\n  }\n\n  setToStringTag(C, NAME);\n\n  O[NAME] = C;\n  $export($export.G + $export.W + $export.F * (C != Base), O);\n\n  if(!IS_WEAK)common.setStrong(C, NAME, IS_MAP);\n\n  return C;\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzU4LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvJC5jb2xsZWN0aW9uLmpzPzY3YTEiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xudmFyIGdsb2JhbCAgICAgICAgID0gcmVxdWlyZSgnLi8kLmdsb2JhbCcpXG4gICwgJGV4cG9ydCAgICAgICAgPSByZXF1aXJlKCcuLyQuZXhwb3J0JylcbiAgLCByZWRlZmluZSAgICAgICA9IHJlcXVpcmUoJy4vJC5yZWRlZmluZScpXG4gICwgcmVkZWZpbmVBbGwgICAgPSByZXF1aXJlKCcuLyQucmVkZWZpbmUtYWxsJylcbiAgLCBmb3JPZiAgICAgICAgICA9IHJlcXVpcmUoJy4vJC5mb3Itb2YnKVxuICAsIHN0cmljdE5ldyAgICAgID0gcmVxdWlyZSgnLi8kLnN0cmljdC1uZXcnKVxuICAsIGlzT2JqZWN0ICAgICAgID0gcmVxdWlyZSgnLi8kLmlzLW9iamVjdCcpXG4gICwgZmFpbHMgICAgICAgICAgPSByZXF1aXJlKCcuLyQuZmFpbHMnKVxuICAsICRpdGVyRGV0ZWN0ICAgID0gcmVxdWlyZSgnLi8kLml0ZXItZGV0ZWN0JylcbiAgLCBzZXRUb1N0cmluZ1RhZyA9IHJlcXVpcmUoJy4vJC5zZXQtdG8tc3RyaW5nLXRhZycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKE5BTUUsIHdyYXBwZXIsIG1ldGhvZHMsIGNvbW1vbiwgSVNfTUFQLCBJU19XRUFLKXtcbiAgdmFyIEJhc2UgID0gZ2xvYmFsW05BTUVdXG4gICAgLCBDICAgICA9IEJhc2VcbiAgICAsIEFEREVSID0gSVNfTUFQID8gJ3NldCcgOiAnYWRkJ1xuICAgICwgcHJvdG8gPSBDICYmIEMucHJvdG90eXBlXG4gICAgLCBPICAgICA9IHt9O1xuICB2YXIgZml4TWV0aG9kID0gZnVuY3Rpb24oS0VZKXtcbiAgICB2YXIgZm4gPSBwcm90b1tLRVldO1xuICAgIHJlZGVmaW5lKHByb3RvLCBLRVksXG4gICAgICBLRVkgPT0gJ2RlbGV0ZScgPyBmdW5jdGlvbihhKXtcbiAgICAgICAgcmV0dXJuIElTX1dFQUsgJiYgIWlzT2JqZWN0KGEpID8gZmFsc2UgOiBmbi5jYWxsKHRoaXMsIGEgPT09IDAgPyAwIDogYSk7XG4gICAgICB9IDogS0VZID09ICdoYXMnID8gZnVuY3Rpb24gaGFzKGEpe1xuICAgICAgICByZXR1cm4gSVNfV0VBSyAmJiAhaXNPYmplY3QoYSkgPyBmYWxzZSA6IGZuLmNhbGwodGhpcywgYSA9PT0gMCA/IDAgOiBhKTtcbiAgICAgIH0gOiBLRVkgPT0gJ2dldCcgPyBmdW5jdGlvbiBnZXQoYSl7XG4gICAgICAgIHJldHVybiBJU19XRUFLICYmICFpc09iamVjdChhKSA/IHVuZGVmaW5lZCA6IGZuLmNhbGwodGhpcywgYSA9PT0gMCA/IDAgOiBhKTtcbiAgICAgIH0gOiBLRVkgPT0gJ2FkZCcgPyBmdW5jdGlvbiBhZGQoYSl7IGZuLmNhbGwodGhpcywgYSA9PT0gMCA/IDAgOiBhKTsgcmV0dXJuIHRoaXM7IH1cbiAgICAgICAgOiBmdW5jdGlvbiBzZXQoYSwgYil7IGZuLmNhbGwodGhpcywgYSA9PT0gMCA/IDAgOiBhLCBiKTsgcmV0dXJuIHRoaXM7IH1cbiAgICApO1xuICB9O1xuICBpZih0eXBlb2YgQyAhPSAnZnVuY3Rpb24nIHx8ICEoSVNfV0VBSyB8fCBwcm90by5mb3JFYWNoICYmICFmYWlscyhmdW5jdGlvbigpe1xuICAgIG5ldyBDKCkuZW50cmllcygpLm5leHQoKTtcbiAgfSkpKXtcbiAgICAvLyBjcmVhdGUgY29sbGVjdGlvbiBjb25zdHJ1Y3RvclxuICAgIEMgPSBjb21tb24uZ2V0Q29uc3RydWN0b3Iod3JhcHBlciwgTkFNRSwgSVNfTUFQLCBBRERFUik7XG4gICAgcmVkZWZpbmVBbGwoQy5wcm90b3R5cGUsIG1ldGhvZHMpO1xuICB9IGVsc2Uge1xuICAgIHZhciBpbnN0YW5jZSAgICAgICAgICAgICA9IG5ldyBDXG4gICAgICAvLyBlYXJseSBpbXBsZW1lbnRhdGlvbnMgbm90IHN1cHBvcnRzIGNoYWluaW5nXG4gICAgICAsIEhBU05UX0NIQUlOSU5HICAgICAgID0gaW5zdGFuY2VbQURERVJdKElTX1dFQUsgPyB7fSA6IC0wLCAxKSAhPSBpbnN0YW5jZVxuICAgICAgLy8gVjggfiAgQ2hyb21pdW0gNDAtIHdlYWstY29sbGVjdGlvbnMgdGhyb3dzIG9uIHByaW1pdGl2ZXMsIGJ1dCBzaG91bGQgcmV0dXJuIGZhbHNlXG4gICAgICAsIFRIUk9XU19PTl9QUklNSVRJVkVTID0gZmFpbHMoZnVuY3Rpb24oKXsgaW5zdGFuY2UuaGFzKDEpOyB9KVxuICAgICAgLy8gbW9zdCBlYXJseSBpbXBsZW1lbnRhdGlvbnMgZG9lc24ndCBzdXBwb3J0cyBpdGVyYWJsZXMsIG1vc3QgbW9kZXJuIC0gbm90IGNsb3NlIGl0IGNvcnJlY3RseVxuICAgICAgLCBBQ0NFUFRfSVRFUkFCTEVTICAgICA9ICRpdGVyRGV0ZWN0KGZ1bmN0aW9uKGl0ZXIpeyBuZXcgQyhpdGVyKTsgfSkgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1uZXdcbiAgICAgIC8vIGZvciBlYXJseSBpbXBsZW1lbnRhdGlvbnMgLTAgYW5kICswIG5vdCB0aGUgc2FtZVxuICAgICAgLCBCVUdHWV9aRVJPO1xuICAgIGlmKCFBQ0NFUFRfSVRFUkFCTEVTKXsgXG4gICAgICBDID0gd3JhcHBlcihmdW5jdGlvbih0YXJnZXQsIGl0ZXJhYmxlKXtcbiAgICAgICAgc3RyaWN0TmV3KHRhcmdldCwgQywgTkFNRSk7XG4gICAgICAgIHZhciB0aGF0ID0gbmV3IEJhc2U7XG4gICAgICAgIGlmKGl0ZXJhYmxlICE9IHVuZGVmaW5lZClmb3JPZihpdGVyYWJsZSwgSVNfTUFQLCB0aGF0W0FEREVSXSwgdGhhdCk7XG4gICAgICAgIHJldHVybiB0aGF0O1xuICAgICAgfSk7XG4gICAgICBDLnByb3RvdHlwZSA9IHByb3RvO1xuICAgICAgcHJvdG8uY29uc3RydWN0b3IgPSBDO1xuICAgIH1cbiAgICBJU19XRUFLIHx8IGluc3RhbmNlLmZvckVhY2goZnVuY3Rpb24odmFsLCBrZXkpe1xuICAgICAgQlVHR1lfWkVSTyA9IDEgLyBrZXkgPT09IC1JbmZpbml0eTtcbiAgICB9KTtcbiAgICBpZihUSFJPV1NfT05fUFJJTUlUSVZFUyB8fCBCVUdHWV9aRVJPKXtcbiAgICAgIGZpeE1ldGhvZCgnZGVsZXRlJyk7XG4gICAgICBmaXhNZXRob2QoJ2hhcycpO1xuICAgICAgSVNfTUFQICYmIGZpeE1ldGhvZCgnZ2V0Jyk7XG4gICAgfVxuICAgIGlmKEJVR0dZX1pFUk8gfHwgSEFTTlRfQ0hBSU5JTkcpZml4TWV0aG9kKEFEREVSKTtcbiAgICAvLyB3ZWFrIGNvbGxlY3Rpb25zIHNob3VsZCBub3QgY29udGFpbnMgLmNsZWFyIG1ldGhvZFxuICAgIGlmKElTX1dFQUsgJiYgcHJvdG8uY2xlYXIpZGVsZXRlIHByb3RvLmNsZWFyO1xuICB9XG5cbiAgc2V0VG9TdHJpbmdUYWcoQywgTkFNRSk7XG5cbiAgT1tOQU1FXSA9IEM7XG4gICRleHBvcnQoJGV4cG9ydC5HICsgJGV4cG9ydC5XICsgJGV4cG9ydC5GICogKEMgIT0gQmFzZSksIE8pO1xuXG4gIGlmKCFJU19XRUFLKWNvbW1vbi5zZXRTdHJvbmcoQywgTkFNRSwgSVNfTUFQKTtcblxuICByZXR1cm4gQztcbn07XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vY29yZS1qcy9tb2R1bGVzLyQuY29sbGVjdGlvbi5qc1xuICoqIG1vZHVsZSBpZCA9IDM1OFxuICoqIG1vZHVsZSBjaHVua3MgPSAyNFxuICoqLyJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=");

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

	eval("'use strict';\nvar strong = __webpack_require__(357);\n\n// 23.2 Set Objects\n__webpack_require__(358)('Set', function(get){\n  return function Set(){ return get(this, arguments.length > 0 ? arguments[0] : undefined); };\n}, {\n  // 23.2.3.1 Set.prototype.add(value)\n  add: function add(value){\n    return strong.def(this, value = value === 0 ? 0 : value, value);\n  }\n}, strong);\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzU5LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvZXM2LnNldC5qcz85OGI1Il0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcbnZhciBzdHJvbmcgPSByZXF1aXJlKCcuLyQuY29sbGVjdGlvbi1zdHJvbmcnKTtcblxuLy8gMjMuMiBTZXQgT2JqZWN0c1xucmVxdWlyZSgnLi8kLmNvbGxlY3Rpb24nKSgnU2V0JywgZnVuY3Rpb24oZ2V0KXtcbiAgcmV0dXJuIGZ1bmN0aW9uIFNldCgpeyByZXR1cm4gZ2V0KHRoaXMsIGFyZ3VtZW50cy5sZW5ndGggPiAwID8gYXJndW1lbnRzWzBdIDogdW5kZWZpbmVkKTsgfTtcbn0sIHtcbiAgLy8gMjMuMi4zLjEgU2V0LnByb3RvdHlwZS5hZGQodmFsdWUpXG4gIGFkZDogZnVuY3Rpb24gYWRkKHZhbHVlKXtcbiAgICByZXR1cm4gc3Ryb25nLmRlZih0aGlzLCB2YWx1ZSA9IHZhbHVlID09PSAwID8gMCA6IHZhbHVlLCB2YWx1ZSk7XG4gIH1cbn0sIHN0cm9uZyk7XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vY29yZS1qcy9tb2R1bGVzL2VzNi5zZXQuanNcbiAqKiBtb2R1bGUgaWQgPSAzNTlcbiAqKiBtb2R1bGUgY2h1bmtzID0gMjRcbiAqKi8iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");

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

	eval("'use strict';\nvar $            = __webpack_require__(215)\n  , redefine     = __webpack_require__(223)\n  , weak         = __webpack_require__(361)\n  , isObject     = __webpack_require__(229)\n  , has          = __webpack_require__(230)\n  , frozenStore  = weak.frozenStore\n  , WEAK         = weak.WEAK\n  , isExtensible = Object.isExtensible || isObject\n  , tmp          = {};\n\n// 23.3 WeakMap Objects\nvar $WeakMap = __webpack_require__(358)('WeakMap', function(get){\n  return function WeakMap(){ return get(this, arguments.length > 0 ? arguments[0] : undefined); };\n}, {\n  // 23.3.3.3 WeakMap.prototype.get(key)\n  get: function get(key){\n    if(isObject(key)){\n      if(!isExtensible(key))return frozenStore(this).get(key);\n      if(has(key, WEAK))return key[WEAK][this._i];\n    }\n  },\n  // 23.3.3.5 WeakMap.prototype.set(key, value)\n  set: function set(key, value){\n    return weak.def(this, key, value);\n  }\n}, weak, true, true);\n\n// IE11 WeakMap frozen keys fix\nif(new $WeakMap().set((Object.freeze || Object)(tmp), 7).get(tmp) != 7){\n  $.each.call(['delete', 'has', 'get', 'set'], function(key){\n    var proto  = $WeakMap.prototype\n      , method = proto[key];\n    redefine(proto, key, function(a, b){\n      // store frozen objects on leaky map\n      if(isObject(a) && !isExtensible(a)){\n        var result = frozenStore(this)[key](a, b);\n        return key == 'set' ? this : result;\n      // store all the rest on native weakmap\n      } return method.call(this, a, b);\n    });\n  });\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzYwLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvZXM2LndlYWstbWFwLmpzPzI3NTYiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xudmFyICQgICAgICAgICAgICA9IHJlcXVpcmUoJy4vJCcpXG4gICwgcmVkZWZpbmUgICAgID0gcmVxdWlyZSgnLi8kLnJlZGVmaW5lJylcbiAgLCB3ZWFrICAgICAgICAgPSByZXF1aXJlKCcuLyQuY29sbGVjdGlvbi13ZWFrJylcbiAgLCBpc09iamVjdCAgICAgPSByZXF1aXJlKCcuLyQuaXMtb2JqZWN0JylcbiAgLCBoYXMgICAgICAgICAgPSByZXF1aXJlKCcuLyQuaGFzJylcbiAgLCBmcm96ZW5TdG9yZSAgPSB3ZWFrLmZyb3plblN0b3JlXG4gICwgV0VBSyAgICAgICAgID0gd2Vhay5XRUFLXG4gICwgaXNFeHRlbnNpYmxlID0gT2JqZWN0LmlzRXh0ZW5zaWJsZSB8fCBpc09iamVjdFxuICAsIHRtcCAgICAgICAgICA9IHt9O1xuXG4vLyAyMy4zIFdlYWtNYXAgT2JqZWN0c1xudmFyICRXZWFrTWFwID0gcmVxdWlyZSgnLi8kLmNvbGxlY3Rpb24nKSgnV2Vha01hcCcsIGZ1bmN0aW9uKGdldCl7XG4gIHJldHVybiBmdW5jdGlvbiBXZWFrTWFwKCl7IHJldHVybiBnZXQodGhpcywgYXJndW1lbnRzLmxlbmd0aCA+IDAgPyBhcmd1bWVudHNbMF0gOiB1bmRlZmluZWQpOyB9O1xufSwge1xuICAvLyAyMy4zLjMuMyBXZWFrTWFwLnByb3RvdHlwZS5nZXQoa2V5KVxuICBnZXQ6IGZ1bmN0aW9uIGdldChrZXkpe1xuICAgIGlmKGlzT2JqZWN0KGtleSkpe1xuICAgICAgaWYoIWlzRXh0ZW5zaWJsZShrZXkpKXJldHVybiBmcm96ZW5TdG9yZSh0aGlzKS5nZXQoa2V5KTtcbiAgICAgIGlmKGhhcyhrZXksIFdFQUspKXJldHVybiBrZXlbV0VBS11bdGhpcy5faV07XG4gICAgfVxuICB9LFxuICAvLyAyMy4zLjMuNSBXZWFrTWFwLnByb3RvdHlwZS5zZXQoa2V5LCB2YWx1ZSlcbiAgc2V0OiBmdW5jdGlvbiBzZXQoa2V5LCB2YWx1ZSl7XG4gICAgcmV0dXJuIHdlYWsuZGVmKHRoaXMsIGtleSwgdmFsdWUpO1xuICB9XG59LCB3ZWFrLCB0cnVlLCB0cnVlKTtcblxuLy8gSUUxMSBXZWFrTWFwIGZyb3plbiBrZXlzIGZpeFxuaWYobmV3ICRXZWFrTWFwKCkuc2V0KChPYmplY3QuZnJlZXplIHx8IE9iamVjdCkodG1wKSwgNykuZ2V0KHRtcCkgIT0gNyl7XG4gICQuZWFjaC5jYWxsKFsnZGVsZXRlJywgJ2hhcycsICdnZXQnLCAnc2V0J10sIGZ1bmN0aW9uKGtleSl7XG4gICAgdmFyIHByb3RvICA9ICRXZWFrTWFwLnByb3RvdHlwZVxuICAgICAgLCBtZXRob2QgPSBwcm90b1trZXldO1xuICAgIHJlZGVmaW5lKHByb3RvLCBrZXksIGZ1bmN0aW9uKGEsIGIpe1xuICAgICAgLy8gc3RvcmUgZnJvemVuIG9iamVjdHMgb24gbGVha3kgbWFwXG4gICAgICBpZihpc09iamVjdChhKSAmJiAhaXNFeHRlbnNpYmxlKGEpKXtcbiAgICAgICAgdmFyIHJlc3VsdCA9IGZyb3plblN0b3JlKHRoaXMpW2tleV0oYSwgYik7XG4gICAgICAgIHJldHVybiBrZXkgPT0gJ3NldCcgPyB0aGlzIDogcmVzdWx0O1xuICAgICAgLy8gc3RvcmUgYWxsIHRoZSByZXN0IG9uIG5hdGl2ZSB3ZWFrbWFwXG4gICAgICB9IHJldHVybiBtZXRob2QuY2FsbCh0aGlzLCBhLCBiKTtcbiAgICB9KTtcbiAgfSk7XG59XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vY29yZS1qcy9tb2R1bGVzL2VzNi53ZWFrLW1hcC5qc1xuICoqIG1vZHVsZSBpZCA9IDM2MFxuICoqIG1vZHVsZSBjaHVua3MgPSAyNFxuICoqLyJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=");

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

	eval("'use strict';\nvar hide              = __webpack_require__(219)\n  , redefineAll       = __webpack_require__(355)\n  , anObject          = __webpack_require__(233)\n  , isObject          = __webpack_require__(229)\n  , strictNew         = __webpack_require__(350)\n  , forOf             = __webpack_require__(351)\n  , createArrayMethod = __webpack_require__(241)\n  , $has              = __webpack_require__(230)\n  , WEAK              = __webpack_require__(224)('weak')\n  , isExtensible      = Object.isExtensible || isObject\n  , arrayFind         = createArrayMethod(5)\n  , arrayFindIndex    = createArrayMethod(6)\n  , id                = 0;\n\n// fallback for frozen keys\nvar frozenStore = function(that){\n  return that._l || (that._l = new FrozenStore);\n};\nvar FrozenStore = function(){\n  this.a = [];\n};\nvar findFrozen = function(store, key){\n  return arrayFind(store.a, function(it){\n    return it[0] === key;\n  });\n};\nFrozenStore.prototype = {\n  get: function(key){\n    var entry = findFrozen(this, key);\n    if(entry)return entry[1];\n  },\n  has: function(key){\n    return !!findFrozen(this, key);\n  },\n  set: function(key, value){\n    var entry = findFrozen(this, key);\n    if(entry)entry[1] = value;\n    else this.a.push([key, value]);\n  },\n  'delete': function(key){\n    var index = arrayFindIndex(this.a, function(it){\n      return it[0] === key;\n    });\n    if(~index)this.a.splice(index, 1);\n    return !!~index;\n  }\n};\n\nmodule.exports = {\n  getConstructor: function(wrapper, NAME, IS_MAP, ADDER){\n    var C = wrapper(function(that, iterable){\n      strictNew(that, C, NAME);\n      that._i = id++;      // collection id\n      that._l = undefined; // leak store for frozen objects\n      if(iterable != undefined)forOf(iterable, IS_MAP, that[ADDER], that);\n    });\n    redefineAll(C.prototype, {\n      // 23.3.3.2 WeakMap.prototype.delete(key)\n      // 23.4.3.3 WeakSet.prototype.delete(value)\n      'delete': function(key){\n        if(!isObject(key))return false;\n        if(!isExtensible(key))return frozenStore(this)['delete'](key);\n        return $has(key, WEAK) && $has(key[WEAK], this._i) && delete key[WEAK][this._i];\n      },\n      // 23.3.3.4 WeakMap.prototype.has(key)\n      // 23.4.3.4 WeakSet.prototype.has(value)\n      has: function has(key){\n        if(!isObject(key))return false;\n        if(!isExtensible(key))return frozenStore(this).has(key);\n        return $has(key, WEAK) && $has(key[WEAK], this._i);\n      }\n    });\n    return C;\n  },\n  def: function(that, key, value){\n    if(!isExtensible(anObject(key))){\n      frozenStore(that).set(key, value);\n    } else {\n      $has(key, WEAK) || hide(key, WEAK, {});\n      key[WEAK][that._i] = value;\n    } return that;\n  },\n  frozenStore: frozenStore,\n  WEAK: WEAK\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzYxLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvJC5jb2xsZWN0aW9uLXdlYWsuanM/NmE0NiJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG52YXIgaGlkZSAgICAgICAgICAgICAgPSByZXF1aXJlKCcuLyQuaGlkZScpXG4gICwgcmVkZWZpbmVBbGwgICAgICAgPSByZXF1aXJlKCcuLyQucmVkZWZpbmUtYWxsJylcbiAgLCBhbk9iamVjdCAgICAgICAgICA9IHJlcXVpcmUoJy4vJC5hbi1vYmplY3QnKVxuICAsIGlzT2JqZWN0ICAgICAgICAgID0gcmVxdWlyZSgnLi8kLmlzLW9iamVjdCcpXG4gICwgc3RyaWN0TmV3ICAgICAgICAgPSByZXF1aXJlKCcuLyQuc3RyaWN0LW5ldycpXG4gICwgZm9yT2YgICAgICAgICAgICAgPSByZXF1aXJlKCcuLyQuZm9yLW9mJylcbiAgLCBjcmVhdGVBcnJheU1ldGhvZCA9IHJlcXVpcmUoJy4vJC5hcnJheS1tZXRob2RzJylcbiAgLCAkaGFzICAgICAgICAgICAgICA9IHJlcXVpcmUoJy4vJC5oYXMnKVxuICAsIFdFQUsgICAgICAgICAgICAgID0gcmVxdWlyZSgnLi8kLnVpZCcpKCd3ZWFrJylcbiAgLCBpc0V4dGVuc2libGUgICAgICA9IE9iamVjdC5pc0V4dGVuc2libGUgfHwgaXNPYmplY3RcbiAgLCBhcnJheUZpbmQgICAgICAgICA9IGNyZWF0ZUFycmF5TWV0aG9kKDUpXG4gICwgYXJyYXlGaW5kSW5kZXggICAgPSBjcmVhdGVBcnJheU1ldGhvZCg2KVxuICAsIGlkICAgICAgICAgICAgICAgID0gMDtcblxuLy8gZmFsbGJhY2sgZm9yIGZyb3plbiBrZXlzXG52YXIgZnJvemVuU3RvcmUgPSBmdW5jdGlvbih0aGF0KXtcbiAgcmV0dXJuIHRoYXQuX2wgfHwgKHRoYXQuX2wgPSBuZXcgRnJvemVuU3RvcmUpO1xufTtcbnZhciBGcm96ZW5TdG9yZSA9IGZ1bmN0aW9uKCl7XG4gIHRoaXMuYSA9IFtdO1xufTtcbnZhciBmaW5kRnJvemVuID0gZnVuY3Rpb24oc3RvcmUsIGtleSl7XG4gIHJldHVybiBhcnJheUZpbmQoc3RvcmUuYSwgZnVuY3Rpb24oaXQpe1xuICAgIHJldHVybiBpdFswXSA9PT0ga2V5O1xuICB9KTtcbn07XG5Gcm96ZW5TdG9yZS5wcm90b3R5cGUgPSB7XG4gIGdldDogZnVuY3Rpb24oa2V5KXtcbiAgICB2YXIgZW50cnkgPSBmaW5kRnJvemVuKHRoaXMsIGtleSk7XG4gICAgaWYoZW50cnkpcmV0dXJuIGVudHJ5WzFdO1xuICB9LFxuICBoYXM6IGZ1bmN0aW9uKGtleSl7XG4gICAgcmV0dXJuICEhZmluZEZyb3plbih0aGlzLCBrZXkpO1xuICB9LFxuICBzZXQ6IGZ1bmN0aW9uKGtleSwgdmFsdWUpe1xuICAgIHZhciBlbnRyeSA9IGZpbmRGcm96ZW4odGhpcywga2V5KTtcbiAgICBpZihlbnRyeSllbnRyeVsxXSA9IHZhbHVlO1xuICAgIGVsc2UgdGhpcy5hLnB1c2goW2tleSwgdmFsdWVdKTtcbiAgfSxcbiAgJ2RlbGV0ZSc6IGZ1bmN0aW9uKGtleSl7XG4gICAgdmFyIGluZGV4ID0gYXJyYXlGaW5kSW5kZXgodGhpcy5hLCBmdW5jdGlvbihpdCl7XG4gICAgICByZXR1cm4gaXRbMF0gPT09IGtleTtcbiAgICB9KTtcbiAgICBpZih+aW5kZXgpdGhpcy5hLnNwbGljZShpbmRleCwgMSk7XG4gICAgcmV0dXJuICEhfmluZGV4O1xuICB9XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgZ2V0Q29uc3RydWN0b3I6IGZ1bmN0aW9uKHdyYXBwZXIsIE5BTUUsIElTX01BUCwgQURERVIpe1xuICAgIHZhciBDID0gd3JhcHBlcihmdW5jdGlvbih0aGF0LCBpdGVyYWJsZSl7XG4gICAgICBzdHJpY3ROZXcodGhhdCwgQywgTkFNRSk7XG4gICAgICB0aGF0Ll9pID0gaWQrKzsgICAgICAvLyBjb2xsZWN0aW9uIGlkXG4gICAgICB0aGF0Ll9sID0gdW5kZWZpbmVkOyAvLyBsZWFrIHN0b3JlIGZvciBmcm96ZW4gb2JqZWN0c1xuICAgICAgaWYoaXRlcmFibGUgIT0gdW5kZWZpbmVkKWZvck9mKGl0ZXJhYmxlLCBJU19NQVAsIHRoYXRbQURERVJdLCB0aGF0KTtcbiAgICB9KTtcbiAgICByZWRlZmluZUFsbChDLnByb3RvdHlwZSwge1xuICAgICAgLy8gMjMuMy4zLjIgV2Vha01hcC5wcm90b3R5cGUuZGVsZXRlKGtleSlcbiAgICAgIC8vIDIzLjQuMy4zIFdlYWtTZXQucHJvdG90eXBlLmRlbGV0ZSh2YWx1ZSlcbiAgICAgICdkZWxldGUnOiBmdW5jdGlvbihrZXkpe1xuICAgICAgICBpZighaXNPYmplY3Qoa2V5KSlyZXR1cm4gZmFsc2U7XG4gICAgICAgIGlmKCFpc0V4dGVuc2libGUoa2V5KSlyZXR1cm4gZnJvemVuU3RvcmUodGhpcylbJ2RlbGV0ZSddKGtleSk7XG4gICAgICAgIHJldHVybiAkaGFzKGtleSwgV0VBSykgJiYgJGhhcyhrZXlbV0VBS10sIHRoaXMuX2kpICYmIGRlbGV0ZSBrZXlbV0VBS11bdGhpcy5faV07XG4gICAgICB9LFxuICAgICAgLy8gMjMuMy4zLjQgV2Vha01hcC5wcm90b3R5cGUuaGFzKGtleSlcbiAgICAgIC8vIDIzLjQuMy40IFdlYWtTZXQucHJvdG90eXBlLmhhcyh2YWx1ZSlcbiAgICAgIGhhczogZnVuY3Rpb24gaGFzKGtleSl7XG4gICAgICAgIGlmKCFpc09iamVjdChrZXkpKXJldHVybiBmYWxzZTtcbiAgICAgICAgaWYoIWlzRXh0ZW5zaWJsZShrZXkpKXJldHVybiBmcm96ZW5TdG9yZSh0aGlzKS5oYXMoa2V5KTtcbiAgICAgICAgcmV0dXJuICRoYXMoa2V5LCBXRUFLKSAmJiAkaGFzKGtleVtXRUFLXSwgdGhpcy5faSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIEM7XG4gIH0sXG4gIGRlZjogZnVuY3Rpb24odGhhdCwga2V5LCB2YWx1ZSl7XG4gICAgaWYoIWlzRXh0ZW5zaWJsZShhbk9iamVjdChrZXkpKSl7XG4gICAgICBmcm96ZW5TdG9yZSh0aGF0KS5zZXQoa2V5LCB2YWx1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgICRoYXMoa2V5LCBXRUFLKSB8fCBoaWRlKGtleSwgV0VBSywge30pO1xuICAgICAga2V5W1dFQUtdW3RoYXQuX2ldID0gdmFsdWU7XG4gICAgfSByZXR1cm4gdGhhdDtcbiAgfSxcbiAgZnJvemVuU3RvcmU6IGZyb3plblN0b3JlLFxuICBXRUFLOiBXRUFLXG59O1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2NvcmUtanMvbW9kdWxlcy8kLmNvbGxlY3Rpb24td2Vhay5qc1xuICoqIG1vZHVsZSBpZCA9IDM2MVxuICoqIG1vZHVsZSBjaHVua3MgPSAyNFxuICoqLyJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");

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

	eval("'use strict';\nvar weak = __webpack_require__(361);\n\n// 23.4 WeakSet Objects\n__webpack_require__(358)('WeakSet', function(get){\n  return function WeakSet(){ return get(this, arguments.length > 0 ? arguments[0] : undefined); };\n}, {\n  // 23.4.3.1 WeakSet.prototype.add(value)\n  add: function add(value){\n    return weak.def(this, value, true);\n  }\n}, weak, false, true);\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzYyLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvZXM2LndlYWstc2V0LmpzPzc3OWUiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xudmFyIHdlYWsgPSByZXF1aXJlKCcuLyQuY29sbGVjdGlvbi13ZWFrJyk7XG5cbi8vIDIzLjQgV2Vha1NldCBPYmplY3RzXG5yZXF1aXJlKCcuLyQuY29sbGVjdGlvbicpKCdXZWFrU2V0JywgZnVuY3Rpb24oZ2V0KXtcbiAgcmV0dXJuIGZ1bmN0aW9uIFdlYWtTZXQoKXsgcmV0dXJuIGdldCh0aGlzLCBhcmd1bWVudHMubGVuZ3RoID4gMCA/IGFyZ3VtZW50c1swXSA6IHVuZGVmaW5lZCk7IH07XG59LCB7XG4gIC8vIDIzLjQuMy4xIFdlYWtTZXQucHJvdG90eXBlLmFkZCh2YWx1ZSlcbiAgYWRkOiBmdW5jdGlvbiBhZGQodmFsdWUpe1xuICAgIHJldHVybiB3ZWFrLmRlZih0aGlzLCB2YWx1ZSwgdHJ1ZSk7XG4gIH1cbn0sIHdlYWssIGZhbHNlLCB0cnVlKTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9jb3JlLWpzL21vZHVsZXMvZXM2LndlYWstc2V0LmpzXG4gKiogbW9kdWxlIGlkID0gMzYyXG4gKiogbW9kdWxlIGNodW5rcyA9IDI0XG4gKiovIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=");

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

	eval("// 26.1.1 Reflect.apply(target, thisArgument, argumentsList)\nvar $export  = __webpack_require__(216)\n  , _apply   = Function.apply\n  , anObject = __webpack_require__(233);\n\n$export($export.S, 'Reflect', {\n  apply: function apply(target, thisArgument, argumentsList){\n    return _apply.call(target, thisArgument, anObject(argumentsList));\n  }\n});\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzYzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvZXM2LnJlZmxlY3QuYXBwbHkuanM/MTk3MCJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyAyNi4xLjEgUmVmbGVjdC5hcHBseSh0YXJnZXQsIHRoaXNBcmd1bWVudCwgYXJndW1lbnRzTGlzdClcbnZhciAkZXhwb3J0ICA9IHJlcXVpcmUoJy4vJC5leHBvcnQnKVxuICAsIF9hcHBseSAgID0gRnVuY3Rpb24uYXBwbHlcbiAgLCBhbk9iamVjdCA9IHJlcXVpcmUoJy4vJC5hbi1vYmplY3QnKTtcblxuJGV4cG9ydCgkZXhwb3J0LlMsICdSZWZsZWN0Jywge1xuICBhcHBseTogZnVuY3Rpb24gYXBwbHkodGFyZ2V0LCB0aGlzQXJndW1lbnQsIGFyZ3VtZW50c0xpc3Qpe1xuICAgIHJldHVybiBfYXBwbHkuY2FsbCh0YXJnZXQsIHRoaXNBcmd1bWVudCwgYW5PYmplY3QoYXJndW1lbnRzTGlzdCkpO1xuICB9XG59KTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9jb3JlLWpzL21vZHVsZXMvZXM2LnJlZmxlY3QuYXBwbHkuanNcbiAqKiBtb2R1bGUgaWQgPSAzNjNcbiAqKiBtb2R1bGUgY2h1bmtzID0gMjRcbiAqKi8iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");

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

	eval("// 26.1.2 Reflect.construct(target, argumentsList [, newTarget])\nvar $         = __webpack_require__(215)\n  , $export   = __webpack_require__(216)\n  , aFunction = __webpack_require__(226)\n  , anObject  = __webpack_require__(233)\n  , isObject  = __webpack_require__(229)\n  , bind      = Function.bind || __webpack_require__(218).Function.prototype.bind;\n\n// MS Edge supports only 2 arguments\n// FF Nightly sets third argument as `new.target`, but does not create `this` from it\n$export($export.S + $export.F * __webpack_require__(222)(function(){\n  function F(){}\n  return !(Reflect.construct(function(){}, [], F) instanceof F);\n}), 'Reflect', {\n  construct: function construct(Target, args /*, newTarget*/){\n    aFunction(Target);\n    anObject(args);\n    var newTarget = arguments.length < 3 ? Target : aFunction(arguments[2]);\n    if(Target == newTarget){\n      // w/o altered newTarget, optimization for 0-4 arguments\n      switch(args.length){\n        case 0: return new Target;\n        case 1: return new Target(args[0]);\n        case 2: return new Target(args[0], args[1]);\n        case 3: return new Target(args[0], args[1], args[2]);\n        case 4: return new Target(args[0], args[1], args[2], args[3]);\n      }\n      // w/o altered newTarget, lot of arguments case\n      var $args = [null];\n      $args.push.apply($args, args);\n      return new (bind.apply(Target, $args));\n    }\n    // with altered newTarget, not support built-in constructors\n    var proto    = newTarget.prototype\n      , instance = $.create(isObject(proto) ? proto : Object.prototype)\n      , result   = Function.apply.call(Target, instance, args);\n    return isObject(result) ? result : instance;\n  }\n});\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzY0LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvZXM2LnJlZmxlY3QuY29uc3RydWN0LmpzP2EwMDUiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gMjYuMS4yIFJlZmxlY3QuY29uc3RydWN0KHRhcmdldCwgYXJndW1lbnRzTGlzdCBbLCBuZXdUYXJnZXRdKVxudmFyICQgICAgICAgICA9IHJlcXVpcmUoJy4vJCcpXG4gICwgJGV4cG9ydCAgID0gcmVxdWlyZSgnLi8kLmV4cG9ydCcpXG4gICwgYUZ1bmN0aW9uID0gcmVxdWlyZSgnLi8kLmEtZnVuY3Rpb24nKVxuICAsIGFuT2JqZWN0ICA9IHJlcXVpcmUoJy4vJC5hbi1vYmplY3QnKVxuICAsIGlzT2JqZWN0ICA9IHJlcXVpcmUoJy4vJC5pcy1vYmplY3QnKVxuICAsIGJpbmQgICAgICA9IEZ1bmN0aW9uLmJpbmQgfHwgcmVxdWlyZSgnLi8kLmNvcmUnKS5GdW5jdGlvbi5wcm90b3R5cGUuYmluZDtcblxuLy8gTVMgRWRnZSBzdXBwb3J0cyBvbmx5IDIgYXJndW1lbnRzXG4vLyBGRiBOaWdodGx5IHNldHMgdGhpcmQgYXJndW1lbnQgYXMgYG5ldy50YXJnZXRgLCBidXQgZG9lcyBub3QgY3JlYXRlIGB0aGlzYCBmcm9tIGl0XG4kZXhwb3J0KCRleHBvcnQuUyArICRleHBvcnQuRiAqIHJlcXVpcmUoJy4vJC5mYWlscycpKGZ1bmN0aW9uKCl7XG4gIGZ1bmN0aW9uIEYoKXt9XG4gIHJldHVybiAhKFJlZmxlY3QuY29uc3RydWN0KGZ1bmN0aW9uKCl7fSwgW10sIEYpIGluc3RhbmNlb2YgRik7XG59KSwgJ1JlZmxlY3QnLCB7XG4gIGNvbnN0cnVjdDogZnVuY3Rpb24gY29uc3RydWN0KFRhcmdldCwgYXJncyAvKiwgbmV3VGFyZ2V0Ki8pe1xuICAgIGFGdW5jdGlvbihUYXJnZXQpO1xuICAgIGFuT2JqZWN0KGFyZ3MpO1xuICAgIHZhciBuZXdUYXJnZXQgPSBhcmd1bWVudHMubGVuZ3RoIDwgMyA/IFRhcmdldCA6IGFGdW5jdGlvbihhcmd1bWVudHNbMl0pO1xuICAgIGlmKFRhcmdldCA9PSBuZXdUYXJnZXQpe1xuICAgICAgLy8gdy9vIGFsdGVyZWQgbmV3VGFyZ2V0LCBvcHRpbWl6YXRpb24gZm9yIDAtNCBhcmd1bWVudHNcbiAgICAgIHN3aXRjaChhcmdzLmxlbmd0aCl7XG4gICAgICAgIGNhc2UgMDogcmV0dXJuIG5ldyBUYXJnZXQ7XG4gICAgICAgIGNhc2UgMTogcmV0dXJuIG5ldyBUYXJnZXQoYXJnc1swXSk7XG4gICAgICAgIGNhc2UgMjogcmV0dXJuIG5ldyBUYXJnZXQoYXJnc1swXSwgYXJnc1sxXSk7XG4gICAgICAgIGNhc2UgMzogcmV0dXJuIG5ldyBUYXJnZXQoYXJnc1swXSwgYXJnc1sxXSwgYXJnc1syXSk7XG4gICAgICAgIGNhc2UgNDogcmV0dXJuIG5ldyBUYXJnZXQoYXJnc1swXSwgYXJnc1sxXSwgYXJnc1syXSwgYXJnc1szXSk7XG4gICAgICB9XG4gICAgICAvLyB3L28gYWx0ZXJlZCBuZXdUYXJnZXQsIGxvdCBvZiBhcmd1bWVudHMgY2FzZVxuICAgICAgdmFyICRhcmdzID0gW251bGxdO1xuICAgICAgJGFyZ3MucHVzaC5hcHBseSgkYXJncywgYXJncyk7XG4gICAgICByZXR1cm4gbmV3IChiaW5kLmFwcGx5KFRhcmdldCwgJGFyZ3MpKTtcbiAgICB9XG4gICAgLy8gd2l0aCBhbHRlcmVkIG5ld1RhcmdldCwgbm90IHN1cHBvcnQgYnVpbHQtaW4gY29uc3RydWN0b3JzXG4gICAgdmFyIHByb3RvICAgID0gbmV3VGFyZ2V0LnByb3RvdHlwZVxuICAgICAgLCBpbnN0YW5jZSA9ICQuY3JlYXRlKGlzT2JqZWN0KHByb3RvKSA/IHByb3RvIDogT2JqZWN0LnByb3RvdHlwZSlcbiAgICAgICwgcmVzdWx0ICAgPSBGdW5jdGlvbi5hcHBseS5jYWxsKFRhcmdldCwgaW5zdGFuY2UsIGFyZ3MpO1xuICAgIHJldHVybiBpc09iamVjdChyZXN1bHQpID8gcmVzdWx0IDogaW5zdGFuY2U7XG4gIH1cbn0pO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2NvcmUtanMvbW9kdWxlcy9lczYucmVmbGVjdC5jb25zdHJ1Y3QuanNcbiAqKiBtb2R1bGUgaWQgPSAzNjRcbiAqKiBtb2R1bGUgY2h1bmtzID0gMjRcbiAqKi8iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");

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

	eval("// 26.1.3 Reflect.defineProperty(target, propertyKey, attributes)\nvar $        = __webpack_require__(215)\n  , $export  = __webpack_require__(216)\n  , anObject = __webpack_require__(233);\n\n// MS Edge has broken Reflect.defineProperty - throwing instead of returning false\n$export($export.S + $export.F * __webpack_require__(222)(function(){\n  Reflect.defineProperty($.setDesc({}, 1, {value: 1}), 1, {value: 2});\n}), 'Reflect', {\n  defineProperty: function defineProperty(target, propertyKey, attributes){\n    anObject(target);\n    try {\n      $.setDesc(target, propertyKey, attributes);\n      return true;\n    } catch(e){\n      return false;\n    }\n  }\n});\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzY1LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvZXM2LnJlZmxlY3QuZGVmaW5lLXByb3BlcnR5LmpzP2MyOTYiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gMjYuMS4zIFJlZmxlY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBwcm9wZXJ0eUtleSwgYXR0cmlidXRlcylcbnZhciAkICAgICAgICA9IHJlcXVpcmUoJy4vJCcpXG4gICwgJGV4cG9ydCAgPSByZXF1aXJlKCcuLyQuZXhwb3J0JylcbiAgLCBhbk9iamVjdCA9IHJlcXVpcmUoJy4vJC5hbi1vYmplY3QnKTtcblxuLy8gTVMgRWRnZSBoYXMgYnJva2VuIFJlZmxlY3QuZGVmaW5lUHJvcGVydHkgLSB0aHJvd2luZyBpbnN0ZWFkIG9mIHJldHVybmluZyBmYWxzZVxuJGV4cG9ydCgkZXhwb3J0LlMgKyAkZXhwb3J0LkYgKiByZXF1aXJlKCcuLyQuZmFpbHMnKShmdW5jdGlvbigpe1xuICBSZWZsZWN0LmRlZmluZVByb3BlcnR5KCQuc2V0RGVzYyh7fSwgMSwge3ZhbHVlOiAxfSksIDEsIHt2YWx1ZTogMn0pO1xufSksICdSZWZsZWN0Jywge1xuICBkZWZpbmVQcm9wZXJ0eTogZnVuY3Rpb24gZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBwcm9wZXJ0eUtleSwgYXR0cmlidXRlcyl7XG4gICAgYW5PYmplY3QodGFyZ2V0KTtcbiAgICB0cnkge1xuICAgICAgJC5zZXREZXNjKHRhcmdldCwgcHJvcGVydHlLZXksIGF0dHJpYnV0ZXMpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBjYXRjaChlKXtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cbn0pO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2NvcmUtanMvbW9kdWxlcy9lczYucmVmbGVjdC5kZWZpbmUtcHJvcGVydHkuanNcbiAqKiBtb2R1bGUgaWQgPSAzNjVcbiAqKiBtb2R1bGUgY2h1bmtzID0gMjRcbiAqKi8iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");

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

	eval("// 26.1.4 Reflect.deleteProperty(target, propertyKey)\nvar $export  = __webpack_require__(216)\n  , getDesc  = __webpack_require__(215).getDesc\n  , anObject = __webpack_require__(233);\n\n$export($export.S, 'Reflect', {\n  deleteProperty: function deleteProperty(target, propertyKey){\n    var desc = getDesc(anObject(target), propertyKey);\n    return desc && !desc.configurable ? false : delete target[propertyKey];\n  }\n});\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzY2LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvZXM2LnJlZmxlY3QuZGVsZXRlLXByb3BlcnR5LmpzPzUxZDIiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gMjYuMS40IFJlZmxlY3QuZGVsZXRlUHJvcGVydHkodGFyZ2V0LCBwcm9wZXJ0eUtleSlcbnZhciAkZXhwb3J0ICA9IHJlcXVpcmUoJy4vJC5leHBvcnQnKVxuICAsIGdldERlc2MgID0gcmVxdWlyZSgnLi8kJykuZ2V0RGVzY1xuICAsIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi8kLmFuLW9iamVjdCcpO1xuXG4kZXhwb3J0KCRleHBvcnQuUywgJ1JlZmxlY3QnLCB7XG4gIGRlbGV0ZVByb3BlcnR5OiBmdW5jdGlvbiBkZWxldGVQcm9wZXJ0eSh0YXJnZXQsIHByb3BlcnR5S2V5KXtcbiAgICB2YXIgZGVzYyA9IGdldERlc2MoYW5PYmplY3QodGFyZ2V0KSwgcHJvcGVydHlLZXkpO1xuICAgIHJldHVybiBkZXNjICYmICFkZXNjLmNvbmZpZ3VyYWJsZSA/IGZhbHNlIDogZGVsZXRlIHRhcmdldFtwcm9wZXJ0eUtleV07XG4gIH1cbn0pO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2NvcmUtanMvbW9kdWxlcy9lczYucmVmbGVjdC5kZWxldGUtcHJvcGVydHkuanNcbiAqKiBtb2R1bGUgaWQgPSAzNjZcbiAqKiBtb2R1bGUgY2h1bmtzID0gMjRcbiAqKi8iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=");

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

	eval("'use strict';\n// 26.1.5 Reflect.enumerate(target)\nvar $export  = __webpack_require__(216)\n  , anObject = __webpack_require__(233);\nvar Enumerate = function(iterated){\n  this._t = anObject(iterated); // target\n  this._i = 0;                  // next index\n  var keys = this._k = []       // keys\n    , key;\n  for(key in iterated)keys.push(key);\n};\n__webpack_require__(314)(Enumerate, 'Object', function(){\n  var that = this\n    , keys = that._k\n    , key;\n  do {\n    if(that._i >= keys.length)return {value: undefined, done: true};\n  } while(!((key = keys[that._i++]) in that._t));\n  return {value: key, done: false};\n});\n\n$export($export.S, 'Reflect', {\n  enumerate: function enumerate(target){\n    return new Enumerate(target);\n  }\n});\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzY3LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvZXM2LnJlZmxlY3QuZW51bWVyYXRlLmpzPzU0ZWEiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuLy8gMjYuMS41IFJlZmxlY3QuZW51bWVyYXRlKHRhcmdldClcbnZhciAkZXhwb3J0ICA9IHJlcXVpcmUoJy4vJC5leHBvcnQnKVxuICAsIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi8kLmFuLW9iamVjdCcpO1xudmFyIEVudW1lcmF0ZSA9IGZ1bmN0aW9uKGl0ZXJhdGVkKXtcbiAgdGhpcy5fdCA9IGFuT2JqZWN0KGl0ZXJhdGVkKTsgLy8gdGFyZ2V0XG4gIHRoaXMuX2kgPSAwOyAgICAgICAgICAgICAgICAgIC8vIG5leHQgaW5kZXhcbiAgdmFyIGtleXMgPSB0aGlzLl9rID0gW10gICAgICAgLy8ga2V5c1xuICAgICwga2V5O1xuICBmb3Ioa2V5IGluIGl0ZXJhdGVkKWtleXMucHVzaChrZXkpO1xufTtcbnJlcXVpcmUoJy4vJC5pdGVyLWNyZWF0ZScpKEVudW1lcmF0ZSwgJ09iamVjdCcsIGZ1bmN0aW9uKCl7XG4gIHZhciB0aGF0ID0gdGhpc1xuICAgICwga2V5cyA9IHRoYXQuX2tcbiAgICAsIGtleTtcbiAgZG8ge1xuICAgIGlmKHRoYXQuX2kgPj0ga2V5cy5sZW5ndGgpcmV0dXJuIHt2YWx1ZTogdW5kZWZpbmVkLCBkb25lOiB0cnVlfTtcbiAgfSB3aGlsZSghKChrZXkgPSBrZXlzW3RoYXQuX2krK10pIGluIHRoYXQuX3QpKTtcbiAgcmV0dXJuIHt2YWx1ZToga2V5LCBkb25lOiBmYWxzZX07XG59KTtcblxuJGV4cG9ydCgkZXhwb3J0LlMsICdSZWZsZWN0Jywge1xuICBlbnVtZXJhdGU6IGZ1bmN0aW9uIGVudW1lcmF0ZSh0YXJnZXQpe1xuICAgIHJldHVybiBuZXcgRW51bWVyYXRlKHRhcmdldCk7XG4gIH1cbn0pO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2NvcmUtanMvbW9kdWxlcy9lczYucmVmbGVjdC5lbnVtZXJhdGUuanNcbiAqKiBtb2R1bGUgaWQgPSAzNjdcbiAqKiBtb2R1bGUgY2h1bmtzID0gMjRcbiAqKi8iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=");

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

	eval("// 26.1.6 Reflect.get(target, propertyKey [, receiver])\nvar $        = __webpack_require__(215)\n  , has      = __webpack_require__(230)\n  , $export  = __webpack_require__(216)\n  , isObject = __webpack_require__(229)\n  , anObject = __webpack_require__(233);\n\nfunction get(target, propertyKey/*, receiver*/){\n  var receiver = arguments.length < 3 ? target : arguments[2]\n    , desc, proto;\n  if(anObject(target) === receiver)return target[propertyKey];\n  if(desc = $.getDesc(target, propertyKey))return has(desc, 'value')\n    ? desc.value\n    : desc.get !== undefined\n      ? desc.get.call(receiver)\n      : undefined;\n  if(isObject(proto = $.getProto(target)))return get(proto, propertyKey, receiver);\n}\n\n$export($export.S, 'Reflect', {get: get});\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzY4LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvZXM2LnJlZmxlY3QuZ2V0LmpzPzJkMGUiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gMjYuMS42IFJlZmxlY3QuZ2V0KHRhcmdldCwgcHJvcGVydHlLZXkgWywgcmVjZWl2ZXJdKVxudmFyICQgICAgICAgID0gcmVxdWlyZSgnLi8kJylcbiAgLCBoYXMgICAgICA9IHJlcXVpcmUoJy4vJC5oYXMnKVxuICAsICRleHBvcnQgID0gcmVxdWlyZSgnLi8kLmV4cG9ydCcpXG4gICwgaXNPYmplY3QgPSByZXF1aXJlKCcuLyQuaXMtb2JqZWN0JylcbiAgLCBhbk9iamVjdCA9IHJlcXVpcmUoJy4vJC5hbi1vYmplY3QnKTtcblxuZnVuY3Rpb24gZ2V0KHRhcmdldCwgcHJvcGVydHlLZXkvKiwgcmVjZWl2ZXIqLyl7XG4gIHZhciByZWNlaXZlciA9IGFyZ3VtZW50cy5sZW5ndGggPCAzID8gdGFyZ2V0IDogYXJndW1lbnRzWzJdXG4gICAgLCBkZXNjLCBwcm90bztcbiAgaWYoYW5PYmplY3QodGFyZ2V0KSA9PT0gcmVjZWl2ZXIpcmV0dXJuIHRhcmdldFtwcm9wZXJ0eUtleV07XG4gIGlmKGRlc2MgPSAkLmdldERlc2ModGFyZ2V0LCBwcm9wZXJ0eUtleSkpcmV0dXJuIGhhcyhkZXNjLCAndmFsdWUnKVxuICAgID8gZGVzYy52YWx1ZVxuICAgIDogZGVzYy5nZXQgIT09IHVuZGVmaW5lZFxuICAgICAgPyBkZXNjLmdldC5jYWxsKHJlY2VpdmVyKVxuICAgICAgOiB1bmRlZmluZWQ7XG4gIGlmKGlzT2JqZWN0KHByb3RvID0gJC5nZXRQcm90byh0YXJnZXQpKSlyZXR1cm4gZ2V0KHByb3RvLCBwcm9wZXJ0eUtleSwgcmVjZWl2ZXIpO1xufVxuXG4kZXhwb3J0KCRleHBvcnQuUywgJ1JlZmxlY3QnLCB7Z2V0OiBnZXR9KTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9jb3JlLWpzL21vZHVsZXMvZXM2LnJlZmxlY3QuZ2V0LmpzXG4gKiogbW9kdWxlIGlkID0gMzY4XG4gKiogbW9kdWxlIGNodW5rcyA9IDI0XG4gKiovIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");

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

	eval("// 26.1.7 Reflect.getOwnPropertyDescriptor(target, propertyKey)\nvar $        = __webpack_require__(215)\n  , $export  = __webpack_require__(216)\n  , anObject = __webpack_require__(233);\n\n$export($export.S, 'Reflect', {\n  getOwnPropertyDescriptor: function getOwnPropertyDescriptor(target, propertyKey){\n    return $.getDesc(anObject(target), propertyKey);\n  }\n});\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzY5LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvZXM2LnJlZmxlY3QuZ2V0LW93bi1wcm9wZXJ0eS1kZXNjcmlwdG9yLmpzPzc0MTUiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gMjYuMS43IFJlZmxlY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwgcHJvcGVydHlLZXkpXG52YXIgJCAgICAgICAgPSByZXF1aXJlKCcuLyQnKVxuICAsICRleHBvcnQgID0gcmVxdWlyZSgnLi8kLmV4cG9ydCcpXG4gICwgYW5PYmplY3QgPSByZXF1aXJlKCcuLyQuYW4tb2JqZWN0Jyk7XG5cbiRleHBvcnQoJGV4cG9ydC5TLCAnUmVmbGVjdCcsIHtcbiAgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yOiBmdW5jdGlvbiBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGFyZ2V0LCBwcm9wZXJ0eUtleSl7XG4gICAgcmV0dXJuICQuZ2V0RGVzYyhhbk9iamVjdCh0YXJnZXQpLCBwcm9wZXJ0eUtleSk7XG4gIH1cbn0pO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2NvcmUtanMvbW9kdWxlcy9lczYucmVmbGVjdC5nZXQtb3duLXByb3BlcnR5LWRlc2NyaXB0b3IuanNcbiAqKiBtb2R1bGUgaWQgPSAzNjlcbiAqKiBtb2R1bGUgY2h1bmtzID0gMjRcbiAqKi8iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");

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

	eval("// 26.1.8 Reflect.getPrototypeOf(target)\nvar $export  = __webpack_require__(216)\n  , getProto = __webpack_require__(215).getProto\n  , anObject = __webpack_require__(233);\n\n$export($export.S, 'Reflect', {\n  getPrototypeOf: function getPrototypeOf(target){\n    return getProto(anObject(target));\n  }\n});\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzcwLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvZXM2LnJlZmxlY3QuZ2V0LXByb3RvdHlwZS1vZi5qcz80ODUwIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIDI2LjEuOCBSZWZsZWN0LmdldFByb3RvdHlwZU9mKHRhcmdldClcbnZhciAkZXhwb3J0ICA9IHJlcXVpcmUoJy4vJC5leHBvcnQnKVxuICAsIGdldFByb3RvID0gcmVxdWlyZSgnLi8kJykuZ2V0UHJvdG9cbiAgLCBhbk9iamVjdCA9IHJlcXVpcmUoJy4vJC5hbi1vYmplY3QnKTtcblxuJGV4cG9ydCgkZXhwb3J0LlMsICdSZWZsZWN0Jywge1xuICBnZXRQcm90b3R5cGVPZjogZnVuY3Rpb24gZ2V0UHJvdG90eXBlT2YodGFyZ2V0KXtcbiAgICByZXR1cm4gZ2V0UHJvdG8oYW5PYmplY3QodGFyZ2V0KSk7XG4gIH1cbn0pO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2NvcmUtanMvbW9kdWxlcy9lczYucmVmbGVjdC5nZXQtcHJvdG90eXBlLW9mLmpzXG4gKiogbW9kdWxlIGlkID0gMzcwXG4gKiogbW9kdWxlIGNodW5rcyA9IDI0XG4gKiovIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");

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

	eval("// 26.1.9 Reflect.has(target, propertyKey)\nvar $export = __webpack_require__(216);\n\n$export($export.S, 'Reflect', {\n  has: function has(target, propertyKey){\n    return propertyKey in target;\n  }\n});\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzcxLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvZXM2LnJlZmxlY3QuaGFzLmpzP2VkMjEiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gMjYuMS45IFJlZmxlY3QuaGFzKHRhcmdldCwgcHJvcGVydHlLZXkpXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vJC5leHBvcnQnKTtcblxuJGV4cG9ydCgkZXhwb3J0LlMsICdSZWZsZWN0Jywge1xuICBoYXM6IGZ1bmN0aW9uIGhhcyh0YXJnZXQsIHByb3BlcnR5S2V5KXtcbiAgICByZXR1cm4gcHJvcGVydHlLZXkgaW4gdGFyZ2V0O1xuICB9XG59KTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9jb3JlLWpzL21vZHVsZXMvZXM2LnJlZmxlY3QuaGFzLmpzXG4gKiogbW9kdWxlIGlkID0gMzcxXG4gKiogbW9kdWxlIGNodW5rcyA9IDI0XG4gKiovIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");

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

	eval("// 26.1.10 Reflect.isExtensible(target)\nvar $export       = __webpack_require__(216)\n  , anObject      = __webpack_require__(233)\n  , $isExtensible = Object.isExtensible;\n\n$export($export.S, 'Reflect', {\n  isExtensible: function isExtensible(target){\n    anObject(target);\n    return $isExtensible ? $isExtensible(target) : true;\n  }\n});\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzcyLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvZXM2LnJlZmxlY3QuaXMtZXh0ZW5zaWJsZS5qcz9kODAzIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIDI2LjEuMTAgUmVmbGVjdC5pc0V4dGVuc2libGUodGFyZ2V0KVxudmFyICRleHBvcnQgICAgICAgPSByZXF1aXJlKCcuLyQuZXhwb3J0JylcbiAgLCBhbk9iamVjdCAgICAgID0gcmVxdWlyZSgnLi8kLmFuLW9iamVjdCcpXG4gICwgJGlzRXh0ZW5zaWJsZSA9IE9iamVjdC5pc0V4dGVuc2libGU7XG5cbiRleHBvcnQoJGV4cG9ydC5TLCAnUmVmbGVjdCcsIHtcbiAgaXNFeHRlbnNpYmxlOiBmdW5jdGlvbiBpc0V4dGVuc2libGUodGFyZ2V0KXtcbiAgICBhbk9iamVjdCh0YXJnZXQpO1xuICAgIHJldHVybiAkaXNFeHRlbnNpYmxlID8gJGlzRXh0ZW5zaWJsZSh0YXJnZXQpIDogdHJ1ZTtcbiAgfVxufSk7XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vY29yZS1qcy9tb2R1bGVzL2VzNi5yZWZsZWN0LmlzLWV4dGVuc2libGUuanNcbiAqKiBtb2R1bGUgaWQgPSAzNzJcbiAqKiBtb2R1bGUgY2h1bmtzID0gMjRcbiAqKi8iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=");

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

	eval("// 26.1.11 Reflect.ownKeys(target)\nvar $export = __webpack_require__(216);\n\n$export($export.S, 'Reflect', {ownKeys: __webpack_require__(374)});\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzczLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvZXM2LnJlZmxlY3Qub3duLWtleXMuanM/NWZmZiJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyAyNi4xLjExIFJlZmxlY3Qub3duS2V5cyh0YXJnZXQpXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vJC5leHBvcnQnKTtcblxuJGV4cG9ydCgkZXhwb3J0LlMsICdSZWZsZWN0Jywge293bktleXM6IHJlcXVpcmUoJy4vJC5vd24ta2V5cycpfSk7XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vY29yZS1qcy9tb2R1bGVzL2VzNi5yZWZsZWN0Lm93bi1rZXlzLmpzXG4gKiogbW9kdWxlIGlkID0gMzczXG4gKiogbW9kdWxlIGNodW5rcyA9IDI0XG4gKiovIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");

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

	eval("// all object keys, includes non-enumerable and symbols\nvar $        = __webpack_require__(215)\n  , anObject = __webpack_require__(233)\n  , Reflect  = __webpack_require__(217).Reflect;\nmodule.exports = Reflect && Reflect.ownKeys || function ownKeys(it){\n  var keys       = $.getNames(anObject(it))\n    , getSymbols = $.getSymbols;\n  return getSymbols ? keys.concat(getSymbols(it)) : keys;\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzc0LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvJC5vd24ta2V5cy5qcz9jNWM2Il0sInNvdXJjZXNDb250ZW50IjpbIi8vIGFsbCBvYmplY3Qga2V5cywgaW5jbHVkZXMgbm9uLWVudW1lcmFibGUgYW5kIHN5bWJvbHNcbnZhciAkICAgICAgICA9IHJlcXVpcmUoJy4vJCcpXG4gICwgYW5PYmplY3QgPSByZXF1aXJlKCcuLyQuYW4tb2JqZWN0JylcbiAgLCBSZWZsZWN0ICA9IHJlcXVpcmUoJy4vJC5nbG9iYWwnKS5SZWZsZWN0O1xubW9kdWxlLmV4cG9ydHMgPSBSZWZsZWN0ICYmIFJlZmxlY3Qub3duS2V5cyB8fCBmdW5jdGlvbiBvd25LZXlzKGl0KXtcbiAgdmFyIGtleXMgICAgICAgPSAkLmdldE5hbWVzKGFuT2JqZWN0KGl0KSlcbiAgICAsIGdldFN5bWJvbHMgPSAkLmdldFN5bWJvbHM7XG4gIHJldHVybiBnZXRTeW1ib2xzID8ga2V5cy5jb25jYXQoZ2V0U3ltYm9scyhpdCkpIDoga2V5cztcbn07XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vY29yZS1qcy9tb2R1bGVzLyQub3duLWtleXMuanNcbiAqKiBtb2R1bGUgaWQgPSAzNzRcbiAqKiBtb2R1bGUgY2h1bmtzID0gMjRcbiAqKi8iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");

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

	eval("// 26.1.12 Reflect.preventExtensions(target)\nvar $export            = __webpack_require__(216)\n  , anObject           = __webpack_require__(233)\n  , $preventExtensions = Object.preventExtensions;\n\n$export($export.S, 'Reflect', {\n  preventExtensions: function preventExtensions(target){\n    anObject(target);\n    try {\n      if($preventExtensions)$preventExtensions(target);\n      return true;\n    } catch(e){\n      return false;\n    }\n  }\n});\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzc1LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvZXM2LnJlZmxlY3QucHJldmVudC1leHRlbnNpb25zLmpzPzU1ODUiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gMjYuMS4xMiBSZWZsZWN0LnByZXZlbnRFeHRlbnNpb25zKHRhcmdldClcbnZhciAkZXhwb3J0ICAgICAgICAgICAgPSByZXF1aXJlKCcuLyQuZXhwb3J0JylcbiAgLCBhbk9iamVjdCAgICAgICAgICAgPSByZXF1aXJlKCcuLyQuYW4tb2JqZWN0JylcbiAgLCAkcHJldmVudEV4dGVuc2lvbnMgPSBPYmplY3QucHJldmVudEV4dGVuc2lvbnM7XG5cbiRleHBvcnQoJGV4cG9ydC5TLCAnUmVmbGVjdCcsIHtcbiAgcHJldmVudEV4dGVuc2lvbnM6IGZ1bmN0aW9uIHByZXZlbnRFeHRlbnNpb25zKHRhcmdldCl7XG4gICAgYW5PYmplY3QodGFyZ2V0KTtcbiAgICB0cnkge1xuICAgICAgaWYoJHByZXZlbnRFeHRlbnNpb25zKSRwcmV2ZW50RXh0ZW5zaW9ucyh0YXJnZXQpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBjYXRjaChlKXtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cbn0pO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2NvcmUtanMvbW9kdWxlcy9lczYucmVmbGVjdC5wcmV2ZW50LWV4dGVuc2lvbnMuanNcbiAqKiBtb2R1bGUgaWQgPSAzNzVcbiAqKiBtb2R1bGUgY2h1bmtzID0gMjRcbiAqKi8iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");

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

	eval("// 26.1.13 Reflect.set(target, propertyKey, V [, receiver])\nvar $          = __webpack_require__(215)\n  , has        = __webpack_require__(230)\n  , $export    = __webpack_require__(216)\n  , createDesc = __webpack_require__(220)\n  , anObject   = __webpack_require__(233)\n  , isObject   = __webpack_require__(229);\n\nfunction set(target, propertyKey, V/*, receiver*/){\n  var receiver = arguments.length < 4 ? target : arguments[3]\n    , ownDesc  = $.getDesc(anObject(target), propertyKey)\n    , existingDescriptor, proto;\n  if(!ownDesc){\n    if(isObject(proto = $.getProto(target))){\n      return set(proto, propertyKey, V, receiver);\n    }\n    ownDesc = createDesc(0);\n  }\n  if(has(ownDesc, 'value')){\n    if(ownDesc.writable === false || !isObject(receiver))return false;\n    existingDescriptor = $.getDesc(receiver, propertyKey) || createDesc(0);\n    existingDescriptor.value = V;\n    $.setDesc(receiver, propertyKey, existingDescriptor);\n    return true;\n  }\n  return ownDesc.set === undefined ? false : (ownDesc.set.call(receiver, V), true);\n}\n\n$export($export.S, 'Reflect', {set: set});\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzc2LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvZXM2LnJlZmxlY3Quc2V0LmpzPzZlMTkiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gMjYuMS4xMyBSZWZsZWN0LnNldCh0YXJnZXQsIHByb3BlcnR5S2V5LCBWIFssIHJlY2VpdmVyXSlcbnZhciAkICAgICAgICAgID0gcmVxdWlyZSgnLi8kJylcbiAgLCBoYXMgICAgICAgID0gcmVxdWlyZSgnLi8kLmhhcycpXG4gICwgJGV4cG9ydCAgICA9IHJlcXVpcmUoJy4vJC5leHBvcnQnKVxuICAsIGNyZWF0ZURlc2MgPSByZXF1aXJlKCcuLyQucHJvcGVydHktZGVzYycpXG4gICwgYW5PYmplY3QgICA9IHJlcXVpcmUoJy4vJC5hbi1vYmplY3QnKVxuICAsIGlzT2JqZWN0ICAgPSByZXF1aXJlKCcuLyQuaXMtb2JqZWN0Jyk7XG5cbmZ1bmN0aW9uIHNldCh0YXJnZXQsIHByb3BlcnR5S2V5LCBWLyosIHJlY2VpdmVyKi8pe1xuICB2YXIgcmVjZWl2ZXIgPSBhcmd1bWVudHMubGVuZ3RoIDwgNCA/IHRhcmdldCA6IGFyZ3VtZW50c1szXVxuICAgICwgb3duRGVzYyAgPSAkLmdldERlc2MoYW5PYmplY3QodGFyZ2V0KSwgcHJvcGVydHlLZXkpXG4gICAgLCBleGlzdGluZ0Rlc2NyaXB0b3IsIHByb3RvO1xuICBpZighb3duRGVzYyl7XG4gICAgaWYoaXNPYmplY3QocHJvdG8gPSAkLmdldFByb3RvKHRhcmdldCkpKXtcbiAgICAgIHJldHVybiBzZXQocHJvdG8sIHByb3BlcnR5S2V5LCBWLCByZWNlaXZlcik7XG4gICAgfVxuICAgIG93bkRlc2MgPSBjcmVhdGVEZXNjKDApO1xuICB9XG4gIGlmKGhhcyhvd25EZXNjLCAndmFsdWUnKSl7XG4gICAgaWYob3duRGVzYy53cml0YWJsZSA9PT0gZmFsc2UgfHwgIWlzT2JqZWN0KHJlY2VpdmVyKSlyZXR1cm4gZmFsc2U7XG4gICAgZXhpc3RpbmdEZXNjcmlwdG9yID0gJC5nZXREZXNjKHJlY2VpdmVyLCBwcm9wZXJ0eUtleSkgfHwgY3JlYXRlRGVzYygwKTtcbiAgICBleGlzdGluZ0Rlc2NyaXB0b3IudmFsdWUgPSBWO1xuICAgICQuc2V0RGVzYyhyZWNlaXZlciwgcHJvcGVydHlLZXksIGV4aXN0aW5nRGVzY3JpcHRvcik7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgcmV0dXJuIG93bkRlc2Muc2V0ID09PSB1bmRlZmluZWQgPyBmYWxzZSA6IChvd25EZXNjLnNldC5jYWxsKHJlY2VpdmVyLCBWKSwgdHJ1ZSk7XG59XG5cbiRleHBvcnQoJGV4cG9ydC5TLCAnUmVmbGVjdCcsIHtzZXQ6IHNldH0pO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2NvcmUtanMvbW9kdWxlcy9lczYucmVmbGVjdC5zZXQuanNcbiAqKiBtb2R1bGUgaWQgPSAzNzZcbiAqKiBtb2R1bGUgY2h1bmtzID0gMjRcbiAqKi8iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=");

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

	eval("// 26.1.14 Reflect.setPrototypeOf(target, proto)\nvar $export  = __webpack_require__(216)\n  , setProto = __webpack_require__(258);\n\nif(setProto)$export($export.S, 'Reflect', {\n  setPrototypeOf: function setPrototypeOf(target, proto){\n    setProto.check(target, proto);\n    try {\n      setProto.set(target, proto);\n      return true;\n    } catch(e){\n      return false;\n    }\n  }\n});\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzc3LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvZXM2LnJlZmxlY3Quc2V0LXByb3RvdHlwZS1vZi5qcz82MjVkIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIDI2LjEuMTQgUmVmbGVjdC5zZXRQcm90b3R5cGVPZih0YXJnZXQsIHByb3RvKVxudmFyICRleHBvcnQgID0gcmVxdWlyZSgnLi8kLmV4cG9ydCcpXG4gICwgc2V0UHJvdG8gPSByZXF1aXJlKCcuLyQuc2V0LXByb3RvJyk7XG5cbmlmKHNldFByb3RvKSRleHBvcnQoJGV4cG9ydC5TLCAnUmVmbGVjdCcsIHtcbiAgc2V0UHJvdG90eXBlT2Y6IGZ1bmN0aW9uIHNldFByb3RvdHlwZU9mKHRhcmdldCwgcHJvdG8pe1xuICAgIHNldFByb3RvLmNoZWNrKHRhcmdldCwgcHJvdG8pO1xuICAgIHRyeSB7XG4gICAgICBzZXRQcm90by5zZXQodGFyZ2V0LCBwcm90byk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGNhdGNoKGUpe1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxufSk7XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vY29yZS1qcy9tb2R1bGVzL2VzNi5yZWZsZWN0LnNldC1wcm90b3R5cGUtb2YuanNcbiAqKiBtb2R1bGUgaWQgPSAzNzdcbiAqKiBtb2R1bGUgY2h1bmtzID0gMjRcbiAqKi8iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");

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

	eval("'use strict';\nvar $export   = __webpack_require__(216)\n  , $includes = __webpack_require__(246)(true);\n\n$export($export.P, 'Array', {\n  // https://github.com/domenic/Array.prototype.includes\n  includes: function includes(el /*, fromIndex = 0 */){\n    return $includes(this, el, arguments.length > 1 ? arguments[1] : undefined);\n  }\n});\n\n__webpack_require__(331)('includes');\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzc4LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvZXM3LmFycmF5LmluY2x1ZGVzLmpzP2I5YWMiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xudmFyICRleHBvcnQgICA9IHJlcXVpcmUoJy4vJC5leHBvcnQnKVxuICAsICRpbmNsdWRlcyA9IHJlcXVpcmUoJy4vJC5hcnJheS1pbmNsdWRlcycpKHRydWUpO1xuXG4kZXhwb3J0KCRleHBvcnQuUCwgJ0FycmF5Jywge1xuICAvLyBodHRwczovL2dpdGh1Yi5jb20vZG9tZW5pYy9BcnJheS5wcm90b3R5cGUuaW5jbHVkZXNcbiAgaW5jbHVkZXM6IGZ1bmN0aW9uIGluY2x1ZGVzKGVsIC8qLCBmcm9tSW5kZXggPSAwICovKXtcbiAgICByZXR1cm4gJGluY2x1ZGVzKHRoaXMsIGVsLCBhcmd1bWVudHMubGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IHVuZGVmaW5lZCk7XG4gIH1cbn0pO1xuXG5yZXF1aXJlKCcuLyQuYWRkLXRvLXVuc2NvcGFibGVzJykoJ2luY2x1ZGVzJyk7XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vY29yZS1qcy9tb2R1bGVzL2VzNy5hcnJheS5pbmNsdWRlcy5qc1xuICoqIG1vZHVsZSBpZCA9IDM3OFxuICoqIG1vZHVsZSBjaHVua3MgPSAyNFxuICoqLyJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");

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

	eval("'use strict';\n// https://github.com/mathiasbynens/String.prototype.at\nvar $export = __webpack_require__(216)\n  , $at     = __webpack_require__(311)(true);\n\n$export($export.P, 'String', {\n  at: function at(pos){\n    return $at(this, pos);\n  }\n});\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzc5LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvZXM3LnN0cmluZy5hdC5qcz9lNGU4Il0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0Jztcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXRoaWFzYnluZW5zL1N0cmluZy5wcm90b3R5cGUuYXRcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi8kLmV4cG9ydCcpXG4gICwgJGF0ICAgICA9IHJlcXVpcmUoJy4vJC5zdHJpbmctYXQnKSh0cnVlKTtcblxuJGV4cG9ydCgkZXhwb3J0LlAsICdTdHJpbmcnLCB7XG4gIGF0OiBmdW5jdGlvbiBhdChwb3Mpe1xuICAgIHJldHVybiAkYXQodGhpcywgcG9zKTtcbiAgfVxufSk7XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vY29yZS1qcy9tb2R1bGVzL2VzNy5zdHJpbmcuYXQuanNcbiAqKiBtb2R1bGUgaWQgPSAzNzlcbiAqKiBtb2R1bGUgY2h1bmtzID0gMjRcbiAqKi8iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");

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

	eval("'use strict';\nvar $export = __webpack_require__(216)\n  , $pad    = __webpack_require__(381);\n\n$export($export.P, 'String', {\n  padLeft: function padLeft(maxLength /*, fillString = ' ' */){\n    return $pad(this, maxLength, arguments.length > 1 ? arguments[1] : undefined, true);\n  }\n});\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzgwLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvZXM3LnN0cmluZy5wYWQtbGVmdC5qcz9kODEwIl0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi8kLmV4cG9ydCcpXG4gICwgJHBhZCAgICA9IHJlcXVpcmUoJy4vJC5zdHJpbmctcGFkJyk7XG5cbiRleHBvcnQoJGV4cG9ydC5QLCAnU3RyaW5nJywge1xuICBwYWRMZWZ0OiBmdW5jdGlvbiBwYWRMZWZ0KG1heExlbmd0aCAvKiwgZmlsbFN0cmluZyA9ICcgJyAqLyl7XG4gICAgcmV0dXJuICRwYWQodGhpcywgbWF4TGVuZ3RoLCBhcmd1bWVudHMubGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IHVuZGVmaW5lZCwgdHJ1ZSk7XG4gIH1cbn0pO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2NvcmUtanMvbW9kdWxlcy9lczcuc3RyaW5nLnBhZC1sZWZ0LmpzXG4gKiogbW9kdWxlIGlkID0gMzgwXG4gKiogbW9kdWxlIGNodW5rcyA9IDI0XG4gKiovIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=");

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

	eval("// https://github.com/ljharb/proposal-string-pad-left-right\nvar toLength = __webpack_require__(240)\n  , repeat   = __webpack_require__(322)\n  , defined  = __webpack_require__(235);\n\nmodule.exports = function(that, maxLength, fillString, left){\n  var S            = String(defined(that))\n    , stringLength = S.length\n    , fillStr      = fillString === undefined ? ' ' : String(fillString)\n    , intMaxLength = toLength(maxLength);\n  if(intMaxLength <= stringLength)return S;\n  if(fillStr == '')fillStr = ' ';\n  var fillLen = intMaxLength - stringLength\n    , stringFiller = repeat.call(fillStr, Math.ceil(fillLen / fillStr.length));\n  if(stringFiller.length > fillLen)stringFiller = stringFiller.slice(0, fillLen);\n  return left ? stringFiller + S : S + stringFiller;\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzgxLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvJC5zdHJpbmctcGFkLmpzPzI4YjAiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gaHR0cHM6Ly9naXRodWIuY29tL2xqaGFyYi9wcm9wb3NhbC1zdHJpbmctcGFkLWxlZnQtcmlnaHRcbnZhciB0b0xlbmd0aCA9IHJlcXVpcmUoJy4vJC50by1sZW5ndGgnKVxuICAsIHJlcGVhdCAgID0gcmVxdWlyZSgnLi8kLnN0cmluZy1yZXBlYXQnKVxuICAsIGRlZmluZWQgID0gcmVxdWlyZSgnLi8kLmRlZmluZWQnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbih0aGF0LCBtYXhMZW5ndGgsIGZpbGxTdHJpbmcsIGxlZnQpe1xuICB2YXIgUyAgICAgICAgICAgID0gU3RyaW5nKGRlZmluZWQodGhhdCkpXG4gICAgLCBzdHJpbmdMZW5ndGggPSBTLmxlbmd0aFxuICAgICwgZmlsbFN0ciAgICAgID0gZmlsbFN0cmluZyA9PT0gdW5kZWZpbmVkID8gJyAnIDogU3RyaW5nKGZpbGxTdHJpbmcpXG4gICAgLCBpbnRNYXhMZW5ndGggPSB0b0xlbmd0aChtYXhMZW5ndGgpO1xuICBpZihpbnRNYXhMZW5ndGggPD0gc3RyaW5nTGVuZ3RoKXJldHVybiBTO1xuICBpZihmaWxsU3RyID09ICcnKWZpbGxTdHIgPSAnICc7XG4gIHZhciBmaWxsTGVuID0gaW50TWF4TGVuZ3RoIC0gc3RyaW5nTGVuZ3RoXG4gICAgLCBzdHJpbmdGaWxsZXIgPSByZXBlYXQuY2FsbChmaWxsU3RyLCBNYXRoLmNlaWwoZmlsbExlbiAvIGZpbGxTdHIubGVuZ3RoKSk7XG4gIGlmKHN0cmluZ0ZpbGxlci5sZW5ndGggPiBmaWxsTGVuKXN0cmluZ0ZpbGxlciA9IHN0cmluZ0ZpbGxlci5zbGljZSgwLCBmaWxsTGVuKTtcbiAgcmV0dXJuIGxlZnQgPyBzdHJpbmdGaWxsZXIgKyBTIDogUyArIHN0cmluZ0ZpbGxlcjtcbn07XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vY29yZS1qcy9tb2R1bGVzLyQuc3RyaW5nLXBhZC5qc1xuICoqIG1vZHVsZSBpZCA9IDM4MVxuICoqIG1vZHVsZSBjaHVua3MgPSAyNFxuICoqLyJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");

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

	eval("'use strict';\nvar $export = __webpack_require__(216)\n  , $pad    = __webpack_require__(381);\n\n$export($export.P, 'String', {\n  padRight: function padRight(maxLength /*, fillString = ' ' */){\n    return $pad(this, maxLength, arguments.length > 1 ? arguments[1] : undefined, false);\n  }\n});\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzgyLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvZXM3LnN0cmluZy5wYWQtcmlnaHQuanM/MTE0ZSJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vJC5leHBvcnQnKVxuICAsICRwYWQgICAgPSByZXF1aXJlKCcuLyQuc3RyaW5nLXBhZCcpO1xuXG4kZXhwb3J0KCRleHBvcnQuUCwgJ1N0cmluZycsIHtcbiAgcGFkUmlnaHQ6IGZ1bmN0aW9uIHBhZFJpZ2h0KG1heExlbmd0aCAvKiwgZmlsbFN0cmluZyA9ICcgJyAqLyl7XG4gICAgcmV0dXJuICRwYWQodGhpcywgbWF4TGVuZ3RoLCBhcmd1bWVudHMubGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IHVuZGVmaW5lZCwgZmFsc2UpO1xuICB9XG59KTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9jb3JlLWpzL21vZHVsZXMvZXM3LnN0cmluZy5wYWQtcmlnaHQuanNcbiAqKiBtb2R1bGUgaWQgPSAzODJcbiAqKiBtb2R1bGUgY2h1bmtzID0gMjRcbiAqKi8iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");

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

	eval("'use strict';\n// https://github.com/sebmarkbage/ecmascript-string-left-right-trim\n__webpack_require__(276)('trimLeft', function($trim){\n  return function trimLeft(){\n    return $trim(this, 1);\n  };\n});\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzgzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvZXM3LnN0cmluZy50cmltLWxlZnQuanM/MTgzNiJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG4vLyBodHRwczovL2dpdGh1Yi5jb20vc2VibWFya2JhZ2UvZWNtYXNjcmlwdC1zdHJpbmctbGVmdC1yaWdodC10cmltXG5yZXF1aXJlKCcuLyQuc3RyaW5nLXRyaW0nKSgndHJpbUxlZnQnLCBmdW5jdGlvbigkdHJpbSl7XG4gIHJldHVybiBmdW5jdGlvbiB0cmltTGVmdCgpe1xuICAgIHJldHVybiAkdHJpbSh0aGlzLCAxKTtcbiAgfTtcbn0pO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2NvcmUtanMvbW9kdWxlcy9lczcuc3RyaW5nLnRyaW0tbGVmdC5qc1xuICoqIG1vZHVsZSBpZCA9IDM4M1xuICoqIG1vZHVsZSBjaHVua3MgPSAyNFxuICoqLyJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=");

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

	eval("'use strict';\n// https://github.com/sebmarkbage/ecmascript-string-left-right-trim\n__webpack_require__(276)('trimRight', function($trim){\n  return function trimRight(){\n    return $trim(this, 2);\n  };\n});\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzg0LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvZXM3LnN0cmluZy50cmltLXJpZ2h0LmpzPzU0MWQiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuLy8gaHR0cHM6Ly9naXRodWIuY29tL3NlYm1hcmtiYWdlL2VjbWFzY3JpcHQtc3RyaW5nLWxlZnQtcmlnaHQtdHJpbVxucmVxdWlyZSgnLi8kLnN0cmluZy10cmltJykoJ3RyaW1SaWdodCcsIGZ1bmN0aW9uKCR0cmltKXtcbiAgcmV0dXJuIGZ1bmN0aW9uIHRyaW1SaWdodCgpe1xuICAgIHJldHVybiAkdHJpbSh0aGlzLCAyKTtcbiAgfTtcbn0pO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2NvcmUtanMvbW9kdWxlcy9lczcuc3RyaW5nLnRyaW0tcmlnaHQuanNcbiAqKiBtb2R1bGUgaWQgPSAzODRcbiAqKiBtb2R1bGUgY2h1bmtzID0gMjRcbiAqKi8iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");

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

	eval("// https://github.com/benjamingr/RexExp.escape\nvar $export = __webpack_require__(216)\n  , $re     = __webpack_require__(386)(/[\\\\^$*+?.()|[\\]{}]/g, '\\\\$&');\n\n$export($export.S, 'RegExp', {escape: function escape(it){ return $re(it); }});\n\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzg1LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvZXM3LnJlZ2V4cC5lc2NhcGUuanM/N2Y0ZCJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBodHRwczovL2dpdGh1Yi5jb20vYmVuamFtaW5nci9SZXhFeHAuZXNjYXBlXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vJC5leHBvcnQnKVxuICAsICRyZSAgICAgPSByZXF1aXJlKCcuLyQucmVwbGFjZXInKSgvW1xcXFxeJCorPy4oKXxbXFxde31dL2csICdcXFxcJCYnKTtcblxuJGV4cG9ydCgkZXhwb3J0LlMsICdSZWdFeHAnLCB7ZXNjYXBlOiBmdW5jdGlvbiBlc2NhcGUoaXQpeyByZXR1cm4gJHJlKGl0KTsgfX0pO1xuXG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vY29yZS1qcy9tb2R1bGVzL2VzNy5yZWdleHAuZXNjYXBlLmpzXG4gKiogbW9kdWxlIGlkID0gMzg1XG4gKiogbW9kdWxlIGNodW5rcyA9IDI0XG4gKiovIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==");

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

	eval("module.exports = function(regExp, replace){\n  var replacer = replace === Object(replace) ? function(part){\n    return replace[part];\n  } : replace;\n  return function(it){\n    return String(it).replace(regExp, replacer);\n  };\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzg2LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvJC5yZXBsYWNlci5qcz83NjJmIl0sInNvdXJjZXNDb250ZW50IjpbIm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24ocmVnRXhwLCByZXBsYWNlKXtcbiAgdmFyIHJlcGxhY2VyID0gcmVwbGFjZSA9PT0gT2JqZWN0KHJlcGxhY2UpID8gZnVuY3Rpb24ocGFydCl7XG4gICAgcmV0dXJuIHJlcGxhY2VbcGFydF07XG4gIH0gOiByZXBsYWNlO1xuICByZXR1cm4gZnVuY3Rpb24oaXQpe1xuICAgIHJldHVybiBTdHJpbmcoaXQpLnJlcGxhY2UocmVnRXhwLCByZXBsYWNlcik7XG4gIH07XG59O1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2NvcmUtanMvbW9kdWxlcy8kLnJlcGxhY2VyLmpzXG4gKiogbW9kdWxlIGlkID0gMzg2XG4gKiogbW9kdWxlIGNodW5rcyA9IDI0XG4gKiovIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");

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

	eval("// https://gist.github.com/WebReflection/9353781\nvar $          = __webpack_require__(215)\n  , $export    = __webpack_require__(216)\n  , ownKeys    = __webpack_require__(374)\n  , toIObject  = __webpack_require__(236)\n  , createDesc = __webpack_require__(220);\n\n$export($export.S, 'Object', {\n  getOwnPropertyDescriptors: function getOwnPropertyDescriptors(object){\n    var O       = toIObject(object)\n      , setDesc = $.setDesc\n      , getDesc = $.getDesc\n      , keys    = ownKeys(O)\n      , result  = {}\n      , i       = 0\n      , key, D;\n    while(keys.length > i){\n      D = getDesc(O, key = keys[i++]);\n      if(key in result)setDesc(result, key, createDesc(0, D));\n      else result[key] = D;\n    } return result;\n  }\n});\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzg3LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvZXM3Lm9iamVjdC5nZXQtb3duLXByb3BlcnR5LWRlc2NyaXB0b3JzLmpzP2E3NzAiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gaHR0cHM6Ly9naXN0LmdpdGh1Yi5jb20vV2ViUmVmbGVjdGlvbi85MzUzNzgxXG52YXIgJCAgICAgICAgICA9IHJlcXVpcmUoJy4vJCcpXG4gICwgJGV4cG9ydCAgICA9IHJlcXVpcmUoJy4vJC5leHBvcnQnKVxuICAsIG93bktleXMgICAgPSByZXF1aXJlKCcuLyQub3duLWtleXMnKVxuICAsIHRvSU9iamVjdCAgPSByZXF1aXJlKCcuLyQudG8taW9iamVjdCcpXG4gICwgY3JlYXRlRGVzYyA9IHJlcXVpcmUoJy4vJC5wcm9wZXJ0eS1kZXNjJyk7XG5cbiRleHBvcnQoJGV4cG9ydC5TLCAnT2JqZWN0Jywge1xuICBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzOiBmdW5jdGlvbiBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCl7XG4gICAgdmFyIE8gICAgICAgPSB0b0lPYmplY3Qob2JqZWN0KVxuICAgICAgLCBzZXREZXNjID0gJC5zZXREZXNjXG4gICAgICAsIGdldERlc2MgPSAkLmdldERlc2NcbiAgICAgICwga2V5cyAgICA9IG93bktleXMoTylcbiAgICAgICwgcmVzdWx0ICA9IHt9XG4gICAgICAsIGkgICAgICAgPSAwXG4gICAgICAsIGtleSwgRDtcbiAgICB3aGlsZShrZXlzLmxlbmd0aCA+IGkpe1xuICAgICAgRCA9IGdldERlc2MoTywga2V5ID0ga2V5c1tpKytdKTtcbiAgICAgIGlmKGtleSBpbiByZXN1bHQpc2V0RGVzYyhyZXN1bHQsIGtleSwgY3JlYXRlRGVzYygwLCBEKSk7XG4gICAgICBlbHNlIHJlc3VsdFtrZXldID0gRDtcbiAgICB9IHJldHVybiByZXN1bHQ7XG4gIH1cbn0pO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2NvcmUtanMvbW9kdWxlcy9lczcub2JqZWN0LmdldC1vd24tcHJvcGVydHktZGVzY3JpcHRvcnMuanNcbiAqKiBtb2R1bGUgaWQgPSAzODdcbiAqKiBtb2R1bGUgY2h1bmtzID0gMjRcbiAqKi8iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=");

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

	eval("// http://goo.gl/XkBrjD\nvar $export = __webpack_require__(216)\n  , $values = __webpack_require__(389)(false);\n\n$export($export.S, 'Object', {\n  values: function values(it){\n    return $values(it);\n  }\n});\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzg4LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvZXM3Lm9iamVjdC52YWx1ZXMuanM/NWQ3MiJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBodHRwOi8vZ29vLmdsL1hrQnJqRFxudmFyICRleHBvcnQgPSByZXF1aXJlKCcuLyQuZXhwb3J0JylcbiAgLCAkdmFsdWVzID0gcmVxdWlyZSgnLi8kLm9iamVjdC10by1hcnJheScpKGZhbHNlKTtcblxuJGV4cG9ydCgkZXhwb3J0LlMsICdPYmplY3QnLCB7XG4gIHZhbHVlczogZnVuY3Rpb24gdmFsdWVzKGl0KXtcbiAgICByZXR1cm4gJHZhbHVlcyhpdCk7XG4gIH1cbn0pO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2NvcmUtanMvbW9kdWxlcy9lczcub2JqZWN0LnZhbHVlcy5qc1xuICoqIG1vZHVsZSBpZCA9IDM4OFxuICoqIG1vZHVsZSBjaHVua3MgPSAyNFxuICoqLyJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");

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

	eval("var $         = __webpack_require__(215)\n  , toIObject = __webpack_require__(236)\n  , isEnum    = $.isEnum;\nmodule.exports = function(isEntries){\n  return function(it){\n    var O      = toIObject(it)\n      , keys   = $.getKeys(O)\n      , length = keys.length\n      , i      = 0\n      , result = []\n      , key;\n    while(length > i)if(isEnum.call(O, key = keys[i++])){\n      result.push(isEntries ? [key, O[key]] : O[key]);\n    } return result;\n  };\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzg5LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvJC5vYmplY3QtdG8tYXJyYXkuanM/Nzg4OSJdLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgJCAgICAgICAgID0gcmVxdWlyZSgnLi8kJylcbiAgLCB0b0lPYmplY3QgPSByZXF1aXJlKCcuLyQudG8taW9iamVjdCcpXG4gICwgaXNFbnVtICAgID0gJC5pc0VudW07XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGlzRW50cmllcyl7XG4gIHJldHVybiBmdW5jdGlvbihpdCl7XG4gICAgdmFyIE8gICAgICA9IHRvSU9iamVjdChpdClcbiAgICAgICwga2V5cyAgID0gJC5nZXRLZXlzKE8pXG4gICAgICAsIGxlbmd0aCA9IGtleXMubGVuZ3RoXG4gICAgICAsIGkgICAgICA9IDBcbiAgICAgICwgcmVzdWx0ID0gW11cbiAgICAgICwga2V5O1xuICAgIHdoaWxlKGxlbmd0aCA+IGkpaWYoaXNFbnVtLmNhbGwoTywga2V5ID0ga2V5c1tpKytdKSl7XG4gICAgICByZXN1bHQucHVzaChpc0VudHJpZXMgPyBba2V5LCBPW2tleV1dIDogT1trZXldKTtcbiAgICB9IHJldHVybiByZXN1bHQ7XG4gIH07XG59O1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2NvcmUtanMvbW9kdWxlcy8kLm9iamVjdC10by1hcnJheS5qc1xuICoqIG1vZHVsZSBpZCA9IDM4OVxuICoqIG1vZHVsZSBjaHVua3MgPSAyNFxuICoqLyJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=");

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

	eval("// http://goo.gl/XkBrjD\nvar $export  = __webpack_require__(216)\n  , $entries = __webpack_require__(389)(true);\n\n$export($export.S, 'Object', {\n  entries: function entries(it){\n    return $entries(it);\n  }\n});\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzkwLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvZXM3Lm9iamVjdC5lbnRyaWVzLmpzPzU1YTkiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gaHR0cDovL2dvby5nbC9Ya0JyakRcbnZhciAkZXhwb3J0ICA9IHJlcXVpcmUoJy4vJC5leHBvcnQnKVxuICAsICRlbnRyaWVzID0gcmVxdWlyZSgnLi8kLm9iamVjdC10by1hcnJheScpKHRydWUpO1xuXG4kZXhwb3J0KCRleHBvcnQuUywgJ09iamVjdCcsIHtcbiAgZW50cmllczogZnVuY3Rpb24gZW50cmllcyhpdCl7XG4gICAgcmV0dXJuICRlbnRyaWVzKGl0KTtcbiAgfVxufSk7XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vY29yZS1qcy9tb2R1bGVzL2VzNy5vYmplY3QuZW50cmllcy5qc1xuICoqIG1vZHVsZSBpZCA9IDM5MFxuICoqIG1vZHVsZSBjaHVua3MgPSAyNFxuICoqLyJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");

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

	eval("// https://github.com/DavidBruant/Map-Set.prototype.toJSON\nvar $export  = __webpack_require__(216);\n\n$export($export.P, 'Map', {toJSON: __webpack_require__(392)('Map')});\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzkxLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvZXM3Lm1hcC50by1qc29uLmpzPzAyMDMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gaHR0cHM6Ly9naXRodWIuY29tL0RhdmlkQnJ1YW50L01hcC1TZXQucHJvdG90eXBlLnRvSlNPTlxudmFyICRleHBvcnQgID0gcmVxdWlyZSgnLi8kLmV4cG9ydCcpO1xuXG4kZXhwb3J0KCRleHBvcnQuUCwgJ01hcCcsIHt0b0pTT046IHJlcXVpcmUoJy4vJC5jb2xsZWN0aW9uLXRvLWpzb24nKSgnTWFwJyl9KTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9jb3JlLWpzL21vZHVsZXMvZXM3Lm1hcC50by1qc29uLmpzXG4gKiogbW9kdWxlIGlkID0gMzkxXG4gKiogbW9kdWxlIGNodW5rcyA9IDI0XG4gKiovIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");

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

	eval("// https://github.com/DavidBruant/Map-Set.prototype.toJSON\nvar forOf   = __webpack_require__(351)\n  , classof = __webpack_require__(260);\nmodule.exports = function(NAME){\n  return function toJSON(){\n    if(classof(this) != NAME)throw TypeError(NAME + \"#toJSON isn't generic\");\n    var arr = [];\n    forOf(this, false, arr.push, arr);\n    return arr;\n  };\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzkyLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvJC5jb2xsZWN0aW9uLXRvLWpzb24uanM/ZTNiNSJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBodHRwczovL2dpdGh1Yi5jb20vRGF2aWRCcnVhbnQvTWFwLVNldC5wcm90b3R5cGUudG9KU09OXG52YXIgZm9yT2YgICA9IHJlcXVpcmUoJy4vJC5mb3Itb2YnKVxuICAsIGNsYXNzb2YgPSByZXF1aXJlKCcuLyQuY2xhc3NvZicpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihOQU1FKXtcbiAgcmV0dXJuIGZ1bmN0aW9uIHRvSlNPTigpe1xuICAgIGlmKGNsYXNzb2YodGhpcykgIT0gTkFNRSl0aHJvdyBUeXBlRXJyb3IoTkFNRSArIFwiI3RvSlNPTiBpc24ndCBnZW5lcmljXCIpO1xuICAgIHZhciBhcnIgPSBbXTtcbiAgICBmb3JPZih0aGlzLCBmYWxzZSwgYXJyLnB1c2gsIGFycik7XG4gICAgcmV0dXJuIGFycjtcbiAgfTtcbn07XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vY29yZS1qcy9tb2R1bGVzLyQuY29sbGVjdGlvbi10by1qc29uLmpzXG4gKiogbW9kdWxlIGlkID0gMzkyXG4gKiogbW9kdWxlIGNodW5rcyA9IDI0XG4gKiovIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");

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

	eval("// https://github.com/DavidBruant/Map-Set.prototype.toJSON\nvar $export  = __webpack_require__(216);\n\n$export($export.P, 'Set', {toJSON: __webpack_require__(392)('Set')});\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzkzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvZXM3LnNldC50by1qc29uLmpzPzA4OGIiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gaHR0cHM6Ly9naXRodWIuY29tL0RhdmlkQnJ1YW50L01hcC1TZXQucHJvdG90eXBlLnRvSlNPTlxudmFyICRleHBvcnQgID0gcmVxdWlyZSgnLi8kLmV4cG9ydCcpO1xuXG4kZXhwb3J0KCRleHBvcnQuUCwgJ1NldCcsIHt0b0pTT046IHJlcXVpcmUoJy4vJC5jb2xsZWN0aW9uLXRvLWpzb24nKSgnU2V0Jyl9KTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9jb3JlLWpzL21vZHVsZXMvZXM3LnNldC50by1qc29uLmpzXG4gKiogbW9kdWxlIGlkID0gMzkzXG4gKiogbW9kdWxlIGNodW5rcyA9IDI0XG4gKiovIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");

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

	eval("// JavaScript 1.6 / Strawman array statics shim\nvar $       = __webpack_require__(215)\n  , $export = __webpack_require__(216)\n  , $ctx    = __webpack_require__(225)\n  , $Array  = __webpack_require__(218).Array || Array\n  , statics = {};\nvar setStatics = function(keys, length){\n  $.each.call(keys.split(','), function(key){\n    if(length == undefined && key in $Array)statics[key] = $Array[key];\n    else if(key in [])statics[key] = $ctx(Function.call, [][key], length);\n  });\n};\nsetStatics('pop,reverse,shift,keys,values,entries', 1);\nsetStatics('indexOf,every,some,forEach,map,filter,find,findIndex,includes', 3);\nsetStatics('join,slice,concat,push,splice,unshift,sort,lastIndexOf,' +\n           'reduce,reduceRight,copyWithin,fill');\n$export($export.S, 'Array', statics);\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzk0LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvanMuYXJyYXkuc3RhdGljcy5qcz80YWE0Il0sInNvdXJjZXNDb250ZW50IjpbIi8vIEphdmFTY3JpcHQgMS42IC8gU3RyYXdtYW4gYXJyYXkgc3RhdGljcyBzaGltXG52YXIgJCAgICAgICA9IHJlcXVpcmUoJy4vJCcpXG4gICwgJGV4cG9ydCA9IHJlcXVpcmUoJy4vJC5leHBvcnQnKVxuICAsICRjdHggICAgPSByZXF1aXJlKCcuLyQuY3R4JylcbiAgLCAkQXJyYXkgID0gcmVxdWlyZSgnLi8kLmNvcmUnKS5BcnJheSB8fCBBcnJheVxuICAsIHN0YXRpY3MgPSB7fTtcbnZhciBzZXRTdGF0aWNzID0gZnVuY3Rpb24oa2V5cywgbGVuZ3RoKXtcbiAgJC5lYWNoLmNhbGwoa2V5cy5zcGxpdCgnLCcpLCBmdW5jdGlvbihrZXkpe1xuICAgIGlmKGxlbmd0aCA9PSB1bmRlZmluZWQgJiYga2V5IGluICRBcnJheSlzdGF0aWNzW2tleV0gPSAkQXJyYXlba2V5XTtcbiAgICBlbHNlIGlmKGtleSBpbiBbXSlzdGF0aWNzW2tleV0gPSAkY3R4KEZ1bmN0aW9uLmNhbGwsIFtdW2tleV0sIGxlbmd0aCk7XG4gIH0pO1xufTtcbnNldFN0YXRpY3MoJ3BvcCxyZXZlcnNlLHNoaWZ0LGtleXMsdmFsdWVzLGVudHJpZXMnLCAxKTtcbnNldFN0YXRpY3MoJ2luZGV4T2YsZXZlcnksc29tZSxmb3JFYWNoLG1hcCxmaWx0ZXIsZmluZCxmaW5kSW5kZXgsaW5jbHVkZXMnLCAzKTtcbnNldFN0YXRpY3MoJ2pvaW4sc2xpY2UsY29uY2F0LHB1c2gsc3BsaWNlLHVuc2hpZnQsc29ydCxsYXN0SW5kZXhPZiwnICtcbiAgICAgICAgICAgJ3JlZHVjZSxyZWR1Y2VSaWdodCxjb3B5V2l0aGluLGZpbGwnKTtcbiRleHBvcnQoJGV4cG9ydC5TLCAnQXJyYXknLCBzdGF0aWNzKTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9jb3JlLWpzL21vZHVsZXMvanMuYXJyYXkuc3RhdGljcy5qc1xuICoqIG1vZHVsZSBpZCA9IDM5NFxuICoqIG1vZHVsZSBjaHVua3MgPSAyNFxuICoqLyJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==");

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

	eval("// ie9- setTimeout & setInterval additional parameters fix\nvar global     = __webpack_require__(217)\n  , $export    = __webpack_require__(216)\n  , invoke     = __webpack_require__(232)\n  , partial    = __webpack_require__(396)\n  , navigator  = global.navigator\n  , MSIE       = !!navigator && /MSIE .\\./.test(navigator.userAgent); // <- dirty ie9- check\nvar wrap = function(set){\n  return MSIE ? function(fn, time /*, ...args */){\n    return set(invoke(\n      partial,\n      [].slice.call(arguments, 2),\n      typeof fn == 'function' ? fn : Function(fn)\n    ), time);\n  } : set;\n};\n$export($export.G + $export.B + $export.F * MSIE, {\n  setTimeout:  wrap(global.setTimeout),\n  setInterval: wrap(global.setInterval)\n});\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzk1LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvd2ViLnRpbWVycy5qcz8wMjJiIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIGllOS0gc2V0VGltZW91dCAmIHNldEludGVydmFsIGFkZGl0aW9uYWwgcGFyYW1ldGVycyBmaXhcbnZhciBnbG9iYWwgICAgID0gcmVxdWlyZSgnLi8kLmdsb2JhbCcpXG4gICwgJGV4cG9ydCAgICA9IHJlcXVpcmUoJy4vJC5leHBvcnQnKVxuICAsIGludm9rZSAgICAgPSByZXF1aXJlKCcuLyQuaW52b2tlJylcbiAgLCBwYXJ0aWFsICAgID0gcmVxdWlyZSgnLi8kLnBhcnRpYWwnKVxuICAsIG5hdmlnYXRvciAgPSBnbG9iYWwubmF2aWdhdG9yXG4gICwgTVNJRSAgICAgICA9ICEhbmF2aWdhdG9yICYmIC9NU0lFIC5cXC4vLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCk7IC8vIDwtIGRpcnR5IGllOS0gY2hlY2tcbnZhciB3cmFwID0gZnVuY3Rpb24oc2V0KXtcbiAgcmV0dXJuIE1TSUUgPyBmdW5jdGlvbihmbiwgdGltZSAvKiwgLi4uYXJncyAqLyl7XG4gICAgcmV0dXJuIHNldChpbnZva2UoXG4gICAgICBwYXJ0aWFsLFxuICAgICAgW10uc2xpY2UuY2FsbChhcmd1bWVudHMsIDIpLFxuICAgICAgdHlwZW9mIGZuID09ICdmdW5jdGlvbicgPyBmbiA6IEZ1bmN0aW9uKGZuKVxuICAgICksIHRpbWUpO1xuICB9IDogc2V0O1xufTtcbiRleHBvcnQoJGV4cG9ydC5HICsgJGV4cG9ydC5CICsgJGV4cG9ydC5GICogTVNJRSwge1xuICBzZXRUaW1lb3V0OiAgd3JhcChnbG9iYWwuc2V0VGltZW91dCksXG4gIHNldEludGVydmFsOiB3cmFwKGdsb2JhbC5zZXRJbnRlcnZhbClcbn0pO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2NvcmUtanMvbW9kdWxlcy93ZWIudGltZXJzLmpzXG4gKiogbW9kdWxlIGlkID0gMzk1XG4gKiogbW9kdWxlIGNodW5rcyA9IDI0XG4gKiovIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");

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

	eval("'use strict';\nvar path      = __webpack_require__(397)\n  , invoke    = __webpack_require__(232)\n  , aFunction = __webpack_require__(226);\nmodule.exports = function(/* ...pargs */){\n  var fn     = aFunction(this)\n    , length = arguments.length\n    , pargs  = Array(length)\n    , i      = 0\n    , _      = path._\n    , holder = false;\n  while(length > i)if((pargs[i] = arguments[i++]) === _)holder = true;\n  return function(/* ...args */){\n    var that  = this\n      , $$    = arguments\n      , $$len = $$.length\n      , j = 0, k = 0, args;\n    if(!holder && !$$len)return invoke(fn, pargs, that);\n    args = pargs.slice();\n    if(holder)for(;length > j; j++)if(args[j] === _)args[j] = $$[k++];\n    while($$len > k)args.push($$[k++]);\n    return invoke(fn, args, that);\n  };\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzk2LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvJC5wYXJ0aWFsLmpzPzEyNzUiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xudmFyIHBhdGggICAgICA9IHJlcXVpcmUoJy4vJC5wYXRoJylcbiAgLCBpbnZva2UgICAgPSByZXF1aXJlKCcuLyQuaW52b2tlJylcbiAgLCBhRnVuY3Rpb24gPSByZXF1aXJlKCcuLyQuYS1mdW5jdGlvbicpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbigvKiAuLi5wYXJncyAqLyl7XG4gIHZhciBmbiAgICAgPSBhRnVuY3Rpb24odGhpcylcbiAgICAsIGxlbmd0aCA9IGFyZ3VtZW50cy5sZW5ndGhcbiAgICAsIHBhcmdzICA9IEFycmF5KGxlbmd0aClcbiAgICAsIGkgICAgICA9IDBcbiAgICAsIF8gICAgICA9IHBhdGguX1xuICAgICwgaG9sZGVyID0gZmFsc2U7XG4gIHdoaWxlKGxlbmd0aCA+IGkpaWYoKHBhcmdzW2ldID0gYXJndW1lbnRzW2krK10pID09PSBfKWhvbGRlciA9IHRydWU7XG4gIHJldHVybiBmdW5jdGlvbigvKiAuLi5hcmdzICovKXtcbiAgICB2YXIgdGhhdCAgPSB0aGlzXG4gICAgICAsICQkICAgID0gYXJndW1lbnRzXG4gICAgICAsICQkbGVuID0gJCQubGVuZ3RoXG4gICAgICAsIGogPSAwLCBrID0gMCwgYXJncztcbiAgICBpZighaG9sZGVyICYmICEkJGxlbilyZXR1cm4gaW52b2tlKGZuLCBwYXJncywgdGhhdCk7XG4gICAgYXJncyA9IHBhcmdzLnNsaWNlKCk7XG4gICAgaWYoaG9sZGVyKWZvcig7bGVuZ3RoID4gajsgaisrKWlmKGFyZ3Nbal0gPT09IF8pYXJnc1tqXSA9ICQkW2srK107XG4gICAgd2hpbGUoJCRsZW4gPiBrKWFyZ3MucHVzaCgkJFtrKytdKTtcbiAgICByZXR1cm4gaW52b2tlKGZuLCBhcmdzLCB0aGF0KTtcbiAgfTtcbn07XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vY29yZS1qcy9tb2R1bGVzLyQucGFydGlhbC5qc1xuICoqIG1vZHVsZSBpZCA9IDM5NlxuICoqIG1vZHVsZSBjaHVua3MgPSAyNFxuICoqLyJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");

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

	eval("module.exports = __webpack_require__(217);\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzk3LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvJC5wYXRoLmpzPzRhMWUiXSwic291cmNlc0NvbnRlbnQiOlsibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuLyQuZ2xvYmFsJyk7XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vY29yZS1qcy9tb2R1bGVzLyQucGF0aC5qc1xuICoqIG1vZHVsZSBpZCA9IDM5N1xuICoqIG1vZHVsZSBjaHVua3MgPSAyNFxuICoqLyJdLCJtYXBwaW5ncyI6IkFBQUEiLCJzb3VyY2VSb290IjoiIn0=");

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

	eval("var $export = __webpack_require__(216)\n  , $task   = __webpack_require__(354);\n$export($export.G + $export.B, {\n  setImmediate:   $task.set,\n  clearImmediate: $task.clear\n});\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzk4LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvd2ViLmltbWVkaWF0ZS5qcz9mOTNjIl0sInNvdXJjZXNDb250ZW50IjpbInZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi8kLmV4cG9ydCcpXG4gICwgJHRhc2sgICA9IHJlcXVpcmUoJy4vJC50YXNrJyk7XG4kZXhwb3J0KCRleHBvcnQuRyArICRleHBvcnQuQiwge1xuICBzZXRJbW1lZGlhdGU6ICAgJHRhc2suc2V0LFxuICBjbGVhckltbWVkaWF0ZTogJHRhc2suY2xlYXJcbn0pO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2NvcmUtanMvbW9kdWxlcy93ZWIuaW1tZWRpYXRlLmpzXG4gKiogbW9kdWxlIGlkID0gMzk4XG4gKiogbW9kdWxlIGNodW5rcyA9IDI0XG4gKiovIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=");

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

	eval("__webpack_require__(330);\nvar global      = __webpack_require__(217)\n  , hide        = __webpack_require__(219)\n  , Iterators   = __webpack_require__(313)\n  , ITERATOR    = __webpack_require__(244)('iterator')\n  , NL          = global.NodeList\n  , HTC         = global.HTMLCollection\n  , NLProto     = NL && NL.prototype\n  , HTCProto    = HTC && HTC.prototype\n  , ArrayValues = Iterators.NodeList = Iterators.HTMLCollection = Iterators.Array;\nif(NLProto && !NLProto[ITERATOR])hide(NLProto, ITERATOR, ArrayValues);\nif(HTCProto && !HTCProto[ITERATOR])hide(HTCProto, ITERATOR, ArrayValues);\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzk5LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL21vZHVsZXMvd2ViLmRvbS5pdGVyYWJsZS5qcz82NzVjIl0sInNvdXJjZXNDb250ZW50IjpbInJlcXVpcmUoJy4vZXM2LmFycmF5Lml0ZXJhdG9yJyk7XG52YXIgZ2xvYmFsICAgICAgPSByZXF1aXJlKCcuLyQuZ2xvYmFsJylcbiAgLCBoaWRlICAgICAgICA9IHJlcXVpcmUoJy4vJC5oaWRlJylcbiAgLCBJdGVyYXRvcnMgICA9IHJlcXVpcmUoJy4vJC5pdGVyYXRvcnMnKVxuICAsIElURVJBVE9SICAgID0gcmVxdWlyZSgnLi8kLndrcycpKCdpdGVyYXRvcicpXG4gICwgTkwgICAgICAgICAgPSBnbG9iYWwuTm9kZUxpc3RcbiAgLCBIVEMgICAgICAgICA9IGdsb2JhbC5IVE1MQ29sbGVjdGlvblxuICAsIE5MUHJvdG8gICAgID0gTkwgJiYgTkwucHJvdG90eXBlXG4gICwgSFRDUHJvdG8gICAgPSBIVEMgJiYgSFRDLnByb3RvdHlwZVxuICAsIEFycmF5VmFsdWVzID0gSXRlcmF0b3JzLk5vZGVMaXN0ID0gSXRlcmF0b3JzLkhUTUxDb2xsZWN0aW9uID0gSXRlcmF0b3JzLkFycmF5O1xuaWYoTkxQcm90byAmJiAhTkxQcm90b1tJVEVSQVRPUl0paGlkZShOTFByb3RvLCBJVEVSQVRPUiwgQXJyYXlWYWx1ZXMpO1xuaWYoSFRDUHJvdG8gJiYgIUhUQ1Byb3RvW0lURVJBVE9SXSloaWRlKEhUQ1Byb3RvLCBJVEVSQVRPUiwgQXJyYXlWYWx1ZXMpO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2NvcmUtanMvbW9kdWxlcy93ZWIuZG9tLml0ZXJhYmxlLmpzXG4gKiogbW9kdWxlIGlkID0gMzk5XG4gKiogbW9kdWxlIGNodW5rcyA9IDI0XG4gKiovIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=");

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

	eval("/* WEBPACK VAR INJECTION */(function(global, process) {/**\n * Copyright (c) 2014, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * https://raw.github.com/facebook/regenerator/master/LICENSE file. An\n * additional grant of patent rights can be found in the PATENTS file in\n * the same directory.\n */\n\n!(function(global) {\n  \"use strict\";\n\n  var hasOwn = Object.prototype.hasOwnProperty;\n  var undefined; // More compressible than void 0.\n  var iteratorSymbol =\n    typeof Symbol === \"function\" && Symbol.iterator || \"@@iterator\";\n\n  var inModule = typeof module === \"object\";\n  var runtime = global.regeneratorRuntime;\n  if (runtime) {\n    if (inModule) {\n      // If regeneratorRuntime is defined globally and we're in a module,\n      // make the exports object identical to regeneratorRuntime.\n      module.exports = runtime;\n    }\n    // Don't bother evaluating the rest of this file if the runtime was\n    // already defined globally.\n    return;\n  }\n\n  // Define the runtime globally (as expected by generated code) as either\n  // module.exports (if we're in a module) or a new, empty object.\n  runtime = global.regeneratorRuntime = inModule ? module.exports : {};\n\n  function wrap(innerFn, outerFn, self, tryLocsList) {\n    // If outerFn provided, then outerFn.prototype instanceof Generator.\n    var generator = Object.create((outerFn || Generator).prototype);\n    var context = new Context(tryLocsList || []);\n\n    // The ._invoke method unifies the implementations of the .next,\n    // .throw, and .return methods.\n    generator._invoke = makeInvokeMethod(innerFn, self, context);\n\n    return generator;\n  }\n  runtime.wrap = wrap;\n\n  // Try/catch helper to minimize deoptimizations. Returns a completion\n  // record like context.tryEntries[i].completion. This interface could\n  // have been (and was previously) designed to take a closure to be\n  // invoked without arguments, but in all the cases we care about we\n  // already have an existing method we want to call, so there's no need\n  // to create a new function object. We can even get away with assuming\n  // the method takes exactly one argument, since that happens to be true\n  // in every case, so we don't have to touch the arguments object. The\n  // only additional allocation required is the completion record, which\n  // has a stable shape and so hopefully should be cheap to allocate.\n  function tryCatch(fn, obj, arg) {\n    try {\n      return { type: \"normal\", arg: fn.call(obj, arg) };\n    } catch (err) {\n      return { type: \"throw\", arg: err };\n    }\n  }\n\n  var GenStateSuspendedStart = \"suspendedStart\";\n  var GenStateSuspendedYield = \"suspendedYield\";\n  var GenStateExecuting = \"executing\";\n  var GenStateCompleted = \"completed\";\n\n  // Returning this object from the innerFn has the same effect as\n  // breaking out of the dispatch switch statement.\n  var ContinueSentinel = {};\n\n  // Dummy constructor functions that we use as the .constructor and\n  // .constructor.prototype properties for functions that return Generator\n  // objects. For full spec compliance, you may wish to configure your\n  // minifier not to mangle the names of these two functions.\n  function Generator() {}\n  function GeneratorFunction() {}\n  function GeneratorFunctionPrototype() {}\n\n  var Gp = GeneratorFunctionPrototype.prototype = Generator.prototype;\n  GeneratorFunction.prototype = Gp.constructor = GeneratorFunctionPrototype;\n  GeneratorFunctionPrototype.constructor = GeneratorFunction;\n  GeneratorFunction.displayName = \"GeneratorFunction\";\n\n  // Helper for defining the .next, .throw, and .return methods of the\n  // Iterator interface in terms of a single ._invoke method.\n  function defineIteratorMethods(prototype) {\n    [\"next\", \"throw\", \"return\"].forEach(function(method) {\n      prototype[method] = function(arg) {\n        return this._invoke(method, arg);\n      };\n    });\n  }\n\n  runtime.isGeneratorFunction = function(genFun) {\n    var ctor = typeof genFun === \"function\" && genFun.constructor;\n    return ctor\n      ? ctor === GeneratorFunction ||\n        // For the native GeneratorFunction constructor, the best we can\n        // do is to check its .name property.\n        (ctor.displayName || ctor.name) === \"GeneratorFunction\"\n      : false;\n  };\n\n  runtime.mark = function(genFun) {\n    if (Object.setPrototypeOf) {\n      Object.setPrototypeOf(genFun, GeneratorFunctionPrototype);\n    } else {\n      genFun.__proto__ = GeneratorFunctionPrototype;\n    }\n    genFun.prototype = Object.create(Gp);\n    return genFun;\n  };\n\n  // Within the body of any async function, `await x` is transformed to\n  // `yield regeneratorRuntime.awrap(x)`, so that the runtime can test\n  // `value instanceof AwaitArgument` to determine if the yielded value is\n  // meant to be awaited. Some may consider the name of this method too\n  // cutesy, but they are curmudgeons.\n  runtime.awrap = function(arg) {\n    return new AwaitArgument(arg);\n  };\n\n  function AwaitArgument(arg) {\n    this.arg = arg;\n  }\n\n  function AsyncIterator(generator) {\n    // This invoke function is written in a style that assumes some\n    // calling function (or Promise) will handle exceptions.\n    function invoke(method, arg) {\n      var result = generator[method](arg);\n      var value = result.value;\n      return value instanceof AwaitArgument\n        ? Promise.resolve(value.arg).then(invokeNext, invokeThrow)\n        : Promise.resolve(value).then(function(unwrapped) {\n            // When a yielded Promise is resolved, its final value becomes\n            // the .value of the Promise<{value,done}> result for the\n            // current iteration. If the Promise is rejected, however, the\n            // result for this iteration will be rejected with the same\n            // reason. Note that rejections of yielded Promises are not\n            // thrown back into the generator function, as is the case\n            // when an awaited Promise is rejected. This difference in\n            // behavior between yield and await is important, because it\n            // allows the consumer to decide what to do with the yielded\n            // rejection (swallow it and continue, manually .throw it back\n            // into the generator, abandon iteration, whatever). With\n            // await, by contrast, there is no opportunity to examine the\n            // rejection reason outside the generator function, so the\n            // only option is to throw it from the await expression, and\n            // let the generator function handle the exception.\n            result.value = unwrapped;\n            return result;\n          });\n    }\n\n    if (typeof process === \"object\" && process.domain) {\n      invoke = process.domain.bind(invoke);\n    }\n\n    var invokeNext = invoke.bind(generator, \"next\");\n    var invokeThrow = invoke.bind(generator, \"throw\");\n    var invokeReturn = invoke.bind(generator, \"return\");\n    var previousPromise;\n\n    function enqueue(method, arg) {\n      function callInvokeWithMethodAndArg() {\n        return invoke(method, arg);\n      }\n\n      return previousPromise =\n        // If enqueue has been called before, then we want to wait until\n        // all previous Promises have been resolved before calling invoke,\n        // so that results are always delivered in the correct order. If\n        // enqueue has not been called before, then it is important to\n        // call invoke immediately, without waiting on a callback to fire,\n        // so that the async generator function has the opportunity to do\n        // any necessary setup in a predictable way. This predictability\n        // is why the Promise constructor synchronously invokes its\n        // executor callback, and why async functions synchronously\n        // execute code before the first await. Since we implement simple\n        // async functions in terms of async generators, it is especially\n        // important to get this right, even though it requires care.\n        previousPromise ? previousPromise.then(\n          callInvokeWithMethodAndArg,\n          // Avoid propagating failures to Promises returned by later\n          // invocations of the iterator.\n          callInvokeWithMethodAndArg\n        ) : new Promise(function (resolve) {\n          resolve(callInvokeWithMethodAndArg());\n        });\n    }\n\n    // Define the unified helper method that is used to implement .next,\n    // .throw, and .return (see defineIteratorMethods).\n    this._invoke = enqueue;\n  }\n\n  defineIteratorMethods(AsyncIterator.prototype);\n\n  // Note that simple async functions are implemented on top of\n  // AsyncIterator objects; they just return a Promise for the value of\n  // the final result produced by the iterator.\n  runtime.async = function(innerFn, outerFn, self, tryLocsList) {\n    var iter = new AsyncIterator(\n      wrap(innerFn, outerFn, self, tryLocsList)\n    );\n\n    return runtime.isGeneratorFunction(outerFn)\n      ? iter // If outerFn is a generator, return the full iterator.\n      : iter.next().then(function(result) {\n          return result.done ? result.value : iter.next();\n        });\n  };\n\n  function makeInvokeMethod(innerFn, self, context) {\n    var state = GenStateSuspendedStart;\n\n    return function invoke(method, arg) {\n      if (state === GenStateExecuting) {\n        throw new Error(\"Generator is already running\");\n      }\n\n      if (state === GenStateCompleted) {\n        if (method === \"throw\") {\n          throw arg;\n        }\n\n        // Be forgiving, per 25.3.3.3.3 of the spec:\n        // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-generatorresume\n        return doneResult();\n      }\n\n      while (true) {\n        var delegate = context.delegate;\n        if (delegate) {\n          if (method === \"return\" ||\n              (method === \"throw\" && delegate.iterator[method] === undefined)) {\n            // A return or throw (when the delegate iterator has no throw\n            // method) always terminates the yield* loop.\n            context.delegate = null;\n\n            // If the delegate iterator has a return method, give it a\n            // chance to clean up.\n            var returnMethod = delegate.iterator[\"return\"];\n            if (returnMethod) {\n              var record = tryCatch(returnMethod, delegate.iterator, arg);\n              if (record.type === \"throw\") {\n                // If the return method threw an exception, let that\n                // exception prevail over the original return or throw.\n                method = \"throw\";\n                arg = record.arg;\n                continue;\n              }\n            }\n\n            if (method === \"return\") {\n              // Continue with the outer return, now that the delegate\n              // iterator has been terminated.\n              continue;\n            }\n          }\n\n          var record = tryCatch(\n            delegate.iterator[method],\n            delegate.iterator,\n            arg\n          );\n\n          if (record.type === \"throw\") {\n            context.delegate = null;\n\n            // Like returning generator.throw(uncaught), but without the\n            // overhead of an extra function call.\n            method = \"throw\";\n            arg = record.arg;\n            continue;\n          }\n\n          // Delegate generator ran and handled its own exceptions so\n          // regardless of what the method was, we continue as if it is\n          // \"next\" with an undefined arg.\n          method = \"next\";\n          arg = undefined;\n\n          var info = record.arg;\n          if (info.done) {\n            context[delegate.resultName] = info.value;\n            context.next = delegate.nextLoc;\n          } else {\n            state = GenStateSuspendedYield;\n            return info;\n          }\n\n          context.delegate = null;\n        }\n\n        if (method === \"next\") {\n          context._sent = arg;\n\n          if (state === GenStateSuspendedYield) {\n            context.sent = arg;\n          } else {\n            context.sent = undefined;\n          }\n        } else if (method === \"throw\") {\n          if (state === GenStateSuspendedStart) {\n            state = GenStateCompleted;\n            throw arg;\n          }\n\n          if (context.dispatchException(arg)) {\n            // If the dispatched exception was caught by a catch block,\n            // then let that catch block handle the exception normally.\n            method = \"next\";\n            arg = undefined;\n          }\n\n        } else if (method === \"return\") {\n          context.abrupt(\"return\", arg);\n        }\n\n        state = GenStateExecuting;\n\n        var record = tryCatch(innerFn, self, context);\n        if (record.type === \"normal\") {\n          // If an exception is thrown from innerFn, we leave state ===\n          // GenStateExecuting and loop back for another invocation.\n          state = context.done\n            ? GenStateCompleted\n            : GenStateSuspendedYield;\n\n          var info = {\n            value: record.arg,\n            done: context.done\n          };\n\n          if (record.arg === ContinueSentinel) {\n            if (context.delegate && method === \"next\") {\n              // Deliberately forget the last sent value so that we don't\n              // accidentally pass it on to the delegate.\n              arg = undefined;\n            }\n          } else {\n            return info;\n          }\n\n        } else if (record.type === \"throw\") {\n          state = GenStateCompleted;\n          // Dispatch the exception by looping back around to the\n          // context.dispatchException(arg) call above.\n          method = \"throw\";\n          arg = record.arg;\n        }\n      }\n    };\n  }\n\n  // Define Generator.prototype.{next,throw,return} in terms of the\n  // unified ._invoke helper method.\n  defineIteratorMethods(Gp);\n\n  Gp[iteratorSymbol] = function() {\n    return this;\n  };\n\n  Gp.toString = function() {\n    return \"[object Generator]\";\n  };\n\n  function pushTryEntry(locs) {\n    var entry = { tryLoc: locs[0] };\n\n    if (1 in locs) {\n      entry.catchLoc = locs[1];\n    }\n\n    if (2 in locs) {\n      entry.finallyLoc = locs[2];\n      entry.afterLoc = locs[3];\n    }\n\n    this.tryEntries.push(entry);\n  }\n\n  function resetTryEntry(entry) {\n    var record = entry.completion || {};\n    record.type = \"normal\";\n    delete record.arg;\n    entry.completion = record;\n  }\n\n  function Context(tryLocsList) {\n    // The root entry object (effectively a try statement without a catch\n    // or a finally block) gives us a place to store values thrown from\n    // locations where there is no enclosing try statement.\n    this.tryEntries = [{ tryLoc: \"root\" }];\n    tryLocsList.forEach(pushTryEntry, this);\n    this.reset(true);\n  }\n\n  runtime.keys = function(object) {\n    var keys = [];\n    for (var key in object) {\n      keys.push(key);\n    }\n    keys.reverse();\n\n    // Rather than returning an object with a next method, we keep\n    // things simple and return the next function itself.\n    return function next() {\n      while (keys.length) {\n        var key = keys.pop();\n        if (key in object) {\n          next.value = key;\n          next.done = false;\n          return next;\n        }\n      }\n\n      // To avoid creating an additional object, we just hang the .value\n      // and .done properties off the next function object itself. This\n      // also ensures that the minifier will not anonymize the function.\n      next.done = true;\n      return next;\n    };\n  };\n\n  function values(iterable) {\n    if (iterable) {\n      var iteratorMethod = iterable[iteratorSymbol];\n      if (iteratorMethod) {\n        return iteratorMethod.call(iterable);\n      }\n\n      if (typeof iterable.next === \"function\") {\n        return iterable;\n      }\n\n      if (!isNaN(iterable.length)) {\n        var i = -1, next = function next() {\n          while (++i < iterable.length) {\n            if (hasOwn.call(iterable, i)) {\n              next.value = iterable[i];\n              next.done = false;\n              return next;\n            }\n          }\n\n          next.value = undefined;\n          next.done = true;\n\n          return next;\n        };\n\n        return next.next = next;\n      }\n    }\n\n    // Return an iterator with no values.\n    return { next: doneResult };\n  }\n  runtime.values = values;\n\n  function doneResult() {\n    return { value: undefined, done: true };\n  }\n\n  Context.prototype = {\n    constructor: Context,\n\n    reset: function(skipTempReset) {\n      this.prev = 0;\n      this.next = 0;\n      this.sent = undefined;\n      this.done = false;\n      this.delegate = null;\n\n      this.tryEntries.forEach(resetTryEntry);\n\n      if (!skipTempReset) {\n        for (var name in this) {\n          // Not sure about the optimal order of these conditions:\n          if (name.charAt(0) === \"t\" &&\n              hasOwn.call(this, name) &&\n              !isNaN(+name.slice(1))) {\n            this[name] = undefined;\n          }\n        }\n      }\n    },\n\n    stop: function() {\n      this.done = true;\n\n      var rootEntry = this.tryEntries[0];\n      var rootRecord = rootEntry.completion;\n      if (rootRecord.type === \"throw\") {\n        throw rootRecord.arg;\n      }\n\n      return this.rval;\n    },\n\n    dispatchException: function(exception) {\n      if (this.done) {\n        throw exception;\n      }\n\n      var context = this;\n      function handle(loc, caught) {\n        record.type = \"throw\";\n        record.arg = exception;\n        context.next = loc;\n        return !!caught;\n      }\n\n      for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n        var entry = this.tryEntries[i];\n        var record = entry.completion;\n\n        if (entry.tryLoc === \"root\") {\n          // Exception thrown outside of any try block that could handle\n          // it, so set the completion value of the entire function to\n          // throw the exception.\n          return handle(\"end\");\n        }\n\n        if (entry.tryLoc <= this.prev) {\n          var hasCatch = hasOwn.call(entry, \"catchLoc\");\n          var hasFinally = hasOwn.call(entry, \"finallyLoc\");\n\n          if (hasCatch && hasFinally) {\n            if (this.prev < entry.catchLoc) {\n              return handle(entry.catchLoc, true);\n            } else if (this.prev < entry.finallyLoc) {\n              return handle(entry.finallyLoc);\n            }\n\n          } else if (hasCatch) {\n            if (this.prev < entry.catchLoc) {\n              return handle(entry.catchLoc, true);\n            }\n\n          } else if (hasFinally) {\n            if (this.prev < entry.finallyLoc) {\n              return handle(entry.finallyLoc);\n            }\n\n          } else {\n            throw new Error(\"try statement without catch or finally\");\n          }\n        }\n      }\n    },\n\n    abrupt: function(type, arg) {\n      for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n        var entry = this.tryEntries[i];\n        if (entry.tryLoc <= this.prev &&\n            hasOwn.call(entry, \"finallyLoc\") &&\n            this.prev < entry.finallyLoc) {\n          var finallyEntry = entry;\n          break;\n        }\n      }\n\n      if (finallyEntry &&\n          (type === \"break\" ||\n           type === \"continue\") &&\n          finallyEntry.tryLoc <= arg &&\n          arg <= finallyEntry.finallyLoc) {\n        // Ignore the finally entry if control is not jumping to a\n        // location outside the try/catch block.\n        finallyEntry = null;\n      }\n\n      var record = finallyEntry ? finallyEntry.completion : {};\n      record.type = type;\n      record.arg = arg;\n\n      if (finallyEntry) {\n        this.next = finallyEntry.finallyLoc;\n      } else {\n        this.complete(record);\n      }\n\n      return ContinueSentinel;\n    },\n\n    complete: function(record, afterLoc) {\n      if (record.type === \"throw\") {\n        throw record.arg;\n      }\n\n      if (record.type === \"break\" ||\n          record.type === \"continue\") {\n        this.next = record.arg;\n      } else if (record.type === \"return\") {\n        this.rval = record.arg;\n        this.next = \"end\";\n      } else if (record.type === \"normal\" && afterLoc) {\n        this.next = afterLoc;\n      }\n    },\n\n    finish: function(finallyLoc) {\n      for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n        var entry = this.tryEntries[i];\n        if (entry.finallyLoc === finallyLoc) {\n          this.complete(entry.completion, entry.afterLoc);\n          resetTryEntry(entry);\n          return ContinueSentinel;\n        }\n      }\n    },\n\n    \"catch\": function(tryLoc) {\n      for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n        var entry = this.tryEntries[i];\n        if (entry.tryLoc === tryLoc) {\n          var record = entry.completion;\n          if (record.type === \"throw\") {\n            var thrown = record.arg;\n            resetTryEntry(entry);\n          }\n          return thrown;\n        }\n      }\n\n      // The context.catch method must only be called with a location\n      // argument that corresponds to a known catch block.\n      throw new Error(\"illegal catch attempt\");\n    },\n\n    delegateYield: function(iterable, resultName, nextLoc) {\n      this.delegate = {\n        iterator: values(iterable),\n        resultName: resultName,\n        nextLoc: nextLoc\n      };\n\n      return ContinueSentinel;\n    }\n  };\n})(\n  // Among the various tricks for obtaining a reference to the global\n  // object, this seems to be the most reliable technique that does not\n  // use indirect eval (which violates Content Security Policy).\n  typeof global === \"object\" ? global :\n  typeof window === \"object\" ? window :\n  typeof self === \"object\" ? self : this\n);\n\n/* WEBPACK VAR INJECTION */}.call(exports, (function() { return this; }()), __webpack_require__(401)))\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDAwLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1yZWdlbmVyYXRvci1ydW50aW1lL3J1bnRpbWUuanM/NTAxZSJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxNCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBodHRwczovL3Jhdy5naXRodWIuY29tL2ZhY2Vib29rL3JlZ2VuZXJhdG9yL21hc3Rlci9MSUNFTlNFIGZpbGUuIEFuXG4gKiBhZGRpdGlvbmFsIGdyYW50IG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW5cbiAqIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqL1xuXG4hKGZ1bmN0aW9uKGdsb2JhbCkge1xuICBcInVzZSBzdHJpY3RcIjtcblxuICB2YXIgaGFzT3duID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTtcbiAgdmFyIHVuZGVmaW5lZDsgLy8gTW9yZSBjb21wcmVzc2libGUgdGhhbiB2b2lkIDAuXG4gIHZhciBpdGVyYXRvclN5bWJvbCA9XG4gICAgdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIFN5bWJvbC5pdGVyYXRvciB8fCBcIkBAaXRlcmF0b3JcIjtcblxuICB2YXIgaW5Nb2R1bGUgPSB0eXBlb2YgbW9kdWxlID09PSBcIm9iamVjdFwiO1xuICB2YXIgcnVudGltZSA9IGdsb2JhbC5yZWdlbmVyYXRvclJ1bnRpbWU7XG4gIGlmIChydW50aW1lKSB7XG4gICAgaWYgKGluTW9kdWxlKSB7XG4gICAgICAvLyBJZiByZWdlbmVyYXRvclJ1bnRpbWUgaXMgZGVmaW5lZCBnbG9iYWxseSBhbmQgd2UncmUgaW4gYSBtb2R1bGUsXG4gICAgICAvLyBtYWtlIHRoZSBleHBvcnRzIG9iamVjdCBpZGVudGljYWwgdG8gcmVnZW5lcmF0b3JSdW50aW1lLlxuICAgICAgbW9kdWxlLmV4cG9ydHMgPSBydW50aW1lO1xuICAgIH1cbiAgICAvLyBEb24ndCBib3RoZXIgZXZhbHVhdGluZyB0aGUgcmVzdCBvZiB0aGlzIGZpbGUgaWYgdGhlIHJ1bnRpbWUgd2FzXG4gICAgLy8gYWxyZWFkeSBkZWZpbmVkIGdsb2JhbGx5LlxuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIERlZmluZSB0aGUgcnVudGltZSBnbG9iYWxseSAoYXMgZXhwZWN0ZWQgYnkgZ2VuZXJhdGVkIGNvZGUpIGFzIGVpdGhlclxuICAvLyBtb2R1bGUuZXhwb3J0cyAoaWYgd2UncmUgaW4gYSBtb2R1bGUpIG9yIGEgbmV3LCBlbXB0eSBvYmplY3QuXG4gIHJ1bnRpbWUgPSBnbG9iYWwucmVnZW5lcmF0b3JSdW50aW1lID0gaW5Nb2R1bGUgPyBtb2R1bGUuZXhwb3J0cyA6IHt9O1xuXG4gIGZ1bmN0aW9uIHdyYXAoaW5uZXJGbiwgb3V0ZXJGbiwgc2VsZiwgdHJ5TG9jc0xpc3QpIHtcbiAgICAvLyBJZiBvdXRlckZuIHByb3ZpZGVkLCB0aGVuIG91dGVyRm4ucHJvdG90eXBlIGluc3RhbmNlb2YgR2VuZXJhdG9yLlxuICAgIHZhciBnZW5lcmF0b3IgPSBPYmplY3QuY3JlYXRlKChvdXRlckZuIHx8IEdlbmVyYXRvcikucHJvdG90eXBlKTtcbiAgICB2YXIgY29udGV4dCA9IG5ldyBDb250ZXh0KHRyeUxvY3NMaXN0IHx8IFtdKTtcblxuICAgIC8vIFRoZSAuX2ludm9rZSBtZXRob2QgdW5pZmllcyB0aGUgaW1wbGVtZW50YXRpb25zIG9mIHRoZSAubmV4dCxcbiAgICAvLyAudGhyb3csIGFuZCAucmV0dXJuIG1ldGhvZHMuXG4gICAgZ2VuZXJhdG9yLl9pbnZva2UgPSBtYWtlSW52b2tlTWV0aG9kKGlubmVyRm4sIHNlbGYsIGNvbnRleHQpO1xuXG4gICAgcmV0dXJuIGdlbmVyYXRvcjtcbiAgfVxuICBydW50aW1lLndyYXAgPSB3cmFwO1xuXG4gIC8vIFRyeS9jYXRjaCBoZWxwZXIgdG8gbWluaW1pemUgZGVvcHRpbWl6YXRpb25zLiBSZXR1cm5zIGEgY29tcGxldGlvblxuICAvLyByZWNvcmQgbGlrZSBjb250ZXh0LnRyeUVudHJpZXNbaV0uY29tcGxldGlvbi4gVGhpcyBpbnRlcmZhY2UgY291bGRcbiAgLy8gaGF2ZSBiZWVuIChhbmQgd2FzIHByZXZpb3VzbHkpIGRlc2lnbmVkIHRvIHRha2UgYSBjbG9zdXJlIHRvIGJlXG4gIC8vIGludm9rZWQgd2l0aG91dCBhcmd1bWVudHMsIGJ1dCBpbiBhbGwgdGhlIGNhc2VzIHdlIGNhcmUgYWJvdXQgd2VcbiAgLy8gYWxyZWFkeSBoYXZlIGFuIGV4aXN0aW5nIG1ldGhvZCB3ZSB3YW50IHRvIGNhbGwsIHNvIHRoZXJlJ3Mgbm8gbmVlZFxuICAvLyB0byBjcmVhdGUgYSBuZXcgZnVuY3Rpb24gb2JqZWN0LiBXZSBjYW4gZXZlbiBnZXQgYXdheSB3aXRoIGFzc3VtaW5nXG4gIC8vIHRoZSBtZXRob2QgdGFrZXMgZXhhY3RseSBvbmUgYXJndW1lbnQsIHNpbmNlIHRoYXQgaGFwcGVucyB0byBiZSB0cnVlXG4gIC8vIGluIGV2ZXJ5IGNhc2UsIHNvIHdlIGRvbid0IGhhdmUgdG8gdG91Y2ggdGhlIGFyZ3VtZW50cyBvYmplY3QuIFRoZVxuICAvLyBvbmx5IGFkZGl0aW9uYWwgYWxsb2NhdGlvbiByZXF1aXJlZCBpcyB0aGUgY29tcGxldGlvbiByZWNvcmQsIHdoaWNoXG4gIC8vIGhhcyBhIHN0YWJsZSBzaGFwZSBhbmQgc28gaG9wZWZ1bGx5IHNob3VsZCBiZSBjaGVhcCB0byBhbGxvY2F0ZS5cbiAgZnVuY3Rpb24gdHJ5Q2F0Y2goZm4sIG9iaiwgYXJnKSB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiB7IHR5cGU6IFwibm9ybWFsXCIsIGFyZzogZm4uY2FsbChvYmosIGFyZykgfTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIHJldHVybiB7IHR5cGU6IFwidGhyb3dcIiwgYXJnOiBlcnIgfTtcbiAgICB9XG4gIH1cblxuICB2YXIgR2VuU3RhdGVTdXNwZW5kZWRTdGFydCA9IFwic3VzcGVuZGVkU3RhcnRcIjtcbiAgdmFyIEdlblN0YXRlU3VzcGVuZGVkWWllbGQgPSBcInN1c3BlbmRlZFlpZWxkXCI7XG4gIHZhciBHZW5TdGF0ZUV4ZWN1dGluZyA9IFwiZXhlY3V0aW5nXCI7XG4gIHZhciBHZW5TdGF0ZUNvbXBsZXRlZCA9IFwiY29tcGxldGVkXCI7XG5cbiAgLy8gUmV0dXJuaW5nIHRoaXMgb2JqZWN0IGZyb20gdGhlIGlubmVyRm4gaGFzIHRoZSBzYW1lIGVmZmVjdCBhc1xuICAvLyBicmVha2luZyBvdXQgb2YgdGhlIGRpc3BhdGNoIHN3aXRjaCBzdGF0ZW1lbnQuXG4gIHZhciBDb250aW51ZVNlbnRpbmVsID0ge307XG5cbiAgLy8gRHVtbXkgY29uc3RydWN0b3IgZnVuY3Rpb25zIHRoYXQgd2UgdXNlIGFzIHRoZSAuY29uc3RydWN0b3IgYW5kXG4gIC8vIC5jb25zdHJ1Y3Rvci5wcm90b3R5cGUgcHJvcGVydGllcyBmb3IgZnVuY3Rpb25zIHRoYXQgcmV0dXJuIEdlbmVyYXRvclxuICAvLyBvYmplY3RzLiBGb3IgZnVsbCBzcGVjIGNvbXBsaWFuY2UsIHlvdSBtYXkgd2lzaCB0byBjb25maWd1cmUgeW91clxuICAvLyBtaW5pZmllciBub3QgdG8gbWFuZ2xlIHRoZSBuYW1lcyBvZiB0aGVzZSB0d28gZnVuY3Rpb25zLlxuICBmdW5jdGlvbiBHZW5lcmF0b3IoKSB7fVxuICBmdW5jdGlvbiBHZW5lcmF0b3JGdW5jdGlvbigpIHt9XG4gIGZ1bmN0aW9uIEdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlKCkge31cblxuICB2YXIgR3AgPSBHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZS5wcm90b3R5cGUgPSBHZW5lcmF0b3IucHJvdG90eXBlO1xuICBHZW5lcmF0b3JGdW5jdGlvbi5wcm90b3R5cGUgPSBHcC5jb25zdHJ1Y3RvciA9IEdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlO1xuICBHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IEdlbmVyYXRvckZ1bmN0aW9uO1xuICBHZW5lcmF0b3JGdW5jdGlvbi5kaXNwbGF5TmFtZSA9IFwiR2VuZXJhdG9yRnVuY3Rpb25cIjtcblxuICAvLyBIZWxwZXIgZm9yIGRlZmluaW5nIHRoZSAubmV4dCwgLnRocm93LCBhbmQgLnJldHVybiBtZXRob2RzIG9mIHRoZVxuICAvLyBJdGVyYXRvciBpbnRlcmZhY2UgaW4gdGVybXMgb2YgYSBzaW5nbGUgLl9pbnZva2UgbWV0aG9kLlxuICBmdW5jdGlvbiBkZWZpbmVJdGVyYXRvck1ldGhvZHMocHJvdG90eXBlKSB7XG4gICAgW1wibmV4dFwiLCBcInRocm93XCIsIFwicmV0dXJuXCJdLmZvckVhY2goZnVuY3Rpb24obWV0aG9kKSB7XG4gICAgICBwcm90b3R5cGVbbWV0aG9kXSA9IGZ1bmN0aW9uKGFyZykge1xuICAgICAgICByZXR1cm4gdGhpcy5faW52b2tlKG1ldGhvZCwgYXJnKTtcbiAgICAgIH07XG4gICAgfSk7XG4gIH1cblxuICBydW50aW1lLmlzR2VuZXJhdG9yRnVuY3Rpb24gPSBmdW5jdGlvbihnZW5GdW4pIHtcbiAgICB2YXIgY3RvciA9IHR5cGVvZiBnZW5GdW4gPT09IFwiZnVuY3Rpb25cIiAmJiBnZW5GdW4uY29uc3RydWN0b3I7XG4gICAgcmV0dXJuIGN0b3JcbiAgICAgID8gY3RvciA9PT0gR2VuZXJhdG9yRnVuY3Rpb24gfHxcbiAgICAgICAgLy8gRm9yIHRoZSBuYXRpdmUgR2VuZXJhdG9yRnVuY3Rpb24gY29uc3RydWN0b3IsIHRoZSBiZXN0IHdlIGNhblxuICAgICAgICAvLyBkbyBpcyB0byBjaGVjayBpdHMgLm5hbWUgcHJvcGVydHkuXG4gICAgICAgIChjdG9yLmRpc3BsYXlOYW1lIHx8IGN0b3IubmFtZSkgPT09IFwiR2VuZXJhdG9yRnVuY3Rpb25cIlxuICAgICAgOiBmYWxzZTtcbiAgfTtcblxuICBydW50aW1lLm1hcmsgPSBmdW5jdGlvbihnZW5GdW4pIHtcbiAgICBpZiAoT2JqZWN0LnNldFByb3RvdHlwZU9mKSB7XG4gICAgICBPYmplY3Quc2V0UHJvdG90eXBlT2YoZ2VuRnVuLCBHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGdlbkZ1bi5fX3Byb3RvX18gPSBHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZTtcbiAgICB9XG4gICAgZ2VuRnVuLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoR3ApO1xuICAgIHJldHVybiBnZW5GdW47XG4gIH07XG5cbiAgLy8gV2l0aGluIHRoZSBib2R5IG9mIGFueSBhc3luYyBmdW5jdGlvbiwgYGF3YWl0IHhgIGlzIHRyYW5zZm9ybWVkIHRvXG4gIC8vIGB5aWVsZCByZWdlbmVyYXRvclJ1bnRpbWUuYXdyYXAoeClgLCBzbyB0aGF0IHRoZSBydW50aW1lIGNhbiB0ZXN0XG4gIC8vIGB2YWx1ZSBpbnN0YW5jZW9mIEF3YWl0QXJndW1lbnRgIHRvIGRldGVybWluZSBpZiB0aGUgeWllbGRlZCB2YWx1ZSBpc1xuICAvLyBtZWFudCB0byBiZSBhd2FpdGVkLiBTb21lIG1heSBjb25zaWRlciB0aGUgbmFtZSBvZiB0aGlzIG1ldGhvZCB0b29cbiAgLy8gY3V0ZXN5LCBidXQgdGhleSBhcmUgY3VybXVkZ2VvbnMuXG4gIHJ1bnRpbWUuYXdyYXAgPSBmdW5jdGlvbihhcmcpIHtcbiAgICByZXR1cm4gbmV3IEF3YWl0QXJndW1lbnQoYXJnKTtcbiAgfTtcblxuICBmdW5jdGlvbiBBd2FpdEFyZ3VtZW50KGFyZykge1xuICAgIHRoaXMuYXJnID0gYXJnO1xuICB9XG5cbiAgZnVuY3Rpb24gQXN5bmNJdGVyYXRvcihnZW5lcmF0b3IpIHtcbiAgICAvLyBUaGlzIGludm9rZSBmdW5jdGlvbiBpcyB3cml0dGVuIGluIGEgc3R5bGUgdGhhdCBhc3N1bWVzIHNvbWVcbiAgICAvLyBjYWxsaW5nIGZ1bmN0aW9uIChvciBQcm9taXNlKSB3aWxsIGhhbmRsZSBleGNlcHRpb25zLlxuICAgIGZ1bmN0aW9uIGludm9rZShtZXRob2QsIGFyZykge1xuICAgICAgdmFyIHJlc3VsdCA9IGdlbmVyYXRvclttZXRob2RdKGFyZyk7XG4gICAgICB2YXIgdmFsdWUgPSByZXN1bHQudmFsdWU7XG4gICAgICByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBBd2FpdEFyZ3VtZW50XG4gICAgICAgID8gUHJvbWlzZS5yZXNvbHZlKHZhbHVlLmFyZykudGhlbihpbnZva2VOZXh0LCBpbnZva2VUaHJvdylcbiAgICAgICAgOiBQcm9taXNlLnJlc29sdmUodmFsdWUpLnRoZW4oZnVuY3Rpb24odW53cmFwcGVkKSB7XG4gICAgICAgICAgICAvLyBXaGVuIGEgeWllbGRlZCBQcm9taXNlIGlzIHJlc29sdmVkLCBpdHMgZmluYWwgdmFsdWUgYmVjb21lc1xuICAgICAgICAgICAgLy8gdGhlIC52YWx1ZSBvZiB0aGUgUHJvbWlzZTx7dmFsdWUsZG9uZX0+IHJlc3VsdCBmb3IgdGhlXG4gICAgICAgICAgICAvLyBjdXJyZW50IGl0ZXJhdGlvbi4gSWYgdGhlIFByb21pc2UgaXMgcmVqZWN0ZWQsIGhvd2V2ZXIsIHRoZVxuICAgICAgICAgICAgLy8gcmVzdWx0IGZvciB0aGlzIGl0ZXJhdGlvbiB3aWxsIGJlIHJlamVjdGVkIHdpdGggdGhlIHNhbWVcbiAgICAgICAgICAgIC8vIHJlYXNvbi4gTm90ZSB0aGF0IHJlamVjdGlvbnMgb2YgeWllbGRlZCBQcm9taXNlcyBhcmUgbm90XG4gICAgICAgICAgICAvLyB0aHJvd24gYmFjayBpbnRvIHRoZSBnZW5lcmF0b3IgZnVuY3Rpb24sIGFzIGlzIHRoZSBjYXNlXG4gICAgICAgICAgICAvLyB3aGVuIGFuIGF3YWl0ZWQgUHJvbWlzZSBpcyByZWplY3RlZC4gVGhpcyBkaWZmZXJlbmNlIGluXG4gICAgICAgICAgICAvLyBiZWhhdmlvciBiZXR3ZWVuIHlpZWxkIGFuZCBhd2FpdCBpcyBpbXBvcnRhbnQsIGJlY2F1c2UgaXRcbiAgICAgICAgICAgIC8vIGFsbG93cyB0aGUgY29uc3VtZXIgdG8gZGVjaWRlIHdoYXQgdG8gZG8gd2l0aCB0aGUgeWllbGRlZFxuICAgICAgICAgICAgLy8gcmVqZWN0aW9uIChzd2FsbG93IGl0IGFuZCBjb250aW51ZSwgbWFudWFsbHkgLnRocm93IGl0IGJhY2tcbiAgICAgICAgICAgIC8vIGludG8gdGhlIGdlbmVyYXRvciwgYWJhbmRvbiBpdGVyYXRpb24sIHdoYXRldmVyKS4gV2l0aFxuICAgICAgICAgICAgLy8gYXdhaXQsIGJ5IGNvbnRyYXN0LCB0aGVyZSBpcyBubyBvcHBvcnR1bml0eSB0byBleGFtaW5lIHRoZVxuICAgICAgICAgICAgLy8gcmVqZWN0aW9uIHJlYXNvbiBvdXRzaWRlIHRoZSBnZW5lcmF0b3IgZnVuY3Rpb24sIHNvIHRoZVxuICAgICAgICAgICAgLy8gb25seSBvcHRpb24gaXMgdG8gdGhyb3cgaXQgZnJvbSB0aGUgYXdhaXQgZXhwcmVzc2lvbiwgYW5kXG4gICAgICAgICAgICAvLyBsZXQgdGhlIGdlbmVyYXRvciBmdW5jdGlvbiBoYW5kbGUgdGhlIGV4Y2VwdGlvbi5cbiAgICAgICAgICAgIHJlc3VsdC52YWx1ZSA9IHVud3JhcHBlZDtcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBwcm9jZXNzID09PSBcIm9iamVjdFwiICYmIHByb2Nlc3MuZG9tYWluKSB7XG4gICAgICBpbnZva2UgPSBwcm9jZXNzLmRvbWFpbi5iaW5kKGludm9rZSk7XG4gICAgfVxuXG4gICAgdmFyIGludm9rZU5leHQgPSBpbnZva2UuYmluZChnZW5lcmF0b3IsIFwibmV4dFwiKTtcbiAgICB2YXIgaW52b2tlVGhyb3cgPSBpbnZva2UuYmluZChnZW5lcmF0b3IsIFwidGhyb3dcIik7XG4gICAgdmFyIGludm9rZVJldHVybiA9IGludm9rZS5iaW5kKGdlbmVyYXRvciwgXCJyZXR1cm5cIik7XG4gICAgdmFyIHByZXZpb3VzUHJvbWlzZTtcblxuICAgIGZ1bmN0aW9uIGVucXVldWUobWV0aG9kLCBhcmcpIHtcbiAgICAgIGZ1bmN0aW9uIGNhbGxJbnZva2VXaXRoTWV0aG9kQW5kQXJnKCkge1xuICAgICAgICByZXR1cm4gaW52b2tlKG1ldGhvZCwgYXJnKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHByZXZpb3VzUHJvbWlzZSA9XG4gICAgICAgIC8vIElmIGVucXVldWUgaGFzIGJlZW4gY2FsbGVkIGJlZm9yZSwgdGhlbiB3ZSB3YW50IHRvIHdhaXQgdW50aWxcbiAgICAgICAgLy8gYWxsIHByZXZpb3VzIFByb21pc2VzIGhhdmUgYmVlbiByZXNvbHZlZCBiZWZvcmUgY2FsbGluZyBpbnZva2UsXG4gICAgICAgIC8vIHNvIHRoYXQgcmVzdWx0cyBhcmUgYWx3YXlzIGRlbGl2ZXJlZCBpbiB0aGUgY29ycmVjdCBvcmRlci4gSWZcbiAgICAgICAgLy8gZW5xdWV1ZSBoYXMgbm90IGJlZW4gY2FsbGVkIGJlZm9yZSwgdGhlbiBpdCBpcyBpbXBvcnRhbnQgdG9cbiAgICAgICAgLy8gY2FsbCBpbnZva2UgaW1tZWRpYXRlbHksIHdpdGhvdXQgd2FpdGluZyBvbiBhIGNhbGxiYWNrIHRvIGZpcmUsXG4gICAgICAgIC8vIHNvIHRoYXQgdGhlIGFzeW5jIGdlbmVyYXRvciBmdW5jdGlvbiBoYXMgdGhlIG9wcG9ydHVuaXR5IHRvIGRvXG4gICAgICAgIC8vIGFueSBuZWNlc3Nhcnkgc2V0dXAgaW4gYSBwcmVkaWN0YWJsZSB3YXkuIFRoaXMgcHJlZGljdGFiaWxpdHlcbiAgICAgICAgLy8gaXMgd2h5IHRoZSBQcm9taXNlIGNvbnN0cnVjdG9yIHN5bmNocm9ub3VzbHkgaW52b2tlcyBpdHNcbiAgICAgICAgLy8gZXhlY3V0b3IgY2FsbGJhY2ssIGFuZCB3aHkgYXN5bmMgZnVuY3Rpb25zIHN5bmNocm9ub3VzbHlcbiAgICAgICAgLy8gZXhlY3V0ZSBjb2RlIGJlZm9yZSB0aGUgZmlyc3QgYXdhaXQuIFNpbmNlIHdlIGltcGxlbWVudCBzaW1wbGVcbiAgICAgICAgLy8gYXN5bmMgZnVuY3Rpb25zIGluIHRlcm1zIG9mIGFzeW5jIGdlbmVyYXRvcnMsIGl0IGlzIGVzcGVjaWFsbHlcbiAgICAgICAgLy8gaW1wb3J0YW50IHRvIGdldCB0aGlzIHJpZ2h0LCBldmVuIHRob3VnaCBpdCByZXF1aXJlcyBjYXJlLlxuICAgICAgICBwcmV2aW91c1Byb21pc2UgPyBwcmV2aW91c1Byb21pc2UudGhlbihcbiAgICAgICAgICBjYWxsSW52b2tlV2l0aE1ldGhvZEFuZEFyZyxcbiAgICAgICAgICAvLyBBdm9pZCBwcm9wYWdhdGluZyBmYWlsdXJlcyB0byBQcm9taXNlcyByZXR1cm5lZCBieSBsYXRlclxuICAgICAgICAgIC8vIGludm9jYXRpb25zIG9mIHRoZSBpdGVyYXRvci5cbiAgICAgICAgICBjYWxsSW52b2tlV2l0aE1ldGhvZEFuZEFyZ1xuICAgICAgICApIDogbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUpIHtcbiAgICAgICAgICByZXNvbHZlKGNhbGxJbnZva2VXaXRoTWV0aG9kQW5kQXJnKCkpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBEZWZpbmUgdGhlIHVuaWZpZWQgaGVscGVyIG1ldGhvZCB0aGF0IGlzIHVzZWQgdG8gaW1wbGVtZW50IC5uZXh0LFxuICAgIC8vIC50aHJvdywgYW5kIC5yZXR1cm4gKHNlZSBkZWZpbmVJdGVyYXRvck1ldGhvZHMpLlxuICAgIHRoaXMuX2ludm9rZSA9IGVucXVldWU7XG4gIH1cblxuICBkZWZpbmVJdGVyYXRvck1ldGhvZHMoQXN5bmNJdGVyYXRvci5wcm90b3R5cGUpO1xuXG4gIC8vIE5vdGUgdGhhdCBzaW1wbGUgYXN5bmMgZnVuY3Rpb25zIGFyZSBpbXBsZW1lbnRlZCBvbiB0b3Agb2ZcbiAgLy8gQXN5bmNJdGVyYXRvciBvYmplY3RzOyB0aGV5IGp1c3QgcmV0dXJuIGEgUHJvbWlzZSBmb3IgdGhlIHZhbHVlIG9mXG4gIC8vIHRoZSBmaW5hbCByZXN1bHQgcHJvZHVjZWQgYnkgdGhlIGl0ZXJhdG9yLlxuICBydW50aW1lLmFzeW5jID0gZnVuY3Rpb24oaW5uZXJGbiwgb3V0ZXJGbiwgc2VsZiwgdHJ5TG9jc0xpc3QpIHtcbiAgICB2YXIgaXRlciA9IG5ldyBBc3luY0l0ZXJhdG9yKFxuICAgICAgd3JhcChpbm5lckZuLCBvdXRlckZuLCBzZWxmLCB0cnlMb2NzTGlzdClcbiAgICApO1xuXG4gICAgcmV0dXJuIHJ1bnRpbWUuaXNHZW5lcmF0b3JGdW5jdGlvbihvdXRlckZuKVxuICAgICAgPyBpdGVyIC8vIElmIG91dGVyRm4gaXMgYSBnZW5lcmF0b3IsIHJldHVybiB0aGUgZnVsbCBpdGVyYXRvci5cbiAgICAgIDogaXRlci5uZXh0KCkudGhlbihmdW5jdGlvbihyZXN1bHQpIHtcbiAgICAgICAgICByZXR1cm4gcmVzdWx0LmRvbmUgPyByZXN1bHQudmFsdWUgOiBpdGVyLm5leHQoKTtcbiAgICAgICAgfSk7XG4gIH07XG5cbiAgZnVuY3Rpb24gbWFrZUludm9rZU1ldGhvZChpbm5lckZuLCBzZWxmLCBjb250ZXh0KSB7XG4gICAgdmFyIHN0YXRlID0gR2VuU3RhdGVTdXNwZW5kZWRTdGFydDtcblxuICAgIHJldHVybiBmdW5jdGlvbiBpbnZva2UobWV0aG9kLCBhcmcpIHtcbiAgICAgIGlmIChzdGF0ZSA9PT0gR2VuU3RhdGVFeGVjdXRpbmcpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiR2VuZXJhdG9yIGlzIGFscmVhZHkgcnVubmluZ1wiKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHN0YXRlID09PSBHZW5TdGF0ZUNvbXBsZXRlZCkge1xuICAgICAgICBpZiAobWV0aG9kID09PSBcInRocm93XCIpIHtcbiAgICAgICAgICB0aHJvdyBhcmc7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBCZSBmb3JnaXZpbmcsIHBlciAyNS4zLjMuMy4zIG9mIHRoZSBzcGVjOlxuICAgICAgICAvLyBodHRwczovL3Blb3BsZS5tb3ppbGxhLm9yZy9+am9yZW5kb3JmZi9lczYtZHJhZnQuaHRtbCNzZWMtZ2VuZXJhdG9ycmVzdW1lXG4gICAgICAgIHJldHVybiBkb25lUmVzdWx0KCk7XG4gICAgICB9XG5cbiAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgIHZhciBkZWxlZ2F0ZSA9IGNvbnRleHQuZGVsZWdhdGU7XG4gICAgICAgIGlmIChkZWxlZ2F0ZSkge1xuICAgICAgICAgIGlmIChtZXRob2QgPT09IFwicmV0dXJuXCIgfHxcbiAgICAgICAgICAgICAgKG1ldGhvZCA9PT0gXCJ0aHJvd1wiICYmIGRlbGVnYXRlLml0ZXJhdG9yW21ldGhvZF0gPT09IHVuZGVmaW5lZCkpIHtcbiAgICAgICAgICAgIC8vIEEgcmV0dXJuIG9yIHRocm93ICh3aGVuIHRoZSBkZWxlZ2F0ZSBpdGVyYXRvciBoYXMgbm8gdGhyb3dcbiAgICAgICAgICAgIC8vIG1ldGhvZCkgYWx3YXlzIHRlcm1pbmF0ZXMgdGhlIHlpZWxkKiBsb29wLlxuICAgICAgICAgICAgY29udGV4dC5kZWxlZ2F0ZSA9IG51bGw7XG5cbiAgICAgICAgICAgIC8vIElmIHRoZSBkZWxlZ2F0ZSBpdGVyYXRvciBoYXMgYSByZXR1cm4gbWV0aG9kLCBnaXZlIGl0IGFcbiAgICAgICAgICAgIC8vIGNoYW5jZSB0byBjbGVhbiB1cC5cbiAgICAgICAgICAgIHZhciByZXR1cm5NZXRob2QgPSBkZWxlZ2F0ZS5pdGVyYXRvcltcInJldHVyblwiXTtcbiAgICAgICAgICAgIGlmIChyZXR1cm5NZXRob2QpIHtcbiAgICAgICAgICAgICAgdmFyIHJlY29yZCA9IHRyeUNhdGNoKHJldHVybk1ldGhvZCwgZGVsZWdhdGUuaXRlcmF0b3IsIGFyZyk7XG4gICAgICAgICAgICAgIGlmIChyZWNvcmQudHlwZSA9PT0gXCJ0aHJvd1wiKSB7XG4gICAgICAgICAgICAgICAgLy8gSWYgdGhlIHJldHVybiBtZXRob2QgdGhyZXcgYW4gZXhjZXB0aW9uLCBsZXQgdGhhdFxuICAgICAgICAgICAgICAgIC8vIGV4Y2VwdGlvbiBwcmV2YWlsIG92ZXIgdGhlIG9yaWdpbmFsIHJldHVybiBvciB0aHJvdy5cbiAgICAgICAgICAgICAgICBtZXRob2QgPSBcInRocm93XCI7XG4gICAgICAgICAgICAgICAgYXJnID0gcmVjb3JkLmFyZztcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAobWV0aG9kID09PSBcInJldHVyblwiKSB7XG4gICAgICAgICAgICAgIC8vIENvbnRpbnVlIHdpdGggdGhlIG91dGVyIHJldHVybiwgbm93IHRoYXQgdGhlIGRlbGVnYXRlXG4gICAgICAgICAgICAgIC8vIGl0ZXJhdG9yIGhhcyBiZWVuIHRlcm1pbmF0ZWQuXG4gICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIHZhciByZWNvcmQgPSB0cnlDYXRjaChcbiAgICAgICAgICAgIGRlbGVnYXRlLml0ZXJhdG9yW21ldGhvZF0sXG4gICAgICAgICAgICBkZWxlZ2F0ZS5pdGVyYXRvcixcbiAgICAgICAgICAgIGFyZ1xuICAgICAgICAgICk7XG5cbiAgICAgICAgICBpZiAocmVjb3JkLnR5cGUgPT09IFwidGhyb3dcIikge1xuICAgICAgICAgICAgY29udGV4dC5kZWxlZ2F0ZSA9IG51bGw7XG5cbiAgICAgICAgICAgIC8vIExpa2UgcmV0dXJuaW5nIGdlbmVyYXRvci50aHJvdyh1bmNhdWdodCksIGJ1dCB3aXRob3V0IHRoZVxuICAgICAgICAgICAgLy8gb3ZlcmhlYWQgb2YgYW4gZXh0cmEgZnVuY3Rpb24gY2FsbC5cbiAgICAgICAgICAgIG1ldGhvZCA9IFwidGhyb3dcIjtcbiAgICAgICAgICAgIGFyZyA9IHJlY29yZC5hcmc7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBEZWxlZ2F0ZSBnZW5lcmF0b3IgcmFuIGFuZCBoYW5kbGVkIGl0cyBvd24gZXhjZXB0aW9ucyBzb1xuICAgICAgICAgIC8vIHJlZ2FyZGxlc3Mgb2Ygd2hhdCB0aGUgbWV0aG9kIHdhcywgd2UgY29udGludWUgYXMgaWYgaXQgaXNcbiAgICAgICAgICAvLyBcIm5leHRcIiB3aXRoIGFuIHVuZGVmaW5lZCBhcmcuXG4gICAgICAgICAgbWV0aG9kID0gXCJuZXh0XCI7XG4gICAgICAgICAgYXJnID0gdW5kZWZpbmVkO1xuXG4gICAgICAgICAgdmFyIGluZm8gPSByZWNvcmQuYXJnO1xuICAgICAgICAgIGlmIChpbmZvLmRvbmUpIHtcbiAgICAgICAgICAgIGNvbnRleHRbZGVsZWdhdGUucmVzdWx0TmFtZV0gPSBpbmZvLnZhbHVlO1xuICAgICAgICAgICAgY29udGV4dC5uZXh0ID0gZGVsZWdhdGUubmV4dExvYztcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc3RhdGUgPSBHZW5TdGF0ZVN1c3BlbmRlZFlpZWxkO1xuICAgICAgICAgICAgcmV0dXJuIGluZm87XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29udGV4dC5kZWxlZ2F0ZSA9IG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobWV0aG9kID09PSBcIm5leHRcIikge1xuICAgICAgICAgIGNvbnRleHQuX3NlbnQgPSBhcmc7XG5cbiAgICAgICAgICBpZiAoc3RhdGUgPT09IEdlblN0YXRlU3VzcGVuZGVkWWllbGQpIHtcbiAgICAgICAgICAgIGNvbnRleHQuc2VudCA9IGFyZztcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29udGV4dC5zZW50ID0gdW5kZWZpbmVkO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChtZXRob2QgPT09IFwidGhyb3dcIikge1xuICAgICAgICAgIGlmIChzdGF0ZSA9PT0gR2VuU3RhdGVTdXNwZW5kZWRTdGFydCkge1xuICAgICAgICAgICAgc3RhdGUgPSBHZW5TdGF0ZUNvbXBsZXRlZDtcbiAgICAgICAgICAgIHRocm93IGFyZztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoY29udGV4dC5kaXNwYXRjaEV4Y2VwdGlvbihhcmcpKSB7XG4gICAgICAgICAgICAvLyBJZiB0aGUgZGlzcGF0Y2hlZCBleGNlcHRpb24gd2FzIGNhdWdodCBieSBhIGNhdGNoIGJsb2NrLFxuICAgICAgICAgICAgLy8gdGhlbiBsZXQgdGhhdCBjYXRjaCBibG9jayBoYW5kbGUgdGhlIGV4Y2VwdGlvbiBub3JtYWxseS5cbiAgICAgICAgICAgIG1ldGhvZCA9IFwibmV4dFwiO1xuICAgICAgICAgICAgYXJnID0gdW5kZWZpbmVkO1xuICAgICAgICAgIH1cblxuICAgICAgICB9IGVsc2UgaWYgKG1ldGhvZCA9PT0gXCJyZXR1cm5cIikge1xuICAgICAgICAgIGNvbnRleHQuYWJydXB0KFwicmV0dXJuXCIsIGFyZyk7XG4gICAgICAgIH1cblxuICAgICAgICBzdGF0ZSA9IEdlblN0YXRlRXhlY3V0aW5nO1xuXG4gICAgICAgIHZhciByZWNvcmQgPSB0cnlDYXRjaChpbm5lckZuLCBzZWxmLCBjb250ZXh0KTtcbiAgICAgICAgaWYgKHJlY29yZC50eXBlID09PSBcIm5vcm1hbFwiKSB7XG4gICAgICAgICAgLy8gSWYgYW4gZXhjZXB0aW9uIGlzIHRocm93biBmcm9tIGlubmVyRm4sIHdlIGxlYXZlIHN0YXRlID09PVxuICAgICAgICAgIC8vIEdlblN0YXRlRXhlY3V0aW5nIGFuZCBsb29wIGJhY2sgZm9yIGFub3RoZXIgaW52b2NhdGlvbi5cbiAgICAgICAgICBzdGF0ZSA9IGNvbnRleHQuZG9uZVxuICAgICAgICAgICAgPyBHZW5TdGF0ZUNvbXBsZXRlZFxuICAgICAgICAgICAgOiBHZW5TdGF0ZVN1c3BlbmRlZFlpZWxkO1xuXG4gICAgICAgICAgdmFyIGluZm8gPSB7XG4gICAgICAgICAgICB2YWx1ZTogcmVjb3JkLmFyZyxcbiAgICAgICAgICAgIGRvbmU6IGNvbnRleHQuZG9uZVxuICAgICAgICAgIH07XG5cbiAgICAgICAgICBpZiAocmVjb3JkLmFyZyA9PT0gQ29udGludWVTZW50aW5lbCkge1xuICAgICAgICAgICAgaWYgKGNvbnRleHQuZGVsZWdhdGUgJiYgbWV0aG9kID09PSBcIm5leHRcIikge1xuICAgICAgICAgICAgICAvLyBEZWxpYmVyYXRlbHkgZm9yZ2V0IHRoZSBsYXN0IHNlbnQgdmFsdWUgc28gdGhhdCB3ZSBkb24ndFxuICAgICAgICAgICAgICAvLyBhY2NpZGVudGFsbHkgcGFzcyBpdCBvbiB0byB0aGUgZGVsZWdhdGUuXG4gICAgICAgICAgICAgIGFyZyA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGluZm87XG4gICAgICAgICAgfVxuXG4gICAgICAgIH0gZWxzZSBpZiAocmVjb3JkLnR5cGUgPT09IFwidGhyb3dcIikge1xuICAgICAgICAgIHN0YXRlID0gR2VuU3RhdGVDb21wbGV0ZWQ7XG4gICAgICAgICAgLy8gRGlzcGF0Y2ggdGhlIGV4Y2VwdGlvbiBieSBsb29waW5nIGJhY2sgYXJvdW5kIHRvIHRoZVxuICAgICAgICAgIC8vIGNvbnRleHQuZGlzcGF0Y2hFeGNlcHRpb24oYXJnKSBjYWxsIGFib3ZlLlxuICAgICAgICAgIG1ldGhvZCA9IFwidGhyb3dcIjtcbiAgICAgICAgICBhcmcgPSByZWNvcmQuYXJnO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIC8vIERlZmluZSBHZW5lcmF0b3IucHJvdG90eXBlLntuZXh0LHRocm93LHJldHVybn0gaW4gdGVybXMgb2YgdGhlXG4gIC8vIHVuaWZpZWQgLl9pbnZva2UgaGVscGVyIG1ldGhvZC5cbiAgZGVmaW5lSXRlcmF0b3JNZXRob2RzKEdwKTtcblxuICBHcFtpdGVyYXRvclN5bWJvbF0gPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICBHcC50b1N0cmluZyA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBcIltvYmplY3QgR2VuZXJhdG9yXVwiO1xuICB9O1xuXG4gIGZ1bmN0aW9uIHB1c2hUcnlFbnRyeShsb2NzKSB7XG4gICAgdmFyIGVudHJ5ID0geyB0cnlMb2M6IGxvY3NbMF0gfTtcblxuICAgIGlmICgxIGluIGxvY3MpIHtcbiAgICAgIGVudHJ5LmNhdGNoTG9jID0gbG9jc1sxXTtcbiAgICB9XG5cbiAgICBpZiAoMiBpbiBsb2NzKSB7XG4gICAgICBlbnRyeS5maW5hbGx5TG9jID0gbG9jc1syXTtcbiAgICAgIGVudHJ5LmFmdGVyTG9jID0gbG9jc1szXTtcbiAgICB9XG5cbiAgICB0aGlzLnRyeUVudHJpZXMucHVzaChlbnRyeSk7XG4gIH1cblxuICBmdW5jdGlvbiByZXNldFRyeUVudHJ5KGVudHJ5KSB7XG4gICAgdmFyIHJlY29yZCA9IGVudHJ5LmNvbXBsZXRpb24gfHwge307XG4gICAgcmVjb3JkLnR5cGUgPSBcIm5vcm1hbFwiO1xuICAgIGRlbGV0ZSByZWNvcmQuYXJnO1xuICAgIGVudHJ5LmNvbXBsZXRpb24gPSByZWNvcmQ7XG4gIH1cblxuICBmdW5jdGlvbiBDb250ZXh0KHRyeUxvY3NMaXN0KSB7XG4gICAgLy8gVGhlIHJvb3QgZW50cnkgb2JqZWN0IChlZmZlY3RpdmVseSBhIHRyeSBzdGF0ZW1lbnQgd2l0aG91dCBhIGNhdGNoXG4gICAgLy8gb3IgYSBmaW5hbGx5IGJsb2NrKSBnaXZlcyB1cyBhIHBsYWNlIHRvIHN0b3JlIHZhbHVlcyB0aHJvd24gZnJvbVxuICAgIC8vIGxvY2F0aW9ucyB3aGVyZSB0aGVyZSBpcyBubyBlbmNsb3NpbmcgdHJ5IHN0YXRlbWVudC5cbiAgICB0aGlzLnRyeUVudHJpZXMgPSBbeyB0cnlMb2M6IFwicm9vdFwiIH1dO1xuICAgIHRyeUxvY3NMaXN0LmZvckVhY2gocHVzaFRyeUVudHJ5LCB0aGlzKTtcbiAgICB0aGlzLnJlc2V0KHRydWUpO1xuICB9XG5cbiAgcnVudGltZS5rZXlzID0gZnVuY3Rpb24ob2JqZWN0KSB7XG4gICAgdmFyIGtleXMgPSBbXTtcbiAgICBmb3IgKHZhciBrZXkgaW4gb2JqZWN0KSB7XG4gICAgICBrZXlzLnB1c2goa2V5KTtcbiAgICB9XG4gICAga2V5cy5yZXZlcnNlKCk7XG5cbiAgICAvLyBSYXRoZXIgdGhhbiByZXR1cm5pbmcgYW4gb2JqZWN0IHdpdGggYSBuZXh0IG1ldGhvZCwgd2Uga2VlcFxuICAgIC8vIHRoaW5ncyBzaW1wbGUgYW5kIHJldHVybiB0aGUgbmV4dCBmdW5jdGlvbiBpdHNlbGYuXG4gICAgcmV0dXJuIGZ1bmN0aW9uIG5leHQoKSB7XG4gICAgICB3aGlsZSAoa2V5cy5sZW5ndGgpIHtcbiAgICAgICAgdmFyIGtleSA9IGtleXMucG9wKCk7XG4gICAgICAgIGlmIChrZXkgaW4gb2JqZWN0KSB7XG4gICAgICAgICAgbmV4dC52YWx1ZSA9IGtleTtcbiAgICAgICAgICBuZXh0LmRvbmUgPSBmYWxzZTtcbiAgICAgICAgICByZXR1cm4gbmV4dDtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBUbyBhdm9pZCBjcmVhdGluZyBhbiBhZGRpdGlvbmFsIG9iamVjdCwgd2UganVzdCBoYW5nIHRoZSAudmFsdWVcbiAgICAgIC8vIGFuZCAuZG9uZSBwcm9wZXJ0aWVzIG9mZiB0aGUgbmV4dCBmdW5jdGlvbiBvYmplY3QgaXRzZWxmLiBUaGlzXG4gICAgICAvLyBhbHNvIGVuc3VyZXMgdGhhdCB0aGUgbWluaWZpZXIgd2lsbCBub3QgYW5vbnltaXplIHRoZSBmdW5jdGlvbi5cbiAgICAgIG5leHQuZG9uZSA9IHRydWU7XG4gICAgICByZXR1cm4gbmV4dDtcbiAgICB9O1xuICB9O1xuXG4gIGZ1bmN0aW9uIHZhbHVlcyhpdGVyYWJsZSkge1xuICAgIGlmIChpdGVyYWJsZSkge1xuICAgICAgdmFyIGl0ZXJhdG9yTWV0aG9kID0gaXRlcmFibGVbaXRlcmF0b3JTeW1ib2xdO1xuICAgICAgaWYgKGl0ZXJhdG9yTWV0aG9kKSB7XG4gICAgICAgIHJldHVybiBpdGVyYXRvck1ldGhvZC5jYWxsKGl0ZXJhYmxlKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVvZiBpdGVyYWJsZS5uZXh0ID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgcmV0dXJuIGl0ZXJhYmxlO1xuICAgICAgfVxuXG4gICAgICBpZiAoIWlzTmFOKGl0ZXJhYmxlLmxlbmd0aCkpIHtcbiAgICAgICAgdmFyIGkgPSAtMSwgbmV4dCA9IGZ1bmN0aW9uIG5leHQoKSB7XG4gICAgICAgICAgd2hpbGUgKCsraSA8IGl0ZXJhYmxlLmxlbmd0aCkge1xuICAgICAgICAgICAgaWYgKGhhc093bi5jYWxsKGl0ZXJhYmxlLCBpKSkge1xuICAgICAgICAgICAgICBuZXh0LnZhbHVlID0gaXRlcmFibGVbaV07XG4gICAgICAgICAgICAgIG5leHQuZG9uZSA9IGZhbHNlO1xuICAgICAgICAgICAgICByZXR1cm4gbmV4dDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBuZXh0LnZhbHVlID0gdW5kZWZpbmVkO1xuICAgICAgICAgIG5leHQuZG9uZSA9IHRydWU7XG5cbiAgICAgICAgICByZXR1cm4gbmV4dDtcbiAgICAgICAgfTtcblxuICAgICAgICByZXR1cm4gbmV4dC5uZXh0ID0gbmV4dDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBSZXR1cm4gYW4gaXRlcmF0b3Igd2l0aCBubyB2YWx1ZXMuXG4gICAgcmV0dXJuIHsgbmV4dDogZG9uZVJlc3VsdCB9O1xuICB9XG4gIHJ1bnRpbWUudmFsdWVzID0gdmFsdWVzO1xuXG4gIGZ1bmN0aW9uIGRvbmVSZXN1bHQoKSB7XG4gICAgcmV0dXJuIHsgdmFsdWU6IHVuZGVmaW5lZCwgZG9uZTogdHJ1ZSB9O1xuICB9XG5cbiAgQ29udGV4dC5wcm90b3R5cGUgPSB7XG4gICAgY29uc3RydWN0b3I6IENvbnRleHQsXG5cbiAgICByZXNldDogZnVuY3Rpb24oc2tpcFRlbXBSZXNldCkge1xuICAgICAgdGhpcy5wcmV2ID0gMDtcbiAgICAgIHRoaXMubmV4dCA9IDA7XG4gICAgICB0aGlzLnNlbnQgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLmRvbmUgPSBmYWxzZTtcbiAgICAgIHRoaXMuZGVsZWdhdGUgPSBudWxsO1xuXG4gICAgICB0aGlzLnRyeUVudHJpZXMuZm9yRWFjaChyZXNldFRyeUVudHJ5KTtcblxuICAgICAgaWYgKCFza2lwVGVtcFJlc2V0KSB7XG4gICAgICAgIGZvciAodmFyIG5hbWUgaW4gdGhpcykge1xuICAgICAgICAgIC8vIE5vdCBzdXJlIGFib3V0IHRoZSBvcHRpbWFsIG9yZGVyIG9mIHRoZXNlIGNvbmRpdGlvbnM6XG4gICAgICAgICAgaWYgKG5hbWUuY2hhckF0KDApID09PSBcInRcIiAmJlxuICAgICAgICAgICAgICBoYXNPd24uY2FsbCh0aGlzLCBuYW1lKSAmJlxuICAgICAgICAgICAgICAhaXNOYU4oK25hbWUuc2xpY2UoMSkpKSB7XG4gICAgICAgICAgICB0aGlzW25hbWVdID0gdW5kZWZpbmVkO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBzdG9wOiBmdW5jdGlvbigpIHtcbiAgICAgIHRoaXMuZG9uZSA9IHRydWU7XG5cbiAgICAgIHZhciByb290RW50cnkgPSB0aGlzLnRyeUVudHJpZXNbMF07XG4gICAgICB2YXIgcm9vdFJlY29yZCA9IHJvb3RFbnRyeS5jb21wbGV0aW9uO1xuICAgICAgaWYgKHJvb3RSZWNvcmQudHlwZSA9PT0gXCJ0aHJvd1wiKSB7XG4gICAgICAgIHRocm93IHJvb3RSZWNvcmQuYXJnO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpcy5ydmFsO1xuICAgIH0sXG5cbiAgICBkaXNwYXRjaEV4Y2VwdGlvbjogZnVuY3Rpb24oZXhjZXB0aW9uKSB7XG4gICAgICBpZiAodGhpcy5kb25lKSB7XG4gICAgICAgIHRocm93IGV4Y2VwdGlvbjtcbiAgICAgIH1cblxuICAgICAgdmFyIGNvbnRleHQgPSB0aGlzO1xuICAgICAgZnVuY3Rpb24gaGFuZGxlKGxvYywgY2F1Z2h0KSB7XG4gICAgICAgIHJlY29yZC50eXBlID0gXCJ0aHJvd1wiO1xuICAgICAgICByZWNvcmQuYXJnID0gZXhjZXB0aW9uO1xuICAgICAgICBjb250ZXh0Lm5leHQgPSBsb2M7XG4gICAgICAgIHJldHVybiAhIWNhdWdodDtcbiAgICAgIH1cblxuICAgICAgZm9yICh2YXIgaSA9IHRoaXMudHJ5RW50cmllcy5sZW5ndGggLSAxOyBpID49IDA7IC0taSkge1xuICAgICAgICB2YXIgZW50cnkgPSB0aGlzLnRyeUVudHJpZXNbaV07XG4gICAgICAgIHZhciByZWNvcmQgPSBlbnRyeS5jb21wbGV0aW9uO1xuXG4gICAgICAgIGlmIChlbnRyeS50cnlMb2MgPT09IFwicm9vdFwiKSB7XG4gICAgICAgICAgLy8gRXhjZXB0aW9uIHRocm93biBvdXRzaWRlIG9mIGFueSB0cnkgYmxvY2sgdGhhdCBjb3VsZCBoYW5kbGVcbiAgICAgICAgICAvLyBpdCwgc28gc2V0IHRoZSBjb21wbGV0aW9uIHZhbHVlIG9mIHRoZSBlbnRpcmUgZnVuY3Rpb24gdG9cbiAgICAgICAgICAvLyB0aHJvdyB0aGUgZXhjZXB0aW9uLlxuICAgICAgICAgIHJldHVybiBoYW5kbGUoXCJlbmRcIik7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZW50cnkudHJ5TG9jIDw9IHRoaXMucHJldikge1xuICAgICAgICAgIHZhciBoYXNDYXRjaCA9IGhhc093bi5jYWxsKGVudHJ5LCBcImNhdGNoTG9jXCIpO1xuICAgICAgICAgIHZhciBoYXNGaW5hbGx5ID0gaGFzT3duLmNhbGwoZW50cnksIFwiZmluYWxseUxvY1wiKTtcblxuICAgICAgICAgIGlmIChoYXNDYXRjaCAmJiBoYXNGaW5hbGx5KSB7XG4gICAgICAgICAgICBpZiAodGhpcy5wcmV2IDwgZW50cnkuY2F0Y2hMb2MpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGhhbmRsZShlbnRyeS5jYXRjaExvYywgdHJ1ZSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMucHJldiA8IGVudHJ5LmZpbmFsbHlMb2MpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGhhbmRsZShlbnRyeS5maW5hbGx5TG9jKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgIH0gZWxzZSBpZiAoaGFzQ2F0Y2gpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnByZXYgPCBlbnRyeS5jYXRjaExvYykge1xuICAgICAgICAgICAgICByZXR1cm4gaGFuZGxlKGVudHJ5LmNhdGNoTG9jLCB0cnVlKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgIH0gZWxzZSBpZiAoaGFzRmluYWxseSkge1xuICAgICAgICAgICAgaWYgKHRoaXMucHJldiA8IGVudHJ5LmZpbmFsbHlMb2MpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGhhbmRsZShlbnRyeS5maW5hbGx5TG9jKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJ0cnkgc3RhdGVtZW50IHdpdGhvdXQgY2F0Y2ggb3IgZmluYWxseVwiKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuXG4gICAgYWJydXB0OiBmdW5jdGlvbih0eXBlLCBhcmcpIHtcbiAgICAgIGZvciAodmFyIGkgPSB0aGlzLnRyeUVudHJpZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyAtLWkpIHtcbiAgICAgICAgdmFyIGVudHJ5ID0gdGhpcy50cnlFbnRyaWVzW2ldO1xuICAgICAgICBpZiAoZW50cnkudHJ5TG9jIDw9IHRoaXMucHJldiAmJlxuICAgICAgICAgICAgaGFzT3duLmNhbGwoZW50cnksIFwiZmluYWxseUxvY1wiKSAmJlxuICAgICAgICAgICAgdGhpcy5wcmV2IDwgZW50cnkuZmluYWxseUxvYykge1xuICAgICAgICAgIHZhciBmaW5hbGx5RW50cnkgPSBlbnRyeTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoZmluYWxseUVudHJ5ICYmXG4gICAgICAgICAgKHR5cGUgPT09IFwiYnJlYWtcIiB8fFxuICAgICAgICAgICB0eXBlID09PSBcImNvbnRpbnVlXCIpICYmXG4gICAgICAgICAgZmluYWxseUVudHJ5LnRyeUxvYyA8PSBhcmcgJiZcbiAgICAgICAgICBhcmcgPD0gZmluYWxseUVudHJ5LmZpbmFsbHlMb2MpIHtcbiAgICAgICAgLy8gSWdub3JlIHRoZSBmaW5hbGx5IGVudHJ5IGlmIGNvbnRyb2wgaXMgbm90IGp1bXBpbmcgdG8gYVxuICAgICAgICAvLyBsb2NhdGlvbiBvdXRzaWRlIHRoZSB0cnkvY2F0Y2ggYmxvY2suXG4gICAgICAgIGZpbmFsbHlFbnRyeSA9IG51bGw7XG4gICAgICB9XG5cbiAgICAgIHZhciByZWNvcmQgPSBmaW5hbGx5RW50cnkgPyBmaW5hbGx5RW50cnkuY29tcGxldGlvbiA6IHt9O1xuICAgICAgcmVjb3JkLnR5cGUgPSB0eXBlO1xuICAgICAgcmVjb3JkLmFyZyA9IGFyZztcblxuICAgICAgaWYgKGZpbmFsbHlFbnRyeSkge1xuICAgICAgICB0aGlzLm5leHQgPSBmaW5hbGx5RW50cnkuZmluYWxseUxvYztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuY29tcGxldGUocmVjb3JkKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIENvbnRpbnVlU2VudGluZWw7XG4gICAgfSxcblxuICAgIGNvbXBsZXRlOiBmdW5jdGlvbihyZWNvcmQsIGFmdGVyTG9jKSB7XG4gICAgICBpZiAocmVjb3JkLnR5cGUgPT09IFwidGhyb3dcIikge1xuICAgICAgICB0aHJvdyByZWNvcmQuYXJnO1xuICAgICAgfVxuXG4gICAgICBpZiAocmVjb3JkLnR5cGUgPT09IFwiYnJlYWtcIiB8fFxuICAgICAgICAgIHJlY29yZC50eXBlID09PSBcImNvbnRpbnVlXCIpIHtcbiAgICAgICAgdGhpcy5uZXh0ID0gcmVjb3JkLmFyZztcbiAgICAgIH0gZWxzZSBpZiAocmVjb3JkLnR5cGUgPT09IFwicmV0dXJuXCIpIHtcbiAgICAgICAgdGhpcy5ydmFsID0gcmVjb3JkLmFyZztcbiAgICAgICAgdGhpcy5uZXh0ID0gXCJlbmRcIjtcbiAgICAgIH0gZWxzZSBpZiAocmVjb3JkLnR5cGUgPT09IFwibm9ybWFsXCIgJiYgYWZ0ZXJMb2MpIHtcbiAgICAgICAgdGhpcy5uZXh0ID0gYWZ0ZXJMb2M7XG4gICAgICB9XG4gICAgfSxcblxuICAgIGZpbmlzaDogZnVuY3Rpb24oZmluYWxseUxvYykge1xuICAgICAgZm9yICh2YXIgaSA9IHRoaXMudHJ5RW50cmllcy5sZW5ndGggLSAxOyBpID49IDA7IC0taSkge1xuICAgICAgICB2YXIgZW50cnkgPSB0aGlzLnRyeUVudHJpZXNbaV07XG4gICAgICAgIGlmIChlbnRyeS5maW5hbGx5TG9jID09PSBmaW5hbGx5TG9jKSB7XG4gICAgICAgICAgdGhpcy5jb21wbGV0ZShlbnRyeS5jb21wbGV0aW9uLCBlbnRyeS5hZnRlckxvYyk7XG4gICAgICAgICAgcmVzZXRUcnlFbnRyeShlbnRyeSk7XG4gICAgICAgICAgcmV0dXJuIENvbnRpbnVlU2VudGluZWw7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuXG4gICAgXCJjYXRjaFwiOiBmdW5jdGlvbih0cnlMb2MpIHtcbiAgICAgIGZvciAodmFyIGkgPSB0aGlzLnRyeUVudHJpZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyAtLWkpIHtcbiAgICAgICAgdmFyIGVudHJ5ID0gdGhpcy50cnlFbnRyaWVzW2ldO1xuICAgICAgICBpZiAoZW50cnkudHJ5TG9jID09PSB0cnlMb2MpIHtcbiAgICAgICAgICB2YXIgcmVjb3JkID0gZW50cnkuY29tcGxldGlvbjtcbiAgICAgICAgICBpZiAocmVjb3JkLnR5cGUgPT09IFwidGhyb3dcIikge1xuICAgICAgICAgICAgdmFyIHRocm93biA9IHJlY29yZC5hcmc7XG4gICAgICAgICAgICByZXNldFRyeUVudHJ5KGVudHJ5KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHRocm93bjtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBUaGUgY29udGV4dC5jYXRjaCBtZXRob2QgbXVzdCBvbmx5IGJlIGNhbGxlZCB3aXRoIGEgbG9jYXRpb25cbiAgICAgIC8vIGFyZ3VtZW50IHRoYXQgY29ycmVzcG9uZHMgdG8gYSBrbm93biBjYXRjaCBibG9jay5cbiAgICAgIHRocm93IG5ldyBFcnJvcihcImlsbGVnYWwgY2F0Y2ggYXR0ZW1wdFwiKTtcbiAgICB9LFxuXG4gICAgZGVsZWdhdGVZaWVsZDogZnVuY3Rpb24oaXRlcmFibGUsIHJlc3VsdE5hbWUsIG5leHRMb2MpIHtcbiAgICAgIHRoaXMuZGVsZWdhdGUgPSB7XG4gICAgICAgIGl0ZXJhdG9yOiB2YWx1ZXMoaXRlcmFibGUpLFxuICAgICAgICByZXN1bHROYW1lOiByZXN1bHROYW1lLFxuICAgICAgICBuZXh0TG9jOiBuZXh0TG9jXG4gICAgICB9O1xuXG4gICAgICByZXR1cm4gQ29udGludWVTZW50aW5lbDtcbiAgICB9XG4gIH07XG59KShcbiAgLy8gQW1vbmcgdGhlIHZhcmlvdXMgdHJpY2tzIGZvciBvYnRhaW5pbmcgYSByZWZlcmVuY2UgdG8gdGhlIGdsb2JhbFxuICAvLyBvYmplY3QsIHRoaXMgc2VlbXMgdG8gYmUgdGhlIG1vc3QgcmVsaWFibGUgdGVjaG5pcXVlIHRoYXQgZG9lcyBub3RcbiAgLy8gdXNlIGluZGlyZWN0IGV2YWwgKHdoaWNoIHZpb2xhdGVzIENvbnRlbnQgU2VjdXJpdHkgUG9saWN5KS5cbiAgdHlwZW9mIGdsb2JhbCA9PT0gXCJvYmplY3RcIiA/IGdsb2JhbCA6XG4gIHR5cGVvZiB3aW5kb3cgPT09IFwib2JqZWN0XCIgPyB3aW5kb3cgOlxuICB0eXBlb2Ygc2VsZiA9PT0gXCJvYmplY3RcIiA/IHNlbGYgOiB0aGlzXG4pO1xuXG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vYmFiZWwtcmVnZW5lcmF0b3ItcnVudGltZS9ydW50aW1lLmpzXG4gKiogbW9kdWxlIGlkID0gNDAwXG4gKiogbW9kdWxlIGNodW5rcyA9IDI0XG4gKiovIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9");

/***/ },
/* 401 */
/***/ 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\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDAxLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vfi9wcm9jZXNzL2Jyb3dzZXIuanM/ODJlNCJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBzaGltIGZvciB1c2luZyBwcm9jZXNzIGluIGJyb3dzZXJcbnZhciBwcm9jZXNzID0gbW9kdWxlLmV4cG9ydHMgPSB7fTtcblxuLy8gY2FjaGVkIGZyb20gd2hhdGV2ZXIgZ2xvYmFsIGlzIHByZXNlbnQgc28gdGhhdCB0ZXN0IHJ1bm5lcnMgdGhhdCBzdHViIGl0XG4vLyBkb24ndCBicmVhayB0aGluZ3MuICBCdXQgd2UgbmVlZCB0byB3cmFwIGl0IGluIGEgdHJ5IGNhdGNoIGluIGNhc2UgaXQgaXNcbi8vIHdyYXBwZWQgaW4gc3RyaWN0IG1vZGUgY29kZSB3aGljaCBkb2Vzbid0IGRlZmluZSBhbnkgZ2xvYmFscy4gIEl0J3MgaW5zaWRlIGFcbi8vIGZ1bmN0aW9uIGJlY2F1c2UgdHJ5L2NhdGNoZXMgZGVvcHRpbWl6ZSBpbiBjZXJ0YWluIGVuZ2luZXMuXG5cbnZhciBjYWNoZWRTZXRUaW1lb3V0O1xudmFyIGNhY2hlZENsZWFyVGltZW91dDtcblxuZnVuY3Rpb24gZGVmYXVsdFNldFRpbW91dCgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3NldFRpbWVvdXQgaGFzIG5vdCBiZWVuIGRlZmluZWQnKTtcbn1cbmZ1bmN0aW9uIGRlZmF1bHRDbGVhclRpbWVvdXQgKCkge1xuICAgIHRocm93IG5ldyBFcnJvcignY2xlYXJUaW1lb3V0IGhhcyBub3QgYmVlbiBkZWZpbmVkJyk7XG59XG4oZnVuY3Rpb24gKCkge1xuICAgIHRyeSB7XG4gICAgICAgIGlmICh0eXBlb2Ygc2V0VGltZW91dCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgY2FjaGVkU2V0VGltZW91dCA9IHNldFRpbWVvdXQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjYWNoZWRTZXRUaW1lb3V0ID0gZGVmYXVsdFNldFRpbW91dDtcbiAgICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgY2FjaGVkU2V0VGltZW91dCA9IGRlZmF1bHRTZXRUaW1vdXQ7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAgIGlmICh0eXBlb2YgY2xlYXJUaW1lb3V0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBjYWNoZWRDbGVhclRpbWVvdXQgPSBjbGVhclRpbWVvdXQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjYWNoZWRDbGVhclRpbWVvdXQgPSBkZWZhdWx0Q2xlYXJUaW1lb3V0O1xuICAgICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBjYWNoZWRDbGVhclRpbWVvdXQgPSBkZWZhdWx0Q2xlYXJUaW1lb3V0O1xuICAgIH1cbn0gKCkpXG5mdW5jdGlvbiBydW5UaW1lb3V0KGZ1bikge1xuICAgIGlmIChjYWNoZWRTZXRUaW1lb3V0ID09PSBzZXRUaW1lb3V0KSB7XG4gICAgICAgIC8vbm9ybWFsIGVudmlyb21lbnRzIGluIHNhbmUgc2l0dWF0aW9uc1xuICAgICAgICByZXR1cm4gc2V0VGltZW91dChmdW4sIDApO1xuICAgIH1cbiAgICAvLyBpZiBzZXRUaW1lb3V0IHdhc24ndCBhdmFpbGFibGUgYnV0IHdhcyBsYXR0ZXIgZGVmaW5lZFxuICAgIGlmICgoY2FjaGVkU2V0VGltZW91dCA9PT0gZGVmYXVsdFNldFRpbW91dCB8fCAhY2FjaGVkU2V0VGltZW91dCkgJiYgc2V0VGltZW91dCkge1xuICAgICAgICBjYWNoZWRTZXRUaW1lb3V0ID0gc2V0VGltZW91dDtcbiAgICAgICAgcmV0dXJuIHNldFRpbWVvdXQoZnVuLCAwKTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgICAgLy8gd2hlbiB3aGVuIHNvbWVib2R5IGhhcyBzY3Jld2VkIHdpdGggc2V0VGltZW91dCBidXQgbm8gSS5FLiBtYWRkbmVzc1xuICAgICAgICByZXR1cm4gY2FjaGVkU2V0VGltZW91dChmdW4sIDApO1xuICAgIH0gY2F0Y2goZSl7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyBXaGVuIHdlIGFyZSBpbiBJLkUuIGJ1dCB0aGUgc2NyaXB0IGhhcyBiZWVuIGV2YWxlZCBzbyBJLkUuIGRvZXNuJ3QgdHJ1c3QgdGhlIGdsb2JhbCBvYmplY3Qgd2hlbiBjYWxsZWQgbm9ybWFsbHlcbiAgICAgICAgICAgIHJldHVybiBjYWNoZWRTZXRUaW1lb3V0LmNhbGwobnVsbCwgZnVuLCAwKTtcbiAgICAgICAgfSBjYXRjaChlKXtcbiAgICAgICAgICAgIC8vIHNhbWUgYXMgYWJvdmUgYnV0IHdoZW4gaXQncyBhIHZlcnNpb24gb2YgSS5FLiB0aGF0IG11c3QgaGF2ZSB0aGUgZ2xvYmFsIG9iamVjdCBmb3IgJ3RoaXMnLCBob3BmdWxseSBvdXIgY29udGV4dCBjb3JyZWN0IG90aGVyd2lzZSBpdCB3aWxsIHRocm93IGEgZ2xvYmFsIGVycm9yXG4gICAgICAgICAgICByZXR1cm4gY2FjaGVkU2V0VGltZW91dC5jYWxsKHRoaXMsIGZ1biwgMCk7XG4gICAgICAgIH1cbiAgICB9XG5cblxufVxuZnVuY3Rpb24gcnVuQ2xlYXJUaW1lb3V0KG1hcmtlcikge1xuICAgIGlmIChjYWNoZWRDbGVhclRpbWVvdXQgPT09IGNsZWFyVGltZW91dCkge1xuICAgICAgICAvL25vcm1hbCBlbnZpcm9tZW50cyBpbiBzYW5lIHNpdHVhdGlvbnNcbiAgICAgICAgcmV0dXJuIGNsZWFyVGltZW91dChtYXJrZXIpO1xuICAgIH1cbiAgICAvLyBpZiBjbGVhclRpbWVvdXQgd2Fzbid0IGF2YWlsYWJsZSBidXQgd2FzIGxhdHRlciBkZWZpbmVkXG4gICAgaWYgKChjYWNoZWRDbGVhclRpbWVvdXQgPT09IGRlZmF1bHRDbGVhclRpbWVvdXQgfHwgIWNhY2hlZENsZWFyVGltZW91dCkgJiYgY2xlYXJUaW1lb3V0KSB7XG4gICAgICAgIGNhY2hlZENsZWFyVGltZW91dCA9IGNsZWFyVGltZW91dDtcbiAgICAgICAgcmV0dXJuIGNsZWFyVGltZW91dChtYXJrZXIpO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgICAvLyB3aGVuIHdoZW4gc29tZWJvZHkgaGFzIHNjcmV3ZWQgd2l0aCBzZXRUaW1lb3V0IGJ1dCBubyBJLkUuIG1hZGRuZXNzXG4gICAgICAgIHJldHVybiBjYWNoZWRDbGVhclRpbWVvdXQobWFya2VyKTtcbiAgICB9IGNhdGNoIChlKXtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIFdoZW4gd2UgYXJlIGluIEkuRS4gYnV0IHRoZSBzY3JpcHQgaGFzIGJlZW4gZXZhbGVkIHNvIEkuRS4gZG9lc24ndCAgdHJ1c3QgdGhlIGdsb2JhbCBvYmplY3Qgd2hlbiBjYWxsZWQgbm9ybWFsbHlcbiAgICAgICAgICAgIHJldHVybiBjYWNoZWRDbGVhclRpbWVvdXQuY2FsbChudWxsLCBtYXJrZXIpO1xuICAgICAgICB9IGNhdGNoIChlKXtcbiAgICAgICAgICAgIC8vIHNhbWUgYXMgYWJvdmUgYnV0IHdoZW4gaXQncyBhIHZlcnNpb24gb2YgSS5FLiB0aGF0IG11c3QgaGF2ZSB0aGUgZ2xvYmFsIG9iamVjdCBmb3IgJ3RoaXMnLCBob3BmdWxseSBvdXIgY29udGV4dCBjb3JyZWN0IG90aGVyd2lzZSBpdCB3aWxsIHRocm93IGEgZ2xvYmFsIGVycm9yLlxuICAgICAgICAgICAgLy8gU29tZSB2ZXJzaW9ucyBvZiBJLkUuIGhhdmUgZGlmZmVyZW50IHJ1bGVzIGZvciBjbGVhclRpbWVvdXQgdnMgc2V0VGltZW91dFxuICAgICAgICAgICAgcmV0dXJuIGNhY2hlZENsZWFyVGltZW91dC5jYWxsKHRoaXMsIG1hcmtlcik7XG4gICAgICAgIH1cbiAgICB9XG5cblxuXG59XG52YXIgcXVldWUgPSBbXTtcbnZhciBkcmFpbmluZyA9IGZhbHNlO1xudmFyIGN1cnJlbnRRdWV1ZTtcbnZhciBxdWV1ZUluZGV4ID0gLTE7XG5cbmZ1bmN0aW9uIGNsZWFuVXBOZXh0VGljaygpIHtcbiAgICBpZiAoIWRyYWluaW5nIHx8ICFjdXJyZW50UXVldWUpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBkcmFpbmluZyA9IGZhbHNlO1xuICAgIGlmIChjdXJyZW50UXVldWUubGVuZ3RoKSB7XG4gICAgICAgIHF1ZXVlID0gY3VycmVudFF1ZXVlLmNvbmNhdChxdWV1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcXVldWVJbmRleCA9IC0xO1xuICAgIH1cbiAgICBpZiAocXVldWUubGVuZ3RoKSB7XG4gICAgICAgIGRyYWluUXVldWUoKTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGRyYWluUXVldWUoKSB7XG4gICAgaWYgKGRyYWluaW5nKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmFyIHRpbWVvdXQgPSBydW5UaW1lb3V0KGNsZWFuVXBOZXh0VGljayk7XG4gICAgZHJhaW5pbmcgPSB0cnVlO1xuXG4gICAgdmFyIGxlbiA9IHF1ZXVlLmxlbmd0aDtcbiAgICB3aGlsZShsZW4pIHtcbiAgICAgICAgY3VycmVudFF1ZXVlID0gcXVldWU7XG4gICAgICAgIHF1ZXVlID0gW107XG4gICAgICAgIHdoaWxlICgrK3F1ZXVlSW5kZXggPCBsZW4pIHtcbiAgICAgICAgICAgIGlmIChjdXJyZW50UXVldWUpIHtcbiAgICAgICAgICAgICAgICBjdXJyZW50UXVldWVbcXVldWVJbmRleF0ucnVuKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcXVldWVJbmRleCA9IC0xO1xuICAgICAgICBsZW4gPSBxdWV1ZS5sZW5ndGg7XG4gICAgfVxuICAgIGN1cnJlbnRRdWV1ZSA9IG51bGw7XG4gICAgZHJhaW5pbmcgPSBmYWxzZTtcbiAgICBydW5DbGVhclRpbWVvdXQodGltZW91dCk7XG59XG5cbnByb2Nlc3MubmV4dFRpY2sgPSBmdW5jdGlvbiAoZnVuKSB7XG4gICAgdmFyIGFyZ3MgPSBuZXcgQXJyYXkoYXJndW1lbnRzLmxlbmd0aCAtIDEpO1xuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID4gMSkge1xuICAgICAgICBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgYXJnc1tpIC0gMV0gPSBhcmd1bWVudHNbaV07XG4gICAgICAgIH1cbiAgICB9XG4gICAgcXVldWUucHVzaChuZXcgSXRlbShmdW4sIGFyZ3MpKTtcbiAgICBpZiAocXVldWUubGVuZ3RoID09PSAxICYmICFkcmFpbmluZykge1xuICAgICAgICBydW5UaW1lb3V0KGRyYWluUXVldWUpO1xuICAgIH1cbn07XG5cbi8vIHY4IGxpa2VzIHByZWRpY3RpYmxlIG9iamVjdHNcbmZ1bmN0aW9uIEl0ZW0oZnVuLCBhcnJheSkge1xuICAgIHRoaXMuZnVuID0gZnVuO1xuICAgIHRoaXMuYXJyYXkgPSBhcnJheTtcbn1cbkl0ZW0ucHJvdG90eXBlLnJ1biA9IGZ1bmN0aW9uICgpIHtcbiAgICB0aGlzLmZ1bi5hcHBseShudWxsLCB0aGlzLmFycmF5KTtcbn07XG5wcm9jZXNzLnRpdGxlID0gJ2Jyb3dzZXInO1xucHJvY2Vzcy5icm93c2VyID0gdHJ1ZTtcbnByb2Nlc3MuZW52ID0ge307XG5wcm9jZXNzLmFyZ3YgPSBbXTtcbnByb2Nlc3MudmVyc2lvbiA9ICcnOyAvLyBlbXB0eSBzdHJpbmcgdG8gYXZvaWQgcmVnZXhwIGlzc3Vlc1xucHJvY2Vzcy52ZXJzaW9ucyA9IHt9O1xuXG5mdW5jdGlvbiBub29wKCkge31cblxucHJvY2Vzcy5vbiA9IG5vb3A7XG5wcm9jZXNzLmFkZExpc3RlbmVyID0gbm9vcDtcbnByb2Nlc3Mub25jZSA9IG5vb3A7XG5wcm9jZXNzLm9mZiA9IG5vb3A7XG5wcm9jZXNzLnJlbW92ZUxpc3RlbmVyID0gbm9vcDtcbnByb2Nlc3MucmVtb3ZlQWxsTGlzdGVuZXJzID0gbm9vcDtcbnByb2Nlc3MuZW1pdCA9IG5vb3A7XG5cbnByb2Nlc3MuYmluZGluZyA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdwcm9jZXNzLmJpbmRpbmcgaXMgbm90IHN1cHBvcnRlZCcpO1xufTtcblxucHJvY2Vzcy5jd2QgPSBmdW5jdGlvbiAoKSB7IHJldHVybiAnLycgfTtcbnByb2Nlc3MuY2hkaXIgPSBmdW5jdGlvbiAoZGlyKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdwcm9jZXNzLmNoZGlyIGlzIG5vdCBzdXBwb3J0ZWQnKTtcbn07XG5wcm9jZXNzLnVtYXNrID0gZnVuY3Rpb24oKSB7IHJldHVybiAwOyB9O1xuXG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vcHJvY2Vzcy9icm93c2VyLmpzXG4gKiogbW9kdWxlIGlkID0gNDAxXG4gKiogbW9kdWxlIGNodW5rcyA9IDI0XG4gKiovIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9");

/***/ }
/******/ ]);
