
try{(function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c="function"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error("Cannot find module '"+i+"'");throw a.code="MODULE_NOT_FOUND",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u="function"==typeof require&&require,i=0;i<t.length;i++)o(t[i]);return o}return r})()({1:[function(require,module,exports){
"use strict";

module.exports = require('./lib/axios');

},{"./lib/axios":3}],2:[function(require,module,exports){
(function (process){
'use strict';

var utils = require('./../utils');

var settle = require('./../core/settle');

var buildURL = require('./../helpers/buildURL');

var parseHeaders = require('./../helpers/parseHeaders');

var isURLSameOrigin = require('./../helpers/isURLSameOrigin');

var createError = require('../core/createError');

var btoa = typeof window !== 'undefined' && window.btoa && window.btoa.bind(window) || require('./../helpers/btoa');

module.exports = function xhrAdapter(config) {
  return new Promise(function dispatchXhrRequest(resolve, reject) {
    var requestData = config.data;
    var requestHeaders = config.headers;

    if (utils.isFormData(requestData)) {
      delete requestHeaders['Content-Type']; // Let the browser set it
    }

    var request = new XMLHttpRequest();
    var loadEvent = 'onreadystatechange';
    var xDomain = false; // For IE 8/9 CORS support
    // Only supports POST and GET calls and doesn't returns the response headers.
    // DON'T do this for testing b/c XMLHttpRequest is mocked, not XDomainRequest.

    if (process.env.NODE_ENV !== 'test' && typeof window !== 'undefined' && window.XDomainRequest && !('withCredentials' in request) && !isURLSameOrigin(config.url)) {
      request = new window.XDomainRequest();
      loadEvent = 'onload';
      xDomain = true;

      request.onprogress = function handleProgress() {};

      request.ontimeout = function handleTimeout() {};
    } // HTTP basic authentication


    if (config.auth) {
      var username = config.auth.username || '';
      var password = config.auth.password || '';
      requestHeaders.Authorization = 'Basic ' + btoa(username + ':' + password);
    }

    request.open(config.method.toUpperCase(), buildURL(config.url, config.params, config.paramsSerializer), true); // Set the request timeout in MS

    request.timeout = config.timeout; // Listen for ready state

    request[loadEvent] = function handleLoad() {
      if (!request || request.readyState !== 4 && !xDomain) {
        return;
      } // The request errored out and we didn't get a response, this will be
      // handled by onerror instead
      // With one exception: request that using file: protocol, most browsers
      // will return status as 0 even though it's a successful request


      if (request.status === 0 && !(request.responseURL && request.responseURL.indexOf('file:') === 0)) {
        return;
      } // Prepare the response


      var responseHeaders = 'getAllResponseHeaders' in request ? parseHeaders(request.getAllResponseHeaders()) : null;
      var responseData = !config.responseType || config.responseType === 'text' ? request.responseText : request.response;
      var response = {
        data: responseData,
        // IE sends 1223 instead of 204 (https://github.com/axios/axios/issues/201)
        status: request.status === 1223 ? 204 : request.status,
        statusText: request.status === 1223 ? 'No Content' : request.statusText,
        headers: responseHeaders,
        config: config,
        request: request
      };
      settle(resolve, reject, response); // Clean up request

      request = null;
    }; // Handle low level network errors


    request.onerror = function handleError() {
      // Real errors are hidden from us by the browser
      // onerror should only fire if it's a network error
      reject(createError('Network Error', config, null, request)); // Clean up request

      request = null;
    }; // Handle timeout


    request.ontimeout = function handleTimeout() {
      reject(createError('timeout of ' + config.timeout + 'ms exceeded', config, 'ECONNABORTED', request)); // Clean up request

      request = null;
    }; // Add xsrf header
    // This is only done if running in a standard browser environment.
    // Specifically not if we're in a web worker, or react-native.


    if (utils.isStandardBrowserEnv()) {
      var cookies = require('./../helpers/cookies'); // Add xsrf header


      var xsrfValue = (config.withCredentials || isURLSameOrigin(config.url)) && config.xsrfCookieName ? cookies.read(config.xsrfCookieName) : undefined;

      if (xsrfValue) {
        requestHeaders[config.xsrfHeaderName] = xsrfValue;
      }
    } // Add headers to the request


    if ('setRequestHeader' in request) {
      utils.forEach(requestHeaders, function setRequestHeader(val, key) {
        if (typeof requestData === 'undefined' && key.toLowerCase() === 'content-type') {
          // Remove Content-Type if data is undefined
          delete requestHeaders[key];
        } else {
          // Otherwise add header to the request
          request.setRequestHeader(key, val);
        }
      });
    } // Add withCredentials to request if needed


    if (config.withCredentials) {
      request.withCredentials = true;
    } // Add responseType to request if needed


    if (config.responseType) {
      try {
        request.responseType = config.responseType;
      } catch (e) {
        // Expected DOMException thrown by browsers not compatible XMLHttpRequest Level 2.
        // But, this can be suppressed for 'json' type as it can be parsed by default 'transformResponse' function.
        if (config.responseType !== 'json') {
          throw e;
        }
      }
    } // Handle progress if needed


    if (typeof config.onDownloadProgress === 'function') {
      request.addEventListener('progress', config.onDownloadProgress);
    } // Not all browsers support upload events


    if (typeof config.onUploadProgress === 'function' && request.upload) {
      request.upload.addEventListener('progress', config.onUploadProgress);
    }

    if (config.cancelToken) {
      // Handle cancellation
      config.cancelToken.promise.then(function onCanceled(cancel) {
        if (!request) {
          return;
        }

        request.abort();
        reject(cancel); // Clean up request

        request = null;
      });
    }

    if (requestData === undefined) {
      requestData = null;
    } // Send the request


    request.send(requestData);
  });
};

}).call(this,require('_process'))

},{"../core/createError":9,"./../core/settle":12,"./../helpers/btoa":16,"./../helpers/buildURL":17,"./../helpers/cookies":19,"./../helpers/isURLSameOrigin":21,"./../helpers/parseHeaders":23,"./../utils":25,"_process":361}],3:[function(require,module,exports){
'use strict';

var utils = require('./utils');

var bind = require('./helpers/bind');

var Axios = require('./core/Axios');

var defaults = require('./defaults');
/**
 * Create an instance of Axios
 *
 * @param {Object} defaultConfig The default config for the instance
 * @return {Axios} A new instance of Axios
 */


function createInstance(defaultConfig) {
  var context = new Axios(defaultConfig);
  var instance = bind(Axios.prototype.request, context); // Copy axios.prototype to instance

  utils.extend(instance, Axios.prototype, context); // Copy context to instance

  utils.extend(instance, context);
  return instance;
} // Create the default instance to be exported


var axios = createInstance(defaults); // Expose Axios class to allow class inheritance

axios.Axios = Axios; // Factory for creating new instances

axios.create = function create(instanceConfig) {
  return createInstance(utils.merge(defaults, instanceConfig));
}; // Expose Cancel & CancelToken


axios.Cancel = require('./cancel/Cancel');
axios.CancelToken = require('./cancel/CancelToken');
axios.isCancel = require('./cancel/isCancel'); // Expose all/spread

axios.all = function all(promises) {
  return Promise.all(promises);
};

axios.spread = require('./helpers/spread');
module.exports = axios; // Allow use of default import syntax in TypeScript

module.exports["default"] = axios;

},{"./cancel/Cancel":4,"./cancel/CancelToken":5,"./cancel/isCancel":6,"./core/Axios":7,"./defaults":14,"./helpers/bind":15,"./helpers/spread":24,"./utils":25}],4:[function(require,module,exports){
'use strict';
/**
 * A `Cancel` is an object that is thrown when an operation is canceled.
 *
 * @class
 * @param {string=} message The message.
 */

function Cancel(message) {
  this.message = message;
}

Cancel.prototype.toString = function toString() {
  return 'Cancel' + (this.message ? ': ' + this.message : '');
};

Cancel.prototype.__CANCEL__ = true;
module.exports = Cancel;

},{}],5:[function(require,module,exports){
'use strict';

var Cancel = require('./Cancel');
/**
 * A `CancelToken` is an object that can be used to request cancellation of an operation.
 *
 * @class
 * @param {Function} executor The executor function.
 */


function CancelToken(executor) {
  if (typeof executor !== 'function') {
    throw new TypeError('executor must be a function.');
  }

  var resolvePromise;
  this.promise = new Promise(function promiseExecutor(resolve) {
    resolvePromise = resolve;
  });
  var token = this;
  executor(function cancel(message) {
    if (token.reason) {
      // Cancellation has already been requested
      return;
    }

    token.reason = new Cancel(message);
    resolvePromise(token.reason);
  });
}
/**
 * Throws a `Cancel` if cancellation has been requested.
 */


CancelToken.prototype.throwIfRequested = function throwIfRequested() {
  if (this.reason) {
    throw this.reason;
  }
};
/**
 * Returns an object that contains a new `CancelToken` and a function that, when called,
 * cancels the `CancelToken`.
 */


CancelToken.source = function source() {
  var cancel;
  var token = new CancelToken(function executor(c) {
    cancel = c;
  });
  return {
    token: token,
    cancel: cancel
  };
};

module.exports = CancelToken;

},{"./Cancel":4}],6:[function(require,module,exports){
'use strict';

module.exports = function isCancel(value) {
  return !!(value && value.__CANCEL__);
};

},{}],7:[function(require,module,exports){
'use strict';

var defaults = require('./../defaults');

var utils = require('./../utils');

var InterceptorManager = require('./InterceptorManager');

var dispatchRequest = require('./dispatchRequest');
/**
 * Create a new instance of Axios
 *
 * @param {Object} instanceConfig The default config for the instance
 */


function Axios(instanceConfig) {
  this.defaults = instanceConfig;
  this.interceptors = {
    request: new InterceptorManager(),
    response: new InterceptorManager()
  };
}
/**
 * Dispatch a request
 *
 * @param {Object} config The config specific for this request (merged with this.defaults)
 */


Axios.prototype.request = function request(config) {
  /*eslint no-param-reassign:0*/
  // Allow for axios('example/url'[, config]) a la fetch API
  if (typeof config === 'string') {
    config = utils.merge({
      url: arguments[0]
    }, arguments[1]);
  }

  config = utils.merge(defaults, this.defaults, {
    method: 'get'
  }, config);
  config.method = config.method.toLowerCase(); // Hook up interceptors middleware

  var chain = [dispatchRequest, undefined];
  var promise = Promise.resolve(config);
  this.interceptors.request.forEach(function unshiftRequestInterceptors(interceptor) {
    chain.unshift(interceptor.fulfilled, interceptor.rejected);
  });
  this.interceptors.response.forEach(function pushResponseInterceptors(interceptor) {
    chain.push(interceptor.fulfilled, interceptor.rejected);
  });

  while (chain.length) {
    promise = promise.then(chain.shift(), chain.shift());
  }

  return promise;
}; // Provide aliases for supported request methods


utils.forEach(['delete', 'get', 'head', 'options'], function forEachMethodNoData(method) {
  /*eslint func-names:0*/
  Axios.prototype[method] = function (url, config) {
    return this.request(utils.merge(config || {}, {
      method: method,
      url: url
    }));
  };
});
utils.forEach(['post', 'put', 'patch'], function forEachMethodWithData(method) {
  /*eslint func-names:0*/
  Axios.prototype[method] = function (url, data, config) {
    return this.request(utils.merge(config || {}, {
      method: method,
      url: url,
      data: data
    }));
  };
});
module.exports = Axios;

},{"./../defaults":14,"./../utils":25,"./InterceptorManager":8,"./dispatchRequest":10}],8:[function(require,module,exports){
'use strict';

var utils = require('./../utils');

function InterceptorManager() {
  this.handlers = [];
}
/**
 * Add a new interceptor to the stack
 *
 * @param {Function} fulfilled The function to handle `then` for a `Promise`
 * @param {Function} rejected The function to handle `reject` for a `Promise`
 *
 * @return {Number} An ID used to remove interceptor later
 */


InterceptorManager.prototype.use = function use(fulfilled, rejected) {
  this.handlers.push({
    fulfilled: fulfilled,
    rejected: rejected
  });
  return this.handlers.length - 1;
};
/**
 * Remove an interceptor from the stack
 *
 * @param {Number} id The ID that was returned by `use`
 */


InterceptorManager.prototype.eject = function eject(id) {
  if (this.handlers[id]) {
    this.handlers[id] = null;
  }
};
/**
 * Iterate over all the registered interceptors
 *
 * This method is particularly useful for skipping over any
 * interceptors that may have become `null` calling `eject`.
 *
 * @param {Function} fn The function to call for each interceptor
 */


InterceptorManager.prototype.forEach = function forEach(fn) {
  utils.forEach(this.handlers, function forEachHandler(h) {
    if (h !== null) {
      fn(h);
    }
  });
};

module.exports = InterceptorManager;

},{"./../utils":25}],9:[function(require,module,exports){
'use strict';

var enhanceError = require('./enhanceError');
/**
 * Create an Error with the specified message, config, error code, request and response.
 *
 * @param {string} message The error message.
 * @param {Object} config The config.
 * @param {string} [code] The error code (for example, 'ECONNABORTED').
 * @param {Object} [request] The request.
 * @param {Object} [response] The response.
 * @returns {Error} The created error.
 */


module.exports = function createError(message, config, code, request, response) {
  var error = new Error(message);
  return enhanceError(error, config, code, request, response);
};

},{"./enhanceError":11}],10:[function(require,module,exports){
'use strict';

var utils = require('./../utils');

var transformData = require('./transformData');

var isCancel = require('../cancel/isCancel');

var defaults = require('../defaults');

var isAbsoluteURL = require('./../helpers/isAbsoluteURL');

var combineURLs = require('./../helpers/combineURLs');
/**
 * Throws a `Cancel` if cancellation has been requested.
 */


function throwIfCancellationRequested(config) {
  if (config.cancelToken) {
    config.cancelToken.throwIfRequested();
  }
}
/**
 * Dispatch a request to the server using the configured adapter.
 *
 * @param {object} config The config that is to be used for the request
 * @returns {Promise} The Promise to be fulfilled
 */


module.exports = function dispatchRequest(config) {
  throwIfCancellationRequested(config); // Support baseURL config

  if (config.baseURL && !isAbsoluteURL(config.url)) {
    config.url = combineURLs(config.baseURL, config.url);
  } // Ensure headers exist


  config.headers = config.headers || {}; // Transform request data

  config.data = transformData(config.data, config.headers, config.transformRequest); // Flatten headers

  config.headers = utils.merge(config.headers.common || {}, config.headers[config.method] || {}, config.headers || {});
  utils.forEach(['delete', 'get', 'head', 'post', 'put', 'patch', 'common'], function cleanHeaderConfig(method) {
    delete config.headers[method];
  });
  var adapter = config.adapter || defaults.adapter;
  return adapter(config).then(function onAdapterResolution(response) {
    throwIfCancellationRequested(config); // Transform response data

    response.data = transformData(response.data, response.headers, config.transformResponse);
    return response;
  }, function onAdapterRejection(reason) {
    if (!isCancel(reason)) {
      throwIfCancellationRequested(config); // Transform response data

      if (reason && reason.response) {
        reason.response.data = transformData(reason.response.data, reason.response.headers, config.transformResponse);
      }
    }

    return Promise.reject(reason);
  });
};

},{"../cancel/isCancel":6,"../defaults":14,"./../helpers/combineURLs":18,"./../helpers/isAbsoluteURL":20,"./../utils":25,"./transformData":13}],11:[function(require,module,exports){
'use strict';
/**
 * Update an Error with the specified config, error code, and response.
 *
 * @param {Error} error The error to update.
 * @param {Object} config The config.
 * @param {string} [code] The error code (for example, 'ECONNABORTED').
 * @param {Object} [request] The request.
 * @param {Object} [response] The response.
 * @returns {Error} The error.
 */

module.exports = function enhanceError(error, config, code, request, response) {
  error.config = config;

  if (code) {
    error.code = code;
  }

  error.request = request;
  error.response = response;
  return error;
};

},{}],12:[function(require,module,exports){
'use strict';

var createError = require('./createError');
/**
 * Resolve or reject a Promise based on response status.
 *
 * @param {Function} resolve A function that resolves the promise.
 * @param {Function} reject A function that rejects the promise.
 * @param {object} response The response.
 */


module.exports = function settle(resolve, reject, response) {
  var validateStatus = response.config.validateStatus; // Note: status is not exposed by XDomainRequest

  if (!response.status || !validateStatus || validateStatus(response.status)) {
    resolve(response);
  } else {
    reject(createError('Request failed with status code ' + response.status, response.config, null, response.request, response));
  }
};

},{"./createError":9}],13:[function(require,module,exports){
'use strict';

var utils = require('./../utils');
/**
 * Transform the data for a request or a response
 *
 * @param {Object|String} data The data to be transformed
 * @param {Array} headers The headers for the request or response
 * @param {Array|Function} fns A single function or Array of functions
 * @returns {*} The resulting transformed data
 */


module.exports = function transformData(data, headers, fns) {
  /*eslint no-param-reassign:0*/
  utils.forEach(fns, function transform(fn) {
    data = fn(data, headers);
  });
  return data;
};

},{"./../utils":25}],14:[function(require,module,exports){
(function (process){
'use strict';

var utils = require('./utils');

var normalizeHeaderName = require('./helpers/normalizeHeaderName');

var DEFAULT_CONTENT_TYPE = {
  'Content-Type': 'application/x-www-form-urlencoded'
};

function setContentTypeIfUnset(headers, value) {
  if (!utils.isUndefined(headers) && utils.isUndefined(headers['Content-Type'])) {
    headers['Content-Type'] = value;
  }
}

function getDefaultAdapter() {
  var adapter;

  if (typeof XMLHttpRequest !== 'undefined') {
    // For browsers use XHR adapter
    adapter = require('./adapters/xhr');
  } else if (typeof process !== 'undefined') {
    // For node use HTTP adapter
    adapter = require('./adapters/http');
  }

  return adapter;
}

var defaults = {
  adapter: getDefaultAdapter(),
  transformRequest: [function transformRequest(data, headers) {
    normalizeHeaderName(headers, 'Content-Type');

    if (utils.isFormData(data) || utils.isArrayBuffer(data) || utils.isBuffer(data) || utils.isStream(data) || utils.isFile(data) || utils.isBlob(data)) {
      return data;
    }

    if (utils.isArrayBufferView(data)) {
      return data.buffer;
    }

    if (utils.isURLSearchParams(data)) {
      setContentTypeIfUnset(headers, 'application/x-www-form-urlencoded;charset=utf-8');
      return data.toString();
    }

    if (utils.isObject(data)) {
      setContentTypeIfUnset(headers, 'application/json;charset=utf-8');
      return JSON.stringify(data);
    }

    return data;
  }],
  transformResponse: [function transformResponse(data) {
    /*eslint no-param-reassign:0*/
    if (typeof data === 'string') {
      try {
        data = JSON.parse(data);
      } catch (e) {
        /* Ignore */
      }
    }

    return data;
  }],
  timeout: 0,
  xsrfCookieName: 'XSRF-TOKEN',
  xsrfHeaderName: 'X-XSRF-TOKEN',
  maxContentLength: -1,
  validateStatus: function validateStatus(status) {
    return status >= 200 && status < 300;
  }
};
defaults.headers = {
  common: {
    'Accept': 'application/json, text/plain, */*'
  }
};
utils.forEach(['delete', 'get', 'head'], function forEachMethodNoData(method) {
  defaults.headers[method] = {};
});
utils.forEach(['post', 'put', 'patch'], function forEachMethodWithData(method) {
  defaults.headers[method] = utils.merge(DEFAULT_CONTENT_TYPE);
});
module.exports = defaults;

}).call(this,require('_process'))

},{"./adapters/http":2,"./adapters/xhr":2,"./helpers/normalizeHeaderName":22,"./utils":25,"_process":361}],15:[function(require,module,exports){
'use strict';

module.exports = function bind(fn, thisArg) {
  return function wrap() {
    var args = new Array(arguments.length);

    for (var i = 0; i < args.length; i++) {
      args[i] = arguments[i];
    }

    return fn.apply(thisArg, args);
  };
};

},{}],16:[function(require,module,exports){
'use strict'; // btoa polyfill for IE<10 courtesy https://github.com/davidchambers/Base64.js

var chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';

function E() {
  this.message = 'String contains an invalid character';
}

E.prototype = new Error();
E.prototype.code = 5;
E.prototype.name = 'InvalidCharacterError';

function btoa(input) {
  var str = String(input);
  var output = '';

  for ( // initialize result and counter
  var block, charCode, idx = 0, map = chars; // if the next str index does not exist:
  //   change the mapping table to "="
  //   check if d has no fractional digits
  str.charAt(idx | 0) || (map = '=', idx % 1); // "8 - idx % 1 * 8" generates the sequence 2, 4, 6, 8
  output += map.charAt(63 & block >> 8 - idx % 1 * 8)) {
    charCode = str.charCodeAt(idx += 3 / 4);

    if (charCode > 0xFF) {
      throw new E();
    }

    block = block << 8 | charCode;
  }

  return output;
}

module.exports = btoa;

},{}],17:[function(require,module,exports){
'use strict';

var utils = require('./../utils');

function encode(val) {
  return encodeURIComponent(val).replace(/%40/gi, '@').replace(/%3A/gi, ':').replace(/%24/g, '$').replace(/%2C/gi, ',').replace(/%20/g, '+').replace(/%5B/gi, '[').replace(/%5D/gi, ']');
}
/**
 * Build a URL by appending params to the end
 *
 * @param {string} url The base of the url (e.g., http://www.google.com)
 * @param {object} [params] The params to be appended
 * @returns {string} The formatted url
 */


module.exports = function buildURL(url, params, paramsSerializer) {
  /*eslint no-param-reassign:0*/
  if (!params) {
    return url;
  }

  var serializedParams;

  if (paramsSerializer) {
    serializedParams = paramsSerializer(params);
  } else if (utils.isURLSearchParams(params)) {
    serializedParams = params.toString();
  } else {
    var parts = [];
    utils.forEach(params, function serialize(val, key) {
      if (val === null || typeof val === 'undefined') {
        return;
      }

      if (utils.isArray(val)) {
        key = key + '[]';
      }

      if (!utils.isArray(val)) {
        val = [val];
      }

      utils.forEach(val, function parseValue(v) {
        if (utils.isDate(v)) {
          v = v.toISOString();
        } else if (utils.isObject(v)) {
          v = JSON.stringify(v);
        }

        parts.push(encode(key) + '=' + encode(v));
      });
    });
    serializedParams = parts.join('&');
  }

  if (serializedParams) {
    url += (url.indexOf('?') === -1 ? '?' : '&') + serializedParams;
  }

  return url;
};

},{"./../utils":25}],18:[function(require,module,exports){
'use strict';
/**
 * Creates a new URL by combining the specified URLs
 *
 * @param {string} baseURL The base URL
 * @param {string} relativeURL The relative URL
 * @returns {string} The combined URL
 */

module.exports = function combineURLs(baseURL, relativeURL) {
  return relativeURL ? baseURL.replace(/\/+$/, '') + '/' + relativeURL.replace(/^\/+/, '') : baseURL;
};

},{}],19:[function(require,module,exports){
'use strict';

var utils = require('./../utils');

module.exports = utils.isStandardBrowserEnv() ? // Standard browser envs support document.cookie
function standardBrowserEnv() {
  return {
    write: function write(name, value, expires, path, domain, secure) {
      var cookie = [];
      cookie.push(name + '=' + encodeURIComponent(value));

      if (utils.isNumber(expires)) {
        cookie.push('expires=' + new Date(expires).toGMTString());
      }

      if (utils.isString(path)) {
        cookie.push('path=' + path);
      }

      if (utils.isString(domain)) {
        cookie.push('domain=' + domain);
      }

      if (secure === true) {
        cookie.push('secure');
      }

      document.cookie = cookie.join('; ');
    },
    read: function read(name) {
      var match = document.cookie.match(new RegExp('(^|;\\s*)(' + name + ')=([^;]*)'));
      return match ? decodeURIComponent(match[3]) : null;
    },
    remove: function remove(name) {
      this.write(name, '', Date.now() - 86400000);
    }
  };
}() : // Non standard browser env (web workers, react-native) lack needed support.
function nonStandardBrowserEnv() {
  return {
    write: function write() {},
    read: function read() {
      return null;
    },
    remove: function remove() {}
  };
}();

},{"./../utils":25}],20:[function(require,module,exports){
'use strict';
/**
 * Determines whether the specified URL is absolute
 *
 * @param {string} url The URL to test
 * @returns {boolean} True if the specified URL is absolute, otherwise false
 */

module.exports = function isAbsoluteURL(url) {
  // A URL is considered absolute if it begins with "<scheme>://" or "//" (protocol-relative URL).
  // RFC 3986 defines scheme name as a sequence of characters beginning with a letter and followed
  // by any combination of letters, digits, plus, period, or hyphen.
  return /^([a-z][a-z\d\+\-\.]*:)?\/\//i.test(url);
};

},{}],21:[function(require,module,exports){
'use strict';

var utils = require('./../utils');

module.exports = utils.isStandardBrowserEnv() ? // Standard browser envs have full support of the APIs needed to test
// whether the request URL is of the same origin as current location.
function standardBrowserEnv() {
  var msie = /(msie|trident)/i.test(navigator.userAgent);
  var urlParsingNode = document.createElement('a');
  var originURL;
  /**
  * Parse a URL to discover it's components
  *
  * @param {String} url The URL to be parsed
  * @returns {Object}
  */

  function resolveURL(url) {
    var href = url;

    if (msie) {
      // IE needs attribute set twice to normalize properties
      urlParsingNode.setAttribute('href', href);
      href = urlParsingNode.href;
    }

    urlParsingNode.setAttribute('href', href); // urlParsingNode provides the UrlUtils interface - http://url.spec.whatwg.org/#urlutils

    return {
      href: urlParsingNode.href,
      protocol: urlParsingNode.protocol ? urlParsingNode.protocol.replace(/:$/, '') : '',
      host: urlParsingNode.host,
      search: urlParsingNode.search ? urlParsingNode.search.replace(/^\?/, '') : '',
      hash: urlParsingNode.hash ? urlParsingNode.hash.replace(/^#/, '') : '',
      hostname: urlParsingNode.hostname,
      port: urlParsingNode.port,
      pathname: urlParsingNode.pathname.charAt(0) === '/' ? urlParsingNode.pathname : '/' + urlParsingNode.pathname
    };
  }

  originURL = resolveURL(window.location.href);
  /**
  * Determine if a URL shares the same origin as the current location
  *
  * @param {String} requestURL The URL to test
  * @returns {boolean} True if URL shares the same origin, otherwise false
  */

  return function isURLSameOrigin(requestURL) {
    var parsed = utils.isString(requestURL) ? resolveURL(requestURL) : requestURL;
    return parsed.protocol === originURL.protocol && parsed.host === originURL.host;
  };
}() : // Non standard browser envs (web workers, react-native) lack needed support.
function nonStandardBrowserEnv() {
  return function isURLSameOrigin() {
    return true;
  };
}();

},{"./../utils":25}],22:[function(require,module,exports){
'use strict';

var utils = require('../utils');

module.exports = function normalizeHeaderName(headers, normalizedName) {
  utils.forEach(headers, function processHeader(value, name) {
    if (name !== normalizedName && name.toUpperCase() === normalizedName.toUpperCase()) {
      headers[normalizedName] = value;
      delete headers[name];
    }
  });
};

},{"../utils":25}],23:[function(require,module,exports){
'use strict';

var utils = require('./../utils'); // Headers whose duplicates are ignored by node
// c.f. https://nodejs.org/api/http.html#http_message_headers


var ignoreDuplicateOf = ['age', 'authorization', 'content-length', 'content-type', 'etag', 'expires', 'from', 'host', 'if-modified-since', 'if-unmodified-since', 'last-modified', 'location', 'max-forwards', 'proxy-authorization', 'referer', 'retry-after', 'user-agent'];
/**
 * Parse headers into an object
 *
 * ```
 * Date: Wed, 27 Aug 2014 08:58:49 GMT
 * Content-Type: application/json
 * Connection: keep-alive
 * Transfer-Encoding: chunked
 * ```
 *
 * @param {String} headers Headers needing to be parsed
 * @returns {Object} Headers parsed into an object
 */

module.exports = function parseHeaders(headers) {
  var parsed = {};
  var key;
  var val;
  var i;

  if (!headers) {
    return parsed;
  }

  utils.forEach(headers.split('\n'), function parser(line) {
    i = line.indexOf(':');
    key = utils.trim(line.substr(0, i)).toLowerCase();
    val = utils.trim(line.substr(i + 1));

    if (key) {
      if (parsed[key] && ignoreDuplicateOf.indexOf(key) >= 0) {
        return;
      }

      if (key === 'set-cookie') {
        parsed[key] = (parsed[key] ? parsed[key] : []).concat([val]);
      } else {
        parsed[key] = parsed[key] ? parsed[key] + ', ' + val : val;
      }
    }
  });
  return parsed;
};

},{"./../utils":25}],24:[function(require,module,exports){
'use strict';
/**
 * Syntactic sugar for invoking a function and expanding an array for arguments.
 *
 * Common use case would be to use `Function.prototype.apply`.
 *
 *  ```js
 *  function f(x, y, z) {}
 *  var args = [1, 2, 3];
 *  f.apply(null, args);
 *  ```
 *
 * With `spread` this example can be re-written.
 *
 *  ```js
 *  spread(function(x, y, z) {})([1, 2, 3]);
 *  ```
 *
 * @param {Function} callback
 * @returns {Function}
 */

module.exports = function spread(callback) {
  return function wrap(arr) {
    return callback.apply(null, arr);
  };
};

},{}],25:[function(require,module,exports){
'use strict';

function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }

var bind = require('./helpers/bind');

var isBuffer = require('is-buffer');
/*global toString:true*/
// utils is a library of generic helper functions non-specific to axios


var toString = Object.prototype.toString;
/**
 * Determine if a value is an Array
 *
 * @param {Object} val The value to test
 * @returns {boolean} True if value is an Array, otherwise false
 */

function isArray(val) {
  return toString.call(val) === '[object Array]';
}
/**
 * Determine if a value is an ArrayBuffer
 *
 * @param {Object} val The value to test
 * @returns {boolean} True if value is an ArrayBuffer, otherwise false
 */


function isArrayBuffer(val) {
  return toString.call(val) === '[object ArrayBuffer]';
}
/**
 * Determine if a value is a FormData
 *
 * @param {Object} val The value to test
 * @returns {boolean} True if value is an FormData, otherwise false
 */


function isFormData(val) {
  return typeof FormData !== 'undefined' && val instanceof FormData;
}
/**
 * Determine if a value is a view on an ArrayBuffer
 *
 * @param {Object} val The value to test
 * @returns {boolean} True if value is a view on an ArrayBuffer, otherwise false
 */


function isArrayBufferView(val) {
  var result;

  if (typeof ArrayBuffer !== 'undefined' && ArrayBuffer.isView) {
    result = ArrayBuffer.isView(val);
  } else {
    result = val && val.buffer && val.buffer instanceof ArrayBuffer;
  }

  return result;
}
/**
 * Determine if a value is a String
 *
 * @param {Object} val The value to test
 * @returns {boolean} True if value is a String, otherwise false
 */


function isString(val) {
  return typeof val === 'string';
}
/**
 * Determine if a value is a Number
 *
 * @param {Object} val The value to test
 * @returns {boolean} True if value is a Number, otherwise false
 */


function isNumber(val) {
  return typeof val === 'number';
}
/**
 * Determine if a value is undefined
 *
 * @param {Object} val The value to test
 * @returns {boolean} True if the value is undefined, otherwise false
 */


function isUndefined(val) {
  return typeof val === 'undefined';
}
/**
 * Determine if a value is an Object
 *
 * @param {Object} val The value to test
 * @returns {boolean} True if value is an Object, otherwise false
 */


function isObject(val) {
  return val !== null && _typeof(val) === 'object';
}
/**
 * Determine if a value is a Date
 *
 * @param {Object} val The value to test
 * @returns {boolean} True if value is a Date, otherwise false
 */


function isDate(val) {
  return toString.call(val) === '[object Date]';
}
/**
 * Determine if a value is a File
 *
 * @param {Object} val The value to test
 * @returns {boolean} True if value is a File, otherwise false
 */


function isFile(val) {
  return toString.call(val) === '[object File]';
}
/**
 * Determine if a value is a Blob
 *
 * @param {Object} val The value to test
 * @returns {boolean} True if value is a Blob, otherwise false
 */


function isBlob(val) {
  return toString.call(val) === '[object Blob]';
}
/**
 * Determine if a value is a Function
 *
 * @param {Object} val The value to test
 * @returns {boolean} True if value is a Function, otherwise false
 */


function isFunction(val) {
  return toString.call(val) === '[object Function]';
}
/**
 * Determine if a value is a Stream
 *
 * @param {Object} val The value to test
 * @returns {boolean} True if value is a Stream, otherwise false
 */


function isStream(val) {
  return isObject(val) && isFunction(val.pipe);
}
/**
 * Determine if a value is a URLSearchParams object
 *
 * @param {Object} val The value to test
 * @returns {boolean} True if value is a URLSearchParams object, otherwise false
 */


function isURLSearchParams(val) {
  return typeof URLSearchParams !== 'undefined' && val instanceof URLSearchParams;
}
/**
 * Trim excess whitespace off the beginning and end of a string
 *
 * @param {String} str The String to trim
 * @returns {String} The String freed of excess whitespace
 */


function trim(str) {
  return str.replace(/^\s*/, '').replace(/\s*$/, '');
}
/**
 * Determine if we're running in a standard browser environment
 *
 * This allows axios to run in a web worker, and react-native.
 * Both environments support XMLHttpRequest, but not fully standard globals.
 *
 * web workers:
 *  typeof window -> undefined
 *  typeof document -> undefined
 *
 * react-native:
 *  navigator.product -> 'ReactNative'
 */


function isStandardBrowserEnv() {
  if (typeof navigator !== 'undefined' && navigator.product === 'ReactNative') {
    return false;
  }

  return typeof window !== 'undefined' && typeof document !== 'undefined';
}
/**
 * Iterate over an Array or an Object invoking a function for each item.
 *
 * If `obj` is an Array callback will be called passing
 * the value, index, and complete array for each item.
 *
 * If 'obj' is an Object callback will be called passing
 * the value, key, and complete object for each property.
 *
 * @param {Object|Array} obj The object to iterate
 * @param {Function} fn The callback to invoke for each item
 */


function forEach(obj, fn) {
  // Don't bother if no value provided
  if (obj === null || typeof obj === 'undefined') {
    return;
  } // Force an array if not already something iterable


  if (_typeof(obj) !== 'object') {
    /*eslint no-param-reassign:0*/
    obj = [obj];
  }

  if (isArray(obj)) {
    // Iterate over array values
    for (var i = 0, l = obj.length; i < l; i++) {
      fn.call(null, obj[i], i, obj);
    }
  } else {
    // Iterate over object keys
    for (var key in obj) {
      if (Object.prototype.hasOwnProperty.call(obj, key)) {
        fn.call(null, obj[key], key, obj);
      }
    }
  }
}
/**
 * Accepts varargs expecting each argument to be an object, then
 * immutably merges the properties of each object and returns result.
 *
 * When multiple objects contain the same key the later object in
 * the arguments list will take precedence.
 *
 * Example:
 *
 * ```js
 * var result = merge({foo: 123}, {foo: 456});
 * console.log(result.foo); // outputs 456
 * ```
 *
 * @param {Object} obj1 Object to merge
 * @returns {Object} Result of all merge properties
 */


function merge()
/* obj1, obj2, obj3, ... */
{
  var result = {};

  function assignValue(val, key) {
    if (_typeof(result[key]) === 'object' && _typeof(val) === 'object') {
      result[key] = merge(result[key], val);
    } else {
      result[key] = val;
    }
  }

  for (var i = 0, l = arguments.length; i < l; i++) {
    forEach(arguments[i], assignValue);
  }

  return result;
}
/**
 * Extends object a by mutably adding to it the properties of object b.
 *
 * @param {Object} a The object to be extended
 * @param {Object} b The object to copy properties from
 * @param {Object} thisArg The object to bind function to
 * @return {Object} The resulting value of object a
 */


function extend(a, b, thisArg) {
  forEach(b, function assignValue(val, key) {
    if (thisArg && typeof val === 'function') {
      a[key] = bind(val, thisArg);
    } else {
      a[key] = val;
    }
  });
  return a;
}

module.exports = {
  isArray: isArray,
  isArrayBuffer: isArrayBuffer,
  isBuffer: isBuffer,
  isFormData: isFormData,
  isArrayBufferView: isArrayBufferView,
  isString: isString,
  isNumber: isNumber,
  isObject: isObject,
  isUndefined: isUndefined,
  isDate: isDate,
  isFile: isFile,
  isBlob: isBlob,
  isFunction: isFunction,
  isStream: isStream,
  isURLSearchParams: isURLSearchParams,
  isStandardBrowserEnv: isStandardBrowserEnv,
  forEach: forEach,
  merge: merge,
  extend: extend,
  trim: trim
};

},{"./helpers/bind":15,"is-buffer":357}],26:[function(require,module,exports){
(function (global){
"use strict";

require("core-js/shim");

require("regenerator-runtime/runtime");

require("core-js/fn/regexp/escape");

if (global._babelPolyfill) {
  throw new Error("only one instance of babel-polyfill is allowed");
}

global._babelPolyfill = true;
var DEFINE_PROPERTY = "defineProperty";

function define(O, key, value) {
  O[key] || Object[DEFINE_PROPERTY](O, key, {
    writable: true,
    configurable: true,
    value: value
  });
}

define(String.prototype, "padLeft", "".padStart);
define(String.prototype, "padRight", "".padEnd);
"pop,reverse,shift,keys,values,entries,indexOf,every,some,forEach,map,filter,find,findIndex,includes,join,slice,concat,push,splice,unshift,sort,lastIndexOf,reduce,reduceRight,copyWithin,fill".split(",").forEach(function (key) {
  [][key] && define(Array, key, Function.call.bind([][key]));
});

}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})

},{"core-js/fn/regexp/escape":28,"core-js/shim":351,"regenerator-runtime/runtime":362}],27:[function(require,module,exports){
"use strict";

!function (e, t) {
  if ("function" == typeof define && define.amd) define(["exports"], t);else if ("undefined" != typeof exports) t(exports);else {
    var o = {};
    t(o), e.bodyScrollLock = o;
  }
}(void 0, function (exports) {
  "use strict";

  function r(e) {
    if (Array.isArray(e)) {
      for (var t = 0, o = Array(e.length); t < e.length; t++) {
        o[t] = e[t];
      }

      return o;
    }

    return Array.from(e);
  }

  Object.defineProperty(exports, "__esModule", {
    value: !0
  });
  var l = !1;

  if ("undefined" != typeof window) {
    var e = {
      get passive() {
        l = !0;
      }

    };
    window.addEventListener("testPassive", null, e), window.removeEventListener("testPassive", null, e);
  }

  var d = "undefined" != typeof window && window.navigator && window.navigator.platform && /iP(ad|hone|od)/.test(window.navigator.platform),
      c = [],
      u = !1,
      a = -1,
      s = void 0,
      v = void 0,
      f = function f(t) {
    return c.some(function (e) {
      return !(!e.options.allowTouchMove || !e.options.allowTouchMove(t));
    });
  },
      m = function m(e) {
    var t = e || window.event;
    return !!f(t.target) || 1 < t.touches.length || (t.preventDefault && t.preventDefault(), !1);
  },
      o = function o() {
    setTimeout(function () {
      void 0 !== v && (document.body.style.paddingRight = v, v = void 0), void 0 !== s && (document.body.style.overflow = s, s = void 0);
    });
  };

  exports.disableBodyScroll = function (i, e) {
    if (d) {
      if (!i) return void console.error("disableBodyScroll unsuccessful - targetElement must be provided when calling disableBodyScroll on IOS devices.");

      if (i && !c.some(function (e) {
        return e.targetElement === i;
      })) {
        var t = {
          targetElement: i,
          options: e || {}
        };
        c = [].concat(r(c), [t]), i.ontouchstart = function (e) {
          1 === e.targetTouches.length && (a = e.targetTouches[0].clientY);
        }, i.ontouchmove = function (e) {
          var t, o, n, r;
          1 === e.targetTouches.length && (o = i, r = (t = e).targetTouches[0].clientY - a, !f(t.target) && (o && 0 === o.scrollTop && 0 < r ? m(t) : (n = o) && n.scrollHeight - n.scrollTop <= n.clientHeight && r < 0 ? m(t) : t.stopPropagation()));
        }, u || (document.addEventListener("touchmove", m, l ? {
          passive: !1
        } : void 0), u = !0);
      }
    } else {
      n = e, setTimeout(function () {
        if (void 0 === v) {
          var e = !!n && !0 === n.reserveScrollBarGap,
              t = window.innerWidth - document.documentElement.clientWidth;
          e && 0 < t && (v = document.body.style.paddingRight, document.body.style.paddingRight = t + "px");
        }

        void 0 === s && (s = document.body.style.overflow, document.body.style.overflow = "hidden");
      });
      var o = {
        targetElement: i,
        options: e || {}
      };
      c = [].concat(r(c), [o]);
    }

    var n;
  }, exports.clearAllBodyScrollLocks = function () {
    d ? (c.forEach(function (e) {
      e.targetElement.ontouchstart = null, e.targetElement.ontouchmove = null;
    }), u && (document.removeEventListener("touchmove", m, l ? {
      passive: !1
    } : void 0), u = !1), c = [], a = -1) : (o(), c = []);
  }, exports.enableBodyScroll = function (t) {
    if (d) {
      if (!t) return void console.error("enableBodyScroll unsuccessful - targetElement must be provided when calling enableBodyScroll on IOS devices.");
      t.ontouchstart = null, t.ontouchmove = null, c = c.filter(function (e) {
        return e.targetElement !== t;
      }), u && 0 === c.length && (document.removeEventListener("touchmove", m, l ? {
        passive: !1
      } : void 0), u = !1);
    } else 1 === c.length && c[0].targetElement === t ? (o(), c = []) : c = c.filter(function (e) {
      return e.targetElement !== t;
    });
  };
});

},{}],28:[function(require,module,exports){
"use strict";

require('../../modules/core.regexp.escape');

module.exports = require('../../modules/_core').RegExp.escape;

},{"../../modules/_core":49,"../../modules/core.regexp.escape":154}],29:[function(require,module,exports){
"use strict";

module.exports = function (it) {
  if (typeof it != 'function') throw TypeError(it + ' is not a function!');
  return it;
};

},{}],30:[function(require,module,exports){
"use strict";

var cof = require('./_cof');

module.exports = function (it, msg) {
  if (typeof it != 'number' && cof(it) != 'Number') throw TypeError(msg);
  return +it;
};

},{"./_cof":44}],31:[function(require,module,exports){
"use strict";

// 22.1.3.31 Array.prototype[@@unscopables]
var UNSCOPABLES = require('./_wks')('unscopables');

var ArrayProto = Array.prototype;
if (ArrayProto[UNSCOPABLES] == undefined) require('./_hide')(ArrayProto, UNSCOPABLES, {});

module.exports = function (key) {
  ArrayProto[UNSCOPABLES][key] = true;
};

},{"./_hide":68,"./_wks":152}],32:[function(require,module,exports){
"use strict";

module.exports = function (it, Constructor, name, forbiddenField) {
  if (!(it instanceof Constructor) || forbiddenField !== undefined && forbiddenField in it) {
    throw TypeError(name + ': incorrect invocation!');
  }

  return it;
};

},{}],33:[function(require,module,exports){
"use strict";

var isObject = require('./_is-object');

module.exports = function (it) {
  if (!isObject(it)) throw TypeError(it + ' is not an object!');
  return it;
};

},{"./_is-object":77}],34:[function(require,module,exports){
// 22.1.3.3 Array.prototype.copyWithin(target, start, end = this.length)
'use strict';

var toObject = require('./_to-object');

var toAbsoluteIndex = require('./_to-absolute-index');

var toLength = require('./_to-length');

module.exports = [].copyWithin || function copyWithin(target
/* = 0 */
, start
/* = 0, end = @length */
) {
  var O = toObject(this);
  var len = toLength(O.length);
  var to = toAbsoluteIndex(target, len);
  var from = toAbsoluteIndex(start, len);
  var end = arguments.length > 2 ? arguments[2] : undefined;
  var count = Math.min((end === undefined ? len : toAbsoluteIndex(end, len)) - from, len - to);
  var inc = 1;

  if (from < to && to < from + count) {
    inc = -1;
    from += count - 1;
    to += count - 1;
  }

  while (count-- > 0) {
    if (from in O) O[to] = O[from];else delete O[to];
    to += inc;
    from += inc;
  }

  return O;
};

},{"./_to-absolute-index":137,"./_to-length":141,"./_to-object":142}],35:[function(require,module,exports){
// 22.1.3.6 Array.prototype.fill(value, start = 0, end = this.length)
'use strict';

var toObject = require('./_to-object');

var toAbsoluteIndex = require('./_to-absolute-index');

var toLength = require('./_to-length');

module.exports = function fill(value
/* , start = 0, end = @length */
) {
  var O = toObject(this);
  var length = toLength(O.length);
  var aLen = arguments.length;
  var index = toAbsoluteIndex(aLen > 1 ? arguments[1] : undefined, length);
  var end = aLen > 2 ? arguments[2] : undefined;
  var endPos = end === undefined ? length : toAbsoluteIndex(end, length);

  while (endPos > index) {
    O[index++] = value;
  }

  return O;
};

},{"./_to-absolute-index":137,"./_to-length":141,"./_to-object":142}],36:[function(require,module,exports){
"use strict";

var forOf = require('./_for-of');

module.exports = function (iter, ITERATOR) {
  var result = [];
  forOf(iter, false, result.push, result, ITERATOR);
  return result;
};

},{"./_for-of":65}],37:[function(require,module,exports){
"use strict";

// false -> Array#indexOf
// true  -> Array#includes
var toIObject = require('./_to-iobject');

var toLength = require('./_to-length');

var toAbsoluteIndex = require('./_to-absolute-index');

module.exports = function (IS_INCLUDES) {
  return function ($this, el, fromIndex) {
    var O = toIObject($this);
    var length = toLength(O.length);
    var index = toAbsoluteIndex(fromIndex, length);
    var value; // Array#includes uses SameValueZero equality algorithm
    // eslint-disable-next-line no-self-compare

    if (IS_INCLUDES && el != el) while (length > index) {
      value = O[index++]; // eslint-disable-next-line no-self-compare

      if (value != value) return true; // Array#indexOf ignores holes, Array#includes - not
    } else for (; length > index; index++) {
      if (IS_INCLUDES || index in O) {
        if (O[index] === el) return IS_INCLUDES || index || 0;
      }
    }
    return !IS_INCLUDES && -1;
  };
};

},{"./_to-absolute-index":137,"./_to-iobject":140,"./_to-length":141}],38:[function(require,module,exports){
"use strict";

// 0 -> Array#forEach
// 1 -> Array#map
// 2 -> Array#filter
// 3 -> Array#some
// 4 -> Array#every
// 5 -> Array#find
// 6 -> Array#findIndex
var ctx = require('./_ctx');

var IObject = require('./_iobject');

var toObject = require('./_to-object');

var toLength = require('./_to-length');

var asc = require('./_array-species-create');

module.exports = function (TYPE, $create) {
  var IS_MAP = TYPE == 1;
  var IS_FILTER = TYPE == 2;
  var IS_SOME = TYPE == 3;
  var IS_EVERY = TYPE == 4;
  var IS_FIND_INDEX = TYPE == 6;
  var NO_HOLES = TYPE == 5 || IS_FIND_INDEX;
  var create = $create || asc;
  return function ($this, callbackfn, that) {
    var O = toObject($this);
    var self = IObject(O);
    var f = ctx(callbackfn, that, 3);
    var length = toLength(self.length);
    var index = 0;
    var result = IS_MAP ? create($this, length) : IS_FILTER ? create($this, 0) : undefined;
    var val, res;

    for (; length > index; index++) {
      if (NO_HOLES || index in self) {
        val = self[index];
        res = f(val, index, O);

        if (TYPE) {
          if (IS_MAP) result[index] = res; // map
          else if (res) switch (TYPE) {
              case 3:
                return true;
              // some

              case 5:
                return val;
              // find

              case 6:
                return index;
              // findIndex

              case 2:
                result.push(val);
              // filter
            } else if (IS_EVERY) return false; // every
        }
      }
    }

    return IS_FIND_INDEX ? -1 : IS_SOME || IS_EVERY ? IS_EVERY : result;
  };
};

},{"./_array-species-create":41,"./_ctx":51,"./_iobject":73,"./_to-length":141,"./_to-object":142}],39:[function(require,module,exports){
"use strict";

var aFunction = require('./_a-function');

var toObject = require('./_to-object');

var IObject = require('./_iobject');

var toLength = require('./_to-length');

module.exports = function (that, callbackfn, aLen, memo, isRight) {
  aFunction(callbackfn);
  var O = toObject(that);
  var self = IObject(O);
  var length = toLength(O.length);
  var index = isRight ? length - 1 : 0;
  var i = isRight ? -1 : 1;
  if (aLen < 2) for (;;) {
    if (index in self) {
      memo = self[index];
      index += i;
      break;
    }

    index += i;

    if (isRight ? index < 0 : length <= index) {
      throw TypeError('Reduce of empty array with no initial value');
    }
  }

  for (; isRight ? index >= 0 : length > index; index += i) {
    if (index in self) {
      memo = callbackfn(memo, self[index], index, O);
    }
  }

  return memo;
};

},{"./_a-function":29,"./_iobject":73,"./_to-length":141,"./_to-object":142}],40:[function(require,module,exports){
"use strict";

var isObject = require('./_is-object');

var isArray = require('./_is-array');

var SPECIES = require('./_wks')('species');

module.exports = function (original) {
  var C;

  if (isArray(original)) {
    C = original.constructor; // cross-realm fallback

    if (typeof C == 'function' && (C === Array || isArray(C.prototype))) C = undefined;

    if (isObject(C)) {
      C = C[SPECIES];
      if (C === null) C = undefined;
    }
  }

  return C === undefined ? Array : C;
};

},{"./_is-array":75,"./_is-object":77,"./_wks":152}],41:[function(require,module,exports){
"use strict";

// 9.4.2.3 ArraySpeciesCreate(originalArray, length)
var speciesConstructor = require('./_array-species-constructor');

module.exports = function (original, length) {
  return new (speciesConstructor(original))(length);
};

},{"./_array-species-constructor":40}],42:[function(require,module,exports){
'use strict';

var aFunction = require('./_a-function');

var isObject = require('./_is-object');

var invoke = require('./_invoke');

var arraySlice = [].slice;
var factories = {};

var construct = function construct(F, len, args) {
  if (!(len in factories)) {
    for (var n = [], i = 0; i < len; i++) {
      n[i] = 'a[' + i + ']';
    } // eslint-disable-next-line no-new-func


    factories[len] = Function('F,a', 'return new F(' + n.join(',') + ')');
  }

  return factories[len](F, args);
};

module.exports = Function.bind || function bind(that
/* , ...args */
) {
  var fn = aFunction(this);
  var partArgs = arraySlice.call(arguments, 1);

  var bound = function bound()
  /* args... */
  {
    var args = partArgs.concat(arraySlice.call(arguments));
    return this instanceof bound ? construct(fn, args.length, args) : invoke(fn, args, that);
  };

  if (isObject(fn.prototype)) bound.prototype = fn.prototype;
  return bound;
};

},{"./_a-function":29,"./_invoke":72,"./_is-object":77}],43:[function(require,module,exports){
"use strict";

// getting tag from 19.1.3.6 Object.prototype.toString()
var cof = require('./_cof');

var TAG = require('./_wks')('toStringTag'); // ES3 wrong here


var ARG = cof(function () {
  return arguments;
}()) == 'Arguments'; // fallback for IE11 Script Access Denied error

var tryGet = function tryGet(it, key) {
  try {
    return it[key];
  } catch (e) {
    /* empty */
  }
};

module.exports = function (it) {
  var O, T, B;
  return it === undefined ? 'Undefined' : it === null ? 'Null' // @@toStringTag case
  : typeof (T = tryGet(O = Object(it), TAG)) == 'string' ? T // builtinTag case
  : ARG ? cof(O) // ES3 arguments fallback
  : (B = cof(O)) == 'Object' && typeof O.callee == 'function' ? 'Arguments' : B;
};

},{"./_cof":44,"./_wks":152}],44:[function(require,module,exports){
"use strict";

var toString = {}.toString;

module.exports = function (it) {
  return toString.call(it).slice(8, -1);
};

},{}],45:[function(require,module,exports){
'use strict';

var dP = require('./_object-dp').f;

var create = require('./_object-create');

var redefineAll = require('./_redefine-all');

var ctx = require('./_ctx');

var anInstance = require('./_an-instance');

var forOf = require('./_for-of');

var $iterDefine = require('./_iter-define');

var step = require('./_iter-step');

var setSpecies = require('./_set-species');

var DESCRIPTORS = require('./_descriptors');

var fastKey = require('./_meta').fastKey;

var validate = require('./_validate-collection');

var SIZE = DESCRIPTORS ? '_s' : 'size';

var getEntry = function getEntry(that, key) {
  // fast case
  var index = fastKey(key);
  var entry;
  if (index !== 'F') return that._i[index]; // frozen object case

  for (entry = that._f; entry; entry = entry.n) {
    if (entry.k == key) return entry;
  }
};

module.exports = {
  getConstructor: function getConstructor(wrapper, NAME, IS_MAP, ADDER) {
    var C = wrapper(function (that, iterable) {
      anInstance(that, C, NAME, '_i');
      that._t = NAME; // collection type

      that._i = create(null); // index

      that._f = undefined; // first entry

      that._l = undefined; // last entry

      that[SIZE] = 0; // size

      if (iterable != undefined) forOf(iterable, IS_MAP, that[ADDER], that);
    });
    redefineAll(C.prototype, {
      // 23.1.3.1 Map.prototype.clear()
      // 23.2.3.2 Set.prototype.clear()
      clear: function clear() {
        for (var that = validate(this, NAME), data = that._i, entry = that._f; entry; entry = entry.n) {
          entry.r = true;
          if (entry.p) entry.p = entry.p.n = undefined;
          delete data[entry.i];
        }

        that._f = that._l = undefined;
        that[SIZE] = 0;
      },
      // 23.1.3.3 Map.prototype.delete(key)
      // 23.2.3.4 Set.prototype.delete(value)
      'delete': function _delete(key) {
        var that = validate(this, NAME);
        var entry = getEntry(that, key);

        if (entry) {
          var next = entry.n;
          var prev = entry.p;
          delete that._i[entry.i];
          entry.r = true;
          if (prev) prev.n = next;
          if (next) next.p = prev;
          if (that._f == entry) that._f = next;
          if (that._l == entry) that._l = prev;
          that[SIZE]--;
        }

        return !!entry;
      },
      // 23.2.3.6 Set.prototype.forEach(callbackfn, thisArg = undefined)
      // 23.1.3.5 Map.prototype.forEach(callbackfn, thisArg = undefined)
      forEach: function forEach(callbackfn
      /* , that = undefined */
      ) {
        validate(this, NAME);
        var f = ctx(callbackfn, arguments.length > 1 ? arguments[1] : undefined, 3);
        var entry;

        while (entry = entry ? entry.n : this._f) {
          f(entry.v, entry.k, this); // revert to the last existing entry

          while (entry && entry.r) {
            entry = entry.p;
          }
        }
      },
      // 23.1.3.7 Map.prototype.has(key)
      // 23.2.3.7 Set.prototype.has(value)
      has: function has(key) {
        return !!getEntry(validate(this, NAME), key);
      }
    });
    if (DESCRIPTORS) dP(C.prototype, 'size', {
      get: function get() {
        return validate(this, NAME)[SIZE];
      }
    });
    return C;
  },
  def: function def(that, key, value) {
    var entry = getEntry(that, key);
    var prev, index; // change existing entry

    if (entry) {
      entry.v = value; // create new entry
    } else {
      that._l = entry = {
        i: index = fastKey(key, true),
        // <- index
        k: key,
        // <- key
        v: value,
        // <- value
        p: prev = that._l,
        // <- previous entry
        n: undefined,
        // <- next entry
        r: false // <- removed

      };
      if (!that._f) that._f = entry;
      if (prev) prev.n = entry;
      that[SIZE]++; // add to index

      if (index !== 'F') that._i[index] = entry;
    }

    return that;
  },
  getEntry: getEntry,
  setStrong: function setStrong(C, NAME, IS_MAP) {
    // add .keys, .values, .entries, [@@iterator]
    // 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
    $iterDefine(C, NAME, function (iterated, kind) {
      this._t = validate(iterated, NAME); // target

      this._k = kind; // kind

      this._l = undefined; // previous
    }, function () {
      var that = this;
      var kind = that._k;
      var entry = that._l; // revert to the last existing entry

      while (entry && entry.r) {
        entry = entry.p;
      } // get next entry


      if (!that._t || !(that._l = entry = entry ? entry.n : that._t._f)) {
        // or finish the iteration
        that._t = undefined;
        return step(1);
      } // return step by kind


      if (kind == 'keys') return step(0, entry.k);
      if (kind == 'values') return step(0, entry.v);
      return step(0, [entry.k, entry.v]);
    }, IS_MAP ? 'entries' : 'values', !IS_MAP, true); // add [@@species], 23.1.2.2, 23.2.2.2

    setSpecies(NAME);
  }
};

},{"./_an-instance":32,"./_ctx":51,"./_descriptors":55,"./_for-of":65,"./_iter-define":81,"./_iter-step":83,"./_meta":91,"./_object-create":96,"./_object-dp":97,"./_redefine-all":116,"./_set-species":123,"./_validate-collection":149}],46:[function(require,module,exports){
"use strict";

// https://github.com/DavidBruant/Map-Set.prototype.toJSON
var classof = require('./_classof');

var from = require('./_array-from-iterable');

module.exports = function (NAME) {
  return function toJSON() {
    if (classof(this) != NAME) throw TypeError(NAME + "#toJSON isn't generic");
    return from(this);
  };
};

},{"./_array-from-iterable":36,"./_classof":43}],47:[function(require,module,exports){
'use strict';

var redefineAll = require('./_redefine-all');

var getWeak = require('./_meta').getWeak;

var anObject = require('./_an-object');

var isObject = require('./_is-object');

var anInstance = require('./_an-instance');

var forOf = require('./_for-of');

var createArrayMethod = require('./_array-methods');

var $has = require('./_has');

var validate = require('./_validate-collection');

var arrayFind = createArrayMethod(5);
var arrayFindIndex = createArrayMethod(6);
var id = 0; // fallback for uncaught frozen keys

var uncaughtFrozenStore = function uncaughtFrozenStore(that) {
  return that._l || (that._l = new UncaughtFrozenStore());
};

var UncaughtFrozenStore = function UncaughtFrozenStore() {
  this.a = [];
};

var findUncaughtFrozen = function findUncaughtFrozen(store, key) {
  return arrayFind(store.a, function (it) {
    return it[0] === key;
  });
};

UncaughtFrozenStore.prototype = {
  get: function get(key) {
    var entry = findUncaughtFrozen(this, key);
    if (entry) return entry[1];
  },
  has: function has(key) {
    return !!findUncaughtFrozen(this, key);
  },
  set: function set(key, value) {
    var entry = findUncaughtFrozen(this, key);
    if (entry) entry[1] = value;else this.a.push([key, value]);
  },
  'delete': function _delete(key) {
    var index = arrayFindIndex(this.a, function (it) {
      return it[0] === key;
    });
    if (~index) this.a.splice(index, 1);
    return !!~index;
  }
};
module.exports = {
  getConstructor: function getConstructor(wrapper, NAME, IS_MAP, ADDER) {
    var C = wrapper(function (that, iterable) {
      anInstance(that, C, NAME, '_i');
      that._t = NAME; // collection type

      that._i = id++; // collection id

      that._l = undefined; // leak store for uncaught frozen objects

      if (iterable != undefined) forOf(iterable, IS_MAP, that[ADDER], that);
    });
    redefineAll(C.prototype, {
      // 23.3.3.2 WeakMap.prototype.delete(key)
      // 23.4.3.3 WeakSet.prototype.delete(value)
      'delete': function _delete(key) {
        if (!isObject(key)) return false;
        var data = getWeak(key);
        if (data === true) return uncaughtFrozenStore(validate(this, NAME))['delete'](key);
        return data && $has(data, this._i) && delete data[this._i];
      },
      // 23.3.3.4 WeakMap.prototype.has(key)
      // 23.4.3.4 WeakSet.prototype.has(value)
      has: function has(key) {
        if (!isObject(key)) return false;
        var data = getWeak(key);
        if (data === true) return uncaughtFrozenStore(validate(this, NAME)).has(key);
        return data && $has(data, this._i);
      }
    });
    return C;
  },
  def: function def(that, key, value) {
    var data = getWeak(anObject(key), true);
    if (data === true) uncaughtFrozenStore(that).set(key, value);else data[that._i] = value;
    return that;
  },
  ufstore: uncaughtFrozenStore
};

},{"./_an-instance":32,"./_an-object":33,"./_array-methods":38,"./_for-of":65,"./_has":67,"./_is-object":77,"./_meta":91,"./_redefine-all":116,"./_validate-collection":149}],48:[function(require,module,exports){
'use strict';

var global = require('./_global');

var $export = require('./_export');

var redefine = require('./_redefine');

var redefineAll = require('./_redefine-all');

var meta = require('./_meta');

var forOf = require('./_for-of');

var anInstance = require('./_an-instance');

var isObject = require('./_is-object');

var fails = require('./_fails');

var $iterDetect = require('./_iter-detect');

var setToStringTag = require('./_set-to-string-tag');

var inheritIfRequired = require('./_inherit-if-required');

module.exports = function (NAME, wrapper, methods, common, IS_MAP, IS_WEAK) {
  var Base = global[NAME];
  var C = Base;
  var ADDER = IS_MAP ? 'set' : 'add';
  var proto = C && C.prototype;
  var O = {};

  var fixMethod = function fixMethod(KEY) {
    var fn = proto[KEY];
    redefine(proto, KEY, KEY == 'delete' ? function (a) {
      return IS_WEAK && !isObject(a) ? false : fn.call(this, a === 0 ? 0 : a);
    } : KEY == 'has' ? function has(a) {
      return IS_WEAK && !isObject(a) ? false : fn.call(this, a === 0 ? 0 : a);
    } : KEY == 'get' ? function get(a) {
      return IS_WEAK && !isObject(a) ? undefined : fn.call(this, a === 0 ? 0 : a);
    } : KEY == 'add' ? function add(a) {
      fn.call(this, a === 0 ? 0 : a);
      return this;
    } : function set(a, b) {
      fn.call(this, a === 0 ? 0 : a, b);
      return this;
    });
  };

  if (typeof C != 'function' || !(IS_WEAK || proto.forEach && !fails(function () {
    new C().entries().next();
  }))) {
    // create collection constructor
    C = common.getConstructor(wrapper, NAME, IS_MAP, ADDER);
    redefineAll(C.prototype, methods);
    meta.NEED = true;
  } else {
    var instance = new C(); // early implementations not supports chaining

    var HASNT_CHAINING = instance[ADDER](IS_WEAK ? {} : -0, 1) != instance; // V8 ~  Chromium 40- weak-collections throws on primitives, but should return false

    var THROWS_ON_PRIMITIVES = fails(function () {
      instance.has(1);
    }); // most early implementations doesn't supports iterables, most modern - not close it correctly

    var ACCEPT_ITERABLES = $iterDetect(function (iter) {
      new C(iter);
    }); // eslint-disable-line no-new
    // for early implementations -0 and +0 not the same

    var BUGGY_ZERO = !IS_WEAK && fails(function () {
      // V8 ~ Chromium 42- fails only with 5+ elements
      var $instance = new C();
      var index = 5;

      while (index--) {
        $instance[ADDER](index, index);
      }

      return !$instance.has(-0);
    });

    if (!ACCEPT_ITERABLES) {
      C = wrapper(function (target, iterable) {
        anInstance(target, C, NAME);
        var that = inheritIfRequired(new Base(), target, C);
        if (iterable != undefined) forOf(iterable, IS_MAP, that[ADDER], that);
        return that;
      });
      C.prototype = proto;
      proto.constructor = C;
    }

    if (THROWS_ON_PRIMITIVES || BUGGY_ZERO) {
      fixMethod('delete');
      fixMethod('has');
      IS_MAP && fixMethod('get');
    }

    if (BUGGY_ZERO || HASNT_CHAINING) fixMethod(ADDER); // weak collections should not contains .clear method

    if (IS_WEAK && proto.clear) delete proto.clear;
  }

  setToStringTag(C, NAME);
  O[NAME] = C;
  $export($export.G + $export.W + $export.F * (C != Base), O);
  if (!IS_WEAK) common.setStrong(C, NAME, IS_MAP);
  return C;
};

},{"./_an-instance":32,"./_export":59,"./_fails":61,"./_for-of":65,"./_global":66,"./_inherit-if-required":71,"./_is-object":77,"./_iter-detect":82,"./_meta":91,"./_redefine":117,"./_redefine-all":116,"./_set-to-string-tag":124}],49:[function(require,module,exports){
"use strict";

var core = module.exports = {
  version: '2.5.3'
};
if (typeof __e == 'number') __e = core; // eslint-disable-line no-undef

},{}],50:[function(require,module,exports){
'use strict';

var $defineProperty = require('./_object-dp');

var createDesc = require('./_property-desc');

module.exports = function (object, index, value) {
  if (index in object) $defineProperty.f(object, index, createDesc(0, value));else object[index] = value;
};

},{"./_object-dp":97,"./_property-desc":115}],51:[function(require,module,exports){
"use strict";

// optional / simple context binding
var aFunction = require('./_a-function');

module.exports = function (fn, that, length) {
  aFunction(fn);
  if (that === undefined) return fn;

  switch (length) {
    case 1:
      return function (a) {
        return fn.call(that, a);
      };

    case 2:
      return function (a, b) {
        return fn.call(that, a, b);
      };

    case 3:
      return function (a, b, c) {
        return fn.call(that, a, b, c);
      };
  }

  return function ()
  /* ...args */
  {
    return fn.apply(that, arguments);
  };
};

},{"./_a-function":29}],52:[function(require,module,exports){
'use strict'; // 20.3.4.36 / 15.9.5.43 Date.prototype.toISOString()

var fails = require('./_fails');

var getTime = Date.prototype.getTime;
var $toISOString = Date.prototype.toISOString;

var lz = function lz(num) {
  return num > 9 ? num : '0' + num;
}; // PhantomJS / old WebKit has a broken implementations


module.exports = fails(function () {
  return $toISOString.call(new Date(-5e13 - 1)) != '0385-07-25T07:06:39.999Z';
}) || !fails(function () {
  $toISOString.call(new Date(NaN));
}) ? function toISOString() {
  if (!isFinite(getTime.call(this))) throw RangeError('Invalid time value');
  var d = this;
  var y = d.getUTCFullYear();
  var m = d.getUTCMilliseconds();
  var s = y < 0 ? '-' : y > 9999 ? '+' : '';
  return s + ('00000' + Math.abs(y)).slice(s ? -6 : -4) + '-' + lz(d.getUTCMonth() + 1) + '-' + lz(d.getUTCDate()) + 'T' + lz(d.getUTCHours()) + ':' + lz(d.getUTCMinutes()) + ':' + lz(d.getUTCSeconds()) + '.' + (m > 99 ? m : '0' + lz(m)) + 'Z';
} : $toISOString;

},{"./_fails":61}],53:[function(require,module,exports){
'use strict';

var anObject = require('./_an-object');

var toPrimitive = require('./_to-primitive');

var NUMBER = 'number';

module.exports = function (hint) {
  if (hint !== 'string' && hint !== NUMBER && hint !== 'default') throw TypeError('Incorrect hint');
  return toPrimitive(anObject(this), hint != NUMBER);
};

},{"./_an-object":33,"./_to-primitive":143}],54:[function(require,module,exports){
"use strict";

// 7.2.1 RequireObjectCoercible(argument)
module.exports = function (it) {
  if (it == undefined) throw TypeError("Can't call method on  " + it);
  return it;
};

},{}],55:[function(require,module,exports){
"use strict";

// Thank's IE8 for his funny defineProperty
module.exports = !require('./_fails')(function () {
  return Object.defineProperty({}, 'a', {
    get: function get() {
      return 7;
    }
  }).a != 7;
});

},{"./_fails":61}],56:[function(require,module,exports){
"use strict";

var isObject = require('./_is-object');

var document = require('./_global').document; // typeof document.createElement is 'object' in old IE


var is = isObject(document) && isObject(document.createElement);

module.exports = function (it) {
  return is ? document.createElement(it) : {};
};

},{"./_global":66,"./_is-object":77}],57:[function(require,module,exports){
"use strict";

// IE 8- don't enum bug keys
module.exports = 'constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf'.split(',');

},{}],58:[function(require,module,exports){
"use strict";

// all enumerable object keys, includes symbols
var getKeys = require('./_object-keys');

var gOPS = require('./_object-gops');

var pIE = require('./_object-pie');

module.exports = function (it) {
  var result = getKeys(it);
  var getSymbols = gOPS.f;

  if (getSymbols) {
    var symbols = getSymbols(it);
    var isEnum = pIE.f;
    var i = 0;
    var key;

    while (symbols.length > i) {
      if (isEnum.call(it, key = symbols[i++])) result.push(key);
    }
  }

  return result;
};

},{"./_object-gops":103,"./_object-keys":106,"./_object-pie":107}],59:[function(require,module,exports){
"use strict";

var global = require('./_global');

var core = require('./_core');

var hide = require('./_hide');

var redefine = require('./_redefine');

var ctx = require('./_ctx');

var PROTOTYPE = 'prototype';

var $export = function $export(type, name, source) {
  var IS_FORCED = type & $export.F;
  var IS_GLOBAL = type & $export.G;
  var IS_STATIC = type & $export.S;
  var IS_PROTO = type & $export.P;
  var IS_BIND = type & $export.B;
  var target = IS_GLOBAL ? global : IS_STATIC ? global[name] || (global[name] = {}) : (global[name] || {})[PROTOTYPE];
  var exports = IS_GLOBAL ? core : core[name] || (core[name] = {});
  var expProto = exports[PROTOTYPE] || (exports[PROTOTYPE] = {});
  var key, own, out, exp;
  if (IS_GLOBAL) source = name;

  for (key in source) {
    // contains in native
    own = !IS_FORCED && target && target[key] !== undefined; // export native or passed

    out = (own ? target : source)[key]; // bind timers to global for call from export context

    exp = IS_BIND && own ? ctx(out, global) : IS_PROTO && typeof out == 'function' ? ctx(Function.call, out) : out; // extend global

    if (target) redefine(target, key, out, type & $export.U); // export

    if (exports[key] != out) hide(exports, key, exp);
    if (IS_PROTO && expProto[key] != out) expProto[key] = out;
  }
};

global.core = core; // type bitmap

$export.F = 1; // forced

$export.G = 2; // global

$export.S = 4; // static

$export.P = 8; // proto

$export.B = 16; // bind

$export.W = 32; // wrap

$export.U = 64; // safe

$export.R = 128; // real proto method for `library`

module.exports = $export;

},{"./_core":49,"./_ctx":51,"./_global":66,"./_hide":68,"./_redefine":117}],60:[function(require,module,exports){
"use strict";

var MATCH = require('./_wks')('match');

module.exports = function (KEY) {
  var re = /./;

  try {
    '/./'[KEY](re);
  } catch (e) {
    try {
      re[MATCH] = false;
      return !'/./'[KEY](re);
    } catch (f) {
      /* empty */
    }
  }

  return true;
};

},{"./_wks":152}],61:[function(require,module,exports){
"use strict";

module.exports = function (exec) {
  try {
    return !!exec();
  } catch (e) {
    return true;
  }
};

},{}],62:[function(require,module,exports){
'use strict';

var hide = require('./_hide');

var redefine = require('./_redefine');

var fails = require('./_fails');

var defined = require('./_defined');

var wks = require('./_wks');

module.exports = function (KEY, length, exec) {
  var SYMBOL = wks(KEY);
  var fns = exec(defined, SYMBOL, ''[KEY]);
  var strfn = fns[0];
  var rxfn = fns[1];

  if (fails(function () {
    var O = {};

    O[SYMBOL] = function () {
      return 7;
    };

    return ''[KEY](O) != 7;
  })) {
    redefine(String.prototype, KEY, strfn);
    hide(RegExp.prototype, SYMBOL, length == 2 // 21.2.5.8 RegExp.prototype[@@replace](string, replaceValue)
    // 21.2.5.11 RegExp.prototype[@@split](string, limit)
    ? function (string, arg) {
      return rxfn.call(string, this, arg);
    } // 21.2.5.6 RegExp.prototype[@@match](string)
    // 21.2.5.9 RegExp.prototype[@@search](string)
    : function (string) {
      return rxfn.call(string, this);
    });
  }
};

},{"./_defined":54,"./_fails":61,"./_hide":68,"./_redefine":117,"./_wks":152}],63:[function(require,module,exports){
'use strict'; // 21.2.5.3 get RegExp.prototype.flags

var anObject = require('./_an-object');

module.exports = function () {
  var that = anObject(this);
  var result = '';
  if (that.global) result += 'g';
  if (that.ignoreCase) result += 'i';
  if (that.multiline) result += 'm';
  if (that.unicode) result += 'u';
  if (that.sticky) result += 'y';
  return result;
};

},{"./_an-object":33}],64:[function(require,module,exports){
'use strict'; // https://tc39.github.io/proposal-flatMap/#sec-FlattenIntoArray

var isArray = require('./_is-array');

var isObject = require('./_is-object');

var toLength = require('./_to-length');

var ctx = require('./_ctx');

var IS_CONCAT_SPREADABLE = require('./_wks')('isConcatSpreadable');

function flattenIntoArray(target, original, source, sourceLen, start, depth, mapper, thisArg) {
  var targetIndex = start;
  var sourceIndex = 0;
  var mapFn = mapper ? ctx(mapper, thisArg, 3) : false;
  var element, spreadable;

  while (sourceIndex < sourceLen) {
    if (sourceIndex in source) {
      element = mapFn ? mapFn(source[sourceIndex], sourceIndex, original) : source[sourceIndex];
      spreadable = false;

      if (isObject(element)) {
        spreadable = element[IS_CONCAT_SPREADABLE];
        spreadable = spreadable !== undefined ? !!spreadable : isArray(element);
      }

      if (spreadable && depth > 0) {
        targetIndex = flattenIntoArray(target, original, element, toLength(element.length), targetIndex, depth - 1) - 1;
      } else {
        if (targetIndex >= 0x1fffffffffffff) throw TypeError();
        target[targetIndex] = element;
      }

      targetIndex++;
    }

    sourceIndex++;
  }

  return targetIndex;
}

module.exports = flattenIntoArray;

},{"./_ctx":51,"./_is-array":75,"./_is-object":77,"./_to-length":141,"./_wks":152}],65:[function(require,module,exports){
"use strict";

var ctx = require('./_ctx');

var call = require('./_iter-call');

var isArrayIter = require('./_is-array-iter');

var anObject = require('./_an-object');

var toLength = require('./_to-length');

var getIterFn = require('./core.get-iterator-method');

var BREAK = {};
var RETURN = {};

var _exports = module.exports = function (iterable, entries, fn, that, ITERATOR) {
  var iterFn = ITERATOR ? function () {
    return iterable;
  } : getIterFn(iterable);
  var f = ctx(fn, that, entries ? 2 : 1);
  var index = 0;
  var length, step, iterator, result;
  if (typeof iterFn != 'function') throw TypeError(iterable + ' is not iterable!'); // fast case for arrays with default iterator

  if (isArrayIter(iterFn)) for (length = toLength(iterable.length); length > index; index++) {
    result = entries ? f(anObject(step = iterable[index])[0], step[1]) : f(iterable[index]);
    if (result === BREAK || result === RETURN) return result;
  } else for (iterator = iterFn.call(iterable); !(step = iterator.next()).done;) {
    result = call(iterator, f, step.value, entries);
    if (result === BREAK || result === RETURN) return result;
  }
};

_exports.BREAK = BREAK;
_exports.RETURN = RETURN;

},{"./_an-object":33,"./_ctx":51,"./_is-array-iter":74,"./_iter-call":79,"./_to-length":141,"./core.get-iterator-method":153}],66:[function(require,module,exports){
"use strict";

// https://github.com/zloirock/core-js/issues/86#issuecomment-115759028
var global = module.exports = typeof window != 'undefined' && window.Math == Math ? window : typeof self != 'undefined' && self.Math == Math ? self // eslint-disable-next-line no-new-func
: Function('return this')();
if (typeof __g == 'number') __g = global; // eslint-disable-line no-undef

},{}],67:[function(require,module,exports){
"use strict";

var hasOwnProperty = {}.hasOwnProperty;

module.exports = function (it, key) {
  return hasOwnProperty.call(it, key);
};

},{}],68:[function(require,module,exports){
"use strict";

var dP = require('./_object-dp');

var createDesc = require('./_property-desc');

module.exports = require('./_descriptors') ? function (object, key, value) {
  return dP.f(object, key, createDesc(1, value));
} : function (object, key, value) {
  object[key] = value;
  return object;
};

},{"./_descriptors":55,"./_object-dp":97,"./_property-desc":115}],69:[function(require,module,exports){
"use strict";

var document = require('./_global').document;

module.exports = document && document.documentElement;

},{"./_global":66}],70:[function(require,module,exports){
"use strict";

module.exports = !require('./_descriptors') && !require('./_fails')(function () {
  return Object.defineProperty(require('./_dom-create')('div'), 'a', {
    get: function get() {
      return 7;
    }
  }).a != 7;
});

},{"./_descriptors":55,"./_dom-create":56,"./_fails":61}],71:[function(require,module,exports){
"use strict";

var isObject = require('./_is-object');

var setPrototypeOf = require('./_set-proto').set;

module.exports = function (that, target, C) {
  var S = target.constructor;
  var P;

  if (S !== C && typeof S == 'function' && (P = S.prototype) !== C.prototype && isObject(P) && setPrototypeOf) {
    setPrototypeOf(that, P);
  }

  return that;
};

},{"./_is-object":77,"./_set-proto":122}],72:[function(require,module,exports){
"use strict";

// fast apply, http://jsperf.lnkit.com/fast-apply/5
module.exports = function (fn, args, that) {
  var un = that === undefined;

  switch (args.length) {
    case 0:
      return un ? fn() : fn.call(that);

    case 1:
      return un ? fn(args[0]) : fn.call(that, args[0]);

    case 2:
      return un ? fn(args[0], args[1]) : fn.call(that, args[0], args[1]);

    case 3:
      return un ? fn(args[0], args[1], args[2]) : fn.call(that, args[0], args[1], args[2]);

    case 4:
      return un ? fn(args[0], args[1], args[2], args[3]) : fn.call(that, args[0], args[1], args[2], args[3]);
  }

  return fn.apply(that, args);
};

},{}],73:[function(require,module,exports){
"use strict";

// fallback for non-array-like ES3 and non-enumerable old V8 strings
var cof = require('./_cof'); // eslint-disable-next-line no-prototype-builtins


module.exports = Object('z').propertyIsEnumerable(0) ? Object : function (it) {
  return cof(it) == 'String' ? it.split('') : Object(it);
};

},{"./_cof":44}],74:[function(require,module,exports){
"use strict";

// check on default Array iterator
var Iterators = require('./_iterators');

var ITERATOR = require('./_wks')('iterator');

var ArrayProto = Array.prototype;

module.exports = function (it) {
  return it !== undefined && (Iterators.Array === it || ArrayProto[ITERATOR] === it);
};

},{"./_iterators":84,"./_wks":152}],75:[function(require,module,exports){
"use strict";

// 7.2.2 IsArray(argument)
var cof = require('./_cof');

module.exports = Array.isArray || function isArray(arg) {
  return cof(arg) == 'Array';
};

},{"./_cof":44}],76:[function(require,module,exports){
"use strict";

// 20.1.2.3 Number.isInteger(number)
var isObject = require('./_is-object');

var floor = Math.floor;

module.exports = function isInteger(it) {
  return !isObject(it) && isFinite(it) && floor(it) === it;
};

},{"./_is-object":77}],77:[function(require,module,exports){
"use strict";

function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }

module.exports = function (it) {
  return _typeof(it) === 'object' ? it !== null : typeof it === 'function';
};

},{}],78:[function(require,module,exports){
"use strict";

// 7.2.8 IsRegExp(argument)
var isObject = require('./_is-object');

var cof = require('./_cof');

var MATCH = require('./_wks')('match');

module.exports = function (it) {
  var isRegExp;
  return isObject(it) && ((isRegExp = it[MATCH]) !== undefined ? !!isRegExp : cof(it) == 'RegExp');
};

},{"./_cof":44,"./_is-object":77,"./_wks":152}],79:[function(require,module,exports){
"use strict";

// call something on iterator step with safe closing on error
var anObject = require('./_an-object');

module.exports = function (iterator, fn, value, entries) {
  try {
    return entries ? fn(anObject(value)[0], value[1]) : fn(value); // 7.4.6 IteratorClose(iterator, completion)
  } catch (e) {
    var ret = iterator['return'];
    if (ret !== undefined) anObject(ret.call(iterator));
    throw e;
  }
};

},{"./_an-object":33}],80:[function(require,module,exports){
'use strict';

var create = require('./_object-create');

var descriptor = require('./_property-desc');

var setToStringTag = require('./_set-to-string-tag');

var IteratorPrototype = {}; // 25.1.2.1.1 %IteratorPrototype%[@@iterator]()

require('./_hide')(IteratorPrototype, require('./_wks')('iterator'), function () {
  return this;
});

module.exports = function (Constructor, NAME, next) {
  Constructor.prototype = create(IteratorPrototype, {
    next: descriptor(1, next)
  });
  setToStringTag(Constructor, NAME + ' Iterator');
};

},{"./_hide":68,"./_object-create":96,"./_property-desc":115,"./_set-to-string-tag":124,"./_wks":152}],81:[function(require,module,exports){
'use strict';

var LIBRARY = require('./_library');

var $export = require('./_export');

var redefine = require('./_redefine');

var hide = require('./_hide');

var has = require('./_has');

var Iterators = require('./_iterators');

var $iterCreate = require('./_iter-create');

var setToStringTag = require('./_set-to-string-tag');

var getPrototypeOf = require('./_object-gpo');

var ITERATOR = require('./_wks')('iterator');

var BUGGY = !([].keys && 'next' in [].keys()); // Safari has buggy iterators w/o `next`

var FF_ITERATOR = '@@iterator';
var KEYS = 'keys';
var VALUES = 'values';

var returnThis = function returnThis() {
  return this;
};

module.exports = function (Base, NAME, Constructor, next, DEFAULT, IS_SET, FORCED) {
  $iterCreate(Constructor, NAME, next);

  var getMethod = function getMethod(kind) {
    if (!BUGGY && kind in proto) return proto[kind];

    switch (kind) {
      case KEYS:
        return function keys() {
          return new Constructor(this, kind);
        };

      case VALUES:
        return function values() {
          return new Constructor(this, kind);
        };
    }

    return function entries() {
      return new Constructor(this, kind);
    };
  };

  var TAG = NAME + ' Iterator';
  var DEF_VALUES = DEFAULT == VALUES;
  var VALUES_BUG = false;
  var proto = Base.prototype;
  var $native = proto[ITERATOR] || proto[FF_ITERATOR] || DEFAULT && proto[DEFAULT];
  var $default = !BUGGY && $native || getMethod(DEFAULT);
  var $entries = DEFAULT ? !DEF_VALUES ? $default : getMethod('entries') : undefined;
  var $anyNative = NAME == 'Array' ? proto.entries || $native : $native;
  var methods, key, IteratorPrototype; // Fix native

  if ($anyNative) {
    IteratorPrototype = getPrototypeOf($anyNative.call(new Base()));

    if (IteratorPrototype !== Object.prototype && IteratorPrototype.next) {
      // Set @@toStringTag to native iterators
      setToStringTag(IteratorPrototype, TAG, true); // fix for some old engines

      if (!LIBRARY && !has(IteratorPrototype, ITERATOR)) hide(IteratorPrototype, ITERATOR, returnThis);
    }
  } // fix Array#{values, @@iterator}.name in V8 / FF


  if (DEF_VALUES && $native && $native.name !== VALUES) {
    VALUES_BUG = true;

    $default = function values() {
      return $native.call(this);
    };
  } // Define iterator


  if ((!LIBRARY || FORCED) && (BUGGY || VALUES_BUG || !proto[ITERATOR])) {
    hide(proto, ITERATOR, $default);
  } // Plug for library


  Iterators[NAME] = $default;
  Iterators[TAG] = returnThis;

  if (DEFAULT) {
    methods = {
      values: DEF_VALUES ? $default : getMethod(VALUES),
      keys: IS_SET ? $default : getMethod(KEYS),
      entries: $entries
    };
    if (FORCED) for (key in methods) {
      if (!(key in proto)) redefine(proto, key, methods[key]);
    } else $export($export.P + $export.F * (BUGGY || VALUES_BUG), NAME, methods);
  }

  return methods;
};

},{"./_export":59,"./_has":67,"./_hide":68,"./_iter-create":80,"./_iterators":84,"./_library":85,"./_object-gpo":104,"./_redefine":117,"./_set-to-string-tag":124,"./_wks":152}],82:[function(require,module,exports){
"use strict";

var ITERATOR = require('./_wks')('iterator');

var SAFE_CLOSING = false;

try {
  var riter = [7][ITERATOR]();

  riter['return'] = function () {
    SAFE_CLOSING = true;
  }; // eslint-disable-next-line no-throw-literal


  Array.from(riter, function () {
    throw 2;
  });
} catch (e) {
  /* empty */
}

module.exports = function (exec, skipClosing) {
  if (!skipClosing && !SAFE_CLOSING) return false;
  var safe = false;

  try {
    var arr = [7];
    var iter = arr[ITERATOR]();

    iter.next = function () {
      return {
        done: safe = true
      };
    };

    arr[ITERATOR] = function () {
      return iter;
    };

    exec(arr);
  } catch (e) {
    /* empty */
  }

  return safe;
};

},{"./_wks":152}],83:[function(require,module,exports){
"use strict";

module.exports = function (done, value) {
  return {
    value: value,
    done: !!done
  };
};

},{}],84:[function(require,module,exports){
"use strict";

module.exports = {};

},{}],85:[function(require,module,exports){
"use strict";

module.exports = false;

},{}],86:[function(require,module,exports){
"use strict";

// 20.2.2.14 Math.expm1(x)
var $expm1 = Math.expm1;
module.exports = !$expm1 // Old FF bug
|| $expm1(10) > 22025.465794806719 || $expm1(10) < 22025.4657948067165168 // Tor Browser bug
|| $expm1(-2e-17) != -2e-17 ? function expm1(x) {
  return (x = +x) == 0 ? x : x > -1e-6 && x < 1e-6 ? x + x * x / 2 : Math.exp(x) - 1;
} : $expm1;

},{}],87:[function(require,module,exports){
"use strict";

// 20.2.2.16 Math.fround(x)
var sign = require('./_math-sign');

var pow = Math.pow;
var EPSILON = pow(2, -52);
var EPSILON32 = pow(2, -23);
var MAX32 = pow(2, 127) * (2 - EPSILON32);
var MIN32 = pow(2, -126);

var roundTiesToEven = function roundTiesToEven(n) {
  return n + 1 / EPSILON - 1 / EPSILON;
};

module.exports = Math.fround || function fround(x) {
  var $abs = Math.abs(x);
  var $sign = sign(x);
  var a, result;
  if ($abs < MIN32) return $sign * roundTiesToEven($abs / MIN32 / EPSILON32) * MIN32 * EPSILON32;
  a = (1 + EPSILON32 / EPSILON) * $abs;
  result = a - (a - $abs); // eslint-disable-next-line no-self-compare

  if (result > MAX32 || result != result) return $sign * Infinity;
  return $sign * result;
};

},{"./_math-sign":90}],88:[function(require,module,exports){
"use strict";

// 20.2.2.20 Math.log1p(x)
module.exports = Math.log1p || function log1p(x) {
  return (x = +x) > -1e-8 && x < 1e-8 ? x - x * x / 2 : Math.log(1 + x);
};

},{}],89:[function(require,module,exports){
"use strict";

// https://rwaldron.github.io/proposal-math-extensions/
module.exports = Math.scale || function scale(x, inLow, inHigh, outLow, outHigh) {
  if (arguments.length === 0 // eslint-disable-next-line no-self-compare
  || x != x // eslint-disable-next-line no-self-compare
  || inLow != inLow // eslint-disable-next-line no-self-compare
  || inHigh != inHigh // eslint-disable-next-line no-self-compare
  || outLow != outLow // eslint-disable-next-line no-self-compare
  || outHigh != outHigh) return NaN;
  if (x === Infinity || x === -Infinity) return x;
  return (x - inLow) * (outHigh - outLow) / (inHigh - inLow) + outLow;
};

},{}],90:[function(require,module,exports){
"use strict";

// 20.2.2.28 Math.sign(x)
module.exports = Math.sign || function sign(x) {
  // eslint-disable-next-line no-self-compare
  return (x = +x) == 0 || x != x ? x : x < 0 ? -1 : 1;
};

},{}],91:[function(require,module,exports){
"use strict";

function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }

var META = require('./_uid')('meta');

var isObject = require('./_is-object');

var has = require('./_has');

var setDesc = require('./_object-dp').f;

var id = 0;

var isExtensible = Object.isExtensible || function () {
  return true;
};

var FREEZE = !require('./_fails')(function () {
  return isExtensible(Object.preventExtensions({}));
});

var setMeta = function setMeta(it) {
  setDesc(it, META, {
    value: {
      i: 'O' + ++id,
      // object ID
      w: {} // weak collections IDs

    }
  });
};

var fastKey = function fastKey(it, create) {
  // return primitive with prefix
  if (!isObject(it)) return _typeof(it) == 'symbol' ? it : (typeof it == 'string' ? 'S' : 'P') + it;

  if (!has(it, META)) {
    // can't set metadata to uncaught frozen object
    if (!isExtensible(it)) return 'F'; // not necessary to add metadata

    if (!create) return 'E'; // add missing metadata

    setMeta(it); // return object ID
  }

  return it[META].i;
};

var getWeak = function getWeak(it, create) {
  if (!has(it, META)) {
    // can't set metadata to uncaught frozen object
    if (!isExtensible(it)) return true; // not necessary to add metadata

    if (!create) return false; // add missing metadata

    setMeta(it); // return hash weak collections IDs
  }

  return it[META].w;
}; // add metadata on freeze-family methods calling


var onFreeze = function onFreeze(it) {
  if (FREEZE && meta.NEED && isExtensible(it) && !has(it, META)) setMeta(it);
  return it;
};

var meta = module.exports = {
  KEY: META,
  NEED: false,
  fastKey: fastKey,
  getWeak: getWeak,
  onFreeze: onFreeze
};

},{"./_fails":61,"./_has":67,"./_is-object":77,"./_object-dp":97,"./_uid":147}],92:[function(require,module,exports){
"use strict";

function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }

var Map = require('./es6.map');

var $export = require('./_export');

var shared = require('./_shared')('metadata');

var store = shared.store || (shared.store = new (require('./es6.weak-map'))());

var getOrCreateMetadataMap = function getOrCreateMetadataMap(target, targetKey, create) {
  var targetMetadata = store.get(target);

  if (!targetMetadata) {
    if (!create) return undefined;
    store.set(target, targetMetadata = new Map());
  }

  var keyMetadata = targetMetadata.get(targetKey);

  if (!keyMetadata) {
    if (!create) return undefined;
    targetMetadata.set(targetKey, keyMetadata = new Map());
  }

  return keyMetadata;
};

var ordinaryHasOwnMetadata = function ordinaryHasOwnMetadata(MetadataKey, O, P) {
  var metadataMap = getOrCreateMetadataMap(O, P, false);
  return metadataMap === undefined ? false : metadataMap.has(MetadataKey);
};

var ordinaryGetOwnMetadata = function ordinaryGetOwnMetadata(MetadataKey, O, P) {
  var metadataMap = getOrCreateMetadataMap(O, P, false);
  return metadataMap === undefined ? undefined : metadataMap.get(MetadataKey);
};

var ordinaryDefineOwnMetadata = function ordinaryDefineOwnMetadata(MetadataKey, MetadataValue, O, P) {
  getOrCreateMetadataMap(O, P, true).set(MetadataKey, MetadataValue);
};

var ordinaryOwnMetadataKeys = function ordinaryOwnMetadataKeys(target, targetKey) {
  var metadataMap = getOrCreateMetadataMap(target, targetKey, false);
  var keys = [];
  if (metadataMap) metadataMap.forEach(function (_, key) {
    keys.push(key);
  });
  return keys;
};

var toMetaKey = function toMetaKey(it) {
  return it === undefined || _typeof(it) == 'symbol' ? it : String(it);
};

var exp = function exp(O) {
  $export($export.S, 'Reflect', O);
};

module.exports = {
  store: store,
  map: getOrCreateMetadataMap,
  has: ordinaryHasOwnMetadata,
  get: ordinaryGetOwnMetadata,
  set: ordinaryDefineOwnMetadata,
  keys: ordinaryOwnMetadataKeys,
  key: toMetaKey,
  exp: exp
};

},{"./_export":59,"./_shared":126,"./es6.map":184,"./es6.weak-map":290}],93:[function(require,module,exports){
"use strict";

var global = require('./_global');

var macrotask = require('./_task').set;

var Observer = global.MutationObserver || global.WebKitMutationObserver;
var process = global.process;
var Promise = global.Promise;
var isNode = require('./_cof')(process) == 'process';

module.exports = function () {
  var head, last, notify;

  var flush = function flush() {
    var parent, fn;
    if (isNode && (parent = process.domain)) parent.exit();

    while (head) {
      fn = head.fn;
      head = head.next;

      try {
        fn();
      } catch (e) {
        if (head) notify();else last = undefined;
        throw e;
      }
    }

    last = undefined;
    if (parent) parent.enter();
  }; // Node.js


  if (isNode) {
    notify = function notify() {
      process.nextTick(flush);
    }; // browsers with MutationObserver, except iOS Safari - https://github.com/zloirock/core-js/issues/339

  } else if (Observer && !(global.navigator && global.navigator.standalone)) {
    var toggle = true;
    var node = document.createTextNode('');
    new Observer(flush).observe(node, {
      characterData: true
    }); // eslint-disable-line no-new

    notify = function notify() {
      node.data = toggle = !toggle;
    }; // environments with maybe non-completely correct, but existent Promise

  } else if (Promise && Promise.resolve) {
    var promise = Promise.resolve();

    notify = function notify() {
      promise.then(flush);
    }; // for other environments - macrotask based on:
    // - setImmediate
    // - MessageChannel
    // - window.postMessag
    // - onreadystatechange
    // - setTimeout

  } else {
    notify = function notify() {
      // strange IE + webpack dev server bug - use .call(global)
      macrotask.call(global, flush);
    };
  }

  return function (fn) {
    var task = {
      fn: fn,
      next: undefined
    };
    if (last) last.next = task;

    if (!head) {
      head = task;
      notify();
    }

    last = task;
  };
};

},{"./_cof":44,"./_global":66,"./_task":136}],94:[function(require,module,exports){
'use strict'; // 25.4.1.5 NewPromiseCapability(C)

var aFunction = require('./_a-function');

function PromiseCapability(C) {
  var resolve, reject;
  this.promise = new C(function ($$resolve, $$reject) {
    if (resolve !== undefined || reject !== undefined) throw TypeError('Bad Promise constructor');
    resolve = $$resolve;
    reject = $$reject;
  });
  this.resolve = aFunction(resolve);
  this.reject = aFunction(reject);
}

module.exports.f = function (C) {
  return new PromiseCapability(C);
};

},{"./_a-function":29}],95:[function(require,module,exports){
'use strict'; // 19.1.2.1 Object.assign(target, source, ...)

var getKeys = require('./_object-keys');

var gOPS = require('./_object-gops');

var pIE = require('./_object-pie');

var toObject = require('./_to-object');

var IObject = require('./_iobject');

var $assign = Object.assign; // should work with symbols and should have deterministic property order (V8 bug)

module.exports = !$assign || require('./_fails')(function () {
  var A = {};
  var B = {}; // eslint-disable-next-line no-undef

  var S = Symbol();
  var K = 'abcdefghijklmnopqrst';
  A[S] = 7;
  K.split('').forEach(function (k) {
    B[k] = k;
  });
  return $assign({}, A)[S] != 7 || Object.keys($assign({}, B)).join('') != K;
}) ? function assign(target, source) {
  // eslint-disable-line no-unused-vars
  var T = toObject(target);
  var aLen = arguments.length;
  var index = 1;
  var getSymbols = gOPS.f;
  var isEnum = pIE.f;

  while (aLen > index) {
    var S = IObject(arguments[index++]);
    var keys = getSymbols ? getKeys(S).concat(getSymbols(S)) : getKeys(S);
    var length = keys.length;
    var j = 0;
    var key;

    while (length > j) {
      if (isEnum.call(S, key = keys[j++])) T[key] = S[key];
    }
  }

  return T;
} : $assign;

},{"./_fails":61,"./_iobject":73,"./_object-gops":103,"./_object-keys":106,"./_object-pie":107,"./_to-object":142}],96:[function(require,module,exports){
"use strict";

// 19.1.2.2 / 15.2.3.5 Object.create(O [, Properties])
var anObject = require('./_an-object');

var dPs = require('./_object-dps');

var enumBugKeys = require('./_enum-bug-keys');

var IE_PROTO = require('./_shared-key')('IE_PROTO');

var Empty = function Empty() {
  /* empty */
};

var PROTOTYPE = 'prototype'; // Create object with fake `null` prototype: use iframe Object with cleared prototype

var _createDict = function createDict() {
  // Thrash, waste and sodomy: IE GC bug
  var iframe = require('./_dom-create')('iframe');

  var i = enumBugKeys.length;
  var lt = '<';
  var gt = '>';
  var iframeDocument;
  iframe.style.display = 'none';

  require('./_html').appendChild(iframe);

  iframe.src = 'javascript:'; // eslint-disable-line no-script-url
  // createDict = iframe.contentWindow.Object;
  // html.removeChild(iframe);

  iframeDocument = iframe.contentWindow.document;
  iframeDocument.open();
  iframeDocument.write(lt + 'script' + gt + 'document.F=Object' + lt + '/script' + gt);
  iframeDocument.close();
  _createDict = iframeDocument.F;

  while (i--) {
    delete _createDict[PROTOTYPE][enumBugKeys[i]];
  }

  return _createDict();
};

module.exports = Object.create || function create(O, Properties) {
  var result;

  if (O !== null) {
    Empty[PROTOTYPE] = anObject(O);
    result = new Empty();
    Empty[PROTOTYPE] = null; // add "__proto__" for Object.getPrototypeOf polyfill

    result[IE_PROTO] = O;
  } else result = _createDict();

  return Properties === undefined ? result : dPs(result, Properties);
};

},{"./_an-object":33,"./_dom-create":56,"./_enum-bug-keys":57,"./_html":69,"./_object-dps":98,"./_shared-key":125}],97:[function(require,module,exports){
"use strict";

var anObject = require('./_an-object');

var IE8_DOM_DEFINE = require('./_ie8-dom-define');

var toPrimitive = require('./_to-primitive');

var dP = Object.defineProperty;
exports.f = require('./_descriptors') ? Object.defineProperty : function defineProperty(O, P, Attributes) {
  anObject(O);
  P = toPrimitive(P, true);
  anObject(Attributes);
  if (IE8_DOM_DEFINE) try {
    return dP(O, P, Attributes);
  } catch (e) {
    /* empty */
  }
  if ('get' in Attributes || 'set' in Attributes) throw TypeError('Accessors not supported!');
  if ('value' in Attributes) O[P] = Attributes.value;
  return O;
};

},{"./_an-object":33,"./_descriptors":55,"./_ie8-dom-define":70,"./_to-primitive":143}],98:[function(require,module,exports){
"use strict";

var dP = require('./_object-dp');

var anObject = require('./_an-object');

var getKeys = require('./_object-keys');

module.exports = require('./_descriptors') ? Object.defineProperties : function defineProperties(O, Properties) {
  anObject(O);
  var keys = getKeys(Properties);
  var length = keys.length;
  var i = 0;
  var P;

  while (length > i) {
    dP.f(O, P = keys[i++], Properties[P]);
  }

  return O;
};

},{"./_an-object":33,"./_descriptors":55,"./_object-dp":97,"./_object-keys":106}],99:[function(require,module,exports){
'use strict'; // Forced replacement prototype accessors methods

module.exports = require('./_library') || !require('./_fails')(function () {
  var K = Math.random(); // In FF throws only define methods
  // eslint-disable-next-line no-undef, no-useless-call

  __defineSetter__.call(null, K, function () {
    /* empty */
  });

  delete require('./_global')[K];
});

},{"./_fails":61,"./_global":66,"./_library":85}],100:[function(require,module,exports){
"use strict";

var pIE = require('./_object-pie');

var createDesc = require('./_property-desc');

var toIObject = require('./_to-iobject');

var toPrimitive = require('./_to-primitive');

var has = require('./_has');

var IE8_DOM_DEFINE = require('./_ie8-dom-define');

var gOPD = Object.getOwnPropertyDescriptor;
exports.f = require('./_descriptors') ? gOPD : function getOwnPropertyDescriptor(O, P) {
  O = toIObject(O);
  P = toPrimitive(P, true);
  if (IE8_DOM_DEFINE) try {
    return gOPD(O, P);
  } catch (e) {
    /* empty */
  }
  if (has(O, P)) return createDesc(!pIE.f.call(O, P), O[P]);
};

},{"./_descriptors":55,"./_has":67,"./_ie8-dom-define":70,"./_object-pie":107,"./_property-desc":115,"./_to-iobject":140,"./_to-primitive":143}],101:[function(require,module,exports){
"use strict";

function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }

// fallback for IE11 buggy Object.getOwnPropertyNames with iframe and window
var toIObject = require('./_to-iobject');

var gOPN = require('./_object-gopn').f;

var toString = {}.toString;
var windowNames = (typeof window === "undefined" ? "undefined" : _typeof(window)) == 'object' && window && Object.getOwnPropertyNames ? Object.getOwnPropertyNames(window) : [];

var getWindowNames = function getWindowNames(it) {
  try {
    return gOPN(it);
  } catch (e) {
    return windowNames.slice();
  }
};

module.exports.f = function getOwnPropertyNames(it) {
  return windowNames && toString.call(it) == '[object Window]' ? getWindowNames(it) : gOPN(toIObject(it));
};

},{"./_object-gopn":102,"./_to-iobject":140}],102:[function(require,module,exports){
"use strict";

// 19.1.2.7 / 15.2.3.4 Object.getOwnPropertyNames(O)
var $keys = require('./_object-keys-internal');

var hiddenKeys = require('./_enum-bug-keys').concat('length', 'prototype');

exports.f = Object.getOwnPropertyNames || function getOwnPropertyNames(O) {
  return $keys(O, hiddenKeys);
};

},{"./_enum-bug-keys":57,"./_object-keys-internal":105}],103:[function(require,module,exports){
"use strict";

exports.f = Object.getOwnPropertySymbols;

},{}],104:[function(require,module,exports){
"use strict";

// 19.1.2.9 / 15.2.3.2 Object.getPrototypeOf(O)
var has = require('./_has');

var toObject = require('./_to-object');

var IE_PROTO = require('./_shared-key')('IE_PROTO');

var ObjectProto = Object.prototype;

module.exports = Object.getPrototypeOf || function (O) {
  O = toObject(O);
  if (has(O, IE_PROTO)) return O[IE_PROTO];

  if (typeof O.constructor == 'function' && O instanceof O.constructor) {
    return O.constructor.prototype;
  }

  return O instanceof Object ? ObjectProto : null;
};

},{"./_has":67,"./_shared-key":125,"./_to-object":142}],105:[function(require,module,exports){
"use strict";

var has = require('./_has');

var toIObject = require('./_to-iobject');

var arrayIndexOf = require('./_array-includes')(false);

var IE_PROTO = require('./_shared-key')('IE_PROTO');

module.exports = function (object, names) {
  var O = toIObject(object);
  var i = 0;
  var result = [];
  var key;

  for (key in O) {
    if (key != IE_PROTO) has(O, key) && result.push(key);
  } // Don't enum bug & hidden keys


  while (names.length > i) {
    if (has(O, key = names[i++])) {
      ~arrayIndexOf(result, key) || result.push(key);
    }
  }

  return result;
};

},{"./_array-includes":37,"./_has":67,"./_shared-key":125,"./_to-iobject":140}],106:[function(require,module,exports){
"use strict";

// 19.1.2.14 / 15.2.3.14 Object.keys(O)
var $keys = require('./_object-keys-internal');

var enumBugKeys = require('./_enum-bug-keys');

module.exports = Object.keys || function keys(O) {
  return $keys(O, enumBugKeys);
};

},{"./_enum-bug-keys":57,"./_object-keys-internal":105}],107:[function(require,module,exports){
"use strict";

exports.f = {}.propertyIsEnumerable;

},{}],108:[function(require,module,exports){
"use strict";

// most Object methods by ES6 should accept primitives
var $export = require('./_export');

var core = require('./_core');

var fails = require('./_fails');

module.exports = function (KEY, exec) {
  var fn = (core.Object || {})[KEY] || Object[KEY];
  var exp = {};
  exp[KEY] = exec(fn);
  $export($export.S + $export.F * fails(function () {
    fn(1);
  }), 'Object', exp);
};

},{"./_core":49,"./_export":59,"./_fails":61}],109:[function(require,module,exports){
"use strict";

var getKeys = require('./_object-keys');

var toIObject = require('./_to-iobject');

var isEnum = require('./_object-pie').f;

module.exports = function (isEntries) {
  return function (it) {
    var O = toIObject(it);
    var keys = getKeys(O);
    var length = keys.length;
    var i = 0;
    var result = [];
    var key;

    while (length > i) {
      if (isEnum.call(O, key = keys[i++])) {
        result.push(isEntries ? [key, O[key]] : O[key]);
      }
    }

    return result;
  };
};

},{"./_object-keys":106,"./_object-pie":107,"./_to-iobject":140}],110:[function(require,module,exports){
"use strict";

// all object keys, includes non-enumerable and symbols
var gOPN = require('./_object-gopn');

var gOPS = require('./_object-gops');

var anObject = require('./_an-object');

var Reflect = require('./_global').Reflect;

module.exports = Reflect && Reflect.ownKeys || function ownKeys(it) {
  var keys = gOPN.f(anObject(it));
  var getSymbols = gOPS.f;
  return getSymbols ? keys.concat(getSymbols(it)) : keys;
};

},{"./_an-object":33,"./_global":66,"./_object-gopn":102,"./_object-gops":103}],111:[function(require,module,exports){
"use strict";

var $parseFloat = require('./_global').parseFloat;

var $trim = require('./_string-trim').trim;

module.exports = 1 / $parseFloat(require('./_string-ws') + '-0') !== -Infinity ? function parseFloat(str) {
  var string = $trim(String(str), 3);
  var result = $parseFloat(string);
  return result === 0 && string.charAt(0) == '-' ? -0 : result;
} : $parseFloat;

},{"./_global":66,"./_string-trim":134,"./_string-ws":135}],112:[function(require,module,exports){
"use strict";

var $parseInt = require('./_global').parseInt;

var $trim = require('./_string-trim').trim;

var ws = require('./_string-ws');

var hex = /^[-+]?0[xX]/;
module.exports = $parseInt(ws + '08') !== 8 || $parseInt(ws + '0x16') !== 22 ? function parseInt(str, radix) {
  var string = $trim(String(str), 3);
  return $parseInt(string, radix >>> 0 || (hex.test(string) ? 16 : 10));
} : $parseInt;

},{"./_global":66,"./_string-trim":134,"./_string-ws":135}],113:[function(require,module,exports){
"use strict";

module.exports = function (exec) {
  try {
    return {
      e: false,
      v: exec()
    };
  } catch (e) {
    return {
      e: true,
      v: e
    };
  }
};

},{}],114:[function(require,module,exports){
"use strict";

var anObject = require('./_an-object');

var isObject = require('./_is-object');

var newPromiseCapability = require('./_new-promise-capability');

module.exports = function (C, x) {
  anObject(C);
  if (isObject(x) && x.constructor === C) return x;
  var promiseCapability = newPromiseCapability.f(C);
  var resolve = promiseCapability.resolve;
  resolve(x);
  return promiseCapability.promise;
};

},{"./_an-object":33,"./_is-object":77,"./_new-promise-capability":94}],115:[function(require,module,exports){
"use strict";

module.exports = function (bitmap, value) {
  return {
    enumerable: !(bitmap & 1),
    configurable: !(bitmap & 2),
    writable: !(bitmap & 4),
    value: value
  };
};

},{}],116:[function(require,module,exports){
"use strict";

var redefine = require('./_redefine');

module.exports = function (target, src, safe) {
  for (var key in src) {
    redefine(target, key, src[key], safe);
  }

  return target;
};

},{"./_redefine":117}],117:[function(require,module,exports){
"use strict";

var global = require('./_global');

var hide = require('./_hide');

var has = require('./_has');

var SRC = require('./_uid')('src');

var TO_STRING = 'toString';
var $toString = Function[TO_STRING];
var TPL = ('' + $toString).split(TO_STRING);

require('./_core').inspectSource = function (it) {
  return $toString.call(it);
};

(module.exports = function (O, key, val, safe) {
  var isFunction = typeof val == 'function';
  if (isFunction) has(val, 'name') || hide(val, 'name', key);
  if (O[key] === val) return;
  if (isFunction) has(val, SRC) || hide(val, SRC, O[key] ? '' + O[key] : TPL.join(String(key)));

  if (O === global) {
    O[key] = val;
  } else if (!safe) {
    delete O[key];
    hide(O, key, val);
  } else if (O[key]) {
    O[key] = val;
  } else {
    hide(O, key, val);
  } // add fake Function#toString for correct work wrapped methods / constructors with methods like LoDash isNative

})(Function.prototype, TO_STRING, function toString() {
  return typeof this == 'function' && this[SRC] || $toString.call(this);
});

},{"./_core":49,"./_global":66,"./_has":67,"./_hide":68,"./_uid":147}],118:[function(require,module,exports){
"use strict";

module.exports = function (regExp, replace) {
  var replacer = replace === Object(replace) ? function (part) {
    return replace[part];
  } : replace;
  return function (it) {
    return String(it).replace(regExp, replacer);
  };
};

},{}],119:[function(require,module,exports){
"use strict";

// 7.2.9 SameValue(x, y)
module.exports = Object.is || function is(x, y) {
  // eslint-disable-next-line no-self-compare
  return x === y ? x !== 0 || 1 / x === 1 / y : x != x && y != y;
};

},{}],120:[function(require,module,exports){
'use strict'; // https://tc39.github.io/proposal-setmap-offrom/

var $export = require('./_export');

var aFunction = require('./_a-function');

var ctx = require('./_ctx');

var forOf = require('./_for-of');

module.exports = function (COLLECTION) {
  $export($export.S, COLLECTION, {
    from: function from(source
    /* , mapFn, thisArg */
    ) {
      var mapFn = arguments[1];
      var mapping, A, n, cb;
      aFunction(this);
      mapping = mapFn !== undefined;
      if (mapping) aFunction(mapFn);
      if (source == undefined) return new this();
      A = [];

      if (mapping) {
        n = 0;
        cb = ctx(mapFn, arguments[2], 2);
        forOf(source, false, function (nextItem) {
          A.push(cb(nextItem, n++));
        });
      } else {
        forOf(source, false, A.push, A);
      }

      return new this(A);
    }
  });
};

},{"./_a-function":29,"./_ctx":51,"./_export":59,"./_for-of":65}],121:[function(require,module,exports){
'use strict'; // https://tc39.github.io/proposal-setmap-offrom/

var $export = require('./_export');

module.exports = function (COLLECTION) {
  $export($export.S, COLLECTION, {
    of: function of() {
      var length = arguments.length;
      var A = new Array(length);

      while (length--) {
        A[length] = arguments[length];
      }

      return new this(A);
    }
  });
};

},{"./_export":59}],122:[function(require,module,exports){
"use strict";

// Works with __proto__ only. Old v8 can't work with null proto objects.

/* eslint-disable no-proto */
var isObject = require('./_is-object');

var anObject = require('./_an-object');

var check = function check(O, proto) {
  anObject(O);
  if (!isObject(proto) && proto !== null) throw TypeError(proto + ": can't set as prototype!");
};

module.exports = {
  set: Object.setPrototypeOf || ('__proto__' in {} ? // eslint-disable-line
  function (test, buggy, set) {
    try {
      set = require('./_ctx')(Function.call, require('./_object-gopd').f(Object.prototype, '__proto__').set, 2);
      set(test, []);
      buggy = !(test instanceof Array);
    } catch (e) {
      buggy = true;
    }

    return function setPrototypeOf(O, proto) {
      check(O, proto);
      if (buggy) O.__proto__ = proto;else set(O, proto);
      return O;
    };
  }({}, false) : undefined),
  check: check
};

},{"./_an-object":33,"./_ctx":51,"./_is-object":77,"./_object-gopd":100}],123:[function(require,module,exports){
'use strict';

var global = require('./_global');

var dP = require('./_object-dp');

var DESCRIPTORS = require('./_descriptors');

var SPECIES = require('./_wks')('species');

module.exports = function (KEY) {
  var C = global[KEY];
  if (DESCRIPTORS && C && !C[SPECIES]) dP.f(C, SPECIES, {
    configurable: true,
    get: function get() {
      return this;
    }
  });
};

},{"./_descriptors":55,"./_global":66,"./_object-dp":97,"./_wks":152}],124:[function(require,module,exports){
"use strict";

var def = require('./_object-dp').f;

var has = require('./_has');

var TAG = require('./_wks')('toStringTag');

module.exports = function (it, tag, stat) {
  if (it && !has(it = stat ? it : it.prototype, TAG)) def(it, TAG, {
    configurable: true,
    value: tag
  });
};

},{"./_has":67,"./_object-dp":97,"./_wks":152}],125:[function(require,module,exports){
"use strict";

var shared = require('./_shared')('keys');

var uid = require('./_uid');

module.exports = function (key) {
  return shared[key] || (shared[key] = uid(key));
};

},{"./_shared":126,"./_uid":147}],126:[function(require,module,exports){
"use strict";

var global = require('./_global');

var SHARED = '__core-js_shared__';
var store = global[SHARED] || (global[SHARED] = {});

module.exports = function (key) {
  return store[key] || (store[key] = {});
};

},{"./_global":66}],127:[function(require,module,exports){
"use strict";

// 7.3.20 SpeciesConstructor(O, defaultConstructor)
var anObject = require('./_an-object');

var aFunction = require('./_a-function');

var SPECIES = require('./_wks')('species');

module.exports = function (O, D) {
  var C = anObject(O).constructor;
  var S;
  return C === undefined || (S = anObject(C)[SPECIES]) == undefined ? D : aFunction(S);
};

},{"./_a-function":29,"./_an-object":33,"./_wks":152}],128:[function(require,module,exports){
'use strict';

var fails = require('./_fails');

module.exports = function (method, arg) {
  return !!method && fails(function () {
    // eslint-disable-next-line no-useless-call
    arg ? method.call(null, function () {
      /* empty */
    }, 1) : method.call(null);
  });
};

},{"./_fails":61}],129:[function(require,module,exports){
"use strict";

var toInteger = require('./_to-integer');

var defined = require('./_defined'); // true  -> String#at
// false -> String#codePointAt


module.exports = function (TO_STRING) {
  return function (that, pos) {
    var s = String(defined(that));
    var i = toInteger(pos);
    var l = s.length;
    var a, b;
    if (i < 0 || i >= l) return TO_STRING ? '' : undefined;
    a = s.charCodeAt(i);
    return a < 0xd800 || a > 0xdbff || i + 1 === l || (b = s.charCodeAt(i + 1)) < 0xdc00 || b > 0xdfff ? TO_STRING ? s.charAt(i) : a : TO_STRING ? s.slice(i, i + 2) : (a - 0xd800 << 10) + (b - 0xdc00) + 0x10000;
  };
};

},{"./_defined":54,"./_to-integer":139}],130:[function(require,module,exports){
"use strict";

// helper for String#{startsWith, endsWith, includes}
var isRegExp = require('./_is-regexp');

var defined = require('./_defined');

module.exports = function (that, searchString, NAME) {
  if (isRegExp(searchString)) throw TypeError('String#' + NAME + " doesn't accept regex!");
  return String(defined(that));
};

},{"./_defined":54,"./_is-regexp":78}],131:[function(require,module,exports){
"use strict";

var $export = require('./_export');

var fails = require('./_fails');

var defined = require('./_defined');

var quot = /"/g; // B.2.3.2.1 CreateHTML(string, tag, attribute, value)

var createHTML = function createHTML(string, tag, attribute, value) {
  var S = String(defined(string));
  var p1 = '<' + tag;
  if (attribute !== '') p1 += ' ' + attribute + '="' + String(value).replace(quot, '&quot;') + '"';
  return p1 + '>' + S + '</' + tag + '>';
};

module.exports = function (NAME, exec) {
  var O = {};
  O[NAME] = exec(createHTML);
  $export($export.P + $export.F * fails(function () {
    var test = ''[NAME]('"');
    return test !== test.toLowerCase() || test.split('"').length > 3;
  }), 'String', O);
};

},{"./_defined":54,"./_export":59,"./_fails":61}],132:[function(require,module,exports){
"use strict";

// https://github.com/tc39/proposal-string-pad-start-end
var toLength = require('./_to-length');

var repeat = require('./_string-repeat');

var defined = require('./_defined');

module.exports = function (that, maxLength, fillString, left) {
  var S = String(defined(that));
  var stringLength = S.length;
  var fillStr = fillString === undefined ? ' ' : String(fillString);
  var intMaxLength = toLength(maxLength);
  if (intMaxLength <= stringLength || fillStr == '') return S;
  var fillLen = intMaxLength - stringLength;
  var stringFiller = repeat.call(fillStr, Math.ceil(fillLen / fillStr.length));
  if (stringFiller.length > fillLen) stringFiller = stringFiller.slice(0, fillLen);
  return left ? stringFiller + S : S + stringFiller;
};

},{"./_defined":54,"./_string-repeat":133,"./_to-length":141}],133:[function(require,module,exports){
'use strict';

var toInteger = require('./_to-integer');

var defined = require('./_defined');

module.exports = function repeat(count) {
  var str = String(defined(this));
  var res = '';
  var n = toInteger(count);
  if (n < 0 || n == Infinity) throw RangeError("Count can't be negative");

  for (; n > 0; (n >>>= 1) && (str += str)) {
    if (n & 1) res += str;
  }

  return res;
};

},{"./_defined":54,"./_to-integer":139}],134:[function(require,module,exports){
"use strict";

var $export = require('./_export');

var defined = require('./_defined');

var fails = require('./_fails');

var spaces = require('./_string-ws');

var space = '[' + spaces + ']';
var non = "\u200B\x85";
var ltrim = RegExp('^' + space + space + '*');
var rtrim = RegExp(space + space + '*$');

var exporter = function exporter(KEY, exec, ALIAS) {
  var exp = {};
  var FORCE = fails(function () {
    return !!spaces[KEY]() || non[KEY]() != non;
  });
  var fn = exp[KEY] = FORCE ? exec(trim) : spaces[KEY];
  if (ALIAS) exp[ALIAS] = fn;
  $export($export.P + $export.F * FORCE, 'String', exp);
}; // 1 -> String#trimLeft
// 2 -> String#trimRight
// 3 -> String#trim


var trim = exporter.trim = function (string, TYPE) {
  string = String(defined(string));
  if (TYPE & 1) string = string.replace(ltrim, '');
  if (TYPE & 2) string = string.replace(rtrim, '');
  return string;
};

module.exports = exporter;

},{"./_defined":54,"./_export":59,"./_fails":61,"./_string-ws":135}],135:[function(require,module,exports){
"use strict";

module.exports = "\t\n\x0B\f\r \xA0\u1680\u180E\u2000\u2001\u2002\u2003" + "\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u202F\u205F\u3000\u2028\u2029\uFEFF";

},{}],136:[function(require,module,exports){
"use strict";

var ctx = require('./_ctx');

var invoke = require('./_invoke');

var html = require('./_html');

var cel = require('./_dom-create');

var global = require('./_global');

var process = global.process;
var setTask = global.setImmediate;
var clearTask = global.clearImmediate;
var MessageChannel = global.MessageChannel;
var Dispatch = global.Dispatch;
var counter = 0;
var queue = {};
var ONREADYSTATECHANGE = 'onreadystatechange';
var defer, channel, port;

var run = function run() {
  var id = +this; // eslint-disable-next-line no-prototype-builtins

  if (queue.hasOwnProperty(id)) {
    var fn = queue[id];
    delete queue[id];
    fn();
  }
};

var listener = function listener(event) {
  run.call(event.data);
}; // Node.js 0.9+ & IE10+ has setImmediate, otherwise:


if (!setTask || !clearTask) {
  setTask = function setImmediate(fn) {
    var args = [];
    var i = 1;

    while (arguments.length > i) {
      args.push(arguments[i++]);
    }

    queue[++counter] = function () {
      // eslint-disable-next-line no-new-func
      invoke(typeof fn == 'function' ? fn : Function(fn), args);
    };

    defer(counter);
    return counter;
  };

  clearTask = function clearImmediate(id) {
    delete queue[id];
  }; // Node.js 0.8-


  if (require('./_cof')(process) == 'process') {
    defer = function defer(id) {
      process.nextTick(ctx(run, id, 1));
    }; // Sphere (JS game engine) Dispatch API

  } else if (Dispatch && Dispatch.now) {
    defer = function defer(id) {
      Dispatch.now(ctx(run, id, 1));
    }; // Browsers with MessageChannel, includes WebWorkers

  } else if (MessageChannel) {
    channel = new MessageChannel();
    port = channel.port2;
    channel.port1.onmessage = listener;
    defer = ctx(port.postMessage, port, 1); // Browsers with postMessage, skip WebWorkers
    // IE8 has postMessage, but it's sync & typeof its postMessage is 'object'
  } else if (global.addEventListener && typeof postMessage == 'function' && !global.importScripts) {
    defer = function defer(id) {
      global.postMessage(id + '', '*');
    };

    global.addEventListener('message', listener, false); // IE8-
  } else if (ONREADYSTATECHANGE in cel('script')) {
    defer = function defer(id) {
      html.appendChild(cel('script'))[ONREADYSTATECHANGE] = function () {
        html.removeChild(this);
        run.call(id);
      };
    }; // Rest old browsers

  } else {
    defer = function defer(id) {
      setTimeout(ctx(run, id, 1), 0);
    };
  }
}

module.exports = {
  set: setTask,
  clear: clearTask
};

},{"./_cof":44,"./_ctx":51,"./_dom-create":56,"./_global":66,"./_html":69,"./_invoke":72}],137:[function(require,module,exports){
"use strict";

var toInteger = require('./_to-integer');

var max = Math.max;
var min = Math.min;

module.exports = function (index, length) {
  index = toInteger(index);
  return index < 0 ? max(index + length, 0) : min(index, length);
};

},{"./_to-integer":139}],138:[function(require,module,exports){
"use strict";

// https://tc39.github.io/ecma262/#sec-toindex
var toInteger = require('./_to-integer');

var toLength = require('./_to-length');

module.exports = function (it) {
  if (it === undefined) return 0;
  var number = toInteger(it);
  var length = toLength(number);
  if (number !== length) throw RangeError('Wrong length!');
  return length;
};

},{"./_to-integer":139,"./_to-length":141}],139:[function(require,module,exports){
"use strict";

// 7.1.4 ToInteger
var ceil = Math.ceil;
var floor = Math.floor;

module.exports = function (it) {
  return isNaN(it = +it) ? 0 : (it > 0 ? floor : ceil)(it);
};

},{}],140:[function(require,module,exports){
"use strict";

// to indexed object, toObject with fallback for non-array-like ES3 strings
var IObject = require('./_iobject');

var defined = require('./_defined');

module.exports = function (it) {
  return IObject(defined(it));
};

},{"./_defined":54,"./_iobject":73}],141:[function(require,module,exports){
"use strict";

// 7.1.15 ToLength
var toInteger = require('./_to-integer');

var min = Math.min;

module.exports = function (it) {
  return it > 0 ? min(toInteger(it), 0x1fffffffffffff) : 0; // pow(2, 53) - 1 == 9007199254740991
};

},{"./_to-integer":139}],142:[function(require,module,exports){
"use strict";

// 7.1.13 ToObject(argument)
var defined = require('./_defined');

module.exports = function (it) {
  return Object(defined(it));
};

},{"./_defined":54}],143:[function(require,module,exports){
"use strict";

// 7.1.1 ToPrimitive(input [, PreferredType])
var isObject = require('./_is-object'); // instead of the ES6 spec version, we didn't implement @@toPrimitive case
// and the second argument - flag - preferred type is a string


module.exports = function (it, S) {
  if (!isObject(it)) return it;
  var fn, val;
  if (S && typeof (fn = it.toString) == 'function' && !isObject(val = fn.call(it))) return val;
  if (typeof (fn = it.valueOf) == 'function' && !isObject(val = fn.call(it))) return val;
  if (!S && typeof (fn = it.toString) == 'function' && !isObject(val = fn.call(it))) return val;
  throw TypeError("Can't convert object to primitive value");
};

},{"./_is-object":77}],144:[function(require,module,exports){
'use strict';

function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }

if (require('./_descriptors')) {
  var LIBRARY = require('./_library');

  var global = require('./_global');

  var fails = require('./_fails');

  var $export = require('./_export');

  var $typed = require('./_typed');

  var $buffer = require('./_typed-buffer');

  var ctx = require('./_ctx');

  var anInstance = require('./_an-instance');

  var propertyDesc = require('./_property-desc');

  var hide = require('./_hide');

  var redefineAll = require('./_redefine-all');

  var toInteger = require('./_to-integer');

  var toLength = require('./_to-length');

  var toIndex = require('./_to-index');

  var toAbsoluteIndex = require('./_to-absolute-index');

  var toPrimitive = require('./_to-primitive');

  var has = require('./_has');

  var classof = require('./_classof');

  var isObject = require('./_is-object');

  var toObject = require('./_to-object');

  var isArrayIter = require('./_is-array-iter');

  var create = require('./_object-create');

  var getPrototypeOf = require('./_object-gpo');

  var gOPN = require('./_object-gopn').f;

  var getIterFn = require('./core.get-iterator-method');

  var uid = require('./_uid');

  var wks = require('./_wks');

  var createArrayMethod = require('./_array-methods');

  var createArrayIncludes = require('./_array-includes');

  var speciesConstructor = require('./_species-constructor');

  var ArrayIterators = require('./es6.array.iterator');

  var Iterators = require('./_iterators');

  var $iterDetect = require('./_iter-detect');

  var setSpecies = require('./_set-species');

  var arrayFill = require('./_array-fill');

  var arrayCopyWithin = require('./_array-copy-within');

  var $DP = require('./_object-dp');

  var $GOPD = require('./_object-gopd');

  var dP = $DP.f;
  var gOPD = $GOPD.f;
  var RangeError = global.RangeError;
  var TypeError = global.TypeError;
  var Uint8Array = global.Uint8Array;
  var ARRAY_BUFFER = 'ArrayBuffer';
  var SHARED_BUFFER = 'Shared' + ARRAY_BUFFER;
  var BYTES_PER_ELEMENT = 'BYTES_PER_ELEMENT';
  var PROTOTYPE = 'prototype';
  var ArrayProto = Array[PROTOTYPE];
  var $ArrayBuffer = $buffer.ArrayBuffer;
  var $DataView = $buffer.DataView;
  var arrayForEach = createArrayMethod(0);
  var arrayFilter = createArrayMethod(2);
  var arraySome = createArrayMethod(3);
  var arrayEvery = createArrayMethod(4);
  var arrayFind = createArrayMethod(5);
  var arrayFindIndex = createArrayMethod(6);
  var arrayIncludes = createArrayIncludes(true);
  var arrayIndexOf = createArrayIncludes(false);
  var arrayValues = ArrayIterators.values;
  var arrayKeys = ArrayIterators.keys;
  var arrayEntries = ArrayIterators.entries;
  var arrayLastIndexOf = ArrayProto.lastIndexOf;
  var arrayReduce = ArrayProto.reduce;
  var arrayReduceRight = ArrayProto.reduceRight;
  var arrayJoin = ArrayProto.join;
  var arraySort = ArrayProto.sort;
  var arraySlice = ArrayProto.slice;
  var arrayToString = ArrayProto.toString;
  var arrayToLocaleString = ArrayProto.toLocaleString;
  var ITERATOR = wks('iterator');
  var TAG = wks('toStringTag');
  var TYPED_CONSTRUCTOR = uid('typed_constructor');
  var DEF_CONSTRUCTOR = uid('def_constructor');
  var ALL_CONSTRUCTORS = $typed.CONSTR;
  var TYPED_ARRAY = $typed.TYPED;
  var VIEW = $typed.VIEW;
  var WRONG_LENGTH = 'Wrong length!';
  var $map = createArrayMethod(1, function (O, length) {
    return allocate(speciesConstructor(O, O[DEF_CONSTRUCTOR]), length);
  });
  var LITTLE_ENDIAN = fails(function () {
    // eslint-disable-next-line no-undef
    return new Uint8Array(new Uint16Array([1]).buffer)[0] === 1;
  });
  var FORCED_SET = !!Uint8Array && !!Uint8Array[PROTOTYPE].set && fails(function () {
    new Uint8Array(1).set({});
  });

  var toOffset = function toOffset(it, BYTES) {
    var offset = toInteger(it);
    if (offset < 0 || offset % BYTES) throw RangeError('Wrong offset!');
    return offset;
  };

  var validate = function validate(it) {
    if (isObject(it) && TYPED_ARRAY in it) return it;
    throw TypeError(it + ' is not a typed array!');
  };

  var allocate = function allocate(C, length) {
    if (!(isObject(C) && TYPED_CONSTRUCTOR in C)) {
      throw TypeError('It is not a typed array constructor!');
    }

    return new C(length);
  };

  var speciesFromList = function speciesFromList(O, list) {
    return fromList(speciesConstructor(O, O[DEF_CONSTRUCTOR]), list);
  };

  var fromList = function fromList(C, list) {
    var index = 0;
    var length = list.length;
    var result = allocate(C, length);

    while (length > index) {
      result[index] = list[index++];
    }

    return result;
  };

  var addGetter = function addGetter(it, key, internal) {
    dP(it, key, {
      get: function get() {
        return this._d[internal];
      }
    });
  };

  var $from = function from(source
  /* , mapfn, thisArg */
  ) {
    var O = toObject(source);
    var aLen = arguments.length;
    var mapfn = aLen > 1 ? arguments[1] : undefined;
    var mapping = mapfn !== undefined;
    var iterFn = getIterFn(O);
    var i, length, values, result, step, iterator;

    if (iterFn != undefined && !isArrayIter(iterFn)) {
      for (iterator = iterFn.call(O), values = [], i = 0; !(step = iterator.next()).done; i++) {
        values.push(step.value);
      }

      O = values;
    }

    if (mapping && aLen > 2) mapfn = ctx(mapfn, arguments[2], 2);

    for (i = 0, length = toLength(O.length), result = allocate(this, length); length > i; i++) {
      result[i] = mapping ? mapfn(O[i], i) : O[i];
    }

    return result;
  };

  var $of = function of()
  /* ...items */
  {
    var index = 0;
    var length = arguments.length;
    var result = allocate(this, length);

    while (length > index) {
      result[index] = arguments[index++];
    }

    return result;
  }; // iOS Safari 6.x fails here


  var TO_LOCALE_BUG = !!Uint8Array && fails(function () {
    arrayToLocaleString.call(new Uint8Array(1));
  });

  var $toLocaleString = function toLocaleString() {
    return arrayToLocaleString.apply(TO_LOCALE_BUG ? arraySlice.call(validate(this)) : validate(this), arguments);
  };

  var proto = {
    copyWithin: function copyWithin(target, start
    /* , end */
    ) {
      return arrayCopyWithin.call(validate(this), target, start, arguments.length > 2 ? arguments[2] : undefined);
    },
    every: function every(callbackfn
    /* , thisArg */
    ) {
      return arrayEvery(validate(this), callbackfn, arguments.length > 1 ? arguments[1] : undefined);
    },
    fill: function fill(value
    /* , start, end */
    ) {
      // eslint-disable-line no-unused-vars
      return arrayFill.apply(validate(this), arguments);
    },
    filter: function filter(callbackfn
    /* , thisArg */
    ) {
      return speciesFromList(this, arrayFilter(validate(this), callbackfn, arguments.length > 1 ? arguments[1] : undefined));
    },
    find: function find(predicate
    /* , thisArg */
    ) {
      return arrayFind(validate(this), predicate, arguments.length > 1 ? arguments[1] : undefined);
    },
    findIndex: function findIndex(predicate
    /* , thisArg */
    ) {
      return arrayFindIndex(validate(this), predicate, arguments.length > 1 ? arguments[1] : undefined);
    },
    forEach: function forEach(callbackfn
    /* , thisArg */
    ) {
      arrayForEach(validate(this), callbackfn, arguments.length > 1 ? arguments[1] : undefined);
    },
    indexOf: function indexOf(searchElement
    /* , fromIndex */
    ) {
      return arrayIndexOf(validate(this), searchElement, arguments.length > 1 ? arguments[1] : undefined);
    },
    includes: function includes(searchElement
    /* , fromIndex */
    ) {
      return arrayIncludes(validate(this), searchElement, arguments.length > 1 ? arguments[1] : undefined);
    },
    join: function join(separator) {
      // eslint-disable-line no-unused-vars
      return arrayJoin.apply(validate(this), arguments);
    },
    lastIndexOf: function lastIndexOf(searchElement
    /* , fromIndex */
    ) {
      // eslint-disable-line no-unused-vars
      return arrayLastIndexOf.apply(validate(this), arguments);
    },
    map: function map(mapfn
    /* , thisArg */
    ) {
      return $map(validate(this), mapfn, arguments.length > 1 ? arguments[1] : undefined);
    },
    reduce: function reduce(callbackfn
    /* , initialValue */
    ) {
      // eslint-disable-line no-unused-vars
      return arrayReduce.apply(validate(this), arguments);
    },
    reduceRight: function reduceRight(callbackfn
    /* , initialValue */
    ) {
      // eslint-disable-line no-unused-vars
      return arrayReduceRight.apply(validate(this), arguments);
    },
    reverse: function reverse() {
      var that = this;
      var length = validate(that).length;
      var middle = Math.floor(length / 2);
      var index = 0;
      var value;

      while (index < middle) {
        value = that[index];
        that[index++] = that[--length];
        that[length] = value;
      }

      return that;
    },
    some: function some(callbackfn
    /* , thisArg */
    ) {
      return arraySome(validate(this), callbackfn, arguments.length > 1 ? arguments[1] : undefined);
    },
    sort: function sort(comparefn) {
      return arraySort.call(validate(this), comparefn);
    },
    subarray: function subarray(begin, end) {
      var O = validate(this);
      var length = O.length;
      var $begin = toAbsoluteIndex(begin, length);
      return new (speciesConstructor(O, O[DEF_CONSTRUCTOR]))(O.buffer, O.byteOffset + $begin * O.BYTES_PER_ELEMENT, toLength((end === undefined ? length : toAbsoluteIndex(end, length)) - $begin));
    }
  };

  var $slice = function slice(start, end) {
    return speciesFromList(this, arraySlice.call(validate(this), start, end));
  };

  var $set = function set(arrayLike
  /* , offset */
  ) {
    validate(this);
    var offset = toOffset(arguments[1], 1);
    var length = this.length;
    var src = toObject(arrayLike);
    var len = toLength(src.length);
    var index = 0;
    if (len + offset > length) throw RangeError(WRONG_LENGTH);

    while (index < len) {
      this[offset + index] = src[index++];
    }
  };

  var $iterators = {
    entries: function entries() {
      return arrayEntries.call(validate(this));
    },
    keys: function keys() {
      return arrayKeys.call(validate(this));
    },
    values: function values() {
      return arrayValues.call(validate(this));
    }
  };

  var isTAIndex = function isTAIndex(target, key) {
    return isObject(target) && target[TYPED_ARRAY] && _typeof(key) != 'symbol' && key in target && String(+key) == String(key);
  };

  var $getDesc = function getOwnPropertyDescriptor(target, key) {
    return isTAIndex(target, key = toPrimitive(key, true)) ? propertyDesc(2, target[key]) : gOPD(target, key);
  };

  var $setDesc = function defineProperty(target, key, desc) {
    if (isTAIndex(target, key = toPrimitive(key, true)) && isObject(desc) && has(desc, 'value') && !has(desc, 'get') && !has(desc, 'set') // TODO: add validation descriptor w/o calling accessors
    && !desc.configurable && (!has(desc, 'writable') || desc.writable) && (!has(desc, 'enumerable') || desc.enumerable)) {
      target[key] = desc.value;
      return target;
    }

    return dP(target, key, desc);
  };

  if (!ALL_CONSTRUCTORS) {
    $GOPD.f = $getDesc;
    $DP.f = $setDesc;
  }

  $export($export.S + $export.F * !ALL_CONSTRUCTORS, 'Object', {
    getOwnPropertyDescriptor: $getDesc,
    defineProperty: $setDesc
  });

  if (fails(function () {
    arrayToString.call({});
  })) {
    arrayToString = arrayToLocaleString = function toString() {
      return arrayJoin.call(this);
    };
  }

  var $TypedArrayPrototype$ = redefineAll({}, proto);
  redefineAll($TypedArrayPrototype$, $iterators);
  hide($TypedArrayPrototype$, ITERATOR, $iterators.values);
  redefineAll($TypedArrayPrototype$, {
    slice: $slice,
    set: $set,
    constructor: function constructor() {
      /* noop */
    },
    toString: arrayToString,
    toLocaleString: $toLocaleString
  });
  addGetter($TypedArrayPrototype$, 'buffer', 'b');
  addGetter($TypedArrayPrototype$, 'byteOffset', 'o');
  addGetter($TypedArrayPrototype$, 'byteLength', 'l');
  addGetter($TypedArrayPrototype$, 'length', 'e');
  dP($TypedArrayPrototype$, TAG, {
    get: function get() {
      return this[TYPED_ARRAY];
    }
  }); // eslint-disable-next-line max-statements

  module.exports = function (KEY, BYTES, wrapper, CLAMPED) {
    CLAMPED = !!CLAMPED;
    var NAME = KEY + (CLAMPED ? 'Clamped' : '') + 'Array';
    var GETTER = 'get' + KEY;
    var SETTER = 'set' + KEY;
    var TypedArray = global[NAME];
    var Base = TypedArray || {};
    var TAC = TypedArray && getPrototypeOf(TypedArray);
    var FORCED = !TypedArray || !$typed.ABV;
    var O = {};
    var TypedArrayPrototype = TypedArray && TypedArray[PROTOTYPE];

    var getter = function getter(that, index) {
      var data = that._d;
      return data.v[GETTER](index * BYTES + data.o, LITTLE_ENDIAN);
    };

    var setter = function setter(that, index, value) {
      var data = that._d;
      if (CLAMPED) value = (value = Math.round(value)) < 0 ? 0 : value > 0xff ? 0xff : value & 0xff;
      data.v[SETTER](index * BYTES + data.o, value, LITTLE_ENDIAN);
    };

    var addElement = function addElement(that, index) {
      dP(that, index, {
        get: function get() {
          return getter(this, index);
        },
        set: function set(value) {
          return setter(this, index, value);
        },
        enumerable: true
      });
    };

    if (FORCED) {
      TypedArray = wrapper(function (that, data, $offset, $length) {
        anInstance(that, TypedArray, NAME, '_d');
        var index = 0;
        var offset = 0;
        var buffer, byteLength, length, klass;

        if (!isObject(data)) {
          length = toIndex(data);
          byteLength = length * BYTES;
          buffer = new $ArrayBuffer(byteLength);
        } else if (data instanceof $ArrayBuffer || (klass = classof(data)) == ARRAY_BUFFER || klass == SHARED_BUFFER) {
          buffer = data;
          offset = toOffset($offset, BYTES);
          var $len = data.byteLength;

          if ($length === undefined) {
            if ($len % BYTES) throw RangeError(WRONG_LENGTH);
            byteLength = $len - offset;
            if (byteLength < 0) throw RangeError(WRONG_LENGTH);
          } else {
            byteLength = toLength($length) * BYTES;
            if (byteLength + offset > $len) throw RangeError(WRONG_LENGTH);
          }

          length = byteLength / BYTES;
        } else if (TYPED_ARRAY in data) {
          return fromList(TypedArray, data);
        } else {
          return $from.call(TypedArray, data);
        }

        hide(that, '_d', {
          b: buffer,
          o: offset,
          l: byteLength,
          e: length,
          v: new $DataView(buffer)
        });

        while (index < length) {
          addElement(that, index++);
        }
      });
      TypedArrayPrototype = TypedArray[PROTOTYPE] = create($TypedArrayPrototype$);
      hide(TypedArrayPrototype, 'constructor', TypedArray);
    } else if (!fails(function () {
      TypedArray(1);
    }) || !fails(function () {
      new TypedArray(-1); // eslint-disable-line no-new
    }) || !$iterDetect(function (iter) {
      new TypedArray(); // eslint-disable-line no-new

      new TypedArray(null); // eslint-disable-line no-new

      new TypedArray(1.5); // eslint-disable-line no-new

      new TypedArray(iter); // eslint-disable-line no-new
    }, true)) {
      TypedArray = wrapper(function (that, data, $offset, $length) {
        anInstance(that, TypedArray, NAME);
        var klass; // `ws` module bug, temporarily remove validation length for Uint8Array
        // https://github.com/websockets/ws/pull/645

        if (!isObject(data)) return new Base(toIndex(data));

        if (data instanceof $ArrayBuffer || (klass = classof(data)) == ARRAY_BUFFER || klass == SHARED_BUFFER) {
          return $length !== undefined ? new Base(data, toOffset($offset, BYTES), $length) : $offset !== undefined ? new Base(data, toOffset($offset, BYTES)) : new Base(data);
        }

        if (TYPED_ARRAY in data) return fromList(TypedArray, data);
        return $from.call(TypedArray, data);
      });
      arrayForEach(TAC !== Function.prototype ? gOPN(Base).concat(gOPN(TAC)) : gOPN(Base), function (key) {
        if (!(key in TypedArray)) hide(TypedArray, key, Base[key]);
      });
      TypedArray[PROTOTYPE] = TypedArrayPrototype;
      if (!LIBRARY) TypedArrayPrototype.constructor = TypedArray;
    }

    var $nativeIterator = TypedArrayPrototype[ITERATOR];
    var CORRECT_ITER_NAME = !!$nativeIterator && ($nativeIterator.name == 'values' || $nativeIterator.name == undefined);
    var $iterator = $iterators.values;
    hide(TypedArray, TYPED_CONSTRUCTOR, true);
    hide(TypedArrayPrototype, TYPED_ARRAY, NAME);
    hide(TypedArrayPrototype, VIEW, true);
    hide(TypedArrayPrototype, DEF_CONSTRUCTOR, TypedArray);

    if (CLAMPED ? new TypedArray(1)[TAG] != NAME : !(TAG in TypedArrayPrototype)) {
      dP(TypedArrayPrototype, TAG, {
        get: function get() {
          return NAME;
        }
      });
    }

    O[NAME] = TypedArray;
    $export($export.G + $export.W + $export.F * (TypedArray != Base), O);
    $export($export.S, NAME, {
      BYTES_PER_ELEMENT: BYTES
    });
    $export($export.S + $export.F * fails(function () {
      Base.of.call(TypedArray, 1);
    }), NAME, {
      from: $from,
      of: $of
    });
    if (!(BYTES_PER_ELEMENT in TypedArrayPrototype)) hide(TypedArrayPrototype, BYTES_PER_ELEMENT, BYTES);
    $export($export.P, NAME, proto);
    setSpecies(NAME);
    $export($export.P + $export.F * FORCED_SET, NAME, {
      set: $set
    });
    $export($export.P + $export.F * !CORRECT_ITER_NAME, NAME, $iterators);
    if (!LIBRARY && TypedArrayPrototype.toString != arrayToString) TypedArrayPrototype.toString = arrayToString;
    $export($export.P + $export.F * fails(function () {
      new TypedArray(1).slice();
    }), NAME, {
      slice: $slice
    });
    $export($export.P + $export.F * (fails(function () {
      return [1, 2].toLocaleString() != new TypedArray([1, 2]).toLocaleString();
    }) || !fails(function () {
      TypedArrayPrototype.toLocaleString.call([1, 2]);
    })), NAME, {
      toLocaleString: $toLocaleString
    });
    Iterators[NAME] = CORRECT_ITER_NAME ? $nativeIterator : $iterator;
    if (!LIBRARY && !CORRECT_ITER_NAME) hide(TypedArrayPrototype, ITERATOR, $iterator);
  };
} else module.exports = function () {
  /* empty */
};

},{"./_an-instance":32,"./_array-copy-within":34,"./_array-fill":35,"./_array-includes":37,"./_array-methods":38,"./_classof":43,"./_ctx":51,"./_descriptors":55,"./_export":59,"./_fails":61,"./_global":66,"./_has":67,"./_hide":68,"./_is-array-iter":74,"./_is-object":77,"./_iter-detect":82,"./_iterators":84,"./_library":85,"./_object-create":96,"./_object-dp":97,"./_object-gopd":100,"./_object-gopn":102,"./_object-gpo":104,"./_property-desc":115,"./_redefine-all":116,"./_set-species":123,"./_species-constructor":127,"./_to-absolute-index":137,"./_to-index":138,"./_to-integer":139,"./_to-length":141,"./_to-object":142,"./_to-primitive":143,"./_typed":146,"./_typed-buffer":145,"./_uid":147,"./_wks":152,"./core.get-iterator-method":153,"./es6.array.iterator":165}],145:[function(require,module,exports){
'use strict';

var global = require('./_global');

var DESCRIPTORS = require('./_descriptors');

var LIBRARY = require('./_library');

var $typed = require('./_typed');

var hide = require('./_hide');

var redefineAll = require('./_redefine-all');

var fails = require('./_fails');

var anInstance = require('./_an-instance');

var toInteger = require('./_to-integer');

var toLength = require('./_to-length');

var toIndex = require('./_to-index');

var gOPN = require('./_object-gopn').f;

var dP = require('./_object-dp').f;

var arrayFill = require('./_array-fill');

var setToStringTag = require('./_set-to-string-tag');

var ARRAY_BUFFER = 'ArrayBuffer';
var DATA_VIEW = 'DataView';
var PROTOTYPE = 'prototype';
var WRONG_LENGTH = 'Wrong length!';
var WRONG_INDEX = 'Wrong index!';
var $ArrayBuffer = global[ARRAY_BUFFER];
var $DataView = global[DATA_VIEW];
var Math = global.Math;
var RangeError = global.RangeError; // eslint-disable-next-line no-shadow-restricted-names

var Infinity = global.Infinity;
var BaseBuffer = $ArrayBuffer;
var abs = Math.abs;
var pow = Math.pow;
var floor = Math.floor;
var log = Math.log;
var LN2 = Math.LN2;
var BUFFER = 'buffer';
var BYTE_LENGTH = 'byteLength';
var BYTE_OFFSET = 'byteOffset';
var $BUFFER = DESCRIPTORS ? '_b' : BUFFER;
var $LENGTH = DESCRIPTORS ? '_l' : BYTE_LENGTH;
var $OFFSET = DESCRIPTORS ? '_o' : BYTE_OFFSET; // IEEE754 conversions based on https://github.com/feross/ieee754

function packIEEE754(value, mLen, nBytes) {
  var buffer = new Array(nBytes);
  var eLen = nBytes * 8 - mLen - 1;
  var eMax = (1 << eLen) - 1;
  var eBias = eMax >> 1;
  var rt = mLen === 23 ? pow(2, -24) - pow(2, -77) : 0;
  var i = 0;
  var s = value < 0 || value === 0 && 1 / value < 0 ? 1 : 0;
  var e, m, c;
  value = abs(value); // eslint-disable-next-line no-self-compare

  if (value != value || value === Infinity) {
    // eslint-disable-next-line no-self-compare
    m = value != value ? 1 : 0;
    e = eMax;
  } else {
    e = floor(log(value) / LN2);

    if (value * (c = pow(2, -e)) < 1) {
      e--;
      c *= 2;
    }

    if (e + eBias >= 1) {
      value += rt / c;
    } else {
      value += rt * pow(2, 1 - eBias);
    }

    if (value * c >= 2) {
      e++;
      c /= 2;
    }

    if (e + eBias >= eMax) {
      m = 0;
      e = eMax;
    } else if (e + eBias >= 1) {
      m = (value * c - 1) * pow(2, mLen);
      e = e + eBias;
    } else {
      m = value * pow(2, eBias - 1) * pow(2, mLen);
      e = 0;
    }
  }

  for (; mLen >= 8; buffer[i++] = m & 255, m /= 256, mLen -= 8) {
    ;
  }

  e = e << mLen | m;
  eLen += mLen;

  for (; eLen > 0; buffer[i++] = e & 255, e /= 256, eLen -= 8) {
    ;
  }

  buffer[--i] |= s * 128;
  return buffer;
}

function unpackIEEE754(buffer, mLen, nBytes) {
  var eLen = nBytes * 8 - mLen - 1;
  var eMax = (1 << eLen) - 1;
  var eBias = eMax >> 1;
  var nBits = eLen - 7;
  var i = nBytes - 1;
  var s = buffer[i--];
  var e = s & 127;
  var m;
  s >>= 7;

  for (; nBits > 0; e = e * 256 + buffer[i], i--, nBits -= 8) {
    ;
  }

  m = e & (1 << -nBits) - 1;
  e >>= -nBits;
  nBits += mLen;

  for (; nBits > 0; m = m * 256 + buffer[i], i--, nBits -= 8) {
    ;
  }

  if (e === 0) {
    e = 1 - eBias;
  } else if (e === eMax) {
    return m ? NaN : s ? -Infinity : Infinity;
  } else {
    m = m + pow(2, mLen);
    e = e - eBias;
  }

  return (s ? -1 : 1) * m * pow(2, e - mLen);
}

function unpackI32(bytes) {
  return bytes[3] << 24 | bytes[2] << 16 | bytes[1] << 8 | bytes[0];
}

function packI8(it) {
  return [it & 0xff];
}

function packI16(it) {
  return [it & 0xff, it >> 8 & 0xff];
}

function packI32(it) {
  return [it & 0xff, it >> 8 & 0xff, it >> 16 & 0xff, it >> 24 & 0xff];
}

function packF64(it) {
  return packIEEE754(it, 52, 8);
}

function packF32(it) {
  return packIEEE754(it, 23, 4);
}

function addGetter(C, key, internal) {
  dP(C[PROTOTYPE], key, {
    get: function get() {
      return this[internal];
    }
  });
}

function get(view, bytes, index, isLittleEndian) {
  var numIndex = +index;
  var intIndex = toIndex(numIndex);
  if (intIndex + bytes > view[$LENGTH]) throw RangeError(WRONG_INDEX);
  var store = view[$BUFFER]._b;
  var start = intIndex + view[$OFFSET];
  var pack = store.slice(start, start + bytes);
  return isLittleEndian ? pack : pack.reverse();
}

function set(view, bytes, index, conversion, value, isLittleEndian) {
  var numIndex = +index;
  var intIndex = toIndex(numIndex);
  if (intIndex + bytes > view[$LENGTH]) throw RangeError(WRONG_INDEX);
  var store = view[$BUFFER]._b;
  var start = intIndex + view[$OFFSET];
  var pack = conversion(+value);

  for (var i = 0; i < bytes; i++) {
    store[start + i] = pack[isLittleEndian ? i : bytes - i - 1];
  }
}

if (!$typed.ABV) {
  $ArrayBuffer = function ArrayBuffer(length) {
    anInstance(this, $ArrayBuffer, ARRAY_BUFFER);
    var byteLength = toIndex(length);
    this._b = arrayFill.call(new Array(byteLength), 0);
    this[$LENGTH] = byteLength;
  };

  $DataView = function DataView(buffer, byteOffset, byteLength) {
    anInstance(this, $DataView, DATA_VIEW);
    anInstance(buffer, $ArrayBuffer, DATA_VIEW);
    var bufferLength = buffer[$LENGTH];
    var offset = toInteger(byteOffset);
    if (offset < 0 || offset > bufferLength) throw RangeError('Wrong offset!');
    byteLength = byteLength === undefined ? bufferLength - offset : toLength(byteLength);
    if (offset + byteLength > bufferLength) throw RangeError(WRONG_LENGTH);
    this[$BUFFER] = buffer;
    this[$OFFSET] = offset;
    this[$LENGTH] = byteLength;
  };

  if (DESCRIPTORS) {
    addGetter($ArrayBuffer, BYTE_LENGTH, '_l');
    addGetter($DataView, BUFFER, '_b');
    addGetter($DataView, BYTE_LENGTH, '_l');
    addGetter($DataView, BYTE_OFFSET, '_o');
  }

  redefineAll($DataView[PROTOTYPE], {
    getInt8: function getInt8(byteOffset) {
      return get(this, 1, byteOffset)[0] << 24 >> 24;
    },
    getUint8: function getUint8(byteOffset) {
      return get(this, 1, byteOffset)[0];
    },
    getInt16: function getInt16(byteOffset
    /* , littleEndian */
    ) {
      var bytes = get(this, 2, byteOffset, arguments[1]);
      return (bytes[1] << 8 | bytes[0]) << 16 >> 16;
    },
    getUint16: function getUint16(byteOffset
    /* , littleEndian */
    ) {
      var bytes = get(this, 2, byteOffset, arguments[1]);
      return bytes[1] << 8 | bytes[0];
    },
    getInt32: function getInt32(byteOffset
    /* , littleEndian */
    ) {
      return unpackI32(get(this, 4, byteOffset, arguments[1]));
    },
    getUint32: function getUint32(byteOffset
    /* , littleEndian */
    ) {
      return unpackI32(get(this, 4, byteOffset, arguments[1])) >>> 0;
    },
    getFloat32: function getFloat32(byteOffset
    /* , littleEndian */
    ) {
      return unpackIEEE754(get(this, 4, byteOffset, arguments[1]), 23, 4);
    },
    getFloat64: function getFloat64(byteOffset
    /* , littleEndian */
    ) {
      return unpackIEEE754(get(this, 8, byteOffset, arguments[1]), 52, 8);
    },
    setInt8: function setInt8(byteOffset, value) {
      set(this, 1, byteOffset, packI8, value);
    },
    setUint8: function setUint8(byteOffset, value) {
      set(this, 1, byteOffset, packI8, value);
    },
    setInt16: function setInt16(byteOffset, value
    /* , littleEndian */
    ) {
      set(this, 2, byteOffset, packI16, value, arguments[2]);
    },
    setUint16: function setUint16(byteOffset, value
    /* , littleEndian */
    ) {
      set(this, 2, byteOffset, packI16, value, arguments[2]);
    },
    setInt32: function setInt32(byteOffset, value
    /* , littleEndian */
    ) {
      set(this, 4, byteOffset, packI32, value, arguments[2]);
    },
    setUint32: function setUint32(byteOffset, value
    /* , littleEndian */
    ) {
      set(this, 4, byteOffset, packI32, value, arguments[2]);
    },
    setFloat32: function setFloat32(byteOffset, value
    /* , littleEndian */
    ) {
      set(this, 4, byteOffset, packF32, value, arguments[2]);
    },
    setFloat64: function setFloat64(byteOffset, value
    /* , littleEndian */
    ) {
      set(this, 8, byteOffset, packF64, value, arguments[2]);
    }
  });
} else {
  if (!fails(function () {
    $ArrayBuffer(1);
  }) || !fails(function () {
    new $ArrayBuffer(-1); // eslint-disable-line no-new
  }) || fails(function () {
    new $ArrayBuffer(); // eslint-disable-line no-new

    new $ArrayBuffer(1.5); // eslint-disable-line no-new

    new $ArrayBuffer(NaN); // eslint-disable-line no-new

    return $ArrayBuffer.name != ARRAY_BUFFER;
  })) {
    $ArrayBuffer = function ArrayBuffer(length) {
      anInstance(this, $ArrayBuffer);
      return new BaseBuffer(toIndex(length));
    };

    var ArrayBufferProto = $ArrayBuffer[PROTOTYPE] = BaseBuffer[PROTOTYPE];

    for (var keys = gOPN(BaseBuffer), j = 0, key; keys.length > j;) {
      if (!((key = keys[j++]) in $ArrayBuffer)) hide($ArrayBuffer, key, BaseBuffer[key]);
    }

    if (!LIBRARY) ArrayBufferProto.constructor = $ArrayBuffer;
  } // iOS Safari 7.x bug


  var view = new $DataView(new $ArrayBuffer(2));
  var $setInt8 = $DataView[PROTOTYPE].setInt8;
  view.setInt8(0, 2147483648);
  view.setInt8(1, 2147483649);
  if (view.getInt8(0) || !view.getInt8(1)) redefineAll($DataView[PROTOTYPE], {
    setInt8: function setInt8(byteOffset, value) {
      $setInt8.call(this, byteOffset, value << 24 >> 24);
    },
    setUint8: function setUint8(byteOffset, value) {
      $setInt8.call(this, byteOffset, value << 24 >> 24);
    }
  }, true);
}

setToStringTag($ArrayBuffer, ARRAY_BUFFER);
setToStringTag($DataView, DATA_VIEW);
hide($DataView[PROTOTYPE], $typed.VIEW, true);
exports[ARRAY_BUFFER] = $ArrayBuffer;
exports[DATA_VIEW] = $DataView;

},{"./_an-instance":32,"./_array-fill":35,"./_descriptors":55,"./_fails":61,"./_global":66,"./_hide":68,"./_library":85,"./_object-dp":97,"./_object-gopn":102,"./_redefine-all":116,"./_set-to-string-tag":124,"./_to-index":138,"./_to-integer":139,"./_to-length":141,"./_typed":146}],146:[function(require,module,exports){
"use strict";

var global = require('./_global');

var hide = require('./_hide');

var uid = require('./_uid');

var TYPED = uid('typed_array');
var VIEW = uid('view');
var ABV = !!(global.ArrayBuffer && global.DataView);
var CONSTR = ABV;
var i = 0;
var l = 9;
var Typed;
var TypedArrayConstructors = 'Int8Array,Uint8Array,Uint8ClampedArray,Int16Array,Uint16Array,Int32Array,Uint32Array,Float32Array,Float64Array'.split(',');

while (i < l) {
  if (Typed = global[TypedArrayConstructors[i++]]) {
    hide(Typed.prototype, TYPED, true);
    hide(Typed.prototype, VIEW, true);
  } else CONSTR = false;
}

module.exports = {
  ABV: ABV,
  CONSTR: CONSTR,
  TYPED: TYPED,
  VIEW: VIEW
};

},{"./_global":66,"./_hide":68,"./_uid":147}],147:[function(require,module,exports){
"use strict";

var id = 0;
var px = Math.random();

module.exports = function (key) {
  return 'Symbol('.concat(key === undefined ? '' : key, ')_', (++id + px).toString(36));
};

},{}],148:[function(require,module,exports){
"use strict";

var global = require('./_global');

var navigator = global.navigator;
module.exports = navigator && navigator.userAgent || '';

},{"./_global":66}],149:[function(require,module,exports){
"use strict";

var isObject = require('./_is-object');

module.exports = function (it, TYPE) {
  if (!isObject(it) || it._t !== TYPE) throw TypeError('Incompatible receiver, ' + TYPE + ' required!');
  return it;
};

},{"./_is-object":77}],150:[function(require,module,exports){
"use strict";

var global = require('./_global');

var core = require('./_core');

var LIBRARY = require('./_library');

var wksExt = require('./_wks-ext');

var defineProperty = require('./_object-dp').f;

module.exports = function (name) {
  var $Symbol = core.Symbol || (core.Symbol = LIBRARY ? {} : global.Symbol || {});
  if (name.charAt(0) != '_' && !(name in $Symbol)) defineProperty($Symbol, name, {
    value: wksExt.f(name)
  });
};

},{"./_core":49,"./_global":66,"./_library":85,"./_object-dp":97,"./_wks-ext":151}],151:[function(require,module,exports){
"use strict";

exports.f = require('./_wks');

},{"./_wks":152}],152:[function(require,module,exports){
"use strict";

var store = require('./_shared')('wks');

var uid = require('./_uid');

var _Symbol = require('./_global').Symbol;

var USE_SYMBOL = typeof _Symbol == 'function';

var $exports = module.exports = function (name) {
  return store[name] || (store[name] = USE_SYMBOL && _Symbol[name] || (USE_SYMBOL ? _Symbol : uid)('Symbol.' + name));
};

$exports.store = store;

},{"./_global":66,"./_shared":126,"./_uid":147}],153:[function(require,module,exports){
"use strict";

var classof = require('./_classof');

var ITERATOR = require('./_wks')('iterator');

var Iterators = require('./_iterators');

module.exports = require('./_core').getIteratorMethod = function (it) {
  if (it != undefined) return it[ITERATOR] || it['@@iterator'] || Iterators[classof(it)];
};

},{"./_classof":43,"./_core":49,"./_iterators":84,"./_wks":152}],154:[function(require,module,exports){
"use strict";

// https://github.com/benjamingr/RexExp.escape
var $export = require('./_export');

var $re = require('./_replacer')(/[\\^$*+?.()|[\]{}]/g, '\\$&');

$export($export.S, 'RegExp', {
  escape: function escape(it) {
    return $re(it);
  }
});

},{"./_export":59,"./_replacer":118}],155:[function(require,module,exports){
"use strict";

// 22.1.3.3 Array.prototype.copyWithin(target, start, end = this.length)
var $export = require('./_export');

$export($export.P, 'Array', {
  copyWithin: require('./_array-copy-within')
});

require('./_add-to-unscopables')('copyWithin');

},{"./_add-to-unscopables":31,"./_array-copy-within":34,"./_export":59}],156:[function(require,module,exports){
'use strict';

var $export = require('./_export');

var $every = require('./_array-methods')(4);

$export($export.P + $export.F * !require('./_strict-method')([].every, true), 'Array', {
  // 22.1.3.5 / 15.4.4.16 Array.prototype.every(callbackfn [, thisArg])
  every: function every(callbackfn
  /* , thisArg */
  ) {
    return $every(this, callbackfn, arguments[1]);
  }
});

},{"./_array-methods":38,"./_export":59,"./_strict-method":128}],157:[function(require,module,exports){
"use strict";

// 22.1.3.6 Array.prototype.fill(value, start = 0, end = this.length)
var $export = require('./_export');

$export($export.P, 'Array', {
  fill: require('./_array-fill')
});

require('./_add-to-unscopables')('fill');

},{"./_add-to-unscopables":31,"./_array-fill":35,"./_export":59}],158:[function(require,module,exports){
'use strict';

var $export = require('./_export');

var $filter = require('./_array-methods')(2);

$export($export.P + $export.F * !require('./_strict-method')([].filter, true), 'Array', {
  // 22.1.3.7 / 15.4.4.20 Array.prototype.filter(callbackfn [, thisArg])
  filter: function filter(callbackfn
  /* , thisArg */
  ) {
    return $filter(this, callbackfn, arguments[1]);
  }
});

},{"./_array-methods":38,"./_export":59,"./_strict-method":128}],159:[function(require,module,exports){
'use strict'; // 22.1.3.9 Array.prototype.findIndex(predicate, thisArg = undefined)

var $export = require('./_export');

var $find = require('./_array-methods')(6);

var KEY = 'findIndex';
var forced = true; // Shouldn't skip holes

if (KEY in []) Array(1)[KEY](function () {
  forced = false;
});
$export($export.P + $export.F * forced, 'Array', {
  findIndex: function findIndex(callbackfn
  /* , that = undefined */
  ) {
    return $find(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);
  }
});

require('./_add-to-unscopables')(KEY);

},{"./_add-to-unscopables":31,"./_array-methods":38,"./_export":59}],160:[function(require,module,exports){
'use strict'; // 22.1.3.8 Array.prototype.find(predicate, thisArg = undefined)

var $export = require('./_export');

var $find = require('./_array-methods')(5);

var KEY = 'find';
var forced = true; // Shouldn't skip holes

if (KEY in []) Array(1)[KEY](function () {
  forced = false;
});
$export($export.P + $export.F * forced, 'Array', {
  find: function find(callbackfn
  /* , that = undefined */
  ) {
    return $find(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);
  }
});

require('./_add-to-unscopables')(KEY);

},{"./_add-to-unscopables":31,"./_array-methods":38,"./_export":59}],161:[function(require,module,exports){
'use strict';

var $export = require('./_export');

var $forEach = require('./_array-methods')(0);

var STRICT = require('./_strict-method')([].forEach, true);

$export($export.P + $export.F * !STRICT, 'Array', {
  // 22.1.3.10 / 15.4.4.18 Array.prototype.forEach(callbackfn [, thisArg])
  forEach: function forEach(callbackfn
  /* , thisArg */
  ) {
    return $forEach(this, callbackfn, arguments[1]);
  }
});

},{"./_array-methods":38,"./_export":59,"./_strict-method":128}],162:[function(require,module,exports){
'use strict';

var ctx = require('./_ctx');

var $export = require('./_export');

var toObject = require('./_to-object');

var call = require('./_iter-call');

var isArrayIter = require('./_is-array-iter');

var toLength = require('./_to-length');

var createProperty = require('./_create-property');

var getIterFn = require('./core.get-iterator-method');

$export($export.S + $export.F * !require('./_iter-detect')(function (iter) {
  Array.from(iter);
}), 'Array', {
  // 22.1.2.1 Array.from(arrayLike, mapfn = undefined, thisArg = undefined)
  from: function from(arrayLike
  /* , mapfn = undefined, thisArg = undefined */
  ) {
    var O = toObject(arrayLike);
    var C = typeof this == 'function' ? this : Array;
    var aLen = arguments.length;
    var mapfn = aLen > 1 ? arguments[1] : undefined;
    var mapping = mapfn !== undefined;
    var index = 0;
    var iterFn = getIterFn(O);
    var length, result, step, iterator;
    if (mapping) mapfn = ctx(mapfn, aLen > 2 ? arguments[2] : undefined, 2); // if object isn't iterable or it's array with default iterator - use simple case

    if (iterFn != undefined && !(C == Array && isArrayIter(iterFn))) {
      for (iterator = iterFn.call(O), result = new C(); !(step = iterator.next()).done; index++) {
        createProperty(result, index, mapping ? call(iterator, mapfn, [step.value, index], true) : step.value);
      }
    } else {
      length = toLength(O.length);

      for (result = new C(length); length > index; index++) {
        createProperty(result, index, mapping ? mapfn(O[index], index) : O[index]);
      }
    }

    result.length = index;
    return result;
  }
});

},{"./_create-property":50,"./_ctx":51,"./_export":59,"./_is-array-iter":74,"./_iter-call":79,"./_iter-detect":82,"./_to-length":141,"./_to-object":142,"./core.get-iterator-method":153}],163:[function(require,module,exports){
'use strict';

var $export = require('./_export');

var $indexOf = require('./_array-includes')(false);

var $native = [].indexOf;
var NEGATIVE_ZERO = !!$native && 1 / [1].indexOf(1, -0) < 0;
$export($export.P + $export.F * (NEGATIVE_ZERO || !require('./_strict-method')($native)), 'Array', {
  // 22.1.3.11 / 15.4.4.14 Array.prototype.indexOf(searchElement [, fromIndex])
  indexOf: function indexOf(searchElement
  /* , fromIndex = 0 */
  ) {
    return NEGATIVE_ZERO // convert -0 to +0
    ? $native.apply(this, arguments) || 0 : $indexOf(this, searchElement, arguments[1]);
  }
});

},{"./_array-includes":37,"./_export":59,"./_strict-method":128}],164:[function(require,module,exports){
"use strict";

// 22.1.2.2 / 15.4.3.2 Array.isArray(arg)
var $export = require('./_export');

$export($export.S, 'Array', {
  isArray: require('./_is-array')
});

},{"./_export":59,"./_is-array":75}],165:[function(require,module,exports){
'use strict';

var addToUnscopables = require('./_add-to-unscopables');

var step = require('./_iter-step');

var Iterators = require('./_iterators');

var toIObject = require('./_to-iobject'); // 22.1.3.4 Array.prototype.entries()
// 22.1.3.13 Array.prototype.keys()
// 22.1.3.29 Array.prototype.values()
// 22.1.3.30 Array.prototype[@@iterator]()


module.exports = require('./_iter-define')(Array, 'Array', function (iterated, kind) {
  this._t = toIObject(iterated); // target

  this._i = 0; // next index

  this._k = kind; // kind
  // 22.1.5.2.1 %ArrayIteratorPrototype%.next()
}, function () {
  var O = this._t;
  var kind = this._k;
  var index = this._i++;

  if (!O || index >= O.length) {
    this._t = undefined;
    return step(1);
  }

  if (kind == 'keys') return step(0, index);
  if (kind == 'values') return step(0, O[index]);
  return step(0, [index, O[index]]);
}, 'values'); // argumentsList[@@iterator] is %ArrayProto_values% (9.4.4.6, 9.4.4.7)

Iterators.Arguments = Iterators.Array;
addToUnscopables('keys');
addToUnscopables('values');
addToUnscopables('entries');

},{"./_add-to-unscopables":31,"./_iter-define":81,"./_iter-step":83,"./_iterators":84,"./_to-iobject":140}],166:[function(require,module,exports){
'use strict'; // 22.1.3.13 Array.prototype.join(separator)

var $export = require('./_export');

var toIObject = require('./_to-iobject');

var arrayJoin = [].join; // fallback for not array-like strings

$export($export.P + $export.F * (require('./_iobject') != Object || !require('./_strict-method')(arrayJoin)), 'Array', {
  join: function join(separator) {
    return arrayJoin.call(toIObject(this), separator === undefined ? ',' : separator);
  }
});

},{"./_export":59,"./_iobject":73,"./_strict-method":128,"./_to-iobject":140}],167:[function(require,module,exports){
'use strict';

var $export = require('./_export');

var toIObject = require('./_to-iobject');

var toInteger = require('./_to-integer');

var toLength = require('./_to-length');

var $native = [].lastIndexOf;
var NEGATIVE_ZERO = !!$native && 1 / [1].lastIndexOf(1, -0) < 0;
$export($export.P + $export.F * (NEGATIVE_ZERO || !require('./_strict-method')($native)), 'Array', {
  // 22.1.3.14 / 15.4.4.15 Array.prototype.lastIndexOf(searchElement [, fromIndex])
  lastIndexOf: function lastIndexOf(searchElement
  /* , fromIndex = @[*-1] */
  ) {
    // convert -0 to +0
    if (NEGATIVE_ZERO) return $native.apply(this, arguments) || 0;
    var O = toIObject(this);
    var length = toLength(O.length);
    var index = length - 1;
    if (arguments.length > 1) index = Math.min(index, toInteger(arguments[1]));
    if (index < 0) index = length + index;

    for (; index >= 0; index--) {
      if (index in O) if (O[index] === searchElement) return index || 0;
    }

    return -1;
  }
});

},{"./_export":59,"./_strict-method":128,"./_to-integer":139,"./_to-iobject":140,"./_to-length":141}],168:[function(require,module,exports){
'use strict';

var $export = require('./_export');

var $map = require('./_array-methods')(1);

$export($export.P + $export.F * !require('./_strict-method')([].map, true), 'Array', {
  // 22.1.3.15 / 15.4.4.19 Array.prototype.map(callbackfn [, thisArg])
  map: function map(callbackfn
  /* , thisArg */
  ) {
    return $map(this, callbackfn, arguments[1]);
  }
});

},{"./_array-methods":38,"./_export":59,"./_strict-method":128}],169:[function(require,module,exports){
'use strict';

var $export = require('./_export');

var createProperty = require('./_create-property'); // WebKit Array.of isn't generic


$export($export.S + $export.F * require('./_fails')(function () {
  function F() {
    /* empty */
  }

  return !(Array.of.call(F) instanceof F);
}), 'Array', {
  // 22.1.2.3 Array.of( ...items)
  of: function of()
  /* ...args */
  {
    var index = 0;
    var aLen = arguments.length;
    var result = new (typeof this == 'function' ? this : Array)(aLen);

    while (aLen > index) {
      createProperty(result, index, arguments[index++]);
    }

    result.length = aLen;
    return result;
  }
});

},{"./_create-property":50,"./_export":59,"./_fails":61}],170:[function(require,module,exports){
'use strict';

var $export = require('./_export');

var $reduce = require('./_array-reduce');

$export($export.P + $export.F * !require('./_strict-method')([].reduceRight, true), 'Array', {
  // 22.1.3.19 / 15.4.4.22 Array.prototype.reduceRight(callbackfn [, initialValue])
  reduceRight: function reduceRight(callbackfn
  /* , initialValue */
  ) {
    return $reduce(this, callbackfn, arguments.length, arguments[1], true);
  }
});

},{"./_array-reduce":39,"./_export":59,"./_strict-method":128}],171:[function(require,module,exports){
'use strict';

var $export = require('./_export');

var $reduce = require('./_array-reduce');

$export($export.P + $export.F * !require('./_strict-method')([].reduce, true), 'Array', {
  // 22.1.3.18 / 15.4.4.21 Array.prototype.reduce(callbackfn [, initialValue])
  reduce: function reduce(callbackfn
  /* , initialValue */
  ) {
    return $reduce(this, callbackfn, arguments.length, arguments[1], false);
  }
});

},{"./_array-reduce":39,"./_export":59,"./_strict-method":128}],172:[function(require,module,exports){
'use strict';

var $export = require('./_export');

var html = require('./_html');

var cof = require('./_cof');

var toAbsoluteIndex = require('./_to-absolute-index');

var toLength = require('./_to-length');

var arraySlice = [].slice; // fallback for not array-like ES3 strings and DOM objects

$export($export.P + $export.F * require('./_fails')(function () {
  if (html) arraySlice.call(html);
}), 'Array', {
  slice: function slice(begin, end) {
    var len = toLength(this.length);
    var klass = cof(this);
    end = end === undefined ? len : end;
    if (klass == 'Array') return arraySlice.call(this, begin, end);
    var start = toAbsoluteIndex(begin, len);
    var upTo = toAbsoluteIndex(end, len);
    var size = toLength(upTo - start);
    var cloned = new Array(size);
    var i = 0;

    for (; i < size; i++) {
      cloned[i] = klass == 'String' ? this.charAt(start + i) : this[start + i];
    }

    return cloned;
  }
});

},{"./_cof":44,"./_export":59,"./_fails":61,"./_html":69,"./_to-absolute-index":137,"./_to-length":141}],173:[function(require,module,exports){
'use strict';

var $export = require('./_export');

var $some = require('./_array-methods')(3);

$export($export.P + $export.F * !require('./_strict-method')([].some, true), 'Array', {
  // 22.1.3.23 / 15.4.4.17 Array.prototype.some(callbackfn [, thisArg])
  some: function some(callbackfn
  /* , thisArg */
  ) {
    return $some(this, callbackfn, arguments[1]);
  }
});

},{"./_array-methods":38,"./_export":59,"./_strict-method":128}],174:[function(require,module,exports){
'use strict';

var $export = require('./_export');

var aFunction = require('./_a-function');

var toObject = require('./_to-object');

var fails = require('./_fails');

var $sort = [].sort;
var test = [1, 2, 3];
$export($export.P + $export.F * (fails(function () {
  // IE8-
  test.sort(undefined);
}) || !fails(function () {
  // V8 bug
  test.sort(null); // Old WebKit
}) || !require('./_strict-method')($sort)), 'Array', {
  // 22.1.3.25 Array.prototype.sort(comparefn)
  sort: function sort(comparefn) {
    return comparefn === undefined ? $sort.call(toObject(this)) : $sort.call(toObject(this), aFunction(comparefn));
  }
});

},{"./_a-function":29,"./_export":59,"./_fails":61,"./_strict-method":128,"./_to-object":142}],175:[function(require,module,exports){
"use strict";

require('./_set-species')('Array');

},{"./_set-species":123}],176:[function(require,module,exports){
"use strict";

// 20.3.3.1 / 15.9.4.4 Date.now()
var $export = require('./_export');

$export($export.S, 'Date', {
  now: function now() {
    return new Date().getTime();
  }
});

},{"./_export":59}],177:[function(require,module,exports){
"use strict";

// 20.3.4.36 / 15.9.5.43 Date.prototype.toISOString()
var $export = require('./_export');

var toISOString = require('./_date-to-iso-string'); // PhantomJS / old WebKit has a broken implementations


$export($export.P + $export.F * (Date.prototype.toISOString !== toISOString), 'Date', {
  toISOString: toISOString
});

},{"./_date-to-iso-string":52,"./_export":59}],178:[function(require,module,exports){
'use strict';

var $export = require('./_export');

var toObject = require('./_to-object');

var toPrimitive = require('./_to-primitive');

$export($export.P + $export.F * require('./_fails')(function () {
  return new Date(NaN).toJSON() !== null || Date.prototype.toJSON.call({
    toISOString: function toISOString() {
      return 1;
    }
  }) !== 1;
}), 'Date', {
  // eslint-disable-next-line no-unused-vars
  toJSON: function toJSON(key) {
    var O = toObject(this);
    var pv = toPrimitive(O);
    return typeof pv == 'number' && !isFinite(pv) ? null : O.toISOString();
  }
});

},{"./_export":59,"./_fails":61,"./_to-object":142,"./_to-primitive":143}],179:[function(require,module,exports){
"use strict";

var TO_PRIMITIVE = require('./_wks')('toPrimitive');

var proto = Date.prototype;
if (!(TO_PRIMITIVE in proto)) require('./_hide')(proto, TO_PRIMITIVE, require('./_date-to-primitive'));

},{"./_date-to-primitive":53,"./_hide":68,"./_wks":152}],180:[function(require,module,exports){
"use strict";

var DateProto = Date.prototype;
var INVALID_DATE = 'Invalid Date';
var TO_STRING = 'toString';
var $toString = DateProto[TO_STRING];
var getTime = DateProto.getTime;

if (new Date(NaN) + '' != INVALID_DATE) {
  require('./_redefine')(DateProto, TO_STRING, function toString() {
    var value = getTime.call(this); // eslint-disable-next-line no-self-compare

    return value === value ? $toString.call(this) : INVALID_DATE;
  });
}

},{"./_redefine":117}],181:[function(require,module,exports){
"use strict";

// 19.2.3.2 / 15.3.4.5 Function.prototype.bind(thisArg, args...)
var $export = require('./_export');

$export($export.P, 'Function', {
  bind: require('./_bind')
});

},{"./_bind":42,"./_export":59}],182:[function(require,module,exports){
'use strict';

var isObject = require('./_is-object');

var getPrototypeOf = require('./_object-gpo');

var HAS_INSTANCE = require('./_wks')('hasInstance');

var FunctionProto = Function.prototype; // 19.2.3.6 Function.prototype[@@hasInstance](V)

if (!(HAS_INSTANCE in FunctionProto)) require('./_object-dp').f(FunctionProto, HAS_INSTANCE, {
  value: function value(O) {
    if (typeof this != 'function' || !isObject(O)) return false;
    if (!isObject(this.prototype)) return O instanceof this; // for environment w/o native `@@hasInstance` logic enough `instanceof`, but add this:

    while (O = getPrototypeOf(O)) {
      if (this.prototype === O) return true;
    }

    return false;
  }
});

},{"./_is-object":77,"./_object-dp":97,"./_object-gpo":104,"./_wks":152}],183:[function(require,module,exports){
"use strict";

var dP = require('./_object-dp').f;

var FProto = Function.prototype;
var nameRE = /^\s*function ([^ (]*)/;
var NAME = 'name'; // 19.2.4.2 name

NAME in FProto || require('./_descriptors') && dP(FProto, NAME, {
  configurable: true,
  get: function get() {
    try {
      return ('' + this).match(nameRE)[1];
    } catch (e) {
      return '';
    }
  }
});

},{"./_descriptors":55,"./_object-dp":97}],184:[function(require,module,exports){
'use strict';

var strong = require('./_collection-strong');

var validate = require('./_validate-collection');

var MAP = 'Map'; // 23.1 Map Objects

module.exports = require('./_collection')(MAP, function (get) {
  return function Map() {
    return get(this, arguments.length > 0 ? arguments[0] : undefined);
  };
}, {
  // 23.1.3.6 Map.prototype.get(key)
  get: function get(key) {
    var entry = strong.getEntry(validate(this, MAP), key);
    return entry && entry.v;
  },
  // 23.1.3.9 Map.prototype.set(key, value)
  set: function set(key, value) {
    return strong.def(validate(this, MAP), key === 0 ? 0 : key, value);
  }
}, strong, true);

},{"./_collection":48,"./_collection-strong":45,"./_validate-collection":149}],185:[function(require,module,exports){
"use strict";

// 20.2.2.3 Math.acosh(x)
var $export = require('./_export');

var log1p = require('./_math-log1p');

var sqrt = Math.sqrt;
var $acosh = Math.acosh;
$export($export.S + $export.F * !($acosh // V8 bug: https://code.google.com/p/v8/issues/detail?id=3509
&& Math.floor($acosh(Number.MAX_VALUE)) == 710 // Tor Browser bug: Math.acosh(Infinity) -> NaN
&& $acosh(Infinity) == Infinity), 'Math', {
  acosh: function acosh(x) {
    return (x = +x) < 1 ? NaN : x > 94906265.62425156 ? Math.log(x) + Math.LN2 : log1p(x - 1 + sqrt(x - 1) * sqrt(x + 1));
  }
});

},{"./_export":59,"./_math-log1p":88}],186:[function(require,module,exports){
"use strict";

// 20.2.2.5 Math.asinh(x)
var $export = require('./_export');

var $asinh = Math.asinh;

function asinh(x) {
  return !isFinite(x = +x) || x == 0 ? x : x < 0 ? -asinh(-x) : Math.log(x + Math.sqrt(x * x + 1));
} // Tor Browser bug: Math.asinh(0) -> -0


$export($export.S + $export.F * !($asinh && 1 / $asinh(0) > 0), 'Math', {
  asinh: asinh
});

},{"./_export":59}],187:[function(require,module,exports){
"use strict";

// 20.2.2.7 Math.atanh(x)
var $export = require('./_export');

var $atanh = Math.atanh; // Tor Browser bug: Math.atanh(-0) -> 0

$export($export.S + $export.F * !($atanh && 1 / $atanh(-0) < 0), 'Math', {
  atanh: function atanh(x) {
    return (x = +x) == 0 ? x : Math.log((1 + x) / (1 - x)) / 2;
  }
});

},{"./_export":59}],188:[function(require,module,exports){
"use strict";

// 20.2.2.9 Math.cbrt(x)
var $export = require('./_export');

var sign = require('./_math-sign');

$export($export.S, 'Math', {
  cbrt: function cbrt(x) {
    return sign(x = +x) * Math.pow(Math.abs(x), 1 / 3);
  }
});

},{"./_export":59,"./_math-sign":90}],189:[function(require,module,exports){
"use strict";

// 20.2.2.11 Math.clz32(x)
var $export = require('./_export');

$export($export.S, 'Math', {
  clz32: function clz32(x) {
    return (x >>>= 0) ? 31 - Math.floor(Math.log(x + 0.5) * Math.LOG2E) : 32;
  }
});

},{"./_export":59}],190:[function(require,module,exports){
"use strict";

// 20.2.2.12 Math.cosh(x)
var $export = require('./_export');

var exp = Math.exp;
$export($export.S, 'Math', {
  cosh: function cosh(x) {
    return (exp(x = +x) + exp(-x)) / 2;
  }
});

},{"./_export":59}],191:[function(require,module,exports){
"use strict";

// 20.2.2.14 Math.expm1(x)
var $export = require('./_export');

var $expm1 = require('./_math-expm1');

$export($export.S + $export.F * ($expm1 != Math.expm1), 'Math', {
  expm1: $expm1
});

},{"./_export":59,"./_math-expm1":86}],192:[function(require,module,exports){
"use strict";

// 20.2.2.16 Math.fround(x)
var $export = require('./_export');

$export($export.S, 'Math', {
  fround: require('./_math-fround')
});

},{"./_export":59,"./_math-fround":87}],193:[function(require,module,exports){
"use strict";

// 20.2.2.17 Math.hypot([value1[, value2[, … ]]])
var $export = require('./_export');

var abs = Math.abs;
$export($export.S, 'Math', {
  hypot: function hypot(value1, value2) {
    // eslint-disable-line no-unused-vars
    var sum = 0;
    var i = 0;
    var aLen = arguments.length;
    var larg = 0;
    var arg, div;

    while (i < aLen) {
      arg = abs(arguments[i++]);

      if (larg < arg) {
        div = larg / arg;
        sum = sum * div * div + 1;
        larg = arg;
      } else if (arg > 0) {
        div = arg / larg;
        sum += div * div;
      } else sum += arg;
    }

    return larg === Infinity ? Infinity : larg * Math.sqrt(sum);
  }
});

},{"./_export":59}],194:[function(require,module,exports){
"use strict";

// 20.2.2.18 Math.imul(x, y)
var $export = require('./_export');

var $imul = Math.imul; // some WebKit versions fails with big numbers, some has wrong arity

$export($export.S + $export.F * require('./_fails')(function () {
  return $imul(0xffffffff, 5) != -5 || $imul.length != 2;
}), 'Math', {
  imul: function imul(x, y) {
    var UINT16 = 0xffff;
    var xn = +x;
    var yn = +y;
    var xl = UINT16 & xn;
    var yl = UINT16 & yn;
    return 0 | xl * yl + ((UINT16 & xn >>> 16) * yl + xl * (UINT16 & yn >>> 16) << 16 >>> 0);
  }
});

},{"./_export":59,"./_fails":61}],195:[function(require,module,exports){
"use strict";

// 20.2.2.21 Math.log10(x)
var $export = require('./_export');

$export($export.S, 'Math', {
  log10: function log10(x) {
    return Math.log(x) * Math.LOG10E;
  }
});

},{"./_export":59}],196:[function(require,module,exports){
"use strict";

// 20.2.2.20 Math.log1p(x)
var $export = require('./_export');

$export($export.S, 'Math', {
  log1p: require('./_math-log1p')
});

},{"./_export":59,"./_math-log1p":88}],197:[function(require,module,exports){
"use strict";

// 20.2.2.22 Math.log2(x)
var $export = require('./_export');

$export($export.S, 'Math', {
  log2: function log2(x) {
    return Math.log(x) / Math.LN2;
  }
});

},{"./_export":59}],198:[function(require,module,exports){
"use strict";

// 20.2.2.28 Math.sign(x)
var $export = require('./_export');

$export($export.S, 'Math', {
  sign: require('./_math-sign')
});

},{"./_export":59,"./_math-sign":90}],199:[function(require,module,exports){
"use strict";

// 20.2.2.30 Math.sinh(x)
var $export = require('./_export');

var expm1 = require('./_math-expm1');

var exp = Math.exp; // V8 near Chromium 38 has a problem with very small numbers

$export($export.S + $export.F * require('./_fails')(function () {
  return !Math.sinh(-2e-17) != -2e-17;
}), 'Math', {
  sinh: function sinh(x) {
    return Math.abs(x = +x) < 1 ? (expm1(x) - expm1(-x)) / 2 : (exp(x - 1) - exp(-x - 1)) * (Math.E / 2);
  }
});

},{"./_export":59,"./_fails":61,"./_math-expm1":86}],200:[function(require,module,exports){
"use strict";

// 20.2.2.33 Math.tanh(x)
var $export = require('./_export');

var expm1 = require('./_math-expm1');

var exp = Math.exp;
$export($export.S, 'Math', {
  tanh: function tanh(x) {
    var a = expm1(x = +x);
    var b = expm1(-x);
    return a == Infinity ? 1 : b == Infinity ? -1 : (a - b) / (exp(x) + exp(-x));
  }
});

},{"./_export":59,"./_math-expm1":86}],201:[function(require,module,exports){
"use strict";

// 20.2.2.34 Math.trunc(x)
var $export = require('./_export');

$export($export.S, 'Math', {
  trunc: function trunc(it) {
    return (it > 0 ? Math.floor : Math.ceil)(it);
  }
});

},{"./_export":59}],202:[function(require,module,exports){
'use strict';

var global = require('./_global');

var has = require('./_has');

var cof = require('./_cof');

var inheritIfRequired = require('./_inherit-if-required');

var toPrimitive = require('./_to-primitive');

var fails = require('./_fails');

var gOPN = require('./_object-gopn').f;

var gOPD = require('./_object-gopd').f;

var dP = require('./_object-dp').f;

var $trim = require('./_string-trim').trim;

var NUMBER = 'Number';
var $Number = global[NUMBER];
var Base = $Number;
var proto = $Number.prototype; // Opera ~12 has broken Object#toString

var BROKEN_COF = cof(require('./_object-create')(proto)) == NUMBER;
var TRIM = 'trim' in String.prototype; // 7.1.3 ToNumber(argument)

var toNumber = function toNumber(argument) {
  var it = toPrimitive(argument, false);

  if (typeof it == 'string' && it.length > 2) {
    it = TRIM ? it.trim() : $trim(it, 3);
    var first = it.charCodeAt(0);
    var third, radix, maxCode;

    if (first === 43 || first === 45) {
      third = it.charCodeAt(2);
      if (third === 88 || third === 120) return NaN; // Number('+0x1') should be NaN, old V8 fix
    } else if (first === 48) {
      switch (it.charCodeAt(1)) {
        case 66:
        case 98:
          radix = 2;
          maxCode = 49;
          break;
        // fast equal /^0b[01]+$/i

        case 79:
        case 111:
          radix = 8;
          maxCode = 55;
          break;
        // fast equal /^0o[0-7]+$/i

        default:
          return +it;
      }

      for (var digits = it.slice(2), i = 0, l = digits.length, code; i < l; i++) {
        code = digits.charCodeAt(i); // parseInt parses a string to a first unavailable symbol
        // but ToNumber should return NaN if a string contains unavailable symbols

        if (code < 48 || code > maxCode) return NaN;
      }

      return parseInt(digits, radix);
    }
  }

  return +it;
};

if (!$Number(' 0o1') || !$Number('0b1') || $Number('+0x1')) {
  $Number = function Number(value) {
    var it = arguments.length < 1 ? 0 : value;
    var that = this;
    return that instanceof $Number // check on 1..constructor(foo) case
    && (BROKEN_COF ? fails(function () {
      proto.valueOf.call(that);
    }) : cof(that) != NUMBER) ? inheritIfRequired(new Base(toNumber(it)), that, $Number) : toNumber(it);
  };

  for (var keys = require('./_descriptors') ? gOPN(Base) : ( // ES3:
  'MAX_VALUE,MIN_VALUE,NaN,NEGATIVE_INFINITY,POSITIVE_INFINITY,' + // ES6 (in case, if modules with ES6 Number statics required before):
  'EPSILON,isFinite,isInteger,isNaN,isSafeInteger,MAX_SAFE_INTEGER,' + 'MIN_SAFE_INTEGER,parseFloat,parseInt,isInteger').split(','), j = 0, key; keys.length > j; j++) {
    if (has(Base, key = keys[j]) && !has($Number, key)) {
      dP($Number, key, gOPD(Base, key));
    }
  }

  $Number.prototype = proto;
  proto.constructor = $Number;

  require('./_redefine')(global, NUMBER, $Number);
}

},{"./_cof":44,"./_descriptors":55,"./_fails":61,"./_global":66,"./_has":67,"./_inherit-if-required":71,"./_object-create":96,"./_object-dp":97,"./_object-gopd":100,"./_object-gopn":102,"./_redefine":117,"./_string-trim":134,"./_to-primitive":143}],203:[function(require,module,exports){
"use strict";

// 20.1.2.1 Number.EPSILON
var $export = require('./_export');

$export($export.S, 'Number', {
  EPSILON: Math.pow(2, -52)
});

},{"./_export":59}],204:[function(require,module,exports){
"use strict";

// 20.1.2.2 Number.isFinite(number)
var $export = require('./_export');

var _isFinite = require('./_global').isFinite;

$export($export.S, 'Number', {
  isFinite: function isFinite(it) {
    return typeof it == 'number' && _isFinite(it);
  }
});

},{"./_export":59,"./_global":66}],205:[function(require,module,exports){
"use strict";

// 20.1.2.3 Number.isInteger(number)
var $export = require('./_export');

$export($export.S, 'Number', {
  isInteger: require('./_is-integer')
});

},{"./_export":59,"./_is-integer":76}],206:[function(require,module,exports){
"use strict";

// 20.1.2.4 Number.isNaN(number)
var $export = require('./_export');

$export($export.S, 'Number', {
  isNaN: function isNaN(number) {
    // eslint-disable-next-line no-self-compare
    return number != number;
  }
});

},{"./_export":59}],207:[function(require,module,exports){
"use strict";

// 20.1.2.5 Number.isSafeInteger(number)
var $export = require('./_export');

var isInteger = require('./_is-integer');

var abs = Math.abs;
$export($export.S, 'Number', {
  isSafeInteger: function isSafeInteger(number) {
    return isInteger(number) && abs(number) <= 0x1fffffffffffff;
  }
});

},{"./_export":59,"./_is-integer":76}],208:[function(require,module,exports){
"use strict";

// 20.1.2.6 Number.MAX_SAFE_INTEGER
var $export = require('./_export');

$export($export.S, 'Number', {
  MAX_SAFE_INTEGER: 0x1fffffffffffff
});

},{"./_export":59}],209:[function(require,module,exports){
"use strict";

// 20.1.2.10 Number.MIN_SAFE_INTEGER
var $export = require('./_export');

$export($export.S, 'Number', {
  MIN_SAFE_INTEGER: -0x1fffffffffffff
});

},{"./_export":59}],210:[function(require,module,exports){
"use strict";

var $export = require('./_export');

var $parseFloat = require('./_parse-float'); // 20.1.2.12 Number.parseFloat(string)


$export($export.S + $export.F * (Number.parseFloat != $parseFloat), 'Number', {
  parseFloat: $parseFloat
});

},{"./_export":59,"./_parse-float":111}],211:[function(require,module,exports){
"use strict";

var $export = require('./_export');

var $parseInt = require('./_parse-int'); // 20.1.2.13 Number.parseInt(string, radix)


$export($export.S + $export.F * (Number.parseInt != $parseInt), 'Number', {
  parseInt: $parseInt
});

},{"./_export":59,"./_parse-int":112}],212:[function(require,module,exports){
'use strict';

var $export = require('./_export');

var toInteger = require('./_to-integer');

var aNumberValue = require('./_a-number-value');

var repeat = require('./_string-repeat');

var $toFixed = 1.0.toFixed;
var floor = Math.floor;
var data = [0, 0, 0, 0, 0, 0];
var ERROR = 'Number.toFixed: incorrect invocation!';
var ZERO = '0';

var multiply = function multiply(n, c) {
  var i = -1;
  var c2 = c;

  while (++i < 6) {
    c2 += n * data[i];
    data[i] = c2 % 1e7;
    c2 = floor(c2 / 1e7);
  }
};

var divide = function divide(n) {
  var i = 6;
  var c = 0;

  while (--i >= 0) {
    c += data[i];
    data[i] = floor(c / n);
    c = c % n * 1e7;
  }
};

var numToString = function numToString() {
  var i = 6;
  var s = '';

  while (--i >= 0) {
    if (s !== '' || i === 0 || data[i] !== 0) {
      var t = String(data[i]);
      s = s === '' ? t : s + repeat.call(ZERO, 7 - t.length) + t;
    }
  }

  return s;
};

var pow = function pow(x, n, acc) {
  return n === 0 ? acc : n % 2 === 1 ? pow(x, n - 1, acc * x) : pow(x * x, n / 2, acc);
};

var log = function log(x) {
  var n = 0;
  var x2 = x;

  while (x2 >= 4096) {
    n += 12;
    x2 /= 4096;
  }

  while (x2 >= 2) {
    n += 1;
    x2 /= 2;
  }

  return n;
};

$export($export.P + $export.F * (!!$toFixed && (0.00008.toFixed(3) !== '0.000' || 0.9.toFixed(0) !== '1' || 1.255.toFixed(2) !== '1.25' || 1000000000000000128.0.toFixed(0) !== '1000000000000000128') || !require('./_fails')(function () {
  // V8 ~ Android 4.3-
  $toFixed.call({});
})), 'Number', {
  toFixed: function toFixed(fractionDigits) {
    var x = aNumberValue(this, ERROR);
    var f = toInteger(fractionDigits);
    var s = '';
    var m = ZERO;
    var e, z, j, k;
    if (f < 0 || f > 20) throw RangeError(ERROR); // eslint-disable-next-line no-self-compare

    if (x != x) return 'NaN';
    if (x <= -1e21 || x >= 1e21) return String(x);

    if (x < 0) {
      s = '-';
      x = -x;
    }

    if (x > 1e-21) {
      e = log(x * pow(2, 69, 1)) - 69;
      z = e < 0 ? x * pow(2, -e, 1) : x / pow(2, e, 1);
      z *= 0x10000000000000;
      e = 52 - e;

      if (e > 0) {
        multiply(0, z);
        j = f;

        while (j >= 7) {
          multiply(1e7, 0);
          j -= 7;
        }

        multiply(pow(10, j, 1), 0);
        j = e - 1;

        while (j >= 23) {
          divide(1 << 23);
          j -= 23;
        }

        divide(1 << j);
        multiply(1, 1);
        divide(2);
        m = numToString();
      } else {
        multiply(0, z);
        multiply(1 << -e, 0);
        m = numToString() + repeat.call(ZERO, f);
      }
    }

    if (f > 0) {
      k = m.length;
      m = s + (k <= f ? '0.' + repeat.call(ZERO, f - k) + m : m.slice(0, k - f) + '.' + m.slice(k - f));
    } else {
      m = s + m;
    }

    return m;
  }
});

},{"./_a-number-value":30,"./_export":59,"./_fails":61,"./_string-repeat":133,"./_to-integer":139}],213:[function(require,module,exports){
'use strict';

var $export = require('./_export');

var $fails = require('./_fails');

var aNumberValue = require('./_a-number-value');

var $toPrecision = 1.0.toPrecision;
$export($export.P + $export.F * ($fails(function () {
  // IE7-
  return $toPrecision.call(1, undefined) !== '1';
}) || !$fails(function () {
  // V8 ~ Android 4.3-
  $toPrecision.call({});
})), 'Number', {
  toPrecision: function toPrecision(precision) {
    var that = aNumberValue(this, 'Number#toPrecision: incorrect invocation!');
    return precision === undefined ? $toPrecision.call(that) : $toPrecision.call(that, precision);
  }
});

},{"./_a-number-value":30,"./_export":59,"./_fails":61}],214:[function(require,module,exports){
"use strict";

// 19.1.3.1 Object.assign(target, source)
var $export = require('./_export');

$export($export.S + $export.F, 'Object', {
  assign: require('./_object-assign')
});

},{"./_export":59,"./_object-assign":95}],215:[function(require,module,exports){
"use strict";

var $export = require('./_export'); // 19.1.2.2 / 15.2.3.5 Object.create(O [, Properties])


$export($export.S, 'Object', {
  create: require('./_object-create')
});

},{"./_export":59,"./_object-create":96}],216:[function(require,module,exports){
"use strict";

var $export = require('./_export'); // 19.1.2.3 / 15.2.3.7 Object.defineProperties(O, Properties)


$export($export.S + $export.F * !require('./_descriptors'), 'Object', {
  defineProperties: require('./_object-dps')
});

},{"./_descriptors":55,"./_export":59,"./_object-dps":98}],217:[function(require,module,exports){
"use strict";

var $export = require('./_export'); // 19.1.2.4 / 15.2.3.6 Object.defineProperty(O, P, Attributes)


$export($export.S + $export.F * !require('./_descriptors'), 'Object', {
  defineProperty: require('./_object-dp').f
});

},{"./_descriptors":55,"./_export":59,"./_object-dp":97}],218:[function(require,module,exports){
"use strict";

// 19.1.2.5 Object.freeze(O)
var isObject = require('./_is-object');

var meta = require('./_meta').onFreeze;

require('./_object-sap')('freeze', function ($freeze) {
  return function freeze(it) {
    return $freeze && isObject(it) ? $freeze(meta(it)) : it;
  };
});

},{"./_is-object":77,"./_meta":91,"./_object-sap":108}],219:[function(require,module,exports){
"use strict";

// 19.1.2.6 Object.getOwnPropertyDescriptor(O, P)
var toIObject = require('./_to-iobject');

var $getOwnPropertyDescriptor = require('./_object-gopd').f;

require('./_object-sap')('getOwnPropertyDescriptor', function () {
  return function getOwnPropertyDescriptor(it, key) {
    return $getOwnPropertyDescriptor(toIObject(it), key);
  };
});

},{"./_object-gopd":100,"./_object-sap":108,"./_to-iobject":140}],220:[function(require,module,exports){
"use strict";

// 19.1.2.7 Object.getOwnPropertyNames(O)
require('./_object-sap')('getOwnPropertyNames', function () {
  return require('./_object-gopn-ext').f;
});

},{"./_object-gopn-ext":101,"./_object-sap":108}],221:[function(require,module,exports){
"use strict";

// 19.1.2.9 Object.getPrototypeOf(O)
var toObject = require('./_to-object');

var $getPrototypeOf = require('./_object-gpo');

require('./_object-sap')('getPrototypeOf', function () {
  return function getPrototypeOf(it) {
    return $getPrototypeOf(toObject(it));
  };
});

},{"./_object-gpo":104,"./_object-sap":108,"./_to-object":142}],222:[function(require,module,exports){
"use strict";

// 19.1.2.11 Object.isExtensible(O)
var isObject = require('./_is-object');

require('./_object-sap')('isExtensible', function ($isExtensible) {
  return function isExtensible(it) {
    return isObject(it) ? $isExtensible ? $isExtensible(it) : true : false;
  };
});

},{"./_is-object":77,"./_object-sap":108}],223:[function(require,module,exports){
"use strict";

// 19.1.2.12 Object.isFrozen(O)
var isObject = require('./_is-object');

require('./_object-sap')('isFrozen', function ($isFrozen) {
  return function isFrozen(it) {
    return isObject(it) ? $isFrozen ? $isFrozen(it) : false : true;
  };
});

},{"./_is-object":77,"./_object-sap":108}],224:[function(require,module,exports){
"use strict";

// 19.1.2.13 Object.isSealed(O)
var isObject = require('./_is-object');

require('./_object-sap')('isSealed', function ($isSealed) {
  return function isSealed(it) {
    return isObject(it) ? $isSealed ? $isSealed(it) : false : true;
  };
});

},{"./_is-object":77,"./_object-sap":108}],225:[function(require,module,exports){
"use strict";

// 19.1.3.10 Object.is(value1, value2)
var $export = require('./_export');

$export($export.S, 'Object', {
  is: require('./_same-value')
});

},{"./_export":59,"./_same-value":119}],226:[function(require,module,exports){
"use strict";

// 19.1.2.14 Object.keys(O)
var toObject = require('./_to-object');

var $keys = require('./_object-keys');

require('./_object-sap')('keys', function () {
  return function keys(it) {
    return $keys(toObject(it));
  };
});

},{"./_object-keys":106,"./_object-sap":108,"./_to-object":142}],227:[function(require,module,exports){
"use strict";

// 19.1.2.15 Object.preventExtensions(O)
var isObject = require('./_is-object');

var meta = require('./_meta').onFreeze;

require('./_object-sap')('preventExtensions', function ($preventExtensions) {
  return function preventExtensions(it) {
    return $preventExtensions && isObject(it) ? $preventExtensions(meta(it)) : it;
  };
});

},{"./_is-object":77,"./_meta":91,"./_object-sap":108}],228:[function(require,module,exports){
"use strict";

// 19.1.2.17 Object.seal(O)
var isObject = require('./_is-object');

var meta = require('./_meta').onFreeze;

require('./_object-sap')('seal', function ($seal) {
  return function seal(it) {
    return $seal && isObject(it) ? $seal(meta(it)) : it;
  };
});

},{"./_is-object":77,"./_meta":91,"./_object-sap":108}],229:[function(require,module,exports){
"use strict";

// 19.1.3.19 Object.setPrototypeOf(O, proto)
var $export = require('./_export');

$export($export.S, 'Object', {
  setPrototypeOf: require('./_set-proto').set
});

},{"./_export":59,"./_set-proto":122}],230:[function(require,module,exports){
'use strict'; // 19.1.3.6 Object.prototype.toString()

var classof = require('./_classof');

var test = {};
test[require('./_wks')('toStringTag')] = 'z';

if (test + '' != '[object z]') {
  require('./_redefine')(Object.prototype, 'toString', function toString() {
    return '[object ' + classof(this) + ']';
  }, true);
}

},{"./_classof":43,"./_redefine":117,"./_wks":152}],231:[function(require,module,exports){
"use strict";

var $export = require('./_export');

var $parseFloat = require('./_parse-float'); // 18.2.4 parseFloat(string)


$export($export.G + $export.F * (parseFloat != $parseFloat), {
  parseFloat: $parseFloat
});

},{"./_export":59,"./_parse-float":111}],232:[function(require,module,exports){
"use strict";

var $export = require('./_export');

var $parseInt = require('./_parse-int'); // 18.2.5 parseInt(string, radix)


$export($export.G + $export.F * (parseInt != $parseInt), {
  parseInt: $parseInt
});

},{"./_export":59,"./_parse-int":112}],233:[function(require,module,exports){
'use strict';

var LIBRARY = require('./_library');

var global = require('./_global');

var ctx = require('./_ctx');

var classof = require('./_classof');

var $export = require('./_export');

var isObject = require('./_is-object');

var aFunction = require('./_a-function');

var anInstance = require('./_an-instance');

var forOf = require('./_for-of');

var speciesConstructor = require('./_species-constructor');

var task = require('./_task').set;

var microtask = require('./_microtask')();

var newPromiseCapabilityModule = require('./_new-promise-capability');

var perform = require('./_perform');

var promiseResolve = require('./_promise-resolve');

var PROMISE = 'Promise';
var TypeError = global.TypeError;
var process = global.process;
var $Promise = global[PROMISE];
var isNode = classof(process) == 'process';

var empty = function empty() {
  /* empty */
};

var Internal, newGenericPromiseCapability, OwnPromiseCapability, Wrapper;
var newPromiseCapability = newGenericPromiseCapability = newPromiseCapabilityModule.f;
var USE_NATIVE = !!function () {
  try {
    // correct subclassing with @@species support
    var promise = $Promise.resolve(1);

    var FakePromise = (promise.constructor = {})[require('./_wks')('species')] = function (exec) {
      exec(empty, empty);
    }; // unhandled rejections tracking support, NodeJS Promise without it fails @@species test


    return (isNode || typeof PromiseRejectionEvent == 'function') && promise.then(empty) instanceof FakePromise;
  } catch (e) {
    /* empty */
  }
}(); // helpers

var isThenable = function isThenable(it) {
  var then;
  return isObject(it) && typeof (then = it.then) == 'function' ? then : false;
};

var notify = function notify(promise, isReject) {
  if (promise._n) return;
  promise._n = true;
  var chain = promise._c;
  microtask(function () {
    var value = promise._v;
    var ok = promise._s == 1;
    var i = 0;

    var run = function run(reaction) {
      var handler = ok ? reaction.ok : reaction.fail;
      var resolve = reaction.resolve;
      var reject = reaction.reject;
      var domain = reaction.domain;
      var result, then;

      try {
        if (handler) {
          if (!ok) {
            if (promise._h == 2) onHandleUnhandled(promise);
            promise._h = 1;
          }

          if (handler === true) result = value;else {
            if (domain) domain.enter();
            result = handler(value);
            if (domain) domain.exit();
          }

          if (result === reaction.promise) {
            reject(TypeError('Promise-chain cycle'));
          } else if (then = isThenable(result)) {
            then.call(result, resolve, reject);
          } else resolve(result);
        } else reject(value);
      } catch (e) {
        reject(e);
      }
    };

    while (chain.length > i) {
      run(chain[i++]);
    } // variable length - can't use forEach


    promise._c = [];
    promise._n = false;
    if (isReject && !promise._h) onUnhandled(promise);
  });
};

var onUnhandled = function onUnhandled(promise) {
  task.call(global, function () {
    var value = promise._v;
    var unhandled = isUnhandled(promise);
    var result, handler, console;

    if (unhandled) {
      result = perform(function () {
        if (isNode) {
          process.emit('unhandledRejection', value, promise);
        } else if (handler = global.onunhandledrejection) {
          handler({
            promise: promise,
            reason: value
          });
        } else if ((console = global.console) && console.error) {
          console.error('Unhandled promise rejection', value);
        }
      }); // Browsers should not trigger `rejectionHandled` event if it was handled here, NodeJS - should

      promise._h = isNode || isUnhandled(promise) ? 2 : 1;
    }

    promise._a = undefined;
    if (unhandled && result.e) throw result.v;
  });
};

var isUnhandled = function isUnhandled(promise) {
  return promise._h !== 1 && (promise._a || promise._c).length === 0;
};

var onHandleUnhandled = function onHandleUnhandled(promise) {
  task.call(global, function () {
    var handler;

    if (isNode) {
      process.emit('rejectionHandled', promise);
    } else if (handler = global.onrejectionhandled) {
      handler({
        promise: promise,
        reason: promise._v
      });
    }
  });
};

var $reject = function $reject(value) {
  var promise = this;
  if (promise._d) return;
  promise._d = true;
  promise = promise._w || promise; // unwrap

  promise._v = value;
  promise._s = 2;
  if (!promise._a) promise._a = promise._c.slice();
  notify(promise, true);
};

var $resolve = function $resolve(value) {
  var promise = this;
  var then;
  if (promise._d) return;
  promise._d = true;
  promise = promise._w || promise; // unwrap

  try {
    if (promise === value) throw TypeError("Promise can't be resolved itself");

    if (then = isThenable(value)) {
      microtask(function () {
        var wrapper = {
          _w: promise,
          _d: false
        }; // wrap

        try {
          then.call(value, ctx($resolve, wrapper, 1), ctx($reject, wrapper, 1));
        } catch (e) {
          $reject.call(wrapper, e);
        }
      });
    } else {
      promise._v = value;
      promise._s = 1;
      notify(promise, false);
    }
  } catch (e) {
    $reject.call({
      _w: promise,
      _d: false
    }, e); // wrap
  }
}; // constructor polyfill


if (!USE_NATIVE) {
  // 25.4.3.1 Promise(executor)
  $Promise = function Promise(executor) {
    anInstance(this, $Promise, PROMISE, '_h');
    aFunction(executor);
    Internal.call(this);

    try {
      executor(ctx($resolve, this, 1), ctx($reject, this, 1));
    } catch (err) {
      $reject.call(this, err);
    }
  }; // eslint-disable-next-line no-unused-vars


  Internal = function Promise(executor) {
    this._c = []; // <- awaiting reactions

    this._a = undefined; // <- checked in isUnhandled reactions

    this._s = 0; // <- state

    this._d = false; // <- done

    this._v = undefined; // <- value

    this._h = 0; // <- rejection state, 0 - default, 1 - handled, 2 - unhandled

    this._n = false; // <- notify
  };

  Internal.prototype = require('./_redefine-all')($Promise.prototype, {
    // 25.4.5.3 Promise.prototype.then(onFulfilled, onRejected)
    then: function then(onFulfilled, onRejected) {
      var reaction = newPromiseCapability(speciesConstructor(this, $Promise));
      reaction.ok = typeof onFulfilled == 'function' ? onFulfilled : true;
      reaction.fail = typeof onRejected == 'function' && onRejected;
      reaction.domain = isNode ? process.domain : undefined;

      this._c.push(reaction);

      if (this._a) this._a.push(reaction);
      if (this._s) notify(this, false);
      return reaction.promise;
    },
    // 25.4.5.1 Promise.prototype.catch(onRejected)
    'catch': function _catch(onRejected) {
      return this.then(undefined, onRejected);
    }
  });

  OwnPromiseCapability = function OwnPromiseCapability() {
    var promise = new Internal();
    this.promise = promise;
    this.resolve = ctx($resolve, promise, 1);
    this.reject = ctx($reject, promise, 1);
  };

  newPromiseCapabilityModule.f = newPromiseCapability = function newPromiseCapability(C) {
    return C === $Promise || C === Wrapper ? new OwnPromiseCapability(C) : newGenericPromiseCapability(C);
  };
}

$export($export.G + $export.W + $export.F * !USE_NATIVE, {
  Promise: $Promise
});

require('./_set-to-string-tag')($Promise, PROMISE);

require('./_set-species')(PROMISE);

Wrapper = require('./_core')[PROMISE]; // statics

$export($export.S + $export.F * !USE_NATIVE, PROMISE, {
  // 25.4.4.5 Promise.reject(r)
  reject: function reject(r) {
    var capability = newPromiseCapability(this);
    var $$reject = capability.reject;
    $$reject(r);
    return capability.promise;
  }
});
$export($export.S + $export.F * (LIBRARY || !USE_NATIVE), PROMISE, {
  // 25.4.4.6 Promise.resolve(x)
  resolve: function resolve(x) {
    return promiseResolve(LIBRARY && this === Wrapper ? $Promise : this, x);
  }
});
$export($export.S + $export.F * !(USE_NATIVE && require('./_iter-detect')(function (iter) {
  $Promise.all(iter)['catch'](empty);
})), PROMISE, {
  // 25.4.4.1 Promise.all(iterable)
  all: function all(iterable) {
    var C = this;
    var capability = newPromiseCapability(C);
    var resolve = capability.resolve;
    var reject = capability.reject;
    var result = perform(function () {
      var values = [];
      var index = 0;
      var remaining = 1;
      forOf(iterable, false, function (promise) {
        var $index = index++;
        var alreadyCalled = false;
        values.push(undefined);
        remaining++;
        C.resolve(promise).then(function (value) {
          if (alreadyCalled) return;
          alreadyCalled = true;
          values[$index] = value;
          --remaining || resolve(values);
        }, reject);
      });
      --remaining || resolve(values);
    });
    if (result.e) reject(result.v);
    return capability.promise;
  },
  // 25.4.4.4 Promise.race(iterable)
  race: function race(iterable) {
    var C = this;
    var capability = newPromiseCapability(C);
    var reject = capability.reject;
    var result = perform(function () {
      forOf(iterable, false, function (promise) {
        C.resolve(promise).then(capability.resolve, reject);
      });
    });
    if (result.e) reject(result.v);
    return capability.promise;
  }
});

},{"./_a-function":29,"./_an-instance":32,"./_classof":43,"./_core":49,"./_ctx":51,"./_export":59,"./_for-of":65,"./_global":66,"./_is-object":77,"./_iter-detect":82,"./_library":85,"./_microtask":93,"./_new-promise-capability":94,"./_perform":113,"./_promise-resolve":114,"./_redefine-all":116,"./_set-species":123,"./_set-to-string-tag":124,"./_species-constructor":127,"./_task":136,"./_wks":152}],234:[function(require,module,exports){
"use strict";

// 26.1.1 Reflect.apply(target, thisArgument, argumentsList)
var $export = require('./_export');

var aFunction = require('./_a-function');

var anObject = require('./_an-object');

var rApply = (require('./_global').Reflect || {}).apply;
var fApply = Function.apply; // MS Edge argumentsList argument is optional

$export($export.S + $export.F * !require('./_fails')(function () {
  rApply(function () {
    /* empty */
  });
}), 'Reflect', {
  apply: function apply(target, thisArgument, argumentsList) {
    var T = aFunction(target);
    var L = anObject(argumentsList);
    return rApply ? rApply(T, thisArgument, L) : fApply.call(T, thisArgument, L);
  }
});

},{"./_a-function":29,"./_an-object":33,"./_export":59,"./_fails":61,"./_global":66}],235:[function(require,module,exports){
"use strict";

// 26.1.2 Reflect.construct(target, argumentsList [, newTarget])
var $export = require('./_export');

var create = require('./_object-create');

var aFunction = require('./_a-function');

var anObject = require('./_an-object');

var isObject = require('./_is-object');

var fails = require('./_fails');

var bind = require('./_bind');

var rConstruct = (require('./_global').Reflect || {}).construct; // MS Edge supports only 2 arguments and argumentsList argument is optional
// FF Nightly sets third argument as `new.target`, but does not create `this` from it

var NEW_TARGET_BUG = fails(function () {
  function F() {
    /* empty */
  }

  return !(rConstruct(function () {
    /* empty */
  }, [], F) instanceof F);
});
var ARGS_BUG = !fails(function () {
  rConstruct(function () {
    /* empty */
  });
});
$export($export.S + $export.F * (NEW_TARGET_BUG || ARGS_BUG), 'Reflect', {
  construct: function construct(Target, args
  /* , newTarget */
  ) {
    aFunction(Target);
    anObject(args);
    var newTarget = arguments.length < 3 ? Target : aFunction(arguments[2]);
    if (ARGS_BUG && !NEW_TARGET_BUG) return rConstruct(Target, args, newTarget);

    if (Target == newTarget) {
      // w/o altered newTarget, optimization for 0-4 arguments
      switch (args.length) {
        case 0:
          return new Target();

        case 1:
          return new Target(args[0]);

        case 2:
          return new Target(args[0], args[1]);

        case 3:
          return new Target(args[0], args[1], args[2]);

        case 4:
          return new Target(args[0], args[1], args[2], args[3]);
      } // w/o altered newTarget, lot of arguments case


      var $args = [null];
      $args.push.apply($args, args);
      return new (bind.apply(Target, $args))();
    } // with altered newTarget, not support built-in constructors


    var proto = newTarget.prototype;
    var instance = create(isObject(proto) ? proto : Object.prototype);
    var result = Function.apply.call(Target, instance, args);
    return isObject(result) ? result : instance;
  }
});

},{"./_a-function":29,"./_an-object":33,"./_bind":42,"./_export":59,"./_fails":61,"./_global":66,"./_is-object":77,"./_object-create":96}],236:[function(require,module,exports){
"use strict";

// 26.1.3 Reflect.defineProperty(target, propertyKey, attributes)
var dP = require('./_object-dp');

var $export = require('./_export');

var anObject = require('./_an-object');

var toPrimitive = require('./_to-primitive'); // MS Edge has broken Reflect.defineProperty - throwing instead of returning false


$export($export.S + $export.F * require('./_fails')(function () {
  // eslint-disable-next-line no-undef
  Reflect.defineProperty(dP.f({}, 1, {
    value: 1
  }), 1, {
    value: 2
  });
}), 'Reflect', {
  defineProperty: function defineProperty(target, propertyKey, attributes) {
    anObject(target);
    propertyKey = toPrimitive(propertyKey, true);
    anObject(attributes);

    try {
      dP.f(target, propertyKey, attributes);
      return true;
    } catch (e) {
      return false;
    }
  }
});

},{"./_an-object":33,"./_export":59,"./_fails":61,"./_object-dp":97,"./_to-primitive":143}],237:[function(require,module,exports){
"use strict";

// 26.1.4 Reflect.deleteProperty(target, propertyKey)
var $export = require('./_export');

var gOPD = require('./_object-gopd').f;

var anObject = require('./_an-object');

$export($export.S, 'Reflect', {
  deleteProperty: function deleteProperty(target, propertyKey) {
    var desc = gOPD(anObject(target), propertyKey);
    return desc && !desc.configurable ? false : delete target[propertyKey];
  }
});

},{"./_an-object":33,"./_export":59,"./_object-gopd":100}],238:[function(require,module,exports){
'use strict'; // 26.1.5 Reflect.enumerate(target)

var $export = require('./_export');

var anObject = require('./_an-object');

var Enumerate = function Enumerate(iterated) {
  this._t = anObject(iterated); // target

  this._i = 0; // next index

  var keys = this._k = []; // keys

  var key;

  for (key in iterated) {
    keys.push(key);
  }
};

require('./_iter-create')(Enumerate, 'Object', function () {
  var that = this;
  var keys = that._k;
  var key;

  do {
    if (that._i >= keys.length) return {
      value: undefined,
      done: true
    };
  } while (!((key = keys[that._i++]) in that._t));

  return {
    value: key,
    done: false
  };
});

$export($export.S, 'Reflect', {
  enumerate: function enumerate(target) {
    return new Enumerate(target);
  }
});

},{"./_an-object":33,"./_export":59,"./_iter-create":80}],239:[function(require,module,exports){
"use strict";

// 26.1.7 Reflect.getOwnPropertyDescriptor(target, propertyKey)
var gOPD = require('./_object-gopd');

var $export = require('./_export');

var anObject = require('./_an-object');

$export($export.S, 'Reflect', {
  getOwnPropertyDescriptor: function getOwnPropertyDescriptor(target, propertyKey) {
    return gOPD.f(anObject(target), propertyKey);
  }
});

},{"./_an-object":33,"./_export":59,"./_object-gopd":100}],240:[function(require,module,exports){
"use strict";

// 26.1.8 Reflect.getPrototypeOf(target)
var $export = require('./_export');

var getProto = require('./_object-gpo');

var anObject = require('./_an-object');

$export($export.S, 'Reflect', {
  getPrototypeOf: function getPrototypeOf(target) {
    return getProto(anObject(target));
  }
});

},{"./_an-object":33,"./_export":59,"./_object-gpo":104}],241:[function(require,module,exports){
"use strict";

// 26.1.6 Reflect.get(target, propertyKey [, receiver])
var gOPD = require('./_object-gopd');

var getPrototypeOf = require('./_object-gpo');

var has = require('./_has');

var $export = require('./_export');

var isObject = require('./_is-object');

var anObject = require('./_an-object');

function get(target, propertyKey
/* , receiver */
) {
  var receiver = arguments.length < 3 ? target : arguments[2];
  var desc, proto;
  if (anObject(target) === receiver) return target[propertyKey];
  if (desc = gOPD.f(target, propertyKey)) return has(desc, 'value') ? desc.value : desc.get !== undefined ? desc.get.call(receiver) : undefined;
  if (isObject(proto = getPrototypeOf(target))) return get(proto, propertyKey, receiver);
}

$export($export.S, 'Reflect', {
  get: get
});

},{"./_an-object":33,"./_export":59,"./_has":67,"./_is-object":77,"./_object-gopd":100,"./_object-gpo":104}],242:[function(require,module,exports){
"use strict";

// 26.1.9 Reflect.has(target, propertyKey)
var $export = require('./_export');

$export($export.S, 'Reflect', {
  has: function has(target, propertyKey) {
    return propertyKey in target;
  }
});

},{"./_export":59}],243:[function(require,module,exports){
"use strict";

// 26.1.10 Reflect.isExtensible(target)
var $export = require('./_export');

var anObject = require('./_an-object');

var $isExtensible = Object.isExtensible;
$export($export.S, 'Reflect', {
  isExtensible: function isExtensible(target) {
    anObject(target);
    return $isExtensible ? $isExtensible(target) : true;
  }
});

},{"./_an-object":33,"./_export":59}],244:[function(require,module,exports){
"use strict";

// 26.1.11 Reflect.ownKeys(target)
var $export = require('./_export');

$export($export.S, 'Reflect', {
  ownKeys: require('./_own-keys')
});

},{"./_export":59,"./_own-keys":110}],245:[function(require,module,exports){
"use strict";

// 26.1.12 Reflect.preventExtensions(target)
var $export = require('./_export');

var anObject = require('./_an-object');

var $preventExtensions = Object.preventExtensions;
$export($export.S, 'Reflect', {
  preventExtensions: function preventExtensions(target) {
    anObject(target);

    try {
      if ($preventExtensions) $preventExtensions(target);
      return true;
    } catch (e) {
      return false;
    }
  }
});

},{"./_an-object":33,"./_export":59}],246:[function(require,module,exports){
"use strict";

// 26.1.14 Reflect.setPrototypeOf(target, proto)
var $export = require('./_export');

var setProto = require('./_set-proto');

if (setProto) $export($export.S, 'Reflect', {
  setPrototypeOf: function setPrototypeOf(target, proto) {
    setProto.check(target, proto);

    try {
      setProto.set(target, proto);
      return true;
    } catch (e) {
      return false;
    }
  }
});

},{"./_export":59,"./_set-proto":122}],247:[function(require,module,exports){
"use strict";

// 26.1.13 Reflect.set(target, propertyKey, V [, receiver])
var dP = require('./_object-dp');

var gOPD = require('./_object-gopd');

var getPrototypeOf = require('./_object-gpo');

var has = require('./_has');

var $export = require('./_export');

var createDesc = require('./_property-desc');

var anObject = require('./_an-object');

var isObject = require('./_is-object');

function set(target, propertyKey, V
/* , receiver */
) {
  var receiver = arguments.length < 4 ? target : arguments[3];
  var ownDesc = gOPD.f(anObject(target), propertyKey);
  var existingDescriptor, proto;

  if (!ownDesc) {
    if (isObject(proto = getPrototypeOf(target))) {
      return set(proto, propertyKey, V, receiver);
    }

    ownDesc = createDesc(0);
  }

  if (has(ownDesc, 'value')) {
    if (ownDesc.writable === false || !isObject(receiver)) return false;
    existingDescriptor = gOPD.f(receiver, propertyKey) || createDesc(0);
    existingDescriptor.value = V;
    dP.f(receiver, propertyKey, existingDescriptor);
    return true;
  }

  return ownDesc.set === undefined ? false : (ownDesc.set.call(receiver, V), true);
}

$export($export.S, 'Reflect', {
  set: set
});

},{"./_an-object":33,"./_export":59,"./_has":67,"./_is-object":77,"./_object-dp":97,"./_object-gopd":100,"./_object-gpo":104,"./_property-desc":115}],248:[function(require,module,exports){
"use strict";

var global = require('./_global');

var inheritIfRequired = require('./_inherit-if-required');

var dP = require('./_object-dp').f;

var gOPN = require('./_object-gopn').f;

var isRegExp = require('./_is-regexp');

var $flags = require('./_flags');

var $RegExp = global.RegExp;
var Base = $RegExp;
var proto = $RegExp.prototype;
var re1 = /a/g;
var re2 = /a/g; // "new" creates a new object, old webkit buggy here

var CORRECT_NEW = new $RegExp(re1) !== re1;

if (require('./_descriptors') && (!CORRECT_NEW || require('./_fails')(function () {
  re2[require('./_wks')('match')] = false; // RegExp constructor can alter flags and IsRegExp works correct with @@match

  return $RegExp(re1) != re1 || $RegExp(re2) == re2 || $RegExp(re1, 'i') != '/a/i';
}))) {
  $RegExp = function RegExp(p, f) {
    var tiRE = this instanceof $RegExp;
    var piRE = isRegExp(p);
    var fiU = f === undefined;
    return !tiRE && piRE && p.constructor === $RegExp && fiU ? p : inheritIfRequired(CORRECT_NEW ? new Base(piRE && !fiU ? p.source : p, f) : Base((piRE = p instanceof $RegExp) ? p.source : p, piRE && fiU ? $flags.call(p) : f), tiRE ? this : proto, $RegExp);
  };

  var proxy = function proxy(key) {
    key in $RegExp || dP($RegExp, key, {
      configurable: true,
      get: function get() {
        return Base[key];
      },
      set: function set(it) {
        Base[key] = it;
      }
    });
  };

  for (var keys = gOPN(Base), i = 0; keys.length > i;) {
    proxy(keys[i++]);
  }

  proto.constructor = $RegExp;
  $RegExp.prototype = proto;

  require('./_redefine')(global, 'RegExp', $RegExp);
}

require('./_set-species')('RegExp');

},{"./_descriptors":55,"./_fails":61,"./_flags":63,"./_global":66,"./_inherit-if-required":71,"./_is-regexp":78,"./_object-dp":97,"./_object-gopn":102,"./_redefine":117,"./_set-species":123,"./_wks":152}],249:[function(require,module,exports){
"use strict";

// 21.2.5.3 get RegExp.prototype.flags()
if (require('./_descriptors') && /./g.flags != 'g') require('./_object-dp').f(RegExp.prototype, 'flags', {
  configurable: true,
  get: require('./_flags')
});

},{"./_descriptors":55,"./_flags":63,"./_object-dp":97}],250:[function(require,module,exports){
"use strict";

// @@match logic
require('./_fix-re-wks')('match', 1, function (defined, MATCH, $match) {
  // 21.1.3.11 String.prototype.match(regexp)
  return [function match(regexp) {
    'use strict';

    var O = defined(this);
    var fn = regexp == undefined ? undefined : regexp[MATCH];
    return fn !== undefined ? fn.call(regexp, O) : new RegExp(regexp)[MATCH](String(O));
  }, $match];
});

},{"./_fix-re-wks":62}],251:[function(require,module,exports){
"use strict";

// @@replace logic
require('./_fix-re-wks')('replace', 2, function (defined, REPLACE, $replace) {
  // 21.1.3.14 String.prototype.replace(searchValue, replaceValue)
  return [function replace(searchValue, replaceValue) {
    'use strict';

    var O = defined(this);
    var fn = searchValue == undefined ? undefined : searchValue[REPLACE];
    return fn !== undefined ? fn.call(searchValue, O, replaceValue) : $replace.call(String(O), searchValue, replaceValue);
  }, $replace];
});

},{"./_fix-re-wks":62}],252:[function(require,module,exports){
"use strict";

// @@search logic
require('./_fix-re-wks')('search', 1, function (defined, SEARCH, $search) {
  // 21.1.3.15 String.prototype.search(regexp)
  return [function search(regexp) {
    'use strict';

    var O = defined(this);
    var fn = regexp == undefined ? undefined : regexp[SEARCH];
    return fn !== undefined ? fn.call(regexp, O) : new RegExp(regexp)[SEARCH](String(O));
  }, $search];
});

},{"./_fix-re-wks":62}],253:[function(require,module,exports){
"use strict";

// @@split logic
require('./_fix-re-wks')('split', 2, function (defined, SPLIT, $split) {
  'use strict';

  var isRegExp = require('./_is-regexp');

  var _split = $split;
  var $push = [].push;
  var $SPLIT = 'split';
  var LENGTH = 'length';
  var LAST_INDEX = 'lastIndex';

  if ('abbc'[$SPLIT](/(b)*/)[1] == 'c' || 'test'[$SPLIT](/(?:)/, -1)[LENGTH] != 4 || 'ab'[$SPLIT](/(?:ab)*/)[LENGTH] != 2 || '.'[$SPLIT](/(.?)(.?)/)[LENGTH] != 4 || '.'[$SPLIT](/()()/)[LENGTH] > 1 || ''[$SPLIT](/.?/)[LENGTH]) {
    var NPCG = /()??/.exec('')[1] === undefined; // nonparticipating capturing group
    // based on es5-shim implementation, need to rework it

    $split = function $split(separator, limit) {
      var string = String(this);
      if (separator === undefined && limit === 0) return []; // If `separator` is not a regex, use native split

      if (!isRegExp(separator)) return _split.call(string, separator, limit);
      var output = [];
      var flags = (separator.ignoreCase ? 'i' : '') + (separator.multiline ? 'm' : '') + (separator.unicode ? 'u' : '') + (separator.sticky ? 'y' : '');
      var lastLastIndex = 0;
      var splitLimit = limit === undefined ? 4294967295 : limit >>> 0; // Make `global` and avoid `lastIndex` issues by working with a copy

      var separatorCopy = new RegExp(separator.source, flags + 'g');
      var separator2, match, lastIndex, lastLength, i; // Doesn't need flags gy, but they don't hurt

      if (!NPCG) separator2 = new RegExp('^' + separatorCopy.source + '$(?!\\s)', flags);

      while (match = separatorCopy.exec(string)) {
        // `separatorCopy.lastIndex` is not reliable cross-browser
        lastIndex = match.index + match[0][LENGTH];

        if (lastIndex > lastLastIndex) {
          output.push(string.slice(lastLastIndex, match.index)); // Fix browsers whose `exec` methods don't consistently return `undefined` for NPCG
          // eslint-disable-next-line no-loop-func

          if (!NPCG && match[LENGTH] > 1) match[0].replace(separator2, function () {
            for (i = 1; i < arguments[LENGTH] - 2; i++) {
              if (arguments[i] === undefined) match[i] = undefined;
            }
          });
          if (match[LENGTH] > 1 && match.index < string[LENGTH]) $push.apply(output, match.slice(1));
          lastLength = match[0][LENGTH];
          lastLastIndex = lastIndex;
          if (output[LENGTH] >= splitLimit) break;
        }

        if (separatorCopy[LAST_INDEX] === match.index) separatorCopy[LAST_INDEX]++; // Avoid an infinite loop
      }

      if (lastLastIndex === string[LENGTH]) {
        if (lastLength || !separatorCopy.test('')) output.push('');
      } else output.push(string.slice(lastLastIndex));

      return output[LENGTH] > splitLimit ? output.slice(0, splitLimit) : output;
    }; // Chakra, V8

  } else if ('0'[$SPLIT](undefined, 0)[LENGTH]) {
    $split = function $split(separator, limit) {
      return separator === undefined && limit === 0 ? [] : _split.call(this, separator, limit);
    };
  } // 21.1.3.17 String.prototype.split(separator, limit)


  return [function split(separator, limit) {
    var O = defined(this);
    var fn = separator == undefined ? undefined : separator[SPLIT];
    return fn !== undefined ? fn.call(separator, O, limit) : $split.call(String(O), separator, limit);
  }, $split];
});

},{"./_fix-re-wks":62,"./_is-regexp":78}],254:[function(require,module,exports){
'use strict';

require('./es6.regexp.flags');

var anObject = require('./_an-object');

var $flags = require('./_flags');

var DESCRIPTORS = require('./_descriptors');

var TO_STRING = 'toString';
var $toString = /./[TO_STRING];

var define = function define(fn) {
  require('./_redefine')(RegExp.prototype, TO_STRING, fn, true);
}; // 21.2.5.14 RegExp.prototype.toString()


if (require('./_fails')(function () {
  return $toString.call({
    source: 'a',
    flags: 'b'
  }) != '/a/b';
})) {
  define(function toString() {
    var R = anObject(this);
    return '/'.concat(R.source, '/', 'flags' in R ? R.flags : !DESCRIPTORS && R instanceof RegExp ? $flags.call(R) : undefined);
  }); // FF44- RegExp#toString has a wrong name
} else if ($toString.name != TO_STRING) {
  define(function toString() {
    return $toString.call(this);
  });
}

},{"./_an-object":33,"./_descriptors":55,"./_fails":61,"./_flags":63,"./_redefine":117,"./es6.regexp.flags":249}],255:[function(require,module,exports){
'use strict';

var strong = require('./_collection-strong');

var validate = require('./_validate-collection');

var SET = 'Set'; // 23.2 Set Objects

module.exports = require('./_collection')(SET, function (get) {
  return function Set() {
    return get(this, arguments.length > 0 ? arguments[0] : undefined);
  };
}, {
  // 23.2.3.1 Set.prototype.add(value)
  add: function add(value) {
    return strong.def(validate(this, SET), value = value === 0 ? 0 : value, value);
  }
}, strong);

},{"./_collection":48,"./_collection-strong":45,"./_validate-collection":149}],256:[function(require,module,exports){
'use strict'; // B.2.3.2 String.prototype.anchor(name)

require('./_string-html')('anchor', function (createHTML) {
  return function anchor(name) {
    return createHTML(this, 'a', 'name', name);
  };
});

},{"./_string-html":131}],257:[function(require,module,exports){
'use strict'; // B.2.3.3 String.prototype.big()

require('./_string-html')('big', function (createHTML) {
  return function big() {
    return createHTML(this, 'big', '', '');
  };
});

},{"./_string-html":131}],258:[function(require,module,exports){
'use strict'; // B.2.3.4 String.prototype.blink()

require('./_string-html')('blink', function (createHTML) {
  return function blink() {
    return createHTML(this, 'blink', '', '');
  };
});

},{"./_string-html":131}],259:[function(require,module,exports){
'use strict'; // B.2.3.5 String.prototype.bold()

require('./_string-html')('bold', function (createHTML) {
  return function bold() {
    return createHTML(this, 'b', '', '');
  };
});

},{"./_string-html":131}],260:[function(require,module,exports){
'use strict';

var $export = require('./_export');

var $at = require('./_string-at')(false);

$export($export.P, 'String', {
  // 21.1.3.3 String.prototype.codePointAt(pos)
  codePointAt: function codePointAt(pos) {
    return $at(this, pos);
  }
});

},{"./_export":59,"./_string-at":129}],261:[function(require,module,exports){
// 21.1.3.6 String.prototype.endsWith(searchString [, endPosition])
'use strict';

var $export = require('./_export');

var toLength = require('./_to-length');

var context = require('./_string-context');

var ENDS_WITH = 'endsWith';
var $endsWith = ''[ENDS_WITH];
$export($export.P + $export.F * require('./_fails-is-regexp')(ENDS_WITH), 'String', {
  endsWith: function endsWith(searchString
  /* , endPosition = @length */
  ) {
    var that = context(this, searchString, ENDS_WITH);
    var endPosition = arguments.length > 1 ? arguments[1] : undefined;
    var len = toLength(that.length);
    var end = endPosition === undefined ? len : Math.min(toLength(endPosition), len);
    var search = String(searchString);
    return $endsWith ? $endsWith.call(that, search, end) : that.slice(end - search.length, end) === search;
  }
});

},{"./_export":59,"./_fails-is-regexp":60,"./_string-context":130,"./_to-length":141}],262:[function(require,module,exports){
'use strict'; // B.2.3.6 String.prototype.fixed()

require('./_string-html')('fixed', function (createHTML) {
  return function fixed() {
    return createHTML(this, 'tt', '', '');
  };
});

},{"./_string-html":131}],263:[function(require,module,exports){
'use strict'; // B.2.3.7 String.prototype.fontcolor(color)

require('./_string-html')('fontcolor', function (createHTML) {
  return function fontcolor(color) {
    return createHTML(this, 'font', 'color', color);
  };
});

},{"./_string-html":131}],264:[function(require,module,exports){
'use strict'; // B.2.3.8 String.prototype.fontsize(size)

require('./_string-html')('fontsize', function (createHTML) {
  return function fontsize(size) {
    return createHTML(this, 'font', 'size', size);
  };
});

},{"./_string-html":131}],265:[function(require,module,exports){
"use strict";

var $export = require('./_export');

var toAbsoluteIndex = require('./_to-absolute-index');

var fromCharCode = String.fromCharCode;
var $fromCodePoint = String.fromCodePoint; // length should be 1, old FF problem

$export($export.S + $export.F * (!!$fromCodePoint && $fromCodePoint.length != 1), 'String', {
  // 21.1.2.2 String.fromCodePoint(...codePoints)
  fromCodePoint: function fromCodePoint(x) {
    // eslint-disable-line no-unused-vars
    var res = [];
    var aLen = arguments.length;
    var i = 0;
    var code;

    while (aLen > i) {
      code = +arguments[i++];
      if (toAbsoluteIndex(code, 0x10ffff) !== code) throw RangeError(code + ' is not a valid code point');
      res.push(code < 0x10000 ? fromCharCode(code) : fromCharCode(((code -= 0x10000) >> 10) + 0xd800, code % 0x400 + 0xdc00));
    }

    return res.join('');
  }
});

},{"./_export":59,"./_to-absolute-index":137}],266:[function(require,module,exports){
// 21.1.3.7 String.prototype.includes(searchString, position = 0)
'use strict';

var $export = require('./_export');

var context = require('./_string-context');

var INCLUDES = 'includes';
$export($export.P + $export.F * require('./_fails-is-regexp')(INCLUDES), 'String', {
  includes: function includes(searchString
  /* , position = 0 */
  ) {
    return !!~context(this, searchString, INCLUDES).indexOf(searchString, arguments.length > 1 ? arguments[1] : undefined);
  }
});

},{"./_export":59,"./_fails-is-regexp":60,"./_string-context":130}],267:[function(require,module,exports){
'use strict'; // B.2.3.9 String.prototype.italics()

require('./_string-html')('italics', function (createHTML) {
  return function italics() {
    return createHTML(this, 'i', '', '');
  };
});

},{"./_string-html":131}],268:[function(require,module,exports){
'use strict';

var $at = require('./_string-at')(true); // 21.1.3.27 String.prototype[@@iterator]()


require('./_iter-define')(String, 'String', function (iterated) {
  this._t = String(iterated); // target

  this._i = 0; // next index
  // 21.1.5.2.1 %StringIteratorPrototype%.next()
}, function () {
  var O = this._t;
  var index = this._i;
  var point;
  if (index >= O.length) return {
    value: undefined,
    done: true
  };
  point = $at(O, index);
  this._i += point.length;
  return {
    value: point,
    done: false
  };
});

},{"./_iter-define":81,"./_string-at":129}],269:[function(require,module,exports){
'use strict'; // B.2.3.10 String.prototype.link(url)

require('./_string-html')('link', function (createHTML) {
  return function link(url) {
    return createHTML(this, 'a', 'href', url);
  };
});

},{"./_string-html":131}],270:[function(require,module,exports){
"use strict";

var $export = require('./_export');

var toIObject = require('./_to-iobject');

var toLength = require('./_to-length');

$export($export.S, 'String', {
  // 21.1.2.4 String.raw(callSite, ...substitutions)
  raw: function raw(callSite) {
    var tpl = toIObject(callSite.raw);
    var len = toLength(tpl.length);
    var aLen = arguments.length;
    var res = [];
    var i = 0;

    while (len > i) {
      res.push(String(tpl[i++]));
      if (i < aLen) res.push(String(arguments[i]));
    }

    return res.join('');
  }
});

},{"./_export":59,"./_to-iobject":140,"./_to-length":141}],271:[function(require,module,exports){
"use strict";

var $export = require('./_export');

$export($export.P, 'String', {
  // 21.1.3.13 String.prototype.repeat(count)
  repeat: require('./_string-repeat')
});

},{"./_export":59,"./_string-repeat":133}],272:[function(require,module,exports){
'use strict'; // B.2.3.11 String.prototype.small()

require('./_string-html')('small', function (createHTML) {
  return function small() {
    return createHTML(this, 'small', '', '');
  };
});

},{"./_string-html":131}],273:[function(require,module,exports){
// 21.1.3.18 String.prototype.startsWith(searchString [, position ])
'use strict';

var $export = require('./_export');

var toLength = require('./_to-length');

var context = require('./_string-context');

var STARTS_WITH = 'startsWith';
var $startsWith = ''[STARTS_WITH];
$export($export.P + $export.F * require('./_fails-is-regexp')(STARTS_WITH), 'String', {
  startsWith: function startsWith(searchString
  /* , position = 0 */
  ) {
    var that = context(this, searchString, STARTS_WITH);
    var index = toLength(Math.min(arguments.length > 1 ? arguments[1] : undefined, that.length));
    var search = String(searchString);
    return $startsWith ? $startsWith.call(that, search, index) : that.slice(index, index + search.length) === search;
  }
});

},{"./_export":59,"./_fails-is-regexp":60,"./_string-context":130,"./_to-length":141}],274:[function(require,module,exports){
'use strict'; // B.2.3.12 String.prototype.strike()

require('./_string-html')('strike', function (createHTML) {
  return function strike() {
    return createHTML(this, 'strike', '', '');
  };
});

},{"./_string-html":131}],275:[function(require,module,exports){
'use strict'; // B.2.3.13 String.prototype.sub()

require('./_string-html')('sub', function (createHTML) {
  return function sub() {
    return createHTML(this, 'sub', '', '');
  };
});

},{"./_string-html":131}],276:[function(require,module,exports){
'use strict'; // B.2.3.14 String.prototype.sup()

require('./_string-html')('sup', function (createHTML) {
  return function sup() {
    return createHTML(this, 'sup', '', '');
  };
});

},{"./_string-html":131}],277:[function(require,module,exports){
'use strict'; // 21.1.3.25 String.prototype.trim()

require('./_string-trim')('trim', function ($trim) {
  return function trim() {
    return $trim(this, 3);
  };
});

},{"./_string-trim":134}],278:[function(require,module,exports){
'use strict'; // ECMAScript 6 symbols shim

function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }

var global = require('./_global');

var has = require('./_has');

var DESCRIPTORS = require('./_descriptors');

var $export = require('./_export');

var redefine = require('./_redefine');

var META = require('./_meta').KEY;

var $fails = require('./_fails');

var shared = require('./_shared');

var setToStringTag = require('./_set-to-string-tag');

var uid = require('./_uid');

var wks = require('./_wks');

var wksExt = require('./_wks-ext');

var wksDefine = require('./_wks-define');

var enumKeys = require('./_enum-keys');

var isArray = require('./_is-array');

var anObject = require('./_an-object');

var isObject = require('./_is-object');

var toIObject = require('./_to-iobject');

var toPrimitive = require('./_to-primitive');

var createDesc = require('./_property-desc');

var _create = require('./_object-create');

var gOPNExt = require('./_object-gopn-ext');

var $GOPD = require('./_object-gopd');

var $DP = require('./_object-dp');

var $keys = require('./_object-keys');

var gOPD = $GOPD.f;
var dP = $DP.f;
var gOPN = gOPNExt.f;
var $Symbol = global.Symbol;
var $JSON = global.JSON;

var _stringify = $JSON && $JSON.stringify;

var PROTOTYPE = 'prototype';
var HIDDEN = wks('_hidden');
var TO_PRIMITIVE = wks('toPrimitive');
var isEnum = {}.propertyIsEnumerable;
var SymbolRegistry = shared('symbol-registry');
var AllSymbols = shared('symbols');
var OPSymbols = shared('op-symbols');
var ObjectProto = Object[PROTOTYPE];
var USE_NATIVE = typeof $Symbol == 'function';
var QObject = global.QObject; // Don't use setters in Qt Script, https://github.com/zloirock/core-js/issues/173

var setter = !QObject || !QObject[PROTOTYPE] || !QObject[PROTOTYPE].findChild; // fallback for old Android, https://code.google.com/p/v8/issues/detail?id=687

var setSymbolDesc = DESCRIPTORS && $fails(function () {
  return _create(dP({}, 'a', {
    get: function get() {
      return dP(this, 'a', {
        value: 7
      }).a;
    }
  })).a != 7;
}) ? function (it, key, D) {
  var protoDesc = gOPD(ObjectProto, key);
  if (protoDesc) delete ObjectProto[key];
  dP(it, key, D);
  if (protoDesc && it !== ObjectProto) dP(ObjectProto, key, protoDesc);
} : dP;

var wrap = function wrap(tag) {
  var sym = AllSymbols[tag] = _create($Symbol[PROTOTYPE]);

  sym._k = tag;
  return sym;
};

var isSymbol = USE_NATIVE && _typeof($Symbol.iterator) == 'symbol' ? function (it) {
  return _typeof(it) == 'symbol';
} : function (it) {
  return it instanceof $Symbol;
};

var $defineProperty = function defineProperty(it, key, D) {
  if (it === ObjectProto) $defineProperty(OPSymbols, key, D);
  anObject(it);
  key = toPrimitive(key, true);
  anObject(D);

  if (has(AllSymbols, key)) {
    if (!D.enumerable) {
      if (!has(it, HIDDEN)) dP(it, HIDDEN, createDesc(1, {}));
      it[HIDDEN][key] = true;
    } else {
      if (has(it, HIDDEN) && it[HIDDEN][key]) it[HIDDEN][key] = false;
      D = _create(D, {
        enumerable: createDesc(0, false)
      });
    }

    return setSymbolDesc(it, key, D);
  }

  return dP(it, key, D);
};

var $defineProperties = function defineProperties(it, P) {
  anObject(it);
  var keys = enumKeys(P = toIObject(P));
  var i = 0;
  var l = keys.length;
  var key;

  while (l > i) {
    $defineProperty(it, key = keys[i++], P[key]);
  }

  return it;
};

var $create = function create(it, P) {
  return P === undefined ? _create(it) : $defineProperties(_create(it), P);
};

var $propertyIsEnumerable = function propertyIsEnumerable(key) {
  var E = isEnum.call(this, key = toPrimitive(key, true));
  if (this === ObjectProto && has(AllSymbols, key) && !has(OPSymbols, key)) return false;
  return E || !has(this, key) || !has(AllSymbols, key) || has(this, HIDDEN) && this[HIDDEN][key] ? E : true;
};

var $getOwnPropertyDescriptor = function getOwnPropertyDescriptor(it, key) {
  it = toIObject(it);
  key = toPrimitive(key, true);
  if (it === ObjectProto && has(AllSymbols, key) && !has(OPSymbols, key)) return;
  var D = gOPD(it, key);
  if (D && has(AllSymbols, key) && !(has(it, HIDDEN) && it[HIDDEN][key])) D.enumerable = true;
  return D;
};

var $getOwnPropertyNames = function getOwnPropertyNames(it) {
  var names = gOPN(toIObject(it));
  var result = [];
  var i = 0;
  var key;

  while (names.length > i) {
    if (!has(AllSymbols, key = names[i++]) && key != HIDDEN && key != META) result.push(key);
  }

  return result;
};

var $getOwnPropertySymbols = function getOwnPropertySymbols(it) {
  var IS_OP = it === ObjectProto;
  var names = gOPN(IS_OP ? OPSymbols : toIObject(it));
  var result = [];
  var i = 0;
  var key;

  while (names.length > i) {
    if (has(AllSymbols, key = names[i++]) && (IS_OP ? has(ObjectProto, key) : true)) result.push(AllSymbols[key]);
  }

  return result;
}; // 19.4.1.1 Symbol([description])


if (!USE_NATIVE) {
  $Symbol = function _Symbol() {
    if (this instanceof $Symbol) throw TypeError('Symbol is not a constructor!');
    var tag = uid(arguments.length > 0 ? arguments[0] : undefined);

    var $set = function $set(value) {
      if (this === ObjectProto) $set.call(OPSymbols, value);
      if (has(this, HIDDEN) && has(this[HIDDEN], tag)) this[HIDDEN][tag] = false;
      setSymbolDesc(this, tag, createDesc(1, value));
    };

    if (DESCRIPTORS && setter) setSymbolDesc(ObjectProto, tag, {
      configurable: true,
      set: $set
    });
    return wrap(tag);
  };

  redefine($Symbol[PROTOTYPE], 'toString', function toString() {
    return this._k;
  });
  $GOPD.f = $getOwnPropertyDescriptor;
  $DP.f = $defineProperty;
  require('./_object-gopn').f = gOPNExt.f = $getOwnPropertyNames;
  require('./_object-pie').f = $propertyIsEnumerable;
  require('./_object-gops').f = $getOwnPropertySymbols;

  if (DESCRIPTORS && !require('./_library')) {
    redefine(ObjectProto, 'propertyIsEnumerable', $propertyIsEnumerable, true);
  }

  wksExt.f = function (name) {
    return wrap(wks(name));
  };
}

$export($export.G + $export.W + $export.F * !USE_NATIVE, {
  Symbol: $Symbol
});

for (var es6Symbols = // 19.4.2.2, 19.4.2.3, 19.4.2.4, 19.4.2.6, 19.4.2.8, 19.4.2.9, 19.4.2.10, 19.4.2.11, 19.4.2.12, 19.4.2.13, 19.4.2.14
'hasInstance,isConcatSpreadable,iterator,match,replace,search,species,split,toPrimitive,toStringTag,unscopables'.split(','), j = 0; es6Symbols.length > j;) {
  wks(es6Symbols[j++]);
}

for (var wellKnownSymbols = $keys(wks.store), k = 0; wellKnownSymbols.length > k;) {
  wksDefine(wellKnownSymbols[k++]);
}

$export($export.S + $export.F * !USE_NATIVE, 'Symbol', {
  // 19.4.2.1 Symbol.for(key)
  'for': function _for(key) {
    return has(SymbolRegistry, key += '') ? SymbolRegistry[key] : SymbolRegistry[key] = $Symbol(key);
  },
  // 19.4.2.5 Symbol.keyFor(sym)
  keyFor: function keyFor(sym) {
    if (!isSymbol(sym)) throw TypeError(sym + ' is not a symbol!');

    for (var key in SymbolRegistry) {
      if (SymbolRegistry[key] === sym) return key;
    }
  },
  useSetter: function useSetter() {
    setter = true;
  },
  useSimple: function useSimple() {
    setter = false;
  }
});
$export($export.S + $export.F * !USE_NATIVE, 'Object', {
  // 19.1.2.2 Object.create(O [, Properties])
  create: $create,
  // 19.1.2.4 Object.defineProperty(O, P, Attributes)
  defineProperty: $defineProperty,
  // 19.1.2.3 Object.defineProperties(O, Properties)
  defineProperties: $defineProperties,
  // 19.1.2.6 Object.getOwnPropertyDescriptor(O, P)
  getOwnPropertyDescriptor: $getOwnPropertyDescriptor,
  // 19.1.2.7 Object.getOwnPropertyNames(O)
  getOwnPropertyNames: $getOwnPropertyNames,
  // 19.1.2.8 Object.getOwnPropertySymbols(O)
  getOwnPropertySymbols: $getOwnPropertySymbols
}); // 24.3.2 JSON.stringify(value [, replacer [, space]])

$JSON && $export($export.S + $export.F * (!USE_NATIVE || $fails(function () {
  var S = $Symbol(); // MS Edge converts symbol values to JSON as {}
  // WebKit converts symbol values to JSON as null
  // V8 throws on boxed symbols

  return _stringify([S]) != '[null]' || _stringify({
    a: S
  }) != '{}' || _stringify(Object(S)) != '{}';
})), 'JSON', {
  stringify: function stringify(it) {
    var args = [it];
    var i = 1;
    var replacer, $replacer;

    while (arguments.length > i) {
      args.push(arguments[i++]);
    }

    $replacer = replacer = args[1];
    if (!isObject(replacer) && it === undefined || isSymbol(it)) return; // IE8 returns string on undefined

    if (!isArray(replacer)) replacer = function replacer(key, value) {
      if (typeof $replacer == 'function') value = $replacer.call(this, key, value);
      if (!isSymbol(value)) return value;
    };
    args[1] = replacer;
    return _stringify.apply($JSON, args);
  }
}); // 19.4.3.4 Symbol.prototype[@@toPrimitive](hint)

$Symbol[PROTOTYPE][TO_PRIMITIVE] || require('./_hide')($Symbol[PROTOTYPE], TO_PRIMITIVE, $Symbol[PROTOTYPE].valueOf); // 19.4.3.5 Symbol.prototype[@@toStringTag]

setToStringTag($Symbol, 'Symbol'); // 20.2.1.9 Math[@@toStringTag]

setToStringTag(Math, 'Math', true); // 24.3.3 JSON[@@toStringTag]

setToStringTag(global.JSON, 'JSON', true);

},{"./_an-object":33,"./_descriptors":55,"./_enum-keys":58,"./_export":59,"./_fails":61,"./_global":66,"./_has":67,"./_hide":68,"./_is-array":75,"./_is-object":77,"./_library":85,"./_meta":91,"./_object-create":96,"./_object-dp":97,"./_object-gopd":100,"./_object-gopn":102,"./_object-gopn-ext":101,"./_object-gops":103,"./_object-keys":106,"./_object-pie":107,"./_property-desc":115,"./_redefine":117,"./_set-to-string-tag":124,"./_shared":126,"./_to-iobject":140,"./_to-primitive":143,"./_uid":147,"./_wks":152,"./_wks-define":150,"./_wks-ext":151}],279:[function(require,module,exports){
'use strict';

var $export = require('./_export');

var $typed = require('./_typed');

var buffer = require('./_typed-buffer');

var anObject = require('./_an-object');

var toAbsoluteIndex = require('./_to-absolute-index');

var toLength = require('./_to-length');

var isObject = require('./_is-object');

var ArrayBuffer = require('./_global').ArrayBuffer;

var speciesConstructor = require('./_species-constructor');

var $ArrayBuffer = buffer.ArrayBuffer;
var $DataView = buffer.DataView;
var $isView = $typed.ABV && ArrayBuffer.isView;
var $slice = $ArrayBuffer.prototype.slice;
var VIEW = $typed.VIEW;
var ARRAY_BUFFER = 'ArrayBuffer';
$export($export.G + $export.W + $export.F * (ArrayBuffer !== $ArrayBuffer), {
  ArrayBuffer: $ArrayBuffer
});
$export($export.S + $export.F * !$typed.CONSTR, ARRAY_BUFFER, {
  // 24.1.3.1 ArrayBuffer.isView(arg)
  isView: function isView(it) {
    return $isView && $isView(it) || isObject(it) && VIEW in it;
  }
});
$export($export.P + $export.U + $export.F * require('./_fails')(function () {
  return !new $ArrayBuffer(2).slice(1, undefined).byteLength;
}), ARRAY_BUFFER, {
  // 24.1.4.3 ArrayBuffer.prototype.slice(start, end)
  slice: function slice(start, end) {
    if ($slice !== undefined && end === undefined) return $slice.call(anObject(this), start); // FF fix

    var len = anObject(this).byteLength;
    var first = toAbsoluteIndex(start, len);

    var _final = toAbsoluteIndex(end === undefined ? len : end, len);

    var result = new (speciesConstructor(this, $ArrayBuffer))(toLength(_final - first));
    var viewS = new $DataView(this);
    var viewT = new $DataView(result);
    var index = 0;

    while (first < _final) {
      viewT.setUint8(index++, viewS.getUint8(first++));
    }

    return result;
  }
});

require('./_set-species')(ARRAY_BUFFER);

},{"./_an-object":33,"./_export":59,"./_fails":61,"./_global":66,"./_is-object":77,"./_set-species":123,"./_species-constructor":127,"./_to-absolute-index":137,"./_to-length":141,"./_typed":146,"./_typed-buffer":145}],280:[function(require,module,exports){
"use strict";

var $export = require('./_export');

$export($export.G + $export.W + $export.F * !require('./_typed').ABV, {
  DataView: require('./_typed-buffer').DataView
});

},{"./_export":59,"./_typed":146,"./_typed-buffer":145}],281:[function(require,module,exports){
"use strict";

require('./_typed-array')('Float32', 4, function (init) {
  return function Float32Array(data, byteOffset, length) {
    return init(this, data, byteOffset, length);
  };
});

},{"./_typed-array":144}],282:[function(require,module,exports){
"use strict";

require('./_typed-array')('Float64', 8, function (init) {
  return function Float64Array(data, byteOffset, length) {
    return init(this, data, byteOffset, length);
  };
});

},{"./_typed-array":144}],283:[function(require,module,exports){
"use strict";

require('./_typed-array')('Int16', 2, function (init) {
  return function Int16Array(data, byteOffset, length) {
    return init(this, data, byteOffset, length);
  };
});

},{"./_typed-array":144}],284:[function(require,module,exports){
"use strict";

require('./_typed-array')('Int32', 4, function (init) {
  return function Int32Array(data, byteOffset, length) {
    return init(this, data, byteOffset, length);
  };
});

},{"./_typed-array":144}],285:[function(require,module,exports){
"use strict";

require('./_typed-array')('Int8', 1, function (init) {
  return function Int8Array(data, byteOffset, length) {
    return init(this, data, byteOffset, length);
  };
});

},{"./_typed-array":144}],286:[function(require,module,exports){
"use strict";

require('./_typed-array')('Uint16', 2, function (init) {
  return function Uint16Array(data, byteOffset, length) {
    return init(this, data, byteOffset, length);
  };
});

},{"./_typed-array":144}],287:[function(require,module,exports){
"use strict";

require('./_typed-array')('Uint32', 4, function (init) {
  return function Uint32Array(data, byteOffset, length) {
    return init(this, data, byteOffset, length);
  };
});

},{"./_typed-array":144}],288:[function(require,module,exports){
"use strict";

require('./_typed-array')('Uint8', 1, function (init) {
  return function Uint8Array(data, byteOffset, length) {
    return init(this, data, byteOffset, length);
  };
});

},{"./_typed-array":144}],289:[function(require,module,exports){
"use strict";

require('./_typed-array')('Uint8', 1, function (init) {
  return function Uint8ClampedArray(data, byteOffset, length) {
    return init(this, data, byteOffset, length);
  };
}, true);

},{"./_typed-array":144}],290:[function(require,module,exports){
'use strict';

var each = require('./_array-methods')(0);

var redefine = require('./_redefine');

var meta = require('./_meta');

var assign = require('./_object-assign');

var weak = require('./_collection-weak');

var isObject = require('./_is-object');

var fails = require('./_fails');

var validate = require('./_validate-collection');

var WEAK_MAP = 'WeakMap';
var getWeak = meta.getWeak;
var isExtensible = Object.isExtensible;
var uncaughtFrozenStore = weak.ufstore;
var tmp = {};
var InternalMap;

var wrapper = function wrapper(get) {
  return function WeakMap() {
    return get(this, arguments.length > 0 ? arguments[0] : undefined);
  };
};

var methods = {
  // 23.3.3.3 WeakMap.prototype.get(key)
  get: function get(key) {
    if (isObject(key)) {
      var data = getWeak(key);
      if (data === true) return uncaughtFrozenStore(validate(this, WEAK_MAP)).get(key);
      return data ? data[this._i] : undefined;
    }
  },
  // 23.3.3.5 WeakMap.prototype.set(key, value)
  set: function set(key, value) {
    return weak.def(validate(this, WEAK_MAP), key, value);
  }
}; // 23.3 WeakMap Objects

var $WeakMap = module.exports = require('./_collection')(WEAK_MAP, wrapper, methods, weak, true, true); // IE11 WeakMap frozen keys fix


if (fails(function () {
  return new $WeakMap().set((Object.freeze || Object)(tmp), 7).get(tmp) != 7;
})) {
  InternalMap = weak.getConstructor(wrapper, WEAK_MAP);
  assign(InternalMap.prototype, methods);
  meta.NEED = true;
  each(['delete', 'has', 'get', 'set'], function (key) {
    var proto = $WeakMap.prototype;
    var method = proto[key];
    redefine(proto, key, function (a, b) {
      // store frozen objects on internal weakmap shim
      if (isObject(a) && !isExtensible(a)) {
        if (!this._f) this._f = new InternalMap();

        var result = this._f[key](a, b);

        return key == 'set' ? this : result; // store all the rest on native weakmap
      }

      return method.call(this, a, b);
    });
  });
}

},{"./_array-methods":38,"./_collection":48,"./_collection-weak":47,"./_fails":61,"./_is-object":77,"./_meta":91,"./_object-assign":95,"./_redefine":117,"./_validate-collection":149}],291:[function(require,module,exports){
'use strict';

var weak = require('./_collection-weak');

var validate = require('./_validate-collection');

var WEAK_SET = 'WeakSet'; // 23.4 WeakSet Objects

require('./_collection')(WEAK_SET, function (get) {
  return function WeakSet() {
    return get(this, arguments.length > 0 ? arguments[0] : undefined);
  };
}, {
  // 23.4.3.1 WeakSet.prototype.add(value)
  add: function add(value) {
    return weak.def(validate(this, WEAK_SET), value, true);
  }
}, weak, false, true);

},{"./_collection":48,"./_collection-weak":47,"./_validate-collection":149}],292:[function(require,module,exports){
'use strict'; // https://tc39.github.io/proposal-flatMap/#sec-Array.prototype.flatMap

var $export = require('./_export');

var flattenIntoArray = require('./_flatten-into-array');

var toObject = require('./_to-object');

var toLength = require('./_to-length');

var aFunction = require('./_a-function');

var arraySpeciesCreate = require('./_array-species-create');

$export($export.P, 'Array', {
  flatMap: function flatMap(callbackfn
  /* , thisArg */
  ) {
    var O = toObject(this);
    var sourceLen, A;
    aFunction(callbackfn);
    sourceLen = toLength(O.length);
    A = arraySpeciesCreate(O, 0);
    flattenIntoArray(A, O, O, sourceLen, 0, 1, callbackfn, arguments[1]);
    return A;
  }
});

require('./_add-to-unscopables')('flatMap');

},{"./_a-function":29,"./_add-to-unscopables":31,"./_array-species-create":41,"./_export":59,"./_flatten-into-array":64,"./_to-length":141,"./_to-object":142}],293:[function(require,module,exports){
'use strict'; // https://tc39.github.io/proposal-flatMap/#sec-Array.prototype.flatten

var $export = require('./_export');

var flattenIntoArray = require('./_flatten-into-array');

var toObject = require('./_to-object');

var toLength = require('./_to-length');

var toInteger = require('./_to-integer');

var arraySpeciesCreate = require('./_array-species-create');

$export($export.P, 'Array', {
  flatten: function flatten()
  /* depthArg = 1 */
  {
    var depthArg = arguments[0];
    var O = toObject(this);
    var sourceLen = toLength(O.length);
    var A = arraySpeciesCreate(O, 0);
    flattenIntoArray(A, O, O, sourceLen, 0, depthArg === undefined ? 1 : toInteger(depthArg));
    return A;
  }
});

require('./_add-to-unscopables')('flatten');

},{"./_add-to-unscopables":31,"./_array-species-create":41,"./_export":59,"./_flatten-into-array":64,"./_to-integer":139,"./_to-length":141,"./_to-object":142}],294:[function(require,module,exports){
'use strict'; // https://github.com/tc39/Array.prototype.includes

var $export = require('./_export');

var $includes = require('./_array-includes')(true);

$export($export.P, 'Array', {
  includes: function includes(el
  /* , fromIndex = 0 */
  ) {
    return $includes(this, el, arguments.length > 1 ? arguments[1] : undefined);
  }
});

require('./_add-to-unscopables')('includes');

},{"./_add-to-unscopables":31,"./_array-includes":37,"./_export":59}],295:[function(require,module,exports){
"use strict";

// https://github.com/rwaldron/tc39-notes/blob/master/es6/2014-09/sept-25.md#510-globalasap-for-enqueuing-a-microtask
var $export = require('./_export');

var microtask = require('./_microtask')();

var process = require('./_global').process;

var isNode = require('./_cof')(process) == 'process';
$export($export.G, {
  asap: function asap(fn) {
    var domain = isNode && process.domain;
    microtask(domain ? domain.bind(fn) : fn);
  }
});

},{"./_cof":44,"./_export":59,"./_global":66,"./_microtask":93}],296:[function(require,module,exports){
"use strict";

// https://github.com/ljharb/proposal-is-error
var $export = require('./_export');

var cof = require('./_cof');

$export($export.S, 'Error', {
  isError: function isError(it) {
    return cof(it) === 'Error';
  }
});

},{"./_cof":44,"./_export":59}],297:[function(require,module,exports){
"use strict";

// https://github.com/tc39/proposal-global
var $export = require('./_export');

$export($export.G, {
  global: require('./_global')
});

},{"./_export":59,"./_global":66}],298:[function(require,module,exports){
"use strict";

// https://tc39.github.io/proposal-setmap-offrom/#sec-map.from
require('./_set-collection-from')('Map');

},{"./_set-collection-from":120}],299:[function(require,module,exports){
"use strict";

// https://tc39.github.io/proposal-setmap-offrom/#sec-map.of
require('./_set-collection-of')('Map');

},{"./_set-collection-of":121}],300:[function(require,module,exports){
"use strict";

// https://github.com/DavidBruant/Map-Set.prototype.toJSON
var $export = require('./_export');

$export($export.P + $export.R, 'Map', {
  toJSON: require('./_collection-to-json')('Map')
});

},{"./_collection-to-json":46,"./_export":59}],301:[function(require,module,exports){
"use strict";

// https://rwaldron.github.io/proposal-math-extensions/
var $export = require('./_export');

$export($export.S, 'Math', {
  clamp: function clamp(x, lower, upper) {
    return Math.min(upper, Math.max(lower, x));
  }
});

},{"./_export":59}],302:[function(require,module,exports){
"use strict";

// https://rwaldron.github.io/proposal-math-extensions/
var $export = require('./_export');

$export($export.S, 'Math', {
  DEG_PER_RAD: Math.PI / 180
});

},{"./_export":59}],303:[function(require,module,exports){
"use strict";

// https://rwaldron.github.io/proposal-math-extensions/
var $export = require('./_export');

var RAD_PER_DEG = 180 / Math.PI;
$export($export.S, 'Math', {
  degrees: function degrees(radians) {
    return radians * RAD_PER_DEG;
  }
});

},{"./_export":59}],304:[function(require,module,exports){
"use strict";

// https://rwaldron.github.io/proposal-math-extensions/
var $export = require('./_export');

var scale = require('./_math-scale');

var fround = require('./_math-fround');

$export($export.S, 'Math', {
  fscale: function fscale(x, inLow, inHigh, outLow, outHigh) {
    return fround(scale(x, inLow, inHigh, outLow, outHigh));
  }
});

},{"./_export":59,"./_math-fround":87,"./_math-scale":89}],305:[function(require,module,exports){
"use strict";

// https://gist.github.com/BrendanEich/4294d5c212a6d2254703
var $export = require('./_export');

$export($export.S, 'Math', {
  iaddh: function iaddh(x0, x1, y0, y1) {
    var $x0 = x0 >>> 0;
    var $x1 = x1 >>> 0;
    var $y0 = y0 >>> 0;
    return $x1 + (y1 >>> 0) + (($x0 & $y0 | ($x0 | $y0) & ~($x0 + $y0 >>> 0)) >>> 31) | 0;
  }
});

},{"./_export":59}],306:[function(require,module,exports){
"use strict";

// https://gist.github.com/BrendanEich/4294d5c212a6d2254703
var $export = require('./_export');

$export($export.S, 'Math', {
  imulh: function imulh(u, v) {
    var UINT16 = 0xffff;
    var $u = +u;
    var $v = +v;
    var u0 = $u & UINT16;
    var v0 = $v & UINT16;
    var u1 = $u >> 16;
    var v1 = $v >> 16;
    var t = (u1 * v0 >>> 0) + (u0 * v0 >>> 16);
    return u1 * v1 + (t >> 16) + ((u0 * v1 >>> 0) + (t & UINT16) >> 16);
  }
});

},{"./_export":59}],307:[function(require,module,exports){
"use strict";

// https://gist.github.com/BrendanEich/4294d5c212a6d2254703
var $export = require('./_export');

$export($export.S, 'Math', {
  isubh: function isubh(x0, x1, y0, y1) {
    var $x0 = x0 >>> 0;
    var $x1 = x1 >>> 0;
    var $y0 = y0 >>> 0;
    return $x1 - (y1 >>> 0) - ((~$x0 & $y0 | ~($x0 ^ $y0) & $x0 - $y0 >>> 0) >>> 31) | 0;
  }
});

},{"./_export":59}],308:[function(require,module,exports){
"use strict";

// https://rwaldron.github.io/proposal-math-extensions/
var $export = require('./_export');

$export($export.S, 'Math', {
  RAD_PER_DEG: 180 / Math.PI
});

},{"./_export":59}],309:[function(require,module,exports){
"use strict";

// https://rwaldron.github.io/proposal-math-extensions/
var $export = require('./_export');

var DEG_PER_RAD = Math.PI / 180;
$export($export.S, 'Math', {
  radians: function radians(degrees) {
    return degrees * DEG_PER_RAD;
  }
});

},{"./_export":59}],310:[function(require,module,exports){
"use strict";

// https://rwaldron.github.io/proposal-math-extensions/
var $export = require('./_export');

$export($export.S, 'Math', {
  scale: require('./_math-scale')
});

},{"./_export":59,"./_math-scale":89}],311:[function(require,module,exports){
"use strict";

// http://jfbastien.github.io/papers/Math.signbit.html
var $export = require('./_export');

$export($export.S, 'Math', {
  signbit: function signbit(x) {
    // eslint-disable-next-line no-self-compare
    return (x = +x) != x ? x : x == 0 ? 1 / x == Infinity : x > 0;
  }
});

},{"./_export":59}],312:[function(require,module,exports){
"use strict";

// https://gist.github.com/BrendanEich/4294d5c212a6d2254703
var $export = require('./_export');

$export($export.S, 'Math', {
  umulh: function umulh(u, v) {
    var UINT16 = 0xffff;
    var $u = +u;
    var $v = +v;
    var u0 = $u & UINT16;
    var v0 = $v & UINT16;
    var u1 = $u >>> 16;
    var v1 = $v >>> 16;
    var t = (u1 * v0 >>> 0) + (u0 * v0 >>> 16);
    return u1 * v1 + (t >>> 16) + ((u0 * v1 >>> 0) + (t & UINT16) >>> 16);
  }
});

},{"./_export":59}],313:[function(require,module,exports){
'use strict';

var $export = require('./_export');

var toObject = require('./_to-object');

var aFunction = require('./_a-function');

var $defineProperty = require('./_object-dp'); // B.2.2.2 Object.prototype.__defineGetter__(P, getter)


require('./_descriptors') && $export($export.P + require('./_object-forced-pam'), 'Object', {
  __defineGetter__: function __defineGetter__(P, getter) {
    $defineProperty.f(toObject(this), P, {
      get: aFunction(getter),
      enumerable: true,
      configurable: true
    });
  }
});

},{"./_a-function":29,"./_descriptors":55,"./_export":59,"./_object-dp":97,"./_object-forced-pam":99,"./_to-object":142}],314:[function(require,module,exports){
'use strict';

var $export = require('./_export');

var toObject = require('./_to-object');

var aFunction = require('./_a-function');

var $defineProperty = require('./_object-dp'); // B.2.2.3 Object.prototype.__defineSetter__(P, setter)


require('./_descriptors') && $export($export.P + require('./_object-forced-pam'), 'Object', {
  __defineSetter__: function __defineSetter__(P, setter) {
    $defineProperty.f(toObject(this), P, {
      set: aFunction(setter),
      enumerable: true,
      configurable: true
    });
  }
});

},{"./_a-function":29,"./_descriptors":55,"./_export":59,"./_object-dp":97,"./_object-forced-pam":99,"./_to-object":142}],315:[function(require,module,exports){
"use strict";

// https://github.com/tc39/proposal-object-values-entries
var $export = require('./_export');

var $entries = require('./_object-to-array')(true);

$export($export.S, 'Object', {
  entries: function entries(it) {
    return $entries(it);
  }
});

},{"./_export":59,"./_object-to-array":109}],316:[function(require,module,exports){
"use strict";

// https://github.com/tc39/proposal-object-getownpropertydescriptors
var $export = require('./_export');

var ownKeys = require('./_own-keys');

var toIObject = require('./_to-iobject');

var gOPD = require('./_object-gopd');

var createProperty = require('./_create-property');

$export($export.S, 'Object', {
  getOwnPropertyDescriptors: function getOwnPropertyDescriptors(object) {
    var O = toIObject(object);
    var getDesc = gOPD.f;
    var keys = ownKeys(O);
    var result = {};
    var i = 0;
    var key, desc;

    while (keys.length > i) {
      desc = getDesc(O, key = keys[i++]);
      if (desc !== undefined) createProperty(result, key, desc);
    }

    return result;
  }
});

},{"./_create-property":50,"./_export":59,"./_object-gopd":100,"./_own-keys":110,"./_to-iobject":140}],317:[function(require,module,exports){
'use strict';

var $export = require('./_export');

var toObject = require('./_to-object');

var toPrimitive = require('./_to-primitive');

var getPrototypeOf = require('./_object-gpo');

var getOwnPropertyDescriptor = require('./_object-gopd').f; // B.2.2.4 Object.prototype.__lookupGetter__(P)


require('./_descriptors') && $export($export.P + require('./_object-forced-pam'), 'Object', {
  __lookupGetter__: function __lookupGetter__(P) {
    var O = toObject(this);
    var K = toPrimitive(P, true);
    var D;

    do {
      if (D = getOwnPropertyDescriptor(O, K)) return D.get;
    } while (O = getPrototypeOf(O));
  }
});

},{"./_descriptors":55,"./_export":59,"./_object-forced-pam":99,"./_object-gopd":100,"./_object-gpo":104,"./_to-object":142,"./_to-primitive":143}],318:[function(require,module,exports){
'use strict';

var $export = require('./_export');

var toObject = require('./_to-object');

var toPrimitive = require('./_to-primitive');

var getPrototypeOf = require('./_object-gpo');

var getOwnPropertyDescriptor = require('./_object-gopd').f; // B.2.2.5 Object.prototype.__lookupSetter__(P)


require('./_descriptors') && $export($export.P + require('./_object-forced-pam'), 'Object', {
  __lookupSetter__: function __lookupSetter__(P) {
    var O = toObject(this);
    var K = toPrimitive(P, true);
    var D;

    do {
      if (D = getOwnPropertyDescriptor(O, K)) return D.set;
    } while (O = getPrototypeOf(O));
  }
});

},{"./_descriptors":55,"./_export":59,"./_object-forced-pam":99,"./_object-gopd":100,"./_object-gpo":104,"./_to-object":142,"./_to-primitive":143}],319:[function(require,module,exports){
"use strict";

// https://github.com/tc39/proposal-object-values-entries
var $export = require('./_export');

var $values = require('./_object-to-array')(false);

$export($export.S, 'Object', {
  values: function values(it) {
    return $values(it);
  }
});

},{"./_export":59,"./_object-to-array":109}],320:[function(require,module,exports){
'use strict'; // https://github.com/zenparsing/es-observable

var $export = require('./_export');

var global = require('./_global');

var core = require('./_core');

var microtask = require('./_microtask')();

var OBSERVABLE = require('./_wks')('observable');

var aFunction = require('./_a-function');

var anObject = require('./_an-object');

var anInstance = require('./_an-instance');

var redefineAll = require('./_redefine-all');

var hide = require('./_hide');

var forOf = require('./_for-of');

var RETURN = forOf.RETURN;

var getMethod = function getMethod(fn) {
  return fn == null ? undefined : aFunction(fn);
};

var cleanupSubscription = function cleanupSubscription(subscription) {
  var cleanup = subscription._c;

  if (cleanup) {
    subscription._c = undefined;
    cleanup();
  }
};

var subscriptionClosed = function subscriptionClosed(subscription) {
  return subscription._o === undefined;
};

var closeSubscription = function closeSubscription(subscription) {
  if (!subscriptionClosed(subscription)) {
    subscription._o = undefined;
    cleanupSubscription(subscription);
  }
};

var Subscription = function Subscription(observer, subscriber) {
  anObject(observer);
  this._c = undefined;
  this._o = observer;
  observer = new SubscriptionObserver(this);

  try {
    var cleanup = subscriber(observer);
    var subscription = cleanup;

    if (cleanup != null) {
      if (typeof cleanup.unsubscribe === 'function') cleanup = function cleanup() {
        subscription.unsubscribe();
      };else aFunction(cleanup);
      this._c = cleanup;
    }
  } catch (e) {
    observer.error(e);
    return;
  }

  if (subscriptionClosed(this)) cleanupSubscription(this);
};

Subscription.prototype = redefineAll({}, {
  unsubscribe: function unsubscribe() {
    closeSubscription(this);
  }
});

var SubscriptionObserver = function SubscriptionObserver(subscription) {
  this._s = subscription;
};

SubscriptionObserver.prototype = redefineAll({}, {
  next: function next(value) {
    var subscription = this._s;

    if (!subscriptionClosed(subscription)) {
      var observer = subscription._o;

      try {
        var m = getMethod(observer.next);
        if (m) return m.call(observer, value);
      } catch (e) {
        try {
          closeSubscription(subscription);
        } finally {
          throw e;
        }
      }
    }
  },
  error: function error(value) {
    var subscription = this._s;
    if (subscriptionClosed(subscription)) throw value;
    var observer = subscription._o;
    subscription._o = undefined;

    try {
      var m = getMethod(observer.error);
      if (!m) throw value;
      value = m.call(observer, value);
    } catch (e) {
      try {
        cleanupSubscription(subscription);
      } finally {
        throw e;
      }
    }

    cleanupSubscription(subscription);
    return value;
  },
  complete: function complete(value) {
    var subscription = this._s;

    if (!subscriptionClosed(subscription)) {
      var observer = subscription._o;
      subscription._o = undefined;

      try {
        var m = getMethod(observer.complete);
        value = m ? m.call(observer, value) : undefined;
      } catch (e) {
        try {
          cleanupSubscription(subscription);
        } finally {
          throw e;
        }
      }

      cleanupSubscription(subscription);
      return value;
    }
  }
});

var $Observable = function Observable(subscriber) {
  anInstance(this, $Observable, 'Observable', '_f')._f = aFunction(subscriber);
};

redefineAll($Observable.prototype, {
  subscribe: function subscribe(observer) {
    return new Subscription(observer, this._f);
  },
  forEach: function forEach(fn) {
    var that = this;
    return new (core.Promise || global.Promise)(function (resolve, reject) {
      aFunction(fn);
      var subscription = that.subscribe({
        next: function next(value) {
          try {
            return fn(value);
          } catch (e) {
            reject(e);
            subscription.unsubscribe();
          }
        },
        error: reject,
        complete: resolve
      });
    });
  }
});
redefineAll($Observable, {
  from: function from(x) {
    var C = typeof this === 'function' ? this : $Observable;
    var method = getMethod(anObject(x)[OBSERVABLE]);

    if (method) {
      var observable = anObject(method.call(x));
      return observable.constructor === C ? observable : new C(function (observer) {
        return observable.subscribe(observer);
      });
    }

    return new C(function (observer) {
      var done = false;
      microtask(function () {
        if (!done) {
          try {
            if (forOf(x, false, function (it) {
              observer.next(it);
              if (done) return RETURN;
            }) === RETURN) return;
          } catch (e) {
            if (done) throw e;
            observer.error(e);
            return;
          }

          observer.complete();
        }
      });
      return function () {
        done = true;
      };
    });
  },
  of: function of() {
    for (var i = 0, l = arguments.length, items = new Array(l); i < l;) {
      items[i] = arguments[i++];
    }

    return new (typeof this === 'function' ? this : $Observable)(function (observer) {
      var done = false;
      microtask(function () {
        if (!done) {
          for (var j = 0; j < items.length; ++j) {
            observer.next(items[j]);
            if (done) return;
          }

          observer.complete();
        }
      });
      return function () {
        done = true;
      };
    });
  }
});
hide($Observable.prototype, OBSERVABLE, function () {
  return this;
});
$export($export.G, {
  Observable: $Observable
});

require('./_set-species')('Observable');

},{"./_a-function":29,"./_an-instance":32,"./_an-object":33,"./_core":49,"./_export":59,"./_for-of":65,"./_global":66,"./_hide":68,"./_microtask":93,"./_redefine-all":116,"./_set-species":123,"./_wks":152}],321:[function(require,module,exports){
// https://github.com/tc39/proposal-promise-finally
'use strict';

var $export = require('./_export');

var core = require('./_core');

var global = require('./_global');

var speciesConstructor = require('./_species-constructor');

var promiseResolve = require('./_promise-resolve');

$export($export.P + $export.R, 'Promise', {
  'finally': function _finally(onFinally) {
    var C = speciesConstructor(this, core.Promise || global.Promise);
    var isFunction = typeof onFinally == 'function';
    return this.then(isFunction ? function (x) {
      return promiseResolve(C, onFinally()).then(function () {
        return x;
      });
    } : onFinally, isFunction ? function (e) {
      return promiseResolve(C, onFinally()).then(function () {
        throw e;
      });
    } : onFinally);
  }
});

},{"./_core":49,"./_export":59,"./_global":66,"./_promise-resolve":114,"./_species-constructor":127}],322:[function(require,module,exports){
'use strict'; // https://github.com/tc39/proposal-promise-try

var $export = require('./_export');

var newPromiseCapability = require('./_new-promise-capability');

var perform = require('./_perform');

$export($export.S, 'Promise', {
  'try': function _try(callbackfn) {
    var promiseCapability = newPromiseCapability.f(this);
    var result = perform(callbackfn);
    (result.e ? promiseCapability.reject : promiseCapability.resolve)(result.v);
    return promiseCapability.promise;
  }
});

},{"./_export":59,"./_new-promise-capability":94,"./_perform":113}],323:[function(require,module,exports){
"use strict";

var metadata = require('./_metadata');

var anObject = require('./_an-object');

var toMetaKey = metadata.key;
var ordinaryDefineOwnMetadata = metadata.set;
metadata.exp({
  defineMetadata: function defineMetadata(metadataKey, metadataValue, target, targetKey) {
    ordinaryDefineOwnMetadata(metadataKey, metadataValue, anObject(target), toMetaKey(targetKey));
  }
});

},{"./_an-object":33,"./_metadata":92}],324:[function(require,module,exports){
"use strict";

var metadata = require('./_metadata');

var anObject = require('./_an-object');

var toMetaKey = metadata.key;
var getOrCreateMetadataMap = metadata.map;
var store = metadata.store;
metadata.exp({
  deleteMetadata: function deleteMetadata(metadataKey, target
  /* , targetKey */
  ) {
    var targetKey = arguments.length < 3 ? undefined : toMetaKey(arguments[2]);
    var metadataMap = getOrCreateMetadataMap(anObject(target), targetKey, false);
    if (metadataMap === undefined || !metadataMap['delete'](metadataKey)) return false;
    if (metadataMap.size) return true;
    var targetMetadata = store.get(target);
    targetMetadata['delete'](targetKey);
    return !!targetMetadata.size || store['delete'](target);
  }
});

},{"./_an-object":33,"./_metadata":92}],325:[function(require,module,exports){
"use strict";

var Set = require('./es6.set');

var from = require('./_array-from-iterable');

var metadata = require('./_metadata');

var anObject = require('./_an-object');

var getPrototypeOf = require('./_object-gpo');

var ordinaryOwnMetadataKeys = metadata.keys;
var toMetaKey = metadata.key;

var ordinaryMetadataKeys = function ordinaryMetadataKeys(O, P) {
  var oKeys = ordinaryOwnMetadataKeys(O, P);
  var parent = getPrototypeOf(O);
  if (parent === null) return oKeys;
  var pKeys = ordinaryMetadataKeys(parent, P);
  return pKeys.length ? oKeys.length ? from(new Set(oKeys.concat(pKeys))) : pKeys : oKeys;
};

metadata.exp({
  getMetadataKeys: function getMetadataKeys(target
  /* , targetKey */
  ) {
    return ordinaryMetadataKeys(anObject(target), arguments.length < 2 ? undefined : toMetaKey(arguments[1]));
  }
});

},{"./_an-object":33,"./_array-from-iterable":36,"./_metadata":92,"./_object-gpo":104,"./es6.set":255}],326:[function(require,module,exports){
"use strict";

var metadata = require('./_metadata');

var anObject = require('./_an-object');

var getPrototypeOf = require('./_object-gpo');

var ordinaryHasOwnMetadata = metadata.has;
var ordinaryGetOwnMetadata = metadata.get;
var toMetaKey = metadata.key;

var ordinaryGetMetadata = function ordinaryGetMetadata(MetadataKey, O, P) {
  var hasOwn = ordinaryHasOwnMetadata(MetadataKey, O, P);
  if (hasOwn) return ordinaryGetOwnMetadata(MetadataKey, O, P);
  var parent = getPrototypeOf(O);
  return parent !== null ? ordinaryGetMetadata(MetadataKey, parent, P) : undefined;
};

metadata.exp({
  getMetadata: function getMetadata(metadataKey, target
  /* , targetKey */
  ) {
    return ordinaryGetMetadata(metadataKey, anObject(target), arguments.length < 3 ? undefined : toMetaKey(arguments[2]));
  }
});

},{"./_an-object":33,"./_metadata":92,"./_object-gpo":104}],327:[function(require,module,exports){
"use strict";

var metadata = require('./_metadata');

var anObject = require('./_an-object');

var ordinaryOwnMetadataKeys = metadata.keys;
var toMetaKey = metadata.key;
metadata.exp({
  getOwnMetadataKeys: function getOwnMetadataKeys(target
  /* , targetKey */
  ) {
    return ordinaryOwnMetadataKeys(anObject(target), arguments.length < 2 ? undefined : toMetaKey(arguments[1]));
  }
});

},{"./_an-object":33,"./_metadata":92}],328:[function(require,module,exports){
"use strict";

var metadata = require('./_metadata');

var anObject = require('./_an-object');

var ordinaryGetOwnMetadata = metadata.get;
var toMetaKey = metadata.key;
metadata.exp({
  getOwnMetadata: function getOwnMetadata(metadataKey, target
  /* , targetKey */
  ) {
    return ordinaryGetOwnMetadata(metadataKey, anObject(target), arguments.length < 3 ? undefined : toMetaKey(arguments[2]));
  }
});

},{"./_an-object":33,"./_metadata":92}],329:[function(require,module,exports){
"use strict";

var metadata = require('./_metadata');

var anObject = require('./_an-object');

var getPrototypeOf = require('./_object-gpo');

var ordinaryHasOwnMetadata = metadata.has;
var toMetaKey = metadata.key;

var ordinaryHasMetadata = function ordinaryHasMetadata(MetadataKey, O, P) {
  var hasOwn = ordinaryHasOwnMetadata(MetadataKey, O, P);
  if (hasOwn) return true;
  var parent = getPrototypeOf(O);
  return parent !== null ? ordinaryHasMetadata(MetadataKey, parent, P) : false;
};

metadata.exp({
  hasMetadata: function hasMetadata(metadataKey, target
  /* , targetKey */
  ) {
    return ordinaryHasMetadata(metadataKey, anObject(target), arguments.length < 3 ? undefined : toMetaKey(arguments[2]));
  }
});

},{"./_an-object":33,"./_metadata":92,"./_object-gpo":104}],330:[function(require,module,exports){
"use strict";

var metadata = require('./_metadata');

var anObject = require('./_an-object');

var ordinaryHasOwnMetadata = metadata.has;
var toMetaKey = metadata.key;
metadata.exp({
  hasOwnMetadata: function hasOwnMetadata(metadataKey, target
  /* , targetKey */
  ) {
    return ordinaryHasOwnMetadata(metadataKey, anObject(target), arguments.length < 3 ? undefined : toMetaKey(arguments[2]));
  }
});

},{"./_an-object":33,"./_metadata":92}],331:[function(require,module,exports){
"use strict";

var $metadata = require('./_metadata');

var anObject = require('./_an-object');

var aFunction = require('./_a-function');

var toMetaKey = $metadata.key;
var ordinaryDefineOwnMetadata = $metadata.set;
$metadata.exp({
  metadata: function metadata(metadataKey, metadataValue) {
    return function decorator(target, targetKey) {
      ordinaryDefineOwnMetadata(metadataKey, metadataValue, (targetKey !== undefined ? anObject : aFunction)(target), toMetaKey(targetKey));
    };
  }
});

},{"./_a-function":29,"./_an-object":33,"./_metadata":92}],332:[function(require,module,exports){
"use strict";

// https://tc39.github.io/proposal-setmap-offrom/#sec-set.from
require('./_set-collection-from')('Set');

},{"./_set-collection-from":120}],333:[function(require,module,exports){
"use strict";

// https://tc39.github.io/proposal-setmap-offrom/#sec-set.of
require('./_set-collection-of')('Set');

},{"./_set-collection-of":121}],334:[function(require,module,exports){
"use strict";

// https://github.com/DavidBruant/Map-Set.prototype.toJSON
var $export = require('./_export');

$export($export.P + $export.R, 'Set', {
  toJSON: require('./_collection-to-json')('Set')
});

},{"./_collection-to-json":46,"./_export":59}],335:[function(require,module,exports){
'use strict'; // https://github.com/mathiasbynens/String.prototype.at

var $export = require('./_export');

var $at = require('./_string-at')(true);

$export($export.P, 'String', {
  at: function at(pos) {
    return $at(this, pos);
  }
});

},{"./_export":59,"./_string-at":129}],336:[function(require,module,exports){
'use strict'; // https://tc39.github.io/String.prototype.matchAll/

var $export = require('./_export');

var defined = require('./_defined');

var toLength = require('./_to-length');

var isRegExp = require('./_is-regexp');

var getFlags = require('./_flags');

var RegExpProto = RegExp.prototype;

var $RegExpStringIterator = function $RegExpStringIterator(regexp, string) {
  this._r = regexp;
  this._s = string;
};

require('./_iter-create')($RegExpStringIterator, 'RegExp String', function next() {
  var match = this._r.exec(this._s);

  return {
    value: match,
    done: match === null
  };
});

$export($export.P, 'String', {
  matchAll: function matchAll(regexp) {
    defined(this);
    if (!isRegExp(regexp)) throw TypeError(regexp + ' is not a regexp!');
    var S = String(this);
    var flags = 'flags' in RegExpProto ? String(regexp.flags) : getFlags.call(regexp);
    var rx = new RegExp(regexp.source, ~flags.indexOf('g') ? flags : 'g' + flags);
    rx.lastIndex = toLength(regexp.lastIndex);
    return new $RegExpStringIterator(rx, S);
  }
});

},{"./_defined":54,"./_export":59,"./_flags":63,"./_is-regexp":78,"./_iter-create":80,"./_to-length":141}],337:[function(require,module,exports){
'use strict'; // https://github.com/tc39/proposal-string-pad-start-end

var $export = require('./_export');

var $pad = require('./_string-pad');

var userAgent = require('./_user-agent'); // https://github.com/zloirock/core-js/issues/280


$export($export.P + $export.F * /Version\/10\.\d+(\.\d+)? Safari\//.test(userAgent), 'String', {
  padEnd: function padEnd(maxLength
  /* , fillString = ' ' */
  ) {
    return $pad(this, maxLength, arguments.length > 1 ? arguments[1] : undefined, false);
  }
});

},{"./_export":59,"./_string-pad":132,"./_user-agent":148}],338:[function(require,module,exports){
'use strict'; // https://github.com/tc39/proposal-string-pad-start-end

var $export = require('./_export');

var $pad = require('./_string-pad');

var userAgent = require('./_user-agent'); // https://github.com/zloirock/core-js/issues/280


$export($export.P + $export.F * /Version\/10\.\d+(\.\d+)? Safari\//.test(userAgent), 'String', {
  padStart: function padStart(maxLength
  /* , fillString = ' ' */
  ) {
    return $pad(this, maxLength, arguments.length > 1 ? arguments[1] : undefined, true);
  }
});

},{"./_export":59,"./_string-pad":132,"./_user-agent":148}],339:[function(require,module,exports){
'use strict'; // https://github.com/sebmarkbage/ecmascript-string-left-right-trim

require('./_string-trim')('trimLeft', function ($trim) {
  return function trimLeft() {
    return $trim(this, 1);
  };
}, 'trimStart');

},{"./_string-trim":134}],340:[function(require,module,exports){
'use strict'; // https://github.com/sebmarkbage/ecmascript-string-left-right-trim

require('./_string-trim')('trimRight', function ($trim) {
  return function trimRight() {
    return $trim(this, 2);
  };
}, 'trimEnd');

},{"./_string-trim":134}],341:[function(require,module,exports){
"use strict";

require('./_wks-define')('asyncIterator');

},{"./_wks-define":150}],342:[function(require,module,exports){
"use strict";

require('./_wks-define')('observable');

},{"./_wks-define":150}],343:[function(require,module,exports){
"use strict";

// https://github.com/tc39/proposal-global
var $export = require('./_export');

$export($export.S, 'System', {
  global: require('./_global')
});

},{"./_export":59,"./_global":66}],344:[function(require,module,exports){
"use strict";

// https://tc39.github.io/proposal-setmap-offrom/#sec-weakmap.from
require('./_set-collection-from')('WeakMap');

},{"./_set-collection-from":120}],345:[function(require,module,exports){
"use strict";

// https://tc39.github.io/proposal-setmap-offrom/#sec-weakmap.of
require('./_set-collection-of')('WeakMap');

},{"./_set-collection-of":121}],346:[function(require,module,exports){
"use strict";

// https://tc39.github.io/proposal-setmap-offrom/#sec-weakset.from
require('./_set-collection-from')('WeakSet');

},{"./_set-collection-from":120}],347:[function(require,module,exports){
"use strict";

// https://tc39.github.io/proposal-setmap-offrom/#sec-weakset.of
require('./_set-collection-of')('WeakSet');

},{"./_set-collection-of":121}],348:[function(require,module,exports){
"use strict";

var $iterators = require('./es6.array.iterator');

var getKeys = require('./_object-keys');

var redefine = require('./_redefine');

var global = require('./_global');

var hide = require('./_hide');

var Iterators = require('./_iterators');

var wks = require('./_wks');

var ITERATOR = wks('iterator');
var TO_STRING_TAG = wks('toStringTag');
var ArrayValues = Iterators.Array;
var DOMIterables = {
  CSSRuleList: true,
  // TODO: Not spec compliant, should be false.
  CSSStyleDeclaration: false,
  CSSValueList: false,
  ClientRectList: false,
  DOMRectList: false,
  DOMStringList: false,
  DOMTokenList: true,
  DataTransferItemList: false,
  FileList: false,
  HTMLAllCollection: false,
  HTMLCollection: false,
  HTMLFormElement: false,
  HTMLSelectElement: false,
  MediaList: true,
  // TODO: Not spec compliant, should be false.
  MimeTypeArray: false,
  NamedNodeMap: false,
  NodeList: true,
  PaintRequestList: false,
  Plugin: false,
  PluginArray: false,
  SVGLengthList: false,
  SVGNumberList: false,
  SVGPathSegList: false,
  SVGPointList: false,
  SVGStringList: false,
  SVGTransformList: false,
  SourceBufferList: false,
  StyleSheetList: true,
  // TODO: Not spec compliant, should be false.
  TextTrackCueList: false,
  TextTrackList: false,
  TouchList: false
};

for (var collections = getKeys(DOMIterables), i = 0; i < collections.length; i++) {
  var NAME = collections[i];
  var explicit = DOMIterables[NAME];
  var Collection = global[NAME];
  var proto = Collection && Collection.prototype;
  var key;

  if (proto) {
    if (!proto[ITERATOR]) hide(proto, ITERATOR, ArrayValues);
    if (!proto[TO_STRING_TAG]) hide(proto, TO_STRING_TAG, NAME);
    Iterators[NAME] = ArrayValues;
    if (explicit) for (key in $iterators) {
      if (!proto[key]) redefine(proto, key, $iterators[key], true);
    }
  }
}

},{"./_global":66,"./_hide":68,"./_iterators":84,"./_object-keys":106,"./_redefine":117,"./_wks":152,"./es6.array.iterator":165}],349:[function(require,module,exports){
"use strict";

var $export = require('./_export');

var $task = require('./_task');

$export($export.G + $export.B, {
  setImmediate: $task.set,
  clearImmediate: $task.clear
});

},{"./_export":59,"./_task":136}],350:[function(require,module,exports){
"use strict";

// ie9- setTimeout & setInterval additional parameters fix
var global = require('./_global');

var $export = require('./_export');

var userAgent = require('./_user-agent');

var slice = [].slice;
var MSIE = /MSIE .\./.test(userAgent); // <- dirty ie9- check

var wrap = function wrap(set) {
  return function (fn, time
  /* , ...args */
  ) {
    var boundArgs = arguments.length > 2;
    var args = boundArgs ? slice.call(arguments, 2) : false;
    return set(boundArgs ? function () {
      // eslint-disable-next-line no-new-func
      (typeof fn == 'function' ? fn : Function(fn)).apply(this, args);
    } : fn, time);
  };
};

$export($export.G + $export.B + $export.F * MSIE, {
  setTimeout: wrap(global.setTimeout),
  setInterval: wrap(global.setInterval)
});

},{"./_export":59,"./_global":66,"./_user-agent":148}],351:[function(require,module,exports){
"use strict";

require('./modules/es6.symbol');

require('./modules/es6.object.create');

require('./modules/es6.object.define-property');

require('./modules/es6.object.define-properties');

require('./modules/es6.object.get-own-property-descriptor');

require('./modules/es6.object.get-prototype-of');

require('./modules/es6.object.keys');

require('./modules/es6.object.get-own-property-names');

require('./modules/es6.object.freeze');

require('./modules/es6.object.seal');

require('./modules/es6.object.prevent-extensions');

require('./modules/es6.object.is-frozen');

require('./modules/es6.object.is-sealed');

require('./modules/es6.object.is-extensible');

require('./modules/es6.object.assign');

require('./modules/es6.object.is');

require('./modules/es6.object.set-prototype-of');

require('./modules/es6.object.to-string');

require('./modules/es6.function.bind');

require('./modules/es6.function.name');

require('./modules/es6.function.has-instance');

require('./modules/es6.parse-int');

require('./modules/es6.parse-float');

require('./modules/es6.number.constructor');

require('./modules/es6.number.to-fixed');

require('./modules/es6.number.to-precision');

require('./modules/es6.number.epsilon');

require('./modules/es6.number.is-finite');

require('./modules/es6.number.is-integer');

require('./modules/es6.number.is-nan');

require('./modules/es6.number.is-safe-integer');

require('./modules/es6.number.max-safe-integer');

require('./modules/es6.number.min-safe-integer');

require('./modules/es6.number.parse-float');

require('./modules/es6.number.parse-int');

require('./modules/es6.math.acosh');

require('./modules/es6.math.asinh');

require('./modules/es6.math.atanh');

require('./modules/es6.math.cbrt');

require('./modules/es6.math.clz32');

require('./modules/es6.math.cosh');

require('./modules/es6.math.expm1');

require('./modules/es6.math.fround');

require('./modules/es6.math.hypot');

require('./modules/es6.math.imul');

require('./modules/es6.math.log10');

require('./modules/es6.math.log1p');

require('./modules/es6.math.log2');

require('./modules/es6.math.sign');

require('./modules/es6.math.sinh');

require('./modules/es6.math.tanh');

require('./modules/es6.math.trunc');

require('./modules/es6.string.from-code-point');

require('./modules/es6.string.raw');

require('./modules/es6.string.trim');

require('./modules/es6.string.iterator');

require('./modules/es6.string.code-point-at');

require('./modules/es6.string.ends-with');

require('./modules/es6.string.includes');

require('./modules/es6.string.repeat');

require('./modules/es6.string.starts-with');

require('./modules/es6.string.anchor');

require('./modules/es6.string.big');

require('./modules/es6.string.blink');

require('./modules/es6.string.bold');

require('./modules/es6.string.fixed');

require('./modules/es6.string.fontcolor');

require('./modules/es6.string.fontsize');

require('./modules/es6.string.italics');

require('./modules/es6.string.link');

require('./modules/es6.string.small');

require('./modules/es6.string.strike');

require('./modules/es6.string.sub');

require('./modules/es6.string.sup');

require('./modules/es6.date.now');

require('./modules/es6.date.to-json');

require('./modules/es6.date.to-iso-string');

require('./modules/es6.date.to-string');

require('./modules/es6.date.to-primitive');

require('./modules/es6.array.is-array');

require('./modules/es6.array.from');

require('./modules/es6.array.of');

require('./modules/es6.array.join');

require('./modules/es6.array.slice');

require('./modules/es6.array.sort');

require('./modules/es6.array.for-each');

require('./modules/es6.array.map');

require('./modules/es6.array.filter');

require('./modules/es6.array.some');

require('./modules/es6.array.every');

require('./modules/es6.array.reduce');

require('./modules/es6.array.reduce-right');

require('./modules/es6.array.index-of');

require('./modules/es6.array.last-index-of');

require('./modules/es6.array.copy-within');

require('./modules/es6.array.fill');

require('./modules/es6.array.find');

require('./modules/es6.array.find-index');

require('./modules/es6.array.species');

require('./modules/es6.array.iterator');

require('./modules/es6.regexp.constructor');

require('./modules/es6.regexp.to-string');

require('./modules/es6.regexp.flags');

require('./modules/es6.regexp.match');

require('./modules/es6.regexp.replace');

require('./modules/es6.regexp.search');

require('./modules/es6.regexp.split');

require('./modules/es6.promise');

require('./modules/es6.map');

require('./modules/es6.set');

require('./modules/es6.weak-map');

require('./modules/es6.weak-set');

require('./modules/es6.typed.array-buffer');

require('./modules/es6.typed.data-view');

require('./modules/es6.typed.int8-array');

require('./modules/es6.typed.uint8-array');

require('./modules/es6.typed.uint8-clamped-array');

require('./modules/es6.typed.int16-array');

require('./modules/es6.typed.uint16-array');

require('./modules/es6.typed.int32-array');

require('./modules/es6.typed.uint32-array');

require('./modules/es6.typed.float32-array');

require('./modules/es6.typed.float64-array');

require('./modules/es6.reflect.apply');

require('./modules/es6.reflect.construct');

require('./modules/es6.reflect.define-property');

require('./modules/es6.reflect.delete-property');

require('./modules/es6.reflect.enumerate');

require('./modules/es6.reflect.get');

require('./modules/es6.reflect.get-own-property-descriptor');

require('./modules/es6.reflect.get-prototype-of');

require('./modules/es6.reflect.has');

require('./modules/es6.reflect.is-extensible');

require('./modules/es6.reflect.own-keys');

require('./modules/es6.reflect.prevent-extensions');

require('./modules/es6.reflect.set');

require('./modules/es6.reflect.set-prototype-of');

require('./modules/es7.array.includes');

require('./modules/es7.array.flat-map');

require('./modules/es7.array.flatten');

require('./modules/es7.string.at');

require('./modules/es7.string.pad-start');

require('./modules/es7.string.pad-end');

require('./modules/es7.string.trim-left');

require('./modules/es7.string.trim-right');

require('./modules/es7.string.match-all');

require('./modules/es7.symbol.async-iterator');

require('./modules/es7.symbol.observable');

require('./modules/es7.object.get-own-property-descriptors');

require('./modules/es7.object.values');

require('./modules/es7.object.entries');

require('./modules/es7.object.define-getter');

require('./modules/es7.object.define-setter');

require('./modules/es7.object.lookup-getter');

require('./modules/es7.object.lookup-setter');

require('./modules/es7.map.to-json');

require('./modules/es7.set.to-json');

require('./modules/es7.map.of');

require('./modules/es7.set.of');

require('./modules/es7.weak-map.of');

require('./modules/es7.weak-set.of');

require('./modules/es7.map.from');

require('./modules/es7.set.from');

require('./modules/es7.weak-map.from');

require('./modules/es7.weak-set.from');

require('./modules/es7.global');

require('./modules/es7.system.global');

require('./modules/es7.error.is-error');

require('./modules/es7.math.clamp');

require('./modules/es7.math.deg-per-rad');

require('./modules/es7.math.degrees');

require('./modules/es7.math.fscale');

require('./modules/es7.math.iaddh');

require('./modules/es7.math.isubh');

require('./modules/es7.math.imulh');

require('./modules/es7.math.rad-per-deg');

require('./modules/es7.math.radians');

require('./modules/es7.math.scale');

require('./modules/es7.math.umulh');

require('./modules/es7.math.signbit');

require('./modules/es7.promise.finally');

require('./modules/es7.promise.try');

require('./modules/es7.reflect.define-metadata');

require('./modules/es7.reflect.delete-metadata');

require('./modules/es7.reflect.get-metadata');

require('./modules/es7.reflect.get-metadata-keys');

require('./modules/es7.reflect.get-own-metadata');

require('./modules/es7.reflect.get-own-metadata-keys');

require('./modules/es7.reflect.has-metadata');

require('./modules/es7.reflect.has-own-metadata');

require('./modules/es7.reflect.metadata');

require('./modules/es7.asap');

require('./modules/es7.observable');

require('./modules/web.timers');

require('./modules/web.immediate');

require('./modules/web.dom.iterable');

module.exports = require('./modules/_core');

},{"./modules/_core":49,"./modules/es6.array.copy-within":155,"./modules/es6.array.every":156,"./modules/es6.array.fill":157,"./modules/es6.array.filter":158,"./modules/es6.array.find":160,"./modules/es6.array.find-index":159,"./modules/es6.array.for-each":161,"./modules/es6.array.from":162,"./modules/es6.array.index-of":163,"./modules/es6.array.is-array":164,"./modules/es6.array.iterator":165,"./modules/es6.array.join":166,"./modules/es6.array.last-index-of":167,"./modules/es6.array.map":168,"./modules/es6.array.of":169,"./modules/es6.array.reduce":171,"./modules/es6.array.reduce-right":170,"./modules/es6.array.slice":172,"./modules/es6.array.some":173,"./modules/es6.array.sort":174,"./modules/es6.array.species":175,"./modules/es6.date.now":176,"./modules/es6.date.to-iso-string":177,"./modules/es6.date.to-json":178,"./modules/es6.date.to-primitive":179,"./modules/es6.date.to-string":180,"./modules/es6.function.bind":181,"./modules/es6.function.has-instance":182,"./modules/es6.function.name":183,"./modules/es6.map":184,"./modules/es6.math.acosh":185,"./modules/es6.math.asinh":186,"./modules/es6.math.atanh":187,"./modules/es6.math.cbrt":188,"./modules/es6.math.clz32":189,"./modules/es6.math.cosh":190,"./modules/es6.math.expm1":191,"./modules/es6.math.fround":192,"./modules/es6.math.hypot":193,"./modules/es6.math.imul":194,"./modules/es6.math.log10":195,"./modules/es6.math.log1p":196,"./modules/es6.math.log2":197,"./modules/es6.math.sign":198,"./modules/es6.math.sinh":199,"./modules/es6.math.tanh":200,"./modules/es6.math.trunc":201,"./modules/es6.number.constructor":202,"./modules/es6.number.epsilon":203,"./modules/es6.number.is-finite":204,"./modules/es6.number.is-integer":205,"./modules/es6.number.is-nan":206,"./modules/es6.number.is-safe-integer":207,"./modules/es6.number.max-safe-integer":208,"./modules/es6.number.min-safe-integer":209,"./modules/es6.number.parse-float":210,"./modules/es6.number.parse-int":211,"./modules/es6.number.to-fixed":212,"./modules/es6.number.to-precision":213,"./modules/es6.object.assign":214,"./modules/es6.object.create":215,"./modules/es6.object.define-properties":216,"./modules/es6.object.define-property":217,"./modules/es6.object.freeze":218,"./modules/es6.object.get-own-property-descriptor":219,"./modules/es6.object.get-own-property-names":220,"./modules/es6.object.get-prototype-of":221,"./modules/es6.object.is":225,"./modules/es6.object.is-extensible":222,"./modules/es6.object.is-frozen":223,"./modules/es6.object.is-sealed":224,"./modules/es6.object.keys":226,"./modules/es6.object.prevent-extensions":227,"./modules/es6.object.seal":228,"./modules/es6.object.set-prototype-of":229,"./modules/es6.object.to-string":230,"./modules/es6.parse-float":231,"./modules/es6.parse-int":232,"./modules/es6.promise":233,"./modules/es6.reflect.apply":234,"./modules/es6.reflect.construct":235,"./modules/es6.reflect.define-property":236,"./modules/es6.reflect.delete-property":237,"./modules/es6.reflect.enumerate":238,"./modules/es6.reflect.get":241,"./modules/es6.reflect.get-own-property-descriptor":239,"./modules/es6.reflect.get-prototype-of":240,"./modules/es6.reflect.has":242,"./modules/es6.reflect.is-extensible":243,"./modules/es6.reflect.own-keys":244,"./modules/es6.reflect.prevent-extensions":245,"./modules/es6.reflect.set":247,"./modules/es6.reflect.set-prototype-of":246,"./modules/es6.regexp.constructor":248,"./modules/es6.regexp.flags":249,"./modules/es6.regexp.match":250,"./modules/es6.regexp.replace":251,"./modules/es6.regexp.search":252,"./modules/es6.regexp.split":253,"./modules/es6.regexp.to-string":254,"./modules/es6.set":255,"./modules/es6.string.anchor":256,"./modules/es6.string.big":257,"./modules/es6.string.blink":258,"./modules/es6.string.bold":259,"./modules/es6.string.code-point-at":260,"./modules/es6.string.ends-with":261,"./modules/es6.string.fixed":262,"./modules/es6.string.fontcolor":263,"./modules/es6.string.fontsize":264,"./modules/es6.string.from-code-point":265,"./modules/es6.string.includes":266,"./modules/es6.string.italics":267,"./modules/es6.string.iterator":268,"./modules/es6.string.link":269,"./modules/es6.string.raw":270,"./modules/es6.string.repeat":271,"./modules/es6.string.small":272,"./modules/es6.string.starts-with":273,"./modules/es6.string.strike":274,"./modules/es6.string.sub":275,"./modules/es6.string.sup":276,"./modules/es6.string.trim":277,"./modules/es6.symbol":278,"./modules/es6.typed.array-buffer":279,"./modules/es6.typed.data-view":280,"./modules/es6.typed.float32-array":281,"./modules/es6.typed.float64-array":282,"./modules/es6.typed.int16-array":283,"./modules/es6.typed.int32-array":284,"./modules/es6.typed.int8-array":285,"./modules/es6.typed.uint16-array":286,"./modules/es6.typed.uint32-array":287,"./modules/es6.typed.uint8-array":288,"./modules/es6.typed.uint8-clamped-array":289,"./modules/es6.weak-map":290,"./modules/es6.weak-set":291,"./modules/es7.array.flat-map":292,"./modules/es7.array.flatten":293,"./modules/es7.array.includes":294,"./modules/es7.asap":295,"./modules/es7.error.is-error":296,"./modules/es7.global":297,"./modules/es7.map.from":298,"./modules/es7.map.of":299,"./modules/es7.map.to-json":300,"./modules/es7.math.clamp":301,"./modules/es7.math.deg-per-rad":302,"./modules/es7.math.degrees":303,"./modules/es7.math.fscale":304,"./modules/es7.math.iaddh":305,"./modules/es7.math.imulh":306,"./modules/es7.math.isubh":307,"./modules/es7.math.rad-per-deg":308,"./modules/es7.math.radians":309,"./modules/es7.math.scale":310,"./modules/es7.math.signbit":311,"./modules/es7.math.umulh":312,"./modules/es7.object.define-getter":313,"./modules/es7.object.define-setter":314,"./modules/es7.object.entries":315,"./modules/es7.object.get-own-property-descriptors":316,"./modules/es7.object.lookup-getter":317,"./modules/es7.object.lookup-setter":318,"./modules/es7.object.values":319,"./modules/es7.observable":320,"./modules/es7.promise.finally":321,"./modules/es7.promise.try":322,"./modules/es7.reflect.define-metadata":323,"./modules/es7.reflect.delete-metadata":324,"./modules/es7.reflect.get-metadata":326,"./modules/es7.reflect.get-metadata-keys":325,"./modules/es7.reflect.get-own-metadata":328,"./modules/es7.reflect.get-own-metadata-keys":327,"./modules/es7.reflect.has-metadata":329,"./modules/es7.reflect.has-own-metadata":330,"./modules/es7.reflect.metadata":331,"./modules/es7.set.from":332,"./modules/es7.set.of":333,"./modules/es7.set.to-json":334,"./modules/es7.string.at":335,"./modules/es7.string.match-all":336,"./modules/es7.string.pad-end":337,"./modules/es7.string.pad-start":338,"./modules/es7.string.trim-left":339,"./modules/es7.string.trim-right":340,"./modules/es7.symbol.async-iterator":341,"./modules/es7.symbol.observable":342,"./modules/es7.system.global":343,"./modules/es7.weak-map.from":344,"./modules/es7.weak-map.of":345,"./modules/es7.weak-set.from":346,"./modules/es7.weak-set.of":347,"./modules/web.dom.iterable":348,"./modules/web.immediate":349,"./modules/web.timers":350}],352:[function(require,module,exports){
"use strict";

function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }

/**
 * matchesSelector v2.0.2
 * matchesSelector( element, '.selector' )
 * MIT license
 */

/*jshint browser: true, strict: true, undef: true, unused: true */
(function (window, factory) {
  /*global define: false, module: false */
  'use strict'; // universal module definition

  if (typeof define == 'function' && define.amd) {
    // AMD
    define(factory);
  } else if ((typeof module === "undefined" ? "undefined" : _typeof(module)) == 'object' && module.exports) {
    // CommonJS
    module.exports = factory();
  } else {
    // browser global
    window.matchesSelector = factory();
  }
})(window, function factory() {
  'use strict';

  var matchesMethod = function () {
    var ElemProto = window.Element.prototype; // check for the standard method name first

    if (ElemProto.matches) {
      return 'matches';
    } // check un-prefixed


    if (ElemProto.matchesSelector) {
      return 'matchesSelector';
    } // check vendor prefixes


    var prefixes = ['webkit', 'moz', 'ms', 'o'];

    for (var i = 0; i < prefixes.length; i++) {
      var prefix = prefixes[i];
      var method = prefix + 'MatchesSelector';

      if (ElemProto[method]) {
        return method;
      }
    }
  }();

  return function matchesSelector(elem, selector) {
    return elem[matchesMethod](selector);
  };
});

},{}],353:[function(require,module,exports){
"use strict";

function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }

/**
 * EvEmitter v1.1.0
 * Lil' event emitter
 * MIT License
 */

/* jshint unused: true, undef: true, strict: true */
(function (global, factory) {
  // universal module definition

  /* jshint strict: false */

  /* globals define, module, window */
  if (typeof define == 'function' && define.amd) {
    // AMD - RequireJS
    define(factory);
  } else if ((typeof module === "undefined" ? "undefined" : _typeof(module)) == 'object' && module.exports) {
    // CommonJS - Browserify, Webpack
    module.exports = factory();
  } else {
    // Browser globals
    global.EvEmitter = factory();
  }
})(typeof window != 'undefined' ? window : void 0, function () {
  "use strict";

  function EvEmitter() {}

  var proto = EvEmitter.prototype;

  proto.on = function (eventName, listener) {
    if (!eventName || !listener) {
      return;
    } // set events hash


    var events = this._events = this._events || {}; // set listeners array

    var listeners = events[eventName] = events[eventName] || []; // only add once

    if (listeners.indexOf(listener) == -1) {
      listeners.push(listener);
    }

    return this;
  };

  proto.once = function (eventName, listener) {
    if (!eventName || !listener) {
      return;
    } // add event


    this.on(eventName, listener); // set once flag
    // set onceEvents hash

    var onceEvents = this._onceEvents = this._onceEvents || {}; // set onceListeners object

    var onceListeners = onceEvents[eventName] = onceEvents[eventName] || {}; // set flag

    onceListeners[listener] = true;
    return this;
  };

  proto.off = function (eventName, listener) {
    var listeners = this._events && this._events[eventName];

    if (!listeners || !listeners.length) {
      return;
    }

    var index = listeners.indexOf(listener);

    if (index != -1) {
      listeners.splice(index, 1);
    }

    return this;
  };

  proto.emitEvent = function (eventName, args) {
    var listeners = this._events && this._events[eventName];

    if (!listeners || !listeners.length) {
      return;
    } // copy over to avoid interference if .off() in listener


    listeners = listeners.slice(0);
    args = args || []; // once stuff

    var onceListeners = this._onceEvents && this._onceEvents[eventName];

    for (var i = 0; i < listeners.length; i++) {
      var listener = listeners[i];
      var isOnce = onceListeners && onceListeners[listener];

      if (isOnce) {
        // remove listener
        // remove before trigger to prevent recursion
        this.off(eventName, listener); // unset once flag

        delete onceListeners[listener];
      } // trigger listener


      listener.apply(this, args);
    }

    return this;
  };

  proto.allOff = function () {
    delete this._events;
    delete this._onceEvents;
  };

  return EvEmitter;
});

},{}],354:[function(require,module,exports){
"use strict";

function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }

/**
 * Fizzy UI utils v2.0.7
 * MIT license
 */

/*jshint browser: true, undef: true, unused: true, strict: true */
(function (window, factory) {
  // universal module definition

  /*jshint strict: false */

  /*globals define, module, require */
  if (typeof define == 'function' && define.amd) {
    // AMD
    define(['desandro-matches-selector/matches-selector'], function (matchesSelector) {
      return factory(window, matchesSelector);
    });
  } else if ((typeof module === "undefined" ? "undefined" : _typeof(module)) == 'object' && module.exports) {
    // CommonJS
    module.exports = factory(window, require('desandro-matches-selector'));
  } else {
    // browser global
    window.fizzyUIUtils = factory(window, window.matchesSelector);
  }
})(window, function factory(window, matchesSelector) {
  'use strict';

  var utils = {}; // ----- extend ----- //
  // extends objects

  utils.extend = function (a, b) {
    for (var prop in b) {
      a[prop] = b[prop];
    }

    return a;
  }; // ----- modulo ----- //


  utils.modulo = function (num, div) {
    return (num % div + div) % div;
  }; // ----- makeArray ----- //


  var arraySlice = Array.prototype.slice; // turn element or nodeList into an array

  utils.makeArray = function (obj) {
    if (Array.isArray(obj)) {
      // use object if already an array
      return obj;
    } // return empty array if undefined or null. #6


    if (obj === null || obj === undefined) {
      return [];
    }

    var isArrayLike = _typeof(obj) == 'object' && typeof obj.length == 'number';

    if (isArrayLike) {
      // convert nodeList to array
      return arraySlice.call(obj);
    } // array of single index


    return [obj];
  }; // ----- removeFrom ----- //


  utils.removeFrom = function (ary, obj) {
    var index = ary.indexOf(obj);

    if (index != -1) {
      ary.splice(index, 1);
    }
  }; // ----- getParent ----- //


  utils.getParent = function (elem, selector) {
    while (elem.parentNode && elem != document.body) {
      elem = elem.parentNode;

      if (matchesSelector(elem, selector)) {
        return elem;
      }
    }
  }; // ----- getQueryElement ----- //
  // use element as selector string


  utils.getQueryElement = function (elem) {
    if (typeof elem == 'string') {
      return document.querySelector(elem);
    }

    return elem;
  }; // ----- handleEvent ----- //
  // enable .ontype to trigger from .addEventListener( elem, 'type' )


  utils.handleEvent = function (event) {
    var method = 'on' + event.type;

    if (this[method]) {
      this[method](event);
    }
  }; // ----- filterFindElements ----- //


  utils.filterFindElements = function (elems, selector) {
    // make array of elems
    elems = utils.makeArray(elems);
    var ffElems = [];
    elems.forEach(function (elem) {
      // check that elem is an actual element
      if (!(elem instanceof HTMLElement)) {
        return;
      } // add elem if no selector


      if (!selector) {
        ffElems.push(elem);
        return;
      } // filter & find items if we have a selector
      // filter


      if (matchesSelector(elem, selector)) {
        ffElems.push(elem);
      } // find children


      var childElems = elem.querySelectorAll(selector); // concat childElems to filterFound array

      for (var i = 0; i < childElems.length; i++) {
        ffElems.push(childElems[i]);
      }
    });
    return ffElems;
  }; // ----- debounceMethod ----- //


  utils.debounceMethod = function (_class, methodName, threshold) {
    threshold = threshold || 100; // original method

    var method = _class.prototype[methodName];
    var timeoutName = methodName + 'Timeout';

    _class.prototype[methodName] = function () {
      var timeout = this[timeoutName];
      clearTimeout(timeout);
      var args = arguments;

      var _this = this;

      this[timeoutName] = setTimeout(function () {
        method.apply(_this, args);
        delete _this[timeoutName];
      }, threshold);
    };
  }; // ----- docReady ----- //


  utils.docReady = function (callback) {
    var readyState = document.readyState;

    if (readyState == 'complete' || readyState == 'interactive') {
      // do async to allow for other scripts to run. metafizzy/flickity#441
      setTimeout(callback);
    } else {
      document.addEventListener('DOMContentLoaded', callback);
    }
  }; // ----- htmlInit ----- //
  // http://jamesroberts.name/blog/2010/02/22/string-functions-for-javascript-trim-to-camel-case-to-dashed-and-to-underscore/


  utils.toDashed = function (str) {
    return str.replace(/(.)([A-Z])/g, function (match, $1, $2) {
      return $1 + '-' + $2;
    }).toLowerCase();
  };

  var console = window.console;
  /**
   * allow user to initialize classes via [data-namespace] or .js-namespace class
   * htmlInit( Widget, 'widgetName' )
   * options are parsed from data-namespace-options
   */

  utils.htmlInit = function (WidgetClass, namespace) {
    utils.docReady(function () {
      var dashedNamespace = utils.toDashed(namespace);
      var dataAttr = 'data-' + dashedNamespace;
      var dataAttrElems = document.querySelectorAll('[' + dataAttr + ']');
      var jsDashElems = document.querySelectorAll('.js-' + dashedNamespace);
      var elems = utils.makeArray(dataAttrElems).concat(utils.makeArray(jsDashElems));
      var dataOptionsAttr = dataAttr + '-options';
      var jQuery = window.jQuery;
      elems.forEach(function (elem) {
        var attr = elem.getAttribute(dataAttr) || elem.getAttribute(dataOptionsAttr);
        var options;

        try {
          options = attr && JSON.parse(attr);
        } catch (error) {
          // log error, do not initialize
          if (console) {
            console.error('Error parsing ' + dataAttr + ' on ' + elem.className + ': ' + error);
          }

          return;
        } // initialize


        var instance = new WidgetClass(elem, options); // make available via $().data('namespace')

        if (jQuery) {
          jQuery.data(elem, namespace, instance);
        }
      });
    });
  }; // -----  ----- //


  return utils;
});

},{"desandro-matches-selector":352}],355:[function(require,module,exports){
"use strict";

function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }

/*!
 * getSize v2.0.3
 * measure size of elements
 * MIT license
 */

/* jshint browser: true, strict: true, undef: true, unused: true */

/* globals console: false */
(function (window, factory) {
  /* jshint strict: false */

  /* globals define, module */
  if (typeof define == 'function' && define.amd) {
    // AMD
    define(factory);
  } else if ((typeof module === "undefined" ? "undefined" : _typeof(module)) == 'object' && module.exports) {
    // CommonJS
    module.exports = factory();
  } else {
    // browser global
    window.getSize = factory();
  }
})(window, function factory() {
  'use strict'; // -------------------------- helpers -------------------------- //
  // get a number from a string, not a percentage

  function getStyleSize(value) {
    var num = parseFloat(value); // not a percent like '100%', and a number

    var isValid = value.indexOf('%') == -1 && !isNaN(num);
    return isValid && num;
  }

  function noop() {}

  var logError = typeof console == 'undefined' ? noop : function (message) {
    console.error(message);
  }; // -------------------------- measurements -------------------------- //

  var measurements = ['paddingLeft', 'paddingRight', 'paddingTop', 'paddingBottom', 'marginLeft', 'marginRight', 'marginTop', 'marginBottom', 'borderLeftWidth', 'borderRightWidth', 'borderTopWidth', 'borderBottomWidth'];
  var measurementsLength = measurements.length;

  function getZeroSize() {
    var size = {
      width: 0,
      height: 0,
      innerWidth: 0,
      innerHeight: 0,
      outerWidth: 0,
      outerHeight: 0
    };

    for (var i = 0; i < measurementsLength; i++) {
      var measurement = measurements[i];
      size[measurement] = 0;
    }

    return size;
  } // -------------------------- getStyle -------------------------- //

  /**
   * getStyle, get style of element, check for Firefox bug
   * https://bugzilla.mozilla.org/show_bug.cgi?id=548397
   */


  function getStyle(elem) {
    var style = getComputedStyle(elem);

    if (!style) {
      logError('Style returned ' + style + '. Are you running this code in a hidden iframe on Firefox? ' + 'See https://bit.ly/getsizebug1');
    }

    return style;
  } // -------------------------- setup -------------------------- //


  var isSetup = false;
  var isBoxSizeOuter;
  /**
   * setup
   * check isBoxSizerOuter
   * do on first getSize() rather than on page load for Firefox bug
   */

  function setup() {
    // setup once
    if (isSetup) {
      return;
    }

    isSetup = true; // -------------------------- box sizing -------------------------- //

    /**
     * Chrome & Safari measure the outer-width on style.width on border-box elems
     * IE11 & Firefox<29 measures the inner-width
     */

    var div = document.createElement('div');
    div.style.width = '200px';
    div.style.padding = '1px 2px 3px 4px';
    div.style.borderStyle = 'solid';
    div.style.borderWidth = '1px 2px 3px 4px';
    div.style.boxSizing = 'border-box';
    var body = document.body || document.documentElement;
    body.appendChild(div);
    var style = getStyle(div); // round value for browser zoom. desandro/masonry#928

    isBoxSizeOuter = Math.round(getStyleSize(style.width)) == 200;
    getSize.isBoxSizeOuter = isBoxSizeOuter;
    body.removeChild(div);
  } // -------------------------- getSize -------------------------- //


  function getSize(elem) {
    setup(); // use querySeletor if elem is string

    if (typeof elem == 'string') {
      elem = document.querySelector(elem);
    } // do not proceed on non-objects


    if (!elem || _typeof(elem) != 'object' || !elem.nodeType) {
      return;
    }

    var style = getStyle(elem); // if hidden, everything is 0

    if (style.display == 'none') {
      return getZeroSize();
    }

    var size = {};
    size.width = elem.offsetWidth;
    size.height = elem.offsetHeight;
    var isBorderBox = size.isBorderBox = style.boxSizing == 'border-box'; // get all measurements

    for (var i = 0; i < measurementsLength; i++) {
      var measurement = measurements[i];
      var value = style[measurement];
      var num = parseFloat(value); // any 'auto', 'medium' value will be 0

      size[measurement] = !isNaN(num) ? num : 0;
    }

    var paddingWidth = size.paddingLeft + size.paddingRight;
    var paddingHeight = size.paddingTop + size.paddingBottom;
    var marginWidth = size.marginLeft + size.marginRight;
    var marginHeight = size.marginTop + size.marginBottom;
    var borderWidth = size.borderLeftWidth + size.borderRightWidth;
    var borderHeight = size.borderTopWidth + size.borderBottomWidth;
    var isBorderBoxSizeOuter = isBorderBox && isBoxSizeOuter; // overwrite width and height if we can get it from style

    var styleWidth = getStyleSize(style.width);

    if (styleWidth !== false) {
      size.width = styleWidth + ( // add padding and border unless it's already including it
      isBorderBoxSizeOuter ? 0 : paddingWidth + borderWidth);
    }

    var styleHeight = getStyleSize(style.height);

    if (styleHeight !== false) {
      size.height = styleHeight + ( // add padding and border unless it's already including it
      isBorderBoxSizeOuter ? 0 : paddingHeight + borderHeight);
    }

    size.innerWidth = size.width - (paddingWidth + borderWidth);
    size.innerHeight = size.height - (paddingHeight + borderHeight);
    size.outerWidth = size.width + marginWidth;
    size.outerHeight = size.height + marginHeight;
    return size;
  }

  return getSize;
});

},{}],356:[function(require,module,exports){
(function (global){
"use strict";

function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }

/*!
 * VERSION: 1.20.4
 * DATE: 2018-02-15
 * UPDATES AND DOCS AT: http://greensock.com
 * 
 * Includes all of the following: TweenLite, TweenMax, TimelineLite, TimelineMax, EasePack, CSSPlugin, RoundPropsPlugin, BezierPlugin, AttrPlugin, DirectionalRotationPlugin
 *
 * @license Copyright (c) 2008-2018, GreenSock. All rights reserved.
 * This work is subject to the terms at http://greensock.com/standard-license or for
 * Club GreenSock members, the software agreement that was issued with your membership.
 * 
 * @author: Jack Doyle, jack@greensock.com
 **/
var _gsScope = typeof module !== "undefined" && module.exports && typeof global !== "undefined" ? global : void 0 || window; //helps ensure compatibility with AMD/RequireJS and CommonJS/Node


(_gsScope._gsQueue || (_gsScope._gsQueue = [])).push(function () {
  "use strict";

  _gsScope._gsDefine("TweenMax", ["core.Animation", "core.SimpleTimeline", "TweenLite"], function (Animation, SimpleTimeline, TweenLite) {
    var _slice = function _slice(a) {
      //don't use [].slice because that doesn't work in IE8 with a NodeList that's returned by querySelectorAll()
      var b = [],
          l = a.length,
          i;

      for (i = 0; i !== l; b.push(a[i++])) {
        ;
      }

      return b;
    },
        _applyCycle = function _applyCycle(vars, targets, i) {
      var alt = vars.cycle,
          p,
          val;

      for (p in alt) {
        val = alt[p];
        vars[p] = typeof val === "function" ? val(i, targets[i]) : val[i % val.length];
      }

      delete vars.cycle;
    },
        TweenMax = function TweenMax(target, duration, vars) {
      TweenLite.call(this, target, duration, vars);
      this._cycle = 0;
      this._yoyo = this.vars.yoyo === true || !!this.vars.yoyoEase;
      this._repeat = this.vars.repeat || 0;
      this._repeatDelay = this.vars.repeatDelay || 0;

      if (this._repeat) {
        this._uncache(true); //ensures that if there is any repeat, the totalDuration will get recalculated to accurately report it.

      }

      this.render = TweenMax.prototype.render; //speed optimization (avoid prototype lookup on this "hot" method)
    },
        _tinyNum = 0.0000000001,
        TweenLiteInternals = TweenLite._internals,
        _isSelector = TweenLiteInternals.isSelector,
        _isArray = TweenLiteInternals.isArray,
        p = TweenMax.prototype = TweenLite.to({}, 0.1, {}),
        _blankArray = [];

    TweenMax.version = "1.20.4";
    p.constructor = TweenMax;
    p.kill()._gc = false;
    TweenMax.killTweensOf = TweenMax.killDelayedCallsTo = TweenLite.killTweensOf;
    TweenMax.getTweensOf = TweenLite.getTweensOf;
    TweenMax.lagSmoothing = TweenLite.lagSmoothing;
    TweenMax.ticker = TweenLite.ticker;
    TweenMax.render = TweenLite.render;

    p.invalidate = function () {
      this._yoyo = this.vars.yoyo === true || !!this.vars.yoyoEase;
      this._repeat = this.vars.repeat || 0;
      this._repeatDelay = this.vars.repeatDelay || 0;
      this._yoyoEase = null;

      this._uncache(true);

      return TweenLite.prototype.invalidate.call(this);
    };

    p.updateTo = function (vars, resetDuration) {
      var curRatio = this.ratio,
          immediate = this.vars.immediateRender || vars.immediateRender,
          p;

      if (resetDuration && this._startTime < this._timeline._time) {
        this._startTime = this._timeline._time;

        this._uncache(false);

        if (this._gc) {
          this._enabled(true, false);
        } else {
          this._timeline.insert(this, this._startTime - this._delay); //ensures that any necessary re-sequencing of Animations in the timeline occurs to make sure the rendering order is correct.

        }
      }

      for (p in vars) {
        this.vars[p] = vars[p];
      }

      if (this._initted || immediate) {
        if (resetDuration) {
          this._initted = false;

          if (immediate) {
            this.render(0, true, true);
          }
        } else {
          if (this._gc) {
            this._enabled(true, false);
          }

          if (this._notifyPluginsOfEnabled && this._firstPT) {
            TweenLite._onPluginEvent("_onDisable", this); //in case a plugin like MotionBlur must perform some cleanup tasks

          }

          if (this._time / this._duration > 0.998) {
            //if the tween has finished (or come extremely close to finishing), we just need to rewind it to 0 and then render it again at the end which forces it to re-initialize (parsing the new vars). We allow tweens that are close to finishing (but haven't quite finished) to work this way too because otherwise, the values are so small when determining where to project the starting values that binary math issues creep in and can make the tween appear to render incorrectly when run backwards. 
            var prevTime = this._totalTime;
            this.render(0, true, false);
            this._initted = false;
            this.render(prevTime, true, false);
          } else {
            this._initted = false;

            this._init();

            if (this._time > 0 || immediate) {
              var inv = 1 / (1 - curRatio),
                  pt = this._firstPT,
                  endValue;

              while (pt) {
                endValue = pt.s + pt.c;
                pt.c *= inv;
                pt.s = endValue - pt.c;
                pt = pt._next;
              }
            }
          }
        }
      }

      return this;
    };

    p.render = function (time, suppressEvents, force) {
      if (!this._initted) if (this._duration === 0 && this.vars.repeat) {
        //zero duration tweens that render immediately have render() called from TweenLite's constructor, before TweenMax's constructor has finished setting _repeat, _repeatDelay, and _yoyo which are critical in determining totalDuration() so we need to call invalidate() which is a low-kb way to get those set properly.
        this.invalidate();
      }
      var totalDur = !this._dirty ? this._totalDuration : this.totalDuration(),
          prevTime = this._time,
          prevTotalTime = this._totalTime,
          prevCycle = this._cycle,
          duration = this._duration,
          prevRawPrevTime = this._rawPrevTime,
          isComplete,
          callback,
          pt,
          cycleDuration,
          r,
          type,
          pow,
          rawPrevTime,
          yoyoEase;

      if (time >= totalDur - 0.0000001 && time >= 0) {
        //to work around occasional floating point math artifacts.
        this._totalTime = totalDur;
        this._cycle = this._repeat;

        if (this._yoyo && (this._cycle & 1) !== 0) {
          this._time = 0;
          this.ratio = this._ease._calcEnd ? this._ease.getRatio(0) : 0;
        } else {
          this._time = duration;
          this.ratio = this._ease._calcEnd ? this._ease.getRatio(1) : 1;
        }

        if (!this._reversed) {
          isComplete = true;
          callback = "onComplete";
          force = force || this._timeline.autoRemoveChildren; //otherwise, if the animation is unpaused/activated after it's already finished, it doesn't get removed from the parent timeline.
        }

        if (duration === 0) if (this._initted || !this.vars.lazy || force) {
          //zero-duration tweens are tricky because we must discern the momentum/direction of time in order to determine whether the starting values should be rendered or the ending values. If the "playhead" of its timeline goes past the zero-duration tween in the forward direction or lands directly on it, the end values should be rendered, but if the timeline's "playhead" moves past it in the backward direction (from a postitive time to a negative time), the starting values must be rendered.
          if (this._startTime === this._timeline._duration) {
            //if a zero-duration tween is at the VERY end of a timeline and that timeline renders at its end, it will typically add a tiny bit of cushion to the render time to prevent rounding errors from getting in the way of tweens rendering their VERY end. If we then reverse() that timeline, the zero-duration tween will trigger its onReverseComplete even though technically the playhead didn't pass over it again. It's a very specific edge case we must accommodate.
            time = 0;
          }

          if (prevRawPrevTime < 0 || time <= 0 && time >= -0.0000001 || prevRawPrevTime === _tinyNum && this.data !== "isPause") if (prevRawPrevTime !== time) {
            //note: when this.data is "isPause", it's a callback added by addPause() on a timeline that we should not be triggered when LEAVING its exact start time. In other words, tl.addPause(1).play(1) shouldn't pause.
            force = true;

            if (prevRawPrevTime > _tinyNum) {
              callback = "onReverseComplete";
            }
          }
          this._rawPrevTime = rawPrevTime = !suppressEvents || time || prevRawPrevTime === time ? time : _tinyNum; //when the playhead arrives at EXACTLY time 0 (right on top) of a zero-duration tween, we need to discern if events are suppressed so that when the playhead moves again (next time), it'll trigger the callback. If events are NOT suppressed, obviously the callback would be triggered in this render. Basically, the callback should fire either when the playhead ARRIVES or LEAVES this exact spot, not both. Imagine doing a timeline.seek(0) and there's a callback that sits at 0. Since events are suppressed on that seek() by default, nothing will fire, but when the playhead moves off of that position, the callback should fire. This behavior is what people intuitively expect. We set the _rawPrevTime to be a precise tiny number to indicate this scenario rather than using another property/variable which would increase memory usage. This technique is less readable, but more efficient.
        }
      } else if (time < 0.0000001) {
        //to work around occasional floating point math artifacts, round super small values to 0.
        this._totalTime = this._time = this._cycle = 0;
        this.ratio = this._ease._calcEnd ? this._ease.getRatio(0) : 0;

        if (prevTotalTime !== 0 || duration === 0 && prevRawPrevTime > 0) {
          callback = "onReverseComplete";
          isComplete = this._reversed;
        }

        if (time < 0) {
          this._active = false;
          if (duration === 0) if (this._initted || !this.vars.lazy || force) {
            //zero-duration tweens are tricky because we must discern the momentum/direction of time in order to determine whether the starting values should be rendered or the ending values. If the "playhead" of its timeline goes past the zero-duration tween in the forward direction or lands directly on it, the end values should be rendered, but if the timeline's "playhead" moves past it in the backward direction (from a postitive time to a negative time), the starting values must be rendered.
            if (prevRawPrevTime >= 0) {
              force = true;
            }

            this._rawPrevTime = rawPrevTime = !suppressEvents || time || prevRawPrevTime === time ? time : _tinyNum; //when the playhead arrives at EXACTLY time 0 (right on top) of a zero-duration tween, we need to discern if events are suppressed so that when the playhead moves again (next time), it'll trigger the callback. If events are NOT suppressed, obviously the callback would be triggered in this render. Basically, the callback should fire either when the playhead ARRIVES or LEAVES this exact spot, not both. Imagine doing a timeline.seek(0) and there's a callback that sits at 0. Since events are suppressed on that seek() by default, nothing will fire, but when the playhead moves off of that position, the callback should fire. This behavior is what people intuitively expect. We set the _rawPrevTime to be a precise tiny number to indicate this scenario rather than using another property/variable which would increase memory usage. This technique is less readable, but more efficient.
          }
        }

        if (!this._initted) {
          //if we render the very beginning (time == 0) of a fromTo(), we must force the render (normal tweens wouldn't need to render at a time of 0 when the prevTime was also 0). This is also mandatory to make sure overwriting kicks in immediately.
          force = true;
        }
      } else {
        this._totalTime = this._time = time;

        if (this._repeat !== 0) {
          cycleDuration = duration + this._repeatDelay;
          this._cycle = this._totalTime / cycleDuration >> 0; //originally _totalTime % cycleDuration but floating point errors caused problems, so I normalized it. (4 % 0.8 should be 0 but some browsers report it as 0.79999999!)

          if (this._cycle !== 0) if (this._cycle === this._totalTime / cycleDuration && prevTotalTime <= time) {
            this._cycle--; //otherwise when rendered exactly at the end time, it will act as though it is repeating (at the beginning)
          }
          this._time = this._totalTime - this._cycle * cycleDuration;
          if (this._yoyo) if ((this._cycle & 1) !== 0) {
            this._time = duration - this._time;
            yoyoEase = this._yoyoEase || this.vars.yoyoEase; //note: we don't set this._yoyoEase in _init() like we do other properties because it's TweenMax-specific and doing it here allows us to optimize performance (most tweens don't have a yoyoEase). Note that we also must skip the this.ratio calculation further down right after we _init() in this function, because we're doing it here.

            if (yoyoEase) {
              if (!this._yoyoEase) {
                if (yoyoEase === true && !this._initted) {
                  //if it's not initted and yoyoEase is true, this._ease won't have been populated yet so we must discern it here.
                  yoyoEase = this.vars.ease;
                  this._yoyoEase = yoyoEase = !yoyoEase ? TweenLite.defaultEase : yoyoEase instanceof Ease ? yoyoEase : typeof yoyoEase === "function" ? new Ease(yoyoEase, this.vars.easeParams) : Ease.map[yoyoEase] || TweenLite.defaultEase;
                } else {
                  this._yoyoEase = yoyoEase = yoyoEase === true ? this._ease : yoyoEase instanceof Ease ? yoyoEase : Ease.map[yoyoEase];
                }
              }

              this.ratio = yoyoEase ? 1 - yoyoEase.getRatio((duration - this._time) / duration) : 0;
            }
          }

          if (this._time > duration) {
            this._time = duration;
          } else if (this._time < 0) {
            this._time = 0;
          }
        }

        if (this._easeType && !yoyoEase) {
          r = this._time / duration;
          type = this._easeType;
          pow = this._easePower;

          if (type === 1 || type === 3 && r >= 0.5) {
            r = 1 - r;
          }

          if (type === 3) {
            r *= 2;
          }

          if (pow === 1) {
            r *= r;
          } else if (pow === 2) {
            r *= r * r;
          } else if (pow === 3) {
            r *= r * r * r;
          } else if (pow === 4) {
            r *= r * r * r * r;
          }

          if (type === 1) {
            this.ratio = 1 - r;
          } else if (type === 2) {
            this.ratio = r;
          } else if (this._time / duration < 0.5) {
            this.ratio = r / 2;
          } else {
            this.ratio = 1 - r / 2;
          }
        } else if (!yoyoEase) {
          this.ratio = this._ease.getRatio(this._time / duration);
        }
      }

      if (prevTime === this._time && !force && prevCycle === this._cycle) {
        if (prevTotalTime !== this._totalTime) if (this._onUpdate) if (!suppressEvents) {
          //so that onUpdate fires even during the repeatDelay - as long as the totalTime changed, we should trigger onUpdate.
          this._callback("onUpdate");
        }
        return;
      } else if (!this._initted) {
        this._init();

        if (!this._initted || this._gc) {
          //immediateRender tweens typically won't initialize until the playhead advances (_time is greater than 0) in order to ensure that overwriting occurs properly. Also, if all of the tweening properties have been overwritten (which would cause _gc to be true, as set in _init()), we shouldn't continue otherwise an onStart callback could be called for example.
          return;
        } else if (!force && this._firstPT && (this.vars.lazy !== false && this._duration || this.vars.lazy && !this._duration)) {
          //we stick it in the queue for rendering at the very end of the tick - this is a performance optimization because browsers invalidate styles and force a recalculation if you read, write, and then read style data (so it's better to read/read/read/write/write/write than read/write/read/write/read/write). The down side, of course, is that usually you WANT things to render immediately because you may have code running right after that which depends on the change. Like imagine running TweenLite.set(...) and then immediately after that, creating a nother tween that animates the same property to another value; the starting values of that 2nd tween wouldn't be accurate if lazy is true.
          this._time = prevTime;
          this._totalTime = prevTotalTime;
          this._rawPrevTime = prevRawPrevTime;
          this._cycle = prevCycle;
          TweenLiteInternals.lazyTweens.push(this);
          this._lazy = [time, suppressEvents];
          return;
        } //_ease is initially set to defaultEase, so now that init() has run, _ease is set properly and we need to recalculate the ratio. Overall this is faster than using conditional logic earlier in the method to avoid having to set ratio twice because we only init() once but renderTime() gets called VERY frequently.


        if (this._time && !isComplete && !yoyoEase) {
          this.ratio = this._ease.getRatio(this._time / duration);
        } else if (isComplete && this._ease._calcEnd && !yoyoEase) {
          this.ratio = this._ease.getRatio(this._time === 0 ? 0 : 1);
        }
      }

      if (this._lazy !== false) {
        this._lazy = false;
      }

      if (!this._active) if (!this._paused && this._time !== prevTime && time >= 0) {
        this._active = true; //so that if the user renders a tween (as opposed to the timeline rendering it), the timeline is forced to re-render and align it with the proper time/frame on the next rendering cycle. Maybe the tween already finished but the user manually re-renders it as halfway done.
      }

      if (prevTotalTime === 0) {
        if (this._initted === 2 && time > 0) {
          //this.invalidate();
          this._init(); //will just apply overwriting since _initted of (2) means it was a from() tween that had immediateRender:true

        }

        if (this._startAt) {
          if (time >= 0) {
            this._startAt.render(time, true, force);
          } else if (!callback) {
            callback = "_dummyGS"; //if no callback is defined, use a dummy value just so that the condition at the end evaluates as true because _startAt should render AFTER the normal render loop when the time is negative. We could handle this in a more intuitive way, of course, but the render loop is the MOST important thing to optimize, so this technique allows us to avoid adding extra conditional logic in a high-frequency area.
          }
        }

        if (this.vars.onStart) if (this._totalTime !== 0 || duration === 0) if (!suppressEvents) {
          this._callback("onStart");
        }
      }

      pt = this._firstPT;

      while (pt) {
        if (pt.f) {
          pt.t[pt.p](pt.c * this.ratio + pt.s);
        } else {
          pt.t[pt.p] = pt.c * this.ratio + pt.s;
        }

        pt = pt._next;
      }

      if (this._onUpdate) {
        if (time < 0) if (this._startAt && this._startTime) {
          //if the tween is positioned at the VERY beginning (_startTime 0) of its parent timeline, it's illegal for the playhead to go back further, so we should not render the recorded startAt values.
          this._startAt.render(time, true, force); //note: for performance reasons, we tuck this conditional logic inside less traveled areas (most tweens don't have an onUpdate). We'd just have it at the end before the onComplete, but the values should be updated before any onUpdate is called, so we ALSO put it here and then if it's not called, we do so later near the onComplete.

        }
        if (!suppressEvents) if (this._totalTime !== prevTotalTime || callback) {
          this._callback("onUpdate");
        }
      }

      if (this._cycle !== prevCycle) if (!suppressEvents) if (!this._gc) if (this.vars.onRepeat) {
        this._callback("onRepeat");
      }
      if (callback) if (!this._gc || force) {
        //check gc because there's a chance that kill() could be called in an onUpdate
        if (time < 0 && this._startAt && !this._onUpdate && this._startTime) {
          //if the tween is positioned at the VERY beginning (_startTime 0) of its parent timeline, it's illegal for the playhead to go back further, so we should not render the recorded startAt values.
          this._startAt.render(time, true, force);
        }

        if (isComplete) {
          if (this._timeline.autoRemoveChildren) {
            this._enabled(false, false);
          }

          this._active = false;
        }

        if (!suppressEvents && this.vars[callback]) {
          this._callback(callback);
        }

        if (duration === 0 && this._rawPrevTime === _tinyNum && rawPrevTime !== _tinyNum) {
          //the onComplete or onReverseComplete could trigger movement of the playhead and for zero-duration tweens (which must discern direction) that land directly back on their start time, we don't want to fire again on the next render. Think of several addPause()'s in a timeline that forces the playhead to a certain spot, but what if it's already paused and another tween is tweening the "time" of the timeline? Each time it moves [forward] past that spot, it would move back, and since suppressEvents is true, it'd reset _rawPrevTime to _tinyNum so that when it begins again, the callback would fire (so ultimately it could bounce back and forth during that tween). Again, this is a very uncommon scenario, but possible nonetheless.
          this._rawPrevTime = 0;
        }
      }
    }; //---- STATIC FUNCTIONS -----------------------------------------------------------------------------------------------------------


    TweenMax.to = function (target, duration, vars) {
      return new TweenMax(target, duration, vars);
    };

    TweenMax.from = function (target, duration, vars) {
      vars.runBackwards = true;
      vars.immediateRender = vars.immediateRender != false;
      return new TweenMax(target, duration, vars);
    };

    TweenMax.fromTo = function (target, duration, fromVars, toVars) {
      toVars.startAt = fromVars;
      toVars.immediateRender = toVars.immediateRender != false && fromVars.immediateRender != false;
      return new TweenMax(target, duration, toVars);
    };

    TweenMax.staggerTo = TweenMax.allTo = function (targets, duration, vars, stagger, onCompleteAll, onCompleteAllParams, onCompleteAllScope) {
      stagger = stagger || 0;

      var delay = 0,
          a = [],
          finalComplete = function finalComplete() {
        if (vars.onComplete) {
          vars.onComplete.apply(vars.onCompleteScope || this, arguments);
        }

        onCompleteAll.apply(onCompleteAllScope || vars.callbackScope || this, onCompleteAllParams || _blankArray);
      },
          cycle = vars.cycle,
          fromCycle = vars.startAt && vars.startAt.cycle,
          l,
          copy,
          i,
          p;

      if (!_isArray(targets)) {
        if (typeof targets === "string") {
          targets = TweenLite.selector(targets) || targets;
        }

        if (_isSelector(targets)) {
          targets = _slice(targets);
        }
      }

      targets = targets || [];

      if (stagger < 0) {
        targets = _slice(targets);
        targets.reverse();
        stagger *= -1;
      }

      l = targets.length - 1;

      for (i = 0; i <= l; i++) {
        copy = {};

        for (p in vars) {
          copy[p] = vars[p];
        }

        if (cycle) {
          _applyCycle(copy, targets, i);

          if (copy.duration != null) {
            duration = copy.duration;
            delete copy.duration;
          }
        }

        if (fromCycle) {
          fromCycle = copy.startAt = {};

          for (p in vars.startAt) {
            fromCycle[p] = vars.startAt[p];
          }

          _applyCycle(copy.startAt, targets, i);
        }

        copy.delay = delay + (copy.delay || 0);

        if (i === l && onCompleteAll) {
          copy.onComplete = finalComplete;
        }

        a[i] = new TweenMax(targets[i], duration, copy);
        delay += stagger;
      }

      return a;
    };

    TweenMax.staggerFrom = TweenMax.allFrom = function (targets, duration, vars, stagger, onCompleteAll, onCompleteAllParams, onCompleteAllScope) {
      vars.runBackwards = true;
      vars.immediateRender = vars.immediateRender != false;
      return TweenMax.staggerTo(targets, duration, vars, stagger, onCompleteAll, onCompleteAllParams, onCompleteAllScope);
    };

    TweenMax.staggerFromTo = TweenMax.allFromTo = function (targets, duration, fromVars, toVars, stagger, onCompleteAll, onCompleteAllParams, onCompleteAllScope) {
      toVars.startAt = fromVars;
      toVars.immediateRender = toVars.immediateRender != false && fromVars.immediateRender != false;
      return TweenMax.staggerTo(targets, duration, toVars, stagger, onCompleteAll, onCompleteAllParams, onCompleteAllScope);
    };

    TweenMax.delayedCall = function (delay, callback, params, scope, useFrames) {
      return new TweenMax(callback, 0, {
        delay: delay,
        onComplete: callback,
        onCompleteParams: params,
        callbackScope: scope,
        onReverseComplete: callback,
        onReverseCompleteParams: params,
        immediateRender: false,
        useFrames: useFrames,
        overwrite: 0
      });
    };

    TweenMax.set = function (target, vars) {
      return new TweenMax(target, 0, vars);
    };

    TweenMax.isTweening = function (target) {
      return TweenLite.getTweensOf(target, true).length > 0;
    };

    var _getChildrenOf = function _getChildrenOf(timeline, includeTimelines) {
      var a = [],
          cnt = 0,
          tween = timeline._first;

      while (tween) {
        if (tween instanceof TweenLite) {
          a[cnt++] = tween;
        } else {
          if (includeTimelines) {
            a[cnt++] = tween;
          }

          a = a.concat(_getChildrenOf(tween, includeTimelines));
          cnt = a.length;
        }

        tween = tween._next;
      }

      return a;
    },
        getAllTweens = TweenMax.getAllTweens = function (includeTimelines) {
      return _getChildrenOf(Animation._rootTimeline, includeTimelines).concat(_getChildrenOf(Animation._rootFramesTimeline, includeTimelines));
    };

    TweenMax.killAll = function (complete, tweens, delayedCalls, timelines) {
      if (tweens == null) {
        tweens = true;
      }

      if (delayedCalls == null) {
        delayedCalls = true;
      }

      var a = getAllTweens(timelines != false),
          l = a.length,
          allTrue = tweens && delayedCalls && timelines,
          isDC,
          tween,
          i;

      for (i = 0; i < l; i++) {
        tween = a[i];

        if (allTrue || tween instanceof SimpleTimeline || (isDC = tween.target === tween.vars.onComplete) && delayedCalls || tweens && !isDC) {
          if (complete) {
            tween.totalTime(tween._reversed ? 0 : tween.totalDuration());
          } else {
            tween._enabled(false, false);
          }
        }
      }
    };

    TweenMax.killChildTweensOf = function (parent, complete) {
      if (parent == null) {
        return;
      }

      var tl = TweenLiteInternals.tweenLookup,
          a,
          curParent,
          p,
          i,
          l;

      if (typeof parent === "string") {
        parent = TweenLite.selector(parent) || parent;
      }

      if (_isSelector(parent)) {
        parent = _slice(parent);
      }

      if (_isArray(parent)) {
        i = parent.length;

        while (--i > -1) {
          TweenMax.killChildTweensOf(parent[i], complete);
        }

        return;
      }

      a = [];

      for (p in tl) {
        curParent = tl[p].target.parentNode;

        while (curParent) {
          if (curParent === parent) {
            a = a.concat(tl[p].tweens);
          }

          curParent = curParent.parentNode;
        }
      }

      l = a.length;

      for (i = 0; i < l; i++) {
        if (complete) {
          a[i].totalTime(a[i].totalDuration());
        }

        a[i]._enabled(false, false);
      }
    };

    var _changePause = function _changePause(pause, tweens, delayedCalls, timelines) {
      tweens = tweens !== false;
      delayedCalls = delayedCalls !== false;
      timelines = timelines !== false;
      var a = getAllTweens(timelines),
          allTrue = tweens && delayedCalls && timelines,
          i = a.length,
          isDC,
          tween;

      while (--i > -1) {
        tween = a[i];

        if (allTrue || tween instanceof SimpleTimeline || (isDC = tween.target === tween.vars.onComplete) && delayedCalls || tweens && !isDC) {
          tween.paused(pause);
        }
      }
    };

    TweenMax.pauseAll = function (tweens, delayedCalls, timelines) {
      _changePause(true, tweens, delayedCalls, timelines);
    };

    TweenMax.resumeAll = function (tweens, delayedCalls, timelines) {
      _changePause(false, tweens, delayedCalls, timelines);
    };

    TweenMax.globalTimeScale = function (value) {
      var tl = Animation._rootTimeline,
          t = TweenLite.ticker.time;

      if (!arguments.length) {
        return tl._timeScale;
      }

      value = value || _tinyNum; //can't allow zero because it'll throw the math off

      tl._startTime = t - (t - tl._startTime) * tl._timeScale / value;
      tl = Animation._rootFramesTimeline;
      t = TweenLite.ticker.frame;
      tl._startTime = t - (t - tl._startTime) * tl._timeScale / value;
      tl._timeScale = Animation._rootTimeline._timeScale = value;
      return value;
    }; //---- GETTERS / SETTERS ----------------------------------------------------------------------------------------------------------


    p.progress = function (value, suppressEvents) {
      return !arguments.length ? this._time / this.duration() : this.totalTime(this.duration() * (this._yoyo && (this._cycle & 1) !== 0 ? 1 - value : value) + this._cycle * (this._duration + this._repeatDelay), suppressEvents);
    };

    p.totalProgress = function (value, suppressEvents) {
      return !arguments.length ? this._totalTime / this.totalDuration() : this.totalTime(this.totalDuration() * value, suppressEvents);
    };

    p.time = function (value, suppressEvents) {
      if (!arguments.length) {
        return this._time;
      }

      if (this._dirty) {
        this.totalDuration();
      }

      if (value > this._duration) {
        value = this._duration;
      }

      if (this._yoyo && (this._cycle & 1) !== 0) {
        value = this._duration - value + this._cycle * (this._duration + this._repeatDelay);
      } else if (this._repeat !== 0) {
        value += this._cycle * (this._duration + this._repeatDelay);
      }

      return this.totalTime(value, suppressEvents);
    };

    p.duration = function (value) {
      if (!arguments.length) {
        return this._duration; //don't set _dirty = false because there could be repeats that haven't been factored into the _totalDuration yet. Otherwise, if you create a repeated TweenMax and then immediately check its duration(), it would cache the value and the totalDuration would not be correct, thus repeats wouldn't take effect.
      }

      return Animation.prototype.duration.call(this, value);
    };

    p.totalDuration = function (value) {
      if (!arguments.length) {
        if (this._dirty) {
          //instead of Infinity, we use 999999999999 so that we can accommodate reverses
          this._totalDuration = this._repeat === -1 ? 999999999999 : this._duration * (this._repeat + 1) + this._repeatDelay * this._repeat;
          this._dirty = false;
        }

        return this._totalDuration;
      }

      return this._repeat === -1 ? this : this.duration((value - this._repeat * this._repeatDelay) / (this._repeat + 1));
    };

    p.repeat = function (value) {
      if (!arguments.length) {
        return this._repeat;
      }

      this._repeat = value;
      return this._uncache(true);
    };

    p.repeatDelay = function (value) {
      if (!arguments.length) {
        return this._repeatDelay;
      }

      this._repeatDelay = value;
      return this._uncache(true);
    };

    p.yoyo = function (value) {
      if (!arguments.length) {
        return this._yoyo;
      }

      this._yoyo = value;
      return this;
    };

    return TweenMax;
  }, true);
  /*
   * ----------------------------------------------------------------
   * TimelineLite
   * ----------------------------------------------------------------
   */


  _gsScope._gsDefine("TimelineLite", ["core.Animation", "core.SimpleTimeline", "TweenLite"], function (Animation, SimpleTimeline, TweenLite) {
    var TimelineLite = function TimelineLite(vars) {
      SimpleTimeline.call(this, vars);
      this._labels = {};
      this.autoRemoveChildren = this.vars.autoRemoveChildren === true;
      this.smoothChildTiming = this.vars.smoothChildTiming === true;
      this._sortChildren = true;
      this._onUpdate = this.vars.onUpdate;
      var v = this.vars,
          val,
          p;

      for (p in v) {
        val = v[p];
        if (_isArray(val)) if (val.join("").indexOf("{self}") !== -1) {
          v[p] = this._swapSelfInParams(val);
        }
      }

      if (_isArray(v.tweens)) {
        this.add(v.tweens, 0, v.align, v.stagger);
      }
    },
        _tinyNum = 0.0000000001,
        TweenLiteInternals = TweenLite._internals,
        _internals = TimelineLite._internals = {},
        _isSelector = TweenLiteInternals.isSelector,
        _isArray = TweenLiteInternals.isArray,
        _lazyTweens = TweenLiteInternals.lazyTweens,
        _lazyRender = TweenLiteInternals.lazyRender,
        _globals = _gsScope._gsDefine.globals,
        _copy = function _copy(vars) {
      var copy = {},
          p;

      for (p in vars) {
        copy[p] = vars[p];
      }

      return copy;
    },
        _applyCycle = function _applyCycle(vars, targets, i) {
      var alt = vars.cycle,
          p,
          val;

      for (p in alt) {
        val = alt[p];
        vars[p] = typeof val === "function" ? val(i, targets[i]) : val[i % val.length];
      }

      delete vars.cycle;
    },
        _pauseCallback = _internals.pauseCallback = function () {},
        _slice = function _slice(a) {
      //don't use [].slice because that doesn't work in IE8 with a NodeList that's returned by querySelectorAll()
      var b = [],
          l = a.length,
          i;

      for (i = 0; i !== l; b.push(a[i++])) {
        ;
      }

      return b;
    },
        p = TimelineLite.prototype = new SimpleTimeline();

    TimelineLite.version = "1.20.4";
    p.constructor = TimelineLite;
    p.kill()._gc = p._forcingPlayhead = p._hasPause = false;
    /* might use later...
    //translates a local time inside an animation to the corresponding time on the root/global timeline, factoring in all nesting and timeScales.
    function localToGlobal(time, animation) {
    	while (animation) {
    		time = (time / animation._timeScale) + animation._startTime;
    		animation = animation.timeline;
    	}
    	return time;
    }
    	//translates the supplied time on the root/global timeline into the corresponding local time inside a particular animation, factoring in all nesting and timeScales
    function globalToLocal(time, animation) {
    	var scale = 1;
    	time -= localToGlobal(0, animation);
    	while (animation) {
    		scale *= animation._timeScale;
    		animation = animation.timeline;
    	}
    	return time * scale;
    }
    */

    p.to = function (target, duration, vars, position) {
      var Engine = vars.repeat && _globals.TweenMax || TweenLite;
      return duration ? this.add(new Engine(target, duration, vars), position) : this.set(target, vars, position);
    };

    p.from = function (target, duration, vars, position) {
      return this.add((vars.repeat && _globals.TweenMax || TweenLite).from(target, duration, vars), position);
    };

    p.fromTo = function (target, duration, fromVars, toVars, position) {
      var Engine = toVars.repeat && _globals.TweenMax || TweenLite;
      return duration ? this.add(Engine.fromTo(target, duration, fromVars, toVars), position) : this.set(target, toVars, position);
    };

    p.staggerTo = function (targets, duration, vars, stagger, position, onCompleteAll, onCompleteAllParams, onCompleteAllScope) {
      var tl = new TimelineLite({
        onComplete: onCompleteAll,
        onCompleteParams: onCompleteAllParams,
        callbackScope: onCompleteAllScope,
        smoothChildTiming: this.smoothChildTiming
      }),
          cycle = vars.cycle,
          copy,
          i;

      if (typeof targets === "string") {
        targets = TweenLite.selector(targets) || targets;
      }

      targets = targets || [];

      if (_isSelector(targets)) {
        //senses if the targets object is a selector. If it is, we should translate it into an array.
        targets = _slice(targets);
      }

      stagger = stagger || 0;

      if (stagger < 0) {
        targets = _slice(targets);
        targets.reverse();
        stagger *= -1;
      }

      for (i = 0; i < targets.length; i++) {
        copy = _copy(vars);

        if (copy.startAt) {
          copy.startAt = _copy(copy.startAt);

          if (copy.startAt.cycle) {
            _applyCycle(copy.startAt, targets, i);
          }
        }

        if (cycle) {
          _applyCycle(copy, targets, i);

          if (copy.duration != null) {
            duration = copy.duration;
            delete copy.duration;
          }
        }

        tl.to(targets[i], duration, copy, i * stagger);
      }

      return this.add(tl, position);
    };

    p.staggerFrom = function (targets, duration, vars, stagger, position, onCompleteAll, onCompleteAllParams, onCompleteAllScope) {
      vars.immediateRender = vars.immediateRender != false;
      vars.runBackwards = true;
      return this.staggerTo(targets, duration, vars, stagger, position, onCompleteAll, onCompleteAllParams, onCompleteAllScope);
    };

    p.staggerFromTo = function (targets, duration, fromVars, toVars, stagger, position, onCompleteAll, onCompleteAllParams, onCompleteAllScope) {
      toVars.startAt = fromVars;
      toVars.immediateRender = toVars.immediateRender != false && fromVars.immediateRender != false;
      return this.staggerTo(targets, duration, toVars, stagger, position, onCompleteAll, onCompleteAllParams, onCompleteAllScope);
    };

    p.call = function (callback, params, scope, position) {
      return this.add(TweenLite.delayedCall(0, callback, params, scope), position);
    };

    p.set = function (target, vars, position) {
      position = this._parseTimeOrLabel(position, 0, true);

      if (vars.immediateRender == null) {
        vars.immediateRender = position === this._time && !this._paused;
      }

      return this.add(new TweenLite(target, 0, vars), position);
    };

    TimelineLite.exportRoot = function (vars, ignoreDelayedCalls) {
      vars = vars || {};

      if (vars.smoothChildTiming == null) {
        vars.smoothChildTiming = true;
      }

      var tl = new TimelineLite(vars),
          root = tl._timeline,
          hasNegativeStart,
          time,
          tween,
          next;

      if (ignoreDelayedCalls == null) {
        ignoreDelayedCalls = true;
      }

      root._remove(tl, true);

      tl._startTime = 0;
      tl._rawPrevTime = tl._time = tl._totalTime = root._time;
      tween = root._first;

      while (tween) {
        next = tween._next;

        if (!ignoreDelayedCalls || !(tween instanceof TweenLite && tween.target === tween.vars.onComplete)) {
          time = tween._startTime - tween._delay;

          if (time < 0) {
            hasNegativeStart = 1;
          }

          tl.add(tween, time);
        }

        tween = next;
      }

      root.add(tl, 0);

      if (hasNegativeStart) {
        //calling totalDuration() will force the adjustment necessary to shift the children forward so none of them start before zero, and moves the timeline backwards the same amount, so the playhead is still aligned where it should be globally, but the timeline doesn't have illegal children that start before zero.
        tl.totalDuration();
      }

      return tl;
    };

    p.add = function (value, position, align, stagger) {
      var curTime, l, i, child, tl, beforeRawTime;

      if (typeof position !== "number") {
        position = this._parseTimeOrLabel(position, 0, true, value);
      }

      if (!(value instanceof Animation)) {
        if (value instanceof Array || value && value.push && _isArray(value)) {
          align = align || "normal";
          stagger = stagger || 0;
          curTime = position;
          l = value.length;

          for (i = 0; i < l; i++) {
            if (_isArray(child = value[i])) {
              child = new TimelineLite({
                tweens: child
              });
            }

            this.add(child, curTime);

            if (typeof child !== "string" && typeof child !== "function") {
              if (align === "sequence") {
                curTime = child._startTime + child.totalDuration() / child._timeScale;
              } else if (align === "start") {
                child._startTime -= child.delay();
              }
            }

            curTime += stagger;
          }

          return this._uncache(true);
        } else if (typeof value === "string") {
          return this.addLabel(value, position);
        } else if (typeof value === "function") {
          value = TweenLite.delayedCall(0, value);
        } else {
          throw "Cannot add " + value + " into the timeline; it is not a tween, timeline, function, or string.";
        }
      }

      SimpleTimeline.prototype.add.call(this, value, position);

      if (value._time) {
        //in case, for example, the _startTime is moved on a tween that has already rendered. Imagine it's at its end state, then the startTime is moved WAY later (after the end of this timeline), it should render at its beginning.
        value.render((this.rawTime() - value._startTime) * value._timeScale, false, false);
      } //if the timeline has already ended but the inserted tween/timeline extends the duration, we should enable this timeline again so that it renders properly. We should also align the playhead with the parent timeline's when appropriate.


      if (this._gc || this._time === this._duration) if (!this._paused) if (this._duration < this.duration()) {
        //in case any of the ancestors had completed but should now be enabled...
        tl = this;
        beforeRawTime = tl.rawTime() > value._startTime; //if the tween is placed on the timeline so that it starts BEFORE the current rawTime, we should align the playhead (move the timeline). This is because sometimes users will create a timeline, let it finish, and much later append a tween and expect it to run instead of jumping to its end state. While technically one could argue that it should jump to its end state, that's not what users intuitively expect.

        while (tl._timeline) {
          if (beforeRawTime && tl._timeline.smoothChildTiming) {
            tl.totalTime(tl._totalTime, true); //moves the timeline (shifts its startTime) if necessary, and also enables it.
          } else if (tl._gc) {
            tl._enabled(true, false);
          }

          tl = tl._timeline;
        }
      }
      return this;
    };

    p.remove = function (value) {
      if (value instanceof Animation) {
        this._remove(value, false);

        var tl = value._timeline = value.vars.useFrames ? Animation._rootFramesTimeline : Animation._rootTimeline; //now that it's removed, default it to the root timeline so that if it gets played again, it doesn't jump back into this timeline.

        value._startTime = (value._paused ? value._pauseTime : tl._time) - (!value._reversed ? value._totalTime : value.totalDuration() - value._totalTime) / value._timeScale; //ensure that if it gets played again, the timing is correct.

        return this;
      } else if (value instanceof Array || value && value.push && _isArray(value)) {
        var i = value.length;

        while (--i > -1) {
          this.remove(value[i]);
        }

        return this;
      } else if (typeof value === "string") {
        return this.removeLabel(value);
      }

      return this.kill(null, value);
    };

    p._remove = function (tween, skipDisable) {
      SimpleTimeline.prototype._remove.call(this, tween, skipDisable);

      var last = this._last;

      if (!last) {
        this._time = this._totalTime = this._duration = this._totalDuration = 0;
      } else if (this._time > this.duration()) {
        this._time = this._duration;
        this._totalTime = this._totalDuration;
      }

      return this;
    };

    p.append = function (value, offsetOrLabel) {
      return this.add(value, this._parseTimeOrLabel(null, offsetOrLabel, true, value));
    };

    p.insert = p.insertMultiple = function (value, position, align, stagger) {
      return this.add(value, position || 0, align, stagger);
    };

    p.appendMultiple = function (tweens, offsetOrLabel, align, stagger) {
      return this.add(tweens, this._parseTimeOrLabel(null, offsetOrLabel, true, tweens), align, stagger);
    };

    p.addLabel = function (label, position) {
      this._labels[label] = this._parseTimeOrLabel(position);
      return this;
    };

    p.addPause = function (position, callback, params, scope) {
      var t = TweenLite.delayedCall(0, _pauseCallback, params, scope || this);
      t.vars.onComplete = t.vars.onReverseComplete = callback;
      t.data = "isPause";
      this._hasPause = true;
      return this.add(t, position);
    };

    p.removeLabel = function (label) {
      delete this._labels[label];
      return this;
    };

    p.getLabelTime = function (label) {
      return this._labels[label] != null ? this._labels[label] : -1;
    };

    p._parseTimeOrLabel = function (timeOrLabel, offsetOrLabel, appendIfAbsent, ignore) {
      var clippedDuration, i; //if we're about to add a tween/timeline (or an array of them) that's already a child of this timeline, we should remove it first so that it doesn't contaminate the duration().

      if (ignore instanceof Animation && ignore.timeline === this) {
        this.remove(ignore);
      } else if (ignore && (ignore instanceof Array || ignore.push && _isArray(ignore))) {
        i = ignore.length;

        while (--i > -1) {
          if (ignore[i] instanceof Animation && ignore[i].timeline === this) {
            this.remove(ignore[i]);
          }
        }
      }

      clippedDuration = typeof timeOrLabel === "number" && !offsetOrLabel ? 0 : this.duration() > 99999999999 ? this.recent().endTime(false) : this._duration; //in case there's a child that infinitely repeats, users almost never intend for the insertion point of a new child to be based on a SUPER long value like that so we clip it and assume the most recently-added child's endTime should be used instead.

      if (typeof offsetOrLabel === "string") {
        return this._parseTimeOrLabel(offsetOrLabel, appendIfAbsent && typeof timeOrLabel === "number" && this._labels[offsetOrLabel] == null ? timeOrLabel - clippedDuration : 0, appendIfAbsent);
      }

      offsetOrLabel = offsetOrLabel || 0;

      if (typeof timeOrLabel === "string" && (isNaN(timeOrLabel) || this._labels[timeOrLabel] != null)) {
        //if the string is a number like "1", check to see if there's a label with that name, otherwise interpret it as a number (absolute value).
        i = timeOrLabel.indexOf("=");

        if (i === -1) {
          if (this._labels[timeOrLabel] == null) {
            return appendIfAbsent ? this._labels[timeOrLabel] = clippedDuration + offsetOrLabel : offsetOrLabel;
          }

          return this._labels[timeOrLabel] + offsetOrLabel;
        }

        offsetOrLabel = parseInt(timeOrLabel.charAt(i - 1) + "1", 10) * Number(timeOrLabel.substr(i + 1));
        timeOrLabel = i > 1 ? this._parseTimeOrLabel(timeOrLabel.substr(0, i - 1), 0, appendIfAbsent) : clippedDuration;
      } else if (timeOrLabel == null) {
        timeOrLabel = clippedDuration;
      }

      return Number(timeOrLabel) + offsetOrLabel;
    };

    p.seek = function (position, suppressEvents) {
      return this.totalTime(typeof position === "number" ? position : this._parseTimeOrLabel(position), suppressEvents !== false);
    };

    p.stop = function () {
      return this.paused(true);
    };

    p.gotoAndPlay = function (position, suppressEvents) {
      return this.play(position, suppressEvents);
    };

    p.gotoAndStop = function (position, suppressEvents) {
      return this.pause(position, suppressEvents);
    };

    p.render = function (time, suppressEvents, force) {
      if (this._gc) {
        this._enabled(true, false);
      }

      var prevTime = this._time,
          totalDur = !this._dirty ? this._totalDuration : this.totalDuration(),
          prevStart = this._startTime,
          prevTimeScale = this._timeScale,
          prevPaused = this._paused,
          tween,
          isComplete,
          next,
          callback,
          internalForce,
          pauseTween,
          curTime;

      if (prevTime !== this._time) {
        //if totalDuration() finds a child with a negative startTime and smoothChildTiming is true, things get shifted around internally so we need to adjust the time accordingly. For example, if a tween starts at -30 we must shift EVERYTHING forward 30 seconds and move this timeline's startTime backward by 30 seconds so that things align with the playhead (no jump).
        time += this._time - prevTime;
      }

      if (time >= totalDur - 0.0000001 && time >= 0) {
        //to work around occasional floating point math artifacts.
        this._totalTime = this._time = totalDur;
        if (!this._reversed) if (!this._hasPausedChild()) {
          isComplete = true;
          callback = "onComplete";
          internalForce = !!this._timeline.autoRemoveChildren; //otherwise, if the animation is unpaused/activated after it's already finished, it doesn't get removed from the parent timeline.

          if (this._duration === 0) if (time <= 0 && time >= -0.0000001 || this._rawPrevTime < 0 || this._rawPrevTime === _tinyNum) if (this._rawPrevTime !== time && this._first) {
            internalForce = true;

            if (this._rawPrevTime > _tinyNum) {
              callback = "onReverseComplete";
            }
          }
        }
        this._rawPrevTime = this._duration || !suppressEvents || time || this._rawPrevTime === time ? time : _tinyNum; //when the playhead arrives at EXACTLY time 0 (right on top) of a zero-duration timeline or tween, we need to discern if events are suppressed so that when the playhead moves again (next time), it'll trigger the callback. If events are NOT suppressed, obviously the callback would be triggered in this render. Basically, the callback should fire either when the playhead ARRIVES or LEAVES this exact spot, not both. Imagine doing a timeline.seek(0) and there's a callback that sits at 0. Since events are suppressed on that seek() by default, nothing will fire, but when the playhead moves off of that position, the callback should fire. This behavior is what people intuitively expect. We set the _rawPrevTime to be a precise tiny number to indicate this scenario rather than using another property/variable which would increase memory usage. This technique is less readable, but more efficient.

        time = totalDur + 0.0001; //to avoid occasional floating point rounding errors - sometimes child tweens/timelines were not being fully completed (their progress might be 0.999999999999998 instead of 1 because when _time - tween._startTime is performed, floating point errors would return a value that was SLIGHTLY off). Try (999999999999.7 - 999999999999) * 1 = 0.699951171875 instead of 0.7.
      } else if (time < 0.0000001) {
        //to work around occasional floating point math artifacts, round super small values to 0.
        this._totalTime = this._time = 0;

        if (prevTime !== 0 || this._duration === 0 && this._rawPrevTime !== _tinyNum && (this._rawPrevTime > 0 || time < 0 && this._rawPrevTime >= 0)) {
          callback = "onReverseComplete";
          isComplete = this._reversed;
        }

        if (time < 0) {
          this._active = false;

          if (this._timeline.autoRemoveChildren && this._reversed) {
            //ensures proper GC if a timeline is resumed after it's finished reversing.
            internalForce = isComplete = true;
            callback = "onReverseComplete";
          } else if (this._rawPrevTime >= 0 && this._first) {
            //when going back beyond the start, force a render so that zero-duration tweens that sit at the very beginning render their start values properly. Otherwise, if the parent timeline's playhead lands exactly at this timeline's startTime, and then moves backwards, the zero-duration tweens at the beginning would still be at their end state.
            internalForce = true;
          }

          this._rawPrevTime = time;
        } else {
          this._rawPrevTime = this._duration || !suppressEvents || time || this._rawPrevTime === time ? time : _tinyNum; //when the playhead arrives at EXACTLY time 0 (right on top) of a zero-duration timeline or tween, we need to discern if events are suppressed so that when the playhead moves again (next time), it'll trigger the callback. If events are NOT suppressed, obviously the callback would be triggered in this render. Basically, the callback should fire either when the playhead ARRIVES or LEAVES this exact spot, not both. Imagine doing a timeline.seek(0) and there's a callback that sits at 0. Since events are suppressed on that seek() by default, nothing will fire, but when the playhead moves off of that position, the callback should fire. This behavior is what people intuitively expect. We set the _rawPrevTime to be a precise tiny number to indicate this scenario rather than using another property/variable which would increase memory usage. This technique is less readable, but more efficient.

          if (time === 0 && isComplete) {
            //if there's a zero-duration tween at the very beginning of a timeline and the playhead lands EXACTLY at time 0, that tween will correctly render its end values, but we need to keep the timeline alive for one more render so that the beginning values render properly as the parent's playhead keeps moving beyond the begining. Imagine obj.x starts at 0 and then we do tl.set(obj, {x:100}).to(obj, 1, {x:200}) and then later we tl.reverse()...the goal is to have obj.x revert to 0. If the playhead happens to land on exactly 0, without this chunk of code, it'd complete the timeline and remove it from the rendering queue (not good).
            tween = this._first;

            while (tween && tween._startTime === 0) {
              if (!tween._duration) {
                isComplete = false;
              }

              tween = tween._next;
            }
          }

          time = 0; //to avoid occasional floating point rounding errors (could cause problems especially with zero-duration tweens at the very beginning of the timeline)

          if (!this._initted) {
            internalForce = true;
          }
        }
      } else {
        if (this._hasPause && !this._forcingPlayhead && !suppressEvents) {
          if (time >= prevTime) {
            tween = this._first;

            while (tween && tween._startTime <= time && !pauseTween) {
              if (!tween._duration) if (tween.data === "isPause" && !tween.ratio && !(tween._startTime === 0 && this._rawPrevTime === 0)) {
                pauseTween = tween;
              }
              tween = tween._next;
            }
          } else {
            tween = this._last;

            while (tween && tween._startTime >= time && !pauseTween) {
              if (!tween._duration) if (tween.data === "isPause" && tween._rawPrevTime > 0) {
                pauseTween = tween;
              }
              tween = tween._prev;
            }
          }

          if (pauseTween) {
            this._time = time = pauseTween._startTime;
            this._totalTime = time + this._cycle * (this._totalDuration + this._repeatDelay);
          }
        }

        this._totalTime = this._time = this._rawPrevTime = time;
      }

      if ((this._time === prevTime || !this._first) && !force && !internalForce && !pauseTween) {
        return;
      } else if (!this._initted) {
        this._initted = true;
      }

      if (!this._active) if (!this._paused && this._time !== prevTime && time > 0) {
        this._active = true; //so that if the user renders the timeline (as opposed to the parent timeline rendering it), it is forced to re-render and align it with the proper time/frame on the next rendering cycle. Maybe the timeline already finished but the user manually re-renders it as halfway done, for example.
      }
      if (prevTime === 0) if (this.vars.onStart) if (this._time !== 0 || !this._duration) if (!suppressEvents) {
        this._callback("onStart");
      }
      curTime = this._time;

      if (curTime >= prevTime) {
        tween = this._first;

        while (tween) {
          next = tween._next; //record it here because the value could change after rendering...

          if (curTime !== this._time || this._paused && !prevPaused) {
            //in case a tween pauses or seeks the timeline when rendering, like inside of an onUpdate/onComplete
            break;
          } else if (tween._active || tween._startTime <= curTime && !tween._paused && !tween._gc) {
            if (pauseTween === tween) {
              this.pause();
            }

            if (!tween._reversed) {
              tween.render((time - tween._startTime) * tween._timeScale, suppressEvents, force);
            } else {
              tween.render((!tween._dirty ? tween._totalDuration : tween.totalDuration()) - (time - tween._startTime) * tween._timeScale, suppressEvents, force);
            }
          }

          tween = next;
        }
      } else {
        tween = this._last;

        while (tween) {
          next = tween._prev; //record it here because the value could change after rendering...

          if (curTime !== this._time || this._paused && !prevPaused) {
            //in case a tween pauses or seeks the timeline when rendering, like inside of an onUpdate/onComplete
            break;
          } else if (tween._active || tween._startTime <= prevTime && !tween._paused && !tween._gc) {
            if (pauseTween === tween) {
              pauseTween = tween._prev; //the linked list is organized by _startTime, thus it's possible that a tween could start BEFORE the pause and end after it, in which case it would be positioned before the pause tween in the linked list, but we should render it before we pause() the timeline and cease rendering. This is only a concern when going in reverse.

              while (pauseTween && pauseTween.endTime() > this._time) {
                pauseTween.render(pauseTween._reversed ? pauseTween.totalDuration() - (time - pauseTween._startTime) * pauseTween._timeScale : (time - pauseTween._startTime) * pauseTween._timeScale, suppressEvents, force);
                pauseTween = pauseTween._prev;
              }

              pauseTween = null;
              this.pause();
            }

            if (!tween._reversed) {
              tween.render((time - tween._startTime) * tween._timeScale, suppressEvents, force);
            } else {
              tween.render((!tween._dirty ? tween._totalDuration : tween.totalDuration()) - (time - tween._startTime) * tween._timeScale, suppressEvents, force);
            }
          }

          tween = next;
        }
      }

      if (this._onUpdate) if (!suppressEvents) {
        if (_lazyTweens.length) {
          //in case rendering caused any tweens to lazy-init, we should render them because typically when a timeline finishes, users expect things to have rendered fully. Imagine an onUpdate on a timeline that reports/checks tweened values.
          _lazyRender();
        }

        this._callback("onUpdate");
      }
      if (callback) if (!this._gc) if (prevStart === this._startTime || prevTimeScale !== this._timeScale) if (this._time === 0 || totalDur >= this.totalDuration()) {
        //if one of the tweens that was rendered altered this timeline's startTime (like if an onComplete reversed the timeline), it probably isn't complete. If it is, don't worry, because whatever call altered the startTime would complete if it was necessary at the new time. The only exception is the timeScale property. Also check _gc because there's a chance that kill() could be called in an onUpdate
        if (isComplete) {
          if (_lazyTweens.length) {
            //in case rendering caused any tweens to lazy-init, we should render them because typically when a timeline finishes, users expect things to have rendered fully. Imagine an onComplete on a timeline that reports/checks tweened values.
            _lazyRender();
          }

          if (this._timeline.autoRemoveChildren) {
            this._enabled(false, false);
          }

          this._active = false;
        }

        if (!suppressEvents && this.vars[callback]) {
          this._callback(callback);
        }
      }
    };

    p._hasPausedChild = function () {
      var tween = this._first;

      while (tween) {
        if (tween._paused || tween instanceof TimelineLite && tween._hasPausedChild()) {
          return true;
        }

        tween = tween._next;
      }

      return false;
    };

    p.getChildren = function (nested, tweens, timelines, ignoreBeforeTime) {
      ignoreBeforeTime = ignoreBeforeTime || -9999999999;
      var a = [],
          tween = this._first,
          cnt = 0;

      while (tween) {
        if (tween._startTime < ignoreBeforeTime) {//do nothing
        } else if (tween instanceof TweenLite) {
          if (tweens !== false) {
            a[cnt++] = tween;
          }
        } else {
          if (timelines !== false) {
            a[cnt++] = tween;
          }

          if (nested !== false) {
            a = a.concat(tween.getChildren(true, tweens, timelines));
            cnt = a.length;
          }
        }

        tween = tween._next;
      }

      return a;
    };

    p.getTweensOf = function (target, nested) {
      var disabled = this._gc,
          a = [],
          cnt = 0,
          tweens,
          i;

      if (disabled) {
        this._enabled(true, true); //getTweensOf() filters out disabled tweens, and we have to mark them as _gc = true when the timeline completes in order to allow clean garbage collection, so temporarily re-enable the timeline here.

      }

      tweens = TweenLite.getTweensOf(target);
      i = tweens.length;

      while (--i > -1) {
        if (tweens[i].timeline === this || nested && this._contains(tweens[i])) {
          a[cnt++] = tweens[i];
        }
      }

      if (disabled) {
        this._enabled(false, true);
      }

      return a;
    };

    p.recent = function () {
      return this._recent;
    };

    p._contains = function (tween) {
      var tl = tween.timeline;

      while (tl) {
        if (tl === this) {
          return true;
        }

        tl = tl.timeline;
      }

      return false;
    };

    p.shiftChildren = function (amount, adjustLabels, ignoreBeforeTime) {
      ignoreBeforeTime = ignoreBeforeTime || 0;
      var tween = this._first,
          labels = this._labels,
          p;

      while (tween) {
        if (tween._startTime >= ignoreBeforeTime) {
          tween._startTime += amount;
        }

        tween = tween._next;
      }

      if (adjustLabels) {
        for (p in labels) {
          if (labels[p] >= ignoreBeforeTime) {
            labels[p] += amount;
          }
        }
      }

      return this._uncache(true);
    };

    p._kill = function (vars, target) {
      if (!vars && !target) {
        return this._enabled(false, false);
      }

      var tweens = !target ? this.getChildren(true, true, false) : this.getTweensOf(target),
          i = tweens.length,
          changed = false;

      while (--i > -1) {
        if (tweens[i]._kill(vars, target)) {
          changed = true;
        }
      }

      return changed;
    };

    p.clear = function (labels) {
      var tweens = this.getChildren(false, true, true),
          i = tweens.length;
      this._time = this._totalTime = 0;

      while (--i > -1) {
        tweens[i]._enabled(false, false);
      }

      if (labels !== false) {
        this._labels = {};
      }

      return this._uncache(true);
    };

    p.invalidate = function () {
      var tween = this._first;

      while (tween) {
        tween.invalidate();
        tween = tween._next;
      }

      return Animation.prototype.invalidate.call(this);
      ;
    };

    p._enabled = function (enabled, ignoreTimeline) {
      if (enabled === this._gc) {
        var tween = this._first;

        while (tween) {
          tween._enabled(enabled, true);

          tween = tween._next;
        }
      }

      return SimpleTimeline.prototype._enabled.call(this, enabled, ignoreTimeline);
    };

    p.totalTime = function (time, suppressEvents, uncapped) {
      this._forcingPlayhead = true;
      var val = Animation.prototype.totalTime.apply(this, arguments);
      this._forcingPlayhead = false;
      return val;
    };

    p.duration = function (value) {
      if (!arguments.length) {
        if (this._dirty) {
          this.totalDuration(); //just triggers recalculation
        }

        return this._duration;
      }

      if (this.duration() !== 0 && value !== 0) {
        this.timeScale(this._duration / value);
      }

      return this;
    };

    p.totalDuration = function (value) {
      if (!arguments.length) {
        if (this._dirty) {
          var max = 0,
              tween = this._last,
              prevStart = 999999999999,
              prev,
              end;

          while (tween) {
            prev = tween._prev; //record it here in case the tween changes position in the sequence...

            if (tween._dirty) {
              tween.totalDuration(); //could change the tween._startTime, so make sure the tween's cache is clean before analyzing it.
            }

            if (tween._startTime > prevStart && this._sortChildren && !tween._paused && !this._calculatingDuration) {
              //in case one of the tweens shifted out of order, it needs to be re-inserted into the correct position in the sequence
              this._calculatingDuration = 1; //prevent endless recursive calls - there are methods that get triggered that check duration/totalDuration when we add(), like _parseTimeOrLabel().

              this.add(tween, tween._startTime - tween._delay);
              this._calculatingDuration = 0;
            } else {
              prevStart = tween._startTime;
            }

            if (tween._startTime < 0 && !tween._paused) {
              //children aren't allowed to have negative startTimes unless smoothChildTiming is true, so adjust here if one is found.
              max -= tween._startTime;

              if (this._timeline.smoothChildTiming) {
                this._startTime += tween._startTime / this._timeScale;
                this._time -= tween._startTime;
                this._totalTime -= tween._startTime;
                this._rawPrevTime -= tween._startTime;
              }

              this.shiftChildren(-tween._startTime, false, -9999999999);
              prevStart = 0;
            }

            end = tween._startTime + tween._totalDuration / tween._timeScale;

            if (end > max) {
              max = end;
            }

            tween = prev;
          }

          this._duration = this._totalDuration = max;
          this._dirty = false;
        }

        return this._totalDuration;
      }

      return value && this.totalDuration() ? this.timeScale(this._totalDuration / value) : this;
    };

    p.paused = function (value) {
      if (!value) {
        //if there's a pause directly at the spot from where we're unpausing, skip it.
        var tween = this._first,
            time = this._time;

        while (tween) {
          if (tween._startTime === time && tween.data === "isPause") {
            tween._rawPrevTime = 0; //remember, _rawPrevTime is how zero-duration tweens/callbacks sense directionality and determine whether or not to fire. If _rawPrevTime is the same as _startTime on the next render, it won't fire.
          }

          tween = tween._next;
        }
      }

      return Animation.prototype.paused.apply(this, arguments);
    };

    p.usesFrames = function () {
      var tl = this._timeline;

      while (tl._timeline) {
        tl = tl._timeline;
      }

      return tl === Animation._rootFramesTimeline;
    };

    p.rawTime = function (wrapRepeats) {
      return wrapRepeats && (this._paused || this._repeat && this.time() > 0 && this.totalProgress() < 1) ? this._totalTime % (this._duration + this._repeatDelay) : this._paused ? this._totalTime : (this._timeline.rawTime(wrapRepeats) - this._startTime) * this._timeScale;
    };

    return TimelineLite;
  }, true);
  /*
   * ----------------------------------------------------------------
   * TimelineMax
   * ----------------------------------------------------------------
   */


  _gsScope._gsDefine("TimelineMax", ["TimelineLite", "TweenLite", "easing.Ease"], function (TimelineLite, TweenLite, Ease) {
    var TimelineMax = function TimelineMax(vars) {
      TimelineLite.call(this, vars);
      this._repeat = this.vars.repeat || 0;
      this._repeatDelay = this.vars.repeatDelay || 0;
      this._cycle = 0;
      this._yoyo = this.vars.yoyo === true;
      this._dirty = true;
    },
        _tinyNum = 0.0000000001,
        TweenLiteInternals = TweenLite._internals,
        _lazyTweens = TweenLiteInternals.lazyTweens,
        _lazyRender = TweenLiteInternals.lazyRender,
        _globals = _gsScope._gsDefine.globals,
        _easeNone = new Ease(null, null, 1, 0),
        p = TimelineMax.prototype = new TimelineLite();

    p.constructor = TimelineMax;
    p.kill()._gc = false;
    TimelineMax.version = "1.20.4";

    p.invalidate = function () {
      this._yoyo = this.vars.yoyo === true;
      this._repeat = this.vars.repeat || 0;
      this._repeatDelay = this.vars.repeatDelay || 0;

      this._uncache(true);

      return TimelineLite.prototype.invalidate.call(this);
    };

    p.addCallback = function (callback, position, params, scope) {
      return this.add(TweenLite.delayedCall(0, callback, params, scope), position);
    };

    p.removeCallback = function (callback, position) {
      if (callback) {
        if (position == null) {
          this._kill(null, callback);
        } else {
          var a = this.getTweensOf(callback, false),
              i = a.length,
              time = this._parseTimeOrLabel(position);

          while (--i > -1) {
            if (a[i]._startTime === time) {
              a[i]._enabled(false, false);
            }
          }
        }
      }

      return this;
    };

    p.removePause = function (position) {
      return this.removeCallback(TimelineLite._internals.pauseCallback, position);
    };

    p.tweenTo = function (position, vars) {
      vars = vars || {};
      var copy = {
        ease: _easeNone,
        useFrames: this.usesFrames(),
        immediateRender: false,
        lazy: false
      },
          Engine = vars.repeat && _globals.TweenMax || TweenLite,
          duration,
          p,
          t;

      for (p in vars) {
        copy[p] = vars[p];
      }

      copy.time = this._parseTimeOrLabel(position);
      duration = Math.abs(Number(copy.time) - this._time) / this._timeScale || 0.001;
      t = new Engine(this, duration, copy);

      copy.onStart = function () {
        t.target.paused(true);

        if (t.vars.time !== t.target.time() && duration === t.duration() && !t.isFromTo) {
          //don't make the duration zero - if it's supposed to be zero, don't worry because it's already initting the tween and will complete immediately, effectively making the duration zero anyway. If we make duration zero, the tween won't run at all.
          t.duration(Math.abs(t.vars.time - t.target.time()) / t.target._timeScale).render(t.time(), true, true); //render() right away to ensure that things look right, especially in the case of .tweenTo(0).
        }

        if (vars.onStart) {
          //in case the user had an onStart in the vars - we don't want to overwrite it.
          vars.onStart.apply(vars.onStartScope || vars.callbackScope || t, vars.onStartParams || []); //don't use t._callback("onStart") or it'll point to the copy.onStart and we'll get a recursion error.
        }
      };

      return t;
    };

    p.tweenFromTo = function (fromPosition, toPosition, vars) {
      vars = vars || {};
      fromPosition = this._parseTimeOrLabel(fromPosition);
      vars.startAt = {
        onComplete: this.seek,
        onCompleteParams: [fromPosition],
        callbackScope: this
      };
      vars.immediateRender = vars.immediateRender !== false;
      var t = this.tweenTo(toPosition, vars);
      t.isFromTo = 1; //to ensure we don't mess with the duration in the onStart (we've got the start and end values here, so lock it in)

      return t.duration(Math.abs(t.vars.time - fromPosition) / this._timeScale || 0.001);
    };

    p.render = function (time, suppressEvents, force) {
      if (this._gc) {
        this._enabled(true, false);
      }

      var prevTime = this._time,
          totalDur = !this._dirty ? this._totalDuration : this.totalDuration(),
          dur = this._duration,
          prevTotalTime = this._totalTime,
          prevStart = this._startTime,
          prevTimeScale = this._timeScale,
          prevRawPrevTime = this._rawPrevTime,
          prevPaused = this._paused,
          prevCycle = this._cycle,
          tween,
          isComplete,
          next,
          callback,
          internalForce,
          cycleDuration,
          pauseTween,
          curTime;

      if (prevTime !== this._time) {
        //if totalDuration() finds a child with a negative startTime and smoothChildTiming is true, things get shifted around internally so we need to adjust the time accordingly. For example, if a tween starts at -30 we must shift EVERYTHING forward 30 seconds and move this timeline's startTime backward by 30 seconds so that things align with the playhead (no jump).
        time += this._time - prevTime;
      }

      if (time >= totalDur - 0.0000001 && time >= 0) {
        //to work around occasional floating point math artifacts.
        if (!this._locked) {
          this._totalTime = totalDur;
          this._cycle = this._repeat;
        }

        if (!this._reversed) if (!this._hasPausedChild()) {
          isComplete = true;
          callback = "onComplete";
          internalForce = !!this._timeline.autoRemoveChildren; //otherwise, if the animation is unpaused/activated after it's already finished, it doesn't get removed from the parent timeline.

          if (this._duration === 0) if (time <= 0 && time >= -0.0000001 || prevRawPrevTime < 0 || prevRawPrevTime === _tinyNum) if (prevRawPrevTime !== time && this._first) {
            internalForce = true;

            if (prevRawPrevTime > _tinyNum) {
              callback = "onReverseComplete";
            }
          }
        }
        this._rawPrevTime = this._duration || !suppressEvents || time || this._rawPrevTime === time ? time : _tinyNum; //when the playhead arrives at EXACTLY time 0 (right on top) of a zero-duration timeline or tween, we need to discern if events are suppressed so that when the playhead moves again (next time), it'll trigger the callback. If events are NOT suppressed, obviously the callback would be triggered in this render. Basically, the callback should fire either when the playhead ARRIVES or LEAVES this exact spot, not both. Imagine doing a timeline.seek(0) and there's a callback that sits at 0. Since events are suppressed on that seek() by default, nothing will fire, but when the playhead moves off of that position, the callback should fire. This behavior is what people intuitively expect. We set the _rawPrevTime to be a precise tiny number to indicate this scenario rather than using another property/variable which would increase memory usage. This technique is less readable, but more efficient.

        if (this._yoyo && (this._cycle & 1) !== 0) {
          this._time = time = 0;
        } else {
          this._time = dur;
          time = dur + 0.0001; //to avoid occasional floating point rounding errors - sometimes child tweens/timelines were not being fully completed (their progress might be 0.999999999999998 instead of 1 because when _time - tween._startTime is performed, floating point errors would return a value that was SLIGHTLY off). Try (999999999999.7 - 999999999999) * 1 = 0.699951171875 instead of 0.7. We cannot do less then 0.0001 because the same issue can occur when the duration is extremely large like 999999999999 in which case adding 0.00000001, for example, causes it to act like nothing was added.
        }
      } else if (time < 0.0000001) {
        //to work around occasional floating point math artifacts, round super small values to 0.
        if (!this._locked) {
          this._totalTime = this._cycle = 0;
        }

        this._time = 0;

        if (prevTime !== 0 || dur === 0 && prevRawPrevTime !== _tinyNum && (prevRawPrevTime > 0 || time < 0 && prevRawPrevTime >= 0) && !this._locked) {
          //edge case for checking time < 0 && prevRawPrevTime >= 0: a zero-duration fromTo() tween inside a zero-duration timeline (yeah, very rare)
          callback = "onReverseComplete";
          isComplete = this._reversed;
        }

        if (time < 0) {
          this._active = false;

          if (this._timeline.autoRemoveChildren && this._reversed) {
            internalForce = isComplete = true;
            callback = "onReverseComplete";
          } else if (prevRawPrevTime >= 0 && this._first) {
            //when going back beyond the start, force a render so that zero-duration tweens that sit at the very beginning render their start values properly. Otherwise, if the parent timeline's playhead lands exactly at this timeline's startTime, and then moves backwards, the zero-duration tweens at the beginning would still be at their end state.
            internalForce = true;
          }

          this._rawPrevTime = time;
        } else {
          this._rawPrevTime = dur || !suppressEvents || time || this._rawPrevTime === time ? time : _tinyNum; //when the playhead arrives at EXACTLY time 0 (right on top) of a zero-duration timeline or tween, we need to discern if events are suppressed so that when the playhead moves again (next time), it'll trigger the callback. If events are NOT suppressed, obviously the callback would be triggered in this render. Basically, the callback should fire either when the playhead ARRIVES or LEAVES this exact spot, not both. Imagine doing a timeline.seek(0) and there's a callback that sits at 0. Since events are suppressed on that seek() by default, nothing will fire, but when the playhead moves off of that position, the callback should fire. This behavior is what people intuitively expect. We set the _rawPrevTime to be a precise tiny number to indicate this scenario rather than using another property/variable which would increase memory usage. This technique is less readable, but more efficient.

          if (time === 0 && isComplete) {
            //if there's a zero-duration tween at the very beginning of a timeline and the playhead lands EXACTLY at time 0, that tween will correctly render its end values, but we need to keep the timeline alive for one more render so that the beginning values render properly as the parent's playhead keeps moving beyond the begining. Imagine obj.x starts at 0 and then we do tl.set(obj, {x:100}).to(obj, 1, {x:200}) and then later we tl.reverse()...the goal is to have obj.x revert to 0. If the playhead happens to land on exactly 0, without this chunk of code, it'd complete the timeline and remove it from the rendering queue (not good).
            tween = this._first;

            while (tween && tween._startTime === 0) {
              if (!tween._duration) {
                isComplete = false;
              }

              tween = tween._next;
            }
          }

          time = 0; //to avoid occasional floating point rounding errors (could cause problems especially with zero-duration tweens at the very beginning of the timeline)

          if (!this._initted) {
            internalForce = true;
          }
        }
      } else {
        if (dur === 0 && prevRawPrevTime < 0) {
          //without this, zero-duration repeating timelines (like with a simple callback nested at the very beginning and a repeatDelay) wouldn't render the first time through.
          internalForce = true;
        }

        this._time = this._rawPrevTime = time;

        if (!this._locked) {
          this._totalTime = time;

          if (this._repeat !== 0) {
            cycleDuration = dur + this._repeatDelay;
            this._cycle = this._totalTime / cycleDuration >> 0; //originally _totalTime % cycleDuration but floating point errors caused problems, so I normalized it. (4 % 0.8 should be 0 but it gets reported as 0.79999999!)

            if (this._cycle !== 0) if (this._cycle === this._totalTime / cycleDuration && prevTotalTime <= time) {
              this._cycle--; //otherwise when rendered exactly at the end time, it will act as though it is repeating (at the beginning)
            }
            this._time = this._totalTime - this._cycle * cycleDuration;
            if (this._yoyo) if ((this._cycle & 1) !== 0) {
              this._time = dur - this._time;
            }

            if (this._time > dur) {
              this._time = dur;
              time = dur + 0.0001; //to avoid occasional floating point rounding error
            } else if (this._time < 0) {
              this._time = time = 0;
            } else {
              time = this._time;
            }
          }
        }

        if (this._hasPause && !this._forcingPlayhead && !suppressEvents) {
          time = this._time;

          if (time >= prevTime || this._repeat && prevCycle !== this._cycle) {
            tween = this._first;

            while (tween && tween._startTime <= time && !pauseTween) {
              if (!tween._duration) if (tween.data === "isPause" && !tween.ratio && !(tween._startTime === 0 && this._rawPrevTime === 0)) {
                pauseTween = tween;
              }
              tween = tween._next;
            }
          } else {
            tween = this._last;

            while (tween && tween._startTime >= time && !pauseTween) {
              if (!tween._duration) if (tween.data === "isPause" && tween._rawPrevTime > 0) {
                pauseTween = tween;
              }
              tween = tween._prev;
            }
          }

          if (pauseTween && pauseTween._startTime < dur) {
            this._time = time = pauseTween._startTime;
            this._totalTime = time + this._cycle * (this._totalDuration + this._repeatDelay);
          }
        }
      }

      if (this._cycle !== prevCycle) if (!this._locked) {
        /*
        make sure children at the end/beginning of the timeline are rendered properly. If, for example,
        a 3-second long timeline rendered at 2.9 seconds previously, and now renders at 3.2 seconds (which
        would get transated to 2.8 seconds if the timeline yoyos or 0.2 seconds if it just repeats), there
        could be a callback or a short tween that's at 2.95 or 3 seconds in which wouldn't render. So
        we need to push the timeline to the end (and/or beginning depending on its yoyo value). Also we must
        ensure that zero-duration tweens at the very beginning or end of the TimelineMax work.
        */
        var backwards = this._yoyo && (prevCycle & 1) !== 0,
            wrap = backwards === (this._yoyo && (this._cycle & 1) !== 0),
            recTotalTime = this._totalTime,
            recCycle = this._cycle,
            recRawPrevTime = this._rawPrevTime,
            recTime = this._time;
        this._totalTime = prevCycle * dur;

        if (this._cycle < prevCycle) {
          backwards = !backwards;
        } else {
          this._totalTime += dur;
        }

        this._time = prevTime; //temporarily revert _time so that render() renders the children in the correct order. Without this, tweens won't rewind correctly. We could arhictect things in a "cleaner" way by splitting out the rendering queue into a separate method but for performance reasons, we kept it all inside this method.

        this._rawPrevTime = dur === 0 ? prevRawPrevTime - 0.0001 : prevRawPrevTime;
        this._cycle = prevCycle;
        this._locked = true; //prevents changes to totalTime and skips repeat/yoyo behavior when we recursively call render()

        prevTime = backwards ? 0 : dur;
        this.render(prevTime, suppressEvents, dur === 0);
        if (!suppressEvents) if (!this._gc) {
          if (this.vars.onRepeat) {
            this._cycle = recCycle; //in case the onRepeat alters the playhead or invalidates(), we shouldn't stay locked or use the previous cycle.

            this._locked = false;

            this._callback("onRepeat");
          }
        }

        if (prevTime !== this._time) {
          //in case there's a callback like onComplete in a nested tween/timeline that changes the playhead position, like via seek(), we should just abort.
          return;
        }

        if (wrap) {
          this._cycle = prevCycle; //if there's an onRepeat, we reverted this above, so make sure it's set properly again. We also unlocked in that scenario, so reset that too.

          this._locked = true;
          prevTime = backwards ? dur + 0.0001 : -0.0001;
          this.render(prevTime, true, false);
        }

        this._locked = false;

        if (this._paused && !prevPaused) {
          //if the render() triggered callback that paused this timeline, we should abort (very rare, but possible)
          return;
        }

        this._time = recTime;
        this._totalTime = recTotalTime;
        this._cycle = recCycle;
        this._rawPrevTime = recRawPrevTime;
      }

      if ((this._time === prevTime || !this._first) && !force && !internalForce && !pauseTween) {
        if (prevTotalTime !== this._totalTime) if (this._onUpdate) if (!suppressEvents) {
          //so that onUpdate fires even during the repeatDelay - as long as the totalTime changed, we should trigger onUpdate.
          this._callback("onUpdate");
        }
        return;
      } else if (!this._initted) {
        this._initted = true;
      }

      if (!this._active) if (!this._paused && this._totalTime !== prevTotalTime && time > 0) {
        this._active = true; //so that if the user renders the timeline (as opposed to the parent timeline rendering it), it is forced to re-render and align it with the proper time/frame on the next rendering cycle. Maybe the timeline already finished but the user manually re-renders it as halfway done, for example.
      }
      if (prevTotalTime === 0) if (this.vars.onStart) if (this._totalTime !== 0 || !this._totalDuration) if (!suppressEvents) {
        this._callback("onStart");
      }
      curTime = this._time;

      if (curTime >= prevTime) {
        tween = this._first;

        while (tween) {
          next = tween._next; //record it here because the value could change after rendering...

          if (curTime !== this._time || this._paused && !prevPaused) {
            //in case a tween pauses or seeks the timeline when rendering, like inside of an onUpdate/onComplete
            break;
          } else if (tween._active || tween._startTime <= this._time && !tween._paused && !tween._gc) {
            if (pauseTween === tween) {
              this.pause();
            }

            if (!tween._reversed) {
              tween.render((time - tween._startTime) * tween._timeScale, suppressEvents, force);
            } else {
              tween.render((!tween._dirty ? tween._totalDuration : tween.totalDuration()) - (time - tween._startTime) * tween._timeScale, suppressEvents, force);
            }
          }

          tween = next;
        }
      } else {
        tween = this._last;

        while (tween) {
          next = tween._prev; //record it here because the value could change after rendering...

          if (curTime !== this._time || this._paused && !prevPaused) {
            //in case a tween pauses or seeks the timeline when rendering, like inside of an onUpdate/onComplete
            break;
          } else if (tween._active || tween._startTime <= prevTime && !tween._paused && !tween._gc) {
            if (pauseTween === tween) {
              pauseTween = tween._prev; //the linked list is organized by _startTime, thus it's possible that a tween could start BEFORE the pause and end after it, in which case it would be positioned before the pause tween in the linked list, but we should render it before we pause() the timeline and cease rendering. This is only a concern when going in reverse.

              while (pauseTween && pauseTween.endTime() > this._time) {
                pauseTween.render(pauseTween._reversed ? pauseTween.totalDuration() - (time - pauseTween._startTime) * pauseTween._timeScale : (time - pauseTween._startTime) * pauseTween._timeScale, suppressEvents, force);
                pauseTween = pauseTween._prev;
              }

              pauseTween = null;
              this.pause();
            }

            if (!tween._reversed) {
              tween.render((time - tween._startTime) * tween._timeScale, suppressEvents, force);
            } else {
              tween.render((!tween._dirty ? tween._totalDuration : tween.totalDuration()) - (time - tween._startTime) * tween._timeScale, suppressEvents, force);
            }
          }

          tween = next;
        }
      }

      if (this._onUpdate) if (!suppressEvents) {
        if (_lazyTweens.length) {
          //in case rendering caused any tweens to lazy-init, we should render them because typically when a timeline finishes, users expect things to have rendered fully. Imagine an onUpdate on a timeline that reports/checks tweened values.
          _lazyRender();
        }

        this._callback("onUpdate");
      }
      if (callback) if (!this._locked) if (!this._gc) if (prevStart === this._startTime || prevTimeScale !== this._timeScale) if (this._time === 0 || totalDur >= this.totalDuration()) {
        //if one of the tweens that was rendered altered this timeline's startTime (like if an onComplete reversed the timeline), it probably isn't complete. If it is, don't worry, because whatever call altered the startTime would complete if it was necessary at the new time. The only exception is the timeScale property. Also check _gc because there's a chance that kill() could be called in an onUpdate
        if (isComplete) {
          if (_lazyTweens.length) {
            //in case rendering caused any tweens to lazy-init, we should render them because typically when a timeline finishes, users expect things to have rendered fully. Imagine an onComplete on a timeline that reports/checks tweened values.
            _lazyRender();
          }

          if (this._timeline.autoRemoveChildren) {
            this._enabled(false, false);
          }

          this._active = false;
        }

        if (!suppressEvents && this.vars[callback]) {
          this._callback(callback);
        }
      }
    };

    p.getActive = function (nested, tweens, timelines) {
      if (nested == null) {
        nested = true;
      }

      if (tweens == null) {
        tweens = true;
      }

      if (timelines == null) {
        timelines = false;
      }

      var a = [],
          all = this.getChildren(nested, tweens, timelines),
          cnt = 0,
          l = all.length,
          i,
          tween;

      for (i = 0; i < l; i++) {
        tween = all[i];

        if (tween.isActive()) {
          a[cnt++] = tween;
        }
      }

      return a;
    };

    p.getLabelAfter = function (time) {
      if (!time) if (time !== 0) {
        //faster than isNan()
        time = this._time;
      }
      var labels = this.getLabelsArray(),
          l = labels.length,
          i;

      for (i = 0; i < l; i++) {
        if (labels[i].time > time) {
          return labels[i].name;
        }
      }

      return null;
    };

    p.getLabelBefore = function (time) {
      if (time == null) {
        time = this._time;
      }

      var labels = this.getLabelsArray(),
          i = labels.length;

      while (--i > -1) {
        if (labels[i].time < time) {
          return labels[i].name;
        }
      }

      return null;
    };

    p.getLabelsArray = function () {
      var a = [],
          cnt = 0,
          p;

      for (p in this._labels) {
        a[cnt++] = {
          time: this._labels[p],
          name: p
        };
      }

      a.sort(function (a, b) {
        return a.time - b.time;
      });
      return a;
    };

    p.invalidate = function () {
      this._locked = false; //unlock and set cycle in case invalidate() is called from inside an onRepeat

      return TimelineLite.prototype.invalidate.call(this);
    }; //---- GETTERS / SETTERS -------------------------------------------------------------------------------------------------------


    p.progress = function (value, suppressEvents) {
      return !arguments.length ? this._time / this.duration() || 0 : this.totalTime(this.duration() * (this._yoyo && (this._cycle & 1) !== 0 ? 1 - value : value) + this._cycle * (this._duration + this._repeatDelay), suppressEvents);
    };

    p.totalProgress = function (value, suppressEvents) {
      return !arguments.length ? this._totalTime / this.totalDuration() || 0 : this.totalTime(this.totalDuration() * value, suppressEvents);
    };

    p.totalDuration = function (value) {
      if (!arguments.length) {
        if (this._dirty) {
          TimelineLite.prototype.totalDuration.call(this); //just forces refresh
          //Instead of Infinity, we use 999999999999 so that we can accommodate reverses.

          this._totalDuration = this._repeat === -1 ? 999999999999 : this._duration * (this._repeat + 1) + this._repeatDelay * this._repeat;
        }

        return this._totalDuration;
      }

      return this._repeat === -1 || !value ? this : this.timeScale(this.totalDuration() / value);
    };

    p.time = function (value, suppressEvents) {
      if (!arguments.length) {
        return this._time;
      }

      if (this._dirty) {
        this.totalDuration();
      }

      if (value > this._duration) {
        value = this._duration;
      }

      if (this._yoyo && (this._cycle & 1) !== 0) {
        value = this._duration - value + this._cycle * (this._duration + this._repeatDelay);
      } else if (this._repeat !== 0) {
        value += this._cycle * (this._duration + this._repeatDelay);
      }

      return this.totalTime(value, suppressEvents);
    };

    p.repeat = function (value) {
      if (!arguments.length) {
        return this._repeat;
      }

      this._repeat = value;
      return this._uncache(true);
    };

    p.repeatDelay = function (value) {
      if (!arguments.length) {
        return this._repeatDelay;
      }

      this._repeatDelay = value;
      return this._uncache(true);
    };

    p.yoyo = function (value) {
      if (!arguments.length) {
        return this._yoyo;
      }

      this._yoyo = value;
      return this;
    };

    p.currentLabel = function (value) {
      if (!arguments.length) {
        return this.getLabelBefore(this._time + 0.00000001);
      }

      return this.seek(value, true);
    };

    return TimelineMax;
  }, true);
  /*
   * ----------------------------------------------------------------
   * BezierPlugin
   * ----------------------------------------------------------------
   */


  (function () {
    var _RAD2DEG = 180 / Math.PI,
        _r1 = [],
        _r2 = [],
        _r3 = [],
        _corProps = {},
        _globals = _gsScope._gsDefine.globals,
        Segment = function Segment(a, b, c, d) {
      if (c === d) {
        //if c and d match, the final autoRotate value could lock at -90 degrees, so differentiate them slightly.
        c = d - (d - b) / 1000000;
      }

      if (a === b) {
        //if a and b match, the starting autoRotate value could lock at -90 degrees, so differentiate them slightly.
        b = a + (c - a) / 1000000;
      }

      this.a = a;
      this.b = b;
      this.c = c;
      this.d = d;
      this.da = d - a;
      this.ca = c - a;
      this.ba = b - a;
    },
        _correlate = ",x,y,z,left,top,right,bottom,marginTop,marginLeft,marginRight,marginBottom,paddingLeft,paddingTop,paddingRight,paddingBottom,backgroundPosition,backgroundPosition_y,",
        cubicToQuadratic = function cubicToQuadratic(a, b, c, d) {
      var q1 = {
        a: a
      },
          q2 = {},
          q3 = {},
          q4 = {
        c: d
      },
          mab = (a + b) / 2,
          mbc = (b + c) / 2,
          mcd = (c + d) / 2,
          mabc = (mab + mbc) / 2,
          mbcd = (mbc + mcd) / 2,
          m8 = (mbcd - mabc) / 8;
      q1.b = mab + (a - mab) / 4;
      q2.b = mabc + m8;
      q1.c = q2.a = (q1.b + q2.b) / 2;
      q2.c = q3.a = (mabc + mbcd) / 2;
      q3.b = mbcd - m8;
      q4.b = mcd + (d - mcd) / 4;
      q3.c = q4.a = (q3.b + q4.b) / 2;
      return [q1, q2, q3, q4];
    },
        _calculateControlPoints = function _calculateControlPoints(a, curviness, quad, basic, correlate) {
      var l = a.length - 1,
          ii = 0,
          cp1 = a[0].a,
          i,
          p1,
          p2,
          p3,
          seg,
          m1,
          m2,
          mm,
          cp2,
          qb,
          r1,
          r2,
          tl;

      for (i = 0; i < l; i++) {
        seg = a[ii];
        p1 = seg.a;
        p2 = seg.d;
        p3 = a[ii + 1].d;

        if (correlate) {
          r1 = _r1[i];
          r2 = _r2[i];
          tl = (r2 + r1) * curviness * 0.25 / (basic ? 0.5 : _r3[i] || 0.5);
          m1 = p2 - (p2 - p1) * (basic ? curviness * 0.5 : r1 !== 0 ? tl / r1 : 0);
          m2 = p2 + (p3 - p2) * (basic ? curviness * 0.5 : r2 !== 0 ? tl / r2 : 0);
          mm = p2 - (m1 + ((m2 - m1) * (r1 * 3 / (r1 + r2) + 0.5) / 4 || 0));
        } else {
          m1 = p2 - (p2 - p1) * curviness * 0.5;
          m2 = p2 + (p3 - p2) * curviness * 0.5;
          mm = p2 - (m1 + m2) / 2;
        }

        m1 += mm;
        m2 += mm;
        seg.c = cp2 = m1;

        if (i !== 0) {
          seg.b = cp1;
        } else {
          seg.b = cp1 = seg.a + (seg.c - seg.a) * 0.6; //instead of placing b on a exactly, we move it inline with c so that if the user specifies an ease like Back.easeIn or Elastic.easeIn which goes BEYOND the beginning, it will do so smoothly.
        }

        seg.da = p2 - p1;
        seg.ca = cp2 - p1;
        seg.ba = cp1 - p1;

        if (quad) {
          qb = cubicToQuadratic(p1, cp1, cp2, p2);
          a.splice(ii, 1, qb[0], qb[1], qb[2], qb[3]);
          ii += 4;
        } else {
          ii++;
        }

        cp1 = m2;
      }

      seg = a[ii];
      seg.b = cp1;
      seg.c = cp1 + (seg.d - cp1) * 0.4; //instead of placing c on d exactly, we move it inline with b so that if the user specifies an ease like Back.easeOut or Elastic.easeOut which goes BEYOND the end, it will do so smoothly.

      seg.da = seg.d - seg.a;
      seg.ca = seg.c - seg.a;
      seg.ba = cp1 - seg.a;

      if (quad) {
        qb = cubicToQuadratic(seg.a, cp1, seg.c, seg.d);
        a.splice(ii, 1, qb[0], qb[1], qb[2], qb[3]);
      }
    },
        _parseAnchors = function _parseAnchors(values, p, correlate, prepend) {
      var a = [],
          l,
          i,
          p1,
          p2,
          p3,
          tmp;

      if (prepend) {
        values = [prepend].concat(values);
        i = values.length;

        while (--i > -1) {
          if (typeof (tmp = values[i][p]) === "string") if (tmp.charAt(1) === "=") {
            values[i][p] = prepend[p] + Number(tmp.charAt(0) + tmp.substr(2)); //accommodate relative values. Do it inline instead of breaking it out into a function for speed reasons
          }
        }
      }

      l = values.length - 2;

      if (l < 0) {
        a[0] = new Segment(values[0][p], 0, 0, values[0][p]);
        return a;
      }

      for (i = 0; i < l; i++) {
        p1 = values[i][p];
        p2 = values[i + 1][p];
        a[i] = new Segment(p1, 0, 0, p2);

        if (correlate) {
          p3 = values[i + 2][p];
          _r1[i] = (_r1[i] || 0) + (p2 - p1) * (p2 - p1);
          _r2[i] = (_r2[i] || 0) + (p3 - p2) * (p3 - p2);
        }
      }

      a[i] = new Segment(values[i][p], 0, 0, values[i + 1][p]);
      return a;
    },
        bezierThrough = function bezierThrough(values, curviness, quadratic, basic, correlate, prepend) {
      var obj = {},
          props = [],
          first = prepend || values[0],
          i,
          p,
          a,
          j,
          r,
          l,
          seamless,
          last;
      correlate = typeof correlate === "string" ? "," + correlate + "," : _correlate;

      if (curviness == null) {
        curviness = 1;
      }

      for (p in values[0]) {
        props.push(p);
      } //check to see if the last and first values are identical (well, within 0.05). If so, make seamless by appending the second element to the very end of the values array and the 2nd-to-last element to the very beginning (we'll remove those segments later)


      if (values.length > 1) {
        last = values[values.length - 1];
        seamless = true;
        i = props.length;

        while (--i > -1) {
          p = props[i];

          if (Math.abs(first[p] - last[p]) > 0.05) {
            //build in a tolerance of +/-0.05 to accommodate rounding errors.
            seamless = false;
            break;
          }
        }

        if (seamless) {
          values = values.concat(); //duplicate the array to avoid contaminating the original which the user may be reusing for other tweens

          if (prepend) {
            values.unshift(prepend);
          }

          values.push(values[1]);
          prepend = values[values.length - 3];
        }
      }

      _r1.length = _r2.length = _r3.length = 0;
      i = props.length;

      while (--i > -1) {
        p = props[i];
        _corProps[p] = correlate.indexOf("," + p + ",") !== -1;
        obj[p] = _parseAnchors(values, p, _corProps[p], prepend);
      }

      i = _r1.length;

      while (--i > -1) {
        _r1[i] = Math.sqrt(_r1[i]);
        _r2[i] = Math.sqrt(_r2[i]);
      }

      if (!basic) {
        i = props.length;

        while (--i > -1) {
          if (_corProps[p]) {
            a = obj[props[i]];
            l = a.length - 1;

            for (j = 0; j < l; j++) {
              r = a[j + 1].da / _r2[j] + a[j].da / _r1[j] || 0;
              _r3[j] = (_r3[j] || 0) + r * r;
            }
          }
        }

        i = _r3.length;

        while (--i > -1) {
          _r3[i] = Math.sqrt(_r3[i]);
        }
      }

      i = props.length;
      j = quadratic ? 4 : 1;

      while (--i > -1) {
        p = props[i];
        a = obj[p];

        _calculateControlPoints(a, curviness, quadratic, basic, _corProps[p]); //this method requires that _parseAnchors() and _setSegmentRatios() ran first so that _r1, _r2, and _r3 values are populated for all properties


        if (seamless) {
          a.splice(0, j);
          a.splice(a.length - j, j);
        }
      }

      return obj;
    },
        _parseBezierData = function _parseBezierData(values, type, prepend) {
      type = type || "soft";
      var obj = {},
          inc = type === "cubic" ? 3 : 2,
          soft = type === "soft",
          props = [],
          a,
          b,
          c,
          d,
          cur,
          i,
          j,
          l,
          p,
          cnt,
          tmp;

      if (soft && prepend) {
        values = [prepend].concat(values);
      }

      if (values == null || values.length < inc + 1) {
        throw "invalid Bezier data";
      }

      for (p in values[0]) {
        props.push(p);
      }

      i = props.length;

      while (--i > -1) {
        p = props[i];
        obj[p] = cur = [];
        cnt = 0;
        l = values.length;

        for (j = 0; j < l; j++) {
          a = prepend == null ? values[j][p] : typeof (tmp = values[j][p]) === "string" && tmp.charAt(1) === "=" ? prepend[p] + Number(tmp.charAt(0) + tmp.substr(2)) : Number(tmp);
          if (soft) if (j > 1) if (j < l - 1) {
            cur[cnt++] = (a + cur[cnt - 2]) / 2;
          }
          cur[cnt++] = a;
        }

        l = cnt - inc + 1;
        cnt = 0;

        for (j = 0; j < l; j += inc) {
          a = cur[j];
          b = cur[j + 1];
          c = cur[j + 2];
          d = inc === 2 ? 0 : cur[j + 3];
          cur[cnt++] = tmp = inc === 3 ? new Segment(a, b, c, d) : new Segment(a, (2 * b + a) / 3, (2 * b + c) / 3, c);
        }

        cur.length = cnt;
      }

      return obj;
    },
        _addCubicLengths = function _addCubicLengths(a, steps, resolution) {
      var inc = 1 / resolution,
          j = a.length,
          d,
          d1,
          s,
          da,
          ca,
          ba,
          p,
          i,
          inv,
          bez,
          index;

      while (--j > -1) {
        bez = a[j];
        s = bez.a;
        da = bez.d - s;
        ca = bez.c - s;
        ba = bez.b - s;
        d = d1 = 0;

        for (i = 1; i <= resolution; i++) {
          p = inc * i;
          inv = 1 - p;
          d = d1 - (d1 = (p * p * da + 3 * inv * (p * ca + inv * ba)) * p);
          index = j * resolution + i - 1;
          steps[index] = (steps[index] || 0) + d * d;
        }
      }
    },
        _parseLengthData = function _parseLengthData(obj, resolution) {
      resolution = resolution >> 0 || 6;
      var a = [],
          lengths = [],
          d = 0,
          total = 0,
          threshold = resolution - 1,
          segments = [],
          curLS = [],
          //current length segments array
      p,
          i,
          l,
          index;

      for (p in obj) {
        _addCubicLengths(obj[p], a, resolution);
      }

      l = a.length;

      for (i = 0; i < l; i++) {
        d += Math.sqrt(a[i]);
        index = i % resolution;
        curLS[index] = d;

        if (index === threshold) {
          total += d;
          index = i / resolution >> 0;
          segments[index] = curLS;
          lengths[index] = total;
          d = 0;
          curLS = [];
        }
      }

      return {
        length: total,
        lengths: lengths,
        segments: segments
      };
    },
        BezierPlugin = _gsScope._gsDefine.plugin({
      propName: "bezier",
      priority: -1,
      version: "1.3.8",
      API: 2,
      global: true,
      //gets called when the tween renders for the first time. This is where initial values should be recorded and any setup routines should run.
      init: function init(target, vars, tween) {
        this._target = target;

        if (vars instanceof Array) {
          vars = {
            values: vars
          };
        }

        this._func = {};
        this._mod = {};
        this._props = [];
        this._timeRes = vars.timeResolution == null ? 6 : parseInt(vars.timeResolution, 10);
        var values = vars.values || [],
            first = {},
            second = values[0],
            autoRotate = vars.autoRotate || tween.vars.orientToBezier,
            p,
            isFunc,
            i,
            j,
            prepend;
        this._autoRotate = autoRotate ? autoRotate instanceof Array ? autoRotate : [["x", "y", "rotation", autoRotate === true ? 0 : Number(autoRotate) || 0]] : null;

        for (p in second) {
          this._props.push(p);
        }

        i = this._props.length;

        while (--i > -1) {
          p = this._props[i];

          this._overwriteProps.push(p);

          isFunc = this._func[p] = typeof target[p] === "function";
          first[p] = !isFunc ? parseFloat(target[p]) : target[p.indexOf("set") || typeof target["get" + p.substr(3)] !== "function" ? p : "get" + p.substr(3)]();
          if (!prepend) if (first[p] !== values[0][p]) {
            prepend = first;
          }
        }

        this._beziers = vars.type !== "cubic" && vars.type !== "quadratic" && vars.type !== "soft" ? bezierThrough(values, isNaN(vars.curviness) ? 1 : vars.curviness, false, vars.type === "thruBasic", vars.correlate, prepend) : _parseBezierData(values, vars.type, first);
        this._segCount = this._beziers[p].length;

        if (this._timeRes) {
          var ld = _parseLengthData(this._beziers, this._timeRes);

          this._length = ld.length;
          this._lengths = ld.lengths;
          this._segments = ld.segments;
          this._l1 = this._li = this._s1 = this._si = 0;
          this._l2 = this._lengths[0];
          this._curSeg = this._segments[0];
          this._s2 = this._curSeg[0];
          this._prec = 1 / this._curSeg.length;
        }

        if (autoRotate = this._autoRotate) {
          this._initialRotations = [];

          if (!(autoRotate[0] instanceof Array)) {
            this._autoRotate = autoRotate = [autoRotate];
          }

          i = autoRotate.length;

          while (--i > -1) {
            for (j = 0; j < 3; j++) {
              p = autoRotate[i][j];
              this._func[p] = typeof target[p] === "function" ? target[p.indexOf("set") || typeof target["get" + p.substr(3)] !== "function" ? p : "get" + p.substr(3)] : false;
            }

            p = autoRotate[i][2];
            this._initialRotations[i] = (this._func[p] ? this._func[p].call(this._target) : this._target[p]) || 0;

            this._overwriteProps.push(p);
          }
        }

        this._startRatio = tween.vars.runBackwards ? 1 : 0; //we determine the starting ratio when the tween inits which is always 0 unless the tween has runBackwards:true (indicating it's a from() tween) in which case it's 1.

        return true;
      },
      //called each time the values should be updated, and the ratio gets passed as the only parameter (typically it's a value between 0 and 1, but it can exceed those when using an ease like Elastic.easeOut or Back.easeOut, etc.)
      set: function set(v) {
        var segments = this._segCount,
            func = this._func,
            target = this._target,
            notStart = v !== this._startRatio,
            curIndex,
            inv,
            i,
            p,
            b,
            t,
            val,
            l,
            lengths,
            curSeg;

        if (!this._timeRes) {
          curIndex = v < 0 ? 0 : v >= 1 ? segments - 1 : segments * v >> 0;
          t = (v - curIndex * (1 / segments)) * segments;
        } else {
          lengths = this._lengths;
          curSeg = this._curSeg;
          v *= this._length;
          i = this._li; //find the appropriate segment (if the currently cached one isn't correct)

          if (v > this._l2 && i < segments - 1) {
            l = segments - 1;

            while (i < l && (this._l2 = lengths[++i]) <= v) {}

            this._l1 = lengths[i - 1];
            this._li = i;
            this._curSeg = curSeg = this._segments[i];
            this._s2 = curSeg[this._s1 = this._si = 0];
          } else if (v < this._l1 && i > 0) {
            while (i > 0 && (this._l1 = lengths[--i]) >= v) {}

            if (i === 0 && v < this._l1) {
              this._l1 = 0;
            } else {
              i++;
            }

            this._l2 = lengths[i];
            this._li = i;
            this._curSeg = curSeg = this._segments[i];
            this._s1 = curSeg[(this._si = curSeg.length - 1) - 1] || 0;
            this._s2 = curSeg[this._si];
          }

          curIndex = i; //now find the appropriate sub-segment (we split it into the number of pieces that was defined by "precision" and measured each one)

          v -= this._l1;
          i = this._si;

          if (v > this._s2 && i < curSeg.length - 1) {
            l = curSeg.length - 1;

            while (i < l && (this._s2 = curSeg[++i]) <= v) {}

            this._s1 = curSeg[i - 1];
            this._si = i;
          } else if (v < this._s1 && i > 0) {
            while (i > 0 && (this._s1 = curSeg[--i]) >= v) {}

            if (i === 0 && v < this._s1) {
              this._s1 = 0;
            } else {
              i++;
            }

            this._s2 = curSeg[i];
            this._si = i;
          }

          t = (i + (v - this._s1) / (this._s2 - this._s1)) * this._prec || 0;
        }

        inv = 1 - t;
        i = this._props.length;

        while (--i > -1) {
          p = this._props[i];
          b = this._beziers[p][curIndex];
          val = (t * t * b.da + 3 * inv * (t * b.ca + inv * b.ba)) * t + b.a;

          if (this._mod[p]) {
            val = this._mod[p](val, target);
          }

          if (func[p]) {
            target[p](val);
          } else {
            target[p] = val;
          }
        }

        if (this._autoRotate) {
          var ar = this._autoRotate,
              b2,
              x1,
              y1,
              x2,
              y2,
              add,
              conv;
          i = ar.length;

          while (--i > -1) {
            p = ar[i][2];
            add = ar[i][3] || 0;
            conv = ar[i][4] === true ? 1 : _RAD2DEG;
            b = this._beziers[ar[i][0]];
            b2 = this._beziers[ar[i][1]];

            if (b && b2) {
              //in case one of the properties got overwritten.
              b = b[curIndex];
              b2 = b2[curIndex];
              x1 = b.a + (b.b - b.a) * t;
              x2 = b.b + (b.c - b.b) * t;
              x1 += (x2 - x1) * t;
              x2 += (b.c + (b.d - b.c) * t - x2) * t;
              y1 = b2.a + (b2.b - b2.a) * t;
              y2 = b2.b + (b2.c - b2.b) * t;
              y1 += (y2 - y1) * t;
              y2 += (b2.c + (b2.d - b2.c) * t - y2) * t;
              val = notStart ? Math.atan2(y2 - y1, x2 - x1) * conv + add : this._initialRotations[i];

              if (this._mod[p]) {
                val = this._mod[p](val, target); //for modProps
              }

              if (func[p]) {
                target[p](val);
              } else {
                target[p] = val;
              }
            }
          }
        }
      }
    }),
        p = BezierPlugin.prototype;

    BezierPlugin.bezierThrough = bezierThrough;
    BezierPlugin.cubicToQuadratic = cubicToQuadratic;
    BezierPlugin._autoCSS = true; //indicates that this plugin can be inserted into the "css" object using the autoCSS feature of TweenLite

    BezierPlugin.quadraticToCubic = function (a, b, c) {
      return new Segment(a, (2 * b + a) / 3, (2 * b + c) / 3, c);
    };

    BezierPlugin._cssRegister = function () {
      var CSSPlugin = _globals.CSSPlugin;

      if (!CSSPlugin) {
        return;
      }

      var _internals = CSSPlugin._internals,
          _parseToProxy = _internals._parseToProxy,
          _setPluginRatio = _internals._setPluginRatio,
          CSSPropTween = _internals.CSSPropTween;

      _internals._registerComplexSpecialProp("bezier", {
        parser: function parser(t, e, prop, cssp, pt, plugin) {
          if (e instanceof Array) {
            e = {
              values: e
            };
          }

          plugin = new BezierPlugin();
          var values = e.values,
              l = values.length - 1,
              pluginValues = [],
              v = {},
              i,
              p,
              data;

          if (l < 0) {
            return pt;
          }

          for (i = 0; i <= l; i++) {
            data = _parseToProxy(t, values[i], cssp, pt, plugin, l !== i);
            pluginValues[i] = data.end;
          }

          for (p in e) {
            v[p] = e[p]; //duplicate the vars object because we need to alter some things which would cause problems if the user plans to reuse the same vars object for another tween.
          }

          v.values = pluginValues;
          pt = new CSSPropTween(t, "bezier", 0, 0, data.pt, 2);
          pt.data = data;
          pt.plugin = plugin;
          pt.setRatio = _setPluginRatio;

          if (v.autoRotate === 0) {
            v.autoRotate = true;
          }

          if (v.autoRotate && !(v.autoRotate instanceof Array)) {
            i = v.autoRotate === true ? 0 : Number(v.autoRotate);
            v.autoRotate = data.end.left != null ? [["left", "top", "rotation", i, false]] : data.end.x != null ? [["x", "y", "rotation", i, false]] : false;
          }

          if (v.autoRotate) {
            if (!cssp._transform) {
              cssp._enableTransforms(false);
            }

            data.autoRotate = cssp._target._gsTransform;
            data.proxy.rotation = data.autoRotate.rotation || 0;

            cssp._overwriteProps.push("rotation");
          }

          plugin._onInitTween(data.proxy, v, cssp._tween);

          return pt;
        }
      });
    };

    p._mod = function (lookup) {
      var op = this._overwriteProps,
          i = op.length,
          val;

      while (--i > -1) {
        val = lookup[op[i]];

        if (val && typeof val === "function") {
          this._mod[op[i]] = val;
        }
      }
    };

    p._kill = function (lookup) {
      var a = this._props,
          p,
          i;

      for (p in this._beziers) {
        if (p in lookup) {
          delete this._beziers[p];
          delete this._func[p];
          i = a.length;

          while (--i > -1) {
            if (a[i] === p) {
              a.splice(i, 1);
            }
          }
        }
      }

      a = this._autoRotate;

      if (a) {
        i = a.length;

        while (--i > -1) {
          if (lookup[a[i][2]]) {
            a.splice(i, 1);
          }
        }
      }

      return this._super._kill.call(this, lookup);
    };
  })();
  /*
   * ----------------------------------------------------------------
   * CSSPlugin
   * ----------------------------------------------------------------
   */


  _gsScope._gsDefine("plugins.CSSPlugin", ["plugins.TweenPlugin", "TweenLite"], function (TweenPlugin, TweenLite) {
    /** @constructor **/
    var CSSPlugin = function CSSPlugin() {
      TweenPlugin.call(this, "css");
      this._overwriteProps.length = 0;
      this.setRatio = CSSPlugin.prototype.setRatio; //speed optimization (avoid prototype lookup on this "hot" method)
    },
        _globals = _gsScope._gsDefine.globals,
        _hasPriority,
        //turns true whenever a CSSPropTween instance is created that has a priority other than 0. This helps us discern whether or not we should spend the time organizing the linked list or not after a CSSPlugin's _onInitTween() method is called.
    _suffixMap,
        //we set this in _onInitTween() each time as a way to have a persistent variable we can use in other methods like _parse() without having to pass it around as a parameter and we keep _parse() decoupled from a particular CSSPlugin instance
    _cs,
        //computed style (we store this in a shared variable to conserve memory and make minification tighter
    _overwriteProps,
        //alias to the currently instantiating CSSPlugin's _overwriteProps array. We use this closure in order to avoid having to pass a reference around from method to method and aid in minification.
    _specialProps = {},
        p = CSSPlugin.prototype = new TweenPlugin("css");

    p.constructor = CSSPlugin;
    CSSPlugin.version = "1.20.4";
    CSSPlugin.API = 2;
    CSSPlugin.defaultTransformPerspective = 0;
    CSSPlugin.defaultSkewType = "compensated";
    CSSPlugin.defaultSmoothOrigin = true;
    p = "px"; //we'll reuse the "p" variable to keep file size down

    CSSPlugin.suffixMap = {
      top: p,
      right: p,
      bottom: p,
      left: p,
      width: p,
      height: p,
      fontSize: p,
      padding: p,
      margin: p,
      perspective: p,
      lineHeight: ""
    };

    var _numExp = /(?:\-|\.|\b)(\d|\.|e\-)+/g,
        _relNumExp = /(?:\d|\-\d|\.\d|\-\.\d|\+=\d|\-=\d|\+=.\d|\-=\.\d)+/g,
        _valuesExp = /(?:\+=|\-=|\-|\b)[\d\-\.]+[a-zA-Z0-9]*(?:%|\b)/gi,
        //finds all the values that begin with numbers or += or -= and then a number. Includes suffixes. We use this to split complex values apart like "1px 5px 20px rgb(255,102,51)"
    _NaNExp = /(?![+-]?\d*\.?\d+|[+-]|e[+-]\d+)[^0-9]/g,
        //also allows scientific notation and doesn't kill the leading -/+ in -= and +=
    _suffixExp = /(?:\d|\-|\+|=|#|\.)*/g,
        _opacityExp = /opacity *= *([^)]*)/i,
        _opacityValExp = /opacity:([^;]*)/i,
        _alphaFilterExp = /alpha\(opacity *=.+?\)/i,
        _rgbhslExp = /^(rgb|hsl)/,
        _capsExp = /([A-Z])/g,
        _camelExp = /-([a-z])/gi,
        _urlExp = /(^(?:url\(\"|url\())|(?:(\"\))$|\)$)/gi,
        //for pulling out urls from url(...) or url("...") strings (some browsers wrap urls in quotes, some don't when reporting things like backgroundImage)
    _camelFunc = function _camelFunc(s, g) {
      return g.toUpperCase();
    },
        _horizExp = /(?:Left|Right|Width)/i,
        _ieGetMatrixExp = /(M11|M12|M21|M22)=[\d\-\.e]+/gi,
        _ieSetMatrixExp = /progid\:DXImageTransform\.Microsoft\.Matrix\(.+?\)/i,
        _commasOutsideParenExp = /,(?=[^\)]*(?:\(|$))/gi,
        //finds any commas that are not within parenthesis
    _complexExp = /[\s,\(]/i,
        //for testing a string to find if it has a space, comma, or open parenthesis (clues that it's a complex value)
    _DEG2RAD = Math.PI / 180,
        _RAD2DEG = 180 / Math.PI,
        _forcePT = {},
        _dummyElement = {
      style: {}
    },
        _doc = _gsScope.document || {
      createElement: function createElement() {
        return _dummyElement;
      }
    },
        _createElement = function _createElement(type, ns) {
      return _doc.createElementNS ? _doc.createElementNS(ns || "http://www.w3.org/1999/xhtml", type) : _doc.createElement(type);
    },
        _tempDiv = _createElement("div"),
        _tempImg = _createElement("img"),
        _internals = CSSPlugin._internals = {
      _specialProps: _specialProps
    },
        //provides a hook to a few internal methods that we need to access from inside other plugins
    _agent = (_gsScope.navigator || {}).userAgent || "",
        _autoRound,
        _reqSafariFix,
        //we won't apply the Safari transform fix until we actually come across a tween that affects a transform property (to maintain best performance).
    _isSafari,
        _isFirefox,
        //Firefox has a bug that causes 3D transformed elements to randomly disappear unless a repaint is forced after each update on each element.
    _isSafariLT6,
        //Safari (and Android 4 which uses a flavor of Safari) has a bug that prevents changes to "top" and "left" properties from rendering properly if changed on the same frame as a transform UNLESS we set the element's WebkitBackfaceVisibility to hidden (weird, I know). Doing this for Android 3 and earlier seems to actually cause other problems, though (fun!)
    _ieVers,
        _supportsOpacity = function () {
      //we set _isSafari, _ieVers, _isFirefox, and _supportsOpacity all in one function here to reduce file size slightly, especially in the minified version.
      var i = _agent.indexOf("Android"),
          a = _createElement("a");

      _isSafari = _agent.indexOf("Safari") !== -1 && _agent.indexOf("Chrome") === -1 && (i === -1 || parseFloat(_agent.substr(i + 8, 2)) > 3);
      _isSafariLT6 = _isSafari && parseFloat(_agent.substr(_agent.indexOf("Version/") + 8, 2)) < 6;
      _isFirefox = _agent.indexOf("Firefox") !== -1;

      if (/MSIE ([0-9]{1,}[\.0-9]{0,})/.exec(_agent) || /Trident\/.*rv:([0-9]{1,}[\.0-9]{0,})/.exec(_agent)) {
        _ieVers = parseFloat(RegExp.$1);
      }

      if (!a) {
        return false;
      }

      a.style.cssText = "top:1px;opacity:.55;";
      return /^0.55/.test(a.style.opacity);
    }(),
        _getIEOpacity = function _getIEOpacity(v) {
      return _opacityExp.test(typeof v === "string" ? v : (v.currentStyle ? v.currentStyle.filter : v.style.filter) || "") ? parseFloat(RegExp.$1) / 100 : 1;
    },
        _log = function _log(s) {
      //for logging messages, but in a way that won't throw errors in old versions of IE.
      if (_gsScope.console) {
        console.log(s);
      }
    },
        _target,
        //when initting a CSSPlugin, we set this variable so that we can access it from within many other functions without having to pass it around as params
    _index,
        //when initting a CSSPlugin, we set this variable so that we can access it from within many other functions without having to pass it around as params
    _prefixCSS = "",
        //the non-camelCase vendor prefix like "-o-", "-moz-", "-ms-", or "-webkit-"
    _prefix = "",
        //camelCase vendor prefix like "O", "ms", "Webkit", or "Moz".
    // @private feed in a camelCase property name like "transform" and it will check to see if it is valid as-is or if it needs a vendor prefix. It returns the corrected camelCase property name (i.e. "WebkitTransform" or "MozTransform" or "transform" or null if no such property is found, like if the browser is IE8 or before, "transform" won't be found at all)
    _checkPropPrefix = function _checkPropPrefix(p, e) {
      e = e || _tempDiv;
      var s = e.style,
          a,
          i;

      if (s[p] !== undefined) {
        return p;
      }

      p = p.charAt(0).toUpperCase() + p.substr(1);
      a = ["O", "Moz", "ms", "Ms", "Webkit"];
      i = 5;

      while (--i > -1 && s[a[i] + p] === undefined) {}

      if (i >= 0) {
        _prefix = i === 3 ? "ms" : a[i];
        _prefixCSS = "-" + _prefix.toLowerCase() + "-";
        return _prefix + p;
      }

      return null;
    },
        _getComputedStyle = _doc.defaultView ? _doc.defaultView.getComputedStyle : function () {},

    /**
     * @private Returns the css style for a particular property of an element. For example, to get whatever the current "left" css value for an element with an ID of "myElement", you could do:
     * var currentLeft = CSSPlugin.getStyle( document.getElementById("myElement"), "left");
     *
     * @param {!Object} t Target element whose style property you want to query
     * @param {!string} p Property name (like "left" or "top" or "marginTop", etc.)
     * @param {Object=} cs Computed style object. This just provides a way to speed processing if you're going to get several properties on the same element in quick succession - you can reuse the result of the getComputedStyle() call.
     * @param {boolean=} calc If true, the value will not be read directly from the element's "style" property (if it exists there), but instead the getComputedStyle() result will be used. This can be useful when you want to ensure that the browser itself is interpreting the value.
     * @param {string=} dflt Default value that should be returned in the place of null, "none", "auto" or "auto auto".
     * @return {?string} The current property value
     */
    _getStyle = CSSPlugin.getStyle = function (t, p, cs, calc, dflt) {
      var rv;
      if (!_supportsOpacity) if (p === "opacity") {
        //several versions of IE don't use the standard "opacity" property - they use things like filter:alpha(opacity=50), so we parse that here.
        return _getIEOpacity(t);
      }

      if (!calc && t.style[p]) {
        rv = t.style[p];
      } else if (cs = cs || _getComputedStyle(t)) {
        rv = cs[p] || cs.getPropertyValue(p) || cs.getPropertyValue(p.replace(_capsExp, "-$1").toLowerCase());
      } else if (t.currentStyle) {
        rv = t.currentStyle[p];
      }

      return dflt != null && (!rv || rv === "none" || rv === "auto" || rv === "auto auto") ? dflt : rv;
    },

    /**
     * @private Pass the target element, the property name, the numeric value, and the suffix (like "%", "em", "px", etc.) and it will spit back the equivalent pixel number.
     * @param {!Object} t Target element
     * @param {!string} p Property name (like "left", "top", "marginLeft", etc.)
     * @param {!number} v Value
     * @param {string=} sfx Suffix (like "px" or "%" or "em")
     * @param {boolean=} recurse If true, the call is a recursive one. In some browsers (like IE7/8), occasionally the value isn't accurately reported initially, but if we run the function again it will take effect.
     * @return {number} value in pixels
     */
    _convertToPixels = _internals.convertToPixels = function (t, p, v, sfx, recurse) {
      if (sfx === "px" || !sfx && p !== "lineHeight") {
        return v;
      }

      if (sfx === "auto" || !v) {
        return 0;
      }

      var horiz = _horizExp.test(p),
          node = t,
          style = _tempDiv.style,
          neg = v < 0,
          precise = v === 1,
          pix,
          cache,
          time;

      if (neg) {
        v = -v;
      }

      if (precise) {
        v *= 100;
      }

      if (p === "lineHeight" && !sfx) {
        //special case of when a simple lineHeight (without a unit) is used. Set it to the value, read back the computed value, and then revert.
        cache = _getComputedStyle(t).lineHeight;
        t.style.lineHeight = v;
        pix = parseFloat(_getComputedStyle(t).lineHeight);
        t.style.lineHeight = cache;
      } else if (sfx === "%" && p.indexOf("border") !== -1) {
        pix = v / 100 * (horiz ? t.clientWidth : t.clientHeight);
      } else {
        style.cssText = "border:0 solid red;position:" + _getStyle(t, "position") + ";line-height:0;";

        if (sfx === "%" || !node.appendChild || sfx.charAt(0) === "v" || sfx === "rem") {
          node = t.parentNode || _doc.body;

          if (_getStyle(node, "display").indexOf("flex") !== -1) {
            //Edge and IE11 have a bug that causes offsetWidth to report as 0 if the container has display:flex and the child is position:relative. Switching to position: absolute solves it.
            style.position = "absolute";
          }

          cache = node._gsCache;
          time = TweenLite.ticker.frame;

          if (cache && horiz && cache.time === time) {
            //performance optimization: we record the width of elements along with the ticker frame so that we can quickly get it again on the same tick (seems relatively safe to assume it wouldn't change on the same tick)
            return cache.width * v / 100;
          }

          style[horiz ? "width" : "height"] = v + sfx;
        } else {
          style[horiz ? "borderLeftWidth" : "borderTopWidth"] = v + sfx;
        }

        node.appendChild(_tempDiv);
        pix = parseFloat(_tempDiv[horiz ? "offsetWidth" : "offsetHeight"]);
        node.removeChild(_tempDiv);

        if (horiz && sfx === "%" && CSSPlugin.cacheWidths !== false) {
          cache = node._gsCache = node._gsCache || {};
          cache.time = time;
          cache.width = pix / v * 100;
        }

        if (pix === 0 && !recurse) {
          pix = _convertToPixels(t, p, v, sfx, true);
        }
      }

      if (precise) {
        pix /= 100;
      }

      return neg ? -pix : pix;
    },
        _calculateOffset = _internals.calculateOffset = function (t, p, cs) {
      //for figuring out "top" or "left" in px when it's "auto". We need to factor in margin with the offsetLeft/offsetTop
      if (_getStyle(t, "position", cs) !== "absolute") {
        return 0;
      }

      var dim = p === "left" ? "Left" : "Top",
          v = _getStyle(t, "margin" + dim, cs);

      return t["offset" + dim] - (_convertToPixels(t, p, parseFloat(v), v.replace(_suffixExp, "")) || 0);
    },
        // @private returns at object containing ALL of the style properties in camelCase and their associated values.
    _getAllStyles = function _getAllStyles(t, cs) {
      var s = {},
          i,
          tr,
          p;

      if (cs = cs || _getComputedStyle(t, null)) {
        if (i = cs.length) {
          while (--i > -1) {
            p = cs[i];

            if (p.indexOf("-transform") === -1 || _transformPropCSS === p) {
              //Some webkit browsers duplicate transform values, one non-prefixed and one prefixed ("transform" and "WebkitTransform"), so we must weed out the extra one here.
              s[p.replace(_camelExp, _camelFunc)] = cs.getPropertyValue(p);
            }
          }
        } else {
          //some browsers behave differently - cs.length is always 0, so we must do a for...in loop.
          for (i in cs) {
            if (i.indexOf("Transform") === -1 || _transformProp === i) {
              //Some webkit browsers duplicate transform values, one non-prefixed and one prefixed ("transform" and "WebkitTransform"), so we must weed out the extra one here.
              s[i] = cs[i];
            }
          }
        }
      } else if (cs = t.currentStyle || t.style) {
        for (i in cs) {
          if (typeof i === "string" && s[i] === undefined) {
            s[i.replace(_camelExp, _camelFunc)] = cs[i];
          }
        }
      }

      if (!_supportsOpacity) {
        s.opacity = _getIEOpacity(t);
      }

      tr = _getTransform(t, cs, false);
      s.rotation = tr.rotation;
      s.skewX = tr.skewX;
      s.scaleX = tr.scaleX;
      s.scaleY = tr.scaleY;
      s.x = tr.x;
      s.y = tr.y;

      if (_supports3D) {
        s.z = tr.z;
        s.rotationX = tr.rotationX;
        s.rotationY = tr.rotationY;
        s.scaleZ = tr.scaleZ;
      }

      if (s.filters) {
        delete s.filters;
      }

      return s;
    },
        // @private analyzes two style objects (as returned by _getAllStyles()) and only looks for differences between them that contain tweenable values (like a number or color). It returns an object with a "difs" property which refers to an object containing only those isolated properties and values for tweening, and a "firstMPT" property which refers to the first MiniPropTween instance in a linked list that recorded all the starting values of the different properties so that we can revert to them at the end or beginning of the tween - we don't want the cascading to get messed up. The forceLookup parameter is an optional generic object with properties that should be forced into the results - this is necessary for className tweens that are overwriting others because imagine a scenario where a rollover/rollout adds/removes a class and the user swipes the mouse over the target SUPER fast, thus nothing actually changed yet and the subsequent comparison of the properties would indicate they match (especially when px rounding is taken into consideration), thus no tweening is necessary even though it SHOULD tween and remove those properties after the tween (otherwise the inline styles will contaminate things). See the className SpecialProp code for details.
    _cssDif = function _cssDif(t, s1, s2, vars, forceLookup) {
      var difs = {},
          style = t.style,
          val,
          p,
          mpt;

      for (p in s2) {
        if (p !== "cssText") if (p !== "length") if (isNaN(p)) if (s1[p] !== (val = s2[p]) || forceLookup && forceLookup[p]) if (p.indexOf("Origin") === -1) if (typeof val === "number" || typeof val === "string") {
          difs[p] = val === "auto" && (p === "left" || p === "top") ? _calculateOffset(t, p) : (val === "" || val === "auto" || val === "none") && typeof s1[p] === "string" && s1[p].replace(_NaNExp, "") !== "" ? 0 : val; //if the ending value is defaulting ("" or "auto"), we check the starting value and if it can be parsed into a number (a string which could have a suffix too, like 700px), then we swap in 0 for "" or "auto" so that things actually tween.

          if (style[p] !== undefined) {
            //for className tweens, we must remember which properties already existed inline - the ones that didn't should be removed when the tween isn't in progress because they were only introduced to facilitate the transition between classes.
            mpt = new MiniPropTween(style, p, style[p], mpt);
          }
        }
      }

      if (vars) {
        for (p in vars) {
          //copy properties (except className)
          if (p !== "className") {
            difs[p] = vars[p];
          }
        }
      }

      return {
        difs: difs,
        firstMPT: mpt
      };
    },
        _dimensions = {
      width: ["Left", "Right"],
      height: ["Top", "Bottom"]
    },
        _margins = ["marginLeft", "marginRight", "marginTop", "marginBottom"],

    /**
     * @private Gets the width or height of an element
     * @param {!Object} t Target element
     * @param {!string} p Property name ("width" or "height")
     * @param {Object=} cs Computed style object (if one exists). Just a speed optimization.
     * @return {number} Dimension (in pixels)
     */
    _getDimension = function _getDimension(t, p, cs) {
      if ((t.nodeName + "").toLowerCase() === "svg") {
        //Chrome no longer supports offsetWidth/offsetHeight on SVG elements.
        return (cs || _getComputedStyle(t))[p] || 0;
      } else if (t.getCTM && _isSVG(t)) {
        return t.getBBox()[p] || 0;
      }

      var v = parseFloat(p === "width" ? t.offsetWidth : t.offsetHeight),
          a = _dimensions[p],
          i = a.length;
      cs = cs || _getComputedStyle(t, null);

      while (--i > -1) {
        v -= parseFloat(_getStyle(t, "padding" + a[i], cs, true)) || 0;
        v -= parseFloat(_getStyle(t, "border" + a[i] + "Width", cs, true)) || 0;
      }

      return v;
    },
        // @private Parses position-related complex strings like "top left" or "50px 10px" or "70% 20%", etc. which are used for things like transformOrigin or backgroundPosition. Optionally decorates a supplied object (recObj) with the following properties: "ox" (offsetX), "oy" (offsetY), "oxp" (if true, "ox" is a percentage not a pixel value), and "oxy" (if true, "oy" is a percentage not a pixel value)
    _parsePosition = function _parsePosition(v, recObj) {
      if (v === "contain" || v === "auto" || v === "auto auto") {
        //note: Firefox uses "auto auto" as default whereas Chrome uses "auto".
        return v + " ";
      }

      if (v == null || v === "") {
        v = "0 0";
      }

      var a = v.split(" "),
          x = v.indexOf("left") !== -1 ? "0%" : v.indexOf("right") !== -1 ? "100%" : a[0],
          y = v.indexOf("top") !== -1 ? "0%" : v.indexOf("bottom") !== -1 ? "100%" : a[1],
          i;

      if (a.length > 3 && !recObj) {
        //multiple positions
        a = v.split(", ").join(",").split(",");
        v = [];

        for (i = 0; i < a.length; i++) {
          v.push(_parsePosition(a[i]));
        }

        return v.join(",");
      }

      if (y == null) {
        y = x === "center" ? "50%" : "0";
      } else if (y === "center") {
        y = "50%";
      }

      if (x === "center" || isNaN(parseFloat(x)) && (x + "").indexOf("=") === -1) {
        //remember, the user could flip-flop the values and say "bottom center" or "center bottom", etc. "center" is ambiguous because it could be used to describe horizontal or vertical, hence the isNaN(). If there's an "=" sign in the value, it's relative.
        x = "50%";
      }

      v = x + " " + y + (a.length > 2 ? " " + a[2] : "");

      if (recObj) {
        recObj.oxp = x.indexOf("%") !== -1;
        recObj.oyp = y.indexOf("%") !== -1;
        recObj.oxr = x.charAt(1) === "=";
        recObj.oyr = y.charAt(1) === "=";
        recObj.ox = parseFloat(x.replace(_NaNExp, ""));
        recObj.oy = parseFloat(y.replace(_NaNExp, ""));
        recObj.v = v;
      }

      return recObj || v;
    },

    /**
     * @private Takes an ending value (typically a string, but can be a number) and a starting value and returns the change between the two, looking for relative value indicators like += and -= and it also ignores suffixes (but make sure the ending value starts with a number or +=/-= and that the starting value is a NUMBER!)
     * @param {(number|string)} e End value which is typically a string, but could be a number
     * @param {(number|string)} b Beginning value which is typically a string but could be a number
     * @return {number} Amount of change between the beginning and ending values (relative values that have a "+=" or "-=" are recognized)
     */
    _parseChange = function _parseChange(e, b) {
      if (typeof e === "function") {
        e = e(_index, _target);
      }

      return typeof e === "string" && e.charAt(1) === "=" ? parseInt(e.charAt(0) + "1", 10) * parseFloat(e.substr(2)) : parseFloat(e) - parseFloat(b) || 0;
    },

    /**
     * @private Takes a value and a default number, checks if the value is relative, null, or numeric and spits back a normalized number accordingly. Primarily used in the _parseTransform() function.
     * @param {Object} v Value to be parsed
     * @param {!number} d Default value (which is also used for relative calculations if "+=" or "-=" is found in the first parameter)
     * @return {number} Parsed value
     */
    _parseVal = function _parseVal(v, d) {
      if (typeof v === "function") {
        v = v(_index, _target);
      }

      return v == null ? d : typeof v === "string" && v.charAt(1) === "=" ? parseInt(v.charAt(0) + "1", 10) * parseFloat(v.substr(2)) + d : parseFloat(v) || 0;
    },

    /**
     * @private Translates strings like "40deg" or "40" or 40rad" or "+=40deg" or "270_short" or "-90_cw" or "+=45_ccw" to a numeric radian angle. Of course a starting/default value must be fed in too so that relative values can be calculated properly.
     * @param {Object} v Value to be parsed
     * @param {!number} d Default value (which is also used for relative calculations if "+=" or "-=" is found in the first parameter)
     * @param {string=} p property name for directionalEnd (optional - only used when the parsed value is directional ("_short", "_cw", or "_ccw" suffix). We need a way to store the uncompensated value so that at the end of the tween, we set it to exactly what was requested with no directional compensation). Property name would be "rotation", "rotationX", or "rotationY"
     * @param {Object=} directionalEnd An object that will store the raw end values for directional angles ("_short", "_cw", or "_ccw" suffix). We need a way to store the uncompensated value so that at the end of the tween, we set it to exactly what was requested with no directional compensation.
     * @return {number} parsed angle in radians
     */
    _parseAngle = function _parseAngle(v, d, p, directionalEnd) {
      var min = 0.000001,
          cap,
          split,
          dif,
          result,
          isRelative;

      if (typeof v === "function") {
        v = v(_index, _target);
      }

      if (v == null) {
        result = d;
      } else if (typeof v === "number") {
        result = v;
      } else {
        cap = 360;
        split = v.split("_");
        isRelative = v.charAt(1) === "=";
        dif = (isRelative ? parseInt(v.charAt(0) + "1", 10) * parseFloat(split[0].substr(2)) : parseFloat(split[0])) * (v.indexOf("rad") === -1 ? 1 : _RAD2DEG) - (isRelative ? 0 : d);

        if (split.length) {
          if (directionalEnd) {
            directionalEnd[p] = d + dif;
          }

          if (v.indexOf("short") !== -1) {
            dif = dif % cap;

            if (dif !== dif % (cap / 2)) {
              dif = dif < 0 ? dif + cap : dif - cap;
            }
          }

          if (v.indexOf("_cw") !== -1 && dif < 0) {
            dif = (dif + cap * 9999999999) % cap - (dif / cap | 0) * cap;
          } else if (v.indexOf("ccw") !== -1 && dif > 0) {
            dif = (dif - cap * 9999999999) % cap - (dif / cap | 0) * cap;
          }
        }

        result = d + dif;
      }

      if (result < min && result > -min) {
        result = 0;
      }

      return result;
    },
        _colorLookup = {
      aqua: [0, 255, 255],
      lime: [0, 255, 0],
      silver: [192, 192, 192],
      black: [0, 0, 0],
      maroon: [128, 0, 0],
      teal: [0, 128, 128],
      blue: [0, 0, 255],
      navy: [0, 0, 128],
      white: [255, 255, 255],
      fuchsia: [255, 0, 255],
      olive: [128, 128, 0],
      yellow: [255, 255, 0],
      orange: [255, 165, 0],
      gray: [128, 128, 128],
      purple: [128, 0, 128],
      green: [0, 128, 0],
      red: [255, 0, 0],
      pink: [255, 192, 203],
      cyan: [0, 255, 255],
      transparent: [255, 255, 255, 0]
    },
        _hue = function _hue(h, m1, m2) {
      h = h < 0 ? h + 1 : h > 1 ? h - 1 : h;
      return (h * 6 < 1 ? m1 + (m2 - m1) * h * 6 : h < 0.5 ? m2 : h * 3 < 2 ? m1 + (m2 - m1) * (2 / 3 - h) * 6 : m1) * 255 + 0.5 | 0;
    },

    /**
     * @private Parses a color (like #9F0, #FF9900, rgb(255,51,153) or hsl(108, 50%, 10%)) into an array with 3 elements for red, green, and blue or if toHSL parameter is true, it will populate the array with hue, saturation, and lightness values. If a relative value is found in an hsl() or hsla() string, it will preserve those relative prefixes and all the values in the array will be strings instead of numbers (in all other cases it will be populated with numbers).
     * @param {(string|number)} v The value the should be parsed which could be a string like #9F0 or rgb(255,102,51) or rgba(255,0,0,0.5) or it could be a number like 0xFF00CC or even a named color like red, blue, purple, etc.
     * @param {(boolean)} toHSL If true, an hsl() or hsla() value will be returned instead of rgb() or rgba()
     * @return {Array.<number>} An array containing red, green, and blue (and optionally alpha) in that order, or if the toHSL parameter was true, the array will contain hue, saturation and lightness (and optionally alpha) in that order. Always numbers unless there's a relative prefix found in an hsl() or hsla() string and toHSL is true.
     */
    _parseColor = CSSPlugin.parseColor = function (v, toHSL) {
      var a, r, g, b, h, s, l, max, min, d, wasHSL;

      if (!v) {
        a = _colorLookup.black;
      } else if (typeof v === "number") {
        a = [v >> 16, v >> 8 & 255, v & 255];
      } else {
        if (v.charAt(v.length - 1) === ",") {
          //sometimes a trailing comma is included and we should chop it off (typically from a comma-delimited list of values like a textShadow:"2px 2px 2px blue, 5px 5px 5px rgb(255,0,0)" - in this example "blue," has a trailing comma. We could strip it out inside parseComplex() but we'd need to do it to the beginning and ending values plus it wouldn't provide protection from other potential scenarios like if the user passes in a similar value.
          v = v.substr(0, v.length - 1);
        }

        if (_colorLookup[v]) {
          a = _colorLookup[v];
        } else if (v.charAt(0) === "#") {
          if (v.length === 4) {
            //for shorthand like #9F0
            r = v.charAt(1);
            g = v.charAt(2);
            b = v.charAt(3);
            v = "#" + r + r + g + g + b + b;
          }

          v = parseInt(v.substr(1), 16);
          a = [v >> 16, v >> 8 & 255, v & 255];
        } else if (v.substr(0, 3) === "hsl") {
          a = wasHSL = v.match(_numExp);

          if (!toHSL) {
            h = Number(a[0]) % 360 / 360;
            s = Number(a[1]) / 100;
            l = Number(a[2]) / 100;
            g = l <= 0.5 ? l * (s + 1) : l + s - l * s;
            r = l * 2 - g;

            if (a.length > 3) {
              a[3] = Number(a[3]);
            }

            a[0] = _hue(h + 1 / 3, r, g);
            a[1] = _hue(h, r, g);
            a[2] = _hue(h - 1 / 3, r, g);
          } else if (v.indexOf("=") !== -1) {
            //if relative values are found, just return the raw strings with the relative prefixes in place.
            return v.match(_relNumExp);
          }
        } else {
          a = v.match(_numExp) || _colorLookup.transparent;
        }

        a[0] = Number(a[0]);
        a[1] = Number(a[1]);
        a[2] = Number(a[2]);

        if (a.length > 3) {
          a[3] = Number(a[3]);
        }
      }

      if (toHSL && !wasHSL) {
        r = a[0] / 255;
        g = a[1] / 255;
        b = a[2] / 255;
        max = Math.max(r, g, b);
        min = Math.min(r, g, b);
        l = (max + min) / 2;

        if (max === min) {
          h = s = 0;
        } else {
          d = max - min;
          s = l > 0.5 ? d / (2 - max - min) : d / (max + min);
          h = max === r ? (g - b) / d + (g < b ? 6 : 0) : max === g ? (b - r) / d + 2 : (r - g) / d + 4;
          h *= 60;
        }

        a[0] = h + 0.5 | 0;
        a[1] = s * 100 + 0.5 | 0;
        a[2] = l * 100 + 0.5 | 0;
      }

      return a;
    },
        _formatColors = function _formatColors(s, toHSL) {
      var colors = s.match(_colorExp) || [],
          charIndex = 0,
          parsed = "",
          i,
          color,
          temp;

      if (!colors.length) {
        return s;
      }

      for (i = 0; i < colors.length; i++) {
        color = colors[i];
        temp = s.substr(charIndex, s.indexOf(color, charIndex) - charIndex);
        charIndex += temp.length + color.length;
        color = _parseColor(color, toHSL);

        if (color.length === 3) {
          color.push(1);
        }

        parsed += temp + (toHSL ? "hsla(" + color[0] + "," + color[1] + "%," + color[2] + "%," + color[3] : "rgba(" + color.join(",")) + ")";
      }

      return parsed + s.substr(charIndex);
    },
        _colorExp = "(?:\\b(?:(?:rgb|rgba|hsl|hsla)\\(.+?\\))|\\B#(?:[0-9a-f]{3}){1,2}\\b"; //we'll dynamically build this Regular Expression to conserve file size. After building it, it will be able to find rgb(), rgba(), # (hexadecimal), and named color values like red, blue, purple, etc.


    for (p in _colorLookup) {
      _colorExp += "|" + p + "\\b";
    }

    _colorExp = new RegExp(_colorExp + ")", "gi");

    CSSPlugin.colorStringFilter = function (a) {
      var combined = a[0] + " " + a[1],
          toHSL;

      if (_colorExp.test(combined)) {
        toHSL = combined.indexOf("hsl(") !== -1 || combined.indexOf("hsla(") !== -1;
        a[0] = _formatColors(a[0], toHSL);
        a[1] = _formatColors(a[1], toHSL);
      }

      _colorExp.lastIndex = 0;
    };

    if (!TweenLite.defaultStringFilter) {
      TweenLite.defaultStringFilter = CSSPlugin.colorStringFilter;
    }
    /**
     * @private Returns a formatter function that handles taking a string (or number in some cases) and returning a consistently formatted one in terms of delimiters, quantity of values, etc. For example, we may get boxShadow values defined as "0px red" or "0px 0px 10px rgb(255,0,0)" or "0px 0px 20px 20px #F00" and we need to ensure that what we get back is described with 4 numbers and a color. This allows us to feed it into the _parseComplex() method and split the values up appropriately. The neat thing about this _getFormatter() function is that the dflt defines a pattern as well as a default, so for example, _getFormatter("0px 0px 0px 0px #777", true) not only sets the default as 0px for all distances and #777 for the color, but also sets the pattern such that 4 numbers and a color will always get returned.
     * @param {!string} dflt The default value and pattern to follow. So "0px 0px 0px 0px #777" will ensure that 4 numbers and a color will always get returned.
     * @param {boolean=} clr If true, the values should be searched for color-related data. For example, boxShadow values typically contain a color whereas borderRadius don't.
     * @param {boolean=} collapsible If true, the value is a top/left/right/bottom style one that acts like margin or padding, where if only one value is received, it's used for all 4; if 2 are received, the first is duplicated for 3rd (bottom) and the 2nd is duplicated for the 4th spot (left), etc.
     * @return {Function} formatter function
     */


    var _getFormatter = function _getFormatter(dflt, clr, collapsible, multi) {
      if (dflt == null) {
        return function (v) {
          return v;
        };
      }

      var dColor = clr ? (dflt.match(_colorExp) || [""])[0] : "",
          dVals = dflt.split(dColor).join("").match(_valuesExp) || [],
          pfx = dflt.substr(0, dflt.indexOf(dVals[0])),
          sfx = dflt.charAt(dflt.length - 1) === ")" ? ")" : "",
          delim = dflt.indexOf(" ") !== -1 ? " " : ",",
          numVals = dVals.length,
          dSfx = numVals > 0 ? dVals[0].replace(_numExp, "") : "",
          _formatter2;

      if (!numVals) {
        return function (v) {
          return v;
        };
      }

      if (clr) {
        _formatter2 = function formatter(v) {
          var color, vals, i, a;

          if (typeof v === "number") {
            v += dSfx;
          } else if (multi && _commasOutsideParenExp.test(v)) {
            a = v.replace(_commasOutsideParenExp, "|").split("|");

            for (i = 0; i < a.length; i++) {
              a[i] = _formatter2(a[i]);
            }

            return a.join(",");
          }

          color = (v.match(_colorExp) || [dColor])[0];
          vals = v.split(color).join("").match(_valuesExp) || [];
          i = vals.length;

          if (numVals > i--) {
            while (++i < numVals) {
              vals[i] = collapsible ? vals[(i - 1) / 2 | 0] : dVals[i];
            }
          }

          return pfx + vals.join(delim) + delim + color + sfx + (v.indexOf("inset") !== -1 ? " inset" : "");
        };

        return _formatter2;
      }

      _formatter2 = function _formatter(v) {
        var vals, a, i;

        if (typeof v === "number") {
          v += dSfx;
        } else if (multi && _commasOutsideParenExp.test(v)) {
          a = v.replace(_commasOutsideParenExp, "|").split("|");

          for (i = 0; i < a.length; i++) {
            a[i] = _formatter2(a[i]);
          }

          return a.join(",");
        }

        vals = v.match(_valuesExp) || [];
        i = vals.length;

        if (numVals > i--) {
          while (++i < numVals) {
            vals[i] = collapsible ? vals[(i - 1) / 2 | 0] : dVals[i];
          }
        }

        return pfx + vals.join(delim) + sfx;
      };

      return _formatter2;
    },

    /**
     * @private returns a formatter function that's used for edge-related values like marginTop, marginLeft, paddingBottom, paddingRight, etc. Just pass a comma-delimited list of property names related to the edges.
     * @param {!string} props a comma-delimited list of property names in order from top to left, like "marginTop,marginRight,marginBottom,marginLeft"
     * @return {Function} a formatter function
     */
    _getEdgeParser = function _getEdgeParser(props) {
      props = props.split(",");
      return function (t, e, p, cssp, pt, plugin, vars) {
        var a = (e + "").split(" "),
            i;
        vars = {};

        for (i = 0; i < 4; i++) {
          vars[props[i]] = a[i] = a[i] || a[(i - 1) / 2 >> 0];
        }

        return cssp.parse(t, vars, pt, plugin);
      };
    },
        // @private used when other plugins must tween values first, like BezierPlugin or ThrowPropsPlugin, etc. That plugin's setRatio() gets called first so that the values are updated, and then we loop through the MiniPropTweens which handle copying the values into their appropriate slots so that they can then be applied correctly in the main CSSPlugin setRatio() method. Remember, we typically create a proxy object that has a bunch of uniquely-named properties that we feed to the sub-plugin and it does its magic normally, and then we must interpret those values and apply them to the css because often numbers must get combined/concatenated, suffixes added, etc. to work with css, like boxShadow could have 4 values plus a color.
    _setPluginRatio = _internals._setPluginRatio = function (v) {
      this.plugin.setRatio(v);
      var d = this.data,
          proxy = d.proxy,
          mpt = d.firstMPT,
          min = 0.000001,
          val,
          pt,
          i,
          str,
          p;

      while (mpt) {
        val = proxy[mpt.v];

        if (mpt.r) {
          val = Math.round(val);
        } else if (val < min && val > -min) {
          val = 0;
        }

        mpt.t[mpt.p] = val;
        mpt = mpt._next;
      }

      if (d.autoRotate) {
        d.autoRotate.rotation = d.mod ? d.mod(proxy.rotation, this.t) : proxy.rotation; //special case for ModifyPlugin to hook into an auto-rotating bezier
      } //at the end, we must set the CSSPropTween's "e" (end) value dynamically here because that's what is used in the final setRatio() method. Same for "b" at the beginning.


      if (v === 1 || v === 0) {
        mpt = d.firstMPT;
        p = v === 1 ? "e" : "b";

        while (mpt) {
          pt = mpt.t;

          if (!pt.type) {
            pt[p] = pt.s + pt.xs0;
          } else if (pt.type === 1) {
            str = pt.xs0 + pt.s + pt.xs1;

            for (i = 1; i < pt.l; i++) {
              str += pt["xn" + i] + pt["xs" + (i + 1)];
            }

            pt[p] = str;
          }

          mpt = mpt._next;
        }
      }
    },

    /**
     * @private @constructor Used by a few SpecialProps to hold important values for proxies. For example, _parseToProxy() creates a MiniPropTween instance for each property that must get tweened on the proxy, and we record the original property name as well as the unique one we create for the proxy, plus whether or not the value needs to be rounded plus the original value.
     * @param {!Object} t target object whose property we're tweening (often a CSSPropTween)
     * @param {!string} p property name
     * @param {(number|string|object)} v value
     * @param {MiniPropTween=} next next MiniPropTween in the linked list
     * @param {boolean=} r if true, the tweened value should be rounded to the nearest integer
     */
    MiniPropTween = function MiniPropTween(t, p, v, next, r) {
      this.t = t;
      this.p = p;
      this.v = v;
      this.r = r;

      if (next) {
        next._prev = this;
        this._next = next;
      }
    },

    /**
     * @private Most other plugins (like BezierPlugin and ThrowPropsPlugin and others) can only tween numeric values, but CSSPlugin must accommodate special values that have a bunch of extra data (like a suffix or strings between numeric values, etc.). For example, boxShadow has values like "10px 10px 20px 30px rgb(255,0,0)" which would utterly confuse other plugins. This method allows us to split that data apart and grab only the numeric data and attach it to uniquely-named properties of a generic proxy object ({}) so that we can feed that to virtually any plugin to have the numbers tweened. However, we must also keep track of which properties from the proxy go with which CSSPropTween values and instances. So we create a linked list of MiniPropTweens. Each one records a target (the original CSSPropTween), property (like "s" or "xn1" or "xn2") that we're tweening and the unique property name that was used for the proxy (like "boxShadow_xn1" and "boxShadow_xn2") and whether or not they need to be rounded. That way, in the _setPluginRatio() method we can simply copy the values over from the proxy to the CSSPropTween instance(s). Then, when the main CSSPlugin setRatio() method runs and applies the CSSPropTween values accordingly, they're updated nicely. So the external plugin tweens the numbers, _setPluginRatio() copies them over, and setRatio() acts normally, applying css-specific values to the element.
     * This method returns an object that has the following properties:
     *  - proxy: a generic object containing the starting values for all the properties that will be tweened by the external plugin.  This is what we feed to the external _onInitTween() as the target
     *  - end: a generic object containing the ending values for all the properties that will be tweened by the external plugin. This is what we feed to the external plugin's _onInitTween() as the destination values
     *  - firstMPT: the first MiniPropTween in the linked list
     *  - pt: the first CSSPropTween in the linked list that was created when parsing. If shallow is true, this linked list will NOT attach to the one passed into the _parseToProxy() as the "pt" (4th) parameter.
     * @param {!Object} t target object to be tweened
     * @param {!(Object|string)} vars the object containing the information about the tweening values (typically the end/destination values) that should be parsed
     * @param {!CSSPlugin} cssp The CSSPlugin instance
     * @param {CSSPropTween=} pt the next CSSPropTween in the linked list
     * @param {TweenPlugin=} plugin the external TweenPlugin instance that will be handling tweening the numeric values
     * @param {boolean=} shallow if true, the resulting linked list from the parse will NOT be attached to the CSSPropTween that was passed in as the "pt" (4th) parameter.
     * @return An object containing the following properties: proxy, end, firstMPT, and pt (see above for descriptions)
     */
    _parseToProxy = _internals._parseToProxy = function (t, vars, cssp, pt, plugin, shallow) {
      var bpt = pt,
          start = {},
          end = {},
          transform = cssp._transform,
          oldForce = _forcePT,
          i,
          p,
          xp,
          mpt,
          firstPT;
      cssp._transform = null;
      _forcePT = vars;
      pt = firstPT = cssp.parse(t, vars, pt, plugin);
      _forcePT = oldForce; //break off from the linked list so the new ones are isolated.

      if (shallow) {
        cssp._transform = transform;

        if (bpt) {
          bpt._prev = null;

          if (bpt._prev) {
            bpt._prev._next = null;
          }
        }
      }

      while (pt && pt !== bpt) {
        if (pt.type <= 1) {
          p = pt.p;
          end[p] = pt.s + pt.c;
          start[p] = pt.s;

          if (!shallow) {
            mpt = new MiniPropTween(pt, "s", p, mpt, pt.r);
            pt.c = 0;
          }

          if (pt.type === 1) {
            i = pt.l;

            while (--i > 0) {
              xp = "xn" + i;
              p = pt.p + "_" + xp;
              end[p] = pt.data[xp];
              start[p] = pt[xp];

              if (!shallow) {
                mpt = new MiniPropTween(pt, xp, p, mpt, pt.rxp[xp]);
              }
            }
          }
        }

        pt = pt._next;
      }

      return {
        proxy: start,
        end: end,
        firstMPT: mpt,
        pt: firstPT
      };
    },

    /**
     * @constructor Each property that is tweened has at least one CSSPropTween associated with it. These instances store important information like the target, property, starting value, amount of change, etc. They can also optionally have a number of "extra" strings and numeric values named xs1, xn1, xs2, xn2, xs3, xn3, etc. where "s" indicates string and "n" indicates number. These can be pieced together in a complex-value tween (type:1) that has alternating types of data like a string, number, string, number, etc. For example, boxShadow could be "5px 5px 8px rgb(102, 102, 51)". In that value, there are 6 numbers that may need to tween and then pieced back together into a string again with spaces, suffixes, etc. xs0 is special in that it stores the suffix for standard (type:0) tweens, -OR- the first string (prefix) in a complex-value (type:1) CSSPropTween -OR- it can be the non-tweening value in a type:-1 CSSPropTween. We do this to conserve memory.
     * CSSPropTweens have the following optional properties as well (not defined through the constructor):
     *  - l: Length in terms of the number of extra properties that the CSSPropTween has (default: 0). For example, for a boxShadow we may need to tween 5 numbers in which case l would be 5; Keep in mind that the start/end values for the first number that's tweened are always stored in the s and c properties to conserve memory. All additional values thereafter are stored in xn1, xn2, etc.
     *  - xfirst: The first instance of any sub-CSSPropTweens that are tweening properties of this instance. For example, we may split up a boxShadow tween so that there's a main CSSPropTween of type:1 that has various xs* and xn* values associated with the h-shadow, v-shadow, blur, color, etc. Then we spawn a CSSPropTween for each of those that has a higher priority and runs BEFORE the main CSSPropTween so that the values are all set by the time it needs to re-assemble them. The xfirst gives us an easy way to identify the first one in that chain which typically ends at the main one (because they're all prepende to the linked list)
     *  - plugin: The TweenPlugin instance that will handle the tweening of any complex values. For example, sometimes we don't want to use normal subtweens (like xfirst refers to) to tween the values - we might want ThrowPropsPlugin or BezierPlugin some other plugin to do the actual tweening, so we create a plugin instance and store a reference here. We need this reference so that if we get a request to round values or disable a tween, we can pass along that request.
     *  - data: Arbitrary data that needs to be stored with the CSSPropTween. Typically if we're going to have a plugin handle the tweening of a complex-value tween, we create a generic object that stores the END values that we're tweening to and the CSSPropTween's xs1, xs2, etc. have the starting values. We store that object as data. That way, we can simply pass that object to the plugin and use the CSSPropTween as the target.
     *  - setRatio: Only used for type:2 tweens that require custom functionality. In this case, we call the CSSPropTween's setRatio() method and pass the ratio each time the tween updates. This isn't quite as efficient as doing things directly in the CSSPlugin's setRatio() method, but it's very convenient and flexible.
     * @param {!Object} t Target object whose property will be tweened. Often a DOM element, but not always. It could be anything.
     * @param {string} p Property to tween (name). For example, to tween element.width, p would be "width".
     * @param {number} s Starting numeric value
     * @param {number} c Change in numeric value over the course of the entire tween. For example, if element.width starts at 5 and should end at 100, c would be 95.
     * @param {CSSPropTween=} next The next CSSPropTween in the linked list. If one is defined, we will define its _prev as the new instance, and the new instance's _next will be pointed at it.
     * @param {number=} type The type of CSSPropTween where -1 = a non-tweening value, 0 = a standard simple tween, 1 = a complex value (like one that has multiple numbers in a comma- or space-delimited string like border:"1px solid red"), and 2 = one that uses a custom setRatio function that does all of the work of applying the values on each update.
     * @param {string=} n Name of the property that should be used for overwriting purposes which is typically the same as p but not always. For example, we may need to create a subtween for the 2nd part of a "clip:rect(...)" tween in which case "p" might be xs1 but "n" is still "clip"
     * @param {boolean=} r If true, the value(s) should be rounded
     * @param {number=} pr Priority in the linked list order. Higher priority CSSPropTweens will be updated before lower priority ones. The default priority is 0.
     * @param {string=} b Beginning value. We store this to ensure that it is EXACTLY what it was when the tween began without any risk of interpretation issues.
     * @param {string=} e Ending value. We store this to ensure that it is EXACTLY what the user defined at the end of the tween without any risk of interpretation issues.
     */
    CSSPropTween = _internals.CSSPropTween = function (t, p, s, c, next, type, n, r, pr, b, e) {
      this.t = t; //target

      this.p = p; //property

      this.s = s; //starting value

      this.c = c; //change value

      this.n = n || p; //name that this CSSPropTween should be associated to (usually the same as p, but not always - n is what overwriting looks at)

      if (!(t instanceof CSSPropTween)) {
        _overwriteProps.push(this.n);
      }

      this.r = r; //round (boolean)

      this.type = type || 0; //0 = normal tween, -1 = non-tweening (in which case xs0 will be applied to the target's property, like tp.t[tp.p] = tp.xs0), 1 = complex-value SpecialProp, 2 = custom setRatio() that does all the work

      if (pr) {
        this.pr = pr;
        _hasPriority = true;
      }

      this.b = b === undefined ? s : b;
      this.e = e === undefined ? s + c : e;

      if (next) {
        this._next = next;
        next._prev = this;
      }
    },
        _addNonTweeningNumericPT = function _addNonTweeningNumericPT(target, prop, start, end, next, overwriteProp) {
      //cleans up some code redundancies and helps minification. Just a fast way to add a NUMERIC non-tweening CSSPropTween
      var pt = new CSSPropTween(target, prop, start, end - start, next, -1, overwriteProp);
      pt.b = start;
      pt.e = pt.xs0 = end;
      return pt;
    },

    /**
     * Takes a target, the beginning value and ending value (as strings) and parses them into a CSSPropTween (possibly with child CSSPropTweens) that accommodates multiple numbers, colors, comma-delimited values, etc. For example:
     * sp.parseComplex(element, "boxShadow", "5px 10px 20px rgb(255,102,51)", "0px 0px 0px red", true, "0px 0px 0px rgb(0,0,0,0)", pt);
     * It will walk through the beginning and ending values (which should be in the same format with the same number and type of values) and figure out which parts are numbers, what strings separate the numeric/tweenable values, and then create the CSSPropTweens accordingly. If a plugin is defined, no child CSSPropTweens will be created. Instead, the ending values will be stored in the "data" property of the returned CSSPropTween like: {s:-5, xn1:-10, xn2:-20, xn3:255, xn4:0, xn5:0} so that it can be fed to any other plugin and it'll be plain numeric tweens but the recomposition of the complex value will be handled inside CSSPlugin's setRatio().
     * If a setRatio is defined, the type of the CSSPropTween will be set to 2 and recomposition of the values will be the responsibility of that method.
     *
     * @param {!Object} t Target whose property will be tweened
     * @param {!string} p Property that will be tweened (its name, like "left" or "backgroundColor" or "boxShadow")
     * @param {string} b Beginning value
     * @param {string} e Ending value
     * @param {boolean} clrs If true, the value could contain a color value like "rgb(255,0,0)" or "#F00" or "red". The default is false, so no colors will be recognized (a performance optimization)
     * @param {(string|number|Object)} dflt The default beginning value that should be used if no valid beginning value is defined or if the number of values inside the complex beginning and ending values don't match
     * @param {?CSSPropTween} pt CSSPropTween instance that is the current head of the linked list (we'll prepend to this).
     * @param {number=} pr Priority in the linked list order. Higher priority properties will be updated before lower priority ones. The default priority is 0.
     * @param {TweenPlugin=} plugin If a plugin should handle the tweening of extra properties, pass the plugin instance here. If one is defined, then NO subtweens will be created for any extra properties (the properties will be created - just not additional CSSPropTween instances to tween them) because the plugin is expected to do so. However, the end values WILL be populated in the "data" property, like {s:100, xn1:50, xn2:300}
     * @param {function(number)=} setRatio If values should be set in a custom function instead of being pieced together in a type:1 (complex-value) CSSPropTween, define that custom function here.
     * @return {CSSPropTween} The first CSSPropTween in the linked list which includes the new one(s) added by the parseComplex() call.
     */
    _parseComplex = CSSPlugin.parseComplex = function (t, p, b, e, clrs, dflt, pt, pr, plugin, setRatio) {
      //DEBUG: _log("parseComplex: "+p+", b: "+b+", e: "+e);
      b = b || dflt || "";

      if (typeof e === "function") {
        e = e(_index, _target);
      }

      pt = new CSSPropTween(t, p, 0, 0, pt, setRatio ? 2 : 1, null, false, pr, b, e);
      e += ""; //ensures it's a string

      if (clrs && _colorExp.test(e + b)) {
        //if colors are found, normalize the formatting to rgba() or hsla().
        e = [b, e];
        CSSPlugin.colorStringFilter(e);
        b = e[0];
        e = e[1];
      }

      var ba = b.split(", ").join(",").split(" "),
          //beginning array
      ea = e.split(", ").join(",").split(" "),
          //ending array
      l = ba.length,
          autoRound = _autoRound !== false,
          i,
          xi,
          ni,
          bv,
          ev,
          bnums,
          enums,
          bn,
          hasAlpha,
          temp,
          cv,
          str,
          useHSL;

      if (e.indexOf(",") !== -1 || b.indexOf(",") !== -1) {
        if ((e + b).indexOf("rgb") !== -1 || (e + b).indexOf("hsl") !== -1) {
          //keep rgb(), rgba(), hsl(), and hsla() values together! (remember, we're splitting on spaces)
          ba = ba.join(" ").replace(_commasOutsideParenExp, ", ").split(" ");
          ea = ea.join(" ").replace(_commasOutsideParenExp, ", ").split(" ");
        } else {
          ba = ba.join(" ").split(",").join(", ").split(" ");
          ea = ea.join(" ").split(",").join(", ").split(" ");
        }

        l = ba.length;
      }

      if (l !== ea.length) {
        //DEBUG: _log("mismatched formatting detected on " + p + " (" + b + " vs " + e + ")");
        ba = (dflt || "").split(" ");
        l = ba.length;
      }

      pt.plugin = plugin;
      pt.setRatio = setRatio;
      _colorExp.lastIndex = 0;

      for (i = 0; i < l; i++) {
        bv = ba[i];
        ev = ea[i];
        bn = parseFloat(bv); //if the value begins with a number (most common). It's fine if it has a suffix like px

        if (bn || bn === 0) {
          pt.appendXtra("", bn, _parseChange(ev, bn), ev.replace(_relNumExp, ""), autoRound && ev.indexOf("px") !== -1, true); //if the value is a color
        } else if (clrs && _colorExp.test(bv)) {
          str = ev.indexOf(")") + 1;
          str = ")" + (str ? ev.substr(str) : ""); //if there's a comma or ) at the end, retain it.

          useHSL = ev.indexOf("hsl") !== -1 && _supportsOpacity;
          temp = ev; //original string value so we can look for any prefix later.

          bv = _parseColor(bv, useHSL);
          ev = _parseColor(ev, useHSL);
          hasAlpha = bv.length + ev.length > 6;

          if (hasAlpha && !_supportsOpacity && ev[3] === 0) {
            //older versions of IE don't support rgba(), so if the destination alpha is 0, just use "transparent" for the end color
            pt["xs" + pt.l] += pt.l ? " transparent" : "transparent";
            pt.e = pt.e.split(ea[i]).join("transparent");
          } else {
            if (!_supportsOpacity) {
              //old versions of IE don't support rgba().
              hasAlpha = false;
            }

            if (useHSL) {
              pt.appendXtra(temp.substr(0, temp.indexOf("hsl")) + (hasAlpha ? "hsla(" : "hsl("), bv[0], _parseChange(ev[0], bv[0]), ",", false, true).appendXtra("", bv[1], _parseChange(ev[1], bv[1]), "%,", false).appendXtra("", bv[2], _parseChange(ev[2], bv[2]), hasAlpha ? "%," : "%" + str, false);
            } else {
              pt.appendXtra(temp.substr(0, temp.indexOf("rgb")) + (hasAlpha ? "rgba(" : "rgb("), bv[0], ev[0] - bv[0], ",", true, true).appendXtra("", bv[1], ev[1] - bv[1], ",", true).appendXtra("", bv[2], ev[2] - bv[2], hasAlpha ? "," : str, true);
            }

            if (hasAlpha) {
              bv = bv.length < 4 ? 1 : bv[3];
              pt.appendXtra("", bv, (ev.length < 4 ? 1 : ev[3]) - bv, str, false);
            }
          }

          _colorExp.lastIndex = 0; //otherwise the test() on the RegExp could move the lastIndex and taint future results.
        } else {
          bnums = bv.match(_numExp); //gets each group of numbers in the beginning value string and drops them into an array
          //if no number is found, treat it as a non-tweening value and just append the string to the current xs.

          if (!bnums) {
            pt["xs" + pt.l] += pt.l || pt["xs" + pt.l] ? " " + ev : ev; //loop through all the numbers that are found and construct the extra values on the pt.
          } else {
            enums = ev.match(_relNumExp); //get each group of numbers in the end value string and drop them into an array. We allow relative values too, like +=50 or -=.5

            if (!enums || enums.length !== bnums.length) {
              //DEBUG: _log("mismatched formatting detected on " + p + " (" + b + " vs " + e + ")");
              return pt;
            }

            ni = 0;

            for (xi = 0; xi < bnums.length; xi++) {
              cv = bnums[xi];
              temp = bv.indexOf(cv, ni);
              pt.appendXtra(bv.substr(ni, temp - ni), Number(cv), _parseChange(enums[xi], cv), "", autoRound && bv.substr(temp + cv.length, 2) === "px", xi === 0);
              ni = temp + cv.length;
            }

            pt["xs" + pt.l] += bv.substr(ni);
          }
        }
      } //if there are relative values ("+=" or "-=" prefix), we need to adjust the ending value to eliminate the prefixes and combine the values properly.


      if (e.indexOf("=") !== -1) if (pt.data) {
        str = pt.xs0 + pt.data.s;

        for (i = 1; i < pt.l; i++) {
          str += pt["xs" + i] + pt.data["xn" + i];
        }

        pt.e = str + pt["xs" + i];
      }

      if (!pt.l) {
        pt.type = -1;
        pt.xs0 = pt.e;
      }

      return pt.xfirst || pt;
    },
        i = 9;

    p = CSSPropTween.prototype;
    p.l = p.pr = 0; //length (number of extra properties like xn1, xn2, xn3, etc.

    while (--i > 0) {
      p["xn" + i] = 0;
      p["xs" + i] = "";
    }

    p.xs0 = "";
    p._next = p._prev = p.xfirst = p.data = p.plugin = p.setRatio = p.rxp = null;
    /**
     * Appends and extra tweening value to a CSSPropTween and automatically manages any prefix and suffix strings. The first extra value is stored in the s and c of the main CSSPropTween instance, but thereafter any extras are stored in the xn1, xn2, xn3, etc. The prefixes and suffixes are stored in the xs0, xs1, xs2, etc. properties. For example, if I walk through a clip value like "rect(10px, 5px, 0px, 20px)", the values would be stored like this:
     * xs0:"rect(", s:10, xs1:"px, ", xn1:5, xs2:"px, ", xn2:0, xs3:"px, ", xn3:20, xn4:"px)"
     * And they'd all get joined together when the CSSPlugin renders (in the setRatio() method).
     * @param {string=} pfx Prefix (if any)
     * @param {!number} s Starting value
     * @param {!number} c Change in numeric value over the course of the entire tween. For example, if the start is 5 and the end is 100, the change would be 95.
     * @param {string=} sfx Suffix (if any)
     * @param {boolean=} r Round (if true).
     * @param {boolean=} pad If true, this extra value should be separated by the previous one by a space. If there is no previous extra and pad is true, it will automatically drop the space.
     * @return {CSSPropTween} returns itself so that multiple methods can be chained together.
     */

    p.appendXtra = function (pfx, s, c, sfx, r, pad) {
      var pt = this,
          l = pt.l;
      pt["xs" + l] += pad && (l || pt["xs" + l]) ? " " + pfx : pfx || "";
      if (!c) if (l !== 0 && !pt.plugin) {
        //typically we'll combine non-changing values right into the xs to optimize performance, but we don't combine them when there's a plugin that will be tweening the values because it may depend on the values being split apart, like for a bezier, if a value doesn't change between the first and second iteration but then it does on the 3rd, we'll run into trouble because there's no xn slot for that value!
        pt["xs" + l] += s + (sfx || "");
        return pt;
      }
      pt.l++;
      pt.type = pt.setRatio ? 2 : 1;
      pt["xs" + pt.l] = sfx || "";

      if (l > 0) {
        pt.data["xn" + l] = s + c;
        pt.rxp["xn" + l] = r; //round extra property (we need to tap into this in the _parseToProxy() method)

        pt["xn" + l] = s;

        if (!pt.plugin) {
          pt.xfirst = new CSSPropTween(pt, "xn" + l, s, c, pt.xfirst || pt, 0, pt.n, r, pt.pr);
          pt.xfirst.xs0 = 0; //just to ensure that the property stays numeric which helps modern browsers speed up processing. Remember, in the setRatio() method, we do pt.t[pt.p] = val + pt.xs0 so if pt.xs0 is "" (the default), it'll cast the end value as a string. When a property is a number sometimes and a string sometimes, it prevents the compiler from locking in the data type, slowing things down slightly.
        }

        return pt;
      }

      pt.data = {
        s: s + c
      };
      pt.rxp = {};
      pt.s = s;
      pt.c = c;
      pt.r = r;
      return pt;
    };
    /**
     * @constructor A SpecialProp is basically a css property that needs to be treated in a non-standard way, like if it may contain a complex value like boxShadow:"5px 10px 15px rgb(255, 102, 51)" or if it is associated with another plugin like ThrowPropsPlugin or BezierPlugin. Every SpecialProp is associated with a particular property name like "boxShadow" or "throwProps" or "bezier" and it will intercept those values in the vars object that's passed to the CSSPlugin and handle them accordingly.
     * @param {!string} p Property name (like "boxShadow" or "throwProps")
     * @param {Object=} options An object containing any of the following configuration options:
     *                      - defaultValue: the default value
     *                      - parser: A function that should be called when the associated property name is found in the vars. This function should return a CSSPropTween instance and it should ensure that it is properly inserted into the linked list. It will receive 4 paramters: 1) The target, 2) The value defined in the vars, 3) The CSSPlugin instance (whose _firstPT should be used for the linked list), and 4) A computed style object if one was calculated (this is a speed optimization that allows retrieval of starting values quicker)
     *                      - formatter: a function that formats any value received for this special property (for example, boxShadow could take "5px 5px red" and format it to "5px 5px 0px 0px red" so that both the beginning and ending values have a common order and quantity of values.)
     *                      - prefix: if true, we'll determine whether or not this property requires a vendor prefix (like Webkit or Moz or ms or O)
     *                      - color: set this to true if the value for this SpecialProp may contain color-related values like rgb(), rgba(), etc.
     *                      - priority: priority in the linked list order. Higher priority SpecialProps will be updated before lower priority ones. The default priority is 0.
     *                      - multi: if true, the formatter should accommodate a comma-delimited list of values, like boxShadow could have multiple boxShadows listed out.
     *                      - collapsible: if true, the formatter should treat the value like it's a top/right/bottom/left value that could be collapsed, like "5px" would apply to all, "5px, 10px" would use 5px for top/bottom and 10px for right/left, etc.
     *                      - keyword: a special keyword that can [optionally] be found inside the value (like "inset" for boxShadow). This allows us to validate beginning/ending values to make sure they match (if the keyword is found in one, it'll be added to the other for consistency by default).
     */


    var SpecialProp = function SpecialProp(p, options) {
      options = options || {};
      this.p = options.prefix ? _checkPropPrefix(p) || p : p;
      _specialProps[p] = _specialProps[this.p] = this;
      this.format = options.formatter || _getFormatter(options.defaultValue, options.color, options.collapsible, options.multi);

      if (options.parser) {
        this.parse = options.parser;
      }

      this.clrs = options.color;
      this.multi = options.multi;
      this.keyword = options.keyword;
      this.dflt = options.defaultValue;
      this.pr = options.priority || 0;
    },
        //shortcut for creating a new SpecialProp that can accept multiple properties as a comma-delimited list (helps minification). dflt can be an array for multiple values (we don't do a comma-delimited list because the default value may contain commas, like rect(0px,0px,0px,0px)). We attach this method to the SpecialProp class/object instead of using a private _createSpecialProp() method so that we can tap into it externally if necessary, like from another plugin.
    _registerComplexSpecialProp = _internals._registerComplexSpecialProp = function (p, options, defaults) {
      if (_typeof(options) !== "object") {
        options = {
          parser: defaults
        }; //to make backwards compatible with older versions of BezierPlugin and ThrowPropsPlugin
      }

      var a = p.split(","),
          d = options.defaultValue,
          i,
          temp;
      defaults = defaults || [d];

      for (i = 0; i < a.length; i++) {
        options.prefix = i === 0 && options.prefix;
        options.defaultValue = defaults[i] || d;
        temp = new SpecialProp(a[i], options);
      }
    },
        //creates a placeholder special prop for a plugin so that the property gets caught the first time a tween of it is attempted, and at that time it makes the plugin register itself, thus taking over for all future tweens of that property. This allows us to not mandate that things load in a particular order and it also allows us to log() an error that informs the user when they attempt to tween an external plugin-related property without loading its .js file.
    _registerPluginProp = _internals._registerPluginProp = function (p) {
      if (!_specialProps[p]) {
        var pluginName = p.charAt(0).toUpperCase() + p.substr(1) + "Plugin";

        _registerComplexSpecialProp(p, {
          parser: function parser(t, e, p, cssp, pt, plugin, vars) {
            var pluginClass = _globals.com.greensock.plugins[pluginName];

            if (!pluginClass) {
              _log("Error: " + pluginName + " js file not loaded.");

              return pt;
            }

            pluginClass._cssRegister();

            return _specialProps[p].parse(t, e, p, cssp, pt, plugin, vars);
          }
        });
      }
    };

    p = SpecialProp.prototype;
    /**
     * Alias for _parseComplex() that automatically plugs in certain values for this SpecialProp, like its property name, whether or not colors should be sensed, the default value, and priority. It also looks for any keyword that the SpecialProp defines (like "inset" for boxShadow) and ensures that the beginning and ending values have the same number of values for SpecialProps where multi is true (like boxShadow and textShadow can have a comma-delimited list)
     * @param {!Object} t target element
     * @param {(string|number|object)} b beginning value
     * @param {(string|number|object)} e ending (destination) value
     * @param {CSSPropTween=} pt next CSSPropTween in the linked list
     * @param {TweenPlugin=} plugin If another plugin will be tweening the complex value, that TweenPlugin instance goes here.
     * @param {function=} setRatio If a custom setRatio() method should be used to handle this complex value, that goes here.
     * @return {CSSPropTween=} First CSSPropTween in the linked list
     */

    p.parseComplex = function (t, b, e, pt, plugin, setRatio) {
      var kwd = this.keyword,
          i,
          ba,
          ea,
          l,
          bi,
          ei; //if this SpecialProp's value can contain a comma-delimited list of values (like boxShadow or textShadow), we must parse them in a special way, and look for a keyword (like "inset" for boxShadow) and ensure that the beginning and ending BOTH have it if the end defines it as such. We also must ensure that there are an equal number of values specified (we can't tween 1 boxShadow to 3 for example)

      if (this.multi) if (_commasOutsideParenExp.test(e) || _commasOutsideParenExp.test(b)) {
        ba = b.replace(_commasOutsideParenExp, "|").split("|");
        ea = e.replace(_commasOutsideParenExp, "|").split("|");
      } else if (kwd) {
        ba = [b];
        ea = [e];
      }

      if (ea) {
        l = ea.length > ba.length ? ea.length : ba.length;

        for (i = 0; i < l; i++) {
          b = ba[i] = ba[i] || this.dflt;
          e = ea[i] = ea[i] || this.dflt;

          if (kwd) {
            bi = b.indexOf(kwd);
            ei = e.indexOf(kwd);

            if (bi !== ei) {
              if (ei === -1) {
                //if the keyword isn't in the end value, remove it from the beginning one.
                ba[i] = ba[i].split(kwd).join("");
              } else if (bi === -1) {
                //if the keyword isn't in the beginning, add it.
                ba[i] += " " + kwd;
              }
            }
          }
        }

        b = ba.join(", ");
        e = ea.join(", ");
      }

      return _parseComplex(t, this.p, b, e, this.clrs, this.dflt, pt, this.pr, plugin, setRatio);
    };
    /**
     * Accepts a target and end value and spits back a CSSPropTween that has been inserted into the CSSPlugin's linked list and conforms with all the conventions we use internally, like type:-1, 0, 1, or 2, setting up any extra property tweens, priority, etc. For example, if we have a boxShadow SpecialProp and call:
     * this._firstPT = sp.parse(element, "5px 10px 20px rgb(2550,102,51)", "boxShadow", this);
     * It should figure out the starting value of the element's boxShadow, compare it to the provided end value and create all the necessary CSSPropTweens of the appropriate types to tween the boxShadow. The CSSPropTween that gets spit back should already be inserted into the linked list (the 4th parameter is the current head, so prepend to that).
     * @param {!Object} t Target object whose property is being tweened
     * @param {Object} e End value as provided in the vars object (typically a string, but not always - like a throwProps would be an object).
     * @param {!string} p Property name
     * @param {!CSSPlugin} cssp The CSSPlugin instance that should be associated with this tween.
     * @param {?CSSPropTween} pt The CSSPropTween that is the current head of the linked list (we'll prepend to it)
     * @param {TweenPlugin=} plugin If a plugin will be used to tween the parsed value, this is the plugin instance.
     * @param {Object=} vars Original vars object that contains the data for parsing.
     * @return {CSSPropTween} The first CSSPropTween in the linked list which includes the new one(s) added by the parse() call.
     */


    p.parse = function (t, e, p, cssp, pt, plugin, vars) {
      return this.parseComplex(t.style, this.format(_getStyle(t, this.p, _cs, false, this.dflt)), this.format(e), pt, plugin);
    };
    /**
     * Registers a special property that should be intercepted from any "css" objects defined in tweens. This allows you to handle them however you want without CSSPlugin doing it for you. The 2nd parameter should be a function that accepts 3 parameters:
     *  1) Target object whose property should be tweened (typically a DOM element)
     *  2) The end/destination value (could be a string, number, object, or whatever you want)
     *  3) The tween instance (you probably don't need to worry about this, but it can be useful for looking up information like the duration)
     *
     * Then, your function should return a function which will be called each time the tween gets rendered, passing a numeric "ratio" parameter to your function that indicates the change factor (usually between 0 and 1). For example:
     *
     * CSSPlugin.registerSpecialProp("myCustomProp", function(target, value, tween) {
     *      var start = target.style.width;
     *      return function(ratio) {
     *              target.style.width = (start + value * ratio) + "px";
     *              console.log("set width to " + target.style.width);
     *          }
     * }, 0);
     *
     * Then, when I do this tween, it will trigger my special property:
     *
     * TweenLite.to(element, 1, {css:{myCustomProp:100}});
     *
     * In the example, of course, we're just changing the width, but you can do anything you want.
     *
     * @param {!string} name Property name (or comma-delimited list of property names) that should be intercepted and handled by your function. For example, if I define "myCustomProp", then it would handle that portion of the following tween: TweenLite.to(element, 1, {css:{myCustomProp:100}})
     * @param {!function(Object, Object, Object, string):function(number)} onInitTween The function that will be called when a tween of this special property is performed. The function will receive 4 parameters: 1) Target object that should be tweened, 2) Value that was passed to the tween, 3) The tween instance itself (rarely used), and 4) The property name that's being tweened. Your function should return a function that should be called on every update of the tween. That function will receive a single parameter that is a "change factor" value (typically between 0 and 1) indicating the amount of change as a ratio. You can use this to determine how to set the values appropriately in your function.
     * @param {number=} priority Priority that helps the engine determine the order in which to set the properties (default: 0). Higher priority properties will be updated before lower priority ones.
     */


    CSSPlugin.registerSpecialProp = function (name, onInitTween, priority) {
      _registerComplexSpecialProp(name, {
        parser: function parser(t, e, p, cssp, pt, plugin, vars) {
          var rv = new CSSPropTween(t, p, 0, 0, pt, 2, p, false, priority);
          rv.plugin = plugin;
          rv.setRatio = onInitTween(t, e, cssp._tween, p);
          return rv;
        },
        priority: priority
      });
    }; //transform-related methods and properties


    CSSPlugin.useSVGTransformAttr = true; //Safari and Firefox both have some rendering bugs when applying CSS transforms to SVG elements, so default to using the "transform" attribute instead (users can override this).

    var _transformProps = "scaleX,scaleY,scaleZ,x,y,z,skewX,skewY,rotation,rotationX,rotationY,perspective,xPercent,yPercent".split(","),
        _transformProp = _checkPropPrefix("transform"),
        //the Javascript (camelCase) transform property, like msTransform, WebkitTransform, MozTransform, or OTransform.
    _transformPropCSS = _prefixCSS + "transform",
        _transformOriginProp = _checkPropPrefix("transformOrigin"),
        _supports3D = _checkPropPrefix("perspective") !== null,
        Transform = _internals.Transform = function () {
      this.perspective = parseFloat(CSSPlugin.defaultTransformPerspective) || 0;
      this.force3D = CSSPlugin.defaultForce3D === false || !_supports3D ? false : CSSPlugin.defaultForce3D || "auto";
    },
        _SVGElement = _gsScope.SVGElement,
        _useSVGTransformAttr,
        //Some browsers (like Firefox and IE) don't honor transform-origin properly in SVG elements, so we need to manually adjust the matrix accordingly. We feature detect here rather than always doing the conversion for certain browsers because they may fix the problem at some point in the future.
    _createSVG = function _createSVG(type, container, attributes) {
      var element = _doc.createElementNS("http://www.w3.org/2000/svg", type),
          reg = /([a-z])([A-Z])/g,
          p;

      for (p in attributes) {
        element.setAttributeNS(null, p.replace(reg, "$1-$2").toLowerCase(), attributes[p]);
      }

      container.appendChild(element);
      return element;
    },
        _docElement = _doc.documentElement || {},
        _forceSVGTransformAttr = function () {
      //IE and Android stock don't support CSS transforms on SVG elements, so we must write them to the "transform" attribute. We populate this variable in the _parseTransform() method, and only if/when we come across an SVG element
      var force = _ieVers || /Android/i.test(_agent) && !_gsScope.chrome,
          svg,
          rect,
          width;

      if (_doc.createElementNS && !force) {
        //IE8 and earlier doesn't support SVG anyway
        svg = _createSVG("svg", _docElement);
        rect = _createSVG("rect", svg, {
          width: 100,
          height: 50,
          x: 100
        });
        width = rect.getBoundingClientRect().width;
        rect.style[_transformOriginProp] = "50% 50%";
        rect.style[_transformProp] = "scaleX(0.5)";
        force = width === rect.getBoundingClientRect().width && !(_isFirefox && _supports3D); //note: Firefox fails the test even though it does support CSS transforms in 3D. Since we can't push 3D stuff into the transform attribute, we force Firefox to pass the test here (as long as it does truly support 3D).

        _docElement.removeChild(svg);
      }

      return force;
    }(),
        _parseSVGOrigin = function _parseSVGOrigin(e, local, decoratee, absolute, smoothOrigin, skipRecord) {
      var tm = e._gsTransform,
          m = _getMatrix(e, true),
          v,
          x,
          y,
          xOrigin,
          yOrigin,
          a,
          b,
          c,
          d,
          tx,
          ty,
          determinant,
          xOriginOld,
          yOriginOld;

      if (tm) {
        xOriginOld = tm.xOrigin; //record the original values before we alter them.

        yOriginOld = tm.yOrigin;
      }

      if (!absolute || (v = absolute.split(" ")).length < 2) {
        b = e.getBBox();

        if (b.x === 0 && b.y === 0 && b.width + b.height === 0) {
          //some browsers (like Firefox) misreport the bounds if the element has zero width and height (it just assumes it's at x:0, y:0), thus we need to manually grab the position in that case.
          b = {
            x: parseFloat(e.hasAttribute("x") ? e.getAttribute("x") : e.hasAttribute("cx") ? e.getAttribute("cx") : 0) || 0,
            y: parseFloat(e.hasAttribute("y") ? e.getAttribute("y") : e.hasAttribute("cy") ? e.getAttribute("cy") : 0) || 0,
            width: 0,
            height: 0
          };
        }

        local = _parsePosition(local).split(" ");
        v = [(local[0].indexOf("%") !== -1 ? parseFloat(local[0]) / 100 * b.width : parseFloat(local[0])) + b.x, (local[1].indexOf("%") !== -1 ? parseFloat(local[1]) / 100 * b.height : parseFloat(local[1])) + b.y];
      }

      decoratee.xOrigin = xOrigin = parseFloat(v[0]);
      decoratee.yOrigin = yOrigin = parseFloat(v[1]);

      if (absolute && m !== _identity2DMatrix) {
        //if svgOrigin is being set, we must invert the matrix and determine where the absolute point is, factoring in the current transforms. Otherwise, the svgOrigin would be based on the element's non-transformed position on the canvas.
        a = m[0];
        b = m[1];
        c = m[2];
        d = m[3];
        tx = m[4];
        ty = m[5];
        determinant = a * d - b * c;

        if (determinant) {
          //if it's zero (like if scaleX and scaleY are zero), skip it to avoid errors with dividing by zero.
          x = xOrigin * (d / determinant) + yOrigin * (-c / determinant) + (c * ty - d * tx) / determinant;
          y = xOrigin * (-b / determinant) + yOrigin * (a / determinant) - (a * ty - b * tx) / determinant;
          xOrigin = decoratee.xOrigin = v[0] = x;
          yOrigin = decoratee.yOrigin = v[1] = y;
        }
      }

      if (tm) {
        //avoid jump when transformOrigin is changed - adjust the x/y values accordingly
        if (skipRecord) {
          decoratee.xOffset = tm.xOffset;
          decoratee.yOffset = tm.yOffset;
          tm = decoratee;
        }

        if (smoothOrigin || smoothOrigin !== false && CSSPlugin.defaultSmoothOrigin !== false) {
          x = xOrigin - xOriginOld;
          y = yOrigin - yOriginOld; //originally, we simply adjusted the x and y values, but that would cause problems if, for example, you created a rotational tween part-way through an x/y tween. Managing the offset in a separate variable gives us ultimate flexibility.
          //tm.x -= x - (x * m[0] + y * m[2]);
          //tm.y -= y - (x * m[1] + y * m[3]);

          tm.xOffset += x * m[0] + y * m[2] - x;
          tm.yOffset += x * m[1] + y * m[3] - y;
        } else {
          tm.xOffset = tm.yOffset = 0;
        }
      }

      if (!skipRecord) {
        e.setAttribute("data-svg-origin", v.join(" "));
      }
    },
        _getBBoxHack = function _getBBoxHack(swapIfPossible) {
      //works around issues in some browsers (like Firefox) that don't correctly report getBBox() on SVG elements inside a <defs> element and/or <mask>. We try creating an SVG, adding it to the documentElement and toss the element in there so that it's definitely part of the rendering tree, then grab the bbox and if it works, we actually swap out the original getBBox() method for our own that does these extra steps whenever getBBox is needed. This helps ensure that performance is optimal (only do all these extra steps when absolutely necessary...most elements don't need it).
      var svg = _createElement("svg", this.ownerSVGElement && this.ownerSVGElement.getAttribute("xmlns") || "http://www.w3.org/2000/svg"),
          oldParent = this.parentNode,
          oldSibling = this.nextSibling,
          oldCSS = this.style.cssText,
          bbox;

      _docElement.appendChild(svg);

      svg.appendChild(this);
      this.style.display = "block";

      if (swapIfPossible) {
        try {
          bbox = this.getBBox();
          this._originalGetBBox = this.getBBox;
          this.getBBox = _getBBoxHack;
        } catch (e) {}
      } else if (this._originalGetBBox) {
        bbox = this._originalGetBBox();
      }

      if (oldSibling) {
        oldParent.insertBefore(this, oldSibling);
      } else {
        oldParent.appendChild(this);
      }

      _docElement.removeChild(svg);

      this.style.cssText = oldCSS;
      return bbox;
    },
        _getBBox = function _getBBox(e) {
      try {
        return e.getBBox(); //Firefox throws errors if you try calling getBBox() on an SVG element that's not rendered (like in a <symbol> or <defs>). https://bugzilla.mozilla.org/show_bug.cgi?id=612118
      } catch (error) {
        return _getBBoxHack.call(e, true);
      }
    },
        _isSVG = function _isSVG(e) {
      //reports if the element is an SVG on which getBBox() actually works
      return !!(_SVGElement && e.getCTM && (!e.parentNode || e.ownerSVGElement) && _getBBox(e));
    },
        _identity2DMatrix = [1, 0, 0, 1, 0, 0],
        _getMatrix = function _getMatrix(e, force2D) {
      var tm = e._gsTransform || new Transform(),
          rnd = 100000,
          style = e.style,
          isDefault,
          s,
          m,
          n,
          dec,
          none;

      if (_transformProp) {
        s = _getStyle(e, _transformPropCSS, null, true);
      } else if (e.currentStyle) {
        //for older versions of IE, we need to interpret the filter portion that is in the format: progid:DXImageTransform.Microsoft.Matrix(M11=6.123233995736766e-17, M12=-1, M21=1, M22=6.123233995736766e-17, sizingMethod='auto expand') Notice that we need to swap b and c compared to a normal matrix.
        s = e.currentStyle.filter.match(_ieGetMatrixExp);
        s = s && s.length === 4 ? [s[0].substr(4), Number(s[2].substr(4)), Number(s[1].substr(4)), s[3].substr(4), tm.x || 0, tm.y || 0].join(",") : "";
      }

      isDefault = !s || s === "none" || s === "matrix(1, 0, 0, 1, 0, 0)";

      if (_transformProp && ((none = !_getComputedStyle(e) || _getComputedStyle(e).display === "none") || !e.parentNode)) {
        //note: Firefox returns null for getComputedStyle() if the element is in an iframe that has display:none. https://bugzilla.mozilla.org/show_bug.cgi?id=548397
        if (none) {
          //browsers don't report transforms accurately unless the element is in the DOM and has a display value that's not "none". Firefox and Microsoft browsers have a partial bug where they'll report transforms even if display:none BUT not any percentage-based values like translate(-50%, 8px) will be reported as if it's translate(0, 8px).
          n = style.display;
          style.display = "block";
        }

        if (!e.parentNode) {
          dec = 1; //flag

          _docElement.appendChild(e);
        }

        s = _getStyle(e, _transformPropCSS, null, true);
        isDefault = !s || s === "none" || s === "matrix(1, 0, 0, 1, 0, 0)";

        if (n) {
          style.display = n;
        } else if (none) {
          _removeProp(style, "display");
        }

        if (dec) {
          _docElement.removeChild(e);
        }
      }

      if (tm.svg || e.getCTM && _isSVG(e)) {
        if (isDefault && (style[_transformProp] + "").indexOf("matrix") !== -1) {
          //some browsers (like Chrome 40) don't correctly report transforms that are applied inline on an SVG element (they don't get included in the computed style), so we double-check here and accept matrix values
          s = style[_transformProp];
          isDefault = 0;
        }

        m = e.getAttribute("transform");

        if (isDefault && m) {
          m = e.transform.baseVal.consolidate().matrix; //ensures that even complex values like "translate(50,60) rotate(135,0,0)" are parsed because it mashes it into a matrix.

          s = "matrix(" + m.a + "," + m.b + "," + m.c + "," + m.d + "," + m.e + "," + m.f + ")";
          isDefault = 0;
        }
      }

      if (isDefault) {
        return _identity2DMatrix;
      } //split the matrix values out into an array (m for matrix)


      m = (s || "").match(_numExp) || [];
      i = m.length;

      while (--i > -1) {
        n = Number(m[i]);
        m[i] = (dec = n - (n |= 0)) ? (dec * rnd + (dec < 0 ? -0.5 : 0.5) | 0) / rnd + n : n; //convert strings to Numbers and round to 5 decimal places to avoid issues with tiny numbers. Roughly 20x faster than Number.toFixed(). We also must make sure to round before dividing so that values like 0.9999999999 become 1 to avoid glitches in browser rendering and interpretation of flipped/rotated 3D matrices. And don't just multiply the number by rnd, floor it, and then divide by rnd because the bitwise operations max out at a 32-bit signed integer, thus it could get clipped at a relatively low value (like 22,000.00000 for example).
      }

      return force2D && m.length > 6 ? [m[0], m[1], m[4], m[5], m[12], m[13]] : m;
    },

    /**
     * Parses the transform values for an element, returning an object with x, y, z, scaleX, scaleY, scaleZ, rotation, rotationX, rotationY, skewX, and skewY properties. Note: by default (for performance reasons), all skewing is combined into skewX and rotation but skewY still has a place in the transform object so that we can record how much of the skew is attributed to skewX vs skewY. Remember, a skewY of 10 looks the same as a rotation of 10 and skewX of -10.
     * @param {!Object} t target element
     * @param {Object=} cs computed style object (optional)
     * @param {boolean=} rec if true, the transform values will be recorded to the target element's _gsTransform object, like target._gsTransform = {x:0, y:0, z:0, scaleX:1...}
     * @param {boolean=} parse if true, we'll ignore any _gsTransform values that already exist on the element, and force a reparsing of the css (calculated style)
     * @return {object} object containing all of the transform properties/values like {x:0, y:0, z:0, scaleX:1...}
     */
    _getTransform = _internals.getTransform = function (t, cs, rec, parse) {
      if (t._gsTransform && rec && !parse) {
        return t._gsTransform; //if the element already has a _gsTransform, use that. Note: some browsers don't accurately return the calculated style for the transform (particularly for SVG), so it's almost always safest to just use the values we've already applied rather than re-parsing things.
      }

      var tm = rec ? t._gsTransform || new Transform() : new Transform(),
          invX = tm.scaleX < 0,
          //in order to interpret things properly, we need to know if the user applied a negative scaleX previously so that we can adjust the rotation and skewX accordingly. Otherwise, if we always interpret a flipped matrix as affecting scaleY and the user only wants to tween the scaleX on multiple sequential tweens, it would keep the negative scaleY without that being the user's intent.
      min = 0.00002,
          rnd = 100000,
          zOrigin = _supports3D ? parseFloat(_getStyle(t, _transformOriginProp, cs, false, "0 0 0").split(" ")[2]) || tm.zOrigin || 0 : 0,
          defaultTransformPerspective = parseFloat(CSSPlugin.defaultTransformPerspective) || 0,
          m,
          i,
          scaleX,
          scaleY,
          rotation,
          skewX;
      tm.svg = !!(t.getCTM && _isSVG(t));

      if (tm.svg) {
        _parseSVGOrigin(t, _getStyle(t, _transformOriginProp, cs, false, "50% 50%") + "", tm, t.getAttribute("data-svg-origin"));

        _useSVGTransformAttr = CSSPlugin.useSVGTransformAttr || _forceSVGTransformAttr;
      }

      m = _getMatrix(t);

      if (m !== _identity2DMatrix) {
        if (m.length === 16) {
          //we'll only look at these position-related 6 variables first because if x/y/z all match, it's relatively safe to assume we don't need to re-parse everything which risks losing important rotational information (like rotationX:180 plus rotationY:180 would look the same as rotation:180 - there's no way to know for sure which direction was taken based solely on the matrix3d() values)
          var a11 = m[0],
              a21 = m[1],
              a31 = m[2],
              a41 = m[3],
              a12 = m[4],
              a22 = m[5],
              a32 = m[6],
              a42 = m[7],
              a13 = m[8],
              a23 = m[9],
              a33 = m[10],
              a14 = m[12],
              a24 = m[13],
              a34 = m[14],
              a43 = m[11],
              angle = Math.atan2(a32, a33),
              t1,
              t2,
              t3,
              t4,
              cos,
              sin; //we manually compensate for non-zero z component of transformOrigin to work around bugs in Safari

          if (tm.zOrigin) {
            a34 = -tm.zOrigin;
            a14 = a13 * a34 - m[12];
            a24 = a23 * a34 - m[13];
            a34 = a33 * a34 + tm.zOrigin - m[14];
          } //note for possible future consolidation: rotationX: Math.atan2(a32, a33), rotationY: Math.atan2(-a31, Math.sqrt(a33 * a33 + a32 * a32)), rotation: Math.atan2(a21, a11), skew: Math.atan2(a12, a22). However, it doesn't seem to be quite as reliable as the full-on backwards rotation procedure.


          tm.rotationX = angle * _RAD2DEG; //rotationX

          if (angle) {
            cos = Math.cos(-angle);
            sin = Math.sin(-angle);
            t1 = a12 * cos + a13 * sin;
            t2 = a22 * cos + a23 * sin;
            t3 = a32 * cos + a33 * sin;
            a13 = a12 * -sin + a13 * cos;
            a23 = a22 * -sin + a23 * cos;
            a33 = a32 * -sin + a33 * cos;
            a43 = a42 * -sin + a43 * cos;
            a12 = t1;
            a22 = t2;
            a32 = t3;
          } //rotationY


          angle = Math.atan2(-a31, a33);
          tm.rotationY = angle * _RAD2DEG;

          if (angle) {
            cos = Math.cos(-angle);
            sin = Math.sin(-angle);
            t1 = a11 * cos - a13 * sin;
            t2 = a21 * cos - a23 * sin;
            t3 = a31 * cos - a33 * sin;
            a23 = a21 * sin + a23 * cos;
            a33 = a31 * sin + a33 * cos;
            a43 = a41 * sin + a43 * cos;
            a11 = t1;
            a21 = t2;
            a31 = t3;
          } //rotationZ


          angle = Math.atan2(a21, a11);
          tm.rotation = angle * _RAD2DEG;

          if (angle) {
            cos = Math.cos(angle);
            sin = Math.sin(angle);
            t1 = a11 * cos + a21 * sin;
            t2 = a12 * cos + a22 * sin;
            t3 = a13 * cos + a23 * sin;
            a21 = a21 * cos - a11 * sin;
            a22 = a22 * cos - a12 * sin;
            a23 = a23 * cos - a13 * sin;
            a11 = t1;
            a12 = t2;
            a13 = t3;
          }

          if (tm.rotationX && Math.abs(tm.rotationX) + Math.abs(tm.rotation) > 359.9) {
            //when rotationY is set, it will often be parsed as 180 degrees different than it should be, and rotationX and rotation both being 180 (it looks the same), so we adjust for that here.
            tm.rotationX = tm.rotation = 0;
            tm.rotationY = 180 - tm.rotationY;
          } //skewX


          angle = Math.atan2(a12, a22); //scales

          tm.scaleX = (Math.sqrt(a11 * a11 + a21 * a21 + a31 * a31) * rnd + 0.5 | 0) / rnd;
          tm.scaleY = (Math.sqrt(a22 * a22 + a32 * a32) * rnd + 0.5 | 0) / rnd;
          tm.scaleZ = (Math.sqrt(a13 * a13 + a23 * a23 + a33 * a33) * rnd + 0.5 | 0) / rnd;
          a11 /= tm.scaleX;
          a12 /= tm.scaleY;
          a21 /= tm.scaleX;
          a22 /= tm.scaleY;

          if (Math.abs(angle) > min) {
            tm.skewX = angle * _RAD2DEG;
            a12 = 0; //unskews

            if (tm.skewType !== "simple") {
              tm.scaleY *= 1 / Math.cos(angle); //by default, we compensate the scale based on the skew so that the element maintains a similar proportion when skewed, so we have to alter the scaleY here accordingly to match the default (non-adjusted) skewing that CSS does (stretching more and more as it skews).
            }
          } else {
            tm.skewX = 0;
          }
          /* //for testing purposes
          var transform = "matrix3d(",
          	comma = ",",
          	zero = "0";
          a13 /= tm.scaleZ;
          a23 /= tm.scaleZ;
          a31 /= tm.scaleX;
          a32 /= tm.scaleY;
          a33 /= tm.scaleZ;
          transform += ((a11 < min && a11 > -min) ? zero : a11) + comma + ((a21 < min && a21 > -min) ? zero : a21) + comma + ((a31 < min && a31 > -min) ? zero : a31);
          transform += comma + ((a41 < min && a41 > -min) ? zero : a41) + comma + ((a12 < min && a12 > -min) ? zero : a12) + comma + ((a22 < min && a22 > -min) ? zero : a22);
          transform += comma + ((a32 < min && a32 > -min) ? zero : a32) + comma + ((a42 < min && a42 > -min) ? zero : a42) + comma + ((a13 < min && a13 > -min) ? zero : a13);
          transform += comma + ((a23 < min && a23 > -min) ? zero : a23) + comma + ((a33 < min && a33 > -min) ? zero : a33) + comma + ((a43 < min && a43 > -min) ? zero : a43) + comma;
          transform += a14 + comma + a24 + comma + a34 + comma + (tm.perspective ? (1 + (-a34 / tm.perspective)) : 1) + ")";
          console.log(transform);
          document.querySelector(".test").style[_transformProp] = transform;
          */


          tm.perspective = a43 ? 1 / (a43 < 0 ? -a43 : a43) : 0;
          tm.x = a14;
          tm.y = a24;
          tm.z = a34;

          if (tm.svg) {
            tm.x -= tm.xOrigin - (tm.xOrigin * a11 - tm.yOrigin * a12);
            tm.y -= tm.yOrigin - (tm.yOrigin * a21 - tm.xOrigin * a22);
          }
        } else if (!_supports3D || parse || !m.length || tm.x !== m[4] || tm.y !== m[5] || !tm.rotationX && !tm.rotationY) {
          //sometimes a 6-element matrix is returned even when we performed 3D transforms, like if rotationX and rotationY are 180. In cases like this, we still need to honor the 3D transforms. If we just rely on the 2D info, it could affect how the data is interpreted, like scaleY might get set to -1 or rotation could get offset by 180 degrees. For example, do a TweenLite.to(element, 1, {css:{rotationX:180, rotationY:180}}) and then later, TweenLite.to(element, 1, {css:{rotationX:0}}) and without this conditional logic in place, it'd jump to a state of being unrotated when the 2nd tween starts. Then again, we need to honor the fact that the user COULD alter the transforms outside of CSSPlugin, like by manually applying new css, so we try to sense that by looking at x and y because if those changed, we know the changes were made outside CSSPlugin and we force a reinterpretation of the matrix values. Also, in Webkit browsers, if the element's "display" is "none", its calculated style value will always return empty, so if we've already recorded the values in the _gsTransform object, we'll just rely on those.
          var k = m.length >= 6,
              a = k ? m[0] : 1,
              b = m[1] || 0,
              c = m[2] || 0,
              d = k ? m[3] : 1;
          tm.x = m[4] || 0;
          tm.y = m[5] || 0;
          scaleX = Math.sqrt(a * a + b * b);
          scaleY = Math.sqrt(d * d + c * c);
          rotation = a || b ? Math.atan2(b, a) * _RAD2DEG : tm.rotation || 0; //note: if scaleX is 0, we cannot accurately measure rotation. Same for skewX with a scaleY of 0. Therefore, we default to the previously recorded value (or zero if that doesn't exist).

          skewX = c || d ? Math.atan2(c, d) * _RAD2DEG + rotation : tm.skewX || 0;
          tm.scaleX = scaleX;
          tm.scaleY = scaleY;
          tm.rotation = rotation;
          tm.skewX = skewX;

          if (_supports3D) {
            tm.rotationX = tm.rotationY = tm.z = 0;
            tm.perspective = defaultTransformPerspective;
            tm.scaleZ = 1;
          }

          if (tm.svg) {
            tm.x -= tm.xOrigin - (tm.xOrigin * a + tm.yOrigin * c);
            tm.y -= tm.yOrigin - (tm.xOrigin * b + tm.yOrigin * d);
          }
        }

        if (Math.abs(tm.skewX) > 90 && Math.abs(tm.skewX) < 270) {
          if (invX) {
            tm.scaleX *= -1;
            tm.skewX += tm.rotation <= 0 ? 180 : -180;
            tm.rotation += tm.rotation <= 0 ? 180 : -180;
          } else {
            tm.scaleY *= -1;
            tm.skewX += tm.skewX <= 0 ? 180 : -180;
          }
        }

        tm.zOrigin = zOrigin; //some browsers have a hard time with very small values like 2.4492935982947064e-16 (notice the "e-" towards the end) and would render the object slightly off. So we round to 0 in these cases. The conditional logic here is faster than calling Math.abs(). Also, browsers tend to render a SLIGHTLY rotated object in a fuzzy way, so we need to snap to exactly 0 when appropriate.

        for (i in tm) {
          if (tm[i] < min) if (tm[i] > -min) {
            tm[i] = 0;
          }
        }
      } //DEBUG: _log("parsed rotation of " + t.getAttribute("id")+": "+(tm.rotationX)+", "+(tm.rotationY)+", "+(tm.rotation)+", scale: "+tm.scaleX+", "+tm.scaleY+", "+tm.scaleZ+", position: "+tm.x+", "+tm.y+", "+tm.z+", perspective: "+tm.perspective+ ", origin: "+ tm.xOrigin+ ","+ tm.yOrigin);


      if (rec) {
        t._gsTransform = tm; //record to the object's _gsTransform which we use so that tweens can control individual properties independently (we need all the properties to accurately recompose the matrix in the setRatio() method)

        if (tm.svg) {
          //if we're supposed to apply transforms to the SVG element's "transform" attribute, make sure there aren't any CSS transforms applied or they'll override the attribute ones. Also clear the transform attribute if we're using CSS, just to be clean.
          if (_useSVGTransformAttr && t.style[_transformProp]) {
            TweenLite.delayedCall(0.001, function () {
              //if we apply this right away (before anything has rendered), we risk there being no transforms for a brief moment and it also interferes with adjusting the transformOrigin in a tween with immediateRender:true (it'd try reading the matrix and it wouldn't have the appropriate data in place because we just removed it).
              _removeProp(t.style, _transformProp);
            });
          } else if (!_useSVGTransformAttr && t.getAttribute("transform")) {
            TweenLite.delayedCall(0.001, function () {
              t.removeAttribute("transform");
            });
          }
        }
      }

      return tm;
    },
        //for setting 2D transforms in IE6, IE7, and IE8 (must use a "filter" to emulate the behavior of modern day browser transforms)
    _setIETransformRatio = function _setIETransformRatio(v) {
      var t = this.data,
          //refers to the element's _gsTransform object
      ang = -t.rotation * _DEG2RAD,
          skew = ang + t.skewX * _DEG2RAD,
          rnd = 100000,
          a = (Math.cos(ang) * t.scaleX * rnd | 0) / rnd,
          b = (Math.sin(ang) * t.scaleX * rnd | 0) / rnd,
          c = (Math.sin(skew) * -t.scaleY * rnd | 0) / rnd,
          d = (Math.cos(skew) * t.scaleY * rnd | 0) / rnd,
          style = this.t.style,
          cs = this.t.currentStyle,
          filters,
          val;

      if (!cs) {
        return;
      }

      val = b; //just for swapping the variables an inverting them (reused "val" to avoid creating another variable in memory). IE's filter matrix uses a non-standard matrix configuration (angle goes the opposite way, and b and c are reversed and inverted)

      b = -c;
      c = -val;
      filters = cs.filter;
      style.filter = ""; //remove filters so that we can accurately measure offsetWidth/offsetHeight

      var w = this.t.offsetWidth,
          h = this.t.offsetHeight,
          clip = cs.position !== "absolute",
          m = "progid:DXImageTransform.Microsoft.Matrix(M11=" + a + ", M12=" + b + ", M21=" + c + ", M22=" + d,
          ox = t.x + w * t.xPercent / 100,
          oy = t.y + h * t.yPercent / 100,
          dx,
          dy; //if transformOrigin is being used, adjust the offset x and y

      if (t.ox != null) {
        dx = (t.oxp ? w * t.ox * 0.01 : t.ox) - w / 2;
        dy = (t.oyp ? h * t.oy * 0.01 : t.oy) - h / 2;
        ox += dx - (dx * a + dy * b);
        oy += dy - (dx * c + dy * d);
      }

      if (!clip) {
        m += ", sizingMethod='auto expand')";
      } else {
        dx = w / 2;
        dy = h / 2; //translate to ensure that transformations occur around the correct origin (default is center).

        m += ", Dx=" + (dx - (dx * a + dy * b) + ox) + ", Dy=" + (dy - (dx * c + dy * d) + oy) + ")";
      }

      if (filters.indexOf("DXImageTransform.Microsoft.Matrix(") !== -1) {
        style.filter = filters.replace(_ieSetMatrixExp, m);
      } else {
        style.filter = m + " " + filters; //we must always put the transform/matrix FIRST (before alpha(opacity=xx)) to avoid an IE bug that slices part of the object when rotation is applied with alpha.
      } //at the end or beginning of the tween, if the matrix is normal (1, 0, 0, 1) and opacity is 100 (or doesn't exist), remove the filter to improve browser performance.


      if (v === 0 || v === 1) if (a === 1) if (b === 0) if (c === 0) if (d === 1) if (!clip || m.indexOf("Dx=0, Dy=0") !== -1) if (!_opacityExp.test(filters) || parseFloat(RegExp.$1) === 100) if (filters.indexOf("gradient(" && filters.indexOf("Alpha")) === -1) {
        style.removeAttribute("filter");
      } //we must set the margins AFTER applying the filter in order to avoid some bugs in IE8 that could (in rare scenarios) cause them to be ignored intermittently (vibration).

      if (!clip) {
        var mult = _ieVers < 8 ? 1 : -1,
            //in Internet Explorer 7 and before, the box model is broken, causing the browser to treat the width/height of the actual rotated filtered image as the width/height of the box itself, but Microsoft corrected that in IE8. We must use a negative offset in IE8 on the right/bottom
        marg,
            prop,
            dif;
        dx = t.ieOffsetX || 0;
        dy = t.ieOffsetY || 0;
        t.ieOffsetX = Math.round((w - ((a < 0 ? -a : a) * w + (b < 0 ? -b : b) * h)) / 2 + ox);
        t.ieOffsetY = Math.round((h - ((d < 0 ? -d : d) * h + (c < 0 ? -c : c) * w)) / 2 + oy);

        for (i = 0; i < 4; i++) {
          prop = _margins[i];
          marg = cs[prop]; //we need to get the current margin in case it is being tweened separately (we want to respect that tween's changes)

          val = marg.indexOf("px") !== -1 ? parseFloat(marg) : _convertToPixels(this.t, prop, parseFloat(marg), marg.replace(_suffixExp, "")) || 0;

          if (val !== t[prop]) {
            dif = i < 2 ? -t.ieOffsetX : -t.ieOffsetY; //if another tween is controlling a margin, we cannot only apply the difference in the ieOffsets, so we essentially zero-out the dx and dy here in that case. We record the margin(s) later so that we can keep comparing them, making this code very flexible.
          } else {
            dif = i < 2 ? dx - t.ieOffsetX : dy - t.ieOffsetY;
          }

          style[prop] = (t[prop] = Math.round(val - dif * (i === 0 || i === 2 ? 1 : mult))) + "px";
        }
      }
    },

    /* translates a super small decimal to a string WITHOUT scientific notation
    _safeDecimal = function(n) {
    	var s = (n < 0 ? -n : n) + "",
    		a = s.split("e-");
    	return (n < 0 ? "-0." : "0.") + new Array(parseInt(a[1], 10) || 0).join("0") + a[0].split(".").join("");
    },
    */
    _setTransformRatio = _internals.set3DTransformRatio = _internals.setTransformRatio = function (v) {
      var t = this.data,
          //refers to the element's _gsTransform object
      style = this.t.style,
          angle = t.rotation,
          rotationX = t.rotationX,
          rotationY = t.rotationY,
          sx = t.scaleX,
          sy = t.scaleY,
          sz = t.scaleZ,
          x = t.x,
          y = t.y,
          z = t.z,
          isSVG = t.svg,
          perspective = t.perspective,
          force3D = t.force3D,
          skewY = t.skewY,
          skewX = t.skewX,
          t1,
          a11,
          a12,
          a13,
          a21,
          a22,
          a23,
          a31,
          a32,
          a33,
          a41,
          a42,
          a43,
          zOrigin,
          min,
          cos,
          sin,
          t2,
          transform,
          comma,
          zero,
          skew,
          rnd;

      if (skewY) {
        //for performance reasons, we combine all skewing into the skewX and rotation values. Remember, a skewY of 10 degrees looks the same as a rotation of 10 degrees plus a skewX of 10 degrees.
        skewX += skewY;
        angle += skewY;
      } //check to see if we should render as 2D (and SVGs must use 2D when _useSVGTransformAttr is true)


      if (((v === 1 || v === 0) && force3D === "auto" && (this.tween._totalTime === this.tween._totalDuration || !this.tween._totalTime) || !force3D) && !z && !perspective && !rotationY && !rotationX && sz === 1 || _useSVGTransformAttr && isSVG || !_supports3D) {
        //on the final render (which could be 0 for a from tween), if there are no 3D aspects, render in 2D to free up memory and improve performance especially on mobile devices. Check the tween's totalTime/totalDuration too in order to make sure it doesn't happen between repeats if it's a repeating tween.
        //2D
        if (angle || skewX || isSVG) {
          angle *= _DEG2RAD;
          skew = skewX * _DEG2RAD;
          rnd = 100000;
          a11 = Math.cos(angle) * sx;
          a21 = Math.sin(angle) * sx;
          a12 = Math.sin(angle - skew) * -sy;
          a22 = Math.cos(angle - skew) * sy;

          if (skew && t.skewType === "simple") {
            //by default, we compensate skewing on the other axis to make it look more natural, but you can set the skewType to "simple" to use the uncompensated skewing that CSS does
            t1 = Math.tan(skew - skewY * _DEG2RAD);
            t1 = Math.sqrt(1 + t1 * t1);
            a12 *= t1;
            a22 *= t1;

            if (skewY) {
              t1 = Math.tan(skewY * _DEG2RAD);
              t1 = Math.sqrt(1 + t1 * t1);
              a11 *= t1;
              a21 *= t1;
            }
          }

          if (isSVG) {
            x += t.xOrigin - (t.xOrigin * a11 + t.yOrigin * a12) + t.xOffset;
            y += t.yOrigin - (t.xOrigin * a21 + t.yOrigin * a22) + t.yOffset;

            if (_useSVGTransformAttr && (t.xPercent || t.yPercent)) {
              //The SVG spec doesn't support percentage-based translation in the "transform" attribute, so we merge it into the matrix to simulate it.
              min = this.t.getBBox();
              x += t.xPercent * 0.01 * min.width;
              y += t.yPercent * 0.01 * min.height;
            }

            min = 0.000001;
            if (x < min) if (x > -min) {
              x = 0;
            }
            if (y < min) if (y > -min) {
              y = 0;
            }
          }

          transform = (a11 * rnd | 0) / rnd + "," + (a21 * rnd | 0) / rnd + "," + (a12 * rnd | 0) / rnd + "," + (a22 * rnd | 0) / rnd + "," + x + "," + y + ")";

          if (isSVG && _useSVGTransformAttr) {
            this.t.setAttribute("transform", "matrix(" + transform);
          } else {
            //some browsers have a hard time with very small values like 2.4492935982947064e-16 (notice the "e-" towards the end) and would render the object slightly off. So we round to 5 decimal places.
            style[_transformProp] = (t.xPercent || t.yPercent ? "translate(" + t.xPercent + "%," + t.yPercent + "%) matrix(" : "matrix(") + transform;
          }
        } else {
          style[_transformProp] = (t.xPercent || t.yPercent ? "translate(" + t.xPercent + "%," + t.yPercent + "%) matrix(" : "matrix(") + sx + ",0,0," + sy + "," + x + "," + y + ")";
        }

        return;
      }

      if (_isFirefox) {
        //Firefox has a bug (at least in v25) that causes it to render the transparent part of 32-bit PNG images as black when displayed inside an iframe and the 3D scale is very small and doesn't change sufficiently enough between renders (like if you use a Power4.easeInOut to scale from 0 to 1 where the beginning values only change a tiny amount to begin the tween before accelerating). In this case, we force the scale to be 0.00002 instead which is visually the same but works around the Firefox issue.
        min = 0.0001;

        if (sx < min && sx > -min) {
          sx = sz = 0.00002;
        }

        if (sy < min && sy > -min) {
          sy = sz = 0.00002;
        }

        if (perspective && !t.z && !t.rotationX && !t.rotationY) {
          //Firefox has a bug that causes elements to have an odd super-thin, broken/dotted black border on elements that have a perspective set but aren't utilizing 3D space (no rotationX, rotationY, or z).
          perspective = 0;
        }
      }

      if (angle || skewX) {
        angle *= _DEG2RAD;
        cos = a11 = Math.cos(angle);
        sin = a21 = Math.sin(angle);

        if (skewX) {
          angle -= skewX * _DEG2RAD;
          cos = Math.cos(angle);
          sin = Math.sin(angle);

          if (t.skewType === "simple") {
            //by default, we compensate skewing on the other axis to make it look more natural, but you can set the skewType to "simple" to use the uncompensated skewing that CSS does
            t1 = Math.tan((skewX - skewY) * _DEG2RAD);
            t1 = Math.sqrt(1 + t1 * t1);
            cos *= t1;
            sin *= t1;

            if (t.skewY) {
              t1 = Math.tan(skewY * _DEG2RAD);
              t1 = Math.sqrt(1 + t1 * t1);
              a11 *= t1;
              a21 *= t1;
            }
          }
        }

        a12 = -sin;
        a22 = cos;
      } else if (!rotationY && !rotationX && sz === 1 && !perspective && !isSVG) {
        //if we're only translating and/or 2D scaling, this is faster...
        style[_transformProp] = (t.xPercent || t.yPercent ? "translate(" + t.xPercent + "%," + t.yPercent + "%) translate3d(" : "translate3d(") + x + "px," + y + "px," + z + "px)" + (sx !== 1 || sy !== 1 ? " scale(" + sx + "," + sy + ")" : "");
        return;
      } else {
        a11 = a22 = 1;
        a12 = a21 = 0;
      } // KEY  INDEX   AFFECTS a[row][column]
      // a11  0       rotation, rotationY, scaleX
      // a21  1       rotation, rotationY, scaleX
      // a31  2       rotationY, scaleX
      // a41  3       rotationY, scaleX
      // a12  4       rotation, skewX, rotationX, scaleY
      // a22  5       rotation, skewX, rotationX, scaleY
      // a32  6       rotationX, scaleY
      // a42  7       rotationX, scaleY
      // a13  8       rotationY, rotationX, scaleZ
      // a23  9       rotationY, rotationX, scaleZ
      // a33  10      rotationY, rotationX, scaleZ
      // a43  11      rotationY, rotationX, perspective, scaleZ
      // a14  12      x, zOrigin, svgOrigin
      // a24  13      y, zOrigin, svgOrigin
      // a34  14      z, zOrigin
      // a44  15
      // rotation: Math.atan2(a21, a11)
      // rotationY: Math.atan2(a13, a33) (or Math.atan2(a13, a11))
      // rotationX: Math.atan2(a32, a33)


      a33 = 1;
      a13 = a23 = a31 = a32 = a41 = a42 = 0;
      a43 = perspective ? -1 / perspective : 0;
      zOrigin = t.zOrigin;
      min = 0.000001; //threshold below which browsers use scientific notation which won't work.

      comma = ",";
      zero = "0";
      angle = rotationY * _DEG2RAD;

      if (angle) {
        cos = Math.cos(angle);
        sin = Math.sin(angle);
        a31 = -sin;
        a41 = a43 * -sin;
        a13 = a11 * sin;
        a23 = a21 * sin;
        a33 = cos;
        a43 *= cos;
        a11 *= cos;
        a21 *= cos;
      }

      angle = rotationX * _DEG2RAD;

      if (angle) {
        cos = Math.cos(angle);
        sin = Math.sin(angle);
        t1 = a12 * cos + a13 * sin;
        t2 = a22 * cos + a23 * sin;
        a32 = a33 * sin;
        a42 = a43 * sin;
        a13 = a12 * -sin + a13 * cos;
        a23 = a22 * -sin + a23 * cos;
        a33 = a33 * cos;
        a43 = a43 * cos;
        a12 = t1;
        a22 = t2;
      }

      if (sz !== 1) {
        a13 *= sz;
        a23 *= sz;
        a33 *= sz;
        a43 *= sz;
      }

      if (sy !== 1) {
        a12 *= sy;
        a22 *= sy;
        a32 *= sy;
        a42 *= sy;
      }

      if (sx !== 1) {
        a11 *= sx;
        a21 *= sx;
        a31 *= sx;
        a41 *= sx;
      }

      if (zOrigin || isSVG) {
        if (zOrigin) {
          x += a13 * -zOrigin;
          y += a23 * -zOrigin;
          z += a33 * -zOrigin + zOrigin;
        }

        if (isSVG) {
          //due to bugs in some browsers, we need to manage the transform-origin of SVG manually
          x += t.xOrigin - (t.xOrigin * a11 + t.yOrigin * a12) + t.xOffset;
          y += t.yOrigin - (t.xOrigin * a21 + t.yOrigin * a22) + t.yOffset;
        }

        if (x < min && x > -min) {
          x = zero;
        }

        if (y < min && y > -min) {
          y = zero;
        }

        if (z < min && z > -min) {
          z = 0; //don't use string because we calculate perspective later and need the number.
        }
      } //optimized way of concatenating all the values into a string. If we do it all in one shot, it's slower because of the way browsers have to create temp strings and the way it affects memory. If we do it piece-by-piece with +=, it's a bit slower too. We found that doing it in these sized chunks works best overall:


      transform = t.xPercent || t.yPercent ? "translate(" + t.xPercent + "%," + t.yPercent + "%) matrix3d(" : "matrix3d(";
      transform += (a11 < min && a11 > -min ? zero : a11) + comma + (a21 < min && a21 > -min ? zero : a21) + comma + (a31 < min && a31 > -min ? zero : a31);
      transform += comma + (a41 < min && a41 > -min ? zero : a41) + comma + (a12 < min && a12 > -min ? zero : a12) + comma + (a22 < min && a22 > -min ? zero : a22);

      if (rotationX || rotationY || sz !== 1) {
        //performance optimization (often there's no rotationX or rotationY, so we can skip these calculations)
        transform += comma + (a32 < min && a32 > -min ? zero : a32) + comma + (a42 < min && a42 > -min ? zero : a42) + comma + (a13 < min && a13 > -min ? zero : a13);
        transform += comma + (a23 < min && a23 > -min ? zero : a23) + comma + (a33 < min && a33 > -min ? zero : a33) + comma + (a43 < min && a43 > -min ? zero : a43) + comma;
      } else {
        transform += ",0,0,0,0,1,0,";
      }

      transform += x + comma + y + comma + z + comma + (perspective ? 1 + -z / perspective : 1) + ")";
      style[_transformProp] = transform;
    };

    p = Transform.prototype;
    p.x = p.y = p.z = p.skewX = p.skewY = p.rotation = p.rotationX = p.rotationY = p.zOrigin = p.xPercent = p.yPercent = p.xOffset = p.yOffset = 0;
    p.scaleX = p.scaleY = p.scaleZ = 1;

    _registerComplexSpecialProp("transform,scale,scaleX,scaleY,scaleZ,x,y,z,rotation,rotationX,rotationY,rotationZ,skewX,skewY,shortRotation,shortRotationX,shortRotationY,shortRotationZ,transformOrigin,svgOrigin,transformPerspective,directionalRotation,parseTransform,force3D,skewType,xPercent,yPercent,smoothOrigin", {
      parser: function parser(t, e, parsingProp, cssp, pt, plugin, vars) {
        if (cssp._lastParsedTransform === vars) {
          return pt;
        } //only need to parse the transform once, and only if the browser supports it.


        cssp._lastParsedTransform = vars;
        var scaleFunc = vars.scale && typeof vars.scale === "function" ? vars.scale : 0,
            //if there's a function-based "scale" value, swap in the resulting numeric value temporarily. Otherwise, if it's called for both scaleX and scaleY independently, they may not match (like if the function uses Math.random()).
        swapFunc;

        if (typeof vars[parsingProp] === "function") {
          //whatever property triggers the initial parsing might be a function-based value in which case it already got called in parse(), thus we don't want to call it again in here. The most efficient way to avoid this is to temporarily swap the value directly into the vars object, and then after we do all our parsing in this function, we'll swap it back again.
          swapFunc = vars[parsingProp];
          vars[parsingProp] = e;
        }

        if (scaleFunc) {
          vars.scale = scaleFunc(_index, t);
        }

        var originalGSTransform = t._gsTransform,
            style = t.style,
            min = 0.000001,
            i = _transformProps.length,
            v = vars,
            endRotations = {},
            transformOriginString = "transformOrigin",
            m1 = _getTransform(t, _cs, true, v.parseTransform),
            orig = v.transform && (typeof v.transform === "function" ? v.transform(_index, _target) : v.transform),
            m2,
            copy,
            has3D,
            hasChange,
            dr,
            x,
            y,
            matrix,
            p;

        m1.skewType = v.skewType || m1.skewType || CSSPlugin.defaultSkewType;
        cssp._transform = m1;

        if (orig && typeof orig === "string" && _transformProp) {
          //for values like transform:"rotate(60deg) scale(0.5, 0.8)"
          copy = _tempDiv.style; //don't use the original target because it might be SVG in which case some browsers don't report computed style correctly.

          copy[_transformProp] = orig;
          copy.display = "block"; //if display is "none", the browser often refuses to report the transform properties correctly.

          copy.position = "absolute";

          _doc.body.appendChild(_tempDiv);

          m2 = _getTransform(_tempDiv, null, false);

          if (m1.skewType === "simple") {
            //the default _getTransform() reports the skewX/scaleY as if skewType is "compensated", thus we need to adjust that here if skewType is "simple".
            m2.scaleY *= Math.cos(m2.skewX * _DEG2RAD);
          }

          if (m1.svg) {
            //if it's an SVG element, x/y part of the matrix will be affected by whatever we use as the origin and the offsets, so compensate here...
            x = m1.xOrigin;
            y = m1.yOrigin;
            m2.x -= m1.xOffset;
            m2.y -= m1.yOffset;

            if (v.transformOrigin || v.svgOrigin) {
              //if this tween is altering the origin, we must factor that in here. The actual work of recording the transformOrigin values and setting up the PropTween is done later (still inside this function) so we cannot leave the changes intact here - we only want to update the x/y accordingly.
              orig = {};

              _parseSVGOrigin(t, _parsePosition(v.transformOrigin), orig, v.svgOrigin, v.smoothOrigin, true);

              x = orig.xOrigin;
              y = orig.yOrigin;
              m2.x -= orig.xOffset - m1.xOffset;
              m2.y -= orig.yOffset - m1.yOffset;
            }

            if (x || y) {
              matrix = _getMatrix(_tempDiv, true);
              m2.x -= x - (x * matrix[0] + y * matrix[2]);
              m2.y -= y - (x * matrix[1] + y * matrix[3]);
            }
          }

          _doc.body.removeChild(_tempDiv);

          if (!m2.perspective) {
            m2.perspective = m1.perspective; //tweening to no perspective gives very unintuitive results - just keep the same perspective in that case.
          }

          if (v.xPercent != null) {
            m2.xPercent = _parseVal(v.xPercent, m1.xPercent);
          }

          if (v.yPercent != null) {
            m2.yPercent = _parseVal(v.yPercent, m1.yPercent);
          }
        } else if (_typeof(v) === "object") {
          //for values like scaleX, scaleY, rotation, x, y, skewX, and skewY or transform:{...} (object)
          m2 = {
            scaleX: _parseVal(v.scaleX != null ? v.scaleX : v.scale, m1.scaleX),
            scaleY: _parseVal(v.scaleY != null ? v.scaleY : v.scale, m1.scaleY),
            scaleZ: _parseVal(v.scaleZ, m1.scaleZ),
            x: _parseVal(v.x, m1.x),
            y: _parseVal(v.y, m1.y),
            z: _parseVal(v.z, m1.z),
            xPercent: _parseVal(v.xPercent, m1.xPercent),
            yPercent: _parseVal(v.yPercent, m1.yPercent),
            perspective: _parseVal(v.transformPerspective, m1.perspective)
          };
          dr = v.directionalRotation;

          if (dr != null) {
            if (_typeof(dr) === "object") {
              for (copy in dr) {
                v[copy] = dr[copy];
              }
            } else {
              v.rotation = dr;
            }
          }

          if (typeof v.x === "string" && v.x.indexOf("%") !== -1) {
            m2.x = 0;
            m2.xPercent = _parseVal(v.x, m1.xPercent);
          }

          if (typeof v.y === "string" && v.y.indexOf("%") !== -1) {
            m2.y = 0;
            m2.yPercent = _parseVal(v.y, m1.yPercent);
          }

          m2.rotation = _parseAngle("rotation" in v ? v.rotation : "shortRotation" in v ? v.shortRotation + "_short" : "rotationZ" in v ? v.rotationZ : m1.rotation, m1.rotation, "rotation", endRotations);

          if (_supports3D) {
            m2.rotationX = _parseAngle("rotationX" in v ? v.rotationX : "shortRotationX" in v ? v.shortRotationX + "_short" : m1.rotationX || 0, m1.rotationX, "rotationX", endRotations);
            m2.rotationY = _parseAngle("rotationY" in v ? v.rotationY : "shortRotationY" in v ? v.shortRotationY + "_short" : m1.rotationY || 0, m1.rotationY, "rotationY", endRotations);
          }

          m2.skewX = _parseAngle(v.skewX, m1.skewX);
          m2.skewY = _parseAngle(v.skewY, m1.skewY);
        }

        if (_supports3D && v.force3D != null) {
          m1.force3D = v.force3D;
          hasChange = true;
        }

        has3D = m1.force3D || m1.z || m1.rotationX || m1.rotationY || m2.z || m2.rotationX || m2.rotationY || m2.perspective;

        if (!has3D && v.scale != null) {
          m2.scaleZ = 1; //no need to tween scaleZ.
        }

        while (--i > -1) {
          p = _transformProps[i];
          orig = m2[p] - m1[p];

          if (orig > min || orig < -min || v[p] != null || _forcePT[p] != null) {
            hasChange = true;
            pt = new CSSPropTween(m1, p, m1[p], orig, pt);

            if (p in endRotations) {
              pt.e = endRotations[p]; //directional rotations typically have compensated values during the tween, but we need to make sure they end at exactly what the user requested
            }

            pt.xs0 = 0; //ensures the value stays numeric in setRatio()

            pt.plugin = plugin;

            cssp._overwriteProps.push(pt.n);
          }
        }

        orig = v.transformOrigin;

        if (m1.svg && (orig || v.svgOrigin)) {
          x = m1.xOffset; //when we change the origin, in order to prevent things from jumping we adjust the x/y so we must record those here so that we can create PropTweens for them and flip them at the same time as the origin

          y = m1.yOffset;

          _parseSVGOrigin(t, _parsePosition(orig), m2, v.svgOrigin, v.smoothOrigin);

          pt = _addNonTweeningNumericPT(m1, "xOrigin", (originalGSTransform ? m1 : m2).xOrigin, m2.xOrigin, pt, transformOriginString); //note: if there wasn't a transformOrigin defined yet, just start with the destination one; it's wasteful otherwise, and it causes problems with fromTo() tweens. For example, TweenLite.to("#wheel", 3, {rotation:180, transformOrigin:"50% 50%", delay:1}); TweenLite.fromTo("#wheel", 3, {scale:0.5, transformOrigin:"50% 50%"}, {scale:1, delay:2}); would cause a jump when the from values revert at the beginning of the 2nd tween.

          pt = _addNonTweeningNumericPT(m1, "yOrigin", (originalGSTransform ? m1 : m2).yOrigin, m2.yOrigin, pt, transformOriginString);

          if (x !== m1.xOffset || y !== m1.yOffset) {
            pt = _addNonTweeningNumericPT(m1, "xOffset", originalGSTransform ? x : m1.xOffset, m1.xOffset, pt, transformOriginString);
            pt = _addNonTweeningNumericPT(m1, "yOffset", originalGSTransform ? y : m1.yOffset, m1.yOffset, pt, transformOriginString);
          }

          orig = "0px 0px"; //certain browsers (like firefox) completely botch transform-origin, so we must remove it to prevent it from contaminating transforms. We manage it ourselves with xOrigin and yOrigin
        }

        if (orig || _supports3D && has3D && m1.zOrigin) {
          //if anything 3D is happening and there's a transformOrigin with a z component that's non-zero, we must ensure that the transformOrigin's z-component is set to 0 so that we can manually do those calculations to get around Safari bugs. Even if the user didn't specifically define a "transformOrigin" in this particular tween (maybe they did it via css directly).
          if (_transformProp) {
            hasChange = true;
            p = _transformOriginProp;
            orig = (orig || _getStyle(t, p, _cs, false, "50% 50%")) + ""; //cast as string to avoid errors

            pt = new CSSPropTween(style, p, 0, 0, pt, -1, transformOriginString);
            pt.b = style[p];
            pt.plugin = plugin;

            if (_supports3D) {
              copy = m1.zOrigin;
              orig = orig.split(" ");
              m1.zOrigin = (orig.length > 2 && !(copy !== 0 && orig[2] === "0px") ? parseFloat(orig[2]) : copy) || 0; //Safari doesn't handle the z part of transformOrigin correctly, so we'll manually handle it in the _set3DTransformRatio() method.

              pt.xs0 = pt.e = orig[0] + " " + (orig[1] || "50%") + " 0px"; //we must define a z value of 0px specifically otherwise iOS 5 Safari will stick with the old one (if one was defined)!

              pt = new CSSPropTween(m1, "zOrigin", 0, 0, pt, -1, pt.n); //we must create a CSSPropTween for the _gsTransform.zOrigin so that it gets reset properly at the beginning if the tween runs backward (as opposed to just setting m1.zOrigin here)

              pt.b = copy;
              pt.xs0 = pt.e = m1.zOrigin;
            } else {
              pt.xs0 = pt.e = orig;
            } //for older versions of IE (6-8), we need to manually calculate things inside the setRatio() function. We record origin x and y (ox and oy) and whether or not the values are percentages (oxp and oyp).

          } else {
            _parsePosition(orig + "", m1);
          }
        }

        if (hasChange) {
          cssp._transformType = !(m1.svg && _useSVGTransformAttr) && (has3D || this._transformType === 3) ? 3 : 2; //quicker than calling cssp._enableTransforms();
        }

        if (swapFunc) {
          vars[parsingProp] = swapFunc;
        }

        if (scaleFunc) {
          vars.scale = scaleFunc;
        }

        return pt;
      },
      prefix: true
    });

    _registerComplexSpecialProp("boxShadow", {
      defaultValue: "0px 0px 0px 0px #999",
      prefix: true,
      color: true,
      multi: true,
      keyword: "inset"
    });

    _registerComplexSpecialProp("borderRadius", {
      defaultValue: "0px",
      parser: function parser(t, e, p, cssp, pt, plugin) {
        e = this.format(e);
        var props = ["borderTopLeftRadius", "borderTopRightRadius", "borderBottomRightRadius", "borderBottomLeftRadius"],
            style = t.style,
            ea1,
            i,
            es2,
            bs2,
            bs,
            es,
            bn,
            en,
            w,
            h,
            esfx,
            bsfx,
            rel,
            hn,
            vn,
            em;
        w = parseFloat(t.offsetWidth);
        h = parseFloat(t.offsetHeight);
        ea1 = e.split(" ");

        for (i = 0; i < props.length; i++) {
          //if we're dealing with percentages, we must convert things separately for the horizontal and vertical axis!
          if (this.p.indexOf("border")) {
            //older browsers used a prefix
            props[i] = _checkPropPrefix(props[i]);
          }

          bs = bs2 = _getStyle(t, props[i], _cs, false, "0px");

          if (bs.indexOf(" ") !== -1) {
            bs2 = bs.split(" ");
            bs = bs2[0];
            bs2 = bs2[1];
          }

          es = es2 = ea1[i];
          bn = parseFloat(bs);
          bsfx = bs.substr((bn + "").length);
          rel = es.charAt(1) === "=";

          if (rel) {
            en = parseInt(es.charAt(0) + "1", 10);
            es = es.substr(2);
            en *= parseFloat(es);
            esfx = es.substr((en + "").length - (en < 0 ? 1 : 0)) || "";
          } else {
            en = parseFloat(es);
            esfx = es.substr((en + "").length);
          }

          if (esfx === "") {
            esfx = _suffixMap[p] || bsfx;
          }

          if (esfx !== bsfx) {
            hn = _convertToPixels(t, "borderLeft", bn, bsfx); //horizontal number (we use a bogus "borderLeft" property just because the _convertToPixels() method searches for the keywords "Left", "Right", "Top", and "Bottom" to determine of it's a horizontal or vertical property, and we need "border" in the name so that it knows it should measure relative to the element itself, not its parent.

            vn = _convertToPixels(t, "borderTop", bn, bsfx); //vertical number

            if (esfx === "%") {
              bs = hn / w * 100 + "%";
              bs2 = vn / h * 100 + "%";
            } else if (esfx === "em") {
              em = _convertToPixels(t, "borderLeft", 1, "em");
              bs = hn / em + "em";
              bs2 = vn / em + "em";
            } else {
              bs = hn + "px";
              bs2 = vn + "px";
            }

            if (rel) {
              es = parseFloat(bs) + en + esfx;
              es2 = parseFloat(bs2) + en + esfx;
            }
          }

          pt = _parseComplex(style, props[i], bs + " " + bs2, es + " " + es2, false, "0px", pt);
        }

        return pt;
      },
      prefix: true,
      formatter: _getFormatter("0px 0px 0px 0px", false, true)
    });

    _registerComplexSpecialProp("borderBottomLeftRadius,borderBottomRightRadius,borderTopLeftRadius,borderTopRightRadius", {
      defaultValue: "0px",
      parser: function parser(t, e, p, cssp, pt, plugin) {
        return _parseComplex(t.style, p, this.format(_getStyle(t, p, _cs, false, "0px 0px")), this.format(e), false, "0px", pt);
      },
      prefix: true,
      formatter: _getFormatter("0px 0px", false, true)
    });

    _registerComplexSpecialProp("backgroundPosition", {
      defaultValue: "0 0",
      parser: function parser(t, e, p, cssp, pt, plugin) {
        var bp = "background-position",
            cs = _cs || _getComputedStyle(t, null),
            bs = this.format((cs ? _ieVers ? cs.getPropertyValue(bp + "-x") + " " + cs.getPropertyValue(bp + "-y") : cs.getPropertyValue(bp) : t.currentStyle.backgroundPositionX + " " + t.currentStyle.backgroundPositionY) || "0 0"),
            //Internet Explorer doesn't report background-position correctly - we must query background-position-x and background-position-y and combine them (even in IE10). Before IE9, we must do the same with the currentStyle object and use camelCase
        es = this.format(e),
            ba,
            ea,
            i,
            pct,
            overlap,
            src;

        if (bs.indexOf("%") !== -1 !== (es.indexOf("%") !== -1) && es.split(",").length < 2) {
          src = _getStyle(t, "backgroundImage").replace(_urlExp, "");

          if (src && src !== "none") {
            ba = bs.split(" ");
            ea = es.split(" ");

            _tempImg.setAttribute("src", src); //set the temp IMG's src to the background-image so that we can measure its width/height


            i = 2;

            while (--i > -1) {
              bs = ba[i];
              pct = bs.indexOf("%") !== -1;

              if (pct !== (ea[i].indexOf("%") !== -1)) {
                overlap = i === 0 ? t.offsetWidth - _tempImg.width : t.offsetHeight - _tempImg.height;
                ba[i] = pct ? parseFloat(bs) / 100 * overlap + "px" : parseFloat(bs) / overlap * 100 + "%";
              }
            }

            bs = ba.join(" ");
          }
        }

        return this.parseComplex(t.style, bs, es, pt, plugin);
      },
      formatter: _parsePosition
    });

    _registerComplexSpecialProp("backgroundSize", {
      defaultValue: "0 0",
      formatter: function formatter(v) {
        v += ""; //ensure it's a string

        return _parsePosition(v.indexOf(" ") === -1 ? v + " " + v : v); //if set to something like "100% 100%", Safari typically reports the computed style as just "100%" (no 2nd value), but we should ensure that there are two values, so copy the first one. Otherwise, it'd be interpreted as "100% 0" (wrong).
      }
    });

    _registerComplexSpecialProp("perspective", {
      defaultValue: "0px",
      prefix: true
    });

    _registerComplexSpecialProp("perspectiveOrigin", {
      defaultValue: "50% 50%",
      prefix: true
    });

    _registerComplexSpecialProp("transformStyle", {
      prefix: true
    });

    _registerComplexSpecialProp("backfaceVisibility", {
      prefix: true
    });

    _registerComplexSpecialProp("userSelect", {
      prefix: true
    });

    _registerComplexSpecialProp("margin", {
      parser: _getEdgeParser("marginTop,marginRight,marginBottom,marginLeft")
    });

    _registerComplexSpecialProp("padding", {
      parser: _getEdgeParser("paddingTop,paddingRight,paddingBottom,paddingLeft")
    });

    _registerComplexSpecialProp("clip", {
      defaultValue: "rect(0px,0px,0px,0px)",
      parser: function parser(t, e, p, cssp, pt, plugin) {
        var b, cs, delim;

        if (_ieVers < 9) {
          //IE8 and earlier don't report a "clip" value in the currentStyle - instead, the values are split apart into clipTop, clipRight, clipBottom, and clipLeft. Also, in IE7 and earlier, the values inside rect() are space-delimited, not comma-delimited.
          cs = t.currentStyle;
          delim = _ieVers < 8 ? " " : ",";
          b = "rect(" + cs.clipTop + delim + cs.clipRight + delim + cs.clipBottom + delim + cs.clipLeft + ")";
          e = this.format(e).split(",").join(delim);
        } else {
          b = this.format(_getStyle(t, this.p, _cs, false, this.dflt));
          e = this.format(e);
        }

        return this.parseComplex(t.style, b, e, pt, plugin);
      }
    });

    _registerComplexSpecialProp("textShadow", {
      defaultValue: "0px 0px 0px #999",
      color: true,
      multi: true
    });

    _registerComplexSpecialProp("autoRound,strictUnits", {
      parser: function parser(t, e, p, cssp, pt) {
        return pt;
      }
    }); //just so that we can ignore these properties (not tween them)


    _registerComplexSpecialProp("border", {
      defaultValue: "0px solid #000",
      parser: function parser(t, e, p, cssp, pt, plugin) {
        var bw = _getStyle(t, "borderTopWidth", _cs, false, "0px"),
            end = this.format(e).split(" "),
            esfx = end[0].replace(_suffixExp, "");

        if (esfx !== "px") {
          //if we're animating to a non-px value, we need to convert the beginning width to that unit.
          bw = parseFloat(bw) / _convertToPixels(t, "borderTopWidth", 1, esfx) + esfx;
        }

        return this.parseComplex(t.style, this.format(bw + " " + _getStyle(t, "borderTopStyle", _cs, false, "solid") + " " + _getStyle(t, "borderTopColor", _cs, false, "#000")), end.join(" "), pt, plugin);
      },
      color: true,
      formatter: function formatter(v) {
        var a = v.split(" ");
        return a[0] + " " + (a[1] || "solid") + " " + (v.match(_colorExp) || ["#000"])[0];
      }
    });

    _registerComplexSpecialProp("borderWidth", {
      parser: _getEdgeParser("borderTopWidth,borderRightWidth,borderBottomWidth,borderLeftWidth")
    }); //Firefox doesn't pick up on borderWidth set in style sheets (only inline).


    _registerComplexSpecialProp("float,cssFloat,styleFloat", {
      parser: function parser(t, e, p, cssp, pt, plugin) {
        var s = t.style,
            prop = "cssFloat" in s ? "cssFloat" : "styleFloat";
        return new CSSPropTween(s, prop, 0, 0, pt, -1, p, false, 0, s[prop], e);
      }
    }); //opacity-related


    var _setIEOpacityRatio = function _setIEOpacityRatio(v) {
      var t = this.t,
          //refers to the element's style property
      filters = t.filter || _getStyle(this.data, "filter") || "",
          val = this.s + this.c * v | 0,
          skip;

      if (val === 100) {
        //for older versions of IE that need to use a filter to apply opacity, we should remove the filter if opacity hits 1 in order to improve performance, but make sure there isn't a transform (matrix) or gradient in the filters.
        if (filters.indexOf("atrix(") === -1 && filters.indexOf("radient(") === -1 && filters.indexOf("oader(") === -1) {
          t.removeAttribute("filter");
          skip = !_getStyle(this.data, "filter"); //if a class is applied that has an alpha filter, it will take effect (we don't want that), so re-apply our alpha filter in that case. We must first remove it and then check.
        } else {
          t.filter = filters.replace(_alphaFilterExp, "");
          skip = true;
        }
      }

      if (!skip) {
        if (this.xn1) {
          t.filter = filters = filters || "alpha(opacity=" + val + ")"; //works around bug in IE7/8 that prevents changes to "visibility" from being applied properly if the filter is changed to a different alpha on the same frame.
        }

        if (filters.indexOf("pacity") === -1) {
          //only used if browser doesn't support the standard opacity style property (IE 7 and 8). We omit the "O" to avoid case-sensitivity issues
          if (val !== 0 || !this.xn1) {
            //bugs in IE7/8 won't render the filter properly if opacity is ADDED on the same frame/render as "visibility" changes (this.xn1 is 1 if this tween is an "autoAlpha" tween)
            t.filter = filters + " alpha(opacity=" + val + ")"; //we round the value because otherwise, bugs in IE7/8 can prevent "visibility" changes from being applied properly.
          }
        } else {
          t.filter = filters.replace(_opacityExp, "opacity=" + val);
        }
      }
    };

    _registerComplexSpecialProp("opacity,alpha,autoAlpha", {
      defaultValue: "1",
      parser: function parser(t, e, p, cssp, pt, plugin) {
        var b = parseFloat(_getStyle(t, "opacity", _cs, false, "1")),
            style = t.style,
            isAutoAlpha = p === "autoAlpha";

        if (typeof e === "string" && e.charAt(1) === "=") {
          e = (e.charAt(0) === "-" ? -1 : 1) * parseFloat(e.substr(2)) + b;
        }

        if (isAutoAlpha && b === 1 && _getStyle(t, "visibility", _cs) === "hidden" && e !== 0) {
          //if visibility is initially set to "hidden", we should interpret that as intent to make opacity 0 (a convenience)
          b = 0;
        }

        if (_supportsOpacity) {
          pt = new CSSPropTween(style, "opacity", b, e - b, pt);
        } else {
          pt = new CSSPropTween(style, "opacity", b * 100, (e - b) * 100, pt);
          pt.xn1 = isAutoAlpha ? 1 : 0; //we need to record whether or not this is an autoAlpha so that in the setRatio(), we know to duplicate the setting of the alpha in order to work around a bug in IE7 and IE8 that prevents changes to "visibility" from taking effect if the filter is changed to a different alpha(opacity) at the same time. Setting it to the SAME value first, then the new value works around the IE7/8 bug.

          style.zoom = 1; //helps correct an IE issue.

          pt.type = 2;
          pt.b = "alpha(opacity=" + pt.s + ")";
          pt.e = "alpha(opacity=" + (pt.s + pt.c) + ")";
          pt.data = t;
          pt.plugin = plugin;
          pt.setRatio = _setIEOpacityRatio;
        }

        if (isAutoAlpha) {
          //we have to create the "visibility" PropTween after the opacity one in the linked list so that they run in the order that works properly in IE8 and earlier
          pt = new CSSPropTween(style, "visibility", 0, 0, pt, -1, null, false, 0, b !== 0 ? "inherit" : "hidden", e === 0 ? "hidden" : "inherit");
          pt.xs0 = "inherit";

          cssp._overwriteProps.push(pt.n);

          cssp._overwriteProps.push(p);
        }

        return pt;
      }
    });

    var _removeProp = function _removeProp(s, p) {
      if (p) {
        if (s.removeProperty) {
          if (p.substr(0, 2) === "ms" || p.substr(0, 6) === "webkit") {
            //Microsoft and some Webkit browsers don't conform to the standard of capitalizing the first prefix character, so we adjust so that when we prefix the caps with a dash, it's correct (otherwise it'd be "ms-transform" instead of "-ms-transform" for IE9, for example)
            p = "-" + p;
          }

          s.removeProperty(p.replace(_capsExp, "-$1").toLowerCase());
        } else {
          //note: old versions of IE use "removeAttribute()" instead of "removeProperty()"
          s.removeAttribute(p);
        }
      }
    },
        _setClassNameRatio = function _setClassNameRatio(v) {
      this.t._gsClassPT = this;

      if (v === 1 || v === 0) {
        this.t.setAttribute("class", v === 0 ? this.b : this.e);
        var mpt = this.data,
            //first MiniPropTween
        s = this.t.style;

        while (mpt) {
          if (!mpt.v) {
            _removeProp(s, mpt.p);
          } else {
            s[mpt.p] = mpt.v;
          }

          mpt = mpt._next;
        }

        if (v === 1 && this.t._gsClassPT === this) {
          this.t._gsClassPT = null;
        }
      } else if (this.t.getAttribute("class") !== this.e) {
        this.t.setAttribute("class", this.e);
      }
    };

    _registerComplexSpecialProp("className", {
      parser: function parser(t, e, p, cssp, pt, plugin, vars) {
        var b = t.getAttribute("class") || "",
            //don't use t.className because it doesn't work consistently on SVG elements; getAttribute("class") and setAttribute("class", value") is more reliable.
        cssText = t.style.cssText,
            difData,
            bs,
            cnpt,
            cnptLookup,
            mpt;
        pt = cssp._classNamePT = new CSSPropTween(t, p, 0, 0, pt, 2);
        pt.setRatio = _setClassNameRatio;
        pt.pr = -11;
        _hasPriority = true;
        pt.b = b;
        bs = _getAllStyles(t, _cs); //if there's a className tween already operating on the target, force it to its end so that the necessary inline styles are removed and the class name is applied before we determine the end state (we don't want inline styles interfering that were there just for class-specific values)

        cnpt = t._gsClassPT;

        if (cnpt) {
          cnptLookup = {};
          mpt = cnpt.data; //first MiniPropTween which stores the inline styles - we need to force these so that the inline styles don't contaminate things. Otherwise, there's a small chance that a tween could start and the inline values match the destination values and they never get cleaned.

          while (mpt) {
            cnptLookup[mpt.p] = 1;
            mpt = mpt._next;
          }

          cnpt.setRatio(1);
        }

        t._gsClassPT = pt;
        pt.e = e.charAt(1) !== "=" ? e : b.replace(new RegExp("(?:\\s|^)" + e.substr(2) + "(?![\\w-])"), "") + (e.charAt(0) === "+" ? " " + e.substr(2) : "");
        t.setAttribute("class", pt.e);
        difData = _cssDif(t, bs, _getAllStyles(t), vars, cnptLookup);
        t.setAttribute("class", b);
        pt.data = difData.firstMPT;
        t.style.cssText = cssText; //we recorded cssText before we swapped classes and ran _getAllStyles() because in cases when a className tween is overwritten, we remove all the related tweening properties from that class change (otherwise class-specific stuff can't override properties we've directly set on the target's style object due to specificity).

        pt = pt.xfirst = cssp.parse(t, difData.difs, pt, plugin); //we record the CSSPropTween as the xfirst so that we can handle overwriting propertly (if "className" gets overwritten, we must kill all the properties associated with the className part of the tween, so we can loop through from xfirst to the pt itself)

        return pt;
      }
    });

    var _setClearPropsRatio = function _setClearPropsRatio(v) {
      if (v === 1 || v === 0) if (this.data._totalTime === this.data._totalDuration && this.data.data !== "isFromStart") {
        //this.data refers to the tween. Only clear at the END of the tween (remember, from() tweens make the ratio go from 1 to 0, so we can't just check that and if the tween is the zero-duration one that's created internally to render the starting values in a from() tween, ignore that because otherwise, for example, from(...{height:100, clearProps:"height", delay:1}) would wipe the height at the beginning of the tween and after 1 second, it'd kick back in).
        var s = this.t.style,
            transformParse = _specialProps.transform.parse,
            a,
            p,
            i,
            clearTransform,
            transform;

        if (this.e === "all") {
          s.cssText = "";
          clearTransform = true;
        } else {
          a = this.e.split(" ").join("").split(",");
          i = a.length;

          while (--i > -1) {
            p = a[i];

            if (_specialProps[p]) {
              if (_specialProps[p].parse === transformParse) {
                clearTransform = true;
              } else {
                p = p === "transformOrigin" ? _transformOriginProp : _specialProps[p].p; //ensures that special properties use the proper browser-specific property name, like "scaleX" might be "-webkit-transform" or "boxShadow" might be "-moz-box-shadow"
              }
            }

            _removeProp(s, p);
          }
        }

        if (clearTransform) {
          _removeProp(s, _transformProp);

          transform = this.t._gsTransform;

          if (transform) {
            if (transform.svg) {
              this.t.removeAttribute("data-svg-origin");
              this.t.removeAttribute("transform");
            }

            delete this.t._gsTransform;
          }
        }
      }
    };

    _registerComplexSpecialProp("clearProps", {
      parser: function parser(t, e, p, cssp, pt) {
        pt = new CSSPropTween(t, p, 0, 0, pt, 2);
        pt.setRatio = _setClearPropsRatio;
        pt.e = e;
        pt.pr = -10;
        pt.data = cssp._tween;
        _hasPriority = true;
        return pt;
      }
    });

    p = "bezier,throwProps,physicsProps,physics2D".split(",");
    i = p.length;

    while (i--) {
      _registerPluginProp(p[i]);
    }

    p = CSSPlugin.prototype;
    p._firstPT = p._lastParsedTransform = p._transform = null; //gets called when the tween renders for the first time. This kicks everything off, recording start/end values, etc.

    p._onInitTween = function (target, vars, tween, index) {
      if (!target.nodeType) {
        //css is only for dom elements
        return false;
      }

      this._target = _target = target;
      this._tween = tween;
      this._vars = vars;
      _index = index;
      _autoRound = vars.autoRound;
      _hasPriority = false;
      _suffixMap = vars.suffixMap || CSSPlugin.suffixMap;
      _cs = _getComputedStyle(target, "");
      _overwriteProps = this._overwriteProps;
      var style = target.style,
          v,
          pt,
          pt2,
          first,
          last,
          next,
          zIndex,
          tpt,
          threeD;
      if (_reqSafariFix) if (style.zIndex === "") {
        v = _getStyle(target, "zIndex", _cs);

        if (v === "auto" || v === "") {
          //corrects a bug in [non-Android] Safari that prevents it from repainting elements in their new positions if they don't have a zIndex set. We also can't just apply this inside _parseTransform() because anything that's moved in any way (like using "left" or "top" instead of transforms like "x" and "y") can be affected, so it is best to ensure that anything that's tweening has a z-index. Setting "WebkitPerspective" to a non-zero value worked too except that on iOS Safari things would flicker randomly. Plus zIndex is less memory-intensive.
          this._addLazySet(style, "zIndex", 0);
        }
      }

      if (typeof vars === "string") {
        first = style.cssText;
        v = _getAllStyles(target, _cs);
        style.cssText = first + ";" + vars;
        v = _cssDif(target, v, _getAllStyles(target)).difs;

        if (!_supportsOpacity && _opacityValExp.test(vars)) {
          v.opacity = parseFloat(RegExp.$1);
        }

        vars = v;
        style.cssText = first;
      }

      if (vars.className) {
        //className tweens will combine any differences they find in the css with the vars that are passed in, so {className:"myClass", scale:0.5, left:20} would work.
        this._firstPT = pt = _specialProps.className.parse(target, vars.className, "className", this, null, null, vars);
      } else {
        this._firstPT = pt = this.parse(target, vars, null);
      }

      if (this._transformType) {
        threeD = this._transformType === 3;

        if (!_transformProp) {
          style.zoom = 1; //helps correct an IE issue.
        } else if (_isSafari) {
          _reqSafariFix = true; //if zIndex isn't set, iOS Safari doesn't repaint things correctly sometimes (seemingly at random).

          if (style.zIndex === "") {
            zIndex = _getStyle(target, "zIndex", _cs);

            if (zIndex === "auto" || zIndex === "") {
              this._addLazySet(style, "zIndex", 0);
            }
          } //Setting WebkitBackfaceVisibility corrects 3 bugs:
          // 1) [non-Android] Safari skips rendering changes to "top" and "left" that are made on the same frame/render as a transform update.
          // 2) iOS Safari sometimes neglects to repaint elements in their new positions. Setting "WebkitPerspective" to a non-zero value worked too except that on iOS Safari things would flicker randomly.
          // 3) Safari sometimes displayed odd artifacts when tweening the transform (or WebkitTransform) property, like ghosts of the edges of the element remained. Definitely a browser bug.
          //Note: we allow the user to override the auto-setting by defining WebkitBackfaceVisibility in the vars of the tween.


          if (_isSafariLT6) {
            this._addLazySet(style, "WebkitBackfaceVisibility", this._vars.WebkitBackfaceVisibility || (threeD ? "visible" : "hidden"));
          }
        }

        pt2 = pt;

        while (pt2 && pt2._next) {
          pt2 = pt2._next;
        }

        tpt = new CSSPropTween(target, "transform", 0, 0, null, 2);

        this._linkCSSP(tpt, null, pt2);

        tpt.setRatio = _transformProp ? _setTransformRatio : _setIETransformRatio;
        tpt.data = this._transform || _getTransform(target, _cs, true);
        tpt.tween = tween;
        tpt.pr = -1; //ensures that the transforms get applied after the components are updated.

        _overwriteProps.pop(); //we don't want to force the overwrite of all "transform" tweens of the target - we only care about individual transform properties like scaleX, rotation, etc. The CSSPropTween constructor automatically adds the property to _overwriteProps which is why we need to pop() here.

      }

      if (_hasPriority) {
        //reorders the linked list in order of pr (priority)
        while (pt) {
          next = pt._next;
          pt2 = first;

          while (pt2 && pt2.pr > pt.pr) {
            pt2 = pt2._next;
          }

          if (pt._prev = pt2 ? pt2._prev : last) {
            pt._prev._next = pt;
          } else {
            first = pt;
          }

          if (pt._next = pt2) {
            pt2._prev = pt;
          } else {
            last = pt;
          }

          pt = next;
        }

        this._firstPT = first;
      }

      return true;
    };

    p.parse = function (target, vars, pt, plugin) {
      var style = target.style,
          p,
          sp,
          bn,
          en,
          bs,
          es,
          bsfx,
          esfx,
          isStr,
          rel;

      for (p in vars) {
        es = vars[p]; //ending value string

        if (typeof es === "function") {
          es = es(_index, _target);
        }

        sp = _specialProps[p]; //SpecialProp lookup.

        if (sp) {
          pt = sp.parse(target, es, p, this, pt, plugin, vars);
        } else if (p.substr(0, 2) === "--") {
          //for tweening CSS variables (which always start with "--"). To maximize performance and simplicity, we bypass CSSPlugin altogether and just add a normal property tween to the tween instance itself.
          this._tween._propLookup[p] = this._addTween.call(this._tween, target.style, "setProperty", _getComputedStyle(target).getPropertyValue(p) + "", es + "", p, false, p);
          continue;
        } else {
          bs = _getStyle(target, p, _cs) + "";
          isStr = typeof es === "string";

          if (p === "color" || p === "fill" || p === "stroke" || p.indexOf("Color") !== -1 || isStr && _rgbhslExp.test(es)) {
            //Opera uses background: to define color sometimes in addition to backgroundColor:
            if (!isStr) {
              es = _parseColor(es);
              es = (es.length > 3 ? "rgba(" : "rgb(") + es.join(",") + ")";
            }

            pt = _parseComplex(style, p, bs, es, true, "transparent", pt, 0, plugin);
          } else if (isStr && _complexExp.test(es)) {
            pt = _parseComplex(style, p, bs, es, true, null, pt, 0, plugin);
          } else {
            bn = parseFloat(bs);
            bsfx = bn || bn === 0 ? bs.substr((bn + "").length) : ""; //remember, bs could be non-numeric like "normal" for fontWeight, so we should default to a blank suffix in that case.

            if (bs === "" || bs === "auto") {
              if (p === "width" || p === "height") {
                bn = _getDimension(target, p, _cs);
                bsfx = "px";
              } else if (p === "left" || p === "top") {
                bn = _calculateOffset(target, p, _cs);
                bsfx = "px";
              } else {
                bn = p !== "opacity" ? 0 : 1;
                bsfx = "";
              }
            }

            rel = isStr && es.charAt(1) === "=";

            if (rel) {
              en = parseInt(es.charAt(0) + "1", 10);
              es = es.substr(2);
              en *= parseFloat(es);
              esfx = es.replace(_suffixExp, "");
            } else {
              en = parseFloat(es);
              esfx = isStr ? es.replace(_suffixExp, "") : "";
            }

            if (esfx === "") {
              esfx = p in _suffixMap ? _suffixMap[p] : bsfx; //populate the end suffix, prioritizing the map, then if none is found, use the beginning suffix.
            }

            es = en || en === 0 ? (rel ? en + bn : en) + esfx : vars[p]; //ensures that any += or -= prefixes are taken care of. Record the end value before normalizing the suffix because we always want to end the tween on exactly what they intended even if it doesn't match the beginning value's suffix.
            //if the beginning/ending suffixes don't match, normalize them...

            if (bsfx !== esfx) if (esfx !== "" || p === "lineHeight") if (en || en === 0) if (bn) {
              //note: if the beginning value (bn) is 0, we don't need to convert units!
              bn = _convertToPixels(target, p, bn, bsfx);

              if (esfx === "%") {
                bn /= _convertToPixels(target, p, 100, "%") / 100;

                if (vars.strictUnits !== true) {
                  //some browsers report only "px" values instead of allowing "%" with getComputedStyle(), so we assume that if we're tweening to a %, we should start there too unless strictUnits:true is defined. This approach is particularly useful for responsive designs that use from() tweens.
                  bs = bn + "%";
                }
              } else if (esfx === "em" || esfx === "rem" || esfx === "vw" || esfx === "vh") {
                bn /= _convertToPixels(target, p, 1, esfx); //otherwise convert to pixels.
              } else if (esfx !== "px") {
                en = _convertToPixels(target, p, en, esfx);
                esfx = "px"; //we don't use bsfx after this, so we don't need to set it to px too.
              }

              if (rel) if (en || en === 0) {
                es = en + bn + esfx; //the changes we made affect relative calculations, so adjust the end value here.
              }
            }

            if (rel) {
              en += bn;
            }

            if ((bn || bn === 0) && (en || en === 0)) {
              //faster than isNaN(). Also, previously we required en !== bn but that doesn't really gain much performance and it prevents _parseToProxy() from working properly if beginning and ending values match but need to get tweened by an external plugin anyway. For example, a bezier tween where the target starts at left:0 and has these points: [{left:50},{left:0}] wouldn't work properly because when parsing the last point, it'd match the first (current) one and a non-tweening CSSPropTween would be recorded when we actually need a normal tween (type:0) so that things get updated during the tween properly.
              pt = new CSSPropTween(style, p, bn, en - bn, pt, 0, p, _autoRound !== false && (esfx === "px" || p === "zIndex"), 0, bs, es);
              pt.xs0 = esfx; //DEBUG: _log("tween "+p+" from "+pt.b+" ("+bn+esfx+") to "+pt.e+" with suffix: "+pt.xs0);
            } else if (style[p] === undefined || !es && (es + "" === "NaN" || es == null)) {
              _log("invalid " + p + " tween value: " + vars[p]);
            } else {
              pt = new CSSPropTween(style, p, en || bn || 0, 0, pt, -1, p, false, 0, bs, es);
              pt.xs0 = es === "none" && (p === "display" || p.indexOf("Style") !== -1) ? bs : es; //intermediate value should typically be set immediately (end value) except for "display" or things like borderTopStyle, borderBottomStyle, etc. which should use the beginning value during the tween.
              //DEBUG: _log("non-tweening value "+p+": "+pt.xs0);
            }
          }
        }

        if (plugin) if (pt && !pt.plugin) {
          pt.plugin = plugin;
        }
      }

      return pt;
    }; //gets called every time the tween updates, passing the new ratio (typically a value between 0 and 1, but not always (for example, if an Elastic.easeOut is used, the value can jump above 1 mid-tween). It will always start and 0 and end at 1.


    p.setRatio = function (v) {
      var pt = this._firstPT,
          min = 0.000001,
          val,
          str,
          i; //at the end of the tween, we set the values to exactly what we received in order to make sure non-tweening values (like "position" or "float" or whatever) are set and so that if the beginning/ending suffixes (units) didn't match and we normalized to px, the value that the user passed in is used here. We check to see if the tween is at its beginning in case it's a from() tween in which case the ratio will actually go from 1 to 0 over the course of the tween (backwards).

      if (v === 1 && (this._tween._time === this._tween._duration || this._tween._time === 0)) {
        while (pt) {
          if (pt.type !== 2) {
            if (pt.r && pt.type !== -1) {
              val = Math.round(pt.s + pt.c);

              if (!pt.type) {
                pt.t[pt.p] = val + pt.xs0;
              } else if (pt.type === 1) {
                //complex value (one that typically has multiple numbers inside a string, like "rect(5px,10px,20px,25px)"
                i = pt.l;
                str = pt.xs0 + val + pt.xs1;

                for (i = 1; i < pt.l; i++) {
                  str += pt["xn" + i] + pt["xs" + (i + 1)];
                }

                pt.t[pt.p] = str;
              }
            } else {
              pt.t[pt.p] = pt.e;
            }
          } else {
            pt.setRatio(v);
          }

          pt = pt._next;
        }
      } else if (v || !(this._tween._time === this._tween._duration || this._tween._time === 0) || this._tween._rawPrevTime === -0.000001) {
        while (pt) {
          val = pt.c * v + pt.s;

          if (pt.r) {
            val = Math.round(val);
          } else if (val < min) if (val > -min) {
            val = 0;
          }

          if (!pt.type) {
            pt.t[pt.p] = val + pt.xs0;
          } else if (pt.type === 1) {
            //complex value (one that typically has multiple numbers inside a string, like "rect(5px,10px,20px,25px)"
            i = pt.l;

            if (i === 2) {
              pt.t[pt.p] = pt.xs0 + val + pt.xs1 + pt.xn1 + pt.xs2;
            } else if (i === 3) {
              pt.t[pt.p] = pt.xs0 + val + pt.xs1 + pt.xn1 + pt.xs2 + pt.xn2 + pt.xs3;
            } else if (i === 4) {
              pt.t[pt.p] = pt.xs0 + val + pt.xs1 + pt.xn1 + pt.xs2 + pt.xn2 + pt.xs3 + pt.xn3 + pt.xs4;
            } else if (i === 5) {
              pt.t[pt.p] = pt.xs0 + val + pt.xs1 + pt.xn1 + pt.xs2 + pt.xn2 + pt.xs3 + pt.xn3 + pt.xs4 + pt.xn4 + pt.xs5;
            } else {
              str = pt.xs0 + val + pt.xs1;

              for (i = 1; i < pt.l; i++) {
                str += pt["xn" + i] + pt["xs" + (i + 1)];
              }

              pt.t[pt.p] = str;
            }
          } else if (pt.type === -1) {
            //non-tweening value
            pt.t[pt.p] = pt.xs0;
          } else if (pt.setRatio) {
            //custom setRatio() for things like SpecialProps, external plugins, etc.
            pt.setRatio(v);
          }

          pt = pt._next;
        } //if the tween is reversed all the way back to the beginning, we need to restore the original values which may have different units (like % instead of px or em or whatever).

      } else {
        while (pt) {
          if (pt.type !== 2) {
            pt.t[pt.p] = pt.b;
          } else {
            pt.setRatio(v);
          }

          pt = pt._next;
        }
      }
    };
    /**
     * @private
     * Forces rendering of the target's transforms (rotation, scale, etc.) whenever the CSSPlugin's setRatio() is called.
     * Basically, this tells the CSSPlugin to create a CSSPropTween (type 2) after instantiation that runs last in the linked
     * list and calls the appropriate (3D or 2D) rendering function. We separate this into its own method so that we can call
     * it from other plugins like BezierPlugin if, for example, it needs to apply an autoRotation and this CSSPlugin
     * doesn't have any transform-related properties of its own. You can call this method as many times as you
     * want and it won't create duplicate CSSPropTweens.
     *
     * @param {boolean} threeD if true, it should apply 3D tweens (otherwise, just 2D ones are fine and typically faster)
     */


    p._enableTransforms = function (threeD) {
      this._transform = this._transform || _getTransform(this._target, _cs, true); //ensures that the element has a _gsTransform property with the appropriate values.

      this._transformType = !(this._transform.svg && _useSVGTransformAttr) && (threeD || this._transformType === 3) ? 3 : 2;
    };

    var lazySet = function lazySet(v) {
      this.t[this.p] = this.e;

      this.data._linkCSSP(this, this._next, null, true); //we purposefully keep this._next even though it'd make sense to null it, but this is a performance optimization, as this happens during the while (pt) {} loop in setRatio() at the bottom of which it sets pt = pt._next, so if we null it, the linked list will be broken in that loop.

    };
    /** @private Gives us a way to set a value on the first render (and only the first render). **/


    p._addLazySet = function (t, p, v) {
      var pt = this._firstPT = new CSSPropTween(t, p, 0, 0, this._firstPT, 2);
      pt.e = v;
      pt.setRatio = lazySet;
      pt.data = this;
    };
    /** @private **/


    p._linkCSSP = function (pt, next, prev, remove) {
      if (pt) {
        if (next) {
          next._prev = pt;
        }

        if (pt._next) {
          pt._next._prev = pt._prev;
        }

        if (pt._prev) {
          pt._prev._next = pt._next;
        } else if (this._firstPT === pt) {
          this._firstPT = pt._next;
          remove = true; //just to prevent resetting this._firstPT 5 lines down in case pt._next is null. (optimized for speed)
        }

        if (prev) {
          prev._next = pt;
        } else if (!remove && this._firstPT === null) {
          this._firstPT = pt;
        }

        pt._next = next;
        pt._prev = prev;
      }

      return pt;
    };

    p._mod = function (lookup) {
      var pt = this._firstPT;

      while (pt) {
        if (typeof lookup[pt.p] === "function" && lookup[pt.p] === Math.round) {
          //only gets called by RoundPropsPlugin (ModifyPlugin manages all the rendering internally for CSSPlugin properties that need modification). Remember, we handle rounding a bit differently in this plugin for performance reasons, leveraging "r" as an indicator that the value should be rounded internally..
          pt.r = 1;
        }

        pt = pt._next;
      }
    }; //we need to make sure that if alpha or autoAlpha is killed, opacity is too. And autoAlpha affects the "visibility" property.


    p._kill = function (lookup) {
      var copy = lookup,
          pt,
          p,
          xfirst;

      if (lookup.autoAlpha || lookup.alpha) {
        copy = {};

        for (p in lookup) {
          //copy the lookup so that we're not changing the original which may be passed elsewhere.
          copy[p] = lookup[p];
        }

        copy.opacity = 1;

        if (copy.autoAlpha) {
          copy.visibility = 1;
        }
      }

      if (lookup.className && (pt = this._classNamePT)) {
        //for className tweens, we need to kill any associated CSSPropTweens too; a linked list starts at the className's "xfirst".
        xfirst = pt.xfirst;

        if (xfirst && xfirst._prev) {
          this._linkCSSP(xfirst._prev, pt._next, xfirst._prev._prev); //break off the prev

        } else if (xfirst === this._firstPT) {
          this._firstPT = pt._next;
        }

        if (pt._next) {
          this._linkCSSP(pt._next, pt._next._next, xfirst._prev);
        }

        this._classNamePT = null;
      }

      pt = this._firstPT;

      while (pt) {
        if (pt.plugin && pt.plugin !== p && pt.plugin._kill) {
          //for plugins that are registered with CSSPlugin, we should notify them of the kill.
          pt.plugin._kill(lookup);

          p = pt.plugin;
        }

        pt = pt._next;
      }

      return TweenPlugin.prototype._kill.call(this, copy);
    }; //used by cascadeTo() for gathering all the style properties of each child element into an array for comparison.


    var _getChildStyles = function _getChildStyles(e, props, targets) {
      var children, i, child, type;

      if (e.slice) {
        i = e.length;

        while (--i > -1) {
          _getChildStyles(e[i], props, targets);
        }

        return;
      }

      children = e.childNodes;
      i = children.length;

      while (--i > -1) {
        child = children[i];
        type = child.type;

        if (child.style) {
          props.push(_getAllStyles(child));

          if (targets) {
            targets.push(child);
          }
        }

        if ((type === 1 || type === 9 || type === 11) && child.childNodes.length) {
          _getChildStyles(child, props, targets);
        }
      }
    };
    /**
     * Typically only useful for className tweens that may affect child elements, this method creates a TweenLite
     * and then compares the style properties of all the target's child elements at the tween's start and end, and
     * if any are different, it also creates tweens for those and returns an array containing ALL of the resulting
     * tweens (so that you can easily add() them to a TimelineLite, for example). The reason this functionality is
     * wrapped into a separate static method of CSSPlugin instead of being integrated into all regular className tweens
     * is because it creates entirely new tweens that may have completely different targets than the original tween,
     * so if they were all lumped into the original tween instance, it would be inconsistent with the rest of the API
     * and it would create other problems. For example:
     *  - If I create a tween of elementA, that tween instance may suddenly change its target to include 50 other elements (unintuitive if I specifically defined the target I wanted)
     *  - We can't just create new independent tweens because otherwise, what happens if the original/parent tween is reversed or pause or dropped into a TimelineLite for tight control? You'd expect that tween's behavior to affect all the others.
     *  - Analyzing every style property of every child before and after the tween is an expensive operation when there are many children, so this behavior shouldn't be imposed on all className tweens by default, especially since it's probably rare that this extra functionality is needed.
     *
     * @param {Object} target object to be tweened
     * @param {number} Duration in seconds (or frames for frames-based tweens)
     * @param {Object} Object containing the end values, like {className:"newClass", ease:Linear.easeNone}
     * @return {Array} An array of TweenLite instances
     */


    CSSPlugin.cascadeTo = function (target, duration, vars) {
      var tween = TweenLite.to(target, duration, vars),
          results = [tween],
          b = [],
          e = [],
          targets = [],
          _reservedProps = TweenLite._internals.reservedProps,
          i,
          difs,
          p,
          from;
      target = tween._targets || tween.target;

      _getChildStyles(target, b, targets);

      tween.render(duration, true, true);

      _getChildStyles(target, e);

      tween.render(0, true, true);

      tween._enabled(true);

      i = targets.length;

      while (--i > -1) {
        difs = _cssDif(targets[i], b[i], e[i]);

        if (difs.firstMPT) {
          difs = difs.difs;

          for (p in vars) {
            if (_reservedProps[p]) {
              difs[p] = vars[p];
            }
          }

          from = {};

          for (p in difs) {
            from[p] = b[i][p];
          }

          results.push(TweenLite.fromTo(targets[i], duration, from, difs));
        }
      }

      return results;
    };

    TweenPlugin.activate([CSSPlugin]);
    return CSSPlugin;
  }, true);
  /*
   * ----------------------------------------------------------------
   * RoundPropsPlugin
   * ----------------------------------------------------------------
   */


  (function () {
    var RoundPropsPlugin = _gsScope._gsDefine.plugin({
      propName: "roundProps",
      version: "1.6.0",
      priority: -1,
      API: 2,
      //called when the tween renders for the first time. This is where initial values should be recorded and any setup routines should run.
      init: function init(target, value, tween) {
        this._tween = tween;
        return true;
      }
    }),
        _roundLinkedList = function _roundLinkedList(node) {
      while (node) {
        if (!node.f && !node.blob) {
          node.m = Math.round;
        }

        node = node._next;
      }
    },
        p = RoundPropsPlugin.prototype;

    p._onInitAllProps = function () {
      var tween = this._tween,
          rp = tween.vars.roundProps.join ? tween.vars.roundProps : tween.vars.roundProps.split(","),
          i = rp.length,
          lookup = {},
          rpt = tween._propLookup.roundProps,
          prop,
          pt,
          next;

      while (--i > -1) {
        lookup[rp[i]] = Math.round;
      }

      i = rp.length;

      while (--i > -1) {
        prop = rp[i];
        pt = tween._firstPT;

        while (pt) {
          next = pt._next; //record here, because it may get removed

          if (pt.pg) {
            pt.t._mod(lookup);
          } else if (pt.n === prop) {
            if (pt.f === 2 && pt.t) {
              //a blob (text containing multiple numeric values)
              _roundLinkedList(pt.t._firstPT);
            } else {
              this._add(pt.t, prop, pt.s, pt.c); //remove from linked list


              if (next) {
                next._prev = pt._prev;
              }

              if (pt._prev) {
                pt._prev._next = next;
              } else if (tween._firstPT === pt) {
                tween._firstPT = next;
              }

              pt._next = pt._prev = null;
              tween._propLookup[prop] = rpt;
            }
          }

          pt = next;
        }
      }

      return false;
    };

    p._add = function (target, p, s, c) {
      this._addTween(target, p, s, s + c, p, Math.round);

      this._overwriteProps.push(p);
    };
  })();
  /*
   * ----------------------------------------------------------------
   * AttrPlugin
   * ----------------------------------------------------------------
   */


  (function () {
    _gsScope._gsDefine.plugin({
      propName: "attr",
      API: 2,
      version: "0.6.1",
      //called when the tween renders for the first time. This is where initial values should be recorded and any setup routines should run.
      init: function init(target, value, tween, index) {
        var p, end;

        if (typeof target.setAttribute !== "function") {
          return false;
        }

        for (p in value) {
          end = value[p];

          if (typeof end === "function") {
            end = end(index, target);
          }

          this._addTween(target, "setAttribute", target.getAttribute(p) + "", end + "", p, false, p);

          this._overwriteProps.push(p);
        }

        return true;
      }
    });
  })();
  /*
   * ----------------------------------------------------------------
   * DirectionalRotationPlugin
   * ----------------------------------------------------------------
   */


  _gsScope._gsDefine.plugin({
    propName: "directionalRotation",
    version: "0.3.1",
    API: 2,
    //called when the tween renders for the first time. This is where initial values should be recorded and any setup routines should run.
    init: function init(target, value, tween, index) {
      if (_typeof(value) !== "object") {
        value = {
          rotation: value
        };
      }

      this.finals = {};
      var cap = value.useRadians === true ? Math.PI * 2 : 360,
          min = 0.000001,
          p,
          v,
          start,
          end,
          dif,
          split;

      for (p in value) {
        if (p !== "useRadians") {
          end = value[p];

          if (typeof end === "function") {
            end = end(index, target);
          }

          split = (end + "").split("_");
          v = split[0];
          start = parseFloat(typeof target[p] !== "function" ? target[p] : target[p.indexOf("set") || typeof target["get" + p.substr(3)] !== "function" ? p : "get" + p.substr(3)]());
          end = this.finals[p] = typeof v === "string" && v.charAt(1) === "=" ? start + parseInt(v.charAt(0) + "1", 10) * Number(v.substr(2)) : Number(v) || 0;
          dif = end - start;

          if (split.length) {
            v = split.join("_");

            if (v.indexOf("short") !== -1) {
              dif = dif % cap;

              if (dif !== dif % (cap / 2)) {
                dif = dif < 0 ? dif + cap : dif - cap;
              }
            }

            if (v.indexOf("_cw") !== -1 && dif < 0) {
              dif = (dif + cap * 9999999999) % cap - (dif / cap | 0) * cap;
            } else if (v.indexOf("ccw") !== -1 && dif > 0) {
              dif = (dif - cap * 9999999999) % cap - (dif / cap | 0) * cap;
            }
          }

          if (dif > min || dif < -min) {
            this._addTween(target, p, start, start + dif, p);

            this._overwriteProps.push(p);
          }
        }
      }

      return true;
    },
    //called each time the values should be updated, and the ratio gets passed as the only parameter (typically it's a value between 0 and 1, but it can exceed those when using an ease like Elastic.easeOut or Back.easeOut, etc.)
    set: function set(ratio) {
      var pt;

      if (ratio !== 1) {
        this._super.setRatio.call(this, ratio);
      } else {
        pt = this._firstPT;

        while (pt) {
          if (pt.f) {
            pt.t[pt.p](this.finals[pt.p]);
          } else {
            pt.t[pt.p] = this.finals[pt.p];
          }

          pt = pt._next;
        }
      }
    }
  })._autoCSS = true;
  /*
   * ----------------------------------------------------------------
   * EasePack
   * ----------------------------------------------------------------
   */

  _gsScope._gsDefine("easing.Back", ["easing.Ease"], function (Ease) {
    var w = _gsScope.GreenSockGlobals || _gsScope,
        gs = w.com.greensock,
        _2PI = Math.PI * 2,
        _HALF_PI = Math.PI / 2,
        _class = gs._class,
        _create = function _create(n, f) {
      var C = _class("easing." + n, function () {}, true),
          p = C.prototype = new Ease();

      p.constructor = C;
      p.getRatio = f;
      return C;
    },
        _easeReg = Ease.register || function () {},
        //put an empty function in place just as a safety measure in case someone loads an OLD version of TweenLite.js where Ease.register doesn't exist.
    _wrap = function _wrap(name, EaseOut, EaseIn, EaseInOut, aliases) {
      var C = _class("easing." + name, {
        easeOut: new EaseOut(),
        easeIn: new EaseIn(),
        easeInOut: new EaseInOut()
      }, true);

      _easeReg(C, name);

      return C;
    },
        EasePoint = function EasePoint(time, value, next) {
      this.t = time;
      this.v = value;

      if (next) {
        this.next = next;
        next.prev = this;
        this.c = next.v - value;
        this.gap = next.t - time;
      }
    },
        //Back
    _createBack = function _createBack(n, f) {
      var C = _class("easing." + n, function (overshoot) {
        this._p1 = overshoot || overshoot === 0 ? overshoot : 1.70158;
        this._p2 = this._p1 * 1.525;
      }, true),
          p = C.prototype = new Ease();

      p.constructor = C;
      p.getRatio = f;

      p.config = function (overshoot) {
        return new C(overshoot);
      };

      return C;
    },
        Back = _wrap("Back", _createBack("BackOut", function (p) {
      return (p = p - 1) * p * ((this._p1 + 1) * p + this._p1) + 1;
    }), _createBack("BackIn", function (p) {
      return p * p * ((this._p1 + 1) * p - this._p1);
    }), _createBack("BackInOut", function (p) {
      return (p *= 2) < 1 ? 0.5 * p * p * ((this._p2 + 1) * p - this._p2) : 0.5 * ((p -= 2) * p * ((this._p2 + 1) * p + this._p2) + 2);
    })),
        //SlowMo
    SlowMo = _class("easing.SlowMo", function (linearRatio, power, yoyoMode) {
      power = power || power === 0 ? power : 0.7;

      if (linearRatio == null) {
        linearRatio = 0.7;
      } else if (linearRatio > 1) {
        linearRatio = 1;
      }

      this._p = linearRatio !== 1 ? power : 0;
      this._p1 = (1 - linearRatio) / 2;
      this._p2 = linearRatio;
      this._p3 = this._p1 + this._p2;
      this._calcEnd = yoyoMode === true;
    }, true),
        p = SlowMo.prototype = new Ease(),
        SteppedEase,
        ExpoScaleEase,
        RoughEase,
        _createElastic;

    p.constructor = SlowMo;

    p.getRatio = function (p) {
      var r = p + (0.5 - p) * this._p;

      if (p < this._p1) {
        return this._calcEnd ? 1 - (p = 1 - p / this._p1) * p : r - (p = 1 - p / this._p1) * p * p * p * r;
      } else if (p > this._p3) {
        return this._calcEnd ? p === 1 ? 0 : 1 - (p = (p - this._p3) / this._p1) * p : r + (p - r) * (p = (p - this._p3) / this._p1) * p * p * p; //added p === 1 ? 0 to avoid floating point rounding errors from affecting the final value, like 1 - 0.7 = 0.30000000000000004 instead of 0.3
      }

      return this._calcEnd ? 1 : r;
    };

    SlowMo.ease = new SlowMo(0.7, 0.7);

    p.config = SlowMo.config = function (linearRatio, power, yoyoMode) {
      return new SlowMo(linearRatio, power, yoyoMode);
    }; //SteppedEase


    SteppedEase = _class("easing.SteppedEase", function (steps, immediateStart) {
      steps = steps || 1;
      this._p1 = 1 / steps;
      this._p2 = steps + (immediateStart ? 0 : 1);
      this._p3 = immediateStart ? 1 : 0;
    }, true);
    p = SteppedEase.prototype = new Ease();
    p.constructor = SteppedEase;

    p.getRatio = function (p) {
      if (p < 0) {
        p = 0;
      } else if (p >= 1) {
        p = 0.999999999;
      }

      return ((this._p2 * p | 0) + this._p3) * this._p1;
    };

    p.config = SteppedEase.config = function (steps, immediateStart) {
      return new SteppedEase(steps, immediateStart);
    }; //ExpoScaleEase


    ExpoScaleEase = _class("easing.ExpoScaleEase", function (start, end, ease) {
      this._p1 = Math.log(end / start);
      this._p2 = end - start;
      this._p3 = start;
      this._ease = ease;
    }, true);
    p = ExpoScaleEase.prototype = new Ease();
    p.constructor = ExpoScaleEase;

    p.getRatio = function (p) {
      if (this._ease) {
        p = this._ease.getRatio(p);
      }

      return (this._p3 * Math.exp(this._p1 * p) - this._p3) / this._p2;
    };

    p.config = ExpoScaleEase.config = function (start, end, ease) {
      return new ExpoScaleEase(start, end, ease);
    }; //RoughEase


    RoughEase = _class("easing.RoughEase", function (vars) {
      vars = vars || {};
      var taper = vars.taper || "none",
          a = [],
          cnt = 0,
          points = (vars.points || 20) | 0,
          i = points,
          randomize = vars.randomize !== false,
          clamp = vars.clamp === true,
          template = vars.template instanceof Ease ? vars.template : null,
          strength = typeof vars.strength === "number" ? vars.strength * 0.4 : 0.4,
          x,
          y,
          bump,
          invX,
          obj,
          pnt;

      while (--i > -1) {
        x = randomize ? Math.random() : 1 / points * i;
        y = template ? template.getRatio(x) : x;

        if (taper === "none") {
          bump = strength;
        } else if (taper === "out") {
          invX = 1 - x;
          bump = invX * invX * strength;
        } else if (taper === "in") {
          bump = x * x * strength;
        } else if (x < 0.5) {
          //"both" (start)
          invX = x * 2;
          bump = invX * invX * 0.5 * strength;
        } else {
          //"both" (end)
          invX = (1 - x) * 2;
          bump = invX * invX * 0.5 * strength;
        }

        if (randomize) {
          y += Math.random() * bump - bump * 0.5;
        } else if (i % 2) {
          y += bump * 0.5;
        } else {
          y -= bump * 0.5;
        }

        if (clamp) {
          if (y > 1) {
            y = 1;
          } else if (y < 0) {
            y = 0;
          }
        }

        a[cnt++] = {
          x: x,
          y: y
        };
      }

      a.sort(function (a, b) {
        return a.x - b.x;
      });
      pnt = new EasePoint(1, 1, null);
      i = points;

      while (--i > -1) {
        obj = a[i];
        pnt = new EasePoint(obj.x, obj.y, pnt);
      }

      this._prev = new EasePoint(0, 0, pnt.t !== 0 ? pnt : pnt.next);
    }, true);
    p = RoughEase.prototype = new Ease();
    p.constructor = RoughEase;

    p.getRatio = function (p) {
      var pnt = this._prev;

      if (p > pnt.t) {
        while (pnt.next && p >= pnt.t) {
          pnt = pnt.next;
        }

        pnt = pnt.prev;
      } else {
        while (pnt.prev && p <= pnt.t) {
          pnt = pnt.prev;
        }
      }

      this._prev = pnt;
      return pnt.v + (p - pnt.t) / pnt.gap * pnt.c;
    };

    p.config = function (vars) {
      return new RoughEase(vars);
    };

    RoughEase.ease = new RoughEase(); //Bounce

    _wrap("Bounce", _create("BounceOut", function (p) {
      if (p < 1 / 2.75) {
        return 7.5625 * p * p;
      } else if (p < 2 / 2.75) {
        return 7.5625 * (p -= 1.5 / 2.75) * p + 0.75;
      } else if (p < 2.5 / 2.75) {
        return 7.5625 * (p -= 2.25 / 2.75) * p + 0.9375;
      }

      return 7.5625 * (p -= 2.625 / 2.75) * p + 0.984375;
    }), _create("BounceIn", function (p) {
      if ((p = 1 - p) < 1 / 2.75) {
        return 1 - 7.5625 * p * p;
      } else if (p < 2 / 2.75) {
        return 1 - (7.5625 * (p -= 1.5 / 2.75) * p + 0.75);
      } else if (p < 2.5 / 2.75) {
        return 1 - (7.5625 * (p -= 2.25 / 2.75) * p + 0.9375);
      }

      return 1 - (7.5625 * (p -= 2.625 / 2.75) * p + 0.984375);
    }), _create("BounceInOut", function (p) {
      var invert = p < 0.5;

      if (invert) {
        p = 1 - p * 2;
      } else {
        p = p * 2 - 1;
      }

      if (p < 1 / 2.75) {
        p = 7.5625 * p * p;
      } else if (p < 2 / 2.75) {
        p = 7.5625 * (p -= 1.5 / 2.75) * p + 0.75;
      } else if (p < 2.5 / 2.75) {
        p = 7.5625 * (p -= 2.25 / 2.75) * p + 0.9375;
      } else {
        p = 7.5625 * (p -= 2.625 / 2.75) * p + 0.984375;
      }

      return invert ? (1 - p) * 0.5 : p * 0.5 + 0.5;
    })); //CIRC


    _wrap("Circ", _create("CircOut", function (p) {
      return Math.sqrt(1 - (p = p - 1) * p);
    }), _create("CircIn", function (p) {
      return -(Math.sqrt(1 - p * p) - 1);
    }), _create("CircInOut", function (p) {
      return (p *= 2) < 1 ? -0.5 * (Math.sqrt(1 - p * p) - 1) : 0.5 * (Math.sqrt(1 - (p -= 2) * p) + 1);
    })); //Elastic


    _createElastic = function _createElastic(n, f, def) {
      var C = _class("easing." + n, function (amplitude, period) {
        this._p1 = amplitude >= 1 ? amplitude : 1; //note: if amplitude is < 1, we simply adjust the period for a more natural feel. Otherwise the math doesn't work right and the curve starts at 1.

        this._p2 = (period || def) / (amplitude < 1 ? amplitude : 1);
        this._p3 = this._p2 / _2PI * (Math.asin(1 / this._p1) || 0);
        this._p2 = _2PI / this._p2; //precalculate to optimize
      }, true),
          p = C.prototype = new Ease();

      p.constructor = C;
      p.getRatio = f;

      p.config = function (amplitude, period) {
        return new C(amplitude, period);
      };

      return C;
    };

    _wrap("Elastic", _createElastic("ElasticOut", function (p) {
      return this._p1 * Math.pow(2, -10 * p) * Math.sin((p - this._p3) * this._p2) + 1;
    }, 0.3), _createElastic("ElasticIn", function (p) {
      return -(this._p1 * Math.pow(2, 10 * (p -= 1)) * Math.sin((p - this._p3) * this._p2));
    }, 0.3), _createElastic("ElasticInOut", function (p) {
      return (p *= 2) < 1 ? -0.5 * (this._p1 * Math.pow(2, 10 * (p -= 1)) * Math.sin((p - this._p3) * this._p2)) : this._p1 * Math.pow(2, -10 * (p -= 1)) * Math.sin((p - this._p3) * this._p2) * 0.5 + 1;
    }, 0.45)); //Expo


    _wrap("Expo", _create("ExpoOut", function (p) {
      return 1 - Math.pow(2, -10 * p);
    }), _create("ExpoIn", function (p) {
      return Math.pow(2, 10 * (p - 1)) - 0.001;
    }), _create("ExpoInOut", function (p) {
      return (p *= 2) < 1 ? 0.5 * Math.pow(2, 10 * (p - 1)) : 0.5 * (2 - Math.pow(2, -10 * (p - 1)));
    })); //Sine


    _wrap("Sine", _create("SineOut", function (p) {
      return Math.sin(p * _HALF_PI);
    }), _create("SineIn", function (p) {
      return -Math.cos(p * _HALF_PI) + 1;
    }), _create("SineInOut", function (p) {
      return -0.5 * (Math.cos(Math.PI * p) - 1);
    }));

    _class("easing.EaseLookup", {
      find: function find(s) {
        return Ease.map[s];
      }
    }, true); //register the non-standard eases


    _easeReg(w.SlowMo, "SlowMo", "ease,");

    _easeReg(RoughEase, "RoughEase", "ease,");

    _easeReg(SteppedEase, "SteppedEase", "ease,");

    return Back;
  }, true);
});

if (_gsScope._gsDefine) {
  _gsScope._gsQueue.pop()();
} //necessary in case TweenLite was already loaded separately.

/*
 * ----------------------------------------------------------------
 * Base classes like TweenLite, SimpleTimeline, Ease, Ticker, etc.
 * ----------------------------------------------------------------
 */


(function (window, moduleName) {
  "use strict";

  var _exports = {},
      _doc = window.document,
      _globals = window.GreenSockGlobals = window.GreenSockGlobals || window;

  if (_globals.TweenLite) {
    return; //in case the core set of classes is already loaded, don't instantiate twice.
  }

  var _namespace = function _namespace(ns) {
    var a = ns.split("."),
        p = _globals,
        i;

    for (i = 0; i < a.length; i++) {
      p[a[i]] = p = p[a[i]] || {};
    }

    return p;
  },
      gs = _namespace("com.greensock"),
      _tinyNum = 0.0000000001,
      _slice = function _slice(a) {
    //don't use Array.prototype.slice.call(target, 0) because that doesn't work in IE8 with a NodeList that's returned by querySelectorAll()
    var b = [],
        l = a.length,
        i;

    for (i = 0; i !== l; b.push(a[i++])) {}

    return b;
  },
      _emptyFunc = function _emptyFunc() {},
      _isArray = function () {
    //works around issues in iframe environments where the Array global isn't shared, thus if the object originates in a different window/iframe, "(obj instanceof Array)" will evaluate false. We added some speed optimizations to avoid Object.prototype.toString.call() unless it's absolutely necessary because it's VERY slow (like 20x slower)
    var toString = Object.prototype.toString,
        array = toString.call([]);
    return function (obj) {
      return obj != null && (obj instanceof Array || _typeof(obj) === "object" && !!obj.push && toString.call(obj) === array);
    };
  }(),
      a,
      i,
      p,
      _ticker,
      _tickerActive,
      _defLookup = {},

  /**
   * @constructor
   * Defines a GreenSock class, optionally with an array of dependencies that must be instantiated first and passed into the definition.
   * This allows users to load GreenSock JS files in any order even if they have interdependencies (like CSSPlugin extends TweenPlugin which is
   * inside TweenLite.js, but if CSSPlugin is loaded first, it should wait to run its code until TweenLite.js loads and instantiates TweenPlugin
   * and then pass TweenPlugin to CSSPlugin's definition). This is all done automatically and internally.
   *
   * Every definition will be added to a "com.greensock" global object (typically window, but if a window.GreenSockGlobals object is found,
   * it will go there as of v1.7). For example, TweenLite will be found at window.com.greensock.TweenLite and since it's a global class that should be available anywhere,
   * it is ALSO referenced at window.TweenLite. However some classes aren't considered global, like the base com.greensock.core.Animation class, so
   * those will only be at the package like window.com.greensock.core.Animation. Again, if you define a GreenSockGlobals object on the window, everything
   * gets tucked neatly inside there instead of on the window directly. This allows you to do advanced things like load multiple versions of GreenSock
   * files and put them into distinct objects (imagine a banner ad uses a newer version but the main site uses an older one). In that case, you could
   * sandbox the banner one like:
   *
   * <script>
   *     var gs = window.GreenSockGlobals = {}; //the newer version we're about to load could now be referenced in a "gs" object, like gs.TweenLite.to(...). Use whatever alias you want as long as it's unique, "gs" or "banner" or whatever.
   * </script>
   * <script src="js/greensock/v1.7/TweenMax.js"></script>
   * <script>
   *     window.GreenSockGlobals = window._gsQueue = window._gsDefine = null; //reset it back to null (along with the special _gsQueue variable) so that the next load of TweenMax affects the window and we can reference things directly like TweenLite.to(...)
   * </script>
   * <script src="js/greensock/v1.6/TweenMax.js"></script>
   * <script>
   *     gs.TweenLite.to(...); //would use v1.7
   *     TweenLite.to(...); //would use v1.6
   * </script>
   *
   * @param {!string} ns The namespace of the class definition, leaving off "com.greensock." as that's assumed. For example, "TweenLite" or "plugins.CSSPlugin" or "easing.Back".
   * @param {!Array.<string>} dependencies An array of dependencies (described as their namespaces minus "com.greensock." prefix). For example ["TweenLite","plugins.TweenPlugin","core.Animation"]
   * @param {!function():Object} func The function that should be called and passed the resolved dependencies which will return the actual class for this definition.
   * @param {boolean=} global If true, the class will be added to the global scope (typically window unless you define a window.GreenSockGlobals object)
   */
  Definition = function Definition(ns, dependencies, func, global) {
    this.sc = _defLookup[ns] ? _defLookup[ns].sc : []; //subclasses

    _defLookup[ns] = this;
    this.gsClass = null;
    this.func = func;
    var _classes = [];

    this.check = function (init) {
      var i = dependencies.length,
          missing = i,
          cur,
          a,
          n,
          cl;

      while (--i > -1) {
        if ((cur = _defLookup[dependencies[i]] || new Definition(dependencies[i], [])).gsClass) {
          _classes[i] = cur.gsClass;
          missing--;
        } else if (init) {
          cur.sc.push(this);
        }
      }

      if (missing === 0 && func) {
        a = ("com.greensock." + ns).split(".");
        n = a.pop();
        cl = _namespace(a.join("."))[n] = this.gsClass = func.apply(func, _classes); //exports to multiple environments

        if (global) {
          _globals[n] = _exports[n] = cl; //provides a way to avoid global namespace pollution. By default, the main classes like TweenLite, Power1, Strong, etc. are added to window unless a GreenSockGlobals is defined. So if you want to have things added to a custom object instead, just do something like window.GreenSockGlobals = {} before loading any GreenSock files. You can even set up an alias like window.GreenSockGlobals = windows.gs = {} so that you can access everything like gs.TweenLite. Also remember that ALL classes are added to the window.com.greensock object (in their respective packages, like com.greensock.easing.Power1, com.greensock.TweenLite, etc.)

          if (typeof module !== "undefined" && module.exports) {
            //node
            if (ns === moduleName) {
              module.exports = _exports[moduleName] = cl;

              for (i in _exports) {
                cl[i] = _exports[i];
              }
            } else if (_exports[moduleName]) {
              _exports[moduleName][n] = cl;
            }
          } else if (typeof define === "function" && define.amd) {
            //AMD
            define((window.GreenSockAMDPath ? window.GreenSockAMDPath + "/" : "") + ns.split(".").pop(), [], function () {
              return cl;
            });
          }
        }

        for (i = 0; i < this.sc.length; i++) {
          this.sc[i].check();
        }
      }
    };

    this.check(true);
  },
      //used to create Definition instances (which basically registers a class that has dependencies).
  _gsDefine = window._gsDefine = function (ns, dependencies, func, global) {
    return new Definition(ns, dependencies, func, global);
  },
      //a quick way to create a class that doesn't have any dependencies. Returns the class, but first registers it in the GreenSock namespace so that other classes can grab it (other classes might be dependent on the class).
  _class = gs._class = function (ns, func, global) {
    func = func || function () {};

    _gsDefine(ns, [], function () {
      return func;
    }, global);

    return func;
  };

  _gsDefine.globals = _globals;
  /*
   * ----------------------------------------------------------------
   * Ease
   * ----------------------------------------------------------------
   */

  var _baseParams = [0, 0, 1, 1],
      Ease = _class("easing.Ease", function (func, extraParams, type, power) {
    this._func = func;
    this._type = type || 0;
    this._power = power || 0;
    this._params = extraParams ? _baseParams.concat(extraParams) : _baseParams;
  }, true),
      _easeMap = Ease.map = {},
      _easeReg = Ease.register = function (ease, names, types, create) {
    var na = names.split(","),
        i = na.length,
        ta = (types || "easeIn,easeOut,easeInOut").split(","),
        e,
        name,
        j,
        type;

    while (--i > -1) {
      name = na[i];
      e = create ? _class("easing." + name, null, true) : gs.easing[name] || {};
      j = ta.length;

      while (--j > -1) {
        type = ta[j];
        _easeMap[name + "." + type] = _easeMap[type + name] = e[type] = ease.getRatio ? ease : ease[type] || new ease();
      }
    }
  };

  p = Ease.prototype;
  p._calcEnd = false;

  p.getRatio = function (p) {
    if (this._func) {
      this._params[0] = p;
      return this._func.apply(null, this._params);
    }

    var t = this._type,
        pw = this._power,
        r = t === 1 ? 1 - p : t === 2 ? p : p < 0.5 ? p * 2 : (1 - p) * 2;

    if (pw === 1) {
      r *= r;
    } else if (pw === 2) {
      r *= r * r;
    } else if (pw === 3) {
      r *= r * r * r;
    } else if (pw === 4) {
      r *= r * r * r * r;
    }

    return t === 1 ? 1 - r : t === 2 ? r : p < 0.5 ? r / 2 : 1 - r / 2;
  }; //create all the standard eases like Linear, Quad, Cubic, Quart, Quint, Strong, Power0, Power1, Power2, Power3, and Power4 (each with easeIn, easeOut, and easeInOut)


  a = ["Linear", "Quad", "Cubic", "Quart", "Quint,Strong"];
  i = a.length;

  while (--i > -1) {
    p = a[i] + ",Power" + i;

    _easeReg(new Ease(null, null, 1, i), p, "easeOut", true);

    _easeReg(new Ease(null, null, 2, i), p, "easeIn" + (i === 0 ? ",easeNone" : ""));

    _easeReg(new Ease(null, null, 3, i), p, "easeInOut");
  }

  _easeMap.linear = gs.easing.Linear.easeIn;
  _easeMap.swing = gs.easing.Quad.easeInOut; //for jQuery folks

  /*
   * ----------------------------------------------------------------
   * EventDispatcher
   * ----------------------------------------------------------------
   */

  var EventDispatcher = _class("events.EventDispatcher", function (target) {
    this._listeners = {};
    this._eventTarget = target || this;
  });

  p = EventDispatcher.prototype;

  p.addEventListener = function (type, callback, scope, useParam, priority) {
    priority = priority || 0;
    var list = this._listeners[type],
        index = 0,
        listener,
        i;

    if (this === _ticker && !_tickerActive) {
      _ticker.wake();
    }

    if (list == null) {
      this._listeners[type] = list = [];
    }

    i = list.length;

    while (--i > -1) {
      listener = list[i];

      if (listener.c === callback && listener.s === scope) {
        list.splice(i, 1);
      } else if (index === 0 && listener.pr < priority) {
        index = i + 1;
      }
    }

    list.splice(index, 0, {
      c: callback,
      s: scope,
      up: useParam,
      pr: priority
    });
  };

  p.removeEventListener = function (type, callback) {
    var list = this._listeners[type],
        i;

    if (list) {
      i = list.length;

      while (--i > -1) {
        if (list[i].c === callback) {
          list.splice(i, 1);
          return;
        }
      }
    }
  };

  p.dispatchEvent = function (type) {
    var list = this._listeners[type],
        i,
        t,
        listener;

    if (list) {
      i = list.length;

      if (i > 1) {
        list = list.slice(0); //in case addEventListener() is called from within a listener/callback (otherwise the index could change, resulting in a skip)
      }

      t = this._eventTarget;

      while (--i > -1) {
        listener = list[i];

        if (listener) {
          if (listener.up) {
            listener.c.call(listener.s || t, {
              type: type,
              target: t
            });
          } else {
            listener.c.call(listener.s || t);
          }
        }
      }
    }
  };
  /*
   * ----------------------------------------------------------------
   * Ticker
   * ----------------------------------------------------------------
   */


  var _reqAnimFrame = window.requestAnimationFrame,
      _cancelAnimFrame = window.cancelAnimationFrame,
      _getTime = Date.now || function () {
    return new Date().getTime();
  },
      _lastUpdate = _getTime(); //now try to determine the requestAnimationFrame and cancelAnimationFrame functions and if none are found, we'll use a setTimeout()/clearTimeout() polyfill.


  a = ["ms", "moz", "webkit", "o"];
  i = a.length;

  while (--i > -1 && !_reqAnimFrame) {
    _reqAnimFrame = window[a[i] + "RequestAnimationFrame"];
    _cancelAnimFrame = window[a[i] + "CancelAnimationFrame"] || window[a[i] + "CancelRequestAnimationFrame"];
  }

  _class("Ticker", function (fps, useRAF) {
    var _self = this,
        _startTime = _getTime(),
        _useRAF = useRAF !== false && _reqAnimFrame ? "auto" : false,
        _lagThreshold = 500,
        _adjustedLag = 33,
        _tickWord = "tick",
        //helps reduce gc burden
    _fps,
        _req,
        _id,
        _gap,
        _nextTime,
        _tick = function _tick(manual) {
      var elapsed = _getTime() - _lastUpdate,
          overlap,
          dispatch;

      if (elapsed > _lagThreshold) {
        _startTime += elapsed - _adjustedLag;
      }

      _lastUpdate += elapsed;
      _self.time = (_lastUpdate - _startTime) / 1000;
      overlap = _self.time - _nextTime;

      if (!_fps || overlap > 0 || manual === true) {
        _self.frame++;
        _nextTime += overlap + (overlap >= _gap ? 0.004 : _gap - overlap);
        dispatch = true;
      }

      if (manual !== true) {
        //make sure the request is made before we dispatch the "tick" event so that timing is maintained. Otherwise, if processing the "tick" requires a bunch of time (like 15ms) and we're using a setTimeout() that's based on 16.7ms, it'd technically take 31.7ms between frames otherwise.
        _id = _req(_tick);
      }

      if (dispatch) {
        _self.dispatchEvent(_tickWord);
      }
    };

    EventDispatcher.call(_self);
    _self.time = _self.frame = 0;

    _self.tick = function () {
      _tick(true);
    };

    _self.lagSmoothing = function (threshold, adjustedLag) {
      if (!arguments.length) {
        //if lagSmoothing() is called with no arguments, treat it like a getter that returns a boolean indicating if it's enabled or not. This is purposely undocumented and is for internal use.
        return _lagThreshold < 1 / _tinyNum;
      }

      _lagThreshold = threshold || 1 / _tinyNum; //zero should be interpreted as basically unlimited

      _adjustedLag = Math.min(adjustedLag, _lagThreshold, 0);
    };

    _self.sleep = function () {
      if (_id == null) {
        return;
      }

      if (!_useRAF || !_cancelAnimFrame) {
        clearTimeout(_id);
      } else {
        _cancelAnimFrame(_id);
      }

      _req = _emptyFunc;
      _id = null;

      if (_self === _ticker) {
        _tickerActive = false;
      }
    };

    _self.wake = function (seamless) {
      if (_id !== null) {
        _self.sleep();
      } else if (seamless) {
        _startTime += -_lastUpdate + (_lastUpdate = _getTime());
      } else if (_self.frame > 10) {
        //don't trigger lagSmoothing if we're just waking up, and make sure that at least 10 frames have elapsed because of the iOS bug that we work around below with the 1.5-second setTimout().
        _lastUpdate = _getTime() - _lagThreshold + 5;
      }

      _req = _fps === 0 ? _emptyFunc : !_useRAF || !_reqAnimFrame ? function (f) {
        return setTimeout(f, (_nextTime - _self.time) * 1000 + 1 | 0);
      } : _reqAnimFrame;

      if (_self === _ticker) {
        _tickerActive = true;
      }

      _tick(2);
    };

    _self.fps = function (value) {
      if (!arguments.length) {
        return _fps;
      }

      _fps = value;
      _gap = 1 / (_fps || 60);
      _nextTime = this.time + _gap;

      _self.wake();
    };

    _self.useRAF = function (value) {
      if (!arguments.length) {
        return _useRAF;
      }

      _self.sleep();

      _useRAF = value;

      _self.fps(_fps);
    };

    _self.fps(fps); //a bug in iOS 6 Safari occasionally prevents the requestAnimationFrame from working initially, so we use a 1.5-second timeout that automatically falls back to setTimeout() if it senses this condition.


    setTimeout(function () {
      if (_useRAF === "auto" && _self.frame < 5 && (_doc || {}).visibilityState !== "hidden") {
        _self.useRAF(false);
      }
    }, 1500);
  });

  p = gs.Ticker.prototype = new gs.events.EventDispatcher();
  p.constructor = gs.Ticker;
  /*
   * ----------------------------------------------------------------
   * Animation
   * ----------------------------------------------------------------
   */

  var Animation = _class("core.Animation", function (duration, vars) {
    this.vars = vars = vars || {};
    this._duration = this._totalDuration = duration || 0;
    this._delay = Number(vars.delay) || 0;
    this._timeScale = 1;
    this._active = vars.immediateRender === true;
    this.data = vars.data;
    this._reversed = vars.reversed === true;

    if (!_rootTimeline) {
      return;
    }

    if (!_tickerActive) {
      //some browsers (like iOS 6 Safari) shut down JavaScript execution when the tab is disabled and they [occasionally] neglect to start up requestAnimationFrame again when returning - this code ensures that the engine starts up again properly.
      _ticker.wake();
    }

    var tl = this.vars.useFrames ? _rootFramesTimeline : _rootTimeline;
    tl.add(this, tl._time);

    if (this.vars.paused) {
      this.paused(true);
    }
  });

  _ticker = Animation.ticker = new gs.Ticker();
  p = Animation.prototype;
  p._dirty = p._gc = p._initted = p._paused = false;
  p._totalTime = p._time = 0;
  p._rawPrevTime = -1;
  p._next = p._last = p._onUpdate = p._timeline = p.timeline = null;
  p._paused = false; //some browsers (like iOS) occasionally drop the requestAnimationFrame event when the user switches to a different tab and then comes back again, so we use a 2-second setTimeout() to sense if/when that condition occurs and then wake() the ticker.

  var _checkTimeout = function _checkTimeout() {
    if (_tickerActive && _getTime() - _lastUpdate > 2000 && ((_doc || {}).visibilityState !== "hidden" || !_ticker.lagSmoothing())) {
      //note: if the tab is hidden, we should still wake if lagSmoothing has been disabled.
      _ticker.wake();
    }

    var t = setTimeout(_checkTimeout, 2000);

    if (t.unref) {
      // allows a node process to exit even if the timeout’s callback hasn't been invoked. Without it, the node process could hang as this function is called every two seconds.
      t.unref();
    }
  };

  _checkTimeout();

  p.play = function (from, suppressEvents) {
    if (from != null) {
      this.seek(from, suppressEvents);
    }

    return this.reversed(false).paused(false);
  };

  p.pause = function (atTime, suppressEvents) {
    if (atTime != null) {
      this.seek(atTime, suppressEvents);
    }

    return this.paused(true);
  };

  p.resume = function (from, suppressEvents) {
    if (from != null) {
      this.seek(from, suppressEvents);
    }

    return this.paused(false);
  };

  p.seek = function (time, suppressEvents) {
    return this.totalTime(Number(time), suppressEvents !== false);
  };

  p.restart = function (includeDelay, suppressEvents) {
    return this.reversed(false).paused(false).totalTime(includeDelay ? -this._delay : 0, suppressEvents !== false, true);
  };

  p.reverse = function (from, suppressEvents) {
    if (from != null) {
      this.seek(from || this.totalDuration(), suppressEvents);
    }

    return this.reversed(true).paused(false);
  };

  p.render = function (time, suppressEvents, force) {//stub - we override this method in subclasses.
  };

  p.invalidate = function () {
    this._time = this._totalTime = 0;
    this._initted = this._gc = false;
    this._rawPrevTime = -1;

    if (this._gc || !this.timeline) {
      this._enabled(true);
    }

    return this;
  };

  p.isActive = function () {
    var tl = this._timeline,
        //the 2 root timelines won't have a _timeline; they're always active.
    startTime = this._startTime,
        rawTime;
    return !tl || !this._gc && !this._paused && tl.isActive() && (rawTime = tl.rawTime(true)) >= startTime && rawTime < startTime + this.totalDuration() / this._timeScale - 0.0000001;
  };

  p._enabled = function (enabled, ignoreTimeline) {
    if (!_tickerActive) {
      _ticker.wake();
    }

    this._gc = !enabled;
    this._active = this.isActive();

    if (ignoreTimeline !== true) {
      if (enabled && !this.timeline) {
        this._timeline.add(this, this._startTime - this._delay);
      } else if (!enabled && this.timeline) {
        this._timeline._remove(this, true);
      }
    }

    return false;
  };

  p._kill = function (vars, target) {
    return this._enabled(false, false);
  };

  p.kill = function (vars, target) {
    this._kill(vars, target);

    return this;
  };

  p._uncache = function (includeSelf) {
    var tween = includeSelf ? this : this.timeline;

    while (tween) {
      tween._dirty = true;
      tween = tween.timeline;
    }

    return this;
  };

  p._swapSelfInParams = function (params) {
    var i = params.length,
        copy = params.concat();

    while (--i > -1) {
      if (params[i] === "{self}") {
        copy[i] = this;
      }
    }

    return copy;
  };

  p._callback = function (type) {
    var v = this.vars,
        callback = v[type],
        params = v[type + "Params"],
        scope = v[type + "Scope"] || v.callbackScope || this,
        l = params ? params.length : 0;

    switch (l) {
      //speed optimization; call() is faster than apply() so use it when there are only a few parameters (which is by far most common). Previously we simply did var v = this.vars; v[type].apply(v[type + "Scope"] || v.callbackScope || this, v[type + "Params"] || _blankArray);
      case 0:
        callback.call(scope);
        break;

      case 1:
        callback.call(scope, params[0]);
        break;

      case 2:
        callback.call(scope, params[0], params[1]);
        break;

      default:
        callback.apply(scope, params);
    }
  }; //----Animation getters/setters --------------------------------------------------------


  p.eventCallback = function (type, callback, params, scope) {
    if ((type || "").substr(0, 2) === "on") {
      var v = this.vars;

      if (arguments.length === 1) {
        return v[type];
      }

      if (callback == null) {
        delete v[type];
      } else {
        v[type] = callback;
        v[type + "Params"] = _isArray(params) && params.join("").indexOf("{self}") !== -1 ? this._swapSelfInParams(params) : params;
        v[type + "Scope"] = scope;
      }

      if (type === "onUpdate") {
        this._onUpdate = callback;
      }
    }

    return this;
  };

  p.delay = function (value) {
    if (!arguments.length) {
      return this._delay;
    }

    if (this._timeline.smoothChildTiming) {
      this.startTime(this._startTime + value - this._delay);
    }

    this._delay = value;
    return this;
  };

  p.duration = function (value) {
    if (!arguments.length) {
      this._dirty = false;
      return this._duration;
    }

    this._duration = this._totalDuration = value;

    this._uncache(true); //true in case it's a TweenMax or TimelineMax that has a repeat - we'll need to refresh the totalDuration.


    if (this._timeline.smoothChildTiming) if (this._time > 0) if (this._time < this._duration) if (value !== 0) {
      this.totalTime(this._totalTime * (value / this._duration), true);
    }
    return this;
  };

  p.totalDuration = function (value) {
    this._dirty = false;
    return !arguments.length ? this._totalDuration : this.duration(value);
  };

  p.time = function (value, suppressEvents) {
    if (!arguments.length) {
      return this._time;
    }

    if (this._dirty) {
      this.totalDuration();
    }

    return this.totalTime(value > this._duration ? this._duration : value, suppressEvents);
  };

  p.totalTime = function (time, suppressEvents, uncapped) {
    if (!_tickerActive) {
      _ticker.wake();
    }

    if (!arguments.length) {
      return this._totalTime;
    }

    if (this._timeline) {
      if (time < 0 && !uncapped) {
        time += this.totalDuration();
      }

      if (this._timeline.smoothChildTiming) {
        if (this._dirty) {
          this.totalDuration();
        }

        var totalDuration = this._totalDuration,
            tl = this._timeline;

        if (time > totalDuration && !uncapped) {
          time = totalDuration;
        }

        this._startTime = (this._paused ? this._pauseTime : tl._time) - (!this._reversed ? time : totalDuration - time) / this._timeScale;

        if (!tl._dirty) {
          //for performance improvement. If the parent's cache is already dirty, it already took care of marking the ancestors as dirty too, so skip the function call here.
          this._uncache(false);
        } //in case any of the ancestor timelines had completed but should now be enabled, we should reset their totalTime() which will also ensure that they're lined up properly and enabled. Skip for animations that are on the root (wasteful). Example: a TimelineLite.exportRoot() is performed when there's a paused tween on the root, the export will not complete until that tween is unpaused, but imagine a child gets restarted later, after all [unpaused] tweens have completed. The startTime of that child would get pushed out, but one of the ancestors may have completed.


        if (tl._timeline) {
          while (tl._timeline) {
            if (tl._timeline._time !== (tl._startTime + tl._totalTime) / tl._timeScale) {
              tl.totalTime(tl._totalTime, true);
            }

            tl = tl._timeline;
          }
        }
      }

      if (this._gc) {
        this._enabled(true, false);
      }

      if (this._totalTime !== time || this._duration === 0) {
        if (_lazyTweens.length) {
          _lazyRender();
        }

        this.render(time, suppressEvents, false);

        if (_lazyTweens.length) {
          //in case rendering caused any tweens to lazy-init, we should render them because typically when someone calls seek() or time() or progress(), they expect an immediate render.
          _lazyRender();
        }
      }
    }

    return this;
  };

  p.progress = p.totalProgress = function (value, suppressEvents) {
    var duration = this.duration();
    return !arguments.length ? duration ? this._time / duration : this.ratio : this.totalTime(duration * value, suppressEvents);
  };

  p.startTime = function (value) {
    if (!arguments.length) {
      return this._startTime;
    }

    if (value !== this._startTime) {
      this._startTime = value;
      if (this.timeline) if (this.timeline._sortChildren) {
        this.timeline.add(this, value - this._delay); //ensures that any necessary re-sequencing of Animations in the timeline occurs to make sure the rendering order is correct.
      }
    }

    return this;
  };

  p.endTime = function (includeRepeats) {
    return this._startTime + (includeRepeats != false ? this.totalDuration() : this.duration()) / this._timeScale;
  };

  p.timeScale = function (value) {
    if (!arguments.length) {
      return this._timeScale;
    }

    var pauseTime, t;
    value = value || _tinyNum; //can't allow zero because it'll throw the math off

    if (this._timeline && this._timeline.smoothChildTiming) {
      pauseTime = this._pauseTime;
      t = pauseTime || pauseTime === 0 ? pauseTime : this._timeline.totalTime();
      this._startTime = t - (t - this._startTime) * this._timeScale / value;
    }

    this._timeScale = value;
    t = this.timeline;

    while (t && t.timeline) {
      //must update the duration/totalDuration of all ancestor timelines immediately in case in the middle of a render loop, one tween alters another tween's timeScale which shoves its startTime before 0, forcing the parent timeline to shift around and shiftChildren() which could affect that next tween's render (startTime). Doesn't matter for the root timeline though.
      t._dirty = true;
      t.totalDuration();
      t = t.timeline;
    }

    return this;
  };

  p.reversed = function (value) {
    if (!arguments.length) {
      return this._reversed;
    }

    if (value != this._reversed) {
      this._reversed = value;
      this.totalTime(this._timeline && !this._timeline.smoothChildTiming ? this.totalDuration() - this._totalTime : this._totalTime, true);
    }

    return this;
  };

  p.paused = function (value) {
    if (!arguments.length) {
      return this._paused;
    }

    var tl = this._timeline,
        raw,
        elapsed;
    if (value != this._paused) if (tl) {
      if (!_tickerActive && !value) {
        _ticker.wake();
      }

      raw = tl.rawTime();
      elapsed = raw - this._pauseTime;

      if (!value && tl.smoothChildTiming) {
        this._startTime += elapsed;

        this._uncache(false);
      }

      this._pauseTime = value ? raw : null;
      this._paused = value;
      this._active = this.isActive();

      if (!value && elapsed !== 0 && this._initted && this.duration()) {
        raw = tl.smoothChildTiming ? this._totalTime : (raw - this._startTime) / this._timeScale;
        this.render(raw, raw === this._totalTime, true); //in case the target's properties changed via some other tween or manual update by the user, we should force a render.
      }
    }

    if (this._gc && !value) {
      this._enabled(true, false);
    }

    return this;
  };
  /*
   * ----------------------------------------------------------------
   * SimpleTimeline
   * ----------------------------------------------------------------
   */


  var SimpleTimeline = _class("core.SimpleTimeline", function (vars) {
    Animation.call(this, 0, vars);
    this.autoRemoveChildren = this.smoothChildTiming = true;
  });

  p = SimpleTimeline.prototype = new Animation();
  p.constructor = SimpleTimeline;
  p.kill()._gc = false;
  p._first = p._last = p._recent = null;
  p._sortChildren = false;

  p.add = p.insert = function (child, position, align, stagger) {
    var prevTween, st;
    child._startTime = Number(position || 0) + child._delay;
    if (child._paused) if (this !== child._timeline) {
      //we only adjust the _pauseTime if it wasn't in this timeline already. Remember, sometimes a tween will be inserted again into the same timeline when its startTime is changed so that the tweens in the TimelineLite/Max are re-ordered properly in the linked list (so everything renders in the proper order).
      child._pauseTime = child._startTime + (this.rawTime() - child._startTime) / child._timeScale;
    }

    if (child.timeline) {
      child.timeline._remove(child, true); //removes from existing timeline so that it can be properly added to this one.

    }

    child.timeline = child._timeline = this;

    if (child._gc) {
      child._enabled(true, true);
    }

    prevTween = this._last;

    if (this._sortChildren) {
      st = child._startTime;

      while (prevTween && prevTween._startTime > st) {
        prevTween = prevTween._prev;
      }
    }

    if (prevTween) {
      child._next = prevTween._next;
      prevTween._next = child;
    } else {
      child._next = this._first;
      this._first = child;
    }

    if (child._next) {
      child._next._prev = child;
    } else {
      this._last = child;
    }

    child._prev = prevTween;
    this._recent = child;

    if (this._timeline) {
      this._uncache(true);
    }

    return this;
  };

  p._remove = function (tween, skipDisable) {
    if (tween.timeline === this) {
      if (!skipDisable) {
        tween._enabled(false, true);
      }

      if (tween._prev) {
        tween._prev._next = tween._next;
      } else if (this._first === tween) {
        this._first = tween._next;
      }

      if (tween._next) {
        tween._next._prev = tween._prev;
      } else if (this._last === tween) {
        this._last = tween._prev;
      }

      tween._next = tween._prev = tween.timeline = null;

      if (tween === this._recent) {
        this._recent = this._last;
      }

      if (this._timeline) {
        this._uncache(true);
      }
    }

    return this;
  };

  p.render = function (time, suppressEvents, force) {
    var tween = this._first,
        next;
    this._totalTime = this._time = this._rawPrevTime = time;

    while (tween) {
      next = tween._next; //record it here because the value could change after rendering...

      if (tween._active || time >= tween._startTime && !tween._paused && !tween._gc) {
        if (!tween._reversed) {
          tween.render((time - tween._startTime) * tween._timeScale, suppressEvents, force);
        } else {
          tween.render((!tween._dirty ? tween._totalDuration : tween.totalDuration()) - (time - tween._startTime) * tween._timeScale, suppressEvents, force);
        }
      }

      tween = next;
    }
  };

  p.rawTime = function () {
    if (!_tickerActive) {
      _ticker.wake();
    }

    return this._totalTime;
  };
  /*
   * ----------------------------------------------------------------
   * TweenLite
   * ----------------------------------------------------------------
   */


  var TweenLite = _class("TweenLite", function (target, duration, vars) {
    Animation.call(this, duration, vars);
    this.render = TweenLite.prototype.render; //speed optimization (avoid prototype lookup on this "hot" method)

    if (target == null) {
      throw "Cannot tween a null target.";
    }

    this.target = target = typeof target !== "string" ? target : TweenLite.selector(target) || target;
    var isSelector = target.jquery || target.length && target !== window && target[0] && (target[0] === window || target[0].nodeType && target[0].style && !target.nodeType),
        overwrite = this.vars.overwrite,
        i,
        targ,
        targets;
    this._overwrite = overwrite = overwrite == null ? _overwriteLookup[TweenLite.defaultOverwrite] : typeof overwrite === "number" ? overwrite >> 0 : _overwriteLookup[overwrite];

    if ((isSelector || target instanceof Array || target.push && _isArray(target)) && typeof target[0] !== "number") {
      this._targets = targets = _slice(target); //don't use Array.prototype.slice.call(target, 0) because that doesn't work in IE8 with a NodeList that's returned by querySelectorAll()

      this._propLookup = [];
      this._siblings = [];

      for (i = 0; i < targets.length; i++) {
        targ = targets[i];

        if (!targ) {
          targets.splice(i--, 1);
          continue;
        } else if (typeof targ === "string") {
          targ = targets[i--] = TweenLite.selector(targ); //in case it's an array of strings

          if (typeof targ === "string") {
            targets.splice(i + 1, 1); //to avoid an endless loop (can't imagine why the selector would return a string, but just in case)
          }

          continue;
        } else if (targ.length && targ !== window && targ[0] && (targ[0] === window || targ[0].nodeType && targ[0].style && !targ.nodeType)) {
          //in case the user is passing in an array of selector objects (like jQuery objects), we need to check one more level and pull things out if necessary. Also note that <select> elements pass all the criteria regarding length and the first child having style, so we must also check to ensure the target isn't an HTML node itself.
          targets.splice(i--, 1);
          this._targets = targets = targets.concat(_slice(targ));
          continue;
        }

        this._siblings[i] = _register(targ, this, false);
        if (overwrite === 1) if (this._siblings[i].length > 1) {
          _applyOverwrite(targ, this, null, 1, this._siblings[i]);
        }
      }
    } else {
      this._propLookup = {};
      this._siblings = _register(target, this, false);
      if (overwrite === 1) if (this._siblings.length > 1) {
        _applyOverwrite(target, this, null, 1, this._siblings);
      }
    }

    if (this.vars.immediateRender || duration === 0 && this._delay === 0 && this.vars.immediateRender !== false) {
      this._time = -_tinyNum; //forces a render without having to set the render() "force" parameter to true because we want to allow lazying by default (using the "force" parameter always forces an immediate full render)

      this.render(Math.min(0, -this._delay)); //in case delay is negative
    }
  }, true),
      _isSelector = function _isSelector(v) {
    return v && v.length && v !== window && v[0] && (v[0] === window || v[0].nodeType && v[0].style && !v.nodeType); //we cannot check "nodeType" if the target is window from within an iframe, otherwise it will trigger a security error in some browsers like Firefox.
  },
      _autoCSS = function _autoCSS(vars, target) {
    var css = {},
        p;

    for (p in vars) {
      if (!_reservedProps[p] && (!(p in target) || p === "transform" || p === "x" || p === "y" || p === "width" || p === "height" || p === "className" || p === "border") && (!_plugins[p] || _plugins[p] && _plugins[p]._autoCSS)) {
        //note: <img> elements contain read-only "x" and "y" properties. We should also prioritize editing css width/height rather than the element's properties.
        css[p] = vars[p];
        delete vars[p];
      }
    }

    vars.css = css;
  };

  p = TweenLite.prototype = new Animation();
  p.constructor = TweenLite;
  p.kill()._gc = false; //----TweenLite defaults, overwrite management, and root updates ----------------------------------------------------

  p.ratio = 0;
  p._firstPT = p._targets = p._overwrittenProps = p._startAt = null;
  p._notifyPluginsOfEnabled = p._lazy = false;
  TweenLite.version = "1.20.4";
  TweenLite.defaultEase = p._ease = new Ease(null, null, 1, 1);
  TweenLite.defaultOverwrite = "auto";
  TweenLite.ticker = _ticker;
  TweenLite.autoSleep = 120;

  TweenLite.lagSmoothing = function (threshold, adjustedLag) {
    _ticker.lagSmoothing(threshold, adjustedLag);
  };

  TweenLite.selector = window.$ || window.jQuery || function (e) {
    var selector = window.$ || window.jQuery;

    if (selector) {
      TweenLite.selector = selector;
      return selector(e);
    }

    return typeof _doc === "undefined" ? e : _doc.querySelectorAll ? _doc.querySelectorAll(e) : _doc.getElementById(e.charAt(0) === "#" ? e.substr(1) : e);
  };

  var _lazyTweens = [],
      _lazyLookup = {},
      _numbersExp = /(?:(-|-=|\+=)?\d*\.?\d*(?:e[\-+]?\d+)?)[0-9]/ig,
      _relExp = /[\+-]=-?[\.\d]/,
      //_nonNumbersExp = /(?:([\-+](?!(\d|=)))|[^\d\-+=e]|(e(?![\-+][\d])))+/ig,
  _setRatio = function _setRatio(v) {
    var pt = this._firstPT,
        min = 0.000001,
        val;

    while (pt) {
      val = !pt.blob ? pt.c * v + pt.s : v === 1 && this.end != null ? this.end : v ? this.join("") : this.start;

      if (pt.m) {
        val = pt.m(val, this._target || pt.t);
      } else if (val < min) if (val > -min && !pt.blob) {
        //prevents issues with converting very small numbers to strings in the browser
        val = 0;
      }

      if (!pt.f) {
        pt.t[pt.p] = val;
      } else if (pt.fp) {
        pt.t[pt.p](pt.fp, val);
      } else {
        pt.t[pt.p](val);
      }

      pt = pt._next;
    }
  },
      //compares two strings (start/end), finds the numbers that are different and spits back an array representing the whole value but with the changing values isolated as elements. For example, "rgb(0,0,0)" and "rgb(100,50,0)" would become ["rgb(", 0, ",", 50, ",0)"]. Notice it merges the parts that are identical (performance optimization). The array also has a linked list of PropTweens attached starting with _firstPT that contain the tweening data (t, p, s, c, f, etc.). It also stores the starting value as a "start" property so that we can revert to it if/when necessary, like when a tween rewinds fully. If the quantity of numbers differs between the start and end, it will always prioritize the end value(s). The pt parameter is optional - it's for a PropTween that will be appended to the end of the linked list and is typically for actually setting the value after all of the elements have been updated (with array.join("")).
  _blobDif = function _blobDif(start, end, filter, pt) {
    var a = [],
        charIndex = 0,
        s = "",
        color = 0,
        startNums,
        endNums,
        num,
        i,
        l,
        nonNumbers,
        currentNum;
    a.start = start;
    a.end = end;
    start = a[0] = start + ""; //ensure values are strings

    end = a[1] = end + "";

    if (filter) {
      filter(a); //pass an array with the starting and ending values and let the filter do whatever it needs to the values.

      start = a[0];
      end = a[1];
    }

    a.length = 0;
    startNums = start.match(_numbersExp) || [];
    endNums = end.match(_numbersExp) || [];

    if (pt) {
      pt._next = null;
      pt.blob = 1;
      a._firstPT = a._applyPT = pt; //apply last in the linked list (which means inserting it first)
    }

    l = endNums.length;

    for (i = 0; i < l; i++) {
      currentNum = endNums[i];
      nonNumbers = end.substr(charIndex, end.indexOf(currentNum, charIndex) - charIndex);
      s += nonNumbers || !i ? nonNumbers : ","; //note: SVG spec allows omission of comma/space when a negative sign is wedged between two numbers, like 2.5-5.3 instead of 2.5,-5.3 but when tweening, the negative value may switch to positive, so we insert the comma just in case.

      charIndex += nonNumbers.length;

      if (color) {
        //sense rgba() values and round them.
        color = (color + 1) % 5;
      } else if (nonNumbers.substr(-5) === "rgba(") {
        color = 1;
      }

      if (currentNum === startNums[i] || startNums.length <= i) {
        s += currentNum;
      } else {
        if (s) {
          a.push(s);
          s = "";
        }

        num = parseFloat(startNums[i]);
        a.push(num);
        a._firstPT = {
          _next: a._firstPT,
          t: a,
          p: a.length - 1,
          s: num,
          c: (currentNum.charAt(1) === "=" ? parseInt(currentNum.charAt(0) + "1", 10) * parseFloat(currentNum.substr(2)) : parseFloat(currentNum) - num) || 0,
          f: 0,
          m: color && color < 4 ? Math.round : 0
        }; //note: we don't set _prev because we'll never need to remove individual PropTweens from this list.
      }

      charIndex += currentNum.length;
    }

    s += end.substr(charIndex);

    if (s) {
      a.push(s);
    }

    a.setRatio = _setRatio;

    if (_relExp.test(end)) {
      //if the end string contains relative values, delete it so that on the final render (in _setRatio()), we don't actually set it to the string with += or -= characters (forces it to use the calculated value).
      a.end = null;
    }

    return a;
  },
      //note: "funcParam" is only necessary for function-based getters/setters that require an extra parameter like getAttribute("width") and setAttribute("width", value). In this example, funcParam would be "width". Used by AttrPlugin for example.
  _addPropTween = function _addPropTween(target, prop, start, end, overwriteProp, mod, funcParam, stringFilter, index) {
    if (typeof end === "function") {
      end = end(index || 0, target);
    }

    var type = _typeof(target[prop]),
        getterName = type !== "function" ? "" : prop.indexOf("set") || typeof target["get" + prop.substr(3)] !== "function" ? prop : "get" + prop.substr(3),
        s = start !== "get" ? start : !getterName ? target[prop] : funcParam ? target[getterName](funcParam) : target[getterName](),
        isRelative = typeof end === "string" && end.charAt(1) === "=",
        pt = {
      t: target,
      p: prop,
      s: s,
      f: type === "function",
      pg: 0,
      n: overwriteProp || prop,
      m: !mod ? 0 : typeof mod === "function" ? mod : Math.round,
      pr: 0,
      c: isRelative ? parseInt(end.charAt(0) + "1", 10) * parseFloat(end.substr(2)) : parseFloat(end) - s || 0
    },
        blob;

    if (typeof s !== "number" || typeof end !== "number" && !isRelative) {
      if (funcParam || isNaN(s) || !isRelative && isNaN(end) || typeof s === "boolean" || typeof end === "boolean") {
        //a blob (string that has multiple numbers in it)
        pt.fp = funcParam;
        blob = _blobDif(s, isRelative ? parseFloat(pt.s) + pt.c + (pt.s + "").replace(/[0-9\-\.]/g, "") : end, stringFilter || TweenLite.defaultStringFilter, pt);
        pt = {
          t: blob,
          p: "setRatio",
          s: 0,
          c: 1,
          f: 2,
          pg: 0,
          n: overwriteProp || prop,
          pr: 0,
          m: 0
        }; //"2" indicates it's a Blob property tween. Needed for RoundPropsPlugin for example.
      } else {
        pt.s = parseFloat(s);

        if (!isRelative) {
          pt.c = parseFloat(end) - pt.s || 0;
        }
      }
    }

    if (pt.c) {
      //only add it to the linked list if there's a change.
      if (pt._next = this._firstPT) {
        pt._next._prev = pt;
      }

      this._firstPT = pt;
      return pt;
    }
  },
      _internals = TweenLite._internals = {
    isArray: _isArray,
    isSelector: _isSelector,
    lazyTweens: _lazyTweens,
    blobDif: _blobDif
  },
      //gives us a way to expose certain private values to other GreenSock classes without contaminating tha main TweenLite object.
  _plugins = TweenLite._plugins = {},
      _tweenLookup = _internals.tweenLookup = {},
      _tweenLookupNum = 0,
      _reservedProps = _internals.reservedProps = {
    ease: 1,
    delay: 1,
    overwrite: 1,
    onComplete: 1,
    onCompleteParams: 1,
    onCompleteScope: 1,
    useFrames: 1,
    runBackwards: 1,
    startAt: 1,
    onUpdate: 1,
    onUpdateParams: 1,
    onUpdateScope: 1,
    onStart: 1,
    onStartParams: 1,
    onStartScope: 1,
    onReverseComplete: 1,
    onReverseCompleteParams: 1,
    onReverseCompleteScope: 1,
    onRepeat: 1,
    onRepeatParams: 1,
    onRepeatScope: 1,
    easeParams: 1,
    yoyo: 1,
    immediateRender: 1,
    repeat: 1,
    repeatDelay: 1,
    data: 1,
    paused: 1,
    reversed: 1,
    autoCSS: 1,
    lazy: 1,
    onOverwrite: 1,
    callbackScope: 1,
    stringFilter: 1,
    id: 1,
    yoyoEase: 1
  },
      _overwriteLookup = {
    none: 0,
    all: 1,
    auto: 2,
    concurrent: 3,
    allOnStart: 4,
    preexisting: 5,
    "true": 1,
    "false": 0
  },
      _rootFramesTimeline = Animation._rootFramesTimeline = new SimpleTimeline(),
      _rootTimeline = Animation._rootTimeline = new SimpleTimeline(),
      _nextGCFrame = 30,
      _lazyRender = _internals.lazyRender = function () {
    var i = _lazyTweens.length,
        tween;
    _lazyLookup = {};

    while (--i > -1) {
      tween = _lazyTweens[i];

      if (tween && tween._lazy !== false) {
        tween.render(tween._lazy[0], tween._lazy[1], true);
        tween._lazy = false;
      }
    }

    _lazyTweens.length = 0;
  };

  _rootTimeline._startTime = _ticker.time;
  _rootFramesTimeline._startTime = _ticker.frame;
  _rootTimeline._active = _rootFramesTimeline._active = true;
  setTimeout(_lazyRender, 1); //on some mobile devices, there isn't a "tick" before code runs which means any lazy renders wouldn't run before the next official "tick".

  Animation._updateRoot = TweenLite.render = function () {
    var i, a, p;

    if (_lazyTweens.length) {
      //if code is run outside of the requestAnimationFrame loop, there may be tweens queued AFTER the engine refreshed, so we need to ensure any pending renders occur before we refresh again.
      _lazyRender();
    }

    _rootTimeline.render((_ticker.time - _rootTimeline._startTime) * _rootTimeline._timeScale, false, false);

    _rootFramesTimeline.render((_ticker.frame - _rootFramesTimeline._startTime) * _rootFramesTimeline._timeScale, false, false);

    if (_lazyTweens.length) {
      _lazyRender();
    }

    if (_ticker.frame >= _nextGCFrame) {
      //dump garbage every 120 frames or whatever the user sets TweenLite.autoSleep to
      _nextGCFrame = _ticker.frame + (parseInt(TweenLite.autoSleep, 10) || 120);

      for (p in _tweenLookup) {
        a = _tweenLookup[p].tweens;
        i = a.length;

        while (--i > -1) {
          if (a[i]._gc) {
            a.splice(i, 1);
          }
        }

        if (a.length === 0) {
          delete _tweenLookup[p];
        }
      } //if there are no more tweens in the root timelines, or if they're all paused, make the _timer sleep to reduce load on the CPU slightly


      p = _rootTimeline._first;
      if (!p || p._paused) if (TweenLite.autoSleep && !_rootFramesTimeline._first && _ticker._listeners.tick.length === 1) {
        while (p && p._paused) {
          p = p._next;
        }

        if (!p) {
          _ticker.sleep();
        }
      }
    }
  };

  _ticker.addEventListener("tick", Animation._updateRoot);

  var _register = function _register(target, tween, scrub) {
    var id = target._gsTweenID,
        a,
        i;

    if (!_tweenLookup[id || (target._gsTweenID = id = "t" + _tweenLookupNum++)]) {
      _tweenLookup[id] = {
        target: target,
        tweens: []
      };
    }

    if (tween) {
      a = _tweenLookup[id].tweens;
      a[i = a.length] = tween;

      if (scrub) {
        while (--i > -1) {
          if (a[i] === tween) {
            a.splice(i, 1);
          }
        }
      }
    }

    return _tweenLookup[id].tweens;
  },
      _onOverwrite = function _onOverwrite(overwrittenTween, overwritingTween, target, killedProps) {
    var func = overwrittenTween.vars.onOverwrite,
        r1,
        r2;

    if (func) {
      r1 = func(overwrittenTween, overwritingTween, target, killedProps);
    }

    func = TweenLite.onOverwrite;

    if (func) {
      r2 = func(overwrittenTween, overwritingTween, target, killedProps);
    }

    return r1 !== false && r2 !== false;
  },
      _applyOverwrite = function _applyOverwrite(target, tween, props, mode, siblings) {
    var i, changed, curTween, l;

    if (mode === 1 || mode >= 4) {
      l = siblings.length;

      for (i = 0; i < l; i++) {
        if ((curTween = siblings[i]) !== tween) {
          if (!curTween._gc) {
            if (curTween._kill(null, target, tween)) {
              changed = true;
            }
          }
        } else if (mode === 5) {
          break;
        }
      }

      return changed;
    } //NOTE: Add 0.0000000001 to overcome floating point errors that can cause the startTime to be VERY slightly off (when a tween's time() is set for example)


    var startTime = tween._startTime + _tinyNum,
        overlaps = [],
        oCount = 0,
        zeroDur = tween._duration === 0,
        globalStart;
    i = siblings.length;

    while (--i > -1) {
      if ((curTween = siblings[i]) === tween || curTween._gc || curTween._paused) {//ignore
      } else if (curTween._timeline !== tween._timeline) {
        globalStart = globalStart || _checkOverlap(tween, 0, zeroDur);

        if (_checkOverlap(curTween, globalStart, zeroDur) === 0) {
          overlaps[oCount++] = curTween;
        }
      } else if (curTween._startTime <= startTime) if (curTween._startTime + curTween.totalDuration() / curTween._timeScale > startTime) if (!((zeroDur || !curTween._initted) && startTime - curTween._startTime <= 0.0000000002)) {
        overlaps[oCount++] = curTween;
      }
    }

    i = oCount;

    while (--i > -1) {
      curTween = overlaps[i];
      if (mode === 2) if (curTween._kill(props, target, tween)) {
        changed = true;
      }

      if (mode !== 2 || !curTween._firstPT && curTween._initted) {
        if (mode !== 2 && !_onOverwrite(curTween, tween)) {
          continue;
        }

        if (curTween._enabled(false, false)) {
          //if all property tweens have been overwritten, kill the tween.
          changed = true;
        }
      }
    }

    return changed;
  },
      _checkOverlap = function _checkOverlap(tween, reference, zeroDur) {
    var tl = tween._timeline,
        ts = tl._timeScale,
        t = tween._startTime;

    while (tl._timeline) {
      t += tl._startTime;
      ts *= tl._timeScale;

      if (tl._paused) {
        return -100;
      }

      tl = tl._timeline;
    }

    t /= ts;
    return t > reference ? t - reference : zeroDur && t === reference || !tween._initted && t - reference < 2 * _tinyNum ? _tinyNum : (t += tween.totalDuration() / tween._timeScale / ts) > reference + _tinyNum ? 0 : t - reference - _tinyNum;
  }; //---- TweenLite instance methods -----------------------------------------------------------------------------


  p._init = function () {
    var v = this.vars,
        op = this._overwrittenProps,
        dur = this._duration,
        immediate = !!v.immediateRender,
        ease = v.ease,
        i,
        initPlugins,
        pt,
        p,
        startVars,
        l;

    if (v.startAt) {
      if (this._startAt) {
        this._startAt.render(-1, true); //if we've run a startAt previously (when the tween instantiated), we should revert it so that the values re-instantiate correctly particularly for relative tweens. Without this, a TweenLite.fromTo(obj, 1, {x:"+=100"}, {x:"-=100"}), for example, would actually jump to +=200 because the startAt would run twice, doubling the relative change.


        this._startAt.kill();
      }

      startVars = {};

      for (p in v.startAt) {
        //copy the properties/values into a new object to avoid collisions, like var to = {x:0}, from = {x:500}; timeline.fromTo(e, 1, from, to).fromTo(e, 1, to, from);
        startVars[p] = v.startAt[p];
      }

      startVars.data = "isStart";
      startVars.overwrite = false;
      startVars.immediateRender = true;
      startVars.lazy = immediate && v.lazy !== false;
      startVars.startAt = startVars.delay = null; //no nesting of startAt objects allowed (otherwise it could cause an infinite loop).

      startVars.onUpdate = v.onUpdate;
      startVars.onUpdateParams = v.onUpdateParams;
      startVars.onUpdateScope = v.onUpdateScope || v.callbackScope || this;
      this._startAt = TweenLite.to(this.target, 0, startVars);

      if (immediate) {
        if (this._time > 0) {
          this._startAt = null; //tweens that render immediately (like most from() and fromTo() tweens) shouldn't revert when their parent timeline's playhead goes backward past the startTime because the initial render could have happened anytime and it shouldn't be directly correlated to this tween's startTime. Imagine setting up a complex animation where the beginning states of various objects are rendered immediately but the tween doesn't happen for quite some time - if we revert to the starting values as soon as the playhead goes backward past the tween's startTime, it will throw things off visually. Reversion should only happen in TimelineLite/Max instances where immediateRender was false (which is the default in the convenience methods like from()).
        } else if (dur !== 0) {
          return; //we skip initialization here so that overwriting doesn't occur until the tween actually begins. Otherwise, if you create several immediateRender:true tweens of the same target/properties to drop into a TimelineLite or TimelineMax, the last one created would overwrite the first ones because they didn't get placed into the timeline yet before the first render occurs and kicks in overwriting.
        }
      }
    } else if (v.runBackwards && dur !== 0) {
      //from() tweens must be handled uniquely: their beginning values must be rendered but we don't want overwriting to occur yet (when time is still 0). Wait until the tween actually begins before doing all the routines like overwriting. At that time, we should render at the END of the tween to ensure that things initialize correctly (remember, from() tweens go backwards)
      if (this._startAt) {
        this._startAt.render(-1, true);

        this._startAt.kill();

        this._startAt = null;
      } else {
        if (this._time !== 0) {
          //in rare cases (like if a from() tween runs and then is invalidate()-ed), immediateRender could be true but the initial forced-render gets skipped, so there's no need to force the render in this context when the _time is greater than 0
          immediate = false;
        }

        pt = {};

        for (p in v) {
          //copy props into a new object and skip any reserved props, otherwise onComplete or onUpdate or onStart could fire. We should, however, permit autoCSS to go through.
          if (!_reservedProps[p] || p === "autoCSS") {
            pt[p] = v[p];
          }
        }

        pt.overwrite = 0;
        pt.data = "isFromStart"; //we tag the tween with as "isFromStart" so that if [inside a plugin] we need to only do something at the very END of a tween, we have a way of identifying this tween as merely the one that's setting the beginning values for a "from()" tween. For example, clearProps in CSSPlugin should only get applied at the very END of a tween and without this tag, from(...{height:100, clearProps:"height", delay:1}) would wipe the height at the beginning of the tween and after 1 second, it'd kick back in.

        pt.lazy = immediate && v.lazy !== false;
        pt.immediateRender = immediate; //zero-duration tweens render immediately by default, but if we're not specifically instructed to render this tween immediately, we should skip this and merely _init() to record the starting values (rendering them immediately would push them to completion which is wasteful in that case - we'd have to render(-1) immediately after)

        this._startAt = TweenLite.to(this.target, 0, pt);

        if (!immediate) {
          this._startAt._init(); //ensures that the initial values are recorded


          this._startAt._enabled(false); //no need to have the tween render on the next cycle. Disable it because we'll always manually control the renders of the _startAt tween.


          if (this.vars.immediateRender) {
            this._startAt = null;
          }
        } else if (this._time === 0) {
          return;
        }
      }
    }

    this._ease = ease = !ease ? TweenLite.defaultEase : ease instanceof Ease ? ease : typeof ease === "function" ? new Ease(ease, v.easeParams) : _easeMap[ease] || TweenLite.defaultEase;

    if (v.easeParams instanceof Array && ease.config) {
      this._ease = ease.config.apply(ease, v.easeParams);
    }

    this._easeType = this._ease._type;
    this._easePower = this._ease._power;
    this._firstPT = null;

    if (this._targets) {
      l = this._targets.length;

      for (i = 0; i < l; i++) {
        if (this._initProps(this._targets[i], this._propLookup[i] = {}, this._siblings[i], op ? op[i] : null, i)) {
          initPlugins = true;
        }
      }
    } else {
      initPlugins = this._initProps(this.target, this._propLookup, this._siblings, op, 0);
    }

    if (initPlugins) {
      TweenLite._onPluginEvent("_onInitAllProps", this); //reorders the array in order of priority. Uses a static TweenPlugin method in order to minimize file size in TweenLite

    }

    if (op) if (!this._firstPT) if (typeof this.target !== "function") {
      //if all tweening properties have been overwritten, kill the tween. If the target is a function, it's probably a delayedCall so let it live.
      this._enabled(false, false);
    }

    if (v.runBackwards) {
      pt = this._firstPT;

      while (pt) {
        pt.s += pt.c;
        pt.c = -pt.c;
        pt = pt._next;
      }
    }

    this._onUpdate = v.onUpdate;
    this._initted = true;
  };

  p._initProps = function (target, propLookup, siblings, overwrittenProps, index) {
    var p, i, initPlugins, plugin, pt, v;

    if (target == null) {
      return false;
    }

    if (_lazyLookup[target._gsTweenID]) {
      _lazyRender(); //if other tweens of the same target have recently initted but haven't rendered yet, we've got to force the render so that the starting values are correct (imagine populating a timeline with a bunch of sequential tweens and then jumping to the end)

    }

    if (!this.vars.css) if (target.style) if (target !== window && target.nodeType) if (_plugins.css) if (this.vars.autoCSS !== false) {
      //it's so common to use TweenLite/Max to animate the css of DOM elements, we assume that if the target is a DOM element, that's what is intended (a convenience so that users don't have to wrap things in css:{}, although we still recommend it for a slight performance boost and better specificity). Note: we cannot check "nodeType" on the window inside an iframe.
      _autoCSS(this.vars, target);
    }

    for (p in this.vars) {
      v = this.vars[p];

      if (_reservedProps[p]) {
        if (v) if (v instanceof Array || v.push && _isArray(v)) if (v.join("").indexOf("{self}") !== -1) {
          this.vars[p] = v = this._swapSelfInParams(v, this);
        }
      } else if (_plugins[p] && (plugin = new _plugins[p]())._onInitTween(target, this.vars[p], this, index)) {
        //t - target 		[object]
        //p - property 		[string]
        //s - start			[number]
        //c - change		[number]
        //f - isFunction	[boolean]
        //n - name			[string]
        //pg - isPlugin 	[boolean]
        //pr - priority		[number]
        //m - mod           [function | 0]
        this._firstPT = pt = {
          _next: this._firstPT,
          t: plugin,
          p: "setRatio",
          s: 0,
          c: 1,
          f: 1,
          n: p,
          pg: 1,
          pr: plugin._priority,
          m: 0
        };
        i = plugin._overwriteProps.length;

        while (--i > -1) {
          propLookup[plugin._overwriteProps[i]] = this._firstPT;
        }

        if (plugin._priority || plugin._onInitAllProps) {
          initPlugins = true;
        }

        if (plugin._onDisable || plugin._onEnable) {
          this._notifyPluginsOfEnabled = true;
        }

        if (pt._next) {
          pt._next._prev = pt;
        }
      } else {
        propLookup[p] = _addPropTween.call(this, target, p, "get", v, p, 0, null, this.vars.stringFilter, index);
      }
    }

    if (overwrittenProps) if (this._kill(overwrittenProps, target)) {
      //another tween may have tried to overwrite properties of this tween before init() was called (like if two tweens start at the same time, the one created second will run first)
      return this._initProps(target, propLookup, siblings, overwrittenProps, index);
    }
    if (this._overwrite > 1) if (this._firstPT) if (siblings.length > 1) if (_applyOverwrite(target, this, propLookup, this._overwrite, siblings)) {
      this._kill(propLookup, target);

      return this._initProps(target, propLookup, siblings, overwrittenProps, index);
    }
    if (this._firstPT) if (this.vars.lazy !== false && this._duration || this.vars.lazy && !this._duration) {
      //zero duration tweens don't lazy render by default; everything else does.
      _lazyLookup[target._gsTweenID] = true;
    }
    return initPlugins;
  };

  p.render = function (time, suppressEvents, force) {
    var prevTime = this._time,
        duration = this._duration,
        prevRawPrevTime = this._rawPrevTime,
        isComplete,
        callback,
        pt,
        rawPrevTime;

    if (time >= duration - 0.0000001 && time >= 0) {
      //to work around occasional floating point math artifacts.
      this._totalTime = this._time = duration;
      this.ratio = this._ease._calcEnd ? this._ease.getRatio(1) : 1;

      if (!this._reversed) {
        isComplete = true;
        callback = "onComplete";
        force = force || this._timeline.autoRemoveChildren; //otherwise, if the animation is unpaused/activated after it's already finished, it doesn't get removed from the parent timeline.
      }

      if (duration === 0) if (this._initted || !this.vars.lazy || force) {
        //zero-duration tweens are tricky because we must discern the momentum/direction of time in order to determine whether the starting values should be rendered or the ending values. If the "playhead" of its timeline goes past the zero-duration tween in the forward direction or lands directly on it, the end values should be rendered, but if the timeline's "playhead" moves past it in the backward direction (from a postitive time to a negative time), the starting values must be rendered.
        if (this._startTime === this._timeline._duration) {
          //if a zero-duration tween is at the VERY end of a timeline and that timeline renders at its end, it will typically add a tiny bit of cushion to the render time to prevent rounding errors from getting in the way of tweens rendering their VERY end. If we then reverse() that timeline, the zero-duration tween will trigger its onReverseComplete even though technically the playhead didn't pass over it again. It's a very specific edge case we must accommodate.
          time = 0;
        }

        if (prevRawPrevTime < 0 || time <= 0 && time >= -0.0000001 || prevRawPrevTime === _tinyNum && this.data !== "isPause") if (prevRawPrevTime !== time) {
          //note: when this.data is "isPause", it's a callback added by addPause() on a timeline that we should not be triggered when LEAVING its exact start time. In other words, tl.addPause(1).play(1) shouldn't pause.
          force = true;

          if (prevRawPrevTime > _tinyNum) {
            callback = "onReverseComplete";
          }
        }
        this._rawPrevTime = rawPrevTime = !suppressEvents || time || prevRawPrevTime === time ? time : _tinyNum; //when the playhead arrives at EXACTLY time 0 (right on top) of a zero-duration tween, we need to discern if events are suppressed so that when the playhead moves again (next time), it'll trigger the callback. If events are NOT suppressed, obviously the callback would be triggered in this render. Basically, the callback should fire either when the playhead ARRIVES or LEAVES this exact spot, not both. Imagine doing a timeline.seek(0) and there's a callback that sits at 0. Since events are suppressed on that seek() by default, nothing will fire, but when the playhead moves off of that position, the callback should fire. This behavior is what people intuitively expect. We set the _rawPrevTime to be a precise tiny number to indicate this scenario rather than using another property/variable which would increase memory usage. This technique is less readable, but more efficient.
      }
    } else if (time < 0.0000001) {
      //to work around occasional floating point math artifacts, round super small values to 0.
      this._totalTime = this._time = 0;
      this.ratio = this._ease._calcEnd ? this._ease.getRatio(0) : 0;

      if (prevTime !== 0 || duration === 0 && prevRawPrevTime > 0) {
        callback = "onReverseComplete";
        isComplete = this._reversed;
      }

      if (time < 0) {
        this._active = false;
        if (duration === 0) if (this._initted || !this.vars.lazy || force) {
          //zero-duration tweens are tricky because we must discern the momentum/direction of time in order to determine whether the starting values should be rendered or the ending values. If the "playhead" of its timeline goes past the zero-duration tween in the forward direction or lands directly on it, the end values should be rendered, but if the timeline's "playhead" moves past it in the backward direction (from a postitive time to a negative time), the starting values must be rendered.
          if (prevRawPrevTime >= 0 && !(prevRawPrevTime === _tinyNum && this.data === "isPause")) {
            force = true;
          }

          this._rawPrevTime = rawPrevTime = !suppressEvents || time || prevRawPrevTime === time ? time : _tinyNum; //when the playhead arrives at EXACTLY time 0 (right on top) of a zero-duration tween, we need to discern if events are suppressed so that when the playhead moves again (next time), it'll trigger the callback. If events are NOT suppressed, obviously the callback would be triggered in this render. Basically, the callback should fire either when the playhead ARRIVES or LEAVES this exact spot, not both. Imagine doing a timeline.seek(0) and there's a callback that sits at 0. Since events are suppressed on that seek() by default, nothing will fire, but when the playhead moves off of that position, the callback should fire. This behavior is what people intuitively expect. We set the _rawPrevTime to be a precise tiny number to indicate this scenario rather than using another property/variable which would increase memory usage. This technique is less readable, but more efficient.
        }
      }

      if (!this._initted || this._startAt && this._startAt.progress()) {
        //if we render the very beginning (time == 0) of a fromTo(), we must force the render (normal tweens wouldn't need to render at a time of 0 when the prevTime was also 0). This is also mandatory to make sure overwriting kicks in immediately. Also, we check progress() because if startAt has already rendered at its end, we should force a render at its beginning. Otherwise, if you put the playhead directly on top of where a fromTo({immediateRender:false}) starts, and then move it backwards, the from() won't revert its values.
        force = true;
      }
    } else {
      this._totalTime = this._time = time;

      if (this._easeType) {
        var r = time / duration,
            type = this._easeType,
            pow = this._easePower;

        if (type === 1 || type === 3 && r >= 0.5) {
          r = 1 - r;
        }

        if (type === 3) {
          r *= 2;
        }

        if (pow === 1) {
          r *= r;
        } else if (pow === 2) {
          r *= r * r;
        } else if (pow === 3) {
          r *= r * r * r;
        } else if (pow === 4) {
          r *= r * r * r * r;
        }

        if (type === 1) {
          this.ratio = 1 - r;
        } else if (type === 2) {
          this.ratio = r;
        } else if (time / duration < 0.5) {
          this.ratio = r / 2;
        } else {
          this.ratio = 1 - r / 2;
        }
      } else {
        this.ratio = this._ease.getRatio(time / duration);
      }
    }

    if (this._time === prevTime && !force) {
      return;
    } else if (!this._initted) {
      this._init();

      if (!this._initted || this._gc) {
        //immediateRender tweens typically won't initialize until the playhead advances (_time is greater than 0) in order to ensure that overwriting occurs properly. Also, if all of the tweening properties have been overwritten (which would cause _gc to be true, as set in _init()), we shouldn't continue otherwise an onStart callback could be called for example.
        return;
      } else if (!force && this._firstPT && (this.vars.lazy !== false && this._duration || this.vars.lazy && !this._duration)) {
        this._time = this._totalTime = prevTime;
        this._rawPrevTime = prevRawPrevTime;

        _lazyTweens.push(this);

        this._lazy = [time, suppressEvents];
        return;
      } //_ease is initially set to defaultEase, so now that init() has run, _ease is set properly and we need to recalculate the ratio. Overall this is faster than using conditional logic earlier in the method to avoid having to set ratio twice because we only init() once but renderTime() gets called VERY frequently.


      if (this._time && !isComplete) {
        this.ratio = this._ease.getRatio(this._time / duration);
      } else if (isComplete && this._ease._calcEnd) {
        this.ratio = this._ease.getRatio(this._time === 0 ? 0 : 1);
      }
    }

    if (this._lazy !== false) {
      //in case a lazy render is pending, we should flush it because the new render is occurring now (imagine a lazy tween instantiating and then immediately the user calls tween.seek(tween.duration()), skipping to the end - the end render would be forced, and then if we didn't flush the lazy render, it'd fire AFTER the seek(), rendering it at the wrong time.
      this._lazy = false;
    }

    if (!this._active) if (!this._paused && this._time !== prevTime && time >= 0) {
      this._active = true; //so that if the user renders a tween (as opposed to the timeline rendering it), the timeline is forced to re-render and align it with the proper time/frame on the next rendering cycle. Maybe the tween already finished but the user manually re-renders it as halfway done.
    }

    if (prevTime === 0) {
      if (this._startAt) {
        if (time >= 0) {
          this._startAt.render(time, true, force);
        } else if (!callback) {
          callback = "_dummyGS"; //if no callback is defined, use a dummy value just so that the condition at the end evaluates as true because _startAt should render AFTER the normal render loop when the time is negative. We could handle this in a more intuitive way, of course, but the render loop is the MOST important thing to optimize, so this technique allows us to avoid adding extra conditional logic in a high-frequency area.
        }
      }

      if (this.vars.onStart) if (this._time !== 0 || duration === 0) if (!suppressEvents) {
        this._callback("onStart");
      }
    }

    pt = this._firstPT;

    while (pt) {
      if (pt.f) {
        pt.t[pt.p](pt.c * this.ratio + pt.s);
      } else {
        pt.t[pt.p] = pt.c * this.ratio + pt.s;
      }

      pt = pt._next;
    }

    if (this._onUpdate) {
      if (time < 0) if (this._startAt && time !== -0.0001) {
        //if the tween is positioned at the VERY beginning (_startTime 0) of its parent timeline, it's illegal for the playhead to go back further, so we should not render the recorded startAt values.
        this._startAt.render(time, true, force); //note: for performance reasons, we tuck this conditional logic inside less traveled areas (most tweens don't have an onUpdate). We'd just have it at the end before the onComplete, but the values should be updated before any onUpdate is called, so we ALSO put it here and then if it's not called, we do so later near the onComplete.

      }
      if (!suppressEvents) if (this._time !== prevTime || isComplete || force) {
        this._callback("onUpdate");
      }
    }

    if (callback) if (!this._gc || force) {
      //check _gc because there's a chance that kill() could be called in an onUpdate
      if (time < 0 && this._startAt && !this._onUpdate && time !== -0.0001) {
        //-0.0001 is a special value that we use when looping back to the beginning of a repeated TimelineMax, in which case we shouldn't render the _startAt values.
        this._startAt.render(time, true, force);
      }

      if (isComplete) {
        if (this._timeline.autoRemoveChildren) {
          this._enabled(false, false);
        }

        this._active = false;
      }

      if (!suppressEvents && this.vars[callback]) {
        this._callback(callback);
      }

      if (duration === 0 && this._rawPrevTime === _tinyNum && rawPrevTime !== _tinyNum) {
        //the onComplete or onReverseComplete could trigger movement of the playhead and for zero-duration tweens (which must discern direction) that land directly back on their start time, we don't want to fire again on the next render. Think of several addPause()'s in a timeline that forces the playhead to a certain spot, but what if it's already paused and another tween is tweening the "time" of the timeline? Each time it moves [forward] past that spot, it would move back, and since suppressEvents is true, it'd reset _rawPrevTime to _tinyNum so that when it begins again, the callback would fire (so ultimately it could bounce back and forth during that tween). Again, this is a very uncommon scenario, but possible nonetheless.
        this._rawPrevTime = 0;
      }
    }
  };

  p._kill = function (vars, target, overwritingTween) {
    if (vars === "all") {
      vars = null;
    }

    if (vars == null) if (target == null || target === this.target) {
      this._lazy = false;
      return this._enabled(false, false);
    }
    target = typeof target !== "string" ? target || this._targets || this.target : TweenLite.selector(target) || target;
    var simultaneousOverwrite = overwritingTween && this._time && overwritingTween._startTime === this._startTime && this._timeline === overwritingTween._timeline,
        i,
        overwrittenProps,
        p,
        pt,
        propLookup,
        changed,
        killProps,
        record,
        killed;

    if ((_isArray(target) || _isSelector(target)) && typeof target[0] !== "number") {
      i = target.length;

      while (--i > -1) {
        if (this._kill(vars, target[i], overwritingTween)) {
          changed = true;
        }
      }
    } else {
      if (this._targets) {
        i = this._targets.length;

        while (--i > -1) {
          if (target === this._targets[i]) {
            propLookup = this._propLookup[i] || {};
            this._overwrittenProps = this._overwrittenProps || [];
            overwrittenProps = this._overwrittenProps[i] = vars ? this._overwrittenProps[i] || {} : "all";
            break;
          }
        }
      } else if (target !== this.target) {
        return false;
      } else {
        propLookup = this._propLookup;
        overwrittenProps = this._overwrittenProps = vars ? this._overwrittenProps || {} : "all";
      }

      if (propLookup) {
        killProps = vars || propLookup;
        record = vars !== overwrittenProps && overwrittenProps !== "all" && vars !== propLookup && (_typeof(vars) !== "object" || !vars._tempKill); //_tempKill is a super-secret way to delete a particular tweening property but NOT have it remembered as an official overwritten property (like in BezierPlugin)

        if (overwritingTween && (TweenLite.onOverwrite || this.vars.onOverwrite)) {
          for (p in killProps) {
            if (propLookup[p]) {
              if (!killed) {
                killed = [];
              }

              killed.push(p);
            }
          }

          if ((killed || !vars) && !_onOverwrite(this, overwritingTween, target, killed)) {
            //if the onOverwrite returned false, that means the user wants to override the overwriting (cancel it).
            return false;
          }
        }

        for (p in killProps) {
          if (pt = propLookup[p]) {
            if (simultaneousOverwrite) {
              //if another tween overwrites this one and they both start at exactly the same time, yet this tween has already rendered once (for example, at 0.001) because it's first in the queue, we should revert the values to where they were at 0 so that the starting values aren't contaminated on the overwriting tween.
              if (pt.f) {
                pt.t[pt.p](pt.s);
              } else {
                pt.t[pt.p] = pt.s;
              }

              changed = true;
            }

            if (pt.pg && pt.t._kill(killProps)) {
              changed = true; //some plugins need to be notified so they can perform cleanup tasks first
            }

            if (!pt.pg || pt.t._overwriteProps.length === 0) {
              if (pt._prev) {
                pt._prev._next = pt._next;
              } else if (pt === this._firstPT) {
                this._firstPT = pt._next;
              }

              if (pt._next) {
                pt._next._prev = pt._prev;
              }

              pt._next = pt._prev = null;
            }

            delete propLookup[p];
          }

          if (record) {
            overwrittenProps[p] = 1;
          }
        }

        if (!this._firstPT && this._initted) {
          //if all tweening properties are killed, kill the tween. Without this line, if there's a tween with multiple targets and then you killTweensOf() each target individually, the tween would technically still remain active and fire its onComplete even though there aren't any more properties tweening.
          this._enabled(false, false);
        }
      }
    }

    return changed;
  };

  p.invalidate = function () {
    if (this._notifyPluginsOfEnabled) {
      TweenLite._onPluginEvent("_onDisable", this);
    }

    this._firstPT = this._overwrittenProps = this._startAt = this._onUpdate = null;
    this._notifyPluginsOfEnabled = this._active = this._lazy = false;
    this._propLookup = this._targets ? {} : [];
    Animation.prototype.invalidate.call(this);

    if (this.vars.immediateRender) {
      this._time = -_tinyNum; //forces a render without having to set the render() "force" parameter to true because we want to allow lazying by default (using the "force" parameter always forces an immediate full render)

      this.render(Math.min(0, -this._delay)); //in case delay is negative.
    }

    return this;
  };

  p._enabled = function (enabled, ignoreTimeline) {
    if (!_tickerActive) {
      _ticker.wake();
    }

    if (enabled && this._gc) {
      var targets = this._targets,
          i;

      if (targets) {
        i = targets.length;

        while (--i > -1) {
          this._siblings[i] = _register(targets[i], this, true);
        }
      } else {
        this._siblings = _register(this.target, this, true);
      }
    }

    Animation.prototype._enabled.call(this, enabled, ignoreTimeline);

    if (this._notifyPluginsOfEnabled) if (this._firstPT) {
      return TweenLite._onPluginEvent(enabled ? "_onEnable" : "_onDisable", this);
    }
    return false;
  }; //----TweenLite static methods -----------------------------------------------------


  TweenLite.to = function (target, duration, vars) {
    return new TweenLite(target, duration, vars);
  };

  TweenLite.from = function (target, duration, vars) {
    vars.runBackwards = true;
    vars.immediateRender = vars.immediateRender != false;
    return new TweenLite(target, duration, vars);
  };

  TweenLite.fromTo = function (target, duration, fromVars, toVars) {
    toVars.startAt = fromVars;
    toVars.immediateRender = toVars.immediateRender != false && fromVars.immediateRender != false;
    return new TweenLite(target, duration, toVars);
  };

  TweenLite.delayedCall = function (delay, callback, params, scope, useFrames) {
    return new TweenLite(callback, 0, {
      delay: delay,
      onComplete: callback,
      onCompleteParams: params,
      callbackScope: scope,
      onReverseComplete: callback,
      onReverseCompleteParams: params,
      immediateRender: false,
      lazy: false,
      useFrames: useFrames,
      overwrite: 0
    });
  };

  TweenLite.set = function (target, vars) {
    return new TweenLite(target, 0, vars);
  };

  TweenLite.getTweensOf = function (target, onlyActive) {
    if (target == null) {
      return [];
    }

    target = typeof target !== "string" ? target : TweenLite.selector(target) || target;
    var i, a, j, t;

    if ((_isArray(target) || _isSelector(target)) && typeof target[0] !== "number") {
      i = target.length;
      a = [];

      while (--i > -1) {
        a = a.concat(TweenLite.getTweensOf(target[i], onlyActive));
      }

      i = a.length; //now get rid of any duplicates (tweens of arrays of objects could cause duplicates)

      while (--i > -1) {
        t = a[i];
        j = i;

        while (--j > -1) {
          if (t === a[j]) {
            a.splice(i, 1);
          }
        }
      }
    } else if (target._gsTweenID) {
      a = _register(target).concat();
      i = a.length;

      while (--i > -1) {
        if (a[i]._gc || onlyActive && !a[i].isActive()) {
          a.splice(i, 1);
        }
      }
    }

    return a || [];
  };

  TweenLite.killTweensOf = TweenLite.killDelayedCallsTo = function (target, onlyActive, vars) {
    if (_typeof(onlyActive) === "object") {
      vars = onlyActive; //for backwards compatibility (before "onlyActive" parameter was inserted)

      onlyActive = false;
    }

    var a = TweenLite.getTweensOf(target, onlyActive),
        i = a.length;

    while (--i > -1) {
      a[i]._kill(vars, target);
    }
  };
  /*
   * ----------------------------------------------------------------
   * TweenPlugin   (could easily be split out as a separate file/class, but included for ease of use (so that people don't need to include another script call before loading plugins which is easy to forget)
   * ----------------------------------------------------------------
   */


  var TweenPlugin = _class("plugins.TweenPlugin", function (props, priority) {
    this._overwriteProps = (props || "").split(",");
    this._propName = this._overwriteProps[0];
    this._priority = priority || 0;
    this._super = TweenPlugin.prototype;
  }, true);

  p = TweenPlugin.prototype;
  TweenPlugin.version = "1.19.0";
  TweenPlugin.API = 2;
  p._firstPT = null;
  p._addTween = _addPropTween;
  p.setRatio = _setRatio;

  p._kill = function (lookup) {
    var a = this._overwriteProps,
        pt = this._firstPT,
        i;

    if (lookup[this._propName] != null) {
      this._overwriteProps = [];
    } else {
      i = a.length;

      while (--i > -1) {
        if (lookup[a[i]] != null) {
          a.splice(i, 1);
        }
      }
    }

    while (pt) {
      if (lookup[pt.n] != null) {
        if (pt._next) {
          pt._next._prev = pt._prev;
        }

        if (pt._prev) {
          pt._prev._next = pt._next;
          pt._prev = null;
        } else if (this._firstPT === pt) {
          this._firstPT = pt._next;
        }
      }

      pt = pt._next;
    }

    return false;
  };

  p._mod = p._roundProps = function (lookup) {
    var pt = this._firstPT,
        val;

    while (pt) {
      val = lookup[this._propName] || pt.n != null && lookup[pt.n.split(this._propName + "_").join("")];

      if (val && typeof val === "function") {
        //some properties that are very plugin-specific add a prefix named after the _propName plus an underscore, so we need to ignore that extra stuff here.
        if (pt.f === 2) {
          pt.t._applyPT.m = val;
        } else {
          pt.m = val;
        }
      }

      pt = pt._next;
    }
  };

  TweenLite._onPluginEvent = function (type, tween) {
    var pt = tween._firstPT,
        changed,
        pt2,
        first,
        last,
        next;

    if (type === "_onInitAllProps") {
      //sorts the PropTween linked list in order of priority because some plugins need to render earlier/later than others, like MotionBlurPlugin applies its effects after all x/y/alpha tweens have rendered on each frame.
      while (pt) {
        next = pt._next;
        pt2 = first;

        while (pt2 && pt2.pr > pt.pr) {
          pt2 = pt2._next;
        }

        if (pt._prev = pt2 ? pt2._prev : last) {
          pt._prev._next = pt;
        } else {
          first = pt;
        }

        if (pt._next = pt2) {
          pt2._prev = pt;
        } else {
          last = pt;
        }

        pt = next;
      }

      pt = tween._firstPT = first;
    }

    while (pt) {
      if (pt.pg) if (typeof pt.t[type] === "function") if (pt.t[type]()) {
        changed = true;
      }
      pt = pt._next;
    }

    return changed;
  };

  TweenPlugin.activate = function (plugins) {
    var i = plugins.length;

    while (--i > -1) {
      if (plugins[i].API === TweenPlugin.API) {
        _plugins[new plugins[i]()._propName] = plugins[i];
      }
    }

    return true;
  }; //provides a more concise way to define plugins that have no dependencies besides TweenPlugin and TweenLite, wrapping common boilerplate stuff into one function (added in 1.9.0). You don't NEED to use this to define a plugin - the old way still works and can be useful in certain (rare) situations.


  _gsDefine.plugin = function (config) {
    if (!config || !config.propName || !config.init || !config.API) {
      throw "illegal plugin definition.";
    }

    var propName = config.propName,
        priority = config.priority || 0,
        overwriteProps = config.overwriteProps,
        map = {
      init: "_onInitTween",
      set: "setRatio",
      kill: "_kill",
      round: "_mod",
      mod: "_mod",
      initAll: "_onInitAllProps"
    },
        Plugin = _class("plugins." + propName.charAt(0).toUpperCase() + propName.substr(1) + "Plugin", function () {
      TweenPlugin.call(this, propName, priority);
      this._overwriteProps = overwriteProps || [];
    }, config.global === true),
        p = Plugin.prototype = new TweenPlugin(propName),
        prop;

    p.constructor = Plugin;
    Plugin.API = config.API;

    for (prop in map) {
      if (typeof config[prop] === "function") {
        p[map[prop]] = config[prop];
      }
    }

    Plugin.version = config.version;
    TweenPlugin.activate([Plugin]);
    return Plugin;
  }; //now run through all the dependencies discovered and if any are missing, log that to the console as a warning. This is why it's best to have TweenLite load last - it can check all the dependencies for you.


  a = window._gsQueue;

  if (a) {
    for (i = 0; i < a.length; i++) {
      a[i]();
    }

    for (p in _defLookup) {
      if (!_defLookup[p].func) {
        window.console.log("GSAP encountered missing dependency: " + p);
      }
    }
  }

  _tickerActive = false; //ensures that the first official animation forces a ticker.tick() to update the time when it is instantiated
})(typeof module !== "undefined" && module.exports && typeof global !== "undefined" ? global : void 0 || window, "TweenMax");

}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})

},{}],357:[function(require,module,exports){
"use strict";

/*!
 * Determine if an object is a Buffer
 *
 * @author   Feross Aboukhadijeh <https://feross.org>
 * @license  MIT
 */
// The _isBuffer check is for Safari 5-7 support, because it's missing
// Object.prototype.constructor. Remove this eventually
module.exports = function (obj) {
  return obj != null && (isBuffer(obj) || isSlowBuffer(obj) || !!obj._isBuffer);
};

function isBuffer(obj) {
  return !!obj.constructor && typeof obj.constructor.isBuffer === 'function' && obj.constructor.isBuffer(obj);
} // For Node v0.10 support. Remove this eventually.


function isSlowBuffer(obj) {
  return typeof obj.readFloatLE === 'function' && typeof obj.slice === 'function' && isBuffer(obj.slice(0, 0));
}

},{}],358:[function(require,module,exports){
"use strict";

function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }

/*!
 * Masonry v4.2.2
 * Cascading grid layout library
 * https://masonry.desandro.com
 * MIT License
 * by David DeSandro
 */
(function (window, factory) {
  // universal module definition

  /* jshint strict: false */

  /*globals define, module, require */
  if (typeof define == 'function' && define.amd) {
    // AMD
    define(['outlayer/outlayer', 'get-size/get-size'], factory);
  } else if ((typeof module === "undefined" ? "undefined" : _typeof(module)) == 'object' && module.exports) {
    // CommonJS
    module.exports = factory(require('outlayer'), require('get-size'));
  } else {
    // browser global
    window.Masonry = factory(window.Outlayer, window.getSize);
  }
})(window, function factory(Outlayer, getSize) {
  'use strict'; // -------------------------- masonryDefinition -------------------------- //
  // create an Outlayer layout class

  var Masonry = Outlayer.create('masonry'); // isFitWidth -> fitWidth

  Masonry.compatOptions.fitWidth = 'isFitWidth';
  var proto = Masonry.prototype;

  proto._resetLayout = function () {
    this.getSize();

    this._getMeasurement('columnWidth', 'outerWidth');

    this._getMeasurement('gutter', 'outerWidth');

    this.measureColumns(); // reset column Y

    this.colYs = [];

    for (var i = 0; i < this.cols; i++) {
      this.colYs.push(0);
    }

    this.maxY = 0;
    this.horizontalColIndex = 0;
  };

  proto.measureColumns = function () {
    this.getContainerWidth(); // if columnWidth is 0, default to outerWidth of first item

    if (!this.columnWidth) {
      var firstItem = this.items[0];
      var firstItemElem = firstItem && firstItem.element; // columnWidth fall back to item of first element

      this.columnWidth = firstItemElem && getSize(firstItemElem).outerWidth || // if first elem has no width, default to size of container
      this.containerWidth;
    }

    var columnWidth = this.columnWidth += this.gutter; // calculate columns

    var containerWidth = this.containerWidth + this.gutter;
    var cols = containerWidth / columnWidth; // fix rounding errors, typically with gutters

    var excess = columnWidth - containerWidth % columnWidth; // if overshoot is less than a pixel, round up, otherwise floor it

    var mathMethod = excess && excess < 1 ? 'round' : 'floor';
    cols = Math[mathMethod](cols);
    this.cols = Math.max(cols, 1);
  };

  proto.getContainerWidth = function () {
    // container is parent if fit width
    var isFitWidth = this._getOption('fitWidth');

    var container = isFitWidth ? this.element.parentNode : this.element; // check that this.size and size are there
    // IE8 triggers resize on body size change, so they might not be

    var size = getSize(container);
    this.containerWidth = size && size.innerWidth;
  };

  proto._getItemLayoutPosition = function (item) {
    item.getSize(); // how many columns does this brick span

    var remainder = item.size.outerWidth % this.columnWidth;
    var mathMethod = remainder && remainder < 1 ? 'round' : 'ceil'; // round if off by 1 pixel, otherwise use ceil

    var colSpan = Math[mathMethod](item.size.outerWidth / this.columnWidth);
    colSpan = Math.min(colSpan, this.cols); // use horizontal or top column position

    var colPosMethod = this.options.horizontalOrder ? '_getHorizontalColPosition' : '_getTopColPosition';
    var colPosition = this[colPosMethod](colSpan, item); // position the brick

    var position = {
      x: this.columnWidth * colPosition.col,
      y: colPosition.y
    }; // apply setHeight to necessary columns

    var setHeight = colPosition.y + item.size.outerHeight;
    var setMax = colSpan + colPosition.col;

    for (var i = colPosition.col; i < setMax; i++) {
      this.colYs[i] = setHeight;
    }

    return position;
  };

  proto._getTopColPosition = function (colSpan) {
    var colGroup = this._getTopColGroup(colSpan); // get the minimum Y value from the columns


    var minimumY = Math.min.apply(Math, colGroup);
    return {
      col: colGroup.indexOf(minimumY),
      y: minimumY
    };
  };
  /**
   * @param {Number} colSpan - number of columns the element spans
   * @returns {Array} colGroup
   */


  proto._getTopColGroup = function (colSpan) {
    if (colSpan < 2) {
      // if brick spans only one column, use all the column Ys
      return this.colYs;
    }

    var colGroup = []; // how many different places could this brick fit horizontally

    var groupCount = this.cols + 1 - colSpan; // for each group potential horizontal position

    for (var i = 0; i < groupCount; i++) {
      colGroup[i] = this._getColGroupY(i, colSpan);
    }

    return colGroup;
  };

  proto._getColGroupY = function (col, colSpan) {
    if (colSpan < 2) {
      return this.colYs[col];
    } // make an array of colY values for that one group


    var groupColYs = this.colYs.slice(col, col + colSpan); // and get the max value of the array

    return Math.max.apply(Math, groupColYs);
  }; // get column position based on horizontal index. #873


  proto._getHorizontalColPosition = function (colSpan, item) {
    var col = this.horizontalColIndex % this.cols;
    var isOver = colSpan > 1 && col + colSpan > this.cols; // shift to next row if item can't fit on current row

    col = isOver ? 0 : col; // don't let zero-size items take up space

    var hasSize = item.size.outerWidth && item.size.outerHeight;
    this.horizontalColIndex = hasSize ? col + colSpan : this.horizontalColIndex;
    return {
      col: col,
      y: this._getColGroupY(col, colSpan)
    };
  };

  proto._manageStamp = function (stamp) {
    var stampSize = getSize(stamp);

    var offset = this._getElementOffset(stamp); // get the columns that this stamp affects


    var isOriginLeft = this._getOption('originLeft');

    var firstX = isOriginLeft ? offset.left : offset.right;
    var lastX = firstX + stampSize.outerWidth;
    var firstCol = Math.floor(firstX / this.columnWidth);
    firstCol = Math.max(0, firstCol);
    var lastCol = Math.floor(lastX / this.columnWidth); // lastCol should not go over if multiple of columnWidth #425

    lastCol -= lastX % this.columnWidth ? 0 : 1;
    lastCol = Math.min(this.cols - 1, lastCol); // set colYs to bottom of the stamp

    var isOriginTop = this._getOption('originTop');

    var stampMaxY = (isOriginTop ? offset.top : offset.bottom) + stampSize.outerHeight;

    for (var i = firstCol; i <= lastCol; i++) {
      this.colYs[i] = Math.max(stampMaxY, this.colYs[i]);
    }
  };

  proto._getContainerSize = function () {
    this.maxY = Math.max.apply(Math, this.colYs);
    var size = {
      height: this.maxY
    };

    if (this._getOption('fitWidth')) {
      size.width = this._getContainerFitWidth();
    }

    return size;
  };

  proto._getContainerFitWidth = function () {
    var unusedCols = 0; // count unused columns

    var i = this.cols;

    while (--i) {
      if (this.colYs[i] !== 0) {
        break;
      }

      unusedCols++;
    } // fit container to columns that have been used


    return (this.cols - unusedCols) * this.columnWidth - this.gutter;
  };

  proto.needsResizeLayout = function () {
    var previousWidth = this.containerWidth;
    this.getContainerWidth();
    return previousWidth != this.containerWidth;
  };

  return Masonry;
});

},{"get-size":355,"outlayer":360}],359:[function(require,module,exports){
"use strict";

function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }

/**
 * Outlayer Item
 */
(function (window, factory) {
  // universal module definition

  /* jshint strict: false */

  /* globals define, module, require */
  if (typeof define == 'function' && define.amd) {
    // AMD - RequireJS
    define(['ev-emitter/ev-emitter', 'get-size/get-size'], factory);
  } else if ((typeof module === "undefined" ? "undefined" : _typeof(module)) == 'object' && module.exports) {
    // CommonJS - Browserify, Webpack
    module.exports = factory(require('ev-emitter'), require('get-size'));
  } else {
    // browser global
    window.Outlayer = {};
    window.Outlayer.Item = factory(window.EvEmitter, window.getSize);
  }
})(window, function factory(EvEmitter, getSize) {
  'use strict'; // ----- helpers ----- //

  function isEmptyObj(obj) {
    for (var prop in obj) {
      return false;
    }

    prop = null;
    return true;
  } // -------------------------- CSS3 support -------------------------- //


  var docElemStyle = document.documentElement.style;
  var transitionProperty = typeof docElemStyle.transition == 'string' ? 'transition' : 'WebkitTransition';
  var transformProperty = typeof docElemStyle.transform == 'string' ? 'transform' : 'WebkitTransform';
  var transitionEndEvent = {
    WebkitTransition: 'webkitTransitionEnd',
    transition: 'transitionend'
  }[transitionProperty]; // cache all vendor properties that could have vendor prefix

  var vendorProperties = {
    transform: transformProperty,
    transition: transitionProperty,
    transitionDuration: transitionProperty + 'Duration',
    transitionProperty: transitionProperty + 'Property',
    transitionDelay: transitionProperty + 'Delay'
  }; // -------------------------- Item -------------------------- //

  function Item(element, layout) {
    if (!element) {
      return;
    }

    this.element = element; // parent layout class, i.e. Masonry, Isotope, or Packery

    this.layout = layout;
    this.position = {
      x: 0,
      y: 0
    };

    this._create();
  } // inherit EvEmitter


  var proto = Item.prototype = Object.create(EvEmitter.prototype);
  proto.constructor = Item;

  proto._create = function () {
    // transition objects
    this._transn = {
      ingProperties: {},
      clean: {},
      onEnd: {}
    };
    this.css({
      position: 'absolute'
    });
  }; // trigger specified handler for event type


  proto.handleEvent = function (event) {
    var method = 'on' + event.type;

    if (this[method]) {
      this[method](event);
    }
  };

  proto.getSize = function () {
    this.size = getSize(this.element);
  };
  /**
   * apply CSS styles to element
   * @param {Object} style
   */


  proto.css = function (style) {
    var elemStyle = this.element.style;

    for (var prop in style) {
      // use vendor property if available
      var supportedProp = vendorProperties[prop] || prop;
      elemStyle[supportedProp] = style[prop];
    }
  }; // measure position, and sets it


  proto.getPosition = function () {
    var style = getComputedStyle(this.element);

    var isOriginLeft = this.layout._getOption('originLeft');

    var isOriginTop = this.layout._getOption('originTop');

    var xValue = style[isOriginLeft ? 'left' : 'right'];
    var yValue = style[isOriginTop ? 'top' : 'bottom'];
    var x = parseFloat(xValue);
    var y = parseFloat(yValue); // convert percent to pixels

    var layoutSize = this.layout.size;

    if (xValue.indexOf('%') != -1) {
      x = x / 100 * layoutSize.width;
    }

    if (yValue.indexOf('%') != -1) {
      y = y / 100 * layoutSize.height;
    } // clean up 'auto' or other non-integer values


    x = isNaN(x) ? 0 : x;
    y = isNaN(y) ? 0 : y; // remove padding from measurement

    x -= isOriginLeft ? layoutSize.paddingLeft : layoutSize.paddingRight;
    y -= isOriginTop ? layoutSize.paddingTop : layoutSize.paddingBottom;
    this.position.x = x;
    this.position.y = y;
  }; // set settled position, apply padding


  proto.layoutPosition = function () {
    var layoutSize = this.layout.size;
    var style = {};

    var isOriginLeft = this.layout._getOption('originLeft');

    var isOriginTop = this.layout._getOption('originTop'); // x


    var xPadding = isOriginLeft ? 'paddingLeft' : 'paddingRight';
    var xProperty = isOriginLeft ? 'left' : 'right';
    var xResetProperty = isOriginLeft ? 'right' : 'left';
    var x = this.position.x + layoutSize[xPadding]; // set in percentage or pixels

    style[xProperty] = this.getXValue(x); // reset other property

    style[xResetProperty] = ''; // y

    var yPadding = isOriginTop ? 'paddingTop' : 'paddingBottom';
    var yProperty = isOriginTop ? 'top' : 'bottom';
    var yResetProperty = isOriginTop ? 'bottom' : 'top';
    var y = this.position.y + layoutSize[yPadding]; // set in percentage or pixels

    style[yProperty] = this.getYValue(y); // reset other property

    style[yResetProperty] = '';
    this.css(style);
    this.emitEvent('layout', [this]);
  };

  proto.getXValue = function (x) {
    var isHorizontal = this.layout._getOption('horizontal');

    return this.layout.options.percentPosition && !isHorizontal ? x / this.layout.size.width * 100 + '%' : x + 'px';
  };

  proto.getYValue = function (y) {
    var isHorizontal = this.layout._getOption('horizontal');

    return this.layout.options.percentPosition && isHorizontal ? y / this.layout.size.height * 100 + '%' : y + 'px';
  };

  proto._transitionTo = function (x, y) {
    this.getPosition(); // get current x & y from top/left

    var curX = this.position.x;
    var curY = this.position.y;
    var didNotMove = x == this.position.x && y == this.position.y; // save end position

    this.setPosition(x, y); // if did not move and not transitioning, just go to layout

    if (didNotMove && !this.isTransitioning) {
      this.layoutPosition();
      return;
    }

    var transX = x - curX;
    var transY = y - curY;
    var transitionStyle = {};
    transitionStyle.transform = this.getTranslate(transX, transY);
    this.transition({
      to: transitionStyle,
      onTransitionEnd: {
        transform: this.layoutPosition
      },
      isCleaning: true
    });
  };

  proto.getTranslate = function (x, y) {
    // flip cooridinates if origin on right or bottom
    var isOriginLeft = this.layout._getOption('originLeft');

    var isOriginTop = this.layout._getOption('originTop');

    x = isOriginLeft ? x : -x;
    y = isOriginTop ? y : -y;
    return 'translate3d(' + x + 'px, ' + y + 'px, 0)';
  }; // non transition + transform support


  proto.goTo = function (x, y) {
    this.setPosition(x, y);
    this.layoutPosition();
  };

  proto.moveTo = proto._transitionTo;

  proto.setPosition = function (x, y) {
    this.position.x = parseFloat(x);
    this.position.y = parseFloat(y);
  }; // ----- transition ----- //

  /**
   * @param {Object} style - CSS
   * @param {Function} onTransitionEnd
   */
  // non transition, just trigger callback


  proto._nonTransition = function (args) {
    this.css(args.to);

    if (args.isCleaning) {
      this._removeStyles(args.to);
    }

    for (var prop in args.onTransitionEnd) {
      args.onTransitionEnd[prop].call(this);
    }
  };
  /**
   * proper transition
   * @param {Object} args - arguments
   *   @param {Object} to - style to transition to
   *   @param {Object} from - style to start transition from
   *   @param {Boolean} isCleaning - removes transition styles after transition
   *   @param {Function} onTransitionEnd - callback
   */


  proto.transition = function (args) {
    // redirect to nonTransition if no transition duration
    if (!parseFloat(this.layout.options.transitionDuration)) {
      this._nonTransition(args);

      return;
    }

    var _transition = this._transn; // keep track of onTransitionEnd callback by css property

    for (var prop in args.onTransitionEnd) {
      _transition.onEnd[prop] = args.onTransitionEnd[prop];
    } // keep track of properties that are transitioning


    for (prop in args.to) {
      _transition.ingProperties[prop] = true; // keep track of properties to clean up when transition is done

      if (args.isCleaning) {
        _transition.clean[prop] = true;
      }
    } // set from styles


    if (args.from) {
      this.css(args.from); // force redraw. http://blog.alexmaccaw.com/css-transitions

      var h = this.element.offsetHeight; // hack for JSHint to hush about unused var

      h = null;
    } // enable transition


    this.enableTransition(args.to); // set styles that are transitioning

    this.css(args.to);
    this.isTransitioning = true;
  }; // dash before all cap letters, including first for
  // WebkitTransform => -webkit-transform


  function toDashedAll(str) {
    return str.replace(/([A-Z])/g, function ($1) {
      return '-' + $1.toLowerCase();
    });
  }

  var transitionProps = 'opacity,' + toDashedAll(transformProperty);

  proto.enableTransition = function ()
  /* style */
  {
    // HACK changing transitionProperty during a transition
    // will cause transition to jump
    if (this.isTransitioning) {
      return;
    } // make `transition: foo, bar, baz` from style object
    // HACK un-comment this when enableTransition can work
    // while a transition is happening
    // var transitionValues = [];
    // for ( var prop in style ) {
    //   // dash-ify camelCased properties like WebkitTransition
    //   prop = vendorProperties[ prop ] || prop;
    //   transitionValues.push( toDashedAll( prop ) );
    // }
    // munge number to millisecond, to match stagger


    var duration = this.layout.options.transitionDuration;
    duration = typeof duration == 'number' ? duration + 'ms' : duration; // enable transition styles

    this.css({
      transitionProperty: transitionProps,
      transitionDuration: duration,
      transitionDelay: this.staggerDelay || 0
    }); // listen for transition end event

    this.element.addEventListener(transitionEndEvent, this, false);
  }; // ----- events ----- //


  proto.onwebkitTransitionEnd = function (event) {
    this.ontransitionend(event);
  };

  proto.onotransitionend = function (event) {
    this.ontransitionend(event);
  }; // properties that I munge to make my life easier


  var dashedVendorProperties = {
    '-webkit-transform': 'transform'
  };

  proto.ontransitionend = function (event) {
    // disregard bubbled events from children
    if (event.target !== this.element) {
      return;
    }

    var _transition = this._transn; // get property name of transitioned property, convert to prefix-free

    var propertyName = dashedVendorProperties[event.propertyName] || event.propertyName; // remove property that has completed transitioning

    delete _transition.ingProperties[propertyName]; // check if any properties are still transitioning

    if (isEmptyObj(_transition.ingProperties)) {
      // all properties have completed transitioning
      this.disableTransition();
    } // clean style


    if (propertyName in _transition.clean) {
      // clean up style
      this.element.style[event.propertyName] = '';
      delete _transition.clean[propertyName];
    } // trigger onTransitionEnd callback


    if (propertyName in _transition.onEnd) {
      var onTransitionEnd = _transition.onEnd[propertyName];
      onTransitionEnd.call(this);
      delete _transition.onEnd[propertyName];
    }

    this.emitEvent('transitionEnd', [this]);
  };

  proto.disableTransition = function () {
    this.removeTransitionStyles();
    this.element.removeEventListener(transitionEndEvent, this, false);
    this.isTransitioning = false;
  };
  /**
   * removes style property from element
   * @param {Object} style
  **/


  proto._removeStyles = function (style) {
    // clean up transition styles
    var cleanStyle = {};

    for (var prop in style) {
      cleanStyle[prop] = '';
    }

    this.css(cleanStyle);
  };

  var cleanTransitionStyle = {
    transitionProperty: '',
    transitionDuration: '',
    transitionDelay: ''
  };

  proto.removeTransitionStyles = function () {
    // remove transition
    this.css(cleanTransitionStyle);
  }; // ----- stagger ----- //


  proto.stagger = function (delay) {
    delay = isNaN(delay) ? 0 : delay;
    this.staggerDelay = delay + 'ms';
  }; // ----- show/hide/remove ----- //
  // remove element from DOM


  proto.removeElem = function () {
    this.element.parentNode.removeChild(this.element); // remove display: none

    this.css({
      display: ''
    });
    this.emitEvent('remove', [this]);
  };

  proto.remove = function () {
    // just remove element if no transition support or no transition
    if (!transitionProperty || !parseFloat(this.layout.options.transitionDuration)) {
      this.removeElem();
      return;
    } // start transition


    this.once('transitionEnd', function () {
      this.removeElem();
    });
    this.hide();
  };

  proto.reveal = function () {
    delete this.isHidden; // remove display: none

    this.css({
      display: ''
    });
    var options = this.layout.options;
    var onTransitionEnd = {};
    var transitionEndProperty = this.getHideRevealTransitionEndProperty('visibleStyle');
    onTransitionEnd[transitionEndProperty] = this.onRevealTransitionEnd;
    this.transition({
      from: options.hiddenStyle,
      to: options.visibleStyle,
      isCleaning: true,
      onTransitionEnd: onTransitionEnd
    });
  };

  proto.onRevealTransitionEnd = function () {
    // check if still visible
    // during transition, item may have been hidden
    if (!this.isHidden) {
      this.emitEvent('reveal');
    }
  };
  /**
   * get style property use for hide/reveal transition end
   * @param {String} styleProperty - hiddenStyle/visibleStyle
   * @returns {String}
   */


  proto.getHideRevealTransitionEndProperty = function (styleProperty) {
    var optionStyle = this.layout.options[styleProperty]; // use opacity

    if (optionStyle.opacity) {
      return 'opacity';
    } // get first property


    for (var prop in optionStyle) {
      return prop;
    }
  };

  proto.hide = function () {
    // set flag
    this.isHidden = true; // remove display: none

    this.css({
      display: ''
    });
    var options = this.layout.options;
    var onTransitionEnd = {};
    var transitionEndProperty = this.getHideRevealTransitionEndProperty('hiddenStyle');
    onTransitionEnd[transitionEndProperty] = this.onHideTransitionEnd;
    this.transition({
      from: options.visibleStyle,
      to: options.hiddenStyle,
      // keep hidden stuff hidden
      isCleaning: true,
      onTransitionEnd: onTransitionEnd
    });
  };

  proto.onHideTransitionEnd = function () {
    // check if still hidden
    // during transition, item may have been un-hidden
    if (this.isHidden) {
      this.css({
        display: 'none'
      });
      this.emitEvent('hide');
    }
  };

  proto.destroy = function () {
    this.css({
      position: '',
      left: '',
      right: '',
      top: '',
      bottom: '',
      transition: '',
      transform: ''
    });
  };

  return Item;
});

},{"ev-emitter":353,"get-size":355}],360:[function(require,module,exports){
"use strict";

function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }

/*!
 * Outlayer v2.1.1
 * the brains and guts of a layout library
 * MIT license
 */
(function (window, factory) {
  'use strict'; // universal module definition

  /* jshint strict: false */

  /* globals define, module, require */

  if (typeof define == 'function' && define.amd) {
    // AMD - RequireJS
    define(['ev-emitter/ev-emitter', 'get-size/get-size', 'fizzy-ui-utils/utils', './item'], function (EvEmitter, getSize, utils, Item) {
      return factory(window, EvEmitter, getSize, utils, Item);
    });
  } else if ((typeof module === "undefined" ? "undefined" : _typeof(module)) == 'object' && module.exports) {
    // CommonJS - Browserify, Webpack
    module.exports = factory(window, require('ev-emitter'), require('get-size'), require('fizzy-ui-utils'), require('./item'));
  } else {
    // browser global
    window.Outlayer = factory(window, window.EvEmitter, window.getSize, window.fizzyUIUtils, window.Outlayer.Item);
  }
})(window, function factory(window, EvEmitter, getSize, utils, Item) {
  'use strict'; // ----- vars ----- //

  var console = window.console;
  var jQuery = window.jQuery;

  var noop = function noop() {}; // -------------------------- Outlayer -------------------------- //
  // globally unique identifiers


  var GUID = 0; // internal store of all Outlayer intances

  var instances = {};
  /**
   * @param {Element, String} element
   * @param {Object} options
   * @constructor
   */

  function Outlayer(element, options) {
    var queryElement = utils.getQueryElement(element);

    if (!queryElement) {
      if (console) {
        console.error('Bad element for ' + this.constructor.namespace + ': ' + (queryElement || element));
      }

      return;
    }

    this.element = queryElement; // add jQuery

    if (jQuery) {
      this.$element = jQuery(this.element);
    } // options


    this.options = utils.extend({}, this.constructor.defaults);
    this.option(options); // add id for Outlayer.getFromElement

    var id = ++GUID;
    this.element.outlayerGUID = id; // expando

    instances[id] = this; // associate via id
    // kick it off

    this._create();

    var isInitLayout = this._getOption('initLayout');

    if (isInitLayout) {
      this.layout();
    }
  } // settings are for internal use only


  Outlayer.namespace = 'outlayer';
  Outlayer.Item = Item; // default options

  Outlayer.defaults = {
    containerStyle: {
      position: 'relative'
    },
    initLayout: true,
    originLeft: true,
    originTop: true,
    resize: true,
    resizeContainer: true,
    // item options
    transitionDuration: '0.4s',
    hiddenStyle: {
      opacity: 0,
      transform: 'scale(0.001)'
    },
    visibleStyle: {
      opacity: 1,
      transform: 'scale(1)'
    }
  };
  var proto = Outlayer.prototype; // inherit EvEmitter

  utils.extend(proto, EvEmitter.prototype);
  /**
   * set options
   * @param {Object} opts
   */

  proto.option = function (opts) {
    utils.extend(this.options, opts);
  };
  /**
   * get backwards compatible option value, check old name
   */


  proto._getOption = function (option) {
    var oldOption = this.constructor.compatOptions[option];
    return oldOption && this.options[oldOption] !== undefined ? this.options[oldOption] : this.options[option];
  };

  Outlayer.compatOptions = {
    // currentName: oldName
    initLayout: 'isInitLayout',
    horizontal: 'isHorizontal',
    layoutInstant: 'isLayoutInstant',
    originLeft: 'isOriginLeft',
    originTop: 'isOriginTop',
    resize: 'isResizeBound',
    resizeContainer: 'isResizingContainer'
  };

  proto._create = function () {
    // get items from children
    this.reloadItems(); // elements that affect layout, but are not laid out

    this.stamps = [];
    this.stamp(this.options.stamp); // set container style

    utils.extend(this.element.style, this.options.containerStyle); // bind resize method

    var canBindResize = this._getOption('resize');

    if (canBindResize) {
      this.bindResize();
    }
  }; // goes through all children again and gets bricks in proper order


  proto.reloadItems = function () {
    // collection of item elements
    this.items = this._itemize(this.element.children);
  };
  /**
   * turn elements into Outlayer.Items to be used in layout
   * @param {Array or NodeList or HTMLElement} elems
   * @returns {Array} items - collection of new Outlayer Items
   */


  proto._itemize = function (elems) {
    var itemElems = this._filterFindItemElements(elems);

    var Item = this.constructor.Item; // create new Outlayer Items for collection

    var items = [];

    for (var i = 0; i < itemElems.length; i++) {
      var elem = itemElems[i];
      var item = new Item(elem, this);
      items.push(item);
    }

    return items;
  };
  /**
   * get item elements to be used in layout
   * @param {Array or NodeList or HTMLElement} elems
   * @returns {Array} items - item elements
   */


  proto._filterFindItemElements = function (elems) {
    return utils.filterFindElements(elems, this.options.itemSelector);
  };
  /**
   * getter method for getting item elements
   * @returns {Array} elems - collection of item elements
   */


  proto.getItemElements = function () {
    return this.items.map(function (item) {
      return item.element;
    });
  }; // ----- init & layout ----- //

  /**
   * lays out all items
   */


  proto.layout = function () {
    this._resetLayout();

    this._manageStamps(); // don't animate first layout


    var layoutInstant = this._getOption('layoutInstant');

    var isInstant = layoutInstant !== undefined ? layoutInstant : !this._isLayoutInited;
    this.layoutItems(this.items, isInstant); // flag for initalized

    this._isLayoutInited = true;
  }; // _init is alias for layout


  proto._init = proto.layout;
  /**
   * logic before any new layout
   */

  proto._resetLayout = function () {
    this.getSize();
  };

  proto.getSize = function () {
    this.size = getSize(this.element);
  };
  /**
   * get measurement from option, for columnWidth, rowHeight, gutter
   * if option is String -> get element from selector string, & get size of element
   * if option is Element -> get size of element
   * else use option as a number
   *
   * @param {String} measurement
   * @param {String} size - width or height
   * @private
   */


  proto._getMeasurement = function (measurement, size) {
    var option = this.options[measurement];
    var elem;

    if (!option) {
      // default to 0
      this[measurement] = 0;
    } else {
      // use option as an element
      if (typeof option == 'string') {
        elem = this.element.querySelector(option);
      } else if (option instanceof HTMLElement) {
        elem = option;
      } // use size of element, if element


      this[measurement] = elem ? getSize(elem)[size] : option;
    }
  };
  /**
   * layout a collection of item elements
   * @api public
   */


  proto.layoutItems = function (items, isInstant) {
    items = this._getItemsForLayout(items);

    this._layoutItems(items, isInstant);

    this._postLayout();
  };
  /**
   * get the items to be laid out
   * you may want to skip over some items
   * @param {Array} items
   * @returns {Array} items
   */


  proto._getItemsForLayout = function (items) {
    return items.filter(function (item) {
      return !item.isIgnored;
    });
  };
  /**
   * layout items
   * @param {Array} items
   * @param {Boolean} isInstant
   */


  proto._layoutItems = function (items, isInstant) {
    this._emitCompleteOnItems('layout', items);

    if (!items || !items.length) {
      // no items, emit event with empty array
      return;
    }

    var queue = [];
    items.forEach(function (item) {
      // get x/y object from method
      var position = this._getItemLayoutPosition(item); // enqueue


      position.item = item;
      position.isInstant = isInstant || item.isLayoutInstant;
      queue.push(position);
    }, this);

    this._processLayoutQueue(queue);
  };
  /**
   * get item layout position
   * @param {Outlayer.Item} item
   * @returns {Object} x and y position
   */


  proto._getItemLayoutPosition = function ()
  /* item */
  {
    return {
      x: 0,
      y: 0
    };
  };
  /**
   * iterate over array and position each item
   * Reason being - separating this logic prevents 'layout invalidation'
   * thx @paul_irish
   * @param {Array} queue
   */


  proto._processLayoutQueue = function (queue) {
    this.updateStagger();
    queue.forEach(function (obj, i) {
      this._positionItem(obj.item, obj.x, obj.y, obj.isInstant, i);
    }, this);
  }; // set stagger from option in milliseconds number


  proto.updateStagger = function () {
    var stagger = this.options.stagger;

    if (stagger === null || stagger === undefined) {
      this.stagger = 0;
      return;
    }

    this.stagger = getMilliseconds(stagger);
    return this.stagger;
  };
  /**
   * Sets position of item in DOM
   * @param {Outlayer.Item} item
   * @param {Number} x - horizontal position
   * @param {Number} y - vertical position
   * @param {Boolean} isInstant - disables transitions
   */


  proto._positionItem = function (item, x, y, isInstant, i) {
    if (isInstant) {
      // if not transition, just set CSS
      item.goTo(x, y);
    } else {
      item.stagger(i * this.stagger);
      item.moveTo(x, y);
    }
  };
  /**
   * Any logic you want to do after each layout,
   * i.e. size the container
   */


  proto._postLayout = function () {
    this.resizeContainer();
  };

  proto.resizeContainer = function () {
    var isResizingContainer = this._getOption('resizeContainer');

    if (!isResizingContainer) {
      return;
    }

    var size = this._getContainerSize();

    if (size) {
      this._setContainerMeasure(size.width, true);

      this._setContainerMeasure(size.height, false);
    }
  };
  /**
   * Sets width or height of container if returned
   * @returns {Object} size
   *   @param {Number} width
   *   @param {Number} height
   */


  proto._getContainerSize = noop;
  /**
   * @param {Number} measure - size of width or height
   * @param {Boolean} isWidth
   */

  proto._setContainerMeasure = function (measure, isWidth) {
    if (measure === undefined) {
      return;
    }

    var elemSize = this.size; // add padding and border width if border box

    if (elemSize.isBorderBox) {
      measure += isWidth ? elemSize.paddingLeft + elemSize.paddingRight + elemSize.borderLeftWidth + elemSize.borderRightWidth : elemSize.paddingBottom + elemSize.paddingTop + elemSize.borderTopWidth + elemSize.borderBottomWidth;
    }

    measure = Math.max(measure, 0);
    this.element.style[isWidth ? 'width' : 'height'] = measure + 'px';
  };
  /**
   * emit eventComplete on a collection of items events
   * @param {String} eventName
   * @param {Array} items - Outlayer.Items
   */


  proto._emitCompleteOnItems = function (eventName, items) {
    var _this = this;

    function onComplete() {
      _this.dispatchEvent(eventName + 'Complete', null, [items]);
    }

    var count = items.length;

    if (!items || !count) {
      onComplete();
      return;
    }

    var doneCount = 0;

    function tick() {
      doneCount++;

      if (doneCount == count) {
        onComplete();
      }
    } // bind callback


    items.forEach(function (item) {
      item.once(eventName, tick);
    });
  };
  /**
   * emits events via EvEmitter and jQuery events
   * @param {String} type - name of event
   * @param {Event} event - original event
   * @param {Array} args - extra arguments
   */


  proto.dispatchEvent = function (type, event, args) {
    // add original event to arguments
    var emitArgs = event ? [event].concat(args) : args;
    this.emitEvent(type, emitArgs);

    if (jQuery) {
      // set this.$element
      this.$element = this.$element || jQuery(this.element);

      if (event) {
        // create jQuery event
        var $event = jQuery.Event(event);
        $event.type = type;
        this.$element.trigger($event, args);
      } else {
        // just trigger with type if no event available
        this.$element.trigger(type, args);
      }
    }
  }; // -------------------------- ignore & stamps -------------------------- //

  /**
   * keep item in collection, but do not lay it out
   * ignored items do not get skipped in layout
   * @param {Element} elem
   */


  proto.ignore = function (elem) {
    var item = this.getItem(elem);

    if (item) {
      item.isIgnored = true;
    }
  };
  /**
   * return item to layout collection
   * @param {Element} elem
   */


  proto.unignore = function (elem) {
    var item = this.getItem(elem);

    if (item) {
      delete item.isIgnored;
    }
  };
  /**
   * adds elements to stamps
   * @param {NodeList, Array, Element, or String} elems
   */


  proto.stamp = function (elems) {
    elems = this._find(elems);

    if (!elems) {
      return;
    }

    this.stamps = this.stamps.concat(elems); // ignore

    elems.forEach(this.ignore, this);
  };
  /**
   * removes elements to stamps
   * @param {NodeList, Array, or Element} elems
   */


  proto.unstamp = function (elems) {
    elems = this._find(elems);

    if (!elems) {
      return;
    }

    elems.forEach(function (elem) {
      // filter out removed stamp elements
      utils.removeFrom(this.stamps, elem);
      this.unignore(elem);
    }, this);
  };
  /**
   * finds child elements
   * @param {NodeList, Array, Element, or String} elems
   * @returns {Array} elems
   */


  proto._find = function (elems) {
    if (!elems) {
      return;
    } // if string, use argument as selector string


    if (typeof elems == 'string') {
      elems = this.element.querySelectorAll(elems);
    }

    elems = utils.makeArray(elems);
    return elems;
  };

  proto._manageStamps = function () {
    if (!this.stamps || !this.stamps.length) {
      return;
    }

    this._getBoundingRect();

    this.stamps.forEach(this._manageStamp, this);
  }; // update boundingLeft / Top


  proto._getBoundingRect = function () {
    // get bounding rect for container element
    var boundingRect = this.element.getBoundingClientRect();
    var size = this.size;
    this._boundingRect = {
      left: boundingRect.left + size.paddingLeft + size.borderLeftWidth,
      top: boundingRect.top + size.paddingTop + size.borderTopWidth,
      right: boundingRect.right - (size.paddingRight + size.borderRightWidth),
      bottom: boundingRect.bottom - (size.paddingBottom + size.borderBottomWidth)
    };
  };
  /**
   * @param {Element} stamp
  **/


  proto._manageStamp = noop;
  /**
   * get x/y position of element relative to container element
   * @param {Element} elem
   * @returns {Object} offset - has left, top, right, bottom
   */

  proto._getElementOffset = function (elem) {
    var boundingRect = elem.getBoundingClientRect();
    var thisRect = this._boundingRect;
    var size = getSize(elem);
    var offset = {
      left: boundingRect.left - thisRect.left - size.marginLeft,
      top: boundingRect.top - thisRect.top - size.marginTop,
      right: thisRect.right - boundingRect.right - size.marginRight,
      bottom: thisRect.bottom - boundingRect.bottom - size.marginBottom
    };
    return offset;
  }; // -------------------------- resize -------------------------- //
  // enable event handlers for listeners
  // i.e. resize -> onresize


  proto.handleEvent = utils.handleEvent;
  /**
   * Bind layout to window resizing
   */

  proto.bindResize = function () {
    window.addEventListener('resize', this);
    this.isResizeBound = true;
  };
  /**
   * Unbind layout to window resizing
   */


  proto.unbindResize = function () {
    window.removeEventListener('resize', this);
    this.isResizeBound = false;
  };

  proto.onresize = function () {
    this.resize();
  };

  utils.debounceMethod(Outlayer, 'onresize', 100);

  proto.resize = function () {
    // don't trigger if size did not change
    // or if resize was unbound. See #9
    if (!this.isResizeBound || !this.needsResizeLayout()) {
      return;
    }

    this.layout();
  };
  /**
   * check if layout is needed post layout
   * @returns Boolean
   */


  proto.needsResizeLayout = function () {
    var size = getSize(this.element); // check that this.size and size are there
    // IE8 triggers resize on body size change, so they might not be

    var hasSizes = this.size && size;
    return hasSizes && size.innerWidth !== this.size.innerWidth;
  }; // -------------------------- methods -------------------------- //

  /**
   * add items to Outlayer instance
   * @param {Array or NodeList or Element} elems
   * @returns {Array} items - Outlayer.Items
  **/


  proto.addItems = function (elems) {
    var items = this._itemize(elems); // add items to collection


    if (items.length) {
      this.items = this.items.concat(items);
    }

    return items;
  };
  /**
   * Layout newly-appended item elements
   * @param {Array or NodeList or Element} elems
   */


  proto.appended = function (elems) {
    var items = this.addItems(elems);

    if (!items.length) {
      return;
    } // layout and reveal just the new items


    this.layoutItems(items, true);
    this.reveal(items);
  };
  /**
   * Layout prepended elements
   * @param {Array or NodeList or Element} elems
   */


  proto.prepended = function (elems) {
    var items = this._itemize(elems);

    if (!items.length) {
      return;
    } // add items to beginning of collection


    var previousItems = this.items.slice(0);
    this.items = items.concat(previousItems); // start new layout

    this._resetLayout();

    this._manageStamps(); // layout new stuff without transition


    this.layoutItems(items, true);
    this.reveal(items); // layout previous items

    this.layoutItems(previousItems);
  };
  /**
   * reveal a collection of items
   * @param {Array of Outlayer.Items} items
   */


  proto.reveal = function (items) {
    this._emitCompleteOnItems('reveal', items);

    if (!items || !items.length) {
      return;
    }

    var stagger = this.updateStagger();
    items.forEach(function (item, i) {
      item.stagger(i * stagger);
      item.reveal();
    });
  };
  /**
   * hide a collection of items
   * @param {Array of Outlayer.Items} items
   */


  proto.hide = function (items) {
    this._emitCompleteOnItems('hide', items);

    if (!items || !items.length) {
      return;
    }

    var stagger = this.updateStagger();
    items.forEach(function (item, i) {
      item.stagger(i * stagger);
      item.hide();
    });
  };
  /**
   * reveal item elements
   * @param {Array}, {Element}, {NodeList} items
   */


  proto.revealItemElements = function (elems) {
    var items = this.getItems(elems);
    this.reveal(items);
  };
  /**
   * hide item elements
   * @param {Array}, {Element}, {NodeList} items
   */


  proto.hideItemElements = function (elems) {
    var items = this.getItems(elems);
    this.hide(items);
  };
  /**
   * get Outlayer.Item, given an Element
   * @param {Element} elem
   * @param {Function} callback
   * @returns {Outlayer.Item} item
   */


  proto.getItem = function (elem) {
    // loop through items to get the one that matches
    for (var i = 0; i < this.items.length; i++) {
      var item = this.items[i];

      if (item.element == elem) {
        // return item
        return item;
      }
    }
  };
  /**
   * get collection of Outlayer.Items, given Elements
   * @param {Array} elems
   * @returns {Array} items - Outlayer.Items
   */


  proto.getItems = function (elems) {
    elems = utils.makeArray(elems);
    var items = [];
    elems.forEach(function (elem) {
      var item = this.getItem(elem);

      if (item) {
        items.push(item);
      }
    }, this);
    return items;
  };
  /**
   * remove element(s) from instance and DOM
   * @param {Array or NodeList or Element} elems
   */


  proto.remove = function (elems) {
    var removeItems = this.getItems(elems);

    this._emitCompleteOnItems('remove', removeItems); // bail if no items to remove


    if (!removeItems || !removeItems.length) {
      return;
    }

    removeItems.forEach(function (item) {
      item.remove(); // remove item from collection

      utils.removeFrom(this.items, item);
    }, this);
  }; // ----- destroy ----- //
  // remove and disable Outlayer instance


  proto.destroy = function () {
    // clean up dynamic styles
    var style = this.element.style;
    style.height = '';
    style.position = '';
    style.width = ''; // destroy items

    this.items.forEach(function (item) {
      item.destroy();
    });
    this.unbindResize();
    var id = this.element.outlayerGUID;
    delete instances[id]; // remove reference to instance by id

    delete this.element.outlayerGUID; // remove data for jQuery

    if (jQuery) {
      jQuery.removeData(this.element, this.constructor.namespace);
    }
  }; // -------------------------- data -------------------------- //

  /**
   * get Outlayer instance from element
   * @param {Element} elem
   * @returns {Outlayer}
   */


  Outlayer.data = function (elem) {
    elem = utils.getQueryElement(elem);
    var id = elem && elem.outlayerGUID;
    return id && instances[id];
  }; // -------------------------- create Outlayer class -------------------------- //

  /**
   * create a layout class
   * @param {String} namespace
   */


  Outlayer.create = function (namespace, options) {
    // sub-class Outlayer
    var Layout = subclass(Outlayer); // apply new options and compatOptions

    Layout.defaults = utils.extend({}, Outlayer.defaults);
    utils.extend(Layout.defaults, options);
    Layout.compatOptions = utils.extend({}, Outlayer.compatOptions);
    Layout.namespace = namespace;
    Layout.data = Outlayer.data; // sub-class Item

    Layout.Item = subclass(Item); // -------------------------- declarative -------------------------- //

    utils.htmlInit(Layout, namespace); // -------------------------- jQuery bridge -------------------------- //
    // make into jQuery plugin

    if (jQuery && jQuery.bridget) {
      jQuery.bridget(namespace, Layout);
    }

    return Layout;
  };

  function subclass(Parent) {
    function SubClass() {
      Parent.apply(this, arguments);
    }

    SubClass.prototype = Object.create(Parent.prototype);
    SubClass.prototype.constructor = SubClass;
    return SubClass;
  } // ----- helpers ----- //
  // how many milliseconds are in each unit


  var msUnits = {
    ms: 1,
    s: 1000
  }; // munge time-like parameter into millisecond number
  // '0.4s' -> 40

  function getMilliseconds(time) {
    if (typeof time == 'number') {
      return time;
    }

    var matches = time.match(/(^\d*\.?\d*)(\w*)/);
    var num = matches && matches[1];
    var unit = matches && matches[2];

    if (!num.length) {
      return 0;
    }

    num = parseFloat(num);
    var mult = msUnits[unit] || 1;
    return num * mult;
  } // ----- fin ----- //
  // back in global


  Outlayer.Item = Item;
  return Outlayer;
});

},{"./item":359,"ev-emitter":353,"fizzy-ui-utils":354,"get-size":355}],361:[function(require,module,exports){
"use strict";

// shim for using process in browser
var process = module.exports = {}; // cached from whatever global is present so that test runners that stub it
// don't break things.  But we need to wrap it in a try catch in case it is
// wrapped in strict mode code which doesn't define any globals.  It's inside a
// function because try/catches deoptimize in certain engines.

var cachedSetTimeout;
var cachedClearTimeout;

function defaultSetTimout() {
  throw new Error('setTimeout has not been defined');
}

function defaultClearTimeout() {
  throw new Error('clearTimeout has not been defined');
}

(function () {
  try {
    if (typeof setTimeout === 'function') {
      cachedSetTimeout = setTimeout;
    } else {
      cachedSetTimeout = defaultSetTimout;
    }
  } catch (e) {
    cachedSetTimeout = defaultSetTimout;
  }

  try {
    if (typeof clearTimeout === 'function') {
      cachedClearTimeout = clearTimeout;
    } else {
      cachedClearTimeout = defaultClearTimeout;
    }
  } catch (e) {
    cachedClearTimeout = defaultClearTimeout;
  }
})();

function runTimeout(fun) {
  if (cachedSetTimeout === setTimeout) {
    //normal enviroments in sane situations
    return setTimeout(fun, 0);
  } // if setTimeout wasn't available but was latter defined


  if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) {
    cachedSetTimeout = setTimeout;
    return setTimeout(fun, 0);
  }

  try {
    // when when somebody has screwed with setTimeout but no I.E. maddness
    return cachedSetTimeout(fun, 0);
  } catch (e) {
    try {
      // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally
      return cachedSetTimeout.call(null, fun, 0);
    } catch (e) {
      // 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
      return cachedSetTimeout.call(this, fun, 0);
    }
  }
}

function runClearTimeout(marker) {
  if (cachedClearTimeout === clearTimeout) {
    //normal enviroments in sane situations
    return clearTimeout(marker);
  } // if clearTimeout wasn't available but was latter defined


  if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) {
    cachedClearTimeout = clearTimeout;
    return clearTimeout(marker);
  }

  try {
    // when when somebody has screwed with setTimeout but no I.E. maddness
    return cachedClearTimeout(marker);
  } catch (e) {
    try {
      // When we are in I.E. but the script has been evaled so I.E. doesn't  trust the global object when called normally
      return cachedClearTimeout.call(null, marker);
    } catch (e) {
      // 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.
      // Some versions of I.E. have different rules for clearTimeout vs setTimeout
      return cachedClearTimeout.call(this, marker);
    }
  }
}

var queue = [];
var draining = false;
var currentQueue;
var queueIndex = -1;

function cleanUpNextTick() {
  if (!draining || !currentQueue) {
    return;
  }

  draining = false;

  if (currentQueue.length) {
    queue = currentQueue.concat(queue);
  } else {
    queueIndex = -1;
  }

  if (queue.length) {
    drainQueue();
  }
}

function drainQueue() {
  if (draining) {
    return;
  }

  var timeout = runTimeout(cleanUpNextTick);
  draining = true;
  var len = queue.length;

  while (len) {
    currentQueue = queue;
    queue = [];

    while (++queueIndex < len) {
      if (currentQueue) {
        currentQueue[queueIndex].run();
      }
    }

    queueIndex = -1;
    len = queue.length;
  }

  currentQueue = null;
  draining = false;
  runClearTimeout(timeout);
}

process.nextTick = function (fun) {
  var args = new Array(arguments.length - 1);

  if (arguments.length > 1) {
    for (var i = 1; i < arguments.length; i++) {
      args[i - 1] = arguments[i];
    }
  }

  queue.push(new Item(fun, args));

  if (queue.length === 1 && !draining) {
    runTimeout(drainQueue);
  }
}; // v8 likes predictible objects


function Item(fun, array) {
  this.fun = fun;
  this.array = array;
}

Item.prototype.run = function () {
  this.fun.apply(null, this.array);
};

process.title = 'browser';
process.browser = true;
process.env = {};
process.argv = [];
process.version = ''; // empty string to avoid regexp issues

process.versions = {};

function noop() {}

process.on = noop;
process.addListener = noop;
process.once = noop;
process.off = noop;
process.removeListener = noop;
process.removeAllListeners = noop;
process.emit = noop;
process.prependListener = noop;
process.prependOnceListener = noop;

process.listeners = function (name) {
  return [];
};

process.binding = function (name) {
  throw new Error('process.binding is not supported');
};

process.cwd = function () {
  return '/';
};

process.chdir = function (dir) {
  throw new Error('process.chdir is not supported');
};

process.umask = function () {
  return 0;
};

},{}],362:[function(require,module,exports){
(function (global){
"use strict";

function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }

/**
 * Copyright (c) 2014, Facebook, Inc.
 * All rights reserved.
 *
 * This source code is licensed under the BSD-style license found in the
 * https://raw.github.com/facebook/regenerator/master/LICENSE file. An
 * additional grant of patent rights can be found in the PATENTS file in
 * the same directory.
 */
!function (global) {
  "use strict";

  var Op = Object.prototype;
  var hasOwn = Op.hasOwnProperty;
  var undefined; // More compressible than void 0.

  var $Symbol = typeof Symbol === "function" ? Symbol : {};
  var iteratorSymbol = $Symbol.iterator || "@@iterator";
  var asyncIteratorSymbol = $Symbol.asyncIterator || "@@asyncIterator";
  var toStringTagSymbol = $Symbol.toStringTag || "@@toStringTag";
  var inModule = (typeof module === "undefined" ? "undefined" : _typeof(module)) === "object";
  var runtime = global.regeneratorRuntime;

  if (runtime) {
    if (inModule) {
      // If regeneratorRuntime is defined globally and we're in a module,
      // make the exports object identical to regeneratorRuntime.
      module.exports = runtime;
    } // Don't bother evaluating the rest of this file if the runtime was
    // already defined globally.


    return;
  } // Define the runtime globally (as expected by generated code) as either
  // module.exports (if we're in a module) or a new, empty object.


  runtime = global.regeneratorRuntime = inModule ? module.exports : {};

  function wrap(innerFn, outerFn, self, tryLocsList) {
    // If outerFn provided and outerFn.prototype is a Generator, then outerFn.prototype instanceof Generator.
    var protoGenerator = outerFn && outerFn.prototype instanceof Generator ? outerFn : Generator;
    var generator = Object.create(protoGenerator.prototype);
    var context = new Context(tryLocsList || []); // The ._invoke method unifies the implementations of the .next,
    // .throw, and .return methods.

    generator._invoke = makeInvokeMethod(innerFn, self, context);
    return generator;
  }

  runtime.wrap = wrap; // Try/catch helper to minimize deoptimizations. Returns a completion
  // record like context.tryEntries[i].completion. This interface could
  // have been (and was previously) designed to take a closure to be
  // invoked without arguments, but in all the cases we care about we
  // already have an existing method we want to call, so there's no need
  // to create a new function object. We can even get away with assuming
  // the method takes exactly one argument, since that happens to be true
  // in every case, so we don't have to touch the arguments object. The
  // only additional allocation required is the completion record, which
  // has a stable shape and so hopefully should be cheap to allocate.

  function tryCatch(fn, obj, arg) {
    try {
      return {
        type: "normal",
        arg: fn.call(obj, arg)
      };
    } catch (err) {
      return {
        type: "throw",
        arg: err
      };
    }
  }

  var GenStateSuspendedStart = "suspendedStart";
  var GenStateSuspendedYield = "suspendedYield";
  var GenStateExecuting = "executing";
  var GenStateCompleted = "completed"; // Returning this object from the innerFn has the same effect as
  // breaking out of the dispatch switch statement.

  var ContinueSentinel = {}; // Dummy constructor functions that we use as the .constructor and
  // .constructor.prototype properties for functions that return Generator
  // objects. For full spec compliance, you may wish to configure your
  // minifier not to mangle the names of these two functions.

  function Generator() {}

  function GeneratorFunction() {}

  function GeneratorFunctionPrototype() {} // This is a polyfill for %IteratorPrototype% for environments that
  // don't natively support it.


  var IteratorPrototype = {};

  IteratorPrototype[iteratorSymbol] = function () {
    return this;
  };

  var getProto = Object.getPrototypeOf;
  var NativeIteratorPrototype = getProto && getProto(getProto(values([])));

  if (NativeIteratorPrototype && NativeIteratorPrototype !== Op && hasOwn.call(NativeIteratorPrototype, iteratorSymbol)) {
    // This environment has a native %IteratorPrototype%; use it instead
    // of the polyfill.
    IteratorPrototype = NativeIteratorPrototype;
  }

  var Gp = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(IteratorPrototype);
  GeneratorFunction.prototype = Gp.constructor = GeneratorFunctionPrototype;
  GeneratorFunctionPrototype.constructor = GeneratorFunction;
  GeneratorFunctionPrototype[toStringTagSymbol] = GeneratorFunction.displayName = "GeneratorFunction"; // Helper for defining the .next, .throw, and .return methods of the
  // Iterator interface in terms of a single ._invoke method.

  function defineIteratorMethods(prototype) {
    ["next", "throw", "return"].forEach(function (method) {
      prototype[method] = function (arg) {
        return this._invoke(method, arg);
      };
    });
  }

  runtime.isGeneratorFunction = function (genFun) {
    var ctor = typeof genFun === "function" && genFun.constructor;
    return ctor ? ctor === GeneratorFunction || // For the native GeneratorFunction constructor, the best we can
    // do is to check its .name property.
    (ctor.displayName || ctor.name) === "GeneratorFunction" : false;
  };

  runtime.mark = function (genFun) {
    if (Object.setPrototypeOf) {
      Object.setPrototypeOf(genFun, GeneratorFunctionPrototype);
    } else {
      genFun.__proto__ = GeneratorFunctionPrototype;

      if (!(toStringTagSymbol in genFun)) {
        genFun[toStringTagSymbol] = "GeneratorFunction";
      }
    }

    genFun.prototype = Object.create(Gp);
    return genFun;
  }; // Within the body of any async function, `await x` is transformed to
  // `yield regeneratorRuntime.awrap(x)`, so that the runtime can test
  // `hasOwn.call(value, "__await")` to determine if the yielded value is
  // meant to be awaited.


  runtime.awrap = function (arg) {
    return {
      __await: arg
    };
  };

  function AsyncIterator(generator) {
    function invoke(method, arg, resolve, reject) {
      var record = tryCatch(generator[method], generator, arg);

      if (record.type === "throw") {
        reject(record.arg);
      } else {
        var result = record.arg;
        var value = result.value;

        if (value && _typeof(value) === "object" && hasOwn.call(value, "__await")) {
          return Promise.resolve(value.__await).then(function (value) {
            invoke("next", value, resolve, reject);
          }, function (err) {
            invoke("throw", err, resolve, reject);
          });
        }

        return Promise.resolve(value).then(function (unwrapped) {
          // When a yielded Promise is resolved, its final value becomes
          // the .value of the Promise<{value,done}> result for the
          // current iteration. If the Promise is rejected, however, the
          // result for this iteration will be rejected with the same
          // reason. Note that rejections of yielded Promises are not
          // thrown back into the generator function, as is the case
          // when an awaited Promise is rejected. This difference in
          // behavior between yield and await is important, because it
          // allows the consumer to decide what to do with the yielded
          // rejection (swallow it and continue, manually .throw it back
          // into the generator, abandon iteration, whatever). With
          // await, by contrast, there is no opportunity to examine the
          // rejection reason outside the generator function, so the
          // only option is to throw it from the await expression, and
          // let the generator function handle the exception.
          result.value = unwrapped;
          resolve(result);
        }, reject);
      }
    }

    if (_typeof(global.process) === "object" && global.process.domain) {
      invoke = global.process.domain.bind(invoke);
    }

    var previousPromise;

    function enqueue(method, arg) {
      function callInvokeWithMethodAndArg() {
        return new Promise(function (resolve, reject) {
          invoke(method, arg, resolve, reject);
        });
      }

      return previousPromise = // If enqueue has been called before, then we want to wait until
      // all previous Promises have been resolved before calling invoke,
      // so that results are always delivered in the correct order. If
      // enqueue has not been called before, then it is important to
      // call invoke immediately, without waiting on a callback to fire,
      // so that the async generator function has the opportunity to do
      // any necessary setup in a predictable way. This predictability
      // is why the Promise constructor synchronously invokes its
      // executor callback, and why async functions synchronously
      // execute code before the first await. Since we implement simple
      // async functions in terms of async generators, it is especially
      // important to get this right, even though it requires care.
      previousPromise ? previousPromise.then(callInvokeWithMethodAndArg, // Avoid propagating failures to Promises returned by later
      // invocations of the iterator.
      callInvokeWithMethodAndArg) : callInvokeWithMethodAndArg();
    } // Define the unified helper method that is used to implement .next,
    // .throw, and .return (see defineIteratorMethods).


    this._invoke = enqueue;
  }

  defineIteratorMethods(AsyncIterator.prototype);

  AsyncIterator.prototype[asyncIteratorSymbol] = function () {
    return this;
  };

  runtime.AsyncIterator = AsyncIterator; // Note that simple async functions are implemented on top of
  // AsyncIterator objects; they just return a Promise for the value of
  // the final result produced by the iterator.

  runtime.async = function (innerFn, outerFn, self, tryLocsList) {
    var iter = new AsyncIterator(wrap(innerFn, outerFn, self, tryLocsList));
    return runtime.isGeneratorFunction(outerFn) ? iter // If outerFn is a generator, return the full iterator.
    : iter.next().then(function (result) {
      return result.done ? result.value : iter.next();
    });
  };

  function makeInvokeMethod(innerFn, self, context) {
    var state = GenStateSuspendedStart;
    return function invoke(method, arg) {
      if (state === GenStateExecuting) {
        throw new Error("Generator is already running");
      }

      if (state === GenStateCompleted) {
        if (method === "throw") {
          throw arg;
        } // Be forgiving, per 25.3.3.3.3 of the spec:
        // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-generatorresume


        return doneResult();
      }

      context.method = method;
      context.arg = arg;

      while (true) {
        var delegate = context.delegate;

        if (delegate) {
          var delegateResult = maybeInvokeDelegate(delegate, context);

          if (delegateResult) {
            if (delegateResult === ContinueSentinel) continue;
            return delegateResult;
          }
        }

        if (context.method === "next") {
          // Setting context._sent for legacy support of Babel's
          // function.sent implementation.
          context.sent = context._sent = context.arg;
        } else if (context.method === "throw") {
          if (state === GenStateSuspendedStart) {
            state = GenStateCompleted;
            throw context.arg;
          }

          context.dispatchException(context.arg);
        } else if (context.method === "return") {
          context.abrupt("return", context.arg);
        }

        state = GenStateExecuting;
        var record = tryCatch(innerFn, self, context);

        if (record.type === "normal") {
          // If an exception is thrown from innerFn, we leave state ===
          // GenStateExecuting and loop back for another invocation.
          state = context.done ? GenStateCompleted : GenStateSuspendedYield;

          if (record.arg === ContinueSentinel) {
            continue;
          }

          return {
            value: record.arg,
            done: context.done
          };
        } else if (record.type === "throw") {
          state = GenStateCompleted; // Dispatch the exception by looping back around to the
          // context.dispatchException(context.arg) call above.

          context.method = "throw";
          context.arg = record.arg;
        }
      }
    };
  } // Call delegate.iterator[context.method](context.arg) and handle the
  // result, either by returning a { value, done } result from the
  // delegate iterator, or by modifying context.method and context.arg,
  // setting context.delegate to null, and returning the ContinueSentinel.


  function maybeInvokeDelegate(delegate, context) {
    var method = delegate.iterator[context.method];

    if (method === undefined) {
      // A .throw or .return when the delegate iterator has no .throw
      // method always terminates the yield* loop.
      context.delegate = null;

      if (context.method === "throw") {
        if (delegate.iterator["return"]) {
          // If the delegate iterator has a return method, give it a
          // chance to clean up.
          context.method = "return";
          context.arg = undefined;
          maybeInvokeDelegate(delegate, context);

          if (context.method === "throw") {
            // If maybeInvokeDelegate(context) changed context.method from
            // "return" to "throw", let that override the TypeError below.
            return ContinueSentinel;
          }
        }

        context.method = "throw";
        context.arg = new TypeError("The iterator does not provide a 'throw' method");
      }

      return ContinueSentinel;
    }

    var record = tryCatch(method, delegate.iterator, context.arg);

    if (record.type === "throw") {
      context.method = "throw";
      context.arg = record.arg;
      context.delegate = null;
      return ContinueSentinel;
    }

    var info = record.arg;

    if (!info) {
      context.method = "throw";
      context.arg = new TypeError("iterator result is not an object");
      context.delegate = null;
      return ContinueSentinel;
    }

    if (info.done) {
      // Assign the result of the finished delegate to the temporary
      // variable specified by delegate.resultName (see delegateYield).
      context[delegate.resultName] = info.value; // Resume execution at the desired location (see delegateYield).

      context.next = delegate.nextLoc; // If context.method was "throw" but the delegate handled the
      // exception, let the outer generator proceed normally. If
      // context.method was "next", forget context.arg since it has been
      // "consumed" by the delegate iterator. If context.method was
      // "return", allow the original .return call to continue in the
      // outer generator.

      if (context.method !== "return") {
        context.method = "next";
        context.arg = undefined;
      }
    } else {
      // Re-yield the result returned by the delegate method.
      return info;
    } // The delegate iterator is finished, so forget it and continue with
    // the outer generator.


    context.delegate = null;
    return ContinueSentinel;
  } // Define Generator.prototype.{next,throw,return} in terms of the
  // unified ._invoke helper method.


  defineIteratorMethods(Gp);
  Gp[toStringTagSymbol] = "Generator"; // A Generator should always return itself as the iterator object when the
  // @@iterator function is called on it. Some browsers' implementations of the
  // iterator prototype chain incorrectly implement this, causing the Generator
  // object to not be returned from this call. This ensures that doesn't happen.
  // See https://github.com/facebook/regenerator/issues/274 for more details.

  Gp[iteratorSymbol] = function () {
    return this;
  };

  Gp.toString = function () {
    return "[object Generator]";
  };

  function pushTryEntry(locs) {
    var entry = {
      tryLoc: locs[0]
    };

    if (1 in locs) {
      entry.catchLoc = locs[1];
    }

    if (2 in locs) {
      entry.finallyLoc = locs[2];
      entry.afterLoc = locs[3];
    }

    this.tryEntries.push(entry);
  }

  function resetTryEntry(entry) {
    var record = entry.completion || {};
    record.type = "normal";
    delete record.arg;
    entry.completion = record;
  }

  function Context(tryLocsList) {
    // The root entry object (effectively a try statement without a catch
    // or a finally block) gives us a place to store values thrown from
    // locations where there is no enclosing try statement.
    this.tryEntries = [{
      tryLoc: "root"
    }];
    tryLocsList.forEach(pushTryEntry, this);
    this.reset(true);
  }

  runtime.keys = function (object) {
    var keys = [];

    for (var key in object) {
      keys.push(key);
    }

    keys.reverse(); // Rather than returning an object with a next method, we keep
    // things simple and return the next function itself.

    return function next() {
      while (keys.length) {
        var key = keys.pop();

        if (key in object) {
          next.value = key;
          next.done = false;
          return next;
        }
      } // To avoid creating an additional object, we just hang the .value
      // and .done properties off the next function object itself. This
      // also ensures that the minifier will not anonymize the function.


      next.done = true;
      return next;
    };
  };

  function values(iterable) {
    if (iterable) {
      var iteratorMethod = iterable[iteratorSymbol];

      if (iteratorMethod) {
        return iteratorMethod.call(iterable);
      }

      if (typeof iterable.next === "function") {
        return iterable;
      }

      if (!isNaN(iterable.length)) {
        var i = -1,
            next = function next() {
          while (++i < iterable.length) {
            if (hasOwn.call(iterable, i)) {
              next.value = iterable[i];
              next.done = false;
              return next;
            }
          }

          next.value = undefined;
          next.done = true;
          return next;
        };

        return next.next = next;
      }
    } // Return an iterator with no values.


    return {
      next: doneResult
    };
  }

  runtime.values = values;

  function doneResult() {
    return {
      value: undefined,
      done: true
    };
  }

  Context.prototype = {
    constructor: Context,
    reset: function reset(skipTempReset) {
      this.prev = 0;
      this.next = 0; // Resetting context._sent for legacy support of Babel's
      // function.sent implementation.

      this.sent = this._sent = undefined;
      this.done = false;
      this.delegate = null;
      this.method = "next";
      this.arg = undefined;
      this.tryEntries.forEach(resetTryEntry);

      if (!skipTempReset) {
        for (var name in this) {
          // Not sure about the optimal order of these conditions:
          if (name.charAt(0) === "t" && hasOwn.call(this, name) && !isNaN(+name.slice(1))) {
            this[name] = undefined;
          }
        }
      }
    },
    stop: function stop() {
      this.done = true;
      var rootEntry = this.tryEntries[0];
      var rootRecord = rootEntry.completion;

      if (rootRecord.type === "throw") {
        throw rootRecord.arg;
      }

      return this.rval;
    },
    dispatchException: function dispatchException(exception) {
      if (this.done) {
        throw exception;
      }

      var context = this;

      function handle(loc, caught) {
        record.type = "throw";
        record.arg = exception;
        context.next = loc;

        if (caught) {
          // If the dispatched exception was caught by a catch block,
          // then let that catch block handle the exception normally.
          context.method = "next";
          context.arg = undefined;
        }

        return !!caught;
      }

      for (var i = this.tryEntries.length - 1; i >= 0; --i) {
        var entry = this.tryEntries[i];
        var record = entry.completion;

        if (entry.tryLoc === "root") {
          // Exception thrown outside of any try block that could handle
          // it, so set the completion value of the entire function to
          // throw the exception.
          return handle("end");
        }

        if (entry.tryLoc <= this.prev) {
          var hasCatch = hasOwn.call(entry, "catchLoc");
          var hasFinally = hasOwn.call(entry, "finallyLoc");

          if (hasCatch && hasFinally) {
            if (this.prev < entry.catchLoc) {
              return handle(entry.catchLoc, true);
            } else if (this.prev < entry.finallyLoc) {
              return handle(entry.finallyLoc);
            }
          } else if (hasCatch) {
            if (this.prev < entry.catchLoc) {
              return handle(entry.catchLoc, true);
            }
          } else if (hasFinally) {
            if (this.prev < entry.finallyLoc) {
              return handle(entry.finallyLoc);
            }
          } else {
            throw new Error("try statement without catch or finally");
          }
        }
      }
    },
    abrupt: function abrupt(type, arg) {
      for (var i = this.tryEntries.length - 1; i >= 0; --i) {
        var entry = this.tryEntries[i];

        if (entry.tryLoc <= this.prev && hasOwn.call(entry, "finallyLoc") && this.prev < entry.finallyLoc) {
          var finallyEntry = entry;
          break;
        }
      }

      if (finallyEntry && (type === "break" || type === "continue") && finallyEntry.tryLoc <= arg && arg <= finallyEntry.finallyLoc) {
        // Ignore the finally entry if control is not jumping to a
        // location outside the try/catch block.
        finallyEntry = null;
      }

      var record = finallyEntry ? finallyEntry.completion : {};
      record.type = type;
      record.arg = arg;

      if (finallyEntry) {
        this.method = "next";
        this.next = finallyEntry.finallyLoc;
        return ContinueSentinel;
      }

      return this.complete(record);
    },
    complete: function complete(record, afterLoc) {
      if (record.type === "throw") {
        throw record.arg;
      }

      if (record.type === "break" || record.type === "continue") {
        this.next = record.arg;
      } else if (record.type === "return") {
        this.rval = this.arg = record.arg;
        this.method = "return";
        this.next = "end";
      } else if (record.type === "normal" && afterLoc) {
        this.next = afterLoc;
      }

      return ContinueSentinel;
    },
    finish: function finish(finallyLoc) {
      for (var i = this.tryEntries.length - 1; i >= 0; --i) {
        var entry = this.tryEntries[i];

        if (entry.finallyLoc === finallyLoc) {
          this.complete(entry.completion, entry.afterLoc);
          resetTryEntry(entry);
          return ContinueSentinel;
        }
      }
    },
    "catch": function _catch(tryLoc) {
      for (var i = this.tryEntries.length - 1; i >= 0; --i) {
        var entry = this.tryEntries[i];

        if (entry.tryLoc === tryLoc) {
          var record = entry.completion;

          if (record.type === "throw") {
            var thrown = record.arg;
            resetTryEntry(entry);
          }

          return thrown;
        }
      } // The context.catch method must only be called with a location
      // argument that corresponds to a known catch block.


      throw new Error("illegal catch attempt");
    },
    delegateYield: function delegateYield(iterable, resultName, nextLoc) {
      this.delegate = {
        iterator: values(iterable),
        resultName: resultName,
        nextLoc: nextLoc
      };

      if (this.method === "next") {
        // Deliberately forget the last sent value so that we don't
        // accidentally pass it on to the delegate.
        this.arg = undefined;
      }

      return ContinueSentinel;
    }
  };
}( // Among the various tricks for obtaining a reference to the global
// object, this seems to be the most reliable technique that does not
// use indirect eval (which violates Content Security Policy).
(typeof global === "undefined" ? "undefined" : _typeof(global)) === "object" ? global : (typeof window === "undefined" ? "undefined" : _typeof(window)) === "object" ? window : (typeof self === "undefined" ? "undefined" : _typeof(self)) === "object" ? self : void 0);

}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})

},{}],363:[function(require,module,exports){
"use strict";

function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }

/*!
 * ScrollMagic v2.0.5 (2015-04-29)
 * The javascript library for magical scroll interactions.
 * (c) 2015 Jan Paepke (@janpaepke)
 * Project Website: http://scrollmagic.io
 * 
 * @version 2.0.5
 * @license Dual licensed under MIT license and GPL.
 * @author Jan Paepke - e-mail@janpaepke.de
 *
 * @file ScrollMagic main library.
 */

/**
 * @namespace ScrollMagic
 */
(function (root, factory) {
  if (typeof define === 'function' && define.amd) {
    // AMD. Register as an anonymous module.
    define(factory);
  } else if ((typeof exports === "undefined" ? "undefined" : _typeof(exports)) === 'object') {
    // CommonJS
    module.exports = factory();
  } else {
    // Browser global
    root.ScrollMagic = factory();
  }
})(void 0, function () {
  "use strict";

  var ScrollMagic = function ScrollMagic() {
    _util.log(2, '(COMPATIBILITY NOTICE) -> As of ScrollMagic 2.0.0 you need to use \'new ScrollMagic.Controller()\' to create a new controller instance. Use \'new ScrollMagic.Scene()\' to instance a scene.');
  };

  ScrollMagic.version = "2.0.5"; // TODO: temporary workaround for chrome's scroll jitter bug

  window.addEventListener("mousewheel", function () {}); // global const

  var PIN_SPACER_ATTRIBUTE = "data-scrollmagic-pin-spacer";
  /**
   * The main class that is needed once per scroll container.
   *
   * @class
   *
   * @example
   * // basic initialization
   * var controller = new ScrollMagic.Controller();
   *
   * // passing options
   * var controller = new ScrollMagic.Controller({container: "#myContainer", loglevel: 3});
   *
   * @param {object} [options] - An object containing one or more options for the controller.
   * @param {(string|object)} [options.container=window] - A selector, DOM object that references the main container for scrolling.
   * @param {boolean} [options.vertical=true] - Sets the scroll mode to vertical (`true`) or horizontal (`false`) scrolling.
   * @param {object} [options.globalSceneOptions={}] - These options will be passed to every Scene that is added to the controller using the addScene method. For more information on Scene options see {@link ScrollMagic.Scene}.
   * @param {number} [options.loglevel=2] Loglevel for debugging. Note that logging is disabled in the minified version of ScrollMagic.
   ** `0` => silent
   ** `1` => errors
   ** `2` => errors, warnings
   ** `3` => errors, warnings, debuginfo
   * @param {boolean} [options.refreshInterval=100] - Some changes don't call events by default, like changing the container size or moving a scene trigger element.  
   This interval polls these parameters to fire the necessary events.  
   If you don't use custom containers, trigger elements or have static layouts, where the positions of the trigger elements don't change, you can set this to 0 disable interval checking and improve performance.
   *
   */

  ScrollMagic.Controller = function (options) {
    /*
    	 * ----------------------------------------------------------------
    	 * settings
    	 * ----------------------------------------------------------------
    	 */
    var NAMESPACE = 'ScrollMagic.Controller',
        SCROLL_DIRECTION_FORWARD = 'FORWARD',
        SCROLL_DIRECTION_REVERSE = 'REVERSE',
        SCROLL_DIRECTION_PAUSED = 'PAUSED',
        DEFAULT_OPTIONS = CONTROLLER_OPTIONS.defaults;
    /*
    	 * ----------------------------------------------------------------
    	 * private vars
    	 * ----------------------------------------------------------------
    	 */

    var Controller = this,
        _options = _util.extend({}, DEFAULT_OPTIONS, options),
        _sceneObjects = [],
        _updateScenesOnNextCycle = false,
        // can be boolean (true => all scenes) or an array of scenes to be updated
    _scrollPos = 0,
        _scrollDirection = SCROLL_DIRECTION_PAUSED,
        _isDocument = true,
        _viewPortSize = 0,
        _enabled = true,
        _updateTimeout,
        _refreshTimeout;
    /*
    	 * ----------------------------------------------------------------
    	 * private functions
    	 * ----------------------------------------------------------------
    	 */

    /**
     * Internal constructor function of the ScrollMagic Controller
     * @private
     */


    var construct = function construct() {
      for (var key in _options) {
        if (!DEFAULT_OPTIONS.hasOwnProperty(key)) {
          log(2, "WARNING: Unknown option \"" + key + "\"");
          delete _options[key];
        }
      }

      _options.container = _util.get.elements(_options.container)[0]; // check ScrollContainer

      if (!_options.container) {
        log(1, "ERROR creating object " + NAMESPACE + ": No valid scroll container supplied");
        throw NAMESPACE + " init failed."; // cancel
      }

      _isDocument = _options.container === window || _options.container === document.body || !document.body.contains(_options.container); // normalize to window

      if (_isDocument) {
        _options.container = window;
      } // update container size immediately


      _viewPortSize = getViewportSize(); // set event handlers

      _options.container.addEventListener("resize", onChange);

      _options.container.addEventListener("scroll", onChange);

      _options.refreshInterval = parseInt(_options.refreshInterval) || DEFAULT_OPTIONS.refreshInterval;
      scheduleRefresh();
      log(3, "added new " + NAMESPACE + " controller (v" + ScrollMagic.version + ")");
    };
    /**
     * Schedule the next execution of the refresh function
     * @private
     */


    var scheduleRefresh = function scheduleRefresh() {
      if (_options.refreshInterval > 0) {
        _refreshTimeout = window.setTimeout(refresh, _options.refreshInterval);
      }
    };
    /**
     * Default function to get scroll pos - overwriteable using `Controller.scrollPos(newFunction)`
     * @private
     */


    var getScrollPos = function getScrollPos() {
      return _options.vertical ? _util.get.scrollTop(_options.container) : _util.get.scrollLeft(_options.container);
    };
    /**
     * Returns the current viewport Size (width vor horizontal, height for vertical)
     * @private
     */


    var getViewportSize = function getViewportSize() {
      return _options.vertical ? _util.get.height(_options.container) : _util.get.width(_options.container);
    };
    /**
     * Default function to set scroll pos - overwriteable using `Controller.scrollTo(newFunction)`
     * Make available publicly for pinned mousewheel workaround.
     * @private
     */


    var setScrollPos = this._setScrollPos = function (pos) {
      if (_options.vertical) {
        if (_isDocument) {
          window.scrollTo(_util.get.scrollLeft(), pos);
        } else {
          _options.container.scrollTop = pos;
        }
      } else {
        if (_isDocument) {
          window.scrollTo(pos, _util.get.scrollTop());
        } else {
          _options.container.scrollLeft = pos;
        }
      }
    };
    /**
     * Handle updates in cycles instead of on scroll (performance)
     * @private
     */


    var updateScenes = function updateScenes() {
      if (_enabled && _updateScenesOnNextCycle) {
        // determine scenes to update
        var scenesToUpdate = _util.type.Array(_updateScenesOnNextCycle) ? _updateScenesOnNextCycle : _sceneObjects.slice(0); // reset scenes

        _updateScenesOnNextCycle = false;
        var oldScrollPos = _scrollPos; // update scroll pos now instead of onChange, as it might have changed since scheduling (i.e. in-browser smooth scroll)

        _scrollPos = Controller.scrollPos();
        var deltaScroll = _scrollPos - oldScrollPos;

        if (deltaScroll !== 0) {
          // scroll position changed?
          _scrollDirection = deltaScroll > 0 ? SCROLL_DIRECTION_FORWARD : SCROLL_DIRECTION_REVERSE;
        } // reverse order of scenes if scrolling reverse


        if (_scrollDirection === SCROLL_DIRECTION_REVERSE) {
          scenesToUpdate.reverse();
        } // update scenes


        scenesToUpdate.forEach(function (scene, index) {
          log(3, "updating Scene " + (index + 1) + "/" + scenesToUpdate.length + " (" + _sceneObjects.length + " total)");
          scene.update(true);
        });

        if (scenesToUpdate.length === 0 && _options.loglevel >= 3) {
          log(3, "updating 0 Scenes (nothing added to controller)");
        }
      }
    };
    /**
     * Initializes rAF callback
     * @private
     */


    var debounceUpdate = function debounceUpdate() {
      _updateTimeout = _util.rAF(updateScenes);
    };
    /**
     * Handles Container changes
     * @private
     */


    var onChange = function onChange(e) {
      log(3, "event fired causing an update:", e.type);

      if (e.type == "resize") {
        // resize
        _viewPortSize = getViewportSize();
        _scrollDirection = SCROLL_DIRECTION_PAUSED;
      } // schedule update


      if (_updateScenesOnNextCycle !== true) {
        _updateScenesOnNextCycle = true;
        debounceUpdate();
      }
    };

    var refresh = function refresh() {
      if (!_isDocument) {
        // simulate resize event. Only works for viewport relevant param (performance)
        if (_viewPortSize != getViewportSize()) {
          var resizeEvent;

          try {
            resizeEvent = new Event('resize', {
              bubbles: false,
              cancelable: false
            });
          } catch (e) {
            // stupid IE
            resizeEvent = document.createEvent("Event");
            resizeEvent.initEvent("resize", false, false);
          }

          _options.container.dispatchEvent(resizeEvent);
        }
      }

      _sceneObjects.forEach(function (scene, index) {
        // refresh all scenes
        scene.refresh();
      });

      scheduleRefresh();
    };
    /**
     * Send a debug message to the console.
     * provided publicly with _log for plugins
     * @private
     *
     * @param {number} loglevel - The loglevel required to initiate output for the message.
     * @param {...mixed} output - One or more variables that should be passed to the console.
     */


    var log = this._log = function (loglevel, output) {
      if (_options.loglevel >= loglevel) {
        Array.prototype.splice.call(arguments, 1, 0, "(" + NAMESPACE + ") ->");

        _util.log.apply(window, arguments);
      }
    }; // for scenes we have getters for each option, but for the controller we don't, so we need to make it available externally for plugins


    this._options = _options;
    /**
     * Sort scenes in ascending order of their start offset.
     * @private
     *
     * @param {array} ScenesArray - an array of ScrollMagic Scenes that should be sorted
     * @return {array} The sorted array of Scenes.
     */

    var sortScenes = function sortScenes(ScenesArray) {
      if (ScenesArray.length <= 1) {
        return ScenesArray;
      } else {
        var scenes = ScenesArray.slice(0);
        scenes.sort(function (a, b) {
          return a.scrollOffset() > b.scrollOffset() ? 1 : -1;
        });
        return scenes;
      }
    };
    /**
     * ----------------------------------------------------------------
     * public functions
     * ----------------------------------------------------------------
     */

    /**
     * Add one ore more scene(s) to the controller.  
     * This is the equivalent to `Scene.addTo(controller)`.
     * @public
     * @example
     * // with a previously defined scene
     * controller.addScene(scene);
     *
     * // with a newly created scene.
     * controller.addScene(new ScrollMagic.Scene({duration : 0}));
     *
     * // adding multiple scenes
     * controller.addScene([scene, scene2, new ScrollMagic.Scene({duration : 0})]);
     *
     * @param {(ScrollMagic.Scene|array)} newScene - ScrollMagic Scene or Array of Scenes to be added to the controller.
     * @return {Controller} Parent object for chaining.
     */


    this.addScene = function (newScene) {
      if (_util.type.Array(newScene)) {
        newScene.forEach(function (scene, index) {
          Controller.addScene(scene);
        });
      } else if (newScene instanceof ScrollMagic.Scene) {
        if (newScene.controller() !== Controller) {
          newScene.addTo(Controller);
        } else if (_sceneObjects.indexOf(newScene) < 0) {
          // new scene
          _sceneObjects.push(newScene); // add to array


          _sceneObjects = sortScenes(_sceneObjects); // sort

          newScene.on("shift.controller_sort", function () {
            // resort whenever scene moves
            _sceneObjects = sortScenes(_sceneObjects);
          }); // insert Global defaults.

          for (var key in _options.globalSceneOptions) {
            if (newScene[key]) {
              newScene[key].call(newScene, _options.globalSceneOptions[key]);
            }
          }

          log(3, "adding Scene (now " + _sceneObjects.length + " total)");
        }
      } else {
        log(1, "ERROR: invalid argument supplied for '.addScene()'");
      }

      return Controller;
    };
    /**
     * Remove one ore more scene(s) from the controller.  
     * This is the equivalent to `Scene.remove()`.
     * @public
     * @example
     * // remove a scene from the controller
     * controller.removeScene(scene);
     *
     * // remove multiple scenes from the controller
     * controller.removeScene([scene, scene2, scene3]);
     *
     * @param {(ScrollMagic.Scene|array)} Scene - ScrollMagic Scene or Array of Scenes to be removed from the controller.
     * @returns {Controller} Parent object for chaining.
     */


    this.removeScene = function (Scene) {
      if (_util.type.Array(Scene)) {
        Scene.forEach(function (scene, index) {
          Controller.removeScene(scene);
        });
      } else {
        var index = _sceneObjects.indexOf(Scene);

        if (index > -1) {
          Scene.off("shift.controller_sort");

          _sceneObjects.splice(index, 1);

          log(3, "removing Scene (now " + _sceneObjects.length + " left)");
          Scene.remove();
        }
      }

      return Controller;
    };
    /**
     * Update one ore more scene(s) according to the scroll position of the container.  
     * This is the equivalent to `Scene.update()`.  
     * The update method calculates the scene's start and end position (based on the trigger element, trigger hook, duration and offset) and checks it against the current scroll position of the container.  
     * It then updates the current scene state accordingly (or does nothing, if the state is already correct) – Pins will be set to their correct position and tweens will be updated to their correct progress.  
     * _**Note:** This method gets called constantly whenever Controller detects a change. The only application for you is if you change something outside of the realm of ScrollMagic, like moving the trigger or changing tween parameters._
     * @public
     * @example
     * // update a specific scene on next cycle
     * controller.updateScene(scene);
     *
     * // update a specific scene immediately
     * controller.updateScene(scene, true);
     *
     * // update multiple scenes scene on next cycle
     * controller.updateScene([scene1, scene2, scene3]);
     *
     * @param {ScrollMagic.Scene} Scene - ScrollMagic Scene or Array of Scenes that is/are supposed to be updated.
     * @param {boolean} [immediately=false] - If `true` the update will be instant, if `false` it will wait until next update cycle.  
     This is useful when changing multiple properties of the scene - this way it will only be updated once all new properties are set (updateScenes).
     * @return {Controller} Parent object for chaining.
     */


    this.updateScene = function (Scene, immediately) {
      if (_util.type.Array(Scene)) {
        Scene.forEach(function (scene, index) {
          Controller.updateScene(scene, immediately);
        });
      } else {
        if (immediately) {
          Scene.update(true);
        } else if (_updateScenesOnNextCycle !== true && Scene instanceof ScrollMagic.Scene) {
          // if _updateScenesOnNextCycle is true, all connected scenes are already scheduled for update
          // prep array for next update cycle
          _updateScenesOnNextCycle = _updateScenesOnNextCycle || [];

          if (_updateScenesOnNextCycle.indexOf(Scene) == -1) {
            _updateScenesOnNextCycle.push(Scene);
          }

          _updateScenesOnNextCycle = sortScenes(_updateScenesOnNextCycle); // sort

          debounceUpdate();
        }
      }

      return Controller;
    };
    /**
     * Updates the controller params and calls updateScene on every scene, that is attached to the controller.  
     * See `Controller.updateScene()` for more information about what this means.  
     * In most cases you will not need this function, as it is called constantly, whenever ScrollMagic detects a state change event, like resize or scroll.  
     * The only application for this method is when ScrollMagic fails to detect these events.  
     * One application is with some external scroll libraries (like iScroll) that move an internal container to a negative offset instead of actually scrolling. In this case the update on the controller needs to be called whenever the child container's position changes.
     * For this case there will also be the need to provide a custom function to calculate the correct scroll position. See `Controller.scrollPos()` for details.
     * @public
     * @example
     * // update the controller on next cycle (saves performance due to elimination of redundant updates)
     * controller.update();
     *
     * // update the controller immediately
     * controller.update(true);
     *
     * @param {boolean} [immediately=false] - If `true` the update will be instant, if `false` it will wait until next update cycle (better performance)
     * @return {Controller} Parent object for chaining.
     */


    this.update = function (immediately) {
      onChange({
        type: "resize"
      }); // will update size and set _updateScenesOnNextCycle to true

      if (immediately) {
        updateScenes();
      }

      return Controller;
    };
    /**
     * Scroll to a numeric scroll offset, a DOM element, the start of a scene or provide an alternate method for scrolling.  
     * For vertical controllers it will change the top scroll offset and for horizontal applications it will change the left offset.
     * @public
     *
     * @since 1.1.0
     * @example
     * // scroll to an offset of 100
     * controller.scrollTo(100);
     *
     * // scroll to a DOM element
     * controller.scrollTo("#anchor");
     *
     * // scroll to the beginning of a scene
     * var scene = new ScrollMagic.Scene({offset: 200});
     * controller.scrollTo(scene);
     *
     * // define a new scroll position modification function (jQuery animate instead of jump)
     * controller.scrollTo(function (newScrollPos) {
     *	$("html, body").animate({scrollTop: newScrollPos});
     * });
     * controller.scrollTo(100); // call as usual, but the new function will be used instead
     *
     * // define a new scroll function with an additional parameter
     * controller.scrollTo(function (newScrollPos, message) {
     *  console.log(message);
     *	$(this).animate({scrollTop: newScrollPos});
     * });
     * // call as usual, but supply an extra parameter to the defined custom function
     * controller.scrollTo(100, "my message");
     *
     * // define a new scroll function with an additional parameter containing multiple variables
     * controller.scrollTo(function (newScrollPos, options) {
     *  someGlobalVar = options.a + options.b;
     *	$(this).animate({scrollTop: newScrollPos});
     * });
     * // call as usual, but supply an extra parameter containing multiple options
     * controller.scrollTo(100, {a: 1, b: 2});
     *
     * // define a new scroll function with a callback supplied as an additional parameter
     * controller.scrollTo(function (newScrollPos, callback) {
     *	$(this).animate({scrollTop: newScrollPos}, 400, "swing", callback);
     * });
     * // call as usual, but supply an extra parameter, which is used as a callback in the previously defined custom scroll function
     * controller.scrollTo(100, function() {
     *	console.log("scroll has finished.");
     * });
     *
     * @param {mixed} scrollTarget - The supplied argument can be one of these types:
     * 1. `number` -> The container will scroll to this new scroll offset.
     * 2. `string` or `object` -> Can be a selector or a DOM object.  
     *  The container will scroll to the position of this element.
     * 3. `ScrollMagic Scene` -> The container will scroll to the start of this scene.
     * 4. `function` -> This function will be used for future scroll position modifications.  
     *  This provides a way for you to change the behaviour of scrolling and adding new behaviour like animation. The function receives the new scroll position as a parameter and a reference to the container element using `this`.  
     *  It may also optionally receive an optional additional parameter (see below)  
     *  _**NOTE:**  
     *  All other options will still work as expected, using the new function to scroll._
     * @param {mixed} [additionalParameter] - If a custom scroll function was defined (see above 4.), you may want to supply additional parameters to it, when calling it. You can do this using this parameter – see examples for details. Please note, that this parameter will have no effect, if you use the default scrolling function.
     * @returns {Controller} Parent object for chaining.
     */


    this.scrollTo = function (scrollTarget, additionalParameter) {
      if (_util.type.Number(scrollTarget)) {
        // excecute
        setScrollPos.call(_options.container, scrollTarget, additionalParameter);
      } else if (scrollTarget instanceof ScrollMagic.Scene) {
        // scroll to scene
        if (scrollTarget.controller() === Controller) {
          // check if the controller is associated with this scene
          Controller.scrollTo(scrollTarget.scrollOffset(), additionalParameter);
        } else {
          log(2, "scrollTo(): The supplied scene does not belong to this controller. Scroll cancelled.", scrollTarget);
        }
      } else if (_util.type.Function(scrollTarget)) {
        // assign new scroll function
        setScrollPos = scrollTarget;
      } else {
        // scroll to element
        var elem = _util.get.elements(scrollTarget)[0];

        if (elem) {
          // if parent is pin spacer, use spacer position instead so correct start position is returned for pinned elements.
          while (elem.parentNode.hasAttribute(PIN_SPACER_ATTRIBUTE)) {
            elem = elem.parentNode;
          }

          var param = _options.vertical ? "top" : "left",
              // which param is of interest ?
          containerOffset = _util.get.offset(_options.container),
              // container position is needed because element offset is returned in relation to document, not in relation to container.
          elementOffset = _util.get.offset(elem);

          if (!_isDocument) {
            // container is not the document root, so substract scroll Position to get correct trigger element position relative to scrollcontent
            containerOffset[param] -= Controller.scrollPos();
          }

          Controller.scrollTo(elementOffset[param] - containerOffset[param], additionalParameter);
        } else {
          log(2, "scrollTo(): The supplied argument is invalid. Scroll cancelled.", scrollTarget);
        }
      }

      return Controller;
    };
    /**
     * **Get** the current scrollPosition or **Set** a new method to calculate it.  
     * -> **GET**:
     * When used as a getter this function will return the current scroll position.  
     * To get a cached value use Controller.info("scrollPos"), which will be updated in the update cycle.  
     * For vertical controllers it will return the top scroll offset and for horizontal applications it will return the left offset.
     *
     * -> **SET**:
     * When used as a setter this method prodes a way to permanently overwrite the controller's scroll position calculation.  
     * A typical usecase is when the scroll position is not reflected by the containers scrollTop or scrollLeft values, but for example by the inner offset of a child container.  
     * Moving a child container inside a parent is a commonly used method for several scrolling frameworks, including iScroll.  
     * By providing an alternate calculation function you can make sure ScrollMagic receives the correct scroll position.  
     * Please also bear in mind that your function should return y values for vertical scrolls an x for horizontals.
     *
     * To change the current scroll position please use `Controller.scrollTo()`.
     * @public
     *
     * @example
     * // get the current scroll Position
     * var scrollPos = controller.scrollPos();
     *
     * // set a new scroll position calculation method
     * controller.scrollPos(function () {
     *	return this.info("vertical") ? -mychildcontainer.y : -mychildcontainer.x
     * });
     *
     * @param {function} [scrollPosMethod] - The function to be used for the scroll position calculation of the container.
     * @returns {(number|Controller)} Current scroll position or parent object for chaining.
     */


    this.scrollPos = function (scrollPosMethod) {
      if (!arguments.length) {
        // get
        return getScrollPos.call(Controller);
      } else {
        // set
        if (_util.type.Function(scrollPosMethod)) {
          getScrollPos = scrollPosMethod;
        } else {
          log(2, "Provided value for method 'scrollPos' is not a function. To change the current scroll position use 'scrollTo()'.");
        }
      }

      return Controller;
    };
    /**
     * **Get** all infos or one in particular about the controller.
     * @public
     * @example
     * // returns the current scroll position (number)
     * var scrollPos = controller.info("scrollPos");
     *
     * // returns all infos as an object
     * var infos = controller.info();
     *
     * @param {string} [about] - If passed only this info will be returned instead of an object containing all.  
     Valid options are:
     ** `"size"` => the current viewport size of the container
     ** `"vertical"` => true if vertical scrolling, otherwise false
     ** `"scrollPos"` => the current scroll position
     ** `"scrollDirection"` => the last known direction of the scroll
     ** `"container"` => the container element
     ** `"isDocument"` => true if container element is the document.
     * @returns {(mixed|object)} The requested info(s).
     */


    this.info = function (about) {
      var values = {
        size: _viewPortSize,
        // contains height or width (in regard to orientation);
        vertical: _options.vertical,
        scrollPos: _scrollPos,
        scrollDirection: _scrollDirection,
        container: _options.container,
        isDocument: _isDocument
      };

      if (!arguments.length) {
        // get all as an object
        return values;
      } else if (values[about] !== undefined) {
        return values[about];
      } else {
        log(1, "ERROR: option \"" + about + "\" is not available");
        return;
      }
    };
    /**
     * **Get** or **Set** the current loglevel option value.
     * @public
     *
     * @example
     * // get the current value
     * var loglevel = controller.loglevel();
     *
     * // set a new value
     * controller.loglevel(3);
     *
     * @param {number} [newLoglevel] - The new loglevel setting of the Controller. `[0-3]`
     * @returns {(number|Controller)} Current loglevel or parent object for chaining.
     */


    this.loglevel = function (newLoglevel) {
      if (!arguments.length) {
        // get
        return _options.loglevel;
      } else if (_options.loglevel != newLoglevel) {
        // set
        _options.loglevel = newLoglevel;
      }

      return Controller;
    };
    /**
     * **Get** or **Set** the current enabled state of the controller.  
     * This can be used to disable all Scenes connected to the controller without destroying or removing them.
     * @public
     *
     * @example
     * // get the current value
     * var enabled = controller.enabled();
     *
     * // disable the controller
     * controller.enabled(false);
     *
     * @param {boolean} [newState] - The new enabled state of the controller `true` or `false`.
     * @returns {(boolean|Controller)} Current enabled state or parent object for chaining.
     */


    this.enabled = function (newState) {
      if (!arguments.length) {
        // get
        return _enabled;
      } else if (_enabled != newState) {
        // set
        _enabled = !!newState;
        Controller.updateScene(_sceneObjects, true);
      }

      return Controller;
    };
    /**
     * Destroy the Controller, all Scenes and everything.
     * @public
     *
     * @example
     * // without resetting the scenes
     * controller = controller.destroy();
     *
     * // with scene reset
     * controller = controller.destroy(true);
     *
     * @param {boolean} [resetScenes=false] - If `true` the pins and tweens (if existent) of all scenes will be reset.
     * @returns {null} Null to unset handler variables.
     */


    this.destroy = function (resetScenes) {
      window.clearTimeout(_refreshTimeout);
      var i = _sceneObjects.length;

      while (i--) {
        _sceneObjects[i].destroy(resetScenes);
      }

      _options.container.removeEventListener("resize", onChange);

      _options.container.removeEventListener("scroll", onChange);

      _util.cAF(_updateTimeout);

      log(3, "destroyed " + NAMESPACE + " (reset: " + (resetScenes ? "true" : "false") + ")");
      return null;
    }; // INIT


    construct();
    return Controller;
  }; // store pagewide controller options


  var CONTROLLER_OPTIONS = {
    defaults: {
      container: window,
      vertical: true,
      globalSceneOptions: {},
      loglevel: 2,
      refreshInterval: 100
    }
  };
  /*
   * method used to add an option to ScrollMagic Scenes.
   */

  ScrollMagic.Controller.addOption = function (name, defaultValue) {
    CONTROLLER_OPTIONS.defaults[name] = defaultValue;
  }; // instance extension function for plugins


  ScrollMagic.Controller.extend = function (extension) {
    var oldClass = this;

    ScrollMagic.Controller = function () {
      oldClass.apply(this, arguments);
      this.$super = _util.extend({}, this); // copy parent state

      return extension.apply(this, arguments) || this;
    };

    _util.extend(ScrollMagic.Controller, oldClass); // copy properties


    ScrollMagic.Controller.prototype = oldClass.prototype; // copy prototype

    ScrollMagic.Controller.prototype.constructor = ScrollMagic.Controller; // restore constructor
  };
  /**
   * A Scene defines where the controller should react and how.
   *
   * @class
   *
   * @example
   * // create a standard scene and add it to a controller
   * new ScrollMagic.Scene()
   *		.addTo(controller);
   *
   * // create a scene with custom options and assign a handler to it.
   * var scene = new ScrollMagic.Scene({
   * 		duration: 100,
   *		offset: 200,
   *		triggerHook: "onEnter",
   *		reverse: false
   * });
   *
   * @param {object} [options] - Options for the Scene. The options can be updated at any time.  
   Instead of setting the options for each scene individually you can also set them globally in the controller as the controllers `globalSceneOptions` option. The object accepts the same properties as the ones below.  
   When a scene is added to the controller the options defined using the Scene constructor will be overwritten by those set in `globalSceneOptions`.
   * @param {(number|function)} [options.duration=0] - The duration of the scene. 
   If `0` tweens will auto-play when reaching the scene start point, pins will be pinned indefinetly starting at the start position.  
   A function retuning the duration value is also supported. Please see `Scene.duration()` for details.
   * @param {number} [options.offset=0] - Offset Value for the Trigger Position. If no triggerElement is defined this will be the scroll distance from the start of the page, after which the scene will start.
   * @param {(string|object)} [options.triggerElement=null] - Selector or DOM object that defines the start of the scene. If undefined the scene will start right at the start of the page (unless an offset is set).
   * @param {(number|string)} [options.triggerHook="onCenter"] - Can be a number between 0 and 1 defining the position of the trigger Hook in relation to the viewport.  
   Can also be defined using a string:
   ** `"onEnter"` => `1`
   ** `"onCenter"` => `0.5`
   ** `"onLeave"` => `0`
   * @param {boolean} [options.reverse=true] - Should the scene reverse, when scrolling up?
   * @param {number} [options.loglevel=2] - Loglevel for debugging. Note that logging is disabled in the minified version of ScrollMagic.
   ** `0` => silent
   ** `1` => errors
   ** `2` => errors, warnings
   ** `3` => errors, warnings, debuginfo
   * 
   */


  ScrollMagic.Scene = function (options) {
    /*
    	 * ----------------------------------------------------------------
    	 * settings
    	 * ----------------------------------------------------------------
    	 */
    var NAMESPACE = 'ScrollMagic.Scene',
        SCENE_STATE_BEFORE = 'BEFORE',
        SCENE_STATE_DURING = 'DURING',
        SCENE_STATE_AFTER = 'AFTER',
        DEFAULT_OPTIONS = SCENE_OPTIONS.defaults;
    /*
    	 * ----------------------------------------------------------------
    	 * private vars
    	 * ----------------------------------------------------------------
    	 */

    var Scene = this,
        _options = _util.extend({}, DEFAULT_OPTIONS, options),
        _state = SCENE_STATE_BEFORE,
        _progress = 0,
        _scrollOffset = {
      start: 0,
      end: 0
    },
        // reflects the controllers's scroll position for the start and end of the scene respectively
    _triggerPos = 0,
        _enabled = true,
        _durationUpdateMethod,
        _controller;
    /**
     * Internal constructor function of the ScrollMagic Scene
     * @private
     */


    var construct = function construct() {
      for (var key in _options) {
        // check supplied options
        if (!DEFAULT_OPTIONS.hasOwnProperty(key)) {
          log(2, "WARNING: Unknown option \"" + key + "\"");
          delete _options[key];
        }
      } // add getters/setters for all possible options


      for (var optionName in DEFAULT_OPTIONS) {
        addSceneOption(optionName);
      } // validate all options


      validateOption();
    };
    /*
     * ----------------------------------------------------------------
     * Event Management
     * ----------------------------------------------------------------
     */


    var _listeners = {};
    /**
     * Scene start event.  
     * Fires whenever the scroll position its the starting point of the scene.  
     * It will also fire when scrolling back up going over the start position of the scene. If you want something to happen only when scrolling down/right, use the scrollDirection parameter passed to the callback.
     *
     * For details on this event and the order in which it is fired, please review the {@link Scene.progress} method.
     *
     * @event ScrollMagic.Scene#start
     *
     * @example
     * scene.on("start", function (event) {
     * 	console.log("Hit start point of scene.");
     * });
     *
     * @property {object} event - The event Object passed to each callback
     * @property {string} event.type - The name of the event
     * @property {Scene} event.target - The Scene object that triggered this event
     * @property {number} event.progress - Reflects the current progress of the scene
     * @property {string} event.state - The current state of the scene `"BEFORE"` or `"DURING"`
     * @property {string} event.scrollDirection - Indicates which way we are scrolling `"PAUSED"`, `"FORWARD"` or `"REVERSE"`
     */

    /**
     * Scene end event.  
     * Fires whenever the scroll position its the ending point of the scene.  
     * It will also fire when scrolling back up from after the scene and going over its end position. If you want something to happen only when scrolling down/right, use the scrollDirection parameter passed to the callback.
     *
     * For details on this event and the order in which it is fired, please review the {@link Scene.progress} method.
     *
     * @event ScrollMagic.Scene#end
     *
     * @example
     * scene.on("end", function (event) {
     * 	console.log("Hit end point of scene.");
     * });
     *
     * @property {object} event - The event Object passed to each callback
     * @property {string} event.type - The name of the event
     * @property {Scene} event.target - The Scene object that triggered this event
     * @property {number} event.progress - Reflects the current progress of the scene
     * @property {string} event.state - The current state of the scene `"DURING"` or `"AFTER"`
     * @property {string} event.scrollDirection - Indicates which way we are scrolling `"PAUSED"`, `"FORWARD"` or `"REVERSE"`
     */

    /**
     * Scene enter event.  
     * Fires whenever the scene enters the "DURING" state.  
     * Keep in mind that it doesn't matter if the scene plays forward or backward: This event always fires when the scene enters its active scroll timeframe, regardless of the scroll-direction.
     *
     * For details on this event and the order in which it is fired, please review the {@link Scene.progress} method.
     *
     * @event ScrollMagic.Scene#enter
     *
     * @example
     * scene.on("enter", function (event) {
     * 	console.log("Scene entered.");
     * });
     *
     * @property {object} event - The event Object passed to each callback
     * @property {string} event.type - The name of the event
     * @property {Scene} event.target - The Scene object that triggered this event
     * @property {number} event.progress - Reflects the current progress of the scene
     * @property {string} event.state - The current state of the scene - always `"DURING"`
     * @property {string} event.scrollDirection - Indicates which way we are scrolling `"PAUSED"`, `"FORWARD"` or `"REVERSE"`
     */

    /**
     * Scene leave event.  
     * Fires whenever the scene's state goes from "DURING" to either "BEFORE" or "AFTER".  
     * Keep in mind that it doesn't matter if the scene plays forward or backward: This event always fires when the scene leaves its active scroll timeframe, regardless of the scroll-direction.
     *
     * For details on this event and the order in which it is fired, please review the {@link Scene.progress} method.
     *
     * @event ScrollMagic.Scene#leave
     *
     * @example
     * scene.on("leave", function (event) {
     * 	console.log("Scene left.");
     * });
     *
     * @property {object} event - The event Object passed to each callback
     * @property {string} event.type - The name of the event
     * @property {Scene} event.target - The Scene object that triggered this event
     * @property {number} event.progress - Reflects the current progress of the scene
     * @property {string} event.state - The current state of the scene `"BEFORE"` or `"AFTER"`
     * @property {string} event.scrollDirection - Indicates which way we are scrolling `"PAUSED"`, `"FORWARD"` or `"REVERSE"`
     */

    /**
     * Scene update event.  
     * Fires whenever the scene is updated (but not necessarily changes the progress).
     *
     * @event ScrollMagic.Scene#update
     *
     * @example
     * scene.on("update", function (event) {
     * 	console.log("Scene updated.");
     * });
     *
     * @property {object} event - The event Object passed to each callback
     * @property {string} event.type - The name of the event
     * @property {Scene} event.target - The Scene object that triggered this event
     * @property {number} event.startPos - The starting position of the scene (in relation to the conainer)
     * @property {number} event.endPos - The ending position of the scene (in relation to the conainer)
     * @property {number} event.scrollPos - The current scroll position of the container
     */

    /**
     * Scene progress event.  
     * Fires whenever the progress of the scene changes.
     *
     * For details on this event and the order in which it is fired, please review the {@link Scene.progress} method.
     *
     * @event ScrollMagic.Scene#progress
     *
     * @example
     * scene.on("progress", function (event) {
     * 	console.log("Scene progress changed to " + event.progress);
     * });
     *
     * @property {object} event - The event Object passed to each callback
     * @property {string} event.type - The name of the event
     * @property {Scene} event.target - The Scene object that triggered this event
     * @property {number} event.progress - Reflects the current progress of the scene
     * @property {string} event.state - The current state of the scene `"BEFORE"`, `"DURING"` or `"AFTER"`
     * @property {string} event.scrollDirection - Indicates which way we are scrolling `"PAUSED"`, `"FORWARD"` or `"REVERSE"`
     */

    /**
     * Scene change event.  
     * Fires whenvever a property of the scene is changed.
     *
     * @event ScrollMagic.Scene#change
     *
     * @example
     * scene.on("change", function (event) {
     * 	console.log("Scene Property \"" + event.what + "\" changed to " + event.newval);
     * });
     *
     * @property {object} event - The event Object passed to each callback
     * @property {string} event.type - The name of the event
     * @property {Scene} event.target - The Scene object that triggered this event
     * @property {string} event.what - Indicates what value has been changed
     * @property {mixed} event.newval - The new value of the changed property
     */

    /**
     * Scene shift event.  
     * Fires whenvever the start or end **scroll offset** of the scene change.
     * This happens explicitely, when one of these values change: `offset`, `duration` or `triggerHook`.
     * It will fire implicitly when the `triggerElement` changes, if the new element has a different position (most cases).
     * It will also fire implicitly when the size of the container changes and the triggerHook is anything other than `onLeave`.
     *
     * @event ScrollMagic.Scene#shift
     * @since 1.1.0
     *
     * @example
     * scene.on("shift", function (event) {
     * 	console.log("Scene moved, because the " + event.reason + " has changed.)");
     * });
     *
     * @property {object} event - The event Object passed to each callback
     * @property {string} event.type - The name of the event
     * @property {Scene} event.target - The Scene object that triggered this event
     * @property {string} event.reason - Indicates why the scene has shifted
     */

    /**
     * Scene destroy event.  
     * Fires whenvever the scene is destroyed.
     * This can be used to tidy up custom behaviour used in events.
     *
     * @event ScrollMagic.Scene#destroy
     * @since 1.1.0
     *
     * @example
     * scene.on("enter", function (event) {
     *        // add custom action
     *        $("#my-elem").left("200");
     *      })
     *      .on("destroy", function (event) {
     *        // reset my element to start position
     *        if (event.reset) {
     *          $("#my-elem").left("0");
     *        }
     *      });
     *
     * @property {object} event - The event Object passed to each callback
     * @property {string} event.type - The name of the event
     * @property {Scene} event.target - The Scene object that triggered this event
     * @property {boolean} event.reset - Indicates if the destroy method was called with reset `true` or `false`.
     */

    /**
     * Scene add event.  
     * Fires when the scene is added to a controller.
     * This is mostly used by plugins to know that change might be due.
     *
     * @event ScrollMagic.Scene#add
     * @since 2.0.0
     *
     * @example
     * scene.on("add", function (event) {
     * 	console.log('Scene was added to a new controller.');
     * });
     *
     * @property {object} event - The event Object passed to each callback
     * @property {string} event.type - The name of the event
     * @property {Scene} event.target - The Scene object that triggered this event
     * @property {boolean} event.controller - The controller object the scene was added to.
     */

    /**
     * Scene remove event.  
     * Fires when the scene is removed from a controller.
     * This is mostly used by plugins to know that change might be due.
     *
     * @event ScrollMagic.Scene#remove
     * @since 2.0.0
     *
     * @example
     * scene.on("remove", function (event) {
     * 	console.log('Scene was removed from its controller.');
     * });
     *
     * @property {object} event - The event Object passed to each callback
     * @property {string} event.type - The name of the event
     * @property {Scene} event.target - The Scene object that triggered this event
     */

    /**
     * Add one ore more event listener.  
     * The callback function will be fired at the respective event, and an object containing relevant data will be passed to the callback.
     * @method ScrollMagic.Scene#on
     *
     * @example
     * function callback (event) {
     * 		console.log("Event fired! (" + event.type + ")");
     * }
     * // add listeners
     * scene.on("change update progress start end enter leave", callback);
     *
     * @param {string} names - The name or names of the event the callback should be attached to.
     * @param {function} callback - A function that should be executed, when the event is dispatched. An event object will be passed to the callback.
     * @returns {Scene} Parent object for chaining.
     */

    this.on = function (names, callback) {
      if (_util.type.Function(callback)) {
        names = names.trim().split(' ');
        names.forEach(function (fullname) {
          var nameparts = fullname.split('.'),
              eventname = nameparts[0],
              namespace = nameparts[1];

          if (eventname != "*") {
            // disallow wildcards
            if (!_listeners[eventname]) {
              _listeners[eventname] = [];
            }

            _listeners[eventname].push({
              namespace: namespace || '',
              callback: callback
            });
          }
        });
      } else {
        log(1, "ERROR when calling '.on()': Supplied callback for '" + names + "' is not a valid function!");
      }

      return Scene;
    };
    /**
     * Remove one or more event listener.
     * @method ScrollMagic.Scene#off
     *
     * @example
     * function callback (event) {
     * 		console.log("Event fired! (" + event.type + ")");
     * }
     * // add listeners
     * scene.on("change update", callback);
     * // remove listeners
     * scene.off("change update", callback);
     *
     * @param {string} names - The name or names of the event that should be removed.
     * @param {function} [callback] - A specific callback function that should be removed. If none is passed all callbacks to the event listener will be removed.
     * @returns {Scene} Parent object for chaining.
     */


    this.off = function (names, callback) {
      if (!names) {
        log(1, "ERROR: Invalid event name supplied.");
        return Scene;
      }

      names = names.trim().split(' ');
      names.forEach(function (fullname, key) {
        var nameparts = fullname.split('.'),
            eventname = nameparts[0],
            namespace = nameparts[1] || '',
            removeList = eventname === '*' ? Object.keys(_listeners) : [eventname];
        removeList.forEach(function (remove) {
          var list = _listeners[remove] || [],
              i = list.length;

          while (i--) {
            var listener = list[i];

            if (listener && (namespace === listener.namespace || namespace === '*') && (!callback || callback == listener.callback)) {
              list.splice(i, 1);
            }
          }

          if (!list.length) {
            delete _listeners[remove];
          }
        });
      });
      return Scene;
    };
    /**
     * Trigger an event.
     * @method ScrollMagic.Scene#trigger
     *
     * @example
     * this.trigger("change");
     *
     * @param {string} name - The name of the event that should be triggered.
     * @param {object} [vars] - An object containing info that should be passed to the callback.
     * @returns {Scene} Parent object for chaining.
     */


    this.trigger = function (name, vars) {
      if (name) {
        var nameparts = name.trim().split('.'),
            eventname = nameparts[0],
            namespace = nameparts[1],
            listeners = _listeners[eventname];
        log(3, 'event fired:', eventname, vars ? "->" : '', vars || '');

        if (listeners) {
          listeners.forEach(function (listener, key) {
            if (!namespace || namespace === listener.namespace) {
              listener.callback.call(Scene, new ScrollMagic.Event(eventname, listener.namespace, Scene, vars));
            }
          });
        }
      } else {
        log(1, "ERROR: Invalid event name supplied.");
      }

      return Scene;
    }; // set event listeners


    Scene.on("change.internal", function (e) {
      if (e.what !== "loglevel" && e.what !== "tweenChanges") {
        // no need for a scene update scene with these options...
        if (e.what === "triggerElement") {
          updateTriggerElementPosition();
        } else if (e.what === "reverse") {
          // the only property left that may have an impact on the current scene state. Everything else is handled by the shift event.
          Scene.update();
        }
      }
    }).on("shift.internal", function (e) {
      updateScrollOffset();
      Scene.update(); // update scene to reflect new position
    });
    /**
     * Send a debug message to the console.
     * @private
     * but provided publicly with _log for plugins
     *
     * @param {number} loglevel - The loglevel required to initiate output for the message.
     * @param {...mixed} output - One or more variables that should be passed to the console.
     */

    var log = this._log = function (loglevel, output) {
      if (_options.loglevel >= loglevel) {
        Array.prototype.splice.call(arguments, 1, 0, "(" + NAMESPACE + ") ->");

        _util.log.apply(window, arguments);
      }
    };
    /**
     * Add the scene to a controller.  
     * This is the equivalent to `Controller.addScene(scene)`.
     * @method ScrollMagic.Scene#addTo
     *
     * @example
     * // add a scene to a ScrollMagic Controller
     * scene.addTo(controller);
     *
     * @param {ScrollMagic.Controller} controller - The controller to which the scene should be added.
     * @returns {Scene} Parent object for chaining.
     */


    this.addTo = function (controller) {
      if (!(controller instanceof ScrollMagic.Controller)) {
        log(1, "ERROR: supplied argument of 'addTo()' is not a valid ScrollMagic Controller");
      } else if (_controller != controller) {
        // new controller
        if (_controller) {
          // was associated to a different controller before, so remove it...
          _controller.removeScene(Scene);
        }

        _controller = controller;
        validateOption();
        updateDuration(true);
        updateTriggerElementPosition(true);
        updateScrollOffset();

        _controller.info("container").addEventListener('resize', onContainerResize);

        controller.addScene(Scene);
        Scene.trigger("add", {
          controller: _controller
        });
        log(3, "added " + NAMESPACE + " to controller");
        Scene.update();
      }

      return Scene;
    };
    /**
     * **Get** or **Set** the current enabled state of the scene.  
     * This can be used to disable this scene without removing or destroying it.
     * @method ScrollMagic.Scene#enabled
     *
     * @example
     * // get the current value
     * var enabled = scene.enabled();
     *
     * // disable the scene
     * scene.enabled(false);
     *
     * @param {boolean} [newState] - The new enabled state of the scene `true` or `false`.
     * @returns {(boolean|Scene)} Current enabled state or parent object for chaining.
     */


    this.enabled = function (newState) {
      if (!arguments.length) {
        // get
        return _enabled;
      } else if (_enabled != newState) {
        // set
        _enabled = !!newState;
        Scene.update(true);
      }

      return Scene;
    };
    /**
     * Remove the scene from the controller.  
     * This is the equivalent to `Controller.removeScene(scene)`.
     * The scene will not be updated anymore until you readd it to a controller.
     * To remove the pin or the tween you need to call removeTween() or removePin() respectively.
     * @method ScrollMagic.Scene#remove
     * @example
     * // remove the scene from its controller
     * scene.remove();
     *
     * @returns {Scene} Parent object for chaining.
     */


    this.remove = function () {
      if (_controller) {
        _controller.info("container").removeEventListener('resize', onContainerResize);

        var tmpParent = _controller;
        _controller = undefined;
        tmpParent.removeScene(Scene);
        Scene.trigger("remove");
        log(3, "removed " + NAMESPACE + " from controller");
      }

      return Scene;
    };
    /**
     * Destroy the scene and everything.
     * @method ScrollMagic.Scene#destroy
     * @example
     * // destroy the scene without resetting the pin and tween to their initial positions
     * scene = scene.destroy();
     *
     * // destroy the scene and reset the pin and tween
     * scene = scene.destroy(true);
     *
     * @param {boolean} [reset=false] - If `true` the pin and tween (if existent) will be reset.
     * @returns {null} Null to unset handler variables.
     */


    this.destroy = function (reset) {
      Scene.trigger("destroy", {
        reset: reset
      });
      Scene.remove();
      Scene.off("*.*");
      log(3, "destroyed " + NAMESPACE + " (reset: " + (reset ? "true" : "false") + ")");
      return null;
    };
    /**
     * Updates the Scene to reflect the current state.  
     * This is the equivalent to `Controller.updateScene(scene, immediately)`.  
     * The update method calculates the scene's start and end position (based on the trigger element, trigger hook, duration and offset) and checks it against the current scroll position of the container.  
     * It then updates the current scene state accordingly (or does nothing, if the state is already correct) – Pins will be set to their correct position and tweens will be updated to their correct progress.
     * This means an update doesn't necessarily result in a progress change. The `progress` event will be fired if the progress has indeed changed between this update and the last.  
     * _**NOTE:** This method gets called constantly whenever ScrollMagic detects a change. The only application for you is if you change something outside of the realm of ScrollMagic, like moving the trigger or changing tween parameters._
     * @method ScrollMagic.Scene#update
     * @example
     * // update the scene on next tick
     * scene.update();
     *
     * // update the scene immediately
     * scene.update(true);
     *
     * @fires Scene.update
     *
     * @param {boolean} [immediately=false] - If `true` the update will be instant, if `false` it will wait until next update cycle (better performance).
     * @returns {Scene} Parent object for chaining.
     */


    this.update = function (immediately) {
      if (_controller) {
        if (immediately) {
          if (_controller.enabled() && _enabled) {
            var scrollPos = _controller.info("scrollPos"),
                newProgress;

            if (_options.duration > 0) {
              newProgress = (scrollPos - _scrollOffset.start) / (_scrollOffset.end - _scrollOffset.start);
            } else {
              newProgress = scrollPos >= _scrollOffset.start ? 1 : 0;
            }

            Scene.trigger("update", {
              startPos: _scrollOffset.start,
              endPos: _scrollOffset.end,
              scrollPos: scrollPos
            });
            Scene.progress(newProgress);
          } else if (_pin && _state === SCENE_STATE_DURING) {
            updatePinState(true); // unpin in position
          }
        } else {
          _controller.updateScene(Scene, false);
        }
      }

      return Scene;
    };
    /**
     * Updates dynamic scene variables like the trigger element position or the duration.
     * This method is automatically called in regular intervals from the controller. See {@link ScrollMagic.Controller} option `refreshInterval`.
     * 
     * You can call it to minimize lag, for example when you intentionally change the position of the triggerElement.
     * If you don't it will simply be updated in the next refresh interval of the container, which is usually sufficient.
     *
     * @method ScrollMagic.Scene#refresh
     * @since 1.1.0
     * @example
     * scene = new ScrollMagic.Scene({triggerElement: "#trigger"});
     * 
     * // change the position of the trigger
     * $("#trigger").css("top", 500);
     * // immediately let the scene know of this change
     * scene.refresh();
     *
     * @fires {@link Scene.shift}, if the trigger element position or the duration changed
     * @fires {@link Scene.change}, if the duration changed
     *
     * @returns {Scene} Parent object for chaining.
     */


    this.refresh = function () {
      updateDuration();
      updateTriggerElementPosition(); // update trigger element position

      return Scene;
    };
    /**
     * **Get** or **Set** the scene's progress.  
     * Usually it shouldn't be necessary to use this as a setter, as it is set automatically by scene.update().  
     * The order in which the events are fired depends on the duration of the scene:
     *  1. Scenes with `duration == 0`:  
     *  Scenes that have no duration by definition have no ending. Thus the `end` event will never be fired.  
     *  When the trigger position of the scene is passed the events are always fired in this order:  
     *  `enter`, `start`, `progress` when scrolling forward  
     *  and  
     *  `progress`, `start`, `leave` when scrolling in reverse
     *  2. Scenes with `duration > 0`:  
     *  Scenes with a set duration have a defined start and end point.  
     *  When scrolling past the start position of the scene it will fire these events in this order:  
     *  `enter`, `start`, `progress`  
     *  When continuing to scroll and passing the end point it will fire these events:  
     *  `progress`, `end`, `leave`  
     *  When reversing through the end point these events are fired:  
     *  `enter`, `end`, `progress`  
     *  And when continuing to scroll past the start position in reverse it will fire:  
     *  `progress`, `start`, `leave`  
     *  In between start and end the `progress` event will be called constantly, whenever the progress changes.
     * 
     * In short:  
     * `enter` events will always trigger **before** the progress update and `leave` envents will trigger **after** the progress update.  
     * `start` and `end` will always trigger at their respective position.
     * 
     * Please review the event descriptions for details on the events and the event object that is passed to the callback.
     * 
     * @method ScrollMagic.Scene#progress
     * @example
     * // get the current scene progress
     * var progress = scene.progress();
     *
     * // set new scene progress
     * scene.progress(0.3);
     *
     * @fires {@link Scene.enter}, when used as setter
     * @fires {@link Scene.start}, when used as setter
     * @fires {@link Scene.progress}, when used as setter
     * @fires {@link Scene.end}, when used as setter
     * @fires {@link Scene.leave}, when used as setter
     *
     * @param {number} [progress] - The new progress value of the scene `[0-1]`.
     * @returns {number} `get` -  Current scene progress.
     * @returns {Scene} `set` -  Parent object for chaining.
     */


    this.progress = function (progress) {
      if (!arguments.length) {
        // get
        return _progress;
      } else {
        // set
        var doUpdate = false,
            oldState = _state,
            scrollDirection = _controller ? _controller.info("scrollDirection") : 'PAUSED',
            reverseOrForward = _options.reverse || progress >= _progress;

        if (_options.duration === 0) {
          // zero duration scenes
          doUpdate = _progress != progress;
          _progress = progress < 1 && reverseOrForward ? 0 : 1;
          _state = _progress === 0 ? SCENE_STATE_BEFORE : SCENE_STATE_DURING;
        } else {
          // scenes with start and end
          if (progress < 0 && _state !== SCENE_STATE_BEFORE && reverseOrForward) {
            // go back to initial state
            _progress = 0;
            _state = SCENE_STATE_BEFORE;
            doUpdate = true;
          } else if (progress >= 0 && progress < 1 && reverseOrForward) {
            _progress = progress;
            _state = SCENE_STATE_DURING;
            doUpdate = true;
          } else if (progress >= 1 && _state !== SCENE_STATE_AFTER) {
            _progress = 1;
            _state = SCENE_STATE_AFTER;
            doUpdate = true;
          } else if (_state === SCENE_STATE_DURING && !reverseOrForward) {
            updatePinState(); // in case we scrolled backwards mid-scene and reverse is disabled => update the pin position, so it doesn't move back as well.
          }
        }

        if (doUpdate) {
          // fire events
          var eventVars = {
            progress: _progress,
            state: _state,
            scrollDirection: scrollDirection
          },
              stateChanged = _state != oldState;

          var trigger = function trigger(eventName) {
            // tmp helper to simplify code
            Scene.trigger(eventName, eventVars);
          };

          if (stateChanged) {
            // enter events
            if (oldState !== SCENE_STATE_DURING) {
              trigger("enter");
              trigger(oldState === SCENE_STATE_BEFORE ? "start" : "end");
            }
          }

          trigger("progress");

          if (stateChanged) {
            // leave events
            if (_state !== SCENE_STATE_DURING) {
              trigger(_state === SCENE_STATE_BEFORE ? "start" : "end");
              trigger("leave");
            }
          }
        }

        return Scene;
      }
    };
    /**
     * Update the start and end scrollOffset of the container.
     * The positions reflect what the controller's scroll position will be at the start and end respectively.
     * Is called, when:
     *   - Scene event "change" is called with: offset, triggerHook, duration 
     *   - scroll container event "resize" is called
     *   - the position of the triggerElement changes
     *   - the controller changes -> addTo()
     * @private
     */


    var updateScrollOffset = function updateScrollOffset() {
      _scrollOffset = {
        start: _triggerPos + _options.offset
      };

      if (_controller && _options.triggerElement) {
        // take away triggerHook portion to get relative to top
        _scrollOffset.start -= _controller.info("size") * _options.triggerHook;
      }

      _scrollOffset.end = _scrollOffset.start + _options.duration;
    };
    /**
     * Updates the duration if set to a dynamic function.
     * This method is called when the scene is added to a controller and in regular intervals from the controller through scene.refresh().
     * 
     * @fires {@link Scene.change}, if the duration changed
     * @fires {@link Scene.shift}, if the duration changed
     *
     * @param {boolean} [suppressEvents=false] - If true the shift event will be suppressed.
     * @private
     */


    var updateDuration = function updateDuration(suppressEvents) {
      // update duration
      if (_durationUpdateMethod) {
        var varname = "duration";

        if (changeOption(varname, _durationUpdateMethod.call(Scene)) && !suppressEvents) {
          // set
          Scene.trigger("change", {
            what: varname,
            newval: _options[varname]
          });
          Scene.trigger("shift", {
            reason: varname
          });
        }
      }
    };
    /**
     * Updates the position of the triggerElement, if present.
     * This method is called ...
     *  - ... when the triggerElement is changed
     *  - ... when the scene is added to a (new) controller
     *  - ... in regular intervals from the controller through scene.refresh().
     * 
     * @fires {@link Scene.shift}, if the position changed
     *
     * @param {boolean} [suppressEvents=false] - If true the shift event will be suppressed.
     * @private
     */


    var updateTriggerElementPosition = function updateTriggerElementPosition(suppressEvents) {
      var elementPos = 0,
          telem = _options.triggerElement;

      if (_controller && telem) {
        var controllerInfo = _controller.info(),
            containerOffset = _util.get.offset(controllerInfo.container),
            // container position is needed because element offset is returned in relation to document, not in relation to container.
        param = controllerInfo.vertical ? "top" : "left"; // which param is of interest ?
        // if parent is spacer, use spacer position instead so correct start position is returned for pinned elements.


        while (telem.parentNode.hasAttribute(PIN_SPACER_ATTRIBUTE)) {
          telem = telem.parentNode;
        }

        var elementOffset = _util.get.offset(telem);

        if (!controllerInfo.isDocument) {
          // container is not the document root, so substract scroll Position to get correct trigger element position relative to scrollcontent
          containerOffset[param] -= _controller.scrollPos();
        }

        elementPos = elementOffset[param] - containerOffset[param];
      }

      var changed = elementPos != _triggerPos;
      _triggerPos = elementPos;

      if (changed && !suppressEvents) {
        Scene.trigger("shift", {
          reason: "triggerElementPosition"
        });
      }
    };
    /**
     * Trigger a shift event, when the container is resized and the triggerHook is > 1.
     * @private
     */


    var onContainerResize = function onContainerResize(e) {
      if (_options.triggerHook > 0) {
        Scene.trigger("shift", {
          reason: "containerResize"
        });
      }
    };

    var _validate = _util.extend(SCENE_OPTIONS.validate, {
      // validation for duration handled internally for reference to private var _durationMethod
      duration: function duration(val) {
        if (_util.type.String(val) && val.match(/^(\.|\d)*\d+%$/)) {
          // percentage value
          var perc = parseFloat(val) / 100;

          val = function val() {
            return _controller ? _controller.info("size") * perc : 0;
          };
        }

        if (_util.type.Function(val)) {
          // function
          _durationUpdateMethod = val;

          try {
            val = parseFloat(_durationUpdateMethod());
          } catch (e) {
            val = -1; // will cause error below
          }
        } // val has to be float


        val = parseFloat(val);

        if (!_util.type.Number(val) || val < 0) {
          if (_durationUpdateMethod) {
            _durationUpdateMethod = undefined;
            throw ["Invalid return value of supplied function for option \"duration\":", val];
          } else {
            throw ["Invalid value for option \"duration\":", val];
          }
        }

        return val;
      }
    });
    /**
     * Checks the validity of a specific or all options and reset to default if neccessary.
     * @private
     */


    var validateOption = function validateOption(check) {
      check = arguments.length ? [check] : Object.keys(_validate);
      check.forEach(function (optionName, key) {
        var value;

        if (_validate[optionName]) {
          // there is a validation method for this option
          try {
            // validate value
            value = _validate[optionName](_options[optionName]);
          } catch (e) {
            // validation failed -> reset to default
            value = DEFAULT_OPTIONS[optionName];
            var logMSG = _util.type.String(e) ? [e] : e;

            if (_util.type.Array(logMSG)) {
              logMSG[0] = "ERROR: " + logMSG[0];
              logMSG.unshift(1); // loglevel 1 for error msg

              log.apply(this, logMSG);
            } else {
              log(1, "ERROR: Problem executing validation callback for option '" + optionName + "':", e.message);
            }
          } finally {
            _options[optionName] = value;
          }
        }
      });
    };
    /**
     * Helper used by the setter/getters for scene options
     * @private
     */


    var changeOption = function changeOption(varname, newval) {
      var changed = false,
          oldval = _options[varname];

      if (_options[varname] != newval) {
        _options[varname] = newval;
        validateOption(varname); // resets to default if necessary

        changed = oldval != _options[varname];
      }

      return changed;
    }; // generate getters/setters for all options


    var addSceneOption = function addSceneOption(optionName) {
      if (!Scene[optionName]) {
        Scene[optionName] = function (newVal) {
          if (!arguments.length) {
            // get
            return _options[optionName];
          } else {
            if (optionName === "duration") {
              // new duration is set, so any previously set function must be unset
              _durationUpdateMethod = undefined;
            }

            if (changeOption(optionName, newVal)) {
              // set
              Scene.trigger("change", {
                what: optionName,
                newval: _options[optionName]
              });

              if (SCENE_OPTIONS.shifts.indexOf(optionName) > -1) {
                Scene.trigger("shift", {
                  reason: optionName
                });
              }
            }
          }

          return Scene;
        };
      }
    };
    /**
     * **Get** or **Set** the duration option value.
     * As a setter it also accepts a function returning a numeric value.  
     * This is particularly useful for responsive setups.
     *
     * The duration is updated using the supplied function every time `Scene.refresh()` is called, which happens periodically from the controller (see ScrollMagic.Controller option `refreshInterval`).  
     * _**NOTE:** Be aware that it's an easy way to kill performance, if you supply a function that has high CPU demand.  
     * Even for size and position calculations it is recommended to use a variable to cache the value. (see example)  
     * This counts double if you use the same function for multiple scenes._
     *
     * @method ScrollMagic.Scene#duration
     * @example
     * // get the current duration value
     * var duration = scene.duration();
     *
     * // set a new duration
     * scene.duration(300);
     *
     * // use a function to automatically adjust the duration to the window height.
     * var durationValueCache;
     * function getDuration () {
     *   return durationValueCache;
     * }
     * function updateDuration (e) {
     *   durationValueCache = window.innerHeight;
     * }
     * $(window).on("resize", updateDuration); // update the duration when the window size changes
     * $(window).triggerHandler("resize"); // set to initial value
     * scene.duration(getDuration); // supply duration method
     *
     * @fires {@link Scene.change}, when used as setter
     * @fires {@link Scene.shift}, when used as setter
     * @param {(number|function)} [newDuration] - The new duration of the scene.
     * @returns {number} `get` -  Current scene duration.
     * @returns {Scene} `set` -  Parent object for chaining.
     */

    /**
     * **Get** or **Set** the offset option value.
     * @method ScrollMagic.Scene#offset
     * @example
     * // get the current offset
     * var offset = scene.offset();
     *
     * // set a new offset
     * scene.offset(100);
     *
     * @fires {@link Scene.change}, when used as setter
     * @fires {@link Scene.shift}, when used as setter
     * @param {number} [newOffset] - The new offset of the scene.
     * @returns {number} `get` -  Current scene offset.
     * @returns {Scene} `set` -  Parent object for chaining.
     */

    /**
     * **Get** or **Set** the triggerElement option value.
     * Does **not** fire `Scene.shift`, because changing the trigger Element doesn't necessarily mean the start position changes. This will be determined in `Scene.refresh()`, which is automatically triggered.
     * @method ScrollMagic.Scene#triggerElement
     * @example
     * // get the current triggerElement
     * var triggerElement = scene.triggerElement();
     *
     * // set a new triggerElement using a selector
     * scene.triggerElement("#trigger");
     * // set a new triggerElement using a DOM object
     * scene.triggerElement(document.getElementById("trigger"));
     *
     * @fires {@link Scene.change}, when used as setter
     * @param {(string|object)} [newTriggerElement] - The new trigger element for the scene.
     * @returns {(string|object)} `get` -  Current triggerElement.
     * @returns {Scene} `set` -  Parent object for chaining.
     */

    /**
     * **Get** or **Set** the triggerHook option value.
     * @method ScrollMagic.Scene#triggerHook
     * @example
     * // get the current triggerHook value
     * var triggerHook = scene.triggerHook();
     *
     * // set a new triggerHook using a string
     * scene.triggerHook("onLeave");
     * // set a new triggerHook using a number
     * scene.triggerHook(0.7);
     *
     * @fires {@link Scene.change}, when used as setter
     * @fires {@link Scene.shift}, when used as setter
     * @param {(number|string)} [newTriggerHook] - The new triggerHook of the scene. See {@link Scene} parameter description for value options.
     * @returns {number} `get` -  Current triggerHook (ALWAYS numerical).
     * @returns {Scene} `set` -  Parent object for chaining.
     */

    /**
     * **Get** or **Set** the reverse option value.
     * @method ScrollMagic.Scene#reverse
     * @example
     * // get the current reverse option
     * var reverse = scene.reverse();
     *
     * // set new reverse option
     * scene.reverse(false);
     *
     * @fires {@link Scene.change}, when used as setter
     * @param {boolean} [newReverse] - The new reverse setting of the scene.
     * @returns {boolean} `get` -  Current reverse option value.
     * @returns {Scene} `set` -  Parent object for chaining.
     */

    /**
     * **Get** or **Set** the loglevel option value.
     * @method ScrollMagic.Scene#loglevel
     * @example
     * // get the current loglevel
     * var loglevel = scene.loglevel();
     *
     * // set new loglevel
     * scene.loglevel(3);
     *
     * @fires {@link Scene.change}, when used as setter
     * @param {number} [newLoglevel] - The new loglevel setting of the scene. `[0-3]`
     * @returns {number} `get` -  Current loglevel.
     * @returns {Scene} `set` -  Parent object for chaining.
     */

    /**
     * **Get** the associated controller.
     * @method ScrollMagic.Scene#controller
     * @example
     * // get the controller of a scene
     * var controller = scene.controller();
     *
     * @returns {ScrollMagic.Controller} Parent controller or `undefined`
     */


    this.controller = function () {
      return _controller;
    };
    /**
     * **Get** the current state.
     * @method ScrollMagic.Scene#state
     * @example
     * // get the current state
     * var state = scene.state();
     *
     * @returns {string} `"BEFORE"`, `"DURING"` or `"AFTER"`
     */


    this.state = function () {
      return _state;
    };
    /**
     * **Get** the current scroll offset for the start of the scene.  
     * Mind, that the scrollOffset is related to the size of the container, if `triggerHook` is bigger than `0` (or `"onLeave"`).  
     * This means, that resizing the container or changing the `triggerHook` will influence the scene's start offset.
     * @method ScrollMagic.Scene#scrollOffset
     * @example
     * // get the current scroll offset for the start and end of the scene.
     * var start = scene.scrollOffset();
     * var end = scene.scrollOffset() + scene.duration();
     * console.log("the scene starts at", start, "and ends at", end);
     *
     * @returns {number} The scroll offset (of the container) at which the scene will trigger. Y value for vertical and X value for horizontal scrolls.
     */


    this.scrollOffset = function () {
      return _scrollOffset.start;
    };
    /**
     * **Get** the trigger position of the scene (including the value of the `offset` option).  
     * @method ScrollMagic.Scene#triggerPosition
     * @example
     * // get the scene's trigger position
     * var triggerPosition = scene.triggerPosition();
     *
     * @returns {number} Start position of the scene. Top position value for vertical and left position value for horizontal scrolls.
     */


    this.triggerPosition = function () {
      var pos = _options.offset; // the offset is the basis

      if (_controller) {
        // get the trigger position
        if (_options.triggerElement) {
          // Element as trigger
          pos += _triggerPos;
        } else {
          // return the height of the triggerHook to start at the beginning
          pos += _controller.info("size") * Scene.triggerHook();
        }
      }

      return pos;
    };

    var _pin, _pinOptions;

    Scene.on("shift.internal", function (e) {
      var durationChanged = e.reason === "duration";

      if (_state === SCENE_STATE_AFTER && durationChanged || _state === SCENE_STATE_DURING && _options.duration === 0) {
        // if [duration changed after a scene (inside scene progress updates pin position)] or [duration is 0, we are in pin phase and some other value changed].
        updatePinState();
      }

      if (durationChanged) {
        updatePinDimensions();
      }
    }).on("progress.internal", function (e) {
      updatePinState();
    }).on("add.internal", function (e) {
      updatePinDimensions();
    }).on("destroy.internal", function (e) {
      Scene.removePin(e.reset);
    });
    /**
     * Update the pin state.
     * @private
     */

    var updatePinState = function updatePinState(forceUnpin) {
      if (_pin && _controller) {
        var containerInfo = _controller.info(),
            pinTarget = _pinOptions.spacer.firstChild; // may be pin element or another spacer, if cascading pins


        if (!forceUnpin && _state === SCENE_STATE_DURING) {
          // during scene or if duration is 0 and we are past the trigger
          // pinned state
          if (_util.css(pinTarget, "position") != "fixed") {
            // change state before updating pin spacer (position changes due to fixed collapsing might occur.)
            _util.css(pinTarget, {
              "position": "fixed"
            }); // update pin spacer


            updatePinDimensions();
          }

          var fixedPos = _util.get.offset(_pinOptions.spacer, true),
              // get viewport position of spacer
          scrollDistance = _options.reverse || _options.duration === 0 ? containerInfo.scrollPos - _scrollOffset.start // quicker
          : Math.round(_progress * _options.duration * 10) / 10; // if no reverse and during pin the position needs to be recalculated using the progress
          // add scrollDistance


          fixedPos[containerInfo.vertical ? "top" : "left"] += scrollDistance; // set new values

          _util.css(_pinOptions.spacer.firstChild, {
            top: fixedPos.top,
            left: fixedPos.left
          });
        } else {
          // unpinned state
          var newCSS = {
            position: _pinOptions.inFlow ? "relative" : "absolute",
            top: 0,
            left: 0
          },
              change = _util.css(pinTarget, "position") != newCSS.position;

          if (!_pinOptions.pushFollowers) {
            newCSS[containerInfo.vertical ? "top" : "left"] = _options.duration * _progress;
          } else if (_options.duration > 0) {
            // only concerns scenes with duration
            if (_state === SCENE_STATE_AFTER && parseFloat(_util.css(_pinOptions.spacer, "padding-top")) === 0) {
              change = true; // if in after state but havent updated spacer yet (jumped past pin)
            } else if (_state === SCENE_STATE_BEFORE && parseFloat(_util.css(_pinOptions.spacer, "padding-bottom")) === 0) {
              // before
              change = true; // jumped past fixed state upward direction
            }
          } // set new values


          _util.css(pinTarget, newCSS);

          if (change) {
            // update pin spacer if state changed
            updatePinDimensions();
          }
        }
      }
    };
    /**
     * Update the pin spacer and/or element size.
     * The size of the spacer needs to be updated whenever the duration of the scene changes, if it is to push down following elements.
     * @private
     */


    var updatePinDimensions = function updatePinDimensions() {
      if (_pin && _controller && _pinOptions.inFlow) {
        // no spacerresize, if original position is absolute
        var after = _state === SCENE_STATE_AFTER,
            before = _state === SCENE_STATE_BEFORE,
            during = _state === SCENE_STATE_DURING,
            vertical = _controller.info("vertical"),
            pinTarget = _pinOptions.spacer.firstChild,
            // usually the pined element but can also be another spacer (cascaded pins)
        marginCollapse = _util.isMarginCollapseType(_util.css(_pinOptions.spacer, "display")),
            css = {}; // set new size
        // if relsize: spacer -> pin | else: pin -> spacer


        if (_pinOptions.relSize.width || _pinOptions.relSize.autoFullWidth) {
          if (during) {
            _util.css(_pin, {
              "width": _util.get.width(_pinOptions.spacer)
            });
          } else {
            _util.css(_pin, {
              "width": "100%"
            });
          }
        } else {
          // minwidth is needed for cascaded pins.
          css["min-width"] = _util.get.width(vertical ? _pin : pinTarget, true, true);
          css.width = during ? css["min-width"] : "auto";
        }

        if (_pinOptions.relSize.height) {
          if (during) {
            // the only padding the spacer should ever include is the duration (if pushFollowers = true), so we need to substract that.
            _util.css(_pin, {
              "height": _util.get.height(_pinOptions.spacer) - (_pinOptions.pushFollowers ? _options.duration : 0)
            });
          } else {
            _util.css(_pin, {
              "height": "100%"
            });
          }
        } else {
          // margin is only included if it's a cascaded pin to resolve an IE9 bug
          css["min-height"] = _util.get.height(vertical ? pinTarget : _pin, true, !marginCollapse); // needed for cascading pins

          css.height = during ? css["min-height"] : "auto";
        } // add space for duration if pushFollowers is true


        if (_pinOptions.pushFollowers) {
          css["padding" + (vertical ? "Top" : "Left")] = _options.duration * _progress;
          css["padding" + (vertical ? "Bottom" : "Right")] = _options.duration * (1 - _progress);
        }

        _util.css(_pinOptions.spacer, css);
      }
    };
    /**
     * Updates the Pin state (in certain scenarios)
     * If the controller container is not the document and we are mid-pin-phase scrolling or resizing the main document can result to wrong pin positions.
     * So this function is called on resize and scroll of the document.
     * @private
     */


    var updatePinInContainer = function updatePinInContainer() {
      if (_controller && _pin && _state === SCENE_STATE_DURING && !_controller.info("isDocument")) {
        updatePinState();
      }
    };
    /**
     * Updates the Pin spacer size state (in certain scenarios)
     * If container is resized during pin and relatively sized the size of the pin might need to be updated...
     * So this function is called on resize of the container.
     * @private
     */


    var updateRelativePinSpacer = function updateRelativePinSpacer() {
      if (_controller && _pin && // well, duh
      _state === SCENE_STATE_DURING && ( // element in pinned state?
      // is width or height relatively sized, but not in relation to body? then we need to recalc.
      (_pinOptions.relSize.width || _pinOptions.relSize.autoFullWidth) && _util.get.width(window) != _util.get.width(_pinOptions.spacer.parentNode) || _pinOptions.relSize.height && _util.get.height(window) != _util.get.height(_pinOptions.spacer.parentNode))) {
        updatePinDimensions();
      }
    };
    /**
     * Is called, when the mousewhel is used while over a pinned element inside a div container.
     * If the scene is in fixed state scroll events would be counted towards the body. This forwards the event to the scroll container.
     * @private
     */


    var onMousewheelOverPin = function onMousewheelOverPin(e) {
      if (_controller && _pin && _state === SCENE_STATE_DURING && !_controller.info("isDocument")) {
        // in pin state
        e.preventDefault();

        _controller._setScrollPos(_controller.info("scrollPos") - ((e.wheelDelta || e[_controller.info("vertical") ? "wheelDeltaY" : "wheelDeltaX"]) / 3 || -e.detail * 30));
      }
    };
    /**
     * Pin an element for the duration of the tween.  
     * If the scene duration is 0 the element will only be unpinned, if the user scrolls back past the start position.  
     * Make sure only one pin is applied to an element at the same time.
     * An element can be pinned multiple times, but only successively.
     * _**NOTE:** The option `pushFollowers` has no effect, when the scene duration is 0._
     * @method ScrollMagic.Scene#setPin
     * @example
     * // pin element and push all following elements down by the amount of the pin duration.
     * scene.setPin("#pin");
     *
     * // pin element and keeping all following elements in their place. The pinned element will move past them.
     * scene.setPin("#pin", {pushFollowers: false});
     *
     * @param {(string|object)} element - A Selector targeting an element or a DOM object that is supposed to be pinned.
     * @param {object} [settings] - settings for the pin
     * @param {boolean} [settings.pushFollowers=true] - If `true` following elements will be "pushed" down for the duration of the pin, if `false` the pinned element will just scroll past them.  
     Ignored, when duration is `0`.
     * @param {string} [settings.spacerClass="scrollmagic-pin-spacer"] - Classname of the pin spacer element, which is used to replace the element.
     *
     * @returns {Scene} Parent object for chaining.
     */


    this.setPin = function (element, settings) {
      var defaultSettings = {
        pushFollowers: true,
        spacerClass: "scrollmagic-pin-spacer"
      };
      settings = _util.extend({}, defaultSettings, settings); // validate Element

      element = _util.get.elements(element)[0];

      if (!element) {
        log(1, "ERROR calling method 'setPin()': Invalid pin element supplied.");
        return Scene; // cancel
      } else if (_util.css(element, "position") === "fixed") {
        log(1, "ERROR calling method 'setPin()': Pin does not work with elements that are positioned 'fixed'.");
        return Scene; // cancel
      }

      if (_pin) {
        // preexisting pin?
        if (_pin === element) {
          // same pin we already have -> do nothing
          return Scene; // cancel
        } else {
          // kill old pin
          Scene.removePin();
        }
      }

      _pin = element;
      var parentDisplay = _pin.parentNode.style.display,
          boundsParams = ["top", "left", "bottom", "right", "margin", "marginLeft", "marginRight", "marginTop", "marginBottom"];
      _pin.parentNode.style.display = 'none'; // hack start to force css to return stylesheet values instead of calculated px values.

      var inFlow = _util.css(_pin, "position") != "absolute",
          pinCSS = _util.css(_pin, boundsParams.concat(["display"])),
          sizeCSS = _util.css(_pin, ["width", "height"]);

      _pin.parentNode.style.display = parentDisplay; // hack end.

      if (!inFlow && settings.pushFollowers) {
        log(2, "WARNING: If the pinned element is positioned absolutely pushFollowers will be disabled.");
        settings.pushFollowers = false;
      }

      window.setTimeout(function () {
        // wait until all finished, because with responsive duration it will only be set after scene is added to controller
        if (_pin && _options.duration === 0 && settings.pushFollowers) {
          log(2, "WARNING: pushFollowers =", true, "has no effect, when scene duration is 0.");
        }
      }, 0); // create spacer and insert

      var spacer = _pin.parentNode.insertBefore(document.createElement('div'), _pin),
          spacerCSS = _util.extend(pinCSS, {
        position: inFlow ? "relative" : "absolute",
        boxSizing: "content-box",
        mozBoxSizing: "content-box",
        webkitBoxSizing: "content-box"
      });

      if (!inFlow) {
        // copy size if positioned absolutely, to work for bottom/right positioned elements.
        _util.extend(spacerCSS, _util.css(_pin, ["width", "height"]));
      }

      _util.css(spacer, spacerCSS);

      spacer.setAttribute(PIN_SPACER_ATTRIBUTE, "");

      _util.addClass(spacer, settings.spacerClass); // set the pin Options


      _pinOptions = {
        spacer: spacer,
        relSize: {
          // save if size is defined using % values. if so, handle spacer resize differently...
          width: sizeCSS.width.slice(-1) === "%",
          height: sizeCSS.height.slice(-1) === "%",
          autoFullWidth: sizeCSS.width === "auto" && inFlow && _util.isMarginCollapseType(pinCSS.display)
        },
        pushFollowers: settings.pushFollowers,
        inFlow: inFlow // stores if the element takes up space in the document flow

      };

      if (!_pin.___origStyle) {
        _pin.___origStyle = {};
        var pinInlineCSS = _pin.style,
            copyStyles = boundsParams.concat(["width", "height", "position", "boxSizing", "mozBoxSizing", "webkitBoxSizing"]);
        copyStyles.forEach(function (val) {
          _pin.___origStyle[val] = pinInlineCSS[val] || "";
        });
      } // if relative size, transfer it to spacer and make pin calculate it...


      if (_pinOptions.relSize.width) {
        _util.css(spacer, {
          width: sizeCSS.width
        });
      }

      if (_pinOptions.relSize.height) {
        _util.css(spacer, {
          height: sizeCSS.height
        });
      } // now place the pin element inside the spacer	


      spacer.appendChild(_pin); // and set new css

      _util.css(_pin, {
        position: inFlow ? "relative" : "absolute",
        margin: "auto",
        top: "auto",
        left: "auto",
        bottom: "auto",
        right: "auto"
      });

      if (_pinOptions.relSize.width || _pinOptions.relSize.autoFullWidth) {
        _util.css(_pin, {
          boxSizing: "border-box",
          mozBoxSizing: "border-box",
          webkitBoxSizing: "border-box"
        });
      } // add listener to document to update pin position in case controller is not the document.


      window.addEventListener('scroll', updatePinInContainer);
      window.addEventListener('resize', updatePinInContainer);
      window.addEventListener('resize', updateRelativePinSpacer); // add mousewheel listener to catch scrolls over fixed elements

      _pin.addEventListener("mousewheel", onMousewheelOverPin);

      _pin.addEventListener("DOMMouseScroll", onMousewheelOverPin);

      log(3, "added pin"); // finally update the pin to init

      updatePinState();
      return Scene;
    };
    /**
     * Remove the pin from the scene.
     * @method ScrollMagic.Scene#removePin
     * @example
     * // remove the pin from the scene without resetting it (the spacer is not removed)
     * scene.removePin();
     *
     * // remove the pin from the scene and reset the pin element to its initial position (spacer is removed)
     * scene.removePin(true);
     *
     * @param {boolean} [reset=false] - If `false` the spacer will not be removed and the element's position will not be reset.
     * @returns {Scene} Parent object for chaining.
     */


    this.removePin = function (reset) {
      if (_pin) {
        if (_state === SCENE_STATE_DURING) {
          updatePinState(true); // force unpin at position
        }

        if (reset || !_controller) {
          // if there's no controller no progress was made anyway...
          var pinTarget = _pinOptions.spacer.firstChild; // usually the pin element, but may be another spacer (cascaded pins)...

          if (pinTarget.hasAttribute(PIN_SPACER_ATTRIBUTE)) {
            // copy margins to child spacer
            var style = _pinOptions.spacer.style,
                values = ["margin", "marginLeft", "marginRight", "marginTop", "marginBottom"];
            margins = {};
            values.forEach(function (val) {
              margins[val] = style[val] || "";
            });

            _util.css(pinTarget, margins);
          }

          _pinOptions.spacer.parentNode.insertBefore(pinTarget, _pinOptions.spacer);

          _pinOptions.spacer.parentNode.removeChild(_pinOptions.spacer);

          if (!_pin.parentNode.hasAttribute(PIN_SPACER_ATTRIBUTE)) {
            // if it's the last pin for this element -> restore inline styles
            // TODO: only correctly set for first pin (when cascading) - how to fix?
            _util.css(_pin, _pin.___origStyle);

            delete _pin.___origStyle;
          }
        }

        window.removeEventListener('scroll', updatePinInContainer);
        window.removeEventListener('resize', updatePinInContainer);
        window.removeEventListener('resize', updateRelativePinSpacer);

        _pin.removeEventListener("mousewheel", onMousewheelOverPin);

        _pin.removeEventListener("DOMMouseScroll", onMousewheelOverPin);

        _pin = undefined;
        log(3, "removed pin (reset: " + (reset ? "true" : "false") + ")");
      }

      return Scene;
    };

    var _cssClasses,
        _cssClassElems = [];

    Scene.on("destroy.internal", function (e) {
      Scene.removeClassToggle(e.reset);
    });
    /**
     * Define a css class modification while the scene is active.  
     * When the scene triggers the classes will be added to the supplied element and removed, when the scene is over.
     * If the scene duration is 0 the classes will only be removed if the user scrolls back past the start position.
     * @method ScrollMagic.Scene#setClassToggle
     * @example
     * // add the class 'myclass' to the element with the id 'my-elem' for the duration of the scene
     * scene.setClassToggle("#my-elem", "myclass");
     *
     * // add multiple classes to multiple elements defined by the selector '.classChange'
     * scene.setClassToggle(".classChange", "class1 class2 class3");
     *
     * @param {(string|object)} element - A Selector targeting one or more elements or a DOM object that is supposed to be modified.
     * @param {string} classes - One or more Classnames (separated by space) that should be added to the element during the scene.
     *
     * @returns {Scene} Parent object for chaining.
     */

    this.setClassToggle = function (element, classes) {
      var elems = _util.get.elements(element);

      if (elems.length === 0 || !_util.type.String(classes)) {
        log(1, "ERROR calling method 'setClassToggle()': Invalid " + (elems.length === 0 ? "element" : "classes") + " supplied.");
        return Scene;
      }

      if (_cssClassElems.length > 0) {
        // remove old ones
        Scene.removeClassToggle();
      }

      _cssClasses = classes;
      _cssClassElems = elems;
      Scene.on("enter.internal_class leave.internal_class", function (e) {
        var toggle = e.type === "enter" ? _util.addClass : _util.removeClass;

        _cssClassElems.forEach(function (elem, key) {
          toggle(elem, _cssClasses);
        });
      });
      return Scene;
    };
    /**
     * Remove the class binding from the scene.
     * @method ScrollMagic.Scene#removeClassToggle
     * @example
     * // remove class binding from the scene without reset
     * scene.removeClassToggle();
     *
     * // remove class binding and remove the changes it caused
     * scene.removeClassToggle(true);
     *
     * @param {boolean} [reset=false] - If `false` and the classes are currently active, they will remain on the element. If `true` they will be removed.
     * @returns {Scene} Parent object for chaining.
     */


    this.removeClassToggle = function (reset) {
      if (reset) {
        _cssClassElems.forEach(function (elem, key) {
          _util.removeClass(elem, _cssClasses);
        });
      }

      Scene.off("start.internal_class end.internal_class");
      _cssClasses = undefined;
      _cssClassElems = [];
      return Scene;
    }; // INIT


    construct();
    return Scene;
  }; // store pagewide scene options


  var SCENE_OPTIONS = {
    defaults: {
      duration: 0,
      offset: 0,
      triggerElement: undefined,
      triggerHook: 0.5,
      reverse: true,
      loglevel: 2
    },
    validate: {
      offset: function offset(val) {
        val = parseFloat(val);

        if (!_util.type.Number(val)) {
          throw ["Invalid value for option \"offset\":", val];
        }

        return val;
      },
      triggerElement: function triggerElement(val) {
        val = val || undefined;

        if (val) {
          var elem = _util.get.elements(val)[0];

          if (elem) {
            val = elem;
          } else {
            throw ["Element defined in option \"triggerElement\" was not found:", val];
          }
        }

        return val;
      },
      triggerHook: function triggerHook(val) {
        var translate = {
          "onCenter": 0.5,
          "onEnter": 1,
          "onLeave": 0
        };

        if (_util.type.Number(val)) {
          val = Math.max(0, Math.min(parseFloat(val), 1)); //  make sure its betweeen 0 and 1
        } else if (val in translate) {
          val = translate[val];
        } else {
          throw ["Invalid value for option \"triggerHook\": ", val];
        }

        return val;
      },
      reverse: function reverse(val) {
        return !!val; // force boolean
      },
      loglevel: function loglevel(val) {
        val = parseInt(val);

        if (!_util.type.Number(val) || val < 0 || val > 3) {
          throw ["Invalid value for option \"loglevel\":", val];
        }

        return val;
      }
    },
    // holder for  validation methods. duration validation is handled in 'getters-setters.js'
    shifts: ["duration", "offset", "triggerHook"] // list of options that trigger a `shift` event

  };
  /*
   * method used to add an option to ScrollMagic Scenes.
   * TODO: DOC (private for dev)
   */

  ScrollMagic.Scene.addOption = function (name, defaultValue, validationCallback, shifts) {
    if (!(name in SCENE_OPTIONS.defaults)) {
      SCENE_OPTIONS.defaults[name] = defaultValue;
      SCENE_OPTIONS.validate[name] = validationCallback;

      if (shifts) {
        SCENE_OPTIONS.shifts.push(name);
      }
    } else {
      ScrollMagic._util.log(1, "[static] ScrollMagic.Scene -> Cannot add Scene option '" + name + "', because it already exists.");
    }
  }; // instance extension function for plugins
  // TODO: DOC (private for dev)


  ScrollMagic.Scene.extend = function (extension) {
    var oldClass = this;

    ScrollMagic.Scene = function () {
      oldClass.apply(this, arguments);
      this.$super = _util.extend({}, this); // copy parent state

      return extension.apply(this, arguments) || this;
    };

    _util.extend(ScrollMagic.Scene, oldClass); // copy properties


    ScrollMagic.Scene.prototype = oldClass.prototype; // copy prototype

    ScrollMagic.Scene.prototype.constructor = ScrollMagic.Scene; // restore constructor
  };
  /**
   * TODO: DOCS (private for dev)
   * @class
   * @private
   */


  ScrollMagic.Event = function (type, namespace, target, vars) {
    vars = vars || {};

    for (var key in vars) {
      this[key] = vars[key];
    }

    this.type = type;
    this.target = this.currentTarget = target;
    this.namespace = namespace || '';
    this.timeStamp = this.timestamp = Date.now();
    return this;
  };
  /*
   * TODO: DOCS (private for dev)
   */


  var _util = ScrollMagic._util = function (window) {
    var U = {},
        i;
    /**
     * ------------------------------
     * internal helpers
     * ------------------------------
     */
    // parse float and fall back to 0.

    var floatval = function floatval(number) {
      return parseFloat(number) || 0;
    }; // get current style IE safe (otherwise IE would return calculated values for 'auto')


    var _getComputedStyle = function _getComputedStyle(elem) {
      return elem.currentStyle ? elem.currentStyle : window.getComputedStyle(elem);
    }; // get element dimension (width or height)


    var _dimension = function _dimension(which, elem, outer, includeMargin) {
      elem = elem === document ? window : elem;

      if (elem === window) {
        includeMargin = false;
      } else if (!_type.DomElement(elem)) {
        return 0;
      }

      which = which.charAt(0).toUpperCase() + which.substr(1).toLowerCase();
      var dimension = (outer ? elem['offset' + which] || elem['outer' + which] : elem['client' + which] || elem['inner' + which]) || 0;

      if (outer && includeMargin) {
        var style = _getComputedStyle(elem);

        dimension += which === 'Height' ? floatval(style.marginTop) + floatval(style.marginBottom) : floatval(style.marginLeft) + floatval(style.marginRight);
      }

      return dimension;
    }; // converts 'margin-top' into 'marginTop'


    var _camelCase = function _camelCase(str) {
      return str.replace(/^[^a-z]+([a-z])/g, '$1').replace(/-([a-z])/g, function (g) {
        return g[1].toUpperCase();
      });
    };
    /**
     * ------------------------------
     * external helpers
     * ------------------------------
     */
    // extend obj – same as jQuery.extend({}, objA, objB)


    U.extend = function (obj) {
      obj = obj || {};

      for (i = 1; i < arguments.length; i++) {
        if (!arguments[i]) {
          continue;
        }

        for (var key in arguments[i]) {
          if (arguments[i].hasOwnProperty(key)) {
            obj[key] = arguments[i][key];
          }
        }
      }

      return obj;
    }; // check if a css display type results in margin-collapse or not


    U.isMarginCollapseType = function (str) {
      return ["block", "flex", "list-item", "table", "-webkit-box"].indexOf(str) > -1;
    }; // implementation of requestAnimationFrame
    // based on https://gist.github.com/paulirish/1579671


    var lastTime = 0,
        vendors = ['ms', 'moz', 'webkit', 'o'];
    var _requestAnimationFrame = window.requestAnimationFrame;
    var _cancelAnimationFrame = window.cancelAnimationFrame; // try vendor prefixes if the above doesn't work

    for (i = 0; !_requestAnimationFrame && i < vendors.length; ++i) {
      _requestAnimationFrame = window[vendors[i] + 'RequestAnimationFrame'];
      _cancelAnimationFrame = window[vendors[i] + 'CancelAnimationFrame'] || window[vendors[i] + 'CancelRequestAnimationFrame'];
    } // fallbacks


    if (!_requestAnimationFrame) {
      _requestAnimationFrame = function _requestAnimationFrame(callback) {
        var currTime = new Date().getTime(),
            timeToCall = Math.max(0, 16 - (currTime - lastTime)),
            id = window.setTimeout(function () {
          callback(currTime + timeToCall);
        }, timeToCall);
        lastTime = currTime + timeToCall;
        return id;
      };
    }

    if (!_cancelAnimationFrame) {
      _cancelAnimationFrame = function _cancelAnimationFrame(id) {
        window.clearTimeout(id);
      };
    }

    U.rAF = _requestAnimationFrame.bind(window);
    U.cAF = _cancelAnimationFrame.bind(window);
    var loglevels = ["error", "warn", "log"],
        console = window.console || {};

    console.log = console.log || function () {}; // no console log, well - do nothing then...
    // make sure methods for all levels exist.


    for (i = 0; i < loglevels.length; i++) {
      var method = loglevels[i];

      if (!console[method]) {
        console[method] = console.log; // prefer .log over nothing
      }
    }

    U.log = function (loglevel) {
      if (loglevel > loglevels.length || loglevel <= 0) loglevel = loglevels.length;
      var now = new Date(),
          time = ("0" + now.getHours()).slice(-2) + ":" + ("0" + now.getMinutes()).slice(-2) + ":" + ("0" + now.getSeconds()).slice(-2) + ":" + ("00" + now.getMilliseconds()).slice(-3),
          method = loglevels[loglevel - 1],
          args = Array.prototype.splice.call(arguments, 1),
          func = Function.prototype.bind.call(console[method], console);
      args.unshift(time);
      func.apply(console, args);
    };
    /**
     * ------------------------------
     * type testing
     * ------------------------------
     */


    var _type = U.type = function (v) {
      return Object.prototype.toString.call(v).replace(/^\[object (.+)\]$/, "$1").toLowerCase();
    };

    _type.String = function (v) {
      return _type(v) === 'string';
    };

    _type.Function = function (v) {
      return _type(v) === 'function';
    };

    _type.Array = function (v) {
      return Array.isArray(v);
    };

    _type.Number = function (v) {
      return !_type.Array(v) && v - parseFloat(v) + 1 >= 0;
    };

    _type.DomElement = function (o) {
      return (typeof HTMLElement === "undefined" ? "undefined" : _typeof(HTMLElement)) === "object" ? o instanceof HTMLElement : //DOM2
      o && _typeof(o) === "object" && o !== null && o.nodeType === 1 && typeof o.nodeName === "string";
    };
    /**
     * ------------------------------
     * DOM Element info
     * ------------------------------
     */
    // always returns a list of matching DOM elements, from a selector, a DOM element or an list of elements or even an array of selectors


    var _get = U.get = {};

    _get.elements = function (selector) {
      var arr = [];

      if (_type.String(selector)) {
        try {
          selector = document.querySelectorAll(selector);
        } catch (e) {
          // invalid selector
          return arr;
        }
      }

      if (_type(selector) === 'nodelist' || _type.Array(selector)) {
        for (var i = 0, ref = arr.length = selector.length; i < ref; i++) {
          // list of elements
          var elem = selector[i];
          arr[i] = _type.DomElement(elem) ? elem : _get.elements(elem); // if not an element, try to resolve recursively
        }
      } else if (_type.DomElement(selector) || selector === document || selector === window) {
        arr = [selector]; // only the element
      }

      return arr;
    }; // get scroll top value


    _get.scrollTop = function (elem) {
      return elem && typeof elem.scrollTop === 'number' ? elem.scrollTop : window.pageYOffset || 0;
    }; // get scroll left value


    _get.scrollLeft = function (elem) {
      return elem && typeof elem.scrollLeft === 'number' ? elem.scrollLeft : window.pageXOffset || 0;
    }; // get element height


    _get.width = function (elem, outer, includeMargin) {
      return _dimension('width', elem, outer, includeMargin);
    }; // get element width


    _get.height = function (elem, outer, includeMargin) {
      return _dimension('height', elem, outer, includeMargin);
    }; // get element position (optionally relative to viewport)


    _get.offset = function (elem, relativeToViewport) {
      var offset = {
        top: 0,
        left: 0
      };

      if (elem && elem.getBoundingClientRect) {
        // check if available
        var rect = elem.getBoundingClientRect();
        offset.top = rect.top;
        offset.left = rect.left;

        if (!relativeToViewport) {
          // clientRect is by default relative to viewport...
          offset.top += _get.scrollTop();
          offset.left += _get.scrollLeft();
        }
      }

      return offset;
    };
    /**
     * ------------------------------
     * DOM Element manipulation
     * ------------------------------
     */


    U.addClass = function (elem, classname) {
      if (classname) {
        if (elem.classList) elem.classList.add(classname);else elem.className += ' ' + classname;
      }
    };

    U.removeClass = function (elem, classname) {
      if (classname) {
        if (elem.classList) elem.classList.remove(classname);else elem.className = elem.className.replace(new RegExp('(^|\\b)' + classname.split(' ').join('|') + '(\\b|$)', 'gi'), ' ');
      }
    }; // if options is string -> returns css value
    // if options is array -> returns object with css value pairs
    // if options is object -> set new css values


    U.css = function (elem, options) {
      if (_type.String(options)) {
        return _getComputedStyle(elem)[_camelCase(options)];
      } else if (_type.Array(options)) {
        var obj = {},
            style = _getComputedStyle(elem);

        options.forEach(function (option, key) {
          obj[option] = style[_camelCase(option)];
        });
        return obj;
      } else {
        for (var option in options) {
          var val = options[option];

          if (val == parseFloat(val)) {
            // assume pixel for seemingly numerical values
            val += 'px';
          }

          elem.style[_camelCase(option)] = val;
        }
      }
    };

    return U;
  }(window || {});

  ScrollMagic.Scene.prototype.addIndicators = function () {
    ScrollMagic._util.log(1, '(ScrollMagic.Scene) -> ERROR calling addIndicators() due to missing Plugin \'debug.addIndicators\'. Please make sure to include plugins/debug.addIndicators.js');

    return this;
  };

  ScrollMagic.Scene.prototype.removeIndicators = function () {
    ScrollMagic._util.log(1, '(ScrollMagic.Scene) -> ERROR calling removeIndicators() due to missing Plugin \'debug.addIndicators\'. Please make sure to include plugins/debug.addIndicators.js');

    return this;
  };

  ScrollMagic.Scene.prototype.setTween = function () {
    ScrollMagic._util.log(1, '(ScrollMagic.Scene) -> ERROR calling setTween() due to missing Plugin \'animation.gsap\'. Please make sure to include plugins/animation.gsap.js');

    return this;
  };

  ScrollMagic.Scene.prototype.removeTween = function () {
    ScrollMagic._util.log(1, '(ScrollMagic.Scene) -> ERROR calling removeTween() due to missing Plugin \'animation.gsap\'. Please make sure to include plugins/animation.gsap.js');

    return this;
  };

  ScrollMagic.Scene.prototype.setVelocity = function () {
    ScrollMagic._util.log(1, '(ScrollMagic.Scene) -> ERROR calling setVelocity() due to missing Plugin \'animation.velocity\'. Please make sure to include plugins/animation.velocity.js');

    return this;
  };

  ScrollMagic.Scene.prototype.removeVelocity = function () {
    ScrollMagic._util.log(1, '(ScrollMagic.Scene) -> ERROR calling removeVelocity() due to missing Plugin \'animation.velocity\'. Please make sure to include plugins/animation.velocity.js');

    return this;
  };

  return ScrollMagic;
});

},{}],364:[function(require,module,exports){
"use strict";

function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }

/*!
 * ScrollMagic v2.0.5 (2015-04-29)
 * The javascript library for magical scroll interactions.
 * (c) 2015 Jan Paepke (@janpaepke)
 * Project Website: http://scrollmagic.io
 * 
 * @version 2.0.5
 * @license Dual licensed under MIT license and GPL.
 * @author Jan Paepke - e-mail@janpaepke.de
 *
 * @file ScrollMagic GSAP Animation Plugin.
 *
 * requires: GSAP ~1.14
 * Powered by the Greensock Animation Platform (GSAP): http://www.greensock.com/js
 * Greensock License info at http://www.greensock.com/licensing/
 */

/**
 * This plugin is meant to be used in conjunction with the Greensock Animation Plattform.  
 * It offers an easy API to trigger Tweens or synchronize them to the scrollbar movement.
 *
 * Both the `lite` and the `max` versions of the GSAP library are supported.  
 * The most basic requirement is `TweenLite`.
 * 
 * To have access to this extension, please include `plugins/animation.gsap.js`.
 * @requires {@link http://greensock.com/gsap|GSAP ~1.14.x}
 * @mixin animation.GSAP
 */
(function (root, factory) {
  if (typeof define === 'function' && define.amd) {
    // AMD. Register as an anonymous module.
    define(['ScrollMagic', 'TweenMax', 'TimelineMax'], factory);
  } else if ((typeof exports === "undefined" ? "undefined" : _typeof(exports)) === 'object') {
    // CommonJS
    // Loads whole gsap package onto global scope.
    require('gsap');

    factory(require('scrollmagic'), TweenMax, TimelineMax);
  } else {
    // Browser globals
    factory(root.ScrollMagic || root.jQuery && root.jQuery.ScrollMagic, root.TweenMax || root.TweenLite, root.TimelineMax || root.TimelineLite);
  }
})(void 0, function (ScrollMagic, Tween, Timeline) {
  "use strict";

  var NAMESPACE = "animation.gsap";
  var console = window.console || {},
      err = Function.prototype.bind.call(console.error || console.log || function () {}, console);

  if (!ScrollMagic) {
    err("(" + NAMESPACE + ") -> ERROR: The ScrollMagic main module could not be found. Please make sure it's loaded before this plugin or use an asynchronous loader like requirejs.");
  }

  if (!Tween) {
    err("(" + NAMESPACE + ") -> ERROR: TweenLite or TweenMax could not be found. Please make sure GSAP is loaded before ScrollMagic or use an asynchronous loader like requirejs.");
  }
  /*
  	 * ----------------------------------------------------------------
  	 * Extensions for Scene
  	 * ----------------------------------------------------------------
  	 */

  /**
   * Every instance of ScrollMagic.Scene now accepts an additional option.  
   * See {@link ScrollMagic.Scene} for a complete list of the standard options.
   * @memberof! animation.GSAP#
   * @method new ScrollMagic.Scene(options)
   * @example
   * var scene = new ScrollMagic.Scene({tweenChanges: true});
   *
   * @param {object} [options] - Options for the Scene. The options can be updated at any time.
   * @param {boolean} [options.tweenChanges=false] - Tweens Animation to the progress target instead of setting it.  
   Does not affect animations where duration is `0`.
   */

  /**
   * **Get** or **Set** the tweenChanges option value.  
   * This only affects scenes with a duration. If `tweenChanges` is `true`, the progress update when scrolling will not be immediate, but instead the animation will smoothly animate to the target state.  
   * For a better understanding, try enabling and disabling this option in the [Scene Manipulation Example](../examples/basic/scene_manipulation.html).
   * @memberof! animation.GSAP#
   * @method Scene.tweenChanges
   * 
   * @example
   * // get the current tweenChanges option
   * var tweenChanges = scene.tweenChanges();
   *
   * // set new tweenChanges option
   * scene.tweenChanges(true);
   *
   * @fires {@link Scene.change}, when used as setter
   * @param {boolean} [newTweenChanges] - The new tweenChanges setting of the scene.
   * @returns {boolean} `get` -  Current tweenChanges option value.
   * @returns {Scene} `set` -  Parent object for chaining.
   */
  // add option (TODO: DOC (private for dev))


  ScrollMagic.Scene.addOption("tweenChanges", // name
  false, // default
  function (val) {
    // validation callback
    return !!val;
  }); // extend scene

  ScrollMagic.Scene.extend(function () {
    var Scene = this,
        _tween;

    var log = function log() {
      if (Scene._log) {
        // not available, when main source minified
        Array.prototype.splice.call(arguments, 1, 0, "(" + NAMESPACE + ")", "->");

        Scene._log.apply(this, arguments);
      }
    }; // set listeners


    Scene.on("progress.plugin_gsap", function () {
      updateTweenProgress();
    });
    Scene.on("destroy.plugin_gsap", function (e) {
      Scene.removeTween(e.reset);
    });
    /**
     * Update the tween progress to current position.
     * @private
     */

    var updateTweenProgress = function updateTweenProgress() {
      if (_tween) {
        var progress = Scene.progress(),
            state = Scene.state();

        if (_tween.repeat && _tween.repeat() === -1) {
          // infinite loop, so not in relation to progress
          if (state === 'DURING' && _tween.paused()) {
            _tween.play();
          } else if (state !== 'DURING' && !_tween.paused()) {
            _tween.pause();
          }
        } else if (progress != _tween.progress()) {
          // do we even need to update the progress?
          // no infinite loop - so should we just play or go to a specific point in time?
          if (Scene.duration() === 0) {
            // play the animation
            if (progress > 0) {
              // play from 0 to 1
              _tween.play();
            } else {
              // play from 1 to 0
              _tween.reverse();
            }
          } else {
            // go to a specific point in time
            if (Scene.tweenChanges() && _tween.tweenTo) {
              // go smooth
              _tween.tweenTo(progress * _tween.duration());
            } else {
              // just hard set it
              _tween.progress(progress).pause();
            }
          }
        }
      }
    };
    /**
     * Add a tween to the scene.  
     * If you want to add multiple tweens, add them into a GSAP Timeline object and supply it instead (see example below).  
     * 
     * If the scene has a duration, the tween's duration will be projected to the scroll distance of the scene, meaning its progress will be synced to scrollbar movement.  
     * For a scene with a duration of `0`, the tween will be triggered when scrolling forward past the scene's trigger position and reversed, when scrolling back.  
     * To gain better understanding, check out the [Simple Tweening example](../examples/basic/simple_tweening.html).
     *
     * Instead of supplying a tween this method can also be used as a shorthand for `TweenMax.to()` (see example below).
     * @memberof! animation.GSAP#
     *
     * @example
     * // add a single tween directly
     * scene.setTween(TweenMax.to("obj"), 1, {x: 100});
     *
     * // add a single tween via variable
     * var tween = TweenMax.to("obj"), 1, {x: 100};
     * scene.setTween(tween);
     *
     * // add multiple tweens, wrapped in a timeline.
     * var timeline = new TimelineMax();
     * var tween1 = TweenMax.from("obj1", 1, {x: 100});
     * var tween2 = TweenMax.to("obj2", 1, {y: 100});
     * timeline
     *		.add(tween1)
     *		.add(tween2);
     * scene.addTween(timeline);
     *
     * // short hand to add a TweenMax.to() tween
     * scene.setTween("obj3", 0.5, {y: 100});
     *
     * // short hand to add a TweenMax.to() tween for 1 second
     * // this is useful, when the scene has a duration and the tween duration isn't important anyway
     * scene.setTween("obj3", {y: 100});
     *
     * @param {(object|string)} TweenObject - A TweenMax, TweenLite, TimelineMax or TimelineLite object that should be animated in the scene. Can also be a Dom Element or Selector, when using direct tween definition (see examples).
     * @param {(number|object)} duration - A duration for the tween, or tween parameters. If an object containing parameters are supplied, a default duration of 1 will be used.
     * @param {object} params - The parameters for the tween
     * @returns {Scene} Parent object for chaining.
     */


    Scene.setTween = function (TweenObject, duration, params) {
      var newTween;

      if (arguments.length > 1) {
        if (arguments.length < 3) {
          params = duration;
          duration = 1;
        }

        TweenObject = Tween.to(TweenObject, duration, params);
      }

      try {
        // wrap Tween into a Timeline Object if available to include delay and repeats in the duration and standardize methods.
        if (Timeline) {
          newTween = new Timeline({
            smoothChildTiming: true
          }).add(TweenObject);
        } else {
          newTween = TweenObject;
        }

        newTween.pause();
      } catch (e) {
        log(1, "ERROR calling method 'setTween()': Supplied argument is not a valid TweenObject");
        return Scene;
      }

      if (_tween) {
        // kill old tween?
        Scene.removeTween();
      }

      _tween = newTween; // some properties need to be transferred it to the wrapper, otherwise they would get lost.

      if (TweenObject.repeat && TweenObject.repeat() === -1) {
        // TweenMax or TimelineMax Object?
        _tween.repeat(-1);

        _tween.yoyo(TweenObject.yoyo());
      } // Some tween validations and debugging helpers


      if (Scene.tweenChanges() && !_tween.tweenTo) {
        log(2, "WARNING: tweenChanges will only work if the TimelineMax object is available for ScrollMagic.");
      } // check if there are position tweens defined for the trigger and warn about it :)


      if (_tween && Scene.controller() && Scene.triggerElement() && Scene.loglevel() >= 2) {
        // controller is needed to know scroll direction.
        var triggerTweens = Tween.getTweensOf(Scene.triggerElement()),
            vertical = Scene.controller().info("vertical");
        triggerTweens.forEach(function (value, index) {
          var tweenvars = value.vars.css || value.vars,
              condition = vertical ? tweenvars.top !== undefined || tweenvars.bottom !== undefined : tweenvars.left !== undefined || tweenvars.right !== undefined;

          if (condition) {
            log(2, "WARNING: Tweening the position of the trigger element affects the scene timing and should be avoided!");
            return false;
          }
        });
      } // warn about tween overwrites, when an element is tweened multiple times


      if (parseFloat(TweenLite.version) >= 1.14) {
        // onOverwrite only present since GSAP v1.14.0
        var list = _tween.getChildren ? _tween.getChildren(true, true, false) : [_tween],
            // get all nested tween objects
        newCallback = function newCallback() {
          log(2, "WARNING: tween was overwritten by another. To learn how to avoid this issue see here: https://github.com/janpaepke/ScrollMagic/wiki/WARNING:-tween-was-overwritten-by-another");
        };

        for (var i = 0, thisTween, oldCallback; i < list.length; i++) {
          /*jshint loopfunc: true */
          thisTween = list[i];

          if (oldCallback !== newCallback) {
            // if tweens is added more than once
            oldCallback = thisTween.vars.onOverwrite;

            thisTween.vars.onOverwrite = function () {
              if (oldCallback) {
                oldCallback.apply(this, arguments);
              }

              newCallback.apply(this, arguments);
            };
          }
        }
      }

      log(3, "added tween");
      updateTweenProgress();
      return Scene;
    };
    /**
     * Remove the tween from the scene.  
     * This will terminate the control of the Scene over the tween.
     *
     * Using the reset option you can decide if the tween should remain in the current state or be rewound to set the target elements back to the state they were in before the tween was added to the scene.
     * @memberof! animation.GSAP#
     *
     * @example
     * // remove the tween from the scene without resetting it
     * scene.removeTween();
     *
     * // remove the tween from the scene and reset it to initial position
     * scene.removeTween(true);
     *
     * @param {boolean} [reset=false] - If `true` the tween will be reset to its initial values.
     * @returns {Scene} Parent object for chaining.
     */


    Scene.removeTween = function (reset) {
      if (_tween) {
        if (reset) {
          _tween.progress(0).pause();
        }

        _tween.kill();

        _tween = undefined;
        log(3, "removed tween (reset: " + (reset ? "true" : "false") + ")");
      }

      return Scene;
    };
  });
});

},{"gsap":356,"scrollmagic":363}],365:[function(require,module,exports){
(function (setImmediate,clearImmediate){
"use strict";

var nextTick = require('process/browser.js').nextTick;

var apply = Function.prototype.apply;
var slice = Array.prototype.slice;
var immediateIds = {};
var nextImmediateId = 0; // DOM APIs, for completeness

exports.setTimeout = function () {
  return new Timeout(apply.call(setTimeout, window, arguments), clearTimeout);
};

exports.setInterval = function () {
  return new Timeout(apply.call(setInterval, window, arguments), clearInterval);
};

exports.clearTimeout = exports.clearInterval = function (timeout) {
  timeout.close();
};

function Timeout(id, clearFn) {
  this._id = id;
  this._clearFn = clearFn;
}

Timeout.prototype.unref = Timeout.prototype.ref = function () {};

Timeout.prototype.close = function () {
  this._clearFn.call(window, this._id);
}; // Does not start the time, just sets up the members needed.


exports.enroll = function (item, msecs) {
  clearTimeout(item._idleTimeoutId);
  item._idleTimeout = msecs;
};

exports.unenroll = function (item) {
  clearTimeout(item._idleTimeoutId);
  item._idleTimeout = -1;
};

exports._unrefActive = exports.active = function (item) {
  clearTimeout(item._idleTimeoutId);
  var msecs = item._idleTimeout;

  if (msecs >= 0) {
    item._idleTimeoutId = setTimeout(function onTimeout() {
      if (item._onTimeout) item._onTimeout();
    }, msecs);
  }
}; // That's not how node.js implements it but the exposed api is the same.


exports.setImmediate = typeof setImmediate === "function" ? setImmediate : function (fn) {
  var id = nextImmediateId++;
  var args = arguments.length < 2 ? false : slice.call(arguments, 1);
  immediateIds[id] = true;
  nextTick(function onNextTick() {
    if (immediateIds[id]) {
      // fn.call() is faster so we optimize for the common use-case
      // @see http://jsperf.com/call-apply-segu
      if (args) {
        fn.apply(null, args);
      } else {
        fn.call(null);
      } // Prevent ids from leaking


      exports.clearImmediate(id);
    }
  });
  return id;
};
exports.clearImmediate = typeof clearImmediate === "function" ? clearImmediate : function (id) {
  delete immediateIds[id];
};

}).call(this,require("timers").setImmediate,require("timers").clearImmediate)

},{"process/browser.js":361,"timers":365}],366:[function(require,module,exports){
(function (setImmediate){
"use strict";

function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }

/*! UIkit 3.0.3 | http://www.getuikit.com | (c) 2014 - 2018 YOOtheme | MIT License */
(function (global, factory) {
  (typeof exports === "undefined" ? "undefined" : _typeof(exports)) === 'object' && typeof module !== 'undefined' ? module.exports = factory() : typeof define === 'function' && define.amd ? define('uikit', factory) : (global = global || self, global.UIkit = factory());
})(void 0, function () {
  'use strict';

  function bind(fn, context) {
    return function (a) {
      var l = arguments.length;
      return l ? l > 1 ? fn.apply(context, arguments) : fn.call(context, a) : fn.call(context);
    };
  }

  var objPrototype = Object.prototype;
  var hasOwnProperty = objPrototype.hasOwnProperty;

  function hasOwn(obj, key) {
    return hasOwnProperty.call(obj, key);
  }

  var hyphenateCache = {};
  var hyphenateRe = /([a-z\d])([A-Z])/g;

  function hyphenate(str) {
    if (!(str in hyphenateCache)) {
      hyphenateCache[str] = str.replace(hyphenateRe, '$1-$2').toLowerCase();
    }

    return hyphenateCache[str];
  }

  var camelizeRe = /-(\w)/g;

  function camelize(str) {
    return str.replace(camelizeRe, toUpper);
  }

  function toUpper(_, c) {
    return c ? c.toUpperCase() : '';
  }

  function ucfirst(str) {
    return str.length ? toUpper(null, str.charAt(0)) + str.slice(1) : '';
  }

  var strPrototype = String.prototype;

  var startsWithFn = strPrototype.startsWith || function (search) {
    return this.lastIndexOf(search, 0) === 0;
  };

  function startsWith(str, search) {
    return startsWithFn.call(str, search);
  }

  var endsWithFn = strPrototype.endsWith || function (search) {
    return this.substr(-search.length) === search;
  };

  function endsWith(str, search) {
    return endsWithFn.call(str, search);
  }

  var includesFn = function includesFn(search) {
    return ~this.indexOf(search);
  };

  var includesStr = strPrototype.includes || includesFn;
  var includesArray = Array.prototype.includes || includesFn;

  function includes(obj, search) {
    return obj && (isString(obj) ? includesStr : includesArray).call(obj, search);
  }

  var isArray = Array.isArray;

  function isFunction(obj) {
    return typeof obj === 'function';
  }

  function isObject(obj) {
    return obj !== null && _typeof(obj) === 'object';
  }

  function isPlainObject(obj) {
    return isObject(obj) && Object.getPrototypeOf(obj) === objPrototype;
  }

  function isWindow(obj) {
    return isObject(obj) && obj === obj.window;
  }

  function isDocument(obj) {
    return isObject(obj) && obj.nodeType === 9;
  }

  function isJQuery(obj) {
    return isObject(obj) && !!obj.jquery;
  }

  function isNode(obj) {
    return obj instanceof Node || isObject(obj) && obj.nodeType >= 1;
  }

  var toString = objPrototype.toString;

  function isNodeCollection(obj) {
    return toString.call(obj).match(/^\[object (NodeList|HTMLCollection)\]$/);
  }

  function isBoolean(value) {
    return typeof value === 'boolean';
  }

  function isString(value) {
    return typeof value === 'string';
  }

  function isNumber(value) {
    return typeof value === 'number';
  }

  function isNumeric(value) {
    return isNumber(value) || isString(value) && !isNaN(value - parseFloat(value));
  }

  function isUndefined(value) {
    return value === void 0;
  }

  function toBoolean(value) {
    return isBoolean(value) ? value : value === 'true' || value === '1' || value === '' ? true : value === 'false' || value === '0' ? false : value;
  }

  function toNumber(value) {
    var number = Number(value);
    return !isNaN(number) ? number : false;
  }

  function toFloat(value) {
    return parseFloat(value) || 0;
  }

  function toNode(element) {
    return isNode(element) || isWindow(element) || isDocument(element) ? element : isNodeCollection(element) || isJQuery(element) ? element[0] : isArray(element) ? toNode(element[0]) : null;
  }

  var arrayProto = Array.prototype;

  function toNodes(element) {
    return isNode(element) ? [element] : isNodeCollection(element) ? arrayProto.slice.call(element) : isArray(element) ? element.map(toNode).filter(Boolean) : isJQuery(element) ? element.toArray() : [];
  }

  function toList(value) {
    return isArray(value) ? value : isString(value) ? value.split(/,(?![^(]*\))/).map(function (value) {
      return isNumeric(value) ? toNumber(value) : toBoolean(value.trim());
    }) : [value];
  }

  function toMs(time) {
    return !time ? 0 : endsWith(time, 'ms') ? toFloat(time) : toFloat(time) * 1000;
  }

  function isEqual(value, other) {
    return value === other || isObject(value) && isObject(other) && Object.keys(value).length === Object.keys(other).length && each(value, function (val, key) {
      return val === other[key];
    });
  }

  function swap(value, a, b) {
    return value.replace(new RegExp(a + "|" + b, 'mg'), function (match) {
      return match === a ? b : a;
    });
  }

  var assign = Object.assign || function (target) {
    var args = [],
        len = arguments.length - 1;

    while (len-- > 0) {
      args[len] = arguments[len + 1];
    }

    target = Object(target);

    for (var i = 0; i < args.length; i++) {
      var source = args[i];

      if (source !== null) {
        for (var key in source) {
          if (hasOwn(source, key)) {
            target[key] = source[key];
          }
        }
      }
    }

    return target;
  };

  function each(obj, cb) {
    for (var key in obj) {
      if (false === cb(obj[key], key)) {
        return false;
      }
    }

    return true;
  }

  function sortBy(collection, prop) {
    return collection.sort(function (ref, ref$1) {
      var propA = ref[prop];
      if (propA === void 0) propA = 0;
      var propB = ref$1[prop];
      if (propB === void 0) propB = 0;
      return propA > propB ? 1 : propB > propA ? -1 : 0;
    });
  }

  function clamp(number, min, max) {
    if (min === void 0) min = 0;
    if (max === void 0) max = 1;
    return Math.min(Math.max(toNumber(number) || 0, min), max);
  }

  function noop() {}

  function intersectRect(r1, r2) {
    return r1.left < r2.right && r1.right > r2.left && r1.top < r2.bottom && r1.bottom > r2.top;
  }

  function pointInRect(point, rect) {
    return point.x <= rect.right && point.x >= rect.left && point.y <= rect.bottom && point.y >= rect.top;
  }

  var Dimensions = {
    ratio: function ratio(dimensions, prop, value) {
      var obj;
      var aProp = prop === 'width' ? 'height' : 'width';
      return obj = {}, obj[aProp] = dimensions[prop] ? Math.round(value * dimensions[aProp] / dimensions[prop]) : dimensions[aProp], obj[prop] = value, obj;
    },
    contain: function contain(dimensions, maxDimensions) {
      var this$1 = this;
      dimensions = assign({}, dimensions);
      each(dimensions, function (_, prop) {
        return dimensions = dimensions[prop] > maxDimensions[prop] ? this$1.ratio(dimensions, prop, maxDimensions[prop]) : dimensions;
      });
      return dimensions;
    },
    cover: function cover(dimensions, maxDimensions) {
      var this$1 = this;
      dimensions = this.contain(dimensions, maxDimensions);
      each(dimensions, function (_, prop) {
        return dimensions = dimensions[prop] < maxDimensions[prop] ? this$1.ratio(dimensions, prop, maxDimensions[prop]) : dimensions;
      });
      return dimensions;
    }
  };

  function attr(element, name, value) {
    if (isObject(name)) {
      for (var key in name) {
        attr(element, key, name[key]);
      }

      return;
    }

    if (isUndefined(value)) {
      element = toNode(element);
      return element && element.getAttribute(name);
    } else {
      toNodes(element).forEach(function (element) {
        if (isFunction(value)) {
          value = value.call(element, attr(element, name));
        }

        if (value === null) {
          removeAttr(element, name);
        } else {
          element.setAttribute(name, value);
        }
      });
    }
  }

  function hasAttr(element, name) {
    return toNodes(element).some(function (element) {
      return element.hasAttribute(name);
    });
  }

  function removeAttr(element, name) {
    element = toNodes(element);
    name.split(' ').forEach(function (name) {
      return element.forEach(function (element) {
        return element.removeAttribute(name);
      });
    });
  }

  function data(element, attribute) {
    for (var i = 0, attrs = [attribute, "data-" + attribute]; i < attrs.length; i++) {
      if (hasAttr(element, attrs[i])) {
        return attr(element, attrs[i]);
      }
    }
  }

  function query(selector, context) {
    return toNode(selector) || find(selector, getContext(selector, context));
  }

  function queryAll(selector, context) {
    var nodes = toNodes(selector);
    return nodes.length && nodes || findAll(selector, getContext(selector, context));
  }

  function getContext(selector, context) {
    if (context === void 0) context = document;
    return isContextSelector(selector) || isDocument(context) ? context : context.ownerDocument;
  }

  function find(selector, context) {
    return toNode(_query(selector, context, 'querySelector'));
  }

  function findAll(selector, context) {
    return toNodes(_query(selector, context, 'querySelectorAll'));
  }

  function _query(selector, context, queryFn) {
    if (context === void 0) context = document;

    if (!selector || !isString(selector)) {
      return null;
    }

    selector = selector.replace(contextSanitizeRe, '$1 *');
    var removes;

    if (isContextSelector(selector)) {
      removes = [];
      selector = selector.split(',').map(function (selector, i) {
        var ctx = context;
        selector = selector.trim();

        if (selector[0] === '!') {
          var selectors = selector.substr(1).trim().split(' ');
          ctx = closest(context.parentNode, selectors[0]);
          selector = selectors.slice(1).join(' ').trim();
        }

        if (selector[0] === '-') {
          var selectors$1 = selector.substr(1).trim().split(' ');
          var prev = (ctx || context).previousElementSibling;
          ctx = matches(prev, selector.substr(1)) ? prev : null;
          selector = selectors$1.slice(1).join(' ');
        }

        if (!ctx) {
          return null;
        }

        if (!ctx.id) {
          ctx.id = "uk-" + Date.now() + i;
          removes.push(function () {
            return removeAttr(ctx, 'id');
          });
        }

        return "#" + escape(ctx.id) + " " + selector;
      }).filter(Boolean).join(',');
      context = document;
    }

    try {
      return context[queryFn](selector);
    } catch (e) {
      return null;
    } finally {
      removes && removes.forEach(function (remove) {
        return remove();
      });
    }
  }

  var contextSelectorRe = /(^|,)\s*[!>+~-]/;
  var contextSanitizeRe = /([!>+~-])(?=\s+[!>+~-]|\s*$)/g;

  function isContextSelector(selector) {
    return isString(selector) && selector.match(contextSelectorRe);
  }

  var elProto = Element.prototype;
  var matchesFn = elProto.matches || elProto.webkitMatchesSelector || elProto.msMatchesSelector;

  function matches(element, selector) {
    return toNodes(element).some(function (element) {
      return matchesFn.call(element, selector);
    });
  }

  var closestFn = elProto.closest || function (selector) {
    var ancestor = this;

    do {
      if (matches(ancestor, selector)) {
        return ancestor;
      }

      ancestor = ancestor.parentNode;
    } while (ancestor && ancestor.nodeType === 1);
  };

  function closest(element, selector) {
    if (startsWith(selector, '>')) {
      selector = selector.slice(1);
    }

    return isNode(element) ? element.parentNode && closestFn.call(element, selector) : toNodes(element).map(function (element) {
      return closest(element, selector);
    }).filter(Boolean);
  }

  function parents(element, selector) {
    var elements = [];
    var parent = toNode(element).parentNode;

    while (parent && parent.nodeType === 1) {
      if (matches(parent, selector)) {
        elements.push(parent);
      }

      parent = parent.parentNode;
    }

    return elements;
  }

  var escapeFn = window.CSS && CSS.escape || function (css) {
    return css.replace(/([^\x7f-\uFFFF\w-])/g, function (match) {
      return "\\" + match;
    });
  };

  function escape(css) {
    return isString(css) ? escapeFn.call(null, css) : '';
  }

  var voidElements = {
    area: true,
    base: true,
    br: true,
    col: true,
    embed: true,
    hr: true,
    img: true,
    input: true,
    keygen: true,
    link: true,
    menuitem: true,
    meta: true,
    param: true,
    source: true,
    track: true,
    wbr: true
  };

  function isVoidElement(element) {
    return toNodes(element).some(function (element) {
      return voidElements[element.tagName.toLowerCase()];
    });
  }

  function isVisible(element) {
    return toNodes(element).some(function (element) {
      return element.offsetWidth || element.offsetHeight || element.getClientRects().length;
    });
  }

  var selInput = 'input,select,textarea,button';

  function isInput(element) {
    return toNodes(element).some(function (element) {
      return matches(element, selInput);
    });
  }

  function filter(element, selector) {
    return toNodes(element).filter(function (element) {
      return matches(element, selector);
    });
  }

  function within(element, selector) {
    return !isString(selector) ? element === selector || (isDocument(selector) ? selector.documentElement : toNode(selector)).contains(toNode(element)) // IE 11 document does not implement contains
    : matches(element, selector) || closest(element, selector);
  }
  /* global DocumentTouch */


  var isIE = /msie|trident/i.test(window.navigator.userAgent);
  var isRtl = attr(document.documentElement, 'dir') === 'rtl';
  var hasTouchEvents = 'ontouchstart' in window;
  var hasPointerEvents = window.PointerEvent;
  var hasTouch = hasTouchEvents || window.DocumentTouch && document instanceof DocumentTouch || navigator.maxTouchPoints; // IE >=11

  var pointerDown = hasPointerEvents ? 'pointerdown' : hasTouchEvents ? 'touchstart' : 'mousedown';
  var pointerMove = hasPointerEvents ? 'pointermove' : hasTouchEvents ? 'touchmove' : 'mousemove';
  var pointerUp = hasPointerEvents ? 'pointerup' : hasTouchEvents ? 'touchend' : 'mouseup';
  var pointerEnter = hasPointerEvents ? 'pointerenter' : hasTouchEvents ? '' : 'mouseenter';
  var pointerLeave = hasPointerEvents ? 'pointerleave' : hasTouchEvents ? '' : 'mouseleave';
  var pointerCancel = hasPointerEvents ? 'pointercancel' : 'touchcancel';

  function on() {
    var args = [],
        len = arguments.length;

    while (len--) {
      args[len] = arguments[len];
    }

    var ref = getArgs(args);
    var targets = ref[0];
    var type = ref[1];
    var selector = ref[2];
    var listener = ref[3];
    var useCapture = ref[4];
    targets = toEventTargets(targets);

    if (selector) {
      listener = delegate(targets, selector, listener);
    }

    if (listener.length > 1) {
      listener = detail(listener);
    }

    type.split(' ').forEach(function (type) {
      return targets.forEach(function (target) {
        return target.addEventListener(type, listener, useCapture);
      });
    });
    return function () {
      return off(targets, type, listener, useCapture);
    };
  }

  function off(targets, type, listener, useCapture) {
    if (useCapture === void 0) useCapture = false;
    targets = toEventTargets(targets);
    type.split(' ').forEach(function (type) {
      return targets.forEach(function (target) {
        return target.removeEventListener(type, listener, useCapture);
      });
    });
  }

  function once() {
    var args = [],
        len = arguments.length;

    while (len--) {
      args[len] = arguments[len];
    }

    var ref = getArgs(args);
    var element = ref[0];
    var type = ref[1];
    var selector = ref[2];
    var listener = ref[3];
    var useCapture = ref[4];
    var condition = ref[5];
    var off = on(element, type, selector, function (e) {
      var result = !condition || condition(e);

      if (result) {
        off();
        listener(e, result);
      }
    }, useCapture);
    return off;
  }

  function trigger(targets, event, detail) {
    return toEventTargets(targets).reduce(function (notCanceled, target) {
      return notCanceled && target.dispatchEvent(createEvent(event, true, true, detail));
    }, true);
  }

  function createEvent(e, bubbles, cancelable, detail) {
    if (bubbles === void 0) bubbles = true;
    if (cancelable === void 0) cancelable = false;

    if (isString(e)) {
      var event = document.createEvent('CustomEvent'); // IE 11

      event.initCustomEvent(e, bubbles, cancelable, detail);
      e = event;
    }

    return e;
  }

  function getArgs(args) {
    if (isFunction(args[2])) {
      args.splice(2, 0, false);
    }

    return args;
  }

  function delegate(delegates, selector, listener) {
    var this$1 = this;
    return function (e) {
      delegates.forEach(function (delegate) {
        var current = selector[0] === '>' ? findAll(selector, delegate).reverse().filter(function (element) {
          return within(e.target, element);
        })[0] : closest(e.target, selector);

        if (current) {
          e.delegate = delegate;
          e.current = current;
          listener.call(this$1, e);
        }
      });
    };
  }

  function detail(listener) {
    return function (e) {
      return isArray(e.detail) ? listener.apply(void 0, [e].concat(e.detail)) : listener(e);
    };
  }

  function isEventTarget(target) {
    return target && 'addEventListener' in target;
  }

  function toEventTarget(target) {
    return isEventTarget(target) ? target : toNode(target);
  }

  function toEventTargets(target) {
    return isArray(target) ? target.map(toEventTarget).filter(Boolean) : isString(target) ? findAll(target) : isEventTarget(target) ? [target] : toNodes(target);
  }

  function preventClick() {
    var timer = setTimeout(once(document, 'click', function (e) {
      e.preventDefault();
      e.stopImmediatePropagation();
      clearTimeout(timer);
    }, true));
    trigger(document, pointerCancel);
  }
  /* global setImmediate */


  var Promise = 'Promise' in window ? window.Promise : PromiseFn;

  var Deferred = function Deferred() {
    var this$1 = this;
    this.promise = new Promise(function (resolve, reject) {
      this$1.reject = reject;
      this$1.resolve = resolve;
    });
  };
  /**
   * Promises/A+ polyfill v1.1.4 (https://github.com/bramstein/promis)
   */


  var RESOLVED = 0;
  var REJECTED = 1;
  var PENDING = 2;
  var async = 'setImmediate' in window ? setImmediate : setTimeout;

  function PromiseFn(executor) {
    this.state = PENDING;
    this.value = undefined;
    this.deferred = [];
    var promise = this;

    try {
      executor(function (x) {
        promise.resolve(x);
      }, function (r) {
        promise.reject(r);
      });
    } catch (e) {
      promise.reject(e);
    }
  }

  PromiseFn.reject = function (r) {
    return new PromiseFn(function (resolve, reject) {
      reject(r);
    });
  };

  PromiseFn.resolve = function (x) {
    return new PromiseFn(function (resolve, reject) {
      resolve(x);
    });
  };

  PromiseFn.all = function all(iterable) {
    return new PromiseFn(function (resolve, reject) {
      var result = [];
      var count = 0;

      if (iterable.length === 0) {
        resolve(result);
      }

      function resolver(i) {
        return function (x) {
          result[i] = x;
          count += 1;

          if (count === iterable.length) {
            resolve(result);
          }
        };
      }

      for (var i = 0; i < iterable.length; i += 1) {
        PromiseFn.resolve(iterable[i]).then(resolver(i), reject);
      }
    });
  };

  PromiseFn.race = function race(iterable) {
    return new PromiseFn(function (resolve, reject) {
      for (var i = 0; i < iterable.length; i += 1) {
        PromiseFn.resolve(iterable[i]).then(resolve, reject);
      }
    });
  };

  var p = PromiseFn.prototype;

  p.resolve = function resolve(x) {
    var promise = this;

    if (promise.state === PENDING) {
      if (x === promise) {
        throw new TypeError('Promise settled with itself.');
      }

      var called = false;

      try {
        var then = x && x.then;

        if (x !== null && isObject(x) && isFunction(then)) {
          then.call(x, function (x) {
            if (!called) {
              promise.resolve(x);
            }

            called = true;
          }, function (r) {
            if (!called) {
              promise.reject(r);
            }

            called = true;
          });
          return;
        }
      } catch (e) {
        if (!called) {
          promise.reject(e);
        }

        return;
      }

      promise.state = RESOLVED;
      promise.value = x;
      promise.notify();
    }
  };

  p.reject = function reject(reason) {
    var promise = this;

    if (promise.state === PENDING) {
      if (reason === promise) {
        throw new TypeError('Promise settled with itself.');
      }

      promise.state = REJECTED;
      promise.value = reason;
      promise.notify();
    }
  };

  p.notify = function notify() {
    var this$1 = this;
    async(function () {
      if (this$1.state !== PENDING) {
        while (this$1.deferred.length) {
          var ref = this$1.deferred.shift();
          var onResolved = ref[0];
          var onRejected = ref[1];
          var resolve = ref[2];
          var reject = ref[3];

          try {
            if (this$1.state === RESOLVED) {
              if (isFunction(onResolved)) {
                resolve(onResolved.call(undefined, this$1.value));
              } else {
                resolve(this$1.value);
              }
            } else if (this$1.state === REJECTED) {
              if (isFunction(onRejected)) {
                resolve(onRejected.call(undefined, this$1.value));
              } else {
                reject(this$1.value);
              }
            }
          } catch (e) {
            reject(e);
          }
        }
      }
    });
  };

  p.then = function then(onResolved, onRejected) {
    var this$1 = this;
    return new PromiseFn(function (resolve, reject) {
      this$1.deferred.push([onResolved, onRejected, resolve, reject]);
      this$1.notify();
    });
  };

  p["catch"] = function (onRejected) {
    return this.then(undefined, onRejected);
  };

  function ajax(url, options) {
    return new Promise(function (resolve, reject) {
      var env = assign({
        data: null,
        method: 'GET',
        headers: {},
        xhr: new XMLHttpRequest(),
        beforeSend: noop,
        responseType: ''
      }, options);
      env.beforeSend(env);
      var xhr = env.xhr;

      for (var prop in env) {
        if (prop in xhr) {
          try {
            xhr[prop] = env[prop];
          } catch (e) {}
        }
      }

      xhr.open(env.method.toUpperCase(), url);

      for (var header in env.headers) {
        xhr.setRequestHeader(header, env.headers[header]);
      }

      on(xhr, 'load', function () {
        if (xhr.status === 0 || xhr.status >= 200 && xhr.status < 300 || xhr.status === 304) {
          resolve(xhr);
        } else {
          reject(assign(Error(xhr.statusText), {
            xhr: xhr,
            status: xhr.status
          }));
        }
      });
      on(xhr, 'error', function () {
        return reject(assign(Error('Network Error'), {
          xhr: xhr
        }));
      });
      on(xhr, 'timeout', function () {
        return reject(assign(Error('Network Timeout'), {
          xhr: xhr
        }));
      });
      xhr.send(env.data);
    });
  }

  function getImage(src, srcset, sizes) {
    return new Promise(function (resolve, reject) {
      var img = new Image();
      img.onerror = reject;

      img.onload = function () {
        return resolve(img);
      };

      sizes && (img.sizes = sizes);
      srcset && (img.srcset = srcset);
      img.src = src;
    });
  }

  function ready(fn) {
    if (document.readyState !== 'loading') {
      fn();
      return;
    }

    var unbind = on(document, 'DOMContentLoaded', function () {
      unbind();
      fn();
    });
  }

  function _index(element, ref) {
    return ref ? toNodes(element).indexOf(toNode(ref)) : toNodes((element = toNode(element)) && element.parentNode.children).indexOf(element);
  }

  function _getIndex(i, elements, current, finite) {
    if (current === void 0) current = 0;
    if (finite === void 0) finite = false;
    elements = toNodes(elements);
    var length = elements.length;
    i = isNumeric(i) ? toNumber(i) : i === 'next' ? current + 1 : i === 'previous' ? current - 1 : _index(elements, i);

    if (finite) {
      return clamp(i, 0, length - 1);
    }

    i %= length;
    return i < 0 ? i + length : i;
  }

  function empty(element) {
    element = $(element);
    element.innerHTML = '';
    return element;
  }

  function html(parent, html) {
    parent = $(parent);
    return isUndefined(html) ? parent.innerHTML : append(parent.hasChildNodes() ? empty(parent) : parent, html);
  }

  function prepend(parent, element) {
    parent = $(parent);

    if (!parent.hasChildNodes()) {
      return append(parent, element);
    } else {
      return insertNodes(element, function (element) {
        return parent.insertBefore(element, parent.firstChild);
      });
    }
  }

  function append(parent, element) {
    parent = $(parent);
    return insertNodes(element, function (element) {
      return parent.appendChild(element);
    });
  }

  function before(ref, element) {
    ref = $(ref);
    return insertNodes(element, function (element) {
      return ref.parentNode.insertBefore(element, ref);
    });
  }

  function after(ref, element) {
    ref = $(ref);
    return insertNodes(element, function (element) {
      return ref.nextSibling ? before(ref.nextSibling, element) : append(ref.parentNode, element);
    });
  }

  function insertNodes(element, fn) {
    element = isString(element) ? fragment(element) : element;
    return element ? 'length' in element ? toNodes(element).map(fn) : fn(element) : null;
  }

  function _remove(element) {
    toNodes(element).map(function (element) {
      return element.parentNode && element.parentNode.removeChild(element);
    });
  }

  function wrapAll(element, structure) {
    structure = toNode(before(element, structure));

    while (structure.firstChild) {
      structure = structure.firstChild;
    }

    append(structure, element);
    return structure;
  }

  function wrapInner(element, structure) {
    return toNodes(toNodes(element).map(function (element) {
      return element.hasChildNodes ? wrapAll(toNodes(element.childNodes), structure) : append(element, structure);
    }));
  }

  function unwrap(element) {
    toNodes(element).map(function (element) {
      return element.parentNode;
    }).filter(function (value, index, self) {
      return self.indexOf(value) === index;
    }).forEach(function (parent) {
      before(parent, parent.childNodes);

      _remove(parent);
    });
  }

  var fragmentRe = /^\s*<(\w+|!)[^>]*>/;
  var singleTagRe = /^<(\w+)\s*\/?>(?:<\/\1>)?$/;

  function fragment(html) {
    var matches$$1 = singleTagRe.exec(html);

    if (matches$$1) {
      return document.createElement(matches$$1[1]);
    }

    var container = document.createElement('div');

    if (fragmentRe.test(html)) {
      container.insertAdjacentHTML('beforeend', html.trim());
    } else {
      container.textContent = html;
    }

    return container.childNodes.length > 1 ? toNodes(container.childNodes) : container.firstChild;
  }

  function apply(node, fn) {
    if (!node || node.nodeType !== 1) {
      return;
    }

    fn(node);
    node = node.firstElementChild;

    while (node) {
      apply(node, fn);
      node = node.nextElementSibling;
    }
  }

  function $(selector, context) {
    return !isString(selector) ? toNode(selector) : isHtml(selector) ? toNode(fragment(selector)) : find(selector, context);
  }

  function $$(selector, context) {
    return !isString(selector) ? toNodes(selector) : isHtml(selector) ? toNodes(fragment(selector)) : findAll(selector, context);
  }

  function isHtml(str) {
    return str[0] === '<' || str.match(/^\s*</);
  }

  function addClass(element) {
    var args = [],
        len = arguments.length - 1;

    while (len-- > 0) {
      args[len] = arguments[len + 1];
    }

    apply$1(element, args, 'add');
  }

  function removeClass(element) {
    var args = [],
        len = arguments.length - 1;

    while (len-- > 0) {
      args[len] = arguments[len + 1];
    }

    apply$1(element, args, 'remove');
  }

  function removeClasses(element, cls) {
    attr(element, 'class', function (value) {
      return (value || '').replace(new RegExp("\\b" + cls + "\\b", 'g'), '');
    });
  }

  function replaceClass(element) {
    var args = [],
        len = arguments.length - 1;

    while (len-- > 0) {
      args[len] = arguments[len + 1];
    }

    args[0] && removeClass(element, args[0]);
    args[1] && addClass(element, args[1]);
  }

  function hasClass(element, cls) {
    return cls && toNodes(element).some(function (element) {
      return element.classList.contains(cls.split(' ')[0]);
    });
  }

  function toggleClass(element) {
    var args = [],
        len = arguments.length - 1;

    while (len-- > 0) {
      args[len] = arguments[len + 1];
    }

    if (!args.length) {
      return;
    }

    args = getArgs$1(args);
    var force = !isString(args[args.length - 1]) ? args.pop() : []; // in iOS 9.3 force === undefined evaluates to false

    args = args.filter(Boolean);
    toNodes(element).forEach(function (ref) {
      var classList = ref.classList;

      for (var i = 0; i < args.length; i++) {
        supports.Force ? classList.toggle.apply(classList, [args[i]].concat(force)) : classList[(!isUndefined(force) ? force : !classList.contains(args[i])) ? 'add' : 'remove'](args[i]);
      }
    });
  }

  function apply$1(element, args, fn) {
    args = getArgs$1(args).filter(Boolean);
    args.length && toNodes(element).forEach(function (ref) {
      var classList = ref.classList;
      supports.Multiple ? classList[fn].apply(classList, args) : args.forEach(function (cls) {
        return classList[fn](cls);
      });
    });
  }

  function getArgs$1(args) {
    return args.reduce(function (args, arg) {
      return args.concat.call(args, isString(arg) && includes(arg, ' ') ? arg.trim().split(' ') : arg);
    }, []);
  }

  var supports = {}; // IE 11

  (function () {
    var list = document.createElement('_').classList;

    if (list) {
      list.add('a', 'b');
      list.toggle('c', false);
      supports.Multiple = list.contains('b');
      supports.Force = !list.contains('c');
    }

    list = null;
  })();

  var cssNumber = {
    'animation-iteration-count': true,
    'column-count': true,
    'fill-opacity': true,
    'flex-grow': true,
    'flex-shrink': true,
    'font-weight': true,
    'line-height': true,
    'opacity': true,
    'order': true,
    'orphans': true,
    'widows': true,
    'z-index': true,
    'zoom': true
  };

  function css(element, property, value) {
    return toNodes(element).map(function (element) {
      if (isString(property)) {
        property = propName(property);

        if (isUndefined(value)) {
          return getStyle(element, property);
        } else if (!value && !isNumber(value)) {
          element.style.removeProperty(property);
        } else {
          element.style[property] = isNumeric(value) && !cssNumber[property] ? value + "px" : value;
        }
      } else if (isArray(property)) {
        var styles = getStyles(element);
        return property.reduce(function (props, property) {
          props[property] = styles[propName(property)];
          return props;
        }, {});
      } else if (isObject(property)) {
        each(property, function (value, property) {
          return css(element, property, value);
        });
      }

      return element;
    })[0];
  }

  function getStyles(element, pseudoElt) {
    element = toNode(element);
    return element.ownerDocument.defaultView.getComputedStyle(element, pseudoElt);
  }

  function getStyle(element, property, pseudoElt) {
    return getStyles(element, pseudoElt)[property];
  }

  var vars = {};

  function getCssVar(name) {
    var docEl = document.documentElement;

    if (!isIE) {
      return getStyles(docEl).getPropertyValue("--uk-" + name);
    }

    if (!(name in vars)) {
      /* usage in css: .uk-name:before { content:"xyz" } */
      var element = append(docEl, document.createElement('div'));
      addClass(element, "uk-" + name);
      vars[name] = getStyle(element, 'content', ':before').replace(/^["'](.*)["']$/, '$1');

      _remove(element);
    }

    return vars[name];
  }

  var cssProps = {};

  function propName(name) {
    var ret = cssProps[name];

    if (!ret) {
      ret = cssProps[name] = vendorPropName(name) || name;
    }

    return ret;
  }

  var cssPrefixes = ['webkit', 'moz', 'ms'];
  var ref = document.createElement('_');
  var style = ref.style;

  function vendorPropName(name) {
    name = hyphenate(name);

    if (name in style) {
      return name;
    }

    var i = cssPrefixes.length,
        prefixedName;

    while (i--) {
      prefixedName = "-" + cssPrefixes[i] + "-" + name;

      if (prefixedName in style) {
        return prefixedName;
      }
    }
  }

  function transition(element, props, duration, timing) {
    if (duration === void 0) duration = 400;
    if (timing === void 0) timing = 'linear';
    return Promise.all(toNodes(element).map(function (element) {
      return new Promise(function (resolve, reject) {
        for (var name in props) {
          var value = css(element, name);

          if (value === '') {
            css(element, name, value);
          }
        }

        var timer = setTimeout(function () {
          return trigger(element, 'transitionend');
        }, duration);
        once(element, 'transitionend transitioncanceled', function (ref) {
          var type = ref.type;
          clearTimeout(timer);
          removeClass(element, 'uk-transition');
          css(element, {
            'transition-property': '',
            'transition-duration': '',
            'transition-timing-function': ''
          });
          type === 'transitioncanceled' ? reject() : resolve();
        }, false, function (ref) {
          var target = ref.target;
          return element === target;
        });
        addClass(element, 'uk-transition');
        css(element, assign({
          'transition-property': Object.keys(props).map(propName).join(','),
          'transition-duration': duration + "ms",
          'transition-timing-function': timing
        }, props));
      });
    }));
  }

  var Transition = {
    start: transition,
    stop: function stop(element) {
      trigger(element, 'transitionend');
      return Promise.resolve();
    },
    cancel: function cancel(element) {
      trigger(element, 'transitioncanceled');
    },
    inProgress: function inProgress(element) {
      return hasClass(element, 'uk-transition');
    }
  };
  var animationPrefix = 'uk-animation-';
  var clsCancelAnimation = 'uk-cancel-animation';

  function animate(element, animation, duration, origin, out) {
    var arguments$1 = arguments;
    if (duration === void 0) duration = 200;
    return Promise.all(toNodes(element).map(function (element) {
      return new Promise(function (resolve, reject) {
        if (hasClass(element, clsCancelAnimation)) {
          requestAnimationFrame(function () {
            return Promise.resolve().then(function () {
              return animate.apply(void 0, arguments$1).then(resolve, reject);
            });
          });
          return;
        }

        var cls = animation + " " + animationPrefix + (out ? 'leave' : 'enter');

        if (startsWith(animation, animationPrefix)) {
          if (origin) {
            cls += " uk-transform-origin-" + origin;
          }

          if (out) {
            cls += " " + animationPrefix + "reverse";
          }
        }

        reset();
        once(element, 'animationend animationcancel', function (ref) {
          var type = ref.type;
          var hasReset = false;

          if (type === 'animationcancel') {
            reject();
            reset();
          } else {
            resolve();
            Promise.resolve().then(function () {
              hasReset = true;
              reset();
            });
          }

          requestAnimationFrame(function () {
            if (!hasReset) {
              addClass(element, clsCancelAnimation);
              requestAnimationFrame(function () {
                return removeClass(element, clsCancelAnimation);
              });
            }
          });
        }, false, function (ref) {
          var target = ref.target;
          return element === target;
        });
        css(element, 'animationDuration', duration + "ms");
        addClass(element, cls);

        function reset() {
          css(element, 'animationDuration', '');
          removeClasses(element, animationPrefix + "\\S*");
        }
      });
    }));
  }

  var _inProgress = new RegExp(animationPrefix + "(enter|leave)");

  var Animation = {
    "in": function _in(element, animation, duration, origin) {
      return animate(element, animation, duration, origin, false);
    },
    out: function out(element, animation, duration, origin) {
      return animate(element, animation, duration, origin, true);
    },
    inProgress: function inProgress(element) {
      return _inProgress.test(attr(element, 'class'));
    },
    cancel: function cancel(element) {
      trigger(element, 'animationcancel');
    }
  };
  var dirs = {
    width: ['x', 'left', 'right'],
    height: ['y', 'top', 'bottom']
  };

  function _positionAt(element, target, elAttach, targetAttach, elOffset, targetOffset, flip, boundary) {
    elAttach = getPos(elAttach);
    targetAttach = getPos(targetAttach);
    var flipped = {
      element: elAttach,
      target: targetAttach
    };

    if (!element || !target) {
      return flipped;
    }

    var dim = getDimensions(element);
    var targetDim = getDimensions(target);
    var position = targetDim;
    moveTo(position, elAttach, dim, -1);
    moveTo(position, targetAttach, targetDim, 1);
    elOffset = getOffsets(elOffset, dim.width, dim.height);
    targetOffset = getOffsets(targetOffset, targetDim.width, targetDim.height);
    elOffset['x'] += targetOffset['x'];
    elOffset['y'] += targetOffset['y'];
    position.left += elOffset['x'];
    position.top += elOffset['y'];

    if (flip) {
      var boundaries = [getDimensions(window$1(element))];

      if (boundary) {
        boundaries.unshift(getDimensions(boundary));
      }

      each(dirs, function (ref, prop) {
        var dir = ref[0];
        var align = ref[1];
        var alignFlip = ref[2];

        if (!(flip === true || includes(flip, dir))) {
          return;
        }

        boundaries.some(function (boundary) {
          var elemOffset = elAttach[dir] === align ? -dim[prop] : elAttach[dir] === alignFlip ? dim[prop] : 0;
          var targetOffset = targetAttach[dir] === align ? targetDim[prop] : targetAttach[dir] === alignFlip ? -targetDim[prop] : 0;

          if (position[align] < boundary[align] || position[align] + dim[prop] > boundary[alignFlip]) {
            var centerOffset = dim[prop] / 2;
            var centerTargetOffset = targetAttach[dir] === 'center' ? -targetDim[prop] / 2 : 0;
            return elAttach[dir] === 'center' && (apply(centerOffset, centerTargetOffset) || apply(-centerOffset, -centerTargetOffset)) || apply(elemOffset, targetOffset);
          }

          function apply(elemOffset, targetOffset) {
            var newVal = position[align] + elemOffset + targetOffset - elOffset[dir] * 2;

            if (newVal >= boundary[align] && newVal + dim[prop] <= boundary[alignFlip]) {
              position[align] = newVal;
              ['element', 'target'].forEach(function (el) {
                flipped[el][dir] = !elemOffset ? flipped[el][dir] : flipped[el][dir] === dirs[prop][1] ? dirs[prop][2] : dirs[prop][1];
              });
              return true;
            }
          }
        });
      });
    }

    offset(element, position);
    return flipped;
  }

  function offset(element, coordinates) {
    element = toNode(element);

    if (coordinates) {
      var currentOffset = offset(element);
      var pos = css(element, 'position');
      ['left', 'top'].forEach(function (prop) {
        if (prop in coordinates) {
          var value = css(element, prop);
          css(element, prop, coordinates[prop] - currentOffset[prop] + toFloat(pos === 'absolute' && value === 'auto' ? position(element)[prop] : value));
        }
      });
      return;
    }

    return getDimensions(element);
  }

  function getDimensions(element) {
    element = toNode(element);
    var ref = window$1(element);
    var top = ref.pageYOffset;
    var left = ref.pageXOffset;

    if (isWindow(element)) {
      var height = element.innerHeight;
      var width = element.innerWidth;
      return {
        top: top,
        left: left,
        height: height,
        width: width,
        bottom: top + height,
        right: left + width
      };
    }

    var style, hidden;

    if (!isVisible(element)) {
      style = attr(element, 'style');
      hidden = attr(element, 'hidden');
      attr(element, {
        style: (style || '') + ";display:block !important;",
        hidden: null
      });
    }

    var rect = element.getBoundingClientRect();

    if (!isUndefined(style)) {
      attr(element, {
        style: style,
        hidden: hidden
      });
    }

    return {
      height: rect.height,
      width: rect.width,
      top: rect.top + top,
      left: rect.left + left,
      bottom: rect.bottom + top,
      right: rect.right + left
    };
  }

  function position(element) {
    element = toNode(element);
    var parent = element.offsetParent || docEl(element);
    var parentOffset = offset(parent);
    var ref = ['top', 'left'].reduce(function (props, prop) {
      var propName$$1 = ucfirst(prop);
      props[prop] -= parentOffset[prop] + toFloat(css(element, "margin" + propName$$1)) + toFloat(css(parent, "border" + propName$$1 + "Width"));
      return props;
    }, offset(element));
    var top = ref.top;
    var left = ref.left;
    return {
      top: top,
      left: left
    };
  }

  var height = dimension('height');
  var width = dimension('width');

  function dimension(prop) {
    var propName$$1 = ucfirst(prop);
    return function (element, value) {
      element = toNode(element);

      if (isUndefined(value)) {
        if (isWindow(element)) {
          return element["inner" + propName$$1];
        }

        if (isDocument(element)) {
          var doc = element.documentElement;
          return Math.max(doc["offset" + propName$$1], doc["scroll" + propName$$1]);
        }

        value = css(element, prop);
        value = value === 'auto' ? element["offset" + propName$$1] : toFloat(value) || 0;
        return value - boxModelAdjust(prop, element);
      } else {
        css(element, prop, !value && value !== 0 ? '' : +value + boxModelAdjust(prop, element) + 'px');
      }
    };
  }

  function boxModelAdjust(prop, element, sizing) {
    if (sizing === void 0) sizing = 'border-box';
    return css(element, 'boxSizing') === sizing ? dirs[prop].slice(1).map(ucfirst).reduce(function (value, prop) {
      return value + toFloat(css(element, "padding" + prop)) + toFloat(css(element, "border" + prop + "Width"));
    }, 0) : 0;
  }

  function moveTo(position, attach, dim, factor) {
    each(dirs, function (ref, prop) {
      var dir = ref[0];
      var align = ref[1];
      var alignFlip = ref[2];

      if (attach[dir] === alignFlip) {
        position[align] += dim[prop] * factor;
      } else if (attach[dir] === 'center') {
        position[align] += dim[prop] * factor / 2;
      }
    });
  }

  function getPos(pos) {
    var x = /left|center|right/;
    var y = /top|center|bottom/;
    pos = (pos || '').split(' ');

    if (pos.length === 1) {
      pos = x.test(pos[0]) ? pos.concat(['center']) : y.test(pos[0]) ? ['center'].concat(pos) : ['center', 'center'];
    }

    return {
      x: x.test(pos[0]) ? pos[0] : 'center',
      y: y.test(pos[1]) ? pos[1] : 'center'
    };
  }

  function getOffsets(offsets, width, height) {
    var ref = (offsets || '').split(' ');
    var x = ref[0];
    var y = ref[1];
    return {
      x: x ? toFloat(x) * (endsWith(x, '%') ? width / 100 : 1) : 0,
      y: y ? toFloat(y) * (endsWith(y, '%') ? height / 100 : 1) : 0
    };
  }

  function flipPosition(pos) {
    switch (pos) {
      case 'left':
        return 'right';

      case 'right':
        return 'left';

      case 'top':
        return 'bottom';

      case 'bottom':
        return 'top';

      default:
        return pos;
    }
  }

  function isInView(element, topOffset, leftOffset) {
    if (topOffset === void 0) topOffset = 0;
    if (leftOffset === void 0) leftOffset = 0;

    if (!isVisible(element)) {
      return false;
    }

    element = toNode(element);
    var win = window$1(element);
    var client = element.getBoundingClientRect();
    var bounding = {
      top: -topOffset,
      left: -leftOffset,
      bottom: topOffset + height(win),
      right: leftOffset + width(win)
    };
    return intersectRect(client, bounding) || pointInRect({
      x: client.left,
      y: client.top
    }, bounding);
  }

  function scrolledOver(element, heightOffset) {
    if (heightOffset === void 0) heightOffset = 0;

    if (!isVisible(element)) {
      return 0;
    }

    element = toNode(element);
    var win = window$1(element);
    var doc = document$1(element);
    var elHeight = element.offsetHeight + heightOffset;
    var ref = offsetPosition(element);
    var top = ref[0];
    var vp = height(win);
    var vh = vp + Math.min(0, top - vp);
    var diff = Math.max(0, vp - (height(doc) + heightOffset - (top + elHeight)));
    return clamp((vh + win.pageYOffset - top) / ((vh + (elHeight - (diff < vp ? diff : 0))) / 100) / 100);
  }

  function scrollTop(element, top) {
    element = toNode(element);

    if (isWindow(element) || isDocument(element)) {
      var ref = window$1(element);
      var scrollTo = ref.scrollTo;
      var pageXOffset = ref.pageXOffset;
      scrollTo(pageXOffset, top);
    } else {
      element.scrollTop = top;
    }
  }

  function offsetPosition(element) {
    var offset = [0, 0];

    do {
      offset[0] += element.offsetTop;
      offset[1] += element.offsetLeft;

      if (css(element, 'position') === 'fixed') {
        var win = window$1(element);
        offset[0] += win.pageYOffset;
        offset[1] += win.pageXOffset;
        return offset;
      }
    } while (element = element.offsetParent);

    return offset;
  }

  function window$1(element) {
    return isWindow(element) ? element : document$1(element).defaultView;
  }

  function document$1(element) {
    return toNode(element).ownerDocument;
  }

  function docEl(element) {
    return document$1(element).documentElement;
  }
  /*
      Based on:
      Copyright (c) 2016 Wilson Page wilsonpage@me.com
      https://github.com/wilsonpage/fastdom
  */


  var fastdom = {
    reads: [],
    writes: [],
    read: function read(task) {
      this.reads.push(task);
      scheduleFlush();
      return task;
    },
    write: function write(task) {
      this.writes.push(task);
      scheduleFlush();
      return task;
    },
    clear: function clear(task) {
      return remove$1(this.reads, task) || remove$1(this.writes, task);
    },
    flush: function flush() {
      runTasks(this.reads);
      runTasks(this.writes.splice(0, this.writes.length));
      this.scheduled = false;

      if (this.reads.length || this.writes.length) {
        scheduleFlush();
      }
    }
  };

  function scheduleFlush() {
    if (!fastdom.scheduled) {
      fastdom.scheduled = true;
      requestAnimationFrame(fastdom.flush.bind(fastdom));
    }
  }

  function runTasks(tasks) {
    var task;

    while (task = tasks.shift()) {
      task();
    }
  }

  function remove$1(array, item) {
    var index = array.indexOf(item);
    return !!~index && !!array.splice(index, 1);
  }

  function MouseTracker() {}

  MouseTracker.prototype = {
    positions: [],
    position: null,
    init: function init() {
      var this$1 = this;
      this.positions = [];
      this.position = null;
      var ticking = false;
      this.unbind = on(document, 'mousemove', function (e) {
        if (ticking) {
          return;
        }

        setTimeout(function () {
          var time = Date.now();
          var ref = this$1.positions;
          var length = ref.length;

          if (length && time - this$1.positions[length - 1].time > 100) {
            this$1.positions.splice(0, length);
          }

          this$1.positions.push({
            time: time,
            x: e.pageX,
            y: e.pageY
          });

          if (this$1.positions.length > 5) {
            this$1.positions.shift();
          }

          ticking = false;
        }, 5);
        ticking = true;
      });
    },
    cancel: function cancel() {
      if (this.unbind) {
        this.unbind();
      }
    },
    movesTo: function movesTo(target) {
      if (this.positions.length < 2) {
        return false;
      }

      var p = offset(target);
      var position$$1 = this.positions[this.positions.length - 1];
      var ref = this.positions;
      var prevPos = ref[0];

      if (p.left <= position$$1.x && position$$1.x <= p.right && p.top <= position$$1.y && position$$1.y <= p.bottom) {
        return false;
      }

      var points = [[{
        x: p.left,
        y: p.top
      }, {
        x: p.right,
        y: p.bottom
      }], [{
        x: p.right,
        y: p.top
      }, {
        x: p.left,
        y: p.bottom
      }]];
      if (p.right <= position$$1.x) ;else if (p.left >= position$$1.x) {
        points[0].reverse();
        points[1].reverse();
      } else if (p.bottom <= position$$1.y) {
        points[0].reverse();
      } else if (p.top >= position$$1.y) {
        points[1].reverse();
      }
      return !!points.reduce(function (result, point) {
        return result + (slope(prevPos, point[0]) < slope(position$$1, point[0]) && slope(prevPos, point[1]) > slope(position$$1, point[1]));
      }, 0);
    }
  };

  function slope(a, b) {
    return (b.y - a.y) / (b.x - a.x);
  }

  var strats = {};
  strats.events = strats.created = strats.beforeConnect = strats.connected = strats.beforeDisconnect = strats.disconnected = strats.destroy = concatStrat; // args strategy

  strats.args = function (parentVal, childVal) {
    return concatStrat(childVal || parentVal);
  }; // update strategy


  strats.update = function (parentVal, childVal) {
    return sortBy(concatStrat(parentVal, isFunction(childVal) ? {
      read: childVal
    } : childVal), 'order');
  }; // property strategy


  strats.props = function (parentVal, childVal) {
    if (isArray(childVal)) {
      childVal = childVal.reduce(function (value, key) {
        value[key] = String;
        return value;
      }, {});
    }

    return strats.methods(parentVal, childVal);
  }; // extend strategy


  strats.computed = strats.methods = function (parentVal, childVal) {
    return childVal ? parentVal ? assign({}, parentVal, childVal) : childVal : parentVal;
  }; // data strategy


  strats.data = function (parentVal, childVal, vm) {
    if (!vm) {
      if (!childVal) {
        return parentVal;
      }

      if (!parentVal) {
        return childVal;
      }

      return function (vm) {
        return mergeFnData(parentVal, childVal, vm);
      };
    }

    return mergeFnData(parentVal, childVal, vm);
  };

  function mergeFnData(parentVal, childVal, vm) {
    return strats.computed(isFunction(parentVal) ? parentVal.call(vm, vm) : parentVal, isFunction(childVal) ? childVal.call(vm, vm) : childVal);
  } // concat strategy


  function concatStrat(parentVal, childVal) {
    parentVal = parentVal && !isArray(parentVal) ? [parentVal] : parentVal;
    return childVal ? parentVal ? parentVal.concat(childVal) : isArray(childVal) ? childVal : [childVal] : parentVal;
  } // default strategy


  function defaultStrat(parentVal, childVal) {
    return isUndefined(childVal) ? parentVal : childVal;
  }

  function mergeOptions(parent, child, vm) {
    var options = {};

    if (isFunction(child)) {
      child = child.options;
    }

    if (child["extends"]) {
      parent = mergeOptions(parent, child["extends"], vm);
    }

    if (child.mixins) {
      for (var i = 0, l = child.mixins.length; i < l; i++) {
        parent = mergeOptions(parent, child.mixins[i], vm);
      }
    }

    for (var key in parent) {
      mergeKey(key);
    }

    for (var key$1 in child) {
      if (!hasOwn(parent, key$1)) {
        mergeKey(key$1);
      }
    }

    function mergeKey(key) {
      options[key] = (strats[key] || defaultStrat)(parent[key], child[key], vm);
    }

    return options;
  }

  function parseOptions(options, args) {
    var obj;
    if (args === void 0) args = [];

    try {
      return !options ? {} : startsWith(options, '{') ? JSON.parse(options) : args.length && !includes(options, ':') ? (obj = {}, obj[args[0]] = options, obj) : options.split(';').reduce(function (options, option) {
        var ref = option.split(/:(.*)/);
        var key = ref[0];
        var value = ref[1];

        if (key && !isUndefined(value)) {
          options[key.trim()] = value.trim();
        }

        return options;
      }, {});
    } catch (e) {
      return {};
    }
  }

  var id = 0;

  var Player = function Player(el) {
    this.id = ++id;
    this.el = toNode(el);
  };

  Player.prototype.isVideo = function () {
    return this.isYoutube() || this.isVimeo() || this.isHTML5();
  };

  Player.prototype.isHTML5 = function () {
    return this.el.tagName === 'VIDEO';
  };

  Player.prototype.isIFrame = function () {
    return this.el.tagName === 'IFRAME';
  };

  Player.prototype.isYoutube = function () {
    return this.isIFrame() && !!this.el.src.match(/\/\/.*?youtube(-nocookie)?\.[a-z]+\/(watch\?v=[^&\s]+|embed)|youtu\.be\/.*/);
  };

  Player.prototype.isVimeo = function () {
    return this.isIFrame() && !!this.el.src.match(/vimeo\.com\/video\/.*/);
  };

  Player.prototype.enableApi = function () {
    var this$1 = this;

    if (this.ready) {
      return this.ready;
    }

    var youtube = this.isYoutube();
    var vimeo = this.isVimeo();
    var poller;

    if (youtube || vimeo) {
      return this.ready = new Promise(function (resolve) {
        once(this$1.el, 'load', function () {
          if (youtube) {
            var listener = function listener() {
              return post(this$1.el, {
                event: 'listening',
                id: this$1.id
              });
            };

            poller = setInterval(listener, 100);
            listener();
          }
        });
        listen(function (data$$1) {
          return youtube && data$$1.id === this$1.id && data$$1.event === 'onReady' || vimeo && Number(data$$1.player_id) === this$1.id;
        }).then(function () {
          resolve();
          poller && clearInterval(poller);
        });
        attr(this$1.el, 'src', "" + this$1.el.src + (includes(this$1.el.src, '?') ? '&' : '?') + (youtube ? 'enablejsapi=1' : "api=1&player_id=" + this$1.id));
      });
    }

    return Promise.resolve();
  };

  Player.prototype.play = function () {
    var this$1 = this;

    if (!this.isVideo()) {
      return;
    }

    if (this.isIFrame()) {
      this.enableApi().then(function () {
        return post(this$1.el, {
          func: 'playVideo',
          method: 'play'
        });
      });
    } else if (this.isHTML5()) {
      try {
        var promise = this.el.play();

        if (promise) {
          promise["catch"](noop);
        }
      } catch (e) {}
    }
  };

  Player.prototype.pause = function () {
    var this$1 = this;

    if (!this.isVideo()) {
      return;
    }

    if (this.isIFrame()) {
      this.enableApi().then(function () {
        return post(this$1.el, {
          func: 'pauseVideo',
          method: 'pause'
        });
      });
    } else if (this.isHTML5()) {
      this.el.pause();
    }
  };

  Player.prototype.mute = function () {
    var this$1 = this;

    if (!this.isVideo()) {
      return;
    }

    if (this.isIFrame()) {
      this.enableApi().then(function () {
        return post(this$1.el, {
          func: 'mute',
          method: 'setVolume',
          value: 0
        });
      });
    } else if (this.isHTML5()) {
      this.el.muted = true;
      attr(this.el, 'muted', '');
    }
  };

  function post(el, cmd) {
    try {
      el.contentWindow.postMessage(JSON.stringify(assign({
        event: 'command'
      }, cmd)), '*');
    } catch (e) {}
  }

  function listen(cb) {
    return new Promise(function (resolve) {
      once(window, 'message', function (_, data$$1) {
        return resolve(data$$1);
      }, false, function (ref) {
        var data$$1 = ref.data;

        if (!data$$1 || !isString(data$$1)) {
          return;
        }

        try {
          data$$1 = JSON.parse(data$$1);
        } catch (e) {
          return;
        }

        return data$$1 && cb(data$$1);
      });
    });
  }

  var IntersectionObserver = 'IntersectionObserver' in window ? window.IntersectionObserver :
  /*@__PURE__*/
  function () {
    function IntersectionObserverClass(callback, ref) {
      var this$1 = this;
      if (ref === void 0) ref = {};
      var rootMargin = ref.rootMargin;
      if (rootMargin === void 0) rootMargin = '0 0';
      this.targets = [];
      var ref$1 = (rootMargin || '0 0').split(' ').map(toFloat);
      var offsetTop = ref$1[0];
      var offsetLeft = ref$1[1];
      this.offsetTop = offsetTop;
      this.offsetLeft = offsetLeft;
      var pending;

      this.apply = function () {
        if (pending) {
          return;
        }

        pending = requestAnimationFrame(function () {
          return setTimeout(function () {
            var records = this$1.takeRecords();

            if (records.length) {
              callback(records, this$1);
            }

            pending = false;
          });
        });
      };

      this.off = on(window, 'scroll resize load', this.apply, {
        passive: true,
        capture: true
      });
    }

    IntersectionObserverClass.prototype.takeRecords = function () {
      var this$1 = this;
      return this.targets.filter(function (entry) {
        var inView = isInView(entry.target, this$1.offsetTop, this$1.offsetLeft);

        if (entry.isIntersecting === null || inView ^ entry.isIntersecting) {
          entry.isIntersecting = inView;
          return true;
        }
      });
    };

    IntersectionObserverClass.prototype.observe = function (target) {
      this.targets.push({
        target: target,
        isIntersecting: null
      });
      this.apply();
    };

    IntersectionObserverClass.prototype.disconnect = function () {
      this.targets = [];
      this.off();
    };

    return IntersectionObserverClass;
  }();
  var touch = {},
      swipeTimeout,
      touching;
  on(document, pointerDown, function (e) {
    if (touch.el) {
      touch = {};
    }

    var target = e.target;
    var ref = getPos$1(e);
    var x = ref.x;
    var y = ref.y;
    touch.el = 'tagName' in target ? target : target.parentNode;
    touch.x = x;
    touch.y = y;
    touching = isTouch(e);
  });
  on(document, pointerUp, function (e) {
    var ref = getPos$1(e);
    var x = ref.x;
    var y = ref.y; // swipe

    if (touch.el && x && Math.abs(touch.x - x) > 100 || y && Math.abs(touch.y - y) > 100) {
      swipeTimeout = setTimeout(function () {
        if (touch.el) {
          trigger(touch.el, 'swipe');
          trigger(touch.el, "swipe" + swipeDirection(touch.x, touch.y, x, y));
        }

        touch = {};
      });
    } else {
      touch = {};
    }

    setTimeout(function () {
      return touching = false;
    });
  });
  on(document, pointerCancel, cancelAll);

  function isTouch(e) {
    return e.pointerType === 'touch' || e.touches || touching;
  }

  function getPos$1(e, prop) {
    if (prop === void 0) prop = 'client';
    var touches = e.touches;
    var changedTouches = e.changedTouches;
    var ref = touches && touches[0] || changedTouches && changedTouches[0] || e;
    var x = ref[prop + "X"];
    var y = ref[prop + "Y"];
    return {
      x: x,
      y: y
    };
  }

  function swipeDirection(x1, y1, x2, y2) {
    return Math.abs(x1 - x2) >= Math.abs(y1 - y2) ? x1 - x2 > 0 ? 'Left' : 'Right' : y1 - y2 > 0 ? 'Up' : 'Down';
  }

  function cancelAll() {
    swipeTimeout && clearTimeout(swipeTimeout);
    swipeTimeout = null;
    touch = {};
  }

  var util =
  /*#__PURE__*/
  Object.freeze({
    ajax: ajax,
    getImage: getImage,
    transition: transition,
    Transition: Transition,
    animate: animate,
    Animation: Animation,
    attr: attr,
    hasAttr: hasAttr,
    removeAttr: removeAttr,
    data: data,
    addClass: addClass,
    removeClass: removeClass,
    removeClasses: removeClasses,
    replaceClass: replaceClass,
    hasClass: hasClass,
    toggleClass: toggleClass,
    positionAt: _positionAt,
    offset: offset,
    position: position,
    height: height,
    width: width,
    boxModelAdjust: boxModelAdjust,
    flipPosition: flipPosition,
    isInView: isInView,
    scrolledOver: scrolledOver,
    scrollTop: scrollTop,
    offsetPosition: offsetPosition,
    ready: ready,
    index: _index,
    getIndex: _getIndex,
    empty: empty,
    html: html,
    prepend: prepend,
    append: append,
    before: before,
    after: after,
    remove: _remove,
    wrapAll: wrapAll,
    wrapInner: wrapInner,
    unwrap: unwrap,
    fragment: fragment,
    apply: apply,
    $: $,
    $$: $$,
    isIE: isIE,
    isRtl: isRtl,
    hasTouch: hasTouch,
    pointerDown: pointerDown,
    pointerMove: pointerMove,
    pointerUp: pointerUp,
    pointerEnter: pointerEnter,
    pointerLeave: pointerLeave,
    pointerCancel: pointerCancel,
    on: on,
    off: off,
    once: once,
    trigger: trigger,
    createEvent: createEvent,
    toEventTargets: toEventTargets,
    preventClick: preventClick,
    fastdom: fastdom,
    isVoidElement: isVoidElement,
    isVisible: isVisible,
    selInput: selInput,
    isInput: isInput,
    filter: filter,
    within: within,
    bind: bind,
    hasOwn: hasOwn,
    hyphenate: hyphenate,
    camelize: camelize,
    ucfirst: ucfirst,
    startsWith: startsWith,
    endsWith: endsWith,
    includes: includes,
    isArray: isArray,
    isFunction: isFunction,
    isObject: isObject,
    isPlainObject: isPlainObject,
    isWindow: isWindow,
    isDocument: isDocument,
    isJQuery: isJQuery,
    isNode: isNode,
    isNodeCollection: isNodeCollection,
    isBoolean: isBoolean,
    isString: isString,
    isNumber: isNumber,
    isNumeric: isNumeric,
    isUndefined: isUndefined,
    toBoolean: toBoolean,
    toNumber: toNumber,
    toFloat: toFloat,
    toNode: toNode,
    toNodes: toNodes,
    toList: toList,
    toMs: toMs,
    isEqual: isEqual,
    swap: swap,
    assign: assign,
    each: each,
    sortBy: sortBy,
    clamp: clamp,
    noop: noop,
    intersectRect: intersectRect,
    pointInRect: pointInRect,
    Dimensions: Dimensions,
    MouseTracker: MouseTracker,
    mergeOptions: mergeOptions,
    parseOptions: parseOptions,
    Player: Player,
    Promise: Promise,
    Deferred: Deferred,
    IntersectionObserver: IntersectionObserver,
    query: query,
    queryAll: queryAll,
    find: find,
    findAll: findAll,
    matches: matches,
    closest: closest,
    parents: parents,
    escape: escape,
    css: css,
    getStyles: getStyles,
    getStyle: getStyle,
    getCssVar: getCssVar,
    propName: propName,
    isTouch: isTouch,
    getPos: getPos$1
  });

  function componentAPI(UIkit) {
    var DATA = UIkit.data;
    var components = {};

    UIkit.component = function (name, options) {
      if (!options) {
        if (isPlainObject(components[name])) {
          components[name] = UIkit.extend(components[name]);
        }

        return components[name];
      }

      UIkit[name] = function (element, data$$1) {
        var i = arguments.length,
            argsArray = Array(i);

        while (i--) {
          argsArray[i] = arguments[i];
        }

        var component = UIkit.component(name);

        if (isPlainObject(element)) {
          return new component({
            data: element
          });
        }

        if (component.options.functional) {
          return new component({
            data: [].concat(argsArray)
          });
        }

        return element && element.nodeType ? init(element) : $$(element).map(init)[0];

        function init(element) {
          var instance = UIkit.getComponent(element, name);

          if (instance) {
            if (!data$$1) {
              return instance;
            } else {
              instance.$destroy();
            }
          }

          return new component({
            el: element,
            data: data$$1
          });
        }
      };

      var opt = isPlainObject(options) ? assign({}, options) : options.options;
      opt.name = name;

      if (opt.install) {
        opt.install(UIkit, opt, name);
      }

      if (UIkit._initialized && !opt.functional) {
        var id = hyphenate(name);
        fastdom.read(function () {
          return UIkit[name]("[uk-" + id + "],[data-uk-" + id + "]");
        });
      }

      return components[name] = isPlainObject(options) ? opt : options;
    };

    UIkit.getComponents = function (element) {
      return element && element[DATA] || {};
    };

    UIkit.getComponent = function (element, name) {
      return UIkit.getComponents(element)[name];
    };

    UIkit.connect = function (node) {
      if (node[DATA]) {
        for (var name in node[DATA]) {
          node[DATA][name]._callConnected();
        }
      }

      for (var i = 0; i < node.attributes.length; i++) {
        var name$1 = getComponentName(node.attributes[i].name);

        if (name$1 && name$1 in components) {
          UIkit[name$1](node);
        }
      }
    };

    UIkit.disconnect = function (node) {
      for (var name in node[DATA]) {
        node[DATA][name]._callDisconnected();
      }
    };
  }

  function getComponentName(attribute) {
    return startsWith(attribute, 'uk-') || startsWith(attribute, 'data-uk-') ? camelize(attribute.replace('data-uk-', '').replace('uk-', '')) : false;
  }

  function boot(UIkit) {
    var connect = UIkit.connect;
    var disconnect = UIkit.disconnect;

    if (!('MutationObserver' in window)) {
      return;
    }

    if (document.body) {
      init();
    } else {
      new MutationObserver(function () {
        if (document.body) {
          this.disconnect();
          init();
        }
      }).observe(document, {
        childList: true,
        subtree: true
      });
    }

    function init() {
      apply$$1(document.body, connect);
      fastdom.flush();
      new MutationObserver(function (mutations) {
        return mutations.forEach(applyMutation);
      }).observe(document, {
        childList: true,
        subtree: true,
        characterData: true,
        attributes: true
      });
      UIkit._initialized = true;
    }

    function applyMutation(mutation) {
      var target = mutation.target;
      var type = mutation.type;
      var update = type !== 'attributes' ? applyChildList(mutation) : applyAttribute(mutation);
      update && UIkit.update(target);
    }

    function applyAttribute(ref) {
      var target = ref.target;
      var attributeName = ref.attributeName;

      if (attributeName === 'href') {
        return true;
      }

      var name = getComponentName(attributeName);

      if (!name || !(name in UIkit)) {
        return;
      }

      if (hasAttr(target, attributeName)) {
        UIkit[name](target);
        return true;
      }

      var component = UIkit.getComponent(target, name);

      if (component) {
        component.$destroy();
        return true;
      }
    }

    function applyChildList(ref) {
      var addedNodes = ref.addedNodes;
      var removedNodes = ref.removedNodes;

      for (var i = 0; i < addedNodes.length; i++) {
        apply$$1(addedNodes[i], connect);
      }

      for (var i$1 = 0; i$1 < removedNodes.length; i$1++) {
        apply$$1(removedNodes[i$1], disconnect);
      }

      return true;
    }

    function apply$$1(node, fn) {
      if (node.nodeType !== 1 || hasAttr(node, 'uk-no-boot')) {
        return;
      }

      fn(node);
      node = node.firstElementChild;

      while (node) {
        var next = node.nextElementSibling;
        apply$$1(node, fn);
        node = next;
      }
    }
  }

  function globalAPI(UIkit) {
    var DATA = UIkit.data;

    UIkit.use = function (plugin) {
      if (plugin.installed) {
        return;
      }

      plugin.call(null, this);
      plugin.installed = true;
      return this;
    };

    UIkit.mixin = function (mixin, component) {
      component = (isString(component) ? UIkit.component(component) : component) || this;
      component.options = mergeOptions(component.options, mixin);
    };

    UIkit.extend = function (options) {
      options = options || {};
      var Super = this;

      var Sub = function UIkitComponent(options) {
        this._init(options);
      };

      Sub.prototype = Object.create(Super.prototype);
      Sub.prototype.constructor = Sub;
      Sub.options = mergeOptions(Super.options, options);
      Sub["super"] = Super;
      Sub.extend = Super.extend;
      return Sub;
    };

    UIkit.update = function (element, e) {
      element = element ? toNode(element) : document.body;
      path(element, function (element) {
        return update(element[DATA], e);
      });
      apply(element, function (element) {
        return update(element[DATA], e);
      });
    };

    var container;
    Object.defineProperty(UIkit, 'container', {
      get: function get() {
        return container || document.body;
      },
      set: function set(element) {
        container = $(element);
      }
    });

    function update(data$$1, e) {
      if (!data$$1) {
        return;
      }

      for (var name in data$$1) {
        if (data$$1[name]._connected) {
          data$$1[name]._callUpdate(e);
        }
      }
    }

    function path(node, fn) {
      if (node && node !== document.body && node.parentNode) {
        path(node.parentNode, fn);
        fn(node.parentNode);
      }
    }
  }

  function hooksAPI(UIkit) {
    UIkit.prototype._callHook = function (hook) {
      var this$1 = this;
      var handlers = this.$options[hook];

      if (handlers) {
        handlers.forEach(function (handler) {
          return handler.call(this$1);
        });
      }
    };

    UIkit.prototype._callConnected = function () {
      if (this._connected) {
        return;
      }

      this._data = {};
      this._computeds = {};

      this._initProps();

      this._callHook('beforeConnect');

      this._connected = true;

      this._initEvents();

      this._initObserver();

      this._callHook('connected');

      this._callUpdate();
    };

    UIkit.prototype._callDisconnected = function () {
      if (!this._connected) {
        return;
      }

      this._callHook('beforeDisconnect');

      if (this._observer) {
        this._observer.disconnect();

        this._observer = null;
      }

      this._unbindEvents();

      this._callHook('disconnected');

      this._connected = false;
    };

    UIkit.prototype._callUpdate = function (e) {
      var this$1 = this;
      if (e === void 0) e = 'update';
      var type = e.type || e;

      if (includes(['update', 'resize'], type)) {
        this._callWatches();
      }

      var updates = this.$options.update;
      var ref = this._frames;
      var reads = ref.reads;
      var writes = ref.writes;

      if (!updates) {
        return;
      }

      updates.forEach(function (ref, i) {
        var read = ref.read;
        var write = ref.write;
        var events = ref.events;

        if (type !== 'update' && !includes(events, type)) {
          return;
        }

        if (read && !includes(fastdom.reads, reads[i])) {
          reads[i] = fastdom.read(function () {
            var result = this$1._connected && read.call(this$1, this$1._data, type);

            if (result === false && write) {
              fastdom.clear(writes[i]);
            } else if (isPlainObject(result)) {
              assign(this$1._data, result);
            }
          });
        }

        if (write && !includes(fastdom.writes, writes[i])) {
          writes[i] = fastdom.write(function () {
            return this$1._connected && write.call(this$1, this$1._data, type);
          });
        }
      });
    };
  }

  function stateAPI(UIkit) {
    var uid = 0;

    UIkit.prototype._init = function (options) {
      options = options || {};
      options.data = normalizeData(options, this.constructor.options);
      this.$options = mergeOptions(this.constructor.options, options, this);
      this.$el = null;
      this.$props = {};
      this._frames = {
        reads: {},
        writes: {}
      };
      this._events = [];
      this._uid = uid++;

      this._initData();

      this._initMethods();

      this._initComputeds();

      this._callHook('created');

      if (options.el) {
        this.$mount(options.el);
      }
    };

    UIkit.prototype._initData = function () {
      var ref = this.$options;
      var data$$1 = ref.data;
      if (data$$1 === void 0) data$$1 = {};

      for (var key in data$$1) {
        this.$props[key] = this[key] = data$$1[key];
      }
    };

    UIkit.prototype._initMethods = function () {
      var ref = this.$options;
      var methods = ref.methods;

      if (methods) {
        for (var key in methods) {
          this[key] = bind(methods[key], this);
        }
      }
    };

    UIkit.prototype._initComputeds = function () {
      var ref = this.$options;
      var computed = ref.computed;
      this._computeds = {};

      if (computed) {
        for (var key in computed) {
          registerComputed(this, key, computed[key]);
        }
      }
    };

    UIkit.prototype._callWatches = function () {
      var ref = this;
      var computed = ref.$options.computed;
      var _computeds = ref._computeds;

      for (var key in _computeds) {
        var value = _computeds[key];
        delete _computeds[key];

        if (computed[key].watch && !isEqual(value, this[key])) {
          computed[key].watch.call(this, this[key], value);
        }
      }
    };

    UIkit.prototype._initProps = function (props) {
      var key;
      props = props || getProps(this.$options, this.$name);

      for (key in props) {
        if (!isUndefined(props[key])) {
          this.$props[key] = props[key];
        }
      }

      var exclude = [this.$options.computed, this.$options.methods];

      for (key in this.$props) {
        if (key in props && notIn(exclude, key)) {
          this[key] = this.$props[key];
        }
      }
    };

    UIkit.prototype._initEvents = function () {
      var this$1 = this;
      var ref = this.$options;
      var events = ref.events;

      if (events) {
        events.forEach(function (event) {
          if (!hasOwn(event, 'handler')) {
            for (var key in event) {
              registerEvent(this$1, event[key], key);
            }
          } else {
            registerEvent(this$1, event);
          }
        });
      }
    };

    UIkit.prototype._unbindEvents = function () {
      this._events.forEach(function (unbind) {
        return unbind();
      });

      this._events = [];
    };

    UIkit.prototype._initObserver = function () {
      var this$1 = this;
      var ref = this.$options;
      var attrs = ref.attrs;
      var props = ref.props;
      var el = ref.el;

      if (this._observer || !props || attrs === false) {
        return;
      }

      attrs = isArray(attrs) ? attrs : Object.keys(props);
      this._observer = new MutationObserver(function () {
        var data$$1 = getProps(this$1.$options, this$1.$name);

        if (attrs.some(function (key) {
          return !isUndefined(data$$1[key]) && data$$1[key] !== this$1.$props[key];
        })) {
          this$1.$reset();
        }
      });
      var filter$$1 = attrs.map(function (key) {
        return hyphenate(key);
      }).concat(this.$name);

      this._observer.observe(el, {
        attributes: true,
        attributeFilter: filter$$1.concat(filter$$1.map(function (key) {
          return "data-" + key;
        }))
      });
    };

    function getProps(opts, name) {
      var data$$1 = {};
      var args = opts.args;
      if (args === void 0) args = [];
      var props = opts.props;
      if (props === void 0) props = {};
      var el = opts.el;

      if (!props) {
        return data$$1;
      }

      for (var key in props) {
        var prop = hyphenate(key);
        var value = data(el, prop);

        if (!isUndefined(value)) {
          value = props[key] === Boolean && value === '' ? true : coerce(props[key], value);

          if (prop === 'target' && (!value || startsWith(value, '_'))) {
            continue;
          }

          data$$1[key] = value;
        }
      }

      var options = parseOptions(data(el, name), args);

      for (var key$1 in options) {
        var prop$1 = camelize(key$1);

        if (props[prop$1] !== undefined) {
          data$$1[prop$1] = coerce(props[prop$1], options[key$1]);
        }
      }

      return data$$1;
    }

    function registerComputed(component, key, cb) {
      Object.defineProperty(component, key, {
        enumerable: true,
        get: function get() {
          var _computeds = component._computeds;
          var $props = component.$props;
          var $el = component.$el;

          if (!hasOwn(_computeds, key)) {
            _computeds[key] = (cb.get || cb).call(component, $props, $el);
          }

          return _computeds[key];
        },
        set: function set(value) {
          var _computeds = component._computeds;
          _computeds[key] = cb.set ? cb.set.call(component, value) : value;

          if (isUndefined(_computeds[key])) {
            delete _computeds[key];
          }
        }
      });
    }

    function registerEvent(component, event, key) {
      if (!isPlainObject(event)) {
        event = {
          name: key,
          handler: event
        };
      }

      var name = event.name;
      var el = event.el;
      var handler = event.handler;
      var capture = event.capture;
      var passive = event.passive;
      var delegate = event.delegate;
      var filter$$1 = event.filter;
      var self = event.self;
      el = isFunction(el) ? el.call(component) : el || component.$el;

      if (isArray(el)) {
        el.forEach(function (el) {
          return registerEvent(component, assign({}, event, {
            el: el
          }), key);
        });
        return;
      }

      if (!el || filter$$1 && !filter$$1.call(component)) {
        return;
      }

      handler = detail(isString(handler) ? component[handler] : bind(handler, component));

      if (self) {
        handler = selfFilter(handler);
      }

      component._events.push(on(el, name, !delegate ? null : isString(delegate) ? delegate : delegate.call(component), handler, isBoolean(passive) ? {
        passive: passive,
        capture: capture
      } : capture));
    }

    function selfFilter(handler) {
      return function selfHandler(e) {
        if (e.target === e.currentTarget || e.target === e.current) {
          return handler.call(null, e);
        }
      };
    }

    function notIn(options, key) {
      return options.every(function (arr) {
        return !arr || !hasOwn(arr, key);
      });
    }

    function detail(listener) {
      return function (e) {
        return isArray(e.detail) ? listener.apply(void 0, [e].concat(e.detail)) : listener(e);
      };
    }

    function coerce(type, value) {
      if (type === Boolean) {
        return toBoolean(value);
      } else if (type === Number) {
        return toNumber(value);
      } else if (type === 'list') {
        return toList(value);
      }

      return type ? type(value) : value;
    }

    function normalizeData(ref, ref$1) {
      var data$$1 = ref.data;
      var el = ref.el;
      var args = ref$1.args;
      var props = ref$1.props;
      if (props === void 0) props = {};
      data$$1 = isArray(data$$1) ? args && args.length ? data$$1.slice(0, args.length).reduce(function (data$$1, value, index$$1) {
        if (isPlainObject(value)) {
          assign(data$$1, value);
        } else {
          data$$1[args[index$$1]] = value;
        }

        return data$$1;
      }, {}) : undefined : data$$1;

      if (data$$1) {
        for (var key in data$$1) {
          if (isUndefined(data$$1[key])) {
            delete data$$1[key];
          } else {
            data$$1[key] = props[key] ? coerce(props[key], data$$1[key], el) : data$$1[key];
          }
        }
      }

      return data$$1;
    }
  }

  function instanceAPI(UIkit) {
    var DATA = UIkit.data;

    UIkit.prototype.$mount = function (el) {
      var ref = this.$options;
      var name = ref.name;

      if (!el[DATA]) {
        el[DATA] = {};
      }

      if (el[DATA][name]) {
        return;
      }

      el[DATA][name] = this;
      this.$el = this.$options.el = this.$options.el || el;

      if (within(el, document)) {
        this._callConnected();
      }
    };

    UIkit.prototype.$emit = function (e) {
      this._callUpdate(e);
    };

    UIkit.prototype.$reset = function () {
      this._callDisconnected();

      this._callConnected();
    };

    UIkit.prototype.$destroy = function (removeEl) {
      if (removeEl === void 0) removeEl = false;
      var ref = this.$options;
      var el = ref.el;
      var name = ref.name;

      if (el) {
        this._callDisconnected();
      }

      this._callHook('destroy');

      if (!el || !el[DATA]) {
        return;
      }

      delete el[DATA][name];

      if (!Object.keys(el[DATA]).length) {
        delete el[DATA];
      }

      if (removeEl) {
        _remove(this.$el);
      }
    };

    UIkit.prototype.$create = function (component, element, data$$1) {
      return UIkit[component](element, data$$1);
    };

    UIkit.prototype.$update = UIkit.update;
    UIkit.prototype.$getComponent = UIkit.getComponent;
    var names = {};
    Object.defineProperties(UIkit.prototype, {
      $container: Object.getOwnPropertyDescriptor(UIkit, 'container'),
      $name: {
        get: function get() {
          var ref = this.$options;
          var name = ref.name;

          if (!names[name]) {
            names[name] = UIkit.prefix + hyphenate(name);
          }

          return names[name];
        }
      }
    });
  }

  var UIkit = function UIkit(options) {
    this._init(options);
  };

  UIkit.util = util;
  UIkit.data = '__uikit__';
  UIkit.prefix = 'uk-';
  UIkit.options = {};
  globalAPI(UIkit);
  hooksAPI(UIkit);
  stateAPI(UIkit);
  componentAPI(UIkit);
  instanceAPI(UIkit);
  var Class = {
    connected: function connected() {
      !hasClass(this.$el, this.$name) && addClass(this.$el, this.$name);
    }
  };
  var Togglable = {
    props: {
      cls: Boolean,
      animation: 'list',
      duration: Number,
      origin: String,
      transition: String,
      queued: Boolean
    },
    data: {
      cls: false,
      animation: [false],
      duration: 200,
      origin: false,
      transition: 'linear',
      queued: false,
      initProps: {
        overflow: '',
        height: '',
        paddingTop: '',
        paddingBottom: '',
        marginTop: '',
        marginBottom: ''
      },
      hideProps: {
        overflow: 'hidden',
        height: 0,
        paddingTop: 0,
        paddingBottom: 0,
        marginTop: 0,
        marginBottom: 0
      }
    },
    computed: {
      hasAnimation: function hasAnimation(ref) {
        var animation = ref.animation;
        return !!animation[0];
      },
      hasTransition: function hasTransition(ref) {
        var animation = ref.animation;
        return this.hasAnimation && animation[0] === true;
      }
    },
    methods: {
      toggleElement: function toggleElement(targets, show, animate$$1) {
        var this$1 = this;
        return new Promise(function (resolve) {
          targets = toNodes(targets);

          var all = function all(targets) {
            return Promise.all(targets.map(function (el) {
              return this$1._toggleElement(el, show, animate$$1);
            }));
          };

          var toggled = targets.filter(function (el) {
            return this$1.isToggled(el);
          });
          var untoggled = targets.filter(function (el) {
            return !includes(toggled, el);
          });
          var p;

          if (!this$1.queued || !isUndefined(animate$$1) || !isUndefined(show) || !this$1.hasAnimation || targets.length < 2) {
            p = all(untoggled.concat(toggled));
          } else {
            var body = document.body;
            var scroll = body.scrollTop;
            var el = toggled[0];
            var inProgress = Animation.inProgress(el) && hasClass(el, 'uk-animation-leave') || Transition.inProgress(el) && el.style.height === '0px';
            p = all(toggled);

            if (!inProgress) {
              p = p.then(function () {
                var p = all(untoggled);
                body.scrollTop = scroll;
                return p;
              });
            }
          }

          p.then(resolve, noop);
        });
      },
      toggleNow: function toggleNow(targets, show) {
        var this$1 = this;
        return new Promise(function (resolve) {
          return Promise.all(toNodes(targets).map(function (el) {
            return this$1._toggleElement(el, show, false);
          })).then(resolve, noop);
        });
      },
      isToggled: function isToggled(el) {
        var nodes = toNodes(el || this.$el);
        return this.cls ? hasClass(nodes, this.cls.split(' ')[0]) : !hasAttr(nodes, 'hidden');
      },
      updateAria: function updateAria(el) {
        if (this.cls === false) {
          attr(el, 'aria-hidden', !this.isToggled(el));
        }
      },
      _toggleElement: function _toggleElement(el, show, animate$$1) {
        var this$1 = this;
        show = isBoolean(show) ? show : Animation.inProgress(el) ? hasClass(el, 'uk-animation-leave') : Transition.inProgress(el) ? el.style.height === '0px' : !this.isToggled(el);

        if (!trigger(el, "before" + (show ? 'show' : 'hide'), [this])) {
          return Promise.reject();
        }

        var promise = (isFunction(animate$$1) ? animate$$1 : animate$$1 === false || !this.hasAnimation ? this._toggle : this.hasTransition ? toggleHeight(this) : toggleAnimation(this))(el, show);
        trigger(el, show ? 'show' : 'hide', [this]);

        var _final = function _final() {
          trigger(el, show ? 'shown' : 'hidden', [this$1]);
          this$1.$update(el);
        };

        return promise ? promise.then(_final) : Promise.resolve(_final());
      },
      _toggle: function _toggle(el, toggled) {
        if (!el) {
          return;
        }

        toggled = Boolean(toggled);
        var changed;

        if (this.cls) {
          changed = includes(this.cls, ' ') || toggled !== hasClass(el, this.cls);
          changed && toggleClass(el, this.cls, includes(this.cls, ' ') ? undefined : toggled);
        } else {
          changed = toggled === hasAttr(el, 'hidden');
          changed && attr(el, 'hidden', !toggled ? '' : null);
        }

        $$('[autofocus]', el).some(function (el) {
          return isVisible(el) ? el.focus() || true : el.blur();
        });
        this.updateAria(el);
        changed && this.$update(el);
      }
    }
  };

  function toggleHeight(ref) {
    var isToggled = ref.isToggled;
    var duration = ref.duration;
    var initProps = ref.initProps;
    var hideProps = ref.hideProps;
    var transition$$1 = ref.transition;
    var _toggle = ref._toggle;
    return function (el, show) {
      var inProgress = Transition.inProgress(el);
      var inner = el.hasChildNodes ? toFloat(css(el.firstElementChild, 'marginTop')) + toFloat(css(el.lastElementChild, 'marginBottom')) : 0;
      var currentHeight = isVisible(el) ? height(el) + (inProgress ? 0 : inner) : 0;
      Transition.cancel(el);

      if (!isToggled(el)) {
        _toggle(el, true);
      }

      height(el, ''); // Update child components first

      fastdom.flush();
      var endHeight = height(el) + (inProgress ? 0 : inner);
      height(el, currentHeight);
      return (show ? Transition.start(el, assign({}, initProps, {
        overflow: 'hidden',
        height: endHeight
      }), Math.round(duration * (1 - currentHeight / endHeight)), transition$$1) : Transition.start(el, hideProps, Math.round(duration * (currentHeight / endHeight)), transition$$1).then(function () {
        return _toggle(el, false);
      })).then(function () {
        return css(el, initProps);
      });
    };
  }

  function toggleAnimation(ref) {
    var animation = ref.animation;
    var duration = ref.duration;
    var origin = ref.origin;
    var _toggle = ref._toggle;
    return function (el, show) {
      Animation.cancel(el);

      if (show) {
        _toggle(el, true);

        return Animation["in"](el, animation[0], duration, origin);
      }

      return Animation.out(el, animation[1] || animation[0], duration, origin).then(function () {
        return _toggle(el, false);
      });
    };
  }

  var Accordion = {
    mixins: [Class, Togglable],
    props: {
      targets: String,
      active: null,
      collapsible: Boolean,
      multiple: Boolean,
      toggle: String,
      content: String,
      transition: String
    },
    data: {
      targets: '> *',
      active: false,
      animation: [true],
      collapsible: true,
      multiple: false,
      clsOpen: 'uk-open',
      toggle: '> .uk-accordion-title',
      content: '> .uk-accordion-content',
      transition: 'ease'
    },
    computed: {
      items: function items(ref, $el) {
        var targets = ref.targets;
        return $$(targets, $el);
      }
    },
    events: [{
      name: 'click',
      delegate: function delegate() {
        return this.targets + " " + this.$props.toggle;
      },
      handler: function handler(e) {
        e.preventDefault();
        this.toggle(_index($$(this.targets + " " + this.$props.toggle, this.$el), e.current));
      }
    }],
    connected: function connected() {
      if (this.active === false) {
        return;
      }

      var active = this.items[Number(this.active)];

      if (active && !hasClass(active, this.clsOpen)) {
        this.toggle(active, false);
      }
    },
    update: function update() {
      var this$1 = this;
      this.items.forEach(function (el) {
        return this$1._toggle($(this$1.content, el), hasClass(el, this$1.clsOpen));
      });
      var active = !this.collapsible && !hasClass(this.items, this.clsOpen) && this.items[0];

      if (active) {
        this.toggle(active, false);
      }
    },
    methods: {
      toggle: function toggle(item, animate$$1) {
        var this$1 = this;

        var index$$1 = _getIndex(item, this.items);

        var active = filter(this.items, "." + this.clsOpen);
        item = this.items[index$$1];
        item && [item].concat(!this.multiple && !includes(active, item) && active || []).forEach(function (el) {
          var isItem = el === item;
          var state = isItem && !hasClass(el, this$1.clsOpen);

          if (!state && isItem && !this$1.collapsible && active.length < 2) {
            return;
          }

          toggleClass(el, this$1.clsOpen, state);
          var content = el._wrapper ? el._wrapper.firstElementChild : $(this$1.content, el);

          if (!el._wrapper) {
            el._wrapper = wrapAll(content, '<div>');
            attr(el._wrapper, 'hidden', state ? '' : null);
          }

          this$1._toggle(content, true);

          this$1.toggleElement(el._wrapper, state, animate$$1).then(function () {
            if (hasClass(el, this$1.clsOpen) !== state) {
              return;
            }

            if (!state) {
              this$1._toggle(content, false);
            }

            el._wrapper = null;
            unwrap(content);
          });
        });
      }
    }
  };
  var Alert = {
    mixins: [Class, Togglable],
    args: 'animation',
    props: {
      close: String
    },
    data: {
      animation: [true],
      selClose: '.uk-alert-close',
      duration: 150,
      hideProps: assign({
        opacity: 0
      }, Togglable.data.hideProps)
    },
    events: [{
      name: 'click',
      delegate: function delegate() {
        return this.selClose;
      },
      handler: function handler(e) {
        e.preventDefault();
        this.close();
      }
    }],
    methods: {
      close: function close() {
        var this$1 = this;
        this.toggleElement(this.$el).then(function () {
          return this$1.$destroy(true);
        });
      }
    }
  };

  function Core(UIkit) {
    ready(function () {
      UIkit.update();
      on(window, 'load resize', function () {
        return UIkit.update(null, 'resize');
      });
      on(document, 'loadedmetadata load', function (ref) {
        var target = ref.target;
        return UIkit.update(target, 'resize');
      }, true); // throttle `scroll` event (Safari triggers multiple `scroll` events per frame)

      var pending;
      on(window, 'scroll', function (e) {
        if (pending) {
          return;
        }

        pending = true;
        fastdom.write(function () {
          return pending = false;
        });
        var target = e.target;
        UIkit.update(target.nodeType !== 1 ? document.body : target, e.type);
      }, {
        passive: true,
        capture: true
      });
      var started = 0;
      on(document, 'animationstart', function (ref) {
        var target = ref.target;

        if ((css(target, 'animationName') || '').match(/^uk-.*(left|right)/)) {
          started++;
          css(document.body, 'overflowX', 'hidden');
          setTimeout(function () {
            if (! --started) {
              css(document.body, 'overflowX', '');
            }
          }, toMs(css(target, 'animationDuration')) + 100);
        }
      }, true);
    });
  }

  var Video = {
    args: 'autoplay',
    props: {
      automute: Boolean,
      autoplay: Boolean
    },
    data: {
      automute: false,
      autoplay: true
    },
    computed: {
      inView: function inView(ref) {
        var autoplay = ref.autoplay;
        return autoplay === 'inview';
      }
    },
    connected: function connected() {
      if (this.inView && !hasAttr(this.$el, 'preload')) {
        this.$el.preload = 'none';
      }

      this.player = new Player(this.$el);

      if (this.automute) {
        this.player.mute();
      }
    },
    update: {
      read: function read() {
        return !this.player ? false : {
          visible: isVisible(this.$el) && css(this.$el, 'visibility') !== 'hidden',
          inView: this.inView && isInView(this.$el)
        };
      },
      write: function write(ref) {
        var visible = ref.visible;
        var inView = ref.inView;

        if (!visible || this.inView && !inView) {
          this.player.pause();
        } else if (this.autoplay === true || this.inView && inView) {
          this.player.play();
        }
      },
      events: ['resize', 'scroll']
    }
  };
  var Cover = {
    mixins: [Class, Video],
    props: {
      width: Number,
      height: Number
    },
    data: {
      automute: true
    },
    update: {
      read: function read() {
        var el = this.$el;

        if (!isVisible(el)) {
          return false;
        }

        var ref = el.parentNode;
        var height$$1 = ref.offsetHeight;
        var width$$1 = ref.offsetWidth;
        return {
          height: height$$1,
          width: width$$1
        };
      },
      write: function write(ref) {
        var height$$1 = ref.height;
        var width$$1 = ref.width;
        var el = this.$el;
        var elWidth = this.width || el.naturalWidth || el.videoWidth || el.clientWidth;
        var elHeight = this.height || el.naturalHeight || el.videoHeight || el.clientHeight;

        if (!elWidth || !elHeight) {
          return;
        }

        css(el, Dimensions.cover({
          width: elWidth,
          height: elHeight
        }, {
          width: width$$1 + (width$$1 % 2 ? 1 : 0),
          height: height$$1 + (height$$1 % 2 ? 1 : 0)
        }));
      },
      events: ['resize']
    }
  };
  var Position = {
    props: {
      pos: String,
      offset: null,
      flip: Boolean,
      clsPos: String
    },
    data: {
      pos: "bottom-" + (!isRtl ? 'left' : 'right'),
      flip: true,
      offset: false,
      clsPos: ''
    },
    computed: {
      pos: function pos(ref) {
        var pos = ref.pos;
        return (pos + (!includes(pos, '-') ? '-center' : '')).split('-');
      },
      dir: function dir() {
        return this.pos[0];
      },
      align: function align() {
        return this.pos[1];
      }
    },
    methods: {
      positionAt: function positionAt(element, target, boundary) {
        removeClasses(element, this.clsPos + "-(top|bottom|left|right)(-[a-z]+)?");
        css(element, {
          top: '',
          left: ''
        });
        var node;
        var ref = this;
        var offset$$1 = ref.offset;
        var axis = this.getAxis();

        if (!isNumeric(offset$$1)) {
          node = $(offset$$1);
          offset$$1 = node ? offset(node)[axis === 'x' ? 'left' : 'top'] - offset(target)[axis === 'x' ? 'right' : 'bottom'] : 0;
        }

        var ref$1 = _positionAt(element, target, axis === 'x' ? flipPosition(this.dir) + " " + this.align : this.align + " " + flipPosition(this.dir), axis === 'x' ? this.dir + " " + this.align : this.align + " " + this.dir, axis === 'x' ? "" + (this.dir === 'left' ? -offset$$1 : offset$$1) : " " + (this.dir === 'top' ? -offset$$1 : offset$$1), null, this.flip, boundary).target;

        var x = ref$1.x;
        var y = ref$1.y;
        this.dir = axis === 'x' ? x : y;
        this.align = axis === 'x' ? y : x;
        toggleClass(element, this.clsPos + "-" + this.dir + "-" + this.align, this.offset === false);
      },
      getAxis: function getAxis() {
        return this.dir === 'top' || this.dir === 'bottom' ? 'y' : 'x';
      }
    }
  };
  var active;
  var Drop = {
    mixins: [Position, Togglable],
    args: 'pos',
    props: {
      mode: 'list',
      toggle: Boolean,
      boundary: Boolean,
      boundaryAlign: Boolean,
      delayShow: Number,
      delayHide: Number,
      clsDrop: String
    },
    data: {
      mode: ['click', 'hover'],
      toggle: '- *',
      boundary: window,
      boundaryAlign: false,
      delayShow: 0,
      delayHide: 800,
      clsDrop: false,
      hoverIdle: 200,
      animation: ['uk-animation-fade'],
      cls: 'uk-open'
    },
    computed: {
      boundary: function boundary(ref, $el) {
        var boundary = ref.boundary;
        return query(boundary, $el);
      },
      clsDrop: function clsDrop(ref) {
        var clsDrop = ref.clsDrop;
        return clsDrop || "uk-" + this.$options.name;
      },
      clsPos: function clsPos() {
        return this.clsDrop;
      }
    },
    created: function created() {
      this.tracker = new MouseTracker();
    },
    connected: function connected() {
      addClass(this.$el, this.clsDrop);
      var ref = this.$props;
      var toggle = ref.toggle;
      this.toggle = toggle && this.$create('toggle', query(toggle, this.$el), {
        target: this.$el,
        mode: this.mode
      });
      !this.toggle && trigger(this.$el, 'updatearia');
    },
    events: [{
      name: 'click',
      delegate: function delegate() {
        return "." + this.clsDrop + "-close";
      },
      handler: function handler(e) {
        e.preventDefault();
        this.hide(false);
      }
    }, {
      name: 'click',
      delegate: function delegate() {
        return 'a[href^="#"]';
      },
      handler: function handler(e) {
        if (e.defaultPrevented) {
          return;
        }

        var id = e.target.hash;

        if (!id) {
          e.preventDefault();
        }

        if (!id || !within(id, this.$el)) {
          this.hide(false);
        }
      }
    }, {
      name: 'beforescroll',
      handler: function handler() {
        this.hide(false);
      }
    }, {
      name: 'toggle',
      self: true,
      handler: function handler(e, toggle) {
        e.preventDefault();

        if (this.isToggled()) {
          this.hide(false);
        } else {
          this.show(toggle, false);
        }
      }
    }, {
      name: pointerEnter,
      filter: function filter() {
        return includes(this.mode, 'hover');
      },
      handler: function handler(e) {
        if (isTouch(e)) {
          return;
        }

        if (active && active !== this && active.toggle && includes(active.toggle.mode, 'hover') && !within(e.target, active.toggle.$el) && !pointInRect({
          x: e.pageX,
          y: e.pageY
        }, offset(active.$el))) {
          active.hide(false);
        }

        e.preventDefault();
        this.show(this.toggle);
      }
    }, {
      name: 'toggleshow',
      handler: function handler(e, toggle) {
        if (toggle && !includes(toggle.target, this.$el)) {
          return;
        }

        e.preventDefault();
        this.show(toggle || this.toggle);
      }
    }, {
      name: "togglehide " + pointerLeave,
      handler: function handler(e, toggle) {
        if (isTouch(e) || toggle && !includes(toggle.target, this.$el)) {
          return;
        }

        e.preventDefault();

        if (this.toggle && includes(this.toggle.mode, 'hover')) {
          this.hide();
        }
      }
    }, {
      name: 'beforeshow',
      self: true,
      handler: function handler() {
        this.clearTimers();
        Animation.cancel(this.$el);
        this.position();
      }
    }, {
      name: 'show',
      self: true,
      handler: function handler() {
        this.tracker.init();
        trigger(this.$el, 'updatearia');
        registerEvent();
      }
    }, {
      name: 'beforehide',
      self: true,
      handler: function handler() {
        this.clearTimers();
      }
    }, {
      name: 'hide',
      handler: function handler(ref) {
        var target = ref.target;

        if (this.$el !== target) {
          active = active === null && within(target, this.$el) && this.isToggled() ? this : active;
          return;
        }

        active = this.isActive() ? null : active;
        trigger(this.$el, 'updatearia');
        this.tracker.cancel();
      }
    }, {
      name: 'updatearia',
      self: true,
      handler: function handler(e, toggle) {
        e.preventDefault();
        this.updateAria(this.$el);

        if (toggle || this.toggle) {
          attr((toggle || this.toggle).$el, 'aria-expanded', this.isToggled() ? 'true' : 'false');
          toggleClass(this.toggle.$el, this.cls, this.isToggled());
        }
      }
    }],
    update: {
      write: function write() {
        if (this.isToggled() && !Animation.inProgress(this.$el)) {
          this.position();
        }
      },
      events: ['resize']
    },
    methods: {
      show: function show(toggle, delay) {
        var this$1 = this;
        if (delay === void 0) delay = true;

        var show = function show() {
          return !this$1.isToggled() && this$1.toggleElement(this$1.$el, true);
        };

        var tryShow = function tryShow() {
          this$1.toggle = toggle || this$1.toggle;
          this$1.clearTimers();

          if (this$1.isActive()) {
            return;
          } else if (delay && active && active !== this$1 && active.isDelaying) {
            this$1.showTimer = setTimeout(this$1.show, 10);
            return;
          } else if (this$1.isParentOf(active)) {
            if (active.hideTimer) {
              active.hide(false);
            } else {
              return;
            }
          } else if (active && this$1.isChildOf(active)) {
            active.clearTimers();
          } else if (active && !this$1.isChildOf(active) && !this$1.isParentOf(active)) {
            var prev;

            while (active && active !== prev && !this$1.isChildOf(active)) {
              prev = active;
              active.hide(false);
            }
          }

          if (delay && this$1.delayShow) {
            this$1.showTimer = setTimeout(show, this$1.delayShow);
          } else {
            show();
          }

          active = this$1;
        };

        if (toggle && this.toggle && toggle.$el !== this.toggle.$el) {
          once(this.$el, 'hide', tryShow);
          this.hide(false);
        } else {
          tryShow();
        }
      },
      hide: function hide(delay) {
        var this$1 = this;
        if (delay === void 0) delay = true;

        var hide = function hide() {
          return this$1.toggleNow(this$1.$el, false);
        };

        this.clearTimers();
        this.isDelaying = this.tracker.movesTo(this.$el);

        if (delay && this.isDelaying) {
          this.hideTimer = setTimeout(this.hide, this.hoverIdle);
        } else if (delay && this.delayHide) {
          this.hideTimer = setTimeout(hide, this.delayHide);
        } else {
          hide();
        }
      },
      clearTimers: function clearTimers() {
        clearTimeout(this.showTimer);
        clearTimeout(this.hideTimer);
        this.showTimer = null;
        this.hideTimer = null;
        this.isDelaying = false;
      },
      isActive: function isActive() {
        return active === this;
      },
      isChildOf: function isChildOf(drop) {
        return drop && drop !== this && within(this.$el, drop.$el);
      },
      isParentOf: function isParentOf(drop) {
        return drop && drop !== this && within(drop.$el, this.$el);
      },
      position: function position() {
        removeClasses(this.$el, this.clsDrop + "-(stack|boundary)");
        css(this.$el, {
          top: '',
          left: '',
          display: 'block'
        });
        toggleClass(this.$el, this.clsDrop + "-boundary", this.boundaryAlign);
        var boundary = offset(this.boundary);
        var alignTo = this.boundaryAlign ? boundary : offset(this.toggle.$el);

        if (this.align === 'justify') {
          var prop = this.getAxis() === 'y' ? 'width' : 'height';
          css(this.$el, prop, alignTo[prop]);
        } else if (this.$el.offsetWidth > Math.max(boundary.right - alignTo.left, alignTo.right - boundary.left)) {
          addClass(this.$el, this.clsDrop + "-stack");
        }

        this.positionAt(this.$el, this.boundaryAlign ? this.boundary : this.toggle.$el, this.boundary);
        css(this.$el, 'display', '');
      }
    }
  };
  var registered;

  function registerEvent() {
    if (registered) {
      return;
    }

    registered = true;
    on(document, pointerUp, function (ref) {
      var target = ref.target;
      var defaultPrevented = ref.defaultPrevented;
      var prev;

      if (defaultPrevented) {
        return;
      }

      while (active && active !== prev && !within(target, active.$el) && !(active.toggle && within(target, active.toggle.$el))) {
        prev = active;
        active.hide(false);
      }
    });
  }

  var Dropdown = {
    "extends": Drop
  };
  var FormCustom = {
    mixins: [Class],
    args: 'target',
    props: {
      target: Boolean
    },
    data: {
      target: false
    },
    computed: {
      input: function input(_, $el) {
        return $(selInput, $el);
      },
      state: function state() {
        return this.input.nextElementSibling;
      },
      target: function target(ref, $el) {
        var target = ref.target;
        return target && (target === true && this.input.parentNode === $el && this.input.nextElementSibling || query(target, $el));
      }
    },
    update: function update() {
      var ref = this;
      var target = ref.target;
      var input = ref.input;

      if (!target) {
        return;
      }

      var option;
      var prop = isInput(target) ? 'value' : 'textContent';
      var prev = target[prop];
      var value = input.files && input.files[0] ? input.files[0].name : matches(input, 'select') && (option = $$('option', input).filter(function (el) {
        return el.selected;
      })[0]) ? option.textContent : input.value;

      if (prev !== value) {
        target[prop] = value;
      }
    },
    events: {
      change: function change() {
        this.$emit();
      }
    }
  }; // Deprecated

  var Gif = {
    update: {
      read: function read(data$$1) {
        var inview = isInView(this.$el);

        if (!inview || data$$1.isInView === inview) {
          return false;
        }

        data$$1.isInView = inview;
      },
      write: function write() {
        this.$el.src = this.$el.src;
      },
      events: ['scroll', 'resize']
    }
  };
  var Margin = {
    props: {
      margin: String,
      firstColumn: Boolean
    },
    data: {
      margin: 'uk-margin-small-top',
      firstColumn: 'uk-first-column'
    },
    update: {
      read: function read(data$$1) {
        var items = this.$el.children;
        var rows = [[]];

        if (!items.length || !isVisible(this.$el)) {
          return data$$1.rows = rows;
        }

        data$$1.rows = getRows(items);
        data$$1.stacks = !data$$1.rows.some(function (row) {
          return row.length > 1;
        });
      },
      write: function write(ref) {
        var this$1 = this;
        var rows = ref.rows;
        rows.forEach(function (row, i) {
          return row.forEach(function (el, j) {
            toggleClass(el, this$1.margin, i !== 0);
            toggleClass(el, this$1.firstColumn, j === 0);
          });
        });
      },
      events: ['resize']
    }
  };

  function getRows(items) {
    var rows = [[]];

    for (var i = 0; i < items.length; i++) {
      var el = items[i];
      var dim = getOffset(el);

      if (!dim.height) {
        continue;
      }

      for (var j = rows.length - 1; j >= 0; j--) {
        var row = rows[j];

        if (!row[0]) {
          row.push(el);
          break;
        }

        var leftDim = void 0;

        if (row[0].offsetParent === el.offsetParent) {
          leftDim = getOffset(row[0]);
        } else {
          dim = getOffset(el, true);
          leftDim = getOffset(row[0], true);
        }

        if (dim.top >= leftDim.bottom - 1) {
          rows.push([el]);
          break;
        }

        if (dim.bottom > leftDim.top) {
          if (dim.left < leftDim.left && !isRtl) {
            row.unshift(el);
            break;
          }

          row.push(el);
          break;
        }

        if (j === 0) {
          rows.unshift([el]);
          break;
        }
      }
    }

    return rows;
  }

  function getOffset(element, offset$$1) {
    var assign$$1;
    if (offset$$1 === void 0) offset$$1 = false;
    var offsetTop = element.offsetTop;
    var offsetLeft = element.offsetLeft;
    var offsetHeight = element.offsetHeight;

    if (offset$$1) {
      assign$$1 = offsetPosition(element), offsetTop = assign$$1[0], offsetLeft = assign$$1[1];
    }

    return {
      top: offsetTop,
      left: offsetLeft,
      height: offsetHeight,
      bottom: offsetTop + offsetHeight
    };
  }

  var Grid = {
    "extends": Margin,
    mixins: [Class],
    name: 'grid',
    props: {
      masonry: Boolean,
      parallax: Number
    },
    data: {
      margin: 'uk-grid-margin',
      clsStack: 'uk-grid-stack',
      masonry: false,
      parallax: 0
    },
    computed: {
      length: function length(_, $el) {
        return $el.children.length;
      },
      parallax: function parallax(ref) {
        var parallax = ref.parallax;
        return parallax && this.length ? Math.abs(parallax) : '';
      }
    },
    connected: function connected() {
      this.masonry && addClass(this.$el, 'uk-flex-top uk-flex-wrap-top');
    },
    update: [{
      read: function read(ref) {
        var rows = ref.rows;

        if (this.masonry || this.parallax) {
          rows = rows.map(function (elements) {
            return sortBy(elements, 'offsetLeft');
          });

          if (isRtl) {
            rows.map(function (row) {
              return row.reverse();
            });
          }
        }

        var transitionInProgress = rows.some(function (elements) {
          return elements.some(Transition.inProgress);
        });
        var translates = false;
        var elHeight = '';

        if (this.masonry && this.length) {
          var height$$1 = 0;
          translates = rows.reduce(function (translates, row, i) {
            translates[i] = row.map(function (_, j) {
              return i === 0 ? 0 : toFloat(translates[i - 1][j]) + (height$$1 - toFloat(rows[i - 1][j] && rows[i - 1][j].offsetHeight));
            });
            height$$1 = row.reduce(function (height$$1, el) {
              return Math.max(height$$1, el.offsetHeight);
            }, 0);
            return translates;
          }, []);
          elHeight = maxColumnHeight(rows) + getMarginTop(this.$el, this.margin) * (rows.length - 1);
        }

        return {
          rows: rows,
          translates: translates,
          height: !transitionInProgress ? elHeight : false
        };
      },
      write: function write(ref) {
        var stacks = ref.stacks;
        var height$$1 = ref.height;
        toggleClass(this.$el, this.clsStack, stacks);
        css(this.$el, 'paddingBottom', this.parallax);
        height$$1 !== false && css(this.$el, 'height', height$$1);
      },
      events: ['resize']
    }, {
      read: function read(ref) {
        var height$$1 = ref.height;
        return {
          scrolled: this.parallax ? scrolledOver(this.$el, height$$1 ? height$$1 - height(this.$el) : 0) * this.parallax : false
        };
      },
      write: function write(ref) {
        var rows = ref.rows;
        var scrolled = ref.scrolled;
        var translates = ref.translates;

        if (scrolled === false && !translates) {
          return;
        }

        rows.forEach(function (row, i) {
          return row.forEach(function (el, j) {
            return css(el, 'transform', !scrolled && !translates ? '' : "translateY(" + ((translates && -translates[i][j]) + (scrolled ? j % 2 ? scrolled : scrolled / 8 : 0)) + "px)");
          });
        });
      },
      events: ['scroll', 'resize']
    }]
  };

  function getMarginTop(root, cls) {
    var nodes = toNodes(root.children);
    var ref = nodes.filter(function (el) {
      return hasClass(el, cls);
    });
    var node = ref[0];
    return toFloat(node ? css(node, 'marginTop') : css(nodes[0], 'paddingLeft'));
  }

  function maxColumnHeight(rows) {
    return Math.max.apply(Math, rows.reduce(function (sum, row) {
      row.forEach(function (el, i) {
        return sum[i] = (sum[i] || 0) + el.offsetHeight;
      });
      return sum;
    }, []));
  } // IE 11 fix (min-height on a flex container won't apply to its flex items)


  var FlexBug = isIE ? {
    data: {
      selMinHeight: false,
      forceHeight: false
    },
    computed: {
      elements: function elements(ref, $el) {
        var selMinHeight = ref.selMinHeight;
        return selMinHeight ? $$(selMinHeight, $el) : [$el];
      }
    },
    update: [{
      read: function read() {
        css(this.elements, 'height', '');
      },
      order: -5,
      events: ['resize']
    }, {
      write: function write() {
        var this$1 = this;
        this.elements.forEach(function (el) {
          var height$$1 = toFloat(css(el, 'minHeight'));

          if (height$$1 && (this$1.forceHeight || Math.round(height$$1 + boxModelAdjust('height', el, 'content-box')) >= el.offsetHeight)) {
            css(el, 'height', height$$1);
          }
        });
      },
      order: 5,
      events: ['resize']
    }]
  } : {};
  var HeightMatch = {
    mixins: [FlexBug],
    args: 'target',
    props: {
      target: String,
      row: Boolean
    },
    data: {
      target: '> *',
      row: true,
      forceHeight: true
    },
    computed: {
      elements: function elements(ref, $el) {
        var target = ref.target;
        return $$(target, $el);
      }
    },
    update: {
      read: function read() {
        return {
          rows: (this.row ? getRows(this.elements) : [this.elements]).map(match)
        };
      },
      write: function write(ref) {
        var rows = ref.rows;
        rows.forEach(function (ref) {
          var heights = ref.heights;
          var elements = ref.elements;
          return elements.forEach(function (el, i) {
            return css(el, 'minHeight', heights[i]);
          });
        });
      },
      events: ['resize']
    }
  };

  function match(elements) {
    var assign$$1;

    if (elements.length < 2) {
      return {
        heights: [''],
        elements: elements
      };
    }

    var ref = getHeights(elements);
    var heights = ref.heights;
    var max = ref.max;
    var hasMinHeight = elements.some(function (el) {
      return el.style.minHeight;
    });
    var hasShrunk = elements.some(function (el, i) {
      return !el.style.minHeight && heights[i] < max;
    });

    if (hasMinHeight && hasShrunk) {
      css(elements, 'minHeight', '');
      assign$$1 = getHeights(elements), heights = assign$$1.heights, max = assign$$1.max;
    }

    heights = elements.map(function (el, i) {
      return heights[i] === max && toFloat(el.style.minHeight).toFixed(2) !== max.toFixed(2) ? '' : max;
    });
    return {
      heights: heights,
      elements: elements
    };
  }

  function getHeights(elements) {
    var heights = elements.map(function (el) {
      return offset(el).height - boxModelAdjust('height', el, 'content-box');
    });
    var max = Math.max.apply(null, heights);
    return {
      heights: heights,
      max: max
    };
  }

  var HeightViewport = {
    mixins: [FlexBug],
    props: {
      expand: Boolean,
      offsetTop: Boolean,
      offsetBottom: Boolean,
      minHeight: Number
    },
    data: {
      expand: false,
      offsetTop: false,
      offsetBottom: false,
      minHeight: 0
    },
    update: {
      read: function read() {
        var minHeight = '';
        var box = boxModelAdjust('height', this.$el, 'content-box');

        if (this.expand) {
          minHeight = height(window) - (offsetHeight(document.documentElement) - offsetHeight(this.$el)) - box || '';
        } else {
          // on mobile devices (iOS and Android) window.innerHeight !== 100vh
          minHeight = 'calc(100vh';

          if (this.offsetTop) {
            var ref = offset(this.$el);
            var top = ref.top;
            minHeight += top < height(window) / 2 ? " - " + top + "px" : '';
          }

          if (this.offsetBottom === true) {
            minHeight += " - " + offsetHeight(this.$el.nextElementSibling) + "px";
          } else if (isNumeric(this.offsetBottom)) {
            minHeight += " - " + this.offsetBottom + "vh";
          } else if (this.offsetBottom && endsWith(this.offsetBottom, 'px')) {
            minHeight += " - " + toFloat(this.offsetBottom) + "px";
          } else if (isString(this.offsetBottom)) {
            minHeight += " - " + offsetHeight(query(this.offsetBottom, this.$el)) + "px";
          }

          minHeight += (box ? " - " + box + "px" : '') + ")";
        }

        return {
          minHeight: minHeight
        };
      },
      write: function write(ref) {
        var minHeight = ref.minHeight;
        css(this.$el, {
          minHeight: minHeight
        });

        if (this.minHeight && toFloat(css(this.$el, 'minHeight')) < this.minHeight) {
          css(this.$el, 'minHeight', this.minHeight);
        }
      },
      events: ['resize']
    }
  };

  function offsetHeight(el) {
    return el && el.offsetHeight || 0;
  }

  var svgs = {};
  var SVG = {
    args: 'src',
    props: {
      id: String,
      icon: String,
      src: String,
      style: String,
      width: Number,
      height: Number,
      ratio: Number,
      'class': String
    },
    data: {
      ratio: 1,
      id: false,
      exclude: ['ratio', 'src', 'icon'],
      'class': ''
    },
    connected: function connected() {
      var this$1 = this;
      var assign$$1;
      this["class"] += ' uk-svg';

      if (!this.icon && includes(this.src, '#')) {
        var parts = this.src.split('#');

        if (parts.length > 1) {
          assign$$1 = parts, this.src = assign$$1[0], this.icon = assign$$1[1];
        }
      }

      this.svg = this.getSvg().then(function (svg) {
        var el;

        if (isString(svg)) {
          if (this$1.icon && includes(svg, '<symbol')) {
            svg = parseSymbols(svg, this$1.icon) || svg;
          }

          el = $(svg.substr(svg.indexOf('<svg')));
        } else {
          el = svg.cloneNode(true);
        }

        if (!el) {
          return Promise.reject('SVG not found.');
        }

        var dimensions = attr(el, 'viewBox');

        if (dimensions) {
          dimensions = dimensions.split(' ');
          this$1.width = this$1.$props.width || dimensions[2];
          this$1.height = this$1.$props.height || dimensions[3];
        }

        this$1.width *= this$1.ratio;
        this$1.height *= this$1.ratio;

        for (var prop in this$1.$options.props) {
          if (this$1[prop] && !includes(this$1.exclude, prop)) {
            attr(el, prop, this$1[prop]);
          }
        }

        if (!this$1.id) {
          removeAttr(el, 'id');
        }

        if (this$1.width && !this$1.height) {
          removeAttr(el, 'height');
        }

        if (this$1.height && !this$1.width) {
          removeAttr(el, 'width');
        }

        var src = this$1.icon || this$1.src;
        attr(el, 'data-svg', src);
        var root = this$1.$el;

        if (isVoidElement(root) || root.tagName === 'CANVAS') {
          attr(root, {
            hidden: true,
            id: null
          });
          var next = root.nextElementSibling;

          if (src === attr(next, 'data-svg')) {
            el = next;
          } else {
            after(root, el);
          }
        } else {
          var last = root.lastElementChild;

          if (src === attr(last, 'data-svg')) {
            el = last;
          } else {
            append(root, el);
          }
        }

        this$1.svgEl = el;
        return el;
      }, noop);
    },
    disconnected: function disconnected() {
      var this$1 = this;

      if (isVoidElement(this.$el)) {
        attr(this.$el, {
          hidden: null,
          id: this.id || null
        });
      }

      if (this.svg) {
        this.svg.then(function (svg) {
          return (!this$1._connected || svg !== this$1.svgEl) && _remove(svg);
        }, noop);
      }

      this.svg = this.svgEl = null;
    },
    methods: {
      getSvg: function getSvg() {
        var this$1 = this;

        if (!this.src) {
          return Promise.reject();
        }

        if (svgs[this.src]) {
          return svgs[this.src];
        }

        svgs[this.src] = new Promise(function (resolve, reject) {
          if (startsWith(this$1.src, 'data:')) {
            resolve(decodeURIComponent(this$1.src.split(',')[1]));
          } else {
            ajax(this$1.src).then(function (xhr) {
              return resolve(xhr.response);
            }, function () {
              return reject('SVG not found.');
            });
          }
        });
        return svgs[this.src];
      }
    }
  };
  var symbolRe = /<symbol(.*?id=(['"])(.*?)\2[^]*?<\/)symbol>/g;
  var symbols = {};

  function parseSymbols(svg, icon) {
    if (!symbols[svg]) {
      symbols[svg] = {};
      var match;

      while (match = symbolRe.exec(svg)) {
        symbols[svg][match[3]] = "<svg xmlns=\"http://www.w3.org/2000/svg\"" + match[1] + "svg>";
      }

      symbolRe.lastIndex = 0;
    }

    return symbols[svg][icon];
  }

  var closeIcon = "<svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" xmlns=\"http://www.w3.org/2000/svg\"><line fill=\"none\" stroke=\"#000\" stroke-width=\"1.1\" x1=\"1\" y1=\"1\" x2=\"13\" y2=\"13\"/><line fill=\"none\" stroke=\"#000\" stroke-width=\"1.1\" x1=\"13\" y1=\"1\" x2=\"1\" y2=\"13\"/></svg>";
  var closeLarge = "<svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" xmlns=\"http://www.w3.org/2000/svg\"><line fill=\"none\" stroke=\"#000\" stroke-width=\"1.4\" x1=\"1\" y1=\"1\" x2=\"19\" y2=\"19\"/><line fill=\"none\" stroke=\"#000\" stroke-width=\"1.4\" x1=\"19\" y1=\"1\" x2=\"1\" y2=\"19\"/></svg>";
  var marker = "<svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" xmlns=\"http://www.w3.org/2000/svg\"><rect x=\"9\" y=\"4\" width=\"1\" height=\"11\"/><rect x=\"4\" y=\"9\" width=\"11\" height=\"1\"/></svg>";
  var navbarToggleIcon = "<svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" xmlns=\"http://www.w3.org/2000/svg\"><rect y=\"9\" width=\"20\" height=\"2\"/><rect y=\"3\" width=\"20\" height=\"2\"/><rect y=\"15\" width=\"20\" height=\"2\"/></svg>";
  var overlayIcon = "<svg width=\"40\" height=\"40\" viewBox=\"0 0 40 40\" xmlns=\"http://www.w3.org/2000/svg\"><rect x=\"19\" y=\"0\" width=\"1\" height=\"40\"/><rect x=\"0\" y=\"19\" width=\"40\" height=\"1\"/></svg>";
  var paginationNext = "<svg width=\"7\" height=\"12\" viewBox=\"0 0 7 12\" xmlns=\"http://www.w3.org/2000/svg\"><polyline fill=\"none\" stroke=\"#000\" stroke-width=\"1.2\" points=\"1 1 6 6 1 11\"/></svg>";
  var paginationPrevious = "<svg width=\"7\" height=\"12\" viewBox=\"0 0 7 12\" xmlns=\"http://www.w3.org/2000/svg\"><polyline fill=\"none\" stroke=\"#000\" stroke-width=\"1.2\" points=\"6 1 1 6 6 11\"/></svg>";
  var searchIcon = "<svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" xmlns=\"http://www.w3.org/2000/svg\"><circle fill=\"none\" stroke=\"#000\" stroke-width=\"1.1\" cx=\"9\" cy=\"9\" r=\"7\"/><path fill=\"none\" stroke=\"#000\" stroke-width=\"1.1\" d=\"M14,14 L18,18 L14,14 Z\"/></svg>";
  var searchLarge = "<svg width=\"40\" height=\"40\" viewBox=\"0 0 40 40\" xmlns=\"http://www.w3.org/2000/svg\"><circle fill=\"none\" stroke=\"#000\" stroke-width=\"1.8\" cx=\"17.5\" cy=\"17.5\" r=\"16.5\"/><line fill=\"none\" stroke=\"#000\" stroke-width=\"1.8\" x1=\"38\" y1=\"39\" x2=\"29\" y2=\"30\"/></svg>";
  var searchNavbar = "<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\"><circle fill=\"none\" stroke=\"#000\" stroke-width=\"1.1\" cx=\"10.5\" cy=\"10.5\" r=\"9.5\"/><line fill=\"none\" stroke=\"#000\" stroke-width=\"1.1\" x1=\"23\" y1=\"23\" x2=\"17\" y2=\"17\"/></svg>";
  var slidenavNext = "<svg width=\"14px\" height=\"24px\" viewBox=\"0 0 14 24\" xmlns=\"http://www.w3.org/2000/svg\"><polyline fill=\"none\" stroke=\"#000\" stroke-width=\"1.4\" points=\"1.225,23 12.775,12 1.225,1 \"/></svg>";
  var slidenavNextLarge = "<svg width=\"25px\" height=\"40px\" viewBox=\"0 0 25 40\" xmlns=\"http://www.w3.org/2000/svg\"><polyline fill=\"none\" stroke=\"#000\" stroke-width=\"2\" points=\"4.002,38.547 22.527,20.024 4,1.5 \"/></svg>";
  var slidenavPrevious = "<svg width=\"14px\" height=\"24px\" viewBox=\"0 0 14 24\" xmlns=\"http://www.w3.org/2000/svg\"><polyline fill=\"none\" stroke=\"#000\" stroke-width=\"1.4\" points=\"12.775,1 1.225,12 12.775,23 \"/></svg>";
  var slidenavPreviousLarge = "<svg width=\"25px\" height=\"40px\" viewBox=\"0 0 25 40\" xmlns=\"http://www.w3.org/2000/svg\"><polyline fill=\"none\" stroke=\"#000\" stroke-width=\"2\" points=\"20.527,1.5 2,20.024 20.525,38.547 \"/></svg>";
  var spinner = "<svg width=\"30\" height=\"30\" viewBox=\"0 0 30 30\" xmlns=\"http://www.w3.org/2000/svg\"><circle fill=\"none\" stroke=\"#000\" cx=\"15\" cy=\"15\" r=\"14\"/></svg>";
  var totop = "<svg width=\"18\" height=\"10\" viewBox=\"0 0 18 10\" xmlns=\"http://www.w3.org/2000/svg\"><polyline fill=\"none\" stroke=\"#000\" stroke-width=\"1.2\" points=\"1 9 9 1 17 9 \"/></svg>";
  var parsed = {};
  var icons = {
    spinner: spinner,
    totop: totop,
    marker: marker,
    'close-icon': closeIcon,
    'close-large': closeLarge,
    'navbar-toggle-icon': navbarToggleIcon,
    'overlay-icon': overlayIcon,
    'pagination-next': paginationNext,
    'pagination-previous': paginationPrevious,
    'search-icon': searchIcon,
    'search-large': searchLarge,
    'search-navbar': searchNavbar,
    'slidenav-next': slidenavNext,
    'slidenav-next-large': slidenavNextLarge,
    'slidenav-previous': slidenavPrevious,
    'slidenav-previous-large': slidenavPreviousLarge
  };
  var Icon = {
    install: install,
    attrs: ['icon', 'ratio'],
    mixins: [Class, SVG],
    args: 'icon',
    props: ['icon'],
    data: {
      exclude: ['id', 'style', 'class', 'src', 'icon', 'ratio']
    },
    isIcon: true,
    connected: function connected() {
      addClass(this.$el, 'uk-icon');
    },
    methods: {
      getSvg: function getSvg() {
        var icon = getIcon(applyRtl(this.icon));

        if (!icon) {
          return Promise.reject('Icon not found.');
        }

        return Promise.resolve(icon);
      }
    }
  };
  var IconComponent = {
    "extends": Icon,
    data: function data(vm) {
      return {
        icon: hyphenate(vm.constructor.options.name)
      };
    }
  };
  var Slidenav = {
    "extends": IconComponent,
    connected: function connected() {
      addClass(this.$el, 'uk-slidenav');
    },
    computed: {
      icon: function icon(ref, $el) {
        var icon = ref.icon;
        return hasClass($el, 'uk-slidenav-large') ? icon + "-large" : icon;
      }
    }
  };
  var Search = {
    "extends": IconComponent,
    computed: {
      icon: function icon(ref, $el) {
        var icon = ref.icon;
        return hasClass($el, 'uk-search-icon') && parents($el, '.uk-search-large').length ? 'search-large' : parents($el, '.uk-search-navbar').length ? 'search-navbar' : icon;
      }
    }
  };
  var Close = {
    "extends": IconComponent,
    computed: {
      icon: function icon() {
        return "close-" + (hasClass(this.$el, 'uk-close-large') ? 'large' : 'icon');
      }
    }
  };
  var Spinner = {
    "extends": IconComponent,
    connected: function connected() {
      var this$1 = this;
      this.svg.then(function (svg) {
        return this$1.ratio !== 1 && css($('circle', svg), 'strokeWidth', 1 / this$1.ratio);
      }, noop);
    }
  };

  function install(UIkit) {
    UIkit.icon.add = function (name, svg) {
      var obj;
      var added = isString(name) ? (obj = {}, obj[name] = svg, obj) : name;
      each(added, function (svg, name) {
        icons[name] = svg;
        delete parsed[name];
      });

      if (UIkit._initialized) {
        apply(document.body, function (el) {
          return each(UIkit.getComponents(el), function (cmp) {
            cmp.$options.isIcon && cmp.icon in added && cmp.$reset();
          });
        });
      }
    };
  }

  function getIcon(icon) {
    if (!icons[icon]) {
      return null;
    }

    if (!parsed[icon]) {
      parsed[icon] = $(icons[icon].trim());
    }

    return parsed[icon];
  }

  function applyRtl(icon) {
    return isRtl ? swap(swap(icon, 'left', 'right'), 'previous', 'next') : icon;
  }

  var Img = {
    props: {
      dataSrc: String,
      dataSrcset: Boolean,
      sizes: String,
      width: Number,
      height: Number,
      offsetTop: String,
      offsetLeft: String,
      target: String
    },
    data: {
      dataSrc: '',
      dataSrcset: false,
      sizes: false,
      width: false,
      height: false,
      offsetTop: '50vh',
      offsetLeft: 0,
      target: false
    },
    computed: {
      cacheKey: function cacheKey(ref) {
        var dataSrc = ref.dataSrc;
        return this.$name + "." + dataSrc;
      },
      width: function width(ref) {
        var width$$1 = ref.width;
        var dataWidth = ref.dataWidth;
        return width$$1 || dataWidth;
      },
      height: function height(ref) {
        var height$$1 = ref.height;
        var dataHeight = ref.dataHeight;
        return height$$1 || dataHeight;
      },
      sizes: function sizes(ref) {
        var sizes = ref.sizes;
        var dataSizes = ref.dataSizes;
        return sizes || dataSizes;
      },
      isImg: function isImg(_, $el) {
        return _isImg($el);
      },
      target: {
        get: function get(ref) {
          var target = ref.target;
          return [this.$el].concat(queryAll(target, this.$el));
        },
        watch: function watch() {
          this.observe();
        }
      },
      offsetTop: function offsetTop(ref) {
        var offsetTop = ref.offsetTop;
        return toPx(offsetTop, 'height');
      },
      offsetLeft: function offsetLeft(ref) {
        var offsetLeft = ref.offsetLeft;
        return toPx(offsetLeft, 'width');
      }
    },
    connected: function connected() {
      if (storage[this.cacheKey]) {
        setSrcAttrs(this.$el, storage[this.cacheKey] || this.dataSrc, this.dataSrcset, this.sizes);
      } else if (this.isImg && this.width && this.height) {
        setSrcAttrs(this.$el, getPlaceholderImage(this.width, this.height, this.sizes));
      }

      this.observer = new IntersectionObserver(this.load, {
        rootMargin: this.offsetTop + "px " + this.offsetLeft + "px"
      });
      requestAnimationFrame(this.observe);
    },
    disconnected: function disconnected() {
      this.observer.disconnect();
    },
    update: {
      read: function read(ref) {
        var this$1 = this;
        var image = ref.image;

        if (!image && document.readyState === 'complete') {
          this.load(this.observer.takeRecords());
        }

        if (this.isImg) {
          return false;
        }

        image && image.then(function (img) {
          return img && img.currentSrc !== '' && setSrcAttrs(this$1.$el, currentSrc(img));
        });
      },
      write: function write(data$$1) {
        if (this.dataSrcset && window.devicePixelRatio !== 1) {
          var bgSize = css(this.$el, 'backgroundSize');

          if (bgSize.match(/^(auto\s?)+$/) || toFloat(bgSize) === data$$1.bgSize) {
            data$$1.bgSize = getSourceSize(this.dataSrcset, this.sizes);
            css(this.$el, 'backgroundSize', data$$1.bgSize + "px");
          }
        }
      },
      events: ['resize']
    },
    methods: {
      load: function load(entries) {
        var this$1 = this;

        if (!entries.some(function (entry) {
          return entry.isIntersecting;
        })) {
          return;
        }

        this._data.image = getImage(this.dataSrc, this.dataSrcset, this.sizes).then(function (img) {
          setSrcAttrs(this$1.$el, currentSrc(img), img.srcset, img.sizes);
          storage[this$1.cacheKey] = currentSrc(img);
          return img;
        }, noop);
        this.observer.disconnect();
      },
      observe: function observe() {
        var this$1 = this;

        if (!this._data.image && this._connected) {
          this.target.forEach(function (el) {
            return this$1.observer.observe(el);
          });
        }
      }
    }
  };

  function setSrcAttrs(el, src, srcset, sizes) {
    if (_isImg(el)) {
      sizes && (el.sizes = sizes);
      srcset && (el.srcset = srcset);
      src && (el.src = src);
    } else if (src) {
      var change = !includes(el.style.backgroundImage, src);

      if (change) {
        css(el, 'backgroundImage', "url(" + escape(src) + ")");
        trigger(el, createEvent('load', false));
      }
    }
  }

  function getPlaceholderImage(width$$1, height$$1, sizes) {
    var assign$$1;

    if (sizes) {
      assign$$1 = Dimensions.ratio({
        width: width$$1,
        height: height$$1
      }, 'width', toPx(sizesToPixel(sizes))), width$$1 = assign$$1.width, height$$1 = assign$$1.height;
    }

    return "data:image/svg+xml;utf8,<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"" + width$$1 + "\" height=\"" + height$$1 + "\"></svg>";
  }

  var sizesRe = /\s*(.*?)\s*(\w+|calc\(.*?\))\s*(?:,|$)/g;

  function sizesToPixel(sizes) {
    var matches$$1;
    sizesRe.lastIndex = 0;

    while (matches$$1 = sizesRe.exec(sizes)) {
      if (!matches$$1[1] || window.matchMedia(matches$$1[1]).matches) {
        matches$$1 = evaluateSize(matches$$1[2]);
        break;
      }
    }

    return matches$$1 || '100vw';
  }

  var sizeRe = /\d+(?:\w+|%)/g;
  var additionRe = /[+-]?(\d+)/g;

  function evaluateSize(size) {
    return startsWith(size, 'calc') ? size.substring(5, size.length - 1).replace(sizeRe, function (size) {
      return toPx(size);
    }).replace(/ /g, '').match(additionRe).reduce(function (a, b) {
      return a + +b;
    }, 0) : size;
  }

  function toPx(value, property, element) {
    if (property === void 0) property = 'width';
    if (element === void 0) element = window;
    return isNumeric(value) ? +value : endsWith(value, 'vw') ? percent(element, 'width', value) : endsWith(value, 'vh') ? percent(element, 'height', value) : endsWith(value, '%') ? percent(element, property, value) : toFloat(value);
  }

  var srcSetRe = /\s+\d+w\s*(?:,|$)/g;

  function getSourceSize(srcset, sizes) {
    var srcSize = toPx(sizesToPixel(sizes));
    var descriptors = (srcset.match(srcSetRe) || []).map(toFloat).sort(function (a, b) {
      return a - b;
    });
    return descriptors.filter(function (size) {
      return size >= srcSize;
    })[0] || descriptors.pop() || '';
  }

  var dimensions = {
    height: height,
    width: width
  };

  function percent(element, property, value) {
    return dimensions[property](element) * toFloat(value) / 100;
  }

  function _isImg(el) {
    return el.tagName === 'IMG';
  }

  function currentSrc(el) {
    return el.currentSrc || el.src;
  }

  var key = '__test__';
  var storage; // workaround for Safari's private browsing mode and accessing sessionStorage in Blink

  try {
    storage = window.sessionStorage || {};
    storage[key] = 1;
    delete storage[key];
  } catch (e) {
    storage = {};
  }

  var Media = {
    props: {
      media: Boolean
    },
    data: {
      media: false
    },
    computed: {
      matchMedia: function matchMedia() {
        var media = toMedia(this.media);
        return !media || window.matchMedia(media).matches;
      }
    }
  };

  function toMedia(value) {
    if (isString(value)) {
      if (value[0] === '@') {
        var name = "breakpoint-" + value.substr(1);
        value = toFloat(getCssVar(name));
      } else if (isNaN(value)) {
        return value;
      }
    }

    return value && !isNaN(value) ? "(min-width: " + value + "px)" : false;
  }

  var Leader = {
    mixins: [Class, Media],
    props: {
      fill: String
    },
    data: {
      fill: '',
      clsWrapper: 'uk-leader-fill',
      clsHide: 'uk-leader-hide',
      attrFill: 'data-fill'
    },
    computed: {
      fill: function fill(ref) {
        var fill = ref.fill;
        return fill || getCssVar('leader-fill-content');
      }
    },
    connected: function connected() {
      var assign$$1;
      assign$$1 = wrapInner(this.$el, "<span class=\"" + this.clsWrapper + "\">"), this.wrapper = assign$$1[0];
    },
    disconnected: function disconnected() {
      unwrap(this.wrapper.childNodes);
    },
    update: {
      read: function read(ref) {
        var changed = ref.changed;
        var width$$1 = ref.width;
        var prev = width$$1;
        width$$1 = Math.floor(this.$el.offsetWidth / 2);
        return {
          width: width$$1,
          changed: changed || prev !== width$$1,
          hide: !this.matchMedia
        };
      },
      write: function write(data$$1) {
        toggleClass(this.wrapper, this.clsHide, data$$1.hide);

        if (data$$1.changed) {
          data$$1.changed = false;
          attr(this.wrapper, this.attrFill, new Array(data$$1.width).join(this.fill));
        }
      },
      events: ['resize']
    }
  };
  var Container = {
    props: {
      container: Boolean
    },
    data: {
      container: true
    },
    computed: {
      container: function container(ref) {
        var container = ref.container;
        return container === true && this.$container || container && $(container);
      }
    }
  };
  var active$1;
  var Modal = {
    mixins: [Class, Container, Togglable],
    props: {
      selPanel: String,
      selClose: String,
      escClose: Boolean,
      bgClose: Boolean,
      stack: Boolean
    },
    data: {
      cls: 'uk-open',
      escClose: true,
      bgClose: true,
      overlay: true,
      stack: false
    },
    computed: {
      panel: function panel(ref, $el) {
        var selPanel = ref.selPanel;
        return $(selPanel, $el);
      },
      transitionElement: function transitionElement() {
        return this.panel;
      },
      bgClose: function bgClose(ref) {
        var bgClose = ref.bgClose;
        return bgClose && this.panel;
      }
    },
    beforeDisconnect: function beforeDisconnect() {
      if (this.isToggled()) {
        this.toggleNow(this.$el, false);
      }
    },
    events: [{
      name: 'click',
      delegate: function delegate() {
        return this.selClose;
      },
      handler: function handler(e) {
        e.preventDefault();
        this.hide();
      }
    }, {
      name: 'toggle',
      self: true,
      handler: function handler(e) {
        if (e.defaultPrevented) {
          return;
        }

        e.preventDefault();
        this.toggle();
      }
    }, {
      name: 'beforeshow',
      self: true,
      handler: function handler(e) {
        var prev = active$1 && active$1 !== this && active$1;
        active$1 = this;

        if (prev) {
          if (this.stack) {
            this.prev = prev;
          } else {
            active$1 = prev;

            if (prev.isToggled()) {
              prev.hide().then(this.show);
            } else {
              once(prev.$el, 'beforeshow hidden', this.show, false, function (ref) {
                var target = ref.target;
                var type = ref.type;
                return type === 'hidden' && target === prev.$el;
              });
            }

            e.preventDefault();
          }

          return;
        }

        registerEvents();
      }
    }, {
      name: 'show',
      self: true,
      handler: function handler() {
        if (!hasClass(document.documentElement, this.clsPage)) {
          this.scrollbarWidth = width(window) - width(document);
          css(document.body, 'overflowY', this.scrollbarWidth && this.overlay ? 'scroll' : '');
        }

        addClass(document.documentElement, this.clsPage);
      }
    }, {
      name: 'hide',
      self: true,
      handler: function handler() {
        if (!active$1 || active$1 === this && !this.prev) {
          deregisterEvents();
        }
      }
    }, {
      name: 'hidden',
      self: true,
      handler: function handler() {
        var found;
        var ref = this;
        var prev = ref.prev;
        active$1 = active$1 && active$1 !== this && active$1 || prev;

        if (!active$1) {
          css(document.body, 'overflowY', '');
        } else {
          while (prev) {
            if (prev.clsPage === this.clsPage) {
              found = true;
              break;
            }

            prev = prev.prev;
          }
        }

        if (!found) {
          removeClass(document.documentElement, this.clsPage);
        }
      }
    }],
    methods: {
      toggle: function toggle() {
        return this.isToggled() ? this.hide() : this.show();
      },
      show: function show() {
        var this$1 = this;

        if (this.isToggled()) {
          return Promise.resolve();
        }

        if (this.container && this.$el.parentNode !== this.container) {
          append(this.container, this.$el);
          return new Promise(function (resolve) {
            return requestAnimationFrame(function () {
              return this$1.show().then(resolve);
            });
          });
        }

        return this.toggleElement(this.$el, true, animate$1(this));
      },
      hide: function hide() {
        return this.isToggled() ? this.toggleElement(this.$el, false, animate$1(this)) : Promise.resolve();
      },
      getActive: function getActive() {
        return active$1;
      }
    }
  };
  var events;

  function registerEvents() {
    if (events) {
      return;
    }

    events = [on(document, pointerUp, function (ref) {
      var target = ref.target;
      var defaultPrevented = ref.defaultPrevented;

      if (active$1 && active$1.bgClose && !defaultPrevented && (!active$1.overlay || within(target, active$1.$el)) && !within(target, active$1.panel)) {
        active$1.hide();
      }
    }), on(document, 'keydown', function (e) {
      if (e.keyCode === 27 && active$1 && active$1.escClose) {
        e.preventDefault();
        active$1.hide();
      }
    })];
  }

  function deregisterEvents() {
    events && events.forEach(function (unbind) {
      return unbind();
    });
    events = null;
  }

  function animate$1(ref) {
    var transitionElement = ref.transitionElement;
    var _toggle = ref._toggle;
    return function (el, show) {
      return new Promise(function (resolve, reject) {
        return once(el, 'show hide', function () {
          el._reject && el._reject();
          el._reject = reject;

          _toggle(el, show);

          if (toMs(css(transitionElement, 'transitionDuration'))) {
            once(transitionElement, 'transitionend', resolve, false, function (e) {
              return e.target === transitionElement;
            });
          } else {
            resolve();
          }
        });
      });
    };
  }

  var Modal$1 = {
    install: install$1,
    mixins: [Modal],
    data: {
      clsPage: 'uk-modal-page',
      selPanel: '.uk-modal-dialog',
      selClose: '.uk-modal-close, .uk-modal-close-default, .uk-modal-close-outside, .uk-modal-close-full'
    },
    events: [{
      name: 'show',
      self: true,
      handler: function handler() {
        if (hasClass(this.panel, 'uk-margin-auto-vertical')) {
          addClass(this.$el, 'uk-flex');
        } else {
          css(this.$el, 'display', 'block');
        }

        height(this.$el); // force reflow
      }
    }, {
      name: 'hidden',
      self: true,
      handler: function handler() {
        css(this.$el, 'display', '');
        removeClass(this.$el, 'uk-flex');
      }
    }]
  };

  function install$1(UIkit) {
    UIkit.modal.dialog = function (content, options) {
      var dialog = UIkit.modal(" <div class=\"uk-modal\"> <div class=\"uk-modal-dialog\">" + content + "</div> </div> ", options);
      dialog.show();
      on(dialog.$el, 'hidden', function (ref) {
        var target = ref.target;
        var currentTarget = ref.currentTarget;

        if (target === currentTarget) {
          Promise.resolve(function () {
            return dialog.$destroy(true);
          });
        }
      });
      return dialog;
    };

    UIkit.modal.alert = function (message, options) {
      options = assign({
        bgClose: false,
        escClose: false,
        labels: UIkit.modal.labels
      }, options);
      return new Promise(function (resolve) {
        return on(UIkit.modal.dialog(" <div class=\"uk-modal-body\">" + (isString(message) ? message : html(message)) + "</div> <div class=\"uk-modal-footer uk-text-right\"> <button class=\"uk-button uk-button-primary uk-modal-close\" autofocus>" + options.labels.ok + "</button> </div> ", options).$el, 'hide', resolve);
      });
    };

    UIkit.modal.confirm = function (message, options) {
      options = assign({
        bgClose: false,
        escClose: true,
        labels: UIkit.modal.labels
      }, options);
      return new Promise(function (resolve, reject) {
        var confirm = UIkit.modal.dialog(" <form> <div class=\"uk-modal-body\">" + (isString(message) ? message : html(message)) + "</div> <div class=\"uk-modal-footer uk-text-right\"> <button class=\"uk-button uk-button-default uk-modal-close\" type=\"button\">" + options.labels.cancel + "</button> <button class=\"uk-button uk-button-primary\" autofocus>" + options.labels.ok + "</button> </div> </form> ", options);
        var resolved = false;
        on(confirm.$el, 'submit', 'form', function (e) {
          e.preventDefault();
          resolve();
          resolved = true;
          confirm.hide();
        });
        on(confirm.$el, 'hide', function () {
          if (!resolved) {
            reject();
          }
        });
      });
    };

    UIkit.modal.prompt = function (message, value, options) {
      options = assign({
        bgClose: false,
        escClose: true,
        labels: UIkit.modal.labels
      }, options);
      return new Promise(function (resolve) {
        var prompt = UIkit.modal.dialog(" <form class=\"uk-form-stacked\"> <div class=\"uk-modal-body\"> <label>" + (isString(message) ? message : html(message)) + "</label> <input class=\"uk-input\" autofocus> </div> <div class=\"uk-modal-footer uk-text-right\"> <button class=\"uk-button uk-button-default uk-modal-close\" type=\"button\">" + options.labels.cancel + "</button> <button class=\"uk-button uk-button-primary\">" + options.labels.ok + "</button> </div> </form> ", options),
            input = $('input', prompt.$el);
        input.value = value;
        var resolved = false;
        on(prompt.$el, 'submit', 'form', function (e) {
          e.preventDefault();
          resolve(input.value);
          resolved = true;
          prompt.hide();
        });
        on(prompt.$el, 'hide', function () {
          if (!resolved) {
            resolve(null);
          }
        });
      });
    };

    UIkit.modal.labels = {
      ok: 'Ok',
      cancel: 'Cancel'
    };
  }

  var Nav = {
    "extends": Accordion,
    data: {
      targets: '> .uk-parent',
      toggle: '> a',
      content: '> ul'
    }
  };
  var Navbar = {
    mixins: [Class, FlexBug],
    props: {
      dropdown: String,
      mode: 'list',
      align: String,
      offset: Number,
      boundary: Boolean,
      boundaryAlign: Boolean,
      clsDrop: String,
      delayShow: Number,
      delayHide: Number,
      dropbar: Boolean,
      dropbarMode: String,
      dropbarAnchor: Boolean,
      duration: Number
    },
    data: {
      dropdown: '.uk-navbar-nav > li',
      align: !isRtl ? 'left' : 'right',
      clsDrop: 'uk-navbar-dropdown',
      mode: undefined,
      offset: undefined,
      delayShow: undefined,
      delayHide: undefined,
      boundaryAlign: undefined,
      flip: 'x',
      boundary: true,
      dropbar: false,
      dropbarMode: 'slide',
      dropbarAnchor: false,
      duration: 200,
      forceHeight: true,
      selMinHeight: '.uk-navbar-nav > li > a, .uk-navbar-item, .uk-navbar-toggle'
    },
    computed: {
      boundary: function boundary(ref, $el) {
        var boundary = ref.boundary;
        var boundaryAlign = ref.boundaryAlign;
        return boundary === true || boundaryAlign ? $el : boundary;
      },
      dropbarAnchor: function dropbarAnchor(ref, $el) {
        var dropbarAnchor = ref.dropbarAnchor;
        return query(dropbarAnchor, $el);
      },
      pos: function pos(ref) {
        var align = ref.align;
        return "bottom-" + align;
      },
      dropdowns: function dropdowns(ref, $el) {
        var dropdown = ref.dropdown;
        var clsDrop = ref.clsDrop;
        return $$(dropdown + " ." + clsDrop, $el);
      }
    },
    beforeConnect: function beforeConnect() {
      var ref = this.$props;
      var dropbar = ref.dropbar;
      this.dropbar = dropbar && (query(dropbar, this.$el) || $('+ .uk-navbar-dropbar', this.$el) || $('<div></div>'));

      if (this.dropbar) {
        addClass(this.dropbar, 'uk-navbar-dropbar');

        if (this.dropbarMode === 'slide') {
          addClass(this.dropbar, 'uk-navbar-dropbar-slide');
        }
      }
    },
    disconnected: function disconnected() {
      this.dropbar && _remove(this.dropbar);
    },
    update: function update() {
      var this$1 = this;
      this.$create('drop', this.dropdowns.filter(function (el) {
        return !this$1.getDropdown(el);
      }), assign({}, this.$props, {
        boundary: this.boundary,
        pos: this.pos,
        offset: this.dropbar || this.offset
      }));
    },
    events: [{
      name: 'mouseover',
      delegate: function delegate() {
        return this.dropdown;
      },
      handler: function handler(ref) {
        var current = ref.current;
        var active = this.getActive();

        if (active && active.toggle && !within(active.toggle.$el, current) && !active.tracker.movesTo(active.$el)) {
          active.hide(false);
        }
      }
    }, {
      name: 'mouseleave',
      el: function el() {
        return this.dropbar;
      },
      handler: function handler() {
        var active = this.getActive();

        if (active && !matches(this.dropbar, ':hover')) {
          active.hide();
        }
      }
    }, {
      name: 'beforeshow',
      capture: true,
      filter: function filter() {
        return this.dropbar;
      },
      handler: function handler() {
        if (!this.dropbar.parentNode) {
          after(this.dropbarAnchor || this.$el, this.dropbar);
        }
      }
    }, {
      name: 'show',
      capture: true,
      filter: function filter() {
        return this.dropbar;
      },
      handler: function handler(_, drop) {
        var $el = drop.$el;
        var dir = drop.dir;
        this.clsDrop && addClass($el, this.clsDrop + "-dropbar");

        if (dir === 'bottom') {
          this.transitionTo($el.offsetHeight + toFloat(css($el, 'marginTop')) + toFloat(css($el, 'marginBottom')), $el);
        }
      }
    }, {
      name: 'beforehide',
      filter: function filter() {
        return this.dropbar;
      },
      handler: function handler(e, ref) {
        var $el = ref.$el;
        var active = this.getActive();

        if (matches(this.dropbar, ':hover') && active && active.$el === $el) {
          e.preventDefault();
        }
      }
    }, {
      name: 'hide',
      filter: function filter() {
        return this.dropbar;
      },
      handler: function handler(_, ref) {
        var $el = ref.$el;
        var active = this.getActive();

        if (!active || active && active.$el === $el) {
          this.transitionTo(0);
        }
      }
    }],
    methods: {
      getActive: function getActive() {
        var ref = this.dropdowns.map(this.getDropdown).filter(function (drop) {
          return drop && drop.isActive();
        });
        var active = ref[0];
        return active && includes(active.mode, 'hover') && within(active.toggle.$el, this.$el) && active;
      },
      transitionTo: function transitionTo(newHeight, el) {
        var this$1 = this;
        var ref = this;
        var dropbar = ref.dropbar;
        var oldHeight = isVisible(dropbar) ? height(dropbar) : 0;
        el = oldHeight < newHeight && el;
        css(el, 'clip', "rect(0," + el.offsetWidth + "px," + oldHeight + "px,0)");
        height(dropbar, oldHeight);
        Transition.cancel([el, dropbar]);
        return Promise.all([Transition.start(dropbar, {
          height: newHeight
        }, this.duration), Transition.start(el, {
          clip: "rect(0," + el.offsetWidth + "px," + newHeight + "px,0)"
        }, this.duration)])["catch"](noop).then(function () {
          css(el, {
            clip: ''
          });
          this$1.$update(dropbar);
        });
      },
      getDropdown: function getDropdown(el) {
        return this.$getComponent(el, 'drop') || this.$getComponent(el, 'dropdown');
      }
    }
  };
  var Offcanvas = {
    mixins: [Modal],
    args: 'mode',
    props: {
      mode: String,
      flip: Boolean,
      overlay: Boolean
    },
    data: {
      mode: 'slide',
      flip: false,
      overlay: false,
      clsPage: 'uk-offcanvas-page',
      clsContainer: 'uk-offcanvas-container',
      selPanel: '.uk-offcanvas-bar',
      clsFlip: 'uk-offcanvas-flip',
      clsContainerAnimation: 'uk-offcanvas-container-animation',
      clsSidebarAnimation: 'uk-offcanvas-bar-animation',
      clsMode: 'uk-offcanvas',
      clsOverlay: 'uk-offcanvas-overlay',
      selClose: '.uk-offcanvas-close'
    },
    computed: {
      clsFlip: function clsFlip(ref) {
        var flip = ref.flip;
        var clsFlip = ref.clsFlip;
        return flip ? clsFlip : '';
      },
      clsOverlay: function clsOverlay(ref) {
        var overlay = ref.overlay;
        var clsOverlay = ref.clsOverlay;
        return overlay ? clsOverlay : '';
      },
      clsMode: function clsMode(ref) {
        var mode = ref.mode;
        var clsMode = ref.clsMode;
        return clsMode + "-" + mode;
      },
      clsSidebarAnimation: function clsSidebarAnimation(ref) {
        var mode = ref.mode;
        var clsSidebarAnimation = ref.clsSidebarAnimation;
        return mode === 'none' || mode === 'reveal' ? '' : clsSidebarAnimation;
      },
      clsContainerAnimation: function clsContainerAnimation(ref) {
        var mode = ref.mode;
        var clsContainerAnimation = ref.clsContainerAnimation;
        return mode !== 'push' && mode !== 'reveal' ? '' : clsContainerAnimation;
      },
      transitionElement: function transitionElement(ref) {
        var mode = ref.mode;
        return mode === 'reveal' ? this.panel.parentNode : this.panel;
      }
    },
    events: [{
      name: 'click',
      delegate: function delegate() {
        return 'a[href^="#"]';
      },
      handler: function handler(ref) {
        var current = ref.current;

        if (current.hash && $(current.hash, document.body)) {
          this.hide();
        }
      }
    }, {
      name: 'touchstart',
      el: function el() {
        return this.panel;
      },
      handler: function handler(ref) {
        var targetTouches = ref.targetTouches;

        if (targetTouches.length === 1) {
          this.clientY = targetTouches[0].clientY;
        }
      }
    }, {
      name: 'touchmove',
      self: true,
      passive: false,
      filter: function filter() {
        return this.overlay;
      },
      handler: function handler(e) {
        e.preventDefault();
      }
    }, {
      name: 'touchmove',
      passive: false,
      el: function el() {
        return this.panel;
      },
      handler: function handler(e) {
        if (e.targetTouches.length !== 1) {
          return;
        }

        var clientY = event.targetTouches[0].clientY - this.clientY;
        var ref = this.panel;
        var scrollTop$$1 = ref.scrollTop;
        var scrollHeight = ref.scrollHeight;
        var clientHeight = ref.clientHeight;

        if (clientHeight >= scrollHeight || scrollTop$$1 === 0 && clientY > 0 || scrollHeight - scrollTop$$1 <= clientHeight && clientY < 0) {
          e.preventDefault();
        }
      }
    }, {
      name: 'show',
      self: true,
      handler: function handler() {
        if (this.mode === 'reveal' && !hasClass(this.panel.parentNode, this.clsMode)) {
          wrapAll(this.panel, '<div>');
          addClass(this.panel.parentNode, this.clsMode);
        }

        css(document.documentElement, 'overflowY', this.overlay ? 'hidden' : '');
        addClass(document.body, this.clsContainer, this.clsFlip);
        css(this.$el, 'display', 'block');
        addClass(this.$el, this.clsOverlay);
        addClass(this.panel, this.clsSidebarAnimation, this.mode !== 'reveal' ? this.clsMode : '');
        height(document.body); // force reflow

        addClass(document.body, this.clsContainerAnimation);
        this.clsContainerAnimation && suppressUserScale();
      }
    }, {
      name: 'hide',
      self: true,
      handler: function handler() {
        removeClass(document.body, this.clsContainerAnimation);
        var active = this.getActive();

        if (this.mode === 'none' || active && active !== this && active !== this.prev) {
          trigger(this.panel, 'transitionend');
        }
      }
    }, {
      name: 'hidden',
      self: true,
      handler: function handler() {
        this.clsContainerAnimation && resumeUserScale();

        if (this.mode === 'reveal') {
          unwrap(this.panel);
        }

        removeClass(this.panel, this.clsSidebarAnimation, this.clsMode);
        removeClass(this.$el, this.clsOverlay);
        css(this.$el, 'display', '');
        removeClass(document.body, this.clsContainer, this.clsFlip);
        css(document.documentElement, 'overflowY', '');
      }
    }, {
      name: 'swipeLeft swipeRight',
      handler: function handler(e) {
        if (this.isToggled() && isTouch(e) && e.type === 'swipeLeft' ^ this.flip) {
          this.hide();
        }
      }
    }]
  }; // Chrome in responsive mode zooms page upon opening offcanvas

  function suppressUserScale() {
    getViewport().content += ',user-scalable=0';
  }

  function resumeUserScale() {
    var viewport = getViewport();
    viewport.content = viewport.content.replace(/,user-scalable=0$/, '');
  }

  function getViewport() {
    return $('meta[name="viewport"]', document.head) || append(document.head, '<meta name="viewport">');
  }

  var OverflowAuto = {
    mixins: [Class],
    props: {
      selContainer: String,
      selContent: String
    },
    data: {
      selContainer: '.uk-modal',
      selContent: '.uk-modal-dialog'
    },
    computed: {
      container: function container(ref, $el) {
        var selContainer = ref.selContainer;
        return closest($el, selContainer);
      },
      content: function content(ref, $el) {
        var selContent = ref.selContent;
        return closest($el, selContent);
      }
    },
    connected: function connected() {
      css(this.$el, 'minHeight', 150);
    },
    update: {
      read: function read() {
        if (!this.content || !this.container) {
          return false;
        }

        return {
          current: toFloat(css(this.$el, 'maxHeight')),
          max: Math.max(150, height(this.container) - (offset(this.content).height - height(this.$el)))
        };
      },
      write: function write(ref) {
        var current = ref.current;
        var max = ref.max;
        css(this.$el, 'maxHeight', max);

        if (Math.round(current) !== Math.round(max)) {
          trigger(this.$el, 'resize');
        }
      },
      events: ['resize']
    }
  };
  var Responsive = {
    props: ['width', 'height'],
    connected: function connected() {
      addClass(this.$el, 'uk-responsive-width');
    },
    update: {
      read: function read() {
        return isVisible(this.$el) && this.width && this.height ? {
          width: width(this.$el.parentNode),
          height: this.height
        } : false;
      },
      write: function write(dim) {
        height(this.$el, Dimensions.contain({
          height: this.height,
          width: this.width
        }, dim).height);
      },
      events: ['resize']
    }
  };
  var Scroll = {
    props: {
      duration: Number,
      offset: Number
    },
    data: {
      duration: 1000,
      offset: 0
    },
    methods: {
      scrollTo: function scrollTo(el) {
        var this$1 = this;
        el = el && $(el) || document.body;
        var docHeight = height(document);
        var winHeight = height(window);
        var target = offset(el).top - this.offset;

        if (target + winHeight > docHeight) {
          target = docHeight - winHeight;
        }

        if (!trigger(this.$el, 'beforescroll', [this, el])) {
          return;
        }

        var start = Date.now();
        var startY = window.pageYOffset;

        var step = function step() {
          var currentY = startY + (target - startY) * ease(clamp((Date.now() - start) / this$1.duration));
          scrollTop(window, currentY); // scroll more if we have not reached our destination

          if (currentY !== target) {
            requestAnimationFrame(step);
          } else {
            trigger(this$1.$el, 'scrolled', [this$1, el]);
          }
        };

        step();
      }
    },
    events: {
      click: function click(e) {
        if (e.defaultPrevented) {
          return;
        }

        e.preventDefault();
        this.scrollTo(escape(decodeURIComponent(this.$el.hash)).substr(1));
      }
    }
  };

  function ease(k) {
    return 0.5 * (1 - Math.cos(Math.PI * k));
  }

  var Scrollspy = {
    args: 'cls',
    props: {
      cls: 'list',
      target: String,
      hidden: Boolean,
      offsetTop: Number,
      offsetLeft: Number,
      repeat: Boolean,
      delay: Number
    },
    data: function data() {
      return {
        cls: [],
        target: false,
        hidden: true,
        offsetTop: 0,
        offsetLeft: 0,
        repeat: false,
        delay: 0,
        inViewClass: 'uk-scrollspy-inview'
      };
    },
    computed: {
      elements: function elements(ref, $el) {
        var target = ref.target;
        return target ? $$(target, $el) : [$el];
      }
    },
    update: [{
      write: function write() {
        if (this.hidden) {
          css(filter(this.elements, ":not(." + this.inViewClass + ")"), 'visibility', 'hidden');
        }
      }
    }, {
      read: function read(els) {
        var this$1 = this;

        if (!els.update) {
          return;
        }

        this.elements.forEach(function (el, i) {
          var elData = els[i];

          if (!elData || elData.el !== el) {
            var cls = data(el, 'uk-scrollspy-class');
            elData = {
              el: el,
              toggles: cls && cls.split(',') || this$1.cls
            };
          }

          elData.show = isInView(el, this$1.offsetTop, this$1.offsetLeft);
          els[i] = elData;
        });
      },
      write: function write(els) {
        var this$1 = this; // Let child components be applied at least once first

        if (!els.update) {
          this.$emit();
          return els.update = true;
        }

        this.elements.forEach(function (el, i) {
          var elData = els[i];
          var cls = elData.toggles[i] || elData.toggles[0];

          if (elData.show && !elData.inview && !elData.queued) {
            var show = function show() {
              css(el, 'visibility', '');
              addClass(el, this$1.inViewClass);
              toggleClass(el, cls);
              trigger(el, 'inview');
              this$1.$update(el);
              elData.inview = true;
              elData.abort && elData.abort();
            };

            if (this$1.delay) {
              elData.queued = true;
              els.promise = (els.promise || Promise.resolve()).then(function () {
                return !elData.inview && new Promise(function (resolve) {
                  var timer = setTimeout(function () {
                    show();
                    resolve();
                  }, els.promise || this$1.elements.length === 1 ? this$1.delay : 0);

                  elData.abort = function () {
                    clearTimeout(timer);
                    resolve();
                    elData.queued = false;
                  };
                });
              });
            } else {
              show();
            }
          } else if (!elData.show && (elData.inview || elData.queued) && this$1.repeat) {
            elData.abort && elData.abort();

            if (!elData.inview) {
              return;
            }

            css(el, 'visibility', this$1.hidden ? 'hidden' : '');
            removeClass(el, this$1.inViewClass);
            toggleClass(el, cls);
            trigger(el, 'outview');
            this$1.$update(el);
            elData.inview = false;
          }
        });
      },
      events: ['scroll', 'resize']
    }]
  };
  var ScrollspyNav = {
    props: {
      cls: String,
      closest: String,
      scroll: Boolean,
      overflow: Boolean,
      offset: Number
    },
    data: {
      cls: 'uk-active',
      closest: false,
      scroll: false,
      overflow: true,
      offset: 0
    },
    computed: {
      links: function links(_, $el) {
        return $$('a[href^="#"]', $el).filter(function (el) {
          return el.hash;
        });
      },
      elements: function elements(ref) {
        var selector = ref.closest;
        return closest(this.links, selector || '*');
      },
      targets: function targets() {
        return $$(this.links.map(function (el) {
          return el.hash;
        }).join(','));
      }
    },
    update: [{
      read: function read() {
        if (this.scroll) {
          this.$create('scroll', this.links, {
            offset: this.offset || 0
          });
        }
      }
    }, {
      read: function read(data$$1) {
        var this$1 = this;
        var scroll = window.pageYOffset + this.offset + 1;
        var max = height(document) - height(window) + this.offset;
        data$$1.active = false;
        this.targets.every(function (el, i) {
          var ref = offset(el);
          var top = ref.top;
          var last = i + 1 === this$1.targets.length;

          if (!this$1.overflow && (i === 0 && top > scroll || last && top + el.offsetTop < scroll)) {
            return false;
          }

          if (!last && offset(this$1.targets[i + 1]).top <= scroll) {
            return true;
          }

          if (scroll >= max) {
            for (var j = this$1.targets.length - 1; j > i; j--) {
              if (isInView(this$1.targets[j])) {
                el = this$1.targets[j];
                break;
              }
            }
          }

          return !(data$$1.active = $(filter(this$1.links, "[href=\"#" + el.id + "\"]")));
        });
      },
      write: function write(ref) {
        var active = ref.active;
        this.links.forEach(function (el) {
          return el.blur();
        });
        removeClass(this.elements, this.cls);

        if (active) {
          trigger(this.$el, 'active', [active, addClass(this.closest ? closest(active, this.closest) : active, this.cls)]);
        }
      },
      events: ['scroll', 'resize']
    }]
  };
  var Sticky = {
    mixins: [Class, Media],
    props: {
      top: null,
      bottom: Boolean,
      offset: Number,
      animation: String,
      clsActive: String,
      clsInactive: String,
      clsFixed: String,
      clsBelow: String,
      selTarget: String,
      widthElement: Boolean,
      showOnUp: Boolean,
      targetOffset: Number
    },
    data: {
      top: 0,
      bottom: false,
      offset: 0,
      animation: '',
      clsActive: 'uk-active',
      clsInactive: '',
      clsFixed: 'uk-sticky-fixed',
      clsBelow: 'uk-sticky-below',
      selTarget: '',
      widthElement: false,
      showOnUp: false,
      targetOffset: false
    },
    computed: {
      selTarget: function selTarget(ref, $el) {
        var selTarget = ref.selTarget;
        return selTarget && $(selTarget, $el) || $el;
      },
      widthElement: function widthElement(ref, $el) {
        var widthElement = ref.widthElement;
        return query(widthElement, $el) || this.placeholder;
      },
      isActive: {
        get: function get() {
          return hasClass(this.selTarget, this.clsActive);
        },
        set: function set(value) {
          if (value && !this.isActive) {
            replaceClass(this.selTarget, this.clsInactive, this.clsActive);
            trigger(this.$el, 'active');
          } else if (!value && !hasClass(this.selTarget, this.clsInactive)) {
            replaceClass(this.selTarget, this.clsActive, this.clsInactive);
            trigger(this.$el, 'inactive');
          }
        }
      }
    },
    connected: function connected() {
      this.placeholder = $('+ .uk-sticky-placeholder', this.$el) || $('<div class="uk-sticky-placeholder"></div>');
      this.isFixed = false;
      this.isActive = false;
    },
    disconnected: function disconnected() {
      if (this.isFixed) {
        this.hide();
        removeClass(this.selTarget, this.clsInactive);
      }

      _remove(this.placeholder);

      this.placeholder = null;
      this.widthElement = null;
    },
    events: [{
      name: 'load hashchange popstate',
      el: window,
      handler: function handler() {
        var this$1 = this;

        if (!(this.targetOffset !== false && location.hash && window.pageYOffset > 0)) {
          return;
        }

        var target = $(location.hash);

        if (target) {
          fastdom.read(function () {
            var ref = offset(target);
            var top = ref.top;
            var elTop = offset(this$1.$el).top;
            var elHeight = this$1.$el.offsetHeight;

            if (this$1.isFixed && elTop + elHeight >= top && elTop <= top + target.offsetHeight) {
              scrollTop(window, top - elHeight - (isNumeric(this$1.targetOffset) ? this$1.targetOffset : 0) - this$1.offset);
            }
          });
        }
      }
    }],
    update: [{
      read: function read(ref, type) {
        var height$$1 = ref.height;

        if (this.isActive && type !== 'update') {
          this.hide();
          height$$1 = this.$el.offsetHeight;
          this.show();
        }

        height$$1 = !this.isActive ? this.$el.offsetHeight : height$$1;
        this.topOffset = offset(this.isFixed ? this.placeholder : this.$el).top;
        this.bottomOffset = this.topOffset + height$$1;
        var bottom = parseProp('bottom', this);
        this.top = Math.max(toFloat(parseProp('top', this)), this.topOffset) - this.offset;
        this.bottom = bottom && bottom - height$$1;
        this.inactive = !this.matchMedia;
        return {
          lastScroll: false,
          height: height$$1,
          margins: css(this.$el, ['marginTop', 'marginBottom', 'marginLeft', 'marginRight'])
        };
      },
      write: function write(ref) {
        var height$$1 = ref.height;
        var margins = ref.margins;
        var ref$1 = this;
        var placeholder = ref$1.placeholder;
        css(placeholder, assign({
          height: height$$1
        }, margins));

        if (!within(placeholder, document)) {
          after(this.$el, placeholder);
          attr(placeholder, 'hidden', '');
        } // ensure active/inactive classes are applied


        this.isActive = this.isActive;
      },
      events: ['resize']
    }, {
      read: function read(ref) {
        var scroll = ref.scroll;
        if (scroll === void 0) scroll = 0;
        this.width = (isVisible(this.widthElement) ? this.widthElement : this.$el).offsetWidth;
        this.scroll = window.pageYOffset;
        return {
          dir: scroll <= this.scroll ? 'down' : 'up',
          scroll: this.scroll,
          visible: isVisible(this.$el),
          top: offsetPosition(this.placeholder)[0]
        };
      },
      write: function write(data$$1, type) {
        var this$1 = this;
        var initTimestamp = data$$1.initTimestamp;
        if (initTimestamp === void 0) initTimestamp = 0;
        var dir = data$$1.dir;
        var lastDir = data$$1.lastDir;
        var lastScroll = data$$1.lastScroll;
        var scroll = data$$1.scroll;
        var top = data$$1.top;
        var visible = data$$1.visible;
        var now = performance.now();
        data$$1.lastScroll = scroll;

        if (scroll < 0 || scroll === lastScroll || !visible || this.disabled || this.showOnUp && type !== 'scroll') {
          return;
        }

        if (now - initTimestamp > 300 || dir !== lastDir) {
          data$$1.initScroll = scroll;
          data$$1.initTimestamp = now;
        }

        data$$1.lastDir = dir;

        if (this.showOnUp && Math.abs(data$$1.initScroll - scroll) <= 30 && Math.abs(lastScroll - scroll) <= 10) {
          return;
        }

        if (this.inactive || scroll < this.top || this.showOnUp && (scroll <= this.top || dir === 'down' || dir === 'up' && !this.isFixed && scroll <= this.bottomOffset)) {
          if (!this.isFixed) {
            if (Animation.inProgress(this.$el) && top > scroll) {
              Animation.cancel(this.$el);
              this.hide();
            }

            return;
          }

          this.isFixed = false;

          if (this.animation && scroll > this.topOffset) {
            Animation.cancel(this.$el);
            Animation.out(this.$el, this.animation).then(function () {
              return this$1.hide();
            }, noop);
          } else {
            this.hide();
          }
        } else if (this.isFixed) {
          this.update();
        } else if (this.animation) {
          Animation.cancel(this.$el);
          this.show();
          Animation["in"](this.$el, this.animation)["catch"](noop);
        } else {
          this.show();
        }
      },
      events: ['resize', 'scroll']
    }],
    methods: {
      show: function show() {
        this.isFixed = true;
        this.update();
        attr(this.placeholder, 'hidden', null);
      },
      hide: function hide() {
        this.isActive = false;
        removeClass(this.$el, this.clsFixed, this.clsBelow);
        css(this.$el, {
          position: '',
          top: '',
          width: ''
        });
        attr(this.placeholder, 'hidden', '');
      },
      update: function update() {
        var active = this.top !== 0 || this.scroll > this.top;
        var top = Math.max(0, this.offset);

        if (this.bottom && this.scroll > this.bottom - this.offset) {
          top = this.bottom - this.scroll;
        }

        css(this.$el, {
          position: 'fixed',
          top: top + "px",
          width: this.width
        });
        this.isActive = active;
        toggleClass(this.$el, this.clsBelow, this.scroll > this.bottomOffset);
        addClass(this.$el, this.clsFixed);
      }
    }
  };

  function parseProp(prop, ref) {
    var $props = ref.$props;
    var $el = ref.$el;
    var propOffset = ref[prop + "Offset"];
    var value = $props[prop];

    if (!value) {
      return;
    }

    if (isNumeric(value)) {
      return propOffset + toFloat(value);
    } else if (isString(value) && value.match(/^-?\d+vh$/)) {
      return height(window) * toFloat(value) / 100;
    } else {
      var el = value === true ? $el.parentNode : query(value, $el);

      if (el) {
        return offset(el).top + el.offsetHeight;
      }
    }
  }

  var Switcher = {
    mixins: [Togglable],
    args: 'connect',
    props: {
      connect: String,
      toggle: String,
      active: Number,
      swiping: Boolean
    },
    data: {
      connect: '~.uk-switcher',
      toggle: '> * > :first-child',
      active: 0,
      swiping: true,
      cls: 'uk-active',
      clsContainer: 'uk-switcher',
      attrItem: 'uk-switcher-item',
      queued: true
    },
    computed: {
      connects: function connects(ref, $el) {
        var connect = ref.connect;
        return queryAll(connect, $el);
      },
      toggles: function toggles(ref, $el) {
        var toggle = ref.toggle;
        return $$(toggle, $el);
      }
    },
    events: [{
      name: 'click',
      delegate: function delegate() {
        return this.toggle + ":not(.uk-disabled)";
      },
      handler: function handler(e) {
        e.preventDefault();
        this.show(toNodes(this.$el.children).filter(function (el) {
          return within(e.current, el);
        })[0]);
      }
    }, {
      name: 'click',
      el: function el() {
        return this.connects;
      },
      delegate: function delegate() {
        return "[" + this.attrItem + "],[data-" + this.attrItem + "]";
      },
      handler: function handler(e) {
        e.preventDefault();
        this.show(data(e.current, this.attrItem));
      }
    }, {
      name: 'swipeRight swipeLeft',
      filter: function filter() {
        return this.swiping;
      },
      el: function el() {
        return this.connects;
      },
      handler: function handler(e) {
        if (!isTouch(e)) {
          return;
        }

        e.preventDefault();

        if (!window.getSelection().toString()) {
          this.show(e.type === 'swipeLeft' ? 'next' : 'previous');
        }
      }
    }],
    update: function update() {
      var this$1 = this;
      this.connects.forEach(function (list) {
        return this$1.updateAria(list.children);
      });
      var ref = this.$el;
      var children = ref.children;
      this.show(filter(children, "." + this.cls)[0] || children[this.active] || children[0]);
    },
    methods: {
      index: function index() {
        return !!this.connects.length && _index(filter(this.connects[0].children, "." + this.cls)[0]);
      },
      show: function show(item) {
        var this$1 = this;
        var ref = this.$el;
        var children = ref.children;
        var length = children.length;
        var prev = this.index();
        var hasPrev = prev >= 0;
        var dir = item === 'previous' ? -1 : 1;

        var toggle,
            active,
            next = _getIndex(item, children, prev);

        for (var i = 0; i < length; i++, next = (next + dir + length) % length) {
          if (!matches(this.toggles[next], '.uk-disabled *, .uk-disabled, [disabled]')) {
            toggle = this.toggles[next];
            active = children[next];
            break;
          }
        }

        if (!active || prev >= 0 && hasClass(active, this.cls) || prev === next) {
          return;
        }

        removeClass(children, this.cls);
        addClass(active, this.cls);
        attr(this.toggles, 'aria-expanded', false);
        attr(toggle, 'aria-expanded', true);
        this.connects.forEach(function (list) {
          if (!hasPrev) {
            this$1.toggleNow(list.children[next]);
          } else {
            this$1.toggleElement([list.children[prev], list.children[next]]);
          }
        });
      }
    }
  };
  var Tab = {
    mixins: [Class],
    "extends": Switcher,
    props: {
      media: Boolean
    },
    data: {
      media: 960,
      attrItem: 'uk-tab-item'
    },
    connected: function connected() {
      var cls = hasClass(this.$el, 'uk-tab-left') ? 'uk-tab-left' : hasClass(this.$el, 'uk-tab-right') ? 'uk-tab-right' : false;

      if (cls) {
        this.$create('toggle', this.$el, {
          cls: cls,
          mode: 'media',
          media: this.media
        });
      }
    }
  };
  var Toggle = {
    mixins: [Media, Togglable],
    args: 'target',
    props: {
      href: String,
      target: null,
      mode: 'list'
    },
    data: {
      href: false,
      target: false,
      mode: 'click',
      queued: true
    },
    computed: {
      target: function target(ref, $el) {
        var href = ref.href;
        var target = ref.target;
        target = queryAll(target || href, $el);
        return target.length && target || [$el];
      }
    },
    connected: function connected() {
      trigger(this.target, 'updatearia', [this]);
    },
    events: [{
      name: pointerEnter + " " + pointerLeave,
      filter: function filter() {
        return includes(this.mode, 'hover');
      },
      handler: function handler(e) {
        if (!isTouch(e)) {
          this.toggle("toggle" + (e.type === pointerEnter ? 'show' : 'hide'));
        }
      }
    }, {
      name: 'click',
      filter: function filter() {
        return includes(this.mode, 'click') || hasTouch && includes(this.mode, 'hover');
      },
      handler: function handler(e) {
        if (!isTouch(e) && !includes(this.mode, 'click')) {
          return;
        } // TODO better isToggled handling


        var link;

        if (closest(e.target, 'a[href="#"], a[href=""], button') || (link = closest(e.target, 'a[href]')) && (this.cls || !isVisible(this.target) || link.hash && matches(this.target, link.hash))) {
          e.preventDefault();
        }

        this.toggle();
      }
    }],
    update: {
      write: function write() {
        if (!includes(this.mode, 'media') || !this.media) {
          return;
        }

        var toggled = this.isToggled(this.target);

        if (this.matchMedia ? !toggled : toggled) {
          this.toggle();
        }
      },
      events: ['resize']
    },
    methods: {
      toggle: function toggle(type) {
        if (trigger(this.target, type || 'toggle', [this])) {
          this.toggleElement(this.target);
        }
      }
    }
  };

  function core(UIkit) {
    // core components
    UIkit.component('accordion', Accordion);
    UIkit.component('alert', Alert);
    UIkit.component('cover', Cover);
    UIkit.component('drop', Drop);
    UIkit.component('dropdown', Dropdown);
    UIkit.component('formCustom', FormCustom);
    UIkit.component('gif', Gif);
    UIkit.component('grid', Grid);
    UIkit.component('heightMatch', HeightMatch);
    UIkit.component('heightViewport', HeightViewport);
    UIkit.component('icon', Icon);
    UIkit.component('img', Img);
    UIkit.component('leader', Leader);
    UIkit.component('margin', Margin);
    UIkit.component('modal', Modal$1);
    UIkit.component('nav', Nav);
    UIkit.component('navbar', Navbar);
    UIkit.component('offcanvas', Offcanvas);
    UIkit.component('overflowAuto', OverflowAuto);
    UIkit.component('responsive', Responsive);
    UIkit.component('scroll', Scroll);
    UIkit.component('scrollspy', Scrollspy);
    UIkit.component('scrollspyNav', ScrollspyNav);
    UIkit.component('sticky', Sticky);
    UIkit.component('svg', SVG);
    UIkit.component('switcher', Switcher);
    UIkit.component('tab', Tab);
    UIkit.component('toggle', Toggle);
    UIkit.component('video', Video); // Icon components

    UIkit.component('close', Close);
    UIkit.component('marker', IconComponent);
    UIkit.component('navbarToggleIcon', IconComponent);
    UIkit.component('overlayIcon', IconComponent);
    UIkit.component('paginationNext', IconComponent);
    UIkit.component('paginationPrevious', IconComponent);
    UIkit.component('searchIcon', Search);
    UIkit.component('slidenavNext', Slidenav);
    UIkit.component('slidenavPrevious', Slidenav);
    UIkit.component('spinner', Spinner);
    UIkit.component('totop', IconComponent); // core functionality

    UIkit.use(Core);
  }

  UIkit.version = '3.0.3';
  core(UIkit);
  var Countdown = {
    mixins: [Class],
    props: {
      date: String,
      clsWrapper: String
    },
    data: {
      date: '',
      clsWrapper: '.uk-countdown-%unit%'
    },
    computed: {
      date: function date(ref) {
        var date = ref.date;
        return Date.parse(date);
      },
      days: function days(ref, $el) {
        var clsWrapper = ref.clsWrapper;
        return $(clsWrapper.replace('%unit%', 'days'), $el);
      },
      hours: function hours(ref, $el) {
        var clsWrapper = ref.clsWrapper;
        return $(clsWrapper.replace('%unit%', 'hours'), $el);
      },
      minutes: function minutes(ref, $el) {
        var clsWrapper = ref.clsWrapper;
        return $(clsWrapper.replace('%unit%', 'minutes'), $el);
      },
      seconds: function seconds(ref, $el) {
        var clsWrapper = ref.clsWrapper;
        return $(clsWrapper.replace('%unit%', 'seconds'), $el);
      },
      units: function units() {
        var this$1 = this;
        return ['days', 'hours', 'minutes', 'seconds'].filter(function (unit) {
          return this$1[unit];
        });
      }
    },
    connected: function connected() {
      this.start();
    },
    disconnected: function disconnected() {
      var this$1 = this;
      this.stop();
      this.units.forEach(function (unit) {
        return empty(this$1[unit]);
      });
    },
    events: [{
      name: 'visibilitychange',
      el: document,
      handler: function handler() {
        if (document.hidden) {
          this.stop();
        } else {
          this.start();
        }
      }
    }],
    update: {
      write: function write() {
        var this$1 = this;
        var timespan = getTimeSpan(this.date);

        if (timespan.total <= 0) {
          this.stop();
          timespan.days = timespan.hours = timespan.minutes = timespan.seconds = 0;
        }

        this.units.forEach(function (unit) {
          var digits = String(Math.floor(timespan[unit]));
          digits = digits.length < 2 ? "0" + digits : digits;
          var el = this$1[unit];

          if (el.textContent !== digits) {
            digits = digits.split('');

            if (digits.length !== el.children.length) {
              html(el, digits.map(function () {
                return '<span></span>';
              }).join(''));
            }

            digits.forEach(function (digit, i) {
              return el.children[i].textContent = digit;
            });
          }
        });
      }
    },
    methods: {
      start: function start() {
        var this$1 = this;
        this.stop();

        if (this.date && this.units.length) {
          this.$emit();
          this.timer = setInterval(function () {
            return this$1.$emit();
          }, 1000);
        }
      },
      stop: function stop() {
        if (this.timer) {
          clearInterval(this.timer);
          this.timer = null;
        }
      }
    }
  };

  function getTimeSpan(date) {
    var total = date - Date.now();
    return {
      total: total,
      seconds: total / 1000 % 60,
      minutes: total / 1000 / 60 % 60,
      hours: total / 1000 / 60 / 60 % 24,
      days: total / 1000 / 60 / 60 / 24
    };
  }

  var targetClass = 'uk-animation-target';
  var Animate = {
    props: {
      animation: Number
    },
    data: {
      animation: 150
    },
    computed: {
      target: function target() {
        return this.$el;
      }
    },
    methods: {
      animate: function animate(action) {
        var this$1 = this;
        addStyle();
        var children = toNodes(this.target.children);
        var propsFrom = children.map(function (el) {
          return getProps(el, true);
        });
        var oldHeight = height(this.target);
        var oldScrollY = window.pageYOffset;
        action();
        Transition.cancel(this.target);
        children.forEach(Transition.cancel);
        reset(this.target);
        this.$update(this.target);
        fastdom.flush();
        var newHeight = height(this.target);
        children = children.concat(toNodes(this.target.children).filter(function (el) {
          return !includes(children, el);
        }));
        var propsTo = children.map(function (el, i) {
          return el.parentNode && i in propsFrom ? propsFrom[i] ? isVisible(el) ? getPositionWithMargin(el) : {
            opacity: 0
          } : {
            opacity: isVisible(el) ? 1 : 0
          } : false;
        });
        propsFrom = propsTo.map(function (props, i) {
          var from = children[i].parentNode === this$1.target ? propsFrom[i] || getProps(children[i]) : false;

          if (from) {
            if (!props) {
              delete from.opacity;
            } else if (!('opacity' in props)) {
              var opacity = from.opacity;

              if (opacity % 1) {
                props.opacity = 1;
              } else {
                delete from.opacity;
              }
            }
          }

          return from;
        });
        addClass(this.target, targetClass);
        children.forEach(function (el, i) {
          return propsFrom[i] && css(el, propsFrom[i]);
        });
        css(this.target, 'height', oldHeight);
        scrollTop(window, oldScrollY);
        return Promise.all(children.map(function (el, i) {
          return propsFrom[i] && propsTo[i] ? Transition.start(el, propsTo[i], this$1.animation, 'ease') : Promise.resolve();
        }).concat(Transition.start(this.target, {
          height: newHeight
        }, this.animation, 'ease'))).then(function () {
          children.forEach(function (el, i) {
            return css(el, {
              display: propsTo[i].opacity === 0 ? 'none' : '',
              zIndex: ''
            });
          });
          reset(this$1.target);
          this$1.$update(this$1.target);
          fastdom.flush(); // needed for IE11
        }, noop);
      }
    }
  };

  function getProps(el, opacity) {
    var zIndex = css(el, 'zIndex');
    return isVisible(el) ? assign({
      display: '',
      opacity: opacity ? css(el, 'opacity') : '0',
      pointerEvents: 'none',
      position: 'absolute',
      zIndex: zIndex === 'auto' ? _index(el) : zIndex
    }, getPositionWithMargin(el)) : false;
  }

  function reset(el) {
    css(el.children, {
      height: '',
      left: '',
      opacity: '',
      pointerEvents: '',
      position: '',
      top: '',
      width: ''
    });
    removeClass(el, targetClass);
    css(el, 'height', '');
  }

  function getPositionWithMargin(el) {
    var ref = el.getBoundingClientRect();
    var height$$1 = ref.height;
    var width$$1 = ref.width;
    var ref$1 = position(el);
    var top = ref$1.top;
    var left = ref$1.left;
    top += toFloat(css(el, 'marginTop'));
    return {
      top: top,
      left: left,
      height: height$$1,
      width: width$$1
    };
  }

  var style$1;

  function addStyle() {
    if (!style$1) {
      style$1 = append(document.head, '<style>').sheet;
      style$1.insertRule("." + targetClass + " > * {\n                    margin-top: 0 !important;\n                    transform: none !important;\n                }", 0);
    }
  }

  var Filter = {
    mixins: [Animate],
    args: 'target',
    props: {
      target: Boolean,
      selActive: Boolean
    },
    data: {
      target: null,
      selActive: false,
      attrItem: 'uk-filter-control',
      cls: 'uk-active',
      animation: 250
    },
    computed: {
      toggles: {
        get: function get(ref, $el) {
          var attrItem = ref.attrItem;
          return $$("[" + this.attrItem + "],[data-" + this.attrItem + "]", $el);
        },
        watch: function watch() {
          this.setState(this.getState(), false);
        }
      },
      target: function target(ref, $el) {
        var target = ref.target;
        return $(target, $el);
      },
      children: {
        get: function get() {
          return toNodes(this.target.children);
        },
        watch: function watch(list, old) {
          if (!isEqualList(list, old)) {
            this.updateState();
          }
        }
      }
    },
    events: [{
      name: 'click',
      delegate: function delegate() {
        return "[" + this.attrItem + "],[data-" + this.attrItem + "]";
      },
      handler: function handler(e) {
        e.preventDefault();
        this.apply(e.current);
      }
    }],
    connected: function connected() {
      var this$1 = this;

      if (this.selActive === false) {
        return;
      }

      var actives = $$(this.selActive, this.$el);
      this.toggles.forEach(function (el) {
        return toggleClass(el, this$1.cls, includes(actives, el));
      });
    },
    methods: {
      apply: function apply(el) {
        this.setState(mergeState(el, this.attrItem, this.getState()));
      },
      getState: function getState() {
        var this$1 = this;
        return this.toggles.filter(function (item) {
          return hasClass(item, this$1.cls);
        }).reduce(function (state, el) {
          return mergeState(el, this$1.attrItem, state);
        }, {
          filter: {
            '': ''
          },
          sort: []
        });
      },
      setState: function setState(state, animate$$1) {
        var this$1 = this;
        if (animate$$1 === void 0) animate$$1 = true;
        state = assign({
          filter: {
            '': ''
          },
          sort: []
        }, state);
        trigger(this.$el, 'beforeFilter', [this, state]);
        var ref = this;
        var children = ref.children;
        this.toggles.forEach(function (el) {
          return toggleClass(el, this$1.cls, matchFilter(el, this$1.attrItem, state));
        });

        var apply$$1 = function apply$$1() {
          var selector = getSelector(state);
          children.forEach(function (el) {
            return css(el, 'display', selector && !matches(el, selector) ? 'none' : '');
          });
          var ref = state.sort;
          var sort = ref[0];
          var order = ref[1];

          if (sort) {
            var sorted = sortItems(children, sort, order);

            if (!isEqual(sorted, children)) {
              sorted.forEach(function (el) {
                return append(this$1.target, el);
              });
            }
          }
        };

        if (animate$$1) {
          this.animate(apply$$1).then(function () {
            return trigger(this$1.$el, 'afterFilter', [this$1]);
          });
        } else {
          apply$$1();
          trigger(this.$el, 'afterFilter', [this]);
        }
      },
      updateState: function updateState() {
        this.setState(this.getState(), false);
      }
    }
  };

  function getFilter(el, attr$$1) {
    return parseOptions(data(el, attr$$1), ['filter']);
  }

  function mergeState(el, attr$$1, state) {
    toNodes(el).forEach(function (el) {
      var filterBy = getFilter(el, attr$$1);
      var filter$$1 = filterBy.filter;
      var group = filterBy.group;
      var sort = filterBy.sort;
      var order = filterBy.order;
      if (order === void 0) order = 'asc';

      if (filter$$1 || isUndefined(sort)) {
        if (group) {
          delete state.filter[''];
          state.filter[group] = filter$$1;
        } else {
          state.filter = {
            '': filter$$1 || ''
          };
        }
      }

      if (!isUndefined(sort)) {
        state.sort = [sort, order];
      }
    });
    return state;
  }

  function matchFilter(el, attr$$1, ref) {
    var stateFilter = ref.filter;
    if (stateFilter === void 0) stateFilter = {
      '': ''
    };
    var ref_sort = ref.sort;
    var stateSort = ref_sort[0];
    var stateOrder = ref_sort[1];
    var ref$1 = getFilter(el, attr$$1);
    var filter$$1 = ref$1.filter;
    var group = ref$1.group;
    if (group === void 0) group = '';
    var sort = ref$1.sort;
    var order = ref$1.order;
    if (order === void 0) order = 'asc';
    filter$$1 = isUndefined(sort) ? filter$$1 || '' : filter$$1;
    sort = isUndefined(filter$$1) ? sort || '' : sort;
    return (isUndefined(filter$$1) || group in stateFilter && filter$$1 === stateFilter[group]) && (isUndefined(sort) || stateSort === sort && stateOrder === order);
  }

  function isEqualList(listA, listB) {
    return listA.length === listB.length && listA.every(function (el) {
      return ~listB.indexOf(el);
    });
  }

  function getSelector(ref) {
    var filter$$1 = ref.filter;
    var selector = '';
    each(filter$$1, function (value) {
      return selector += value || '';
    });
    return selector;
  }

  function sortItems(nodes, sort, order) {
    return assign([], nodes).sort(function (a, b) {
      return data(a, sort).localeCompare(data(b, sort), undefined, {
        numeric: true
      }) * (order === 'asc' || -1);
    });
  }

  var Animations = {
    slide: {
      show: function show(dir) {
        return [{
          transform: _translate(dir * -100)
        }, {
          transform: _translate()
        }];
      },
      percent: function percent(current) {
        return translated(current);
      },
      translate: function translate(percent, dir) {
        return [{
          transform: _translate(dir * -100 * percent)
        }, {
          transform: _translate(dir * 100 * (1 - percent))
        }];
      }
    }
  };

  function translated(el) {
    return Math.abs(css(el, 'transform').split(',')[4] / el.offsetWidth) || 0;
  }

  function _translate(value, unit) {
    if (value === void 0) value = 0;
    if (unit === void 0) unit = '%';
    return "translateX(" + value + (value ? unit : '') + ")"; // currently not translate3d to support IE, translate3d within translate3d does not work while transitioning
  }

  function scale3d(value) {
    return "scale3d(" + value + ", " + value + ", 1)";
  }

  var Animations$1 = assign({}, Animations, {
    fade: {
      show: function show() {
        return [{
          opacity: 0
        }, {
          opacity: 1
        }];
      },
      percent: function percent(current) {
        return 1 - css(current, 'opacity');
      },
      translate: function translate(percent) {
        return [{
          opacity: 1 - percent
        }, {
          opacity: percent
        }];
      }
    },
    scale: {
      show: function show() {
        return [{
          opacity: 0,
          transform: scale3d(1 - .2)
        }, {
          opacity: 1,
          transform: scale3d(1)
        }];
      },
      percent: function percent(current) {
        return 1 - css(current, 'opacity');
      },
      translate: function translate(percent) {
        return [{
          opacity: 1 - percent,
          transform: scale3d(1 - .2 * percent)
        }, {
          opacity: percent,
          transform: scale3d(1 - .2 + .2 * percent)
        }];
      }
    }
  });

  function Transitioner(prev, next, dir, ref) {
    var animation = ref.animation;
    var easing = ref.easing;
    var _percent = animation.percent;
    var _translate2 = animation.translate;
    var show = animation.show;
    if (show === void 0) show = noop;
    var props = show(dir);
    var deferred = new Deferred();
    return {
      dir: dir,
      show: function show(duration, percent, linear) {
        var this$1 = this;
        if (percent === void 0) percent = 0;
        var timing = linear ? 'linear' : easing;
        duration -= Math.round(duration * clamp(percent, -1, 1));
        this.translate(percent);
        triggerUpdate(next, 'itemin', {
          percent: percent,
          duration: duration,
          timing: timing,
          dir: dir
        });
        triggerUpdate(prev, 'itemout', {
          percent: 1 - percent,
          duration: duration,
          timing: timing,
          dir: dir
        });
        Promise.all([Transition.start(next, props[1], duration, timing), Transition.start(prev, props[0], duration, timing)]).then(function () {
          this$1.reset();
          deferred.resolve();
        }, noop);
        return deferred.promise;
      },
      stop: function stop() {
        return Transition.stop([next, prev]);
      },
      cancel: function cancel() {
        Transition.cancel([next, prev]);
      },
      reset: function reset() {
        for (var prop in props[0]) {
          css([next, prev], prop, '');
        }
      },
      forward: function forward(duration, percent) {
        if (percent === void 0) percent = this.percent();
        Transition.cancel([next, prev]);
        return this.show(duration, percent, true);
      },
      translate: function translate(percent) {
        this.reset();

        var props = _translate2(percent, dir);

        css(next, props[1]);
        css(prev, props[0]);
        triggerUpdate(next, 'itemtranslatein', {
          percent: percent,
          dir: dir
        });
        triggerUpdate(prev, 'itemtranslateout', {
          percent: 1 - percent,
          dir: dir
        });
      },
      percent: function percent() {
        return _percent(prev || next, next, dir);
      },
      getDistance: function getDistance() {
        return prev && prev.offsetWidth;
      }
    };
  }

  function triggerUpdate(el, type, data$$1) {
    trigger(el, createEvent(type, false, false, data$$1));
  }

  var SliderAutoplay = {
    props: {
      autoplay: Boolean,
      autoplayInterval: Number,
      pauseOnHover: Boolean
    },
    data: {
      autoplay: false,
      autoplayInterval: 7000,
      pauseOnHover: true
    },
    connected: function connected() {
      this.startAutoplay();
      this.userInteracted = false;
    },
    disconnected: function disconnected() {
      this.stopAutoplay();
    },
    events: [{
      name: 'visibilitychange',
      el: document,
      handler: function handler() {
        if (document.hidden) {
          this.stopAutoplay();
        } else {
          !this.userInteracted && this.startAutoplay();
        }
      }
    }, {
      name: pointerDown,
      handler: function handler() {
        this.userInteracted = true;
        this.stopAutoplay();
      }
    }, {
      name: 'mouseenter',
      filter: function filter() {
        return this.autoplay;
      },
      handler: function handler() {
        this.isHovering = true;
      }
    }, {
      name: 'mouseleave',
      filter: function filter() {
        return this.autoplay;
      },
      handler: function handler() {
        this.isHovering = false;
      }
    }],
    methods: {
      startAutoplay: function startAutoplay() {
        var this$1 = this;
        this.stopAutoplay();

        if (this.autoplay) {
          this.interval = setInterval(function () {
            return !(this$1.isHovering && this$1.pauseOnHover) && !this$1.stack.length && this$1.show('next');
          }, this.autoplayInterval);
        }
      },
      stopAutoplay: function stopAutoplay() {
        if (this.interval) {
          clearInterval(this.interval);
        }
      }
    }
  };
  var SliderDrag = {
    props: {
      draggable: Boolean
    },
    data: {
      draggable: true,
      threshold: 10
    },
    created: function created() {
      var this$1 = this;
      ['start', 'move', 'end'].forEach(function (key) {
        var fn = this$1[key];

        this$1[key] = function (e) {
          var pos = getPos$1(e).x * (isRtl ? -1 : 1);
          this$1.prevPos = pos !== this$1.pos ? this$1.pos : this$1.prevPos;
          this$1.pos = pos;
          fn(e);
        };
      });
    },
    events: [{
      name: pointerDown,
      delegate: function delegate() {
        return this.selSlides;
      },
      handler: function handler(e) {
        if (!this.draggable || !isTouch(e) && hasTextNodesOnly(e.target) || e.button > 0 || this.length < 2) {
          return;
        }

        this.start(e);
      }
    }, {
      // Workaround for iOS 11 bug: https://bugs.webkit.org/show_bug.cgi?id=184250
      name: 'touchmove',
      passive: false,
      handler: 'move',
      delegate: function delegate() {
        return this.selSlides;
      }
    }, {
      name: 'dragstart',
      handler: function handler(e) {
        e.preventDefault();
      }
    }],
    methods: {
      start: function start() {
        var this$1 = this;
        this.drag = this.pos;

        if (this._transitioner) {
          this.percent = this._transitioner.percent();
          this.drag += this._transitioner.getDistance() * this.percent * this.dir;

          this._transitioner.cancel();

          this._transitioner.translate(this.percent);

          this.dragging = true;
          this.stack = [];
        } else {
          this.prevIndex = this.index;
        } // See above workaround notice


        var off$$1 = pointerMove !== 'touchmove' ? on(document, pointerMove, this.move, {
          passive: false
        }) : noop;

        this.unbindMove = function () {
          off$$1();
          this$1.unbindMove = null;
        };

        on(window, 'scroll', this.unbindMove);
        on(document, pointerUp, this.end, true);
      },
      move: function move(e) {
        var this$1 = this; // See above workaround notice

        if (!this.unbindMove) {
          return;
        }

        var distance = this.pos - this.drag;

        if (distance === 0 || this.prevPos === this.pos || !this.dragging && Math.abs(distance) < this.threshold) {
          return;
        }

        e.cancelable && e.preventDefault();
        this.dragging = true;
        this.dir = distance < 0 ? 1 : -1;
        var ref = this;
        var slides = ref.slides;
        var ref$1 = this;
        var prevIndex = ref$1.prevIndex;
        var dis = Math.abs(distance);
        var nextIndex = this.getIndex(prevIndex + this.dir, prevIndex);
        var width$$1 = this._getDistance(prevIndex, nextIndex) || slides[prevIndex].offsetWidth;

        while (nextIndex !== prevIndex && dis > width$$1) {
          this.drag -= width$$1 * this.dir;
          prevIndex = nextIndex;
          dis -= width$$1;
          nextIndex = this.getIndex(prevIndex + this.dir, prevIndex);
          width$$1 = this._getDistance(prevIndex, nextIndex) || slides[prevIndex].offsetWidth;
        }

        this.percent = dis / width$$1;
        var prev = slides[prevIndex];
        var next = slides[nextIndex];
        var changed = this.index !== nextIndex;
        var edge = prevIndex === nextIndex;
        var itemShown;
        [this.index, this.prevIndex].filter(function (i) {
          return !includes([nextIndex, prevIndex], i);
        }).forEach(function (i) {
          trigger(slides[i], 'itemhidden', [this$1]);

          if (edge) {
            itemShown = true;
            this$1.prevIndex = prevIndex;
          }
        });

        if (this.index === prevIndex && this.prevIndex !== prevIndex || itemShown) {
          trigger(slides[this.index], 'itemshown', [this]);
        }

        if (changed) {
          this.prevIndex = prevIndex;
          this.index = nextIndex;
          !edge && trigger(prev, 'beforeitemhide', [this]);
          trigger(next, 'beforeitemshow', [this]);
        }

        this._transitioner = this._translate(Math.abs(this.percent), prev, !edge && next);

        if (changed) {
          !edge && trigger(prev, 'itemhide', [this]);
          trigger(next, 'itemshow', [this]);
        }
      },
      end: function end() {
        off(window, 'scroll', this.unbindMove);
        this.unbindMove && this.unbindMove();
        off(document, pointerUp, this.end, true);

        if (this.dragging) {
          this.dragging = null;

          if (this.index === this.prevIndex) {
            this.percent = 1 - this.percent;
            this.dir *= -1;

            this._show(false, this.index, true);

            this._transitioner = null;
          } else {
            var dirChange = (isRtl ? this.dir * (isRtl ? 1 : -1) : this.dir) < 0 === this.prevPos > this.pos;
            this.index = dirChange ? this.index : this.prevIndex;

            if (dirChange) {
              this.percent = 1 - this.percent;
            }

            this.show(this.dir > 0 && !dirChange || this.dir < 0 && dirChange ? 'next' : 'previous', true);
          }

          preventClick();
        }

        this.drag = this.percent = null;
      }
    }
  };

  function hasTextNodesOnly(el) {
    return !el.children.length && el.childNodes.length;
  }

  var SliderNav = {
    data: {
      selNav: false
    },
    computed: {
      nav: function nav(ref, $el) {
        var selNav = ref.selNav;
        return $(selNav, $el);
      },
      selNavItem: function selNavItem(ref) {
        var attrItem = ref.attrItem;
        return "[" + attrItem + "],[data-" + attrItem + "]";
      },
      navItems: function navItems(_, $el) {
        return $$(this.selNavItem, $el);
      }
    },
    update: {
      write: function write() {
        var this$1 = this;

        if (this.nav && this.length !== this.nav.children.length) {
          html(this.nav, this.slides.map(function (_, i) {
            return "<li " + this$1.attrItem + "=\"" + i + "\"><a href=\"#\"></a></li>";
          }).join(''));
        }

        toggleClass($$(this.selNavItem, this.$el).concat(this.nav), 'uk-hidden', !this.maxIndex);
        this.updateNav();
      },
      events: ['resize']
    },
    events: [{
      name: 'click',
      delegate: function delegate() {
        return this.selNavItem;
      },
      handler: function handler(e) {
        e.preventDefault();
        this.show(data(e.current, this.attrItem));
      }
    }, {
      name: 'itemshow',
      handler: 'updateNav'
    }],
    methods: {
      updateNav: function updateNav() {
        var this$1 = this;
        var i = this.getValidIndex();
        this.navItems.forEach(function (el) {
          var cmd = data(el, this$1.attrItem);
          toggleClass(el, this$1.clsActive, toNumber(cmd) === i);
          toggleClass(el, 'uk-invisible', this$1.finite && (cmd === 'previous' && i === 0 || cmd === 'next' && i >= this$1.maxIndex));
        });
      }
    }
  };
  var Slider = {
    mixins: [SliderAutoplay, SliderDrag, SliderNav],
    props: {
      clsActivated: Boolean,
      easing: String,
      index: Number,
      finite: Boolean,
      velocity: Number
    },
    data: function data() {
      return {
        easing: 'ease',
        finite: false,
        velocity: 1,
        index: 0,
        stack: [],
        percent: 0,
        clsActive: 'uk-active',
        clsActivated: false,
        Transitioner: false,
        transitionOptions: {}
      };
    },
    computed: {
      duration: function duration(ref, $el) {
        var velocity = ref.velocity;
        return speedUp($el.offsetWidth / velocity);
      },
      length: function length() {
        return this.slides.length;
      },
      list: function list(ref, $el) {
        var selList = ref.selList;
        return $(selList, $el);
      },
      maxIndex: function maxIndex() {
        return this.length - 1;
      },
      selSlides: function selSlides(ref) {
        var selList = ref.selList;
        return selList + " > *";
      },
      slides: function slides() {
        return toNodes(this.list.children);
      }
    },
    events: {
      itemshown: function itemshown() {
        this.$update(this.list);
      }
    },
    methods: {
      show: function show(index$$1, force) {
        var this$1 = this;
        if (force === void 0) force = false;

        if (this.dragging || !this.length) {
          return;
        }

        var ref = this;
        var stack = ref.stack;
        var queueIndex = force ? 0 : stack.length;

        var reset = function reset() {
          stack.splice(queueIndex, 1);

          if (stack.length) {
            this$1.show(stack.shift(), true);
          }
        };

        stack[force ? 'unshift' : 'push'](index$$1);

        if (!force && stack.length > 1) {
          if (stack.length === 2) {
            this._transitioner.forward(Math.min(this.duration, 200));
          }

          return;
        }

        var prevIndex = this.index;
        var prev = hasClass(this.slides, this.clsActive) && this.slides[prevIndex];
        var nextIndex = this.getIndex(index$$1, this.index);
        var next = this.slides[nextIndex];

        if (prev === next) {
          reset();
          return;
        }

        this.dir = getDirection(index$$1, prevIndex);
        this.prevIndex = prevIndex;
        this.index = nextIndex;
        prev && trigger(prev, 'beforeitemhide', [this]);

        if (!trigger(next, 'beforeitemshow', [this, prev])) {
          this.index = this.prevIndex;
          reset();
          return;
        }

        var promise = this._show(prev, next, force).then(function () {
          prev && trigger(prev, 'itemhidden', [this$1]);
          trigger(next, 'itemshown', [this$1]);
          return new Promise(function (resolve) {
            fastdom.write(function () {
              stack.shift();

              if (stack.length) {
                this$1.show(stack.shift(), true);
              } else {
                this$1._transitioner = null;
              }

              resolve();
            });
          });
        });

        prev && trigger(prev, 'itemhide', [this]);
        trigger(next, 'itemshow', [this]);
        return promise;
      },
      getIndex: function getIndex(index$$1, prev) {
        if (index$$1 === void 0) index$$1 = this.index;
        if (prev === void 0) prev = this.index;
        return clamp(_getIndex(index$$1, this.slides, prev, this.finite), 0, this.maxIndex);
      },
      getValidIndex: function getValidIndex(index$$1, prevIndex) {
        if (index$$1 === void 0) index$$1 = this.index;
        if (prevIndex === void 0) prevIndex = this.prevIndex;
        return this.getIndex(index$$1, prevIndex);
      },
      _show: function _show(prev, next, force) {
        this._transitioner = this._getTransitioner(prev, next, this.dir, assign({
          easing: force ? next.offsetWidth < 600 ? 'cubic-bezier(0.25, 0.46, 0.45, 0.94)'
          /* easeOutQuad */
          : 'cubic-bezier(0.165, 0.84, 0.44, 1)'
          /* easeOutQuart */
          : this.easing
        }, this.transitionOptions));

        if (!force && !prev) {
          this._transitioner.translate(1);

          return Promise.resolve();
        }

        var ref = this.stack;
        var length = ref.length;
        return this._transitioner[length > 1 ? 'forward' : 'show'](length > 1 ? Math.min(this.duration, 75 + 75 / (length - 1)) : this.duration, this.percent);
      },
      _getDistance: function _getDistance(prev, next) {
        return new this._getTransitioner(prev, prev !== next && next).getDistance();
      },
      _translate: function _translate(percent, prev, next) {
        if (prev === void 0) prev = this.prevIndex;
        if (next === void 0) next = this.index;

        var transitioner = this._getTransitioner(prev !== next ? prev : false, next);

        transitioner.translate(percent);
        return transitioner;
      },
      _getTransitioner: function _getTransitioner(prev, next, dir, options) {
        if (prev === void 0) prev = this.prevIndex;
        if (next === void 0) next = this.index;
        if (dir === void 0) dir = this.dir || 1;
        if (options === void 0) options = this.transitionOptions;
        return new this.Transitioner(isNumber(prev) ? this.slides[prev] : prev, isNumber(next) ? this.slides[next] : next, dir * (isRtl ? -1 : 1), options);
      }
    }
  };

  function getDirection(index$$1, prevIndex) {
    return index$$1 === 'next' ? 1 : index$$1 === 'previous' ? -1 : index$$1 < prevIndex ? -1 : 1;
  }

  function speedUp(x) {
    return .5 * x + 300; // parabola through (400,500; 600,600; 1800,1200)
  }

  var Slideshow = {
    mixins: [Slider],
    props: {
      animation: String
    },
    data: {
      animation: 'slide',
      clsActivated: 'uk-transition-active',
      Animations: Animations,
      Transitioner: Transitioner
    },
    computed: {
      animation: function animation(ref) {
        var animation = ref.animation;
        var Animations$$1 = ref.Animations;
        return assign(animation in Animations$$1 ? Animations$$1[animation] : Animations$$1.slide, {
          name: animation
        });
      },
      transitionOptions: function transitionOptions() {
        return {
          animation: this.animation
        };
      }
    },
    events: {
      'itemshow itemhide itemshown itemhidden': function itemshowItemhideItemshownItemhidden(ref) {
        var target = ref.target;
        this.$update(target);
      },
      itemshow: function itemshow() {
        isNumber(this.prevIndex) && fastdom.flush(); // iOS 10+ will honor the video.play only if called from a gesture handler
      },
      beforeitemshow: function beforeitemshow(ref) {
        var target = ref.target;
        addClass(target, this.clsActive);
      },
      itemshown: function itemshown(ref) {
        var target = ref.target;
        addClass(target, this.clsActivated);
      },
      itemhidden: function itemhidden(ref) {
        var target = ref.target;
        removeClass(target, this.clsActive, this.clsActivated);
      }
    }
  };
  var LightboxPanel = {
    mixins: [Container, Modal, Togglable, Slideshow],
    functional: true,
    props: {
      delayControls: Number,
      preload: Number,
      videoAutoplay: Boolean,
      template: String
    },
    data: function data() {
      return {
        preload: 1,
        videoAutoplay: false,
        delayControls: 3000,
        items: [],
        cls: 'uk-open',
        clsPage: 'uk-lightbox-page',
        selList: '.uk-lightbox-items',
        attrItem: 'uk-lightbox-item',
        selClose: '.uk-close-large',
        pauseOnHover: false,
        velocity: 2,
        Animations: Animations$1,
        template: "<div class=\"uk-lightbox uk-overflow-hidden\"> <ul class=\"uk-lightbox-items\"></ul> <div class=\"uk-lightbox-toolbar uk-position-top uk-text-right uk-transition-slide-top uk-transition-opaque\"> <button class=\"uk-lightbox-toolbar-icon uk-close-large\" type=\"button\" uk-close></button> </div> <a class=\"uk-lightbox-button uk-position-center-left uk-position-medium uk-transition-fade\" href=\"#\" uk-slidenav-previous uk-lightbox-item=\"previous\"></a> <a class=\"uk-lightbox-button uk-position-center-right uk-position-medium uk-transition-fade\" href=\"#\" uk-slidenav-next uk-lightbox-item=\"next\"></a> <div class=\"uk-lightbox-toolbar uk-lightbox-caption uk-position-bottom uk-text-center uk-transition-slide-bottom uk-transition-opaque\"></div> </div>"
      };
    },
    created: function created() {
      var this$1 = this;
      this.$mount(append(this.container, this.template));
      this.caption = $('.uk-lightbox-caption', this.$el);
      this.items.forEach(function () {
        return append(this$1.list, '<li></li>');
      });
    },
    events: [{
      name: pointerMove + " " + pointerDown + " keydown",
      handler: 'showControls'
    }, {
      name: pointerUp,
      self: true,
      delegate: function delegate() {
        return this.selSlides;
      },
      handler: function handler(e) {
        e.preventDefault();
        this.hide();
      }
    }, {
      name: 'shown',
      self: true,
      handler: function handler() {
        this.startAutoplay();
        this.showControls();
      }
    }, {
      name: 'hide',
      self: true,
      handler: function handler() {
        this.stopAutoplay();
        this.hideControls();
        removeClass(this.slides, this.clsActive);
        Transition.stop(this.slides);
      }
    }, {
      name: 'hidden',
      self: true,
      handler: function handler() {
        this.$destroy(true);
      }
    }, {
      name: 'keyup',
      el: document,
      handler: function handler(e) {
        if (!this.isToggled(this.$el)) {
          return;
        }

        switch (e.keyCode) {
          case 37:
            this.show('previous');
            break;

          case 39:
            this.show('next');
            break;
        }
      }
    }, {
      name: 'beforeitemshow',
      handler: function handler(e) {
        if (this.isToggled()) {
          return;
        }

        this.draggable = false;
        e.preventDefault();
        this.toggleNow(this.$el, true);
        this.animation = Animations$1['scale'];
        removeClass(e.target, this.clsActive);
        this.stack.splice(1, 0, this.index);
      }
    }, {
      name: 'itemshow',
      handler: function handler(ref) {
        var target = ref.target;

        var i = _index(target);

        var ref$1 = this.getItem(i);
        var caption = ref$1.caption;
        css(this.caption, 'display', caption ? '' : 'none');
        html(this.caption, caption);

        for (var j = 0; j <= this.preload; j++) {
          this.loadItem(this.getIndex(i + j));
          this.loadItem(this.getIndex(i - j));
        }
      }
    }, {
      name: 'itemshown',
      handler: function handler() {
        this.draggable = this.$props.draggable;
      }
    }, {
      name: 'itemload',
      handler: function handler(_, item) {
        var this$1 = this;
        var source = item.source;
        var type = item.type;
        var alt = item.alt;
        this.setItem(item, '<span uk-spinner></span>');

        if (!source) {
          return;
        }

        var matches$$1; // Image

        if (type === 'image' || source.match(/\.(jp(e)?g|png|gif|svg)($|\?)/i)) {
          getImage(source).then(function (img) {
            return this$1.setItem(item, "<img width=\"" + img.width + "\" height=\"" + img.height + "\" src=\"" + source + "\" alt=\"" + (alt ? alt : '') + "\">");
          }, function () {
            return this$1.setError(item);
          }); // Video
        } else if (type === 'video' || source.match(/\.(mp4|webm|ogv)($|\?)/i)) {
          var video = $("<video controls playsinline" + (item.poster ? " poster=\"" + item.poster + "\"" : '') + " uk-video=\"" + this.videoAutoplay + "\"></video>");
          attr(video, 'src', source);
          once(video, 'error loadedmetadata', function (type) {
            if (type === 'error') {
              this$1.setError(item);
            } else {
              attr(video, {
                width: video.videoWidth,
                height: video.videoHeight
              });
              this$1.setItem(item, video);
            }
          }); // Iframe
        } else if (type === 'iframe' || source.match(/\.(html|php)($|\?)/i)) {
          this.setItem(item, "<iframe class=\"uk-lightbox-iframe\" src=\"" + source + "\" frameborder=\"0\" allowfullscreen></iframe>"); // YouTube
        } else if (matches$$1 = source.match(/\/\/.*?youtube(-nocookie)?\.[a-z]+\/watch\?v=([^&\s]+)/) || source.match(/()youtu\.be\/(.*)/)) {
          var id = matches$$1[2];

          var setIframe = function setIframe(width$$1, height$$1) {
            if (width$$1 === void 0) width$$1 = 640;
            if (height$$1 === void 0) height$$1 = 450;
            return this$1.setItem(item, getIframe("https://www.youtube" + (matches$$1[1] || '') + ".com/embed/" + id, width$$1, height$$1, this$1.videoAutoplay));
          };

          getImage("https://img.youtube.com/vi/" + id + "/maxresdefault.jpg").then(function (ref) {
            var width$$1 = ref.width;
            var height$$1 = ref.height; // YouTube default 404 thumb, fall back to low resolution

            if (width$$1 === 120 && height$$1 === 90) {
              getImage("https://img.youtube.com/vi/" + id + "/0.jpg").then(function (ref) {
                var width$$1 = ref.width;
                var height$$1 = ref.height;
                return setIframe(width$$1, height$$1);
              }, setIframe);
            } else {
              setIframe(width$$1, height$$1);
            }
          }, setIframe); // Vimeo
        } else if (matches$$1 = source.match(/(\/\/.*?)vimeo\.[a-z]+\/([0-9]+).*?/)) {
          ajax("https://vimeo.com/api/oembed.json?maxwidth=1920&url=" + encodeURI(source), {
            responseType: 'json',
            withCredentials: false
          }).then(function (ref) {
            var ref_response = ref.response;
            var height$$1 = ref_response.height;
            var width$$1 = ref_response.width;
            return this$1.setItem(item, getIframe("https://player.vimeo.com/video/" + matches$$1[2], width$$1, height$$1, this$1.videoAutoplay));
          }, function () {
            return this$1.setError(item);
          });
        }
      }
    }],
    methods: {
      loadItem: function loadItem(index$$1) {
        if (index$$1 === void 0) index$$1 = this.index;
        var item = this.getItem(index$$1);

        if (item.content) {
          return;
        }

        trigger(this.$el, 'itemload', [item]);
      },
      getItem: function getItem(index$$1) {
        if (index$$1 === void 0) index$$1 = this.index;
        return this.items[index$$1] || {};
      },
      setItem: function setItem(item, content) {
        assign(item, {
          content: content
        });
        var el = html(this.slides[this.items.indexOf(item)], content);
        trigger(this.$el, 'itemloaded', [this, el]);
        this.$update(el);
      },
      setError: function setError(item) {
        this.setItem(item, '<span uk-icon="icon: bolt; ratio: 2"></span>');
      },
      showControls: function showControls() {
        clearTimeout(this.controlsTimer);
        this.controlsTimer = setTimeout(this.hideControls, this.delayControls);
        addClass(this.$el, 'uk-active', 'uk-transition-active');
      },
      hideControls: function hideControls() {
        removeClass(this.$el, 'uk-active', 'uk-transition-active');
      }
    }
  };

  function getIframe(src, width$$1, height$$1, autoplay) {
    return "<iframe src=\"" + src + "\" width=\"" + width$$1 + "\" height=\"" + height$$1 + "\" style=\"max-width: 100%; box-sizing: border-box;\" frameborder=\"0\" allowfullscreen uk-video=\"autoplay: " + autoplay + "\" uk-responsive></iframe>";
  }

  var Lightbox = {
    install: install$2,
    props: {
      toggle: String
    },
    data: {
      toggle: 'a'
    },
    computed: {
      toggles: {
        get: function get(ref, $el) {
          var toggle = ref.toggle;
          return $$(toggle, $el);
        },
        watch: function watch() {
          this.hide();
        }
      }
    },
    disconnected: function disconnected() {
      this.hide();
    },
    events: [{
      name: 'click',
      delegate: function delegate() {
        return this.toggle + ":not(.uk-disabled)";
      },
      handler: function handler(e) {
        e.preventDefault();
        this.show(_index(this.toggles, e.current));
      }
    }],
    methods: {
      show: function show(index$$1) {
        var this$1 = this;
        this.panel = this.panel || this.$create('lightboxPanel', assign({}, this.$props, {
          items: this.toggles.reduce(function (items, el) {
            items.push(['href', 'caption', 'type', 'poster', 'alt'].reduce(function (obj, attr$$1) {
              obj[attr$$1 === 'href' ? 'source' : attr$$1] = data(el, attr$$1);
              return obj;
            }, {}));
            return items;
          }, [])
        }));
        on(this.panel.$el, 'hidden', function () {
          return this$1.panel = false;
        });
        return this.panel.show(index$$1);
      },
      hide: function hide() {
        return this.panel && this.panel.hide();
      }
    }
  };

  function install$2(UIkit, Lightbox) {
    if (!UIkit.lightboxPanel) {
      UIkit.component('lightboxPanel', LightboxPanel);
    }

    assign(Lightbox.props, UIkit.component('lightboxPanel').options.props);
  }

  var obj;
  var containers = {};
  var Notification = {
    functional: true,
    args: ['message', 'status'],
    data: {
      message: '',
      status: '',
      timeout: 5000,
      group: null,
      pos: 'top-center',
      clsClose: 'uk-notification-close',
      clsMsg: 'uk-notification-message'
    },
    install: install$3,
    computed: {
      marginProp: function marginProp(ref) {
        var pos = ref.pos;
        return "margin" + (startsWith(pos, 'top') ? 'Top' : 'Bottom');
      },
      startProps: function startProps() {
        var obj;
        return obj = {
          opacity: 0
        }, obj[this.marginProp] = -this.$el.offsetHeight, obj;
      }
    },
    created: function created() {
      if (!containers[this.pos]) {
        containers[this.pos] = append(this.$container, "<div class=\"uk-notification uk-notification-" + this.pos + "\"></div>");
      }

      var container = css(containers[this.pos], 'display', 'block');
      this.$mount(append(container, "<div class=\"" + this.clsMsg + (this.status ? " " + this.clsMsg + "-" + this.status : '') + "\"> <a href=\"#\" class=\"" + this.clsClose + "\" data-uk-close></a> <div>" + this.message + "</div> </div>"));
    },
    connected: function connected() {
      var this$1 = this;
      var obj;
      var margin = toFloat(css(this.$el, this.marginProp));
      Transition.start(css(this.$el, this.startProps), (obj = {
        opacity: 1
      }, obj[this.marginProp] = margin, obj)).then(function () {
        if (this$1.timeout) {
          this$1.timer = setTimeout(this$1.close, this$1.timeout);
        }
      });
    },
    events: (obj = {
      click: function click(e) {
        if (closest(e.target, 'a[href="#"],a[href=""]')) {
          e.preventDefault();
        }

        this.close();
      }
    }, obj[pointerEnter] = function () {
      if (this.timer) {
        clearTimeout(this.timer);
      }
    }, obj[pointerLeave] = function () {
      if (this.timeout) {
        this.timer = setTimeout(this.close, this.timeout);
      }
    }, obj),
    methods: {
      close: function close(immediate) {
        var this$1 = this;

        var removeFn = function removeFn() {
          trigger(this$1.$el, 'close', [this$1]);

          _remove(this$1.$el);

          if (!containers[this$1.pos].children.length) {
            css(containers[this$1.pos], 'display', 'none');
          }
        };

        if (this.timer) {
          clearTimeout(this.timer);
        }

        if (immediate) {
          removeFn();
        } else {
          Transition.start(this.$el, this.startProps).then(removeFn);
        }
      }
    }
  };

  function install$3(UIkit) {
    UIkit.notification.closeAll = function (group, immediate) {
      apply(document.body, function (el) {
        var notification = UIkit.getComponent(el, 'notification');

        if (notification && (!group || group === notification.group)) {
          notification.close(immediate);
        }
      });
    };
  }

  var _props = ['x', 'y', 'bgx', 'bgy', 'rotate', 'scale', 'color', 'backgroundColor', 'borderColor', 'opacity', 'blur', 'hue', 'grayscale', 'invert', 'saturate', 'sepia', 'fopacity'];
  var Parallax = {
    mixins: [Media],
    props: _props.reduce(function (props, prop) {
      props[prop] = 'list';
      return props;
    }, {}),
    data: _props.reduce(function (data$$1, prop) {
      data$$1[prop] = undefined;
      return data$$1;
    }, {}),
    computed: {
      props: function props(properties, $el) {
        var this$1 = this;
        return _props.reduce(function (props, prop) {
          if (isUndefined(properties[prop])) {
            return props;
          }

          var isColor = prop.match(/color/i);
          var isCssProp = isColor || prop === 'opacity';
          var pos, bgPos, diff;
          var steps = properties[prop].slice(0);

          if (isCssProp) {
            css($el, prop, '');
          }

          if (steps.length < 2) {
            steps.unshift((prop === 'scale' ? 1 : isCssProp ? css($el, prop) : 0) || 0);
          }

          var unit = includes(steps.join(''), '%') ? '%' : 'px';

          if (isColor) {
            var ref = $el.style;
            var color = ref.color;
            steps = steps.map(function (step) {
              return parseColor($el, step);
            });
            $el.style.color = color;
          } else {
            steps = steps.map(toFloat);
          }

          if (prop.match(/^bg/)) {
            css($el, "background-position-" + prop[2], '');
            bgPos = css($el, 'backgroundPosition').split(' ')[prop[2] === 'x' ? 0 : 1]; // IE 11 can't read background-position-[x|y]

            if (this$1.covers) {
              var min = Math.min.apply(Math, steps);
              var max = Math.max.apply(Math, steps);
              var down = steps.indexOf(min) < steps.indexOf(max);
              diff = max - min;
              steps = steps.map(function (step) {
                return step - (down ? min : max);
              });
              pos = (down ? -diff : 0) + "px";
            } else {
              pos = bgPos;
            }
          }

          props[prop] = {
            steps: steps,
            unit: unit,
            pos: pos,
            bgPos: bgPos,
            diff: diff
          };
          return props;
        }, {});
      },
      bgProps: function bgProps() {
        var this$1 = this;
        return ['bgx', 'bgy'].filter(function (bg) {
          return bg in this$1.props;
        });
      },
      covers: function covers(_, $el) {
        return _covers($el);
      }
    },
    disconnected: function disconnected() {
      delete this._image;
    },
    update: {
      read: function read(data$$1) {
        var this$1 = this;
        data$$1.active = this.matchMedia;

        if (!data$$1.active) {
          return;
        }

        if (!data$$1.image && this.covers && this.bgProps.length) {
          var src = css(this.$el, 'backgroundImage').replace(/^none|url\(["']?(.+?)["']?\)$/, '$1');

          if (src) {
            var img = new Image();
            img.src = src;
            data$$1.image = img;

            if (!img.naturalWidth) {
              img.onload = function () {
                return this$1.$emit();
              };
            }
          }
        }

        var image = data$$1.image;

        if (!image || !image.naturalWidth) {
          return;
        }

        var dimEl = {
          width: this.$el.offsetWidth,
          height: this.$el.offsetHeight
        };
        var dimImage = {
          width: image.naturalWidth,
          height: image.naturalHeight
        };
        var dim = Dimensions.cover(dimImage, dimEl);
        this.bgProps.forEach(function (prop) {
          var ref = this$1.props[prop];
          var diff = ref.diff;
          var bgPos = ref.bgPos;
          var steps = ref.steps;
          var attr$$1 = prop === 'bgy' ? 'height' : 'width';
          var span = dim[attr$$1] - dimEl[attr$$1];

          if (!bgPos.match(/%$|0px/)) {
            return;
          }

          if (span < diff) {
            dimEl[attr$$1] = dim[attr$$1] + diff - span;
          } else if (span > diff) {
            var bgPosFloat = parseFloat(bgPos);

            if (bgPosFloat) {
              this$1.props[prop].steps = steps.map(function (step) {
                return step - (span - diff) / (100 / bgPosFloat);
              });
            }
          }

          dim = Dimensions.cover(dimImage, dimEl);
        });
        data$$1.dim = dim;
      },
      write: function write(ref) {
        var dim = ref.dim;
        var active = ref.active;

        if (!active) {
          css(this.$el, {
            backgroundSize: '',
            backgroundRepeat: ''
          });
          return;
        }

        dim && css(this.$el, {
          backgroundSize: dim.width + "px " + dim.height + "px",
          backgroundRepeat: 'no-repeat'
        });
      },
      events: ['resize']
    },
    methods: {
      reset: function reset() {
        var this$1 = this;
        each(this.getCss(0), function (_, prop) {
          return css(this$1.$el, prop, '');
        });
      },
      getCss: function getCss(percent) {
        var ref = this;
        var props = ref.props;
        var translated = false;
        return Object.keys(props).reduce(function (css$$1, prop) {
          var ref = props[prop];
          var steps = ref.steps;
          var unit = ref.unit;
          var pos = ref.pos;
          var value = getValue(steps, percent);

          switch (prop) {
            // transforms
            case 'x':
            case 'y':
              {
                if (translated) {
                  break;
                }

                var ref$1 = ['x', 'y'].map(function (dir) {
                  return prop === dir ? toFloat(value).toFixed(0) + unit : props[dir] ? getValue(props[dir].steps, percent, 1) + props[dir].unit : 0;
                });
                var x = ref$1[0];
                var y = ref$1[1];
                translated = css$$1.transform += " translate3d(" + x + ", " + y + ", 0)";
                break;
              }

            case 'rotate':
              css$$1.transform += " rotate(" + value + "deg)";
              break;

            case 'scale':
              css$$1.transform += " scale(" + value + ")";
              break;
            // bg image

            case 'bgy':
            case 'bgx':
              css$$1["background-position-" + prop[2]] = "calc(" + pos + " + " + (value + unit) + ")";
              break;
            // color

            case 'color':
            case 'backgroundColor':
            case 'borderColor':
              {
                var ref$2 = getStep(steps, percent);
                var start = ref$2[0];
                var end = ref$2[1];
                var p = ref$2[2];
                css$$1[prop] = "rgba(" + start.map(function (value, i) {
                  value = value + p * (end[i] - value);
                  return i === 3 ? toFloat(value) : parseInt(value, 10);
                }).join(',') + ")";
                break;
              }
            // CSS Filter

            case 'blur':
              css$$1.filter += " blur(" + value + "px)";
              break;

            case 'hue':
              css$$1.filter += " hue-rotate(" + value + "deg)";
              break;

            case 'fopacity':
              css$$1.filter += " opacity(" + value + "%)";
              break;

            case 'grayscale':
            case 'invert':
            case 'saturate':
            case 'sepia':
              css$$1.filter += " " + prop + "(" + value + "%)";
              break;

            default:
              css$$1[prop] = value;
          }

          return css$$1;
        }, {
          transform: '',
          filter: ''
        });
      }
    }
  };

  function parseColor(el, color) {
    return css(css(el, 'color', color), 'color').split(/[(),]/g).slice(1, -1).concat(1).slice(0, 4).map(function (n) {
      return toFloat(n);
    });
  }

  function getStep(steps, percent) {
    var count = steps.length - 1;
    var index$$1 = Math.min(Math.floor(count * percent), count - 1);
    var step = steps.slice(index$$1, index$$1 + 2);
    step.push(percent === 1 ? 1 : percent % (1 / count) * count);
    return step;
  }

  function getValue(steps, percent, digits) {
    if (digits === void 0) digits = 2;
    var ref = getStep(steps, percent);
    var start = ref[0];
    var end = ref[1];
    var p = ref[2];
    return (isNumber(start) ? start + Math.abs(start - end) * p * (start < end ? 1 : -1) : +end).toFixed(digits);
  }

  function _covers(el) {
    var ref = el.style;
    var backgroundSize = ref.backgroundSize;
    var covers = css(css(el, 'backgroundSize', ''), 'backgroundSize') === 'cover';
    el.style.backgroundSize = backgroundSize;
    return covers;
  }

  var Parallax$1 = {
    mixins: [Parallax],
    props: {
      target: String,
      viewport: Number,
      easing: Number
    },
    data: {
      target: false,
      viewport: 1,
      easing: 1
    },
    computed: {
      target: function target(ref, $el) {
        var target = ref.target;
        return getOffsetElement(target && query(target, $el) || $el);
      }
    },
    update: {
      read: function read(ref, type) {
        var percent = ref.percent;
        var active = ref.active;

        if (type !== 'scroll') {
          percent = false;
        }

        if (!active) {
          return;
        }

        var prev = percent;
        percent = ease$1(scrolledOver(this.target) / (this.viewport || 1), this.easing);
        return {
          percent: percent,
          style: prev !== percent ? this.getCss(percent) : false
        };
      },
      write: function write(ref) {
        var style = ref.style;
        var active = ref.active;

        if (!active) {
          this.reset();
          return;
        }

        style && css(this.$el, style);
      },
      events: ['scroll', 'resize']
    }
  };

  function ease$1(percent, easing) {
    return clamp(percent * (1 - (easing - easing * percent)));
  } // SVG elements do not inherit from HTMLElement


  function getOffsetElement(el) {
    return el ? 'offsetTop' in el ? el : getOffsetElement(el.parentNode) : document.body;
  }

  var SliderReactive = {
    update: {
      write: function write() {
        if (this.stack.length || this.dragging) {
          return;
        }

        var index$$1 = this.getValidIndex();
        delete this.index;
        removeClass(this.slides, this.clsActive, this.clsActivated);
        this.show(index$$1);
      },
      events: ['resize']
    }
  };

  function Transitioner$1(prev, next, dir, ref) {
    var center = ref.center;
    var easing = ref.easing;
    var list = ref.list;
    var deferred = new Deferred();
    var from = prev ? getLeft(prev, list, center) : getLeft(next, list, center) + bounds(next).width * dir;
    var to = next ? getLeft(next, list, center) : from + bounds(prev).width * dir * (isRtl ? -1 : 1);
    return {
      dir: dir,
      show: function show(duration, percent, linear) {
        if (percent === void 0) percent = 0;
        var timing = linear ? 'linear' : easing;
        duration -= Math.round(duration * clamp(percent, -1, 1));
        this.translate(percent);
        prev && this.updateTranslates();
        percent = prev ? percent : clamp(percent, 0, 1);
        triggerUpdate$1(this.getItemIn(), 'itemin', {
          percent: percent,
          duration: duration,
          timing: timing,
          dir: dir
        });
        prev && triggerUpdate$1(this.getItemIn(true), 'itemout', {
          percent: 1 - percent,
          duration: duration,
          timing: timing,
          dir: dir
        });
        Transition.start(list, {
          transform: _translate(-to * (isRtl ? -1 : 1), 'px')
        }, duration, timing).then(deferred.resolve, noop);
        return deferred.promise;
      },
      stop: function stop() {
        return Transition.stop(list);
      },
      cancel: function cancel() {
        Transition.cancel(list);
      },
      reset: function reset() {
        css(list, 'transform', '');
      },
      forward: function forward(duration, percent) {
        if (percent === void 0) percent = this.percent();
        Transition.cancel(list);
        return this.show(duration, percent, true);
      },
      translate: function translate(percent) {
        var distance = this.getDistance() * dir * (isRtl ? -1 : 1);
        css(list, 'transform', _translate(clamp(-to + (distance - distance * percent), -getWidth(list), bounds(list).width) * (isRtl ? -1 : 1), 'px'));
        this.updateTranslates();

        if (prev) {
          percent = clamp(percent, -1, 1);
          triggerUpdate$1(this.getItemIn(), 'itemtranslatein', {
            percent: percent,
            dir: dir
          });
          triggerUpdate$1(this.getItemIn(true), 'itemtranslateout', {
            percent: 1 - percent,
            dir: dir
          });
        }
      },
      percent: function percent() {
        return Math.abs((css(list, 'transform').split(',')[4] * (isRtl ? -1 : 1) + from) / (to - from));
      },
      getDistance: function getDistance() {
        return Math.abs(to - from);
      },
      getItemIn: function getItemIn(out) {
        if (out === void 0) out = false;
        var actives = this.getActives();
        var all = sortBy(slides(list), 'offsetLeft');

        var i = _index(all, actives[dir * (out ? -1 : 1) > 0 ? actives.length - 1 : 0]);

        return ~i && all[i + (prev && !out ? dir : 0)];
      },
      getActives: function getActives() {
        var left = getLeft(prev || next, list, center);
        return sortBy(slides(list).filter(function (slide) {
          var slideLeft = getElLeft(slide, list);
          return slideLeft >= left && slideLeft + bounds(slide).width <= bounds(list).width + left;
        }), 'offsetLeft');
      },
      updateTranslates: function updateTranslates() {
        var actives = this.getActives();
        slides(list).forEach(function (slide) {
          var isActive = includes(actives, slide);
          triggerUpdate$1(slide, "itemtranslate" + (isActive ? 'in' : 'out'), {
            percent: isActive ? 1 : 0,
            dir: slide.offsetLeft <= next.offsetLeft ? 1 : -1
          });
        });
      }
    };
  }

  function getLeft(el, list, center) {
    var left = getElLeft(el, list);
    return center ? left - centerEl(el, list) : Math.min(left, getMax(list));
  }

  function getMax(list) {
    return Math.max(0, getWidth(list) - bounds(list).width);
  }

  function getWidth(list) {
    return slides(list).reduce(function (right, el) {
      return bounds(el).width + right;
    }, 0);
  }

  function getMaxWidth(list) {
    return slides(list).reduce(function (right, el) {
      return Math.max(right, bounds(el).width);
    }, 0);
  }

  function centerEl(el, list) {
    return bounds(list).width / 2 - bounds(el).width / 2;
  }

  function getElLeft(el, list) {
    return (position(el).left + (isRtl ? bounds(el).width - bounds(list).width : 0)) * (isRtl ? -1 : 1);
  }

  function bounds(el) {
    return el.getBoundingClientRect();
  }

  function triggerUpdate$1(el, type, data$$1) {
    trigger(el, createEvent(type, false, false, data$$1));
  }

  function slides(list) {
    return toNodes(list.children);
  }

  var Slider$1 = {
    mixins: [Class, Slider, SliderReactive],
    props: {
      center: Boolean,
      sets: Boolean
    },
    data: {
      center: false,
      sets: false,
      attrItem: 'uk-slider-item',
      selList: '.uk-slider-items',
      selNav: '.uk-slider-nav',
      clsContainer: 'uk-slider-container',
      Transitioner: Transitioner$1
    },
    computed: {
      avgWidth: function avgWidth() {
        return getWidth(this.list) / this.length;
      },
      finite: function finite(ref) {
        var finite = ref.finite;
        return finite || getWidth(this.list) < bounds(this.list).width + getMaxWidth(this.list) + this.center;
      },
      maxIndex: function maxIndex() {
        if (!this.finite || this.center && !this.sets) {
          return this.length - 1;
        }

        if (this.center) {
          return this.sets[this.sets.length - 1];
        }

        css(this.slides, 'order', '');
        var max = getMax(this.list);
        var i = this.length;

        while (i--) {
          if (getElLeft(this.list.children[i], this.list) < max) {
            return Math.min(i + 1, this.length - 1);
          }
        }

        return 0;
      },
      sets: function sets(ref) {
        var this$1 = this;
        var sets = ref.sets;
        var width$$1 = bounds(this.list).width / (this.center ? 2 : 1);
        var left = 0;
        var leftCenter = width$$1;
        var slideLeft = 0;
        sets = sets && this.slides.reduce(function (sets, slide, i) {
          var ref = bounds(slide);
          var slideWidth = ref.width;
          var slideRight = slideLeft + slideWidth;

          if (slideRight > left) {
            if (!this$1.center && i > this$1.maxIndex) {
              i = this$1.maxIndex;
            }

            if (!includes(sets, i)) {
              var cmp = this$1.slides[i + 1];

              if (this$1.center && cmp && slideWidth < leftCenter - bounds(cmp).width / 2) {
                leftCenter -= slideWidth;
              } else {
                leftCenter = width$$1;
                sets.push(i);
                left = slideLeft + width$$1 + (this$1.center ? slideWidth / 2 : 0);
              }
            }
          }

          slideLeft += slideWidth;
          return sets;
        }, []);
        return sets && sets.length && sets;
      },
      transitionOptions: function transitionOptions() {
        return {
          center: this.center,
          list: this.list
        };
      }
    },
    connected: function connected() {
      toggleClass(this.$el, this.clsContainer, !$("." + this.clsContainer, this.$el));
    },
    update: {
      write: function write() {
        var this$1 = this;
        $$("[" + this.attrItem + "],[data-" + this.attrItem + "]", this.$el).forEach(function (el) {
          var index$$1 = data(el, this$1.attrItem);
          this$1.maxIndex && toggleClass(el, 'uk-hidden', isNumeric(index$$1) && (this$1.sets && !includes(this$1.sets, toFloat(index$$1)) || index$$1 > this$1.maxIndex));
        });
      },
      events: ['resize']
    },
    events: {
      beforeitemshow: function beforeitemshow(e) {
        if (!this.dragging && this.sets && this.stack.length < 2 && !includes(this.sets, this.index)) {
          this.index = this.getValidIndex();
        }

        var diff = Math.abs(this.index - this.prevIndex + (this.dir > 0 && this.index < this.prevIndex || this.dir < 0 && this.index > this.prevIndex ? (this.maxIndex + 1) * this.dir : 0));

        if (!this.dragging && diff > 1) {
          for (var i = 0; i < diff; i++) {
            this.stack.splice(1, 0, this.dir > 0 ? 'next' : 'previous');
          }

          e.preventDefault();
          return;
        }

        this.duration = speedUp(this.avgWidth / this.velocity) * (bounds(this.dir < 0 || !this.slides[this.prevIndex] ? this.slides[this.index] : this.slides[this.prevIndex]).width / this.avgWidth);
        this.reorder();
      },
      itemshow: function itemshow() {
        !isUndefined(this.prevIndex) && addClass(this._getTransitioner().getItemIn(), this.clsActive);
      },
      itemshown: function itemshown() {
        var this$1 = this;

        var actives = this._getTransitioner(this.index).getActives();

        this.slides.forEach(function (slide) {
          return toggleClass(slide, this$1.clsActive, includes(actives, slide));
        });
        (!this.sets || includes(this.sets, toFloat(this.index))) && this.slides.forEach(function (slide) {
          return toggleClass(slide, this$1.clsActivated, includes(actives, slide));
        });
      }
    },
    methods: {
      reorder: function reorder() {
        var this$1 = this;
        css(this.slides, 'order', '');

        if (this.finite) {
          return;
        }

        var index$$1 = this.dir > 0 && this.slides[this.prevIndex] ? this.prevIndex : this.index;
        this.slides.forEach(function (slide, i) {
          return css(slide, 'order', this$1.dir > 0 && i < index$$1 ? 1 : this$1.dir < 0 && i >= this$1.index ? -1 : '');
        });

        if (!this.center) {
          return;
        }

        var next = this.slides[index$$1];
        var width$$1 = bounds(this.list).width / 2 - bounds(next).width / 2;
        var j = 0;

        while (width$$1 > 0) {
          var slideIndex = this.getIndex(--j + index$$1, index$$1);
          var slide = this.slides[slideIndex];
          css(slide, 'order', slideIndex > index$$1 ? -2 : -1);
          width$$1 -= bounds(slide).width;
        }
      },
      getValidIndex: function getValidIndex(index$$1, prevIndex) {
        if (index$$1 === void 0) index$$1 = this.index;
        if (prevIndex === void 0) prevIndex = this.prevIndex;
        index$$1 = this.getIndex(index$$1, prevIndex);

        if (!this.sets) {
          return index$$1;
        }

        var prev;

        do {
          if (includes(this.sets, index$$1)) {
            return index$$1;
          }

          prev = index$$1;
          index$$1 = this.getIndex(index$$1 + this.dir, prevIndex);
        } while (index$$1 !== prev);

        return index$$1;
      }
    }
  };
  var SliderParallax = {
    mixins: [Parallax],
    data: {
      selItem: '!li'
    },
    computed: {
      item: function item(ref, $el) {
        var selItem = ref.selItem;
        return query(selItem, $el);
      }
    },
    events: [{
      name: 'itemshown',
      self: true,
      el: function el() {
        return this.item;
      },
      handler: function handler() {
        css(this.$el, this.getCss(.5));
      }
    }, {
      name: 'itemin itemout',
      self: true,
      el: function el() {
        return this.item;
      },
      handler: function handler(ref) {
        var type = ref.type;
        var ref_detail = ref.detail;
        var percent = ref_detail.percent;
        var duration = ref_detail.duration;
        var timing = ref_detail.timing;
        var dir = ref_detail.dir;
        Transition.cancel(this.$el);
        css(this.$el, this.getCss(getCurrent(type, dir, percent)));
        Transition.start(this.$el, this.getCss(isIn(type) ? .5 : dir > 0 ? 1 : 0), duration, timing)["catch"](noop);
      }
    }, {
      name: 'transitioncanceled transitionend',
      self: true,
      el: function el() {
        return this.item;
      },
      handler: function handler() {
        Transition.cancel(this.$el);
      }
    }, {
      name: 'itemtranslatein itemtranslateout',
      self: true,
      el: function el() {
        return this.item;
      },
      handler: function handler(ref) {
        var type = ref.type;
        var ref_detail = ref.detail;
        var percent = ref_detail.percent;
        var dir = ref_detail.dir;
        Transition.cancel(this.$el);
        css(this.$el, this.getCss(getCurrent(type, dir, percent)));
      }
    }]
  };

  function isIn(type) {
    return endsWith(type, 'in');
  }

  function getCurrent(type, dir, percent) {
    percent /= 2;
    return !isIn(type) ? dir < 0 ? percent : 1 - percent : dir < 0 ? 1 - percent : percent;
  }

  var Animations$2 = assign({}, Animations, {
    fade: {
      show: function show() {
        return [{
          opacity: 0,
          zIndex: 0
        }, {
          zIndex: -1
        }];
      },
      percent: function percent(current) {
        return 1 - css(current, 'opacity');
      },
      translate: function translate(percent) {
        return [{
          opacity: 1 - percent,
          zIndex: 0
        }, {
          zIndex: -1
        }];
      }
    },
    scale: {
      show: function show() {
        return [{
          opacity: 0,
          transform: scale3d(1 + .5),
          zIndex: 0
        }, {
          zIndex: -1
        }];
      },
      percent: function percent(current) {
        return 1 - css(current, 'opacity');
      },
      translate: function translate(percent) {
        return [{
          opacity: 1 - percent,
          transform: scale3d(1 + .5 * percent),
          zIndex: 0
        }, {
          zIndex: -1
        }];
      }
    },
    pull: {
      show: function show(dir) {
        return dir < 0 ? [{
          transform: _translate(30),
          zIndex: -1
        }, {
          transform: _translate(),
          zIndex: 0
        }] : [{
          transform: _translate(-100),
          zIndex: 0
        }, {
          transform: _translate(),
          zIndex: -1
        }];
      },
      percent: function percent(current, next, dir) {
        return dir < 0 ? 1 - translated(next) : translated(current);
      },
      translate: function translate(percent, dir) {
        return dir < 0 ? [{
          transform: _translate(30 * percent),
          zIndex: -1
        }, {
          transform: _translate(-100 * (1 - percent)),
          zIndex: 0
        }] : [{
          transform: _translate(-percent * 100),
          zIndex: 0
        }, {
          transform: _translate(30 * (1 - percent)),
          zIndex: -1
        }];
      }
    },
    push: {
      show: function show(dir) {
        return dir < 0 ? [{
          transform: _translate(100),
          zIndex: 0
        }, {
          transform: _translate(),
          zIndex: -1
        }] : [{
          transform: _translate(-30),
          zIndex: -1
        }, {
          transform: _translate(),
          zIndex: 0
        }];
      },
      percent: function percent(current, next, dir) {
        return dir > 0 ? 1 - translated(next) : translated(current);
      },
      translate: function translate(percent, dir) {
        return dir < 0 ? [{
          transform: _translate(percent * 100),
          zIndex: 0
        }, {
          transform: _translate(-30 * (1 - percent)),
          zIndex: -1
        }] : [{
          transform: _translate(-30 * percent),
          zIndex: -1
        }, {
          transform: _translate(100 * (1 - percent)),
          zIndex: 0
        }];
      }
    }
  });
  var Slideshow$1 = {
    mixins: [Class, Slideshow, SliderReactive],
    props: {
      ratio: String,
      minHeight: Boolean,
      maxHeight: Boolean
    },
    data: {
      ratio: '16:9',
      minHeight: false,
      maxHeight: false,
      selList: '.uk-slideshow-items',
      attrItem: 'uk-slideshow-item',
      selNav: '.uk-slideshow-nav',
      Animations: Animations$2
    },
    update: {
      read: function read() {
        var ref = this.ratio.split(':').map(Number);
        var width$$1 = ref[0];
        var height$$1 = ref[1];
        height$$1 = height$$1 * this.list.offsetWidth / width$$1;

        if (this.minHeight) {
          height$$1 = Math.max(this.minHeight, height$$1);
        }

        if (this.maxHeight) {
          height$$1 = Math.min(this.maxHeight, height$$1);
        }

        return {
          height: height$$1 - boxModelAdjust(this.list, 'content-box')
        };
      },
      write: function write(ref) {
        var height$$1 = ref.height;
        css(this.list, 'minHeight', height$$1);
      },
      events: ['resize']
    }
  };
  var Sortable = {
    mixins: [Class, Animate],
    props: {
      group: String,
      threshold: Number,
      clsItem: String,
      clsPlaceholder: String,
      clsDrag: String,
      clsDragState: String,
      clsBase: String,
      clsNoDrag: String,
      clsEmpty: String,
      clsCustom: String,
      handle: String
    },
    data: {
      group: false,
      threshold: 5,
      clsItem: 'uk-sortable-item',
      clsPlaceholder: 'uk-sortable-placeholder',
      clsDrag: 'uk-sortable-drag',
      clsDragState: 'uk-drag',
      clsBase: 'uk-sortable',
      clsNoDrag: 'uk-sortable-nodrag',
      clsEmpty: 'uk-sortable-empty',
      clsCustom: '',
      handle: false
    },
    created: function created() {
      var this$1 = this;
      ['init', 'start', 'move', 'end'].forEach(function (key) {
        var fn = this$1[key];

        this$1[key] = function (e) {
          this$1.scrollY = window.pageYOffset;
          var ref = getPos$1(e, 'page');
          var x = ref.x;
          var y = ref.y;
          this$1.pos = {
            x: x,
            y: y
          };
          fn(e);
        };
      });
    },
    events: {
      name: pointerDown,
      passive: false,
      handler: 'init'
    },
    update: {
      write: function write() {
        if (this.clsEmpty) {
          toggleClass(this.$el, this.clsEmpty, !this.$el.children.length);
        }

        css(this.handle ? $$(this.handle, this.$el) : this.$el.children, 'touchAction', 'none');

        if (!this.drag) {
          return;
        }

        offset(this.drag, {
          top: this.pos.y + this.origin.top,
          left: this.pos.x + this.origin.left
        });
        var ref = offset(this.drag);
        var top = ref.top;
        var offsetHeight = ref.height;
        var bottom = top + offsetHeight;
        var scroll;

        if (top > 0 && top < this.scrollY) {
          scroll = this.scrollY - 5;
        } else if (bottom < height(document) && bottom > height(window) + this.scrollY) {
          scroll = this.scrollY + 5;
        }

        scroll && setTimeout(function () {
          return scrollTop(window, scroll);
        }, 5);
      }
    },
    methods: {
      init: function init(e) {
        var target = e.target;
        var button = e.button;
        var defaultPrevented = e.defaultPrevented;
        var ref = toNodes(this.$el.children).filter(function (el) {
          return within(target, el);
        });
        var placeholder = ref[0];

        if (!placeholder || isInput(target) || this.handle && !within(target, this.handle) || button > 0 || within(target, "." + this.clsNoDrag) || defaultPrevented) {
          return;
        }

        e.preventDefault();
        this.touched = [this];
        this.placeholder = placeholder;
        this.origin = assign({
          target: target,
          index: _index(placeholder)
        }, this.pos);
        on(document, pointerMove, this.move);
        on(document, pointerUp, this.end);
        on(window, 'scroll', this.scroll);

        if (!this.threshold) {
          this.start(e);
        }
      },
      start: function start(e) {
        this.drag = append(this.$container, this.placeholder.outerHTML.replace(/^<li/i, '<div').replace(/li>$/i, 'div>'));
        css(this.drag, assign({
          boxSizing: 'border-box',
          width: this.placeholder.offsetWidth,
          height: this.placeholder.offsetHeight
        }, css(this.placeholder, ['paddingLeft', 'paddingRight', 'paddingTop', 'paddingBottom'])));
        attr(this.drag, 'uk-no-boot', '');
        addClass(this.drag, this.clsDrag, this.clsCustom);
        height(this.drag.firstElementChild, height(this.placeholder.firstElementChild));
        var ref = offset(this.placeholder);
        var left = ref.left;
        var top = ref.top;
        assign(this.origin, {
          left: left - this.pos.x,
          top: top - this.pos.y
        });
        addClass(this.placeholder, this.clsPlaceholder);
        addClass(this.$el.children, this.clsItem);
        addClass(document.documentElement, this.clsDragState);
        trigger(this.$el, 'start', [this, this.placeholder]);
        this.move(e);
      },
      move: function move(e) {
        if (!this.drag) {
          if (Math.abs(this.pos.x - this.origin.x) > this.threshold || Math.abs(this.pos.y - this.origin.y) > this.threshold) {
            this.start(e);
          }

          return;
        }

        this.$emit();
        var target = e.type === 'mousemove' ? e.target : document.elementFromPoint(this.pos.x - window.pageXOffset, this.pos.y - window.pageYOffset);
        var sortable = this.getSortable(target);
        var previous = this.getSortable(this.placeholder);
        var move = sortable !== previous;

        if (!sortable || within(target, this.placeholder) || move && (!sortable.group || sortable.group !== previous.group)) {
          return;
        }

        target = sortable.$el === target.parentNode && target || toNodes(sortable.$el.children).filter(function (element) {
          return within(target, element);
        })[0];

        if (move) {
          previous.remove(this.placeholder);
        } else if (!target) {
          return;
        }

        sortable.insert(this.placeholder, target);

        if (!includes(this.touched, sortable)) {
          this.touched.push(sortable);
        }
      },
      end: function end(e) {
        off(document, pointerMove, this.move);
        off(document, pointerUp, this.end);
        off(window, 'scroll', this.scroll);

        if (!this.drag) {
          if (e.type === 'touchend') {
            e.target.click();
          }

          return;
        }

        preventClick();
        var sortable = this.getSortable(this.placeholder);

        if (this === sortable) {
          if (this.origin.index !== _index(this.placeholder)) {
            trigger(this.$el, 'moved', [this, this.placeholder]);
          }
        } else {
          trigger(sortable.$el, 'added', [sortable, this.placeholder]);
          trigger(this.$el, 'removed', [this, this.placeholder]);
        }

        trigger(this.$el, 'stop', [this, this.placeholder]);

        _remove(this.drag);

        this.drag = null;
        var classes = this.touched.map(function (sortable) {
          return sortable.clsPlaceholder + " " + sortable.clsItem;
        }).join(' ');
        this.touched.forEach(function (sortable) {
          return removeClass(sortable.$el.children, classes);
        });
        removeClass(document.documentElement, this.clsDragState);
      },
      scroll: function scroll() {
        var scroll = window.pageYOffset;

        if (scroll !== this.scrollY) {
          this.pos.y += scroll - this.scrollY;
          this.scrollY = scroll;
          this.$emit();
        }
      },
      insert: function insert(element, target) {
        var this$1 = this;
        addClass(this.$el.children, this.clsItem);

        var insert = function insert() {
          if (target) {
            if (!within(element, this$1.$el) || isPredecessor(element, target)) {
              before(target, element);
            } else {
              after(target, element);
            }
          } else {
            append(this$1.$el, element);
          }
        };

        if (this.animation) {
          this.animate(insert);
        } else {
          insert();
        }
      },
      remove: function remove(element) {
        if (!within(element, this.$el)) {
          return;
        }

        if (this.animation) {
          this.animate(function () {
            return _remove(element);
          });
        } else {
          _remove(element);
        }
      },
      getSortable: function getSortable(element) {
        return element && (this.$getComponent(element, 'sortable') || this.getSortable(element.parentNode));
      }
    }
  };

  function isPredecessor(element, target) {
    return element.parentNode === target.parentNode && _index(element) > _index(target);
  }

  var obj$1;
  var actives = [];
  var Tooltip = {
    mixins: [Container, Togglable, Position],
    args: 'title',
    props: {
      delay: Number,
      title: String
    },
    data: {
      pos: 'top',
      title: '',
      delay: 0,
      animation: ['uk-animation-scale-up'],
      duration: 100,
      cls: 'uk-active',
      clsPos: 'uk-tooltip'
    },
    beforeConnect: function beforeConnect() {
      this._hasTitle = hasAttr(this.$el, 'title');
      attr(this.$el, {
        title: '',
        'aria-expanded': false
      });
    },
    disconnected: function disconnected() {
      this.hide();
      attr(this.$el, {
        title: this._hasTitle ? this.title : null,
        'aria-expanded': null
      });
    },
    methods: {
      show: function show() {
        var this$1 = this;

        if (includes(actives, this)) {
          return;
        }

        actives.forEach(function (active) {
          return active.hide();
        });
        actives.push(this);
        this._unbind = on(document, pointerUp, function (e) {
          return !within(e.target, this$1.$el) && this$1.hide();
        });
        clearTimeout(this.showTimer);
        this.showTimer = setTimeout(function () {
          this$1._show();

          this$1.hideTimer = setInterval(function () {
            if (!isVisible(this$1.$el)) {
              this$1.hide();
            }
          }, 150);
        }, this.delay);
      },
      hide: function hide() {
        var index$$1 = actives.indexOf(this);

        if (!~index$$1 || matches(this.$el, 'input') && this.$el === document.activeElement) {
          return;
        }

        actives.splice(index$$1, 1);
        clearTimeout(this.showTimer);
        clearInterval(this.hideTimer);
        attr(this.$el, 'aria-expanded', false);
        this.toggleElement(this.tooltip, false);
        this.tooltip && _remove(this.tooltip);
        this.tooltip = false;

        this._unbind();
      },
      _show: function _show() {
        this.tooltip = append(this.container, "<div class=\"" + this.clsPos + "\" aria-expanded=\"true\" aria-hidden> <div class=\"" + this.clsPos + "-inner\">" + this.title + "</div> </div>");
        this.positionAt(this.tooltip, this.$el);
        this.origin = this.getAxis() === 'y' ? flipPosition(this.dir) + "-" + this.align : this.align + "-" + flipPosition(this.dir);
        this.toggleElement(this.tooltip, true);
      }
    },
    events: (obj$1 = {}, obj$1["focus " + pointerEnter + " " + pointerDown] = function (e) {
      if (e.type !== pointerDown || !isTouch(e)) {
        this.show();
      }
    }, obj$1.blur = 'hide', obj$1[pointerLeave] = function (e) {
      if (!isTouch(e)) {
        this.hide();
      }
    }, obj$1)
  };
  var Upload = {
    props: {
      allow: String,
      clsDragover: String,
      concurrent: Number,
      maxSize: Number,
      method: String,
      mime: String,
      msgInvalidMime: String,
      msgInvalidName: String,
      msgInvalidSize: String,
      multiple: Boolean,
      name: String,
      params: Object,
      type: String,
      url: String
    },
    data: {
      allow: false,
      clsDragover: 'uk-dragover',
      concurrent: 1,
      maxSize: 0,
      method: 'POST',
      mime: false,
      msgInvalidMime: 'Invalid File Type: %s',
      msgInvalidName: 'Invalid File Name: %s',
      msgInvalidSize: 'Invalid File Size: %s Kilobytes Max',
      multiple: false,
      name: 'files[]',
      params: {},
      type: '',
      url: '',
      abort: noop,
      beforeAll: noop,
      beforeSend: noop,
      complete: noop,
      completeAll: noop,
      error: noop,
      fail: noop,
      load: noop,
      loadEnd: noop,
      loadStart: noop,
      progress: noop
    },
    events: {
      change: function change(e) {
        if (!matches(e.target, 'input[type="file"]')) {
          return;
        }

        e.preventDefault();

        if (e.target.files) {
          this.upload(e.target.files);
        }

        e.target.value = '';
      },
      drop: function drop(e) {
        stop(e);
        var transfer = e.dataTransfer;

        if (!transfer || !transfer.files) {
          return;
        }

        removeClass(this.$el, this.clsDragover);
        this.upload(transfer.files);
      },
      dragenter: function dragenter(e) {
        stop(e);
      },
      dragover: function dragover(e) {
        stop(e);
        addClass(this.$el, this.clsDragover);
      },
      dragleave: function dragleave(e) {
        stop(e);
        removeClass(this.$el, this.clsDragover);
      }
    },
    methods: {
      upload: function upload(files) {
        var this$1 = this;

        if (!files.length) {
          return;
        }

        trigger(this.$el, 'upload', [files]);

        for (var i = 0; i < files.length; i++) {
          if (this.maxSize && this.maxSize * 1000 < files[i].size) {
            this.fail(this.msgInvalidSize.replace('%s', this.maxSize));
            return;
          }

          if (this.allow && !match$1(this.allow, files[i].name)) {
            this.fail(this.msgInvalidName.replace('%s', this.allow));
            return;
          }

          if (this.mime && !match$1(this.mime, files[i].type)) {
            this.fail(this.msgInvalidMime.replace('%s', this.mime));
            return;
          }
        }

        if (!this.multiple) {
          files = [files[0]];
        }

        this.beforeAll(this, files);
        var chunks = chunk(files, this.concurrent);

        var upload = function upload(files) {
          var data$$1 = new FormData();
          files.forEach(function (file) {
            return data$$1.append(this$1.name, file);
          });

          for (var key in this$1.params) {
            data$$1.append(key, this$1.params[key]);
          }

          ajax(this$1.url, {
            data: data$$1,
            method: this$1.method,
            responseType: this$1.type,
            beforeSend: function beforeSend(env) {
              var xhr = env.xhr;
              xhr.upload && on(xhr.upload, 'progress', this$1.progress);
              ['loadStart', 'load', 'loadEnd', 'abort'].forEach(function (type) {
                return on(xhr, type.toLowerCase(), this$1[type]);
              });
              this$1.beforeSend(env);
            }
          }).then(function (xhr) {
            this$1.complete(xhr);

            if (chunks.length) {
              upload(chunks.shift());
            } else {
              this$1.completeAll(xhr);
            }
          }, function (e) {
            return this$1.error(e);
          });
        };

        upload(chunks.shift());
      }
    }
  };

  function match$1(pattern, path) {
    return path.match(new RegExp("^" + pattern.replace(/\//g, '\\/').replace(/\*\*/g, '(\\/[^\\/]+)*').replace(/\*/g, '[^\\/]+').replace(/((?!\\))\?/g, '$1.') + "$", 'i'));
  }

  function chunk(files, size) {
    var chunks = [];

    for (var i = 0; i < files.length; i += size) {
      var chunk = [];

      for (var j = 0; j < size; j++) {
        chunk.push(files[i + j]);
      }

      chunks.push(chunk);
    }

    return chunks;
  }

  function stop(e) {
    e.preventDefault();
    e.stopPropagation();
  }

  UIkit.component('countdown', Countdown);
  UIkit.component('filter', Filter);
  UIkit.component('lightbox', Lightbox);
  UIkit.component('lightboxPanel', LightboxPanel);
  UIkit.component('notification', Notification);
  UIkit.component('parallax', Parallax$1);
  UIkit.component('slider', Slider$1);
  UIkit.component('sliderParallax', SliderParallax);
  UIkit.component('slideshow', Slideshow$1);
  UIkit.component('slideshowParallax', SliderParallax);
  UIkit.component('sortable', Sortable);
  UIkit.component('tooltip', Tooltip);
  UIkit.component('upload', Upload);
  {
    boot(UIkit);
  }
  return UIkit;
});

}).call(this,require("timers").setImmediate)

},{"timers":365}],367:[function(require,module,exports){
"use strict";

require("babel-polyfill");

var _uikit = _interopRequireDefault(require("uikit"));

var _icons = _interopRequireDefault(require("./icons"));

var _header = require("./components/header");

var _plazaHeader = _interopRequireDefault(require("./components/plaza-header"));

var _productCarousel = _interopRequireDefault(require("./components/product-carousel"));

var _textScroller = _interopRequireDefault(require("./components/text-scroller"));

var _heroCarousel = _interopRequireDefault(require("./components/hero-carousel"));

var _searchModal = _interopRequireDefault(require("./components/search-modal"));

var _directionsMap = _interopRequireDefault(require("./components/directions-map"));

var _heroVideo = _interopRequireDefault(require("./components/hero-video"));

var _heroSlider = _interopRequireDefault(require("./components/hero-slider"));

var _heroScroller = _interopRequireDefault(require("./components/hero-scroller"));

var _contactFormValidation = _interopRequireDefault(require("./components/contact-form-validation"));

var _formValidation = _interopRequireDefault(require("./components/form-validation"));

var _googleMap = _interopRequireDefault(require("./components/google-map"));

var _productSlider = _interopRequireDefault(require("./components/product-slider"));

var _movieSlider = _interopRequireDefault(require("./components/movie-slider"));

var _eventGrid = _interopRequireDefault(require("./components/event-grid"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }

/* global document, window */
// import Icons from 'uikit/dist/js/uikit-icons';
// loads the Icon plugin
_uikit["default"].use(_icons["default"]); // add uikit globally


window.UIkit = _uikit["default"]; // load custom components here

window.validateForm = _formValidation["default"];
document.addEventListener('DOMContentLoaded', function () {
  // initialise mobile navigation
  var mobileNav = new _header.MobileNavigation();
  mobileNav.init();
  var mainNav = new _header.MainNavigation();
  mainNav.init();
  var plazaMobileNav = new _plazaHeader["default"]();
  plazaMobileNav.init();
  (0, _textScroller["default"])();
  (0, _productCarousel["default"])();
  (0, _productSlider["default"])();
  (0, _heroCarousel["default"])();
  (0, _searchModal["default"])();
  (0, _directionsMap["default"])();
  (0, _heroVideo["default"])();
  (0, _heroSlider["default"])();
  (0, _heroScroller["default"])();
  (0, _contactFormValidation["default"])();
  (0, _googleMap["default"])();
  (0, _movieSlider["default"])();
  (0, _eventGrid["default"])();
});

},{"./components/contact-form-validation":368,"./components/directions-map":369,"./components/event-grid":370,"./components/form-validation":371,"./components/google-map":373,"./components/header":374,"./components/hero-carousel":375,"./components/hero-scroller":376,"./components/hero-slider":377,"./components/hero-video":378,"./components/movie-slider":379,"./components/plaza-header":380,"./components/product-carousel":381,"./components/product-slider":382,"./components/search-modal":383,"./components/text-scroller":384,"./icons":385,"babel-polyfill":26,"uikit":366}],368:[function(require,module,exports){
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports["default"] = void 0;

var _axios = _interopRequireDefault(require("axios"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }

function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _nonIterableSpread(); }

function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance"); }

function _iterableToArray(iter) { if (Symbol.iterator in Object(iter) || Object.prototype.toString.call(iter) === "[object Arguments]") return Array.from(iter); }

function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = new Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } }

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }

function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }

var postURL = '/AFGGenericAsynchronousFormHandler/asynchronousServlet.do';

var ContactFormValidation =
/*#__PURE__*/
function () {
  function ContactFormValidation(contactFormContainer) {
    _classCallCheck(this, ContactFormValidation);

    this.container = contactFormContainer;
    this.errors = [];
    this.formSubmitted = false;
  }

  _createClass(ContactFormValidation, [{
    key: "init",
    value: function init() {
      this.firstName = this.container.querySelector('.js-firstName');
      this.lastName = this.container.querySelector('.js-lastName');
      this.emailAddress = this.container.querySelector('.js-emailAddress');
      this.mobileNumber = this.container.querySelector('.js-mobileNumber');
      this.subject = this.container.querySelector('.js-subject');
      this.message = this.container.querySelector('.js-message');
      this.resetButton = this.container.querySelector('.js-resetForm');
      this.submitButton = this.container.querySelector('.js-submitForm');
      this.errorMessage = this.container.querySelector('.js-errorMessage');
      this.successMessage = this.container.querySelector('.js-successMessage');
      this.contactForm = this.container.querySelector('.js-contactForm');
      this.resetForm = this.resetForm.bind(this);
      this.submitForm = this.submitForm.bind(this);
      this.validateForm = this.validateForm.bind(this); // add event listeners

      this.resetButton.addEventListener('click', this.resetForm, false);
      this.submitButton.addEventListener('click', this.submitForm, false);
      var inputs = [].concat(_toConsumableArray(this.container.getElementsByTagName('input')), _toConsumableArray(this.container.getElementsByTagName('textarea')));

      for (var i = 0; i < inputs.length; i += 1) {
        inputs[i].addEventListener('blur', this.validateForm, false);
      }
    }
  }, {
    key: "validateForm",
    value: function validateForm() {
      if (!this.formSubmitted) {
        return;
      }

      this.errors = [];
      var firstName = this.firstName.getElementsByTagName('input')[0].value;
      var lastName = this.lastName.getElementsByTagName('input')[0].value;
      var emailAddress = this.emailAddress.getElementsByTagName('input')[0].value;
      var mobileNumber = this.mobileNumber.getElementsByTagName('input')[0].value;
      var subject = this.subject.getElementsByTagName('input')[0].value;
      var message = this.message.getElementsByTagName('textarea')[0].value; // validate first name

      if (firstName.length > 2) {
        this.firstName.querySelector('.js-validation-message').classList.add('uk-hidden');
      } else {
        this.firstName.querySelector('.js-validation-message').classList.remove('uk-hidden');
        this.errors.push('first name is required');
      } // validate last name


      if (lastName.length > 2) {
        this.lastName.querySelector('.js-validation-message').classList.add('uk-hidden');
      } else {
        this.lastName.querySelector('.js-validation-message').classList.remove('uk-hidden');
        this.errors.push('last name is required');
      } // validate email address


      if (ContactFormValidation.validateEmailAddress(emailAddress)) {
        this.emailAddress.querySelector('.js-validation-message').classList.add('uk-hidden');
      } else {
        this.emailAddress.querySelector('.js-validation-message').classList.remove('uk-hidden');
        this.errors.push('email address is required');
      } // validate mobile number


      if (ContactFormValidation.validateMobileNumber(mobileNumber)) {
        this.mobileNumber.querySelector('.js-validation-message').classList.add('uk-hidden');
      } else {
        this.mobileNumber.querySelector('.js-validation-message').classList.remove('uk-hidden');
        this.errors.push('mobile number is required');
      } // validate subject


      if (subject.length > 2) {
        this.subject.querySelector('.js-validation-message').classList.add('uk-hidden');
      } else {
        this.subject.querySelector('.js-validation-message').classList.remove('uk-hidden');
        this.errors.push('subject is required');
      } // validate message


      if (message.length > 2 && message.length < 500) {
        this.message.querySelector('.js-validation-message').classList.add('uk-hidden');
      } else {
        this.message.querySelector('.js-validation-message').classList.remove('uk-hidden');
        this.errors.push('message is required');
      }
    }
  }, {
    key: "submitForm",
    value: function submitForm(e) {
      var _this = this;

      e.preventDefault();
      this.formSubmitted = true;
      this.validateForm();

      if (this.errors.length > 0) {
        return;
      }

      var firstName = this.firstName.getElementsByTagName('input')[0].value;
      var lastName = this.lastName.getElementsByTagName('input')[0].value;
      var emailAddress = this.emailAddress.getElementsByTagName('input')[0].value;
      var mobileNumber = this.mobileNumber.getElementsByTagName('input')[0].value;
      var subject = this.subject.getElementsByTagName('input')[0].value;
      var message = this.message.getElementsByTagName('textarea')[0].value;
      var formData = "FIRST_NAME=".concat(firstName, "&LAST_NAME=").concat(lastName, "&EMAIL=").concat(emailAddress, "&MOBILE_NUMBER=").concat(mobileNumber, "&&SUBJECT=").concat(subject, "&MESSAGE=").concat(message);
      formData += '&_afg-common-site=DubaiFestivalCity&_afg-common-function=Contact Us&OMMIT_PARAM=REQUEST_SERIAL_NUMBER';
      var options = {
        method: 'post',
        url: postURL,
        data: formData,
        config: {
          headers: {
            'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8'
          }
        }
      }; // disable submit button

      this.submitButton.disabled = true;
      (0, _axios["default"])(options).then(function () {
        _this.showConfirmation();
      })["catch"](function () {
        _this.showError();
      });
    }
  }, {
    key: "showError",
    value: function showError() {
      this.errorMessage.classList.remove('uk-hidden');
      this.submitButton.disabled = false;
    }
  }, {
    key: "showConfirmation",
    value: function showConfirmation() {
      this.successMessage.classList.remove('uk-hidden');
      this.contactForm.classList.add('uk-hidden');
    } // reset the form to original state

  }, {
    key: "resetForm",
    value: function resetForm(e) {
      e.preventDefault();
      this.formSubmitted = false;
      this.errorMessage.classList.add('uk-hidden');
      var inputs = [].concat(_toConsumableArray(this.container.getElementsByTagName('input')), _toConsumableArray(this.container.getElementsByTagName('textarea')));

      for (var i = 0; i < inputs.length; i += 1) {
        inputs[i].value = '';
      }

      var validationMessages = this.container.querySelectorAll('.js-validation-message');

      for (var _i = 0; _i < validationMessages.length; _i += 1) {
        validationMessages[_i].classList.add('uk-hidden');
      }
    }
  }], [{
    key: "validateMobileNumber",
    value: function validateMobileNumber(number) {
      if (number.length < 8 || number.length > 14) {
        return false;
      }

      var filter = /^[\+\d]?(?:[\d-.\s()]*)$/;
      return filter.test(number);
    }
  }, {
    key: "validateEmailAddress",
    value: function validateEmailAddress(email) {
      if (email.length < 2) {
        return false;
      }

      var filter = /^(?=.{8,254}$)((?:([a-zA-Z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-zA-Z0-9!#$%&'*+/=?^_`{|}~-]+)*)|"(?=.{2,248}")(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])*")@(?:(?:[a-zA-Z0-9](?:[a-zA-Z0-9-]*[a-zA-Z0-9]){1,63}?\.)+[a-zA-Z0-9]((?:[a-zA-Z0-9-]*[a-zA-Z0-9]){1,63})|\[(?:(?:(2(5[0-5]|[0-4][0-9])|1[0-9][0-9]|[1-9]?[0-9]))\.){3}(?:(2(5[0-5]|[0-4][0-9])|1[0-9][0-9]|[1-9]?[0-9])|[a-zA-Z0-9-]*[a-zA-Z0-9]:(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21-\x5a\x53-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])+)\]))$/;
      return filter.test(email);
    }
  }]);

  return ContactFormValidation;
}();

function createContactFormValidation() {
  var contactForms = document.querySelectorAll('.js-contact-form-container');

  if (contactForms.length === 0) {
    return null;
  }

  for (var i = 0; i < contactForms.length; i += 1) {
    var contactForm = new ContactFormValidation(contactForms[i]);
    contactForm.init();
  }

  return null;
}

var _default = createContactFormValidation;
exports["default"] = _default;

},{"axios":1}],369:[function(require,module,exports){
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports["default"] = void 0;

var _googleMapStyles = _interopRequireDefault(require("./google-map-styles"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }

function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }

var DirectionsMap =
/*#__PURE__*/
function () {
  function DirectionsMap(directionsMap) {
    _classCallCheck(this, DirectionsMap);

    // elements
    this.directionsMap = directionsMap;
    this.mapElement = directionsMap.querySelector('.js-map');
    this.mapPanel = directionsMap.querySelector('.js-map-panel');
    this.mode = directionsMap.querySelector('.js-mode').value;
    this.location = null;
    this.end = directionsMap.querySelector('.js-end').value;
    this.goButton = directionsMap.querySelector('.js-go');
    this.apiKey = directionsMap.querySelector('.js-google-api-key').value;
    this.lang = document.getElementsByTagName('html')[0].getAttribute('lang');
    this.mapContainer = directionsMap.querySelector('.js-map-container');
    this.spinner = directionsMap.querySelector('.js-spinner');
    this.mapError = directionsMap.querySelector('.js-map-error');
    this.input = directionsMap.querySelector('.js-start');
  }

  _createClass(DirectionsMap, [{
    key: "init",
    value: function init() {
      // bind event listeners
      this.setLocation = this.setLocation.bind(this);
      this.locationError = this.locationError.bind(this);
      this.setUpMap = this.setUpMap.bind(this);
      this.handleGoButton = this.handleGoButton.bind(this);
      this.handleEnter = this.handleEnter.bind(this);
      this.setAddressInput = this.setAddressInput.bind(this); // setup event listener

      this.goButton.addEventListener('click', this.handleGoButton, false);
      this.input.addEventListener('keyup', this.handleEnter, false); // get the users location using html5 navigator

      this.getLocation(); // start google maps api

      var tag = document.createElement('script');
      tag.src = "https://maps.googleapis.com/maps/api/js?key=".concat(this.apiKey, "&callback=initMap&language=").concat(this.lang); // inset script tage on page

      var firstScriptTag = document.getElementsByTagName('script')[0];
      firstScriptTag.parentNode.insertBefore(tag, firstScriptTag);
      this.showMap(); // set up map when ready

      window.initMap = this.setUpMap;
    }
  }, {
    key: "handleGoButton",
    value: function handleGoButton(e) {
      e.preventDefault();
      this.location = this.input.value;

      if (this.location) {
        this.calculateAndDisplayRoute(this.location);
      }
    }
  }, {
    key: "handleEnter",
    value: function handleEnter(e) {
      e.preventDefault(); // if push enter

      if (e.keyCode === 13) {
        this.location = this.input.value;

        if (this.location) {
          this.calculateAndDisplayRoute(this.location);
        }
      }
    }
  }, {
    key: "setUpMap",
    value: function setUpMap() {
      this.directionsService = new google.maps.DirectionsService();
      this.directionsDisplay = new google.maps.DirectionsRenderer();
      this.geocoder = new google.maps.Geocoder();
      this.map = new google.maps.Map(this.mapElement, {
        zoom: 7,
        styles: _googleMapStyles["default"],
        center: {
          lat: 25.2198389,
          lng: 55.3403341
        }
      });
      this.directionsDisplay.setMap(this.map);
      this.directionsDisplay.setPanel(this.mapPanel);
    } // get the address from latlong

  }, {
    key: "getAddress",
    value: function getAddress() {
      var _this = this;

      this.geocoder.geocode({
        latLng: this.location
      }, function (results, status) {
        if (status === google.maps.GeocoderStatus.OK) {
          if (results[1].formatted_address) {
            _this.setAddressInput(results[1].formatted_address);
          }
        }
      });
    }
  }, {
    key: "calculateAndDisplayRoute",
    value: function calculateAndDisplayRoute(location) {
      var _this2 = this;

      this.mode = this.directionsMap.querySelector('.js-mode').value;
      this.directionsService.route({
        origin: location,
        destination: this.end,
        travelMode: google.maps.TravelMode[this.mode]
      }, function (response, status) {
        _this2.showMap();

        if (status === 'OK') {
          _this2.directionsDisplay.setDirections(response);

          _this2.hideError();
        } else {
          _this2.showError(status);
        }
      });
    }
  }, {
    key: "setLocation",
    value: function setLocation(pos) {
      if (pos) {
        this.location = new google.maps.LatLng(pos.coords.latitude, pos.coords.longitude);
        this.getAddress();
        this.calculateAndDisplayRoute(this.location);
      }
    }
  }, {
    key: "setAddressInput",
    value: function setAddressInput(address) {
      this.input.value = address;
    }
  }, {
    key: "getLocation",
    value: function getLocation() {
      // if browser supports geolocation try and get otherwise show map
      if (navigator.geolocation) {
        navigator.geolocation.getCurrentPosition(this.setLocation, this.locationError);
      } else {
        this.showMap();
      }
    }
  }, {
    key: "locationError",
    value: function locationError() {
      this.showMap();
    }
  }, {
    key: "showError",
    value: function showError(error) {
      var message = 'A route could not be found';

      if (error === 'NOT_FOUND') {
        message = 'A route could not be found';
      }

      this.mapError.innerHTML = "<p>".concat(message, "</p>");
      this.mapPanel.classList.add('uk-hidden');
      this.mapError.classList.remove('uk-hidden');
    }
  }, {
    key: "hideError",
    value: function hideError() {
      this.mapPanel.classList.remove('uk-hidden');
      this.mapError.classList.add('uk-hidden');
    }
  }, {
    key: "showMap",
    value: function showMap() {
      this.mapContainer.classList.remove('uk-hidden');
      this.spinner.classList.add('uk-hidden');
    }
  }, {
    key: "hideMap",
    value: function hideMap() {
      this.mapContainer.classList.add('uk-hidden');
      this.spinner.classList.remove('uk-hidden');
    }
  }]);

  return DirectionsMap;
}();

function createDirectionsMap() {
  var directionsMaps = document.querySelectorAll('.js-directions-map');

  if (directionsMaps.length === 0) {
    return null;
  }

  for (var i = 0; i < directionsMaps.length; i += 1) {
    var directionsMap = new DirectionsMap(directionsMaps[i]);
    directionsMap.init();
  }

  return null;
}

var _default = createDirectionsMap;
exports["default"] = _default;

},{"./google-map-styles":372}],370:[function(require,module,exports){
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports["default"] = void 0;

var _masonryLayout = _interopRequireDefault(require("masonry-layout"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }

function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }

var EventGrid =
/*#__PURE__*/
function () {
  function EventGrid(eventGrid) {
    _classCallCheck(this, EventGrid);

    this.eventGrid = eventGrid;
    this.masonry = null;
  }

  _createClass(EventGrid, [{
    key: "init",
    value: function init() {
      this.masonry = new _masonryLayout["default"](this.eventGrid, {
        // options
        itemSelector: '.bk-event-grid__item',
        columnWidth: '.bk-event-grid__sizer',
        percentPosition: true,
        gutter: '.bk-event-grid__gutter-sizer'
      });
    }
  }]);

  return EventGrid;
}();

function EventGridInit() {
  var eventGrids = document.querySelectorAll('.js-event-grid');

  if (eventGrids.length === 0) {
    return null;
  }

  for (var i = 0; i < eventGrids.length; i += 1) {
    var eventGrid = new EventGrid(eventGrids[i]);
    eventGrid.init();
  }

  return null;
}

var _default = EventGridInit;
exports["default"] = _default;

},{"masonry-layout":358}],371:[function(require,module,exports){
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports["default"] = void 0;

function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _nonIterableSpread(); }

function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance"); }

function _iterableToArray(iter) { if (Symbol.iterator in Object(iter) || Object.prototype.toString.call(iter) === "[object Arguments]") return Array.from(iter); }

function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = new Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } }

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }

function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }

var FormValidation =
/*#__PURE__*/
function () {
  function FormValidation(contactFormElement) {
    _classCallCheck(this, FormValidation);

    this.container = contactFormElement;
    this.errors = [];
    this.formSubmitted = false;
  }

  _createClass(FormValidation, [{
    key: "init",
    value: function init() {
      this.resetForm = this.resetForm.bind(this);
      this.validateForm = this.validateForm.bind(this);
      this.resetButton = this.container.querySelector('.js-reset-button'); // add event listeners

      if (this.resetButton) {
        this.resetButton.addEventListener('click', this.resetForm, false);
      } // elements to be validated


      this.addBlurEvents();
    }
  }, {
    key: "addBlurEvents",
    value: function addBlurEvents() {
      this.inputs = [].concat(_toConsumableArray(this.container.getElementsByTagName('input')), _toConsumableArray(this.container.getElementsByTagName('textarea')), _toConsumableArray(this.container.getElementsByTagName('select')), _toConsumableArray(this.container.querySelectorAll('.js-validation-radio')));

      for (var i = 0; i < this.inputs.length; i += 1) {
        this.inputs[i].addEventListener('blur', this.validateForm, false);
      }
    }
  }, {
    key: "updateForm",
    value: function updateForm() {
      this.addBlurEvents();
    }
  }, {
    key: "submittedForm",
    value: function submittedForm() {
      this.formSubmitted = true;
    }
  }, {
    key: "validateForm",
    value: function validateForm() {
      if (!this.formSubmitted) {
        return;
      }

      this.resetValidation();
      this.errors = [];

      for (var i = 0; i < this.inputs.length; i += 1) {
        var input = this.inputs[i];
        var parent = input.parentNode; // required

        if (input.classList.contains('js-validation-required')) {
          // checkbox
          if (input.type === 'checkbox') {
            if (!input.checked) {
              this.showValidationMessage(parent, input);
            } // text inputs and areas

          } else if (input.value.length === 0) {
            this.showValidationMessage(parent, input);
          }
        } // radio validation


        if (input.classList.contains('js-validation-radio')) {
          var radios = input.getElementsByTagName('input');
          var radioSelected = false;

          for (var j = 0; j < radios.length; j += 1) {
            if (radios[j].checked === true) {
              radioSelected = true;
            }
          }

          if (!radioSelected) {
            this.showValidationMessage(parent, input);
          }
        }

        if (input.value && input.value.length > 0) {
          // email validation
          if (input.classList.contains('js-validation-email')) {
            if (!FormValidation.validateEmailAddress(input.value)) {
              this.showValidationMessage(parent, input);
            }
          } // mobile validation


          if (input.classList.contains('js-validation-mobile')) {
            if (!FormValidation.validateMobileNumber(input.value)) {
              this.showValidationMessage(parent, input);
            }
          } // Name only validation
          // Alphabet, spaces and min 3 characters


          if (input.classList.contains('js-validation-name')) {
            if (!FormValidation.onlyAlphabetValidation(input.value) || input.value.length <= 2) {
              this.showValidationMessage(parent, input);
            }
          } // Alphabet only validation


          if (input.classList.contains('js-validation-alpha-only')) {
            if (!FormValidation.onlyAlphabetValidation(input.value)) {
              this.showValidationMessage(parent, input);
            }
          } // Number only validation


          if (input.classList.contains('js-validation-number-only')) {
            if (!FormValidation.onlyNumberValidation(input.value)) {
              this.showValidationMessage(parent, input);
            }
          } // Number only validation


          if (input.classList.contains('js-validation-child')) {
            if (!FormValidation.onlyNumberValidation(input.value) || Number(input.value) > 12 || Number(input.value) < 0) {
              this.showValidationMessage(parent, input);
            }
          }
        }
      }

      return this.errors;
    }
  }, {
    key: "showValidationMessage",
    value: function showValidationMessage(parent, error) {
      var element = parent.querySelector('.js-validation-message');

      if (element) {
        this.errors.push(error);
        element.classList.remove('uk-hidden');
      }
    }
  }, {
    key: "resetValidation",
    value: function resetValidation() {
      var validationMessages = this.container.querySelectorAll('.js-validation-message');

      for (var i = 0; i < validationMessages.length; i += 1) {
        validationMessages[i].classList.add('uk-hidden');
      }
    } // reset the form to original state

  }, {
    key: "resetForm",
    value: function resetForm(e) {
      e.preventDefault();
      this.formSubmitted = false; // this.errorMessage.classList.add('uk-hidden');

      for (var i = 0; i < this.inputs.length; i += 1) {
        // reset text inputs, text areas and date
        if (this.inputs[i].value) {
          this.inputs[i].value = '';
        } // reset checkbox and radio buttons


        if (this.inputs[i].checked) {
          this.inputs[i].checked = false;
        }
      }

      this.resetValidation();
    }
  }], [{
    key: "validateMobileNumber",
    value: function validateMobileNumber(number) {
      if (number.length < 8 || number.length > 14) {
        return false;
      }

      var filter = /^[\+\d]?(?:[\d-.\s()]*)$/;
      return filter.test(number);
    }
  }, {
    key: "onlyAlphabetValidation",
    value: function onlyAlphabetValidation(value) {
      var filter = /^[a-zA-Z\s]*$/;
      return filter.test(value);
    }
  }, {
    key: "onlyNumberValidation",
    value: function onlyNumberValidation(value) {
      var filter = /^\d+$/;
      return filter.test(value);
    }
  }, {
    key: "validateEmailAddress",
    value: function validateEmailAddress(email) {
      if (email.length < 2) {
        return false;
      }

      var filter = /^(?=.{8,254}$)((?:([a-zA-Z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-zA-Z0-9!#$%&'*+/=?^_`{|}~-]+)*)|"(?=.{2,248}")(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])*")@(?:(?:[a-zA-Z0-9](?:[a-zA-Z0-9-]*[a-zA-Z0-9]){1,63}?\.)+[a-zA-Z0-9]((?:[a-zA-Z0-9-]*[a-zA-Z0-9]){1,63})|\[(?:(?:(2(5[0-5]|[0-4][0-9])|1[0-9][0-9]|[1-9]?[0-9]))\.){3}(?:(2(5[0-5]|[0-4][0-9])|1[0-9][0-9]|[1-9]?[0-9])|[a-zA-Z0-9-]*[a-zA-Z0-9]:(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21-\x5a\x53-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])+)\]))$/;
      return filter.test(email);
    }
  }]);

  return FormValidation;
}();

var _default = FormValidation;
exports["default"] = _default;

},{}],372:[function(require,module,exports){
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports["default"] = void 0;
var _default = [{
  featureType: 'administrative',
  elementType: 'labels.text.fill',
  stylers: [{
    color: '#444444'
  }]
}, {
  featureType: 'landscape',
  elementType: 'all',
  stylers: [{
    color: '#F8F8F8'
  }]
}, {
  featureType: 'poi',
  elementType: 'all',
  stylers: [{
    visibility: 'on'
  }]
}, {
  featureType: 'poi.park',
  elementType: 'all',
  stylers: [{
    visibility: 'off'
  }]
}, {
  featureType: 'road',
  elementType: 'all',
  stylers: []
}, {
  featureType: 'road',
  elementType: 'geometry',
  stylers: [{
    color: '#D5D6D8'
  }]
}, {
  featureType: 'road.arterial',
  elementType: 'labels.icon',
  stylers: [{
    visibility: 'on'
  }]
}, {
  featureType: 'transit',
  elementType: 'all',
  stylers: [{
    visibility: 'on'
  }]
}, {
  featureType: 'water',
  elementType: 'all',
  stylers: [{
    color: '#6CBFD6'
  }, {
    visibility: 'on'
  }]
}];
exports["default"] = _default;

},{}],373:[function(require,module,exports){
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports["default"] = void 0;

var _googleMapStyles = _interopRequireDefault(require("./google-map-styles"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }

function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }

var GoogleMap =
/*#__PURE__*/
function () {
  function GoogleMap(container) {
    _classCallCheck(this, GoogleMap);

    this.container = container;
  }

  _createClass(GoogleMap, [{
    key: "init",
    value: function init() {
      // get the elements
      this.googleMapScript = document.getElementById('js-google-map-script');
      this.zoom = parseInt(this.container.getAttribute('data-zoom'), 10);
      this.lat = parseFloat(this.container.getAttribute('data-lat'));
      this.lng = parseFloat(this.container.getAttribute('data-lng'));
      this.key = this.container.getAttribute('data-key');
      this.title = this.container.getAttribute('data-title');
      this.createScriptTag();
      window.initializeGoogleMap = this.mapReady.bind(this);
    }
  }, {
    key: "mapReady",
    value: function mapReady() {
      var mapOptions = {
        // How zoomed in you want the map to start at (always required)
        zoom: this.zoom,
        // The latitude and longitude to center the map (always required)
        center: new google.maps.LatLng(this.lat, this.lng),
        // Map styles.
        styles: _googleMapStyles["default"]
      };
      var map = new google.maps.Map(this.container, mapOptions);
      var marker = new google.maps.Marker({
        position: new google.maps.LatLng(this.lat, this.lng),
        map: map,
        title: this.title
      });
    }
  }, {
    key: "createScriptTag",
    value: function createScriptTag() {
      if (this.googleMapScript !== null) {
        return;
      }

      if (!this.key) {
        console.error('Missing google maps api key');
      }

      var tag = document.createElement('script');
      tag.id = 'js-google-map-script';
      tag.src = "https://maps.googleapis.com/maps/api/js?key=".concat(this.key, "&callback=initializeGoogleMap");
      this.googleMapScript = tag;
      var firstScriptTag = document.getElementsByTagName('script')[0];
      firstScriptTag.parentNode.insertBefore(tag, firstScriptTag);
    }
  }]);

  return GoogleMap;
}();

function createGoogleMap() {
  var googleMapContainer = document.querySelectorAll('.js-google-map');

  if (googleMapContainer.length === 0) {
    return null;
  }

  for (var i = 0; i < googleMapContainer.length; i += 1) {
    var googleMap = new GoogleMap(googleMapContainer[i]);
    googleMap.init();
  }

  return null;
}

var _default = createGoogleMap;
exports["default"] = _default;

},{"./google-map-styles":372}],374:[function(require,module,exports){
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.MainNavigation = exports.MobileNavigation = void 0;

var _bodyScrollLock = require("body-scroll-lock");

var _utils = require("../utils");

function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _nonIterableRest(); }

function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance"); }

function _iterableToArrayLimit(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }

function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }

function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }

var MainNavigation =
/*#__PURE__*/
function () {
  function MainNavigation() {
    _classCallCheck(this, MainNavigation);
  }

  _createClass(MainNavigation, [{
    key: "init",
    value: function init() {
      this.mainMenu = document.getElementById('js-main-menu');

      if (!this.mainMenu) {
        return;
      }

      this.mainMenuHeight = this.mainMenu.clientHeight;
      this.submenus = this.mainMenu.querySelectorAll('.js-submenu');
      this.submenuButtons = this.mainMenu.querySelectorAll('.js-submenu-button');
      this.scrollPos = 0;
      this.prevScollPos = 0;
      this.scrollInteractions = this.scrollInteractions.bind(this); // events

      this.toggleSubmenu = this.toggleSubmenu.bind(this);
      window.addEventListener('scroll', (0, _utils.throttle)(this.scrollInteractions, 10));
      this.scrollInteractions();
      this.closeAllSubmenus(); // add click events to submenu items;

      for (var i = 0; i < this.submenuButtons.length; i += 1) {
        this.submenuButtons[i].addEventListener('click', this.toggleSubmenu, false);
      } // show header


      this.mainMenu.classList.remove('bk-header_hide');
    }
  }, {
    key: "closeAllSubmenus",
    value: function closeAllSubmenus() {
      this.mainMenu.classList.remove('bk-header-active'); // hide all submenus

      for (var i = 0; i < this.submenus.length; i += 1) {
        this.submenus[i].classList.add('uk-hidden');
      } // remove all active classes


      for (var _i = 0; _i < this.submenuButtons.length; _i += 1) {
        this.submenuButtons[_i].classList.remove('uk-open');
      }
    }
  }, {
    key: "openSubmenu",
    value: function openSubmenu(id) {
      for (var i = 0; i < this.submenus.length; i += 1) {
        // check if its the right subnav and open
        var isOpen = !this.submenus[i].classList.contains('uk-hidden');
        var linkId = this.submenus[i].getAttribute('data-link-id'); // check if the current one is open and close it

        if (linkId === id && isOpen) {
          this.submenus[i].classList.add('uk-hidden');
          this.mainMenu.classList.remove('bk-header-subnav-open'); // close all and open the one selected
        } else if (linkId === id) {
          this.closeAllSubmenus();
          this.submenus[i].classList.remove('uk-hidden');
          this.mainMenu.classList.add('bk-header-subnav-open');
        }
      }
    }
  }, {
    key: "toggleSubmenu",
    value: function toggleSubmenu(event) {
      var linkId = event.target.getAttribute('data-link-id');

      if (linkId) {
        event.preventDefault();
        this.openSubmenu(linkId);

        if (event.target.classList.contains('uk-open')) {
          event.target.classList.remove('uk-open');
        } else {
          event.target.classList.add('uk-open');
        }
      }
    }
  }, {
    key: "scrollInteractions",
    value: function scrollInteractions() {
      this.prevScollPos = this.scrollPos;
      this.scrollPos = window.scrollY || window.scrollTop || document.getElementsByTagName('html')[0].scrollTop;

      if (this.scrollPos > this.mainMenuHeight) {
        this.mainMenu.classList.add('bk-header-active');
      } else {
        this.mainMenu.classList.remove('bk-header-active');
      } //


      if (this.scrollPos < this.mainMenuHeight * 4) {
        this.mainMenu.classList.remove('bk-header-up');
      } else if (this.prevScollPos > this.scrollPos) {
        this.mainMenu.classList.remove('bk-header-up');
      } else {
        this.mainMenu.classList.add('bk-header-up');
      }
    }
  }]);

  return MainNavigation;
}();

exports.MainNavigation = MainNavigation;

var MobileNavigation =
/*#__PURE__*/
function () {
  function MobileNavigation() {
    _classCallCheck(this, MobileNavigation);

    // Dom elements
    this.mobileMenu = document.getElementById('js-mobile-menu');
    this.mainMenu = document.getElementById('js-main-menu');
    this.mobileNavButton = document.querySelector('.js-mobile-nav-button');
    this.menuContent = document.querySelector('.js-mobile-menu-content');
    this.footer = document.querySelector('.js-mobile-menu-footer');
    this.overlay = document.querySelector('.js-mobile-menu-overlay');
    this.header = document.querySelector('.js-mobile-menu-header');
    this.sidemenus = document.querySelectorAll('.js-mobile-menu-sidemenu');
    this.sidemenuButtons = document.querySelectorAll('.js-mobile-menu-sidemenu-buttons');
    this.openSideMenu = this.openSideMenu.bind(this);
    this.closeSideMenu = this.closeSideMenu.bind(this);
  }

  _createClass(MobileNavigation, [{
    key: "init",
    value: function init() {
      var _this = this;

      var _document$getElements = document.getElementsByTagName('html'),
          _document$getElements2 = _slicedToArray(_document$getElements, 1),
          root = _document$getElements2[0];

      this.root = root;

      if (!this.mobileMenu) {
        return;
      } // set height of content


      var headerHeight = this.header.offsetHeight;
      var footerHeight = this.footer.offsetHeight;
      var height = Math.max(document.documentElement.clientHeight, window.innerHeight || 0);
      var contentHeight = height - (headerHeight + footerHeight);
      this.menuContent.style.height = "".concat(contentHeight, "px");
      this.mobileMenuOpen = false;
      this.toggleMenu = this.toggleMenu.bind(this);
      this.mobileNavButton.addEventListener('click', this.toggleMenu, false); // set up click events for sidemenu buttons

      for (var i = 0; i < this.sidemenuButtons.length; i += 1) {
        var sideMenuOpenButton = this.sidemenuButtons[i].querySelector('.js-mobile-menu-sidemenu-button');

        if (sideMenuOpenButton) {
          (function () {
            var id = sideMenuOpenButton.getAttribute('data-id');
            var menu = document.querySelector("[data-id='menu-content-".concat(id, "']"));

            if (menu) {
              sideMenuOpenButton.addEventListener('click', function () {
                return _this.openSideMenu(menu);
              });
            }
          })();
        }
      } // set up close click events.


      for (var _i2 = 0; _i2 < this.sidemenus.length; _i2 += 1) {
        var sideMenuCloseButton = this.sidemenus[_i2].querySelector('.js-mobile-menu-sidemenu-close');

        if (sideMenuCloseButton) {
          (function () {
            var id = sideMenuCloseButton.getAttribute('data-id');
            var menu = document.querySelector("[data-id='menu-content-".concat(id, "']"));

            if (menu) {
              sideMenuCloseButton.addEventListener('click', function () {
                return _this.closeSideMenu(menu);
              });
            }
          })();
        }
      }
    }
  }, {
    key: "openSideMenu",
    value: function openSideMenu(container) {
      var _this2 = this;

      (0, _bodyScrollLock.enableBodyScroll)(this.menuContent);
      var sideMenuContent = container.querySelector('.js-mobile-menu-sidemenu-links');
      var header = container.querySelector('.js-mobile-menu-sidemenu-header');
      var height = Math.max(document.documentElement.clientHeight, window.innerHeight || 0);
      var contentHeight = height - header.offsetHeight;
      sideMenuContent.style.height = "".concat(contentHeight, "px");
      (0, _bodyScrollLock.disableBodyScroll)(sideMenuContent);
      this.mainMenu.classList.add('bk-mobile-menu-sub--open');
      this.overlay.style.display = 'block';
      setTimeout(function () {
        _this2.overlay.classList.add('bk-mobile-menu__overlay--active');

        container.classList.add('bk-mobile-menu__sidemenu--open');
      }, 100);
    }
  }, {
    key: "closeSideMenu",
    value: function closeSideMenu(container) {
      var _this3 = this;

      container.classList.remove('bk-mobile-menu__sidemenu--open');
      (0, _bodyScrollLock.disableBodyScroll)(this.menuContent);
      var sideMenuContent = container.querySelector('.bk-mobile-menu__sidemenu-links');
      (0, _bodyScrollLock.enableBodyScroll)(sideMenuContent);
      setTimeout(function () {
        _this3.overlay.classList.remove('bk-mobile-menu__overlay--active');
      }, 100);
      setTimeout(function () {
        _this3.mainMenu.classList.remove('bk-mobile-menu-sub--open');

        _this3.overlay.style.display = 'none';
      }, 250);
    }
  }, {
    key: "toggleMenu",
    value: function toggleMenu(event) {
      event.preventDefault();
      this.mobileMenuOpen = !this.mobileMenuOpen;

      if (this.mobileMenuOpen) {
        this.mainMenu.classList.add('bk-mobile-menu-open');
        this.menuContent.classList.add('bk-mobile-menu-fadein');
        this.footer.classList.add('bk-mobile-menu-fadein');
        this.mobileNavButton.classList.add('is-active');
        (0, _bodyScrollLock.disableBodyScroll)(this.menuContent);
      } else {
        this.mainMenu.classList.remove('bk-mobile-menu-open');
        this.menuContent.classList.remove('bk-mobile-menu-fadein');
        this.footer.classList.remove('bk-mobile-menu-fadein');
        this.mobileNavButton.classList.remove('is-active');
        (0, _bodyScrollLock.enableBodyScroll)(this.menuContent);
      }
    }
  }]);

  return MobileNavigation;
}();

exports.MobileNavigation = MobileNavigation;

function resizeMobileNav() {
  var mobileMenuContainer = document.querySelector('.js-mobile-menu-container');

  if (mobileMenuContainer) {
    var vh = Math.max(document.documentElement.clientHeight, window.innerHeight || 0);
    mobileMenuContainer.style.height = "".concat(vh, "px");
  }
} // Reset height of the mobile nav when the browser is resized


var windowResizeDebounce = (0, _utils.debounce)(function () {
  resizeMobileNav();
}, 250);
resizeMobileNav();
window.addEventListener('resize', windowResizeDebounce);

},{"../utils":386,"body-scroll-lock":27}],375:[function(require,module,exports){
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports["default"] = void 0;

var _uikit = _interopRequireDefault(require("uikit"));

var _gsap = require("gsap");

var _productCarousel = _interopRequireDefault(require("./product-carousel"));

var _utils = require("../utils");

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }

function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }

var switcher = _uikit["default"].switcher,
    scroll = _uikit["default"].scroll,
    slideshow = _uikit["default"].slideshow;

var HeroCarousel =
/*#__PURE__*/
function () {
  function HeroCarousel(heroCarousel) {
    _classCallCheck(this, HeroCarousel);

    this.heroCarousel = heroCarousel;
    this.heroCarouselAnchor = this.heroCarousel.querySelector('.js-hero-carousel-anchor');
    this.heroCarouselContainer = this.heroCarousel.querySelector('.js-hero-carousel-container');
    this.slides = this.heroCarousel.querySelectorAll('.js-hero-carousel-slides');
    this.headings = this.heroCarousel.querySelector('.js-hero-carousel-headings');
    this.switcher = this.heroCarousel.querySelector('.js-hero-carousel-switcher');
    this.nextButtons = this.heroCarousel.querySelectorAll('.js-hero-carousel-next-button');
    this.prevButtons = this.heroCarousel.querySelectorAll('.js-hero-carousel-prev-button');
    this.buttons = this.heroCarousel.querySelectorAll('.js-carousel-slide-button');
    this.heroVideo = this.heroCarousel.querySelector('.js-hero-carousel-video-frame');
    this.heroPoster = this.heroCarousel.querySelector('.js-hero-carousel-video-poster');
    this.wistiaScript = document.getElementById('js-wistia-script');
    this.dir = document.getElementsByTagName('html')[0].getAttribute('dir');
    this.index = 0;
    this.isAnimating = false;
    this.initialLoad = false;
  }

  _createClass(HeroCarousel, [{
    key: "init",
    value: function init() {
      var _this = this;

      if (!this.heroCarousel) {
        return;
      }

      var scrollOptions = {
        duration: 500
      };
      this.scroll = scroll(this.heroCarouselAnchor, scrollOptions);
      this.createScriptTag(); // event bindings

      this.showSlide = this.showSlide.bind(this);
      this.hideSlide = this.hideSlide.bind(this);
      this.startVideo = this.startVideo.bind(this);
      this.handleNextButton = this.handleNextButton.bind(this);
      this.handlePrevButton = this.handlePrevButton.bind(this);
      this.handleChangeSlide = this.handleChangeSlide.bind(this);
      this.switcherElement = switcher(this.switcher);
      switcher(this.switcher).show(0); // unbind swipe event

      this.switcherElement._events[2](function (unbind) {
        return unbind();
      }); // resize to view port height


      this.sizeCarousel = this.sizeCarousel.bind(this);
      this.sizeCarousel();
      window.addEventListener('resize', (0, _utils.throttle)(this.sizeCarousel, 10));
      this.numberOfSlides = this.slides.length;
      this.setHeightOfLists();
      this.toggleActiveButton(0); // add next button click events

      for (var i = 0; i < this.nextButtons.length; i += 1) {
        this.nextButtons[i].addEventListener('click', this.handleNextButton, false);
      } // add previous button click events


      for (var _i = 0; _i < this.prevButtons.length; _i += 1) {
        this.prevButtons[_i].addEventListener('click', this.handlePrevButton, false);
      } // add button click events


      for (var _i2 = 0; _i2 < this.buttons.length; _i2 += 1) {
        this.buttons[_i2].addEventListener('click', this.handleChangeSlide, false);
      }

      var options = {
        finite: true,
        velocity: 1
      }; // initial slideshow

      this.slideshow = slideshow(this.heroCarousel, options); // unbind slide show touch events;

      this.slideshow._events[2](function (unbind) {
        return unbind();
      });

      _uikit["default"].util.on(this.heroCarousel, 'itemshown', this.showSlide);

      _uikit["default"].util.on(this.heroCarousel, 'itemhidden', this.hideSlide);

      _uikit["default"].util.on(this.heroCarouselAnchor, 'scrolled', function () {
        var index = _this.nextSlideIndex;

        if (index > 0) {
          _this.togglePrevButtons(true);
        } else {
          _this.togglePrevButtons(false);
        }

        if (index < _this.numberOfSlides - 1) {
          _this.toggleNextButtons(true);
        } else {
          _this.toggleNextButtons(false);
        }

        _this.toggleActiveButton(index);

        var headings = _this.headings.querySelectorAll('.js-carousel-slide-content');

        var widths = [];

        for (var _i3 = 0; _i3 < headings.length; _i3 += 1) {
          widths.push(headings[_i3].offsetWidth);
        }

        var width = 0;

        for (var _i4 = 0; _i4 < index; _i4 += 1) {
          width += widths[_i4];
        }

        if (_this.dir === 'rtl') {
          _this.headings.style.transform = "translateX(".concat(width, "px)");
        } else {
          _this.headings.style.transform = "translateX(-".concat(width, "px)");
        }

        _this.slideshow.show(index, options);

        _uikit["default"].util.on('#js-switcher-content', 'shown', function () {
          // on switcher create product sliders
          (0, _productCarousel["default"])();
        });

        switcher(_this.switcher).show(index, options);
      }); // init video


      if (!this.heroPoster && !this.heroVideo) {
        return;
      }

      var videoId = this.heroVideo.getAttribute('data-wistia-id');
      window._wq = window._wq || [];

      window._wq.push({
        id: videoId,
        onReady: this.startVideo
      });
    }
  }, {
    key: "showSlide",
    value: function showSlide(event) {
      var videoElement = event.target.getAttribute('data-video-id');
      this.isAnimating = false;

      if (this.video && videoElement) {
        // play video
        this.heroVideo.classList.remove('uk-hidden');
        this.video.play();
      }
    }
  }, {
    key: "hideSlide",
    value: function hideSlide(event) {
      var videoElement = event.target.getAttribute('data-video-id');
      this.isAnimating = false;

      if (this.video && videoElement) {
        // play video
        this.heroVideo.classList.add('uk-hidden');
        this.video.pause();

        _gsap.TweenMax.fromTo(this.heroPoster, 0.3, {
          opacity: 0
        }, {
          opacity: 1
        });
      }
    }
  }, {
    key: "setHeightOfLists",
    value: function setHeightOfLists() {
      var lists = this.headings.querySelectorAll('.js-carousel-slide-list');
      var maxHeight = 0;

      for (var i = 0; i < lists.length; i += 1) {
        if (lists[i].offsetHeight > maxHeight) {
          maxHeight = lists[i].offsetHeight;
        }

        if (i > 0) {
          lists[i].classList.add('uk-hidden');
        }
      }

      for (var _i5 = 0; _i5 < lists.length; _i5 += 1) {
        lists[_i5].style.minHeight = "".concat(maxHeight, "px");
      }
    }
  }, {
    key: "startVideo",
    value: function startVideo(video) {
      var _this2 = this;

      this.video = video; // if video in first slide play

      var videoElement = this.slides[0].getAttribute('data-video-id');

      if (videoElement) {
        video.play();
      }

      video.bind('play', function () {
        // fade out the poster image when the video is playing
        _gsap.TweenMax.fromTo(_this2.heroPoster, 0.3, {
          opacity: 1
        }, {
          opacity: 0
        });
      });
    }
  }, {
    key: "sizeCarousel",
    value: function sizeCarousel() {
      var vh = Math.max(document.documentElement.clientHeight, window.innerHeight || 0);
      this.heroCarouselContainer.style.height = "".concat(vh, "px");
    }
  }, {
    key: "toggleActiveButton",
    value: function toggleActiveButton(index) {
      var allSublinks = document.querySelectorAll('.js-hero-carousel-sublink');

      if (allSublinks) {
        for (var j = 0; j < allSublinks.length; j += 1) {
          if (this.initialLoad) {
            allSublinks[j].style.opacity = 0;
          }
        }
      }

      for (var i = 0; i < this.buttons.length; i += 1) {
        var parent = this.buttons[i].parentNode;
        var sublinks = parent.querySelectorAll('.js-hero-carousel-sublink');
        this.buttons[i].classList.remove('uk-active');
        var list = parent.querySelector('.js-carousel-slide-list');

        if (list) {
          list.classList.add('uk-hidden');
        }

        var buttonIndex = this.buttons[i].getAttribute('data-slide-number');

        if (Number(index) === Number(buttonIndex)) {
          if (list) {
            list.classList.remove('uk-hidden');
          }

          this.buttons[i].classList.add('uk-active');

          if (sublinks && this.initialLoad) {
            _gsap.TweenMax.staggerFromTo(sublinks, 0.9, {
              opacity: 0,
              x: 150
            }, {
              opacity: 1,
              x: 0,
              ease: _gsap.Power2.easeInOut
            }, 0.3);
          }

          this.initialLoad = true;
        }
      }
    }
  }, {
    key: "toggleNextButtons",
    value: function toggleNextButtons(show) {
      if (show) {
        for (var i = 0; i < this.nextButtons.length; i += 1) {
          this.nextButtons[i].classList.remove('uk-invisible');
        }
      } else {
        for (var _i6 = 0; _i6 < this.nextButtons.length; _i6 += 1) {
          this.nextButtons[_i6].classList.add('uk-invisible');
        }
      }
    }
  }, {
    key: "togglePrevButtons",
    value: function togglePrevButtons(show) {
      if (show) {
        for (var i = 0; i < this.prevButtons.length; i += 1) {
          this.prevButtons[i].classList.remove('uk-invisible');
        }
      } else {
        for (var _i7 = 0; _i7 < this.prevButtons.length; _i7 += 1) {
          this.prevButtons[_i7].classList.add('uk-invisible');
        }
      }
    }
  }, {
    key: "handleNextButton",
    value: function handleNextButton() {
      if (this.isAnimating) {
        return;
      }

      var nextSlideIndex = this.slideshow.getIndex() + 1;

      if (nextSlideIndex < this.numberOfSlides) {
        this.isAnimating = true;
        this.nextSlideIndex = nextSlideIndex;
        this.scroll.scrollTo(this.heroCarouselAnchor);
      }
    }
  }, {
    key: "handlePrevButton",
    value: function handlePrevButton() {
      if (this.isAnimating) {
        return;
      }

      var prevSlideIndex = this.slideshow.getIndex() - 1;

      if (prevSlideIndex >= 0) {
        this.isAnimating = true;
        this.nextSlideIndex = prevSlideIndex;
        this.scroll.scrollTo(this.heroCarouselAnchor);
      }
    }
  }, {
    key: "handleChangeSlide",
    value: function handleChangeSlide(event) {
      if (this.isAnimating) {
        return;
      }

      if (document.body.scrollTop !== 0) {
        this.isAnimating = true;
      }

      this.nextSlideIndex = event.target.getAttribute('data-slide-number');
      this.scroll.scrollTo(this.heroCarouselAnchor);
    }
  }, {
    key: "createScriptTag",
    value: function createScriptTag() {
      if (this.wistiaScript !== null) {
        return;
      }

      var tag = document.createElement('script');
      tag.id = 'js-wistia-script';
      tag.src = 'https://fast.wistia.net/assets/external/E-v1.js';
      tag.async = true;
      this.wistiaScript = tag;
      var firstScriptTag = document.getElementsByTagName('script')[0];
      firstScriptTag.parentNode.insertBefore(tag, firstScriptTag);
    }
  }]);

  return HeroCarousel;
}();

function createHeroCarousel() {
  var heroCarouselContainer = document.querySelectorAll('.js-hero-carousel');

  if (heroCarouselContainer.length === 0) {
    return null;
  }

  for (var i = 0; i < heroCarouselContainer.length; i += 1) {
    var heroCarousel = new HeroCarousel(heroCarouselContainer[i]);
    heroCarousel.init();
  }

  return null;
}

var _default = createHeroCarousel;
exports["default"] = _default;

},{"../utils":386,"./product-carousel":381,"gsap":356,"uikit":366}],376:[function(require,module,exports){
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports["default"] = void 0;

var _utils = require("../utils");

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }

function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }

var HeroScroller =
/*#__PURE__*/
function () {
  function HeroScroller(heroScroller) {
    _classCallCheck(this, HeroScroller);

    this.heroScroller = heroScroller;
    this.slides = heroScroller.querySelectorAll('.js-hero-scroller-slide');
    this.currentSlide = 0;
  }

  _createClass(HeroScroller, [{
    key: "init",
    value: function init() {
      var _this = this;

      if (!this.heroScroller) {
        return;
      } // add event listeners


      this.dotnavButtons = this.heroScroller.querySelectorAll('.js-dotnav-button');
      this.scrollToSlide = this.scrollToSlide.bind(this);

      if (this.dotnavButtons.length > 0) {
        for (var i = 0; i < this.dotnavButtons.length; i += 1) {
          this.dotnavButtons[i].addEventListener('click', this.scrollToSlide, false);
        }
      }

      this.scrollEvent = this.scrollEvent.bind(this);
      this.slideUp = this.slideUp.bind(this);
      this.slideDown = this.slideDown.bind(this);
      this.touchDrag = this.touchDrag.bind(this);
      this.handleTouchEnd = this.handleTouchEnd.bind(this);
      this.handleTouchDown = this.handleTouchDown.bind(this);
      this.downButton = this.heroScroller.querySelector('.js-slide-up');
      this.upButton = this.heroScroller.querySelector('.js-slide-down');

      if (this.upButton) {
        this.upButton.addEventListener('click', this.slideUp, false);
      }

      if (this.downButton) {
        this.downButton.addEventListener('click', this.slideDown, false);
      }

      var FullScrollTrottle = (0, _utils.throttle)(function () {
        return _this.scrollEvent();
      }, 100);
      document.addEventListener('scroll', function (event) {
        FullScrollTrottle(event);
      }, true); // set up scroll throttle

      var scrollTrottle = (0, _utils.throttle)(function () {
        return _this.scrollHandler(event);
      }, 2000);
      this.heroScroller.addEventListener('mousewheel', function (event) {
        scrollTrottle(event);
      }, false);
      this.heroScroller.addEventListener('touchstart', this.handleTouchDown, false);
      this.handleArrowKeys = this.handleArrowKeys.bind(this);
      this.scrollEvent();
      this.render();
    }
  }, {
    key: "handleTouchEnd",
    value: function handleTouchEnd() {
      this.heroScroller.removeEventListener('touchend', this.handleTouchEnd, false);
      this.heroScroller.removeEventListener('touchmove', this.touchDrag, false);

      if (this.touchStart > this.touchEnd) {
        this.slideUp();
      } else {
        this.slideDown();
      }
    }
  }, {
    key: "touchDrag",
    value: function touchDrag(event) {
      var touch = event.targetTouches[0];
      this.touchEnd = touch.pageY;
    }
  }, {
    key: "handleTouchDown",
    value: function handleTouchDown(event) {
      this.heroScroller.addEventListener('touchend', this.handleTouchEnd, false);
      this.heroScroller.addEventListener('touchmove', this.touchDrag, false);
      var touch = event.targetTouches[0];
      this.touchStart = touch.pageY;
    }
  }, {
    key: "handleArrowKeys",
    value: function handleArrowKeys(event) {
      if (event.which === 40) {
        this.slideUp();
      } else if (event.which === 38) {
        this.slideDown();
      }
    }
  }, {
    key: "scrollEvent",
    value: function scrollEvent() {
      var heroHeight = this.heroScroller.offsetHeight;
      var scrollPos = document.documentElement.scrollTop;

      if (scrollPos > heroHeight) {
        document.body.style.overflow = 'scroll';

        if (this.currentSlide !== this.slides.length - 1) {
          this.scrollToSlide(null, this.slides.length - 1);
        }
      }
    }
  }, {
    key: "scrollToSlide",
    value: function scrollToSlide(event, slide) {
      var slideNumber = slide;

      if (event) {
        slideNumber = parseInt(event.target.getAttribute('data-slide-number'), 10);
      }

      if (this.currentSlide > slideNumber) {
        for (var i = this.currentSlide; i > slideNumber; i -= 1) {
          this.slides[i].classList.remove('bk-hero-scroller__slide-up');
          this.currentSlide = slideNumber;
        }
      } else if (this.currentSlide < slideNumber) {
        for (var _i = this.currentSlide; _i <= slideNumber; _i += 1) {
          this.slides[_i].classList.add('bk-hero-scroller__slide-up');

          this.currentSlide = slideNumber;
        }
      }

      this.render();
    }
  }, {
    key: "slideUp",
    value: function slideUp() {
      var slideNumber = this.currentSlide;
      slideNumber += 1;
      var numberOfSlides = this.slides.length;

      if (slideNumber < numberOfSlides) {
        this.slides[slideNumber].classList.add('bk-hero-scroller__slide-up');
        this.currentSlide = slideNumber;
        this.render();
      }
    }
  }, {
    key: "slideDown",
    value: function slideDown() {
      var slideNumber = this.currentSlide;
      slideNumber -= 1;

      if (slideNumber >= 0) {
        this.slides[slideNumber + 1].classList.remove('bk-hero-scroller__slide-up');
        this.currentSlide = slideNumber;
        this.render();
      }
    }
  }, {
    key: "scrollHandler",
    value: function scrollHandler(event) {
      var delta = event.wheelDelta;

      if (delta > 0) {
        this.slideDown();
      } else {
        this.slideUp();
      }
    }
  }, {
    key: "renderDotNav",
    value: function renderDotNav() {
      var dotnavItems = this.heroScroller.querySelectorAll('.js-dotnav-item');

      for (var i = 0; i < dotnavItems.length; i += 1) {
        dotnavItems[i].classList.remove('uk-active');
      }

      dotnavItems[this.currentSlide].classList.add('uk-active');
    }
  }, {
    key: "renderButton",
    value: function renderButton() {
      this.upButton.classList.remove('uk-hidden');
      this.downButton.classList.remove('uk-hidden');

      if (this.currentSlide === 0) {
        this.downButton.classList.add('uk-hidden');
      } else if (this.currentSlide === this.slides.length - 1) {
        this.upButton.classList.add('uk-hidden');
      }
    }
  }, {
    key: "render",
    value: function render() {
      var _this2 = this;

      var numberOfSlides = this.slides.length;

      if (this.currentSlide < numberOfSlides - 1) {
        window.scrollTo(0, 0);
        document.body.style.overflow = 'hidden';
        document.addEventListener('keydown', this.handleArrowKeys);
      } else {
        setTimeout(function () {
          document.body.style.overflow = 'scroll';
          document.removeEventListener('keydown', _this2.handleArrowKeys);
        }, 1000);
      }

      if (this.dotnavButtons.length > 0) {
        this.renderDotNav();
      }

      if (this.upButton && this.downButton) {
        this.renderButton();
      }
    }
  }]);

  return HeroScroller;
}();

function createHeroScroller() {
  var heroScrollers = document.querySelectorAll('.js-hero-scroller');

  if (heroScrollers.length === 0) {
    return null;
  }

  for (var i = 0; i < heroScrollers.length; i += 1) {
    var heroScroller = new HeroScroller(heroScrollers[i]);
    heroScroller.init();
  }

  return null;
}

var _default = createHeroScroller;
exports["default"] = _default;

},{"../utils":386}],377:[function(require,module,exports){
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports["default"] = void 0;

var _uikit = _interopRequireDefault(require("uikit"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }

function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }

var slideshow = _uikit["default"].slideshow;

var HeroSlider =
/*#__PURE__*/
function () {
  function HeroSlider(heroSlider) {
    _classCallCheck(this, HeroSlider);

    this.heroSlider = heroSlider;
    this.videoSlides = heroSlider.querySelectorAll('.js-hero-slider-video-frame');
    this.wistiaScript = document.getElementById('js-wistia-script');
    this.youtubeScript = document.getElementById('js-youtube-script');
  }

  _createClass(HeroSlider, [{
    key: "init",
    value: function init() {
      if (!this.heroSlider) {
        return;
      }

      this.showSlide = this.showSlide.bind(this);

      for (var i = 0; i < this.videoSlides.length; i += 1) {
        this.setupSlides(this.videoSlides[i]);
      }

      var options = {
        autoplay: false,
        minHeight: 660
      }; // init slider

      slideshow(this.heroSlider, options); // set up events

      _uikit["default"].util.on(this.heroSlider, 'itemshown', this.showSlide);
    }
  }, {
    key: "showSlide",
    value: function showSlide(event) {
      var iframe = event.target.querySelector('.js-hero-slider-video-frame');

      if (iframe) {
        var wistiaVideoId = iframe.getAttribute('data-wistia-id');
        var youtubeVideoId = iframe.getAttribute('data-youtube-id');

        if (wistiaVideoId) {
          this.wistiaVideo.play();
        } else if (youtubeVideoId) {
          this.youtubeIframe = iframe;
          this.youtubePoster = event.target.querySelector('.js-hero-slider-video-poster');
          this.youtubePlayer.mute();
          this.youtubePlayer.playVideo();
        }
      }
    }
  }, {
    key: "setupSlides",
    value: function setupSlides(slide) {
      var wistiaVideoId = slide.getAttribute('data-wistia-id');
      var youtubeVideoId = slide.getAttribute('data-youtube-id');

      if (wistiaVideoId) {
        this.startWistiaVideo = this.startWistiaVideo.bind(this);
        this.createWistiaScriptTag();
        this.setupWistiaVideo(wistiaVideoId); // if there is a youtube video
      } else if (youtubeVideoId) {
        this.startYoutubeVideo = this.startYoutubeVideo.bind(this);
        this.createYoutubeScriptTag();
        this.setupYoutubeVideo(youtubeVideoId);
      }
    }
  }, {
    key: "setupYoutubeVideo",
    value: function setupYoutubeVideo(youtubeVideoId) {
      var _this = this;

      if (!youtubeVideoId) {
        console.error('Missing data-youtube-id');
        return;
      }

      window.onYouTubeIframeAPIReady = function () {
        _this.youtubePlayer = new YT.Player('youtube_embed', {
          playerVars: {
            autoplay: 0,
            controls: 0,
            disablekb: 1,
            modestbranding: 1
          },
          events: {
            onStateChange: _this.startYoutubeVideo
          }
        });
      };
    }
  }, {
    key: "startYoutubeVideo",
    value: function startYoutubeVideo(event) {
      var poster = this.youtubePoster;
      var iframe = this.youtubeIframe;
      console.log('yala'); // on play video hide poster{

      if (event.data === YT.PlayerState.PLAYING) {
        iframe.classList.add('bk-hero-slider__iframe_show');
        poster.classList.add('bk-hero-slider__image_hidden');
      } // if video has finished replay


      if (event.data === YT.PlayerState.ENDED) {
        this.youtubePlayer.playVideo();
      }
    }
  }, {
    key: "setupWistiaVideo",
    value: function setupWistiaVideo(wistiaVideoId) {
      if (!wistiaVideoId) {
        console.error('Missing data-wistia-id');
        return;
      }

      window._wq = window._wq || [];

      _wq.push({
        id: wistiaVideoId,
        onReady: this.startWistiaVideo
      });
    }
  }, {
    key: "startWistiaVideo",
    value: function startWistiaVideo(video) {
      var poster = null;
      var iframe = null;

      if (video.iframe) {
        iframe = video.iframe;
        poster = video.iframe.parentNode.querySelector('.js-hero-slider-video-poster');
      } // on play video remove poster


      video.bind('play', function () {
        iframe.classList.add('bk-hero-slider__iframe_show');
        poster.classList.add('bk-hero-slider__image_hidden');
      });
      this.wistiaVideo = video;
    }
  }, {
    key: "createWistiaScriptTag",
    value: function createWistiaScriptTag() {
      if (this.wistiaScript) {
        return;
      }

      var tag = document.createElement('script');
      tag.id = 'js-wistia-script';
      tag.src = 'https://fast.wistia.com/assets/external/E-v1.js';
      tag.charset = 'ISO-8859-1';
      tag.async = true;
      var firstScriptTag = document.getElementsByTagName('script')[0];
      firstScriptTag.parentNode.insertBefore(tag, firstScriptTag);
    }
  }, {
    key: "createYoutubeScriptTag",
    value: function createYoutubeScriptTag() {
      if (this.youtubeScript) {
        return;
      }

      var tag = document.createElement('script');
      tag.id = 'js-youtube-script';
      tag.src = 'https://www.youtube.com/iframe_api';
      var firstScriptTag = document.getElementsByTagName('script')[0];
      firstScriptTag.parentNode.insertBefore(tag, firstScriptTag);
    }
  }]);

  return HeroSlider;
}();

function createHeroSlider() {
  var heroSlider = document.querySelectorAll('.js-hero-slider');

  if (heroSlider.length === 0) {
    return null;
  }

  for (var i = 0; i < heroSlider.length; i += 1) {
    var heroSlide = new HeroSlider(heroSlider[i]);
    heroSlide.init();
  }

  return null;
}

var _default = createHeroSlider;
exports["default"] = _default;

},{"uikit":366}],378:[function(require,module,exports){
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports["default"] = void 0;

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }

function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }

/* global document, window, _wq */

/* Create the hero videos using the Wistia javascript api */
var HeroVideos =
/*#__PURE__*/
function () {
  function HeroVideos(heroVideo) {
    _classCallCheck(this, HeroVideos);

    this.heroVideo = heroVideo;
    this.heroPoster = heroVideo.querySelector('.js-hero-poster');
    this.videoIframe = heroVideo.querySelector('.js-hero-video-frame');
    this.wistiaScript = document.getElementById('js-wistia-script');
    this.youtubeScript = document.getElementById('js-youtube-script');
  }

  _createClass(HeroVideos, [{
    key: "init",
    value: function init() {
      if (!this.heroPoster) {
        console.error('Missing js-hero-poster class');
      }

      if (!this.videoIframe) {
        console.error('Missing js-hero-video-frame class');
        return;
      }

      var wistiaVideoId = this.videoIframe.getAttribute('data-wistia-id');
      var youtubeVideoId = this.videoIframe.getAttribute('data-youtube-id'); // if there is a wista video

      if (wistiaVideoId) {
        this.startWistiaVideo = this.startWistiaVideo.bind(this);
        this.createWistiaScriptTag();
        this.setupWistiaVideo(wistiaVideoId); // if there is a youtube video
      } else if (youtubeVideoId) {
        this.startYoutubeVideo = this.startYoutubeVideo.bind(this);
        this.onYoutubeReady = this.onYoutubeReady.bind(this);
        this.createYoutubeScriptTag();
        this.setupYoutubeVideo(youtubeVideoId);
      }
    }
  }, {
    key: "setupWistiaVideo",
    value: function setupWistiaVideo(wistiaVideoId) {
      if (!wistiaVideoId) {
        console.error('Missing data-wistia-id');
        return;
      }

      window._wq = window._wq || [];

      _wq.push({
        id: wistiaVideoId,
        onReady: this.startWistiaVideo
      });
    }
  }, {
    key: "setupYoutubeVideo",
    value: function setupYoutubeVideo(youtubeVideoId) {
      var _this = this;

      if (!youtubeVideoId) {
        console.error('Missing data-youtube-id');
        return;
      }

      window.onYouTubeIframeAPIReady = function () {
        _this.youtubePlayer = new YT.Player('youtube_embed', {
          playerVars: {
            autoplay: 0,
            controls: 0,
            disablekb: 1,
            modestbranding: 1
          },
          events: {
            onStateChange: _this.startYoutubeVideo,
            onReady: _this.onYoutubeReady
          }
        });
      };
    }
  }, {
    key: "startWistiaVideo",
    value: function startWistiaVideo(video) {
      var _this2 = this;

      // on play video remove poster
      video.bind('play', function () {
        _this2.heroPoster.classList.add('bk-hero-text-cta__image_hidden');
      });
      video.play();
    }
  }, {
    key: "startYoutubeVideo",
    value: function startYoutubeVideo(event) {
      // on play video hide poster{
      if (event.data === window.YT.PlayerState.PLAYING) {
        this.heroPoster.classList.add('bk-hero-text-cta__image_hidden');
      } // if video has finished replay


      if (event.data === window.YT.PlayerState.ENDED) {
        this.youtubePlayer.playVideo();
      }
    }
  }, {
    key: "onYoutubeReady",
    value: function onYoutubeReady() {
      if (this.youtubePlayer) {
        this.youtubePlayer.mute();
        this.youtubePlayer.playVideo();
      }
    }
  }, {
    key: "createWistiaScriptTag",
    value: function createWistiaScriptTag() {
      if (this.wistiaScript) {
        return;
      }

      var tag = document.createElement('script');
      tag.id = 'js-wistia-script';
      tag.src = 'https://fast.wistia.com/assets/external/E-v1.js';
      tag.charset = 'ISO-8859-1';
      tag.async = true;
      var firstScriptTag = document.getElementsByTagName('script')[0];
      firstScriptTag.parentNode.insertBefore(tag, firstScriptTag);
    }
  }, {
    key: "createYoutubeScriptTag",
    value: function createYoutubeScriptTag() {
      if (this.youtubeScript) {
        return;
      }

      var tag = document.createElement('script');
      tag.id = 'js-youtube-script';
      tag.src = 'https://www.youtube.com/iframe_api';
      var firstScriptTag = document.getElementsByTagName('script')[0];
      firstScriptTag.parentNode.insertBefore(tag, firstScriptTag);
    }
  }]);

  return HeroVideos;
}();

function createHeroVideos() {
  var heroVideos = document.querySelectorAll('.js-hero-video');

  if (heroVideos.length > 0) {
    for (var i = 0; i < heroVideos.length; i += 1) {
      var heroVideo = new HeroVideos(heroVideos[i]);
      heroVideo.init();
    }
  }
}

var _default = createHeroVideos;
exports["default"] = _default;

},{}],379:[function(require,module,exports){
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports["default"] = void 0;

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }

function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }

/* global document */
var MovieSlider =
/*#__PURE__*/
function () {
  function MovieSlider(cardSlider) {
    _classCallCheck(this, MovieSlider);

    this.cardSlider = cardSlider;
    this.container = cardSlider.querySelector('.bk-movie-slider__items');
    this.leftButton = cardSlider.querySelector('.bk-movie-slider__arrow-left');
    this.rightButton = cardSlider.querySelector('.bk-movie-slider__arrow-right');
    this.items = cardSlider.querySelectorAll('.bk-movie-slider__item');
    this.position = 0;
    this.cardsPerSlide = this.cardSlider.getAttribute('data-show-cards') || 3;
    this.movePercent = 100 / this.cardsPerSlide;
    this.numberOfItems = this.items.length;
    this.dir = document.getElementsByTagName('html')[0].getAttribute('dir');
  }

  _createClass(MovieSlider, [{
    key: "init",
    value: function init() {
      // add events
      for (var i = 0; i < this.items.length; i += 1) {
        this.items[i].style.minWidth = "".concat(this.movePercent, "%");
        this.items[i].style.maxWidth = "".concat(this.movePercent, "%");
      }

      this.leftButton.addEventListener('click', this.slideLeft.bind(this), false);
      this.rightButton.addEventListener('click', this.slideRight.bind(this), false);

      if (this.numberOfItems > this.cardsPerSlide) {
        this.render();
      }
    }
  }, {
    key: "slideLeft",
    value: function slideLeft() {
      if (this.position > 0) {
        this.position -= 1;
        this.render();
      }
    }
  }, {
    key: "slideRight",
    value: function slideRight() {
      if (this.position < this.numberOfItems) {
        this.position += 1;
        this.render();
      }
    }
  }, {
    key: "render",
    value: function render() {
      var dir = document.getElementsByTagName('html')[0].getAttribute('dir');

      if (dir !== this.dir) {
        this.dir = dir;
        this.position = 0;
      }

      if (this.position === 0) {
        this.leftButton.classList.remove('bk-movie-slider__arrow_show');
      } else {
        this.leftButton.classList.add('bk-movie-slider__arrow_show');
      }

      if (this.position < this.numberOfItems - this.cardsPerSlide) {
        this.rightButton.classList.add('bk-movie-slider__arrow_show');
      } else {
        this.rightButton.classList.remove('bk-movie-slider__arrow_show');
      }

      if (this.dir === 'rtl') {
        this.container.style.transform = "translateX(".concat(this.position * this.movePercent, "%)");
      } else {
        this.container.style.transform = "translateX(-".concat(this.position * this.movePercent, "%)");
      }
    }
  }]);

  return MovieSlider;
}();

function MovieSliderInit() {
  var movieSliders = document.querySelectorAll('.bk-movie-slider');

  if (movieSliders.length === 0) {
    return null;
  }

  for (var i = 0; i < movieSliders.length; i += 1) {
    var movieSlide = new MovieSlider(movieSliders[i]);
    movieSlide.init();
  }

  return null;
}

var _default = MovieSliderInit;
exports["default"] = _default;

},{}],380:[function(require,module,exports){
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports["default"] = void 0;

var _utils = require("../utils");

function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _nonIterableRest(); }

function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance"); }

function _iterableToArrayLimit(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }

function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }

function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }

var PlazaMobileNavigation =
/*#__PURE__*/
function () {
  function PlazaMobileNavigation() {
    _classCallCheck(this, PlazaMobileNavigation);

    // Dom elements
    this.mainMenu = document.getElementById('js-plaza-main-menu');
    this.mobileMenu = document.getElementById('js-plaza-mobile-menu');
    this.mobileNavButton = document.querySelector('.js-plaza-mobile-nav-button');
    this.content = document.querySelector('.js-plaza-mobile-menu-content');
    this.scrollPos = 0;
  }

  _createClass(PlazaMobileNavigation, [{
    key: "init",
    value: function init() {
      var _document$getElements = document.getElementsByTagName('html'),
          _document$getElements2 = _slicedToArray(_document$getElements, 1),
          root = _document$getElements2[0];

      this.root = root;

      if (!this.mobileMenu) {
        return;
      } // settings


      this.mobileMenuOpen = false;
      this.mainMenuHeight = this.mainMenu.clientHeight;
      this.toggleMenu = this.toggleMenu.bind(this);
      this.scrollInteractions = this.scrollInteractions.bind(this);
      var mobileLinks = document.querySelectorAll('.js-plaza-mobile-links');

      for (var i = 0; i < mobileLinks.length; i += 1) {
        mobileLinks[i].addEventListener('click', this.toggleMenu, false);
      } // Open and close mobile navigation


      this.mobileNavButton.addEventListener('click', this.toggleMenu, false);
      window.addEventListener('scroll', (0, _utils.throttle)(this.scrollInteractions, 10));
    }
  }, {
    key: "toggleMenu",
    value: function toggleMenu(event) {
      document.body.style.overflow = 'scroll';
      event.preventDefault();
      this.mobileMenuOpen = !this.mobileMenuOpen;

      if (this.mobileMenuOpen) {
        this.mainMenu.classList.add('bk-mobile-menu-open'); // add overflow hidden to prevent scrolling when menu open

        this.root.classList.add('bk-mobile-menu__overflow');
        this.content.classList.add('bk-mobile-menu-fadein');
        this.mobileNavButton.classList.add('is-active');
      } else {
        this.mainMenu.classList.remove('bk-mobile-menu-open');
        this.root.classList.remove('bk-mobile-menu__overflow');
        this.content.classList.remove('bk-mobile-menu-fadein');
        this.mobileNavButton.classList.remove('is-active');
      }
    }
  }, {
    key: "scrollInteractions",
    value: function scrollInteractions() {
      this.prevScollPos = this.scrollPos;
      this.scrollPos = window.scrollY || window.scrollTop || document.getElementsByTagName('html')[0].scrollTop;

      if (this.scrollPos > this.mainMenuHeight) {
        this.mainMenu.classList.add('bk-festival-plaza-header-active');
      } else {
        this.mainMenu.classList.remove('bk-festival-plaza-header-active');
      } //


      if (this.scrollPos < this.mainMenuHeight * 4) {
        this.mainMenu.classList.remove('bk-festival-plaza-header-up');
      } else if (this.prevScollPos > this.scrollPos) {
        this.mainMenu.classList.remove('bk-festival-plaza-header-up');
      } else {
        this.mainMenu.classList.add('bk-festival-plaza-header-up');
      }
    }
  }]);

  return PlazaMobileNavigation;
}();

function resizeMobileNav() {
  var mobileMenuContainer = document.querySelector('.js-plaza-mobile-menu-container');

  if (mobileMenuContainer) {
    var vh = Math.max(document.documentElement.clientHeight, window.innerHeight || 0);
    mobileMenuContainer.style.height = "".concat(vh, "px");
  }
} // Reset height of the mobile nav when the browser is resized


var windowResizeDebounce = (0, _utils.debounce)(function () {
  resizeMobileNav();
}, 250);
resizeMobileNav();
window.addEventListener('resize', windowResizeDebounce);
var _default = PlazaMobileNavigation;
exports["default"] = _default;

},{"../utils":386}],381:[function(require,module,exports){
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports["default"] = void 0;

var _utils = require("../utils");

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }

function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }

var sliderArray = [];

function calculatePosition(pos, width) {
  // calculate the ceiling
  var ceil = Math.ceil(pos / width) * width; // calculate the floor

  var floor = Math.floor(pos / width) * width; // calculate the mean

  var mean = (ceil + floor) / 2; // set the position

  var position = 0;

  if (pos >= mean) {
    position = ceil;
  } else {
    position = floor;
  }

  return position;
}

var ImageSlider =
/*#__PURE__*/
function () {
  function ImageSlider(slider) {
    _classCallCheck(this, ImageSlider);

    this.slider = slider;
  }

  _createClass(ImageSlider, [{
    key: "init",
    value: function init() {
      // Dom elements
      this.handle = this.slider.querySelector('.js-image-slider-handle');
      this.slideBar = this.slider.querySelector('.js-image-slider-bar');
      this.slides = this.slider.querySelector('.js-image-slider-slides');
      this.slide = this.slider.querySelector('.js-image-slider-slide'); // get the direction

      this.dir = document.getElementsByTagName('html')[0].getAttribute('dir');

      if (!this.dir) {
        this.dir = 'ltr';
      }

      this.rightButton = this.slider.querySelector('.js-arrow-right-area');
      this.leftButton = this.slider.querySelector('.js-arrow-left-area'); // add scale class to initial slide

      this.slides.children[0].classList.add('bk-product-carousel-scale'); // Handle

      this.handleWidth = this.handle.offsetWidth - 20;
      this.handleRadius = this.handleWidth / 2;
      this.handleSelected = null;
      this.handlePos = null;
      this.xPos = 0; // SlideBar

      this.slideBarOffsetLeft = this.slideBar.offsetLeft + this.handleRadius;
      this.slideBarMinWidth = 0;
      this.slidebarWidth = this.slideBar.offsetWidth;
      this.slideBarMaxWidth = this.slidebarWidth; // Slides

      this.numberOfSlides = this.slides.childElementCount - 1;
      var margin = window.getComputedStyle(this.slide).getPropertyValue('margin-left');
      this.slideMargin = parseInt(margin, 10) * 2;
      this.slideWidth = this.slide.offsetWidth + this.slideMargin;
      this.slidesContainerWidth = this.slideWidth * this.numberOfSlides;
      this.slideRatio = this.slidesContainerWidth / this.slideBarMaxWidth; // Event binds

      this.mouseDrag = this.mouseDrag.bind(this);
      this.touchDrag = this.touchDrag.bind(this);
      this.handleMouseUp = this.handleMouseUp.bind(this);
      this.handleMouseDown = this.handleMouseDown.bind(this);
      this.handleTouchEnd = this.handleTouchEnd.bind(this);
      this.handleTouchDown = this.handleTouchDown.bind(this);
      this.handleLeftButton = this.handleLeftButton.bind(this);
      this.handleRightButton = this.handleRightButton.bind(this); // Errors

      if (!this.handle) {
        throw Error('Missing js-image-slider-handle');
      }

      if (!this.slideBar) {
        throw Error('Missing js-image-slider-bar');
      }

      if (!this.slides) {
        throw Error('Missing js-image-slider-slides');
      }

      if (!this.slide) {
        throw Error('Missing js-image-slider-slide');
      } // event listeners


      this.handle.addEventListener('mousedown', this.handleMouseDown, false);
      this.handle.addEventListener('touchstart', this.handleTouchDown, false);

      if (this.dir === 'rtl') {
        this.rightButton.addEventListener('click', this.handleLeftButton, false);
        this.leftButton.addEventListener('click', this.handleRightButton, false);
      } else {
        this.rightButton.addEventListener('click', this.handleRightButton, false);
        this.leftButton.addEventListener('click', this.handleLeftButton, false);
      }
    }
  }, {
    key: "handleMouseUp",
    value: function handleMouseUp() {
      // remove event listeners
      this.slider.removeEventListener('mousemove', this.mouseDrag, false);
      this.slider.removeEventListener('mouseup', this.handleMouseUp, false); // add classes for animation

      this.handle.classList.add('bk-product-carousel-animate');
      this.slides.classList.add('bk-product-carousel-animate-slides'); // Set Handle to fixed position

      var sliderWidth = this.slideBarMaxWidth / this.numberOfSlides;
      var sliderPosition = calculatePosition(this.xPos, sliderWidth);
      var imageWidthWithRatio = this.xPos * this.slideRatio;
      var imagePosition = calculatePosition(imageWidthWithRatio, this.slideWidth);

      if (this.dir === 'rtl') {
        var pos = this.slideBarMaxWidth - this.xPos;
        imageWidthWithRatio = pos * this.slideRatio;
        imagePosition = calculatePosition(imageWidthWithRatio, this.slideWidth);
      }

      this.move(sliderPosition, imagePosition);

      if (this.handleSelected) {
        this.destroy();
      }
    }
  }, {
    key: "handleMouseDown",
    value: function handleMouseDown(event) {
      this.initDrag(event.target);
      this.handle.classList.remove('bk-product-carousel-animate');
      this.slides.classList.remove('bk-product-carousel-animate-slides');
      this.slider.addEventListener('mousemove', this.mouseDrag, false);
      this.slider.addEventListener('mouseup', this.handleMouseUp, false);
    }
  }, {
    key: "handleTouchEnd",
    value: function handleTouchEnd() {
      // remove event listeners
      this.slider.removeEventListener('touchend', this.handleTouchEnd, false);
      this.slider.removeEventListener('touchmove', this.touchDrag, false); // add classes for animation

      this.handle.classList.add('bk-product-carousel-animate');
      this.slides.classList.add('bk-product-carousel-animate-slides'); // Set Handle to fixed position

      var sliderWidth = this.slideBarMaxWidth / this.numberOfSlides;
      var sliderPosition = calculatePosition(this.xPos, sliderWidth); // Set slider to fixed position

      var imageWidthWithRatio = this.xPos * this.slideRatio;
      var imagePosition = calculatePosition(imageWidthWithRatio, this.slideWidth);
      this.move(sliderPosition, imagePosition);

      if (this.handleSelected) {
        this.destroy();
      }
    }
  }, {
    key: "handleTouchDown",
    value: function handleTouchDown(event) {
      this.initDrag(event.target);
      this.handle.classList.remove('bk-product-carousel-animate');
      this.slides.classList.remove('bk-product-carousel-animate-slides');
      this.slider.addEventListener('touchmove', this.touchDrag, false);
      this.slider.addEventListener('touchend', this.handleTouchEnd, false);
    }
  }, {
    key: "handleRightButton",
    value: function handleRightButton() {
      var handlePosition = this.handle.getBoundingClientRect().left - this.slideBarOffsetLeft;
      this.initDrag(this.handle);
      var slideWidth = this.slideBarMaxWidth / this.numberOfSlides;
      var newpos = handlePosition + slideWidth;
      var sliderPosition = calculatePosition(newpos, slideWidth);
      this.move(sliderPosition);
      this.destroy();
    }
  }, {
    key: "handleLeftButton",
    value: function handleLeftButton() {
      var handlePosition = this.handle.getBoundingClientRect().left - this.slideBarOffsetLeft;
      this.initDrag(this.handle);
      var sliderWidth = this.slideBarMaxWidth / this.numberOfSlides;
      var newpos = handlePosition - sliderWidth;
      var sliderPosition = calculatePosition(newpos, sliderWidth);
      this.move(sliderPosition);
      this.destroy();
    }
  }, {
    key: "destroy",
    value: function destroy() {
      this.handleSelected = null;
    }
  }, {
    key: "initDrag",
    value: function initDrag(element) {
      this.handleSelected = element;
    }
  }, {
    key: "touchDrag",
    value: function touchDrag(event) {
      var touch = event.targetTouches[0];
      this.xPos = touch.pageX - this.slideBarOffsetLeft;
      this.move(this.xPos);
    }
  }, {
    key: "mouseDrag",
    value: function mouseDrag(event) {
      this.xPos = event.clientX - this.slideBarOffsetLeft;
      this.move(this.xPos);
    }
  }, {
    key: "scaleImages",
    value: function scaleImages() {
      var slideCount = this.numberOfSlides;
      var handlePos = this.handlePos / this.slideBarMaxWidth;
      var activeSlide = Math.ceil(handlePos * slideCount);

      for (var i = 0; i < this.slides.children.length; i += 1) {
        if (activeSlide === i) {
          this.slides.children[i].classList.add('bk-product-carousel-scale');
        } else {
          this.slides.children[i].classList.remove('bk-product-carousel-scale');
        }
      }
    }
  }, {
    key: "reset",
    value: function reset() {
      this.slides.style.transform = 'translate3d(0px, 0px, 0px)';

      if (this.dir === 'ltr') {
        this.handle.style.left = '0px';
      } else {
        this.handle.style.left = "".concat(this.slideBarMaxWidth, "px");
      }

      this.init();
    }
  }, {
    key: "move",
    value: function move(handlePosition, sliderPosition) {
      var _this = this;

      var sliderPos = sliderPosition;

      if (!sliderPos) {
        if (this.dir === 'ltr') {
          sliderPos = handlePosition * this.slideRatio;
        } else {
          var pos = this.slideBarMaxWidth - handlePosition;
          sliderPos = pos * this.slideRatio;
        }
      }

      if (this.handleSelected !== null && handlePosition >= this.slideBarMinWidth && handlePosition <= this.slideBarMaxWidth) {
        if (this.dir === 'ltr') {
          this.slides.style.transform = "translate3d(-".concat(sliderPos, "px, 0px, 0px)");
          this.handleSelected.style.left = "".concat(handlePosition, "px");
          this.handlePos = handlePosition;
        } else {
          this.slides.style.transform = "translate3d(".concat(sliderPos, "px, 0px, 0px)");
          this.handleSelected.style.right = "".concat(this.slideBarMaxWidth - handlePosition, "px");
          this.handlePos = this.slideBarMaxWidth - handlePosition;
        }
      }

      setTimeout(function () {
        _this.scaleImages();
      }, 180);
    }
  }]);

  return ImageSlider;
}();

function createImageSliders() {
  var imageSliders = document.querySelectorAll('.js-image-slider');

  if (imageSliders.length === 0) {
    return null;
  }

  var _loop = function _loop(i) {
    var slider = new ImageSlider(imageSliders[i]);
    setTimeout(function () {
      slider.init();
    }, 180);
    sliderArray.push(slider);
  };

  for (var i = 0; i < imageSliders.length; i += 1) {
    _loop(i);
  }

  return null;
} // Reset the slider when the browser is resized\


var browserWidth = document.body.clientWidth; // resize component if width changes.

var windowResizeDebounce = (0, _utils.debounce)(function () {
  if (browserWidth !== document.body.clientWidth) {
    for (var i = 0; i < sliderArray.length; i += 1) {
      sliderArray[i].reset();
    }

    browserWidth = document.body.clientWidth;
  }
}, 250);
window.addEventListener('resize', windowResizeDebounce);
var _default = createImageSliders;
exports["default"] = _default;

},{"../utils":386}],382:[function(require,module,exports){
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports["default"] = void 0;

var _uikit = _interopRequireDefault(require("uikit"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }

function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }

var ProductSlider =
/*#__PURE__*/
function () {
  function ProductSlider(slider) {
    _classCallCheck(this, ProductSlider);

    this.container = slider;
    this.slider = slider.querySelector('.js-product-slider');
  }

  _createClass(ProductSlider, [{
    key: "init",
    value: function init() {
      var _this = this;

      var options = {
        center: true
      };

      if (this.slider) {
        _uikit["default"].slider(this.slider, options);
      }

      this.handleClick = this.handleClick.bind(this);
      var thumbnails = document.querySelectorAll('.js-product-slider-thumbnail');

      var _loop = function _loop(i) {
        thumbnails[i].addEventListener('click', function () {
          return _this.handleClick(thumbnails[i]);
        }, false);
      };

      for (var i = 0; i < thumbnails.length; i += 1) {
        _loop(i);
      }
    }
  }, {
    key: "handleClick",
    value: function handleClick(item) {
      var index = item.getAttribute('data-item');

      if (index) {
        _uikit["default"].slider(this.slider).show(index);
      }
    }
  }]);

  return ProductSlider;
}();

function createProductSliders() {
  var productSliders = document.querySelectorAll('.js-product-slider-container');

  if (productSliders.length === 0) {
    return null;
  }

  for (var i = 0; i < productSliders.length; i += 1) {
    var slider = new ProductSlider(productSliders[i]);
    slider.init();
  }

  return null;
}

var _default = createProductSliders;
exports["default"] = _default;

},{"uikit":366}],383:[function(require,module,exports){
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports["default"] = void 0;

var _uikit = _interopRequireDefault(require("uikit"));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }

function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }

var SearchModal =
/*#__PURE__*/
function () {
  function SearchModal(searchModal) {
    _classCallCheck(this, SearchModal);

    this.searchModal = searchModal;
    this.searchModalInput = searchModal.querySelector('.js-search-navbar-input');
  }

  _createClass(SearchModal, [{
    key: "init",
    value: function init() {
      var _this = this;

      // focus input on shown
      _uikit["default"].util.on(this.searchModal, 'shown', function () {
        _this.searchModalInput.focus();
      }); // remove value when close modal


      _uikit["default"].util.on(this.searchModal, 'hidden', function () {
        _this.searchModalInput.value = '';
      });
    }
  }]);

  return SearchModal;
}();

function createSearchModal() {
  var searchModalElement = document.getElementById('js-search-modal');

  if (searchModalElement !== null) {
    var searchModal = new SearchModal(searchModalElement);
    searchModal.init();
  }
}

var _default = createSearchModal;
exports["default"] = _default;

},{"uikit":366}],384:[function(require,module,exports){
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports["default"] = void 0;

var _uikit = _interopRequireDefault(require("uikit"));

var _scrollmagic = _interopRequireDefault(require("scrollmagic"));

var _utils = require("../utils");

var _gsap = require("gsap");

require("scrollmagic/scrollmagic/uncompressed/plugins/animation.gsap");

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }

function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }

var ScrollScreen =
/*#__PURE__*/
function () {
  function ScrollScreen(slide, controller, index) {
    _classCallCheck(this, ScrollScreen);

    this.slide = slide;
    this.controller = controller;
    this.index = index;
  }

  _createClass(ScrollScreen, [{
    key: "init",
    value: function init() {
      // get the elements
      this.text = this.slide.querySelectorAll('.js-text-scroller__text');
      this.video = this.slide.querySelector('.js-text-scroller-video-frame');
      this.poster = this.slide.querySelector('.js-text-scroller-poster');
      this.wistiaScript = document.getElementById('js-wistia-script'); // bind events to self

      this.playVideo = this.playVideo.bind(this);
      this.pauseVideo = this.pauseVideo.bind(this);
      this.startVideo = this.startVideo.bind(this); // if there is a video setup youtube video

      if (this.video) {
        this.createScriptTag();
        var videoId = this.video.getAttribute('data-wistia-id');
        window._wq = window._wq || [];

        window._wq.push({
          id: videoId,
          onReady: this.startVideo
        });
      } // set initial place of first text element


      _gsap.TweenLite.set(this.text[0], {
        y: '-50%',
        autoAlpha: 1
      }); // animation for text scrolling


      var tl = new _gsap.TimelineLite();

      for (var j = 0; j < this.text.length; j += 1) {
        // if its the first one
        if (j === 0) {
          tl.to(this.text[j], 0.5, {
            y: '-200px',
            autoAlpha: 0,
            ease: _gsap.Quad.easeOut
          });
        } else if (j === this.text.length - 1) {
          // if its the last one
          tl.to(this.text[j], 0.5, {
            y: '200px',
            autoAlpha: 0,
            ease: _gsap.Quad.easeOut
          }, '-=1');
          tl.to(this.text[j], 0.5, {
            y: '0px',
            autoAlpha: 1,
            ease: _gsap.Quad.easeOut
          }); // else
        } else {
          tl.to(this.text[j], 0.5, {
            y: '200px',
            autoAlpha: 0,
            ease: _gsap.Quad.easeOut
          }, '-=1');
          tl.to(this.text[j], 0.5, {
            y: '0px',
            autoAlpha: 1,
            ease: _gsap.Quad.easeOut
          });
          tl.to(this.text[j], 0.5, {
            y: '-200px',
            autoAlpha: 0,
            ease: _gsap.Quad.easeOut
          });
        }
      } // scrollmagic text scrolling animation


      var duration = "".concat(this.text.length, "00%");
      this.scene = new _scrollmagic["default"].Scene({
        triggerElement: this.slide,
        triggerHook: 'onLeave',
        duration: duration
      }).setPin(this.slide).setTween(tl).on('enter', this.playVideo).on('leave', this.pauseVideo).addTo(this.controller);
    }
  }, {
    key: "startVideo",
    value: function startVideo(video) {
      var _this = this;

      this.player = video; // if video in first slide play

      if (this.index === 0) {
        video.play();
      }

      video.bind('play', function () {
        // fade out the poster image when the video is playing
        _gsap.TweenLite.to(_this.poster, 0.3, {
          opacity: 0
        });
      });
    }
  }, {
    key: "playVideo",
    value: function playVideo() {
      if (this.player) {
        this.player.play();
      }
    }
  }, {
    key: "pauseVideo",
    value: function pauseVideo() {
      if (this.player) {
        this.player.pause();
      }
    }
  }, {
    key: "createScriptTag",
    value: function createScriptTag() {
      if (this.wistiaScript !== null) {
        return;
      }

      var tag = document.createElement('script');
      tag.id = 'js-wistia-script';
      tag.src = '//fast.wistia.net/assets/external/E-v1.js';
      tag.async = true;
      this.wistiaScript = tag;
      var firstScriptTag = document.getElementsByTagName('script')[0];
      firstScriptTag.parentNode.insertBefore(tag, firstScriptTag);
    }
  }]);

  return ScrollScreen;
}();

var TextScroller =
/*#__PURE__*/
function () {
  function TextScroller(textScroller) {
    _classCallCheck(this, TextScroller);

    this.textScroller = textScroller;
  }

  _createClass(TextScroller, [{
    key: "init",
    value: function init() {
      var controller = new _scrollmagic["default"].Controller({
        globalSceneOptions: {
          triggerHook: 'onLeave'
        }
      });
      var numberOfTexts = this.textScroller.querySelectorAll('.js-text-scroller__text').length;
      var slides = this.textScroller.querySelectorAll('.js-text-scroller__container');
      this.textScroller.style.height = "".concat(numberOfTexts + slides.length, "00%"); // add scroll scene for each slide

      for (var i = 0; i < slides.length; i += 1) {
        var screen = new ScrollScreen(slides[i], controller, i);
        screen.init();
      }
    }
  }]);

  return TextScroller;
}();

function createTextScrollers() {
  var textScrollerContainer = document.querySelectorAll('.js-text-scroller');

  if (textScrollerContainer.length === 0) {
    return null;
  }

  for (var i = 0; i < textScrollerContainer.length; i += 1) {
    var textScroller = new TextScroller(textScrollerContainer[i]);
    textScroller.init();
  }

  return null;
}

var _default = createTextScrollers;
/* eslint-enable */

exports["default"] = _default;

},{"../utils":386,"gsap":356,"scrollmagic":363,"scrollmagic/scrollmagic/uncompressed/plugins/animation.gsap":364,"uikit":366}],385:[function(require,module,exports){
"use strict";

function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }

/*! UIkit 3.0.0-beta.40 | http://www.getuikit.com | (c) 2014 - 2017 YOOtheme | MIT License */
(function (global, factory) {
  (typeof exports === "undefined" ? "undefined" : _typeof(exports)) === 'object' && typeof module !== 'undefined' ? module.exports = factory() : typeof define === 'function' && define.amd ? define('uikiticons', factory) : global.UIkitIcons = factory();
})(void 0, function () {
  var album = '<svg width="20" height="20" viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"> <rect x="5" y="2" width="10" height="1" /> <rect x="3" y="4" width="14" height="1" /> <rect fill="none" stroke="#000" x="1.5" y="6.5" width="17" height="11" /></svg>';
  var ban = '<svg width="20" height="20" viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"> <circle fill="none" stroke="#000" stroke-width="1.1" cx="10" cy="10" r="9" /> <line fill="none" stroke="#000" stroke-width="1.1" x1="4" y1="3.5" x2="16" y2="16.5" /></svg>';
  var bell = '<svg width="20" height="20" viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"> <path fill="none" stroke="#000" stroke-width="1.1" d="M17,15.5 L3,15.5 C2.99,14.61 3.79,13.34 4.1,12.51 C4.58,11.3 4.72,10.35 5.19,7.01 C5.54,4.53 5.89,3.2 7.28,2.16 C8.13,1.56 9.37,1.5 9.81,1.5 L9.96,1.5 C9.96,1.5 11.62,1.41 12.67,2.17 C14.08,3.2 14.42,4.54 14.77,7.02 C15.26,10.35 15.4,11.31 15.87,12.52 C16.2,13.34 17.01,14.61 17,15.5 L17,15.5 Z" /> <path fill="none" stroke="#000" d="M12.39,16 C12.39,17.37 11.35,18.43 9.91,18.43 C8.48,18.43 7.42,17.37 7.42,16" /></svg>';
  var bolt = '<svg width="20" height="20" viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"> <path d="M4.74,20 L7.73,12 L3,12 L15.43,1 L12.32,9 L17.02,9 L4.74,20 L4.74,20 L4.74,20 Z M9.18,11 L7.1,16.39 L14.47,10 L10.86,10 L12.99,4.67 L5.61,11 L9.18,11 L9.18,11 L9.18,11 Z" /></svg>';
  var bookmark = '<svg width="20" height="20" viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"> <polygon fill="none" stroke="#000" points="5.5 1.5 15.5 1.5 15.5 17.5 10.5 12.5 5.5 17.5" /></svg>';
  var calendar = '<svg width="20" height="20" viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"> <path d="M 2,3 2,17 18,17 18,3 2,3 Z M 17,16 3,16 3,8 17,8 17,16 Z M 17,7 3,7 3,4 17,4 17,7 Z" /> <rect width="1" height="3" x="6" y="2" /> <rect width="1" height="3" x="13" y="2" /></svg>';
  var camera = '<svg width="20" height="20" viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"> <circle fill="none" stroke="#000" stroke-width="1.1" cx="10" cy="10.8" r="3.8" /> <path fill="none" stroke="#000" d="M1,4.5 C0.7,4.5 0.5,4.7 0.5,5 L0.5,17 C0.5,17.3 0.7,17.5 1,17.5 L19,17.5 C19.3,17.5 19.5,17.3 19.5,17 L19.5,5 C19.5,4.7 19.3,4.5 19,4.5 L13.5,4.5 L13.5,2.9 C13.5,2.6 13.3,2.5 13,2.5 L7,2.5 C6.7,2.5 6.5,2.6 6.5,2.9 L6.5,4.5 L1,4.5 L1,4.5 Z" /></svg>';
  var cart = '<svg width="20" height="20" viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"> <circle cx="7.3" cy="17.3" r="1.4" /> <circle cx="13.3" cy="17.3" r="1.4" /> <polyline fill="none" stroke="#000" points="0 2 3.2 4 5.3 12.5 16 12.5 18 6.5 8 6.5" /></svg>';
  var check = '<svg width="20" height="20" viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"> <polyline fill="none" stroke="#000" stroke-width="1.1" points="4,10 8,15 17,4" /></svg>';
  var clock = '<svg width="20" height="20" viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"> <circle fill="none" stroke="#000" stroke-width="1.1" cx="10" cy="10" r="9" /> <rect x="9" y="4" width="1" height="7" /> <path fill="none" stroke="#000" stroke-width="1.1" d="M13.018,14.197 L9.445,10.625" /></svg>';
  var close = '<svg width="20" height="20" viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"> <path fill="none" stroke="#000" stroke-width="1.06" d="M16,16 L4,4" /> <path fill="none" stroke="#000" stroke-width="1.06" d="M16,4 L4,16" /></svg>';
  var code = '<svg width="20" height="20" viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"> <polyline fill="none" stroke="#000" stroke-width="1.01" points="13,4 19,10 13,16" /> <polyline fill="none" stroke="#000" stroke-width="1.01" points="7,4 1,10 7,16" /></svg>';
  var cog = '<svg width="20" height="20" viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"> <circle fill="none" stroke="#000" cx="9.997" cy="10" r="3.31" /> <path fill="none" stroke="#000" d="M18.488,12.285 L16.205,16.237 C15.322,15.496 14.185,15.281 13.303,15.791 C12.428,16.289 12.047,17.373 12.246,18.5 L7.735,18.5 C7.938,17.374 7.553,16.299 6.684,15.791 C5.801,15.27 4.655,15.492 3.773,16.237 L1.5,12.285 C2.573,11.871 3.317,10.999 3.317,9.991 C3.305,8.98 2.573,8.121 1.5,7.716 L3.765,3.784 C4.645,4.516 5.794,4.738 6.687,4.232 C7.555,3.722 7.939,2.637 7.735,1.5 L12.263,1.5 C12.072,2.637 12.441,3.71 13.314,4.22 C14.206,4.73 15.343,4.516 16.225,3.794 L18.487,7.714 C17.404,8.117 16.661,8.988 16.67,10.009 C16.672,11.018 17.415,11.88 18.488,12.285 L18.488,12.285 Z" /></svg>';
  var comment = '<svg width="20" height="20" viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"> <path d="M6,18.71 L6,14 L1,14 L1,1 L19,1 L19,14 L10.71,14 L6,18.71 L6,18.71 Z M2,13 L7,13 L7,16.29 L10.29,13 L18,13 L18,2 L2,2 L2,13 L2,13 Z" /></svg>';
  var commenting = '<svg width="20" height="20" viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"> <polygon fill="none" stroke="#000" points="1.5,1.5 18.5,1.5 18.5,13.5 10.5,13.5 6.5,17.5 6.5,13.5 1.5,13.5" /> <circle cx="10" cy="8" r="1" /> <circle cx="6" cy="8" r="1" /> <circle cx="14" cy="8" r="1" /></svg>';
  var comments = '<svg width="20" height="20" viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"> <polyline fill="none" stroke="#000" points="2 0.5 19.5 0.5 19.5 13" /> <path d="M5,19.71 L5,15 L0,15 L0,2 L18,2 L18,15 L9.71,15 L5,19.71 L5,19.71 L5,19.71 Z M1,14 L6,14 L6,17.29 L9.29,14 L17,14 L17,3 L1,3 L1,14 L1,14 L1,14 Z" /></svg>';
  var copy = '<svg width="20" height="20" viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"> <rect fill="none" stroke="#000" x="3.5" y="2.5" width="12" height="16" /> <polyline fill="none" stroke="#000" points="5 0.5 17.5 0.5 17.5 17" /></svg>';
  var database = '<svg width="20" height="20" viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"> <ellipse fill="none" stroke="#000" cx="10" cy="4.64" rx="7.5" ry="3.14" /> <path fill="none" stroke="#000" d="M17.5,8.11 C17.5,9.85 14.14,11.25 10,11.25 C5.86,11.25 2.5,9.84 2.5,8.11" /> <path fill="none" stroke="#000" d="M17.5,11.25 C17.5,12.99 14.14,14.39 10,14.39 C5.86,14.39 2.5,12.98 2.5,11.25" /> <path fill="none" stroke="#000" d="M17.49,4.64 L17.5,14.36 C17.5,16.1 14.14,17.5 10,17.5 C5.86,17.5 2.5,16.09 2.5,14.36 L2.5,4.64" /></svg>';
  var desktop = '<svg width="20" height="20" viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"> <rect x="8" y="15" width="1" height="2" /> <rect x="11" y="15" width="1" height="2" /> <rect x="5" y="16" width="10" height="1" /> <rect fill="none" stroke="#000" x="1.5" y="3.5" width="17" height="11" /></svg>';
  var download = '<svg width="20" height="20" viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"> <polyline fill="none" stroke="#000" points="14,10 9.5,14.5 5,10" /> <rect x="3" y="17" width="13" height="1" /> <line fill="none" stroke="#000" x1="9.5" y1="13.91" x2="9.5" y2="3" /></svg>';
  var expand = '<svg width="20" height="20" viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"> <polygon points="13 2 18 2 18 7 17 7 17 3 13 3" /> <polygon points="2 13 3 13 3 17 7 17 7 18 2 18" /> <path fill="none" stroke="#000" stroke-width="1.1" d="M11,9 L17,3" /> <path fill="none" stroke="#000" stroke-width="1.1" d="M3,17 L9,11" /></svg>';
  var facebook = '<svg width="20" height="20" viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"> <path d="M11,10h2.6l0.4-3H11V5.3c0-0.9,0.2-1.5,1.5-1.5H14V1.1c-0.3,0-1-0.1-2.1-0.1C9.6,1,8,2.4,8,5v2H5.5v3H8v8h3V10z" /></svg>';
  var file = '<svg width="20" height="20" viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"> <rect fill="none" stroke="#000" x="3.5" y="1.5" width="13" height="17" /></svg>';
  var folder = '<svg width="20" height="20" viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"> <polygon fill="none" stroke="#000" points="9.5 5.5 8.5 3.5 1.5 3.5 1.5 16.5 18.5 16.5 18.5 5.5" /></svg>';
  var forward = '<svg width="20" height="20" viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"> <path d="M2.47,13.11 C4.02,10.02 6.27,7.85 9.04,6.61 C9.48,6.41 10.27,6.13 11,5.91 L11,2 L18.89,9 L11,16 L11,12.13 C9.25,12.47 7.58,13.19 6.02,14.25 C3.03,16.28 1.63,18.54 1.63,18.54 C1.63,18.54 1.38,15.28 2.47,13.11 L2.47,13.11 Z M5.3,13.53 C6.92,12.4 9.04,11.4 12,10.92 L12,13.63 L17.36,9 L12,4.25 L12,6.8 C11.71,6.86 10.86,7.02 9.67,7.49 C6.79,8.65 4.58,10.96 3.49,13.08 C3.18,13.7 2.68,14.87 2.49,16 C3.28,15.05 4.4,14.15 5.3,13.53 L5.3,13.53 Z" /></svg>';
  var foursquare = '<svg width="20" height="20" viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"> <path d="M15.23,2 C15.96,2 16.4,2.41 16.5,2.86 C16.57,3.15 16.56,3.44 16.51,3.73 C16.46,4.04 14.86,11.72 14.75,12.03 C14.56,12.56 14.16,12.82 13.61,12.83 C13.03,12.84 11.09,12.51 10.69,13 C10.38,13.38 7.79,16.39 6.81,17.53 C6.61,17.76 6.4,17.96 6.08,17.99 C5.68,18.04 5.29,17.87 5.17,17.45 C5.12,17.28 5.1,17.09 5.1,16.91 C5.1,12.4 4.86,7.81 5.11,3.31 C5.17,2.5 5.81,2.12 6.53,2 L15.23,2 L15.23,2 Z M9.76,11.42 C9.94,11.19 10.17,11.1 10.45,11.1 L12.86,11.1 C13.12,11.1 13.31,10.94 13.36,10.69 C13.37,10.64 13.62,9.41 13.74,8.83 C13.81,8.52 13.53,8.28 13.27,8.28 C12.35,8.29 11.42,8.28 10.5,8.28 C9.84,8.28 9.83,7.69 9.82,7.21 C9.8,6.85 10.13,6.55 10.5,6.55 C11.59,6.56 12.67,6.55 13.76,6.55 C14.03,6.55 14.23,6.4 14.28,6.14 C14.34,5.87 14.67,4.29 14.67,4.29 C14.67,4.29 14.82,3.74 14.19,3.74 L7.34,3.74 C7,3.75 6.84,4.02 6.84,4.33 C6.84,7.58 6.85,14.95 6.85,14.99 C6.87,15 8.89,12.51 9.76,11.42 L9.76,11.42 Z" /></svg>';
  var future = '<svg width="20" height="20" viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"> <polyline points="19 2 18 2 18 6 14 6 14 7 19 7 19 2" /> <path fill="none" stroke="#000" stroke-width="1.1" d="M18,6.548 C16.709,3.29 13.354,1 9.6,1 C4.6,1 0.6,5 0.6,10 C0.6,15 4.6,19 9.6,19 C14.6,19 18.6,15 18.6,10" /> <rect x="9" y="4" width="1" height="7" /> <path d="M13.018,14.197 L9.445,10.625" fill="none" stroke="#000" stroke-width="1.1" /></svg>';
  var google = '<svg width="20" height="20" viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"> <path d="M17.86,9.09 C18.46,12.12 17.14,16.05 13.81,17.56 C9.45,19.53 4.13,17.68 2.47,12.87 C0.68,7.68 4.22,2.42 9.5,2.03 C11.57,1.88 13.42,2.37 15.05,3.65 C15.22,3.78 15.37,3.93 15.61,4.14 C14.9,4.81 14.23,5.45 13.5,6.14 C12.27,5.08 10.84,4.72 9.28,4.98 C8.12,5.17 7.16,5.76 6.37,6.63 C4.88,8.27 4.62,10.86 5.76,12.82 C6.95,14.87 9.17,15.8 11.57,15.25 C13.27,14.87 14.76,13.33 14.89,11.75 L10.51,11.75 L10.51,9.09 L17.86,9.09 L17.86,9.09 Z" /></svg>';
  var grid = '<svg width="20" height="20" viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"> <rect x="2" y="2" width="3" height="3" /> <rect x="8" y="2" width="3" height="3" /> <rect x="14" y="2" width="3" height="3" /> <rect x="2" y="8" width="3" height="3" /> <rect x="8" y="8" width="3" height="3" /> <rect x="14" y="8" width="3" height="3" /> <rect x="2" y="14" width="3" height="3" /> <rect x="8" y="14" width="3" height="3" /> <rect x="14" y="14" width="3" height="3" /></svg>';
  var happy = '<svg width="20" height="20" viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"> <circle cx="13" cy="7" r="1" /> <circle cx="7" cy="7" r="1" /> <circle fill="none" stroke="#000" cx="10" cy="10" r="8.5" /> <path fill="none" stroke="#000" d="M14.6,11.4 C13.9,13.3 12.1,14.5 10,14.5 C7.9,14.5 6.1,13.3 5.4,11.4" /></svg>';
  var hashtag = '<svg width="20" height="20" viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"> <path d="M15.431,8 L15.661,7 L12.911,7 L13.831,3 L12.901,3 L11.98,7 L9.29,7 L10.21,3 L9.281,3 L8.361,7 L5.23,7 L5,8 L8.13,8 L7.21,12 L4.23,12 L4,13 L6.98,13 L6.061,17 L6.991,17 L7.911,13 L10.601,13 L9.681,17 L10.611,17 L11.531,13 L14.431,13 L14.661,12 L11.76,12 L12.681,8 L15.431,8 Z M10.831,12 L8.141,12 L9.061,8 L11.75,8 L10.831,12 Z" /></svg>';
  var heart = '<svg width="20" height="20" viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"> <path fill="none" stroke="#000" stroke-width="1.03" d="M10,4 C10,4 8.1,2 5.74,2 C3.38,2 1,3.55 1,6.73 C1,8.84 2.67,10.44 2.67,10.44 L10,18 L17.33,10.44 C17.33,10.44 19,8.84 19,6.73 C19,3.55 16.62,2 14.26,2 C11.9,2 10,4 10,4 L10,4 Z" /></svg>';
  var history = '<svg width="20" height="20" viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"> <polyline fill="#000" points="1 2 2 2 2 6 6 6 6 7 1 7 1 2" /> <path fill="none" stroke="#000" stroke-width="1.1" d="M2.1,6.548 C3.391,3.29 6.746,1 10.5,1 C15.5,1 19.5,5 19.5,10 C19.5,15 15.5,19 10.5,19 C5.5,19 1.5,15 1.5,10" /> <rect x="9" y="4" width="1" height="7" /> <path fill="none" stroke="#000" stroke-width="1.1" d="M13.018,14.197 L9.445,10.625" id="Shape" /></svg>';
  var home = '<svg width="20" height="20" viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"> <polygon points="18.65 11.35 10 2.71 1.35 11.35 0.65 10.65 10 1.29 19.35 10.65" /> <polygon points="15 4 18 4 18 7 17 7 17 5 15 5" /> <polygon points="3 11 4 11 4 18 7 18 7 12 12 12 12 18 16 18 16 11 17 11 17 19 11 19 11 13 8 13 8 19 3 19" /></svg>';
  var image = '<svg width="20" height="20" viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"> <circle cx="16.1" cy="6.1" r="1.1" /> <rect fill="none" stroke="#000" x="0.5" y="2.5" width="19" height="15" /> <polyline fill="none" stroke="#000" stroke-width="1.01" points="4,13 8,9 13,14" /> <polyline fill="none" stroke="#000" stroke-width="1.01" points="11,12 12.5,10.5 16,14" /></svg>';
  var info = '<svg width="20" height="20" viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"> <path d="M12.13,11.59 C11.97,12.84 10.35,14.12 9.1,14.16 C6.17,14.2 9.89,9.46 8.74,8.37 C9.3,8.16 10.62,7.83 10.62,8.81 C10.62,9.63 10.12,10.55 9.88,11.32 C8.66,15.16 12.13,11.15 12.14,11.18 C12.16,11.21 12.16,11.35 12.13,11.59 C12.08,11.95 12.16,11.35 12.13,11.59 L12.13,11.59 Z M11.56,5.67 C11.56,6.67 9.36,7.15 9.36,6.03 C9.36,5 11.56,4.54 11.56,5.67 L11.56,5.67 Z" /> <circle fill="none" stroke="#000" stroke-width="1.1" cx="10" cy="10" r="9" /></svg>';
  var instagram = '<svg width="20" height="20" viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"> <path d="M13.55,1H6.46C3.45,1,1,3.44,1,6.44v7.12c0,3,2.45,5.44,5.46,5.44h7.08c3.02,0,5.46-2.44,5.46-5.44V6.44 C19.01,3.44,16.56,1,13.55,1z M17.5,14c0,1.93-1.57,3.5-3.5,3.5H6c-1.93,0-3.5-1.57-3.5-3.5V6c0-1.93,1.57-3.5,3.5-3.5h8 c1.93,0,3.5,1.57,3.5,3.5V14z" /> <circle cx="14.87" cy="5.26" r="1.09" /> <path d="M10.03,5.45c-2.55,0-4.63,2.06-4.63,4.6c0,2.55,2.07,4.61,4.63,4.61c2.56,0,4.63-2.061,4.63-4.61 C14.65,7.51,12.58,5.45,10.03,5.45L10.03,5.45L10.03,5.45z M10.08,13c-1.66,0-3-1.34-3-2.99c0-1.65,1.34-2.99,3-2.99s3,1.34,3,2.99 C13.08,11.66,11.74,13,10.08,13L10.08,13L10.08,13z" /></svg>';
  var laptop = '<svg width="20" height="20" viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"> <rect y="16" width="20" height="1" /> <rect fill="none" stroke="#000" x="2.5" y="4.5" width="15" height="10" /></svg>';
  var lifesaver = '<svg width="20" height="20" viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"> <path d="M10,0.5 C4.76,0.5 0.5,4.76 0.5,10 C0.5,15.24 4.76,19.5 10,19.5 C15.24,19.5 19.5,15.24 19.5,10 C19.5,4.76 15.24,0.5 10,0.5 L10,0.5 Z M10,1.5 C11.49,1.5 12.89,1.88 14.11,2.56 L11.85,4.82 C11.27,4.61 10.65,4.5 10,4.5 C9.21,4.5 8.47,4.67 7.79,4.96 L5.58,2.75 C6.87,1.95 8.38,1.5 10,1.5 L10,1.5 Z M4.96,7.8 C4.67,8.48 4.5,9.21 4.5,10 C4.5,10.65 4.61,11.27 4.83,11.85 L2.56,14.11 C1.88,12.89 1.5,11.49 1.5,10 C1.5,8.38 1.95,6.87 2.75,5.58 L4.96,7.79 L4.96,7.8 L4.96,7.8 Z M10,18.5 C8.25,18.5 6.62,17.97 5.27,17.06 L7.46,14.87 C8.22,15.27 9.08,15.5 10,15.5 C10.79,15.5 11.53,15.33 12.21,15.04 L14.42,17.25 C13.13,18.05 11.62,18.5 10,18.5 L10,18.5 Z M10,14.5 C7.52,14.5 5.5,12.48 5.5,10 C5.5,7.52 7.52,5.5 10,5.5 C12.48,5.5 14.5,7.52 14.5,10 C14.5,12.48 12.48,14.5 10,14.5 L10,14.5 Z M15.04,12.21 C15.33,11.53 15.5,10.79 15.5,10 C15.5,9.08 15.27,8.22 14.87,7.46 L17.06,5.27 C17.97,6.62 18.5,8.25 18.5,10 C18.5,11.62 18.05,13.13 17.25,14.42 L15.04,12.21 L15.04,12.21 Z" /></svg>';
  var link = '<svg width="20" height="20" viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"> <path fill="none" stroke="#000" stroke-width="1.1" d="M10.625,12.375 L7.525,15.475 C6.825,16.175 5.925,16.175 5.225,15.475 L4.525,14.775 C3.825,14.074 3.825,13.175 4.525,12.475 L7.625,9.375" /> <path fill="none" stroke="#000" stroke-width="1.1" d="M9.325,7.375 L12.425,4.275 C13.125,3.575 14.025,3.575 14.724,4.275 L15.425,4.975 C16.125,5.675 16.125,6.575 15.425,7.275 L12.325,10.375" /> <path fill="none" stroke="#000" stroke-width="1.1" d="M7.925,11.875 L11.925,7.975" /></svg>';
  var linkedin = '<svg width="20" height="20" viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"> <path d="M5.77,17.89 L5.77,7.17 L2.21,7.17 L2.21,17.89 L5.77,17.89 L5.77,17.89 Z M3.99,5.71 C5.23,5.71 6.01,4.89 6.01,3.86 C5.99,2.8 5.24,2 4.02,2 C2.8,2 2,2.8 2,3.85 C2,4.88 2.77,5.7 3.97,5.7 L3.99,5.7 L3.99,5.71 L3.99,5.71 Z" /> <path d="M7.75,17.89 L11.31,17.89 L11.31,11.9 C11.31,11.58 11.33,11.26 11.43,11.03 C11.69,10.39 12.27,9.73 13.26,9.73 C14.55,9.73 15.06,10.71 15.06,12.15 L15.06,17.89 L18.62,17.89 L18.62,11.74 C18.62,8.45 16.86,6.92 14.52,6.92 C12.6,6.92 11.75,7.99 11.28,8.73 L11.3,8.73 L11.3,7.17 L7.75,7.17 C7.79,8.17 7.75,17.89 7.75,17.89 L7.75,17.89 L7.75,17.89 Z" /></svg>';
  var list = '<svg width="20" height="20" viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"> <rect x="6" y="4" width="12" height="1" /> <rect x="6" y="9" width="12" height="1" /> <rect x="6" y="14" width="12" height="1" /> <rect x="2" y="4" width="2" height="1" /> <rect x="2" y="9" width="2" height="1" /> <rect x="2" y="14" width="2" height="1" /></svg>';
  var location = '<svg width="20" height="20" viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"> <path fill="none" stroke="#000" stroke-width="1.01" d="M10,0.5 C6.41,0.5 3.5,3.39 3.5,6.98 C3.5,11.83 10,19 10,19 C10,19 16.5,11.83 16.5,6.98 C16.5,3.39 13.59,0.5 10,0.5 L10,0.5 Z" /> <circle fill="none" stroke="#000" cx="10" cy="6.8" r="2.3" /></svg>';
  var lock = '<svg width="20" height="20" viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"> <rect fill="none" stroke="#000" height="10" width="13" y="8.5" x="3.5" /> <path fill="none" stroke="#000" d="M6.5,8 L6.5,4.88 C6.5,3.01 8.07,1.5 10,1.5 C11.93,1.5 13.5,3.01 13.5,4.88 L13.5,8" /></svg>';
  var mail = '<svg width="20" height="20" viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"> <polyline fill="none" stroke="#000" points="1.4,6.5 10,11 18.6,6.5" /> <path d="M 1,4 1,16 19,16 19,4 1,4 Z M 18,15 2,15 2,5 18,5 18,15 Z" /></svg>';
  var menu = '<svg width="20" height="20" viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"> <rect x="2" y="4" width="16" height="1" /> <rect x="2" y="9" width="16" height="1" /> <rect x="2" y="14" width="16" height="1" /></svg>';
  var minus = '<svg width="20" height="20" viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"> <rect height="1" width="18" y="9" x="1" /></svg>';
  var more = '<svg width="20" height="20" viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"> <circle cx="3" cy="10" r="2" /> <circle cx="10" cy="10" r="2" /> <circle cx="17" cy="10" r="2" /></svg>';
  var move = '<svg width="20" height="20" viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"> <polygon points="4,5 1,5 1,9 2,9 2,6 4,6 " /> <polygon points="1,16 2,16 2,18 4,18 4,19 1,19 " /> <polygon points="14,16 14,19 11,19 11,18 13,18 13,16 " /> <rect fill="none" stroke="#000" x="5.5" y="1.5" width="13" height="13" /> <rect x="1" y="11" width="1" height="3" /> <rect x="6" y="18" width="3" height="1" /></svg>';
  var nut = '<svg width="20" height="20" viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"> <polygon fill="none" stroke="#000" points="2.5,5.7 10,1.3 17.5,5.7 17.5,14.3 10,18.7 2.5,14.3" /> <circle fill="none" stroke="#000" cx="10" cy="10" r="3.5" /></svg>';
  var pencil = '<svg width="20" height="20" viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"> <path fill="none" stroke="#000" d="M17.25,6.01 L7.12,16.1 L3.82,17.2 L5.02,13.9 L15.12,3.88 C15.71,3.29 16.66,3.29 17.25,3.88 C17.83,4.47 17.83,5.42 17.25,6.01 L17.25,6.01 Z" /> <path fill="none" stroke="#000" d="M15.98,7.268 L13.851,5.148" /></svg>';
  var phone = '<svg width="20" height="20" viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"> <path fill="none" stroke="#000" d="M15.5,17 C15.5,17.8 14.8,18.5 14,18.5 L7,18.5 C6.2,18.5 5.5,17.8 5.5,17 L5.5,3 C5.5,2.2 6.2,1.5 7,1.5 L14,1.5 C14.8,1.5 15.5,2.2 15.5,3 L15.5,17 L15.5,17 L15.5,17 Z" /> <circle cx="10.5" cy="16.5" r="0.8" /></svg>';
  var play = '<svg width="20" height="20" viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"> <polygon fill="none" stroke="#000" points="6.5,5 14.5,10 6.5,15" /></svg>';
  var plus = '<svg width="20" height="20" viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"> <rect x="9" y="1" width="1" height="17" /> <rect x="1" y="9" width="17" height="1" /></svg>';
  var pull = '<svg width="20" height="20" viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"> <polygon points="6.85,8 9.5,10.6 12.15,8 12.85,8.7 9.5,12 6.15,8.7" /> <line fill="none" stroke="#000" x1="9.5" y1="11" x2="9.5" y2="2" /> <polyline fill="none" stroke="#000" points="6,5.5 3.5,5.5 3.5,18.5 15.5,18.5 15.5,5.5 13,5.5" /></svg>';
  var push = '<svg width="20" height="20" viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"> <polygon points="12.15,4 9.5,1.4 6.85,4 6.15,3.3 9.5,0 12.85,3.3" /> <line fill="none" stroke="#000" x1="9.5" y1="10" x2="9.5" y2="1" /> <polyline fill="none" stroke="#000" points="6 5.5 3.5 5.5 3.5 18.5 15.5 18.5 15.5 5.5 13 5.5" /></svg>';
  var question = '<svg width="20" height="20" viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"> <circle fill="none" stroke="#000" stroke-width="1.1" cx="10" cy="10" r="9" /> <circle cx="10.44" cy="14.42" r="1.05" /> <path fill="none" stroke="#000" stroke-width="1.2" d="M8.17,7.79 C8.17,4.75 12.72,4.73 12.72,7.72 C12.72,8.67 11.81,9.15 11.23,9.75 C10.75,10.24 10.51,10.73 10.45,11.4 C10.44,11.53 10.43,11.64 10.43,11.75" /></svg>';
  var receiver = '<svg width="20" height="20" viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"> <path fill="none" stroke="#000" stroke-width="1.01" d="M6.189,13.611C8.134,15.525 11.097,18.239 13.867,18.257C16.47,18.275 18.2,16.241 18.2,16.241L14.509,12.551L11.539,13.639L6.189,8.29L7.313,5.355L3.76,1.8C3.76,1.8 1.732,3.537 1.7,6.092C1.667,8.809 4.347,11.738 6.189,13.611" /></svg>';
  var refresh = '<svg width="20" height="20" viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"> <path fill="none" stroke="#000" stroke-width="1.1" d="M17.08,11.15 C17.09,11.31 17.1,11.47 17.1,11.64 C17.1,15.53 13.94,18.69 10.05,18.69 C6.16,18.68 3,15.53 3,11.63 C3,7.74 6.16,4.58 10.05,4.58 C10.9,4.58 11.71,4.73 12.46,5" /> <polyline fill="none" stroke="#000" points="9.9 2 12.79 4.89 9.79 7.9" /></svg>';
  var reply = '<svg width="20" height="20" viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"> <path d="M17.7,13.11 C16.12,10.02 13.84,7.85 11.02,6.61 C10.57,6.41 9.75,6.13 9,5.91 L9,2 L1,9 L9,16 L9,12.13 C10.78,12.47 12.5,13.19 14.09,14.25 C17.13,16.28 18.56,18.54 18.56,18.54 C18.56,18.54 18.81,15.28 17.7,13.11 L17.7,13.11 Z M14.82,13.53 C13.17,12.4 11.01,11.4 8,10.92 L8,13.63 L2.55,9 L8,4.25 L8,6.8 C8.3,6.86 9.16,7.02 10.37,7.49 C13.3,8.65 15.54,10.96 16.65,13.08 C16.97,13.7 17.48,14.86 17.68,16 C16.87,15.05 15.73,14.15 14.82,13.53 L14.82,13.53 Z" /></svg>';
  var rss = '<svg width="20" height="20" viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"> <circle cx="3.12" cy="16.8" r="1.85" /> <path fill="none" stroke="#000" stroke-width="1.1" d="M1.5,8.2 C1.78,8.18 2.06,8.16 2.35,8.16 C7.57,8.16 11.81,12.37 11.81,17.57 C11.81,17.89 11.79,18.19 11.76,18.5" /> <path fill="none" stroke="#000" stroke-width="1.1" d="M1.5,2.52 C1.78,2.51 2.06,2.5 2.35,2.5 C10.72,2.5 17.5,9.24 17.5,17.57 C17.5,17.89 17.49,18.19 17.47,18.5" /></svg>';
  var search = '<svg width="20" height="20" viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"> <circle fill="none" stroke="#000" stroke-width="1.1" cx="9" cy="9" r="7" /> <path fill="none" stroke="#000" stroke-width="1.1" d="M14,14 L18,18 L14,14 Z" /></svg>';
  var server = '<svg width="20" height="20" viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"> <rect x="3" y="3" width="1" height="2" /> <rect x="5" y="3" width="1" height="2" /> <rect x="7" y="3" width="1" height="2" /> <rect x="16" y="3" width="1" height="1" /> <rect x="16" y="10" width="1" height="1" /> <circle fill="none" stroke="#000" cx="9.9" cy="17.4" r="1.4" /> <rect x="3" y="10" width="1" height="2" /> <rect x="5" y="10" width="1" height="2" /> <rect x="9.5" y="14" width="1" height="2" /> <rect x="3" y="17" width="6" height="1" /> <rect x="11" y="17" width="6" height="1" /> <rect fill="none" stroke="#000" x="1.5" y="1.5" width="17" height="5" /> <rect fill="none" stroke="#000" x="1.5" y="8.5" width="17" height="5" /></svg>';
  var settings = '<svg width="20" height="20" viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"> <ellipse fill="none" stroke="#000" cx="6.11" cy="3.55" rx="2.11" ry="2.15" /> <ellipse fill="none" stroke="#000" cx="6.11" cy="15.55" rx="2.11" ry="2.15" /> <circle fill="none" stroke="#000" cx="13.15" cy="9.55" r="2.15" /> <rect x="1" y="3" width="3" height="1" /> <rect x="10" y="3" width="8" height="1" /> <rect x="1" y="9" width="8" height="1" /> <rect x="15" y="9" width="3" height="1" /> <rect x="1" y="15" width="3" height="1" /> <rect x="10" y="15" width="8" height="1" /></svg>';
  var shrink = '<svg width="20" height="20" viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"> <polygon points="11 4 12 4 12 8 16 8 16 9 11 9" /> <polygon points="4 11 9 11 9 16 8 16 8 12 4 12" /> <path fill="none" stroke="#000" stroke-width="1.1" d="M12,8 L18,2" /> <path fill="none" stroke="#000" stroke-width="1.1" d="M2,18 L8,12" /></svg>';
  var social = '<svg width="20" height="20" viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"> <line fill="none" stroke="#000" stroke-width="1.1" x1="13.4" y1="14" x2="6.3" y2="10.7" /> <line fill="none" stroke="#000" stroke-width="1.1" x1="13.5" y1="5.5" x2="6.5" y2="8.8" /> <circle fill="none" stroke="#000" stroke-width="1.1" cx="15.5" cy="4.6" r="2.3" /> <circle fill="none" stroke="#000" stroke-width="1.1" cx="15.5" cy="14.8" r="2.3" /> <circle fill="none" stroke="#000" stroke-width="1.1" cx="4.5" cy="9.8" r="2.3" /></svg>';
  var star = '<svg width="20" height="20" viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"> <polygon fill="none" stroke="#000" stroke-width="1.01" points="10 2 12.63 7.27 18.5 8.12 14.25 12.22 15.25 18 10 15.27 4.75 18 5.75 12.22 1.5 8.12 7.37 7.27" /></svg>';
  var table = '<svg width="20" height="20" viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"> <rect x="1" y="3" width="18" height="1" /> <rect x="1" y="7" width="18" height="1" /> <rect x="1" y="11" width="18" height="1" /> <rect x="1" y="15" width="18" height="1" /></svg>';
  var tablet = '<svg width="20" height="20" viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"> <path fill="none" stroke="#000" d="M5,18.5 C4.2,18.5 3.5,17.8 3.5,17 L3.5,3 C3.5,2.2 4.2,1.5 5,1.5 L16,1.5 C16.8,1.5 17.5,2.2 17.5,3 L17.5,17 C17.5,17.8 16.8,18.5 16,18.5 L5,18.5 L5,18.5 L5,18.5 Z" /> <circle cx="10.5" cy="16.3" r="0.8" /></svg>';
  var tag = '<svg width="20" height="20" viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"> <path fill="none" stroke="#000" stroke-width="1.1" d="M17.5,3.71 L17.5,7.72 C17.5,7.96 17.4,8.2 17.21,8.39 L8.39,17.2 C7.99,17.6 7.33,17.6 6.93,17.2 L2.8,13.07 C2.4,12.67 2.4,12.01 2.8,11.61 L11.61,2.8 C11.81,2.6 12.08,2.5 12.34,2.5 L16.19,2.5 C16.52,2.5 16.86,2.63 17.11,2.88 C17.35,3.11 17.48,3.4 17.5,3.71 L17.5,3.71 Z" /> <circle cx="14" cy="6" r="1" /></svg>';
  var thumbnails = '<svg width="20" height="20" viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"> <rect fill="none" stroke="#000" x="3.5" y="3.5" width="5" height="5" /> <rect fill="none" stroke="#000" x="11.5" y="3.5" width="5" height="5" /> <rect fill="none" stroke="#000" x="11.5" y="11.5" width="5" height="5" /> <rect fill="none" stroke="#000" x="3.5" y="11.5" width="5" height="5" /></svg>';
  var trash = '<svg width="20" height="20" viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"> <polyline fill="none" stroke="#000" points="6.5 3 6.5 1.5 13.5 1.5 13.5 3" /> <polyline fill="none" stroke="#000" points="4.5 4 4.5 18.5 15.5 18.5 15.5 4" /> <rect x="8" y="7" width="1" height="9" /> <rect x="11" y="7" width="1" height="9" /> <rect x="2" y="3" width="16" height="1" /></svg>';
  var tumblr = '<svg width="20" height="20" viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"> <path d="M6.885,8.598c0,0,0,3.393,0,4.996c0,0.282,0,0.66,0.094,0.942c0.377,1.509,1.131,2.545,2.545,3.11 c1.319,0.472,2.356,0.472,3.676,0c0.565-0.188,1.132-0.659,1.132-0.659l-0.849-2.263c0,0-1.036,0.378-1.603,0.283 c-0.565-0.094-1.226-0.66-1.226-1.508c0-1.603,0-4.902,0-4.902h2.828V5.771h-2.828V2H8.205c0,0-0.094,0.66-0.188,0.942 C7.828,3.791,7.262,4.733,6.603,5.394C5.848,6.147,5,6.43,5,6.43v2.168H6.885z" /></svg>';
  var tv = '<svg width="20" height="20" viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"> <rect x="7" y="16" width="6" height="1" /> <rect fill="none" stroke="#000" x="0.5" y="3.5" width="19" height="11" /></svg>';
  var twitter = '<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 15 15" style="enable-background:new 0 0 15 15;" xml:space="preserve"> <style type="text/css"> .st0{fill:#FFFFFF;} </style> <path class="st0" d="M8.9,6.4L14.5,0h-1.3L8.3,5.5L4.5,0H0l5.9,8.3L0,15h1.3l5.1-5.8l4.1,5.8H15L8.9,6.4z M1.8,1h2l9.4,13.1h-2 L1.8,1z"/> </svg>';
  var unlock = '<svg width="20" height="20" viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"> <rect fill="none" stroke="#000" x="3.5" y="8.5" width="13" height="10" /> <path fill="none" stroke="#000" d="M6.5,8.5 L6.5,4.9 C6.5,3 8.1,1.5 10,1.5 C11.9,1.5 13.5,3 13.5,4.9" /></svg>';
  var upload = '<svg width="20" height="20" viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"> <polyline fill="none" stroke="#000" points="5 8 9.5 3.5 14 8 " /> <rect x="3" y="17" width="13" height="1" /> <line fill="none" stroke="#000" x1="9.5" y1="15" x2="9.5" y2="4" /></svg>';
  var user = '<svg width="20" height="20" viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"> <circle fill="none" stroke="#000" stroke-width="1.1" cx="9.9" cy="6.4" r="4.4" /> <path fill="none" stroke="#000" stroke-width="1.1" d="M1.5,19 C2.3,14.5 5.8,11.2 10,11.2 C14.2,11.2 17.7,14.6 18.5,19.2" /></svg>';
  var users = '<svg width="20" height="20" viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"> <circle fill="none" stroke="#000" stroke-width="1.1" cx="7.7" cy="8.6" r="3.5" /> <path fill="none" stroke="#000" stroke-width="1.1" d="M1,18.1 C1.7,14.6 4.4,12.1 7.6,12.1 C10.9,12.1 13.7,14.8 14.3,18.3" /> <path fill="none" stroke="#000" stroke-width="1.1" d="M11.4,4 C12.8,2.4 15.4,2.8 16.3,4.7 C17.2,6.6 15.7,8.9 13.6,8.9 C16.5,8.9 18.8,11.3 19.2,14.1" /></svg>';
  var vimeo = '<svg width="20" height="20" viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"> <path d="M2.065,7.59C1.84,7.367,1.654,7.082,1.468,6.838c-0.332-0.42-0.137-0.411,0.274-0.772c1.026-0.91,2.004-1.896,3.127-2.688 c1.017-0.713,2.365-1.173,3.286-0.039c0.849,1.045,0.869,2.629,1.084,3.891c0.215,1.309,0.421,2.648,0.88,3.901 c0.127,0.352,0.37,1.018,0.81,1.074c0.567,0.078,1.145-0.917,1.408-1.289c0.684-0.987,1.611-2.317,1.494-3.587 c-0.115-1.349-1.572-1.095-2.482-0.773c0.146-1.514,1.555-3.216,2.912-3.792c1.439-0.597,3.579-0.587,4.302,1.036 c0.772,1.759,0.078,3.802-0.763,5.396c-0.918,1.731-2.1,3.333-3.363,4.829c-1.114,1.329-2.432,2.787-4.093,3.422 c-1.897,0.723-3.021-0.686-3.667-2.318c-0.705-1.777-1.056-3.771-1.565-5.621C4.898,8.726,4.644,7.836,4.136,7.191 C3.473,6.358,2.72,7.141,2.065,7.59C1.977,7.502,2.115,7.551,2.065,7.59L2.065,7.59z" /></svg>';
  var warning = '<svg width="20" height="20" viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"> <circle cx="10" cy="14" r="1" /> <circle fill="none" stroke="#000" stroke-width="1.1" cx="10" cy="10" r="9" /> <path d="M10.97,7.72 C10.85,9.54 10.56,11.29 10.56,11.29 C10.51,11.87 10.27,12 9.99,12 C9.69,12 9.49,11.87 9.43,11.29 C9.43,11.29 9.16,9.54 9.03,7.72 C8.96,6.54 9.03,6 9.03,6 C9.03,5.45 9.46,5.02 9.99,5 C10.53,5.01 10.97,5.44 10.97,6 C10.97,6 11.04,6.54 10.97,7.72 L10.97,7.72 Z" /></svg>';
  var whatsapp = '<svg width="20" height="20" viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"> <path d="M16.7,3.3c-1.8-1.8-4.1-2.8-6.7-2.8c-5.2,0-9.4,4.2-9.4,9.4c0,1.7,0.4,3.3,1.3,4.7l-1.3,4.9l5-1.3c1.4,0.8,2.9,1.2,4.5,1.2 l0,0l0,0c5.2,0,9.4-4.2,9.4-9.4C19.5,7.4,18.5,5,16.7,3.3 M10.1,17.7L10.1,17.7c-1.4,0-2.8-0.4-4-1.1l-0.3-0.2l-3,0.8l0.8-2.9 l-0.2-0.3c-0.8-1.2-1.2-2.7-1.2-4.2c0-4.3,3.5-7.8,7.8-7.8c2.1,0,4.1,0.8,5.5,2.3c1.5,1.5,2.3,3.4,2.3,5.5 C17.9,14.2,14.4,17.7,10.1,17.7 M14.4,11.9c-0.2-0.1-1.4-0.7-1.6-0.8c-0.2-0.1-0.4-0.1-0.5,0.1c-0.2,0.2-0.6,0.8-0.8,0.9 c-0.1,0.2-0.3,0.2-0.5,0.1c-0.2-0.1-1-0.4-1.9-1.2c-0.7-0.6-1.2-1.4-1.3-1.6c-0.1-0.2,0-0.4,0.1-0.5C8,8.8,8.1,8.7,8.2,8.5 c0.1-0.1,0.2-0.2,0.2-0.4c0.1-0.2,0-0.3,0-0.4C8.4,7.6,7.9,6.5,7.7,6C7.5,5.5,7.3,5.6,7.2,5.6c-0.1,0-0.3,0-0.4,0 c-0.2,0-0.4,0.1-0.6,0.3c-0.2,0.2-0.8,0.8-0.8,2c0,1.2,0.8,2.3,1,2.4c0.1,0.2,1.7,2.5,4,3.5c0.6,0.2,1,0.4,1.3,0.5 c0.6,0.2,1.1,0.2,1.5,0.1c0.5-0.1,1.4-0.6,1.6-1.1c0.2-0.5,0.2-1,0.1-1.1C14.8,12.1,14.6,12,14.4,11.9" /></svg>';
  var youtube = '<svg width="20" height="20" viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"> <path d="M15,4.1c1,0.1,2.3,0,3,0.8c0.8,0.8,0.9,2.1,0.9,3.1C19,9.2,19,10.9,19,12c-0.1,1.1,0,2.4-0.5,3.4c-0.5,1.1-1.4,1.5-2.5,1.6 c-1.2,0.1-8.6,0.1-11,0c-1.1-0.1-2.4-0.1-3.2-1c-0.7-0.8-0.7-2-0.8-3C1,11.8,1,10.1,1,8.9c0-1.1,0-2.4,0.5-3.4C2,4.5,3,4.3,4.1,4.2 C5.3,4.1,12.6,4,15,4.1z M8,7.5v6l5.5-3L8,7.5z" /></svg>';
  var Icons = {
    album: album,
    ban: ban,
    bell: bell,
    bolt: bolt,
    bookmark: bookmark,
    calendar: calendar,
    camera: camera,
    cart: cart,
    check: check,
    clock: clock,
    close: close,
    code: code,
    cog: cog,
    comment: comment,
    commenting: commenting,
    comments: comments,
    copy: copy,
    database: database,
    desktop: desktop,
    download: download,
    expand: expand,
    facebook: facebook,
    file: file,
    folder: folder,
    forward: forward,
    foursquare: foursquare,
    future: future,
    google: google,
    grid: grid,
    happy: happy,
    hashtag: hashtag,
    heart: heart,
    history: history,
    home: home,
    image: image,
    info: info,
    instagram: instagram,
    laptop: laptop,
    lifesaver: lifesaver,
    link: link,
    linkedin: linkedin,
    list: list,
    location: location,
    lock: lock,
    mail: mail,
    menu: menu,
    minus: minus,
    more: more,
    move: move,
    nut: nut,
    pencil: pencil,
    phone: phone,
    play: play,
    plus: plus,
    pull: pull,
    push: push,
    question: question,
    receiver: receiver,
    refresh: refresh,
    reply: reply,
    rss: rss,
    search: search,
    server: server,
    settings: settings,
    shrink: shrink,
    social: social,
    star: star,
    table: table,
    tablet: tablet,
    tag: tag,
    thumbnails: thumbnails,
    trash: trash,
    tumblr: tumblr,
    tv: tv,
    twitter: twitter,
    unlock: unlock,
    upload: upload,
    user: user,
    users: users,
    vimeo: vimeo,
    warning: warning,
    whatsapp: whatsapp,
    youtube: youtube,
    'arrow-down': '<svg width="20" height="20" viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"> <polygon points="10.5,16.08 5.63,10.66 6.37,10 10.5,14.58 14.63,10 15.37,10.66" /> <line fill="none" stroke="#000" x1="10.5" y1="4" x2="10.5" y2="15" /></svg>',
    'arrow-left': '<svg width="20" height="20" viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"> <polyline fill="none" stroke="#000" points="10 14 5 9.5 10 5" /> <line fill="none" stroke="#000" x1="16" y1="9.5" x2="5" y2="9.52" /></svg>',
    'arrow-right': '<svg width="20" height="20" viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"> <polyline fill="none" stroke="#000" points="10 5 15 9.5 10 14" /> <line fill="none" stroke="#000" x1="4" y1="9.5" x2="15" y2="9.5" /></svg>',
    'arrow-up': '<svg width="20" height="20" viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"> <polygon points="10.5,4 15.37,9.4 14.63,10.08 10.5,5.49 6.37,10.08 5.63,9.4" /> <line fill="none" stroke="#000" x1="10.5" y1="16" x2="10.5" y2="5" /></svg>',
    'chevron-down': '<svg width="20" height="20" viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"> <polyline fill="none" stroke="#000" stroke-width="1.03" points="16 7 10 13 4 7" /></svg>',
    'chevron-left': '<svg width="20" height="20" viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"> <polyline fill="none" stroke="#000" stroke-width="1.03" points="13 16 7 10 13 4" /></svg>',
    'chevron-right': '<svg width="20" height="20" viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"> <polyline fill="none" stroke="#000" stroke-width="1.03" points="7 4 13 10 7 16" /></svg>',
    'chevron-up': '<svg width="20" height="20" viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"> <polyline fill="none" stroke="#000" stroke-width="1.03" points="4 13 10 7 16 13" /></svg>',
    'cloud-download': '<svg width="20" height="20" viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"> <path fill="none" stroke="#000" stroke-width="1.1" d="M6.5,14.61 L3.75,14.61 C1.96,14.61 0.5,13.17 0.5,11.39 C0.5,9.76 1.72,8.41 3.3,8.2 C3.38,5.31 5.75,3 8.68,3 C11.19,3 13.31,4.71 13.89,7.02 C14.39,6.8 14.93,6.68 15.5,6.68 C17.71,6.68 19.5,8.45 19.5,10.64 C19.5,12.83 17.71,14.6 15.5,14.6 L12.5,14.6" /> <polyline fill="none" stroke="#000" points="11.75 16 9.5 18.25 7.25 16" /> <path fill="none" stroke="#000" d="M9.5,18 L9.5,9.5" /></svg>',
    'cloud-upload': '<svg width="20" height="20" viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"> <path fill="none" stroke="#000" stroke-width="1.1" d="M6.5,14.61 L3.75,14.61 C1.96,14.61 0.5,13.17 0.5,11.39 C0.5,9.76 1.72,8.41 3.31,8.2 C3.38,5.31 5.75,3 8.68,3 C11.19,3 13.31,4.71 13.89,7.02 C14.39,6.8 14.93,6.68 15.5,6.68 C17.71,6.68 19.5,8.45 19.5,10.64 C19.5,12.83 17.71,14.6 15.5,14.6 L12.5,14.6" /> <polyline fill="none" stroke="#000" points="7.25 11.75 9.5 9.5 11.75 11.75" /> <path fill="none" stroke="#000" d="M9.5,18 L9.5,9.5" /></svg>',
    'credit-card': '<svg width="20" height="20" viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"> <rect fill="none" stroke="#000" x="1.5" y="4.5" width="17" height="12" /> <rect x="1" y="7" width="18" height="3" /></svg>',
    'file-edit': '<svg width="20" height="20" viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"> <path fill="none" stroke="#000" d="M18.65,1.68 C18.41,1.45 18.109,1.33 17.81,1.33 C17.499,1.33 17.209,1.45 16.98,1.68 L8.92,9.76 L8,12.33 L10.55,11.41 L18.651,3.34 C19.12,2.87 19.12,2.15 18.65,1.68 L18.65,1.68 L18.65,1.68 Z" /> <polyline fill="none" stroke="#000" points="16.5 8.482 16.5 18.5 3.5 18.5 3.5 1.5 14.211 1.5" /></svg>',
    'google-plus': '<svg width="20" height="20" viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"> <path d="M12.9,9c0,2.7-0.6,5-3.2,6.3c-3.7,1.8-8.1,0.2-9.4-3.6C-1.1,7.6,1.9,3.3,6.1,3c1.7-0.1,3.2,0.3,4.6,1.3 c0.1,0.1,0.3,0.2,0.4,0.4c-0.5,0.5-1.2,1-1.7,1.6c-1-0.8-2.1-1.1-3.5-0.9C5,5.6,4.2,6,3.6,6.7c-1.3,1.3-1.5,3.4-0.5,5 c1,1.7,2.6,2.3,4.6,1.9c1.4-0.3,2.4-1.2,2.6-2.6H6.9V9H12.9z" /> <polygon points="20,9 20,11 18,11 18,13 16,13 16,11 14,11 14,9 16,9 16,7 18,7 18,9 " /></svg>',
    'minus-circle': '<svg width="20" height="20" viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"> <circle fill="none" stroke="#000" stroke-width="1.1" cx="9.5" cy="9.5" r="9" /> <line fill="none" stroke="#000" x1="5" y1="9.5" x2="14" y2="9.5" /></svg>',
    'more-vertical': '<svg width="20" height="20" viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"> <circle cx="10" cy="3" r="2" /> <circle cx="10" cy="10" r="2" /> <circle cx="10" cy="17" r="2" /></svg>',
    'paint-bucket': '<svg width="20" height="20" viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"> <path d="M10.21,1 L0,11.21 L8.1,19.31 L18.31,9.1 L10.21,1 L10.21,1 Z M16.89,9.1 L15,11 L1.7,11 L10.21,2.42 L16.89,9.1 Z" /> <path fill="none" stroke="#000" stroke-width="1.1" d="M6.42,2.33 L11.7,7.61" /> <path d="M18.49,12 C18.49,12 20,14.06 20,15.36 C20,16.28 19.24,17 18.49,17 L18.49,17 C17.74,17 17,16.28 17,15.36 C17,14.06 18.49,12 18.49,12 L18.49,12 Z" /></svg>',
    'phone-landscape': '<svg width="20" height="20" viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"> <path fill="none" stroke="#000" d="M17,5.5 C17.8,5.5 18.5,6.2 18.5,7 L18.5,14 C18.5,14.8 17.8,15.5 17,15.5 L3,15.5 C2.2,15.5 1.5,14.8 1.5,14 L1.5,7 C1.5,6.2 2.2,5.5 3,5.5 L17,5.5 L17,5.5 L17,5.5 Z" /> <circle cx="3.8" cy="10.5" r="0.8" /></svg>',
    'play-circle': '<svg width="20" height="20" viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"> <polygon fill="none" stroke="#000" stroke-width="1.1" points="8.5 7 13.5 10 8.5 13" /> <circle fill="none" stroke="#000" stroke-width="1.1" cx="10" cy="10" r="9" /></svg>',
    'plus-circle': '<svg width="20" height="20" viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"> <circle fill="none" stroke="#000" stroke-width="1.1" cx="9.5" cy="9.5" r="9" /> <line fill="none" stroke="#000" x1="9.5" y1="5" x2="9.5" y2="14" /> <line fill="none" stroke="#000" x1="5" y1="9.5" x2="14" y2="9.5" /></svg>',
    'sign-in': '<svg width="20" height="20" viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"> <polygon points="7 2 17 2 17 17 7 17 7 16 16 16 16 3 7 3" /> <polygon points="9.1 13.4 8.5 12.8 11.28 10 4 10 4 9 11.28 9 8.5 6.2 9.1 5.62 13 9.5" /></svg>',
    'sign-out': '<svg width="20" height="20" viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"> <polygon points="13.1 13.4 12.5 12.8 15.28 10 8 10 8 9 15.28 9 12.5 6.2 13.1 5.62 17 9.5" /> <polygon points="13 2 3 2 3 17 13 17 13 16 4 16 4 3 13 3" /></svg>',
    'tablet-landscape': '<svg width="20" height="20" viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"> <path fill="none" stroke="#000" d="M1.5,5 C1.5,4.2 2.2,3.5 3,3.5 L17,3.5 C17.8,3.5 18.5,4.2 18.5,5 L18.5,16 C18.5,16.8 17.8,17.5 17,17.5 L3,17.5 C2.2,17.5 1.5,16.8 1.5,16 L1.5,5 L1.5,5 L1.5,5 Z" /> <circle cx="3.7" cy="10.5" r="0.8" /></svg>',
    'triangle-down': '<svg width="20" height="20" viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"> <polygon points="5 7 15 7 10 12" /></svg>',
    'triangle-left': '<svg width="20" height="20" viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"> <polygon points="12 5 7 10 12 15" /></svg>',
    'triangle-right': '<svg width="20" height="20" viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"> <polygon points="8 5 13 10 8 15" /></svg>',
    'triangle-up': '<svg width="20" height="20" viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"> <polygon points="5 13 10 8 15 13" /></svg>',
    'bk-arrow-down': '<svg class="bk-icon"  viewBox="0 0 17 20" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd"> <g id="FREE100icons" transform="translate(-27.000000, -161.000000)" fill="#1A1919"> <g id="A" transform="translate(0.000000, 100.000000)"> <g id="1A" transform="translate(36.000000, 71.500000) rotate(-90.000000) translate(-36.000000, -71.500000) translate(26.000000, 63.000000)"> <path d="M18.964,7.29124138 L3.484,7.29124138 L9.20742857,1.52882759 C9.54514286,1.18824138 9.55028571,0.631931034 9.21885714,0.284896552 C8.88628571,-0.0615517241 8.344,-0.0662413793 8.00628571,0.273172414 L0.804,7.52455172 C0.640571429,7.68927586 0.548,7.9137931 0.547428571,8.14827586 C0.546285714,8.38275862 0.636571429,8.60844828 0.798285714,8.77434483 L8.01257143,16.1752069 C8.18,16.3469655 8.39942857,16.4325517 8.61885714,16.4325517 C8.83771429,16.4325517 9.05714286,16.3469655 9.22457143,16.1752069 C9.55942857,15.8316897 9.55942857,15.2747931 9.22457143,14.9318621 L3.49085714,9.04986207 L18.964,9.04986207 C19.4371429,9.04986207 19.8211429,8.65593103 19.8211429,8.17055172 C19.8211429,7.68458621 19.4371429,7.29124138 18.964,7.29124138"></path> </g> </g> </g> </g></svg>',
    'bk-arrow-left': '<svg  class="bk-icon" viewBox="0 0 20 17" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd"> <g id="FREE100icons" transform="translate(0.000000, -117.000000)" fill="#1A1919"> <g id="A" transform="translate(0.000000, 100.000000)"> <g id="1A" transform="translate(0.000000, 17.000000)"> <path d="M18.964,7.29124138 L3.484,7.29124138 L9.20742857,1.52882759 C9.54514286,1.18824138 9.55028571,0.631931034 9.21885714,0.284896552 C8.88628571,-0.0615517241 8.344,-0.0662413793 8.00628571,0.273172414 L0.804,7.52455172 C0.640571429,7.68927586 0.548,7.9137931 0.547428571,8.14827586 C0.546285714,8.38275862 0.636571429,8.60844828 0.798285714,8.77434483 L8.01257143,16.1752069 C8.18,16.3469655 8.39942857,16.4325517 8.61885714,16.4325517 C8.83771429,16.4325517 9.05714286,16.3469655 9.22457143,16.1752069 C9.55942857,15.8316897 9.55942857,15.2747931 9.22457143,14.9318621 L3.49085714,9.04986207 L18.964,9.04986207 C19.4371429,9.04986207 19.8211429,8.65593103 19.8211429,8.17055172 C19.8211429,7.68458621 19.4371429,7.29124138 18.964,7.29124138"></path> </g> </g> </g> </g></svg>',
    'bk-arrow-right': '<svg class="bk-icon" viewBox="0 0 20 17" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd"> <g id="FREE100icons" transform="translate(-69.000000, -100.000000)" fill="#1A1919"> <g id="A" transform="translate(0.000000, 100.000000)"> <g id="1A" transform="translate(79.000000, 8.500000) rotate(-180.000000) translate(-79.000000, -8.500000) translate(69.000000, 0.000000)"> <path d="M18.964,7.29124138 L3.484,7.29124138 L9.20742857,1.52882759 C9.54514286,1.18824138 9.55028571,0.631931034 9.21885714,0.284896552 C8.88628571,-0.0615517241 8.344,-0.0662413793 8.00628571,0.273172414 L0.804,7.52455172 C0.640571429,7.68927586 0.548,7.9137931 0.547428571,8.14827586 C0.546285714,8.38275862 0.636571429,8.60844828 0.798285714,8.77434483 L8.01257143,16.1752069 C8.18,16.3469655 8.39942857,16.4325517 8.61885714,16.4325517 C8.83771429,16.4325517 9.05714286,16.3469655 9.22457143,16.1752069 C9.55942857,15.8316897 9.55942857,15.2747931 9.22457143,14.9318621 L3.49085714,9.04986207 L18.964,9.04986207 C19.4371429,9.04986207 19.8211429,8.65593103 19.8211429,8.17055172 C19.8211429,7.68458621 19.4371429,7.29124138 18.964,7.29124138"></path> </g> </g> </g> </g></svg>',
    'bk-arrow-up': '<svg class="bk-icon"  viewBox="0 0 17 20" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd"> <g id="FREE100icons" transform="translate(-81.000000, -141.000000)" fill="#1A1919"> <g id="A" transform="translate(0.000000, 100.000000)"> <g id="1A" transform="translate(89.000000, 50.500000) rotate(-270.000000) translate(-89.000000, -50.500000) translate(79.000000, 42.000000)"> <path d="M18.964,7.29124138 L3.484,7.29124138 L9.20742857,1.52882759 C9.54514286,1.18824138 9.55028571,0.631931034 9.21885714,0.284896552 C8.88628571,-0.0615517241 8.344,-0.0662413793 8.00628571,0.273172414 L0.804,7.52455172 C0.640571429,7.68927586 0.548,7.9137931 0.547428571,8.14827586 C0.546285714,8.38275862 0.636571429,8.60844828 0.798285714,8.77434483 L8.01257143,16.1752069 C8.18,16.3469655 8.39942857,16.4325517 8.61885714,16.4325517 C8.83771429,16.4325517 9.05714286,16.3469655 9.22457143,16.1752069 C9.55942857,15.8316897 9.55942857,15.2747931 9.22457143,14.9318621 L3.49085714,9.04986207 L18.964,9.04986207 C19.4371429,9.04986207 19.8211429,8.65593103 19.8211429,8.17055172 C19.8211429,7.68458621 19.4371429,7.29124138 18.964,7.29124138"></path> </g> </g> </g> </g></svg>',
    'bk-car': '<svg class="bk-icon" version="1.1" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><path d="M5.016 11.016h13.969l-1.5-4.5h-10.969zM17.484 15.984c0.844 0 1.5-0.656 1.5-1.5s-0.656-1.5-1.5-1.5-1.5 0.656-1.5 1.5 0.656 1.5 1.5 1.5zM6.516 15.984c0.844 0 1.5-0.656 1.5-1.5s-0.656-1.5-1.5-1.5-1.5 0.656-1.5 1.5 0.656 1.5 1.5 1.5zM18.938 6l2.063 6v8.016c0 0.563-0.422 0.984-0.984 0.984h-1.031c-0.563 0-0.984-0.422-0.984-0.984v-1.031h-12v1.031c0 0.563-0.422 0.984-0.984 0.984h-1.031c-0.563 0-0.984-0.422-0.984-0.984v-8.016l2.063-6c0.188-0.609 0.797-0.984 1.453-0.984h10.969c0.656 0 1.266 0.375 1.453 0.984z"></path></svg>',
    'bk-check': '<svg class="bk-icon" viewBox="0 0 28 20" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd"> <path d="M9.15049851,15.550749 C7.34633728,13.0737266 5.99321635,11.2159597 5.09113574,9.97744849 C4.62470387,9.33706103 3.92505606,8.37647985 2.99219233,7.09570494 C2.54445514,6.48098433 1.67131416,6.34165214 1.0482958,6.79317272 C0.420933879,7.24784119 0.285477213,8.11220103 0.736043308,8.73080552 L7.30034057,17.743255 C7.37002657,17.8389304 7.45001757,17.92309 7.53776668,17.9952986 C7.58042597,18.1058672 7.63808115,18.2127422 7.71118512,18.3131102 C8.16699023,18.9389077 9.0371538,19.0713865 9.66179843,18.6186873 L27.8934115,5.40567689 C28.5178432,4.95313198 28.6574859,4.08219576 28.2048365,3.46073103 C27.7490314,2.83493357 26.8788679,2.70245483 26.2542232,3.15515399 L9.15049851,15.550749 Z" id="ic_tick" fill="#FFFFFF" fill-rule="nonzero" transform="translate(14.470617, 10.886921) rotate(-10.000000) translate(-14.470617, -10.886921) "></path> </g></svg>',
    'bk-chevron-down': '<svg class="bk-icon" viewBox="0 0 20 11" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd"> <g id="6A" transform="translate(10.000000, 5.555556) scale(-1, 1) rotate(90.000000) translate(-10.000000, -5.555556) translate(4.444444, -4.444444)" fill="#1A1919"> <path d="M1.00815,19.995 C0.79915,19.995 0.5896,19.915 0.429,19.7555556 C0.1045,19.4327778 0.10065,18.905 0.4202,18.5766667 L8.547,10.2377778 L0.4202,1.89888889 C0.10065,1.57111111 0.1045,1.04333333 0.429,0.720555556 C0.75405,0.397777778 1.27655,0.402222222 1.59555,0.729444444 L10.2927,9.65333333 C10.6084,9.97777778 10.6084,10.4977778 10.2927,10.8222222 L1.59555,19.7461111 C1.4344,19.9116667 1.221,19.995 1.00815,19.995"></path> </g> </g></svg>',
    'bk-chevron-left': '<svg class="bk-icon" viewBox="0 0 11 20" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd"> <g id="FREE100icons" transform="translate(-746.000000, -161.000000)" fill="#1A1919"> <g id="A" transform="translate(16.000000, 154.000000)"> <g id="6A" transform="translate(735.555556, 17.000000) rotate(180.000000) translate(-735.555556, -17.000000) translate(730.000000, 7.000000)"> <path d="M1.00815,19.995 C0.79915,19.995 0.5896,19.915 0.429,19.7555556 C0.1045,19.4327778 0.10065,18.905 0.4202,18.5766667 L8.547,10.2377778 L0.4202,1.89888889 C0.10065,1.57111111 0.1045,1.04333333 0.429,0.720555556 C0.75405,0.397777778 1.27655,0.402222222 1.59555,0.729444444 L10.2927,9.65333333 C10.6084,9.97777778 10.6084,10.4977778 10.2927,10.8222222 L1.59555,19.7461111 C1.4344,19.9116667 1.221,19.995 1.00815,19.995"></path> </g> </g> </g> </g></svg>',
    'bk-chevron-right': '<svg class="bk-icon" viewBox="0 0 11 20" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd"> <g id="FREE100icons" transform="translate(-746.000000, -161.000000)" fill="#1A1919"> <g id="A" transform="translate(16.000000, 154.000000)"> <g id="6A" transform="translate(735.555556, 17.000000) scale(-1, 1) rotate(180.000000) translate(-735.555556, -17.000000) translate(730.000000, 7.000000)"> <path d="M1.00815,19.995 C0.79915,19.995 0.5896,19.915 0.429,19.7555556 C0.1045,19.4327778 0.10065,18.905 0.4202,18.5766667 L8.547,10.2377778 L0.4202,1.89888889 C0.10065,1.57111111 0.1045,1.04333333 0.429,0.720555556 C0.75405,0.397777778 1.27655,0.402222222 1.59555,0.729444444 L10.2927,9.65333333 C10.6084,9.97777778 10.6084,10.4977778 10.2927,10.8222222 L1.59555,19.7461111 C1.4344,19.9116667 1.221,19.995 1.00815,19.995"></path> </g> </g> </g> </g></svg>',
    'bk-chevron-up': '<svg class="bk-icon" viewBox="0 0 20 11" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd"> <g id="6A" transform="translate(9.555556, 5.000000) scale(-1, -1) rotate(90.000000) translate(-9.555556, -5.000000) translate(4.000000, -5.000000)" fill="#1A1919"> <path d="M1.00815,19.995 C0.79915,19.995 0.5896,19.915 0.429,19.7555556 C0.1045,19.4327778 0.10065,18.905 0.4202,18.5766667 L8.547,10.2377778 L0.4202,1.89888889 C0.10065,1.57111111 0.1045,1.04333333 0.429,0.720555556 C0.75405,0.397777778 1.27655,0.402222222 1.59555,0.729444444 L10.2927,9.65333333 C10.6084,9.97777778 10.6084,10.4977778 10.2927,10.8222222 L1.59555,19.7461111 C1.4344,19.9116667 1.221,19.995 1.00815,19.995"></path> </g> </g></svg>',
    'bk-clock': '<svg class="bk-icon" viewBox="0 0 20 20" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd"> <g id="FREE100icons" transform="translate(0.000000, -322.000000)" fill="#1A1919"> <g id="B" transform="translate(0.000000, 299.000000)"> <g id="9B" transform="translate(0.000000, 23.000000)"> <path d="M13.7128205,10.8610256 L10.1230769,10.8610256 C9.7025641,10.8610256 9.35384615,10.5164103 9.35384615,10.0917949 L9.35384615,4.56410256 C9.35384615,4.13948718 9.7025641,3.79487179 10.1230769,3.79487179 C10.5487179,3.79487179 10.8923077,4.13948718 10.8923077,4.56410256 L10.8923077,9.3225641 L13.7128205,9.3225641 C14.1384615,9.3225641 14.4820513,9.66666667 14.4820513,10.0917949 C14.4820513,10.5164103 14.1384615,10.8610256 13.7128205,10.8610256 M10.1230769,1.75846154 C5.52820513,1.75846154 1.78974359,5.49641026 1.78974359,10.0917949 C1.78974359,14.6866667 5.52820513,18.4251282 10.1230769,18.4251282 C14.7179487,18.4251282 18.4564103,14.6866667 18.4564103,10.0917949 C18.4564103,5.49641026 14.7179487,1.75846154 10.1230769,1.75846154 Z M10.1230769,19.9635897 C4.68205128,19.9635897 0.251282051,15.5348718 0.251282051,10.0917949 C0.251282051,4.64820513 4.68205128,0.22 10.1230769,0.22 C15.5692308,0.22 19.9948718,4.64820513 19.9948718,10.0917949 C19.9948718,15.5348718 15.5692308,19.9635897 10.1230769,19.9635897 Z"></path> </g> </g> </g> </g></svg>',
    'bk-close': '<svg class="bk-icon" viewBox="0 0 20 20" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd"> <g id="Search-3-Copy" transform="translate(-1280.000000, -41.000000)" fill="#FFFFFF"> <g id="ic/close" transform="translate(1280.000000, 41.000000)"> <path d="M11.5355656,10.000181 L19.68181,1.85378921 C20.1060633,1.43025213 20.1060633,0.741732882 19.68181,0.318195804 C19.2575566,-0.106065268 18.5704977,-0.106065268 18.1462443,0.318195804 L10,8.46458759 L1.85375566,0.318195804 C1.42950226,-0.106065268 0.742443439,-0.106065268 0.318190045,0.318195804 C-0.106063348,0.741732882 -0.106063348,1.43025213 0.318190045,1.85378921 L8.46443439,10.000181 L0.318190045,18.1465728 C-0.106063348,18.5701099 -0.106063348,19.2586291 0.318190045,19.6821662 C0.530316742,19.8942967 0.808325792,20 1.08633484,20 C1.36434389,20 1.64162896,19.8942967 1.85375566,19.6821662 L10,11.5357744 L18.1462443,19.6821662 C18.358371,19.8942967 18.6363801,20 18.9143891,20 C19.1923982,20 19.4696833,19.8942967 19.68181,19.6821662 C20.1060633,19.2586291 20.1060633,18.5701099 19.68181,18.1465728 L11.5355656,10.000181" id="4A"></path> </g> </g> </g></svg>',
    'bk-directions': '<svg class="bk-icon" viewBox="0 0 20 17" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd"> <g id="FREE100icons" transform="translate(-586.000000, -1308.000000)" fill="#1A1919"> <g id="I" transform="translate(11.000000, 1304.000000)"> <g id="5I" transform="translate(575.000000, 4.000000)"> <path d="M18.4838298,12.3478049 L13.9685106,15.0968293 L13.9685106,4.60658537 L18.4838298,1.88658537 L18.4838298,12.3478049 Z M1.53702128,4.69780488 L6.19361702,1.88658537 L6.19361702,12.5095122 L1.53702128,15.1382927 L1.53702128,4.69780488 Z M7.47021277,1.7995122 L12.6919149,4.47804878 L12.6919149,15.1839024 L7.47021277,12.4929268 L7.47021277,1.7995122 Z M19.432766,0.22804878 C19.2306383,0.116097561 18.9829787,0.120243902 18.786383,0.240487805 L13.4459574,3.46219512 L7.1293617,0.219756098 C7.12340426,0.215609756 7.11702128,0.215609756 7.11106383,0.211463415 C7.07234043,0.194878049 7.03191489,0.178292683 6.98893617,0.17 C6.98212766,0.165853659 6.97574468,0.165853659 6.96851064,0.161707317 C6.92468085,0.153414634 6.87914894,0.149268293 6.83191489,0.149268293 C6.82765957,0.149268293 6.82340426,0.149268293 6.81914894,0.149268293 C6.80638298,0.149268293 6.79361702,0.153414634 6.78085106,0.153414634 C6.74255319,0.157560976 6.70553191,0.161707317 6.6693617,0.17 C6.65446809,0.174146341 6.64,0.178292683 6.62510638,0.182439024 C6.58808511,0.194878049 6.55319149,0.211463415 6.52,0.232195122 C6.51191489,0.236341463 6.50340426,0.236341463 6.49574468,0.240487805 L0.562553191,3.82292683 C0.374893617,3.93902439 0.260425532,4.13804878 0.260425532,4.35365854 L0.260425532,16.2163415 C0.260425532,16.4402439 0.38212766,16.647561 0.58,16.7553659 C0.77787234,16.8673171 1.02085106,16.8673171 1.2187234,16.7553659 L6.84595745,13.5792683 L13.0319149,16.7678049 C13.0382979,16.7719512 13.0455319,16.7719512 13.0523404,16.7760976 C13.0834043,16.7885366 13.1161702,16.8009756 13.1497872,16.8134146 C13.1629787,16.8134146 13.1748936,16.8217073 13.1880851,16.8217073 C13.2340426,16.8341463 13.2812766,16.8382927 13.3302128,16.8382927 C13.3851064,16.8382927 13.4370213,16.83 13.4876596,16.817561 C13.5012766,16.8134146 13.513617,16.8092683 13.5268085,16.805122 C13.5697872,16.7926829 13.6102128,16.7760976 13.6480851,16.7553659 C13.6544681,16.7512195 13.6621277,16.7512195 13.6685106,16.7470732 L19.46,13.2226829 C19.6468085,13.1065854 19.7604255,12.907561 19.7604255,12.6919512 L19.7604255,0.771219512 C19.7604255,0.543170732 19.6353191,0.335853659 19.432766,0.22804878 Z"></path> </g> </g> </g> </g></svg>',
    'bk-dots': '<svg class="bk-icon" viewBox="0 0 20 20" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd"> <g fill="#FFFFFF"> <circle  cx="10" cy="2" r="2"></circle> <circle cx="10" cy="10" r="2"></circle> <circle cx="10" cy="18" r="2"></circle> <circle  cx="18" cy="2" r="2"></circle> <circle  cx="18" cy="10" r="2"></circle> <circle cx="18" cy="18" r="2"></circle> <circle cx="2" cy="2" r="2"></circle> <circle  cx="2" cy="10" r="2"></circle> <circle cx="2" cy="18" r="2"></circle> </g> </g></svg>',
    'bk-envelope': '<svg class="bk-icon" viewBox="0 0 24 17" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="20" height="20"> <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd"> <g id="FREE100icons" transform="translate(0.000000, -634.000000)" fill="#1A1919"> <g id="E" transform="translate(0.000000, 634.000000)"> <g id="1E"> <path d="M21.7614545,14.8207097 L2.06127273,14.8207097 C1.91345455,14.8207097 1.78854545,14.6956774 1.78854545,14.5465161 L1.78854545,2.856 L11.4632727,9.22222581 C11.5996364,9.3116129 11.7550909,9.35712903 11.9110909,9.35712903 C12.0698182,9.35712903 12.228,9.31106452 12.3654545,9.21893548 L22.0341818,2.73206452 L22.0341818,14.5465161 C22.0341818,14.6956774 21.9092727,14.8207097 21.7614545,14.8207097 Z M20.0301818,2.09812903 L11.9072727,7.54854839 L3.62509091,2.09812903 L20.0301818,2.09812903 Z M23.07,0.98216129 C22.9701818,0.852193548 22.8392727,0.758967742 22.6936364,0.707967742 C22.4165455,0.550580645 22.1018182,0.452967742 21.7614545,0.452967742 L2.06127273,0.452967742 C1.00909091,0.452967742 0.152181818,1.31393548 0.152181818,2.37232258 L0.152181818,14.5465161 C0.152181818,15.6049032 1.00909091,16.465871 2.06127273,16.465871 L21.7614545,16.465871 C22.8136364,16.465871 23.6705455,15.6049032 23.6705455,14.5465161 L23.6705455,2.37232258 C23.6705455,1.82448387 23.4376364,1.33258065 23.07,0.98216129 Z"></path> </g> </g> </g> </g></svg>',
    // ecom 360 view block added
    'bk-threesixty':'<svg width="40" height="40" viewBox="0 0 40 40" fill="none" xmlns="http://www.w3.org/2000/svg"><g mask="url(#mask0_1353_89070)"><path d="M19.4961 31.752C17.9398 31.752 16.4773 31.4565 15.1086 30.8655C13.7398 30.2752 12.5492 29.4738 11.5367 28.4613C10.5242 27.4488 9.72284 26.2582 9.13259 24.8895C8.54159 23.5207 8.24609 22.0582 8.24609 20.502H10.4961C10.4961 22.6582 11.1756 24.5613 12.5346 26.2113C13.8943 27.8613 15.6336 28.902 17.7523 29.3332L16.1211 27.702L17.6961 26.127L22.8148 31.2457C22.2711 31.4332 21.7228 31.5645 21.1701 31.6395C20.6166 31.7145 20.0586 31.752 19.4961 31.752ZM20.0586 23.877V17.127H23.4336C23.7523 17.127 24.0193 17.2346 24.2346 17.4498C24.4506 17.6658 24.5586 17.9332 24.5586 18.252V22.752C24.5586 23.0707 24.4506 23.3377 24.2346 23.553C24.0193 23.769 23.7523 23.877 23.4336 23.877H20.0586ZM14.4336 23.877V22.1895H17.2461V21.0645H15.5586V19.9395H17.2461V18.8145H14.4336V17.127H17.8086C18.1273 17.127 18.3947 17.2346 18.6107 17.4498C18.826 17.6658 18.9336 17.9332 18.9336 18.252V22.752C18.9336 23.0707 18.826 23.3377 18.6107 23.553C18.3947 23.769 18.1273 23.877 17.8086 23.877H14.4336ZM21.7461 22.1895H22.8711V18.8145H21.7461V22.1895ZM28.4961 20.502C28.4961 18.3457 27.8166 16.4426 26.4576 14.7926C25.0978 13.1426 23.3586 12.102 21.2398 11.6707L22.8711 13.302L21.2961 14.877L16.1773 9.7582C16.7211 9.5707 17.2693 9.43945 17.8221 9.36445C18.3756 9.28945 18.9336 9.25195 19.4961 9.25195C21.0523 9.25195 22.5148 9.54708 23.8836 10.1373C25.2523 10.7283 26.443 11.5301 27.4555 12.5426C28.468 13.5551 29.2693 14.7457 29.8596 16.1145C30.4506 17.4832 30.7461 18.9457 30.7461 20.502H28.4961Z" fill="white"/></g></svg>',
    // ecom 360 view block added till here
	'bk-digital-map': '<svg class="bk-icon" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="30pt" height="30pt" viewBox="0 0 30 30" version="1.1"> <g id="surface1" > <path style=" stroke:none;fill-rule:nonzero;fill-opacity:1;" d="M 29.992188 27.882812 L 28.234375 18.191406 C 28.191406 17.953125 27.964844 17.792969 27.722656 17.835938 C 27.484375 17.878906 27.324219 18.109375 27.371094 18.347656 L 28.113281 22.445312 L 22.382812 15.792969 L 26.238281 14.929688 L 26.808594 15.25 L 27.054688 16.617188 C 27.097656 16.855469 27.328125 17.011719 27.566406 16.96875 C 27.804688 16.925781 27.964844 16.699219 27.921875 16.457031 L 27.636719 14.886719 C 27.613281 14.757812 27.53125 14.644531 27.417969 14.582031 L 26.519531 14.082031 L 23.675781 12.5 L 21.484375 11.277344 C 21.46875 11.269531 21.449219 11.261719 21.433594 11.253906 C 21.425781 11.25 21.421875 11.25 21.414062 11.25 C 21.402344 11.242188 21.390625 11.238281 21.378906 11.238281 C 21.371094 11.234375 21.363281 11.234375 21.355469 11.230469 C 21.34375 11.230469 21.332031 11.226562 21.324219 11.226562 C 21.316406 11.226562 21.308594 11.226562 21.300781 11.226562 C 21.289062 11.222656 21.277344 11.222656 21.265625 11.222656 C 21.257812 11.222656 21.25 11.222656 21.242188 11.226562 C 21.230469 11.226562 21.21875 11.226562 21.210938 11.226562 C 21.203125 11.230469 21.195312 11.230469 21.1875 11.230469 C 21.175781 11.234375 21.164062 11.238281 21.152344 11.238281 C 21.144531 11.242188 21.136719 11.242188 21.128906 11.246094 C 21.121094 11.25 21.109375 11.253906 21.101562 11.257812 C 21.09375 11.261719 21.085938 11.265625 21.078125 11.269531 C 21.074219 11.269531 21.070312 11.269531 21.066406 11.273438 L 20.0625 11.796875 C 20.808594 10.402344 21.1875 9.050781 21.1875 7.757812 C 21.1875 4.359375 18.425781 1.597656 15.027344 1.597656 C 11.632812 1.597656 8.867188 4.359375 8.867188 7.757812 C 8.867188 9.0625 9.253906 10.429688 10.015625 11.839844 L 8.933594 11.273438 C 8.929688 11.269531 8.925781 11.269531 8.921875 11.269531 C 8.914062 11.265625 8.90625 11.261719 8.898438 11.257812 C 8.890625 11.253906 8.878906 11.25 8.871094 11.246094 C 8.863281 11.242188 8.855469 11.242188 8.847656 11.238281 C 8.835938 11.238281 8.824219 11.234375 8.816406 11.230469 C 8.804688 11.230469 8.796875 11.230469 8.789062 11.226562 C 8.78125 11.226562 8.769531 11.226562 8.757812 11.226562 C 8.75 11.222656 8.742188 11.222656 8.734375 11.222656 C 8.722656 11.222656 8.710938 11.222656 8.703125 11.226562 C 8.695312 11.226562 8.6875 11.226562 8.675781 11.226562 C 8.667969 11.226562 8.65625 11.230469 8.644531 11.230469 C 8.636719 11.234375 8.628906 11.234375 8.621094 11.238281 C 8.609375 11.238281 8.597656 11.242188 8.585938 11.246094 C 8.582031 11.25 8.574219 11.25 8.566406 11.253906 C 8.550781 11.261719 8.53125 11.269531 8.515625 11.277344 L 2.582031 14.582031 C 2.46875 14.644531 2.386719 14.757812 2.363281 14.886719 L 0.691406 24.101562 C 0.648438 24.339844 0.808594 24.570312 1.046875 24.613281 C 1.289062 24.65625 1.515625 24.496094 1.558594 24.257812 L 2.0625 21.492188 L 7.761719 18.480469 L 7.300781 24.398438 L 1.023438 27.21875 L 1.242188 26 C 1.289062 25.757812 1.128906 25.53125 0.890625 25.488281 C 0.648438 25.445312 0.421875 25.601562 0.378906 25.839844 L 0.0078125 27.882812 C -0.0234375 28.042969 0.0390625 28.207031 0.167969 28.308594 C 0.246094 28.371094 0.34375 28.402344 0.441406 28.402344 C 0.5 28.402344 0.5625 28.390625 0.621094 28.363281 L 7.71875 25.175781 L 14.816406 28.363281 L 14.820312 28.363281 C 14.824219 28.363281 14.828125 28.367188 14.832031 28.367188 C 14.839844 28.371094 14.84375 28.375 14.851562 28.375 C 14.859375 28.378906 14.863281 28.378906 14.871094 28.382812 C 14.875 28.382812 14.878906 28.382812 14.882812 28.386719 C 14.890625 28.386719 14.894531 28.390625 14.902344 28.390625 C 14.910156 28.390625 14.917969 28.394531 14.929688 28.394531 C 14.933594 28.394531 14.9375 28.398438 14.941406 28.398438 C 14.945312 28.398438 14.949219 28.398438 14.949219 28.398438 C 14.964844 28.402344 14.980469 28.402344 14.996094 28.402344 C 14.996094 28.402344 15 28.402344 15 28.402344 C 15 28.402344 15.003906 28.402344 15.003906 28.402344 C 15.019531 28.402344 15.039062 28.398438 15.054688 28.398438 C 15.058594 28.398438 15.0625 28.398438 15.0625 28.398438 C 15.066406 28.398438 15.070312 28.394531 15.074219 28.394531 C 15.085938 28.394531 15.101562 28.390625 15.113281 28.386719 C 15.117188 28.386719 15.121094 28.382812 15.125 28.382812 C 15.128906 28.382812 15.128906 28.382812 15.128906 28.382812 C 15.148438 28.375 15.164062 28.371094 15.179688 28.363281 L 22.28125 25.175781 L 29.378906 28.363281 C 29.386719 28.367188 29.394531 28.367188 29.402344 28.371094 C 29.40625 28.375 29.414062 28.378906 29.421875 28.378906 C 29.429688 28.382812 29.441406 28.382812 29.449219 28.386719 C 29.457031 28.386719 29.460938 28.390625 29.464844 28.390625 C 29.476562 28.394531 29.488281 28.394531 29.5 28.398438 C 29.503906 28.398438 29.507812 28.398438 29.511719 28.398438 C 29.527344 28.402344 29.542969 28.402344 29.558594 28.402344 C 29.582031 28.402344 29.601562 28.398438 29.625 28.398438 C 29.628906 28.394531 29.632812 28.394531 29.640625 28.394531 C 29.660156 28.390625 29.679688 28.386719 29.703125 28.378906 C 29.703125 28.378906 29.703125 28.378906 29.707031 28.375 C 29.71875 28.371094 29.734375 28.367188 29.746094 28.359375 C 29.75 28.359375 29.753906 28.355469 29.757812 28.355469 C 29.769531 28.347656 29.777344 28.34375 29.789062 28.335938 C 29.800781 28.328125 29.808594 28.324219 29.820312 28.316406 C 29.824219 28.3125 29.828125 28.3125 29.832031 28.308594 C 29.839844 28.300781 29.847656 28.296875 29.851562 28.289062 C 29.859375 28.285156 29.863281 28.277344 29.871094 28.273438 C 29.882812 28.261719 29.894531 28.246094 29.90625 28.230469 C 29.910156 28.226562 29.910156 28.226562 29.914062 28.222656 C 29.925781 28.207031 29.9375 28.1875 29.949219 28.167969 C 29.953125 28.160156 29.953125 28.15625 29.957031 28.148438 C 29.964844 28.136719 29.96875 28.121094 29.976562 28.105469 C 29.976562 28.097656 29.980469 28.089844 29.980469 28.082031 C 29.984375 28.070312 29.988281 28.054688 29.992188 28.042969 C 29.992188 28.035156 29.996094 28.027344 29.996094 28.019531 C 29.996094 28.003906 30 27.988281 30 27.972656 C 30 27.964844 30 27.957031 30 27.949219 C 30 27.929688 29.996094 27.90625 29.992188 27.882812 Z M 22.253906 12.714844 L 21.800781 12.820312 L 21.773438 12.445312 Z M 21.292969 17.648438 L 19.453125 16.214844 C 19.328125 16.113281 19.15625 16.09375 19.007812 16.15625 L 15.441406 17.707031 L 15.441406 17.226562 C 15.707031 17.007812 16.3125 16.496094 17.039062 15.761719 L 21.011719 14.019531 Z M 20.882812 12.363281 L 20.941406 13.089844 L 18.457031 14.179688 C 18.703125 13.871094 18.933594 13.570312 19.148438 13.265625 Z M 9.117188 12.363281 L 10.941406 13.3125 C 11.210938 13.695312 11.507812 14.078125 11.832031 14.460938 C 12.113281 14.796875 12.394531 15.113281 12.664062 15.398438 L 8.921875 14.863281 Z M 7.839844 17.441406 L 2.261719 20.390625 L 2.53125 18.894531 L 2.539062 18.855469 L 7.953125 16 Z M 8.03125 14.964844 L 2.738281 17.753906 L 3.195312 15.25 L 8.226562 12.445312 L 8.101562 14.082031 Z M 8.183594 24.417969 L 8.601562 19.035156 L 13.800781 26.941406 Z M 14.558594 22.722656 L 11.847656 18.445312 L 14.558594 18.769531 Z M 14.558594 17.882812 L 11.03125 17.460938 C 10.863281 17.441406 10.695312 17.519531 10.605469 17.664062 C 10.515625 17.808594 10.515625 17.992188 10.605469 18.132812 L 14.558594 24.363281 L 14.558594 26.492188 L 8.710938 17.601562 L 8.855469 15.742188 L 13.714844 16.4375 C 14.078125 16.777344 14.375 17.03125 14.558594 17.179688 Z M 15.027344 16.425781 C 13.917969 15.484375 9.75 11.707031 9.75 7.757812 C 9.75 4.847656 12.117188 2.480469 15.027344 2.480469 C 17.9375 2.480469 20.308594 4.847656 20.308594 7.757812 C 20.308594 11.707031 16.140625 15.484375 15.027344 16.425781 Z M 15.441406 27.28125 L 15.441406 25.328125 L 16.757812 26.691406 Z M 17.609375 26.308594 L 15.441406 24.058594 L 15.441406 18.667969 L 19.117188 17.070312 L 21.386719 18.839844 L 21.816406 24.417969 Z M 21.871094 13.707031 L 23.398438 13.351562 L 24.480469 13.953125 L 25.078125 14.289062 L 21.96875 14.980469 Z M 22.699219 24.398438 L 22.355469 19.960938 L 28.011719 26.785156 Z M 22.238281 18.4375 L 22.117188 16.890625 L 22.113281 16.828125 L 28.421875 24.15625 L 28.828125 26.386719 Z M 22.238281 18.4375 "/> <path style=" stroke:none;fill-rule:nonzero;fill-opacity:1;" d="M 15.027344 5.035156 C 14.785156 5.035156 14.589844 5.234375 14.589844 5.476562 C 14.589844 5.71875 14.785156 5.917969 15.027344 5.917969 C 16.042969 5.917969 16.871094 6.742188 16.871094 7.757812 C 16.871094 8.773438 16.042969 9.597656 15.027344 9.597656 C 14.011719 9.597656 13.1875 8.773438 13.1875 7.757812 C 13.1875 7.273438 13.375 6.8125 13.714844 6.46875 C 13.886719 6.292969 13.882812 6.015625 13.710938 5.84375 C 13.535156 5.675781 13.257812 5.675781 13.085938 5.851562 C 12.585938 6.363281 12.308594 7.039062 12.308594 7.757812 C 12.308594 9.257812 13.527344 10.480469 15.027344 10.480469 C 16.527344 10.480469 17.75 9.257812 17.75 7.757812 C 17.75 6.257812 16.527344 5.035156 15.027344 5.035156 Z M 15.027344 5.035156 "/> </g> </svg>',
    'bk-facebook': '<svg class="bk-icon" viewBox="0 0 11 20" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" opacity="0.8"> <path d="M10.8114293,0.966205517 C10.7862801,0.815177577 10.6802752,0.688698348 10.5350593,0.636132086 C9.64889075,0.316998842 8.47769878,0.000800770024 7.22078346,2.68575865e-07 C6.23482966,-0.00026656524 5.19019457,0.198257794 4.2191139,0.757007805 C3.73019331,1.03745015 3.34484384,1.39207229 3.0514374,1.79125568 C2.60984043,2.39083126 2.37484486,3.08086351 2.24233872,3.78130228 C2.13552255,4.34779047 2.09522987,4.92495201 2.07359622,5.48450253 C1.82048246,5.49037287 1.53356612,5.49224071 1.27233974,5.49224071 C1.04383427,5.49224071 0.83479908,5.49090654 0.682552237,5.48930553 C0.606564025,5.48850503 0.545178531,5.48797136 0.502452063,5.4874377 C0.459725596,5.4866372 0.437010258,5.48637036 0.436469417,5.48637036 C0.321811048,5.48476936 0.209316045,5.52959744 0.127378579,5.60884708 C0.0457115332,5.68863039 -0.000800823855,5.79936643 1.04381879e-05,5.9127708 L0.0170469411,8.7305359 C0.0186694652,8.96534966 0.21120899,9.17187903 0.448638348,9.17187903 C0.448908768,9.17187903 0.563296716,9.17187903 0.748534883,9.17187903 C1.16903904,9.17187903 1.95379986,9.15400116 2.5571084,9.16574185 C2.64634722,11.1013544 2.66744003,14.0021048 2.66744003,16.252848 C2.66744003,17.2017091 2.66338372,18.0286271 2.66013868,18.6242001 C2.65797531,18.9211862 2.65635279,19.1573341 2.65473026,19.3211701 C2.65337816,19.4847392 2.6525669,19.5722607 2.6525669,19.5727943 C2.65148521,19.6859319 2.69637505,19.7950669 2.77777167,19.8756507 C2.85889788,19.9557009 2.96977036,20.000529 3.08469914,19.9999953 L6.90682505,19.9810501 C7.02175384,19.9805164 7.12992211,19.9351547 7.21050747,19.854304 C7.29136326,19.7737202 7.33544183,19.6661862 7.33436014,19.552515 C7.33436014,19.552515 7.31434901,17.2334623 7.29082241,14.7318953 C7.27081128,12.580681 7.24863679,10.2976509 7.23592702,9.23431814 C7.47173385,9.23031564 7.74648126,9.22871463 8.01365689,9.22898147 C8.32599278,9.22898147 8.62994563,9.2308493 8.85547647,9.23271714 C8.96797148,9.23351764 9.06126661,9.23458498 9.12589715,9.23538548 C9.19106854,9.23618598 9.22730491,9.23645281 9.22730491,9.23645281 C9.3422337,9.23805382 9.45283576,9.19402624 9.53477322,9.11450976 C9.61671069,9.03499328 9.66295263,8.92665875 9.66322305,8.81325438 L9.66809062,6.20335283 C9.66836104,6.08994845 9.62320079,5.94452402 9.54180416,5.86474071 C9.46067796,5.7849574 9.351428,5.70330625 9.23622879,5.70330625 C9.23622879,5.70330625 9.18484886,5.70330625 9.09344667,5.70330625 C9.00204448,5.70330625 8.87197214,5.74173032 8.7159394,5.74173032 C8.23648354,5.74173032 7.51121527,5.75854085 6.93738258,5.74893484 C6.94765857,5.45942015 6.9741598,5.21313253 7.01742711,4.99486247 C7.05907189,4.78246276 7.11640108,4.61035494 7.18400625,4.46866619 C7.23484533,4.36246633 7.29136326,4.27868051 7.35193749,4.20850322 C7.44388052,4.10337069 7.54339533,4.0323929 7.67157473,3.9795598 C7.79948371,3.92726037 7.96038402,3.89604082 8.16644458,3.89577398 C8.53232376,3.89470665 9.03476539,4.00144018 9.66403431,4.24132378 C9.66863146,4.24319161 9.67376945,4.24372528 9.67863703,4.24559312 C9.68377502,4.24719412 9.68783133,4.25012929 9.69296932,4.25146346 C9.70216363,4.25439863 9.71135793,4.25466547 9.72055223,4.25680014 C9.73515495,4.26026898 9.74948724,4.26347098 9.76381954,4.26533882 C9.77788142,4.26693982 9.79167287,4.26747349 9.8051939,4.26800716 C9.8195262,4.26827399 9.83331766,4.26854083 9.84764995,4.26774032 C9.86171183,4.26667299 9.87523286,4.26480515 9.88848347,4.26240365 C9.90227493,4.26026898 9.91606638,4.25760064 9.929317,4.2541318 C9.94229719,4.25066296 9.95527738,4.24612678 9.96771673,4.24132378 C9.98096735,4.2367876 9.99394754,4.23171776 10.0063869,4.22558058 C10.0185558,4.21971024 10.0299135,4.21303939 10.0415416,4.20610171 C10.0534401,4.1988972 10.0653386,4.19115902 10.0766963,4.18288717 C10.0875131,4.17514899 10.0972482,4.16634347 10.1069834,4.15727112 C10.1178002,4.14766511 10.1280762,4.13805909 10.1372705,4.12765257 C10.1464648,4.11751289 10.1545774,4.10683953 10.1629605,4.09589935 C10.1713435,4.08469233 10.1797265,4.07321847 10.1870279,4.06094412 C10.1940588,4.04920343 10.2002785,4.03612857 10.2064982,4.02305371 C10.2105545,4.01451503 10.2156925,4.00677685 10.219208,3.9977045 C10.2213713,3.99290149 10.2219122,3.98783165 10.2238051,3.98249497 C10.2251572,3.9779588 10.2281318,3.97395629 10.229484,3.96915328 C10.316289,3.68684311 10.4652908,3.21374675 10.5931998,2.71450068 C10.657019,2.46421056 10.7162412,2.20698276 10.7600493,1.95909415 C10.8035871,1.7109387 10.8330629,1.47399027 10.8333333,1.25305187 C10.8327925,1.15539069 10.8268432,1.06066469 10.8114293,0.966205517 Z M7.15815634,3.37125455 C6.95104604,3.47807246 6.77051534,3.62871982 6.62603815,3.81007405 C6.40840128,4.08302398 6.26839788,4.41765009 6.18050101,4.79846773 C6.09260414,5.18007273 6.05497165,5.61259338 6.05497165,6.10022893 C6.05497165,6.15009478 6.05549797,6.20074799 6.0560243,6.2519261 C6.0597086,6.47474772 6.23787083,6.59416332 6.46129731,6.60151197 C7.05631176,6.6204085 8.03133544,6.56240664 8.62713939,6.56240664 C8.65819278,6.56240664 8.68740401,6.56240664 8.71661525,6.56240664 L8.71345728,8.35049112 C8.49950471,8.34891641 8.22607702,8.37778612 7.9439649,8.37778612 C7.49842776,8.37778612 7.03710077,8.3969451 6.74261993,8.41137995 C6.51708813,8.42266538 6.34182072,8.61687976 6.34497869,8.84206345 C6.35629475,9.55488268 6.38155853,12.19961 6.40419066,14.6593088 C6.41550672,15.8894206 6.42603329,17.0767528 6.43392822,17.9543918 C6.43761252,18.3803512 6.44077049,18.7338738 6.44287581,18.9847778 L3.56701647,19 C3.57149027,18.4470139 3.57754304,17.3979939 3.57754304,16.141112 C3.57754304,13.7651353 3.55491092,10.6542935 3.45017153,8.73209612 C3.4385923,8.51583579 3.26437754,8.34550454 3.04753017,8.33789343 C2.48093746,8.31794709 1.53933564,8.31427277 0.996427713,8.31401032 L0.984848485,6.4007363 C1.10327241,6.40152366 1.23959152,6.40231101 1.38380554,6.40231101 C1.79276285,6.40204856 2.26172161,6.39784933 2.59304545,6.37869035 C2.80989282,6.36635511 2.98147593,6.18972501 2.98700238,5.97346468 C3.00963451,5.09556323 3.05963573,4.20427674 3.29358878,3.44631578 C3.41017056,3.0668104 3.57043761,2.72142376 3.79175877,2.41776697 C4.01360627,2.11437262 4.29545522,1.85034606 4.67283281,1.63093631 C5.46574681,1.17059576 6.32418871,1.0002645 7.17289354,1.00000205 C8.13896964,0.999214696 9.08399259,1.22518574 9.84848485,1.48343837 C9.84243207,1.61387694 9.82295791,1.77475992 9.79243086,1.94929041 C9.7361137,2.27158128 9.64479569,2.63848898 9.5518987,2.97442735 C9.50926608,3.12822413 9.46663347,3.27467227 9.42636933,3.40957252 C8.93293629,3.25026425 8.49345193,3.16444249 8.09265272,3.16365514 C7.75159181,3.16339268 7.434742,3.22769339 7.15815634,3.37125455 Z" id="Shape" fill="#282D36" fill-rule="nonzero"></path> </g></svg>',
    'bk-instagram': '<svg class="bk-icon" viewBox="0 0 20 20" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" opacity="0.8"> <g id="Group" fill="#282D36" fill-rule="nonzero"> <path d="M14.7058824,5.22457894e-16 L5.29411765,5.22457894e-16 C2.37025721,0 5.22457894e-16,2.37025721 0,5.29411765 L0,14.7058824 C-1.56737368e-15,17.6297428 2.37025721,20 5.29411765,20 L14.7058824,20 C16.1099697,20 17.4565492,19.4422285 18.4493888,18.4493888 C19.4422285,17.4565492 20,16.1099697 20,14.7058824 L20,5.29411765 C20,2.37025721 17.6297428,0 14.7058824,5.22457894e-16 Z M19,14.8 C19,17.1195959 17.1195959,19 14.8,19 L5.2,19 C2.88040405,19 1,17.1195959 1,14.8 L1,5.2 C1,2.88040405 2.88040405,1 5.2,1 L14.8,1 C17.1195959,1 19,2.88040405 19,5.2 L19,14.8 Z" id="Shape"></path> <path d="M9.5,5 C7.01471863,5 5,7.01471863 5,9.5 C5,11.9852814 7.01471863,14 9.5,14 C11.9852814,14 14,11.9852814 14,9.5 C14,8.3065258 13.5258942,7.16193319 12.6819805,6.31801948 C11.8380668,5.47410578 10.6934742,5 9.5,5 Z M9.5,13 C7.56700338,13 6,11.4329966 6,9.5 C6,7.56700338 7.56700338,6 9.5,6 C11.4329966,6 13,7.56700338 13,9.5 C13,10.4282577 12.6312511,11.3184964 11.9748737,11.9748737 C11.3184964,12.6312511 10.4282577,13 9.5,13 Z" id="Shape"></path> <path d="M15,3 C14.4477153,3 14,3.44771525 14,4 C14,4.55228475 14.4477153,5 15,5 C15.5522847,5 16,4.55228475 16,4 C16,3.44771525 15.5522847,3 15,3 Z" id="Shape"></path> </g> </g></svg>',
    'bk-map': '<svg class="bk-icon"  version="1.1" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><path d="M15 18.984v-11.859l-6-2.109v11.859zM20.484 3c0.281 0 0.516 0.234 0.516 0.516v15.094c0 0.234-0.188 0.422-0.375 0.469l-5.625 1.922-6-2.109-5.344 2.063-0.141 0.047c-0.281 0-0.516-0.234-0.516-0.516v-15.094c0-0.234 0.188-0.422 0.375-0.469l5.625-1.922 6 2.109 5.344-2.063z"></path></svg>',
    'bk-phone': '<svg class="bk-icon" viewBox="0 0 20 20" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd"> <g id="FREE100icons" transform="translate(-75.000000, -936.000000)" fill="#1A1919"> <g id="J" transform="translate(75.000000, 936.000000)"> <g id="2J"> <path d="M1.58978723,3.94893617 C1.57319149,4.1787234 1.59531915,4.8893617 2.19276596,6.44255319 L2.21191489,6.49787234 C3.00893617,9.36170213 8.78212766,15.6765957 12.0174468,17.2255319 C14.4365957,18.3829787 15.8421277,18.6042553 16.1144681,18.5319149 C16.4259574,18.4085106 17.3344681,17.3191489 17.7221277,16.8553191 C17.9102128,16.6297872 18.0791489,16.4255319 18.213617,16.2765957 C18.326383,16.1489362 18.3221277,16.0765957 18.3208511,16.0510638 C18.313617,15.9276596 18.1987234,15.7787234 18.1280851,15.7106383 L14.8770213,13.506383 C14.4297872,13.3702128 14.0791489,13.4808511 14.012766,13.5021277 L11.6982979,14.7617021 L11.3740426,14.5319149 C7.83404255,12.0340426 5.6506383,8.62553191 5.55914894,8.48085106 L5.36808511,8.1787234 L5.52553191,7.85531915 C5.5587234,7.79148936 6.3387234,6.20425532 6.71744681,5.56170213 C6.81446809,5.39574468 6.6612766,4.8893617 6.46468085,4.56595745 C5.86595745,3.63829787 4.75702128,2.02553191 4.37191489,1.69787234 C4.1987234,1.54893617 3.98085106,1.66382979 3.89659574,1.71914894 C2.93191489,2.55319149 1.81829787,3.61276596 1.58978723,3.94893617 Z M15.9978723,19.812766 C14.8829787,19.812766 13.0038298,19.1106383 11.466383,18.3744681 C7.94893617,16.693617 1.90170213,10.0468085 0.99106383,6.87234043 C0.450212766,5.46382979 0.224255319,4.35744681 0.338297872,3.67234043 C0.373617021,3.45957447 0.447659574,3.01702128 3.08680851,0.727659574 L3.12170213,0.70212766 C3.5,0.417021277 4.42170213,0.0553191489 5.20297872,0.727659574 C5.83914894,1.27234043 7.26680851,3.45531915 7.54638298,3.88510638 C7.64,4.03829787 8.36680851,5.28085106 7.81659574,6.21276596 C7.56212766,6.64255319 7.08553191,7.58723404 6.83531915,8.0893617 C7.41148936,8.91914894 9.21361702,11.3489362 11.7906383,13.2553191 L13.4731915,12.3446809 C13.5612766,12.306383 14.3651064,11.9617021 15.3770213,12.3276596 L15.5204255,12.4 L18.9370213,14.7191489 C18.9991489,14.7702128 19.5442553,15.2510638 19.5940426,15.9574468 C19.6144681,16.2510638 19.5565957,16.6893617 19.1651064,17.1276596 C19.0382979,17.2680851 18.8791489,17.4595745 18.7025532,17.6723404 C17.7838298,18.7702128 17.0876596,19.5659574 16.4914894,19.7489362 C16.3523404,19.7914894 16.1859574,19.812766 15.9978723,19.812766 Z"></path> </g> </g> </g> </g></svg>',
    'bk-plus': '<svg class="bk-icon" viewBox="0 0 26 26" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd"> <path d="M14.3820091,12.8580273 L21.713629,5.52627467 C22.095457,5.14509129 22.095457,4.52542397 21.713629,4.1442406 C21.331801,3.76240564 20.713448,3.76240564 20.3316199,4.1442406 L13,11.4759932 L5.6683801,4.1442406 C5.28655204,3.76240564 4.6681991,3.76240564 4.28637104,4.1442406 C3.90454299,4.52542397 3.90454299,5.14509129 4.28637104,5.52627467 L11.617991,12.8580273 L4.28637104,20.1897799 C3.90454299,20.5709633 3.90454299,21.1906306 4.28637104,21.571814 C4.47728507,21.7627314 4.72749321,21.8578644 4.97770136,21.8578644 C5.2279095,21.8578644 5.47746607,21.7627314 5.6683801,21.571814 L13,14.2400613 L20.3316199,21.571814 C20.5225339,21.7627314 20.7727421,21.8578644 21.0229502,21.8578644 C21.2731584,21.8578644 21.522715,21.7627314 21.713629,21.571814 C22.095457,21.1906306 22.095457,20.5709633 21.713629,20.1897799 L14.3820091,12.8580273" id="4A" fill="#FFFFFF" fill-rule="nonzero" transform="translate(13.000000, 12.857864) rotate(45.000000) translate(-13.000000, -12.857864) "></path> </g></svg>',
    'bk-search': '<svg  class="bk-icon" viewBox="0 0 20 20" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd"> <g id="ic_search/white" fill="#FFFFFF"> <path d="M11.9345282,14.4785601 C10.1728467,14.4785601 8.57484489,13.7744839 7.40676773,12.6310217 C7.40517344,12.6310217 7.40464202,12.6257279 7.40304774,12.6257279 C7.4003906,12.6257279 7.39667061,12.6204341 7.39401347,12.6204341 C6.20361636,11.4505029 5.46333816,9.82530439 5.46333816,8.03599788 C5.46333816,4.47856008 8.3665254,1.58814187 11.9345282,1.58814187 C15.5025309,1.58814187 18.4057182,4.47856008 18.4057182,8.03599788 C18.4057182,11.5881419 15.5025309,14.4785601 11.9345282,14.4785601 Z M3.86905632,8.03599788 C3.86905632,9.98411858 4.57107176,11.7734251 5.73436607,13.1656961 L0.23356229,18.6447856 C-0.0778540966,18.9571202 -0.0778540966,19.454738 0.23356229,19.7670725 C0.389270483,19.9205929 0.593338559,20 0.797406635,20 C1.00147471,20 1.20501136,19.9205929 1.36071955,19.7670725 L6.87108903,14.2773954 C8.25651995,15.3943886 10.01767,16.066702 11.9345282,16.066702 C16.3820431,16.066702 20,12.4616199 20,8.03599788 C20,3.60508205 16.3820431,0 11.9345282,0 C7.48754467,0 3.86905632,3.60508205 3.86905632,8.03599788 Z" id="6F" transform="translate(10.000000, 10.000000) scale(-1, 1) translate(-10.000000, -10.000000) "></path> </g> </g></svg>',
    'bk-snapchat': '<svg class="bk-icon" viewBox="0 0 21 20" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" stroke-linecap="round" stroke-linejoin="round"> <g id="icons8-snapchat-(1)" transform="translate(1.000000, 1.000000)" stroke="#000000"> <path d="M9.54857143,17.8495714 C9.50014286,17.8495714 9.45214286,17.8482857 9.40457143,17.8457143 C9.37414286,17.8482857 9.34242857,17.8495714 9.31028571,17.8495714 C8.193,17.8495714 7.476,17.3425714 6.78257143,16.8527143 C6.30385714,16.5145714 5.85214286,16.1948571 5.31985714,16.1065714 C5.06014286,16.0637143 4.80171429,16.0418571 4.55185714,16.0418571 C4.10185714,16.0418571 3.74657143,16.1112857 3.48728571,16.1618571 C3.32957143,16.1927143 3.19371429,16.2192857 3.09042857,16.2192857 C2.98242857,16.2192857 2.86542857,16.1961429 2.81485714,16.0221429 C2.77071429,15.8717143 2.73857143,15.726 2.70814286,15.585 C2.62885714,15.2224286 2.57271429,14.9991429 2.42057143,14.976 C0.648857143,14.7021429 0.141428571,14.3292857 0.0287142857,14.0644286 C0.0128571429,14.0267143 0.00342857143,13.9885714 0.00128571429,13.9508571 C-0.00428571429,13.8492857 0.0677142857,13.7592857 0.168,13.743 C2.89157143,13.2942857 4.113,10.5107143 4.164,10.3924286 C4.16528571,10.389 4.167,10.386 4.16828571,10.3825714 C4.335,10.0448571 4.36757143,9.75128571 4.26557143,9.51128571 C4.07871429,9.07071429 3.46885714,8.877 3.06557143,8.74928571 C2.967,8.718 2.87314286,8.68842857 2.79942857,8.65928571 C1.99414286,8.34085714 1.92728571,8.01428571 1.959,7.84757143 C2.013,7.56385714 2.39228571,7.36585714 2.69871429,7.36585714 C2.78271429,7.36585714 2.85685714,7.38085714 2.919,7.41 C3.28114286,7.57971429 3.60771429,7.66585714 3.88928571,7.66585714 C4.27842857,7.66585714 4.44857143,7.50214286 4.46914286,7.48071429 C4.45928571,7.29642857 4.44685714,7.104 4.43442857,6.90514286 C4.35342857,5.61728571 4.25271429,4.01742857 4.66028571,3.10414286 C5.88128571,0.366428571 8.47071429,0.153857143 9.23528571,0.153857143 C9.255,0.153857143 9.57042857,0.150428571 9.57042857,0.150428571 L9.61585714,0.150428571 C10.3821429,0.150428571 12.9771429,0.363428571 14.199,3.10285714 C14.6065714,4.01657143 14.5058571,5.61814286 14.4244286,6.90471429 L14.421,6.96085714 C14.4098571,7.14 14.3987143,7.314 14.3897143,7.48071429 C14.409,7.50042857 14.5654286,7.65085714 14.9181429,7.66457143 L14.9185714,7.66457143 C15.1868571,7.65428571 15.495,7.569 15.8331429,7.41042857 C15.9321429,7.36414286 16.0422857,7.35428571 16.1172857,7.35428571 C16.2317143,7.35428571 16.3478571,7.37657143 16.4442857,7.41685714 L16.4502857,7.41942857 C16.7237143,7.51628571 16.9028571,7.70828571 16.9067143,7.90842857 C16.9101429,8.097 16.7661429,8.38071429 16.0598571,8.65971429 C15.9865714,8.68842857 15.8931429,8.71842857 15.7937143,8.74971429 C15.3895714,8.87785714 14.7801429,9.07114286 14.5937143,9.51171429 C14.4917143,9.75214286 14.5242857,10.0448571 14.691,10.383 C14.6922857,10.3864286 14.694,10.3894286 14.6952857,10.3928571 C14.7458571,10.5111429 15.9664286,13.2938571 18.6912857,13.743 C18.792,13.7597143 18.8635714,13.8492857 18.858,13.9512857 C18.8558571,13.9894286 18.8464286,14.028 18.8301429,14.0652857 C18.7178571,14.328 18.2108571,14.7008571 16.4387143,14.9747143 C16.2938571,14.997 16.2377143,15.1855714 16.1515714,15.5811429 C16.1202857,15.7251429 16.0881429,15.8665714 16.0444286,16.0152857 C16.0067143,16.1442857 15.9261429,16.2047143 15.7907143,16.2047143 L15.7688571,16.2047143 C15.675,16.2047143 15.5412857,16.188 15.3724286,16.1545714 C15.0724286,16.0958571 14.736,16.0418571 14.3078571,16.0418571 C14.058,16.0418571 13.7991429,16.0637143 13.5394286,16.1065714 C13.0075714,16.1952857 12.5562857,16.5141429 12.0784286,16.8518571 C11.3828571,17.3425714 10.6658571,17.8495714 9.54857143,17.8495714 Z" id="Shape"></path> </g> </g></svg>',
    'bk-star': '<svg class="bk-icon" viewBox="0 0 20 19" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd"> <g id="FREE100icons" transform="translate(-444.000000, -1448.000000)" fill="#1A1919"> <g id="J" transform="translate(12.000000, 1447.000000)"> <g id="4J" transform="translate(432.000000, 1.000000)"> <path d="M2.43288889,7.85627907 L5.97422222,11.2895349 C6.13111111,11.4397674 6.20311111,11.6606977 6.16622222,11.8727907 L5.32977778,16.72 L9.70755556,14.4311628 C9.90177778,14.3295349 10.1337778,14.3295349 10.328,14.4311628 L14.7053333,16.72 L13.8697778,11.8727907 C13.8324444,11.6606977 13.9044444,11.4397674 14.0613333,11.2895349 L17.6026667,7.85627907 L12.7084444,7.14930233 C12.4911111,7.11837209 12.3035556,6.98139535 12.2062222,6.78697674 L10.0177778,2.3772093 L7.82888889,6.78697674 C7.73155556,6.98139535 7.544,7.11837209 7.32711111,7.14930233 L2.43288889,7.85627907 Z M4.44444444,18.5934884 C4.30622222,18.5934884 4.16888889,18.5537209 4.05244444,18.4697674 C3.84711111,18.3195349 3.74444444,18.0676744 3.78711111,17.8202326 L4.79244444,11.992093 L0.534666667,7.86953488 C0.352888889,7.6927907 0.287555556,7.42767442 0.365777778,7.18906977 C0.444444444,6.94604651 0.652888889,6.77372093 0.904,6.73837209 L6.78844444,5.8855814 L9.42,0.587674419 C9.53244444,0.357906977 9.764,0.216511628 10.0177778,0.216511628 C10.2715556,0.216511628 10.5031111,0.357906977 10.6155556,0.587674419 L13.2471111,5.8855814 L19.1311111,6.73837209 C19.3822222,6.77372093 19.5911111,6.94604651 19.6693333,7.18906977 C19.748,7.42767442 19.6826667,7.6927907 19.5004444,7.86953488 L15.2431111,11.992093 L16.248,17.8202326 C16.2906667,18.0676744 16.188,18.3195349 15.9826667,18.4697674 C15.7773333,18.6155814 15.5057778,18.6376744 15.2804444,18.5183721 L10.0177778,15.77 L4.75466667,18.5183721 C4.65733333,18.5713953 4.55066667,18.5934884 4.44444444,18.5934884 Z"></path> </g> </g> </g> </g></svg>',
    'bk-twitter': '<svg class="bk-icon" viewBox="0 0 20 19" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" opacity="0.8"> <path d="M14.2250466,0.909090909 C15.3863835,0.909090909 16.4333558,1.41024304 17.1697748,2.21357471 C17.7801401,2.22975135 17.8445886,2.23557494 18.1396617,2.23557494 C18.317211,2.23557494 18.5781643,2.23331021 19.0909091,2.22975135 C18.7655073,3.40029262 18.6786282,3.64067741 18.2612925,4.9846322 C18.2688747,5.16192811 18.2729817,5.33954756 18.2729817,5.5191082 C18.2729817,10.9777517 14.2152529,17.2727273 6.79546026,17.2727273 C3.24257818,17.2727273 1.24846546,15.4742091 1.57386725,15.4742091 C3.46372503,15.4742091 5.2038348,14.8145259 6.58442298,13.7061029 C4.81903929,13.6724555 -1.6071722,9.49208963 1.98046153,1.6651868 C3.97046724,4.1641533 6.9429968,5.80866996 10.2958989,5.98078935 C10.2263956,5.67860982 10.1910122,5.36381251 10.1910122,5.03930922 C10.1910122,2.75840376 11.9971501,0.909090909 14.2250466,0.909090909 Z M19.0909091,2.72727273 L19.0924823,2.72727273 L19.0909091,2.72727273 Z M14.2085287,0 C11.519519,0 9.32356775,2.19580345 9.24899539,4.92344574 C6.71322081,4.51629178 4.38637466,3.16178987 2.74515364,1.10609622 C2.56485846,0.880185228 2.29520232,0.751322768 2.01390408,0.751322768 C1.97551663,0.751322768 1.93681452,0.753572238 1.89842707,0.758392529 C1.57622417,0.798882978 1.29712849,1.00551281 1.15931123,1.30565629 C-0.844702708,5.66544928 0.120018087,8.85391143 1.28233988,10.7608187 C2.12151482,12.1381367 3.29862522,13.2188461 4.41752514,13.8859744 C3.53996274,14.2693482 2.59160382,14.4676229 1.6089479,14.4676229 C1.06963562,14.4676229 0.630697099,14.9117324 0.630697099,15.4573894 C0.630697099,16.4063441 2.0919376,17.0779714 2.57178079,17.2987408 C3.44808457,17.7017171 4.89453646,18.1818182 6.80950409,18.1818182 C11.4625671,18.1818182 14.3781258,15.9355623 16.0045582,14.0511497 C18.0258779,11.7094521 19.1847386,8.60839791 19.1847386,5.54333522 C19.1847386,5.41158059 19.182536,5.27821919 19.1784455,5.14421509 C19.2476688,4.92312438 19.3068233,4.73416896 19.3596847,4.56545876 C19.5934706,3.81992034 19.7023399,3.47382341 19.9515437,2.58110542 C19.9830088,2.4853423 20,2.38250941 20,2.27582029 C20,1.74333876 19.5780526,1.31176199 19.0569901,1.31176199 C19.0563608,1.31176199 19.0557315,1.31176199 19.0551022,1.31176199 C19.0528997,1.31176199 19.0506971,1.31176199 19.0488092,1.31176199 L18.7445414,1.31433282 C18.4298902,1.31658228 18.2436166,1.3178677 18.1076873,1.3178677 C17.9182672,1.3178677 17.8295355,1.31529687 17.6117969,1.30886982 L17.5365952,1.30662035 C16.6291409,0.472067214 15.4378712,0 14.2085287,0 Z" id="Shape" fill="#282D36" fill-rule="nonzero"></path> </g></svg>',
    'bk-user': '<svg class="bk-icon" viewBox="0 0 20 23" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd"> <g id="FREE100icons" transform="translate(-449.000000, -877.000000)" fill="#1A1919"> <g id="F" transform="translate(17.000000, 872.000000)"> <g id="4F" transform="translate(432.000000, 5.000000)"> <path d="M9.88,2.19075 C11.7508571,2.19075 13.2731429,3.726 13.2731429,5.60625 C13.2731429,7.49225 11.7508571,9.02175 9.88,9.02175 C8.00914286,9.02175 6.48742857,7.49225 6.48742857,5.60625 C6.48742857,3.726 8.00914286,2.19075 9.88,2.19075 Z M9.88,10.74675 C12.696,10.74675 14.9874286,8.441 14.9874286,5.60625 C14.9874286,2.7715 12.696,0.46575 9.88,0.46575 C7.064,0.46575 4.77314286,2.7715 4.77314286,5.60625 C4.77314286,8.441 7.064,10.74675 9.88,10.74675 Z M17.9754286,20.9185 L1.78457143,20.9185 L1.78457143,16.9165 C1.78457143,15.9045 2.17828571,14.9155 2.83771429,14.26575 C3.17485714,13.93225 3.73028571,13.52975 4.52285714,13.55275 C4.96,13.56425 6.31428571,13.547 7.96114286,13.54125 C10.4217143,13.52975 13.5251429,13.5125 15.1308571,13.5125 C17.0851429,13.5125 17.9754286,15.11675 17.9754286,16.606 L17.9754286,20.9185 Z M15.1308571,11.7875 C13.5234286,11.7875 10.4165714,11.80475 7.95314286,11.81625 C6.31828571,11.822 4.968,11.82775 4.54628571,11.82775 C4.54457143,11.82775 4.54228571,11.82775 4.54,11.82775 C3.47828571,11.8105 2.44514286,12.236 1.63714286,13.03525 C0.656,14.00125 0.0702857143,15.45025 0.0702857143,16.9165 L0.0702857143,21.781 C0.0702857143,22.2525 0.453714286,22.6435 0.927428571,22.6435 L18.8325714,22.6435 C19.3057143,22.6435 19.6897143,22.2525 19.6897143,21.781 L19.6897143,16.606 C19.6897143,14.2715 18.092,11.7875 15.1308571,11.7875 Z"></path> </g> </g> </g> </g></svg>',
    'bk-world': '<svg class="bk-icon" viewBox="0 0 20 21" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd"> <g id="FREE100icons" transform="translate(-733.000000, -1306.000000)" fill="#1A1919"> <g id="I" transform="translate(11.000000, 1304.000000)"> <g id="6I" transform="translate(722.000000, 2.000000)"> <path d="M11.605,19.212439 C12.5415,17.7270732 13.7445,15.125122 13.943,11.4168293 L18.169,11.4168293 C17.848,15.2941463 15.1355,18.4492683 11.605,19.212439 Z M1.7345,11.4168293 L6.0145,11.4168293 C6.2095,15.1865854 7.3585,17.742439 8.2755,19.2073171 C4.7565,18.4390244 2.0545,15.2839024 1.7345,11.4168293 Z M8.226,2.1102439 C7.2635,3.5904878 6.082,6.16170732 5.9955,9.8802439 L1.7345,9.8802439 C2.0525,6.03878049 4.7315,2.89902439 8.226,2.1102439 Z M7.492,9.8802439 C7.595,5.87487805 9.129,3.36 9.949,2.2997561 C10.7805,3.37536585 12.344,5.92097561 12.464,9.8802439 L7.492,9.8802439 Z M9.9435,18.9665854 C9.159,17.8909756 7.7455,15.4221951 7.517,11.4168293 L12.441,11.4168293 C12.2085,15.3146341 10.7435,17.855122 9.9435,18.9665854 Z M18.169,9.8802439 L13.96,9.8802439 C13.859,6.20268293 12.641,3.60073171 11.6655,2.10512195 C15.166,2.88878049 17.85,6.03365854 18.169,9.8802439 Z M9.9605,0.373902439 C9.959,0.373902439 9.9575,0.373902439 9.956,0.373902439 C9.9545,0.373902439 9.953,0.373902439 9.9515,0.373902439 C4.573,0.373902439 0.1975,4.98365854 0.1975,10.6485366 C0.1975,16.3185366 4.573,20.9282927 9.9515,20.9282927 C15.33,20.9282927 19.7055,16.3185366 19.7055,10.6485366 C19.7055,4.98878049 15.335,0.37902439 9.9605,0.373902439 Z"></path> </g> </g> </g> </g></svg>',
    'bk-youtube': '<svg class="bk-icon" viewBox="0 0 22 16" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd"> <g id="icons8-play-button-(1)" fill="#000000" fill-rule="nonzero"> <path d="M10.7,1 C14.3,1 17.2,1.3 18.6,1.55 C19.35,1.75 19.95,2.25 20.05,2.9 C20.35,4.5 20.55,6.2 20.55,7.95 C20.5,10.1 20.25,11.85 20.05,13.1 C19.9,14.05 18.9,14.35 18.6,14.45 C16.8,14.8 13.8,15.05 10.8,15.05 C7.8,15.05 4.75,14.85 3,14.45 C2.25,14.25 1.65,13.75 1.55,13.1 C1.15,11.7 1,9.85 1,8 C1,5.7 1.2,4 1.4,2.95 C1.55,2 2.6,1.7 2.85,1.6 C4.5,1.25 7.55,1 10.7,1 Z M10.7,0 C7.4,0 4.3,0.25 2.65,0.6 C1.55,0.85 0.6,1.6 0.4,2.75 C0.2,3.95 0,5.75 0,8 C0,10.25 0.2,12 0.45,13.25 C0.65,14.35 1.6,15.15 2.7,15.4 C4.45,15.75 7.45,16 10.75,16 C14.05,16 17.05,15.75 18.8,15.4 C19.9,15.15 20.85,14.4 21.05,13.25 C21.25,12 21.5,10.2 21.55,7.95 C21.55,5.7 21.3,3.9 21.05,2.65 C20.85,1.55 19.9,0.75 18.8,0.5 C17.05,0.25 14,0 10.7,0 Z" id="Shape"></path> <path d="M9,5.7 L13,8 L9,10.3 L9,5.7 Z M8,4 L8,12 L15,8 L8,4 Z" id="Shape"></path> </g> </g></svg>'
  };

  function plugin(UIkit) {
    if (plugin.installed) {
      return;
    }

    UIkit.icon.add(Icons);
  }

  if (typeof window !== 'undefined' && window.UIkit) {
    window.UIkit.use(plugin);
  }

  return plugin;
});

},{}],386:[function(require,module,exports){
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.throttle = throttle;
exports.debounce = void 0;

var _this = void 0,
    _arguments = arguments;

var debounce = function debounce(func, wait, immediate) {
  var timeout;
  return function () {
    var context = _this;
    var args = _arguments;

    var later = function later() {
      timeout = null;
      if (!immediate) func.apply(context, args);
    };

    var callNow = immediate && !timeout;
    clearTimeout(timeout);
    timeout = setTimeout(later, wait);
    if (callNow) func.apply(context, args);
  };
};

exports.debounce = debounce;

function throttle(fn, wait) {
  var time = Date.now();
  return function () {
    if (time + wait - Date.now() < 0) {
      fn();
      time = Date.now();
    }
  };
}

},{}]},{},[367])
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm5vZGVfbW9kdWxlcy9icm93c2VyLXBhY2svX3ByZWx1ZGUuanMiLCJub2RlX21vZHVsZXMvYXhpb3MvaW5kZXguanMiLCJub2RlX21vZHVsZXMvYXhpb3MvbGliL2FkYXB0ZXJzL3hoci5qcyIsIm5vZGVfbW9kdWxlcy9heGlvcy9saWIvYXhpb3MuanMiLCJub2RlX21vZHVsZXMvYXhpb3MvbGliL2NhbmNlbC9DYW5jZWwuanMiLCJub2RlX21vZHVsZXMvYXhpb3MvbGliL2NhbmNlbC9DYW5jZWxUb2tlbi5qcyIsIm5vZGVfbW9kdWxlcy9heGlvcy9saWIvY2FuY2VsL2lzQ2FuY2VsLmpzIiwibm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9jb3JlL0F4aW9zLmpzIiwibm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9jb3JlL0ludGVyY2VwdG9yTWFuYWdlci5qcyIsIm5vZGVfbW9kdWxlcy9heGlvcy9saWIvY29yZS9jcmVhdGVFcnJvci5qcyIsIm5vZGVfbW9kdWxlcy9heGlvcy9saWIvY29yZS9kaXNwYXRjaFJlcXVlc3QuanMiLCJub2RlX21vZHVsZXMvYXhpb3MvbGliL2NvcmUvZW5oYW5jZUVycm9yLmpzIiwibm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9jb3JlL3NldHRsZS5qcyIsIm5vZGVfbW9kdWxlcy9heGlvcy9saWIvY29yZS90cmFuc2Zvcm1EYXRhLmpzIiwibm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9kZWZhdWx0cy5qcyIsIm5vZGVfbW9kdWxlcy9heGlvcy9saWIvaGVscGVycy9iaW5kLmpzIiwibm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9oZWxwZXJzL2J0b2EuanMiLCJub2RlX21vZHVsZXMvYXhpb3MvbGliL2hlbHBlcnMvYnVpbGRVUkwuanMiLCJub2RlX21vZHVsZXMvYXhpb3MvbGliL2hlbHBlcnMvY29tYmluZVVSTHMuanMiLCJub2RlX21vZHVsZXMvYXhpb3MvbGliL2hlbHBlcnMvY29va2llcy5qcyIsIm5vZGVfbW9kdWxlcy9heGlvcy9saWIvaGVscGVycy9pc0Fic29sdXRlVVJMLmpzIiwibm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9oZWxwZXJzL2lzVVJMU2FtZU9yaWdpbi5qcyIsIm5vZGVfbW9kdWxlcy9heGlvcy9saWIvaGVscGVycy9ub3JtYWxpemVIZWFkZXJOYW1lLmpzIiwibm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9oZWxwZXJzL3BhcnNlSGVhZGVycy5qcyIsIm5vZGVfbW9kdWxlcy9heGlvcy9saWIvaGVscGVycy9zcHJlYWQuanMiLCJub2RlX21vZHVsZXMvYXhpb3MvbGliL3V0aWxzLmpzIiwibm9kZV9tb2R1bGVzL2JhYmVsLXBvbHlmaWxsL2xpYi9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9ib2R5LXNjcm9sbC1sb2NrL2xpYi9ib2R5U2Nyb2xsTG9jay5taW4uanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9mbi9yZWdleHAvZXNjYXBlLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fYS1mdW5jdGlvbi5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX2EtbnVtYmVyLXZhbHVlLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fYWRkLXRvLXVuc2NvcGFibGVzLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fYW4taW5zdGFuY2UuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19hbi1vYmplY3QuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19hcnJheS1jb3B5LXdpdGhpbi5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX2FycmF5LWZpbGwuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19hcnJheS1mcm9tLWl0ZXJhYmxlLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fYXJyYXktaW5jbHVkZXMuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19hcnJheS1tZXRob2RzLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fYXJyYXktcmVkdWNlLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fYXJyYXktc3BlY2llcy1jb25zdHJ1Y3Rvci5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX2FycmF5LXNwZWNpZXMtY3JlYXRlLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fYmluZC5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX2NsYXNzb2YuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19jb2YuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19jb2xsZWN0aW9uLXN0cm9uZy5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX2NvbGxlY3Rpb24tdG8tanNvbi5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX2NvbGxlY3Rpb24td2Vhay5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX2NvbGxlY3Rpb24uanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19jb3JlLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fY3JlYXRlLXByb3BlcnR5LmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fY3R4LmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fZGF0ZS10by1pc28tc3RyaW5nLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fZGF0ZS10by1wcmltaXRpdmUuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19kZWZpbmVkLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fZGVzY3JpcHRvcnMuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19kb20tY3JlYXRlLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fZW51bS1idWcta2V5cy5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX2VudW0ta2V5cy5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX2V4cG9ydC5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX2ZhaWxzLWlzLXJlZ2V4cC5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX2ZhaWxzLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fZml4LXJlLXdrcy5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX2ZsYWdzLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fZmxhdHRlbi1pbnRvLWFycmF5LmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fZm9yLW9mLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fZ2xvYmFsLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9faGFzLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9faGlkZS5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX2h0bWwuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19pZTgtZG9tLWRlZmluZS5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX2luaGVyaXQtaWYtcmVxdWlyZWQuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19pbnZva2UuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19pb2JqZWN0LmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9faXMtYXJyYXktaXRlci5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX2lzLWFycmF5LmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9faXMtaW50ZWdlci5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX2lzLW9iamVjdC5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX2lzLXJlZ2V4cC5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX2l0ZXItY2FsbC5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX2l0ZXItY3JlYXRlLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9faXRlci1kZWZpbmUuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19pdGVyLWRldGVjdC5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX2l0ZXItc3RlcC5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX2l0ZXJhdG9ycy5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX2xpYnJhcnkuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19tYXRoLWV4cG0xLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fbWF0aC1mcm91bmQuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19tYXRoLWxvZzFwLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fbWF0aC1zY2FsZS5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX21hdGgtc2lnbi5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX21ldGEuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19tZXRhZGF0YS5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX21pY3JvdGFzay5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX25ldy1wcm9taXNlLWNhcGFiaWxpdHkuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19vYmplY3QtYXNzaWduLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fb2JqZWN0LWNyZWF0ZS5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX29iamVjdC1kcC5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX29iamVjdC1kcHMuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19vYmplY3QtZm9yY2VkLXBhbS5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX29iamVjdC1nb3BkLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fb2JqZWN0LWdvcG4tZXh0LmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fb2JqZWN0LWdvcG4uanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19vYmplY3QtZ29wcy5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX29iamVjdC1ncG8uanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19vYmplY3Qta2V5cy1pbnRlcm5hbC5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX29iamVjdC1rZXlzLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fb2JqZWN0LXBpZS5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX29iamVjdC1zYXAuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19vYmplY3QtdG8tYXJyYXkuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19vd24ta2V5cy5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX3BhcnNlLWZsb2F0LmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fcGFyc2UtaW50LmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fcGVyZm9ybS5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX3Byb21pc2UtcmVzb2x2ZS5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX3Byb3BlcnR5LWRlc2MuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19yZWRlZmluZS1hbGwuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19yZWRlZmluZS5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX3JlcGxhY2VyLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fc2FtZS12YWx1ZS5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX3NldC1jb2xsZWN0aW9uLWZyb20uanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19zZXQtY29sbGVjdGlvbi1vZi5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX3NldC1wcm90by5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX3NldC1zcGVjaWVzLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fc2V0LXRvLXN0cmluZy10YWcuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19zaGFyZWQta2V5LmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fc2hhcmVkLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fc3BlY2llcy1jb25zdHJ1Y3Rvci5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX3N0cmljdC1tZXRob2QuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19zdHJpbmctYXQuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19zdHJpbmctY29udGV4dC5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX3N0cmluZy1odG1sLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fc3RyaW5nLXBhZC5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX3N0cmluZy1yZXBlYXQuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19zdHJpbmctdHJpbS5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX3N0cmluZy13cy5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX3Rhc2suanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL190by1hYnNvbHV0ZS1pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX3RvLWluZGV4LmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fdG8taW50ZWdlci5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX3RvLWlvYmplY3QuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL190by1sZW5ndGguanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL190by1vYmplY3QuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL190by1wcmltaXRpdmUuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL190eXBlZC1hcnJheS5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX3R5cGVkLWJ1ZmZlci5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX3R5cGVkLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fdWlkLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fdXNlci1hZ2VudC5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX3ZhbGlkYXRlLWNvbGxlY3Rpb24uanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL193a3MtZGVmaW5lLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fd2tzLWV4dC5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX3drcy5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvY29yZS5nZXQtaXRlcmF0b3ItbWV0aG9kLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9jb3JlLnJlZ2V4cC5lc2NhcGUuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5hcnJheS5jb3B5LXdpdGhpbi5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2LmFycmF5LmV2ZXJ5LmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYuYXJyYXkuZmlsbC5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2LmFycmF5LmZpbHRlci5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2LmFycmF5LmZpbmQtaW5kZXguanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5hcnJheS5maW5kLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYuYXJyYXkuZm9yLWVhY2guanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5hcnJheS5mcm9tLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYuYXJyYXkuaW5kZXgtb2YuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5hcnJheS5pcy1hcnJheS5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2LmFycmF5Lml0ZXJhdG9yLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYuYXJyYXkuam9pbi5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2LmFycmF5Lmxhc3QtaW5kZXgtb2YuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5hcnJheS5tYXAuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5hcnJheS5vZi5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2LmFycmF5LnJlZHVjZS1yaWdodC5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2LmFycmF5LnJlZHVjZS5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2LmFycmF5LnNsaWNlLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYuYXJyYXkuc29tZS5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2LmFycmF5LnNvcnQuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5hcnJheS5zcGVjaWVzLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYuZGF0ZS5ub3cuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5kYXRlLnRvLWlzby1zdHJpbmcuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5kYXRlLnRvLWpzb24uanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5kYXRlLnRvLXByaW1pdGl2ZS5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2LmRhdGUudG8tc3RyaW5nLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYuZnVuY3Rpb24uYmluZC5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2LmZ1bmN0aW9uLmhhcy1pbnN0YW5jZS5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2LmZ1bmN0aW9uLm5hbWUuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5tYXAuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5tYXRoLmFjb3NoLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYubWF0aC5hc2luaC5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2Lm1hdGguYXRhbmguanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5tYXRoLmNicnQuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5tYXRoLmNsejMyLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYubWF0aC5jb3NoLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYubWF0aC5leHBtMS5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2Lm1hdGguZnJvdW5kLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYubWF0aC5oeXBvdC5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2Lm1hdGguaW11bC5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2Lm1hdGgubG9nMTAuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5tYXRoLmxvZzFwLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYubWF0aC5sb2cyLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYubWF0aC5zaWduLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYubWF0aC5zaW5oLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYubWF0aC50YW5oLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYubWF0aC50cnVuYy5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2Lm51bWJlci5jb25zdHJ1Y3Rvci5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2Lm51bWJlci5lcHNpbG9uLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYubnVtYmVyLmlzLWZpbml0ZS5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2Lm51bWJlci5pcy1pbnRlZ2VyLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYubnVtYmVyLmlzLW5hbi5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2Lm51bWJlci5pcy1zYWZlLWludGVnZXIuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5udW1iZXIubWF4LXNhZmUtaW50ZWdlci5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2Lm51bWJlci5taW4tc2FmZS1pbnRlZ2VyLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYubnVtYmVyLnBhcnNlLWZsb2F0LmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYubnVtYmVyLnBhcnNlLWludC5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2Lm51bWJlci50by1maXhlZC5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2Lm51bWJlci50by1wcmVjaXNpb24uanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5vYmplY3QuYXNzaWduLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYub2JqZWN0LmNyZWF0ZS5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2Lm9iamVjdC5kZWZpbmUtcHJvcGVydGllcy5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2Lm9iamVjdC5kZWZpbmUtcHJvcGVydHkuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5vYmplY3QuZnJlZXplLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYub2JqZWN0LmdldC1vd24tcHJvcGVydHktZGVzY3JpcHRvci5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2Lm9iamVjdC5nZXQtb3duLXByb3BlcnR5LW5hbWVzLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYub2JqZWN0LmdldC1wcm90b3R5cGUtb2YuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5vYmplY3QuaXMtZXh0ZW5zaWJsZS5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2Lm9iamVjdC5pcy1mcm96ZW4uanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5vYmplY3QuaXMtc2VhbGVkLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYub2JqZWN0LmlzLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYub2JqZWN0LmtleXMuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5vYmplY3QucHJldmVudC1leHRlbnNpb25zLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYub2JqZWN0LnNlYWwuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5vYmplY3Quc2V0LXByb3RvdHlwZS1vZi5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2Lm9iamVjdC50by1zdHJpbmcuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5wYXJzZS1mbG9hdC5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2LnBhcnNlLWludC5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2LnByb21pc2UuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5yZWZsZWN0LmFwcGx5LmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYucmVmbGVjdC5jb25zdHJ1Y3QuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5yZWZsZWN0LmRlZmluZS1wcm9wZXJ0eS5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2LnJlZmxlY3QuZGVsZXRlLXByb3BlcnR5LmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYucmVmbGVjdC5lbnVtZXJhdGUuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5yZWZsZWN0LmdldC1vd24tcHJvcGVydHktZGVzY3JpcHRvci5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2LnJlZmxlY3QuZ2V0LXByb3RvdHlwZS1vZi5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2LnJlZmxlY3QuZ2V0LmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYucmVmbGVjdC5oYXMuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5yZWZsZWN0LmlzLWV4dGVuc2libGUuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5yZWZsZWN0Lm93bi1rZXlzLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYucmVmbGVjdC5wcmV2ZW50LWV4dGVuc2lvbnMuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5yZWZsZWN0LnNldC1wcm90b3R5cGUtb2YuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5yZWZsZWN0LnNldC5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2LnJlZ2V4cC5jb25zdHJ1Y3Rvci5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2LnJlZ2V4cC5mbGFncy5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2LnJlZ2V4cC5tYXRjaC5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2LnJlZ2V4cC5yZXBsYWNlLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYucmVnZXhwLnNlYXJjaC5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2LnJlZ2V4cC5zcGxpdC5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2LnJlZ2V4cC50by1zdHJpbmcuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5zZXQuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5zdHJpbmcuYW5jaG9yLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYuc3RyaW5nLmJpZy5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2LnN0cmluZy5ibGluay5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2LnN0cmluZy5ib2xkLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYuc3RyaW5nLmNvZGUtcG9pbnQtYXQuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5zdHJpbmcuZW5kcy13aXRoLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYuc3RyaW5nLmZpeGVkLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYuc3RyaW5nLmZvbnRjb2xvci5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2LnN0cmluZy5mb250c2l6ZS5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2LnN0cmluZy5mcm9tLWNvZGUtcG9pbnQuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5zdHJpbmcuaW5jbHVkZXMuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5zdHJpbmcuaXRhbGljcy5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2LnN0cmluZy5pdGVyYXRvci5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2LnN0cmluZy5saW5rLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYuc3RyaW5nLnJhdy5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2LnN0cmluZy5yZXBlYXQuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5zdHJpbmcuc21hbGwuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5zdHJpbmcuc3RhcnRzLXdpdGguanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5zdHJpbmcuc3RyaWtlLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYuc3RyaW5nLnN1Yi5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2LnN0cmluZy5zdXAuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5zdHJpbmcudHJpbS5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2LnN5bWJvbC5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2LnR5cGVkLmFycmF5LWJ1ZmZlci5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2LnR5cGVkLmRhdGEtdmlldy5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2LnR5cGVkLmZsb2F0MzItYXJyYXkuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi50eXBlZC5mbG9hdDY0LWFycmF5LmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYudHlwZWQuaW50MTYtYXJyYXkuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi50eXBlZC5pbnQzMi1hcnJheS5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2LnR5cGVkLmludDgtYXJyYXkuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi50eXBlZC51aW50MTYtYXJyYXkuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi50eXBlZC51aW50MzItYXJyYXkuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi50eXBlZC51aW50OC1hcnJheS5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2LnR5cGVkLnVpbnQ4LWNsYW1wZWQtYXJyYXkuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi53ZWFrLW1hcC5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2LndlYWstc2V0LmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczcuYXJyYXkuZmxhdC1tYXAuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNy5hcnJheS5mbGF0dGVuLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczcuYXJyYXkuaW5jbHVkZXMuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNy5hc2FwLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczcuZXJyb3IuaXMtZXJyb3IuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNy5nbG9iYWwuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNy5tYXAuZnJvbS5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM3Lm1hcC5vZi5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM3Lm1hcC50by1qc29uLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczcubWF0aC5jbGFtcC5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM3Lm1hdGguZGVnLXBlci1yYWQuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNy5tYXRoLmRlZ3JlZXMuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNy5tYXRoLmZzY2FsZS5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM3Lm1hdGguaWFkZGguanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNy5tYXRoLmltdWxoLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczcubWF0aC5pc3ViaC5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM3Lm1hdGgucmFkLXBlci1kZWcuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNy5tYXRoLnJhZGlhbnMuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNy5tYXRoLnNjYWxlLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczcubWF0aC5zaWduYml0LmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczcubWF0aC51bXVsaC5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM3Lm9iamVjdC5kZWZpbmUtZ2V0dGVyLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczcub2JqZWN0LmRlZmluZS1zZXR0ZXIuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNy5vYmplY3QuZW50cmllcy5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM3Lm9iamVjdC5nZXQtb3duLXByb3BlcnR5LWRlc2NyaXB0b3JzLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczcub2JqZWN0Lmxvb2t1cC1nZXR0ZXIuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNy5vYmplY3QubG9va3VwLXNldHRlci5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM3Lm9iamVjdC52YWx1ZXMuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNy5vYnNlcnZhYmxlLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczcucHJvbWlzZS5maW5hbGx5LmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczcucHJvbWlzZS50cnkuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNy5yZWZsZWN0LmRlZmluZS1tZXRhZGF0YS5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM3LnJlZmxlY3QuZGVsZXRlLW1ldGFkYXRhLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczcucmVmbGVjdC5nZXQtbWV0YWRhdGEta2V5cy5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM3LnJlZmxlY3QuZ2V0LW1ldGFkYXRhLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczcucmVmbGVjdC5nZXQtb3duLW1ldGFkYXRhLWtleXMuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNy5yZWZsZWN0LmdldC1vd24tbWV0YWRhdGEuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNy5yZWZsZWN0Lmhhcy1tZXRhZGF0YS5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM3LnJlZmxlY3QuaGFzLW93bi1tZXRhZGF0YS5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM3LnJlZmxlY3QubWV0YWRhdGEuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNy5zZXQuZnJvbS5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM3LnNldC5vZi5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM3LnNldC50by1qc29uLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczcuc3RyaW5nLmF0LmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczcuc3RyaW5nLm1hdGNoLWFsbC5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM3LnN0cmluZy5wYWQtZW5kLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczcuc3RyaW5nLnBhZC1zdGFydC5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM3LnN0cmluZy50cmltLWxlZnQuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNy5zdHJpbmcudHJpbS1yaWdodC5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM3LnN5bWJvbC5hc3luYy1pdGVyYXRvci5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM3LnN5bWJvbC5vYnNlcnZhYmxlLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczcuc3lzdGVtLmdsb2JhbC5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM3LndlYWstbWFwLmZyb20uanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNy53ZWFrLW1hcC5vZi5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM3LndlYWstc2V0LmZyb20uanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNy53ZWFrLXNldC5vZi5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvd2ViLmRvbS5pdGVyYWJsZS5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvd2ViLmltbWVkaWF0ZS5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvd2ViLnRpbWVycy5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL3NoaW0uanMiLCJub2RlX21vZHVsZXMvZGVzYW5kcm8tbWF0Y2hlcy1zZWxlY3Rvci9tYXRjaGVzLXNlbGVjdG9yLmpzIiwibm9kZV9tb2R1bGVzL2V2LWVtaXR0ZXIvZXYtZW1pdHRlci5qcyIsIm5vZGVfbW9kdWxlcy9maXp6eS11aS11dGlscy91dGlscy5qcyIsIm5vZGVfbW9kdWxlcy9nZXQtc2l6ZS9nZXQtc2l6ZS5qcyIsIm5vZGVfbW9kdWxlcy9nc2FwL1R3ZWVuTWF4LmpzIiwibm9kZV9tb2R1bGVzL2lzLWJ1ZmZlci9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9tYXNvbnJ5LWxheW91dC9tYXNvbnJ5LmpzIiwibm9kZV9tb2R1bGVzL291dGxheWVyL2l0ZW0uanMiLCJub2RlX21vZHVsZXMvb3V0bGF5ZXIvb3V0bGF5ZXIuanMiLCJub2RlX21vZHVsZXMvcHJvY2Vzcy9icm93c2VyLmpzIiwibm9kZV9tb2R1bGVzL3JlZ2VuZXJhdG9yLXJ1bnRpbWUvcnVudGltZS5qcyIsIm5vZGVfbW9kdWxlcy9zY3JvbGxtYWdpYy9zY3JvbGxtYWdpYy91bmNvbXByZXNzZWQvU2Nyb2xsTWFnaWMuanMiLCJub2RlX21vZHVsZXMvc2Nyb2xsbWFnaWMvc2Nyb2xsbWFnaWMvdW5jb21wcmVzc2VkL3BsdWdpbnMvYW5pbWF0aW9uLmdzYXAuanMiLCJub2RlX21vZHVsZXMvdGltZXJzLWJyb3dzZXJpZnkvbWFpbi5qcyIsIm5vZGVfbW9kdWxlcy91aWtpdC9kaXN0L2pzL3Vpa2l0LmpzIiwic3JjL2Jsb2NrLWtpdC9zY3JpcHRzL2Jsb2NrLWtpdC5qcyIsInNyYy9ibG9jay1raXQvc2NyaXB0cy9jb21wb25lbnRzL2NvbnRhY3QtZm9ybS12YWxpZGF0aW9uLmpzIiwic3JjL2Jsb2NrLWtpdC9zY3JpcHRzL2NvbXBvbmVudHMvZGlyZWN0aW9ucy1tYXAuanMiLCJzcmMvYmxvY2sta2l0L3NjcmlwdHMvY29tcG9uZW50cy9ldmVudC1ncmlkLmpzIiwic3JjL2Jsb2NrLWtpdC9zY3JpcHRzL2NvbXBvbmVudHMvZm9ybS12YWxpZGF0aW9uLmpzIiwic3JjL2Jsb2NrLWtpdC9zY3JpcHRzL2NvbXBvbmVudHMvZ29vZ2xlLW1hcC1zdHlsZXMuanMiLCJzcmMvYmxvY2sta2l0L3NjcmlwdHMvY29tcG9uZW50cy9nb29nbGUtbWFwLmpzIiwic3JjL2Jsb2NrLWtpdC9zY3JpcHRzL2NvbXBvbmVudHMvaGVhZGVyLmpzIiwic3JjL2Jsb2NrLWtpdC9zY3JpcHRzL2NvbXBvbmVudHMvaGVyby1jYXJvdXNlbC5qcyIsInNyYy9ibG9jay1raXQvc2NyaXB0cy9jb21wb25lbnRzL2hlcm8tc2Nyb2xsZXIuanMiLCJzcmMvYmxvY2sta2l0L3NjcmlwdHMvY29tcG9uZW50cy9oZXJvLXNsaWRlci5qcyIsInNyYy9ibG9jay1raXQvc2NyaXB0cy9jb21wb25lbnRzL2hlcm8tdmlkZW8uanMiLCJzcmMvYmxvY2sta2l0L3NjcmlwdHMvY29tcG9uZW50cy9tb3ZpZS1zbGlkZXIuanMiLCJzcmMvYmxvY2sta2l0L3NjcmlwdHMvY29tcG9uZW50cy9wbGF6YS1oZWFkZXIuanMiLCJzcmMvYmxvY2sta2l0L3NjcmlwdHMvY29tcG9uZW50cy9wcm9kdWN0LWNhcm91c2VsLmpzIiwic3JjL2Jsb2NrLWtpdC9zY3JpcHRzL2NvbXBvbmVudHMvcHJvZHVjdC1zbGlkZXIuanMiLCJzcmMvYmxvY2sta2l0L3NjcmlwdHMvY29tcG9uZW50cy9zZWFyY2gtbW9kYWwuanMiLCJzcmMvYmxvY2sta2l0L3NjcmlwdHMvY29tcG9uZW50cy90ZXh0LXNjcm9sbGVyLmpzIiwic3JjL2Jsb2NrLWtpdC9zY3JpcHRzL2ljb25zLmpzIiwic3JjL2Jsb2NrLWtpdC9zY3JpcHRzL3V0aWxzLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7QUNBQSxNQUFNLENBQUMsT0FBUCxHQUFpQixPQUFPLENBQUMsYUFBRCxDQUF4Qjs7OztBQ0FBOztBQUVBLElBQUksS0FBSyxHQUFHLE9BQU8sQ0FBQyxZQUFELENBQW5COztBQUNBLElBQUksTUFBTSxHQUFHLE9BQU8sQ0FBQyxrQkFBRCxDQUFwQjs7QUFDQSxJQUFJLFFBQVEsR0FBRyxPQUFPLENBQUMsdUJBQUQsQ0FBdEI7O0FBQ0EsSUFBSSxZQUFZLEdBQUcsT0FBTyxDQUFDLDJCQUFELENBQTFCOztBQUNBLElBQUksZUFBZSxHQUFHLE9BQU8sQ0FBQyw4QkFBRCxDQUE3Qjs7QUFDQSxJQUFJLFdBQVcsR0FBRyxPQUFPLENBQUMscUJBQUQsQ0FBekI7O0FBQ0EsSUFBSSxJQUFJLEdBQUksT0FBTyxNQUFQLEtBQWtCLFdBQWxCLElBQWlDLE1BQU0sQ0FBQyxJ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Qyx5Q0FBRCxDQUFQOztBQUNBLE9BQU8sQ0FBQyxnQ0FBRCxDQUFQOztBQUNBLE9BQU8sQ0FBQyxnQ0FBRCxDQUFQOztBQUNBLE9BQU8sQ0FBQyxvQ0FBRCxDQUFQOztBQUNBLE9BQU8sQ0FBQyw2QkFBRCxDQUFQOztBQUNBLE9BQU8sQ0FBQyx5QkFBRCxDQUFQOztBQUNBLE9BQU8sQ0FBQyx1Q0FBRCxDQUFQOztBQUNBLE9BQU8sQ0FBQyxnQ0FBRCxDQUFQOztBQUNBLE9BQU8sQ0FBQyw2QkFBRCxDQUFQOztBQUNBLE9BQU8sQ0FBQyw2QkFBRCxDQUFQOztBQUNBLE9BQU8sQ0FBQyxxQ0FBRCxDQUFQOztBQUNBLE9BQU8sQ0FBQyx5QkFBRCxDQUFQOztBQUNBLE9BQU8sQ0FBQywyQkFBRCxDQUFQOztBQUNBLE9BQU8sQ0FBQyxrQ0FBRCxDQUFQOztBQUNBLE9BQU8sQ0FBQywrQkFBRCxDQUFQOztBQUNBLE9BQU8sQ0FBQyxtQ0FBRCxDQUFQOztBQUNBLE9BQU8sQ0FBQyw4QkFBRCxDQUFQOztBQUNBLE9BQU8sQ0FBQyxnQ0FBRCxDQUFQOztBQUNBLE9BQU8sQ0FBQyxpQ0FBRCxDQUFQOztBQUNBLE9BQU8sQ0FBQyw2QkFBRCxDQUFQOztBQUNBLE9BQU8sQ0FBQyxzQ0FBRCxDQUFQOztBQUNBLE9BQU8sQ0FBQyx1Q0FBRCxDQUFQOztBQUNBLE9BQU8sQ0FBQyx1Q0FBRCxDQUFQOztBQUNBLE9BQU8sQ0FBQyxrQ0FBRCxDQUFQOztBQUNBLE9BQU8sQ0FBQyxnQ0FBRCxDQUFQOztBQUNBLE9BQU8sQ0FBQywwQkFBRCxDQUFQOztBQUNBLE9BQU8sQ0FBQywwQkFBRCxDQUFQOztBQUNBLE9BQU8sQ0FBQywwQkFBRCxDQUFQOztBQUNBLE9BQU8sQ0FBQyx5QkFBRCxDQUFQOztBQUNBLE9BQU8sQ0FBQywwQkFBRCxDQUFQOztBQUNBLE9BQU8sQ0FBQyx5QkFBRCxDQUFQOztBQUNBLE9BQU8sQ0FBQywwQkFBRCxDQUFQOztBQUNBLE9BQU8sQ0FBQywyQkFBRCxDQUFQOztBQUNBLE9BQU8sQ0FBQywwQkFBRCxDQUFQOztBQUNBLE9BQU8sQ0FBQyx5QkFBRCxDQUFQOztBQUNBLE9BQU8sQ0FBQywwQkFBRCxDQUFQOztBQUNBLE9BQU8sQ0FBQywwQkFBRCxDQUFQOztBQUNBLE9BQU8sQ0FBQyx5QkFBRCxDQUFQOztBQUNBLE9BQU8sQ0FBQyx5QkFBRCxDQUFQOztBQUNBLE9BQU8sQ0FBQyx5QkFBRCxDQUFQOztBQUNBLE9BQU8sQ0FBQyx5QkFBRCxDQUFQOztBQUNBLE9BQU8sQ0FBQywwQkFBRCxDQUFQOztBQUNBLE9BQU8sQ0FBQyxzQ0FBRCxDQUFQOztBQUNBLE9BQU8sQ0FBQywwQkFBRCxDQUFQOztBQUNBLE9BQU8sQ0FBQywyQkFBRCxDQUFQOztBQUNBLE9BQU8sQ0FBQywrQkFBRCxDQUFQOztBQUNBLE9BQU8sQ0FBQyxvQ0FBRCxDQUFQOztBQUNBLE9BQU8sQ0FBQyxnQ0FBRCxDQUFQOztBQUNBLE9BQU8sQ0FBQywrQkFBRCxDQUFQOztBQUNBLE9BQU8sQ0FBQyw2QkFBRCxDQUFQOztBQUNBLE9BQU8sQ0FBQyxrQ0FBRCxDQUFQOztBQUNBLE9BQU8sQ0FBQyw2QkFBRCxDQUFQOztBQUNBLE9BQU8sQ0FBQywwQkFBRCxDQUFQOztBQUNBLE9BQU8sQ0FBQyw0QkFBRCxDQUFQOztBQUNBLE9BQU8sQ0FBQywyQkFBRCxDQUFQOztBQUNBLE9BQU8sQ0FBQyw0QkFBRCxDQUFQOztBQUNBLE9BQU8sQ0FBQyxnQ0FBRCxDQUFQOztBQUNBLE9BQU8sQ0FBQywrQkFBRCxDQUFQOztBQUNBLE9BQU8sQ0FBQyw4QkFBRCxDQUFQOztBQUNBLE9BQU8sQ0FBQywyQkFBRCxDQUFQOztBQUNBLE9BQU8sQ0FBQyw0QkFBRCxDQUFQOztBQUNBLE9BQU8sQ0FBQyw2QkFBRCxDQUFQOztBQUNBLE9BQU8sQ0FBQywwQkFBRCxDQUFQOztBQUNBLE9BQU8sQ0FBQywwQkFBRCxDQUFQOztBQUNBLE9BQU8sQ0FBQyx3QkFBRCxDQUFQOztBQUNBLE9BQU8sQ0FBQyw0QkFBRCxDQUFQOztBQUNBLE9BQU8sQ0FBQyxrQ0FBRCxDQUFQOztBQUNBLE9BQU8sQ0FBQyw4QkFBRCxDQUFQOztBQUNBLE9BQU8sQ0FBQyxpQ0FBRCxDQUFQOztBQUNBLE9BQU8sQ0FBQyw4QkFBRCxDQUFQOztBQUNBLE9BQU8sQ0FBQywwQkFBRCxDQUFQOztBQUNBLE9BQU8sQ0FBQyx3QkFBRCxDQUFQOztBQUNBLE9BQU8sQ0FBQywwQkFBRCxDQUFQOztBQUNBLE9BQU8sQ0FBQywyQkFBRCxDQUFQOztBQUNBLE9BQU8sQ0FBQywwQkFBRCxDQUFQOztBQUNBLE9BQU8sQ0FBQyw4QkFBRCxDQUFQOztBQUNBLE9BQU8sQ0FBQyx5QkFBRCxDQUFQOztBQUNBLE9BQU8sQ0FBQyw0QkFBRCxDQUFQOztBQUNBLE9BQU8sQ0FBQywwQkFBRCxDQUFQOztBQUNBLE9BQU8sQ0FBQywyQkFBRCxDQUFQOztBQUNBLE9BQU8sQ0FBQyw0QkFBRCxDQUFQOztBQUNBLE9BQU8sQ0FBQyxrQ0FBRCxDQUFQOztBQUNBLE9BQU8sQ0FBQyw4QkFBRCxDQUFQOztBQUNBLE9BQU8sQ0FBQyxtQ0FBRCxDQUFQOztBQUNBLE9BQU8sQ0FBQyxpQ0FBRCxDQUFQOztBQUNBLE9BQU8sQ0FBQywwQkFBRCxDQUFQOztBQUNBLE9BQU8sQ0FBQywwQkFBRCxDQUFQOztBQUNBLE9BQU8sQ0FBQyxnQ0FBRCxDQUFQOztBQUNBLE9BQU8sQ0FBQyw2QkFBRCxDQUFQOztBQUNBLE9BQU8sQ0FBQyw4QkFBRCxDQUFQOztBQUNBLE9BQU8sQ0FBQyxrQ0FBRCxDQUFQOztBQUNBLE9BQU8sQ0FBQyxnQ0FBRCxDQUFQOztBQUNBLE9BQU8sQ0FBQyw0QkFBRCxDQUFQOztBQUNBLE9BQU8sQ0FBQyw0QkFBRCxDQUFQOztBQUNBLE9BQU8sQ0FBQyw4QkFBRCxDQUFQOztBQUNBLE9BQU8sQ0FBQyw2QkFBRCxDQUFQOztBQUNBLE9BQU8sQ0FBQyw0QkFBRCxDQUFQOztBQUNBLE9BQU8sQ0FBQyx1QkFBRCxDQUFQOztBQUNBLE9BQU8sQ0FBQyxtQkFBRCxDQUFQOztBQUNBLE9BQU8sQ0FBQyxtQkFBRCxDQUFQOztBQUNBLE9BQU8sQ0FBQyx3QkFBRCxDQUFQOztBQUNBLE9BQU8sQ0FBQyx3QkFBRCxDQUFQOztBQUNBLE9BQU8sQ0FBQyxrQ0FBRCxDQUFQOztBQUNBLE9BQU8sQ0FBQywrQkFBRCxDQUFQOztBQUNBLE9BQU8sQ0FBQyxnQ0FBRCxDQUFQOztBQUNBLE9BQU8sQ0FBQyxpQ0FBRCxDQUFQOztBQUNBLE9BQU8sQ0FBQyx5Q0FBRCxDQUFQOztBQUNBLE9BQU8sQ0FBQyxpQ0FBRCxDQUFQOztBQUNBLE9BQU8sQ0FBQyxrQ0FBRCxDQUFQOztBQUNBLE9BQU8sQ0FBQyxpQ0FBRCxDQUFQOztBQUNBLE9BQU8sQ0FBQyxrQ0FBRCxDQUFQOztBQUNBLE9BQU8sQ0FBQyxtQ0FBRCxDQUFQOztBQUNBLE9BQU8sQ0FBQyxtQ0FBRCxDQUFQOztBQUNBLE9BQU8sQ0FBQyw2QkFBRCxDQUFQOztBQUNBLE9BQU8sQ0FBQyxpQ0FBRCxDQUFQOztBQUNBLE9BQU8sQ0FBQyx1Q0FBRCxDQUFQOztBQUNBLE9BQU8sQ0FBQyx1Q0FBRCxDQUFQOztBQUNBLE9BQU8sQ0FBQyxpQ0FBRCxDQUFQOztBQUNBLE9BQU8sQ0FBQywyQkFBRCxDQUFQOztBQUNBLE9BQU8sQ0FBQyxtREFBRCxDQUFQOztBQUNBLE9BQU8sQ0FBQyx3Q0FBRCxDQUFQOztBQUNBLE9BQU8sQ0FBQywyQkFBRCxDQUFQOztBQUNBLE9BQU8sQ0FBQyxxQ0FBRCxDQUFQOztBQUNBLE9BQU8sQ0FBQyxnQ0FBRCxDQUFQOztBQUNBLE9BQU8sQ0FBQywwQ0FBRCxDQUFQOztBQUNBLE9BQU8sQ0FBQywyQkFBRCxDQUFQOztBQUNBLE9BQU8sQ0FBQyx3Q0FBRCxDQUFQOztBQUNBLE9BQU8sQ0FBQyw4QkFBRCxDQUFQOztBQUNBLE9BQU8sQ0FBQyw4QkFBRCxDQUFQOztBQUNBLE9BQU8sQ0FBQyw2QkFBRCxDQUFQOztBQUNBLE9BQU8sQ0FBQyx5QkFBRCxDQUFQOztBQUNBLE9BQU8sQ0FBQyxnQ0FBRCxDQUFQOztBQUNBLE9BQU8sQ0FBQyw4QkFBRCxDQUFQOztBQUNBLE9BQU8sQ0FBQyxnQ0FBRCxDQUFQOztBQUNBLE9BQU8sQ0FBQyxpQ0FBRCxDQUFQOztBQUNBLE9BQU8sQ0FBQyxnQ0FBRCxDQUFQOztBQUNBLE9BQU8sQ0FBQyxxQ0FBRCxDQUFQOztBQUNBLE9BQU8sQ0FBQyxpQ0FBRCxDQUFQOztBQUNBLE9BQU8sQ0FBQyxtREFBRCxDQUFQOztBQUNBLE9BQU8sQ0FBQyw2QkFBRCxDQUFQOztBQUNBLE9BQU8sQ0FBQyw4QkFBRCxDQUFQOztBQUNBLE9BQU8sQ0FBQyxvQ0FBRCxDQUFQOztBQUNBLE9BQU8sQ0FBQyxvQ0FBRCxDQUFQOztBQUNBLE9BQU8sQ0FBQyxvQ0FBRCxDQUFQOztBQUNBLE9BQU8sQ0FBQyxvQ0FBRCxDQUFQOztBQUNBLE9BQU8sQ0FBQywyQkFBRCxDQUFQOztBQUNBLE9BQU8sQ0FBQywyQkFBRCxDQUFQOztBQUNBLE9BQU8sQ0FBQyxzQkFBRCxDQUFQOztBQUNBLE9BQU8sQ0FBQyxzQkFBRCxDQUFQOztBQUNBLE9BQU8sQ0FBQywyQkFBRCxDQUFQOztBQUNBLE9BQU8sQ0FBQywyQkFBRCxDQUFQOztBQUNBLE9BQU8sQ0FBQyx3QkFBRCxDQUFQOztBQUNBLE9BQU8sQ0FBQyx3QkFBRCxDQUFQOztBQUNBLE9BQU8sQ0FBQyw2QkFBRCxDQUFQOztBQUNBLE9BQU8sQ0FBQyw2QkFBRCxDQUFQOztBQUNBLE9BQU8sQ0FBQyxzQkFBRCxDQUFQOztBQUNBLE9BQU8sQ0FBQyw2QkFBRCxDQUFQOztBQUNBLE9BQU8sQ0FBQyw4QkFBRCxDQUFQOztBQUNBLE9BQU8sQ0FBQywwQkFBRCxDQUFQOztBQUNBLE9BQU8sQ0FBQyxnQ0FBRCxDQUFQOztBQUNBLE9BQU8sQ0FBQyw0QkFBRCxDQUFQOztBQUNBLE9BQU8sQ0FBQywyQkFBRCxDQUFQOztBQUNBLE9BQU8sQ0FBQywwQkFBRCxDQUFQOztBQUNBLE9BQU8sQ0FBQywwQkFBRCxDQUFQOztBQUNBLE9BQU8sQ0FBQywwQkFBRCxDQUFQOztBQUNBLE9BQU8sQ0FBQyxnQ0FBRCxDQUFQOztBQUNBLE9BQU8sQ0FBQyw0QkFBRCxDQUFQOztBQUNB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LCJzb3VyY2VzQ29udGVudCI6WyIoZnVuY3Rpb24oKXtmdW5jdGlvbiByKGUsbix0KXtmdW5jdGlvbiBvKGksZil7aWYoIW5baV0pe2lmKCFlW2ldKXt2YXIgYz1cImZ1bmN0aW9uXCI9PXR5cGVvZiByZXF1aXJlJiZyZXF1aXJlO2lmKCFmJiZjKXJldHVybiBjKGksITApO2lmKHUpcmV0dXJuIHUoaSwhMCk7dmFyIGE9bmV3IEVycm9yKFwiQ2Fubm90IGZpbmQgbW9kdWxlICdcIitpK1wiJ1wiKTt0aHJvdyBhLmNvZGU9XCJNT0RVTEVfTk9UX0ZPVU5EXCIsYX12YXIgcD1uW2ldPXtleHBvcnRzOnt9fTtlW2ldWzBdLmNhbGwocC5leHBvcnRzLGZ1bmN0aW9uKHIpe3ZhciBuPWVbaV1bMV1bcl07cmV0dXJuIG8obnx8cil9LHAscC5leHBvcnRzLHIsZSxuLHQpfXJldHVybiBuW2ldLmV4cG9ydHN9Zm9yKHZhciB1PVwiZnVuY3Rpb25cIj09dHlwZW9mIHJlcXVpcmUmJnJlcXVpcmUsaT0wO2k8dC5sZW5ndGg7aSsrKW8odFtpXSk7cmV0dXJuIG99cmV0dXJuIHJ9KSgpIiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2xpYi9heGlvcycpOyIsIid1c2Ugc3RyaWN0JztcblxudmFyIHV0aWxzID0gcmVxdWlyZSgnLi8uLi91dGlscycpO1xudmFyIHNldHRsZSA9IHJlcXVpcmUoJy4vLi4vY29yZS9zZXR0bGUnKTtcbnZhciBidWlsZFVSTCA9IHJlcXVpcmUoJy4vLi4vaGVscGVycy9idWlsZFVSTCcpO1xudmFyIHBhcnNlSGVhZGVycyA9IHJlcXVpcmUoJy4vLi4vaGVscGVycy9wYXJzZUhlYWRlcnMnKTtcbnZhciBpc1VSTFNhbWVPcmlnaW4gPSByZXF1aXJlKCcuLy4uL2hlbHBlcnMvaXNVUkxTYW1lT3JpZ2luJyk7XG52YXIgY3JlYXRlRXJyb3IgPSByZXF1aXJlKCcuLi9jb3JlL2NyZWF0ZUVycm9yJyk7XG52YXIgYnRvYSA9ICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiB3aW5kb3cuYnRvYSAmJiB3aW5kb3cuYnRvYS5iaW5kKHdpbmRvdykpIHx8IHJlcXVpcmUoJy4vLi4vaGVscGVycy9idG9hJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24geGhyQWRhcHRlcihjb25maWcpIHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIGRpc3BhdGNoWGhyUmVxdWVzdChyZXNvbHZlLCByZWplY3QpIHtcbiAgICB2YXIgcmVxdWVzdERhdGEgPSBjb25maWcuZGF0YTtcbiAgICB2YXIgcmVxdWVzdEhlYWRlcnMgPSBjb25maWcuaGVhZGVycztcblxuICAgIGlmICh1dGlscy5pc0Zvcm1EYXRhKHJlcXVlc3REYXRhKSkge1xuICAgICAgZGVsZXRlIHJlcXVlc3RIZWFkZXJzWydDb250ZW50LVR5cGUnXTsgLy8gTGV0IHRoZSBicm93c2VyIHNldCBpdFxuICAgIH1cblxuICAgIHZhciByZXF1ZXN0ID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7XG4gICAgdmFyIGxvYWRFdmVudCA9ICdvbnJlYWR5c3RhdGVjaGFuZ2UnO1xuICAgIHZhciB4RG9tYWluID0gZmFsc2U7XG5cbiAgICAvLyBGb3IgSUUgOC85IENPUlMgc3VwcG9ydFxuICAgIC8vIE9ubHkgc3VwcG9ydHMgUE9TVCBhbmQgR0VUIGNhbGxzIGFuZCBkb2Vzbid0IHJldHVybnMgdGhlIHJlc3BvbnNlIGhlYWRlcnMuXG4gICAgLy8gRE9OJ1QgZG8gdGhpcyBmb3IgdGVzdGluZyBiL2MgWE1MSHR0cFJlcXVlc3QgaXMgbW9ja2VkLCBub3QgWERvbWFpblJlcXVlc3QuXG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAndGVzdCcgJiZcbiAgICAgICAgdHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgICAgICAgd2luZG93LlhEb21haW5SZXF1ZXN0ICYmICEoJ3dpdGhDcmVkZW50aWFscycgaW4gcmVxdWVzdCkgJiZcbiAgICAgICAgIWlzVVJMU2FtZU9yaWdpbihjb25maWcudXJsKSkge1xuICAgICAgcmVxdWVzdCA9IG5ldyB3aW5kb3cuWERvbWFpblJlcXVlc3QoKTtcbiAgICAgIGxvYWRFdmVudCA9ICdvbmxvYWQnO1xuICAgICAgeERvbWFpbiA9IHRydWU7XG4gICAgICByZXF1ZXN0Lm9ucHJvZ3Jlc3MgPSBmdW5jdGlvbiBoYW5kbGVQcm9ncmVzcygpIHt9O1xuICAgICAgcmVxdWVzdC5vbnRpbWVvdXQgPSBmdW5jdGlvbiBoYW5kbGVUaW1lb3V0KCkge307XG4gICAgfVxuXG4gICAgLy8gSFRUUCBiYXNpYyBhdXRoZW50aWNhdGlvblxuICAgIGlmIChjb25maWcuYXV0aCkge1xuICAgICAgdmFyIHVzZXJuYW1lID0gY29uZmlnLmF1dGgudXNlcm5hbWUgfHwgJyc7XG4gICAgICB2YXIgcGFzc3dvcmQgPSBjb25maWcuYXV0aC5wYXNzd29yZCB8fCAnJztcbiAgICAgIHJlcXVlc3RIZWFkZXJzLkF1dGhvcml6YXRpb24gPSAnQmFzaWMgJyArIGJ0b2EodXNlcm5hbWUgKyAnOicgKyBwYXNzd29yZCk7XG4gICAgfVxuXG4gICAgcmVxdWVzdC5vcGVuKGNvbmZpZy5tZXRob2QudG9VcHBlckNhc2UoKSwgYnVpbGRVUkwoY29uZmlnLnVybCwgY29uZmlnLnBhcmFtcywgY29uZmlnLnBhcmFtc1NlcmlhbGl6ZXIpLCB0cnVlKTtcblxuICAgIC8vIFNldCB0aGUgcmVxdWVzdCB0aW1lb3V0IGluIE1TXG4gICAgcmVxdWVzdC50aW1lb3V0ID0gY29uZmlnLnRpbWVvdXQ7XG5cbiAgICAvLyBMaXN0ZW4gZm9yIHJlYWR5IHN0YXRlXG4gICAgcmVxdWVzdFtsb2FkRXZlbnRdID0gZnVuY3Rpb24gaGFuZGxlTG9hZCgpIHtcbiAgICAgIGlmICghcmVxdWVzdCB8fCAocmVxdWVzdC5yZWFkeVN0YXRlICE9PSA0ICYmICF4RG9tYWluKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIFRoZSByZXF1ZXN0IGVycm9yZWQgb3V0IGFuZCB3ZSBkaWRuJ3QgZ2V0IGEgcmVzcG9uc2UsIHRoaXMgd2lsbCBiZVxuICAgICAgLy8gaGFuZGxlZCBieSBvbmVycm9yIGluc3RlYWRcbiAgICAgIC8vIFdpdGggb25lIGV4Y2VwdGlvbjogcmVxdWVzdCB0aGF0IHVzaW5nIGZpbGU6IHByb3RvY29sLCBtb3N0IGJyb3dzZXJzXG4gICAgICAvLyB3aWxsIHJldHVybiBzdGF0dXMgYXMgMCBldmVuIHRob3VnaCBpdCdzIGEgc3VjY2Vzc2Z1bCByZXF1ZXN0XG4gICAgICBpZiAocmVxdWVzdC5zdGF0dXMgPT09IDAgJiYgIShyZXF1ZXN0LnJlc3BvbnNlVVJMICYmIHJlcXVlc3QucmVzcG9uc2VVUkwuaW5kZXhPZignZmlsZTonKSA9PT0gMCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyBQcmVwYXJlIHRoZSByZXNwb25zZVxuICAgICAgdmFyIHJlc3BvbnNlSGVhZGVycyA9ICdnZXRBbGxSZXNwb25zZUhlYWRlcnMnIGluIHJlcXVlc3QgPyBwYXJzZUhlYWRlcnMocmVxdWVzdC5nZXRBbGxSZXNwb25zZUhlYWRlcnMoKSkgOiBudWxsO1xuICAgICAgdmFyIHJlc3BvbnNlRGF0YSA9ICFjb25maWcucmVzcG9uc2VUeXBlIHx8IGNvbmZpZy5yZXNwb25zZVR5cGUgPT09ICd0ZXh0JyA/IHJlcXVlc3QucmVzcG9uc2VUZXh0IDogcmVxdWVzdC5yZXNwb25zZTtcbiAgICAgIHZhciByZXNwb25zZSA9IHtcbiAgICAgICAgZGF0YTogcmVzcG9uc2VEYXRhLFxuICAgICAgICAvLyBJRSBzZW5kcyAxMjIzIGluc3RlYWQgb2YgMjA0IChodHRwczovL2dpdGh1Yi5jb20vYXhpb3MvYXhpb3MvaXNzdWVzLzIwMSlcbiAgICAgICAgc3RhdHVzOiByZXF1ZXN0LnN0YXR1cyA9PT0gMTIyMyA/IDIwNCA6IHJlcXVlc3Quc3RhdHVzLFxuICAgICAgICBzdGF0dXNUZXh0OiByZXF1ZXN0LnN0YXR1cyA9PT0gMTIyMyA/ICdObyBDb250ZW50JyA6IHJlcXVlc3Quc3RhdHVzVGV4dCxcbiAgICAgICAgaGVhZGVyczogcmVzcG9uc2VIZWFkZXJzLFxuICAgICAgICBjb25maWc6IGNvbmZpZyxcbiAgICAgICAgcmVxdWVzdDogcmVxdWVzdFxuICAgICAgfTtcblxuICAgICAgc2V0dGxlKHJlc29sdmUsIHJlamVjdCwgcmVzcG9uc2UpO1xuXG4gICAgICAvLyBDbGVhbiB1cCByZXF1ZXN0XG4gICAgICByZXF1ZXN0ID0gbnVsbDtcbiAgICB9O1xuXG4gICAgLy8gSGFuZGxlIGxvdyBsZXZlbCBuZXR3b3JrIGVycm9yc1xuICAgIHJlcXVlc3Qub25lcnJvciA9IGZ1bmN0aW9uIGhhbmRsZUVycm9yKCkge1xuICAgICAgLy8gUmVhbCBlcnJvcnMgYXJlIGhpZGRlbiBmcm9tIHVzIGJ5IHRoZSBicm93c2VyXG4gICAgICAvLyBvbmVycm9yIHNob3VsZCBvbmx5IGZpcmUgaWYgaXQncyBhIG5ldHdvcmsgZXJyb3JcbiAgICAgIHJlamVjdChjcmVhdGVFcnJvcignTmV0d29yayBFcnJvcicsIGNvbmZpZywgbnVsbCwgcmVxdWVzdCkpO1xuXG4gICAgICAvLyBDbGVhbiB1cCByZXF1ZXN0XG4gICAgICByZXF1ZXN0ID0gbnVsbDtcbiAgICB9O1xuXG4gICAgLy8gSGFuZGxlIHRpbWVvdXRcbiAgICByZXF1ZXN0Lm9udGltZW91dCA9IGZ1bmN0aW9uIGhhbmRsZVRpbWVvdXQoKSB7XG4gICAgICByZWplY3QoY3JlYXRlRXJyb3IoJ3RpbWVvdXQgb2YgJyArIGNvbmZpZy50aW1lb3V0ICsgJ21zIGV4Y2VlZGVkJywgY29uZmlnLCAnRUNPTk5BQk9SVEVEJyxcbiAgICAgICAgcmVxdWVzdCkpO1xuXG4gICAgICAvLyBDbGVhbiB1cCByZXF1ZXN0XG4gICAgICByZXF1ZXN0ID0gbnVsbDtcbiAgICB9O1xuXG4gICAgLy8gQWRkIHhzcmYgaGVhZGVyXG4gICAgLy8gVGhpcyBpcyBvbmx5IGRvbmUgaWYgcnVubmluZyBpbiBhIHN0YW5kYXJkIGJyb3dzZXIgZW52aXJvbm1lbnQuXG4gICAgLy8gU3BlY2lmaWNhbGx5IG5vdCBpZiB3ZSdyZSBpbiBhIHdlYiB3b3JrZXIsIG9yIHJlYWN0LW5hdGl2ZS5cbiAgICBpZiAodXRpbHMuaXNTdGFuZGFyZEJyb3dzZXJFbnYoKSkge1xuICAgICAgdmFyIGNvb2tpZXMgPSByZXF1aXJlKCcuLy4uL2hlbHBlcnMvY29va2llcycpO1xuXG4gICAgICAvLyBBZGQgeHNyZiBoZWFkZXJcbiAgICAgIHZhciB4c3JmVmFsdWUgPSAoY29uZmlnLndpdGhDcmVkZW50aWFscyB8fCBpc1VSTFNhbWVPcmlnaW4oY29uZmlnLnVybCkpICYmIGNvbmZpZy54c3JmQ29va2llTmFtZSA/XG4gICAgICAgICAgY29va2llcy5yZWFkKGNvbmZpZy54c3JmQ29va2llTmFtZSkgOlxuICAgICAgICAgIHVuZGVmaW5lZDtcblxuICAgICAgaWYgKHhzcmZWYWx1ZSkge1xuICAgICAgICByZXF1ZXN0SGVhZGVyc1tjb25maWcueHNyZkhlYWRlck5hbWVdID0geHNyZlZhbHVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEFkZCBoZWFkZXJzIHRvIHRoZSByZXF1ZXN0XG4gICAgaWYgKCdzZXRSZXF1ZXN0SGVhZGVyJyBpbiByZXF1ZXN0KSB7XG4gICAgICB1dGlscy5mb3JFYWNoKHJlcXVlc3RIZWFkZXJzLCBmdW5jdGlvbiBzZXRSZXF1ZXN0SGVhZGVyKHZhbCwga2V5KSB7XG4gICAgICAgIGlmICh0eXBlb2YgcmVxdWVzdERhdGEgPT09ICd1bmRlZmluZWQnICYmIGtleS50b0xvd2VyQ2FzZSgpID09PSAnY29udGVudC10eXBlJykge1xuICAgICAgICAgIC8vIFJlbW92ZSBDb250ZW50LVR5cGUgaWYgZGF0YSBpcyB1bmRlZmluZWRcbiAgICAgICAgICBkZWxldGUgcmVxdWVzdEhlYWRlcnNba2V5XTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBPdGhlcndpc2UgYWRkIGhlYWRlciB0byB0aGUgcmVxdWVzdFxuICAgICAgICAgIHJlcXVlc3Quc2V0UmVxdWVzdEhlYWRlcihrZXksIHZhbCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIEFkZCB3aXRoQ3JlZGVudGlhbHMgdG8gcmVxdWVzdCBpZiBuZWVkZWRcbiAgICBpZiAoY29uZmlnLndpdGhDcmVkZW50aWFscykge1xuICAgICAgcmVxdWVzdC53aXRoQ3JlZGVudGlhbHMgPSB0cnVlO1xuICAgIH1cblxuICAgIC8vIEFkZCByZXNwb25zZVR5cGUgdG8gcmVxdWVzdCBpZiBuZWVkZWRcbiAgICBpZiAoY29uZmlnLnJlc3BvbnNlVHlwZSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmVxdWVzdC5yZXNwb25zZVR5cGUgPSBjb25maWcucmVzcG9uc2VUeXBlO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAvLyBFeHBlY3RlZCBET01FeGNlcHRpb24gdGhyb3duIGJ5IGJyb3dzZXJzIG5vdCBjb21wYXRpYmxlIFhNTEh0dHBSZXF1ZXN0IExldmVsIDIuXG4gICAgICAgIC8vIEJ1dCwgdGhpcyBjYW4gYmUgc3VwcHJlc3NlZCBmb3IgJ2pzb24nIHR5cGUgYXMgaXQgY2FuIGJlIHBhcnNlZCBieSBkZWZhdWx0ICd0cmFuc2Zvcm1SZXNwb25zZScgZnVuY3Rpb24uXG4gICAgICAgIGlmIChjb25maWcucmVzcG9uc2VUeXBlICE9PSAnanNvbicpIHtcbiAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gSGFuZGxlIHByb2dyZXNzIGlmIG5lZWRlZFxuICAgIGlmICh0eXBlb2YgY29uZmlnLm9uRG93bmxvYWRQcm9ncmVzcyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcmVxdWVzdC5hZGRFdmVudExpc3RlbmVyKCdwcm9ncmVzcycsIGNvbmZpZy5vbkRvd25sb2FkUHJvZ3Jlc3MpO1xuICAgIH1cblxuICAgIC8vIE5vdCBhbGwgYnJvd3NlcnMgc3VwcG9ydCB1cGxvYWQgZXZlbnRzXG4gICAgaWYgKHR5cGVvZiBjb25maWcub25VcGxvYWRQcm9ncmVzcyA9PT0gJ2Z1bmN0aW9uJyAmJiByZXF1ZXN0LnVwbG9hZCkge1xuICAgICAgcmVxdWVzdC51cGxvYWQuYWRkRXZlbnRMaXN0ZW5lcigncHJvZ3Jlc3MnLCBjb25maWcub25VcGxvYWRQcm9ncmVzcyk7XG4gICAgfVxuXG4gICAgaWYgKGNvbmZpZy5jYW5jZWxUb2tlbikge1xuICAgICAgLy8gSGFuZGxlIGNhbmNlbGxhdGlvblxuICAgICAgY29uZmlnLmNhbmNlbFRva2VuLnByb21pc2UudGhlbihmdW5jdGlvbiBvbkNhbmNlbGVkKGNhbmNlbCkge1xuICAgICAgICBpZiAoIXJlcXVlc3QpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICByZXF1ZXN0LmFib3J0KCk7XG4gICAgICAgIHJlamVjdChjYW5jZWwpO1xuICAgICAgICAvLyBDbGVhbiB1cCByZXF1ZXN0XG4gICAgICAgIHJlcXVlc3QgPSBudWxsO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKHJlcXVlc3REYXRhID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJlcXVlc3REYXRhID0gbnVsbDtcbiAgICB9XG5cbiAgICAvLyBTZW5kIHRoZSByZXF1ZXN0XG4gICAgcmVxdWVzdC5zZW5kKHJlcXVlc3REYXRhKTtcbiAgfSk7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgdXRpbHMgPSByZXF1aXJlKCcuL3V0aWxzJyk7XG52YXIgYmluZCA9IHJlcXVpcmUoJy4vaGVscGVycy9iaW5kJyk7XG52YXIgQXhpb3MgPSByZXF1aXJlKCcuL2NvcmUvQXhpb3MnKTtcbnZhciBkZWZhdWx0cyA9IHJlcXVpcmUoJy4vZGVmYXVsdHMnKTtcblxuLyoqXG4gKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2YgQXhpb3NcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gZGVmYXVsdENvbmZpZyBUaGUgZGVmYXVsdCBjb25maWcgZm9yIHRoZSBpbnN0YW5jZVxuICogQHJldHVybiB7QXhpb3N9IEEgbmV3IGluc3RhbmNlIG9mIEF4aW9zXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZUluc3RhbmNlKGRlZmF1bHRDb25maWcpIHtcbiAgdmFyIGNvbnRleHQgPSBuZXcgQXhpb3MoZGVmYXVsdENvbmZpZyk7XG4gIHZhciBpbnN0YW5jZSA9IGJpbmQoQXhpb3MucHJvdG90eXBlLnJlcXVlc3QsIGNvbnRleHQpO1xuXG4gIC8vIENvcHkgYXhpb3MucHJvdG90eXBlIHRvIGluc3RhbmNlXG4gIHV0aWxzLmV4dGVuZChpbnN0YW5jZSwgQXhpb3MucHJvdG90eXBlLCBjb250ZXh0KTtcblxuICAvLyBDb3B5IGNvbnRleHQgdG8gaW5zdGFuY2VcbiAgdXRpbHMuZXh0ZW5kKGluc3RhbmNlLCBjb250ZXh0KTtcblxuICByZXR1cm4gaW5zdGFuY2U7XG59XG5cbi8vIENyZWF0ZSB0aGUgZGVmYXVsdCBpbnN0YW5jZSB0byBiZSBleHBvcnRlZFxudmFyIGF4aW9zID0gY3JlYXRlSW5zdGFuY2UoZGVmYXVsdHMpO1xuXG4vLyBFeHBvc2UgQXhpb3MgY2xhc3MgdG8gYWxsb3cgY2xhc3MgaW5oZXJpdGFuY2VcbmF4aW9zLkF4aW9zID0gQXhpb3M7XG5cbi8vIEZhY3RvcnkgZm9yIGNyZWF0aW5nIG5ldyBpbnN0YW5jZXNcbmF4aW9zLmNyZWF0ZSA9IGZ1bmN0aW9uIGNyZWF0ZShpbnN0YW5jZUNvbmZpZykge1xuICByZXR1cm4gY3JlYXRlSW5zdGFuY2UodXRpbHMubWVyZ2UoZGVmYXVsdHMsIGluc3RhbmNlQ29uZmlnKSk7XG59O1xuXG4vLyBFeHBvc2UgQ2FuY2VsICYgQ2FuY2VsVG9rZW5cbmF4aW9zLkNhbmNlbCA9IHJlcXVpcmUoJy4vY2FuY2VsL0NhbmNlbCcpO1xuYXhpb3MuQ2FuY2VsVG9rZW4gPSByZXF1aXJlKCcuL2NhbmNlbC9DYW5jZWxUb2tlbicpO1xuYXhpb3MuaXNDYW5jZWwgPSByZXF1aXJlKCcuL2NhbmNlbC9pc0NhbmNlbCcpO1xuXG4vLyBFeHBvc2UgYWxsL3NwcmVhZFxuYXhpb3MuYWxsID0gZnVuY3Rpb24gYWxsKHByb21pc2VzKSB7XG4gIHJldHVybiBQcm9taXNlLmFsbChwcm9taXNlcyk7XG59O1xuYXhpb3Muc3ByZWFkID0gcmVxdWlyZSgnLi9oZWxwZXJzL3NwcmVhZCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGF4aW9zO1xuXG4vLyBBbGxvdyB1c2Ugb2YgZGVmYXVsdCBpbXBvcnQgc3ludGF4IGluIFR5cGVTY3JpcHRcbm1vZHVsZS5leHBvcnRzLmRlZmF1bHQgPSBheGlvcztcbiIsIid1c2Ugc3RyaWN0JztcblxuLyoqXG4gKiBBIGBDYW5jZWxgIGlzIGFuIG9iamVjdCB0aGF0IGlzIHRocm93biB3aGVuIGFuIG9wZXJhdGlvbiBpcyBjYW5jZWxlZC5cbiAqXG4gKiBAY2xhc3NcbiAqIEBwYXJhbSB7c3RyaW5nPX0gbWVzc2FnZSBUaGUgbWVzc2FnZS5cbiAqL1xuZnVuY3Rpb24gQ2FuY2VsKG1lc3NhZ2UpIHtcbiAgdGhpcy5tZXNzYWdlID0gbWVzc2FnZTtcbn1cblxuQ2FuY2VsLnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uIHRvU3RyaW5nKCkge1xuICByZXR1cm4gJ0NhbmNlbCcgKyAodGhpcy5tZXNzYWdlID8gJzogJyArIHRoaXMubWVzc2FnZSA6ICcnKTtcbn07XG5cbkNhbmNlbC5wcm90b3R5cGUuX19DQU5DRUxfXyA9IHRydWU7XG5cbm1vZHVsZS5leHBvcnRzID0gQ2FuY2VsO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgQ2FuY2VsID0gcmVxdWlyZSgnLi9DYW5jZWwnKTtcblxuLyoqXG4gKiBBIGBDYW5jZWxUb2tlbmAgaXMgYW4gb2JqZWN0IHRoYXQgY2FuIGJlIHVzZWQgdG8gcmVxdWVzdCBjYW5jZWxsYXRpb24gb2YgYW4gb3BlcmF0aW9uLlxuICpcbiAqIEBjbGFzc1xuICogQHBhcmFtIHtGdW5jdGlvbn0gZXhlY3V0b3IgVGhlIGV4ZWN1dG9yIGZ1bmN0aW9uLlxuICovXG5mdW5jdGlvbiBDYW5jZWxUb2tlbihleGVjdXRvcikge1xuICBpZiAodHlwZW9mIGV4ZWN1dG9yICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignZXhlY3V0b3IgbXVzdCBiZSBhIGZ1bmN0aW9uLicpO1xuICB9XG5cbiAgdmFyIHJlc29sdmVQcm9taXNlO1xuICB0aGlzLnByb21pc2UgPSBuZXcgUHJvbWlzZShmdW5jdGlvbiBwcm9taXNlRXhlY3V0b3IocmVzb2x2ZSkge1xuICAgIHJlc29sdmVQcm9taXNlID0gcmVzb2x2ZTtcbiAgfSk7XG5cbiAgdmFyIHRva2VuID0gdGhpcztcbiAgZXhlY3V0b3IoZnVuY3Rpb24gY2FuY2VsKG1lc3NhZ2UpIHtcbiAgICBpZiAodG9rZW4ucmVhc29uKSB7XG4gICAgICAvLyBDYW5jZWxsYXRpb24gaGFzIGFscmVhZHkgYmVlbiByZXF1ZXN0ZWRcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0b2tlbi5yZWFzb24gPSBuZXcgQ2FuY2VsKG1lc3NhZ2UpO1xuICAgIHJlc29sdmVQcm9taXNlKHRva2VuLnJlYXNvbik7XG4gIH0pO1xufVxuXG4vKipcbiAqIFRocm93cyBhIGBDYW5jZWxgIGlmIGNhbmNlbGxhdGlvbiBoYXMgYmVlbiByZXF1ZXN0ZWQuXG4gKi9cbkNhbmNlbFRva2VuLnByb3RvdHlwZS50aHJvd0lmUmVxdWVzdGVkID0gZnVuY3Rpb24gdGhyb3dJZlJlcXVlc3RlZCgpIHtcbiAgaWYgKHRoaXMucmVhc29uKSB7XG4gICAgdGhyb3cgdGhpcy5yZWFzb247XG4gIH1cbn07XG5cbi8qKlxuICogUmV0dXJucyBhbiBvYmplY3QgdGhhdCBjb250YWlucyBhIG5ldyBgQ2FuY2VsVG9rZW5gIGFuZCBhIGZ1bmN0aW9uIHRoYXQsIHdoZW4gY2FsbGVkLFxuICogY2FuY2VscyB0aGUgYENhbmNlbFRva2VuYC5cbiAqL1xuQ2FuY2VsVG9rZW4uc291cmNlID0gZnVuY3Rpb24gc291cmNlKCkge1xuICB2YXIgY2FuY2VsO1xuICB2YXIgdG9rZW4gPSBuZXcgQ2FuY2VsVG9rZW4oZnVuY3Rpb24gZXhlY3V0b3IoYykge1xuICAgIGNhbmNlbCA9IGM7XG4gIH0pO1xuICByZXR1cm4ge1xuICAgIHRva2VuOiB0b2tlbixcbiAgICBjYW5jZWw6IGNhbmNlbFxuICB9O1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBDYW5jZWxUb2tlbjtcbiIsIid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBpc0NhbmNlbCh2YWx1ZSkge1xuICByZXR1cm4gISEodmFsdWUgJiYgdmFsdWUuX19DQU5DRUxfXyk7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgZGVmYXVsdHMgPSByZXF1aXJlKCcuLy4uL2RlZmF1bHRzJyk7XG52YXIgdXRpbHMgPSByZXF1aXJlKCcuLy4uL3V0aWxzJyk7XG52YXIgSW50ZXJjZXB0b3JNYW5hZ2VyID0gcmVxdWlyZSgnLi9JbnRlcmNlcHRvck1hbmFnZXInKTtcbnZhciBkaXNwYXRjaFJlcXVlc3QgPSByZXF1aXJlKCcuL2Rpc3BhdGNoUmVxdWVzdCcpO1xuXG4vKipcbiAqIENyZWF0ZSBhIG5ldyBpbnN0YW5jZSBvZiBBeGlvc1xuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBpbnN0YW5jZUNvbmZpZyBUaGUgZGVmYXVsdCBjb25maWcgZm9yIHRoZSBpbnN0YW5jZVxuICovXG5mdW5jdGlvbiBBeGlvcyhpbnN0YW5jZUNvbmZpZykge1xuICB0aGlzLmRlZmF1bHRzID0gaW5zdGFuY2VDb25maWc7XG4gIHRoaXMuaW50ZXJjZXB0b3JzID0ge1xuICAgIHJlcXVlc3Q6IG5ldyBJbnRlcmNlcHRvck1hbmFnZXIoKSxcbiAgICByZXNwb25zZTogbmV3IEludGVyY2VwdG9yTWFuYWdlcigpXG4gIH07XG59XG5cbi8qKlxuICogRGlzcGF0Y2ggYSByZXF1ZXN0XG4gKlxuICogQHBhcmFtIHtPYmplY3R9IGNvbmZpZyBUaGUgY29uZmlnIHNwZWNpZmljIGZvciB0aGlzIHJlcXVlc3QgKG1lcmdlZCB3aXRoIHRoaXMuZGVmYXVsdHMpXG4gKi9cbkF4aW9zLnByb3RvdHlwZS5yZXF1ZXN0ID0gZnVuY3Rpb24gcmVxdWVzdChjb25maWcpIHtcbiAgLyplc2xpbnQgbm8tcGFyYW0tcmVhc3NpZ246MCovXG4gIC8vIEFsbG93IGZvciBheGlvcygnZXhhbXBsZS91cmwnWywgY29uZmlnXSkgYSBsYSBmZXRjaCBBUElcbiAgaWYgKHR5cGVvZiBjb25maWcgPT09ICdzdHJpbmcnKSB7XG4gICAgY29uZmlnID0gdXRpbHMubWVyZ2Uoe1xuICAgICAgdXJsOiBhcmd1bWVudHNbMF1cbiAgICB9LCBhcmd1bWVudHNbMV0pO1xuICB9XG5cbiAgY29uZmlnID0gdXRpbHMubWVyZ2UoZGVmYXVsdHMsIHRoaXMuZGVmYXVsdHMsIHsgbWV0aG9kOiAnZ2V0JyB9LCBjb25maWcpO1xuICBjb25maWcubWV0aG9kID0gY29uZmlnLm1ldGhvZC50b0xvd2VyQ2FzZSgpO1xuXG4gIC8vIEhvb2sgdXAgaW50ZXJjZXB0b3JzIG1pZGRsZXdhcmVcbiAgdmFyIGNoYWluID0gW2Rpc3BhdGNoUmVxdWVzdCwgdW5kZWZpbmVkXTtcbiAgdmFyIHByb21pc2UgPSBQcm9taXNlLnJlc29sdmUoY29uZmlnKTtcblxuICB0aGlzLmludGVyY2VwdG9ycy5yZXF1ZXN0LmZvckVhY2goZnVuY3Rpb24gdW5zaGlmdFJlcXVlc3RJbnRlcmNlcHRvcnMoaW50ZXJjZXB0b3IpIHtcbiAgICBjaGFpbi51bnNoaWZ0KGludGVyY2VwdG9yLmZ1bGZpbGxlZCwgaW50ZXJjZXB0b3IucmVqZWN0ZWQpO1xuICB9KTtcblxuICB0aGlzLmludGVyY2VwdG9ycy5yZXNwb25zZS5mb3JFYWNoKGZ1bmN0aW9uIHB1c2hSZXNwb25zZUludGVyY2VwdG9ycyhpbnRlcmNlcHRvcikge1xuICAgIGNoYWluLnB1c2goaW50ZXJjZXB0b3IuZnVsZmlsbGVkLCBpbnRlcmNlcHRvci5yZWplY3RlZCk7XG4gIH0pO1xuXG4gIHdoaWxlIChjaGFpbi5sZW5ndGgpIHtcbiAgICBwcm9taXNlID0gcHJvbWlzZS50aGVuKGNoYWluLnNoaWZ0KCksIGNoYWluLnNoaWZ0KCkpO1xuICB9XG5cbiAgcmV0dXJuIHByb21pc2U7XG59O1xuXG4vLyBQcm92aWRlIGFsaWFzZXMgZm9yIHN1cHBvcnRlZCByZXF1ZXN0IG1ldGhvZHNcbnV0aWxzLmZvckVhY2goWydkZWxldGUnLCAnZ2V0JywgJ2hlYWQnLCAnb3B0aW9ucyddLCBmdW5jdGlvbiBmb3JFYWNoTWV0aG9kTm9EYXRhKG1ldGhvZCkge1xuICAvKmVzbGludCBmdW5jLW5hbWVzOjAqL1xuICBBeGlvcy5wcm90b3R5cGVbbWV0aG9kXSA9IGZ1bmN0aW9uKHVybCwgY29uZmlnKSB7XG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdCh1dGlscy5tZXJnZShjb25maWcgfHwge30sIHtcbiAgICAgIG1ldGhvZDogbWV0aG9kLFxuICAgICAgdXJsOiB1cmxcbiAgICB9KSk7XG4gIH07XG59KTtcblxudXRpbHMuZm9yRWFjaChbJ3Bvc3QnLCAncHV0JywgJ3BhdGNoJ10sIGZ1bmN0aW9uIGZvckVhY2hNZXRob2RXaXRoRGF0YShtZXRob2QpIHtcbiAgLyplc2xpbnQgZnVuYy1uYW1lczowKi9cbiAgQXhpb3MucHJvdG90eXBlW21ldGhvZF0gPSBmdW5jdGlvbih1cmwsIGRhdGEsIGNvbmZpZykge1xuICAgIHJldHVybiB0aGlzLnJlcXVlc3QodXRpbHMubWVyZ2UoY29uZmlnIHx8IHt9LCB7XG4gICAgICBtZXRob2Q6IG1ldGhvZCxcbiAgICAgIHVybDogdXJsLFxuICAgICAgZGF0YTogZGF0YVxuICAgIH0pKTtcbiAgfTtcbn0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IEF4aW9zO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgdXRpbHMgPSByZXF1aXJlKCcuLy4uL3V0aWxzJyk7XG5cbmZ1bmN0aW9uIEludGVyY2VwdG9yTWFuYWdlcigpIHtcbiAgdGhpcy5oYW5kbGVycyA9IFtdO1xufVxuXG4vKipcbiAqIEFkZCBhIG5ldyBpbnRlcmNlcHRvciB0byB0aGUgc3RhY2tcbiAqXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdWxmaWxsZWQgVGhlIGZ1bmN0aW9uIHRvIGhhbmRsZSBgdGhlbmAgZm9yIGEgYFByb21pc2VgXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSByZWplY3RlZCBUaGUgZnVuY3Rpb24gdG8gaGFuZGxlIGByZWplY3RgIGZvciBhIGBQcm9taXNlYFxuICpcbiAqIEByZXR1cm4ge051bWJlcn0gQW4gSUQgdXNlZCB0byByZW1vdmUgaW50ZXJjZXB0b3IgbGF0ZXJcbiAqL1xuSW50ZXJjZXB0b3JNYW5hZ2VyLnByb3RvdHlwZS51c2UgPSBmdW5jdGlvbiB1c2UoZnVsZmlsbGVkLCByZWplY3RlZCkge1xuICB0aGlzLmhhbmRsZXJzLnB1c2goe1xuICAgIGZ1bGZpbGxlZDogZnVsZmlsbGVkLFxuICAgIHJlamVjdGVkOiByZWplY3RlZFxuICB9KTtcbiAgcmV0dXJuIHRoaXMuaGFuZGxlcnMubGVuZ3RoIC0gMTtcbn07XG5cbi8qKlxuICogUmVtb3ZlIGFuIGludGVyY2VwdG9yIGZyb20gdGhlIHN0YWNrXG4gKlxuICogQHBhcmFtIHtOdW1iZXJ9IGlkIFRoZSBJRCB0aGF0IHdhcyByZXR1cm5lZCBieSBgdXNlYFxuICovXG5JbnRlcmNlcHRvck1hbmFnZXIucHJvdG90eXBlLmVqZWN0ID0gZnVuY3Rpb24gZWplY3QoaWQpIHtcbiAgaWYgKHRoaXMuaGFuZGxlcnNbaWRdKSB7XG4gICAgdGhpcy5oYW5kbGVyc1tpZF0gPSBudWxsO1xuICB9XG59O1xuXG4vKipcbiAqIEl0ZXJhdGUgb3ZlciBhbGwgdGhlIHJlZ2lzdGVyZWQgaW50ZXJjZXB0b3JzXG4gKlxuICogVGhpcyBtZXRob2QgaXMgcGFydGljdWxhcmx5IHVzZWZ1bCBmb3Igc2tpcHBpbmcgb3ZlciBhbnlcbiAqIGludGVyY2VwdG9ycyB0aGF0IG1heSBoYXZlIGJlY29tZSBgbnVsbGAgY2FsbGluZyBgZWplY3RgLlxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIFRoZSBmdW5jdGlvbiB0byBjYWxsIGZvciBlYWNoIGludGVyY2VwdG9yXG4gKi9cbkludGVyY2VwdG9yTWFuYWdlci5wcm90b3R5cGUuZm9yRWFjaCA9IGZ1bmN0aW9uIGZvckVhY2goZm4pIHtcbiAgdXRpbHMuZm9yRWFjaCh0aGlzLmhhbmRsZXJzLCBmdW5jdGlvbiBmb3JFYWNoSGFuZGxlcihoKSB7XG4gICAgaWYgKGggIT09IG51bGwpIHtcbiAgICAgIGZuKGgpO1xuICAgIH1cbiAgfSk7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IEludGVyY2VwdG9yTWFuYWdlcjtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIGVuaGFuY2VFcnJvciA9IHJlcXVpcmUoJy4vZW5oYW5jZUVycm9yJyk7XG5cbi8qKlxuICogQ3JlYXRlIGFuIEVycm9yIHdpdGggdGhlIHNwZWNpZmllZCBtZXNzYWdlLCBjb25maWcsIGVycm9yIGNvZGUsIHJlcXVlc3QgYW5kIHJlc3BvbnNlLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBtZXNzYWdlIFRoZSBlcnJvciBtZXNzYWdlLlxuICogQHBhcmFtIHtPYmplY3R9IGNvbmZpZyBUaGUgY29uZmlnLlxuICogQHBhcmFtIHtzdHJpbmd9IFtjb2RlXSBUaGUgZXJyb3IgY29kZSAoZm9yIGV4YW1wbGUsICdFQ09OTkFCT1JURUQnKS5cbiAqIEBwYXJhbSB7T2JqZWN0fSBbcmVxdWVzdF0gVGhlIHJlcXVlc3QuXG4gKiBAcGFyYW0ge09iamVjdH0gW3Jlc3BvbnNlXSBUaGUgcmVzcG9uc2UuXG4gKiBAcmV0dXJucyB7RXJyb3J9IFRoZSBjcmVhdGVkIGVycm9yLlxuICovXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGNyZWF0ZUVycm9yKG1lc3NhZ2UsIGNvbmZpZywgY29kZSwgcmVxdWVzdCwgcmVzcG9uc2UpIHtcbiAgdmFyIGVycm9yID0gbmV3IEVycm9yKG1lc3NhZ2UpO1xuICByZXR1cm4gZW5oYW5jZUVycm9yKGVycm9yLCBjb25maWcsIGNvZGUsIHJlcXVlc3QsIHJlc3BvbnNlKTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciB1dGlscyA9IHJlcXVpcmUoJy4vLi4vdXRpbHMnKTtcbnZhciB0cmFuc2Zvcm1EYXRhID0gcmVxdWlyZSgnLi90cmFuc2Zvcm1EYXRhJyk7XG52YXIgaXNDYW5jZWwgPSByZXF1aXJlKCcuLi9jYW5jZWwvaXNDYW5jZWwnKTtcbnZhciBkZWZhdWx0cyA9IHJlcXVpcmUoJy4uL2RlZmF1bHRzJyk7XG52YXIgaXNBYnNvbHV0ZVVSTCA9IHJlcXVpcmUoJy4vLi4vaGVscGVycy9pc0Fic29sdXRlVVJMJyk7XG52YXIgY29tYmluZVVSTHMgPSByZXF1aXJlKCcuLy4uL2hlbHBlcnMvY29tYmluZVVSTHMnKTtcblxuLyoqXG4gKiBUaHJvd3MgYSBgQ2FuY2VsYCBpZiBjYW5jZWxsYXRpb24gaGFzIGJlZW4gcmVxdWVzdGVkLlxuICovXG5mdW5jdGlvbiB0aHJvd0lmQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKGNvbmZpZykge1xuICBpZiAoY29uZmlnLmNhbmNlbFRva2VuKSB7XG4gICAgY29uZmlnLmNhbmNlbFRva2VuLnRocm93SWZSZXF1ZXN0ZWQoKTtcbiAgfVxufVxuXG4vKipcbiAqIERpc3BhdGNoIGEgcmVxdWVzdCB0byB0aGUgc2VydmVyIHVzaW5nIHRoZSBjb25maWd1cmVkIGFkYXB0ZXIuXG4gKlxuICogQHBhcmFtIHtvYmplY3R9IGNvbmZpZyBUaGUgY29uZmlnIHRoYXQgaXMgdG8gYmUgdXNlZCBmb3IgdGhlIHJlcXVlc3RcbiAqIEByZXR1cm5zIHtQcm9taXNlfSBUaGUgUHJvbWlzZSB0byBiZSBmdWxmaWxsZWRcbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBkaXNwYXRjaFJlcXVlc3QoY29uZmlnKSB7XG4gIHRocm93SWZDYW5jZWxsYXRpb25SZXF1ZXN0ZWQoY29uZmlnKTtcblxuICAvLyBTdXBwb3J0IGJhc2VVUkwgY29uZmlnXG4gIGlmIChjb25maWcuYmFzZVVSTCAmJiAhaXNBYnNvbHV0ZVVSTChjb25maWcudXJsKSkge1xuICAgIGNvbmZpZy51cmwgPSBjb21iaW5lVVJMcyhjb25maWcuYmFzZVVSTCwgY29uZmlnLnVybCk7XG4gIH1cblxuICAvLyBFbnN1cmUgaGVhZGVycyBleGlzdFxuICBjb25maWcuaGVhZGVycyA9IGNvbmZpZy5oZWFkZXJzIHx8IHt9O1xuXG4gIC8vIFRyYW5zZm9ybSByZXF1ZXN0IGRhdGFcbiAgY29uZmlnLmRhdGEgPSB0cmFuc2Zvcm1EYXRhKFxuICAgIGNvbmZpZy5kYXRhLFxuICAgIGNvbmZpZy5oZWFkZXJzLFxuICAgIGNvbmZpZy50cmFuc2Zvcm1SZXF1ZXN0XG4gICk7XG5cbiAgLy8gRmxhdHRlbiBoZWFkZXJzXG4gIGNvbmZpZy5oZWFkZXJzID0gdXRpbHMubWVyZ2UoXG4gICAgY29uZmlnLmhlYWRlcnMuY29tbW9uIHx8IHt9LFxuICAgIGNvbmZpZy5oZWFkZXJzW2NvbmZpZy5tZXRob2RdIHx8IHt9LFxuICAgIGNvbmZpZy5oZWFkZXJzIHx8IHt9XG4gICk7XG5cbiAgdXRpbHMuZm9yRWFjaChcbiAgICBbJ2RlbGV0ZScsICdnZXQnLCAnaGVhZCcsICdwb3N0JywgJ3B1dCcsICdwYXRjaCcsICdjb21tb24nXSxcbiAgICBmdW5jdGlvbiBjbGVhbkhlYWRlckNvbmZpZyhtZXRob2QpIHtcbiAgICAgIGRlbGV0ZSBjb25maWcuaGVhZGVyc1ttZXRob2RdO1xuICAgIH1cbiAgKTtcblxuICB2YXIgYWRhcHRlciA9IGNvbmZpZy5hZGFwdGVyIHx8IGRlZmF1bHRzLmFkYXB0ZXI7XG5cbiAgcmV0dXJuIGFkYXB0ZXIoY29uZmlnKS50aGVuKGZ1bmN0aW9uIG9uQWRhcHRlclJlc29sdXRpb24ocmVzcG9uc2UpIHtcbiAgICB0aHJvd0lmQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKGNvbmZpZyk7XG5cbiAgICAvLyBUcmFuc2Zvcm0gcmVzcG9uc2UgZGF0YVxuICAgIHJlc3BvbnNlLmRhdGEgPSB0cmFuc2Zvcm1EYXRhKFxuICAgICAgcmVzcG9uc2UuZGF0YSxcbiAgICAgIHJlc3BvbnNlLmhlYWRlcnMsXG4gICAgICBjb25maWcudHJhbnNmb3JtUmVzcG9uc2VcbiAgICApO1xuXG4gICAgcmV0dXJuIHJlc3BvbnNlO1xuICB9LCBmdW5jdGlvbiBvbkFkYXB0ZXJSZWplY3Rpb24ocmVhc29uKSB7XG4gICAgaWYgKCFpc0NhbmNlbChyZWFzb24pKSB7XG4gICAgICB0aHJvd0lmQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKGNvbmZpZyk7XG5cbiAgICAgIC8vIFRyYW5zZm9ybSByZXNwb25zZSBkYXRhXG4gICAgICBpZiAocmVhc29uICYmIHJlYXNvbi5yZXNwb25zZSkge1xuICAgICAgICByZWFzb24ucmVzcG9uc2UuZGF0YSA9IHRyYW5zZm9ybURhdGEoXG4gICAgICAgICAgcmVhc29uLnJlc3BvbnNlLmRhdGEsXG4gICAgICAgICAgcmVhc29uLnJlc3BvbnNlLmhlYWRlcnMsXG4gICAgICAgICAgY29uZmlnLnRyYW5zZm9ybVJlc3BvbnNlXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIFByb21pc2UucmVqZWN0KHJlYXNvbik7XG4gIH0pO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcblxuLyoqXG4gKiBVcGRhdGUgYW4gRXJyb3Igd2l0aCB0aGUgc3BlY2lmaWVkIGNvbmZpZywgZXJyb3IgY29kZSwgYW5kIHJlc3BvbnNlLlxuICpcbiAqIEBwYXJhbSB7RXJyb3J9IGVycm9yIFRoZSBlcnJvciB0byB1cGRhdGUuXG4gKiBAcGFyYW0ge09iamVjdH0gY29uZmlnIFRoZSBjb25maWcuXG4gKiBAcGFyYW0ge3N0cmluZ30gW2NvZGVdIFRoZSBlcnJvciBjb2RlIChmb3IgZXhhbXBsZSwgJ0VDT05OQUJPUlRFRCcpLlxuICogQHBhcmFtIHtPYmplY3R9IFtyZXF1ZXN0XSBUaGUgcmVxdWVzdC5cbiAqIEBwYXJhbSB7T2JqZWN0fSBbcmVzcG9uc2VdIFRoZSByZXNwb25zZS5cbiAqIEByZXR1cm5zIHtFcnJvcn0gVGhlIGVycm9yLlxuICovXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGVuaGFuY2VFcnJvcihlcnJvciwgY29uZmlnLCBjb2RlLCByZXF1ZXN0LCByZXNwb25zZSkge1xuICBlcnJvci5jb25maWcgPSBjb25maWc7XG4gIGlmIChjb2RlKSB7XG4gICAgZXJyb3IuY29kZSA9IGNvZGU7XG4gIH1cbiAgZXJyb3IucmVxdWVzdCA9IHJlcXVlc3Q7XG4gIGVycm9yLnJlc3BvbnNlID0gcmVzcG9uc2U7XG4gIHJldHVybiBlcnJvcjtcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBjcmVhdGVFcnJvciA9IHJlcXVpcmUoJy4vY3JlYXRlRXJyb3InKTtcblxuLyoqXG4gKiBSZXNvbHZlIG9yIHJlamVjdCBhIFByb21pc2UgYmFzZWQgb24gcmVzcG9uc2Ugc3RhdHVzLlxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb259IHJlc29sdmUgQSBmdW5jdGlvbiB0aGF0IHJlc29sdmVzIHRoZSBwcm9taXNlLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gcmVqZWN0IEEgZnVuY3Rpb24gdGhhdCByZWplY3RzIHRoZSBwcm9taXNlLlxuICogQHBhcmFtIHtvYmplY3R9IHJlc3BvbnNlIFRoZSByZXNwb25zZS5cbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBzZXR0bGUocmVzb2x2ZSwgcmVqZWN0LCByZXNwb25zZSkge1xuICB2YXIgdmFsaWRhdGVTdGF0dXMgPSByZXNwb25zZS5jb25maWcudmFsaWRhdGVTdGF0dXM7XG4gIC8vIE5vdGU6IHN0YXR1cyBpcyBub3QgZXhwb3NlZCBieSBYRG9tYWluUmVxdWVzdFxuICBpZiAoIXJlc3BvbnNlLnN0YXR1cyB8fCAhdmFsaWRhdGVTdGF0dXMgfHwgdmFsaWRhdGVTdGF0dXMocmVzcG9uc2Uuc3RhdHVzKSkge1xuICAgIHJlc29sdmUocmVzcG9uc2UpO1xuICB9IGVsc2Uge1xuICAgIHJlamVjdChjcmVhdGVFcnJvcihcbiAgICAgICdSZXF1ZXN0IGZhaWxlZCB3aXRoIHN0YXR1cyBjb2RlICcgKyByZXNwb25zZS5zdGF0dXMsXG4gICAgICByZXNwb25zZS5jb25maWcsXG4gICAgICBudWxsLFxuICAgICAgcmVzcG9uc2UucmVxdWVzdCxcbiAgICAgIHJlc3BvbnNlXG4gICAgKSk7XG4gIH1cbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciB1dGlscyA9IHJlcXVpcmUoJy4vLi4vdXRpbHMnKTtcblxuLyoqXG4gKiBUcmFuc2Zvcm0gdGhlIGRhdGEgZm9yIGEgcmVxdWVzdCBvciBhIHJlc3BvbnNlXG4gKlxuICogQHBhcmFtIHtPYmplY3R8U3RyaW5nfSBkYXRhIFRoZSBkYXRhIHRvIGJlIHRyYW5zZm9ybWVkXG4gKiBAcGFyYW0ge0FycmF5fSBoZWFkZXJzIFRoZSBoZWFkZXJzIGZvciB0aGUgcmVxdWVzdCBvciByZXNwb25zZVxuICogQHBhcmFtIHtBcnJheXxGdW5jdGlvbn0gZm5zIEEgc2luZ2xlIGZ1bmN0aW9uIG9yIEFycmF5IG9mIGZ1bmN0aW9uc1xuICogQHJldHVybnMgeyp9IFRoZSByZXN1bHRpbmcgdHJhbnNmb3JtZWQgZGF0YVxuICovXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIHRyYW5zZm9ybURhdGEoZGF0YSwgaGVhZGVycywgZm5zKSB7XG4gIC8qZXNsaW50IG5vLXBhcmFtLXJlYXNzaWduOjAqL1xuICB1dGlscy5mb3JFYWNoKGZucywgZnVuY3Rpb24gdHJhbnNmb3JtKGZuKSB7XG4gICAgZGF0YSA9IGZuKGRhdGEsIGhlYWRlcnMpO1xuICB9KTtcblxuICByZXR1cm4gZGF0YTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciB1dGlscyA9IHJlcXVpcmUoJy4vdXRpbHMnKTtcbnZhciBub3JtYWxpemVIZWFkZXJOYW1lID0gcmVxdWlyZSgnLi9oZWxwZXJzL25vcm1hbGl6ZUhlYWRlck5hbWUnKTtcblxudmFyIERFRkFVTFRfQ09OVEVOVF9UWVBFID0ge1xuICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCdcbn07XG5cbmZ1bmN0aW9uIHNldENvbnRlbnRUeXBlSWZVbnNldChoZWFkZXJzLCB2YWx1ZSkge1xuICBpZiAoIXV0aWxzLmlzVW5kZWZpbmVkKGhlYWRlcnMpICYmIHV0aWxzLmlzVW5kZWZpbmVkKGhlYWRlcnNbJ0NvbnRlbnQtVHlwZSddKSkge1xuICAgIGhlYWRlcnNbJ0NvbnRlbnQtVHlwZSddID0gdmFsdWU7XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0RGVmYXVsdEFkYXB0ZXIoKSB7XG4gIHZhciBhZGFwdGVyO1xuICBpZiAodHlwZW9mIFhNTEh0dHBSZXF1ZXN0ICE9PSAndW5kZWZpbmVkJykge1xuICAgIC8vIEZvciBicm93c2VycyB1c2UgWEhSIGFkYXB0ZXJcbiAgICBhZGFwdGVyID0gcmVxdWlyZSgnLi9hZGFwdGVycy94aHInKTtcbiAgfSBlbHNlIGlmICh0eXBlb2YgcHJvY2VzcyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAvLyBGb3Igbm9kZSB1c2UgSFRUUCBhZGFwdGVyXG4gICAgYWRhcHRlciA9IHJlcXVpcmUoJy4vYWRhcHRlcnMvaHR0cCcpO1xuICB9XG4gIHJldHVybiBhZGFwdGVyO1xufVxuXG52YXIgZGVmYXVsdHMgPSB7XG4gIGFkYXB0ZXI6IGdldERlZmF1bHRBZGFwdGVyKCksXG5cbiAgdHJhbnNmb3JtUmVxdWVzdDogW2Z1bmN0aW9uIHRyYW5zZm9ybVJlcXVlc3QoZGF0YSwgaGVhZGVycykge1xuICAgIG5vcm1hbGl6ZUhlYWRlck5hbWUoaGVhZGVycywgJ0NvbnRlbnQtVHlwZScpO1xuICAgIGlmICh1dGlscy5pc0Zvcm1EYXRhKGRhdGEpIHx8XG4gICAgICB1dGlscy5pc0FycmF5QnVmZmVyKGRhdGEpIHx8XG4gICAgICB1dGlscy5pc0J1ZmZlcihkYXRhKSB8fFxuICAgICAgdXRpbHMuaXNTdHJlYW0oZGF0YSkgfHxcbiAgICAgIHV0aWxzLmlzRmlsZShkYXRhKSB8fFxuICAgICAgdXRpbHMuaXNCbG9iKGRhdGEpXG4gICAgKSB7XG4gICAgICByZXR1cm4gZGF0YTtcbiAgICB9XG4gICAgaWYgKHV0aWxzLmlzQXJyYXlCdWZmZXJWaWV3KGRhdGEpKSB7XG4gICAgICByZXR1cm4gZGF0YS5idWZmZXI7XG4gICAgfVxuICAgIGlmICh1dGlscy5pc1VSTFNlYXJjaFBhcmFtcyhkYXRhKSkge1xuICAgICAgc2V0Q29udGVudFR5cGVJZlVuc2V0KGhlYWRlcnMsICdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQ7Y2hhcnNldD11dGYtOCcpO1xuICAgICAgcmV0dXJuIGRhdGEudG9TdHJpbmcoKTtcbiAgICB9XG4gICAgaWYgKHV0aWxzLmlzT2JqZWN0KGRhdGEpKSB7XG4gICAgICBzZXRDb250ZW50VHlwZUlmVW5zZXQoaGVhZGVycywgJ2FwcGxpY2F0aW9uL2pzb247Y2hhcnNldD11dGYtOCcpO1xuICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KGRhdGEpO1xuICAgIH1cbiAgICByZXR1cm4gZGF0YTtcbiAgfV0sXG5cbiAgdHJhbnNmb3JtUmVzcG9uc2U6IFtmdW5jdGlvbiB0cmFuc2Zvcm1SZXNwb25zZShkYXRhKSB7XG4gICAgLyplc2xpbnQgbm8tcGFyYW0tcmVhc3NpZ246MCovXG4gICAgaWYgKHR5cGVvZiBkYXRhID09PSAnc3RyaW5nJykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgZGF0YSA9IEpTT04ucGFyc2UoZGF0YSk7XG4gICAgICB9IGNhdGNoIChlKSB7IC8qIElnbm9yZSAqLyB9XG4gICAgfVxuICAgIHJldHVybiBkYXRhO1xuICB9XSxcblxuICB0aW1lb3V0OiAwLFxuXG4gIHhzcmZDb29raWVOYW1lOiAnWFNSRi1UT0tFTicsXG4gIHhzcmZIZWFkZXJOYW1lOiAnWC1YU1JGLVRPS0VOJyxcblxuICBtYXhDb250ZW50TGVuZ3RoOiAtMSxcblxuICB2YWxpZGF0ZVN0YXR1czogZnVuY3Rpb24gdmFsaWRhdGVTdGF0dXMoc3RhdHVzKSB7XG4gICAgcmV0dXJuIHN0YXR1cyA+PSAyMDAgJiYgc3RhdHVzIDwgMzAwO1xuICB9XG59O1xuXG5kZWZhdWx0cy5oZWFkZXJzID0ge1xuICBjb21tb246IHtcbiAgICAnQWNjZXB0JzogJ2FwcGxpY2F0aW9uL2pzb24sIHRleHQvcGxhaW4sICovKidcbiAgfVxufTtcblxudXRpbHMuZm9yRWFjaChbJ2RlbGV0ZScsICdnZXQnLCAnaGVhZCddLCBmdW5jdGlvbiBmb3JFYWNoTWV0aG9kTm9EYXRhKG1ldGhvZCkge1xuICBkZWZhdWx0cy5oZWFkZXJzW21ldGhvZF0gPSB7fTtcbn0pO1xuXG51dGlscy5mb3JFYWNoKFsncG9zdCcsICdwdXQnLCAncGF0Y2gnXSwgZnVuY3Rpb24gZm9yRWFjaE1ldGhvZFdpdGhEYXRhKG1ldGhvZCkge1xuICBkZWZhdWx0cy5oZWFkZXJzW21ldGhvZF0gPSB1dGlscy5tZXJnZShERUZBVUxUX0NPTlRFTlRfVFlQRSk7XG59KTtcblxubW9kdWxlLmV4cG9ydHMgPSBkZWZhdWx0cztcbiIsIid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBiaW5kKGZuLCB0aGlzQXJnKSB7XG4gIHJldHVybiBmdW5jdGlvbiB3cmFwKCkge1xuICAgIHZhciBhcmdzID0gbmV3IEFycmF5KGFyZ3VtZW50cy5sZW5ndGgpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJncy5sZW5ndGg7IGkrKykge1xuICAgICAgYXJnc1tpXSA9IGFyZ3VtZW50c1tpXTtcbiAgICB9XG4gICAgcmV0dXJuIGZuLmFwcGx5KHRoaXNBcmcsIGFyZ3MpO1xuICB9O1xufTtcbiIsIid1c2Ugc3RyaWN0JztcblxuLy8gYnRvYSBwb2x5ZmlsbCBmb3IgSUU8MTAgY291cnRlc3kgaHR0cHM6Ly9naXRodWIuY29tL2RhdmlkY2hhbWJlcnMvQmFzZTY0LmpzXG5cbnZhciBjaGFycyA9ICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSc7XG5cbmZ1bmN0aW9uIEUoKSB7XG4gIHRoaXMubWVzc2FnZSA9ICdTdHJpbmcgY29udGFpbnMgYW4gaW52YWxpZCBjaGFyYWN0ZXInO1xufVxuRS5wcm90b3R5cGUgPSBuZXcgRXJyb3I7XG5FLnByb3RvdHlwZS5jb2RlID0gNTtcbkUucHJvdG90eXBlLm5hbWUgPSAnSW52YWxpZENoYXJhY3RlckVycm9yJztcblxuZnVuY3Rpb24gYnRvYShpbnB1dCkge1xuICB2YXIgc3RyID0gU3RyaW5nKGlucHV0KTtcbiAgdmFyIG91dHB1dCA9ICcnO1xuICBmb3IgKFxuICAgIC8vIGluaXRpYWxpemUgcmVzdWx0IGFuZCBjb3VudGVyXG4gICAgdmFyIGJsb2NrLCBjaGFyQ29kZSwgaWR4ID0gMCwgbWFwID0gY2hhcnM7XG4gICAgLy8gaWYgdGhlIG5leHQgc3RyIGluZGV4IGRvZXMgbm90IGV4aXN0OlxuICAgIC8vICAgY2hhbmdlIHRoZSBtYXBwaW5nIHRhYmxlIHRvIFwiPVwiXG4gICAgLy8gICBjaGVjayBpZiBkIGhhcyBubyBmcmFjdGlvbmFsIGRpZ2l0c1xuICAgIHN0ci5jaGFyQXQoaWR4IHwgMCkgfHwgKG1hcCA9ICc9JywgaWR4ICUgMSk7XG4gICAgLy8gXCI4IC0gaWR4ICUgMSAqIDhcIiBnZW5lcmF0ZXMgdGhlIHNlcXVlbmNlIDIsIDQsIDYsIDhcbiAgICBvdXRwdXQgKz0gbWFwLmNoYXJBdCg2MyAmIGJsb2NrID4+IDggLSBpZHggJSAxICogOClcbiAgKSB7XG4gICAgY2hhckNvZGUgPSBzdHIuY2hhckNvZGVBdChpZHggKz0gMyAvIDQpO1xuICAgIGlmIChjaGFyQ29kZSA+IDB4RkYpIHtcbiAgICAgIHRocm93IG5ldyBFKCk7XG4gICAgfVxuICAgIGJsb2NrID0gYmxvY2sgPDwgOCB8IGNoYXJDb2RlO1xuICB9XG4gIHJldHVybiBvdXRwdXQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYnRvYTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIHV0aWxzID0gcmVxdWlyZSgnLi8uLi91dGlscycpO1xuXG5mdW5jdGlvbiBlbmNvZGUodmFsKSB7XG4gIHJldHVybiBlbmNvZGVVUklDb21wb25lbnQodmFsKS5cbiAgICByZXBsYWNlKC8lNDAvZ2ksICdAJykuXG4gICAgcmVwbGFjZSgvJTNBL2dpLCAnOicpLlxuICAgIHJlcGxhY2UoLyUyNC9nLCAnJCcpLlxuICAgIHJlcGxhY2UoLyUyQy9naSwgJywnKS5cbiAgICByZXBsYWNlKC8lMjAvZywgJysnKS5cbiAgICByZXBsYWNlKC8lNUIvZ2ksICdbJykuXG4gICAgcmVwbGFjZSgvJTVEL2dpLCAnXScpO1xufVxuXG4vKipcbiAqIEJ1aWxkIGEgVVJMIGJ5IGFwcGVuZGluZyBwYXJhbXMgdG8gdGhlIGVuZFxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSB1cmwgVGhlIGJhc2Ugb2YgdGhlIHVybCAoZS5nLiwgaHR0cDovL3d3dy5nb29nbGUuY29tKVxuICogQHBhcmFtIHtvYmplY3R9IFtwYXJhbXNdIFRoZSBwYXJhbXMgdG8gYmUgYXBwZW5kZWRcbiAqIEByZXR1cm5zIHtzdHJpbmd9IFRoZSBmb3JtYXR0ZWQgdXJsXG4gKi9cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gYnVpbGRVUkwodXJsLCBwYXJhbXMsIHBhcmFtc1NlcmlhbGl6ZXIpIHtcbiAgLyplc2xpbnQgbm8tcGFyYW0tcmVhc3NpZ246MCovXG4gIGlmICghcGFyYW1zKSB7XG4gICAgcmV0dXJuIHVybDtcbiAgfVxuXG4gIHZhciBzZXJpYWxpemVkUGFyYW1zO1xuICBpZiAocGFyYW1zU2VyaWFsaXplcikge1xuICAgIHNlcmlhbGl6ZWRQYXJhbXMgPSBwYXJhbXNTZXJpYWxpemVyKHBhcmFtcyk7XG4gIH0gZWxzZSBpZiAodXRpbHMuaXNVUkxTZWFyY2hQYXJhbXMocGFyYW1zKSkge1xuICAgIHNlcmlhbGl6ZWRQYXJhbXMgPSBwYXJhbXMudG9TdHJpbmcoKTtcbiAgfSBlbHNlIHtcbiAgICB2YXIgcGFydHMgPSBbXTtcblxuICAgIHV0aWxzLmZvckVhY2gocGFyYW1zLCBmdW5jdGlvbiBzZXJpYWxpemUodmFsLCBrZXkpIHtcbiAgICAgIGlmICh2YWwgPT09IG51bGwgfHwgdHlwZW9mIHZhbCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAodXRpbHMuaXNBcnJheSh2YWwpKSB7XG4gICAgICAgIGtleSA9IGtleSArICdbXSc7XG4gICAgICB9XG5cbiAgICAgIGlmICghdXRpbHMuaXNBcnJheSh2YWwpKSB7XG4gICAgICAgIHZhbCA9IFt2YWxdO1xuICAgICAgfVxuXG4gICAgICB1dGlscy5mb3JFYWNoKHZhbCwgZnVuY3Rpb24gcGFyc2VWYWx1ZSh2KSB7XG4gICAgICAgIGlmICh1dGlscy5pc0RhdGUodikpIHtcbiAgICAgICAgICB2ID0gdi50b0lTT1N0cmluZygpO1xuICAgICAgICB9IGVsc2UgaWYgKHV0aWxzLmlzT2JqZWN0KHYpKSB7XG4gICAgICAgICAgdiA9IEpTT04uc3RyaW5naWZ5KHYpO1xuICAgICAgICB9XG4gICAgICAgIHBhcnRzLnB1c2goZW5jb2RlKGtleSkgKyAnPScgKyBlbmNvZGUodikpO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBzZXJpYWxpemVkUGFyYW1zID0gcGFydHMuam9pbignJicpO1xuICB9XG5cbiAgaWYgKHNlcmlhbGl6ZWRQYXJhbXMpIHtcbiAgICB1cmwgKz0gKHVybC5pbmRleE9mKCc/JykgPT09IC0xID8gJz8nIDogJyYnKSArIHNlcmlhbGl6ZWRQYXJhbXM7XG4gIH1cblxuICByZXR1cm4gdXJsO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcblxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IFVSTCBieSBjb21iaW5pbmcgdGhlIHNwZWNpZmllZCBVUkxzXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGJhc2VVUkwgVGhlIGJhc2UgVVJMXG4gKiBAcGFyYW0ge3N0cmluZ30gcmVsYXRpdmVVUkwgVGhlIHJlbGF0aXZlIFVSTFxuICogQHJldHVybnMge3N0cmluZ30gVGhlIGNvbWJpbmVkIFVSTFxuICovXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGNvbWJpbmVVUkxzKGJhc2VVUkwsIHJlbGF0aXZlVVJMKSB7XG4gIHJldHVybiByZWxhdGl2ZVVSTFxuICAgID8gYmFzZVVSTC5yZXBsYWNlKC9cXC8rJC8sICcnKSArICcvJyArIHJlbGF0aXZlVVJMLnJlcGxhY2UoL15cXC8rLywgJycpXG4gICAgOiBiYXNlVVJMO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIHV0aWxzID0gcmVxdWlyZSgnLi8uLi91dGlscycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IChcbiAgdXRpbHMuaXNTdGFuZGFyZEJyb3dzZXJFbnYoKSA/XG5cbiAgLy8gU3RhbmRhcmQgYnJvd3NlciBlbnZzIHN1cHBvcnQgZG9jdW1lbnQuY29va2llXG4gIChmdW5jdGlvbiBzdGFuZGFyZEJyb3dzZXJFbnYoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHdyaXRlOiBmdW5jdGlvbiB3cml0ZShuYW1lLCB2YWx1ZSwgZXhwaXJlcywgcGF0aCwgZG9tYWluLCBzZWN1cmUpIHtcbiAgICAgICAgdmFyIGNvb2tpZSA9IFtdO1xuICAgICAgICBjb29raWUucHVzaChuYW1lICsgJz0nICsgZW5jb2RlVVJJQ29tcG9uZW50KHZhbHVlKSk7XG5cbiAgICAgICAgaWYgKHV0aWxzLmlzTnVtYmVyKGV4cGlyZXMpKSB7XG4gICAgICAgICAgY29va2llLnB1c2goJ2V4cGlyZXM9JyArIG5ldyBEYXRlKGV4cGlyZXMpLnRvR01UU3RyaW5nKCkpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHV0aWxzLmlzU3RyaW5nKHBhdGgpKSB7XG4gICAgICAgICAgY29va2llLnB1c2goJ3BhdGg9JyArIHBhdGgpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHV0aWxzLmlzU3RyaW5nKGRvbWFpbikpIHtcbiAgICAgICAgICBjb29raWUucHVzaCgnZG9tYWluPScgKyBkb21haW4pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHNlY3VyZSA9PT0gdHJ1ZSkge1xuICAgICAgICAgIGNvb2tpZS5wdXNoKCdzZWN1cmUnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGRvY3VtZW50LmNvb2tpZSA9IGNvb2tpZS5qb2luKCc7ICcpO1xuICAgICAgfSxcblxuICAgICAgcmVhZDogZnVuY3Rpb24gcmVhZChuYW1lKSB7XG4gICAgICAgIHZhciBtYXRjaCA9IGRvY3VtZW50LmNvb2tpZS5tYXRjaChuZXcgUmVnRXhwKCcoXnw7XFxcXHMqKSgnICsgbmFtZSArICcpPShbXjtdKiknKSk7XG4gICAgICAgIHJldHVybiAobWF0Y2ggPyBkZWNvZGVVUklDb21wb25lbnQobWF0Y2hbM10pIDogbnVsbCk7XG4gICAgICB9LFxuXG4gICAgICByZW1vdmU6IGZ1bmN0aW9uIHJlbW92ZShuYW1lKSB7XG4gICAgICAgIHRoaXMud3JpdGUobmFtZSwgJycsIERhdGUubm93KCkgLSA4NjQwMDAwMCk7XG4gICAgICB9XG4gICAgfTtcbiAgfSkoKSA6XG5cbiAgLy8gTm9uIHN0YW5kYXJkIGJyb3dzZXIgZW52ICh3ZWIgd29ya2VycywgcmVhY3QtbmF0aXZlKSBsYWNrIG5lZWRlZCBzdXBwb3J0LlxuICAoZnVuY3Rpb24gbm9uU3RhbmRhcmRCcm93c2VyRW52KCkge1xuICAgIHJldHVybiB7XG4gICAgICB3cml0ZTogZnVuY3Rpb24gd3JpdGUoKSB7fSxcbiAgICAgIHJlYWQ6IGZ1bmN0aW9uIHJlYWQoKSB7IHJldHVybiBudWxsOyB9LFxuICAgICAgcmVtb3ZlOiBmdW5jdGlvbiByZW1vdmUoKSB7fVxuICAgIH07XG4gIH0pKClcbik7XG4iLCIndXNlIHN0cmljdCc7XG5cbi8qKlxuICogRGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgVVJMIGlzIGFic29sdXRlXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHVybCBUaGUgVVJMIHRvIHRlc3RcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHRoZSBzcGVjaWZpZWQgVVJMIGlzIGFic29sdXRlLCBvdGhlcndpc2UgZmFsc2VcbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBpc0Fic29sdXRlVVJMKHVybCkge1xuICAvLyBBIFVSTCBpcyBjb25zaWRlcmVkIGFic29sdXRlIGlmIGl0IGJlZ2lucyB3aXRoIFwiPHNjaGVtZT46Ly9cIiBvciBcIi8vXCIgKHByb3RvY29sLXJlbGF0aXZlIFVSTCkuXG4gIC8vIFJGQyAzOTg2IGRlZmluZXMgc2NoZW1lIG5hbWUgYXMgYSBzZXF1ZW5jZSBvZiBjaGFyYWN0ZXJzIGJlZ2lubmluZyB3aXRoIGEgbGV0dGVyIGFuZCBmb2xsb3dlZFxuICAvLyBieSBhbnkgY29tYmluYXRpb24gb2YgbGV0dGVycywgZGlnaXRzLCBwbHVzLCBwZXJpb2QsIG9yIGh5cGhlbi5cbiAgcmV0dXJuIC9eKFthLXpdW2EtelxcZFxcK1xcLVxcLl0qOik/XFwvXFwvL2kudGVzdCh1cmwpO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIHV0aWxzID0gcmVxdWlyZSgnLi8uLi91dGlscycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IChcbiAgdXRpbHMuaXNTdGFuZGFyZEJyb3dzZXJFbnYoKSA/XG5cbiAgLy8gU3RhbmRhcmQgYnJvd3NlciBlbnZzIGhhdmUgZnVsbCBzdXBwb3J0IG9mIHRoZSBBUElzIG5lZWRlZCB0byB0ZXN0XG4gIC8vIHdoZXRoZXIgdGhlIHJlcXVlc3QgVVJMIGlzIG9mIHRoZSBzYW1lIG9yaWdpbiBhcyBjdXJyZW50IGxvY2F0aW9uLlxuICAoZnVuY3Rpb24gc3RhbmRhcmRCcm93c2VyRW52KCkge1xuICAgIHZhciBtc2llID0gLyhtc2llfHRyaWRlbnQpL2kudGVzdChuYXZpZ2F0b3IudXNlckFnZW50KTtcbiAgICB2YXIgdXJsUGFyc2luZ05vZGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7XG4gICAgdmFyIG9yaWdpblVSTDtcblxuICAgIC8qKlxuICAgICogUGFyc2UgYSBVUkwgdG8gZGlzY292ZXIgaXQncyBjb21wb25lbnRzXG4gICAgKlxuICAgICogQHBhcmFtIHtTdHJpbmd9IHVybCBUaGUgVVJMIHRvIGJlIHBhcnNlZFxuICAgICogQHJldHVybnMge09iamVjdH1cbiAgICAqL1xuICAgIGZ1bmN0aW9uIHJlc29sdmVVUkwodXJsKSB7XG4gICAgICB2YXIgaHJlZiA9IHVybDtcblxuICAgICAgaWYgKG1zaWUpIHtcbiAgICAgICAgLy8gSUUgbmVlZHMgYXR0cmlidXRlIHNldCB0d2ljZSB0byBub3JtYWxpemUgcHJvcGVydGllc1xuICAgICAgICB1cmxQYXJzaW5nTm9kZS5zZXRBdHRyaWJ1dGUoJ2hyZWYnLCBocmVmKTtcbiAgICAgICAgaHJlZiA9IHVybFBhcnNpbmdOb2RlLmhyZWY7XG4gICAgICB9XG5cbiAgICAgIHVybFBhcnNpbmdOb2RlLnNldEF0dHJpYnV0ZSgnaHJlZicsIGhyZWYpO1xuXG4gICAgICAvLyB1cmxQYXJzaW5nTm9kZSBwcm92aWRlcyB0aGUgVXJsVXRpbHMgaW50ZXJmYWNlIC0gaHR0cDovL3VybC5zcGVjLndoYXR3Zy5vcmcvI3VybHV0aWxzXG4gICAgICByZXR1cm4ge1xuICAgICAgICBocmVmOiB1cmxQYXJzaW5nTm9kZS5ocmVmLFxuICAgICAgICBwcm90b2NvbDogdXJsUGFyc2luZ05vZGUucHJvdG9jb2wgPyB1cmxQYXJzaW5nTm9kZS5wcm90b2NvbC5yZXBsYWNlKC86JC8sICcnKSA6ICcnLFxuICAgICAgICBob3N0OiB1cmxQYXJzaW5nTm9kZS5ob3N0LFxuICAgICAgICBzZWFyY2g6IHVybFBhcnNpbmdOb2RlLnNlYXJjaCA/IHVybFBhcnNpbmdOb2RlLnNlYXJjaC5yZXBsYWNlKC9eXFw/LywgJycpIDogJycsXG4gICAgICAgIGhhc2g6IHVybFBhcnNpbmdOb2RlLmhhc2ggPyB1cmxQYXJzaW5nTm9kZS5oYXNoLnJlcGxhY2UoL14jLywgJycpIDogJycsXG4gICAgICAgIGhvc3RuYW1lOiB1cmxQYXJzaW5nTm9kZS5ob3N0bmFtZSxcbiAgICAgICAgcG9ydDogdXJsUGFyc2luZ05vZGUucG9ydCxcbiAgICAgICAgcGF0aG5hbWU6ICh1cmxQYXJzaW5nTm9kZS5wYXRobmFtZS5jaGFyQXQoMCkgPT09ICcvJykgP1xuICAgICAgICAgICAgICAgICAgdXJsUGFyc2luZ05vZGUucGF0aG5hbWUgOlxuICAgICAgICAgICAgICAgICAgJy8nICsgdXJsUGFyc2luZ05vZGUucGF0aG5hbWVcbiAgICAgIH07XG4gICAgfVxuXG4gICAgb3JpZ2luVVJMID0gcmVzb2x2ZVVSTCh3aW5kb3cubG9jYXRpb24uaHJlZik7XG5cbiAgICAvKipcbiAgICAqIERldGVybWluZSBpZiBhIFVSTCBzaGFyZXMgdGhlIHNhbWUgb3JpZ2luIGFzIHRoZSBjdXJyZW50IGxvY2F0aW9uXG4gICAgKlxuICAgICogQHBhcmFtIHtTdHJpbmd9IHJlcXVlc3RVUkwgVGhlIFVSTCB0byB0ZXN0XG4gICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiBVUkwgc2hhcmVzIHRoZSBzYW1lIG9yaWdpbiwgb3RoZXJ3aXNlIGZhbHNlXG4gICAgKi9cbiAgICByZXR1cm4gZnVuY3Rpb24gaXNVUkxTYW1lT3JpZ2luKHJlcXVlc3RVUkwpIHtcbiAgICAgIHZhciBwYXJzZWQgPSAodXRpbHMuaXNTdHJpbmcocmVxdWVzdFVSTCkpID8gcmVzb2x2ZVVSTChyZXF1ZXN0VVJMKSA6IHJlcXVlc3RVUkw7XG4gICAgICByZXR1cm4gKHBhcnNlZC5wcm90b2NvbCA9PT0gb3JpZ2luVVJMLnByb3RvY29sICYmXG4gICAgICAgICAgICBwYXJzZWQuaG9zdCA9PT0gb3JpZ2luVVJMLmhvc3QpO1xuICAgIH07XG4gIH0pKCkgOlxuXG4gIC8vIE5vbiBzdGFuZGFyZCBicm93c2VyIGVudnMgKHdlYiB3b3JrZXJzLCByZWFjdC1uYXRpdmUpIGxhY2sgbmVlZGVkIHN1cHBvcnQuXG4gIChmdW5jdGlvbiBub25TdGFuZGFyZEJyb3dzZXJFbnYoKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIGlzVVJMU2FtZU9yaWdpbigpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH07XG4gIH0pKClcbik7XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciB1dGlscyA9IHJlcXVpcmUoJy4uL3V0aWxzJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gbm9ybWFsaXplSGVhZGVyTmFtZShoZWFkZXJzLCBub3JtYWxpemVkTmFtZSkge1xuICB1dGlscy5mb3JFYWNoKGhlYWRlcnMsIGZ1bmN0aW9uIHByb2Nlc3NIZWFkZXIodmFsdWUsIG5hbWUpIHtcbiAgICBpZiAobmFtZSAhPT0gbm9ybWFsaXplZE5hbWUgJiYgbmFtZS50b1VwcGVyQ2FzZSgpID09PSBub3JtYWxpemVkTmFtZS50b1VwcGVyQ2FzZSgpKSB7XG4gICAgICBoZWFkZXJzW25vcm1hbGl6ZWROYW1lXSA9IHZhbHVlO1xuICAgICAgZGVsZXRlIGhlYWRlcnNbbmFtZV07XG4gICAgfVxuICB9KTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciB1dGlscyA9IHJlcXVpcmUoJy4vLi4vdXRpbHMnKTtcblxuLy8gSGVhZGVycyB3aG9zZSBkdXBsaWNhdGVzIGFyZSBpZ25vcmVkIGJ5IG5vZGVcbi8vIGMuZi4gaHR0cHM6Ly9ub2RlanMub3JnL2FwaS9odHRwLmh0bWwjaHR0cF9tZXNzYWdlX2hlYWRlcnNcbnZhciBpZ25vcmVEdXBsaWNhdGVPZiA9IFtcbiAgJ2FnZScsICdhdXRob3JpemF0aW9uJywgJ2NvbnRlbnQtbGVuZ3RoJywgJ2NvbnRlbnQtdHlwZScsICdldGFnJyxcbiAgJ2V4cGlyZXMnLCAnZnJvbScsICdob3N0JywgJ2lmLW1vZGlmaWVkLXNpbmNlJywgJ2lmLXVubW9kaWZpZWQtc2luY2UnLFxuICAnbGFzdC1tb2RpZmllZCcsICdsb2NhdGlvbicsICdtYXgtZm9yd2FyZHMnLCAncHJveHktYXV0aG9yaXphdGlvbicsXG4gICdyZWZlcmVyJywgJ3JldHJ5LWFmdGVyJywgJ3VzZXItYWdlbnQnXG5dO1xuXG4vKipcbiAqIFBhcnNlIGhlYWRlcnMgaW50byBhbiBvYmplY3RcbiAqXG4gKiBgYGBcbiAqIERhdGU6IFdlZCwgMjcgQXVnIDIwMTQgMDg6NTg6NDkgR01UXG4gKiBDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL2pzb25cbiAqIENvbm5lY3Rpb246IGtlZXAtYWxpdmVcbiAqIFRyYW5zZmVyLUVuY29kaW5nOiBjaHVua2VkXG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gaGVhZGVycyBIZWFkZXJzIG5lZWRpbmcgdG8gYmUgcGFyc2VkXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBIZWFkZXJzIHBhcnNlZCBpbnRvIGFuIG9iamVjdFxuICovXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIHBhcnNlSGVhZGVycyhoZWFkZXJzKSB7XG4gIHZhciBwYXJzZWQgPSB7fTtcbiAgdmFyIGtleTtcbiAgdmFyIHZhbDtcbiAgdmFyIGk7XG5cbiAgaWYgKCFoZWFkZXJzKSB7IHJldHVybiBwYXJzZWQ7IH1cblxuICB1dGlscy5mb3JFYWNoKGhlYWRlcnMuc3BsaXQoJ1xcbicpLCBmdW5jdGlvbiBwYXJzZXIobGluZSkge1xuICAgIGkgPSBsaW5lLmluZGV4T2YoJzonKTtcbiAgICBrZXkgPSB1dGlscy50cmltKGxpbmUuc3Vic3RyKDAsIGkpKS50b0xvd2VyQ2FzZSgpO1xuICAgIHZhbCA9IHV0aWxzLnRyaW0obGluZS5zdWJzdHIoaSArIDEpKTtcblxuICAgIGlmIChrZXkpIHtcbiAgICAgIGlmIChwYXJzZWRba2V5XSAmJiBpZ25vcmVEdXBsaWNhdGVPZi5pbmRleE9mKGtleSkgPj0gMCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAoa2V5ID09PSAnc2V0LWNvb2tpZScpIHtcbiAgICAgICAgcGFyc2VkW2tleV0gPSAocGFyc2VkW2tleV0gPyBwYXJzZWRba2V5XSA6IFtdKS5jb25jYXQoW3ZhbF0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcGFyc2VkW2tleV0gPSBwYXJzZWRba2V5XSA/IHBhcnNlZFtrZXldICsgJywgJyArIHZhbCA6IHZhbDtcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xuXG4gIHJldHVybiBwYXJzZWQ7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG4vKipcbiAqIFN5bnRhY3RpYyBzdWdhciBmb3IgaW52b2tpbmcgYSBmdW5jdGlvbiBhbmQgZXhwYW5kaW5nIGFuIGFycmF5IGZvciBhcmd1bWVudHMuXG4gKlxuICogQ29tbW9uIHVzZSBjYXNlIHdvdWxkIGJlIHRvIHVzZSBgRnVuY3Rpb24ucHJvdG90eXBlLmFwcGx5YC5cbiAqXG4gKiAgYGBganNcbiAqICBmdW5jdGlvbiBmKHgsIHksIHopIHt9XG4gKiAgdmFyIGFyZ3MgPSBbMSwgMiwgM107XG4gKiAgZi5hcHBseShudWxsLCBhcmdzKTtcbiAqICBgYGBcbiAqXG4gKiBXaXRoIGBzcHJlYWRgIHRoaXMgZXhhbXBsZSBjYW4gYmUgcmUtd3JpdHRlbi5cbiAqXG4gKiAgYGBganNcbiAqICBzcHJlYWQoZnVuY3Rpb24oeCwgeSwgeikge30pKFsxLCAyLCAzXSk7XG4gKiAgYGBgXG4gKlxuICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2tcbiAqIEByZXR1cm5zIHtGdW5jdGlvbn1cbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBzcHJlYWQoY2FsbGJhY2spIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIHdyYXAoYXJyKSB7XG4gICAgcmV0dXJuIGNhbGxiYWNrLmFwcGx5KG51bGwsIGFycik7XG4gIH07XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgYmluZCA9IHJlcXVpcmUoJy4vaGVscGVycy9iaW5kJyk7XG52YXIgaXNCdWZmZXIgPSByZXF1aXJlKCdpcy1idWZmZXInKTtcblxuLypnbG9iYWwgdG9TdHJpbmc6dHJ1ZSovXG5cbi8vIHV0aWxzIGlzIGEgbGlicmFyeSBvZiBnZW5lcmljIGhlbHBlciBmdW5jdGlvbnMgbm9uLXNwZWNpZmljIHRvIGF4aW9zXG5cbnZhciB0b1N0cmluZyA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmc7XG5cbi8qKlxuICogRGV0ZXJtaW5lIGlmIGEgdmFsdWUgaXMgYW4gQXJyYXlcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gdmFsIFRoZSB2YWx1ZSB0byB0ZXN0XG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB2YWx1ZSBpcyBhbiBBcnJheSwgb3RoZXJ3aXNlIGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzQXJyYXkodmFsKSB7XG4gIHJldHVybiB0b1N0cmluZy5jYWxsKHZhbCkgPT09ICdbb2JqZWN0IEFycmF5XSc7XG59XG5cbi8qKlxuICogRGV0ZXJtaW5lIGlmIGEgdmFsdWUgaXMgYW4gQXJyYXlCdWZmZXJcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gdmFsIFRoZSB2YWx1ZSB0byB0ZXN0XG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB2YWx1ZSBpcyBhbiBBcnJheUJ1ZmZlciwgb3RoZXJ3aXNlIGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzQXJyYXlCdWZmZXIodmFsKSB7XG4gIHJldHVybiB0b1N0cmluZy5jYWxsKHZhbCkgPT09ICdbb2JqZWN0IEFycmF5QnVmZmVyXSc7XG59XG5cbi8qKlxuICogRGV0ZXJtaW5lIGlmIGEgdmFsdWUgaXMgYSBGb3JtRGF0YVxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSB2YWwgVGhlIHZhbHVlIHRvIHRlc3RcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHZhbHVlIGlzIGFuIEZvcm1EYXRhLCBvdGhlcndpc2UgZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNGb3JtRGF0YSh2YWwpIHtcbiAgcmV0dXJuICh0eXBlb2YgRm9ybURhdGEgIT09ICd1bmRlZmluZWQnKSAmJiAodmFsIGluc3RhbmNlb2YgRm9ybURhdGEpO1xufVxuXG4vKipcbiAqIERldGVybWluZSBpZiBhIHZhbHVlIGlzIGEgdmlldyBvbiBhbiBBcnJheUJ1ZmZlclxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSB2YWwgVGhlIHZhbHVlIHRvIHRlc3RcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHZhbHVlIGlzIGEgdmlldyBvbiBhbiBBcnJheUJ1ZmZlciwgb3RoZXJ3aXNlIGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzQXJyYXlCdWZmZXJWaWV3KHZhbCkge1xuICB2YXIgcmVzdWx0O1xuICBpZiAoKHR5cGVvZiBBcnJheUJ1ZmZlciAhPT0gJ3VuZGVmaW5lZCcpICYmIChBcnJheUJ1ZmZlci5pc1ZpZXcpKSB7XG4gICAgcmVzdWx0ID0gQXJyYXlCdWZmZXIuaXNWaWV3KHZhbCk7XG4gIH0gZWxzZSB7XG4gICAgcmVzdWx0ID0gKHZhbCkgJiYgKHZhbC5idWZmZXIpICYmICh2YWwuYnVmZmVyIGluc3RhbmNlb2YgQXJyYXlCdWZmZXIpO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogRGV0ZXJtaW5lIGlmIGEgdmFsdWUgaXMgYSBTdHJpbmdcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gdmFsIFRoZSB2YWx1ZSB0byB0ZXN0XG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB2YWx1ZSBpcyBhIFN0cmluZywgb3RoZXJ3aXNlIGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzU3RyaW5nKHZhbCkge1xuICByZXR1cm4gdHlwZW9mIHZhbCA9PT0gJ3N0cmluZyc7XG59XG5cbi8qKlxuICogRGV0ZXJtaW5lIGlmIGEgdmFsdWUgaXMgYSBOdW1iZXJcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gdmFsIFRoZSB2YWx1ZSB0byB0ZXN0XG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB2YWx1ZSBpcyBhIE51bWJlciwgb3RoZXJ3aXNlIGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzTnVtYmVyKHZhbCkge1xuICByZXR1cm4gdHlwZW9mIHZhbCA9PT0gJ251bWJlcic7XG59XG5cbi8qKlxuICogRGV0ZXJtaW5lIGlmIGEgdmFsdWUgaXMgdW5kZWZpbmVkXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHZhbCBUaGUgdmFsdWUgdG8gdGVzdFxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdGhlIHZhbHVlIGlzIHVuZGVmaW5lZCwgb3RoZXJ3aXNlIGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzVW5kZWZpbmVkKHZhbCkge1xuICByZXR1cm4gdHlwZW9mIHZhbCA9PT0gJ3VuZGVmaW5lZCc7XG59XG5cbi8qKlxuICogRGV0ZXJtaW5lIGlmIGEgdmFsdWUgaXMgYW4gT2JqZWN0XG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHZhbCBUaGUgdmFsdWUgdG8gdGVzdFxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdmFsdWUgaXMgYW4gT2JqZWN0LCBvdGhlcndpc2UgZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNPYmplY3QodmFsKSB7XG4gIHJldHVybiB2YWwgIT09IG51bGwgJiYgdHlwZW9mIHZhbCA9PT0gJ29iamVjdCc7XG59XG5cbi8qKlxuICogRGV0ZXJtaW5lIGlmIGEgdmFsdWUgaXMgYSBEYXRlXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHZhbCBUaGUgdmFsdWUgdG8gdGVzdFxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdmFsdWUgaXMgYSBEYXRlLCBvdGhlcndpc2UgZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNEYXRlKHZhbCkge1xuICByZXR1cm4gdG9TdHJpbmcuY2FsbCh2YWwpID09PSAnW29iamVjdCBEYXRlXSc7XG59XG5cbi8qKlxuICogRGV0ZXJtaW5lIGlmIGEgdmFsdWUgaXMgYSBGaWxlXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHZhbCBUaGUgdmFsdWUgdG8gdGVzdFxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdmFsdWUgaXMgYSBGaWxlLCBvdGhlcndpc2UgZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNGaWxlKHZhbCkge1xuICByZXR1cm4gdG9TdHJpbmcuY2FsbCh2YWwpID09PSAnW29iamVjdCBGaWxlXSc7XG59XG5cbi8qKlxuICogRGV0ZXJtaW5lIGlmIGEgdmFsdWUgaXMgYSBCbG9iXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHZhbCBUaGUgdmFsdWUgdG8gdGVzdFxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdmFsdWUgaXMgYSBCbG9iLCBvdGhlcndpc2UgZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNCbG9iKHZhbCkge1xuICByZXR1cm4gdG9TdHJpbmcuY2FsbCh2YWwpID09PSAnW29iamVjdCBCbG9iXSc7XG59XG5cbi8qKlxuICogRGV0ZXJtaW5lIGlmIGEgdmFsdWUgaXMgYSBGdW5jdGlvblxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSB2YWwgVGhlIHZhbHVlIHRvIHRlc3RcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHZhbHVlIGlzIGEgRnVuY3Rpb24sIG90aGVyd2lzZSBmYWxzZVxuICovXG5mdW5jdGlvbiBpc0Z1bmN0aW9uKHZhbCkge1xuICByZXR1cm4gdG9TdHJpbmcuY2FsbCh2YWwpID09PSAnW29iamVjdCBGdW5jdGlvbl0nO1xufVxuXG4vKipcbiAqIERldGVybWluZSBpZiBhIHZhbHVlIGlzIGEgU3RyZWFtXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHZhbCBUaGUgdmFsdWUgdG8gdGVzdFxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdmFsdWUgaXMgYSBTdHJlYW0sIG90aGVyd2lzZSBmYWxzZVxuICovXG5mdW5jdGlvbiBpc1N0cmVhbSh2YWwpIHtcbiAgcmV0dXJuIGlzT2JqZWN0KHZhbCkgJiYgaXNGdW5jdGlvbih2YWwucGlwZSk7XG59XG5cbi8qKlxuICogRGV0ZXJtaW5lIGlmIGEgdmFsdWUgaXMgYSBVUkxTZWFyY2hQYXJhbXMgb2JqZWN0XG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHZhbCBUaGUgdmFsdWUgdG8gdGVzdFxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdmFsdWUgaXMgYSBVUkxTZWFyY2hQYXJhbXMgb2JqZWN0LCBvdGhlcndpc2UgZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNVUkxTZWFyY2hQYXJhbXModmFsKSB7XG4gIHJldHVybiB0eXBlb2YgVVJMU2VhcmNoUGFyYW1zICE9PSAndW5kZWZpbmVkJyAmJiB2YWwgaW5zdGFuY2VvZiBVUkxTZWFyY2hQYXJhbXM7XG59XG5cbi8qKlxuICogVHJpbSBleGNlc3Mgd2hpdGVzcGFjZSBvZmYgdGhlIGJlZ2lubmluZyBhbmQgZW5kIG9mIGEgc3RyaW5nXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IHN0ciBUaGUgU3RyaW5nIHRvIHRyaW1cbiAqIEByZXR1cm5zIHtTdHJpbmd9IFRoZSBTdHJpbmcgZnJlZWQgb2YgZXhjZXNzIHdoaXRlc3BhY2VcbiAqL1xuZnVuY3Rpb24gdHJpbShzdHIpIHtcbiAgcmV0dXJuIHN0ci5yZXBsYWNlKC9eXFxzKi8sICcnKS5yZXBsYWNlKC9cXHMqJC8sICcnKTtcbn1cblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgd2UncmUgcnVubmluZyBpbiBhIHN0YW5kYXJkIGJyb3dzZXIgZW52aXJvbm1lbnRcbiAqXG4gKiBUaGlzIGFsbG93cyBheGlvcyB0byBydW4gaW4gYSB3ZWIgd29ya2VyLCBhbmQgcmVhY3QtbmF0aXZlLlxuICogQm90aCBlbnZpcm9ubWVudHMgc3VwcG9ydCBYTUxIdHRwUmVxdWVzdCwgYnV0IG5vdCBmdWxseSBzdGFuZGFyZCBnbG9iYWxzLlxuICpcbiAqIHdlYiB3b3JrZXJzOlxuICogIHR5cGVvZiB3aW5kb3cgLT4gdW5kZWZpbmVkXG4gKiAgdHlwZW9mIGRvY3VtZW50IC0+IHVuZGVmaW5lZFxuICpcbiAqIHJlYWN0LW5hdGl2ZTpcbiAqICBuYXZpZ2F0b3IucHJvZHVjdCAtPiAnUmVhY3ROYXRpdmUnXG4gKi9cbmZ1bmN0aW9uIGlzU3RhbmRhcmRCcm93c2VyRW52KCkge1xuICBpZiAodHlwZW9mIG5hdmlnYXRvciAhPT0gJ3VuZGVmaW5lZCcgJiYgbmF2aWdhdG9yLnByb2R1Y3QgPT09ICdSZWFjdE5hdGl2ZScpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcmV0dXJuIChcbiAgICB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJlxuICAgIHR5cGVvZiBkb2N1bWVudCAhPT0gJ3VuZGVmaW5lZCdcbiAgKTtcbn1cblxuLyoqXG4gKiBJdGVyYXRlIG92ZXIgYW4gQXJyYXkgb3IgYW4gT2JqZWN0IGludm9raW5nIGEgZnVuY3Rpb24gZm9yIGVhY2ggaXRlbS5cbiAqXG4gKiBJZiBgb2JqYCBpcyBhbiBBcnJheSBjYWxsYmFjayB3aWxsIGJlIGNhbGxlZCBwYXNzaW5nXG4gKiB0aGUgdmFsdWUsIGluZGV4LCBhbmQgY29tcGxldGUgYXJyYXkgZm9yIGVhY2ggaXRlbS5cbiAqXG4gKiBJZiAnb2JqJyBpcyBhbiBPYmplY3QgY2FsbGJhY2sgd2lsbCBiZSBjYWxsZWQgcGFzc2luZ1xuICogdGhlIHZhbHVlLCBrZXksIGFuZCBjb21wbGV0ZSBvYmplY3QgZm9yIGVhY2ggcHJvcGVydHkuXG4gKlxuICogQHBhcmFtIHtPYmplY3R8QXJyYXl9IG9iaiBUaGUgb2JqZWN0IHRvIGl0ZXJhdGVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIFRoZSBjYWxsYmFjayB0byBpbnZva2UgZm9yIGVhY2ggaXRlbVxuICovXG5mdW5jdGlvbiBmb3JFYWNoKG9iaiwgZm4pIHtcbiAgLy8gRG9uJ3QgYm90aGVyIGlmIG5vIHZhbHVlIHByb3ZpZGVkXG4gIGlmIChvYmogPT09IG51bGwgfHwgdHlwZW9mIG9iaiA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICAvLyBGb3JjZSBhbiBhcnJheSBpZiBub3QgYWxyZWFkeSBzb21ldGhpbmcgaXRlcmFibGVcbiAgaWYgKHR5cGVvZiBvYmogIT09ICdvYmplY3QnKSB7XG4gICAgLyplc2xpbnQgbm8tcGFyYW0tcmVhc3NpZ246MCovXG4gICAgb2JqID0gW29ial07XG4gIH1cblxuICBpZiAoaXNBcnJheShvYmopKSB7XG4gICAgLy8gSXRlcmF0ZSBvdmVyIGFycmF5IHZhbHVlc1xuICAgIGZvciAodmFyIGkgPSAwLCBsID0gb2JqLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgICAgZm4uY2FsbChudWxsLCBvYmpbaV0sIGksIG9iaik7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIC8vIEl0ZXJhdGUgb3ZlciBvYmplY3Qga2V5c1xuICAgIGZvciAodmFyIGtleSBpbiBvYmopIHtcbiAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBrZXkpKSB7XG4gICAgICAgIGZuLmNhbGwobnVsbCwgb2JqW2tleV0sIGtleSwgb2JqKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBBY2NlcHRzIHZhcmFyZ3MgZXhwZWN0aW5nIGVhY2ggYXJndW1lbnQgdG8gYmUgYW4gb2JqZWN0LCB0aGVuXG4gKiBpbW11dGFibHkgbWVyZ2VzIHRoZSBwcm9wZXJ0aWVzIG9mIGVhY2ggb2JqZWN0IGFuZCByZXR1cm5zIHJlc3VsdC5cbiAqXG4gKiBXaGVuIG11bHRpcGxlIG9iamVjdHMgY29udGFpbiB0aGUgc2FtZSBrZXkgdGhlIGxhdGVyIG9iamVjdCBpblxuICogdGhlIGFyZ3VtZW50cyBsaXN0IHdpbGwgdGFrZSBwcmVjZWRlbmNlLlxuICpcbiAqIEV4YW1wbGU6XG4gKlxuICogYGBganNcbiAqIHZhciByZXN1bHQgPSBtZXJnZSh7Zm9vOiAxMjN9LCB7Zm9vOiA0NTZ9KTtcbiAqIGNvbnNvbGUubG9nKHJlc3VsdC5mb28pOyAvLyBvdXRwdXRzIDQ1NlxuICogYGBgXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IG9iajEgT2JqZWN0IHRvIG1lcmdlXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBSZXN1bHQgb2YgYWxsIG1lcmdlIHByb3BlcnRpZXNcbiAqL1xuZnVuY3Rpb24gbWVyZ2UoLyogb2JqMSwgb2JqMiwgb2JqMywgLi4uICovKSB7XG4gIHZhciByZXN1bHQgPSB7fTtcbiAgZnVuY3Rpb24gYXNzaWduVmFsdWUodmFsLCBrZXkpIHtcbiAgICBpZiAodHlwZW9mIHJlc3VsdFtrZXldID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgdmFsID09PSAnb2JqZWN0Jykge1xuICAgICAgcmVzdWx0W2tleV0gPSBtZXJnZShyZXN1bHRba2V5XSwgdmFsKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVzdWx0W2tleV0gPSB2YWw7XG4gICAgfVxuICB9XG5cbiAgZm9yICh2YXIgaSA9IDAsIGwgPSBhcmd1bWVudHMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgZm9yRWFjaChhcmd1bWVudHNbaV0sIGFzc2lnblZhbHVlKTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKipcbiAqIEV4dGVuZHMgb2JqZWN0IGEgYnkgbXV0YWJseSBhZGRpbmcgdG8gaXQgdGhlIHByb3BlcnRpZXMgb2Ygb2JqZWN0IGIuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IGEgVGhlIG9iamVjdCB0byBiZSBleHRlbmRlZFxuICogQHBhcmFtIHtPYmplY3R9IGIgVGhlIG9iamVjdCB0byBjb3B5IHByb3BlcnRpZXMgZnJvbVxuICogQHBhcmFtIHtPYmplY3R9IHRoaXNBcmcgVGhlIG9iamVjdCB0byBiaW5kIGZ1bmN0aW9uIHRvXG4gKiBAcmV0dXJuIHtPYmplY3R9IFRoZSByZXN1bHRpbmcgdmFsdWUgb2Ygb2JqZWN0IGFcbiAqL1xuZnVuY3Rpb24gZXh0ZW5kKGEsIGIsIHRoaXNBcmcpIHtcbiAgZm9yRWFjaChiLCBmdW5jdGlvbiBhc3NpZ25WYWx1ZSh2YWwsIGtleSkge1xuICAgIGlmICh0aGlzQXJnICYmIHR5cGVvZiB2YWwgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGFba2V5XSA9IGJpbmQodmFsLCB0aGlzQXJnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYVtrZXldID0gdmFsO1xuICAgIH1cbiAgfSk7XG4gIHJldHVybiBhO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgaXNBcnJheTogaXNBcnJheSxcbiAgaXNBcnJheUJ1ZmZlcjogaXNBcnJheUJ1ZmZlcixcbiAgaXNCdWZmZXI6IGlzQnVmZmVyLFxuICBpc0Zvcm1EYXRhOiBpc0Zvcm1EYXRhLFxuICBpc0FycmF5QnVmZmVyVmlldzogaXNBcnJheUJ1ZmZlclZpZXcsXG4gIGlzU3RyaW5nOiBpc1N0cmluZyxcbiAgaXNOdW1iZXI6IGlzTnVtYmVyLFxuICBpc09iamVjdDogaXNPYmplY3QsXG4gIGlzVW5kZWZpbmVkOiBpc1VuZGVmaW5lZCxcbiAgaXNEYXRlOiBpc0RhdGUsXG4gIGlzRmlsZTogaXNGaWxlLFxuICBpc0Jsb2I6IGlzQmxvYixcbiAgaXNGdW5jdGlvbjogaXNGdW5jdGlvbixcbiAgaXNTdHJlYW06IGlzU3RyZWFtLFxuICBpc1VSTFNlYXJjaFBhcmFtczogaXNVUkxTZWFyY2hQYXJhbXMsXG4gIGlzU3RhbmRhcmRCcm93c2VyRW52OiBpc1N0YW5kYXJkQnJvd3NlckVudixcbiAgZm9yRWFjaDogZm9yRWFjaCxcbiAgbWVyZ2U6IG1lcmdlLFxuICBleHRlbmQ6IGV4dGVuZCxcbiAgdHJpbTogdHJpbVxufTtcbiIsIlwidXNlIHN0cmljdFwiO1xuXG5yZXF1aXJlKFwiY29yZS1qcy9zaGltXCIpO1xuXG5yZXF1aXJlKFwicmVnZW5lcmF0b3ItcnVudGltZS9ydW50aW1lXCIpO1xuXG5yZXF1aXJlKFwiY29yZS1qcy9mbi9yZWdleHAvZXNjYXBlXCIpO1xuXG5pZiAoZ2xvYmFsLl9iYWJlbFBvbHlmaWxsKSB7XG4gIHRocm93IG5ldyBFcnJvcihcIm9ubHkgb25lIGluc3RhbmNlIG9mIGJhYmVsLXBvbHlmaWxsIGlzIGFsbG93ZWRcIik7XG59XG5nbG9iYWwuX2JhYmVsUG9seWZpbGwgPSB0cnVlO1xuXG52YXIgREVGSU5FX1BST1BFUlRZID0gXCJkZWZpbmVQcm9wZXJ0eVwiO1xuZnVuY3Rpb24gZGVmaW5lKE8sIGtleSwgdmFsdWUpIHtcbiAgT1trZXldIHx8IE9iamVjdFtERUZJTkVfUFJPUEVSVFldKE8sIGtleSwge1xuICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICB2YWx1ZTogdmFsdWVcbiAgfSk7XG59XG5cbmRlZmluZShTdHJpbmcucHJvdG90eXBlLCBcInBhZExlZnRcIiwgXCJcIi5wYWRTdGFydCk7XG5kZWZpbmUoU3RyaW5nLnByb3RvdHlwZSwgXCJwYWRSaWdodFwiLCBcIlwiLnBhZEVuZCk7XG5cblwicG9wLHJldmVyc2Usc2hpZnQsa2V5cyx2YWx1ZXMsZW50cmllcyxpbmRleE9mLGV2ZXJ5LHNvbWUsZm9yRWFjaCxtYXAsZmlsdGVyLGZpbmQsZmluZEluZGV4LGluY2x1ZGVzLGpvaW4sc2xpY2UsY29uY2F0LHB1c2gsc3BsaWNlLHVuc2hpZnQsc29ydCxsYXN0SW5kZXhPZixyZWR1Y2UscmVkdWNlUmlnaHQsY29weVdpdGhpbixmaWxsXCIuc3BsaXQoXCIsXCIpLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICBbXVtrZXldICYmIGRlZmluZShBcnJheSwga2V5LCBGdW5jdGlvbi5jYWxsLmJpbmQoW11ba2V5XSkpO1xufSk7IiwiIWZ1bmN0aW9uKGUsdCl7aWYoXCJmdW5jdGlvblwiPT10eXBlb2YgZGVmaW5lJiZkZWZpbmUuYW1kKWRlZmluZShbXCJleHBvcnRzXCJdLHQpO2Vsc2UgaWYoXCJ1bmRlZmluZWRcIiE9dHlwZW9mIGV4cG9ydHMpdChleHBvcnRzKTtlbHNle3ZhciBvPXt9O3QobyksZS5ib2R5U2Nyb2xsTG9jaz1vfX0odGhpcyxmdW5jdGlvbihleHBvcnRzKXtcInVzZSBzdHJpY3RcIjtmdW5jdGlvbiByKGUpe2lmKEFycmF5LmlzQXJyYXkoZSkpe2Zvcih2YXIgdD0wLG89QXJyYXkoZS5sZW5ndGgpO3Q8ZS5sZW5ndGg7dCsrKW9bdF09ZVt0XTtyZXR1cm4gb31yZXR1cm4gQXJyYXkuZnJvbShlKX1PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cyxcIl9fZXNNb2R1bGVcIix7dmFsdWU6ITB9KTt2YXIgbD0hMTtpZihcInVuZGVmaW5lZFwiIT10eXBlb2Ygd2luZG93KXt2YXIgZT17Z2V0IHBhc3NpdmUoKXtsPSEwfX07d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJ0ZXN0UGFzc2l2ZVwiLG51bGwsZSksd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJ0ZXN0UGFzc2l2ZVwiLG51bGwsZSl9dmFyIGQ9XCJ1bmRlZmluZWRcIiE9dHlwZW9mIHdpbmRvdyYmd2luZG93Lm5hdmlnYXRvciYmd2luZG93Lm5hdmlnYXRvci5wbGF0Zm9ybSYmL2lQKGFkfGhvbmV8b2QpLy50ZXN0KHdpbmRvdy5uYXZpZ2F0b3IucGxhdGZvcm0pLGM9W10sdT0hMSxhPS0xLHM9dm9pZCAwLHY9dm9pZCAwLGY9ZnVuY3Rpb24odCl7cmV0dXJuIGMuc29tZShmdW5jdGlvbihlKXtyZXR1cm4hKCFlLm9wdGlvbnMuYWxsb3dUb3VjaE1vdmV8fCFlLm9wdGlvbnMuYWxsb3dUb3VjaE1vdmUodCkpfSl9LG09ZnVuY3Rpb24oZSl7dmFyIHQ9ZXx8d2luZG93LmV2ZW50O3JldHVybiEhZih0LnRhcmdldCl8fCgxPHQudG91Y2hlcy5sZW5ndGh8fCh0LnByZXZlbnREZWZhdWx0JiZ0LnByZXZlbnREZWZhdWx0KCksITEpKX0sbz1mdW5jdGlvbigpe3NldFRpbWVvdXQoZnVuY3Rpb24oKXt2b2lkIDAhPT12JiYoZG9jdW1lbnQuYm9keS5zdHlsZS5wYWRkaW5nUmlnaHQ9dix2PXZvaWQgMCksdm9pZCAwIT09cyYmKGRvY3VtZW50LmJvZHkuc3R5bGUub3ZlcmZsb3c9cyxzPXZvaWQgMCl9KX07ZXhwb3J0cy5kaXNhYmxlQm9keVNjcm9sbD1mdW5jdGlvbihpLGUpe2lmKGQpe2lmKCFpKXJldHVybiB2b2lkIGNvbnNvbGUuZXJyb3IoXCJkaXNhYmxlQm9keVNjcm9sbCB1bnN1Y2Nlc3NmdWwgLSB0YXJnZXRFbGVtZW50IG11c3QgYmUgcHJvdmlkZWQgd2hlbiBjYWxsaW5nIGRpc2FibGVCb2R5U2Nyb2xsIG9uIElPUyBkZXZpY2VzLlwiKTtpZihpJiYhYy5zb21lKGZ1bmN0aW9uKGUpe3JldHVybiBlLnRhcmdldEVsZW1lbnQ9PT1pfSkpe3ZhciB0PXt0YXJnZXRFbGVtZW50Omksb3B0aW9uczplfHx7fX07Yz1bXS5jb25jYXQocihjKSxbdF0pLGkub250b3VjaHN0YXJ0PWZ1bmN0aW9uKGUpezE9PT1lLnRhcmdldFRvdWNoZXMubGVuZ3RoJiYoYT1lLnRhcmdldFRvdWNoZXNbMF0uY2xpZW50WSl9LGkub250b3VjaG1vdmU9ZnVuY3Rpb24oZSl7dmFyIHQsbyxuLHI7MT09PWUudGFyZ2V0VG91Y2hlcy5sZW5ndGgmJihvPWkscj0odD1lKS50YXJnZXRUb3VjaGVzWzBdLmNsaWVudFktYSwhZih0LnRhcmdldCkmJihvJiYwPT09by5zY3JvbGxUb3AmJjA8cj9tKHQpOihuPW8pJiZuLnNjcm9sbEhlaWdodC1uLnNjcm9sbFRvcDw9bi5jbGllbnRIZWlnaHQmJnI8MD9tKHQpOnQuc3RvcFByb3BhZ2F0aW9uKCkpKX0sdXx8KGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJ0b3VjaG1vdmVcIixtLGw/e3Bhc3NpdmU6ITF9OnZvaWQgMCksdT0hMCl9fWVsc2V7bj1lLHNldFRpbWVvdXQoZnVuY3Rpb24oKXtpZih2b2lkIDA9PT12KXt2YXIgZT0hIW4mJiEwPT09bi5yZXNlcnZlU2Nyb2xsQmFyR2FwLHQ9d2luZG93LmlubmVyV2lkdGgtZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoO2UmJjA8dCYmKHY9ZG9jdW1lbnQuYm9keS5zdHlsZS5wYWRkaW5nUmlnaHQsZG9jdW1lbnQuYm9keS5zdHlsZS5wYWRkaW5nUmlnaHQ9dCtcInB4XCIpfXZvaWQgMD09PXMmJihzPWRvY3VtZW50LmJvZHkuc3R5bGUub3ZlcmZsb3csZG9jdW1lbnQuYm9keS5zdHlsZS5vdmVyZmxvdz1cImhpZGRlblwiKX0pO3ZhciBvPXt0YXJnZXRFbGVtZW50Omksb3B0aW9uczplfHx7fX07Yz1bXS5jb25jYXQocihjKSxbb10pfXZhciBufSxleHBvcnRzLmNsZWFyQWxsQm9keVNjcm9sbExvY2tzPWZ1bmN0aW9uKCl7ZD8oYy5mb3JFYWNoKGZ1bmN0aW9uKGUpe2UudGFyZ2V0RWxlbWVudC5vbnRvdWNoc3RhcnQ9bnVsbCxlLnRhcmdldEVsZW1lbnQub250b3VjaG1vdmU9bnVsbH0pLHUmJihkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFwidG91Y2htb3ZlXCIsbSxsP3twYXNzaXZlOiExfTp2b2lkIDApLHU9ITEpLGM9W10sYT0tMSk6KG8oKSxjPVtdKX0sZXhwb3J0cy5lbmFibGVCb2R5U2Nyb2xsPWZ1bmN0aW9uKHQpe2lmKGQpe2lmKCF0KXJldHVybiB2b2lkIGNvbnNvbGUuZXJyb3IoXCJlbmFibGVCb2R5U2Nyb2xsIHVuc3VjY2Vzc2Z1bCAtIHRhcmdldEVsZW1lbnQgbXVzdCBiZSBwcm92aWRlZCB3aGVuIGNhbGxpbmcgZW5hYmxlQm9keVNjcm9sbCBvbiBJT1MgZGV2aWNlcy5cIik7dC5vbnRvdWNoc3RhcnQ9bnVsbCx0Lm9udG91Y2htb3ZlPW51bGwsYz1jLmZpbHRlcihmdW5jdGlvbihlKXtyZXR1cm4gZS50YXJnZXRFbGVtZW50IT09dH0pLHUmJjA9PT1jLmxlbmd0aCYmKGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJ0b3VjaG1vdmVcIixtLGw/e3Bhc3NpdmU6ITF9OnZvaWQgMCksdT0hMSl9ZWxzZSAxPT09Yy5sZW5ndGgmJmNbMF0udGFyZ2V0RWxlbWVudD09PXQ/KG8oKSxjPVtdKTpjPWMuZmlsdGVyKGZ1bmN0aW9uKGUpe3JldHVybiBlLnRhcmdldEVsZW1lbnQhPT10fSl9fSk7XG4iLCJyZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2NvcmUucmVnZXhwLmVzY2FwZScpO1xubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuLi8uLi9tb2R1bGVzL19jb3JlJykuUmVnRXhwLmVzY2FwZTtcbiIsIm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIGlmICh0eXBlb2YgaXQgIT0gJ2Z1bmN0aW9uJykgdGhyb3cgVHlwZUVycm9yKGl0ICsgJyBpcyBub3QgYSBmdW5jdGlvbiEnKTtcbiAgcmV0dXJuIGl0O1xufTtcbiIsInZhciBjb2YgPSByZXF1aXJlKCcuL19jb2YnKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0LCBtc2cpIHtcbiAgaWYgKHR5cGVvZiBpdCAhPSAnbnVtYmVyJyAmJiBjb2YoaXQpICE9ICdOdW1iZXInKSB0aHJvdyBUeXBlRXJyb3IobXNnKTtcbiAgcmV0dXJuICtpdDtcbn07XG4iLCIvLyAyMi4xLjMuMzEgQXJyYXkucHJvdG90eXBlW0BAdW5zY29wYWJsZXNdXG52YXIgVU5TQ09QQUJMRVMgPSByZXF1aXJlKCcuL193a3MnKSgndW5zY29wYWJsZXMnKTtcbnZhciBBcnJheVByb3RvID0gQXJyYXkucHJvdG90eXBlO1xuaWYgKEFycmF5UHJvdG9bVU5TQ09QQUJMRVNdID09IHVuZGVmaW5lZCkgcmVxdWlyZSgnLi9faGlkZScpKEFycmF5UHJvdG8sIFVOU0NPUEFCTEVTLCB7fSk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChrZXkpIHtcbiAgQXJyYXlQcm90b1tVTlNDT1BBQkxFU11ba2V5XSA9IHRydWU7XG59O1xuIiwibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQsIENvbnN0cnVjdG9yLCBuYW1lLCBmb3JiaWRkZW5GaWVsZCkge1xuICBpZiAoIShpdCBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSB8fCAoZm9yYmlkZGVuRmllbGQgIT09IHVuZGVmaW5lZCAmJiBmb3JiaWRkZW5GaWVsZCBpbiBpdCkpIHtcbiAgICB0aHJvdyBUeXBlRXJyb3IobmFtZSArICc6IGluY29ycmVjdCBpbnZvY2F0aW9uIScpO1xuICB9IHJldHVybiBpdDtcbn07XG4iLCJ2YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuL19pcy1vYmplY3QnKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIGlmICghaXNPYmplY3QoaXQpKSB0aHJvdyBUeXBlRXJyb3IoaXQgKyAnIGlzIG5vdCBhbiBvYmplY3QhJyk7XG4gIHJldHVybiBpdDtcbn07XG4iLCIvLyAyMi4xLjMuMyBBcnJheS5wcm90b3R5cGUuY29weVdpdGhpbih0YXJnZXQsIHN0YXJ0LCBlbmQgPSB0aGlzLmxlbmd0aClcbid1c2Ugc3RyaWN0JztcbnZhciB0b09iamVjdCA9IHJlcXVpcmUoJy4vX3RvLW9iamVjdCcpO1xudmFyIHRvQWJzb2x1dGVJbmRleCA9IHJlcXVpcmUoJy4vX3RvLWFic29sdXRlLWluZGV4Jyk7XG52YXIgdG9MZW5ndGggPSByZXF1aXJlKCcuL190by1sZW5ndGgnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBbXS5jb3B5V2l0aGluIHx8IGZ1bmN0aW9uIGNvcHlXaXRoaW4odGFyZ2V0IC8qID0gMCAqLywgc3RhcnQgLyogPSAwLCBlbmQgPSBAbGVuZ3RoICovKSB7XG4gIHZhciBPID0gdG9PYmplY3QodGhpcyk7XG4gIHZhciBsZW4gPSB0b0xlbmd0aChPLmxlbmd0aCk7XG4gIHZhciB0byA9IHRvQWJzb2x1dGVJbmRleCh0YXJnZXQsIGxlbik7XG4gIHZhciBmcm9tID0gdG9BYnNvbHV0ZUluZGV4KHN0YXJ0LCBsZW4pO1xuICB2YXIgZW5kID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgPyBhcmd1bWVudHNbMl0gOiB1bmRlZmluZWQ7XG4gIHZhciBjb3VudCA9IE1hdGgubWluKChlbmQgPT09IHVuZGVmaW5lZCA/IGxlbiA6IHRvQWJzb2x1dGVJbmRleChlbmQsIGxlbikpIC0gZnJvbSwgbGVuIC0gdG8pO1xuICB2YXIgaW5jID0gMTtcbiAgaWYgKGZyb20gPCB0byAmJiB0byA8IGZyb20gKyBjb3VudCkge1xuICAgIGluYyA9IC0xO1xuICAgIGZyb20gKz0gY291bnQgLSAxO1xuICAgIHRvICs9IGNvdW50IC0gMTtcbiAgfVxuICB3aGlsZSAoY291bnQtLSA+IDApIHtcbiAgICBpZiAoZnJvbSBpbiBPKSBPW3RvXSA9IE9bZnJvbV07XG4gICAgZWxzZSBkZWxldGUgT1t0b107XG4gICAgdG8gKz0gaW5jO1xuICAgIGZyb20gKz0gaW5jO1xuICB9IHJldHVybiBPO1xufTtcbiIsIi8vIDIyLjEuMy42IEFycmF5LnByb3RvdHlwZS5maWxsKHZhbHVlLCBzdGFydCA9IDAsIGVuZCA9IHRoaXMubGVuZ3RoKVxuJ3VzZSBzdHJpY3QnO1xudmFyIHRvT2JqZWN0ID0gcmVxdWlyZSgnLi9fdG8tb2JqZWN0Jyk7XG52YXIgdG9BYnNvbHV0ZUluZGV4ID0gcmVxdWlyZSgnLi9fdG8tYWJzb2x1dGUtaW5kZXgnKTtcbnZhciB0b0xlbmd0aCA9IHJlcXVpcmUoJy4vX3RvLWxlbmd0aCcpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBmaWxsKHZhbHVlIC8qICwgc3RhcnQgPSAwLCBlbmQgPSBAbGVuZ3RoICovKSB7XG4gIHZhciBPID0gdG9PYmplY3QodGhpcyk7XG4gIHZhciBsZW5ndGggPSB0b0xlbmd0aChPLmxlbmd0aCk7XG4gIHZhciBhTGVuID0gYXJndW1lbnRzLmxlbmd0aDtcbiAgdmFyIGluZGV4ID0gdG9BYnNvbHV0ZUluZGV4KGFMZW4gPiAxID8gYXJndW1lbnRzWzFdIDogdW5kZWZpbmVkLCBsZW5ndGgpO1xuICB2YXIgZW5kID0gYUxlbiA+IDIgPyBhcmd1bWVudHNbMl0gOiB1bmRlZmluZWQ7XG4gIHZhciBlbmRQb3MgPSBlbmQgPT09IHVuZGVmaW5lZCA/IGxlbmd0aCA6IHRvQWJzb2x1dGVJbmRleChlbmQsIGxlbmd0aCk7XG4gIHdoaWxlIChlbmRQb3MgPiBpbmRleCkgT1tpbmRleCsrXSA9IHZhbHVlO1xuICByZXR1cm4gTztcbn07XG4iLCJ2YXIgZm9yT2YgPSByZXF1aXJlKCcuL19mb3Itb2YnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXRlciwgSVRFUkFUT1IpIHtcbiAgdmFyIHJlc3VsdCA9IFtdO1xuICBmb3JPZihpdGVyLCBmYWxzZSwgcmVzdWx0LnB1c2gsIHJlc3VsdCwgSVRFUkFUT1IpO1xuICByZXR1cm4gcmVzdWx0O1xufTtcbiIsIi8vIGZhbHNlIC0+IEFycmF5I2luZGV4T2Zcbi8vIHRydWUgIC0+IEFycmF5I2luY2x1ZGVzXG52YXIgdG9JT2JqZWN0ID0gcmVxdWlyZSgnLi9fdG8taW9iamVjdCcpO1xudmFyIHRvTGVuZ3RoID0gcmVxdWlyZSgnLi9fdG8tbGVuZ3RoJyk7XG52YXIgdG9BYnNvbHV0ZUluZGV4ID0gcmVxdWlyZSgnLi9fdG8tYWJzb2x1dGUtaW5kZXgnKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKElTX0lOQ0xVREVTKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoJHRoaXMsIGVsLCBmcm9tSW5kZXgpIHtcbiAgICB2YXIgTyA9IHRvSU9iamVjdCgkdGhpcyk7XG4gICAgdmFyIGxlbmd0aCA9IHRvTGVuZ3RoKE8ubGVuZ3RoKTtcbiAgICB2YXIgaW5kZXggPSB0b0Fic29sdXRlSW5kZXgoZnJvbUluZGV4LCBsZW5ndGgpO1xuICAgIHZhciB2YWx1ZTtcbiAgICAvLyBBcnJheSNpbmNsdWRlcyB1c2VzIFNhbWVWYWx1ZVplcm8gZXF1YWxpdHkgYWxnb3JpdGhtXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXNlbGYtY29tcGFyZVxuICAgIGlmIChJU19JTkNMVURFUyAmJiBlbCAhPSBlbCkgd2hpbGUgKGxlbmd0aCA+IGluZGV4KSB7XG4gICAgICB2YWx1ZSA9IE9baW5kZXgrK107XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2VsZi1jb21wYXJlXG4gICAgICBpZiAodmFsdWUgIT0gdmFsdWUpIHJldHVybiB0cnVlO1xuICAgIC8vIEFycmF5I2luZGV4T2YgaWdub3JlcyBob2xlcywgQXJyYXkjaW5jbHVkZXMgLSBub3RcbiAgICB9IGVsc2UgZm9yICg7bGVuZ3RoID4gaW5kZXg7IGluZGV4KyspIGlmIChJU19JTkNMVURFUyB8fCBpbmRleCBpbiBPKSB7XG4gICAgICBpZiAoT1tpbmRleF0gPT09IGVsKSByZXR1cm4gSVNfSU5DTFVERVMgfHwgaW5kZXggfHwgMDtcbiAgICB9IHJldHVybiAhSVNfSU5DTFVERVMgJiYgLTE7XG4gIH07XG59O1xuIiwiLy8gMCAtPiBBcnJheSNmb3JFYWNoXG4vLyAxIC0+IEFycmF5I21hcFxuLy8gMiAtPiBBcnJheSNmaWx0ZXJcbi8vIDMgLT4gQXJyYXkjc29tZVxuLy8gNCAtPiBBcnJheSNldmVyeVxuLy8gNSAtPiBBcnJheSNmaW5kXG4vLyA2IC0+IEFycmF5I2ZpbmRJbmRleFxudmFyIGN0eCA9IHJlcXVpcmUoJy4vX2N0eCcpO1xudmFyIElPYmplY3QgPSByZXF1aXJlKCcuL19pb2JqZWN0Jyk7XG52YXIgdG9PYmplY3QgPSByZXF1aXJlKCcuL190by1vYmplY3QnKTtcbnZhciB0b0xlbmd0aCA9IHJlcXVpcmUoJy4vX3RvLWxlbmd0aCcpO1xudmFyIGFzYyA9IHJlcXVpcmUoJy4vX2FycmF5LXNwZWNpZXMtY3JlYXRlJyk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChUWVBFLCAkY3JlYXRlKSB7XG4gIHZhciBJU19NQVAgPSBUWVBFID09IDE7XG4gIHZhciBJU19GSUxURVIgPSBUWVBFID09IDI7XG4gIHZhciBJU19TT01FID0gVFlQRSA9PSAzO1xuICB2YXIgSVNfRVZFUlkgPSBUWVBFID09IDQ7XG4gIHZhciBJU19GSU5EX0lOREVYID0gVFlQRSA9PSA2O1xuICB2YXIgTk9fSE9MRVMgPSBUWVBFID09IDUgfHwgSVNfRklORF9JTkRFWDtcbiAgdmFyIGNyZWF0ZSA9ICRjcmVhdGUgfHwgYXNjO1xuICByZXR1cm4gZnVuY3Rpb24gKCR0aGlzLCBjYWxsYmFja2ZuLCB0aGF0KSB7XG4gICAgdmFyIE8gPSB0b09iamVjdCgkdGhpcyk7XG4gICAgdmFyIHNlbGYgPSBJT2JqZWN0KE8pO1xuICAgIHZhciBmID0gY3R4KGNhbGxiYWNrZm4sIHRoYXQsIDMpO1xuICAgIHZhciBsZW5ndGggPSB0b0xlbmd0aChzZWxmLmxlbmd0aCk7XG4gICAgdmFyIGluZGV4ID0gMDtcbiAgICB2YXIgcmVzdWx0ID0gSVNfTUFQID8gY3JlYXRlKCR0aGlzLCBsZW5ndGgpIDogSVNfRklMVEVSID8gY3JlYXRlKCR0aGlzLCAwKSA6IHVuZGVmaW5lZDtcbiAgICB2YXIgdmFsLCByZXM7XG4gICAgZm9yICg7bGVuZ3RoID4gaW5kZXg7IGluZGV4KyspIGlmIChOT19IT0xFUyB8fCBpbmRleCBpbiBzZWxmKSB7XG4gICAgICB2YWwgPSBzZWxmW2luZGV4XTtcbiAgICAgIHJlcyA9IGYodmFsLCBpbmRleCwgTyk7XG4gICAgICBpZiAoVFlQRSkge1xuICAgICAgICBpZiAoSVNfTUFQKSByZXN1bHRbaW5kZXhdID0gcmVzOyAgIC8vIG1hcFxuICAgICAgICBlbHNlIGlmIChyZXMpIHN3aXRjaCAoVFlQRSkge1xuICAgICAgICAgIGNhc2UgMzogcmV0dXJuIHRydWU7ICAgICAgICAgICAgIC8vIHNvbWVcbiAgICAgICAgICBjYXNlIDU6IHJldHVybiB2YWw7ICAgICAgICAgICAgICAvLyBmaW5kXG4gICAgICAgICAgY2FzZSA2OiByZXR1cm4gaW5kZXg7ICAgICAgICAgICAgLy8gZmluZEluZGV4XG4gICAgICAgICAgY2FzZSAyOiByZXN1bHQucHVzaCh2YWwpOyAgICAgICAgLy8gZmlsdGVyXG4gICAgICAgIH0gZWxzZSBpZiAoSVNfRVZFUlkpIHJldHVybiBmYWxzZTsgLy8gZXZlcnlcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIElTX0ZJTkRfSU5ERVggPyAtMSA6IElTX1NPTUUgfHwgSVNfRVZFUlkgPyBJU19FVkVSWSA6IHJlc3VsdDtcbiAgfTtcbn07XG4iLCJ2YXIgYUZ1bmN0aW9uID0gcmVxdWlyZSgnLi9fYS1mdW5jdGlvbicpO1xudmFyIHRvT2JqZWN0ID0gcmVxdWlyZSgnLi9fdG8tb2JqZWN0Jyk7XG52YXIgSU9iamVjdCA9IHJlcXVpcmUoJy4vX2lvYmplY3QnKTtcbnZhciB0b0xlbmd0aCA9IHJlcXVpcmUoJy4vX3RvLWxlbmd0aCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uICh0aGF0LCBjYWxsYmFja2ZuLCBhTGVuLCBtZW1vLCBpc1JpZ2h0KSB7XG4gIGFGdW5jdGlvbihjYWxsYmFja2ZuKTtcbiAgdmFyIE8gPSB0b09iamVjdCh0aGF0KTtcbiAgdmFyIHNlbGYgPSBJT2JqZWN0KE8pO1xuICB2YXIgbGVuZ3RoID0gdG9MZW5ndGgoTy5sZW5ndGgpO1xuICB2YXIgaW5kZXggPSBpc1JpZ2h0ID8gbGVuZ3RoIC0gMSA6IDA7XG4gIHZhciBpID0gaXNSaWdodCA/IC0xIDogMTtcbiAgaWYgKGFMZW4gPCAyKSBmb3IgKDs7KSB7XG4gICAgaWYgKGluZGV4IGluIHNlbGYpIHtcbiAgICAgIG1lbW8gPSBzZWxmW2luZGV4XTtcbiAgICAgIGluZGV4ICs9IGk7XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgaW5kZXggKz0gaTtcbiAgICBpZiAoaXNSaWdodCA/IGluZGV4IDwgMCA6IGxlbmd0aCA8PSBpbmRleCkge1xuICAgICAgdGhyb3cgVHlwZUVycm9yKCdSZWR1Y2Ugb2YgZW1wdHkgYXJyYXkgd2l0aCBubyBpbml0aWFsIHZhbHVlJyk7XG4gICAgfVxuICB9XG4gIGZvciAoO2lzUmlnaHQgPyBpbmRleCA+PSAwIDogbGVuZ3RoID4gaW5kZXg7IGluZGV4ICs9IGkpIGlmIChpbmRleCBpbiBzZWxmKSB7XG4gICAgbWVtbyA9IGNhbGxiYWNrZm4obWVtbywgc2VsZltpbmRleF0sIGluZGV4LCBPKTtcbiAgfVxuICByZXR1cm4gbWVtbztcbn07XG4iLCJ2YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuL19pcy1vYmplY3QnKTtcbnZhciBpc0FycmF5ID0gcmVxdWlyZSgnLi9faXMtYXJyYXknKTtcbnZhciBTUEVDSUVTID0gcmVxdWlyZSgnLi9fd2tzJykoJ3NwZWNpZXMnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAob3JpZ2luYWwpIHtcbiAgdmFyIEM7XG4gIGlmIChpc0FycmF5KG9yaWdpbmFsKSkge1xuICAgIEMgPSBvcmlnaW5hbC5jb25zdHJ1Y3RvcjtcbiAgICAvLyBjcm9zcy1yZWFsbSBmYWxsYmFja1xuICAgIGlmICh0eXBlb2YgQyA9PSAnZnVuY3Rpb24nICYmIChDID09PSBBcnJheSB8fCBpc0FycmF5KEMucHJvdG90eXBlKSkpIEMgPSB1bmRlZmluZWQ7XG4gICAgaWYgKGlzT2JqZWN0KEMpKSB7XG4gICAgICBDID0gQ1tTUEVDSUVTXTtcbiAgICAgIGlmIChDID09PSBudWxsKSBDID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgfSByZXR1cm4gQyA9PT0gdW5kZWZpbmVkID8gQXJyYXkgOiBDO1xufTtcbiIsIi8vIDkuNC4yLjMgQXJyYXlTcGVjaWVzQ3JlYXRlKG9yaWdpbmFsQXJyYXksIGxlbmd0aClcbnZhciBzcGVjaWVzQ29uc3RydWN0b3IgPSByZXF1aXJlKCcuL19hcnJheS1zcGVjaWVzLWNvbnN0cnVjdG9yJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKG9yaWdpbmFsLCBsZW5ndGgpIHtcbiAgcmV0dXJuIG5ldyAoc3BlY2llc0NvbnN0cnVjdG9yKG9yaWdpbmFsKSkobGVuZ3RoKTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgYUZ1bmN0aW9uID0gcmVxdWlyZSgnLi9fYS1mdW5jdGlvbicpO1xudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9faXMtb2JqZWN0Jyk7XG52YXIgaW52b2tlID0gcmVxdWlyZSgnLi9faW52b2tlJyk7XG52YXIgYXJyYXlTbGljZSA9IFtdLnNsaWNlO1xudmFyIGZhY3RvcmllcyA9IHt9O1xuXG52YXIgY29uc3RydWN0ID0gZnVuY3Rpb24gKEYsIGxlbiwgYXJncykge1xuICBpZiAoIShsZW4gaW4gZmFjdG9yaWVzKSkge1xuICAgIGZvciAodmFyIG4gPSBbXSwgaSA9IDA7IGkgPCBsZW47IGkrKykgbltpXSA9ICdhWycgKyBpICsgJ10nO1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1uZXctZnVuY1xuICAgIGZhY3Rvcmllc1tsZW5dID0gRnVuY3Rpb24oJ0YsYScsICdyZXR1cm4gbmV3IEYoJyArIG4uam9pbignLCcpICsgJyknKTtcbiAgfSByZXR1cm4gZmFjdG9yaWVzW2xlbl0oRiwgYXJncyk7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IEZ1bmN0aW9uLmJpbmQgfHwgZnVuY3Rpb24gYmluZCh0aGF0IC8qICwgLi4uYXJncyAqLykge1xuICB2YXIgZm4gPSBhRnVuY3Rpb24odGhpcyk7XG4gIHZhciBwYXJ0QXJncyA9IGFycmF5U2xpY2UuY2FsbChhcmd1bWVudHMsIDEpO1xuICB2YXIgYm91bmQgPSBmdW5jdGlvbiAoLyogYXJncy4uLiAqLykge1xuICAgIHZhciBhcmdzID0gcGFydEFyZ3MuY29uY2F0KGFycmF5U2xpY2UuY2FsbChhcmd1bWVudHMpKTtcbiAgICByZXR1cm4gdGhpcyBpbnN0YW5jZW9mIGJvdW5kID8gY29uc3RydWN0KGZuLCBhcmdzLmxlbmd0aCwgYXJncykgOiBpbnZva2UoZm4sIGFyZ3MsIHRoYXQpO1xuICB9O1xuICBpZiAoaXNPYmplY3QoZm4ucHJvdG90eXBlKSkgYm91bmQucHJvdG90eXBlID0gZm4ucHJvdG90eXBlO1xuICByZXR1cm4gYm91bmQ7XG59O1xuIiwiLy8gZ2V0dGluZyB0YWcgZnJvbSAxOS4xLjMuNiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nKClcbnZhciBjb2YgPSByZXF1aXJlKCcuL19jb2YnKTtcbnZhciBUQUcgPSByZXF1aXJlKCcuL193a3MnKSgndG9TdHJpbmdUYWcnKTtcbi8vIEVTMyB3cm9uZyBoZXJlXG52YXIgQVJHID0gY29mKGZ1bmN0aW9uICgpIHsgcmV0dXJuIGFyZ3VtZW50czsgfSgpKSA9PSAnQXJndW1lbnRzJztcblxuLy8gZmFsbGJhY2sgZm9yIElFMTEgU2NyaXB0IEFjY2VzcyBEZW5pZWQgZXJyb3JcbnZhciB0cnlHZXQgPSBmdW5jdGlvbiAoaXQsIGtleSkge1xuICB0cnkge1xuICAgIHJldHVybiBpdFtrZXldO1xuICB9IGNhdGNoIChlKSB7IC8qIGVtcHR5ICovIH1cbn07XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIHZhciBPLCBULCBCO1xuICByZXR1cm4gaXQgPT09IHVuZGVmaW5lZCA/ICdVbmRlZmluZWQnIDogaXQgPT09IG51bGwgPyAnTnVsbCdcbiAgICAvLyBAQHRvU3RyaW5nVGFnIGNhc2VcbiAgICA6IHR5cGVvZiAoVCA9IHRyeUdldChPID0gT2JqZWN0KGl0KSwgVEFHKSkgPT0gJ3N0cmluZycgPyBUXG4gICAgLy8gYnVpbHRpblRhZyBjYXNlXG4gICAgOiBBUkcgPyBjb2YoTylcbiAgICAvLyBFUzMgYXJndW1lbnRzIGZhbGxiYWNrXG4gICAgOiAoQiA9IGNvZihPKSkgPT0gJ09iamVjdCcgJiYgdHlwZW9mIE8uY2FsbGVlID09ICdmdW5jdGlvbicgPyAnQXJndW1lbnRzJyA6IEI7XG59O1xuIiwidmFyIHRvU3RyaW5nID0ge30udG9TdHJpbmc7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIHJldHVybiB0b1N0cmluZy5jYWxsKGl0KS5zbGljZSg4LCAtMSk7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGRQID0gcmVxdWlyZSgnLi9fb2JqZWN0LWRwJykuZjtcbnZhciBjcmVhdGUgPSByZXF1aXJlKCcuL19vYmplY3QtY3JlYXRlJyk7XG52YXIgcmVkZWZpbmVBbGwgPSByZXF1aXJlKCcuL19yZWRlZmluZS1hbGwnKTtcbnZhciBjdHggPSByZXF1aXJlKCcuL19jdHgnKTtcbnZhciBhbkluc3RhbmNlID0gcmVxdWlyZSgnLi9fYW4taW5zdGFuY2UnKTtcbnZhciBmb3JPZiA9IHJlcXVpcmUoJy4vX2Zvci1vZicpO1xudmFyICRpdGVyRGVmaW5lID0gcmVxdWlyZSgnLi9faXRlci1kZWZpbmUnKTtcbnZhciBzdGVwID0gcmVxdWlyZSgnLi9faXRlci1zdGVwJyk7XG52YXIgc2V0U3BlY2llcyA9IHJlcXVpcmUoJy4vX3NldC1zcGVjaWVzJyk7XG52YXIgREVTQ1JJUFRPUlMgPSByZXF1aXJlKCcuL19kZXNjcmlwdG9ycycpO1xudmFyIGZhc3RLZXkgPSByZXF1aXJlKCcuL19tZXRhJykuZmFzdEtleTtcbnZhciB2YWxpZGF0ZSA9IHJlcXVpcmUoJy4vX3ZhbGlkYXRlLWNvbGxlY3Rpb24nKTtcbnZhciBTSVpFID0gREVTQ1JJUFRPUlMgPyAnX3MnIDogJ3NpemUnO1xuXG52YXIgZ2V0RW50cnkgPSBmdW5jdGlvbiAodGhhdCwga2V5KSB7XG4gIC8vIGZhc3QgY2FzZVxuICB2YXIgaW5kZXggPSBmYXN0S2V5KGtleSk7XG4gIHZhciBlbnRyeTtcbiAgaWYgKGluZGV4ICE9PSAnRicpIHJldHVybiB0aGF0Ll9pW2luZGV4XTtcbiAgLy8gZnJvemVuIG9iamVjdCBjYXNlXG4gIGZvciAoZW50cnkgPSB0aGF0Ll9mOyBlbnRyeTsgZW50cnkgPSBlbnRyeS5uKSB7XG4gICAgaWYgKGVudHJ5LmsgPT0ga2V5KSByZXR1cm4gZW50cnk7XG4gIH1cbn07XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBnZXRDb25zdHJ1Y3RvcjogZnVuY3Rpb24gKHdyYXBwZXIsIE5BTUUsIElTX01BUCwgQURERVIpIHtcbiAgICB2YXIgQyA9IHdyYXBwZXIoZnVuY3Rpb24gKHRoYXQsIGl0ZXJhYmxlKSB7XG4gICAgICBhbkluc3RhbmNlKHRoYXQsIEMsIE5BTUUsICdfaScpO1xuICAgICAgdGhhdC5fdCA9IE5BTUU7ICAgICAgICAgLy8gY29sbGVjdGlvbiB0eXBlXG4gICAgICB0aGF0Ll9pID0gY3JlYXRlKG51bGwpOyAvLyBpbmRleFxuICAgICAgdGhhdC5fZiA9IHVuZGVmaW5lZDsgICAgLy8gZmlyc3QgZW50cnlcbiAgICAgIHRoYXQuX2wgPSB1bmRlZmluZWQ7ICAgIC8vIGxhc3QgZW50cnlcbiAgICAgIHRoYXRbU0laRV0gPSAwOyAgICAgICAgIC8vIHNpemVcbiAgICAgIGlmIChpdGVyYWJsZSAhPSB1bmRlZmluZWQpIGZvck9mKGl0ZXJhYmxlLCBJU19NQVAsIHRoYXRbQURERVJdLCB0aGF0KTtcbiAgICB9KTtcbiAgICByZWRlZmluZUFsbChDLnByb3RvdHlwZSwge1xuICAgICAgLy8gMjMuMS4zLjEgTWFwLnByb3RvdHlwZS5jbGVhcigpXG4gICAgICAvLyAyMy4yLjMuMiBTZXQucHJvdG90eXBlLmNsZWFyKClcbiAgICAgIGNsZWFyOiBmdW5jdGlvbiBjbGVhcigpIHtcbiAgICAgICAgZm9yICh2YXIgdGhhdCA9IHZhbGlkYXRlKHRoaXMsIE5BTUUpLCBkYXRhID0gdGhhdC5faSwgZW50cnkgPSB0aGF0Ll9mOyBlbnRyeTsgZW50cnkgPSBlbnRyeS5uKSB7XG4gICAgICAgICAgZW50cnkuciA9IHRydWU7XG4gICAgICAgICAgaWYgKGVudHJ5LnApIGVudHJ5LnAgPSBlbnRyeS5wLm4gPSB1bmRlZmluZWQ7XG4gICAgICAgICAgZGVsZXRlIGRhdGFbZW50cnkuaV07XG4gICAgICAgIH1cbiAgICAgICAgdGhhdC5fZiA9IHRoYXQuX2wgPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoYXRbU0laRV0gPSAwO1xuICAgICAgfSxcbiAgICAgIC8vIDIzLjEuMy4zIE1hcC5wcm90b3R5cGUuZGVsZXRlKGtleSlcbiAgICAgIC8vIDIzLjIuMy40IFNldC5wcm90b3R5cGUuZGVsZXRlKHZhbHVlKVxuICAgICAgJ2RlbGV0ZSc6IGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgdmFyIHRoYXQgPSB2YWxpZGF0ZSh0aGlzLCBOQU1FKTtcbiAgICAgICAgdmFyIGVudHJ5ID0gZ2V0RW50cnkodGhhdCwga2V5KTtcbiAgICAgICAgaWYgKGVudHJ5KSB7XG4gICAgICAgICAgdmFyIG5leHQgPSBlbnRyeS5uO1xuICAgICAgICAgIHZhciBwcmV2ID0gZW50cnkucDtcbiAgICAgICAgICBkZWxldGUgdGhhdC5faVtlbnRyeS5pXTtcbiAgICAgICAgICBlbnRyeS5yID0gdHJ1ZTtcbiAgICAgICAgICBpZiAocHJldikgcHJldi5uID0gbmV4dDtcbiAgICAgICAgICBpZiAobmV4dCkgbmV4dC5wID0gcHJldjtcbiAgICAgICAgICBpZiAodGhhdC5fZiA9PSBlbnRyeSkgdGhhdC5fZiA9IG5leHQ7XG4gICAgICAgICAgaWYgKHRoYXQuX2wgPT0gZW50cnkpIHRoYXQuX2wgPSBwcmV2O1xuICAgICAgICAgIHRoYXRbU0laRV0tLTtcbiAgICAgICAgfSByZXR1cm4gISFlbnRyeTtcbiAgICAgIH0sXG4gICAgICAvLyAyMy4yLjMuNiBTZXQucHJvdG90eXBlLmZvckVhY2goY2FsbGJhY2tmbiwgdGhpc0FyZyA9IHVuZGVmaW5lZClcbiAgICAgIC8vIDIzLjEuMy41IE1hcC5wcm90b3R5cGUuZm9yRWFjaChjYWxsYmFja2ZuLCB0aGlzQXJnID0gdW5kZWZpbmVkKVxuICAgICAgZm9yRWFjaDogZnVuY3Rpb24gZm9yRWFjaChjYWxsYmFja2ZuIC8qICwgdGhhdCA9IHVuZGVmaW5lZCAqLykge1xuICAgICAgICB2YWxpZGF0ZSh0aGlzLCBOQU1FKTtcbiAgICAgICAgdmFyIGYgPSBjdHgoY2FsbGJhY2tmbiwgYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQsIDMpO1xuICAgICAgICB2YXIgZW50cnk7XG4gICAgICAgIHdoaWxlIChlbnRyeSA9IGVudHJ5ID8gZW50cnkubiA6IHRoaXMuX2YpIHtcbiAgICAgICAgICBmKGVudHJ5LnYsIGVudHJ5LmssIHRoaXMpO1xuICAgICAgICAgIC8vIHJldmVydCB0byB0aGUgbGFzdCBleGlzdGluZyBlbnRyeVxuICAgICAgICAgIHdoaWxlIChlbnRyeSAmJiBlbnRyeS5yKSBlbnRyeSA9IGVudHJ5LnA7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICAvLyAyMy4xLjMuNyBNYXAucHJvdG90eXBlLmhhcyhrZXkpXG4gICAgICAvLyAyMy4yLjMuNyBTZXQucHJvdG90eXBlLmhhcyh2YWx1ZSlcbiAgICAgIGhhczogZnVuY3Rpb24gaGFzKGtleSkge1xuICAgICAgICByZXR1cm4gISFnZXRFbnRyeSh2YWxpZGF0ZSh0aGlzLCBOQU1FKSwga2V5KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBpZiAoREVTQ1JJUFRPUlMpIGRQKEMucHJvdG90eXBlLCAnc2l6ZScsIHtcbiAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdmFsaWRhdGUodGhpcywgTkFNRSlbU0laRV07XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIEM7XG4gIH0sXG4gIGRlZjogZnVuY3Rpb24gKHRoYXQsIGtleSwgdmFsdWUpIHtcbiAgICB2YXIgZW50cnkgPSBnZXRFbnRyeSh0aGF0LCBrZXkpO1xuICAgIHZhciBwcmV2LCBpbmRleDtcbiAgICAvLyBjaGFuZ2UgZXhpc3RpbmcgZW50cnlcbiAgICBpZiAoZW50cnkpIHtcbiAgICAgIGVudHJ5LnYgPSB2YWx1ZTtcbiAgICAvLyBjcmVhdGUgbmV3IGVudHJ5XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoYXQuX2wgPSBlbnRyeSA9IHtcbiAgICAgICAgaTogaW5kZXggPSBmYXN0S2V5KGtleSwgdHJ1ZSksIC8vIDwtIGluZGV4XG4gICAgICAgIGs6IGtleSwgICAgICAgICAgICAgICAgICAgICAgICAvLyA8LSBrZXlcbiAgICAgICAgdjogdmFsdWUsICAgICAgICAgICAgICAgICAgICAgIC8vIDwtIHZhbHVlXG4gICAgICAgIHA6IHByZXYgPSB0aGF0Ll9sLCAgICAgICAgICAgICAvLyA8LSBwcmV2aW91cyBlbnRyeVxuICAgICAgICBuOiB1bmRlZmluZWQsICAgICAgICAgICAgICAgICAgLy8gPC0gbmV4dCBlbnRyeVxuICAgICAgICByOiBmYWxzZSAgICAgICAgICAgICAgICAgICAgICAgLy8gPC0gcmVtb3ZlZFxuICAgICAgfTtcbiAgICAgIGlmICghdGhhdC5fZikgdGhhdC5fZiA9IGVudHJ5O1xuICAgICAgaWYgKHByZXYpIHByZXYubiA9IGVudHJ5O1xuICAgICAgdGhhdFtTSVpFXSsrO1xuICAgICAgLy8gYWRkIHRvIGluZGV4XG4gICAgICBpZiAoaW5kZXggIT09ICdGJykgdGhhdC5faVtpbmRleF0gPSBlbnRyeTtcbiAgICB9IHJldHVybiB0aGF0O1xuICB9LFxuICBnZXRFbnRyeTogZ2V0RW50cnksXG4gIHNldFN0cm9uZzogZnVuY3Rpb24gKEMsIE5BTUUsIElTX01BUCkge1xuICAgIC8vIGFkZCAua2V5cywgLnZhbHVlcywgLmVudHJpZXMsIFtAQGl0ZXJhdG9yXVxuICAgIC8vIDIzLjEuMy40LCAyMy4xLjMuOCwgMjMuMS4zLjExLCAyMy4xLjMuMTIsIDIzLjIuMy41LCAyMy4yLjMuOCwgMjMuMi4zLjEwLCAyMy4yLjMuMTFcbiAgICAkaXRlckRlZmluZShDLCBOQU1FLCBmdW5jdGlvbiAoaXRlcmF0ZWQsIGtpbmQpIHtcbiAgICAgIHRoaXMuX3QgPSB2YWxpZGF0ZShpdGVyYXRlZCwgTkFNRSk7IC8vIHRhcmdldFxuICAgICAgdGhpcy5fayA9IGtpbmQ7ICAgICAgICAgICAgICAgICAgICAgLy8ga2luZFxuICAgICAgdGhpcy5fbCA9IHVuZGVmaW5lZDsgICAgICAgICAgICAgICAgLy8gcHJldmlvdXNcbiAgICB9LCBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgdGhhdCA9IHRoaXM7XG4gICAgICB2YXIga2luZCA9IHRoYXQuX2s7XG4gICAgICB2YXIgZW50cnkgPSB0aGF0Ll9sO1xuICAgICAgLy8gcmV2ZXJ0IHRvIHRoZSBsYXN0IGV4aXN0aW5nIGVudHJ5XG4gICAgICB3aGlsZSAoZW50cnkgJiYgZW50cnkucikgZW50cnkgPSBlbnRyeS5wO1xuICAgICAgLy8gZ2V0IG5leHQgZW50cnlcbiAgICAgIGlmICghdGhhdC5fdCB8fCAhKHRoYXQuX2wgPSBlbnRyeSA9IGVudHJ5ID8gZW50cnkubiA6IHRoYXQuX3QuX2YpKSB7XG4gICAgICAgIC8vIG9yIGZpbmlzaCB0aGUgaXRlcmF0aW9uXG4gICAgICAgIHRoYXQuX3QgPSB1bmRlZmluZWQ7XG4gICAgICAgIHJldHVybiBzdGVwKDEpO1xuICAgICAgfVxuICAgICAgLy8gcmV0dXJuIHN0ZXAgYnkga2luZFxuICAgICAgaWYgKGtpbmQgPT0gJ2tleXMnKSByZXR1cm4gc3RlcCgwLCBlbnRyeS5rKTtcbiAgICAgIGlmIChraW5kID09ICd2YWx1ZXMnKSByZXR1cm4gc3RlcCgwLCBlbnRyeS52KTtcbiAgICAgIHJldHVybiBzdGVwKDAsIFtlbnRyeS5rLCBlbnRyeS52XSk7XG4gICAgfSwgSVNfTUFQID8gJ2VudHJpZXMnIDogJ3ZhbHVlcycsICFJU19NQVAsIHRydWUpO1xuXG4gICAgLy8gYWRkIFtAQHNwZWNpZXNdLCAyMy4xLjIuMiwgMjMuMi4yLjJcbiAgICBzZXRTcGVjaWVzKE5BTUUpO1xuICB9XG59O1xuIiwiLy8gaHR0cHM6Ly9naXRodWIuY29tL0RhdmlkQnJ1YW50L01hcC1TZXQucHJvdG90eXBlLnRvSlNPTlxudmFyIGNsYXNzb2YgPSByZXF1aXJlKCcuL19jbGFzc29mJyk7XG52YXIgZnJvbSA9IHJlcXVpcmUoJy4vX2FycmF5LWZyb20taXRlcmFibGUnKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKE5BTUUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIHRvSlNPTigpIHtcbiAgICBpZiAoY2xhc3NvZih0aGlzKSAhPSBOQU1FKSB0aHJvdyBUeXBlRXJyb3IoTkFNRSArIFwiI3RvSlNPTiBpc24ndCBnZW5lcmljXCIpO1xuICAgIHJldHVybiBmcm9tKHRoaXMpO1xuICB9O1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciByZWRlZmluZUFsbCA9IHJlcXVpcmUoJy4vX3JlZGVmaW5lLWFsbCcpO1xudmFyIGdldFdlYWsgPSByZXF1aXJlKCcuL19tZXRhJykuZ2V0V2VhaztcbnZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4vX2FuLW9iamVjdCcpO1xudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9faXMtb2JqZWN0Jyk7XG52YXIgYW5JbnN0YW5jZSA9IHJlcXVpcmUoJy4vX2FuLWluc3RhbmNlJyk7XG52YXIgZm9yT2YgPSByZXF1aXJlKCcuL19mb3Itb2YnKTtcbnZhciBjcmVhdGVBcnJheU1ldGhvZCA9IHJlcXVpcmUoJy4vX2FycmF5LW1ldGhvZHMnKTtcbnZhciAkaGFzID0gcmVxdWlyZSgnLi9faGFzJyk7XG52YXIgdmFsaWRhdGUgPSByZXF1aXJlKCcuL192YWxpZGF0ZS1jb2xsZWN0aW9uJyk7XG52YXIgYXJyYXlGaW5kID0gY3JlYXRlQXJyYXlNZXRob2QoNSk7XG52YXIgYXJyYXlGaW5kSW5kZXggPSBjcmVhdGVBcnJheU1ldGhvZCg2KTtcbnZhciBpZCA9IDA7XG5cbi8vIGZhbGxiYWNrIGZvciB1bmNhdWdodCBmcm96ZW4ga2V5c1xudmFyIHVuY2F1Z2h0RnJvemVuU3RvcmUgPSBmdW5jdGlvbiAodGhhdCkge1xuICByZXR1cm4gdGhhdC5fbCB8fCAodGhhdC5fbCA9IG5ldyBVbmNhdWdodEZyb3plblN0b3JlKCkpO1xufTtcbnZhciBVbmNhdWdodEZyb3plblN0b3JlID0gZnVuY3Rpb24gKCkge1xuICB0aGlzLmEgPSBbXTtcbn07XG52YXIgZmluZFVuY2F1Z2h0RnJvemVuID0gZnVuY3Rpb24gKHN0b3JlLCBrZXkpIHtcbiAgcmV0dXJuIGFycmF5RmluZChzdG9yZS5hLCBmdW5jdGlvbiAoaXQpIHtcbiAgICByZXR1cm4gaXRbMF0gPT09IGtleTtcbiAgfSk7XG59O1xuVW5jYXVnaHRGcm96ZW5TdG9yZS5wcm90b3R5cGUgPSB7XG4gIGdldDogZnVuY3Rpb24gKGtleSkge1xuICAgIHZhciBlbnRyeSA9IGZpbmRVbmNhdWdodEZyb3plbih0aGlzLCBrZXkpO1xuICAgIGlmIChlbnRyeSkgcmV0dXJuIGVudHJ5WzFdO1xuICB9LFxuICBoYXM6IGZ1bmN0aW9uIChrZXkpIHtcbiAgICByZXR1cm4gISFmaW5kVW5jYXVnaHRGcm96ZW4odGhpcywga2V5KTtcbiAgfSxcbiAgc2V0OiBmdW5jdGlvbiAoa2V5LCB2YWx1ZSkge1xuICAgIHZhciBlbnRyeSA9IGZpbmRVbmNhdWdodEZyb3plbih0aGlzLCBrZXkpO1xuICAgIGlmIChlbnRyeSkgZW50cnlbMV0gPSB2YWx1ZTtcbiAgICBlbHNlIHRoaXMuYS5wdXNoKFtrZXksIHZhbHVlXSk7XG4gIH0sXG4gICdkZWxldGUnOiBmdW5jdGlvbiAoa2V5KSB7XG4gICAgdmFyIGluZGV4ID0gYXJyYXlGaW5kSW5kZXgodGhpcy5hLCBmdW5jdGlvbiAoaXQpIHtcbiAgICAgIHJldHVybiBpdFswXSA9PT0ga2V5O1xuICAgIH0pO1xuICAgIGlmICh+aW5kZXgpIHRoaXMuYS5zcGxpY2UoaW5kZXgsIDEpO1xuICAgIHJldHVybiAhIX5pbmRleDtcbiAgfVxufTtcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIGdldENvbnN0cnVjdG9yOiBmdW5jdGlvbiAod3JhcHBlciwgTkFNRSwgSVNfTUFQLCBBRERFUikge1xuICAgIHZhciBDID0gd3JhcHBlcihmdW5jdGlvbiAodGhhdCwgaXRlcmFibGUpIHtcbiAgICAgIGFuSW5zdGFuY2UodGhhdCwgQywgTkFNRSwgJ19pJyk7XG4gICAgICB0aGF0Ll90ID0gTkFNRTsgICAgICAvLyBjb2xsZWN0aW9uIHR5cGVcbiAgICAgIHRoYXQuX2kgPSBpZCsrOyAgICAgIC8vIGNvbGxlY3Rpb24gaWRcbiAgICAgIHRoYXQuX2wgPSB1bmRlZmluZWQ7IC8vIGxlYWsgc3RvcmUgZm9yIHVuY2F1Z2h0IGZyb3plbiBvYmplY3RzXG4gICAgICBpZiAoaXRlcmFibGUgIT0gdW5kZWZpbmVkKSBmb3JPZihpdGVyYWJsZSwgSVNfTUFQLCB0aGF0W0FEREVSXSwgdGhhdCk7XG4gICAgfSk7XG4gICAgcmVkZWZpbmVBbGwoQy5wcm90b3R5cGUsIHtcbiAgICAgIC8vIDIzLjMuMy4yIFdlYWtNYXAucHJvdG90eXBlLmRlbGV0ZShrZXkpXG4gICAgICAvLyAyMy40LjMuMyBXZWFrU2V0LnByb3RvdHlwZS5kZWxldGUodmFsdWUpXG4gICAgICAnZGVsZXRlJzogZnVuY3Rpb24gKGtleSkge1xuICAgICAgICBpZiAoIWlzT2JqZWN0KGtleSkpIHJldHVybiBmYWxzZTtcbiAgICAgICAgdmFyIGRhdGEgPSBnZXRXZWFrKGtleSk7XG4gICAgICAgIGlmIChkYXRhID09PSB0cnVlKSByZXR1cm4gdW5jYXVnaHRGcm96ZW5TdG9yZSh2YWxpZGF0ZSh0aGlzLCBOQU1FKSlbJ2RlbGV0ZSddKGtleSk7XG4gICAgICAgIHJldHVybiBkYXRhICYmICRoYXMoZGF0YSwgdGhpcy5faSkgJiYgZGVsZXRlIGRhdGFbdGhpcy5faV07XG4gICAgICB9LFxuICAgICAgLy8gMjMuMy4zLjQgV2Vha01hcC5wcm90b3R5cGUuaGFzKGtleSlcbiAgICAgIC8vIDIzLjQuMy40IFdlYWtTZXQucHJvdG90eXBlLmhhcyh2YWx1ZSlcbiAgICAgIGhhczogZnVuY3Rpb24gaGFzKGtleSkge1xuICAgICAgICBpZiAoIWlzT2JqZWN0KGtleSkpIHJldHVybiBmYWxzZTtcbiAgICAgICAgdmFyIGRhdGEgPSBnZXRXZWFrKGtleSk7XG4gICAgICAgIGlmIChkYXRhID09PSB0cnVlKSByZXR1cm4gdW5jYXVnaHRGcm96ZW5TdG9yZSh2YWxpZGF0ZSh0aGlzLCBOQU1FKSkuaGFzKGtleSk7XG4gICAgICAgIHJldHVybiBkYXRhICYmICRoYXMoZGF0YSwgdGhpcy5faSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIEM7XG4gIH0sXG4gIGRlZjogZnVuY3Rpb24gKHRoYXQsIGtleSwgdmFsdWUpIHtcbiAgICB2YXIgZGF0YSA9IGdldFdlYWsoYW5PYmplY3Qoa2V5KSwgdHJ1ZSk7XG4gICAgaWYgKGRhdGEgPT09IHRydWUpIHVuY2F1Z2h0RnJvemVuU3RvcmUodGhhdCkuc2V0KGtleSwgdmFsdWUpO1xuICAgIGVsc2UgZGF0YVt0aGF0Ll9pXSA9IHZhbHVlO1xuICAgIHJldHVybiB0aGF0O1xuICB9LFxuICB1ZnN0b3JlOiB1bmNhdWdodEZyb3plblN0b3JlXG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4vX2dsb2JhbCcpO1xudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciByZWRlZmluZSA9IHJlcXVpcmUoJy4vX3JlZGVmaW5lJyk7XG52YXIgcmVkZWZpbmVBbGwgPSByZXF1aXJlKCcuL19yZWRlZmluZS1hbGwnKTtcbnZhciBtZXRhID0gcmVxdWlyZSgnLi9fbWV0YScpO1xudmFyIGZvck9mID0gcmVxdWlyZSgnLi9fZm9yLW9mJyk7XG52YXIgYW5JbnN0YW5jZSA9IHJlcXVpcmUoJy4vX2FuLWluc3RhbmNlJyk7XG52YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuL19pcy1vYmplY3QnKTtcbnZhciBmYWlscyA9IHJlcXVpcmUoJy4vX2ZhaWxzJyk7XG52YXIgJGl0ZXJEZXRlY3QgPSByZXF1aXJlKCcuL19pdGVyLWRldGVjdCcpO1xudmFyIHNldFRvU3RyaW5nVGFnID0gcmVxdWlyZSgnLi9fc2V0LXRvLXN0cmluZy10YWcnKTtcbnZhciBpbmhlcml0SWZSZXF1aXJlZCA9IHJlcXVpcmUoJy4vX2luaGVyaXQtaWYtcmVxdWlyZWQnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoTkFNRSwgd3JhcHBlciwgbWV0aG9kcywgY29tbW9uLCBJU19NQVAsIElTX1dFQUspIHtcbiAgdmFyIEJhc2UgPSBnbG9iYWxbTkFNRV07XG4gIHZhciBDID0gQmFzZTtcbiAgdmFyIEFEREVSID0gSVNfTUFQID8gJ3NldCcgOiAnYWRkJztcbiAgdmFyIHByb3RvID0gQyAmJiBDLnByb3RvdHlwZTtcbiAgdmFyIE8gPSB7fTtcbiAgdmFyIGZpeE1ldGhvZCA9IGZ1bmN0aW9uIChLRVkpIHtcbiAgICB2YXIgZm4gPSBwcm90b1tLRVldO1xuICAgIHJlZGVmaW5lKHByb3RvLCBLRVksXG4gICAgICBLRVkgPT0gJ2RlbGV0ZScgPyBmdW5jdGlvbiAoYSkge1xuICAgICAgICByZXR1cm4gSVNfV0VBSyAmJiAhaXNPYmplY3QoYSkgPyBmYWxzZSA6IGZuLmNhbGwodGhpcywgYSA9PT0gMCA/IDAgOiBhKTtcbiAgICAgIH0gOiBLRVkgPT0gJ2hhcycgPyBmdW5jdGlvbiBoYXMoYSkge1xuICAgICAgICByZXR1cm4gSVNfV0VBSyAmJiAhaXNPYmplY3QoYSkgPyBmYWxzZSA6IGZuLmNhbGwodGhpcywgYSA9PT0gMCA/IDAgOiBhKTtcbiAgICAgIH0gOiBLRVkgPT0gJ2dldCcgPyBmdW5jdGlvbiBnZXQoYSkge1xuICAgICAgICByZXR1cm4gSVNfV0VBSyAmJiAhaXNPYmplY3QoYSkgPyB1bmRlZmluZWQgOiBmbi5jYWxsKHRoaXMsIGEgPT09IDAgPyAwIDogYSk7XG4gICAgICB9IDogS0VZID09ICdhZGQnID8gZnVuY3Rpb24gYWRkKGEpIHsgZm4uY2FsbCh0aGlzLCBhID09PSAwID8gMCA6IGEpOyByZXR1cm4gdGhpczsgfVxuICAgICAgICA6IGZ1bmN0aW9uIHNldChhLCBiKSB7IGZuLmNhbGwodGhpcywgYSA9PT0gMCA/IDAgOiBhLCBiKTsgcmV0dXJuIHRoaXM7IH1cbiAgICApO1xuICB9O1xuICBpZiAodHlwZW9mIEMgIT0gJ2Z1bmN0aW9uJyB8fCAhKElTX1dFQUsgfHwgcHJvdG8uZm9yRWFjaCAmJiAhZmFpbHMoZnVuY3Rpb24gKCkge1xuICAgIG5ldyBDKCkuZW50cmllcygpLm5leHQoKTtcbiAgfSkpKSB7XG4gICAgLy8gY3JlYXRlIGNvbGxlY3Rpb24gY29uc3RydWN0b3JcbiAgICBDID0gY29tbW9uLmdldENvbnN0cnVjdG9yKHdyYXBwZXIsIE5BTUUsIElTX01BUCwgQURERVIpO1xuICAgIHJlZGVmaW5lQWxsKEMucHJvdG90eXBlLCBtZXRob2RzKTtcbiAgICBtZXRhLk5FRUQgPSB0cnVlO1xuICB9IGVsc2Uge1xuICAgIHZhciBpbnN0YW5jZSA9IG5ldyBDKCk7XG4gICAgLy8gZWFybHkgaW1wbGVtZW50YXRpb25zIG5vdCBzdXBwb3J0cyBjaGFpbmluZ1xuICAgIHZhciBIQVNOVF9DSEFJTklORyA9IGluc3RhbmNlW0FEREVSXShJU19XRUFLID8ge30gOiAtMCwgMSkgIT0gaW5zdGFuY2U7XG4gICAgLy8gVjggfiAgQ2hyb21pdW0gNDAtIHdlYWstY29sbGVjdGlvbnMgdGhyb3dzIG9uIHByaW1pdGl2ZXMsIGJ1dCBzaG91bGQgcmV0dXJuIGZhbHNlXG4gICAgdmFyIFRIUk9XU19PTl9QUklNSVRJVkVTID0gZmFpbHMoZnVuY3Rpb24gKCkgeyBpbnN0YW5jZS5oYXMoMSk7IH0pO1xuICAgIC8vIG1vc3QgZWFybHkgaW1wbGVtZW50YXRpb25zIGRvZXNuJ3Qgc3VwcG9ydHMgaXRlcmFibGVzLCBtb3N0IG1vZGVybiAtIG5vdCBjbG9zZSBpdCBjb3JyZWN0bHlcbiAgICB2YXIgQUNDRVBUX0lURVJBQkxFUyA9ICRpdGVyRGV0ZWN0KGZ1bmN0aW9uIChpdGVyKSB7IG5ldyBDKGl0ZXIpOyB9KTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1uZXdcbiAgICAvLyBmb3IgZWFybHkgaW1wbGVtZW50YXRpb25zIC0wIGFuZCArMCBub3QgdGhlIHNhbWVcbiAgICB2YXIgQlVHR1lfWkVSTyA9ICFJU19XRUFLICYmIGZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgICAgIC8vIFY4IH4gQ2hyb21pdW0gNDItIGZhaWxzIG9ubHkgd2l0aCA1KyBlbGVtZW50c1xuICAgICAgdmFyICRpbnN0YW5jZSA9IG5ldyBDKCk7XG4gICAgICB2YXIgaW5kZXggPSA1O1xuICAgICAgd2hpbGUgKGluZGV4LS0pICRpbnN0YW5jZVtBRERFUl0oaW5kZXgsIGluZGV4KTtcbiAgICAgIHJldHVybiAhJGluc3RhbmNlLmhhcygtMCk7XG4gICAgfSk7XG4gICAgaWYgKCFBQ0NFUFRfSVRFUkFCTEVTKSB7XG4gICAgICBDID0gd3JhcHBlcihmdW5jdGlvbiAodGFyZ2V0LCBpdGVyYWJsZSkge1xuICAgICAgICBhbkluc3RhbmNlKHRhcmdldCwgQywgTkFNRSk7XG4gICAgICAgIHZhciB0aGF0ID0gaW5oZXJpdElmUmVxdWlyZWQobmV3IEJhc2UoKSwgdGFyZ2V0LCBDKTtcbiAgICAgICAgaWYgKGl0ZXJhYmxlICE9IHVuZGVmaW5lZCkgZm9yT2YoaXRlcmFibGUsIElTX01BUCwgdGhhdFtBRERFUl0sIHRoYXQpO1xuICAgICAgICByZXR1cm4gdGhhdDtcbiAgICAgIH0pO1xuICAgICAgQy5wcm90b3R5cGUgPSBwcm90bztcbiAgICAgIHByb3RvLmNvbnN0cnVjdG9yID0gQztcbiAgICB9XG4gICAgaWYgKFRIUk9XU19PTl9QUklNSVRJVkVTIHx8IEJVR0dZX1pFUk8pIHtcbiAgICAgIGZpeE1ldGhvZCgnZGVsZXRlJyk7XG4gICAgICBmaXhNZXRob2QoJ2hhcycpO1xuICAgICAgSVNfTUFQICYmIGZpeE1ldGhvZCgnZ2V0Jyk7XG4gICAgfVxuICAgIGlmIChCVUdHWV9aRVJPIHx8IEhBU05UX0NIQUlOSU5HKSBmaXhNZXRob2QoQURERVIpO1xuICAgIC8vIHdlYWsgY29sbGVjdGlvbnMgc2hvdWxkIG5vdCBjb250YWlucyAuY2xlYXIgbWV0aG9kXG4gICAgaWYgKElTX1dFQUsgJiYgcHJvdG8uY2xlYXIpIGRlbGV0ZSBwcm90by5jbGVhcjtcbiAgfVxuXG4gIHNldFRvU3RyaW5nVGFnKEMsIE5BTUUpO1xuXG4gIE9bTkFNRV0gPSBDO1xuICAkZXhwb3J0KCRleHBvcnQuRyArICRleHBvcnQuVyArICRleHBvcnQuRiAqIChDICE9IEJhc2UpLCBPKTtcblxuICBpZiAoIUlTX1dFQUspIGNvbW1vbi5zZXRTdHJvbmcoQywgTkFNRSwgSVNfTUFQKTtcblxuICByZXR1cm4gQztcbn07XG4iLCJ2YXIgY29yZSA9IG1vZHVsZS5leHBvcnRzID0geyB2ZXJzaW9uOiAnMi41LjMnIH07XG5pZiAodHlwZW9mIF9fZSA9PSAnbnVtYmVyJykgX19lID0gY29yZTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bmRlZlxuIiwiJ3VzZSBzdHJpY3QnO1xudmFyICRkZWZpbmVQcm9wZXJ0eSA9IHJlcXVpcmUoJy4vX29iamVjdC1kcCcpO1xudmFyIGNyZWF0ZURlc2MgPSByZXF1aXJlKCcuL19wcm9wZXJ0eS1kZXNjJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKG9iamVjdCwgaW5kZXgsIHZhbHVlKSB7XG4gIGlmIChpbmRleCBpbiBvYmplY3QpICRkZWZpbmVQcm9wZXJ0eS5mKG9iamVjdCwgaW5kZXgsIGNyZWF0ZURlc2MoMCwgdmFsdWUpKTtcbiAgZWxzZSBvYmplY3RbaW5kZXhdID0gdmFsdWU7XG59O1xuIiwiLy8gb3B0aW9uYWwgLyBzaW1wbGUgY29udGV4dCBiaW5kaW5nXG52YXIgYUZ1bmN0aW9uID0gcmVxdWlyZSgnLi9fYS1mdW5jdGlvbicpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoZm4sIHRoYXQsIGxlbmd0aCkge1xuICBhRnVuY3Rpb24oZm4pO1xuICBpZiAodGhhdCA9PT0gdW5kZWZpbmVkKSByZXR1cm4gZm47XG4gIHN3aXRjaCAobGVuZ3RoKSB7XG4gICAgY2FzZSAxOiByZXR1cm4gZnVuY3Rpb24gKGEpIHtcbiAgICAgIHJldHVybiBmbi5jYWxsKHRoYXQsIGEpO1xuICAgIH07XG4gICAgY2FzZSAyOiByZXR1cm4gZnVuY3Rpb24gKGEsIGIpIHtcbiAgICAgIHJldHVybiBmbi5jYWxsKHRoYXQsIGEsIGIpO1xuICAgIH07XG4gICAgY2FzZSAzOiByZXR1cm4gZnVuY3Rpb24gKGEsIGIsIGMpIHtcbiAgICAgIHJldHVybiBmbi5jYWxsKHRoYXQsIGEsIGIsIGMpO1xuICAgIH07XG4gIH1cbiAgcmV0dXJuIGZ1bmN0aW9uICgvKiAuLi5hcmdzICovKSB7XG4gICAgcmV0dXJuIGZuLmFwcGx5KHRoYXQsIGFyZ3VtZW50cyk7XG4gIH07XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuLy8gMjAuMy40LjM2IC8gMTUuOS41LjQzIERhdGUucHJvdG90eXBlLnRvSVNPU3RyaW5nKClcbnZhciBmYWlscyA9IHJlcXVpcmUoJy4vX2ZhaWxzJyk7XG52YXIgZ2V0VGltZSA9IERhdGUucHJvdG90eXBlLmdldFRpbWU7XG52YXIgJHRvSVNPU3RyaW5nID0gRGF0ZS5wcm90b3R5cGUudG9JU09TdHJpbmc7XG5cbnZhciBseiA9IGZ1bmN0aW9uIChudW0pIHtcbiAgcmV0dXJuIG51bSA+IDkgPyBudW0gOiAnMCcgKyBudW07XG59O1xuXG4vLyBQaGFudG9tSlMgLyBvbGQgV2ViS2l0IGhhcyBhIGJyb2tlbiBpbXBsZW1lbnRhdGlvbnNcbm1vZHVsZS5leHBvcnRzID0gKGZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuICR0b0lTT1N0cmluZy5jYWxsKG5ldyBEYXRlKC01ZTEzIC0gMSkpICE9ICcwMzg1LTA3LTI1VDA3OjA2OjM5Ljk5OVonO1xufSkgfHwgIWZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgJHRvSVNPU3RyaW5nLmNhbGwobmV3IERhdGUoTmFOKSk7XG59KSkgPyBmdW5jdGlvbiB0b0lTT1N0cmluZygpIHtcbiAgaWYgKCFpc0Zpbml0ZShnZXRUaW1lLmNhbGwodGhpcykpKSB0aHJvdyBSYW5nZUVycm9yKCdJbnZhbGlkIHRpbWUgdmFsdWUnKTtcbiAgdmFyIGQgPSB0aGlzO1xuICB2YXIgeSA9IGQuZ2V0VVRDRnVsbFllYXIoKTtcbiAgdmFyIG0gPSBkLmdldFVUQ01pbGxpc2Vjb25kcygpO1xuICB2YXIgcyA9IHkgPCAwID8gJy0nIDogeSA+IDk5OTkgPyAnKycgOiAnJztcbiAgcmV0dXJuIHMgKyAoJzAwMDAwJyArIE1hdGguYWJzKHkpKS5zbGljZShzID8gLTYgOiAtNCkgK1xuICAgICctJyArIGx6KGQuZ2V0VVRDTW9udGgoKSArIDEpICsgJy0nICsgbHooZC5nZXRVVENEYXRlKCkpICtcbiAgICAnVCcgKyBseihkLmdldFVUQ0hvdXJzKCkpICsgJzonICsgbHooZC5nZXRVVENNaW51dGVzKCkpICtcbiAgICAnOicgKyBseihkLmdldFVUQ1NlY29uZHMoKSkgKyAnLicgKyAobSA+IDk5ID8gbSA6ICcwJyArIGx6KG0pKSArICdaJztcbn0gOiAkdG9JU09TdHJpbmc7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuL19hbi1vYmplY3QnKTtcbnZhciB0b1ByaW1pdGl2ZSA9IHJlcXVpcmUoJy4vX3RvLXByaW1pdGl2ZScpO1xudmFyIE5VTUJFUiA9ICdudW1iZXInO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChoaW50KSB7XG4gIGlmIChoaW50ICE9PSAnc3RyaW5nJyAmJiBoaW50ICE9PSBOVU1CRVIgJiYgaGludCAhPT0gJ2RlZmF1bHQnKSB0aHJvdyBUeXBlRXJyb3IoJ0luY29ycmVjdCBoaW50Jyk7XG4gIHJldHVybiB0b1ByaW1pdGl2ZShhbk9iamVjdCh0aGlzKSwgaGludCAhPSBOVU1CRVIpO1xufTtcbiIsIi8vIDcuMi4xIFJlcXVpcmVPYmplY3RDb2VyY2libGUoYXJndW1lbnQpXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICBpZiAoaXQgPT0gdW5kZWZpbmVkKSB0aHJvdyBUeXBlRXJyb3IoXCJDYW4ndCBjYWxsIG1ldGhvZCBvbiAgXCIgKyBpdCk7XG4gIHJldHVybiBpdDtcbn07XG4iLCIvLyBUaGFuaydzIElFOCBmb3IgaGlzIGZ1bm55IGRlZmluZVByb3BlcnR5XG5tb2R1bGUuZXhwb3J0cyA9ICFyZXF1aXJlKCcuL19mYWlscycpKGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh7fSwgJ2EnLCB7IGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gNzsgfSB9KS5hICE9IDc7XG59KTtcbiIsInZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4vX2lzLW9iamVjdCcpO1xudmFyIGRvY3VtZW50ID0gcmVxdWlyZSgnLi9fZ2xvYmFsJykuZG9jdW1lbnQ7XG4vLyB0eXBlb2YgZG9jdW1lbnQuY3JlYXRlRWxlbWVudCBpcyAnb2JqZWN0JyBpbiBvbGQgSUVcbnZhciBpcyA9IGlzT2JqZWN0KGRvY3VtZW50KSAmJiBpc09iamVjdChkb2N1bWVudC5jcmVhdGVFbGVtZW50KTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIHJldHVybiBpcyA/IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoaXQpIDoge307XG59O1xuIiwiLy8gSUUgOC0gZG9uJ3QgZW51bSBidWcga2V5c1xubW9kdWxlLmV4cG9ydHMgPSAoXG4gICdjb25zdHJ1Y3RvcixoYXNPd25Qcm9wZXJ0eSxpc1Byb3RvdHlwZU9mLHByb3BlcnR5SXNFbnVtZXJhYmxlLHRvTG9jYWxlU3RyaW5nLHRvU3RyaW5nLHZhbHVlT2YnXG4pLnNwbGl0KCcsJyk7XG4iLCIvLyBhbGwgZW51bWVyYWJsZSBvYmplY3Qga2V5cywgaW5jbHVkZXMgc3ltYm9sc1xudmFyIGdldEtleXMgPSByZXF1aXJlKCcuL19vYmplY3Qta2V5cycpO1xudmFyIGdPUFMgPSByZXF1aXJlKCcuL19vYmplY3QtZ29wcycpO1xudmFyIHBJRSA9IHJlcXVpcmUoJy4vX29iamVjdC1waWUnKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIHZhciByZXN1bHQgPSBnZXRLZXlzKGl0KTtcbiAgdmFyIGdldFN5bWJvbHMgPSBnT1BTLmY7XG4gIGlmIChnZXRTeW1ib2xzKSB7XG4gICAgdmFyIHN5bWJvbHMgPSBnZXRTeW1ib2xzKGl0KTtcbiAgICB2YXIgaXNFbnVtID0gcElFLmY7XG4gICAgdmFyIGkgPSAwO1xuICAgIHZhciBrZXk7XG4gICAgd2hpbGUgKHN5bWJvbHMubGVuZ3RoID4gaSkgaWYgKGlzRW51bS5jYWxsKGl0LCBrZXkgPSBzeW1ib2xzW2krK10pKSByZXN1bHQucHVzaChrZXkpO1xuICB9IHJldHVybiByZXN1bHQ7XG59O1xuIiwidmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4vX2dsb2JhbCcpO1xudmFyIGNvcmUgPSByZXF1aXJlKCcuL19jb3JlJyk7XG52YXIgaGlkZSA9IHJlcXVpcmUoJy4vX2hpZGUnKTtcbnZhciByZWRlZmluZSA9IHJlcXVpcmUoJy4vX3JlZGVmaW5lJyk7XG52YXIgY3R4ID0gcmVxdWlyZSgnLi9fY3R4Jyk7XG52YXIgUFJPVE9UWVBFID0gJ3Byb3RvdHlwZSc7XG5cbnZhciAkZXhwb3J0ID0gZnVuY3Rpb24gKHR5cGUsIG5hbWUsIHNvdXJjZSkge1xuICB2YXIgSVNfRk9SQ0VEID0gdHlwZSAmICRleHBvcnQuRjtcbiAgdmFyIElTX0dMT0JBTCA9IHR5cGUgJiAkZXhwb3J0Lkc7XG4gIHZhciBJU19TVEFUSUMgPSB0eXBlICYgJGV4cG9ydC5TO1xuICB2YXIgSVNfUFJPVE8gPSB0eXBlICYgJGV4cG9ydC5QO1xuICB2YXIgSVNfQklORCA9IHR5cGUgJiAkZXhwb3J0LkI7XG4gIHZhciB0YXJnZXQgPSBJU19HTE9CQUwgPyBnbG9iYWwgOiBJU19TVEFUSUMgPyBnbG9iYWxbbmFtZV0gfHwgKGdsb2JhbFtuYW1lXSA9IHt9KSA6IChnbG9iYWxbbmFtZV0gfHwge30pW1BST1RPVFlQRV07XG4gIHZhciBleHBvcnRzID0gSVNfR0xPQkFMID8gY29yZSA6IGNvcmVbbmFtZV0gfHwgKGNvcmVbbmFtZV0gPSB7fSk7XG4gIHZhciBleHBQcm90byA9IGV4cG9ydHNbUFJPVE9UWVBFXSB8fCAoZXhwb3J0c1tQUk9UT1RZUEVdID0ge30pO1xuICB2YXIga2V5LCBvd24sIG91dCwgZXhwO1xuICBpZiAoSVNfR0xPQkFMKSBzb3VyY2UgPSBuYW1lO1xuICBmb3IgKGtleSBpbiBzb3VyY2UpIHtcbiAgICAvLyBjb250YWlucyBpbiBuYXRpdmVcbiAgICBvd24gPSAhSVNfRk9SQ0VEICYmIHRhcmdldCAmJiB0YXJnZXRba2V5XSAhPT0gdW5kZWZpbmVkO1xuICAgIC8vIGV4cG9ydCBuYXRpdmUgb3IgcGFzc2VkXG4gICAgb3V0ID0gKG93biA/IHRhcmdldCA6IHNvdXJjZSlba2V5XTtcbiAgICAvLyBiaW5kIHRpbWVycyB0byBnbG9iYWwgZm9yIGNhbGwgZnJvbSBleHBvcnQgY29udGV4dFxuICAgIGV4cCA9IElTX0JJTkQgJiYgb3duID8gY3R4KG91dCwgZ2xvYmFsKSA6IElTX1BST1RPICYmIHR5cGVvZiBvdXQgPT0gJ2Z1bmN0aW9uJyA/IGN0eChGdW5jdGlvbi5jYWxsLCBvdXQpIDogb3V0O1xuICAgIC8vIGV4dGVuZCBnbG9iYWxcbiAgICBpZiAodGFyZ2V0KSByZWRlZmluZSh0YXJnZXQsIGtleSwgb3V0LCB0eXBlICYgJGV4cG9ydC5VKTtcbiAgICAvLyBleHBvcnRcbiAgICBpZiAoZXhwb3J0c1trZXldICE9IG91dCkgaGlkZShleHBvcnRzLCBrZXksIGV4cCk7XG4gICAgaWYgKElTX1BST1RPICYmIGV4cFByb3RvW2tleV0gIT0gb3V0KSBleHBQcm90b1trZXldID0gb3V0O1xuICB9XG59O1xuZ2xvYmFsLmNvcmUgPSBjb3JlO1xuLy8gdHlwZSBiaXRtYXBcbiRleHBvcnQuRiA9IDE7ICAgLy8gZm9yY2VkXG4kZXhwb3J0LkcgPSAyOyAgIC8vIGdsb2JhbFxuJGV4cG9ydC5TID0gNDsgICAvLyBzdGF0aWNcbiRleHBvcnQuUCA9IDg7ICAgLy8gcHJvdG9cbiRleHBvcnQuQiA9IDE2OyAgLy8gYmluZFxuJGV4cG9ydC5XID0gMzI7ICAvLyB3cmFwXG4kZXhwb3J0LlUgPSA2NDsgIC8vIHNhZmVcbiRleHBvcnQuUiA9IDEyODsgLy8gcmVhbCBwcm90byBtZXRob2QgZm9yIGBsaWJyYXJ5YFxubW9kdWxlLmV4cG9ydHMgPSAkZXhwb3J0O1xuIiwidmFyIE1BVENIID0gcmVxdWlyZSgnLi9fd2tzJykoJ21hdGNoJyk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChLRVkpIHtcbiAgdmFyIHJlID0gLy4vO1xuICB0cnkge1xuICAgICcvLi8nW0tFWV0ocmUpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgdHJ5IHtcbiAgICAgIHJlW01BVENIXSA9IGZhbHNlO1xuICAgICAgcmV0dXJuICEnLy4vJ1tLRVldKHJlKTtcbiAgICB9IGNhdGNoIChmKSB7IC8qIGVtcHR5ICovIH1cbiAgfSByZXR1cm4gdHJ1ZTtcbn07XG4iLCJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChleGVjKSB7XG4gIHRyeSB7XG4gICAgcmV0dXJuICEhZXhlYygpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgaGlkZSA9IHJlcXVpcmUoJy4vX2hpZGUnKTtcbnZhciByZWRlZmluZSA9IHJlcXVpcmUoJy4vX3JlZGVmaW5lJyk7XG52YXIgZmFpbHMgPSByZXF1aXJlKCcuL19mYWlscycpO1xudmFyIGRlZmluZWQgPSByZXF1aXJlKCcuL19kZWZpbmVkJyk7XG52YXIgd2tzID0gcmVxdWlyZSgnLi9fd2tzJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKEtFWSwgbGVuZ3RoLCBleGVjKSB7XG4gIHZhciBTWU1CT0wgPSB3a3MoS0VZKTtcbiAgdmFyIGZucyA9IGV4ZWMoZGVmaW5lZCwgU1lNQk9MLCAnJ1tLRVldKTtcbiAgdmFyIHN0cmZuID0gZm5zWzBdO1xuICB2YXIgcnhmbiA9IGZuc1sxXTtcbiAgaWYgKGZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgTyA9IHt9O1xuICAgIE9bU1lNQk9MXSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIDc7IH07XG4gICAgcmV0dXJuICcnW0tFWV0oTykgIT0gNztcbiAgfSkpIHtcbiAgICByZWRlZmluZShTdHJpbmcucHJvdG90eXBlLCBLRVksIHN0cmZuKTtcbiAgICBoaWRlKFJlZ0V4cC5wcm90b3R5cGUsIFNZTUJPTCwgbGVuZ3RoID09IDJcbiAgICAgIC8vIDIxLjIuNS44IFJlZ0V4cC5wcm90b3R5cGVbQEByZXBsYWNlXShzdHJpbmcsIHJlcGxhY2VWYWx1ZSlcbiAgICAgIC8vIDIxLjIuNS4xMSBSZWdFeHAucHJvdG90eXBlW0BAc3BsaXRdKHN0cmluZywgbGltaXQpXG4gICAgICA/IGZ1bmN0aW9uIChzdHJpbmcsIGFyZykgeyByZXR1cm4gcnhmbi5jYWxsKHN0cmluZywgdGhpcywgYXJnKTsgfVxuICAgICAgLy8gMjEuMi41LjYgUmVnRXhwLnByb3RvdHlwZVtAQG1hdGNoXShzdHJpbmcpXG4gICAgICAvLyAyMS4yLjUuOSBSZWdFeHAucHJvdG90eXBlW0BAc2VhcmNoXShzdHJpbmcpXG4gICAgICA6IGZ1bmN0aW9uIChzdHJpbmcpIHsgcmV0dXJuIHJ4Zm4uY2FsbChzdHJpbmcsIHRoaXMpOyB9XG4gICAgKTtcbiAgfVxufTtcbiIsIid1c2Ugc3RyaWN0Jztcbi8vIDIxLjIuNS4zIGdldCBSZWdFeHAucHJvdG90eXBlLmZsYWdzXG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuL19hbi1vYmplY3QnKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKCkge1xuICB2YXIgdGhhdCA9IGFuT2JqZWN0KHRoaXMpO1xuICB2YXIgcmVzdWx0ID0gJyc7XG4gIGlmICh0aGF0Lmdsb2JhbCkgcmVzdWx0ICs9ICdnJztcbiAgaWYgKHRoYXQuaWdub3JlQ2FzZSkgcmVzdWx0ICs9ICdpJztcbiAgaWYgKHRoYXQubXVsdGlsaW5lKSByZXN1bHQgKz0gJ20nO1xuICBpZiAodGhhdC51bmljb2RlKSByZXN1bHQgKz0gJ3UnO1xuICBpZiAodGhhdC5zdGlja3kpIHJlc3VsdCArPSAneSc7XG4gIHJldHVybiByZXN1bHQ7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9wcm9wb3NhbC1mbGF0TWFwLyNzZWMtRmxhdHRlbkludG9BcnJheVxudmFyIGlzQXJyYXkgPSByZXF1aXJlKCcuL19pcy1hcnJheScpO1xudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9faXMtb2JqZWN0Jyk7XG52YXIgdG9MZW5ndGggPSByZXF1aXJlKCcuL190by1sZW5ndGgnKTtcbnZhciBjdHggPSByZXF1aXJlKCcuL19jdHgnKTtcbnZhciBJU19DT05DQVRfU1BSRUFEQUJMRSA9IHJlcXVpcmUoJy4vX3drcycpKCdpc0NvbmNhdFNwcmVhZGFibGUnKTtcblxuZnVuY3Rpb24gZmxhdHRlbkludG9BcnJheSh0YXJnZXQsIG9yaWdpbmFsLCBzb3VyY2UsIHNvdXJjZUxlbiwgc3RhcnQsIGRlcHRoLCBtYXBwZXIsIHRoaXNBcmcpIHtcbiAgdmFyIHRhcmdldEluZGV4ID0gc3RhcnQ7XG4gIHZhciBzb3VyY2VJbmRleCA9IDA7XG4gIHZhciBtYXBGbiA9IG1hcHBlciA/IGN0eChtYXBwZXIsIHRoaXNBcmcsIDMpIDogZmFsc2U7XG4gIHZhciBlbGVtZW50LCBzcHJlYWRhYmxlO1xuXG4gIHdoaWxlIChzb3VyY2VJbmRleCA8IHNvdXJjZUxlbikge1xuICAgIGlmIChzb3VyY2VJbmRleCBpbiBzb3VyY2UpIHtcbiAgICAgIGVsZW1lbnQgPSBtYXBGbiA/IG1hcEZuKHNvdXJjZVtzb3VyY2VJbmRleF0sIHNvdXJjZUluZGV4LCBvcmlnaW5hbCkgOiBzb3VyY2Vbc291cmNlSW5kZXhdO1xuXG4gICAgICBzcHJlYWRhYmxlID0gZmFsc2U7XG4gICAgICBpZiAoaXNPYmplY3QoZWxlbWVudCkpIHtcbiAgICAgICAgc3ByZWFkYWJsZSA9IGVsZW1lbnRbSVNfQ09OQ0FUX1NQUkVBREFCTEVdO1xuICAgICAgICBzcHJlYWRhYmxlID0gc3ByZWFkYWJsZSAhPT0gdW5kZWZpbmVkID8gISFzcHJlYWRhYmxlIDogaXNBcnJheShlbGVtZW50KTtcbiAgICAgIH1cblxuICAgICAgaWYgKHNwcmVhZGFibGUgJiYgZGVwdGggPiAwKSB7XG4gICAgICAgIHRhcmdldEluZGV4ID0gZmxhdHRlbkludG9BcnJheSh0YXJnZXQsIG9yaWdpbmFsLCBlbGVtZW50LCB0b0xlbmd0aChlbGVtZW50Lmxlbmd0aCksIHRhcmdldEluZGV4LCBkZXB0aCAtIDEpIC0gMTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmICh0YXJnZXRJbmRleCA+PSAweDFmZmZmZmZmZmZmZmZmKSB0aHJvdyBUeXBlRXJyb3IoKTtcbiAgICAgICAgdGFyZ2V0W3RhcmdldEluZGV4XSA9IGVsZW1lbnQ7XG4gICAgICB9XG5cbiAgICAgIHRhcmdldEluZGV4Kys7XG4gICAgfVxuICAgIHNvdXJjZUluZGV4Kys7XG4gIH1cbiAgcmV0dXJuIHRhcmdldEluZGV4O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGZsYXR0ZW5JbnRvQXJyYXk7XG4iLCJ2YXIgY3R4ID0gcmVxdWlyZSgnLi9fY3R4Jyk7XG52YXIgY2FsbCA9IHJlcXVpcmUoJy4vX2l0ZXItY2FsbCcpO1xudmFyIGlzQXJyYXlJdGVyID0gcmVxdWlyZSgnLi9faXMtYXJyYXktaXRlcicpO1xudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi9fYW4tb2JqZWN0Jyk7XG52YXIgdG9MZW5ndGggPSByZXF1aXJlKCcuL190by1sZW5ndGgnKTtcbnZhciBnZXRJdGVyRm4gPSByZXF1aXJlKCcuL2NvcmUuZ2V0LWl0ZXJhdG9yLW1ldGhvZCcpO1xudmFyIEJSRUFLID0ge307XG52YXIgUkVUVVJOID0ge307XG52YXIgZXhwb3J0cyA9IG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0ZXJhYmxlLCBlbnRyaWVzLCBmbiwgdGhhdCwgSVRFUkFUT1IpIHtcbiAgdmFyIGl0ZXJGbiA9IElURVJBVE9SID8gZnVuY3Rpb24gKCkgeyByZXR1cm4gaXRlcmFibGU7IH0gOiBnZXRJdGVyRm4oaXRlcmFibGUpO1xuICB2YXIgZiA9IGN0eChmbiwgdGhhdCwgZW50cmllcyA/IDIgOiAxKTtcbiAgdmFyIGluZGV4ID0gMDtcbiAgdmFyIGxlbmd0aCwgc3RlcCwgaXRlcmF0b3IsIHJlc3VsdDtcbiAgaWYgKHR5cGVvZiBpdGVyRm4gIT0gJ2Z1bmN0aW9uJykgdGhyb3cgVHlwZUVycm9yKGl0ZXJhYmxlICsgJyBpcyBub3QgaXRlcmFibGUhJyk7XG4gIC8vIGZhc3QgY2FzZSBmb3IgYXJyYXlzIHdpdGggZGVmYXVsdCBpdGVyYXRvclxuICBpZiAoaXNBcnJheUl0ZXIoaXRlckZuKSkgZm9yIChsZW5ndGggPSB0b0xlbmd0aChpdGVyYWJsZS5sZW5ndGgpOyBsZW5ndGggPiBpbmRleDsgaW5kZXgrKykge1xuICAgIHJlc3VsdCA9IGVudHJpZXMgPyBmKGFuT2JqZWN0KHN0ZXAgPSBpdGVyYWJsZVtpbmRleF0pWzBdLCBzdGVwWzFdKSA6IGYoaXRlcmFibGVbaW5kZXhdKTtcbiAgICBpZiAocmVzdWx0ID09PSBCUkVBSyB8fCByZXN1bHQgPT09IFJFVFVSTikgcmV0dXJuIHJlc3VsdDtcbiAgfSBlbHNlIGZvciAoaXRlcmF0b3IgPSBpdGVyRm4uY2FsbChpdGVyYWJsZSk7ICEoc3RlcCA9IGl0ZXJhdG9yLm5leHQoKSkuZG9uZTspIHtcbiAgICByZXN1bHQgPSBjYWxsKGl0ZXJhdG9yLCBmLCBzdGVwLnZhbHVlLCBlbnRyaWVzKTtcbiAgICBpZiAocmVzdWx0ID09PSBCUkVBSyB8fCByZXN1bHQgPT09IFJFVFVSTikgcmV0dXJuIHJlc3VsdDtcbiAgfVxufTtcbmV4cG9ydHMuQlJFQUsgPSBCUkVBSztcbmV4cG9ydHMuUkVUVVJOID0gUkVUVVJOO1xuIiwiLy8gaHR0cHM6Ly9naXRodWIuY29tL3psb2lyb2NrL2NvcmUtanMvaXNzdWVzLzg2I2lzc3VlY29tbWVudC0xMTU3NTkwMjhcbnZhciBnbG9iYWwgPSBtb2R1bGUuZXhwb3J0cyA9IHR5cGVvZiB3aW5kb3cgIT0gJ3VuZGVmaW5lZCcgJiYgd2luZG93Lk1hdGggPT0gTWF0aFxuICA/IHdpbmRvdyA6IHR5cGVvZiBzZWxmICE9ICd1bmRlZmluZWQnICYmIHNlbGYuTWF0aCA9PSBNYXRoID8gc2VsZlxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tbmV3LWZ1bmNcbiAgOiBGdW5jdGlvbigncmV0dXJuIHRoaXMnKSgpO1xuaWYgKHR5cGVvZiBfX2cgPT0gJ251bWJlcicpIF9fZyA9IGdsb2JhbDsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bmRlZlxuIiwidmFyIGhhc093blByb3BlcnR5ID0ge30uaGFzT3duUHJvcGVydHk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCwga2V5KSB7XG4gIHJldHVybiBoYXNPd25Qcm9wZXJ0eS5jYWxsKGl0LCBrZXkpO1xufTtcbiIsInZhciBkUCA9IHJlcXVpcmUoJy4vX29iamVjdC1kcCcpO1xudmFyIGNyZWF0ZURlc2MgPSByZXF1aXJlKCcuL19wcm9wZXJ0eS1kZXNjJyk7XG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vX2Rlc2NyaXB0b3JzJykgPyBmdW5jdGlvbiAob2JqZWN0LCBrZXksIHZhbHVlKSB7XG4gIHJldHVybiBkUC5mKG9iamVjdCwga2V5LCBjcmVhdGVEZXNjKDEsIHZhbHVlKSk7XG59IDogZnVuY3Rpb24gKG9iamVjdCwga2V5LCB2YWx1ZSkge1xuICBvYmplY3Rba2V5XSA9IHZhbHVlO1xuICByZXR1cm4gb2JqZWN0O1xufTtcbiIsInZhciBkb2N1bWVudCA9IHJlcXVpcmUoJy4vX2dsb2JhbCcpLmRvY3VtZW50O1xubW9kdWxlLmV4cG9ydHMgPSBkb2N1bWVudCAmJiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7XG4iLCJtb2R1bGUuZXhwb3J0cyA9ICFyZXF1aXJlKCcuL19kZXNjcmlwdG9ycycpICYmICFyZXF1aXJlKCcuL19mYWlscycpKGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShyZXF1aXJlKCcuL19kb20tY3JlYXRlJykoJ2RpdicpLCAnYScsIHsgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiA3OyB9IH0pLmEgIT0gNztcbn0pO1xuIiwidmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9faXMtb2JqZWN0Jyk7XG52YXIgc2V0UHJvdG90eXBlT2YgPSByZXF1aXJlKCcuL19zZXQtcHJvdG8nKS5zZXQ7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uICh0aGF0LCB0YXJnZXQsIEMpIHtcbiAgdmFyIFMgPSB0YXJnZXQuY29uc3RydWN0b3I7XG4gIHZhciBQO1xuICBpZiAoUyAhPT0gQyAmJiB0eXBlb2YgUyA9PSAnZnVuY3Rpb24nICYmIChQID0gUy5wcm90b3R5cGUpICE9PSBDLnByb3RvdHlwZSAmJiBpc09iamVjdChQKSAmJiBzZXRQcm90b3R5cGVPZikge1xuICAgIHNldFByb3RvdHlwZU9mKHRoYXQsIFApO1xuICB9IHJldHVybiB0aGF0O1xufTtcbiIsIi8vIGZhc3QgYXBwbHksIGh0dHA6Ly9qc3BlcmYubG5raXQuY29tL2Zhc3QtYXBwbHkvNVxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoZm4sIGFyZ3MsIHRoYXQpIHtcbiAgdmFyIHVuID0gdGhhdCA9PT0gdW5kZWZpbmVkO1xuICBzd2l0Y2ggKGFyZ3MubGVuZ3RoKSB7XG4gICAgY2FzZSAwOiByZXR1cm4gdW4gPyBmbigpXG4gICAgICAgICAgICAgICAgICAgICAgOiBmbi5jYWxsKHRoYXQpO1xuICAgIGNhc2UgMTogcmV0dXJuIHVuID8gZm4oYXJnc1swXSlcbiAgICAgICAgICAgICAgICAgICAgICA6IGZuLmNhbGwodGhhdCwgYXJnc1swXSk7XG4gICAgY2FzZSAyOiByZXR1cm4gdW4gPyBmbihhcmdzWzBdLCBhcmdzWzFdKVxuICAgICAgICAgICAgICAgICAgICAgIDogZm4uY2FsbCh0aGF0LCBhcmdzWzBdLCBhcmdzWzFdKTtcbiAgICBjYXNlIDM6IHJldHVybiB1biA/IGZuKGFyZ3NbMF0sIGFyZ3NbMV0sIGFyZ3NbMl0pXG4gICAgICAgICAgICAgICAgICAgICAgOiBmbi5jYWxsKHRoYXQsIGFyZ3NbMF0sIGFyZ3NbMV0sIGFyZ3NbMl0pO1xuICAgIGNhc2UgNDogcmV0dXJuIHVuID8gZm4oYXJnc1swXSwgYXJnc1sxXSwgYXJnc1syXSwgYXJnc1szXSlcbiAgICAgICAgICAgICAgICAgICAgICA6IGZuLmNhbGwodGhhdCwgYXJnc1swXSwgYXJnc1sxXSwgYXJnc1syXSwgYXJnc1szXSk7XG4gIH0gcmV0dXJuIGZuLmFwcGx5KHRoYXQsIGFyZ3MpO1xufTtcbiIsIi8vIGZhbGxiYWNrIGZvciBub24tYXJyYXktbGlrZSBFUzMgYW5kIG5vbi1lbnVtZXJhYmxlIG9sZCBWOCBzdHJpbmdzXG52YXIgY29mID0gcmVxdWlyZSgnLi9fY29mJyk7XG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcHJvdG90eXBlLWJ1aWx0aW5zXG5tb2R1bGUuZXhwb3J0cyA9IE9iamVjdCgneicpLnByb3BlcnR5SXNFbnVtZXJhYmxlKDApID8gT2JqZWN0IDogZnVuY3Rpb24gKGl0KSB7XG4gIHJldHVybiBjb2YoaXQpID09ICdTdHJpbmcnID8gaXQuc3BsaXQoJycpIDogT2JqZWN0KGl0KTtcbn07XG4iLCIvLyBjaGVjayBvbiBkZWZhdWx0IEFycmF5IGl0ZXJhdG9yXG52YXIgSXRlcmF0b3JzID0gcmVxdWlyZSgnLi9faXRlcmF0b3JzJyk7XG52YXIgSVRFUkFUT1IgPSByZXF1aXJlKCcuL193a3MnKSgnaXRlcmF0b3InKTtcbnZhciBBcnJheVByb3RvID0gQXJyYXkucHJvdG90eXBlO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICByZXR1cm4gaXQgIT09IHVuZGVmaW5lZCAmJiAoSXRlcmF0b3JzLkFycmF5ID09PSBpdCB8fCBBcnJheVByb3RvW0lURVJBVE9SXSA9PT0gaXQpO1xufTtcbiIsIi8vIDcuMi4yIElzQXJyYXkoYXJndW1lbnQpXG52YXIgY29mID0gcmVxdWlyZSgnLi9fY29mJyk7XG5tb2R1bGUuZXhwb3J0cyA9IEFycmF5LmlzQXJyYXkgfHwgZnVuY3Rpb24gaXNBcnJheShhcmcpIHtcbiAgcmV0dXJuIGNvZihhcmcpID09ICdBcnJheSc7XG59O1xuIiwiLy8gMjAuMS4yLjMgTnVtYmVyLmlzSW50ZWdlcihudW1iZXIpXG52YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuL19pcy1vYmplY3QnKTtcbnZhciBmbG9vciA9IE1hdGguZmxvb3I7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGlzSW50ZWdlcihpdCkge1xuICByZXR1cm4gIWlzT2JqZWN0KGl0KSAmJiBpc0Zpbml0ZShpdCkgJiYgZmxvb3IoaXQpID09PSBpdDtcbn07XG4iLCJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICByZXR1cm4gdHlwZW9mIGl0ID09PSAnb2JqZWN0JyA/IGl0ICE9PSBudWxsIDogdHlwZW9mIGl0ID09PSAnZnVuY3Rpb24nO1xufTtcbiIsIi8vIDcuMi44IElzUmVnRXhwKGFyZ3VtZW50KVxudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9faXMtb2JqZWN0Jyk7XG52YXIgY29mID0gcmVxdWlyZSgnLi9fY29mJyk7XG52YXIgTUFUQ0ggPSByZXF1aXJlKCcuL193a3MnKSgnbWF0Y2gnKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIHZhciBpc1JlZ0V4cDtcbiAgcmV0dXJuIGlzT2JqZWN0KGl0KSAmJiAoKGlzUmVnRXhwID0gaXRbTUFUQ0hdKSAhPT0gdW5kZWZpbmVkID8gISFpc1JlZ0V4cCA6IGNvZihpdCkgPT0gJ1JlZ0V4cCcpO1xufTtcbiIsIi8vIGNhbGwgc29tZXRoaW5nIG9uIGl0ZXJhdG9yIHN0ZXAgd2l0aCBzYWZlIGNsb3Npbmcgb24gZXJyb3JcbnZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4vX2FuLW9iamVjdCcpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXRlcmF0b3IsIGZuLCB2YWx1ZSwgZW50cmllcykge1xuICB0cnkge1xuICAgIHJldHVybiBlbnRyaWVzID8gZm4oYW5PYmplY3QodmFsdWUpWzBdLCB2YWx1ZVsxXSkgOiBmbih2YWx1ZSk7XG4gIC8vIDcuNC42IEl0ZXJhdG9yQ2xvc2UoaXRlcmF0b3IsIGNvbXBsZXRpb24pXG4gIH0gY2F0Y2ggKGUpIHtcbiAgICB2YXIgcmV0ID0gaXRlcmF0b3JbJ3JldHVybiddO1xuICAgIGlmIChyZXQgIT09IHVuZGVmaW5lZCkgYW5PYmplY3QocmV0LmNhbGwoaXRlcmF0b3IpKTtcbiAgICB0aHJvdyBlO1xuICB9XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGNyZWF0ZSA9IHJlcXVpcmUoJy4vX29iamVjdC1jcmVhdGUnKTtcbnZhciBkZXNjcmlwdG9yID0gcmVxdWlyZSgnLi9fcHJvcGVydHktZGVzYycpO1xudmFyIHNldFRvU3RyaW5nVGFnID0gcmVxdWlyZSgnLi9fc2V0LXRvLXN0cmluZy10YWcnKTtcbnZhciBJdGVyYXRvclByb3RvdHlwZSA9IHt9O1xuXG4vLyAyNS4xLjIuMS4xICVJdGVyYXRvclByb3RvdHlwZSVbQEBpdGVyYXRvcl0oKVxucmVxdWlyZSgnLi9faGlkZScpKEl0ZXJhdG9yUHJvdG90eXBlLCByZXF1aXJlKCcuL193a3MnKSgnaXRlcmF0b3InKSwgZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpczsgfSk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKENvbnN0cnVjdG9yLCBOQU1FLCBuZXh0KSB7XG4gIENvbnN0cnVjdG9yLnByb3RvdHlwZSA9IGNyZWF0ZShJdGVyYXRvclByb3RvdHlwZSwgeyBuZXh0OiBkZXNjcmlwdG9yKDEsIG5leHQpIH0pO1xuICBzZXRUb1N0cmluZ1RhZyhDb25zdHJ1Y3RvciwgTkFNRSArICcgSXRlcmF0b3InKTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgTElCUkFSWSA9IHJlcXVpcmUoJy4vX2xpYnJhcnknKTtcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgcmVkZWZpbmUgPSByZXF1aXJlKCcuL19yZWRlZmluZScpO1xudmFyIGhpZGUgPSByZXF1aXJlKCcuL19oaWRlJyk7XG52YXIgaGFzID0gcmVxdWlyZSgnLi9faGFzJyk7XG52YXIgSXRlcmF0b3JzID0gcmVxdWlyZSgnLi9faXRlcmF0b3JzJyk7XG52YXIgJGl0ZXJDcmVhdGUgPSByZXF1aXJlKCcuL19pdGVyLWNyZWF0ZScpO1xudmFyIHNldFRvU3RyaW5nVGFnID0gcmVxdWlyZSgnLi9fc2V0LXRvLXN0cmluZy10YWcnKTtcbnZhciBnZXRQcm90b3R5cGVPZiA9IHJlcXVpcmUoJy4vX29iamVjdC1ncG8nKTtcbnZhciBJVEVSQVRPUiA9IHJlcXVpcmUoJy4vX3drcycpKCdpdGVyYXRvcicpO1xudmFyIEJVR0dZID0gIShbXS5rZXlzICYmICduZXh0JyBpbiBbXS5rZXlzKCkpOyAvLyBTYWZhcmkgaGFzIGJ1Z2d5IGl0ZXJhdG9ycyB3L28gYG5leHRgXG52YXIgRkZfSVRFUkFUT1IgPSAnQEBpdGVyYXRvcic7XG52YXIgS0VZUyA9ICdrZXlzJztcbnZhciBWQUxVRVMgPSAndmFsdWVzJztcblxudmFyIHJldHVyblRoaXMgPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChCYXNlLCBOQU1FLCBDb25zdHJ1Y3RvciwgbmV4dCwgREVGQVVMVCwgSVNfU0VULCBGT1JDRUQpIHtcbiAgJGl0ZXJDcmVhdGUoQ29uc3RydWN0b3IsIE5BTUUsIG5leHQpO1xuICB2YXIgZ2V0TWV0aG9kID0gZnVuY3Rpb24gKGtpbmQpIHtcbiAgICBpZiAoIUJVR0dZICYmIGtpbmQgaW4gcHJvdG8pIHJldHVybiBwcm90b1traW5kXTtcbiAgICBzd2l0Y2ggKGtpbmQpIHtcbiAgICAgIGNhc2UgS0VZUzogcmV0dXJuIGZ1bmN0aW9uIGtleXMoKSB7IHJldHVybiBuZXcgQ29uc3RydWN0b3IodGhpcywga2luZCk7IH07XG4gICAgICBjYXNlIFZBTFVFUzogcmV0dXJuIGZ1bmN0aW9uIHZhbHVlcygpIHsgcmV0dXJuIG5ldyBDb25zdHJ1Y3Rvcih0aGlzLCBraW5kKTsgfTtcbiAgICB9IHJldHVybiBmdW5jdGlvbiBlbnRyaWVzKCkgeyByZXR1cm4gbmV3IENvbnN0cnVjdG9yKHRoaXMsIGtpbmQpOyB9O1xuICB9O1xuICB2YXIgVEFHID0gTkFNRSArICcgSXRlcmF0b3InO1xuICB2YXIgREVGX1ZBTFVFUyA9IERFRkFVTFQgPT0gVkFMVUVTO1xuICB2YXIgVkFMVUVTX0JVRyA9IGZhbHNlO1xuICB2YXIgcHJvdG8gPSBCYXNlLnByb3RvdHlwZTtcbiAgdmFyICRuYXRpdmUgPSBwcm90b1tJVEVSQVRPUl0gfHwgcHJvdG9bRkZfSVRFUkFUT1JdIHx8IERFRkFVTFQgJiYgcHJvdG9bREVGQVVMVF07XG4gIHZhciAkZGVmYXVsdCA9ICghQlVHR1kgJiYgJG5hdGl2ZSkgfHwgZ2V0TWV0aG9kKERFRkFVTFQpO1xuICB2YXIgJGVudHJpZXMgPSBERUZBVUxUID8gIURFRl9WQUxVRVMgPyAkZGVmYXVsdCA6IGdldE1ldGhvZCgnZW50cmllcycpIDogdW5kZWZpbmVkO1xuICB2YXIgJGFueU5hdGl2ZSA9IE5BTUUgPT0gJ0FycmF5JyA/IHByb3RvLmVudHJpZXMgfHwgJG5hdGl2ZSA6ICRuYXRpdmU7XG4gIHZhciBtZXRob2RzLCBrZXksIEl0ZXJhdG9yUHJvdG90eXBlO1xuICAvLyBGaXggbmF0aXZlXG4gIGlmICgkYW55TmF0aXZlKSB7XG4gICAgSXRlcmF0b3JQcm90b3R5cGUgPSBnZXRQcm90b3R5cGVPZigkYW55TmF0aXZlLmNhbGwobmV3IEJhc2UoKSkpO1xuICAgIGlmIChJdGVyYXRvclByb3RvdHlwZSAhPT0gT2JqZWN0LnByb3RvdHlwZSAmJiBJdGVyYXRvclByb3RvdHlwZS5uZXh0KSB7XG4gICAgICAvLyBTZXQgQEB0b1N0cmluZ1RhZyB0byBuYXRpdmUgaXRlcmF0b3JzXG4gICAgICBzZXRUb1N0cmluZ1RhZyhJdGVyYXRvclByb3RvdHlwZSwgVEFHLCB0cnVlKTtcbiAgICAgIC8vIGZpeCBmb3Igc29tZSBvbGQgZW5naW5lc1xuICAgICAgaWYgKCFMSUJSQVJZICYmICFoYXMoSXRlcmF0b3JQcm90b3R5cGUsIElURVJBVE9SKSkgaGlkZShJdGVyYXRvclByb3RvdHlwZSwgSVRFUkFUT1IsIHJldHVyblRoaXMpO1xuICAgIH1cbiAgfVxuICAvLyBmaXggQXJyYXkje3ZhbHVlcywgQEBpdGVyYXRvcn0ubmFtZSBpbiBWOCAvIEZGXG4gIGlmIChERUZfVkFMVUVTICYmICRuYXRpdmUgJiYgJG5hdGl2ZS5uYW1lICE9PSBWQUxVRVMpIHtcbiAgICBWQUxVRVNfQlVHID0gdHJ1ZTtcbiAgICAkZGVmYXVsdCA9IGZ1bmN0aW9uIHZhbHVlcygpIHsgcmV0dXJuICRuYXRpdmUuY2FsbCh0aGlzKTsgfTtcbiAgfVxuICAvLyBEZWZpbmUgaXRlcmF0b3JcbiAgaWYgKCghTElCUkFSWSB8fCBGT1JDRUQpICYmIChCVUdHWSB8fCBWQUxVRVNfQlVHIHx8ICFwcm90b1tJVEVSQVRPUl0pKSB7XG4gICAgaGlkZShwcm90bywgSVRFUkFUT1IsICRkZWZhdWx0KTtcbiAgfVxuICAvLyBQbHVnIGZvciBsaWJyYXJ5XG4gIEl0ZXJhdG9yc1tOQU1FXSA9ICRkZWZhdWx0O1xuICBJdGVyYXRvcnNbVEFHXSA9IHJldHVyblRoaXM7XG4gIGlmIChERUZBVUxUKSB7XG4gICAgbWV0aG9kcyA9IHtcbiAgICAgIHZhbHVlczogREVGX1ZBTFVFUyA/ICRkZWZhdWx0IDogZ2V0TWV0aG9kKFZBTFVFUyksXG4gICAgICBrZXlzOiBJU19TRVQgPyAkZGVmYXVsdCA6IGdldE1ldGhvZChLRVlTKSxcbiAgICAgIGVudHJpZXM6ICRlbnRyaWVzXG4gICAgfTtcbiAgICBpZiAoRk9SQ0VEKSBmb3IgKGtleSBpbiBtZXRob2RzKSB7XG4gICAgICBpZiAoIShrZXkgaW4gcHJvdG8pKSByZWRlZmluZShwcm90bywga2V5LCBtZXRob2RzW2tleV0pO1xuICAgIH0gZWxzZSAkZXhwb3J0KCRleHBvcnQuUCArICRleHBvcnQuRiAqIChCVUdHWSB8fCBWQUxVRVNfQlVHKSwgTkFNRSwgbWV0aG9kcyk7XG4gIH1cbiAgcmV0dXJuIG1ldGhvZHM7XG59O1xuIiwidmFyIElURVJBVE9SID0gcmVxdWlyZSgnLi9fd2tzJykoJ2l0ZXJhdG9yJyk7XG52YXIgU0FGRV9DTE9TSU5HID0gZmFsc2U7XG5cbnRyeSB7XG4gIHZhciByaXRlciA9IFs3XVtJVEVSQVRPUl0oKTtcbiAgcml0ZXJbJ3JldHVybiddID0gZnVuY3Rpb24gKCkgeyBTQUZFX0NMT1NJTkcgPSB0cnVlOyB9O1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdGhyb3ctbGl0ZXJhbFxuICBBcnJheS5mcm9tKHJpdGVyLCBmdW5jdGlvbiAoKSB7IHRocm93IDI7IH0pO1xufSBjYXRjaCAoZSkgeyAvKiBlbXB0eSAqLyB9XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGV4ZWMsIHNraXBDbG9zaW5nKSB7XG4gIGlmICghc2tpcENsb3NpbmcgJiYgIVNBRkVfQ0xPU0lORykgcmV0dXJuIGZhbHNlO1xuICB2YXIgc2FmZSA9IGZhbHNlO1xuICB0cnkge1xuICAgIHZhciBhcnIgPSBbN107XG4gICAgdmFyIGl0ZXIgPSBhcnJbSVRFUkFUT1JdKCk7XG4gICAgaXRlci5uZXh0ID0gZnVuY3Rpb24gKCkgeyByZXR1cm4geyBkb25lOiBzYWZlID0gdHJ1ZSB9OyB9O1xuICAgIGFycltJVEVSQVRPUl0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiBpdGVyOyB9O1xuICAgIGV4ZWMoYXJyKTtcbiAgfSBjYXRjaCAoZSkgeyAvKiBlbXB0eSAqLyB9XG4gIHJldHVybiBzYWZlO1xufTtcbiIsIm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGRvbmUsIHZhbHVlKSB7XG4gIHJldHVybiB7IHZhbHVlOiB2YWx1ZSwgZG9uZTogISFkb25lIH07XG59O1xuIiwibW9kdWxlLmV4cG9ydHMgPSB7fTtcbiIsIm1vZHVsZS5leHBvcnRzID0gZmFsc2U7XG4iLCIvLyAyMC4yLjIuMTQgTWF0aC5leHBtMSh4KVxudmFyICRleHBtMSA9IE1hdGguZXhwbTE7XG5tb2R1bGUuZXhwb3J0cyA9ICghJGV4cG0xXG4gIC8vIE9sZCBGRiBidWdcbiAgfHwgJGV4cG0xKDEwKSA+IDIyMDI1LjQ2NTc5NDgwNjcxOSB8fCAkZXhwbTEoMTApIDwgMjIwMjUuNDY1Nzk0ODA2NzE2NTE2OFxuICAvLyBUb3IgQnJvd3NlciBidWdcbiAgfHwgJGV4cG0xKC0yZS0xNykgIT0gLTJlLTE3XG4pID8gZnVuY3Rpb24gZXhwbTEoeCkge1xuICByZXR1cm4gKHggPSAreCkgPT0gMCA/IHggOiB4ID4gLTFlLTYgJiYgeCA8IDFlLTYgPyB4ICsgeCAqIHggLyAyIDogTWF0aC5leHAoeCkgLSAxO1xufSA6ICRleHBtMTtcbiIsIi8vIDIwLjIuMi4xNiBNYXRoLmZyb3VuZCh4KVxudmFyIHNpZ24gPSByZXF1aXJlKCcuL19tYXRoLXNpZ24nKTtcbnZhciBwb3cgPSBNYXRoLnBvdztcbnZhciBFUFNJTE9OID0gcG93KDIsIC01Mik7XG52YXIgRVBTSUxPTjMyID0gcG93KDIsIC0yMyk7XG52YXIgTUFYMzIgPSBwb3coMiwgMTI3KSAqICgyIC0gRVBTSUxPTjMyKTtcbnZhciBNSU4zMiA9IHBvdygyLCAtMTI2KTtcblxudmFyIHJvdW5kVGllc1RvRXZlbiA9IGZ1bmN0aW9uIChuKSB7XG4gIHJldHVybiBuICsgMSAvIEVQU0lMT04gLSAxIC8gRVBTSUxPTjtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gTWF0aC5mcm91bmQgfHwgZnVuY3Rpb24gZnJvdW5kKHgpIHtcbiAgdmFyICRhYnMgPSBNYXRoLmFicyh4KTtcbiAgdmFyICRzaWduID0gc2lnbih4KTtcbiAgdmFyIGEsIHJlc3VsdDtcbiAgaWYgKCRhYnMgPCBNSU4zMikgcmV0dXJuICRzaWduICogcm91bmRUaWVzVG9FdmVuKCRhYnMgLyBNSU4zMiAvIEVQU0lMT04zMikgKiBNSU4zMiAqIEVQU0lMT04zMjtcbiAgYSA9ICgxICsgRVBTSUxPTjMyIC8gRVBTSUxPTikgKiAkYWJzO1xuICByZXN1bHQgPSBhIC0gKGEgLSAkYWJzKTtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXNlbGYtY29tcGFyZVxuICBpZiAocmVzdWx0ID4gTUFYMzIgfHwgcmVzdWx0ICE9IHJlc3VsdCkgcmV0dXJuICRzaWduICogSW5maW5pdHk7XG4gIHJldHVybiAkc2lnbiAqIHJlc3VsdDtcbn07XG4iLCIvLyAyMC4yLjIuMjAgTWF0aC5sb2cxcCh4KVxubW9kdWxlLmV4cG9ydHMgPSBNYXRoLmxvZzFwIHx8IGZ1bmN0aW9uIGxvZzFwKHgpIHtcbiAgcmV0dXJuICh4ID0gK3gpID4gLTFlLTggJiYgeCA8IDFlLTggPyB4IC0geCAqIHggLyAyIDogTWF0aC5sb2coMSArIHgpO1xufTtcbiIsIi8vIGh0dHBzOi8vcndhbGRyb24uZ2l0aHViLmlvL3Byb3Bvc2FsLW1hdGgtZXh0ZW5zaW9ucy9cbm1vZHVsZS5leHBvcnRzID0gTWF0aC5zY2FsZSB8fCBmdW5jdGlvbiBzY2FsZSh4LCBpbkxvdywgaW5IaWdoLCBvdXRMb3csIG91dEhpZ2gpIHtcbiAgaWYgKFxuICAgIGFyZ3VtZW50cy5sZW5ndGggPT09IDBcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zZWxmLWNvbXBhcmVcbiAgICAgIHx8IHggIT0geFxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXNlbGYtY29tcGFyZVxuICAgICAgfHwgaW5Mb3cgIT0gaW5Mb3dcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zZWxmLWNvbXBhcmVcbiAgICAgIHx8IGluSGlnaCAhPSBpbkhpZ2hcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zZWxmLWNvbXBhcmVcbiAgICAgIHx8IG91dExvdyAhPSBvdXRMb3dcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zZWxmLWNvbXBhcmVcbiAgICAgIHx8IG91dEhpZ2ggIT0gb3V0SGlnaFxuICApIHJldHVybiBOYU47XG4gIGlmICh4ID09PSBJbmZpbml0eSB8fCB4ID09PSAtSW5maW5pdHkpIHJldHVybiB4O1xuICByZXR1cm4gKHggLSBpbkxvdykgKiAob3V0SGlnaCAtIG91dExvdykgLyAoaW5IaWdoIC0gaW5Mb3cpICsgb3V0TG93O1xufTtcbiIsIi8vIDIwLjIuMi4yOCBNYXRoLnNpZ24oeClcbm1vZHVsZS5leHBvcnRzID0gTWF0aC5zaWduIHx8IGZ1bmN0aW9uIHNpZ24oeCkge1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2VsZi1jb21wYXJlXG4gIHJldHVybiAoeCA9ICt4KSA9PSAwIHx8IHggIT0geCA/IHggOiB4IDwgMCA/IC0xIDogMTtcbn07XG4iLCJ2YXIgTUVUQSA9IHJlcXVpcmUoJy4vX3VpZCcpKCdtZXRhJyk7XG52YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuL19pcy1vYmplY3QnKTtcbnZhciBoYXMgPSByZXF1aXJlKCcuL19oYXMnKTtcbnZhciBzZXREZXNjID0gcmVxdWlyZSgnLi9fb2JqZWN0LWRwJykuZjtcbnZhciBpZCA9IDA7XG52YXIgaXNFeHRlbnNpYmxlID0gT2JqZWN0LmlzRXh0ZW5zaWJsZSB8fCBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0cnVlO1xufTtcbnZhciBGUkVFWkUgPSAhcmVxdWlyZSgnLi9fZmFpbHMnKShmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBpc0V4dGVuc2libGUoT2JqZWN0LnByZXZlbnRFeHRlbnNpb25zKHt9KSk7XG59KTtcbnZhciBzZXRNZXRhID0gZnVuY3Rpb24gKGl0KSB7XG4gIHNldERlc2MoaXQsIE1FVEEsIHsgdmFsdWU6IHtcbiAgICBpOiAnTycgKyArK2lkLCAvLyBvYmplY3QgSURcbiAgICB3OiB7fSAgICAgICAgICAvLyB3ZWFrIGNvbGxlY3Rpb25zIElEc1xuICB9IH0pO1xufTtcbnZhciBmYXN0S2V5ID0gZnVuY3Rpb24gKGl0LCBjcmVhdGUpIHtcbiAgLy8gcmV0dXJuIHByaW1pdGl2ZSB3aXRoIHByZWZpeFxuICBpZiAoIWlzT2JqZWN0KGl0KSkgcmV0dXJuIHR5cGVvZiBpdCA9PSAnc3ltYm9sJyA/IGl0IDogKHR5cGVvZiBpdCA9PSAnc3RyaW5nJyA/ICdTJyA6ICdQJykgKyBpdDtcbiAgaWYgKCFoYXMoaXQsIE1FVEEpKSB7XG4gICAgLy8gY2FuJ3Qgc2V0IG1ldGFkYXRhIHRvIHVuY2F1Z2h0IGZyb3plbiBvYmplY3RcbiAgICBpZiAoIWlzRXh0ZW5zaWJsZShpdCkpIHJldHVybiAnRic7XG4gICAgLy8gbm90IG5lY2Vzc2FyeSB0byBhZGQgbWV0YWRhdGFcbiAgICBpZiAoIWNyZWF0ZSkgcmV0dXJuICdFJztcbiAgICAvLyBhZGQgbWlzc2luZyBtZXRhZGF0YVxuICAgIHNldE1ldGEoaXQpO1xuICAvLyByZXR1cm4gb2JqZWN0IElEXG4gIH0gcmV0dXJuIGl0W01FVEFdLmk7XG59O1xudmFyIGdldFdlYWsgPSBmdW5jdGlvbiAoaXQsIGNyZWF0ZSkge1xuICBpZiAoIWhhcyhpdCwgTUVUQSkpIHtcbiAgICAvLyBjYW4ndCBzZXQgbWV0YWRhdGEgdG8gdW5jYXVnaHQgZnJvemVuIG9iamVjdFxuICAgIGlmICghaXNFeHRlbnNpYmxlKGl0KSkgcmV0dXJuIHRydWU7XG4gICAgLy8gbm90IG5lY2Vzc2FyeSB0byBhZGQgbWV0YWRhdGFcbiAgICBpZiAoIWNyZWF0ZSkgcmV0dXJuIGZhbHNlO1xuICAgIC8vIGFkZCBtaXNzaW5nIG1ldGFkYXRhXG4gICAgc2V0TWV0YShpdCk7XG4gIC8vIHJldHVybiBoYXNoIHdlYWsgY29sbGVjdGlvbnMgSURzXG4gIH0gcmV0dXJuIGl0W01FVEFdLnc7XG59O1xuLy8gYWRkIG1ldGFkYXRhIG9uIGZyZWV6ZS1mYW1pbHkgbWV0aG9kcyBjYWxsaW5nXG52YXIgb25GcmVlemUgPSBmdW5jdGlvbiAoaXQpIHtcbiAgaWYgKEZSRUVaRSAmJiBtZXRhLk5FRUQgJiYgaXNFeHRlbnNpYmxlKGl0KSAmJiAhaGFzKGl0LCBNRVRBKSkgc2V0TWV0YShpdCk7XG4gIHJldHVybiBpdDtcbn07XG52YXIgbWV0YSA9IG1vZHVsZS5leHBvcnRzID0ge1xuICBLRVk6IE1FVEEsXG4gIE5FRUQ6IGZhbHNlLFxuICBmYXN0S2V5OiBmYXN0S2V5LFxuICBnZXRXZWFrOiBnZXRXZWFrLFxuICBvbkZyZWV6ZTogb25GcmVlemVcbn07XG4iLCJ2YXIgTWFwID0gcmVxdWlyZSgnLi9lczYubWFwJyk7XG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyIHNoYXJlZCA9IHJlcXVpcmUoJy4vX3NoYXJlZCcpKCdtZXRhZGF0YScpO1xudmFyIHN0b3JlID0gc2hhcmVkLnN0b3JlIHx8IChzaGFyZWQuc3RvcmUgPSBuZXcgKHJlcXVpcmUoJy4vZXM2LndlYWstbWFwJykpKCkpO1xuXG52YXIgZ2V0T3JDcmVhdGVNZXRhZGF0YU1hcCA9IGZ1bmN0aW9uICh0YXJnZXQsIHRhcmdldEtleSwgY3JlYXRlKSB7XG4gIHZhciB0YXJnZXRNZXRhZGF0YSA9IHN0b3JlLmdldCh0YXJnZXQpO1xuICBpZiAoIXRhcmdldE1ldGFkYXRhKSB7XG4gICAgaWYgKCFjcmVhdGUpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgc3RvcmUuc2V0KHRhcmdldCwgdGFyZ2V0TWV0YWRhdGEgPSBuZXcgTWFwKCkpO1xuICB9XG4gIHZhciBrZXlNZXRhZGF0YSA9IHRhcmdldE1ldGFkYXRhLmdldCh0YXJnZXRLZXkpO1xuICBpZiAoIWtleU1ldGFkYXRhKSB7XG4gICAgaWYgKCFjcmVhdGUpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgdGFyZ2V0TWV0YWRhdGEuc2V0KHRhcmdldEtleSwga2V5TWV0YWRhdGEgPSBuZXcgTWFwKCkpO1xuICB9IHJldHVybiBrZXlNZXRhZGF0YTtcbn07XG52YXIgb3JkaW5hcnlIYXNPd25NZXRhZGF0YSA9IGZ1bmN0aW9uIChNZXRhZGF0YUtleSwgTywgUCkge1xuICB2YXIgbWV0YWRhdGFNYXAgPSBnZXRPckNyZWF0ZU1ldGFkYXRhTWFwKE8sIFAsIGZhbHNlKTtcbiAgcmV0dXJuIG1ldGFkYXRhTWFwID09PSB1bmRlZmluZWQgPyBmYWxzZSA6IG1ldGFkYXRhTWFwLmhhcyhNZXRhZGF0YUtleSk7XG59O1xudmFyIG9yZGluYXJ5R2V0T3duTWV0YWRhdGEgPSBmdW5jdGlvbiAoTWV0YWRhdGFLZXksIE8sIFApIHtcbiAgdmFyIG1ldGFkYXRhTWFwID0gZ2V0T3JDcmVhdGVNZXRhZGF0YU1hcChPLCBQLCBmYWxzZSk7XG4gIHJldHVybiBtZXRhZGF0YU1hcCA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogbWV0YWRhdGFNYXAuZ2V0KE1ldGFkYXRhS2V5KTtcbn07XG52YXIgb3JkaW5hcnlEZWZpbmVPd25NZXRhZGF0YSA9IGZ1bmN0aW9uIChNZXRhZGF0YUtleSwgTWV0YWRhdGFWYWx1ZSwgTywgUCkge1xuICBnZXRPckNyZWF0ZU1ldGFkYXRhTWFwKE8sIFAsIHRydWUpLnNldChNZXRhZGF0YUtleSwgTWV0YWRhdGFWYWx1ZSk7XG59O1xudmFyIG9yZGluYXJ5T3duTWV0YWRhdGFLZXlzID0gZnVuY3Rpb24gKHRhcmdldCwgdGFyZ2V0S2V5KSB7XG4gIHZhciBtZXRhZGF0YU1hcCA9IGdldE9yQ3JlYXRlTWV0YWRhdGFNYXAodGFyZ2V0LCB0YXJnZXRLZXksIGZhbHNlKTtcbiAgdmFyIGtleXMgPSBbXTtcbiAgaWYgKG1ldGFkYXRhTWFwKSBtZXRhZGF0YU1hcC5mb3JFYWNoKGZ1bmN0aW9uIChfLCBrZXkpIHsga2V5cy5wdXNoKGtleSk7IH0pO1xuICByZXR1cm4ga2V5cztcbn07XG52YXIgdG9NZXRhS2V5ID0gZnVuY3Rpb24gKGl0KSB7XG4gIHJldHVybiBpdCA9PT0gdW5kZWZpbmVkIHx8IHR5cGVvZiBpdCA9PSAnc3ltYm9sJyA/IGl0IDogU3RyaW5nKGl0KTtcbn07XG52YXIgZXhwID0gZnVuY3Rpb24gKE8pIHtcbiAgJGV4cG9ydCgkZXhwb3J0LlMsICdSZWZsZWN0JywgTyk7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgc3RvcmU6IHN0b3JlLFxuICBtYXA6IGdldE9yQ3JlYXRlTWV0YWRhdGFNYXAsXG4gIGhhczogb3JkaW5hcnlIYXNPd25NZXRhZGF0YSxcbiAgZ2V0OiBvcmRpbmFyeUdldE93bk1ldGFkYXRhLFxuICBzZXQ6IG9yZGluYXJ5RGVmaW5lT3duTWV0YWRhdGEsXG4gIGtleXM6IG9yZGluYXJ5T3duTWV0YWRhdGFLZXlzLFxuICBrZXk6IHRvTWV0YUtleSxcbiAgZXhwOiBleHBcbn07XG4iLCJ2YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi9fZ2xvYmFsJyk7XG52YXIgbWFjcm90YXNrID0gcmVxdWlyZSgnLi9fdGFzaycpLnNldDtcbnZhciBPYnNlcnZlciA9IGdsb2JhbC5NdXRhdGlvbk9ic2VydmVyIHx8IGdsb2JhbC5XZWJLaXRNdXRhdGlvbk9ic2VydmVyO1xudmFyIHByb2Nlc3MgPSBnbG9iYWwucHJvY2VzcztcbnZhciBQcm9taXNlID0gZ2xvYmFsLlByb21pc2U7XG52YXIgaXNOb2RlID0gcmVxdWlyZSgnLi9fY29mJykocHJvY2VzcykgPT0gJ3Byb2Nlc3MnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIGhlYWQsIGxhc3QsIG5vdGlmeTtcblxuICB2YXIgZmx1c2ggPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHBhcmVudCwgZm47XG4gICAgaWYgKGlzTm9kZSAmJiAocGFyZW50ID0gcHJvY2Vzcy5kb21haW4pKSBwYXJlbnQuZXhpdCgpO1xuICAgIHdoaWxlIChoZWFkKSB7XG4gICAgICBmbiA9IGhlYWQuZm47XG4gICAgICBoZWFkID0gaGVhZC5uZXh0O1xuICAgICAgdHJ5IHtcbiAgICAgICAgZm4oKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgaWYgKGhlYWQpIG5vdGlmeSgpO1xuICAgICAgICBlbHNlIGxhc3QgPSB1bmRlZmluZWQ7XG4gICAgICAgIHRocm93IGU7XG4gICAgICB9XG4gICAgfSBsYXN0ID0gdW5kZWZpbmVkO1xuICAgIGlmIChwYXJlbnQpIHBhcmVudC5lbnRlcigpO1xuICB9O1xuXG4gIC8vIE5vZGUuanNcbiAgaWYgKGlzTm9kZSkge1xuICAgIG5vdGlmeSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHByb2Nlc3MubmV4dFRpY2soZmx1c2gpO1xuICAgIH07XG4gIC8vIGJyb3dzZXJzIHdpdGggTXV0YXRpb25PYnNlcnZlciwgZXhjZXB0IGlPUyBTYWZhcmkgLSBodHRwczovL2dpdGh1Yi5jb20vemxvaXJvY2svY29yZS1qcy9pc3N1ZXMvMzM5XG4gIH0gZWxzZSBpZiAoT2JzZXJ2ZXIgJiYgIShnbG9iYWwubmF2aWdhdG9yICYmIGdsb2JhbC5uYXZpZ2F0b3Iuc3RhbmRhbG9uZSkpIHtcbiAgICB2YXIgdG9nZ2xlID0gdHJ1ZTtcbiAgICB2YXIgbm9kZSA9IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKCcnKTtcbiAgICBuZXcgT2JzZXJ2ZXIoZmx1c2gpLm9ic2VydmUobm9kZSwgeyBjaGFyYWN0ZXJEYXRhOiB0cnVlIH0pOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLW5ld1xuICAgIG5vdGlmeSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIG5vZGUuZGF0YSA9IHRvZ2dsZSA9ICF0b2dnbGU7XG4gICAgfTtcbiAgLy8gZW52aXJvbm1lbnRzIHdpdGggbWF5YmUgbm9uLWNvbXBsZXRlbHkgY29ycmVjdCwgYnV0IGV4aXN0ZW50IFByb21pc2VcbiAgfSBlbHNlIGlmIChQcm9taXNlICYmIFByb21pc2UucmVzb2x2ZSkge1xuICAgIHZhciBwcm9taXNlID0gUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgbm90aWZ5ID0gZnVuY3Rpb24gKCkge1xuICAgICAgcHJvbWlzZS50aGVuKGZsdXNoKTtcbiAgICB9O1xuICAvLyBmb3Igb3RoZXIgZW52aXJvbm1lbnRzIC0gbWFjcm90YXNrIGJhc2VkIG9uOlxuICAvLyAtIHNldEltbWVkaWF0ZVxuICAvLyAtIE1lc3NhZ2VDaGFubmVsXG4gIC8vIC0gd2luZG93LnBvc3RNZXNzYWdcbiAgLy8gLSBvbnJlYWR5c3RhdGVjaGFuZ2VcbiAgLy8gLSBzZXRUaW1lb3V0XG4gIH0gZWxzZSB7XG4gICAgbm90aWZ5ID0gZnVuY3Rpb24gKCkge1xuICAgICAgLy8gc3RyYW5nZSBJRSArIHdlYnBhY2sgZGV2IHNlcnZlciBidWcgLSB1c2UgLmNhbGwoZ2xvYmFsKVxuICAgICAgbWFjcm90YXNrLmNhbGwoZ2xvYmFsLCBmbHVzaCk7XG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiBmdW5jdGlvbiAoZm4pIHtcbiAgICB2YXIgdGFzayA9IHsgZm46IGZuLCBuZXh0OiB1bmRlZmluZWQgfTtcbiAgICBpZiAobGFzdCkgbGFzdC5uZXh0ID0gdGFzaztcbiAgICBpZiAoIWhlYWQpIHtcbiAgICAgIGhlYWQgPSB0YXNrO1xuICAgICAgbm90aWZ5KCk7XG4gICAgfSBsYXN0ID0gdGFzaztcbiAgfTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG4vLyAyNS40LjEuNSBOZXdQcm9taXNlQ2FwYWJpbGl0eShDKVxudmFyIGFGdW5jdGlvbiA9IHJlcXVpcmUoJy4vX2EtZnVuY3Rpb24nKTtcblxuZnVuY3Rpb24gUHJvbWlzZUNhcGFiaWxpdHkoQykge1xuICB2YXIgcmVzb2x2ZSwgcmVqZWN0O1xuICB0aGlzLnByb21pc2UgPSBuZXcgQyhmdW5jdGlvbiAoJCRyZXNvbHZlLCAkJHJlamVjdCkge1xuICAgIGlmIChyZXNvbHZlICE9PSB1bmRlZmluZWQgfHwgcmVqZWN0ICE9PSB1bmRlZmluZWQpIHRocm93IFR5cGVFcnJvcignQmFkIFByb21pc2UgY29uc3RydWN0b3InKTtcbiAgICByZXNvbHZlID0gJCRyZXNvbHZlO1xuICAgIHJlamVjdCA9ICQkcmVqZWN0O1xuICB9KTtcbiAgdGhpcy5yZXNvbHZlID0gYUZ1bmN0aW9uKHJlc29sdmUpO1xuICB0aGlzLnJlamVjdCA9IGFGdW5jdGlvbihyZWplY3QpO1xufVxuXG5tb2R1bGUuZXhwb3J0cy5mID0gZnVuY3Rpb24gKEMpIHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlQ2FwYWJpbGl0eShDKTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG4vLyAxOS4xLjIuMSBPYmplY3QuYXNzaWduKHRhcmdldCwgc291cmNlLCAuLi4pXG52YXIgZ2V0S2V5cyA9IHJlcXVpcmUoJy4vX29iamVjdC1rZXlzJyk7XG52YXIgZ09QUyA9IHJlcXVpcmUoJy4vX29iamVjdC1nb3BzJyk7XG52YXIgcElFID0gcmVxdWlyZSgnLi9fb2JqZWN0LXBpZScpO1xudmFyIHRvT2JqZWN0ID0gcmVxdWlyZSgnLi9fdG8tb2JqZWN0Jyk7XG52YXIgSU9iamVjdCA9IHJlcXVpcmUoJy4vX2lvYmplY3QnKTtcbnZhciAkYXNzaWduID0gT2JqZWN0LmFzc2lnbjtcblxuLy8gc2hvdWxkIHdvcmsgd2l0aCBzeW1ib2xzIGFuZCBzaG91bGQgaGF2ZSBkZXRlcm1pbmlzdGljIHByb3BlcnR5IG9yZGVyIChWOCBidWcpXG5tb2R1bGUuZXhwb3J0cyA9ICEkYXNzaWduIHx8IHJlcXVpcmUoJy4vX2ZhaWxzJykoZnVuY3Rpb24gKCkge1xuICB2YXIgQSA9IHt9O1xuICB2YXIgQiA9IHt9O1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW5kZWZcbiAgdmFyIFMgPSBTeW1ib2woKTtcbiAgdmFyIEsgPSAnYWJjZGVmZ2hpamtsbW5vcHFyc3QnO1xuICBBW1NdID0gNztcbiAgSy5zcGxpdCgnJykuZm9yRWFjaChmdW5jdGlvbiAoaykgeyBCW2tdID0gazsgfSk7XG4gIHJldHVybiAkYXNzaWduKHt9LCBBKVtTXSAhPSA3IHx8IE9iamVjdC5rZXlzKCRhc3NpZ24oe30sIEIpKS5qb2luKCcnKSAhPSBLO1xufSkgPyBmdW5jdGlvbiBhc3NpZ24odGFyZ2V0LCBzb3VyY2UpIHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bnVzZWQtdmFyc1xuICB2YXIgVCA9IHRvT2JqZWN0KHRhcmdldCk7XG4gIHZhciBhTGVuID0gYXJndW1lbnRzLmxlbmd0aDtcbiAgdmFyIGluZGV4ID0gMTtcbiAgdmFyIGdldFN5bWJvbHMgPSBnT1BTLmY7XG4gIHZhciBpc0VudW0gPSBwSUUuZjtcbiAgd2hpbGUgKGFMZW4gPiBpbmRleCkge1xuICAgIHZhciBTID0gSU9iamVjdChhcmd1bWVudHNbaW5kZXgrK10pO1xuICAgIHZhciBrZXlzID0gZ2V0U3ltYm9scyA/IGdldEtleXMoUykuY29uY2F0KGdldFN5bWJvbHMoUykpIDogZ2V0S2V5cyhTKTtcbiAgICB2YXIgbGVuZ3RoID0ga2V5cy5sZW5ndGg7XG4gICAgdmFyIGogPSAwO1xuICAgIHZhciBrZXk7XG4gICAgd2hpbGUgKGxlbmd0aCA+IGopIGlmIChpc0VudW0uY2FsbChTLCBrZXkgPSBrZXlzW2orK10pKSBUW2tleV0gPSBTW2tleV07XG4gIH0gcmV0dXJuIFQ7XG59IDogJGFzc2lnbjtcbiIsIi8vIDE5LjEuMi4yIC8gMTUuMi4zLjUgT2JqZWN0LmNyZWF0ZShPIFssIFByb3BlcnRpZXNdKVxudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi9fYW4tb2JqZWN0Jyk7XG52YXIgZFBzID0gcmVxdWlyZSgnLi9fb2JqZWN0LWRwcycpO1xudmFyIGVudW1CdWdLZXlzID0gcmVxdWlyZSgnLi9fZW51bS1idWcta2V5cycpO1xudmFyIElFX1BST1RPID0gcmVxdWlyZSgnLi9fc2hhcmVkLWtleScpKCdJRV9QUk9UTycpO1xudmFyIEVtcHR5ID0gZnVuY3Rpb24gKCkgeyAvKiBlbXB0eSAqLyB9O1xudmFyIFBST1RPVFlQRSA9ICdwcm90b3R5cGUnO1xuXG4vLyBDcmVhdGUgb2JqZWN0IHdpdGggZmFrZSBgbnVsbGAgcHJvdG90eXBlOiB1c2UgaWZyYW1lIE9iamVjdCB3aXRoIGNsZWFyZWQgcHJvdG90eXBlXG52YXIgY3JlYXRlRGljdCA9IGZ1bmN0aW9uICgpIHtcbiAgLy8gVGhyYXNoLCB3YXN0ZSBhbmQgc29kb215OiBJRSBHQyBidWdcbiAgdmFyIGlmcmFtZSA9IHJlcXVpcmUoJy4vX2RvbS1jcmVhdGUnKSgnaWZyYW1lJyk7XG4gIHZhciBpID0gZW51bUJ1Z0tleXMubGVuZ3RoO1xuICB2YXIgbHQgPSAnPCc7XG4gIHZhciBndCA9ICc+JztcbiAgdmFyIGlmcmFtZURvY3VtZW50O1xuICBpZnJhbWUuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgcmVxdWlyZSgnLi9faHRtbCcpLmFwcGVuZENoaWxkKGlmcmFtZSk7XG4gIGlmcmFtZS5zcmMgPSAnamF2YXNjcmlwdDonOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXNjcmlwdC11cmxcbiAgLy8gY3JlYXRlRGljdCA9IGlmcmFtZS5jb250ZW50V2luZG93Lk9iamVjdDtcbiAgLy8gaHRtbC5yZW1vdmVDaGlsZChpZnJhbWUpO1xuICBpZnJhbWVEb2N1bWVudCA9IGlmcmFtZS5jb250ZW50V2luZG93LmRvY3VtZW50O1xuICBpZnJhbWVEb2N1bWVudC5vcGVuKCk7XG4gIGlmcmFtZURvY3VtZW50LndyaXRlKGx0ICsgJ3NjcmlwdCcgKyBndCArICdkb2N1bWVudC5GPU9iamVjdCcgKyBsdCArICcvc2NyaXB0JyArIGd0KTtcbiAgaWZyYW1lRG9jdW1lbnQuY2xvc2UoKTtcbiAgY3JlYXRlRGljdCA9IGlmcmFtZURvY3VtZW50LkY7XG4gIHdoaWxlIChpLS0pIGRlbGV0ZSBjcmVhdGVEaWN0W1BST1RPVFlQRV1bZW51bUJ1Z0tleXNbaV1dO1xuICByZXR1cm4gY3JlYXRlRGljdCgpO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBPYmplY3QuY3JlYXRlIHx8IGZ1bmN0aW9uIGNyZWF0ZShPLCBQcm9wZXJ0aWVzKSB7XG4gIHZhciByZXN1bHQ7XG4gIGlmIChPICE9PSBudWxsKSB7XG4gICAgRW1wdHlbUFJPVE9UWVBFXSA9IGFuT2JqZWN0KE8pO1xuICAgIHJlc3VsdCA9IG5ldyBFbXB0eSgpO1xuICAgIEVtcHR5W1BST1RPVFlQRV0gPSBudWxsO1xuICAgIC8vIGFkZCBcIl9fcHJvdG9fX1wiIGZvciBPYmplY3QuZ2V0UHJvdG90eXBlT2YgcG9seWZpbGxcbiAgICByZXN1bHRbSUVfUFJPVE9dID0gTztcbiAgfSBlbHNlIHJlc3VsdCA9IGNyZWF0ZURpY3QoKTtcbiAgcmV0dXJuIFByb3BlcnRpZXMgPT09IHVuZGVmaW5lZCA/IHJlc3VsdCA6IGRQcyhyZXN1bHQsIFByb3BlcnRpZXMpO1xufTtcbiIsInZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4vX2FuLW9iamVjdCcpO1xudmFyIElFOF9ET01fREVGSU5FID0gcmVxdWlyZSgnLi9faWU4LWRvbS1kZWZpbmUnKTtcbnZhciB0b1ByaW1pdGl2ZSA9IHJlcXVpcmUoJy4vX3RvLXByaW1pdGl2ZScpO1xudmFyIGRQID0gT2JqZWN0LmRlZmluZVByb3BlcnR5O1xuXG5leHBvcnRzLmYgPSByZXF1aXJlKCcuL19kZXNjcmlwdG9ycycpID8gT2JqZWN0LmRlZmluZVByb3BlcnR5IDogZnVuY3Rpb24gZGVmaW5lUHJvcGVydHkoTywgUCwgQXR0cmlidXRlcykge1xuICBhbk9iamVjdChPKTtcbiAgUCA9IHRvUHJpbWl0aXZlKFAsIHRydWUpO1xuICBhbk9iamVjdChBdHRyaWJ1dGVzKTtcbiAgaWYgKElFOF9ET01fREVGSU5FKSB0cnkge1xuICAgIHJldHVybiBkUChPLCBQLCBBdHRyaWJ1dGVzKTtcbiAgfSBjYXRjaCAoZSkgeyAvKiBlbXB0eSAqLyB9XG4gIGlmICgnZ2V0JyBpbiBBdHRyaWJ1dGVzIHx8ICdzZXQnIGluIEF0dHJpYnV0ZXMpIHRocm93IFR5cGVFcnJvcignQWNjZXNzb3JzIG5vdCBzdXBwb3J0ZWQhJyk7XG4gIGlmICgndmFsdWUnIGluIEF0dHJpYnV0ZXMpIE9bUF0gPSBBdHRyaWJ1dGVzLnZhbHVlO1xuICByZXR1cm4gTztcbn07XG4iLCJ2YXIgZFAgPSByZXF1aXJlKCcuL19vYmplY3QtZHAnKTtcbnZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4vX2FuLW9iamVjdCcpO1xudmFyIGdldEtleXMgPSByZXF1aXJlKCcuL19vYmplY3Qta2V5cycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vX2Rlc2NyaXB0b3JzJykgPyBPYmplY3QuZGVmaW5lUHJvcGVydGllcyA6IGZ1bmN0aW9uIGRlZmluZVByb3BlcnRpZXMoTywgUHJvcGVydGllcykge1xuICBhbk9iamVjdChPKTtcbiAgdmFyIGtleXMgPSBnZXRLZXlzKFByb3BlcnRpZXMpO1xuICB2YXIgbGVuZ3RoID0ga2V5cy5sZW5ndGg7XG4gIHZhciBpID0gMDtcbiAgdmFyIFA7XG4gIHdoaWxlIChsZW5ndGggPiBpKSBkUC5mKE8sIFAgPSBrZXlzW2krK10sIFByb3BlcnRpZXNbUF0pO1xuICByZXR1cm4gTztcbn07XG4iLCIndXNlIHN0cmljdCc7XG4vLyBGb3JjZWQgcmVwbGFjZW1lbnQgcHJvdG90eXBlIGFjY2Vzc29ycyBtZXRob2RzXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vX2xpYnJhcnknKSB8fCAhcmVxdWlyZSgnLi9fZmFpbHMnKShmdW5jdGlvbiAoKSB7XG4gIHZhciBLID0gTWF0aC5yYW5kb20oKTtcbiAgLy8gSW4gRkYgdGhyb3dzIG9ubHkgZGVmaW5lIG1ldGhvZHNcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVuZGVmLCBuby11c2VsZXNzLWNhbGxcbiAgX19kZWZpbmVTZXR0ZXJfXy5jYWxsKG51bGwsIEssIGZ1bmN0aW9uICgpIHsgLyogZW1wdHkgKi8gfSk7XG4gIGRlbGV0ZSByZXF1aXJlKCcuL19nbG9iYWwnKVtLXTtcbn0pO1xuIiwidmFyIHBJRSA9IHJlcXVpcmUoJy4vX29iamVjdC1waWUnKTtcbnZhciBjcmVhdGVEZXNjID0gcmVxdWlyZSgnLi9fcHJvcGVydHktZGVzYycpO1xudmFyIHRvSU9iamVjdCA9IHJlcXVpcmUoJy4vX3RvLWlvYmplY3QnKTtcbnZhciB0b1ByaW1pdGl2ZSA9IHJlcXVpcmUoJy4vX3RvLXByaW1pdGl2ZScpO1xudmFyIGhhcyA9IHJlcXVpcmUoJy4vX2hhcycpO1xudmFyIElFOF9ET01fREVGSU5FID0gcmVxdWlyZSgnLi9faWU4LWRvbS1kZWZpbmUnKTtcbnZhciBnT1BEID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcjtcblxuZXhwb3J0cy5mID0gcmVxdWlyZSgnLi9fZGVzY3JpcHRvcnMnKSA/IGdPUEQgOiBmdW5jdGlvbiBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoTywgUCkge1xuICBPID0gdG9JT2JqZWN0KE8pO1xuICBQID0gdG9QcmltaXRpdmUoUCwgdHJ1ZSk7XG4gIGlmIChJRThfRE9NX0RFRklORSkgdHJ5IHtcbiAgICByZXR1cm4gZ09QRChPLCBQKTtcbiAgfSBjYXRjaCAoZSkgeyAvKiBlbXB0eSAqLyB9XG4gIGlmIChoYXMoTywgUCkpIHJldHVybiBjcmVhdGVEZXNjKCFwSUUuZi5jYWxsKE8sIFApLCBPW1BdKTtcbn07XG4iLCIvLyBmYWxsYmFjayBmb3IgSUUxMSBidWdneSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyB3aXRoIGlmcmFtZSBhbmQgd2luZG93XG52YXIgdG9JT2JqZWN0ID0gcmVxdWlyZSgnLi9fdG8taW9iamVjdCcpO1xudmFyIGdPUE4gPSByZXF1aXJlKCcuL19vYmplY3QtZ29wbicpLmY7XG52YXIgdG9TdHJpbmcgPSB7fS50b1N0cmluZztcblxudmFyIHdpbmRvd05hbWVzID0gdHlwZW9mIHdpbmRvdyA9PSAnb2JqZWN0JyAmJiB3aW5kb3cgJiYgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXNcbiAgPyBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyh3aW5kb3cpIDogW107XG5cbnZhciBnZXRXaW5kb3dOYW1lcyA9IGZ1bmN0aW9uIChpdCkge1xuICB0cnkge1xuICAgIHJldHVybiBnT1BOKGl0KTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHJldHVybiB3aW5kb3dOYW1lcy5zbGljZSgpO1xuICB9XG59O1xuXG5tb2R1bGUuZXhwb3J0cy5mID0gZnVuY3Rpb24gZ2V0T3duUHJvcGVydHlOYW1lcyhpdCkge1xuICByZXR1cm4gd2luZG93TmFtZXMgJiYgdG9TdHJpbmcuY2FsbChpdCkgPT0gJ1tvYmplY3QgV2luZG93XScgPyBnZXRXaW5kb3dOYW1lcyhpdCkgOiBnT1BOKHRvSU9iamVjdChpdCkpO1xufTtcbiIsIi8vIDE5LjEuMi43IC8gMTUuMi4zLjQgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoTylcbnZhciAka2V5cyA9IHJlcXVpcmUoJy4vX29iamVjdC1rZXlzLWludGVybmFsJyk7XG52YXIgaGlkZGVuS2V5cyA9IHJlcXVpcmUoJy4vX2VudW0tYnVnLWtleXMnKS5jb25jYXQoJ2xlbmd0aCcsICdwcm90b3R5cGUnKTtcblxuZXhwb3J0cy5mID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMgfHwgZnVuY3Rpb24gZ2V0T3duUHJvcGVydHlOYW1lcyhPKSB7XG4gIHJldHVybiAka2V5cyhPLCBoaWRkZW5LZXlzKTtcbn07XG4iLCJleHBvcnRzLmYgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzO1xuIiwiLy8gMTkuMS4yLjkgLyAxNS4yLjMuMiBPYmplY3QuZ2V0UHJvdG90eXBlT2YoTylcbnZhciBoYXMgPSByZXF1aXJlKCcuL19oYXMnKTtcbnZhciB0b09iamVjdCA9IHJlcXVpcmUoJy4vX3RvLW9iamVjdCcpO1xudmFyIElFX1BST1RPID0gcmVxdWlyZSgnLi9fc2hhcmVkLWtleScpKCdJRV9QUk9UTycpO1xudmFyIE9iamVjdFByb3RvID0gT2JqZWN0LnByb3RvdHlwZTtcblxubW9kdWxlLmV4cG9ydHMgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YgfHwgZnVuY3Rpb24gKE8pIHtcbiAgTyA9IHRvT2JqZWN0KE8pO1xuICBpZiAoaGFzKE8sIElFX1BST1RPKSkgcmV0dXJuIE9bSUVfUFJPVE9dO1xuICBpZiAodHlwZW9mIE8uY29uc3RydWN0b3IgPT0gJ2Z1bmN0aW9uJyAmJiBPIGluc3RhbmNlb2YgTy5jb25zdHJ1Y3Rvcikge1xuICAgIHJldHVybiBPLmNvbnN0cnVjdG9yLnByb3RvdHlwZTtcbiAgfSByZXR1cm4gTyBpbnN0YW5jZW9mIE9iamVjdCA/IE9iamVjdFByb3RvIDogbnVsbDtcbn07XG4iLCJ2YXIgaGFzID0gcmVxdWlyZSgnLi9faGFzJyk7XG52YXIgdG9JT2JqZWN0ID0gcmVxdWlyZSgnLi9fdG8taW9iamVjdCcpO1xudmFyIGFycmF5SW5kZXhPZiA9IHJlcXVpcmUoJy4vX2FycmF5LWluY2x1ZGVzJykoZmFsc2UpO1xudmFyIElFX1BST1RPID0gcmVxdWlyZSgnLi9fc2hhcmVkLWtleScpKCdJRV9QUk9UTycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChvYmplY3QsIG5hbWVzKSB7XG4gIHZhciBPID0gdG9JT2JqZWN0KG9iamVjdCk7XG4gIHZhciBpID0gMDtcbiAgdmFyIHJlc3VsdCA9IFtdO1xuICB2YXIga2V5O1xuICBmb3IgKGtleSBpbiBPKSBpZiAoa2V5ICE9IElFX1BST1RPKSBoYXMoTywga2V5KSAmJiByZXN1bHQucHVzaChrZXkpO1xuICAvLyBEb24ndCBlbnVtIGJ1ZyAmIGhpZGRlbiBrZXlzXG4gIHdoaWxlIChuYW1lcy5sZW5ndGggPiBpKSBpZiAoaGFzKE8sIGtleSA9IG5hbWVzW2krK10pKSB7XG4gICAgfmFycmF5SW5kZXhPZihyZXN1bHQsIGtleSkgfHwgcmVzdWx0LnB1c2goa2V5KTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufTtcbiIsIi8vIDE5LjEuMi4xNCAvIDE1LjIuMy4xNCBPYmplY3Qua2V5cyhPKVxudmFyICRrZXlzID0gcmVxdWlyZSgnLi9fb2JqZWN0LWtleXMtaW50ZXJuYWwnKTtcbnZhciBlbnVtQnVnS2V5cyA9IHJlcXVpcmUoJy4vX2VudW0tYnVnLWtleXMnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBPYmplY3Qua2V5cyB8fCBmdW5jdGlvbiBrZXlzKE8pIHtcbiAgcmV0dXJuICRrZXlzKE8sIGVudW1CdWdLZXlzKTtcbn07XG4iLCJleHBvcnRzLmYgPSB7fS5wcm9wZXJ0eUlzRW51bWVyYWJsZTtcbiIsIi8vIG1vc3QgT2JqZWN0IG1ldGhvZHMgYnkgRVM2IHNob3VsZCBhY2NlcHQgcHJpbWl0aXZlc1xudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciBjb3JlID0gcmVxdWlyZSgnLi9fY29yZScpO1xudmFyIGZhaWxzID0gcmVxdWlyZSgnLi9fZmFpbHMnKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKEtFWSwgZXhlYykge1xuICB2YXIgZm4gPSAoY29yZS5PYmplY3QgfHwge30pW0tFWV0gfHwgT2JqZWN0W0tFWV07XG4gIHZhciBleHAgPSB7fTtcbiAgZXhwW0tFWV0gPSBleGVjKGZuKTtcbiAgJGV4cG9ydCgkZXhwb3J0LlMgKyAkZXhwb3J0LkYgKiBmYWlscyhmdW5jdGlvbiAoKSB7IGZuKDEpOyB9KSwgJ09iamVjdCcsIGV4cCk7XG59O1xuIiwidmFyIGdldEtleXMgPSByZXF1aXJlKCcuL19vYmplY3Qta2V5cycpO1xudmFyIHRvSU9iamVjdCA9IHJlcXVpcmUoJy4vX3RvLWlvYmplY3QnKTtcbnZhciBpc0VudW0gPSByZXF1aXJlKCcuL19vYmplY3QtcGllJykuZjtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGlzRW50cmllcykge1xuICByZXR1cm4gZnVuY3Rpb24gKGl0KSB7XG4gICAgdmFyIE8gPSB0b0lPYmplY3QoaXQpO1xuICAgIHZhciBrZXlzID0gZ2V0S2V5cyhPKTtcbiAgICB2YXIgbGVuZ3RoID0ga2V5cy5sZW5ndGg7XG4gICAgdmFyIGkgPSAwO1xuICAgIHZhciByZXN1bHQgPSBbXTtcbiAgICB2YXIga2V5O1xuICAgIHdoaWxlIChsZW5ndGggPiBpKSBpZiAoaXNFbnVtLmNhbGwoTywga2V5ID0ga2V5c1tpKytdKSkge1xuICAgICAgcmVzdWx0LnB1c2goaXNFbnRyaWVzID8gW2tleSwgT1trZXldXSA6IE9ba2V5XSk7XG4gICAgfSByZXR1cm4gcmVzdWx0O1xuICB9O1xufTtcbiIsIi8vIGFsbCBvYmplY3Qga2V5cywgaW5jbHVkZXMgbm9uLWVudW1lcmFibGUgYW5kIHN5bWJvbHNcbnZhciBnT1BOID0gcmVxdWlyZSgnLi9fb2JqZWN0LWdvcG4nKTtcbnZhciBnT1BTID0gcmVxdWlyZSgnLi9fb2JqZWN0LWdvcHMnKTtcbnZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4vX2FuLW9iamVjdCcpO1xudmFyIFJlZmxlY3QgPSByZXF1aXJlKCcuL19nbG9iYWwnKS5SZWZsZWN0O1xubW9kdWxlLmV4cG9ydHMgPSBSZWZsZWN0ICYmIFJlZmxlY3Qub3duS2V5cyB8fCBmdW5jdGlvbiBvd25LZXlzKGl0KSB7XG4gIHZhciBrZXlzID0gZ09QTi5mKGFuT2JqZWN0KGl0KSk7XG4gIHZhciBnZXRTeW1ib2xzID0gZ09QUy5mO1xuICByZXR1cm4gZ2V0U3ltYm9scyA/IGtleXMuY29uY2F0KGdldFN5bWJvbHMoaXQpKSA6IGtleXM7XG59O1xuIiwidmFyICRwYXJzZUZsb2F0ID0gcmVxdWlyZSgnLi9fZ2xvYmFsJykucGFyc2VGbG9hdDtcbnZhciAkdHJpbSA9IHJlcXVpcmUoJy4vX3N0cmluZy10cmltJykudHJpbTtcblxubW9kdWxlLmV4cG9ydHMgPSAxIC8gJHBhcnNlRmxvYXQocmVxdWlyZSgnLi9fc3RyaW5nLXdzJykgKyAnLTAnKSAhPT0gLUluZmluaXR5ID8gZnVuY3Rpb24gcGFyc2VGbG9hdChzdHIpIHtcbiAgdmFyIHN0cmluZyA9ICR0cmltKFN0cmluZyhzdHIpLCAzKTtcbiAgdmFyIHJlc3VsdCA9ICRwYXJzZUZsb2F0KHN0cmluZyk7XG4gIHJldHVybiByZXN1bHQgPT09IDAgJiYgc3RyaW5nLmNoYXJBdCgwKSA9PSAnLScgPyAtMCA6IHJlc3VsdDtcbn0gOiAkcGFyc2VGbG9hdDtcbiIsInZhciAkcGFyc2VJbnQgPSByZXF1aXJlKCcuL19nbG9iYWwnKS5wYXJzZUludDtcbnZhciAkdHJpbSA9IHJlcXVpcmUoJy4vX3N0cmluZy10cmltJykudHJpbTtcbnZhciB3cyA9IHJlcXVpcmUoJy4vX3N0cmluZy13cycpO1xudmFyIGhleCA9IC9eWy0rXT8wW3hYXS87XG5cbm1vZHVsZS5leHBvcnRzID0gJHBhcnNlSW50KHdzICsgJzA4JykgIT09IDggfHwgJHBhcnNlSW50KHdzICsgJzB4MTYnKSAhPT0gMjIgPyBmdW5jdGlvbiBwYXJzZUludChzdHIsIHJhZGl4KSB7XG4gIHZhciBzdHJpbmcgPSAkdHJpbShTdHJpbmcoc3RyKSwgMyk7XG4gIHJldHVybiAkcGFyc2VJbnQoc3RyaW5nLCAocmFkaXggPj4+IDApIHx8IChoZXgudGVzdChzdHJpbmcpID8gMTYgOiAxMCkpO1xufSA6ICRwYXJzZUludDtcbiIsIm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGV4ZWMpIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4geyBlOiBmYWxzZSwgdjogZXhlYygpIH07XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXR1cm4geyBlOiB0cnVlLCB2OiBlIH07XG4gIH1cbn07XG4iLCJ2YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuL19hbi1vYmplY3QnKTtcbnZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4vX2lzLW9iamVjdCcpO1xudmFyIG5ld1Byb21pc2VDYXBhYmlsaXR5ID0gcmVxdWlyZSgnLi9fbmV3LXByb21pc2UtY2FwYWJpbGl0eScpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChDLCB4KSB7XG4gIGFuT2JqZWN0KEMpO1xuICBpZiAoaXNPYmplY3QoeCkgJiYgeC5jb25zdHJ1Y3RvciA9PT0gQykgcmV0dXJuIHg7XG4gIHZhciBwcm9taXNlQ2FwYWJpbGl0eSA9IG5ld1Byb21pc2VDYXBhYmlsaXR5LmYoQyk7XG4gIHZhciByZXNvbHZlID0gcHJvbWlzZUNhcGFiaWxpdHkucmVzb2x2ZTtcbiAgcmVzb2x2ZSh4KTtcbiAgcmV0dXJuIHByb21pc2VDYXBhYmlsaXR5LnByb21pc2U7XG59O1xuIiwibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoYml0bWFwLCB2YWx1ZSkge1xuICByZXR1cm4ge1xuICAgIGVudW1lcmFibGU6ICEoYml0bWFwICYgMSksXG4gICAgY29uZmlndXJhYmxlOiAhKGJpdG1hcCAmIDIpLFxuICAgIHdyaXRhYmxlOiAhKGJpdG1hcCAmIDQpLFxuICAgIHZhbHVlOiB2YWx1ZVxuICB9O1xufTtcbiIsInZhciByZWRlZmluZSA9IHJlcXVpcmUoJy4vX3JlZGVmaW5lJyk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uICh0YXJnZXQsIHNyYywgc2FmZSkge1xuICBmb3IgKHZhciBrZXkgaW4gc3JjKSByZWRlZmluZSh0YXJnZXQsIGtleSwgc3JjW2tleV0sIHNhZmUpO1xuICByZXR1cm4gdGFyZ2V0O1xufTtcbiIsInZhciBnbG9iYWwgPSByZXF1aXJlKCcuL19nbG9iYWwnKTtcbnZhciBoaWRlID0gcmVxdWlyZSgnLi9faGlkZScpO1xudmFyIGhhcyA9IHJlcXVpcmUoJy4vX2hhcycpO1xudmFyIFNSQyA9IHJlcXVpcmUoJy4vX3VpZCcpKCdzcmMnKTtcbnZhciBUT19TVFJJTkcgPSAndG9TdHJpbmcnO1xudmFyICR0b1N0cmluZyA9IEZ1bmN0aW9uW1RPX1NUUklOR107XG52YXIgVFBMID0gKCcnICsgJHRvU3RyaW5nKS5zcGxpdChUT19TVFJJTkcpO1xuXG5yZXF1aXJlKCcuL19jb3JlJykuaW5zcGVjdFNvdXJjZSA9IGZ1bmN0aW9uIChpdCkge1xuICByZXR1cm4gJHRvU3RyaW5nLmNhbGwoaXQpO1xufTtcblxuKG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKE8sIGtleSwgdmFsLCBzYWZlKSB7XG4gIHZhciBpc0Z1bmN0aW9uID0gdHlwZW9mIHZhbCA9PSAnZnVuY3Rpb24nO1xuICBpZiAoaXNGdW5jdGlvbikgaGFzKHZhbCwgJ25hbWUnKSB8fCBoaWRlKHZhbCwgJ25hbWUnLCBrZXkpO1xuICBpZiAoT1trZXldID09PSB2YWwpIHJldHVybjtcbiAgaWYgKGlzRnVuY3Rpb24pIGhhcyh2YWwsIFNSQykgfHwgaGlkZSh2YWwsIFNSQywgT1trZXldID8gJycgKyBPW2tleV0gOiBUUEwuam9pbihTdHJpbmcoa2V5KSkpO1xuICBpZiAoTyA9PT0gZ2xvYmFsKSB7XG4gICAgT1trZXldID0gdmFsO1xuICB9IGVsc2UgaWYgKCFzYWZlKSB7XG4gICAgZGVsZXRlIE9ba2V5XTtcbiAgICBoaWRlKE8sIGtleSwgdmFsKTtcbiAgfSBlbHNlIGlmIChPW2tleV0pIHtcbiAgICBPW2tleV0gPSB2YWw7XG4gIH0gZWxzZSB7XG4gICAgaGlkZShPLCBrZXksIHZhbCk7XG4gIH1cbi8vIGFkZCBmYWtlIEZ1bmN0aW9uI3RvU3RyaW5nIGZvciBjb3JyZWN0IHdvcmsgd3JhcHBlZCBtZXRob2RzIC8gY29uc3RydWN0b3JzIHdpdGggbWV0aG9kcyBsaWtlIExvRGFzaCBpc05hdGl2ZVxufSkoRnVuY3Rpb24ucHJvdG90eXBlLCBUT19TVFJJTkcsIGZ1bmN0aW9uIHRvU3RyaW5nKCkge1xuICByZXR1cm4gdHlwZW9mIHRoaXMgPT0gJ2Z1bmN0aW9uJyAmJiB0aGlzW1NSQ10gfHwgJHRvU3RyaW5nLmNhbGwodGhpcyk7XG59KTtcbiIsIm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKHJlZ0V4cCwgcmVwbGFjZSkge1xuICB2YXIgcmVwbGFjZXIgPSByZXBsYWNlID09PSBPYmplY3QocmVwbGFjZSkgPyBmdW5jdGlvbiAocGFydCkge1xuICAgIHJldHVybiByZXBsYWNlW3BhcnRdO1xuICB9IDogcmVwbGFjZTtcbiAgcmV0dXJuIGZ1bmN0aW9uIChpdCkge1xuICAgIHJldHVybiBTdHJpbmcoaXQpLnJlcGxhY2UocmVnRXhwLCByZXBsYWNlcik7XG4gIH07XG59O1xuIiwiLy8gNy4yLjkgU2FtZVZhbHVlKHgsIHkpXG5tb2R1bGUuZXhwb3J0cyA9IE9iamVjdC5pcyB8fCBmdW5jdGlvbiBpcyh4LCB5KSB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zZWxmLWNvbXBhcmVcbiAgcmV0dXJuIHggPT09IHkgPyB4ICE9PSAwIHx8IDEgLyB4ID09PSAxIC8geSA6IHggIT0geCAmJiB5ICE9IHk7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9wcm9wb3NhbC1zZXRtYXAtb2Zmcm9tL1xudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciBhRnVuY3Rpb24gPSByZXF1aXJlKCcuL19hLWZ1bmN0aW9uJyk7XG52YXIgY3R4ID0gcmVxdWlyZSgnLi9fY3R4Jyk7XG52YXIgZm9yT2YgPSByZXF1aXJlKCcuL19mb3Itb2YnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoQ09MTEVDVElPTikge1xuICAkZXhwb3J0KCRleHBvcnQuUywgQ09MTEVDVElPTiwgeyBmcm9tOiBmdW5jdGlvbiBmcm9tKHNvdXJjZSAvKiAsIG1hcEZuLCB0aGlzQXJnICovKSB7XG4gICAgdmFyIG1hcEZuID0gYXJndW1lbnRzWzFdO1xuICAgIHZhciBtYXBwaW5nLCBBLCBuLCBjYjtcbiAgICBhRnVuY3Rpb24odGhpcyk7XG4gICAgbWFwcGluZyA9IG1hcEZuICE9PSB1bmRlZmluZWQ7XG4gICAgaWYgKG1hcHBpbmcpIGFGdW5jdGlvbihtYXBGbik7XG4gICAgaWYgKHNvdXJjZSA9PSB1bmRlZmluZWQpIHJldHVybiBuZXcgdGhpcygpO1xuICAgIEEgPSBbXTtcbiAgICBpZiAobWFwcGluZykge1xuICAgICAgbiA9IDA7XG4gICAgICBjYiA9IGN0eChtYXBGbiwgYXJndW1lbnRzWzJdLCAyKTtcbiAgICAgIGZvck9mKHNvdXJjZSwgZmFsc2UsIGZ1bmN0aW9uIChuZXh0SXRlbSkge1xuICAgICAgICBBLnB1c2goY2IobmV4dEl0ZW0sIG4rKykpO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGZvck9mKHNvdXJjZSwgZmFsc2UsIEEucHVzaCwgQSk7XG4gICAgfVxuICAgIHJldHVybiBuZXcgdGhpcyhBKTtcbiAgfSB9KTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL3Byb3Bvc2FsLXNldG1hcC1vZmZyb20vXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChDT0xMRUNUSU9OKSB7XG4gICRleHBvcnQoJGV4cG9ydC5TLCBDT0xMRUNUSU9OLCB7IG9mOiBmdW5jdGlvbiBvZigpIHtcbiAgICB2YXIgbGVuZ3RoID0gYXJndW1lbnRzLmxlbmd0aDtcbiAgICB2YXIgQSA9IG5ldyBBcnJheShsZW5ndGgpO1xuICAgIHdoaWxlIChsZW5ndGgtLSkgQVtsZW5ndGhdID0gYXJndW1lbnRzW2xlbmd0aF07XG4gICAgcmV0dXJuIG5ldyB0aGlzKEEpO1xuICB9IH0pO1xufTtcbiIsIi8vIFdvcmtzIHdpdGggX19wcm90b19fIG9ubHkuIE9sZCB2OCBjYW4ndCB3b3JrIHdpdGggbnVsbCBwcm90byBvYmplY3RzLlxuLyogZXNsaW50LWRpc2FibGUgbm8tcHJvdG8gKi9cbnZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4vX2lzLW9iamVjdCcpO1xudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi9fYW4tb2JqZWN0Jyk7XG52YXIgY2hlY2sgPSBmdW5jdGlvbiAoTywgcHJvdG8pIHtcbiAgYW5PYmplY3QoTyk7XG4gIGlmICghaXNPYmplY3QocHJvdG8pICYmIHByb3RvICE9PSBudWxsKSB0aHJvdyBUeXBlRXJyb3IocHJvdG8gKyBcIjogY2FuJ3Qgc2V0IGFzIHByb3RvdHlwZSFcIik7XG59O1xubW9kdWxlLmV4cG9ydHMgPSB7XG4gIHNldDogT2JqZWN0LnNldFByb3RvdHlwZU9mIHx8ICgnX19wcm90b19fJyBpbiB7fSA/IC8vIGVzbGludC1kaXNhYmxlLWxpbmVcbiAgICBmdW5jdGlvbiAodGVzdCwgYnVnZ3ksIHNldCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgc2V0ID0gcmVxdWlyZSgnLi9fY3R4JykoRnVuY3Rpb24uY2FsbCwgcmVxdWlyZSgnLi9fb2JqZWN0LWdvcGQnKS5mKE9iamVjdC5wcm90b3R5cGUsICdfX3Byb3RvX18nKS5zZXQsIDIpO1xuICAgICAgICBzZXQodGVzdCwgW10pO1xuICAgICAgICBidWdneSA9ICEodGVzdCBpbnN0YW5jZW9mIEFycmF5KTtcbiAgICAgIH0gY2F0Y2ggKGUpIHsgYnVnZ3kgPSB0cnVlOyB9XG4gICAgICByZXR1cm4gZnVuY3Rpb24gc2V0UHJvdG90eXBlT2YoTywgcHJvdG8pIHtcbiAgICAgICAgY2hlY2soTywgcHJvdG8pO1xuICAgICAgICBpZiAoYnVnZ3kpIE8uX19wcm90b19fID0gcHJvdG87XG4gICAgICAgIGVsc2Ugc2V0KE8sIHByb3RvKTtcbiAgICAgICAgcmV0dXJuIE87XG4gICAgICB9O1xuICAgIH0oe30sIGZhbHNlKSA6IHVuZGVmaW5lZCksXG4gIGNoZWNrOiBjaGVja1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBnbG9iYWwgPSByZXF1aXJlKCcuL19nbG9iYWwnKTtcbnZhciBkUCA9IHJlcXVpcmUoJy4vX29iamVjdC1kcCcpO1xudmFyIERFU0NSSVBUT1JTID0gcmVxdWlyZSgnLi9fZGVzY3JpcHRvcnMnKTtcbnZhciBTUEVDSUVTID0gcmVxdWlyZSgnLi9fd2tzJykoJ3NwZWNpZXMnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoS0VZKSB7XG4gIHZhciBDID0gZ2xvYmFsW0tFWV07XG4gIGlmIChERVNDUklQVE9SUyAmJiBDICYmICFDW1NQRUNJRVNdKSBkUC5mKEMsIFNQRUNJRVMsIHtcbiAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9XG4gIH0pO1xufTtcbiIsInZhciBkZWYgPSByZXF1aXJlKCcuL19vYmplY3QtZHAnKS5mO1xudmFyIGhhcyA9IHJlcXVpcmUoJy4vX2hhcycpO1xudmFyIFRBRyA9IHJlcXVpcmUoJy4vX3drcycpKCd0b1N0cmluZ1RhZycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCwgdGFnLCBzdGF0KSB7XG4gIGlmIChpdCAmJiAhaGFzKGl0ID0gc3RhdCA/IGl0IDogaXQucHJvdG90eXBlLCBUQUcpKSBkZWYoaXQsIFRBRywgeyBjb25maWd1cmFibGU6IHRydWUsIHZhbHVlOiB0YWcgfSk7XG59O1xuIiwidmFyIHNoYXJlZCA9IHJlcXVpcmUoJy4vX3NoYXJlZCcpKCdrZXlzJyk7XG52YXIgdWlkID0gcmVxdWlyZSgnLi9fdWlkJyk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChrZXkpIHtcbiAgcmV0dXJuIHNoYXJlZFtrZXldIHx8IChzaGFyZWRba2V5XSA9IHVpZChrZXkpKTtcbn07XG4iLCJ2YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi9fZ2xvYmFsJyk7XG52YXIgU0hBUkVEID0gJ19fY29yZS1qc19zaGFyZWRfXyc7XG52YXIgc3RvcmUgPSBnbG9iYWxbU0hBUkVEXSB8fCAoZ2xvYmFsW1NIQVJFRF0gPSB7fSk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChrZXkpIHtcbiAgcmV0dXJuIHN0b3JlW2tleV0gfHwgKHN0b3JlW2tleV0gPSB7fSk7XG59O1xuIiwiLy8gNy4zLjIwIFNwZWNpZXNDb25zdHJ1Y3RvcihPLCBkZWZhdWx0Q29uc3RydWN0b3IpXG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuL19hbi1vYmplY3QnKTtcbnZhciBhRnVuY3Rpb24gPSByZXF1aXJlKCcuL19hLWZ1bmN0aW9uJyk7XG52YXIgU1BFQ0lFUyA9IHJlcXVpcmUoJy4vX3drcycpKCdzcGVjaWVzJyk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChPLCBEKSB7XG4gIHZhciBDID0gYW5PYmplY3QoTykuY29uc3RydWN0b3I7XG4gIHZhciBTO1xuICByZXR1cm4gQyA9PT0gdW5kZWZpbmVkIHx8IChTID0gYW5PYmplY3QoQylbU1BFQ0lFU10pID09IHVuZGVmaW5lZCA/IEQgOiBhRnVuY3Rpb24oUyk7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGZhaWxzID0gcmVxdWlyZSgnLi9fZmFpbHMnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAobWV0aG9kLCBhcmcpIHtcbiAgcmV0dXJuICEhbWV0aG9kICYmIGZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdXNlbGVzcy1jYWxsXG4gICAgYXJnID8gbWV0aG9kLmNhbGwobnVsbCwgZnVuY3Rpb24gKCkgeyAvKiBlbXB0eSAqLyB9LCAxKSA6IG1ldGhvZC5jYWxsKG51bGwpO1xuICB9KTtcbn07XG4iLCJ2YXIgdG9JbnRlZ2VyID0gcmVxdWlyZSgnLi9fdG8taW50ZWdlcicpO1xudmFyIGRlZmluZWQgPSByZXF1aXJlKCcuL19kZWZpbmVkJyk7XG4vLyB0cnVlICAtPiBTdHJpbmcjYXRcbi8vIGZhbHNlIC0+IFN0cmluZyNjb2RlUG9pbnRBdFxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoVE9fU1RSSU5HKSB7XG4gIHJldHVybiBmdW5jdGlvbiAodGhhdCwgcG9zKSB7XG4gICAgdmFyIHMgPSBTdHJpbmcoZGVmaW5lZCh0aGF0KSk7XG4gICAgdmFyIGkgPSB0b0ludGVnZXIocG9zKTtcbiAgICB2YXIgbCA9IHMubGVuZ3RoO1xuICAgIHZhciBhLCBiO1xuICAgIGlmIChpIDwgMCB8fCBpID49IGwpIHJldHVybiBUT19TVFJJTkcgPyAnJyA6IHVuZGVmaW5lZDtcbiAgICBhID0gcy5jaGFyQ29kZUF0KGkpO1xuICAgIHJldHVybiBhIDwgMHhkODAwIHx8IGEgPiAweGRiZmYgfHwgaSArIDEgPT09IGwgfHwgKGIgPSBzLmNoYXJDb2RlQXQoaSArIDEpKSA8IDB4ZGMwMCB8fCBiID4gMHhkZmZmXG4gICAgICA/IFRPX1NUUklORyA/IHMuY2hhckF0KGkpIDogYVxuICAgICAgOiBUT19TVFJJTkcgPyBzLnNsaWNlKGksIGkgKyAyKSA6IChhIC0gMHhkODAwIDw8IDEwKSArIChiIC0gMHhkYzAwKSArIDB4MTAwMDA7XG4gIH07XG59O1xuIiwiLy8gaGVscGVyIGZvciBTdHJpbmcje3N0YXJ0c1dpdGgsIGVuZHNXaXRoLCBpbmNsdWRlc31cbnZhciBpc1JlZ0V4cCA9IHJlcXVpcmUoJy4vX2lzLXJlZ2V4cCcpO1xudmFyIGRlZmluZWQgPSByZXF1aXJlKCcuL19kZWZpbmVkJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKHRoYXQsIHNlYXJjaFN0cmluZywgTkFNRSkge1xuICBpZiAoaXNSZWdFeHAoc2VhcmNoU3RyaW5nKSkgdGhyb3cgVHlwZUVycm9yKCdTdHJpbmcjJyArIE5BTUUgKyBcIiBkb2Vzbid0IGFjY2VwdCByZWdleCFcIik7XG4gIHJldHVybiBTdHJpbmcoZGVmaW5lZCh0aGF0KSk7XG59O1xuIiwidmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciBmYWlscyA9IHJlcXVpcmUoJy4vX2ZhaWxzJyk7XG52YXIgZGVmaW5lZCA9IHJlcXVpcmUoJy4vX2RlZmluZWQnKTtcbnZhciBxdW90ID0gL1wiL2c7XG4vLyBCLjIuMy4yLjEgQ3JlYXRlSFRNTChzdHJpbmcsIHRhZywgYXR0cmlidXRlLCB2YWx1ZSlcbnZhciBjcmVhdGVIVE1MID0gZnVuY3Rpb24gKHN0cmluZywgdGFnLCBhdHRyaWJ1dGUsIHZhbHVlKSB7XG4gIHZhciBTID0gU3RyaW5nKGRlZmluZWQoc3RyaW5nKSk7XG4gIHZhciBwMSA9ICc8JyArIHRhZztcbiAgaWYgKGF0dHJpYnV0ZSAhPT0gJycpIHAxICs9ICcgJyArIGF0dHJpYnV0ZSArICc9XCInICsgU3RyaW5nKHZhbHVlKS5yZXBsYWNlKHF1b3QsICcmcXVvdDsnKSArICdcIic7XG4gIHJldHVybiBwMSArICc+JyArIFMgKyAnPC8nICsgdGFnICsgJz4nO1xufTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKE5BTUUsIGV4ZWMpIHtcbiAgdmFyIE8gPSB7fTtcbiAgT1tOQU1FXSA9IGV4ZWMoY3JlYXRlSFRNTCk7XG4gICRleHBvcnQoJGV4cG9ydC5QICsgJGV4cG9ydC5GICogZmFpbHMoZnVuY3Rpb24gKCkge1xuICAgIHZhciB0ZXN0ID0gJydbTkFNRV0oJ1wiJyk7XG4gICAgcmV0dXJuIHRlc3QgIT09IHRlc3QudG9Mb3dlckNhc2UoKSB8fCB0ZXN0LnNwbGl0KCdcIicpLmxlbmd0aCA+IDM7XG4gIH0pLCAnU3RyaW5nJywgTyk7XG59O1xuIiwiLy8gaHR0cHM6Ly9naXRodWIuY29tL3RjMzkvcHJvcG9zYWwtc3RyaW5nLXBhZC1zdGFydC1lbmRcbnZhciB0b0xlbmd0aCA9IHJlcXVpcmUoJy4vX3RvLWxlbmd0aCcpO1xudmFyIHJlcGVhdCA9IHJlcXVpcmUoJy4vX3N0cmluZy1yZXBlYXQnKTtcbnZhciBkZWZpbmVkID0gcmVxdWlyZSgnLi9fZGVmaW5lZCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uICh0aGF0LCBtYXhMZW5ndGgsIGZpbGxTdHJpbmcsIGxlZnQpIHtcbiAgdmFyIFMgPSBTdHJpbmcoZGVmaW5lZCh0aGF0KSk7XG4gIHZhciBzdHJpbmdMZW5ndGggPSBTLmxlbmd0aDtcbiAgdmFyIGZpbGxTdHIgPSBmaWxsU3RyaW5nID09PSB1bmRlZmluZWQgPyAnICcgOiBTdHJpbmcoZmlsbFN0cmluZyk7XG4gIHZhciBpbnRNYXhMZW5ndGggPSB0b0xlbmd0aChtYXhMZW5ndGgpO1xuICBpZiAoaW50TWF4TGVuZ3RoIDw9IHN0cmluZ0xlbmd0aCB8fCBmaWxsU3RyID09ICcnKSByZXR1cm4gUztcbiAgdmFyIGZpbGxMZW4gPSBpbnRNYXhMZW5ndGggLSBzdHJpbmdMZW5ndGg7XG4gIHZhciBzdHJpbmdGaWxsZXIgPSByZXBlYXQuY2FsbChmaWxsU3RyLCBNYXRoLmNlaWwoZmlsbExlbiAvIGZpbGxTdHIubGVuZ3RoKSk7XG4gIGlmIChzdHJpbmdGaWxsZXIubGVuZ3RoID4gZmlsbExlbikgc3RyaW5nRmlsbGVyID0gc3RyaW5nRmlsbGVyLnNsaWNlKDAsIGZpbGxMZW4pO1xuICByZXR1cm4gbGVmdCA/IHN0cmluZ0ZpbGxlciArIFMgOiBTICsgc3RyaW5nRmlsbGVyO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciB0b0ludGVnZXIgPSByZXF1aXJlKCcuL190by1pbnRlZ2VyJyk7XG52YXIgZGVmaW5lZCA9IHJlcXVpcmUoJy4vX2RlZmluZWQnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiByZXBlYXQoY291bnQpIHtcbiAgdmFyIHN0ciA9IFN0cmluZyhkZWZpbmVkKHRoaXMpKTtcbiAgdmFyIHJlcyA9ICcnO1xuICB2YXIgbiA9IHRvSW50ZWdlcihjb3VudCk7XG4gIGlmIChuIDwgMCB8fCBuID09IEluZmluaXR5KSB0aHJvdyBSYW5nZUVycm9yKFwiQ291bnQgY2FuJ3QgYmUgbmVnYXRpdmVcIik7XG4gIGZvciAoO24gPiAwOyAobiA+Pj49IDEpICYmIChzdHIgKz0gc3RyKSkgaWYgKG4gJiAxKSByZXMgKz0gc3RyO1xuICByZXR1cm4gcmVzO1xufTtcbiIsInZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgZGVmaW5lZCA9IHJlcXVpcmUoJy4vX2RlZmluZWQnKTtcbnZhciBmYWlscyA9IHJlcXVpcmUoJy4vX2ZhaWxzJyk7XG52YXIgc3BhY2VzID0gcmVxdWlyZSgnLi9fc3RyaW5nLXdzJyk7XG52YXIgc3BhY2UgPSAnWycgKyBzcGFjZXMgKyAnXSc7XG52YXIgbm9uID0gJ1xcdTIwMGJcXHUwMDg1JztcbnZhciBsdHJpbSA9IFJlZ0V4cCgnXicgKyBzcGFjZSArIHNwYWNlICsgJyonKTtcbnZhciBydHJpbSA9IFJlZ0V4cChzcGFjZSArIHNwYWNlICsgJyokJyk7XG5cbnZhciBleHBvcnRlciA9IGZ1bmN0aW9uIChLRVksIGV4ZWMsIEFMSUFTKSB7XG4gIHZhciBleHAgPSB7fTtcbiAgdmFyIEZPUkNFID0gZmFpbHMoZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiAhIXNwYWNlc1tLRVldKCkgfHwgbm9uW0tFWV0oKSAhPSBub247XG4gIH0pO1xuICB2YXIgZm4gPSBleHBbS0VZXSA9IEZPUkNFID8gZXhlYyh0cmltKSA6IHNwYWNlc1tLRVldO1xuICBpZiAoQUxJQVMpIGV4cFtBTElBU10gPSBmbjtcbiAgJGV4cG9ydCgkZXhwb3J0LlAgKyAkZXhwb3J0LkYgKiBGT1JDRSwgJ1N0cmluZycsIGV4cCk7XG59O1xuXG4vLyAxIC0+IFN0cmluZyN0cmltTGVmdFxuLy8gMiAtPiBTdHJpbmcjdHJpbVJpZ2h0XG4vLyAzIC0+IFN0cmluZyN0cmltXG52YXIgdHJpbSA9IGV4cG9ydGVyLnRyaW0gPSBmdW5jdGlvbiAoc3RyaW5nLCBUWVBFKSB7XG4gIHN0cmluZyA9IFN0cmluZyhkZWZpbmVkKHN0cmluZykpO1xuICBpZiAoVFlQRSAmIDEpIHN0cmluZyA9IHN0cmluZy5yZXBsYWNlKGx0cmltLCAnJyk7XG4gIGlmIChUWVBFICYgMikgc3RyaW5nID0gc3RyaW5nLnJlcGxhY2UocnRyaW0sICcnKTtcbiAgcmV0dXJuIHN0cmluZztcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0ZXI7XG4iLCJtb2R1bGUuZXhwb3J0cyA9ICdcXHgwOVxceDBBXFx4MEJcXHgwQ1xceDBEXFx4MjBcXHhBMFxcdTE2ODBcXHUxODBFXFx1MjAwMFxcdTIwMDFcXHUyMDAyXFx1MjAwMycgK1xuICAnXFx1MjAwNFxcdTIwMDVcXHUyMDA2XFx1MjAwN1xcdTIwMDhcXHUyMDA5XFx1MjAwQVxcdTIwMkZcXHUyMDVGXFx1MzAwMFxcdTIwMjhcXHUyMDI5XFx1RkVGRic7XG4iLCJ2YXIgY3R4ID0gcmVxdWlyZSgnLi9fY3R4Jyk7XG52YXIgaW52b2tlID0gcmVxdWlyZSgnLi9faW52b2tlJyk7XG52YXIgaHRtbCA9IHJlcXVpcmUoJy4vX2h0bWwnKTtcbnZhciBjZWwgPSByZXF1aXJlKCcuL19kb20tY3JlYXRlJyk7XG52YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi9fZ2xvYmFsJyk7XG52YXIgcHJvY2VzcyA9IGdsb2JhbC5wcm9jZXNzO1xudmFyIHNldFRhc2sgPSBnbG9iYWwuc2V0SW1tZWRpYXRlO1xudmFyIGNsZWFyVGFzayA9IGdsb2JhbC5jbGVhckltbWVkaWF0ZTtcbnZhciBNZXNzYWdlQ2hhbm5lbCA9IGdsb2JhbC5NZXNzYWdlQ2hhbm5lbDtcbnZhciBEaXNwYXRjaCA9IGdsb2JhbC5EaXNwYXRjaDtcbnZhciBjb3VudGVyID0gMDtcbnZhciBxdWV1ZSA9IHt9O1xudmFyIE9OUkVBRFlTVEFURUNIQU5HRSA9ICdvbnJlYWR5c3RhdGVjaGFuZ2UnO1xudmFyIGRlZmVyLCBjaGFubmVsLCBwb3J0O1xudmFyIHJ1biA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIGlkID0gK3RoaXM7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wcm90b3R5cGUtYnVpbHRpbnNcbiAgaWYgKHF1ZXVlLmhhc093blByb3BlcnR5KGlkKSkge1xuICAgIHZhciBmbiA9IHF1ZXVlW2lkXTtcbiAgICBkZWxldGUgcXVldWVbaWRdO1xuICAgIGZuKCk7XG4gIH1cbn07XG52YXIgbGlzdGVuZXIgPSBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgcnVuLmNhbGwoZXZlbnQuZGF0YSk7XG59O1xuLy8gTm9kZS5qcyAwLjkrICYgSUUxMCsgaGFzIHNldEltbWVkaWF0ZSwgb3RoZXJ3aXNlOlxuaWYgKCFzZXRUYXNrIHx8ICFjbGVhclRhc2spIHtcbiAgc2V0VGFzayA9IGZ1bmN0aW9uIHNldEltbWVkaWF0ZShmbikge1xuICAgIHZhciBhcmdzID0gW107XG4gICAgdmFyIGkgPSAxO1xuICAgIHdoaWxlIChhcmd1bWVudHMubGVuZ3RoID4gaSkgYXJncy5wdXNoKGFyZ3VtZW50c1tpKytdKTtcbiAgICBxdWV1ZVsrK2NvdW50ZXJdID0gZnVuY3Rpb24gKCkge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLW5ldy1mdW5jXG4gICAgICBpbnZva2UodHlwZW9mIGZuID09ICdmdW5jdGlvbicgPyBmbiA6IEZ1bmN0aW9uKGZuKSwgYXJncyk7XG4gICAgfTtcbiAgICBkZWZlcihjb3VudGVyKTtcbiAgICByZXR1cm4gY291bnRlcjtcbiAgfTtcbiAgY2xlYXJUYXNrID0gZnVuY3Rpb24gY2xlYXJJbW1lZGlhdGUoaWQpIHtcbiAgICBkZWxldGUgcXVldWVbaWRdO1xuICB9O1xuICAvLyBOb2RlLmpzIDAuOC1cbiAgaWYgKHJlcXVpcmUoJy4vX2NvZicpKHByb2Nlc3MpID09ICdwcm9jZXNzJykge1xuICAgIGRlZmVyID0gZnVuY3Rpb24gKGlkKSB7XG4gICAgICBwcm9jZXNzLm5leHRUaWNrKGN0eChydW4sIGlkLCAxKSk7XG4gICAgfTtcbiAgLy8gU3BoZXJlIChKUyBnYW1lIGVuZ2luZSkgRGlzcGF0Y2ggQVBJXG4gIH0gZWxzZSBpZiAoRGlzcGF0Y2ggJiYgRGlzcGF0Y2gubm93KSB7XG4gICAgZGVmZXIgPSBmdW5jdGlvbiAoaWQpIHtcbiAgICAgIERpc3BhdGNoLm5vdyhjdHgocnVuLCBpZCwgMSkpO1xuICAgIH07XG4gIC8vIEJyb3dzZXJzIHdpdGggTWVzc2FnZUNoYW5uZWwsIGluY2x1ZGVzIFdlYldvcmtlcnNcbiAgfSBlbHNlIGlmIChNZXNzYWdlQ2hhbm5lbCkge1xuICAgIGNoYW5uZWwgPSBuZXcgTWVzc2FnZUNoYW5uZWwoKTtcbiAgICBwb3J0ID0gY2hhbm5lbC5wb3J0MjtcbiAgICBjaGFubmVsLnBvcnQxLm9ubWVzc2FnZSA9IGxpc3RlbmVyO1xuICAgIGRlZmVyID0gY3R4KHBvcnQucG9zdE1lc3NhZ2UsIHBvcnQsIDEpO1xuICAvLyBCcm93c2VycyB3aXRoIHBvc3RNZXNzYWdlLCBza2lwIFdlYldvcmtlcnNcbiAgLy8gSUU4IGhhcyBwb3N0TWVzc2FnZSwgYnV0IGl0J3Mgc3luYyAmIHR5cGVvZiBpdHMgcG9zdE1lc3NhZ2UgaXMgJ29iamVjdCdcbiAgfSBlbHNlIGlmIChnbG9iYWwuYWRkRXZlbnRMaXN0ZW5lciAmJiB0eXBlb2YgcG9zdE1lc3NhZ2UgPT0gJ2Z1bmN0aW9uJyAmJiAhZ2xvYmFsLmltcG9ydFNjcmlwdHMpIHtcbiAgICBkZWZlciA9IGZ1bmN0aW9uIChpZCkge1xuICAgICAgZ2xvYmFsLnBvc3RNZXNzYWdlKGlkICsgJycsICcqJyk7XG4gICAgfTtcbiAgICBnbG9iYWwuYWRkRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIGxpc3RlbmVyLCBmYWxzZSk7XG4gIC8vIElFOC1cbiAgfSBlbHNlIGlmIChPTlJFQURZU1RBVEVDSEFOR0UgaW4gY2VsKCdzY3JpcHQnKSkge1xuICAgIGRlZmVyID0gZnVuY3Rpb24gKGlkKSB7XG4gICAgICBodG1sLmFwcGVuZENoaWxkKGNlbCgnc2NyaXB0JykpW09OUkVBRFlTVEFURUNIQU5HRV0gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGh0bWwucmVtb3ZlQ2hpbGQodGhpcyk7XG4gICAgICAgIHJ1bi5jYWxsKGlkKTtcbiAgICAgIH07XG4gICAgfTtcbiAgLy8gUmVzdCBvbGQgYnJvd3NlcnNcbiAgfSBlbHNlIHtcbiAgICBkZWZlciA9IGZ1bmN0aW9uIChpZCkge1xuICAgICAgc2V0VGltZW91dChjdHgocnVuLCBpZCwgMSksIDApO1xuICAgIH07XG4gIH1cbn1cbm1vZHVsZS5leHBvcnRzID0ge1xuICBzZXQ6IHNldFRhc2ssXG4gIGNsZWFyOiBjbGVhclRhc2tcbn07XG4iLCJ2YXIgdG9JbnRlZ2VyID0gcmVxdWlyZSgnLi9fdG8taW50ZWdlcicpO1xudmFyIG1heCA9IE1hdGgubWF4O1xudmFyIG1pbiA9IE1hdGgubWluO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaW5kZXgsIGxlbmd0aCkge1xuICBpbmRleCA9IHRvSW50ZWdlcihpbmRleCk7XG4gIHJldHVybiBpbmRleCA8IDAgPyBtYXgoaW5kZXggKyBsZW5ndGgsIDApIDogbWluKGluZGV4LCBsZW5ndGgpO1xufTtcbiIsIi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXRvaW5kZXhcbnZhciB0b0ludGVnZXIgPSByZXF1aXJlKCcuL190by1pbnRlZ2VyJyk7XG52YXIgdG9MZW5ndGggPSByZXF1aXJlKCcuL190by1sZW5ndGgnKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIGlmIChpdCA9PT0gdW5kZWZpbmVkKSByZXR1cm4gMDtcbiAgdmFyIG51bWJlciA9IHRvSW50ZWdlcihpdCk7XG4gIHZhciBsZW5ndGggPSB0b0xlbmd0aChudW1iZXIpO1xuICBpZiAobnVtYmVyICE9PSBsZW5ndGgpIHRocm93IFJhbmdlRXJyb3IoJ1dyb25nIGxlbmd0aCEnKTtcbiAgcmV0dXJuIGxlbmd0aDtcbn07XG4iLCIvLyA3LjEuNCBUb0ludGVnZXJcbnZhciBjZWlsID0gTWF0aC5jZWlsO1xudmFyIGZsb29yID0gTWF0aC5mbG9vcjtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIHJldHVybiBpc05hTihpdCA9ICtpdCkgPyAwIDogKGl0ID4gMCA/IGZsb29yIDogY2VpbCkoaXQpO1xufTtcbiIsIi8vIHRvIGluZGV4ZWQgb2JqZWN0LCB0b09iamVjdCB3aXRoIGZhbGxiYWNrIGZvciBub24tYXJyYXktbGlrZSBFUzMgc3RyaW5nc1xudmFyIElPYmplY3QgPSByZXF1aXJlKCcuL19pb2JqZWN0Jyk7XG52YXIgZGVmaW5lZCA9IHJlcXVpcmUoJy4vX2RlZmluZWQnKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIHJldHVybiBJT2JqZWN0KGRlZmluZWQoaXQpKTtcbn07XG4iLCIvLyA3LjEuMTUgVG9MZW5ndGhcbnZhciB0b0ludGVnZXIgPSByZXF1aXJlKCcuL190by1pbnRlZ2VyJyk7XG52YXIgbWluID0gTWF0aC5taW47XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICByZXR1cm4gaXQgPiAwID8gbWluKHRvSW50ZWdlcihpdCksIDB4MWZmZmZmZmZmZmZmZmYpIDogMDsgLy8gcG93KDIsIDUzKSAtIDEgPT0gOTAwNzE5OTI1NDc0MDk5MVxufTtcbiIsIi8vIDcuMS4xMyBUb09iamVjdChhcmd1bWVudClcbnZhciBkZWZpbmVkID0gcmVxdWlyZSgnLi9fZGVmaW5lZCcpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIE9iamVjdChkZWZpbmVkKGl0KSk7XG59O1xuIiwiLy8gNy4xLjEgVG9QcmltaXRpdmUoaW5wdXQgWywgUHJlZmVycmVkVHlwZV0pXG52YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuL19pcy1vYmplY3QnKTtcbi8vIGluc3RlYWQgb2YgdGhlIEVTNiBzcGVjIHZlcnNpb24sIHdlIGRpZG4ndCBpbXBsZW1lbnQgQEB0b1ByaW1pdGl2ZSBjYXNlXG4vLyBhbmQgdGhlIHNlY29uZCBhcmd1bWVudCAtIGZsYWcgLSBwcmVmZXJyZWQgdHlwZSBpcyBhIHN0cmluZ1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQsIFMpIHtcbiAgaWYgKCFpc09iamVjdChpdCkpIHJldHVybiBpdDtcbiAgdmFyIGZuLCB2YWw7XG4gIGlmIChTICYmIHR5cGVvZiAoZm4gPSBpdC50b1N0cmluZykgPT0gJ2Z1bmN0aW9uJyAmJiAhaXNPYmplY3QodmFsID0gZm4uY2FsbChpdCkpKSByZXR1cm4gdmFsO1xuICBpZiAodHlwZW9mIChmbiA9IGl0LnZhbHVlT2YpID09ICdmdW5jdGlvbicgJiYgIWlzT2JqZWN0KHZhbCA9IGZuLmNhbGwoaXQpKSkgcmV0dXJuIHZhbDtcbiAgaWYgKCFTICYmIHR5cGVvZiAoZm4gPSBpdC50b1N0cmluZykgPT0gJ2Z1bmN0aW9uJyAmJiAhaXNPYmplY3QodmFsID0gZm4uY2FsbChpdCkpKSByZXR1cm4gdmFsO1xuICB0aHJvdyBUeXBlRXJyb3IoXCJDYW4ndCBjb252ZXJ0IG9iamVjdCB0byBwcmltaXRpdmUgdmFsdWVcIik7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuaWYgKHJlcXVpcmUoJy4vX2Rlc2NyaXB0b3JzJykpIHtcbiAgdmFyIExJQlJBUlkgPSByZXF1aXJlKCcuL19saWJyYXJ5Jyk7XG4gIHZhciBnbG9iYWwgPSByZXF1aXJlKCcuL19nbG9iYWwnKTtcbiAgdmFyIGZhaWxzID0gcmVxdWlyZSgnLi9fZmFpbHMnKTtcbiAgdmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbiAgdmFyICR0eXBlZCA9IHJlcXVpcmUoJy4vX3R5cGVkJyk7XG4gIHZhciAkYnVmZmVyID0gcmVxdWlyZSgnLi9fdHlwZWQtYnVmZmVyJyk7XG4gIHZhciBjdHggPSByZXF1aXJlKCcuL19jdHgnKTtcbiAgdmFyIGFuSW5zdGFuY2UgPSByZXF1aXJlKCcuL19hbi1pbnN0YW5jZScpO1xuICB2YXIgcHJvcGVydHlEZXNjID0gcmVxdWlyZSgnLi9fcHJvcGVydHktZGVzYycpO1xuICB2YXIgaGlkZSA9IHJlcXVpcmUoJy4vX2hpZGUnKTtcbiAgdmFyIHJlZGVmaW5lQWxsID0gcmVxdWlyZSgnLi9fcmVkZWZpbmUtYWxsJyk7XG4gIHZhciB0b0ludGVnZXIgPSByZXF1aXJlKCcuL190by1pbnRlZ2VyJyk7XG4gIHZhciB0b0xlbmd0aCA9IHJlcXVpcmUoJy4vX3RvLWxlbmd0aCcpO1xuICB2YXIgdG9JbmRleCA9IHJlcXVpcmUoJy4vX3RvLWluZGV4Jyk7XG4gIHZhciB0b0Fic29sdXRlSW5kZXggPSByZXF1aXJlKCcuL190by1hYnNvbHV0ZS1pbmRleCcpO1xuICB2YXIgdG9QcmltaXRpdmUgPSByZXF1aXJlKCcuL190by1wcmltaXRpdmUnKTtcbiAgdmFyIGhhcyA9IHJlcXVpcmUoJy4vX2hhcycpO1xuICB2YXIgY2xhc3NvZiA9IHJlcXVpcmUoJy4vX2NsYXNzb2YnKTtcbiAgdmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9faXMtb2JqZWN0Jyk7XG4gIHZhciB0b09iamVjdCA9IHJlcXVpcmUoJy4vX3RvLW9iamVjdCcpO1xuICB2YXIgaXNBcnJheUl0ZXIgPSByZXF1aXJlKCcuL19pcy1hcnJheS1pdGVyJyk7XG4gIHZhciBjcmVhdGUgPSByZXF1aXJlKCcuL19vYmplY3QtY3JlYXRlJyk7XG4gIHZhciBnZXRQcm90b3R5cGVPZiA9IHJlcXVpcmUoJy4vX29iamVjdC1ncG8nKTtcbiAgdmFyIGdPUE4gPSByZXF1aXJlKCcuL19vYmplY3QtZ29wbicpLmY7XG4gIHZhciBnZXRJdGVyRm4gPSByZXF1aXJlKCcuL2NvcmUuZ2V0LWl0ZXJhdG9yLW1ldGhvZCcpO1xuICB2YXIgdWlkID0gcmVxdWlyZSgnLi9fdWlkJyk7XG4gIHZhciB3a3MgPSByZXF1aXJlKCcuL193a3MnKTtcbiAgdmFyIGNyZWF0ZUFycmF5TWV0aG9kID0gcmVxdWlyZSgnLi9fYXJyYXktbWV0aG9kcycpO1xuICB2YXIgY3JlYXRlQXJyYXlJbmNsdWRlcyA9IHJlcXVpcmUoJy4vX2FycmF5LWluY2x1ZGVzJyk7XG4gIHZhciBzcGVjaWVzQ29uc3RydWN0b3IgPSByZXF1aXJlKCcuL19zcGVjaWVzLWNvbnN0cnVjdG9yJyk7XG4gIHZhciBBcnJheUl0ZXJhdG9ycyA9IHJlcXVpcmUoJy4vZXM2LmFycmF5Lml0ZXJhdG9yJyk7XG4gIHZhciBJdGVyYXRvcnMgPSByZXF1aXJlKCcuL19pdGVyYXRvcnMnKTtcbiAgdmFyICRpdGVyRGV0ZWN0ID0gcmVxdWlyZSgnLi9faXRlci1kZXRlY3QnKTtcbiAgdmFyIHNldFNwZWNpZXMgPSByZXF1aXJlKCcuL19zZXQtc3BlY2llcycpO1xuICB2YXIgYXJyYXlGaWxsID0gcmVxdWlyZSgnLi9fYXJyYXktZmlsbCcpO1xuICB2YXIgYXJyYXlDb3B5V2l0aGluID0gcmVxdWlyZSgnLi9fYXJyYXktY29weS13aXRoaW4nKTtcbiAgdmFyICREUCA9IHJlcXVpcmUoJy4vX29iamVjdC1kcCcpO1xuICB2YXIgJEdPUEQgPSByZXF1aXJlKCcuL19vYmplY3QtZ29wZCcpO1xuICB2YXIgZFAgPSAkRFAuZjtcbiAgdmFyIGdPUEQgPSAkR09QRC5mO1xuICB2YXIgUmFuZ2VFcnJvciA9IGdsb2JhbC5SYW5nZUVycm9yO1xuICB2YXIgVHlwZUVycm9yID0gZ2xvYmFsLlR5cGVFcnJvcjtcbiAgdmFyIFVpbnQ4QXJyYXkgPSBnbG9iYWwuVWludDhBcnJheTtcbiAgdmFyIEFSUkFZX0JVRkZFUiA9ICdBcnJheUJ1ZmZlcic7XG4gIHZhciBTSEFSRURfQlVGRkVSID0gJ1NoYXJlZCcgKyBBUlJBWV9CVUZGRVI7XG4gIHZhciBCWVRFU19QRVJfRUxFTUVOVCA9ICdCWVRFU19QRVJfRUxFTUVOVCc7XG4gIHZhciBQUk9UT1RZUEUgPSAncHJvdG90eXBlJztcbiAgdmFyIEFycmF5UHJvdG8gPSBBcnJheVtQUk9UT1RZUEVdO1xuICB2YXIgJEFycmF5QnVmZmVyID0gJGJ1ZmZlci5BcnJheUJ1ZmZlcjtcbiAgdmFyICREYXRhVmlldyA9ICRidWZmZXIuRGF0YVZpZXc7XG4gIHZhciBhcnJheUZvckVhY2ggPSBjcmVhdGVBcnJheU1ldGhvZCgwKTtcbiAgdmFyIGFycmF5RmlsdGVyID0gY3JlYXRlQXJyYXlNZXRob2QoMik7XG4gIHZhciBhcnJheVNvbWUgPSBjcmVhdGVBcnJheU1ldGhvZCgzKTtcbiAgdmFyIGFycmF5RXZlcnkgPSBjcmVhdGVBcnJheU1ldGhvZCg0KTtcbiAgdmFyIGFycmF5RmluZCA9IGNyZWF0ZUFycmF5TWV0aG9kKDUpO1xuICB2YXIgYXJyYXlGaW5kSW5kZXggPSBjcmVhdGVBcnJheU1ldGhvZCg2KTtcbiAgdmFyIGFycmF5SW5jbHVkZXMgPSBjcmVhdGVBcnJheUluY2x1ZGVzKHRydWUpO1xuICB2YXIgYXJyYXlJbmRleE9mID0gY3JlYXRlQXJyYXlJbmNsdWRlcyhmYWxzZSk7XG4gIHZhciBhcnJheVZhbHVlcyA9IEFycmF5SXRlcmF0b3JzLnZhbHVlcztcbiAgdmFyIGFycmF5S2V5cyA9IEFycmF5SXRlcmF0b3JzLmtleXM7XG4gIHZhciBhcnJheUVudHJpZXMgPSBBcnJheUl0ZXJhdG9ycy5lbnRyaWVzO1xuICB2YXIgYXJyYXlMYXN0SW5kZXhPZiA9IEFycmF5UHJvdG8ubGFzdEluZGV4T2Y7XG4gIHZhciBhcnJheVJlZHVjZSA9IEFycmF5UHJvdG8ucmVkdWNlO1xuICB2YXIgYXJyYXlSZWR1Y2VSaWdodCA9IEFycmF5UHJvdG8ucmVkdWNlUmlnaHQ7XG4gIHZhciBhcnJheUpvaW4gPSBBcnJheVByb3RvLmpvaW47XG4gIHZhciBhcnJheVNvcnQgPSBBcnJheVByb3RvLnNvcnQ7XG4gIHZhciBhcnJheVNsaWNlID0gQXJyYXlQcm90by5zbGljZTtcbiAgdmFyIGFycmF5VG9TdHJpbmcgPSBBcnJheVByb3RvLnRvU3RyaW5nO1xuICB2YXIgYXJyYXlUb0xvY2FsZVN0cmluZyA9IEFycmF5UHJvdG8udG9Mb2NhbGVTdHJpbmc7XG4gIHZhciBJVEVSQVRPUiA9IHdrcygnaXRlcmF0b3InKTtcbiAgdmFyIFRBRyA9IHdrcygndG9TdHJpbmdUYWcnKTtcbiAgdmFyIFRZUEVEX0NPTlNUUlVDVE9SID0gdWlkKCd0eXBlZF9jb25zdHJ1Y3RvcicpO1xuICB2YXIgREVGX0NPTlNUUlVDVE9SID0gdWlkKCdkZWZfY29uc3RydWN0b3InKTtcbiAgdmFyIEFMTF9DT05TVFJVQ1RPUlMgPSAkdHlwZWQuQ09OU1RSO1xuICB2YXIgVFlQRURfQVJSQVkgPSAkdHlwZWQuVFlQRUQ7XG4gIHZhciBWSUVXID0gJHR5cGVkLlZJRVc7XG4gIHZhciBXUk9OR19MRU5HVEggPSAnV3JvbmcgbGVuZ3RoISc7XG5cbiAgdmFyICRtYXAgPSBjcmVhdGVBcnJheU1ldGhvZCgxLCBmdW5jdGlvbiAoTywgbGVuZ3RoKSB7XG4gICAgcmV0dXJuIGFsbG9jYXRlKHNwZWNpZXNDb25zdHJ1Y3RvcihPLCBPW0RFRl9DT05TVFJVQ1RPUl0pLCBsZW5ndGgpO1xuICB9KTtcblxuICB2YXIgTElUVExFX0VORElBTiA9IGZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW5kZWZcbiAgICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkobmV3IFVpbnQxNkFycmF5KFsxXSkuYnVmZmVyKVswXSA9PT0gMTtcbiAgfSk7XG5cbiAgdmFyIEZPUkNFRF9TRVQgPSAhIVVpbnQ4QXJyYXkgJiYgISFVaW50OEFycmF5W1BST1RPVFlQRV0uc2V0ICYmIGZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgICBuZXcgVWludDhBcnJheSgxKS5zZXQoe30pO1xuICB9KTtcblxuICB2YXIgdG9PZmZzZXQgPSBmdW5jdGlvbiAoaXQsIEJZVEVTKSB7XG4gICAgdmFyIG9mZnNldCA9IHRvSW50ZWdlcihpdCk7XG4gICAgaWYgKG9mZnNldCA8IDAgfHwgb2Zmc2V0ICUgQllURVMpIHRocm93IFJhbmdlRXJyb3IoJ1dyb25nIG9mZnNldCEnKTtcbiAgICByZXR1cm4gb2Zmc2V0O1xuICB9O1xuXG4gIHZhciB2YWxpZGF0ZSA9IGZ1bmN0aW9uIChpdCkge1xuICAgIGlmIChpc09iamVjdChpdCkgJiYgVFlQRURfQVJSQVkgaW4gaXQpIHJldHVybiBpdDtcbiAgICB0aHJvdyBUeXBlRXJyb3IoaXQgKyAnIGlzIG5vdCBhIHR5cGVkIGFycmF5IScpO1xuICB9O1xuXG4gIHZhciBhbGxvY2F0ZSA9IGZ1bmN0aW9uIChDLCBsZW5ndGgpIHtcbiAgICBpZiAoIShpc09iamVjdChDKSAmJiBUWVBFRF9DT05TVFJVQ1RPUiBpbiBDKSkge1xuICAgICAgdGhyb3cgVHlwZUVycm9yKCdJdCBpcyBub3QgYSB0eXBlZCBhcnJheSBjb25zdHJ1Y3RvciEnKTtcbiAgICB9IHJldHVybiBuZXcgQyhsZW5ndGgpO1xuICB9O1xuXG4gIHZhciBzcGVjaWVzRnJvbUxpc3QgPSBmdW5jdGlvbiAoTywgbGlzdCkge1xuICAgIHJldHVybiBmcm9tTGlzdChzcGVjaWVzQ29uc3RydWN0b3IoTywgT1tERUZfQ09OU1RSVUNUT1JdKSwgbGlzdCk7XG4gIH07XG5cbiAgdmFyIGZyb21MaXN0ID0gZnVuY3Rpb24gKEMsIGxpc3QpIHtcbiAgICB2YXIgaW5kZXggPSAwO1xuICAgIHZhciBsZW5ndGggPSBsaXN0Lmxlbmd0aDtcbiAgICB2YXIgcmVzdWx0ID0gYWxsb2NhdGUoQywgbGVuZ3RoKTtcbiAgICB3aGlsZSAobGVuZ3RoID4gaW5kZXgpIHJlc3VsdFtpbmRleF0gPSBsaXN0W2luZGV4KytdO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH07XG5cbiAgdmFyIGFkZEdldHRlciA9IGZ1bmN0aW9uIChpdCwga2V5LCBpbnRlcm5hbCkge1xuICAgIGRQKGl0LCBrZXksIHsgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLl9kW2ludGVybmFsXTsgfSB9KTtcbiAgfTtcblxuICB2YXIgJGZyb20gPSBmdW5jdGlvbiBmcm9tKHNvdXJjZSAvKiAsIG1hcGZuLCB0aGlzQXJnICovKSB7XG4gICAgdmFyIE8gPSB0b09iamVjdChzb3VyY2UpO1xuICAgIHZhciBhTGVuID0gYXJndW1lbnRzLmxlbmd0aDtcbiAgICB2YXIgbWFwZm4gPSBhTGVuID4gMSA/IGFyZ3VtZW50c1sxXSA6IHVuZGVmaW5lZDtcbiAgICB2YXIgbWFwcGluZyA9IG1hcGZuICE9PSB1bmRlZmluZWQ7XG4gICAgdmFyIGl0ZXJGbiA9IGdldEl0ZXJGbihPKTtcbiAgICB2YXIgaSwgbGVuZ3RoLCB2YWx1ZXMsIHJlc3VsdCwgc3RlcCwgaXRlcmF0b3I7XG4gICAgaWYgKGl0ZXJGbiAhPSB1bmRlZmluZWQgJiYgIWlzQXJyYXlJdGVyKGl0ZXJGbikpIHtcbiAgICAgIGZvciAoaXRlcmF0b3IgPSBpdGVyRm4uY2FsbChPKSwgdmFsdWVzID0gW10sIGkgPSAwOyAhKHN0ZXAgPSBpdGVyYXRvci5uZXh0KCkpLmRvbmU7IGkrKykge1xuICAgICAgICB2YWx1ZXMucHVzaChzdGVwLnZhbHVlKTtcbiAgICAgIH0gTyA9IHZhbHVlcztcbiAgICB9XG4gICAgaWYgKG1hcHBpbmcgJiYgYUxlbiA+IDIpIG1hcGZuID0gY3R4KG1hcGZuLCBhcmd1bWVudHNbMl0sIDIpO1xuICAgIGZvciAoaSA9IDAsIGxlbmd0aCA9IHRvTGVuZ3RoKE8ubGVuZ3RoKSwgcmVzdWx0ID0gYWxsb2NhdGUodGhpcywgbGVuZ3RoKTsgbGVuZ3RoID4gaTsgaSsrKSB7XG4gICAgICByZXN1bHRbaV0gPSBtYXBwaW5nID8gbWFwZm4oT1tpXSwgaSkgOiBPW2ldO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9O1xuXG4gIHZhciAkb2YgPSBmdW5jdGlvbiBvZigvKiAuLi5pdGVtcyAqLykge1xuICAgIHZhciBpbmRleCA9IDA7XG4gICAgdmFyIGxlbmd0aCA9IGFyZ3VtZW50cy5sZW5ndGg7XG4gICAgdmFyIHJlc3VsdCA9IGFsbG9jYXRlKHRoaXMsIGxlbmd0aCk7XG4gICAgd2hpbGUgKGxlbmd0aCA+IGluZGV4KSByZXN1bHRbaW5kZXhdID0gYXJndW1lbnRzW2luZGV4KytdO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH07XG5cbiAgLy8gaU9TIFNhZmFyaSA2LnggZmFpbHMgaGVyZVxuICB2YXIgVE9fTE9DQUxFX0JVRyA9ICEhVWludDhBcnJheSAmJiBmYWlscyhmdW5jdGlvbiAoKSB7IGFycmF5VG9Mb2NhbGVTdHJpbmcuY2FsbChuZXcgVWludDhBcnJheSgxKSk7IH0pO1xuXG4gIHZhciAkdG9Mb2NhbGVTdHJpbmcgPSBmdW5jdGlvbiB0b0xvY2FsZVN0cmluZygpIHtcbiAgICByZXR1cm4gYXJyYXlUb0xvY2FsZVN0cmluZy5hcHBseShUT19MT0NBTEVfQlVHID8gYXJyYXlTbGljZS5jYWxsKHZhbGlkYXRlKHRoaXMpKSA6IHZhbGlkYXRlKHRoaXMpLCBhcmd1bWVudHMpO1xuICB9O1xuXG4gIHZhciBwcm90byA9IHtcbiAgICBjb3B5V2l0aGluOiBmdW5jdGlvbiBjb3B5V2l0aGluKHRhcmdldCwgc3RhcnQgLyogLCBlbmQgKi8pIHtcbiAgICAgIHJldHVybiBhcnJheUNvcHlXaXRoaW4uY2FsbCh2YWxpZGF0ZSh0aGlzKSwgdGFyZ2V0LCBzdGFydCwgYXJndW1lbnRzLmxlbmd0aCA+IDIgPyBhcmd1bWVudHNbMl0gOiB1bmRlZmluZWQpO1xuICAgIH0sXG4gICAgZXZlcnk6IGZ1bmN0aW9uIGV2ZXJ5KGNhbGxiYWNrZm4gLyogLCB0aGlzQXJnICovKSB7XG4gICAgICByZXR1cm4gYXJyYXlFdmVyeSh2YWxpZGF0ZSh0aGlzKSwgY2FsbGJhY2tmbiwgYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQpO1xuICAgIH0sXG4gICAgZmlsbDogZnVuY3Rpb24gZmlsbCh2YWx1ZSAvKiAsIHN0YXJ0LCBlbmQgKi8pIHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bnVzZWQtdmFyc1xuICAgICAgcmV0dXJuIGFycmF5RmlsbC5hcHBseSh2YWxpZGF0ZSh0aGlzKSwgYXJndW1lbnRzKTtcbiAgICB9LFxuICAgIGZpbHRlcjogZnVuY3Rpb24gZmlsdGVyKGNhbGxiYWNrZm4gLyogLCB0aGlzQXJnICovKSB7XG4gICAgICByZXR1cm4gc3BlY2llc0Zyb21MaXN0KHRoaXMsIGFycmF5RmlsdGVyKHZhbGlkYXRlKHRoaXMpLCBjYWxsYmFja2ZuLFxuICAgICAgICBhcmd1bWVudHMubGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IHVuZGVmaW5lZCkpO1xuICAgIH0sXG4gICAgZmluZDogZnVuY3Rpb24gZmluZChwcmVkaWNhdGUgLyogLCB0aGlzQXJnICovKSB7XG4gICAgICByZXR1cm4gYXJyYXlGaW5kKHZhbGlkYXRlKHRoaXMpLCBwcmVkaWNhdGUsIGFyZ3VtZW50cy5sZW5ndGggPiAxID8gYXJndW1lbnRzWzFdIDogdW5kZWZpbmVkKTtcbiAgICB9LFxuICAgIGZpbmRJbmRleDogZnVuY3Rpb24gZmluZEluZGV4KHByZWRpY2F0ZSAvKiAsIHRoaXNBcmcgKi8pIHtcbiAgICAgIHJldHVybiBhcnJheUZpbmRJbmRleCh2YWxpZGF0ZSh0aGlzKSwgcHJlZGljYXRlLCBhcmd1bWVudHMubGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IHVuZGVmaW5lZCk7XG4gICAgfSxcbiAgICBmb3JFYWNoOiBmdW5jdGlvbiBmb3JFYWNoKGNhbGxiYWNrZm4gLyogLCB0aGlzQXJnICovKSB7XG4gICAgICBhcnJheUZvckVhY2godmFsaWRhdGUodGhpcyksIGNhbGxiYWNrZm4sIGFyZ3VtZW50cy5sZW5ndGggPiAxID8gYXJndW1lbnRzWzFdIDogdW5kZWZpbmVkKTtcbiAgICB9LFxuICAgIGluZGV4T2Y6IGZ1bmN0aW9uIGluZGV4T2Yoc2VhcmNoRWxlbWVudCAvKiAsIGZyb21JbmRleCAqLykge1xuICAgICAgcmV0dXJuIGFycmF5SW5kZXhPZih2YWxpZGF0ZSh0aGlzKSwgc2VhcmNoRWxlbWVudCwgYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQpO1xuICAgIH0sXG4gICAgaW5jbHVkZXM6IGZ1bmN0aW9uIGluY2x1ZGVzKHNlYXJjaEVsZW1lbnQgLyogLCBmcm9tSW5kZXggKi8pIHtcbiAgICAgIHJldHVybiBhcnJheUluY2x1ZGVzKHZhbGlkYXRlKHRoaXMpLCBzZWFyY2hFbGVtZW50LCBhcmd1bWVudHMubGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IHVuZGVmaW5lZCk7XG4gICAgfSxcbiAgICBqb2luOiBmdW5jdGlvbiBqb2luKHNlcGFyYXRvcikgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVudXNlZC12YXJzXG4gICAgICByZXR1cm4gYXJyYXlKb2luLmFwcGx5KHZhbGlkYXRlKHRoaXMpLCBhcmd1bWVudHMpO1xuICAgIH0sXG4gICAgbGFzdEluZGV4T2Y6IGZ1bmN0aW9uIGxhc3RJbmRleE9mKHNlYXJjaEVsZW1lbnQgLyogLCBmcm9tSW5kZXggKi8pIHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bnVzZWQtdmFyc1xuICAgICAgcmV0dXJuIGFycmF5TGFzdEluZGV4T2YuYXBwbHkodmFsaWRhdGUodGhpcyksIGFyZ3VtZW50cyk7XG4gICAgfSxcbiAgICBtYXA6IGZ1bmN0aW9uIG1hcChtYXBmbiAvKiAsIHRoaXNBcmcgKi8pIHtcbiAgICAgIHJldHVybiAkbWFwKHZhbGlkYXRlKHRoaXMpLCBtYXBmbiwgYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQpO1xuICAgIH0sXG4gICAgcmVkdWNlOiBmdW5jdGlvbiByZWR1Y2UoY2FsbGJhY2tmbiAvKiAsIGluaXRpYWxWYWx1ZSAqLykgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVudXNlZC12YXJzXG4gICAgICByZXR1cm4gYXJyYXlSZWR1Y2UuYXBwbHkodmFsaWRhdGUodGhpcyksIGFyZ3VtZW50cyk7XG4gICAgfSxcbiAgICByZWR1Y2VSaWdodDogZnVuY3Rpb24gcmVkdWNlUmlnaHQoY2FsbGJhY2tmbiAvKiAsIGluaXRpYWxWYWx1ZSAqLykgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVudXNlZC12YXJzXG4gICAgICByZXR1cm4gYXJyYXlSZWR1Y2VSaWdodC5hcHBseSh2YWxpZGF0ZSh0aGlzKSwgYXJndW1lbnRzKTtcbiAgICB9LFxuICAgIHJldmVyc2U6IGZ1bmN0aW9uIHJldmVyc2UoKSB7XG4gICAgICB2YXIgdGhhdCA9IHRoaXM7XG4gICAgICB2YXIgbGVuZ3RoID0gdmFsaWRhdGUodGhhdCkubGVuZ3RoO1xuICAgICAgdmFyIG1pZGRsZSA9IE1hdGguZmxvb3IobGVuZ3RoIC8gMik7XG4gICAgICB2YXIgaW5kZXggPSAwO1xuICAgICAgdmFyIHZhbHVlO1xuICAgICAgd2hpbGUgKGluZGV4IDwgbWlkZGxlKSB7XG4gICAgICAgIHZhbHVlID0gdGhhdFtpbmRleF07XG4gICAgICAgIHRoYXRbaW5kZXgrK10gPSB0aGF0Wy0tbGVuZ3RoXTtcbiAgICAgICAgdGhhdFtsZW5ndGhdID0gdmFsdWU7XG4gICAgICB9IHJldHVybiB0aGF0O1xuICAgIH0sXG4gICAgc29tZTogZnVuY3Rpb24gc29tZShjYWxsYmFja2ZuIC8qICwgdGhpc0FyZyAqLykge1xuICAgICAgcmV0dXJuIGFycmF5U29tZSh2YWxpZGF0ZSh0aGlzKSwgY2FsbGJhY2tmbiwgYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQpO1xuICAgIH0sXG4gICAgc29ydDogZnVuY3Rpb24gc29ydChjb21wYXJlZm4pIHtcbiAgICAgIHJldHVybiBhcnJheVNvcnQuY2FsbCh2YWxpZGF0ZSh0aGlzKSwgY29tcGFyZWZuKTtcbiAgICB9LFxuICAgIHN1YmFycmF5OiBmdW5jdGlvbiBzdWJhcnJheShiZWdpbiwgZW5kKSB7XG4gICAgICB2YXIgTyA9IHZhbGlkYXRlKHRoaXMpO1xuICAgICAgdmFyIGxlbmd0aCA9IE8ubGVuZ3RoO1xuICAgICAgdmFyICRiZWdpbiA9IHRvQWJzb2x1dGVJbmRleChiZWdpbiwgbGVuZ3RoKTtcbiAgICAgIHJldHVybiBuZXcgKHNwZWNpZXNDb25zdHJ1Y3RvcihPLCBPW0RFRl9DT05TVFJVQ1RPUl0pKShcbiAgICAgICAgTy5idWZmZXIsXG4gICAgICAgIE8uYnl0ZU9mZnNldCArICRiZWdpbiAqIE8uQllURVNfUEVSX0VMRU1FTlQsXG4gICAgICAgIHRvTGVuZ3RoKChlbmQgPT09IHVuZGVmaW5lZCA/IGxlbmd0aCA6IHRvQWJzb2x1dGVJbmRleChlbmQsIGxlbmd0aCkpIC0gJGJlZ2luKVxuICAgICAgKTtcbiAgICB9XG4gIH07XG5cbiAgdmFyICRzbGljZSA9IGZ1bmN0aW9uIHNsaWNlKHN0YXJ0LCBlbmQpIHtcbiAgICByZXR1cm4gc3BlY2llc0Zyb21MaXN0KHRoaXMsIGFycmF5U2xpY2UuY2FsbCh2YWxpZGF0ZSh0aGlzKSwgc3RhcnQsIGVuZCkpO1xuICB9O1xuXG4gIHZhciAkc2V0ID0gZnVuY3Rpb24gc2V0KGFycmF5TGlrZSAvKiAsIG9mZnNldCAqLykge1xuICAgIHZhbGlkYXRlKHRoaXMpO1xuICAgIHZhciBvZmZzZXQgPSB0b09mZnNldChhcmd1bWVudHNbMV0sIDEpO1xuICAgIHZhciBsZW5ndGggPSB0aGlzLmxlbmd0aDtcbiAgICB2YXIgc3JjID0gdG9PYmplY3QoYXJyYXlMaWtlKTtcbiAgICB2YXIgbGVuID0gdG9MZW5ndGgoc3JjLmxlbmd0aCk7XG4gICAgdmFyIGluZGV4ID0gMDtcbiAgICBpZiAobGVuICsgb2Zmc2V0ID4gbGVuZ3RoKSB0aHJvdyBSYW5nZUVycm9yKFdST05HX0xFTkdUSCk7XG4gICAgd2hpbGUgKGluZGV4IDwgbGVuKSB0aGlzW29mZnNldCArIGluZGV4XSA9IHNyY1tpbmRleCsrXTtcbiAgfTtcblxuICB2YXIgJGl0ZXJhdG9ycyA9IHtcbiAgICBlbnRyaWVzOiBmdW5jdGlvbiBlbnRyaWVzKCkge1xuICAgICAgcmV0dXJuIGFycmF5RW50cmllcy5jYWxsKHZhbGlkYXRlKHRoaXMpKTtcbiAgICB9LFxuICAgIGtleXM6IGZ1bmN0aW9uIGtleXMoKSB7XG4gICAgICByZXR1cm4gYXJyYXlLZXlzLmNhbGwodmFsaWRhdGUodGhpcykpO1xuICAgIH0sXG4gICAgdmFsdWVzOiBmdW5jdGlvbiB2YWx1ZXMoKSB7XG4gICAgICByZXR1cm4gYXJyYXlWYWx1ZXMuY2FsbCh2YWxpZGF0ZSh0aGlzKSk7XG4gICAgfVxuICB9O1xuXG4gIHZhciBpc1RBSW5kZXggPSBmdW5jdGlvbiAodGFyZ2V0LCBrZXkpIHtcbiAgICByZXR1cm4gaXNPYmplY3QodGFyZ2V0KVxuICAgICAgJiYgdGFyZ2V0W1RZUEVEX0FSUkFZXVxuICAgICAgJiYgdHlwZW9mIGtleSAhPSAnc3ltYm9sJ1xuICAgICAgJiYga2V5IGluIHRhcmdldFxuICAgICAgJiYgU3RyaW5nKCtrZXkpID09IFN0cmluZyhrZXkpO1xuICB9O1xuICB2YXIgJGdldERlc2MgPSBmdW5jdGlvbiBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGFyZ2V0LCBrZXkpIHtcbiAgICByZXR1cm4gaXNUQUluZGV4KHRhcmdldCwga2V5ID0gdG9QcmltaXRpdmUoa2V5LCB0cnVlKSlcbiAgICAgID8gcHJvcGVydHlEZXNjKDIsIHRhcmdldFtrZXldKVxuICAgICAgOiBnT1BEKHRhcmdldCwga2V5KTtcbiAgfTtcbiAgdmFyICRzZXREZXNjID0gZnVuY3Rpb24gZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIGRlc2MpIHtcbiAgICBpZiAoaXNUQUluZGV4KHRhcmdldCwga2V5ID0gdG9QcmltaXRpdmUoa2V5LCB0cnVlKSlcbiAgICAgICYmIGlzT2JqZWN0KGRlc2MpXG4gICAgICAmJiBoYXMoZGVzYywgJ3ZhbHVlJylcbiAgICAgICYmICFoYXMoZGVzYywgJ2dldCcpXG4gICAgICAmJiAhaGFzKGRlc2MsICdzZXQnKVxuICAgICAgLy8gVE9ETzogYWRkIHZhbGlkYXRpb24gZGVzY3JpcHRvciB3L28gY2FsbGluZyBhY2Nlc3NvcnNcbiAgICAgICYmICFkZXNjLmNvbmZpZ3VyYWJsZVxuICAgICAgJiYgKCFoYXMoZGVzYywgJ3dyaXRhYmxlJykgfHwgZGVzYy53cml0YWJsZSlcbiAgICAgICYmICghaGFzKGRlc2MsICdlbnVtZXJhYmxlJykgfHwgZGVzYy5lbnVtZXJhYmxlKVxuICAgICkge1xuICAgICAgdGFyZ2V0W2tleV0gPSBkZXNjLnZhbHVlO1xuICAgICAgcmV0dXJuIHRhcmdldDtcbiAgICB9IHJldHVybiBkUCh0YXJnZXQsIGtleSwgZGVzYyk7XG4gIH07XG5cbiAgaWYgKCFBTExfQ09OU1RSVUNUT1JTKSB7XG4gICAgJEdPUEQuZiA9ICRnZXREZXNjO1xuICAgICREUC5mID0gJHNldERlc2M7XG4gIH1cblxuICAkZXhwb3J0KCRleHBvcnQuUyArICRleHBvcnQuRiAqICFBTExfQ09OU1RSVUNUT1JTLCAnT2JqZWN0Jywge1xuICAgIGdldE93blByb3BlcnR5RGVzY3JpcHRvcjogJGdldERlc2MsXG4gICAgZGVmaW5lUHJvcGVydHk6ICRzZXREZXNjXG4gIH0pO1xuXG4gIGlmIChmYWlscyhmdW5jdGlvbiAoKSB7IGFycmF5VG9TdHJpbmcuY2FsbCh7fSk7IH0pKSB7XG4gICAgYXJyYXlUb1N0cmluZyA9IGFycmF5VG9Mb2NhbGVTdHJpbmcgPSBmdW5jdGlvbiB0b1N0cmluZygpIHtcbiAgICAgIHJldHVybiBhcnJheUpvaW4uY2FsbCh0aGlzKTtcbiAgICB9O1xuICB9XG5cbiAgdmFyICRUeXBlZEFycmF5UHJvdG90eXBlJCA9IHJlZGVmaW5lQWxsKHt9LCBwcm90byk7XG4gIHJlZGVmaW5lQWxsKCRUeXBlZEFycmF5UHJvdG90eXBlJCwgJGl0ZXJhdG9ycyk7XG4gIGhpZGUoJFR5cGVkQXJyYXlQcm90b3R5cGUkLCBJVEVSQVRPUiwgJGl0ZXJhdG9ycy52YWx1ZXMpO1xuICByZWRlZmluZUFsbCgkVHlwZWRBcnJheVByb3RvdHlwZSQsIHtcbiAgICBzbGljZTogJHNsaWNlLFxuICAgIHNldDogJHNldCxcbiAgICBjb25zdHJ1Y3RvcjogZnVuY3Rpb24gKCkgeyAvKiBub29wICovIH0sXG4gICAgdG9TdHJpbmc6IGFycmF5VG9TdHJpbmcsXG4gICAgdG9Mb2NhbGVTdHJpbmc6ICR0b0xvY2FsZVN0cmluZ1xuICB9KTtcbiAgYWRkR2V0dGVyKCRUeXBlZEFycmF5UHJvdG90eXBlJCwgJ2J1ZmZlcicsICdiJyk7XG4gIGFkZEdldHRlcigkVHlwZWRBcnJheVByb3RvdHlwZSQsICdieXRlT2Zmc2V0JywgJ28nKTtcbiAgYWRkR2V0dGVyKCRUeXBlZEFycmF5UHJvdG90eXBlJCwgJ2J5dGVMZW5ndGgnLCAnbCcpO1xuICBhZGRHZXR0ZXIoJFR5cGVkQXJyYXlQcm90b3R5cGUkLCAnbGVuZ3RoJywgJ2UnKTtcbiAgZFAoJFR5cGVkQXJyYXlQcm90b3R5cGUkLCBUQUcsIHtcbiAgICBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXNbVFlQRURfQVJSQVldOyB9XG4gIH0pO1xuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBtYXgtc3RhdGVtZW50c1xuICBtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChLRVksIEJZVEVTLCB3cmFwcGVyLCBDTEFNUEVEKSB7XG4gICAgQ0xBTVBFRCA9ICEhQ0xBTVBFRDtcbiAgICB2YXIgTkFNRSA9IEtFWSArIChDTEFNUEVEID8gJ0NsYW1wZWQnIDogJycpICsgJ0FycmF5JztcbiAgICB2YXIgR0VUVEVSID0gJ2dldCcgKyBLRVk7XG4gICAgdmFyIFNFVFRFUiA9ICdzZXQnICsgS0VZO1xuICAgIHZhciBUeXBlZEFycmF5ID0gZ2xvYmFsW05BTUVdO1xuICAgIHZhciBCYXNlID0gVHlwZWRBcnJheSB8fCB7fTtcbiAgICB2YXIgVEFDID0gVHlwZWRBcnJheSAmJiBnZXRQcm90b3R5cGVPZihUeXBlZEFycmF5KTtcbiAgICB2YXIgRk9SQ0VEID0gIVR5cGVkQXJyYXkgfHwgISR0eXBlZC5BQlY7XG4gICAgdmFyIE8gPSB7fTtcbiAgICB2YXIgVHlwZWRBcnJheVByb3RvdHlwZSA9IFR5cGVkQXJyYXkgJiYgVHlwZWRBcnJheVtQUk9UT1RZUEVdO1xuICAgIHZhciBnZXR0ZXIgPSBmdW5jdGlvbiAodGhhdCwgaW5kZXgpIHtcbiAgICAgIHZhciBkYXRhID0gdGhhdC5fZDtcbiAgICAgIHJldHVybiBkYXRhLnZbR0VUVEVSXShpbmRleCAqIEJZVEVTICsgZGF0YS5vLCBMSVRUTEVfRU5ESUFOKTtcbiAgICB9O1xuICAgIHZhciBzZXR0ZXIgPSBmdW5jdGlvbiAodGhhdCwgaW5kZXgsIHZhbHVlKSB7XG4gICAgICB2YXIgZGF0YSA9IHRoYXQuX2Q7XG4gICAgICBpZiAoQ0xBTVBFRCkgdmFsdWUgPSAodmFsdWUgPSBNYXRoLnJvdW5kKHZhbHVlKSkgPCAwID8gMCA6IHZhbHVlID4gMHhmZiA/IDB4ZmYgOiB2YWx1ZSAmIDB4ZmY7XG4gICAgICBkYXRhLnZbU0VUVEVSXShpbmRleCAqIEJZVEVTICsgZGF0YS5vLCB2YWx1ZSwgTElUVExFX0VORElBTik7XG4gICAgfTtcbiAgICB2YXIgYWRkRWxlbWVudCA9IGZ1bmN0aW9uICh0aGF0LCBpbmRleCkge1xuICAgICAgZFAodGhhdCwgaW5kZXgsIHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgcmV0dXJuIGdldHRlcih0aGlzLCBpbmRleCk7XG4gICAgICAgIH0sXG4gICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgcmV0dXJuIHNldHRlcih0aGlzLCBpbmRleCwgdmFsdWUpO1xuICAgICAgICB9LFxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlXG4gICAgICB9KTtcbiAgICB9O1xuICAgIGlmIChGT1JDRUQpIHtcbiAgICAgIFR5cGVkQXJyYXkgPSB3cmFwcGVyKGZ1bmN0aW9uICh0aGF0LCBkYXRhLCAkb2Zmc2V0LCAkbGVuZ3RoKSB7XG4gICAgICAgIGFuSW5zdGFuY2UodGhhdCwgVHlwZWRBcnJheSwgTkFNRSwgJ19kJyk7XG4gICAgICAgIHZhciBpbmRleCA9IDA7XG4gICAgICAgIHZhciBvZmZzZXQgPSAwO1xuICAgICAgICB2YXIgYnVmZmVyLCBieXRlTGVuZ3RoLCBsZW5ndGgsIGtsYXNzO1xuICAgICAgICBpZiAoIWlzT2JqZWN0KGRhdGEpKSB7XG4gICAgICAgICAgbGVuZ3RoID0gdG9JbmRleChkYXRhKTtcbiAgICAgICAgICBieXRlTGVuZ3RoID0gbGVuZ3RoICogQllURVM7XG4gICAgICAgICAgYnVmZmVyID0gbmV3ICRBcnJheUJ1ZmZlcihieXRlTGVuZ3RoKTtcbiAgICAgICAgfSBlbHNlIGlmIChkYXRhIGluc3RhbmNlb2YgJEFycmF5QnVmZmVyIHx8IChrbGFzcyA9IGNsYXNzb2YoZGF0YSkpID09IEFSUkFZX0JVRkZFUiB8fCBrbGFzcyA9PSBTSEFSRURfQlVGRkVSKSB7XG4gICAgICAgICAgYnVmZmVyID0gZGF0YTtcbiAgICAgICAgICBvZmZzZXQgPSB0b09mZnNldCgkb2Zmc2V0LCBCWVRFUyk7XG4gICAgICAgICAgdmFyICRsZW4gPSBkYXRhLmJ5dGVMZW5ndGg7XG4gICAgICAgICAgaWYgKCRsZW5ndGggPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgaWYgKCRsZW4gJSBCWVRFUykgdGhyb3cgUmFuZ2VFcnJvcihXUk9OR19MRU5HVEgpO1xuICAgICAgICAgICAgYnl0ZUxlbmd0aCA9ICRsZW4gLSBvZmZzZXQ7XG4gICAgICAgICAgICBpZiAoYnl0ZUxlbmd0aCA8IDApIHRocm93IFJhbmdlRXJyb3IoV1JPTkdfTEVOR1RIKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgYnl0ZUxlbmd0aCA9IHRvTGVuZ3RoKCRsZW5ndGgpICogQllURVM7XG4gICAgICAgICAgICBpZiAoYnl0ZUxlbmd0aCArIG9mZnNldCA+ICRsZW4pIHRocm93IFJhbmdlRXJyb3IoV1JPTkdfTEVOR1RIKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgbGVuZ3RoID0gYnl0ZUxlbmd0aCAvIEJZVEVTO1xuICAgICAgICB9IGVsc2UgaWYgKFRZUEVEX0FSUkFZIGluIGRhdGEpIHtcbiAgICAgICAgICByZXR1cm4gZnJvbUxpc3QoVHlwZWRBcnJheSwgZGF0YSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuICRmcm9tLmNhbGwoVHlwZWRBcnJheSwgZGF0YSk7XG4gICAgICAgIH1cbiAgICAgICAgaGlkZSh0aGF0LCAnX2QnLCB7XG4gICAgICAgICAgYjogYnVmZmVyLFxuICAgICAgICAgIG86IG9mZnNldCxcbiAgICAgICAgICBsOiBieXRlTGVuZ3RoLFxuICAgICAgICAgIGU6IGxlbmd0aCxcbiAgICAgICAgICB2OiBuZXcgJERhdGFWaWV3KGJ1ZmZlcilcbiAgICAgICAgfSk7XG4gICAgICAgIHdoaWxlIChpbmRleCA8IGxlbmd0aCkgYWRkRWxlbWVudCh0aGF0LCBpbmRleCsrKTtcbiAgICAgIH0pO1xuICAgICAgVHlwZWRBcnJheVByb3RvdHlwZSA9IFR5cGVkQXJyYXlbUFJPVE9UWVBFXSA9IGNyZWF0ZSgkVHlwZWRBcnJheVByb3RvdHlwZSQpO1xuICAgICAgaGlkZShUeXBlZEFycmF5UHJvdG90eXBlLCAnY29uc3RydWN0b3InLCBUeXBlZEFycmF5KTtcbiAgICB9IGVsc2UgaWYgKCFmYWlscyhmdW5jdGlvbiAoKSB7XG4gICAgICBUeXBlZEFycmF5KDEpO1xuICAgIH0pIHx8ICFmYWlscyhmdW5jdGlvbiAoKSB7XG4gICAgICBuZXcgVHlwZWRBcnJheSgtMSk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tbmV3XG4gICAgfSkgfHwgISRpdGVyRGV0ZWN0KGZ1bmN0aW9uIChpdGVyKSB7XG4gICAgICBuZXcgVHlwZWRBcnJheSgpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLW5ld1xuICAgICAgbmV3IFR5cGVkQXJyYXkobnVsbCk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tbmV3XG4gICAgICBuZXcgVHlwZWRBcnJheSgxLjUpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLW5ld1xuICAgICAgbmV3IFR5cGVkQXJyYXkoaXRlcik7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tbmV3XG4gICAgfSwgdHJ1ZSkpIHtcbiAgICAgIFR5cGVkQXJyYXkgPSB3cmFwcGVyKGZ1bmN0aW9uICh0aGF0LCBkYXRhLCAkb2Zmc2V0LCAkbGVuZ3RoKSB7XG4gICAgICAgIGFuSW5zdGFuY2UodGhhdCwgVHlwZWRBcnJheSwgTkFNRSk7XG4gICAgICAgIHZhciBrbGFzcztcbiAgICAgICAgLy8gYHdzYCBtb2R1bGUgYnVnLCB0ZW1wb3JhcmlseSByZW1vdmUgdmFsaWRhdGlvbiBsZW5ndGggZm9yIFVpbnQ4QXJyYXlcbiAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3dlYnNvY2tldHMvd3MvcHVsbC82NDVcbiAgICAgICAgaWYgKCFpc09iamVjdChkYXRhKSkgcmV0dXJuIG5ldyBCYXNlKHRvSW5kZXgoZGF0YSkpO1xuICAgICAgICBpZiAoZGF0YSBpbnN0YW5jZW9mICRBcnJheUJ1ZmZlciB8fCAoa2xhc3MgPSBjbGFzc29mKGRhdGEpKSA9PSBBUlJBWV9CVUZGRVIgfHwga2xhc3MgPT0gU0hBUkVEX0JVRkZFUikge1xuICAgICAgICAgIHJldHVybiAkbGVuZ3RoICE9PSB1bmRlZmluZWRcbiAgICAgICAgICAgID8gbmV3IEJhc2UoZGF0YSwgdG9PZmZzZXQoJG9mZnNldCwgQllURVMpLCAkbGVuZ3RoKVxuICAgICAgICAgICAgOiAkb2Zmc2V0ICE9PSB1bmRlZmluZWRcbiAgICAgICAgICAgICAgPyBuZXcgQmFzZShkYXRhLCB0b09mZnNldCgkb2Zmc2V0LCBCWVRFUykpXG4gICAgICAgICAgICAgIDogbmV3IEJhc2UoZGF0YSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKFRZUEVEX0FSUkFZIGluIGRhdGEpIHJldHVybiBmcm9tTGlzdChUeXBlZEFycmF5LCBkYXRhKTtcbiAgICAgICAgcmV0dXJuICRmcm9tLmNhbGwoVHlwZWRBcnJheSwgZGF0YSk7XG4gICAgICB9KTtcbiAgICAgIGFycmF5Rm9yRWFjaChUQUMgIT09IEZ1bmN0aW9uLnByb3RvdHlwZSA/IGdPUE4oQmFzZSkuY29uY2F0KGdPUE4oVEFDKSkgOiBnT1BOKEJhc2UpLCBmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgIGlmICghKGtleSBpbiBUeXBlZEFycmF5KSkgaGlkZShUeXBlZEFycmF5LCBrZXksIEJhc2Vba2V5XSk7XG4gICAgICB9KTtcbiAgICAgIFR5cGVkQXJyYXlbUFJPVE9UWVBFXSA9IFR5cGVkQXJyYXlQcm90b3R5cGU7XG4gICAgICBpZiAoIUxJQlJBUlkpIFR5cGVkQXJyYXlQcm90b3R5cGUuY29uc3RydWN0b3IgPSBUeXBlZEFycmF5O1xuICAgIH1cbiAgICB2YXIgJG5hdGl2ZUl0ZXJhdG9yID0gVHlwZWRBcnJheVByb3RvdHlwZVtJVEVSQVRPUl07XG4gICAgdmFyIENPUlJFQ1RfSVRFUl9OQU1FID0gISEkbmF0aXZlSXRlcmF0b3JcbiAgICAgICYmICgkbmF0aXZlSXRlcmF0b3IubmFtZSA9PSAndmFsdWVzJyB8fCAkbmF0aXZlSXRlcmF0b3IubmFtZSA9PSB1bmRlZmluZWQpO1xuICAgIHZhciAkaXRlcmF0b3IgPSAkaXRlcmF0b3JzLnZhbHVlcztcbiAgICBoaWRlKFR5cGVkQXJyYXksIFRZUEVEX0NPTlNUUlVDVE9SLCB0cnVlKTtcbiAgICBoaWRlKFR5cGVkQXJyYXlQcm90b3R5cGUsIFRZUEVEX0FSUkFZLCBOQU1FKTtcbiAgICBoaWRlKFR5cGVkQXJyYXlQcm90b3R5cGUsIFZJRVcsIHRydWUpO1xuICAgIGhpZGUoVHlwZWRBcnJheVByb3RvdHlwZSwgREVGX0NPTlNUUlVDVE9SLCBUeXBlZEFycmF5KTtcblxuICAgIGlmIChDTEFNUEVEID8gbmV3IFR5cGVkQXJyYXkoMSlbVEFHXSAhPSBOQU1FIDogIShUQUcgaW4gVHlwZWRBcnJheVByb3RvdHlwZSkpIHtcbiAgICAgIGRQKFR5cGVkQXJyYXlQcm90b3R5cGUsIFRBRywge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIE5BTUU7IH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIE9bTkFNRV0gPSBUeXBlZEFycmF5O1xuXG4gICAgJGV4cG9ydCgkZXhwb3J0LkcgKyAkZXhwb3J0LlcgKyAkZXhwb3J0LkYgKiAoVHlwZWRBcnJheSAhPSBCYXNlKSwgTyk7XG5cbiAgICAkZXhwb3J0KCRleHBvcnQuUywgTkFNRSwge1xuICAgICAgQllURVNfUEVSX0VMRU1FTlQ6IEJZVEVTXG4gICAgfSk7XG5cbiAgICAkZXhwb3J0KCRleHBvcnQuUyArICRleHBvcnQuRiAqIGZhaWxzKGZ1bmN0aW9uICgpIHsgQmFzZS5vZi5jYWxsKFR5cGVkQXJyYXksIDEpOyB9KSwgTkFNRSwge1xuICAgICAgZnJvbTogJGZyb20sXG4gICAgICBvZjogJG9mXG4gICAgfSk7XG5cbiAgICBpZiAoIShCWVRFU19QRVJfRUxFTUVOVCBpbiBUeXBlZEFycmF5UHJvdG90eXBlKSkgaGlkZShUeXBlZEFycmF5UHJvdG90eXBlLCBCWVRFU19QRVJfRUxFTUVOVCwgQllURVMpO1xuXG4gICAgJGV4cG9ydCgkZXhwb3J0LlAsIE5BTUUsIHByb3RvKTtcblxuICAgIHNldFNwZWNpZXMoTkFNRSk7XG5cbiAgICAkZXhwb3J0KCRleHBvcnQuUCArICRleHBvcnQuRiAqIEZPUkNFRF9TRVQsIE5BTUUsIHsgc2V0OiAkc2V0IH0pO1xuXG4gICAgJGV4cG9ydCgkZXhwb3J0LlAgKyAkZXhwb3J0LkYgKiAhQ09SUkVDVF9JVEVSX05BTUUsIE5BTUUsICRpdGVyYXRvcnMpO1xuXG4gICAgaWYgKCFMSUJSQVJZICYmIFR5cGVkQXJyYXlQcm90b3R5cGUudG9TdHJpbmcgIT0gYXJyYXlUb1N0cmluZykgVHlwZWRBcnJheVByb3RvdHlwZS50b1N0cmluZyA9IGFycmF5VG9TdHJpbmc7XG5cbiAgICAkZXhwb3J0KCRleHBvcnQuUCArICRleHBvcnQuRiAqIGZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgICAgIG5ldyBUeXBlZEFycmF5KDEpLnNsaWNlKCk7XG4gICAgfSksIE5BTUUsIHsgc2xpY2U6ICRzbGljZSB9KTtcblxuICAgICRleHBvcnQoJGV4cG9ydC5QICsgJGV4cG9ydC5GICogKGZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBbMSwgMl0udG9Mb2NhbGVTdHJpbmcoKSAhPSBuZXcgVHlwZWRBcnJheShbMSwgMl0pLnRvTG9jYWxlU3RyaW5nKCk7XG4gICAgfSkgfHwgIWZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgICAgIFR5cGVkQXJyYXlQcm90b3R5cGUudG9Mb2NhbGVTdHJpbmcuY2FsbChbMSwgMl0pO1xuICAgIH0pKSwgTkFNRSwgeyB0b0xvY2FsZVN0cmluZzogJHRvTG9jYWxlU3RyaW5nIH0pO1xuXG4gICAgSXRlcmF0b3JzW05BTUVdID0gQ09SUkVDVF9JVEVSX05BTUUgPyAkbmF0aXZlSXRlcmF0b3IgOiAkaXRlcmF0b3I7XG4gICAgaWYgKCFMSUJSQVJZICYmICFDT1JSRUNUX0lURVJfTkFNRSkgaGlkZShUeXBlZEFycmF5UHJvdG90eXBlLCBJVEVSQVRPUiwgJGl0ZXJhdG9yKTtcbiAgfTtcbn0gZWxzZSBtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uICgpIHsgLyogZW1wdHkgKi8gfTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBnbG9iYWwgPSByZXF1aXJlKCcuL19nbG9iYWwnKTtcbnZhciBERVNDUklQVE9SUyA9IHJlcXVpcmUoJy4vX2Rlc2NyaXB0b3JzJyk7XG52YXIgTElCUkFSWSA9IHJlcXVpcmUoJy4vX2xpYnJhcnknKTtcbnZhciAkdHlwZWQgPSByZXF1aXJlKCcuL190eXBlZCcpO1xudmFyIGhpZGUgPSByZXF1aXJlKCcuL19oaWRlJyk7XG52YXIgcmVkZWZpbmVBbGwgPSByZXF1aXJlKCcuL19yZWRlZmluZS1hbGwnKTtcbnZhciBmYWlscyA9IHJlcXVpcmUoJy4vX2ZhaWxzJyk7XG52YXIgYW5JbnN0YW5jZSA9IHJlcXVpcmUoJy4vX2FuLWluc3RhbmNlJyk7XG52YXIgdG9JbnRlZ2VyID0gcmVxdWlyZSgnLi9fdG8taW50ZWdlcicpO1xudmFyIHRvTGVuZ3RoID0gcmVxdWlyZSgnLi9fdG8tbGVuZ3RoJyk7XG52YXIgdG9JbmRleCA9IHJlcXVpcmUoJy4vX3RvLWluZGV4Jyk7XG52YXIgZ09QTiA9IHJlcXVpcmUoJy4vX29iamVjdC1nb3BuJykuZjtcbnZhciBkUCA9IHJlcXVpcmUoJy4vX29iamVjdC1kcCcpLmY7XG52YXIgYXJyYXlGaWxsID0gcmVxdWlyZSgnLi9fYXJyYXktZmlsbCcpO1xudmFyIHNldFRvU3RyaW5nVGFnID0gcmVxdWlyZSgnLi9fc2V0LXRvLXN0cmluZy10YWcnKTtcbnZhciBBUlJBWV9CVUZGRVIgPSAnQXJyYXlCdWZmZXInO1xudmFyIERBVEFfVklFVyA9ICdEYXRhVmlldyc7XG52YXIgUFJPVE9UWVBFID0gJ3Byb3RvdHlwZSc7XG52YXIgV1JPTkdfTEVOR1RIID0gJ1dyb25nIGxlbmd0aCEnO1xudmFyIFdST05HX0lOREVYID0gJ1dyb25nIGluZGV4ISc7XG52YXIgJEFycmF5QnVmZmVyID0gZ2xvYmFsW0FSUkFZX0JVRkZFUl07XG52YXIgJERhdGFWaWV3ID0gZ2xvYmFsW0RBVEFfVklFV107XG52YXIgTWF0aCA9IGdsb2JhbC5NYXRoO1xudmFyIFJhbmdlRXJyb3IgPSBnbG9iYWwuUmFuZ2VFcnJvcjtcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zaGFkb3ctcmVzdHJpY3RlZC1uYW1lc1xudmFyIEluZmluaXR5ID0gZ2xvYmFsLkluZmluaXR5O1xudmFyIEJhc2VCdWZmZXIgPSAkQXJyYXlCdWZmZXI7XG52YXIgYWJzID0gTWF0aC5hYnM7XG52YXIgcG93ID0gTWF0aC5wb3c7XG52YXIgZmxvb3IgPSBNYXRoLmZsb29yO1xudmFyIGxvZyA9IE1hdGgubG9nO1xudmFyIExOMiA9IE1hdGguTE4yO1xudmFyIEJVRkZFUiA9ICdidWZmZXInO1xudmFyIEJZVEVfTEVOR1RIID0gJ2J5dGVMZW5ndGgnO1xudmFyIEJZVEVfT0ZGU0VUID0gJ2J5dGVPZmZzZXQnO1xudmFyICRCVUZGRVIgPSBERVNDUklQVE9SUyA/ICdfYicgOiBCVUZGRVI7XG52YXIgJExFTkdUSCA9IERFU0NSSVBUT1JTID8gJ19sJyA6IEJZVEVfTEVOR1RIO1xudmFyICRPRkZTRVQgPSBERVNDUklQVE9SUyA/ICdfbycgOiBCWVRFX09GRlNFVDtcblxuLy8gSUVFRTc1NCBjb252ZXJzaW9ucyBiYXNlZCBvbiBodHRwczovL2dpdGh1Yi5jb20vZmVyb3NzL2llZWU3NTRcbmZ1bmN0aW9uIHBhY2tJRUVFNzU0KHZhbHVlLCBtTGVuLCBuQnl0ZXMpIHtcbiAgdmFyIGJ1ZmZlciA9IG5ldyBBcnJheShuQnl0ZXMpO1xuICB2YXIgZUxlbiA9IG5CeXRlcyAqIDggLSBtTGVuIC0gMTtcbiAgdmFyIGVNYXggPSAoMSA8PCBlTGVuKSAtIDE7XG4gIHZhciBlQmlhcyA9IGVNYXggPj4gMTtcbiAgdmFyIHJ0ID0gbUxlbiA9PT0gMjMgPyBwb3coMiwgLTI0KSAtIHBvdygyLCAtNzcpIDogMDtcbiAgdmFyIGkgPSAwO1xuICB2YXIgcyA9IHZhbHVlIDwgMCB8fCB2YWx1ZSA9PT0gMCAmJiAxIC8gdmFsdWUgPCAwID8gMSA6IDA7XG4gIHZhciBlLCBtLCBjO1xuICB2YWx1ZSA9IGFicyh2YWx1ZSk7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zZWxmLWNvbXBhcmVcbiAgaWYgKHZhbHVlICE9IHZhbHVlIHx8IHZhbHVlID09PSBJbmZpbml0eSkge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zZWxmLWNvbXBhcmVcbiAgICBtID0gdmFsdWUgIT0gdmFsdWUgPyAxIDogMDtcbiAgICBlID0gZU1heDtcbiAgfSBlbHNlIHtcbiAgICBlID0gZmxvb3IobG9nKHZhbHVlKSAvIExOMik7XG4gICAgaWYgKHZhbHVlICogKGMgPSBwb3coMiwgLWUpKSA8IDEpIHtcbiAgICAgIGUtLTtcbiAgICAgIGMgKj0gMjtcbiAgICB9XG4gICAgaWYgKGUgKyBlQmlhcyA+PSAxKSB7XG4gICAgICB2YWx1ZSArPSBydCAvIGM7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhbHVlICs9IHJ0ICogcG93KDIsIDEgLSBlQmlhcyk7XG4gICAgfVxuICAgIGlmICh2YWx1ZSAqIGMgPj0gMikge1xuICAgICAgZSsrO1xuICAgICAgYyAvPSAyO1xuICAgIH1cbiAgICBpZiAoZSArIGVCaWFzID49IGVNYXgpIHtcbiAgICAgIG0gPSAwO1xuICAgICAgZSA9IGVNYXg7XG4gICAgfSBlbHNlIGlmIChlICsgZUJpYXMgPj0gMSkge1xuICAgICAgbSA9ICh2YWx1ZSAqIGMgLSAxKSAqIHBvdygyLCBtTGVuKTtcbiAgICAgIGUgPSBlICsgZUJpYXM7XG4gICAgfSBlbHNlIHtcbiAgICAgIG0gPSB2YWx1ZSAqIHBvdygyLCBlQmlhcyAtIDEpICogcG93KDIsIG1MZW4pO1xuICAgICAgZSA9IDA7XG4gICAgfVxuICB9XG4gIGZvciAoOyBtTGVuID49IDg7IGJ1ZmZlcltpKytdID0gbSAmIDI1NSwgbSAvPSAyNTYsIG1MZW4gLT0gOCk7XG4gIGUgPSBlIDw8IG1MZW4gfCBtO1xuICBlTGVuICs9IG1MZW47XG4gIGZvciAoOyBlTGVuID4gMDsgYnVmZmVyW2krK10gPSBlICYgMjU1LCBlIC89IDI1NiwgZUxlbiAtPSA4KTtcbiAgYnVmZmVyWy0taV0gfD0gcyAqIDEyODtcbiAgcmV0dXJuIGJ1ZmZlcjtcbn1cbmZ1bmN0aW9uIHVucGFja0lFRUU3NTQoYnVmZmVyLCBtTGVuLCBuQnl0ZXMpIHtcbiAgdmFyIGVMZW4gPSBuQnl0ZXMgKiA4IC0gbUxlbiAtIDE7XG4gIHZhciBlTWF4ID0gKDEgPDwgZUxlbikgLSAxO1xuICB2YXIgZUJpYXMgPSBlTWF4ID4+IDE7XG4gIHZhciBuQml0cyA9IGVMZW4gLSA3O1xuICB2YXIgaSA9IG5CeXRlcyAtIDE7XG4gIHZhciBzID0gYnVmZmVyW2ktLV07XG4gIHZhciBlID0gcyAmIDEyNztcbiAgdmFyIG07XG4gIHMgPj49IDc7XG4gIGZvciAoOyBuQml0cyA+IDA7IGUgPSBlICogMjU2ICsgYnVmZmVyW2ldLCBpLS0sIG5CaXRzIC09IDgpO1xuICBtID0gZSAmICgxIDw8IC1uQml0cykgLSAxO1xuICBlID4+PSAtbkJpdHM7XG4gIG5CaXRzICs9IG1MZW47XG4gIGZvciAoOyBuQml0cyA+IDA7IG0gPSBtICogMjU2ICsgYnVmZmVyW2ldLCBpLS0sIG5CaXRzIC09IDgpO1xuICBpZiAoZSA9PT0gMCkge1xuICAgIGUgPSAxIC0gZUJpYXM7XG4gIH0gZWxzZSBpZiAoZSA9PT0gZU1heCkge1xuICAgIHJldHVybiBtID8gTmFOIDogcyA/IC1JbmZpbml0eSA6IEluZmluaXR5O1xuICB9IGVsc2Uge1xuICAgIG0gPSBtICsgcG93KDIsIG1MZW4pO1xuICAgIGUgPSBlIC0gZUJpYXM7XG4gIH0gcmV0dXJuIChzID8gLTEgOiAxKSAqIG0gKiBwb3coMiwgZSAtIG1MZW4pO1xufVxuXG5mdW5jdGlvbiB1bnBhY2tJMzIoYnl0ZXMpIHtcbiAgcmV0dXJuIGJ5dGVzWzNdIDw8IDI0IHwgYnl0ZXNbMl0gPDwgMTYgfCBieXRlc1sxXSA8PCA4IHwgYnl0ZXNbMF07XG59XG5mdW5jdGlvbiBwYWNrSTgoaXQpIHtcbiAgcmV0dXJuIFtpdCAmIDB4ZmZdO1xufVxuZnVuY3Rpb24gcGFja0kxNihpdCkge1xuICByZXR1cm4gW2l0ICYgMHhmZiwgaXQgPj4gOCAmIDB4ZmZdO1xufVxuZnVuY3Rpb24gcGFja0kzMihpdCkge1xuICByZXR1cm4gW2l0ICYgMHhmZiwgaXQgPj4gOCAmIDB4ZmYsIGl0ID4+IDE2ICYgMHhmZiwgaXQgPj4gMjQgJiAweGZmXTtcbn1cbmZ1bmN0aW9uIHBhY2tGNjQoaXQpIHtcbiAgcmV0dXJuIHBhY2tJRUVFNzU0KGl0LCA1MiwgOCk7XG59XG5mdW5jdGlvbiBwYWNrRjMyKGl0KSB7XG4gIHJldHVybiBwYWNrSUVFRTc1NChpdCwgMjMsIDQpO1xufVxuXG5mdW5jdGlvbiBhZGRHZXR0ZXIoQywga2V5LCBpbnRlcm5hbCkge1xuICBkUChDW1BST1RPVFlQRV0sIGtleSwgeyBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXNbaW50ZXJuYWxdOyB9IH0pO1xufVxuXG5mdW5jdGlvbiBnZXQodmlldywgYnl0ZXMsIGluZGV4LCBpc0xpdHRsZUVuZGlhbikge1xuICB2YXIgbnVtSW5kZXggPSAraW5kZXg7XG4gIHZhciBpbnRJbmRleCA9IHRvSW5kZXgobnVtSW5kZXgpO1xuICBpZiAoaW50SW5kZXggKyBieXRlcyA+IHZpZXdbJExFTkdUSF0pIHRocm93IFJhbmdlRXJyb3IoV1JPTkdfSU5ERVgpO1xuICB2YXIgc3RvcmUgPSB2aWV3WyRCVUZGRVJdLl9iO1xuICB2YXIgc3RhcnQgPSBpbnRJbmRleCArIHZpZXdbJE9GRlNFVF07XG4gIHZhciBwYWNrID0gc3RvcmUuc2xpY2Uoc3RhcnQsIHN0YXJ0ICsgYnl0ZXMpO1xuICByZXR1cm4gaXNMaXR0bGVFbmRpYW4gPyBwYWNrIDogcGFjay5yZXZlcnNlKCk7XG59XG5mdW5jdGlvbiBzZXQodmlldywgYnl0ZXMsIGluZGV4LCBjb252ZXJzaW9uLCB2YWx1ZSwgaXNMaXR0bGVFbmRpYW4pIHtcbiAgdmFyIG51bUluZGV4ID0gK2luZGV4O1xuICB2YXIgaW50SW5kZXggPSB0b0luZGV4KG51bUluZGV4KTtcbiAgaWYgKGludEluZGV4ICsgYnl0ZXMgPiB2aWV3WyRMRU5HVEhdKSB0aHJvdyBSYW5nZUVycm9yKFdST05HX0lOREVYKTtcbiAgdmFyIHN0b3JlID0gdmlld1skQlVGRkVSXS5fYjtcbiAgdmFyIHN0YXJ0ID0gaW50SW5kZXggKyB2aWV3WyRPRkZTRVRdO1xuICB2YXIgcGFjayA9IGNvbnZlcnNpb24oK3ZhbHVlKTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBieXRlczsgaSsrKSBzdG9yZVtzdGFydCArIGldID0gcGFja1tpc0xpdHRsZUVuZGlhbiA/IGkgOiBieXRlcyAtIGkgLSAxXTtcbn1cblxuaWYgKCEkdHlwZWQuQUJWKSB7XG4gICRBcnJheUJ1ZmZlciA9IGZ1bmN0aW9uIEFycmF5QnVmZmVyKGxlbmd0aCkge1xuICAgIGFuSW5zdGFuY2UodGhpcywgJEFycmF5QnVmZmVyLCBBUlJBWV9CVUZGRVIpO1xuICAgIHZhciBieXRlTGVuZ3RoID0gdG9JbmRleChsZW5ndGgpO1xuICAgIHRoaXMuX2IgPSBhcnJheUZpbGwuY2FsbChuZXcgQXJyYXkoYnl0ZUxlbmd0aCksIDApO1xuICAgIHRoaXNbJExFTkdUSF0gPSBieXRlTGVuZ3RoO1xuICB9O1xuXG4gICREYXRhVmlldyA9IGZ1bmN0aW9uIERhdGFWaWV3KGJ1ZmZlciwgYnl0ZU9mZnNldCwgYnl0ZUxlbmd0aCkge1xuICAgIGFuSW5zdGFuY2UodGhpcywgJERhdGFWaWV3LCBEQVRBX1ZJRVcpO1xuICAgIGFuSW5zdGFuY2UoYnVmZmVyLCAkQXJyYXlCdWZmZXIsIERBVEFfVklFVyk7XG4gICAgdmFyIGJ1ZmZlckxlbmd0aCA9IGJ1ZmZlclskTEVOR1RIXTtcbiAgICB2YXIgb2Zmc2V0ID0gdG9JbnRlZ2VyKGJ5dGVPZmZzZXQpO1xuICAgIGlmIChvZmZzZXQgPCAwIHx8IG9mZnNldCA+IGJ1ZmZlckxlbmd0aCkgdGhyb3cgUmFuZ2VFcnJvcignV3Jvbmcgb2Zmc2V0IScpO1xuICAgIGJ5dGVMZW5ndGggPSBieXRlTGVuZ3RoID09PSB1bmRlZmluZWQgPyBidWZmZXJMZW5ndGggLSBvZmZzZXQgOiB0b0xlbmd0aChieXRlTGVuZ3RoKTtcbiAgICBpZiAob2Zmc2V0ICsgYnl0ZUxlbmd0aCA+IGJ1ZmZlckxlbmd0aCkgdGhyb3cgUmFuZ2VFcnJvcihXUk9OR19MRU5HVEgpO1xuICAgIHRoaXNbJEJVRkZFUl0gPSBidWZmZXI7XG4gICAgdGhpc1skT0ZGU0VUXSA9IG9mZnNldDtcbiAgICB0aGlzWyRMRU5HVEhdID0gYnl0ZUxlbmd0aDtcbiAgfTtcblxuICBpZiAoREVTQ1JJUFRPUlMpIHtcbiAgICBhZGRHZXR0ZXIoJEFycmF5QnVmZmVyLCBCWVRFX0xFTkdUSCwgJ19sJyk7XG4gICAgYWRkR2V0dGVyKCREYXRhVmlldywgQlVGRkVSLCAnX2InKTtcbiAgICBhZGRHZXR0ZXIoJERhdGFWaWV3LCBCWVRFX0xFTkdUSCwgJ19sJyk7XG4gICAgYWRkR2V0dGVyKCREYXRhVmlldywgQllURV9PRkZTRVQsICdfbycpO1xuICB9XG5cbiAgcmVkZWZpbmVBbGwoJERhdGFWaWV3W1BST1RPVFlQRV0sIHtcbiAgICBnZXRJbnQ4OiBmdW5jdGlvbiBnZXRJbnQ4KGJ5dGVPZmZzZXQpIHtcbiAgICAgIHJldHVybiBnZXQodGhpcywgMSwgYnl0ZU9mZnNldClbMF0gPDwgMjQgPj4gMjQ7XG4gICAgfSxcbiAgICBnZXRVaW50ODogZnVuY3Rpb24gZ2V0VWludDgoYnl0ZU9mZnNldCkge1xuICAgICAgcmV0dXJuIGdldCh0aGlzLCAxLCBieXRlT2Zmc2V0KVswXTtcbiAgICB9LFxuICAgIGdldEludDE2OiBmdW5jdGlvbiBnZXRJbnQxNihieXRlT2Zmc2V0IC8qICwgbGl0dGxlRW5kaWFuICovKSB7XG4gICAgICB2YXIgYnl0ZXMgPSBnZXQodGhpcywgMiwgYnl0ZU9mZnNldCwgYXJndW1lbnRzWzFdKTtcbiAgICAgIHJldHVybiAoYnl0ZXNbMV0gPDwgOCB8IGJ5dGVzWzBdKSA8PCAxNiA+PiAxNjtcbiAgICB9LFxuICAgIGdldFVpbnQxNjogZnVuY3Rpb24gZ2V0VWludDE2KGJ5dGVPZmZzZXQgLyogLCBsaXR0bGVFbmRpYW4gKi8pIHtcbiAgICAgIHZhciBieXRlcyA9IGdldCh0aGlzLCAyLCBieXRlT2Zmc2V0LCBhcmd1bWVudHNbMV0pO1xuICAgICAgcmV0dXJuIGJ5dGVzWzFdIDw8IDggfCBieXRlc1swXTtcbiAgICB9LFxuICAgIGdldEludDMyOiBmdW5jdGlvbiBnZXRJbnQzMihieXRlT2Zmc2V0IC8qICwgbGl0dGxlRW5kaWFuICovKSB7XG4gICAgICByZXR1cm4gdW5wYWNrSTMyKGdldCh0aGlzLCA0LCBieXRlT2Zmc2V0LCBhcmd1bWVudHNbMV0pKTtcbiAgICB9LFxuICAgIGdldFVpbnQzMjogZnVuY3Rpb24gZ2V0VWludDMyKGJ5dGVPZmZzZXQgLyogLCBsaXR0bGVFbmRpYW4gKi8pIHtcbiAgICAgIHJldHVybiB1bnBhY2tJMzIoZ2V0KHRoaXMsIDQsIGJ5dGVPZmZzZXQsIGFyZ3VtZW50c1sxXSkpID4+PiAwO1xuICAgIH0sXG4gICAgZ2V0RmxvYXQzMjogZnVuY3Rpb24gZ2V0RmxvYXQzMihieXRlT2Zmc2V0IC8qICwgbGl0dGxlRW5kaWFuICovKSB7XG4gICAgICByZXR1cm4gdW5wYWNrSUVFRTc1NChnZXQodGhpcywgNCwgYnl0ZU9mZnNldCwgYXJndW1lbnRzWzFdKSwgMjMsIDQpO1xuICAgIH0sXG4gICAgZ2V0RmxvYXQ2NDogZnVuY3Rpb24gZ2V0RmxvYXQ2NChieXRlT2Zmc2V0IC8qICwgbGl0dGxlRW5kaWFuICovKSB7XG4gICAgICByZXR1cm4gdW5wYWNrSUVFRTc1NChnZXQodGhpcywgOCwgYnl0ZU9mZnNldCwgYXJndW1lbnRzWzFdKSwgNTIsIDgpO1xuICAgIH0sXG4gICAgc2V0SW50ODogZnVuY3Rpb24gc2V0SW50OChieXRlT2Zmc2V0LCB2YWx1ZSkge1xuICAgICAgc2V0KHRoaXMsIDEsIGJ5dGVPZmZzZXQsIHBhY2tJOCwgdmFsdWUpO1xuICAgIH0sXG4gICAgc2V0VWludDg6IGZ1bmN0aW9uIHNldFVpbnQ4KGJ5dGVPZmZzZXQsIHZhbHVlKSB7XG4gICAgICBzZXQodGhpcywgMSwgYnl0ZU9mZnNldCwgcGFja0k4LCB2YWx1ZSk7XG4gICAgfSxcbiAgICBzZXRJbnQxNjogZnVuY3Rpb24gc2V0SW50MTYoYnl0ZU9mZnNldCwgdmFsdWUgLyogLCBsaXR0bGVFbmRpYW4gKi8pIHtcbiAgICAgIHNldCh0aGlzLCAyLCBieXRlT2Zmc2V0LCBwYWNrSTE2LCB2YWx1ZSwgYXJndW1lbnRzWzJdKTtcbiAgICB9LFxuICAgIHNldFVpbnQxNjogZnVuY3Rpb24gc2V0VWludDE2KGJ5dGVPZmZzZXQsIHZhbHVlIC8qICwgbGl0dGxlRW5kaWFuICovKSB7XG4gICAgICBzZXQodGhpcywgMiwgYnl0ZU9mZnNldCwgcGFja0kxNiwgdmFsdWUsIGFyZ3VtZW50c1syXSk7XG4gICAgfSxcbiAgICBzZXRJbnQzMjogZnVuY3Rpb24gc2V0SW50MzIoYnl0ZU9mZnNldCwgdmFsdWUgLyogLCBsaXR0bGVFbmRpYW4gKi8pIHtcbiAgICAgIHNldCh0aGlzLCA0LCBieXRlT2Zmc2V0LCBwYWNrSTMyLCB2YWx1ZSwgYXJndW1lbnRzWzJdKTtcbiAgICB9LFxuICAgIHNldFVpbnQzMjogZnVuY3Rpb24gc2V0VWludDMyKGJ5dGVPZmZzZXQsIHZhbHVlIC8qICwgbGl0dGxlRW5kaWFuICovKSB7XG4gICAgICBzZXQodGhpcywgNCwgYnl0ZU9mZnNldCwgcGFja0kzMiwgdmFsdWUsIGFyZ3VtZW50c1syXSk7XG4gICAgfSxcbiAgICBzZXRGbG9hdDMyOiBmdW5jdGlvbiBzZXRGbG9hdDMyKGJ5dGVPZmZzZXQsIHZhbHVlIC8qICwgbGl0dGxlRW5kaWFuICovKSB7XG4gICAgICBzZXQodGhpcywgNCwgYnl0ZU9mZnNldCwgcGFja0YzMiwgdmFsdWUsIGFyZ3VtZW50c1syXSk7XG4gICAgfSxcbiAgICBzZXRGbG9hdDY0OiBmdW5jdGlvbiBzZXRGbG9hdDY0KGJ5dGVPZmZzZXQsIHZhbHVlIC8qICwgbGl0dGxlRW5kaWFuICovKSB7XG4gICAgICBzZXQodGhpcywgOCwgYnl0ZU9mZnNldCwgcGFja0Y2NCwgdmFsdWUsIGFyZ3VtZW50c1syXSk7XG4gICAgfVxuICB9KTtcbn0gZWxzZSB7XG4gIGlmICghZmFpbHMoZnVuY3Rpb24gKCkge1xuICAgICRBcnJheUJ1ZmZlcigxKTtcbiAgfSkgfHwgIWZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgICBuZXcgJEFycmF5QnVmZmVyKC0xKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1uZXdcbiAgfSkgfHwgZmFpbHMoZnVuY3Rpb24gKCkge1xuICAgIG5ldyAkQXJyYXlCdWZmZXIoKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1uZXdcbiAgICBuZXcgJEFycmF5QnVmZmVyKDEuNSk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tbmV3XG4gICAgbmV3ICRBcnJheUJ1ZmZlcihOYU4pOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLW5ld1xuICAgIHJldHVybiAkQXJyYXlCdWZmZXIubmFtZSAhPSBBUlJBWV9CVUZGRVI7XG4gIH0pKSB7XG4gICAgJEFycmF5QnVmZmVyID0gZnVuY3Rpb24gQXJyYXlCdWZmZXIobGVuZ3RoKSB7XG4gICAgICBhbkluc3RhbmNlKHRoaXMsICRBcnJheUJ1ZmZlcik7XG4gICAgICByZXR1cm4gbmV3IEJhc2VCdWZmZXIodG9JbmRleChsZW5ndGgpKTtcbiAgICB9O1xuICAgIHZhciBBcnJheUJ1ZmZlclByb3RvID0gJEFycmF5QnVmZmVyW1BST1RPVFlQRV0gPSBCYXNlQnVmZmVyW1BST1RPVFlQRV07XG4gICAgZm9yICh2YXIga2V5cyA9IGdPUE4oQmFzZUJ1ZmZlciksIGogPSAwLCBrZXk7IGtleXMubGVuZ3RoID4gajspIHtcbiAgICAgIGlmICghKChrZXkgPSBrZXlzW2orK10pIGluICRBcnJheUJ1ZmZlcikpIGhpZGUoJEFycmF5QnVmZmVyLCBrZXksIEJhc2VCdWZmZXJba2V5XSk7XG4gICAgfVxuICAgIGlmICghTElCUkFSWSkgQXJyYXlCdWZmZXJQcm90by5jb25zdHJ1Y3RvciA9ICRBcnJheUJ1ZmZlcjtcbiAgfVxuICAvLyBpT1MgU2FmYXJpIDcueCBidWdcbiAgdmFyIHZpZXcgPSBuZXcgJERhdGFWaWV3KG5ldyAkQXJyYXlCdWZmZXIoMikpO1xuICB2YXIgJHNldEludDggPSAkRGF0YVZpZXdbUFJPVE9UWVBFXS5zZXRJbnQ4O1xuICB2aWV3LnNldEludDgoMCwgMjE0NzQ4MzY0OCk7XG4gIHZpZXcuc2V0SW50OCgxLCAyMTQ3NDgzNjQ5KTtcbiAgaWYgKHZpZXcuZ2V0SW50OCgwKSB8fCAhdmlldy5nZXRJbnQ4KDEpKSByZWRlZmluZUFsbCgkRGF0YVZpZXdbUFJPVE9UWVBFXSwge1xuICAgIHNldEludDg6IGZ1bmN0aW9uIHNldEludDgoYnl0ZU9mZnNldCwgdmFsdWUpIHtcbiAgICAgICRzZXRJbnQ4LmNhbGwodGhpcywgYnl0ZU9mZnNldCwgdmFsdWUgPDwgMjQgPj4gMjQpO1xuICAgIH0sXG4gICAgc2V0VWludDg6IGZ1bmN0aW9uIHNldFVpbnQ4KGJ5dGVPZmZzZXQsIHZhbHVlKSB7XG4gICAgICAkc2V0SW50OC5jYWxsKHRoaXMsIGJ5dGVPZmZzZXQsIHZhbHVlIDw8IDI0ID4+IDI0KTtcbiAgICB9XG4gIH0sIHRydWUpO1xufVxuc2V0VG9TdHJpbmdUYWcoJEFycmF5QnVmZmVyLCBBUlJBWV9CVUZGRVIpO1xuc2V0VG9TdHJpbmdUYWcoJERhdGFWaWV3LCBEQVRBX1ZJRVcpO1xuaGlkZSgkRGF0YVZpZXdbUFJPVE9UWVBFXSwgJHR5cGVkLlZJRVcsIHRydWUpO1xuZXhwb3J0c1tBUlJBWV9CVUZGRVJdID0gJEFycmF5QnVmZmVyO1xuZXhwb3J0c1tEQVRBX1ZJRVddID0gJERhdGFWaWV3O1xuIiwidmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4vX2dsb2JhbCcpO1xudmFyIGhpZGUgPSByZXF1aXJlKCcuL19oaWRlJyk7XG52YXIgdWlkID0gcmVxdWlyZSgnLi9fdWlkJyk7XG52YXIgVFlQRUQgPSB1aWQoJ3R5cGVkX2FycmF5Jyk7XG52YXIgVklFVyA9IHVpZCgndmlldycpO1xudmFyIEFCViA9ICEhKGdsb2JhbC5BcnJheUJ1ZmZlciAmJiBnbG9iYWwuRGF0YVZpZXcpO1xudmFyIENPTlNUUiA9IEFCVjtcbnZhciBpID0gMDtcbnZhciBsID0gOTtcbnZhciBUeXBlZDtcblxudmFyIFR5cGVkQXJyYXlDb25zdHJ1Y3RvcnMgPSAoXG4gICdJbnQ4QXJyYXksVWludDhBcnJheSxVaW50OENsYW1wZWRBcnJheSxJbnQxNkFycmF5LFVpbnQxNkFycmF5LEludDMyQXJyYXksVWludDMyQXJyYXksRmxvYXQzMkFycmF5LEZsb2F0NjRBcnJheSdcbikuc3BsaXQoJywnKTtcblxud2hpbGUgKGkgPCBsKSB7XG4gIGlmIChUeXBlZCA9IGdsb2JhbFtUeXBlZEFycmF5Q29uc3RydWN0b3JzW2krK11dKSB7XG4gICAgaGlkZShUeXBlZC5wcm90b3R5cGUsIFRZUEVELCB0cnVlKTtcbiAgICBoaWRlKFR5cGVkLnByb3RvdHlwZSwgVklFVywgdHJ1ZSk7XG4gIH0gZWxzZSBDT05TVFIgPSBmYWxzZTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIEFCVjogQUJWLFxuICBDT05TVFI6IENPTlNUUixcbiAgVFlQRUQ6IFRZUEVELFxuICBWSUVXOiBWSUVXXG59O1xuIiwidmFyIGlkID0gMDtcbnZhciBweCA9IE1hdGgucmFuZG9tKCk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChrZXkpIHtcbiAgcmV0dXJuICdTeW1ib2woJy5jb25jYXQoa2V5ID09PSB1bmRlZmluZWQgPyAnJyA6IGtleSwgJylfJywgKCsraWQgKyBweCkudG9TdHJpbmcoMzYpKTtcbn07XG4iLCJ2YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi9fZ2xvYmFsJyk7XG52YXIgbmF2aWdhdG9yID0gZ2xvYmFsLm5hdmlnYXRvcjtcblxubW9kdWxlLmV4cG9ydHMgPSBuYXZpZ2F0b3IgJiYgbmF2aWdhdG9yLnVzZXJBZ2VudCB8fCAnJztcbiIsInZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4vX2lzLW9iamVjdCcpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQsIFRZUEUpIHtcbiAgaWYgKCFpc09iamVjdChpdCkgfHwgaXQuX3QgIT09IFRZUEUpIHRocm93IFR5cGVFcnJvcignSW5jb21wYXRpYmxlIHJlY2VpdmVyLCAnICsgVFlQRSArICcgcmVxdWlyZWQhJyk7XG4gIHJldHVybiBpdDtcbn07XG4iLCJ2YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi9fZ2xvYmFsJyk7XG52YXIgY29yZSA9IHJlcXVpcmUoJy4vX2NvcmUnKTtcbnZhciBMSUJSQVJZID0gcmVxdWlyZSgnLi9fbGlicmFyeScpO1xudmFyIHdrc0V4dCA9IHJlcXVpcmUoJy4vX3drcy1leHQnKTtcbnZhciBkZWZpbmVQcm9wZXJ0eSA9IHJlcXVpcmUoJy4vX29iamVjdC1kcCcpLmY7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gIHZhciAkU3ltYm9sID0gY29yZS5TeW1ib2wgfHwgKGNvcmUuU3ltYm9sID0gTElCUkFSWSA/IHt9IDogZ2xvYmFsLlN5bWJvbCB8fCB7fSk7XG4gIGlmIChuYW1lLmNoYXJBdCgwKSAhPSAnXycgJiYgIShuYW1lIGluICRTeW1ib2wpKSBkZWZpbmVQcm9wZXJ0eSgkU3ltYm9sLCBuYW1lLCB7IHZhbHVlOiB3a3NFeHQuZihuYW1lKSB9KTtcbn07XG4iLCJleHBvcnRzLmYgPSByZXF1aXJlKCcuL193a3MnKTtcbiIsInZhciBzdG9yZSA9IHJlcXVpcmUoJy4vX3NoYXJlZCcpKCd3a3MnKTtcbnZhciB1aWQgPSByZXF1aXJlKCcuL191aWQnKTtcbnZhciBTeW1ib2wgPSByZXF1aXJlKCcuL19nbG9iYWwnKS5TeW1ib2w7XG52YXIgVVNFX1NZTUJPTCA9IHR5cGVvZiBTeW1ib2wgPT0gJ2Z1bmN0aW9uJztcblxudmFyICRleHBvcnRzID0gbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAobmFtZSkge1xuICByZXR1cm4gc3RvcmVbbmFtZV0gfHwgKHN0b3JlW25hbWVdID1cbiAgICBVU0VfU1lNQk9MICYmIFN5bWJvbFtuYW1lXSB8fCAoVVNFX1NZTUJPTCA/IFN5bWJvbCA6IHVpZCkoJ1N5bWJvbC4nICsgbmFtZSkpO1xufTtcblxuJGV4cG9ydHMuc3RvcmUgPSBzdG9yZTtcbiIsInZhciBjbGFzc29mID0gcmVxdWlyZSgnLi9fY2xhc3NvZicpO1xudmFyIElURVJBVE9SID0gcmVxdWlyZSgnLi9fd2tzJykoJ2l0ZXJhdG9yJyk7XG52YXIgSXRlcmF0b3JzID0gcmVxdWlyZSgnLi9faXRlcmF0b3JzJyk7XG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vX2NvcmUnKS5nZXRJdGVyYXRvck1ldGhvZCA9IGZ1bmN0aW9uIChpdCkge1xuICBpZiAoaXQgIT0gdW5kZWZpbmVkKSByZXR1cm4gaXRbSVRFUkFUT1JdXG4gICAgfHwgaXRbJ0BAaXRlcmF0b3InXVxuICAgIHx8IEl0ZXJhdG9yc1tjbGFzc29mKGl0KV07XG59O1xuIiwiLy8gaHR0cHM6Ly9naXRodWIuY29tL2JlbmphbWluZ3IvUmV4RXhwLmVzY2FwZVxudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciAkcmUgPSByZXF1aXJlKCcuL19yZXBsYWNlcicpKC9bXFxcXF4kKis/LigpfFtcXF17fV0vZywgJ1xcXFwkJicpO1xuXG4kZXhwb3J0KCRleHBvcnQuUywgJ1JlZ0V4cCcsIHsgZXNjYXBlOiBmdW5jdGlvbiBlc2NhcGUoaXQpIHsgcmV0dXJuICRyZShpdCk7IH0gfSk7XG4iLCIvLyAyMi4xLjMuMyBBcnJheS5wcm90b3R5cGUuY29weVdpdGhpbih0YXJnZXQsIHN0YXJ0LCBlbmQgPSB0aGlzLmxlbmd0aClcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG5cbiRleHBvcnQoJGV4cG9ydC5QLCAnQXJyYXknLCB7IGNvcHlXaXRoaW46IHJlcXVpcmUoJy4vX2FycmF5LWNvcHktd2l0aGluJykgfSk7XG5cbnJlcXVpcmUoJy4vX2FkZC10by11bnNjb3BhYmxlcycpKCdjb3B5V2l0aGluJyk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyICRldmVyeSA9IHJlcXVpcmUoJy4vX2FycmF5LW1ldGhvZHMnKSg0KTtcblxuJGV4cG9ydCgkZXhwb3J0LlAgKyAkZXhwb3J0LkYgKiAhcmVxdWlyZSgnLi9fc3RyaWN0LW1ldGhvZCcpKFtdLmV2ZXJ5LCB0cnVlKSwgJ0FycmF5Jywge1xuICAvLyAyMi4xLjMuNSAvIDE1LjQuNC4xNiBBcnJheS5wcm90b3R5cGUuZXZlcnkoY2FsbGJhY2tmbiBbLCB0aGlzQXJnXSlcbiAgZXZlcnk6IGZ1bmN0aW9uIGV2ZXJ5KGNhbGxiYWNrZm4gLyogLCB0aGlzQXJnICovKSB7XG4gICAgcmV0dXJuICRldmVyeSh0aGlzLCBjYWxsYmFja2ZuLCBhcmd1bWVudHNbMV0pO1xuICB9XG59KTtcbiIsIi8vIDIyLjEuMy42IEFycmF5LnByb3RvdHlwZS5maWxsKHZhbHVlLCBzdGFydCA9IDAsIGVuZCA9IHRoaXMubGVuZ3RoKVxudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcblxuJGV4cG9ydCgkZXhwb3J0LlAsICdBcnJheScsIHsgZmlsbDogcmVxdWlyZSgnLi9fYXJyYXktZmlsbCcpIH0pO1xuXG5yZXF1aXJlKCcuL19hZGQtdG8tdW5zY29wYWJsZXMnKSgnZmlsbCcpO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciAkZmlsdGVyID0gcmVxdWlyZSgnLi9fYXJyYXktbWV0aG9kcycpKDIpO1xuXG4kZXhwb3J0KCRleHBvcnQuUCArICRleHBvcnQuRiAqICFyZXF1aXJlKCcuL19zdHJpY3QtbWV0aG9kJykoW10uZmlsdGVyLCB0cnVlKSwgJ0FycmF5Jywge1xuICAvLyAyMi4xLjMuNyAvIDE1LjQuNC4yMCBBcnJheS5wcm90b3R5cGUuZmlsdGVyKGNhbGxiYWNrZm4gWywgdGhpc0FyZ10pXG4gIGZpbHRlcjogZnVuY3Rpb24gZmlsdGVyKGNhbGxiYWNrZm4gLyogLCB0aGlzQXJnICovKSB7XG4gICAgcmV0dXJuICRmaWx0ZXIodGhpcywgY2FsbGJhY2tmbiwgYXJndW1lbnRzWzFdKTtcbiAgfVxufSk7XG4iLCIndXNlIHN0cmljdCc7XG4vLyAyMi4xLjMuOSBBcnJheS5wcm90b3R5cGUuZmluZEluZGV4KHByZWRpY2F0ZSwgdGhpc0FyZyA9IHVuZGVmaW5lZClcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgJGZpbmQgPSByZXF1aXJlKCcuL19hcnJheS1tZXRob2RzJykoNik7XG52YXIgS0VZID0gJ2ZpbmRJbmRleCc7XG52YXIgZm9yY2VkID0gdHJ1ZTtcbi8vIFNob3VsZG4ndCBza2lwIGhvbGVzXG5pZiAoS0VZIGluIFtdKSBBcnJheSgxKVtLRVldKGZ1bmN0aW9uICgpIHsgZm9yY2VkID0gZmFsc2U7IH0pO1xuJGV4cG9ydCgkZXhwb3J0LlAgKyAkZXhwb3J0LkYgKiBmb3JjZWQsICdBcnJheScsIHtcbiAgZmluZEluZGV4OiBmdW5jdGlvbiBmaW5kSW5kZXgoY2FsbGJhY2tmbiAvKiAsIHRoYXQgPSB1bmRlZmluZWQgKi8pIHtcbiAgICByZXR1cm4gJGZpbmQodGhpcywgY2FsbGJhY2tmbiwgYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQpO1xuICB9XG59KTtcbnJlcXVpcmUoJy4vX2FkZC10by11bnNjb3BhYmxlcycpKEtFWSk7XG4iLCIndXNlIHN0cmljdCc7XG4vLyAyMi4xLjMuOCBBcnJheS5wcm90b3R5cGUuZmluZChwcmVkaWNhdGUsIHRoaXNBcmcgPSB1bmRlZmluZWQpXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyICRmaW5kID0gcmVxdWlyZSgnLi9fYXJyYXktbWV0aG9kcycpKDUpO1xudmFyIEtFWSA9ICdmaW5kJztcbnZhciBmb3JjZWQgPSB0cnVlO1xuLy8gU2hvdWxkbid0IHNraXAgaG9sZXNcbmlmIChLRVkgaW4gW10pIEFycmF5KDEpW0tFWV0oZnVuY3Rpb24gKCkgeyBmb3JjZWQgPSBmYWxzZTsgfSk7XG4kZXhwb3J0KCRleHBvcnQuUCArICRleHBvcnQuRiAqIGZvcmNlZCwgJ0FycmF5Jywge1xuICBmaW5kOiBmdW5jdGlvbiBmaW5kKGNhbGxiYWNrZm4gLyogLCB0aGF0ID0gdW5kZWZpbmVkICovKSB7XG4gICAgcmV0dXJuICRmaW5kKHRoaXMsIGNhbGxiYWNrZm4sIGFyZ3VtZW50cy5sZW5ndGggPiAxID8gYXJndW1lbnRzWzFdIDogdW5kZWZpbmVkKTtcbiAgfVxufSk7XG5yZXF1aXJlKCcuL19hZGQtdG8tdW5zY29wYWJsZXMnKShLRVkpO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciAkZm9yRWFjaCA9IHJlcXVpcmUoJy4vX2FycmF5LW1ldGhvZHMnKSgwKTtcbnZhciBTVFJJQ1QgPSByZXF1aXJlKCcuL19zdHJpY3QtbWV0aG9kJykoW10uZm9yRWFjaCwgdHJ1ZSk7XG5cbiRleHBvcnQoJGV4cG9ydC5QICsgJGV4cG9ydC5GICogIVNUUklDVCwgJ0FycmF5Jywge1xuICAvLyAyMi4xLjMuMTAgLyAxNS40LjQuMTggQXJyYXkucHJvdG90eXBlLmZvckVhY2goY2FsbGJhY2tmbiBbLCB0aGlzQXJnXSlcbiAgZm9yRWFjaDogZnVuY3Rpb24gZm9yRWFjaChjYWxsYmFja2ZuIC8qICwgdGhpc0FyZyAqLykge1xuICAgIHJldHVybiAkZm9yRWFjaCh0aGlzLCBjYWxsYmFja2ZuLCBhcmd1bWVudHNbMV0pO1xuICB9XG59KTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBjdHggPSByZXF1aXJlKCcuL19jdHgnKTtcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgdG9PYmplY3QgPSByZXF1aXJlKCcuL190by1vYmplY3QnKTtcbnZhciBjYWxsID0gcmVxdWlyZSgnLi9faXRlci1jYWxsJyk7XG52YXIgaXNBcnJheUl0ZXIgPSByZXF1aXJlKCcuL19pcy1hcnJheS1pdGVyJyk7XG52YXIgdG9MZW5ndGggPSByZXF1aXJlKCcuL190by1sZW5ndGgnKTtcbnZhciBjcmVhdGVQcm9wZXJ0eSA9IHJlcXVpcmUoJy4vX2NyZWF0ZS1wcm9wZXJ0eScpO1xudmFyIGdldEl0ZXJGbiA9IHJlcXVpcmUoJy4vY29yZS5nZXQtaXRlcmF0b3ItbWV0aG9kJyk7XG5cbiRleHBvcnQoJGV4cG9ydC5TICsgJGV4cG9ydC5GICogIXJlcXVpcmUoJy4vX2l0ZXItZGV0ZWN0JykoZnVuY3Rpb24gKGl0ZXIpIHsgQXJyYXkuZnJvbShpdGVyKTsgfSksICdBcnJheScsIHtcbiAgLy8gMjIuMS4yLjEgQXJyYXkuZnJvbShhcnJheUxpa2UsIG1hcGZuID0gdW5kZWZpbmVkLCB0aGlzQXJnID0gdW5kZWZpbmVkKVxuICBmcm9tOiBmdW5jdGlvbiBmcm9tKGFycmF5TGlrZSAvKiAsIG1hcGZuID0gdW5kZWZpbmVkLCB0aGlzQXJnID0gdW5kZWZpbmVkICovKSB7XG4gICAgdmFyIE8gPSB0b09iamVjdChhcnJheUxpa2UpO1xuICAgIHZhciBDID0gdHlwZW9mIHRoaXMgPT0gJ2Z1bmN0aW9uJyA/IHRoaXMgOiBBcnJheTtcbiAgICB2YXIgYUxlbiA9IGFyZ3VtZW50cy5sZW5ndGg7XG4gICAgdmFyIG1hcGZuID0gYUxlbiA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQ7XG4gICAgdmFyIG1hcHBpbmcgPSBtYXBmbiAhPT0gdW5kZWZpbmVkO1xuICAgIHZhciBpbmRleCA9IDA7XG4gICAgdmFyIGl0ZXJGbiA9IGdldEl0ZXJGbihPKTtcbiAgICB2YXIgbGVuZ3RoLCByZXN1bHQsIHN0ZXAsIGl0ZXJhdG9yO1xuICAgIGlmIChtYXBwaW5nKSBtYXBmbiA9IGN0eChtYXBmbiwgYUxlbiA+IDIgPyBhcmd1bWVudHNbMl0gOiB1bmRlZmluZWQsIDIpO1xuICAgIC8vIGlmIG9iamVjdCBpc24ndCBpdGVyYWJsZSBvciBpdCdzIGFycmF5IHdpdGggZGVmYXVsdCBpdGVyYXRvciAtIHVzZSBzaW1wbGUgY2FzZVxuICAgIGlmIChpdGVyRm4gIT0gdW5kZWZpbmVkICYmICEoQyA9PSBBcnJheSAmJiBpc0FycmF5SXRlcihpdGVyRm4pKSkge1xuICAgICAgZm9yIChpdGVyYXRvciA9IGl0ZXJGbi5jYWxsKE8pLCByZXN1bHQgPSBuZXcgQygpOyAhKHN0ZXAgPSBpdGVyYXRvci5uZXh0KCkpLmRvbmU7IGluZGV4KyspIHtcbiAgICAgICAgY3JlYXRlUHJvcGVydHkocmVzdWx0LCBpbmRleCwgbWFwcGluZyA/IGNhbGwoaXRlcmF0b3IsIG1hcGZuLCBbc3RlcC52YWx1ZSwgaW5kZXhdLCB0cnVlKSA6IHN0ZXAudmFsdWUpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBsZW5ndGggPSB0b0xlbmd0aChPLmxlbmd0aCk7XG4gICAgICBmb3IgKHJlc3VsdCA9IG5ldyBDKGxlbmd0aCk7IGxlbmd0aCA+IGluZGV4OyBpbmRleCsrKSB7XG4gICAgICAgIGNyZWF0ZVByb3BlcnR5KHJlc3VsdCwgaW5kZXgsIG1hcHBpbmcgPyBtYXBmbihPW2luZGV4XSwgaW5kZXgpIDogT1tpbmRleF0pO1xuICAgICAgfVxuICAgIH1cbiAgICByZXN1bHQubGVuZ3RoID0gaW5kZXg7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxufSk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyICRpbmRleE9mID0gcmVxdWlyZSgnLi9fYXJyYXktaW5jbHVkZXMnKShmYWxzZSk7XG52YXIgJG5hdGl2ZSA9IFtdLmluZGV4T2Y7XG52YXIgTkVHQVRJVkVfWkVSTyA9ICEhJG5hdGl2ZSAmJiAxIC8gWzFdLmluZGV4T2YoMSwgLTApIDwgMDtcblxuJGV4cG9ydCgkZXhwb3J0LlAgKyAkZXhwb3J0LkYgKiAoTkVHQVRJVkVfWkVSTyB8fCAhcmVxdWlyZSgnLi9fc3RyaWN0LW1ldGhvZCcpKCRuYXRpdmUpKSwgJ0FycmF5Jywge1xuICAvLyAyMi4xLjMuMTEgLyAxNS40LjQuMTQgQXJyYXkucHJvdG90eXBlLmluZGV4T2Yoc2VhcmNoRWxlbWVudCBbLCBmcm9tSW5kZXhdKVxuICBpbmRleE9mOiBmdW5jdGlvbiBpbmRleE9mKHNlYXJjaEVsZW1lbnQgLyogLCBmcm9tSW5kZXggPSAwICovKSB7XG4gICAgcmV0dXJuIE5FR0FUSVZFX1pFUk9cbiAgICAgIC8vIGNvbnZlcnQgLTAgdG8gKzBcbiAgICAgID8gJG5hdGl2ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpIHx8IDBcbiAgICAgIDogJGluZGV4T2YodGhpcywgc2VhcmNoRWxlbWVudCwgYXJndW1lbnRzWzFdKTtcbiAgfVxufSk7XG4iLCIvLyAyMi4xLjIuMiAvIDE1LjQuMy4yIEFycmF5LmlzQXJyYXkoYXJnKVxudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcblxuJGV4cG9ydCgkZXhwb3J0LlMsICdBcnJheScsIHsgaXNBcnJheTogcmVxdWlyZSgnLi9faXMtYXJyYXknKSB9KTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBhZGRUb1Vuc2NvcGFibGVzID0gcmVxdWlyZSgnLi9fYWRkLXRvLXVuc2NvcGFibGVzJyk7XG52YXIgc3RlcCA9IHJlcXVpcmUoJy4vX2l0ZXItc3RlcCcpO1xudmFyIEl0ZXJhdG9ycyA9IHJlcXVpcmUoJy4vX2l0ZXJhdG9ycycpO1xudmFyIHRvSU9iamVjdCA9IHJlcXVpcmUoJy4vX3RvLWlvYmplY3QnKTtcblxuLy8gMjIuMS4zLjQgQXJyYXkucHJvdG90eXBlLmVudHJpZXMoKVxuLy8gMjIuMS4zLjEzIEFycmF5LnByb3RvdHlwZS5rZXlzKClcbi8vIDIyLjEuMy4yOSBBcnJheS5wcm90b3R5cGUudmFsdWVzKClcbi8vIDIyLjEuMy4zMCBBcnJheS5wcm90b3R5cGVbQEBpdGVyYXRvcl0oKVxubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL19pdGVyLWRlZmluZScpKEFycmF5LCAnQXJyYXknLCBmdW5jdGlvbiAoaXRlcmF0ZWQsIGtpbmQpIHtcbiAgdGhpcy5fdCA9IHRvSU9iamVjdChpdGVyYXRlZCk7IC8vIHRhcmdldFxuICB0aGlzLl9pID0gMDsgICAgICAgICAgICAgICAgICAgLy8gbmV4dCBpbmRleFxuICB0aGlzLl9rID0ga2luZDsgICAgICAgICAgICAgICAgLy8ga2luZFxuLy8gMjIuMS41LjIuMSAlQXJyYXlJdGVyYXRvclByb3RvdHlwZSUubmV4dCgpXG59LCBmdW5jdGlvbiAoKSB7XG4gIHZhciBPID0gdGhpcy5fdDtcbiAgdmFyIGtpbmQgPSB0aGlzLl9rO1xuICB2YXIgaW5kZXggPSB0aGlzLl9pKys7XG4gIGlmICghTyB8fCBpbmRleCA+PSBPLmxlbmd0aCkge1xuICAgIHRoaXMuX3QgPSB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIHN0ZXAoMSk7XG4gIH1cbiAgaWYgKGtpbmQgPT0gJ2tleXMnKSByZXR1cm4gc3RlcCgwLCBpbmRleCk7XG4gIGlmIChraW5kID09ICd2YWx1ZXMnKSByZXR1cm4gc3RlcCgwLCBPW2luZGV4XSk7XG4gIHJldHVybiBzdGVwKDAsIFtpbmRleCwgT1tpbmRleF1dKTtcbn0sICd2YWx1ZXMnKTtcblxuLy8gYXJndW1lbnRzTGlzdFtAQGl0ZXJhdG9yXSBpcyAlQXJyYXlQcm90b192YWx1ZXMlICg5LjQuNC42LCA5LjQuNC43KVxuSXRlcmF0b3JzLkFyZ3VtZW50cyA9IEl0ZXJhdG9ycy5BcnJheTtcblxuYWRkVG9VbnNjb3BhYmxlcygna2V5cycpO1xuYWRkVG9VbnNjb3BhYmxlcygndmFsdWVzJyk7XG5hZGRUb1Vuc2NvcGFibGVzKCdlbnRyaWVzJyk7XG4iLCIndXNlIHN0cmljdCc7XG4vLyAyMi4xLjMuMTMgQXJyYXkucHJvdG90eXBlLmpvaW4oc2VwYXJhdG9yKVxudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciB0b0lPYmplY3QgPSByZXF1aXJlKCcuL190by1pb2JqZWN0Jyk7XG52YXIgYXJyYXlKb2luID0gW10uam9pbjtcblxuLy8gZmFsbGJhY2sgZm9yIG5vdCBhcnJheS1saWtlIHN0cmluZ3NcbiRleHBvcnQoJGV4cG9ydC5QICsgJGV4cG9ydC5GICogKHJlcXVpcmUoJy4vX2lvYmplY3QnKSAhPSBPYmplY3QgfHwgIXJlcXVpcmUoJy4vX3N0cmljdC1tZXRob2QnKShhcnJheUpvaW4pKSwgJ0FycmF5Jywge1xuICBqb2luOiBmdW5jdGlvbiBqb2luKHNlcGFyYXRvcikge1xuICAgIHJldHVybiBhcnJheUpvaW4uY2FsbCh0b0lPYmplY3QodGhpcyksIHNlcGFyYXRvciA9PT0gdW5kZWZpbmVkID8gJywnIDogc2VwYXJhdG9yKTtcbiAgfVxufSk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyIHRvSU9iamVjdCA9IHJlcXVpcmUoJy4vX3RvLWlvYmplY3QnKTtcbnZhciB0b0ludGVnZXIgPSByZXF1aXJlKCcuL190by1pbnRlZ2VyJyk7XG52YXIgdG9MZW5ndGggPSByZXF1aXJlKCcuL190by1sZW5ndGgnKTtcbnZhciAkbmF0aXZlID0gW10ubGFzdEluZGV4T2Y7XG52YXIgTkVHQVRJVkVfWkVSTyA9ICEhJG5hdGl2ZSAmJiAxIC8gWzFdLmxhc3RJbmRleE9mKDEsIC0wKSA8IDA7XG5cbiRleHBvcnQoJGV4cG9ydC5QICsgJGV4cG9ydC5GICogKE5FR0FUSVZFX1pFUk8gfHwgIXJlcXVpcmUoJy4vX3N0cmljdC1tZXRob2QnKSgkbmF0aXZlKSksICdBcnJheScsIHtcbiAgLy8gMjIuMS4zLjE0IC8gMTUuNC40LjE1IEFycmF5LnByb3RvdHlwZS5sYXN0SW5kZXhPZihzZWFyY2hFbGVtZW50IFssIGZyb21JbmRleF0pXG4gIGxhc3RJbmRleE9mOiBmdW5jdGlvbiBsYXN0SW5kZXhPZihzZWFyY2hFbGVtZW50IC8qICwgZnJvbUluZGV4ID0gQFsqLTFdICovKSB7XG4gICAgLy8gY29udmVydCAtMCB0byArMFxuICAgIGlmIChORUdBVElWRV9aRVJPKSByZXR1cm4gJG5hdGl2ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpIHx8IDA7XG4gICAgdmFyIE8gPSB0b0lPYmplY3QodGhpcyk7XG4gICAgdmFyIGxlbmd0aCA9IHRvTGVuZ3RoKE8ubGVuZ3RoKTtcbiAgICB2YXIgaW5kZXggPSBsZW5ndGggLSAxO1xuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID4gMSkgaW5kZXggPSBNYXRoLm1pbihpbmRleCwgdG9JbnRlZ2VyKGFyZ3VtZW50c1sxXSkpO1xuICAgIGlmIChpbmRleCA8IDApIGluZGV4ID0gbGVuZ3RoICsgaW5kZXg7XG4gICAgZm9yICg7aW5kZXggPj0gMDsgaW5kZXgtLSkgaWYgKGluZGV4IGluIE8pIGlmIChPW2luZGV4XSA9PT0gc2VhcmNoRWxlbWVudCkgcmV0dXJuIGluZGV4IHx8IDA7XG4gICAgcmV0dXJuIC0xO1xuICB9XG59KTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgJG1hcCA9IHJlcXVpcmUoJy4vX2FycmF5LW1ldGhvZHMnKSgxKTtcblxuJGV4cG9ydCgkZXhwb3J0LlAgKyAkZXhwb3J0LkYgKiAhcmVxdWlyZSgnLi9fc3RyaWN0LW1ldGhvZCcpKFtdLm1hcCwgdHJ1ZSksICdBcnJheScsIHtcbiAgLy8gMjIuMS4zLjE1IC8gMTUuNC40LjE5IEFycmF5LnByb3RvdHlwZS5tYXAoY2FsbGJhY2tmbiBbLCB0aGlzQXJnXSlcbiAgbWFwOiBmdW5jdGlvbiBtYXAoY2FsbGJhY2tmbiAvKiAsIHRoaXNBcmcgKi8pIHtcbiAgICByZXR1cm4gJG1hcCh0aGlzLCBjYWxsYmFja2ZuLCBhcmd1bWVudHNbMV0pO1xuICB9XG59KTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgY3JlYXRlUHJvcGVydHkgPSByZXF1aXJlKCcuL19jcmVhdGUtcHJvcGVydHknKTtcblxuLy8gV2ViS2l0IEFycmF5Lm9mIGlzbid0IGdlbmVyaWNcbiRleHBvcnQoJGV4cG9ydC5TICsgJGV4cG9ydC5GICogcmVxdWlyZSgnLi9fZmFpbHMnKShmdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIEYoKSB7IC8qIGVtcHR5ICovIH1cbiAgcmV0dXJuICEoQXJyYXkub2YuY2FsbChGKSBpbnN0YW5jZW9mIEYpO1xufSksICdBcnJheScsIHtcbiAgLy8gMjIuMS4yLjMgQXJyYXkub2YoIC4uLml0ZW1zKVxuICBvZjogZnVuY3Rpb24gb2YoLyogLi4uYXJncyAqLykge1xuICAgIHZhciBpbmRleCA9IDA7XG4gICAgdmFyIGFMZW4gPSBhcmd1bWVudHMubGVuZ3RoO1xuICAgIHZhciByZXN1bHQgPSBuZXcgKHR5cGVvZiB0aGlzID09ICdmdW5jdGlvbicgPyB0aGlzIDogQXJyYXkpKGFMZW4pO1xuICAgIHdoaWxlIChhTGVuID4gaW5kZXgpIGNyZWF0ZVByb3BlcnR5KHJlc3VsdCwgaW5kZXgsIGFyZ3VtZW50c1tpbmRleCsrXSk7XG4gICAgcmVzdWx0Lmxlbmd0aCA9IGFMZW47XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxufSk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyICRyZWR1Y2UgPSByZXF1aXJlKCcuL19hcnJheS1yZWR1Y2UnKTtcblxuJGV4cG9ydCgkZXhwb3J0LlAgKyAkZXhwb3J0LkYgKiAhcmVxdWlyZSgnLi9fc3RyaWN0LW1ldGhvZCcpKFtdLnJlZHVjZVJpZ2h0LCB0cnVlKSwgJ0FycmF5Jywge1xuICAvLyAyMi4xLjMuMTkgLyAxNS40LjQuMjIgQXJyYXkucHJvdG90eXBlLnJlZHVjZVJpZ2h0KGNhbGxiYWNrZm4gWywgaW5pdGlhbFZhbHVlXSlcbiAgcmVkdWNlUmlnaHQ6IGZ1bmN0aW9uIHJlZHVjZVJpZ2h0KGNhbGxiYWNrZm4gLyogLCBpbml0aWFsVmFsdWUgKi8pIHtcbiAgICByZXR1cm4gJHJlZHVjZSh0aGlzLCBjYWxsYmFja2ZuLCBhcmd1bWVudHMubGVuZ3RoLCBhcmd1bWVudHNbMV0sIHRydWUpO1xuICB9XG59KTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgJHJlZHVjZSA9IHJlcXVpcmUoJy4vX2FycmF5LXJlZHVjZScpO1xuXG4kZXhwb3J0KCRleHBvcnQuUCArICRleHBvcnQuRiAqICFyZXF1aXJlKCcuL19zdHJpY3QtbWV0aG9kJykoW10ucmVkdWNlLCB0cnVlKSwgJ0FycmF5Jywge1xuICAvLyAyMi4xLjMuMTggLyAxNS40LjQuMjEgQXJyYXkucHJvdG90eXBlLnJlZHVjZShjYWxsYmFja2ZuIFssIGluaXRpYWxWYWx1ZV0pXG4gIHJlZHVjZTogZnVuY3Rpb24gcmVkdWNlKGNhbGxiYWNrZm4gLyogLCBpbml0aWFsVmFsdWUgKi8pIHtcbiAgICByZXR1cm4gJHJlZHVjZSh0aGlzLCBjYWxsYmFja2ZuLCBhcmd1bWVudHMubGVuZ3RoLCBhcmd1bWVudHNbMV0sIGZhbHNlKTtcbiAgfVxufSk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyIGh0bWwgPSByZXF1aXJlKCcuL19odG1sJyk7XG52YXIgY29mID0gcmVxdWlyZSgnLi9fY29mJyk7XG52YXIgdG9BYnNvbHV0ZUluZGV4ID0gcmVxdWlyZSgnLi9fdG8tYWJzb2x1dGUtaW5kZXgnKTtcbnZhciB0b0xlbmd0aCA9IHJlcXVpcmUoJy4vX3RvLWxlbmd0aCcpO1xudmFyIGFycmF5U2xpY2UgPSBbXS5zbGljZTtcblxuLy8gZmFsbGJhY2sgZm9yIG5vdCBhcnJheS1saWtlIEVTMyBzdHJpbmdzIGFuZCBET00gb2JqZWN0c1xuJGV4cG9ydCgkZXhwb3J0LlAgKyAkZXhwb3J0LkYgKiByZXF1aXJlKCcuL19mYWlscycpKGZ1bmN0aW9uICgpIHtcbiAgaWYgKGh0bWwpIGFycmF5U2xpY2UuY2FsbChodG1sKTtcbn0pLCAnQXJyYXknLCB7XG4gIHNsaWNlOiBmdW5jdGlvbiBzbGljZShiZWdpbiwgZW5kKSB7XG4gICAgdmFyIGxlbiA9IHRvTGVuZ3RoKHRoaXMubGVuZ3RoKTtcbiAgICB2YXIga2xhc3MgPSBjb2YodGhpcyk7XG4gICAgZW5kID0gZW5kID09PSB1bmRlZmluZWQgPyBsZW4gOiBlbmQ7XG4gICAgaWYgKGtsYXNzID09ICdBcnJheScpIHJldHVybiBhcnJheVNsaWNlLmNhbGwodGhpcywgYmVnaW4sIGVuZCk7XG4gICAgdmFyIHN0YXJ0ID0gdG9BYnNvbHV0ZUluZGV4KGJlZ2luLCBsZW4pO1xuICAgIHZhciB1cFRvID0gdG9BYnNvbHV0ZUluZGV4KGVuZCwgbGVuKTtcbiAgICB2YXIgc2l6ZSA9IHRvTGVuZ3RoKHVwVG8gLSBzdGFydCk7XG4gICAgdmFyIGNsb25lZCA9IG5ldyBBcnJheShzaXplKTtcbiAgICB2YXIgaSA9IDA7XG4gICAgZm9yICg7IGkgPCBzaXplOyBpKyspIGNsb25lZFtpXSA9IGtsYXNzID09ICdTdHJpbmcnXG4gICAgICA/IHRoaXMuY2hhckF0KHN0YXJ0ICsgaSlcbiAgICAgIDogdGhpc1tzdGFydCArIGldO1xuICAgIHJldHVybiBjbG9uZWQ7XG4gIH1cbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciAkc29tZSA9IHJlcXVpcmUoJy4vX2FycmF5LW1ldGhvZHMnKSgzKTtcblxuJGV4cG9ydCgkZXhwb3J0LlAgKyAkZXhwb3J0LkYgKiAhcmVxdWlyZSgnLi9fc3RyaWN0LW1ldGhvZCcpKFtdLnNvbWUsIHRydWUpLCAnQXJyYXknLCB7XG4gIC8vIDIyLjEuMy4yMyAvIDE1LjQuNC4xNyBBcnJheS5wcm90b3R5cGUuc29tZShjYWxsYmFja2ZuIFssIHRoaXNBcmddKVxuICBzb21lOiBmdW5jdGlvbiBzb21lKGNhbGxiYWNrZm4gLyogLCB0aGlzQXJnICovKSB7XG4gICAgcmV0dXJuICRzb21lKHRoaXMsIGNhbGxiYWNrZm4sIGFyZ3VtZW50c1sxXSk7XG4gIH1cbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciBhRnVuY3Rpb24gPSByZXF1aXJlKCcuL19hLWZ1bmN0aW9uJyk7XG52YXIgdG9PYmplY3QgPSByZXF1aXJlKCcuL190by1vYmplY3QnKTtcbnZhciBmYWlscyA9IHJlcXVpcmUoJy4vX2ZhaWxzJyk7XG52YXIgJHNvcnQgPSBbXS5zb3J0O1xudmFyIHRlc3QgPSBbMSwgMiwgM107XG5cbiRleHBvcnQoJGV4cG9ydC5QICsgJGV4cG9ydC5GICogKGZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgLy8gSUU4LVxuICB0ZXN0LnNvcnQodW5kZWZpbmVkKTtcbn0pIHx8ICFmYWlscyhmdW5jdGlvbiAoKSB7XG4gIC8vIFY4IGJ1Z1xuICB0ZXN0LnNvcnQobnVsbCk7XG4gIC8vIE9sZCBXZWJLaXRcbn0pIHx8ICFyZXF1aXJlKCcuL19zdHJpY3QtbWV0aG9kJykoJHNvcnQpKSwgJ0FycmF5Jywge1xuICAvLyAyMi4xLjMuMjUgQXJyYXkucHJvdG90eXBlLnNvcnQoY29tcGFyZWZuKVxuICBzb3J0OiBmdW5jdGlvbiBzb3J0KGNvbXBhcmVmbikge1xuICAgIHJldHVybiBjb21wYXJlZm4gPT09IHVuZGVmaW5lZFxuICAgICAgPyAkc29ydC5jYWxsKHRvT2JqZWN0KHRoaXMpKVxuICAgICAgOiAkc29ydC5jYWxsKHRvT2JqZWN0KHRoaXMpLCBhRnVuY3Rpb24oY29tcGFyZWZuKSk7XG4gIH1cbn0pO1xuIiwicmVxdWlyZSgnLi9fc2V0LXNwZWNpZXMnKSgnQXJyYXknKTtcbiIsIi8vIDIwLjMuMy4xIC8gMTUuOS40LjQgRGF0ZS5ub3coKVxudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcblxuJGV4cG9ydCgkZXhwb3J0LlMsICdEYXRlJywgeyBub3c6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG5ldyBEYXRlKCkuZ2V0VGltZSgpOyB9IH0pO1xuIiwiLy8gMjAuMy40LjM2IC8gMTUuOS41LjQzIERhdGUucHJvdG90eXBlLnRvSVNPU3RyaW5nKClcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgdG9JU09TdHJpbmcgPSByZXF1aXJlKCcuL19kYXRlLXRvLWlzby1zdHJpbmcnKTtcblxuLy8gUGhhbnRvbUpTIC8gb2xkIFdlYktpdCBoYXMgYSBicm9rZW4gaW1wbGVtZW50YXRpb25zXG4kZXhwb3J0KCRleHBvcnQuUCArICRleHBvcnQuRiAqIChEYXRlLnByb3RvdHlwZS50b0lTT1N0cmluZyAhPT0gdG9JU09TdHJpbmcpLCAnRGF0ZScsIHtcbiAgdG9JU09TdHJpbmc6IHRvSVNPU3RyaW5nXG59KTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgdG9PYmplY3QgPSByZXF1aXJlKCcuL190by1vYmplY3QnKTtcbnZhciB0b1ByaW1pdGl2ZSA9IHJlcXVpcmUoJy4vX3RvLXByaW1pdGl2ZScpO1xuXG4kZXhwb3J0KCRleHBvcnQuUCArICRleHBvcnQuRiAqIHJlcXVpcmUoJy4vX2ZhaWxzJykoZnVuY3Rpb24gKCkge1xuICByZXR1cm4gbmV3IERhdGUoTmFOKS50b0pTT04oKSAhPT0gbnVsbFxuICAgIHx8IERhdGUucHJvdG90eXBlLnRvSlNPTi5jYWxsKHsgdG9JU09TdHJpbmc6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIDE7IH0gfSkgIT09IDE7XG59KSwgJ0RhdGUnLCB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtdmFyc1xuICB0b0pTT046IGZ1bmN0aW9uIHRvSlNPTihrZXkpIHtcbiAgICB2YXIgTyA9IHRvT2JqZWN0KHRoaXMpO1xuICAgIHZhciBwdiA9IHRvUHJpbWl0aXZlKE8pO1xuICAgIHJldHVybiB0eXBlb2YgcHYgPT0gJ251bWJlcicgJiYgIWlzRmluaXRlKHB2KSA/IG51bGwgOiBPLnRvSVNPU3RyaW5nKCk7XG4gIH1cbn0pO1xuIiwidmFyIFRPX1BSSU1JVElWRSA9IHJlcXVpcmUoJy4vX3drcycpKCd0b1ByaW1pdGl2ZScpO1xudmFyIHByb3RvID0gRGF0ZS5wcm90b3R5cGU7XG5cbmlmICghKFRPX1BSSU1JVElWRSBpbiBwcm90bykpIHJlcXVpcmUoJy4vX2hpZGUnKShwcm90bywgVE9fUFJJTUlUSVZFLCByZXF1aXJlKCcuL19kYXRlLXRvLXByaW1pdGl2ZScpKTtcbiIsInZhciBEYXRlUHJvdG8gPSBEYXRlLnByb3RvdHlwZTtcbnZhciBJTlZBTElEX0RBVEUgPSAnSW52YWxpZCBEYXRlJztcbnZhciBUT19TVFJJTkcgPSAndG9TdHJpbmcnO1xudmFyICR0b1N0cmluZyA9IERhdGVQcm90b1tUT19TVFJJTkddO1xudmFyIGdldFRpbWUgPSBEYXRlUHJvdG8uZ2V0VGltZTtcbmlmIChuZXcgRGF0ZShOYU4pICsgJycgIT0gSU5WQUxJRF9EQVRFKSB7XG4gIHJlcXVpcmUoJy4vX3JlZGVmaW5lJykoRGF0ZVByb3RvLCBUT19TVFJJTkcsIGZ1bmN0aW9uIHRvU3RyaW5nKCkge1xuICAgIHZhciB2YWx1ZSA9IGdldFRpbWUuY2FsbCh0aGlzKTtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2VsZi1jb21wYXJlXG4gICAgcmV0dXJuIHZhbHVlID09PSB2YWx1ZSA/ICR0b1N0cmluZy5jYWxsKHRoaXMpIDogSU5WQUxJRF9EQVRFO1xuICB9KTtcbn1cbiIsIi8vIDE5LjIuMy4yIC8gMTUuMy40LjUgRnVuY3Rpb24ucHJvdG90eXBlLmJpbmQodGhpc0FyZywgYXJncy4uLilcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG5cbiRleHBvcnQoJGV4cG9ydC5QLCAnRnVuY3Rpb24nLCB7IGJpbmQ6IHJlcXVpcmUoJy4vX2JpbmQnKSB9KTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4vX2lzLW9iamVjdCcpO1xudmFyIGdldFByb3RvdHlwZU9mID0gcmVxdWlyZSgnLi9fb2JqZWN0LWdwbycpO1xudmFyIEhBU19JTlNUQU5DRSA9IHJlcXVpcmUoJy4vX3drcycpKCdoYXNJbnN0YW5jZScpO1xudmFyIEZ1bmN0aW9uUHJvdG8gPSBGdW5jdGlvbi5wcm90b3R5cGU7XG4vLyAxOS4yLjMuNiBGdW5jdGlvbi5wcm90b3R5cGVbQEBoYXNJbnN0YW5jZV0oVilcbmlmICghKEhBU19JTlNUQU5DRSBpbiBGdW5jdGlvblByb3RvKSkgcmVxdWlyZSgnLi9fb2JqZWN0LWRwJykuZihGdW5jdGlvblByb3RvLCBIQVNfSU5TVEFOQ0UsIHsgdmFsdWU6IGZ1bmN0aW9uIChPKSB7XG4gIGlmICh0eXBlb2YgdGhpcyAhPSAnZnVuY3Rpb24nIHx8ICFpc09iamVjdChPKSkgcmV0dXJuIGZhbHNlO1xuICBpZiAoIWlzT2JqZWN0KHRoaXMucHJvdG90eXBlKSkgcmV0dXJuIE8gaW5zdGFuY2VvZiB0aGlzO1xuICAvLyBmb3IgZW52aXJvbm1lbnQgdy9vIG5hdGl2ZSBgQEBoYXNJbnN0YW5jZWAgbG9naWMgZW5vdWdoIGBpbnN0YW5jZW9mYCwgYnV0IGFkZCB0aGlzOlxuICB3aGlsZSAoTyA9IGdldFByb3RvdHlwZU9mKE8pKSBpZiAodGhpcy5wcm90b3R5cGUgPT09IE8pIHJldHVybiB0cnVlO1xuICByZXR1cm4gZmFsc2U7XG59IH0pO1xuIiwidmFyIGRQID0gcmVxdWlyZSgnLi9fb2JqZWN0LWRwJykuZjtcbnZhciBGUHJvdG8gPSBGdW5jdGlvbi5wcm90b3R5cGU7XG52YXIgbmFtZVJFID0gL15cXHMqZnVuY3Rpb24gKFteIChdKikvO1xudmFyIE5BTUUgPSAnbmFtZSc7XG5cbi8vIDE5LjIuNC4yIG5hbWVcbk5BTUUgaW4gRlByb3RvIHx8IHJlcXVpcmUoJy4vX2Rlc2NyaXB0b3JzJykgJiYgZFAoRlByb3RvLCBOQU1FLCB7XG4gIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiAoJycgKyB0aGlzKS5tYXRjaChuYW1lUkUpWzFdO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHJldHVybiAnJztcbiAgICB9XG4gIH1cbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIHN0cm9uZyA9IHJlcXVpcmUoJy4vX2NvbGxlY3Rpb24tc3Ryb25nJyk7XG52YXIgdmFsaWRhdGUgPSByZXF1aXJlKCcuL192YWxpZGF0ZS1jb2xsZWN0aW9uJyk7XG52YXIgTUFQID0gJ01hcCc7XG5cbi8vIDIzLjEgTWFwIE9iamVjdHNcbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9fY29sbGVjdGlvbicpKE1BUCwgZnVuY3Rpb24gKGdldCkge1xuICByZXR1cm4gZnVuY3Rpb24gTWFwKCkgeyByZXR1cm4gZ2V0KHRoaXMsIGFyZ3VtZW50cy5sZW5ndGggPiAwID8gYXJndW1lbnRzWzBdIDogdW5kZWZpbmVkKTsgfTtcbn0sIHtcbiAgLy8gMjMuMS4zLjYgTWFwLnByb3RvdHlwZS5nZXQoa2V5KVxuICBnZXQ6IGZ1bmN0aW9uIGdldChrZXkpIHtcbiAgICB2YXIgZW50cnkgPSBzdHJvbmcuZ2V0RW50cnkodmFsaWRhdGUodGhpcywgTUFQKSwga2V5KTtcbiAgICByZXR1cm4gZW50cnkgJiYgZW50cnkudjtcbiAgfSxcbiAgLy8gMjMuMS4zLjkgTWFwLnByb3RvdHlwZS5zZXQoa2V5LCB2YWx1ZSlcbiAgc2V0OiBmdW5jdGlvbiBzZXQoa2V5LCB2YWx1ZSkge1xuICAgIHJldHVybiBzdHJvbmcuZGVmKHZhbGlkYXRlKHRoaXMsIE1BUCksIGtleSA9PT0gMCA/IDAgOiBrZXksIHZhbHVlKTtcbiAgfVxufSwgc3Ryb25nLCB0cnVlKTtcbiIsIi8vIDIwLjIuMi4zIE1hdGguYWNvc2goeClcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgbG9nMXAgPSByZXF1aXJlKCcuL19tYXRoLWxvZzFwJyk7XG52YXIgc3FydCA9IE1hdGguc3FydDtcbnZhciAkYWNvc2ggPSBNYXRoLmFjb3NoO1xuXG4kZXhwb3J0KCRleHBvcnQuUyArICRleHBvcnQuRiAqICEoJGFjb3NoXG4gIC8vIFY4IGJ1ZzogaHR0cHM6Ly9jb2RlLmdvb2dsZS5jb20vcC92OC9pc3N1ZXMvZGV0YWlsP2lkPTM1MDlcbiAgJiYgTWF0aC5mbG9vcigkYWNvc2goTnVtYmVyLk1BWF9WQUxVRSkpID09IDcxMFxuICAvLyBUb3IgQnJvd3NlciBidWc6IE1hdGguYWNvc2goSW5maW5pdHkpIC0+IE5hTlxuICAmJiAkYWNvc2goSW5maW5pdHkpID09IEluZmluaXR5XG4pLCAnTWF0aCcsIHtcbiAgYWNvc2g6IGZ1bmN0aW9uIGFjb3NoKHgpIHtcbiAgICByZXR1cm4gKHggPSAreCkgPCAxID8gTmFOIDogeCA+IDk0OTA2MjY1LjYyNDI1MTU2XG4gICAgICA/IE1hdGgubG9nKHgpICsgTWF0aC5MTjJcbiAgICAgIDogbG9nMXAoeCAtIDEgKyBzcXJ0KHggLSAxKSAqIHNxcnQoeCArIDEpKTtcbiAgfVxufSk7XG4iLCIvLyAyMC4yLjIuNSBNYXRoLmFzaW5oKHgpXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyICRhc2luaCA9IE1hdGguYXNpbmg7XG5cbmZ1bmN0aW9uIGFzaW5oKHgpIHtcbiAgcmV0dXJuICFpc0Zpbml0ZSh4ID0gK3gpIHx8IHggPT0gMCA/IHggOiB4IDwgMCA/IC1hc2luaCgteCkgOiBNYXRoLmxvZyh4ICsgTWF0aC5zcXJ0KHggKiB4ICsgMSkpO1xufVxuXG4vLyBUb3IgQnJvd3NlciBidWc6IE1hdGguYXNpbmgoMCkgLT4gLTBcbiRleHBvcnQoJGV4cG9ydC5TICsgJGV4cG9ydC5GICogISgkYXNpbmggJiYgMSAvICRhc2luaCgwKSA+IDApLCAnTWF0aCcsIHsgYXNpbmg6IGFzaW5oIH0pO1xuIiwiLy8gMjAuMi4yLjcgTWF0aC5hdGFuaCh4KVxudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciAkYXRhbmggPSBNYXRoLmF0YW5oO1xuXG4vLyBUb3IgQnJvd3NlciBidWc6IE1hdGguYXRhbmgoLTApIC0+IDBcbiRleHBvcnQoJGV4cG9ydC5TICsgJGV4cG9ydC5GICogISgkYXRhbmggJiYgMSAvICRhdGFuaCgtMCkgPCAwKSwgJ01hdGgnLCB7XG4gIGF0YW5oOiBmdW5jdGlvbiBhdGFuaCh4KSB7XG4gICAgcmV0dXJuICh4ID0gK3gpID09IDAgPyB4IDogTWF0aC5sb2coKDEgKyB4KSAvICgxIC0geCkpIC8gMjtcbiAgfVxufSk7XG4iLCIvLyAyMC4yLjIuOSBNYXRoLmNicnQoeClcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgc2lnbiA9IHJlcXVpcmUoJy4vX21hdGgtc2lnbicpO1xuXG4kZXhwb3J0KCRleHBvcnQuUywgJ01hdGgnLCB7XG4gIGNicnQ6IGZ1bmN0aW9uIGNicnQoeCkge1xuICAgIHJldHVybiBzaWduKHggPSAreCkgKiBNYXRoLnBvdyhNYXRoLmFicyh4KSwgMSAvIDMpO1xuICB9XG59KTtcbiIsIi8vIDIwLjIuMi4xMSBNYXRoLmNsejMyKHgpXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xuXG4kZXhwb3J0KCRleHBvcnQuUywgJ01hdGgnLCB7XG4gIGNsejMyOiBmdW5jdGlvbiBjbHozMih4KSB7XG4gICAgcmV0dXJuICh4ID4+Pj0gMCkgPyAzMSAtIE1hdGguZmxvb3IoTWF0aC5sb2coeCArIDAuNSkgKiBNYXRoLkxPRzJFKSA6IDMyO1xuICB9XG59KTtcbiIsIi8vIDIwLjIuMi4xMiBNYXRoLmNvc2goeClcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgZXhwID0gTWF0aC5leHA7XG5cbiRleHBvcnQoJGV4cG9ydC5TLCAnTWF0aCcsIHtcbiAgY29zaDogZnVuY3Rpb24gY29zaCh4KSB7XG4gICAgcmV0dXJuIChleHAoeCA9ICt4KSArIGV4cCgteCkpIC8gMjtcbiAgfVxufSk7XG4iLCIvLyAyMC4yLjIuMTQgTWF0aC5leHBtMSh4KVxudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciAkZXhwbTEgPSByZXF1aXJlKCcuL19tYXRoLWV4cG0xJyk7XG5cbiRleHBvcnQoJGV4cG9ydC5TICsgJGV4cG9ydC5GICogKCRleHBtMSAhPSBNYXRoLmV4cG0xKSwgJ01hdGgnLCB7IGV4cG0xOiAkZXhwbTEgfSk7XG4iLCIvLyAyMC4yLjIuMTYgTWF0aC5mcm91bmQoeClcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG5cbiRleHBvcnQoJGV4cG9ydC5TLCAnTWF0aCcsIHsgZnJvdW5kOiByZXF1aXJlKCcuL19tYXRoLWZyb3VuZCcpIH0pO1xuIiwiLy8gMjAuMi4yLjE3IE1hdGguaHlwb3QoW3ZhbHVlMVssIHZhbHVlMlssIOKApiBdXV0pXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyIGFicyA9IE1hdGguYWJzO1xuXG4kZXhwb3J0KCRleHBvcnQuUywgJ01hdGgnLCB7XG4gIGh5cG90OiBmdW5jdGlvbiBoeXBvdCh2YWx1ZTEsIHZhbHVlMikgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVudXNlZC12YXJzXG4gICAgdmFyIHN1bSA9IDA7XG4gICAgdmFyIGkgPSAwO1xuICAgIHZhciBhTGVuID0gYXJndW1lbnRzLmxlbmd0aDtcbiAgICB2YXIgbGFyZyA9IDA7XG4gICAgdmFyIGFyZywgZGl2O1xuICAgIHdoaWxlIChpIDwgYUxlbikge1xuICAgICAgYXJnID0gYWJzKGFyZ3VtZW50c1tpKytdKTtcbiAgICAgIGlmIChsYXJnIDwgYXJnKSB7XG4gICAgICAgIGRpdiA9IGxhcmcgLyBhcmc7XG4gICAgICAgIHN1bSA9IHN1bSAqIGRpdiAqIGRpdiArIDE7XG4gICAgICAgIGxhcmcgPSBhcmc7XG4gICAgICB9IGVsc2UgaWYgKGFyZyA+IDApIHtcbiAgICAgICAgZGl2ID0gYXJnIC8gbGFyZztcbiAgICAgICAgc3VtICs9IGRpdiAqIGRpdjtcbiAgICAgIH0gZWxzZSBzdW0gKz0gYXJnO1xuICAgIH1cbiAgICByZXR1cm4gbGFyZyA9PT0gSW5maW5pdHkgPyBJbmZpbml0eSA6IGxhcmcgKiBNYXRoLnNxcnQoc3VtKTtcbiAgfVxufSk7XG4iLCIvLyAyMC4yLjIuMTggTWF0aC5pbXVsKHgsIHkpXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyICRpbXVsID0gTWF0aC5pbXVsO1xuXG4vLyBzb21lIFdlYktpdCB2ZXJzaW9ucyBmYWlscyB3aXRoIGJpZyBudW1iZXJzLCBzb21lIGhhcyB3cm9uZyBhcml0eVxuJGV4cG9ydCgkZXhwb3J0LlMgKyAkZXhwb3J0LkYgKiByZXF1aXJlKCcuL19mYWlscycpKGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuICRpbXVsKDB4ZmZmZmZmZmYsIDUpICE9IC01IHx8ICRpbXVsLmxlbmd0aCAhPSAyO1xufSksICdNYXRoJywge1xuICBpbXVsOiBmdW5jdGlvbiBpbXVsKHgsIHkpIHtcbiAgICB2YXIgVUlOVDE2ID0gMHhmZmZmO1xuICAgIHZhciB4biA9ICt4O1xuICAgIHZhciB5biA9ICt5O1xuICAgIHZhciB4bCA9IFVJTlQxNiAmIHhuO1xuICAgIHZhciB5bCA9IFVJTlQxNiAmIHluO1xuICAgIHJldHVybiAwIHwgeGwgKiB5bCArICgoVUlOVDE2ICYgeG4gPj4+IDE2KSAqIHlsICsgeGwgKiAoVUlOVDE2ICYgeW4gPj4+IDE2KSA8PCAxNiA+Pj4gMCk7XG4gIH1cbn0pO1xuIiwiLy8gMjAuMi4yLjIxIE1hdGgubG9nMTAoeClcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG5cbiRleHBvcnQoJGV4cG9ydC5TLCAnTWF0aCcsIHtcbiAgbG9nMTA6IGZ1bmN0aW9uIGxvZzEwKHgpIHtcbiAgICByZXR1cm4gTWF0aC5sb2coeCkgKiBNYXRoLkxPRzEwRTtcbiAgfVxufSk7XG4iLCIvLyAyMC4yLjIuMjAgTWF0aC5sb2cxcCh4KVxudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcblxuJGV4cG9ydCgkZXhwb3J0LlMsICdNYXRoJywgeyBsb2cxcDogcmVxdWlyZSgnLi9fbWF0aC1sb2cxcCcpIH0pO1xuIiwiLy8gMjAuMi4yLjIyIE1hdGgubG9nMih4KVxudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcblxuJGV4cG9ydCgkZXhwb3J0LlMsICdNYXRoJywge1xuICBsb2cyOiBmdW5jdGlvbiBsb2cyKHgpIHtcbiAgICByZXR1cm4gTWF0aC5sb2coeCkgLyBNYXRoLkxOMjtcbiAgfVxufSk7XG4iLCIvLyAyMC4yLjIuMjggTWF0aC5zaWduKHgpXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xuXG4kZXhwb3J0KCRleHBvcnQuUywgJ01hdGgnLCB7IHNpZ246IHJlcXVpcmUoJy4vX21hdGgtc2lnbicpIH0pO1xuIiwiLy8gMjAuMi4yLjMwIE1hdGguc2luaCh4KVxudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciBleHBtMSA9IHJlcXVpcmUoJy4vX21hdGgtZXhwbTEnKTtcbnZhciBleHAgPSBNYXRoLmV4cDtcblxuLy8gVjggbmVhciBDaHJvbWl1bSAzOCBoYXMgYSBwcm9ibGVtIHdpdGggdmVyeSBzbWFsbCBudW1iZXJzXG4kZXhwb3J0KCRleHBvcnQuUyArICRleHBvcnQuRiAqIHJlcXVpcmUoJy4vX2ZhaWxzJykoZnVuY3Rpb24gKCkge1xuICByZXR1cm4gIU1hdGguc2luaCgtMmUtMTcpICE9IC0yZS0xNztcbn0pLCAnTWF0aCcsIHtcbiAgc2luaDogZnVuY3Rpb24gc2luaCh4KSB7XG4gICAgcmV0dXJuIE1hdGguYWJzKHggPSAreCkgPCAxXG4gICAgICA/IChleHBtMSh4KSAtIGV4cG0xKC14KSkgLyAyXG4gICAgICA6IChleHAoeCAtIDEpIC0gZXhwKC14IC0gMSkpICogKE1hdGguRSAvIDIpO1xuICB9XG59KTtcbiIsIi8vIDIwLjIuMi4zMyBNYXRoLnRhbmgoeClcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgZXhwbTEgPSByZXF1aXJlKCcuL19tYXRoLWV4cG0xJyk7XG52YXIgZXhwID0gTWF0aC5leHA7XG5cbiRleHBvcnQoJGV4cG9ydC5TLCAnTWF0aCcsIHtcbiAgdGFuaDogZnVuY3Rpb24gdGFuaCh4KSB7XG4gICAgdmFyIGEgPSBleHBtMSh4ID0gK3gpO1xuICAgIHZhciBiID0gZXhwbTEoLXgpO1xuICAgIHJldHVybiBhID09IEluZmluaXR5ID8gMSA6IGIgPT0gSW5maW5pdHkgPyAtMSA6IChhIC0gYikgLyAoZXhwKHgpICsgZXhwKC14KSk7XG4gIH1cbn0pO1xuIiwiLy8gMjAuMi4yLjM0IE1hdGgudHJ1bmMoeClcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG5cbiRleHBvcnQoJGV4cG9ydC5TLCAnTWF0aCcsIHtcbiAgdHJ1bmM6IGZ1bmN0aW9uIHRydW5jKGl0KSB7XG4gICAgcmV0dXJuIChpdCA+IDAgPyBNYXRoLmZsb29yIDogTWF0aC5jZWlsKShpdCk7XG4gIH1cbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4vX2dsb2JhbCcpO1xudmFyIGhhcyA9IHJlcXVpcmUoJy4vX2hhcycpO1xudmFyIGNvZiA9IHJlcXVpcmUoJy4vX2NvZicpO1xudmFyIGluaGVyaXRJZlJlcXVpcmVkID0gcmVxdWlyZSgnLi9faW5oZXJpdC1pZi1yZXF1aXJlZCcpO1xudmFyIHRvUHJpbWl0aXZlID0gcmVxdWlyZSgnLi9fdG8tcHJpbWl0aXZlJyk7XG52YXIgZmFpbHMgPSByZXF1aXJlKCcuL19mYWlscycpO1xudmFyIGdPUE4gPSByZXF1aXJlKCcuL19vYmplY3QtZ29wbicpLmY7XG52YXIgZ09QRCA9IHJlcXVpcmUoJy4vX29iamVjdC1nb3BkJykuZjtcbnZhciBkUCA9IHJlcXVpcmUoJy4vX29iamVjdC1kcCcpLmY7XG52YXIgJHRyaW0gPSByZXF1aXJlKCcuL19zdHJpbmctdHJpbScpLnRyaW07XG52YXIgTlVNQkVSID0gJ051bWJlcic7XG52YXIgJE51bWJlciA9IGdsb2JhbFtOVU1CRVJdO1xudmFyIEJhc2UgPSAkTnVtYmVyO1xudmFyIHByb3RvID0gJE51bWJlci5wcm90b3R5cGU7XG4vLyBPcGVyYSB+MTIgaGFzIGJyb2tlbiBPYmplY3QjdG9TdHJpbmdcbnZhciBCUk9LRU5fQ09GID0gY29mKHJlcXVpcmUoJy4vX29iamVjdC1jcmVhdGUnKShwcm90bykpID09IE5VTUJFUjtcbnZhciBUUklNID0gJ3RyaW0nIGluIFN0cmluZy5wcm90b3R5cGU7XG5cbi8vIDcuMS4zIFRvTnVtYmVyKGFyZ3VtZW50KVxudmFyIHRvTnVtYmVyID0gZnVuY3Rpb24gKGFyZ3VtZW50KSB7XG4gIHZhciBpdCA9IHRvUHJpbWl0aXZlKGFyZ3VtZW50LCBmYWxzZSk7XG4gIGlmICh0eXBlb2YgaXQgPT0gJ3N0cmluZycgJiYgaXQubGVuZ3RoID4gMikge1xuICAgIGl0ID0gVFJJTSA/IGl0LnRyaW0oKSA6ICR0cmltKGl0LCAzKTtcbiAgICB2YXIgZmlyc3QgPSBpdC5jaGFyQ29kZUF0KDApO1xuICAgIHZhciB0aGlyZCwgcmFkaXgsIG1heENvZGU7XG4gICAgaWYgKGZpcnN0ID09PSA0MyB8fCBmaXJzdCA9PT0gNDUpIHtcbiAgICAgIHRoaXJkID0gaXQuY2hhckNvZGVBdCgyKTtcbiAgICAgIGlmICh0aGlyZCA9PT0gODggfHwgdGhpcmQgPT09IDEyMCkgcmV0dXJuIE5hTjsgLy8gTnVtYmVyKCcrMHgxJykgc2hvdWxkIGJlIE5hTiwgb2xkIFY4IGZpeFxuICAgIH0gZWxzZSBpZiAoZmlyc3QgPT09IDQ4KSB7XG4gICAgICBzd2l0Y2ggKGl0LmNoYXJDb2RlQXQoMSkpIHtcbiAgICAgICAgY2FzZSA2NjogY2FzZSA5ODogcmFkaXggPSAyOyBtYXhDb2RlID0gNDk7IGJyZWFrOyAvLyBmYXN0IGVxdWFsIC9eMGJbMDFdKyQvaVxuICAgICAgICBjYXNlIDc5OiBjYXNlIDExMTogcmFkaXggPSA4OyBtYXhDb2RlID0gNTU7IGJyZWFrOyAvLyBmYXN0IGVxdWFsIC9eMG9bMC03XSskL2lcbiAgICAgICAgZGVmYXVsdDogcmV0dXJuICtpdDtcbiAgICAgIH1cbiAgICAgIGZvciAodmFyIGRpZ2l0cyA9IGl0LnNsaWNlKDIpLCBpID0gMCwgbCA9IGRpZ2l0cy5sZW5ndGgsIGNvZGU7IGkgPCBsOyBpKyspIHtcbiAgICAgICAgY29kZSA9IGRpZ2l0cy5jaGFyQ29kZUF0KGkpO1xuICAgICAgICAvLyBwYXJzZUludCBwYXJzZXMgYSBzdHJpbmcgdG8gYSBmaXJzdCB1bmF2YWlsYWJsZSBzeW1ib2xcbiAgICAgICAgLy8gYnV0IFRvTnVtYmVyIHNob3VsZCByZXR1cm4gTmFOIGlmIGEgc3RyaW5nIGNvbnRhaW5zIHVuYXZhaWxhYmxlIHN5bWJvbHNcbiAgICAgICAgaWYgKGNvZGUgPCA0OCB8fCBjb2RlID4gbWF4Q29kZSkgcmV0dXJuIE5hTjtcbiAgICAgIH0gcmV0dXJuIHBhcnNlSW50KGRpZ2l0cywgcmFkaXgpO1xuICAgIH1cbiAgfSByZXR1cm4gK2l0O1xufTtcblxuaWYgKCEkTnVtYmVyKCcgMG8xJykgfHwgISROdW1iZXIoJzBiMScpIHx8ICROdW1iZXIoJysweDEnKSkge1xuICAkTnVtYmVyID0gZnVuY3Rpb24gTnVtYmVyKHZhbHVlKSB7XG4gICAgdmFyIGl0ID0gYXJndW1lbnRzLmxlbmd0aCA8IDEgPyAwIDogdmFsdWU7XG4gICAgdmFyIHRoYXQgPSB0aGlzO1xuICAgIHJldHVybiB0aGF0IGluc3RhbmNlb2YgJE51bWJlclxuICAgICAgLy8gY2hlY2sgb24gMS4uY29uc3RydWN0b3IoZm9vKSBjYXNlXG4gICAgICAmJiAoQlJPS0VOX0NPRiA/IGZhaWxzKGZ1bmN0aW9uICgpIHsgcHJvdG8udmFsdWVPZi5jYWxsKHRoYXQpOyB9KSA6IGNvZih0aGF0KSAhPSBOVU1CRVIpXG4gICAgICAgID8gaW5oZXJpdElmUmVxdWlyZWQobmV3IEJhc2UodG9OdW1iZXIoaXQpKSwgdGhhdCwgJE51bWJlcikgOiB0b051bWJlcihpdCk7XG4gIH07XG4gIGZvciAodmFyIGtleXMgPSByZXF1aXJlKCcuL19kZXNjcmlwdG9ycycpID8gZ09QTihCYXNlKSA6IChcbiAgICAvLyBFUzM6XG4gICAgJ01BWF9WQUxVRSxNSU5fVkFMVUUsTmFOLE5FR0FUSVZFX0lORklOSVRZLFBPU0lUSVZFX0lORklOSVRZLCcgK1xuICAgIC8vIEVTNiAoaW4gY2FzZSwgaWYgbW9kdWxlcyB3aXRoIEVTNiBOdW1iZXIgc3RhdGljcyByZXF1aXJlZCBiZWZvcmUpOlxuICAgICdFUFNJTE9OLGlzRmluaXRlLGlzSW50ZWdlcixpc05hTixpc1NhZmVJbnRlZ2VyLE1BWF9TQUZFX0lOVEVHRVIsJyArXG4gICAgJ01JTl9TQUZFX0lOVEVHRVIscGFyc2VGbG9hdCxwYXJzZUludCxpc0ludGVnZXInXG4gICkuc3BsaXQoJywnKSwgaiA9IDAsIGtleTsga2V5cy5sZW5ndGggPiBqOyBqKyspIHtcbiAgICBpZiAoaGFzKEJhc2UsIGtleSA9IGtleXNbal0pICYmICFoYXMoJE51bWJlciwga2V5KSkge1xuICAgICAgZFAoJE51bWJlciwga2V5LCBnT1BEKEJhc2UsIGtleSkpO1xuICAgIH1cbiAgfVxuICAkTnVtYmVyLnByb3RvdHlwZSA9IHByb3RvO1xuICBwcm90by5jb25zdHJ1Y3RvciA9ICROdW1iZXI7XG4gIHJlcXVpcmUoJy4vX3JlZGVmaW5lJykoZ2xvYmFsLCBOVU1CRVIsICROdW1iZXIpO1xufVxuIiwiLy8gMjAuMS4yLjEgTnVtYmVyLkVQU0lMT05cbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG5cbiRleHBvcnQoJGV4cG9ydC5TLCAnTnVtYmVyJywgeyBFUFNJTE9OOiBNYXRoLnBvdygyLCAtNTIpIH0pO1xuIiwiLy8gMjAuMS4yLjIgTnVtYmVyLmlzRmluaXRlKG51bWJlcilcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgX2lzRmluaXRlID0gcmVxdWlyZSgnLi9fZ2xvYmFsJykuaXNGaW5pdGU7XG5cbiRleHBvcnQoJGV4cG9ydC5TLCAnTnVtYmVyJywge1xuICBpc0Zpbml0ZTogZnVuY3Rpb24gaXNGaW5pdGUoaXQpIHtcbiAgICByZXR1cm4gdHlwZW9mIGl0ID09ICdudW1iZXInICYmIF9pc0Zpbml0ZShpdCk7XG4gIH1cbn0pO1xuIiwiLy8gMjAuMS4yLjMgTnVtYmVyLmlzSW50ZWdlcihudW1iZXIpXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xuXG4kZXhwb3J0KCRleHBvcnQuUywgJ051bWJlcicsIHsgaXNJbnRlZ2VyOiByZXF1aXJlKCcuL19pcy1pbnRlZ2VyJykgfSk7XG4iLCIvLyAyMC4xLjIuNCBOdW1iZXIuaXNOYU4obnVtYmVyKVxudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcblxuJGV4cG9ydCgkZXhwb3J0LlMsICdOdW1iZXInLCB7XG4gIGlzTmFOOiBmdW5jdGlvbiBpc05hTihudW1iZXIpIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2VsZi1jb21wYXJlXG4gICAgcmV0dXJuIG51bWJlciAhPSBudW1iZXI7XG4gIH1cbn0pO1xuIiwiLy8gMjAuMS4yLjUgTnVtYmVyLmlzU2FmZUludGVnZXIobnVtYmVyKVxudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciBpc0ludGVnZXIgPSByZXF1aXJlKCcuL19pcy1pbnRlZ2VyJyk7XG52YXIgYWJzID0gTWF0aC5hYnM7XG5cbiRleHBvcnQoJGV4cG9ydC5TLCAnTnVtYmVyJywge1xuICBpc1NhZmVJbnRlZ2VyOiBmdW5jdGlvbiBpc1NhZmVJbnRlZ2VyKG51bWJlcikge1xuICAgIHJldHVybiBpc0ludGVnZXIobnVtYmVyKSAmJiBhYnMobnVtYmVyKSA8PSAweDFmZmZmZmZmZmZmZmZmO1xuICB9XG59KTtcbiIsIi8vIDIwLjEuMi42IE51bWJlci5NQVhfU0FGRV9JTlRFR0VSXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xuXG4kZXhwb3J0KCRleHBvcnQuUywgJ051bWJlcicsIHsgTUFYX1NBRkVfSU5URUdFUjogMHgxZmZmZmZmZmZmZmZmZiB9KTtcbiIsIi8vIDIwLjEuMi4xMCBOdW1iZXIuTUlOX1NBRkVfSU5URUdFUlxudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcblxuJGV4cG9ydCgkZXhwb3J0LlMsICdOdW1iZXInLCB7IE1JTl9TQUZFX0lOVEVHRVI6IC0weDFmZmZmZmZmZmZmZmZmIH0pO1xuIiwidmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciAkcGFyc2VGbG9hdCA9IHJlcXVpcmUoJy4vX3BhcnNlLWZsb2F0Jyk7XG4vLyAyMC4xLjIuMTIgTnVtYmVyLnBhcnNlRmxvYXQoc3RyaW5nKVxuJGV4cG9ydCgkZXhwb3J0LlMgKyAkZXhwb3J0LkYgKiAoTnVtYmVyLnBhcnNlRmxvYXQgIT0gJHBhcnNlRmxvYXQpLCAnTnVtYmVyJywgeyBwYXJzZUZsb2F0OiAkcGFyc2VGbG9hdCB9KTtcbiIsInZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgJHBhcnNlSW50ID0gcmVxdWlyZSgnLi9fcGFyc2UtaW50Jyk7XG4vLyAyMC4xLjIuMTMgTnVtYmVyLnBhcnNlSW50KHN0cmluZywgcmFkaXgpXG4kZXhwb3J0KCRleHBvcnQuUyArICRleHBvcnQuRiAqIChOdW1iZXIucGFyc2VJbnQgIT0gJHBhcnNlSW50KSwgJ051bWJlcicsIHsgcGFyc2VJbnQ6ICRwYXJzZUludCB9KTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgdG9JbnRlZ2VyID0gcmVxdWlyZSgnLi9fdG8taW50ZWdlcicpO1xudmFyIGFOdW1iZXJWYWx1ZSA9IHJlcXVpcmUoJy4vX2EtbnVtYmVyLXZhbHVlJyk7XG52YXIgcmVwZWF0ID0gcmVxdWlyZSgnLi9fc3RyaW5nLXJlcGVhdCcpO1xudmFyICR0b0ZpeGVkID0gMS4wLnRvRml4ZWQ7XG52YXIgZmxvb3IgPSBNYXRoLmZsb29yO1xudmFyIGRhdGEgPSBbMCwgMCwgMCwgMCwgMCwgMF07XG52YXIgRVJST1IgPSAnTnVtYmVyLnRvRml4ZWQ6IGluY29ycmVjdCBpbnZvY2F0aW9uISc7XG52YXIgWkVSTyA9ICcwJztcblxudmFyIG11bHRpcGx5ID0gZnVuY3Rpb24gKG4sIGMpIHtcbiAgdmFyIGkgPSAtMTtcbiAgdmFyIGMyID0gYztcbiAgd2hpbGUgKCsraSA8IDYpIHtcbiAgICBjMiArPSBuICogZGF0YVtpXTtcbiAgICBkYXRhW2ldID0gYzIgJSAxZTc7XG4gICAgYzIgPSBmbG9vcihjMiAvIDFlNyk7XG4gIH1cbn07XG52YXIgZGl2aWRlID0gZnVuY3Rpb24gKG4pIHtcbiAgdmFyIGkgPSA2O1xuICB2YXIgYyA9IDA7XG4gIHdoaWxlICgtLWkgPj0gMCkge1xuICAgIGMgKz0gZGF0YVtpXTtcbiAgICBkYXRhW2ldID0gZmxvb3IoYyAvIG4pO1xuICAgIGMgPSAoYyAlIG4pICogMWU3O1xuICB9XG59O1xudmFyIG51bVRvU3RyaW5nID0gZnVuY3Rpb24gKCkge1xuICB2YXIgaSA9IDY7XG4gIHZhciBzID0gJyc7XG4gIHdoaWxlICgtLWkgPj0gMCkge1xuICAgIGlmIChzICE9PSAnJyB8fCBpID09PSAwIHx8IGRhdGFbaV0gIT09IDApIHtcbiAgICAgIHZhciB0ID0gU3RyaW5nKGRhdGFbaV0pO1xuICAgICAgcyA9IHMgPT09ICcnID8gdCA6IHMgKyByZXBlYXQuY2FsbChaRVJPLCA3IC0gdC5sZW5ndGgpICsgdDtcbiAgICB9XG4gIH0gcmV0dXJuIHM7XG59O1xudmFyIHBvdyA9IGZ1bmN0aW9uICh4LCBuLCBhY2MpIHtcbiAgcmV0dXJuIG4gPT09IDAgPyBhY2MgOiBuICUgMiA9PT0gMSA/IHBvdyh4LCBuIC0gMSwgYWNjICogeCkgOiBwb3coeCAqIHgsIG4gLyAyLCBhY2MpO1xufTtcbnZhciBsb2cgPSBmdW5jdGlvbiAoeCkge1xuICB2YXIgbiA9IDA7XG4gIHZhciB4MiA9IHg7XG4gIHdoaWxlICh4MiA+PSA0MDk2KSB7XG4gICAgbiArPSAxMjtcbiAgICB4MiAvPSA0MDk2O1xuICB9XG4gIHdoaWxlICh4MiA+PSAyKSB7XG4gICAgbiArPSAxO1xuICAgIHgyIC89IDI7XG4gIH0gcmV0dXJuIG47XG59O1xuXG4kZXhwb3J0KCRleHBvcnQuUCArICRleHBvcnQuRiAqICghISR0b0ZpeGVkICYmIChcbiAgMC4wMDAwOC50b0ZpeGVkKDMpICE9PSAnMC4wMDAnIHx8XG4gIDAuOS50b0ZpeGVkKDApICE9PSAnMScgfHxcbiAgMS4yNTUudG9GaXhlZCgyKSAhPT0gJzEuMjUnIHx8XG4gIDEwMDAwMDAwMDAwMDAwMDAxMjguMC50b0ZpeGVkKDApICE9PSAnMTAwMDAwMDAwMDAwMDAwMDEyOCdcbikgfHwgIXJlcXVpcmUoJy4vX2ZhaWxzJykoZnVuY3Rpb24gKCkge1xuICAvLyBWOCB+IEFuZHJvaWQgNC4zLVxuICAkdG9GaXhlZC5jYWxsKHt9KTtcbn0pKSwgJ051bWJlcicsIHtcbiAgdG9GaXhlZDogZnVuY3Rpb24gdG9GaXhlZChmcmFjdGlvbkRpZ2l0cykge1xuICAgIHZhciB4ID0gYU51bWJlclZhbHVlKHRoaXMsIEVSUk9SKTtcbiAgICB2YXIgZiA9IHRvSW50ZWdlcihmcmFjdGlvbkRpZ2l0cyk7XG4gICAgdmFyIHMgPSAnJztcbiAgICB2YXIgbSA9IFpFUk87XG4gICAgdmFyIGUsIHosIGosIGs7XG4gICAgaWYgKGYgPCAwIHx8IGYgPiAyMCkgdGhyb3cgUmFuZ2VFcnJvcihFUlJPUik7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXNlbGYtY29tcGFyZVxuICAgIGlmICh4ICE9IHgpIHJldHVybiAnTmFOJztcbiAgICBpZiAoeCA8PSAtMWUyMSB8fCB4ID49IDFlMjEpIHJldHVybiBTdHJpbmcoeCk7XG4gICAgaWYgKHggPCAwKSB7XG4gICAgICBzID0gJy0nO1xuICAgICAgeCA9IC14O1xuICAgIH1cbiAgICBpZiAoeCA+IDFlLTIxKSB7XG4gICAgICBlID0gbG9nKHggKiBwb3coMiwgNjksIDEpKSAtIDY5O1xuICAgICAgeiA9IGUgPCAwID8geCAqIHBvdygyLCAtZSwgMSkgOiB4IC8gcG93KDIsIGUsIDEpO1xuICAgICAgeiAqPSAweDEwMDAwMDAwMDAwMDAwO1xuICAgICAgZSA9IDUyIC0gZTtcbiAgICAgIGlmIChlID4gMCkge1xuICAgICAgICBtdWx0aXBseSgwLCB6KTtcbiAgICAgICAgaiA9IGY7XG4gICAgICAgIHdoaWxlIChqID49IDcpIHtcbiAgICAgICAgICBtdWx0aXBseSgxZTcsIDApO1xuICAgICAgICAgIGogLT0gNztcbiAgICAgICAgfVxuICAgICAgICBtdWx0aXBseShwb3coMTAsIGosIDEpLCAwKTtcbiAgICAgICAgaiA9IGUgLSAxO1xuICAgICAgICB3aGlsZSAoaiA+PSAyMykge1xuICAgICAgICAgIGRpdmlkZSgxIDw8IDIzKTtcbiAgICAgICAgICBqIC09IDIzO1xuICAgICAgICB9XG4gICAgICAgIGRpdmlkZSgxIDw8IGopO1xuICAgICAgICBtdWx0aXBseSgxLCAxKTtcbiAgICAgICAgZGl2aWRlKDIpO1xuICAgICAgICBtID0gbnVtVG9TdHJpbmcoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG11bHRpcGx5KDAsIHopO1xuICAgICAgICBtdWx0aXBseSgxIDw8IC1lLCAwKTtcbiAgICAgICAgbSA9IG51bVRvU3RyaW5nKCkgKyByZXBlYXQuY2FsbChaRVJPLCBmKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGYgPiAwKSB7XG4gICAgICBrID0gbS5sZW5ndGg7XG4gICAgICBtID0gcyArIChrIDw9IGYgPyAnMC4nICsgcmVwZWF0LmNhbGwoWkVSTywgZiAtIGspICsgbSA6IG0uc2xpY2UoMCwgayAtIGYpICsgJy4nICsgbS5zbGljZShrIC0gZikpO1xuICAgIH0gZWxzZSB7XG4gICAgICBtID0gcyArIG07XG4gICAgfSByZXR1cm4gbTtcbiAgfVxufSk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyICRmYWlscyA9IHJlcXVpcmUoJy4vX2ZhaWxzJyk7XG52YXIgYU51bWJlclZhbHVlID0gcmVxdWlyZSgnLi9fYS1udW1iZXItdmFsdWUnKTtcbnZhciAkdG9QcmVjaXNpb24gPSAxLjAudG9QcmVjaXNpb247XG5cbiRleHBvcnQoJGV4cG9ydC5QICsgJGV4cG9ydC5GICogKCRmYWlscyhmdW5jdGlvbiAoKSB7XG4gIC8vIElFNy1cbiAgcmV0dXJuICR0b1ByZWNpc2lvbi5jYWxsKDEsIHVuZGVmaW5lZCkgIT09ICcxJztcbn0pIHx8ICEkZmFpbHMoZnVuY3Rpb24gKCkge1xuICAvLyBWOCB+IEFuZHJvaWQgNC4zLVxuICAkdG9QcmVjaXNpb24uY2FsbCh7fSk7XG59KSksICdOdW1iZXInLCB7XG4gIHRvUHJlY2lzaW9uOiBmdW5jdGlvbiB0b1ByZWNpc2lvbihwcmVjaXNpb24pIHtcbiAgICB2YXIgdGhhdCA9IGFOdW1iZXJWYWx1ZSh0aGlzLCAnTnVtYmVyI3RvUHJlY2lzaW9uOiBpbmNvcnJlY3QgaW52b2NhdGlvbiEnKTtcbiAgICByZXR1cm4gcHJlY2lzaW9uID09PSB1bmRlZmluZWQgPyAkdG9QcmVjaXNpb24uY2FsbCh0aGF0KSA6ICR0b1ByZWNpc2lvbi5jYWxsKHRoYXQsIHByZWNpc2lvbik7XG4gIH1cbn0pO1xuIiwiLy8gMTkuMS4zLjEgT2JqZWN0LmFzc2lnbih0YXJnZXQsIHNvdXJjZSlcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG5cbiRleHBvcnQoJGV4cG9ydC5TICsgJGV4cG9ydC5GLCAnT2JqZWN0JywgeyBhc3NpZ246IHJlcXVpcmUoJy4vX29iamVjdC1hc3NpZ24nKSB9KTtcbiIsInZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG4vLyAxOS4xLjIuMiAvIDE1LjIuMy41IE9iamVjdC5jcmVhdGUoTyBbLCBQcm9wZXJ0aWVzXSlcbiRleHBvcnQoJGV4cG9ydC5TLCAnT2JqZWN0JywgeyBjcmVhdGU6IHJlcXVpcmUoJy4vX29iamVjdC1jcmVhdGUnKSB9KTtcbiIsInZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG4vLyAxOS4xLjIuMyAvIDE1LjIuMy43IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKE8sIFByb3BlcnRpZXMpXG4kZXhwb3J0KCRleHBvcnQuUyArICRleHBvcnQuRiAqICFyZXF1aXJlKCcuL19kZXNjcmlwdG9ycycpLCAnT2JqZWN0JywgeyBkZWZpbmVQcm9wZXJ0aWVzOiByZXF1aXJlKCcuL19vYmplY3QtZHBzJykgfSk7XG4iLCJ2YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xuLy8gMTkuMS4yLjQgLyAxNS4yLjMuNiBPYmplY3QuZGVmaW5lUHJvcGVydHkoTywgUCwgQXR0cmlidXRlcylcbiRleHBvcnQoJGV4cG9ydC5TICsgJGV4cG9ydC5GICogIXJlcXVpcmUoJy4vX2Rlc2NyaXB0b3JzJyksICdPYmplY3QnLCB7IGRlZmluZVByb3BlcnR5OiByZXF1aXJlKCcuL19vYmplY3QtZHAnKS5mIH0pO1xuIiwiLy8gMTkuMS4yLjUgT2JqZWN0LmZyZWV6ZShPKVxudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9faXMtb2JqZWN0Jyk7XG52YXIgbWV0YSA9IHJlcXVpcmUoJy4vX21ldGEnKS5vbkZyZWV6ZTtcblxucmVxdWlyZSgnLi9fb2JqZWN0LXNhcCcpKCdmcmVlemUnLCBmdW5jdGlvbiAoJGZyZWV6ZSkge1xuICByZXR1cm4gZnVuY3Rpb24gZnJlZXplKGl0KSB7XG4gICAgcmV0dXJuICRmcmVlemUgJiYgaXNPYmplY3QoaXQpID8gJGZyZWV6ZShtZXRhKGl0KSkgOiBpdDtcbiAgfTtcbn0pO1xuIiwiLy8gMTkuMS4yLjYgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihPLCBQKVxudmFyIHRvSU9iamVjdCA9IHJlcXVpcmUoJy4vX3RvLWlvYmplY3QnKTtcbnZhciAkZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yID0gcmVxdWlyZSgnLi9fb2JqZWN0LWdvcGQnKS5mO1xuXG5yZXF1aXJlKCcuL19vYmplY3Qtc2FwJykoJ2dldE93blByb3BlcnR5RGVzY3JpcHRvcicsIGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIGdldE93blByb3BlcnR5RGVzY3JpcHRvcihpdCwga2V5KSB7XG4gICAgcmV0dXJuICRnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodG9JT2JqZWN0KGl0KSwga2V5KTtcbiAgfTtcbn0pO1xuIiwiLy8gMTkuMS4yLjcgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoTylcbnJlcXVpcmUoJy4vX29iamVjdC1zYXAnKSgnZ2V0T3duUHJvcGVydHlOYW1lcycsIGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHJlcXVpcmUoJy4vX29iamVjdC1nb3BuLWV4dCcpLmY7XG59KTtcbiIsIi8vIDE5LjEuMi45IE9iamVjdC5nZXRQcm90b3R5cGVPZihPKVxudmFyIHRvT2JqZWN0ID0gcmVxdWlyZSgnLi9fdG8tb2JqZWN0Jyk7XG52YXIgJGdldFByb3RvdHlwZU9mID0gcmVxdWlyZSgnLi9fb2JqZWN0LWdwbycpO1xuXG5yZXF1aXJlKCcuL19vYmplY3Qtc2FwJykoJ2dldFByb3RvdHlwZU9mJywgZnVuY3Rpb24gKCkge1xuICByZXR1cm4gZnVuY3Rpb24gZ2V0UHJvdG90eXBlT2YoaXQpIHtcbiAgICByZXR1cm4gJGdldFByb3RvdHlwZU9mKHRvT2JqZWN0KGl0KSk7XG4gIH07XG59KTtcbiIsIi8vIDE5LjEuMi4xMSBPYmplY3QuaXNFeHRlbnNpYmxlKE8pXG52YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuL19pcy1vYmplY3QnKTtcblxucmVxdWlyZSgnLi9fb2JqZWN0LXNhcCcpKCdpc0V4dGVuc2libGUnLCBmdW5jdGlvbiAoJGlzRXh0ZW5zaWJsZSkge1xuICByZXR1cm4gZnVuY3Rpb24gaXNFeHRlbnNpYmxlKGl0KSB7XG4gICAgcmV0dXJuIGlzT2JqZWN0KGl0KSA/ICRpc0V4dGVuc2libGUgPyAkaXNFeHRlbnNpYmxlKGl0KSA6IHRydWUgOiBmYWxzZTtcbiAgfTtcbn0pO1xuIiwiLy8gMTkuMS4yLjEyIE9iamVjdC5pc0Zyb3plbihPKVxudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9faXMtb2JqZWN0Jyk7XG5cbnJlcXVpcmUoJy4vX29iamVjdC1zYXAnKSgnaXNGcm96ZW4nLCBmdW5jdGlvbiAoJGlzRnJvemVuKSB7XG4gIHJldHVybiBmdW5jdGlvbiBpc0Zyb3plbihpdCkge1xuICAgIHJldHVybiBpc09iamVjdChpdCkgPyAkaXNGcm96ZW4gPyAkaXNGcm96ZW4oaXQpIDogZmFsc2UgOiB0cnVlO1xuICB9O1xufSk7XG4iLCIvLyAxOS4xLjIuMTMgT2JqZWN0LmlzU2VhbGVkKE8pXG52YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuL19pcy1vYmplY3QnKTtcblxucmVxdWlyZSgnLi9fb2JqZWN0LXNhcCcpKCdpc1NlYWxlZCcsIGZ1bmN0aW9uICgkaXNTZWFsZWQpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIGlzU2VhbGVkKGl0KSB7XG4gICAgcmV0dXJuIGlzT2JqZWN0KGl0KSA/ICRpc1NlYWxlZCA/ICRpc1NlYWxlZChpdCkgOiBmYWxzZSA6IHRydWU7XG4gIH07XG59KTtcbiIsIi8vIDE5LjEuMy4xMCBPYmplY3QuaXModmFsdWUxLCB2YWx1ZTIpXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xuJGV4cG9ydCgkZXhwb3J0LlMsICdPYmplY3QnLCB7IGlzOiByZXF1aXJlKCcuL19zYW1lLXZhbHVlJykgfSk7XG4iLCIvLyAxOS4xLjIuMTQgT2JqZWN0LmtleXMoTylcbnZhciB0b09iamVjdCA9IHJlcXVpcmUoJy4vX3RvLW9iamVjdCcpO1xudmFyICRrZXlzID0gcmVxdWlyZSgnLi9fb2JqZWN0LWtleXMnKTtcblxucmVxdWlyZSgnLi9fb2JqZWN0LXNhcCcpKCdrZXlzJywgZnVuY3Rpb24gKCkge1xuICByZXR1cm4gZnVuY3Rpb24ga2V5cyhpdCkge1xuICAgIHJldHVybiAka2V5cyh0b09iamVjdChpdCkpO1xuICB9O1xufSk7XG4iLCIvLyAxOS4xLjIuMTUgT2JqZWN0LnByZXZlbnRFeHRlbnNpb25zKE8pXG52YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuL19pcy1vYmplY3QnKTtcbnZhciBtZXRhID0gcmVxdWlyZSgnLi9fbWV0YScpLm9uRnJlZXplO1xuXG5yZXF1aXJlKCcuL19vYmplY3Qtc2FwJykoJ3ByZXZlbnRFeHRlbnNpb25zJywgZnVuY3Rpb24gKCRwcmV2ZW50RXh0ZW5zaW9ucykge1xuICByZXR1cm4gZnVuY3Rpb24gcHJldmVudEV4dGVuc2lvbnMoaXQpIHtcbiAgICByZXR1cm4gJHByZXZlbnRFeHRlbnNpb25zICYmIGlzT2JqZWN0KGl0KSA/ICRwcmV2ZW50RXh0ZW5zaW9ucyhtZXRhKGl0KSkgOiBpdDtcbiAgfTtcbn0pO1xuIiwiLy8gMTkuMS4yLjE3IE9iamVjdC5zZWFsKE8pXG52YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuL19pcy1vYmplY3QnKTtcbnZhciBtZXRhID0gcmVxdWlyZSgnLi9fbWV0YScpLm9uRnJlZXplO1xuXG5yZXF1aXJlKCcuL19vYmplY3Qtc2FwJykoJ3NlYWwnLCBmdW5jdGlvbiAoJHNlYWwpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIHNlYWwoaXQpIHtcbiAgICByZXR1cm4gJHNlYWwgJiYgaXNPYmplY3QoaXQpID8gJHNlYWwobWV0YShpdCkpIDogaXQ7XG4gIH07XG59KTtcbiIsIi8vIDE5LjEuMy4xOSBPYmplY3Quc2V0UHJvdG90eXBlT2YoTywgcHJvdG8pXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xuJGV4cG9ydCgkZXhwb3J0LlMsICdPYmplY3QnLCB7IHNldFByb3RvdHlwZU9mOiByZXF1aXJlKCcuL19zZXQtcHJvdG8nKS5zZXQgfSk7XG4iLCIndXNlIHN0cmljdCc7XG4vLyAxOS4xLjMuNiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nKClcbnZhciBjbGFzc29mID0gcmVxdWlyZSgnLi9fY2xhc3NvZicpO1xudmFyIHRlc3QgPSB7fTtcbnRlc3RbcmVxdWlyZSgnLi9fd2tzJykoJ3RvU3RyaW5nVGFnJyldID0gJ3onO1xuaWYgKHRlc3QgKyAnJyAhPSAnW29iamVjdCB6XScpIHtcbiAgcmVxdWlyZSgnLi9fcmVkZWZpbmUnKShPYmplY3QucHJvdG90eXBlLCAndG9TdHJpbmcnLCBmdW5jdGlvbiB0b1N0cmluZygpIHtcbiAgICByZXR1cm4gJ1tvYmplY3QgJyArIGNsYXNzb2YodGhpcykgKyAnXSc7XG4gIH0sIHRydWUpO1xufVxuIiwidmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciAkcGFyc2VGbG9hdCA9IHJlcXVpcmUoJy4vX3BhcnNlLWZsb2F0Jyk7XG4vLyAxOC4yLjQgcGFyc2VGbG9hdChzdHJpbmcpXG4kZXhwb3J0KCRleHBvcnQuRyArICRleHBvcnQuRiAqIChwYXJzZUZsb2F0ICE9ICRwYXJzZUZsb2F0KSwgeyBwYXJzZUZsb2F0OiAkcGFyc2VGbG9hdCB9KTtcbiIsInZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgJHBhcnNlSW50ID0gcmVxdWlyZSgnLi9fcGFyc2UtaW50Jyk7XG4vLyAxOC4yLjUgcGFyc2VJbnQoc3RyaW5nLCByYWRpeClcbiRleHBvcnQoJGV4cG9ydC5HICsgJGV4cG9ydC5GICogKHBhcnNlSW50ICE9ICRwYXJzZUludCksIHsgcGFyc2VJbnQ6ICRwYXJzZUludCB9KTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBMSUJSQVJZID0gcmVxdWlyZSgnLi9fbGlicmFyeScpO1xudmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4vX2dsb2JhbCcpO1xudmFyIGN0eCA9IHJlcXVpcmUoJy4vX2N0eCcpO1xudmFyIGNsYXNzb2YgPSByZXF1aXJlKCcuL19jbGFzc29mJyk7XG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9faXMtb2JqZWN0Jyk7XG52YXIgYUZ1bmN0aW9uID0gcmVxdWlyZSgnLi9fYS1mdW5jdGlvbicpO1xudmFyIGFuSW5zdGFuY2UgPSByZXF1aXJlKCcuL19hbi1pbnN0YW5jZScpO1xudmFyIGZvck9mID0gcmVxdWlyZSgnLi9fZm9yLW9mJyk7XG52YXIgc3BlY2llc0NvbnN0cnVjdG9yID0gcmVxdWlyZSgnLi9fc3BlY2llcy1jb25zdHJ1Y3RvcicpO1xudmFyIHRhc2sgPSByZXF1aXJlKCcuL190YXNrJykuc2V0O1xudmFyIG1pY3JvdGFzayA9IHJlcXVpcmUoJy4vX21pY3JvdGFzaycpKCk7XG52YXIgbmV3UHJvbWlzZUNhcGFiaWxpdHlNb2R1bGUgPSByZXF1aXJlKCcuL19uZXctcHJvbWlzZS1jYXBhYmlsaXR5Jyk7XG52YXIgcGVyZm9ybSA9IHJlcXVpcmUoJy4vX3BlcmZvcm0nKTtcbnZhciBwcm9taXNlUmVzb2x2ZSA9IHJlcXVpcmUoJy4vX3Byb21pc2UtcmVzb2x2ZScpO1xudmFyIFBST01JU0UgPSAnUHJvbWlzZSc7XG52YXIgVHlwZUVycm9yID0gZ2xvYmFsLlR5cGVFcnJvcjtcbnZhciBwcm9jZXNzID0gZ2xvYmFsLnByb2Nlc3M7XG52YXIgJFByb21pc2UgPSBnbG9iYWxbUFJPTUlTRV07XG52YXIgaXNOb2RlID0gY2xhc3NvZihwcm9jZXNzKSA9PSAncHJvY2Vzcyc7XG52YXIgZW1wdHkgPSBmdW5jdGlvbiAoKSB7IC8qIGVtcHR5ICovIH07XG52YXIgSW50ZXJuYWwsIG5ld0dlbmVyaWNQcm9taXNlQ2FwYWJpbGl0eSwgT3duUHJvbWlzZUNhcGFiaWxpdHksIFdyYXBwZXI7XG52YXIgbmV3UHJvbWlzZUNhcGFiaWxpdHkgPSBuZXdHZW5lcmljUHJvbWlzZUNhcGFiaWxpdHkgPSBuZXdQcm9taXNlQ2FwYWJpbGl0eU1vZHVsZS5mO1xuXG52YXIgVVNFX05BVElWRSA9ICEhZnVuY3Rpb24gKCkge1xuICB0cnkge1xuICAgIC8vIGNvcnJlY3Qgc3ViY2xhc3Npbmcgd2l0aCBAQHNwZWNpZXMgc3VwcG9ydFxuICAgIHZhciBwcm9taXNlID0gJFByb21pc2UucmVzb2x2ZSgxKTtcbiAgICB2YXIgRmFrZVByb21pc2UgPSAocHJvbWlzZS5jb25zdHJ1Y3RvciA9IHt9KVtyZXF1aXJlKCcuL193a3MnKSgnc3BlY2llcycpXSA9IGZ1bmN0aW9uIChleGVjKSB7XG4gICAgICBleGVjKGVtcHR5LCBlbXB0eSk7XG4gICAgfTtcbiAgICAvLyB1bmhhbmRsZWQgcmVqZWN0aW9ucyB0cmFja2luZyBzdXBwb3J0LCBOb2RlSlMgUHJvbWlzZSB3aXRob3V0IGl0IGZhaWxzIEBAc3BlY2llcyB0ZXN0XG4gICAgcmV0dXJuIChpc05vZGUgfHwgdHlwZW9mIFByb21pc2VSZWplY3Rpb25FdmVudCA9PSAnZnVuY3Rpb24nKSAmJiBwcm9taXNlLnRoZW4oZW1wdHkpIGluc3RhbmNlb2YgRmFrZVByb21pc2U7XG4gIH0gY2F0Y2ggKGUpIHsgLyogZW1wdHkgKi8gfVxufSgpO1xuXG4vLyBoZWxwZXJzXG52YXIgaXNUaGVuYWJsZSA9IGZ1bmN0aW9uIChpdCkge1xuICB2YXIgdGhlbjtcbiAgcmV0dXJuIGlzT2JqZWN0KGl0KSAmJiB0eXBlb2YgKHRoZW4gPSBpdC50aGVuKSA9PSAnZnVuY3Rpb24nID8gdGhlbiA6IGZhbHNlO1xufTtcbnZhciBub3RpZnkgPSBmdW5jdGlvbiAocHJvbWlzZSwgaXNSZWplY3QpIHtcbiAgaWYgKHByb21pc2UuX24pIHJldHVybjtcbiAgcHJvbWlzZS5fbiA9IHRydWU7XG4gIHZhciBjaGFpbiA9IHByb21pc2UuX2M7XG4gIG1pY3JvdGFzayhmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHZhbHVlID0gcHJvbWlzZS5fdjtcbiAgICB2YXIgb2sgPSBwcm9taXNlLl9zID09IDE7XG4gICAgdmFyIGkgPSAwO1xuICAgIHZhciBydW4gPSBmdW5jdGlvbiAocmVhY3Rpb24pIHtcbiAgICAgIHZhciBoYW5kbGVyID0gb2sgPyByZWFjdGlvbi5vayA6IHJlYWN0aW9uLmZhaWw7XG4gICAgICB2YXIgcmVzb2x2ZSA9IHJlYWN0aW9uLnJlc29sdmU7XG4gICAgICB2YXIgcmVqZWN0ID0gcmVhY3Rpb24ucmVqZWN0O1xuICAgICAgdmFyIGRvbWFpbiA9IHJlYWN0aW9uLmRvbWFpbjtcbiAgICAgIHZhciByZXN1bHQsIHRoZW47XG4gICAgICB0cnkge1xuICAgICAgICBpZiAoaGFuZGxlcikge1xuICAgICAgICAgIGlmICghb2spIHtcbiAgICAgICAgICAgIGlmIChwcm9taXNlLl9oID09IDIpIG9uSGFuZGxlVW5oYW5kbGVkKHByb21pc2UpO1xuICAgICAgICAgICAgcHJvbWlzZS5faCA9IDE7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChoYW5kbGVyID09PSB0cnVlKSByZXN1bHQgPSB2YWx1ZTtcbiAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGlmIChkb21haW4pIGRvbWFpbi5lbnRlcigpO1xuICAgICAgICAgICAgcmVzdWx0ID0gaGFuZGxlcih2YWx1ZSk7XG4gICAgICAgICAgICBpZiAoZG9tYWluKSBkb21haW4uZXhpdCgpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAocmVzdWx0ID09PSByZWFjdGlvbi5wcm9taXNlKSB7XG4gICAgICAgICAgICByZWplY3QoVHlwZUVycm9yKCdQcm9taXNlLWNoYWluIGN5Y2xlJykpO1xuICAgICAgICAgIH0gZWxzZSBpZiAodGhlbiA9IGlzVGhlbmFibGUocmVzdWx0KSkge1xuICAgICAgICAgICAgdGhlbi5jYWxsKHJlc3VsdCwgcmVzb2x2ZSwgcmVqZWN0KTtcbiAgICAgICAgICB9IGVsc2UgcmVzb2x2ZShyZXN1bHQpO1xuICAgICAgICB9IGVsc2UgcmVqZWN0KHZhbHVlKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgcmVqZWN0KGUpO1xuICAgICAgfVxuICAgIH07XG4gICAgd2hpbGUgKGNoYWluLmxlbmd0aCA+IGkpIHJ1bihjaGFpbltpKytdKTsgLy8gdmFyaWFibGUgbGVuZ3RoIC0gY2FuJ3QgdXNlIGZvckVhY2hcbiAgICBwcm9taXNlLl9jID0gW107XG4gICAgcHJvbWlzZS5fbiA9IGZhbHNlO1xuICAgIGlmIChpc1JlamVjdCAmJiAhcHJvbWlzZS5faCkgb25VbmhhbmRsZWQocHJvbWlzZSk7XG4gIH0pO1xufTtcbnZhciBvblVuaGFuZGxlZCA9IGZ1bmN0aW9uIChwcm9taXNlKSB7XG4gIHRhc2suY2FsbChnbG9iYWwsIGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgdmFsdWUgPSBwcm9taXNlLl92O1xuICAgIHZhciB1bmhhbmRsZWQgPSBpc1VuaGFuZGxlZChwcm9taXNlKTtcbiAgICB2YXIgcmVzdWx0LCBoYW5kbGVyLCBjb25zb2xlO1xuICAgIGlmICh1bmhhbmRsZWQpIHtcbiAgICAgIHJlc3VsdCA9IHBlcmZvcm0oZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoaXNOb2RlKSB7XG4gICAgICAgICAgcHJvY2Vzcy5lbWl0KCd1bmhhbmRsZWRSZWplY3Rpb24nLCB2YWx1ZSwgcHJvbWlzZSk7XG4gICAgICAgIH0gZWxzZSBpZiAoaGFuZGxlciA9IGdsb2JhbC5vbnVuaGFuZGxlZHJlamVjdGlvbikge1xuICAgICAgICAgIGhhbmRsZXIoeyBwcm9taXNlOiBwcm9taXNlLCByZWFzb246IHZhbHVlIH0pO1xuICAgICAgICB9IGVsc2UgaWYgKChjb25zb2xlID0gZ2xvYmFsLmNvbnNvbGUpICYmIGNvbnNvbGUuZXJyb3IpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCdVbmhhbmRsZWQgcHJvbWlzZSByZWplY3Rpb24nLCB2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgLy8gQnJvd3NlcnMgc2hvdWxkIG5vdCB0cmlnZ2VyIGByZWplY3Rpb25IYW5kbGVkYCBldmVudCBpZiBpdCB3YXMgaGFuZGxlZCBoZXJlLCBOb2RlSlMgLSBzaG91bGRcbiAgICAgIHByb21pc2UuX2ggPSBpc05vZGUgfHwgaXNVbmhhbmRsZWQocHJvbWlzZSkgPyAyIDogMTtcbiAgICB9IHByb21pc2UuX2EgPSB1bmRlZmluZWQ7XG4gICAgaWYgKHVuaGFuZGxlZCAmJiByZXN1bHQuZSkgdGhyb3cgcmVzdWx0LnY7XG4gIH0pO1xufTtcbnZhciBpc1VuaGFuZGxlZCA9IGZ1bmN0aW9uIChwcm9taXNlKSB7XG4gIHJldHVybiBwcm9taXNlLl9oICE9PSAxICYmIChwcm9taXNlLl9hIHx8IHByb21pc2UuX2MpLmxlbmd0aCA9PT0gMDtcbn07XG52YXIgb25IYW5kbGVVbmhhbmRsZWQgPSBmdW5jdGlvbiAocHJvbWlzZSkge1xuICB0YXNrLmNhbGwoZ2xvYmFsLCBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGhhbmRsZXI7XG4gICAgaWYgKGlzTm9kZSkge1xuICAgICAgcHJvY2Vzcy5lbWl0KCdyZWplY3Rpb25IYW5kbGVkJywgcHJvbWlzZSk7XG4gICAgfSBlbHNlIGlmIChoYW5kbGVyID0gZ2xvYmFsLm9ucmVqZWN0aW9uaGFuZGxlZCkge1xuICAgICAgaGFuZGxlcih7IHByb21pc2U6IHByb21pc2UsIHJlYXNvbjogcHJvbWlzZS5fdiB9KTtcbiAgICB9XG4gIH0pO1xufTtcbnZhciAkcmVqZWN0ID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gIHZhciBwcm9taXNlID0gdGhpcztcbiAgaWYgKHByb21pc2UuX2QpIHJldHVybjtcbiAgcHJvbWlzZS5fZCA9IHRydWU7XG4gIHByb21pc2UgPSBwcm9taXNlLl93IHx8IHByb21pc2U7IC8vIHVud3JhcFxuICBwcm9taXNlLl92ID0gdmFsdWU7XG4gIHByb21pc2UuX3MgPSAyO1xuICBpZiAoIXByb21pc2UuX2EpIHByb21pc2UuX2EgPSBwcm9taXNlLl9jLnNsaWNlKCk7XG4gIG5vdGlmeShwcm9taXNlLCB0cnVlKTtcbn07XG52YXIgJHJlc29sdmUgPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgdmFyIHByb21pc2UgPSB0aGlzO1xuICB2YXIgdGhlbjtcbiAgaWYgKHByb21pc2UuX2QpIHJldHVybjtcbiAgcHJvbWlzZS5fZCA9IHRydWU7XG4gIHByb21pc2UgPSBwcm9taXNlLl93IHx8IHByb21pc2U7IC8vIHVud3JhcFxuICB0cnkge1xuICAgIGlmIChwcm9taXNlID09PSB2YWx1ZSkgdGhyb3cgVHlwZUVycm9yKFwiUHJvbWlzZSBjYW4ndCBiZSByZXNvbHZlZCBpdHNlbGZcIik7XG4gICAgaWYgKHRoZW4gPSBpc1RoZW5hYmxlKHZhbHVlKSkge1xuICAgICAgbWljcm90YXNrKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHdyYXBwZXIgPSB7IF93OiBwcm9taXNlLCBfZDogZmFsc2UgfTsgLy8gd3JhcFxuICAgICAgICB0cnkge1xuICAgICAgICAgIHRoZW4uY2FsbCh2YWx1ZSwgY3R4KCRyZXNvbHZlLCB3cmFwcGVyLCAxKSwgY3R4KCRyZWplY3QsIHdyYXBwZXIsIDEpKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICRyZWplY3QuY2FsbCh3cmFwcGVyLCBlKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHByb21pc2UuX3YgPSB2YWx1ZTtcbiAgICAgIHByb21pc2UuX3MgPSAxO1xuICAgICAgbm90aWZ5KHByb21pc2UsIGZhbHNlKTtcbiAgICB9XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICAkcmVqZWN0LmNhbGwoeyBfdzogcHJvbWlzZSwgX2Q6IGZhbHNlIH0sIGUpOyAvLyB3cmFwXG4gIH1cbn07XG5cbi8vIGNvbnN0cnVjdG9yIHBvbHlmaWxsXG5pZiAoIVVTRV9OQVRJVkUpIHtcbiAgLy8gMjUuNC4zLjEgUHJvbWlzZShleGVjdXRvcilcbiAgJFByb21pc2UgPSBmdW5jdGlvbiBQcm9taXNlKGV4ZWN1dG9yKSB7XG4gICAgYW5JbnN0YW5jZSh0aGlzLCAkUHJvbWlzZSwgUFJPTUlTRSwgJ19oJyk7XG4gICAgYUZ1bmN0aW9uKGV4ZWN1dG9yKTtcbiAgICBJbnRlcm5hbC5jYWxsKHRoaXMpO1xuICAgIHRyeSB7XG4gICAgICBleGVjdXRvcihjdHgoJHJlc29sdmUsIHRoaXMsIDEpLCBjdHgoJHJlamVjdCwgdGhpcywgMSkpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgJHJlamVjdC5jYWxsKHRoaXMsIGVycik7XG4gICAgfVxuICB9O1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW51c2VkLXZhcnNcbiAgSW50ZXJuYWwgPSBmdW5jdGlvbiBQcm9taXNlKGV4ZWN1dG9yKSB7XG4gICAgdGhpcy5fYyA9IFtdOyAgICAgICAgICAgICAvLyA8LSBhd2FpdGluZyByZWFjdGlvbnNcbiAgICB0aGlzLl9hID0gdW5kZWZpbmVkOyAgICAgIC8vIDwtIGNoZWNrZWQgaW4gaXNVbmhhbmRsZWQgcmVhY3Rpb25zXG4gICAgdGhpcy5fcyA9IDA7ICAgICAgICAgICAgICAvLyA8LSBzdGF0ZVxuICAgIHRoaXMuX2QgPSBmYWxzZTsgICAgICAgICAgLy8gPC0gZG9uZVxuICAgIHRoaXMuX3YgPSB1bmRlZmluZWQ7ICAgICAgLy8gPC0gdmFsdWVcbiAgICB0aGlzLl9oID0gMDsgICAgICAgICAgICAgIC8vIDwtIHJlamVjdGlvbiBzdGF0ZSwgMCAtIGRlZmF1bHQsIDEgLSBoYW5kbGVkLCAyIC0gdW5oYW5kbGVkXG4gICAgdGhpcy5fbiA9IGZhbHNlOyAgICAgICAgICAvLyA8LSBub3RpZnlcbiAgfTtcbiAgSW50ZXJuYWwucHJvdG90eXBlID0gcmVxdWlyZSgnLi9fcmVkZWZpbmUtYWxsJykoJFByb21pc2UucHJvdG90eXBlLCB7XG4gICAgLy8gMjUuNC41LjMgUHJvbWlzZS5wcm90b3R5cGUudGhlbihvbkZ1bGZpbGxlZCwgb25SZWplY3RlZClcbiAgICB0aGVuOiBmdW5jdGlvbiB0aGVuKG9uRnVsZmlsbGVkLCBvblJlamVjdGVkKSB7XG4gICAgICB2YXIgcmVhY3Rpb24gPSBuZXdQcm9taXNlQ2FwYWJpbGl0eShzcGVjaWVzQ29uc3RydWN0b3IodGhpcywgJFByb21pc2UpKTtcbiAgICAgIHJlYWN0aW9uLm9rID0gdHlwZW9mIG9uRnVsZmlsbGVkID09ICdmdW5jdGlvbicgPyBvbkZ1bGZpbGxlZCA6IHRydWU7XG4gICAgICByZWFjdGlvbi5mYWlsID0gdHlwZW9mIG9uUmVqZWN0ZWQgPT0gJ2Z1bmN0aW9uJyAmJiBvblJlamVjdGVkO1xuICAgICAgcmVhY3Rpb24uZG9tYWluID0gaXNOb2RlID8gcHJvY2Vzcy5kb21haW4gOiB1bmRlZmluZWQ7XG4gICAgICB0aGlzLl9jLnB1c2gocmVhY3Rpb24pO1xuICAgICAgaWYgKHRoaXMuX2EpIHRoaXMuX2EucHVzaChyZWFjdGlvbik7XG4gICAgICBpZiAodGhpcy5fcykgbm90aWZ5KHRoaXMsIGZhbHNlKTtcbiAgICAgIHJldHVybiByZWFjdGlvbi5wcm9taXNlO1xuICAgIH0sXG4gICAgLy8gMjUuNC41LjEgUHJvbWlzZS5wcm90b3R5cGUuY2F0Y2gob25SZWplY3RlZClcbiAgICAnY2F0Y2gnOiBmdW5jdGlvbiAob25SZWplY3RlZCkge1xuICAgICAgcmV0dXJuIHRoaXMudGhlbih1bmRlZmluZWQsIG9uUmVqZWN0ZWQpO1xuICAgIH1cbiAgfSk7XG4gIE93blByb21pc2VDYXBhYmlsaXR5ID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciBwcm9taXNlID0gbmV3IEludGVybmFsKCk7XG4gICAgdGhpcy5wcm9taXNlID0gcHJvbWlzZTtcbiAgICB0aGlzLnJlc29sdmUgPSBjdHgoJHJlc29sdmUsIHByb21pc2UsIDEpO1xuICAgIHRoaXMucmVqZWN0ID0gY3R4KCRyZWplY3QsIHByb21pc2UsIDEpO1xuICB9O1xuICBuZXdQcm9taXNlQ2FwYWJpbGl0eU1vZHVsZS5mID0gbmV3UHJvbWlzZUNhcGFiaWxpdHkgPSBmdW5jdGlvbiAoQykge1xuICAgIHJldHVybiBDID09PSAkUHJvbWlzZSB8fCBDID09PSBXcmFwcGVyXG4gICAgICA/IG5ldyBPd25Qcm9taXNlQ2FwYWJpbGl0eShDKVxuICAgICAgOiBuZXdHZW5lcmljUHJvbWlzZUNhcGFiaWxpdHkoQyk7XG4gIH07XG59XG5cbiRleHBvcnQoJGV4cG9ydC5HICsgJGV4cG9ydC5XICsgJGV4cG9ydC5GICogIVVTRV9OQVRJVkUsIHsgUHJvbWlzZTogJFByb21pc2UgfSk7XG5yZXF1aXJlKCcuL19zZXQtdG8tc3RyaW5nLXRhZycpKCRQcm9taXNlLCBQUk9NSVNFKTtcbnJlcXVpcmUoJy4vX3NldC1zcGVjaWVzJykoUFJPTUlTRSk7XG5XcmFwcGVyID0gcmVxdWlyZSgnLi9fY29yZScpW1BST01JU0VdO1xuXG4vLyBzdGF0aWNzXG4kZXhwb3J0KCRleHBvcnQuUyArICRleHBvcnQuRiAqICFVU0VfTkFUSVZFLCBQUk9NSVNFLCB7XG4gIC8vIDI1LjQuNC41IFByb21pc2UucmVqZWN0KHIpXG4gIHJlamVjdDogZnVuY3Rpb24gcmVqZWN0KHIpIHtcbiAgICB2YXIgY2FwYWJpbGl0eSA9IG5ld1Byb21pc2VDYXBhYmlsaXR5KHRoaXMpO1xuICAgIHZhciAkJHJlamVjdCA9IGNhcGFiaWxpdHkucmVqZWN0O1xuICAgICQkcmVqZWN0KHIpO1xuICAgIHJldHVybiBjYXBhYmlsaXR5LnByb21pc2U7XG4gIH1cbn0pO1xuJGV4cG9ydCgkZXhwb3J0LlMgKyAkZXhwb3J0LkYgKiAoTElCUkFSWSB8fCAhVVNFX05BVElWRSksIFBST01JU0UsIHtcbiAgLy8gMjUuNC40LjYgUHJvbWlzZS5yZXNvbHZlKHgpXG4gIHJlc29sdmU6IGZ1bmN0aW9uIHJlc29sdmUoeCkge1xuICAgIHJldHVybiBwcm9taXNlUmVzb2x2ZShMSUJSQVJZICYmIHRoaXMgPT09IFdyYXBwZXIgPyAkUHJvbWlzZSA6IHRoaXMsIHgpO1xuICB9XG59KTtcbiRleHBvcnQoJGV4cG9ydC5TICsgJGV4cG9ydC5GICogIShVU0VfTkFUSVZFICYmIHJlcXVpcmUoJy4vX2l0ZXItZGV0ZWN0JykoZnVuY3Rpb24gKGl0ZXIpIHtcbiAgJFByb21pc2UuYWxsKGl0ZXIpWydjYXRjaCddKGVtcHR5KTtcbn0pKSwgUFJPTUlTRSwge1xuICAvLyAyNS40LjQuMSBQcm9taXNlLmFsbChpdGVyYWJsZSlcbiAgYWxsOiBmdW5jdGlvbiBhbGwoaXRlcmFibGUpIHtcbiAgICB2YXIgQyA9IHRoaXM7XG4gICAgdmFyIGNhcGFiaWxpdHkgPSBuZXdQcm9taXNlQ2FwYWJpbGl0eShDKTtcbiAgICB2YXIgcmVzb2x2ZSA9IGNhcGFiaWxpdHkucmVzb2x2ZTtcbiAgICB2YXIgcmVqZWN0ID0gY2FwYWJpbGl0eS5yZWplY3Q7XG4gICAgdmFyIHJlc3VsdCA9IHBlcmZvcm0oZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIHZhbHVlcyA9IFtdO1xuICAgICAgdmFyIGluZGV4ID0gMDtcbiAgICAgIHZhciByZW1haW5pbmcgPSAxO1xuICAgICAgZm9yT2YoaXRlcmFibGUsIGZhbHNlLCBmdW5jdGlvbiAocHJvbWlzZSkge1xuICAgICAgICB2YXIgJGluZGV4ID0gaW5kZXgrKztcbiAgICAgICAgdmFyIGFscmVhZHlDYWxsZWQgPSBmYWxzZTtcbiAgICAgICAgdmFsdWVzLnB1c2godW5kZWZpbmVkKTtcbiAgICAgICAgcmVtYWluaW5nKys7XG4gICAgICAgIEMucmVzb2x2ZShwcm9taXNlKS50aGVuKGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgIGlmIChhbHJlYWR5Q2FsbGVkKSByZXR1cm47XG4gICAgICAgICAgYWxyZWFkeUNhbGxlZCA9IHRydWU7XG4gICAgICAgICAgdmFsdWVzWyRpbmRleF0gPSB2YWx1ZTtcbiAgICAgICAgICAtLXJlbWFpbmluZyB8fCByZXNvbHZlKHZhbHVlcyk7XG4gICAgICAgIH0sIHJlamVjdCk7XG4gICAgICB9KTtcbiAgICAgIC0tcmVtYWluaW5nIHx8IHJlc29sdmUodmFsdWVzKTtcbiAgICB9KTtcbiAgICBpZiAocmVzdWx0LmUpIHJlamVjdChyZXN1bHQudik7XG4gICAgcmV0dXJuIGNhcGFiaWxpdHkucHJvbWlzZTtcbiAgfSxcbiAgLy8gMjUuNC40LjQgUHJvbWlzZS5yYWNlKGl0ZXJhYmxlKVxuICByYWNlOiBmdW5jdGlvbiByYWNlKGl0ZXJhYmxlKSB7XG4gICAgdmFyIEMgPSB0aGlzO1xuICAgIHZhciBjYXBhYmlsaXR5ID0gbmV3UHJvbWlzZUNhcGFiaWxpdHkoQyk7XG4gICAgdmFyIHJlamVjdCA9IGNhcGFiaWxpdHkucmVqZWN0O1xuICAgIHZhciByZXN1bHQgPSBwZXJmb3JtKGZ1bmN0aW9uICgpIHtcbiAgICAgIGZvck9mKGl0ZXJhYmxlLCBmYWxzZSwgZnVuY3Rpb24gKHByb21pc2UpIHtcbiAgICAgICAgQy5yZXNvbHZlKHByb21pc2UpLnRoZW4oY2FwYWJpbGl0eS5yZXNvbHZlLCByZWplY3QpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gICAgaWYgKHJlc3VsdC5lKSByZWplY3QocmVzdWx0LnYpO1xuICAgIHJldHVybiBjYXBhYmlsaXR5LnByb21pc2U7XG4gIH1cbn0pO1xuIiwiLy8gMjYuMS4xIFJlZmxlY3QuYXBwbHkodGFyZ2V0LCB0aGlzQXJndW1lbnQsIGFyZ3VtZW50c0xpc3QpXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyIGFGdW5jdGlvbiA9IHJlcXVpcmUoJy4vX2EtZnVuY3Rpb24nKTtcbnZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4vX2FuLW9iamVjdCcpO1xudmFyIHJBcHBseSA9IChyZXF1aXJlKCcuL19nbG9iYWwnKS5SZWZsZWN0IHx8IHt9KS5hcHBseTtcbnZhciBmQXBwbHkgPSBGdW5jdGlvbi5hcHBseTtcbi8vIE1TIEVkZ2UgYXJndW1lbnRzTGlzdCBhcmd1bWVudCBpcyBvcHRpb25hbFxuJGV4cG9ydCgkZXhwb3J0LlMgKyAkZXhwb3J0LkYgKiAhcmVxdWlyZSgnLi9fZmFpbHMnKShmdW5jdGlvbiAoKSB7XG4gIHJBcHBseShmdW5jdGlvbiAoKSB7IC8qIGVtcHR5ICovIH0pO1xufSksICdSZWZsZWN0Jywge1xuICBhcHBseTogZnVuY3Rpb24gYXBwbHkodGFyZ2V0LCB0aGlzQXJndW1lbnQsIGFyZ3VtZW50c0xpc3QpIHtcbiAgICB2YXIgVCA9IGFGdW5jdGlvbih0YXJnZXQpO1xuICAgIHZhciBMID0gYW5PYmplY3QoYXJndW1lbnRzTGlzdCk7XG4gICAgcmV0dXJuIHJBcHBseSA/IHJBcHBseShULCB0aGlzQXJndW1lbnQsIEwpIDogZkFwcGx5LmNhbGwoVCwgdGhpc0FyZ3VtZW50LCBMKTtcbiAgfVxufSk7XG4iLCIvLyAyNi4xLjIgUmVmbGVjdC5jb25zdHJ1Y3QodGFyZ2V0LCBhcmd1bWVudHNMaXN0IFssIG5ld1RhcmdldF0pXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyIGNyZWF0ZSA9IHJlcXVpcmUoJy4vX29iamVjdC1jcmVhdGUnKTtcbnZhciBhRnVuY3Rpb24gPSByZXF1aXJlKCcuL19hLWZ1bmN0aW9uJyk7XG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuL19hbi1vYmplY3QnKTtcbnZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4vX2lzLW9iamVjdCcpO1xudmFyIGZhaWxzID0gcmVxdWlyZSgnLi9fZmFpbHMnKTtcbnZhciBiaW5kID0gcmVxdWlyZSgnLi9fYmluZCcpO1xudmFyIHJDb25zdHJ1Y3QgPSAocmVxdWlyZSgnLi9fZ2xvYmFsJykuUmVmbGVjdCB8fCB7fSkuY29uc3RydWN0O1xuXG4vLyBNUyBFZGdlIHN1cHBvcnRzIG9ubHkgMiBhcmd1bWVudHMgYW5kIGFyZ3VtZW50c0xpc3QgYXJndW1lbnQgaXMgb3B0aW9uYWxcbi8vIEZGIE5pZ2h0bHkgc2V0cyB0aGlyZCBhcmd1bWVudCBhcyBgbmV3LnRhcmdldGAsIGJ1dCBkb2VzIG5vdCBjcmVhdGUgYHRoaXNgIGZyb20gaXRcbnZhciBORVdfVEFSR0VUX0JVRyA9IGZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gRigpIHsgLyogZW1wdHkgKi8gfVxuICByZXR1cm4gIShyQ29uc3RydWN0KGZ1bmN0aW9uICgpIHsgLyogZW1wdHkgKi8gfSwgW10sIEYpIGluc3RhbmNlb2YgRik7XG59KTtcbnZhciBBUkdTX0JVRyA9ICFmYWlscyhmdW5jdGlvbiAoKSB7XG4gIHJDb25zdHJ1Y3QoZnVuY3Rpb24gKCkgeyAvKiBlbXB0eSAqLyB9KTtcbn0pO1xuXG4kZXhwb3J0KCRleHBvcnQuUyArICRleHBvcnQuRiAqIChORVdfVEFSR0VUX0JVRyB8fCBBUkdTX0JVRyksICdSZWZsZWN0Jywge1xuICBjb25zdHJ1Y3Q6IGZ1bmN0aW9uIGNvbnN0cnVjdChUYXJnZXQsIGFyZ3MgLyogLCBuZXdUYXJnZXQgKi8pIHtcbiAgICBhRnVuY3Rpb24oVGFyZ2V0KTtcbiAgICBhbk9iamVjdChhcmdzKTtcbiAgICB2YXIgbmV3VGFyZ2V0ID0gYXJndW1lbnRzLmxlbmd0aCA8IDMgPyBUYXJnZXQgOiBhRnVuY3Rpb24oYXJndW1lbnRzWzJdKTtcbiAgICBpZiAoQVJHU19CVUcgJiYgIU5FV19UQVJHRVRfQlVHKSByZXR1cm4gckNvbnN0cnVjdChUYXJnZXQsIGFyZ3MsIG5ld1RhcmdldCk7XG4gICAgaWYgKFRhcmdldCA9PSBuZXdUYXJnZXQpIHtcbiAgICAgIC8vIHcvbyBhbHRlcmVkIG5ld1RhcmdldCwgb3B0aW1pemF0aW9uIGZvciAwLTQgYXJndW1lbnRzXG4gICAgICBzd2l0Y2ggKGFyZ3MubGVuZ3RoKSB7XG4gICAgICAgIGNhc2UgMDogcmV0dXJuIG5ldyBUYXJnZXQoKTtcbiAgICAgICAgY2FzZSAxOiByZXR1cm4gbmV3IFRhcmdldChhcmdzWzBdKTtcbiAgICAgICAgY2FzZSAyOiByZXR1cm4gbmV3IFRhcmdldChhcmdzWzBdLCBhcmdzWzFdKTtcbiAgICAgICAgY2FzZSAzOiByZXR1cm4gbmV3IFRhcmdldChhcmdzWzBdLCBhcmdzWzFdLCBhcmdzWzJdKTtcbiAgICAgICAgY2FzZSA0OiByZXR1cm4gbmV3IFRhcmdldChhcmdzWzBdLCBhcmdzWzFdLCBhcmdzWzJdLCBhcmdzWzNdKTtcbiAgICAgIH1cbiAgICAgIC8vIHcvbyBhbHRlcmVkIG5ld1RhcmdldCwgbG90IG9mIGFyZ3VtZW50cyBjYXNlXG4gICAgICB2YXIgJGFyZ3MgPSBbbnVsbF07XG4gICAgICAkYXJncy5wdXNoLmFwcGx5KCRhcmdzLCBhcmdzKTtcbiAgICAgIHJldHVybiBuZXcgKGJpbmQuYXBwbHkoVGFyZ2V0LCAkYXJncykpKCk7XG4gICAgfVxuICAgIC8vIHdpdGggYWx0ZXJlZCBuZXdUYXJnZXQsIG5vdCBzdXBwb3J0IGJ1aWx0LWluIGNvbnN0cnVjdG9yc1xuICAgIHZhciBwcm90byA9IG5ld1RhcmdldC5wcm90b3R5cGU7XG4gICAgdmFyIGluc3RhbmNlID0gY3JlYXRlKGlzT2JqZWN0KHByb3RvKSA/IHByb3RvIDogT2JqZWN0LnByb3RvdHlwZSk7XG4gICAgdmFyIHJlc3VsdCA9IEZ1bmN0aW9uLmFwcGx5LmNhbGwoVGFyZ2V0LCBpbnN0YW5jZSwgYXJncyk7XG4gICAgcmV0dXJuIGlzT2JqZWN0KHJlc3VsdCkgPyByZXN1bHQgOiBpbnN0YW5jZTtcbiAgfVxufSk7XG4iLCIvLyAyNi4xLjMgUmVmbGVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIHByb3BlcnR5S2V5LCBhdHRyaWJ1dGVzKVxudmFyIGRQID0gcmVxdWlyZSgnLi9fb2JqZWN0LWRwJyk7XG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi9fYW4tb2JqZWN0Jyk7XG52YXIgdG9QcmltaXRpdmUgPSByZXF1aXJlKCcuL190by1wcmltaXRpdmUnKTtcblxuLy8gTVMgRWRnZSBoYXMgYnJva2VuIFJlZmxlY3QuZGVmaW5lUHJvcGVydHkgLSB0aHJvd2luZyBpbnN0ZWFkIG9mIHJldHVybmluZyBmYWxzZVxuJGV4cG9ydCgkZXhwb3J0LlMgKyAkZXhwb3J0LkYgKiByZXF1aXJlKCcuL19mYWlscycpKGZ1bmN0aW9uICgpIHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVuZGVmXG4gIFJlZmxlY3QuZGVmaW5lUHJvcGVydHkoZFAuZih7fSwgMSwgeyB2YWx1ZTogMSB9KSwgMSwgeyB2YWx1ZTogMiB9KTtcbn0pLCAnUmVmbGVjdCcsIHtcbiAgZGVmaW5lUHJvcGVydHk6IGZ1bmN0aW9uIGRlZmluZVByb3BlcnR5KHRhcmdldCwgcHJvcGVydHlLZXksIGF0dHJpYnV0ZXMpIHtcbiAgICBhbk9iamVjdCh0YXJnZXQpO1xuICAgIHByb3BlcnR5S2V5ID0gdG9QcmltaXRpdmUocHJvcGVydHlLZXksIHRydWUpO1xuICAgIGFuT2JqZWN0KGF0dHJpYnV0ZXMpO1xuICAgIHRyeSB7XG4gICAgICBkUC5mKHRhcmdldCwgcHJvcGVydHlLZXksIGF0dHJpYnV0ZXMpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxufSk7XG4iLCIvLyAyNi4xLjQgUmVmbGVjdC5kZWxldGVQcm9wZXJ0eSh0YXJnZXQsIHByb3BlcnR5S2V5KVxudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciBnT1BEID0gcmVxdWlyZSgnLi9fb2JqZWN0LWdvcGQnKS5mO1xudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi9fYW4tb2JqZWN0Jyk7XG5cbiRleHBvcnQoJGV4cG9ydC5TLCAnUmVmbGVjdCcsIHtcbiAgZGVsZXRlUHJvcGVydHk6IGZ1bmN0aW9uIGRlbGV0ZVByb3BlcnR5KHRhcmdldCwgcHJvcGVydHlLZXkpIHtcbiAgICB2YXIgZGVzYyA9IGdPUEQoYW5PYmplY3QodGFyZ2V0KSwgcHJvcGVydHlLZXkpO1xuICAgIHJldHVybiBkZXNjICYmICFkZXNjLmNvbmZpZ3VyYWJsZSA/IGZhbHNlIDogZGVsZXRlIHRhcmdldFtwcm9wZXJ0eUtleV07XG4gIH1cbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xuLy8gMjYuMS41IFJlZmxlY3QuZW51bWVyYXRlKHRhcmdldClcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuL19hbi1vYmplY3QnKTtcbnZhciBFbnVtZXJhdGUgPSBmdW5jdGlvbiAoaXRlcmF0ZWQpIHtcbiAgdGhpcy5fdCA9IGFuT2JqZWN0KGl0ZXJhdGVkKTsgLy8gdGFyZ2V0XG4gIHRoaXMuX2kgPSAwOyAgICAgICAgICAgICAgICAgIC8vIG5leHQgaW5kZXhcbiAgdmFyIGtleXMgPSB0aGlzLl9rID0gW107ICAgICAgLy8ga2V5c1xuICB2YXIga2V5O1xuICBmb3IgKGtleSBpbiBpdGVyYXRlZCkga2V5cy5wdXNoKGtleSk7XG59O1xucmVxdWlyZSgnLi9faXRlci1jcmVhdGUnKShFbnVtZXJhdGUsICdPYmplY3QnLCBmdW5jdGlvbiAoKSB7XG4gIHZhciB0aGF0ID0gdGhpcztcbiAgdmFyIGtleXMgPSB0aGF0Ll9rO1xuICB2YXIga2V5O1xuICBkbyB7XG4gICAgaWYgKHRoYXQuX2kgPj0ga2V5cy5sZW5ndGgpIHJldHVybiB7IHZhbHVlOiB1bmRlZmluZWQsIGRvbmU6IHRydWUgfTtcbiAgfSB3aGlsZSAoISgoa2V5ID0ga2V5c1t0aGF0Ll9pKytdKSBpbiB0aGF0Ll90KSk7XG4gIHJldHVybiB7IHZhbHVlOiBrZXksIGRvbmU6IGZhbHNlIH07XG59KTtcblxuJGV4cG9ydCgkZXhwb3J0LlMsICdSZWZsZWN0Jywge1xuICBlbnVtZXJhdGU6IGZ1bmN0aW9uIGVudW1lcmF0ZSh0YXJnZXQpIHtcbiAgICByZXR1cm4gbmV3IEVudW1lcmF0ZSh0YXJnZXQpO1xuICB9XG59KTtcbiIsIi8vIDI2LjEuNyBSZWZsZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0YXJnZXQsIHByb3BlcnR5S2V5KVxudmFyIGdPUEQgPSByZXF1aXJlKCcuL19vYmplY3QtZ29wZCcpO1xudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4vX2FuLW9iamVjdCcpO1xuXG4kZXhwb3J0KCRleHBvcnQuUywgJ1JlZmxlY3QnLCB7XG4gIGdldE93blByb3BlcnR5RGVzY3JpcHRvcjogZnVuY3Rpb24gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwgcHJvcGVydHlLZXkpIHtcbiAgICByZXR1cm4gZ09QRC5mKGFuT2JqZWN0KHRhcmdldCksIHByb3BlcnR5S2V5KTtcbiAgfVxufSk7XG4iLCIvLyAyNi4xLjggUmVmbGVjdC5nZXRQcm90b3R5cGVPZih0YXJnZXQpXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyIGdldFByb3RvID0gcmVxdWlyZSgnLi9fb2JqZWN0LWdwbycpO1xudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi9fYW4tb2JqZWN0Jyk7XG5cbiRleHBvcnQoJGV4cG9ydC5TLCAnUmVmbGVjdCcsIHtcbiAgZ2V0UHJvdG90eXBlT2Y6IGZ1bmN0aW9uIGdldFByb3RvdHlwZU9mKHRhcmdldCkge1xuICAgIHJldHVybiBnZXRQcm90byhhbk9iamVjdCh0YXJnZXQpKTtcbiAgfVxufSk7XG4iLCIvLyAyNi4xLjYgUmVmbGVjdC5nZXQodGFyZ2V0LCBwcm9wZXJ0eUtleSBbLCByZWNlaXZlcl0pXG52YXIgZ09QRCA9IHJlcXVpcmUoJy4vX29iamVjdC1nb3BkJyk7XG52YXIgZ2V0UHJvdG90eXBlT2YgPSByZXF1aXJlKCcuL19vYmplY3QtZ3BvJyk7XG52YXIgaGFzID0gcmVxdWlyZSgnLi9faGFzJyk7XG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9faXMtb2JqZWN0Jyk7XG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuL19hbi1vYmplY3QnKTtcblxuZnVuY3Rpb24gZ2V0KHRhcmdldCwgcHJvcGVydHlLZXkgLyogLCByZWNlaXZlciAqLykge1xuICB2YXIgcmVjZWl2ZXIgPSBhcmd1bWVudHMubGVuZ3RoIDwgMyA/IHRhcmdldCA6IGFyZ3VtZW50c1syXTtcbiAgdmFyIGRlc2MsIHByb3RvO1xuICBpZiAoYW5PYmplY3QodGFyZ2V0KSA9PT0gcmVjZWl2ZXIpIHJldHVybiB0YXJnZXRbcHJvcGVydHlLZXldO1xuICBpZiAoZGVzYyA9IGdPUEQuZih0YXJnZXQsIHByb3BlcnR5S2V5KSkgcmV0dXJuIGhhcyhkZXNjLCAndmFsdWUnKVxuICAgID8gZGVzYy52YWx1ZVxuICAgIDogZGVzYy5nZXQgIT09IHVuZGVmaW5lZFxuICAgICAgPyBkZXNjLmdldC5jYWxsKHJlY2VpdmVyKVxuICAgICAgOiB1bmRlZmluZWQ7XG4gIGlmIChpc09iamVjdChwcm90byA9IGdldFByb3RvdHlwZU9mKHRhcmdldCkpKSByZXR1cm4gZ2V0KHByb3RvLCBwcm9wZXJ0eUtleSwgcmVjZWl2ZXIpO1xufVxuXG4kZXhwb3J0KCRleHBvcnQuUywgJ1JlZmxlY3QnLCB7IGdldDogZ2V0IH0pO1xuIiwiLy8gMjYuMS45IFJlZmxlY3QuaGFzKHRhcmdldCwgcHJvcGVydHlLZXkpXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xuXG4kZXhwb3J0KCRleHBvcnQuUywgJ1JlZmxlY3QnLCB7XG4gIGhhczogZnVuY3Rpb24gaGFzKHRhcmdldCwgcHJvcGVydHlLZXkpIHtcbiAgICByZXR1cm4gcHJvcGVydHlLZXkgaW4gdGFyZ2V0O1xuICB9XG59KTtcbiIsIi8vIDI2LjEuMTAgUmVmbGVjdC5pc0V4dGVuc2libGUodGFyZ2V0KVxudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4vX2FuLW9iamVjdCcpO1xudmFyICRpc0V4dGVuc2libGUgPSBPYmplY3QuaXNFeHRlbnNpYmxlO1xuXG4kZXhwb3J0KCRleHBvcnQuUywgJ1JlZmxlY3QnLCB7XG4gIGlzRXh0ZW5zaWJsZTogZnVuY3Rpb24gaXNFeHRlbnNpYmxlKHRhcmdldCkge1xuICAgIGFuT2JqZWN0KHRhcmdldCk7XG4gICAgcmV0dXJuICRpc0V4dGVuc2libGUgPyAkaXNFeHRlbnNpYmxlKHRhcmdldCkgOiB0cnVlO1xuICB9XG59KTtcbiIsIi8vIDI2LjEuMTEgUmVmbGVjdC5vd25LZXlzKHRhcmdldClcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG5cbiRleHBvcnQoJGV4cG9ydC5TLCAnUmVmbGVjdCcsIHsgb3duS2V5czogcmVxdWlyZSgnLi9fb3duLWtleXMnKSB9KTtcbiIsIi8vIDI2LjEuMTIgUmVmbGVjdC5wcmV2ZW50RXh0ZW5zaW9ucyh0YXJnZXQpXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi9fYW4tb2JqZWN0Jyk7XG52YXIgJHByZXZlbnRFeHRlbnNpb25zID0gT2JqZWN0LnByZXZlbnRFeHRlbnNpb25zO1xuXG4kZXhwb3J0KCRleHBvcnQuUywgJ1JlZmxlY3QnLCB7XG4gIHByZXZlbnRFeHRlbnNpb25zOiBmdW5jdGlvbiBwcmV2ZW50RXh0ZW5zaW9ucyh0YXJnZXQpIHtcbiAgICBhbk9iamVjdCh0YXJnZXQpO1xuICAgIHRyeSB7XG4gICAgICBpZiAoJHByZXZlbnRFeHRlbnNpb25zKSAkcHJldmVudEV4dGVuc2lvbnModGFyZ2V0KTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cbn0pO1xuIiwiLy8gMjYuMS4xNCBSZWZsZWN0LnNldFByb3RvdHlwZU9mKHRhcmdldCwgcHJvdG8pXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyIHNldFByb3RvID0gcmVxdWlyZSgnLi9fc2V0LXByb3RvJyk7XG5cbmlmIChzZXRQcm90bykgJGV4cG9ydCgkZXhwb3J0LlMsICdSZWZsZWN0Jywge1xuICBzZXRQcm90b3R5cGVPZjogZnVuY3Rpb24gc2V0UHJvdG90eXBlT2YodGFyZ2V0LCBwcm90bykge1xuICAgIHNldFByb3RvLmNoZWNrKHRhcmdldCwgcHJvdG8pO1xuICAgIHRyeSB7XG4gICAgICBzZXRQcm90by5zZXQodGFyZ2V0LCBwcm90byk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG59KTtcbiIsIi8vIDI2LjEuMTMgUmVmbGVjdC5zZXQodGFyZ2V0LCBwcm9wZXJ0eUtleSwgViBbLCByZWNlaXZlcl0pXG52YXIgZFAgPSByZXF1aXJlKCcuL19vYmplY3QtZHAnKTtcbnZhciBnT1BEID0gcmVxdWlyZSgnLi9fb2JqZWN0LWdvcGQnKTtcbnZhciBnZXRQcm90b3R5cGVPZiA9IHJlcXVpcmUoJy4vX29iamVjdC1ncG8nKTtcbnZhciBoYXMgPSByZXF1aXJlKCcuL19oYXMnKTtcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgY3JlYXRlRGVzYyA9IHJlcXVpcmUoJy4vX3Byb3BlcnR5LWRlc2MnKTtcbnZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4vX2FuLW9iamVjdCcpO1xudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9faXMtb2JqZWN0Jyk7XG5cbmZ1bmN0aW9uIHNldCh0YXJnZXQsIHByb3BlcnR5S2V5LCBWIC8qICwgcmVjZWl2ZXIgKi8pIHtcbiAgdmFyIHJlY2VpdmVyID0gYXJndW1lbnRzLmxlbmd0aCA8IDQgPyB0YXJnZXQgOiBhcmd1bWVudHNbM107XG4gIHZhciBvd25EZXNjID0gZ09QRC5mKGFuT2JqZWN0KHRhcmdldCksIHByb3BlcnR5S2V5KTtcbiAgdmFyIGV4aXN0aW5nRGVzY3JpcHRvciwgcHJvdG87XG4gIGlmICghb3duRGVzYykge1xuICAgIGlmIChpc09iamVjdChwcm90byA9IGdldFByb3RvdHlwZU9mKHRhcmdldCkpKSB7XG4gICAgICByZXR1cm4gc2V0KHByb3RvLCBwcm9wZXJ0eUtleSwgViwgcmVjZWl2ZXIpO1xuICAgIH1cbiAgICBvd25EZXNjID0gY3JlYXRlRGVzYygwKTtcbiAgfVxuICBpZiAoaGFzKG93bkRlc2MsICd2YWx1ZScpKSB7XG4gICAgaWYgKG93bkRlc2Mud3JpdGFibGUgPT09IGZhbHNlIHx8ICFpc09iamVjdChyZWNlaXZlcikpIHJldHVybiBmYWxzZTtcbiAgICBleGlzdGluZ0Rlc2NyaXB0b3IgPSBnT1BELmYocmVjZWl2ZXIsIHByb3BlcnR5S2V5KSB8fCBjcmVhdGVEZXNjKDApO1xuICAgIGV4aXN0aW5nRGVzY3JpcHRvci52YWx1ZSA9IFY7XG4gICAgZFAuZihyZWNlaXZlciwgcHJvcGVydHlLZXksIGV4aXN0aW5nRGVzY3JpcHRvcik7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgcmV0dXJuIG93bkRlc2Muc2V0ID09PSB1bmRlZmluZWQgPyBmYWxzZSA6IChvd25EZXNjLnNldC5jYWxsKHJlY2VpdmVyLCBWKSwgdHJ1ZSk7XG59XG5cbiRleHBvcnQoJGV4cG9ydC5TLCAnUmVmbGVjdCcsIHsgc2V0OiBzZXQgfSk7XG4iLCJ2YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi9fZ2xvYmFsJyk7XG52YXIgaW5oZXJpdElmUmVxdWlyZWQgPSByZXF1aXJlKCcuL19pbmhlcml0LWlmLXJlcXVpcmVkJyk7XG52YXIgZFAgPSByZXF1aXJlKCcuL19vYmplY3QtZHAnKS5mO1xudmFyIGdPUE4gPSByZXF1aXJlKCcuL19vYmplY3QtZ29wbicpLmY7XG52YXIgaXNSZWdFeHAgPSByZXF1aXJlKCcuL19pcy1yZWdleHAnKTtcbnZhciAkZmxhZ3MgPSByZXF1aXJlKCcuL19mbGFncycpO1xudmFyICRSZWdFeHAgPSBnbG9iYWwuUmVnRXhwO1xudmFyIEJhc2UgPSAkUmVnRXhwO1xudmFyIHByb3RvID0gJFJlZ0V4cC5wcm90b3R5cGU7XG52YXIgcmUxID0gL2EvZztcbnZhciByZTIgPSAvYS9nO1xuLy8gXCJuZXdcIiBjcmVhdGVzIGEgbmV3IG9iamVjdCwgb2xkIHdlYmtpdCBidWdneSBoZXJlXG52YXIgQ09SUkVDVF9ORVcgPSBuZXcgJFJlZ0V4cChyZTEpICE9PSByZTE7XG5cbmlmIChyZXF1aXJlKCcuL19kZXNjcmlwdG9ycycpICYmICghQ09SUkVDVF9ORVcgfHwgcmVxdWlyZSgnLi9fZmFpbHMnKShmdW5jdGlvbiAoKSB7XG4gIHJlMltyZXF1aXJlKCcuL193a3MnKSgnbWF0Y2gnKV0gPSBmYWxzZTtcbiAgLy8gUmVnRXhwIGNvbnN0cnVjdG9yIGNhbiBhbHRlciBmbGFncyBhbmQgSXNSZWdFeHAgd29ya3MgY29ycmVjdCB3aXRoIEBAbWF0Y2hcbiAgcmV0dXJuICRSZWdFeHAocmUxKSAhPSByZTEgfHwgJFJlZ0V4cChyZTIpID09IHJlMiB8fCAkUmVnRXhwKHJlMSwgJ2knKSAhPSAnL2EvaSc7XG59KSkpIHtcbiAgJFJlZ0V4cCA9IGZ1bmN0aW9uIFJlZ0V4cChwLCBmKSB7XG4gICAgdmFyIHRpUkUgPSB0aGlzIGluc3RhbmNlb2YgJFJlZ0V4cDtcbiAgICB2YXIgcGlSRSA9IGlzUmVnRXhwKHApO1xuICAgIHZhciBmaVUgPSBmID09PSB1bmRlZmluZWQ7XG4gICAgcmV0dXJuICF0aVJFICYmIHBpUkUgJiYgcC5jb25zdHJ1Y3RvciA9PT0gJFJlZ0V4cCAmJiBmaVUgPyBwXG4gICAgICA6IGluaGVyaXRJZlJlcXVpcmVkKENPUlJFQ1RfTkVXXG4gICAgICAgID8gbmV3IEJhc2UocGlSRSAmJiAhZmlVID8gcC5zb3VyY2UgOiBwLCBmKVxuICAgICAgICA6IEJhc2UoKHBpUkUgPSBwIGluc3RhbmNlb2YgJFJlZ0V4cCkgPyBwLnNvdXJjZSA6IHAsIHBpUkUgJiYgZmlVID8gJGZsYWdzLmNhbGwocCkgOiBmKVxuICAgICAgLCB0aVJFID8gdGhpcyA6IHByb3RvLCAkUmVnRXhwKTtcbiAgfTtcbiAgdmFyIHByb3h5ID0gZnVuY3Rpb24gKGtleSkge1xuICAgIGtleSBpbiAkUmVnRXhwIHx8IGRQKCRSZWdFeHAsIGtleSwge1xuICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBCYXNlW2tleV07IH0sXG4gICAgICBzZXQ6IGZ1bmN0aW9uIChpdCkgeyBCYXNlW2tleV0gPSBpdDsgfVxuICAgIH0pO1xuICB9O1xuICBmb3IgKHZhciBrZXlzID0gZ09QTihCYXNlKSwgaSA9IDA7IGtleXMubGVuZ3RoID4gaTspIHByb3h5KGtleXNbaSsrXSk7XG4gIHByb3RvLmNvbnN0cnVjdG9yID0gJFJlZ0V4cDtcbiAgJFJlZ0V4cC5wcm90b3R5cGUgPSBwcm90bztcbiAgcmVxdWlyZSgnLi9fcmVkZWZpbmUnKShnbG9iYWwsICdSZWdFeHAnLCAkUmVnRXhwKTtcbn1cblxucmVxdWlyZSgnLi9fc2V0LXNwZWNpZXMnKSgnUmVnRXhwJyk7XG4iLCIvLyAyMS4yLjUuMyBnZXQgUmVnRXhwLnByb3RvdHlwZS5mbGFncygpXG5pZiAocmVxdWlyZSgnLi9fZGVzY3JpcHRvcnMnKSAmJiAvLi9nLmZsYWdzICE9ICdnJykgcmVxdWlyZSgnLi9fb2JqZWN0LWRwJykuZihSZWdFeHAucHJvdG90eXBlLCAnZmxhZ3MnLCB7XG4gIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgZ2V0OiByZXF1aXJlKCcuL19mbGFncycpXG59KTtcbiIsIi8vIEBAbWF0Y2ggbG9naWNcbnJlcXVpcmUoJy4vX2ZpeC1yZS13a3MnKSgnbWF0Y2gnLCAxLCBmdW5jdGlvbiAoZGVmaW5lZCwgTUFUQ0gsICRtYXRjaCkge1xuICAvLyAyMS4xLjMuMTEgU3RyaW5nLnByb3RvdHlwZS5tYXRjaChyZWdleHApXG4gIHJldHVybiBbZnVuY3Rpb24gbWF0Y2gocmVnZXhwKSB7XG4gICAgJ3VzZSBzdHJpY3QnO1xuICAgIHZhciBPID0gZGVmaW5lZCh0aGlzKTtcbiAgICB2YXIgZm4gPSByZWdleHAgPT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogcmVnZXhwW01BVENIXTtcbiAgICByZXR1cm4gZm4gIT09IHVuZGVmaW5lZCA/IGZuLmNhbGwocmVnZXhwLCBPKSA6IG5ldyBSZWdFeHAocmVnZXhwKVtNQVRDSF0oU3RyaW5nKE8pKTtcbiAgfSwgJG1hdGNoXTtcbn0pO1xuIiwiLy8gQEByZXBsYWNlIGxvZ2ljXG5yZXF1aXJlKCcuL19maXgtcmUtd2tzJykoJ3JlcGxhY2UnLCAyLCBmdW5jdGlvbiAoZGVmaW5lZCwgUkVQTEFDRSwgJHJlcGxhY2UpIHtcbiAgLy8gMjEuMS4zLjE0IFN0cmluZy5wcm90b3R5cGUucmVwbGFjZShzZWFyY2hWYWx1ZSwgcmVwbGFjZVZhbHVlKVxuICByZXR1cm4gW2Z1bmN0aW9uIHJlcGxhY2Uoc2VhcmNoVmFsdWUsIHJlcGxhY2VWYWx1ZSkge1xuICAgICd1c2Ugc3RyaWN0JztcbiAgICB2YXIgTyA9IGRlZmluZWQodGhpcyk7XG4gICAgdmFyIGZuID0gc2VhcmNoVmFsdWUgPT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogc2VhcmNoVmFsdWVbUkVQTEFDRV07XG4gICAgcmV0dXJuIGZuICE9PSB1bmRlZmluZWRcbiAgICAgID8gZm4uY2FsbChzZWFyY2hWYWx1ZSwgTywgcmVwbGFjZVZhbHVlKVxuICAgICAgOiAkcmVwbGFjZS5jYWxsKFN0cmluZyhPKSwgc2VhcmNoVmFsdWUsIHJlcGxhY2VWYWx1ZSk7XG4gIH0sICRyZXBsYWNlXTtcbn0pO1xuIiwiLy8gQEBzZWFyY2ggbG9naWNcbnJlcXVpcmUoJy4vX2ZpeC1yZS13a3MnKSgnc2VhcmNoJywgMSwgZnVuY3Rpb24gKGRlZmluZWQsIFNFQVJDSCwgJHNlYXJjaCkge1xuICAvLyAyMS4xLjMuMTUgU3RyaW5nLnByb3RvdHlwZS5zZWFyY2gocmVnZXhwKVxuICByZXR1cm4gW2Z1bmN0aW9uIHNlYXJjaChyZWdleHApIHtcbiAgICAndXNlIHN0cmljdCc7XG4gICAgdmFyIE8gPSBkZWZpbmVkKHRoaXMpO1xuICAgIHZhciBmbiA9IHJlZ2V4cCA9PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiByZWdleHBbU0VBUkNIXTtcbiAgICByZXR1cm4gZm4gIT09IHVuZGVmaW5lZCA/IGZuLmNhbGwocmVnZXhwLCBPKSA6IG5ldyBSZWdFeHAocmVnZXhwKVtTRUFSQ0hdKFN0cmluZyhPKSk7XG4gIH0sICRzZWFyY2hdO1xufSk7XG4iLCIvLyBAQHNwbGl0IGxvZ2ljXG5yZXF1aXJlKCcuL19maXgtcmUtd2tzJykoJ3NwbGl0JywgMiwgZnVuY3Rpb24gKGRlZmluZWQsIFNQTElULCAkc3BsaXQpIHtcbiAgJ3VzZSBzdHJpY3QnO1xuICB2YXIgaXNSZWdFeHAgPSByZXF1aXJlKCcuL19pcy1yZWdleHAnKTtcbiAgdmFyIF9zcGxpdCA9ICRzcGxpdDtcbiAgdmFyICRwdXNoID0gW10ucHVzaDtcbiAgdmFyICRTUExJVCA9ICdzcGxpdCc7XG4gIHZhciBMRU5HVEggPSAnbGVuZ3RoJztcbiAgdmFyIExBU1RfSU5ERVggPSAnbGFzdEluZGV4JztcbiAgaWYgKFxuICAgICdhYmJjJ1skU1BMSVRdKC8oYikqLylbMV0gPT0gJ2MnIHx8XG4gICAgJ3Rlc3QnWyRTUExJVF0oLyg/OikvLCAtMSlbTEVOR1RIXSAhPSA0IHx8XG4gICAgJ2FiJ1skU1BMSVRdKC8oPzphYikqLylbTEVOR1RIXSAhPSAyIHx8XG4gICAgJy4nWyRTUExJVF0oLyguPykoLj8pLylbTEVOR1RIXSAhPSA0IHx8XG4gICAgJy4nWyRTUExJVF0oLygpKCkvKVtMRU5HVEhdID4gMSB8fFxuICAgICcnWyRTUExJVF0oLy4/LylbTEVOR1RIXVxuICApIHtcbiAgICB2YXIgTlBDRyA9IC8oKT8/Ly5leGVjKCcnKVsxXSA9PT0gdW5kZWZpbmVkOyAvLyBub25wYXJ0aWNpcGF0aW5nIGNhcHR1cmluZyBncm91cFxuICAgIC8vIGJhc2VkIG9uIGVzNS1zaGltIGltcGxlbWVudGF0aW9uLCBuZWVkIHRvIHJld29yayBpdFxuICAgICRzcGxpdCA9IGZ1bmN0aW9uIChzZXBhcmF0b3IsIGxpbWl0KSB7XG4gICAgICB2YXIgc3RyaW5nID0gU3RyaW5nKHRoaXMpO1xuICAgICAgaWYgKHNlcGFyYXRvciA9PT0gdW5kZWZpbmVkICYmIGxpbWl0ID09PSAwKSByZXR1cm4gW107XG4gICAgICAvLyBJZiBgc2VwYXJhdG9yYCBpcyBub3QgYSByZWdleCwgdXNlIG5hdGl2ZSBzcGxpdFxuICAgICAgaWYgKCFpc1JlZ0V4cChzZXBhcmF0b3IpKSByZXR1cm4gX3NwbGl0LmNhbGwoc3RyaW5nLCBzZXBhcmF0b3IsIGxpbWl0KTtcbiAgICAgIHZhciBvdXRwdXQgPSBbXTtcbiAgICAgIHZhciBmbGFncyA9IChzZXBhcmF0b3IuaWdub3JlQ2FzZSA/ICdpJyA6ICcnKSArXG4gICAgICAgICAgICAgICAgICAoc2VwYXJhdG9yLm11bHRpbGluZSA/ICdtJyA6ICcnKSArXG4gICAgICAgICAgICAgICAgICAoc2VwYXJhdG9yLnVuaWNvZGUgPyAndScgOiAnJykgK1xuICAgICAgICAgICAgICAgICAgKHNlcGFyYXRvci5zdGlja3kgPyAneScgOiAnJyk7XG4gICAgICB2YXIgbGFzdExhc3RJbmRleCA9IDA7XG4gICAgICB2YXIgc3BsaXRMaW1pdCA9IGxpbWl0ID09PSB1bmRlZmluZWQgPyA0Mjk0OTY3Mjk1IDogbGltaXQgPj4+IDA7XG4gICAgICAvLyBNYWtlIGBnbG9iYWxgIGFuZCBhdm9pZCBgbGFzdEluZGV4YCBpc3N1ZXMgYnkgd29ya2luZyB3aXRoIGEgY29weVxuICAgICAgdmFyIHNlcGFyYXRvckNvcHkgPSBuZXcgUmVnRXhwKHNlcGFyYXRvci5zb3VyY2UsIGZsYWdzICsgJ2cnKTtcbiAgICAgIHZhciBzZXBhcmF0b3IyLCBtYXRjaCwgbGFzdEluZGV4LCBsYXN0TGVuZ3RoLCBpO1xuICAgICAgLy8gRG9lc24ndCBuZWVkIGZsYWdzIGd5LCBidXQgdGhleSBkb24ndCBodXJ0XG4gICAgICBpZiAoIU5QQ0cpIHNlcGFyYXRvcjIgPSBuZXcgUmVnRXhwKCdeJyArIHNlcGFyYXRvckNvcHkuc291cmNlICsgJyQoPyFcXFxccyknLCBmbGFncyk7XG4gICAgICB3aGlsZSAobWF0Y2ggPSBzZXBhcmF0b3JDb3B5LmV4ZWMoc3RyaW5nKSkge1xuICAgICAgICAvLyBgc2VwYXJhdG9yQ29weS5sYXN0SW5kZXhgIGlzIG5vdCByZWxpYWJsZSBjcm9zcy1icm93c2VyXG4gICAgICAgIGxhc3RJbmRleCA9IG1hdGNoLmluZGV4ICsgbWF0Y2hbMF1bTEVOR1RIXTtcbiAgICAgICAgaWYgKGxhc3RJbmRleCA+IGxhc3RMYXN0SW5kZXgpIHtcbiAgICAgICAgICBvdXRwdXQucHVzaChzdHJpbmcuc2xpY2UobGFzdExhc3RJbmRleCwgbWF0Y2guaW5kZXgpKTtcbiAgICAgICAgICAvLyBGaXggYnJvd3NlcnMgd2hvc2UgYGV4ZWNgIG1ldGhvZHMgZG9uJ3QgY29uc2lzdGVudGx5IHJldHVybiBgdW5kZWZpbmVkYCBmb3IgTlBDR1xuICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1sb29wLWZ1bmNcbiAgICAgICAgICBpZiAoIU5QQ0cgJiYgbWF0Y2hbTEVOR1RIXSA+IDEpIG1hdGNoWzBdLnJlcGxhY2Uoc2VwYXJhdG9yMiwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgZm9yIChpID0gMTsgaSA8IGFyZ3VtZW50c1tMRU5HVEhdIC0gMjsgaSsrKSBpZiAoYXJndW1lbnRzW2ldID09PSB1bmRlZmluZWQpIG1hdGNoW2ldID0gdW5kZWZpbmVkO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIGlmIChtYXRjaFtMRU5HVEhdID4gMSAmJiBtYXRjaC5pbmRleCA8IHN0cmluZ1tMRU5HVEhdKSAkcHVzaC5hcHBseShvdXRwdXQsIG1hdGNoLnNsaWNlKDEpKTtcbiAgICAgICAgICBsYXN0TGVuZ3RoID0gbWF0Y2hbMF1bTEVOR1RIXTtcbiAgICAgICAgICBsYXN0TGFzdEluZGV4ID0gbGFzdEluZGV4O1xuICAgICAgICAgIGlmIChvdXRwdXRbTEVOR1RIXSA+PSBzcGxpdExpbWl0KSBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBpZiAoc2VwYXJhdG9yQ29weVtMQVNUX0lOREVYXSA9PT0gbWF0Y2guaW5kZXgpIHNlcGFyYXRvckNvcHlbTEFTVF9JTkRFWF0rKzsgLy8gQXZvaWQgYW4gaW5maW5pdGUgbG9vcFxuICAgICAgfVxuICAgICAgaWYgKGxhc3RMYXN0SW5kZXggPT09IHN0cmluZ1tMRU5HVEhdKSB7XG4gICAgICAgIGlmIChsYXN0TGVuZ3RoIHx8ICFzZXBhcmF0b3JDb3B5LnRlc3QoJycpKSBvdXRwdXQucHVzaCgnJyk7XG4gICAgICB9IGVsc2Ugb3V0cHV0LnB1c2goc3RyaW5nLnNsaWNlKGxhc3RMYXN0SW5kZXgpKTtcbiAgICAgIHJldHVybiBvdXRwdXRbTEVOR1RIXSA+IHNwbGl0TGltaXQgPyBvdXRwdXQuc2xpY2UoMCwgc3BsaXRMaW1pdCkgOiBvdXRwdXQ7XG4gICAgfTtcbiAgLy8gQ2hha3JhLCBWOFxuICB9IGVsc2UgaWYgKCcwJ1skU1BMSVRdKHVuZGVmaW5lZCwgMClbTEVOR1RIXSkge1xuICAgICRzcGxpdCA9IGZ1bmN0aW9uIChzZXBhcmF0b3IsIGxpbWl0KSB7XG4gICAgICByZXR1cm4gc2VwYXJhdG9yID09PSB1bmRlZmluZWQgJiYgbGltaXQgPT09IDAgPyBbXSA6IF9zcGxpdC5jYWxsKHRoaXMsIHNlcGFyYXRvciwgbGltaXQpO1xuICAgIH07XG4gIH1cbiAgLy8gMjEuMS4zLjE3IFN0cmluZy5wcm90b3R5cGUuc3BsaXQoc2VwYXJhdG9yLCBsaW1pdClcbiAgcmV0dXJuIFtmdW5jdGlvbiBzcGxpdChzZXBhcmF0b3IsIGxpbWl0KSB7XG4gICAgdmFyIE8gPSBkZWZpbmVkKHRoaXMpO1xuICAgIHZhciBmbiA9IHNlcGFyYXRvciA9PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiBzZXBhcmF0b3JbU1BMSVRdO1xuICAgIHJldHVybiBmbiAhPT0gdW5kZWZpbmVkID8gZm4uY2FsbChzZXBhcmF0b3IsIE8sIGxpbWl0KSA6ICRzcGxpdC5jYWxsKFN0cmluZyhPKSwgc2VwYXJhdG9yLCBsaW1pdCk7XG4gIH0sICRzcGxpdF07XG59KTtcbiIsIid1c2Ugc3RyaWN0JztcbnJlcXVpcmUoJy4vZXM2LnJlZ2V4cC5mbGFncycpO1xudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi9fYW4tb2JqZWN0Jyk7XG52YXIgJGZsYWdzID0gcmVxdWlyZSgnLi9fZmxhZ3MnKTtcbnZhciBERVNDUklQVE9SUyA9IHJlcXVpcmUoJy4vX2Rlc2NyaXB0b3JzJyk7XG52YXIgVE9fU1RSSU5HID0gJ3RvU3RyaW5nJztcbnZhciAkdG9TdHJpbmcgPSAvLi9bVE9fU1RSSU5HXTtcblxudmFyIGRlZmluZSA9IGZ1bmN0aW9uIChmbikge1xuICByZXF1aXJlKCcuL19yZWRlZmluZScpKFJlZ0V4cC5wcm90b3R5cGUsIFRPX1NUUklORywgZm4sIHRydWUpO1xufTtcblxuLy8gMjEuMi41LjE0IFJlZ0V4cC5wcm90b3R5cGUudG9TdHJpbmcoKVxuaWYgKHJlcXVpcmUoJy4vX2ZhaWxzJykoZnVuY3Rpb24gKCkgeyByZXR1cm4gJHRvU3RyaW5nLmNhbGwoeyBzb3VyY2U6ICdhJywgZmxhZ3M6ICdiJyB9KSAhPSAnL2EvYic7IH0pKSB7XG4gIGRlZmluZShmdW5jdGlvbiB0b1N0cmluZygpIHtcbiAgICB2YXIgUiA9IGFuT2JqZWN0KHRoaXMpO1xuICAgIHJldHVybiAnLycuY29uY2F0KFIuc291cmNlLCAnLycsXG4gICAgICAnZmxhZ3MnIGluIFIgPyBSLmZsYWdzIDogIURFU0NSSVBUT1JTICYmIFIgaW5zdGFuY2VvZiBSZWdFeHAgPyAkZmxhZ3MuY2FsbChSKSA6IHVuZGVmaW5lZCk7XG4gIH0pO1xuLy8gRkY0NC0gUmVnRXhwI3RvU3RyaW5nIGhhcyBhIHdyb25nIG5hbWVcbn0gZWxzZSBpZiAoJHRvU3RyaW5nLm5hbWUgIT0gVE9fU1RSSU5HKSB7XG4gIGRlZmluZShmdW5jdGlvbiB0b1N0cmluZygpIHtcbiAgICByZXR1cm4gJHRvU3RyaW5nLmNhbGwodGhpcyk7XG4gIH0pO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIHN0cm9uZyA9IHJlcXVpcmUoJy4vX2NvbGxlY3Rpb24tc3Ryb25nJyk7XG52YXIgdmFsaWRhdGUgPSByZXF1aXJlKCcuL192YWxpZGF0ZS1jb2xsZWN0aW9uJyk7XG52YXIgU0VUID0gJ1NldCc7XG5cbi8vIDIzLjIgU2V0IE9iamVjdHNcbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9fY29sbGVjdGlvbicpKFNFVCwgZnVuY3Rpb24gKGdldCkge1xuICByZXR1cm4gZnVuY3Rpb24gU2V0KCkgeyByZXR1cm4gZ2V0KHRoaXMsIGFyZ3VtZW50cy5sZW5ndGggPiAwID8gYXJndW1lbnRzWzBdIDogdW5kZWZpbmVkKTsgfTtcbn0sIHtcbiAgLy8gMjMuMi4zLjEgU2V0LnByb3RvdHlwZS5hZGQodmFsdWUpXG4gIGFkZDogZnVuY3Rpb24gYWRkKHZhbHVlKSB7XG4gICAgcmV0dXJuIHN0cm9uZy5kZWYodmFsaWRhdGUodGhpcywgU0VUKSwgdmFsdWUgPSB2YWx1ZSA9PT0gMCA/IDAgOiB2YWx1ZSwgdmFsdWUpO1xuICB9XG59LCBzdHJvbmcpO1xuIiwiJ3VzZSBzdHJpY3QnO1xuLy8gQi4yLjMuMiBTdHJpbmcucHJvdG90eXBlLmFuY2hvcihuYW1lKVxucmVxdWlyZSgnLi9fc3RyaW5nLWh0bWwnKSgnYW5jaG9yJywgZnVuY3Rpb24gKGNyZWF0ZUhUTUwpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIGFuY2hvcihuYW1lKSB7XG4gICAgcmV0dXJuIGNyZWF0ZUhUTUwodGhpcywgJ2EnLCAnbmFtZScsIG5hbWUpO1xuICB9O1xufSk7XG4iLCIndXNlIHN0cmljdCc7XG4vLyBCLjIuMy4zIFN0cmluZy5wcm90b3R5cGUuYmlnKClcbnJlcXVpcmUoJy4vX3N0cmluZy1odG1sJykoJ2JpZycsIGZ1bmN0aW9uIChjcmVhdGVIVE1MKSB7XG4gIHJldHVybiBmdW5jdGlvbiBiaWcoKSB7XG4gICAgcmV0dXJuIGNyZWF0ZUhUTUwodGhpcywgJ2JpZycsICcnLCAnJyk7XG4gIH07XG59KTtcbiIsIid1c2Ugc3RyaWN0Jztcbi8vIEIuMi4zLjQgU3RyaW5nLnByb3RvdHlwZS5ibGluaygpXG5yZXF1aXJlKCcuL19zdHJpbmctaHRtbCcpKCdibGluaycsIGZ1bmN0aW9uIChjcmVhdGVIVE1MKSB7XG4gIHJldHVybiBmdW5jdGlvbiBibGluaygpIHtcbiAgICByZXR1cm4gY3JlYXRlSFRNTCh0aGlzLCAnYmxpbmsnLCAnJywgJycpO1xuICB9O1xufSk7XG4iLCIndXNlIHN0cmljdCc7XG4vLyBCLjIuMy41IFN0cmluZy5wcm90b3R5cGUuYm9sZCgpXG5yZXF1aXJlKCcuL19zdHJpbmctaHRtbCcpKCdib2xkJywgZnVuY3Rpb24gKGNyZWF0ZUhUTUwpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIGJvbGQoKSB7XG4gICAgcmV0dXJuIGNyZWF0ZUhUTUwodGhpcywgJ2InLCAnJywgJycpO1xuICB9O1xufSk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyICRhdCA9IHJlcXVpcmUoJy4vX3N0cmluZy1hdCcpKGZhbHNlKTtcbiRleHBvcnQoJGV4cG9ydC5QLCAnU3RyaW5nJywge1xuICAvLyAyMS4xLjMuMyBTdHJpbmcucHJvdG90eXBlLmNvZGVQb2ludEF0KHBvcylcbiAgY29kZVBvaW50QXQ6IGZ1bmN0aW9uIGNvZGVQb2ludEF0KHBvcykge1xuICAgIHJldHVybiAkYXQodGhpcywgcG9zKTtcbiAgfVxufSk7XG4iLCIvLyAyMS4xLjMuNiBTdHJpbmcucHJvdG90eXBlLmVuZHNXaXRoKHNlYXJjaFN0cmluZyBbLCBlbmRQb3NpdGlvbl0pXG4ndXNlIHN0cmljdCc7XG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyIHRvTGVuZ3RoID0gcmVxdWlyZSgnLi9fdG8tbGVuZ3RoJyk7XG52YXIgY29udGV4dCA9IHJlcXVpcmUoJy4vX3N0cmluZy1jb250ZXh0Jyk7XG52YXIgRU5EU19XSVRIID0gJ2VuZHNXaXRoJztcbnZhciAkZW5kc1dpdGggPSAnJ1tFTkRTX1dJVEhdO1xuXG4kZXhwb3J0KCRleHBvcnQuUCArICRleHBvcnQuRiAqIHJlcXVpcmUoJy4vX2ZhaWxzLWlzLXJlZ2V4cCcpKEVORFNfV0lUSCksICdTdHJpbmcnLCB7XG4gIGVuZHNXaXRoOiBmdW5jdGlvbiBlbmRzV2l0aChzZWFyY2hTdHJpbmcgLyogLCBlbmRQb3NpdGlvbiA9IEBsZW5ndGggKi8pIHtcbiAgICB2YXIgdGhhdCA9IGNvbnRleHQodGhpcywgc2VhcmNoU3RyaW5nLCBFTkRTX1dJVEgpO1xuICAgIHZhciBlbmRQb3NpdGlvbiA9IGFyZ3VtZW50cy5sZW5ndGggPiAxID8gYXJndW1lbnRzWzFdIDogdW5kZWZpbmVkO1xuICAgIHZhciBsZW4gPSB0b0xlbmd0aCh0aGF0Lmxlbmd0aCk7XG4gICAgdmFyIGVuZCA9IGVuZFBvc2l0aW9uID09PSB1bmRlZmluZWQgPyBsZW4gOiBNYXRoLm1pbih0b0xlbmd0aChlbmRQb3NpdGlvbiksIGxlbik7XG4gICAgdmFyIHNlYXJjaCA9IFN0cmluZyhzZWFyY2hTdHJpbmcpO1xuICAgIHJldHVybiAkZW5kc1dpdGhcbiAgICAgID8gJGVuZHNXaXRoLmNhbGwodGhhdCwgc2VhcmNoLCBlbmQpXG4gICAgICA6IHRoYXQuc2xpY2UoZW5kIC0gc2VhcmNoLmxlbmd0aCwgZW5kKSA9PT0gc2VhcmNoO1xuICB9XG59KTtcbiIsIid1c2Ugc3RyaWN0Jztcbi8vIEIuMi4zLjYgU3RyaW5nLnByb3RvdHlwZS5maXhlZCgpXG5yZXF1aXJlKCcuL19zdHJpbmctaHRtbCcpKCdmaXhlZCcsIGZ1bmN0aW9uIChjcmVhdGVIVE1MKSB7XG4gIHJldHVybiBmdW5jdGlvbiBmaXhlZCgpIHtcbiAgICByZXR1cm4gY3JlYXRlSFRNTCh0aGlzLCAndHQnLCAnJywgJycpO1xuICB9O1xufSk7XG4iLCIndXNlIHN0cmljdCc7XG4vLyBCLjIuMy43IFN0cmluZy5wcm90b3R5cGUuZm9udGNvbG9yKGNvbG9yKVxucmVxdWlyZSgnLi9fc3RyaW5nLWh0bWwnKSgnZm9udGNvbG9yJywgZnVuY3Rpb24gKGNyZWF0ZUhUTUwpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIGZvbnRjb2xvcihjb2xvcikge1xuICAgIHJldHVybiBjcmVhdGVIVE1MKHRoaXMsICdmb250JywgJ2NvbG9yJywgY29sb3IpO1xuICB9O1xufSk7XG4iLCIndXNlIHN0cmljdCc7XG4vLyBCLjIuMy44IFN0cmluZy5wcm90b3R5cGUuZm9udHNpemUoc2l6ZSlcbnJlcXVpcmUoJy4vX3N0cmluZy1odG1sJykoJ2ZvbnRzaXplJywgZnVuY3Rpb24gKGNyZWF0ZUhUTUwpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIGZvbnRzaXplKHNpemUpIHtcbiAgICByZXR1cm4gY3JlYXRlSFRNTCh0aGlzLCAnZm9udCcsICdzaXplJywgc2l6ZSk7XG4gIH07XG59KTtcbiIsInZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgdG9BYnNvbHV0ZUluZGV4ID0gcmVxdWlyZSgnLi9fdG8tYWJzb2x1dGUtaW5kZXgnKTtcbnZhciBmcm9tQ2hhckNvZGUgPSBTdHJpbmcuZnJvbUNoYXJDb2RlO1xudmFyICRmcm9tQ29kZVBvaW50ID0gU3RyaW5nLmZyb21Db2RlUG9pbnQ7XG5cbi8vIGxlbmd0aCBzaG91bGQgYmUgMSwgb2xkIEZGIHByb2JsZW1cbiRleHBvcnQoJGV4cG9ydC5TICsgJGV4cG9ydC5GICogKCEhJGZyb21Db2RlUG9pbnQgJiYgJGZyb21Db2RlUG9pbnQubGVuZ3RoICE9IDEpLCAnU3RyaW5nJywge1xuICAvLyAyMS4xLjIuMiBTdHJpbmcuZnJvbUNvZGVQb2ludCguLi5jb2RlUG9pbnRzKVxuICBmcm9tQ29kZVBvaW50OiBmdW5jdGlvbiBmcm9tQ29kZVBvaW50KHgpIHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bnVzZWQtdmFyc1xuICAgIHZhciByZXMgPSBbXTtcbiAgICB2YXIgYUxlbiA9IGFyZ3VtZW50cy5sZW5ndGg7XG4gICAgdmFyIGkgPSAwO1xuICAgIHZhciBjb2RlO1xuICAgIHdoaWxlIChhTGVuID4gaSkge1xuICAgICAgY29kZSA9ICthcmd1bWVudHNbaSsrXTtcbiAgICAgIGlmICh0b0Fic29sdXRlSW5kZXgoY29kZSwgMHgxMGZmZmYpICE9PSBjb2RlKSB0aHJvdyBSYW5nZUVycm9yKGNvZGUgKyAnIGlzIG5vdCBhIHZhbGlkIGNvZGUgcG9pbnQnKTtcbiAgICAgIHJlcy5wdXNoKGNvZGUgPCAweDEwMDAwXG4gICAgICAgID8gZnJvbUNoYXJDb2RlKGNvZGUpXG4gICAgICAgIDogZnJvbUNoYXJDb2RlKCgoY29kZSAtPSAweDEwMDAwKSA+PiAxMCkgKyAweGQ4MDAsIGNvZGUgJSAweDQwMCArIDB4ZGMwMClcbiAgICAgICk7XG4gICAgfSByZXR1cm4gcmVzLmpvaW4oJycpO1xuICB9XG59KTtcbiIsIi8vIDIxLjEuMy43IFN0cmluZy5wcm90b3R5cGUuaW5jbHVkZXMoc2VhcmNoU3RyaW5nLCBwb3NpdGlvbiA9IDApXG4ndXNlIHN0cmljdCc7XG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyIGNvbnRleHQgPSByZXF1aXJlKCcuL19zdHJpbmctY29udGV4dCcpO1xudmFyIElOQ0xVREVTID0gJ2luY2x1ZGVzJztcblxuJGV4cG9ydCgkZXhwb3J0LlAgKyAkZXhwb3J0LkYgKiByZXF1aXJlKCcuL19mYWlscy1pcy1yZWdleHAnKShJTkNMVURFUyksICdTdHJpbmcnLCB7XG4gIGluY2x1ZGVzOiBmdW5jdGlvbiBpbmNsdWRlcyhzZWFyY2hTdHJpbmcgLyogLCBwb3NpdGlvbiA9IDAgKi8pIHtcbiAgICByZXR1cm4gISF+Y29udGV4dCh0aGlzLCBzZWFyY2hTdHJpbmcsIElOQ0xVREVTKVxuICAgICAgLmluZGV4T2Yoc2VhcmNoU3RyaW5nLCBhcmd1bWVudHMubGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IHVuZGVmaW5lZCk7XG4gIH1cbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xuLy8gQi4yLjMuOSBTdHJpbmcucHJvdG90eXBlLml0YWxpY3MoKVxucmVxdWlyZSgnLi9fc3RyaW5nLWh0bWwnKSgnaXRhbGljcycsIGZ1bmN0aW9uIChjcmVhdGVIVE1MKSB7XG4gIHJldHVybiBmdW5jdGlvbiBpdGFsaWNzKCkge1xuICAgIHJldHVybiBjcmVhdGVIVE1MKHRoaXMsICdpJywgJycsICcnKTtcbiAgfTtcbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyICRhdCA9IHJlcXVpcmUoJy4vX3N0cmluZy1hdCcpKHRydWUpO1xuXG4vLyAyMS4xLjMuMjcgU3RyaW5nLnByb3RvdHlwZVtAQGl0ZXJhdG9yXSgpXG5yZXF1aXJlKCcuL19pdGVyLWRlZmluZScpKFN0cmluZywgJ1N0cmluZycsIGZ1bmN0aW9uIChpdGVyYXRlZCkge1xuICB0aGlzLl90ID0gU3RyaW5nKGl0ZXJhdGVkKTsgLy8gdGFyZ2V0XG4gIHRoaXMuX2kgPSAwOyAgICAgICAgICAgICAgICAvLyBuZXh0IGluZGV4XG4vLyAyMS4xLjUuMi4xICVTdHJpbmdJdGVyYXRvclByb3RvdHlwZSUubmV4dCgpXG59LCBmdW5jdGlvbiAoKSB7XG4gIHZhciBPID0gdGhpcy5fdDtcbiAgdmFyIGluZGV4ID0gdGhpcy5faTtcbiAgdmFyIHBvaW50O1xuICBpZiAoaW5kZXggPj0gTy5sZW5ndGgpIHJldHVybiB7IHZhbHVlOiB1bmRlZmluZWQsIGRvbmU6IHRydWUgfTtcbiAgcG9pbnQgPSAkYXQoTywgaW5kZXgpO1xuICB0aGlzLl9pICs9IHBvaW50Lmxlbmd0aDtcbiAgcmV0dXJuIHsgdmFsdWU6IHBvaW50LCBkb25lOiBmYWxzZSB9O1xufSk7XG4iLCIndXNlIHN0cmljdCc7XG4vLyBCLjIuMy4xMCBTdHJpbmcucHJvdG90eXBlLmxpbmsodXJsKVxucmVxdWlyZSgnLi9fc3RyaW5nLWh0bWwnKSgnbGluaycsIGZ1bmN0aW9uIChjcmVhdGVIVE1MKSB7XG4gIHJldHVybiBmdW5jdGlvbiBsaW5rKHVybCkge1xuICAgIHJldHVybiBjcmVhdGVIVE1MKHRoaXMsICdhJywgJ2hyZWYnLCB1cmwpO1xuICB9O1xufSk7XG4iLCJ2YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyIHRvSU9iamVjdCA9IHJlcXVpcmUoJy4vX3RvLWlvYmplY3QnKTtcbnZhciB0b0xlbmd0aCA9IHJlcXVpcmUoJy4vX3RvLWxlbmd0aCcpO1xuXG4kZXhwb3J0KCRleHBvcnQuUywgJ1N0cmluZycsIHtcbiAgLy8gMjEuMS4yLjQgU3RyaW5nLnJhdyhjYWxsU2l0ZSwgLi4uc3Vic3RpdHV0aW9ucylcbiAgcmF3OiBmdW5jdGlvbiByYXcoY2FsbFNpdGUpIHtcbiAgICB2YXIgdHBsID0gdG9JT2JqZWN0KGNhbGxTaXRlLnJhdyk7XG4gICAgdmFyIGxlbiA9IHRvTGVuZ3RoKHRwbC5sZW5ndGgpO1xuICAgIHZhciBhTGVuID0gYXJndW1lbnRzLmxlbmd0aDtcbiAgICB2YXIgcmVzID0gW107XG4gICAgdmFyIGkgPSAwO1xuICAgIHdoaWxlIChsZW4gPiBpKSB7XG4gICAgICByZXMucHVzaChTdHJpbmcodHBsW2krK10pKTtcbiAgICAgIGlmIChpIDwgYUxlbikgcmVzLnB1c2goU3RyaW5nKGFyZ3VtZW50c1tpXSkpO1xuICAgIH0gcmV0dXJuIHJlcy5qb2luKCcnKTtcbiAgfVxufSk7XG4iLCJ2YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xuXG4kZXhwb3J0KCRleHBvcnQuUCwgJ1N0cmluZycsIHtcbiAgLy8gMjEuMS4zLjEzIFN0cmluZy5wcm90b3R5cGUucmVwZWF0KGNvdW50KVxuICByZXBlYXQ6IHJlcXVpcmUoJy4vX3N0cmluZy1yZXBlYXQnKVxufSk7XG4iLCIndXNlIHN0cmljdCc7XG4vLyBCLjIuMy4xMSBTdHJpbmcucHJvdG90eXBlLnNtYWxsKClcbnJlcXVpcmUoJy4vX3N0cmluZy1odG1sJykoJ3NtYWxsJywgZnVuY3Rpb24gKGNyZWF0ZUhUTUwpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIHNtYWxsKCkge1xuICAgIHJldHVybiBjcmVhdGVIVE1MKHRoaXMsICdzbWFsbCcsICcnLCAnJyk7XG4gIH07XG59KTtcbiIsIi8vIDIxLjEuMy4xOCBTdHJpbmcucHJvdG90eXBlLnN0YXJ0c1dpdGgoc2VhcmNoU3RyaW5nIFssIHBvc2l0aW9uIF0pXG4ndXNlIHN0cmljdCc7XG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyIHRvTGVuZ3RoID0gcmVxdWlyZSgnLi9fdG8tbGVuZ3RoJyk7XG52YXIgY29udGV4dCA9IHJlcXVpcmUoJy4vX3N0cmluZy1jb250ZXh0Jyk7XG52YXIgU1RBUlRTX1dJVEggPSAnc3RhcnRzV2l0aCc7XG52YXIgJHN0YXJ0c1dpdGggPSAnJ1tTVEFSVFNfV0lUSF07XG5cbiRleHBvcnQoJGV4cG9ydC5QICsgJGV4cG9ydC5GICogcmVxdWlyZSgnLi9fZmFpbHMtaXMtcmVnZXhwJykoU1RBUlRTX1dJVEgpLCAnU3RyaW5nJywge1xuICBzdGFydHNXaXRoOiBmdW5jdGlvbiBzdGFydHNXaXRoKHNlYXJjaFN0cmluZyAvKiAsIHBvc2l0aW9uID0gMCAqLykge1xuICAgIHZhciB0aGF0ID0gY29udGV4dCh0aGlzLCBzZWFyY2hTdHJpbmcsIFNUQVJUU19XSVRIKTtcbiAgICB2YXIgaW5kZXggPSB0b0xlbmd0aChNYXRoLm1pbihhcmd1bWVudHMubGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IHVuZGVmaW5lZCwgdGhhdC5sZW5ndGgpKTtcbiAgICB2YXIgc2VhcmNoID0gU3RyaW5nKHNlYXJjaFN0cmluZyk7XG4gICAgcmV0dXJuICRzdGFydHNXaXRoXG4gICAgICA/ICRzdGFydHNXaXRoLmNhbGwodGhhdCwgc2VhcmNoLCBpbmRleClcbiAgICAgIDogdGhhdC5zbGljZShpbmRleCwgaW5kZXggKyBzZWFyY2gubGVuZ3RoKSA9PT0gc2VhcmNoO1xuICB9XG59KTtcbiIsIid1c2Ugc3RyaWN0Jztcbi8vIEIuMi4zLjEyIFN0cmluZy5wcm90b3R5cGUuc3RyaWtlKClcbnJlcXVpcmUoJy4vX3N0cmluZy1odG1sJykoJ3N0cmlrZScsIGZ1bmN0aW9uIChjcmVhdGVIVE1MKSB7XG4gIHJldHVybiBmdW5jdGlvbiBzdHJpa2UoKSB7XG4gICAgcmV0dXJuIGNyZWF0ZUhUTUwodGhpcywgJ3N0cmlrZScsICcnLCAnJyk7XG4gIH07XG59KTtcbiIsIid1c2Ugc3RyaWN0Jztcbi8vIEIuMi4zLjEzIFN0cmluZy5wcm90b3R5cGUuc3ViKClcbnJlcXVpcmUoJy4vX3N0cmluZy1odG1sJykoJ3N1YicsIGZ1bmN0aW9uIChjcmVhdGVIVE1MKSB7XG4gIHJldHVybiBmdW5jdGlvbiBzdWIoKSB7XG4gICAgcmV0dXJuIGNyZWF0ZUhUTUwodGhpcywgJ3N1YicsICcnLCAnJyk7XG4gIH07XG59KTtcbiIsIid1c2Ugc3RyaWN0Jztcbi8vIEIuMi4zLjE0IFN0cmluZy5wcm90b3R5cGUuc3VwKClcbnJlcXVpcmUoJy4vX3N0cmluZy1odG1sJykoJ3N1cCcsIGZ1bmN0aW9uIChjcmVhdGVIVE1MKSB7XG4gIHJldHVybiBmdW5jdGlvbiBzdXAoKSB7XG4gICAgcmV0dXJuIGNyZWF0ZUhUTUwodGhpcywgJ3N1cCcsICcnLCAnJyk7XG4gIH07XG59KTtcbiIsIid1c2Ugc3RyaWN0Jztcbi8vIDIxLjEuMy4yNSBTdHJpbmcucHJvdG90eXBlLnRyaW0oKVxucmVxdWlyZSgnLi9fc3RyaW5nLXRyaW0nKSgndHJpbScsIGZ1bmN0aW9uICgkdHJpbSkge1xuICByZXR1cm4gZnVuY3Rpb24gdHJpbSgpIHtcbiAgICByZXR1cm4gJHRyaW0odGhpcywgMyk7XG4gIH07XG59KTtcbiIsIid1c2Ugc3RyaWN0Jztcbi8vIEVDTUFTY3JpcHQgNiBzeW1ib2xzIHNoaW1cbnZhciBnbG9iYWwgPSByZXF1aXJlKCcuL19nbG9iYWwnKTtcbnZhciBoYXMgPSByZXF1aXJlKCcuL19oYXMnKTtcbnZhciBERVNDUklQVE9SUyA9IHJlcXVpcmUoJy4vX2Rlc2NyaXB0b3JzJyk7XG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyIHJlZGVmaW5lID0gcmVxdWlyZSgnLi9fcmVkZWZpbmUnKTtcbnZhciBNRVRBID0gcmVxdWlyZSgnLi9fbWV0YScpLktFWTtcbnZhciAkZmFpbHMgPSByZXF1aXJlKCcuL19mYWlscycpO1xudmFyIHNoYXJlZCA9IHJlcXVpcmUoJy4vX3NoYXJlZCcpO1xudmFyIHNldFRvU3RyaW5nVGFnID0gcmVxdWlyZSgnLi9fc2V0LXRvLXN0cmluZy10YWcnKTtcbnZhciB1aWQgPSByZXF1aXJlKCcuL191aWQnKTtcbnZhciB3a3MgPSByZXF1aXJlKCcuL193a3MnKTtcbnZhciB3a3NFeHQgPSByZXF1aXJlKCcuL193a3MtZXh0Jyk7XG52YXIgd2tzRGVmaW5lID0gcmVxdWlyZSgnLi9fd2tzLWRlZmluZScpO1xudmFyIGVudW1LZXlzID0gcmVxdWlyZSgnLi9fZW51bS1rZXlzJyk7XG52YXIgaXNBcnJheSA9IHJlcXVpcmUoJy4vX2lzLWFycmF5Jyk7XG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuL19hbi1vYmplY3QnKTtcbnZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4vX2lzLW9iamVjdCcpO1xudmFyIHRvSU9iamVjdCA9IHJlcXVpcmUoJy4vX3RvLWlvYmplY3QnKTtcbnZhciB0b1ByaW1pdGl2ZSA9IHJlcXVpcmUoJy4vX3RvLXByaW1pdGl2ZScpO1xudmFyIGNyZWF0ZURlc2MgPSByZXF1aXJlKCcuL19wcm9wZXJ0eS1kZXNjJyk7XG52YXIgX2NyZWF0ZSA9IHJlcXVpcmUoJy4vX29iamVjdC1jcmVhdGUnKTtcbnZhciBnT1BORXh0ID0gcmVxdWlyZSgnLi9fb2JqZWN0LWdvcG4tZXh0Jyk7XG52YXIgJEdPUEQgPSByZXF1aXJlKCcuL19vYmplY3QtZ29wZCcpO1xudmFyICREUCA9IHJlcXVpcmUoJy4vX29iamVjdC1kcCcpO1xudmFyICRrZXlzID0gcmVxdWlyZSgnLi9fb2JqZWN0LWtleXMnKTtcbnZhciBnT1BEID0gJEdPUEQuZjtcbnZhciBkUCA9ICREUC5mO1xudmFyIGdPUE4gPSBnT1BORXh0LmY7XG52YXIgJFN5bWJvbCA9IGdsb2JhbC5TeW1ib2w7XG52YXIgJEpTT04gPSBnbG9iYWwuSlNPTjtcbnZhciBfc3RyaW5naWZ5ID0gJEpTT04gJiYgJEpTT04uc3RyaW5naWZ5O1xudmFyIFBST1RPVFlQRSA9ICdwcm90b3R5cGUnO1xudmFyIEhJRERFTiA9IHdrcygnX2hpZGRlbicpO1xudmFyIFRPX1BSSU1JVElWRSA9IHdrcygndG9QcmltaXRpdmUnKTtcbnZhciBpc0VudW0gPSB7fS5wcm9wZXJ0eUlzRW51bWVyYWJsZTtcbnZhciBTeW1ib2xSZWdpc3RyeSA9IHNoYXJlZCgnc3ltYm9sLXJlZ2lzdHJ5Jyk7XG52YXIgQWxsU3ltYm9scyA9IHNoYXJlZCgnc3ltYm9scycpO1xudmFyIE9QU3ltYm9scyA9IHNoYXJlZCgnb3Atc3ltYm9scycpO1xudmFyIE9iamVjdFByb3RvID0gT2JqZWN0W1BST1RPVFlQRV07XG52YXIgVVNFX05BVElWRSA9IHR5cGVvZiAkU3ltYm9sID09ICdmdW5jdGlvbic7XG52YXIgUU9iamVjdCA9IGdsb2JhbC5RT2JqZWN0O1xuLy8gRG9uJ3QgdXNlIHNldHRlcnMgaW4gUXQgU2NyaXB0LCBodHRwczovL2dpdGh1Yi5jb20vemxvaXJvY2svY29yZS1qcy9pc3N1ZXMvMTczXG52YXIgc2V0dGVyID0gIVFPYmplY3QgfHwgIVFPYmplY3RbUFJPVE9UWVBFXSB8fCAhUU9iamVjdFtQUk9UT1RZUEVdLmZpbmRDaGlsZDtcblxuLy8gZmFsbGJhY2sgZm9yIG9sZCBBbmRyb2lkLCBodHRwczovL2NvZGUuZ29vZ2xlLmNvbS9wL3Y4L2lzc3Vlcy9kZXRhaWw/aWQ9Njg3XG52YXIgc2V0U3ltYm9sRGVzYyA9IERFU0NSSVBUT1JTICYmICRmYWlscyhmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBfY3JlYXRlKGRQKHt9LCAnYScsIHtcbiAgICBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGRQKHRoaXMsICdhJywgeyB2YWx1ZTogNyB9KS5hOyB9XG4gIH0pKS5hICE9IDc7XG59KSA/IGZ1bmN0aW9uIChpdCwga2V5LCBEKSB7XG4gIHZhciBwcm90b0Rlc2MgPSBnT1BEKE9iamVjdFByb3RvLCBrZXkpO1xuICBpZiAocHJvdG9EZXNjKSBkZWxldGUgT2JqZWN0UHJvdG9ba2V5XTtcbiAgZFAoaXQsIGtleSwgRCk7XG4gIGlmIChwcm90b0Rlc2MgJiYgaXQgIT09IE9iamVjdFByb3RvKSBkUChPYmplY3RQcm90bywga2V5LCBwcm90b0Rlc2MpO1xufSA6IGRQO1xuXG52YXIgd3JhcCA9IGZ1bmN0aW9uICh0YWcpIHtcbiAgdmFyIHN5bSA9IEFsbFN5bWJvbHNbdGFnXSA9IF9jcmVhdGUoJFN5bWJvbFtQUk9UT1RZUEVdKTtcbiAgc3ltLl9rID0gdGFnO1xuICByZXR1cm4gc3ltO1xufTtcblxudmFyIGlzU3ltYm9sID0gVVNFX05BVElWRSAmJiB0eXBlb2YgJFN5bWJvbC5pdGVyYXRvciA9PSAnc3ltYm9sJyA/IGZ1bmN0aW9uIChpdCkge1xuICByZXR1cm4gdHlwZW9mIGl0ID09ICdzeW1ib2wnO1xufSA6IGZ1bmN0aW9uIChpdCkge1xuICByZXR1cm4gaXQgaW5zdGFuY2VvZiAkU3ltYm9sO1xufTtcblxudmFyICRkZWZpbmVQcm9wZXJ0eSA9IGZ1bmN0aW9uIGRlZmluZVByb3BlcnR5KGl0LCBrZXksIEQpIHtcbiAgaWYgKGl0ID09PSBPYmplY3RQcm90bykgJGRlZmluZVByb3BlcnR5KE9QU3ltYm9scywga2V5LCBEKTtcbiAgYW5PYmplY3QoaXQpO1xuICBrZXkgPSB0b1ByaW1pdGl2ZShrZXksIHRydWUpO1xuICBhbk9iamVjdChEKTtcbiAgaWYgKGhhcyhBbGxTeW1ib2xzLCBrZXkpKSB7XG4gICAgaWYgKCFELmVudW1lcmFibGUpIHtcbiAgICAgIGlmICghaGFzKGl0LCBISURERU4pKSBkUChpdCwgSElEREVOLCBjcmVhdGVEZXNjKDEsIHt9KSk7XG4gICAgICBpdFtISURERU5dW2tleV0gPSB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoaGFzKGl0LCBISURERU4pICYmIGl0W0hJRERFTl1ba2V5XSkgaXRbSElEREVOXVtrZXldID0gZmFsc2U7XG4gICAgICBEID0gX2NyZWF0ZShELCB7IGVudW1lcmFibGU6IGNyZWF0ZURlc2MoMCwgZmFsc2UpIH0pO1xuICAgIH0gcmV0dXJuIHNldFN5bWJvbERlc2MoaXQsIGtleSwgRCk7XG4gIH0gcmV0dXJuIGRQKGl0LCBrZXksIEQpO1xufTtcbnZhciAkZGVmaW5lUHJvcGVydGllcyA9IGZ1bmN0aW9uIGRlZmluZVByb3BlcnRpZXMoaXQsIFApIHtcbiAgYW5PYmplY3QoaXQpO1xuICB2YXIga2V5cyA9IGVudW1LZXlzKFAgPSB0b0lPYmplY3QoUCkpO1xuICB2YXIgaSA9IDA7XG4gIHZhciBsID0ga2V5cy5sZW5ndGg7XG4gIHZhciBrZXk7XG4gIHdoaWxlIChsID4gaSkgJGRlZmluZVByb3BlcnR5KGl0LCBrZXkgPSBrZXlzW2krK10sIFBba2V5XSk7XG4gIHJldHVybiBpdDtcbn07XG52YXIgJGNyZWF0ZSA9IGZ1bmN0aW9uIGNyZWF0ZShpdCwgUCkge1xuICByZXR1cm4gUCA9PT0gdW5kZWZpbmVkID8gX2NyZWF0ZShpdCkgOiAkZGVmaW5lUHJvcGVydGllcyhfY3JlYXRlKGl0KSwgUCk7XG59O1xudmFyICRwcm9wZXJ0eUlzRW51bWVyYWJsZSA9IGZ1bmN0aW9uIHByb3BlcnR5SXNFbnVtZXJhYmxlKGtleSkge1xuICB2YXIgRSA9IGlzRW51bS5jYWxsKHRoaXMsIGtleSA9IHRvUHJpbWl0aXZlKGtleSwgdHJ1ZSkpO1xuICBpZiAodGhpcyA9PT0gT2JqZWN0UHJvdG8gJiYgaGFzKEFsbFN5bWJvbHMsIGtleSkgJiYgIWhhcyhPUFN5bWJvbHMsIGtleSkpIHJldHVybiBmYWxzZTtcbiAgcmV0dXJuIEUgfHwgIWhhcyh0aGlzLCBrZXkpIHx8ICFoYXMoQWxsU3ltYm9scywga2V5KSB8fCBoYXModGhpcywgSElEREVOKSAmJiB0aGlzW0hJRERFTl1ba2V5XSA/IEUgOiB0cnVlO1xufTtcbnZhciAkZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yID0gZnVuY3Rpb24gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGl0LCBrZXkpIHtcbiAgaXQgPSB0b0lPYmplY3QoaXQpO1xuICBrZXkgPSB0b1ByaW1pdGl2ZShrZXksIHRydWUpO1xuICBpZiAoaXQgPT09IE9iamVjdFByb3RvICYmIGhhcyhBbGxTeW1ib2xzLCBrZXkpICYmICFoYXMoT1BTeW1ib2xzLCBrZXkpKSByZXR1cm47XG4gIHZhciBEID0gZ09QRChpdCwga2V5KTtcbiAgaWYgKEQgJiYgaGFzKEFsbFN5bWJvbHMsIGtleSkgJiYgIShoYXMoaXQsIEhJRERFTikgJiYgaXRbSElEREVOXVtrZXldKSkgRC5lbnVtZXJhYmxlID0gdHJ1ZTtcbiAgcmV0dXJuIEQ7XG59O1xudmFyICRnZXRPd25Qcm9wZXJ0eU5hbWVzID0gZnVuY3Rpb24gZ2V0T3duUHJvcGVydHlOYW1lcyhpdCkge1xuICB2YXIgbmFtZXMgPSBnT1BOKHRvSU9iamVjdChpdCkpO1xuICB2YXIgcmVzdWx0ID0gW107XG4gIHZhciBpID0gMDtcbiAgdmFyIGtleTtcbiAgd2hpbGUgKG5hbWVzLmxlbmd0aCA+IGkpIHtcbiAgICBpZiAoIWhhcyhBbGxTeW1ib2xzLCBrZXkgPSBuYW1lc1tpKytdKSAmJiBrZXkgIT0gSElEREVOICYmIGtleSAhPSBNRVRBKSByZXN1bHQucHVzaChrZXkpO1xuICB9IHJldHVybiByZXN1bHQ7XG59O1xudmFyICRnZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPSBmdW5jdGlvbiBnZXRPd25Qcm9wZXJ0eVN5bWJvbHMoaXQpIHtcbiAgdmFyIElTX09QID0gaXQgPT09IE9iamVjdFByb3RvO1xuICB2YXIgbmFtZXMgPSBnT1BOKElTX09QID8gT1BTeW1ib2xzIDogdG9JT2JqZWN0KGl0KSk7XG4gIHZhciByZXN1bHQgPSBbXTtcbiAgdmFyIGkgPSAwO1xuICB2YXIga2V5O1xuICB3aGlsZSAobmFtZXMubGVuZ3RoID4gaSkge1xuICAgIGlmIChoYXMoQWxsU3ltYm9scywga2V5ID0gbmFtZXNbaSsrXSkgJiYgKElTX09QID8gaGFzKE9iamVjdFByb3RvLCBrZXkpIDogdHJ1ZSkpIHJlc3VsdC5wdXNoKEFsbFN5bWJvbHNba2V5XSk7XG4gIH0gcmV0dXJuIHJlc3VsdDtcbn07XG5cbi8vIDE5LjQuMS4xIFN5bWJvbChbZGVzY3JpcHRpb25dKVxuaWYgKCFVU0VfTkFUSVZFKSB7XG4gICRTeW1ib2wgPSBmdW5jdGlvbiBTeW1ib2woKSB7XG4gICAgaWYgKHRoaXMgaW5zdGFuY2VvZiAkU3ltYm9sKSB0aHJvdyBUeXBlRXJyb3IoJ1N5bWJvbCBpcyBub3QgYSBjb25zdHJ1Y3RvciEnKTtcbiAgICB2YXIgdGFnID0gdWlkKGFyZ3VtZW50cy5sZW5ndGggPiAwID8gYXJndW1lbnRzWzBdIDogdW5kZWZpbmVkKTtcbiAgICB2YXIgJHNldCA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgaWYgKHRoaXMgPT09IE9iamVjdFByb3RvKSAkc2V0LmNhbGwoT1BTeW1ib2xzLCB2YWx1ZSk7XG4gICAgICBpZiAoaGFzKHRoaXMsIEhJRERFTikgJiYgaGFzKHRoaXNbSElEREVOXSwgdGFnKSkgdGhpc1tISURERU5dW3RhZ10gPSBmYWxzZTtcbiAgICAgIHNldFN5bWJvbERlc2ModGhpcywgdGFnLCBjcmVhdGVEZXNjKDEsIHZhbHVlKSk7XG4gICAgfTtcbiAgICBpZiAoREVTQ1JJUFRPUlMgJiYgc2V0dGVyKSBzZXRTeW1ib2xEZXNjKE9iamVjdFByb3RvLCB0YWcsIHsgY29uZmlndXJhYmxlOiB0cnVlLCBzZXQ6ICRzZXQgfSk7XG4gICAgcmV0dXJuIHdyYXAodGFnKTtcbiAgfTtcbiAgcmVkZWZpbmUoJFN5bWJvbFtQUk9UT1RZUEVdLCAndG9TdHJpbmcnLCBmdW5jdGlvbiB0b1N0cmluZygpIHtcbiAgICByZXR1cm4gdGhpcy5faztcbiAgfSk7XG5cbiAgJEdPUEQuZiA9ICRnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I7XG4gICREUC5mID0gJGRlZmluZVByb3BlcnR5O1xuICByZXF1aXJlKCcuL19vYmplY3QtZ29wbicpLmYgPSBnT1BORXh0LmYgPSAkZ2V0T3duUHJvcGVydHlOYW1lcztcbiAgcmVxdWlyZSgnLi9fb2JqZWN0LXBpZScpLmYgPSAkcHJvcGVydHlJc0VudW1lcmFibGU7XG4gIHJlcXVpcmUoJy4vX29iamVjdC1nb3BzJykuZiA9ICRnZXRPd25Qcm9wZXJ0eVN5bWJvbHM7XG5cbiAgaWYgKERFU0NSSVBUT1JTICYmICFyZXF1aXJlKCcuL19saWJyYXJ5JykpIHtcbiAgICByZWRlZmluZShPYmplY3RQcm90bywgJ3Byb3BlcnR5SXNFbnVtZXJhYmxlJywgJHByb3BlcnR5SXNFbnVtZXJhYmxlLCB0cnVlKTtcbiAgfVxuXG4gIHdrc0V4dC5mID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgICByZXR1cm4gd3JhcCh3a3MobmFtZSkpO1xuICB9O1xufVxuXG4kZXhwb3J0KCRleHBvcnQuRyArICRleHBvcnQuVyArICRleHBvcnQuRiAqICFVU0VfTkFUSVZFLCB7IFN5bWJvbDogJFN5bWJvbCB9KTtcblxuZm9yICh2YXIgZXM2U3ltYm9scyA9IChcbiAgLy8gMTkuNC4yLjIsIDE5LjQuMi4zLCAxOS40LjIuNCwgMTkuNC4yLjYsIDE5LjQuMi44LCAxOS40LjIuOSwgMTkuNC4yLjEwLCAxOS40LjIuMTEsIDE5LjQuMi4xMiwgMTkuNC4yLjEzLCAxOS40LjIuMTRcbiAgJ2hhc0luc3RhbmNlLGlzQ29uY2F0U3ByZWFkYWJsZSxpdGVyYXRvcixtYXRjaCxyZXBsYWNlLHNlYXJjaCxzcGVjaWVzLHNwbGl0LHRvUHJpbWl0aXZlLHRvU3RyaW5nVGFnLHVuc2NvcGFibGVzJ1xuKS5zcGxpdCgnLCcpLCBqID0gMDsgZXM2U3ltYm9scy5sZW5ndGggPiBqOyl3a3MoZXM2U3ltYm9sc1tqKytdKTtcblxuZm9yICh2YXIgd2VsbEtub3duU3ltYm9scyA9ICRrZXlzKHdrcy5zdG9yZSksIGsgPSAwOyB3ZWxsS25vd25TeW1ib2xzLmxlbmd0aCA+IGs7KSB3a3NEZWZpbmUod2VsbEtub3duU3ltYm9sc1trKytdKTtcblxuJGV4cG9ydCgkZXhwb3J0LlMgKyAkZXhwb3J0LkYgKiAhVVNFX05BVElWRSwgJ1N5bWJvbCcsIHtcbiAgLy8gMTkuNC4yLjEgU3ltYm9sLmZvcihrZXkpXG4gICdmb3InOiBmdW5jdGlvbiAoa2V5KSB7XG4gICAgcmV0dXJuIGhhcyhTeW1ib2xSZWdpc3RyeSwga2V5ICs9ICcnKVxuICAgICAgPyBTeW1ib2xSZWdpc3RyeVtrZXldXG4gICAgICA6IFN5bWJvbFJlZ2lzdHJ5W2tleV0gPSAkU3ltYm9sKGtleSk7XG4gIH0sXG4gIC8vIDE5LjQuMi41IFN5bWJvbC5rZXlGb3Ioc3ltKVxuICBrZXlGb3I6IGZ1bmN0aW9uIGtleUZvcihzeW0pIHtcbiAgICBpZiAoIWlzU3ltYm9sKHN5bSkpIHRocm93IFR5cGVFcnJvcihzeW0gKyAnIGlzIG5vdCBhIHN5bWJvbCEnKTtcbiAgICBmb3IgKHZhciBrZXkgaW4gU3ltYm9sUmVnaXN0cnkpIGlmIChTeW1ib2xSZWdpc3RyeVtrZXldID09PSBzeW0pIHJldHVybiBrZXk7XG4gIH0sXG4gIHVzZVNldHRlcjogZnVuY3Rpb24gKCkgeyBzZXR0ZXIgPSB0cnVlOyB9LFxuICB1c2VTaW1wbGU6IGZ1bmN0aW9uICgpIHsgc2V0dGVyID0gZmFsc2U7IH1cbn0pO1xuXG4kZXhwb3J0KCRleHBvcnQuUyArICRleHBvcnQuRiAqICFVU0VfTkFUSVZFLCAnT2JqZWN0Jywge1xuICAvLyAxOS4xLjIuMiBPYmplY3QuY3JlYXRlKE8gWywgUHJvcGVydGllc10pXG4gIGNyZWF0ZTogJGNyZWF0ZSxcbiAgLy8gMTkuMS4yLjQgT2JqZWN0LmRlZmluZVByb3BlcnR5KE8sIFAsIEF0dHJpYnV0ZXMpXG4gIGRlZmluZVByb3BlcnR5OiAkZGVmaW5lUHJvcGVydHksXG4gIC8vIDE5LjEuMi4zIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKE8sIFByb3BlcnRpZXMpXG4gIGRlZmluZVByb3BlcnRpZXM6ICRkZWZpbmVQcm9wZXJ0aWVzLFxuICAvLyAxOS4xLjIuNiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKE8sIFApXG4gIGdldE93blByb3BlcnR5RGVzY3JpcHRvcjogJGdldE93blByb3BlcnR5RGVzY3JpcHRvcixcbiAgLy8gMTkuMS4yLjcgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoTylcbiAgZ2V0T3duUHJvcGVydHlOYW1lczogJGdldE93blByb3BlcnR5TmFtZXMsXG4gIC8vIDE5LjEuMi44IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMoTylcbiAgZ2V0T3duUHJvcGVydHlTeW1ib2xzOiAkZ2V0T3duUHJvcGVydHlTeW1ib2xzXG59KTtcblxuLy8gMjQuMy4yIEpTT04uc3RyaW5naWZ5KHZhbHVlIFssIHJlcGxhY2VyIFssIHNwYWNlXV0pXG4kSlNPTiAmJiAkZXhwb3J0KCRleHBvcnQuUyArICRleHBvcnQuRiAqICghVVNFX05BVElWRSB8fCAkZmFpbHMoZnVuY3Rpb24gKCkge1xuICB2YXIgUyA9ICRTeW1ib2woKTtcbiAgLy8gTVMgRWRnZSBjb252ZXJ0cyBzeW1ib2wgdmFsdWVzIHRvIEpTT04gYXMge31cbiAgLy8gV2ViS2l0IGNvbnZlcnRzIHN5bWJvbCB2YWx1ZXMgdG8gSlNPTiBhcyBudWxsXG4gIC8vIFY4IHRocm93cyBvbiBib3hlZCBzeW1ib2xzXG4gIHJldHVybiBfc3RyaW5naWZ5KFtTXSkgIT0gJ1tudWxsXScgfHwgX3N0cmluZ2lmeSh7IGE6IFMgfSkgIT0gJ3t9JyB8fCBfc3RyaW5naWZ5KE9iamVjdChTKSkgIT0gJ3t9Jztcbn0pKSwgJ0pTT04nLCB7XG4gIHN0cmluZ2lmeTogZnVuY3Rpb24gc3RyaW5naWZ5KGl0KSB7XG4gICAgdmFyIGFyZ3MgPSBbaXRdO1xuICAgIHZhciBpID0gMTtcbiAgICB2YXIgcmVwbGFjZXIsICRyZXBsYWNlcjtcbiAgICB3aGlsZSAoYXJndW1lbnRzLmxlbmd0aCA+IGkpIGFyZ3MucHVzaChhcmd1bWVudHNbaSsrXSk7XG4gICAgJHJlcGxhY2VyID0gcmVwbGFjZXIgPSBhcmdzWzFdO1xuICAgIGlmICghaXNPYmplY3QocmVwbGFjZXIpICYmIGl0ID09PSB1bmRlZmluZWQgfHwgaXNTeW1ib2woaXQpKSByZXR1cm47IC8vIElFOCByZXR1cm5zIHN0cmluZyBvbiB1bmRlZmluZWRcbiAgICBpZiAoIWlzQXJyYXkocmVwbGFjZXIpKSByZXBsYWNlciA9IGZ1bmN0aW9uIChrZXksIHZhbHVlKSB7XG4gICAgICBpZiAodHlwZW9mICRyZXBsYWNlciA9PSAnZnVuY3Rpb24nKSB2YWx1ZSA9ICRyZXBsYWNlci5jYWxsKHRoaXMsIGtleSwgdmFsdWUpO1xuICAgICAgaWYgKCFpc1N5bWJvbCh2YWx1ZSkpIHJldHVybiB2YWx1ZTtcbiAgICB9O1xuICAgIGFyZ3NbMV0gPSByZXBsYWNlcjtcbiAgICByZXR1cm4gX3N0cmluZ2lmeS5hcHBseSgkSlNPTiwgYXJncyk7XG4gIH1cbn0pO1xuXG4vLyAxOS40LjMuNCBTeW1ib2wucHJvdG90eXBlW0BAdG9QcmltaXRpdmVdKGhpbnQpXG4kU3ltYm9sW1BST1RPVFlQRV1bVE9fUFJJTUlUSVZFXSB8fCByZXF1aXJlKCcuL19oaWRlJykoJFN5bWJvbFtQUk9UT1RZUEVdLCBUT19QUklNSVRJVkUsICRTeW1ib2xbUFJPVE9UWVBFXS52YWx1ZU9mKTtcbi8vIDE5LjQuMy41IFN5bWJvbC5wcm90b3R5cGVbQEB0b1N0cmluZ1RhZ11cbnNldFRvU3RyaW5nVGFnKCRTeW1ib2wsICdTeW1ib2wnKTtcbi8vIDIwLjIuMS45IE1hdGhbQEB0b1N0cmluZ1RhZ11cbnNldFRvU3RyaW5nVGFnKE1hdGgsICdNYXRoJywgdHJ1ZSk7XG4vLyAyNC4zLjMgSlNPTltAQHRvU3RyaW5nVGFnXVxuc2V0VG9TdHJpbmdUYWcoZ2xvYmFsLkpTT04sICdKU09OJywgdHJ1ZSk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyICR0eXBlZCA9IHJlcXVpcmUoJy4vX3R5cGVkJyk7XG52YXIgYnVmZmVyID0gcmVxdWlyZSgnLi9fdHlwZWQtYnVmZmVyJyk7XG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuL19hbi1vYmplY3QnKTtcbnZhciB0b0Fic29sdXRlSW5kZXggPSByZXF1aXJlKCcuL190by1hYnNvbHV0ZS1pbmRleCcpO1xudmFyIHRvTGVuZ3RoID0gcmVxdWlyZSgnLi9fdG8tbGVuZ3RoJyk7XG52YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuL19pcy1vYmplY3QnKTtcbnZhciBBcnJheUJ1ZmZlciA9IHJlcXVpcmUoJy4vX2dsb2JhbCcpLkFycmF5QnVmZmVyO1xudmFyIHNwZWNpZXNDb25zdHJ1Y3RvciA9IHJlcXVpcmUoJy4vX3NwZWNpZXMtY29uc3RydWN0b3InKTtcbnZhciAkQXJyYXlCdWZmZXIgPSBidWZmZXIuQXJyYXlCdWZmZXI7XG52YXIgJERhdGFWaWV3ID0gYnVmZmVyLkRhdGFWaWV3O1xudmFyICRpc1ZpZXcgPSAkdHlwZWQuQUJWICYmIEFycmF5QnVmZmVyLmlzVmlldztcbnZhciAkc2xpY2UgPSAkQXJyYXlCdWZmZXIucHJvdG90eXBlLnNsaWNlO1xudmFyIFZJRVcgPSAkdHlwZWQuVklFVztcbnZhciBBUlJBWV9CVUZGRVIgPSAnQXJyYXlCdWZmZXInO1xuXG4kZXhwb3J0KCRleHBvcnQuRyArICRleHBvcnQuVyArICRleHBvcnQuRiAqIChBcnJheUJ1ZmZlciAhPT0gJEFycmF5QnVmZmVyKSwgeyBBcnJheUJ1ZmZlcjogJEFycmF5QnVmZmVyIH0pO1xuXG4kZXhwb3J0KCRleHBvcnQuUyArICRleHBvcnQuRiAqICEkdHlwZWQuQ09OU1RSLCBBUlJBWV9CVUZGRVIsIHtcbiAgLy8gMjQuMS4zLjEgQXJyYXlCdWZmZXIuaXNWaWV3KGFyZylcbiAgaXNWaWV3OiBmdW5jdGlvbiBpc1ZpZXcoaXQpIHtcbiAgICByZXR1cm4gJGlzVmlldyAmJiAkaXNWaWV3KGl0KSB8fCBpc09iamVjdChpdCkgJiYgVklFVyBpbiBpdDtcbiAgfVxufSk7XG5cbiRleHBvcnQoJGV4cG9ydC5QICsgJGV4cG9ydC5VICsgJGV4cG9ydC5GICogcmVxdWlyZSgnLi9fZmFpbHMnKShmdW5jdGlvbiAoKSB7XG4gIHJldHVybiAhbmV3ICRBcnJheUJ1ZmZlcigyKS5zbGljZSgxLCB1bmRlZmluZWQpLmJ5dGVMZW5ndGg7XG59KSwgQVJSQVlfQlVGRkVSLCB7XG4gIC8vIDI0LjEuNC4zIEFycmF5QnVmZmVyLnByb3RvdHlwZS5zbGljZShzdGFydCwgZW5kKVxuICBzbGljZTogZnVuY3Rpb24gc2xpY2Uoc3RhcnQsIGVuZCkge1xuICAgIGlmICgkc2xpY2UgIT09IHVuZGVmaW5lZCAmJiBlbmQgPT09IHVuZGVmaW5lZCkgcmV0dXJuICRzbGljZS5jYWxsKGFuT2JqZWN0KHRoaXMpLCBzdGFydCk7IC8vIEZGIGZpeFxuICAgIHZhciBsZW4gPSBhbk9iamVjdCh0aGlzKS5ieXRlTGVuZ3RoO1xuICAgIHZhciBmaXJzdCA9IHRvQWJzb2x1dGVJbmRleChzdGFydCwgbGVuKTtcbiAgICB2YXIgZmluYWwgPSB0b0Fic29sdXRlSW5kZXgoZW5kID09PSB1bmRlZmluZWQgPyBsZW4gOiBlbmQsIGxlbik7XG4gICAgdmFyIHJlc3VsdCA9IG5ldyAoc3BlY2llc0NvbnN0cnVjdG9yKHRoaXMsICRBcnJheUJ1ZmZlcikpKHRvTGVuZ3RoKGZpbmFsIC0gZmlyc3QpKTtcbiAgICB2YXIgdmlld1MgPSBuZXcgJERhdGFWaWV3KHRoaXMpO1xuICAgIHZhciB2aWV3VCA9IG5ldyAkRGF0YVZpZXcocmVzdWx0KTtcbiAgICB2YXIgaW5kZXggPSAwO1xuICAgIHdoaWxlIChmaXJzdCA8IGZpbmFsKSB7XG4gICAgICB2aWV3VC5zZXRVaW50OChpbmRleCsrLCB2aWV3Uy5nZXRVaW50OChmaXJzdCsrKSk7XG4gICAgfSByZXR1cm4gcmVzdWx0O1xuICB9XG59KTtcblxucmVxdWlyZSgnLi9fc2V0LXNwZWNpZXMnKShBUlJBWV9CVUZGRVIpO1xuIiwidmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbiRleHBvcnQoJGV4cG9ydC5HICsgJGV4cG9ydC5XICsgJGV4cG9ydC5GICogIXJlcXVpcmUoJy4vX3R5cGVkJykuQUJWLCB7XG4gIERhdGFWaWV3OiByZXF1aXJlKCcuL190eXBlZC1idWZmZXInKS5EYXRhVmlld1xufSk7XG4iLCJyZXF1aXJlKCcuL190eXBlZC1hcnJheScpKCdGbG9hdDMyJywgNCwgZnVuY3Rpb24gKGluaXQpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIEZsb2F0MzJBcnJheShkYXRhLCBieXRlT2Zmc2V0LCBsZW5ndGgpIHtcbiAgICByZXR1cm4gaW5pdCh0aGlzLCBkYXRhLCBieXRlT2Zmc2V0LCBsZW5ndGgpO1xuICB9O1xufSk7XG4iLCJyZXF1aXJlKCcuL190eXBlZC1hcnJheScpKCdGbG9hdDY0JywgOCwgZnVuY3Rpb24gKGluaXQpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIEZsb2F0NjRBcnJheShkYXRhLCBieXRlT2Zmc2V0LCBsZW5ndGgpIHtcbiAgICByZXR1cm4gaW5pdCh0aGlzLCBkYXRhLCBieXRlT2Zmc2V0LCBsZW5ndGgpO1xuICB9O1xufSk7XG4iLCJyZXF1aXJlKCcuL190eXBlZC1hcnJheScpKCdJbnQxNicsIDIsIGZ1bmN0aW9uIChpbml0KSB7XG4gIHJldHVybiBmdW5jdGlvbiBJbnQxNkFycmF5KGRhdGEsIGJ5dGVPZmZzZXQsIGxlbmd0aCkge1xuICAgIHJldHVybiBpbml0KHRoaXMsIGRhdGEsIGJ5dGVPZmZzZXQsIGxlbmd0aCk7XG4gIH07XG59KTtcbiIsInJlcXVpcmUoJy4vX3R5cGVkLWFycmF5JykoJ0ludDMyJywgNCwgZnVuY3Rpb24gKGluaXQpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIEludDMyQXJyYXkoZGF0YSwgYnl0ZU9mZnNldCwgbGVuZ3RoKSB7XG4gICAgcmV0dXJuIGluaXQodGhpcywgZGF0YSwgYnl0ZU9mZnNldCwgbGVuZ3RoKTtcbiAgfTtcbn0pO1xuIiwicmVxdWlyZSgnLi9fdHlwZWQtYXJyYXknKSgnSW50OCcsIDEsIGZ1bmN0aW9uIChpbml0KSB7XG4gIHJldHVybiBmdW5jdGlvbiBJbnQ4QXJyYXkoZGF0YSwgYnl0ZU9mZnNldCwgbGVuZ3RoKSB7XG4gICAgcmV0dXJuIGluaXQodGhpcywgZGF0YSwgYnl0ZU9mZnNldCwgbGVuZ3RoKTtcbiAgfTtcbn0pO1xuIiwicmVxdWlyZSgnLi9fdHlwZWQtYXJyYXknKSgnVWludDE2JywgMiwgZnVuY3Rpb24gKGluaXQpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIFVpbnQxNkFycmF5KGRhdGEsIGJ5dGVPZmZzZXQsIGxlbmd0aCkge1xuICAgIHJldHVybiBpbml0KHRoaXMsIGRhdGEsIGJ5dGVPZmZzZXQsIGxlbmd0aCk7XG4gIH07XG59KTtcbiIsInJlcXVpcmUoJy4vX3R5cGVkLWFycmF5JykoJ1VpbnQzMicsIDQsIGZ1bmN0aW9uIChpbml0KSB7XG4gIHJldHVybiBmdW5jdGlvbiBVaW50MzJBcnJheShkYXRhLCBieXRlT2Zmc2V0LCBsZW5ndGgpIHtcbiAgICByZXR1cm4gaW5pdCh0aGlzLCBkYXRhLCBieXRlT2Zmc2V0LCBsZW5ndGgpO1xuICB9O1xufSk7XG4iLCJyZXF1aXJlKCcuL190eXBlZC1hcnJheScpKCdVaW50OCcsIDEsIGZ1bmN0aW9uIChpbml0KSB7XG4gIHJldHVybiBmdW5jdGlvbiBVaW50OEFycmF5KGRhdGEsIGJ5dGVPZmZzZXQsIGxlbmd0aCkge1xuICAgIHJldHVybiBpbml0KHRoaXMsIGRhdGEsIGJ5dGVPZmZzZXQsIGxlbmd0aCk7XG4gIH07XG59KTtcbiIsInJlcXVpcmUoJy4vX3R5cGVkLWFycmF5JykoJ1VpbnQ4JywgMSwgZnVuY3Rpb24gKGluaXQpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIFVpbnQ4Q2xhbXBlZEFycmF5KGRhdGEsIGJ5dGVPZmZzZXQsIGxlbmd0aCkge1xuICAgIHJldHVybiBpbml0KHRoaXMsIGRhdGEsIGJ5dGVPZmZzZXQsIGxlbmd0aCk7XG4gIH07XG59LCB0cnVlKTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBlYWNoID0gcmVxdWlyZSgnLi9fYXJyYXktbWV0aG9kcycpKDApO1xudmFyIHJlZGVmaW5lID0gcmVxdWlyZSgnLi9fcmVkZWZpbmUnKTtcbnZhciBtZXRhID0gcmVxdWlyZSgnLi9fbWV0YScpO1xudmFyIGFzc2lnbiA9IHJlcXVpcmUoJy4vX29iamVjdC1hc3NpZ24nKTtcbnZhciB3ZWFrID0gcmVxdWlyZSgnLi9fY29sbGVjdGlvbi13ZWFrJyk7XG52YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuL19pcy1vYmplY3QnKTtcbnZhciBmYWlscyA9IHJlcXVpcmUoJy4vX2ZhaWxzJyk7XG52YXIgdmFsaWRhdGUgPSByZXF1aXJlKCcuL192YWxpZGF0ZS1jb2xsZWN0aW9uJyk7XG52YXIgV0VBS19NQVAgPSAnV2Vha01hcCc7XG52YXIgZ2V0V2VhayA9IG1ldGEuZ2V0V2VhaztcbnZhciBpc0V4dGVuc2libGUgPSBPYmplY3QuaXNFeHRlbnNpYmxlO1xudmFyIHVuY2F1Z2h0RnJvemVuU3RvcmUgPSB3ZWFrLnVmc3RvcmU7XG52YXIgdG1wID0ge307XG52YXIgSW50ZXJuYWxNYXA7XG5cbnZhciB3cmFwcGVyID0gZnVuY3Rpb24gKGdldCkge1xuICByZXR1cm4gZnVuY3Rpb24gV2Vha01hcCgpIHtcbiAgICByZXR1cm4gZ2V0KHRoaXMsIGFyZ3VtZW50cy5sZW5ndGggPiAwID8gYXJndW1lbnRzWzBdIDogdW5kZWZpbmVkKTtcbiAgfTtcbn07XG5cbnZhciBtZXRob2RzID0ge1xuICAvLyAyMy4zLjMuMyBXZWFrTWFwLnByb3RvdHlwZS5nZXQoa2V5KVxuICBnZXQ6IGZ1bmN0aW9uIGdldChrZXkpIHtcbiAgICBpZiAoaXNPYmplY3Qoa2V5KSkge1xuICAgICAgdmFyIGRhdGEgPSBnZXRXZWFrKGtleSk7XG4gICAgICBpZiAoZGF0YSA9PT0gdHJ1ZSkgcmV0dXJuIHVuY2F1Z2h0RnJvemVuU3RvcmUodmFsaWRhdGUodGhpcywgV0VBS19NQVApKS5nZXQoa2V5KTtcbiAgICAgIHJldHVybiBkYXRhID8gZGF0YVt0aGlzLl9pXSA6IHVuZGVmaW5lZDtcbiAgICB9XG4gIH0sXG4gIC8vIDIzLjMuMy41IFdlYWtNYXAucHJvdG90eXBlLnNldChrZXksIHZhbHVlKVxuICBzZXQ6IGZ1bmN0aW9uIHNldChrZXksIHZhbHVlKSB7XG4gICAgcmV0dXJuIHdlYWsuZGVmKHZhbGlkYXRlKHRoaXMsIFdFQUtfTUFQKSwga2V5LCB2YWx1ZSk7XG4gIH1cbn07XG5cbi8vIDIzLjMgV2Vha01hcCBPYmplY3RzXG52YXIgJFdlYWtNYXAgPSBtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vX2NvbGxlY3Rpb24nKShXRUFLX01BUCwgd3JhcHBlciwgbWV0aG9kcywgd2VhaywgdHJ1ZSwgdHJ1ZSk7XG5cbi8vIElFMTEgV2Vha01hcCBmcm96ZW4ga2V5cyBmaXhcbmlmIChmYWlscyhmdW5jdGlvbiAoKSB7IHJldHVybiBuZXcgJFdlYWtNYXAoKS5zZXQoKE9iamVjdC5mcmVlemUgfHwgT2JqZWN0KSh0bXApLCA3KS5nZXQodG1wKSAhPSA3OyB9KSkge1xuICBJbnRlcm5hbE1hcCA9IHdlYWsuZ2V0Q29uc3RydWN0b3Iod3JhcHBlciwgV0VBS19NQVApO1xuICBhc3NpZ24oSW50ZXJuYWxNYXAucHJvdG90eXBlLCBtZXRob2RzKTtcbiAgbWV0YS5ORUVEID0gdHJ1ZTtcbiAgZWFjaChbJ2RlbGV0ZScsICdoYXMnLCAnZ2V0JywgJ3NldCddLCBmdW5jdGlvbiAoa2V5KSB7XG4gICAgdmFyIHByb3RvID0gJFdlYWtNYXAucHJvdG90eXBlO1xuICAgIHZhciBtZXRob2QgPSBwcm90b1trZXldO1xuICAgIHJlZGVmaW5lKHByb3RvLCBrZXksIGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgICAvLyBzdG9yZSBmcm96ZW4gb2JqZWN0cyBvbiBpbnRlcm5hbCB3ZWFrbWFwIHNoaW1cbiAgICAgIGlmIChpc09iamVjdChhKSAmJiAhaXNFeHRlbnNpYmxlKGEpKSB7XG4gICAgICAgIGlmICghdGhpcy5fZikgdGhpcy5fZiA9IG5ldyBJbnRlcm5hbE1hcCgpO1xuICAgICAgICB2YXIgcmVzdWx0ID0gdGhpcy5fZltrZXldKGEsIGIpO1xuICAgICAgICByZXR1cm4ga2V5ID09ICdzZXQnID8gdGhpcyA6IHJlc3VsdDtcbiAgICAgIC8vIHN0b3JlIGFsbCB0aGUgcmVzdCBvbiBuYXRpdmUgd2Vha21hcFxuICAgICAgfSByZXR1cm4gbWV0aG9kLmNhbGwodGhpcywgYSwgYik7XG4gICAgfSk7XG4gIH0pO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIHdlYWsgPSByZXF1aXJlKCcuL19jb2xsZWN0aW9uLXdlYWsnKTtcbnZhciB2YWxpZGF0ZSA9IHJlcXVpcmUoJy4vX3ZhbGlkYXRlLWNvbGxlY3Rpb24nKTtcbnZhciBXRUFLX1NFVCA9ICdXZWFrU2V0JztcblxuLy8gMjMuNCBXZWFrU2V0IE9iamVjdHNcbnJlcXVpcmUoJy4vX2NvbGxlY3Rpb24nKShXRUFLX1NFVCwgZnVuY3Rpb24gKGdldCkge1xuICByZXR1cm4gZnVuY3Rpb24gV2Vha1NldCgpIHsgcmV0dXJuIGdldCh0aGlzLCBhcmd1bWVudHMubGVuZ3RoID4gMCA/IGFyZ3VtZW50c1swXSA6IHVuZGVmaW5lZCk7IH07XG59LCB7XG4gIC8vIDIzLjQuMy4xIFdlYWtTZXQucHJvdG90eXBlLmFkZCh2YWx1ZSlcbiAgYWRkOiBmdW5jdGlvbiBhZGQodmFsdWUpIHtcbiAgICByZXR1cm4gd2Vhay5kZWYodmFsaWRhdGUodGhpcywgV0VBS19TRVQpLCB2YWx1ZSwgdHJ1ZSk7XG4gIH1cbn0sIHdlYWssIGZhbHNlLCB0cnVlKTtcbiIsIid1c2Ugc3RyaWN0Jztcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vcHJvcG9zYWwtZmxhdE1hcC8jc2VjLUFycmF5LnByb3RvdHlwZS5mbGF0TWFwXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyIGZsYXR0ZW5JbnRvQXJyYXkgPSByZXF1aXJlKCcuL19mbGF0dGVuLWludG8tYXJyYXknKTtcbnZhciB0b09iamVjdCA9IHJlcXVpcmUoJy4vX3RvLW9iamVjdCcpO1xudmFyIHRvTGVuZ3RoID0gcmVxdWlyZSgnLi9fdG8tbGVuZ3RoJyk7XG52YXIgYUZ1bmN0aW9uID0gcmVxdWlyZSgnLi9fYS1mdW5jdGlvbicpO1xudmFyIGFycmF5U3BlY2llc0NyZWF0ZSA9IHJlcXVpcmUoJy4vX2FycmF5LXNwZWNpZXMtY3JlYXRlJyk7XG5cbiRleHBvcnQoJGV4cG9ydC5QLCAnQXJyYXknLCB7XG4gIGZsYXRNYXA6IGZ1bmN0aW9uIGZsYXRNYXAoY2FsbGJhY2tmbiAvKiAsIHRoaXNBcmcgKi8pIHtcbiAgICB2YXIgTyA9IHRvT2JqZWN0KHRoaXMpO1xuICAgIHZhciBzb3VyY2VMZW4sIEE7XG4gICAgYUZ1bmN0aW9uKGNhbGxiYWNrZm4pO1xuICAgIHNvdXJjZUxlbiA9IHRvTGVuZ3RoKE8ubGVuZ3RoKTtcbiAgICBBID0gYXJyYXlTcGVjaWVzQ3JlYXRlKE8sIDApO1xuICAgIGZsYXR0ZW5JbnRvQXJyYXkoQSwgTywgTywgc291cmNlTGVuLCAwLCAxLCBjYWxsYmFja2ZuLCBhcmd1bWVudHNbMV0pO1xuICAgIHJldHVybiBBO1xuICB9XG59KTtcblxucmVxdWlyZSgnLi9fYWRkLXRvLXVuc2NvcGFibGVzJykoJ2ZsYXRNYXAnKTtcbiIsIid1c2Ugc3RyaWN0Jztcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vcHJvcG9zYWwtZmxhdE1hcC8jc2VjLUFycmF5LnByb3RvdHlwZS5mbGF0dGVuXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyIGZsYXR0ZW5JbnRvQXJyYXkgPSByZXF1aXJlKCcuL19mbGF0dGVuLWludG8tYXJyYXknKTtcbnZhciB0b09iamVjdCA9IHJlcXVpcmUoJy4vX3RvLW9iamVjdCcpO1xudmFyIHRvTGVuZ3RoID0gcmVxdWlyZSgnLi9fdG8tbGVuZ3RoJyk7XG52YXIgdG9JbnRlZ2VyID0gcmVxdWlyZSgnLi9fdG8taW50ZWdlcicpO1xudmFyIGFycmF5U3BlY2llc0NyZWF0ZSA9IHJlcXVpcmUoJy4vX2FycmF5LXNwZWNpZXMtY3JlYXRlJyk7XG5cbiRleHBvcnQoJGV4cG9ydC5QLCAnQXJyYXknLCB7XG4gIGZsYXR0ZW46IGZ1bmN0aW9uIGZsYXR0ZW4oLyogZGVwdGhBcmcgPSAxICovKSB7XG4gICAgdmFyIGRlcHRoQXJnID0gYXJndW1lbnRzWzBdO1xuICAgIHZhciBPID0gdG9PYmplY3QodGhpcyk7XG4gICAgdmFyIHNvdXJjZUxlbiA9IHRvTGVuZ3RoKE8ubGVuZ3RoKTtcbiAgICB2YXIgQSA9IGFycmF5U3BlY2llc0NyZWF0ZShPLCAwKTtcbiAgICBmbGF0dGVuSW50b0FycmF5KEEsIE8sIE8sIHNvdXJjZUxlbiwgMCwgZGVwdGhBcmcgPT09IHVuZGVmaW5lZCA/IDEgOiB0b0ludGVnZXIoZGVwdGhBcmcpKTtcbiAgICByZXR1cm4gQTtcbiAgfVxufSk7XG5cbnJlcXVpcmUoJy4vX2FkZC10by11bnNjb3BhYmxlcycpKCdmbGF0dGVuJyk7XG4iLCIndXNlIHN0cmljdCc7XG4vLyBodHRwczovL2dpdGh1Yi5jb20vdGMzOS9BcnJheS5wcm90b3R5cGUuaW5jbHVkZXNcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgJGluY2x1ZGVzID0gcmVxdWlyZSgnLi9fYXJyYXktaW5jbHVkZXMnKSh0cnVlKTtcblxuJGV4cG9ydCgkZXhwb3J0LlAsICdBcnJheScsIHtcbiAgaW5jbHVkZXM6IGZ1bmN0aW9uIGluY2x1ZGVzKGVsIC8qICwgZnJvbUluZGV4ID0gMCAqLykge1xuICAgIHJldHVybiAkaW5jbHVkZXModGhpcywgZWwsIGFyZ3VtZW50cy5sZW5ndGggPiAxID8gYXJndW1lbnRzWzFdIDogdW5kZWZpbmVkKTtcbiAgfVxufSk7XG5cbnJlcXVpcmUoJy4vX2FkZC10by11bnNjb3BhYmxlcycpKCdpbmNsdWRlcycpO1xuIiwiLy8gaHR0cHM6Ly9naXRodWIuY29tL3J3YWxkcm9uL3RjMzktbm90ZXMvYmxvYi9tYXN0ZXIvZXM2LzIwMTQtMDkvc2VwdC0yNS5tZCM1MTAtZ2xvYmFsYXNhcC1mb3ItZW5xdWV1aW5nLWEtbWljcm90YXNrXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyIG1pY3JvdGFzayA9IHJlcXVpcmUoJy4vX21pY3JvdGFzaycpKCk7XG52YXIgcHJvY2VzcyA9IHJlcXVpcmUoJy4vX2dsb2JhbCcpLnByb2Nlc3M7XG52YXIgaXNOb2RlID0gcmVxdWlyZSgnLi9fY29mJykocHJvY2VzcykgPT0gJ3Byb2Nlc3MnO1xuXG4kZXhwb3J0KCRleHBvcnQuRywge1xuICBhc2FwOiBmdW5jdGlvbiBhc2FwKGZuKSB7XG4gICAgdmFyIGRvbWFpbiA9IGlzTm9kZSAmJiBwcm9jZXNzLmRvbWFpbjtcbiAgICBtaWNyb3Rhc2soZG9tYWluID8gZG9tYWluLmJpbmQoZm4pIDogZm4pO1xuICB9XG59KTtcbiIsIi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9samhhcmIvcHJvcG9zYWwtaXMtZXJyb3JcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgY29mID0gcmVxdWlyZSgnLi9fY29mJyk7XG5cbiRleHBvcnQoJGV4cG9ydC5TLCAnRXJyb3InLCB7XG4gIGlzRXJyb3I6IGZ1bmN0aW9uIGlzRXJyb3IoaXQpIHtcbiAgICByZXR1cm4gY29mKGl0KSA9PT0gJ0Vycm9yJztcbiAgfVxufSk7XG4iLCIvLyBodHRwczovL2dpdGh1Yi5jb20vdGMzOS9wcm9wb3NhbC1nbG9iYWxcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG5cbiRleHBvcnQoJGV4cG9ydC5HLCB7IGdsb2JhbDogcmVxdWlyZSgnLi9fZ2xvYmFsJykgfSk7XG4iLCIvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL3Byb3Bvc2FsLXNldG1hcC1vZmZyb20vI3NlYy1tYXAuZnJvbVxucmVxdWlyZSgnLi9fc2V0LWNvbGxlY3Rpb24tZnJvbScpKCdNYXAnKTtcbiIsIi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vcHJvcG9zYWwtc2V0bWFwLW9mZnJvbS8jc2VjLW1hcC5vZlxucmVxdWlyZSgnLi9fc2V0LWNvbGxlY3Rpb24tb2YnKSgnTWFwJyk7XG4iLCIvLyBodHRwczovL2dpdGh1Yi5jb20vRGF2aWRCcnVhbnQvTWFwLVNldC5wcm90b3R5cGUudG9KU09OXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xuXG4kZXhwb3J0KCRleHBvcnQuUCArICRleHBvcnQuUiwgJ01hcCcsIHsgdG9KU09OOiByZXF1aXJlKCcuL19jb2xsZWN0aW9uLXRvLWpzb24nKSgnTWFwJykgfSk7XG4iLCIvLyBodHRwczovL3J3YWxkcm9uLmdpdGh1Yi5pby9wcm9wb3NhbC1tYXRoLWV4dGVuc2lvbnMvXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xuXG4kZXhwb3J0KCRleHBvcnQuUywgJ01hdGgnLCB7XG4gIGNsYW1wOiBmdW5jdGlvbiBjbGFtcCh4LCBsb3dlciwgdXBwZXIpIHtcbiAgICByZXR1cm4gTWF0aC5taW4odXBwZXIsIE1hdGgubWF4KGxvd2VyLCB4KSk7XG4gIH1cbn0pO1xuIiwiLy8gaHR0cHM6Ly9yd2FsZHJvbi5naXRodWIuaW8vcHJvcG9zYWwtbWF0aC1leHRlbnNpb25zL1xudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcblxuJGV4cG9ydCgkZXhwb3J0LlMsICdNYXRoJywgeyBERUdfUEVSX1JBRDogTWF0aC5QSSAvIDE4MCB9KTtcbiIsIi8vIGh0dHBzOi8vcndhbGRyb24uZ2l0aHViLmlvL3Byb3Bvc2FsLW1hdGgtZXh0ZW5zaW9ucy9cbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgUkFEX1BFUl9ERUcgPSAxODAgLyBNYXRoLlBJO1xuXG4kZXhwb3J0KCRleHBvcnQuUywgJ01hdGgnLCB7XG4gIGRlZ3JlZXM6IGZ1bmN0aW9uIGRlZ3JlZXMocmFkaWFucykge1xuICAgIHJldHVybiByYWRpYW5zICogUkFEX1BFUl9ERUc7XG4gIH1cbn0pO1xuIiwiLy8gaHR0cHM6Ly9yd2FsZHJvbi5naXRodWIuaW8vcHJvcG9zYWwtbWF0aC1leHRlbnNpb25zL1xudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciBzY2FsZSA9IHJlcXVpcmUoJy4vX21hdGgtc2NhbGUnKTtcbnZhciBmcm91bmQgPSByZXF1aXJlKCcuL19tYXRoLWZyb3VuZCcpO1xuXG4kZXhwb3J0KCRleHBvcnQuUywgJ01hdGgnLCB7XG4gIGZzY2FsZTogZnVuY3Rpb24gZnNjYWxlKHgsIGluTG93LCBpbkhpZ2gsIG91dExvdywgb3V0SGlnaCkge1xuICAgIHJldHVybiBmcm91bmQoc2NhbGUoeCwgaW5Mb3csIGluSGlnaCwgb3V0TG93LCBvdXRIaWdoKSk7XG4gIH1cbn0pO1xuIiwiLy8gaHR0cHM6Ly9naXN0LmdpdGh1Yi5jb20vQnJlbmRhbkVpY2gvNDI5NGQ1YzIxMmE2ZDIyNTQ3MDNcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG5cbiRleHBvcnQoJGV4cG9ydC5TLCAnTWF0aCcsIHtcbiAgaWFkZGg6IGZ1bmN0aW9uIGlhZGRoKHgwLCB4MSwgeTAsIHkxKSB7XG4gICAgdmFyICR4MCA9IHgwID4+PiAwO1xuICAgIHZhciAkeDEgPSB4MSA+Pj4gMDtcbiAgICB2YXIgJHkwID0geTAgPj4+IDA7XG4gICAgcmV0dXJuICR4MSArICh5MSA+Pj4gMCkgKyAoKCR4MCAmICR5MCB8ICgkeDAgfCAkeTApICYgfigkeDAgKyAkeTAgPj4+IDApKSA+Pj4gMzEpIHwgMDtcbiAgfVxufSk7XG4iLCIvLyBodHRwczovL2dpc3QuZ2l0aHViLmNvbS9CcmVuZGFuRWljaC80Mjk0ZDVjMjEyYTZkMjI1NDcwM1xudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcblxuJGV4cG9ydCgkZXhwb3J0LlMsICdNYXRoJywge1xuICBpbXVsaDogZnVuY3Rpb24gaW11bGgodSwgdikge1xuICAgIHZhciBVSU5UMTYgPSAweGZmZmY7XG4gICAgdmFyICR1ID0gK3U7XG4gICAgdmFyICR2ID0gK3Y7XG4gICAgdmFyIHUwID0gJHUgJiBVSU5UMTY7XG4gICAgdmFyIHYwID0gJHYgJiBVSU5UMTY7XG4gICAgdmFyIHUxID0gJHUgPj4gMTY7XG4gICAgdmFyIHYxID0gJHYgPj4gMTY7XG4gICAgdmFyIHQgPSAodTEgKiB2MCA+Pj4gMCkgKyAodTAgKiB2MCA+Pj4gMTYpO1xuICAgIHJldHVybiB1MSAqIHYxICsgKHQgPj4gMTYpICsgKCh1MCAqIHYxID4+PiAwKSArICh0ICYgVUlOVDE2KSA+PiAxNik7XG4gIH1cbn0pO1xuIiwiLy8gaHR0cHM6Ly9naXN0LmdpdGh1Yi5jb20vQnJlbmRhbkVpY2gvNDI5NGQ1YzIxMmE2ZDIyNTQ3MDNcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG5cbiRleHBvcnQoJGV4cG9ydC5TLCAnTWF0aCcsIHtcbiAgaXN1Ymg6IGZ1bmN0aW9uIGlzdWJoKHgwLCB4MSwgeTAsIHkxKSB7XG4gICAgdmFyICR4MCA9IHgwID4+PiAwO1xuICAgIHZhciAkeDEgPSB4MSA+Pj4gMDtcbiAgICB2YXIgJHkwID0geTAgPj4+IDA7XG4gICAgcmV0dXJuICR4MSAtICh5MSA+Pj4gMCkgLSAoKH4keDAgJiAkeTAgfCB+KCR4MCBeICR5MCkgJiAkeDAgLSAkeTAgPj4+IDApID4+PiAzMSkgfCAwO1xuICB9XG59KTtcbiIsIi8vIGh0dHBzOi8vcndhbGRyb24uZ2l0aHViLmlvL3Byb3Bvc2FsLW1hdGgtZXh0ZW5zaW9ucy9cbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG5cbiRleHBvcnQoJGV4cG9ydC5TLCAnTWF0aCcsIHsgUkFEX1BFUl9ERUc6IDE4MCAvIE1hdGguUEkgfSk7XG4iLCIvLyBodHRwczovL3J3YWxkcm9uLmdpdGh1Yi5pby9wcm9wb3NhbC1tYXRoLWV4dGVuc2lvbnMvXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyIERFR19QRVJfUkFEID0gTWF0aC5QSSAvIDE4MDtcblxuJGV4cG9ydCgkZXhwb3J0LlMsICdNYXRoJywge1xuICByYWRpYW5zOiBmdW5jdGlvbiByYWRpYW5zKGRlZ3JlZXMpIHtcbiAgICByZXR1cm4gZGVncmVlcyAqIERFR19QRVJfUkFEO1xuICB9XG59KTtcbiIsIi8vIGh0dHBzOi8vcndhbGRyb24uZ2l0aHViLmlvL3Byb3Bvc2FsLW1hdGgtZXh0ZW5zaW9ucy9cbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG5cbiRleHBvcnQoJGV4cG9ydC5TLCAnTWF0aCcsIHsgc2NhbGU6IHJlcXVpcmUoJy4vX21hdGgtc2NhbGUnKSB9KTtcbiIsIi8vIGh0dHA6Ly9qZmJhc3RpZW4uZ2l0aHViLmlvL3BhcGVycy9NYXRoLnNpZ25iaXQuaHRtbFxudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcblxuJGV4cG9ydCgkZXhwb3J0LlMsICdNYXRoJywgeyBzaWduYml0OiBmdW5jdGlvbiBzaWduYml0KHgpIHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXNlbGYtY29tcGFyZVxuICByZXR1cm4gKHggPSAreCkgIT0geCA/IHggOiB4ID09IDAgPyAxIC8geCA9PSBJbmZpbml0eSA6IHggPiAwO1xufSB9KTtcbiIsIi8vIGh0dHBzOi8vZ2lzdC5naXRodWIuY29tL0JyZW5kYW5FaWNoLzQyOTRkNWMyMTJhNmQyMjU0NzAzXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xuXG4kZXhwb3J0KCRleHBvcnQuUywgJ01hdGgnLCB7XG4gIHVtdWxoOiBmdW5jdGlvbiB1bXVsaCh1LCB2KSB7XG4gICAgdmFyIFVJTlQxNiA9IDB4ZmZmZjtcbiAgICB2YXIgJHUgPSArdTtcbiAgICB2YXIgJHYgPSArdjtcbiAgICB2YXIgdTAgPSAkdSAmIFVJTlQxNjtcbiAgICB2YXIgdjAgPSAkdiAmIFVJTlQxNjtcbiAgICB2YXIgdTEgPSAkdSA+Pj4gMTY7XG4gICAgdmFyIHYxID0gJHYgPj4+IDE2O1xuICAgIHZhciB0ID0gKHUxICogdjAgPj4+IDApICsgKHUwICogdjAgPj4+IDE2KTtcbiAgICByZXR1cm4gdTEgKiB2MSArICh0ID4+PiAxNikgKyAoKHUwICogdjEgPj4+IDApICsgKHQgJiBVSU5UMTYpID4+PiAxNik7XG4gIH1cbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciB0b09iamVjdCA9IHJlcXVpcmUoJy4vX3RvLW9iamVjdCcpO1xudmFyIGFGdW5jdGlvbiA9IHJlcXVpcmUoJy4vX2EtZnVuY3Rpb24nKTtcbnZhciAkZGVmaW5lUHJvcGVydHkgPSByZXF1aXJlKCcuL19vYmplY3QtZHAnKTtcblxuLy8gQi4yLjIuMiBPYmplY3QucHJvdG90eXBlLl9fZGVmaW5lR2V0dGVyX18oUCwgZ2V0dGVyKVxucmVxdWlyZSgnLi9fZGVzY3JpcHRvcnMnKSAmJiAkZXhwb3J0KCRleHBvcnQuUCArIHJlcXVpcmUoJy4vX29iamVjdC1mb3JjZWQtcGFtJyksICdPYmplY3QnLCB7XG4gIF9fZGVmaW5lR2V0dGVyX186IGZ1bmN0aW9uIF9fZGVmaW5lR2V0dGVyX18oUCwgZ2V0dGVyKSB7XG4gICAgJGRlZmluZVByb3BlcnR5LmYodG9PYmplY3QodGhpcyksIFAsIHsgZ2V0OiBhRnVuY3Rpb24oZ2V0dGVyKSwgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlIH0pO1xuICB9XG59KTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgdG9PYmplY3QgPSByZXF1aXJlKCcuL190by1vYmplY3QnKTtcbnZhciBhRnVuY3Rpb24gPSByZXF1aXJlKCcuL19hLWZ1bmN0aW9uJyk7XG52YXIgJGRlZmluZVByb3BlcnR5ID0gcmVxdWlyZSgnLi9fb2JqZWN0LWRwJyk7XG5cbi8vIEIuMi4yLjMgT2JqZWN0LnByb3RvdHlwZS5fX2RlZmluZVNldHRlcl9fKFAsIHNldHRlcilcbnJlcXVpcmUoJy4vX2Rlc2NyaXB0b3JzJykgJiYgJGV4cG9ydCgkZXhwb3J0LlAgKyByZXF1aXJlKCcuL19vYmplY3QtZm9yY2VkLXBhbScpLCAnT2JqZWN0Jywge1xuICBfX2RlZmluZVNldHRlcl9fOiBmdW5jdGlvbiBfX2RlZmluZVNldHRlcl9fKFAsIHNldHRlcikge1xuICAgICRkZWZpbmVQcm9wZXJ0eS5mKHRvT2JqZWN0KHRoaXMpLCBQLCB7IHNldDogYUZ1bmN0aW9uKHNldHRlciksIGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSB9KTtcbiAgfVxufSk7XG4iLCIvLyBodHRwczovL2dpdGh1Yi5jb20vdGMzOS9wcm9wb3NhbC1vYmplY3QtdmFsdWVzLWVudHJpZXNcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgJGVudHJpZXMgPSByZXF1aXJlKCcuL19vYmplY3QtdG8tYXJyYXknKSh0cnVlKTtcblxuJGV4cG9ydCgkZXhwb3J0LlMsICdPYmplY3QnLCB7XG4gIGVudHJpZXM6IGZ1bmN0aW9uIGVudHJpZXMoaXQpIHtcbiAgICByZXR1cm4gJGVudHJpZXMoaXQpO1xuICB9XG59KTtcbiIsIi8vIGh0dHBzOi8vZ2l0aHViLmNvbS90YzM5L3Byb3Bvc2FsLW9iamVjdC1nZXRvd25wcm9wZXJ0eWRlc2NyaXB0b3JzXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyIG93bktleXMgPSByZXF1aXJlKCcuL19vd24ta2V5cycpO1xudmFyIHRvSU9iamVjdCA9IHJlcXVpcmUoJy4vX3RvLWlvYmplY3QnKTtcbnZhciBnT1BEID0gcmVxdWlyZSgnLi9fb2JqZWN0LWdvcGQnKTtcbnZhciBjcmVhdGVQcm9wZXJ0eSA9IHJlcXVpcmUoJy4vX2NyZWF0ZS1wcm9wZXJ0eScpO1xuXG4kZXhwb3J0KCRleHBvcnQuUywgJ09iamVjdCcsIHtcbiAgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yczogZnVuY3Rpb24gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpIHtcbiAgICB2YXIgTyA9IHRvSU9iamVjdChvYmplY3QpO1xuICAgIHZhciBnZXREZXNjID0gZ09QRC5mO1xuICAgIHZhciBrZXlzID0gb3duS2V5cyhPKTtcbiAgICB2YXIgcmVzdWx0ID0ge307XG4gICAgdmFyIGkgPSAwO1xuICAgIHZhciBrZXksIGRlc2M7XG4gICAgd2hpbGUgKGtleXMubGVuZ3RoID4gaSkge1xuICAgICAgZGVzYyA9IGdldERlc2MoTywga2V5ID0ga2V5c1tpKytdKTtcbiAgICAgIGlmIChkZXNjICE9PSB1bmRlZmluZWQpIGNyZWF0ZVByb3BlcnR5KHJlc3VsdCwga2V5LCBkZXNjKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxufSk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyIHRvT2JqZWN0ID0gcmVxdWlyZSgnLi9fdG8tb2JqZWN0Jyk7XG52YXIgdG9QcmltaXRpdmUgPSByZXF1aXJlKCcuL190by1wcmltaXRpdmUnKTtcbnZhciBnZXRQcm90b3R5cGVPZiA9IHJlcXVpcmUoJy4vX29iamVjdC1ncG8nKTtcbnZhciBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IgPSByZXF1aXJlKCcuL19vYmplY3QtZ29wZCcpLmY7XG5cbi8vIEIuMi4yLjQgT2JqZWN0LnByb3RvdHlwZS5fX2xvb2t1cEdldHRlcl9fKFApXG5yZXF1aXJlKCcuL19kZXNjcmlwdG9ycycpICYmICRleHBvcnQoJGV4cG9ydC5QICsgcmVxdWlyZSgnLi9fb2JqZWN0LWZvcmNlZC1wYW0nKSwgJ09iamVjdCcsIHtcbiAgX19sb29rdXBHZXR0ZXJfXzogZnVuY3Rpb24gX19sb29rdXBHZXR0ZXJfXyhQKSB7XG4gICAgdmFyIE8gPSB0b09iamVjdCh0aGlzKTtcbiAgICB2YXIgSyA9IHRvUHJpbWl0aXZlKFAsIHRydWUpO1xuICAgIHZhciBEO1xuICAgIGRvIHtcbiAgICAgIGlmIChEID0gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKE8sIEspKSByZXR1cm4gRC5nZXQ7XG4gICAgfSB3aGlsZSAoTyA9IGdldFByb3RvdHlwZU9mKE8pKTtcbiAgfVxufSk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyIHRvT2JqZWN0ID0gcmVxdWlyZSgnLi9fdG8tb2JqZWN0Jyk7XG52YXIgdG9QcmltaXRpdmUgPSByZXF1aXJlKCcuL190by1wcmltaXRpdmUnKTtcbnZhciBnZXRQcm90b3R5cGVPZiA9IHJlcXVpcmUoJy4vX29iamVjdC1ncG8nKTtcbnZhciBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IgPSByZXF1aXJlKCcuL19vYmplY3QtZ29wZCcpLmY7XG5cbi8vIEIuMi4yLjUgT2JqZWN0LnByb3RvdHlwZS5fX2xvb2t1cFNldHRlcl9fKFApXG5yZXF1aXJlKCcuL19kZXNjcmlwdG9ycycpICYmICRleHBvcnQoJGV4cG9ydC5QICsgcmVxdWlyZSgnLi9fb2JqZWN0LWZvcmNlZC1wYW0nKSwgJ09iamVjdCcsIHtcbiAgX19sb29rdXBTZXR0ZXJfXzogZnVuY3Rpb24gX19sb29rdXBTZXR0ZXJfXyhQKSB7XG4gICAgdmFyIE8gPSB0b09iamVjdCh0aGlzKTtcbiAgICB2YXIgSyA9IHRvUHJpbWl0aXZlKFAsIHRydWUpO1xuICAgIHZhciBEO1xuICAgIGRvIHtcbiAgICAgIGlmIChEID0gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKE8sIEspKSByZXR1cm4gRC5zZXQ7XG4gICAgfSB3aGlsZSAoTyA9IGdldFByb3RvdHlwZU9mKE8pKTtcbiAgfVxufSk7XG4iLCIvLyBodHRwczovL2dpdGh1Yi5jb20vdGMzOS9wcm9wb3NhbC1vYmplY3QtdmFsdWVzLWVudHJpZXNcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgJHZhbHVlcyA9IHJlcXVpcmUoJy4vX29iamVjdC10by1hcnJheScpKGZhbHNlKTtcblxuJGV4cG9ydCgkZXhwb3J0LlMsICdPYmplY3QnLCB7XG4gIHZhbHVlczogZnVuY3Rpb24gdmFsdWVzKGl0KSB7XG4gICAgcmV0dXJuICR2YWx1ZXMoaXQpO1xuICB9XG59KTtcbiIsIid1c2Ugc3RyaWN0Jztcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS96ZW5wYXJzaW5nL2VzLW9ic2VydmFibGVcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi9fZ2xvYmFsJyk7XG52YXIgY29yZSA9IHJlcXVpcmUoJy4vX2NvcmUnKTtcbnZhciBtaWNyb3Rhc2sgPSByZXF1aXJlKCcuL19taWNyb3Rhc2snKSgpO1xudmFyIE9CU0VSVkFCTEUgPSByZXF1aXJlKCcuL193a3MnKSgnb2JzZXJ2YWJsZScpO1xudmFyIGFGdW5jdGlvbiA9IHJlcXVpcmUoJy4vX2EtZnVuY3Rpb24nKTtcbnZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4vX2FuLW9iamVjdCcpO1xudmFyIGFuSW5zdGFuY2UgPSByZXF1aXJlKCcuL19hbi1pbnN0YW5jZScpO1xudmFyIHJlZGVmaW5lQWxsID0gcmVxdWlyZSgnLi9fcmVkZWZpbmUtYWxsJyk7XG52YXIgaGlkZSA9IHJlcXVpcmUoJy4vX2hpZGUnKTtcbnZhciBmb3JPZiA9IHJlcXVpcmUoJy4vX2Zvci1vZicpO1xudmFyIFJFVFVSTiA9IGZvck9mLlJFVFVSTjtcblxudmFyIGdldE1ldGhvZCA9IGZ1bmN0aW9uIChmbikge1xuICByZXR1cm4gZm4gPT0gbnVsbCA/IHVuZGVmaW5lZCA6IGFGdW5jdGlvbihmbik7XG59O1xuXG52YXIgY2xlYW51cFN1YnNjcmlwdGlvbiA9IGZ1bmN0aW9uIChzdWJzY3JpcHRpb24pIHtcbiAgdmFyIGNsZWFudXAgPSBzdWJzY3JpcHRpb24uX2M7XG4gIGlmIChjbGVhbnVwKSB7XG4gICAgc3Vic2NyaXB0aW9uLl9jID0gdW5kZWZpbmVkO1xuICAgIGNsZWFudXAoKTtcbiAgfVxufTtcblxudmFyIHN1YnNjcmlwdGlvbkNsb3NlZCA9IGZ1bmN0aW9uIChzdWJzY3JpcHRpb24pIHtcbiAgcmV0dXJuIHN1YnNjcmlwdGlvbi5fbyA9PT0gdW5kZWZpbmVkO1xufTtcblxudmFyIGNsb3NlU3Vic2NyaXB0aW9uID0gZnVuY3Rpb24gKHN1YnNjcmlwdGlvbikge1xuICBpZiAoIXN1YnNjcmlwdGlvbkNsb3NlZChzdWJzY3JpcHRpb24pKSB7XG4gICAgc3Vic2NyaXB0aW9uLl9vID0gdW5kZWZpbmVkO1xuICAgIGNsZWFudXBTdWJzY3JpcHRpb24oc3Vic2NyaXB0aW9uKTtcbiAgfVxufTtcblxudmFyIFN1YnNjcmlwdGlvbiA9IGZ1bmN0aW9uIChvYnNlcnZlciwgc3Vic2NyaWJlcikge1xuICBhbk9iamVjdChvYnNlcnZlcik7XG4gIHRoaXMuX2MgPSB1bmRlZmluZWQ7XG4gIHRoaXMuX28gPSBvYnNlcnZlcjtcbiAgb2JzZXJ2ZXIgPSBuZXcgU3Vic2NyaXB0aW9uT2JzZXJ2ZXIodGhpcyk7XG4gIHRyeSB7XG4gICAgdmFyIGNsZWFudXAgPSBzdWJzY3JpYmVyKG9ic2VydmVyKTtcbiAgICB2YXIgc3Vic2NyaXB0aW9uID0gY2xlYW51cDtcbiAgICBpZiAoY2xlYW51cCAhPSBudWxsKSB7XG4gICAgICBpZiAodHlwZW9mIGNsZWFudXAudW5zdWJzY3JpYmUgPT09ICdmdW5jdGlvbicpIGNsZWFudXAgPSBmdW5jdGlvbiAoKSB7IHN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpOyB9O1xuICAgICAgZWxzZSBhRnVuY3Rpb24oY2xlYW51cCk7XG4gICAgICB0aGlzLl9jID0gY2xlYW51cDtcbiAgICB9XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBvYnNlcnZlci5lcnJvcihlKTtcbiAgICByZXR1cm47XG4gIH0gaWYgKHN1YnNjcmlwdGlvbkNsb3NlZCh0aGlzKSkgY2xlYW51cFN1YnNjcmlwdGlvbih0aGlzKTtcbn07XG5cblN1YnNjcmlwdGlvbi5wcm90b3R5cGUgPSByZWRlZmluZUFsbCh7fSwge1xuICB1bnN1YnNjcmliZTogZnVuY3Rpb24gdW5zdWJzY3JpYmUoKSB7IGNsb3NlU3Vic2NyaXB0aW9uKHRoaXMpOyB9XG59KTtcblxudmFyIFN1YnNjcmlwdGlvbk9ic2VydmVyID0gZnVuY3Rpb24gKHN1YnNjcmlwdGlvbikge1xuICB0aGlzLl9zID0gc3Vic2NyaXB0aW9uO1xufTtcblxuU3Vic2NyaXB0aW9uT2JzZXJ2ZXIucHJvdG90eXBlID0gcmVkZWZpbmVBbGwoe30sIHtcbiAgbmV4dDogZnVuY3Rpb24gbmV4dCh2YWx1ZSkge1xuICAgIHZhciBzdWJzY3JpcHRpb24gPSB0aGlzLl9zO1xuICAgIGlmICghc3Vic2NyaXB0aW9uQ2xvc2VkKHN1YnNjcmlwdGlvbikpIHtcbiAgICAgIHZhciBvYnNlcnZlciA9IHN1YnNjcmlwdGlvbi5fbztcbiAgICAgIHRyeSB7XG4gICAgICAgIHZhciBtID0gZ2V0TWV0aG9kKG9ic2VydmVyLm5leHQpO1xuICAgICAgICBpZiAobSkgcmV0dXJuIG0uY2FsbChvYnNlcnZlciwgdmFsdWUpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNsb3NlU3Vic2NyaXB0aW9uKHN1YnNjcmlwdGlvbik7XG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSxcbiAgZXJyb3I6IGZ1bmN0aW9uIGVycm9yKHZhbHVlKSB7XG4gICAgdmFyIHN1YnNjcmlwdGlvbiA9IHRoaXMuX3M7XG4gICAgaWYgKHN1YnNjcmlwdGlvbkNsb3NlZChzdWJzY3JpcHRpb24pKSB0aHJvdyB2YWx1ZTtcbiAgICB2YXIgb2JzZXJ2ZXIgPSBzdWJzY3JpcHRpb24uX287XG4gICAgc3Vic2NyaXB0aW9uLl9vID0gdW5kZWZpbmVkO1xuICAgIHRyeSB7XG4gICAgICB2YXIgbSA9IGdldE1ldGhvZChvYnNlcnZlci5lcnJvcik7XG4gICAgICBpZiAoIW0pIHRocm93IHZhbHVlO1xuICAgICAgdmFsdWUgPSBtLmNhbGwob2JzZXJ2ZXIsIHZhbHVlKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjbGVhbnVwU3Vic2NyaXB0aW9uKHN1YnNjcmlwdGlvbik7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICB0aHJvdyBlO1xuICAgICAgfVxuICAgIH0gY2xlYW51cFN1YnNjcmlwdGlvbihzdWJzY3JpcHRpb24pO1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfSxcbiAgY29tcGxldGU6IGZ1bmN0aW9uIGNvbXBsZXRlKHZhbHVlKSB7XG4gICAgdmFyIHN1YnNjcmlwdGlvbiA9IHRoaXMuX3M7XG4gICAgaWYgKCFzdWJzY3JpcHRpb25DbG9zZWQoc3Vic2NyaXB0aW9uKSkge1xuICAgICAgdmFyIG9ic2VydmVyID0gc3Vic2NyaXB0aW9uLl9vO1xuICAgICAgc3Vic2NyaXB0aW9uLl9vID0gdW5kZWZpbmVkO1xuICAgICAgdHJ5IHtcbiAgICAgICAgdmFyIG0gPSBnZXRNZXRob2Qob2JzZXJ2ZXIuY29tcGxldGUpO1xuICAgICAgICB2YWx1ZSA9IG0gPyBtLmNhbGwob2JzZXJ2ZXIsIHZhbHVlKSA6IHVuZGVmaW5lZDtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjbGVhbnVwU3Vic2NyaXB0aW9uKHN1YnNjcmlwdGlvbik7XG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgfVxuICAgICAgfSBjbGVhbnVwU3Vic2NyaXB0aW9uKHN1YnNjcmlwdGlvbik7XG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuICB9XG59KTtcblxudmFyICRPYnNlcnZhYmxlID0gZnVuY3Rpb24gT2JzZXJ2YWJsZShzdWJzY3JpYmVyKSB7XG4gIGFuSW5zdGFuY2UodGhpcywgJE9ic2VydmFibGUsICdPYnNlcnZhYmxlJywgJ19mJykuX2YgPSBhRnVuY3Rpb24oc3Vic2NyaWJlcik7XG59O1xuXG5yZWRlZmluZUFsbCgkT2JzZXJ2YWJsZS5wcm90b3R5cGUsIHtcbiAgc3Vic2NyaWJlOiBmdW5jdGlvbiBzdWJzY3JpYmUob2JzZXJ2ZXIpIHtcbiAgICByZXR1cm4gbmV3IFN1YnNjcmlwdGlvbihvYnNlcnZlciwgdGhpcy5fZik7XG4gIH0sXG4gIGZvckVhY2g6IGZ1bmN0aW9uIGZvckVhY2goZm4pIHtcbiAgICB2YXIgdGhhdCA9IHRoaXM7XG4gICAgcmV0dXJuIG5ldyAoY29yZS5Qcm9taXNlIHx8IGdsb2JhbC5Qcm9taXNlKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICBhRnVuY3Rpb24oZm4pO1xuICAgICAgdmFyIHN1YnNjcmlwdGlvbiA9IHRoYXQuc3Vic2NyaWJlKHtcbiAgICAgICAgbmV4dDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJldHVybiBmbih2YWx1ZSk7XG4gICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgcmVqZWN0KGUpO1xuICAgICAgICAgICAgc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBlcnJvcjogcmVqZWN0LFxuICAgICAgICBjb21wbGV0ZTogcmVzb2x2ZVxuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cbn0pO1xuXG5yZWRlZmluZUFsbCgkT2JzZXJ2YWJsZSwge1xuICBmcm9tOiBmdW5jdGlvbiBmcm9tKHgpIHtcbiAgICB2YXIgQyA9IHR5cGVvZiB0aGlzID09PSAnZnVuY3Rpb24nID8gdGhpcyA6ICRPYnNlcnZhYmxlO1xuICAgIHZhciBtZXRob2QgPSBnZXRNZXRob2QoYW5PYmplY3QoeClbT0JTRVJWQUJMRV0pO1xuICAgIGlmIChtZXRob2QpIHtcbiAgICAgIHZhciBvYnNlcnZhYmxlID0gYW5PYmplY3QobWV0aG9kLmNhbGwoeCkpO1xuICAgICAgcmV0dXJuIG9ic2VydmFibGUuY29uc3RydWN0b3IgPT09IEMgPyBvYnNlcnZhYmxlIDogbmV3IEMoZnVuY3Rpb24gKG9ic2VydmVyKSB7XG4gICAgICAgIHJldHVybiBvYnNlcnZhYmxlLnN1YnNjcmliZShvYnNlcnZlcik7XG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBDKGZ1bmN0aW9uIChvYnNlcnZlcikge1xuICAgICAgdmFyIGRvbmUgPSBmYWxzZTtcbiAgICAgIG1pY3JvdGFzayhmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICghZG9uZSkge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBpZiAoZm9yT2YoeCwgZmFsc2UsIGZ1bmN0aW9uIChpdCkge1xuICAgICAgICAgICAgICBvYnNlcnZlci5uZXh0KGl0KTtcbiAgICAgICAgICAgICAgaWYgKGRvbmUpIHJldHVybiBSRVRVUk47XG4gICAgICAgICAgICB9KSA9PT0gUkVUVVJOKSByZXR1cm47XG4gICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgaWYgKGRvbmUpIHRocm93IGU7XG4gICAgICAgICAgICBvYnNlcnZlci5lcnJvcihlKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9IG9ic2VydmVyLmNvbXBsZXRlKCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHsgZG9uZSA9IHRydWU7IH07XG4gICAgfSk7XG4gIH0sXG4gIG9mOiBmdW5jdGlvbiBvZigpIHtcbiAgICBmb3IgKHZhciBpID0gMCwgbCA9IGFyZ3VtZW50cy5sZW5ndGgsIGl0ZW1zID0gbmV3IEFycmF5KGwpOyBpIDwgbDspIGl0ZW1zW2ldID0gYXJndW1lbnRzW2krK107XG4gICAgcmV0dXJuIG5ldyAodHlwZW9mIHRoaXMgPT09ICdmdW5jdGlvbicgPyB0aGlzIDogJE9ic2VydmFibGUpKGZ1bmN0aW9uIChvYnNlcnZlcikge1xuICAgICAgdmFyIGRvbmUgPSBmYWxzZTtcbiAgICAgIG1pY3JvdGFzayhmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICghZG9uZSkge1xuICAgICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgaXRlbXMubGVuZ3RoOyArK2opIHtcbiAgICAgICAgICAgIG9ic2VydmVyLm5leHQoaXRlbXNbal0pO1xuICAgICAgICAgICAgaWYgKGRvbmUpIHJldHVybjtcbiAgICAgICAgICB9IG9ic2VydmVyLmNvbXBsZXRlKCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHsgZG9uZSA9IHRydWU7IH07XG4gICAgfSk7XG4gIH1cbn0pO1xuXG5oaWRlKCRPYnNlcnZhYmxlLnByb3RvdHlwZSwgT0JTRVJWQUJMRSwgZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpczsgfSk7XG5cbiRleHBvcnQoJGV4cG9ydC5HLCB7IE9ic2VydmFibGU6ICRPYnNlcnZhYmxlIH0pO1xuXG5yZXF1aXJlKCcuL19zZXQtc3BlY2llcycpKCdPYnNlcnZhYmxlJyk7XG4iLCIvLyBodHRwczovL2dpdGh1Yi5jb20vdGMzOS9wcm9wb3NhbC1wcm9taXNlLWZpbmFsbHlcbid1c2Ugc3RyaWN0JztcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgY29yZSA9IHJlcXVpcmUoJy4vX2NvcmUnKTtcbnZhciBnbG9iYWwgPSByZXF1aXJlKCcuL19nbG9iYWwnKTtcbnZhciBzcGVjaWVzQ29uc3RydWN0b3IgPSByZXF1aXJlKCcuL19zcGVjaWVzLWNvbnN0cnVjdG9yJyk7XG52YXIgcHJvbWlzZVJlc29sdmUgPSByZXF1aXJlKCcuL19wcm9taXNlLXJlc29sdmUnKTtcblxuJGV4cG9ydCgkZXhwb3J0LlAgKyAkZXhwb3J0LlIsICdQcm9taXNlJywgeyAnZmluYWxseSc6IGZ1bmN0aW9uIChvbkZpbmFsbHkpIHtcbiAgdmFyIEMgPSBzcGVjaWVzQ29uc3RydWN0b3IodGhpcywgY29yZS5Qcm9taXNlIHx8IGdsb2JhbC5Qcm9taXNlKTtcbiAgdmFyIGlzRnVuY3Rpb24gPSB0eXBlb2Ygb25GaW5hbGx5ID09ICdmdW5jdGlvbic7XG4gIHJldHVybiB0aGlzLnRoZW4oXG4gICAgaXNGdW5jdGlvbiA/IGZ1bmN0aW9uICh4KSB7XG4gICAgICByZXR1cm4gcHJvbWlzZVJlc29sdmUoQywgb25GaW5hbGx5KCkpLnRoZW4oZnVuY3Rpb24gKCkgeyByZXR1cm4geDsgfSk7XG4gICAgfSA6IG9uRmluYWxseSxcbiAgICBpc0Z1bmN0aW9uID8gZnVuY3Rpb24gKGUpIHtcbiAgICAgIHJldHVybiBwcm9taXNlUmVzb2x2ZShDLCBvbkZpbmFsbHkoKSkudGhlbihmdW5jdGlvbiAoKSB7IHRocm93IGU7IH0pO1xuICAgIH0gOiBvbkZpbmFsbHlcbiAgKTtcbn0gfSk7XG4iLCIndXNlIHN0cmljdCc7XG4vLyBodHRwczovL2dpdGh1Yi5jb20vdGMzOS9wcm9wb3NhbC1wcm9taXNlLXRyeVxudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciBuZXdQcm9taXNlQ2FwYWJpbGl0eSA9IHJlcXVpcmUoJy4vX25ldy1wcm9taXNlLWNhcGFiaWxpdHknKTtcbnZhciBwZXJmb3JtID0gcmVxdWlyZSgnLi9fcGVyZm9ybScpO1xuXG4kZXhwb3J0KCRleHBvcnQuUywgJ1Byb21pc2UnLCB7ICd0cnknOiBmdW5jdGlvbiAoY2FsbGJhY2tmbikge1xuICB2YXIgcHJvbWlzZUNhcGFiaWxpdHkgPSBuZXdQcm9taXNlQ2FwYWJpbGl0eS5mKHRoaXMpO1xuICB2YXIgcmVzdWx0ID0gcGVyZm9ybShjYWxsYmFja2ZuKTtcbiAgKHJlc3VsdC5lID8gcHJvbWlzZUNhcGFiaWxpdHkucmVqZWN0IDogcHJvbWlzZUNhcGFiaWxpdHkucmVzb2x2ZSkocmVzdWx0LnYpO1xuICByZXR1cm4gcHJvbWlzZUNhcGFiaWxpdHkucHJvbWlzZTtcbn0gfSk7XG4iLCJ2YXIgbWV0YWRhdGEgPSByZXF1aXJlKCcuL19tZXRhZGF0YScpO1xudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi9fYW4tb2JqZWN0Jyk7XG52YXIgdG9NZXRhS2V5ID0gbWV0YWRhdGEua2V5O1xudmFyIG9yZGluYXJ5RGVmaW5lT3duTWV0YWRhdGEgPSBtZXRhZGF0YS5zZXQ7XG5cbm1ldGFkYXRhLmV4cCh7IGRlZmluZU1ldGFkYXRhOiBmdW5jdGlvbiBkZWZpbmVNZXRhZGF0YShtZXRhZGF0YUtleSwgbWV0YWRhdGFWYWx1ZSwgdGFyZ2V0LCB0YXJnZXRLZXkpIHtcbiAgb3JkaW5hcnlEZWZpbmVPd25NZXRhZGF0YShtZXRhZGF0YUtleSwgbWV0YWRhdGFWYWx1ZSwgYW5PYmplY3QodGFyZ2V0KSwgdG9NZXRhS2V5KHRhcmdldEtleSkpO1xufSB9KTtcbiIsInZhciBtZXRhZGF0YSA9IHJlcXVpcmUoJy4vX21ldGFkYXRhJyk7XG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuL19hbi1vYmplY3QnKTtcbnZhciB0b01ldGFLZXkgPSBtZXRhZGF0YS5rZXk7XG52YXIgZ2V0T3JDcmVhdGVNZXRhZGF0YU1hcCA9IG1ldGFkYXRhLm1hcDtcbnZhciBzdG9yZSA9IG1ldGFkYXRhLnN0b3JlO1xuXG5tZXRhZGF0YS5leHAoeyBkZWxldGVNZXRhZGF0YTogZnVuY3Rpb24gZGVsZXRlTWV0YWRhdGEobWV0YWRhdGFLZXksIHRhcmdldCAvKiAsIHRhcmdldEtleSAqLykge1xuICB2YXIgdGFyZ2V0S2V5ID0gYXJndW1lbnRzLmxlbmd0aCA8IDMgPyB1bmRlZmluZWQgOiB0b01ldGFLZXkoYXJndW1lbnRzWzJdKTtcbiAgdmFyIG1ldGFkYXRhTWFwID0gZ2V0T3JDcmVhdGVNZXRhZGF0YU1hcChhbk9iamVjdCh0YXJnZXQpLCB0YXJnZXRLZXksIGZhbHNlKTtcbiAgaWYgKG1ldGFkYXRhTWFwID09PSB1bmRlZmluZWQgfHwgIW1ldGFkYXRhTWFwWydkZWxldGUnXShtZXRhZGF0YUtleSkpIHJldHVybiBmYWxzZTtcbiAgaWYgKG1ldGFkYXRhTWFwLnNpemUpIHJldHVybiB0cnVlO1xuICB2YXIgdGFyZ2V0TWV0YWRhdGEgPSBzdG9yZS5nZXQodGFyZ2V0KTtcbiAgdGFyZ2V0TWV0YWRhdGFbJ2RlbGV0ZSddKHRhcmdldEtleSk7XG4gIHJldHVybiAhIXRhcmdldE1ldGFkYXRhLnNpemUgfHwgc3RvcmVbJ2RlbGV0ZSddKHRhcmdldCk7XG59IH0pO1xuIiwidmFyIFNldCA9IHJlcXVpcmUoJy4vZXM2LnNldCcpO1xudmFyIGZyb20gPSByZXF1aXJlKCcuL19hcnJheS1mcm9tLWl0ZXJhYmxlJyk7XG52YXIgbWV0YWRhdGEgPSByZXF1aXJlKCcuL19tZXRhZGF0YScpO1xudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi9fYW4tb2JqZWN0Jyk7XG52YXIgZ2V0UHJvdG90eXBlT2YgPSByZXF1aXJlKCcuL19vYmplY3QtZ3BvJyk7XG52YXIgb3JkaW5hcnlPd25NZXRhZGF0YUtleXMgPSBtZXRhZGF0YS5rZXlzO1xudmFyIHRvTWV0YUtleSA9IG1ldGFkYXRhLmtleTtcblxudmFyIG9yZGluYXJ5TWV0YWRhdGFLZXlzID0gZnVuY3Rpb24gKE8sIFApIHtcbiAgdmFyIG9LZXlzID0gb3JkaW5hcnlPd25NZXRhZGF0YUtleXMoTywgUCk7XG4gIHZhciBwYXJlbnQgPSBnZXRQcm90b3R5cGVPZihPKTtcbiAgaWYgKHBhcmVudCA9PT0gbnVsbCkgcmV0dXJuIG9LZXlzO1xuICB2YXIgcEtleXMgPSBvcmRpbmFyeU1ldGFkYXRhS2V5cyhwYXJlbnQsIFApO1xuICByZXR1cm4gcEtleXMubGVuZ3RoID8gb0tleXMubGVuZ3RoID8gZnJvbShuZXcgU2V0KG9LZXlzLmNvbmNhdChwS2V5cykpKSA6IHBLZXlzIDogb0tleXM7XG59O1xuXG5tZXRhZGF0YS5leHAoeyBnZXRNZXRhZGF0YUtleXM6IGZ1bmN0aW9uIGdldE1ldGFkYXRhS2V5cyh0YXJnZXQgLyogLCB0YXJnZXRLZXkgKi8pIHtcbiAgcmV0dXJuIG9yZGluYXJ5TWV0YWRhdGFLZXlzKGFuT2JqZWN0KHRhcmdldCksIGFyZ3VtZW50cy5sZW5ndGggPCAyID8gdW5kZWZpbmVkIDogdG9NZXRhS2V5KGFyZ3VtZW50c1sxXSkpO1xufSB9KTtcbiIsInZhciBtZXRhZGF0YSA9IHJlcXVpcmUoJy4vX21ldGFkYXRhJyk7XG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuL19hbi1vYmplY3QnKTtcbnZhciBnZXRQcm90b3R5cGVPZiA9IHJlcXVpcmUoJy4vX29iamVjdC1ncG8nKTtcbnZhciBvcmRpbmFyeUhhc093bk1ldGFkYXRhID0gbWV0YWRhdGEuaGFzO1xudmFyIG9yZGluYXJ5R2V0T3duTWV0YWRhdGEgPSBtZXRhZGF0YS5nZXQ7XG52YXIgdG9NZXRhS2V5ID0gbWV0YWRhdGEua2V5O1xuXG52YXIgb3JkaW5hcnlHZXRNZXRhZGF0YSA9IGZ1bmN0aW9uIChNZXRhZGF0YUtleSwgTywgUCkge1xuICB2YXIgaGFzT3duID0gb3JkaW5hcnlIYXNPd25NZXRhZGF0YShNZXRhZGF0YUtleSwgTywgUCk7XG4gIGlmIChoYXNPd24pIHJldHVybiBvcmRpbmFyeUdldE93bk1ldGFkYXRhKE1ldGFkYXRhS2V5LCBPLCBQKTtcbiAgdmFyIHBhcmVudCA9IGdldFByb3RvdHlwZU9mKE8pO1xuICByZXR1cm4gcGFyZW50ICE9PSBudWxsID8gb3JkaW5hcnlHZXRNZXRhZGF0YShNZXRhZGF0YUtleSwgcGFyZW50LCBQKSA6IHVuZGVmaW5lZDtcbn07XG5cbm1ldGFkYXRhLmV4cCh7IGdldE1ldGFkYXRhOiBmdW5jdGlvbiBnZXRNZXRhZGF0YShtZXRhZGF0YUtleSwgdGFyZ2V0IC8qICwgdGFyZ2V0S2V5ICovKSB7XG4gIHJldHVybiBvcmRpbmFyeUdldE1ldGFkYXRhKG1ldGFkYXRhS2V5LCBhbk9iamVjdCh0YXJnZXQpLCBhcmd1bWVudHMubGVuZ3RoIDwgMyA/IHVuZGVmaW5lZCA6IHRvTWV0YUtleShhcmd1bWVudHNbMl0pKTtcbn0gfSk7XG4iLCJ2YXIgbWV0YWRhdGEgPSByZXF1aXJlKCcuL19tZXRhZGF0YScpO1xudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi9fYW4tb2JqZWN0Jyk7XG52YXIgb3JkaW5hcnlPd25NZXRhZGF0YUtleXMgPSBtZXRhZGF0YS5rZXlzO1xudmFyIHRvTWV0YUtleSA9IG1ldGFkYXRhLmtleTtcblxubWV0YWRhdGEuZXhwKHsgZ2V0T3duTWV0YWRhdGFLZXlzOiBmdW5jdGlvbiBnZXRPd25NZXRhZGF0YUtleXModGFyZ2V0IC8qICwgdGFyZ2V0S2V5ICovKSB7XG4gIHJldHVybiBvcmRpbmFyeU93bk1ldGFkYXRhS2V5cyhhbk9iamVjdCh0YXJnZXQpLCBhcmd1bWVudHMubGVuZ3RoIDwgMiA/IHVuZGVmaW5lZCA6IHRvTWV0YUtleShhcmd1bWVudHNbMV0pKTtcbn0gfSk7XG4iLCJ2YXIgbWV0YWRhdGEgPSByZXF1aXJlKCcuL19tZXRhZGF0YScpO1xudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi9fYW4tb2JqZWN0Jyk7XG52YXIgb3JkaW5hcnlHZXRPd25NZXRhZGF0YSA9IG1ldGFkYXRhLmdldDtcbnZhciB0b01ldGFLZXkgPSBtZXRhZGF0YS5rZXk7XG5cbm1ldGFkYXRhLmV4cCh7IGdldE93bk1ldGFkYXRhOiBmdW5jdGlvbiBnZXRPd25NZXRhZGF0YShtZXRhZGF0YUtleSwgdGFyZ2V0IC8qICwgdGFyZ2V0S2V5ICovKSB7XG4gIHJldHVybiBvcmRpbmFyeUdldE93bk1ldGFkYXRhKG1ldGFkYXRhS2V5LCBhbk9iamVjdCh0YXJnZXQpXG4gICAgLCBhcmd1bWVudHMubGVuZ3RoIDwgMyA/IHVuZGVmaW5lZCA6IHRvTWV0YUtleShhcmd1bWVudHNbMl0pKTtcbn0gfSk7XG4iLCJ2YXIgbWV0YWRhdGEgPSByZXF1aXJlKCcuL19tZXRhZGF0YScpO1xudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi9fYW4tb2JqZWN0Jyk7XG52YXIgZ2V0UHJvdG90eXBlT2YgPSByZXF1aXJlKCcuL19vYmplY3QtZ3BvJyk7XG52YXIgb3JkaW5hcnlIYXNPd25NZXRhZGF0YSA9IG1ldGFkYXRhLmhhcztcbnZhciB0b01ldGFLZXkgPSBtZXRhZGF0YS5rZXk7XG5cbnZhciBvcmRpbmFyeUhhc01ldGFkYXRhID0gZnVuY3Rpb24gKE1ldGFkYXRhS2V5LCBPLCBQKSB7XG4gIHZhciBoYXNPd24gPSBvcmRpbmFyeUhhc093bk1ldGFkYXRhKE1ldGFkYXRhS2V5LCBPLCBQKTtcbiAgaWYgKGhhc093bikgcmV0dXJuIHRydWU7XG4gIHZhciBwYXJlbnQgPSBnZXRQcm90b3R5cGVPZihPKTtcbiAgcmV0dXJuIHBhcmVudCAhPT0gbnVsbCA/IG9yZGluYXJ5SGFzTWV0YWRhdGEoTWV0YWRhdGFLZXksIHBhcmVudCwgUCkgOiBmYWxzZTtcbn07XG5cbm1ldGFkYXRhLmV4cCh7IGhhc01ldGFkYXRhOiBmdW5jdGlvbiBoYXNNZXRhZGF0YShtZXRhZGF0YUtleSwgdGFyZ2V0IC8qICwgdGFyZ2V0S2V5ICovKSB7XG4gIHJldHVybiBvcmRpbmFyeUhhc01ldGFkYXRhKG1ldGFkYXRhS2V5LCBhbk9iamVjdCh0YXJnZXQpLCBhcmd1bWVudHMubGVuZ3RoIDwgMyA/IHVuZGVmaW5lZCA6IHRvTWV0YUtleShhcmd1bWVudHNbMl0pKTtcbn0gfSk7XG4iLCJ2YXIgbWV0YWRhdGEgPSByZXF1aXJlKCcuL19tZXRhZGF0YScpO1xudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi9fYW4tb2JqZWN0Jyk7XG52YXIgb3JkaW5hcnlIYXNPd25NZXRhZGF0YSA9IG1ldGFkYXRhLmhhcztcbnZhciB0b01ldGFLZXkgPSBtZXRhZGF0YS5rZXk7XG5cbm1ldGFkYXRhLmV4cCh7IGhhc093bk1ldGFkYXRhOiBmdW5jdGlvbiBoYXNPd25NZXRhZGF0YShtZXRhZGF0YUtleSwgdGFyZ2V0IC8qICwgdGFyZ2V0S2V5ICovKSB7XG4gIHJldHVybiBvcmRpbmFyeUhhc093bk1ldGFkYXRhKG1ldGFkYXRhS2V5LCBhbk9iamVjdCh0YXJnZXQpXG4gICAgLCBhcmd1bWVudHMubGVuZ3RoIDwgMyA/IHVuZGVmaW5lZCA6IHRvTWV0YUtleShhcmd1bWVudHNbMl0pKTtcbn0gfSk7XG4iLCJ2YXIgJG1ldGFkYXRhID0gcmVxdWlyZSgnLi9fbWV0YWRhdGEnKTtcbnZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4vX2FuLW9iamVjdCcpO1xudmFyIGFGdW5jdGlvbiA9IHJlcXVpcmUoJy4vX2EtZnVuY3Rpb24nKTtcbnZhciB0b01ldGFLZXkgPSAkbWV0YWRhdGEua2V5O1xudmFyIG9yZGluYXJ5RGVmaW5lT3duTWV0YWRhdGEgPSAkbWV0YWRhdGEuc2V0O1xuXG4kbWV0YWRhdGEuZXhwKHsgbWV0YWRhdGE6IGZ1bmN0aW9uIG1ldGFkYXRhKG1ldGFkYXRhS2V5LCBtZXRhZGF0YVZhbHVlKSB7XG4gIHJldHVybiBmdW5jdGlvbiBkZWNvcmF0b3IodGFyZ2V0LCB0YXJnZXRLZXkpIHtcbiAgICBvcmRpbmFyeURlZmluZU93bk1ldGFkYXRhKFxuICAgICAgbWV0YWRhdGFLZXksIG1ldGFkYXRhVmFsdWUsXG4gICAgICAodGFyZ2V0S2V5ICE9PSB1bmRlZmluZWQgPyBhbk9iamVjdCA6IGFGdW5jdGlvbikodGFyZ2V0KSxcbiAgICAgIHRvTWV0YUtleSh0YXJnZXRLZXkpXG4gICAgKTtcbiAgfTtcbn0gfSk7XG4iLCIvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL3Byb3Bvc2FsLXNldG1hcC1vZmZyb20vI3NlYy1zZXQuZnJvbVxucmVxdWlyZSgnLi9fc2V0LWNvbGxlY3Rpb24tZnJvbScpKCdTZXQnKTtcbiIsIi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vcHJvcG9zYWwtc2V0bWFwLW9mZnJvbS8jc2VjLXNldC5vZlxucmVxdWlyZSgnLi9fc2V0LWNvbGxlY3Rpb24tb2YnKSgnU2V0Jyk7XG4iLCIvLyBodHRwczovL2dpdGh1Yi5jb20vRGF2aWRCcnVhbnQvTWFwLVNldC5wcm90b3R5cGUudG9KU09OXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xuXG4kZXhwb3J0KCRleHBvcnQuUCArICRleHBvcnQuUiwgJ1NldCcsIHsgdG9KU09OOiByZXF1aXJlKCcuL19jb2xsZWN0aW9uLXRvLWpzb24nKSgnU2V0JykgfSk7XG4iLCIndXNlIHN0cmljdCc7XG4vLyBodHRwczovL2dpdGh1Yi5jb20vbWF0aGlhc2J5bmVucy9TdHJpbmcucHJvdG90eXBlLmF0XG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyICRhdCA9IHJlcXVpcmUoJy4vX3N0cmluZy1hdCcpKHRydWUpO1xuXG4kZXhwb3J0KCRleHBvcnQuUCwgJ1N0cmluZycsIHtcbiAgYXQ6IGZ1bmN0aW9uIGF0KHBvcykge1xuICAgIHJldHVybiAkYXQodGhpcywgcG9zKTtcbiAgfVxufSk7XG4iLCIndXNlIHN0cmljdCc7XG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL1N0cmluZy5wcm90b3R5cGUubWF0Y2hBbGwvXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyIGRlZmluZWQgPSByZXF1aXJlKCcuL19kZWZpbmVkJyk7XG52YXIgdG9MZW5ndGggPSByZXF1aXJlKCcuL190by1sZW5ndGgnKTtcbnZhciBpc1JlZ0V4cCA9IHJlcXVpcmUoJy4vX2lzLXJlZ2V4cCcpO1xudmFyIGdldEZsYWdzID0gcmVxdWlyZSgnLi9fZmxhZ3MnKTtcbnZhciBSZWdFeHBQcm90byA9IFJlZ0V4cC5wcm90b3R5cGU7XG5cbnZhciAkUmVnRXhwU3RyaW5nSXRlcmF0b3IgPSBmdW5jdGlvbiAocmVnZXhwLCBzdHJpbmcpIHtcbiAgdGhpcy5fciA9IHJlZ2V4cDtcbiAgdGhpcy5fcyA9IHN0cmluZztcbn07XG5cbnJlcXVpcmUoJy4vX2l0ZXItY3JlYXRlJykoJFJlZ0V4cFN0cmluZ0l0ZXJhdG9yLCAnUmVnRXhwIFN0cmluZycsIGZ1bmN0aW9uIG5leHQoKSB7XG4gIHZhciBtYXRjaCA9IHRoaXMuX3IuZXhlYyh0aGlzLl9zKTtcbiAgcmV0dXJuIHsgdmFsdWU6IG1hdGNoLCBkb25lOiBtYXRjaCA9PT0gbnVsbCB9O1xufSk7XG5cbiRleHBvcnQoJGV4cG9ydC5QLCAnU3RyaW5nJywge1xuICBtYXRjaEFsbDogZnVuY3Rpb24gbWF0Y2hBbGwocmVnZXhwKSB7XG4gICAgZGVmaW5lZCh0aGlzKTtcbiAgICBpZiAoIWlzUmVnRXhwKHJlZ2V4cCkpIHRocm93IFR5cGVFcnJvcihyZWdleHAgKyAnIGlzIG5vdCBhIHJlZ2V4cCEnKTtcbiAgICB2YXIgUyA9IFN0cmluZyh0aGlzKTtcbiAgICB2YXIgZmxhZ3MgPSAnZmxhZ3MnIGluIFJlZ0V4cFByb3RvID8gU3RyaW5nKHJlZ2V4cC5mbGFncykgOiBnZXRGbGFncy5jYWxsKHJlZ2V4cCk7XG4gICAgdmFyIHJ4ID0gbmV3IFJlZ0V4cChyZWdleHAuc291cmNlLCB+ZmxhZ3MuaW5kZXhPZignZycpID8gZmxhZ3MgOiAnZycgKyBmbGFncyk7XG4gICAgcngubGFzdEluZGV4ID0gdG9MZW5ndGgocmVnZXhwLmxhc3RJbmRleCk7XG4gICAgcmV0dXJuIG5ldyAkUmVnRXhwU3RyaW5nSXRlcmF0b3IocngsIFMpO1xuICB9XG59KTtcbiIsIid1c2Ugc3RyaWN0Jztcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS90YzM5L3Byb3Bvc2FsLXN0cmluZy1wYWQtc3RhcnQtZW5kXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyICRwYWQgPSByZXF1aXJlKCcuL19zdHJpbmctcGFkJyk7XG52YXIgdXNlckFnZW50ID0gcmVxdWlyZSgnLi9fdXNlci1hZ2VudCcpO1xuXG4vLyBodHRwczovL2dpdGh1Yi5jb20vemxvaXJvY2svY29yZS1qcy9pc3N1ZXMvMjgwXG4kZXhwb3J0KCRleHBvcnQuUCArICRleHBvcnQuRiAqIC9WZXJzaW9uXFwvMTBcXC5cXGQrKFxcLlxcZCspPyBTYWZhcmlcXC8vLnRlc3QodXNlckFnZW50KSwgJ1N0cmluZycsIHtcbiAgcGFkRW5kOiBmdW5jdGlvbiBwYWRFbmQobWF4TGVuZ3RoIC8qICwgZmlsbFN0cmluZyA9ICcgJyAqLykge1xuICAgIHJldHVybiAkcGFkKHRoaXMsIG1heExlbmd0aCwgYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQsIGZhbHNlKTtcbiAgfVxufSk7XG4iLCIndXNlIHN0cmljdCc7XG4vLyBodHRwczovL2dpdGh1Yi5jb20vdGMzOS9wcm9wb3NhbC1zdHJpbmctcGFkLXN0YXJ0LWVuZFxudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciAkcGFkID0gcmVxdWlyZSgnLi9fc3RyaW5nLXBhZCcpO1xudmFyIHVzZXJBZ2VudCA9IHJlcXVpcmUoJy4vX3VzZXItYWdlbnQnKTtcblxuLy8gaHR0cHM6Ly9naXRodWIuY29tL3psb2lyb2NrL2NvcmUtanMvaXNzdWVzLzI4MFxuJGV4cG9ydCgkZXhwb3J0LlAgKyAkZXhwb3J0LkYgKiAvVmVyc2lvblxcLzEwXFwuXFxkKyhcXC5cXGQrKT8gU2FmYXJpXFwvLy50ZXN0KHVzZXJBZ2VudCksICdTdHJpbmcnLCB7XG4gIHBhZFN0YXJ0OiBmdW5jdGlvbiBwYWRTdGFydChtYXhMZW5ndGggLyogLCBmaWxsU3RyaW5nID0gJyAnICovKSB7XG4gICAgcmV0dXJuICRwYWQodGhpcywgbWF4TGVuZ3RoLCBhcmd1bWVudHMubGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IHVuZGVmaW5lZCwgdHJ1ZSk7XG4gIH1cbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xuLy8gaHR0cHM6Ly9naXRodWIuY29tL3NlYm1hcmtiYWdlL2VjbWFzY3JpcHQtc3RyaW5nLWxlZnQtcmlnaHQtdHJpbVxucmVxdWlyZSgnLi9fc3RyaW5nLXRyaW0nKSgndHJpbUxlZnQnLCBmdW5jdGlvbiAoJHRyaW0pIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIHRyaW1MZWZ0KCkge1xuICAgIHJldHVybiAkdHJpbSh0aGlzLCAxKTtcbiAgfTtcbn0sICd0cmltU3RhcnQnKTtcbiIsIid1c2Ugc3RyaWN0Jztcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9zZWJtYXJrYmFnZS9lY21hc2NyaXB0LXN0cmluZy1sZWZ0LXJpZ2h0LXRyaW1cbnJlcXVpcmUoJy4vX3N0cmluZy10cmltJykoJ3RyaW1SaWdodCcsIGZ1bmN0aW9uICgkdHJpbSkge1xuICByZXR1cm4gZnVuY3Rpb24gdHJpbVJpZ2h0KCkge1xuICAgIHJldHVybiAkdHJpbSh0aGlzLCAyKTtcbiAgfTtcbn0sICd0cmltRW5kJyk7XG4iLCJyZXF1aXJlKCcuL193a3MtZGVmaW5lJykoJ2FzeW5jSXRlcmF0b3InKTtcbiIsInJlcXVpcmUoJy4vX3drcy1kZWZpbmUnKSgnb2JzZXJ2YWJsZScpO1xuIiwiLy8gaHR0cHM6Ly9naXRodWIuY29tL3RjMzkvcHJvcG9zYWwtZ2xvYmFsXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xuXG4kZXhwb3J0KCRleHBvcnQuUywgJ1N5c3RlbScsIHsgZ2xvYmFsOiByZXF1aXJlKCcuL19nbG9iYWwnKSB9KTtcbiIsIi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vcHJvcG9zYWwtc2V0bWFwLW9mZnJvbS8jc2VjLXdlYWttYXAuZnJvbVxucmVxdWlyZSgnLi9fc2V0LWNvbGxlY3Rpb24tZnJvbScpKCdXZWFrTWFwJyk7XG4iLCIvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL3Byb3Bvc2FsLXNldG1hcC1vZmZyb20vI3NlYy13ZWFrbWFwLm9mXG5yZXF1aXJlKCcuL19zZXQtY29sbGVjdGlvbi1vZicpKCdXZWFrTWFwJyk7XG4iLCIvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL3Byb3Bvc2FsLXNldG1hcC1vZmZyb20vI3NlYy13ZWFrc2V0LmZyb21cbnJlcXVpcmUoJy4vX3NldC1jb2xsZWN0aW9uLWZyb20nKSgnV2Vha1NldCcpO1xuIiwiLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9wcm9wb3NhbC1zZXRtYXAtb2Zmcm9tLyNzZWMtd2Vha3NldC5vZlxucmVxdWlyZSgnLi9fc2V0LWNvbGxlY3Rpb24tb2YnKSgnV2Vha1NldCcpO1xuIiwidmFyICRpdGVyYXRvcnMgPSByZXF1aXJlKCcuL2VzNi5hcnJheS5pdGVyYXRvcicpO1xudmFyIGdldEtleXMgPSByZXF1aXJlKCcuL19vYmplY3Qta2V5cycpO1xudmFyIHJlZGVmaW5lID0gcmVxdWlyZSgnLi9fcmVkZWZpbmUnKTtcbnZhciBnbG9iYWwgPSByZXF1aXJlKCcuL19nbG9iYWwnKTtcbnZhciBoaWRlID0gcmVxdWlyZSgnLi9faGlkZScpO1xudmFyIEl0ZXJhdG9ycyA9IHJlcXVpcmUoJy4vX2l0ZXJhdG9ycycpO1xudmFyIHdrcyA9IHJlcXVpcmUoJy4vX3drcycpO1xudmFyIElURVJBVE9SID0gd2tzKCdpdGVyYXRvcicpO1xudmFyIFRPX1NUUklOR19UQUcgPSB3a3MoJ3RvU3RyaW5nVGFnJyk7XG52YXIgQXJyYXlWYWx1ZXMgPSBJdGVyYXRvcnMuQXJyYXk7XG5cbnZhciBET01JdGVyYWJsZXMgPSB7XG4gIENTU1J1bGVMaXN0OiB0cnVlLCAvLyBUT0RPOiBOb3Qgc3BlYyBjb21wbGlhbnQsIHNob3VsZCBiZSBmYWxzZS5cbiAgQ1NTU3R5bGVEZWNsYXJhdGlvbjogZmFsc2UsXG4gIENTU1ZhbHVlTGlzdDogZmFsc2UsXG4gIENsaWVudFJlY3RMaXN0OiBmYWxzZSxcbiAgRE9NUmVjdExpc3Q6IGZhbHNlLFxuICBET01TdHJpbmdMaXN0OiBmYWxzZSxcbiAgRE9NVG9rZW5MaXN0OiB0cnVlLFxuICBEYXRhVHJhbnNmZXJJdGVtTGlzdDogZmFsc2UsXG4gIEZpbGVMaXN0OiBmYWxzZSxcbiAgSFRNTEFsbENvbGxlY3Rpb246IGZhbHNlLFxuICBIVE1MQ29sbGVjdGlvbjogZmFsc2UsXG4gIEhUTUxGb3JtRWxlbWVudDogZmFsc2UsXG4gIEhUTUxTZWxlY3RFbGVtZW50OiBmYWxzZSxcbiAgTWVkaWFMaXN0OiB0cnVlLCAvLyBUT0RPOiBOb3Qgc3BlYyBjb21wbGlhbnQsIHNob3VsZCBiZSBmYWxzZS5cbiAgTWltZVR5cGVBcnJheTogZmFsc2UsXG4gIE5hbWVkTm9kZU1hcDogZmFsc2UsXG4gIE5vZGVMaXN0OiB0cnVlLFxuICBQYWludFJlcXVlc3RMaXN0OiBmYWxzZSxcbiAgUGx1Z2luOiBmYWxzZSxcbiAgUGx1Z2luQXJyYXk6IGZhbHNlLFxuICBTVkdMZW5ndGhMaXN0OiBmYWxzZSxcbiAgU1ZHTnVtYmVyTGlzdDogZmFsc2UsXG4gIFNWR1BhdGhTZWdMaXN0OiBmYWxzZSxcbiAgU1ZHUG9pbnRMaXN0OiBmYWxzZSxcbiAgU1ZHU3RyaW5nTGlzdDogZmFsc2UsXG4gIFNWR1RyYW5zZm9ybUxpc3Q6IGZhbHNlLFxuICBTb3VyY2VCdWZmZXJMaXN0OiBmYWxzZSxcbiAgU3R5bGVTaGVldExpc3Q6IHRydWUsIC8vIFRPRE86IE5vdCBzcGVjIGNvbXBsaWFudCwgc2hvdWxkIGJlIGZhbHNlLlxuICBUZXh0VHJhY2tDdWVMaXN0OiBmYWxzZSxcbiAgVGV4dFRyYWNrTGlzdDogZmFsc2UsXG4gIFRvdWNoTGlzdDogZmFsc2Vcbn07XG5cbmZvciAodmFyIGNvbGxlY3Rpb25zID0gZ2V0S2V5cyhET01JdGVyYWJsZXMpLCBpID0gMDsgaSA8IGNvbGxlY3Rpb25zLmxlbmd0aDsgaSsrKSB7XG4gIHZhciBOQU1FID0gY29sbGVjdGlvbnNbaV07XG4gIHZhciBleHBsaWNpdCA9IERPTUl0ZXJhYmxlc1tOQU1FXTtcbiAgdmFyIENvbGxlY3Rpb24gPSBnbG9iYWxbTkFNRV07XG4gIHZhciBwcm90byA9IENvbGxlY3Rpb24gJiYgQ29sbGVjdGlvbi5wcm90b3R5cGU7XG4gIHZhciBrZXk7XG4gIGlmIChwcm90bykge1xuICAgIGlmICghcHJvdG9bSVRFUkFUT1JdKSBoaWRlKHByb3RvLCBJVEVSQVRPUiwgQXJyYXlWYWx1ZXMpO1xuICAgIGlmICghcHJvdG9bVE9fU1RSSU5HX1RBR10pIGhpZGUocHJvdG8sIFRPX1NUUklOR19UQUcsIE5BTUUpO1xuICAgIEl0ZXJhdG9yc1tOQU1FXSA9IEFycmF5VmFsdWVzO1xuICAgIGlmIChleHBsaWNpdCkgZm9yIChrZXkgaW4gJGl0ZXJhdG9ycykgaWYgKCFwcm90b1trZXldKSByZWRlZmluZShwcm90bywga2V5LCAkaXRlcmF0b3JzW2tleV0sIHRydWUpO1xuICB9XG59XG4iLCJ2YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyICR0YXNrID0gcmVxdWlyZSgnLi9fdGFzaycpO1xuJGV4cG9ydCgkZXhwb3J0LkcgKyAkZXhwb3J0LkIsIHtcbiAgc2V0SW1tZWRpYXRlOiAkdGFzay5zZXQsXG4gIGNsZWFySW1tZWRpYXRlOiAkdGFzay5jbGVhclxufSk7XG4iLCIvLyBpZTktIHNldFRpbWVvdXQgJiBzZXRJbnRlcnZhbCBhZGRpdGlvbmFsIHBhcmFtZXRlcnMgZml4XG52YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi9fZ2xvYmFsJyk7XG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyIHVzZXJBZ2VudCA9IHJlcXVpcmUoJy4vX3VzZXItYWdlbnQnKTtcbnZhciBzbGljZSA9IFtdLnNsaWNlO1xudmFyIE1TSUUgPSAvTVNJRSAuXFwuLy50ZXN0KHVzZXJBZ2VudCk7IC8vIDwtIGRpcnR5IGllOS0gY2hlY2tcbnZhciB3cmFwID0gZnVuY3Rpb24gKHNldCkge1xuICByZXR1cm4gZnVuY3Rpb24gKGZuLCB0aW1lIC8qICwgLi4uYXJncyAqLykge1xuICAgIHZhciBib3VuZEFyZ3MgPSBhcmd1bWVudHMubGVuZ3RoID4gMjtcbiAgICB2YXIgYXJncyA9IGJvdW5kQXJncyA/IHNsaWNlLmNhbGwoYXJndW1lbnRzLCAyKSA6IGZhbHNlO1xuICAgIHJldHVybiBzZXQoYm91bmRBcmdzID8gZnVuY3Rpb24gKCkge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLW5ldy1mdW5jXG4gICAgICAodHlwZW9mIGZuID09ICdmdW5jdGlvbicgPyBmbiA6IEZ1bmN0aW9uKGZuKSkuYXBwbHkodGhpcywgYXJncyk7XG4gICAgfSA6IGZuLCB0aW1lKTtcbiAgfTtcbn07XG4kZXhwb3J0KCRleHBvcnQuRyArICRleHBvcnQuQiArICRleHBvcnQuRiAqIE1TSUUsIHtcbiAgc2V0VGltZW91dDogd3JhcChnbG9iYWwuc2V0VGltZW91dCksXG4gIHNldEludGVydmFsOiB3cmFwKGdsb2JhbC5zZXRJbnRlcnZhbClcbn0pO1xuIiwicmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5zeW1ib2wnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYub2JqZWN0LmNyZWF0ZScpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5vYmplY3QuZGVmaW5lLXByb3BlcnR5Jyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2Lm9iamVjdC5kZWZpbmUtcHJvcGVydGllcycpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5vYmplY3QuZ2V0LW93bi1wcm9wZXJ0eS1kZXNjcmlwdG9yJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2Lm9iamVjdC5nZXQtcHJvdG90eXBlLW9mJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2Lm9iamVjdC5rZXlzJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2Lm9iamVjdC5nZXQtb3duLXByb3BlcnR5LW5hbWVzJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2Lm9iamVjdC5mcmVlemUnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYub2JqZWN0LnNlYWwnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYub2JqZWN0LnByZXZlbnQtZXh0ZW5zaW9ucycpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5vYmplY3QuaXMtZnJvemVuJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2Lm9iamVjdC5pcy1zZWFsZWQnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYub2JqZWN0LmlzLWV4dGVuc2libGUnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYub2JqZWN0LmFzc2lnbicpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5vYmplY3QuaXMnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYub2JqZWN0LnNldC1wcm90b3R5cGUtb2YnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYub2JqZWN0LnRvLXN0cmluZycpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5mdW5jdGlvbi5iaW5kJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LmZ1bmN0aW9uLm5hbWUnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYuZnVuY3Rpb24uaGFzLWluc3RhbmNlJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LnBhcnNlLWludCcpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5wYXJzZS1mbG9hdCcpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5udW1iZXIuY29uc3RydWN0b3InKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYubnVtYmVyLnRvLWZpeGVkJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2Lm51bWJlci50by1wcmVjaXNpb24nKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYubnVtYmVyLmVwc2lsb24nKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYubnVtYmVyLmlzLWZpbml0ZScpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5udW1iZXIuaXMtaW50ZWdlcicpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5udW1iZXIuaXMtbmFuJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2Lm51bWJlci5pcy1zYWZlLWludGVnZXInKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYubnVtYmVyLm1heC1zYWZlLWludGVnZXInKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYubnVtYmVyLm1pbi1zYWZlLWludGVnZXInKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYubnVtYmVyLnBhcnNlLWZsb2F0Jyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2Lm51bWJlci5wYXJzZS1pbnQnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYubWF0aC5hY29zaCcpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5tYXRoLmFzaW5oJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2Lm1hdGguYXRhbmgnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYubWF0aC5jYnJ0Jyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2Lm1hdGguY2x6MzInKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYubWF0aC5jb3NoJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2Lm1hdGguZXhwbTEnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYubWF0aC5mcm91bmQnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYubWF0aC5oeXBvdCcpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5tYXRoLmltdWwnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYubWF0aC5sb2cxMCcpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5tYXRoLmxvZzFwJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2Lm1hdGgubG9nMicpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5tYXRoLnNpZ24nKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYubWF0aC5zaW5oJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2Lm1hdGgudGFuaCcpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5tYXRoLnRydW5jJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LnN0cmluZy5mcm9tLWNvZGUtcG9pbnQnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYuc3RyaW5nLnJhdycpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5zdHJpbmcudHJpbScpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5zdHJpbmcuaXRlcmF0b3InKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYuc3RyaW5nLmNvZGUtcG9pbnQtYXQnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYuc3RyaW5nLmVuZHMtd2l0aCcpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5zdHJpbmcuaW5jbHVkZXMnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYuc3RyaW5nLnJlcGVhdCcpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5zdHJpbmcuc3RhcnRzLXdpdGgnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYuc3RyaW5nLmFuY2hvcicpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5zdHJpbmcuYmlnJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LnN0cmluZy5ibGluaycpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5zdHJpbmcuYm9sZCcpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5zdHJpbmcuZml4ZWQnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYuc3RyaW5nLmZvbnRjb2xvcicpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5zdHJpbmcuZm9udHNpemUnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYuc3RyaW5nLml0YWxpY3MnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYuc3RyaW5nLmxpbmsnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYuc3RyaW5nLnNtYWxsJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LnN0cmluZy5zdHJpa2UnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYuc3RyaW5nLnN1YicpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5zdHJpbmcuc3VwJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LmRhdGUubm93Jyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LmRhdGUudG8tanNvbicpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5kYXRlLnRvLWlzby1zdHJpbmcnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYuZGF0ZS50by1zdHJpbmcnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYuZGF0ZS50by1wcmltaXRpdmUnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYuYXJyYXkuaXMtYXJyYXknKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYuYXJyYXkuZnJvbScpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5hcnJheS5vZicpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5hcnJheS5qb2luJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LmFycmF5LnNsaWNlJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LmFycmF5LnNvcnQnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYuYXJyYXkuZm9yLWVhY2gnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYuYXJyYXkubWFwJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LmFycmF5LmZpbHRlcicpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5hcnJheS5zb21lJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LmFycmF5LmV2ZXJ5Jyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LmFycmF5LnJlZHVjZScpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5hcnJheS5yZWR1Y2UtcmlnaHQnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYuYXJyYXkuaW5kZXgtb2YnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYuYXJyYXkubGFzdC1pbmRleC1vZicpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5hcnJheS5jb3B5LXdpdGhpbicpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5hcnJheS5maWxsJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LmFycmF5LmZpbmQnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYuYXJyYXkuZmluZC1pbmRleCcpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5hcnJheS5zcGVjaWVzJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LmFycmF5Lml0ZXJhdG9yJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LnJlZ2V4cC5jb25zdHJ1Y3RvcicpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5yZWdleHAudG8tc3RyaW5nJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LnJlZ2V4cC5mbGFncycpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5yZWdleHAubWF0Y2gnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYucmVnZXhwLnJlcGxhY2UnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYucmVnZXhwLnNlYXJjaCcpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5yZWdleHAuc3BsaXQnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYucHJvbWlzZScpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5tYXAnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYuc2V0Jyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LndlYWstbWFwJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LndlYWstc2V0Jyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LnR5cGVkLmFycmF5LWJ1ZmZlcicpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi50eXBlZC5kYXRhLXZpZXcnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYudHlwZWQuaW50OC1hcnJheScpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi50eXBlZC51aW50OC1hcnJheScpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi50eXBlZC51aW50OC1jbGFtcGVkLWFycmF5Jyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LnR5cGVkLmludDE2LWFycmF5Jyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LnR5cGVkLnVpbnQxNi1hcnJheScpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi50eXBlZC5pbnQzMi1hcnJheScpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi50eXBlZC51aW50MzItYXJyYXknKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYudHlwZWQuZmxvYXQzMi1hcnJheScpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi50eXBlZC5mbG9hdDY0LWFycmF5Jyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LnJlZmxlY3QuYXBwbHknKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYucmVmbGVjdC5jb25zdHJ1Y3QnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYucmVmbGVjdC5kZWZpbmUtcHJvcGVydHknKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYucmVmbGVjdC5kZWxldGUtcHJvcGVydHknKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYucmVmbGVjdC5lbnVtZXJhdGUnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYucmVmbGVjdC5nZXQnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYucmVmbGVjdC5nZXQtb3duLXByb3BlcnR5LWRlc2NyaXB0b3InKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYucmVmbGVjdC5nZXQtcHJvdG90eXBlLW9mJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LnJlZmxlY3QuaGFzJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LnJlZmxlY3QuaXMtZXh0ZW5zaWJsZScpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5yZWZsZWN0Lm93bi1rZXlzJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LnJlZmxlY3QucHJldmVudC1leHRlbnNpb25zJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LnJlZmxlY3Quc2V0Jyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LnJlZmxlY3Quc2V0LXByb3RvdHlwZS1vZicpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNy5hcnJheS5pbmNsdWRlcycpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNy5hcnJheS5mbGF0LW1hcCcpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNy5hcnJheS5mbGF0dGVuJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM3LnN0cmluZy5hdCcpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNy5zdHJpbmcucGFkLXN0YXJ0Jyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM3LnN0cmluZy5wYWQtZW5kJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM3LnN0cmluZy50cmltLWxlZnQnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczcuc3RyaW5nLnRyaW0tcmlnaHQnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczcuc3RyaW5nLm1hdGNoLWFsbCcpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNy5zeW1ib2wuYXN5bmMtaXRlcmF0b3InKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczcuc3ltYm9sLm9ic2VydmFibGUnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczcub2JqZWN0LmdldC1vd24tcHJvcGVydHktZGVzY3JpcHRvcnMnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczcub2JqZWN0LnZhbHVlcycpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNy5vYmplY3QuZW50cmllcycpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNy5vYmplY3QuZGVmaW5lLWdldHRlcicpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNy5vYmplY3QuZGVmaW5lLXNldHRlcicpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNy5vYmplY3QubG9va3VwLWdldHRlcicpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNy5vYmplY3QubG9va3VwLXNldHRlcicpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNy5tYXAudG8tanNvbicpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNy5zZXQudG8tanNvbicpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNy5tYXAub2YnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczcuc2V0Lm9mJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM3LndlYWstbWFwLm9mJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM3LndlYWstc2V0Lm9mJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM3Lm1hcC5mcm9tJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM3LnNldC5mcm9tJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM3LndlYWstbWFwLmZyb20nKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczcud2Vhay1zZXQuZnJvbScpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNy5nbG9iYWwnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczcuc3lzdGVtLmdsb2JhbCcpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNy5lcnJvci5pcy1lcnJvcicpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNy5tYXRoLmNsYW1wJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM3Lm1hdGguZGVnLXBlci1yYWQnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczcubWF0aC5kZWdyZWVzJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM3Lm1hdGguZnNjYWxlJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM3Lm1hdGguaWFkZGgnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczcubWF0aC5pc3ViaCcpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNy5tYXRoLmltdWxoJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM3Lm1hdGgucmFkLXBlci1kZWcnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczcubWF0aC5yYWRpYW5zJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM3Lm1hdGguc2NhbGUnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczcubWF0aC51bXVsaCcpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNy5tYXRoLnNpZ25iaXQnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczcucHJvbWlzZS5maW5hbGx5Jyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM3LnByb21pc2UudHJ5Jyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM3LnJlZmxlY3QuZGVmaW5lLW1ldGFkYXRhJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM3LnJlZmxlY3QuZGVsZXRlLW1ldGFkYXRhJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM3LnJlZmxlY3QuZ2V0LW1ldGFkYXRhJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM3LnJlZmxlY3QuZ2V0LW1ldGFkYXRhLWtleXMnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczcucmVmbGVjdC5nZXQtb3duLW1ldGFkYXRhJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM3LnJlZmxlY3QuZ2V0LW93bi1tZXRhZGF0YS1rZXlzJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM3LnJlZmxlY3QuaGFzLW1ldGFkYXRhJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM3LnJlZmxlY3QuaGFzLW93bi1tZXRhZGF0YScpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNy5yZWZsZWN0Lm1ldGFkYXRhJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM3LmFzYXAnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczcub2JzZXJ2YWJsZScpO1xucmVxdWlyZSgnLi9tb2R1bGVzL3dlYi50aW1lcnMnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy93ZWIuaW1tZWRpYXRlJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvd2ViLmRvbS5pdGVyYWJsZScpO1xubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL21vZHVsZXMvX2NvcmUnKTtcbiIsIi8qKlxuICogbWF0Y2hlc1NlbGVjdG9yIHYyLjAuMlxuICogbWF0Y2hlc1NlbGVjdG9yKCBlbGVtZW50LCAnLnNlbGVjdG9yJyApXG4gKiBNSVQgbGljZW5zZVxuICovXG5cbi8qanNoaW50IGJyb3dzZXI6IHRydWUsIHN0cmljdDogdHJ1ZSwgdW5kZWY6IHRydWUsIHVudXNlZDogdHJ1ZSAqL1xuXG4oIGZ1bmN0aW9uKCB3aW5kb3csIGZhY3RvcnkgKSB7XG4gIC8qZ2xvYmFsIGRlZmluZTogZmFsc2UsIG1vZHVsZTogZmFsc2UgKi9cbiAgJ3VzZSBzdHJpY3QnO1xuICAvLyB1bml2ZXJzYWwgbW9kdWxlIGRlZmluaXRpb25cbiAgaWYgKCB0eXBlb2YgZGVmaW5lID09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCApIHtcbiAgICAvLyBBTURcbiAgICBkZWZpbmUoIGZhY3RvcnkgKTtcbiAgfSBlbHNlIGlmICggdHlwZW9mIG1vZHVsZSA9PSAnb2JqZWN0JyAmJiBtb2R1bGUuZXhwb3J0cyApIHtcbiAgICAvLyBDb21tb25KU1xuICAgIG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeSgpO1xuICB9IGVsc2Uge1xuICAgIC8vIGJyb3dzZXIgZ2xvYmFsXG4gICAgd2luZG93Lm1hdGNoZXNTZWxlY3RvciA9IGZhY3RvcnkoKTtcbiAgfVxuXG59KCB3aW5kb3csIGZ1bmN0aW9uIGZhY3RvcnkoKSB7XG4gICd1c2Ugc3RyaWN0JztcblxuICB2YXIgbWF0Y2hlc01ldGhvZCA9ICggZnVuY3Rpb24oKSB7XG4gICAgdmFyIEVsZW1Qcm90byA9IHdpbmRvdy5FbGVtZW50LnByb3RvdHlwZTtcbiAgICAvLyBjaGVjayBmb3IgdGhlIHN0YW5kYXJkIG1ldGhvZCBuYW1lIGZpcnN0XG4gICAgaWYgKCBFbGVtUHJvdG8ubWF0Y2hlcyApIHtcbiAgICAgIHJldHVybiAnbWF0Y2hlcyc7XG4gICAgfVxuICAgIC8vIGNoZWNrIHVuLXByZWZpeGVkXG4gICAgaWYgKCBFbGVtUHJvdG8ubWF0Y2hlc1NlbGVjdG9yICkge1xuICAgICAgcmV0dXJuICdtYXRjaGVzU2VsZWN0b3InO1xuICAgIH1cbiAgICAvLyBjaGVjayB2ZW5kb3IgcHJlZml4ZXNcbiAgICB2YXIgcHJlZml4ZXMgPSBbICd3ZWJraXQnLCAnbW96JywgJ21zJywgJ28nIF07XG5cbiAgICBmb3IgKCB2YXIgaT0wOyBpIDwgcHJlZml4ZXMubGVuZ3RoOyBpKysgKSB7XG4gICAgICB2YXIgcHJlZml4ID0gcHJlZml4ZXNbaV07XG4gICAgICB2YXIgbWV0aG9kID0gcHJlZml4ICsgJ01hdGNoZXNTZWxlY3Rvcic7XG4gICAgICBpZiAoIEVsZW1Qcm90b1sgbWV0aG9kIF0gKSB7XG4gICAgICAgIHJldHVybiBtZXRob2Q7XG4gICAgICB9XG4gICAgfVxuICB9KSgpO1xuXG4gIHJldHVybiBmdW5jdGlvbiBtYXRjaGVzU2VsZWN0b3IoIGVsZW0sIHNlbGVjdG9yICkge1xuICAgIHJldHVybiBlbGVtWyBtYXRjaGVzTWV0aG9kIF0oIHNlbGVjdG9yICk7XG4gIH07XG5cbn0pKTtcbiIsIi8qKlxuICogRXZFbWl0dGVyIHYxLjEuMFxuICogTGlsJyBldmVudCBlbWl0dGVyXG4gKiBNSVQgTGljZW5zZVxuICovXG5cbi8qIGpzaGludCB1bnVzZWQ6IHRydWUsIHVuZGVmOiB0cnVlLCBzdHJpY3Q6IHRydWUgKi9cblxuKCBmdW5jdGlvbiggZ2xvYmFsLCBmYWN0b3J5ICkge1xuICAvLyB1bml2ZXJzYWwgbW9kdWxlIGRlZmluaXRpb25cbiAgLyoganNoaW50IHN0cmljdDogZmFsc2UgKi8gLyogZ2xvYmFscyBkZWZpbmUsIG1vZHVsZSwgd2luZG93ICovXG4gIGlmICggdHlwZW9mIGRlZmluZSA9PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgKSB7XG4gICAgLy8gQU1EIC0gUmVxdWlyZUpTXG4gICAgZGVmaW5lKCBmYWN0b3J5ICk7XG4gIH0gZWxzZSBpZiAoIHR5cGVvZiBtb2R1bGUgPT0gJ29iamVjdCcgJiYgbW9kdWxlLmV4cG9ydHMgKSB7XG4gICAgLy8gQ29tbW9uSlMgLSBCcm93c2VyaWZ5LCBXZWJwYWNrXG4gICAgbW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KCk7XG4gIH0gZWxzZSB7XG4gICAgLy8gQnJvd3NlciBnbG9iYWxzXG4gICAgZ2xvYmFsLkV2RW1pdHRlciA9IGZhY3RvcnkoKTtcbiAgfVxuXG59KCB0eXBlb2Ygd2luZG93ICE9ICd1bmRlZmluZWQnID8gd2luZG93IDogdGhpcywgZnVuY3Rpb24oKSB7XG5cblwidXNlIHN0cmljdFwiO1xuXG5mdW5jdGlvbiBFdkVtaXR0ZXIoKSB7fVxuXG52YXIgcHJvdG8gPSBFdkVtaXR0ZXIucHJvdG90eXBlO1xuXG5wcm90by5vbiA9IGZ1bmN0aW9uKCBldmVudE5hbWUsIGxpc3RlbmVyICkge1xuICBpZiAoICFldmVudE5hbWUgfHwgIWxpc3RlbmVyICkge1xuICAgIHJldHVybjtcbiAgfVxuICAvLyBzZXQgZXZlbnRzIGhhc2hcbiAgdmFyIGV2ZW50cyA9IHRoaXMuX2V2ZW50cyA9IHRoaXMuX2V2ZW50cyB8fCB7fTtcbiAgLy8gc2V0IGxpc3RlbmVycyBhcnJheVxuICB2YXIgbGlzdGVuZXJzID0gZXZlbnRzWyBldmVudE5hbWUgXSA9IGV2ZW50c1sgZXZlbnROYW1lIF0gfHwgW107XG4gIC8vIG9ubHkgYWRkIG9uY2VcbiAgaWYgKCBsaXN0ZW5lcnMuaW5kZXhPZiggbGlzdGVuZXIgKSA9PSAtMSApIHtcbiAgICBsaXN0ZW5lcnMucHVzaCggbGlzdGVuZXIgKTtcbiAgfVxuXG4gIHJldHVybiB0aGlzO1xufTtcblxucHJvdG8ub25jZSA9IGZ1bmN0aW9uKCBldmVudE5hbWUsIGxpc3RlbmVyICkge1xuICBpZiAoICFldmVudE5hbWUgfHwgIWxpc3RlbmVyICkge1xuICAgIHJldHVybjtcbiAgfVxuICAvLyBhZGQgZXZlbnRcbiAgdGhpcy5vbiggZXZlbnROYW1lLCBsaXN0ZW5lciApO1xuICAvLyBzZXQgb25jZSBmbGFnXG4gIC8vIHNldCBvbmNlRXZlbnRzIGhhc2hcbiAgdmFyIG9uY2VFdmVudHMgPSB0aGlzLl9vbmNlRXZlbnRzID0gdGhpcy5fb25jZUV2ZW50cyB8fCB7fTtcbiAgLy8gc2V0IG9uY2VMaXN0ZW5lcnMgb2JqZWN0XG4gIHZhciBvbmNlTGlzdGVuZXJzID0gb25jZUV2ZW50c1sgZXZlbnROYW1lIF0gPSBvbmNlRXZlbnRzWyBldmVudE5hbWUgXSB8fCB7fTtcbiAgLy8gc2V0IGZsYWdcbiAgb25jZUxpc3RlbmVyc1sgbGlzdGVuZXIgXSA9IHRydWU7XG5cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5wcm90by5vZmYgPSBmdW5jdGlvbiggZXZlbnROYW1lLCBsaXN0ZW5lciApIHtcbiAgdmFyIGxpc3RlbmVycyA9IHRoaXMuX2V2ZW50cyAmJiB0aGlzLl9ldmVudHNbIGV2ZW50TmFtZSBdO1xuICBpZiAoICFsaXN0ZW5lcnMgfHwgIWxpc3RlbmVycy5sZW5ndGggKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIHZhciBpbmRleCA9IGxpc3RlbmVycy5pbmRleE9mKCBsaXN0ZW5lciApO1xuICBpZiAoIGluZGV4ICE9IC0xICkge1xuICAgIGxpc3RlbmVycy5zcGxpY2UoIGluZGV4LCAxICk7XG4gIH1cblxuICByZXR1cm4gdGhpcztcbn07XG5cbnByb3RvLmVtaXRFdmVudCA9IGZ1bmN0aW9uKCBldmVudE5hbWUsIGFyZ3MgKSB7XG4gIHZhciBsaXN0ZW5lcnMgPSB0aGlzLl9ldmVudHMgJiYgdGhpcy5fZXZlbnRzWyBldmVudE5hbWUgXTtcbiAgaWYgKCAhbGlzdGVuZXJzIHx8ICFsaXN0ZW5lcnMubGVuZ3RoICkge1xuICAgIHJldHVybjtcbiAgfVxuICAvLyBjb3B5IG92ZXIgdG8gYXZvaWQgaW50ZXJmZXJlbmNlIGlmIC5vZmYoKSBpbiBsaXN0ZW5lclxuICBsaXN0ZW5lcnMgPSBsaXN0ZW5lcnMuc2xpY2UoMCk7XG4gIGFyZ3MgPSBhcmdzIHx8IFtdO1xuICAvLyBvbmNlIHN0dWZmXG4gIHZhciBvbmNlTGlzdGVuZXJzID0gdGhpcy5fb25jZUV2ZW50cyAmJiB0aGlzLl9vbmNlRXZlbnRzWyBldmVudE5hbWUgXTtcblxuICBmb3IgKCB2YXIgaT0wOyBpIDwgbGlzdGVuZXJzLmxlbmd0aDsgaSsrICkge1xuICAgIHZhciBsaXN0ZW5lciA9IGxpc3RlbmVyc1tpXVxuICAgIHZhciBpc09uY2UgPSBvbmNlTGlzdGVuZXJzICYmIG9uY2VMaXN0ZW5lcnNbIGxpc3RlbmVyIF07XG4gICAgaWYgKCBpc09uY2UgKSB7XG4gICAgICAvLyByZW1vdmUgbGlzdGVuZXJcbiAgICAgIC8vIHJlbW92ZSBiZWZvcmUgdHJpZ2dlciB0byBwcmV2ZW50IHJlY3Vyc2lvblxuICAgICAgdGhpcy5vZmYoIGV2ZW50TmFtZSwgbGlzdGVuZXIgKTtcbiAgICAgIC8vIHVuc2V0IG9uY2UgZmxhZ1xuICAgICAgZGVsZXRlIG9uY2VMaXN0ZW5lcnNbIGxpc3RlbmVyIF07XG4gICAgfVxuICAgIC8vIHRyaWdnZXIgbGlzdGVuZXJcbiAgICBsaXN0ZW5lci5hcHBseSggdGhpcywgYXJncyApO1xuICB9XG5cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5wcm90by5hbGxPZmYgPSBmdW5jdGlvbigpIHtcbiAgZGVsZXRlIHRoaXMuX2V2ZW50cztcbiAgZGVsZXRlIHRoaXMuX29uY2VFdmVudHM7XG59O1xuXG5yZXR1cm4gRXZFbWl0dGVyO1xuXG59KSk7XG4iLCIvKipcbiAqIEZpenp5IFVJIHV0aWxzIHYyLjAuN1xuICogTUlUIGxpY2Vuc2VcbiAqL1xuXG4vKmpzaGludCBicm93c2VyOiB0cnVlLCB1bmRlZjogdHJ1ZSwgdW51c2VkOiB0cnVlLCBzdHJpY3Q6IHRydWUgKi9cblxuKCBmdW5jdGlvbiggd2luZG93LCBmYWN0b3J5ICkge1xuICAvLyB1bml2ZXJzYWwgbW9kdWxlIGRlZmluaXRpb25cbiAgLypqc2hpbnQgc3RyaWN0OiBmYWxzZSAqLyAvKmdsb2JhbHMgZGVmaW5lLCBtb2R1bGUsIHJlcXVpcmUgKi9cblxuICBpZiAoIHR5cGVvZiBkZWZpbmUgPT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kICkge1xuICAgIC8vIEFNRFxuICAgIGRlZmluZSggW1xuICAgICAgJ2Rlc2FuZHJvLW1hdGNoZXMtc2VsZWN0b3IvbWF0Y2hlcy1zZWxlY3RvcidcbiAgICBdLCBmdW5jdGlvbiggbWF0Y2hlc1NlbGVjdG9yICkge1xuICAgICAgcmV0dXJuIGZhY3RvcnkoIHdpbmRvdywgbWF0Y2hlc1NlbGVjdG9yICk7XG4gICAgfSk7XG4gIH0gZWxzZSBpZiAoIHR5cGVvZiBtb2R1bGUgPT0gJ29iamVjdCcgJiYgbW9kdWxlLmV4cG9ydHMgKSB7XG4gICAgLy8gQ29tbW9uSlNcbiAgICBtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkoXG4gICAgICB3aW5kb3csXG4gICAgICByZXF1aXJlKCdkZXNhbmRyby1tYXRjaGVzLXNlbGVjdG9yJylcbiAgICApO1xuICB9IGVsc2Uge1xuICAgIC8vIGJyb3dzZXIgZ2xvYmFsXG4gICAgd2luZG93LmZpenp5VUlVdGlscyA9IGZhY3RvcnkoXG4gICAgICB3aW5kb3csXG4gICAgICB3aW5kb3cubWF0Y2hlc1NlbGVjdG9yXG4gICAgKTtcbiAgfVxuXG59KCB3aW5kb3csIGZ1bmN0aW9uIGZhY3RvcnkoIHdpbmRvdywgbWF0Y2hlc1NlbGVjdG9yICkge1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciB1dGlscyA9IHt9O1xuXG4vLyAtLS0tLSBleHRlbmQgLS0tLS0gLy9cblxuLy8gZXh0ZW5kcyBvYmplY3RzXG51dGlscy5leHRlbmQgPSBmdW5jdGlvbiggYSwgYiApIHtcbiAgZm9yICggdmFyIHByb3AgaW4gYiApIHtcbiAgICBhWyBwcm9wIF0gPSBiWyBwcm9wIF07XG4gIH1cbiAgcmV0dXJuIGE7XG59O1xuXG4vLyAtLS0tLSBtb2R1bG8gLS0tLS0gLy9cblxudXRpbHMubW9kdWxvID0gZnVuY3Rpb24oIG51bSwgZGl2ICkge1xuICByZXR1cm4gKCAoIG51bSAlIGRpdiApICsgZGl2ICkgJSBkaXY7XG59O1xuXG4vLyAtLS0tLSBtYWtlQXJyYXkgLS0tLS0gLy9cblxudmFyIGFycmF5U2xpY2UgPSBBcnJheS5wcm90b3R5cGUuc2xpY2U7XG5cbi8vIHR1cm4gZWxlbWVudCBvciBub2RlTGlzdCBpbnRvIGFuIGFycmF5XG51dGlscy5tYWtlQXJyYXkgPSBmdW5jdGlvbiggb2JqICkge1xuICBpZiAoIEFycmF5LmlzQXJyYXkoIG9iaiApICkge1xuICAgIC8vIHVzZSBvYmplY3QgaWYgYWxyZWFkeSBhbiBhcnJheVxuICAgIHJldHVybiBvYmo7XG4gIH1cbiAgLy8gcmV0dXJuIGVtcHR5IGFycmF5IGlmIHVuZGVmaW5lZCBvciBudWxsLiAjNlxuICBpZiAoIG9iaiA9PT0gbnVsbCB8fCBvYmogPT09IHVuZGVmaW5lZCApIHtcbiAgICByZXR1cm4gW107XG4gIH1cblxuICB2YXIgaXNBcnJheUxpa2UgPSB0eXBlb2Ygb2JqID09ICdvYmplY3QnICYmIHR5cGVvZiBvYmoubGVuZ3RoID09ICdudW1iZXInO1xuICBpZiAoIGlzQXJyYXlMaWtlICkge1xuICAgIC8vIGNvbnZlcnQgbm9kZUxpc3QgdG8gYXJyYXlcbiAgICByZXR1cm4gYXJyYXlTbGljZS5jYWxsKCBvYmogKTtcbiAgfVxuXG4gIC8vIGFycmF5IG9mIHNpbmdsZSBpbmRleFxuICByZXR1cm4gWyBvYmogXTtcbn07XG5cbi8vIC0tLS0tIHJlbW92ZUZyb20gLS0tLS0gLy9cblxudXRpbHMucmVtb3ZlRnJvbSA9IGZ1bmN0aW9uKCBhcnksIG9iaiApIHtcbiAgdmFyIGluZGV4ID0gYXJ5LmluZGV4T2YoIG9iaiApO1xuICBpZiAoIGluZGV4ICE9IC0xICkge1xuICAgIGFyeS5zcGxpY2UoIGluZGV4LCAxICk7XG4gIH1cbn07XG5cbi8vIC0tLS0tIGdldFBhcmVudCAtLS0tLSAvL1xuXG51dGlscy5nZXRQYXJlbnQgPSBmdW5jdGlvbiggZWxlbSwgc2VsZWN0b3IgKSB7XG4gIHdoaWxlICggZWxlbS5wYXJlbnROb2RlICYmIGVsZW0gIT0gZG9jdW1lbnQuYm9keSApIHtcbiAgICBlbGVtID0gZWxlbS5wYXJlbnROb2RlO1xuICAgIGlmICggbWF0Y2hlc1NlbGVjdG9yKCBlbGVtLCBzZWxlY3RvciApICkge1xuICAgICAgcmV0dXJuIGVsZW07XG4gICAgfVxuICB9XG59O1xuXG4vLyAtLS0tLSBnZXRRdWVyeUVsZW1lbnQgLS0tLS0gLy9cblxuLy8gdXNlIGVsZW1lbnQgYXMgc2VsZWN0b3Igc3RyaW5nXG51dGlscy5nZXRRdWVyeUVsZW1lbnQgPSBmdW5jdGlvbiggZWxlbSApIHtcbiAgaWYgKCB0eXBlb2YgZWxlbSA9PSAnc3RyaW5nJyApIHtcbiAgICByZXR1cm4gZG9jdW1lbnQucXVlcnlTZWxlY3RvciggZWxlbSApO1xuICB9XG4gIHJldHVybiBlbGVtO1xufTtcblxuLy8gLS0tLS0gaGFuZGxlRXZlbnQgLS0tLS0gLy9cblxuLy8gZW5hYmxlIC5vbnR5cGUgdG8gdHJpZ2dlciBmcm9tIC5hZGRFdmVudExpc3RlbmVyKCBlbGVtLCAndHlwZScgKVxudXRpbHMuaGFuZGxlRXZlbnQgPSBmdW5jdGlvbiggZXZlbnQgKSB7XG4gIHZhciBtZXRob2QgPSAnb24nICsgZXZlbnQudHlwZTtcbiAgaWYgKCB0aGlzWyBtZXRob2QgXSApIHtcbiAgICB0aGlzWyBtZXRob2QgXSggZXZlbnQgKTtcbiAgfVxufTtcblxuLy8gLS0tLS0gZmlsdGVyRmluZEVsZW1lbnRzIC0tLS0tIC8vXG5cbnV0aWxzLmZpbHRlckZpbmRFbGVtZW50cyA9IGZ1bmN0aW9uKCBlbGVtcywgc2VsZWN0b3IgKSB7XG4gIC8vIG1ha2UgYXJyYXkgb2YgZWxlbXNcbiAgZWxlbXMgPSB1dGlscy5tYWtlQXJyYXkoIGVsZW1zICk7XG4gIHZhciBmZkVsZW1zID0gW107XG5cbiAgZWxlbXMuZm9yRWFjaCggZnVuY3Rpb24oIGVsZW0gKSB7XG4gICAgLy8gY2hlY2sgdGhhdCBlbGVtIGlzIGFuIGFjdHVhbCBlbGVtZW50XG4gICAgaWYgKCAhKCBlbGVtIGluc3RhbmNlb2YgSFRNTEVsZW1lbnQgKSApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8gYWRkIGVsZW0gaWYgbm8gc2VsZWN0b3JcbiAgICBpZiAoICFzZWxlY3RvciApIHtcbiAgICAgIGZmRWxlbXMucHVzaCggZWxlbSApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyBmaWx0ZXIgJiBmaW5kIGl0ZW1zIGlmIHdlIGhhdmUgYSBzZWxlY3RvclxuICAgIC8vIGZpbHRlclxuICAgIGlmICggbWF0Y2hlc1NlbGVjdG9yKCBlbGVtLCBzZWxlY3RvciApICkge1xuICAgICAgZmZFbGVtcy5wdXNoKCBlbGVtICk7XG4gICAgfVxuICAgIC8vIGZpbmQgY2hpbGRyZW5cbiAgICB2YXIgY2hpbGRFbGVtcyA9IGVsZW0ucXVlcnlTZWxlY3RvckFsbCggc2VsZWN0b3IgKTtcbiAgICAvLyBjb25jYXQgY2hpbGRFbGVtcyB0byBmaWx0ZXJGb3VuZCBhcnJheVxuICAgIGZvciAoIHZhciBpPTA7IGkgPCBjaGlsZEVsZW1zLmxlbmd0aDsgaSsrICkge1xuICAgICAgZmZFbGVtcy5wdXNoKCBjaGlsZEVsZW1zW2ldICk7XG4gICAgfVxuICB9KTtcblxuICByZXR1cm4gZmZFbGVtcztcbn07XG5cbi8vIC0tLS0tIGRlYm91bmNlTWV0aG9kIC0tLS0tIC8vXG5cbnV0aWxzLmRlYm91bmNlTWV0aG9kID0gZnVuY3Rpb24oIF9jbGFzcywgbWV0aG9kTmFtZSwgdGhyZXNob2xkICkge1xuICB0aHJlc2hvbGQgPSB0aHJlc2hvbGQgfHwgMTAwO1xuICAvLyBvcmlnaW5hbCBtZXRob2RcbiAgdmFyIG1ldGhvZCA9IF9jbGFzcy5wcm90b3R5cGVbIG1ldGhvZE5hbWUgXTtcbiAgdmFyIHRpbWVvdXROYW1lID0gbWV0aG9kTmFtZSArICdUaW1lb3V0JztcblxuICBfY2xhc3MucHJvdG90eXBlWyBtZXRob2ROYW1lIF0gPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgdGltZW91dCA9IHRoaXNbIHRpbWVvdXROYW1lIF07XG4gICAgY2xlYXJUaW1lb3V0KCB0aW1lb3V0ICk7XG5cbiAgICB2YXIgYXJncyA9IGFyZ3VtZW50cztcbiAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgIHRoaXNbIHRpbWVvdXROYW1lIF0gPSBzZXRUaW1lb3V0KCBmdW5jdGlvbigpIHtcbiAgICAgIG1ldGhvZC5hcHBseSggX3RoaXMsIGFyZ3MgKTtcbiAgICAgIGRlbGV0ZSBfdGhpc1sgdGltZW91dE5hbWUgXTtcbiAgICB9LCB0aHJlc2hvbGQgKTtcbiAgfTtcbn07XG5cbi8vIC0tLS0tIGRvY1JlYWR5IC0tLS0tIC8vXG5cbnV0aWxzLmRvY1JlYWR5ID0gZnVuY3Rpb24oIGNhbGxiYWNrICkge1xuICB2YXIgcmVhZHlTdGF0ZSA9IGRvY3VtZW50LnJlYWR5U3RhdGU7XG4gIGlmICggcmVhZHlTdGF0ZSA9PSAnY29tcGxldGUnIHx8IHJlYWR5U3RhdGUgPT0gJ2ludGVyYWN0aXZlJyApIHtcbiAgICAvLyBkbyBhc3luYyB0byBhbGxvdyBmb3Igb3RoZXIgc2NyaXB0cyB0byBydW4uIG1ldGFmaXp6eS9mbGlja2l0eSM0NDFcbiAgICBzZXRUaW1lb3V0KCBjYWxsYmFjayApO1xuICB9IGVsc2Uge1xuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoICdET01Db250ZW50TG9hZGVkJywgY2FsbGJhY2sgKTtcbiAgfVxufTtcblxuLy8gLS0tLS0gaHRtbEluaXQgLS0tLS0gLy9cblxuLy8gaHR0cDovL2phbWVzcm9iZXJ0cy5uYW1lL2Jsb2cvMjAxMC8wMi8yMi9zdHJpbmctZnVuY3Rpb25zLWZvci1qYXZhc2NyaXB0LXRyaW0tdG8tY2FtZWwtY2FzZS10by1kYXNoZWQtYW5kLXRvLXVuZGVyc2NvcmUvXG51dGlscy50b0Rhc2hlZCA9IGZ1bmN0aW9uKCBzdHIgKSB7XG4gIHJldHVybiBzdHIucmVwbGFjZSggLyguKShbQS1aXSkvZywgZnVuY3Rpb24oIG1hdGNoLCAkMSwgJDIgKSB7XG4gICAgcmV0dXJuICQxICsgJy0nICsgJDI7XG4gIH0pLnRvTG93ZXJDYXNlKCk7XG59O1xuXG52YXIgY29uc29sZSA9IHdpbmRvdy5jb25zb2xlO1xuLyoqXG4gKiBhbGxvdyB1c2VyIHRvIGluaXRpYWxpemUgY2xhc3NlcyB2aWEgW2RhdGEtbmFtZXNwYWNlXSBvciAuanMtbmFtZXNwYWNlIGNsYXNzXG4gKiBodG1sSW5pdCggV2lkZ2V0LCAnd2lkZ2V0TmFtZScgKVxuICogb3B0aW9ucyBhcmUgcGFyc2VkIGZyb20gZGF0YS1uYW1lc3BhY2Utb3B0aW9uc1xuICovXG51dGlscy5odG1sSW5pdCA9IGZ1bmN0aW9uKCBXaWRnZXRDbGFzcywgbmFtZXNwYWNlICkge1xuICB1dGlscy5kb2NSZWFkeSggZnVuY3Rpb24oKSB7XG4gICAgdmFyIGRhc2hlZE5hbWVzcGFjZSA9IHV0aWxzLnRvRGFzaGVkKCBuYW1lc3BhY2UgKTtcbiAgICB2YXIgZGF0YUF0dHIgPSAnZGF0YS0nICsgZGFzaGVkTmFtZXNwYWNlO1xuICAgIHZhciBkYXRhQXR0ckVsZW1zID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCggJ1snICsgZGF0YUF0dHIgKyAnXScgKTtcbiAgICB2YXIganNEYXNoRWxlbXMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCAnLmpzLScgKyBkYXNoZWROYW1lc3BhY2UgKTtcbiAgICB2YXIgZWxlbXMgPSB1dGlscy5tYWtlQXJyYXkoIGRhdGFBdHRyRWxlbXMgKVxuICAgICAgLmNvbmNhdCggdXRpbHMubWFrZUFycmF5KCBqc0Rhc2hFbGVtcyApICk7XG4gICAgdmFyIGRhdGFPcHRpb25zQXR0ciA9IGRhdGFBdHRyICsgJy1vcHRpb25zJztcbiAgICB2YXIgalF1ZXJ5ID0gd2luZG93LmpRdWVyeTtcblxuICAgIGVsZW1zLmZvckVhY2goIGZ1bmN0aW9uKCBlbGVtICkge1xuICAgICAgdmFyIGF0dHIgPSBlbGVtLmdldEF0dHJpYnV0ZSggZGF0YUF0dHIgKSB8fFxuICAgICAgICBlbGVtLmdldEF0dHJpYnV0ZSggZGF0YU9wdGlvbnNBdHRyICk7XG4gICAgICB2YXIgb3B0aW9ucztcbiAgICAgIHRyeSB7XG4gICAgICAgIG9wdGlvbnMgPSBhdHRyICYmIEpTT04ucGFyc2UoIGF0dHIgKTtcbiAgICAgIH0gY2F0Y2ggKCBlcnJvciApIHtcbiAgICAgICAgLy8gbG9nIGVycm9yLCBkbyBub3QgaW5pdGlhbGl6ZVxuICAgICAgICBpZiAoIGNvbnNvbGUgKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvciggJ0Vycm9yIHBhcnNpbmcgJyArIGRhdGFBdHRyICsgJyBvbiAnICsgZWxlbS5jbGFzc05hbWUgK1xuICAgICAgICAgICc6ICcgKyBlcnJvciApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIC8vIGluaXRpYWxpemVcbiAgICAgIHZhciBpbnN0YW5jZSA9IG5ldyBXaWRnZXRDbGFzcyggZWxlbSwgb3B0aW9ucyApO1xuICAgICAgLy8gbWFrZSBhdmFpbGFibGUgdmlhICQoKS5kYXRhKCduYW1lc3BhY2UnKVxuICAgICAgaWYgKCBqUXVlcnkgKSB7XG4gICAgICAgIGpRdWVyeS5kYXRhKCBlbGVtLCBuYW1lc3BhY2UsIGluc3RhbmNlICk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgfSk7XG59O1xuXG4vLyAtLS0tLSAgLS0tLS0gLy9cblxucmV0dXJuIHV0aWxzO1xuXG59KSk7XG4iLCIvKiFcbiAqIGdldFNpemUgdjIuMC4zXG4gKiBtZWFzdXJlIHNpemUgb2YgZWxlbWVudHNcbiAqIE1JVCBsaWNlbnNlXG4gKi9cblxuLyoganNoaW50IGJyb3dzZXI6IHRydWUsIHN0cmljdDogdHJ1ZSwgdW5kZWY6IHRydWUsIHVudXNlZDogdHJ1ZSAqL1xuLyogZ2xvYmFscyBjb25zb2xlOiBmYWxzZSAqL1xuXG4oIGZ1bmN0aW9uKCB3aW5kb3csIGZhY3RvcnkgKSB7XG4gIC8qIGpzaGludCBzdHJpY3Q6IGZhbHNlICovIC8qIGdsb2JhbHMgZGVmaW5lLCBtb2R1bGUgKi9cbiAgaWYgKCB0eXBlb2YgZGVmaW5lID09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCApIHtcbiAgICAvLyBBTURcbiAgICBkZWZpbmUoIGZhY3RvcnkgKTtcbiAgfSBlbHNlIGlmICggdHlwZW9mIG1vZHVsZSA9PSAnb2JqZWN0JyAmJiBtb2R1bGUuZXhwb3J0cyApIHtcbiAgICAvLyBDb21tb25KU1xuICAgIG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeSgpO1xuICB9IGVsc2Uge1xuICAgIC8vIGJyb3dzZXIgZ2xvYmFsXG4gICAgd2luZG93LmdldFNpemUgPSBmYWN0b3J5KCk7XG4gIH1cblxufSkoIHdpbmRvdywgZnVuY3Rpb24gZmFjdG9yeSgpIHtcbid1c2Ugc3RyaWN0JztcblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gaGVscGVycyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAvL1xuXG4vLyBnZXQgYSBudW1iZXIgZnJvbSBhIHN0cmluZywgbm90IGEgcGVyY2VudGFnZVxuZnVuY3Rpb24gZ2V0U3R5bGVTaXplKCB2YWx1ZSApIHtcbiAgdmFyIG51bSA9IHBhcnNlRmxvYXQoIHZhbHVlICk7XG4gIC8vIG5vdCBhIHBlcmNlbnQgbGlrZSAnMTAwJScsIGFuZCBhIG51bWJlclxuICB2YXIgaXNWYWxpZCA9IHZhbHVlLmluZGV4T2YoJyUnKSA9PSAtMSAmJiAhaXNOYU4oIG51bSApO1xuICByZXR1cm4gaXNWYWxpZCAmJiBudW07XG59XG5cbmZ1bmN0aW9uIG5vb3AoKSB7fVxuXG52YXIgbG9nRXJyb3IgPSB0eXBlb2YgY29uc29sZSA9PSAndW5kZWZpbmVkJyA/IG5vb3AgOlxuICBmdW5jdGlvbiggbWVzc2FnZSApIHtcbiAgICBjb25zb2xlLmVycm9yKCBtZXNzYWdlICk7XG4gIH07XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIG1lYXN1cmVtZW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAvL1xuXG52YXIgbWVhc3VyZW1lbnRzID0gW1xuICAncGFkZGluZ0xlZnQnLFxuICAncGFkZGluZ1JpZ2h0JyxcbiAgJ3BhZGRpbmdUb3AnLFxuICAncGFkZGluZ0JvdHRvbScsXG4gICdtYXJnaW5MZWZ0JyxcbiAgJ21hcmdpblJpZ2h0JyxcbiAgJ21hcmdpblRvcCcsXG4gICdtYXJnaW5Cb3R0b20nLFxuICAnYm9yZGVyTGVmdFdpZHRoJyxcbiAgJ2JvcmRlclJpZ2h0V2lkdGgnLFxuICAnYm9yZGVyVG9wV2lkdGgnLFxuICAnYm9yZGVyQm90dG9tV2lkdGgnXG5dO1xuXG52YXIgbWVhc3VyZW1lbnRzTGVuZ3RoID0gbWVhc3VyZW1lbnRzLmxlbmd0aDtcblxuZnVuY3Rpb24gZ2V0WmVyb1NpemUoKSB7XG4gIHZhciBzaXplID0ge1xuICAgIHdpZHRoOiAwLFxuICAgIGhlaWdodDogMCxcbiAgICBpbm5lcldpZHRoOiAwLFxuICAgIGlubmVySGVpZ2h0OiAwLFxuICAgIG91dGVyV2lkdGg6IDAsXG4gICAgb3V0ZXJIZWlnaHQ6IDBcbiAgfTtcbiAgZm9yICggdmFyIGk9MDsgaSA8IG1lYXN1cmVtZW50c0xlbmd0aDsgaSsrICkge1xuICAgIHZhciBtZWFzdXJlbWVudCA9IG1lYXN1cmVtZW50c1tpXTtcbiAgICBzaXplWyBtZWFzdXJlbWVudCBdID0gMDtcbiAgfVxuICByZXR1cm4gc2l6ZTtcbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gZ2V0U3R5bGUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gLy9cblxuLyoqXG4gKiBnZXRTdHlsZSwgZ2V0IHN0eWxlIG9mIGVsZW1lbnQsIGNoZWNrIGZvciBGaXJlZm94IGJ1Z1xuICogaHR0cHM6Ly9idWd6aWxsYS5tb3ppbGxhLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NTQ4Mzk3XG4gKi9cbmZ1bmN0aW9uIGdldFN0eWxlKCBlbGVtICkge1xuICB2YXIgc3R5bGUgPSBnZXRDb21wdXRlZFN0eWxlKCBlbGVtICk7XG4gIGlmICggIXN0eWxlICkge1xuICAgIGxvZ0Vycm9yKCAnU3R5bGUgcmV0dXJuZWQgJyArIHN0eWxlICtcbiAgICAgICcuIEFyZSB5b3UgcnVubmluZyB0aGlzIGNvZGUgaW4gYSBoaWRkZW4gaWZyYW1lIG9uIEZpcmVmb3g/ICcgK1xuICAgICAgJ1NlZSBodHRwczovL2JpdC5seS9nZXRzaXplYnVnMScgKTtcbiAgfVxuICByZXR1cm4gc3R5bGU7XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHNldHVwIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIC8vXG5cbnZhciBpc1NldHVwID0gZmFsc2U7XG5cbnZhciBpc0JveFNpemVPdXRlcjtcblxuLyoqXG4gKiBzZXR1cFxuICogY2hlY2sgaXNCb3hTaXplck91dGVyXG4gKiBkbyBvbiBmaXJzdCBnZXRTaXplKCkgcmF0aGVyIHRoYW4gb24gcGFnZSBsb2FkIGZvciBGaXJlZm94IGJ1Z1xuICovXG5mdW5jdGlvbiBzZXR1cCgpIHtcbiAgLy8gc2V0dXAgb25jZVxuICBpZiAoIGlzU2V0dXAgKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlzU2V0dXAgPSB0cnVlO1xuXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGJveCBzaXppbmcgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gLy9cblxuICAvKipcbiAgICogQ2hyb21lICYgU2FmYXJpIG1lYXN1cmUgdGhlIG91dGVyLXdpZHRoIG9uIHN0eWxlLndpZHRoIG9uIGJvcmRlci1ib3ggZWxlbXNcbiAgICogSUUxMSAmIEZpcmVmb3g8MjkgbWVhc3VyZXMgdGhlIGlubmVyLXdpZHRoXG4gICAqL1xuICB2YXIgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gIGRpdi5zdHlsZS53aWR0aCA9ICcyMDBweCc7XG4gIGRpdi5zdHlsZS5wYWRkaW5nID0gJzFweCAycHggM3B4IDRweCc7XG4gIGRpdi5zdHlsZS5ib3JkZXJTdHlsZSA9ICdzb2xpZCc7XG4gIGRpdi5zdHlsZS5ib3JkZXJXaWR0aCA9ICcxcHggMnB4IDNweCA0cHgnO1xuICBkaXYuc3R5bGUuYm94U2l6aW5nID0gJ2JvcmRlci1ib3gnO1xuXG4gIHZhciBib2R5ID0gZG9jdW1lbnQuYm9keSB8fCBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7XG4gIGJvZHkuYXBwZW5kQ2hpbGQoIGRpdiApO1xuICB2YXIgc3R5bGUgPSBnZXRTdHlsZSggZGl2ICk7XG4gIC8vIHJvdW5kIHZhbHVlIGZvciBicm93c2VyIHpvb20uIGRlc2FuZHJvL21hc29ucnkjOTI4XG4gIGlzQm94U2l6ZU91dGVyID0gTWF0aC5yb3VuZCggZ2V0U3R5bGVTaXplKCBzdHlsZS53aWR0aCApICkgPT0gMjAwO1xuICBnZXRTaXplLmlzQm94U2l6ZU91dGVyID0gaXNCb3hTaXplT3V0ZXI7XG5cbiAgYm9keS5yZW1vdmVDaGlsZCggZGl2ICk7XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGdldFNpemUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gLy9cblxuZnVuY3Rpb24gZ2V0U2l6ZSggZWxlbSApIHtcbiAgc2V0dXAoKTtcblxuICAvLyB1c2UgcXVlcnlTZWxldG9yIGlmIGVsZW0gaXMgc3RyaW5nXG4gIGlmICggdHlwZW9mIGVsZW0gPT0gJ3N0cmluZycgKSB7XG4gICAgZWxlbSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIGVsZW0gKTtcbiAgfVxuXG4gIC8vIGRvIG5vdCBwcm9jZWVkIG9uIG5vbi1vYmplY3RzXG4gIGlmICggIWVsZW0gfHwgdHlwZW9mIGVsZW0gIT0gJ29iamVjdCcgfHwgIWVsZW0ubm9kZVR5cGUgKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdmFyIHN0eWxlID0gZ2V0U3R5bGUoIGVsZW0gKTtcblxuICAvLyBpZiBoaWRkZW4sIGV2ZXJ5dGhpbmcgaXMgMFxuICBpZiAoIHN0eWxlLmRpc3BsYXkgPT0gJ25vbmUnICkge1xuICAgIHJldHVybiBnZXRaZXJvU2l6ZSgpO1xuICB9XG5cbiAgdmFyIHNpemUgPSB7fTtcbiAgc2l6ZS53aWR0aCA9IGVsZW0ub2Zmc2V0V2lkdGg7XG4gIHNpemUuaGVpZ2h0ID0gZWxlbS5vZmZzZXRIZWlnaHQ7XG5cbiAgdmFyIGlzQm9yZGVyQm94ID0gc2l6ZS5pc0JvcmRlckJveCA9IHN0eWxlLmJveFNpemluZyA9PSAnYm9yZGVyLWJveCc7XG5cbiAgLy8gZ2V0IGFsbCBtZWFzdXJlbWVudHNcbiAgZm9yICggdmFyIGk9MDsgaSA8IG1lYXN1cmVtZW50c0xlbmd0aDsgaSsrICkge1xuICAgIHZhciBtZWFzdXJlbWVudCA9IG1lYXN1cmVtZW50c1tpXTtcbiAgICB2YXIgdmFsdWUgPSBzdHlsZVsgbWVhc3VyZW1lbnQgXTtcbiAgICB2YXIgbnVtID0gcGFyc2VGbG9hdCggdmFsdWUgKTtcbiAgICAvLyBhbnkgJ2F1dG8nLCAnbWVkaXVtJyB2YWx1ZSB3aWxsIGJlIDBcbiAgICBzaXplWyBtZWFzdXJlbWVudCBdID0gIWlzTmFOKCBudW0gKSA/IG51bSA6IDA7XG4gIH1cblxuICB2YXIgcGFkZGluZ1dpZHRoID0gc2l6ZS5wYWRkaW5nTGVmdCArIHNpemUucGFkZGluZ1JpZ2h0O1xuICB2YXIgcGFkZGluZ0hlaWdodCA9IHNpemUucGFkZGluZ1RvcCArIHNpemUucGFkZGluZ0JvdHRvbTtcbiAgdmFyIG1hcmdpbldpZHRoID0gc2l6ZS5tYXJnaW5MZWZ0ICsgc2l6ZS5tYXJnaW5SaWdodDtcbiAgdmFyIG1hcmdpbkhlaWdodCA9IHNpemUubWFyZ2luVG9wICsgc2l6ZS5tYXJnaW5Cb3R0b207XG4gIHZhciBib3JkZXJXaWR0aCA9IHNpemUuYm9yZGVyTGVmdFdpZHRoICsgc2l6ZS5ib3JkZXJSaWdodFdpZHRoO1xuICB2YXIgYm9yZGVySGVpZ2h0ID0gc2l6ZS5ib3JkZXJUb3BXaWR0aCArIHNpemUuYm9yZGVyQm90dG9tV2lkdGg7XG5cbiAgdmFyIGlzQm9yZGVyQm94U2l6ZU91dGVyID0gaXNCb3JkZXJCb3ggJiYgaXNCb3hTaXplT3V0ZXI7XG5cbiAgLy8gb3ZlcndyaXRlIHdpZHRoIGFuZCBoZWlnaHQgaWYgd2UgY2FuIGdldCBpdCBmcm9tIHN0eWxlXG4gIHZhciBzdHlsZVdpZHRoID0gZ2V0U3R5bGVTaXplKCBzdHlsZS53aWR0aCApO1xuICBpZiAoIHN0eWxlV2lkdGggIT09IGZhbHNlICkge1xuICAgIHNpemUud2lkdGggPSBzdHlsZVdpZHRoICtcbiAgICAgIC8vIGFkZCBwYWRkaW5nIGFuZCBib3JkZXIgdW5sZXNzIGl0J3MgYWxyZWFkeSBpbmNsdWRpbmcgaXRcbiAgICAgICggaXNCb3JkZXJCb3hTaXplT3V0ZXIgPyAwIDogcGFkZGluZ1dpZHRoICsgYm9yZGVyV2lkdGggKTtcbiAgfVxuXG4gIHZhciBzdHlsZUhlaWdodCA9IGdldFN0eWxlU2l6ZSggc3R5bGUuaGVpZ2h0ICk7XG4gIGlmICggc3R5bGVIZWlnaHQgIT09IGZhbHNlICkge1xuICAgIHNpemUuaGVpZ2h0ID0gc3R5bGVIZWlnaHQgK1xuICAgICAgLy8gYWRkIHBhZGRpbmcgYW5kIGJvcmRlciB1bmxlc3MgaXQncyBhbHJlYWR5IGluY2x1ZGluZyBpdFxuICAgICAgKCBpc0JvcmRlckJveFNpemVPdXRlciA/IDAgOiBwYWRkaW5nSGVpZ2h0ICsgYm9yZGVySGVpZ2h0ICk7XG4gIH1cblxuICBzaXplLmlubmVyV2lkdGggPSBzaXplLndpZHRoIC0gKCBwYWRkaW5nV2lkdGggKyBib3JkZXJXaWR0aCApO1xuICBzaXplLmlubmVySGVpZ2h0ID0gc2l6ZS5oZWlnaHQgLSAoIHBhZGRpbmdIZWlnaHQgKyBib3JkZXJIZWlnaHQgKTtcblxuICBzaXplLm91dGVyV2lkdGggPSBzaXplLndpZHRoICsgbWFyZ2luV2lkdGg7XG4gIHNpemUub3V0ZXJIZWlnaHQgPSBzaXplLmhlaWdodCArIG1hcmdpbkhlaWdodDtcblxuICByZXR1cm4gc2l6ZTtcbn1cblxucmV0dXJuIGdldFNpemU7XG5cbn0pO1xuIiwiLyohXG4gKiBWRVJTSU9OOiAxLjIwLjRcbiAqIERBVEU6IDIwMTgtMDItMTVcbiAqIFVQREFURVMgQU5EIERPQ1MgQVQ6IGh0dHA6Ly9ncmVlbnNvY2suY29tXG4gKiBcbiAqIEluY2x1ZGVzIGFsbCBvZiB0aGUgZm9sbG93aW5nOiBUd2VlbkxpdGUsIFR3ZWVuTWF4LCBUaW1lbGluZUxpdGUsIFRpbWVsaW5lTWF4LCBFYXNlUGFjaywgQ1NTUGx1Z2luLCBSb3VuZFByb3BzUGx1Z2luLCBCZXppZXJQbHVnaW4sIEF0dHJQbHVnaW4sIERpcmVjdGlvbmFsUm90YXRpb25QbHVnaW5cbiAqXG4gKiBAbGljZW5zZSBDb3B5cmlnaHQgKGMpIDIwMDgtMjAxOCwgR3JlZW5Tb2NrLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogVGhpcyB3b3JrIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGF0IGh0dHA6Ly9ncmVlbnNvY2suY29tL3N0YW5kYXJkLWxpY2Vuc2Ugb3IgZm9yXG4gKiBDbHViIEdyZWVuU29jayBtZW1iZXJzLCB0aGUgc29mdHdhcmUgYWdyZWVtZW50IHRoYXQgd2FzIGlzc3VlZCB3aXRoIHlvdXIgbWVtYmVyc2hpcC5cbiAqIFxuICogQGF1dGhvcjogSmFjayBEb3lsZSwgamFja0BncmVlbnNvY2suY29tXG4gKiovXG52YXIgX2dzU2NvcGUgPSAodHlwZW9mKG1vZHVsZSkgIT09IFwidW5kZWZpbmVkXCIgJiYgbW9kdWxlLmV4cG9ydHMgJiYgdHlwZW9mKGdsb2JhbCkgIT09IFwidW5kZWZpbmVkXCIpID8gZ2xvYmFsIDogdGhpcyB8fCB3aW5kb3c7IC8vaGVscHMgZW5zdXJlIGNvbXBhdGliaWxpdHkgd2l0aCBBTUQvUmVxdWlyZUpTIGFuZCBDb21tb25KUy9Ob2RlXG4oX2dzU2NvcGUuX2dzUXVldWUgfHwgKF9nc1Njb3BlLl9nc1F1ZXVlID0gW10pKS5wdXNoKCBmdW5jdGlvbigpIHtcblxuXHRcInVzZSBzdHJpY3RcIjtcblxuXHRfZ3NTY29wZS5fZ3NEZWZpbmUoXCJUd2Vlbk1heFwiLCBbXCJjb3JlLkFuaW1hdGlvblwiLFwiY29yZS5TaW1wbGVUaW1lbGluZVwiLFwiVHdlZW5MaXRlXCJdLCBmdW5jdGlvbihBbmltYXRpb24sIFNpbXBsZVRpbWVsaW5lLCBUd2VlbkxpdGUpIHtcblxuXHRcdHZhciBfc2xpY2UgPSBmdW5jdGlvbihhKSB7IC8vZG9uJ3QgdXNlIFtdLnNsaWNlIGJlY2F1c2UgdGhhdCBkb2Vzbid0IHdvcmsgaW4gSUU4IHdpdGggYSBOb2RlTGlzdCB0aGF0J3MgcmV0dXJuZWQgYnkgcXVlcnlTZWxlY3RvckFsbCgpXG5cdFx0XHRcdHZhciBiID0gW10sXG5cdFx0XHRcdFx0bCA9IGEubGVuZ3RoLFxuXHRcdFx0XHRcdGk7XG5cdFx0XHRcdGZvciAoaSA9IDA7IGkgIT09IGw7IGIucHVzaChhW2krK10pKTtcblx0XHRcdFx0cmV0dXJuIGI7XG5cdFx0XHR9LFxuXHRcdFx0X2FwcGx5Q3ljbGUgPSBmdW5jdGlvbih2YXJzLCB0YXJnZXRzLCBpKSB7XG5cdFx0XHRcdHZhciBhbHQgPSB2YXJzLmN5Y2xlLFxuXHRcdFx0XHRcdHAsIHZhbDtcblx0XHRcdFx0Zm9yIChwIGluIGFsdCkge1xuXHRcdFx0XHRcdHZhbCA9IGFsdFtwXTtcblx0XHRcdFx0XHR2YXJzW3BdID0gKHR5cGVvZih2YWwpID09PSBcImZ1bmN0aW9uXCIpID8gdmFsKGksIHRhcmdldHNbaV0pIDogdmFsW2kgJSB2YWwubGVuZ3RoXTtcblx0XHRcdFx0fVxuXHRcdFx0XHRkZWxldGUgdmFycy5jeWNsZTtcblx0XHRcdH0sXG5cdFx0XHRUd2Vlbk1heCA9IGZ1bmN0aW9uKHRhcmdldCwgZHVyYXRpb24sIHZhcnMpIHtcblx0XHRcdFx0VHdlZW5MaXRlLmNhbGwodGhpcywgdGFyZ2V0LCBkdXJhdGlvbiwgdmFycyk7XG5cdFx0XHRcdHRoaXMuX2N5Y2xlID0gMDtcblx0XHRcdFx0dGhpcy5feW95byA9ICh0aGlzLnZhcnMueW95byA9PT0gdHJ1ZSB8fCAhIXRoaXMudmFycy55b3lvRWFzZSk7XG5cdFx0XHRcdHRoaXMuX3JlcGVhdCA9IHRoaXMudmFycy5yZXBlYXQgfHwgMDtcblx0XHRcdFx0dGhpcy5fcmVwZWF0RGVsYXkgPSB0aGlzLnZhcnMucmVwZWF0RGVsYXkgfHwgMDtcblx0XHRcdFx0aWYgKHRoaXMuX3JlcGVhdCkge1xuXHRcdFx0XHRcdHRoaXMuX3VuY2FjaGUodHJ1ZSk7IC8vZW5zdXJlcyB0aGF0IGlmIHRoZXJlIGlzIGFueSByZXBlYXQsIHRoZSB0b3RhbER1cmF0aW9uIHdpbGwgZ2V0IHJlY2FsY3VsYXRlZCB0byBhY2N1cmF0ZWx5IHJlcG9ydCBpdC5cblx0XHRcdFx0fVxuXHRcdFx0XHR0aGlzLnJlbmRlciA9IFR3ZWVuTWF4LnByb3RvdHlwZS5yZW5kZXI7IC8vc3BlZWQgb3B0aW1pemF0aW9uIChhdm9pZCBwcm90b3R5cGUgbG9va3VwIG9uIHRoaXMgXCJob3RcIiBtZXRob2QpXG5cdFx0XHR9LFxuXHRcdFx0X3RpbnlOdW0gPSAwLjAwMDAwMDAwMDEsXG5cdFx0XHRUd2VlbkxpdGVJbnRlcm5hbHMgPSBUd2VlbkxpdGUuX2ludGVybmFscyxcblx0XHRcdF9pc1NlbGVjdG9yID0gVHdlZW5MaXRlSW50ZXJuYWxzLmlzU2VsZWN0b3IsXG5cdFx0XHRfaXNBcnJheSA9IFR3ZWVuTGl0ZUludGVybmFscy5pc0FycmF5LFxuXHRcdFx0cCA9IFR3ZWVuTWF4LnByb3RvdHlwZSA9IFR3ZWVuTGl0ZS50byh7fSwgMC4xLCB7fSksXG5cdFx0XHRfYmxhbmtBcnJheSA9IFtdO1xuXG5cdFx0VHdlZW5NYXgudmVyc2lvbiA9IFwiMS4yMC40XCI7XG5cdFx0cC5jb25zdHJ1Y3RvciA9IFR3ZWVuTWF4O1xuXHRcdHAua2lsbCgpLl9nYyA9IGZhbHNlO1xuXHRcdFR3ZWVuTWF4LmtpbGxUd2VlbnNPZiA9IFR3ZWVuTWF4LmtpbGxEZWxheWVkQ2FsbHNUbyA9IFR3ZWVuTGl0ZS5raWxsVHdlZW5zT2Y7XG5cdFx0VHdlZW5NYXguZ2V0VHdlZW5zT2YgPSBUd2VlbkxpdGUuZ2V0VHdlZW5zT2Y7XG5cdFx0VHdlZW5NYXgubGFnU21vb3RoaW5nID0gVHdlZW5MaXRlLmxhZ1Ntb290aGluZztcblx0XHRUd2Vlbk1heC50aWNrZXIgPSBUd2VlbkxpdGUudGlja2VyO1xuXHRcdFR3ZWVuTWF4LnJlbmRlciA9IFR3ZWVuTGl0ZS5yZW5kZXI7XG5cblx0XHRwLmludmFsaWRhdGUgPSBmdW5jdGlvbigpIHtcblx0XHRcdHRoaXMuX3lveW8gPSAodGhpcy52YXJzLnlveW8gPT09IHRydWUgfHwgISF0aGlzLnZhcnMueW95b0Vhc2UpO1xuXHRcdFx0dGhpcy5fcmVwZWF0ID0gdGhpcy52YXJzLnJlcGVhdCB8fCAwO1xuXHRcdFx0dGhpcy5fcmVwZWF0RGVsYXkgPSB0aGlzLnZhcnMucmVwZWF0RGVsYXkgfHwgMDtcblx0XHRcdHRoaXMuX3lveW9FYXNlID0gbnVsbDtcblx0XHRcdHRoaXMuX3VuY2FjaGUodHJ1ZSk7XG5cdFx0XHRyZXR1cm4gVHdlZW5MaXRlLnByb3RvdHlwZS5pbnZhbGlkYXRlLmNhbGwodGhpcyk7XG5cdFx0fTtcblx0XHRcblx0XHRwLnVwZGF0ZVRvID0gZnVuY3Rpb24odmFycywgcmVzZXREdXJhdGlvbikge1xuXHRcdFx0dmFyIGN1clJhdGlvID0gdGhpcy5yYXRpbyxcblx0XHRcdFx0aW1tZWRpYXRlID0gdGhpcy52YXJzLmltbWVkaWF0ZVJlbmRlciB8fCB2YXJzLmltbWVkaWF0ZVJlbmRlcixcblx0XHRcdFx0cDtcblx0XHRcdGlmIChyZXNldER1cmF0aW9uICYmIHRoaXMuX3N0YXJ0VGltZSA8IHRoaXMuX3RpbWVsaW5lLl90aW1lKSB7XG5cdFx0XHRcdHRoaXMuX3N0YXJ0VGltZSA9IHRoaXMuX3RpbWVsaW5lLl90aW1lO1xuXHRcdFx0XHR0aGlzLl91bmNhY2hlKGZhbHNlKTtcblx0XHRcdFx0aWYgKHRoaXMuX2djKSB7XG5cdFx0XHRcdFx0dGhpcy5fZW5hYmxlZCh0cnVlLCBmYWxzZSk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0dGhpcy5fdGltZWxpbmUuaW5zZXJ0KHRoaXMsIHRoaXMuX3N0YXJ0VGltZSAtIHRoaXMuX2RlbGF5KTsgLy9lbnN1cmVzIHRoYXQgYW55IG5lY2Vzc2FyeSByZS1zZXF1ZW5jaW5nIG9mIEFuaW1hdGlvbnMgaW4gdGhlIHRpbWVsaW5lIG9jY3VycyB0byBtYWtlIHN1cmUgdGhlIHJlbmRlcmluZyBvcmRlciBpcyBjb3JyZWN0LlxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRmb3IgKHAgaW4gdmFycykge1xuXHRcdFx0XHR0aGlzLnZhcnNbcF0gPSB2YXJzW3BdO1xuXHRcdFx0fVxuXHRcdFx0aWYgKHRoaXMuX2luaXR0ZWQgfHwgaW1tZWRpYXRlKSB7XG5cdFx0XHRcdGlmIChyZXNldER1cmF0aW9uKSB7XG5cdFx0XHRcdFx0dGhpcy5faW5pdHRlZCA9IGZhbHNlO1xuXHRcdFx0XHRcdGlmIChpbW1lZGlhdGUpIHtcblx0XHRcdFx0XHRcdHRoaXMucmVuZGVyKDAsIHRydWUsIHRydWUpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRpZiAodGhpcy5fZ2MpIHtcblx0XHRcdFx0XHRcdHRoaXMuX2VuYWJsZWQodHJ1ZSwgZmFsc2UpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRpZiAodGhpcy5fbm90aWZ5UGx1Z2luc09mRW5hYmxlZCAmJiB0aGlzLl9maXJzdFBUKSB7XG5cdFx0XHRcdFx0XHRUd2VlbkxpdGUuX29uUGx1Z2luRXZlbnQoXCJfb25EaXNhYmxlXCIsIHRoaXMpOyAvL2luIGNhc2UgYSBwbHVnaW4gbGlrZSBNb3Rpb25CbHVyIG11c3QgcGVyZm9ybSBzb21lIGNsZWFudXAgdGFza3Ncblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0aWYgKHRoaXMuX3RpbWUgLyB0aGlzLl9kdXJhdGlvbiA+IDAuOTk4KSB7IC8vaWYgdGhlIHR3ZWVuIGhhcyBmaW5pc2hlZCAob3IgY29tZSBleHRyZW1lbHkgY2xvc2UgdG8gZmluaXNoaW5nKSwgd2UganVzdCBuZWVkIHRvIHJld2luZCBpdCB0byAwIGFuZCB0aGVuIHJlbmRlciBpdCBhZ2FpbiBhdCB0aGUgZW5kIHdoaWNoIGZvcmNlcyBpdCB0byByZS1pbml0aWFsaXplIChwYXJzaW5nIHRoZSBuZXcgdmFycykuIFdlIGFsbG93IHR3ZWVucyB0aGF0IGFyZSBjbG9zZSB0byBmaW5pc2hpbmcgKGJ1dCBoYXZlbid0IHF1aXRlIGZpbmlzaGVkKSB0byB3b3JrIHRoaXMgd2F5IHRvbyBiZWNhdXNlIG90aGVyd2lzZSwgdGhlIHZhbHVlcyBhcmUgc28gc21hbGwgd2hlbiBkZXRlcm1pbmluZyB3aGVyZSB0byBwcm9qZWN0IHRoZSBzdGFydGluZyB2YWx1ZXMgdGhhdCBiaW5hcnkgbWF0aCBpc3N1ZXMgY3JlZXAgaW4gYW5kIGNhbiBtYWtlIHRoZSB0d2VlbiBhcHBlYXIgdG8gcmVuZGVyIGluY29ycmVjdGx5IHdoZW4gcnVuIGJhY2t3YXJkcy4gXG5cdFx0XHRcdFx0XHR2YXIgcHJldlRpbWUgPSB0aGlzLl90b3RhbFRpbWU7XG5cdFx0XHRcdFx0XHR0aGlzLnJlbmRlcigwLCB0cnVlLCBmYWxzZSk7XG5cdFx0XHRcdFx0XHR0aGlzLl9pbml0dGVkID0gZmFsc2U7XG5cdFx0XHRcdFx0XHR0aGlzLnJlbmRlcihwcmV2VGltZSwgdHJ1ZSwgZmFsc2UpO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHR0aGlzLl9pbml0dGVkID0gZmFsc2U7XG5cdFx0XHRcdFx0XHR0aGlzLl9pbml0KCk7XG5cdFx0XHRcdFx0XHRpZiAodGhpcy5fdGltZSA+IDAgfHwgaW1tZWRpYXRlKSB7XG5cdFx0XHRcdFx0XHRcdHZhciBpbnYgPSAxIC8gKDEgLSBjdXJSYXRpbyksXG5cdFx0XHRcdFx0XHRcdFx0cHQgPSB0aGlzLl9maXJzdFBULCBlbmRWYWx1ZTtcblx0XHRcdFx0XHRcdFx0d2hpbGUgKHB0KSB7XG5cdFx0XHRcdFx0XHRcdFx0ZW5kVmFsdWUgPSBwdC5zICsgcHQuYztcblx0XHRcdFx0XHRcdFx0XHRwdC5jICo9IGludjtcblx0XHRcdFx0XHRcdFx0XHRwdC5zID0gZW5kVmFsdWUgLSBwdC5jO1xuXHRcdFx0XHRcdFx0XHRcdHB0ID0gcHQuX25leHQ7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdHJldHVybiB0aGlzO1xuXHRcdH07XG5cdFx0XHRcdFxuXHRcdHAucmVuZGVyID0gZnVuY3Rpb24odGltZSwgc3VwcHJlc3NFdmVudHMsIGZvcmNlKSB7XG5cdFx0XHRpZiAoIXRoaXMuX2luaXR0ZWQpIGlmICh0aGlzLl9kdXJhdGlvbiA9PT0gMCAmJiB0aGlzLnZhcnMucmVwZWF0KSB7IC8vemVybyBkdXJhdGlvbiB0d2VlbnMgdGhhdCByZW5kZXIgaW1tZWRpYXRlbHkgaGF2ZSByZW5kZXIoKSBjYWxsZWQgZnJvbSBUd2VlbkxpdGUncyBjb25zdHJ1Y3RvciwgYmVmb3JlIFR3ZWVuTWF4J3MgY29uc3RydWN0b3IgaGFzIGZpbmlzaGVkIHNldHRpbmcgX3JlcGVhdCwgX3JlcGVhdERlbGF5LCBhbmQgX3lveW8gd2hpY2ggYXJlIGNyaXRpY2FsIGluIGRldGVybWluaW5nIHRvdGFsRHVyYXRpb24oKSBzbyB3ZSBuZWVkIHRvIGNhbGwgaW52YWxpZGF0ZSgpIHdoaWNoIGlzIGEgbG93LWtiIHdheSB0byBnZXQgdGhvc2Ugc2V0IHByb3Blcmx5LlxuXHRcdFx0XHR0aGlzLmludmFsaWRhdGUoKTtcblx0XHRcdH1cblx0XHRcdHZhciB0b3RhbER1ciA9ICghdGhpcy5fZGlydHkpID8gdGhpcy5fdG90YWxEdXJhdGlvbiA6IHRoaXMudG90YWxEdXJhdGlvbigpLFxuXHRcdFx0XHRwcmV2VGltZSA9IHRoaXMuX3RpbWUsXG5cdFx0XHRcdHByZXZUb3RhbFRpbWUgPSB0aGlzLl90b3RhbFRpbWUsIFxuXHRcdFx0XHRwcmV2Q3ljbGUgPSB0aGlzLl9jeWNsZSxcblx0XHRcdFx0ZHVyYXRpb24gPSB0aGlzLl9kdXJhdGlvbixcblx0XHRcdFx0cHJldlJhd1ByZXZUaW1lID0gdGhpcy5fcmF3UHJldlRpbWUsXG5cdFx0XHRcdGlzQ29tcGxldGUsIGNhbGxiYWNrLCBwdCwgY3ljbGVEdXJhdGlvbiwgciwgdHlwZSwgcG93LCByYXdQcmV2VGltZSwgeW95b0Vhc2U7XG5cdFx0XHRpZiAodGltZSA+PSB0b3RhbER1ciAtIDAuMDAwMDAwMSAmJiB0aW1lID49IDApIHsgLy90byB3b3JrIGFyb3VuZCBvY2Nhc2lvbmFsIGZsb2F0aW5nIHBvaW50IG1hdGggYXJ0aWZhY3RzLlxuXHRcdFx0XHR0aGlzLl90b3RhbFRpbWUgPSB0b3RhbER1cjtcblx0XHRcdFx0dGhpcy5fY3ljbGUgPSB0aGlzLl9yZXBlYXQ7XG5cdFx0XHRcdGlmICh0aGlzLl95b3lvICYmICh0aGlzLl9jeWNsZSAmIDEpICE9PSAwKSB7XG5cdFx0XHRcdFx0dGhpcy5fdGltZSA9IDA7XG5cdFx0XHRcdFx0dGhpcy5yYXRpbyA9IHRoaXMuX2Vhc2UuX2NhbGNFbmQgPyB0aGlzLl9lYXNlLmdldFJhdGlvKDApIDogMDtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHR0aGlzLl90aW1lID0gZHVyYXRpb247XG5cdFx0XHRcdFx0dGhpcy5yYXRpbyA9IHRoaXMuX2Vhc2UuX2NhbGNFbmQgPyB0aGlzLl9lYXNlLmdldFJhdGlvKDEpIDogMTtcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAoIXRoaXMuX3JldmVyc2VkKSB7XG5cdFx0XHRcdFx0aXNDb21wbGV0ZSA9IHRydWU7XG5cdFx0XHRcdFx0Y2FsbGJhY2sgPSBcIm9uQ29tcGxldGVcIjtcblx0XHRcdFx0XHRmb3JjZSA9IChmb3JjZSB8fCB0aGlzLl90aW1lbGluZS5hdXRvUmVtb3ZlQ2hpbGRyZW4pOyAvL290aGVyd2lzZSwgaWYgdGhlIGFuaW1hdGlvbiBpcyB1bnBhdXNlZC9hY3RpdmF0ZWQgYWZ0ZXIgaXQncyBhbHJlYWR5IGZpbmlzaGVkLCBpdCBkb2Vzbid0IGdldCByZW1vdmVkIGZyb20gdGhlIHBhcmVudCB0aW1lbGluZS5cblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAoZHVyYXRpb24gPT09IDApIGlmICh0aGlzLl9pbml0dGVkIHx8ICF0aGlzLnZhcnMubGF6eSB8fCBmb3JjZSkgeyAvL3plcm8tZHVyYXRpb24gdHdlZW5zIGFyZSB0cmlja3kgYmVjYXVzZSB3ZSBtdXN0IGRpc2Nlcm4gdGhlIG1vbWVudHVtL2RpcmVjdGlvbiBvZiB0aW1lIGluIG9yZGVyIHRvIGRldGVybWluZSB3aGV0aGVyIHRoZSBzdGFydGluZyB2YWx1ZXMgc2hvdWxkIGJlIHJlbmRlcmVkIG9yIHRoZSBlbmRpbmcgdmFsdWVzLiBJZiB0aGUgXCJwbGF5aGVhZFwiIG9mIGl0cyB0aW1lbGluZSBnb2VzIHBhc3QgdGhlIHplcm8tZHVyYXRpb24gdHdlZW4gaW4gdGhlIGZvcndhcmQgZGlyZWN0aW9uIG9yIGxhbmRzIGRpcmVjdGx5IG9uIGl0LCB0aGUgZW5kIHZhbHVlcyBzaG91bGQgYmUgcmVuZGVyZWQsIGJ1dCBpZiB0aGUgdGltZWxpbmUncyBcInBsYXloZWFkXCIgbW92ZXMgcGFzdCBpdCBpbiB0aGUgYmFja3dhcmQgZGlyZWN0aW9uIChmcm9tIGEgcG9zdGl0aXZlIHRpbWUgdG8gYSBuZWdhdGl2ZSB0aW1lKSwgdGhlIHN0YXJ0aW5nIHZhbHVlcyBtdXN0IGJlIHJlbmRlcmVkLlxuXHRcdFx0XHRcdGlmICh0aGlzLl9zdGFydFRpbWUgPT09IHRoaXMuX3RpbWVsaW5lLl9kdXJhdGlvbikgeyAvL2lmIGEgemVyby1kdXJhdGlvbiB0d2VlbiBpcyBhdCB0aGUgVkVSWSBlbmQgb2YgYSB0aW1lbGluZSBhbmQgdGhhdCB0aW1lbGluZSByZW5kZXJzIGF0IGl0cyBlbmQsIGl0IHdpbGwgdHlwaWNhbGx5IGFkZCBhIHRpbnkgYml0IG9mIGN1c2hpb24gdG8gdGhlIHJlbmRlciB0aW1lIHRvIHByZXZlbnQgcm91bmRpbmcgZXJyb3JzIGZyb20gZ2V0dGluZyBpbiB0aGUgd2F5IG9mIHR3ZWVucyByZW5kZXJpbmcgdGhlaXIgVkVSWSBlbmQuIElmIHdlIHRoZW4gcmV2ZXJzZSgpIHRoYXQgdGltZWxpbmUsIHRoZSB6ZXJvLWR1cmF0aW9uIHR3ZWVuIHdpbGwgdHJpZ2dlciBpdHMgb25SZXZlcnNlQ29tcGxldGUgZXZlbiB0aG91Z2ggdGVjaG5pY2FsbHkgdGhlIHBsYXloZWFkIGRpZG4ndCBwYXNzIG92ZXIgaXQgYWdhaW4uIEl0J3MgYSB2ZXJ5IHNwZWNpZmljIGVkZ2UgY2FzZSB3ZSBtdXN0IGFjY29tbW9kYXRlLlxuXHRcdFx0XHRcdFx0dGltZSA9IDA7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGlmIChwcmV2UmF3UHJldlRpbWUgPCAwIHx8ICh0aW1lIDw9IDAgJiYgdGltZSA+PSAtMC4wMDAwMDAxKSB8fCAocHJldlJhd1ByZXZUaW1lID09PSBfdGlueU51bSAmJiB0aGlzLmRhdGEgIT09IFwiaXNQYXVzZVwiKSkgaWYgKHByZXZSYXdQcmV2VGltZSAhPT0gdGltZSkgeyAvL25vdGU6IHdoZW4gdGhpcy5kYXRhIGlzIFwiaXNQYXVzZVwiLCBpdCdzIGEgY2FsbGJhY2sgYWRkZWQgYnkgYWRkUGF1c2UoKSBvbiBhIHRpbWVsaW5lIHRoYXQgd2Ugc2hvdWxkIG5vdCBiZSB0cmlnZ2VyZWQgd2hlbiBMRUFWSU5HIGl0cyBleGFjdCBzdGFydCB0aW1lLiBJbiBvdGhlciB3b3JkcywgdGwuYWRkUGF1c2UoMSkucGxheSgxKSBzaG91bGRuJ3QgcGF1c2UuXG5cdFx0XHRcdFx0XHRmb3JjZSA9IHRydWU7XG5cdFx0XHRcdFx0XHRpZiAocHJldlJhd1ByZXZUaW1lID4gX3RpbnlOdW0pIHtcblx0XHRcdFx0XHRcdFx0Y2FsbGJhY2sgPSBcIm9uUmV2ZXJzZUNvbXBsZXRlXCI7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHRoaXMuX3Jhd1ByZXZUaW1lID0gcmF3UHJldlRpbWUgPSAoIXN1cHByZXNzRXZlbnRzIHx8IHRpbWUgfHwgcHJldlJhd1ByZXZUaW1lID09PSB0aW1lKSA/IHRpbWUgOiBfdGlueU51bTsgLy93aGVuIHRoZSBwbGF5aGVhZCBhcnJpdmVzIGF0IEVYQUNUTFkgdGltZSAwIChyaWdodCBvbiB0b3ApIG9mIGEgemVyby1kdXJhdGlvbiB0d2Vlbiwgd2UgbmVlZCB0byBkaXNjZXJuIGlmIGV2ZW50cyBhcmUgc3VwcHJlc3NlZCBzbyB0aGF0IHdoZW4gdGhlIHBsYXloZWFkIG1vdmVzIGFnYWluIChuZXh0IHRpbWUpLCBpdCdsbCB0cmlnZ2VyIHRoZSBjYWxsYmFjay4gSWYgZXZlbnRzIGFyZSBOT1Qgc3VwcHJlc3NlZCwgb2J2aW91c2x5IHRoZSBjYWxsYmFjayB3b3VsZCBiZSB0cmlnZ2VyZWQgaW4gdGhpcyByZW5kZXIuIEJhc2ljYWxseSwgdGhlIGNhbGxiYWNrIHNob3VsZCBmaXJlIGVpdGhlciB3aGVuIHRoZSBwbGF5aGVhZCBBUlJJVkVTIG9yIExFQVZFUyB0aGlzIGV4YWN0IHNwb3QsIG5vdCBib3RoLiBJbWFnaW5lIGRvaW5nIGEgdGltZWxpbmUuc2VlaygwKSBhbmQgdGhlcmUncyBhIGNhbGxiYWNrIHRoYXQgc2l0cyBhdCAwLiBTaW5jZSBldmVudHMgYXJlIHN1cHByZXNzZWQgb24gdGhhdCBzZWVrKCkgYnkgZGVmYXVsdCwgbm90aGluZyB3aWxsIGZpcmUsIGJ1dCB3aGVuIHRoZSBwbGF5aGVhZCBtb3ZlcyBvZmYgb2YgdGhhdCBwb3NpdGlvbiwgdGhlIGNhbGxiYWNrIHNob3VsZCBmaXJlLiBUaGlzIGJlaGF2aW9yIGlzIHdoYXQgcGVvcGxlIGludHVpdGl2ZWx5IGV4cGVjdC4gV2Ugc2V0IHRoZSBfcmF3UHJldlRpbWUgdG8gYmUgYSBwcmVjaXNlIHRpbnkgbnVtYmVyIHRvIGluZGljYXRlIHRoaXMgc2NlbmFyaW8gcmF0aGVyIHRoYW4gdXNpbmcgYW5vdGhlciBwcm9wZXJ0eS92YXJpYWJsZSB3aGljaCB3b3VsZCBpbmNyZWFzZSBtZW1vcnkgdXNhZ2UuIFRoaXMgdGVjaG5pcXVlIGlzIGxlc3MgcmVhZGFibGUsIGJ1dCBtb3JlIGVmZmljaWVudC5cblx0XHRcdFx0fVxuXHRcdFx0XHRcblx0XHRcdH0gZWxzZSBpZiAodGltZSA8IDAuMDAwMDAwMSkgeyAvL3RvIHdvcmsgYXJvdW5kIG9jY2FzaW9uYWwgZmxvYXRpbmcgcG9pbnQgbWF0aCBhcnRpZmFjdHMsIHJvdW5kIHN1cGVyIHNtYWxsIHZhbHVlcyB0byAwLlxuXHRcdFx0XHR0aGlzLl90b3RhbFRpbWUgPSB0aGlzLl90aW1lID0gdGhpcy5fY3ljbGUgPSAwO1xuXHRcdFx0XHR0aGlzLnJhdGlvID0gdGhpcy5fZWFzZS5fY2FsY0VuZCA/IHRoaXMuX2Vhc2UuZ2V0UmF0aW8oMCkgOiAwO1xuXHRcdFx0XHRpZiAocHJldlRvdGFsVGltZSAhPT0gMCB8fCAoZHVyYXRpb24gPT09IDAgJiYgcHJldlJhd1ByZXZUaW1lID4gMCkpIHtcblx0XHRcdFx0XHRjYWxsYmFjayA9IFwib25SZXZlcnNlQ29tcGxldGVcIjtcblx0XHRcdFx0XHRpc0NvbXBsZXRlID0gdGhpcy5fcmV2ZXJzZWQ7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKHRpbWUgPCAwKSB7XG5cdFx0XHRcdFx0dGhpcy5fYWN0aXZlID0gZmFsc2U7XG5cdFx0XHRcdFx0aWYgKGR1cmF0aW9uID09PSAwKSBpZiAodGhpcy5faW5pdHRlZCB8fCAhdGhpcy52YXJzLmxhenkgfHwgZm9yY2UpIHsgLy96ZXJvLWR1cmF0aW9uIHR3ZWVucyBhcmUgdHJpY2t5IGJlY2F1c2Ugd2UgbXVzdCBkaXNjZXJuIHRoZSBtb21lbnR1bS9kaXJlY3Rpb24gb2YgdGltZSBpbiBvcmRlciB0byBkZXRlcm1pbmUgd2hldGhlciB0aGUgc3RhcnRpbmcgdmFsdWVzIHNob3VsZCBiZSByZW5kZXJlZCBvciB0aGUgZW5kaW5nIHZhbHVlcy4gSWYgdGhlIFwicGxheWhlYWRcIiBvZiBpdHMgdGltZWxpbmUgZ29lcyBwYXN0IHRoZSB6ZXJvLWR1cmF0aW9uIHR3ZWVuIGluIHRoZSBmb3J3YXJkIGRpcmVjdGlvbiBvciBsYW5kcyBkaXJlY3RseSBvbiBpdCwgdGhlIGVuZCB2YWx1ZXMgc2hvdWxkIGJlIHJlbmRlcmVkLCBidXQgaWYgdGhlIHRpbWVsaW5lJ3MgXCJwbGF5aGVhZFwiIG1vdmVzIHBhc3QgaXQgaW4gdGhlIGJhY2t3YXJkIGRpcmVjdGlvbiAoZnJvbSBhIHBvc3RpdGl2ZSB0aW1lIHRvIGEgbmVnYXRpdmUgdGltZSksIHRoZSBzdGFydGluZyB2YWx1ZXMgbXVzdCBiZSByZW5kZXJlZC5cblx0XHRcdFx0XHRcdGlmIChwcmV2UmF3UHJldlRpbWUgPj0gMCkge1xuXHRcdFx0XHRcdFx0XHRmb3JjZSA9IHRydWU7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR0aGlzLl9yYXdQcmV2VGltZSA9IHJhd1ByZXZUaW1lID0gKCFzdXBwcmVzc0V2ZW50cyB8fCB0aW1lIHx8IHByZXZSYXdQcmV2VGltZSA9PT0gdGltZSkgPyB0aW1lIDogX3RpbnlOdW07IC8vd2hlbiB0aGUgcGxheWhlYWQgYXJyaXZlcyBhdCBFWEFDVExZIHRpbWUgMCAocmlnaHQgb24gdG9wKSBvZiBhIHplcm8tZHVyYXRpb24gdHdlZW4sIHdlIG5lZWQgdG8gZGlzY2VybiBpZiBldmVudHMgYXJlIHN1cHByZXNzZWQgc28gdGhhdCB3aGVuIHRoZSBwbGF5aGVhZCBtb3ZlcyBhZ2FpbiAobmV4dCB0aW1lKSwgaXQnbGwgdHJpZ2dlciB0aGUgY2FsbGJhY2suIElmIGV2ZW50cyBhcmUgTk9UIHN1cHByZXNzZWQsIG9idmlvdXNseSB0aGUgY2FsbGJhY2sgd291bGQgYmUgdHJpZ2dlcmVkIGluIHRoaXMgcmVuZGVyLiBCYXNpY2FsbHksIHRoZSBjYWxsYmFjayBzaG91bGQgZmlyZSBlaXRoZXIgd2hlbiB0aGUgcGxheWhlYWQgQVJSSVZFUyBvciBMRUFWRVMgdGhpcyBleGFjdCBzcG90LCBub3QgYm90aC4gSW1hZ2luZSBkb2luZyBhIHRpbWVsaW5lLnNlZWsoMCkgYW5kIHRoZXJlJ3MgYSBjYWxsYmFjayB0aGF0IHNpdHMgYXQgMC4gU2luY2UgZXZlbnRzIGFyZSBzdXBwcmVzc2VkIG9uIHRoYXQgc2VlaygpIGJ5IGRlZmF1bHQsIG5vdGhpbmcgd2lsbCBmaXJlLCBidXQgd2hlbiB0aGUgcGxheWhlYWQgbW92ZXMgb2ZmIG9mIHRoYXQgcG9zaXRpb24sIHRoZSBjYWxsYmFjayBzaG91bGQgZmlyZS4gVGhpcyBiZWhhdmlvciBpcyB3aGF0IHBlb3BsZSBpbnR1aXRpdmVseSBleHBlY3QuIFdlIHNldCB0aGUgX3Jhd1ByZXZUaW1lIHRvIGJlIGEgcHJlY2lzZSB0aW55IG51bWJlciB0byBpbmRpY2F0ZSB0aGlzIHNjZW5hcmlvIHJhdGhlciB0aGFuIHVzaW5nIGFub3RoZXIgcHJvcGVydHkvdmFyaWFibGUgd2hpY2ggd291bGQgaW5jcmVhc2UgbWVtb3J5IHVzYWdlLiBUaGlzIHRlY2huaXF1ZSBpcyBsZXNzIHJlYWRhYmxlLCBidXQgbW9yZSBlZmZpY2llbnQuXG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdGlmICghdGhpcy5faW5pdHRlZCkgeyAvL2lmIHdlIHJlbmRlciB0aGUgdmVyeSBiZWdpbm5pbmcgKHRpbWUgPT0gMCkgb2YgYSBmcm9tVG8oKSwgd2UgbXVzdCBmb3JjZSB0aGUgcmVuZGVyIChub3JtYWwgdHdlZW5zIHdvdWxkbid0IG5lZWQgdG8gcmVuZGVyIGF0IGEgdGltZSBvZiAwIHdoZW4gdGhlIHByZXZUaW1lIHdhcyBhbHNvIDApLiBUaGlzIGlzIGFsc28gbWFuZGF0b3J5IHRvIG1ha2Ugc3VyZSBvdmVyd3JpdGluZyBraWNrcyBpbiBpbW1lZGlhdGVseS5cblx0XHRcdFx0XHRmb3JjZSA9IHRydWU7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHRoaXMuX3RvdGFsVGltZSA9IHRoaXMuX3RpbWUgPSB0aW1lO1xuXHRcdFx0XHRpZiAodGhpcy5fcmVwZWF0ICE9PSAwKSB7XG5cdFx0XHRcdFx0Y3ljbGVEdXJhdGlvbiA9IGR1cmF0aW9uICsgdGhpcy5fcmVwZWF0RGVsYXk7XG5cdFx0XHRcdFx0dGhpcy5fY3ljbGUgPSAodGhpcy5fdG90YWxUaW1lIC8gY3ljbGVEdXJhdGlvbikgPj4gMDsgLy9vcmlnaW5hbGx5IF90b3RhbFRpbWUgJSBjeWNsZUR1cmF0aW9uIGJ1dCBmbG9hdGluZyBwb2ludCBlcnJvcnMgY2F1c2VkIHByb2JsZW1zLCBzbyBJIG5vcm1hbGl6ZWQgaXQuICg0ICUgMC44IHNob3VsZCBiZSAwIGJ1dCBzb21lIGJyb3dzZXJzIHJlcG9ydCBpdCBhcyAwLjc5OTk5OTk5ISlcblx0XHRcdFx0XHRpZiAodGhpcy5fY3ljbGUgIT09IDApIGlmICh0aGlzLl9jeWNsZSA9PT0gdGhpcy5fdG90YWxUaW1lIC8gY3ljbGVEdXJhdGlvbiAmJiBwcmV2VG90YWxUaW1lIDw9IHRpbWUpIHtcblx0XHRcdFx0XHRcdHRoaXMuX2N5Y2xlLS07IC8vb3RoZXJ3aXNlIHdoZW4gcmVuZGVyZWQgZXhhY3RseSBhdCB0aGUgZW5kIHRpbWUsIGl0IHdpbGwgYWN0IGFzIHRob3VnaCBpdCBpcyByZXBlYXRpbmcgKGF0IHRoZSBiZWdpbm5pbmcpXG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHRoaXMuX3RpbWUgPSB0aGlzLl90b3RhbFRpbWUgLSAodGhpcy5fY3ljbGUgKiBjeWNsZUR1cmF0aW9uKTtcblx0XHRcdFx0XHRpZiAodGhpcy5feW95bykgaWYgKCh0aGlzLl9jeWNsZSAmIDEpICE9PSAwKSB7XG5cdFx0XHRcdFx0XHR0aGlzLl90aW1lID0gZHVyYXRpb24gLSB0aGlzLl90aW1lO1xuXHRcdFx0XHRcdFx0eW95b0Vhc2UgPSB0aGlzLl95b3lvRWFzZSB8fCB0aGlzLnZhcnMueW95b0Vhc2U7IC8vbm90ZTogd2UgZG9uJ3Qgc2V0IHRoaXMuX3lveW9FYXNlIGluIF9pbml0KCkgbGlrZSB3ZSBkbyBvdGhlciBwcm9wZXJ0aWVzIGJlY2F1c2UgaXQncyBUd2Vlbk1heC1zcGVjaWZpYyBhbmQgZG9pbmcgaXQgaGVyZSBhbGxvd3MgdXMgdG8gb3B0aW1pemUgcGVyZm9ybWFuY2UgKG1vc3QgdHdlZW5zIGRvbid0IGhhdmUgYSB5b3lvRWFzZSkuIE5vdGUgdGhhdCB3ZSBhbHNvIG11c3Qgc2tpcCB0aGUgdGhpcy5yYXRpbyBjYWxjdWxhdGlvbiBmdXJ0aGVyIGRvd24gcmlnaHQgYWZ0ZXIgd2UgX2luaXQoKSBpbiB0aGlzIGZ1bmN0aW9uLCBiZWNhdXNlIHdlJ3JlIGRvaW5nIGl0IGhlcmUuXG5cdFx0XHRcdFx0XHRpZiAoeW95b0Vhc2UpIHtcblx0XHRcdFx0XHRcdFx0aWYgKCF0aGlzLl95b3lvRWFzZSkge1xuXHRcdFx0XHRcdFx0XHRcdGlmICh5b3lvRWFzZSA9PT0gdHJ1ZSAmJiAhdGhpcy5faW5pdHRlZCkgeyAvL2lmIGl0J3Mgbm90IGluaXR0ZWQgYW5kIHlveW9FYXNlIGlzIHRydWUsIHRoaXMuX2Vhc2Ugd29uJ3QgaGF2ZSBiZWVuIHBvcHVsYXRlZCB5ZXQgc28gd2UgbXVzdCBkaXNjZXJuIGl0IGhlcmUuXG5cdFx0XHRcdFx0XHRcdFx0XHR5b3lvRWFzZSA9IHRoaXMudmFycy5lYXNlO1xuXHRcdFx0XHRcdFx0XHRcdFx0dGhpcy5feW95b0Vhc2UgPSB5b3lvRWFzZSA9ICF5b3lvRWFzZSA/IFR3ZWVuTGl0ZS5kZWZhdWx0RWFzZSA6ICh5b3lvRWFzZSBpbnN0YW5jZW9mIEVhc2UpID8geW95b0Vhc2UgOiAodHlwZW9mKHlveW9FYXNlKSA9PT0gXCJmdW5jdGlvblwiKSA/IG5ldyBFYXNlKHlveW9FYXNlLCB0aGlzLnZhcnMuZWFzZVBhcmFtcykgOiBFYXNlLm1hcFt5b3lvRWFzZV0gfHwgVHdlZW5MaXRlLmRlZmF1bHRFYXNlO1xuXHRcdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdFx0XHR0aGlzLl95b3lvRWFzZSA9IHlveW9FYXNlID0gKHlveW9FYXNlID09PSB0cnVlKSA/IHRoaXMuX2Vhc2UgOiAoeW95b0Vhc2UgaW5zdGFuY2VvZiBFYXNlKSA/IHlveW9FYXNlIDogRWFzZS5tYXBbeW95b0Vhc2VdO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR0aGlzLnJhdGlvID0geW95b0Vhc2UgPyAxIC0geW95b0Vhc2UuZ2V0UmF0aW8oKGR1cmF0aW9uIC0gdGhpcy5fdGltZSkgLyBkdXJhdGlvbikgOiAwO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRpZiAodGhpcy5fdGltZSA+IGR1cmF0aW9uKSB7XG5cdFx0XHRcdFx0XHR0aGlzLl90aW1lID0gZHVyYXRpb247XG5cdFx0XHRcdFx0fSBlbHNlIGlmICh0aGlzLl90aW1lIDwgMCkge1xuXHRcdFx0XHRcdFx0dGhpcy5fdGltZSA9IDA7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdGlmICh0aGlzLl9lYXNlVHlwZSAmJiAheW95b0Vhc2UpIHtcblx0XHRcdFx0XHRyID0gdGhpcy5fdGltZSAvIGR1cmF0aW9uO1xuXHRcdFx0XHRcdHR5cGUgPSB0aGlzLl9lYXNlVHlwZTtcblx0XHRcdFx0XHRwb3cgPSB0aGlzLl9lYXNlUG93ZXI7XG5cdFx0XHRcdFx0aWYgKHR5cGUgPT09IDEgfHwgKHR5cGUgPT09IDMgJiYgciA+PSAwLjUpKSB7XG5cdFx0XHRcdFx0XHRyID0gMSAtIHI7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGlmICh0eXBlID09PSAzKSB7XG5cdFx0XHRcdFx0XHRyICo9IDI7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGlmIChwb3cgPT09IDEpIHtcblx0XHRcdFx0XHRcdHIgKj0gcjtcblx0XHRcdFx0XHR9IGVsc2UgaWYgKHBvdyA9PT0gMikge1xuXHRcdFx0XHRcdFx0ciAqPSByICogcjtcblx0XHRcdFx0XHR9IGVsc2UgaWYgKHBvdyA9PT0gMykge1xuXHRcdFx0XHRcdFx0ciAqPSByICogciAqIHI7XG5cdFx0XHRcdFx0fSBlbHNlIGlmIChwb3cgPT09IDQpIHtcblx0XHRcdFx0XHRcdHIgKj0gciAqIHIgKiByICogcjtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRpZiAodHlwZSA9PT0gMSkge1xuXHRcdFx0XHRcdFx0dGhpcy5yYXRpbyA9IDEgLSByO1xuXHRcdFx0XHRcdH0gZWxzZSBpZiAodHlwZSA9PT0gMikge1xuXHRcdFx0XHRcdFx0dGhpcy5yYXRpbyA9IHI7XG5cdFx0XHRcdFx0fSBlbHNlIGlmICh0aGlzLl90aW1lIC8gZHVyYXRpb24gPCAwLjUpIHtcblx0XHRcdFx0XHRcdHRoaXMucmF0aW8gPSByIC8gMjtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0dGhpcy5yYXRpbyA9IDEgLSAociAvIDIpO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9IGVsc2UgaWYgKCF5b3lvRWFzZSkge1xuXHRcdFx0XHRcdHRoaXMucmF0aW8gPSB0aGlzLl9lYXNlLmdldFJhdGlvKHRoaXMuX3RpbWUgLyBkdXJhdGlvbik7XG5cdFx0XHRcdH1cblx0XHRcdFx0XG5cdFx0XHR9XG5cdFx0XHRcdFxuXHRcdFx0aWYgKHByZXZUaW1lID09PSB0aGlzLl90aW1lICYmICFmb3JjZSAmJiBwcmV2Q3ljbGUgPT09IHRoaXMuX2N5Y2xlKSB7XG5cdFx0XHRcdGlmIChwcmV2VG90YWxUaW1lICE9PSB0aGlzLl90b3RhbFRpbWUpIGlmICh0aGlzLl9vblVwZGF0ZSkgaWYgKCFzdXBwcmVzc0V2ZW50cykgeyAvL3NvIHRoYXQgb25VcGRhdGUgZmlyZXMgZXZlbiBkdXJpbmcgdGhlIHJlcGVhdERlbGF5IC0gYXMgbG9uZyBhcyB0aGUgdG90YWxUaW1lIGNoYW5nZWQsIHdlIHNob3VsZCB0cmlnZ2VyIG9uVXBkYXRlLlxuXHRcdFx0XHRcdHRoaXMuX2NhbGxiYWNrKFwib25VcGRhdGVcIik7XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fSBlbHNlIGlmICghdGhpcy5faW5pdHRlZCkge1xuXHRcdFx0XHR0aGlzLl9pbml0KCk7XG5cdFx0XHRcdGlmICghdGhpcy5faW5pdHRlZCB8fCB0aGlzLl9nYykgeyAvL2ltbWVkaWF0ZVJlbmRlciB0d2VlbnMgdHlwaWNhbGx5IHdvbid0IGluaXRpYWxpemUgdW50aWwgdGhlIHBsYXloZWFkIGFkdmFuY2VzIChfdGltZSBpcyBncmVhdGVyIHRoYW4gMCkgaW4gb3JkZXIgdG8gZW5zdXJlIHRoYXQgb3ZlcndyaXRpbmcgb2NjdXJzIHByb3Blcmx5LiBBbHNvLCBpZiBhbGwgb2YgdGhlIHR3ZWVuaW5nIHByb3BlcnRpZXMgaGF2ZSBiZWVuIG92ZXJ3cml0dGVuICh3aGljaCB3b3VsZCBjYXVzZSBfZ2MgdG8gYmUgdHJ1ZSwgYXMgc2V0IGluIF9pbml0KCkpLCB3ZSBzaG91bGRuJ3QgY29udGludWUgb3RoZXJ3aXNlIGFuIG9uU3RhcnQgY2FsbGJhY2sgY291bGQgYmUgY2FsbGVkIGZvciBleGFtcGxlLlxuXHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0fSBlbHNlIGlmICghZm9yY2UgJiYgdGhpcy5fZmlyc3RQVCAmJiAoKHRoaXMudmFycy5sYXp5ICE9PSBmYWxzZSAmJiB0aGlzLl9kdXJhdGlvbikgfHwgKHRoaXMudmFycy5sYXp5ICYmICF0aGlzLl9kdXJhdGlvbikpKSB7IC8vd2Ugc3RpY2sgaXQgaW4gdGhlIHF1ZXVlIGZvciByZW5kZXJpbmcgYXQgdGhlIHZlcnkgZW5kIG9mIHRoZSB0aWNrIC0gdGhpcyBpcyBhIHBlcmZvcm1hbmNlIG9wdGltaXphdGlvbiBiZWNhdXNlIGJyb3dzZXJzIGludmFsaWRhdGUgc3R5bGVzIGFuZCBmb3JjZSBhIHJlY2FsY3VsYXRpb24gaWYgeW91IHJlYWQsIHdyaXRlLCBhbmQgdGhlbiByZWFkIHN0eWxlIGRhdGEgKHNvIGl0J3MgYmV0dGVyIHRvIHJlYWQvcmVhZC9yZWFkL3dyaXRlL3dyaXRlL3dyaXRlIHRoYW4gcmVhZC93cml0ZS9yZWFkL3dyaXRlL3JlYWQvd3JpdGUpLiBUaGUgZG93biBzaWRlLCBvZiBjb3Vyc2UsIGlzIHRoYXQgdXN1YWxseSB5b3UgV0FOVCB0aGluZ3MgdG8gcmVuZGVyIGltbWVkaWF0ZWx5IGJlY2F1c2UgeW91IG1heSBoYXZlIGNvZGUgcnVubmluZyByaWdodCBhZnRlciB0aGF0IHdoaWNoIGRlcGVuZHMgb24gdGhlIGNoYW5nZS4gTGlrZSBpbWFnaW5lIHJ1bm5pbmcgVHdlZW5MaXRlLnNldCguLi4pIGFuZCB0aGVuIGltbWVkaWF0ZWx5IGFmdGVyIHRoYXQsIGNyZWF0aW5nIGEgbm90aGVyIHR3ZWVuIHRoYXQgYW5pbWF0ZXMgdGhlIHNhbWUgcHJvcGVydHkgdG8gYW5vdGhlciB2YWx1ZTsgdGhlIHN0YXJ0aW5nIHZhbHVlcyBvZiB0aGF0IDJuZCB0d2VlbiB3b3VsZG4ndCBiZSBhY2N1cmF0ZSBpZiBsYXp5IGlzIHRydWUuXG5cdFx0XHRcdFx0dGhpcy5fdGltZSA9IHByZXZUaW1lO1xuXHRcdFx0XHRcdHRoaXMuX3RvdGFsVGltZSA9IHByZXZUb3RhbFRpbWU7XG5cdFx0XHRcdFx0dGhpcy5fcmF3UHJldlRpbWUgPSBwcmV2UmF3UHJldlRpbWU7XG5cdFx0XHRcdFx0dGhpcy5fY3ljbGUgPSBwcmV2Q3ljbGU7XG5cdFx0XHRcdFx0VHdlZW5MaXRlSW50ZXJuYWxzLmxhenlUd2VlbnMucHVzaCh0aGlzKTtcblx0XHRcdFx0XHR0aGlzLl9sYXp5ID0gW3RpbWUsIHN1cHByZXNzRXZlbnRzXTtcblx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdH1cblx0XHRcdFx0Ly9fZWFzZSBpcyBpbml0aWFsbHkgc2V0IHRvIGRlZmF1bHRFYXNlLCBzbyBub3cgdGhhdCBpbml0KCkgaGFzIHJ1biwgX2Vhc2UgaXMgc2V0IHByb3Blcmx5IGFuZCB3ZSBuZWVkIHRvIHJlY2FsY3VsYXRlIHRoZSByYXRpby4gT3ZlcmFsbCB0aGlzIGlzIGZhc3RlciB0aGFuIHVzaW5nIGNvbmRpdGlvbmFsIGxvZ2ljIGVhcmxpZXIgaW4gdGhlIG1ldGhvZCB0byBhdm9pZCBoYXZpbmcgdG8gc2V0IHJhdGlvIHR3aWNlIGJlY2F1c2Ugd2Ugb25seSBpbml0KCkgb25jZSBidXQgcmVuZGVyVGltZSgpIGdldHMgY2FsbGVkIFZFUlkgZnJlcXVlbnRseS5cblx0XHRcdFx0aWYgKHRoaXMuX3RpbWUgJiYgIWlzQ29tcGxldGUgJiYgIXlveW9FYXNlKSB7XG5cdFx0XHRcdFx0dGhpcy5yYXRpbyA9IHRoaXMuX2Vhc2UuZ2V0UmF0aW8odGhpcy5fdGltZSAvIGR1cmF0aW9uKTtcblx0XHRcdFx0fSBlbHNlIGlmIChpc0NvbXBsZXRlICYmIHRoaXMuX2Vhc2UuX2NhbGNFbmQgJiYgIXlveW9FYXNlKSB7XG5cdFx0XHRcdFx0dGhpcy5yYXRpbyA9IHRoaXMuX2Vhc2UuZ2V0UmF0aW8oKHRoaXMuX3RpbWUgPT09IDApID8gMCA6IDEpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRpZiAodGhpcy5fbGF6eSAhPT0gZmFsc2UpIHtcblx0XHRcdFx0dGhpcy5fbGF6eSA9IGZhbHNlO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIXRoaXMuX2FjdGl2ZSkgaWYgKCF0aGlzLl9wYXVzZWQgJiYgdGhpcy5fdGltZSAhPT0gcHJldlRpbWUgJiYgdGltZSA+PSAwKSB7XG5cdFx0XHRcdHRoaXMuX2FjdGl2ZSA9IHRydWU7IC8vc28gdGhhdCBpZiB0aGUgdXNlciByZW5kZXJzIGEgdHdlZW4gKGFzIG9wcG9zZWQgdG8gdGhlIHRpbWVsaW5lIHJlbmRlcmluZyBpdCksIHRoZSB0aW1lbGluZSBpcyBmb3JjZWQgdG8gcmUtcmVuZGVyIGFuZCBhbGlnbiBpdCB3aXRoIHRoZSBwcm9wZXIgdGltZS9mcmFtZSBvbiB0aGUgbmV4dCByZW5kZXJpbmcgY3ljbGUuIE1heWJlIHRoZSB0d2VlbiBhbHJlYWR5IGZpbmlzaGVkIGJ1dCB0aGUgdXNlciBtYW51YWxseSByZS1yZW5kZXJzIGl0IGFzIGhhbGZ3YXkgZG9uZS5cblx0XHRcdH1cblx0XHRcdGlmIChwcmV2VG90YWxUaW1lID09PSAwKSB7XG5cdFx0XHRcdGlmICh0aGlzLl9pbml0dGVkID09PSAyICYmIHRpbWUgPiAwKSB7XG5cdFx0XHRcdFx0Ly90aGlzLmludmFsaWRhdGUoKTtcblx0XHRcdFx0XHR0aGlzLl9pbml0KCk7IC8vd2lsbCBqdXN0IGFwcGx5IG92ZXJ3cml0aW5nIHNpbmNlIF9pbml0dGVkIG9mICgyKSBtZWFucyBpdCB3YXMgYSBmcm9tKCkgdHdlZW4gdGhhdCBoYWQgaW1tZWRpYXRlUmVuZGVyOnRydWVcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAodGhpcy5fc3RhcnRBdCkge1xuXHRcdFx0XHRcdGlmICh0aW1lID49IDApIHtcblx0XHRcdFx0XHRcdHRoaXMuX3N0YXJ0QXQucmVuZGVyKHRpbWUsIHRydWUsIGZvcmNlKTtcblx0XHRcdFx0XHR9IGVsc2UgaWYgKCFjYWxsYmFjaykge1xuXHRcdFx0XHRcdFx0Y2FsbGJhY2sgPSBcIl9kdW1teUdTXCI7IC8vaWYgbm8gY2FsbGJhY2sgaXMgZGVmaW5lZCwgdXNlIGEgZHVtbXkgdmFsdWUganVzdCBzbyB0aGF0IHRoZSBjb25kaXRpb24gYXQgdGhlIGVuZCBldmFsdWF0ZXMgYXMgdHJ1ZSBiZWNhdXNlIF9zdGFydEF0IHNob3VsZCByZW5kZXIgQUZURVIgdGhlIG5vcm1hbCByZW5kZXIgbG9vcCB3aGVuIHRoZSB0aW1lIGlzIG5lZ2F0aXZlLiBXZSBjb3VsZCBoYW5kbGUgdGhpcyBpbiBhIG1vcmUgaW50dWl0aXZlIHdheSwgb2YgY291cnNlLCBidXQgdGhlIHJlbmRlciBsb29wIGlzIHRoZSBNT1NUIGltcG9ydGFudCB0aGluZyB0byBvcHRpbWl6ZSwgc28gdGhpcyB0ZWNobmlxdWUgYWxsb3dzIHVzIHRvIGF2b2lkIGFkZGluZyBleHRyYSBjb25kaXRpb25hbCBsb2dpYyBpbiBhIGhpZ2gtZnJlcXVlbmN5IGFyZWEuXG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdGlmICh0aGlzLnZhcnMub25TdGFydCkgaWYgKHRoaXMuX3RvdGFsVGltZSAhPT0gMCB8fCBkdXJhdGlvbiA9PT0gMCkgaWYgKCFzdXBwcmVzc0V2ZW50cykge1xuXHRcdFx0XHRcdHRoaXMuX2NhbGxiYWNrKFwib25TdGFydFwiKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0XG5cdFx0XHRwdCA9IHRoaXMuX2ZpcnN0UFQ7XG5cdFx0XHR3aGlsZSAocHQpIHtcblx0XHRcdFx0aWYgKHB0LmYpIHtcblx0XHRcdFx0XHRwdC50W3B0LnBdKHB0LmMgKiB0aGlzLnJhdGlvICsgcHQucyk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0cHQudFtwdC5wXSA9IHB0LmMgKiB0aGlzLnJhdGlvICsgcHQucztcblx0XHRcdFx0fVxuXHRcdFx0XHRwdCA9IHB0Ll9uZXh0O1xuXHRcdFx0fVxuXHRcdFx0XG5cdFx0XHRpZiAodGhpcy5fb25VcGRhdGUpIHtcblx0XHRcdFx0aWYgKHRpbWUgPCAwKSBpZiAodGhpcy5fc3RhcnRBdCAmJiB0aGlzLl9zdGFydFRpbWUpIHsgLy9pZiB0aGUgdHdlZW4gaXMgcG9zaXRpb25lZCBhdCB0aGUgVkVSWSBiZWdpbm5pbmcgKF9zdGFydFRpbWUgMCkgb2YgaXRzIHBhcmVudCB0aW1lbGluZSwgaXQncyBpbGxlZ2FsIGZvciB0aGUgcGxheWhlYWQgdG8gZ28gYmFjayBmdXJ0aGVyLCBzbyB3ZSBzaG91bGQgbm90IHJlbmRlciB0aGUgcmVjb3JkZWQgc3RhcnRBdCB2YWx1ZXMuXG5cdFx0XHRcdFx0dGhpcy5fc3RhcnRBdC5yZW5kZXIodGltZSwgdHJ1ZSwgZm9yY2UpOyAvL25vdGU6IGZvciBwZXJmb3JtYW5jZSByZWFzb25zLCB3ZSB0dWNrIHRoaXMgY29uZGl0aW9uYWwgbG9naWMgaW5zaWRlIGxlc3MgdHJhdmVsZWQgYXJlYXMgKG1vc3QgdHdlZW5zIGRvbid0IGhhdmUgYW4gb25VcGRhdGUpLiBXZSdkIGp1c3QgaGF2ZSBpdCBhdCB0aGUgZW5kIGJlZm9yZSB0aGUgb25Db21wbGV0ZSwgYnV0IHRoZSB2YWx1ZXMgc2hvdWxkIGJlIHVwZGF0ZWQgYmVmb3JlIGFueSBvblVwZGF0ZSBpcyBjYWxsZWQsIHNvIHdlIEFMU08gcHV0IGl0IGhlcmUgYW5kIHRoZW4gaWYgaXQncyBub3QgY2FsbGVkLCB3ZSBkbyBzbyBsYXRlciBuZWFyIHRoZSBvbkNvbXBsZXRlLlxuXHRcdFx0XHR9XG5cdFx0XHRcdGlmICghc3VwcHJlc3NFdmVudHMpIGlmICh0aGlzLl90b3RhbFRpbWUgIT09IHByZXZUb3RhbFRpbWUgfHwgY2FsbGJhY2spIHtcblx0XHRcdFx0XHR0aGlzLl9jYWxsYmFjayhcIm9uVXBkYXRlXCIpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRpZiAodGhpcy5fY3ljbGUgIT09IHByZXZDeWNsZSkgaWYgKCFzdXBwcmVzc0V2ZW50cykgaWYgKCF0aGlzLl9nYykgaWYgKHRoaXMudmFycy5vblJlcGVhdCkge1xuXHRcdFx0XHR0aGlzLl9jYWxsYmFjayhcIm9uUmVwZWF0XCIpO1xuXHRcdFx0fVxuXHRcdFx0aWYgKGNhbGxiYWNrKSBpZiAoIXRoaXMuX2djIHx8IGZvcmNlKSB7IC8vY2hlY2sgZ2MgYmVjYXVzZSB0aGVyZSdzIGEgY2hhbmNlIHRoYXQga2lsbCgpIGNvdWxkIGJlIGNhbGxlZCBpbiBhbiBvblVwZGF0ZVxuXHRcdFx0XHRpZiAodGltZSA8IDAgJiYgdGhpcy5fc3RhcnRBdCAmJiAhdGhpcy5fb25VcGRhdGUgJiYgdGhpcy5fc3RhcnRUaW1lKSB7IC8vaWYgdGhlIHR3ZWVuIGlzIHBvc2l0aW9uZWQgYXQgdGhlIFZFUlkgYmVnaW5uaW5nIChfc3RhcnRUaW1lIDApIG9mIGl0cyBwYXJlbnQgdGltZWxpbmUsIGl0J3MgaWxsZWdhbCBmb3IgdGhlIHBsYXloZWFkIHRvIGdvIGJhY2sgZnVydGhlciwgc28gd2Ugc2hvdWxkIG5vdCByZW5kZXIgdGhlIHJlY29yZGVkIHN0YXJ0QXQgdmFsdWVzLlxuXHRcdFx0XHRcdHRoaXMuX3N0YXJ0QXQucmVuZGVyKHRpbWUsIHRydWUsIGZvcmNlKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAoaXNDb21wbGV0ZSkge1xuXHRcdFx0XHRcdGlmICh0aGlzLl90aW1lbGluZS5hdXRvUmVtb3ZlQ2hpbGRyZW4pIHtcblx0XHRcdFx0XHRcdHRoaXMuX2VuYWJsZWQoZmFsc2UsIGZhbHNlKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0dGhpcy5fYWN0aXZlID0gZmFsc2U7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKCFzdXBwcmVzc0V2ZW50cyAmJiB0aGlzLnZhcnNbY2FsbGJhY2tdKSB7XG5cdFx0XHRcdFx0dGhpcy5fY2FsbGJhY2soY2FsbGJhY2spO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmIChkdXJhdGlvbiA9PT0gMCAmJiB0aGlzLl9yYXdQcmV2VGltZSA9PT0gX3RpbnlOdW0gJiYgcmF3UHJldlRpbWUgIT09IF90aW55TnVtKSB7IC8vdGhlIG9uQ29tcGxldGUgb3Igb25SZXZlcnNlQ29tcGxldGUgY291bGQgdHJpZ2dlciBtb3ZlbWVudCBvZiB0aGUgcGxheWhlYWQgYW5kIGZvciB6ZXJvLWR1cmF0aW9uIHR3ZWVucyAod2hpY2ggbXVzdCBkaXNjZXJuIGRpcmVjdGlvbikgdGhhdCBsYW5kIGRpcmVjdGx5IGJhY2sgb24gdGhlaXIgc3RhcnQgdGltZSwgd2UgZG9uJ3Qgd2FudCB0byBmaXJlIGFnYWluIG9uIHRoZSBuZXh0IHJlbmRlci4gVGhpbmsgb2Ygc2V2ZXJhbCBhZGRQYXVzZSgpJ3MgaW4gYSB0aW1lbGluZSB0aGF0IGZvcmNlcyB0aGUgcGxheWhlYWQgdG8gYSBjZXJ0YWluIHNwb3QsIGJ1dCB3aGF0IGlmIGl0J3MgYWxyZWFkeSBwYXVzZWQgYW5kIGFub3RoZXIgdHdlZW4gaXMgdHdlZW5pbmcgdGhlIFwidGltZVwiIG9mIHRoZSB0aW1lbGluZT8gRWFjaCB0aW1lIGl0IG1vdmVzIFtmb3J3YXJkXSBwYXN0IHRoYXQgc3BvdCwgaXQgd291bGQgbW92ZSBiYWNrLCBhbmQgc2luY2Ugc3VwcHJlc3NFdmVudHMgaXMgdHJ1ZSwgaXQnZCByZXNldCBfcmF3UHJldlRpbWUgdG8gX3RpbnlOdW0gc28gdGhhdCB3aGVuIGl0IGJlZ2lucyBhZ2FpbiwgdGhlIGNhbGxiYWNrIHdvdWxkIGZpcmUgKHNvIHVsdGltYXRlbHkgaXQgY291bGQgYm91bmNlIGJhY2sgYW5kIGZvcnRoIGR1cmluZyB0aGF0IHR3ZWVuKS4gQWdhaW4sIHRoaXMgaXMgYSB2ZXJ5IHVuY29tbW9uIHNjZW5hcmlvLCBidXQgcG9zc2libGUgbm9uZXRoZWxlc3MuXG5cdFx0XHRcdFx0dGhpcy5fcmF3UHJldlRpbWUgPSAwO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fTtcblx0XHRcbi8vLS0tLSBTVEFUSUMgRlVOQ1RJT05TIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cdFx0XG5cdFx0VHdlZW5NYXgudG8gPSBmdW5jdGlvbih0YXJnZXQsIGR1cmF0aW9uLCB2YXJzKSB7XG5cdFx0XHRyZXR1cm4gbmV3IFR3ZWVuTWF4KHRhcmdldCwgZHVyYXRpb24sIHZhcnMpO1xuXHRcdH07XG5cdFx0XG5cdFx0VHdlZW5NYXguZnJvbSA9IGZ1bmN0aW9uKHRhcmdldCwgZHVyYXRpb24sIHZhcnMpIHtcblx0XHRcdHZhcnMucnVuQmFja3dhcmRzID0gdHJ1ZTtcblx0XHRcdHZhcnMuaW1tZWRpYXRlUmVuZGVyID0gKHZhcnMuaW1tZWRpYXRlUmVuZGVyICE9IGZhbHNlKTtcblx0XHRcdHJldHVybiBuZXcgVHdlZW5NYXgodGFyZ2V0LCBkdXJhdGlvbiwgdmFycyk7XG5cdFx0fTtcblx0XHRcblx0XHRUd2Vlbk1heC5mcm9tVG8gPSBmdW5jdGlvbih0YXJnZXQsIGR1cmF0aW9uLCBmcm9tVmFycywgdG9WYXJzKSB7XG5cdFx0XHR0b1ZhcnMuc3RhcnRBdCA9IGZyb21WYXJzO1xuXHRcdFx0dG9WYXJzLmltbWVkaWF0ZVJlbmRlciA9ICh0b1ZhcnMuaW1tZWRpYXRlUmVuZGVyICE9IGZhbHNlICYmIGZyb21WYXJzLmltbWVkaWF0ZVJlbmRlciAhPSBmYWxzZSk7XG5cdFx0XHRyZXR1cm4gbmV3IFR3ZWVuTWF4KHRhcmdldCwgZHVyYXRpb24sIHRvVmFycyk7XG5cdFx0fTtcblx0XHRcblx0XHRUd2Vlbk1heC5zdGFnZ2VyVG8gPSBUd2Vlbk1heC5hbGxUbyA9IGZ1bmN0aW9uKHRhcmdldHMsIGR1cmF0aW9uLCB2YXJzLCBzdGFnZ2VyLCBvbkNvbXBsZXRlQWxsLCBvbkNvbXBsZXRlQWxsUGFyYW1zLCBvbkNvbXBsZXRlQWxsU2NvcGUpIHtcblx0XHRcdHN0YWdnZXIgPSBzdGFnZ2VyIHx8IDA7XG5cdFx0XHR2YXIgZGVsYXkgPSAwLFxuXHRcdFx0XHRhID0gW10sXG5cdFx0XHRcdGZpbmFsQ29tcGxldGUgPSBmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRpZiAodmFycy5vbkNvbXBsZXRlKSB7XG5cdFx0XHRcdFx0XHR2YXJzLm9uQ29tcGxldGUuYXBwbHkodmFycy5vbkNvbXBsZXRlU2NvcGUgfHwgdGhpcywgYXJndW1lbnRzKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0b25Db21wbGV0ZUFsbC5hcHBseShvbkNvbXBsZXRlQWxsU2NvcGUgfHwgdmFycy5jYWxsYmFja1Njb3BlIHx8IHRoaXMsIG9uQ29tcGxldGVBbGxQYXJhbXMgfHwgX2JsYW5rQXJyYXkpO1xuXHRcdFx0XHR9LFxuXHRcdFx0XHRjeWNsZSA9IHZhcnMuY3ljbGUsXG5cdFx0XHRcdGZyb21DeWNsZSA9ICh2YXJzLnN0YXJ0QXQgJiYgdmFycy5zdGFydEF0LmN5Y2xlKSxcblx0XHRcdFx0bCwgY29weSwgaSwgcDtcblx0XHRcdGlmICghX2lzQXJyYXkodGFyZ2V0cykpIHtcblx0XHRcdFx0aWYgKHR5cGVvZih0YXJnZXRzKSA9PT0gXCJzdHJpbmdcIikge1xuXHRcdFx0XHRcdHRhcmdldHMgPSBUd2VlbkxpdGUuc2VsZWN0b3IodGFyZ2V0cykgfHwgdGFyZ2V0cztcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAoX2lzU2VsZWN0b3IodGFyZ2V0cykpIHtcblx0XHRcdFx0XHR0YXJnZXRzID0gX3NsaWNlKHRhcmdldHMpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHR0YXJnZXRzID0gdGFyZ2V0cyB8fCBbXTtcblx0XHRcdGlmIChzdGFnZ2VyIDwgMCkge1xuXHRcdFx0XHR0YXJnZXRzID0gX3NsaWNlKHRhcmdldHMpO1xuXHRcdFx0XHR0YXJnZXRzLnJldmVyc2UoKTtcblx0XHRcdFx0c3RhZ2dlciAqPSAtMTtcblx0XHRcdH1cblx0XHRcdGwgPSB0YXJnZXRzLmxlbmd0aCAtIDE7XG5cdFx0XHRmb3IgKGkgPSAwOyBpIDw9IGw7IGkrKykge1xuXHRcdFx0XHRjb3B5ID0ge307XG5cdFx0XHRcdGZvciAocCBpbiB2YXJzKSB7XG5cdFx0XHRcdFx0Y29weVtwXSA9IHZhcnNbcF07XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKGN5Y2xlKSB7XG5cdFx0XHRcdFx0X2FwcGx5Q3ljbGUoY29weSwgdGFyZ2V0cywgaSk7XG5cdFx0XHRcdFx0aWYgKGNvcHkuZHVyYXRpb24gIT0gbnVsbCkge1xuXHRcdFx0XHRcdFx0ZHVyYXRpb24gPSBjb3B5LmR1cmF0aW9uO1xuXHRcdFx0XHRcdFx0ZGVsZXRlIGNvcHkuZHVyYXRpb247XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdGlmIChmcm9tQ3ljbGUpIHtcblx0XHRcdFx0XHRmcm9tQ3ljbGUgPSBjb3B5LnN0YXJ0QXQgPSB7fTtcblx0XHRcdFx0XHRmb3IgKHAgaW4gdmFycy5zdGFydEF0KSB7XG5cdFx0XHRcdFx0XHRmcm9tQ3ljbGVbcF0gPSB2YXJzLnN0YXJ0QXRbcF07XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdF9hcHBseUN5Y2xlKGNvcHkuc3RhcnRBdCwgdGFyZ2V0cywgaSk7XG5cdFx0XHRcdH1cblx0XHRcdFx0Y29weS5kZWxheSA9IGRlbGF5ICsgKGNvcHkuZGVsYXkgfHwgMCk7XG5cdFx0XHRcdGlmIChpID09PSBsICYmIG9uQ29tcGxldGVBbGwpIHtcblx0XHRcdFx0XHRjb3B5Lm9uQ29tcGxldGUgPSBmaW5hbENvbXBsZXRlO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGFbaV0gPSBuZXcgVHdlZW5NYXgodGFyZ2V0c1tpXSwgZHVyYXRpb24sIGNvcHkpO1xuXHRcdFx0XHRkZWxheSArPSBzdGFnZ2VyO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIGE7XG5cdFx0fTtcblx0XHRcblx0XHRUd2Vlbk1heC5zdGFnZ2VyRnJvbSA9IFR3ZWVuTWF4LmFsbEZyb20gPSBmdW5jdGlvbih0YXJnZXRzLCBkdXJhdGlvbiwgdmFycywgc3RhZ2dlciwgb25Db21wbGV0ZUFsbCwgb25Db21wbGV0ZUFsbFBhcmFtcywgb25Db21wbGV0ZUFsbFNjb3BlKSB7XG5cdFx0XHR2YXJzLnJ1bkJhY2t3YXJkcyA9IHRydWU7XG5cdFx0XHR2YXJzLmltbWVkaWF0ZVJlbmRlciA9ICh2YXJzLmltbWVkaWF0ZVJlbmRlciAhPSBmYWxzZSk7XG5cdFx0XHRyZXR1cm4gVHdlZW5NYXguc3RhZ2dlclRvKHRhcmdldHMsIGR1cmF0aW9uLCB2YXJzLCBzdGFnZ2VyLCBvbkNvbXBsZXRlQWxsLCBvbkNvbXBsZXRlQWxsUGFyYW1zLCBvbkNvbXBsZXRlQWxsU2NvcGUpO1xuXHRcdH07XG5cdFx0XG5cdFx0VHdlZW5NYXguc3RhZ2dlckZyb21UbyA9IFR3ZWVuTWF4LmFsbEZyb21UbyA9IGZ1bmN0aW9uKHRhcmdldHMsIGR1cmF0aW9uLCBmcm9tVmFycywgdG9WYXJzLCBzdGFnZ2VyLCBvbkNvbXBsZXRlQWxsLCBvbkNvbXBsZXRlQWxsUGFyYW1zLCBvbkNvbXBsZXRlQWxsU2NvcGUpIHtcblx0XHRcdHRvVmFycy5zdGFydEF0ID0gZnJvbVZhcnM7XG5cdFx0XHR0b1ZhcnMuaW1tZWRpYXRlUmVuZGVyID0gKHRvVmFycy5pbW1lZGlhdGVSZW5kZXIgIT0gZmFsc2UgJiYgZnJvbVZhcnMuaW1tZWRpYXRlUmVuZGVyICE9IGZhbHNlKTtcblx0XHRcdHJldHVybiBUd2Vlbk1heC5zdGFnZ2VyVG8odGFyZ2V0cywgZHVyYXRpb24sIHRvVmFycywgc3RhZ2dlciwgb25Db21wbGV0ZUFsbCwgb25Db21wbGV0ZUFsbFBhcmFtcywgb25Db21wbGV0ZUFsbFNjb3BlKTtcblx0XHR9O1xuXHRcdFx0XHRcblx0XHRUd2Vlbk1heC5kZWxheWVkQ2FsbCA9IGZ1bmN0aW9uKGRlbGF5LCBjYWxsYmFjaywgcGFyYW1zLCBzY29wZSwgdXNlRnJhbWVzKSB7XG5cdFx0XHRyZXR1cm4gbmV3IFR3ZWVuTWF4KGNhbGxiYWNrLCAwLCB7ZGVsYXk6ZGVsYXksIG9uQ29tcGxldGU6Y2FsbGJhY2ssIG9uQ29tcGxldGVQYXJhbXM6cGFyYW1zLCBjYWxsYmFja1Njb3BlOnNjb3BlLCBvblJldmVyc2VDb21wbGV0ZTpjYWxsYmFjaywgb25SZXZlcnNlQ29tcGxldGVQYXJhbXM6cGFyYW1zLCBpbW1lZGlhdGVSZW5kZXI6ZmFsc2UsIHVzZUZyYW1lczp1c2VGcmFtZXMsIG92ZXJ3cml0ZTowfSk7XG5cdFx0fTtcblx0XHRcblx0XHRUd2Vlbk1heC5zZXQgPSBmdW5jdGlvbih0YXJnZXQsIHZhcnMpIHtcblx0XHRcdHJldHVybiBuZXcgVHdlZW5NYXgodGFyZ2V0LCAwLCB2YXJzKTtcblx0XHR9O1xuXHRcdFxuXHRcdFR3ZWVuTWF4LmlzVHdlZW5pbmcgPSBmdW5jdGlvbih0YXJnZXQpIHtcblx0XHRcdHJldHVybiAoVHdlZW5MaXRlLmdldFR3ZWVuc09mKHRhcmdldCwgdHJ1ZSkubGVuZ3RoID4gMCk7XG5cdFx0fTtcblx0XHRcblx0XHR2YXIgX2dldENoaWxkcmVuT2YgPSBmdW5jdGlvbih0aW1lbGluZSwgaW5jbHVkZVRpbWVsaW5lcykge1xuXHRcdFx0XHR2YXIgYSA9IFtdLFxuXHRcdFx0XHRcdGNudCA9IDAsXG5cdFx0XHRcdFx0dHdlZW4gPSB0aW1lbGluZS5fZmlyc3Q7XG5cdFx0XHRcdHdoaWxlICh0d2Vlbikge1xuXHRcdFx0XHRcdGlmICh0d2VlbiBpbnN0YW5jZW9mIFR3ZWVuTGl0ZSkge1xuXHRcdFx0XHRcdFx0YVtjbnQrK10gPSB0d2Vlbjtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0aWYgKGluY2x1ZGVUaW1lbGluZXMpIHtcblx0XHRcdFx0XHRcdFx0YVtjbnQrK10gPSB0d2Vlbjtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdGEgPSBhLmNvbmNhdChfZ2V0Q2hpbGRyZW5PZih0d2VlbiwgaW5jbHVkZVRpbWVsaW5lcykpO1xuXHRcdFx0XHRcdFx0Y250ID0gYS5sZW5ndGg7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHR3ZWVuID0gdHdlZW4uX25leHQ7XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIGE7XG5cdFx0XHR9LCBcblx0XHRcdGdldEFsbFR3ZWVucyA9IFR3ZWVuTWF4LmdldEFsbFR3ZWVucyA9IGZ1bmN0aW9uKGluY2x1ZGVUaW1lbGluZXMpIHtcblx0XHRcdFx0cmV0dXJuIF9nZXRDaGlsZHJlbk9mKEFuaW1hdGlvbi5fcm9vdFRpbWVsaW5lLCBpbmNsdWRlVGltZWxpbmVzKS5jb25jYXQoIF9nZXRDaGlsZHJlbk9mKEFuaW1hdGlvbi5fcm9vdEZyYW1lc1RpbWVsaW5lLCBpbmNsdWRlVGltZWxpbmVzKSApO1xuXHRcdFx0fTtcblx0XHRcblx0XHRUd2Vlbk1heC5raWxsQWxsID0gZnVuY3Rpb24oY29tcGxldGUsIHR3ZWVucywgZGVsYXllZENhbGxzLCB0aW1lbGluZXMpIHtcblx0XHRcdGlmICh0d2VlbnMgPT0gbnVsbCkge1xuXHRcdFx0XHR0d2VlbnMgPSB0cnVlO1xuXHRcdFx0fVxuXHRcdFx0aWYgKGRlbGF5ZWRDYWxscyA9PSBudWxsKSB7XG5cdFx0XHRcdGRlbGF5ZWRDYWxscyA9IHRydWU7XG5cdFx0XHR9XG5cdFx0XHR2YXIgYSA9IGdldEFsbFR3ZWVucygodGltZWxpbmVzICE9IGZhbHNlKSksXG5cdFx0XHRcdGwgPSBhLmxlbmd0aCxcblx0XHRcdFx0YWxsVHJ1ZSA9ICh0d2VlbnMgJiYgZGVsYXllZENhbGxzICYmIHRpbWVsaW5lcyksXG5cdFx0XHRcdGlzREMsIHR3ZWVuLCBpO1xuXHRcdFx0Zm9yIChpID0gMDsgaSA8IGw7IGkrKykge1xuXHRcdFx0XHR0d2VlbiA9IGFbaV07XG5cdFx0XHRcdGlmIChhbGxUcnVlIHx8ICh0d2VlbiBpbnN0YW5jZW9mIFNpbXBsZVRpbWVsaW5lKSB8fCAoKGlzREMgPSAodHdlZW4udGFyZ2V0ID09PSB0d2Vlbi52YXJzLm9uQ29tcGxldGUpKSAmJiBkZWxheWVkQ2FsbHMpIHx8ICh0d2VlbnMgJiYgIWlzREMpKSB7XG5cdFx0XHRcdFx0aWYgKGNvbXBsZXRlKSB7XG5cdFx0XHRcdFx0XHR0d2Vlbi50b3RhbFRpbWUodHdlZW4uX3JldmVyc2VkID8gMCA6IHR3ZWVuLnRvdGFsRHVyYXRpb24oKSk7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdHR3ZWVuLl9lbmFibGVkKGZhbHNlLCBmYWxzZSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fTtcblx0XHRcblx0XHRUd2Vlbk1heC5raWxsQ2hpbGRUd2VlbnNPZiA9IGZ1bmN0aW9uKHBhcmVudCwgY29tcGxldGUpIHtcblx0XHRcdGlmIChwYXJlbnQgPT0gbnVsbCkge1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cdFx0XHR2YXIgdGwgPSBUd2VlbkxpdGVJbnRlcm5hbHMudHdlZW5Mb29rdXAsXG5cdFx0XHRcdGEsIGN1clBhcmVudCwgcCwgaSwgbDtcblx0XHRcdGlmICh0eXBlb2YocGFyZW50KSA9PT0gXCJzdHJpbmdcIikge1xuXHRcdFx0XHRwYXJlbnQgPSBUd2VlbkxpdGUuc2VsZWN0b3IocGFyZW50KSB8fCBwYXJlbnQ7XG5cdFx0XHR9XG5cdFx0XHRpZiAoX2lzU2VsZWN0b3IocGFyZW50KSkge1xuXHRcdFx0XHRwYXJlbnQgPSBfc2xpY2UocGFyZW50KTtcblx0XHRcdH1cblx0XHRcdGlmIChfaXNBcnJheShwYXJlbnQpKSB7XG5cdFx0XHRcdGkgPSBwYXJlbnQubGVuZ3RoO1xuXHRcdFx0XHR3aGlsZSAoLS1pID4gLTEpIHtcblx0XHRcdFx0XHRUd2Vlbk1heC5raWxsQ2hpbGRUd2VlbnNPZihwYXJlbnRbaV0sIGNvbXBsZXRlKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cdFx0XHRhID0gW107XG5cdFx0XHRmb3IgKHAgaW4gdGwpIHtcblx0XHRcdFx0Y3VyUGFyZW50ID0gdGxbcF0udGFyZ2V0LnBhcmVudE5vZGU7XG5cdFx0XHRcdHdoaWxlIChjdXJQYXJlbnQpIHtcblx0XHRcdFx0XHRpZiAoY3VyUGFyZW50ID09PSBwYXJlbnQpIHtcblx0XHRcdFx0XHRcdGEgPSBhLmNvbmNhdCh0bFtwXS50d2VlbnMpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRjdXJQYXJlbnQgPSBjdXJQYXJlbnQucGFyZW50Tm9kZTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0bCA9IGEubGVuZ3RoO1xuXHRcdFx0Zm9yIChpID0gMDsgaSA8IGw7IGkrKykge1xuXHRcdFx0XHRpZiAoY29tcGxldGUpIHtcblx0XHRcdFx0XHRhW2ldLnRvdGFsVGltZShhW2ldLnRvdGFsRHVyYXRpb24oKSk7XG5cdFx0XHRcdH1cblx0XHRcdFx0YVtpXS5fZW5hYmxlZChmYWxzZSwgZmFsc2UpO1xuXHRcdFx0fVxuXHRcdH07XG5cblx0XHR2YXIgX2NoYW5nZVBhdXNlID0gZnVuY3Rpb24ocGF1c2UsIHR3ZWVucywgZGVsYXllZENhbGxzLCB0aW1lbGluZXMpIHtcblx0XHRcdHR3ZWVucyA9ICh0d2VlbnMgIT09IGZhbHNlKTtcblx0XHRcdGRlbGF5ZWRDYWxscyA9IChkZWxheWVkQ2FsbHMgIT09IGZhbHNlKTtcblx0XHRcdHRpbWVsaW5lcyA9ICh0aW1lbGluZXMgIT09IGZhbHNlKTtcblx0XHRcdHZhciBhID0gZ2V0QWxsVHdlZW5zKHRpbWVsaW5lcyksXG5cdFx0XHRcdGFsbFRydWUgPSAodHdlZW5zICYmIGRlbGF5ZWRDYWxscyAmJiB0aW1lbGluZXMpLFxuXHRcdFx0XHRpID0gYS5sZW5ndGgsXG5cdFx0XHRcdGlzREMsIHR3ZWVuO1xuXHRcdFx0d2hpbGUgKC0taSA+IC0xKSB7XG5cdFx0XHRcdHR3ZWVuID0gYVtpXTtcblx0XHRcdFx0aWYgKGFsbFRydWUgfHwgKHR3ZWVuIGluc3RhbmNlb2YgU2ltcGxlVGltZWxpbmUpIHx8ICgoaXNEQyA9ICh0d2Vlbi50YXJnZXQgPT09IHR3ZWVuLnZhcnMub25Db21wbGV0ZSkpICYmIGRlbGF5ZWRDYWxscykgfHwgKHR3ZWVucyAmJiAhaXNEQykpIHtcblx0XHRcdFx0XHR0d2Vlbi5wYXVzZWQocGF1c2UpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fTtcblx0XHRcblx0XHRUd2Vlbk1heC5wYXVzZUFsbCA9IGZ1bmN0aW9uKHR3ZWVucywgZGVsYXllZENhbGxzLCB0aW1lbGluZXMpIHtcblx0XHRcdF9jaGFuZ2VQYXVzZSh0cnVlLCB0d2VlbnMsIGRlbGF5ZWRDYWxscywgdGltZWxpbmVzKTtcblx0XHR9O1xuXHRcdFxuXHRcdFR3ZWVuTWF4LnJlc3VtZUFsbCA9IGZ1bmN0aW9uKHR3ZWVucywgZGVsYXllZENhbGxzLCB0aW1lbGluZXMpIHtcblx0XHRcdF9jaGFuZ2VQYXVzZShmYWxzZSwgdHdlZW5zLCBkZWxheWVkQ2FsbHMsIHRpbWVsaW5lcyk7XG5cdFx0fTtcblxuXHRcdFR3ZWVuTWF4Lmdsb2JhbFRpbWVTY2FsZSA9IGZ1bmN0aW9uKHZhbHVlKSB7XG5cdFx0XHR2YXIgdGwgPSBBbmltYXRpb24uX3Jvb3RUaW1lbGluZSxcblx0XHRcdFx0dCA9IFR3ZWVuTGl0ZS50aWNrZXIudGltZTtcblx0XHRcdGlmICghYXJndW1lbnRzLmxlbmd0aCkge1xuXHRcdFx0XHRyZXR1cm4gdGwuX3RpbWVTY2FsZTtcblx0XHRcdH1cblx0XHRcdHZhbHVlID0gdmFsdWUgfHwgX3RpbnlOdW07IC8vY2FuJ3QgYWxsb3cgemVybyBiZWNhdXNlIGl0J2xsIHRocm93IHRoZSBtYXRoIG9mZlxuXHRcdFx0dGwuX3N0YXJ0VGltZSA9IHQgLSAoKHQgLSB0bC5fc3RhcnRUaW1lKSAqIHRsLl90aW1lU2NhbGUgLyB2YWx1ZSk7XG5cdFx0XHR0bCA9IEFuaW1hdGlvbi5fcm9vdEZyYW1lc1RpbWVsaW5lO1xuXHRcdFx0dCA9IFR3ZWVuTGl0ZS50aWNrZXIuZnJhbWU7XG5cdFx0XHR0bC5fc3RhcnRUaW1lID0gdCAtICgodCAtIHRsLl9zdGFydFRpbWUpICogdGwuX3RpbWVTY2FsZSAvIHZhbHVlKTtcblx0XHRcdHRsLl90aW1lU2NhbGUgPSBBbmltYXRpb24uX3Jvb3RUaW1lbGluZS5fdGltZVNjYWxlID0gdmFsdWU7XG5cdFx0XHRyZXR1cm4gdmFsdWU7XG5cdFx0fTtcblx0XHRcblx0XG4vLy0tLS0gR0VUVEVSUyAvIFNFVFRFUlMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXHRcdFxuXHRcdHAucHJvZ3Jlc3MgPSBmdW5jdGlvbih2YWx1ZSwgc3VwcHJlc3NFdmVudHMpIHtcblx0XHRcdHJldHVybiAoIWFyZ3VtZW50cy5sZW5ndGgpID8gdGhpcy5fdGltZSAvIHRoaXMuZHVyYXRpb24oKSA6IHRoaXMudG90YWxUaW1lKCB0aGlzLmR1cmF0aW9uKCkgKiAoKHRoaXMuX3lveW8gJiYgKHRoaXMuX2N5Y2xlICYgMSkgIT09IDApID8gMSAtIHZhbHVlIDogdmFsdWUpICsgKHRoaXMuX2N5Y2xlICogKHRoaXMuX2R1cmF0aW9uICsgdGhpcy5fcmVwZWF0RGVsYXkpKSwgc3VwcHJlc3NFdmVudHMpO1xuXHRcdH07XG5cdFx0XG5cdFx0cC50b3RhbFByb2dyZXNzID0gZnVuY3Rpb24odmFsdWUsIHN1cHByZXNzRXZlbnRzKSB7XG5cdFx0XHRyZXR1cm4gKCFhcmd1bWVudHMubGVuZ3RoKSA/IHRoaXMuX3RvdGFsVGltZSAvIHRoaXMudG90YWxEdXJhdGlvbigpIDogdGhpcy50b3RhbFRpbWUoIHRoaXMudG90YWxEdXJhdGlvbigpICogdmFsdWUsIHN1cHByZXNzRXZlbnRzKTtcblx0XHR9O1xuXHRcdFxuXHRcdHAudGltZSA9IGZ1bmN0aW9uKHZhbHVlLCBzdXBwcmVzc0V2ZW50cykge1xuXHRcdFx0aWYgKCFhcmd1bWVudHMubGVuZ3RoKSB7XG5cdFx0XHRcdHJldHVybiB0aGlzLl90aW1lO1xuXHRcdFx0fVxuXHRcdFx0aWYgKHRoaXMuX2RpcnR5KSB7XG5cdFx0XHRcdHRoaXMudG90YWxEdXJhdGlvbigpO1xuXHRcdFx0fVxuXHRcdFx0aWYgKHZhbHVlID4gdGhpcy5fZHVyYXRpb24pIHtcblx0XHRcdFx0dmFsdWUgPSB0aGlzLl9kdXJhdGlvbjtcblx0XHRcdH1cblx0XHRcdGlmICh0aGlzLl95b3lvICYmICh0aGlzLl9jeWNsZSAmIDEpICE9PSAwKSB7XG5cdFx0XHRcdHZhbHVlID0gKHRoaXMuX2R1cmF0aW9uIC0gdmFsdWUpICsgKHRoaXMuX2N5Y2xlICogKHRoaXMuX2R1cmF0aW9uICsgdGhpcy5fcmVwZWF0RGVsYXkpKTtcblx0XHRcdH0gZWxzZSBpZiAodGhpcy5fcmVwZWF0ICE9PSAwKSB7XG5cdFx0XHRcdHZhbHVlICs9IHRoaXMuX2N5Y2xlICogKHRoaXMuX2R1cmF0aW9uICsgdGhpcy5fcmVwZWF0RGVsYXkpO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHRoaXMudG90YWxUaW1lKHZhbHVlLCBzdXBwcmVzc0V2ZW50cyk7XG5cdFx0fTtcblxuXHRcdHAuZHVyYXRpb24gPSBmdW5jdGlvbih2YWx1ZSkge1xuXHRcdFx0aWYgKCFhcmd1bWVudHMubGVuZ3RoKSB7XG5cdFx0XHRcdHJldHVybiB0aGlzLl9kdXJhdGlvbjsgLy9kb24ndCBzZXQgX2RpcnR5ID0gZmFsc2UgYmVjYXVzZSB0aGVyZSBjb3VsZCBiZSByZXBlYXRzIHRoYXQgaGF2ZW4ndCBiZWVuIGZhY3RvcmVkIGludG8gdGhlIF90b3RhbER1cmF0aW9uIHlldC4gT3RoZXJ3aXNlLCBpZiB5b3UgY3JlYXRlIGEgcmVwZWF0ZWQgVHdlZW5NYXggYW5kIHRoZW4gaW1tZWRpYXRlbHkgY2hlY2sgaXRzIGR1cmF0aW9uKCksIGl0IHdvdWxkIGNhY2hlIHRoZSB2YWx1ZSBhbmQgdGhlIHRvdGFsRHVyYXRpb24gd291bGQgbm90IGJlIGNvcnJlY3QsIHRodXMgcmVwZWF0cyB3b3VsZG4ndCB0YWtlIGVmZmVjdC5cblx0XHRcdH1cblx0XHRcdHJldHVybiBBbmltYXRpb24ucHJvdG90eXBlLmR1cmF0aW9uLmNhbGwodGhpcywgdmFsdWUpO1xuXHRcdH07XG5cblx0XHRwLnRvdGFsRHVyYXRpb24gPSBmdW5jdGlvbih2YWx1ZSkge1xuXHRcdFx0aWYgKCFhcmd1bWVudHMubGVuZ3RoKSB7XG5cdFx0XHRcdGlmICh0aGlzLl9kaXJ0eSkge1xuXHRcdFx0XHRcdC8vaW5zdGVhZCBvZiBJbmZpbml0eSwgd2UgdXNlIDk5OTk5OTk5OTk5OSBzbyB0aGF0IHdlIGNhbiBhY2NvbW1vZGF0ZSByZXZlcnNlc1xuXHRcdFx0XHRcdHRoaXMuX3RvdGFsRHVyYXRpb24gPSAodGhpcy5fcmVwZWF0ID09PSAtMSkgPyA5OTk5OTk5OTk5OTkgOiB0aGlzLl9kdXJhdGlvbiAqICh0aGlzLl9yZXBlYXQgKyAxKSArICh0aGlzLl9yZXBlYXREZWxheSAqIHRoaXMuX3JlcGVhdCk7XG5cdFx0XHRcdFx0dGhpcy5fZGlydHkgPSBmYWxzZTtcblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gdGhpcy5fdG90YWxEdXJhdGlvbjtcblx0XHRcdH1cblx0XHRcdHJldHVybiAodGhpcy5fcmVwZWF0ID09PSAtMSkgPyB0aGlzIDogdGhpcy5kdXJhdGlvbiggKHZhbHVlIC0gKHRoaXMuX3JlcGVhdCAqIHRoaXMuX3JlcGVhdERlbGF5KSkgLyAodGhpcy5fcmVwZWF0ICsgMSkgKTtcblx0XHR9O1xuXHRcdFxuXHRcdHAucmVwZWF0ID0gZnVuY3Rpb24odmFsdWUpIHtcblx0XHRcdGlmICghYXJndW1lbnRzLmxlbmd0aCkge1xuXHRcdFx0XHRyZXR1cm4gdGhpcy5fcmVwZWF0O1xuXHRcdFx0fVxuXHRcdFx0dGhpcy5fcmVwZWF0ID0gdmFsdWU7XG5cdFx0XHRyZXR1cm4gdGhpcy5fdW5jYWNoZSh0cnVlKTtcblx0XHR9O1xuXHRcdFxuXHRcdHAucmVwZWF0RGVsYXkgPSBmdW5jdGlvbih2YWx1ZSkge1xuXHRcdFx0aWYgKCFhcmd1bWVudHMubGVuZ3RoKSB7XG5cdFx0XHRcdHJldHVybiB0aGlzLl9yZXBlYXREZWxheTtcblx0XHRcdH1cblx0XHRcdHRoaXMuX3JlcGVhdERlbGF5ID0gdmFsdWU7XG5cdFx0XHRyZXR1cm4gdGhpcy5fdW5jYWNoZSh0cnVlKTtcblx0XHR9O1xuXHRcdFxuXHRcdHAueW95byA9IGZ1bmN0aW9uKHZhbHVlKSB7XG5cdFx0XHRpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHtcblx0XHRcdFx0cmV0dXJuIHRoaXMuX3lveW87XG5cdFx0XHR9XG5cdFx0XHR0aGlzLl95b3lvID0gdmFsdWU7XG5cdFx0XHRyZXR1cm4gdGhpcztcblx0XHR9O1xuXHRcdFxuXHRcdFxuXHRcdHJldHVybiBUd2Vlbk1heDtcblx0XHRcblx0fSwgdHJ1ZSk7XG5cblxuXG5cblxuXG5cblxuLypcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIFRpbWVsaW5lTGl0ZVxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICovXG5cdF9nc1Njb3BlLl9nc0RlZmluZShcIlRpbWVsaW5lTGl0ZVwiLCBbXCJjb3JlLkFuaW1hdGlvblwiLFwiY29yZS5TaW1wbGVUaW1lbGluZVwiLFwiVHdlZW5MaXRlXCJdLCBmdW5jdGlvbihBbmltYXRpb24sIFNpbXBsZVRpbWVsaW5lLCBUd2VlbkxpdGUpIHtcblxuXHRcdHZhciBUaW1lbGluZUxpdGUgPSBmdW5jdGlvbih2YXJzKSB7XG5cdFx0XHRcdFNpbXBsZVRpbWVsaW5lLmNhbGwodGhpcywgdmFycyk7XG5cdFx0XHRcdHRoaXMuX2xhYmVscyA9IHt9O1xuXHRcdFx0XHR0aGlzLmF1dG9SZW1vdmVDaGlsZHJlbiA9ICh0aGlzLnZhcnMuYXV0b1JlbW92ZUNoaWxkcmVuID09PSB0cnVlKTtcblx0XHRcdFx0dGhpcy5zbW9vdGhDaGlsZFRpbWluZyA9ICh0aGlzLnZhcnMuc21vb3RoQ2hpbGRUaW1pbmcgPT09IHRydWUpO1xuXHRcdFx0XHR0aGlzLl9zb3J0Q2hpbGRyZW4gPSB0cnVlO1xuXHRcdFx0XHR0aGlzLl9vblVwZGF0ZSA9IHRoaXMudmFycy5vblVwZGF0ZTtcblx0XHRcdFx0dmFyIHYgPSB0aGlzLnZhcnMsXG5cdFx0XHRcdFx0dmFsLCBwO1xuXHRcdFx0XHRmb3IgKHAgaW4gdikge1xuXHRcdFx0XHRcdHZhbCA9IHZbcF07XG5cdFx0XHRcdFx0aWYgKF9pc0FycmF5KHZhbCkpIGlmICh2YWwuam9pbihcIlwiKS5pbmRleE9mKFwie3NlbGZ9XCIpICE9PSAtMSkge1xuXHRcdFx0XHRcdFx0dltwXSA9IHRoaXMuX3N3YXBTZWxmSW5QYXJhbXModmFsKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKF9pc0FycmF5KHYudHdlZW5zKSkge1xuXHRcdFx0XHRcdHRoaXMuYWRkKHYudHdlZW5zLCAwLCB2LmFsaWduLCB2LnN0YWdnZXIpO1xuXHRcdFx0XHR9XG5cdFx0XHR9LFxuXHRcdFx0X3RpbnlOdW0gPSAwLjAwMDAwMDAwMDEsXG5cdFx0XHRUd2VlbkxpdGVJbnRlcm5hbHMgPSBUd2VlbkxpdGUuX2ludGVybmFscyxcblx0XHRcdF9pbnRlcm5hbHMgPSBUaW1lbGluZUxpdGUuX2ludGVybmFscyA9IHt9LFxuXHRcdFx0X2lzU2VsZWN0b3IgPSBUd2VlbkxpdGVJbnRlcm5hbHMuaXNTZWxlY3Rvcixcblx0XHRcdF9pc0FycmF5ID0gVHdlZW5MaXRlSW50ZXJuYWxzLmlzQXJyYXksXG5cdFx0XHRfbGF6eVR3ZWVucyA9IFR3ZWVuTGl0ZUludGVybmFscy5sYXp5VHdlZW5zLFxuXHRcdFx0X2xhenlSZW5kZXIgPSBUd2VlbkxpdGVJbnRlcm5hbHMubGF6eVJlbmRlcixcblx0XHRcdF9nbG9iYWxzID0gX2dzU2NvcGUuX2dzRGVmaW5lLmdsb2JhbHMsXG5cdFx0XHRfY29weSA9IGZ1bmN0aW9uKHZhcnMpIHtcblx0XHRcdFx0dmFyIGNvcHkgPSB7fSwgcDtcblx0XHRcdFx0Zm9yIChwIGluIHZhcnMpIHtcblx0XHRcdFx0XHRjb3B5W3BdID0gdmFyc1twXTtcblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gY29weTtcblx0XHRcdH0sXG5cdFx0XHRfYXBwbHlDeWNsZSA9IGZ1bmN0aW9uKHZhcnMsIHRhcmdldHMsIGkpIHtcblx0XHRcdFx0dmFyIGFsdCA9IHZhcnMuY3ljbGUsXG5cdFx0XHRcdFx0cCwgdmFsO1xuXHRcdFx0XHRmb3IgKHAgaW4gYWx0KSB7XG5cdFx0XHRcdFx0dmFsID0gYWx0W3BdO1xuXHRcdFx0XHRcdHZhcnNbcF0gPSAodHlwZW9mKHZhbCkgPT09IFwiZnVuY3Rpb25cIikgPyB2YWwoaSwgdGFyZ2V0c1tpXSkgOiB2YWxbaSAlIHZhbC5sZW5ndGhdO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGRlbGV0ZSB2YXJzLmN5Y2xlO1xuXHRcdFx0fSxcblx0XHRcdF9wYXVzZUNhbGxiYWNrID0gX2ludGVybmFscy5wYXVzZUNhbGxiYWNrID0gZnVuY3Rpb24oKSB7fSxcblx0XHRcdF9zbGljZSA9IGZ1bmN0aW9uKGEpIHsgLy9kb24ndCB1c2UgW10uc2xpY2UgYmVjYXVzZSB0aGF0IGRvZXNuJ3Qgd29yayBpbiBJRTggd2l0aCBhIE5vZGVMaXN0IHRoYXQncyByZXR1cm5lZCBieSBxdWVyeVNlbGVjdG9yQWxsKClcblx0XHRcdFx0dmFyIGIgPSBbXSxcblx0XHRcdFx0XHRsID0gYS5sZW5ndGgsXG5cdFx0XHRcdFx0aTtcblx0XHRcdFx0Zm9yIChpID0gMDsgaSAhPT0gbDsgYi5wdXNoKGFbaSsrXSkpO1xuXHRcdFx0XHRyZXR1cm4gYjtcblx0XHRcdH0sXG5cdFx0XHRwID0gVGltZWxpbmVMaXRlLnByb3RvdHlwZSA9IG5ldyBTaW1wbGVUaW1lbGluZSgpO1xuXG5cdFx0VGltZWxpbmVMaXRlLnZlcnNpb24gPSBcIjEuMjAuNFwiO1xuXHRcdHAuY29uc3RydWN0b3IgPSBUaW1lbGluZUxpdGU7XG5cdFx0cC5raWxsKCkuX2djID0gcC5fZm9yY2luZ1BsYXloZWFkID0gcC5faGFzUGF1c2UgPSBmYWxzZTtcblxuXHRcdC8qIG1pZ2h0IHVzZSBsYXRlci4uLlxuXHRcdC8vdHJhbnNsYXRlcyBhIGxvY2FsIHRpbWUgaW5zaWRlIGFuIGFuaW1hdGlvbiB0byB0aGUgY29ycmVzcG9uZGluZyB0aW1lIG9uIHRoZSByb290L2dsb2JhbCB0aW1lbGluZSwgZmFjdG9yaW5nIGluIGFsbCBuZXN0aW5nIGFuZCB0aW1lU2NhbGVzLlxuXHRcdGZ1bmN0aW9uIGxvY2FsVG9HbG9iYWwodGltZSwgYW5pbWF0aW9uKSB7XG5cdFx0XHR3aGlsZSAoYW5pbWF0aW9uKSB7XG5cdFx0XHRcdHRpbWUgPSAodGltZSAvIGFuaW1hdGlvbi5fdGltZVNjYWxlKSArIGFuaW1hdGlvbi5fc3RhcnRUaW1lO1xuXHRcdFx0XHRhbmltYXRpb24gPSBhbmltYXRpb24udGltZWxpbmU7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gdGltZTtcblx0XHR9XG5cblx0XHQvL3RyYW5zbGF0ZXMgdGhlIHN1cHBsaWVkIHRpbWUgb24gdGhlIHJvb3QvZ2xvYmFsIHRpbWVsaW5lIGludG8gdGhlIGNvcnJlc3BvbmRpbmcgbG9jYWwgdGltZSBpbnNpZGUgYSBwYXJ0aWN1bGFyIGFuaW1hdGlvbiwgZmFjdG9yaW5nIGluIGFsbCBuZXN0aW5nIGFuZCB0aW1lU2NhbGVzXG5cdFx0ZnVuY3Rpb24gZ2xvYmFsVG9Mb2NhbCh0aW1lLCBhbmltYXRpb24pIHtcblx0XHRcdHZhciBzY2FsZSA9IDE7XG5cdFx0XHR0aW1lIC09IGxvY2FsVG9HbG9iYWwoMCwgYW5pbWF0aW9uKTtcblx0XHRcdHdoaWxlIChhbmltYXRpb24pIHtcblx0XHRcdFx0c2NhbGUgKj0gYW5pbWF0aW9uLl90aW1lU2NhbGU7XG5cdFx0XHRcdGFuaW1hdGlvbiA9IGFuaW1hdGlvbi50aW1lbGluZTtcblx0XHRcdH1cblx0XHRcdHJldHVybiB0aW1lICogc2NhbGU7XG5cdFx0fVxuXHRcdCovXG5cblx0XHRwLnRvID0gZnVuY3Rpb24odGFyZ2V0LCBkdXJhdGlvbiwgdmFycywgcG9zaXRpb24pIHtcblx0XHRcdHZhciBFbmdpbmUgPSAodmFycy5yZXBlYXQgJiYgX2dsb2JhbHMuVHdlZW5NYXgpIHx8IFR3ZWVuTGl0ZTtcblx0XHRcdHJldHVybiBkdXJhdGlvbiA/IHRoaXMuYWRkKCBuZXcgRW5naW5lKHRhcmdldCwgZHVyYXRpb24sIHZhcnMpLCBwb3NpdGlvbikgOiB0aGlzLnNldCh0YXJnZXQsIHZhcnMsIHBvc2l0aW9uKTtcblx0XHR9O1xuXG5cdFx0cC5mcm9tID0gZnVuY3Rpb24odGFyZ2V0LCBkdXJhdGlvbiwgdmFycywgcG9zaXRpb24pIHtcblx0XHRcdHJldHVybiB0aGlzLmFkZCggKCh2YXJzLnJlcGVhdCAmJiBfZ2xvYmFscy5Ud2Vlbk1heCkgfHwgVHdlZW5MaXRlKS5mcm9tKHRhcmdldCwgZHVyYXRpb24sIHZhcnMpLCBwb3NpdGlvbik7XG5cdFx0fTtcblxuXHRcdHAuZnJvbVRvID0gZnVuY3Rpb24odGFyZ2V0LCBkdXJhdGlvbiwgZnJvbVZhcnMsIHRvVmFycywgcG9zaXRpb24pIHtcblx0XHRcdHZhciBFbmdpbmUgPSAodG9WYXJzLnJlcGVhdCAmJiBfZ2xvYmFscy5Ud2Vlbk1heCkgfHwgVHdlZW5MaXRlO1xuXHRcdFx0cmV0dXJuIGR1cmF0aW9uID8gdGhpcy5hZGQoIEVuZ2luZS5mcm9tVG8odGFyZ2V0LCBkdXJhdGlvbiwgZnJvbVZhcnMsIHRvVmFycyksIHBvc2l0aW9uKSA6IHRoaXMuc2V0KHRhcmdldCwgdG9WYXJzLCBwb3NpdGlvbik7XG5cdFx0fTtcblxuXHRcdHAuc3RhZ2dlclRvID0gZnVuY3Rpb24odGFyZ2V0cywgZHVyYXRpb24sIHZhcnMsIHN0YWdnZXIsIHBvc2l0aW9uLCBvbkNvbXBsZXRlQWxsLCBvbkNvbXBsZXRlQWxsUGFyYW1zLCBvbkNvbXBsZXRlQWxsU2NvcGUpIHtcblx0XHRcdHZhciB0bCA9IG5ldyBUaW1lbGluZUxpdGUoe29uQ29tcGxldGU6b25Db21wbGV0ZUFsbCwgb25Db21wbGV0ZVBhcmFtczpvbkNvbXBsZXRlQWxsUGFyYW1zLCBjYWxsYmFja1Njb3BlOm9uQ29tcGxldGVBbGxTY29wZSwgc21vb3RoQ2hpbGRUaW1pbmc6dGhpcy5zbW9vdGhDaGlsZFRpbWluZ30pLFxuXHRcdFx0XHRjeWNsZSA9IHZhcnMuY3ljbGUsXG5cdFx0XHRcdGNvcHksIGk7XG5cdFx0XHRpZiAodHlwZW9mKHRhcmdldHMpID09PSBcInN0cmluZ1wiKSB7XG5cdFx0XHRcdHRhcmdldHMgPSBUd2VlbkxpdGUuc2VsZWN0b3IodGFyZ2V0cykgfHwgdGFyZ2V0cztcblx0XHRcdH1cblx0XHRcdHRhcmdldHMgPSB0YXJnZXRzIHx8IFtdO1xuXHRcdFx0aWYgKF9pc1NlbGVjdG9yKHRhcmdldHMpKSB7IC8vc2Vuc2VzIGlmIHRoZSB0YXJnZXRzIG9iamVjdCBpcyBhIHNlbGVjdG9yLiBJZiBpdCBpcywgd2Ugc2hvdWxkIHRyYW5zbGF0ZSBpdCBpbnRvIGFuIGFycmF5LlxuXHRcdFx0XHR0YXJnZXRzID0gX3NsaWNlKHRhcmdldHMpO1xuXHRcdFx0fVxuXHRcdFx0c3RhZ2dlciA9IHN0YWdnZXIgfHwgMDtcblx0XHRcdGlmIChzdGFnZ2VyIDwgMCkge1xuXHRcdFx0XHR0YXJnZXRzID0gX3NsaWNlKHRhcmdldHMpO1xuXHRcdFx0XHR0YXJnZXRzLnJldmVyc2UoKTtcblx0XHRcdFx0c3RhZ2dlciAqPSAtMTtcblx0XHRcdH1cblx0XHRcdGZvciAoaSA9IDA7IGkgPCB0YXJnZXRzLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRcdGNvcHkgPSBfY29weSh2YXJzKTtcblx0XHRcdFx0aWYgKGNvcHkuc3RhcnRBdCkge1xuXHRcdFx0XHRcdGNvcHkuc3RhcnRBdCA9IF9jb3B5KGNvcHkuc3RhcnRBdCk7XG5cdFx0XHRcdFx0aWYgKGNvcHkuc3RhcnRBdC5jeWNsZSkge1xuXHRcdFx0XHRcdFx0X2FwcGx5Q3ljbGUoY29weS5zdGFydEF0LCB0YXJnZXRzLCBpKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKGN5Y2xlKSB7XG5cdFx0XHRcdFx0X2FwcGx5Q3ljbGUoY29weSwgdGFyZ2V0cywgaSk7XG5cdFx0XHRcdFx0aWYgKGNvcHkuZHVyYXRpb24gIT0gbnVsbCkge1xuXHRcdFx0XHRcdFx0ZHVyYXRpb24gPSBjb3B5LmR1cmF0aW9uO1xuXHRcdFx0XHRcdFx0ZGVsZXRlIGNvcHkuZHVyYXRpb247XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdHRsLnRvKHRhcmdldHNbaV0sIGR1cmF0aW9uLCBjb3B5LCBpICogc3RhZ2dlcik7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gdGhpcy5hZGQodGwsIHBvc2l0aW9uKTtcblx0XHR9O1xuXG5cdFx0cC5zdGFnZ2VyRnJvbSA9IGZ1bmN0aW9uKHRhcmdldHMsIGR1cmF0aW9uLCB2YXJzLCBzdGFnZ2VyLCBwb3NpdGlvbiwgb25Db21wbGV0ZUFsbCwgb25Db21wbGV0ZUFsbFBhcmFtcywgb25Db21wbGV0ZUFsbFNjb3BlKSB7XG5cdFx0XHR2YXJzLmltbWVkaWF0ZVJlbmRlciA9ICh2YXJzLmltbWVkaWF0ZVJlbmRlciAhPSBmYWxzZSk7XG5cdFx0XHR2YXJzLnJ1bkJhY2t3YXJkcyA9IHRydWU7XG5cdFx0XHRyZXR1cm4gdGhpcy5zdGFnZ2VyVG8odGFyZ2V0cywgZHVyYXRpb24sIHZhcnMsIHN0YWdnZXIsIHBvc2l0aW9uLCBvbkNvbXBsZXRlQWxsLCBvbkNvbXBsZXRlQWxsUGFyYW1zLCBvbkNvbXBsZXRlQWxsU2NvcGUpO1xuXHRcdH07XG5cblx0XHRwLnN0YWdnZXJGcm9tVG8gPSBmdW5jdGlvbih0YXJnZXRzLCBkdXJhdGlvbiwgZnJvbVZhcnMsIHRvVmFycywgc3RhZ2dlciwgcG9zaXRpb24sIG9uQ29tcGxldGVBbGwsIG9uQ29tcGxldGVBbGxQYXJhbXMsIG9uQ29tcGxldGVBbGxTY29wZSkge1xuXHRcdFx0dG9WYXJzLnN0YXJ0QXQgPSBmcm9tVmFycztcblx0XHRcdHRvVmFycy5pbW1lZGlhdGVSZW5kZXIgPSAodG9WYXJzLmltbWVkaWF0ZVJlbmRlciAhPSBmYWxzZSAmJiBmcm9tVmFycy5pbW1lZGlhdGVSZW5kZXIgIT0gZmFsc2UpO1xuXHRcdFx0cmV0dXJuIHRoaXMuc3RhZ2dlclRvKHRhcmdldHMsIGR1cmF0aW9uLCB0b1ZhcnMsIHN0YWdnZXIsIHBvc2l0aW9uLCBvbkNvbXBsZXRlQWxsLCBvbkNvbXBsZXRlQWxsUGFyYW1zLCBvbkNvbXBsZXRlQWxsU2NvcGUpO1xuXHRcdH07XG5cblx0XHRwLmNhbGwgPSBmdW5jdGlvbihjYWxsYmFjaywgcGFyYW1zLCBzY29wZSwgcG9zaXRpb24pIHtcblx0XHRcdHJldHVybiB0aGlzLmFkZCggVHdlZW5MaXRlLmRlbGF5ZWRDYWxsKDAsIGNhbGxiYWNrLCBwYXJhbXMsIHNjb3BlKSwgcG9zaXRpb24pO1xuXHRcdH07XG5cblx0XHRwLnNldCA9IGZ1bmN0aW9uKHRhcmdldCwgdmFycywgcG9zaXRpb24pIHtcblx0XHRcdHBvc2l0aW9uID0gdGhpcy5fcGFyc2VUaW1lT3JMYWJlbChwb3NpdGlvbiwgMCwgdHJ1ZSk7XG5cdFx0XHRpZiAodmFycy5pbW1lZGlhdGVSZW5kZXIgPT0gbnVsbCkge1xuXHRcdFx0XHR2YXJzLmltbWVkaWF0ZVJlbmRlciA9IChwb3NpdGlvbiA9PT0gdGhpcy5fdGltZSAmJiAhdGhpcy5fcGF1c2VkKTtcblx0XHRcdH1cblx0XHRcdHJldHVybiB0aGlzLmFkZCggbmV3IFR3ZWVuTGl0ZSh0YXJnZXQsIDAsIHZhcnMpLCBwb3NpdGlvbik7XG5cdFx0fTtcblxuXHRcdFRpbWVsaW5lTGl0ZS5leHBvcnRSb290ID0gZnVuY3Rpb24odmFycywgaWdub3JlRGVsYXllZENhbGxzKSB7XG5cdFx0XHR2YXJzID0gdmFycyB8fCB7fTtcblx0XHRcdGlmICh2YXJzLnNtb290aENoaWxkVGltaW5nID09IG51bGwpIHtcblx0XHRcdFx0dmFycy5zbW9vdGhDaGlsZFRpbWluZyA9IHRydWU7XG5cdFx0XHR9XG5cdFx0XHR2YXIgdGwgPSBuZXcgVGltZWxpbmVMaXRlKHZhcnMpLFxuXHRcdFx0XHRyb290ID0gdGwuX3RpbWVsaW5lLFxuXHRcdFx0XHRoYXNOZWdhdGl2ZVN0YXJ0LCB0aW1lLFx0dHdlZW4sIG5leHQ7XG5cdFx0XHRpZiAoaWdub3JlRGVsYXllZENhbGxzID09IG51bGwpIHtcblx0XHRcdFx0aWdub3JlRGVsYXllZENhbGxzID0gdHJ1ZTtcblx0XHRcdH1cblx0XHRcdHJvb3QuX3JlbW92ZSh0bCwgdHJ1ZSk7XG5cdFx0XHR0bC5fc3RhcnRUaW1lID0gMDtcblx0XHRcdHRsLl9yYXdQcmV2VGltZSA9IHRsLl90aW1lID0gdGwuX3RvdGFsVGltZSA9IHJvb3QuX3RpbWU7XG5cdFx0XHR0d2VlbiA9IHJvb3QuX2ZpcnN0O1xuXHRcdFx0d2hpbGUgKHR3ZWVuKSB7XG5cdFx0XHRcdG5leHQgPSB0d2Vlbi5fbmV4dDtcblx0XHRcdFx0aWYgKCFpZ25vcmVEZWxheWVkQ2FsbHMgfHwgISh0d2VlbiBpbnN0YW5jZW9mIFR3ZWVuTGl0ZSAmJiB0d2Vlbi50YXJnZXQgPT09IHR3ZWVuLnZhcnMub25Db21wbGV0ZSkpIHtcblx0XHRcdFx0XHR0aW1lID0gdHdlZW4uX3N0YXJ0VGltZSAtIHR3ZWVuLl9kZWxheTtcblx0XHRcdFx0XHRpZiAodGltZSA8IDApIHtcblx0XHRcdFx0XHRcdGhhc05lZ2F0aXZlU3RhcnQgPSAxO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHR0bC5hZGQodHdlZW4sIHRpbWUpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHR3ZWVuID0gbmV4dDtcblx0XHRcdH1cblx0XHRcdHJvb3QuYWRkKHRsLCAwKTtcblx0XHRcdGlmIChoYXNOZWdhdGl2ZVN0YXJ0KSB7IC8vY2FsbGluZyB0b3RhbER1cmF0aW9uKCkgd2lsbCBmb3JjZSB0aGUgYWRqdXN0bWVudCBuZWNlc3NhcnkgdG8gc2hpZnQgdGhlIGNoaWxkcmVuIGZvcndhcmQgc28gbm9uZSBvZiB0aGVtIHN0YXJ0IGJlZm9yZSB6ZXJvLCBhbmQgbW92ZXMgdGhlIHRpbWVsaW5lIGJhY2t3YXJkcyB0aGUgc2FtZSBhbW91bnQsIHNvIHRoZSBwbGF5aGVhZCBpcyBzdGlsbCBhbGlnbmVkIHdoZXJlIGl0IHNob3VsZCBiZSBnbG9iYWxseSwgYnV0IHRoZSB0aW1lbGluZSBkb2Vzbid0IGhhdmUgaWxsZWdhbCBjaGlsZHJlbiB0aGF0IHN0YXJ0IGJlZm9yZSB6ZXJvLlxuXHRcdFx0XHR0bC50b3RhbER1cmF0aW9uKCk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gdGw7XG5cdFx0fTtcblxuXHRcdHAuYWRkID0gZnVuY3Rpb24odmFsdWUsIHBvc2l0aW9uLCBhbGlnbiwgc3RhZ2dlcikge1xuXHRcdFx0dmFyIGN1clRpbWUsIGwsIGksIGNoaWxkLCB0bCwgYmVmb3JlUmF3VGltZTtcblx0XHRcdGlmICh0eXBlb2YocG9zaXRpb24pICE9PSBcIm51bWJlclwiKSB7XG5cdFx0XHRcdHBvc2l0aW9uID0gdGhpcy5fcGFyc2VUaW1lT3JMYWJlbChwb3NpdGlvbiwgMCwgdHJ1ZSwgdmFsdWUpO1xuXHRcdFx0fVxuXHRcdFx0aWYgKCEodmFsdWUgaW5zdGFuY2VvZiBBbmltYXRpb24pKSB7XG5cdFx0XHRcdGlmICgodmFsdWUgaW5zdGFuY2VvZiBBcnJheSkgfHwgKHZhbHVlICYmIHZhbHVlLnB1c2ggJiYgX2lzQXJyYXkodmFsdWUpKSkge1xuXHRcdFx0XHRcdGFsaWduID0gYWxpZ24gfHwgXCJub3JtYWxcIjtcblx0XHRcdFx0XHRzdGFnZ2VyID0gc3RhZ2dlciB8fCAwO1xuXHRcdFx0XHRcdGN1clRpbWUgPSBwb3NpdGlvbjtcblx0XHRcdFx0XHRsID0gdmFsdWUubGVuZ3RoO1xuXHRcdFx0XHRcdGZvciAoaSA9IDA7IGkgPCBsOyBpKyspIHtcblx0XHRcdFx0XHRcdGlmIChfaXNBcnJheShjaGlsZCA9IHZhbHVlW2ldKSkge1xuXHRcdFx0XHRcdFx0XHRjaGlsZCA9IG5ldyBUaW1lbGluZUxpdGUoe3R3ZWVuczpjaGlsZH0pO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0dGhpcy5hZGQoY2hpbGQsIGN1clRpbWUpO1xuXHRcdFx0XHRcdFx0aWYgKHR5cGVvZihjaGlsZCkgIT09IFwic3RyaW5nXCIgJiYgdHlwZW9mKGNoaWxkKSAhPT0gXCJmdW5jdGlvblwiKSB7XG5cdFx0XHRcdFx0XHRcdGlmIChhbGlnbiA9PT0gXCJzZXF1ZW5jZVwiKSB7XG5cdFx0XHRcdFx0XHRcdFx0Y3VyVGltZSA9IGNoaWxkLl9zdGFydFRpbWUgKyAoY2hpbGQudG90YWxEdXJhdGlvbigpIC8gY2hpbGQuX3RpbWVTY2FsZSk7XG5cdFx0XHRcdFx0XHRcdH0gZWxzZSBpZiAoYWxpZ24gPT09IFwic3RhcnRcIikge1xuXHRcdFx0XHRcdFx0XHRcdGNoaWxkLl9zdGFydFRpbWUgLT0gY2hpbGQuZGVsYXkoKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0Y3VyVGltZSArPSBzdGFnZ2VyO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRyZXR1cm4gdGhpcy5fdW5jYWNoZSh0cnVlKTtcblx0XHRcdFx0fSBlbHNlIGlmICh0eXBlb2YodmFsdWUpID09PSBcInN0cmluZ1wiKSB7XG5cdFx0XHRcdFx0cmV0dXJuIHRoaXMuYWRkTGFiZWwodmFsdWUsIHBvc2l0aW9uKTtcblx0XHRcdFx0fSBlbHNlIGlmICh0eXBlb2YodmFsdWUpID09PSBcImZ1bmN0aW9uXCIpIHtcblx0XHRcdFx0XHR2YWx1ZSA9IFR3ZWVuTGl0ZS5kZWxheWVkQ2FsbCgwLCB2YWx1ZSk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0dGhyb3coXCJDYW5ub3QgYWRkIFwiICsgdmFsdWUgKyBcIiBpbnRvIHRoZSB0aW1lbGluZTsgaXQgaXMgbm90IGEgdHdlZW4sIHRpbWVsaW5lLCBmdW5jdGlvbiwgb3Igc3RyaW5nLlwiKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRTaW1wbGVUaW1lbGluZS5wcm90b3R5cGUuYWRkLmNhbGwodGhpcywgdmFsdWUsIHBvc2l0aW9uKTtcblxuXHRcdFx0aWYgKHZhbHVlLl90aW1lKSB7IC8vaW4gY2FzZSwgZm9yIGV4YW1wbGUsIHRoZSBfc3RhcnRUaW1lIGlzIG1vdmVkIG9uIGEgdHdlZW4gdGhhdCBoYXMgYWxyZWFkeSByZW5kZXJlZC4gSW1hZ2luZSBpdCdzIGF0IGl0cyBlbmQgc3RhdGUsIHRoZW4gdGhlIHN0YXJ0VGltZSBpcyBtb3ZlZCBXQVkgbGF0ZXIgKGFmdGVyIHRoZSBlbmQgb2YgdGhpcyB0aW1lbGluZSksIGl0IHNob3VsZCByZW5kZXIgYXQgaXRzIGJlZ2lubmluZy5cblx0XHRcdFx0dmFsdWUucmVuZGVyKCh0aGlzLnJhd1RpbWUoKSAtIHZhbHVlLl9zdGFydFRpbWUpICogdmFsdWUuX3RpbWVTY2FsZSwgZmFsc2UsIGZhbHNlKTtcblx0XHRcdH1cblxuXHRcdFx0Ly9pZiB0aGUgdGltZWxpbmUgaGFzIGFscmVhZHkgZW5kZWQgYnV0IHRoZSBpbnNlcnRlZCB0d2Vlbi90aW1lbGluZSBleHRlbmRzIHRoZSBkdXJhdGlvbiwgd2Ugc2hvdWxkIGVuYWJsZSB0aGlzIHRpbWVsaW5lIGFnYWluIHNvIHRoYXQgaXQgcmVuZGVycyBwcm9wZXJseS4gV2Ugc2hvdWxkIGFsc28gYWxpZ24gdGhlIHBsYXloZWFkIHdpdGggdGhlIHBhcmVudCB0aW1lbGluZSdzIHdoZW4gYXBwcm9wcmlhdGUuXG5cdFx0XHRpZiAodGhpcy5fZ2MgfHwgdGhpcy5fdGltZSA9PT0gdGhpcy5fZHVyYXRpb24pIGlmICghdGhpcy5fcGF1c2VkKSBpZiAodGhpcy5fZHVyYXRpb24gPCB0aGlzLmR1cmF0aW9uKCkpIHtcblx0XHRcdFx0Ly9pbiBjYXNlIGFueSBvZiB0aGUgYW5jZXN0b3JzIGhhZCBjb21wbGV0ZWQgYnV0IHNob3VsZCBub3cgYmUgZW5hYmxlZC4uLlxuXHRcdFx0XHR0bCA9IHRoaXM7XG5cdFx0XHRcdGJlZm9yZVJhd1RpbWUgPSAodGwucmF3VGltZSgpID4gdmFsdWUuX3N0YXJ0VGltZSk7IC8vaWYgdGhlIHR3ZWVuIGlzIHBsYWNlZCBvbiB0aGUgdGltZWxpbmUgc28gdGhhdCBpdCBzdGFydHMgQkVGT1JFIHRoZSBjdXJyZW50IHJhd1RpbWUsIHdlIHNob3VsZCBhbGlnbiB0aGUgcGxheWhlYWQgKG1vdmUgdGhlIHRpbWVsaW5lKS4gVGhpcyBpcyBiZWNhdXNlIHNvbWV0aW1lcyB1c2VycyB3aWxsIGNyZWF0ZSBhIHRpbWVsaW5lLCBsZXQgaXQgZmluaXNoLCBhbmQgbXVjaCBsYXRlciBhcHBlbmQgYSB0d2VlbiBhbmQgZXhwZWN0IGl0IHRvIHJ1biBpbnN0ZWFkIG9mIGp1bXBpbmcgdG8gaXRzIGVuZCBzdGF0ZS4gV2hpbGUgdGVjaG5pY2FsbHkgb25lIGNvdWxkIGFyZ3VlIHRoYXQgaXQgc2hvdWxkIGp1bXAgdG8gaXRzIGVuZCBzdGF0ZSwgdGhhdCdzIG5vdCB3aGF0IHVzZXJzIGludHVpdGl2ZWx5IGV4cGVjdC5cblx0XHRcdFx0d2hpbGUgKHRsLl90aW1lbGluZSkge1xuXHRcdFx0XHRcdGlmIChiZWZvcmVSYXdUaW1lICYmIHRsLl90aW1lbGluZS5zbW9vdGhDaGlsZFRpbWluZykge1xuXHRcdFx0XHRcdFx0dGwudG90YWxUaW1lKHRsLl90b3RhbFRpbWUsIHRydWUpOyAvL21vdmVzIHRoZSB0aW1lbGluZSAoc2hpZnRzIGl0cyBzdGFydFRpbWUpIGlmIG5lY2Vzc2FyeSwgYW5kIGFsc28gZW5hYmxlcyBpdC5cblx0XHRcdFx0XHR9IGVsc2UgaWYgKHRsLl9nYykge1xuXHRcdFx0XHRcdFx0dGwuX2VuYWJsZWQodHJ1ZSwgZmFsc2UpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHR0bCA9IHRsLl90aW1lbGluZTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gdGhpcztcblx0XHR9O1xuXG5cdFx0cC5yZW1vdmUgPSBmdW5jdGlvbih2YWx1ZSkge1xuXHRcdFx0aWYgKHZhbHVlIGluc3RhbmNlb2YgQW5pbWF0aW9uKSB7XG5cdFx0XHRcdHRoaXMuX3JlbW92ZSh2YWx1ZSwgZmFsc2UpO1xuXHRcdFx0XHR2YXIgdGwgPSB2YWx1ZS5fdGltZWxpbmUgPSB2YWx1ZS52YXJzLnVzZUZyYW1lcyA/IEFuaW1hdGlvbi5fcm9vdEZyYW1lc1RpbWVsaW5lIDogQW5pbWF0aW9uLl9yb290VGltZWxpbmU7IC8vbm93IHRoYXQgaXQncyByZW1vdmVkLCBkZWZhdWx0IGl0IHRvIHRoZSByb290IHRpbWVsaW5lIHNvIHRoYXQgaWYgaXQgZ2V0cyBwbGF5ZWQgYWdhaW4sIGl0IGRvZXNuJ3QganVtcCBiYWNrIGludG8gdGhpcyB0aW1lbGluZS5cblx0XHRcdFx0dmFsdWUuX3N0YXJ0VGltZSA9ICh2YWx1ZS5fcGF1c2VkID8gdmFsdWUuX3BhdXNlVGltZSA6IHRsLl90aW1lKSAtICgoIXZhbHVlLl9yZXZlcnNlZCA/IHZhbHVlLl90b3RhbFRpbWUgOiB2YWx1ZS50b3RhbER1cmF0aW9uKCkgLSB2YWx1ZS5fdG90YWxUaW1lKSAvIHZhbHVlLl90aW1lU2NhbGUpOyAvL2Vuc3VyZSB0aGF0IGlmIGl0IGdldHMgcGxheWVkIGFnYWluLCB0aGUgdGltaW5nIGlzIGNvcnJlY3QuXG5cdFx0XHRcdHJldHVybiB0aGlzO1xuXHRcdFx0fSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEFycmF5IHx8ICh2YWx1ZSAmJiB2YWx1ZS5wdXNoICYmIF9pc0FycmF5KHZhbHVlKSkpIHtcblx0XHRcdFx0dmFyIGkgPSB2YWx1ZS5sZW5ndGg7XG5cdFx0XHRcdHdoaWxlICgtLWkgPiAtMSkge1xuXHRcdFx0XHRcdHRoaXMucmVtb3ZlKHZhbHVlW2ldKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gdGhpcztcblx0XHRcdH0gZWxzZSBpZiAodHlwZW9mKHZhbHVlKSA9PT0gXCJzdHJpbmdcIikge1xuXHRcdFx0XHRyZXR1cm4gdGhpcy5yZW1vdmVMYWJlbCh2YWx1ZSk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gdGhpcy5raWxsKG51bGwsIHZhbHVlKTtcblx0XHR9O1xuXG5cdFx0cC5fcmVtb3ZlID0gZnVuY3Rpb24odHdlZW4sIHNraXBEaXNhYmxlKSB7XG5cdFx0XHRTaW1wbGVUaW1lbGluZS5wcm90b3R5cGUuX3JlbW92ZS5jYWxsKHRoaXMsIHR3ZWVuLCBza2lwRGlzYWJsZSk7XG5cdFx0XHR2YXIgbGFzdCA9IHRoaXMuX2xhc3Q7XG5cdFx0XHRpZiAoIWxhc3QpIHtcblx0XHRcdFx0dGhpcy5fdGltZSA9IHRoaXMuX3RvdGFsVGltZSA9IHRoaXMuX2R1cmF0aW9uID0gdGhpcy5fdG90YWxEdXJhdGlvbiA9IDA7XG5cdFx0XHR9IGVsc2UgaWYgKHRoaXMuX3RpbWUgPiB0aGlzLmR1cmF0aW9uKCkpIHtcblx0XHRcdFx0dGhpcy5fdGltZSA9IHRoaXMuX2R1cmF0aW9uO1xuXHRcdFx0XHR0aGlzLl90b3RhbFRpbWUgPSB0aGlzLl90b3RhbER1cmF0aW9uO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0fTtcblxuXHRcdHAuYXBwZW5kID0gZnVuY3Rpb24odmFsdWUsIG9mZnNldE9yTGFiZWwpIHtcblx0XHRcdHJldHVybiB0aGlzLmFkZCh2YWx1ZSwgdGhpcy5fcGFyc2VUaW1lT3JMYWJlbChudWxsLCBvZmZzZXRPckxhYmVsLCB0cnVlLCB2YWx1ZSkpO1xuXHRcdH07XG5cblx0XHRwLmluc2VydCA9IHAuaW5zZXJ0TXVsdGlwbGUgPSBmdW5jdGlvbih2YWx1ZSwgcG9zaXRpb24sIGFsaWduLCBzdGFnZ2VyKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5hZGQodmFsdWUsIHBvc2l0aW9uIHx8IDAsIGFsaWduLCBzdGFnZ2VyKTtcblx0XHR9O1xuXG5cdFx0cC5hcHBlbmRNdWx0aXBsZSA9IGZ1bmN0aW9uKHR3ZWVucywgb2Zmc2V0T3JMYWJlbCwgYWxpZ24sIHN0YWdnZXIpIHtcblx0XHRcdHJldHVybiB0aGlzLmFkZCh0d2VlbnMsIHRoaXMuX3BhcnNlVGltZU9yTGFiZWwobnVsbCwgb2Zmc2V0T3JMYWJlbCwgdHJ1ZSwgdHdlZW5zKSwgYWxpZ24sIHN0YWdnZXIpO1xuXHRcdH07XG5cblx0XHRwLmFkZExhYmVsID0gZnVuY3Rpb24obGFiZWwsIHBvc2l0aW9uKSB7XG5cdFx0XHR0aGlzLl9sYWJlbHNbbGFiZWxdID0gdGhpcy5fcGFyc2VUaW1lT3JMYWJlbChwb3NpdGlvbik7XG5cdFx0XHRyZXR1cm4gdGhpcztcblx0XHR9O1xuXG5cdFx0cC5hZGRQYXVzZSA9IGZ1bmN0aW9uKHBvc2l0aW9uLCBjYWxsYmFjaywgcGFyYW1zLCBzY29wZSkge1xuXHRcdFx0dmFyIHQgPSBUd2VlbkxpdGUuZGVsYXllZENhbGwoMCwgX3BhdXNlQ2FsbGJhY2ssIHBhcmFtcywgc2NvcGUgfHwgdGhpcyk7XG5cdFx0XHR0LnZhcnMub25Db21wbGV0ZSA9IHQudmFycy5vblJldmVyc2VDb21wbGV0ZSA9IGNhbGxiYWNrO1xuXHRcdFx0dC5kYXRhID0gXCJpc1BhdXNlXCI7XG5cdFx0XHR0aGlzLl9oYXNQYXVzZSA9IHRydWU7XG5cdFx0XHRyZXR1cm4gdGhpcy5hZGQodCwgcG9zaXRpb24pO1xuXHRcdH07XG5cblx0XHRwLnJlbW92ZUxhYmVsID0gZnVuY3Rpb24obGFiZWwpIHtcblx0XHRcdGRlbGV0ZSB0aGlzLl9sYWJlbHNbbGFiZWxdO1xuXHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0fTtcblxuXHRcdHAuZ2V0TGFiZWxUaW1lID0gZnVuY3Rpb24obGFiZWwpIHtcblx0XHRcdHJldHVybiAodGhpcy5fbGFiZWxzW2xhYmVsXSAhPSBudWxsKSA/IHRoaXMuX2xhYmVsc1tsYWJlbF0gOiAtMTtcblx0XHR9O1xuXG5cdFx0cC5fcGFyc2VUaW1lT3JMYWJlbCA9IGZ1bmN0aW9uKHRpbWVPckxhYmVsLCBvZmZzZXRPckxhYmVsLCBhcHBlbmRJZkFic2VudCwgaWdub3JlKSB7XG5cdFx0XHR2YXIgY2xpcHBlZER1cmF0aW9uLCBpO1xuXHRcdFx0Ly9pZiB3ZSdyZSBhYm91dCB0byBhZGQgYSB0d2Vlbi90aW1lbGluZSAob3IgYW4gYXJyYXkgb2YgdGhlbSkgdGhhdCdzIGFscmVhZHkgYSBjaGlsZCBvZiB0aGlzIHRpbWVsaW5lLCB3ZSBzaG91bGQgcmVtb3ZlIGl0IGZpcnN0IHNvIHRoYXQgaXQgZG9lc24ndCBjb250YW1pbmF0ZSB0aGUgZHVyYXRpb24oKS5cblx0XHRcdGlmIChpZ25vcmUgaW5zdGFuY2VvZiBBbmltYXRpb24gJiYgaWdub3JlLnRpbWVsaW5lID09PSB0aGlzKSB7XG5cdFx0XHRcdHRoaXMucmVtb3ZlKGlnbm9yZSk7XG5cdFx0XHR9IGVsc2UgaWYgKGlnbm9yZSAmJiAoKGlnbm9yZSBpbnN0YW5jZW9mIEFycmF5KSB8fCAoaWdub3JlLnB1c2ggJiYgX2lzQXJyYXkoaWdub3JlKSkpKSB7XG5cdFx0XHRcdGkgPSBpZ25vcmUubGVuZ3RoO1xuXHRcdFx0XHR3aGlsZSAoLS1pID4gLTEpIHtcblx0XHRcdFx0XHRpZiAoaWdub3JlW2ldIGluc3RhbmNlb2YgQW5pbWF0aW9uICYmIGlnbm9yZVtpXS50aW1lbGluZSA9PT0gdGhpcykge1xuXHRcdFx0XHRcdFx0dGhpcy5yZW1vdmUoaWdub3JlW2ldKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdGNsaXBwZWREdXJhdGlvbiA9ICh0eXBlb2YodGltZU9yTGFiZWwpID09PSBcIm51bWJlclwiICYmICFvZmZzZXRPckxhYmVsKSA/IDAgOiAodGhpcy5kdXJhdGlvbigpID4gOTk5OTk5OTk5OTkpID8gdGhpcy5yZWNlbnQoKS5lbmRUaW1lKGZhbHNlKSA6IHRoaXMuX2R1cmF0aW9uOyAvL2luIGNhc2UgdGhlcmUncyBhIGNoaWxkIHRoYXQgaW5maW5pdGVseSByZXBlYXRzLCB1c2VycyBhbG1vc3QgbmV2ZXIgaW50ZW5kIGZvciB0aGUgaW5zZXJ0aW9uIHBvaW50IG9mIGEgbmV3IGNoaWxkIHRvIGJlIGJhc2VkIG9uIGEgU1VQRVIgbG9uZyB2YWx1ZSBsaWtlIHRoYXQgc28gd2UgY2xpcCBpdCBhbmQgYXNzdW1lIHRoZSBtb3N0IHJlY2VudGx5LWFkZGVkIGNoaWxkJ3MgZW5kVGltZSBzaG91bGQgYmUgdXNlZCBpbnN0ZWFkLlxuXHRcdFx0aWYgKHR5cGVvZihvZmZzZXRPckxhYmVsKSA9PT0gXCJzdHJpbmdcIikge1xuXHRcdFx0XHRyZXR1cm4gdGhpcy5fcGFyc2VUaW1lT3JMYWJlbChvZmZzZXRPckxhYmVsLCAoYXBwZW5kSWZBYnNlbnQgJiYgdHlwZW9mKHRpbWVPckxhYmVsKSA9PT0gXCJudW1iZXJcIiAmJiB0aGlzLl9sYWJlbHNbb2Zmc2V0T3JMYWJlbF0gPT0gbnVsbCkgPyB0aW1lT3JMYWJlbCAtIGNsaXBwZWREdXJhdGlvbiA6IDAsIGFwcGVuZElmQWJzZW50KTtcblx0XHRcdH1cblx0XHRcdG9mZnNldE9yTGFiZWwgPSBvZmZzZXRPckxhYmVsIHx8IDA7XG5cdFx0XHRpZiAodHlwZW9mKHRpbWVPckxhYmVsKSA9PT0gXCJzdHJpbmdcIiAmJiAoaXNOYU4odGltZU9yTGFiZWwpIHx8IHRoaXMuX2xhYmVsc1t0aW1lT3JMYWJlbF0gIT0gbnVsbCkpIHsgLy9pZiB0aGUgc3RyaW5nIGlzIGEgbnVtYmVyIGxpa2UgXCIxXCIsIGNoZWNrIHRvIHNlZSBpZiB0aGVyZSdzIGEgbGFiZWwgd2l0aCB0aGF0IG5hbWUsIG90aGVyd2lzZSBpbnRlcnByZXQgaXQgYXMgYSBudW1iZXIgKGFic29sdXRlIHZhbHVlKS5cblx0XHRcdFx0aSA9IHRpbWVPckxhYmVsLmluZGV4T2YoXCI9XCIpO1xuXHRcdFx0XHRpZiAoaSA9PT0gLTEpIHtcblx0XHRcdFx0XHRpZiAodGhpcy5fbGFiZWxzW3RpbWVPckxhYmVsXSA9PSBudWxsKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gYXBwZW5kSWZBYnNlbnQgPyAodGhpcy5fbGFiZWxzW3RpbWVPckxhYmVsXSA9IGNsaXBwZWREdXJhdGlvbiArIG9mZnNldE9yTGFiZWwpIDogb2Zmc2V0T3JMYWJlbDtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0cmV0dXJuIHRoaXMuX2xhYmVsc1t0aW1lT3JMYWJlbF0gKyBvZmZzZXRPckxhYmVsO1xuXHRcdFx0XHR9XG5cdFx0XHRcdG9mZnNldE9yTGFiZWwgPSBwYXJzZUludCh0aW1lT3JMYWJlbC5jaGFyQXQoaS0xKSArIFwiMVwiLCAxMCkgKiBOdW1iZXIodGltZU9yTGFiZWwuc3Vic3RyKGkrMSkpO1xuXHRcdFx0XHR0aW1lT3JMYWJlbCA9IChpID4gMSkgPyB0aGlzLl9wYXJzZVRpbWVPckxhYmVsKHRpbWVPckxhYmVsLnN1YnN0cigwLCBpLTEpLCAwLCBhcHBlbmRJZkFic2VudCkgOiBjbGlwcGVkRHVyYXRpb247XG5cdFx0XHR9IGVsc2UgaWYgKHRpbWVPckxhYmVsID09IG51bGwpIHtcblx0XHRcdFx0dGltZU9yTGFiZWwgPSBjbGlwcGVkRHVyYXRpb247XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gTnVtYmVyKHRpbWVPckxhYmVsKSArIG9mZnNldE9yTGFiZWw7XG5cdFx0fTtcblxuXHRcdHAuc2VlayA9IGZ1bmN0aW9uKHBvc2l0aW9uLCBzdXBwcmVzc0V2ZW50cykge1xuXHRcdFx0cmV0dXJuIHRoaXMudG90YWxUaW1lKCh0eXBlb2YocG9zaXRpb24pID09PSBcIm51bWJlclwiKSA/IHBvc2l0aW9uIDogdGhpcy5fcGFyc2VUaW1lT3JMYWJlbChwb3NpdGlvbiksIChzdXBwcmVzc0V2ZW50cyAhPT0gZmFsc2UpKTtcblx0XHR9O1xuXG5cdFx0cC5zdG9wID0gZnVuY3Rpb24oKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5wYXVzZWQodHJ1ZSk7XG5cdFx0fTtcblxuXHRcdHAuZ290b0FuZFBsYXkgPSBmdW5jdGlvbihwb3NpdGlvbiwgc3VwcHJlc3NFdmVudHMpIHtcblx0XHRcdHJldHVybiB0aGlzLnBsYXkocG9zaXRpb24sIHN1cHByZXNzRXZlbnRzKTtcblx0XHR9O1xuXG5cdFx0cC5nb3RvQW5kU3RvcCA9IGZ1bmN0aW9uKHBvc2l0aW9uLCBzdXBwcmVzc0V2ZW50cykge1xuXHRcdFx0cmV0dXJuIHRoaXMucGF1c2UocG9zaXRpb24sIHN1cHByZXNzRXZlbnRzKTtcblx0XHR9O1xuXG5cdFx0cC5yZW5kZXIgPSBmdW5jdGlvbih0aW1lLCBzdXBwcmVzc0V2ZW50cywgZm9yY2UpIHtcblx0XHRcdGlmICh0aGlzLl9nYykge1xuXHRcdFx0XHR0aGlzLl9lbmFibGVkKHRydWUsIGZhbHNlKTtcblx0XHRcdH1cblx0XHRcdHZhciBwcmV2VGltZSA9IHRoaXMuX3RpbWUsXG5cdFx0XHRcdHRvdGFsRHVyID0gKCF0aGlzLl9kaXJ0eSkgPyB0aGlzLl90b3RhbER1cmF0aW9uIDogdGhpcy50b3RhbER1cmF0aW9uKCksXG5cdFx0XHRcdHByZXZTdGFydCA9IHRoaXMuX3N0YXJ0VGltZSxcblx0XHRcdFx0cHJldlRpbWVTY2FsZSA9IHRoaXMuX3RpbWVTY2FsZSxcblx0XHRcdFx0cHJldlBhdXNlZCA9IHRoaXMuX3BhdXNlZCxcblx0XHRcdFx0dHdlZW4sIGlzQ29tcGxldGUsIG5leHQsIGNhbGxiYWNrLCBpbnRlcm5hbEZvcmNlLCBwYXVzZVR3ZWVuLCBjdXJUaW1lO1xuXHRcdFx0aWYgKHByZXZUaW1lICE9PSB0aGlzLl90aW1lKSB7IC8vaWYgdG90YWxEdXJhdGlvbigpIGZpbmRzIGEgY2hpbGQgd2l0aCBhIG5lZ2F0aXZlIHN0YXJ0VGltZSBhbmQgc21vb3RoQ2hpbGRUaW1pbmcgaXMgdHJ1ZSwgdGhpbmdzIGdldCBzaGlmdGVkIGFyb3VuZCBpbnRlcm5hbGx5IHNvIHdlIG5lZWQgdG8gYWRqdXN0IHRoZSB0aW1lIGFjY29yZGluZ2x5LiBGb3IgZXhhbXBsZSwgaWYgYSB0d2VlbiBzdGFydHMgYXQgLTMwIHdlIG11c3Qgc2hpZnQgRVZFUllUSElORyBmb3J3YXJkIDMwIHNlY29uZHMgYW5kIG1vdmUgdGhpcyB0aW1lbGluZSdzIHN0YXJ0VGltZSBiYWNrd2FyZCBieSAzMCBzZWNvbmRzIHNvIHRoYXQgdGhpbmdzIGFsaWduIHdpdGggdGhlIHBsYXloZWFkIChubyBqdW1wKS5cblx0XHRcdFx0dGltZSArPSB0aGlzLl90aW1lIC0gcHJldlRpbWU7XG5cdFx0XHR9XG5cdFx0XHRpZiAodGltZSA+PSB0b3RhbER1ciAtIDAuMDAwMDAwMSAmJiB0aW1lID49IDApIHsgLy90byB3b3JrIGFyb3VuZCBvY2Nhc2lvbmFsIGZsb2F0aW5nIHBvaW50IG1hdGggYXJ0aWZhY3RzLlxuXHRcdFx0XHR0aGlzLl90b3RhbFRpbWUgPSB0aGlzLl90aW1lID0gdG90YWxEdXI7XG5cdFx0XHRcdGlmICghdGhpcy5fcmV2ZXJzZWQpIGlmICghdGhpcy5faGFzUGF1c2VkQ2hpbGQoKSkge1xuXHRcdFx0XHRcdGlzQ29tcGxldGUgPSB0cnVlO1xuXHRcdFx0XHRcdGNhbGxiYWNrID0gXCJvbkNvbXBsZXRlXCI7XG5cdFx0XHRcdFx0aW50ZXJuYWxGb3JjZSA9ICEhdGhpcy5fdGltZWxpbmUuYXV0b1JlbW92ZUNoaWxkcmVuOyAvL290aGVyd2lzZSwgaWYgdGhlIGFuaW1hdGlvbiBpcyB1bnBhdXNlZC9hY3RpdmF0ZWQgYWZ0ZXIgaXQncyBhbHJlYWR5IGZpbmlzaGVkLCBpdCBkb2Vzbid0IGdldCByZW1vdmVkIGZyb20gdGhlIHBhcmVudCB0aW1lbGluZS5cblx0XHRcdFx0XHRpZiAodGhpcy5fZHVyYXRpb24gPT09IDApIGlmICgodGltZSA8PSAwICYmIHRpbWUgPj0gLTAuMDAwMDAwMSkgfHwgdGhpcy5fcmF3UHJldlRpbWUgPCAwIHx8IHRoaXMuX3Jhd1ByZXZUaW1lID09PSBfdGlueU51bSkgaWYgKHRoaXMuX3Jhd1ByZXZUaW1lICE9PSB0aW1lICYmIHRoaXMuX2ZpcnN0KSB7XG5cdFx0XHRcdFx0XHRpbnRlcm5hbEZvcmNlID0gdHJ1ZTtcblx0XHRcdFx0XHRcdGlmICh0aGlzLl9yYXdQcmV2VGltZSA+IF90aW55TnVtKSB7XG5cdFx0XHRcdFx0XHRcdGNhbGxiYWNrID0gXCJvblJldmVyc2VDb21wbGV0ZVwiO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0XHR0aGlzLl9yYXdQcmV2VGltZSA9ICh0aGlzLl9kdXJhdGlvbiB8fCAhc3VwcHJlc3NFdmVudHMgfHwgdGltZSB8fCB0aGlzLl9yYXdQcmV2VGltZSA9PT0gdGltZSkgPyB0aW1lIDogX3RpbnlOdW07IC8vd2hlbiB0aGUgcGxheWhlYWQgYXJyaXZlcyBhdCBFWEFDVExZIHRpbWUgMCAocmlnaHQgb24gdG9wKSBvZiBhIHplcm8tZHVyYXRpb24gdGltZWxpbmUgb3IgdHdlZW4sIHdlIG5lZWQgdG8gZGlzY2VybiBpZiBldmVudHMgYXJlIHN1cHByZXNzZWQgc28gdGhhdCB3aGVuIHRoZSBwbGF5aGVhZCBtb3ZlcyBhZ2FpbiAobmV4dCB0aW1lKSwgaXQnbGwgdHJpZ2dlciB0aGUgY2FsbGJhY2suIElmIGV2ZW50cyBhcmUgTk9UIHN1cHByZXNzZWQsIG9idmlvdXNseSB0aGUgY2FsbGJhY2sgd291bGQgYmUgdHJpZ2dlcmVkIGluIHRoaXMgcmVuZGVyLiBCYXNpY2FsbHksIHRoZSBjYWxsYmFjayBzaG91bGQgZmlyZSBlaXRoZXIgd2hlbiB0aGUgcGxheWhlYWQgQVJSSVZFUyBvciBMRUFWRVMgdGhpcyBleGFjdCBzcG90LCBub3QgYm90aC4gSW1hZ2luZSBkb2luZyBhIHRpbWVsaW5lLnNlZWsoMCkgYW5kIHRoZXJlJ3MgYSBjYWxsYmFjayB0aGF0IHNpdHMgYXQgMC4gU2luY2UgZXZlbnRzIGFyZSBzdXBwcmVzc2VkIG9uIHRoYXQgc2VlaygpIGJ5IGRlZmF1bHQsIG5vdGhpbmcgd2lsbCBmaXJlLCBidXQgd2hlbiB0aGUgcGxheWhlYWQgbW92ZXMgb2ZmIG9mIHRoYXQgcG9zaXRpb24sIHRoZSBjYWxsYmFjayBzaG91bGQgZmlyZS4gVGhpcyBiZWhhdmlvciBpcyB3aGF0IHBlb3BsZSBpbnR1aXRpdmVseSBleHBlY3QuIFdlIHNldCB0aGUgX3Jhd1ByZXZUaW1lIHRvIGJlIGEgcHJlY2lzZSB0aW55IG51bWJlciB0byBpbmRpY2F0ZSB0aGlzIHNjZW5hcmlvIHJhdGhlciB0aGFuIHVzaW5nIGFub3RoZXIgcHJvcGVydHkvdmFyaWFibGUgd2hpY2ggd291bGQgaW5jcmVhc2UgbWVtb3J5IHVzYWdlLiBUaGlzIHRlY2huaXF1ZSBpcyBsZXNzIHJlYWRhYmxlLCBidXQgbW9yZSBlZmZpY2llbnQuXG5cdFx0XHRcdHRpbWUgPSB0b3RhbER1ciArIDAuMDAwMTsgLy90byBhdm9pZCBvY2Nhc2lvbmFsIGZsb2F0aW5nIHBvaW50IHJvdW5kaW5nIGVycm9ycyAtIHNvbWV0aW1lcyBjaGlsZCB0d2VlbnMvdGltZWxpbmVzIHdlcmUgbm90IGJlaW5nIGZ1bGx5IGNvbXBsZXRlZCAodGhlaXIgcHJvZ3Jlc3MgbWlnaHQgYmUgMC45OTk5OTk5OTk5OTk5OTggaW5zdGVhZCBvZiAxIGJlY2F1c2Ugd2hlbiBfdGltZSAtIHR3ZWVuLl9zdGFydFRpbWUgaXMgcGVyZm9ybWVkLCBmbG9hdGluZyBwb2ludCBlcnJvcnMgd291bGQgcmV0dXJuIGEgdmFsdWUgdGhhdCB3YXMgU0xJR0hUTFkgb2ZmKS4gVHJ5ICg5OTk5OTk5OTk5OTkuNyAtIDk5OTk5OTk5OTk5OSkgKiAxID0gMC42OTk5NTExNzE4NzUgaW5zdGVhZCBvZiAwLjcuXG5cblx0XHRcdH0gZWxzZSBpZiAodGltZSA8IDAuMDAwMDAwMSkgeyAvL3RvIHdvcmsgYXJvdW5kIG9jY2FzaW9uYWwgZmxvYXRpbmcgcG9pbnQgbWF0aCBhcnRpZmFjdHMsIHJvdW5kIHN1cGVyIHNtYWxsIHZhbHVlcyB0byAwLlxuXHRcdFx0XHR0aGlzLl90b3RhbFRpbWUgPSB0aGlzLl90aW1lID0gMDtcblx0XHRcdFx0aWYgKHByZXZUaW1lICE9PSAwIHx8ICh0aGlzLl9kdXJhdGlvbiA9PT0gMCAmJiB0aGlzLl9yYXdQcmV2VGltZSAhPT0gX3RpbnlOdW0gJiYgKHRoaXMuX3Jhd1ByZXZUaW1lID4gMCB8fCAodGltZSA8IDAgJiYgdGhpcy5fcmF3UHJldlRpbWUgPj0gMCkpKSkge1xuXHRcdFx0XHRcdGNhbGxiYWNrID0gXCJvblJldmVyc2VDb21wbGV0ZVwiO1xuXHRcdFx0XHRcdGlzQ29tcGxldGUgPSB0aGlzLl9yZXZlcnNlZDtcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAodGltZSA8IDApIHtcblx0XHRcdFx0XHR0aGlzLl9hY3RpdmUgPSBmYWxzZTtcblx0XHRcdFx0XHRpZiAodGhpcy5fdGltZWxpbmUuYXV0b1JlbW92ZUNoaWxkcmVuICYmIHRoaXMuX3JldmVyc2VkKSB7IC8vZW5zdXJlcyBwcm9wZXIgR0MgaWYgYSB0aW1lbGluZSBpcyByZXN1bWVkIGFmdGVyIGl0J3MgZmluaXNoZWQgcmV2ZXJzaW5nLlxuXHRcdFx0XHRcdFx0aW50ZXJuYWxGb3JjZSA9IGlzQ29tcGxldGUgPSB0cnVlO1xuXHRcdFx0XHRcdFx0Y2FsbGJhY2sgPSBcIm9uUmV2ZXJzZUNvbXBsZXRlXCI7XG5cdFx0XHRcdFx0fSBlbHNlIGlmICh0aGlzLl9yYXdQcmV2VGltZSA+PSAwICYmIHRoaXMuX2ZpcnN0KSB7IC8vd2hlbiBnb2luZyBiYWNrIGJleW9uZCB0aGUgc3RhcnQsIGZvcmNlIGEgcmVuZGVyIHNvIHRoYXQgemVyby1kdXJhdGlvbiB0d2VlbnMgdGhhdCBzaXQgYXQgdGhlIHZlcnkgYmVnaW5uaW5nIHJlbmRlciB0aGVpciBzdGFydCB2YWx1ZXMgcHJvcGVybHkuIE90aGVyd2lzZSwgaWYgdGhlIHBhcmVudCB0aW1lbGluZSdzIHBsYXloZWFkIGxhbmRzIGV4YWN0bHkgYXQgdGhpcyB0aW1lbGluZSdzIHN0YXJ0VGltZSwgYW5kIHRoZW4gbW92ZXMgYmFja3dhcmRzLCB0aGUgemVyby1kdXJhdGlvbiB0d2VlbnMgYXQgdGhlIGJlZ2lubmluZyB3b3VsZCBzdGlsbCBiZSBhdCB0aGVpciBlbmQgc3RhdGUuXG5cdFx0XHRcdFx0XHRpbnRlcm5hbEZvcmNlID0gdHJ1ZTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0dGhpcy5fcmF3UHJldlRpbWUgPSB0aW1lO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHRoaXMuX3Jhd1ByZXZUaW1lID0gKHRoaXMuX2R1cmF0aW9uIHx8ICFzdXBwcmVzc0V2ZW50cyB8fCB0aW1lIHx8IHRoaXMuX3Jhd1ByZXZUaW1lID09PSB0aW1lKSA/IHRpbWUgOiBfdGlueU51bTsgLy93aGVuIHRoZSBwbGF5aGVhZCBhcnJpdmVzIGF0IEVYQUNUTFkgdGltZSAwIChyaWdodCBvbiB0b3ApIG9mIGEgemVyby1kdXJhdGlvbiB0aW1lbGluZSBvciB0d2Vlbiwgd2UgbmVlZCB0byBkaXNjZXJuIGlmIGV2ZW50cyBhcmUgc3VwcHJlc3NlZCBzbyB0aGF0IHdoZW4gdGhlIHBsYXloZWFkIG1vdmVzIGFnYWluIChuZXh0IHRpbWUpLCBpdCdsbCB0cmlnZ2VyIHRoZSBjYWxsYmFjay4gSWYgZXZlbnRzIGFyZSBOT1Qgc3VwcHJlc3NlZCwgb2J2aW91c2x5IHRoZSBjYWxsYmFjayB3b3VsZCBiZSB0cmlnZ2VyZWQgaW4gdGhpcyByZW5kZXIuIEJhc2ljYWxseSwgdGhlIGNhbGxiYWNrIHNob3VsZCBmaXJlIGVpdGhlciB3aGVuIHRoZSBwbGF5aGVhZCBBUlJJVkVTIG9yIExFQVZFUyB0aGlzIGV4YWN0IHNwb3QsIG5vdCBib3RoLiBJbWFnaW5lIGRvaW5nIGEgdGltZWxpbmUuc2VlaygwKSBhbmQgdGhlcmUncyBhIGNhbGxiYWNrIHRoYXQgc2l0cyBhdCAwLiBTaW5jZSBldmVudHMgYXJlIHN1cHByZXNzZWQgb24gdGhhdCBzZWVrKCkgYnkgZGVmYXVsdCwgbm90aGluZyB3aWxsIGZpcmUsIGJ1dCB3aGVuIHRoZSBwbGF5aGVhZCBtb3ZlcyBvZmYgb2YgdGhhdCBwb3NpdGlvbiwgdGhlIGNhbGxiYWNrIHNob3VsZCBmaXJlLiBUaGlzIGJlaGF2aW9yIGlzIHdoYXQgcGVvcGxlIGludHVpdGl2ZWx5IGV4cGVjdC4gV2Ugc2V0IHRoZSBfcmF3UHJldlRpbWUgdG8gYmUgYSBwcmVjaXNlIHRpbnkgbnVtYmVyIHRvIGluZGljYXRlIHRoaXMgc2NlbmFyaW8gcmF0aGVyIHRoYW4gdXNpbmcgYW5vdGhlciBwcm9wZXJ0eS92YXJpYWJsZSB3aGljaCB3b3VsZCBpbmNyZWFzZSBtZW1vcnkgdXNhZ2UuIFRoaXMgdGVjaG5pcXVlIGlzIGxlc3MgcmVhZGFibGUsIGJ1dCBtb3JlIGVmZmljaWVudC5cblx0XHRcdFx0XHRpZiAodGltZSA9PT0gMCAmJiBpc0NvbXBsZXRlKSB7IC8vaWYgdGhlcmUncyBhIHplcm8tZHVyYXRpb24gdHdlZW4gYXQgdGhlIHZlcnkgYmVnaW5uaW5nIG9mIGEgdGltZWxpbmUgYW5kIHRoZSBwbGF5aGVhZCBsYW5kcyBFWEFDVExZIGF0IHRpbWUgMCwgdGhhdCB0d2VlbiB3aWxsIGNvcnJlY3RseSByZW5kZXIgaXRzIGVuZCB2YWx1ZXMsIGJ1dCB3ZSBuZWVkIHRvIGtlZXAgdGhlIHRpbWVsaW5lIGFsaXZlIGZvciBvbmUgbW9yZSByZW5kZXIgc28gdGhhdCB0aGUgYmVnaW5uaW5nIHZhbHVlcyByZW5kZXIgcHJvcGVybHkgYXMgdGhlIHBhcmVudCdzIHBsYXloZWFkIGtlZXBzIG1vdmluZyBiZXlvbmQgdGhlIGJlZ2luaW5nLiBJbWFnaW5lIG9iai54IHN0YXJ0cyBhdCAwIGFuZCB0aGVuIHdlIGRvIHRsLnNldChvYmosIHt4OjEwMH0pLnRvKG9iaiwgMSwge3g6MjAwfSkgYW5kIHRoZW4gbGF0ZXIgd2UgdGwucmV2ZXJzZSgpLi4udGhlIGdvYWwgaXMgdG8gaGF2ZSBvYmoueCByZXZlcnQgdG8gMC4gSWYgdGhlIHBsYXloZWFkIGhhcHBlbnMgdG8gbGFuZCBvbiBleGFjdGx5IDAsIHdpdGhvdXQgdGhpcyBjaHVuayBvZiBjb2RlLCBpdCdkIGNvbXBsZXRlIHRoZSB0aW1lbGluZSBhbmQgcmVtb3ZlIGl0IGZyb20gdGhlIHJlbmRlcmluZyBxdWV1ZSAobm90IGdvb2QpLlxuXHRcdFx0XHRcdFx0dHdlZW4gPSB0aGlzLl9maXJzdDtcblx0XHRcdFx0XHRcdHdoaWxlICh0d2VlbiAmJiB0d2Vlbi5fc3RhcnRUaW1lID09PSAwKSB7XG5cdFx0XHRcdFx0XHRcdGlmICghdHdlZW4uX2R1cmF0aW9uKSB7XG5cdFx0XHRcdFx0XHRcdFx0aXNDb21wbGV0ZSA9IGZhbHNlO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdHR3ZWVuID0gdHdlZW4uX25leHQ7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHRpbWUgPSAwOyAvL3RvIGF2b2lkIG9jY2FzaW9uYWwgZmxvYXRpbmcgcG9pbnQgcm91bmRpbmcgZXJyb3JzIChjb3VsZCBjYXVzZSBwcm9ibGVtcyBlc3BlY2lhbGx5IHdpdGggemVyby1kdXJhdGlvbiB0d2VlbnMgYXQgdGhlIHZlcnkgYmVnaW5uaW5nIG9mIHRoZSB0aW1lbGluZSlcblx0XHRcdFx0XHRpZiAoIXRoaXMuX2luaXR0ZWQpIHtcblx0XHRcdFx0XHRcdGludGVybmFsRm9yY2UgPSB0cnVlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdGlmICh0aGlzLl9oYXNQYXVzZSAmJiAhdGhpcy5fZm9yY2luZ1BsYXloZWFkICYmICFzdXBwcmVzc0V2ZW50cykge1xuXHRcdFx0XHRcdGlmICh0aW1lID49IHByZXZUaW1lKSB7XG5cdFx0XHRcdFx0XHR0d2VlbiA9IHRoaXMuX2ZpcnN0O1xuXHRcdFx0XHRcdFx0d2hpbGUgKHR3ZWVuICYmIHR3ZWVuLl9zdGFydFRpbWUgPD0gdGltZSAmJiAhcGF1c2VUd2Vlbikge1xuXHRcdFx0XHRcdFx0XHRpZiAoIXR3ZWVuLl9kdXJhdGlvbikgaWYgKHR3ZWVuLmRhdGEgPT09IFwiaXNQYXVzZVwiICYmICF0d2Vlbi5yYXRpbyAmJiAhKHR3ZWVuLl9zdGFydFRpbWUgPT09IDAgJiYgdGhpcy5fcmF3UHJldlRpbWUgPT09IDApKSB7XG5cdFx0XHRcdFx0XHRcdFx0cGF1c2VUd2VlbiA9IHR3ZWVuO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdHR3ZWVuID0gdHdlZW4uX25leHQ7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdHR3ZWVuID0gdGhpcy5fbGFzdDtcblx0XHRcdFx0XHRcdHdoaWxlICh0d2VlbiAmJiB0d2Vlbi5fc3RhcnRUaW1lID49IHRpbWUgJiYgIXBhdXNlVHdlZW4pIHtcblx0XHRcdFx0XHRcdFx0aWYgKCF0d2Vlbi5fZHVyYXRpb24pIGlmICh0d2Vlbi5kYXRhID09PSBcImlzUGF1c2VcIiAmJiB0d2Vlbi5fcmF3UHJldlRpbWUgPiAwKSB7XG5cdFx0XHRcdFx0XHRcdFx0cGF1c2VUd2VlbiA9IHR3ZWVuO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdHR3ZWVuID0gdHdlZW4uX3ByZXY7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGlmIChwYXVzZVR3ZWVuKSB7XG5cdFx0XHRcdFx0XHR0aGlzLl90aW1lID0gdGltZSA9IHBhdXNlVHdlZW4uX3N0YXJ0VGltZTtcblx0XHRcdFx0XHRcdHRoaXMuX3RvdGFsVGltZSA9IHRpbWUgKyAodGhpcy5fY3ljbGUgKiAodGhpcy5fdG90YWxEdXJhdGlvbiArIHRoaXMuX3JlcGVhdERlbGF5KSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblx0XHRcdFx0dGhpcy5fdG90YWxUaW1lID0gdGhpcy5fdGltZSA9IHRoaXMuX3Jhd1ByZXZUaW1lID0gdGltZTtcblx0XHRcdH1cblx0XHRcdGlmICgodGhpcy5fdGltZSA9PT0gcHJldlRpbWUgfHwgIXRoaXMuX2ZpcnN0KSAmJiAhZm9yY2UgJiYgIWludGVybmFsRm9yY2UgJiYgIXBhdXNlVHdlZW4pIHtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fSBlbHNlIGlmICghdGhpcy5faW5pdHRlZCkge1xuXHRcdFx0XHR0aGlzLl9pbml0dGVkID0gdHJ1ZTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKCF0aGlzLl9hY3RpdmUpIGlmICghdGhpcy5fcGF1c2VkICYmIHRoaXMuX3RpbWUgIT09IHByZXZUaW1lICYmIHRpbWUgPiAwKSB7XG5cdFx0XHRcdHRoaXMuX2FjdGl2ZSA9IHRydWU7ICAvL3NvIHRoYXQgaWYgdGhlIHVzZXIgcmVuZGVycyB0aGUgdGltZWxpbmUgKGFzIG9wcG9zZWQgdG8gdGhlIHBhcmVudCB0aW1lbGluZSByZW5kZXJpbmcgaXQpLCBpdCBpcyBmb3JjZWQgdG8gcmUtcmVuZGVyIGFuZCBhbGlnbiBpdCB3aXRoIHRoZSBwcm9wZXIgdGltZS9mcmFtZSBvbiB0aGUgbmV4dCByZW5kZXJpbmcgY3ljbGUuIE1heWJlIHRoZSB0aW1lbGluZSBhbHJlYWR5IGZpbmlzaGVkIGJ1dCB0aGUgdXNlciBtYW51YWxseSByZS1yZW5kZXJzIGl0IGFzIGhhbGZ3YXkgZG9uZSwgZm9yIGV4YW1wbGUuXG5cdFx0XHR9XG5cblx0XHRcdGlmIChwcmV2VGltZSA9PT0gMCkgaWYgKHRoaXMudmFycy5vblN0YXJ0KSBpZiAodGhpcy5fdGltZSAhPT0gMCB8fCAhdGhpcy5fZHVyYXRpb24pIGlmICghc3VwcHJlc3NFdmVudHMpIHtcblx0XHRcdFx0dGhpcy5fY2FsbGJhY2soXCJvblN0YXJ0XCIpO1xuXHRcdFx0fVxuXG5cdFx0XHRjdXJUaW1lID0gdGhpcy5fdGltZTtcblx0XHRcdGlmIChjdXJUaW1lID49IHByZXZUaW1lKSB7XG5cdFx0XHRcdHR3ZWVuID0gdGhpcy5fZmlyc3Q7XG5cdFx0XHRcdHdoaWxlICh0d2Vlbikge1xuXHRcdFx0XHRcdG5leHQgPSB0d2Vlbi5fbmV4dDsgLy9yZWNvcmQgaXQgaGVyZSBiZWNhdXNlIHRoZSB2YWx1ZSBjb3VsZCBjaGFuZ2UgYWZ0ZXIgcmVuZGVyaW5nLi4uXG5cdFx0XHRcdFx0aWYgKGN1clRpbWUgIT09IHRoaXMuX3RpbWUgfHwgKHRoaXMuX3BhdXNlZCAmJiAhcHJldlBhdXNlZCkpIHsgLy9pbiBjYXNlIGEgdHdlZW4gcGF1c2VzIG9yIHNlZWtzIHRoZSB0aW1lbGluZSB3aGVuIHJlbmRlcmluZywgbGlrZSBpbnNpZGUgb2YgYW4gb25VcGRhdGUvb25Db21wbGV0ZVxuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0fSBlbHNlIGlmICh0d2Vlbi5fYWN0aXZlIHx8ICh0d2Vlbi5fc3RhcnRUaW1lIDw9IGN1clRpbWUgJiYgIXR3ZWVuLl9wYXVzZWQgJiYgIXR3ZWVuLl9nYykpIHtcblx0XHRcdFx0XHRcdGlmIChwYXVzZVR3ZWVuID09PSB0d2Vlbikge1xuXHRcdFx0XHRcdFx0XHR0aGlzLnBhdXNlKCk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRpZiAoIXR3ZWVuLl9yZXZlcnNlZCkge1xuXHRcdFx0XHRcdFx0XHR0d2Vlbi5yZW5kZXIoKHRpbWUgLSB0d2Vlbi5fc3RhcnRUaW1lKSAqIHR3ZWVuLl90aW1lU2NhbGUsIHN1cHByZXNzRXZlbnRzLCBmb3JjZSk7XG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHR0d2Vlbi5yZW5kZXIoKCghdHdlZW4uX2RpcnR5KSA/IHR3ZWVuLl90b3RhbER1cmF0aW9uIDogdHdlZW4udG90YWxEdXJhdGlvbigpKSAtICgodGltZSAtIHR3ZWVuLl9zdGFydFRpbWUpICogdHdlZW4uX3RpbWVTY2FsZSksIHN1cHByZXNzRXZlbnRzLCBmb3JjZSk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHR3ZWVuID0gbmV4dDtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0dHdlZW4gPSB0aGlzLl9sYXN0O1xuXHRcdFx0XHR3aGlsZSAodHdlZW4pIHtcblx0XHRcdFx0XHRuZXh0ID0gdHdlZW4uX3ByZXY7IC8vcmVjb3JkIGl0IGhlcmUgYmVjYXVzZSB0aGUgdmFsdWUgY291bGQgY2hhbmdlIGFmdGVyIHJlbmRlcmluZy4uLlxuXHRcdFx0XHRcdGlmIChjdXJUaW1lICE9PSB0aGlzLl90aW1lIHx8ICh0aGlzLl9wYXVzZWQgJiYgIXByZXZQYXVzZWQpKSB7IC8vaW4gY2FzZSBhIHR3ZWVuIHBhdXNlcyBvciBzZWVrcyB0aGUgdGltZWxpbmUgd2hlbiByZW5kZXJpbmcsIGxpa2UgaW5zaWRlIG9mIGFuIG9uVXBkYXRlL29uQ29tcGxldGVcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdH0gZWxzZSBpZiAodHdlZW4uX2FjdGl2ZSB8fCAodHdlZW4uX3N0YXJ0VGltZSA8PSBwcmV2VGltZSAmJiAhdHdlZW4uX3BhdXNlZCAmJiAhdHdlZW4uX2djKSkge1xuXHRcdFx0XHRcdFx0aWYgKHBhdXNlVHdlZW4gPT09IHR3ZWVuKSB7XG5cdFx0XHRcdFx0XHRcdHBhdXNlVHdlZW4gPSB0d2Vlbi5fcHJldjsgLy90aGUgbGlua2VkIGxpc3QgaXMgb3JnYW5pemVkIGJ5IF9zdGFydFRpbWUsIHRodXMgaXQncyBwb3NzaWJsZSB0aGF0IGEgdHdlZW4gY291bGQgc3RhcnQgQkVGT1JFIHRoZSBwYXVzZSBhbmQgZW5kIGFmdGVyIGl0LCBpbiB3aGljaCBjYXNlIGl0IHdvdWxkIGJlIHBvc2l0aW9uZWQgYmVmb3JlIHRoZSBwYXVzZSB0d2VlbiBpbiB0aGUgbGlua2VkIGxpc3QsIGJ1dCB3ZSBzaG91bGQgcmVuZGVyIGl0IGJlZm9yZSB3ZSBwYXVzZSgpIHRoZSB0aW1lbGluZSBhbmQgY2Vhc2UgcmVuZGVyaW5nLiBUaGlzIGlzIG9ubHkgYSBjb25jZXJuIHdoZW4gZ29pbmcgaW4gcmV2ZXJzZS5cblx0XHRcdFx0XHRcdFx0d2hpbGUgKHBhdXNlVHdlZW4gJiYgcGF1c2VUd2Vlbi5lbmRUaW1lKCkgPiB0aGlzLl90aW1lKSB7XG5cdFx0XHRcdFx0XHRcdFx0cGF1c2VUd2Vlbi5yZW5kZXIoIChwYXVzZVR3ZWVuLl9yZXZlcnNlZCA/IHBhdXNlVHdlZW4udG90YWxEdXJhdGlvbigpIC0gKCh0aW1lIC0gcGF1c2VUd2Vlbi5fc3RhcnRUaW1lKSAqIHBhdXNlVHdlZW4uX3RpbWVTY2FsZSkgOiAodGltZSAtIHBhdXNlVHdlZW4uX3N0YXJ0VGltZSkgKiBwYXVzZVR3ZWVuLl90aW1lU2NhbGUpLCBzdXBwcmVzc0V2ZW50cywgZm9yY2UpO1xuXHRcdFx0XHRcdFx0XHRcdHBhdXNlVHdlZW4gPSBwYXVzZVR3ZWVuLl9wcmV2O1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdHBhdXNlVHdlZW4gPSBudWxsO1xuXHRcdFx0XHRcdFx0XHR0aGlzLnBhdXNlKCk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRpZiAoIXR3ZWVuLl9yZXZlcnNlZCkge1xuXHRcdFx0XHRcdFx0XHR0d2Vlbi5yZW5kZXIoKHRpbWUgLSB0d2Vlbi5fc3RhcnRUaW1lKSAqIHR3ZWVuLl90aW1lU2NhbGUsIHN1cHByZXNzRXZlbnRzLCBmb3JjZSk7XG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHR0d2Vlbi5yZW5kZXIoKCghdHdlZW4uX2RpcnR5KSA/IHR3ZWVuLl90b3RhbER1cmF0aW9uIDogdHdlZW4udG90YWxEdXJhdGlvbigpKSAtICgodGltZSAtIHR3ZWVuLl9zdGFydFRpbWUpICogdHdlZW4uX3RpbWVTY2FsZSksIHN1cHByZXNzRXZlbnRzLCBmb3JjZSk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHR3ZWVuID0gbmV4dDtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRpZiAodGhpcy5fb25VcGRhdGUpIGlmICghc3VwcHJlc3NFdmVudHMpIHtcblx0XHRcdFx0aWYgKF9sYXp5VHdlZW5zLmxlbmd0aCkgeyAvL2luIGNhc2UgcmVuZGVyaW5nIGNhdXNlZCBhbnkgdHdlZW5zIHRvIGxhenktaW5pdCwgd2Ugc2hvdWxkIHJlbmRlciB0aGVtIGJlY2F1c2UgdHlwaWNhbGx5IHdoZW4gYSB0aW1lbGluZSBmaW5pc2hlcywgdXNlcnMgZXhwZWN0IHRoaW5ncyB0byBoYXZlIHJlbmRlcmVkIGZ1bGx5LiBJbWFnaW5lIGFuIG9uVXBkYXRlIG9uIGEgdGltZWxpbmUgdGhhdCByZXBvcnRzL2NoZWNrcyB0d2VlbmVkIHZhbHVlcy5cblx0XHRcdFx0XHRfbGF6eVJlbmRlcigpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHRoaXMuX2NhbGxiYWNrKFwib25VcGRhdGVcIik7XG5cdFx0XHR9XG5cblx0XHRcdGlmIChjYWxsYmFjaykgaWYgKCF0aGlzLl9nYykgaWYgKHByZXZTdGFydCA9PT0gdGhpcy5fc3RhcnRUaW1lIHx8IHByZXZUaW1lU2NhbGUgIT09IHRoaXMuX3RpbWVTY2FsZSkgaWYgKHRoaXMuX3RpbWUgPT09IDAgfHwgdG90YWxEdXIgPj0gdGhpcy50b3RhbER1cmF0aW9uKCkpIHsgLy9pZiBvbmUgb2YgdGhlIHR3ZWVucyB0aGF0IHdhcyByZW5kZXJlZCBhbHRlcmVkIHRoaXMgdGltZWxpbmUncyBzdGFydFRpbWUgKGxpa2UgaWYgYW4gb25Db21wbGV0ZSByZXZlcnNlZCB0aGUgdGltZWxpbmUpLCBpdCBwcm9iYWJseSBpc24ndCBjb21wbGV0ZS4gSWYgaXQgaXMsIGRvbid0IHdvcnJ5LCBiZWNhdXNlIHdoYXRldmVyIGNhbGwgYWx0ZXJlZCB0aGUgc3RhcnRUaW1lIHdvdWxkIGNvbXBsZXRlIGlmIGl0IHdhcyBuZWNlc3NhcnkgYXQgdGhlIG5ldyB0aW1lLiBUaGUgb25seSBleGNlcHRpb24gaXMgdGhlIHRpbWVTY2FsZSBwcm9wZXJ0eS4gQWxzbyBjaGVjayBfZ2MgYmVjYXVzZSB0aGVyZSdzIGEgY2hhbmNlIHRoYXQga2lsbCgpIGNvdWxkIGJlIGNhbGxlZCBpbiBhbiBvblVwZGF0ZVxuXHRcdFx0XHRpZiAoaXNDb21wbGV0ZSkge1xuXHRcdFx0XHRcdGlmIChfbGF6eVR3ZWVucy5sZW5ndGgpIHsgLy9pbiBjYXNlIHJlbmRlcmluZyBjYXVzZWQgYW55IHR3ZWVucyB0byBsYXp5LWluaXQsIHdlIHNob3VsZCByZW5kZXIgdGhlbSBiZWNhdXNlIHR5cGljYWxseSB3aGVuIGEgdGltZWxpbmUgZmluaXNoZXMsIHVzZXJzIGV4cGVjdCB0aGluZ3MgdG8gaGF2ZSByZW5kZXJlZCBmdWxseS4gSW1hZ2luZSBhbiBvbkNvbXBsZXRlIG9uIGEgdGltZWxpbmUgdGhhdCByZXBvcnRzL2NoZWNrcyB0d2VlbmVkIHZhbHVlcy5cblx0XHRcdFx0XHRcdF9sYXp5UmVuZGVyKCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGlmICh0aGlzLl90aW1lbGluZS5hdXRvUmVtb3ZlQ2hpbGRyZW4pIHtcblx0XHRcdFx0XHRcdHRoaXMuX2VuYWJsZWQoZmFsc2UsIGZhbHNlKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0dGhpcy5fYWN0aXZlID0gZmFsc2U7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKCFzdXBwcmVzc0V2ZW50cyAmJiB0aGlzLnZhcnNbY2FsbGJhY2tdKSB7XG5cdFx0XHRcdFx0dGhpcy5fY2FsbGJhY2soY2FsbGJhY2spO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fTtcblxuXHRcdHAuX2hhc1BhdXNlZENoaWxkID0gZnVuY3Rpb24oKSB7XG5cdFx0XHR2YXIgdHdlZW4gPSB0aGlzLl9maXJzdDtcblx0XHRcdHdoaWxlICh0d2Vlbikge1xuXHRcdFx0XHRpZiAodHdlZW4uX3BhdXNlZCB8fCAoKHR3ZWVuIGluc3RhbmNlb2YgVGltZWxpbmVMaXRlKSAmJiB0d2Vlbi5faGFzUGF1c2VkQ2hpbGQoKSkpIHtcblx0XHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdFx0fVxuXHRcdFx0XHR0d2VlbiA9IHR3ZWVuLl9uZXh0O1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH07XG5cblx0XHRwLmdldENoaWxkcmVuID0gZnVuY3Rpb24obmVzdGVkLCB0d2VlbnMsIHRpbWVsaW5lcywgaWdub3JlQmVmb3JlVGltZSkge1xuXHRcdFx0aWdub3JlQmVmb3JlVGltZSA9IGlnbm9yZUJlZm9yZVRpbWUgfHwgLTk5OTk5OTk5OTk7XG5cdFx0XHR2YXIgYSA9IFtdLFxuXHRcdFx0XHR0d2VlbiA9IHRoaXMuX2ZpcnN0LFxuXHRcdFx0XHRjbnQgPSAwO1xuXHRcdFx0d2hpbGUgKHR3ZWVuKSB7XG5cdFx0XHRcdGlmICh0d2Vlbi5fc3RhcnRUaW1lIDwgaWdub3JlQmVmb3JlVGltZSkge1xuXHRcdFx0XHRcdC8vZG8gbm90aGluZ1xuXHRcdFx0XHR9IGVsc2UgaWYgKHR3ZWVuIGluc3RhbmNlb2YgVHdlZW5MaXRlKSB7XG5cdFx0XHRcdFx0aWYgKHR3ZWVucyAhPT0gZmFsc2UpIHtcblx0XHRcdFx0XHRcdGFbY250KytdID0gdHdlZW47XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGlmICh0aW1lbGluZXMgIT09IGZhbHNlKSB7XG5cdFx0XHRcdFx0XHRhW2NudCsrXSA9IHR3ZWVuO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRpZiAobmVzdGVkICE9PSBmYWxzZSkge1xuXHRcdFx0XHRcdFx0YSA9IGEuY29uY2F0KHR3ZWVuLmdldENoaWxkcmVuKHRydWUsIHR3ZWVucywgdGltZWxpbmVzKSk7XG5cdFx0XHRcdFx0XHRjbnQgPSBhLmxlbmd0aDtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0dHdlZW4gPSB0d2Vlbi5fbmV4dDtcblx0XHRcdH1cblx0XHRcdHJldHVybiBhO1xuXHRcdH07XG5cblx0XHRwLmdldFR3ZWVuc09mID0gZnVuY3Rpb24odGFyZ2V0LCBuZXN0ZWQpIHtcblx0XHRcdHZhciBkaXNhYmxlZCA9IHRoaXMuX2djLFxuXHRcdFx0XHRhID0gW10sXG5cdFx0XHRcdGNudCA9IDAsXG5cdFx0XHRcdHR3ZWVucywgaTtcblx0XHRcdGlmIChkaXNhYmxlZCkge1xuXHRcdFx0XHR0aGlzLl9lbmFibGVkKHRydWUsIHRydWUpOyAvL2dldFR3ZWVuc09mKCkgZmlsdGVycyBvdXQgZGlzYWJsZWQgdHdlZW5zLCBhbmQgd2UgaGF2ZSB0byBtYXJrIHRoZW0gYXMgX2djID0gdHJ1ZSB3aGVuIHRoZSB0aW1lbGluZSBjb21wbGV0ZXMgaW4gb3JkZXIgdG8gYWxsb3cgY2xlYW4gZ2FyYmFnZSBjb2xsZWN0aW9uLCBzbyB0ZW1wb3JhcmlseSByZS1lbmFibGUgdGhlIHRpbWVsaW5lIGhlcmUuXG5cdFx0XHR9XG5cdFx0XHR0d2VlbnMgPSBUd2VlbkxpdGUuZ2V0VHdlZW5zT2YodGFyZ2V0KTtcblx0XHRcdGkgPSB0d2VlbnMubGVuZ3RoO1xuXHRcdFx0d2hpbGUgKC0taSA+IC0xKSB7XG5cdFx0XHRcdGlmICh0d2VlbnNbaV0udGltZWxpbmUgPT09IHRoaXMgfHwgKG5lc3RlZCAmJiB0aGlzLl9jb250YWlucyh0d2VlbnNbaV0pKSkge1xuXHRcdFx0XHRcdGFbY250KytdID0gdHdlZW5zW2ldO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRpZiAoZGlzYWJsZWQpIHtcblx0XHRcdFx0dGhpcy5fZW5hYmxlZChmYWxzZSwgdHJ1ZSk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gYTtcblx0XHR9O1xuXG5cdFx0cC5yZWNlbnQgPSBmdW5jdGlvbigpIHtcblx0XHRcdHJldHVybiB0aGlzLl9yZWNlbnQ7XG5cdFx0fTtcblxuXHRcdHAuX2NvbnRhaW5zID0gZnVuY3Rpb24odHdlZW4pIHtcblx0XHRcdHZhciB0bCA9IHR3ZWVuLnRpbWVsaW5lO1xuXHRcdFx0d2hpbGUgKHRsKSB7XG5cdFx0XHRcdGlmICh0bCA9PT0gdGhpcykge1xuXHRcdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHRsID0gdGwudGltZWxpbmU7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fTtcblxuXHRcdHAuc2hpZnRDaGlsZHJlbiA9IGZ1bmN0aW9uKGFtb3VudCwgYWRqdXN0TGFiZWxzLCBpZ25vcmVCZWZvcmVUaW1lKSB7XG5cdFx0XHRpZ25vcmVCZWZvcmVUaW1lID0gaWdub3JlQmVmb3JlVGltZSB8fCAwO1xuXHRcdFx0dmFyIHR3ZWVuID0gdGhpcy5fZmlyc3QsXG5cdFx0XHRcdGxhYmVscyA9IHRoaXMuX2xhYmVscyxcblx0XHRcdFx0cDtcblx0XHRcdHdoaWxlICh0d2Vlbikge1xuXHRcdFx0XHRpZiAodHdlZW4uX3N0YXJ0VGltZSA+PSBpZ25vcmVCZWZvcmVUaW1lKSB7XG5cdFx0XHRcdFx0dHdlZW4uX3N0YXJ0VGltZSArPSBhbW91bnQ7XG5cdFx0XHRcdH1cblx0XHRcdFx0dHdlZW4gPSB0d2Vlbi5fbmV4dDtcblx0XHRcdH1cblx0XHRcdGlmIChhZGp1c3RMYWJlbHMpIHtcblx0XHRcdFx0Zm9yIChwIGluIGxhYmVscykge1xuXHRcdFx0XHRcdGlmIChsYWJlbHNbcF0gPj0gaWdub3JlQmVmb3JlVGltZSkge1xuXHRcdFx0XHRcdFx0bGFiZWxzW3BdICs9IGFtb3VudDtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdHJldHVybiB0aGlzLl91bmNhY2hlKHRydWUpO1xuXHRcdH07XG5cblx0XHRwLl9raWxsID0gZnVuY3Rpb24odmFycywgdGFyZ2V0KSB7XG5cdFx0XHRpZiAoIXZhcnMgJiYgIXRhcmdldCkge1xuXHRcdFx0XHRyZXR1cm4gdGhpcy5fZW5hYmxlZChmYWxzZSwgZmFsc2UpO1xuXHRcdFx0fVxuXHRcdFx0dmFyIHR3ZWVucyA9ICghdGFyZ2V0KSA/IHRoaXMuZ2V0Q2hpbGRyZW4odHJ1ZSwgdHJ1ZSwgZmFsc2UpIDogdGhpcy5nZXRUd2VlbnNPZih0YXJnZXQpLFxuXHRcdFx0XHRpID0gdHdlZW5zLmxlbmd0aCxcblx0XHRcdFx0Y2hhbmdlZCA9IGZhbHNlO1xuXHRcdFx0d2hpbGUgKC0taSA+IC0xKSB7XG5cdFx0XHRcdGlmICh0d2VlbnNbaV0uX2tpbGwodmFycywgdGFyZ2V0KSkge1xuXHRcdFx0XHRcdGNoYW5nZWQgPSB0cnVlO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gY2hhbmdlZDtcblx0XHR9O1xuXG5cdFx0cC5jbGVhciA9IGZ1bmN0aW9uKGxhYmVscykge1xuXHRcdFx0dmFyIHR3ZWVucyA9IHRoaXMuZ2V0Q2hpbGRyZW4oZmFsc2UsIHRydWUsIHRydWUpLFxuXHRcdFx0XHRpID0gdHdlZW5zLmxlbmd0aDtcblx0XHRcdHRoaXMuX3RpbWUgPSB0aGlzLl90b3RhbFRpbWUgPSAwO1xuXHRcdFx0d2hpbGUgKC0taSA+IC0xKSB7XG5cdFx0XHRcdHR3ZWVuc1tpXS5fZW5hYmxlZChmYWxzZSwgZmFsc2UpO1xuXHRcdFx0fVxuXHRcdFx0aWYgKGxhYmVscyAhPT0gZmFsc2UpIHtcblx0XHRcdFx0dGhpcy5fbGFiZWxzID0ge307XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gdGhpcy5fdW5jYWNoZSh0cnVlKTtcblx0XHR9O1xuXG5cdFx0cC5pbnZhbGlkYXRlID0gZnVuY3Rpb24oKSB7XG5cdFx0XHR2YXIgdHdlZW4gPSB0aGlzLl9maXJzdDtcblx0XHRcdHdoaWxlICh0d2Vlbikge1xuXHRcdFx0XHR0d2Vlbi5pbnZhbGlkYXRlKCk7XG5cdFx0XHRcdHR3ZWVuID0gdHdlZW4uX25leHQ7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gQW5pbWF0aW9uLnByb3RvdHlwZS5pbnZhbGlkYXRlLmNhbGwodGhpcyk7O1xuXHRcdH07XG5cblx0XHRwLl9lbmFibGVkID0gZnVuY3Rpb24oZW5hYmxlZCwgaWdub3JlVGltZWxpbmUpIHtcblx0XHRcdGlmIChlbmFibGVkID09PSB0aGlzLl9nYykge1xuXHRcdFx0XHR2YXIgdHdlZW4gPSB0aGlzLl9maXJzdDtcblx0XHRcdFx0d2hpbGUgKHR3ZWVuKSB7XG5cdFx0XHRcdFx0dHdlZW4uX2VuYWJsZWQoZW5hYmxlZCwgdHJ1ZSk7XG5cdFx0XHRcdFx0dHdlZW4gPSB0d2Vlbi5fbmV4dDtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIFNpbXBsZVRpbWVsaW5lLnByb3RvdHlwZS5fZW5hYmxlZC5jYWxsKHRoaXMsIGVuYWJsZWQsIGlnbm9yZVRpbWVsaW5lKTtcblx0XHR9O1xuXG5cdFx0cC50b3RhbFRpbWUgPSBmdW5jdGlvbih0aW1lLCBzdXBwcmVzc0V2ZW50cywgdW5jYXBwZWQpIHtcblx0XHRcdHRoaXMuX2ZvcmNpbmdQbGF5aGVhZCA9IHRydWU7XG5cdFx0XHR2YXIgdmFsID0gQW5pbWF0aW9uLnByb3RvdHlwZS50b3RhbFRpbWUuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcblx0XHRcdHRoaXMuX2ZvcmNpbmdQbGF5aGVhZCA9IGZhbHNlO1xuXHRcdFx0cmV0dXJuIHZhbDtcblx0XHR9O1xuXG5cdFx0cC5kdXJhdGlvbiA9IGZ1bmN0aW9uKHZhbHVlKSB7XG5cdFx0XHRpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHtcblx0XHRcdFx0aWYgKHRoaXMuX2RpcnR5KSB7XG5cdFx0XHRcdFx0dGhpcy50b3RhbER1cmF0aW9uKCk7IC8vanVzdCB0cmlnZ2VycyByZWNhbGN1bGF0aW9uXG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIHRoaXMuX2R1cmF0aW9uO1xuXHRcdFx0fVxuXHRcdFx0aWYgKHRoaXMuZHVyYXRpb24oKSAhPT0gMCAmJiB2YWx1ZSAhPT0gMCkge1xuXHRcdFx0XHR0aGlzLnRpbWVTY2FsZSh0aGlzLl9kdXJhdGlvbiAvIHZhbHVlKTtcblx0XHRcdH1cblx0XHRcdHJldHVybiB0aGlzO1xuXHRcdH07XG5cblx0XHRwLnRvdGFsRHVyYXRpb24gPSBmdW5jdGlvbih2YWx1ZSkge1xuXHRcdFx0aWYgKCFhcmd1bWVudHMubGVuZ3RoKSB7XG5cdFx0XHRcdGlmICh0aGlzLl9kaXJ0eSkge1xuXHRcdFx0XHRcdHZhciBtYXggPSAwLFxuXHRcdFx0XHRcdFx0dHdlZW4gPSB0aGlzLl9sYXN0LFxuXHRcdFx0XHRcdFx0cHJldlN0YXJ0ID0gOTk5OTk5OTk5OTk5LFxuXHRcdFx0XHRcdFx0cHJldiwgZW5kO1xuXHRcdFx0XHRcdHdoaWxlICh0d2Vlbikge1xuXHRcdFx0XHRcdFx0cHJldiA9IHR3ZWVuLl9wcmV2OyAvL3JlY29yZCBpdCBoZXJlIGluIGNhc2UgdGhlIHR3ZWVuIGNoYW5nZXMgcG9zaXRpb24gaW4gdGhlIHNlcXVlbmNlLi4uXG5cdFx0XHRcdFx0XHRpZiAodHdlZW4uX2RpcnR5KSB7XG5cdFx0XHRcdFx0XHRcdHR3ZWVuLnRvdGFsRHVyYXRpb24oKTsgLy9jb3VsZCBjaGFuZ2UgdGhlIHR3ZWVuLl9zdGFydFRpbWUsIHNvIG1ha2Ugc3VyZSB0aGUgdHdlZW4ncyBjYWNoZSBpcyBjbGVhbiBiZWZvcmUgYW5hbHl6aW5nIGl0LlxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0aWYgKHR3ZWVuLl9zdGFydFRpbWUgPiBwcmV2U3RhcnQgJiYgdGhpcy5fc29ydENoaWxkcmVuICYmICF0d2Vlbi5fcGF1c2VkICYmICF0aGlzLl9jYWxjdWxhdGluZ0R1cmF0aW9uKSB7IC8vaW4gY2FzZSBvbmUgb2YgdGhlIHR3ZWVucyBzaGlmdGVkIG91dCBvZiBvcmRlciwgaXQgbmVlZHMgdG8gYmUgcmUtaW5zZXJ0ZWQgaW50byB0aGUgY29ycmVjdCBwb3NpdGlvbiBpbiB0aGUgc2VxdWVuY2Vcblx0XHRcdFx0XHRcdFx0dGhpcy5fY2FsY3VsYXRpbmdEdXJhdGlvbiA9IDE7IC8vcHJldmVudCBlbmRsZXNzIHJlY3Vyc2l2ZSBjYWxscyAtIHRoZXJlIGFyZSBtZXRob2RzIHRoYXQgZ2V0IHRyaWdnZXJlZCB0aGF0IGNoZWNrIGR1cmF0aW9uL3RvdGFsRHVyYXRpb24gd2hlbiB3ZSBhZGQoKSwgbGlrZSBfcGFyc2VUaW1lT3JMYWJlbCgpLlxuXHRcdFx0XHRcdFx0XHR0aGlzLmFkZCh0d2VlbiwgdHdlZW4uX3N0YXJ0VGltZSAtIHR3ZWVuLl9kZWxheSk7XG5cdFx0XHRcdFx0XHRcdHRoaXMuX2NhbGN1bGF0aW5nRHVyYXRpb24gPSAwO1xuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0cHJldlN0YXJ0ID0gdHdlZW4uX3N0YXJ0VGltZTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdGlmICh0d2Vlbi5fc3RhcnRUaW1lIDwgMCAmJiAhdHdlZW4uX3BhdXNlZCkgeyAvL2NoaWxkcmVuIGFyZW4ndCBhbGxvd2VkIHRvIGhhdmUgbmVnYXRpdmUgc3RhcnRUaW1lcyB1bmxlc3Mgc21vb3RoQ2hpbGRUaW1pbmcgaXMgdHJ1ZSwgc28gYWRqdXN0IGhlcmUgaWYgb25lIGlzIGZvdW5kLlxuXHRcdFx0XHRcdFx0XHRtYXggLT0gdHdlZW4uX3N0YXJ0VGltZTtcblx0XHRcdFx0XHRcdFx0aWYgKHRoaXMuX3RpbWVsaW5lLnNtb290aENoaWxkVGltaW5nKSB7XG5cdFx0XHRcdFx0XHRcdFx0dGhpcy5fc3RhcnRUaW1lICs9IHR3ZWVuLl9zdGFydFRpbWUgLyB0aGlzLl90aW1lU2NhbGU7XG5cdFx0XHRcdFx0XHRcdFx0dGhpcy5fdGltZSAtPSB0d2Vlbi5fc3RhcnRUaW1lO1xuXHRcdFx0XHRcdFx0XHRcdHRoaXMuX3RvdGFsVGltZSAtPSB0d2Vlbi5fc3RhcnRUaW1lO1xuXHRcdFx0XHRcdFx0XHRcdHRoaXMuX3Jhd1ByZXZUaW1lIC09IHR3ZWVuLl9zdGFydFRpbWU7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0dGhpcy5zaGlmdENoaWxkcmVuKC10d2Vlbi5fc3RhcnRUaW1lLCBmYWxzZSwgLTk5OTk5OTk5OTkpO1xuXHRcdFx0XHRcdFx0XHRwcmV2U3RhcnQgPSAwO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0ZW5kID0gdHdlZW4uX3N0YXJ0VGltZSArICh0d2Vlbi5fdG90YWxEdXJhdGlvbiAvIHR3ZWVuLl90aW1lU2NhbGUpO1xuXHRcdFx0XHRcdFx0aWYgKGVuZCA+IG1heCkge1xuXHRcdFx0XHRcdFx0XHRtYXggPSBlbmQ7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR0d2VlbiA9IHByZXY7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHRoaXMuX2R1cmF0aW9uID0gdGhpcy5fdG90YWxEdXJhdGlvbiA9IG1heDtcblx0XHRcdFx0XHR0aGlzLl9kaXJ0eSA9IGZhbHNlO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiB0aGlzLl90b3RhbER1cmF0aW9uO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuICh2YWx1ZSAmJiB0aGlzLnRvdGFsRHVyYXRpb24oKSkgPyB0aGlzLnRpbWVTY2FsZSh0aGlzLl90b3RhbER1cmF0aW9uIC8gdmFsdWUpIDogdGhpcztcblx0XHR9O1xuXG5cdFx0cC5wYXVzZWQgPSBmdW5jdGlvbih2YWx1ZSkge1xuXHRcdFx0aWYgKCF2YWx1ZSkgeyAvL2lmIHRoZXJlJ3MgYSBwYXVzZSBkaXJlY3RseSBhdCB0aGUgc3BvdCBmcm9tIHdoZXJlIHdlJ3JlIHVucGF1c2luZywgc2tpcCBpdC5cblx0XHRcdFx0dmFyIHR3ZWVuID0gdGhpcy5fZmlyc3QsXG5cdFx0XHRcdFx0dGltZSA9IHRoaXMuX3RpbWU7XG5cdFx0XHRcdHdoaWxlICh0d2Vlbikge1xuXHRcdFx0XHRcdGlmICh0d2Vlbi5fc3RhcnRUaW1lID09PSB0aW1lICYmIHR3ZWVuLmRhdGEgPT09IFwiaXNQYXVzZVwiKSB7XG5cdFx0XHRcdFx0XHR0d2Vlbi5fcmF3UHJldlRpbWUgPSAwOyAvL3JlbWVtYmVyLCBfcmF3UHJldlRpbWUgaXMgaG93IHplcm8tZHVyYXRpb24gdHdlZW5zL2NhbGxiYWNrcyBzZW5zZSBkaXJlY3Rpb25hbGl0eSBhbmQgZGV0ZXJtaW5lIHdoZXRoZXIgb3Igbm90IHRvIGZpcmUuIElmIF9yYXdQcmV2VGltZSBpcyB0aGUgc2FtZSBhcyBfc3RhcnRUaW1lIG9uIHRoZSBuZXh0IHJlbmRlciwgaXQgd29uJ3QgZmlyZS5cblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0dHdlZW4gPSB0d2Vlbi5fbmV4dDtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIEFuaW1hdGlvbi5wcm90b3R5cGUucGF1c2VkLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG5cdFx0fTtcblxuXHRcdHAudXNlc0ZyYW1lcyA9IGZ1bmN0aW9uKCkge1xuXHRcdFx0dmFyIHRsID0gdGhpcy5fdGltZWxpbmU7XG5cdFx0XHR3aGlsZSAodGwuX3RpbWVsaW5lKSB7XG5cdFx0XHRcdHRsID0gdGwuX3RpbWVsaW5lO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuICh0bCA9PT0gQW5pbWF0aW9uLl9yb290RnJhbWVzVGltZWxpbmUpO1xuXHRcdH07XG5cblx0XHRwLnJhd1RpbWUgPSBmdW5jdGlvbih3cmFwUmVwZWF0cykge1xuXHRcdFx0cmV0dXJuICh3cmFwUmVwZWF0cyAmJiAodGhpcy5fcGF1c2VkIHx8ICh0aGlzLl9yZXBlYXQgJiYgdGhpcy50aW1lKCkgPiAwICYmIHRoaXMudG90YWxQcm9ncmVzcygpIDwgMSkpKSA/IHRoaXMuX3RvdGFsVGltZSAlICh0aGlzLl9kdXJhdGlvbiArIHRoaXMuX3JlcGVhdERlbGF5KSA6IHRoaXMuX3BhdXNlZCA/IHRoaXMuX3RvdGFsVGltZSA6ICh0aGlzLl90aW1lbGluZS5yYXdUaW1lKHdyYXBSZXBlYXRzKSAtIHRoaXMuX3N0YXJ0VGltZSkgKiB0aGlzLl90aW1lU2NhbGU7XG5cdFx0fTtcblxuXHRcdHJldHVybiBUaW1lbGluZUxpdGU7XG5cblx0fSwgdHJ1ZSk7XG5cblxuXG5cblxuXG5cblxuXHRcblx0XG5cdFxuXHRcblx0XG4vKlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogVGltZWxpbmVNYXhcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqL1xuXHRfZ3NTY29wZS5fZ3NEZWZpbmUoXCJUaW1lbGluZU1heFwiLCBbXCJUaW1lbGluZUxpdGVcIixcIlR3ZWVuTGl0ZVwiLFwiZWFzaW5nLkVhc2VcIl0sIGZ1bmN0aW9uKFRpbWVsaW5lTGl0ZSwgVHdlZW5MaXRlLCBFYXNlKSB7XG5cblx0XHR2YXIgVGltZWxpbmVNYXggPSBmdW5jdGlvbih2YXJzKSB7XG5cdFx0XHRcdFRpbWVsaW5lTGl0ZS5jYWxsKHRoaXMsIHZhcnMpO1xuXHRcdFx0XHR0aGlzLl9yZXBlYXQgPSB0aGlzLnZhcnMucmVwZWF0IHx8IDA7XG5cdFx0XHRcdHRoaXMuX3JlcGVhdERlbGF5ID0gdGhpcy52YXJzLnJlcGVhdERlbGF5IHx8IDA7XG5cdFx0XHRcdHRoaXMuX2N5Y2xlID0gMDtcblx0XHRcdFx0dGhpcy5feW95byA9ICh0aGlzLnZhcnMueW95byA9PT0gdHJ1ZSk7XG5cdFx0XHRcdHRoaXMuX2RpcnR5ID0gdHJ1ZTtcblx0XHRcdH0sXG5cdFx0XHRfdGlueU51bSA9IDAuMDAwMDAwMDAwMSxcblx0XHRcdFR3ZWVuTGl0ZUludGVybmFscyA9IFR3ZWVuTGl0ZS5faW50ZXJuYWxzLFxuXHRcdFx0X2xhenlUd2VlbnMgPSBUd2VlbkxpdGVJbnRlcm5hbHMubGF6eVR3ZWVucyxcblx0XHRcdF9sYXp5UmVuZGVyID0gVHdlZW5MaXRlSW50ZXJuYWxzLmxhenlSZW5kZXIsXG5cdFx0XHRfZ2xvYmFscyA9IF9nc1Njb3BlLl9nc0RlZmluZS5nbG9iYWxzLFxuXHRcdFx0X2Vhc2VOb25lID0gbmV3IEVhc2UobnVsbCwgbnVsbCwgMSwgMCksXG5cdFx0XHRwID0gVGltZWxpbmVNYXgucHJvdG90eXBlID0gbmV3IFRpbWVsaW5lTGl0ZSgpO1xuXG5cdFx0cC5jb25zdHJ1Y3RvciA9IFRpbWVsaW5lTWF4O1xuXHRcdHAua2lsbCgpLl9nYyA9IGZhbHNlO1xuXHRcdFRpbWVsaW5lTWF4LnZlcnNpb24gPSBcIjEuMjAuNFwiO1xuXG5cdFx0cC5pbnZhbGlkYXRlID0gZnVuY3Rpb24oKSB7XG5cdFx0XHR0aGlzLl95b3lvID0gKHRoaXMudmFycy55b3lvID09PSB0cnVlKTtcblx0XHRcdHRoaXMuX3JlcGVhdCA9IHRoaXMudmFycy5yZXBlYXQgfHwgMDtcblx0XHRcdHRoaXMuX3JlcGVhdERlbGF5ID0gdGhpcy52YXJzLnJlcGVhdERlbGF5IHx8IDA7XG5cdFx0XHR0aGlzLl91bmNhY2hlKHRydWUpO1xuXHRcdFx0cmV0dXJuIFRpbWVsaW5lTGl0ZS5wcm90b3R5cGUuaW52YWxpZGF0ZS5jYWxsKHRoaXMpO1xuXHRcdH07XG5cblx0XHRwLmFkZENhbGxiYWNrID0gZnVuY3Rpb24oY2FsbGJhY2ssIHBvc2l0aW9uLCBwYXJhbXMsIHNjb3BlKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5hZGQoIFR3ZWVuTGl0ZS5kZWxheWVkQ2FsbCgwLCBjYWxsYmFjaywgcGFyYW1zLCBzY29wZSksIHBvc2l0aW9uKTtcblx0XHR9O1xuXG5cdFx0cC5yZW1vdmVDYWxsYmFjayA9IGZ1bmN0aW9uKGNhbGxiYWNrLCBwb3NpdGlvbikge1xuXHRcdFx0aWYgKGNhbGxiYWNrKSB7XG5cdFx0XHRcdGlmIChwb3NpdGlvbiA9PSBudWxsKSB7XG5cdFx0XHRcdFx0dGhpcy5fa2lsbChudWxsLCBjYWxsYmFjayk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0dmFyIGEgPSB0aGlzLmdldFR3ZWVuc09mKGNhbGxiYWNrLCBmYWxzZSksXG5cdFx0XHRcdFx0XHRpID0gYS5sZW5ndGgsXG5cdFx0XHRcdFx0XHR0aW1lID0gdGhpcy5fcGFyc2VUaW1lT3JMYWJlbChwb3NpdGlvbik7XG5cdFx0XHRcdFx0d2hpbGUgKC0taSA+IC0xKSB7XG5cdFx0XHRcdFx0XHRpZiAoYVtpXS5fc3RhcnRUaW1lID09PSB0aW1lKSB7XG5cdFx0XHRcdFx0XHRcdGFbaV0uX2VuYWJsZWQoZmFsc2UsIGZhbHNlKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdHJldHVybiB0aGlzO1xuXHRcdH07XG5cblx0XHRwLnJlbW92ZVBhdXNlID0gZnVuY3Rpb24ocG9zaXRpb24pIHtcblx0XHRcdHJldHVybiB0aGlzLnJlbW92ZUNhbGxiYWNrKFRpbWVsaW5lTGl0ZS5faW50ZXJuYWxzLnBhdXNlQ2FsbGJhY2ssIHBvc2l0aW9uKTtcblx0XHR9O1xuXG5cdFx0cC50d2VlblRvID0gZnVuY3Rpb24ocG9zaXRpb24sIHZhcnMpIHtcblx0XHRcdHZhcnMgPSB2YXJzIHx8IHt9O1xuXHRcdFx0dmFyIGNvcHkgPSB7ZWFzZTpfZWFzZU5vbmUsIHVzZUZyYW1lczp0aGlzLnVzZXNGcmFtZXMoKSwgaW1tZWRpYXRlUmVuZGVyOmZhbHNlLCBsYXp5OmZhbHNlfSxcblx0XHRcdFx0RW5naW5lID0gKHZhcnMucmVwZWF0ICYmIF9nbG9iYWxzLlR3ZWVuTWF4KSB8fCBUd2VlbkxpdGUsXG5cdFx0XHRcdGR1cmF0aW9uLCBwLCB0O1xuXHRcdFx0Zm9yIChwIGluIHZhcnMpIHtcblx0XHRcdFx0Y29weVtwXSA9IHZhcnNbcF07XG5cdFx0XHR9XG5cdFx0XHRjb3B5LnRpbWUgPSB0aGlzLl9wYXJzZVRpbWVPckxhYmVsKHBvc2l0aW9uKTtcblx0XHRcdGR1cmF0aW9uID0gKE1hdGguYWJzKE51bWJlcihjb3B5LnRpbWUpIC0gdGhpcy5fdGltZSkgLyB0aGlzLl90aW1lU2NhbGUpIHx8IDAuMDAxO1xuXHRcdFx0dCA9IG5ldyBFbmdpbmUodGhpcywgZHVyYXRpb24sIGNvcHkpO1xuXHRcdFx0Y29weS5vblN0YXJ0ID0gZnVuY3Rpb24oKSB7XG5cdFx0XHRcdHQudGFyZ2V0LnBhdXNlZCh0cnVlKTtcblx0XHRcdFx0aWYgKHQudmFycy50aW1lICE9PSB0LnRhcmdldC50aW1lKCkgJiYgZHVyYXRpb24gPT09IHQuZHVyYXRpb24oKSAmJiAhdC5pc0Zyb21UbykgeyAvL2Rvbid0IG1ha2UgdGhlIGR1cmF0aW9uIHplcm8gLSBpZiBpdCdzIHN1cHBvc2VkIHRvIGJlIHplcm8sIGRvbid0IHdvcnJ5IGJlY2F1c2UgaXQncyBhbHJlYWR5IGluaXR0aW5nIHRoZSB0d2VlbiBhbmQgd2lsbCBjb21wbGV0ZSBpbW1lZGlhdGVseSwgZWZmZWN0aXZlbHkgbWFraW5nIHRoZSBkdXJhdGlvbiB6ZXJvIGFueXdheS4gSWYgd2UgbWFrZSBkdXJhdGlvbiB6ZXJvLCB0aGUgdHdlZW4gd29uJ3QgcnVuIGF0IGFsbC5cblx0XHRcdFx0XHR0LmR1cmF0aW9uKCBNYXRoLmFicyggdC52YXJzLnRpbWUgLSB0LnRhcmdldC50aW1lKCkpIC8gdC50YXJnZXQuX3RpbWVTY2FsZSApLnJlbmRlcih0LnRpbWUoKSwgdHJ1ZSwgdHJ1ZSk7IC8vcmVuZGVyKCkgcmlnaHQgYXdheSB0byBlbnN1cmUgdGhhdCB0aGluZ3MgbG9vayByaWdodCwgZXNwZWNpYWxseSBpbiB0aGUgY2FzZSBvZiAudHdlZW5UbygwKS5cblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAodmFycy5vblN0YXJ0KSB7IC8vaW4gY2FzZSB0aGUgdXNlciBoYWQgYW4gb25TdGFydCBpbiB0aGUgdmFycyAtIHdlIGRvbid0IHdhbnQgdG8gb3ZlcndyaXRlIGl0LlxuXHRcdFx0XHRcdHZhcnMub25TdGFydC5hcHBseSh2YXJzLm9uU3RhcnRTY29wZSB8fCB2YXJzLmNhbGxiYWNrU2NvcGUgfHwgdCwgdmFycy5vblN0YXJ0UGFyYW1zIHx8IFtdKTsgLy9kb24ndCB1c2UgdC5fY2FsbGJhY2soXCJvblN0YXJ0XCIpIG9yIGl0J2xsIHBvaW50IHRvIHRoZSBjb3B5Lm9uU3RhcnQgYW5kIHdlJ2xsIGdldCBhIHJlY3Vyc2lvbiBlcnJvci5cblx0XHRcdFx0fVxuXHRcdFx0fTtcblx0XHRcdHJldHVybiB0O1xuXHRcdH07XG5cblx0XHRwLnR3ZWVuRnJvbVRvID0gZnVuY3Rpb24oZnJvbVBvc2l0aW9uLCB0b1Bvc2l0aW9uLCB2YXJzKSB7XG5cdFx0XHR2YXJzID0gdmFycyB8fCB7fTtcblx0XHRcdGZyb21Qb3NpdGlvbiA9IHRoaXMuX3BhcnNlVGltZU9yTGFiZWwoZnJvbVBvc2l0aW9uKTtcblx0XHRcdHZhcnMuc3RhcnRBdCA9IHtvbkNvbXBsZXRlOnRoaXMuc2Vlaywgb25Db21wbGV0ZVBhcmFtczpbZnJvbVBvc2l0aW9uXSwgY2FsbGJhY2tTY29wZTp0aGlzfTtcblx0XHRcdHZhcnMuaW1tZWRpYXRlUmVuZGVyID0gKHZhcnMuaW1tZWRpYXRlUmVuZGVyICE9PSBmYWxzZSk7XG5cdFx0XHR2YXIgdCA9IHRoaXMudHdlZW5Ubyh0b1Bvc2l0aW9uLCB2YXJzKTtcblx0XHRcdHQuaXNGcm9tVG8gPSAxOyAvL3RvIGVuc3VyZSB3ZSBkb24ndCBtZXNzIHdpdGggdGhlIGR1cmF0aW9uIGluIHRoZSBvblN0YXJ0ICh3ZSd2ZSBnb3QgdGhlIHN0YXJ0IGFuZCBlbmQgdmFsdWVzIGhlcmUsIHNvIGxvY2sgaXQgaW4pXG5cdFx0XHRyZXR1cm4gdC5kdXJhdGlvbigoTWF0aC5hYnMoIHQudmFycy50aW1lIC0gZnJvbVBvc2l0aW9uKSAvIHRoaXMuX3RpbWVTY2FsZSkgfHwgMC4wMDEpO1xuXHRcdH07XG5cblx0XHRwLnJlbmRlciA9IGZ1bmN0aW9uKHRpbWUsIHN1cHByZXNzRXZlbnRzLCBmb3JjZSkge1xuXHRcdFx0aWYgKHRoaXMuX2djKSB7XG5cdFx0XHRcdHRoaXMuX2VuYWJsZWQodHJ1ZSwgZmFsc2UpO1xuXHRcdFx0fVxuXHRcdFx0dmFyIHByZXZUaW1lID0gdGhpcy5fdGltZSxcblx0XHRcdFx0dG90YWxEdXIgPSAoIXRoaXMuX2RpcnR5KSA/IHRoaXMuX3RvdGFsRHVyYXRpb24gOiB0aGlzLnRvdGFsRHVyYXRpb24oKSxcblx0XHRcdFx0ZHVyID0gdGhpcy5fZHVyYXRpb24sXG5cdFx0XHRcdHByZXZUb3RhbFRpbWUgPSB0aGlzLl90b3RhbFRpbWUsXG5cdFx0XHRcdHByZXZTdGFydCA9IHRoaXMuX3N0YXJ0VGltZSxcblx0XHRcdFx0cHJldlRpbWVTY2FsZSA9IHRoaXMuX3RpbWVTY2FsZSxcblx0XHRcdFx0cHJldlJhd1ByZXZUaW1lID0gdGhpcy5fcmF3UHJldlRpbWUsXG5cdFx0XHRcdHByZXZQYXVzZWQgPSB0aGlzLl9wYXVzZWQsXG5cdFx0XHRcdHByZXZDeWNsZSA9IHRoaXMuX2N5Y2xlLFxuXHRcdFx0XHR0d2VlbiwgaXNDb21wbGV0ZSwgbmV4dCwgY2FsbGJhY2ssIGludGVybmFsRm9yY2UsIGN5Y2xlRHVyYXRpb24sIHBhdXNlVHdlZW4sIGN1clRpbWU7XG5cdFx0XHRpZiAocHJldlRpbWUgIT09IHRoaXMuX3RpbWUpIHsgLy9pZiB0b3RhbER1cmF0aW9uKCkgZmluZHMgYSBjaGlsZCB3aXRoIGEgbmVnYXRpdmUgc3RhcnRUaW1lIGFuZCBzbW9vdGhDaGlsZFRpbWluZyBpcyB0cnVlLCB0aGluZ3MgZ2V0IHNoaWZ0ZWQgYXJvdW5kIGludGVybmFsbHkgc28gd2UgbmVlZCB0byBhZGp1c3QgdGhlIHRpbWUgYWNjb3JkaW5nbHkuIEZvciBleGFtcGxlLCBpZiBhIHR3ZWVuIHN0YXJ0cyBhdCAtMzAgd2UgbXVzdCBzaGlmdCBFVkVSWVRISU5HIGZvcndhcmQgMzAgc2Vjb25kcyBhbmQgbW92ZSB0aGlzIHRpbWVsaW5lJ3Mgc3RhcnRUaW1lIGJhY2t3YXJkIGJ5IDMwIHNlY29uZHMgc28gdGhhdCB0aGluZ3MgYWxpZ24gd2l0aCB0aGUgcGxheWhlYWQgKG5vIGp1bXApLlxuXHRcdFx0XHR0aW1lICs9IHRoaXMuX3RpbWUgLSBwcmV2VGltZTtcblx0XHRcdH1cblx0XHRcdGlmICh0aW1lID49IHRvdGFsRHVyIC0gMC4wMDAwMDAxICYmIHRpbWUgPj0gMCkgeyAvL3RvIHdvcmsgYXJvdW5kIG9jY2FzaW9uYWwgZmxvYXRpbmcgcG9pbnQgbWF0aCBhcnRpZmFjdHMuXG5cdFx0XHRcdGlmICghdGhpcy5fbG9ja2VkKSB7XG5cdFx0XHRcdFx0dGhpcy5fdG90YWxUaW1lID0gdG90YWxEdXI7XG5cdFx0XHRcdFx0dGhpcy5fY3ljbGUgPSB0aGlzLl9yZXBlYXQ7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKCF0aGlzLl9yZXZlcnNlZCkgaWYgKCF0aGlzLl9oYXNQYXVzZWRDaGlsZCgpKSB7XG5cdFx0XHRcdFx0aXNDb21wbGV0ZSA9IHRydWU7XG5cdFx0XHRcdFx0Y2FsbGJhY2sgPSBcIm9uQ29tcGxldGVcIjtcblx0XHRcdFx0XHRpbnRlcm5hbEZvcmNlID0gISF0aGlzLl90aW1lbGluZS5hdXRvUmVtb3ZlQ2hpbGRyZW47IC8vb3RoZXJ3aXNlLCBpZiB0aGUgYW5pbWF0aW9uIGlzIHVucGF1c2VkL2FjdGl2YXRlZCBhZnRlciBpdCdzIGFscmVhZHkgZmluaXNoZWQsIGl0IGRvZXNuJ3QgZ2V0IHJlbW92ZWQgZnJvbSB0aGUgcGFyZW50IHRpbWVsaW5lLlxuXHRcdFx0XHRcdGlmICh0aGlzLl9kdXJhdGlvbiA9PT0gMCkgaWYgKCh0aW1lIDw9IDAgJiYgdGltZSA+PSAtMC4wMDAwMDAxKSB8fCBwcmV2UmF3UHJldlRpbWUgPCAwIHx8IHByZXZSYXdQcmV2VGltZSA9PT0gX3RpbnlOdW0pIGlmIChwcmV2UmF3UHJldlRpbWUgIT09IHRpbWUgJiYgdGhpcy5fZmlyc3QpIHtcblx0XHRcdFx0XHRcdGludGVybmFsRm9yY2UgPSB0cnVlO1xuXHRcdFx0XHRcdFx0aWYgKHByZXZSYXdQcmV2VGltZSA+IF90aW55TnVtKSB7XG5cdFx0XHRcdFx0XHRcdGNhbGxiYWNrID0gXCJvblJldmVyc2VDb21wbGV0ZVwiO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0XHR0aGlzLl9yYXdQcmV2VGltZSA9ICh0aGlzLl9kdXJhdGlvbiB8fCAhc3VwcHJlc3NFdmVudHMgfHwgdGltZSB8fCB0aGlzLl9yYXdQcmV2VGltZSA9PT0gdGltZSkgPyB0aW1lIDogX3RpbnlOdW07IC8vd2hlbiB0aGUgcGxheWhlYWQgYXJyaXZlcyBhdCBFWEFDVExZIHRpbWUgMCAocmlnaHQgb24gdG9wKSBvZiBhIHplcm8tZHVyYXRpb24gdGltZWxpbmUgb3IgdHdlZW4sIHdlIG5lZWQgdG8gZGlzY2VybiBpZiBldmVudHMgYXJlIHN1cHByZXNzZWQgc28gdGhhdCB3aGVuIHRoZSBwbGF5aGVhZCBtb3ZlcyBhZ2FpbiAobmV4dCB0aW1lKSwgaXQnbGwgdHJpZ2dlciB0aGUgY2FsbGJhY2suIElmIGV2ZW50cyBhcmUgTk9UIHN1cHByZXNzZWQsIG9idmlvdXNseSB0aGUgY2FsbGJhY2sgd291bGQgYmUgdHJpZ2dlcmVkIGluIHRoaXMgcmVuZGVyLiBCYXNpY2FsbHksIHRoZSBjYWxsYmFjayBzaG91bGQgZmlyZSBlaXRoZXIgd2hlbiB0aGUgcGxheWhlYWQgQVJSSVZFUyBvciBMRUFWRVMgdGhpcyBleGFjdCBzcG90LCBub3QgYm90aC4gSW1hZ2luZSBkb2luZyBhIHRpbWVsaW5lLnNlZWsoMCkgYW5kIHRoZXJlJ3MgYSBjYWxsYmFjayB0aGF0IHNpdHMgYXQgMC4gU2luY2UgZXZlbnRzIGFyZSBzdXBwcmVzc2VkIG9uIHRoYXQgc2VlaygpIGJ5IGRlZmF1bHQsIG5vdGhpbmcgd2lsbCBmaXJlLCBidXQgd2hlbiB0aGUgcGxheWhlYWQgbW92ZXMgb2ZmIG9mIHRoYXQgcG9zaXRpb24sIHRoZSBjYWxsYmFjayBzaG91bGQgZmlyZS4gVGhpcyBiZWhhdmlvciBpcyB3aGF0IHBlb3BsZSBpbnR1aXRpdmVseSBleHBlY3QuIFdlIHNldCB0aGUgX3Jhd1ByZXZUaW1lIHRvIGJlIGEgcHJlY2lzZSB0aW55IG51bWJlciB0byBpbmRpY2F0ZSB0aGlzIHNjZW5hcmlvIHJhdGhlciB0aGFuIHVzaW5nIGFub3RoZXIgcHJvcGVydHkvdmFyaWFibGUgd2hpY2ggd291bGQgaW5jcmVhc2UgbWVtb3J5IHVzYWdlLiBUaGlzIHRlY2huaXF1ZSBpcyBsZXNzIHJlYWRhYmxlLCBidXQgbW9yZSBlZmZpY2llbnQuXG5cdFx0XHRcdGlmICh0aGlzLl95b3lvICYmICh0aGlzLl9jeWNsZSAmIDEpICE9PSAwKSB7XG5cdFx0XHRcdFx0dGhpcy5fdGltZSA9IHRpbWUgPSAwO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHRoaXMuX3RpbWUgPSBkdXI7XG5cdFx0XHRcdFx0dGltZSA9IGR1ciArIDAuMDAwMTsgLy90byBhdm9pZCBvY2Nhc2lvbmFsIGZsb2F0aW5nIHBvaW50IHJvdW5kaW5nIGVycm9ycyAtIHNvbWV0aW1lcyBjaGlsZCB0d2VlbnMvdGltZWxpbmVzIHdlcmUgbm90IGJlaW5nIGZ1bGx5IGNvbXBsZXRlZCAodGhlaXIgcHJvZ3Jlc3MgbWlnaHQgYmUgMC45OTk5OTk5OTk5OTk5OTggaW5zdGVhZCBvZiAxIGJlY2F1c2Ugd2hlbiBfdGltZSAtIHR3ZWVuLl9zdGFydFRpbWUgaXMgcGVyZm9ybWVkLCBmbG9hdGluZyBwb2ludCBlcnJvcnMgd291bGQgcmV0dXJuIGEgdmFsdWUgdGhhdCB3YXMgU0xJR0hUTFkgb2ZmKS4gVHJ5ICg5OTk5OTk5OTk5OTkuNyAtIDk5OTk5OTk5OTk5OSkgKiAxID0gMC42OTk5NTExNzE4NzUgaW5zdGVhZCBvZiAwLjcuIFdlIGNhbm5vdCBkbyBsZXNzIHRoZW4gMC4wMDAxIGJlY2F1c2UgdGhlIHNhbWUgaXNzdWUgY2FuIG9jY3VyIHdoZW4gdGhlIGR1cmF0aW9uIGlzIGV4dHJlbWVseSBsYXJnZSBsaWtlIDk5OTk5OTk5OTk5OSBpbiB3aGljaCBjYXNlIGFkZGluZyAwLjAwMDAwMDAxLCBmb3IgZXhhbXBsZSwgY2F1c2VzIGl0IHRvIGFjdCBsaWtlIG5vdGhpbmcgd2FzIGFkZGVkLlxuXHRcdFx0XHR9XG5cblx0XHRcdH0gZWxzZSBpZiAodGltZSA8IDAuMDAwMDAwMSkgeyAvL3RvIHdvcmsgYXJvdW5kIG9jY2FzaW9uYWwgZmxvYXRpbmcgcG9pbnQgbWF0aCBhcnRpZmFjdHMsIHJvdW5kIHN1cGVyIHNtYWxsIHZhbHVlcyB0byAwLlxuXHRcdFx0XHRpZiAoIXRoaXMuX2xvY2tlZCkge1xuXHRcdFx0XHRcdHRoaXMuX3RvdGFsVGltZSA9IHRoaXMuX2N5Y2xlID0gMDtcblx0XHRcdFx0fVxuXHRcdFx0XHR0aGlzLl90aW1lID0gMDtcblx0XHRcdFx0aWYgKHByZXZUaW1lICE9PSAwIHx8IChkdXIgPT09IDAgJiYgcHJldlJhd1ByZXZUaW1lICE9PSBfdGlueU51bSAmJiAocHJldlJhd1ByZXZUaW1lID4gMCB8fCAodGltZSA8IDAgJiYgcHJldlJhd1ByZXZUaW1lID49IDApKSAmJiAhdGhpcy5fbG9ja2VkKSkgeyAvL2VkZ2UgY2FzZSBmb3IgY2hlY2tpbmcgdGltZSA8IDAgJiYgcHJldlJhd1ByZXZUaW1lID49IDA6IGEgemVyby1kdXJhdGlvbiBmcm9tVG8oKSB0d2VlbiBpbnNpZGUgYSB6ZXJvLWR1cmF0aW9uIHRpbWVsaW5lICh5ZWFoLCB2ZXJ5IHJhcmUpXG5cdFx0XHRcdFx0Y2FsbGJhY2sgPSBcIm9uUmV2ZXJzZUNvbXBsZXRlXCI7XG5cdFx0XHRcdFx0aXNDb21wbGV0ZSA9IHRoaXMuX3JldmVyc2VkO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmICh0aW1lIDwgMCkge1xuXHRcdFx0XHRcdHRoaXMuX2FjdGl2ZSA9IGZhbHNlO1xuXHRcdFx0XHRcdGlmICh0aGlzLl90aW1lbGluZS5hdXRvUmVtb3ZlQ2hpbGRyZW4gJiYgdGhpcy5fcmV2ZXJzZWQpIHtcblx0XHRcdFx0XHRcdGludGVybmFsRm9yY2UgPSBpc0NvbXBsZXRlID0gdHJ1ZTtcblx0XHRcdFx0XHRcdGNhbGxiYWNrID0gXCJvblJldmVyc2VDb21wbGV0ZVwiO1xuXHRcdFx0XHRcdH0gZWxzZSBpZiAocHJldlJhd1ByZXZUaW1lID49IDAgJiYgdGhpcy5fZmlyc3QpIHsgLy93aGVuIGdvaW5nIGJhY2sgYmV5b25kIHRoZSBzdGFydCwgZm9yY2UgYSByZW5kZXIgc28gdGhhdCB6ZXJvLWR1cmF0aW9uIHR3ZWVucyB0aGF0IHNpdCBhdCB0aGUgdmVyeSBiZWdpbm5pbmcgcmVuZGVyIHRoZWlyIHN0YXJ0IHZhbHVlcyBwcm9wZXJseS4gT3RoZXJ3aXNlLCBpZiB0aGUgcGFyZW50IHRpbWVsaW5lJ3MgcGxheWhlYWQgbGFuZHMgZXhhY3RseSBhdCB0aGlzIHRpbWVsaW5lJ3Mgc3RhcnRUaW1lLCBhbmQgdGhlbiBtb3ZlcyBiYWNrd2FyZHMsIHRoZSB6ZXJvLWR1cmF0aW9uIHR3ZWVucyBhdCB0aGUgYmVnaW5uaW5nIHdvdWxkIHN0aWxsIGJlIGF0IHRoZWlyIGVuZCBzdGF0ZS5cblx0XHRcdFx0XHRcdGludGVybmFsRm9yY2UgPSB0cnVlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHR0aGlzLl9yYXdQcmV2VGltZSA9IHRpbWU7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0dGhpcy5fcmF3UHJldlRpbWUgPSAoZHVyIHx8ICFzdXBwcmVzc0V2ZW50cyB8fCB0aW1lIHx8IHRoaXMuX3Jhd1ByZXZUaW1lID09PSB0aW1lKSA/IHRpbWUgOiBfdGlueU51bTsgLy93aGVuIHRoZSBwbGF5aGVhZCBhcnJpdmVzIGF0IEVYQUNUTFkgdGltZSAwIChyaWdodCBvbiB0b3ApIG9mIGEgemVyby1kdXJhdGlvbiB0aW1lbGluZSBvciB0d2Vlbiwgd2UgbmVlZCB0byBkaXNjZXJuIGlmIGV2ZW50cyBhcmUgc3VwcHJlc3NlZCBzbyB0aGF0IHdoZW4gdGhlIHBsYXloZWFkIG1vdmVzIGFnYWluIChuZXh0IHRpbWUpLCBpdCdsbCB0cmlnZ2VyIHRoZSBjYWxsYmFjay4gSWYgZXZlbnRzIGFyZSBOT1Qgc3VwcHJlc3NlZCwgb2J2aW91c2x5IHRoZSBjYWxsYmFjayB3b3VsZCBiZSB0cmlnZ2VyZWQgaW4gdGhpcyByZW5kZXIuIEJhc2ljYWxseSwgdGhlIGNhbGxiYWNrIHNob3VsZCBmaXJlIGVpdGhlciB3aGVuIHRoZSBwbGF5aGVhZCBBUlJJVkVTIG9yIExFQVZFUyB0aGlzIGV4YWN0IHNwb3QsIG5vdCBib3RoLiBJbWFnaW5lIGRvaW5nIGEgdGltZWxpbmUuc2VlaygwKSBhbmQgdGhlcmUncyBhIGNhbGxiYWNrIHRoYXQgc2l0cyBhdCAwLiBTaW5jZSBldmVudHMgYXJlIHN1cHByZXNzZWQgb24gdGhhdCBzZWVrKCkgYnkgZGVmYXVsdCwgbm90aGluZyB3aWxsIGZpcmUsIGJ1dCB3aGVuIHRoZSBwbGF5aGVhZCBtb3ZlcyBvZmYgb2YgdGhhdCBwb3NpdGlvbiwgdGhlIGNhbGxiYWNrIHNob3VsZCBmaXJlLiBUaGlzIGJlaGF2aW9yIGlzIHdoYXQgcGVvcGxlIGludHVpdGl2ZWx5IGV4cGVjdC4gV2Ugc2V0IHRoZSBfcmF3UHJldlRpbWUgdG8gYmUgYSBwcmVjaXNlIHRpbnkgbnVtYmVyIHRvIGluZGljYXRlIHRoaXMgc2NlbmFyaW8gcmF0aGVyIHRoYW4gdXNpbmcgYW5vdGhlciBwcm9wZXJ0eS92YXJpYWJsZSB3aGljaCB3b3VsZCBpbmNyZWFzZSBtZW1vcnkgdXNhZ2UuIFRoaXMgdGVjaG5pcXVlIGlzIGxlc3MgcmVhZGFibGUsIGJ1dCBtb3JlIGVmZmljaWVudC5cblx0XHRcdFx0XHRpZiAodGltZSA9PT0gMCAmJiBpc0NvbXBsZXRlKSB7IC8vaWYgdGhlcmUncyBhIHplcm8tZHVyYXRpb24gdHdlZW4gYXQgdGhlIHZlcnkgYmVnaW5uaW5nIG9mIGEgdGltZWxpbmUgYW5kIHRoZSBwbGF5aGVhZCBsYW5kcyBFWEFDVExZIGF0IHRpbWUgMCwgdGhhdCB0d2VlbiB3aWxsIGNvcnJlY3RseSByZW5kZXIgaXRzIGVuZCB2YWx1ZXMsIGJ1dCB3ZSBuZWVkIHRvIGtlZXAgdGhlIHRpbWVsaW5lIGFsaXZlIGZvciBvbmUgbW9yZSByZW5kZXIgc28gdGhhdCB0aGUgYmVnaW5uaW5nIHZhbHVlcyByZW5kZXIgcHJvcGVybHkgYXMgdGhlIHBhcmVudCdzIHBsYXloZWFkIGtlZXBzIG1vdmluZyBiZXlvbmQgdGhlIGJlZ2luaW5nLiBJbWFnaW5lIG9iai54IHN0YXJ0cyBhdCAwIGFuZCB0aGVuIHdlIGRvIHRsLnNldChvYmosIHt4OjEwMH0pLnRvKG9iaiwgMSwge3g6MjAwfSkgYW5kIHRoZW4gbGF0ZXIgd2UgdGwucmV2ZXJzZSgpLi4udGhlIGdvYWwgaXMgdG8gaGF2ZSBvYmoueCByZXZlcnQgdG8gMC4gSWYgdGhlIHBsYXloZWFkIGhhcHBlbnMgdG8gbGFuZCBvbiBleGFjdGx5IDAsIHdpdGhvdXQgdGhpcyBjaHVuayBvZiBjb2RlLCBpdCdkIGNvbXBsZXRlIHRoZSB0aW1lbGluZSBhbmQgcmVtb3ZlIGl0IGZyb20gdGhlIHJlbmRlcmluZyBxdWV1ZSAobm90IGdvb2QpLlxuXHRcdFx0XHRcdFx0dHdlZW4gPSB0aGlzLl9maXJzdDtcblx0XHRcdFx0XHRcdHdoaWxlICh0d2VlbiAmJiB0d2Vlbi5fc3RhcnRUaW1lID09PSAwKSB7XG5cdFx0XHRcdFx0XHRcdGlmICghdHdlZW4uX2R1cmF0aW9uKSB7XG5cdFx0XHRcdFx0XHRcdFx0aXNDb21wbGV0ZSA9IGZhbHNlO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdHR3ZWVuID0gdHdlZW4uX25leHQ7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHRpbWUgPSAwOyAvL3RvIGF2b2lkIG9jY2FzaW9uYWwgZmxvYXRpbmcgcG9pbnQgcm91bmRpbmcgZXJyb3JzIChjb3VsZCBjYXVzZSBwcm9ibGVtcyBlc3BlY2lhbGx5IHdpdGggemVyby1kdXJhdGlvbiB0d2VlbnMgYXQgdGhlIHZlcnkgYmVnaW5uaW5nIG9mIHRoZSB0aW1lbGluZSlcblx0XHRcdFx0XHRpZiAoIXRoaXMuX2luaXR0ZWQpIHtcblx0XHRcdFx0XHRcdGludGVybmFsRm9yY2UgPSB0cnVlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRpZiAoZHVyID09PSAwICYmIHByZXZSYXdQcmV2VGltZSA8IDApIHsgLy93aXRob3V0IHRoaXMsIHplcm8tZHVyYXRpb24gcmVwZWF0aW5nIHRpbWVsaW5lcyAobGlrZSB3aXRoIGEgc2ltcGxlIGNhbGxiYWNrIG5lc3RlZCBhdCB0aGUgdmVyeSBiZWdpbm5pbmcgYW5kIGEgcmVwZWF0RGVsYXkpIHdvdWxkbid0IHJlbmRlciB0aGUgZmlyc3QgdGltZSB0aHJvdWdoLlxuXHRcdFx0XHRcdGludGVybmFsRm9yY2UgPSB0cnVlO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHRoaXMuX3RpbWUgPSB0aGlzLl9yYXdQcmV2VGltZSA9IHRpbWU7XG5cdFx0XHRcdGlmICghdGhpcy5fbG9ja2VkKSB7XG5cdFx0XHRcdFx0dGhpcy5fdG90YWxUaW1lID0gdGltZTtcblx0XHRcdFx0XHRpZiAodGhpcy5fcmVwZWF0ICE9PSAwKSB7XG5cdFx0XHRcdFx0XHRjeWNsZUR1cmF0aW9uID0gZHVyICsgdGhpcy5fcmVwZWF0RGVsYXk7XG5cdFx0XHRcdFx0XHR0aGlzLl9jeWNsZSA9ICh0aGlzLl90b3RhbFRpbWUgLyBjeWNsZUR1cmF0aW9uKSA+PiAwOyAvL29yaWdpbmFsbHkgX3RvdGFsVGltZSAlIGN5Y2xlRHVyYXRpb24gYnV0IGZsb2F0aW5nIHBvaW50IGVycm9ycyBjYXVzZWQgcHJvYmxlbXMsIHNvIEkgbm9ybWFsaXplZCBpdC4gKDQgJSAwLjggc2hvdWxkIGJlIDAgYnV0IGl0IGdldHMgcmVwb3J0ZWQgYXMgMC43OTk5OTk5OSEpXG5cdFx0XHRcdFx0XHRpZiAodGhpcy5fY3ljbGUgIT09IDApIGlmICh0aGlzLl9jeWNsZSA9PT0gdGhpcy5fdG90YWxUaW1lIC8gY3ljbGVEdXJhdGlvbiAmJiBwcmV2VG90YWxUaW1lIDw9IHRpbWUpIHtcblx0XHRcdFx0XHRcdFx0dGhpcy5fY3ljbGUtLTsgLy9vdGhlcndpc2Ugd2hlbiByZW5kZXJlZCBleGFjdGx5IGF0IHRoZSBlbmQgdGltZSwgaXQgd2lsbCBhY3QgYXMgdGhvdWdoIGl0IGlzIHJlcGVhdGluZyAoYXQgdGhlIGJlZ2lubmluZylcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdHRoaXMuX3RpbWUgPSB0aGlzLl90b3RhbFRpbWUgLSAodGhpcy5fY3ljbGUgKiBjeWNsZUR1cmF0aW9uKTtcblx0XHRcdFx0XHRcdGlmICh0aGlzLl95b3lvKSBpZiAoKHRoaXMuX2N5Y2xlICYgMSkgIT09IDApIHtcblx0XHRcdFx0XHRcdFx0dGhpcy5fdGltZSA9IGR1ciAtIHRoaXMuX3RpbWU7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRpZiAodGhpcy5fdGltZSA+IGR1cikge1xuXHRcdFx0XHRcdFx0XHR0aGlzLl90aW1lID0gZHVyO1xuXHRcdFx0XHRcdFx0XHR0aW1lID0gZHVyICsgMC4wMDAxOyAvL3RvIGF2b2lkIG9jY2FzaW9uYWwgZmxvYXRpbmcgcG9pbnQgcm91bmRpbmcgZXJyb3Jcblx0XHRcdFx0XHRcdH0gZWxzZSBpZiAodGhpcy5fdGltZSA8IDApIHtcblx0XHRcdFx0XHRcdFx0dGhpcy5fdGltZSA9IHRpbWUgPSAwO1xuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0dGltZSA9IHRoaXMuX3RpbWU7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKHRoaXMuX2hhc1BhdXNlICYmICF0aGlzLl9mb3JjaW5nUGxheWhlYWQgJiYgIXN1cHByZXNzRXZlbnRzKSB7XG5cdFx0XHRcdFx0dGltZSA9IHRoaXMuX3RpbWU7XG5cdFx0XHRcdFx0aWYgKHRpbWUgPj0gcHJldlRpbWUgfHwgKHRoaXMuX3JlcGVhdCAmJiBwcmV2Q3ljbGUgIT09IHRoaXMuX2N5Y2xlKSkge1xuXHRcdFx0XHRcdFx0dHdlZW4gPSB0aGlzLl9maXJzdDtcblx0XHRcdFx0XHRcdHdoaWxlICh0d2VlbiAmJiB0d2Vlbi5fc3RhcnRUaW1lIDw9IHRpbWUgJiYgIXBhdXNlVHdlZW4pIHtcblx0XHRcdFx0XHRcdFx0aWYgKCF0d2Vlbi5fZHVyYXRpb24pIGlmICh0d2Vlbi5kYXRhID09PSBcImlzUGF1c2VcIiAmJiAhdHdlZW4ucmF0aW8gJiYgISh0d2Vlbi5fc3RhcnRUaW1lID09PSAwICYmIHRoaXMuX3Jhd1ByZXZUaW1lID09PSAwKSkge1xuXHRcdFx0XHRcdFx0XHRcdHBhdXNlVHdlZW4gPSB0d2Vlbjtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR0d2VlbiA9IHR3ZWVuLl9uZXh0O1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHR0d2VlbiA9IHRoaXMuX2xhc3Q7XG5cdFx0XHRcdFx0XHR3aGlsZSAodHdlZW4gJiYgdHdlZW4uX3N0YXJ0VGltZSA+PSB0aW1lICYmICFwYXVzZVR3ZWVuKSB7XG5cdFx0XHRcdFx0XHRcdGlmICghdHdlZW4uX2R1cmF0aW9uKSBpZiAodHdlZW4uZGF0YSA9PT0gXCJpc1BhdXNlXCIgJiYgdHdlZW4uX3Jhd1ByZXZUaW1lID4gMCkge1xuXHRcdFx0XHRcdFx0XHRcdHBhdXNlVHdlZW4gPSB0d2Vlbjtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR0d2VlbiA9IHR3ZWVuLl9wcmV2O1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRpZiAocGF1c2VUd2VlbiAmJiBwYXVzZVR3ZWVuLl9zdGFydFRpbWUgPCBkdXIpIHtcblx0XHRcdFx0XHRcdHRoaXMuX3RpbWUgPSB0aW1lID0gcGF1c2VUd2Vlbi5fc3RhcnRUaW1lO1xuXHRcdFx0XHRcdFx0dGhpcy5fdG90YWxUaW1lID0gdGltZSArICh0aGlzLl9jeWNsZSAqICh0aGlzLl90b3RhbER1cmF0aW9uICsgdGhpcy5fcmVwZWF0RGVsYXkpKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0XHRpZiAodGhpcy5fY3ljbGUgIT09IHByZXZDeWNsZSkgaWYgKCF0aGlzLl9sb2NrZWQpIHtcblx0XHRcdFx0Lypcblx0XHRcdFx0bWFrZSBzdXJlIGNoaWxkcmVuIGF0IHRoZSBlbmQvYmVnaW5uaW5nIG9mIHRoZSB0aW1lbGluZSBhcmUgcmVuZGVyZWQgcHJvcGVybHkuIElmLCBmb3IgZXhhbXBsZSxcblx0XHRcdFx0YSAzLXNlY29uZCBsb25nIHRpbWVsaW5lIHJlbmRlcmVkIGF0IDIuOSBzZWNvbmRzIHByZXZpb3VzbHksIGFuZCBub3cgcmVuZGVycyBhdCAzLjIgc2Vjb25kcyAod2hpY2hcblx0XHRcdFx0d291bGQgZ2V0IHRyYW5zYXRlZCB0byAyLjggc2Vjb25kcyBpZiB0aGUgdGltZWxpbmUgeW95b3Mgb3IgMC4yIHNlY29uZHMgaWYgaXQganVzdCByZXBlYXRzKSwgdGhlcmVcblx0XHRcdFx0Y291bGQgYmUgYSBjYWxsYmFjayBvciBhIHNob3J0IHR3ZWVuIHRoYXQncyBhdCAyLjk1IG9yIDMgc2Vjb25kcyBpbiB3aGljaCB3b3VsZG4ndCByZW5kZXIuIFNvXG5cdFx0XHRcdHdlIG5lZWQgdG8gcHVzaCB0aGUgdGltZWxpbmUgdG8gdGhlIGVuZCAoYW5kL29yIGJlZ2lubmluZyBkZXBlbmRpbmcgb24gaXRzIHlveW8gdmFsdWUpLiBBbHNvIHdlIG11c3Rcblx0XHRcdFx0ZW5zdXJlIHRoYXQgemVyby1kdXJhdGlvbiB0d2VlbnMgYXQgdGhlIHZlcnkgYmVnaW5uaW5nIG9yIGVuZCBvZiB0aGUgVGltZWxpbmVNYXggd29yay5cblx0XHRcdFx0Ki9cblx0XHRcdFx0dmFyIGJhY2t3YXJkcyA9ICh0aGlzLl95b3lvICYmIChwcmV2Q3ljbGUgJiAxKSAhPT0gMCksXG5cdFx0XHRcdFx0d3JhcCA9IChiYWNrd2FyZHMgPT09ICh0aGlzLl95b3lvICYmICh0aGlzLl9jeWNsZSAmIDEpICE9PSAwKSksXG5cdFx0XHRcdFx0cmVjVG90YWxUaW1lID0gdGhpcy5fdG90YWxUaW1lLFxuXHRcdFx0XHRcdHJlY0N5Y2xlID0gdGhpcy5fY3ljbGUsXG5cdFx0XHRcdFx0cmVjUmF3UHJldlRpbWUgPSB0aGlzLl9yYXdQcmV2VGltZSxcblx0XHRcdFx0XHRyZWNUaW1lID0gdGhpcy5fdGltZTtcblxuXHRcdFx0XHR0aGlzLl90b3RhbFRpbWUgPSBwcmV2Q3ljbGUgKiBkdXI7XG5cdFx0XHRcdGlmICh0aGlzLl9jeWNsZSA8IHByZXZDeWNsZSkge1xuXHRcdFx0XHRcdGJhY2t3YXJkcyA9ICFiYWNrd2FyZHM7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0dGhpcy5fdG90YWxUaW1lICs9IGR1cjtcblx0XHRcdFx0fVxuXHRcdFx0XHR0aGlzLl90aW1lID0gcHJldlRpbWU7IC8vdGVtcG9yYXJpbHkgcmV2ZXJ0IF90aW1lIHNvIHRoYXQgcmVuZGVyKCkgcmVuZGVycyB0aGUgY2hpbGRyZW4gaW4gdGhlIGNvcnJlY3Qgb3JkZXIuIFdpdGhvdXQgdGhpcywgdHdlZW5zIHdvbid0IHJld2luZCBjb3JyZWN0bHkuIFdlIGNvdWxkIGFyaGljdGVjdCB0aGluZ3MgaW4gYSBcImNsZWFuZXJcIiB3YXkgYnkgc3BsaXR0aW5nIG91dCB0aGUgcmVuZGVyaW5nIHF1ZXVlIGludG8gYSBzZXBhcmF0ZSBtZXRob2QgYnV0IGZvciBwZXJmb3JtYW5jZSByZWFzb25zLCB3ZSBrZXB0IGl0IGFsbCBpbnNpZGUgdGhpcyBtZXRob2QuXG5cblx0XHRcdFx0dGhpcy5fcmF3UHJldlRpbWUgPSAoZHVyID09PSAwKSA/IHByZXZSYXdQcmV2VGltZSAtIDAuMDAwMSA6IHByZXZSYXdQcmV2VGltZTtcblx0XHRcdFx0dGhpcy5fY3ljbGUgPSBwcmV2Q3ljbGU7XG5cdFx0XHRcdHRoaXMuX2xvY2tlZCA9IHRydWU7IC8vcHJldmVudHMgY2hhbmdlcyB0byB0b3RhbFRpbWUgYW5kIHNraXBzIHJlcGVhdC95b3lvIGJlaGF2aW9yIHdoZW4gd2UgcmVjdXJzaXZlbHkgY2FsbCByZW5kZXIoKVxuXHRcdFx0XHRwcmV2VGltZSA9IChiYWNrd2FyZHMpID8gMCA6IGR1cjtcblx0XHRcdFx0dGhpcy5yZW5kZXIocHJldlRpbWUsIHN1cHByZXNzRXZlbnRzLCAoZHVyID09PSAwKSk7XG5cdFx0XHRcdGlmICghc3VwcHJlc3NFdmVudHMpIGlmICghdGhpcy5fZ2MpIHtcblx0XHRcdFx0XHRpZiAodGhpcy52YXJzLm9uUmVwZWF0KSB7XG5cdFx0XHRcdFx0XHR0aGlzLl9jeWNsZSA9IHJlY0N5Y2xlOyAvL2luIGNhc2UgdGhlIG9uUmVwZWF0IGFsdGVycyB0aGUgcGxheWhlYWQgb3IgaW52YWxpZGF0ZXMoKSwgd2Ugc2hvdWxkbid0IHN0YXkgbG9ja2VkIG9yIHVzZSB0aGUgcHJldmlvdXMgY3ljbGUuXG5cdFx0XHRcdFx0XHR0aGlzLl9sb2NrZWQgPSBmYWxzZTtcblx0XHRcdFx0XHRcdHRoaXMuX2NhbGxiYWNrKFwib25SZXBlYXRcIik7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdGlmIChwcmV2VGltZSAhPT0gdGhpcy5fdGltZSkgeyAvL2luIGNhc2UgdGhlcmUncyBhIGNhbGxiYWNrIGxpa2Ugb25Db21wbGV0ZSBpbiBhIG5lc3RlZCB0d2Vlbi90aW1lbGluZSB0aGF0IGNoYW5nZXMgdGhlIHBsYXloZWFkIHBvc2l0aW9uLCBsaWtlIHZpYSBzZWVrKCksIHdlIHNob3VsZCBqdXN0IGFib3J0LlxuXHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAod3JhcCkge1xuXHRcdFx0XHRcdHRoaXMuX2N5Y2xlID0gcHJldkN5Y2xlOyAvL2lmIHRoZXJlJ3MgYW4gb25SZXBlYXQsIHdlIHJldmVydGVkIHRoaXMgYWJvdmUsIHNvIG1ha2Ugc3VyZSBpdCdzIHNldCBwcm9wZXJseSBhZ2Fpbi4gV2UgYWxzbyB1bmxvY2tlZCBpbiB0aGF0IHNjZW5hcmlvLCBzbyByZXNldCB0aGF0IHRvby5cblx0XHRcdFx0XHR0aGlzLl9sb2NrZWQgPSB0cnVlO1xuXHRcdFx0XHRcdHByZXZUaW1lID0gKGJhY2t3YXJkcykgPyBkdXIgKyAwLjAwMDEgOiAtMC4wMDAxO1xuXHRcdFx0XHRcdHRoaXMucmVuZGVyKHByZXZUaW1lLCB0cnVlLCBmYWxzZSk7XG5cdFx0XHRcdH1cblx0XHRcdFx0dGhpcy5fbG9ja2VkID0gZmFsc2U7XG5cdFx0XHRcdGlmICh0aGlzLl9wYXVzZWQgJiYgIXByZXZQYXVzZWQpIHsgLy9pZiB0aGUgcmVuZGVyKCkgdHJpZ2dlcmVkIGNhbGxiYWNrIHRoYXQgcGF1c2VkIHRoaXMgdGltZWxpbmUsIHdlIHNob3VsZCBhYm9ydCAodmVyeSByYXJlLCBidXQgcG9zc2libGUpXG5cdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHRoaXMuX3RpbWUgPSByZWNUaW1lO1xuXHRcdFx0XHR0aGlzLl90b3RhbFRpbWUgPSByZWNUb3RhbFRpbWU7XG5cdFx0XHRcdHRoaXMuX2N5Y2xlID0gcmVjQ3ljbGU7XG5cdFx0XHRcdHRoaXMuX3Jhd1ByZXZUaW1lID0gcmVjUmF3UHJldlRpbWU7XG5cdFx0XHR9XG5cblx0XHRcdGlmICgodGhpcy5fdGltZSA9PT0gcHJldlRpbWUgfHwgIXRoaXMuX2ZpcnN0KSAmJiAhZm9yY2UgJiYgIWludGVybmFsRm9yY2UgJiYgIXBhdXNlVHdlZW4pIHtcblx0XHRcdFx0aWYgKHByZXZUb3RhbFRpbWUgIT09IHRoaXMuX3RvdGFsVGltZSkgaWYgKHRoaXMuX29uVXBkYXRlKSBpZiAoIXN1cHByZXNzRXZlbnRzKSB7IC8vc28gdGhhdCBvblVwZGF0ZSBmaXJlcyBldmVuIGR1cmluZyB0aGUgcmVwZWF0RGVsYXkgLSBhcyBsb25nIGFzIHRoZSB0b3RhbFRpbWUgY2hhbmdlZCwgd2Ugc2hvdWxkIHRyaWdnZXIgb25VcGRhdGUuXG5cdFx0XHRcdFx0dGhpcy5fY2FsbGJhY2soXCJvblVwZGF0ZVwiKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9IGVsc2UgaWYgKCF0aGlzLl9pbml0dGVkKSB7XG5cdFx0XHRcdHRoaXMuX2luaXR0ZWQgPSB0cnVlO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIXRoaXMuX2FjdGl2ZSkgaWYgKCF0aGlzLl9wYXVzZWQgJiYgdGhpcy5fdG90YWxUaW1lICE9PSBwcmV2VG90YWxUaW1lICYmIHRpbWUgPiAwKSB7XG5cdFx0XHRcdHRoaXMuX2FjdGl2ZSA9IHRydWU7ICAvL3NvIHRoYXQgaWYgdGhlIHVzZXIgcmVuZGVycyB0aGUgdGltZWxpbmUgKGFzIG9wcG9zZWQgdG8gdGhlIHBhcmVudCB0aW1lbGluZSByZW5kZXJpbmcgaXQpLCBpdCBpcyBmb3JjZWQgdG8gcmUtcmVuZGVyIGFuZCBhbGlnbiBpdCB3aXRoIHRoZSBwcm9wZXIgdGltZS9mcmFtZSBvbiB0aGUgbmV4dCByZW5kZXJpbmcgY3ljbGUuIE1heWJlIHRoZSB0aW1lbGluZSBhbHJlYWR5IGZpbmlzaGVkIGJ1dCB0aGUgdXNlciBtYW51YWxseSByZS1yZW5kZXJzIGl0IGFzIGhhbGZ3YXkgZG9uZSwgZm9yIGV4YW1wbGUuXG5cdFx0XHR9XG5cblx0XHRcdGlmIChwcmV2VG90YWxUaW1lID09PSAwKSBpZiAodGhpcy52YXJzLm9uU3RhcnQpIGlmICh0aGlzLl90b3RhbFRpbWUgIT09IDAgfHwgIXRoaXMuX3RvdGFsRHVyYXRpb24pIGlmICghc3VwcHJlc3NFdmVudHMpIHtcblx0XHRcdFx0dGhpcy5fY2FsbGJhY2soXCJvblN0YXJ0XCIpO1xuXHRcdFx0fVxuXG5cdFx0XHRjdXJUaW1lID0gdGhpcy5fdGltZTtcblx0XHRcdGlmIChjdXJUaW1lID49IHByZXZUaW1lKSB7XG5cdFx0XHRcdHR3ZWVuID0gdGhpcy5fZmlyc3Q7XG5cdFx0XHRcdHdoaWxlICh0d2Vlbikge1xuXHRcdFx0XHRcdG5leHQgPSB0d2Vlbi5fbmV4dDsgLy9yZWNvcmQgaXQgaGVyZSBiZWNhdXNlIHRoZSB2YWx1ZSBjb3VsZCBjaGFuZ2UgYWZ0ZXIgcmVuZGVyaW5nLi4uXG5cdFx0XHRcdFx0aWYgKGN1clRpbWUgIT09IHRoaXMuX3RpbWUgfHwgKHRoaXMuX3BhdXNlZCAmJiAhcHJldlBhdXNlZCkpIHsgLy9pbiBjYXNlIGEgdHdlZW4gcGF1c2VzIG9yIHNlZWtzIHRoZSB0aW1lbGluZSB3aGVuIHJlbmRlcmluZywgbGlrZSBpbnNpZGUgb2YgYW4gb25VcGRhdGUvb25Db21wbGV0ZVxuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0fSBlbHNlIGlmICh0d2Vlbi5fYWN0aXZlIHx8ICh0d2Vlbi5fc3RhcnRUaW1lIDw9IHRoaXMuX3RpbWUgJiYgIXR3ZWVuLl9wYXVzZWQgJiYgIXR3ZWVuLl9nYykpIHtcblx0XHRcdFx0XHRcdGlmIChwYXVzZVR3ZWVuID09PSB0d2Vlbikge1xuXHRcdFx0XHRcdFx0XHR0aGlzLnBhdXNlKCk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRpZiAoIXR3ZWVuLl9yZXZlcnNlZCkge1xuXHRcdFx0XHRcdFx0XHR0d2Vlbi5yZW5kZXIoKHRpbWUgLSB0d2Vlbi5fc3RhcnRUaW1lKSAqIHR3ZWVuLl90aW1lU2NhbGUsIHN1cHByZXNzRXZlbnRzLCBmb3JjZSk7XG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHR0d2Vlbi5yZW5kZXIoKCghdHdlZW4uX2RpcnR5KSA/IHR3ZWVuLl90b3RhbER1cmF0aW9uIDogdHdlZW4udG90YWxEdXJhdGlvbigpKSAtICgodGltZSAtIHR3ZWVuLl9zdGFydFRpbWUpICogdHdlZW4uX3RpbWVTY2FsZSksIHN1cHByZXNzRXZlbnRzLCBmb3JjZSk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHR3ZWVuID0gbmV4dDtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0dHdlZW4gPSB0aGlzLl9sYXN0O1xuXHRcdFx0XHR3aGlsZSAodHdlZW4pIHtcblx0XHRcdFx0XHRuZXh0ID0gdHdlZW4uX3ByZXY7IC8vcmVjb3JkIGl0IGhlcmUgYmVjYXVzZSB0aGUgdmFsdWUgY291bGQgY2hhbmdlIGFmdGVyIHJlbmRlcmluZy4uLlxuXHRcdFx0XHRcdGlmIChjdXJUaW1lICE9PSB0aGlzLl90aW1lIHx8ICh0aGlzLl9wYXVzZWQgJiYgIXByZXZQYXVzZWQpKSB7IC8vaW4gY2FzZSBhIHR3ZWVuIHBhdXNlcyBvciBzZWVrcyB0aGUgdGltZWxpbmUgd2hlbiByZW5kZXJpbmcsIGxpa2UgaW5zaWRlIG9mIGFuIG9uVXBkYXRlL29uQ29tcGxldGVcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdH0gZWxzZSBpZiAodHdlZW4uX2FjdGl2ZSB8fCAodHdlZW4uX3N0YXJ0VGltZSA8PSBwcmV2VGltZSAmJiAhdHdlZW4uX3BhdXNlZCAmJiAhdHdlZW4uX2djKSkge1xuXHRcdFx0XHRcdFx0aWYgKHBhdXNlVHdlZW4gPT09IHR3ZWVuKSB7XG5cdFx0XHRcdFx0XHRcdHBhdXNlVHdlZW4gPSB0d2Vlbi5fcHJldjsgLy90aGUgbGlua2VkIGxpc3QgaXMgb3JnYW5pemVkIGJ5IF9zdGFydFRpbWUsIHRodXMgaXQncyBwb3NzaWJsZSB0aGF0IGEgdHdlZW4gY291bGQgc3RhcnQgQkVGT1JFIHRoZSBwYXVzZSBhbmQgZW5kIGFmdGVyIGl0LCBpbiB3aGljaCBjYXNlIGl0IHdvdWxkIGJlIHBvc2l0aW9uZWQgYmVmb3JlIHRoZSBwYXVzZSB0d2VlbiBpbiB0aGUgbGlua2VkIGxpc3QsIGJ1dCB3ZSBzaG91bGQgcmVuZGVyIGl0IGJlZm9yZSB3ZSBwYXVzZSgpIHRoZSB0aW1lbGluZSBhbmQgY2Vhc2UgcmVuZGVyaW5nLiBUaGlzIGlzIG9ubHkgYSBjb25jZXJuIHdoZW4gZ29pbmcgaW4gcmV2ZXJzZS5cblx0XHRcdFx0XHRcdFx0d2hpbGUgKHBhdXNlVHdlZW4gJiYgcGF1c2VUd2Vlbi5lbmRUaW1lKCkgPiB0aGlzLl90aW1lKSB7XG5cdFx0XHRcdFx0XHRcdFx0cGF1c2VUd2Vlbi5yZW5kZXIoIChwYXVzZVR3ZWVuLl9yZXZlcnNlZCA/IHBhdXNlVHdlZW4udG90YWxEdXJhdGlvbigpIC0gKCh0aW1lIC0gcGF1c2VUd2Vlbi5fc3RhcnRUaW1lKSAqIHBhdXNlVHdlZW4uX3RpbWVTY2FsZSkgOiAodGltZSAtIHBhdXNlVHdlZW4uX3N0YXJ0VGltZSkgKiBwYXVzZVR3ZWVuLl90aW1lU2NhbGUpLCBzdXBwcmVzc0V2ZW50cywgZm9yY2UpO1xuXHRcdFx0XHRcdFx0XHRcdHBhdXNlVHdlZW4gPSBwYXVzZVR3ZWVuLl9wcmV2O1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdHBhdXNlVHdlZW4gPSBudWxsO1xuXHRcdFx0XHRcdFx0XHR0aGlzLnBhdXNlKCk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRpZiAoIXR3ZWVuLl9yZXZlcnNlZCkge1xuXHRcdFx0XHRcdFx0XHR0d2Vlbi5yZW5kZXIoKHRpbWUgLSB0d2Vlbi5fc3RhcnRUaW1lKSAqIHR3ZWVuLl90aW1lU2NhbGUsIHN1cHByZXNzRXZlbnRzLCBmb3JjZSk7XG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHR0d2Vlbi5yZW5kZXIoKCghdHdlZW4uX2RpcnR5KSA/IHR3ZWVuLl90b3RhbER1cmF0aW9uIDogdHdlZW4udG90YWxEdXJhdGlvbigpKSAtICgodGltZSAtIHR3ZWVuLl9zdGFydFRpbWUpICogdHdlZW4uX3RpbWVTY2FsZSksIHN1cHByZXNzRXZlbnRzLCBmb3JjZSk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHR3ZWVuID0gbmV4dDtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRpZiAodGhpcy5fb25VcGRhdGUpIGlmICghc3VwcHJlc3NFdmVudHMpIHtcblx0XHRcdFx0aWYgKF9sYXp5VHdlZW5zLmxlbmd0aCkgeyAvL2luIGNhc2UgcmVuZGVyaW5nIGNhdXNlZCBhbnkgdHdlZW5zIHRvIGxhenktaW5pdCwgd2Ugc2hvdWxkIHJlbmRlciB0aGVtIGJlY2F1c2UgdHlwaWNhbGx5IHdoZW4gYSB0aW1lbGluZSBmaW5pc2hlcywgdXNlcnMgZXhwZWN0IHRoaW5ncyB0byBoYXZlIHJlbmRlcmVkIGZ1bGx5LiBJbWFnaW5lIGFuIG9uVXBkYXRlIG9uIGEgdGltZWxpbmUgdGhhdCByZXBvcnRzL2NoZWNrcyB0d2VlbmVkIHZhbHVlcy5cblx0XHRcdFx0XHRfbGF6eVJlbmRlcigpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHRoaXMuX2NhbGxiYWNrKFwib25VcGRhdGVcIik7XG5cdFx0XHR9XG5cdFx0XHRpZiAoY2FsbGJhY2spIGlmICghdGhpcy5fbG9ja2VkKSBpZiAoIXRoaXMuX2djKSBpZiAocHJldlN0YXJ0ID09PSB0aGlzLl9zdGFydFRpbWUgfHwgcHJldlRpbWVTY2FsZSAhPT0gdGhpcy5fdGltZVNjYWxlKSBpZiAodGhpcy5fdGltZSA9PT0gMCB8fCB0b3RhbER1ciA+PSB0aGlzLnRvdGFsRHVyYXRpb24oKSkgeyAvL2lmIG9uZSBvZiB0aGUgdHdlZW5zIHRoYXQgd2FzIHJlbmRlcmVkIGFsdGVyZWQgdGhpcyB0aW1lbGluZSdzIHN0YXJ0VGltZSAobGlrZSBpZiBhbiBvbkNvbXBsZXRlIHJldmVyc2VkIHRoZSB0aW1lbGluZSksIGl0IHByb2JhYmx5IGlzbid0IGNvbXBsZXRlLiBJZiBpdCBpcywgZG9uJ3Qgd29ycnksIGJlY2F1c2Ugd2hhdGV2ZXIgY2FsbCBhbHRlcmVkIHRoZSBzdGFydFRpbWUgd291bGQgY29tcGxldGUgaWYgaXQgd2FzIG5lY2Vzc2FyeSBhdCB0aGUgbmV3IHRpbWUuIFRoZSBvbmx5IGV4Y2VwdGlvbiBpcyB0aGUgdGltZVNjYWxlIHByb3BlcnR5LiBBbHNvIGNoZWNrIF9nYyBiZWNhdXNlIHRoZXJlJ3MgYSBjaGFuY2UgdGhhdCBraWxsKCkgY291bGQgYmUgY2FsbGVkIGluIGFuIG9uVXBkYXRlXG5cdFx0XHRcdGlmIChpc0NvbXBsZXRlKSB7XG5cdFx0XHRcdFx0aWYgKF9sYXp5VHdlZW5zLmxlbmd0aCkgeyAvL2luIGNhc2UgcmVuZGVyaW5nIGNhdXNlZCBhbnkgdHdlZW5zIHRvIGxhenktaW5pdCwgd2Ugc2hvdWxkIHJlbmRlciB0aGVtIGJlY2F1c2UgdHlwaWNhbGx5IHdoZW4gYSB0aW1lbGluZSBmaW5pc2hlcywgdXNlcnMgZXhwZWN0IHRoaW5ncyB0byBoYXZlIHJlbmRlcmVkIGZ1bGx5LiBJbWFnaW5lIGFuIG9uQ29tcGxldGUgb24gYSB0aW1lbGluZSB0aGF0IHJlcG9ydHMvY2hlY2tzIHR3ZWVuZWQgdmFsdWVzLlxuXHRcdFx0XHRcdFx0X2xhenlSZW5kZXIoKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0aWYgKHRoaXMuX3RpbWVsaW5lLmF1dG9SZW1vdmVDaGlsZHJlbikge1xuXHRcdFx0XHRcdFx0dGhpcy5fZW5hYmxlZChmYWxzZSwgZmFsc2UpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHR0aGlzLl9hY3RpdmUgPSBmYWxzZTtcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAoIXN1cHByZXNzRXZlbnRzICYmIHRoaXMudmFyc1tjYWxsYmFja10pIHtcblx0XHRcdFx0XHR0aGlzLl9jYWxsYmFjayhjYWxsYmFjayk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9O1xuXG5cdFx0cC5nZXRBY3RpdmUgPSBmdW5jdGlvbihuZXN0ZWQsIHR3ZWVucywgdGltZWxpbmVzKSB7XG5cdFx0XHRpZiAobmVzdGVkID09IG51bGwpIHtcblx0XHRcdFx0bmVzdGVkID0gdHJ1ZTtcblx0XHRcdH1cblx0XHRcdGlmICh0d2VlbnMgPT0gbnVsbCkge1xuXHRcdFx0XHR0d2VlbnMgPSB0cnVlO1xuXHRcdFx0fVxuXHRcdFx0aWYgKHRpbWVsaW5lcyA9PSBudWxsKSB7XG5cdFx0XHRcdHRpbWVsaW5lcyA9IGZhbHNlO1xuXHRcdFx0fVxuXHRcdFx0dmFyIGEgPSBbXSxcblx0XHRcdFx0YWxsID0gdGhpcy5nZXRDaGlsZHJlbihuZXN0ZWQsIHR3ZWVucywgdGltZWxpbmVzKSxcblx0XHRcdFx0Y250ID0gMCxcblx0XHRcdFx0bCA9IGFsbC5sZW5ndGgsXG5cdFx0XHRcdGksIHR3ZWVuO1xuXHRcdFx0Zm9yIChpID0gMDsgaSA8IGw7IGkrKykge1xuXHRcdFx0XHR0d2VlbiA9IGFsbFtpXTtcblx0XHRcdFx0aWYgKHR3ZWVuLmlzQWN0aXZlKCkpIHtcblx0XHRcdFx0XHRhW2NudCsrXSA9IHR3ZWVuO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gYTtcblx0XHR9O1xuXG5cblx0XHRwLmdldExhYmVsQWZ0ZXIgPSBmdW5jdGlvbih0aW1lKSB7XG5cdFx0XHRpZiAoIXRpbWUpIGlmICh0aW1lICE9PSAwKSB7IC8vZmFzdGVyIHRoYW4gaXNOYW4oKVxuXHRcdFx0XHR0aW1lID0gdGhpcy5fdGltZTtcblx0XHRcdH1cblx0XHRcdHZhciBsYWJlbHMgPSB0aGlzLmdldExhYmVsc0FycmF5KCksXG5cdFx0XHRcdGwgPSBsYWJlbHMubGVuZ3RoLFxuXHRcdFx0XHRpO1xuXHRcdFx0Zm9yIChpID0gMDsgaSA8IGw7IGkrKykge1xuXHRcdFx0XHRpZiAobGFiZWxzW2ldLnRpbWUgPiB0aW1lKSB7XG5cdFx0XHRcdFx0cmV0dXJuIGxhYmVsc1tpXS5uYW1lO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gbnVsbDtcblx0XHR9O1xuXG5cdFx0cC5nZXRMYWJlbEJlZm9yZSA9IGZ1bmN0aW9uKHRpbWUpIHtcblx0XHRcdGlmICh0aW1lID09IG51bGwpIHtcblx0XHRcdFx0dGltZSA9IHRoaXMuX3RpbWU7XG5cdFx0XHR9XG5cdFx0XHR2YXIgbGFiZWxzID0gdGhpcy5nZXRMYWJlbHNBcnJheSgpLFxuXHRcdFx0XHRpID0gbGFiZWxzLmxlbmd0aDtcblx0XHRcdHdoaWxlICgtLWkgPiAtMSkge1xuXHRcdFx0XHRpZiAobGFiZWxzW2ldLnRpbWUgPCB0aW1lKSB7XG5cdFx0XHRcdFx0cmV0dXJuIGxhYmVsc1tpXS5uYW1lO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gbnVsbDtcblx0XHR9O1xuXG5cdFx0cC5nZXRMYWJlbHNBcnJheSA9IGZ1bmN0aW9uKCkge1xuXHRcdFx0dmFyIGEgPSBbXSxcblx0XHRcdFx0Y250ID0gMCxcblx0XHRcdFx0cDtcblx0XHRcdGZvciAocCBpbiB0aGlzLl9sYWJlbHMpIHtcblx0XHRcdFx0YVtjbnQrK10gPSB7dGltZTp0aGlzLl9sYWJlbHNbcF0sIG5hbWU6cH07XG5cdFx0XHR9XG5cdFx0XHRhLnNvcnQoZnVuY3Rpb24oYSxiKSB7XG5cdFx0XHRcdHJldHVybiBhLnRpbWUgLSBiLnRpbWU7XG5cdFx0XHR9KTtcblx0XHRcdHJldHVybiBhO1xuXHRcdH07XG5cblx0XHRwLmludmFsaWRhdGUgPSBmdW5jdGlvbigpIHtcblx0XHRcdHRoaXMuX2xvY2tlZCA9IGZhbHNlOyAvL3VubG9jayBhbmQgc2V0IGN5Y2xlIGluIGNhc2UgaW52YWxpZGF0ZSgpIGlzIGNhbGxlZCBmcm9tIGluc2lkZSBhbiBvblJlcGVhdFxuXHRcdFx0cmV0dXJuIFRpbWVsaW5lTGl0ZS5wcm90b3R5cGUuaW52YWxpZGF0ZS5jYWxsKHRoaXMpO1xuXHRcdH07XG5cblxuLy8tLS0tIEdFVFRFUlMgLyBTRVRURVJTIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuXHRcdHAucHJvZ3Jlc3MgPSBmdW5jdGlvbih2YWx1ZSwgc3VwcHJlc3NFdmVudHMpIHtcblx0XHRcdHJldHVybiAoIWFyZ3VtZW50cy5sZW5ndGgpID8gKHRoaXMuX3RpbWUgLyB0aGlzLmR1cmF0aW9uKCkpIHx8IDAgOiB0aGlzLnRvdGFsVGltZSggdGhpcy5kdXJhdGlvbigpICogKCh0aGlzLl95b3lvICYmICh0aGlzLl9jeWNsZSAmIDEpICE9PSAwKSA/IDEgLSB2YWx1ZSA6IHZhbHVlKSArICh0aGlzLl9jeWNsZSAqICh0aGlzLl9kdXJhdGlvbiArIHRoaXMuX3JlcGVhdERlbGF5KSksIHN1cHByZXNzRXZlbnRzKTtcblx0XHR9O1xuXG5cdFx0cC50b3RhbFByb2dyZXNzID0gZnVuY3Rpb24odmFsdWUsIHN1cHByZXNzRXZlbnRzKSB7XG5cdFx0XHRyZXR1cm4gKCFhcmd1bWVudHMubGVuZ3RoKSA/ICh0aGlzLl90b3RhbFRpbWUgLyB0aGlzLnRvdGFsRHVyYXRpb24oKSkgfHwgMCA6IHRoaXMudG90YWxUaW1lKCB0aGlzLnRvdGFsRHVyYXRpb24oKSAqIHZhbHVlLCBzdXBwcmVzc0V2ZW50cyk7XG5cdFx0fTtcblxuXHRcdHAudG90YWxEdXJhdGlvbiA9IGZ1bmN0aW9uKHZhbHVlKSB7XG5cdFx0XHRpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHtcblx0XHRcdFx0aWYgKHRoaXMuX2RpcnR5KSB7XG5cdFx0XHRcdFx0VGltZWxpbmVMaXRlLnByb3RvdHlwZS50b3RhbER1cmF0aW9uLmNhbGwodGhpcyk7IC8vanVzdCBmb3JjZXMgcmVmcmVzaFxuXHRcdFx0XHRcdC8vSW5zdGVhZCBvZiBJbmZpbml0eSwgd2UgdXNlIDk5OTk5OTk5OTk5OSBzbyB0aGF0IHdlIGNhbiBhY2NvbW1vZGF0ZSByZXZlcnNlcy5cblx0XHRcdFx0XHR0aGlzLl90b3RhbER1cmF0aW9uID0gKHRoaXMuX3JlcGVhdCA9PT0gLTEpID8gOTk5OTk5OTk5OTk5IDogdGhpcy5fZHVyYXRpb24gKiAodGhpcy5fcmVwZWF0ICsgMSkgKyAodGhpcy5fcmVwZWF0RGVsYXkgKiB0aGlzLl9yZXBlYXQpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiB0aGlzLl90b3RhbER1cmF0aW9uO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuICh0aGlzLl9yZXBlYXQgPT09IC0xIHx8ICF2YWx1ZSkgPyB0aGlzIDogdGhpcy50aW1lU2NhbGUoIHRoaXMudG90YWxEdXJhdGlvbigpIC8gdmFsdWUgKTtcblx0XHR9O1xuXG5cdFx0cC50aW1lID0gZnVuY3Rpb24odmFsdWUsIHN1cHByZXNzRXZlbnRzKSB7XG5cdFx0XHRpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHtcblx0XHRcdFx0cmV0dXJuIHRoaXMuX3RpbWU7XG5cdFx0XHR9XG5cdFx0XHRpZiAodGhpcy5fZGlydHkpIHtcblx0XHRcdFx0dGhpcy50b3RhbER1cmF0aW9uKCk7XG5cdFx0XHR9XG5cdFx0XHRpZiAodmFsdWUgPiB0aGlzLl9kdXJhdGlvbikge1xuXHRcdFx0XHR2YWx1ZSA9IHRoaXMuX2R1cmF0aW9uO1xuXHRcdFx0fVxuXHRcdFx0aWYgKHRoaXMuX3lveW8gJiYgKHRoaXMuX2N5Y2xlICYgMSkgIT09IDApIHtcblx0XHRcdFx0dmFsdWUgPSAodGhpcy5fZHVyYXRpb24gLSB2YWx1ZSkgKyAodGhpcy5fY3ljbGUgKiAodGhpcy5fZHVyYXRpb24gKyB0aGlzLl9yZXBlYXREZWxheSkpO1xuXHRcdFx0fSBlbHNlIGlmICh0aGlzLl9yZXBlYXQgIT09IDApIHtcblx0XHRcdFx0dmFsdWUgKz0gdGhpcy5fY3ljbGUgKiAodGhpcy5fZHVyYXRpb24gKyB0aGlzLl9yZXBlYXREZWxheSk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gdGhpcy50b3RhbFRpbWUodmFsdWUsIHN1cHByZXNzRXZlbnRzKTtcblx0XHR9O1xuXG5cdFx0cC5yZXBlYXQgPSBmdW5jdGlvbih2YWx1ZSkge1xuXHRcdFx0aWYgKCFhcmd1bWVudHMubGVuZ3RoKSB7XG5cdFx0XHRcdHJldHVybiB0aGlzLl9yZXBlYXQ7XG5cdFx0XHR9XG5cdFx0XHR0aGlzLl9yZXBlYXQgPSB2YWx1ZTtcblx0XHRcdHJldHVybiB0aGlzLl91bmNhY2hlKHRydWUpO1xuXHRcdH07XG5cblx0XHRwLnJlcGVhdERlbGF5ID0gZnVuY3Rpb24odmFsdWUpIHtcblx0XHRcdGlmICghYXJndW1lbnRzLmxlbmd0aCkge1xuXHRcdFx0XHRyZXR1cm4gdGhpcy5fcmVwZWF0RGVsYXk7XG5cdFx0XHR9XG5cdFx0XHR0aGlzLl9yZXBlYXREZWxheSA9IHZhbHVlO1xuXHRcdFx0cmV0dXJuIHRoaXMuX3VuY2FjaGUodHJ1ZSk7XG5cdFx0fTtcblxuXHRcdHAueW95byA9IGZ1bmN0aW9uKHZhbHVlKSB7XG5cdFx0XHRpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHtcblx0XHRcdFx0cmV0dXJuIHRoaXMuX3lveW87XG5cdFx0XHR9XG5cdFx0XHR0aGlzLl95b3lvID0gdmFsdWU7XG5cdFx0XHRyZXR1cm4gdGhpcztcblx0XHR9O1xuXG5cdFx0cC5jdXJyZW50TGFiZWwgPSBmdW5jdGlvbih2YWx1ZSkge1xuXHRcdFx0aWYgKCFhcmd1bWVudHMubGVuZ3RoKSB7XG5cdFx0XHRcdHJldHVybiB0aGlzLmdldExhYmVsQmVmb3JlKHRoaXMuX3RpbWUgKyAwLjAwMDAwMDAxKTtcblx0XHRcdH1cblx0XHRcdHJldHVybiB0aGlzLnNlZWsodmFsdWUsIHRydWUpO1xuXHRcdH07XG5cblx0XHRyZXR1cm4gVGltZWxpbmVNYXg7XG5cblx0fSwgdHJ1ZSk7XG5cdFxuXG5cblxuXG5cdFxuXHRcblx0XG5cdFxuXHRcblxuXHRcbi8qXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBCZXppZXJQbHVnaW5cbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqL1xuXHQoZnVuY3Rpb24oKSB7XG5cblx0XHR2YXIgX1JBRDJERUcgPSAxODAgLyBNYXRoLlBJLFxuXHRcdFx0X3IxID0gW10sXG5cdFx0XHRfcjIgPSBbXSxcblx0XHRcdF9yMyA9IFtdLFxuXHRcdFx0X2NvclByb3BzID0ge30sXG5cdFx0XHRfZ2xvYmFscyA9IF9nc1Njb3BlLl9nc0RlZmluZS5nbG9iYWxzLFxuXHRcdFx0U2VnbWVudCA9IGZ1bmN0aW9uKGEsIGIsIGMsIGQpIHtcblx0XHRcdFx0aWYgKGMgPT09IGQpIHsgLy9pZiBjIGFuZCBkIG1hdGNoLCB0aGUgZmluYWwgYXV0b1JvdGF0ZSB2YWx1ZSBjb3VsZCBsb2NrIGF0IC05MCBkZWdyZWVzLCBzbyBkaWZmZXJlbnRpYXRlIHRoZW0gc2xpZ2h0bHkuXG5cdFx0XHRcdFx0YyA9IGQgLSAoZCAtIGIpIC8gMTAwMDAwMDtcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAoYSA9PT0gYikgeyAvL2lmIGEgYW5kIGIgbWF0Y2gsIHRoZSBzdGFydGluZyBhdXRvUm90YXRlIHZhbHVlIGNvdWxkIGxvY2sgYXQgLTkwIGRlZ3JlZXMsIHNvIGRpZmZlcmVudGlhdGUgdGhlbSBzbGlnaHRseS5cblx0XHRcdFx0XHRiID0gYSArIChjIC0gYSkgLyAxMDAwMDAwO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHRoaXMuYSA9IGE7XG5cdFx0XHRcdHRoaXMuYiA9IGI7XG5cdFx0XHRcdHRoaXMuYyA9IGM7XG5cdFx0XHRcdHRoaXMuZCA9IGQ7XG5cdFx0XHRcdHRoaXMuZGEgPSBkIC0gYTtcblx0XHRcdFx0dGhpcy5jYSA9IGMgLSBhO1xuXHRcdFx0XHR0aGlzLmJhID0gYiAtIGE7XG5cdFx0XHR9LFxuXHRcdFx0X2NvcnJlbGF0ZSA9IFwiLHgseSx6LGxlZnQsdG9wLHJpZ2h0LGJvdHRvbSxtYXJnaW5Ub3AsbWFyZ2luTGVmdCxtYXJnaW5SaWdodCxtYXJnaW5Cb3R0b20scGFkZGluZ0xlZnQscGFkZGluZ1RvcCxwYWRkaW5nUmlnaHQscGFkZGluZ0JvdHRvbSxiYWNrZ3JvdW5kUG9zaXRpb24sYmFja2dyb3VuZFBvc2l0aW9uX3ksXCIsXG5cdFx0XHRjdWJpY1RvUXVhZHJhdGljID0gZnVuY3Rpb24oYSwgYiwgYywgZCkge1xuXHRcdFx0XHR2YXIgcTEgPSB7YTphfSxcblx0XHRcdFx0XHRxMiA9IHt9LFxuXHRcdFx0XHRcdHEzID0ge30sXG5cdFx0XHRcdFx0cTQgPSB7YzpkfSxcblx0XHRcdFx0XHRtYWIgPSAoYSArIGIpIC8gMixcblx0XHRcdFx0XHRtYmMgPSAoYiArIGMpIC8gMixcblx0XHRcdFx0XHRtY2QgPSAoYyArIGQpIC8gMixcblx0XHRcdFx0XHRtYWJjID0gKG1hYiArIG1iYykgLyAyLFxuXHRcdFx0XHRcdG1iY2QgPSAobWJjICsgbWNkKSAvIDIsXG5cdFx0XHRcdFx0bTggPSAobWJjZCAtIG1hYmMpIC8gODtcblx0XHRcdFx0cTEuYiA9IG1hYiArIChhIC0gbWFiKSAvIDQ7XG5cdFx0XHRcdHEyLmIgPSBtYWJjICsgbTg7XG5cdFx0XHRcdHExLmMgPSBxMi5hID0gKHExLmIgKyBxMi5iKSAvIDI7XG5cdFx0XHRcdHEyLmMgPSBxMy5hID0gKG1hYmMgKyBtYmNkKSAvIDI7XG5cdFx0XHRcdHEzLmIgPSBtYmNkIC0gbTg7XG5cdFx0XHRcdHE0LmIgPSBtY2QgKyAoZCAtIG1jZCkgLyA0O1xuXHRcdFx0XHRxMy5jID0gcTQuYSA9IChxMy5iICsgcTQuYikgLyAyO1xuXHRcdFx0XHRyZXR1cm4gW3ExLCBxMiwgcTMsIHE0XTtcblx0XHRcdH0sXG5cdFx0XHRfY2FsY3VsYXRlQ29udHJvbFBvaW50cyA9IGZ1bmN0aW9uKGEsIGN1cnZpbmVzcywgcXVhZCwgYmFzaWMsIGNvcnJlbGF0ZSkge1xuXHRcdFx0XHR2YXIgbCA9IGEubGVuZ3RoIC0gMSxcblx0XHRcdFx0XHRpaSA9IDAsXG5cdFx0XHRcdFx0Y3AxID0gYVswXS5hLFxuXHRcdFx0XHRcdGksIHAxLCBwMiwgcDMsIHNlZywgbTEsIG0yLCBtbSwgY3AyLCBxYiwgcjEsIHIyLCB0bDtcblx0XHRcdFx0Zm9yIChpID0gMDsgaSA8IGw7IGkrKykge1xuXHRcdFx0XHRcdHNlZyA9IGFbaWldO1xuXHRcdFx0XHRcdHAxID0gc2VnLmE7XG5cdFx0XHRcdFx0cDIgPSBzZWcuZDtcblx0XHRcdFx0XHRwMyA9IGFbaWkrMV0uZDtcblxuXHRcdFx0XHRcdGlmIChjb3JyZWxhdGUpIHtcblx0XHRcdFx0XHRcdHIxID0gX3IxW2ldO1xuXHRcdFx0XHRcdFx0cjIgPSBfcjJbaV07XG5cdFx0XHRcdFx0XHR0bCA9ICgocjIgKyByMSkgKiBjdXJ2aW5lc3MgKiAwLjI1KSAvIChiYXNpYyA/IDAuNSA6IF9yM1tpXSB8fCAwLjUpO1xuXHRcdFx0XHRcdFx0bTEgPSBwMiAtIChwMiAtIHAxKSAqIChiYXNpYyA/IGN1cnZpbmVzcyAqIDAuNSA6IChyMSAhPT0gMCA/IHRsIC8gcjEgOiAwKSk7XG5cdFx0XHRcdFx0XHRtMiA9IHAyICsgKHAzIC0gcDIpICogKGJhc2ljID8gY3VydmluZXNzICogMC41IDogKHIyICE9PSAwID8gdGwgLyByMiA6IDApKTtcblx0XHRcdFx0XHRcdG1tID0gcDIgLSAobTEgKyAoKChtMiAtIG0xKSAqICgocjEgKiAzIC8gKHIxICsgcjIpKSArIDAuNSkgLyA0KSB8fCAwKSk7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdG0xID0gcDIgLSAocDIgLSBwMSkgKiBjdXJ2aW5lc3MgKiAwLjU7XG5cdFx0XHRcdFx0XHRtMiA9IHAyICsgKHAzIC0gcDIpICogY3VydmluZXNzICogMC41O1xuXHRcdFx0XHRcdFx0bW0gPSBwMiAtIChtMSArIG0yKSAvIDI7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdG0xICs9IG1tO1xuXHRcdFx0XHRcdG0yICs9IG1tO1xuXG5cdFx0XHRcdFx0c2VnLmMgPSBjcDIgPSBtMTtcblx0XHRcdFx0XHRpZiAoaSAhPT0gMCkge1xuXHRcdFx0XHRcdFx0c2VnLmIgPSBjcDE7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdHNlZy5iID0gY3AxID0gc2VnLmEgKyAoc2VnLmMgLSBzZWcuYSkgKiAwLjY7IC8vaW5zdGVhZCBvZiBwbGFjaW5nIGIgb24gYSBleGFjdGx5LCB3ZSBtb3ZlIGl0IGlubGluZSB3aXRoIGMgc28gdGhhdCBpZiB0aGUgdXNlciBzcGVjaWZpZXMgYW4gZWFzZSBsaWtlIEJhY2suZWFzZUluIG9yIEVsYXN0aWMuZWFzZUluIHdoaWNoIGdvZXMgQkVZT05EIHRoZSBiZWdpbm5pbmcsIGl0IHdpbGwgZG8gc28gc21vb3RobHkuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0c2VnLmRhID0gcDIgLSBwMTtcblx0XHRcdFx0XHRzZWcuY2EgPSBjcDIgLSBwMTtcblx0XHRcdFx0XHRzZWcuYmEgPSBjcDEgLSBwMTtcblxuXHRcdFx0XHRcdGlmIChxdWFkKSB7XG5cdFx0XHRcdFx0XHRxYiA9IGN1YmljVG9RdWFkcmF0aWMocDEsIGNwMSwgY3AyLCBwMik7XG5cdFx0XHRcdFx0XHRhLnNwbGljZShpaSwgMSwgcWJbMF0sIHFiWzFdLCBxYlsyXSwgcWJbM10pO1xuXHRcdFx0XHRcdFx0aWkgKz0gNDtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0aWkrKztcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRjcDEgPSBtMjtcblx0XHRcdFx0fVxuXHRcdFx0XHRzZWcgPSBhW2lpXTtcblx0XHRcdFx0c2VnLmIgPSBjcDE7XG5cdFx0XHRcdHNlZy5jID0gY3AxICsgKHNlZy5kIC0gY3AxKSAqIDAuNDsgLy9pbnN0ZWFkIG9mIHBsYWNpbmcgYyBvbiBkIGV4YWN0bHksIHdlIG1vdmUgaXQgaW5saW5lIHdpdGggYiBzbyB0aGF0IGlmIHRoZSB1c2VyIHNwZWNpZmllcyBhbiBlYXNlIGxpa2UgQmFjay5lYXNlT3V0IG9yIEVsYXN0aWMuZWFzZU91dCB3aGljaCBnb2VzIEJFWU9ORCB0aGUgZW5kLCBpdCB3aWxsIGRvIHNvIHNtb290aGx5LlxuXHRcdFx0XHRzZWcuZGEgPSBzZWcuZCAtIHNlZy5hO1xuXHRcdFx0XHRzZWcuY2EgPSBzZWcuYyAtIHNlZy5hO1xuXHRcdFx0XHRzZWcuYmEgPSBjcDEgLSBzZWcuYTtcblx0XHRcdFx0aWYgKHF1YWQpIHtcblx0XHRcdFx0XHRxYiA9IGN1YmljVG9RdWFkcmF0aWMoc2VnLmEsIGNwMSwgc2VnLmMsIHNlZy5kKTtcblx0XHRcdFx0XHRhLnNwbGljZShpaSwgMSwgcWJbMF0sIHFiWzFdLCBxYlsyXSwgcWJbM10pO1xuXHRcdFx0XHR9XG5cdFx0XHR9LFxuXHRcdFx0X3BhcnNlQW5jaG9ycyA9IGZ1bmN0aW9uKHZhbHVlcywgcCwgY29ycmVsYXRlLCBwcmVwZW5kKSB7XG5cdFx0XHRcdHZhciBhID0gW10sXG5cdFx0XHRcdFx0bCwgaSwgcDEsIHAyLCBwMywgdG1wO1xuXHRcdFx0XHRpZiAocHJlcGVuZCkge1xuXHRcdFx0XHRcdHZhbHVlcyA9IFtwcmVwZW5kXS5jb25jYXQodmFsdWVzKTtcblx0XHRcdFx0XHRpID0gdmFsdWVzLmxlbmd0aDtcblx0XHRcdFx0XHR3aGlsZSAoLS1pID4gLTEpIHtcblx0XHRcdFx0XHRcdGlmICh0eXBlb2YoICh0bXAgPSB2YWx1ZXNbaV1bcF0pICkgPT09IFwic3RyaW5nXCIpIGlmICh0bXAuY2hhckF0KDEpID09PSBcIj1cIikge1xuXHRcdFx0XHRcdFx0XHR2YWx1ZXNbaV1bcF0gPSBwcmVwZW5kW3BdICsgTnVtYmVyKHRtcC5jaGFyQXQoMCkgKyB0bXAuc3Vic3RyKDIpKTsgLy9hY2NvbW1vZGF0ZSByZWxhdGl2ZSB2YWx1ZXMuIERvIGl0IGlubGluZSBpbnN0ZWFkIG9mIGJyZWFraW5nIGl0IG91dCBpbnRvIGEgZnVuY3Rpb24gZm9yIHNwZWVkIHJlYXNvbnNcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0bCA9IHZhbHVlcy5sZW5ndGggLSAyO1xuXHRcdFx0XHRpZiAobCA8IDApIHtcblx0XHRcdFx0XHRhWzBdID0gbmV3IFNlZ21lbnQodmFsdWVzWzBdW3BdLCAwLCAwLCB2YWx1ZXNbMF1bcF0pO1xuXHRcdFx0XHRcdHJldHVybiBhO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGZvciAoaSA9IDA7IGkgPCBsOyBpKyspIHtcblx0XHRcdFx0XHRwMSA9IHZhbHVlc1tpXVtwXTtcblx0XHRcdFx0XHRwMiA9IHZhbHVlc1tpKzFdW3BdO1xuXHRcdFx0XHRcdGFbaV0gPSBuZXcgU2VnbWVudChwMSwgMCwgMCwgcDIpO1xuXHRcdFx0XHRcdGlmIChjb3JyZWxhdGUpIHtcblx0XHRcdFx0XHRcdHAzID0gdmFsdWVzW2krMl1bcF07XG5cdFx0XHRcdFx0XHRfcjFbaV0gPSAoX3IxW2ldIHx8IDApICsgKHAyIC0gcDEpICogKHAyIC0gcDEpO1xuXHRcdFx0XHRcdFx0X3IyW2ldID0gKF9yMltpXSB8fCAwKSArIChwMyAtIHAyKSAqIChwMyAtIHAyKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0YVtpXSA9IG5ldyBTZWdtZW50KHZhbHVlc1tpXVtwXSwgMCwgMCwgdmFsdWVzW2krMV1bcF0pO1xuXHRcdFx0XHRyZXR1cm4gYTtcblx0XHRcdH0sXG5cdFx0XHRiZXppZXJUaHJvdWdoID0gZnVuY3Rpb24odmFsdWVzLCBjdXJ2aW5lc3MsIHF1YWRyYXRpYywgYmFzaWMsIGNvcnJlbGF0ZSwgcHJlcGVuZCkge1xuXHRcdFx0XHR2YXIgb2JqID0ge30sXG5cdFx0XHRcdFx0cHJvcHMgPSBbXSxcblx0XHRcdFx0XHRmaXJzdCA9IHByZXBlbmQgfHwgdmFsdWVzWzBdLFxuXHRcdFx0XHRcdGksIHAsIGEsIGosIHIsIGwsIHNlYW1sZXNzLCBsYXN0O1xuXHRcdFx0XHRjb3JyZWxhdGUgPSAodHlwZW9mKGNvcnJlbGF0ZSkgPT09IFwic3RyaW5nXCIpID8gXCIsXCIrY29ycmVsYXRlK1wiLFwiIDogX2NvcnJlbGF0ZTtcblx0XHRcdFx0aWYgKGN1cnZpbmVzcyA9PSBudWxsKSB7XG5cdFx0XHRcdFx0Y3VydmluZXNzID0gMTtcblx0XHRcdFx0fVxuXHRcdFx0XHRmb3IgKHAgaW4gdmFsdWVzWzBdKSB7XG5cdFx0XHRcdFx0cHJvcHMucHVzaChwKTtcblx0XHRcdFx0fVxuXHRcdFx0XHQvL2NoZWNrIHRvIHNlZSBpZiB0aGUgbGFzdCBhbmQgZmlyc3QgdmFsdWVzIGFyZSBpZGVudGljYWwgKHdlbGwsIHdpdGhpbiAwLjA1KS4gSWYgc28sIG1ha2Ugc2VhbWxlc3MgYnkgYXBwZW5kaW5nIHRoZSBzZWNvbmQgZWxlbWVudCB0byB0aGUgdmVyeSBlbmQgb2YgdGhlIHZhbHVlcyBhcnJheSBhbmQgdGhlIDJuZC10by1sYXN0IGVsZW1lbnQgdG8gdGhlIHZlcnkgYmVnaW5uaW5nICh3ZSdsbCByZW1vdmUgdGhvc2Ugc2VnbWVudHMgbGF0ZXIpXG5cdFx0XHRcdGlmICh2YWx1ZXMubGVuZ3RoID4gMSkge1xuXHRcdFx0XHRcdGxhc3QgPSB2YWx1ZXNbdmFsdWVzLmxlbmd0aCAtIDFdO1xuXHRcdFx0XHRcdHNlYW1sZXNzID0gdHJ1ZTtcblx0XHRcdFx0XHRpID0gcHJvcHMubGVuZ3RoO1xuXHRcdFx0XHRcdHdoaWxlICgtLWkgPiAtMSkge1xuXHRcdFx0XHRcdFx0cCA9IHByb3BzW2ldO1xuXHRcdFx0XHRcdFx0aWYgKE1hdGguYWJzKGZpcnN0W3BdIC0gbGFzdFtwXSkgPiAwLjA1KSB7IC8vYnVpbGQgaW4gYSB0b2xlcmFuY2Ugb2YgKy8tMC4wNSB0byBhY2NvbW1vZGF0ZSByb3VuZGluZyBlcnJvcnMuXG5cdFx0XHRcdFx0XHRcdHNlYW1sZXNzID0gZmFsc2U7XG5cdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRpZiAoc2VhbWxlc3MpIHtcblx0XHRcdFx0XHRcdHZhbHVlcyA9IHZhbHVlcy5jb25jYXQoKTsgLy9kdXBsaWNhdGUgdGhlIGFycmF5IHRvIGF2b2lkIGNvbnRhbWluYXRpbmcgdGhlIG9yaWdpbmFsIHdoaWNoIHRoZSB1c2VyIG1heSBiZSByZXVzaW5nIGZvciBvdGhlciB0d2VlbnNcblx0XHRcdFx0XHRcdGlmIChwcmVwZW5kKSB7XG5cdFx0XHRcdFx0XHRcdHZhbHVlcy51bnNoaWZ0KHByZXBlbmQpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0dmFsdWVzLnB1c2godmFsdWVzWzFdKTtcblx0XHRcdFx0XHRcdHByZXBlbmQgPSB2YWx1ZXNbdmFsdWVzLmxlbmd0aCAtIDNdO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0XHRfcjEubGVuZ3RoID0gX3IyLmxlbmd0aCA9IF9yMy5sZW5ndGggPSAwO1xuXHRcdFx0XHRpID0gcHJvcHMubGVuZ3RoO1xuXHRcdFx0XHR3aGlsZSAoLS1pID4gLTEpIHtcblx0XHRcdFx0XHRwID0gcHJvcHNbaV07XG5cdFx0XHRcdFx0X2NvclByb3BzW3BdID0gKGNvcnJlbGF0ZS5pbmRleE9mKFwiLFwiK3ArXCIsXCIpICE9PSAtMSk7XG5cdFx0XHRcdFx0b2JqW3BdID0gX3BhcnNlQW5jaG9ycyh2YWx1ZXMsIHAsIF9jb3JQcm9wc1twXSwgcHJlcGVuZCk7XG5cdFx0XHRcdH1cblx0XHRcdFx0aSA9IF9yMS5sZW5ndGg7XG5cdFx0XHRcdHdoaWxlICgtLWkgPiAtMSkge1xuXHRcdFx0XHRcdF9yMVtpXSA9IE1hdGguc3FydChfcjFbaV0pO1xuXHRcdFx0XHRcdF9yMltpXSA9IE1hdGguc3FydChfcjJbaV0pO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmICghYmFzaWMpIHtcblx0XHRcdFx0XHRpID0gcHJvcHMubGVuZ3RoO1xuXHRcdFx0XHRcdHdoaWxlICgtLWkgPiAtMSkge1xuXHRcdFx0XHRcdFx0aWYgKF9jb3JQcm9wc1twXSkge1xuXHRcdFx0XHRcdFx0XHRhID0gb2JqW3Byb3BzW2ldXTtcblx0XHRcdFx0XHRcdFx0bCA9IGEubGVuZ3RoIC0gMTtcblx0XHRcdFx0XHRcdFx0Zm9yIChqID0gMDsgaiA8IGw7IGorKykge1xuXHRcdFx0XHRcdFx0XHRcdHIgPSAoYVtqKzFdLmRhIC8gX3IyW2pdICsgYVtqXS5kYSAvIF9yMVtqXSkgfHwgMDtcblx0XHRcdFx0XHRcdFx0XHRfcjNbal0gPSAoX3IzW2pdIHx8IDApICsgciAqIHI7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0aSA9IF9yMy5sZW5ndGg7XG5cdFx0XHRcdFx0d2hpbGUgKC0taSA+IC0xKSB7XG5cdFx0XHRcdFx0XHRfcjNbaV0gPSBNYXRoLnNxcnQoX3IzW2ldKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0aSA9IHByb3BzLmxlbmd0aDtcblx0XHRcdFx0aiA9IHF1YWRyYXRpYyA/IDQgOiAxO1xuXHRcdFx0XHR3aGlsZSAoLS1pID4gLTEpIHtcblx0XHRcdFx0XHRwID0gcHJvcHNbaV07XG5cdFx0XHRcdFx0YSA9IG9ialtwXTtcblx0XHRcdFx0XHRfY2FsY3VsYXRlQ29udHJvbFBvaW50cyhhLCBjdXJ2aW5lc3MsIHF1YWRyYXRpYywgYmFzaWMsIF9jb3JQcm9wc1twXSk7IC8vdGhpcyBtZXRob2QgcmVxdWlyZXMgdGhhdCBfcGFyc2VBbmNob3JzKCkgYW5kIF9zZXRTZWdtZW50UmF0aW9zKCkgcmFuIGZpcnN0IHNvIHRoYXQgX3IxLCBfcjIsIGFuZCBfcjMgdmFsdWVzIGFyZSBwb3B1bGF0ZWQgZm9yIGFsbCBwcm9wZXJ0aWVzXG5cdFx0XHRcdFx0aWYgKHNlYW1sZXNzKSB7XG5cdFx0XHRcdFx0XHRhLnNwbGljZSgwLCBqKTtcblx0XHRcdFx0XHRcdGEuc3BsaWNlKGEubGVuZ3RoIC0gaiwgaik7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiBvYmo7XG5cdFx0XHR9LFxuXHRcdFx0X3BhcnNlQmV6aWVyRGF0YSA9IGZ1bmN0aW9uKHZhbHVlcywgdHlwZSwgcHJlcGVuZCkge1xuXHRcdFx0XHR0eXBlID0gdHlwZSB8fCBcInNvZnRcIjtcblx0XHRcdFx0dmFyIG9iaiA9IHt9LFxuXHRcdFx0XHRcdGluYyA9ICh0eXBlID09PSBcImN1YmljXCIpID8gMyA6IDIsXG5cdFx0XHRcdFx0c29mdCA9ICh0eXBlID09PSBcInNvZnRcIiksXG5cdFx0XHRcdFx0cHJvcHMgPSBbXSxcblx0XHRcdFx0XHRhLCBiLCBjLCBkLCBjdXIsIGksIGosIGwsIHAsIGNudCwgdG1wO1xuXHRcdFx0XHRpZiAoc29mdCAmJiBwcmVwZW5kKSB7XG5cdFx0XHRcdFx0dmFsdWVzID0gW3ByZXBlbmRdLmNvbmNhdCh2YWx1ZXMpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmICh2YWx1ZXMgPT0gbnVsbCB8fCB2YWx1ZXMubGVuZ3RoIDwgaW5jICsgMSkgeyB0aHJvdyBcImludmFsaWQgQmV6aWVyIGRhdGFcIjsgfVxuXHRcdFx0XHRmb3IgKHAgaW4gdmFsdWVzWzBdKSB7XG5cdFx0XHRcdFx0cHJvcHMucHVzaChwKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRpID0gcHJvcHMubGVuZ3RoO1xuXHRcdFx0XHR3aGlsZSAoLS1pID4gLTEpIHtcblx0XHRcdFx0XHRwID0gcHJvcHNbaV07XG5cdFx0XHRcdFx0b2JqW3BdID0gY3VyID0gW107XG5cdFx0XHRcdFx0Y250ID0gMDtcblx0XHRcdFx0XHRsID0gdmFsdWVzLmxlbmd0aDtcblx0XHRcdFx0XHRmb3IgKGogPSAwOyBqIDwgbDsgaisrKSB7XG5cdFx0XHRcdFx0XHRhID0gKHByZXBlbmQgPT0gbnVsbCkgPyB2YWx1ZXNbal1bcF0gOiAodHlwZW9mKCAodG1wID0gdmFsdWVzW2pdW3BdKSApID09PSBcInN0cmluZ1wiICYmIHRtcC5jaGFyQXQoMSkgPT09IFwiPVwiKSA/IHByZXBlbmRbcF0gKyBOdW1iZXIodG1wLmNoYXJBdCgwKSArIHRtcC5zdWJzdHIoMikpIDogTnVtYmVyKHRtcCk7XG5cdFx0XHRcdFx0XHRpZiAoc29mdCkgaWYgKGogPiAxKSBpZiAoaiA8IGwgLSAxKSB7XG5cdFx0XHRcdFx0XHRcdGN1cltjbnQrK10gPSAoYSArIGN1cltjbnQtMl0pIC8gMjtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdGN1cltjbnQrK10gPSBhO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRsID0gY250IC0gaW5jICsgMTtcblx0XHRcdFx0XHRjbnQgPSAwO1xuXHRcdFx0XHRcdGZvciAoaiA9IDA7IGogPCBsOyBqICs9IGluYykge1xuXHRcdFx0XHRcdFx0YSA9IGN1cltqXTtcblx0XHRcdFx0XHRcdGIgPSBjdXJbaisxXTtcblx0XHRcdFx0XHRcdGMgPSBjdXJbaisyXTtcblx0XHRcdFx0XHRcdGQgPSAoaW5jID09PSAyKSA/IDAgOiBjdXJbaiszXTtcblx0XHRcdFx0XHRcdGN1cltjbnQrK10gPSB0bXAgPSAoaW5jID09PSAzKSA/IG5ldyBTZWdtZW50KGEsIGIsIGMsIGQpIDogbmV3IFNlZ21lbnQoYSwgKDIgKiBiICsgYSkgLyAzLCAoMiAqIGIgKyBjKSAvIDMsIGMpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRjdXIubGVuZ3RoID0gY250O1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiBvYmo7XG5cdFx0XHR9LFxuXHRcdFx0X2FkZEN1YmljTGVuZ3RocyA9IGZ1bmN0aW9uKGEsIHN0ZXBzLCByZXNvbHV0aW9uKSB7XG5cdFx0XHRcdHZhciBpbmMgPSAxIC8gcmVzb2x1dGlvbixcblx0XHRcdFx0XHRqID0gYS5sZW5ndGgsXG5cdFx0XHRcdFx0ZCwgZDEsIHMsIGRhLCBjYSwgYmEsIHAsIGksIGludiwgYmV6LCBpbmRleDtcblx0XHRcdFx0d2hpbGUgKC0taiA+IC0xKSB7XG5cdFx0XHRcdFx0YmV6ID0gYVtqXTtcblx0XHRcdFx0XHRzID0gYmV6LmE7XG5cdFx0XHRcdFx0ZGEgPSBiZXouZCAtIHM7XG5cdFx0XHRcdFx0Y2EgPSBiZXouYyAtIHM7XG5cdFx0XHRcdFx0YmEgPSBiZXouYiAtIHM7XG5cdFx0XHRcdFx0ZCA9IGQxID0gMDtcblx0XHRcdFx0XHRmb3IgKGkgPSAxOyBpIDw9IHJlc29sdXRpb247IGkrKykge1xuXHRcdFx0XHRcdFx0cCA9IGluYyAqIGk7XG5cdFx0XHRcdFx0XHRpbnYgPSAxIC0gcDtcblx0XHRcdFx0XHRcdGQgPSBkMSAtIChkMSA9IChwICogcCAqIGRhICsgMyAqIGludiAqIChwICogY2EgKyBpbnYgKiBiYSkpICogcCk7XG5cdFx0XHRcdFx0XHRpbmRleCA9IGogKiByZXNvbHV0aW9uICsgaSAtIDE7XG5cdFx0XHRcdFx0XHRzdGVwc1tpbmRleF0gPSAoc3RlcHNbaW5kZXhdIHx8IDApICsgZCAqIGQ7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9LFxuXHRcdFx0X3BhcnNlTGVuZ3RoRGF0YSA9IGZ1bmN0aW9uKG9iaiwgcmVzb2x1dGlvbikge1xuXHRcdFx0XHRyZXNvbHV0aW9uID0gcmVzb2x1dGlvbiA+PiAwIHx8IDY7XG5cdFx0XHRcdHZhciBhID0gW10sXG5cdFx0XHRcdFx0bGVuZ3RocyA9IFtdLFxuXHRcdFx0XHRcdGQgPSAwLFxuXHRcdFx0XHRcdHRvdGFsID0gMCxcblx0XHRcdFx0XHR0aHJlc2hvbGQgPSByZXNvbHV0aW9uIC0gMSxcblx0XHRcdFx0XHRzZWdtZW50cyA9IFtdLFxuXHRcdFx0XHRcdGN1ckxTID0gW10sIC8vY3VycmVudCBsZW5ndGggc2VnbWVudHMgYXJyYXlcblx0XHRcdFx0XHRwLCBpLCBsLCBpbmRleDtcblx0XHRcdFx0Zm9yIChwIGluIG9iaikge1xuXHRcdFx0XHRcdF9hZGRDdWJpY0xlbmd0aHMob2JqW3BdLCBhLCByZXNvbHV0aW9uKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRsID0gYS5sZW5ndGg7XG5cdFx0XHRcdGZvciAoaSA9IDA7IGkgPCBsOyBpKyspIHtcblx0XHRcdFx0XHRkICs9IE1hdGguc3FydChhW2ldKTtcblx0XHRcdFx0XHRpbmRleCA9IGkgJSByZXNvbHV0aW9uO1xuXHRcdFx0XHRcdGN1ckxTW2luZGV4XSA9IGQ7XG5cdFx0XHRcdFx0aWYgKGluZGV4ID09PSB0aHJlc2hvbGQpIHtcblx0XHRcdFx0XHRcdHRvdGFsICs9IGQ7XG5cdFx0XHRcdFx0XHRpbmRleCA9IChpIC8gcmVzb2x1dGlvbikgPj4gMDtcblx0XHRcdFx0XHRcdHNlZ21lbnRzW2luZGV4XSA9IGN1ckxTO1xuXHRcdFx0XHRcdFx0bGVuZ3Roc1tpbmRleF0gPSB0b3RhbDtcblx0XHRcdFx0XHRcdGQgPSAwO1xuXHRcdFx0XHRcdFx0Y3VyTFMgPSBbXTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIHtsZW5ndGg6dG90YWwsIGxlbmd0aHM6bGVuZ3Rocywgc2VnbWVudHM6c2VnbWVudHN9O1xuXHRcdFx0fSxcblxuXG5cblx0XHRcdEJlemllclBsdWdpbiA9IF9nc1Njb3BlLl9nc0RlZmluZS5wbHVnaW4oe1xuXHRcdFx0XHRcdHByb3BOYW1lOiBcImJlemllclwiLFxuXHRcdFx0XHRcdHByaW9yaXR5OiAtMSxcblx0XHRcdFx0XHR2ZXJzaW9uOiBcIjEuMy44XCIsXG5cdFx0XHRcdFx0QVBJOiAyLFxuXHRcdFx0XHRcdGdsb2JhbDp0cnVlLFxuXG5cdFx0XHRcdFx0Ly9nZXRzIGNhbGxlZCB3aGVuIHRoZSB0d2VlbiByZW5kZXJzIGZvciB0aGUgZmlyc3QgdGltZS4gVGhpcyBpcyB3aGVyZSBpbml0aWFsIHZhbHVlcyBzaG91bGQgYmUgcmVjb3JkZWQgYW5kIGFueSBzZXR1cCByb3V0aW5lcyBzaG91bGQgcnVuLlxuXHRcdFx0XHRcdGluaXQ6IGZ1bmN0aW9uKHRhcmdldCwgdmFycywgdHdlZW4pIHtcblx0XHRcdFx0XHRcdHRoaXMuX3RhcmdldCA9IHRhcmdldDtcblx0XHRcdFx0XHRcdGlmICh2YXJzIGluc3RhbmNlb2YgQXJyYXkpIHtcblx0XHRcdFx0XHRcdFx0dmFycyA9IHt2YWx1ZXM6dmFyc307XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR0aGlzLl9mdW5jID0ge307XG5cdFx0XHRcdFx0XHR0aGlzLl9tb2QgPSB7fTtcblx0XHRcdFx0XHRcdHRoaXMuX3Byb3BzID0gW107XG5cdFx0XHRcdFx0XHR0aGlzLl90aW1lUmVzID0gKHZhcnMudGltZVJlc29sdXRpb24gPT0gbnVsbCkgPyA2IDogcGFyc2VJbnQodmFycy50aW1lUmVzb2x1dGlvbiwgMTApO1xuXHRcdFx0XHRcdFx0dmFyIHZhbHVlcyA9IHZhcnMudmFsdWVzIHx8IFtdLFxuXHRcdFx0XHRcdFx0XHRmaXJzdCA9IHt9LFxuXHRcdFx0XHRcdFx0XHRzZWNvbmQgPSB2YWx1ZXNbMF0sXG5cdFx0XHRcdFx0XHRcdGF1dG9Sb3RhdGUgPSB2YXJzLmF1dG9Sb3RhdGUgfHwgdHdlZW4udmFycy5vcmllbnRUb0Jlemllcixcblx0XHRcdFx0XHRcdFx0cCwgaXNGdW5jLCBpLCBqLCBwcmVwZW5kO1xuXG5cdFx0XHRcdFx0XHR0aGlzLl9hdXRvUm90YXRlID0gYXV0b1JvdGF0ZSA/IChhdXRvUm90YXRlIGluc3RhbmNlb2YgQXJyYXkpID8gYXV0b1JvdGF0ZSA6IFtbXCJ4XCIsXCJ5XCIsXCJyb3RhdGlvblwiLCgoYXV0b1JvdGF0ZSA9PT0gdHJ1ZSkgPyAwIDogTnVtYmVyKGF1dG9Sb3RhdGUpIHx8IDApXV0gOiBudWxsO1xuXHRcdFx0XHRcdFx0Zm9yIChwIGluIHNlY29uZCkge1xuXHRcdFx0XHRcdFx0XHR0aGlzLl9wcm9wcy5wdXNoKHApO1xuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRpID0gdGhpcy5fcHJvcHMubGVuZ3RoO1xuXHRcdFx0XHRcdFx0d2hpbGUgKC0taSA+IC0xKSB7XG5cdFx0XHRcdFx0XHRcdHAgPSB0aGlzLl9wcm9wc1tpXTtcblxuXHRcdFx0XHRcdFx0XHR0aGlzLl9vdmVyd3JpdGVQcm9wcy5wdXNoKHApO1xuXHRcdFx0XHRcdFx0XHRpc0Z1bmMgPSB0aGlzLl9mdW5jW3BdID0gKHR5cGVvZih0YXJnZXRbcF0pID09PSBcImZ1bmN0aW9uXCIpO1xuXHRcdFx0XHRcdFx0XHRmaXJzdFtwXSA9ICghaXNGdW5jKSA/IHBhcnNlRmxvYXQodGFyZ2V0W3BdKSA6IHRhcmdldFsgKChwLmluZGV4T2YoXCJzZXRcIikgfHwgdHlwZW9mKHRhcmdldFtcImdldFwiICsgcC5zdWJzdHIoMyldKSAhPT0gXCJmdW5jdGlvblwiKSA/IHAgOiBcImdldFwiICsgcC5zdWJzdHIoMykpIF0oKTtcblx0XHRcdFx0XHRcdFx0aWYgKCFwcmVwZW5kKSBpZiAoZmlyc3RbcF0gIT09IHZhbHVlc1swXVtwXSkge1xuXHRcdFx0XHRcdFx0XHRcdHByZXBlbmQgPSBmaXJzdDtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0dGhpcy5fYmV6aWVycyA9ICh2YXJzLnR5cGUgIT09IFwiY3ViaWNcIiAmJiB2YXJzLnR5cGUgIT09IFwicXVhZHJhdGljXCIgJiYgdmFycy50eXBlICE9PSBcInNvZnRcIikgPyBiZXppZXJUaHJvdWdoKHZhbHVlcywgaXNOYU4odmFycy5jdXJ2aW5lc3MpID8gMSA6IHZhcnMuY3VydmluZXNzLCBmYWxzZSwgKHZhcnMudHlwZSA9PT0gXCJ0aHJ1QmFzaWNcIiksIHZhcnMuY29ycmVsYXRlLCBwcmVwZW5kKSA6IF9wYXJzZUJlemllckRhdGEodmFsdWVzLCB2YXJzLnR5cGUsIGZpcnN0KTtcblx0XHRcdFx0XHRcdHRoaXMuX3NlZ0NvdW50ID0gdGhpcy5fYmV6aWVyc1twXS5sZW5ndGg7XG5cblx0XHRcdFx0XHRcdGlmICh0aGlzLl90aW1lUmVzKSB7XG5cdFx0XHRcdFx0XHRcdHZhciBsZCA9IF9wYXJzZUxlbmd0aERhdGEodGhpcy5fYmV6aWVycywgdGhpcy5fdGltZVJlcyk7XG5cdFx0XHRcdFx0XHRcdHRoaXMuX2xlbmd0aCA9IGxkLmxlbmd0aDtcblx0XHRcdFx0XHRcdFx0dGhpcy5fbGVuZ3RocyA9IGxkLmxlbmd0aHM7XG5cdFx0XHRcdFx0XHRcdHRoaXMuX3NlZ21lbnRzID0gbGQuc2VnbWVudHM7XG5cdFx0XHRcdFx0XHRcdHRoaXMuX2wxID0gdGhpcy5fbGkgPSB0aGlzLl9zMSA9IHRoaXMuX3NpID0gMDtcblx0XHRcdFx0XHRcdFx0dGhpcy5fbDIgPSB0aGlzLl9sZW5ndGhzWzBdO1xuXHRcdFx0XHRcdFx0XHR0aGlzLl9jdXJTZWcgPSB0aGlzLl9zZWdtZW50c1swXTtcblx0XHRcdFx0XHRcdFx0dGhpcy5fczIgPSB0aGlzLl9jdXJTZWdbMF07XG5cdFx0XHRcdFx0XHRcdHRoaXMuX3ByZWMgPSAxIC8gdGhpcy5fY3VyU2VnLmxlbmd0aDtcblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0aWYgKChhdXRvUm90YXRlID0gdGhpcy5fYXV0b1JvdGF0ZSkpIHtcblx0XHRcdFx0XHRcdFx0dGhpcy5faW5pdGlhbFJvdGF0aW9ucyA9IFtdO1xuXHRcdFx0XHRcdFx0XHRpZiAoIShhdXRvUm90YXRlWzBdIGluc3RhbmNlb2YgQXJyYXkpKSB7XG5cdFx0XHRcdFx0XHRcdFx0dGhpcy5fYXV0b1JvdGF0ZSA9IGF1dG9Sb3RhdGUgPSBbYXV0b1JvdGF0ZV07XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0aSA9IGF1dG9Sb3RhdGUubGVuZ3RoO1xuXHRcdFx0XHRcdFx0XHR3aGlsZSAoLS1pID4gLTEpIHtcblx0XHRcdFx0XHRcdFx0XHRmb3IgKGogPSAwOyBqIDwgMzsgaisrKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRwID0gYXV0b1JvdGF0ZVtpXVtqXTtcblx0XHRcdFx0XHRcdFx0XHRcdHRoaXMuX2Z1bmNbcF0gPSAodHlwZW9mKHRhcmdldFtwXSkgPT09IFwiZnVuY3Rpb25cIikgPyB0YXJnZXRbICgocC5pbmRleE9mKFwic2V0XCIpIHx8IHR5cGVvZih0YXJnZXRbXCJnZXRcIiArIHAuc3Vic3RyKDMpXSkgIT09IFwiZnVuY3Rpb25cIikgPyBwIDogXCJnZXRcIiArIHAuc3Vic3RyKDMpKSBdIDogZmFsc2U7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdHAgPSBhdXRvUm90YXRlW2ldWzJdO1xuXHRcdFx0XHRcdFx0XHRcdHRoaXMuX2luaXRpYWxSb3RhdGlvbnNbaV0gPSAodGhpcy5fZnVuY1twXSA/IHRoaXMuX2Z1bmNbcF0uY2FsbCh0aGlzLl90YXJnZXQpIDogdGhpcy5fdGFyZ2V0W3BdKSB8fCAwO1xuXHRcdFx0XHRcdFx0XHRcdHRoaXMuX292ZXJ3cml0ZVByb3BzLnB1c2gocCk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdHRoaXMuX3N0YXJ0UmF0aW8gPSB0d2Vlbi52YXJzLnJ1bkJhY2t3YXJkcyA/IDEgOiAwOyAvL3dlIGRldGVybWluZSB0aGUgc3RhcnRpbmcgcmF0aW8gd2hlbiB0aGUgdHdlZW4gaW5pdHMgd2hpY2ggaXMgYWx3YXlzIDAgdW5sZXNzIHRoZSB0d2VlbiBoYXMgcnVuQmFja3dhcmRzOnRydWUgKGluZGljYXRpbmcgaXQncyBhIGZyb20oKSB0d2VlbikgaW4gd2hpY2ggY2FzZSBpdCdzIDEuXG5cdFx0XHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdFx0XHR9LFxuXG5cdFx0XHRcdFx0Ly9jYWxsZWQgZWFjaCB0aW1lIHRoZSB2YWx1ZXMgc2hvdWxkIGJlIHVwZGF0ZWQsIGFuZCB0aGUgcmF0aW8gZ2V0cyBwYXNzZWQgYXMgdGhlIG9ubHkgcGFyYW1ldGVyICh0eXBpY2FsbHkgaXQncyBhIHZhbHVlIGJldHdlZW4gMCBhbmQgMSwgYnV0IGl0IGNhbiBleGNlZWQgdGhvc2Ugd2hlbiB1c2luZyBhbiBlYXNlIGxpa2UgRWxhc3RpYy5lYXNlT3V0IG9yIEJhY2suZWFzZU91dCwgZXRjLilcblx0XHRcdFx0XHRzZXQ6IGZ1bmN0aW9uKHYpIHtcblx0XHRcdFx0XHRcdHZhciBzZWdtZW50cyA9IHRoaXMuX3NlZ0NvdW50LFxuXHRcdFx0XHRcdFx0XHRmdW5jID0gdGhpcy5fZnVuYyxcblx0XHRcdFx0XHRcdFx0dGFyZ2V0ID0gdGhpcy5fdGFyZ2V0LFxuXHRcdFx0XHRcdFx0XHRub3RTdGFydCA9ICh2ICE9PSB0aGlzLl9zdGFydFJhdGlvKSxcblx0XHRcdFx0XHRcdFx0Y3VySW5kZXgsIGludiwgaSwgcCwgYiwgdCwgdmFsLCBsLCBsZW5ndGhzLCBjdXJTZWc7XG5cdFx0XHRcdFx0XHRpZiAoIXRoaXMuX3RpbWVSZXMpIHtcblx0XHRcdFx0XHRcdFx0Y3VySW5kZXggPSAodiA8IDApID8gMCA6ICh2ID49IDEpID8gc2VnbWVudHMgLSAxIDogKHNlZ21lbnRzICogdikgPj4gMDtcblx0XHRcdFx0XHRcdFx0dCA9ICh2IC0gKGN1ckluZGV4ICogKDEgLyBzZWdtZW50cykpKSAqIHNlZ21lbnRzO1xuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0bGVuZ3RocyA9IHRoaXMuX2xlbmd0aHM7XG5cdFx0XHRcdFx0XHRcdGN1clNlZyA9IHRoaXMuX2N1clNlZztcblx0XHRcdFx0XHRcdFx0diAqPSB0aGlzLl9sZW5ndGg7XG5cdFx0XHRcdFx0XHRcdGkgPSB0aGlzLl9saTtcblx0XHRcdFx0XHRcdFx0Ly9maW5kIHRoZSBhcHByb3ByaWF0ZSBzZWdtZW50IChpZiB0aGUgY3VycmVudGx5IGNhY2hlZCBvbmUgaXNuJ3QgY29ycmVjdClcblx0XHRcdFx0XHRcdFx0aWYgKHYgPiB0aGlzLl9sMiAmJiBpIDwgc2VnbWVudHMgLSAxKSB7XG5cdFx0XHRcdFx0XHRcdFx0bCA9IHNlZ21lbnRzIC0gMTtcblx0XHRcdFx0XHRcdFx0XHR3aGlsZSAoaSA8IGwgJiYgKHRoaXMuX2wyID0gbGVuZ3Roc1srK2ldKSA8PSB2KSB7XHR9XG5cdFx0XHRcdFx0XHRcdFx0dGhpcy5fbDEgPSBsZW5ndGhzW2ktMV07XG5cdFx0XHRcdFx0XHRcdFx0dGhpcy5fbGkgPSBpO1xuXHRcdFx0XHRcdFx0XHRcdHRoaXMuX2N1clNlZyA9IGN1clNlZyA9IHRoaXMuX3NlZ21lbnRzW2ldO1xuXHRcdFx0XHRcdFx0XHRcdHRoaXMuX3MyID0gY3VyU2VnWyh0aGlzLl9zMSA9IHRoaXMuX3NpID0gMCldO1xuXHRcdFx0XHRcdFx0XHR9IGVsc2UgaWYgKHYgPCB0aGlzLl9sMSAmJiBpID4gMCkge1xuXHRcdFx0XHRcdFx0XHRcdHdoaWxlIChpID4gMCAmJiAodGhpcy5fbDEgPSBsZW5ndGhzWy0taV0pID49IHYpIHsgfVxuXHRcdFx0XHRcdFx0XHRcdGlmIChpID09PSAwICYmIHYgPCB0aGlzLl9sMSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0dGhpcy5fbDEgPSAwO1xuXHRcdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRpKys7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdHRoaXMuX2wyID0gbGVuZ3Roc1tpXTtcblx0XHRcdFx0XHRcdFx0XHR0aGlzLl9saSA9IGk7XG5cdFx0XHRcdFx0XHRcdFx0dGhpcy5fY3VyU2VnID0gY3VyU2VnID0gdGhpcy5fc2VnbWVudHNbaV07XG5cdFx0XHRcdFx0XHRcdFx0dGhpcy5fczEgPSBjdXJTZWdbKHRoaXMuX3NpID0gY3VyU2VnLmxlbmd0aCAtIDEpIC0gMV0gfHwgMDtcblx0XHRcdFx0XHRcdFx0XHR0aGlzLl9zMiA9IGN1clNlZ1t0aGlzLl9zaV07XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0Y3VySW5kZXggPSBpO1xuXHRcdFx0XHRcdFx0XHQvL25vdyBmaW5kIHRoZSBhcHByb3ByaWF0ZSBzdWItc2VnbWVudCAod2Ugc3BsaXQgaXQgaW50byB0aGUgbnVtYmVyIG9mIHBpZWNlcyB0aGF0IHdhcyBkZWZpbmVkIGJ5IFwicHJlY2lzaW9uXCIgYW5kIG1lYXN1cmVkIGVhY2ggb25lKVxuXHRcdFx0XHRcdFx0XHR2IC09IHRoaXMuX2wxO1xuXHRcdFx0XHRcdFx0XHRpID0gdGhpcy5fc2k7XG5cdFx0XHRcdFx0XHRcdGlmICh2ID4gdGhpcy5fczIgJiYgaSA8IGN1clNlZy5sZW5ndGggLSAxKSB7XG5cdFx0XHRcdFx0XHRcdFx0bCA9IGN1clNlZy5sZW5ndGggLSAxO1xuXHRcdFx0XHRcdFx0XHRcdHdoaWxlIChpIDwgbCAmJiAodGhpcy5fczIgPSBjdXJTZWdbKytpXSkgPD0gdikge1x0fVxuXHRcdFx0XHRcdFx0XHRcdHRoaXMuX3MxID0gY3VyU2VnW2ktMV07XG5cdFx0XHRcdFx0XHRcdFx0dGhpcy5fc2kgPSBpO1xuXHRcdFx0XHRcdFx0XHR9IGVsc2UgaWYgKHYgPCB0aGlzLl9zMSAmJiBpID4gMCkge1xuXHRcdFx0XHRcdFx0XHRcdHdoaWxlIChpID4gMCAmJiAodGhpcy5fczEgPSBjdXJTZWdbLS1pXSkgPj0gdikge1x0fVxuXHRcdFx0XHRcdFx0XHRcdGlmIChpID09PSAwICYmIHYgPCB0aGlzLl9zMSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0dGhpcy5fczEgPSAwO1xuXHRcdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRpKys7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdHRoaXMuX3MyID0gY3VyU2VnW2ldO1xuXHRcdFx0XHRcdFx0XHRcdHRoaXMuX3NpID0gaTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR0ID0gKChpICsgKHYgLSB0aGlzLl9zMSkgLyAodGhpcy5fczIgLSB0aGlzLl9zMSkpICogdGhpcy5fcHJlYykgfHwgMDtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdGludiA9IDEgLSB0O1xuXG5cdFx0XHRcdFx0XHRpID0gdGhpcy5fcHJvcHMubGVuZ3RoO1xuXHRcdFx0XHRcdFx0d2hpbGUgKC0taSA+IC0xKSB7XG5cdFx0XHRcdFx0XHRcdHAgPSB0aGlzLl9wcm9wc1tpXTtcblx0XHRcdFx0XHRcdFx0YiA9IHRoaXMuX2JlemllcnNbcF1bY3VySW5kZXhdO1xuXHRcdFx0XHRcdFx0XHR2YWwgPSAodCAqIHQgKiBiLmRhICsgMyAqIGludiAqICh0ICogYi5jYSArIGludiAqIGIuYmEpKSAqIHQgKyBiLmE7XG5cdFx0XHRcdFx0XHRcdGlmICh0aGlzLl9tb2RbcF0pIHtcblx0XHRcdFx0XHRcdFx0XHR2YWwgPSB0aGlzLl9tb2RbcF0odmFsLCB0YXJnZXQpO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdGlmIChmdW5jW3BdKSB7XG5cdFx0XHRcdFx0XHRcdFx0dGFyZ2V0W3BdKHZhbCk7XG5cdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdFx0dGFyZ2V0W3BdID0gdmFsO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdGlmICh0aGlzLl9hdXRvUm90YXRlKSB7XG5cdFx0XHRcdFx0XHRcdHZhciBhciA9IHRoaXMuX2F1dG9Sb3RhdGUsXG5cdFx0XHRcdFx0XHRcdFx0YjIsIHgxLCB5MSwgeDIsIHkyLCBhZGQsIGNvbnY7XG5cdFx0XHRcdFx0XHRcdGkgPSBhci5sZW5ndGg7XG5cdFx0XHRcdFx0XHRcdHdoaWxlICgtLWkgPiAtMSkge1xuXHRcdFx0XHRcdFx0XHRcdHAgPSBhcltpXVsyXTtcblx0XHRcdFx0XHRcdFx0XHRhZGQgPSBhcltpXVszXSB8fCAwO1xuXHRcdFx0XHRcdFx0XHRcdGNvbnYgPSAoYXJbaV1bNF0gPT09IHRydWUpID8gMSA6IF9SQUQyREVHO1xuXHRcdFx0XHRcdFx0XHRcdGIgPSB0aGlzLl9iZXppZXJzW2FyW2ldWzBdXTtcblx0XHRcdFx0XHRcdFx0XHRiMiA9IHRoaXMuX2JlemllcnNbYXJbaV1bMV1dO1xuXG5cdFx0XHRcdFx0XHRcdFx0aWYgKGIgJiYgYjIpIHsgLy9pbiBjYXNlIG9uZSBvZiB0aGUgcHJvcGVydGllcyBnb3Qgb3ZlcndyaXR0ZW4uXG5cdFx0XHRcdFx0XHRcdFx0XHRiID0gYltjdXJJbmRleF07XG5cdFx0XHRcdFx0XHRcdFx0XHRiMiA9IGIyW2N1ckluZGV4XTtcblxuXHRcdFx0XHRcdFx0XHRcdFx0eDEgPSBiLmEgKyAoYi5iIC0gYi5hKSAqIHQ7XG5cdFx0XHRcdFx0XHRcdFx0XHR4MiA9IGIuYiArIChiLmMgLSBiLmIpICogdDtcblx0XHRcdFx0XHRcdFx0XHRcdHgxICs9ICh4MiAtIHgxKSAqIHQ7XG5cdFx0XHRcdFx0XHRcdFx0XHR4MiArPSAoKGIuYyArIChiLmQgLSBiLmMpICogdCkgLSB4MikgKiB0O1xuXG5cdFx0XHRcdFx0XHRcdFx0XHR5MSA9IGIyLmEgKyAoYjIuYiAtIGIyLmEpICogdDtcblx0XHRcdFx0XHRcdFx0XHRcdHkyID0gYjIuYiArIChiMi5jIC0gYjIuYikgKiB0O1xuXHRcdFx0XHRcdFx0XHRcdFx0eTEgKz0gKHkyIC0geTEpICogdDtcblx0XHRcdFx0XHRcdFx0XHRcdHkyICs9ICgoYjIuYyArIChiMi5kIC0gYjIuYykgKiB0KSAtIHkyKSAqIHQ7XG5cblx0XHRcdFx0XHRcdFx0XHRcdHZhbCA9IG5vdFN0YXJ0ID8gTWF0aC5hdGFuMih5MiAtIHkxLCB4MiAtIHgxKSAqIGNvbnYgKyBhZGQgOiB0aGlzLl9pbml0aWFsUm90YXRpb25zW2ldO1xuXG5cdFx0XHRcdFx0XHRcdFx0XHRpZiAodGhpcy5fbW9kW3BdKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdHZhbCA9IHRoaXMuX21vZFtwXSh2YWwsIHRhcmdldCk7IC8vZm9yIG1vZFByb3BzXG5cdFx0XHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdFx0XHRcdGlmIChmdW5jW3BdKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdHRhcmdldFtwXSh2YWwpO1xuXHRcdFx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0dGFyZ2V0W3BdID0gdmFsO1xuXHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdH0pLFxuXHRcdFx0cCA9IEJlemllclBsdWdpbi5wcm90b3R5cGU7XG5cblxuXHRcdEJlemllclBsdWdpbi5iZXppZXJUaHJvdWdoID0gYmV6aWVyVGhyb3VnaDtcblx0XHRCZXppZXJQbHVnaW4uY3ViaWNUb1F1YWRyYXRpYyA9IGN1YmljVG9RdWFkcmF0aWM7XG5cdFx0QmV6aWVyUGx1Z2luLl9hdXRvQ1NTID0gdHJ1ZTsgLy9pbmRpY2F0ZXMgdGhhdCB0aGlzIHBsdWdpbiBjYW4gYmUgaW5zZXJ0ZWQgaW50byB0aGUgXCJjc3NcIiBvYmplY3QgdXNpbmcgdGhlIGF1dG9DU1MgZmVhdHVyZSBvZiBUd2VlbkxpdGVcblx0XHRCZXppZXJQbHVnaW4ucXVhZHJhdGljVG9DdWJpYyA9IGZ1bmN0aW9uKGEsIGIsIGMpIHtcblx0XHRcdHJldHVybiBuZXcgU2VnbWVudChhLCAoMiAqIGIgKyBhKSAvIDMsICgyICogYiArIGMpIC8gMywgYyk7XG5cdFx0fTtcblxuXHRcdEJlemllclBsdWdpbi5fY3NzUmVnaXN0ZXIgPSBmdW5jdGlvbigpIHtcblx0XHRcdHZhciBDU1NQbHVnaW4gPSBfZ2xvYmFscy5DU1NQbHVnaW47XG5cdFx0XHRpZiAoIUNTU1BsdWdpbikge1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cdFx0XHR2YXIgX2ludGVybmFscyA9IENTU1BsdWdpbi5faW50ZXJuYWxzLFxuXHRcdFx0XHRfcGFyc2VUb1Byb3h5ID0gX2ludGVybmFscy5fcGFyc2VUb1Byb3h5LFxuXHRcdFx0XHRfc2V0UGx1Z2luUmF0aW8gPSBfaW50ZXJuYWxzLl9zZXRQbHVnaW5SYXRpbyxcblx0XHRcdFx0Q1NTUHJvcFR3ZWVuID0gX2ludGVybmFscy5DU1NQcm9wVHdlZW47XG5cdFx0XHRfaW50ZXJuYWxzLl9yZWdpc3RlckNvbXBsZXhTcGVjaWFsUHJvcChcImJlemllclwiLCB7cGFyc2VyOmZ1bmN0aW9uKHQsIGUsIHByb3AsIGNzc3AsIHB0LCBwbHVnaW4pIHtcblx0XHRcdFx0aWYgKGUgaW5zdGFuY2VvZiBBcnJheSkge1xuXHRcdFx0XHRcdGUgPSB7dmFsdWVzOmV9O1xuXHRcdFx0XHR9XG5cdFx0XHRcdHBsdWdpbiA9IG5ldyBCZXppZXJQbHVnaW4oKTtcblx0XHRcdFx0dmFyIHZhbHVlcyA9IGUudmFsdWVzLFxuXHRcdFx0XHRcdGwgPSB2YWx1ZXMubGVuZ3RoIC0gMSxcblx0XHRcdFx0XHRwbHVnaW5WYWx1ZXMgPSBbXSxcblx0XHRcdFx0XHR2ID0ge30sXG5cdFx0XHRcdFx0aSwgcCwgZGF0YTtcblx0XHRcdFx0aWYgKGwgPCAwKSB7XG5cdFx0XHRcdFx0cmV0dXJuIHB0O1xuXHRcdFx0XHR9XG5cdFx0XHRcdGZvciAoaSA9IDA7IGkgPD0gbDsgaSsrKSB7XG5cdFx0XHRcdFx0ZGF0YSA9IF9wYXJzZVRvUHJveHkodCwgdmFsdWVzW2ldLCBjc3NwLCBwdCwgcGx1Z2luLCAobCAhPT0gaSkpO1xuXHRcdFx0XHRcdHBsdWdpblZhbHVlc1tpXSA9IGRhdGEuZW5kO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGZvciAocCBpbiBlKSB7XG5cdFx0XHRcdFx0dltwXSA9IGVbcF07IC8vZHVwbGljYXRlIHRoZSB2YXJzIG9iamVjdCBiZWNhdXNlIHdlIG5lZWQgdG8gYWx0ZXIgc29tZSB0aGluZ3Mgd2hpY2ggd291bGQgY2F1c2UgcHJvYmxlbXMgaWYgdGhlIHVzZXIgcGxhbnMgdG8gcmV1c2UgdGhlIHNhbWUgdmFycyBvYmplY3QgZm9yIGFub3RoZXIgdHdlZW4uXG5cdFx0XHRcdH1cblx0XHRcdFx0di52YWx1ZXMgPSBwbHVnaW5WYWx1ZXM7XG5cdFx0XHRcdHB0ID0gbmV3IENTU1Byb3BUd2Vlbih0LCBcImJlemllclwiLCAwLCAwLCBkYXRhLnB0LCAyKTtcblx0XHRcdFx0cHQuZGF0YSA9IGRhdGE7XG5cdFx0XHRcdHB0LnBsdWdpbiA9IHBsdWdpbjtcblx0XHRcdFx0cHQuc2V0UmF0aW8gPSBfc2V0UGx1Z2luUmF0aW87XG5cdFx0XHRcdGlmICh2LmF1dG9Sb3RhdGUgPT09IDApIHtcblx0XHRcdFx0XHR2LmF1dG9Sb3RhdGUgPSB0cnVlO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmICh2LmF1dG9Sb3RhdGUgJiYgISh2LmF1dG9Sb3RhdGUgaW5zdGFuY2VvZiBBcnJheSkpIHtcblx0XHRcdFx0XHRpID0gKHYuYXV0b1JvdGF0ZSA9PT0gdHJ1ZSkgPyAwIDogTnVtYmVyKHYuYXV0b1JvdGF0ZSk7XG5cdFx0XHRcdFx0di5hdXRvUm90YXRlID0gKGRhdGEuZW5kLmxlZnQgIT0gbnVsbCkgPyBbW1wibGVmdFwiLFwidG9wXCIsXCJyb3RhdGlvblwiLGksZmFsc2VdXSA6IChkYXRhLmVuZC54ICE9IG51bGwpID8gW1tcInhcIixcInlcIixcInJvdGF0aW9uXCIsaSxmYWxzZV1dIDogZmFsc2U7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKHYuYXV0b1JvdGF0ZSkge1xuXHRcdFx0XHRcdGlmICghY3NzcC5fdHJhbnNmb3JtKSB7XG5cdFx0XHRcdFx0XHRjc3NwLl9lbmFibGVUcmFuc2Zvcm1zKGZhbHNlKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0ZGF0YS5hdXRvUm90YXRlID0gY3NzcC5fdGFyZ2V0Ll9nc1RyYW5zZm9ybTtcblx0XHRcdFx0XHRkYXRhLnByb3h5LnJvdGF0aW9uID0gZGF0YS5hdXRvUm90YXRlLnJvdGF0aW9uIHx8IDA7XG5cdFx0XHRcdFx0Y3NzcC5fb3ZlcndyaXRlUHJvcHMucHVzaChcInJvdGF0aW9uXCIpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHBsdWdpbi5fb25Jbml0VHdlZW4oZGF0YS5wcm94eSwgdiwgY3NzcC5fdHdlZW4pO1xuXHRcdFx0XHRyZXR1cm4gcHQ7XG5cdFx0XHR9fSk7XG5cdFx0fTtcblxuXHRcdHAuX21vZCA9IGZ1bmN0aW9uKGxvb2t1cCkge1xuXHRcdFx0dmFyIG9wID0gdGhpcy5fb3ZlcndyaXRlUHJvcHMsXG5cdFx0XHRcdGkgPSBvcC5sZW5ndGgsXG5cdFx0XHRcdHZhbDtcblx0XHRcdHdoaWxlICgtLWkgPiAtMSkge1xuXHRcdFx0XHR2YWwgPSBsb29rdXBbb3BbaV1dO1xuXHRcdFx0XHRpZiAodmFsICYmIHR5cGVvZih2YWwpID09PSBcImZ1bmN0aW9uXCIpIHtcblx0XHRcdFx0XHR0aGlzLl9tb2Rbb3BbaV1dID0gdmFsO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fTtcblxuXHRcdHAuX2tpbGwgPSBmdW5jdGlvbihsb29rdXApIHtcblx0XHRcdHZhciBhID0gdGhpcy5fcHJvcHMsXG5cdFx0XHRcdHAsIGk7XG5cdFx0XHRmb3IgKHAgaW4gdGhpcy5fYmV6aWVycykge1xuXHRcdFx0XHRpZiAocCBpbiBsb29rdXApIHtcblx0XHRcdFx0XHRkZWxldGUgdGhpcy5fYmV6aWVyc1twXTtcblx0XHRcdFx0XHRkZWxldGUgdGhpcy5fZnVuY1twXTtcblx0XHRcdFx0XHRpID0gYS5sZW5ndGg7XG5cdFx0XHRcdFx0d2hpbGUgKC0taSA+IC0xKSB7XG5cdFx0XHRcdFx0XHRpZiAoYVtpXSA9PT0gcCkge1xuXHRcdFx0XHRcdFx0XHRhLnNwbGljZShpLCAxKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdGEgPSB0aGlzLl9hdXRvUm90YXRlO1xuXHRcdFx0aWYgKGEpIHtcblx0XHRcdFx0aSA9IGEubGVuZ3RoO1xuXHRcdFx0XHR3aGlsZSAoLS1pID4gLTEpIHtcblx0XHRcdFx0XHRpZiAobG9va3VwW2FbaV1bMl1dKSB7XG5cdFx0XHRcdFx0XHRhLnNwbGljZShpLCAxKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdHJldHVybiB0aGlzLl9zdXBlci5fa2lsbC5jYWxsKHRoaXMsIGxvb2t1cCk7XG5cdFx0fTtcblxuXHR9KCkpO1xuXG5cblxuXG5cblxuXHRcblx0XG5cdFxuXHRcblx0XG5cdFxuXHRcblx0XG4vKlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQ1NTUGx1Z2luXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKi9cblx0X2dzU2NvcGUuX2dzRGVmaW5lKFwicGx1Z2lucy5DU1NQbHVnaW5cIiwgW1wicGx1Z2lucy5Ud2VlblBsdWdpblwiLFwiVHdlZW5MaXRlXCJdLCBmdW5jdGlvbihUd2VlblBsdWdpbiwgVHdlZW5MaXRlKSB7XG5cblx0XHQvKiogQGNvbnN0cnVjdG9yICoqL1xuXHRcdHZhciBDU1NQbHVnaW4gPSBmdW5jdGlvbigpIHtcblx0XHRcdFx0VHdlZW5QbHVnaW4uY2FsbCh0aGlzLCBcImNzc1wiKTtcblx0XHRcdFx0dGhpcy5fb3ZlcndyaXRlUHJvcHMubGVuZ3RoID0gMDtcblx0XHRcdFx0dGhpcy5zZXRSYXRpbyA9IENTU1BsdWdpbi5wcm90b3R5cGUuc2V0UmF0aW87IC8vc3BlZWQgb3B0aW1pemF0aW9uIChhdm9pZCBwcm90b3R5cGUgbG9va3VwIG9uIHRoaXMgXCJob3RcIiBtZXRob2QpXG5cdFx0XHR9LFxuXHRcdFx0X2dsb2JhbHMgPSBfZ3NTY29wZS5fZ3NEZWZpbmUuZ2xvYmFscyxcblx0XHRcdF9oYXNQcmlvcml0eSwgLy90dXJucyB0cnVlIHdoZW5ldmVyIGEgQ1NTUHJvcFR3ZWVuIGluc3RhbmNlIGlzIGNyZWF0ZWQgdGhhdCBoYXMgYSBwcmlvcml0eSBvdGhlciB0aGFuIDAuIFRoaXMgaGVscHMgdXMgZGlzY2VybiB3aGV0aGVyIG9yIG5vdCB3ZSBzaG91bGQgc3BlbmQgdGhlIHRpbWUgb3JnYW5pemluZyB0aGUgbGlua2VkIGxpc3Qgb3Igbm90IGFmdGVyIGEgQ1NTUGx1Z2luJ3MgX29uSW5pdFR3ZWVuKCkgbWV0aG9kIGlzIGNhbGxlZC5cblx0XHRcdF9zdWZmaXhNYXAsIC8vd2Ugc2V0IHRoaXMgaW4gX29uSW5pdFR3ZWVuKCkgZWFjaCB0aW1lIGFzIGEgd2F5IHRvIGhhdmUgYSBwZXJzaXN0ZW50IHZhcmlhYmxlIHdlIGNhbiB1c2UgaW4gb3RoZXIgbWV0aG9kcyBsaWtlIF9wYXJzZSgpIHdpdGhvdXQgaGF2aW5nIHRvIHBhc3MgaXQgYXJvdW5kIGFzIGEgcGFyYW1ldGVyIGFuZCB3ZSBrZWVwIF9wYXJzZSgpIGRlY291cGxlZCBmcm9tIGEgcGFydGljdWxhciBDU1NQbHVnaW4gaW5zdGFuY2Vcblx0XHRcdF9jcywgLy9jb21wdXRlZCBzdHlsZSAod2Ugc3RvcmUgdGhpcyBpbiBhIHNoYXJlZCB2YXJpYWJsZSB0byBjb25zZXJ2ZSBtZW1vcnkgYW5kIG1ha2UgbWluaWZpY2F0aW9uIHRpZ2h0ZXJcblx0XHRcdF9vdmVyd3JpdGVQcm9wcywgLy9hbGlhcyB0byB0aGUgY3VycmVudGx5IGluc3RhbnRpYXRpbmcgQ1NTUGx1Z2luJ3MgX292ZXJ3cml0ZVByb3BzIGFycmF5LiBXZSB1c2UgdGhpcyBjbG9zdXJlIGluIG9yZGVyIHRvIGF2b2lkIGhhdmluZyB0byBwYXNzIGEgcmVmZXJlbmNlIGFyb3VuZCBmcm9tIG1ldGhvZCB0byBtZXRob2QgYW5kIGFpZCBpbiBtaW5pZmljYXRpb24uXG5cdFx0XHRfc3BlY2lhbFByb3BzID0ge30sXG5cdFx0XHRwID0gQ1NTUGx1Z2luLnByb3RvdHlwZSA9IG5ldyBUd2VlblBsdWdpbihcImNzc1wiKTtcblxuXHRcdHAuY29uc3RydWN0b3IgPSBDU1NQbHVnaW47XG5cdFx0Q1NTUGx1Z2luLnZlcnNpb24gPSBcIjEuMjAuNFwiO1xuXHRcdENTU1BsdWdpbi5BUEkgPSAyO1xuXHRcdENTU1BsdWdpbi5kZWZhdWx0VHJhbnNmb3JtUGVyc3BlY3RpdmUgPSAwO1xuXHRcdENTU1BsdWdpbi5kZWZhdWx0U2tld1R5cGUgPSBcImNvbXBlbnNhdGVkXCI7XG5cdFx0Q1NTUGx1Z2luLmRlZmF1bHRTbW9vdGhPcmlnaW4gPSB0cnVlO1xuXHRcdHAgPSBcInB4XCI7IC8vd2UnbGwgcmV1c2UgdGhlIFwicFwiIHZhcmlhYmxlIHRvIGtlZXAgZmlsZSBzaXplIGRvd25cblx0XHRDU1NQbHVnaW4uc3VmZml4TWFwID0ge3RvcDpwLCByaWdodDpwLCBib3R0b206cCwgbGVmdDpwLCB3aWR0aDpwLCBoZWlnaHQ6cCwgZm9udFNpemU6cCwgcGFkZGluZzpwLCBtYXJnaW46cCwgcGVyc3BlY3RpdmU6cCwgbGluZUhlaWdodDpcIlwifTtcblxuXG5cdFx0dmFyIF9udW1FeHAgPSAvKD86XFwtfFxcLnxcXGIpKFxcZHxcXC58ZVxcLSkrL2csXG5cdFx0XHRfcmVsTnVtRXhwID0gLyg/OlxcZHxcXC1cXGR8XFwuXFxkfFxcLVxcLlxcZHxcXCs9XFxkfFxcLT1cXGR8XFwrPS5cXGR8XFwtPVxcLlxcZCkrL2csXG5cdFx0XHRfdmFsdWVzRXhwID0gLyg/OlxcKz18XFwtPXxcXC18XFxiKVtcXGRcXC1cXC5dK1thLXpBLVowLTldKig/OiV8XFxiKS9naSwgLy9maW5kcyBhbGwgdGhlIHZhbHVlcyB0aGF0IGJlZ2luIHdpdGggbnVtYmVycyBvciArPSBvciAtPSBhbmQgdGhlbiBhIG51bWJlci4gSW5jbHVkZXMgc3VmZml4ZXMuIFdlIHVzZSB0aGlzIHRvIHNwbGl0IGNvbXBsZXggdmFsdWVzIGFwYXJ0IGxpa2UgXCIxcHggNXB4IDIwcHggcmdiKDI1NSwxMDIsNTEpXCJcblx0XHRcdF9OYU5FeHAgPSAvKD8hWystXT9cXGQqXFwuP1xcZCt8WystXXxlWystXVxcZCspW14wLTldL2csIC8vYWxzbyBhbGxvd3Mgc2NpZW50aWZpYyBub3RhdGlvbiBhbmQgZG9lc24ndCBraWxsIHRoZSBsZWFkaW5nIC0vKyBpbiAtPSBhbmQgKz1cblx0XHRcdF9zdWZmaXhFeHAgPSAvKD86XFxkfFxcLXxcXCt8PXwjfFxcLikqL2csXG5cdFx0XHRfb3BhY2l0eUV4cCA9IC9vcGFjaXR5ICo9ICooW14pXSopL2ksXG5cdFx0XHRfb3BhY2l0eVZhbEV4cCA9IC9vcGFjaXR5OihbXjtdKikvaSxcblx0XHRcdF9hbHBoYUZpbHRlckV4cCA9IC9hbHBoYVxcKG9wYWNpdHkgKj0uKz9cXCkvaSxcblx0XHRcdF9yZ2Joc2xFeHAgPSAvXihyZ2J8aHNsKS8sXG5cdFx0XHRfY2Fwc0V4cCA9IC8oW0EtWl0pL2csXG5cdFx0XHRfY2FtZWxFeHAgPSAvLShbYS16XSkvZ2ksXG5cdFx0XHRfdXJsRXhwID0gLyheKD86dXJsXFwoXFxcInx1cmxcXCgpKXwoPzooXFxcIlxcKSkkfFxcKSQpL2dpLCAvL2ZvciBwdWxsaW5nIG91dCB1cmxzIGZyb20gdXJsKC4uLikgb3IgdXJsKFwiLi4uXCIpIHN0cmluZ3MgKHNvbWUgYnJvd3NlcnMgd3JhcCB1cmxzIGluIHF1b3Rlcywgc29tZSBkb24ndCB3aGVuIHJlcG9ydGluZyB0aGluZ3MgbGlrZSBiYWNrZ3JvdW5kSW1hZ2UpXG5cdFx0XHRfY2FtZWxGdW5jID0gZnVuY3Rpb24ocywgZykgeyByZXR1cm4gZy50b1VwcGVyQ2FzZSgpOyB9LFxuXHRcdFx0X2hvcml6RXhwID0gLyg/OkxlZnR8UmlnaHR8V2lkdGgpL2ksXG5cdFx0XHRfaWVHZXRNYXRyaXhFeHAgPSAvKE0xMXxNMTJ8TTIxfE0yMik9W1xcZFxcLVxcLmVdKy9naSxcblx0XHRcdF9pZVNldE1hdHJpeEV4cCA9IC9wcm9naWRcXDpEWEltYWdlVHJhbnNmb3JtXFwuTWljcm9zb2Z0XFwuTWF0cml4XFwoLis/XFwpL2ksXG5cdFx0XHRfY29tbWFzT3V0c2lkZVBhcmVuRXhwID0gLywoPz1bXlxcKV0qKD86XFwofCQpKS9naSwgLy9maW5kcyBhbnkgY29tbWFzIHRoYXQgYXJlIG5vdCB3aXRoaW4gcGFyZW50aGVzaXNcblx0XHRcdF9jb21wbGV4RXhwID0gL1tcXHMsXFwoXS9pLCAvL2ZvciB0ZXN0aW5nIGEgc3RyaW5nIHRvIGZpbmQgaWYgaXQgaGFzIGEgc3BhY2UsIGNvbW1hLCBvciBvcGVuIHBhcmVudGhlc2lzIChjbHVlcyB0aGF0IGl0J3MgYSBjb21wbGV4IHZhbHVlKVxuXHRcdFx0X0RFRzJSQUQgPSBNYXRoLlBJIC8gMTgwLFxuXHRcdFx0X1JBRDJERUcgPSAxODAgLyBNYXRoLlBJLFxuXHRcdFx0X2ZvcmNlUFQgPSB7fSxcblx0XHRcdF9kdW1teUVsZW1lbnQgPSB7c3R5bGU6e319LFxuXHRcdFx0X2RvYyA9IF9nc1Njb3BlLmRvY3VtZW50IHx8IHtjcmVhdGVFbGVtZW50OiBmdW5jdGlvbigpIHtyZXR1cm4gX2R1bW15RWxlbWVudDt9fSxcblx0XHRcdF9jcmVhdGVFbGVtZW50ID0gZnVuY3Rpb24odHlwZSwgbnMpIHtcblx0XHRcdFx0cmV0dXJuIF9kb2MuY3JlYXRlRWxlbWVudE5TID8gX2RvYy5jcmVhdGVFbGVtZW50TlMobnMgfHwgXCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sXCIsIHR5cGUpIDogX2RvYy5jcmVhdGVFbGVtZW50KHR5cGUpO1xuXHRcdFx0fSxcblx0XHRcdF90ZW1wRGl2ID0gX2NyZWF0ZUVsZW1lbnQoXCJkaXZcIiksXG5cdFx0XHRfdGVtcEltZyA9IF9jcmVhdGVFbGVtZW50KFwiaW1nXCIpLFxuXHRcdFx0X2ludGVybmFscyA9IENTU1BsdWdpbi5faW50ZXJuYWxzID0ge19zcGVjaWFsUHJvcHM6X3NwZWNpYWxQcm9wc30sIC8vcHJvdmlkZXMgYSBob29rIHRvIGEgZmV3IGludGVybmFsIG1ldGhvZHMgdGhhdCB3ZSBuZWVkIHRvIGFjY2VzcyBmcm9tIGluc2lkZSBvdGhlciBwbHVnaW5zXG5cdFx0XHRfYWdlbnQgPSAoX2dzU2NvcGUubmF2aWdhdG9yIHx8IHt9KS51c2VyQWdlbnQgfHwgXCJcIixcblx0XHRcdF9hdXRvUm91bmQsXG5cdFx0XHRfcmVxU2FmYXJpRml4LCAvL3dlIHdvbid0IGFwcGx5IHRoZSBTYWZhcmkgdHJhbnNmb3JtIGZpeCB1bnRpbCB3ZSBhY3R1YWxseSBjb21lIGFjcm9zcyBhIHR3ZWVuIHRoYXQgYWZmZWN0cyBhIHRyYW5zZm9ybSBwcm9wZXJ0eSAodG8gbWFpbnRhaW4gYmVzdCBwZXJmb3JtYW5jZSkuXG5cblx0XHRcdF9pc1NhZmFyaSxcblx0XHRcdF9pc0ZpcmVmb3gsIC8vRmlyZWZveCBoYXMgYSBidWcgdGhhdCBjYXVzZXMgM0QgdHJhbnNmb3JtZWQgZWxlbWVudHMgdG8gcmFuZG9tbHkgZGlzYXBwZWFyIHVubGVzcyBhIHJlcGFpbnQgaXMgZm9yY2VkIGFmdGVyIGVhY2ggdXBkYXRlIG9uIGVhY2ggZWxlbWVudC5cblx0XHRcdF9pc1NhZmFyaUxUNiwgLy9TYWZhcmkgKGFuZCBBbmRyb2lkIDQgd2hpY2ggdXNlcyBhIGZsYXZvciBvZiBTYWZhcmkpIGhhcyBhIGJ1ZyB0aGF0IHByZXZlbnRzIGNoYW5nZXMgdG8gXCJ0b3BcIiBhbmQgXCJsZWZ0XCIgcHJvcGVydGllcyBmcm9tIHJlbmRlcmluZyBwcm9wZXJseSBpZiBjaGFuZ2VkIG9uIHRoZSBzYW1lIGZyYW1lIGFzIGEgdHJhbnNmb3JtIFVOTEVTUyB3ZSBzZXQgdGhlIGVsZW1lbnQncyBXZWJraXRCYWNrZmFjZVZpc2liaWxpdHkgdG8gaGlkZGVuICh3ZWlyZCwgSSBrbm93KS4gRG9pbmcgdGhpcyBmb3IgQW5kcm9pZCAzIGFuZCBlYXJsaWVyIHNlZW1zIHRvIGFjdHVhbGx5IGNhdXNlIG90aGVyIHByb2JsZW1zLCB0aG91Z2ggKGZ1biEpXG5cdFx0XHRfaWVWZXJzLFxuXHRcdFx0X3N1cHBvcnRzT3BhY2l0eSA9IChmdW5jdGlvbigpIHsgLy93ZSBzZXQgX2lzU2FmYXJpLCBfaWVWZXJzLCBfaXNGaXJlZm94LCBhbmQgX3N1cHBvcnRzT3BhY2l0eSBhbGwgaW4gb25lIGZ1bmN0aW9uIGhlcmUgdG8gcmVkdWNlIGZpbGUgc2l6ZSBzbGlnaHRseSwgZXNwZWNpYWxseSBpbiB0aGUgbWluaWZpZWQgdmVyc2lvbi5cblx0XHRcdFx0dmFyIGkgPSBfYWdlbnQuaW5kZXhPZihcIkFuZHJvaWRcIiksXG5cdFx0XHRcdFx0YSA9IF9jcmVhdGVFbGVtZW50KFwiYVwiKTtcblx0XHRcdFx0X2lzU2FmYXJpID0gKF9hZ2VudC5pbmRleE9mKFwiU2FmYXJpXCIpICE9PSAtMSAmJiBfYWdlbnQuaW5kZXhPZihcIkNocm9tZVwiKSA9PT0gLTEgJiYgKGkgPT09IC0xIHx8IHBhcnNlRmxvYXQoX2FnZW50LnN1YnN0cihpKzgsIDIpKSA+IDMpKTtcblx0XHRcdFx0X2lzU2FmYXJpTFQ2ID0gKF9pc1NhZmFyaSAmJiAocGFyc2VGbG9hdChfYWdlbnQuc3Vic3RyKF9hZ2VudC5pbmRleE9mKFwiVmVyc2lvbi9cIikrOCwgMikpIDwgNikpO1xuXHRcdFx0XHRfaXNGaXJlZm94ID0gKF9hZ2VudC5pbmRleE9mKFwiRmlyZWZveFwiKSAhPT0gLTEpO1xuXHRcdFx0XHRpZiAoKC9NU0lFIChbMC05XXsxLH1bXFwuMC05XXswLH0pLykuZXhlYyhfYWdlbnQpIHx8ICgvVHJpZGVudFxcLy4qcnY6KFswLTldezEsfVtcXC4wLTldezAsfSkvKS5leGVjKF9hZ2VudCkpIHtcblx0XHRcdFx0XHRfaWVWZXJzID0gcGFyc2VGbG9hdCggUmVnRXhwLiQxICk7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKCFhKSB7XG5cdFx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGEuc3R5bGUuY3NzVGV4dCA9IFwidG9wOjFweDtvcGFjaXR5Oi41NTtcIjtcblx0XHRcdFx0cmV0dXJuIC9eMC41NS8udGVzdChhLnN0eWxlLm9wYWNpdHkpO1xuXHRcdFx0fSgpKSxcblx0XHRcdF9nZXRJRU9wYWNpdHkgPSBmdW5jdGlvbih2KSB7XG5cdFx0XHRcdHJldHVybiAoX29wYWNpdHlFeHAudGVzdCggKCh0eXBlb2YodikgPT09IFwic3RyaW5nXCIpID8gdiA6ICh2LmN1cnJlbnRTdHlsZSA/IHYuY3VycmVudFN0eWxlLmZpbHRlciA6IHYuc3R5bGUuZmlsdGVyKSB8fCBcIlwiKSApID8gKCBwYXJzZUZsb2F0KCBSZWdFeHAuJDEgKSAvIDEwMCApIDogMSk7XG5cdFx0XHR9LFxuXHRcdFx0X2xvZyA9IGZ1bmN0aW9uKHMpIHsvL2ZvciBsb2dnaW5nIG1lc3NhZ2VzLCBidXQgaW4gYSB3YXkgdGhhdCB3b24ndCB0aHJvdyBlcnJvcnMgaW4gb2xkIHZlcnNpb25zIG9mIElFLlxuXHRcdFx0XHRpZiAoX2dzU2NvcGUuY29uc29sZSkge1xuXHRcdFx0XHRcdGNvbnNvbGUubG9nKHMpO1xuXHRcdFx0XHR9XG5cdFx0XHR9LFxuXHRcdFx0X3RhcmdldCwgLy93aGVuIGluaXR0aW5nIGEgQ1NTUGx1Z2luLCB3ZSBzZXQgdGhpcyB2YXJpYWJsZSBzbyB0aGF0IHdlIGNhbiBhY2Nlc3MgaXQgZnJvbSB3aXRoaW4gbWFueSBvdGhlciBmdW5jdGlvbnMgd2l0aG91dCBoYXZpbmcgdG8gcGFzcyBpdCBhcm91bmQgYXMgcGFyYW1zXG5cdFx0XHRfaW5kZXgsIC8vd2hlbiBpbml0dGluZyBhIENTU1BsdWdpbiwgd2Ugc2V0IHRoaXMgdmFyaWFibGUgc28gdGhhdCB3ZSBjYW4gYWNjZXNzIGl0IGZyb20gd2l0aGluIG1hbnkgb3RoZXIgZnVuY3Rpb25zIHdpdGhvdXQgaGF2aW5nIHRvIHBhc3MgaXQgYXJvdW5kIGFzIHBhcmFtc1xuXG5cdFx0XHRfcHJlZml4Q1NTID0gXCJcIiwgLy90aGUgbm9uLWNhbWVsQ2FzZSB2ZW5kb3IgcHJlZml4IGxpa2UgXCItby1cIiwgXCItbW96LVwiLCBcIi1tcy1cIiwgb3IgXCItd2Via2l0LVwiXG5cdFx0XHRfcHJlZml4ID0gXCJcIiwgLy9jYW1lbENhc2UgdmVuZG9yIHByZWZpeCBsaWtlIFwiT1wiLCBcIm1zXCIsIFwiV2Via2l0XCIsIG9yIFwiTW96XCIuXG5cblx0XHRcdC8vIEBwcml2YXRlIGZlZWQgaW4gYSBjYW1lbENhc2UgcHJvcGVydHkgbmFtZSBsaWtlIFwidHJhbnNmb3JtXCIgYW5kIGl0IHdpbGwgY2hlY2sgdG8gc2VlIGlmIGl0IGlzIHZhbGlkIGFzLWlzIG9yIGlmIGl0IG5lZWRzIGEgdmVuZG9yIHByZWZpeC4gSXQgcmV0dXJucyB0aGUgY29ycmVjdGVkIGNhbWVsQ2FzZSBwcm9wZXJ0eSBuYW1lIChpLmUuIFwiV2Via2l0VHJhbnNmb3JtXCIgb3IgXCJNb3pUcmFuc2Zvcm1cIiBvciBcInRyYW5zZm9ybVwiIG9yIG51bGwgaWYgbm8gc3VjaCBwcm9wZXJ0eSBpcyBmb3VuZCwgbGlrZSBpZiB0aGUgYnJvd3NlciBpcyBJRTggb3IgYmVmb3JlLCBcInRyYW5zZm9ybVwiIHdvbid0IGJlIGZvdW5kIGF0IGFsbClcblx0XHRcdF9jaGVja1Byb3BQcmVmaXggPSBmdW5jdGlvbihwLCBlKSB7XG5cdFx0XHRcdGUgPSBlIHx8IF90ZW1wRGl2O1xuXHRcdFx0XHR2YXIgcyA9IGUuc3R5bGUsXG5cdFx0XHRcdFx0YSwgaTtcblx0XHRcdFx0aWYgKHNbcF0gIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRcdHJldHVybiBwO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHAgPSBwLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgcC5zdWJzdHIoMSk7XG5cdFx0XHRcdGEgPSBbXCJPXCIsXCJNb3pcIixcIm1zXCIsXCJNc1wiLFwiV2Via2l0XCJdO1xuXHRcdFx0XHRpID0gNTtcblx0XHRcdFx0d2hpbGUgKC0taSA+IC0xICYmIHNbYVtpXStwXSA9PT0gdW5kZWZpbmVkKSB7IH1cblx0XHRcdFx0aWYgKGkgPj0gMCkge1xuXHRcdFx0XHRcdF9wcmVmaXggPSAoaSA9PT0gMykgPyBcIm1zXCIgOiBhW2ldO1xuXHRcdFx0XHRcdF9wcmVmaXhDU1MgPSBcIi1cIiArIF9wcmVmaXgudG9Mb3dlckNhc2UoKSArIFwiLVwiO1xuXHRcdFx0XHRcdHJldHVybiBfcHJlZml4ICsgcDtcblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gbnVsbDtcblx0XHRcdH0sXG5cblx0XHRcdF9nZXRDb21wdXRlZFN0eWxlID0gX2RvYy5kZWZhdWx0VmlldyA/IF9kb2MuZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZSA6IGZ1bmN0aW9uKCkge30sXG5cblx0XHRcdC8qKlxuXHRcdFx0ICogQHByaXZhdGUgUmV0dXJucyB0aGUgY3NzIHN0eWxlIGZvciBhIHBhcnRpY3VsYXIgcHJvcGVydHkgb2YgYW4gZWxlbWVudC4gRm9yIGV4YW1wbGUsIHRvIGdldCB3aGF0ZXZlciB0aGUgY3VycmVudCBcImxlZnRcIiBjc3MgdmFsdWUgZm9yIGFuIGVsZW1lbnQgd2l0aCBhbiBJRCBvZiBcIm15RWxlbWVudFwiLCB5b3UgY291bGQgZG86XG5cdFx0XHQgKiB2YXIgY3VycmVudExlZnQgPSBDU1NQbHVnaW4uZ2V0U3R5bGUoIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwibXlFbGVtZW50XCIpLCBcImxlZnRcIik7XG5cdFx0XHQgKlxuXHRcdFx0ICogQHBhcmFtIHshT2JqZWN0fSB0IFRhcmdldCBlbGVtZW50IHdob3NlIHN0eWxlIHByb3BlcnR5IHlvdSB3YW50IHRvIHF1ZXJ5XG5cdFx0XHQgKiBAcGFyYW0geyFzdHJpbmd9IHAgUHJvcGVydHkgbmFtZSAobGlrZSBcImxlZnRcIiBvciBcInRvcFwiIG9yIFwibWFyZ2luVG9wXCIsIGV0Yy4pXG5cdFx0XHQgKiBAcGFyYW0ge09iamVjdD19IGNzIENvbXB1dGVkIHN0eWxlIG9iamVjdC4gVGhpcyBqdXN0IHByb3ZpZGVzIGEgd2F5IHRvIHNwZWVkIHByb2Nlc3NpbmcgaWYgeW91J3JlIGdvaW5nIHRvIGdldCBzZXZlcmFsIHByb3BlcnRpZXMgb24gdGhlIHNhbWUgZWxlbWVudCBpbiBxdWljayBzdWNjZXNzaW9uIC0geW91IGNhbiByZXVzZSB0aGUgcmVzdWx0IG9mIHRoZSBnZXRDb21wdXRlZFN0eWxlKCkgY2FsbC5cblx0XHRcdCAqIEBwYXJhbSB7Ym9vbGVhbj19IGNhbGMgSWYgdHJ1ZSwgdGhlIHZhbHVlIHdpbGwgbm90IGJlIHJlYWQgZGlyZWN0bHkgZnJvbSB0aGUgZWxlbWVudCdzIFwic3R5bGVcIiBwcm9wZXJ0eSAoaWYgaXQgZXhpc3RzIHRoZXJlKSwgYnV0IGluc3RlYWQgdGhlIGdldENvbXB1dGVkU3R5bGUoKSByZXN1bHQgd2lsbCBiZSB1c2VkLiBUaGlzIGNhbiBiZSB1c2VmdWwgd2hlbiB5b3Ugd2FudCB0byBlbnN1cmUgdGhhdCB0aGUgYnJvd3NlciBpdHNlbGYgaXMgaW50ZXJwcmV0aW5nIHRoZSB2YWx1ZS5cblx0XHRcdCAqIEBwYXJhbSB7c3RyaW5nPX0gZGZsdCBEZWZhdWx0IHZhbHVlIHRoYXQgc2hvdWxkIGJlIHJldHVybmVkIGluIHRoZSBwbGFjZSBvZiBudWxsLCBcIm5vbmVcIiwgXCJhdXRvXCIgb3IgXCJhdXRvIGF1dG9cIi5cblx0XHRcdCAqIEByZXR1cm4gez9zdHJpbmd9IFRoZSBjdXJyZW50IHByb3BlcnR5IHZhbHVlXG5cdFx0XHQgKi9cblx0XHRcdF9nZXRTdHlsZSA9IENTU1BsdWdpbi5nZXRTdHlsZSA9IGZ1bmN0aW9uKHQsIHAsIGNzLCBjYWxjLCBkZmx0KSB7XG5cdFx0XHRcdHZhciBydjtcblx0XHRcdFx0aWYgKCFfc3VwcG9ydHNPcGFjaXR5KSBpZiAocCA9PT0gXCJvcGFjaXR5XCIpIHsgLy9zZXZlcmFsIHZlcnNpb25zIG9mIElFIGRvbid0IHVzZSB0aGUgc3RhbmRhcmQgXCJvcGFjaXR5XCIgcHJvcGVydHkgLSB0aGV5IHVzZSB0aGluZ3MgbGlrZSBmaWx0ZXI6YWxwaGEob3BhY2l0eT01MCksIHNvIHdlIHBhcnNlIHRoYXQgaGVyZS5cblx0XHRcdFx0XHRyZXR1cm4gX2dldElFT3BhY2l0eSh0KTtcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAoIWNhbGMgJiYgdC5zdHlsZVtwXSkge1xuXHRcdFx0XHRcdHJ2ID0gdC5zdHlsZVtwXTtcblx0XHRcdFx0fSBlbHNlIGlmICgoY3MgPSBjcyB8fCBfZ2V0Q29tcHV0ZWRTdHlsZSh0KSkpIHtcblx0XHRcdFx0XHRydiA9IGNzW3BdIHx8IGNzLmdldFByb3BlcnR5VmFsdWUocCkgfHwgY3MuZ2V0UHJvcGVydHlWYWx1ZShwLnJlcGxhY2UoX2NhcHNFeHAsIFwiLSQxXCIpLnRvTG93ZXJDYXNlKCkpO1xuXHRcdFx0XHR9IGVsc2UgaWYgKHQuY3VycmVudFN0eWxlKSB7XG5cdFx0XHRcdFx0cnYgPSB0LmN1cnJlbnRTdHlsZVtwXTtcblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gKGRmbHQgIT0gbnVsbCAmJiAoIXJ2IHx8IHJ2ID09PSBcIm5vbmVcIiB8fCBydiA9PT0gXCJhdXRvXCIgfHwgcnYgPT09IFwiYXV0byBhdXRvXCIpKSA/IGRmbHQgOiBydjtcblx0XHRcdH0sXG5cblx0XHRcdC8qKlxuXHRcdFx0ICogQHByaXZhdGUgUGFzcyB0aGUgdGFyZ2V0IGVsZW1lbnQsIHRoZSBwcm9wZXJ0eSBuYW1lLCB0aGUgbnVtZXJpYyB2YWx1ZSwgYW5kIHRoZSBzdWZmaXggKGxpa2UgXCIlXCIsIFwiZW1cIiwgXCJweFwiLCBldGMuKSBhbmQgaXQgd2lsbCBzcGl0IGJhY2sgdGhlIGVxdWl2YWxlbnQgcGl4ZWwgbnVtYmVyLlxuXHRcdFx0ICogQHBhcmFtIHshT2JqZWN0fSB0IFRhcmdldCBlbGVtZW50XG5cdFx0XHQgKiBAcGFyYW0geyFzdHJpbmd9IHAgUHJvcGVydHkgbmFtZSAobGlrZSBcImxlZnRcIiwgXCJ0b3BcIiwgXCJtYXJnaW5MZWZ0XCIsIGV0Yy4pXG5cdFx0XHQgKiBAcGFyYW0geyFudW1iZXJ9IHYgVmFsdWVcblx0XHRcdCAqIEBwYXJhbSB7c3RyaW5nPX0gc2Z4IFN1ZmZpeCAobGlrZSBcInB4XCIgb3IgXCIlXCIgb3IgXCJlbVwiKVxuXHRcdFx0ICogQHBhcmFtIHtib29sZWFuPX0gcmVjdXJzZSBJZiB0cnVlLCB0aGUgY2FsbCBpcyBhIHJlY3Vyc2l2ZSBvbmUuIEluIHNvbWUgYnJvd3NlcnMgKGxpa2UgSUU3LzgpLCBvY2Nhc2lvbmFsbHkgdGhlIHZhbHVlIGlzbid0IGFjY3VyYXRlbHkgcmVwb3J0ZWQgaW5pdGlhbGx5LCBidXQgaWYgd2UgcnVuIHRoZSBmdW5jdGlvbiBhZ2FpbiBpdCB3aWxsIHRha2UgZWZmZWN0LlxuXHRcdFx0ICogQHJldHVybiB7bnVtYmVyfSB2YWx1ZSBpbiBwaXhlbHNcblx0XHRcdCAqL1xuXHRcdFx0X2NvbnZlcnRUb1BpeGVscyA9IF9pbnRlcm5hbHMuY29udmVydFRvUGl4ZWxzID0gZnVuY3Rpb24odCwgcCwgdiwgc2Z4LCByZWN1cnNlKSB7XG5cdFx0XHRcdGlmIChzZnggPT09IFwicHhcIiB8fCAoIXNmeCAmJiBwICE9PSBcImxpbmVIZWlnaHRcIikpIHsgcmV0dXJuIHY7IH1cblx0XHRcdFx0aWYgKHNmeCA9PT0gXCJhdXRvXCIgfHwgIXYpIHsgcmV0dXJuIDA7IH1cblx0XHRcdFx0dmFyIGhvcml6ID0gX2hvcml6RXhwLnRlc3QocCksXG5cdFx0XHRcdFx0bm9kZSA9IHQsXG5cdFx0XHRcdFx0c3R5bGUgPSBfdGVtcERpdi5zdHlsZSxcblx0XHRcdFx0XHRuZWcgPSAodiA8IDApLFxuXHRcdFx0XHRcdHByZWNpc2UgPSAodiA9PT0gMSksXG5cdFx0XHRcdFx0cGl4LCBjYWNoZSwgdGltZTtcblx0XHRcdFx0aWYgKG5lZykge1xuXHRcdFx0XHRcdHYgPSAtdjtcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAocHJlY2lzZSkge1xuXHRcdFx0XHRcdHYgKj0gMTAwO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmIChwID09PSBcImxpbmVIZWlnaHRcIiAmJiAhc2Z4KSB7IC8vc3BlY2lhbCBjYXNlIG9mIHdoZW4gYSBzaW1wbGUgbGluZUhlaWdodCAod2l0aG91dCBhIHVuaXQpIGlzIHVzZWQuIFNldCBpdCB0byB0aGUgdmFsdWUsIHJlYWQgYmFjayB0aGUgY29tcHV0ZWQgdmFsdWUsIGFuZCB0aGVuIHJldmVydC5cblx0XHRcdFx0XHRjYWNoZSA9IF9nZXRDb21wdXRlZFN0eWxlKHQpLmxpbmVIZWlnaHQ7XG5cdFx0XHRcdFx0dC5zdHlsZS5saW5lSGVpZ2h0ID0gdjtcblx0XHRcdFx0XHRwaXggPSBwYXJzZUZsb2F0KF9nZXRDb21wdXRlZFN0eWxlKHQpLmxpbmVIZWlnaHQpO1xuXHRcdFx0XHRcdHQuc3R5bGUubGluZUhlaWdodCA9IGNhY2hlO1xuXHRcdFx0XHR9IGVsc2UgaWYgKHNmeCA9PT0gXCIlXCIgJiYgcC5pbmRleE9mKFwiYm9yZGVyXCIpICE9PSAtMSkge1xuXHRcdFx0XHRcdHBpeCA9ICh2IC8gMTAwKSAqIChob3JpeiA/IHQuY2xpZW50V2lkdGggOiB0LmNsaWVudEhlaWdodCk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0c3R5bGUuY3NzVGV4dCA9IFwiYm9yZGVyOjAgc29saWQgcmVkO3Bvc2l0aW9uOlwiICsgX2dldFN0eWxlKHQsIFwicG9zaXRpb25cIikgKyBcIjtsaW5lLWhlaWdodDowO1wiO1xuXHRcdFx0XHRcdGlmIChzZnggPT09IFwiJVwiIHx8ICFub2RlLmFwcGVuZENoaWxkIHx8IHNmeC5jaGFyQXQoMCkgPT09IFwidlwiIHx8IHNmeCA9PT0gXCJyZW1cIikge1xuXHRcdFx0XHRcdFx0bm9kZSA9IHQucGFyZW50Tm9kZSB8fCBfZG9jLmJvZHk7XG5cdFx0XHRcdFx0XHRpZiAoX2dldFN0eWxlKG5vZGUsIFwiZGlzcGxheVwiKS5pbmRleE9mKFwiZmxleFwiKSAhPT0gLTEpIHsgLy9FZGdlIGFuZCBJRTExIGhhdmUgYSBidWcgdGhhdCBjYXVzZXMgb2Zmc2V0V2lkdGggdG8gcmVwb3J0IGFzIDAgaWYgdGhlIGNvbnRhaW5lciBoYXMgZGlzcGxheTpmbGV4IGFuZCB0aGUgY2hpbGQgaXMgcG9zaXRpb246cmVsYXRpdmUuIFN3aXRjaGluZyB0byBwb3NpdGlvbjogYWJzb2x1dGUgc29sdmVzIGl0LlxuXHRcdFx0XHRcdFx0XHRzdHlsZS5wb3NpdGlvbiA9IFwiYWJzb2x1dGVcIjtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdGNhY2hlID0gbm9kZS5fZ3NDYWNoZTtcblx0XHRcdFx0XHRcdHRpbWUgPSBUd2VlbkxpdGUudGlja2VyLmZyYW1lO1xuXHRcdFx0XHRcdFx0aWYgKGNhY2hlICYmIGhvcml6ICYmIGNhY2hlLnRpbWUgPT09IHRpbWUpIHsgLy9wZXJmb3JtYW5jZSBvcHRpbWl6YXRpb246IHdlIHJlY29yZCB0aGUgd2lkdGggb2YgZWxlbWVudHMgYWxvbmcgd2l0aCB0aGUgdGlja2VyIGZyYW1lIHNvIHRoYXQgd2UgY2FuIHF1aWNrbHkgZ2V0IGl0IGFnYWluIG9uIHRoZSBzYW1lIHRpY2sgKHNlZW1zIHJlbGF0aXZlbHkgc2FmZSB0byBhc3N1bWUgaXQgd291bGRuJ3QgY2hhbmdlIG9uIHRoZSBzYW1lIHRpY2spXG5cdFx0XHRcdFx0XHRcdHJldHVybiBjYWNoZS53aWR0aCAqIHYgLyAxMDA7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRzdHlsZVsoaG9yaXogPyBcIndpZHRoXCIgOiBcImhlaWdodFwiKV0gPSB2ICsgc2Z4O1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRzdHlsZVsoaG9yaXogPyBcImJvcmRlckxlZnRXaWR0aFwiIDogXCJib3JkZXJUb3BXaWR0aFwiKV0gPSB2ICsgc2Z4O1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRub2RlLmFwcGVuZENoaWxkKF90ZW1wRGl2KTtcblx0XHRcdFx0XHRwaXggPSBwYXJzZUZsb2F0KF90ZW1wRGl2Wyhob3JpeiA/IFwib2Zmc2V0V2lkdGhcIiA6IFwib2Zmc2V0SGVpZ2h0XCIpXSk7XG5cdFx0XHRcdFx0bm9kZS5yZW1vdmVDaGlsZChfdGVtcERpdik7XG5cdFx0XHRcdFx0aWYgKGhvcml6ICYmIHNmeCA9PT0gXCIlXCIgJiYgQ1NTUGx1Z2luLmNhY2hlV2lkdGhzICE9PSBmYWxzZSkge1xuXHRcdFx0XHRcdFx0Y2FjaGUgPSBub2RlLl9nc0NhY2hlID0gbm9kZS5fZ3NDYWNoZSB8fCB7fTtcblx0XHRcdFx0XHRcdGNhY2hlLnRpbWUgPSB0aW1lO1xuXHRcdFx0XHRcdFx0Y2FjaGUud2lkdGggPSBwaXggLyB2ICogMTAwO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRpZiAocGl4ID09PSAwICYmICFyZWN1cnNlKSB7XG5cdFx0XHRcdFx0XHRwaXggPSBfY29udmVydFRvUGl4ZWxzKHQsIHAsIHYsIHNmeCwgdHJ1ZSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdGlmIChwcmVjaXNlKSB7XG5cdFx0XHRcdFx0cGl4IC89IDEwMDtcblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gbmVnID8gLXBpeCA6IHBpeDtcblx0XHRcdH0sXG5cdFx0XHRfY2FsY3VsYXRlT2Zmc2V0ID0gX2ludGVybmFscy5jYWxjdWxhdGVPZmZzZXQgPSBmdW5jdGlvbih0LCBwLCBjcykgeyAvL2ZvciBmaWd1cmluZyBvdXQgXCJ0b3BcIiBvciBcImxlZnRcIiBpbiBweCB3aGVuIGl0J3MgXCJhdXRvXCIuIFdlIG5lZWQgdG8gZmFjdG9yIGluIG1hcmdpbiB3aXRoIHRoZSBvZmZzZXRMZWZ0L29mZnNldFRvcFxuXHRcdFx0XHRpZiAoX2dldFN0eWxlKHQsIFwicG9zaXRpb25cIiwgY3MpICE9PSBcImFic29sdXRlXCIpIHsgcmV0dXJuIDA7IH1cblx0XHRcdFx0dmFyIGRpbSA9ICgocCA9PT0gXCJsZWZ0XCIpID8gXCJMZWZ0XCIgOiBcIlRvcFwiKSxcblx0XHRcdFx0XHR2ID0gX2dldFN0eWxlKHQsIFwibWFyZ2luXCIgKyBkaW0sIGNzKTtcblx0XHRcdFx0cmV0dXJuIHRbXCJvZmZzZXRcIiArIGRpbV0gLSAoX2NvbnZlcnRUb1BpeGVscyh0LCBwLCBwYXJzZUZsb2F0KHYpLCB2LnJlcGxhY2UoX3N1ZmZpeEV4cCwgXCJcIikpIHx8IDApO1xuXHRcdFx0fSxcblxuXHRcdFx0Ly8gQHByaXZhdGUgcmV0dXJucyBhdCBvYmplY3QgY29udGFpbmluZyBBTEwgb2YgdGhlIHN0eWxlIHByb3BlcnRpZXMgaW4gY2FtZWxDYXNlIGFuZCB0aGVpciBhc3NvY2lhdGVkIHZhbHVlcy5cblx0XHRcdF9nZXRBbGxTdHlsZXMgPSBmdW5jdGlvbih0LCBjcykge1xuXHRcdFx0XHR2YXIgcyA9IHt9LFxuXHRcdFx0XHRcdGksIHRyLCBwO1xuXHRcdFx0XHRpZiAoKGNzID0gY3MgfHwgX2dldENvbXB1dGVkU3R5bGUodCwgbnVsbCkpKSB7XG5cdFx0XHRcdFx0aWYgKChpID0gY3MubGVuZ3RoKSkge1xuXHRcdFx0XHRcdFx0d2hpbGUgKC0taSA+IC0xKSB7XG5cdFx0XHRcdFx0XHRcdHAgPSBjc1tpXTtcblx0XHRcdFx0XHRcdFx0aWYgKHAuaW5kZXhPZihcIi10cmFuc2Zvcm1cIikgPT09IC0xIHx8IF90cmFuc2Zvcm1Qcm9wQ1NTID09PSBwKSB7IC8vU29tZSB3ZWJraXQgYnJvd3NlcnMgZHVwbGljYXRlIHRyYW5zZm9ybSB2YWx1ZXMsIG9uZSBub24tcHJlZml4ZWQgYW5kIG9uZSBwcmVmaXhlZCAoXCJ0cmFuc2Zvcm1cIiBhbmQgXCJXZWJraXRUcmFuc2Zvcm1cIiksIHNvIHdlIG11c3Qgd2VlZCBvdXQgdGhlIGV4dHJhIG9uZSBoZXJlLlxuXHRcdFx0XHRcdFx0XHRcdHNbcC5yZXBsYWNlKF9jYW1lbEV4cCwgX2NhbWVsRnVuYyldID0gY3MuZ2V0UHJvcGVydHlWYWx1ZShwKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0gZWxzZSB7IC8vc29tZSBicm93c2VycyBiZWhhdmUgZGlmZmVyZW50bHkgLSBjcy5sZW5ndGggaXMgYWx3YXlzIDAsIHNvIHdlIG11c3QgZG8gYSBmb3IuLi5pbiBsb29wLlxuXHRcdFx0XHRcdFx0Zm9yIChpIGluIGNzKSB7XG5cdFx0XHRcdFx0XHRcdGlmIChpLmluZGV4T2YoXCJUcmFuc2Zvcm1cIikgPT09IC0xIHx8IF90cmFuc2Zvcm1Qcm9wID09PSBpKSB7IC8vU29tZSB3ZWJraXQgYnJvd3NlcnMgZHVwbGljYXRlIHRyYW5zZm9ybSB2YWx1ZXMsIG9uZSBub24tcHJlZml4ZWQgYW5kIG9uZSBwcmVmaXhlZCAoXCJ0cmFuc2Zvcm1cIiBhbmQgXCJXZWJraXRUcmFuc2Zvcm1cIiksIHNvIHdlIG11c3Qgd2VlZCBvdXQgdGhlIGV4dHJhIG9uZSBoZXJlLlxuXHRcdFx0XHRcdFx0XHRcdHNbaV0gPSBjc1tpXTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSBlbHNlIGlmICgoY3MgPSB0LmN1cnJlbnRTdHlsZSB8fCB0LnN0eWxlKSkge1xuXHRcdFx0XHRcdGZvciAoaSBpbiBjcykge1xuXHRcdFx0XHRcdFx0aWYgKHR5cGVvZihpKSA9PT0gXCJzdHJpbmdcIiAmJiBzW2ldID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHRcdFx0c1tpLnJlcGxhY2UoX2NhbWVsRXhwLCBfY2FtZWxGdW5jKV0gPSBjc1tpXTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKCFfc3VwcG9ydHNPcGFjaXR5KSB7XG5cdFx0XHRcdFx0cy5vcGFjaXR5ID0gX2dldElFT3BhY2l0eSh0KTtcblx0XHRcdFx0fVxuXHRcdFx0XHR0ciA9IF9nZXRUcmFuc2Zvcm0odCwgY3MsIGZhbHNlKTtcblx0XHRcdFx0cy5yb3RhdGlvbiA9IHRyLnJvdGF0aW9uO1xuXHRcdFx0XHRzLnNrZXdYID0gdHIuc2tld1g7XG5cdFx0XHRcdHMuc2NhbGVYID0gdHIuc2NhbGVYO1xuXHRcdFx0XHRzLnNjYWxlWSA9IHRyLnNjYWxlWTtcblx0XHRcdFx0cy54ID0gdHIueDtcblx0XHRcdFx0cy55ID0gdHIueTtcblx0XHRcdFx0aWYgKF9zdXBwb3J0czNEKSB7XG5cdFx0XHRcdFx0cy56ID0gdHIuejtcblx0XHRcdFx0XHRzLnJvdGF0aW9uWCA9IHRyLnJvdGF0aW9uWDtcblx0XHRcdFx0XHRzLnJvdGF0aW9uWSA9IHRyLnJvdGF0aW9uWTtcblx0XHRcdFx0XHRzLnNjYWxlWiA9IHRyLnNjYWxlWjtcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAocy5maWx0ZXJzKSB7XG5cdFx0XHRcdFx0ZGVsZXRlIHMuZmlsdGVycztcblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gcztcblx0XHRcdH0sXG5cblx0XHRcdC8vIEBwcml2YXRlIGFuYWx5emVzIHR3byBzdHlsZSBvYmplY3RzIChhcyByZXR1cm5lZCBieSBfZ2V0QWxsU3R5bGVzKCkpIGFuZCBvbmx5IGxvb2tzIGZvciBkaWZmZXJlbmNlcyBiZXR3ZWVuIHRoZW0gdGhhdCBjb250YWluIHR3ZWVuYWJsZSB2YWx1ZXMgKGxpa2UgYSBudW1iZXIgb3IgY29sb3IpLiBJdCByZXR1cm5zIGFuIG9iamVjdCB3aXRoIGEgXCJkaWZzXCIgcHJvcGVydHkgd2hpY2ggcmVmZXJzIHRvIGFuIG9iamVjdCBjb250YWluaW5nIG9ubHkgdGhvc2UgaXNvbGF0ZWQgcHJvcGVydGllcyBhbmQgdmFsdWVzIGZvciB0d2VlbmluZywgYW5kIGEgXCJmaXJzdE1QVFwiIHByb3BlcnR5IHdoaWNoIHJlZmVycyB0byB0aGUgZmlyc3QgTWluaVByb3BUd2VlbiBpbnN0YW5jZSBpbiBhIGxpbmtlZCBsaXN0IHRoYXQgcmVjb3JkZWQgYWxsIHRoZSBzdGFydGluZyB2YWx1ZXMgb2YgdGhlIGRpZmZlcmVudCBwcm9wZXJ0aWVzIHNvIHRoYXQgd2UgY2FuIHJldmVydCB0byB0aGVtIGF0IHRoZSBlbmQgb3IgYmVnaW5uaW5nIG9mIHRoZSB0d2VlbiAtIHdlIGRvbid0IHdhbnQgdGhlIGNhc2NhZGluZyB0byBnZXQgbWVzc2VkIHVwLiBUaGUgZm9yY2VMb29rdXAgcGFyYW1ldGVyIGlzIGFuIG9wdGlvbmFsIGdlbmVyaWMgb2JqZWN0IHdpdGggcHJvcGVydGllcyB0aGF0IHNob3VsZCBiZSBmb3JjZWQgaW50byB0aGUgcmVzdWx0cyAtIHRoaXMgaXMgbmVjZXNzYXJ5IGZvciBjbGFzc05hbWUgdHdlZW5zIHRoYXQgYXJlIG92ZXJ3cml0aW5nIG90aGVycyBiZWNhdXNlIGltYWdpbmUgYSBzY2VuYXJpbyB3aGVyZSBhIHJvbGxvdmVyL3JvbGxvdXQgYWRkcy9yZW1vdmVzIGEgY2xhc3MgYW5kIHRoZSB1c2VyIHN3aXBlcyB0aGUgbW91c2Ugb3ZlciB0aGUgdGFyZ2V0IFNVUEVSIGZhc3QsIHRodXMgbm90aGluZyBhY3R1YWxseSBjaGFuZ2VkIHlldCBhbmQgdGhlIHN1YnNlcXVlbnQgY29tcGFyaXNvbiBvZiB0aGUgcHJvcGVydGllcyB3b3VsZCBpbmRpY2F0ZSB0aGV5IG1hdGNoIChlc3BlY2lhbGx5IHdoZW4gcHggcm91bmRpbmcgaXMgdGFrZW4gaW50byBjb25zaWRlcmF0aW9uKSwgdGh1cyBubyB0d2VlbmluZyBpcyBuZWNlc3NhcnkgZXZlbiB0aG91Z2ggaXQgU0hPVUxEIHR3ZWVuIGFuZCByZW1vdmUgdGhvc2UgcHJvcGVydGllcyBhZnRlciB0aGUgdHdlZW4gKG90aGVyd2lzZSB0aGUgaW5saW5lIHN0eWxlcyB3aWxsIGNvbnRhbWluYXRlIHRoaW5ncykuIFNlZSB0aGUgY2xhc3NOYW1lIFNwZWNpYWxQcm9wIGNvZGUgZm9yIGRldGFpbHMuXG5cdFx0XHRfY3NzRGlmID0gZnVuY3Rpb24odCwgczEsIHMyLCB2YXJzLCBmb3JjZUxvb2t1cCkge1xuXHRcdFx0XHR2YXIgZGlmcyA9IHt9LFxuXHRcdFx0XHRcdHN0eWxlID0gdC5zdHlsZSxcblx0XHRcdFx0XHR2YWwsIHAsIG1wdDtcblx0XHRcdFx0Zm9yIChwIGluIHMyKSB7XG5cdFx0XHRcdFx0aWYgKHAgIT09IFwiY3NzVGV4dFwiKSBpZiAocCAhPT0gXCJsZW5ndGhcIikgaWYgKGlzTmFOKHApKSBpZiAoczFbcF0gIT09ICh2YWwgPSBzMltwXSkgfHwgKGZvcmNlTG9va3VwICYmIGZvcmNlTG9va3VwW3BdKSkgaWYgKHAuaW5kZXhPZihcIk9yaWdpblwiKSA9PT0gLTEpIGlmICh0eXBlb2YodmFsKSA9PT0gXCJudW1iZXJcIiB8fCB0eXBlb2YodmFsKSA9PT0gXCJzdHJpbmdcIikge1xuXHRcdFx0XHRcdFx0ZGlmc1twXSA9ICh2YWwgPT09IFwiYXV0b1wiICYmIChwID09PSBcImxlZnRcIiB8fCBwID09PSBcInRvcFwiKSkgPyBfY2FsY3VsYXRlT2Zmc2V0KHQsIHApIDogKCh2YWwgPT09IFwiXCIgfHwgdmFsID09PSBcImF1dG9cIiB8fCB2YWwgPT09IFwibm9uZVwiKSAmJiB0eXBlb2YoczFbcF0pID09PSBcInN0cmluZ1wiICYmIHMxW3BdLnJlcGxhY2UoX05hTkV4cCwgXCJcIikgIT09IFwiXCIpID8gMCA6IHZhbDsgLy9pZiB0aGUgZW5kaW5nIHZhbHVlIGlzIGRlZmF1bHRpbmcgKFwiXCIgb3IgXCJhdXRvXCIpLCB3ZSBjaGVjayB0aGUgc3RhcnRpbmcgdmFsdWUgYW5kIGlmIGl0IGNhbiBiZSBwYXJzZWQgaW50byBhIG51bWJlciAoYSBzdHJpbmcgd2hpY2ggY291bGQgaGF2ZSBhIHN1ZmZpeCB0b28sIGxpa2UgNzAwcHgpLCB0aGVuIHdlIHN3YXAgaW4gMCBmb3IgXCJcIiBvciBcImF1dG9cIiBzbyB0aGF0IHRoaW5ncyBhY3R1YWxseSB0d2Vlbi5cblx0XHRcdFx0XHRcdGlmIChzdHlsZVtwXSAhPT0gdW5kZWZpbmVkKSB7IC8vZm9yIGNsYXNzTmFtZSB0d2VlbnMsIHdlIG11c3QgcmVtZW1iZXIgd2hpY2ggcHJvcGVydGllcyBhbHJlYWR5IGV4aXN0ZWQgaW5saW5lIC0gdGhlIG9uZXMgdGhhdCBkaWRuJ3Qgc2hvdWxkIGJlIHJlbW92ZWQgd2hlbiB0aGUgdHdlZW4gaXNuJ3QgaW4gcHJvZ3Jlc3MgYmVjYXVzZSB0aGV5IHdlcmUgb25seSBpbnRyb2R1Y2VkIHRvIGZhY2lsaXRhdGUgdGhlIHRyYW5zaXRpb24gYmV0d2VlbiBjbGFzc2VzLlxuXHRcdFx0XHRcdFx0XHRtcHQgPSBuZXcgTWluaVByb3BUd2VlbihzdHlsZSwgcCwgc3R5bGVbcF0sIG1wdCk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdGlmICh2YXJzKSB7XG5cdFx0XHRcdFx0Zm9yIChwIGluIHZhcnMpIHsgLy9jb3B5IHByb3BlcnRpZXMgKGV4Y2VwdCBjbGFzc05hbWUpXG5cdFx0XHRcdFx0XHRpZiAocCAhPT0gXCJjbGFzc05hbWVcIikge1xuXHRcdFx0XHRcdFx0XHRkaWZzW3BdID0gdmFyc1twXTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIHtkaWZzOmRpZnMsIGZpcnN0TVBUOm1wdH07XG5cdFx0XHR9LFxuXHRcdFx0X2RpbWVuc2lvbnMgPSB7d2lkdGg6W1wiTGVmdFwiLFwiUmlnaHRcIl0sIGhlaWdodDpbXCJUb3BcIixcIkJvdHRvbVwiXX0sXG5cdFx0XHRfbWFyZ2lucyA9IFtcIm1hcmdpbkxlZnRcIixcIm1hcmdpblJpZ2h0XCIsXCJtYXJnaW5Ub3BcIixcIm1hcmdpbkJvdHRvbVwiXSxcblxuXHRcdFx0LyoqXG5cdFx0XHQgKiBAcHJpdmF0ZSBHZXRzIHRoZSB3aWR0aCBvciBoZWlnaHQgb2YgYW4gZWxlbWVudFxuXHRcdFx0ICogQHBhcmFtIHshT2JqZWN0fSB0IFRhcmdldCBlbGVtZW50XG5cdFx0XHQgKiBAcGFyYW0geyFzdHJpbmd9IHAgUHJvcGVydHkgbmFtZSAoXCJ3aWR0aFwiIG9yIFwiaGVpZ2h0XCIpXG5cdFx0XHQgKiBAcGFyYW0ge09iamVjdD19IGNzIENvbXB1dGVkIHN0eWxlIG9iamVjdCAoaWYgb25lIGV4aXN0cykuIEp1c3QgYSBzcGVlZCBvcHRpbWl6YXRpb24uXG5cdFx0XHQgKiBAcmV0dXJuIHtudW1iZXJ9IERpbWVuc2lvbiAoaW4gcGl4ZWxzKVxuXHRcdFx0ICovXG5cdFx0XHRfZ2V0RGltZW5zaW9uID0gZnVuY3Rpb24odCwgcCwgY3MpIHtcblx0XHRcdFx0aWYgKCh0Lm5vZGVOYW1lICsgXCJcIikudG9Mb3dlckNhc2UoKSA9PT0gXCJzdmdcIikgeyAvL0Nocm9tZSBubyBsb25nZXIgc3VwcG9ydHMgb2Zmc2V0V2lkdGgvb2Zmc2V0SGVpZ2h0IG9uIFNWRyBlbGVtZW50cy5cblx0XHRcdFx0XHRyZXR1cm4gKGNzIHx8IF9nZXRDb21wdXRlZFN0eWxlKHQpKVtwXSB8fCAwO1xuXHRcdFx0XHR9IGVsc2UgaWYgKHQuZ2V0Q1RNICYmIF9pc1NWRyh0KSkge1xuXHRcdFx0XHRcdHJldHVybiB0LmdldEJCb3goKVtwXSB8fCAwO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHZhciB2ID0gcGFyc2VGbG9hdCgocCA9PT0gXCJ3aWR0aFwiKSA/IHQub2Zmc2V0V2lkdGggOiB0Lm9mZnNldEhlaWdodCksXG5cdFx0XHRcdFx0YSA9IF9kaW1lbnNpb25zW3BdLFxuXHRcdFx0XHRcdGkgPSBhLmxlbmd0aDtcblx0XHRcdFx0Y3MgPSBjcyB8fCBfZ2V0Q29tcHV0ZWRTdHlsZSh0LCBudWxsKTtcblx0XHRcdFx0d2hpbGUgKC0taSA+IC0xKSB7XG5cdFx0XHRcdFx0diAtPSBwYXJzZUZsb2F0KCBfZ2V0U3R5bGUodCwgXCJwYWRkaW5nXCIgKyBhW2ldLCBjcywgdHJ1ZSkgKSB8fCAwO1xuXHRcdFx0XHRcdHYgLT0gcGFyc2VGbG9hdCggX2dldFN0eWxlKHQsIFwiYm9yZGVyXCIgKyBhW2ldICsgXCJXaWR0aFwiLCBjcywgdHJ1ZSkgKSB8fCAwO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiB2O1xuXHRcdFx0fSxcblxuXHRcdFx0Ly8gQHByaXZhdGUgUGFyc2VzIHBvc2l0aW9uLXJlbGF0ZWQgY29tcGxleCBzdHJpbmdzIGxpa2UgXCJ0b3AgbGVmdFwiIG9yIFwiNTBweCAxMHB4XCIgb3IgXCI3MCUgMjAlXCIsIGV0Yy4gd2hpY2ggYXJlIHVzZWQgZm9yIHRoaW5ncyBsaWtlIHRyYW5zZm9ybU9yaWdpbiBvciBiYWNrZ3JvdW5kUG9zaXRpb24uIE9wdGlvbmFsbHkgZGVjb3JhdGVzIGEgc3VwcGxpZWQgb2JqZWN0IChyZWNPYmopIHdpdGggdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOiBcIm94XCIgKG9mZnNldFgpLCBcIm95XCIgKG9mZnNldFkpLCBcIm94cFwiIChpZiB0cnVlLCBcIm94XCIgaXMgYSBwZXJjZW50YWdlIG5vdCBhIHBpeGVsIHZhbHVlKSwgYW5kIFwib3h5XCIgKGlmIHRydWUsIFwib3lcIiBpcyBhIHBlcmNlbnRhZ2Ugbm90IGEgcGl4ZWwgdmFsdWUpXG5cdFx0XHRfcGFyc2VQb3NpdGlvbiA9IGZ1bmN0aW9uKHYsIHJlY09iaikge1xuXHRcdFx0XHRpZiAodiA9PT0gXCJjb250YWluXCIgfHwgdiA9PT0gXCJhdXRvXCIgfHwgdiA9PT0gXCJhdXRvIGF1dG9cIikgeyAvL25vdGU6IEZpcmVmb3ggdXNlcyBcImF1dG8gYXV0b1wiIGFzIGRlZmF1bHQgd2hlcmVhcyBDaHJvbWUgdXNlcyBcImF1dG9cIi5cblx0XHRcdFx0XHRyZXR1cm4gdiArIFwiIFwiO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmICh2ID09IG51bGwgfHwgdiA9PT0gXCJcIikge1xuXHRcdFx0XHRcdHYgPSBcIjAgMFwiO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHZhciBhID0gdi5zcGxpdChcIiBcIiksXG5cdFx0XHRcdFx0eCA9ICh2LmluZGV4T2YoXCJsZWZ0XCIpICE9PSAtMSkgPyBcIjAlXCIgOiAodi5pbmRleE9mKFwicmlnaHRcIikgIT09IC0xKSA/IFwiMTAwJVwiIDogYVswXSxcblx0XHRcdFx0XHR5ID0gKHYuaW5kZXhPZihcInRvcFwiKSAhPT0gLTEpID8gXCIwJVwiIDogKHYuaW5kZXhPZihcImJvdHRvbVwiKSAhPT0gLTEpID8gXCIxMDAlXCIgOiBhWzFdLFxuXHRcdFx0XHRcdGk7XG5cdFx0XHRcdGlmIChhLmxlbmd0aCA+IDMgJiYgIXJlY09iaikgeyAvL211bHRpcGxlIHBvc2l0aW9uc1xuXHRcdFx0XHRcdGEgPSB2LnNwbGl0KFwiLCBcIikuam9pbihcIixcIikuc3BsaXQoXCIsXCIpO1xuXHRcdFx0XHRcdHYgPSBbXTtcblx0XHRcdFx0XHRmb3IgKGkgPSAwOyBpIDwgYS5sZW5ndGg7IGkrKykge1xuXHRcdFx0XHRcdFx0di5wdXNoKF9wYXJzZVBvc2l0aW9uKGFbaV0pKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0cmV0dXJuIHYuam9pbihcIixcIik7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKHkgPT0gbnVsbCkge1xuXHRcdFx0XHRcdHkgPSAoeCA9PT0gXCJjZW50ZXJcIikgPyBcIjUwJVwiIDogXCIwXCI7XG5cdFx0XHRcdH0gZWxzZSBpZiAoeSA9PT0gXCJjZW50ZXJcIikge1xuXHRcdFx0XHRcdHkgPSBcIjUwJVwiO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmICh4ID09PSBcImNlbnRlclwiIHx8IChpc05hTihwYXJzZUZsb2F0KHgpKSAmJiAoeCArIFwiXCIpLmluZGV4T2YoXCI9XCIpID09PSAtMSkpIHsgLy9yZW1lbWJlciwgdGhlIHVzZXIgY291bGQgZmxpcC1mbG9wIHRoZSB2YWx1ZXMgYW5kIHNheSBcImJvdHRvbSBjZW50ZXJcIiBvciBcImNlbnRlciBib3R0b21cIiwgZXRjLiBcImNlbnRlclwiIGlzIGFtYmlndW91cyBiZWNhdXNlIGl0IGNvdWxkIGJlIHVzZWQgdG8gZGVzY3JpYmUgaG9yaXpvbnRhbCBvciB2ZXJ0aWNhbCwgaGVuY2UgdGhlIGlzTmFOKCkuIElmIHRoZXJlJ3MgYW4gXCI9XCIgc2lnbiBpbiB0aGUgdmFsdWUsIGl0J3MgcmVsYXRpdmUuXG5cdFx0XHRcdFx0eCA9IFwiNTAlXCI7XG5cdFx0XHRcdH1cblx0XHRcdFx0diA9IHggKyBcIiBcIiArIHkgKyAoKGEubGVuZ3RoID4gMikgPyBcIiBcIiArIGFbMl0gOiBcIlwiKTtcblx0XHRcdFx0aWYgKHJlY09iaikge1xuXHRcdFx0XHRcdHJlY09iai5veHAgPSAoeC5pbmRleE9mKFwiJVwiKSAhPT0gLTEpO1xuXHRcdFx0XHRcdHJlY09iai5veXAgPSAoeS5pbmRleE9mKFwiJVwiKSAhPT0gLTEpO1xuXHRcdFx0XHRcdHJlY09iai5veHIgPSAoeC5jaGFyQXQoMSkgPT09IFwiPVwiKTtcblx0XHRcdFx0XHRyZWNPYmoub3lyID0gKHkuY2hhckF0KDEpID09PSBcIj1cIik7XG5cdFx0XHRcdFx0cmVjT2JqLm94ID0gcGFyc2VGbG9hdCh4LnJlcGxhY2UoX05hTkV4cCwgXCJcIikpO1xuXHRcdFx0XHRcdHJlY09iai5veSA9IHBhcnNlRmxvYXQoeS5yZXBsYWNlKF9OYU5FeHAsIFwiXCIpKTtcblx0XHRcdFx0XHRyZWNPYmoudiA9IHY7XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIHJlY09iaiB8fCB2O1xuXHRcdFx0fSxcblxuXHRcdFx0LyoqXG5cdFx0XHQgKiBAcHJpdmF0ZSBUYWtlcyBhbiBlbmRpbmcgdmFsdWUgKHR5cGljYWxseSBhIHN0cmluZywgYnV0IGNhbiBiZSBhIG51bWJlcikgYW5kIGEgc3RhcnRpbmcgdmFsdWUgYW5kIHJldHVybnMgdGhlIGNoYW5nZSBiZXR3ZWVuIHRoZSB0d28sIGxvb2tpbmcgZm9yIHJlbGF0aXZlIHZhbHVlIGluZGljYXRvcnMgbGlrZSArPSBhbmQgLT0gYW5kIGl0IGFsc28gaWdub3JlcyBzdWZmaXhlcyAoYnV0IG1ha2Ugc3VyZSB0aGUgZW5kaW5nIHZhbHVlIHN0YXJ0cyB3aXRoIGEgbnVtYmVyIG9yICs9Ly09IGFuZCB0aGF0IHRoZSBzdGFydGluZyB2YWx1ZSBpcyBhIE5VTUJFUiEpXG5cdFx0XHQgKiBAcGFyYW0geyhudW1iZXJ8c3RyaW5nKX0gZSBFbmQgdmFsdWUgd2hpY2ggaXMgdHlwaWNhbGx5IGEgc3RyaW5nLCBidXQgY291bGQgYmUgYSBudW1iZXJcblx0XHRcdCAqIEBwYXJhbSB7KG51bWJlcnxzdHJpbmcpfSBiIEJlZ2lubmluZyB2YWx1ZSB3aGljaCBpcyB0eXBpY2FsbHkgYSBzdHJpbmcgYnV0IGNvdWxkIGJlIGEgbnVtYmVyXG5cdFx0XHQgKiBAcmV0dXJuIHtudW1iZXJ9IEFtb3VudCBvZiBjaGFuZ2UgYmV0d2VlbiB0aGUgYmVnaW5uaW5nIGFuZCBlbmRpbmcgdmFsdWVzIChyZWxhdGl2ZSB2YWx1ZXMgdGhhdCBoYXZlIGEgXCIrPVwiIG9yIFwiLT1cIiBhcmUgcmVjb2duaXplZClcblx0XHRcdCAqL1xuXHRcdFx0X3BhcnNlQ2hhbmdlID0gZnVuY3Rpb24oZSwgYikge1xuXHRcdFx0XHRpZiAodHlwZW9mKGUpID09PSBcImZ1bmN0aW9uXCIpIHtcblx0XHRcdFx0XHRlID0gZShfaW5kZXgsIF90YXJnZXQpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiAodHlwZW9mKGUpID09PSBcInN0cmluZ1wiICYmIGUuY2hhckF0KDEpID09PSBcIj1cIikgPyBwYXJzZUludChlLmNoYXJBdCgwKSArIFwiMVwiLCAxMCkgKiBwYXJzZUZsb2F0KGUuc3Vic3RyKDIpKSA6IChwYXJzZUZsb2F0KGUpIC0gcGFyc2VGbG9hdChiKSkgfHwgMDtcblx0XHRcdH0sXG5cblx0XHRcdC8qKlxuXHRcdFx0ICogQHByaXZhdGUgVGFrZXMgYSB2YWx1ZSBhbmQgYSBkZWZhdWx0IG51bWJlciwgY2hlY2tzIGlmIHRoZSB2YWx1ZSBpcyByZWxhdGl2ZSwgbnVsbCwgb3IgbnVtZXJpYyBhbmQgc3BpdHMgYmFjayBhIG5vcm1hbGl6ZWQgbnVtYmVyIGFjY29yZGluZ2x5LiBQcmltYXJpbHkgdXNlZCBpbiB0aGUgX3BhcnNlVHJhbnNmb3JtKCkgZnVuY3Rpb24uXG5cdFx0XHQgKiBAcGFyYW0ge09iamVjdH0gdiBWYWx1ZSB0byBiZSBwYXJzZWRcblx0XHRcdCAqIEBwYXJhbSB7IW51bWJlcn0gZCBEZWZhdWx0IHZhbHVlICh3aGljaCBpcyBhbHNvIHVzZWQgZm9yIHJlbGF0aXZlIGNhbGN1bGF0aW9ucyBpZiBcIis9XCIgb3IgXCItPVwiIGlzIGZvdW5kIGluIHRoZSBmaXJzdCBwYXJhbWV0ZXIpXG5cdFx0XHQgKiBAcmV0dXJuIHtudW1iZXJ9IFBhcnNlZCB2YWx1ZVxuXHRcdFx0ICovXG5cdFx0XHRfcGFyc2VWYWwgPSBmdW5jdGlvbih2LCBkKSB7XG5cdFx0XHRcdGlmICh0eXBlb2YodikgPT09IFwiZnVuY3Rpb25cIikge1xuXHRcdFx0XHRcdHYgPSB2KF9pbmRleCwgX3RhcmdldCk7XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuICh2ID09IG51bGwpID8gZCA6ICh0eXBlb2YodikgPT09IFwic3RyaW5nXCIgJiYgdi5jaGFyQXQoMSkgPT09IFwiPVwiKSA/IHBhcnNlSW50KHYuY2hhckF0KDApICsgXCIxXCIsIDEwKSAqIHBhcnNlRmxvYXQodi5zdWJzdHIoMikpICsgZCA6IHBhcnNlRmxvYXQodikgfHwgMDtcblx0XHRcdH0sXG5cblx0XHRcdC8qKlxuXHRcdFx0ICogQHByaXZhdGUgVHJhbnNsYXRlcyBzdHJpbmdzIGxpa2UgXCI0MGRlZ1wiIG9yIFwiNDBcIiBvciA0MHJhZFwiIG9yIFwiKz00MGRlZ1wiIG9yIFwiMjcwX3Nob3J0XCIgb3IgXCItOTBfY3dcIiBvciBcIis9NDVfY2N3XCIgdG8gYSBudW1lcmljIHJhZGlhbiBhbmdsZS4gT2YgY291cnNlIGEgc3RhcnRpbmcvZGVmYXVsdCB2YWx1ZSBtdXN0IGJlIGZlZCBpbiB0b28gc28gdGhhdCByZWxhdGl2ZSB2YWx1ZXMgY2FuIGJlIGNhbGN1bGF0ZWQgcHJvcGVybHkuXG5cdFx0XHQgKiBAcGFyYW0ge09iamVjdH0gdiBWYWx1ZSB0byBiZSBwYXJzZWRcblx0XHRcdCAqIEBwYXJhbSB7IW51bWJlcn0gZCBEZWZhdWx0IHZhbHVlICh3aGljaCBpcyBhbHNvIHVzZWQgZm9yIHJlbGF0aXZlIGNhbGN1bGF0aW9ucyBpZiBcIis9XCIgb3IgXCItPVwiIGlzIGZvdW5kIGluIHRoZSBmaXJzdCBwYXJhbWV0ZXIpXG5cdFx0XHQgKiBAcGFyYW0ge3N0cmluZz19IHAgcHJvcGVydHkgbmFtZSBmb3IgZGlyZWN0aW9uYWxFbmQgKG9wdGlvbmFsIC0gb25seSB1c2VkIHdoZW4gdGhlIHBhcnNlZCB2YWx1ZSBpcyBkaXJlY3Rpb25hbCAoXCJfc2hvcnRcIiwgXCJfY3dcIiwgb3IgXCJfY2N3XCIgc3VmZml4KS4gV2UgbmVlZCBhIHdheSB0byBzdG9yZSB0aGUgdW5jb21wZW5zYXRlZCB2YWx1ZSBzbyB0aGF0IGF0IHRoZSBlbmQgb2YgdGhlIHR3ZWVuLCB3ZSBzZXQgaXQgdG8gZXhhY3RseSB3aGF0IHdhcyByZXF1ZXN0ZWQgd2l0aCBubyBkaXJlY3Rpb25hbCBjb21wZW5zYXRpb24pLiBQcm9wZXJ0eSBuYW1lIHdvdWxkIGJlIFwicm90YXRpb25cIiwgXCJyb3RhdGlvblhcIiwgb3IgXCJyb3RhdGlvbllcIlxuXHRcdFx0ICogQHBhcmFtIHtPYmplY3Q9fSBkaXJlY3Rpb25hbEVuZCBBbiBvYmplY3QgdGhhdCB3aWxsIHN0b3JlIHRoZSByYXcgZW5kIHZhbHVlcyBmb3IgZGlyZWN0aW9uYWwgYW5nbGVzIChcIl9zaG9ydFwiLCBcIl9jd1wiLCBvciBcIl9jY3dcIiBzdWZmaXgpLiBXZSBuZWVkIGEgd2F5IHRvIHN0b3JlIHRoZSB1bmNvbXBlbnNhdGVkIHZhbHVlIHNvIHRoYXQgYXQgdGhlIGVuZCBvZiB0aGUgdHdlZW4sIHdlIHNldCBpdCB0byBleGFjdGx5IHdoYXQgd2FzIHJlcXVlc3RlZCB3aXRoIG5vIGRpcmVjdGlvbmFsIGNvbXBlbnNhdGlvbi5cblx0XHRcdCAqIEByZXR1cm4ge251bWJlcn0gcGFyc2VkIGFuZ2xlIGluIHJhZGlhbnNcblx0XHRcdCAqL1xuXHRcdFx0X3BhcnNlQW5nbGUgPSBmdW5jdGlvbih2LCBkLCBwLCBkaXJlY3Rpb25hbEVuZCkge1xuXHRcdFx0XHR2YXIgbWluID0gMC4wMDAwMDEsXG5cdFx0XHRcdFx0Y2FwLCBzcGxpdCwgZGlmLCByZXN1bHQsIGlzUmVsYXRpdmU7XG5cdFx0XHRcdGlmICh0eXBlb2YodikgPT09IFwiZnVuY3Rpb25cIikge1xuXHRcdFx0XHRcdHYgPSB2KF9pbmRleCwgX3RhcmdldCk7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKHYgPT0gbnVsbCkge1xuXHRcdFx0XHRcdHJlc3VsdCA9IGQ7XG5cdFx0XHRcdH0gZWxzZSBpZiAodHlwZW9mKHYpID09PSBcIm51bWJlclwiKSB7XG5cdFx0XHRcdFx0cmVzdWx0ID0gdjtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRjYXAgPSAzNjA7XG5cdFx0XHRcdFx0c3BsaXQgPSB2LnNwbGl0KFwiX1wiKTtcblx0XHRcdFx0XHRpc1JlbGF0aXZlID0gKHYuY2hhckF0KDEpID09PSBcIj1cIik7XG5cdFx0XHRcdFx0ZGlmID0gKGlzUmVsYXRpdmUgPyBwYXJzZUludCh2LmNoYXJBdCgwKSArIFwiMVwiLCAxMCkgKiBwYXJzZUZsb2F0KHNwbGl0WzBdLnN1YnN0cigyKSkgOiBwYXJzZUZsb2F0KHNwbGl0WzBdKSkgKiAoKHYuaW5kZXhPZihcInJhZFwiKSA9PT0gLTEpID8gMSA6IF9SQUQyREVHKSAtIChpc1JlbGF0aXZlID8gMCA6IGQpO1xuXHRcdFx0XHRcdGlmIChzcGxpdC5sZW5ndGgpIHtcblx0XHRcdFx0XHRcdGlmIChkaXJlY3Rpb25hbEVuZCkge1xuXHRcdFx0XHRcdFx0XHRkaXJlY3Rpb25hbEVuZFtwXSA9IGQgKyBkaWY7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRpZiAodi5pbmRleE9mKFwic2hvcnRcIikgIT09IC0xKSB7XG5cdFx0XHRcdFx0XHRcdGRpZiA9IGRpZiAlIGNhcDtcblx0XHRcdFx0XHRcdFx0aWYgKGRpZiAhPT0gZGlmICUgKGNhcCAvIDIpKSB7XG5cdFx0XHRcdFx0XHRcdFx0ZGlmID0gKGRpZiA8IDApID8gZGlmICsgY2FwIDogZGlmIC0gY2FwO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRpZiAodi5pbmRleE9mKFwiX2N3XCIpICE9PSAtMSAmJiBkaWYgPCAwKSB7XG5cdFx0XHRcdFx0XHRcdGRpZiA9ICgoZGlmICsgY2FwICogOTk5OTk5OTk5OSkgJSBjYXApIC0gKChkaWYgLyBjYXApIHwgMCkgKiBjYXA7XG5cdFx0XHRcdFx0XHR9IGVsc2UgaWYgKHYuaW5kZXhPZihcImNjd1wiKSAhPT0gLTEgJiYgZGlmID4gMCkge1xuXHRcdFx0XHRcdFx0XHRkaWYgPSAoKGRpZiAtIGNhcCAqIDk5OTk5OTk5OTkpICUgY2FwKSAtICgoZGlmIC8gY2FwKSB8IDApICogY2FwO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRyZXN1bHQgPSBkICsgZGlmO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmIChyZXN1bHQgPCBtaW4gJiYgcmVzdWx0ID4gLW1pbikge1xuXHRcdFx0XHRcdHJlc3VsdCA9IDA7XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIHJlc3VsdDtcblx0XHRcdH0sXG5cblx0XHRcdF9jb2xvckxvb2t1cCA9IHthcXVhOlswLDI1NSwyNTVdLFxuXHRcdFx0XHRsaW1lOlswLDI1NSwwXSxcblx0XHRcdFx0c2lsdmVyOlsxOTIsMTkyLDE5Ml0sXG5cdFx0XHRcdGJsYWNrOlswLDAsMF0sXG5cdFx0XHRcdG1hcm9vbjpbMTI4LDAsMF0sXG5cdFx0XHRcdHRlYWw6WzAsMTI4LDEyOF0sXG5cdFx0XHRcdGJsdWU6WzAsMCwyNTVdLFxuXHRcdFx0XHRuYXZ5OlswLDAsMTI4XSxcblx0XHRcdFx0d2hpdGU6WzI1NSwyNTUsMjU1XSxcblx0XHRcdFx0ZnVjaHNpYTpbMjU1LDAsMjU1XSxcblx0XHRcdFx0b2xpdmU6WzEyOCwxMjgsMF0sXG5cdFx0XHRcdHllbGxvdzpbMjU1LDI1NSwwXSxcblx0XHRcdFx0b3JhbmdlOlsyNTUsMTY1LDBdLFxuXHRcdFx0XHRncmF5OlsxMjgsMTI4LDEyOF0sXG5cdFx0XHRcdHB1cnBsZTpbMTI4LDAsMTI4XSxcblx0XHRcdFx0Z3JlZW46WzAsMTI4LDBdLFxuXHRcdFx0XHRyZWQ6WzI1NSwwLDBdLFxuXHRcdFx0XHRwaW5rOlsyNTUsMTkyLDIwM10sXG5cdFx0XHRcdGN5YW46WzAsMjU1LDI1NV0sXG5cdFx0XHRcdHRyYW5zcGFyZW50OlsyNTUsMjU1LDI1NSwwXX0sXG5cblx0XHRcdF9odWUgPSBmdW5jdGlvbihoLCBtMSwgbTIpIHtcblx0XHRcdFx0aCA9IChoIDwgMCkgPyBoICsgMSA6IChoID4gMSkgPyBoIC0gMSA6IGg7XG5cdFx0XHRcdHJldHVybiAoKCgoaCAqIDYgPCAxKSA/IG0xICsgKG0yIC0gbTEpICogaCAqIDYgOiAoaCA8IDAuNSkgPyBtMiA6IChoICogMyA8IDIpID8gbTEgKyAobTIgLSBtMSkgKiAoMiAvIDMgLSBoKSAqIDYgOiBtMSkgKiAyNTUpICsgMC41KSB8IDA7XG5cdFx0XHR9LFxuXG5cdFx0XHQvKipcblx0XHRcdCAqIEBwcml2YXRlIFBhcnNlcyBhIGNvbG9yIChsaWtlICM5RjAsICNGRjk5MDAsIHJnYigyNTUsNTEsMTUzKSBvciBoc2woMTA4LCA1MCUsIDEwJSkpIGludG8gYW4gYXJyYXkgd2l0aCAzIGVsZW1lbnRzIGZvciByZWQsIGdyZWVuLCBhbmQgYmx1ZSBvciBpZiB0b0hTTCBwYXJhbWV0ZXIgaXMgdHJ1ZSwgaXQgd2lsbCBwb3B1bGF0ZSB0aGUgYXJyYXkgd2l0aCBodWUsIHNhdHVyYXRpb24sIGFuZCBsaWdodG5lc3MgdmFsdWVzLiBJZiBhIHJlbGF0aXZlIHZhbHVlIGlzIGZvdW5kIGluIGFuIGhzbCgpIG9yIGhzbGEoKSBzdHJpbmcsIGl0IHdpbGwgcHJlc2VydmUgdGhvc2UgcmVsYXRpdmUgcHJlZml4ZXMgYW5kIGFsbCB0aGUgdmFsdWVzIGluIHRoZSBhcnJheSB3aWxsIGJlIHN0cmluZ3MgaW5zdGVhZCBvZiBudW1iZXJzIChpbiBhbGwgb3RoZXIgY2FzZXMgaXQgd2lsbCBiZSBwb3B1bGF0ZWQgd2l0aCBudW1iZXJzKS5cblx0XHRcdCAqIEBwYXJhbSB7KHN0cmluZ3xudW1iZXIpfSB2IFRoZSB2YWx1ZSB0aGUgc2hvdWxkIGJlIHBhcnNlZCB3aGljaCBjb3VsZCBiZSBhIHN0cmluZyBsaWtlICM5RjAgb3IgcmdiKDI1NSwxMDIsNTEpIG9yIHJnYmEoMjU1LDAsMCwwLjUpIG9yIGl0IGNvdWxkIGJlIGEgbnVtYmVyIGxpa2UgMHhGRjAwQ0Mgb3IgZXZlbiBhIG5hbWVkIGNvbG9yIGxpa2UgcmVkLCBibHVlLCBwdXJwbGUsIGV0Yy5cblx0XHRcdCAqIEBwYXJhbSB7KGJvb2xlYW4pfSB0b0hTTCBJZiB0cnVlLCBhbiBoc2woKSBvciBoc2xhKCkgdmFsdWUgd2lsbCBiZSByZXR1cm5lZCBpbnN0ZWFkIG9mIHJnYigpIG9yIHJnYmEoKVxuXHRcdFx0ICogQHJldHVybiB7QXJyYXkuPG51bWJlcj59IEFuIGFycmF5IGNvbnRhaW5pbmcgcmVkLCBncmVlbiwgYW5kIGJsdWUgKGFuZCBvcHRpb25hbGx5IGFscGhhKSBpbiB0aGF0IG9yZGVyLCBvciBpZiB0aGUgdG9IU0wgcGFyYW1ldGVyIHdhcyB0cnVlLCB0aGUgYXJyYXkgd2lsbCBjb250YWluIGh1ZSwgc2F0dXJhdGlvbiBhbmQgbGlnaHRuZXNzIChhbmQgb3B0aW9uYWxseSBhbHBoYSkgaW4gdGhhdCBvcmRlci4gQWx3YXlzIG51bWJlcnMgdW5sZXNzIHRoZXJlJ3MgYSByZWxhdGl2ZSBwcmVmaXggZm91bmQgaW4gYW4gaHNsKCkgb3IgaHNsYSgpIHN0cmluZyBhbmQgdG9IU0wgaXMgdHJ1ZS5cblx0XHRcdCAqL1xuXHRcdFx0X3BhcnNlQ29sb3IgPSBDU1NQbHVnaW4ucGFyc2VDb2xvciA9IGZ1bmN0aW9uKHYsIHRvSFNMKSB7XG5cdFx0XHRcdHZhciBhLCByLCBnLCBiLCBoLCBzLCBsLCBtYXgsIG1pbiwgZCwgd2FzSFNMO1xuXHRcdFx0XHRpZiAoIXYpIHtcblx0XHRcdFx0XHRhID0gX2NvbG9yTG9va3VwLmJsYWNrO1xuXHRcdFx0XHR9IGVsc2UgaWYgKHR5cGVvZih2KSA9PT0gXCJudW1iZXJcIikge1xuXHRcdFx0XHRcdGEgPSBbdiA+PiAxNiwgKHYgPj4gOCkgJiAyNTUsIHYgJiAyNTVdO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGlmICh2LmNoYXJBdCh2Lmxlbmd0aCAtIDEpID09PSBcIixcIikgeyAvL3NvbWV0aW1lcyBhIHRyYWlsaW5nIGNvbW1hIGlzIGluY2x1ZGVkIGFuZCB3ZSBzaG91bGQgY2hvcCBpdCBvZmYgKHR5cGljYWxseSBmcm9tIGEgY29tbWEtZGVsaW1pdGVkIGxpc3Qgb2YgdmFsdWVzIGxpa2UgYSB0ZXh0U2hhZG93OlwiMnB4IDJweCAycHggYmx1ZSwgNXB4IDVweCA1cHggcmdiKDI1NSwwLDApXCIgLSBpbiB0aGlzIGV4YW1wbGUgXCJibHVlLFwiIGhhcyBhIHRyYWlsaW5nIGNvbW1hLiBXZSBjb3VsZCBzdHJpcCBpdCBvdXQgaW5zaWRlIHBhcnNlQ29tcGxleCgpIGJ1dCB3ZSdkIG5lZWQgdG8gZG8gaXQgdG8gdGhlIGJlZ2lubmluZyBhbmQgZW5kaW5nIHZhbHVlcyBwbHVzIGl0IHdvdWxkbid0IHByb3ZpZGUgcHJvdGVjdGlvbiBmcm9tIG90aGVyIHBvdGVudGlhbCBzY2VuYXJpb3MgbGlrZSBpZiB0aGUgdXNlciBwYXNzZXMgaW4gYSBzaW1pbGFyIHZhbHVlLlxuXHRcdFx0XHRcdFx0diA9IHYuc3Vic3RyKDAsIHYubGVuZ3RoIC0gMSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGlmIChfY29sb3JMb29rdXBbdl0pIHtcblx0XHRcdFx0XHRcdGEgPSBfY29sb3JMb29rdXBbdl07XG5cdFx0XHRcdFx0fSBlbHNlIGlmICh2LmNoYXJBdCgwKSA9PT0gXCIjXCIpIHtcblx0XHRcdFx0XHRcdGlmICh2Lmxlbmd0aCA9PT0gNCkgeyAvL2ZvciBzaG9ydGhhbmQgbGlrZSAjOUYwXG5cdFx0XHRcdFx0XHRcdHIgPSB2LmNoYXJBdCgxKTtcblx0XHRcdFx0XHRcdFx0ZyA9IHYuY2hhckF0KDIpO1xuXHRcdFx0XHRcdFx0XHRiID0gdi5jaGFyQXQoMyk7XG5cdFx0XHRcdFx0XHRcdHYgPSBcIiNcIiArIHIgKyByICsgZyArIGcgKyBiICsgYjtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdHYgPSBwYXJzZUludCh2LnN1YnN0cigxKSwgMTYpO1xuXHRcdFx0XHRcdFx0YSA9IFt2ID4+IDE2LCAodiA+PiA4KSAmIDI1NSwgdiAmIDI1NV07XG5cdFx0XHRcdFx0fSBlbHNlIGlmICh2LnN1YnN0cigwLCAzKSA9PT0gXCJoc2xcIikge1xuXHRcdFx0XHRcdFx0YSA9IHdhc0hTTCA9IHYubWF0Y2goX251bUV4cCk7XG5cdFx0XHRcdFx0XHRpZiAoIXRvSFNMKSB7XG5cdFx0XHRcdFx0XHRcdGggPSAoTnVtYmVyKGFbMF0pICUgMzYwKSAvIDM2MDtcblx0XHRcdFx0XHRcdFx0cyA9IE51bWJlcihhWzFdKSAvIDEwMDtcblx0XHRcdFx0XHRcdFx0bCA9IE51bWJlcihhWzJdKSAvIDEwMDtcblx0XHRcdFx0XHRcdFx0ZyA9IChsIDw9IDAuNSkgPyBsICogKHMgKyAxKSA6IGwgKyBzIC0gbCAqIHM7XG5cdFx0XHRcdFx0XHRcdHIgPSBsICogMiAtIGc7XG5cdFx0XHRcdFx0XHRcdGlmIChhLmxlbmd0aCA+IDMpIHtcblx0XHRcdFx0XHRcdFx0XHRhWzNdID0gTnVtYmVyKGFbM10pO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdGFbMF0gPSBfaHVlKGggKyAxIC8gMywgciwgZyk7XG5cdFx0XHRcdFx0XHRcdGFbMV0gPSBfaHVlKGgsIHIsIGcpO1xuXHRcdFx0XHRcdFx0XHRhWzJdID0gX2h1ZShoIC0gMSAvIDMsIHIsIGcpO1xuXHRcdFx0XHRcdFx0fSBlbHNlIGlmICh2LmluZGV4T2YoXCI9XCIpICE9PSAtMSkgeyAvL2lmIHJlbGF0aXZlIHZhbHVlcyBhcmUgZm91bmQsIGp1c3QgcmV0dXJuIHRoZSByYXcgc3RyaW5ncyB3aXRoIHRoZSByZWxhdGl2ZSBwcmVmaXhlcyBpbiBwbGFjZS5cblx0XHRcdFx0XHRcdFx0cmV0dXJuIHYubWF0Y2goX3JlbE51bUV4cCk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdGEgPSB2Lm1hdGNoKF9udW1FeHApIHx8IF9jb2xvckxvb2t1cC50cmFuc3BhcmVudDtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0YVswXSA9IE51bWJlcihhWzBdKTtcblx0XHRcdFx0XHRhWzFdID0gTnVtYmVyKGFbMV0pO1xuXHRcdFx0XHRcdGFbMl0gPSBOdW1iZXIoYVsyXSk7XG5cdFx0XHRcdFx0aWYgKGEubGVuZ3RoID4gMykge1xuXHRcdFx0XHRcdFx0YVszXSA9IE51bWJlcihhWzNdKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKHRvSFNMICYmICF3YXNIU0wpIHtcblx0XHRcdFx0XHRyID0gYVswXSAvIDI1NTtcblx0XHRcdFx0XHRnID0gYVsxXSAvIDI1NTtcblx0XHRcdFx0XHRiID0gYVsyXSAvIDI1NTtcblx0XHRcdFx0XHRtYXggPSBNYXRoLm1heChyLCBnLCBiKTtcblx0XHRcdFx0XHRtaW4gPSBNYXRoLm1pbihyLCBnLCBiKTtcblx0XHRcdFx0XHRsID0gKG1heCArIG1pbikgLyAyO1xuXHRcdFx0XHRcdGlmIChtYXggPT09IG1pbikge1xuXHRcdFx0XHRcdFx0aCA9IHMgPSAwO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRkID0gbWF4IC0gbWluO1xuXHRcdFx0XHRcdFx0cyA9IGwgPiAwLjUgPyBkIC8gKDIgLSBtYXggLSBtaW4pIDogZCAvIChtYXggKyBtaW4pO1xuXHRcdFx0XHRcdFx0aCA9IChtYXggPT09IHIpID8gKGcgLSBiKSAvIGQgKyAoZyA8IGIgPyA2IDogMCkgOiAobWF4ID09PSBnKSA/IChiIC0gcikgLyBkICsgMiA6IChyIC0gZykgLyBkICsgNDtcblx0XHRcdFx0XHRcdGggKj0gNjA7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGFbMF0gPSAoaCArIDAuNSkgfCAwO1xuXHRcdFx0XHRcdGFbMV0gPSAocyAqIDEwMCArIDAuNSkgfCAwO1xuXHRcdFx0XHRcdGFbMl0gPSAobCAqIDEwMCArIDAuNSkgfCAwO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiBhO1xuXHRcdFx0fSxcblx0XHRcdF9mb3JtYXRDb2xvcnMgPSBmdW5jdGlvbihzLCB0b0hTTCkge1xuXHRcdFx0XHR2YXIgY29sb3JzID0gcy5tYXRjaChfY29sb3JFeHApIHx8IFtdLFxuXHRcdFx0XHRcdGNoYXJJbmRleCA9IDAsXG5cdFx0XHRcdFx0cGFyc2VkID0gXCJcIixcblx0XHRcdFx0XHRpLCBjb2xvciwgdGVtcDtcblx0XHRcdFx0aWYgKCFjb2xvcnMubGVuZ3RoKSB7XG5cdFx0XHRcdFx0cmV0dXJuIHM7XG5cdFx0XHRcdH1cblx0XHRcdFx0Zm9yIChpID0gMDsgaSA8IGNvbG9ycy5sZW5ndGg7IGkrKykge1xuXHRcdFx0XHRcdGNvbG9yID0gY29sb3JzW2ldO1xuXHRcdFx0XHRcdHRlbXAgPSBzLnN1YnN0cihjaGFySW5kZXgsIHMuaW5kZXhPZihjb2xvciwgY2hhckluZGV4KS1jaGFySW5kZXgpO1xuXHRcdFx0XHRcdGNoYXJJbmRleCArPSB0ZW1wLmxlbmd0aCArIGNvbG9yLmxlbmd0aDtcblx0XHRcdFx0XHRjb2xvciA9IF9wYXJzZUNvbG9yKGNvbG9yLCB0b0hTTCk7XG5cdFx0XHRcdFx0aWYgKGNvbG9yLmxlbmd0aCA9PT0gMykge1xuXHRcdFx0XHRcdFx0Y29sb3IucHVzaCgxKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0cGFyc2VkICs9IHRlbXAgKyAodG9IU0wgPyBcImhzbGEoXCIgKyBjb2xvclswXSArIFwiLFwiICsgY29sb3JbMV0gKyBcIiUsXCIgKyBjb2xvclsyXSArIFwiJSxcIiArIGNvbG9yWzNdIDogXCJyZ2JhKFwiICsgY29sb3Iuam9pbihcIixcIikpICsgXCIpXCI7XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIHBhcnNlZCArIHMuc3Vic3RyKGNoYXJJbmRleCk7XG5cdFx0XHR9LFxuXHRcdFx0X2NvbG9yRXhwID0gXCIoPzpcXFxcYig/Oig/OnJnYnxyZ2JhfGhzbHxoc2xhKVxcXFwoLis/XFxcXCkpfFxcXFxCIyg/OlswLTlhLWZdezN9KXsxLDJ9XFxcXGJcIjsgLy93ZSdsbCBkeW5hbWljYWxseSBidWlsZCB0aGlzIFJlZ3VsYXIgRXhwcmVzc2lvbiB0byBjb25zZXJ2ZSBmaWxlIHNpemUuIEFmdGVyIGJ1aWxkaW5nIGl0LCBpdCB3aWxsIGJlIGFibGUgdG8gZmluZCByZ2IoKSwgcmdiYSgpLCAjIChoZXhhZGVjaW1hbCksIGFuZCBuYW1lZCBjb2xvciB2YWx1ZXMgbGlrZSByZWQsIGJsdWUsIHB1cnBsZSwgZXRjLlxuXG5cdFx0Zm9yIChwIGluIF9jb2xvckxvb2t1cCkge1xuXHRcdFx0X2NvbG9yRXhwICs9IFwifFwiICsgcCArIFwiXFxcXGJcIjtcblx0XHR9XG5cdFx0X2NvbG9yRXhwID0gbmV3IFJlZ0V4cChfY29sb3JFeHArXCIpXCIsIFwiZ2lcIik7XG5cblx0XHRDU1NQbHVnaW4uY29sb3JTdHJpbmdGaWx0ZXIgPSBmdW5jdGlvbihhKSB7XG5cdFx0XHR2YXIgY29tYmluZWQgPSBhWzBdICsgXCIgXCIgKyBhWzFdLFxuXHRcdFx0XHR0b0hTTDtcblx0XHRcdGlmIChfY29sb3JFeHAudGVzdChjb21iaW5lZCkpIHtcblx0XHRcdFx0dG9IU0wgPSAoY29tYmluZWQuaW5kZXhPZihcImhzbChcIikgIT09IC0xIHx8IGNvbWJpbmVkLmluZGV4T2YoXCJoc2xhKFwiKSAhPT0gLTEpO1xuXHRcdFx0XHRhWzBdID0gX2Zvcm1hdENvbG9ycyhhWzBdLCB0b0hTTCk7XG5cdFx0XHRcdGFbMV0gPSBfZm9ybWF0Q29sb3JzKGFbMV0sIHRvSFNMKTtcblx0XHRcdH1cblx0XHRcdF9jb2xvckV4cC5sYXN0SW5kZXggPSAwO1xuXHRcdH07XG5cblx0XHRpZiAoIVR3ZWVuTGl0ZS5kZWZhdWx0U3RyaW5nRmlsdGVyKSB7XG5cdFx0XHRUd2VlbkxpdGUuZGVmYXVsdFN0cmluZ0ZpbHRlciA9IENTU1BsdWdpbi5jb2xvclN0cmluZ0ZpbHRlcjtcblx0XHR9XG5cblx0XHQvKipcblx0XHQgKiBAcHJpdmF0ZSBSZXR1cm5zIGEgZm9ybWF0dGVyIGZ1bmN0aW9uIHRoYXQgaGFuZGxlcyB0YWtpbmcgYSBzdHJpbmcgKG9yIG51bWJlciBpbiBzb21lIGNhc2VzKSBhbmQgcmV0dXJuaW5nIGEgY29uc2lzdGVudGx5IGZvcm1hdHRlZCBvbmUgaW4gdGVybXMgb2YgZGVsaW1pdGVycywgcXVhbnRpdHkgb2YgdmFsdWVzLCBldGMuIEZvciBleGFtcGxlLCB3ZSBtYXkgZ2V0IGJveFNoYWRvdyB2YWx1ZXMgZGVmaW5lZCBhcyBcIjBweCByZWRcIiBvciBcIjBweCAwcHggMTBweCByZ2IoMjU1LDAsMClcIiBvciBcIjBweCAwcHggMjBweCAyMHB4ICNGMDBcIiBhbmQgd2UgbmVlZCB0byBlbnN1cmUgdGhhdCB3aGF0IHdlIGdldCBiYWNrIGlzIGRlc2NyaWJlZCB3aXRoIDQgbnVtYmVycyBhbmQgYSBjb2xvci4gVGhpcyBhbGxvd3MgdXMgdG8gZmVlZCBpdCBpbnRvIHRoZSBfcGFyc2VDb21wbGV4KCkgbWV0aG9kIGFuZCBzcGxpdCB0aGUgdmFsdWVzIHVwIGFwcHJvcHJpYXRlbHkuIFRoZSBuZWF0IHRoaW5nIGFib3V0IHRoaXMgX2dldEZvcm1hdHRlcigpIGZ1bmN0aW9uIGlzIHRoYXQgdGhlIGRmbHQgZGVmaW5lcyBhIHBhdHRlcm4gYXMgd2VsbCBhcyBhIGRlZmF1bHQsIHNvIGZvciBleGFtcGxlLCBfZ2V0Rm9ybWF0dGVyKFwiMHB4IDBweCAwcHggMHB4ICM3NzdcIiwgdHJ1ZSkgbm90IG9ubHkgc2V0cyB0aGUgZGVmYXVsdCBhcyAwcHggZm9yIGFsbCBkaXN0YW5jZXMgYW5kICM3NzcgZm9yIHRoZSBjb2xvciwgYnV0IGFsc28gc2V0cyB0aGUgcGF0dGVybiBzdWNoIHRoYXQgNCBudW1iZXJzIGFuZCBhIGNvbG9yIHdpbGwgYWx3YXlzIGdldCByZXR1cm5lZC5cblx0XHQgKiBAcGFyYW0geyFzdHJpbmd9IGRmbHQgVGhlIGRlZmF1bHQgdmFsdWUgYW5kIHBhdHRlcm4gdG8gZm9sbG93LiBTbyBcIjBweCAwcHggMHB4IDBweCAjNzc3XCIgd2lsbCBlbnN1cmUgdGhhdCA0IG51bWJlcnMgYW5kIGEgY29sb3Igd2lsbCBhbHdheXMgZ2V0IHJldHVybmVkLlxuXHRcdCAqIEBwYXJhbSB7Ym9vbGVhbj19IGNsciBJZiB0cnVlLCB0aGUgdmFsdWVzIHNob3VsZCBiZSBzZWFyY2hlZCBmb3IgY29sb3ItcmVsYXRlZCBkYXRhLiBGb3IgZXhhbXBsZSwgYm94U2hhZG93IHZhbHVlcyB0eXBpY2FsbHkgY29udGFpbiBhIGNvbG9yIHdoZXJlYXMgYm9yZGVyUmFkaXVzIGRvbid0LlxuXHRcdCAqIEBwYXJhbSB7Ym9vbGVhbj19IGNvbGxhcHNpYmxlIElmIHRydWUsIHRoZSB2YWx1ZSBpcyBhIHRvcC9sZWZ0L3JpZ2h0L2JvdHRvbSBzdHlsZSBvbmUgdGhhdCBhY3RzIGxpa2UgbWFyZ2luIG9yIHBhZGRpbmcsIHdoZXJlIGlmIG9ubHkgb25lIHZhbHVlIGlzIHJlY2VpdmVkLCBpdCdzIHVzZWQgZm9yIGFsbCA0OyBpZiAyIGFyZSByZWNlaXZlZCwgdGhlIGZpcnN0IGlzIGR1cGxpY2F0ZWQgZm9yIDNyZCAoYm90dG9tKSBhbmQgdGhlIDJuZCBpcyBkdXBsaWNhdGVkIGZvciB0aGUgNHRoIHNwb3QgKGxlZnQpLCBldGMuXG5cdFx0ICogQHJldHVybiB7RnVuY3Rpb259IGZvcm1hdHRlciBmdW5jdGlvblxuXHRcdCAqL1xuXHRcdHZhciBfZ2V0Rm9ybWF0dGVyID0gZnVuY3Rpb24oZGZsdCwgY2xyLCBjb2xsYXBzaWJsZSwgbXVsdGkpIHtcblx0XHRcdFx0aWYgKGRmbHQgPT0gbnVsbCkge1xuXHRcdFx0XHRcdHJldHVybiBmdW5jdGlvbih2KSB7cmV0dXJuIHY7fTtcblx0XHRcdFx0fVxuXHRcdFx0XHR2YXIgZENvbG9yID0gY2xyID8gKGRmbHQubWF0Y2goX2NvbG9yRXhwKSB8fCBbXCJcIl0pWzBdIDogXCJcIixcblx0XHRcdFx0XHRkVmFscyA9IGRmbHQuc3BsaXQoZENvbG9yKS5qb2luKFwiXCIpLm1hdGNoKF92YWx1ZXNFeHApIHx8IFtdLFxuXHRcdFx0XHRcdHBmeCA9IGRmbHQuc3Vic3RyKDAsIGRmbHQuaW5kZXhPZihkVmFsc1swXSkpLFxuXHRcdFx0XHRcdHNmeCA9IChkZmx0LmNoYXJBdChkZmx0Lmxlbmd0aCAtIDEpID09PSBcIilcIikgPyBcIilcIiA6IFwiXCIsXG5cdFx0XHRcdFx0ZGVsaW0gPSAoZGZsdC5pbmRleE9mKFwiIFwiKSAhPT0gLTEpID8gXCIgXCIgOiBcIixcIixcblx0XHRcdFx0XHRudW1WYWxzID0gZFZhbHMubGVuZ3RoLFxuXHRcdFx0XHRcdGRTZnggPSAobnVtVmFscyA+IDApID8gZFZhbHNbMF0ucmVwbGFjZShfbnVtRXhwLCBcIlwiKSA6IFwiXCIsXG5cdFx0XHRcdFx0Zm9ybWF0dGVyO1xuXHRcdFx0XHRpZiAoIW51bVZhbHMpIHtcblx0XHRcdFx0XHRyZXR1cm4gZnVuY3Rpb24odikge3JldHVybiB2O307XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKGNscikge1xuXHRcdFx0XHRcdGZvcm1hdHRlciA9IGZ1bmN0aW9uKHYpIHtcblx0XHRcdFx0XHRcdHZhciBjb2xvciwgdmFscywgaSwgYTtcblx0XHRcdFx0XHRcdGlmICh0eXBlb2YodikgPT09IFwibnVtYmVyXCIpIHtcblx0XHRcdFx0XHRcdFx0diArPSBkU2Z4O1xuXHRcdFx0XHRcdFx0fSBlbHNlIGlmIChtdWx0aSAmJiBfY29tbWFzT3V0c2lkZVBhcmVuRXhwLnRlc3QodikpIHtcblx0XHRcdFx0XHRcdFx0YSA9IHYucmVwbGFjZShfY29tbWFzT3V0c2lkZVBhcmVuRXhwLCBcInxcIikuc3BsaXQoXCJ8XCIpO1xuXHRcdFx0XHRcdFx0XHRmb3IgKGkgPSAwOyBpIDwgYS5sZW5ndGg7IGkrKykge1xuXHRcdFx0XHRcdFx0XHRcdGFbaV0gPSBmb3JtYXR0ZXIoYVtpXSk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0cmV0dXJuIGEuam9pbihcIixcIik7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRjb2xvciA9ICh2Lm1hdGNoKF9jb2xvckV4cCkgfHwgW2RDb2xvcl0pWzBdO1xuXHRcdFx0XHRcdFx0dmFscyA9IHYuc3BsaXQoY29sb3IpLmpvaW4oXCJcIikubWF0Y2goX3ZhbHVlc0V4cCkgfHwgW107XG5cdFx0XHRcdFx0XHRpID0gdmFscy5sZW5ndGg7XG5cdFx0XHRcdFx0XHRpZiAobnVtVmFscyA+IGktLSkge1xuXHRcdFx0XHRcdFx0XHR3aGlsZSAoKytpIDwgbnVtVmFscykge1xuXHRcdFx0XHRcdFx0XHRcdHZhbHNbaV0gPSBjb2xsYXBzaWJsZSA/IHZhbHNbKCgoaSAtIDEpIC8gMikgfCAwKV0gOiBkVmFsc1tpXTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0cmV0dXJuIHBmeCArIHZhbHMuam9pbihkZWxpbSkgKyBkZWxpbSArIGNvbG9yICsgc2Z4ICsgKHYuaW5kZXhPZihcImluc2V0XCIpICE9PSAtMSA/IFwiIGluc2V0XCIgOiBcIlwiKTtcblx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdHJldHVybiBmb3JtYXR0ZXI7XG5cblx0XHRcdFx0fVxuXHRcdFx0XHRmb3JtYXR0ZXIgPSBmdW5jdGlvbih2KSB7XG5cdFx0XHRcdFx0dmFyIHZhbHMsIGEsIGk7XG5cdFx0XHRcdFx0aWYgKHR5cGVvZih2KSA9PT0gXCJudW1iZXJcIikge1xuXHRcdFx0XHRcdFx0diArPSBkU2Z4O1xuXHRcdFx0XHRcdH0gZWxzZSBpZiAobXVsdGkgJiYgX2NvbW1hc091dHNpZGVQYXJlbkV4cC50ZXN0KHYpKSB7XG5cdFx0XHRcdFx0XHRhID0gdi5yZXBsYWNlKF9jb21tYXNPdXRzaWRlUGFyZW5FeHAsIFwifFwiKS5zcGxpdChcInxcIik7XG5cdFx0XHRcdFx0XHRmb3IgKGkgPSAwOyBpIDwgYS5sZW5ndGg7IGkrKykge1xuXHRcdFx0XHRcdFx0XHRhW2ldID0gZm9ybWF0dGVyKGFbaV0pO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0cmV0dXJuIGEuam9pbihcIixcIik7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHZhbHMgPSB2Lm1hdGNoKF92YWx1ZXNFeHApIHx8IFtdO1xuXHRcdFx0XHRcdGkgPSB2YWxzLmxlbmd0aDtcblx0XHRcdFx0XHRpZiAobnVtVmFscyA+IGktLSkge1xuXHRcdFx0XHRcdFx0d2hpbGUgKCsraSA8IG51bVZhbHMpIHtcblx0XHRcdFx0XHRcdFx0dmFsc1tpXSA9IGNvbGxhcHNpYmxlID8gdmFsc1soKChpIC0gMSkgLyAyKSB8IDApXSA6IGRWYWxzW2ldO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRyZXR1cm4gcGZ4ICsgdmFscy5qb2luKGRlbGltKSArIHNmeDtcblx0XHRcdFx0fTtcblx0XHRcdFx0cmV0dXJuIGZvcm1hdHRlcjtcblx0XHRcdH0sXG5cblx0XHRcdC8qKlxuXHRcdFx0ICogQHByaXZhdGUgcmV0dXJucyBhIGZvcm1hdHRlciBmdW5jdGlvbiB0aGF0J3MgdXNlZCBmb3IgZWRnZS1yZWxhdGVkIHZhbHVlcyBsaWtlIG1hcmdpblRvcCwgbWFyZ2luTGVmdCwgcGFkZGluZ0JvdHRvbSwgcGFkZGluZ1JpZ2h0LCBldGMuIEp1c3QgcGFzcyBhIGNvbW1hLWRlbGltaXRlZCBsaXN0IG9mIHByb3BlcnR5IG5hbWVzIHJlbGF0ZWQgdG8gdGhlIGVkZ2VzLlxuXHRcdFx0ICogQHBhcmFtIHshc3RyaW5nfSBwcm9wcyBhIGNvbW1hLWRlbGltaXRlZCBsaXN0IG9mIHByb3BlcnR5IG5hbWVzIGluIG9yZGVyIGZyb20gdG9wIHRvIGxlZnQsIGxpa2UgXCJtYXJnaW5Ub3AsbWFyZ2luUmlnaHQsbWFyZ2luQm90dG9tLG1hcmdpbkxlZnRcIlxuXHRcdFx0ICogQHJldHVybiB7RnVuY3Rpb259IGEgZm9ybWF0dGVyIGZ1bmN0aW9uXG5cdFx0XHQgKi9cblx0XHRcdF9nZXRFZGdlUGFyc2VyID0gZnVuY3Rpb24ocHJvcHMpIHtcblx0XHRcdFx0cHJvcHMgPSBwcm9wcy5zcGxpdChcIixcIik7XG5cdFx0XHRcdHJldHVybiBmdW5jdGlvbih0LCBlLCBwLCBjc3NwLCBwdCwgcGx1Z2luLCB2YXJzKSB7XG5cdFx0XHRcdFx0dmFyIGEgPSAoZSArIFwiXCIpLnNwbGl0KFwiIFwiKSxcblx0XHRcdFx0XHRcdGk7XG5cdFx0XHRcdFx0dmFycyA9IHt9O1xuXHRcdFx0XHRcdGZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHtcblx0XHRcdFx0XHRcdHZhcnNbcHJvcHNbaV1dID0gYVtpXSA9IGFbaV0gfHwgYVsoKChpIC0gMSkgLyAyKSA+PiAwKV07XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHJldHVybiBjc3NwLnBhcnNlKHQsIHZhcnMsIHB0LCBwbHVnaW4pO1xuXHRcdFx0XHR9O1xuXHRcdFx0fSxcblxuXHRcdFx0Ly8gQHByaXZhdGUgdXNlZCB3aGVuIG90aGVyIHBsdWdpbnMgbXVzdCB0d2VlbiB2YWx1ZXMgZmlyc3QsIGxpa2UgQmV6aWVyUGx1Z2luIG9yIFRocm93UHJvcHNQbHVnaW4sIGV0Yy4gVGhhdCBwbHVnaW4ncyBzZXRSYXRpbygpIGdldHMgY2FsbGVkIGZpcnN0IHNvIHRoYXQgdGhlIHZhbHVlcyBhcmUgdXBkYXRlZCwgYW5kIHRoZW4gd2UgbG9vcCB0aHJvdWdoIHRoZSBNaW5pUHJvcFR3ZWVucyB3aGljaCBoYW5kbGUgY29weWluZyB0aGUgdmFsdWVzIGludG8gdGhlaXIgYXBwcm9wcmlhdGUgc2xvdHMgc28gdGhhdCB0aGV5IGNhbiB0aGVuIGJlIGFwcGxpZWQgY29ycmVjdGx5IGluIHRoZSBtYWluIENTU1BsdWdpbiBzZXRSYXRpbygpIG1ldGhvZC4gUmVtZW1iZXIsIHdlIHR5cGljYWxseSBjcmVhdGUgYSBwcm94eSBvYmplY3QgdGhhdCBoYXMgYSBidW5jaCBvZiB1bmlxdWVseS1uYW1lZCBwcm9wZXJ0aWVzIHRoYXQgd2UgZmVlZCB0byB0aGUgc3ViLXBsdWdpbiBhbmQgaXQgZG9lcyBpdHMgbWFnaWMgbm9ybWFsbHksIGFuZCB0aGVuIHdlIG11c3QgaW50ZXJwcmV0IHRob3NlIHZhbHVlcyBhbmQgYXBwbHkgdGhlbSB0byB0aGUgY3NzIGJlY2F1c2Ugb2Z0ZW4gbnVtYmVycyBtdXN0IGdldCBjb21iaW5lZC9jb25jYXRlbmF0ZWQsIHN1ZmZpeGVzIGFkZGVkLCBldGMuIHRvIHdvcmsgd2l0aCBjc3MsIGxpa2UgYm94U2hhZG93IGNvdWxkIGhhdmUgNCB2YWx1ZXMgcGx1cyBhIGNvbG9yLlxuXHRcdFx0X3NldFBsdWdpblJhdGlvID0gX2ludGVybmFscy5fc2V0UGx1Z2luUmF0aW8gPSBmdW5jdGlvbih2KSB7XG5cdFx0XHRcdHRoaXMucGx1Z2luLnNldFJhdGlvKHYpO1xuXHRcdFx0XHR2YXIgZCA9IHRoaXMuZGF0YSxcblx0XHRcdFx0XHRwcm94eSA9IGQucHJveHksXG5cdFx0XHRcdFx0bXB0ID0gZC5maXJzdE1QVCxcblx0XHRcdFx0XHRtaW4gPSAwLjAwMDAwMSxcblx0XHRcdFx0XHR2YWwsIHB0LCBpLCBzdHIsIHA7XG5cdFx0XHRcdHdoaWxlIChtcHQpIHtcblx0XHRcdFx0XHR2YWwgPSBwcm94eVttcHQudl07XG5cdFx0XHRcdFx0aWYgKG1wdC5yKSB7XG5cdFx0XHRcdFx0XHR2YWwgPSBNYXRoLnJvdW5kKHZhbCk7XG5cdFx0XHRcdFx0fSBlbHNlIGlmICh2YWwgPCBtaW4gJiYgdmFsID4gLW1pbikge1xuXHRcdFx0XHRcdFx0dmFsID0gMDtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0bXB0LnRbbXB0LnBdID0gdmFsO1xuXHRcdFx0XHRcdG1wdCA9IG1wdC5fbmV4dDtcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAoZC5hdXRvUm90YXRlKSB7XG5cdFx0XHRcdFx0ZC5hdXRvUm90YXRlLnJvdGF0aW9uID0gZC5tb2QgPyBkLm1vZChwcm94eS5yb3RhdGlvbiwgdGhpcy50KSA6IHByb3h5LnJvdGF0aW9uOyAvL3NwZWNpYWwgY2FzZSBmb3IgTW9kaWZ5UGx1Z2luIHRvIGhvb2sgaW50byBhbiBhdXRvLXJvdGF0aW5nIGJlemllclxuXHRcdFx0XHR9XG5cdFx0XHRcdC8vYXQgdGhlIGVuZCwgd2UgbXVzdCBzZXQgdGhlIENTU1Byb3BUd2VlbidzIFwiZVwiIChlbmQpIHZhbHVlIGR5bmFtaWNhbGx5IGhlcmUgYmVjYXVzZSB0aGF0J3Mgd2hhdCBpcyB1c2VkIGluIHRoZSBmaW5hbCBzZXRSYXRpbygpIG1ldGhvZC4gU2FtZSBmb3IgXCJiXCIgYXQgdGhlIGJlZ2lubmluZy5cblx0XHRcdFx0aWYgKHYgPT09IDEgfHwgdiA9PT0gMCkge1xuXHRcdFx0XHRcdG1wdCA9IGQuZmlyc3RNUFQ7XG5cdFx0XHRcdFx0cCA9ICh2ID09PSAxKSA/IFwiZVwiIDogXCJiXCI7XG5cdFx0XHRcdFx0d2hpbGUgKG1wdCkge1xuXHRcdFx0XHRcdFx0cHQgPSBtcHQudDtcblx0XHRcdFx0XHRcdGlmICghcHQudHlwZSkge1xuXHRcdFx0XHRcdFx0XHRwdFtwXSA9IHB0LnMgKyBwdC54czA7XG5cdFx0XHRcdFx0XHR9IGVsc2UgaWYgKHB0LnR5cGUgPT09IDEpIHtcblx0XHRcdFx0XHRcdFx0c3RyID0gcHQueHMwICsgcHQucyArIHB0LnhzMTtcblx0XHRcdFx0XHRcdFx0Zm9yIChpID0gMTsgaSA8IHB0Lmw7IGkrKykge1xuXHRcdFx0XHRcdFx0XHRcdHN0ciArPSBwdFtcInhuXCIraV0gKyBwdFtcInhzXCIrKGkrMSldO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdHB0W3BdID0gc3RyO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0bXB0ID0gbXB0Ll9uZXh0O1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fSxcblxuXHRcdFx0LyoqXG5cdFx0XHQgKiBAcHJpdmF0ZSBAY29uc3RydWN0b3IgVXNlZCBieSBhIGZldyBTcGVjaWFsUHJvcHMgdG8gaG9sZCBpbXBvcnRhbnQgdmFsdWVzIGZvciBwcm94aWVzLiBGb3IgZXhhbXBsZSwgX3BhcnNlVG9Qcm94eSgpIGNyZWF0ZXMgYSBNaW5pUHJvcFR3ZWVuIGluc3RhbmNlIGZvciBlYWNoIHByb3BlcnR5IHRoYXQgbXVzdCBnZXQgdHdlZW5lZCBvbiB0aGUgcHJveHksIGFuZCB3ZSByZWNvcmQgdGhlIG9yaWdpbmFsIHByb3BlcnR5IG5hbWUgYXMgd2VsbCBhcyB0aGUgdW5pcXVlIG9uZSB3ZSBjcmVhdGUgZm9yIHRoZSBwcm94eSwgcGx1cyB3aGV0aGVyIG9yIG5vdCB0aGUgdmFsdWUgbmVlZHMgdG8gYmUgcm91bmRlZCBwbHVzIHRoZSBvcmlnaW5hbCB2YWx1ZS5cblx0XHRcdCAqIEBwYXJhbSB7IU9iamVjdH0gdCB0YXJnZXQgb2JqZWN0IHdob3NlIHByb3BlcnR5IHdlJ3JlIHR3ZWVuaW5nIChvZnRlbiBhIENTU1Byb3BUd2Vlbilcblx0XHRcdCAqIEBwYXJhbSB7IXN0cmluZ30gcCBwcm9wZXJ0eSBuYW1lXG5cdFx0XHQgKiBAcGFyYW0geyhudW1iZXJ8c3RyaW5nfG9iamVjdCl9IHYgdmFsdWVcblx0XHRcdCAqIEBwYXJhbSB7TWluaVByb3BUd2Vlbj19IG5leHQgbmV4dCBNaW5pUHJvcFR3ZWVuIGluIHRoZSBsaW5rZWQgbGlzdFxuXHRcdFx0ICogQHBhcmFtIHtib29sZWFuPX0gciBpZiB0cnVlLCB0aGUgdHdlZW5lZCB2YWx1ZSBzaG91bGQgYmUgcm91bmRlZCB0byB0aGUgbmVhcmVzdCBpbnRlZ2VyXG5cdFx0XHQgKi9cblx0XHRcdE1pbmlQcm9wVHdlZW4gPSBmdW5jdGlvbih0LCBwLCB2LCBuZXh0LCByKSB7XG5cdFx0XHRcdHRoaXMudCA9IHQ7XG5cdFx0XHRcdHRoaXMucCA9IHA7XG5cdFx0XHRcdHRoaXMudiA9IHY7XG5cdFx0XHRcdHRoaXMuciA9IHI7XG5cdFx0XHRcdGlmIChuZXh0KSB7XG5cdFx0XHRcdFx0bmV4dC5fcHJldiA9IHRoaXM7XG5cdFx0XHRcdFx0dGhpcy5fbmV4dCA9IG5leHQ7XG5cdFx0XHRcdH1cblx0XHRcdH0sXG5cblx0XHRcdC8qKlxuXHRcdFx0ICogQHByaXZhdGUgTW9zdCBvdGhlciBwbHVnaW5zIChsaWtlIEJlemllclBsdWdpbiBhbmQgVGhyb3dQcm9wc1BsdWdpbiBhbmQgb3RoZXJzKSBjYW4gb25seSB0d2VlbiBudW1lcmljIHZhbHVlcywgYnV0IENTU1BsdWdpbiBtdXN0IGFjY29tbW9kYXRlIHNwZWNpYWwgdmFsdWVzIHRoYXQgaGF2ZSBhIGJ1bmNoIG9mIGV4dHJhIGRhdGEgKGxpa2UgYSBzdWZmaXggb3Igc3RyaW5ncyBiZXR3ZWVuIG51bWVyaWMgdmFsdWVzLCBldGMuKS4gRm9yIGV4YW1wbGUsIGJveFNoYWRvdyBoYXMgdmFsdWVzIGxpa2UgXCIxMHB4IDEwcHggMjBweCAzMHB4IHJnYigyNTUsMCwwKVwiIHdoaWNoIHdvdWxkIHV0dGVybHkgY29uZnVzZSBvdGhlciBwbHVnaW5zLiBUaGlzIG1ldGhvZCBhbGxvd3MgdXMgdG8gc3BsaXQgdGhhdCBkYXRhIGFwYXJ0IGFuZCBncmFiIG9ubHkgdGhlIG51bWVyaWMgZGF0YSBhbmQgYXR0YWNoIGl0IHRvIHVuaXF1ZWx5LW5hbWVkIHByb3BlcnRpZXMgb2YgYSBnZW5lcmljIHByb3h5IG9iamVjdCAoe30pIHNvIHRoYXQgd2UgY2FuIGZlZWQgdGhhdCB0byB2aXJ0dWFsbHkgYW55IHBsdWdpbiB0byBoYXZlIHRoZSBudW1iZXJzIHR3ZWVuZWQuIEhvd2V2ZXIsIHdlIG11c3QgYWxzbyBrZWVwIHRyYWNrIG9mIHdoaWNoIHByb3BlcnRpZXMgZnJvbSB0aGUgcHJveHkgZ28gd2l0aCB3aGljaCBDU1NQcm9wVHdlZW4gdmFsdWVzIGFuZCBpbnN0YW5jZXMuIFNvIHdlIGNyZWF0ZSBhIGxpbmtlZCBsaXN0IG9mIE1pbmlQcm9wVHdlZW5zLiBFYWNoIG9uZSByZWNvcmRzIGEgdGFyZ2V0ICh0aGUgb3JpZ2luYWwgQ1NTUHJvcFR3ZWVuKSwgcHJvcGVydHkgKGxpa2UgXCJzXCIgb3IgXCJ4bjFcIiBvciBcInhuMlwiKSB0aGF0IHdlJ3JlIHR3ZWVuaW5nIGFuZCB0aGUgdW5pcXVlIHByb3BlcnR5IG5hbWUgdGhhdCB3YXMgdXNlZCBmb3IgdGhlIHByb3h5IChsaWtlIFwiYm94U2hhZG93X3huMVwiIGFuZCBcImJveFNoYWRvd194bjJcIikgYW5kIHdoZXRoZXIgb3Igbm90IHRoZXkgbmVlZCB0byBiZSByb3VuZGVkLiBUaGF0IHdheSwgaW4gdGhlIF9zZXRQbHVnaW5SYXRpbygpIG1ldGhvZCB3ZSBjYW4gc2ltcGx5IGNvcHkgdGhlIHZhbHVlcyBvdmVyIGZyb20gdGhlIHByb3h5IHRvIHRoZSBDU1NQcm9wVHdlZW4gaW5zdGFuY2UocykuIFRoZW4sIHdoZW4gdGhlIG1haW4gQ1NTUGx1Z2luIHNldFJhdGlvKCkgbWV0aG9kIHJ1bnMgYW5kIGFwcGxpZXMgdGhlIENTU1Byb3BUd2VlbiB2YWx1ZXMgYWNjb3JkaW5nbHksIHRoZXkncmUgdXBkYXRlZCBuaWNlbHkuIFNvIHRoZSBleHRlcm5hbCBwbHVnaW4gdHdlZW5zIHRoZSBudW1iZXJzLCBfc2V0UGx1Z2luUmF0aW8oKSBjb3BpZXMgdGhlbSBvdmVyLCBhbmQgc2V0UmF0aW8oKSBhY3RzIG5vcm1hbGx5LCBhcHBseWluZyBjc3Mtc3BlY2lmaWMgdmFsdWVzIHRvIHRoZSBlbGVtZW50LlxuXHRcdFx0ICogVGhpcyBtZXRob2QgcmV0dXJucyBhbiBvYmplY3QgdGhhdCBoYXMgdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOlxuXHRcdFx0ICogIC0gcHJveHk6IGEgZ2VuZXJpYyBvYmplY3QgY29udGFpbmluZyB0aGUgc3RhcnRpbmcgdmFsdWVzIGZvciBhbGwgdGhlIHByb3BlcnRpZXMgdGhhdCB3aWxsIGJlIHR3ZWVuZWQgYnkgdGhlIGV4dGVybmFsIHBsdWdpbi4gIFRoaXMgaXMgd2hhdCB3ZSBmZWVkIHRvIHRoZSBleHRlcm5hbCBfb25Jbml0VHdlZW4oKSBhcyB0aGUgdGFyZ2V0XG5cdFx0XHQgKiAgLSBlbmQ6IGEgZ2VuZXJpYyBvYmplY3QgY29udGFpbmluZyB0aGUgZW5kaW5nIHZhbHVlcyBmb3IgYWxsIHRoZSBwcm9wZXJ0aWVzIHRoYXQgd2lsbCBiZSB0d2VlbmVkIGJ5IHRoZSBleHRlcm5hbCBwbHVnaW4uIFRoaXMgaXMgd2hhdCB3ZSBmZWVkIHRvIHRoZSBleHRlcm5hbCBwbHVnaW4ncyBfb25Jbml0VHdlZW4oKSBhcyB0aGUgZGVzdGluYXRpb24gdmFsdWVzXG5cdFx0XHQgKiAgLSBmaXJzdE1QVDogdGhlIGZpcnN0IE1pbmlQcm9wVHdlZW4gaW4gdGhlIGxpbmtlZCBsaXN0XG5cdFx0XHQgKiAgLSBwdDogdGhlIGZpcnN0IENTU1Byb3BUd2VlbiBpbiB0aGUgbGlua2VkIGxpc3QgdGhhdCB3YXMgY3JlYXRlZCB3aGVuIHBhcnNpbmcuIElmIHNoYWxsb3cgaXMgdHJ1ZSwgdGhpcyBsaW5rZWQgbGlzdCB3aWxsIE5PVCBhdHRhY2ggdG8gdGhlIG9uZSBwYXNzZWQgaW50byB0aGUgX3BhcnNlVG9Qcm94eSgpIGFzIHRoZSBcInB0XCIgKDR0aCkgcGFyYW1ldGVyLlxuXHRcdFx0ICogQHBhcmFtIHshT2JqZWN0fSB0IHRhcmdldCBvYmplY3QgdG8gYmUgdHdlZW5lZFxuXHRcdFx0ICogQHBhcmFtIHshKE9iamVjdHxzdHJpbmcpfSB2YXJzIHRoZSBvYmplY3QgY29udGFpbmluZyB0aGUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHR3ZWVuaW5nIHZhbHVlcyAodHlwaWNhbGx5IHRoZSBlbmQvZGVzdGluYXRpb24gdmFsdWVzKSB0aGF0IHNob3VsZCBiZSBwYXJzZWRcblx0XHRcdCAqIEBwYXJhbSB7IUNTU1BsdWdpbn0gY3NzcCBUaGUgQ1NTUGx1Z2luIGluc3RhbmNlXG5cdFx0XHQgKiBAcGFyYW0ge0NTU1Byb3BUd2Vlbj19IHB0IHRoZSBuZXh0IENTU1Byb3BUd2VlbiBpbiB0aGUgbGlua2VkIGxpc3Rcblx0XHRcdCAqIEBwYXJhbSB7VHdlZW5QbHVnaW49fSBwbHVnaW4gdGhlIGV4dGVybmFsIFR3ZWVuUGx1Z2luIGluc3RhbmNlIHRoYXQgd2lsbCBiZSBoYW5kbGluZyB0d2VlbmluZyB0aGUgbnVtZXJpYyB2YWx1ZXNcblx0XHRcdCAqIEBwYXJhbSB7Ym9vbGVhbj19IHNoYWxsb3cgaWYgdHJ1ZSwgdGhlIHJlc3VsdGluZyBsaW5rZWQgbGlzdCBmcm9tIHRoZSBwYXJzZSB3aWxsIE5PVCBiZSBhdHRhY2hlZCB0byB0aGUgQ1NTUHJvcFR3ZWVuIHRoYXQgd2FzIHBhc3NlZCBpbiBhcyB0aGUgXCJwdFwiICg0dGgpIHBhcmFtZXRlci5cblx0XHRcdCAqIEByZXR1cm4gQW4gb2JqZWN0IGNvbnRhaW5pbmcgdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOiBwcm94eSwgZW5kLCBmaXJzdE1QVCwgYW5kIHB0IChzZWUgYWJvdmUgZm9yIGRlc2NyaXB0aW9ucylcblx0XHRcdCAqL1xuXHRcdFx0X3BhcnNlVG9Qcm94eSA9IF9pbnRlcm5hbHMuX3BhcnNlVG9Qcm94eSA9IGZ1bmN0aW9uKHQsIHZhcnMsIGNzc3AsIHB0LCBwbHVnaW4sIHNoYWxsb3cpIHtcblx0XHRcdFx0dmFyIGJwdCA9IHB0LFxuXHRcdFx0XHRcdHN0YXJ0ID0ge30sXG5cdFx0XHRcdFx0ZW5kID0ge30sXG5cdFx0XHRcdFx0dHJhbnNmb3JtID0gY3NzcC5fdHJhbnNmb3JtLFxuXHRcdFx0XHRcdG9sZEZvcmNlID0gX2ZvcmNlUFQsXG5cdFx0XHRcdFx0aSwgcCwgeHAsIG1wdCwgZmlyc3RQVDtcblx0XHRcdFx0Y3NzcC5fdHJhbnNmb3JtID0gbnVsbDtcblx0XHRcdFx0X2ZvcmNlUFQgPSB2YXJzO1xuXHRcdFx0XHRwdCA9IGZpcnN0UFQgPSBjc3NwLnBhcnNlKHQsIHZhcnMsIHB0LCBwbHVnaW4pO1xuXHRcdFx0XHRfZm9yY2VQVCA9IG9sZEZvcmNlO1xuXHRcdFx0XHQvL2JyZWFrIG9mZiBmcm9tIHRoZSBsaW5rZWQgbGlzdCBzbyB0aGUgbmV3IG9uZXMgYXJlIGlzb2xhdGVkLlxuXHRcdFx0XHRpZiAoc2hhbGxvdykge1xuXHRcdFx0XHRcdGNzc3AuX3RyYW5zZm9ybSA9IHRyYW5zZm9ybTtcblx0XHRcdFx0XHRpZiAoYnB0KSB7XG5cdFx0XHRcdFx0XHRicHQuX3ByZXYgPSBudWxsO1xuXHRcdFx0XHRcdFx0aWYgKGJwdC5fcHJldikge1xuXHRcdFx0XHRcdFx0XHRicHQuX3ByZXYuX25leHQgPSBudWxsO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0XHR3aGlsZSAocHQgJiYgcHQgIT09IGJwdCkge1xuXHRcdFx0XHRcdGlmIChwdC50eXBlIDw9IDEpIHtcblx0XHRcdFx0XHRcdHAgPSBwdC5wO1xuXHRcdFx0XHRcdFx0ZW5kW3BdID0gcHQucyArIHB0LmM7XG5cdFx0XHRcdFx0XHRzdGFydFtwXSA9IHB0LnM7XG5cdFx0XHRcdFx0XHRpZiAoIXNoYWxsb3cpIHtcblx0XHRcdFx0XHRcdFx0bXB0ID0gbmV3IE1pbmlQcm9wVHdlZW4ocHQsIFwic1wiLCBwLCBtcHQsIHB0LnIpO1xuXHRcdFx0XHRcdFx0XHRwdC5jID0gMDtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdGlmIChwdC50eXBlID09PSAxKSB7XG5cdFx0XHRcdFx0XHRcdGkgPSBwdC5sO1xuXHRcdFx0XHRcdFx0XHR3aGlsZSAoLS1pID4gMCkge1xuXHRcdFx0XHRcdFx0XHRcdHhwID0gXCJ4blwiICsgaTtcblx0XHRcdFx0XHRcdFx0XHRwID0gcHQucCArIFwiX1wiICsgeHA7XG5cdFx0XHRcdFx0XHRcdFx0ZW5kW3BdID0gcHQuZGF0YVt4cF07XG5cdFx0XHRcdFx0XHRcdFx0c3RhcnRbcF0gPSBwdFt4cF07XG5cdFx0XHRcdFx0XHRcdFx0aWYgKCFzaGFsbG93KSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRtcHQgPSBuZXcgTWluaVByb3BUd2VlbihwdCwgeHAsIHAsIG1wdCwgcHQucnhwW3hwXSk7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHB0ID0gcHQuX25leHQ7XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIHtwcm94eTpzdGFydCwgZW5kOmVuZCwgZmlyc3RNUFQ6bXB0LCBwdDpmaXJzdFBUfTtcblx0XHRcdH0sXG5cblxuXG5cdFx0XHQvKipcblx0XHRcdCAqIEBjb25zdHJ1Y3RvciBFYWNoIHByb3BlcnR5IHRoYXQgaXMgdHdlZW5lZCBoYXMgYXQgbGVhc3Qgb25lIENTU1Byb3BUd2VlbiBhc3NvY2lhdGVkIHdpdGggaXQuIFRoZXNlIGluc3RhbmNlcyBzdG9yZSBpbXBvcnRhbnQgaW5mb3JtYXRpb24gbGlrZSB0aGUgdGFyZ2V0LCBwcm9wZXJ0eSwgc3RhcnRpbmcgdmFsdWUsIGFtb3VudCBvZiBjaGFuZ2UsIGV0Yy4gVGhleSBjYW4gYWxzbyBvcHRpb25hbGx5IGhhdmUgYSBudW1iZXIgb2YgXCJleHRyYVwiIHN0cmluZ3MgYW5kIG51bWVyaWMgdmFsdWVzIG5hbWVkIHhzMSwgeG4xLCB4czIsIHhuMiwgeHMzLCB4bjMsIGV0Yy4gd2hlcmUgXCJzXCIgaW5kaWNhdGVzIHN0cmluZyBhbmQgXCJuXCIgaW5kaWNhdGVzIG51bWJlci4gVGhlc2UgY2FuIGJlIHBpZWNlZCB0b2dldGhlciBpbiBhIGNvbXBsZXgtdmFsdWUgdHdlZW4gKHR5cGU6MSkgdGhhdCBoYXMgYWx0ZXJuYXRpbmcgdHlwZXMgb2YgZGF0YSBsaWtlIGEgc3RyaW5nLCBudW1iZXIsIHN0cmluZywgbnVtYmVyLCBldGMuIEZvciBleGFtcGxlLCBib3hTaGFkb3cgY291bGQgYmUgXCI1cHggNXB4IDhweCByZ2IoMTAyLCAxMDIsIDUxKVwiLiBJbiB0aGF0IHZhbHVlLCB0aGVyZSBhcmUgNiBudW1iZXJzIHRoYXQgbWF5IG5lZWQgdG8gdHdlZW4gYW5kIHRoZW4gcGllY2VkIGJhY2sgdG9nZXRoZXIgaW50byBhIHN0cmluZyBhZ2FpbiB3aXRoIHNwYWNlcywgc3VmZml4ZXMsIGV0Yy4geHMwIGlzIHNwZWNpYWwgaW4gdGhhdCBpdCBzdG9yZXMgdGhlIHN1ZmZpeCBmb3Igc3RhbmRhcmQgKHR5cGU6MCkgdHdlZW5zLCAtT1ItIHRoZSBmaXJzdCBzdHJpbmcgKHByZWZpeCkgaW4gYSBjb21wbGV4LXZhbHVlICh0eXBlOjEpIENTU1Byb3BUd2VlbiAtT1ItIGl0IGNhbiBiZSB0aGUgbm9uLXR3ZWVuaW5nIHZhbHVlIGluIGEgdHlwZTotMSBDU1NQcm9wVHdlZW4uIFdlIGRvIHRoaXMgdG8gY29uc2VydmUgbWVtb3J5LlxuXHRcdFx0ICogQ1NTUHJvcFR3ZWVucyBoYXZlIHRoZSBmb2xsb3dpbmcgb3B0aW9uYWwgcHJvcGVydGllcyBhcyB3ZWxsIChub3QgZGVmaW5lZCB0aHJvdWdoIHRoZSBjb25zdHJ1Y3Rvcik6XG5cdFx0XHQgKiAgLSBsOiBMZW5ndGggaW4gdGVybXMgb2YgdGhlIG51bWJlciBvZiBleHRyYSBwcm9wZXJ0aWVzIHRoYXQgdGhlIENTU1Byb3BUd2VlbiBoYXMgKGRlZmF1bHQ6IDApLiBGb3IgZXhhbXBsZSwgZm9yIGEgYm94U2hhZG93IHdlIG1heSBuZWVkIHRvIHR3ZWVuIDUgbnVtYmVycyBpbiB3aGljaCBjYXNlIGwgd291bGQgYmUgNTsgS2VlcCBpbiBtaW5kIHRoYXQgdGhlIHN0YXJ0L2VuZCB2YWx1ZXMgZm9yIHRoZSBmaXJzdCBudW1iZXIgdGhhdCdzIHR3ZWVuZWQgYXJlIGFsd2F5cyBzdG9yZWQgaW4gdGhlIHMgYW5kIGMgcHJvcGVydGllcyB0byBjb25zZXJ2ZSBtZW1vcnkuIEFsbCBhZGRpdGlvbmFsIHZhbHVlcyB0aGVyZWFmdGVyIGFyZSBzdG9yZWQgaW4geG4xLCB4bjIsIGV0Yy5cblx0XHRcdCAqICAtIHhmaXJzdDogVGhlIGZpcnN0IGluc3RhbmNlIG9mIGFueSBzdWItQ1NTUHJvcFR3ZWVucyB0aGF0IGFyZSB0d2VlbmluZyBwcm9wZXJ0aWVzIG9mIHRoaXMgaW5zdGFuY2UuIEZvciBleGFtcGxlLCB3ZSBtYXkgc3BsaXQgdXAgYSBib3hTaGFkb3cgdHdlZW4gc28gdGhhdCB0aGVyZSdzIGEgbWFpbiBDU1NQcm9wVHdlZW4gb2YgdHlwZToxIHRoYXQgaGFzIHZhcmlvdXMgeHMqIGFuZCB4biogdmFsdWVzIGFzc29jaWF0ZWQgd2l0aCB0aGUgaC1zaGFkb3csIHYtc2hhZG93LCBibHVyLCBjb2xvciwgZXRjLiBUaGVuIHdlIHNwYXduIGEgQ1NTUHJvcFR3ZWVuIGZvciBlYWNoIG9mIHRob3NlIHRoYXQgaGFzIGEgaGlnaGVyIHByaW9yaXR5IGFuZCBydW5zIEJFRk9SRSB0aGUgbWFpbiBDU1NQcm9wVHdlZW4gc28gdGhhdCB0aGUgdmFsdWVzIGFyZSBhbGwgc2V0IGJ5IHRoZSB0aW1lIGl0IG5lZWRzIHRvIHJlLWFzc2VtYmxlIHRoZW0uIFRoZSB4Zmlyc3QgZ2l2ZXMgdXMgYW4gZWFzeSB3YXkgdG8gaWRlbnRpZnkgdGhlIGZpcnN0IG9uZSBpbiB0aGF0IGNoYWluIHdoaWNoIHR5cGljYWxseSBlbmRzIGF0IHRoZSBtYWluIG9uZSAoYmVjYXVzZSB0aGV5J3JlIGFsbCBwcmVwZW5kZSB0byB0aGUgbGlua2VkIGxpc3QpXG5cdFx0XHQgKiAgLSBwbHVnaW46IFRoZSBUd2VlblBsdWdpbiBpbnN0YW5jZSB0aGF0IHdpbGwgaGFuZGxlIHRoZSB0d2VlbmluZyBvZiBhbnkgY29tcGxleCB2YWx1ZXMuIEZvciBleGFtcGxlLCBzb21ldGltZXMgd2UgZG9uJ3Qgd2FudCB0byB1c2Ugbm9ybWFsIHN1YnR3ZWVucyAobGlrZSB4Zmlyc3QgcmVmZXJzIHRvKSB0byB0d2VlbiB0aGUgdmFsdWVzIC0gd2UgbWlnaHQgd2FudCBUaHJvd1Byb3BzUGx1Z2luIG9yIEJlemllclBsdWdpbiBzb21lIG90aGVyIHBsdWdpbiB0byBkbyB0aGUgYWN0dWFsIHR3ZWVuaW5nLCBzbyB3ZSBjcmVhdGUgYSBwbHVnaW4gaW5zdGFuY2UgYW5kIHN0b3JlIGEgcmVmZXJlbmNlIGhlcmUuIFdlIG5lZWQgdGhpcyByZWZlcmVuY2Ugc28gdGhhdCBpZiB3ZSBnZXQgYSByZXF1ZXN0IHRvIHJvdW5kIHZhbHVlcyBvciBkaXNhYmxlIGEgdHdlZW4sIHdlIGNhbiBwYXNzIGFsb25nIHRoYXQgcmVxdWVzdC5cblx0XHRcdCAqICAtIGRhdGE6IEFyYml0cmFyeSBkYXRhIHRoYXQgbmVlZHMgdG8gYmUgc3RvcmVkIHdpdGggdGhlIENTU1Byb3BUd2Vlbi4gVHlwaWNhbGx5IGlmIHdlJ3JlIGdvaW5nIHRvIGhhdmUgYSBwbHVnaW4gaGFuZGxlIHRoZSB0d2VlbmluZyBvZiBhIGNvbXBsZXgtdmFsdWUgdHdlZW4sIHdlIGNyZWF0ZSBhIGdlbmVyaWMgb2JqZWN0IHRoYXQgc3RvcmVzIHRoZSBFTkQgdmFsdWVzIHRoYXQgd2UncmUgdHdlZW5pbmcgdG8gYW5kIHRoZSBDU1NQcm9wVHdlZW4ncyB4czEsIHhzMiwgZXRjLiBoYXZlIHRoZSBzdGFydGluZyB2YWx1ZXMuIFdlIHN0b3JlIHRoYXQgb2JqZWN0IGFzIGRhdGEuIFRoYXQgd2F5LCB3ZSBjYW4gc2ltcGx5IHBhc3MgdGhhdCBvYmplY3QgdG8gdGhlIHBsdWdpbiBhbmQgdXNlIHRoZSBDU1NQcm9wVHdlZW4gYXMgdGhlIHRhcmdldC5cblx0XHRcdCAqICAtIHNldFJhdGlvOiBPbmx5IHVzZWQgZm9yIHR5cGU6MiB0d2VlbnMgdGhhdCByZXF1aXJlIGN1c3RvbSBmdW5jdGlvbmFsaXR5LiBJbiB0aGlzIGNhc2UsIHdlIGNhbGwgdGhlIENTU1Byb3BUd2VlbidzIHNldFJhdGlvKCkgbWV0aG9kIGFuZCBwYXNzIHRoZSByYXRpbyBlYWNoIHRpbWUgdGhlIHR3ZWVuIHVwZGF0ZXMuIFRoaXMgaXNuJ3QgcXVpdGUgYXMgZWZmaWNpZW50IGFzIGRvaW5nIHRoaW5ncyBkaXJlY3RseSBpbiB0aGUgQ1NTUGx1Z2luJ3Mgc2V0UmF0aW8oKSBtZXRob2QsIGJ1dCBpdCdzIHZlcnkgY29udmVuaWVudCBhbmQgZmxleGlibGUuXG5cdFx0XHQgKiBAcGFyYW0geyFPYmplY3R9IHQgVGFyZ2V0IG9iamVjdCB3aG9zZSBwcm9wZXJ0eSB3aWxsIGJlIHR3ZWVuZWQuIE9mdGVuIGEgRE9NIGVsZW1lbnQsIGJ1dCBub3QgYWx3YXlzLiBJdCBjb3VsZCBiZSBhbnl0aGluZy5cblx0XHRcdCAqIEBwYXJhbSB7c3RyaW5nfSBwIFByb3BlcnR5IHRvIHR3ZWVuIChuYW1lKS4gRm9yIGV4YW1wbGUsIHRvIHR3ZWVuIGVsZW1lbnQud2lkdGgsIHAgd291bGQgYmUgXCJ3aWR0aFwiLlxuXHRcdFx0ICogQHBhcmFtIHtudW1iZXJ9IHMgU3RhcnRpbmcgbnVtZXJpYyB2YWx1ZVxuXHRcdFx0ICogQHBhcmFtIHtudW1iZXJ9IGMgQ2hhbmdlIGluIG51bWVyaWMgdmFsdWUgb3ZlciB0aGUgY291cnNlIG9mIHRoZSBlbnRpcmUgdHdlZW4uIEZvciBleGFtcGxlLCBpZiBlbGVtZW50LndpZHRoIHN0YXJ0cyBhdCA1IGFuZCBzaG91bGQgZW5kIGF0IDEwMCwgYyB3b3VsZCBiZSA5NS5cblx0XHRcdCAqIEBwYXJhbSB7Q1NTUHJvcFR3ZWVuPX0gbmV4dCBUaGUgbmV4dCBDU1NQcm9wVHdlZW4gaW4gdGhlIGxpbmtlZCBsaXN0LiBJZiBvbmUgaXMgZGVmaW5lZCwgd2Ugd2lsbCBkZWZpbmUgaXRzIF9wcmV2IGFzIHRoZSBuZXcgaW5zdGFuY2UsIGFuZCB0aGUgbmV3IGluc3RhbmNlJ3MgX25leHQgd2lsbCBiZSBwb2ludGVkIGF0IGl0LlxuXHRcdFx0ICogQHBhcmFtIHtudW1iZXI9fSB0eXBlIFRoZSB0eXBlIG9mIENTU1Byb3BUd2VlbiB3aGVyZSAtMSA9IGEgbm9uLXR3ZWVuaW5nIHZhbHVlLCAwID0gYSBzdGFuZGFyZCBzaW1wbGUgdHdlZW4sIDEgPSBhIGNvbXBsZXggdmFsdWUgKGxpa2Ugb25lIHRoYXQgaGFzIG11bHRpcGxlIG51bWJlcnMgaW4gYSBjb21tYS0gb3Igc3BhY2UtZGVsaW1pdGVkIHN0cmluZyBsaWtlIGJvcmRlcjpcIjFweCBzb2xpZCByZWRcIiksIGFuZCAyID0gb25lIHRoYXQgdXNlcyBhIGN1c3RvbSBzZXRSYXRpbyBmdW5jdGlvbiB0aGF0IGRvZXMgYWxsIG9mIHRoZSB3b3JrIG9mIGFwcGx5aW5nIHRoZSB2YWx1ZXMgb24gZWFjaCB1cGRhdGUuXG5cdFx0XHQgKiBAcGFyYW0ge3N0cmluZz19IG4gTmFtZSBvZiB0aGUgcHJvcGVydHkgdGhhdCBzaG91bGQgYmUgdXNlZCBmb3Igb3ZlcndyaXRpbmcgcHVycG9zZXMgd2hpY2ggaXMgdHlwaWNhbGx5IHRoZSBzYW1lIGFzIHAgYnV0IG5vdCBhbHdheXMuIEZvciBleGFtcGxlLCB3ZSBtYXkgbmVlZCB0byBjcmVhdGUgYSBzdWJ0d2VlbiBmb3IgdGhlIDJuZCBwYXJ0IG9mIGEgXCJjbGlwOnJlY3QoLi4uKVwiIHR3ZWVuIGluIHdoaWNoIGNhc2UgXCJwXCIgbWlnaHQgYmUgeHMxIGJ1dCBcIm5cIiBpcyBzdGlsbCBcImNsaXBcIlxuXHRcdFx0ICogQHBhcmFtIHtib29sZWFuPX0gciBJZiB0cnVlLCB0aGUgdmFsdWUocykgc2hvdWxkIGJlIHJvdW5kZWRcblx0XHRcdCAqIEBwYXJhbSB7bnVtYmVyPX0gcHIgUHJpb3JpdHkgaW4gdGhlIGxpbmtlZCBsaXN0IG9yZGVyLiBIaWdoZXIgcHJpb3JpdHkgQ1NTUHJvcFR3ZWVucyB3aWxsIGJlIHVwZGF0ZWQgYmVmb3JlIGxvd2VyIHByaW9yaXR5IG9uZXMuIFRoZSBkZWZhdWx0IHByaW9yaXR5IGlzIDAuXG5cdFx0XHQgKiBAcGFyYW0ge3N0cmluZz19IGIgQmVnaW5uaW5nIHZhbHVlLiBXZSBzdG9yZSB0aGlzIHRvIGVuc3VyZSB0aGF0IGl0IGlzIEVYQUNUTFkgd2hhdCBpdCB3YXMgd2hlbiB0aGUgdHdlZW4gYmVnYW4gd2l0aG91dCBhbnkgcmlzayBvZiBpbnRlcnByZXRhdGlvbiBpc3N1ZXMuXG5cdFx0XHQgKiBAcGFyYW0ge3N0cmluZz19IGUgRW5kaW5nIHZhbHVlLiBXZSBzdG9yZSB0aGlzIHRvIGVuc3VyZSB0aGF0IGl0IGlzIEVYQUNUTFkgd2hhdCB0aGUgdXNlciBkZWZpbmVkIGF0IHRoZSBlbmQgb2YgdGhlIHR3ZWVuIHdpdGhvdXQgYW55IHJpc2sgb2YgaW50ZXJwcmV0YXRpb24gaXNzdWVzLlxuXHRcdFx0ICovXG5cdFx0XHRDU1NQcm9wVHdlZW4gPSBfaW50ZXJuYWxzLkNTU1Byb3BUd2VlbiA9IGZ1bmN0aW9uKHQsIHAsIHMsIGMsIG5leHQsIHR5cGUsIG4sIHIsIHByLCBiLCBlKSB7XG5cdFx0XHRcdHRoaXMudCA9IHQ7IC8vdGFyZ2V0XG5cdFx0XHRcdHRoaXMucCA9IHA7IC8vcHJvcGVydHlcblx0XHRcdFx0dGhpcy5zID0gczsgLy9zdGFydGluZyB2YWx1ZVxuXHRcdFx0XHR0aGlzLmMgPSBjOyAvL2NoYW5nZSB2YWx1ZVxuXHRcdFx0XHR0aGlzLm4gPSBuIHx8IHA7IC8vbmFtZSB0aGF0IHRoaXMgQ1NTUHJvcFR3ZWVuIHNob3VsZCBiZSBhc3NvY2lhdGVkIHRvICh1c3VhbGx5IHRoZSBzYW1lIGFzIHAsIGJ1dCBub3QgYWx3YXlzIC0gbiBpcyB3aGF0IG92ZXJ3cml0aW5nIGxvb2tzIGF0KVxuXHRcdFx0XHRpZiAoISh0IGluc3RhbmNlb2YgQ1NTUHJvcFR3ZWVuKSkge1xuXHRcdFx0XHRcdF9vdmVyd3JpdGVQcm9wcy5wdXNoKHRoaXMubik7XG5cdFx0XHRcdH1cblx0XHRcdFx0dGhpcy5yID0gcjsgLy9yb3VuZCAoYm9vbGVhbilcblx0XHRcdFx0dGhpcy50eXBlID0gdHlwZSB8fCAwOyAvLzAgPSBub3JtYWwgdHdlZW4sIC0xID0gbm9uLXR3ZWVuaW5nIChpbiB3aGljaCBjYXNlIHhzMCB3aWxsIGJlIGFwcGxpZWQgdG8gdGhlIHRhcmdldCdzIHByb3BlcnR5LCBsaWtlIHRwLnRbdHAucF0gPSB0cC54czApLCAxID0gY29tcGxleC12YWx1ZSBTcGVjaWFsUHJvcCwgMiA9IGN1c3RvbSBzZXRSYXRpbygpIHRoYXQgZG9lcyBhbGwgdGhlIHdvcmtcblx0XHRcdFx0aWYgKHByKSB7XG5cdFx0XHRcdFx0dGhpcy5wciA9IHByO1xuXHRcdFx0XHRcdF9oYXNQcmlvcml0eSA9IHRydWU7XG5cdFx0XHRcdH1cblx0XHRcdFx0dGhpcy5iID0gKGIgPT09IHVuZGVmaW5lZCkgPyBzIDogYjtcblx0XHRcdFx0dGhpcy5lID0gKGUgPT09IHVuZGVmaW5lZCkgPyBzICsgYyA6IGU7XG5cdFx0XHRcdGlmIChuZXh0KSB7XG5cdFx0XHRcdFx0dGhpcy5fbmV4dCA9IG5leHQ7XG5cdFx0XHRcdFx0bmV4dC5fcHJldiA9IHRoaXM7XG5cdFx0XHRcdH1cblx0XHRcdH0sXG5cblx0XHRcdF9hZGROb25Ud2VlbmluZ051bWVyaWNQVCA9IGZ1bmN0aW9uKHRhcmdldCwgcHJvcCwgc3RhcnQsIGVuZCwgbmV4dCwgb3ZlcndyaXRlUHJvcCkgeyAvL2NsZWFucyB1cCBzb21lIGNvZGUgcmVkdW5kYW5jaWVzIGFuZCBoZWxwcyBtaW5pZmljYXRpb24uIEp1c3QgYSBmYXN0IHdheSB0byBhZGQgYSBOVU1FUklDIG5vbi10d2VlbmluZyBDU1NQcm9wVHdlZW5cblx0XHRcdFx0dmFyIHB0ID0gbmV3IENTU1Byb3BUd2Vlbih0YXJnZXQsIHByb3AsIHN0YXJ0LCBlbmQgLSBzdGFydCwgbmV4dCwgLTEsIG92ZXJ3cml0ZVByb3ApO1xuXHRcdFx0XHRwdC5iID0gc3RhcnQ7XG5cdFx0XHRcdHB0LmUgPSBwdC54czAgPSBlbmQ7XG5cdFx0XHRcdHJldHVybiBwdDtcblx0XHRcdH0sXG5cblx0XHRcdC8qKlxuXHRcdFx0ICogVGFrZXMgYSB0YXJnZXQsIHRoZSBiZWdpbm5pbmcgdmFsdWUgYW5kIGVuZGluZyB2YWx1ZSAoYXMgc3RyaW5ncykgYW5kIHBhcnNlcyB0aGVtIGludG8gYSBDU1NQcm9wVHdlZW4gKHBvc3NpYmx5IHdpdGggY2hpbGQgQ1NTUHJvcFR3ZWVucykgdGhhdCBhY2NvbW1vZGF0ZXMgbXVsdGlwbGUgbnVtYmVycywgY29sb3JzLCBjb21tYS1kZWxpbWl0ZWQgdmFsdWVzLCBldGMuIEZvciBleGFtcGxlOlxuXHRcdFx0ICogc3AucGFyc2VDb21wbGV4KGVsZW1lbnQsIFwiYm94U2hhZG93XCIsIFwiNXB4IDEwcHggMjBweCByZ2IoMjU1LDEwMiw1MSlcIiwgXCIwcHggMHB4IDBweCByZWRcIiwgdHJ1ZSwgXCIwcHggMHB4IDBweCByZ2IoMCwwLDAsMClcIiwgcHQpO1xuXHRcdFx0ICogSXQgd2lsbCB3YWxrIHRocm91Z2ggdGhlIGJlZ2lubmluZyBhbmQgZW5kaW5nIHZhbHVlcyAod2hpY2ggc2hvdWxkIGJlIGluIHRoZSBzYW1lIGZvcm1hdCB3aXRoIHRoZSBzYW1lIG51bWJlciBhbmQgdHlwZSBvZiB2YWx1ZXMpIGFuZCBmaWd1cmUgb3V0IHdoaWNoIHBhcnRzIGFyZSBudW1iZXJzLCB3aGF0IHN0cmluZ3Mgc2VwYXJhdGUgdGhlIG51bWVyaWMvdHdlZW5hYmxlIHZhbHVlcywgYW5kIHRoZW4gY3JlYXRlIHRoZSBDU1NQcm9wVHdlZW5zIGFjY29yZGluZ2x5LiBJZiBhIHBsdWdpbiBpcyBkZWZpbmVkLCBubyBjaGlsZCBDU1NQcm9wVHdlZW5zIHdpbGwgYmUgY3JlYXRlZC4gSW5zdGVhZCwgdGhlIGVuZGluZyB2YWx1ZXMgd2lsbCBiZSBzdG9yZWQgaW4gdGhlIFwiZGF0YVwiIHByb3BlcnR5IG9mIHRoZSByZXR1cm5lZCBDU1NQcm9wVHdlZW4gbGlrZToge3M6LTUsIHhuMTotMTAsIHhuMjotMjAsIHhuMzoyNTUsIHhuNDowLCB4bjU6MH0gc28gdGhhdCBpdCBjYW4gYmUgZmVkIHRvIGFueSBvdGhlciBwbHVnaW4gYW5kIGl0J2xsIGJlIHBsYWluIG51bWVyaWMgdHdlZW5zIGJ1dCB0aGUgcmVjb21wb3NpdGlvbiBvZiB0aGUgY29tcGxleCB2YWx1ZSB3aWxsIGJlIGhhbmRsZWQgaW5zaWRlIENTU1BsdWdpbidzIHNldFJhdGlvKCkuXG5cdFx0XHQgKiBJZiBhIHNldFJhdGlvIGlzIGRlZmluZWQsIHRoZSB0eXBlIG9mIHRoZSBDU1NQcm9wVHdlZW4gd2lsbCBiZSBzZXQgdG8gMiBhbmQgcmVjb21wb3NpdGlvbiBvZiB0aGUgdmFsdWVzIHdpbGwgYmUgdGhlIHJlc3BvbnNpYmlsaXR5IG9mIHRoYXQgbWV0aG9kLlxuXHRcdFx0ICpcblx0XHRcdCAqIEBwYXJhbSB7IU9iamVjdH0gdCBUYXJnZXQgd2hvc2UgcHJvcGVydHkgd2lsbCBiZSB0d2VlbmVkXG5cdFx0XHQgKiBAcGFyYW0geyFzdHJpbmd9IHAgUHJvcGVydHkgdGhhdCB3aWxsIGJlIHR3ZWVuZWQgKGl0cyBuYW1lLCBsaWtlIFwibGVmdFwiIG9yIFwiYmFja2dyb3VuZENvbG9yXCIgb3IgXCJib3hTaGFkb3dcIilcblx0XHRcdCAqIEBwYXJhbSB7c3RyaW5nfSBiIEJlZ2lubmluZyB2YWx1ZVxuXHRcdFx0ICogQHBhcmFtIHtzdHJpbmd9IGUgRW5kaW5nIHZhbHVlXG5cdFx0XHQgKiBAcGFyYW0ge2Jvb2xlYW59IGNscnMgSWYgdHJ1ZSwgdGhlIHZhbHVlIGNvdWxkIGNvbnRhaW4gYSBjb2xvciB2YWx1ZSBsaWtlIFwicmdiKDI1NSwwLDApXCIgb3IgXCIjRjAwXCIgb3IgXCJyZWRcIi4gVGhlIGRlZmF1bHQgaXMgZmFsc2UsIHNvIG5vIGNvbG9ycyB3aWxsIGJlIHJlY29nbml6ZWQgKGEgcGVyZm9ybWFuY2Ugb3B0aW1pemF0aW9uKVxuXHRcdFx0ICogQHBhcmFtIHsoc3RyaW5nfG51bWJlcnxPYmplY3QpfSBkZmx0IFRoZSBkZWZhdWx0IGJlZ2lubmluZyB2YWx1ZSB0aGF0IHNob3VsZCBiZSB1c2VkIGlmIG5vIHZhbGlkIGJlZ2lubmluZyB2YWx1ZSBpcyBkZWZpbmVkIG9yIGlmIHRoZSBudW1iZXIgb2YgdmFsdWVzIGluc2lkZSB0aGUgY29tcGxleCBiZWdpbm5pbmcgYW5kIGVuZGluZyB2YWx1ZXMgZG9uJ3QgbWF0Y2hcblx0XHRcdCAqIEBwYXJhbSB7P0NTU1Byb3BUd2Vlbn0gcHQgQ1NTUHJvcFR3ZWVuIGluc3RhbmNlIHRoYXQgaXMgdGhlIGN1cnJlbnQgaGVhZCBvZiB0aGUgbGlua2VkIGxpc3QgKHdlJ2xsIHByZXBlbmQgdG8gdGhpcykuXG5cdFx0XHQgKiBAcGFyYW0ge251bWJlcj19IHByIFByaW9yaXR5IGluIHRoZSBsaW5rZWQgbGlzdCBvcmRlci4gSGlnaGVyIHByaW9yaXR5IHByb3BlcnRpZXMgd2lsbCBiZSB1cGRhdGVkIGJlZm9yZSBsb3dlciBwcmlvcml0eSBvbmVzLiBUaGUgZGVmYXVsdCBwcmlvcml0eSBpcyAwLlxuXHRcdFx0ICogQHBhcmFtIHtUd2VlblBsdWdpbj19IHBsdWdpbiBJZiBhIHBsdWdpbiBzaG91bGQgaGFuZGxlIHRoZSB0d2VlbmluZyBvZiBleHRyYSBwcm9wZXJ0aWVzLCBwYXNzIHRoZSBwbHVnaW4gaW5zdGFuY2UgaGVyZS4gSWYgb25lIGlzIGRlZmluZWQsIHRoZW4gTk8gc3VidHdlZW5zIHdpbGwgYmUgY3JlYXRlZCBmb3IgYW55IGV4dHJhIHByb3BlcnRpZXMgKHRoZSBwcm9wZXJ0aWVzIHdpbGwgYmUgY3JlYXRlZCAtIGp1c3Qgbm90IGFkZGl0aW9uYWwgQ1NTUHJvcFR3ZWVuIGluc3RhbmNlcyB0byB0d2VlbiB0aGVtKSBiZWNhdXNlIHRoZSBwbHVnaW4gaXMgZXhwZWN0ZWQgdG8gZG8gc28uIEhvd2V2ZXIsIHRoZSBlbmQgdmFsdWVzIFdJTEwgYmUgcG9wdWxhdGVkIGluIHRoZSBcImRhdGFcIiBwcm9wZXJ0eSwgbGlrZSB7czoxMDAsIHhuMTo1MCwgeG4yOjMwMH1cblx0XHRcdCAqIEBwYXJhbSB7ZnVuY3Rpb24obnVtYmVyKT19IHNldFJhdGlvIElmIHZhbHVlcyBzaG91bGQgYmUgc2V0IGluIGEgY3VzdG9tIGZ1bmN0aW9uIGluc3RlYWQgb2YgYmVpbmcgcGllY2VkIHRvZ2V0aGVyIGluIGEgdHlwZToxIChjb21wbGV4LXZhbHVlKSBDU1NQcm9wVHdlZW4sIGRlZmluZSB0aGF0IGN1c3RvbSBmdW5jdGlvbiBoZXJlLlxuXHRcdFx0ICogQHJldHVybiB7Q1NTUHJvcFR3ZWVufSBUaGUgZmlyc3QgQ1NTUHJvcFR3ZWVuIGluIHRoZSBsaW5rZWQgbGlzdCB3aGljaCBpbmNsdWRlcyB0aGUgbmV3IG9uZShzKSBhZGRlZCBieSB0aGUgcGFyc2VDb21wbGV4KCkgY2FsbC5cblx0XHRcdCAqL1xuXHRcdFx0X3BhcnNlQ29tcGxleCA9IENTU1BsdWdpbi5wYXJzZUNvbXBsZXggPSBmdW5jdGlvbih0LCBwLCBiLCBlLCBjbHJzLCBkZmx0LCBwdCwgcHIsIHBsdWdpbiwgc2V0UmF0aW8pIHtcblx0XHRcdFx0Ly9ERUJVRzogX2xvZyhcInBhcnNlQ29tcGxleDogXCIrcCtcIiwgYjogXCIrYitcIiwgZTogXCIrZSk7XG5cdFx0XHRcdGIgPSBiIHx8IGRmbHQgfHwgXCJcIjtcblx0XHRcdFx0aWYgKHR5cGVvZihlKSA9PT0gXCJmdW5jdGlvblwiKSB7XG5cdFx0XHRcdFx0ZSA9IGUoX2luZGV4LCBfdGFyZ2V0KTtcblx0XHRcdFx0fVxuXHRcdFx0XHRwdCA9IG5ldyBDU1NQcm9wVHdlZW4odCwgcCwgMCwgMCwgcHQsIChzZXRSYXRpbyA/IDIgOiAxKSwgbnVsbCwgZmFsc2UsIHByLCBiLCBlKTtcblx0XHRcdFx0ZSArPSBcIlwiOyAvL2Vuc3VyZXMgaXQncyBhIHN0cmluZ1xuXHRcdFx0XHRpZiAoY2xycyAmJiBfY29sb3JFeHAudGVzdChlICsgYikpIHsgLy9pZiBjb2xvcnMgYXJlIGZvdW5kLCBub3JtYWxpemUgdGhlIGZvcm1hdHRpbmcgdG8gcmdiYSgpIG9yIGhzbGEoKS5cblx0XHRcdFx0XHRlID0gW2IsIGVdO1xuXHRcdFx0XHRcdENTU1BsdWdpbi5jb2xvclN0cmluZ0ZpbHRlcihlKTtcblx0XHRcdFx0XHRiID0gZVswXTtcblx0XHRcdFx0XHRlID0gZVsxXTtcblx0XHRcdFx0fVxuXHRcdFx0XHR2YXIgYmEgPSBiLnNwbGl0KFwiLCBcIikuam9pbihcIixcIikuc3BsaXQoXCIgXCIpLCAvL2JlZ2lubmluZyBhcnJheVxuXHRcdFx0XHRcdGVhID0gZS5zcGxpdChcIiwgXCIpLmpvaW4oXCIsXCIpLnNwbGl0KFwiIFwiKSwgLy9lbmRpbmcgYXJyYXlcblx0XHRcdFx0XHRsID0gYmEubGVuZ3RoLFxuXHRcdFx0XHRcdGF1dG9Sb3VuZCA9IChfYXV0b1JvdW5kICE9PSBmYWxzZSksXG5cdFx0XHRcdFx0aSwgeGksIG5pLCBidiwgZXYsIGJudW1zLCBlbnVtcywgYm4sIGhhc0FscGhhLCB0ZW1wLCBjdiwgc3RyLCB1c2VIU0w7XG5cdFx0XHRcdGlmIChlLmluZGV4T2YoXCIsXCIpICE9PSAtMSB8fCBiLmluZGV4T2YoXCIsXCIpICE9PSAtMSkge1xuXHRcdFx0XHRcdGlmICgoZSArIGIpLmluZGV4T2YoXCJyZ2JcIikgIT09IC0xIHx8IChlICsgYikuaW5kZXhPZihcImhzbFwiKSAhPT0gLTEpIHsgLy9rZWVwIHJnYigpLCByZ2JhKCksIGhzbCgpLCBhbmQgaHNsYSgpIHZhbHVlcyB0b2dldGhlciEgKHJlbWVtYmVyLCB3ZSdyZSBzcGxpdHRpbmcgb24gc3BhY2VzKVxuXHRcdFx0XHRcdFx0YmEgPSBiYS5qb2luKFwiIFwiKS5yZXBsYWNlKF9jb21tYXNPdXRzaWRlUGFyZW5FeHAsIFwiLCBcIikuc3BsaXQoXCIgXCIpO1xuXHRcdFx0XHRcdFx0ZWEgPSBlYS5qb2luKFwiIFwiKS5yZXBsYWNlKF9jb21tYXNPdXRzaWRlUGFyZW5FeHAsIFwiLCBcIikuc3BsaXQoXCIgXCIpO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRiYSA9IGJhLmpvaW4oXCIgXCIpLnNwbGl0KFwiLFwiKS5qb2luKFwiLCBcIikuc3BsaXQoXCIgXCIpO1xuXHRcdFx0XHRcdFx0ZWEgPSBlYS5qb2luKFwiIFwiKS5zcGxpdChcIixcIikuam9pbihcIiwgXCIpLnNwbGl0KFwiIFwiKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0bCA9IGJhLmxlbmd0aDtcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAobCAhPT0gZWEubGVuZ3RoKSB7XG5cdFx0XHRcdFx0Ly9ERUJVRzogX2xvZyhcIm1pc21hdGNoZWQgZm9ybWF0dGluZyBkZXRlY3RlZCBvbiBcIiArIHAgKyBcIiAoXCIgKyBiICsgXCIgdnMgXCIgKyBlICsgXCIpXCIpO1xuXHRcdFx0XHRcdGJhID0gKGRmbHQgfHwgXCJcIikuc3BsaXQoXCIgXCIpO1xuXHRcdFx0XHRcdGwgPSBiYS5sZW5ndGg7XG5cdFx0XHRcdH1cblx0XHRcdFx0cHQucGx1Z2luID0gcGx1Z2luO1xuXHRcdFx0XHRwdC5zZXRSYXRpbyA9IHNldFJhdGlvO1xuXHRcdFx0XHRfY29sb3JFeHAubGFzdEluZGV4ID0gMDtcblx0XHRcdFx0Zm9yIChpID0gMDsgaSA8IGw7IGkrKykge1xuXHRcdFx0XHRcdGJ2ID0gYmFbaV07XG5cdFx0XHRcdFx0ZXYgPSBlYVtpXTtcblx0XHRcdFx0XHRibiA9IHBhcnNlRmxvYXQoYnYpO1xuXHRcdFx0XHRcdC8vaWYgdGhlIHZhbHVlIGJlZ2lucyB3aXRoIGEgbnVtYmVyIChtb3N0IGNvbW1vbikuIEl0J3MgZmluZSBpZiBpdCBoYXMgYSBzdWZmaXggbGlrZSBweFxuXHRcdFx0XHRcdGlmIChibiB8fCBibiA9PT0gMCkge1xuXHRcdFx0XHRcdFx0cHQuYXBwZW5kWHRyYShcIlwiLCBibiwgX3BhcnNlQ2hhbmdlKGV2LCBibiksIGV2LnJlcGxhY2UoX3JlbE51bUV4cCwgXCJcIiksIChhdXRvUm91bmQgJiYgZXYuaW5kZXhPZihcInB4XCIpICE9PSAtMSksIHRydWUpO1xuXG5cdFx0XHRcdFx0Ly9pZiB0aGUgdmFsdWUgaXMgYSBjb2xvclxuXHRcdFx0XHRcdH0gZWxzZSBpZiAoY2xycyAmJiBfY29sb3JFeHAudGVzdChidikpIHtcblx0XHRcdFx0XHRcdHN0ciA9IGV2LmluZGV4T2YoXCIpXCIpICsgMTtcblx0XHRcdFx0XHRcdHN0ciA9IFwiKVwiICsgKHN0ciA/IGV2LnN1YnN0cihzdHIpIDogXCJcIik7IC8vaWYgdGhlcmUncyBhIGNvbW1hIG9yICkgYXQgdGhlIGVuZCwgcmV0YWluIGl0LlxuXHRcdFx0XHRcdFx0dXNlSFNMID0gKGV2LmluZGV4T2YoXCJoc2xcIikgIT09IC0xICYmIF9zdXBwb3J0c09wYWNpdHkpO1xuXHRcdFx0XHRcdFx0dGVtcCA9IGV2OyAvL29yaWdpbmFsIHN0cmluZyB2YWx1ZSBzbyB3ZSBjYW4gbG9vayBmb3IgYW55IHByZWZpeCBsYXRlci5cblx0XHRcdFx0XHRcdGJ2ID0gX3BhcnNlQ29sb3IoYnYsIHVzZUhTTCk7XG5cdFx0XHRcdFx0XHRldiA9IF9wYXJzZUNvbG9yKGV2LCB1c2VIU0wpO1xuXHRcdFx0XHRcdFx0aGFzQWxwaGEgPSAoYnYubGVuZ3RoICsgZXYubGVuZ3RoID4gNik7XG5cdFx0XHRcdFx0XHRpZiAoaGFzQWxwaGEgJiYgIV9zdXBwb3J0c09wYWNpdHkgJiYgZXZbM10gPT09IDApIHsgLy9vbGRlciB2ZXJzaW9ucyBvZiBJRSBkb24ndCBzdXBwb3J0IHJnYmEoKSwgc28gaWYgdGhlIGRlc3RpbmF0aW9uIGFscGhhIGlzIDAsIGp1c3QgdXNlIFwidHJhbnNwYXJlbnRcIiBmb3IgdGhlIGVuZCBjb2xvclxuXHRcdFx0XHRcdFx0XHRwdFtcInhzXCIgKyBwdC5sXSArPSBwdC5sID8gXCIgdHJhbnNwYXJlbnRcIiA6IFwidHJhbnNwYXJlbnRcIjtcblx0XHRcdFx0XHRcdFx0cHQuZSA9IHB0LmUuc3BsaXQoZWFbaV0pLmpvaW4oXCJ0cmFuc3BhcmVudFwiKTtcblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdGlmICghX3N1cHBvcnRzT3BhY2l0eSkgeyAvL29sZCB2ZXJzaW9ucyBvZiBJRSBkb24ndCBzdXBwb3J0IHJnYmEoKS5cblx0XHRcdFx0XHRcdFx0XHRoYXNBbHBoYSA9IGZhbHNlO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdGlmICh1c2VIU0wpIHtcblx0XHRcdFx0XHRcdFx0XHRwdC5hcHBlbmRYdHJhKHRlbXAuc3Vic3RyKDAsIHRlbXAuaW5kZXhPZihcImhzbFwiKSkgKyAoaGFzQWxwaGEgPyBcImhzbGEoXCIgOiBcImhzbChcIiksIGJ2WzBdLCBfcGFyc2VDaGFuZ2UoZXZbMF0sIGJ2WzBdKSwgXCIsXCIsIGZhbHNlLCB0cnVlKVxuXHRcdFx0XHRcdFx0XHRcdFx0LmFwcGVuZFh0cmEoXCJcIiwgYnZbMV0sIF9wYXJzZUNoYW5nZShldlsxXSwgYnZbMV0pLCBcIiUsXCIsIGZhbHNlKVxuXHRcdFx0XHRcdFx0XHRcdFx0LmFwcGVuZFh0cmEoXCJcIiwgYnZbMl0sIF9wYXJzZUNoYW5nZShldlsyXSwgYnZbMl0pLCAoaGFzQWxwaGEgPyBcIiUsXCIgOiBcIiVcIiArIHN0ciksIGZhbHNlKTtcblx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0XHRwdC5hcHBlbmRYdHJhKHRlbXAuc3Vic3RyKDAsIHRlbXAuaW5kZXhPZihcInJnYlwiKSkgKyAoaGFzQWxwaGEgPyBcInJnYmEoXCIgOiBcInJnYihcIiksIGJ2WzBdLCBldlswXSAtIGJ2WzBdLCBcIixcIiwgdHJ1ZSwgdHJ1ZSlcblx0XHRcdFx0XHRcdFx0XHRcdC5hcHBlbmRYdHJhKFwiXCIsIGJ2WzFdLCBldlsxXSAtIGJ2WzFdLCBcIixcIiwgdHJ1ZSlcblx0XHRcdFx0XHRcdFx0XHRcdC5hcHBlbmRYdHJhKFwiXCIsIGJ2WzJdLCBldlsyXSAtIGJ2WzJdLCAoaGFzQWxwaGEgPyBcIixcIiA6IHN0ciksIHRydWUpO1xuXHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdFx0aWYgKGhhc0FscGhhKSB7XG5cdFx0XHRcdFx0XHRcdFx0YnYgPSAoYnYubGVuZ3RoIDwgNCkgPyAxIDogYnZbM107XG5cdFx0XHRcdFx0XHRcdFx0cHQuYXBwZW5kWHRyYShcIlwiLCBidiwgKChldi5sZW5ndGggPCA0KSA/IDEgOiBldlszXSkgLSBidiwgc3RyLCBmYWxzZSk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdF9jb2xvckV4cC5sYXN0SW5kZXggPSAwOyAvL290aGVyd2lzZSB0aGUgdGVzdCgpIG9uIHRoZSBSZWdFeHAgY291bGQgbW92ZSB0aGUgbGFzdEluZGV4IGFuZCB0YWludCBmdXR1cmUgcmVzdWx0cy5cblxuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRibnVtcyA9IGJ2Lm1hdGNoKF9udW1FeHApOyAvL2dldHMgZWFjaCBncm91cCBvZiBudW1iZXJzIGluIHRoZSBiZWdpbm5pbmcgdmFsdWUgc3RyaW5nIGFuZCBkcm9wcyB0aGVtIGludG8gYW4gYXJyYXlcblxuXHRcdFx0XHRcdFx0Ly9pZiBubyBudW1iZXIgaXMgZm91bmQsIHRyZWF0IGl0IGFzIGEgbm9uLXR3ZWVuaW5nIHZhbHVlIGFuZCBqdXN0IGFwcGVuZCB0aGUgc3RyaW5nIHRvIHRoZSBjdXJyZW50IHhzLlxuXHRcdFx0XHRcdFx0aWYgKCFibnVtcykge1xuXHRcdFx0XHRcdFx0XHRwdFtcInhzXCIgKyBwdC5sXSArPSAocHQubCB8fCBwdFtcInhzXCIgKyBwdC5sXSkgPyBcIiBcIiArIGV2IDogZXY7XG5cblx0XHRcdFx0XHRcdC8vbG9vcCB0aHJvdWdoIGFsbCB0aGUgbnVtYmVycyB0aGF0IGFyZSBmb3VuZCBhbmQgY29uc3RydWN0IHRoZSBleHRyYSB2YWx1ZXMgb24gdGhlIHB0LlxuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0ZW51bXMgPSBldi5tYXRjaChfcmVsTnVtRXhwKTsgLy9nZXQgZWFjaCBncm91cCBvZiBudW1iZXJzIGluIHRoZSBlbmQgdmFsdWUgc3RyaW5nIGFuZCBkcm9wIHRoZW0gaW50byBhbiBhcnJheS4gV2UgYWxsb3cgcmVsYXRpdmUgdmFsdWVzIHRvbywgbGlrZSArPTUwIG9yIC09LjVcblx0XHRcdFx0XHRcdFx0aWYgKCFlbnVtcyB8fCBlbnVtcy5sZW5ndGggIT09IGJudW1zLmxlbmd0aCkge1xuXHRcdFx0XHRcdFx0XHRcdC8vREVCVUc6IF9sb2coXCJtaXNtYXRjaGVkIGZvcm1hdHRpbmcgZGV0ZWN0ZWQgb24gXCIgKyBwICsgXCIgKFwiICsgYiArIFwiIHZzIFwiICsgZSArIFwiKVwiKTtcblx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gcHQ7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0bmkgPSAwO1xuXHRcdFx0XHRcdFx0XHRmb3IgKHhpID0gMDsgeGkgPCBibnVtcy5sZW5ndGg7IHhpKyspIHtcblx0XHRcdFx0XHRcdFx0XHRjdiA9IGJudW1zW3hpXTtcblx0XHRcdFx0XHRcdFx0XHR0ZW1wID0gYnYuaW5kZXhPZihjdiwgbmkpO1xuXHRcdFx0XHRcdFx0XHRcdHB0LmFwcGVuZFh0cmEoYnYuc3Vic3RyKG5pLCB0ZW1wIC0gbmkpLCBOdW1iZXIoY3YpLCBfcGFyc2VDaGFuZ2UoZW51bXNbeGldLCBjdiksIFwiXCIsIChhdXRvUm91bmQgJiYgYnYuc3Vic3RyKHRlbXAgKyBjdi5sZW5ndGgsIDIpID09PSBcInB4XCIpLCAoeGkgPT09IDApKTtcblx0XHRcdFx0XHRcdFx0XHRuaSA9IHRlbXAgKyBjdi5sZW5ndGg7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0cHRbXCJ4c1wiICsgcHQubF0gKz0gYnYuc3Vic3RyKG5pKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0Ly9pZiB0aGVyZSBhcmUgcmVsYXRpdmUgdmFsdWVzIChcIis9XCIgb3IgXCItPVwiIHByZWZpeCksIHdlIG5lZWQgdG8gYWRqdXN0IHRoZSBlbmRpbmcgdmFsdWUgdG8gZWxpbWluYXRlIHRoZSBwcmVmaXhlcyBhbmQgY29tYmluZSB0aGUgdmFsdWVzIHByb3Blcmx5LlxuXHRcdFx0XHRpZiAoZS5pbmRleE9mKFwiPVwiKSAhPT0gLTEpIGlmIChwdC5kYXRhKSB7XG5cdFx0XHRcdFx0c3RyID0gcHQueHMwICsgcHQuZGF0YS5zO1xuXHRcdFx0XHRcdGZvciAoaSA9IDE7IGkgPCBwdC5sOyBpKyspIHtcblx0XHRcdFx0XHRcdHN0ciArPSBwdFtcInhzXCIgKyBpXSArIHB0LmRhdGFbXCJ4blwiICsgaV07XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHB0LmUgPSBzdHIgKyBwdFtcInhzXCIgKyBpXTtcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAoIXB0LmwpIHtcblx0XHRcdFx0XHRwdC50eXBlID0gLTE7XG5cdFx0XHRcdFx0cHQueHMwID0gcHQuZTtcblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gcHQueGZpcnN0IHx8IHB0O1xuXHRcdFx0fSxcblx0XHRcdGkgPSA5O1xuXG5cblx0XHRwID0gQ1NTUHJvcFR3ZWVuLnByb3RvdHlwZTtcblx0XHRwLmwgPSBwLnByID0gMDsgLy9sZW5ndGggKG51bWJlciBvZiBleHRyYSBwcm9wZXJ0aWVzIGxpa2UgeG4xLCB4bjIsIHhuMywgZXRjLlxuXHRcdHdoaWxlICgtLWkgPiAwKSB7XG5cdFx0XHRwW1wieG5cIiArIGldID0gMDtcblx0XHRcdHBbXCJ4c1wiICsgaV0gPSBcIlwiO1xuXHRcdH1cblx0XHRwLnhzMCA9IFwiXCI7XG5cdFx0cC5fbmV4dCA9IHAuX3ByZXYgPSBwLnhmaXJzdCA9IHAuZGF0YSA9IHAucGx1Z2luID0gcC5zZXRSYXRpbyA9IHAucnhwID0gbnVsbDtcblxuXG5cdFx0LyoqXG5cdFx0ICogQXBwZW5kcyBhbmQgZXh0cmEgdHdlZW5pbmcgdmFsdWUgdG8gYSBDU1NQcm9wVHdlZW4gYW5kIGF1dG9tYXRpY2FsbHkgbWFuYWdlcyBhbnkgcHJlZml4IGFuZCBzdWZmaXggc3RyaW5ncy4gVGhlIGZpcnN0IGV4dHJhIHZhbHVlIGlzIHN0b3JlZCBpbiB0aGUgcyBhbmQgYyBvZiB0aGUgbWFpbiBDU1NQcm9wVHdlZW4gaW5zdGFuY2UsIGJ1dCB0aGVyZWFmdGVyIGFueSBleHRyYXMgYXJlIHN0b3JlZCBpbiB0aGUgeG4xLCB4bjIsIHhuMywgZXRjLiBUaGUgcHJlZml4ZXMgYW5kIHN1ZmZpeGVzIGFyZSBzdG9yZWQgaW4gdGhlIHhzMCwgeHMxLCB4czIsIGV0Yy4gcHJvcGVydGllcy4gRm9yIGV4YW1wbGUsIGlmIEkgd2FsayB0aHJvdWdoIGEgY2xpcCB2YWx1ZSBsaWtlIFwicmVjdCgxMHB4LCA1cHgsIDBweCwgMjBweClcIiwgdGhlIHZhbHVlcyB3b3VsZCBiZSBzdG9yZWQgbGlrZSB0aGlzOlxuXHRcdCAqIHhzMDpcInJlY3QoXCIsIHM6MTAsIHhzMTpcInB4LCBcIiwgeG4xOjUsIHhzMjpcInB4LCBcIiwgeG4yOjAsIHhzMzpcInB4LCBcIiwgeG4zOjIwLCB4bjQ6XCJweClcIlxuXHRcdCAqIEFuZCB0aGV5J2QgYWxsIGdldCBqb2luZWQgdG9nZXRoZXIgd2hlbiB0aGUgQ1NTUGx1Z2luIHJlbmRlcnMgKGluIHRoZSBzZXRSYXRpbygpIG1ldGhvZCkuXG5cdFx0ICogQHBhcmFtIHtzdHJpbmc9fSBwZnggUHJlZml4IChpZiBhbnkpXG5cdFx0ICogQHBhcmFtIHshbnVtYmVyfSBzIFN0YXJ0aW5nIHZhbHVlXG5cdFx0ICogQHBhcmFtIHshbnVtYmVyfSBjIENoYW5nZSBpbiBudW1lcmljIHZhbHVlIG92ZXIgdGhlIGNvdXJzZSBvZiB0aGUgZW50aXJlIHR3ZWVuLiBGb3IgZXhhbXBsZSwgaWYgdGhlIHN0YXJ0IGlzIDUgYW5kIHRoZSBlbmQgaXMgMTAwLCB0aGUgY2hhbmdlIHdvdWxkIGJlIDk1LlxuXHRcdCAqIEBwYXJhbSB7c3RyaW5nPX0gc2Z4IFN1ZmZpeCAoaWYgYW55KVxuXHRcdCAqIEBwYXJhbSB7Ym9vbGVhbj19IHIgUm91bmQgKGlmIHRydWUpLlxuXHRcdCAqIEBwYXJhbSB7Ym9vbGVhbj19IHBhZCBJZiB0cnVlLCB0aGlzIGV4dHJhIHZhbHVlIHNob3VsZCBiZSBzZXBhcmF0ZWQgYnkgdGhlIHByZXZpb3VzIG9uZSBieSBhIHNwYWNlLiBJZiB0aGVyZSBpcyBubyBwcmV2aW91cyBleHRyYSBhbmQgcGFkIGlzIHRydWUsIGl0IHdpbGwgYXV0b21hdGljYWxseSBkcm9wIHRoZSBzcGFjZS5cblx0XHQgKiBAcmV0dXJuIHtDU1NQcm9wVHdlZW59IHJldHVybnMgaXRzZWxmIHNvIHRoYXQgbXVsdGlwbGUgbWV0aG9kcyBjYW4gYmUgY2hhaW5lZCB0b2dldGhlci5cblx0XHQgKi9cblx0XHRwLmFwcGVuZFh0cmEgPSBmdW5jdGlvbihwZngsIHMsIGMsIHNmeCwgciwgcGFkKSB7XG5cdFx0XHR2YXIgcHQgPSB0aGlzLFxuXHRcdFx0XHRsID0gcHQubDtcblx0XHRcdHB0W1wieHNcIiArIGxdICs9IChwYWQgJiYgKGwgfHwgcHRbXCJ4c1wiICsgbF0pKSA/IFwiIFwiICsgcGZ4IDogcGZ4IHx8IFwiXCI7XG5cdFx0XHRpZiAoIWMpIGlmIChsICE9PSAwICYmICFwdC5wbHVnaW4pIHsgLy90eXBpY2FsbHkgd2UnbGwgY29tYmluZSBub24tY2hhbmdpbmcgdmFsdWVzIHJpZ2h0IGludG8gdGhlIHhzIHRvIG9wdGltaXplIHBlcmZvcm1hbmNlLCBidXQgd2UgZG9uJ3QgY29tYmluZSB0aGVtIHdoZW4gdGhlcmUncyBhIHBsdWdpbiB0aGF0IHdpbGwgYmUgdHdlZW5pbmcgdGhlIHZhbHVlcyBiZWNhdXNlIGl0IG1heSBkZXBlbmQgb24gdGhlIHZhbHVlcyBiZWluZyBzcGxpdCBhcGFydCwgbGlrZSBmb3IgYSBiZXppZXIsIGlmIGEgdmFsdWUgZG9lc24ndCBjaGFuZ2UgYmV0d2VlbiB0aGUgZmlyc3QgYW5kIHNlY29uZCBpdGVyYXRpb24gYnV0IHRoZW4gaXQgZG9lcyBvbiB0aGUgM3JkLCB3ZSdsbCBydW4gaW50byB0cm91YmxlIGJlY2F1c2UgdGhlcmUncyBubyB4biBzbG90IGZvciB0aGF0IHZhbHVlIVxuXHRcdFx0XHRwdFtcInhzXCIgKyBsXSArPSBzICsgKHNmeCB8fCBcIlwiKTtcblx0XHRcdFx0cmV0dXJuIHB0O1xuXHRcdFx0fVxuXHRcdFx0cHQubCsrO1xuXHRcdFx0cHQudHlwZSA9IHB0LnNldFJhdGlvID8gMiA6IDE7XG5cdFx0XHRwdFtcInhzXCIgKyBwdC5sXSA9IHNmeCB8fCBcIlwiO1xuXHRcdFx0aWYgKGwgPiAwKSB7XG5cdFx0XHRcdHB0LmRhdGFbXCJ4blwiICsgbF0gPSBzICsgYztcblx0XHRcdFx0cHQucnhwW1wieG5cIiArIGxdID0gcjsgLy9yb3VuZCBleHRyYSBwcm9wZXJ0eSAod2UgbmVlZCB0byB0YXAgaW50byB0aGlzIGluIHRoZSBfcGFyc2VUb1Byb3h5KCkgbWV0aG9kKVxuXHRcdFx0XHRwdFtcInhuXCIgKyBsXSA9IHM7XG5cdFx0XHRcdGlmICghcHQucGx1Z2luKSB7XG5cdFx0XHRcdFx0cHQueGZpcnN0ID0gbmV3IENTU1Byb3BUd2VlbihwdCwgXCJ4blwiICsgbCwgcywgYywgcHQueGZpcnN0IHx8IHB0LCAwLCBwdC5uLCByLCBwdC5wcik7XG5cdFx0XHRcdFx0cHQueGZpcnN0LnhzMCA9IDA7IC8vanVzdCB0byBlbnN1cmUgdGhhdCB0aGUgcHJvcGVydHkgc3RheXMgbnVtZXJpYyB3aGljaCBoZWxwcyBtb2Rlcm4gYnJvd3NlcnMgc3BlZWQgdXAgcHJvY2Vzc2luZy4gUmVtZW1iZXIsIGluIHRoZSBzZXRSYXRpbygpIG1ldGhvZCwgd2UgZG8gcHQudFtwdC5wXSA9IHZhbCArIHB0LnhzMCBzbyBpZiBwdC54czAgaXMgXCJcIiAodGhlIGRlZmF1bHQpLCBpdCdsbCBjYXN0IHRoZSBlbmQgdmFsdWUgYXMgYSBzdHJpbmcuIFdoZW4gYSBwcm9wZXJ0eSBpcyBhIG51bWJlciBzb21ldGltZXMgYW5kIGEgc3RyaW5nIHNvbWV0aW1lcywgaXQgcHJldmVudHMgdGhlIGNvbXBpbGVyIGZyb20gbG9ja2luZyBpbiB0aGUgZGF0YSB0eXBlLCBzbG93aW5nIHRoaW5ncyBkb3duIHNsaWdodGx5LlxuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiBwdDtcblx0XHRcdH1cblx0XHRcdHB0LmRhdGEgPSB7czpzICsgY307XG5cdFx0XHRwdC5yeHAgPSB7fTtcblx0XHRcdHB0LnMgPSBzO1xuXHRcdFx0cHQuYyA9IGM7XG5cdFx0XHRwdC5yID0gcjtcblx0XHRcdHJldHVybiBwdDtcblx0XHR9O1xuXG5cdFx0LyoqXG5cdFx0ICogQGNvbnN0cnVjdG9yIEEgU3BlY2lhbFByb3AgaXMgYmFzaWNhbGx5IGEgY3NzIHByb3BlcnR5IHRoYXQgbmVlZHMgdG8gYmUgdHJlYXRlZCBpbiBhIG5vbi1zdGFuZGFyZCB3YXksIGxpa2UgaWYgaXQgbWF5IGNvbnRhaW4gYSBjb21wbGV4IHZhbHVlIGxpa2UgYm94U2hhZG93OlwiNXB4IDEwcHggMTVweCByZ2IoMjU1LCAxMDIsIDUxKVwiIG9yIGlmIGl0IGlzIGFzc29jaWF0ZWQgd2l0aCBhbm90aGVyIHBsdWdpbiBsaWtlIFRocm93UHJvcHNQbHVnaW4gb3IgQmV6aWVyUGx1Z2luLiBFdmVyeSBTcGVjaWFsUHJvcCBpcyBhc3NvY2lhdGVkIHdpdGggYSBwYXJ0aWN1bGFyIHByb3BlcnR5IG5hbWUgbGlrZSBcImJveFNoYWRvd1wiIG9yIFwidGhyb3dQcm9wc1wiIG9yIFwiYmV6aWVyXCIgYW5kIGl0IHdpbGwgaW50ZXJjZXB0IHRob3NlIHZhbHVlcyBpbiB0aGUgdmFycyBvYmplY3QgdGhhdCdzIHBhc3NlZCB0byB0aGUgQ1NTUGx1Z2luIGFuZCBoYW5kbGUgdGhlbSBhY2NvcmRpbmdseS5cblx0XHQgKiBAcGFyYW0geyFzdHJpbmd9IHAgUHJvcGVydHkgbmFtZSAobGlrZSBcImJveFNoYWRvd1wiIG9yIFwidGhyb3dQcm9wc1wiKVxuXHRcdCAqIEBwYXJhbSB7T2JqZWN0PX0gb3B0aW9ucyBBbiBvYmplY3QgY29udGFpbmluZyBhbnkgb2YgdGhlIGZvbGxvd2luZyBjb25maWd1cmF0aW9uIG9wdGlvbnM6XG5cdFx0ICogICAgICAgICAgICAgICAgICAgICAgLSBkZWZhdWx0VmFsdWU6IHRoZSBkZWZhdWx0IHZhbHVlXG5cdFx0ICogICAgICAgICAgICAgICAgICAgICAgLSBwYXJzZXI6IEEgZnVuY3Rpb24gdGhhdCBzaG91bGQgYmUgY2FsbGVkIHdoZW4gdGhlIGFzc29jaWF0ZWQgcHJvcGVydHkgbmFtZSBpcyBmb3VuZCBpbiB0aGUgdmFycy4gVGhpcyBmdW5jdGlvbiBzaG91bGQgcmV0dXJuIGEgQ1NTUHJvcFR3ZWVuIGluc3RhbmNlIGFuZCBpdCBzaG91bGQgZW5zdXJlIHRoYXQgaXQgaXMgcHJvcGVybHkgaW5zZXJ0ZWQgaW50byB0aGUgbGlua2VkIGxpc3QuIEl0IHdpbGwgcmVjZWl2ZSA0IHBhcmFtdGVyczogMSkgVGhlIHRhcmdldCwgMikgVGhlIHZhbHVlIGRlZmluZWQgaW4gdGhlIHZhcnMsIDMpIFRoZSBDU1NQbHVnaW4gaW5zdGFuY2UgKHdob3NlIF9maXJzdFBUIHNob3VsZCBiZSB1c2VkIGZvciB0aGUgbGlua2VkIGxpc3QpLCBhbmQgNCkgQSBjb21wdXRlZCBzdHlsZSBvYmplY3QgaWYgb25lIHdhcyBjYWxjdWxhdGVkICh0aGlzIGlzIGEgc3BlZWQgb3B0aW1pemF0aW9uIHRoYXQgYWxsb3dzIHJldHJpZXZhbCBvZiBzdGFydGluZyB2YWx1ZXMgcXVpY2tlcilcblx0XHQgKiAgICAgICAgICAgICAgICAgICAgICAtIGZvcm1hdHRlcjogYSBmdW5jdGlvbiB0aGF0IGZvcm1hdHMgYW55IHZhbHVlIHJlY2VpdmVkIGZvciB0aGlzIHNwZWNpYWwgcHJvcGVydHkgKGZvciBleGFtcGxlLCBib3hTaGFkb3cgY291bGQgdGFrZSBcIjVweCA1cHggcmVkXCIgYW5kIGZvcm1hdCBpdCB0byBcIjVweCA1cHggMHB4IDBweCByZWRcIiBzbyB0aGF0IGJvdGggdGhlIGJlZ2lubmluZyBhbmQgZW5kaW5nIHZhbHVlcyBoYXZlIGEgY29tbW9uIG9yZGVyIGFuZCBxdWFudGl0eSBvZiB2YWx1ZXMuKVxuXHRcdCAqICAgICAgICAgICAgICAgICAgICAgIC0gcHJlZml4OiBpZiB0cnVlLCB3ZSdsbCBkZXRlcm1pbmUgd2hldGhlciBvciBub3QgdGhpcyBwcm9wZXJ0eSByZXF1aXJlcyBhIHZlbmRvciBwcmVmaXggKGxpa2UgV2Via2l0IG9yIE1veiBvciBtcyBvciBPKVxuXHRcdCAqICAgICAgICAgICAgICAgICAgICAgIC0gY29sb3I6IHNldCB0aGlzIHRvIHRydWUgaWYgdGhlIHZhbHVlIGZvciB0aGlzIFNwZWNpYWxQcm9wIG1heSBjb250YWluIGNvbG9yLXJlbGF0ZWQgdmFsdWVzIGxpa2UgcmdiKCksIHJnYmEoKSwgZXRjLlxuXHRcdCAqICAgICAgICAgICAgICAgICAgICAgIC0gcHJpb3JpdHk6IHByaW9yaXR5IGluIHRoZSBsaW5rZWQgbGlzdCBvcmRlci4gSGlnaGVyIHByaW9yaXR5IFNwZWNpYWxQcm9wcyB3aWxsIGJlIHVwZGF0ZWQgYmVmb3JlIGxvd2VyIHByaW9yaXR5IG9uZXMuIFRoZSBkZWZhdWx0IHByaW9yaXR5IGlzIDAuXG5cdFx0ICogICAgICAgICAgICAgICAgICAgICAgLSBtdWx0aTogaWYgdHJ1ZSwgdGhlIGZvcm1hdHRlciBzaG91bGQgYWNjb21tb2RhdGUgYSBjb21tYS1kZWxpbWl0ZWQgbGlzdCBvZiB2YWx1ZXMsIGxpa2UgYm94U2hhZG93IGNvdWxkIGhhdmUgbXVsdGlwbGUgYm94U2hhZG93cyBsaXN0ZWQgb3V0LlxuXHRcdCAqICAgICAgICAgICAgICAgICAgICAgIC0gY29sbGFwc2libGU6IGlmIHRydWUsIHRoZSBmb3JtYXR0ZXIgc2hvdWxkIHRyZWF0IHRoZSB2YWx1ZSBsaWtlIGl0J3MgYSB0b3AvcmlnaHQvYm90dG9tL2xlZnQgdmFsdWUgdGhhdCBjb3VsZCBiZSBjb2xsYXBzZWQsIGxpa2UgXCI1cHhcIiB3b3VsZCBhcHBseSB0byBhbGwsIFwiNXB4LCAxMHB4XCIgd291bGQgdXNlIDVweCBmb3IgdG9wL2JvdHRvbSBhbmQgMTBweCBmb3IgcmlnaHQvbGVmdCwgZXRjLlxuXHRcdCAqICAgICAgICAgICAgICAgICAgICAgIC0ga2V5d29yZDogYSBzcGVjaWFsIGtleXdvcmQgdGhhdCBjYW4gW29wdGlvbmFsbHldIGJlIGZvdW5kIGluc2lkZSB0aGUgdmFsdWUgKGxpa2UgXCJpbnNldFwiIGZvciBib3hTaGFkb3cpLiBUaGlzIGFsbG93cyB1cyB0byB2YWxpZGF0ZSBiZWdpbm5pbmcvZW5kaW5nIHZhbHVlcyB0byBtYWtlIHN1cmUgdGhleSBtYXRjaCAoaWYgdGhlIGtleXdvcmQgaXMgZm91bmQgaW4gb25lLCBpdCdsbCBiZSBhZGRlZCB0byB0aGUgb3RoZXIgZm9yIGNvbnNpc3RlbmN5IGJ5IGRlZmF1bHQpLlxuXHRcdCAqL1xuXHRcdHZhciBTcGVjaWFsUHJvcCA9IGZ1bmN0aW9uKHAsIG9wdGlvbnMpIHtcblx0XHRcdFx0b3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG5cdFx0XHRcdHRoaXMucCA9IG9wdGlvbnMucHJlZml4ID8gX2NoZWNrUHJvcFByZWZpeChwKSB8fCBwIDogcDtcblx0XHRcdFx0X3NwZWNpYWxQcm9wc1twXSA9IF9zcGVjaWFsUHJvcHNbdGhpcy5wXSA9IHRoaXM7XG5cdFx0XHRcdHRoaXMuZm9ybWF0ID0gb3B0aW9ucy5mb3JtYXR0ZXIgfHwgX2dldEZvcm1hdHRlcihvcHRpb25zLmRlZmF1bHRWYWx1ZSwgb3B0aW9ucy5jb2xvciwgb3B0aW9ucy5jb2xsYXBzaWJsZSwgb3B0aW9ucy5tdWx0aSk7XG5cdFx0XHRcdGlmIChvcHRpb25zLnBhcnNlcikge1xuXHRcdFx0XHRcdHRoaXMucGFyc2UgPSBvcHRpb25zLnBhcnNlcjtcblx0XHRcdFx0fVxuXHRcdFx0XHR0aGlzLmNscnMgPSBvcHRpb25zLmNvbG9yO1xuXHRcdFx0XHR0aGlzLm11bHRpID0gb3B0aW9ucy5tdWx0aTtcblx0XHRcdFx0dGhpcy5rZXl3b3JkID0gb3B0aW9ucy5rZXl3b3JkO1xuXHRcdFx0XHR0aGlzLmRmbHQgPSBvcHRpb25zLmRlZmF1bHRWYWx1ZTtcblx0XHRcdFx0dGhpcy5wciA9IG9wdGlvbnMucHJpb3JpdHkgfHwgMDtcblx0XHRcdH0sXG5cblx0XHRcdC8vc2hvcnRjdXQgZm9yIGNyZWF0aW5nIGEgbmV3IFNwZWNpYWxQcm9wIHRoYXQgY2FuIGFjY2VwdCBtdWx0aXBsZSBwcm9wZXJ0aWVzIGFzIGEgY29tbWEtZGVsaW1pdGVkIGxpc3QgKGhlbHBzIG1pbmlmaWNhdGlvbikuIGRmbHQgY2FuIGJlIGFuIGFycmF5IGZvciBtdWx0aXBsZSB2YWx1ZXMgKHdlIGRvbid0IGRvIGEgY29tbWEtZGVsaW1pdGVkIGxpc3QgYmVjYXVzZSB0aGUgZGVmYXVsdCB2YWx1ZSBtYXkgY29udGFpbiBjb21tYXMsIGxpa2UgcmVjdCgwcHgsMHB4LDBweCwwcHgpKS4gV2UgYXR0YWNoIHRoaXMgbWV0aG9kIHRvIHRoZSBTcGVjaWFsUHJvcCBjbGFzcy9vYmplY3QgaW5zdGVhZCBvZiB1c2luZyBhIHByaXZhdGUgX2NyZWF0ZVNwZWNpYWxQcm9wKCkgbWV0aG9kIHNvIHRoYXQgd2UgY2FuIHRhcCBpbnRvIGl0IGV4dGVybmFsbHkgaWYgbmVjZXNzYXJ5LCBsaWtlIGZyb20gYW5vdGhlciBwbHVnaW4uXG5cdFx0XHRfcmVnaXN0ZXJDb21wbGV4U3BlY2lhbFByb3AgPSBfaW50ZXJuYWxzLl9yZWdpc3RlckNvbXBsZXhTcGVjaWFsUHJvcCA9IGZ1bmN0aW9uKHAsIG9wdGlvbnMsIGRlZmF1bHRzKSB7XG5cdFx0XHRcdGlmICh0eXBlb2Yob3B0aW9ucykgIT09IFwib2JqZWN0XCIpIHtcblx0XHRcdFx0XHRvcHRpb25zID0ge3BhcnNlcjpkZWZhdWx0c307IC8vdG8gbWFrZSBiYWNrd2FyZHMgY29tcGF0aWJsZSB3aXRoIG9sZGVyIHZlcnNpb25zIG9mIEJlemllclBsdWdpbiBhbmQgVGhyb3dQcm9wc1BsdWdpblxuXHRcdFx0XHR9XG5cdFx0XHRcdHZhciBhID0gcC5zcGxpdChcIixcIiksXG5cdFx0XHRcdFx0ZCA9IG9wdGlvbnMuZGVmYXVsdFZhbHVlLFxuXHRcdFx0XHRcdGksIHRlbXA7XG5cdFx0XHRcdGRlZmF1bHRzID0gZGVmYXVsdHMgfHwgW2RdO1xuXHRcdFx0XHRmb3IgKGkgPSAwOyBpIDwgYS5sZW5ndGg7IGkrKykge1xuXHRcdFx0XHRcdG9wdGlvbnMucHJlZml4ID0gKGkgPT09IDAgJiYgb3B0aW9ucy5wcmVmaXgpO1xuXHRcdFx0XHRcdG9wdGlvbnMuZGVmYXVsdFZhbHVlID0gZGVmYXVsdHNbaV0gfHwgZDtcblx0XHRcdFx0XHR0ZW1wID0gbmV3IFNwZWNpYWxQcm9wKGFbaV0sIG9wdGlvbnMpO1xuXHRcdFx0XHR9XG5cdFx0XHR9LFxuXG5cdFx0XHQvL2NyZWF0ZXMgYSBwbGFjZWhvbGRlciBzcGVjaWFsIHByb3AgZm9yIGEgcGx1Z2luIHNvIHRoYXQgdGhlIHByb3BlcnR5IGdldHMgY2F1Z2h0IHRoZSBmaXJzdCB0aW1lIGEgdHdlZW4gb2YgaXQgaXMgYXR0ZW1wdGVkLCBhbmQgYXQgdGhhdCB0aW1lIGl0IG1ha2VzIHRoZSBwbHVnaW4gcmVnaXN0ZXIgaXRzZWxmLCB0aHVzIHRha2luZyBvdmVyIGZvciBhbGwgZnV0dXJlIHR3ZWVucyBvZiB0aGF0IHByb3BlcnR5LiBUaGlzIGFsbG93cyB1cyB0byBub3QgbWFuZGF0ZSB0aGF0IHRoaW5ncyBsb2FkIGluIGEgcGFydGljdWxhciBvcmRlciBhbmQgaXQgYWxzbyBhbGxvd3MgdXMgdG8gbG9nKCkgYW4gZXJyb3IgdGhhdCBpbmZvcm1zIHRoZSB1c2VyIHdoZW4gdGhleSBhdHRlbXB0IHRvIHR3ZWVuIGFuIGV4dGVybmFsIHBsdWdpbi1yZWxhdGVkIHByb3BlcnR5IHdpdGhvdXQgbG9hZGluZyBpdHMgLmpzIGZpbGUuXG5cdFx0XHRfcmVnaXN0ZXJQbHVnaW5Qcm9wID0gX2ludGVybmFscy5fcmVnaXN0ZXJQbHVnaW5Qcm9wID0gZnVuY3Rpb24ocCkge1xuXHRcdFx0XHRpZiAoIV9zcGVjaWFsUHJvcHNbcF0pIHtcblx0XHRcdFx0XHR2YXIgcGx1Z2luTmFtZSA9IHAuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyBwLnN1YnN0cigxKSArIFwiUGx1Z2luXCI7XG5cdFx0XHRcdFx0X3JlZ2lzdGVyQ29tcGxleFNwZWNpYWxQcm9wKHAsIHtwYXJzZXI6ZnVuY3Rpb24odCwgZSwgcCwgY3NzcCwgcHQsIHBsdWdpbiwgdmFycykge1xuXHRcdFx0XHRcdFx0dmFyIHBsdWdpbkNsYXNzID0gX2dsb2JhbHMuY29tLmdyZWVuc29jay5wbHVnaW5zW3BsdWdpbk5hbWVdO1xuXHRcdFx0XHRcdFx0aWYgKCFwbHVnaW5DbGFzcykge1xuXHRcdFx0XHRcdFx0XHRfbG9nKFwiRXJyb3I6IFwiICsgcGx1Z2luTmFtZSArIFwiIGpzIGZpbGUgbm90IGxvYWRlZC5cIik7XG5cdFx0XHRcdFx0XHRcdHJldHVybiBwdDtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdHBsdWdpbkNsYXNzLl9jc3NSZWdpc3RlcigpO1xuXHRcdFx0XHRcdFx0cmV0dXJuIF9zcGVjaWFsUHJvcHNbcF0ucGFyc2UodCwgZSwgcCwgY3NzcCwgcHQsIHBsdWdpbiwgdmFycyk7XG5cdFx0XHRcdFx0fX0pO1xuXHRcdFx0XHR9XG5cdFx0XHR9O1xuXG5cblx0XHRwID0gU3BlY2lhbFByb3AucHJvdG90eXBlO1xuXG5cdFx0LyoqXG5cdFx0ICogQWxpYXMgZm9yIF9wYXJzZUNvbXBsZXgoKSB0aGF0IGF1dG9tYXRpY2FsbHkgcGx1Z3MgaW4gY2VydGFpbiB2YWx1ZXMgZm9yIHRoaXMgU3BlY2lhbFByb3AsIGxpa2UgaXRzIHByb3BlcnR5IG5hbWUsIHdoZXRoZXIgb3Igbm90IGNvbG9ycyBzaG91bGQgYmUgc2Vuc2VkLCB0aGUgZGVmYXVsdCB2YWx1ZSwgYW5kIHByaW9yaXR5LiBJdCBhbHNvIGxvb2tzIGZvciBhbnkga2V5d29yZCB0aGF0IHRoZSBTcGVjaWFsUHJvcCBkZWZpbmVzIChsaWtlIFwiaW5zZXRcIiBmb3IgYm94U2hhZG93KSBhbmQgZW5zdXJlcyB0aGF0IHRoZSBiZWdpbm5pbmcgYW5kIGVuZGluZyB2YWx1ZXMgaGF2ZSB0aGUgc2FtZSBudW1iZXIgb2YgdmFsdWVzIGZvciBTcGVjaWFsUHJvcHMgd2hlcmUgbXVsdGkgaXMgdHJ1ZSAobGlrZSBib3hTaGFkb3cgYW5kIHRleHRTaGFkb3cgY2FuIGhhdmUgYSBjb21tYS1kZWxpbWl0ZWQgbGlzdClcblx0XHQgKiBAcGFyYW0geyFPYmplY3R9IHQgdGFyZ2V0IGVsZW1lbnRcblx0XHQgKiBAcGFyYW0geyhzdHJpbmd8bnVtYmVyfG9iamVjdCl9IGIgYmVnaW5uaW5nIHZhbHVlXG5cdFx0ICogQHBhcmFtIHsoc3RyaW5nfG51bWJlcnxvYmplY3QpfSBlIGVuZGluZyAoZGVzdGluYXRpb24pIHZhbHVlXG5cdFx0ICogQHBhcmFtIHtDU1NQcm9wVHdlZW49fSBwdCBuZXh0IENTU1Byb3BUd2VlbiBpbiB0aGUgbGlua2VkIGxpc3Rcblx0XHQgKiBAcGFyYW0ge1R3ZWVuUGx1Z2luPX0gcGx1Z2luIElmIGFub3RoZXIgcGx1Z2luIHdpbGwgYmUgdHdlZW5pbmcgdGhlIGNvbXBsZXggdmFsdWUsIHRoYXQgVHdlZW5QbHVnaW4gaW5zdGFuY2UgZ29lcyBoZXJlLlxuXHRcdCAqIEBwYXJhbSB7ZnVuY3Rpb249fSBzZXRSYXRpbyBJZiBhIGN1c3RvbSBzZXRSYXRpbygpIG1ldGhvZCBzaG91bGQgYmUgdXNlZCB0byBoYW5kbGUgdGhpcyBjb21wbGV4IHZhbHVlLCB0aGF0IGdvZXMgaGVyZS5cblx0XHQgKiBAcmV0dXJuIHtDU1NQcm9wVHdlZW49fSBGaXJzdCBDU1NQcm9wVHdlZW4gaW4gdGhlIGxpbmtlZCBsaXN0XG5cdFx0ICovXG5cdFx0cC5wYXJzZUNvbXBsZXggPSBmdW5jdGlvbih0LCBiLCBlLCBwdCwgcGx1Z2luLCBzZXRSYXRpbykge1xuXHRcdFx0dmFyIGt3ZCA9IHRoaXMua2V5d29yZCxcblx0XHRcdFx0aSwgYmEsIGVhLCBsLCBiaSwgZWk7XG5cdFx0XHQvL2lmIHRoaXMgU3BlY2lhbFByb3AncyB2YWx1ZSBjYW4gY29udGFpbiBhIGNvbW1hLWRlbGltaXRlZCBsaXN0IG9mIHZhbHVlcyAobGlrZSBib3hTaGFkb3cgb3IgdGV4dFNoYWRvdyksIHdlIG11c3QgcGFyc2UgdGhlbSBpbiBhIHNwZWNpYWwgd2F5LCBhbmQgbG9vayBmb3IgYSBrZXl3b3JkIChsaWtlIFwiaW5zZXRcIiBmb3IgYm94U2hhZG93KSBhbmQgZW5zdXJlIHRoYXQgdGhlIGJlZ2lubmluZyBhbmQgZW5kaW5nIEJPVEggaGF2ZSBpdCBpZiB0aGUgZW5kIGRlZmluZXMgaXQgYXMgc3VjaC4gV2UgYWxzbyBtdXN0IGVuc3VyZSB0aGF0IHRoZXJlIGFyZSBhbiBlcXVhbCBudW1iZXIgb2YgdmFsdWVzIHNwZWNpZmllZCAod2UgY2FuJ3QgdHdlZW4gMSBib3hTaGFkb3cgdG8gMyBmb3IgZXhhbXBsZSlcblx0XHRcdGlmICh0aGlzLm11bHRpKSBpZiAoX2NvbW1hc091dHNpZGVQYXJlbkV4cC50ZXN0KGUpIHx8IF9jb21tYXNPdXRzaWRlUGFyZW5FeHAudGVzdChiKSkge1xuXHRcdFx0XHRiYSA9IGIucmVwbGFjZShfY29tbWFzT3V0c2lkZVBhcmVuRXhwLCBcInxcIikuc3BsaXQoXCJ8XCIpO1xuXHRcdFx0XHRlYSA9IGUucmVwbGFjZShfY29tbWFzT3V0c2lkZVBhcmVuRXhwLCBcInxcIikuc3BsaXQoXCJ8XCIpO1xuXHRcdFx0fSBlbHNlIGlmIChrd2QpIHtcblx0XHRcdFx0YmEgPSBbYl07XG5cdFx0XHRcdGVhID0gW2VdO1xuXHRcdFx0fVxuXHRcdFx0aWYgKGVhKSB7XG5cdFx0XHRcdGwgPSAoZWEubGVuZ3RoID4gYmEubGVuZ3RoKSA/IGVhLmxlbmd0aCA6IGJhLmxlbmd0aDtcblx0XHRcdFx0Zm9yIChpID0gMDsgaSA8IGw7IGkrKykge1xuXHRcdFx0XHRcdGIgPSBiYVtpXSA9IGJhW2ldIHx8IHRoaXMuZGZsdDtcblx0XHRcdFx0XHRlID0gZWFbaV0gPSBlYVtpXSB8fCB0aGlzLmRmbHQ7XG5cdFx0XHRcdFx0aWYgKGt3ZCkge1xuXHRcdFx0XHRcdFx0YmkgPSBiLmluZGV4T2Yoa3dkKTtcblx0XHRcdFx0XHRcdGVpID0gZS5pbmRleE9mKGt3ZCk7XG5cdFx0XHRcdFx0XHRpZiAoYmkgIT09IGVpKSB7XG5cdFx0XHRcdFx0XHRcdGlmIChlaSA9PT0gLTEpIHsgLy9pZiB0aGUga2V5d29yZCBpc24ndCBpbiB0aGUgZW5kIHZhbHVlLCByZW1vdmUgaXQgZnJvbSB0aGUgYmVnaW5uaW5nIG9uZS5cblx0XHRcdFx0XHRcdFx0XHRiYVtpXSA9IGJhW2ldLnNwbGl0KGt3ZCkuam9pbihcIlwiKTtcblx0XHRcdFx0XHRcdFx0fSBlbHNlIGlmIChiaSA9PT0gLTEpIHsgLy9pZiB0aGUga2V5d29yZCBpc24ndCBpbiB0aGUgYmVnaW5uaW5nLCBhZGQgaXQuXG5cdFx0XHRcdFx0XHRcdFx0YmFbaV0gKz0gXCIgXCIgKyBrd2Q7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0YiA9IGJhLmpvaW4oXCIsIFwiKTtcblx0XHRcdFx0ZSA9IGVhLmpvaW4oXCIsIFwiKTtcblx0XHRcdH1cblx0XHRcdHJldHVybiBfcGFyc2VDb21wbGV4KHQsIHRoaXMucCwgYiwgZSwgdGhpcy5jbHJzLCB0aGlzLmRmbHQsIHB0LCB0aGlzLnByLCBwbHVnaW4sIHNldFJhdGlvKTtcblx0XHR9O1xuXG5cdFx0LyoqXG5cdFx0ICogQWNjZXB0cyBhIHRhcmdldCBhbmQgZW5kIHZhbHVlIGFuZCBzcGl0cyBiYWNrIGEgQ1NTUHJvcFR3ZWVuIHRoYXQgaGFzIGJlZW4gaW5zZXJ0ZWQgaW50byB0aGUgQ1NTUGx1Z2luJ3MgbGlua2VkIGxpc3QgYW5kIGNvbmZvcm1zIHdpdGggYWxsIHRoZSBjb252ZW50aW9ucyB3ZSB1c2UgaW50ZXJuYWxseSwgbGlrZSB0eXBlOi0xLCAwLCAxLCBvciAyLCBzZXR0aW5nIHVwIGFueSBleHRyYSBwcm9wZXJ0eSB0d2VlbnMsIHByaW9yaXR5LCBldGMuIEZvciBleGFtcGxlLCBpZiB3ZSBoYXZlIGEgYm94U2hhZG93IFNwZWNpYWxQcm9wIGFuZCBjYWxsOlxuXHRcdCAqIHRoaXMuX2ZpcnN0UFQgPSBzcC5wYXJzZShlbGVtZW50LCBcIjVweCAxMHB4IDIwcHggcmdiKDI1NTAsMTAyLDUxKVwiLCBcImJveFNoYWRvd1wiLCB0aGlzKTtcblx0XHQgKiBJdCBzaG91bGQgZmlndXJlIG91dCB0aGUgc3RhcnRpbmcgdmFsdWUgb2YgdGhlIGVsZW1lbnQncyBib3hTaGFkb3csIGNvbXBhcmUgaXQgdG8gdGhlIHByb3ZpZGVkIGVuZCB2YWx1ZSBhbmQgY3JlYXRlIGFsbCB0aGUgbmVjZXNzYXJ5IENTU1Byb3BUd2VlbnMgb2YgdGhlIGFwcHJvcHJpYXRlIHR5cGVzIHRvIHR3ZWVuIHRoZSBib3hTaGFkb3cuIFRoZSBDU1NQcm9wVHdlZW4gdGhhdCBnZXRzIHNwaXQgYmFjayBzaG91bGQgYWxyZWFkeSBiZSBpbnNlcnRlZCBpbnRvIHRoZSBsaW5rZWQgbGlzdCAodGhlIDR0aCBwYXJhbWV0ZXIgaXMgdGhlIGN1cnJlbnQgaGVhZCwgc28gcHJlcGVuZCB0byB0aGF0KS5cblx0XHQgKiBAcGFyYW0geyFPYmplY3R9IHQgVGFyZ2V0IG9iamVjdCB3aG9zZSBwcm9wZXJ0eSBpcyBiZWluZyB0d2VlbmVkXG5cdFx0ICogQHBhcmFtIHtPYmplY3R9IGUgRW5kIHZhbHVlIGFzIHByb3ZpZGVkIGluIHRoZSB2YXJzIG9iamVjdCAodHlwaWNhbGx5IGEgc3RyaW5nLCBidXQgbm90IGFsd2F5cyAtIGxpa2UgYSB0aHJvd1Byb3BzIHdvdWxkIGJlIGFuIG9iamVjdCkuXG5cdFx0ICogQHBhcmFtIHshc3RyaW5nfSBwIFByb3BlcnR5IG5hbWVcblx0XHQgKiBAcGFyYW0geyFDU1NQbHVnaW59IGNzc3AgVGhlIENTU1BsdWdpbiBpbnN0YW5jZSB0aGF0IHNob3VsZCBiZSBhc3NvY2lhdGVkIHdpdGggdGhpcyB0d2Vlbi5cblx0XHQgKiBAcGFyYW0gez9DU1NQcm9wVHdlZW59IHB0IFRoZSBDU1NQcm9wVHdlZW4gdGhhdCBpcyB0aGUgY3VycmVudCBoZWFkIG9mIHRoZSBsaW5rZWQgbGlzdCAod2UnbGwgcHJlcGVuZCB0byBpdClcblx0XHQgKiBAcGFyYW0ge1R3ZWVuUGx1Z2luPX0gcGx1Z2luIElmIGEgcGx1Z2luIHdpbGwgYmUgdXNlZCB0byB0d2VlbiB0aGUgcGFyc2VkIHZhbHVlLCB0aGlzIGlzIHRoZSBwbHVnaW4gaW5zdGFuY2UuXG5cdFx0ICogQHBhcmFtIHtPYmplY3Q9fSB2YXJzIE9yaWdpbmFsIHZhcnMgb2JqZWN0IHRoYXQgY29udGFpbnMgdGhlIGRhdGEgZm9yIHBhcnNpbmcuXG5cdFx0ICogQHJldHVybiB7Q1NTUHJvcFR3ZWVufSBUaGUgZmlyc3QgQ1NTUHJvcFR3ZWVuIGluIHRoZSBsaW5rZWQgbGlzdCB3aGljaCBpbmNsdWRlcyB0aGUgbmV3IG9uZShzKSBhZGRlZCBieSB0aGUgcGFyc2UoKSBjYWxsLlxuXHRcdCAqL1xuXHRcdHAucGFyc2UgPSBmdW5jdGlvbih0LCBlLCBwLCBjc3NwLCBwdCwgcGx1Z2luLCB2YXJzKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5wYXJzZUNvbXBsZXgodC5zdHlsZSwgdGhpcy5mb3JtYXQoX2dldFN0eWxlKHQsIHRoaXMucCwgX2NzLCBmYWxzZSwgdGhpcy5kZmx0KSksIHRoaXMuZm9ybWF0KGUpLCBwdCwgcGx1Z2luKTtcblx0XHR9O1xuXG5cdFx0LyoqXG5cdFx0ICogUmVnaXN0ZXJzIGEgc3BlY2lhbCBwcm9wZXJ0eSB0aGF0IHNob3VsZCBiZSBpbnRlcmNlcHRlZCBmcm9tIGFueSBcImNzc1wiIG9iamVjdHMgZGVmaW5lZCBpbiB0d2VlbnMuIFRoaXMgYWxsb3dzIHlvdSB0byBoYW5kbGUgdGhlbSBob3dldmVyIHlvdSB3YW50IHdpdGhvdXQgQ1NTUGx1Z2luIGRvaW5nIGl0IGZvciB5b3UuIFRoZSAybmQgcGFyYW1ldGVyIHNob3VsZCBiZSBhIGZ1bmN0aW9uIHRoYXQgYWNjZXB0cyAzIHBhcmFtZXRlcnM6XG5cdFx0ICogIDEpIFRhcmdldCBvYmplY3Qgd2hvc2UgcHJvcGVydHkgc2hvdWxkIGJlIHR3ZWVuZWQgKHR5cGljYWxseSBhIERPTSBlbGVtZW50KVxuXHRcdCAqICAyKSBUaGUgZW5kL2Rlc3RpbmF0aW9uIHZhbHVlIChjb3VsZCBiZSBhIHN0cmluZywgbnVtYmVyLCBvYmplY3QsIG9yIHdoYXRldmVyIHlvdSB3YW50KVxuXHRcdCAqICAzKSBUaGUgdHdlZW4gaW5zdGFuY2UgKHlvdSBwcm9iYWJseSBkb24ndCBuZWVkIHRvIHdvcnJ5IGFib3V0IHRoaXMsIGJ1dCBpdCBjYW4gYmUgdXNlZnVsIGZvciBsb29raW5nIHVwIGluZm9ybWF0aW9uIGxpa2UgdGhlIGR1cmF0aW9uKVxuXHRcdCAqXG5cdFx0ICogVGhlbiwgeW91ciBmdW5jdGlvbiBzaG91bGQgcmV0dXJuIGEgZnVuY3Rpb24gd2hpY2ggd2lsbCBiZSBjYWxsZWQgZWFjaCB0aW1lIHRoZSB0d2VlbiBnZXRzIHJlbmRlcmVkLCBwYXNzaW5nIGEgbnVtZXJpYyBcInJhdGlvXCIgcGFyYW1ldGVyIHRvIHlvdXIgZnVuY3Rpb24gdGhhdCBpbmRpY2F0ZXMgdGhlIGNoYW5nZSBmYWN0b3IgKHVzdWFsbHkgYmV0d2VlbiAwIGFuZCAxKS4gRm9yIGV4YW1wbGU6XG5cdFx0ICpcblx0XHQgKiBDU1NQbHVnaW4ucmVnaXN0ZXJTcGVjaWFsUHJvcChcIm15Q3VzdG9tUHJvcFwiLCBmdW5jdGlvbih0YXJnZXQsIHZhbHVlLCB0d2Vlbikge1xuXHRcdCAqICAgICAgdmFyIHN0YXJ0ID0gdGFyZ2V0LnN0eWxlLndpZHRoO1xuXHRcdCAqICAgICAgcmV0dXJuIGZ1bmN0aW9uKHJhdGlvKSB7XG5cdFx0ICogICAgICAgICAgICAgIHRhcmdldC5zdHlsZS53aWR0aCA9IChzdGFydCArIHZhbHVlICogcmF0aW8pICsgXCJweFwiO1xuXHRcdCAqICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcInNldCB3aWR0aCB0byBcIiArIHRhcmdldC5zdHlsZS53aWR0aCk7XG5cdFx0ICogICAgICAgICAgfVxuXHRcdCAqIH0sIDApO1xuXHRcdCAqXG5cdFx0ICogVGhlbiwgd2hlbiBJIGRvIHRoaXMgdHdlZW4sIGl0IHdpbGwgdHJpZ2dlciBteSBzcGVjaWFsIHByb3BlcnR5OlxuXHRcdCAqXG5cdFx0ICogVHdlZW5MaXRlLnRvKGVsZW1lbnQsIDEsIHtjc3M6e215Q3VzdG9tUHJvcDoxMDB9fSk7XG5cdFx0ICpcblx0XHQgKiBJbiB0aGUgZXhhbXBsZSwgb2YgY291cnNlLCB3ZSdyZSBqdXN0IGNoYW5naW5nIHRoZSB3aWR0aCwgYnV0IHlvdSBjYW4gZG8gYW55dGhpbmcgeW91IHdhbnQuXG5cdFx0ICpcblx0XHQgKiBAcGFyYW0geyFzdHJpbmd9IG5hbWUgUHJvcGVydHkgbmFtZSAob3IgY29tbWEtZGVsaW1pdGVkIGxpc3Qgb2YgcHJvcGVydHkgbmFtZXMpIHRoYXQgc2hvdWxkIGJlIGludGVyY2VwdGVkIGFuZCBoYW5kbGVkIGJ5IHlvdXIgZnVuY3Rpb24uIEZvciBleGFtcGxlLCBpZiBJIGRlZmluZSBcIm15Q3VzdG9tUHJvcFwiLCB0aGVuIGl0IHdvdWxkIGhhbmRsZSB0aGF0IHBvcnRpb24gb2YgdGhlIGZvbGxvd2luZyB0d2VlbjogVHdlZW5MaXRlLnRvKGVsZW1lbnQsIDEsIHtjc3M6e215Q3VzdG9tUHJvcDoxMDB9fSlcblx0XHQgKiBAcGFyYW0geyFmdW5jdGlvbihPYmplY3QsIE9iamVjdCwgT2JqZWN0LCBzdHJpbmcpOmZ1bmN0aW9uKG51bWJlcil9IG9uSW5pdFR3ZWVuIFRoZSBmdW5jdGlvbiB0aGF0IHdpbGwgYmUgY2FsbGVkIHdoZW4gYSB0d2VlbiBvZiB0aGlzIHNwZWNpYWwgcHJvcGVydHkgaXMgcGVyZm9ybWVkLiBUaGUgZnVuY3Rpb24gd2lsbCByZWNlaXZlIDQgcGFyYW1ldGVyczogMSkgVGFyZ2V0IG9iamVjdCB0aGF0IHNob3VsZCBiZSB0d2VlbmVkLCAyKSBWYWx1ZSB0aGF0IHdhcyBwYXNzZWQgdG8gdGhlIHR3ZWVuLCAzKSBUaGUgdHdlZW4gaW5zdGFuY2UgaXRzZWxmIChyYXJlbHkgdXNlZCksIGFuZCA0KSBUaGUgcHJvcGVydHkgbmFtZSB0aGF0J3MgYmVpbmcgdHdlZW5lZC4gWW91ciBmdW5jdGlvbiBzaG91bGQgcmV0dXJuIGEgZnVuY3Rpb24gdGhhdCBzaG91bGQgYmUgY2FsbGVkIG9uIGV2ZXJ5IHVwZGF0ZSBvZiB0aGUgdHdlZW4uIFRoYXQgZnVuY3Rpb24gd2lsbCByZWNlaXZlIGEgc2luZ2xlIHBhcmFtZXRlciB0aGF0IGlzIGEgXCJjaGFuZ2UgZmFjdG9yXCIgdmFsdWUgKHR5cGljYWxseSBiZXR3ZWVuIDAgYW5kIDEpIGluZGljYXRpbmcgdGhlIGFtb3VudCBvZiBjaGFuZ2UgYXMgYSByYXRpby4gWW91IGNhbiB1c2UgdGhpcyB0byBkZXRlcm1pbmUgaG93IHRvIHNldCB0aGUgdmFsdWVzIGFwcHJvcHJpYXRlbHkgaW4geW91ciBmdW5jdGlvbi5cblx0XHQgKiBAcGFyYW0ge251bWJlcj19IHByaW9yaXR5IFByaW9yaXR5IHRoYXQgaGVscHMgdGhlIGVuZ2luZSBkZXRlcm1pbmUgdGhlIG9yZGVyIGluIHdoaWNoIHRvIHNldCB0aGUgcHJvcGVydGllcyAoZGVmYXVsdDogMCkuIEhpZ2hlciBwcmlvcml0eSBwcm9wZXJ0aWVzIHdpbGwgYmUgdXBkYXRlZCBiZWZvcmUgbG93ZXIgcHJpb3JpdHkgb25lcy5cblx0XHQgKi9cblx0XHRDU1NQbHVnaW4ucmVnaXN0ZXJTcGVjaWFsUHJvcCA9IGZ1bmN0aW9uKG5hbWUsIG9uSW5pdFR3ZWVuLCBwcmlvcml0eSkge1xuXHRcdFx0X3JlZ2lzdGVyQ29tcGxleFNwZWNpYWxQcm9wKG5hbWUsIHtwYXJzZXI6ZnVuY3Rpb24odCwgZSwgcCwgY3NzcCwgcHQsIHBsdWdpbiwgdmFycykge1xuXHRcdFx0XHR2YXIgcnYgPSBuZXcgQ1NTUHJvcFR3ZWVuKHQsIHAsIDAsIDAsIHB0LCAyLCBwLCBmYWxzZSwgcHJpb3JpdHkpO1xuXHRcdFx0XHRydi5wbHVnaW4gPSBwbHVnaW47XG5cdFx0XHRcdHJ2LnNldFJhdGlvID0gb25Jbml0VHdlZW4odCwgZSwgY3NzcC5fdHdlZW4sIHApO1xuXHRcdFx0XHRyZXR1cm4gcnY7XG5cdFx0XHR9LCBwcmlvcml0eTpwcmlvcml0eX0pO1xuXHRcdH07XG5cblxuXG5cblxuXG5cdFx0Ly90cmFuc2Zvcm0tcmVsYXRlZCBtZXRob2RzIGFuZCBwcm9wZXJ0aWVzXG5cdFx0Q1NTUGx1Z2luLnVzZVNWR1RyYW5zZm9ybUF0dHIgPSB0cnVlOyAvL1NhZmFyaSBhbmQgRmlyZWZveCBib3RoIGhhdmUgc29tZSByZW5kZXJpbmcgYnVncyB3aGVuIGFwcGx5aW5nIENTUyB0cmFuc2Zvcm1zIHRvIFNWRyBlbGVtZW50cywgc28gZGVmYXVsdCB0byB1c2luZyB0aGUgXCJ0cmFuc2Zvcm1cIiBhdHRyaWJ1dGUgaW5zdGVhZCAodXNlcnMgY2FuIG92ZXJyaWRlIHRoaXMpLlxuXHRcdHZhciBfdHJhbnNmb3JtUHJvcHMgPSAoXCJzY2FsZVgsc2NhbGVZLHNjYWxlWix4LHkseixza2V3WCxza2V3WSxyb3RhdGlvbixyb3RhdGlvblgscm90YXRpb25ZLHBlcnNwZWN0aXZlLHhQZXJjZW50LHlQZXJjZW50XCIpLnNwbGl0KFwiLFwiKSxcblx0XHRcdF90cmFuc2Zvcm1Qcm9wID0gX2NoZWNrUHJvcFByZWZpeChcInRyYW5zZm9ybVwiKSwgLy90aGUgSmF2YXNjcmlwdCAoY2FtZWxDYXNlKSB0cmFuc2Zvcm0gcHJvcGVydHksIGxpa2UgbXNUcmFuc2Zvcm0sIFdlYmtpdFRyYW5zZm9ybSwgTW96VHJhbnNmb3JtLCBvciBPVHJhbnNmb3JtLlxuXHRcdFx0X3RyYW5zZm9ybVByb3BDU1MgPSBfcHJlZml4Q1NTICsgXCJ0cmFuc2Zvcm1cIixcblx0XHRcdF90cmFuc2Zvcm1PcmlnaW5Qcm9wID0gX2NoZWNrUHJvcFByZWZpeChcInRyYW5zZm9ybU9yaWdpblwiKSxcblx0XHRcdF9zdXBwb3J0czNEID0gKF9jaGVja1Byb3BQcmVmaXgoXCJwZXJzcGVjdGl2ZVwiKSAhPT0gbnVsbCksXG5cdFx0XHRUcmFuc2Zvcm0gPSBfaW50ZXJuYWxzLlRyYW5zZm9ybSA9IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHR0aGlzLnBlcnNwZWN0aXZlID0gcGFyc2VGbG9hdChDU1NQbHVnaW4uZGVmYXVsdFRyYW5zZm9ybVBlcnNwZWN0aXZlKSB8fCAwO1xuXHRcdFx0XHR0aGlzLmZvcmNlM0QgPSAoQ1NTUGx1Z2luLmRlZmF1bHRGb3JjZTNEID09PSBmYWxzZSB8fCAhX3N1cHBvcnRzM0QpID8gZmFsc2UgOiBDU1NQbHVnaW4uZGVmYXVsdEZvcmNlM0QgfHwgXCJhdXRvXCI7XG5cdFx0XHR9LFxuXHRcdFx0X1NWR0VsZW1lbnQgPSBfZ3NTY29wZS5TVkdFbGVtZW50LFxuXHRcdFx0X3VzZVNWR1RyYW5zZm9ybUF0dHIsXG5cdFx0XHQvL1NvbWUgYnJvd3NlcnMgKGxpa2UgRmlyZWZveCBhbmQgSUUpIGRvbid0IGhvbm9yIHRyYW5zZm9ybS1vcmlnaW4gcHJvcGVybHkgaW4gU1ZHIGVsZW1lbnRzLCBzbyB3ZSBuZWVkIHRvIG1hbnVhbGx5IGFkanVzdCB0aGUgbWF0cml4IGFjY29yZGluZ2x5LiBXZSBmZWF0dXJlIGRldGVjdCBoZXJlIHJhdGhlciB0aGFuIGFsd2F5cyBkb2luZyB0aGUgY29udmVyc2lvbiBmb3IgY2VydGFpbiBicm93c2VycyBiZWNhdXNlIHRoZXkgbWF5IGZpeCB0aGUgcHJvYmxlbSBhdCBzb21lIHBvaW50IGluIHRoZSBmdXR1cmUuXG5cblx0XHRcdF9jcmVhdGVTVkcgPSBmdW5jdGlvbih0eXBlLCBjb250YWluZXIsIGF0dHJpYnV0ZXMpIHtcblx0XHRcdFx0dmFyIGVsZW1lbnQgPSBfZG9jLmNyZWF0ZUVsZW1lbnROUyhcImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIsIHR5cGUpLFxuXHRcdFx0XHRcdHJlZyA9IC8oW2Etel0pKFtBLVpdKS9nLFxuXHRcdFx0XHRcdHA7XG5cdFx0XHRcdGZvciAocCBpbiBhdHRyaWJ1dGVzKSB7XG5cdFx0XHRcdFx0ZWxlbWVudC5zZXRBdHRyaWJ1dGVOUyhudWxsLCBwLnJlcGxhY2UocmVnLCBcIiQxLSQyXCIpLnRvTG93ZXJDYXNlKCksIGF0dHJpYnV0ZXNbcF0pO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGNvbnRhaW5lci5hcHBlbmRDaGlsZChlbGVtZW50KTtcblx0XHRcdFx0cmV0dXJuIGVsZW1lbnQ7XG5cdFx0XHR9LFxuXHRcdFx0X2RvY0VsZW1lbnQgPSBfZG9jLmRvY3VtZW50RWxlbWVudCB8fCB7fSxcblx0XHRcdF9mb3JjZVNWR1RyYW5zZm9ybUF0dHIgPSAoZnVuY3Rpb24oKSB7XG5cdFx0XHRcdC8vSUUgYW5kIEFuZHJvaWQgc3RvY2sgZG9uJ3Qgc3VwcG9ydCBDU1MgdHJhbnNmb3JtcyBvbiBTVkcgZWxlbWVudHMsIHNvIHdlIG11c3Qgd3JpdGUgdGhlbSB0byB0aGUgXCJ0cmFuc2Zvcm1cIiBhdHRyaWJ1dGUuIFdlIHBvcHVsYXRlIHRoaXMgdmFyaWFibGUgaW4gdGhlIF9wYXJzZVRyYW5zZm9ybSgpIG1ldGhvZCwgYW5kIG9ubHkgaWYvd2hlbiB3ZSBjb21lIGFjcm9zcyBhbiBTVkcgZWxlbWVudFxuXHRcdFx0XHR2YXIgZm9yY2UgPSBfaWVWZXJzIHx8ICgvQW5kcm9pZC9pLnRlc3QoX2FnZW50KSAmJiAhX2dzU2NvcGUuY2hyb21lKSxcblx0XHRcdFx0XHRzdmcsIHJlY3QsIHdpZHRoO1xuXHRcdFx0XHRpZiAoX2RvYy5jcmVhdGVFbGVtZW50TlMgJiYgIWZvcmNlKSB7IC8vSUU4IGFuZCBlYXJsaWVyIGRvZXNuJ3Qgc3VwcG9ydCBTVkcgYW55d2F5XG5cdFx0XHRcdFx0c3ZnID0gX2NyZWF0ZVNWRyhcInN2Z1wiLCBfZG9jRWxlbWVudCk7XG5cdFx0XHRcdFx0cmVjdCA9IF9jcmVhdGVTVkcoXCJyZWN0XCIsIHN2Zywge3dpZHRoOjEwMCwgaGVpZ2h0OjUwLCB4OjEwMH0pO1xuXHRcdFx0XHRcdHdpZHRoID0gcmVjdC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aDtcblx0XHRcdFx0XHRyZWN0LnN0eWxlW190cmFuc2Zvcm1PcmlnaW5Qcm9wXSA9IFwiNTAlIDUwJVwiO1xuXHRcdFx0XHRcdHJlY3Quc3R5bGVbX3RyYW5zZm9ybVByb3BdID0gXCJzY2FsZVgoMC41KVwiO1xuXHRcdFx0XHRcdGZvcmNlID0gKHdpZHRoID09PSByZWN0LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoICYmICEoX2lzRmlyZWZveCAmJiBfc3VwcG9ydHMzRCkpOyAvL25vdGU6IEZpcmVmb3ggZmFpbHMgdGhlIHRlc3QgZXZlbiB0aG91Z2ggaXQgZG9lcyBzdXBwb3J0IENTUyB0cmFuc2Zvcm1zIGluIDNELiBTaW5jZSB3ZSBjYW4ndCBwdXNoIDNEIHN0dWZmIGludG8gdGhlIHRyYW5zZm9ybSBhdHRyaWJ1dGUsIHdlIGZvcmNlIEZpcmVmb3ggdG8gcGFzcyB0aGUgdGVzdCBoZXJlIChhcyBsb25nIGFzIGl0IGRvZXMgdHJ1bHkgc3VwcG9ydCAzRCkuXG5cdFx0XHRcdFx0X2RvY0VsZW1lbnQucmVtb3ZlQ2hpbGQoc3ZnKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gZm9yY2U7XG5cdFx0XHR9KSgpLFxuXHRcdFx0X3BhcnNlU1ZHT3JpZ2luID0gZnVuY3Rpb24oZSwgbG9jYWwsIGRlY29yYXRlZSwgYWJzb2x1dGUsIHNtb290aE9yaWdpbiwgc2tpcFJlY29yZCkge1xuXHRcdFx0XHR2YXIgdG0gPSBlLl9nc1RyYW5zZm9ybSxcblx0XHRcdFx0XHRtID0gX2dldE1hdHJpeChlLCB0cnVlKSxcblx0XHRcdFx0XHR2LCB4LCB5LCB4T3JpZ2luLCB5T3JpZ2luLCBhLCBiLCBjLCBkLCB0eCwgdHksIGRldGVybWluYW50LCB4T3JpZ2luT2xkLCB5T3JpZ2luT2xkO1xuXHRcdFx0XHRpZiAodG0pIHtcblx0XHRcdFx0XHR4T3JpZ2luT2xkID0gdG0ueE9yaWdpbjsgLy9yZWNvcmQgdGhlIG9yaWdpbmFsIHZhbHVlcyBiZWZvcmUgd2UgYWx0ZXIgdGhlbS5cblx0XHRcdFx0XHR5T3JpZ2luT2xkID0gdG0ueU9yaWdpbjtcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAoIWFic29sdXRlIHx8ICh2ID0gYWJzb2x1dGUuc3BsaXQoXCIgXCIpKS5sZW5ndGggPCAyKSB7XG5cdFx0XHRcdFx0YiA9IGUuZ2V0QkJveCgpO1xuXHRcdFx0XHRcdGlmIChiLnggPT09IDAgJiYgYi55ID09PSAwICYmIGIud2lkdGggKyBiLmhlaWdodCA9PT0gMCkgeyAvL3NvbWUgYnJvd3NlcnMgKGxpa2UgRmlyZWZveCkgbWlzcmVwb3J0IHRoZSBib3VuZHMgaWYgdGhlIGVsZW1lbnQgaGFzIHplcm8gd2lkdGggYW5kIGhlaWdodCAoaXQganVzdCBhc3N1bWVzIGl0J3MgYXQgeDowLCB5OjApLCB0aHVzIHdlIG5lZWQgdG8gbWFudWFsbHkgZ3JhYiB0aGUgcG9zaXRpb24gaW4gdGhhdCBjYXNlLlxuXHRcdFx0XHRcdFx0YiA9IHt4OiBwYXJzZUZsb2F0KGUuaGFzQXR0cmlidXRlKFwieFwiKSA/IGUuZ2V0QXR0cmlidXRlKFwieFwiKSA6IGUuaGFzQXR0cmlidXRlKFwiY3hcIikgPyBlLmdldEF0dHJpYnV0ZShcImN4XCIpIDogMCkgfHwgMCwgeTogcGFyc2VGbG9hdChlLmhhc0F0dHJpYnV0ZShcInlcIikgPyBlLmdldEF0dHJpYnV0ZShcInlcIikgOiBlLmhhc0F0dHJpYnV0ZShcImN5XCIpID8gZS5nZXRBdHRyaWJ1dGUoXCJjeVwiKSA6IDApIHx8IDAsIHdpZHRoOjAsIGhlaWdodDowfTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0bG9jYWwgPSBfcGFyc2VQb3NpdGlvbihsb2NhbCkuc3BsaXQoXCIgXCIpO1xuXHRcdFx0XHRcdHYgPSBbKGxvY2FsWzBdLmluZGV4T2YoXCIlXCIpICE9PSAtMSA/IHBhcnNlRmxvYXQobG9jYWxbMF0pIC8gMTAwICogYi53aWR0aCA6IHBhcnNlRmxvYXQobG9jYWxbMF0pKSArIGIueCxcblx0XHRcdFx0XHRcdCAobG9jYWxbMV0uaW5kZXhPZihcIiVcIikgIT09IC0xID8gcGFyc2VGbG9hdChsb2NhbFsxXSkgLyAxMDAgKiBiLmhlaWdodCA6IHBhcnNlRmxvYXQobG9jYWxbMV0pKSArIGIueV07XG5cdFx0XHRcdH1cblx0XHRcdFx0ZGVjb3JhdGVlLnhPcmlnaW4gPSB4T3JpZ2luID0gcGFyc2VGbG9hdCh2WzBdKTtcblx0XHRcdFx0ZGVjb3JhdGVlLnlPcmlnaW4gPSB5T3JpZ2luID0gcGFyc2VGbG9hdCh2WzFdKTtcblx0XHRcdFx0aWYgKGFic29sdXRlICYmIG0gIT09IF9pZGVudGl0eTJETWF0cml4KSB7IC8vaWYgc3ZnT3JpZ2luIGlzIGJlaW5nIHNldCwgd2UgbXVzdCBpbnZlcnQgdGhlIG1hdHJpeCBhbmQgZGV0ZXJtaW5lIHdoZXJlIHRoZSBhYnNvbHV0ZSBwb2ludCBpcywgZmFjdG9yaW5nIGluIHRoZSBjdXJyZW50IHRyYW5zZm9ybXMuIE90aGVyd2lzZSwgdGhlIHN2Z09yaWdpbiB3b3VsZCBiZSBiYXNlZCBvbiB0aGUgZWxlbWVudCdzIG5vbi10cmFuc2Zvcm1lZCBwb3NpdGlvbiBvbiB0aGUgY2FudmFzLlxuXHRcdFx0XHRcdGEgPSBtWzBdO1xuXHRcdFx0XHRcdGIgPSBtWzFdO1xuXHRcdFx0XHRcdGMgPSBtWzJdO1xuXHRcdFx0XHRcdGQgPSBtWzNdO1xuXHRcdFx0XHRcdHR4ID0gbVs0XTtcblx0XHRcdFx0XHR0eSA9IG1bNV07XG5cdFx0XHRcdFx0ZGV0ZXJtaW5hbnQgPSAoYSAqIGQgLSBiICogYyk7XG5cdFx0XHRcdFx0aWYgKGRldGVybWluYW50KSB7IC8vaWYgaXQncyB6ZXJvIChsaWtlIGlmIHNjYWxlWCBhbmQgc2NhbGVZIGFyZSB6ZXJvKSwgc2tpcCBpdCB0byBhdm9pZCBlcnJvcnMgd2l0aCBkaXZpZGluZyBieSB6ZXJvLlxuXHRcdFx0XHRcdFx0eCA9IHhPcmlnaW4gKiAoZCAvIGRldGVybWluYW50KSArIHlPcmlnaW4gKiAoLWMgLyBkZXRlcm1pbmFudCkgKyAoKGMgKiB0eSAtIGQgKiB0eCkgLyBkZXRlcm1pbmFudCk7XG5cdFx0XHRcdFx0XHR5ID0geE9yaWdpbiAqICgtYiAvIGRldGVybWluYW50KSArIHlPcmlnaW4gKiAoYSAvIGRldGVybWluYW50KSAtICgoYSAqIHR5IC0gYiAqIHR4KSAvIGRldGVybWluYW50KTtcblx0XHRcdFx0XHRcdHhPcmlnaW4gPSBkZWNvcmF0ZWUueE9yaWdpbiA9IHZbMF0gPSB4O1xuXHRcdFx0XHRcdFx0eU9yaWdpbiA9IGRlY29yYXRlZS55T3JpZ2luID0gdlsxXSA9IHk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdGlmICh0bSkgeyAvL2F2b2lkIGp1bXAgd2hlbiB0cmFuc2Zvcm1PcmlnaW4gaXMgY2hhbmdlZCAtIGFkanVzdCB0aGUgeC95IHZhbHVlcyBhY2NvcmRpbmdseVxuXHRcdFx0XHRcdGlmIChza2lwUmVjb3JkKSB7XG5cdFx0XHRcdFx0XHRkZWNvcmF0ZWUueE9mZnNldCA9IHRtLnhPZmZzZXQ7XG5cdFx0XHRcdFx0XHRkZWNvcmF0ZWUueU9mZnNldCA9IHRtLnlPZmZzZXQ7XG5cdFx0XHRcdFx0XHR0bSA9IGRlY29yYXRlZTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0aWYgKHNtb290aE9yaWdpbiB8fCAoc21vb3RoT3JpZ2luICE9PSBmYWxzZSAmJiBDU1NQbHVnaW4uZGVmYXVsdFNtb290aE9yaWdpbiAhPT0gZmFsc2UpKSB7XG5cdFx0XHRcdFx0XHR4ID0geE9yaWdpbiAtIHhPcmlnaW5PbGQ7XG5cdFx0XHRcdFx0XHR5ID0geU9yaWdpbiAtIHlPcmlnaW5PbGQ7XG5cdFx0XHRcdFx0XHQvL29yaWdpbmFsbHksIHdlIHNpbXBseSBhZGp1c3RlZCB0aGUgeCBhbmQgeSB2YWx1ZXMsIGJ1dCB0aGF0IHdvdWxkIGNhdXNlIHByb2JsZW1zIGlmLCBmb3IgZXhhbXBsZSwgeW91IGNyZWF0ZWQgYSByb3RhdGlvbmFsIHR3ZWVuIHBhcnQtd2F5IHRocm91Z2ggYW4geC95IHR3ZWVuLiBNYW5hZ2luZyB0aGUgb2Zmc2V0IGluIGEgc2VwYXJhdGUgdmFyaWFibGUgZ2l2ZXMgdXMgdWx0aW1hdGUgZmxleGliaWxpdHkuXG5cdFx0XHRcdFx0XHQvL3RtLnggLT0geCAtICh4ICogbVswXSArIHkgKiBtWzJdKTtcblx0XHRcdFx0XHRcdC8vdG0ueSAtPSB5IC0gKHggKiBtWzFdICsgeSAqIG1bM10pO1xuXHRcdFx0XHRcdFx0dG0ueE9mZnNldCArPSAoeCAqIG1bMF0gKyB5ICogbVsyXSkgLSB4O1xuXHRcdFx0XHRcdFx0dG0ueU9mZnNldCArPSAoeCAqIG1bMV0gKyB5ICogbVszXSkgLSB5O1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHR0bS54T2Zmc2V0ID0gdG0ueU9mZnNldCA9IDA7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdGlmICghc2tpcFJlY29yZCkge1xuXHRcdFx0XHRcdGUuc2V0QXR0cmlidXRlKFwiZGF0YS1zdmctb3JpZ2luXCIsIHYuam9pbihcIiBcIikpO1xuXHRcdFx0XHR9XG5cdFx0XHR9LFxuXHRcdFx0X2dldEJCb3hIYWNrID0gZnVuY3Rpb24oc3dhcElmUG9zc2libGUpIHsgLy93b3JrcyBhcm91bmQgaXNzdWVzIGluIHNvbWUgYnJvd3NlcnMgKGxpa2UgRmlyZWZveCkgdGhhdCBkb24ndCBjb3JyZWN0bHkgcmVwb3J0IGdldEJCb3goKSBvbiBTVkcgZWxlbWVudHMgaW5zaWRlIGEgPGRlZnM+IGVsZW1lbnQgYW5kL29yIDxtYXNrPi4gV2UgdHJ5IGNyZWF0aW5nIGFuIFNWRywgYWRkaW5nIGl0IHRvIHRoZSBkb2N1bWVudEVsZW1lbnQgYW5kIHRvc3MgdGhlIGVsZW1lbnQgaW4gdGhlcmUgc28gdGhhdCBpdCdzIGRlZmluaXRlbHkgcGFydCBvZiB0aGUgcmVuZGVyaW5nIHRyZWUsIHRoZW4gZ3JhYiB0aGUgYmJveCBhbmQgaWYgaXQgd29ya3MsIHdlIGFjdHVhbGx5IHN3YXAgb3V0IHRoZSBvcmlnaW5hbCBnZXRCQm94KCkgbWV0aG9kIGZvciBvdXIgb3duIHRoYXQgZG9lcyB0aGVzZSBleHRyYSBzdGVwcyB3aGVuZXZlciBnZXRCQm94IGlzIG5lZWRlZC4gVGhpcyBoZWxwcyBlbnN1cmUgdGhhdCBwZXJmb3JtYW5jZSBpcyBvcHRpbWFsIChvbmx5IGRvIGFsbCB0aGVzZSBleHRyYSBzdGVwcyB3aGVuIGFic29sdXRlbHkgbmVjZXNzYXJ5Li4ubW9zdCBlbGVtZW50cyBkb24ndCBuZWVkIGl0KS5cblx0XHRcdFx0dmFyIHN2ZyA9IF9jcmVhdGVFbGVtZW50KFwic3ZnXCIsICh0aGlzLm93bmVyU1ZHRWxlbWVudCAmJiB0aGlzLm93bmVyU1ZHRWxlbWVudC5nZXRBdHRyaWJ1dGUoXCJ4bWxuc1wiKSkgfHwgXCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiKSxcblx0XHRcdFx0XHRvbGRQYXJlbnQgPSB0aGlzLnBhcmVudE5vZGUsXG5cdFx0XHRcdFx0b2xkU2libGluZyA9IHRoaXMubmV4dFNpYmxpbmcsXG5cdFx0XHRcdFx0b2xkQ1NTID0gdGhpcy5zdHlsZS5jc3NUZXh0LFxuXHRcdFx0XHRcdGJib3g7XG5cdFx0XHRcdF9kb2NFbGVtZW50LmFwcGVuZENoaWxkKHN2Zyk7XG5cdFx0XHRcdHN2Zy5hcHBlbmRDaGlsZCh0aGlzKTtcblx0XHRcdFx0dGhpcy5zdHlsZS5kaXNwbGF5ID0gXCJibG9ja1wiO1xuXHRcdFx0XHRpZiAoc3dhcElmUG9zc2libGUpIHtcblx0XHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdFx0YmJveCA9IHRoaXMuZ2V0QkJveCgpO1xuXHRcdFx0XHRcdFx0dGhpcy5fb3JpZ2luYWxHZXRCQm94ID0gdGhpcy5nZXRCQm94O1xuXHRcdFx0XHRcdFx0dGhpcy5nZXRCQm94ID0gX2dldEJCb3hIYWNrO1xuXHRcdFx0XHRcdH0gY2F0Y2ggKGUpIHsgfVxuXHRcdFx0XHR9IGVsc2UgaWYgKHRoaXMuX29yaWdpbmFsR2V0QkJveCkge1xuXHRcdFx0XHRcdGJib3ggPSB0aGlzLl9vcmlnaW5hbEdldEJCb3goKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAob2xkU2libGluZykge1xuXHRcdFx0XHRcdG9sZFBhcmVudC5pbnNlcnRCZWZvcmUodGhpcywgb2xkU2libGluZyk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0b2xkUGFyZW50LmFwcGVuZENoaWxkKHRoaXMpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdF9kb2NFbGVtZW50LnJlbW92ZUNoaWxkKHN2Zyk7XG5cdFx0XHRcdHRoaXMuc3R5bGUuY3NzVGV4dCA9IG9sZENTUztcblx0XHRcdFx0cmV0dXJuIGJib3g7XG5cdFx0XHR9LFxuXHRcdFx0X2dldEJCb3ggPSBmdW5jdGlvbihlKSB7XG5cdFx0XHRcdHRyeSB7XG5cdFx0XHRcdFx0cmV0dXJuIGUuZ2V0QkJveCgpOyAvL0ZpcmVmb3ggdGhyb3dzIGVycm9ycyBpZiB5b3UgdHJ5IGNhbGxpbmcgZ2V0QkJveCgpIG9uIGFuIFNWRyBlbGVtZW50IHRoYXQncyBub3QgcmVuZGVyZWQgKGxpa2UgaW4gYSA8c3ltYm9sPiBvciA8ZGVmcz4pLiBodHRwczovL2J1Z3ppbGxhLm1vemlsbGEub3JnL3Nob3dfYnVnLmNnaT9pZD02MTIxMThcblx0XHRcdFx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHRcdFx0XHRyZXR1cm4gX2dldEJCb3hIYWNrLmNhbGwoZSwgdHJ1ZSk7XG5cdFx0XHRcdH1cblx0XHRcdH0sXG5cdFx0XHRfaXNTVkcgPSBmdW5jdGlvbihlKSB7IC8vcmVwb3J0cyBpZiB0aGUgZWxlbWVudCBpcyBhbiBTVkcgb24gd2hpY2ggZ2V0QkJveCgpIGFjdHVhbGx5IHdvcmtzXG5cdFx0XHRcdHJldHVybiAhIShfU1ZHRWxlbWVudCAmJiBlLmdldENUTSAmJiAoIWUucGFyZW50Tm9kZSB8fCBlLm93bmVyU1ZHRWxlbWVudCkgJiYgX2dldEJCb3goZSkpO1xuXHRcdFx0fSxcblx0XHRcdF9pZGVudGl0eTJETWF0cml4ID0gWzEsMCwwLDEsMCwwXSxcblx0XHRcdF9nZXRNYXRyaXggPSBmdW5jdGlvbihlLCBmb3JjZTJEKSB7XG5cdFx0XHRcdHZhciB0bSA9IGUuX2dzVHJhbnNmb3JtIHx8IG5ldyBUcmFuc2Zvcm0oKSxcblx0XHRcdFx0XHRybmQgPSAxMDAwMDAsXG5cdFx0XHRcdFx0c3R5bGUgPSBlLnN0eWxlLFxuXHRcdFx0XHRcdGlzRGVmYXVsdCwgcywgbSwgbiwgZGVjLCBub25lO1xuXHRcdFx0XHRpZiAoX3RyYW5zZm9ybVByb3ApIHtcblx0XHRcdFx0XHRzID0gX2dldFN0eWxlKGUsIF90cmFuc2Zvcm1Qcm9wQ1NTLCBudWxsLCB0cnVlKTtcblx0XHRcdFx0fSBlbHNlIGlmIChlLmN1cnJlbnRTdHlsZSkge1xuXHRcdFx0XHRcdC8vZm9yIG9sZGVyIHZlcnNpb25zIG9mIElFLCB3ZSBuZWVkIHRvIGludGVycHJldCB0aGUgZmlsdGVyIHBvcnRpb24gdGhhdCBpcyBpbiB0aGUgZm9ybWF0OiBwcm9naWQ6RFhJbWFnZVRyYW5zZm9ybS5NaWNyb3NvZnQuTWF0cml4KE0xMT02LjEyMzIzMzk5NTczNjc2NmUtMTcsIE0xMj0tMSwgTTIxPTEsIE0yMj02LjEyMzIzMzk5NTczNjc2NmUtMTcsIHNpemluZ01ldGhvZD0nYXV0byBleHBhbmQnKSBOb3RpY2UgdGhhdCB3ZSBuZWVkIHRvIHN3YXAgYiBhbmQgYyBjb21wYXJlZCB0byBhIG5vcm1hbCBtYXRyaXguXG5cdFx0XHRcdFx0cyA9IGUuY3VycmVudFN0eWxlLmZpbHRlci5tYXRjaChfaWVHZXRNYXRyaXhFeHApO1xuXHRcdFx0XHRcdHMgPSAocyAmJiBzLmxlbmd0aCA9PT0gNCkgPyBbc1swXS5zdWJzdHIoNCksIE51bWJlcihzWzJdLnN1YnN0cig0KSksIE51bWJlcihzWzFdLnN1YnN0cig0KSksIHNbM10uc3Vic3RyKDQpLCAodG0ueCB8fCAwKSwgKHRtLnkgfHwgMCldLmpvaW4oXCIsXCIpIDogXCJcIjtcblx0XHRcdFx0fVxuXHRcdFx0XHRpc0RlZmF1bHQgPSAoIXMgfHwgcyA9PT0gXCJub25lXCIgfHwgcyA9PT0gXCJtYXRyaXgoMSwgMCwgMCwgMSwgMCwgMClcIik7XG5cdFx0XHRcdGlmIChfdHJhbnNmb3JtUHJvcCAmJiAoKG5vbmUgPSAoIV9nZXRDb21wdXRlZFN0eWxlKGUpIHx8IF9nZXRDb21wdXRlZFN0eWxlKGUpLmRpc3BsYXkgPT09IFwibm9uZVwiKSkgfHwgIWUucGFyZW50Tm9kZSkpIHsgLy9ub3RlOiBGaXJlZm94IHJldHVybnMgbnVsbCBmb3IgZ2V0Q29tcHV0ZWRTdHlsZSgpIGlmIHRoZSBlbGVtZW50IGlzIGluIGFuIGlmcmFtZSB0aGF0IGhhcyBkaXNwbGF5Om5vbmUuIGh0dHBzOi8vYnVnemlsbGEubW96aWxsYS5vcmcvc2hvd19idWcuY2dpP2lkPTU0ODM5N1xuXHRcdFx0XHRcdGlmIChub25lKSB7IC8vYnJvd3NlcnMgZG9uJ3QgcmVwb3J0IHRyYW5zZm9ybXMgYWNjdXJhdGVseSB1bmxlc3MgdGhlIGVsZW1lbnQgaXMgaW4gdGhlIERPTSBhbmQgaGFzIGEgZGlzcGxheSB2YWx1ZSB0aGF0J3Mgbm90IFwibm9uZVwiLiBGaXJlZm94IGFuZCBNaWNyb3NvZnQgYnJvd3NlcnMgaGF2ZSBhIHBhcnRpYWwgYnVnIHdoZXJlIHRoZXknbGwgcmVwb3J0IHRyYW5zZm9ybXMgZXZlbiBpZiBkaXNwbGF5Om5vbmUgQlVUIG5vdCBhbnkgcGVyY2VudGFnZS1iYXNlZCB2YWx1ZXMgbGlrZSB0cmFuc2xhdGUoLTUwJSwgOHB4KSB3aWxsIGJlIHJlcG9ydGVkIGFzIGlmIGl0J3MgdHJhbnNsYXRlKDAsIDhweCkuXG5cdFx0XHRcdFx0XHRuID0gc3R5bGUuZGlzcGxheTtcblx0XHRcdFx0XHRcdHN0eWxlLmRpc3BsYXkgPSBcImJsb2NrXCI7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGlmICghZS5wYXJlbnROb2RlKSB7XG5cdFx0XHRcdFx0XHRkZWMgPSAxOyAvL2ZsYWdcblx0XHRcdFx0XHRcdF9kb2NFbGVtZW50LmFwcGVuZENoaWxkKGUpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRzID0gX2dldFN0eWxlKGUsIF90cmFuc2Zvcm1Qcm9wQ1NTLCBudWxsLCB0cnVlKTtcblx0XHRcdFx0XHRpc0RlZmF1bHQgPSAoIXMgfHwgcyA9PT0gXCJub25lXCIgfHwgcyA9PT0gXCJtYXRyaXgoMSwgMCwgMCwgMSwgMCwgMClcIik7XG5cdFx0XHRcdFx0aWYgKG4pIHtcblx0XHRcdFx0XHRcdHN0eWxlLmRpc3BsYXkgPSBuO1xuXHRcdFx0XHRcdH0gZWxzZSBpZiAobm9uZSkge1xuXHRcdFx0XHRcdFx0X3JlbW92ZVByb3Aoc3R5bGUsIFwiZGlzcGxheVwiKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0aWYgKGRlYykge1xuXHRcdFx0XHRcdFx0X2RvY0VsZW1lbnQucmVtb3ZlQ2hpbGQoZSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdGlmICh0bS5zdmcgfHwgKGUuZ2V0Q1RNICYmIF9pc1NWRyhlKSkpIHtcblx0XHRcdFx0XHRpZiAoaXNEZWZhdWx0ICYmIChzdHlsZVtfdHJhbnNmb3JtUHJvcF0gKyBcIlwiKS5pbmRleE9mKFwibWF0cml4XCIpICE9PSAtMSkgeyAvL3NvbWUgYnJvd3NlcnMgKGxpa2UgQ2hyb21lIDQwKSBkb24ndCBjb3JyZWN0bHkgcmVwb3J0IHRyYW5zZm9ybXMgdGhhdCBhcmUgYXBwbGllZCBpbmxpbmUgb24gYW4gU1ZHIGVsZW1lbnQgKHRoZXkgZG9uJ3QgZ2V0IGluY2x1ZGVkIGluIHRoZSBjb21wdXRlZCBzdHlsZSksIHNvIHdlIGRvdWJsZS1jaGVjayBoZXJlIGFuZCBhY2NlcHQgbWF0cml4IHZhbHVlc1xuXHRcdFx0XHRcdFx0cyA9IHN0eWxlW190cmFuc2Zvcm1Qcm9wXTtcblx0XHRcdFx0XHRcdGlzRGVmYXVsdCA9IDA7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdG0gPSBlLmdldEF0dHJpYnV0ZShcInRyYW5zZm9ybVwiKTtcblx0XHRcdFx0XHRpZiAoaXNEZWZhdWx0ICYmIG0pIHtcblx0XHRcdFx0XHRcdG0gPSBlLnRyYW5zZm9ybS5iYXNlVmFsLmNvbnNvbGlkYXRlKCkubWF0cml4OyAvL2Vuc3VyZXMgdGhhdCBldmVuIGNvbXBsZXggdmFsdWVzIGxpa2UgXCJ0cmFuc2xhdGUoNTAsNjApIHJvdGF0ZSgxMzUsMCwwKVwiIGFyZSBwYXJzZWQgYmVjYXVzZSBpdCBtYXNoZXMgaXQgaW50byBhIG1hdHJpeC5cblx0XHRcdFx0XHRcdHMgPSBcIm1hdHJpeChcIiArIG0uYSArIFwiLFwiICsgbS5iICsgXCIsXCIgKyBtLmMgKyBcIixcIiArIG0uZCArIFwiLFwiICsgbS5lICsgXCIsXCIgKyBtLmYgKyBcIilcIjtcblx0XHRcdFx0XHRcdGlzRGVmYXVsdCA9IDA7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdGlmIChpc0RlZmF1bHQpIHtcblx0XHRcdFx0XHRyZXR1cm4gX2lkZW50aXR5MkRNYXRyaXg7XG5cdFx0XHRcdH1cblx0XHRcdFx0Ly9zcGxpdCB0aGUgbWF0cml4IHZhbHVlcyBvdXQgaW50byBhbiBhcnJheSAobSBmb3IgbWF0cml4KVxuXHRcdFx0XHRtID0gKHMgfHwgXCJcIikubWF0Y2goX251bUV4cCkgfHwgW107XG5cdFx0XHRcdGkgPSBtLmxlbmd0aDtcblx0XHRcdFx0d2hpbGUgKC0taSA+IC0xKSB7XG5cdFx0XHRcdFx0biA9IE51bWJlcihtW2ldKTtcblx0XHRcdFx0XHRtW2ldID0gKGRlYyA9IG4gLSAobiB8PSAwKSkgPyAoKGRlYyAqIHJuZCArIChkZWMgPCAwID8gLTAuNSA6IDAuNSkpIHwgMCkgLyBybmQgKyBuIDogbjsgLy9jb252ZXJ0IHN0cmluZ3MgdG8gTnVtYmVycyBhbmQgcm91bmQgdG8gNSBkZWNpbWFsIHBsYWNlcyB0byBhdm9pZCBpc3N1ZXMgd2l0aCB0aW55IG51bWJlcnMuIFJvdWdobHkgMjB4IGZhc3RlciB0aGFuIE51bWJlci50b0ZpeGVkKCkuIFdlIGFsc28gbXVzdCBtYWtlIHN1cmUgdG8gcm91bmQgYmVmb3JlIGRpdmlkaW5nIHNvIHRoYXQgdmFsdWVzIGxpa2UgMC45OTk5OTk5OTk5IGJlY29tZSAxIHRvIGF2b2lkIGdsaXRjaGVzIGluIGJyb3dzZXIgcmVuZGVyaW5nIGFuZCBpbnRlcnByZXRhdGlvbiBvZiBmbGlwcGVkL3JvdGF0ZWQgM0QgbWF0cmljZXMuIEFuZCBkb24ndCBqdXN0IG11bHRpcGx5IHRoZSBudW1iZXIgYnkgcm5kLCBmbG9vciBpdCwgYW5kIHRoZW4gZGl2aWRlIGJ5IHJuZCBiZWNhdXNlIHRoZSBiaXR3aXNlIG9wZXJhdGlvbnMgbWF4IG91dCBhdCBhIDMyLWJpdCBzaWduZWQgaW50ZWdlciwgdGh1cyBpdCBjb3VsZCBnZXQgY2xpcHBlZCBhdCBhIHJlbGF0aXZlbHkgbG93IHZhbHVlIChsaWtlIDIyLDAwMC4wMDAwMCBmb3IgZXhhbXBsZSkuXG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIChmb3JjZTJEICYmIG0ubGVuZ3RoID4gNikgPyBbbVswXSwgbVsxXSwgbVs0XSwgbVs1XSwgbVsxMl0sIG1bMTNdXSA6IG07XG5cdFx0XHR9LFxuXG5cdFx0XHQvKipcblx0XHRcdCAqIFBhcnNlcyB0aGUgdHJhbnNmb3JtIHZhbHVlcyBmb3IgYW4gZWxlbWVudCwgcmV0dXJuaW5nIGFuIG9iamVjdCB3aXRoIHgsIHksIHosIHNjYWxlWCwgc2NhbGVZLCBzY2FsZVosIHJvdGF0aW9uLCByb3RhdGlvblgsIHJvdGF0aW9uWSwgc2tld1gsIGFuZCBza2V3WSBwcm9wZXJ0aWVzLiBOb3RlOiBieSBkZWZhdWx0IChmb3IgcGVyZm9ybWFuY2UgcmVhc29ucyksIGFsbCBza2V3aW5nIGlzIGNvbWJpbmVkIGludG8gc2tld1ggYW5kIHJvdGF0aW9uIGJ1dCBza2V3WSBzdGlsbCBoYXMgYSBwbGFjZSBpbiB0aGUgdHJhbnNmb3JtIG9iamVjdCBzbyB0aGF0IHdlIGNhbiByZWNvcmQgaG93IG11Y2ggb2YgdGhlIHNrZXcgaXMgYXR0cmlidXRlZCB0byBza2V3WCB2cyBza2V3WS4gUmVtZW1iZXIsIGEgc2tld1kgb2YgMTAgbG9va3MgdGhlIHNhbWUgYXMgYSByb3RhdGlvbiBvZiAxMCBhbmQgc2tld1ggb2YgLTEwLlxuXHRcdFx0ICogQHBhcmFtIHshT2JqZWN0fSB0IHRhcmdldCBlbGVtZW50XG5cdFx0XHQgKiBAcGFyYW0ge09iamVjdD19IGNzIGNvbXB1dGVkIHN0eWxlIG9iamVjdCAob3B0aW9uYWwpXG5cdFx0XHQgKiBAcGFyYW0ge2Jvb2xlYW49fSByZWMgaWYgdHJ1ZSwgdGhlIHRyYW5zZm9ybSB2YWx1ZXMgd2lsbCBiZSByZWNvcmRlZCB0byB0aGUgdGFyZ2V0IGVsZW1lbnQncyBfZ3NUcmFuc2Zvcm0gb2JqZWN0LCBsaWtlIHRhcmdldC5fZ3NUcmFuc2Zvcm0gPSB7eDowLCB5OjAsIHo6MCwgc2NhbGVYOjEuLi59XG5cdFx0XHQgKiBAcGFyYW0ge2Jvb2xlYW49fSBwYXJzZSBpZiB0cnVlLCB3ZSdsbCBpZ25vcmUgYW55IF9nc1RyYW5zZm9ybSB2YWx1ZXMgdGhhdCBhbHJlYWR5IGV4aXN0IG9uIHRoZSBlbGVtZW50LCBhbmQgZm9yY2UgYSByZXBhcnNpbmcgb2YgdGhlIGNzcyAoY2FsY3VsYXRlZCBzdHlsZSlcblx0XHRcdCAqIEByZXR1cm4ge29iamVjdH0gb2JqZWN0IGNvbnRhaW5pbmcgYWxsIG9mIHRoZSB0cmFuc2Zvcm0gcHJvcGVydGllcy92YWx1ZXMgbGlrZSB7eDowLCB5OjAsIHo6MCwgc2NhbGVYOjEuLi59XG5cdFx0XHQgKi9cblx0XHRcdF9nZXRUcmFuc2Zvcm0gPSBfaW50ZXJuYWxzLmdldFRyYW5zZm9ybSA9IGZ1bmN0aW9uKHQsIGNzLCByZWMsIHBhcnNlKSB7XG5cdFx0XHRcdGlmICh0Ll9nc1RyYW5zZm9ybSAmJiByZWMgJiYgIXBhcnNlKSB7XG5cdFx0XHRcdFx0cmV0dXJuIHQuX2dzVHJhbnNmb3JtOyAvL2lmIHRoZSBlbGVtZW50IGFscmVhZHkgaGFzIGEgX2dzVHJhbnNmb3JtLCB1c2UgdGhhdC4gTm90ZTogc29tZSBicm93c2VycyBkb24ndCBhY2N1cmF0ZWx5IHJldHVybiB0aGUgY2FsY3VsYXRlZCBzdHlsZSBmb3IgdGhlIHRyYW5zZm9ybSAocGFydGljdWxhcmx5IGZvciBTVkcpLCBzbyBpdCdzIGFsbW9zdCBhbHdheXMgc2FmZXN0IHRvIGp1c3QgdXNlIHRoZSB2YWx1ZXMgd2UndmUgYWxyZWFkeSBhcHBsaWVkIHJhdGhlciB0aGFuIHJlLXBhcnNpbmcgdGhpbmdzLlxuXHRcdFx0XHR9XG5cdFx0XHRcdHZhciB0bSA9IHJlYyA/IHQuX2dzVHJhbnNmb3JtIHx8IG5ldyBUcmFuc2Zvcm0oKSA6IG5ldyBUcmFuc2Zvcm0oKSxcblx0XHRcdFx0XHRpbnZYID0gKHRtLnNjYWxlWCA8IDApLCAvL2luIG9yZGVyIHRvIGludGVycHJldCB0aGluZ3MgcHJvcGVybHksIHdlIG5lZWQgdG8ga25vdyBpZiB0aGUgdXNlciBhcHBsaWVkIGEgbmVnYXRpdmUgc2NhbGVYIHByZXZpb3VzbHkgc28gdGhhdCB3ZSBjYW4gYWRqdXN0IHRoZSByb3RhdGlvbiBhbmQgc2tld1ggYWNjb3JkaW5nbHkuIE90aGVyd2lzZSwgaWYgd2UgYWx3YXlzIGludGVycHJldCBhIGZsaXBwZWQgbWF0cml4IGFzIGFmZmVjdGluZyBzY2FsZVkgYW5kIHRoZSB1c2VyIG9ubHkgd2FudHMgdG8gdHdlZW4gdGhlIHNjYWxlWCBvbiBtdWx0aXBsZSBzZXF1ZW50aWFsIHR3ZWVucywgaXQgd291bGQga2VlcCB0aGUgbmVnYXRpdmUgc2NhbGVZIHdpdGhvdXQgdGhhdCBiZWluZyB0aGUgdXNlcidzIGludGVudC5cblx0XHRcdFx0XHRtaW4gPSAwLjAwMDAyLFxuXHRcdFx0XHRcdHJuZCA9IDEwMDAwMCxcblx0XHRcdFx0XHR6T3JpZ2luID0gX3N1cHBvcnRzM0QgPyBwYXJzZUZsb2F0KF9nZXRTdHlsZSh0LCBfdHJhbnNmb3JtT3JpZ2luUHJvcCwgY3MsIGZhbHNlLCBcIjAgMCAwXCIpLnNwbGl0KFwiIFwiKVsyXSkgfHwgdG0uek9yaWdpbiAgfHwgMCA6IDAsXG5cdFx0XHRcdFx0ZGVmYXVsdFRyYW5zZm9ybVBlcnNwZWN0aXZlID0gcGFyc2VGbG9hdChDU1NQbHVnaW4uZGVmYXVsdFRyYW5zZm9ybVBlcnNwZWN0aXZlKSB8fCAwLFxuXHRcdFx0XHRcdG0sIGksIHNjYWxlWCwgc2NhbGVZLCByb3RhdGlvbiwgc2tld1g7XG5cblx0XHRcdFx0dG0uc3ZnID0gISEodC5nZXRDVE0gJiYgX2lzU1ZHKHQpKTtcblx0XHRcdFx0aWYgKHRtLnN2Zykge1xuXHRcdFx0XHRcdF9wYXJzZVNWR09yaWdpbih0LCBfZ2V0U3R5bGUodCwgX3RyYW5zZm9ybU9yaWdpblByb3AsIGNzLCBmYWxzZSwgXCI1MCUgNTAlXCIpICsgXCJcIiwgdG0sIHQuZ2V0QXR0cmlidXRlKFwiZGF0YS1zdmctb3JpZ2luXCIpKTtcblx0XHRcdFx0XHRfdXNlU1ZHVHJhbnNmb3JtQXR0ciA9IENTU1BsdWdpbi51c2VTVkdUcmFuc2Zvcm1BdHRyIHx8IF9mb3JjZVNWR1RyYW5zZm9ybUF0dHI7XG5cdFx0XHRcdH1cblx0XHRcdFx0bSA9IF9nZXRNYXRyaXgodCk7XG5cdFx0XHRcdGlmIChtICE9PSBfaWRlbnRpdHkyRE1hdHJpeCkge1xuXG5cdFx0XHRcdFx0aWYgKG0ubGVuZ3RoID09PSAxNikge1xuXHRcdFx0XHRcdFx0Ly93ZSdsbCBvbmx5IGxvb2sgYXQgdGhlc2UgcG9zaXRpb24tcmVsYXRlZCA2IHZhcmlhYmxlcyBmaXJzdCBiZWNhdXNlIGlmIHgveS96IGFsbCBtYXRjaCwgaXQncyByZWxhdGl2ZWx5IHNhZmUgdG8gYXNzdW1lIHdlIGRvbid0IG5lZWQgdG8gcmUtcGFyc2UgZXZlcnl0aGluZyB3aGljaCByaXNrcyBsb3NpbmcgaW1wb3J0YW50IHJvdGF0aW9uYWwgaW5mb3JtYXRpb24gKGxpa2Ugcm90YXRpb25YOjE4MCBwbHVzIHJvdGF0aW9uWToxODAgd291bGQgbG9vayB0aGUgc2FtZSBhcyByb3RhdGlvbjoxODAgLSB0aGVyZSdzIG5vIHdheSB0byBrbm93IGZvciBzdXJlIHdoaWNoIGRpcmVjdGlvbiB3YXMgdGFrZW4gYmFzZWQgc29sZWx5IG9uIHRoZSBtYXRyaXgzZCgpIHZhbHVlcylcblx0XHRcdFx0XHRcdHZhciBhMTEgPSBtWzBdLCBhMjEgPSBtWzFdLCBhMzEgPSBtWzJdLCBhNDEgPSBtWzNdLFxuXHRcdFx0XHRcdFx0XHRhMTIgPSBtWzRdLCBhMjIgPSBtWzVdLCBhMzIgPSBtWzZdLCBhNDIgPSBtWzddLFxuXHRcdFx0XHRcdFx0XHRhMTMgPSBtWzhdLCBhMjMgPSBtWzldLCBhMzMgPSBtWzEwXSxcblx0XHRcdFx0XHRcdFx0YTE0ID0gbVsxMl0sIGEyNCA9IG1bMTNdLCBhMzQgPSBtWzE0XSxcblx0XHRcdFx0XHRcdFx0YTQzID0gbVsxMV0sXG5cdFx0XHRcdFx0XHRcdGFuZ2xlID0gTWF0aC5hdGFuMihhMzIsIGEzMyksXG5cdFx0XHRcdFx0XHRcdHQxLCB0MiwgdDMsIHQ0LCBjb3MsIHNpbjtcblx0XHRcdFx0XHRcdC8vd2UgbWFudWFsbHkgY29tcGVuc2F0ZSBmb3Igbm9uLXplcm8geiBjb21wb25lbnQgb2YgdHJhbnNmb3JtT3JpZ2luIHRvIHdvcmsgYXJvdW5kIGJ1Z3MgaW4gU2FmYXJpXG5cdFx0XHRcdFx0XHRpZiAodG0uek9yaWdpbikge1xuXHRcdFx0XHRcdFx0XHRhMzQgPSAtdG0uek9yaWdpbjtcblx0XHRcdFx0XHRcdFx0YTE0ID0gYTEzKmEzNC1tWzEyXTtcblx0XHRcdFx0XHRcdFx0YTI0ID0gYTIzKmEzNC1tWzEzXTtcblx0XHRcdFx0XHRcdFx0YTM0ID0gYTMzKmEzNCt0bS56T3JpZ2luLW1bMTRdO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0Ly9ub3RlIGZvciBwb3NzaWJsZSBmdXR1cmUgY29uc29saWRhdGlvbjogcm90YXRpb25YOiBNYXRoLmF0YW4yKGEzMiwgYTMzKSwgcm90YXRpb25ZOiBNYXRoLmF0YW4yKC1hMzEsIE1hdGguc3FydChhMzMgKiBhMzMgKyBhMzIgKiBhMzIpKSwgcm90YXRpb246IE1hdGguYXRhbjIoYTIxLCBhMTEpLCBza2V3OiBNYXRoLmF0YW4yKGExMiwgYTIyKS4gSG93ZXZlciwgaXQgZG9lc24ndCBzZWVtIHRvIGJlIHF1aXRlIGFzIHJlbGlhYmxlIGFzIHRoZSBmdWxsLW9uIGJhY2t3YXJkcyByb3RhdGlvbiBwcm9jZWR1cmUuXG5cdFx0XHRcdFx0XHR0bS5yb3RhdGlvblggPSBhbmdsZSAqIF9SQUQyREVHO1xuXHRcdFx0XHRcdFx0Ly9yb3RhdGlvblhcblx0XHRcdFx0XHRcdGlmIChhbmdsZSkge1xuXHRcdFx0XHRcdFx0XHRjb3MgPSBNYXRoLmNvcygtYW5nbGUpO1xuXHRcdFx0XHRcdFx0XHRzaW4gPSBNYXRoLnNpbigtYW5nbGUpO1xuXHRcdFx0XHRcdFx0XHR0MSA9IGExMipjb3MrYTEzKnNpbjtcblx0XHRcdFx0XHRcdFx0dDIgPSBhMjIqY29zK2EyMypzaW47XG5cdFx0XHRcdFx0XHRcdHQzID0gYTMyKmNvcythMzMqc2luO1xuXHRcdFx0XHRcdFx0XHRhMTMgPSBhMTIqLXNpbithMTMqY29zO1xuXHRcdFx0XHRcdFx0XHRhMjMgPSBhMjIqLXNpbithMjMqY29zO1xuXHRcdFx0XHRcdFx0XHRhMzMgPSBhMzIqLXNpbithMzMqY29zO1xuXHRcdFx0XHRcdFx0XHRhNDMgPSBhNDIqLXNpbithNDMqY29zO1xuXHRcdFx0XHRcdFx0XHRhMTIgPSB0MTtcblx0XHRcdFx0XHRcdFx0YTIyID0gdDI7XG5cdFx0XHRcdFx0XHRcdGEzMiA9IHQzO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0Ly9yb3RhdGlvbllcblx0XHRcdFx0XHRcdGFuZ2xlID0gTWF0aC5hdGFuMigtYTMxLCBhMzMpO1xuXHRcdFx0XHRcdFx0dG0ucm90YXRpb25ZID0gYW5nbGUgKiBfUkFEMkRFRztcblx0XHRcdFx0XHRcdGlmIChhbmdsZSkge1xuXHRcdFx0XHRcdFx0XHRjb3MgPSBNYXRoLmNvcygtYW5nbGUpO1xuXHRcdFx0XHRcdFx0XHRzaW4gPSBNYXRoLnNpbigtYW5nbGUpO1xuXHRcdFx0XHRcdFx0XHR0MSA9IGExMSpjb3MtYTEzKnNpbjtcblx0XHRcdFx0XHRcdFx0dDIgPSBhMjEqY29zLWEyMypzaW47XG5cdFx0XHRcdFx0XHRcdHQzID0gYTMxKmNvcy1hMzMqc2luO1xuXHRcdFx0XHRcdFx0XHRhMjMgPSBhMjEqc2luK2EyMypjb3M7XG5cdFx0XHRcdFx0XHRcdGEzMyA9IGEzMSpzaW4rYTMzKmNvcztcblx0XHRcdFx0XHRcdFx0YTQzID0gYTQxKnNpbithNDMqY29zO1xuXHRcdFx0XHRcdFx0XHRhMTEgPSB0MTtcblx0XHRcdFx0XHRcdFx0YTIxID0gdDI7XG5cdFx0XHRcdFx0XHRcdGEzMSA9IHQzO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0Ly9yb3RhdGlvblpcblx0XHRcdFx0XHRcdGFuZ2xlID0gTWF0aC5hdGFuMihhMjEsIGExMSk7XG5cdFx0XHRcdFx0XHR0bS5yb3RhdGlvbiA9IGFuZ2xlICogX1JBRDJERUc7XG5cdFx0XHRcdFx0XHRpZiAoYW5nbGUpIHtcblx0XHRcdFx0XHRcdFx0Y29zID0gTWF0aC5jb3MoYW5nbGUpO1xuXHRcdFx0XHRcdFx0XHRzaW4gPSBNYXRoLnNpbihhbmdsZSk7XG5cdFx0XHRcdFx0XHRcdHQxID0gYTExKmNvcythMjEqc2luO1xuXHRcdFx0XHRcdFx0XHR0MiA9IGExMipjb3MrYTIyKnNpbjtcblx0XHRcdFx0XHRcdFx0dDMgPSBhMTMqY29zK2EyMypzaW47XG5cdFx0XHRcdFx0XHRcdGEyMSA9IGEyMSpjb3MtYTExKnNpbjtcblx0XHRcdFx0XHRcdFx0YTIyID0gYTIyKmNvcy1hMTIqc2luO1xuXHRcdFx0XHRcdFx0XHRhMjMgPSBhMjMqY29zLWExMypzaW47XG5cdFx0XHRcdFx0XHRcdGExMSA9IHQxO1xuXHRcdFx0XHRcdFx0XHRhMTIgPSB0Mjtcblx0XHRcdFx0XHRcdFx0YTEzID0gdDM7XG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdGlmICh0bS5yb3RhdGlvblggJiYgTWF0aC5hYnModG0ucm90YXRpb25YKSArIE1hdGguYWJzKHRtLnJvdGF0aW9uKSA+IDM1OS45KSB7IC8vd2hlbiByb3RhdGlvblkgaXMgc2V0LCBpdCB3aWxsIG9mdGVuIGJlIHBhcnNlZCBhcyAxODAgZGVncmVlcyBkaWZmZXJlbnQgdGhhbiBpdCBzaG91bGQgYmUsIGFuZCByb3RhdGlvblggYW5kIHJvdGF0aW9uIGJvdGggYmVpbmcgMTgwIChpdCBsb29rcyB0aGUgc2FtZSksIHNvIHdlIGFkanVzdCBmb3IgdGhhdCBoZXJlLlxuXHRcdFx0XHRcdFx0XHR0bS5yb3RhdGlvblggPSB0bS5yb3RhdGlvbiA9IDA7XG5cdFx0XHRcdFx0XHRcdHRtLnJvdGF0aW9uWSA9IDE4MCAtIHRtLnJvdGF0aW9uWTtcblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0Ly9za2V3WFxuXHRcdFx0XHRcdFx0YW5nbGUgPSBNYXRoLmF0YW4yKGExMiwgYTIyKTtcblxuXHRcdFx0XHRcdFx0Ly9zY2FsZXNcblx0XHRcdFx0XHRcdHRtLnNjYWxlWCA9ICgoTWF0aC5zcXJ0KGExMSAqIGExMSArIGEyMSAqIGEyMSArIGEzMSAqIGEzMSkgKiBybmQgKyAwLjUpIHwgMCkgLyBybmQ7XG5cdFx0XHRcdFx0XHR0bS5zY2FsZVkgPSAoKE1hdGguc3FydChhMjIgKiBhMjIgKyBhMzIgKiBhMzIpICogcm5kICsgMC41KSB8IDApIC8gcm5kO1xuXHRcdFx0XHRcdFx0dG0uc2NhbGVaID0gKChNYXRoLnNxcnQoYTEzICogYTEzICsgYTIzICogYTIzICsgYTMzICogYTMzKSAqIHJuZCArIDAuNSkgfCAwKSAvIHJuZDtcblx0XHRcdFx0XHRcdGExMSAvPSB0bS5zY2FsZVg7XG5cdFx0XHRcdFx0XHRhMTIgLz0gdG0uc2NhbGVZO1xuXHRcdFx0XHRcdFx0YTIxIC89IHRtLnNjYWxlWDtcblx0XHRcdFx0XHRcdGEyMiAvPSB0bS5zY2FsZVk7XG5cdFx0XHRcdFx0XHRpZiAoTWF0aC5hYnMoYW5nbGUpID4gbWluKSB7XG5cdFx0XHRcdFx0XHRcdHRtLnNrZXdYID0gYW5nbGUgKiBfUkFEMkRFRztcblx0XHRcdFx0XHRcdFx0YTEyID0gMDsgLy91bnNrZXdzXG5cdFx0XHRcdFx0XHRcdGlmICh0bS5za2V3VHlwZSAhPT0gXCJzaW1wbGVcIikge1xuXHRcdFx0XHRcdFx0XHRcdHRtLnNjYWxlWSAqPSAxIC8gTWF0aC5jb3MoYW5nbGUpOyAvL2J5IGRlZmF1bHQsIHdlIGNvbXBlbnNhdGUgdGhlIHNjYWxlIGJhc2VkIG9uIHRoZSBza2V3IHNvIHRoYXQgdGhlIGVsZW1lbnQgbWFpbnRhaW5zIGEgc2ltaWxhciBwcm9wb3J0aW9uIHdoZW4gc2tld2VkLCBzbyB3ZSBoYXZlIHRvIGFsdGVyIHRoZSBzY2FsZVkgaGVyZSBhY2NvcmRpbmdseSB0byBtYXRjaCB0aGUgZGVmYXVsdCAobm9uLWFkanVzdGVkKSBza2V3aW5nIHRoYXQgQ1NTIGRvZXMgKHN0cmV0Y2hpbmcgbW9yZSBhbmQgbW9yZSBhcyBpdCBza2V3cykuXG5cdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0dG0uc2tld1ggPSAwO1xuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHQvKiAvL2ZvciB0ZXN0aW5nIHB1cnBvc2VzXG5cdFx0XHRcdFx0XHR2YXIgdHJhbnNmb3JtID0gXCJtYXRyaXgzZChcIixcblx0XHRcdFx0XHRcdFx0Y29tbWEgPSBcIixcIixcblx0XHRcdFx0XHRcdFx0emVybyA9IFwiMFwiO1xuXHRcdFx0XHRcdFx0YTEzIC89IHRtLnNjYWxlWjtcblx0XHRcdFx0XHRcdGEyMyAvPSB0bS5zY2FsZVo7XG5cdFx0XHRcdFx0XHRhMzEgLz0gdG0uc2NhbGVYO1xuXHRcdFx0XHRcdFx0YTMyIC89IHRtLnNjYWxlWTtcblx0XHRcdFx0XHRcdGEzMyAvPSB0bS5zY2FsZVo7XG5cdFx0XHRcdFx0XHR0cmFuc2Zvcm0gKz0gKChhMTEgPCBtaW4gJiYgYTExID4gLW1pbikgPyB6ZXJvIDogYTExKSArIGNvbW1hICsgKChhMjEgPCBtaW4gJiYgYTIxID4gLW1pbikgPyB6ZXJvIDogYTIxKSArIGNvbW1hICsgKChhMzEgPCBtaW4gJiYgYTMxID4gLW1pbikgPyB6ZXJvIDogYTMxKTtcblx0XHRcdFx0XHRcdHRyYW5zZm9ybSArPSBjb21tYSArICgoYTQxIDwgbWluICYmIGE0MSA+IC1taW4pID8gemVybyA6IGE0MSkgKyBjb21tYSArICgoYTEyIDwgbWluICYmIGExMiA+IC1taW4pID8gemVybyA6IGExMikgKyBjb21tYSArICgoYTIyIDwgbWluICYmIGEyMiA+IC1taW4pID8gemVybyA6IGEyMik7XG5cdFx0XHRcdFx0XHR0cmFuc2Zvcm0gKz0gY29tbWEgKyAoKGEzMiA8IG1pbiAmJiBhMzIgPiAtbWluKSA/IHplcm8gOiBhMzIpICsgY29tbWEgKyAoKGE0MiA8IG1pbiAmJiBhNDIgPiAtbWluKSA/IHplcm8gOiBhNDIpICsgY29tbWEgKyAoKGExMyA8IG1pbiAmJiBhMTMgPiAtbWluKSA/IHplcm8gOiBhMTMpO1xuXHRcdFx0XHRcdFx0dHJhbnNmb3JtICs9IGNvbW1hICsgKChhMjMgPCBtaW4gJiYgYTIzID4gLW1pbikgPyB6ZXJvIDogYTIzKSArIGNvbW1hICsgKChhMzMgPCBtaW4gJiYgYTMzID4gLW1pbikgPyB6ZXJvIDogYTMzKSArIGNvbW1hICsgKChhNDMgPCBtaW4gJiYgYTQzID4gLW1pbikgPyB6ZXJvIDogYTQzKSArIGNvbW1hO1xuXHRcdFx0XHRcdFx0dHJhbnNmb3JtICs9IGExNCArIGNvbW1hICsgYTI0ICsgY29tbWEgKyBhMzQgKyBjb21tYSArICh0bS5wZXJzcGVjdGl2ZSA/ICgxICsgKC1hMzQgLyB0bS5wZXJzcGVjdGl2ZSkpIDogMSkgKyBcIilcIjtcblx0XHRcdFx0XHRcdGNvbnNvbGUubG9nKHRyYW5zZm9ybSk7XG5cdFx0XHRcdFx0XHRkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFwiLnRlc3RcIikuc3R5bGVbX3RyYW5zZm9ybVByb3BdID0gdHJhbnNmb3JtO1xuXHRcdFx0XHRcdFx0Ki9cblxuXHRcdFx0XHRcdFx0dG0ucGVyc3BlY3RpdmUgPSBhNDMgPyAxIC8gKChhNDMgPCAwKSA/IC1hNDMgOiBhNDMpIDogMDtcblx0XHRcdFx0XHRcdHRtLnggPSBhMTQ7XG5cdFx0XHRcdFx0XHR0bS55ID0gYTI0O1xuXHRcdFx0XHRcdFx0dG0ueiA9IGEzNDtcblx0XHRcdFx0XHRcdGlmICh0bS5zdmcpIHtcblx0XHRcdFx0XHRcdFx0dG0ueCAtPSB0bS54T3JpZ2luIC0gKHRtLnhPcmlnaW4gKiBhMTEgLSB0bS55T3JpZ2luICogYTEyKTtcblx0XHRcdFx0XHRcdFx0dG0ueSAtPSB0bS55T3JpZ2luIC0gKHRtLnlPcmlnaW4gKiBhMjEgLSB0bS54T3JpZ2luICogYTIyKTtcblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdH0gZWxzZSBpZiAoKCFfc3VwcG9ydHMzRCB8fCBwYXJzZSB8fCAhbS5sZW5ndGggfHwgdG0ueCAhPT0gbVs0XSB8fCB0bS55ICE9PSBtWzVdIHx8ICghdG0ucm90YXRpb25YICYmICF0bS5yb3RhdGlvblkpKSkgeyAvL3NvbWV0aW1lcyBhIDYtZWxlbWVudCBtYXRyaXggaXMgcmV0dXJuZWQgZXZlbiB3aGVuIHdlIHBlcmZvcm1lZCAzRCB0cmFuc2Zvcm1zLCBsaWtlIGlmIHJvdGF0aW9uWCBhbmQgcm90YXRpb25ZIGFyZSAxODAuIEluIGNhc2VzIGxpa2UgdGhpcywgd2Ugc3RpbGwgbmVlZCB0byBob25vciB0aGUgM0QgdHJhbnNmb3Jtcy4gSWYgd2UganVzdCByZWx5IG9uIHRoZSAyRCBpbmZvLCBpdCBjb3VsZCBhZmZlY3QgaG93IHRoZSBkYXRhIGlzIGludGVycHJldGVkLCBsaWtlIHNjYWxlWSBtaWdodCBnZXQgc2V0IHRvIC0xIG9yIHJvdGF0aW9uIGNvdWxkIGdldCBvZmZzZXQgYnkgMTgwIGRlZ3JlZXMuIEZvciBleGFtcGxlLCBkbyBhIFR3ZWVuTGl0ZS50byhlbGVtZW50LCAxLCB7Y3NzOntyb3RhdGlvblg6MTgwLCByb3RhdGlvblk6MTgwfX0pIGFuZCB0aGVuIGxhdGVyLCBUd2VlbkxpdGUudG8oZWxlbWVudCwgMSwge2Nzczp7cm90YXRpb25YOjB9fSkgYW5kIHdpdGhvdXQgdGhpcyBjb25kaXRpb25hbCBsb2dpYyBpbiBwbGFjZSwgaXQnZCBqdW1wIHRvIGEgc3RhdGUgb2YgYmVpbmcgdW5yb3RhdGVkIHdoZW4gdGhlIDJuZCB0d2VlbiBzdGFydHMuIFRoZW4gYWdhaW4sIHdlIG5lZWQgdG8gaG9ub3IgdGhlIGZhY3QgdGhhdCB0aGUgdXNlciBDT1VMRCBhbHRlciB0aGUgdHJhbnNmb3JtcyBvdXRzaWRlIG9mIENTU1BsdWdpbiwgbGlrZSBieSBtYW51YWxseSBhcHBseWluZyBuZXcgY3NzLCBzbyB3ZSB0cnkgdG8gc2Vuc2UgdGhhdCBieSBsb29raW5nIGF0IHggYW5kIHkgYmVjYXVzZSBpZiB0aG9zZSBjaGFuZ2VkLCB3ZSBrbm93IHRoZSBjaGFuZ2VzIHdlcmUgbWFkZSBvdXRzaWRlIENTU1BsdWdpbiBhbmQgd2UgZm9yY2UgYSByZWludGVycHJldGF0aW9uIG9mIHRoZSBtYXRyaXggdmFsdWVzLiBBbHNvLCBpbiBXZWJraXQgYnJvd3NlcnMsIGlmIHRoZSBlbGVtZW50J3MgXCJkaXNwbGF5XCIgaXMgXCJub25lXCIsIGl0cyBjYWxjdWxhdGVkIHN0eWxlIHZhbHVlIHdpbGwgYWx3YXlzIHJldHVybiBlbXB0eSwgc28gaWYgd2UndmUgYWxyZWFkeSByZWNvcmRlZCB0aGUgdmFsdWVzIGluIHRoZSBfZ3NUcmFuc2Zvcm0gb2JqZWN0LCB3ZSdsbCBqdXN0IHJlbHkgb24gdGhvc2UuXG5cdFx0XHRcdFx0XHR2YXIgayA9IChtLmxlbmd0aCA+PSA2KSxcblx0XHRcdFx0XHRcdFx0YSA9IGsgPyBtWzBdIDogMSxcblx0XHRcdFx0XHRcdFx0YiA9IG1bMV0gfHwgMCxcblx0XHRcdFx0XHRcdFx0YyA9IG1bMl0gfHwgMCxcblx0XHRcdFx0XHRcdFx0ZCA9IGsgPyBtWzNdIDogMTtcblx0XHRcdFx0XHRcdHRtLnggPSBtWzRdIHx8IDA7XG5cdFx0XHRcdFx0XHR0bS55ID0gbVs1XSB8fCAwO1xuXHRcdFx0XHRcdFx0c2NhbGVYID0gTWF0aC5zcXJ0KGEgKiBhICsgYiAqIGIpO1xuXHRcdFx0XHRcdFx0c2NhbGVZID0gTWF0aC5zcXJ0KGQgKiBkICsgYyAqIGMpO1xuXHRcdFx0XHRcdFx0cm90YXRpb24gPSAoYSB8fCBiKSA/IE1hdGguYXRhbjIoYiwgYSkgKiBfUkFEMkRFRyA6IHRtLnJvdGF0aW9uIHx8IDA7IC8vbm90ZTogaWYgc2NhbGVYIGlzIDAsIHdlIGNhbm5vdCBhY2N1cmF0ZWx5IG1lYXN1cmUgcm90YXRpb24uIFNhbWUgZm9yIHNrZXdYIHdpdGggYSBzY2FsZVkgb2YgMC4gVGhlcmVmb3JlLCB3ZSBkZWZhdWx0IHRvIHRoZSBwcmV2aW91c2x5IHJlY29yZGVkIHZhbHVlIChvciB6ZXJvIGlmIHRoYXQgZG9lc24ndCBleGlzdCkuXG5cdFx0XHRcdFx0XHRza2V3WCA9IChjIHx8IGQpID8gTWF0aC5hdGFuMihjLCBkKSAqIF9SQUQyREVHICsgcm90YXRpb24gOiB0bS5za2V3WCB8fCAwO1xuXHRcdFx0XHRcdFx0dG0uc2NhbGVYID0gc2NhbGVYO1xuXHRcdFx0XHRcdFx0dG0uc2NhbGVZID0gc2NhbGVZO1xuXHRcdFx0XHRcdFx0dG0ucm90YXRpb24gPSByb3RhdGlvbjtcblx0XHRcdFx0XHRcdHRtLnNrZXdYID0gc2tld1g7XG5cdFx0XHRcdFx0XHRpZiAoX3N1cHBvcnRzM0QpIHtcblx0XHRcdFx0XHRcdFx0dG0ucm90YXRpb25YID0gdG0ucm90YXRpb25ZID0gdG0ueiA9IDA7XG5cdFx0XHRcdFx0XHRcdHRtLnBlcnNwZWN0aXZlID0gZGVmYXVsdFRyYW5zZm9ybVBlcnNwZWN0aXZlO1xuXHRcdFx0XHRcdFx0XHR0bS5zY2FsZVogPSAxO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0aWYgKHRtLnN2Zykge1xuXHRcdFx0XHRcdFx0XHR0bS54IC09IHRtLnhPcmlnaW4gLSAodG0ueE9yaWdpbiAqIGEgKyB0bS55T3JpZ2luICogYyk7XG5cdFx0XHRcdFx0XHRcdHRtLnkgLT0gdG0ueU9yaWdpbiAtICh0bS54T3JpZ2luICogYiArIHRtLnlPcmlnaW4gKiBkKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0aWYgKE1hdGguYWJzKHRtLnNrZXdYKSA+IDkwICYmIE1hdGguYWJzKHRtLnNrZXdYKSA8IDI3MCkge1xuXHRcdFx0XHRcdFx0aWYgKGludlgpIHtcblx0XHRcdFx0XHRcdFx0dG0uc2NhbGVYICo9IC0xO1xuXHRcdFx0XHRcdFx0XHR0bS5za2V3WCArPSAodG0ucm90YXRpb24gPD0gMCkgPyAxODAgOiAtMTgwO1xuXHRcdFx0XHRcdFx0XHR0bS5yb3RhdGlvbiArPSAodG0ucm90YXRpb24gPD0gMCkgPyAxODAgOiAtMTgwO1xuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0dG0uc2NhbGVZICo9IC0xO1xuXHRcdFx0XHRcdFx0XHR0bS5za2V3WCArPSAodG0uc2tld1ggPD0gMCkgPyAxODAgOiAtMTgwO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHR0bS56T3JpZ2luID0gek9yaWdpbjtcblx0XHRcdFx0XHQvL3NvbWUgYnJvd3NlcnMgaGF2ZSBhIGhhcmQgdGltZSB3aXRoIHZlcnkgc21hbGwgdmFsdWVzIGxpa2UgMi40NDkyOTM1OTgyOTQ3MDY0ZS0xNiAobm90aWNlIHRoZSBcImUtXCIgdG93YXJkcyB0aGUgZW5kKSBhbmQgd291bGQgcmVuZGVyIHRoZSBvYmplY3Qgc2xpZ2h0bHkgb2ZmLiBTbyB3ZSByb3VuZCB0byAwIGluIHRoZXNlIGNhc2VzLiBUaGUgY29uZGl0aW9uYWwgbG9naWMgaGVyZSBpcyBmYXN0ZXIgdGhhbiBjYWxsaW5nIE1hdGguYWJzKCkuIEFsc28sIGJyb3dzZXJzIHRlbmQgdG8gcmVuZGVyIGEgU0xJR0hUTFkgcm90YXRlZCBvYmplY3QgaW4gYSBmdXp6eSB3YXksIHNvIHdlIG5lZWQgdG8gc25hcCB0byBleGFjdGx5IDAgd2hlbiBhcHByb3ByaWF0ZS5cblx0XHRcdFx0XHRmb3IgKGkgaW4gdG0pIHtcblx0XHRcdFx0XHRcdGlmICh0bVtpXSA8IG1pbikgaWYgKHRtW2ldID4gLW1pbikge1xuXHRcdFx0XHRcdFx0XHR0bVtpXSA9IDA7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdC8vREVCVUc6IF9sb2coXCJwYXJzZWQgcm90YXRpb24gb2YgXCIgKyB0LmdldEF0dHJpYnV0ZShcImlkXCIpK1wiOiBcIisodG0ucm90YXRpb25YKStcIiwgXCIrKHRtLnJvdGF0aW9uWSkrXCIsIFwiKyh0bS5yb3RhdGlvbikrXCIsIHNjYWxlOiBcIit0bS5zY2FsZVgrXCIsIFwiK3RtLnNjYWxlWStcIiwgXCIrdG0uc2NhbGVaK1wiLCBwb3NpdGlvbjogXCIrdG0ueCtcIiwgXCIrdG0ueStcIiwgXCIrdG0ueitcIiwgcGVyc3BlY3RpdmU6IFwiK3RtLnBlcnNwZWN0aXZlKyBcIiwgb3JpZ2luOiBcIisgdG0ueE9yaWdpbisgXCIsXCIrIHRtLnlPcmlnaW4pO1xuXHRcdFx0XHRpZiAocmVjKSB7XG5cdFx0XHRcdFx0dC5fZ3NUcmFuc2Zvcm0gPSB0bTsgLy9yZWNvcmQgdG8gdGhlIG9iamVjdCdzIF9nc1RyYW5zZm9ybSB3aGljaCB3ZSB1c2Ugc28gdGhhdCB0d2VlbnMgY2FuIGNvbnRyb2wgaW5kaXZpZHVhbCBwcm9wZXJ0aWVzIGluZGVwZW5kZW50bHkgKHdlIG5lZWQgYWxsIHRoZSBwcm9wZXJ0aWVzIHRvIGFjY3VyYXRlbHkgcmVjb21wb3NlIHRoZSBtYXRyaXggaW4gdGhlIHNldFJhdGlvKCkgbWV0aG9kKVxuXHRcdFx0XHRcdGlmICh0bS5zdmcpIHsgLy9pZiB3ZSdyZSBzdXBwb3NlZCB0byBhcHBseSB0cmFuc2Zvcm1zIHRvIHRoZSBTVkcgZWxlbWVudCdzIFwidHJhbnNmb3JtXCIgYXR0cmlidXRlLCBtYWtlIHN1cmUgdGhlcmUgYXJlbid0IGFueSBDU1MgdHJhbnNmb3JtcyBhcHBsaWVkIG9yIHRoZXknbGwgb3ZlcnJpZGUgdGhlIGF0dHJpYnV0ZSBvbmVzLiBBbHNvIGNsZWFyIHRoZSB0cmFuc2Zvcm0gYXR0cmlidXRlIGlmIHdlJ3JlIHVzaW5nIENTUywganVzdCB0byBiZSBjbGVhbi5cblx0XHRcdFx0XHRcdGlmIChfdXNlU1ZHVHJhbnNmb3JtQXR0ciAmJiB0LnN0eWxlW190cmFuc2Zvcm1Qcm9wXSkge1xuXHRcdFx0XHRcdFx0XHRUd2VlbkxpdGUuZGVsYXllZENhbGwoMC4wMDEsIGZ1bmN0aW9uKCl7IC8vaWYgd2UgYXBwbHkgdGhpcyByaWdodCBhd2F5IChiZWZvcmUgYW55dGhpbmcgaGFzIHJlbmRlcmVkKSwgd2UgcmlzayB0aGVyZSBiZWluZyBubyB0cmFuc2Zvcm1zIGZvciBhIGJyaWVmIG1vbWVudCBhbmQgaXQgYWxzbyBpbnRlcmZlcmVzIHdpdGggYWRqdXN0aW5nIHRoZSB0cmFuc2Zvcm1PcmlnaW4gaW4gYSB0d2VlbiB3aXRoIGltbWVkaWF0ZVJlbmRlcjp0cnVlIChpdCdkIHRyeSByZWFkaW5nIHRoZSBtYXRyaXggYW5kIGl0IHdvdWxkbid0IGhhdmUgdGhlIGFwcHJvcHJpYXRlIGRhdGEgaW4gcGxhY2UgYmVjYXVzZSB3ZSBqdXN0IHJlbW92ZWQgaXQpLlxuXHRcdFx0XHRcdFx0XHRcdF9yZW1vdmVQcm9wKHQuc3R5bGUsIF90cmFuc2Zvcm1Qcm9wKTtcblx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHR9IGVsc2UgaWYgKCFfdXNlU1ZHVHJhbnNmb3JtQXR0ciAmJiB0LmdldEF0dHJpYnV0ZShcInRyYW5zZm9ybVwiKSkge1xuXHRcdFx0XHRcdFx0XHRUd2VlbkxpdGUuZGVsYXllZENhbGwoMC4wMDEsIGZ1bmN0aW9uKCl7XG5cdFx0XHRcdFx0XHRcdFx0dC5yZW1vdmVBdHRyaWJ1dGUoXCJ0cmFuc2Zvcm1cIik7XG5cdFx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gdG07XG5cdFx0XHR9LFxuXG5cdFx0XHQvL2ZvciBzZXR0aW5nIDJEIHRyYW5zZm9ybXMgaW4gSUU2LCBJRTcsIGFuZCBJRTggKG11c3QgdXNlIGEgXCJmaWx0ZXJcIiB0byBlbXVsYXRlIHRoZSBiZWhhdmlvciBvZiBtb2Rlcm4gZGF5IGJyb3dzZXIgdHJhbnNmb3Jtcylcblx0XHRcdF9zZXRJRVRyYW5zZm9ybVJhdGlvID0gZnVuY3Rpb24odikge1xuXHRcdFx0XHR2YXIgdCA9IHRoaXMuZGF0YSwgLy9yZWZlcnMgdG8gdGhlIGVsZW1lbnQncyBfZ3NUcmFuc2Zvcm0gb2JqZWN0XG5cdFx0XHRcdFx0YW5nID0gLXQucm90YXRpb24gKiBfREVHMlJBRCxcblx0XHRcdFx0XHRza2V3ID0gYW5nICsgdC5za2V3WCAqIF9ERUcyUkFELFxuXHRcdFx0XHRcdHJuZCA9IDEwMDAwMCxcblx0XHRcdFx0XHRhID0gKChNYXRoLmNvcyhhbmcpICogdC5zY2FsZVggKiBybmQpIHwgMCkgLyBybmQsXG5cdFx0XHRcdFx0YiA9ICgoTWF0aC5zaW4oYW5nKSAqIHQuc2NhbGVYICogcm5kKSB8IDApIC8gcm5kLFxuXHRcdFx0XHRcdGMgPSAoKE1hdGguc2luKHNrZXcpICogLXQuc2NhbGVZICogcm5kKSB8IDApIC8gcm5kLFxuXHRcdFx0XHRcdGQgPSAoKE1hdGguY29zKHNrZXcpICogdC5zY2FsZVkgKiBybmQpIHwgMCkgLyBybmQsXG5cdFx0XHRcdFx0c3R5bGUgPSB0aGlzLnQuc3R5bGUsXG5cdFx0XHRcdFx0Y3MgPSB0aGlzLnQuY3VycmVudFN0eWxlLFxuXHRcdFx0XHRcdGZpbHRlcnMsIHZhbDtcblx0XHRcdFx0aWYgKCFjcykge1xuXHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0fVxuXHRcdFx0XHR2YWwgPSBiOyAvL2p1c3QgZm9yIHN3YXBwaW5nIHRoZSB2YXJpYWJsZXMgYW4gaW52ZXJ0aW5nIHRoZW0gKHJldXNlZCBcInZhbFwiIHRvIGF2b2lkIGNyZWF0aW5nIGFub3RoZXIgdmFyaWFibGUgaW4gbWVtb3J5KS4gSUUncyBmaWx0ZXIgbWF0cml4IHVzZXMgYSBub24tc3RhbmRhcmQgbWF0cml4IGNvbmZpZ3VyYXRpb24gKGFuZ2xlIGdvZXMgdGhlIG9wcG9zaXRlIHdheSwgYW5kIGIgYW5kIGMgYXJlIHJldmVyc2VkIGFuZCBpbnZlcnRlZClcblx0XHRcdFx0YiA9IC1jO1xuXHRcdFx0XHRjID0gLXZhbDtcblx0XHRcdFx0ZmlsdGVycyA9IGNzLmZpbHRlcjtcblx0XHRcdFx0c3R5bGUuZmlsdGVyID0gXCJcIjsgLy9yZW1vdmUgZmlsdGVycyBzbyB0aGF0IHdlIGNhbiBhY2N1cmF0ZWx5IG1lYXN1cmUgb2Zmc2V0V2lkdGgvb2Zmc2V0SGVpZ2h0XG5cdFx0XHRcdHZhciB3ID0gdGhpcy50Lm9mZnNldFdpZHRoLFxuXHRcdFx0XHRcdGggPSB0aGlzLnQub2Zmc2V0SGVpZ2h0LFxuXHRcdFx0XHRcdGNsaXAgPSAoY3MucG9zaXRpb24gIT09IFwiYWJzb2x1dGVcIiksXG5cdFx0XHRcdFx0bSA9IFwicHJvZ2lkOkRYSW1hZ2VUcmFuc2Zvcm0uTWljcm9zb2Z0Lk1hdHJpeChNMTE9XCIgKyBhICsgXCIsIE0xMj1cIiArIGIgKyBcIiwgTTIxPVwiICsgYyArIFwiLCBNMjI9XCIgKyBkLFxuXHRcdFx0XHRcdG94ID0gdC54ICsgKHcgKiB0LnhQZXJjZW50IC8gMTAwKSxcblx0XHRcdFx0XHRveSA9IHQueSArIChoICogdC55UGVyY2VudCAvIDEwMCksXG5cdFx0XHRcdFx0ZHgsIGR5O1xuXG5cdFx0XHRcdC8vaWYgdHJhbnNmb3JtT3JpZ2luIGlzIGJlaW5nIHVzZWQsIGFkanVzdCB0aGUgb2Zmc2V0IHggYW5kIHlcblx0XHRcdFx0aWYgKHQub3ggIT0gbnVsbCkge1xuXHRcdFx0XHRcdGR4ID0gKCh0Lm94cCkgPyB3ICogdC5veCAqIDAuMDEgOiB0Lm94KSAtIHcgLyAyO1xuXHRcdFx0XHRcdGR5ID0gKCh0Lm95cCkgPyBoICogdC5veSAqIDAuMDEgOiB0Lm95KSAtIGggLyAyO1xuXHRcdFx0XHRcdG94ICs9IGR4IC0gKGR4ICogYSArIGR5ICogYik7XG5cdFx0XHRcdFx0b3kgKz0gZHkgLSAoZHggKiBjICsgZHkgKiBkKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmICghY2xpcCkge1xuXHRcdFx0XHRcdG0gKz0gXCIsIHNpemluZ01ldGhvZD0nYXV0byBleHBhbmQnKVwiO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGR4ID0gKHcgLyAyKTtcblx0XHRcdFx0XHRkeSA9IChoIC8gMik7XG5cdFx0XHRcdFx0Ly90cmFuc2xhdGUgdG8gZW5zdXJlIHRoYXQgdHJhbnNmb3JtYXRpb25zIG9jY3VyIGFyb3VuZCB0aGUgY29ycmVjdCBvcmlnaW4gKGRlZmF1bHQgaXMgY2VudGVyKS5cblx0XHRcdFx0XHRtICs9IFwiLCBEeD1cIiArIChkeCAtIChkeCAqIGEgKyBkeSAqIGIpICsgb3gpICsgXCIsIER5PVwiICsgKGR5IC0gKGR4ICogYyArIGR5ICogZCkgKyBveSkgKyBcIilcIjtcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAoZmlsdGVycy5pbmRleE9mKFwiRFhJbWFnZVRyYW5zZm9ybS5NaWNyb3NvZnQuTWF0cml4KFwiKSAhPT0gLTEpIHtcblx0XHRcdFx0XHRzdHlsZS5maWx0ZXIgPSBmaWx0ZXJzLnJlcGxhY2UoX2llU2V0TWF0cml4RXhwLCBtKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRzdHlsZS5maWx0ZXIgPSBtICsgXCIgXCIgKyBmaWx0ZXJzOyAvL3dlIG11c3QgYWx3YXlzIHB1dCB0aGUgdHJhbnNmb3JtL21hdHJpeCBGSVJTVCAoYmVmb3JlIGFscGhhKG9wYWNpdHk9eHgpKSB0byBhdm9pZCBhbiBJRSBidWcgdGhhdCBzbGljZXMgcGFydCBvZiB0aGUgb2JqZWN0IHdoZW4gcm90YXRpb24gaXMgYXBwbGllZCB3aXRoIGFscGhhLlxuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly9hdCB0aGUgZW5kIG9yIGJlZ2lubmluZyBvZiB0aGUgdHdlZW4sIGlmIHRoZSBtYXRyaXggaXMgbm9ybWFsICgxLCAwLCAwLCAxKSBhbmQgb3BhY2l0eSBpcyAxMDAgKG9yIGRvZXNuJ3QgZXhpc3QpLCByZW1vdmUgdGhlIGZpbHRlciB0byBpbXByb3ZlIGJyb3dzZXIgcGVyZm9ybWFuY2UuXG5cdFx0XHRcdGlmICh2ID09PSAwIHx8IHYgPT09IDEpIGlmIChhID09PSAxKSBpZiAoYiA9PT0gMCkgaWYgKGMgPT09IDApIGlmIChkID09PSAxKSBpZiAoIWNsaXAgfHwgbS5pbmRleE9mKFwiRHg9MCwgRHk9MFwiKSAhPT0gLTEpIGlmICghX29wYWNpdHlFeHAudGVzdChmaWx0ZXJzKSB8fCBwYXJzZUZsb2F0KFJlZ0V4cC4kMSkgPT09IDEwMCkgaWYgKGZpbHRlcnMuaW5kZXhPZihcImdyYWRpZW50KFwiICYmIGZpbHRlcnMuaW5kZXhPZihcIkFscGhhXCIpKSA9PT0gLTEpIHtcblx0XHRcdFx0XHRzdHlsZS5yZW1vdmVBdHRyaWJ1dGUoXCJmaWx0ZXJcIik7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvL3dlIG11c3Qgc2V0IHRoZSBtYXJnaW5zIEFGVEVSIGFwcGx5aW5nIHRoZSBmaWx0ZXIgaW4gb3JkZXIgdG8gYXZvaWQgc29tZSBidWdzIGluIElFOCB0aGF0IGNvdWxkIChpbiByYXJlIHNjZW5hcmlvcykgY2F1c2UgdGhlbSB0byBiZSBpZ25vcmVkIGludGVybWl0dGVudGx5ICh2aWJyYXRpb24pLlxuXHRcdFx0XHRpZiAoIWNsaXApIHtcblx0XHRcdFx0XHR2YXIgbXVsdCA9IChfaWVWZXJzIDwgOCkgPyAxIDogLTEsIC8vaW4gSW50ZXJuZXQgRXhwbG9yZXIgNyBhbmQgYmVmb3JlLCB0aGUgYm94IG1vZGVsIGlzIGJyb2tlbiwgY2F1c2luZyB0aGUgYnJvd3NlciB0byB0cmVhdCB0aGUgd2lkdGgvaGVpZ2h0IG9mIHRoZSBhY3R1YWwgcm90YXRlZCBmaWx0ZXJlZCBpbWFnZSBhcyB0aGUgd2lkdGgvaGVpZ2h0IG9mIHRoZSBib3ggaXRzZWxmLCBidXQgTWljcm9zb2Z0IGNvcnJlY3RlZCB0aGF0IGluIElFOC4gV2UgbXVzdCB1c2UgYSBuZWdhdGl2ZSBvZmZzZXQgaW4gSUU4IG9uIHRoZSByaWdodC9ib3R0b21cblx0XHRcdFx0XHRcdG1hcmcsIHByb3AsIGRpZjtcblx0XHRcdFx0XHRkeCA9IHQuaWVPZmZzZXRYIHx8IDA7XG5cdFx0XHRcdFx0ZHkgPSB0LmllT2Zmc2V0WSB8fCAwO1xuXHRcdFx0XHRcdHQuaWVPZmZzZXRYID0gTWF0aC5yb3VuZCgodyAtICgoYSA8IDAgPyAtYSA6IGEpICogdyArIChiIDwgMCA/IC1iIDogYikgKiBoKSkgLyAyICsgb3gpO1xuXHRcdFx0XHRcdHQuaWVPZmZzZXRZID0gTWF0aC5yb3VuZCgoaCAtICgoZCA8IDAgPyAtZCA6IGQpICogaCArIChjIDwgMCA/IC1jIDogYykgKiB3KSkgLyAyICsgb3kpO1xuXHRcdFx0XHRcdGZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHtcblx0XHRcdFx0XHRcdHByb3AgPSBfbWFyZ2luc1tpXTtcblx0XHRcdFx0XHRcdG1hcmcgPSBjc1twcm9wXTtcblx0XHRcdFx0XHRcdC8vd2UgbmVlZCB0byBnZXQgdGhlIGN1cnJlbnQgbWFyZ2luIGluIGNhc2UgaXQgaXMgYmVpbmcgdHdlZW5lZCBzZXBhcmF0ZWx5ICh3ZSB3YW50IHRvIHJlc3BlY3QgdGhhdCB0d2VlbidzIGNoYW5nZXMpXG5cdFx0XHRcdFx0XHR2YWwgPSAobWFyZy5pbmRleE9mKFwicHhcIikgIT09IC0xKSA/IHBhcnNlRmxvYXQobWFyZykgOiBfY29udmVydFRvUGl4ZWxzKHRoaXMudCwgcHJvcCwgcGFyc2VGbG9hdChtYXJnKSwgbWFyZy5yZXBsYWNlKF9zdWZmaXhFeHAsIFwiXCIpKSB8fCAwO1xuXHRcdFx0XHRcdFx0aWYgKHZhbCAhPT0gdFtwcm9wXSkge1xuXHRcdFx0XHRcdFx0XHRkaWYgPSAoaSA8IDIpID8gLXQuaWVPZmZzZXRYIDogLXQuaWVPZmZzZXRZOyAvL2lmIGFub3RoZXIgdHdlZW4gaXMgY29udHJvbGxpbmcgYSBtYXJnaW4sIHdlIGNhbm5vdCBvbmx5IGFwcGx5IHRoZSBkaWZmZXJlbmNlIGluIHRoZSBpZU9mZnNldHMsIHNvIHdlIGVzc2VudGlhbGx5IHplcm8tb3V0IHRoZSBkeCBhbmQgZHkgaGVyZSBpbiB0aGF0IGNhc2UuIFdlIHJlY29yZCB0aGUgbWFyZ2luKHMpIGxhdGVyIHNvIHRoYXQgd2UgY2FuIGtlZXAgY29tcGFyaW5nIHRoZW0sIG1ha2luZyB0aGlzIGNvZGUgdmVyeSBmbGV4aWJsZS5cblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdGRpZiA9IChpIDwgMikgPyBkeCAtIHQuaWVPZmZzZXRYIDogZHkgLSB0LmllT2Zmc2V0WTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdHN0eWxlW3Byb3BdID0gKHRbcHJvcF0gPSBNYXRoLnJvdW5kKCB2YWwgLSBkaWYgKiAoKGkgPT09IDAgfHwgaSA9PT0gMikgPyAxIDogbXVsdCkgKSkgKyBcInB4XCI7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9LFxuXG5cdFx0XHQvKiB0cmFuc2xhdGVzIGEgc3VwZXIgc21hbGwgZGVjaW1hbCB0byBhIHN0cmluZyBXSVRIT1VUIHNjaWVudGlmaWMgbm90YXRpb25cblx0XHRcdF9zYWZlRGVjaW1hbCA9IGZ1bmN0aW9uKG4pIHtcblx0XHRcdFx0dmFyIHMgPSAobiA8IDAgPyAtbiA6IG4pICsgXCJcIixcblx0XHRcdFx0XHRhID0gcy5zcGxpdChcImUtXCIpO1xuXHRcdFx0XHRyZXR1cm4gKG4gPCAwID8gXCItMC5cIiA6IFwiMC5cIikgKyBuZXcgQXJyYXkocGFyc2VJbnQoYVsxXSwgMTApIHx8IDApLmpvaW4oXCIwXCIpICsgYVswXS5zcGxpdChcIi5cIikuam9pbihcIlwiKTtcblx0XHRcdH0sXG5cdFx0XHQqL1xuXG5cdFx0XHRfc2V0VHJhbnNmb3JtUmF0aW8gPSBfaW50ZXJuYWxzLnNldDNEVHJhbnNmb3JtUmF0aW8gPSBfaW50ZXJuYWxzLnNldFRyYW5zZm9ybVJhdGlvID0gZnVuY3Rpb24odikge1xuXHRcdFx0XHR2YXIgdCA9IHRoaXMuZGF0YSwgLy9yZWZlcnMgdG8gdGhlIGVsZW1lbnQncyBfZ3NUcmFuc2Zvcm0gb2JqZWN0XG5cdFx0XHRcdFx0c3R5bGUgPSB0aGlzLnQuc3R5bGUsXG5cdFx0XHRcdFx0YW5nbGUgPSB0LnJvdGF0aW9uLFxuXHRcdFx0XHRcdHJvdGF0aW9uWCA9IHQucm90YXRpb25YLFxuXHRcdFx0XHRcdHJvdGF0aW9uWSA9IHQucm90YXRpb25ZLFxuXHRcdFx0XHRcdHN4ID0gdC5zY2FsZVgsXG5cdFx0XHRcdFx0c3kgPSB0LnNjYWxlWSxcblx0XHRcdFx0XHRzeiA9IHQuc2NhbGVaLFxuXHRcdFx0XHRcdHggPSB0LngsXG5cdFx0XHRcdFx0eSA9IHQueSxcblx0XHRcdFx0XHR6ID0gdC56LFxuXHRcdFx0XHRcdGlzU1ZHID0gdC5zdmcsXG5cdFx0XHRcdFx0cGVyc3BlY3RpdmUgPSB0LnBlcnNwZWN0aXZlLFxuXHRcdFx0XHRcdGZvcmNlM0QgPSB0LmZvcmNlM0QsXG5cdFx0XHRcdFx0c2tld1kgPSB0LnNrZXdZLFxuXHRcdFx0XHRcdHNrZXdYID0gdC5za2V3WCxcblx0XHRcdFx0XHR0MSxcdGExMSwgYTEyLCBhMTMsIGEyMSwgYTIyLCBhMjMsIGEzMSwgYTMyLCBhMzMsIGE0MSwgYTQyLCBhNDMsXG5cdFx0XHRcdFx0ek9yaWdpbiwgbWluLCBjb3MsIHNpbiwgdDIsIHRyYW5zZm9ybSwgY29tbWEsIHplcm8sIHNrZXcsIHJuZDtcblx0XHRcdFx0aWYgKHNrZXdZKSB7IC8vZm9yIHBlcmZvcm1hbmNlIHJlYXNvbnMsIHdlIGNvbWJpbmUgYWxsIHNrZXdpbmcgaW50byB0aGUgc2tld1ggYW5kIHJvdGF0aW9uIHZhbHVlcy4gUmVtZW1iZXIsIGEgc2tld1kgb2YgMTAgZGVncmVlcyBsb29rcyB0aGUgc2FtZSBhcyBhIHJvdGF0aW9uIG9mIDEwIGRlZ3JlZXMgcGx1cyBhIHNrZXdYIG9mIDEwIGRlZ3JlZXMuXG5cdFx0XHRcdFx0c2tld1ggKz0gc2tld1k7XG5cdFx0XHRcdFx0YW5nbGUgKz0gc2tld1k7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvL2NoZWNrIHRvIHNlZSBpZiB3ZSBzaG91bGQgcmVuZGVyIGFzIDJEIChhbmQgU1ZHcyBtdXN0IHVzZSAyRCB3aGVuIF91c2VTVkdUcmFuc2Zvcm1BdHRyIGlzIHRydWUpXG5cdFx0XHRcdGlmICgoKCgodiA9PT0gMSB8fCB2ID09PSAwKSAmJiBmb3JjZTNEID09PSBcImF1dG9cIiAmJiAodGhpcy50d2Vlbi5fdG90YWxUaW1lID09PSB0aGlzLnR3ZWVuLl90b3RhbER1cmF0aW9uIHx8ICF0aGlzLnR3ZWVuLl90b3RhbFRpbWUpKSB8fCAhZm9yY2UzRCkgJiYgIXogJiYgIXBlcnNwZWN0aXZlICYmICFyb3RhdGlvblkgJiYgIXJvdGF0aW9uWCAmJiBzeiA9PT0gMSkgfHwgKF91c2VTVkdUcmFuc2Zvcm1BdHRyICYmIGlzU1ZHKSB8fCAhX3N1cHBvcnRzM0QpIHsgLy9vbiB0aGUgZmluYWwgcmVuZGVyICh3aGljaCBjb3VsZCBiZSAwIGZvciBhIGZyb20gdHdlZW4pLCBpZiB0aGVyZSBhcmUgbm8gM0QgYXNwZWN0cywgcmVuZGVyIGluIDJEIHRvIGZyZWUgdXAgbWVtb3J5IGFuZCBpbXByb3ZlIHBlcmZvcm1hbmNlIGVzcGVjaWFsbHkgb24gbW9iaWxlIGRldmljZXMuIENoZWNrIHRoZSB0d2VlbidzIHRvdGFsVGltZS90b3RhbER1cmF0aW9uIHRvbyBpbiBvcmRlciB0byBtYWtlIHN1cmUgaXQgZG9lc24ndCBoYXBwZW4gYmV0d2VlbiByZXBlYXRzIGlmIGl0J3MgYSByZXBlYXRpbmcgdHdlZW4uXG5cblx0XHRcdFx0XHQvLzJEXG5cdFx0XHRcdFx0aWYgKGFuZ2xlIHx8IHNrZXdYIHx8IGlzU1ZHKSB7XG5cdFx0XHRcdFx0XHRhbmdsZSAqPSBfREVHMlJBRDtcblx0XHRcdFx0XHRcdHNrZXcgPSBza2V3WCAqIF9ERUcyUkFEO1xuXHRcdFx0XHRcdFx0cm5kID0gMTAwMDAwO1xuXHRcdFx0XHRcdFx0YTExID0gTWF0aC5jb3MoYW5nbGUpICogc3g7XG5cdFx0XHRcdFx0XHRhMjEgPSBNYXRoLnNpbihhbmdsZSkgKiBzeDtcblx0XHRcdFx0XHRcdGExMiA9IE1hdGguc2luKGFuZ2xlIC0gc2tldykgKiAtc3k7XG5cdFx0XHRcdFx0XHRhMjIgPSBNYXRoLmNvcyhhbmdsZSAtIHNrZXcpICogc3k7XG5cdFx0XHRcdFx0XHRpZiAoc2tldyAmJiB0LnNrZXdUeXBlID09PSBcInNpbXBsZVwiKSB7IC8vYnkgZGVmYXVsdCwgd2UgY29tcGVuc2F0ZSBza2V3aW5nIG9uIHRoZSBvdGhlciBheGlzIHRvIG1ha2UgaXQgbG9vayBtb3JlIG5hdHVyYWwsIGJ1dCB5b3UgY2FuIHNldCB0aGUgc2tld1R5cGUgdG8gXCJzaW1wbGVcIiB0byB1c2UgdGhlIHVuY29tcGVuc2F0ZWQgc2tld2luZyB0aGF0IENTUyBkb2VzXG5cdFx0XHRcdFx0XHRcdHQxID0gTWF0aC50YW4oc2tldyAtIHNrZXdZICogX0RFRzJSQUQpO1xuXHRcdFx0XHRcdFx0XHR0MSA9IE1hdGguc3FydCgxICsgdDEgKiB0MSk7XG5cdFx0XHRcdFx0XHRcdGExMiAqPSB0MTtcblx0XHRcdFx0XHRcdFx0YTIyICo9IHQxO1xuXHRcdFx0XHRcdFx0XHRpZiAoc2tld1kpIHtcblx0XHRcdFx0XHRcdFx0XHR0MSA9IE1hdGgudGFuKHNrZXdZICogX0RFRzJSQUQpO1xuXHRcdFx0XHRcdFx0XHRcdHQxID0gTWF0aC5zcXJ0KDEgKyB0MSAqIHQxKTtcblx0XHRcdFx0XHRcdFx0XHRhMTEgKj0gdDE7XG5cdFx0XHRcdFx0XHRcdFx0YTIxICo9IHQxO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRpZiAoaXNTVkcpIHtcblx0XHRcdFx0XHRcdFx0eCArPSB0LnhPcmlnaW4gLSAodC54T3JpZ2luICogYTExICsgdC55T3JpZ2luICogYTEyKSArIHQueE9mZnNldDtcblx0XHRcdFx0XHRcdFx0eSArPSB0LnlPcmlnaW4gLSAodC54T3JpZ2luICogYTIxICsgdC55T3JpZ2luICogYTIyKSArIHQueU9mZnNldDtcblx0XHRcdFx0XHRcdFx0aWYgKF91c2VTVkdUcmFuc2Zvcm1BdHRyICYmICh0LnhQZXJjZW50IHx8IHQueVBlcmNlbnQpKSB7IC8vVGhlIFNWRyBzcGVjIGRvZXNuJ3Qgc3VwcG9ydCBwZXJjZW50YWdlLWJhc2VkIHRyYW5zbGF0aW9uIGluIHRoZSBcInRyYW5zZm9ybVwiIGF0dHJpYnV0ZSwgc28gd2UgbWVyZ2UgaXQgaW50byB0aGUgbWF0cml4IHRvIHNpbXVsYXRlIGl0LlxuXHRcdFx0XHRcdFx0XHRcdG1pbiA9IHRoaXMudC5nZXRCQm94KCk7XG5cdFx0XHRcdFx0XHRcdFx0eCArPSB0LnhQZXJjZW50ICogMC4wMSAqIG1pbi53aWR0aDtcblx0XHRcdFx0XHRcdFx0XHR5ICs9IHQueVBlcmNlbnQgKiAwLjAxICogbWluLmhlaWdodDtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRtaW4gPSAwLjAwMDAwMTtcblx0XHRcdFx0XHRcdFx0aWYgKHggPCBtaW4pIGlmICh4ID4gLW1pbikge1xuXHRcdFx0XHRcdFx0XHRcdHggPSAwO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdGlmICh5IDwgbWluKSBpZiAoeSA+IC1taW4pIHtcblx0XHRcdFx0XHRcdFx0XHR5ID0gMDtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0dHJhbnNmb3JtID0gKCgoYTExICogcm5kKSB8IDApIC8gcm5kKSArIFwiLFwiICsgKCgoYTIxICogcm5kKSB8IDApIC8gcm5kKSArIFwiLFwiICsgKCgoYTEyICogcm5kKSB8IDApIC8gcm5kKSArIFwiLFwiICsgKCgoYTIyICogcm5kKSB8IDApIC8gcm5kKSArIFwiLFwiICsgeCArIFwiLFwiICsgeSArIFwiKVwiO1xuXHRcdFx0XHRcdFx0aWYgKGlzU1ZHICYmIF91c2VTVkdUcmFuc2Zvcm1BdHRyKSB7XG5cdFx0XHRcdFx0XHRcdHRoaXMudC5zZXRBdHRyaWJ1dGUoXCJ0cmFuc2Zvcm1cIiwgXCJtYXRyaXgoXCIgKyB0cmFuc2Zvcm0pO1xuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0Ly9zb21lIGJyb3dzZXJzIGhhdmUgYSBoYXJkIHRpbWUgd2l0aCB2ZXJ5IHNtYWxsIHZhbHVlcyBsaWtlIDIuNDQ5MjkzNTk4Mjk0NzA2NGUtMTYgKG5vdGljZSB0aGUgXCJlLVwiIHRvd2FyZHMgdGhlIGVuZCkgYW5kIHdvdWxkIHJlbmRlciB0aGUgb2JqZWN0IHNsaWdodGx5IG9mZi4gU28gd2Ugcm91bmQgdG8gNSBkZWNpbWFsIHBsYWNlcy5cblx0XHRcdFx0XHRcdFx0c3R5bGVbX3RyYW5zZm9ybVByb3BdID0gKCh0LnhQZXJjZW50IHx8IHQueVBlcmNlbnQpID8gXCJ0cmFuc2xhdGUoXCIgKyB0LnhQZXJjZW50ICsgXCIlLFwiICsgdC55UGVyY2VudCArIFwiJSkgbWF0cml4KFwiIDogXCJtYXRyaXgoXCIpICsgdHJhbnNmb3JtO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRzdHlsZVtfdHJhbnNmb3JtUHJvcF0gPSAoKHQueFBlcmNlbnQgfHwgdC55UGVyY2VudCkgPyBcInRyYW5zbGF0ZShcIiArIHQueFBlcmNlbnQgKyBcIiUsXCIgKyB0LnlQZXJjZW50ICsgXCIlKSBtYXRyaXgoXCIgOiBcIm1hdHJpeChcIikgKyBzeCArIFwiLDAsMCxcIiArIHN5ICsgXCIsXCIgKyB4ICsgXCIsXCIgKyB5ICsgXCIpXCI7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHJldHVybjtcblxuXHRcdFx0XHR9XG5cdFx0XHRcdGlmIChfaXNGaXJlZm94KSB7IC8vRmlyZWZveCBoYXMgYSBidWcgKGF0IGxlYXN0IGluIHYyNSkgdGhhdCBjYXVzZXMgaXQgdG8gcmVuZGVyIHRoZSB0cmFuc3BhcmVudCBwYXJ0IG9mIDMyLWJpdCBQTkcgaW1hZ2VzIGFzIGJsYWNrIHdoZW4gZGlzcGxheWVkIGluc2lkZSBhbiBpZnJhbWUgYW5kIHRoZSAzRCBzY2FsZSBpcyB2ZXJ5IHNtYWxsIGFuZCBkb2Vzbid0IGNoYW5nZSBzdWZmaWNpZW50bHkgZW5vdWdoIGJldHdlZW4gcmVuZGVycyAobGlrZSBpZiB5b3UgdXNlIGEgUG93ZXI0LmVhc2VJbk91dCB0byBzY2FsZSBmcm9tIDAgdG8gMSB3aGVyZSB0aGUgYmVnaW5uaW5nIHZhbHVlcyBvbmx5IGNoYW5nZSBhIHRpbnkgYW1vdW50IHRvIGJlZ2luIHRoZSB0d2VlbiBiZWZvcmUgYWNjZWxlcmF0aW5nKS4gSW4gdGhpcyBjYXNlLCB3ZSBmb3JjZSB0aGUgc2NhbGUgdG8gYmUgMC4wMDAwMiBpbnN0ZWFkIHdoaWNoIGlzIHZpc3VhbGx5IHRoZSBzYW1lIGJ1dCB3b3JrcyBhcm91bmQgdGhlIEZpcmVmb3ggaXNzdWUuXG5cdFx0XHRcdFx0bWluID0gMC4wMDAxO1xuXHRcdFx0XHRcdGlmIChzeCA8IG1pbiAmJiBzeCA+IC1taW4pIHtcblx0XHRcdFx0XHRcdHN4ID0gc3ogPSAwLjAwMDAyO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRpZiAoc3kgPCBtaW4gJiYgc3kgPiAtbWluKSB7XG5cdFx0XHRcdFx0XHRzeSA9IHN6ID0gMC4wMDAwMjtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0aWYgKHBlcnNwZWN0aXZlICYmICF0LnogJiYgIXQucm90YXRpb25YICYmICF0LnJvdGF0aW9uWSkgeyAvL0ZpcmVmb3ggaGFzIGEgYnVnIHRoYXQgY2F1c2VzIGVsZW1lbnRzIHRvIGhhdmUgYW4gb2RkIHN1cGVyLXRoaW4sIGJyb2tlbi9kb3R0ZWQgYmxhY2sgYm9yZGVyIG9uIGVsZW1lbnRzIHRoYXQgaGF2ZSBhIHBlcnNwZWN0aXZlIHNldCBidXQgYXJlbid0IHV0aWxpemluZyAzRCBzcGFjZSAobm8gcm90YXRpb25YLCByb3RhdGlvblksIG9yIHopLlxuXHRcdFx0XHRcdFx0cGVyc3BlY3RpdmUgPSAwO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAoYW5nbGUgfHwgc2tld1gpIHtcblx0XHRcdFx0XHRhbmdsZSAqPSBfREVHMlJBRDtcblx0XHRcdFx0XHRjb3MgPSBhMTEgPSBNYXRoLmNvcyhhbmdsZSk7XG5cdFx0XHRcdFx0c2luID0gYTIxID0gTWF0aC5zaW4oYW5nbGUpO1xuXHRcdFx0XHRcdGlmIChza2V3WCkge1xuXHRcdFx0XHRcdFx0YW5nbGUgLT0gc2tld1ggKiBfREVHMlJBRDtcblx0XHRcdFx0XHRcdGNvcyA9IE1hdGguY29zKGFuZ2xlKTtcblx0XHRcdFx0XHRcdHNpbiA9IE1hdGguc2luKGFuZ2xlKTtcblx0XHRcdFx0XHRcdGlmICh0LnNrZXdUeXBlID09PSBcInNpbXBsZVwiKSB7IC8vYnkgZGVmYXVsdCwgd2UgY29tcGVuc2F0ZSBza2V3aW5nIG9uIHRoZSBvdGhlciBheGlzIHRvIG1ha2UgaXQgbG9vayBtb3JlIG5hdHVyYWwsIGJ1dCB5b3UgY2FuIHNldCB0aGUgc2tld1R5cGUgdG8gXCJzaW1wbGVcIiB0byB1c2UgdGhlIHVuY29tcGVuc2F0ZWQgc2tld2luZyB0aGF0IENTUyBkb2VzXG5cdFx0XHRcdFx0XHRcdHQxID0gTWF0aC50YW4oKHNrZXdYIC0gc2tld1kpICogX0RFRzJSQUQpO1xuXHRcdFx0XHRcdFx0XHR0MSA9IE1hdGguc3FydCgxICsgdDEgKiB0MSk7XG5cdFx0XHRcdFx0XHRcdGNvcyAqPSB0MTtcblx0XHRcdFx0XHRcdFx0c2luICo9IHQxO1xuXHRcdFx0XHRcdFx0XHRpZiAodC5za2V3WSkge1xuXHRcdFx0XHRcdFx0XHRcdHQxID0gTWF0aC50YW4oc2tld1kgKiBfREVHMlJBRCk7XG5cdFx0XHRcdFx0XHRcdFx0dDEgPSBNYXRoLnNxcnQoMSArIHQxICogdDEpO1xuXHRcdFx0XHRcdFx0XHRcdGExMSAqPSB0MTtcblx0XHRcdFx0XHRcdFx0XHRhMjEgKj0gdDE7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0YTEyID0gLXNpbjtcblx0XHRcdFx0XHRhMjIgPSBjb3M7XG5cblx0XHRcdFx0fSBlbHNlIGlmICghcm90YXRpb25ZICYmICFyb3RhdGlvblggJiYgc3ogPT09IDEgJiYgIXBlcnNwZWN0aXZlICYmICFpc1NWRykgeyAvL2lmIHdlJ3JlIG9ubHkgdHJhbnNsYXRpbmcgYW5kL29yIDJEIHNjYWxpbmcsIHRoaXMgaXMgZmFzdGVyLi4uXG5cdFx0XHRcdFx0c3R5bGVbX3RyYW5zZm9ybVByb3BdID0gKCh0LnhQZXJjZW50IHx8IHQueVBlcmNlbnQpID8gXCJ0cmFuc2xhdGUoXCIgKyB0LnhQZXJjZW50ICsgXCIlLFwiICsgdC55UGVyY2VudCArIFwiJSkgdHJhbnNsYXRlM2QoXCIgOiBcInRyYW5zbGF0ZTNkKFwiKSArIHggKyBcInB4LFwiICsgeSArIFwicHgsXCIgKyB6ICtcInB4KVwiICsgKChzeCAhPT0gMSB8fCBzeSAhPT0gMSkgPyBcIiBzY2FsZShcIiArIHN4ICsgXCIsXCIgKyBzeSArIFwiKVwiIDogXCJcIik7XG5cdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGExMSA9IGEyMiA9IDE7XG5cdFx0XHRcdFx0YTEyID0gYTIxID0gMDtcblx0XHRcdFx0fVxuXHRcdFx0XHQvLyBLRVkgIElOREVYICAgQUZGRUNUUyBhW3Jvd11bY29sdW1uXVxuXHRcdFx0XHQvLyBhMTEgIDAgICAgICAgcm90YXRpb24sIHJvdGF0aW9uWSwgc2NhbGVYXG5cdFx0XHRcdC8vIGEyMSAgMSAgICAgICByb3RhdGlvbiwgcm90YXRpb25ZLCBzY2FsZVhcblx0XHRcdFx0Ly8gYTMxICAyICAgICAgIHJvdGF0aW9uWSwgc2NhbGVYXG5cdFx0XHRcdC8vIGE0MSAgMyAgICAgICByb3RhdGlvblksIHNjYWxlWFxuXHRcdFx0XHQvLyBhMTIgIDQgICAgICAgcm90YXRpb24sIHNrZXdYLCByb3RhdGlvblgsIHNjYWxlWVxuXHRcdFx0XHQvLyBhMjIgIDUgICAgICAgcm90YXRpb24sIHNrZXdYLCByb3RhdGlvblgsIHNjYWxlWVxuXHRcdFx0XHQvLyBhMzIgIDYgICAgICAgcm90YXRpb25YLCBzY2FsZVlcblx0XHRcdFx0Ly8gYTQyICA3ICAgICAgIHJvdGF0aW9uWCwgc2NhbGVZXG5cdFx0XHRcdC8vIGExMyAgOCAgICAgICByb3RhdGlvblksIHJvdGF0aW9uWCwgc2NhbGVaXG5cdFx0XHRcdC8vIGEyMyAgOSAgICAgICByb3RhdGlvblksIHJvdGF0aW9uWCwgc2NhbGVaXG5cdFx0XHRcdC8vIGEzMyAgMTAgICAgICByb3RhdGlvblksIHJvdGF0aW9uWCwgc2NhbGVaXG5cdFx0XHRcdC8vIGE0MyAgMTEgICAgICByb3RhdGlvblksIHJvdGF0aW9uWCwgcGVyc3BlY3RpdmUsIHNjYWxlWlxuXHRcdFx0XHQvLyBhMTQgIDEyICAgICAgeCwgek9yaWdpbiwgc3ZnT3JpZ2luXG5cdFx0XHRcdC8vIGEyNCAgMTMgICAgICB5LCB6T3JpZ2luLCBzdmdPcmlnaW5cblx0XHRcdFx0Ly8gYTM0ICAxNCAgICAgIHosIHpPcmlnaW5cblx0XHRcdFx0Ly8gYTQ0ICAxNVxuXHRcdFx0XHQvLyByb3RhdGlvbjogTWF0aC5hdGFuMihhMjEsIGExMSlcblx0XHRcdFx0Ly8gcm90YXRpb25ZOiBNYXRoLmF0YW4yKGExMywgYTMzKSAob3IgTWF0aC5hdGFuMihhMTMsIGExMSkpXG5cdFx0XHRcdC8vIHJvdGF0aW9uWDogTWF0aC5hdGFuMihhMzIsIGEzMylcblx0XHRcdFx0YTMzID0gMTtcblx0XHRcdFx0YTEzID0gYTIzID0gYTMxID0gYTMyID0gYTQxID0gYTQyID0gMDtcblx0XHRcdFx0YTQzID0gKHBlcnNwZWN0aXZlKSA/IC0xIC8gcGVyc3BlY3RpdmUgOiAwO1xuXHRcdFx0XHR6T3JpZ2luID0gdC56T3JpZ2luO1xuXHRcdFx0XHRtaW4gPSAwLjAwMDAwMTsgLy90aHJlc2hvbGQgYmVsb3cgd2hpY2ggYnJvd3NlcnMgdXNlIHNjaWVudGlmaWMgbm90YXRpb24gd2hpY2ggd29uJ3Qgd29yay5cblx0XHRcdFx0Y29tbWEgPSBcIixcIjtcblx0XHRcdFx0emVybyA9IFwiMFwiO1xuXHRcdFx0XHRhbmdsZSA9IHJvdGF0aW9uWSAqIF9ERUcyUkFEO1xuXHRcdFx0XHRpZiAoYW5nbGUpIHtcblx0XHRcdFx0XHRjb3MgPSBNYXRoLmNvcyhhbmdsZSk7XG5cdFx0XHRcdFx0c2luID0gTWF0aC5zaW4oYW5nbGUpO1xuXHRcdFx0XHRcdGEzMSA9IC1zaW47XG5cdFx0XHRcdFx0YTQxID0gYTQzKi1zaW47XG5cdFx0XHRcdFx0YTEzID0gYTExKnNpbjtcblx0XHRcdFx0XHRhMjMgPSBhMjEqc2luO1xuXHRcdFx0XHRcdGEzMyA9IGNvcztcblx0XHRcdFx0XHRhNDMgKj0gY29zO1xuXHRcdFx0XHRcdGExMSAqPSBjb3M7XG5cdFx0XHRcdFx0YTIxICo9IGNvcztcblx0XHRcdFx0fVxuXHRcdFx0XHRhbmdsZSA9IHJvdGF0aW9uWCAqIF9ERUcyUkFEO1xuXHRcdFx0XHRpZiAoYW5nbGUpIHtcblx0XHRcdFx0XHRjb3MgPSBNYXRoLmNvcyhhbmdsZSk7XG5cdFx0XHRcdFx0c2luID0gTWF0aC5zaW4oYW5nbGUpO1xuXHRcdFx0XHRcdHQxID0gYTEyKmNvcythMTMqc2luO1xuXHRcdFx0XHRcdHQyID0gYTIyKmNvcythMjMqc2luO1xuXHRcdFx0XHRcdGEzMiA9IGEzMypzaW47XG5cdFx0XHRcdFx0YTQyID0gYTQzKnNpbjtcblx0XHRcdFx0XHRhMTMgPSBhMTIqLXNpbithMTMqY29zO1xuXHRcdFx0XHRcdGEyMyA9IGEyMiotc2luK2EyMypjb3M7XG5cdFx0XHRcdFx0YTMzID0gYTMzKmNvcztcblx0XHRcdFx0XHRhNDMgPSBhNDMqY29zO1xuXHRcdFx0XHRcdGExMiA9IHQxO1xuXHRcdFx0XHRcdGEyMiA9IHQyO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmIChzeiAhPT0gMSkge1xuXHRcdFx0XHRcdGExMyo9c3o7XG5cdFx0XHRcdFx0YTIzKj1zejtcblx0XHRcdFx0XHRhMzMqPXN6O1xuXHRcdFx0XHRcdGE0Myo9c3o7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKHN5ICE9PSAxKSB7XG5cdFx0XHRcdFx0YTEyKj1zeTtcblx0XHRcdFx0XHRhMjIqPXN5O1xuXHRcdFx0XHRcdGEzMio9c3k7XG5cdFx0XHRcdFx0YTQyKj1zeTtcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAoc3ggIT09IDEpIHtcblx0XHRcdFx0XHRhMTEqPXN4O1xuXHRcdFx0XHRcdGEyMSo9c3g7XG5cdFx0XHRcdFx0YTMxKj1zeDtcblx0XHRcdFx0XHRhNDEqPXN4O1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKHpPcmlnaW4gfHwgaXNTVkcpIHtcblx0XHRcdFx0XHRpZiAoek9yaWdpbikge1xuXHRcdFx0XHRcdFx0eCArPSBhMTMqLXpPcmlnaW47XG5cdFx0XHRcdFx0XHR5ICs9IGEyMyotek9yaWdpbjtcblx0XHRcdFx0XHRcdHogKz0gYTMzKi16T3JpZ2luK3pPcmlnaW47XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGlmIChpc1NWRykgeyAvL2R1ZSB0byBidWdzIGluIHNvbWUgYnJvd3NlcnMsIHdlIG5lZWQgdG8gbWFuYWdlIHRoZSB0cmFuc2Zvcm0tb3JpZ2luIG9mIFNWRyBtYW51YWxseVxuXHRcdFx0XHRcdFx0eCArPSB0LnhPcmlnaW4gLSAodC54T3JpZ2luICogYTExICsgdC55T3JpZ2luICogYTEyKSArIHQueE9mZnNldDtcblx0XHRcdFx0XHRcdHkgKz0gdC55T3JpZ2luIC0gKHQueE9yaWdpbiAqIGEyMSArIHQueU9yaWdpbiAqIGEyMikgKyB0LnlPZmZzZXQ7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGlmICh4IDwgbWluICYmIHggPiAtbWluKSB7XG5cdFx0XHRcdFx0XHR4ID0gemVybztcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0aWYgKHkgPCBtaW4gJiYgeSA+IC1taW4pIHtcblx0XHRcdFx0XHRcdHkgPSB6ZXJvO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRpZiAoeiA8IG1pbiAmJiB6ID4gLW1pbikge1xuXHRcdFx0XHRcdFx0eiA9IDA7IC8vZG9uJ3QgdXNlIHN0cmluZyBiZWNhdXNlIHdlIGNhbGN1bGF0ZSBwZXJzcGVjdGl2ZSBsYXRlciBhbmQgbmVlZCB0aGUgbnVtYmVyLlxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vb3B0aW1pemVkIHdheSBvZiBjb25jYXRlbmF0aW5nIGFsbCB0aGUgdmFsdWVzIGludG8gYSBzdHJpbmcuIElmIHdlIGRvIGl0IGFsbCBpbiBvbmUgc2hvdCwgaXQncyBzbG93ZXIgYmVjYXVzZSBvZiB0aGUgd2F5IGJyb3dzZXJzIGhhdmUgdG8gY3JlYXRlIHRlbXAgc3RyaW5ncyBhbmQgdGhlIHdheSBpdCBhZmZlY3RzIG1lbW9yeS4gSWYgd2UgZG8gaXQgcGllY2UtYnktcGllY2Ugd2l0aCArPSwgaXQncyBhIGJpdCBzbG93ZXIgdG9vLiBXZSBmb3VuZCB0aGF0IGRvaW5nIGl0IGluIHRoZXNlIHNpemVkIGNodW5rcyB3b3JrcyBiZXN0IG92ZXJhbGw6XG5cdFx0XHRcdHRyYW5zZm9ybSA9ICgodC54UGVyY2VudCB8fCB0LnlQZXJjZW50KSA/IFwidHJhbnNsYXRlKFwiICsgdC54UGVyY2VudCArIFwiJSxcIiArIHQueVBlcmNlbnQgKyBcIiUpIG1hdHJpeDNkKFwiIDogXCJtYXRyaXgzZChcIik7XG5cdFx0XHRcdHRyYW5zZm9ybSArPSAoKGExMSA8IG1pbiAmJiBhMTEgPiAtbWluKSA/IHplcm8gOiBhMTEpICsgY29tbWEgKyAoKGEyMSA8IG1pbiAmJiBhMjEgPiAtbWluKSA/IHplcm8gOiBhMjEpICsgY29tbWEgKyAoKGEzMSA8IG1pbiAmJiBhMzEgPiAtbWluKSA/IHplcm8gOiBhMzEpO1xuXHRcdFx0XHR0cmFuc2Zvcm0gKz0gY29tbWEgKyAoKGE0MSA8IG1pbiAmJiBhNDEgPiAtbWluKSA/IHplcm8gOiBhNDEpICsgY29tbWEgKyAoKGExMiA8IG1pbiAmJiBhMTIgPiAtbWluKSA/IHplcm8gOiBhMTIpICsgY29tbWEgKyAoKGEyMiA8IG1pbiAmJiBhMjIgPiAtbWluKSA/IHplcm8gOiBhMjIpO1xuXHRcdFx0XHRpZiAocm90YXRpb25YIHx8IHJvdGF0aW9uWSB8fCBzeiAhPT0gMSkgeyAvL3BlcmZvcm1hbmNlIG9wdGltaXphdGlvbiAob2Z0ZW4gdGhlcmUncyBubyByb3RhdGlvblggb3Igcm90YXRpb25ZLCBzbyB3ZSBjYW4gc2tpcCB0aGVzZSBjYWxjdWxhdGlvbnMpXG5cdFx0XHRcdFx0dHJhbnNmb3JtICs9IGNvbW1hICsgKChhMzIgPCBtaW4gJiYgYTMyID4gLW1pbikgPyB6ZXJvIDogYTMyKSArIGNvbW1hICsgKChhNDIgPCBtaW4gJiYgYTQyID4gLW1pbikgPyB6ZXJvIDogYTQyKSArIGNvbW1hICsgKChhMTMgPCBtaW4gJiYgYTEzID4gLW1pbikgPyB6ZXJvIDogYTEzKTtcblx0XHRcdFx0XHR0cmFuc2Zvcm0gKz0gY29tbWEgKyAoKGEyMyA8IG1pbiAmJiBhMjMgPiAtbWluKSA/IHplcm8gOiBhMjMpICsgY29tbWEgKyAoKGEzMyA8IG1pbiAmJiBhMzMgPiAtbWluKSA/IHplcm8gOiBhMzMpICsgY29tbWEgKyAoKGE0MyA8IG1pbiAmJiBhNDMgPiAtbWluKSA/IHplcm8gOiBhNDMpICsgY29tbWE7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0dHJhbnNmb3JtICs9IFwiLDAsMCwwLDAsMSwwLFwiO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHRyYW5zZm9ybSArPSB4ICsgY29tbWEgKyB5ICsgY29tbWEgKyB6ICsgY29tbWEgKyAocGVyc3BlY3RpdmUgPyAoMSArICgteiAvIHBlcnNwZWN0aXZlKSkgOiAxKSArIFwiKVwiO1xuXG5cdFx0XHRcdHN0eWxlW190cmFuc2Zvcm1Qcm9wXSA9IHRyYW5zZm9ybTtcblx0XHRcdH07XG5cblx0XHRwID0gVHJhbnNmb3JtLnByb3RvdHlwZTtcblx0XHRwLnggPSBwLnkgPSBwLnogPSBwLnNrZXdYID0gcC5za2V3WSA9IHAucm90YXRpb24gPSBwLnJvdGF0aW9uWCA9IHAucm90YXRpb25ZID0gcC56T3JpZ2luID0gcC54UGVyY2VudCA9IHAueVBlcmNlbnQgPSBwLnhPZmZzZXQgPSBwLnlPZmZzZXQgPSAwO1xuXHRcdHAuc2NhbGVYID0gcC5zY2FsZVkgPSBwLnNjYWxlWiA9IDE7XG5cblx0XHRfcmVnaXN0ZXJDb21wbGV4U3BlY2lhbFByb3AoXCJ0cmFuc2Zvcm0sc2NhbGUsc2NhbGVYLHNjYWxlWSxzY2FsZVoseCx5LHoscm90YXRpb24scm90YXRpb25YLHJvdGF0aW9uWSxyb3RhdGlvblosc2tld1gsc2tld1ksc2hvcnRSb3RhdGlvbixzaG9ydFJvdGF0aW9uWCxzaG9ydFJvdGF0aW9uWSxzaG9ydFJvdGF0aW9uWix0cmFuc2Zvcm1PcmlnaW4sc3ZnT3JpZ2luLHRyYW5zZm9ybVBlcnNwZWN0aXZlLGRpcmVjdGlvbmFsUm90YXRpb24scGFyc2VUcmFuc2Zvcm0sZm9yY2UzRCxza2V3VHlwZSx4UGVyY2VudCx5UGVyY2VudCxzbW9vdGhPcmlnaW5cIiwge3BhcnNlcjpmdW5jdGlvbih0LCBlLCBwYXJzaW5nUHJvcCwgY3NzcCwgcHQsIHBsdWdpbiwgdmFycykge1xuXHRcdFx0aWYgKGNzc3AuX2xhc3RQYXJzZWRUcmFuc2Zvcm0gPT09IHZhcnMpIHsgcmV0dXJuIHB0OyB9IC8vb25seSBuZWVkIHRvIHBhcnNlIHRoZSB0cmFuc2Zvcm0gb25jZSwgYW5kIG9ubHkgaWYgdGhlIGJyb3dzZXIgc3VwcG9ydHMgaXQuXG5cdFx0XHRjc3NwLl9sYXN0UGFyc2VkVHJhbnNmb3JtID0gdmFycztcblx0XHRcdHZhciBzY2FsZUZ1bmMgPSAodmFycy5zY2FsZSAmJiB0eXBlb2YodmFycy5zY2FsZSkgPT09IFwiZnVuY3Rpb25cIikgPyB2YXJzLnNjYWxlIDogMCwgLy9pZiB0aGVyZSdzIGEgZnVuY3Rpb24tYmFzZWQgXCJzY2FsZVwiIHZhbHVlLCBzd2FwIGluIHRoZSByZXN1bHRpbmcgbnVtZXJpYyB2YWx1ZSB0ZW1wb3JhcmlseS4gT3RoZXJ3aXNlLCBpZiBpdCdzIGNhbGxlZCBmb3IgYm90aCBzY2FsZVggYW5kIHNjYWxlWSBpbmRlcGVuZGVudGx5LCB0aGV5IG1heSBub3QgbWF0Y2ggKGxpa2UgaWYgdGhlIGZ1bmN0aW9uIHVzZXMgTWF0aC5yYW5kb20oKSkuXG5cdFx0XHRcdHN3YXBGdW5jO1xuXHRcdFx0aWYgKHR5cGVvZih2YXJzW3BhcnNpbmdQcm9wXSkgPT09IFwiZnVuY3Rpb25cIikgeyAvL3doYXRldmVyIHByb3BlcnR5IHRyaWdnZXJzIHRoZSBpbml0aWFsIHBhcnNpbmcgbWlnaHQgYmUgYSBmdW5jdGlvbi1iYXNlZCB2YWx1ZSBpbiB3aGljaCBjYXNlIGl0IGFscmVhZHkgZ290IGNhbGxlZCBpbiBwYXJzZSgpLCB0aHVzIHdlIGRvbid0IHdhbnQgdG8gY2FsbCBpdCBhZ2FpbiBpbiBoZXJlLiBUaGUgbW9zdCBlZmZpY2llbnQgd2F5IHRvIGF2b2lkIHRoaXMgaXMgdG8gdGVtcG9yYXJpbHkgc3dhcCB0aGUgdmFsdWUgZGlyZWN0bHkgaW50byB0aGUgdmFycyBvYmplY3QsIGFuZCB0aGVuIGFmdGVyIHdlIGRvIGFsbCBvdXIgcGFyc2luZyBpbiB0aGlzIGZ1bmN0aW9uLCB3ZSdsbCBzd2FwIGl0IGJhY2sgYWdhaW4uXG5cdFx0XHRcdHN3YXBGdW5jID0gdmFyc1twYXJzaW5nUHJvcF07XG5cdFx0XHRcdHZhcnNbcGFyc2luZ1Byb3BdID0gZTtcblx0XHRcdH1cblx0XHRcdGlmIChzY2FsZUZ1bmMpIHtcblx0XHRcdFx0dmFycy5zY2FsZSA9IHNjYWxlRnVuYyhfaW5kZXgsIHQpO1xuXHRcdFx0fVxuXHRcdFx0dmFyIG9yaWdpbmFsR1NUcmFuc2Zvcm0gPSB0Ll9nc1RyYW5zZm9ybSxcblx0XHRcdFx0c3R5bGUgPSB0LnN0eWxlLFxuXHRcdFx0XHRtaW4gPSAwLjAwMDAwMSxcblx0XHRcdFx0aSA9IF90cmFuc2Zvcm1Qcm9wcy5sZW5ndGgsXG5cdFx0XHRcdHYgPSB2YXJzLFxuXHRcdFx0XHRlbmRSb3RhdGlvbnMgPSB7fSxcblx0XHRcdFx0dHJhbnNmb3JtT3JpZ2luU3RyaW5nID0gXCJ0cmFuc2Zvcm1PcmlnaW5cIixcblx0XHRcdFx0bTEgPSBfZ2V0VHJhbnNmb3JtKHQsIF9jcywgdHJ1ZSwgdi5wYXJzZVRyYW5zZm9ybSksXG5cdFx0XHRcdG9yaWcgPSB2LnRyYW5zZm9ybSAmJiAoKHR5cGVvZih2LnRyYW5zZm9ybSkgPT09IFwiZnVuY3Rpb25cIikgPyB2LnRyYW5zZm9ybShfaW5kZXgsIF90YXJnZXQpIDogdi50cmFuc2Zvcm0pLFxuXHRcdFx0XHRtMiwgY29weSwgaGFzM0QsIGhhc0NoYW5nZSwgZHIsIHgsIHksIG1hdHJpeCwgcDtcblx0XHRcdG0xLnNrZXdUeXBlID0gdi5za2V3VHlwZSB8fCBtMS5za2V3VHlwZSB8fCBDU1NQbHVnaW4uZGVmYXVsdFNrZXdUeXBlO1xuXHRcdFx0Y3NzcC5fdHJhbnNmb3JtID0gbTE7XG5cdFx0XHRpZiAob3JpZyAmJiB0eXBlb2Yob3JpZykgPT09IFwic3RyaW5nXCIgJiYgX3RyYW5zZm9ybVByb3ApIHsgLy9mb3IgdmFsdWVzIGxpa2UgdHJhbnNmb3JtOlwicm90YXRlKDYwZGVnKSBzY2FsZSgwLjUsIDAuOClcIlxuXHRcdFx0XHRjb3B5ID0gX3RlbXBEaXYuc3R5bGU7IC8vZG9uJ3QgdXNlIHRoZSBvcmlnaW5hbCB0YXJnZXQgYmVjYXVzZSBpdCBtaWdodCBiZSBTVkcgaW4gd2hpY2ggY2FzZSBzb21lIGJyb3dzZXJzIGRvbid0IHJlcG9ydCBjb21wdXRlZCBzdHlsZSBjb3JyZWN0bHkuXG5cdFx0XHRcdGNvcHlbX3RyYW5zZm9ybVByb3BdID0gb3JpZztcblx0XHRcdFx0Y29weS5kaXNwbGF5ID0gXCJibG9ja1wiOyAvL2lmIGRpc3BsYXkgaXMgXCJub25lXCIsIHRoZSBicm93c2VyIG9mdGVuIHJlZnVzZXMgdG8gcmVwb3J0IHRoZSB0cmFuc2Zvcm0gcHJvcGVydGllcyBjb3JyZWN0bHkuXG5cdFx0XHRcdGNvcHkucG9zaXRpb24gPSBcImFic29sdXRlXCI7XG5cdFx0XHRcdF9kb2MuYm9keS5hcHBlbmRDaGlsZChfdGVtcERpdik7XG5cdFx0XHRcdG0yID0gX2dldFRyYW5zZm9ybShfdGVtcERpdiwgbnVsbCwgZmFsc2UpO1xuXHRcdFx0XHRpZiAobTEuc2tld1R5cGUgPT09IFwic2ltcGxlXCIpIHsgLy90aGUgZGVmYXVsdCBfZ2V0VHJhbnNmb3JtKCkgcmVwb3J0cyB0aGUgc2tld1gvc2NhbGVZIGFzIGlmIHNrZXdUeXBlIGlzIFwiY29tcGVuc2F0ZWRcIiwgdGh1cyB3ZSBuZWVkIHRvIGFkanVzdCB0aGF0IGhlcmUgaWYgc2tld1R5cGUgaXMgXCJzaW1wbGVcIi5cblx0XHRcdFx0XHRtMi5zY2FsZVkgKj0gTWF0aC5jb3MobTIuc2tld1ggKiBfREVHMlJBRCk7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKG0xLnN2ZykgeyAvL2lmIGl0J3MgYW4gU1ZHIGVsZW1lbnQsIHgveSBwYXJ0IG9mIHRoZSBtYXRyaXggd2lsbCBiZSBhZmZlY3RlZCBieSB3aGF0ZXZlciB3ZSB1c2UgYXMgdGhlIG9yaWdpbiBhbmQgdGhlIG9mZnNldHMsIHNvIGNvbXBlbnNhdGUgaGVyZS4uLlxuXHRcdFx0XHRcdHggPSBtMS54T3JpZ2luO1xuXHRcdFx0XHRcdHkgPSBtMS55T3JpZ2luO1xuXHRcdFx0XHRcdG0yLnggLT0gbTEueE9mZnNldDtcblx0XHRcdFx0XHRtMi55IC09IG0xLnlPZmZzZXQ7XG5cdFx0XHRcdFx0aWYgKHYudHJhbnNmb3JtT3JpZ2luIHx8IHYuc3ZnT3JpZ2luKSB7IC8vaWYgdGhpcyB0d2VlbiBpcyBhbHRlcmluZyB0aGUgb3JpZ2luLCB3ZSBtdXN0IGZhY3RvciB0aGF0IGluIGhlcmUuIFRoZSBhY3R1YWwgd29yayBvZiByZWNvcmRpbmcgdGhlIHRyYW5zZm9ybU9yaWdpbiB2YWx1ZXMgYW5kIHNldHRpbmcgdXAgdGhlIFByb3BUd2VlbiBpcyBkb25lIGxhdGVyIChzdGlsbCBpbnNpZGUgdGhpcyBmdW5jdGlvbikgc28gd2UgY2Fubm90IGxlYXZlIHRoZSBjaGFuZ2VzIGludGFjdCBoZXJlIC0gd2Ugb25seSB3YW50IHRvIHVwZGF0ZSB0aGUgeC95IGFjY29yZGluZ2x5LlxuXHRcdFx0XHRcdFx0b3JpZyA9IHt9O1xuXHRcdFx0XHRcdFx0X3BhcnNlU1ZHT3JpZ2luKHQsIF9wYXJzZVBvc2l0aW9uKHYudHJhbnNmb3JtT3JpZ2luKSwgb3JpZywgdi5zdmdPcmlnaW4sIHYuc21vb3RoT3JpZ2luLCB0cnVlKTtcblx0XHRcdFx0XHRcdHggPSBvcmlnLnhPcmlnaW47XG5cdFx0XHRcdFx0XHR5ID0gb3JpZy55T3JpZ2luO1xuXHRcdFx0XHRcdFx0bTIueCAtPSBvcmlnLnhPZmZzZXQgLSBtMS54T2Zmc2V0O1xuXHRcdFx0XHRcdFx0bTIueSAtPSBvcmlnLnlPZmZzZXQgLSBtMS55T2Zmc2V0O1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRpZiAoeCB8fCB5KSB7XG5cdFx0XHRcdFx0XHRtYXRyaXggPSBfZ2V0TWF0cml4KF90ZW1wRGl2LCB0cnVlKTtcblx0XHRcdFx0XHRcdG0yLnggLT0geCAtICh4ICogbWF0cml4WzBdICsgeSAqIG1hdHJpeFsyXSk7XG5cdFx0XHRcdFx0XHRtMi55IC09IHkgLSAoeCAqIG1hdHJpeFsxXSArIHkgKiBtYXRyaXhbM10pO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0XHRfZG9jLmJvZHkucmVtb3ZlQ2hpbGQoX3RlbXBEaXYpO1xuXHRcdFx0XHRpZiAoIW0yLnBlcnNwZWN0aXZlKSB7XG5cdFx0XHRcdFx0bTIucGVyc3BlY3RpdmUgPSBtMS5wZXJzcGVjdGl2ZTsgLy90d2VlbmluZyB0byBubyBwZXJzcGVjdGl2ZSBnaXZlcyB2ZXJ5IHVuaW50dWl0aXZlIHJlc3VsdHMgLSBqdXN0IGtlZXAgdGhlIHNhbWUgcGVyc3BlY3RpdmUgaW4gdGhhdCBjYXNlLlxuXHRcdFx0XHR9XG5cdFx0XHRcdGlmICh2LnhQZXJjZW50ICE9IG51bGwpIHtcblx0XHRcdFx0XHRtMi54UGVyY2VudCA9IF9wYXJzZVZhbCh2LnhQZXJjZW50LCBtMS54UGVyY2VudCk7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKHYueVBlcmNlbnQgIT0gbnVsbCkge1xuXHRcdFx0XHRcdG0yLnlQZXJjZW50ID0gX3BhcnNlVmFsKHYueVBlcmNlbnQsIG0xLnlQZXJjZW50KTtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIGlmICh0eXBlb2YodikgPT09IFwib2JqZWN0XCIpIHsgLy9mb3IgdmFsdWVzIGxpa2Ugc2NhbGVYLCBzY2FsZVksIHJvdGF0aW9uLCB4LCB5LCBza2V3WCwgYW5kIHNrZXdZIG9yIHRyYW5zZm9ybTp7Li4ufSAob2JqZWN0KVxuXHRcdFx0XHRtMiA9IHtzY2FsZVg6X3BhcnNlVmFsKCh2LnNjYWxlWCAhPSBudWxsKSA/IHYuc2NhbGVYIDogdi5zY2FsZSwgbTEuc2NhbGVYKSxcblx0XHRcdFx0XHRzY2FsZVk6X3BhcnNlVmFsKCh2LnNjYWxlWSAhPSBudWxsKSA/IHYuc2NhbGVZIDogdi5zY2FsZSwgbTEuc2NhbGVZKSxcblx0XHRcdFx0XHRzY2FsZVo6X3BhcnNlVmFsKHYuc2NhbGVaLCBtMS5zY2FsZVopLFxuXHRcdFx0XHRcdHg6X3BhcnNlVmFsKHYueCwgbTEueCksXG5cdFx0XHRcdFx0eTpfcGFyc2VWYWwodi55LCBtMS55KSxcblx0XHRcdFx0XHR6Ol9wYXJzZVZhbCh2LnosIG0xLnopLFxuXHRcdFx0XHRcdHhQZXJjZW50Ol9wYXJzZVZhbCh2LnhQZXJjZW50LCBtMS54UGVyY2VudCksXG5cdFx0XHRcdFx0eVBlcmNlbnQ6X3BhcnNlVmFsKHYueVBlcmNlbnQsIG0xLnlQZXJjZW50KSxcblx0XHRcdFx0XHRwZXJzcGVjdGl2ZTpfcGFyc2VWYWwodi50cmFuc2Zvcm1QZXJzcGVjdGl2ZSwgbTEucGVyc3BlY3RpdmUpfTtcblx0XHRcdFx0ZHIgPSB2LmRpcmVjdGlvbmFsUm90YXRpb247XG5cdFx0XHRcdGlmIChkciAhPSBudWxsKSB7XG5cdFx0XHRcdFx0aWYgKHR5cGVvZihkcikgPT09IFwib2JqZWN0XCIpIHtcblx0XHRcdFx0XHRcdGZvciAoY29weSBpbiBkcikge1xuXHRcdFx0XHRcdFx0XHR2W2NvcHldID0gZHJbY29weV07XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdHYucm90YXRpb24gPSBkcjtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKHR5cGVvZih2LngpID09PSBcInN0cmluZ1wiICYmIHYueC5pbmRleE9mKFwiJVwiKSAhPT0gLTEpIHtcblx0XHRcdFx0XHRtMi54ID0gMDtcblx0XHRcdFx0XHRtMi54UGVyY2VudCA9IF9wYXJzZVZhbCh2LngsIG0xLnhQZXJjZW50KTtcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAodHlwZW9mKHYueSkgPT09IFwic3RyaW5nXCIgJiYgdi55LmluZGV4T2YoXCIlXCIpICE9PSAtMSkge1xuXHRcdFx0XHRcdG0yLnkgPSAwO1xuXHRcdFx0XHRcdG0yLnlQZXJjZW50ID0gX3BhcnNlVmFsKHYueSwgbTEueVBlcmNlbnQpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0bTIucm90YXRpb24gPSBfcGFyc2VBbmdsZSgoXCJyb3RhdGlvblwiIGluIHYpID8gdi5yb3RhdGlvbiA6IChcInNob3J0Um90YXRpb25cIiBpbiB2KSA/IHYuc2hvcnRSb3RhdGlvbiArIFwiX3Nob3J0XCIgOiAoXCJyb3RhdGlvblpcIiBpbiB2KSA/IHYucm90YXRpb25aIDogbTEucm90YXRpb24sIG0xLnJvdGF0aW9uLCBcInJvdGF0aW9uXCIsIGVuZFJvdGF0aW9ucyk7XG5cdFx0XHRcdGlmIChfc3VwcG9ydHMzRCkge1xuXHRcdFx0XHRcdG0yLnJvdGF0aW9uWCA9IF9wYXJzZUFuZ2xlKChcInJvdGF0aW9uWFwiIGluIHYpID8gdi5yb3RhdGlvblggOiAoXCJzaG9ydFJvdGF0aW9uWFwiIGluIHYpID8gdi5zaG9ydFJvdGF0aW9uWCArIFwiX3Nob3J0XCIgOiBtMS5yb3RhdGlvblggfHwgMCwgbTEucm90YXRpb25YLCBcInJvdGF0aW9uWFwiLCBlbmRSb3RhdGlvbnMpO1xuXHRcdFx0XHRcdG0yLnJvdGF0aW9uWSA9IF9wYXJzZUFuZ2xlKChcInJvdGF0aW9uWVwiIGluIHYpID8gdi5yb3RhdGlvblkgOiAoXCJzaG9ydFJvdGF0aW9uWVwiIGluIHYpID8gdi5zaG9ydFJvdGF0aW9uWSArIFwiX3Nob3J0XCIgOiBtMS5yb3RhdGlvblkgfHwgMCwgbTEucm90YXRpb25ZLCBcInJvdGF0aW9uWVwiLCBlbmRSb3RhdGlvbnMpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdG0yLnNrZXdYID0gX3BhcnNlQW5nbGUodi5za2V3WCwgbTEuc2tld1gpO1xuXHRcdFx0XHRtMi5za2V3WSA9IF9wYXJzZUFuZ2xlKHYuc2tld1ksIG0xLnNrZXdZKTtcblx0XHRcdH1cblx0XHRcdGlmIChfc3VwcG9ydHMzRCAmJiB2LmZvcmNlM0QgIT0gbnVsbCkge1xuXHRcdFx0XHRtMS5mb3JjZTNEID0gdi5mb3JjZTNEO1xuXHRcdFx0XHRoYXNDaGFuZ2UgPSB0cnVlO1xuXHRcdFx0fVxuXG5cdFx0XHRoYXMzRCA9IChtMS5mb3JjZTNEIHx8IG0xLnogfHwgbTEucm90YXRpb25YIHx8IG0xLnJvdGF0aW9uWSB8fCBtMi56IHx8IG0yLnJvdGF0aW9uWCB8fCBtMi5yb3RhdGlvblkgfHwgbTIucGVyc3BlY3RpdmUpO1xuXHRcdFx0aWYgKCFoYXMzRCAmJiB2LnNjYWxlICE9IG51bGwpIHtcblx0XHRcdFx0bTIuc2NhbGVaID0gMTsgLy9ubyBuZWVkIHRvIHR3ZWVuIHNjYWxlWi5cblx0XHRcdH1cblxuXHRcdFx0d2hpbGUgKC0taSA+IC0xKSB7XG5cdFx0XHRcdHAgPSBfdHJhbnNmb3JtUHJvcHNbaV07XG5cdFx0XHRcdG9yaWcgPSBtMltwXSAtIG0xW3BdO1xuXHRcdFx0XHRpZiAob3JpZyA+IG1pbiB8fCBvcmlnIDwgLW1pbiB8fCB2W3BdICE9IG51bGwgfHwgX2ZvcmNlUFRbcF0gIT0gbnVsbCkge1xuXHRcdFx0XHRcdGhhc0NoYW5nZSA9IHRydWU7XG5cdFx0XHRcdFx0cHQgPSBuZXcgQ1NTUHJvcFR3ZWVuKG0xLCBwLCBtMVtwXSwgb3JpZywgcHQpO1xuXHRcdFx0XHRcdGlmIChwIGluIGVuZFJvdGF0aW9ucykge1xuXHRcdFx0XHRcdFx0cHQuZSA9IGVuZFJvdGF0aW9uc1twXTsgLy9kaXJlY3Rpb25hbCByb3RhdGlvbnMgdHlwaWNhbGx5IGhhdmUgY29tcGVuc2F0ZWQgdmFsdWVzIGR1cmluZyB0aGUgdHdlZW4sIGJ1dCB3ZSBuZWVkIHRvIG1ha2Ugc3VyZSB0aGV5IGVuZCBhdCBleGFjdGx5IHdoYXQgdGhlIHVzZXIgcmVxdWVzdGVkXG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHB0LnhzMCA9IDA7IC8vZW5zdXJlcyB0aGUgdmFsdWUgc3RheXMgbnVtZXJpYyBpbiBzZXRSYXRpbygpXG5cdFx0XHRcdFx0cHQucGx1Z2luID0gcGx1Z2luO1xuXHRcdFx0XHRcdGNzc3AuX292ZXJ3cml0ZVByb3BzLnB1c2gocHQubik7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0b3JpZyA9IHYudHJhbnNmb3JtT3JpZ2luO1xuXHRcdFx0aWYgKG0xLnN2ZyAmJiAob3JpZyB8fCB2LnN2Z09yaWdpbikpIHtcblx0XHRcdFx0eCA9IG0xLnhPZmZzZXQ7IC8vd2hlbiB3ZSBjaGFuZ2UgdGhlIG9yaWdpbiwgaW4gb3JkZXIgdG8gcHJldmVudCB0aGluZ3MgZnJvbSBqdW1waW5nIHdlIGFkanVzdCB0aGUgeC95IHNvIHdlIG11c3QgcmVjb3JkIHRob3NlIGhlcmUgc28gdGhhdCB3ZSBjYW4gY3JlYXRlIFByb3BUd2VlbnMgZm9yIHRoZW0gYW5kIGZsaXAgdGhlbSBhdCB0aGUgc2FtZSB0aW1lIGFzIHRoZSBvcmlnaW5cblx0XHRcdFx0eSA9IG0xLnlPZmZzZXQ7XG5cdFx0XHRcdF9wYXJzZVNWR09yaWdpbih0LCBfcGFyc2VQb3NpdGlvbihvcmlnKSwgbTIsIHYuc3ZnT3JpZ2luLCB2LnNtb290aE9yaWdpbik7XG5cdFx0XHRcdHB0ID0gX2FkZE5vblR3ZWVuaW5nTnVtZXJpY1BUKG0xLCBcInhPcmlnaW5cIiwgKG9yaWdpbmFsR1NUcmFuc2Zvcm0gPyBtMSA6IG0yKS54T3JpZ2luLCBtMi54T3JpZ2luLCBwdCwgdHJhbnNmb3JtT3JpZ2luU3RyaW5nKTsgLy9ub3RlOiBpZiB0aGVyZSB3YXNuJ3QgYSB0cmFuc2Zvcm1PcmlnaW4gZGVmaW5lZCB5ZXQsIGp1c3Qgc3RhcnQgd2l0aCB0aGUgZGVzdGluYXRpb24gb25lOyBpdCdzIHdhc3RlZnVsIG90aGVyd2lzZSwgYW5kIGl0IGNhdXNlcyBwcm9ibGVtcyB3aXRoIGZyb21UbygpIHR3ZWVucy4gRm9yIGV4YW1wbGUsIFR3ZWVuTGl0ZS50byhcIiN3aGVlbFwiLCAzLCB7cm90YXRpb246MTgwLCB0cmFuc2Zvcm1PcmlnaW46XCI1MCUgNTAlXCIsIGRlbGF5OjF9KTsgVHdlZW5MaXRlLmZyb21UbyhcIiN3aGVlbFwiLCAzLCB7c2NhbGU6MC41LCB0cmFuc2Zvcm1PcmlnaW46XCI1MCUgNTAlXCJ9LCB7c2NhbGU6MSwgZGVsYXk6Mn0pOyB3b3VsZCBjYXVzZSBhIGp1bXAgd2hlbiB0aGUgZnJvbSB2YWx1ZXMgcmV2ZXJ0IGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIDJuZCB0d2Vlbi5cblx0XHRcdFx0cHQgPSBfYWRkTm9uVHdlZW5pbmdOdW1lcmljUFQobTEsIFwieU9yaWdpblwiLCAob3JpZ2luYWxHU1RyYW5zZm9ybSA/IG0xIDogbTIpLnlPcmlnaW4sIG0yLnlPcmlnaW4sIHB0LCB0cmFuc2Zvcm1PcmlnaW5TdHJpbmcpO1xuXHRcdFx0XHRpZiAoeCAhPT0gbTEueE9mZnNldCB8fCB5ICE9PSBtMS55T2Zmc2V0KSB7XG5cdFx0XHRcdFx0cHQgPSBfYWRkTm9uVHdlZW5pbmdOdW1lcmljUFQobTEsIFwieE9mZnNldFwiLCAob3JpZ2luYWxHU1RyYW5zZm9ybSA/IHggOiBtMS54T2Zmc2V0KSwgbTEueE9mZnNldCwgcHQsIHRyYW5zZm9ybU9yaWdpblN0cmluZyk7XG5cdFx0XHRcdFx0cHQgPSBfYWRkTm9uVHdlZW5pbmdOdW1lcmljUFQobTEsIFwieU9mZnNldFwiLCAob3JpZ2luYWxHU1RyYW5zZm9ybSA/IHkgOiBtMS55T2Zmc2V0KSwgbTEueU9mZnNldCwgcHQsIHRyYW5zZm9ybU9yaWdpblN0cmluZyk7XG5cdFx0XHRcdH1cblx0XHRcdFx0b3JpZyA9IFwiMHB4IDBweFwiOyAvL2NlcnRhaW4gYnJvd3NlcnMgKGxpa2UgZmlyZWZveCkgY29tcGxldGVseSBib3RjaCB0cmFuc2Zvcm0tb3JpZ2luLCBzbyB3ZSBtdXN0IHJlbW92ZSBpdCB0byBwcmV2ZW50IGl0IGZyb20gY29udGFtaW5hdGluZyB0cmFuc2Zvcm1zLiBXZSBtYW5hZ2UgaXQgb3Vyc2VsdmVzIHdpdGggeE9yaWdpbiBhbmQgeU9yaWdpblxuXHRcdFx0fVxuXHRcdFx0aWYgKG9yaWcgfHwgKF9zdXBwb3J0czNEICYmIGhhczNEICYmIG0xLnpPcmlnaW4pKSB7IC8vaWYgYW55dGhpbmcgM0QgaXMgaGFwcGVuaW5nIGFuZCB0aGVyZSdzIGEgdHJhbnNmb3JtT3JpZ2luIHdpdGggYSB6IGNvbXBvbmVudCB0aGF0J3Mgbm9uLXplcm8sIHdlIG11c3QgZW5zdXJlIHRoYXQgdGhlIHRyYW5zZm9ybU9yaWdpbidzIHotY29tcG9uZW50IGlzIHNldCB0byAwIHNvIHRoYXQgd2UgY2FuIG1hbnVhbGx5IGRvIHRob3NlIGNhbGN1bGF0aW9ucyB0byBnZXQgYXJvdW5kIFNhZmFyaSBidWdzLiBFdmVuIGlmIHRoZSB1c2VyIGRpZG4ndCBzcGVjaWZpY2FsbHkgZGVmaW5lIGEgXCJ0cmFuc2Zvcm1PcmlnaW5cIiBpbiB0aGlzIHBhcnRpY3VsYXIgdHdlZW4gKG1heWJlIHRoZXkgZGlkIGl0IHZpYSBjc3MgZGlyZWN0bHkpLlxuXHRcdFx0XHRpZiAoX3RyYW5zZm9ybVByb3ApIHtcblx0XHRcdFx0XHRoYXNDaGFuZ2UgPSB0cnVlO1xuXHRcdFx0XHRcdHAgPSBfdHJhbnNmb3JtT3JpZ2luUHJvcDtcblx0XHRcdFx0XHRvcmlnID0gKG9yaWcgfHwgX2dldFN0eWxlKHQsIHAsIF9jcywgZmFsc2UsIFwiNTAlIDUwJVwiKSkgKyBcIlwiOyAvL2Nhc3QgYXMgc3RyaW5nIHRvIGF2b2lkIGVycm9yc1xuXHRcdFx0XHRcdHB0ID0gbmV3IENTU1Byb3BUd2VlbihzdHlsZSwgcCwgMCwgMCwgcHQsIC0xLCB0cmFuc2Zvcm1PcmlnaW5TdHJpbmcpO1xuXHRcdFx0XHRcdHB0LmIgPSBzdHlsZVtwXTtcblx0XHRcdFx0XHRwdC5wbHVnaW4gPSBwbHVnaW47XG5cdFx0XHRcdFx0aWYgKF9zdXBwb3J0czNEKSB7XG5cdFx0XHRcdFx0XHRjb3B5ID0gbTEuek9yaWdpbjtcblx0XHRcdFx0XHRcdG9yaWcgPSBvcmlnLnNwbGl0KFwiIFwiKTtcblx0XHRcdFx0XHRcdG0xLnpPcmlnaW4gPSAoKG9yaWcubGVuZ3RoID4gMiAmJiAhKGNvcHkgIT09IDAgJiYgb3JpZ1syXSA9PT0gXCIwcHhcIikpID8gcGFyc2VGbG9hdChvcmlnWzJdKSA6IGNvcHkpIHx8IDA7IC8vU2FmYXJpIGRvZXNuJ3QgaGFuZGxlIHRoZSB6IHBhcnQgb2YgdHJhbnNmb3JtT3JpZ2luIGNvcnJlY3RseSwgc28gd2UnbGwgbWFudWFsbHkgaGFuZGxlIGl0IGluIHRoZSBfc2V0M0RUcmFuc2Zvcm1SYXRpbygpIG1ldGhvZC5cblx0XHRcdFx0XHRcdHB0LnhzMCA9IHB0LmUgPSBvcmlnWzBdICsgXCIgXCIgKyAob3JpZ1sxXSB8fCBcIjUwJVwiKSArIFwiIDBweFwiOyAvL3dlIG11c3QgZGVmaW5lIGEgeiB2YWx1ZSBvZiAwcHggc3BlY2lmaWNhbGx5IG90aGVyd2lzZSBpT1MgNSBTYWZhcmkgd2lsbCBzdGljayB3aXRoIHRoZSBvbGQgb25lIChpZiBvbmUgd2FzIGRlZmluZWQpIVxuXHRcdFx0XHRcdFx0cHQgPSBuZXcgQ1NTUHJvcFR3ZWVuKG0xLCBcInpPcmlnaW5cIiwgMCwgMCwgcHQsIC0xLCBwdC5uKTsgLy93ZSBtdXN0IGNyZWF0ZSBhIENTU1Byb3BUd2VlbiBmb3IgdGhlIF9nc1RyYW5zZm9ybS56T3JpZ2luIHNvIHRoYXQgaXQgZ2V0cyByZXNldCBwcm9wZXJseSBhdCB0aGUgYmVnaW5uaW5nIGlmIHRoZSB0d2VlbiBydW5zIGJhY2t3YXJkIChhcyBvcHBvc2VkIHRvIGp1c3Qgc2V0dGluZyBtMS56T3JpZ2luIGhlcmUpXG5cdFx0XHRcdFx0XHRwdC5iID0gY29weTtcblx0XHRcdFx0XHRcdHB0LnhzMCA9IHB0LmUgPSBtMS56T3JpZ2luO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRwdC54czAgPSBwdC5lID0gb3JpZztcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHQvL2ZvciBvbGRlciB2ZXJzaW9ucyBvZiBJRSAoNi04KSwgd2UgbmVlZCB0byBtYW51YWxseSBjYWxjdWxhdGUgdGhpbmdzIGluc2lkZSB0aGUgc2V0UmF0aW8oKSBmdW5jdGlvbi4gV2UgcmVjb3JkIG9yaWdpbiB4IGFuZCB5IChveCBhbmQgb3kpIGFuZCB3aGV0aGVyIG9yIG5vdCB0aGUgdmFsdWVzIGFyZSBwZXJjZW50YWdlcyAob3hwIGFuZCBveXApLlxuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdF9wYXJzZVBvc2l0aW9uKG9yaWcgKyBcIlwiLCBtMSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdGlmIChoYXNDaGFuZ2UpIHtcblx0XHRcdFx0Y3NzcC5fdHJhbnNmb3JtVHlwZSA9ICghKG0xLnN2ZyAmJiBfdXNlU1ZHVHJhbnNmb3JtQXR0cikgJiYgKGhhczNEIHx8IHRoaXMuX3RyYW5zZm9ybVR5cGUgPT09IDMpKSA/IDMgOiAyOyAvL3F1aWNrZXIgdGhhbiBjYWxsaW5nIGNzc3AuX2VuYWJsZVRyYW5zZm9ybXMoKTtcblx0XHRcdH1cblx0XHRcdGlmIChzd2FwRnVuYykge1xuXHRcdFx0XHR2YXJzW3BhcnNpbmdQcm9wXSA9IHN3YXBGdW5jO1xuXHRcdFx0fVxuXHRcdFx0aWYgKHNjYWxlRnVuYykge1xuXHRcdFx0XHR2YXJzLnNjYWxlID0gc2NhbGVGdW5jO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHB0O1xuXHRcdH0sIHByZWZpeDp0cnVlfSk7XG5cblx0XHRfcmVnaXN0ZXJDb21wbGV4U3BlY2lhbFByb3AoXCJib3hTaGFkb3dcIiwge2RlZmF1bHRWYWx1ZTpcIjBweCAwcHggMHB4IDBweCAjOTk5XCIsIHByZWZpeDp0cnVlLCBjb2xvcjp0cnVlLCBtdWx0aTp0cnVlLCBrZXl3b3JkOlwiaW5zZXRcIn0pO1xuXG5cdFx0X3JlZ2lzdGVyQ29tcGxleFNwZWNpYWxQcm9wKFwiYm9yZGVyUmFkaXVzXCIsIHtkZWZhdWx0VmFsdWU6XCIwcHhcIiwgcGFyc2VyOmZ1bmN0aW9uKHQsIGUsIHAsIGNzc3AsIHB0LCBwbHVnaW4pIHtcblx0XHRcdGUgPSB0aGlzLmZvcm1hdChlKTtcblx0XHRcdHZhciBwcm9wcyA9IFtcImJvcmRlclRvcExlZnRSYWRpdXNcIixcImJvcmRlclRvcFJpZ2h0UmFkaXVzXCIsXCJib3JkZXJCb3R0b21SaWdodFJhZGl1c1wiLFwiYm9yZGVyQm90dG9tTGVmdFJhZGl1c1wiXSxcblx0XHRcdFx0c3R5bGUgPSB0LnN0eWxlLFxuXHRcdFx0XHRlYTEsIGksIGVzMiwgYnMyLCBicywgZXMsIGJuLCBlbiwgdywgaCwgZXNmeCwgYnNmeCwgcmVsLCBobiwgdm4sIGVtO1xuXHRcdFx0dyA9IHBhcnNlRmxvYXQodC5vZmZzZXRXaWR0aCk7XG5cdFx0XHRoID0gcGFyc2VGbG9hdCh0Lm9mZnNldEhlaWdodCk7XG5cdFx0XHRlYTEgPSBlLnNwbGl0KFwiIFwiKTtcblx0XHRcdGZvciAoaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykgeyAvL2lmIHdlJ3JlIGRlYWxpbmcgd2l0aCBwZXJjZW50YWdlcywgd2UgbXVzdCBjb252ZXJ0IHRoaW5ncyBzZXBhcmF0ZWx5IGZvciB0aGUgaG9yaXpvbnRhbCBhbmQgdmVydGljYWwgYXhpcyFcblx0XHRcdFx0aWYgKHRoaXMucC5pbmRleE9mKFwiYm9yZGVyXCIpKSB7IC8vb2xkZXIgYnJvd3NlcnMgdXNlZCBhIHByZWZpeFxuXHRcdFx0XHRcdHByb3BzW2ldID0gX2NoZWNrUHJvcFByZWZpeChwcm9wc1tpXSk7XG5cdFx0XHRcdH1cblx0XHRcdFx0YnMgPSBiczIgPSBfZ2V0U3R5bGUodCwgcHJvcHNbaV0sIF9jcywgZmFsc2UsIFwiMHB4XCIpO1xuXHRcdFx0XHRpZiAoYnMuaW5kZXhPZihcIiBcIikgIT09IC0xKSB7XG5cdFx0XHRcdFx0YnMyID0gYnMuc3BsaXQoXCIgXCIpO1xuXHRcdFx0XHRcdGJzID0gYnMyWzBdO1xuXHRcdFx0XHRcdGJzMiA9IGJzMlsxXTtcblx0XHRcdFx0fVxuXHRcdFx0XHRlcyA9IGVzMiA9IGVhMVtpXTtcblx0XHRcdFx0Ym4gPSBwYXJzZUZsb2F0KGJzKTtcblx0XHRcdFx0YnNmeCA9IGJzLnN1YnN0cigoYm4gKyBcIlwiKS5sZW5ndGgpO1xuXHRcdFx0XHRyZWwgPSAoZXMuY2hhckF0KDEpID09PSBcIj1cIik7XG5cdFx0XHRcdGlmIChyZWwpIHtcblx0XHRcdFx0XHRlbiA9IHBhcnNlSW50KGVzLmNoYXJBdCgwKStcIjFcIiwgMTApO1xuXHRcdFx0XHRcdGVzID0gZXMuc3Vic3RyKDIpO1xuXHRcdFx0XHRcdGVuICo9IHBhcnNlRmxvYXQoZXMpO1xuXHRcdFx0XHRcdGVzZnggPSBlcy5zdWJzdHIoKGVuICsgXCJcIikubGVuZ3RoIC0gKGVuIDwgMCA/IDEgOiAwKSkgfHwgXCJcIjtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRlbiA9IHBhcnNlRmxvYXQoZXMpO1xuXHRcdFx0XHRcdGVzZnggPSBlcy5zdWJzdHIoKGVuICsgXCJcIikubGVuZ3RoKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAoZXNmeCA9PT0gXCJcIikge1xuXHRcdFx0XHRcdGVzZnggPSBfc3VmZml4TWFwW3BdIHx8IGJzZng7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKGVzZnggIT09IGJzZngpIHtcblx0XHRcdFx0XHRobiA9IF9jb252ZXJ0VG9QaXhlbHModCwgXCJib3JkZXJMZWZ0XCIsIGJuLCBic2Z4KTsgLy9ob3Jpem9udGFsIG51bWJlciAod2UgdXNlIGEgYm9ndXMgXCJib3JkZXJMZWZ0XCIgcHJvcGVydHkganVzdCBiZWNhdXNlIHRoZSBfY29udmVydFRvUGl4ZWxzKCkgbWV0aG9kIHNlYXJjaGVzIGZvciB0aGUga2V5d29yZHMgXCJMZWZ0XCIsIFwiUmlnaHRcIiwgXCJUb3BcIiwgYW5kIFwiQm90dG9tXCIgdG8gZGV0ZXJtaW5lIG9mIGl0J3MgYSBob3Jpem9udGFsIG9yIHZlcnRpY2FsIHByb3BlcnR5LCBhbmQgd2UgbmVlZCBcImJvcmRlclwiIGluIHRoZSBuYW1lIHNvIHRoYXQgaXQga25vd3MgaXQgc2hvdWxkIG1lYXN1cmUgcmVsYXRpdmUgdG8gdGhlIGVsZW1lbnQgaXRzZWxmLCBub3QgaXRzIHBhcmVudC5cblx0XHRcdFx0XHR2biA9IF9jb252ZXJ0VG9QaXhlbHModCwgXCJib3JkZXJUb3BcIiwgYm4sIGJzZngpOyAvL3ZlcnRpY2FsIG51bWJlclxuXHRcdFx0XHRcdGlmIChlc2Z4ID09PSBcIiVcIikge1xuXHRcdFx0XHRcdFx0YnMgPSAoaG4gLyB3ICogMTAwKSArIFwiJVwiO1xuXHRcdFx0XHRcdFx0YnMyID0gKHZuIC8gaCAqIDEwMCkgKyBcIiVcIjtcblx0XHRcdFx0XHR9IGVsc2UgaWYgKGVzZnggPT09IFwiZW1cIikge1xuXHRcdFx0XHRcdFx0ZW0gPSBfY29udmVydFRvUGl4ZWxzKHQsIFwiYm9yZGVyTGVmdFwiLCAxLCBcImVtXCIpO1xuXHRcdFx0XHRcdFx0YnMgPSAoaG4gLyBlbSkgKyBcImVtXCI7XG5cdFx0XHRcdFx0XHRiczIgPSAodm4gLyBlbSkgKyBcImVtXCI7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdGJzID0gaG4gKyBcInB4XCI7XG5cdFx0XHRcdFx0XHRiczIgPSB2biArIFwicHhcIjtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0aWYgKHJlbCkge1xuXHRcdFx0XHRcdFx0ZXMgPSAocGFyc2VGbG9hdChicykgKyBlbikgKyBlc2Z4O1xuXHRcdFx0XHRcdFx0ZXMyID0gKHBhcnNlRmxvYXQoYnMyKSArIGVuKSArIGVzZng7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdHB0ID0gX3BhcnNlQ29tcGxleChzdHlsZSwgcHJvcHNbaV0sIGJzICsgXCIgXCIgKyBiczIsIGVzICsgXCIgXCIgKyBlczIsIGZhbHNlLCBcIjBweFwiLCBwdCk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gcHQ7XG5cdFx0fSwgcHJlZml4OnRydWUsIGZvcm1hdHRlcjpfZ2V0Rm9ybWF0dGVyKFwiMHB4IDBweCAwcHggMHB4XCIsIGZhbHNlLCB0cnVlKX0pO1xuXHRcdF9yZWdpc3RlckNvbXBsZXhTcGVjaWFsUHJvcChcImJvcmRlckJvdHRvbUxlZnRSYWRpdXMsYm9yZGVyQm90dG9tUmlnaHRSYWRpdXMsYm9yZGVyVG9wTGVmdFJhZGl1cyxib3JkZXJUb3BSaWdodFJhZGl1c1wiLCB7ZGVmYXVsdFZhbHVlOlwiMHB4XCIsIHBhcnNlcjpmdW5jdGlvbih0LCBlLCBwLCBjc3NwLCBwdCwgcGx1Z2luKSB7XG5cdFx0XHRyZXR1cm4gX3BhcnNlQ29tcGxleCh0LnN0eWxlLCBwLCB0aGlzLmZvcm1hdChfZ2V0U3R5bGUodCwgcCwgX2NzLCBmYWxzZSwgXCIwcHggMHB4XCIpKSwgdGhpcy5mb3JtYXQoZSksIGZhbHNlLCBcIjBweFwiLCBwdCk7XG5cdFx0fSwgcHJlZml4OnRydWUsIGZvcm1hdHRlcjpfZ2V0Rm9ybWF0dGVyKFwiMHB4IDBweFwiLCBmYWxzZSwgdHJ1ZSl9KTtcblx0XHRfcmVnaXN0ZXJDb21wbGV4U3BlY2lhbFByb3AoXCJiYWNrZ3JvdW5kUG9zaXRpb25cIiwge2RlZmF1bHRWYWx1ZTpcIjAgMFwiLCBwYXJzZXI6ZnVuY3Rpb24odCwgZSwgcCwgY3NzcCwgcHQsIHBsdWdpbikge1xuXHRcdFx0dmFyIGJwID0gXCJiYWNrZ3JvdW5kLXBvc2l0aW9uXCIsXG5cdFx0XHRcdGNzID0gKF9jcyB8fCBfZ2V0Q29tcHV0ZWRTdHlsZSh0LCBudWxsKSksXG5cdFx0XHRcdGJzID0gdGhpcy5mb3JtYXQoICgoY3MpID8gX2llVmVycyA/IGNzLmdldFByb3BlcnR5VmFsdWUoYnAgKyBcIi14XCIpICsgXCIgXCIgKyBjcy5nZXRQcm9wZXJ0eVZhbHVlKGJwICsgXCIteVwiKSA6IGNzLmdldFByb3BlcnR5VmFsdWUoYnApIDogdC5jdXJyZW50U3R5bGUuYmFja2dyb3VuZFBvc2l0aW9uWCArIFwiIFwiICsgdC5jdXJyZW50U3R5bGUuYmFja2dyb3VuZFBvc2l0aW9uWSkgfHwgXCIwIDBcIiksIC8vSW50ZXJuZXQgRXhwbG9yZXIgZG9lc24ndCByZXBvcnQgYmFja2dyb3VuZC1wb3NpdGlvbiBjb3JyZWN0bHkgLSB3ZSBtdXN0IHF1ZXJ5IGJhY2tncm91bmQtcG9zaXRpb24teCBhbmQgYmFja2dyb3VuZC1wb3NpdGlvbi15IGFuZCBjb21iaW5lIHRoZW0gKGV2ZW4gaW4gSUUxMCkuIEJlZm9yZSBJRTksIHdlIG11c3QgZG8gdGhlIHNhbWUgd2l0aCB0aGUgY3VycmVudFN0eWxlIG9iamVjdCBhbmQgdXNlIGNhbWVsQ2FzZVxuXHRcdFx0XHRlcyA9IHRoaXMuZm9ybWF0KGUpLFxuXHRcdFx0XHRiYSwgZWEsIGksIHBjdCwgb3ZlcmxhcCwgc3JjO1xuXHRcdFx0aWYgKChicy5pbmRleE9mKFwiJVwiKSAhPT0gLTEpICE9PSAoZXMuaW5kZXhPZihcIiVcIikgIT09IC0xKSAmJiBlcy5zcGxpdChcIixcIikubGVuZ3RoIDwgMikge1xuXHRcdFx0XHRzcmMgPSBfZ2V0U3R5bGUodCwgXCJiYWNrZ3JvdW5kSW1hZ2VcIikucmVwbGFjZShfdXJsRXhwLCBcIlwiKTtcblx0XHRcdFx0aWYgKHNyYyAmJiBzcmMgIT09IFwibm9uZVwiKSB7XG5cdFx0XHRcdFx0YmEgPSBicy5zcGxpdChcIiBcIik7XG5cdFx0XHRcdFx0ZWEgPSBlcy5zcGxpdChcIiBcIik7XG5cdFx0XHRcdFx0X3RlbXBJbWcuc2V0QXR0cmlidXRlKFwic3JjXCIsIHNyYyk7IC8vc2V0IHRoZSB0ZW1wIElNRydzIHNyYyB0byB0aGUgYmFja2dyb3VuZC1pbWFnZSBzbyB0aGF0IHdlIGNhbiBtZWFzdXJlIGl0cyB3aWR0aC9oZWlnaHRcblx0XHRcdFx0XHRpID0gMjtcblx0XHRcdFx0XHR3aGlsZSAoLS1pID4gLTEpIHtcblx0XHRcdFx0XHRcdGJzID0gYmFbaV07XG5cdFx0XHRcdFx0XHRwY3QgPSAoYnMuaW5kZXhPZihcIiVcIikgIT09IC0xKTtcblx0XHRcdFx0XHRcdGlmIChwY3QgIT09IChlYVtpXS5pbmRleE9mKFwiJVwiKSAhPT0gLTEpKSB7XG5cdFx0XHRcdFx0XHRcdG92ZXJsYXAgPSAoaSA9PT0gMCkgPyB0Lm9mZnNldFdpZHRoIC0gX3RlbXBJbWcud2lkdGggOiB0Lm9mZnNldEhlaWdodCAtIF90ZW1wSW1nLmhlaWdodDtcblx0XHRcdFx0XHRcdFx0YmFbaV0gPSBwY3QgPyAocGFyc2VGbG9hdChicykgLyAxMDAgKiBvdmVybGFwKSArIFwicHhcIiA6IChwYXJzZUZsb2F0KGJzKSAvIG92ZXJsYXAgKiAxMDApICsgXCIlXCI7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGJzID0gYmEuam9pbihcIiBcIik7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdHJldHVybiB0aGlzLnBhcnNlQ29tcGxleCh0LnN0eWxlLCBicywgZXMsIHB0LCBwbHVnaW4pO1xuXHRcdH0sIGZvcm1hdHRlcjpfcGFyc2VQb3NpdGlvbn0pO1xuXHRcdF9yZWdpc3RlckNvbXBsZXhTcGVjaWFsUHJvcChcImJhY2tncm91bmRTaXplXCIsIHtkZWZhdWx0VmFsdWU6XCIwIDBcIiwgZm9ybWF0dGVyOmZ1bmN0aW9uKHYpIHtcblx0XHRcdHYgKz0gXCJcIjsgLy9lbnN1cmUgaXQncyBhIHN0cmluZ1xuXHRcdFx0cmV0dXJuIF9wYXJzZVBvc2l0aW9uKHYuaW5kZXhPZihcIiBcIikgPT09IC0xID8gdiArIFwiIFwiICsgdiA6IHYpOyAvL2lmIHNldCB0byBzb21ldGhpbmcgbGlrZSBcIjEwMCUgMTAwJVwiLCBTYWZhcmkgdHlwaWNhbGx5IHJlcG9ydHMgdGhlIGNvbXB1dGVkIHN0eWxlIGFzIGp1c3QgXCIxMDAlXCIgKG5vIDJuZCB2YWx1ZSksIGJ1dCB3ZSBzaG91bGQgZW5zdXJlIHRoYXQgdGhlcmUgYXJlIHR3byB2YWx1ZXMsIHNvIGNvcHkgdGhlIGZpcnN0IG9uZS4gT3RoZXJ3aXNlLCBpdCdkIGJlIGludGVycHJldGVkIGFzIFwiMTAwJSAwXCIgKHdyb25nKS5cblx0XHR9fSk7XG5cdFx0X3JlZ2lzdGVyQ29tcGxleFNwZWNpYWxQcm9wKFwicGVyc3BlY3RpdmVcIiwge2RlZmF1bHRWYWx1ZTpcIjBweFwiLCBwcmVmaXg6dHJ1ZX0pO1xuXHRcdF9yZWdpc3RlckNvbXBsZXhTcGVjaWFsUHJvcChcInBlcnNwZWN0aXZlT3JpZ2luXCIsIHtkZWZhdWx0VmFsdWU6XCI1MCUgNTAlXCIsIHByZWZpeDp0cnVlfSk7XG5cdFx0X3JlZ2lzdGVyQ29tcGxleFNwZWNpYWxQcm9wKFwidHJhbnNmb3JtU3R5bGVcIiwge3ByZWZpeDp0cnVlfSk7XG5cdFx0X3JlZ2lzdGVyQ29tcGxleFNwZWNpYWxQcm9wKFwiYmFja2ZhY2VWaXNpYmlsaXR5XCIsIHtwcmVmaXg6dHJ1ZX0pO1xuXHRcdF9yZWdpc3RlckNvbXBsZXhTcGVjaWFsUHJvcChcInVzZXJTZWxlY3RcIiwge3ByZWZpeDp0cnVlfSk7XG5cdFx0X3JlZ2lzdGVyQ29tcGxleFNwZWNpYWxQcm9wKFwibWFyZ2luXCIsIHtwYXJzZXI6X2dldEVkZ2VQYXJzZXIoXCJtYXJnaW5Ub3AsbWFyZ2luUmlnaHQsbWFyZ2luQm90dG9tLG1hcmdpbkxlZnRcIil9KTtcblx0XHRfcmVnaXN0ZXJDb21wbGV4U3BlY2lhbFByb3AoXCJwYWRkaW5nXCIsIHtwYXJzZXI6X2dldEVkZ2VQYXJzZXIoXCJwYWRkaW5nVG9wLHBhZGRpbmdSaWdodCxwYWRkaW5nQm90dG9tLHBhZGRpbmdMZWZ0XCIpfSk7XG5cdFx0X3JlZ2lzdGVyQ29tcGxleFNwZWNpYWxQcm9wKFwiY2xpcFwiLCB7ZGVmYXVsdFZhbHVlOlwicmVjdCgwcHgsMHB4LDBweCwwcHgpXCIsIHBhcnNlcjpmdW5jdGlvbih0LCBlLCBwLCBjc3NwLCBwdCwgcGx1Z2luKXtcblx0XHRcdHZhciBiLCBjcywgZGVsaW07XG5cdFx0XHRpZiAoX2llVmVycyA8IDkpIHsgLy9JRTggYW5kIGVhcmxpZXIgZG9uJ3QgcmVwb3J0IGEgXCJjbGlwXCIgdmFsdWUgaW4gdGhlIGN1cnJlbnRTdHlsZSAtIGluc3RlYWQsIHRoZSB2YWx1ZXMgYXJlIHNwbGl0IGFwYXJ0IGludG8gY2xpcFRvcCwgY2xpcFJpZ2h0LCBjbGlwQm90dG9tLCBhbmQgY2xpcExlZnQuIEFsc28sIGluIElFNyBhbmQgZWFybGllciwgdGhlIHZhbHVlcyBpbnNpZGUgcmVjdCgpIGFyZSBzcGFjZS1kZWxpbWl0ZWQsIG5vdCBjb21tYS1kZWxpbWl0ZWQuXG5cdFx0XHRcdGNzID0gdC5jdXJyZW50U3R5bGU7XG5cdFx0XHRcdGRlbGltID0gX2llVmVycyA8IDggPyBcIiBcIiA6IFwiLFwiO1xuXHRcdFx0XHRiID0gXCJyZWN0KFwiICsgY3MuY2xpcFRvcCArIGRlbGltICsgY3MuY2xpcFJpZ2h0ICsgZGVsaW0gKyBjcy5jbGlwQm90dG9tICsgZGVsaW0gKyBjcy5jbGlwTGVmdCArIFwiKVwiO1xuXHRcdFx0XHRlID0gdGhpcy5mb3JtYXQoZSkuc3BsaXQoXCIsXCIpLmpvaW4oZGVsaW0pO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0YiA9IHRoaXMuZm9ybWF0KF9nZXRTdHlsZSh0LCB0aGlzLnAsIF9jcywgZmFsc2UsIHRoaXMuZGZsdCkpO1xuXHRcdFx0XHRlID0gdGhpcy5mb3JtYXQoZSk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gdGhpcy5wYXJzZUNvbXBsZXgodC5zdHlsZSwgYiwgZSwgcHQsIHBsdWdpbik7XG5cdFx0fX0pO1xuXHRcdF9yZWdpc3RlckNvbXBsZXhTcGVjaWFsUHJvcChcInRleHRTaGFkb3dcIiwge2RlZmF1bHRWYWx1ZTpcIjBweCAwcHggMHB4ICM5OTlcIiwgY29sb3I6dHJ1ZSwgbXVsdGk6dHJ1ZX0pO1xuXHRcdF9yZWdpc3RlckNvbXBsZXhTcGVjaWFsUHJvcChcImF1dG9Sb3VuZCxzdHJpY3RVbml0c1wiLCB7cGFyc2VyOmZ1bmN0aW9uKHQsIGUsIHAsIGNzc3AsIHB0KSB7cmV0dXJuIHB0O319KTsgLy9qdXN0IHNvIHRoYXQgd2UgY2FuIGlnbm9yZSB0aGVzZSBwcm9wZXJ0aWVzIChub3QgdHdlZW4gdGhlbSlcblx0XHRfcmVnaXN0ZXJDb21wbGV4U3BlY2lhbFByb3AoXCJib3JkZXJcIiwge2RlZmF1bHRWYWx1ZTpcIjBweCBzb2xpZCAjMDAwXCIsIHBhcnNlcjpmdW5jdGlvbih0LCBlLCBwLCBjc3NwLCBwdCwgcGx1Z2luKSB7XG5cdFx0XHR2YXIgYncgPSBfZ2V0U3R5bGUodCwgXCJib3JkZXJUb3BXaWR0aFwiLCBfY3MsIGZhbHNlLCBcIjBweFwiKSxcblx0XHRcdFx0ZW5kID0gdGhpcy5mb3JtYXQoZSkuc3BsaXQoXCIgXCIpLFxuXHRcdFx0XHRlc2Z4ID0gZW5kWzBdLnJlcGxhY2UoX3N1ZmZpeEV4cCwgXCJcIik7XG5cdFx0XHRpZiAoZXNmeCAhPT0gXCJweFwiKSB7IC8vaWYgd2UncmUgYW5pbWF0aW5nIHRvIGEgbm9uLXB4IHZhbHVlLCB3ZSBuZWVkIHRvIGNvbnZlcnQgdGhlIGJlZ2lubmluZyB3aWR0aCB0byB0aGF0IHVuaXQuXG5cdFx0XHRcdGJ3ID0gKHBhcnNlRmxvYXQoYncpIC8gX2NvbnZlcnRUb1BpeGVscyh0LCBcImJvcmRlclRvcFdpZHRoXCIsIDEsIGVzZngpKSArIGVzZng7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gdGhpcy5wYXJzZUNvbXBsZXgodC5zdHlsZSwgdGhpcy5mb3JtYXQoYncgKyBcIiBcIiArIF9nZXRTdHlsZSh0LCBcImJvcmRlclRvcFN0eWxlXCIsIF9jcywgZmFsc2UsIFwic29saWRcIikgKyBcIiBcIiArIF9nZXRTdHlsZSh0LCBcImJvcmRlclRvcENvbG9yXCIsIF9jcywgZmFsc2UsIFwiIzAwMFwiKSksIGVuZC5qb2luKFwiIFwiKSwgcHQsIHBsdWdpbik7XG5cdFx0XHR9LCBjb2xvcjp0cnVlLCBmb3JtYXR0ZXI6ZnVuY3Rpb24odikge1xuXHRcdFx0XHR2YXIgYSA9IHYuc3BsaXQoXCIgXCIpO1xuXHRcdFx0XHRyZXR1cm4gYVswXSArIFwiIFwiICsgKGFbMV0gfHwgXCJzb2xpZFwiKSArIFwiIFwiICsgKHYubWF0Y2goX2NvbG9yRXhwKSB8fCBbXCIjMDAwXCJdKVswXTtcblx0XHRcdH19KTtcblx0XHRfcmVnaXN0ZXJDb21wbGV4U3BlY2lhbFByb3AoXCJib3JkZXJXaWR0aFwiLCB7cGFyc2VyOl9nZXRFZGdlUGFyc2VyKFwiYm9yZGVyVG9wV2lkdGgsYm9yZGVyUmlnaHRXaWR0aCxib3JkZXJCb3R0b21XaWR0aCxib3JkZXJMZWZ0V2lkdGhcIil9KTsgLy9GaXJlZm94IGRvZXNuJ3QgcGljayB1cCBvbiBib3JkZXJXaWR0aCBzZXQgaW4gc3R5bGUgc2hlZXRzIChvbmx5IGlubGluZSkuXG5cdFx0X3JlZ2lzdGVyQ29tcGxleFNwZWNpYWxQcm9wKFwiZmxvYXQsY3NzRmxvYXQsc3R5bGVGbG9hdFwiLCB7cGFyc2VyOmZ1bmN0aW9uKHQsIGUsIHAsIGNzc3AsIHB0LCBwbHVnaW4pIHtcblx0XHRcdHZhciBzID0gdC5zdHlsZSxcblx0XHRcdFx0cHJvcCA9IChcImNzc0Zsb2F0XCIgaW4gcykgPyBcImNzc0Zsb2F0XCIgOiBcInN0eWxlRmxvYXRcIjtcblx0XHRcdHJldHVybiBuZXcgQ1NTUHJvcFR3ZWVuKHMsIHByb3AsIDAsIDAsIHB0LCAtMSwgcCwgZmFsc2UsIDAsIHNbcHJvcF0sIGUpO1xuXHRcdH19KTtcblxuXHRcdC8vb3BhY2l0eS1yZWxhdGVkXG5cdFx0dmFyIF9zZXRJRU9wYWNpdHlSYXRpbyA9IGZ1bmN0aW9uKHYpIHtcblx0XHRcdFx0dmFyIHQgPSB0aGlzLnQsIC8vcmVmZXJzIHRvIHRoZSBlbGVtZW50J3Mgc3R5bGUgcHJvcGVydHlcblx0XHRcdFx0XHRmaWx0ZXJzID0gdC5maWx0ZXIgfHwgX2dldFN0eWxlKHRoaXMuZGF0YSwgXCJmaWx0ZXJcIikgfHwgXCJcIixcblx0XHRcdFx0XHR2YWwgPSAodGhpcy5zICsgdGhpcy5jICogdikgfCAwLFxuXHRcdFx0XHRcdHNraXA7XG5cdFx0XHRcdGlmICh2YWwgPT09IDEwMCkgeyAvL2ZvciBvbGRlciB2ZXJzaW9ucyBvZiBJRSB0aGF0IG5lZWQgdG8gdXNlIGEgZmlsdGVyIHRvIGFwcGx5IG9wYWNpdHksIHdlIHNob3VsZCByZW1vdmUgdGhlIGZpbHRlciBpZiBvcGFjaXR5IGhpdHMgMSBpbiBvcmRlciB0byBpbXByb3ZlIHBlcmZvcm1hbmNlLCBidXQgbWFrZSBzdXJlIHRoZXJlIGlzbid0IGEgdHJhbnNmb3JtIChtYXRyaXgpIG9yIGdyYWRpZW50IGluIHRoZSBmaWx0ZXJzLlxuXHRcdFx0XHRcdGlmIChmaWx0ZXJzLmluZGV4T2YoXCJhdHJpeChcIikgPT09IC0xICYmIGZpbHRlcnMuaW5kZXhPZihcInJhZGllbnQoXCIpID09PSAtMSAmJiBmaWx0ZXJzLmluZGV4T2YoXCJvYWRlcihcIikgPT09IC0xKSB7XG5cdFx0XHRcdFx0XHR0LnJlbW92ZUF0dHJpYnV0ZShcImZpbHRlclwiKTtcblx0XHRcdFx0XHRcdHNraXAgPSAoIV9nZXRTdHlsZSh0aGlzLmRhdGEsIFwiZmlsdGVyXCIpKTsgLy9pZiBhIGNsYXNzIGlzIGFwcGxpZWQgdGhhdCBoYXMgYW4gYWxwaGEgZmlsdGVyLCBpdCB3aWxsIHRha2UgZWZmZWN0ICh3ZSBkb24ndCB3YW50IHRoYXQpLCBzbyByZS1hcHBseSBvdXIgYWxwaGEgZmlsdGVyIGluIHRoYXQgY2FzZS4gV2UgbXVzdCBmaXJzdCByZW1vdmUgaXQgYW5kIHRoZW4gY2hlY2suXG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdHQuZmlsdGVyID0gZmlsdGVycy5yZXBsYWNlKF9hbHBoYUZpbHRlckV4cCwgXCJcIik7XG5cdFx0XHRcdFx0XHRza2lwID0gdHJ1ZTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKCFza2lwKSB7XG5cdFx0XHRcdFx0aWYgKHRoaXMueG4xKSB7XG5cdFx0XHRcdFx0XHR0LmZpbHRlciA9IGZpbHRlcnMgPSBmaWx0ZXJzIHx8IChcImFscGhhKG9wYWNpdHk9XCIgKyB2YWwgKyBcIilcIik7IC8vd29ya3MgYXJvdW5kIGJ1ZyBpbiBJRTcvOCB0aGF0IHByZXZlbnRzIGNoYW5nZXMgdG8gXCJ2aXNpYmlsaXR5XCIgZnJvbSBiZWluZyBhcHBsaWVkIHByb3Blcmx5IGlmIHRoZSBmaWx0ZXIgaXMgY2hhbmdlZCB0byBhIGRpZmZlcmVudCBhbHBoYSBvbiB0aGUgc2FtZSBmcmFtZS5cblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0aWYgKGZpbHRlcnMuaW5kZXhPZihcInBhY2l0eVwiKSA9PT0gLTEpIHsgLy9vbmx5IHVzZWQgaWYgYnJvd3NlciBkb2Vzbid0IHN1cHBvcnQgdGhlIHN0YW5kYXJkIG9wYWNpdHkgc3R5bGUgcHJvcGVydHkgKElFIDcgYW5kIDgpLiBXZSBvbWl0IHRoZSBcIk9cIiB0byBhdm9pZCBjYXNlLXNlbnNpdGl2aXR5IGlzc3Vlc1xuXHRcdFx0XHRcdFx0aWYgKHZhbCAhPT0gMCB8fCAhdGhpcy54bjEpIHsgLy9idWdzIGluIElFNy84IHdvbid0IHJlbmRlciB0aGUgZmlsdGVyIHByb3Blcmx5IGlmIG9wYWNpdHkgaXMgQURERUQgb24gdGhlIHNhbWUgZnJhbWUvcmVuZGVyIGFzIFwidmlzaWJpbGl0eVwiIGNoYW5nZXMgKHRoaXMueG4xIGlzIDEgaWYgdGhpcyB0d2VlbiBpcyBhbiBcImF1dG9BbHBoYVwiIHR3ZWVuKVxuXHRcdFx0XHRcdFx0XHR0LmZpbHRlciA9IGZpbHRlcnMgKyBcIiBhbHBoYShvcGFjaXR5PVwiICsgdmFsICsgXCIpXCI7IC8vd2Ugcm91bmQgdGhlIHZhbHVlIGJlY2F1c2Ugb3RoZXJ3aXNlLCBidWdzIGluIElFNy84IGNhbiBwcmV2ZW50IFwidmlzaWJpbGl0eVwiIGNoYW5nZXMgZnJvbSBiZWluZyBhcHBsaWVkIHByb3Blcmx5LlxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHR0LmZpbHRlciA9IGZpbHRlcnMucmVwbGFjZShfb3BhY2l0eUV4cCwgXCJvcGFjaXR5PVwiICsgdmFsKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH07XG5cdFx0X3JlZ2lzdGVyQ29tcGxleFNwZWNpYWxQcm9wKFwib3BhY2l0eSxhbHBoYSxhdXRvQWxwaGFcIiwge2RlZmF1bHRWYWx1ZTpcIjFcIiwgcGFyc2VyOmZ1bmN0aW9uKHQsIGUsIHAsIGNzc3AsIHB0LCBwbHVnaW4pIHtcblx0XHRcdHZhciBiID0gcGFyc2VGbG9hdChfZ2V0U3R5bGUodCwgXCJvcGFjaXR5XCIsIF9jcywgZmFsc2UsIFwiMVwiKSksXG5cdFx0XHRcdHN0eWxlID0gdC5zdHlsZSxcblx0XHRcdFx0aXNBdXRvQWxwaGEgPSAocCA9PT0gXCJhdXRvQWxwaGFcIik7XG5cdFx0XHRpZiAodHlwZW9mKGUpID09PSBcInN0cmluZ1wiICYmIGUuY2hhckF0KDEpID09PSBcIj1cIikge1xuXHRcdFx0XHRlID0gKChlLmNoYXJBdCgwKSA9PT0gXCItXCIpID8gLTEgOiAxKSAqIHBhcnNlRmxvYXQoZS5zdWJzdHIoMikpICsgYjtcblx0XHRcdH1cblx0XHRcdGlmIChpc0F1dG9BbHBoYSAmJiBiID09PSAxICYmIF9nZXRTdHlsZSh0LCBcInZpc2liaWxpdHlcIiwgX2NzKSA9PT0gXCJoaWRkZW5cIiAmJiBlICE9PSAwKSB7IC8vaWYgdmlzaWJpbGl0eSBpcyBpbml0aWFsbHkgc2V0IHRvIFwiaGlkZGVuXCIsIHdlIHNob3VsZCBpbnRlcnByZXQgdGhhdCBhcyBpbnRlbnQgdG8gbWFrZSBvcGFjaXR5IDAgKGEgY29udmVuaWVuY2UpXG5cdFx0XHRcdGIgPSAwO1xuXHRcdFx0fVxuXHRcdFx0aWYgKF9zdXBwb3J0c09wYWNpdHkpIHtcblx0XHRcdFx0cHQgPSBuZXcgQ1NTUHJvcFR3ZWVuKHN0eWxlLCBcIm9wYWNpdHlcIiwgYiwgZSAtIGIsIHB0KTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHB0ID0gbmV3IENTU1Byb3BUd2VlbihzdHlsZSwgXCJvcGFjaXR5XCIsIGIgKiAxMDAsIChlIC0gYikgKiAxMDAsIHB0KTtcblx0XHRcdFx0cHQueG4xID0gaXNBdXRvQWxwaGEgPyAxIDogMDsgLy93ZSBuZWVkIHRvIHJlY29yZCB3aGV0aGVyIG9yIG5vdCB0aGlzIGlzIGFuIGF1dG9BbHBoYSBzbyB0aGF0IGluIHRoZSBzZXRSYXRpbygpLCB3ZSBrbm93IHRvIGR1cGxpY2F0ZSB0aGUgc2V0dGluZyBvZiB0aGUgYWxwaGEgaW4gb3JkZXIgdG8gd29yayBhcm91bmQgYSBidWcgaW4gSUU3IGFuZCBJRTggdGhhdCBwcmV2ZW50cyBjaGFuZ2VzIHRvIFwidmlzaWJpbGl0eVwiIGZyb20gdGFraW5nIGVmZmVjdCBpZiB0aGUgZmlsdGVyIGlzIGNoYW5nZWQgdG8gYSBkaWZmZXJlbnQgYWxwaGEob3BhY2l0eSkgYXQgdGhlIHNhbWUgdGltZS4gU2V0dGluZyBpdCB0byB0aGUgU0FNRSB2YWx1ZSBmaXJzdCwgdGhlbiB0aGUgbmV3IHZhbHVlIHdvcmtzIGFyb3VuZCB0aGUgSUU3LzggYnVnLlxuXHRcdFx0XHRzdHlsZS56b29tID0gMTsgLy9oZWxwcyBjb3JyZWN0IGFuIElFIGlzc3VlLlxuXHRcdFx0XHRwdC50eXBlID0gMjtcblx0XHRcdFx0cHQuYiA9IFwiYWxwaGEob3BhY2l0eT1cIiArIHB0LnMgKyBcIilcIjtcblx0XHRcdFx0cHQuZSA9IFwiYWxwaGEob3BhY2l0eT1cIiArIChwdC5zICsgcHQuYykgKyBcIilcIjtcblx0XHRcdFx0cHQuZGF0YSA9IHQ7XG5cdFx0XHRcdHB0LnBsdWdpbiA9IHBsdWdpbjtcblx0XHRcdFx0cHQuc2V0UmF0aW8gPSBfc2V0SUVPcGFjaXR5UmF0aW87XG5cdFx0XHR9XG5cdFx0XHRpZiAoaXNBdXRvQWxwaGEpIHsgLy93ZSBoYXZlIHRvIGNyZWF0ZSB0aGUgXCJ2aXNpYmlsaXR5XCIgUHJvcFR3ZWVuIGFmdGVyIHRoZSBvcGFjaXR5IG9uZSBpbiB0aGUgbGlua2VkIGxpc3Qgc28gdGhhdCB0aGV5IHJ1biBpbiB0aGUgb3JkZXIgdGhhdCB3b3JrcyBwcm9wZXJseSBpbiBJRTggYW5kIGVhcmxpZXJcblx0XHRcdFx0cHQgPSBuZXcgQ1NTUHJvcFR3ZWVuKHN0eWxlLCBcInZpc2liaWxpdHlcIiwgMCwgMCwgcHQsIC0xLCBudWxsLCBmYWxzZSwgMCwgKChiICE9PSAwKSA/IFwiaW5oZXJpdFwiIDogXCJoaWRkZW5cIiksICgoZSA9PT0gMCkgPyBcImhpZGRlblwiIDogXCJpbmhlcml0XCIpKTtcblx0XHRcdFx0cHQueHMwID0gXCJpbmhlcml0XCI7XG5cdFx0XHRcdGNzc3AuX292ZXJ3cml0ZVByb3BzLnB1c2gocHQubik7XG5cdFx0XHRcdGNzc3AuX292ZXJ3cml0ZVByb3BzLnB1c2gocCk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gcHQ7XG5cdFx0fX0pO1xuXG5cblx0XHR2YXIgX3JlbW92ZVByb3AgPSBmdW5jdGlvbihzLCBwKSB7XG5cdFx0XHRcdGlmIChwKSB7XG5cdFx0XHRcdFx0aWYgKHMucmVtb3ZlUHJvcGVydHkpIHtcblx0XHRcdFx0XHRcdGlmIChwLnN1YnN0cigwLDIpID09PSBcIm1zXCIgfHwgcC5zdWJzdHIoMCw2KSA9PT0gXCJ3ZWJraXRcIikgeyAvL01pY3Jvc29mdCBhbmQgc29tZSBXZWJraXQgYnJvd3NlcnMgZG9uJ3QgY29uZm9ybSB0byB0aGUgc3RhbmRhcmQgb2YgY2FwaXRhbGl6aW5nIHRoZSBmaXJzdCBwcmVmaXggY2hhcmFjdGVyLCBzbyB3ZSBhZGp1c3Qgc28gdGhhdCB3aGVuIHdlIHByZWZpeCB0aGUgY2FwcyB3aXRoIGEgZGFzaCwgaXQncyBjb3JyZWN0IChvdGhlcndpc2UgaXQnZCBiZSBcIm1zLXRyYW5zZm9ybVwiIGluc3RlYWQgb2YgXCItbXMtdHJhbnNmb3JtXCIgZm9yIElFOSwgZm9yIGV4YW1wbGUpXG5cdFx0XHRcdFx0XHRcdHAgPSBcIi1cIiArIHA7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRzLnJlbW92ZVByb3BlcnR5KHAucmVwbGFjZShfY2Fwc0V4cCwgXCItJDFcIikudG9Mb3dlckNhc2UoKSk7XG5cdFx0XHRcdFx0fSBlbHNlIHsgLy9ub3RlOiBvbGQgdmVyc2lvbnMgb2YgSUUgdXNlIFwicmVtb3ZlQXR0cmlidXRlKClcIiBpbnN0ZWFkIG9mIFwicmVtb3ZlUHJvcGVydHkoKVwiXG5cdFx0XHRcdFx0XHRzLnJlbW92ZUF0dHJpYnV0ZShwKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH0sXG5cdFx0XHRfc2V0Q2xhc3NOYW1lUmF0aW8gPSBmdW5jdGlvbih2KSB7XG5cdFx0XHRcdHRoaXMudC5fZ3NDbGFzc1BUID0gdGhpcztcblx0XHRcdFx0aWYgKHYgPT09IDEgfHwgdiA9PT0gMCkge1xuXHRcdFx0XHRcdHRoaXMudC5zZXRBdHRyaWJ1dGUoXCJjbGFzc1wiLCAodiA9PT0gMCkgPyB0aGlzLmIgOiB0aGlzLmUpO1xuXHRcdFx0XHRcdHZhciBtcHQgPSB0aGlzLmRhdGEsIC8vZmlyc3QgTWluaVByb3BUd2VlblxuXHRcdFx0XHRcdFx0cyA9IHRoaXMudC5zdHlsZTtcblx0XHRcdFx0XHR3aGlsZSAobXB0KSB7XG5cdFx0XHRcdFx0XHRpZiAoIW1wdC52KSB7XG5cdFx0XHRcdFx0XHRcdF9yZW1vdmVQcm9wKHMsIG1wdC5wKTtcblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdHNbbXB0LnBdID0gbXB0LnY7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRtcHQgPSBtcHQuX25leHQ7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGlmICh2ID09PSAxICYmIHRoaXMudC5fZ3NDbGFzc1BUID09PSB0aGlzKSB7XG5cdFx0XHRcdFx0XHR0aGlzLnQuX2dzQ2xhc3NQVCA9IG51bGw7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9IGVsc2UgaWYgKHRoaXMudC5nZXRBdHRyaWJ1dGUoXCJjbGFzc1wiKSAhPT0gdGhpcy5lKSB7XG5cdFx0XHRcdFx0dGhpcy50LnNldEF0dHJpYnV0ZShcImNsYXNzXCIsIHRoaXMuZSk7XG5cdFx0XHRcdH1cblx0XHRcdH07XG5cdFx0X3JlZ2lzdGVyQ29tcGxleFNwZWNpYWxQcm9wKFwiY2xhc3NOYW1lXCIsIHtwYXJzZXI6ZnVuY3Rpb24odCwgZSwgcCwgY3NzcCwgcHQsIHBsdWdpbiwgdmFycykge1xuXHRcdFx0dmFyIGIgPSB0LmdldEF0dHJpYnV0ZShcImNsYXNzXCIpIHx8IFwiXCIsIC8vZG9uJ3QgdXNlIHQuY2xhc3NOYW1lIGJlY2F1c2UgaXQgZG9lc24ndCB3b3JrIGNvbnNpc3RlbnRseSBvbiBTVkcgZWxlbWVudHM7IGdldEF0dHJpYnV0ZShcImNsYXNzXCIpIGFuZCBzZXRBdHRyaWJ1dGUoXCJjbGFzc1wiLCB2YWx1ZVwiKSBpcyBtb3JlIHJlbGlhYmxlLlxuXHRcdFx0XHRjc3NUZXh0ID0gdC5zdHlsZS5jc3NUZXh0LFxuXHRcdFx0XHRkaWZEYXRhLCBicywgY25wdCwgY25wdExvb2t1cCwgbXB0O1xuXHRcdFx0cHQgPSBjc3NwLl9jbGFzc05hbWVQVCA9IG5ldyBDU1NQcm9wVHdlZW4odCwgcCwgMCwgMCwgcHQsIDIpO1xuXHRcdFx0cHQuc2V0UmF0aW8gPSBfc2V0Q2xhc3NOYW1lUmF0aW87XG5cdFx0XHRwdC5wciA9IC0xMTtcblx0XHRcdF9oYXNQcmlvcml0eSA9IHRydWU7XG5cdFx0XHRwdC5iID0gYjtcblx0XHRcdGJzID0gX2dldEFsbFN0eWxlcyh0LCBfY3MpO1xuXHRcdFx0Ly9pZiB0aGVyZSdzIGEgY2xhc3NOYW1lIHR3ZWVuIGFscmVhZHkgb3BlcmF0aW5nIG9uIHRoZSB0YXJnZXQsIGZvcmNlIGl0IHRvIGl0cyBlbmQgc28gdGhhdCB0aGUgbmVjZXNzYXJ5IGlubGluZSBzdHlsZXMgYXJlIHJlbW92ZWQgYW5kIHRoZSBjbGFzcyBuYW1lIGlzIGFwcGxpZWQgYmVmb3JlIHdlIGRldGVybWluZSB0aGUgZW5kIHN0YXRlICh3ZSBkb24ndCB3YW50IGlubGluZSBzdHlsZXMgaW50ZXJmZXJpbmcgdGhhdCB3ZXJlIHRoZXJlIGp1c3QgZm9yIGNsYXNzLXNwZWNpZmljIHZhbHVlcylcblx0XHRcdGNucHQgPSB0Ll9nc0NsYXNzUFQ7XG5cdFx0XHRpZiAoY25wdCkge1xuXHRcdFx0XHRjbnB0TG9va3VwID0ge307XG5cdFx0XHRcdG1wdCA9IGNucHQuZGF0YTsgLy9maXJzdCBNaW5pUHJvcFR3ZWVuIHdoaWNoIHN0b3JlcyB0aGUgaW5saW5lIHN0eWxlcyAtIHdlIG5lZWQgdG8gZm9yY2UgdGhlc2Ugc28gdGhhdCB0aGUgaW5saW5lIHN0eWxlcyBkb24ndCBjb250YW1pbmF0ZSB0aGluZ3MuIE90aGVyd2lzZSwgdGhlcmUncyBhIHNtYWxsIGNoYW5jZSB0aGF0IGEgdHdlZW4gY291bGQgc3RhcnQgYW5kIHRoZSBpbmxpbmUgdmFsdWVzIG1hdGNoIHRoZSBkZXN0aW5hdGlvbiB2YWx1ZXMgYW5kIHRoZXkgbmV2ZXIgZ2V0IGNsZWFuZWQuXG5cdFx0XHRcdHdoaWxlIChtcHQpIHtcblx0XHRcdFx0XHRjbnB0TG9va3VwW21wdC5wXSA9IDE7XG5cdFx0XHRcdFx0bXB0ID0gbXB0Ll9uZXh0O1xuXHRcdFx0XHR9XG5cdFx0XHRcdGNucHQuc2V0UmF0aW8oMSk7XG5cdFx0XHR9XG5cdFx0XHR0Ll9nc0NsYXNzUFQgPSBwdDtcblx0XHRcdHB0LmUgPSAoZS5jaGFyQXQoMSkgIT09IFwiPVwiKSA/IGUgOiBiLnJlcGxhY2UobmV3IFJlZ0V4cChcIig/OlxcXFxzfF4pXCIgKyBlLnN1YnN0cigyKSArIFwiKD8hW1xcXFx3LV0pXCIpLCBcIlwiKSArICgoZS5jaGFyQXQoMCkgPT09IFwiK1wiKSA/IFwiIFwiICsgZS5zdWJzdHIoMikgOiBcIlwiKTtcblx0XHRcdHQuc2V0QXR0cmlidXRlKFwiY2xhc3NcIiwgcHQuZSk7XG5cdFx0XHRkaWZEYXRhID0gX2Nzc0RpZih0LCBicywgX2dldEFsbFN0eWxlcyh0KSwgdmFycywgY25wdExvb2t1cCk7XG5cdFx0XHR0LnNldEF0dHJpYnV0ZShcImNsYXNzXCIsIGIpO1xuXHRcdFx0cHQuZGF0YSA9IGRpZkRhdGEuZmlyc3RNUFQ7XG5cdFx0XHR0LnN0eWxlLmNzc1RleHQgPSBjc3NUZXh0OyAvL3dlIHJlY29yZGVkIGNzc1RleHQgYmVmb3JlIHdlIHN3YXBwZWQgY2xhc3NlcyBhbmQgcmFuIF9nZXRBbGxTdHlsZXMoKSBiZWNhdXNlIGluIGNhc2VzIHdoZW4gYSBjbGFzc05hbWUgdHdlZW4gaXMgb3ZlcndyaXR0ZW4sIHdlIHJlbW92ZSBhbGwgdGhlIHJlbGF0ZWQgdHdlZW5pbmcgcHJvcGVydGllcyBmcm9tIHRoYXQgY2xhc3MgY2hhbmdlIChvdGhlcndpc2UgY2xhc3Mtc3BlY2lmaWMgc3R1ZmYgY2FuJ3Qgb3ZlcnJpZGUgcHJvcGVydGllcyB3ZSd2ZSBkaXJlY3RseSBzZXQgb24gdGhlIHRhcmdldCdzIHN0eWxlIG9iamVjdCBkdWUgdG8gc3BlY2lmaWNpdHkpLlxuXHRcdFx0cHQgPSBwdC54Zmlyc3QgPSBjc3NwLnBhcnNlKHQsIGRpZkRhdGEuZGlmcywgcHQsIHBsdWdpbik7IC8vd2UgcmVjb3JkIHRoZSBDU1NQcm9wVHdlZW4gYXMgdGhlIHhmaXJzdCBzbyB0aGF0IHdlIGNhbiBoYW5kbGUgb3ZlcndyaXRpbmcgcHJvcGVydGx5IChpZiBcImNsYXNzTmFtZVwiIGdldHMgb3ZlcndyaXR0ZW4sIHdlIG11c3Qga2lsbCBhbGwgdGhlIHByb3BlcnRpZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBjbGFzc05hbWUgcGFydCBvZiB0aGUgdHdlZW4sIHNvIHdlIGNhbiBsb29wIHRocm91Z2ggZnJvbSB4Zmlyc3QgdG8gdGhlIHB0IGl0c2VsZilcblx0XHRcdHJldHVybiBwdDtcblx0XHR9fSk7XG5cblxuXHRcdHZhciBfc2V0Q2xlYXJQcm9wc1JhdGlvID0gZnVuY3Rpb24odikge1xuXHRcdFx0aWYgKHYgPT09IDEgfHwgdiA9PT0gMCkgaWYgKHRoaXMuZGF0YS5fdG90YWxUaW1lID09PSB0aGlzLmRhdGEuX3RvdGFsRHVyYXRpb24gJiYgdGhpcy5kYXRhLmRhdGEgIT09IFwiaXNGcm9tU3RhcnRcIikgeyAvL3RoaXMuZGF0YSByZWZlcnMgdG8gdGhlIHR3ZWVuLiBPbmx5IGNsZWFyIGF0IHRoZSBFTkQgb2YgdGhlIHR3ZWVuIChyZW1lbWJlciwgZnJvbSgpIHR3ZWVucyBtYWtlIHRoZSByYXRpbyBnbyBmcm9tIDEgdG8gMCwgc28gd2UgY2FuJ3QganVzdCBjaGVjayB0aGF0IGFuZCBpZiB0aGUgdHdlZW4gaXMgdGhlIHplcm8tZHVyYXRpb24gb25lIHRoYXQncyBjcmVhdGVkIGludGVybmFsbHkgdG8gcmVuZGVyIHRoZSBzdGFydGluZyB2YWx1ZXMgaW4gYSBmcm9tKCkgdHdlZW4sIGlnbm9yZSB0aGF0IGJlY2F1c2Ugb3RoZXJ3aXNlLCBmb3IgZXhhbXBsZSwgZnJvbSguLi57aGVpZ2h0OjEwMCwgY2xlYXJQcm9wczpcImhlaWdodFwiLCBkZWxheToxfSkgd291bGQgd2lwZSB0aGUgaGVpZ2h0IGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIHR3ZWVuIGFuZCBhZnRlciAxIHNlY29uZCwgaXQnZCBraWNrIGJhY2sgaW4pLlxuXHRcdFx0XHR2YXIgcyA9IHRoaXMudC5zdHlsZSxcblx0XHRcdFx0XHR0cmFuc2Zvcm1QYXJzZSA9IF9zcGVjaWFsUHJvcHMudHJhbnNmb3JtLnBhcnNlLFxuXHRcdFx0XHRcdGEsIHAsIGksIGNsZWFyVHJhbnNmb3JtLCB0cmFuc2Zvcm07XG5cdFx0XHRcdGlmICh0aGlzLmUgPT09IFwiYWxsXCIpIHtcblx0XHRcdFx0XHRzLmNzc1RleHQgPSBcIlwiO1xuXHRcdFx0XHRcdGNsZWFyVHJhbnNmb3JtID0gdHJ1ZTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRhID0gdGhpcy5lLnNwbGl0KFwiIFwiKS5qb2luKFwiXCIpLnNwbGl0KFwiLFwiKTtcblx0XHRcdFx0XHRpID0gYS5sZW5ndGg7XG5cdFx0XHRcdFx0d2hpbGUgKC0taSA+IC0xKSB7XG5cdFx0XHRcdFx0XHRwID0gYVtpXTtcblx0XHRcdFx0XHRcdGlmIChfc3BlY2lhbFByb3BzW3BdKSB7XG5cdFx0XHRcdFx0XHRcdGlmIChfc3BlY2lhbFByb3BzW3BdLnBhcnNlID09PSB0cmFuc2Zvcm1QYXJzZSkge1xuXHRcdFx0XHRcdFx0XHRcdGNsZWFyVHJhbnNmb3JtID0gdHJ1ZTtcblx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0XHRwID0gKHAgPT09IFwidHJhbnNmb3JtT3JpZ2luXCIpID8gX3RyYW5zZm9ybU9yaWdpblByb3AgOiBfc3BlY2lhbFByb3BzW3BdLnA7IC8vZW5zdXJlcyB0aGF0IHNwZWNpYWwgcHJvcGVydGllcyB1c2UgdGhlIHByb3BlciBicm93c2VyLXNwZWNpZmljIHByb3BlcnR5IG5hbWUsIGxpa2UgXCJzY2FsZVhcIiBtaWdodCBiZSBcIi13ZWJraXQtdHJhbnNmb3JtXCIgb3IgXCJib3hTaGFkb3dcIiBtaWdodCBiZSBcIi1tb3otYm94LXNoYWRvd1wiXG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdF9yZW1vdmVQcm9wKHMsIHApO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAoY2xlYXJUcmFuc2Zvcm0pIHtcblx0XHRcdFx0XHRfcmVtb3ZlUHJvcChzLCBfdHJhbnNmb3JtUHJvcCk7XG5cdFx0XHRcdFx0dHJhbnNmb3JtID0gdGhpcy50Ll9nc1RyYW5zZm9ybTtcblx0XHRcdFx0XHRpZiAodHJhbnNmb3JtKSB7XG5cdFx0XHRcdFx0XHRpZiAodHJhbnNmb3JtLnN2Zykge1xuXHRcdFx0XHRcdFx0XHR0aGlzLnQucmVtb3ZlQXR0cmlidXRlKFwiZGF0YS1zdmctb3JpZ2luXCIpO1xuXHRcdFx0XHRcdFx0XHR0aGlzLnQucmVtb3ZlQXR0cmlidXRlKFwidHJhbnNmb3JtXCIpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0ZGVsZXRlIHRoaXMudC5fZ3NUcmFuc2Zvcm07XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblx0XHR9O1xuXHRcdF9yZWdpc3RlckNvbXBsZXhTcGVjaWFsUHJvcChcImNsZWFyUHJvcHNcIiwge3BhcnNlcjpmdW5jdGlvbih0LCBlLCBwLCBjc3NwLCBwdCkge1xuXHRcdFx0cHQgPSBuZXcgQ1NTUHJvcFR3ZWVuKHQsIHAsIDAsIDAsIHB0LCAyKTtcblx0XHRcdHB0LnNldFJhdGlvID0gX3NldENsZWFyUHJvcHNSYXRpbztcblx0XHRcdHB0LmUgPSBlO1xuXHRcdFx0cHQucHIgPSAtMTA7XG5cdFx0XHRwdC5kYXRhID0gY3NzcC5fdHdlZW47XG5cdFx0XHRfaGFzUHJpb3JpdHkgPSB0cnVlO1xuXHRcdFx0cmV0dXJuIHB0O1xuXHRcdH19KTtcblxuXHRcdHAgPSBcImJlemllcix0aHJvd1Byb3BzLHBoeXNpY3NQcm9wcyxwaHlzaWNzMkRcIi5zcGxpdChcIixcIik7XG5cdFx0aSA9IHAubGVuZ3RoO1xuXHRcdHdoaWxlIChpLS0pIHtcblx0XHRcdF9yZWdpc3RlclBsdWdpblByb3AocFtpXSk7XG5cdFx0fVxuXG5cblxuXG5cblxuXG5cblx0XHRwID0gQ1NTUGx1Z2luLnByb3RvdHlwZTtcblx0XHRwLl9maXJzdFBUID0gcC5fbGFzdFBhcnNlZFRyYW5zZm9ybSA9IHAuX3RyYW5zZm9ybSA9IG51bGw7XG5cblx0XHQvL2dldHMgY2FsbGVkIHdoZW4gdGhlIHR3ZWVuIHJlbmRlcnMgZm9yIHRoZSBmaXJzdCB0aW1lLiBUaGlzIGtpY2tzIGV2ZXJ5dGhpbmcgb2ZmLCByZWNvcmRpbmcgc3RhcnQvZW5kIHZhbHVlcywgZXRjLlxuXHRcdHAuX29uSW5pdFR3ZWVuID0gZnVuY3Rpb24odGFyZ2V0LCB2YXJzLCB0d2VlbiwgaW5kZXgpIHtcblx0XHRcdGlmICghdGFyZ2V0Lm5vZGVUeXBlKSB7IC8vY3NzIGlzIG9ubHkgZm9yIGRvbSBlbGVtZW50c1xuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHR9XG5cdFx0XHR0aGlzLl90YXJnZXQgPSBfdGFyZ2V0ID0gdGFyZ2V0O1xuXHRcdFx0dGhpcy5fdHdlZW4gPSB0d2Vlbjtcblx0XHRcdHRoaXMuX3ZhcnMgPSB2YXJzO1xuXHRcdFx0X2luZGV4ID0gaW5kZXg7XG5cdFx0XHRfYXV0b1JvdW5kID0gdmFycy5hdXRvUm91bmQ7XG5cdFx0XHRfaGFzUHJpb3JpdHkgPSBmYWxzZTtcblx0XHRcdF9zdWZmaXhNYXAgPSB2YXJzLnN1ZmZpeE1hcCB8fCBDU1NQbHVnaW4uc3VmZml4TWFwO1xuXHRcdFx0X2NzID0gX2dldENvbXB1dGVkU3R5bGUodGFyZ2V0LCBcIlwiKTtcblx0XHRcdF9vdmVyd3JpdGVQcm9wcyA9IHRoaXMuX292ZXJ3cml0ZVByb3BzO1xuXHRcdFx0dmFyIHN0eWxlID0gdGFyZ2V0LnN0eWxlLFxuXHRcdFx0XHR2LCBwdCwgcHQyLCBmaXJzdCwgbGFzdCwgbmV4dCwgekluZGV4LCB0cHQsIHRocmVlRDtcblx0XHRcdGlmIChfcmVxU2FmYXJpRml4KSBpZiAoc3R5bGUuekluZGV4ID09PSBcIlwiKSB7XG5cdFx0XHRcdHYgPSBfZ2V0U3R5bGUodGFyZ2V0LCBcInpJbmRleFwiLCBfY3MpO1xuXHRcdFx0XHRpZiAodiA9PT0gXCJhdXRvXCIgfHwgdiA9PT0gXCJcIikge1xuXHRcdFx0XHRcdC8vY29ycmVjdHMgYSBidWcgaW4gW25vbi1BbmRyb2lkXSBTYWZhcmkgdGhhdCBwcmV2ZW50cyBpdCBmcm9tIHJlcGFpbnRpbmcgZWxlbWVudHMgaW4gdGhlaXIgbmV3IHBvc2l0aW9ucyBpZiB0aGV5IGRvbid0IGhhdmUgYSB6SW5kZXggc2V0LiBXZSBhbHNvIGNhbid0IGp1c3QgYXBwbHkgdGhpcyBpbnNpZGUgX3BhcnNlVHJhbnNmb3JtKCkgYmVjYXVzZSBhbnl0aGluZyB0aGF0J3MgbW92ZWQgaW4gYW55IHdheSAobGlrZSB1c2luZyBcImxlZnRcIiBvciBcInRvcFwiIGluc3RlYWQgb2YgdHJhbnNmb3JtcyBsaWtlIFwieFwiIGFuZCBcInlcIikgY2FuIGJlIGFmZmVjdGVkLCBzbyBpdCBpcyBiZXN0IHRvIGVuc3VyZSB0aGF0IGFueXRoaW5nIHRoYXQncyB0d2VlbmluZyBoYXMgYSB6LWluZGV4LiBTZXR0aW5nIFwiV2Via2l0UGVyc3BlY3RpdmVcIiB0byBhIG5vbi16ZXJvIHZhbHVlIHdvcmtlZCB0b28gZXhjZXB0IHRoYXQgb24gaU9TIFNhZmFyaSB0aGluZ3Mgd291bGQgZmxpY2tlciByYW5kb21seS4gUGx1cyB6SW5kZXggaXMgbGVzcyBtZW1vcnktaW50ZW5zaXZlLlxuXHRcdFx0XHRcdHRoaXMuX2FkZExhenlTZXQoc3R5bGUsIFwiekluZGV4XCIsIDApO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdGlmICh0eXBlb2YodmFycykgPT09IFwic3RyaW5nXCIpIHtcblx0XHRcdFx0Zmlyc3QgPSBzdHlsZS5jc3NUZXh0O1xuXHRcdFx0XHR2ID0gX2dldEFsbFN0eWxlcyh0YXJnZXQsIF9jcyk7XG5cdFx0XHRcdHN0eWxlLmNzc1RleHQgPSBmaXJzdCArIFwiO1wiICsgdmFycztcblx0XHRcdFx0diA9IF9jc3NEaWYodGFyZ2V0LCB2LCBfZ2V0QWxsU3R5bGVzKHRhcmdldCkpLmRpZnM7XG5cdFx0XHRcdGlmICghX3N1cHBvcnRzT3BhY2l0eSAmJiBfb3BhY2l0eVZhbEV4cC50ZXN0KHZhcnMpKSB7XG5cdFx0XHRcdFx0di5vcGFjaXR5ID0gcGFyc2VGbG9hdCggUmVnRXhwLiQxICk7XG5cdFx0XHRcdH1cblx0XHRcdFx0dmFycyA9IHY7XG5cdFx0XHRcdHN0eWxlLmNzc1RleHQgPSBmaXJzdDtcblx0XHRcdH1cblxuXHRcdFx0aWYgKHZhcnMuY2xhc3NOYW1lKSB7IC8vY2xhc3NOYW1lIHR3ZWVucyB3aWxsIGNvbWJpbmUgYW55IGRpZmZlcmVuY2VzIHRoZXkgZmluZCBpbiB0aGUgY3NzIHdpdGggdGhlIHZhcnMgdGhhdCBhcmUgcGFzc2VkIGluLCBzbyB7Y2xhc3NOYW1lOlwibXlDbGFzc1wiLCBzY2FsZTowLjUsIGxlZnQ6MjB9IHdvdWxkIHdvcmsuXG5cdFx0XHRcdHRoaXMuX2ZpcnN0UFQgPSBwdCA9IF9zcGVjaWFsUHJvcHMuY2xhc3NOYW1lLnBhcnNlKHRhcmdldCwgdmFycy5jbGFzc05hbWUsIFwiY2xhc3NOYW1lXCIsIHRoaXMsIG51bGwsIG51bGwsIHZhcnMpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0dGhpcy5fZmlyc3RQVCA9IHB0ID0gdGhpcy5wYXJzZSh0YXJnZXQsIHZhcnMsIG51bGwpO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAodGhpcy5fdHJhbnNmb3JtVHlwZSkge1xuXHRcdFx0XHR0aHJlZUQgPSAodGhpcy5fdHJhbnNmb3JtVHlwZSA9PT0gMyk7XG5cdFx0XHRcdGlmICghX3RyYW5zZm9ybVByb3ApIHtcblx0XHRcdFx0XHRzdHlsZS56b29tID0gMTsgLy9oZWxwcyBjb3JyZWN0IGFuIElFIGlzc3VlLlxuXHRcdFx0XHR9IGVsc2UgaWYgKF9pc1NhZmFyaSkge1xuXHRcdFx0XHRcdF9yZXFTYWZhcmlGaXggPSB0cnVlO1xuXHRcdFx0XHRcdC8vaWYgekluZGV4IGlzbid0IHNldCwgaU9TIFNhZmFyaSBkb2Vzbid0IHJlcGFpbnQgdGhpbmdzIGNvcnJlY3RseSBzb21ldGltZXMgKHNlZW1pbmdseSBhdCByYW5kb20pLlxuXHRcdFx0XHRcdGlmIChzdHlsZS56SW5kZXggPT09IFwiXCIpIHtcblx0XHRcdFx0XHRcdHpJbmRleCA9IF9nZXRTdHlsZSh0YXJnZXQsIFwiekluZGV4XCIsIF9jcyk7XG5cdFx0XHRcdFx0XHRpZiAoekluZGV4ID09PSBcImF1dG9cIiB8fCB6SW5kZXggPT09IFwiXCIpIHtcblx0XHRcdFx0XHRcdFx0dGhpcy5fYWRkTGF6eVNldChzdHlsZSwgXCJ6SW5kZXhcIiwgMCk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdC8vU2V0dGluZyBXZWJraXRCYWNrZmFjZVZpc2liaWxpdHkgY29ycmVjdHMgMyBidWdzOlxuXHRcdFx0XHRcdC8vIDEpIFtub24tQW5kcm9pZF0gU2FmYXJpIHNraXBzIHJlbmRlcmluZyBjaGFuZ2VzIHRvIFwidG9wXCIgYW5kIFwibGVmdFwiIHRoYXQgYXJlIG1hZGUgb24gdGhlIHNhbWUgZnJhbWUvcmVuZGVyIGFzIGEgdHJhbnNmb3JtIHVwZGF0ZS5cblx0XHRcdFx0XHQvLyAyKSBpT1MgU2FmYXJpIHNvbWV0aW1lcyBuZWdsZWN0cyB0byByZXBhaW50IGVsZW1lbnRzIGluIHRoZWlyIG5ldyBwb3NpdGlvbnMuIFNldHRpbmcgXCJXZWJraXRQZXJzcGVjdGl2ZVwiIHRvIGEgbm9uLXplcm8gdmFsdWUgd29ya2VkIHRvbyBleGNlcHQgdGhhdCBvbiBpT1MgU2FmYXJpIHRoaW5ncyB3b3VsZCBmbGlja2VyIHJhbmRvbWx5LlxuXHRcdFx0XHRcdC8vIDMpIFNhZmFyaSBzb21ldGltZXMgZGlzcGxheWVkIG9kZCBhcnRpZmFjdHMgd2hlbiB0d2VlbmluZyB0aGUgdHJhbnNmb3JtIChvciBXZWJraXRUcmFuc2Zvcm0pIHByb3BlcnR5LCBsaWtlIGdob3N0cyBvZiB0aGUgZWRnZXMgb2YgdGhlIGVsZW1lbnQgcmVtYWluZWQuIERlZmluaXRlbHkgYSBicm93c2VyIGJ1Zy5cblx0XHRcdFx0XHQvL05vdGU6IHdlIGFsbG93IHRoZSB1c2VyIHRvIG92ZXJyaWRlIHRoZSBhdXRvLXNldHRpbmcgYnkgZGVmaW5pbmcgV2Via2l0QmFja2ZhY2VWaXNpYmlsaXR5IGluIHRoZSB2YXJzIG9mIHRoZSB0d2Vlbi5cblx0XHRcdFx0XHRpZiAoX2lzU2FmYXJpTFQ2KSB7XG5cdFx0XHRcdFx0XHR0aGlzLl9hZGRMYXp5U2V0KHN0eWxlLCBcIldlYmtpdEJhY2tmYWNlVmlzaWJpbGl0eVwiLCB0aGlzLl92YXJzLldlYmtpdEJhY2tmYWNlVmlzaWJpbGl0eSB8fCAodGhyZWVEID8gXCJ2aXNpYmxlXCIgOiBcImhpZGRlblwiKSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdHB0MiA9IHB0O1xuXHRcdFx0XHR3aGlsZSAocHQyICYmIHB0Mi5fbmV4dCkge1xuXHRcdFx0XHRcdHB0MiA9IHB0Mi5fbmV4dDtcblx0XHRcdFx0fVxuXHRcdFx0XHR0cHQgPSBuZXcgQ1NTUHJvcFR3ZWVuKHRhcmdldCwgXCJ0cmFuc2Zvcm1cIiwgMCwgMCwgbnVsbCwgMik7XG5cdFx0XHRcdHRoaXMuX2xpbmtDU1NQKHRwdCwgbnVsbCwgcHQyKTtcblx0XHRcdFx0dHB0LnNldFJhdGlvID0gX3RyYW5zZm9ybVByb3AgPyBfc2V0VHJhbnNmb3JtUmF0aW8gOiBfc2V0SUVUcmFuc2Zvcm1SYXRpbztcblx0XHRcdFx0dHB0LmRhdGEgPSB0aGlzLl90cmFuc2Zvcm0gfHwgX2dldFRyYW5zZm9ybSh0YXJnZXQsIF9jcywgdHJ1ZSk7XG5cdFx0XHRcdHRwdC50d2VlbiA9IHR3ZWVuO1xuXHRcdFx0XHR0cHQucHIgPSAtMTsgLy9lbnN1cmVzIHRoYXQgdGhlIHRyYW5zZm9ybXMgZ2V0IGFwcGxpZWQgYWZ0ZXIgdGhlIGNvbXBvbmVudHMgYXJlIHVwZGF0ZWQuXG5cdFx0XHRcdF9vdmVyd3JpdGVQcm9wcy5wb3AoKTsgLy93ZSBkb24ndCB3YW50IHRvIGZvcmNlIHRoZSBvdmVyd3JpdGUgb2YgYWxsIFwidHJhbnNmb3JtXCIgdHdlZW5zIG9mIHRoZSB0YXJnZXQgLSB3ZSBvbmx5IGNhcmUgYWJvdXQgaW5kaXZpZHVhbCB0cmFuc2Zvcm0gcHJvcGVydGllcyBsaWtlIHNjYWxlWCwgcm90YXRpb24sIGV0Yy4gVGhlIENTU1Byb3BUd2VlbiBjb25zdHJ1Y3RvciBhdXRvbWF0aWNhbGx5IGFkZHMgdGhlIHByb3BlcnR5IHRvIF9vdmVyd3JpdGVQcm9wcyB3aGljaCBpcyB3aHkgd2UgbmVlZCB0byBwb3AoKSBoZXJlLlxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoX2hhc1ByaW9yaXR5KSB7XG5cdFx0XHRcdC8vcmVvcmRlcnMgdGhlIGxpbmtlZCBsaXN0IGluIG9yZGVyIG9mIHByIChwcmlvcml0eSlcblx0XHRcdFx0d2hpbGUgKHB0KSB7XG5cdFx0XHRcdFx0bmV4dCA9IHB0Ll9uZXh0O1xuXHRcdFx0XHRcdHB0MiA9IGZpcnN0O1xuXHRcdFx0XHRcdHdoaWxlIChwdDIgJiYgcHQyLnByID4gcHQucHIpIHtcblx0XHRcdFx0XHRcdHB0MiA9IHB0Mi5fbmV4dDtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0aWYgKChwdC5fcHJldiA9IHB0MiA/IHB0Mi5fcHJldiA6IGxhc3QpKSB7XG5cdFx0XHRcdFx0XHRwdC5fcHJldi5fbmV4dCA9IHB0O1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRmaXJzdCA9IHB0O1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRpZiAoKHB0Ll9uZXh0ID0gcHQyKSkge1xuXHRcdFx0XHRcdFx0cHQyLl9wcmV2ID0gcHQ7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdGxhc3QgPSBwdDtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0cHQgPSBuZXh0O1xuXHRcdFx0XHR9XG5cdFx0XHRcdHRoaXMuX2ZpcnN0UFQgPSBmaXJzdDtcblx0XHRcdH1cblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdH07XG5cblxuXHRcdHAucGFyc2UgPSBmdW5jdGlvbih0YXJnZXQsIHZhcnMsIHB0LCBwbHVnaW4pIHtcblx0XHRcdHZhciBzdHlsZSA9IHRhcmdldC5zdHlsZSxcblx0XHRcdFx0cCwgc3AsIGJuLCBlbiwgYnMsIGVzLCBic2Z4LCBlc2Z4LCBpc1N0ciwgcmVsO1xuXHRcdFx0Zm9yIChwIGluIHZhcnMpIHtcblx0XHRcdFx0ZXMgPSB2YXJzW3BdOyAvL2VuZGluZyB2YWx1ZSBzdHJpbmdcblx0XHRcdFx0aWYgKHR5cGVvZihlcykgPT09IFwiZnVuY3Rpb25cIikge1xuXHRcdFx0XHRcdGVzID0gZXMoX2luZGV4LCBfdGFyZ2V0KTtcblx0XHRcdFx0fVxuXHRcdFx0XHRzcCA9IF9zcGVjaWFsUHJvcHNbcF07IC8vU3BlY2lhbFByb3AgbG9va3VwLlxuXHRcdFx0XHRpZiAoc3ApIHtcblx0XHRcdFx0XHRwdCA9IHNwLnBhcnNlKHRhcmdldCwgZXMsIHAsIHRoaXMsIHB0LCBwbHVnaW4sIHZhcnMpO1xuXHRcdFx0XHR9IGVsc2UgaWYgKHAuc3Vic3RyKDAsMikgPT09IFwiLS1cIikgeyAvL2ZvciB0d2VlbmluZyBDU1MgdmFyaWFibGVzICh3aGljaCBhbHdheXMgc3RhcnQgd2l0aCBcIi0tXCIpLiBUbyBtYXhpbWl6ZSBwZXJmb3JtYW5jZSBhbmQgc2ltcGxpY2l0eSwgd2UgYnlwYXNzIENTU1BsdWdpbiBhbHRvZ2V0aGVyIGFuZCBqdXN0IGFkZCBhIG5vcm1hbCBwcm9wZXJ0eSB0d2VlbiB0byB0aGUgdHdlZW4gaW5zdGFuY2UgaXRzZWxmLlxuXHRcdFx0XHRcdHRoaXMuX3R3ZWVuLl9wcm9wTG9va3VwW3BdID0gdGhpcy5fYWRkVHdlZW4uY2FsbCh0aGlzLl90d2VlbiwgdGFyZ2V0LnN0eWxlLCBcInNldFByb3BlcnR5XCIsIF9nZXRDb21wdXRlZFN0eWxlKHRhcmdldCkuZ2V0UHJvcGVydHlWYWx1ZShwKSArIFwiXCIsIGVzICsgXCJcIiwgcCwgZmFsc2UsIHApO1xuXHRcdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGJzID0gX2dldFN0eWxlKHRhcmdldCwgcCwgX2NzKSArIFwiXCI7XG5cdFx0XHRcdFx0aXNTdHIgPSAodHlwZW9mKGVzKSA9PT0gXCJzdHJpbmdcIik7XG5cdFx0XHRcdFx0aWYgKHAgPT09IFwiY29sb3JcIiB8fCBwID09PSBcImZpbGxcIiB8fCBwID09PSBcInN0cm9rZVwiIHx8IHAuaW5kZXhPZihcIkNvbG9yXCIpICE9PSAtMSB8fCAoaXNTdHIgJiYgX3JnYmhzbEV4cC50ZXN0KGVzKSkpIHsgLy9PcGVyYSB1c2VzIGJhY2tncm91bmQ6IHRvIGRlZmluZSBjb2xvciBzb21ldGltZXMgaW4gYWRkaXRpb24gdG8gYmFja2dyb3VuZENvbG9yOlxuXHRcdFx0XHRcdFx0aWYgKCFpc1N0cikge1xuXHRcdFx0XHRcdFx0XHRlcyA9IF9wYXJzZUNvbG9yKGVzKTtcblx0XHRcdFx0XHRcdFx0ZXMgPSAoKGVzLmxlbmd0aCA+IDMpID8gXCJyZ2JhKFwiIDogXCJyZ2IoXCIpICsgZXMuam9pbihcIixcIikgKyBcIilcIjtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdHB0ID0gX3BhcnNlQ29tcGxleChzdHlsZSwgcCwgYnMsIGVzLCB0cnVlLCBcInRyYW5zcGFyZW50XCIsIHB0LCAwLCBwbHVnaW4pO1xuXG5cdFx0XHRcdFx0fSBlbHNlIGlmIChpc1N0ciAmJiBfY29tcGxleEV4cC50ZXN0KGVzKSkge1xuXHRcdFx0XHRcdFx0cHQgPSBfcGFyc2VDb21wbGV4KHN0eWxlLCBwLCBicywgZXMsIHRydWUsIG51bGwsIHB0LCAwLCBwbHVnaW4pO1xuXG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdGJuID0gcGFyc2VGbG9hdChicyk7XG5cdFx0XHRcdFx0XHRic2Z4ID0gKGJuIHx8IGJuID09PSAwKSA/IGJzLnN1YnN0cigoYm4gKyBcIlwiKS5sZW5ndGgpIDogXCJcIjsgLy9yZW1lbWJlciwgYnMgY291bGQgYmUgbm9uLW51bWVyaWMgbGlrZSBcIm5vcm1hbFwiIGZvciBmb250V2VpZ2h0LCBzbyB3ZSBzaG91bGQgZGVmYXVsdCB0byBhIGJsYW5rIHN1ZmZpeCBpbiB0aGF0IGNhc2UuXG5cblx0XHRcdFx0XHRcdGlmIChicyA9PT0gXCJcIiB8fCBicyA9PT0gXCJhdXRvXCIpIHtcblx0XHRcdFx0XHRcdFx0aWYgKHAgPT09IFwid2lkdGhcIiB8fCBwID09PSBcImhlaWdodFwiKSB7XG5cdFx0XHRcdFx0XHRcdFx0Ym4gPSBfZ2V0RGltZW5zaW9uKHRhcmdldCwgcCwgX2NzKTtcblx0XHRcdFx0XHRcdFx0XHRic2Z4ID0gXCJweFwiO1xuXHRcdFx0XHRcdFx0XHR9IGVsc2UgaWYgKHAgPT09IFwibGVmdFwiIHx8IHAgPT09IFwidG9wXCIpIHtcblx0XHRcdFx0XHRcdFx0XHRibiA9IF9jYWxjdWxhdGVPZmZzZXQodGFyZ2V0LCBwLCBfY3MpO1xuXHRcdFx0XHRcdFx0XHRcdGJzZnggPSBcInB4XCI7XG5cdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdFx0Ym4gPSAocCAhPT0gXCJvcGFjaXR5XCIpID8gMCA6IDE7XG5cdFx0XHRcdFx0XHRcdFx0YnNmeCA9IFwiXCI7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0cmVsID0gKGlzU3RyICYmIGVzLmNoYXJBdCgxKSA9PT0gXCI9XCIpO1xuXHRcdFx0XHRcdFx0aWYgKHJlbCkge1xuXHRcdFx0XHRcdFx0XHRlbiA9IHBhcnNlSW50KGVzLmNoYXJBdCgwKSArIFwiMVwiLCAxMCk7XG5cdFx0XHRcdFx0XHRcdGVzID0gZXMuc3Vic3RyKDIpO1xuXHRcdFx0XHRcdFx0XHRlbiAqPSBwYXJzZUZsb2F0KGVzKTtcblx0XHRcdFx0XHRcdFx0ZXNmeCA9IGVzLnJlcGxhY2UoX3N1ZmZpeEV4cCwgXCJcIik7XG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRlbiA9IHBhcnNlRmxvYXQoZXMpO1xuXHRcdFx0XHRcdFx0XHRlc2Z4ID0gaXNTdHIgPyBlcy5yZXBsYWNlKF9zdWZmaXhFeHAsIFwiXCIpIDogXCJcIjtcblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0aWYgKGVzZnggPT09IFwiXCIpIHtcblx0XHRcdFx0XHRcdFx0ZXNmeCA9IChwIGluIF9zdWZmaXhNYXApID8gX3N1ZmZpeE1hcFtwXSA6IGJzZng7IC8vcG9wdWxhdGUgdGhlIGVuZCBzdWZmaXgsIHByaW9yaXRpemluZyB0aGUgbWFwLCB0aGVuIGlmIG5vbmUgaXMgZm91bmQsIHVzZSB0aGUgYmVnaW5uaW5nIHN1ZmZpeC5cblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0ZXMgPSAoZW4gfHwgZW4gPT09IDApID8gKHJlbCA/IGVuICsgYm4gOiBlbikgKyBlc2Z4IDogdmFyc1twXTsgLy9lbnN1cmVzIHRoYXQgYW55ICs9IG9yIC09IHByZWZpeGVzIGFyZSB0YWtlbiBjYXJlIG9mLiBSZWNvcmQgdGhlIGVuZCB2YWx1ZSBiZWZvcmUgbm9ybWFsaXppbmcgdGhlIHN1ZmZpeCBiZWNhdXNlIHdlIGFsd2F5cyB3YW50IHRvIGVuZCB0aGUgdHdlZW4gb24gZXhhY3RseSB3aGF0IHRoZXkgaW50ZW5kZWQgZXZlbiBpZiBpdCBkb2Vzbid0IG1hdGNoIHRoZSBiZWdpbm5pbmcgdmFsdWUncyBzdWZmaXguXG5cdFx0XHRcdFx0XHQvL2lmIHRoZSBiZWdpbm5pbmcvZW5kaW5nIHN1ZmZpeGVzIGRvbid0IG1hdGNoLCBub3JtYWxpemUgdGhlbS4uLlxuXHRcdFx0XHRcdFx0aWYgKGJzZnggIT09IGVzZngpIGlmIChlc2Z4ICE9PSBcIlwiIHx8IHAgPT09IFwibGluZUhlaWdodFwiKSBpZiAoZW4gfHwgZW4gPT09IDApIGlmIChibikgeyAvL25vdGU6IGlmIHRoZSBiZWdpbm5pbmcgdmFsdWUgKGJuKSBpcyAwLCB3ZSBkb24ndCBuZWVkIHRvIGNvbnZlcnQgdW5pdHMhXG5cdFx0XHRcdFx0XHRcdGJuID0gX2NvbnZlcnRUb1BpeGVscyh0YXJnZXQsIHAsIGJuLCBic2Z4KTtcblx0XHRcdFx0XHRcdFx0aWYgKGVzZnggPT09IFwiJVwiKSB7XG5cdFx0XHRcdFx0XHRcdFx0Ym4gLz0gX2NvbnZlcnRUb1BpeGVscyh0YXJnZXQsIHAsIDEwMCwgXCIlXCIpIC8gMTAwO1xuXHRcdFx0XHRcdFx0XHRcdGlmICh2YXJzLnN0cmljdFVuaXRzICE9PSB0cnVlKSB7IC8vc29tZSBicm93c2VycyByZXBvcnQgb25seSBcInB4XCIgdmFsdWVzIGluc3RlYWQgb2YgYWxsb3dpbmcgXCIlXCIgd2l0aCBnZXRDb21wdXRlZFN0eWxlKCksIHNvIHdlIGFzc3VtZSB0aGF0IGlmIHdlJ3JlIHR3ZWVuaW5nIHRvIGEgJSwgd2Ugc2hvdWxkIHN0YXJ0IHRoZXJlIHRvbyB1bmxlc3Mgc3RyaWN0VW5pdHM6dHJ1ZSBpcyBkZWZpbmVkLiBUaGlzIGFwcHJvYWNoIGlzIHBhcnRpY3VsYXJseSB1c2VmdWwgZm9yIHJlc3BvbnNpdmUgZGVzaWducyB0aGF0IHVzZSBmcm9tKCkgdHdlZW5zLlxuXHRcdFx0XHRcdFx0XHRcdFx0YnMgPSBibiArIFwiJVwiO1xuXHRcdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0XHR9IGVsc2UgaWYgKGVzZnggPT09IFwiZW1cIiB8fCBlc2Z4ID09PSBcInJlbVwiIHx8IGVzZnggPT09IFwidndcIiB8fCBlc2Z4ID09PSBcInZoXCIpIHtcblx0XHRcdFx0XHRcdFx0XHRibiAvPSBfY29udmVydFRvUGl4ZWxzKHRhcmdldCwgcCwgMSwgZXNmeCk7XG5cblx0XHRcdFx0XHRcdFx0Ly9vdGhlcndpc2UgY29udmVydCB0byBwaXhlbHMuXG5cdFx0XHRcdFx0XHRcdH0gZWxzZSBpZiAoZXNmeCAhPT0gXCJweFwiKSB7XG5cdFx0XHRcdFx0XHRcdFx0ZW4gPSBfY29udmVydFRvUGl4ZWxzKHRhcmdldCwgcCwgZW4sIGVzZngpO1xuXHRcdFx0XHRcdFx0XHRcdGVzZnggPSBcInB4XCI7IC8vd2UgZG9uJ3QgdXNlIGJzZnggYWZ0ZXIgdGhpcywgc28gd2UgZG9uJ3QgbmVlZCB0byBzZXQgaXQgdG8gcHggdG9vLlxuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdGlmIChyZWwpIGlmIChlbiB8fCBlbiA9PT0gMCkge1xuXHRcdFx0XHRcdFx0XHRcdGVzID0gKGVuICsgYm4pICsgZXNmeDsgLy90aGUgY2hhbmdlcyB3ZSBtYWRlIGFmZmVjdCByZWxhdGl2ZSBjYWxjdWxhdGlvbnMsIHNvIGFkanVzdCB0aGUgZW5kIHZhbHVlIGhlcmUuXG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0aWYgKHJlbCkge1xuXHRcdFx0XHRcdFx0XHRlbiArPSBibjtcblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0aWYgKChibiB8fCBibiA9PT0gMCkgJiYgKGVuIHx8IGVuID09PSAwKSkgeyAvL2Zhc3RlciB0aGFuIGlzTmFOKCkuIEFsc28sIHByZXZpb3VzbHkgd2UgcmVxdWlyZWQgZW4gIT09IGJuIGJ1dCB0aGF0IGRvZXNuJ3QgcmVhbGx5IGdhaW4gbXVjaCBwZXJmb3JtYW5jZSBhbmQgaXQgcHJldmVudHMgX3BhcnNlVG9Qcm94eSgpIGZyb20gd29ya2luZyBwcm9wZXJseSBpZiBiZWdpbm5pbmcgYW5kIGVuZGluZyB2YWx1ZXMgbWF0Y2ggYnV0IG5lZWQgdG8gZ2V0IHR3ZWVuZWQgYnkgYW4gZXh0ZXJuYWwgcGx1Z2luIGFueXdheS4gRm9yIGV4YW1wbGUsIGEgYmV6aWVyIHR3ZWVuIHdoZXJlIHRoZSB0YXJnZXQgc3RhcnRzIGF0IGxlZnQ6MCBhbmQgaGFzIHRoZXNlIHBvaW50czogW3tsZWZ0OjUwfSx7bGVmdDowfV0gd291bGRuJ3Qgd29yayBwcm9wZXJseSBiZWNhdXNlIHdoZW4gcGFyc2luZyB0aGUgbGFzdCBwb2ludCwgaXQnZCBtYXRjaCB0aGUgZmlyc3QgKGN1cnJlbnQpIG9uZSBhbmQgYSBub24tdHdlZW5pbmcgQ1NTUHJvcFR3ZWVuIHdvdWxkIGJlIHJlY29yZGVkIHdoZW4gd2UgYWN0dWFsbHkgbmVlZCBhIG5vcm1hbCB0d2VlbiAodHlwZTowKSBzbyB0aGF0IHRoaW5ncyBnZXQgdXBkYXRlZCBkdXJpbmcgdGhlIHR3ZWVuIHByb3Blcmx5LlxuXHRcdFx0XHRcdFx0XHRwdCA9IG5ldyBDU1NQcm9wVHdlZW4oc3R5bGUsIHAsIGJuLCBlbiAtIGJuLCBwdCwgMCwgcCwgKF9hdXRvUm91bmQgIT09IGZhbHNlICYmIChlc2Z4ID09PSBcInB4XCIgfHwgcCA9PT0gXCJ6SW5kZXhcIikpLCAwLCBicywgZXMpO1xuXHRcdFx0XHRcdFx0XHRwdC54czAgPSBlc2Z4O1xuXHRcdFx0XHRcdFx0XHQvL0RFQlVHOiBfbG9nKFwidHdlZW4gXCIrcCtcIiBmcm9tIFwiK3B0LmIrXCIgKFwiK2JuK2VzZngrXCIpIHRvIFwiK3B0LmUrXCIgd2l0aCBzdWZmaXg6IFwiK3B0LnhzMCk7XG5cdFx0XHRcdFx0XHR9IGVsc2UgaWYgKHN0eWxlW3BdID09PSB1bmRlZmluZWQgfHwgIWVzICYmIChlcyArIFwiXCIgPT09IFwiTmFOXCIgfHwgZXMgPT0gbnVsbCkpIHtcblx0XHRcdFx0XHRcdFx0X2xvZyhcImludmFsaWQgXCIgKyBwICsgXCIgdHdlZW4gdmFsdWU6IFwiICsgdmFyc1twXSk7XG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRwdCA9IG5ldyBDU1NQcm9wVHdlZW4oc3R5bGUsIHAsIGVuIHx8IGJuIHx8IDAsIDAsIHB0LCAtMSwgcCwgZmFsc2UsIDAsIGJzLCBlcyk7XG5cdFx0XHRcdFx0XHRcdHB0LnhzMCA9IChlcyA9PT0gXCJub25lXCIgJiYgKHAgPT09IFwiZGlzcGxheVwiIHx8IHAuaW5kZXhPZihcIlN0eWxlXCIpICE9PSAtMSkpID8gYnMgOiBlczsgLy9pbnRlcm1lZGlhdGUgdmFsdWUgc2hvdWxkIHR5cGljYWxseSBiZSBzZXQgaW1tZWRpYXRlbHkgKGVuZCB2YWx1ZSkgZXhjZXB0IGZvciBcImRpc3BsYXlcIiBvciB0aGluZ3MgbGlrZSBib3JkZXJUb3BTdHlsZSwgYm9yZGVyQm90dG9tU3R5bGUsIGV0Yy4gd2hpY2ggc2hvdWxkIHVzZSB0aGUgYmVnaW5uaW5nIHZhbHVlIGR1cmluZyB0aGUgdHdlZW4uXG5cdFx0XHRcdFx0XHRcdC8vREVCVUc6IF9sb2coXCJub24tdHdlZW5pbmcgdmFsdWUgXCIrcCtcIjogXCIrcHQueHMwKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKHBsdWdpbikgaWYgKHB0ICYmICFwdC5wbHVnaW4pIHtcblx0XHRcdFx0XHRwdC5wbHVnaW4gPSBwbHVnaW47XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdHJldHVybiBwdDtcblx0XHR9O1xuXG5cblx0XHQvL2dldHMgY2FsbGVkIGV2ZXJ5IHRpbWUgdGhlIHR3ZWVuIHVwZGF0ZXMsIHBhc3NpbmcgdGhlIG5ldyByYXRpbyAodHlwaWNhbGx5IGEgdmFsdWUgYmV0d2VlbiAwIGFuZCAxLCBidXQgbm90IGFsd2F5cyAoZm9yIGV4YW1wbGUsIGlmIGFuIEVsYXN0aWMuZWFzZU91dCBpcyB1c2VkLCB0aGUgdmFsdWUgY2FuIGp1bXAgYWJvdmUgMSBtaWQtdHdlZW4pLiBJdCB3aWxsIGFsd2F5cyBzdGFydCBhbmQgMCBhbmQgZW5kIGF0IDEuXG5cdFx0cC5zZXRSYXRpbyA9IGZ1bmN0aW9uKHYpIHtcblx0XHRcdHZhciBwdCA9IHRoaXMuX2ZpcnN0UFQsXG5cdFx0XHRcdG1pbiA9IDAuMDAwMDAxLFxuXHRcdFx0XHR2YWwsIHN0ciwgaTtcblx0XHRcdC8vYXQgdGhlIGVuZCBvZiB0aGUgdHdlZW4sIHdlIHNldCB0aGUgdmFsdWVzIHRvIGV4YWN0bHkgd2hhdCB3ZSByZWNlaXZlZCBpbiBvcmRlciB0byBtYWtlIHN1cmUgbm9uLXR3ZWVuaW5nIHZhbHVlcyAobGlrZSBcInBvc2l0aW9uXCIgb3IgXCJmbG9hdFwiIG9yIHdoYXRldmVyKSBhcmUgc2V0IGFuZCBzbyB0aGF0IGlmIHRoZSBiZWdpbm5pbmcvZW5kaW5nIHN1ZmZpeGVzICh1bml0cykgZGlkbid0IG1hdGNoIGFuZCB3ZSBub3JtYWxpemVkIHRvIHB4LCB0aGUgdmFsdWUgdGhhdCB0aGUgdXNlciBwYXNzZWQgaW4gaXMgdXNlZCBoZXJlLiBXZSBjaGVjayB0byBzZWUgaWYgdGhlIHR3ZWVuIGlzIGF0IGl0cyBiZWdpbm5pbmcgaW4gY2FzZSBpdCdzIGEgZnJvbSgpIHR3ZWVuIGluIHdoaWNoIGNhc2UgdGhlIHJhdGlvIHdpbGwgYWN0dWFsbHkgZ28gZnJvbSAxIHRvIDAgb3ZlciB0aGUgY291cnNlIG9mIHRoZSB0d2VlbiAoYmFja3dhcmRzKS5cblx0XHRcdGlmICh2ID09PSAxICYmICh0aGlzLl90d2Vlbi5fdGltZSA9PT0gdGhpcy5fdHdlZW4uX2R1cmF0aW9uIHx8IHRoaXMuX3R3ZWVuLl90aW1lID09PSAwKSkge1xuXHRcdFx0XHR3aGlsZSAocHQpIHtcblx0XHRcdFx0XHRpZiAocHQudHlwZSAhPT0gMikge1xuXHRcdFx0XHRcdFx0aWYgKHB0LnIgJiYgcHQudHlwZSAhPT0gLTEpIHtcblx0XHRcdFx0XHRcdFx0dmFsID0gTWF0aC5yb3VuZChwdC5zICsgcHQuYyk7XG5cdFx0XHRcdFx0XHRcdGlmICghcHQudHlwZSkge1xuXHRcdFx0XHRcdFx0XHRcdHB0LnRbcHQucF0gPSB2YWwgKyBwdC54czA7XG5cdFx0XHRcdFx0XHRcdH0gZWxzZSBpZiAocHQudHlwZSA9PT0gMSkgeyAvL2NvbXBsZXggdmFsdWUgKG9uZSB0aGF0IHR5cGljYWxseSBoYXMgbXVsdGlwbGUgbnVtYmVycyBpbnNpZGUgYSBzdHJpbmcsIGxpa2UgXCJyZWN0KDVweCwxMHB4LDIwcHgsMjVweClcIlxuXHRcdFx0XHRcdFx0XHRcdGkgPSBwdC5sO1xuXHRcdFx0XHRcdFx0XHRcdHN0ciA9IHB0LnhzMCArIHZhbCArIHB0LnhzMTtcblx0XHRcdFx0XHRcdFx0XHRmb3IgKGkgPSAxOyBpIDwgcHQubDsgaSsrKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRzdHIgKz0gcHRbXCJ4blwiK2ldICsgcHRbXCJ4c1wiKyhpKzEpXTtcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0cHQudFtwdC5wXSA9IHN0cjtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0cHQudFtwdC5wXSA9IHB0LmU7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdHB0LnNldFJhdGlvKHYpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRwdCA9IHB0Ll9uZXh0O1xuXHRcdFx0XHR9XG5cblx0XHRcdH0gZWxzZSBpZiAodiB8fCAhKHRoaXMuX3R3ZWVuLl90aW1lID09PSB0aGlzLl90d2Vlbi5fZHVyYXRpb24gfHwgdGhpcy5fdHdlZW4uX3RpbWUgPT09IDApIHx8IHRoaXMuX3R3ZWVuLl9yYXdQcmV2VGltZSA9PT0gLTAuMDAwMDAxKSB7XG5cdFx0XHRcdHdoaWxlIChwdCkge1xuXHRcdFx0XHRcdHZhbCA9IHB0LmMgKiB2ICsgcHQucztcblx0XHRcdFx0XHRpZiAocHQucikge1xuXHRcdFx0XHRcdFx0dmFsID0gTWF0aC5yb3VuZCh2YWwpO1xuXHRcdFx0XHRcdH0gZWxzZSBpZiAodmFsIDwgbWluKSBpZiAodmFsID4gLW1pbikge1xuXHRcdFx0XHRcdFx0dmFsID0gMDtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0aWYgKCFwdC50eXBlKSB7XG5cdFx0XHRcdFx0XHRwdC50W3B0LnBdID0gdmFsICsgcHQueHMwO1xuXHRcdFx0XHRcdH0gZWxzZSBpZiAocHQudHlwZSA9PT0gMSkgeyAvL2NvbXBsZXggdmFsdWUgKG9uZSB0aGF0IHR5cGljYWxseSBoYXMgbXVsdGlwbGUgbnVtYmVycyBpbnNpZGUgYSBzdHJpbmcsIGxpa2UgXCJyZWN0KDVweCwxMHB4LDIwcHgsMjVweClcIlxuXHRcdFx0XHRcdFx0aSA9IHB0Lmw7XG5cdFx0XHRcdFx0XHRpZiAoaSA9PT0gMikge1xuXHRcdFx0XHRcdFx0XHRwdC50W3B0LnBdID0gcHQueHMwICsgdmFsICsgcHQueHMxICsgcHQueG4xICsgcHQueHMyO1xuXHRcdFx0XHRcdFx0fSBlbHNlIGlmIChpID09PSAzKSB7XG5cdFx0XHRcdFx0XHRcdHB0LnRbcHQucF0gPSBwdC54czAgKyB2YWwgKyBwdC54czEgKyBwdC54bjEgKyBwdC54czIgKyBwdC54bjIgKyBwdC54czM7XG5cdFx0XHRcdFx0XHR9IGVsc2UgaWYgKGkgPT09IDQpIHtcblx0XHRcdFx0XHRcdFx0cHQudFtwdC5wXSA9IHB0LnhzMCArIHZhbCArIHB0LnhzMSArIHB0LnhuMSArIHB0LnhzMiArIHB0LnhuMiArIHB0LnhzMyArIHB0LnhuMyArIHB0LnhzNDtcblx0XHRcdFx0XHRcdH0gZWxzZSBpZiAoaSA9PT0gNSkge1xuXHRcdFx0XHRcdFx0XHRwdC50W3B0LnBdID0gcHQueHMwICsgdmFsICsgcHQueHMxICsgcHQueG4xICsgcHQueHMyICsgcHQueG4yICsgcHQueHMzICsgcHQueG4zICsgcHQueHM0ICsgcHQueG40ICsgcHQueHM1O1xuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0c3RyID0gcHQueHMwICsgdmFsICsgcHQueHMxO1xuXHRcdFx0XHRcdFx0XHRmb3IgKGkgPSAxOyBpIDwgcHQubDsgaSsrKSB7XG5cdFx0XHRcdFx0XHRcdFx0c3RyICs9IHB0W1wieG5cIitpXSArIHB0W1wieHNcIisoaSsxKV07XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0cHQudFtwdC5wXSA9IHN0cjtcblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdH0gZWxzZSBpZiAocHQudHlwZSA9PT0gLTEpIHsgLy9ub24tdHdlZW5pbmcgdmFsdWVcblx0XHRcdFx0XHRcdHB0LnRbcHQucF0gPSBwdC54czA7XG5cblx0XHRcdFx0XHR9IGVsc2UgaWYgKHB0LnNldFJhdGlvKSB7IC8vY3VzdG9tIHNldFJhdGlvKCkgZm9yIHRoaW5ncyBsaWtlIFNwZWNpYWxQcm9wcywgZXh0ZXJuYWwgcGx1Z2lucywgZXRjLlxuXHRcdFx0XHRcdFx0cHQuc2V0UmF0aW8odik7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHB0ID0gcHQuX25leHQ7XG5cdFx0XHRcdH1cblxuXHRcdFx0Ly9pZiB0aGUgdHdlZW4gaXMgcmV2ZXJzZWQgYWxsIHRoZSB3YXkgYmFjayB0byB0aGUgYmVnaW5uaW5nLCB3ZSBuZWVkIHRvIHJlc3RvcmUgdGhlIG9yaWdpbmFsIHZhbHVlcyB3aGljaCBtYXkgaGF2ZSBkaWZmZXJlbnQgdW5pdHMgKGxpa2UgJSBpbnN0ZWFkIG9mIHB4IG9yIGVtIG9yIHdoYXRldmVyKS5cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHdoaWxlIChwdCkge1xuXHRcdFx0XHRcdGlmIChwdC50eXBlICE9PSAyKSB7XG5cdFx0XHRcdFx0XHRwdC50W3B0LnBdID0gcHQuYjtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0cHQuc2V0UmF0aW8odik7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHB0ID0gcHQuX25leHQ7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9O1xuXG5cdFx0LyoqXG5cdFx0ICogQHByaXZhdGVcblx0XHQgKiBGb3JjZXMgcmVuZGVyaW5nIG9mIHRoZSB0YXJnZXQncyB0cmFuc2Zvcm1zIChyb3RhdGlvbiwgc2NhbGUsIGV0Yy4pIHdoZW5ldmVyIHRoZSBDU1NQbHVnaW4ncyBzZXRSYXRpbygpIGlzIGNhbGxlZC5cblx0XHQgKiBCYXNpY2FsbHksIHRoaXMgdGVsbHMgdGhlIENTU1BsdWdpbiB0byBjcmVhdGUgYSBDU1NQcm9wVHdlZW4gKHR5cGUgMikgYWZ0ZXIgaW5zdGFudGlhdGlvbiB0aGF0IHJ1bnMgbGFzdCBpbiB0aGUgbGlua2VkXG5cdFx0ICogbGlzdCBhbmQgY2FsbHMgdGhlIGFwcHJvcHJpYXRlICgzRCBvciAyRCkgcmVuZGVyaW5nIGZ1bmN0aW9uLiBXZSBzZXBhcmF0ZSB0aGlzIGludG8gaXRzIG93biBtZXRob2Qgc28gdGhhdCB3ZSBjYW4gY2FsbFxuXHRcdCAqIGl0IGZyb20gb3RoZXIgcGx1Z2lucyBsaWtlIEJlemllclBsdWdpbiBpZiwgZm9yIGV4YW1wbGUsIGl0IG5lZWRzIHRvIGFwcGx5IGFuIGF1dG9Sb3RhdGlvbiBhbmQgdGhpcyBDU1NQbHVnaW5cblx0XHQgKiBkb2Vzbid0IGhhdmUgYW55IHRyYW5zZm9ybS1yZWxhdGVkIHByb3BlcnRpZXMgb2YgaXRzIG93bi4gWW91IGNhbiBjYWxsIHRoaXMgbWV0aG9kIGFzIG1hbnkgdGltZXMgYXMgeW91XG5cdFx0ICogd2FudCBhbmQgaXQgd29uJ3QgY3JlYXRlIGR1cGxpY2F0ZSBDU1NQcm9wVHdlZW5zLlxuXHRcdCAqXG5cdFx0ICogQHBhcmFtIHtib29sZWFufSB0aHJlZUQgaWYgdHJ1ZSwgaXQgc2hvdWxkIGFwcGx5IDNEIHR3ZWVucyAob3RoZXJ3aXNlLCBqdXN0IDJEIG9uZXMgYXJlIGZpbmUgYW5kIHR5cGljYWxseSBmYXN0ZXIpXG5cdFx0ICovXG5cdFx0cC5fZW5hYmxlVHJhbnNmb3JtcyA9IGZ1bmN0aW9uKHRocmVlRCkge1xuXHRcdFx0dGhpcy5fdHJhbnNmb3JtID0gdGhpcy5fdHJhbnNmb3JtIHx8IF9nZXRUcmFuc2Zvcm0odGhpcy5fdGFyZ2V0LCBfY3MsIHRydWUpOyAvL2Vuc3VyZXMgdGhhdCB0aGUgZWxlbWVudCBoYXMgYSBfZ3NUcmFuc2Zvcm0gcHJvcGVydHkgd2l0aCB0aGUgYXBwcm9wcmlhdGUgdmFsdWVzLlxuXHRcdFx0dGhpcy5fdHJhbnNmb3JtVHlwZSA9ICghKHRoaXMuX3RyYW5zZm9ybS5zdmcgJiYgX3VzZVNWR1RyYW5zZm9ybUF0dHIpICYmICh0aHJlZUQgfHwgdGhpcy5fdHJhbnNmb3JtVHlwZSA9PT0gMykpID8gMyA6IDI7XG5cdFx0fTtcblxuXHRcdHZhciBsYXp5U2V0ID0gZnVuY3Rpb24odikge1xuXHRcdFx0dGhpcy50W3RoaXMucF0gPSB0aGlzLmU7XG5cdFx0XHR0aGlzLmRhdGEuX2xpbmtDU1NQKHRoaXMsIHRoaXMuX25leHQsIG51bGwsIHRydWUpOyAvL3dlIHB1cnBvc2VmdWxseSBrZWVwIHRoaXMuX25leHQgZXZlbiB0aG91Z2ggaXQnZCBtYWtlIHNlbnNlIHRvIG51bGwgaXQsIGJ1dCB0aGlzIGlzIGEgcGVyZm9ybWFuY2Ugb3B0aW1pemF0aW9uLCBhcyB0aGlzIGhhcHBlbnMgZHVyaW5nIHRoZSB3aGlsZSAocHQpIHt9IGxvb3AgaW4gc2V0UmF0aW8oKSBhdCB0aGUgYm90dG9tIG9mIHdoaWNoIGl0IHNldHMgcHQgPSBwdC5fbmV4dCwgc28gaWYgd2UgbnVsbCBpdCwgdGhlIGxpbmtlZCBsaXN0IHdpbGwgYmUgYnJva2VuIGluIHRoYXQgbG9vcC5cblx0XHR9O1xuXHRcdC8qKiBAcHJpdmF0ZSBHaXZlcyB1cyBhIHdheSB0byBzZXQgYSB2YWx1ZSBvbiB0aGUgZmlyc3QgcmVuZGVyIChhbmQgb25seSB0aGUgZmlyc3QgcmVuZGVyKS4gKiovXG5cdFx0cC5fYWRkTGF6eVNldCA9IGZ1bmN0aW9uKHQsIHAsIHYpIHtcblx0XHRcdHZhciBwdCA9IHRoaXMuX2ZpcnN0UFQgPSBuZXcgQ1NTUHJvcFR3ZWVuKHQsIHAsIDAsIDAsIHRoaXMuX2ZpcnN0UFQsIDIpO1xuXHRcdFx0cHQuZSA9IHY7XG5cdFx0XHRwdC5zZXRSYXRpbyA9IGxhenlTZXQ7XG5cdFx0XHRwdC5kYXRhID0gdGhpcztcblx0XHR9O1xuXG5cdFx0LyoqIEBwcml2YXRlICoqL1xuXHRcdHAuX2xpbmtDU1NQID0gZnVuY3Rpb24ocHQsIG5leHQsIHByZXYsIHJlbW92ZSkge1xuXHRcdFx0aWYgKHB0KSB7XG5cdFx0XHRcdGlmIChuZXh0KSB7XG5cdFx0XHRcdFx0bmV4dC5fcHJldiA9IHB0O1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmIChwdC5fbmV4dCkge1xuXHRcdFx0XHRcdHB0Ll9uZXh0Ll9wcmV2ID0gcHQuX3ByZXY7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKHB0Ll9wcmV2KSB7XG5cdFx0XHRcdFx0cHQuX3ByZXYuX25leHQgPSBwdC5fbmV4dDtcblx0XHRcdFx0fSBlbHNlIGlmICh0aGlzLl9maXJzdFBUID09PSBwdCkge1xuXHRcdFx0XHRcdHRoaXMuX2ZpcnN0UFQgPSBwdC5fbmV4dDtcblx0XHRcdFx0XHRyZW1vdmUgPSB0cnVlOyAvL2p1c3QgdG8gcHJldmVudCByZXNldHRpbmcgdGhpcy5fZmlyc3RQVCA1IGxpbmVzIGRvd24gaW4gY2FzZSBwdC5fbmV4dCBpcyBudWxsLiAob3B0aW1pemVkIGZvciBzcGVlZClcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAocHJldikge1xuXHRcdFx0XHRcdHByZXYuX25leHQgPSBwdDtcblx0XHRcdFx0fSBlbHNlIGlmICghcmVtb3ZlICYmIHRoaXMuX2ZpcnN0UFQgPT09IG51bGwpIHtcblx0XHRcdFx0XHR0aGlzLl9maXJzdFBUID0gcHQ7XG5cdFx0XHRcdH1cblx0XHRcdFx0cHQuX25leHQgPSBuZXh0O1xuXHRcdFx0XHRwdC5fcHJldiA9IHByZXY7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gcHQ7XG5cdFx0fTtcblxuXHRcdHAuX21vZCA9IGZ1bmN0aW9uKGxvb2t1cCkge1xuXHRcdFx0dmFyIHB0ID0gdGhpcy5fZmlyc3RQVDtcblx0XHRcdHdoaWxlIChwdCkge1xuXHRcdFx0XHRpZiAodHlwZW9mKGxvb2t1cFtwdC5wXSkgPT09IFwiZnVuY3Rpb25cIiAmJiBsb29rdXBbcHQucF0gPT09IE1hdGgucm91bmQpIHsgLy9vbmx5IGdldHMgY2FsbGVkIGJ5IFJvdW5kUHJvcHNQbHVnaW4gKE1vZGlmeVBsdWdpbiBtYW5hZ2VzIGFsbCB0aGUgcmVuZGVyaW5nIGludGVybmFsbHkgZm9yIENTU1BsdWdpbiBwcm9wZXJ0aWVzIHRoYXQgbmVlZCBtb2RpZmljYXRpb24pLiBSZW1lbWJlciwgd2UgaGFuZGxlIHJvdW5kaW5nIGEgYml0IGRpZmZlcmVudGx5IGluIHRoaXMgcGx1Z2luIGZvciBwZXJmb3JtYW5jZSByZWFzb25zLCBsZXZlcmFnaW5nIFwiclwiIGFzIGFuIGluZGljYXRvciB0aGF0IHRoZSB2YWx1ZSBzaG91bGQgYmUgcm91bmRlZCBpbnRlcm5hbGx5Li5cblx0XHRcdFx0XHRwdC5yID0gMTtcblx0XHRcdFx0fVxuXHRcdFx0XHRwdCA9IHB0Ll9uZXh0O1xuXHRcdFx0fVxuXHRcdH07XG5cblx0XHQvL3dlIG5lZWQgdG8gbWFrZSBzdXJlIHRoYXQgaWYgYWxwaGEgb3IgYXV0b0FscGhhIGlzIGtpbGxlZCwgb3BhY2l0eSBpcyB0b28uIEFuZCBhdXRvQWxwaGEgYWZmZWN0cyB0aGUgXCJ2aXNpYmlsaXR5XCIgcHJvcGVydHkuXG5cdFx0cC5fa2lsbCA9IGZ1bmN0aW9uKGxvb2t1cCkge1xuXHRcdFx0dmFyIGNvcHkgPSBsb29rdXAsXG5cdFx0XHRcdHB0LCBwLCB4Zmlyc3Q7XG5cdFx0XHRpZiAobG9va3VwLmF1dG9BbHBoYSB8fCBsb29rdXAuYWxwaGEpIHtcblx0XHRcdFx0Y29weSA9IHt9O1xuXHRcdFx0XHRmb3IgKHAgaW4gbG9va3VwKSB7IC8vY29weSB0aGUgbG9va3VwIHNvIHRoYXQgd2UncmUgbm90IGNoYW5naW5nIHRoZSBvcmlnaW5hbCB3aGljaCBtYXkgYmUgcGFzc2VkIGVsc2V3aGVyZS5cblx0XHRcdFx0XHRjb3B5W3BdID0gbG9va3VwW3BdO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGNvcHkub3BhY2l0eSA9IDE7XG5cdFx0XHRcdGlmIChjb3B5LmF1dG9BbHBoYSkge1xuXHRcdFx0XHRcdGNvcHkudmlzaWJpbGl0eSA9IDE7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdGlmIChsb29rdXAuY2xhc3NOYW1lICYmIChwdCA9IHRoaXMuX2NsYXNzTmFtZVBUKSkgeyAvL2ZvciBjbGFzc05hbWUgdHdlZW5zLCB3ZSBuZWVkIHRvIGtpbGwgYW55IGFzc29jaWF0ZWQgQ1NTUHJvcFR3ZWVucyB0b287IGEgbGlua2VkIGxpc3Qgc3RhcnRzIGF0IHRoZSBjbGFzc05hbWUncyBcInhmaXJzdFwiLlxuXHRcdFx0XHR4Zmlyc3QgPSBwdC54Zmlyc3Q7XG5cdFx0XHRcdGlmICh4Zmlyc3QgJiYgeGZpcnN0Ll9wcmV2KSB7XG5cdFx0XHRcdFx0dGhpcy5fbGlua0NTU1AoeGZpcnN0Ll9wcmV2LCBwdC5fbmV4dCwgeGZpcnN0Ll9wcmV2Ll9wcmV2KTsgLy9icmVhayBvZmYgdGhlIHByZXZcblx0XHRcdFx0fSBlbHNlIGlmICh4Zmlyc3QgPT09IHRoaXMuX2ZpcnN0UFQpIHtcblx0XHRcdFx0XHR0aGlzLl9maXJzdFBUID0gcHQuX25leHQ7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKHB0Ll9uZXh0KSB7XG5cdFx0XHRcdFx0dGhpcy5fbGlua0NTU1AocHQuX25leHQsIHB0Ll9uZXh0Ll9uZXh0LCB4Zmlyc3QuX3ByZXYpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHRoaXMuX2NsYXNzTmFtZVBUID0gbnVsbDtcblx0XHRcdH1cblx0XHRcdHB0ID0gdGhpcy5fZmlyc3RQVDtcblx0XHRcdHdoaWxlIChwdCkge1xuXHRcdFx0XHRpZiAocHQucGx1Z2luICYmIHB0LnBsdWdpbiAhPT0gcCAmJiBwdC5wbHVnaW4uX2tpbGwpIHsgLy9mb3IgcGx1Z2lucyB0aGF0IGFyZSByZWdpc3RlcmVkIHdpdGggQ1NTUGx1Z2luLCB3ZSBzaG91bGQgbm90aWZ5IHRoZW0gb2YgdGhlIGtpbGwuXG5cdFx0XHRcdFx0cHQucGx1Z2luLl9raWxsKGxvb2t1cCk7XG5cdFx0XHRcdFx0cCA9IHB0LnBsdWdpbjtcblx0XHRcdFx0fVxuXHRcdFx0XHRwdCA9IHB0Ll9uZXh0O1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIFR3ZWVuUGx1Z2luLnByb3RvdHlwZS5fa2lsbC5jYWxsKHRoaXMsIGNvcHkpO1xuXHRcdH07XG5cblxuXG5cdFx0Ly91c2VkIGJ5IGNhc2NhZGVUbygpIGZvciBnYXRoZXJpbmcgYWxsIHRoZSBzdHlsZSBwcm9wZXJ0aWVzIG9mIGVhY2ggY2hpbGQgZWxlbWVudCBpbnRvIGFuIGFycmF5IGZvciBjb21wYXJpc29uLlxuXHRcdHZhciBfZ2V0Q2hpbGRTdHlsZXMgPSBmdW5jdGlvbihlLCBwcm9wcywgdGFyZ2V0cykge1xuXHRcdFx0XHR2YXIgY2hpbGRyZW4sIGksIGNoaWxkLCB0eXBlO1xuXHRcdFx0XHRpZiAoZS5zbGljZSkge1xuXHRcdFx0XHRcdGkgPSBlLmxlbmd0aDtcblx0XHRcdFx0XHR3aGlsZSAoLS1pID4gLTEpIHtcblx0XHRcdFx0XHRcdF9nZXRDaGlsZFN0eWxlcyhlW2ldLCBwcm9wcywgdGFyZ2V0cyk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0fVxuXHRcdFx0XHRjaGlsZHJlbiA9IGUuY2hpbGROb2Rlcztcblx0XHRcdFx0aSA9IGNoaWxkcmVuLmxlbmd0aDtcblx0XHRcdFx0d2hpbGUgKC0taSA+IC0xKSB7XG5cdFx0XHRcdFx0Y2hpbGQgPSBjaGlsZHJlbltpXTtcblx0XHRcdFx0XHR0eXBlID0gY2hpbGQudHlwZTtcblx0XHRcdFx0XHRpZiAoY2hpbGQuc3R5bGUpIHtcblx0XHRcdFx0XHRcdHByb3BzLnB1c2goX2dldEFsbFN0eWxlcyhjaGlsZCkpO1xuXHRcdFx0XHRcdFx0aWYgKHRhcmdldHMpIHtcblx0XHRcdFx0XHRcdFx0dGFyZ2V0cy5wdXNoKGNoaWxkKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0aWYgKCh0eXBlID09PSAxIHx8IHR5cGUgPT09IDkgfHwgdHlwZSA9PT0gMTEpICYmIGNoaWxkLmNoaWxkTm9kZXMubGVuZ3RoKSB7XG5cdFx0XHRcdFx0XHRfZ2V0Q2hpbGRTdHlsZXMoY2hpbGQsIHByb3BzLCB0YXJnZXRzKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH07XG5cblx0XHQvKipcblx0XHQgKiBUeXBpY2FsbHkgb25seSB1c2VmdWwgZm9yIGNsYXNzTmFtZSB0d2VlbnMgdGhhdCBtYXkgYWZmZWN0IGNoaWxkIGVsZW1lbnRzLCB0aGlzIG1ldGhvZCBjcmVhdGVzIGEgVHdlZW5MaXRlXG5cdFx0ICogYW5kIHRoZW4gY29tcGFyZXMgdGhlIHN0eWxlIHByb3BlcnRpZXMgb2YgYWxsIHRoZSB0YXJnZXQncyBjaGlsZCBlbGVtZW50cyBhdCB0aGUgdHdlZW4ncyBzdGFydCBhbmQgZW5kLCBhbmRcblx0XHQgKiBpZiBhbnkgYXJlIGRpZmZlcmVudCwgaXQgYWxzbyBjcmVhdGVzIHR3ZWVucyBmb3IgdGhvc2UgYW5kIHJldHVybnMgYW4gYXJyYXkgY29udGFpbmluZyBBTEwgb2YgdGhlIHJlc3VsdGluZ1xuXHRcdCAqIHR3ZWVucyAoc28gdGhhdCB5b3UgY2FuIGVhc2lseSBhZGQoKSB0aGVtIHRvIGEgVGltZWxpbmVMaXRlLCBmb3IgZXhhbXBsZSkuIFRoZSByZWFzb24gdGhpcyBmdW5jdGlvbmFsaXR5IGlzXG5cdFx0ICogd3JhcHBlZCBpbnRvIGEgc2VwYXJhdGUgc3RhdGljIG1ldGhvZCBvZiBDU1NQbHVnaW4gaW5zdGVhZCBvZiBiZWluZyBpbnRlZ3JhdGVkIGludG8gYWxsIHJlZ3VsYXIgY2xhc3NOYW1lIHR3ZWVuc1xuXHRcdCAqIGlzIGJlY2F1c2UgaXQgY3JlYXRlcyBlbnRpcmVseSBuZXcgdHdlZW5zIHRoYXQgbWF5IGhhdmUgY29tcGxldGVseSBkaWZmZXJlbnQgdGFyZ2V0cyB0aGFuIHRoZSBvcmlnaW5hbCB0d2Vlbixcblx0XHQgKiBzbyBpZiB0aGV5IHdlcmUgYWxsIGx1bXBlZCBpbnRvIHRoZSBvcmlnaW5hbCB0d2VlbiBpbnN0YW5jZSwgaXQgd291bGQgYmUgaW5jb25zaXN0ZW50IHdpdGggdGhlIHJlc3Qgb2YgdGhlIEFQSVxuXHRcdCAqIGFuZCBpdCB3b3VsZCBjcmVhdGUgb3RoZXIgcHJvYmxlbXMuIEZvciBleGFtcGxlOlxuXHRcdCAqICAtIElmIEkgY3JlYXRlIGEgdHdlZW4gb2YgZWxlbWVudEEsIHRoYXQgdHdlZW4gaW5zdGFuY2UgbWF5IHN1ZGRlbmx5IGNoYW5nZSBpdHMgdGFyZ2V0IHRvIGluY2x1ZGUgNTAgb3RoZXIgZWxlbWVudHMgKHVuaW50dWl0aXZlIGlmIEkgc3BlY2lmaWNhbGx5IGRlZmluZWQgdGhlIHRhcmdldCBJIHdhbnRlZClcblx0XHQgKiAgLSBXZSBjYW4ndCBqdXN0IGNyZWF0ZSBuZXcgaW5kZXBlbmRlbnQgdHdlZW5zIGJlY2F1c2Ugb3RoZXJ3aXNlLCB3aGF0IGhhcHBlbnMgaWYgdGhlIG9yaWdpbmFsL3BhcmVudCB0d2VlbiBpcyByZXZlcnNlZCBvciBwYXVzZSBvciBkcm9wcGVkIGludG8gYSBUaW1lbGluZUxpdGUgZm9yIHRpZ2h0IGNvbnRyb2w/IFlvdSdkIGV4cGVjdCB0aGF0IHR3ZWVuJ3MgYmVoYXZpb3IgdG8gYWZmZWN0IGFsbCB0aGUgb3RoZXJzLlxuXHRcdCAqICAtIEFuYWx5emluZyBldmVyeSBzdHlsZSBwcm9wZXJ0eSBvZiBldmVyeSBjaGlsZCBiZWZvcmUgYW5kIGFmdGVyIHRoZSB0d2VlbiBpcyBhbiBleHBlbnNpdmUgb3BlcmF0aW9uIHdoZW4gdGhlcmUgYXJlIG1hbnkgY2hpbGRyZW4sIHNvIHRoaXMgYmVoYXZpb3Igc2hvdWxkbid0IGJlIGltcG9zZWQgb24gYWxsIGNsYXNzTmFtZSB0d2VlbnMgYnkgZGVmYXVsdCwgZXNwZWNpYWxseSBzaW5jZSBpdCdzIHByb2JhYmx5IHJhcmUgdGhhdCB0aGlzIGV4dHJhIGZ1bmN0aW9uYWxpdHkgaXMgbmVlZGVkLlxuXHRcdCAqXG5cdFx0ICogQHBhcmFtIHtPYmplY3R9IHRhcmdldCBvYmplY3QgdG8gYmUgdHdlZW5lZFxuXHRcdCAqIEBwYXJhbSB7bnVtYmVyfSBEdXJhdGlvbiBpbiBzZWNvbmRzIChvciBmcmFtZXMgZm9yIGZyYW1lcy1iYXNlZCB0d2VlbnMpXG5cdFx0ICogQHBhcmFtIHtPYmplY3R9IE9iamVjdCBjb250YWluaW5nIHRoZSBlbmQgdmFsdWVzLCBsaWtlIHtjbGFzc05hbWU6XCJuZXdDbGFzc1wiLCBlYXNlOkxpbmVhci5lYXNlTm9uZX1cblx0XHQgKiBAcmV0dXJuIHtBcnJheX0gQW4gYXJyYXkgb2YgVHdlZW5MaXRlIGluc3RhbmNlc1xuXHRcdCAqL1xuXHRcdENTU1BsdWdpbi5jYXNjYWRlVG8gPSBmdW5jdGlvbih0YXJnZXQsIGR1cmF0aW9uLCB2YXJzKSB7XG5cdFx0XHR2YXIgdHdlZW4gPSBUd2VlbkxpdGUudG8odGFyZ2V0LCBkdXJhdGlvbiwgdmFycyksXG5cdFx0XHRcdHJlc3VsdHMgPSBbdHdlZW5dLFxuXHRcdFx0XHRiID0gW10sXG5cdFx0XHRcdGUgPSBbXSxcblx0XHRcdFx0dGFyZ2V0cyA9IFtdLFxuXHRcdFx0XHRfcmVzZXJ2ZWRQcm9wcyA9IFR3ZWVuTGl0ZS5faW50ZXJuYWxzLnJlc2VydmVkUHJvcHMsXG5cdFx0XHRcdGksIGRpZnMsIHAsIGZyb207XG5cdFx0XHR0YXJnZXQgPSB0d2Vlbi5fdGFyZ2V0cyB8fCB0d2Vlbi50YXJnZXQ7XG5cdFx0XHRfZ2V0Q2hpbGRTdHlsZXModGFyZ2V0LCBiLCB0YXJnZXRzKTtcblx0XHRcdHR3ZWVuLnJlbmRlcihkdXJhdGlvbiwgdHJ1ZSwgdHJ1ZSk7XG5cdFx0XHRfZ2V0Q2hpbGRTdHlsZXModGFyZ2V0LCBlKTtcblx0XHRcdHR3ZWVuLnJlbmRlcigwLCB0cnVlLCB0cnVlKTtcblx0XHRcdHR3ZWVuLl9lbmFibGVkKHRydWUpO1xuXHRcdFx0aSA9IHRhcmdldHMubGVuZ3RoO1xuXHRcdFx0d2hpbGUgKC0taSA+IC0xKSB7XG5cdFx0XHRcdGRpZnMgPSBfY3NzRGlmKHRhcmdldHNbaV0sIGJbaV0sIGVbaV0pO1xuXHRcdFx0XHRpZiAoZGlmcy5maXJzdE1QVCkge1xuXHRcdFx0XHRcdGRpZnMgPSBkaWZzLmRpZnM7XG5cdFx0XHRcdFx0Zm9yIChwIGluIHZhcnMpIHtcblx0XHRcdFx0XHRcdGlmIChfcmVzZXJ2ZWRQcm9wc1twXSkge1xuXHRcdFx0XHRcdFx0XHRkaWZzW3BdID0gdmFyc1twXTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0ZnJvbSA9IHt9O1xuXHRcdFx0XHRcdGZvciAocCBpbiBkaWZzKSB7XG5cdFx0XHRcdFx0XHRmcm9tW3BdID0gYltpXVtwXTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0cmVzdWx0cy5wdXNoKFR3ZWVuTGl0ZS5mcm9tVG8odGFyZ2V0c1tpXSwgZHVyYXRpb24sIGZyb20sIGRpZnMpKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHJlc3VsdHM7XG5cdFx0fTtcblxuXHRcdFR3ZWVuUGx1Z2luLmFjdGl2YXRlKFtDU1NQbHVnaW5dKTtcblx0XHRyZXR1cm4gQ1NTUGx1Z2luO1xuXG5cdH0sIHRydWUpO1xuXG5cdFxuXHRcblx0XG5cdFxuXHRcblx0XG5cdFxuXHRcblx0XG5cdFxuLypcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIFJvdW5kUHJvcHNQbHVnaW5cbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqL1xuXHQoZnVuY3Rpb24oKSB7XG5cblx0XHR2YXIgUm91bmRQcm9wc1BsdWdpbiA9IF9nc1Njb3BlLl9nc0RlZmluZS5wbHVnaW4oe1xuXHRcdFx0XHRwcm9wTmFtZTogXCJyb3VuZFByb3BzXCIsXG5cdFx0XHRcdHZlcnNpb246IFwiMS42LjBcIixcblx0XHRcdFx0cHJpb3JpdHk6IC0xLFxuXHRcdFx0XHRBUEk6IDIsXG5cblx0XHRcdFx0Ly9jYWxsZWQgd2hlbiB0aGUgdHdlZW4gcmVuZGVycyBmb3IgdGhlIGZpcnN0IHRpbWUuIFRoaXMgaXMgd2hlcmUgaW5pdGlhbCB2YWx1ZXMgc2hvdWxkIGJlIHJlY29yZGVkIGFuZCBhbnkgc2V0dXAgcm91dGluZXMgc2hvdWxkIHJ1bi5cblx0XHRcdFx0aW5pdDogZnVuY3Rpb24odGFyZ2V0LCB2YWx1ZSwgdHdlZW4pIHtcblx0XHRcdFx0XHR0aGlzLl90d2VlbiA9IHR3ZWVuO1xuXHRcdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0XHR9XG5cblx0XHRcdH0pLFxuXHRcdFx0X3JvdW5kTGlua2VkTGlzdCA9IGZ1bmN0aW9uKG5vZGUpIHtcblx0XHRcdFx0d2hpbGUgKG5vZGUpIHtcblx0XHRcdFx0XHRpZiAoIW5vZGUuZiAmJiAhbm9kZS5ibG9iKSB7XG5cdFx0XHRcdFx0XHRub2RlLm0gPSBNYXRoLnJvdW5kO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRub2RlID0gbm9kZS5fbmV4dDtcblx0XHRcdFx0fVxuXHRcdFx0fSxcblx0XHRcdHAgPSBSb3VuZFByb3BzUGx1Z2luLnByb3RvdHlwZTtcblxuXHRcdHAuX29uSW5pdEFsbFByb3BzID0gZnVuY3Rpb24oKSB7XG5cdFx0XHR2YXIgdHdlZW4gPSB0aGlzLl90d2Vlbixcblx0XHRcdFx0cnAgPSAodHdlZW4udmFycy5yb3VuZFByb3BzLmpvaW4pID8gdHdlZW4udmFycy5yb3VuZFByb3BzIDogdHdlZW4udmFycy5yb3VuZFByb3BzLnNwbGl0KFwiLFwiKSxcblx0XHRcdFx0aSA9IHJwLmxlbmd0aCxcblx0XHRcdFx0bG9va3VwID0ge30sXG5cdFx0XHRcdHJwdCA9IHR3ZWVuLl9wcm9wTG9va3VwLnJvdW5kUHJvcHMsXG5cdFx0XHRcdHByb3AsIHB0LCBuZXh0O1xuXHRcdFx0d2hpbGUgKC0taSA+IC0xKSB7XG5cdFx0XHRcdGxvb2t1cFtycFtpXV0gPSBNYXRoLnJvdW5kO1xuXHRcdFx0fVxuXHRcdFx0aSA9IHJwLmxlbmd0aDtcblx0XHRcdHdoaWxlICgtLWkgPiAtMSkge1xuXHRcdFx0XHRwcm9wID0gcnBbaV07XG5cdFx0XHRcdHB0ID0gdHdlZW4uX2ZpcnN0UFQ7XG5cdFx0XHRcdHdoaWxlIChwdCkge1xuXHRcdFx0XHRcdG5leHQgPSBwdC5fbmV4dDsgLy9yZWNvcmQgaGVyZSwgYmVjYXVzZSBpdCBtYXkgZ2V0IHJlbW92ZWRcblx0XHRcdFx0XHRpZiAocHQucGcpIHtcblx0XHRcdFx0XHRcdHB0LnQuX21vZChsb29rdXApO1xuXHRcdFx0XHRcdH0gZWxzZSBpZiAocHQubiA9PT0gcHJvcCkge1xuXHRcdFx0XHRcdFx0aWYgKHB0LmYgPT09IDIgJiYgcHQudCkgeyAvL2EgYmxvYiAodGV4dCBjb250YWluaW5nIG11bHRpcGxlIG51bWVyaWMgdmFsdWVzKVxuXHRcdFx0XHRcdFx0XHRfcm91bmRMaW5rZWRMaXN0KHB0LnQuX2ZpcnN0UFQpO1xuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0dGhpcy5fYWRkKHB0LnQsIHByb3AsIHB0LnMsIHB0LmMpO1xuXHRcdFx0XHRcdFx0XHQvL3JlbW92ZSBmcm9tIGxpbmtlZCBsaXN0XG5cdFx0XHRcdFx0XHRcdGlmIChuZXh0KSB7XG5cdFx0XHRcdFx0XHRcdFx0bmV4dC5fcHJldiA9IHB0Ll9wcmV2O1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdGlmIChwdC5fcHJldikge1xuXHRcdFx0XHRcdFx0XHRcdHB0Ll9wcmV2Ll9uZXh0ID0gbmV4dDtcblx0XHRcdFx0XHRcdFx0fSBlbHNlIGlmICh0d2Vlbi5fZmlyc3RQVCA9PT0gcHQpIHtcblx0XHRcdFx0XHRcdFx0XHR0d2Vlbi5fZmlyc3RQVCA9IG5leHQ7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0cHQuX25leHQgPSBwdC5fcHJldiA9IG51bGw7XG5cdFx0XHRcdFx0XHRcdHR3ZWVuLl9wcm9wTG9va3VwW3Byb3BdID0gcnB0O1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRwdCA9IG5leHQ7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9O1xuXG5cdFx0cC5fYWRkID0gZnVuY3Rpb24odGFyZ2V0LCBwLCBzLCBjKSB7XG5cdFx0XHR0aGlzLl9hZGRUd2Vlbih0YXJnZXQsIHAsIHMsIHMgKyBjLCBwLCBNYXRoLnJvdW5kKTtcblx0XHRcdHRoaXMuX292ZXJ3cml0ZVByb3BzLnB1c2gocCk7XG5cdFx0fTtcblxuXHR9KCkpO1xuXG5cblxuXG5cblxuXG5cblxuXG4vKlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQXR0clBsdWdpblxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICovXG5cblx0KGZ1bmN0aW9uKCkge1xuXG5cdFx0X2dzU2NvcGUuX2dzRGVmaW5lLnBsdWdpbih7XG5cdFx0XHRwcm9wTmFtZTogXCJhdHRyXCIsXG5cdFx0XHRBUEk6IDIsXG5cdFx0XHR2ZXJzaW9uOiBcIjAuNi4xXCIsXG5cblx0XHRcdC8vY2FsbGVkIHdoZW4gdGhlIHR3ZWVuIHJlbmRlcnMgZm9yIHRoZSBmaXJzdCB0aW1lLiBUaGlzIGlzIHdoZXJlIGluaXRpYWwgdmFsdWVzIHNob3VsZCBiZSByZWNvcmRlZCBhbmQgYW55IHNldHVwIHJvdXRpbmVzIHNob3VsZCBydW4uXG5cdFx0XHRpbml0OiBmdW5jdGlvbih0YXJnZXQsIHZhbHVlLCB0d2VlbiwgaW5kZXgpIHtcblx0XHRcdFx0dmFyIHAsIGVuZDtcblx0XHRcdFx0aWYgKHR5cGVvZih0YXJnZXQuc2V0QXR0cmlidXRlKSAhPT0gXCJmdW5jdGlvblwiKSB7XG5cdFx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGZvciAocCBpbiB2YWx1ZSkge1xuXHRcdFx0XHRcdGVuZCA9IHZhbHVlW3BdO1xuXHRcdFx0XHRcdGlmICh0eXBlb2YoZW5kKSA9PT0gXCJmdW5jdGlvblwiKSB7XG5cdFx0XHRcdFx0XHRlbmQgPSBlbmQoaW5kZXgsIHRhcmdldCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHRoaXMuX2FkZFR3ZWVuKHRhcmdldCwgXCJzZXRBdHRyaWJ1dGVcIiwgdGFyZ2V0LmdldEF0dHJpYnV0ZShwKSArIFwiXCIsIGVuZCArIFwiXCIsIHAsIGZhbHNlLCBwKTtcblx0XHRcdFx0XHR0aGlzLl9vdmVyd3JpdGVQcm9wcy5wdXNoKHApO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0fVxuXG5cdFx0fSk7XG5cblx0fSgpKTtcblxuXG5cblxuXG5cblxuXG5cblxuLypcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIERpcmVjdGlvbmFsUm90YXRpb25QbHVnaW5cbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqL1xuXHRfZ3NTY29wZS5fZ3NEZWZpbmUucGx1Z2luKHtcblx0XHRwcm9wTmFtZTogXCJkaXJlY3Rpb25hbFJvdGF0aW9uXCIsXG5cdFx0dmVyc2lvbjogXCIwLjMuMVwiLFxuXHRcdEFQSTogMixcblxuXHRcdC8vY2FsbGVkIHdoZW4gdGhlIHR3ZWVuIHJlbmRlcnMgZm9yIHRoZSBmaXJzdCB0aW1lLiBUaGlzIGlzIHdoZXJlIGluaXRpYWwgdmFsdWVzIHNob3VsZCBiZSByZWNvcmRlZCBhbmQgYW55IHNldHVwIHJvdXRpbmVzIHNob3VsZCBydW4uXG5cdFx0aW5pdDogZnVuY3Rpb24odGFyZ2V0LCB2YWx1ZSwgdHdlZW4sIGluZGV4KSB7XG5cdFx0XHRpZiAodHlwZW9mKHZhbHVlKSAhPT0gXCJvYmplY3RcIikge1xuXHRcdFx0XHR2YWx1ZSA9IHtyb3RhdGlvbjp2YWx1ZX07XG5cdFx0XHR9XG5cdFx0XHR0aGlzLmZpbmFscyA9IHt9O1xuXHRcdFx0dmFyIGNhcCA9ICh2YWx1ZS51c2VSYWRpYW5zID09PSB0cnVlKSA/IE1hdGguUEkgKiAyIDogMzYwLFxuXHRcdFx0XHRtaW4gPSAwLjAwMDAwMSxcblx0XHRcdFx0cCwgdiwgc3RhcnQsIGVuZCwgZGlmLCBzcGxpdDtcblx0XHRcdGZvciAocCBpbiB2YWx1ZSkge1xuXHRcdFx0XHRpZiAocCAhPT0gXCJ1c2VSYWRpYW5zXCIpIHtcblx0XHRcdFx0XHRlbmQgPSB2YWx1ZVtwXTtcblx0XHRcdFx0XHRpZiAodHlwZW9mKGVuZCkgPT09IFwiZnVuY3Rpb25cIikge1xuXHRcdFx0XHRcdFx0ZW5kID0gZW5kKGluZGV4LCB0YXJnZXQpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRzcGxpdCA9IChlbmQgKyBcIlwiKS5zcGxpdChcIl9cIik7XG5cdFx0XHRcdFx0diA9IHNwbGl0WzBdO1xuXHRcdFx0XHRcdHN0YXJ0ID0gcGFyc2VGbG9hdCggKHR5cGVvZih0YXJnZXRbcF0pICE9PSBcImZ1bmN0aW9uXCIpID8gdGFyZ2V0W3BdIDogdGFyZ2V0WyAoKHAuaW5kZXhPZihcInNldFwiKSB8fCB0eXBlb2YodGFyZ2V0W1wiZ2V0XCIgKyBwLnN1YnN0cigzKV0pICE9PSBcImZ1bmN0aW9uXCIpID8gcCA6IFwiZ2V0XCIgKyBwLnN1YnN0cigzKSkgXSgpICk7XG5cdFx0XHRcdFx0ZW5kID0gdGhpcy5maW5hbHNbcF0gPSAodHlwZW9mKHYpID09PSBcInN0cmluZ1wiICYmIHYuY2hhckF0KDEpID09PSBcIj1cIikgPyBzdGFydCArIHBhcnNlSW50KHYuY2hhckF0KDApICsgXCIxXCIsIDEwKSAqIE51bWJlcih2LnN1YnN0cigyKSkgOiBOdW1iZXIodikgfHwgMDtcblx0XHRcdFx0XHRkaWYgPSBlbmQgLSBzdGFydDtcblx0XHRcdFx0XHRpZiAoc3BsaXQubGVuZ3RoKSB7XG5cdFx0XHRcdFx0XHR2ID0gc3BsaXQuam9pbihcIl9cIik7XG5cdFx0XHRcdFx0XHRpZiAodi5pbmRleE9mKFwic2hvcnRcIikgIT09IC0xKSB7XG5cdFx0XHRcdFx0XHRcdGRpZiA9IGRpZiAlIGNhcDtcblx0XHRcdFx0XHRcdFx0aWYgKGRpZiAhPT0gZGlmICUgKGNhcCAvIDIpKSB7XG5cdFx0XHRcdFx0XHRcdFx0ZGlmID0gKGRpZiA8IDApID8gZGlmICsgY2FwIDogZGlmIC0gY2FwO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRpZiAodi5pbmRleE9mKFwiX2N3XCIpICE9PSAtMSAmJiBkaWYgPCAwKSB7XG5cdFx0XHRcdFx0XHRcdGRpZiA9ICgoZGlmICsgY2FwICogOTk5OTk5OTk5OSkgJSBjYXApIC0gKChkaWYgLyBjYXApIHwgMCkgKiBjYXA7XG5cdFx0XHRcdFx0XHR9IGVsc2UgaWYgKHYuaW5kZXhPZihcImNjd1wiKSAhPT0gLTEgJiYgZGlmID4gMCkge1xuXHRcdFx0XHRcdFx0XHRkaWYgPSAoKGRpZiAtIGNhcCAqIDk5OTk5OTk5OTkpICUgY2FwKSAtICgoZGlmIC8gY2FwKSB8IDApICogY2FwO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRpZiAoZGlmID4gbWluIHx8IGRpZiA8IC1taW4pIHtcblx0XHRcdFx0XHRcdHRoaXMuX2FkZFR3ZWVuKHRhcmdldCwgcCwgc3RhcnQsIHN0YXJ0ICsgZGlmLCBwKTtcblx0XHRcdFx0XHRcdHRoaXMuX292ZXJ3cml0ZVByb3BzLnB1c2gocCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9LFxuXG5cdFx0Ly9jYWxsZWQgZWFjaCB0aW1lIHRoZSB2YWx1ZXMgc2hvdWxkIGJlIHVwZGF0ZWQsIGFuZCB0aGUgcmF0aW8gZ2V0cyBwYXNzZWQgYXMgdGhlIG9ubHkgcGFyYW1ldGVyICh0eXBpY2FsbHkgaXQncyBhIHZhbHVlIGJldHdlZW4gMCBhbmQgMSwgYnV0IGl0IGNhbiBleGNlZWQgdGhvc2Ugd2hlbiB1c2luZyBhbiBlYXNlIGxpa2UgRWxhc3RpYy5lYXNlT3V0IG9yIEJhY2suZWFzZU91dCwgZXRjLilcblx0XHRzZXQ6IGZ1bmN0aW9uKHJhdGlvKSB7XG5cdFx0XHR2YXIgcHQ7XG5cdFx0XHRpZiAocmF0aW8gIT09IDEpIHtcblx0XHRcdFx0dGhpcy5fc3VwZXIuc2V0UmF0aW8uY2FsbCh0aGlzLCByYXRpbyk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRwdCA9IHRoaXMuX2ZpcnN0UFQ7XG5cdFx0XHRcdHdoaWxlIChwdCkge1xuXHRcdFx0XHRcdGlmIChwdC5mKSB7XG5cdFx0XHRcdFx0XHRwdC50W3B0LnBdKHRoaXMuZmluYWxzW3B0LnBdKTtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0cHQudFtwdC5wXSA9IHRoaXMuZmluYWxzW3B0LnBdO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRwdCA9IHB0Ll9uZXh0O1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdH0pLl9hdXRvQ1NTID0gdHJ1ZTtcblxuXG5cblxuXG5cblxuXHRcblx0XG5cdFxuXHRcbi8qXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBFYXNlUGFja1xuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICovXG5cdF9nc1Njb3BlLl9nc0RlZmluZShcImVhc2luZy5CYWNrXCIsIFtcImVhc2luZy5FYXNlXCJdLCBmdW5jdGlvbihFYXNlKSB7XG5cdFx0XG5cdFx0dmFyIHcgPSAoX2dzU2NvcGUuR3JlZW5Tb2NrR2xvYmFscyB8fCBfZ3NTY29wZSksXG5cdFx0XHRncyA9IHcuY29tLmdyZWVuc29jayxcblx0XHRcdF8yUEkgPSBNYXRoLlBJICogMixcblx0XHRcdF9IQUxGX1BJID0gTWF0aC5QSSAvIDIsXG5cdFx0XHRfY2xhc3MgPSBncy5fY2xhc3MsXG5cdFx0XHRfY3JlYXRlID0gZnVuY3Rpb24obiwgZikge1xuXHRcdFx0XHR2YXIgQyA9IF9jbGFzcyhcImVhc2luZy5cIiArIG4sIGZ1bmN0aW9uKCl7fSwgdHJ1ZSksXG5cdFx0XHRcdFx0cCA9IEMucHJvdG90eXBlID0gbmV3IEVhc2UoKTtcblx0XHRcdFx0cC5jb25zdHJ1Y3RvciA9IEM7XG5cdFx0XHRcdHAuZ2V0UmF0aW8gPSBmO1xuXHRcdFx0XHRyZXR1cm4gQztcblx0XHRcdH0sXG5cdFx0XHRfZWFzZVJlZyA9IEVhc2UucmVnaXN0ZXIgfHwgZnVuY3Rpb24oKXt9LCAvL3B1dCBhbiBlbXB0eSBmdW5jdGlvbiBpbiBwbGFjZSBqdXN0IGFzIGEgc2FmZXR5IG1lYXN1cmUgaW4gY2FzZSBzb21lb25lIGxvYWRzIGFuIE9MRCB2ZXJzaW9uIG9mIFR3ZWVuTGl0ZS5qcyB3aGVyZSBFYXNlLnJlZ2lzdGVyIGRvZXNuJ3QgZXhpc3QuXG5cdFx0XHRfd3JhcCA9IGZ1bmN0aW9uKG5hbWUsIEVhc2VPdXQsIEVhc2VJbiwgRWFzZUluT3V0LCBhbGlhc2VzKSB7XG5cdFx0XHRcdHZhciBDID0gX2NsYXNzKFwiZWFzaW5nLlwiK25hbWUsIHtcblx0XHRcdFx0XHRlYXNlT3V0Om5ldyBFYXNlT3V0KCksXG5cdFx0XHRcdFx0ZWFzZUluOm5ldyBFYXNlSW4oKSxcblx0XHRcdFx0XHRlYXNlSW5PdXQ6bmV3IEVhc2VJbk91dCgpXG5cdFx0XHRcdH0sIHRydWUpO1xuXHRcdFx0XHRfZWFzZVJlZyhDLCBuYW1lKTtcblx0XHRcdFx0cmV0dXJuIEM7XG5cdFx0XHR9LFxuXHRcdFx0RWFzZVBvaW50ID0gZnVuY3Rpb24odGltZSwgdmFsdWUsIG5leHQpIHtcblx0XHRcdFx0dGhpcy50ID0gdGltZTtcblx0XHRcdFx0dGhpcy52ID0gdmFsdWU7XG5cdFx0XHRcdGlmIChuZXh0KSB7XG5cdFx0XHRcdFx0dGhpcy5uZXh0ID0gbmV4dDtcblx0XHRcdFx0XHRuZXh0LnByZXYgPSB0aGlzO1xuXHRcdFx0XHRcdHRoaXMuYyA9IG5leHQudiAtIHZhbHVlO1xuXHRcdFx0XHRcdHRoaXMuZ2FwID0gbmV4dC50IC0gdGltZTtcblx0XHRcdFx0fVxuXHRcdFx0fSxcblxuXHRcdFx0Ly9CYWNrXG5cdFx0XHRfY3JlYXRlQmFjayA9IGZ1bmN0aW9uKG4sIGYpIHtcblx0XHRcdFx0dmFyIEMgPSBfY2xhc3MoXCJlYXNpbmcuXCIgKyBuLCBmdW5jdGlvbihvdmVyc2hvb3QpIHtcblx0XHRcdFx0XHRcdHRoaXMuX3AxID0gKG92ZXJzaG9vdCB8fCBvdmVyc2hvb3QgPT09IDApID8gb3ZlcnNob290IDogMS43MDE1ODtcblx0XHRcdFx0XHRcdHRoaXMuX3AyID0gdGhpcy5fcDEgKiAxLjUyNTtcblx0XHRcdFx0XHR9LCB0cnVlKSxcblx0XHRcdFx0XHRwID0gQy5wcm90b3R5cGUgPSBuZXcgRWFzZSgpO1xuXHRcdFx0XHRwLmNvbnN0cnVjdG9yID0gQztcblx0XHRcdFx0cC5nZXRSYXRpbyA9IGY7XG5cdFx0XHRcdHAuY29uZmlnID0gZnVuY3Rpb24ob3ZlcnNob290KSB7XG5cdFx0XHRcdFx0cmV0dXJuIG5ldyBDKG92ZXJzaG9vdCk7XG5cdFx0XHRcdH07XG5cdFx0XHRcdHJldHVybiBDO1xuXHRcdFx0fSxcblxuXHRcdFx0QmFjayA9IF93cmFwKFwiQmFja1wiLFxuXHRcdFx0XHRfY3JlYXRlQmFjayhcIkJhY2tPdXRcIiwgZnVuY3Rpb24ocCkge1xuXHRcdFx0XHRcdHJldHVybiAoKHAgPSBwIC0gMSkgKiBwICogKCh0aGlzLl9wMSArIDEpICogcCArIHRoaXMuX3AxKSArIDEpO1xuXHRcdFx0XHR9KSxcblx0XHRcdFx0X2NyZWF0ZUJhY2soXCJCYWNrSW5cIiwgZnVuY3Rpb24ocCkge1xuXHRcdFx0XHRcdHJldHVybiBwICogcCAqICgodGhpcy5fcDEgKyAxKSAqIHAgLSB0aGlzLl9wMSk7XG5cdFx0XHRcdH0pLFxuXHRcdFx0XHRfY3JlYXRlQmFjayhcIkJhY2tJbk91dFwiLCBmdW5jdGlvbihwKSB7XG5cdFx0XHRcdFx0cmV0dXJuICgocCAqPSAyKSA8IDEpID8gMC41ICogcCAqIHAgKiAoKHRoaXMuX3AyICsgMSkgKiBwIC0gdGhpcy5fcDIpIDogMC41ICogKChwIC09IDIpICogcCAqICgodGhpcy5fcDIgKyAxKSAqIHAgKyB0aGlzLl9wMikgKyAyKTtcblx0XHRcdFx0fSlcblx0XHRcdCksXG5cblxuXHRcdFx0Ly9TbG93TW9cblx0XHRcdFNsb3dNbyA9IF9jbGFzcyhcImVhc2luZy5TbG93TW9cIiwgZnVuY3Rpb24obGluZWFyUmF0aW8sIHBvd2VyLCB5b3lvTW9kZSkge1xuXHRcdFx0XHRwb3dlciA9IChwb3dlciB8fCBwb3dlciA9PT0gMCkgPyBwb3dlciA6IDAuNztcblx0XHRcdFx0aWYgKGxpbmVhclJhdGlvID09IG51bGwpIHtcblx0XHRcdFx0XHRsaW5lYXJSYXRpbyA9IDAuNztcblx0XHRcdFx0fSBlbHNlIGlmIChsaW5lYXJSYXRpbyA+IDEpIHtcblx0XHRcdFx0XHRsaW5lYXJSYXRpbyA9IDE7XG5cdFx0XHRcdH1cblx0XHRcdFx0dGhpcy5fcCA9IChsaW5lYXJSYXRpbyAhPT0gMSkgPyBwb3dlciA6IDA7XG5cdFx0XHRcdHRoaXMuX3AxID0gKDEgLSBsaW5lYXJSYXRpbykgLyAyO1xuXHRcdFx0XHR0aGlzLl9wMiA9IGxpbmVhclJhdGlvO1xuXHRcdFx0XHR0aGlzLl9wMyA9IHRoaXMuX3AxICsgdGhpcy5fcDI7XG5cdFx0XHRcdHRoaXMuX2NhbGNFbmQgPSAoeW95b01vZGUgPT09IHRydWUpO1xuXHRcdFx0fSwgdHJ1ZSksXG5cdFx0XHRwID0gU2xvd01vLnByb3RvdHlwZSA9IG5ldyBFYXNlKCksXG5cdFx0XHRTdGVwcGVkRWFzZSwgRXhwb1NjYWxlRWFzZSwgUm91Z2hFYXNlLCBfY3JlYXRlRWxhc3RpYztcblxuXHRcdHAuY29uc3RydWN0b3IgPSBTbG93TW87XG5cdFx0cC5nZXRSYXRpbyA9IGZ1bmN0aW9uKHApIHtcblx0XHRcdHZhciByID0gcCArICgwLjUgLSBwKSAqIHRoaXMuX3A7XG5cdFx0XHRpZiAocCA8IHRoaXMuX3AxKSB7XG5cdFx0XHRcdHJldHVybiB0aGlzLl9jYWxjRW5kID8gMSAtICgocCA9IDEgLSAocCAvIHRoaXMuX3AxKSkgKiBwKSA6IHIgLSAoKHAgPSAxIC0gKHAgLyB0aGlzLl9wMSkpICogcCAqIHAgKiBwICogcik7XG5cdFx0XHR9IGVsc2UgaWYgKHAgPiB0aGlzLl9wMykge1xuXHRcdFx0XHRyZXR1cm4gdGhpcy5fY2FsY0VuZCA/IChwID09PSAxID8gMCA6IDEgLSAocCA9IChwIC0gdGhpcy5fcDMpIC8gdGhpcy5fcDEpICogcCkgOiByICsgKChwIC0gcikgKiAocCA9IChwIC0gdGhpcy5fcDMpIC8gdGhpcy5fcDEpICogcCAqIHAgKiBwKTsgLy9hZGRlZCBwID09PSAxID8gMCB0byBhdm9pZCBmbG9hdGluZyBwb2ludCByb3VuZGluZyBlcnJvcnMgZnJvbSBhZmZlY3RpbmcgdGhlIGZpbmFsIHZhbHVlLCBsaWtlIDEgLSAwLjcgPSAwLjMwMDAwMDAwMDAwMDAwMDA0IGluc3RlYWQgb2YgMC4zXG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gdGhpcy5fY2FsY0VuZCA/IDEgOiByO1xuXHRcdH07XG5cdFx0U2xvd01vLmVhc2UgPSBuZXcgU2xvd01vKDAuNywgMC43KTtcblxuXHRcdHAuY29uZmlnID0gU2xvd01vLmNvbmZpZyA9IGZ1bmN0aW9uKGxpbmVhclJhdGlvLCBwb3dlciwgeW95b01vZGUpIHtcblx0XHRcdHJldHVybiBuZXcgU2xvd01vKGxpbmVhclJhdGlvLCBwb3dlciwgeW95b01vZGUpO1xuXHRcdH07XG5cblxuXHRcdC8vU3RlcHBlZEVhc2Vcblx0XHRTdGVwcGVkRWFzZSA9IF9jbGFzcyhcImVhc2luZy5TdGVwcGVkRWFzZVwiLCBmdW5jdGlvbihzdGVwcywgaW1tZWRpYXRlU3RhcnQpIHtcblx0XHRcdFx0c3RlcHMgPSBzdGVwcyB8fCAxO1xuXHRcdFx0XHR0aGlzLl9wMSA9IDEgLyBzdGVwcztcblx0XHRcdFx0dGhpcy5fcDIgPSBzdGVwcyArIChpbW1lZGlhdGVTdGFydCA/IDAgOiAxKTtcblx0XHRcdFx0dGhpcy5fcDMgPSBpbW1lZGlhdGVTdGFydCA/IDEgOiAwO1xuXHRcdFx0fSwgdHJ1ZSk7XG5cdFx0cCA9IFN0ZXBwZWRFYXNlLnByb3RvdHlwZSA9IG5ldyBFYXNlKCk7XG5cdFx0cC5jb25zdHJ1Y3RvciA9IFN0ZXBwZWRFYXNlO1xuXHRcdHAuZ2V0UmF0aW8gPSBmdW5jdGlvbihwKSB7XG5cdFx0XHRpZiAocCA8IDApIHtcblx0XHRcdFx0cCA9IDA7XG5cdFx0XHR9IGVsc2UgaWYgKHAgPj0gMSkge1xuXHRcdFx0XHRwID0gMC45OTk5OTk5OTk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gKCgodGhpcy5fcDIgKiBwKSB8IDApICsgdGhpcy5fcDMpICogdGhpcy5fcDE7XG5cdFx0fTtcblx0XHRwLmNvbmZpZyA9IFN0ZXBwZWRFYXNlLmNvbmZpZyA9IGZ1bmN0aW9uKHN0ZXBzLCBpbW1lZGlhdGVTdGFydCkge1xuXHRcdFx0cmV0dXJuIG5ldyBTdGVwcGVkRWFzZShzdGVwcywgaW1tZWRpYXRlU3RhcnQpO1xuXHRcdH07XG5cblx0XHQvL0V4cG9TY2FsZUVhc2Vcblx0XHRFeHBvU2NhbGVFYXNlID0gX2NsYXNzKFwiZWFzaW5nLkV4cG9TY2FsZUVhc2VcIiwgZnVuY3Rpb24oc3RhcnQsIGVuZCwgZWFzZSkge1xuXHRcdFx0dGhpcy5fcDEgPSBNYXRoLmxvZyhlbmQgLyBzdGFydCk7XG5cdFx0XHR0aGlzLl9wMiA9IGVuZCAtIHN0YXJ0O1xuXHRcdFx0dGhpcy5fcDMgPSBzdGFydDtcblx0XHRcdHRoaXMuX2Vhc2UgPSBlYXNlO1xuXHRcdH0sIHRydWUpO1xuXHRcdHAgPSBFeHBvU2NhbGVFYXNlLnByb3RvdHlwZSA9IG5ldyBFYXNlKCk7XG5cdFx0cC5jb25zdHJ1Y3RvciA9IEV4cG9TY2FsZUVhc2U7XG5cdFx0cC5nZXRSYXRpbyA9IGZ1bmN0aW9uKHApIHtcblx0XHRcdGlmICh0aGlzLl9lYXNlKSB7XG5cdFx0XHRcdHAgPSB0aGlzLl9lYXNlLmdldFJhdGlvKHApO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuICh0aGlzLl9wMyAqIE1hdGguZXhwKHRoaXMuX3AxICogcCkgLSB0aGlzLl9wMykgLyB0aGlzLl9wMjtcblx0XHR9O1xuXHRcdHAuY29uZmlnID0gRXhwb1NjYWxlRWFzZS5jb25maWcgPSBmdW5jdGlvbihzdGFydCwgZW5kLCBlYXNlKSB7XG5cdFx0XHRyZXR1cm4gbmV3IEV4cG9TY2FsZUVhc2Uoc3RhcnQsIGVuZCwgZWFzZSk7XG5cdFx0fTtcblxuXG5cdFx0Ly9Sb3VnaEVhc2Vcblx0XHRSb3VnaEVhc2UgPSBfY2xhc3MoXCJlYXNpbmcuUm91Z2hFYXNlXCIsIGZ1bmN0aW9uKHZhcnMpIHtcblx0XHRcdHZhcnMgPSB2YXJzIHx8IHt9O1xuXHRcdFx0dmFyIHRhcGVyID0gdmFycy50YXBlciB8fCBcIm5vbmVcIixcblx0XHRcdFx0YSA9IFtdLFxuXHRcdFx0XHRjbnQgPSAwLFxuXHRcdFx0XHRwb2ludHMgPSAodmFycy5wb2ludHMgfHwgMjApIHwgMCxcblx0XHRcdFx0aSA9IHBvaW50cyxcblx0XHRcdFx0cmFuZG9taXplID0gKHZhcnMucmFuZG9taXplICE9PSBmYWxzZSksXG5cdFx0XHRcdGNsYW1wID0gKHZhcnMuY2xhbXAgPT09IHRydWUpLFxuXHRcdFx0XHR0ZW1wbGF0ZSA9ICh2YXJzLnRlbXBsYXRlIGluc3RhbmNlb2YgRWFzZSkgPyB2YXJzLnRlbXBsYXRlIDogbnVsbCxcblx0XHRcdFx0c3RyZW5ndGggPSAodHlwZW9mKHZhcnMuc3RyZW5ndGgpID09PSBcIm51bWJlclwiKSA/IHZhcnMuc3RyZW5ndGggKiAwLjQgOiAwLjQsXG5cdFx0XHRcdHgsIHksIGJ1bXAsIGludlgsIG9iaiwgcG50O1xuXHRcdFx0d2hpbGUgKC0taSA+IC0xKSB7XG5cdFx0XHRcdHggPSByYW5kb21pemUgPyBNYXRoLnJhbmRvbSgpIDogKDEgLyBwb2ludHMpICogaTtcblx0XHRcdFx0eSA9IHRlbXBsYXRlID8gdGVtcGxhdGUuZ2V0UmF0aW8oeCkgOiB4O1xuXHRcdFx0XHRpZiAodGFwZXIgPT09IFwibm9uZVwiKSB7XG5cdFx0XHRcdFx0YnVtcCA9IHN0cmVuZ3RoO1xuXHRcdFx0XHR9IGVsc2UgaWYgKHRhcGVyID09PSBcIm91dFwiKSB7XG5cdFx0XHRcdFx0aW52WCA9IDEgLSB4O1xuXHRcdFx0XHRcdGJ1bXAgPSBpbnZYICogaW52WCAqIHN0cmVuZ3RoO1xuXHRcdFx0XHR9IGVsc2UgaWYgKHRhcGVyID09PSBcImluXCIpIHtcblx0XHRcdFx0XHRidW1wID0geCAqIHggKiBzdHJlbmd0aDtcblx0XHRcdFx0fSBlbHNlIGlmICh4IDwgMC41KSB7ICAvL1wiYm90aFwiIChzdGFydClcblx0XHRcdFx0XHRpbnZYID0geCAqIDI7XG5cdFx0XHRcdFx0YnVtcCA9IGludlggKiBpbnZYICogMC41ICogc3RyZW5ndGg7XG5cdFx0XHRcdH0gZWxzZSB7XHRcdFx0XHQvL1wiYm90aFwiIChlbmQpXG5cdFx0XHRcdFx0aW52WCA9ICgxIC0geCkgKiAyO1xuXHRcdFx0XHRcdGJ1bXAgPSBpbnZYICogaW52WCAqIDAuNSAqIHN0cmVuZ3RoO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmIChyYW5kb21pemUpIHtcblx0XHRcdFx0XHR5ICs9IChNYXRoLnJhbmRvbSgpICogYnVtcCkgLSAoYnVtcCAqIDAuNSk7XG5cdFx0XHRcdH0gZWxzZSBpZiAoaSAlIDIpIHtcblx0XHRcdFx0XHR5ICs9IGJ1bXAgKiAwLjU7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0eSAtPSBidW1wICogMC41O1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmIChjbGFtcCkge1xuXHRcdFx0XHRcdGlmICh5ID4gMSkge1xuXHRcdFx0XHRcdFx0eSA9IDE7XG5cdFx0XHRcdFx0fSBlbHNlIGlmICh5IDwgMCkge1xuXHRcdFx0XHRcdFx0eSA9IDA7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdGFbY250KytdID0ge3g6eCwgeTp5fTtcblx0XHRcdH1cblx0XHRcdGEuc29ydChmdW5jdGlvbihhLCBiKSB7XG5cdFx0XHRcdHJldHVybiBhLnggLSBiLng7XG5cdFx0XHR9KTtcblxuXHRcdFx0cG50ID0gbmV3IEVhc2VQb2ludCgxLCAxLCBudWxsKTtcblx0XHRcdGkgPSBwb2ludHM7XG5cdFx0XHR3aGlsZSAoLS1pID4gLTEpIHtcblx0XHRcdFx0b2JqID0gYVtpXTtcblx0XHRcdFx0cG50ID0gbmV3IEVhc2VQb2ludChvYmoueCwgb2JqLnksIHBudCk7XG5cdFx0XHR9XG5cblx0XHRcdHRoaXMuX3ByZXYgPSBuZXcgRWFzZVBvaW50KDAsIDAsIChwbnQudCAhPT0gMCkgPyBwbnQgOiBwbnQubmV4dCk7XG5cdFx0fSwgdHJ1ZSk7XG5cdFx0cCA9IFJvdWdoRWFzZS5wcm90b3R5cGUgPSBuZXcgRWFzZSgpO1xuXHRcdHAuY29uc3RydWN0b3IgPSBSb3VnaEVhc2U7XG5cdFx0cC5nZXRSYXRpbyA9IGZ1bmN0aW9uKHApIHtcblx0XHRcdHZhciBwbnQgPSB0aGlzLl9wcmV2O1xuXHRcdFx0aWYgKHAgPiBwbnQudCkge1xuXHRcdFx0XHR3aGlsZSAocG50Lm5leHQgJiYgcCA+PSBwbnQudCkge1xuXHRcdFx0XHRcdHBudCA9IHBudC5uZXh0O1xuXHRcdFx0XHR9XG5cdFx0XHRcdHBudCA9IHBudC5wcmV2O1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0d2hpbGUgKHBudC5wcmV2ICYmIHAgPD0gcG50LnQpIHtcblx0XHRcdFx0XHRwbnQgPSBwbnQucHJldjtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0dGhpcy5fcHJldiA9IHBudDtcblx0XHRcdHJldHVybiAocG50LnYgKyAoKHAgLSBwbnQudCkgLyBwbnQuZ2FwKSAqIHBudC5jKTtcblx0XHR9O1xuXHRcdHAuY29uZmlnID0gZnVuY3Rpb24odmFycykge1xuXHRcdFx0cmV0dXJuIG5ldyBSb3VnaEVhc2UodmFycyk7XG5cdFx0fTtcblx0XHRSb3VnaEVhc2UuZWFzZSA9IG5ldyBSb3VnaEVhc2UoKTtcblxuXG5cdFx0Ly9Cb3VuY2Vcblx0XHRfd3JhcChcIkJvdW5jZVwiLFxuXHRcdFx0X2NyZWF0ZShcIkJvdW5jZU91dFwiLCBmdW5jdGlvbihwKSB7XG5cdFx0XHRcdGlmIChwIDwgMSAvIDIuNzUpIHtcblx0XHRcdFx0XHRyZXR1cm4gNy41NjI1ICogcCAqIHA7XG5cdFx0XHRcdH0gZWxzZSBpZiAocCA8IDIgLyAyLjc1KSB7XG5cdFx0XHRcdFx0cmV0dXJuIDcuNTYyNSAqIChwIC09IDEuNSAvIDIuNzUpICogcCArIDAuNzU7XG5cdFx0XHRcdH0gZWxzZSBpZiAocCA8IDIuNSAvIDIuNzUpIHtcblx0XHRcdFx0XHRyZXR1cm4gNy41NjI1ICogKHAgLT0gMi4yNSAvIDIuNzUpICogcCArIDAuOTM3NTtcblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gNy41NjI1ICogKHAgLT0gMi42MjUgLyAyLjc1KSAqIHAgKyAwLjk4NDM3NTtcblx0XHRcdH0pLFxuXHRcdFx0X2NyZWF0ZShcIkJvdW5jZUluXCIsIGZ1bmN0aW9uKHApIHtcblx0XHRcdFx0aWYgKChwID0gMSAtIHApIDwgMSAvIDIuNzUpIHtcblx0XHRcdFx0XHRyZXR1cm4gMSAtICg3LjU2MjUgKiBwICogcCk7XG5cdFx0XHRcdH0gZWxzZSBpZiAocCA8IDIgLyAyLjc1KSB7XG5cdFx0XHRcdFx0cmV0dXJuIDEgLSAoNy41NjI1ICogKHAgLT0gMS41IC8gMi43NSkgKiBwICsgMC43NSk7XG5cdFx0XHRcdH0gZWxzZSBpZiAocCA8IDIuNSAvIDIuNzUpIHtcblx0XHRcdFx0XHRyZXR1cm4gMSAtICg3LjU2MjUgKiAocCAtPSAyLjI1IC8gMi43NSkgKiBwICsgMC45Mzc1KTtcblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gMSAtICg3LjU2MjUgKiAocCAtPSAyLjYyNSAvIDIuNzUpICogcCArIDAuOTg0Mzc1KTtcblx0XHRcdH0pLFxuXHRcdFx0X2NyZWF0ZShcIkJvdW5jZUluT3V0XCIsIGZ1bmN0aW9uKHApIHtcblx0XHRcdFx0dmFyIGludmVydCA9IChwIDwgMC41KTtcblx0XHRcdFx0aWYgKGludmVydCkge1xuXHRcdFx0XHRcdHAgPSAxIC0gKHAgKiAyKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRwID0gKHAgKiAyKSAtIDE7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKHAgPCAxIC8gMi43NSkge1xuXHRcdFx0XHRcdHAgPSA3LjU2MjUgKiBwICogcDtcblx0XHRcdFx0fSBlbHNlIGlmIChwIDwgMiAvIDIuNzUpIHtcblx0XHRcdFx0XHRwID0gNy41NjI1ICogKHAgLT0gMS41IC8gMi43NSkgKiBwICsgMC43NTtcblx0XHRcdFx0fSBlbHNlIGlmIChwIDwgMi41IC8gMi43NSkge1xuXHRcdFx0XHRcdHAgPSA3LjU2MjUgKiAocCAtPSAyLjI1IC8gMi43NSkgKiBwICsgMC45Mzc1O1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHAgPSA3LjU2MjUgKiAocCAtPSAyLjYyNSAvIDIuNzUpICogcCArIDAuOTg0Mzc1O1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiBpbnZlcnQgPyAoMSAtIHApICogMC41IDogcCAqIDAuNSArIDAuNTtcblx0XHRcdH0pXG5cdFx0KTtcblxuXG5cdFx0Ly9DSVJDXG5cdFx0X3dyYXAoXCJDaXJjXCIsXG5cdFx0XHRfY3JlYXRlKFwiQ2lyY091dFwiLCBmdW5jdGlvbihwKSB7XG5cdFx0XHRcdHJldHVybiBNYXRoLnNxcnQoMSAtIChwID0gcCAtIDEpICogcCk7XG5cdFx0XHR9KSxcblx0XHRcdF9jcmVhdGUoXCJDaXJjSW5cIiwgZnVuY3Rpb24ocCkge1xuXHRcdFx0XHRyZXR1cm4gLShNYXRoLnNxcnQoMSAtIChwICogcCkpIC0gMSk7XG5cdFx0XHR9KSxcblx0XHRcdF9jcmVhdGUoXCJDaXJjSW5PdXRcIiwgZnVuY3Rpb24ocCkge1xuXHRcdFx0XHRyZXR1cm4gKChwKj0yKSA8IDEpID8gLTAuNSAqIChNYXRoLnNxcnQoMSAtIHAgKiBwKSAtIDEpIDogMC41ICogKE1hdGguc3FydCgxIC0gKHAgLT0gMikgKiBwKSArIDEpO1xuXHRcdFx0fSlcblx0XHQpO1xuXG5cblx0XHQvL0VsYXN0aWNcblx0XHRfY3JlYXRlRWxhc3RpYyA9IGZ1bmN0aW9uKG4sIGYsIGRlZikge1xuXHRcdFx0dmFyIEMgPSBfY2xhc3MoXCJlYXNpbmcuXCIgKyBuLCBmdW5jdGlvbihhbXBsaXR1ZGUsIHBlcmlvZCkge1xuXHRcdFx0XHRcdHRoaXMuX3AxID0gKGFtcGxpdHVkZSA+PSAxKSA/IGFtcGxpdHVkZSA6IDE7IC8vbm90ZTogaWYgYW1wbGl0dWRlIGlzIDwgMSwgd2Ugc2ltcGx5IGFkanVzdCB0aGUgcGVyaW9kIGZvciBhIG1vcmUgbmF0dXJhbCBmZWVsLiBPdGhlcndpc2UgdGhlIG1hdGggZG9lc24ndCB3b3JrIHJpZ2h0IGFuZCB0aGUgY3VydmUgc3RhcnRzIGF0IDEuXG5cdFx0XHRcdFx0dGhpcy5fcDIgPSAocGVyaW9kIHx8IGRlZikgLyAoYW1wbGl0dWRlIDwgMSA/IGFtcGxpdHVkZSA6IDEpO1xuXHRcdFx0XHRcdHRoaXMuX3AzID0gdGhpcy5fcDIgLyBfMlBJICogKE1hdGguYXNpbigxIC8gdGhpcy5fcDEpIHx8IDApO1xuXHRcdFx0XHRcdHRoaXMuX3AyID0gXzJQSSAvIHRoaXMuX3AyOyAvL3ByZWNhbGN1bGF0ZSB0byBvcHRpbWl6ZVxuXHRcdFx0XHR9LCB0cnVlKSxcblx0XHRcdFx0cCA9IEMucHJvdG90eXBlID0gbmV3IEVhc2UoKTtcblx0XHRcdHAuY29uc3RydWN0b3IgPSBDO1xuXHRcdFx0cC5nZXRSYXRpbyA9IGY7XG5cdFx0XHRwLmNvbmZpZyA9IGZ1bmN0aW9uKGFtcGxpdHVkZSwgcGVyaW9kKSB7XG5cdFx0XHRcdHJldHVybiBuZXcgQyhhbXBsaXR1ZGUsIHBlcmlvZCk7XG5cdFx0XHR9O1xuXHRcdFx0cmV0dXJuIEM7XG5cdFx0fTtcblx0XHRfd3JhcChcIkVsYXN0aWNcIixcblx0XHRcdF9jcmVhdGVFbGFzdGljKFwiRWxhc3RpY091dFwiLCBmdW5jdGlvbihwKSB7XG5cdFx0XHRcdHJldHVybiB0aGlzLl9wMSAqIE1hdGgucG93KDIsIC0xMCAqIHApICogTWF0aC5zaW4oIChwIC0gdGhpcy5fcDMpICogdGhpcy5fcDIgKSArIDE7XG5cdFx0XHR9LCAwLjMpLFxuXHRcdFx0X2NyZWF0ZUVsYXN0aWMoXCJFbGFzdGljSW5cIiwgZnVuY3Rpb24ocCkge1xuXHRcdFx0XHRyZXR1cm4gLSh0aGlzLl9wMSAqIE1hdGgucG93KDIsIDEwICogKHAgLT0gMSkpICogTWF0aC5zaW4oIChwIC0gdGhpcy5fcDMpICogdGhpcy5fcDIgKSk7XG5cdFx0XHR9LCAwLjMpLFxuXHRcdFx0X2NyZWF0ZUVsYXN0aWMoXCJFbGFzdGljSW5PdXRcIiwgZnVuY3Rpb24ocCkge1xuXHRcdFx0XHRyZXR1cm4gKChwICo9IDIpIDwgMSkgPyAtMC41ICogKHRoaXMuX3AxICogTWF0aC5wb3coMiwgMTAgKiAocCAtPSAxKSkgKiBNYXRoLnNpbiggKHAgLSB0aGlzLl9wMykgKiB0aGlzLl9wMikpIDogdGhpcy5fcDEgKiBNYXRoLnBvdygyLCAtMTAgKihwIC09IDEpKSAqIE1hdGguc2luKCAocCAtIHRoaXMuX3AzKSAqIHRoaXMuX3AyICkgKiAwLjUgKyAxO1xuXHRcdFx0fSwgMC40NSlcblx0XHQpO1xuXG5cblx0XHQvL0V4cG9cblx0XHRfd3JhcChcIkV4cG9cIixcblx0XHRcdF9jcmVhdGUoXCJFeHBvT3V0XCIsIGZ1bmN0aW9uKHApIHtcblx0XHRcdFx0cmV0dXJuIDEgLSBNYXRoLnBvdygyLCAtMTAgKiBwKTtcblx0XHRcdH0pLFxuXHRcdFx0X2NyZWF0ZShcIkV4cG9JblwiLCBmdW5jdGlvbihwKSB7XG5cdFx0XHRcdHJldHVybiBNYXRoLnBvdygyLCAxMCAqIChwIC0gMSkpIC0gMC4wMDE7XG5cdFx0XHR9KSxcblx0XHRcdF9jcmVhdGUoXCJFeHBvSW5PdXRcIiwgZnVuY3Rpb24ocCkge1xuXHRcdFx0XHRyZXR1cm4gKChwICo9IDIpIDwgMSkgPyAwLjUgKiBNYXRoLnBvdygyLCAxMCAqIChwIC0gMSkpIDogMC41ICogKDIgLSBNYXRoLnBvdygyLCAtMTAgKiAocCAtIDEpKSk7XG5cdFx0XHR9KVxuXHRcdCk7XG5cblxuXHRcdC8vU2luZVxuXHRcdF93cmFwKFwiU2luZVwiLFxuXHRcdFx0X2NyZWF0ZShcIlNpbmVPdXRcIiwgZnVuY3Rpb24ocCkge1xuXHRcdFx0XHRyZXR1cm4gTWF0aC5zaW4ocCAqIF9IQUxGX1BJKTtcblx0XHRcdH0pLFxuXHRcdFx0X2NyZWF0ZShcIlNpbmVJblwiLCBmdW5jdGlvbihwKSB7XG5cdFx0XHRcdHJldHVybiAtTWF0aC5jb3MocCAqIF9IQUxGX1BJKSArIDE7XG5cdFx0XHR9KSxcblx0XHRcdF9jcmVhdGUoXCJTaW5lSW5PdXRcIiwgZnVuY3Rpb24ocCkge1xuXHRcdFx0XHRyZXR1cm4gLTAuNSAqIChNYXRoLmNvcyhNYXRoLlBJICogcCkgLSAxKTtcblx0XHRcdH0pXG5cdFx0KTtcblxuXHRcdF9jbGFzcyhcImVhc2luZy5FYXNlTG9va3VwXCIsIHtcblx0XHRcdFx0ZmluZDpmdW5jdGlvbihzKSB7XG5cdFx0XHRcdFx0cmV0dXJuIEVhc2UubWFwW3NdO1xuXHRcdFx0XHR9XG5cdFx0XHR9LCB0cnVlKTtcblxuXHRcdC8vcmVnaXN0ZXIgdGhlIG5vbi1zdGFuZGFyZCBlYXNlc1xuXHRcdF9lYXNlUmVnKHcuU2xvd01vLCBcIlNsb3dNb1wiLCBcImVhc2UsXCIpO1xuXHRcdF9lYXNlUmVnKFJvdWdoRWFzZSwgXCJSb3VnaEVhc2VcIiwgXCJlYXNlLFwiKTtcblx0XHRfZWFzZVJlZyhTdGVwcGVkRWFzZSwgXCJTdGVwcGVkRWFzZVwiLCBcImVhc2UsXCIpO1xuXG5cdFx0cmV0dXJuIEJhY2s7XG5cdFx0XG5cdH0sIHRydWUpO1xuXG5cbn0pO1xuXG5pZiAoX2dzU2NvcGUuX2dzRGVmaW5lKSB7IF9nc1Njb3BlLl9nc1F1ZXVlLnBvcCgpKCk7IH0gLy9uZWNlc3NhcnkgaW4gY2FzZSBUd2VlbkxpdGUgd2FzIGFscmVhZHkgbG9hZGVkIHNlcGFyYXRlbHkuXG5cblxuXG5cblxuXG5cblxuXG5cblxuLypcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIEJhc2UgY2xhc3NlcyBsaWtlIFR3ZWVuTGl0ZSwgU2ltcGxlVGltZWxpbmUsIEVhc2UsIFRpY2tlciwgZXRjLlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICovXG4oZnVuY3Rpb24od2luZG93LCBtb2R1bGVOYW1lKSB7XG5cblx0XHRcInVzZSBzdHJpY3RcIjtcblx0XHR2YXIgX2V4cG9ydHMgPSB7fSxcblx0XHRcdF9kb2MgPSB3aW5kb3cuZG9jdW1lbnQsXG5cdFx0XHRfZ2xvYmFscyA9IHdpbmRvdy5HcmVlblNvY2tHbG9iYWxzID0gd2luZG93LkdyZWVuU29ja0dsb2JhbHMgfHwgd2luZG93O1xuXHRcdGlmIChfZ2xvYmFscy5Ud2VlbkxpdGUpIHtcblx0XHRcdHJldHVybjsgLy9pbiBjYXNlIHRoZSBjb3JlIHNldCBvZiBjbGFzc2VzIGlzIGFscmVhZHkgbG9hZGVkLCBkb24ndCBpbnN0YW50aWF0ZSB0d2ljZS5cblx0XHR9XG5cdFx0dmFyIF9uYW1lc3BhY2UgPSBmdW5jdGlvbihucykge1xuXHRcdFx0XHR2YXIgYSA9IG5zLnNwbGl0KFwiLlwiKSxcblx0XHRcdFx0XHRwID0gX2dsb2JhbHMsIGk7XG5cdFx0XHRcdGZvciAoaSA9IDA7IGkgPCBhLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRcdFx0cFthW2ldXSA9IHAgPSBwW2FbaV1dIHx8IHt9O1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiBwO1xuXHRcdFx0fSxcblx0XHRcdGdzID0gX25hbWVzcGFjZShcImNvbS5ncmVlbnNvY2tcIiksXG5cdFx0XHRfdGlueU51bSA9IDAuMDAwMDAwMDAwMSxcblx0XHRcdF9zbGljZSA9IGZ1bmN0aW9uKGEpIHsgLy9kb24ndCB1c2UgQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwodGFyZ2V0LCAwKSBiZWNhdXNlIHRoYXQgZG9lc24ndCB3b3JrIGluIElFOCB3aXRoIGEgTm9kZUxpc3QgdGhhdCdzIHJldHVybmVkIGJ5IHF1ZXJ5U2VsZWN0b3JBbGwoKVxuXHRcdFx0XHR2YXIgYiA9IFtdLFxuXHRcdFx0XHRcdGwgPSBhLmxlbmd0aCxcblx0XHRcdFx0XHRpO1xuXHRcdFx0XHRmb3IgKGkgPSAwOyBpICE9PSBsOyBiLnB1c2goYVtpKytdKSkge31cblx0XHRcdFx0cmV0dXJuIGI7XG5cdFx0XHR9LFxuXHRcdFx0X2VtcHR5RnVuYyA9IGZ1bmN0aW9uKCkge30sXG5cdFx0XHRfaXNBcnJheSA9IChmdW5jdGlvbigpIHsgLy93b3JrcyBhcm91bmQgaXNzdWVzIGluIGlmcmFtZSBlbnZpcm9ubWVudHMgd2hlcmUgdGhlIEFycmF5IGdsb2JhbCBpc24ndCBzaGFyZWQsIHRodXMgaWYgdGhlIG9iamVjdCBvcmlnaW5hdGVzIGluIGEgZGlmZmVyZW50IHdpbmRvdy9pZnJhbWUsIFwiKG9iaiBpbnN0YW5jZW9mIEFycmF5KVwiIHdpbGwgZXZhbHVhdGUgZmFsc2UuIFdlIGFkZGVkIHNvbWUgc3BlZWQgb3B0aW1pemF0aW9ucyB0byBhdm9pZCBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoKSB1bmxlc3MgaXQncyBhYnNvbHV0ZWx5IG5lY2Vzc2FyeSBiZWNhdXNlIGl0J3MgVkVSWSBzbG93IChsaWtlIDIweCBzbG93ZXIpXG5cdFx0XHRcdHZhciB0b1N0cmluZyA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcsXG5cdFx0XHRcdFx0YXJyYXkgPSB0b1N0cmluZy5jYWxsKFtdKTtcblx0XHRcdFx0cmV0dXJuIGZ1bmN0aW9uKG9iaikge1xuXHRcdFx0XHRcdHJldHVybiBvYmogIT0gbnVsbCAmJiAob2JqIGluc3RhbmNlb2YgQXJyYXkgfHwgKHR5cGVvZihvYmopID09PSBcIm9iamVjdFwiICYmICEhb2JqLnB1c2ggJiYgdG9TdHJpbmcuY2FsbChvYmopID09PSBhcnJheSkpO1xuXHRcdFx0XHR9O1xuXHRcdFx0fSgpKSxcblx0XHRcdGEsIGksIHAsIF90aWNrZXIsIF90aWNrZXJBY3RpdmUsXG5cdFx0XHRfZGVmTG9va3VwID0ge30sXG5cblx0XHRcdC8qKlxuXHRcdFx0ICogQGNvbnN0cnVjdG9yXG5cdFx0XHQgKiBEZWZpbmVzIGEgR3JlZW5Tb2NrIGNsYXNzLCBvcHRpb25hbGx5IHdpdGggYW4gYXJyYXkgb2YgZGVwZW5kZW5jaWVzIHRoYXQgbXVzdCBiZSBpbnN0YW50aWF0ZWQgZmlyc3QgYW5kIHBhc3NlZCBpbnRvIHRoZSBkZWZpbml0aW9uLlxuXHRcdFx0ICogVGhpcyBhbGxvd3MgdXNlcnMgdG8gbG9hZCBHcmVlblNvY2sgSlMgZmlsZXMgaW4gYW55IG9yZGVyIGV2ZW4gaWYgdGhleSBoYXZlIGludGVyZGVwZW5kZW5jaWVzIChsaWtlIENTU1BsdWdpbiBleHRlbmRzIFR3ZWVuUGx1Z2luIHdoaWNoIGlzXG5cdFx0XHQgKiBpbnNpZGUgVHdlZW5MaXRlLmpzLCBidXQgaWYgQ1NTUGx1Z2luIGlzIGxvYWRlZCBmaXJzdCwgaXQgc2hvdWxkIHdhaXQgdG8gcnVuIGl0cyBjb2RlIHVudGlsIFR3ZWVuTGl0ZS5qcyBsb2FkcyBhbmQgaW5zdGFudGlhdGVzIFR3ZWVuUGx1Z2luXG5cdFx0XHQgKiBhbmQgdGhlbiBwYXNzIFR3ZWVuUGx1Z2luIHRvIENTU1BsdWdpbidzIGRlZmluaXRpb24pLiBUaGlzIGlzIGFsbCBkb25lIGF1dG9tYXRpY2FsbHkgYW5kIGludGVybmFsbHkuXG5cdFx0XHQgKlxuXHRcdFx0ICogRXZlcnkgZGVmaW5pdGlvbiB3aWxsIGJlIGFkZGVkIHRvIGEgXCJjb20uZ3JlZW5zb2NrXCIgZ2xvYmFsIG9iamVjdCAodHlwaWNhbGx5IHdpbmRvdywgYnV0IGlmIGEgd2luZG93LkdyZWVuU29ja0dsb2JhbHMgb2JqZWN0IGlzIGZvdW5kLFxuXHRcdFx0ICogaXQgd2lsbCBnbyB0aGVyZSBhcyBvZiB2MS43KS4gRm9yIGV4YW1wbGUsIFR3ZWVuTGl0ZSB3aWxsIGJlIGZvdW5kIGF0IHdpbmRvdy5jb20uZ3JlZW5zb2NrLlR3ZWVuTGl0ZSBhbmQgc2luY2UgaXQncyBhIGdsb2JhbCBjbGFzcyB0aGF0IHNob3VsZCBiZSBhdmFpbGFibGUgYW55d2hlcmUsXG5cdFx0XHQgKiBpdCBpcyBBTFNPIHJlZmVyZW5jZWQgYXQgd2luZG93LlR3ZWVuTGl0ZS4gSG93ZXZlciBzb21lIGNsYXNzZXMgYXJlbid0IGNvbnNpZGVyZWQgZ2xvYmFsLCBsaWtlIHRoZSBiYXNlIGNvbS5ncmVlbnNvY2suY29yZS5BbmltYXRpb24gY2xhc3MsIHNvXG5cdFx0XHQgKiB0aG9zZSB3aWxsIG9ubHkgYmUgYXQgdGhlIHBhY2thZ2UgbGlrZSB3aW5kb3cuY29tLmdyZWVuc29jay5jb3JlLkFuaW1hdGlvbi4gQWdhaW4sIGlmIHlvdSBkZWZpbmUgYSBHcmVlblNvY2tHbG9iYWxzIG9iamVjdCBvbiB0aGUgd2luZG93LCBldmVyeXRoaW5nXG5cdFx0XHQgKiBnZXRzIHR1Y2tlZCBuZWF0bHkgaW5zaWRlIHRoZXJlIGluc3RlYWQgb2Ygb24gdGhlIHdpbmRvdyBkaXJlY3RseS4gVGhpcyBhbGxvd3MgeW91IHRvIGRvIGFkdmFuY2VkIHRoaW5ncyBsaWtlIGxvYWQgbXVsdGlwbGUgdmVyc2lvbnMgb2YgR3JlZW5Tb2NrXG5cdFx0XHQgKiBmaWxlcyBhbmQgcHV0IHRoZW0gaW50byBkaXN0aW5jdCBvYmplY3RzIChpbWFnaW5lIGEgYmFubmVyIGFkIHVzZXMgYSBuZXdlciB2ZXJzaW9uIGJ1dCB0aGUgbWFpbiBzaXRlIHVzZXMgYW4gb2xkZXIgb25lKS4gSW4gdGhhdCBjYXNlLCB5b3UgY291bGRcblx0XHRcdCAqIHNhbmRib3ggdGhlIGJhbm5lciBvbmUgbGlrZTpcblx0XHRcdCAqXG5cdFx0XHQgKiA8c2NyaXB0PlxuXHRcdFx0ICogICAgIHZhciBncyA9IHdpbmRvdy5HcmVlblNvY2tHbG9iYWxzID0ge307IC8vdGhlIG5ld2VyIHZlcnNpb24gd2UncmUgYWJvdXQgdG8gbG9hZCBjb3VsZCBub3cgYmUgcmVmZXJlbmNlZCBpbiBhIFwiZ3NcIiBvYmplY3QsIGxpa2UgZ3MuVHdlZW5MaXRlLnRvKC4uLikuIFVzZSB3aGF0ZXZlciBhbGlhcyB5b3Ugd2FudCBhcyBsb25nIGFzIGl0J3MgdW5pcXVlLCBcImdzXCIgb3IgXCJiYW5uZXJcIiBvciB3aGF0ZXZlci5cblx0XHRcdCAqIDwvc2NyaXB0PlxuXHRcdFx0ICogPHNjcmlwdCBzcmM9XCJqcy9ncmVlbnNvY2svdjEuNy9Ud2Vlbk1heC5qc1wiPjwvc2NyaXB0PlxuXHRcdFx0ICogPHNjcmlwdD5cblx0XHRcdCAqICAgICB3aW5kb3cuR3JlZW5Tb2NrR2xvYmFscyA9IHdpbmRvdy5fZ3NRdWV1ZSA9IHdpbmRvdy5fZ3NEZWZpbmUgPSBudWxsOyAvL3Jlc2V0IGl0IGJhY2sgdG8gbnVsbCAoYWxvbmcgd2l0aCB0aGUgc3BlY2lhbCBfZ3NRdWV1ZSB2YXJpYWJsZSkgc28gdGhhdCB0aGUgbmV4dCBsb2FkIG9mIFR3ZWVuTWF4IGFmZmVjdHMgdGhlIHdpbmRvdyBhbmQgd2UgY2FuIHJlZmVyZW5jZSB0aGluZ3MgZGlyZWN0bHkgbGlrZSBUd2VlbkxpdGUudG8oLi4uKVxuXHRcdFx0ICogPC9zY3JpcHQ+XG5cdFx0XHQgKiA8c2NyaXB0IHNyYz1cImpzL2dyZWVuc29jay92MS42L1R3ZWVuTWF4LmpzXCI+PC9zY3JpcHQ+XG5cdFx0XHQgKiA8c2NyaXB0PlxuXHRcdFx0ICogICAgIGdzLlR3ZWVuTGl0ZS50byguLi4pOyAvL3dvdWxkIHVzZSB2MS43XG5cdFx0XHQgKiAgICAgVHdlZW5MaXRlLnRvKC4uLik7IC8vd291bGQgdXNlIHYxLjZcblx0XHRcdCAqIDwvc2NyaXB0PlxuXHRcdFx0ICpcblx0XHRcdCAqIEBwYXJhbSB7IXN0cmluZ30gbnMgVGhlIG5hbWVzcGFjZSBvZiB0aGUgY2xhc3MgZGVmaW5pdGlvbiwgbGVhdmluZyBvZmYgXCJjb20uZ3JlZW5zb2NrLlwiIGFzIHRoYXQncyBhc3N1bWVkLiBGb3IgZXhhbXBsZSwgXCJUd2VlbkxpdGVcIiBvciBcInBsdWdpbnMuQ1NTUGx1Z2luXCIgb3IgXCJlYXNpbmcuQmFja1wiLlxuXHRcdFx0ICogQHBhcmFtIHshQXJyYXkuPHN0cmluZz59IGRlcGVuZGVuY2llcyBBbiBhcnJheSBvZiBkZXBlbmRlbmNpZXMgKGRlc2NyaWJlZCBhcyB0aGVpciBuYW1lc3BhY2VzIG1pbnVzIFwiY29tLmdyZWVuc29jay5cIiBwcmVmaXgpLiBGb3IgZXhhbXBsZSBbXCJUd2VlbkxpdGVcIixcInBsdWdpbnMuVHdlZW5QbHVnaW5cIixcImNvcmUuQW5pbWF0aW9uXCJdXG5cdFx0XHQgKiBAcGFyYW0geyFmdW5jdGlvbigpOk9iamVjdH0gZnVuYyBUaGUgZnVuY3Rpb24gdGhhdCBzaG91bGQgYmUgY2FsbGVkIGFuZCBwYXNzZWQgdGhlIHJlc29sdmVkIGRlcGVuZGVuY2llcyB3aGljaCB3aWxsIHJldHVybiB0aGUgYWN0dWFsIGNsYXNzIGZvciB0aGlzIGRlZmluaXRpb24uXG5cdFx0XHQgKiBAcGFyYW0ge2Jvb2xlYW49fSBnbG9iYWwgSWYgdHJ1ZSwgdGhlIGNsYXNzIHdpbGwgYmUgYWRkZWQgdG8gdGhlIGdsb2JhbCBzY29wZSAodHlwaWNhbGx5IHdpbmRvdyB1bmxlc3MgeW91IGRlZmluZSBhIHdpbmRvdy5HcmVlblNvY2tHbG9iYWxzIG9iamVjdClcblx0XHRcdCAqL1xuXHRcdFx0RGVmaW5pdGlvbiA9IGZ1bmN0aW9uKG5zLCBkZXBlbmRlbmNpZXMsIGZ1bmMsIGdsb2JhbCkge1xuXHRcdFx0XHR0aGlzLnNjID0gKF9kZWZMb29rdXBbbnNdKSA/IF9kZWZMb29rdXBbbnNdLnNjIDogW107IC8vc3ViY2xhc3Nlc1xuXHRcdFx0XHRfZGVmTG9va3VwW25zXSA9IHRoaXM7XG5cdFx0XHRcdHRoaXMuZ3NDbGFzcyA9IG51bGw7XG5cdFx0XHRcdHRoaXMuZnVuYyA9IGZ1bmM7XG5cdFx0XHRcdHZhciBfY2xhc3NlcyA9IFtdO1xuXHRcdFx0XHR0aGlzLmNoZWNrID0gZnVuY3Rpb24oaW5pdCkge1xuXHRcdFx0XHRcdHZhciBpID0gZGVwZW5kZW5jaWVzLmxlbmd0aCxcblx0XHRcdFx0XHRcdG1pc3NpbmcgPSBpLFxuXHRcdFx0XHRcdFx0Y3VyLCBhLCBuLCBjbDtcblx0XHRcdFx0XHR3aGlsZSAoLS1pID4gLTEpIHtcblx0XHRcdFx0XHRcdGlmICgoY3VyID0gX2RlZkxvb2t1cFtkZXBlbmRlbmNpZXNbaV1dIHx8IG5ldyBEZWZpbml0aW9uKGRlcGVuZGVuY2llc1tpXSwgW10pKS5nc0NsYXNzKSB7XG5cdFx0XHRcdFx0XHRcdF9jbGFzc2VzW2ldID0gY3VyLmdzQ2xhc3M7XG5cdFx0XHRcdFx0XHRcdG1pc3NpbmctLTtcblx0XHRcdFx0XHRcdH0gZWxzZSBpZiAoaW5pdCkge1xuXHRcdFx0XHRcdFx0XHRjdXIuc2MucHVzaCh0aGlzKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0aWYgKG1pc3NpbmcgPT09IDAgJiYgZnVuYykge1xuXHRcdFx0XHRcdFx0YSA9IChcImNvbS5ncmVlbnNvY2suXCIgKyBucykuc3BsaXQoXCIuXCIpO1xuXHRcdFx0XHRcdFx0biA9IGEucG9wKCk7XG5cdFx0XHRcdFx0XHRjbCA9IF9uYW1lc3BhY2UoYS5qb2luKFwiLlwiKSlbbl0gPSB0aGlzLmdzQ2xhc3MgPSBmdW5jLmFwcGx5KGZ1bmMsIF9jbGFzc2VzKTtcblxuXHRcdFx0XHRcdFx0Ly9leHBvcnRzIHRvIG11bHRpcGxlIGVudmlyb25tZW50c1xuXHRcdFx0XHRcdFx0aWYgKGdsb2JhbCkge1xuXHRcdFx0XHRcdFx0XHRfZ2xvYmFsc1tuXSA9IF9leHBvcnRzW25dID0gY2w7IC8vcHJvdmlkZXMgYSB3YXkgdG8gYXZvaWQgZ2xvYmFsIG5hbWVzcGFjZSBwb2xsdXRpb24uIEJ5IGRlZmF1bHQsIHRoZSBtYWluIGNsYXNzZXMgbGlrZSBUd2VlbkxpdGUsIFBvd2VyMSwgU3Ryb25nLCBldGMuIGFyZSBhZGRlZCB0byB3aW5kb3cgdW5sZXNzIGEgR3JlZW5Tb2NrR2xvYmFscyBpcyBkZWZpbmVkLiBTbyBpZiB5b3Ugd2FudCB0byBoYXZlIHRoaW5ncyBhZGRlZCB0byBhIGN1c3RvbSBvYmplY3QgaW5zdGVhZCwganVzdCBkbyBzb21ldGhpbmcgbGlrZSB3aW5kb3cuR3JlZW5Tb2NrR2xvYmFscyA9IHt9IGJlZm9yZSBsb2FkaW5nIGFueSBHcmVlblNvY2sgZmlsZXMuIFlvdSBjYW4gZXZlbiBzZXQgdXAgYW4gYWxpYXMgbGlrZSB3aW5kb3cuR3JlZW5Tb2NrR2xvYmFscyA9IHdpbmRvd3MuZ3MgPSB7fSBzbyB0aGF0IHlvdSBjYW4gYWNjZXNzIGV2ZXJ5dGhpbmcgbGlrZSBncy5Ud2VlbkxpdGUuIEFsc28gcmVtZW1iZXIgdGhhdCBBTEwgY2xhc3NlcyBhcmUgYWRkZWQgdG8gdGhlIHdpbmRvdy5jb20uZ3JlZW5zb2NrIG9iamVjdCAoaW4gdGhlaXIgcmVzcGVjdGl2ZSBwYWNrYWdlcywgbGlrZSBjb20uZ3JlZW5zb2NrLmVhc2luZy5Qb3dlcjEsIGNvbS5ncmVlbnNvY2suVHdlZW5MaXRlLCBldGMuKVxuXHRcdFx0XHRcdFx0XHRpZiAodHlwZW9mKG1vZHVsZSkgIT09IFwidW5kZWZpbmVkXCIgJiYgbW9kdWxlLmV4cG9ydHMpIHsgLy9ub2RlXG5cdFx0XHRcdFx0XHRcdFx0aWYgKG5zID09PSBtb2R1bGVOYW1lKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRtb2R1bGUuZXhwb3J0cyA9IF9leHBvcnRzW21vZHVsZU5hbWVdID0gY2w7XG5cdFx0XHRcdFx0XHRcdFx0XHRmb3IgKGkgaW4gX2V4cG9ydHMpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0Y2xbaV0gPSBfZXhwb3J0c1tpXTtcblx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHR9IGVsc2UgaWYgKF9leHBvcnRzW21vZHVsZU5hbWVdKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRfZXhwb3J0c1ttb2R1bGVOYW1lXVtuXSA9IGNsO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0fSBlbHNlIGlmICh0eXBlb2YoZGVmaW5lKSA9PT0gXCJmdW5jdGlvblwiICYmIGRlZmluZS5hbWQpeyAvL0FNRFxuXHRcdFx0XHRcdFx0XHRcdGRlZmluZSgod2luZG93LkdyZWVuU29ja0FNRFBhdGggPyB3aW5kb3cuR3JlZW5Tb2NrQU1EUGF0aCArIFwiL1wiIDogXCJcIikgKyBucy5zcGxpdChcIi5cIikucG9wKCksIFtdLCBmdW5jdGlvbigpIHsgcmV0dXJuIGNsOyB9KTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0Zm9yIChpID0gMDsgaSA8IHRoaXMuc2MubGVuZ3RoOyBpKyspIHtcblx0XHRcdFx0XHRcdFx0dGhpcy5zY1tpXS5jaGVjaygpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fTtcblx0XHRcdFx0dGhpcy5jaGVjayh0cnVlKTtcblx0XHRcdH0sXG5cblx0XHRcdC8vdXNlZCB0byBjcmVhdGUgRGVmaW5pdGlvbiBpbnN0YW5jZXMgKHdoaWNoIGJhc2ljYWxseSByZWdpc3RlcnMgYSBjbGFzcyB0aGF0IGhhcyBkZXBlbmRlbmNpZXMpLlxuXHRcdFx0X2dzRGVmaW5lID0gd2luZG93Ll9nc0RlZmluZSA9IGZ1bmN0aW9uKG5zLCBkZXBlbmRlbmNpZXMsIGZ1bmMsIGdsb2JhbCkge1xuXHRcdFx0XHRyZXR1cm4gbmV3IERlZmluaXRpb24obnMsIGRlcGVuZGVuY2llcywgZnVuYywgZ2xvYmFsKTtcblx0XHRcdH0sXG5cblx0XHRcdC8vYSBxdWljayB3YXkgdG8gY3JlYXRlIGEgY2xhc3MgdGhhdCBkb2Vzbid0IGhhdmUgYW55IGRlcGVuZGVuY2llcy4gUmV0dXJucyB0aGUgY2xhc3MsIGJ1dCBmaXJzdCByZWdpc3RlcnMgaXQgaW4gdGhlIEdyZWVuU29jayBuYW1lc3BhY2Ugc28gdGhhdCBvdGhlciBjbGFzc2VzIGNhbiBncmFiIGl0IChvdGhlciBjbGFzc2VzIG1pZ2h0IGJlIGRlcGVuZGVudCBvbiB0aGUgY2xhc3MpLlxuXHRcdFx0X2NsYXNzID0gZ3MuX2NsYXNzID0gZnVuY3Rpb24obnMsIGZ1bmMsIGdsb2JhbCkge1xuXHRcdFx0XHRmdW5jID0gZnVuYyB8fCBmdW5jdGlvbigpIHt9O1xuXHRcdFx0XHRfZ3NEZWZpbmUobnMsIFtdLCBmdW5jdGlvbigpeyByZXR1cm4gZnVuYzsgfSwgZ2xvYmFsKTtcblx0XHRcdFx0cmV0dXJuIGZ1bmM7XG5cdFx0XHR9O1xuXG5cdFx0X2dzRGVmaW5lLmdsb2JhbHMgPSBfZ2xvYmFscztcblxuXG5cbi8qXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBFYXNlXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKi9cblx0XHR2YXIgX2Jhc2VQYXJhbXMgPSBbMCwgMCwgMSwgMV0sXG5cdFx0XHRFYXNlID0gX2NsYXNzKFwiZWFzaW5nLkVhc2VcIiwgZnVuY3Rpb24oZnVuYywgZXh0cmFQYXJhbXMsIHR5cGUsIHBvd2VyKSB7XG5cdFx0XHRcdHRoaXMuX2Z1bmMgPSBmdW5jO1xuXHRcdFx0XHR0aGlzLl90eXBlID0gdHlwZSB8fCAwO1xuXHRcdFx0XHR0aGlzLl9wb3dlciA9IHBvd2VyIHx8IDA7XG5cdFx0XHRcdHRoaXMuX3BhcmFtcyA9IGV4dHJhUGFyYW1zID8gX2Jhc2VQYXJhbXMuY29uY2F0KGV4dHJhUGFyYW1zKSA6IF9iYXNlUGFyYW1zO1xuXHRcdFx0fSwgdHJ1ZSksXG5cdFx0XHRfZWFzZU1hcCA9IEVhc2UubWFwID0ge30sXG5cdFx0XHRfZWFzZVJlZyA9IEVhc2UucmVnaXN0ZXIgPSBmdW5jdGlvbihlYXNlLCBuYW1lcywgdHlwZXMsIGNyZWF0ZSkge1xuXHRcdFx0XHR2YXIgbmEgPSBuYW1lcy5zcGxpdChcIixcIiksXG5cdFx0XHRcdFx0aSA9IG5hLmxlbmd0aCxcblx0XHRcdFx0XHR0YSA9ICh0eXBlcyB8fCBcImVhc2VJbixlYXNlT3V0LGVhc2VJbk91dFwiKS5zcGxpdChcIixcIiksXG5cdFx0XHRcdFx0ZSwgbmFtZSwgaiwgdHlwZTtcblx0XHRcdFx0d2hpbGUgKC0taSA+IC0xKSB7XG5cdFx0XHRcdFx0bmFtZSA9IG5hW2ldO1xuXHRcdFx0XHRcdGUgPSBjcmVhdGUgPyBfY2xhc3MoXCJlYXNpbmcuXCIrbmFtZSwgbnVsbCwgdHJ1ZSkgOiBncy5lYXNpbmdbbmFtZV0gfHwge307XG5cdFx0XHRcdFx0aiA9IHRhLmxlbmd0aDtcblx0XHRcdFx0XHR3aGlsZSAoLS1qID4gLTEpIHtcblx0XHRcdFx0XHRcdHR5cGUgPSB0YVtqXTtcblx0XHRcdFx0XHRcdF9lYXNlTWFwW25hbWUgKyBcIi5cIiArIHR5cGVdID0gX2Vhc2VNYXBbdHlwZSArIG5hbWVdID0gZVt0eXBlXSA9IGVhc2UuZ2V0UmF0aW8gPyBlYXNlIDogZWFzZVt0eXBlXSB8fCBuZXcgZWFzZSgpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fTtcblxuXHRcdHAgPSBFYXNlLnByb3RvdHlwZTtcblx0XHRwLl9jYWxjRW5kID0gZmFsc2U7XG5cdFx0cC5nZXRSYXRpbyA9IGZ1bmN0aW9uKHApIHtcblx0XHRcdGlmICh0aGlzLl9mdW5jKSB7XG5cdFx0XHRcdHRoaXMuX3BhcmFtc1swXSA9IHA7XG5cdFx0XHRcdHJldHVybiB0aGlzLl9mdW5jLmFwcGx5KG51bGwsIHRoaXMuX3BhcmFtcyk7XG5cdFx0XHR9XG5cdFx0XHR2YXIgdCA9IHRoaXMuX3R5cGUsXG5cdFx0XHRcdHB3ID0gdGhpcy5fcG93ZXIsXG5cdFx0XHRcdHIgPSAodCA9PT0gMSkgPyAxIC0gcCA6ICh0ID09PSAyKSA/IHAgOiAocCA8IDAuNSkgPyBwICogMiA6ICgxIC0gcCkgKiAyO1xuXHRcdFx0aWYgKHB3ID09PSAxKSB7XG5cdFx0XHRcdHIgKj0gcjtcblx0XHRcdH0gZWxzZSBpZiAocHcgPT09IDIpIHtcblx0XHRcdFx0ciAqPSByICogcjtcblx0XHRcdH0gZWxzZSBpZiAocHcgPT09IDMpIHtcblx0XHRcdFx0ciAqPSByICogciAqIHI7XG5cdFx0XHR9IGVsc2UgaWYgKHB3ID09PSA0KSB7XG5cdFx0XHRcdHIgKj0gciAqIHIgKiByICogcjtcblx0XHRcdH1cblx0XHRcdHJldHVybiAodCA9PT0gMSkgPyAxIC0gciA6ICh0ID09PSAyKSA/IHIgOiAocCA8IDAuNSkgPyByIC8gMiA6IDEgLSAociAvIDIpO1xuXHRcdH07XG5cblx0XHQvL2NyZWF0ZSBhbGwgdGhlIHN0YW5kYXJkIGVhc2VzIGxpa2UgTGluZWFyLCBRdWFkLCBDdWJpYywgUXVhcnQsIFF1aW50LCBTdHJvbmcsIFBvd2VyMCwgUG93ZXIxLCBQb3dlcjIsIFBvd2VyMywgYW5kIFBvd2VyNCAoZWFjaCB3aXRoIGVhc2VJbiwgZWFzZU91dCwgYW5kIGVhc2VJbk91dClcblx0XHRhID0gW1wiTGluZWFyXCIsXCJRdWFkXCIsXCJDdWJpY1wiLFwiUXVhcnRcIixcIlF1aW50LFN0cm9uZ1wiXTtcblx0XHRpID0gYS5sZW5ndGg7XG5cdFx0d2hpbGUgKC0taSA+IC0xKSB7XG5cdFx0XHRwID0gYVtpXStcIixQb3dlclwiK2k7XG5cdFx0XHRfZWFzZVJlZyhuZXcgRWFzZShudWxsLG51bGwsMSxpKSwgcCwgXCJlYXNlT3V0XCIsIHRydWUpO1xuXHRcdFx0X2Vhc2VSZWcobmV3IEVhc2UobnVsbCxudWxsLDIsaSksIHAsIFwiZWFzZUluXCIgKyAoKGkgPT09IDApID8gXCIsZWFzZU5vbmVcIiA6IFwiXCIpKTtcblx0XHRcdF9lYXNlUmVnKG5ldyBFYXNlKG51bGwsbnVsbCwzLGkpLCBwLCBcImVhc2VJbk91dFwiKTtcblx0XHR9XG5cdFx0X2Vhc2VNYXAubGluZWFyID0gZ3MuZWFzaW5nLkxpbmVhci5lYXNlSW47XG5cdFx0X2Vhc2VNYXAuc3dpbmcgPSBncy5lYXNpbmcuUXVhZC5lYXNlSW5PdXQ7IC8vZm9yIGpRdWVyeSBmb2xrc1xuXG5cbi8qXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBFdmVudERpc3BhdGNoZXJcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqL1xuXHRcdHZhciBFdmVudERpc3BhdGNoZXIgPSBfY2xhc3MoXCJldmVudHMuRXZlbnREaXNwYXRjaGVyXCIsIGZ1bmN0aW9uKHRhcmdldCkge1xuXHRcdFx0dGhpcy5fbGlzdGVuZXJzID0ge307XG5cdFx0XHR0aGlzLl9ldmVudFRhcmdldCA9IHRhcmdldCB8fCB0aGlzO1xuXHRcdH0pO1xuXHRcdHAgPSBFdmVudERpc3BhdGNoZXIucHJvdG90eXBlO1xuXG5cdFx0cC5hZGRFdmVudExpc3RlbmVyID0gZnVuY3Rpb24odHlwZSwgY2FsbGJhY2ssIHNjb3BlLCB1c2VQYXJhbSwgcHJpb3JpdHkpIHtcblx0XHRcdHByaW9yaXR5ID0gcHJpb3JpdHkgfHwgMDtcblx0XHRcdHZhciBsaXN0ID0gdGhpcy5fbGlzdGVuZXJzW3R5cGVdLFxuXHRcdFx0XHRpbmRleCA9IDAsXG5cdFx0XHRcdGxpc3RlbmVyLCBpO1xuXHRcdFx0aWYgKHRoaXMgPT09IF90aWNrZXIgJiYgIV90aWNrZXJBY3RpdmUpIHtcblx0XHRcdFx0X3RpY2tlci53YWtlKCk7XG5cdFx0XHR9XG5cdFx0XHRpZiAobGlzdCA9PSBudWxsKSB7XG5cdFx0XHRcdHRoaXMuX2xpc3RlbmVyc1t0eXBlXSA9IGxpc3QgPSBbXTtcblx0XHRcdH1cblx0XHRcdGkgPSBsaXN0Lmxlbmd0aDtcblx0XHRcdHdoaWxlICgtLWkgPiAtMSkge1xuXHRcdFx0XHRsaXN0ZW5lciA9IGxpc3RbaV07XG5cdFx0XHRcdGlmIChsaXN0ZW5lci5jID09PSBjYWxsYmFjayAmJiBsaXN0ZW5lci5zID09PSBzY29wZSkge1xuXHRcdFx0XHRcdGxpc3Quc3BsaWNlKGksIDEpO1xuXHRcdFx0XHR9IGVsc2UgaWYgKGluZGV4ID09PSAwICYmIGxpc3RlbmVyLnByIDwgcHJpb3JpdHkpIHtcblx0XHRcdFx0XHRpbmRleCA9IGkgKyAxO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRsaXN0LnNwbGljZShpbmRleCwgMCwge2M6Y2FsbGJhY2ssIHM6c2NvcGUsIHVwOnVzZVBhcmFtLCBwcjpwcmlvcml0eX0pO1xuXHRcdH07XG5cblx0XHRwLnJlbW92ZUV2ZW50TGlzdGVuZXIgPSBmdW5jdGlvbih0eXBlLCBjYWxsYmFjaykge1xuXHRcdFx0dmFyIGxpc3QgPSB0aGlzLl9saXN0ZW5lcnNbdHlwZV0sIGk7XG5cdFx0XHRpZiAobGlzdCkge1xuXHRcdFx0XHRpID0gbGlzdC5sZW5ndGg7XG5cdFx0XHRcdHdoaWxlICgtLWkgPiAtMSkge1xuXHRcdFx0XHRcdGlmIChsaXN0W2ldLmMgPT09IGNhbGxiYWNrKSB7XG5cdFx0XHRcdFx0XHRsaXN0LnNwbGljZShpLCAxKTtcblx0XHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9O1xuXG5cdFx0cC5kaXNwYXRjaEV2ZW50ID0gZnVuY3Rpb24odHlwZSkge1xuXHRcdFx0dmFyIGxpc3QgPSB0aGlzLl9saXN0ZW5lcnNbdHlwZV0sXG5cdFx0XHRcdGksIHQsIGxpc3RlbmVyO1xuXHRcdFx0aWYgKGxpc3QpIHtcblx0XHRcdFx0aSA9IGxpc3QubGVuZ3RoO1xuXHRcdFx0XHRpZiAoaSA+IDEpIHtcblx0XHRcdFx0XHRsaXN0ID0gbGlzdC5zbGljZSgwKTsgLy9pbiBjYXNlIGFkZEV2ZW50TGlzdGVuZXIoKSBpcyBjYWxsZWQgZnJvbSB3aXRoaW4gYSBsaXN0ZW5lci9jYWxsYmFjayAob3RoZXJ3aXNlIHRoZSBpbmRleCBjb3VsZCBjaGFuZ2UsIHJlc3VsdGluZyBpbiBhIHNraXApXG5cdFx0XHRcdH1cblx0XHRcdFx0dCA9IHRoaXMuX2V2ZW50VGFyZ2V0O1xuXHRcdFx0XHR3aGlsZSAoLS1pID4gLTEpIHtcblx0XHRcdFx0XHRsaXN0ZW5lciA9IGxpc3RbaV07XG5cdFx0XHRcdFx0aWYgKGxpc3RlbmVyKSB7XG5cdFx0XHRcdFx0XHRpZiAobGlzdGVuZXIudXApIHtcblx0XHRcdFx0XHRcdFx0bGlzdGVuZXIuYy5jYWxsKGxpc3RlbmVyLnMgfHwgdCwge3R5cGU6dHlwZSwgdGFyZ2V0OnR9KTtcblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdGxpc3RlbmVyLmMuY2FsbChsaXN0ZW5lci5zIHx8IHQpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH07XG5cblxuLypcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIFRpY2tlclxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICovXG4gXHRcdHZhciBfcmVxQW5pbUZyYW1lID0gd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSxcblx0XHRcdF9jYW5jZWxBbmltRnJhbWUgPSB3aW5kb3cuY2FuY2VsQW5pbWF0aW9uRnJhbWUsXG5cdFx0XHRfZ2V0VGltZSA9IERhdGUubm93IHx8IGZ1bmN0aW9uKCkge3JldHVybiBuZXcgRGF0ZSgpLmdldFRpbWUoKTt9LFxuXHRcdFx0X2xhc3RVcGRhdGUgPSBfZ2V0VGltZSgpO1xuXG5cdFx0Ly9ub3cgdHJ5IHRvIGRldGVybWluZSB0aGUgcmVxdWVzdEFuaW1hdGlvbkZyYW1lIGFuZCBjYW5jZWxBbmltYXRpb25GcmFtZSBmdW5jdGlvbnMgYW5kIGlmIG5vbmUgYXJlIGZvdW5kLCB3ZSdsbCB1c2UgYSBzZXRUaW1lb3V0KCkvY2xlYXJUaW1lb3V0KCkgcG9seWZpbGwuXG5cdFx0YSA9IFtcIm1zXCIsXCJtb3pcIixcIndlYmtpdFwiLFwib1wiXTtcblx0XHRpID0gYS5sZW5ndGg7XG5cdFx0d2hpbGUgKC0taSA+IC0xICYmICFfcmVxQW5pbUZyYW1lKSB7XG5cdFx0XHRfcmVxQW5pbUZyYW1lID0gd2luZG93W2FbaV0gKyBcIlJlcXVlc3RBbmltYXRpb25GcmFtZVwiXTtcblx0XHRcdF9jYW5jZWxBbmltRnJhbWUgPSB3aW5kb3dbYVtpXSArIFwiQ2FuY2VsQW5pbWF0aW9uRnJhbWVcIl0gfHwgd2luZG93W2FbaV0gKyBcIkNhbmNlbFJlcXVlc3RBbmltYXRpb25GcmFtZVwiXTtcblx0XHR9XG5cblx0XHRfY2xhc3MoXCJUaWNrZXJcIiwgZnVuY3Rpb24oZnBzLCB1c2VSQUYpIHtcblx0XHRcdHZhciBfc2VsZiA9IHRoaXMsXG5cdFx0XHRcdF9zdGFydFRpbWUgPSBfZ2V0VGltZSgpLFxuXHRcdFx0XHRfdXNlUkFGID0gKHVzZVJBRiAhPT0gZmFsc2UgJiYgX3JlcUFuaW1GcmFtZSkgPyBcImF1dG9cIiA6IGZhbHNlLFxuXHRcdFx0XHRfbGFnVGhyZXNob2xkID0gNTAwLFxuXHRcdFx0XHRfYWRqdXN0ZWRMYWcgPSAzMyxcblx0XHRcdFx0X3RpY2tXb3JkID0gXCJ0aWNrXCIsIC8vaGVscHMgcmVkdWNlIGdjIGJ1cmRlblxuXHRcdFx0XHRfZnBzLCBfcmVxLCBfaWQsIF9nYXAsIF9uZXh0VGltZSxcblx0XHRcdFx0X3RpY2sgPSBmdW5jdGlvbihtYW51YWwpIHtcblx0XHRcdFx0XHR2YXIgZWxhcHNlZCA9IF9nZXRUaW1lKCkgLSBfbGFzdFVwZGF0ZSxcblx0XHRcdFx0XHRcdG92ZXJsYXAsIGRpc3BhdGNoO1xuXHRcdFx0XHRcdGlmIChlbGFwc2VkID4gX2xhZ1RocmVzaG9sZCkge1xuXHRcdFx0XHRcdFx0X3N0YXJ0VGltZSArPSBlbGFwc2VkIC0gX2FkanVzdGVkTGFnO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRfbGFzdFVwZGF0ZSArPSBlbGFwc2VkO1xuXHRcdFx0XHRcdF9zZWxmLnRpbWUgPSAoX2xhc3RVcGRhdGUgLSBfc3RhcnRUaW1lKSAvIDEwMDA7XG5cdFx0XHRcdFx0b3ZlcmxhcCA9IF9zZWxmLnRpbWUgLSBfbmV4dFRpbWU7XG5cdFx0XHRcdFx0aWYgKCFfZnBzIHx8IG92ZXJsYXAgPiAwIHx8IG1hbnVhbCA9PT0gdHJ1ZSkge1xuXHRcdFx0XHRcdFx0X3NlbGYuZnJhbWUrKztcblx0XHRcdFx0XHRcdF9uZXh0VGltZSArPSBvdmVybGFwICsgKG92ZXJsYXAgPj0gX2dhcCA/IDAuMDA0IDogX2dhcCAtIG92ZXJsYXApO1xuXHRcdFx0XHRcdFx0ZGlzcGF0Y2ggPSB0cnVlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRpZiAobWFudWFsICE9PSB0cnVlKSB7IC8vbWFrZSBzdXJlIHRoZSByZXF1ZXN0IGlzIG1hZGUgYmVmb3JlIHdlIGRpc3BhdGNoIHRoZSBcInRpY2tcIiBldmVudCBzbyB0aGF0IHRpbWluZyBpcyBtYWludGFpbmVkLiBPdGhlcndpc2UsIGlmIHByb2Nlc3NpbmcgdGhlIFwidGlja1wiIHJlcXVpcmVzIGEgYnVuY2ggb2YgdGltZSAobGlrZSAxNW1zKSBhbmQgd2UncmUgdXNpbmcgYSBzZXRUaW1lb3V0KCkgdGhhdCdzIGJhc2VkIG9uIDE2LjdtcywgaXQnZCB0ZWNobmljYWxseSB0YWtlIDMxLjdtcyBiZXR3ZWVuIGZyYW1lcyBvdGhlcndpc2UuXG5cdFx0XHRcdFx0XHRfaWQgPSBfcmVxKF90aWNrKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0aWYgKGRpc3BhdGNoKSB7XG5cdFx0XHRcdFx0XHRfc2VsZi5kaXNwYXRjaEV2ZW50KF90aWNrV29yZCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9O1xuXG5cdFx0XHRFdmVudERpc3BhdGNoZXIuY2FsbChfc2VsZik7XG5cdFx0XHRfc2VsZi50aW1lID0gX3NlbGYuZnJhbWUgPSAwO1xuXHRcdFx0X3NlbGYudGljayA9IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRfdGljayh0cnVlKTtcblx0XHRcdH07XG5cblx0XHRcdF9zZWxmLmxhZ1Ntb290aGluZyA9IGZ1bmN0aW9uKHRocmVzaG9sZCwgYWRqdXN0ZWRMYWcpIHtcblx0XHRcdFx0aWYgKCFhcmd1bWVudHMubGVuZ3RoKSB7IC8vaWYgbGFnU21vb3RoaW5nKCkgaXMgY2FsbGVkIHdpdGggbm8gYXJndW1lbnRzLCB0cmVhdCBpdCBsaWtlIGEgZ2V0dGVyIHRoYXQgcmV0dXJucyBhIGJvb2xlYW4gaW5kaWNhdGluZyBpZiBpdCdzIGVuYWJsZWQgb3Igbm90LiBUaGlzIGlzIHB1cnBvc2VseSB1bmRvY3VtZW50ZWQgYW5kIGlzIGZvciBpbnRlcm5hbCB1c2UuXG5cdFx0XHRcdFx0cmV0dXJuIChfbGFnVGhyZXNob2xkIDwgMSAvIF90aW55TnVtKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRfbGFnVGhyZXNob2xkID0gdGhyZXNob2xkIHx8ICgxIC8gX3RpbnlOdW0pOyAvL3plcm8gc2hvdWxkIGJlIGludGVycHJldGVkIGFzIGJhc2ljYWxseSB1bmxpbWl0ZWRcblx0XHRcdFx0X2FkanVzdGVkTGFnID0gTWF0aC5taW4oYWRqdXN0ZWRMYWcsIF9sYWdUaHJlc2hvbGQsIDApO1xuXHRcdFx0fTtcblxuXHRcdFx0X3NlbGYuc2xlZXAgPSBmdW5jdGlvbigpIHtcblx0XHRcdFx0aWYgKF9pZCA9PSBudWxsKSB7XG5cdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmICghX3VzZVJBRiB8fCAhX2NhbmNlbEFuaW1GcmFtZSkge1xuXHRcdFx0XHRcdGNsZWFyVGltZW91dChfaWQpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdF9jYW5jZWxBbmltRnJhbWUoX2lkKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRfcmVxID0gX2VtcHR5RnVuYztcblx0XHRcdFx0X2lkID0gbnVsbDtcblx0XHRcdFx0aWYgKF9zZWxmID09PSBfdGlja2VyKSB7XG5cdFx0XHRcdFx0X3RpY2tlckFjdGl2ZSA9IGZhbHNlO1xuXHRcdFx0XHR9XG5cdFx0XHR9O1xuXG5cdFx0XHRfc2VsZi53YWtlID0gZnVuY3Rpb24oc2VhbWxlc3MpIHtcblx0XHRcdFx0aWYgKF9pZCAhPT0gbnVsbCkge1xuXHRcdFx0XHRcdF9zZWxmLnNsZWVwKCk7XG5cdFx0XHRcdH0gZWxzZSBpZiAoc2VhbWxlc3MpIHtcblx0XHRcdFx0XHRfc3RhcnRUaW1lICs9IC1fbGFzdFVwZGF0ZSArIChfbGFzdFVwZGF0ZSA9IF9nZXRUaW1lKCkpO1xuXHRcdFx0XHR9IGVsc2UgaWYgKF9zZWxmLmZyYW1lID4gMTApIHsgLy9kb24ndCB0cmlnZ2VyIGxhZ1Ntb290aGluZyBpZiB3ZSdyZSBqdXN0IHdha2luZyB1cCwgYW5kIG1ha2Ugc3VyZSB0aGF0IGF0IGxlYXN0IDEwIGZyYW1lcyBoYXZlIGVsYXBzZWQgYmVjYXVzZSBvZiB0aGUgaU9TIGJ1ZyB0aGF0IHdlIHdvcmsgYXJvdW5kIGJlbG93IHdpdGggdGhlIDEuNS1zZWNvbmQgc2V0VGltb3V0KCkuXG5cdFx0XHRcdFx0X2xhc3RVcGRhdGUgPSBfZ2V0VGltZSgpIC0gX2xhZ1RocmVzaG9sZCArIDU7XG5cdFx0XHRcdH1cblx0XHRcdFx0X3JlcSA9IChfZnBzID09PSAwKSA/IF9lbXB0eUZ1bmMgOiAoIV91c2VSQUYgfHwgIV9yZXFBbmltRnJhbWUpID8gZnVuY3Rpb24oZikgeyByZXR1cm4gc2V0VGltZW91dChmLCAoKF9uZXh0VGltZSAtIF9zZWxmLnRpbWUpICogMTAwMCArIDEpIHwgMCk7IH0gOiBfcmVxQW5pbUZyYW1lO1xuXHRcdFx0XHRpZiAoX3NlbGYgPT09IF90aWNrZXIpIHtcblx0XHRcdFx0XHRfdGlja2VyQWN0aXZlID0gdHJ1ZTtcblx0XHRcdFx0fVxuXHRcdFx0XHRfdGljaygyKTtcblx0XHRcdH07XG5cblx0XHRcdF9zZWxmLmZwcyA9IGZ1bmN0aW9uKHZhbHVlKSB7XG5cdFx0XHRcdGlmICghYXJndW1lbnRzLmxlbmd0aCkge1xuXHRcdFx0XHRcdHJldHVybiBfZnBzO1xuXHRcdFx0XHR9XG5cdFx0XHRcdF9mcHMgPSB2YWx1ZTtcblx0XHRcdFx0X2dhcCA9IDEgLyAoX2ZwcyB8fCA2MCk7XG5cdFx0XHRcdF9uZXh0VGltZSA9IHRoaXMudGltZSArIF9nYXA7XG5cdFx0XHRcdF9zZWxmLndha2UoKTtcblx0XHRcdH07XG5cblx0XHRcdF9zZWxmLnVzZVJBRiA9IGZ1bmN0aW9uKHZhbHVlKSB7XG5cdFx0XHRcdGlmICghYXJndW1lbnRzLmxlbmd0aCkge1xuXHRcdFx0XHRcdHJldHVybiBfdXNlUkFGO1xuXHRcdFx0XHR9XG5cdFx0XHRcdF9zZWxmLnNsZWVwKCk7XG5cdFx0XHRcdF91c2VSQUYgPSB2YWx1ZTtcblx0XHRcdFx0X3NlbGYuZnBzKF9mcHMpO1xuXHRcdFx0fTtcblx0XHRcdF9zZWxmLmZwcyhmcHMpO1xuXG5cdFx0XHQvL2EgYnVnIGluIGlPUyA2IFNhZmFyaSBvY2Nhc2lvbmFsbHkgcHJldmVudHMgdGhlIHJlcXVlc3RBbmltYXRpb25GcmFtZSBmcm9tIHdvcmtpbmcgaW5pdGlhbGx5LCBzbyB3ZSB1c2UgYSAxLjUtc2Vjb25kIHRpbWVvdXQgdGhhdCBhdXRvbWF0aWNhbGx5IGZhbGxzIGJhY2sgdG8gc2V0VGltZW91dCgpIGlmIGl0IHNlbnNlcyB0aGlzIGNvbmRpdGlvbi5cblx0XHRcdHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG5cdFx0XHRcdGlmIChfdXNlUkFGID09PSBcImF1dG9cIiAmJiBfc2VsZi5mcmFtZSA8IDUgJiYgKF9kb2MgfHwge30pLnZpc2liaWxpdHlTdGF0ZSAhPT0gXCJoaWRkZW5cIikge1xuXHRcdFx0XHRcdF9zZWxmLnVzZVJBRihmYWxzZSk7XG5cdFx0XHRcdH1cblx0XHRcdH0sIDE1MDApO1xuXHRcdH0pO1xuXG5cdFx0cCA9IGdzLlRpY2tlci5wcm90b3R5cGUgPSBuZXcgZ3MuZXZlbnRzLkV2ZW50RGlzcGF0Y2hlcigpO1xuXHRcdHAuY29uc3RydWN0b3IgPSBncy5UaWNrZXI7XG5cblxuLypcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIEFuaW1hdGlvblxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICovXG5cdFx0dmFyIEFuaW1hdGlvbiA9IF9jbGFzcyhcImNvcmUuQW5pbWF0aW9uXCIsIGZ1bmN0aW9uKGR1cmF0aW9uLCB2YXJzKSB7XG5cdFx0XHRcdHRoaXMudmFycyA9IHZhcnMgPSB2YXJzIHx8IHt9O1xuXHRcdFx0XHR0aGlzLl9kdXJhdGlvbiA9IHRoaXMuX3RvdGFsRHVyYXRpb24gPSBkdXJhdGlvbiB8fCAwO1xuXHRcdFx0XHR0aGlzLl9kZWxheSA9IE51bWJlcih2YXJzLmRlbGF5KSB8fCAwO1xuXHRcdFx0XHR0aGlzLl90aW1lU2NhbGUgPSAxO1xuXHRcdFx0XHR0aGlzLl9hY3RpdmUgPSAodmFycy5pbW1lZGlhdGVSZW5kZXIgPT09IHRydWUpO1xuXHRcdFx0XHR0aGlzLmRhdGEgPSB2YXJzLmRhdGE7XG5cdFx0XHRcdHRoaXMuX3JldmVyc2VkID0gKHZhcnMucmV2ZXJzZWQgPT09IHRydWUpO1xuXG5cdFx0XHRcdGlmICghX3Jvb3RUaW1lbGluZSkge1xuXHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAoIV90aWNrZXJBY3RpdmUpIHsgLy9zb21lIGJyb3dzZXJzIChsaWtlIGlPUyA2IFNhZmFyaSkgc2h1dCBkb3duIEphdmFTY3JpcHQgZXhlY3V0aW9uIHdoZW4gdGhlIHRhYiBpcyBkaXNhYmxlZCBhbmQgdGhleSBbb2NjYXNpb25hbGx5XSBuZWdsZWN0IHRvIHN0YXJ0IHVwIHJlcXVlc3RBbmltYXRpb25GcmFtZSBhZ2FpbiB3aGVuIHJldHVybmluZyAtIHRoaXMgY29kZSBlbnN1cmVzIHRoYXQgdGhlIGVuZ2luZSBzdGFydHMgdXAgYWdhaW4gcHJvcGVybHkuXG5cdFx0XHRcdFx0X3RpY2tlci53YWtlKCk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHR2YXIgdGwgPSB0aGlzLnZhcnMudXNlRnJhbWVzID8gX3Jvb3RGcmFtZXNUaW1lbGluZSA6IF9yb290VGltZWxpbmU7XG5cdFx0XHRcdHRsLmFkZCh0aGlzLCB0bC5fdGltZSk7XG5cblx0XHRcdFx0aWYgKHRoaXMudmFycy5wYXVzZWQpIHtcblx0XHRcdFx0XHR0aGlzLnBhdXNlZCh0cnVlKTtcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cblx0XHRfdGlja2VyID0gQW5pbWF0aW9uLnRpY2tlciA9IG5ldyBncy5UaWNrZXIoKTtcblx0XHRwID0gQW5pbWF0aW9uLnByb3RvdHlwZTtcblx0XHRwLl9kaXJ0eSA9IHAuX2djID0gcC5faW5pdHRlZCA9IHAuX3BhdXNlZCA9IGZhbHNlO1xuXHRcdHAuX3RvdGFsVGltZSA9IHAuX3RpbWUgPSAwO1xuXHRcdHAuX3Jhd1ByZXZUaW1lID0gLTE7XG5cdFx0cC5fbmV4dCA9IHAuX2xhc3QgPSBwLl9vblVwZGF0ZSA9IHAuX3RpbWVsaW5lID0gcC50aW1lbGluZSA9IG51bGw7XG5cdFx0cC5fcGF1c2VkID0gZmFsc2U7XG5cblxuXHRcdC8vc29tZSBicm93c2VycyAobGlrZSBpT1MpIG9jY2FzaW9uYWxseSBkcm9wIHRoZSByZXF1ZXN0QW5pbWF0aW9uRnJhbWUgZXZlbnQgd2hlbiB0aGUgdXNlciBzd2l0Y2hlcyB0byBhIGRpZmZlcmVudCB0YWIgYW5kIHRoZW4gY29tZXMgYmFjayBhZ2Fpbiwgc28gd2UgdXNlIGEgMi1zZWNvbmQgc2V0VGltZW91dCgpIHRvIHNlbnNlIGlmL3doZW4gdGhhdCBjb25kaXRpb24gb2NjdXJzIGFuZCB0aGVuIHdha2UoKSB0aGUgdGlja2VyLlxuXHRcdHZhciBfY2hlY2tUaW1lb3V0ID0gZnVuY3Rpb24oKSB7XG5cdFx0XHRcdGlmIChfdGlja2VyQWN0aXZlICYmIF9nZXRUaW1lKCkgLSBfbGFzdFVwZGF0ZSA+IDIwMDAgJiYgKChfZG9jIHx8IHt9KS52aXNpYmlsaXR5U3RhdGUgIT09IFwiaGlkZGVuXCIgfHwgIV90aWNrZXIubGFnU21vb3RoaW5nKCkpKSB7IC8vbm90ZTogaWYgdGhlIHRhYiBpcyBoaWRkZW4sIHdlIHNob3VsZCBzdGlsbCB3YWtlIGlmIGxhZ1Ntb290aGluZyBoYXMgYmVlbiBkaXNhYmxlZC5cblx0XHRcdFx0XHRfdGlja2VyLndha2UoKTtcblx0XHRcdFx0fVxuXHRcdFx0XHR2YXIgdCA9IHNldFRpbWVvdXQoX2NoZWNrVGltZW91dCwgMjAwMCk7XG5cdFx0XHRcdGlmICh0LnVucmVmKSB7XG5cdFx0XHRcdFx0Ly8gYWxsb3dzIGEgbm9kZSBwcm9jZXNzIHRvIGV4aXQgZXZlbiBpZiB0aGUgdGltZW91dOKAmXMgY2FsbGJhY2sgaGFzbid0IGJlZW4gaW52b2tlZC4gV2l0aG91dCBpdCwgdGhlIG5vZGUgcHJvY2VzcyBjb3VsZCBoYW5nIGFzIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGV2ZXJ5IHR3byBzZWNvbmRzLlxuXHRcdFx0XHRcdHQudW5yZWYoKTtcblx0XHRcdFx0fVxuXHRcdFx0fTtcblx0XHRfY2hlY2tUaW1lb3V0KCk7XG5cblxuXHRcdHAucGxheSA9IGZ1bmN0aW9uKGZyb20sIHN1cHByZXNzRXZlbnRzKSB7XG5cdFx0XHRpZiAoZnJvbSAhPSBudWxsKSB7XG5cdFx0XHRcdHRoaXMuc2Vlayhmcm9tLCBzdXBwcmVzc0V2ZW50cyk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gdGhpcy5yZXZlcnNlZChmYWxzZSkucGF1c2VkKGZhbHNlKTtcblx0XHR9O1xuXG5cdFx0cC5wYXVzZSA9IGZ1bmN0aW9uKGF0VGltZSwgc3VwcHJlc3NFdmVudHMpIHtcblx0XHRcdGlmIChhdFRpbWUgIT0gbnVsbCkge1xuXHRcdFx0XHR0aGlzLnNlZWsoYXRUaW1lLCBzdXBwcmVzc0V2ZW50cyk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gdGhpcy5wYXVzZWQodHJ1ZSk7XG5cdFx0fTtcblxuXHRcdHAucmVzdW1lID0gZnVuY3Rpb24oZnJvbSwgc3VwcHJlc3NFdmVudHMpIHtcblx0XHRcdGlmIChmcm9tICE9IG51bGwpIHtcblx0XHRcdFx0dGhpcy5zZWVrKGZyb20sIHN1cHByZXNzRXZlbnRzKTtcblx0XHRcdH1cblx0XHRcdHJldHVybiB0aGlzLnBhdXNlZChmYWxzZSk7XG5cdFx0fTtcblxuXHRcdHAuc2VlayA9IGZ1bmN0aW9uKHRpbWUsIHN1cHByZXNzRXZlbnRzKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy50b3RhbFRpbWUoTnVtYmVyKHRpbWUpLCBzdXBwcmVzc0V2ZW50cyAhPT0gZmFsc2UpO1xuXHRcdH07XG5cblx0XHRwLnJlc3RhcnQgPSBmdW5jdGlvbihpbmNsdWRlRGVsYXksIHN1cHByZXNzRXZlbnRzKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5yZXZlcnNlZChmYWxzZSkucGF1c2VkKGZhbHNlKS50b3RhbFRpbWUoaW5jbHVkZURlbGF5ID8gLXRoaXMuX2RlbGF5IDogMCwgKHN1cHByZXNzRXZlbnRzICE9PSBmYWxzZSksIHRydWUpO1xuXHRcdH07XG5cblx0XHRwLnJldmVyc2UgPSBmdW5jdGlvbihmcm9tLCBzdXBwcmVzc0V2ZW50cykge1xuXHRcdFx0aWYgKGZyb20gIT0gbnVsbCkge1xuXHRcdFx0XHR0aGlzLnNlZWsoKGZyb20gfHwgdGhpcy50b3RhbER1cmF0aW9uKCkpLCBzdXBwcmVzc0V2ZW50cyk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gdGhpcy5yZXZlcnNlZCh0cnVlKS5wYXVzZWQoZmFsc2UpO1xuXHRcdH07XG5cblx0XHRwLnJlbmRlciA9IGZ1bmN0aW9uKHRpbWUsIHN1cHByZXNzRXZlbnRzLCBmb3JjZSkge1xuXHRcdFx0Ly9zdHViIC0gd2Ugb3ZlcnJpZGUgdGhpcyBtZXRob2QgaW4gc3ViY2xhc3Nlcy5cblx0XHR9O1xuXG5cdFx0cC5pbnZhbGlkYXRlID0gZnVuY3Rpb24oKSB7XG5cdFx0XHR0aGlzLl90aW1lID0gdGhpcy5fdG90YWxUaW1lID0gMDtcblx0XHRcdHRoaXMuX2luaXR0ZWQgPSB0aGlzLl9nYyA9IGZhbHNlO1xuXHRcdFx0dGhpcy5fcmF3UHJldlRpbWUgPSAtMTtcblx0XHRcdGlmICh0aGlzLl9nYyB8fCAhdGhpcy50aW1lbGluZSkge1xuXHRcdFx0XHR0aGlzLl9lbmFibGVkKHRydWUpO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0fTtcblxuXHRcdHAuaXNBY3RpdmUgPSBmdW5jdGlvbigpIHtcblx0XHRcdHZhciB0bCA9IHRoaXMuX3RpbWVsaW5lLCAvL3RoZSAyIHJvb3QgdGltZWxpbmVzIHdvbid0IGhhdmUgYSBfdGltZWxpbmU7IHRoZXkncmUgYWx3YXlzIGFjdGl2ZS5cblx0XHRcdFx0c3RhcnRUaW1lID0gdGhpcy5fc3RhcnRUaW1lLFxuXHRcdFx0XHRyYXdUaW1lO1xuXHRcdFx0cmV0dXJuICghdGwgfHwgKCF0aGlzLl9nYyAmJiAhdGhpcy5fcGF1c2VkICYmIHRsLmlzQWN0aXZlKCkgJiYgKHJhd1RpbWUgPSB0bC5yYXdUaW1lKHRydWUpKSA+PSBzdGFydFRpbWUgJiYgcmF3VGltZSA8IHN0YXJ0VGltZSArIHRoaXMudG90YWxEdXJhdGlvbigpIC8gdGhpcy5fdGltZVNjYWxlIC0gMC4wMDAwMDAxKSk7XG5cdFx0fTtcblxuXHRcdHAuX2VuYWJsZWQgPSBmdW5jdGlvbiAoZW5hYmxlZCwgaWdub3JlVGltZWxpbmUpIHtcblx0XHRcdGlmICghX3RpY2tlckFjdGl2ZSkge1xuXHRcdFx0XHRfdGlja2VyLndha2UoKTtcblx0XHRcdH1cblx0XHRcdHRoaXMuX2djID0gIWVuYWJsZWQ7XG5cdFx0XHR0aGlzLl9hY3RpdmUgPSB0aGlzLmlzQWN0aXZlKCk7XG5cdFx0XHRpZiAoaWdub3JlVGltZWxpbmUgIT09IHRydWUpIHtcblx0XHRcdFx0aWYgKGVuYWJsZWQgJiYgIXRoaXMudGltZWxpbmUpIHtcblx0XHRcdFx0XHR0aGlzLl90aW1lbGluZS5hZGQodGhpcywgdGhpcy5fc3RhcnRUaW1lIC0gdGhpcy5fZGVsYXkpO1xuXHRcdFx0XHR9IGVsc2UgaWYgKCFlbmFibGVkICYmIHRoaXMudGltZWxpbmUpIHtcblx0XHRcdFx0XHR0aGlzLl90aW1lbGluZS5fcmVtb3ZlKHRoaXMsIHRydWUpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fTtcblxuXG5cdFx0cC5fa2lsbCA9IGZ1bmN0aW9uKHZhcnMsIHRhcmdldCkge1xuXHRcdFx0cmV0dXJuIHRoaXMuX2VuYWJsZWQoZmFsc2UsIGZhbHNlKTtcblx0XHR9O1xuXG5cdFx0cC5raWxsID0gZnVuY3Rpb24odmFycywgdGFyZ2V0KSB7XG5cdFx0XHR0aGlzLl9raWxsKHZhcnMsIHRhcmdldCk7XG5cdFx0XHRyZXR1cm4gdGhpcztcblx0XHR9O1xuXG5cdFx0cC5fdW5jYWNoZSA9IGZ1bmN0aW9uKGluY2x1ZGVTZWxmKSB7XG5cdFx0XHR2YXIgdHdlZW4gPSBpbmNsdWRlU2VsZiA/IHRoaXMgOiB0aGlzLnRpbWVsaW5lO1xuXHRcdFx0d2hpbGUgKHR3ZWVuKSB7XG5cdFx0XHRcdHR3ZWVuLl9kaXJ0eSA9IHRydWU7XG5cdFx0XHRcdHR3ZWVuID0gdHdlZW4udGltZWxpbmU7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gdGhpcztcblx0XHR9O1xuXG5cdFx0cC5fc3dhcFNlbGZJblBhcmFtcyA9IGZ1bmN0aW9uKHBhcmFtcykge1xuXHRcdFx0dmFyIGkgPSBwYXJhbXMubGVuZ3RoLFxuXHRcdFx0XHRjb3B5ID0gcGFyYW1zLmNvbmNhdCgpO1xuXHRcdFx0d2hpbGUgKC0taSA+IC0xKSB7XG5cdFx0XHRcdGlmIChwYXJhbXNbaV0gPT09IFwie3NlbGZ9XCIpIHtcblx0XHRcdFx0XHRjb3B5W2ldID0gdGhpcztcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIGNvcHk7XG5cdFx0fTtcblxuXHRcdHAuX2NhbGxiYWNrID0gZnVuY3Rpb24odHlwZSkge1xuXHRcdFx0dmFyIHYgPSB0aGlzLnZhcnMsXG5cdFx0XHRcdGNhbGxiYWNrID0gdlt0eXBlXSxcblx0XHRcdFx0cGFyYW1zID0gdlt0eXBlICsgXCJQYXJhbXNcIl0sXG5cdFx0XHRcdHNjb3BlID0gdlt0eXBlICsgXCJTY29wZVwiXSB8fCB2LmNhbGxiYWNrU2NvcGUgfHwgdGhpcyxcblx0XHRcdFx0bCA9IHBhcmFtcyA/IHBhcmFtcy5sZW5ndGggOiAwO1xuXHRcdFx0c3dpdGNoIChsKSB7IC8vc3BlZWQgb3B0aW1pemF0aW9uOyBjYWxsKCkgaXMgZmFzdGVyIHRoYW4gYXBwbHkoKSBzbyB1c2UgaXQgd2hlbiB0aGVyZSBhcmUgb25seSBhIGZldyBwYXJhbWV0ZXJzICh3aGljaCBpcyBieSBmYXIgbW9zdCBjb21tb24pLiBQcmV2aW91c2x5IHdlIHNpbXBseSBkaWQgdmFyIHYgPSB0aGlzLnZhcnM7IHZbdHlwZV0uYXBwbHkodlt0eXBlICsgXCJTY29wZVwiXSB8fCB2LmNhbGxiYWNrU2NvcGUgfHwgdGhpcywgdlt0eXBlICsgXCJQYXJhbXNcIl0gfHwgX2JsYW5rQXJyYXkpO1xuXHRcdFx0XHRjYXNlIDA6IGNhbGxiYWNrLmNhbGwoc2NvcGUpOyBicmVhaztcblx0XHRcdFx0Y2FzZSAxOiBjYWxsYmFjay5jYWxsKHNjb3BlLCBwYXJhbXNbMF0pOyBicmVhaztcblx0XHRcdFx0Y2FzZSAyOiBjYWxsYmFjay5jYWxsKHNjb3BlLCBwYXJhbXNbMF0sIHBhcmFtc1sxXSk7IGJyZWFrO1xuXHRcdFx0XHRkZWZhdWx0OiBjYWxsYmFjay5hcHBseShzY29wZSwgcGFyYW1zKTtcblx0XHRcdH1cblx0XHR9O1xuXG4vLy0tLS1BbmltYXRpb24gZ2V0dGVycy9zZXR0ZXJzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cblx0XHRwLmV2ZW50Q2FsbGJhY2sgPSBmdW5jdGlvbih0eXBlLCBjYWxsYmFjaywgcGFyYW1zLCBzY29wZSkge1xuXHRcdFx0aWYgKCh0eXBlIHx8IFwiXCIpLnN1YnN0cigwLDIpID09PSBcIm9uXCIpIHtcblx0XHRcdFx0dmFyIHYgPSB0aGlzLnZhcnM7XG5cdFx0XHRcdGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAxKSB7XG5cdFx0XHRcdFx0cmV0dXJuIHZbdHlwZV07XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKGNhbGxiYWNrID09IG51bGwpIHtcblx0XHRcdFx0XHRkZWxldGUgdlt0eXBlXTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHR2W3R5cGVdID0gY2FsbGJhY2s7XG5cdFx0XHRcdFx0dlt0eXBlICsgXCJQYXJhbXNcIl0gPSAoX2lzQXJyYXkocGFyYW1zKSAmJiBwYXJhbXMuam9pbihcIlwiKS5pbmRleE9mKFwie3NlbGZ9XCIpICE9PSAtMSkgPyB0aGlzLl9zd2FwU2VsZkluUGFyYW1zKHBhcmFtcykgOiBwYXJhbXM7XG5cdFx0XHRcdFx0dlt0eXBlICsgXCJTY29wZVwiXSA9IHNjb3BlO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmICh0eXBlID09PSBcIm9uVXBkYXRlXCIpIHtcblx0XHRcdFx0XHR0aGlzLl9vblVwZGF0ZSA9IGNhbGxiYWNrO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gdGhpcztcblx0XHR9O1xuXG5cdFx0cC5kZWxheSA9IGZ1bmN0aW9uKHZhbHVlKSB7XG5cdFx0XHRpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHtcblx0XHRcdFx0cmV0dXJuIHRoaXMuX2RlbGF5O1xuXHRcdFx0fVxuXHRcdFx0aWYgKHRoaXMuX3RpbWVsaW5lLnNtb290aENoaWxkVGltaW5nKSB7XG5cdFx0XHRcdHRoaXMuc3RhcnRUaW1lKCB0aGlzLl9zdGFydFRpbWUgKyB2YWx1ZSAtIHRoaXMuX2RlbGF5ICk7XG5cdFx0XHR9XG5cdFx0XHR0aGlzLl9kZWxheSA9IHZhbHVlO1xuXHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0fTtcblxuXHRcdHAuZHVyYXRpb24gPSBmdW5jdGlvbih2YWx1ZSkge1xuXHRcdFx0aWYgKCFhcmd1bWVudHMubGVuZ3RoKSB7XG5cdFx0XHRcdHRoaXMuX2RpcnR5ID0gZmFsc2U7XG5cdFx0XHRcdHJldHVybiB0aGlzLl9kdXJhdGlvbjtcblx0XHRcdH1cblx0XHRcdHRoaXMuX2R1cmF0aW9uID0gdGhpcy5fdG90YWxEdXJhdGlvbiA9IHZhbHVlO1xuXHRcdFx0dGhpcy5fdW5jYWNoZSh0cnVlKTsgLy90cnVlIGluIGNhc2UgaXQncyBhIFR3ZWVuTWF4IG9yIFRpbWVsaW5lTWF4IHRoYXQgaGFzIGEgcmVwZWF0IC0gd2UnbGwgbmVlZCB0byByZWZyZXNoIHRoZSB0b3RhbER1cmF0aW9uLlxuXHRcdFx0aWYgKHRoaXMuX3RpbWVsaW5lLnNtb290aENoaWxkVGltaW5nKSBpZiAodGhpcy5fdGltZSA+IDApIGlmICh0aGlzLl90aW1lIDwgdGhpcy5fZHVyYXRpb24pIGlmICh2YWx1ZSAhPT0gMCkge1xuXHRcdFx0XHR0aGlzLnRvdGFsVGltZSh0aGlzLl90b3RhbFRpbWUgKiAodmFsdWUgLyB0aGlzLl9kdXJhdGlvbiksIHRydWUpO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0fTtcblxuXHRcdHAudG90YWxEdXJhdGlvbiA9IGZ1bmN0aW9uKHZhbHVlKSB7XG5cdFx0XHR0aGlzLl9kaXJ0eSA9IGZhbHNlO1xuXHRcdFx0cmV0dXJuICghYXJndW1lbnRzLmxlbmd0aCkgPyB0aGlzLl90b3RhbER1cmF0aW9uIDogdGhpcy5kdXJhdGlvbih2YWx1ZSk7XG5cdFx0fTtcblxuXHRcdHAudGltZSA9IGZ1bmN0aW9uKHZhbHVlLCBzdXBwcmVzc0V2ZW50cykge1xuXHRcdFx0aWYgKCFhcmd1bWVudHMubGVuZ3RoKSB7XG5cdFx0XHRcdHJldHVybiB0aGlzLl90aW1lO1xuXHRcdFx0fVxuXHRcdFx0aWYgKHRoaXMuX2RpcnR5KSB7XG5cdFx0XHRcdHRoaXMudG90YWxEdXJhdGlvbigpO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHRoaXMudG90YWxUaW1lKCh2YWx1ZSA+IHRoaXMuX2R1cmF0aW9uKSA/IHRoaXMuX2R1cmF0aW9uIDogdmFsdWUsIHN1cHByZXNzRXZlbnRzKTtcblx0XHR9O1xuXG5cdFx0cC50b3RhbFRpbWUgPSBmdW5jdGlvbih0aW1lLCBzdXBwcmVzc0V2ZW50cywgdW5jYXBwZWQpIHtcblx0XHRcdGlmICghX3RpY2tlckFjdGl2ZSkge1xuXHRcdFx0XHRfdGlja2VyLndha2UoKTtcblx0XHRcdH1cblx0XHRcdGlmICghYXJndW1lbnRzLmxlbmd0aCkge1xuXHRcdFx0XHRyZXR1cm4gdGhpcy5fdG90YWxUaW1lO1xuXHRcdFx0fVxuXHRcdFx0aWYgKHRoaXMuX3RpbWVsaW5lKSB7XG5cdFx0XHRcdGlmICh0aW1lIDwgMCAmJiAhdW5jYXBwZWQpIHtcblx0XHRcdFx0XHR0aW1lICs9IHRoaXMudG90YWxEdXJhdGlvbigpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmICh0aGlzLl90aW1lbGluZS5zbW9vdGhDaGlsZFRpbWluZykge1xuXHRcdFx0XHRcdGlmICh0aGlzLl9kaXJ0eSkge1xuXHRcdFx0XHRcdFx0dGhpcy50b3RhbER1cmF0aW9uKCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHZhciB0b3RhbER1cmF0aW9uID0gdGhpcy5fdG90YWxEdXJhdGlvbixcblx0XHRcdFx0XHRcdHRsID0gdGhpcy5fdGltZWxpbmU7XG5cdFx0XHRcdFx0aWYgKHRpbWUgPiB0b3RhbER1cmF0aW9uICYmICF1bmNhcHBlZCkge1xuXHRcdFx0XHRcdFx0dGltZSA9IHRvdGFsRHVyYXRpb247XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHRoaXMuX3N0YXJ0VGltZSA9ICh0aGlzLl9wYXVzZWQgPyB0aGlzLl9wYXVzZVRpbWUgOiB0bC5fdGltZSkgLSAoKCF0aGlzLl9yZXZlcnNlZCA/IHRpbWUgOiB0b3RhbER1cmF0aW9uIC0gdGltZSkgLyB0aGlzLl90aW1lU2NhbGUpO1xuXHRcdFx0XHRcdGlmICghdGwuX2RpcnR5KSB7IC8vZm9yIHBlcmZvcm1hbmNlIGltcHJvdmVtZW50LiBJZiB0aGUgcGFyZW50J3MgY2FjaGUgaXMgYWxyZWFkeSBkaXJ0eSwgaXQgYWxyZWFkeSB0b29rIGNhcmUgb2YgbWFya2luZyB0aGUgYW5jZXN0b3JzIGFzIGRpcnR5IHRvbywgc28gc2tpcCB0aGUgZnVuY3Rpb24gY2FsbCBoZXJlLlxuXHRcdFx0XHRcdFx0dGhpcy5fdW5jYWNoZShmYWxzZSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdC8vaW4gY2FzZSBhbnkgb2YgdGhlIGFuY2VzdG9yIHRpbWVsaW5lcyBoYWQgY29tcGxldGVkIGJ1dCBzaG91bGQgbm93IGJlIGVuYWJsZWQsIHdlIHNob3VsZCByZXNldCB0aGVpciB0b3RhbFRpbWUoKSB3aGljaCB3aWxsIGFsc28gZW5zdXJlIHRoYXQgdGhleSdyZSBsaW5lZCB1cCBwcm9wZXJseSBhbmQgZW5hYmxlZC4gU2tpcCBmb3IgYW5pbWF0aW9ucyB0aGF0IGFyZSBvbiB0aGUgcm9vdCAod2FzdGVmdWwpLiBFeGFtcGxlOiBhIFRpbWVsaW5lTGl0ZS5leHBvcnRSb290KCkgaXMgcGVyZm9ybWVkIHdoZW4gdGhlcmUncyBhIHBhdXNlZCB0d2VlbiBvbiB0aGUgcm9vdCwgdGhlIGV4cG9ydCB3aWxsIG5vdCBjb21wbGV0ZSB1bnRpbCB0aGF0IHR3ZWVuIGlzIHVucGF1c2VkLCBidXQgaW1hZ2luZSBhIGNoaWxkIGdldHMgcmVzdGFydGVkIGxhdGVyLCBhZnRlciBhbGwgW3VucGF1c2VkXSB0d2VlbnMgaGF2ZSBjb21wbGV0ZWQuIFRoZSBzdGFydFRpbWUgb2YgdGhhdCBjaGlsZCB3b3VsZCBnZXQgcHVzaGVkIG91dCwgYnV0IG9uZSBvZiB0aGUgYW5jZXN0b3JzIG1heSBoYXZlIGNvbXBsZXRlZC5cblx0XHRcdFx0XHRpZiAodGwuX3RpbWVsaW5lKSB7XG5cdFx0XHRcdFx0XHR3aGlsZSAodGwuX3RpbWVsaW5lKSB7XG5cdFx0XHRcdFx0XHRcdGlmICh0bC5fdGltZWxpbmUuX3RpbWUgIT09ICh0bC5fc3RhcnRUaW1lICsgdGwuX3RvdGFsVGltZSkgLyB0bC5fdGltZVNjYWxlKSB7XG5cdFx0XHRcdFx0XHRcdFx0dGwudG90YWxUaW1lKHRsLl90b3RhbFRpbWUsIHRydWUpO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdHRsID0gdGwuX3RpbWVsaW5lO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAodGhpcy5fZ2MpIHtcblx0XHRcdFx0XHR0aGlzLl9lbmFibGVkKHRydWUsIGZhbHNlKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAodGhpcy5fdG90YWxUaW1lICE9PSB0aW1lIHx8IHRoaXMuX2R1cmF0aW9uID09PSAwKSB7XG5cdFx0XHRcdFx0aWYgKF9sYXp5VHdlZW5zLmxlbmd0aCkge1xuXHRcdFx0XHRcdFx0X2xhenlSZW5kZXIoKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0dGhpcy5yZW5kZXIodGltZSwgc3VwcHJlc3NFdmVudHMsIGZhbHNlKTtcblx0XHRcdFx0XHRpZiAoX2xhenlUd2VlbnMubGVuZ3RoKSB7IC8vaW4gY2FzZSByZW5kZXJpbmcgY2F1c2VkIGFueSB0d2VlbnMgdG8gbGF6eS1pbml0LCB3ZSBzaG91bGQgcmVuZGVyIHRoZW0gYmVjYXVzZSB0eXBpY2FsbHkgd2hlbiBzb21lb25lIGNhbGxzIHNlZWsoKSBvciB0aW1lKCkgb3IgcHJvZ3Jlc3MoKSwgdGhleSBleHBlY3QgYW4gaW1tZWRpYXRlIHJlbmRlci5cblx0XHRcdFx0XHRcdF9sYXp5UmVuZGVyKCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gdGhpcztcblx0XHR9O1xuXG5cdFx0cC5wcm9ncmVzcyA9IHAudG90YWxQcm9ncmVzcyA9IGZ1bmN0aW9uKHZhbHVlLCBzdXBwcmVzc0V2ZW50cykge1xuXHRcdFx0dmFyIGR1cmF0aW9uID0gdGhpcy5kdXJhdGlvbigpO1xuXHRcdFx0cmV0dXJuICghYXJndW1lbnRzLmxlbmd0aCkgPyAoZHVyYXRpb24gPyB0aGlzLl90aW1lIC8gZHVyYXRpb24gOiB0aGlzLnJhdGlvKSA6IHRoaXMudG90YWxUaW1lKGR1cmF0aW9uICogdmFsdWUsIHN1cHByZXNzRXZlbnRzKTtcblx0XHR9O1xuXG5cdFx0cC5zdGFydFRpbWUgPSBmdW5jdGlvbih2YWx1ZSkge1xuXHRcdFx0aWYgKCFhcmd1bWVudHMubGVuZ3RoKSB7XG5cdFx0XHRcdHJldHVybiB0aGlzLl9zdGFydFRpbWU7XG5cdFx0XHR9XG5cdFx0XHRpZiAodmFsdWUgIT09IHRoaXMuX3N0YXJ0VGltZSkge1xuXHRcdFx0XHR0aGlzLl9zdGFydFRpbWUgPSB2YWx1ZTtcblx0XHRcdFx0aWYgKHRoaXMudGltZWxpbmUpIGlmICh0aGlzLnRpbWVsaW5lLl9zb3J0Q2hpbGRyZW4pIHtcblx0XHRcdFx0XHR0aGlzLnRpbWVsaW5lLmFkZCh0aGlzLCB2YWx1ZSAtIHRoaXMuX2RlbGF5KTsgLy9lbnN1cmVzIHRoYXQgYW55IG5lY2Vzc2FyeSByZS1zZXF1ZW5jaW5nIG9mIEFuaW1hdGlvbnMgaW4gdGhlIHRpbWVsaW5lIG9jY3VycyB0byBtYWtlIHN1cmUgdGhlIHJlbmRlcmluZyBvcmRlciBpcyBjb3JyZWN0LlxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gdGhpcztcblx0XHR9O1xuXG5cdFx0cC5lbmRUaW1lID0gZnVuY3Rpb24oaW5jbHVkZVJlcGVhdHMpIHtcblx0XHRcdHJldHVybiB0aGlzLl9zdGFydFRpbWUgKyAoKGluY2x1ZGVSZXBlYXRzICE9IGZhbHNlKSA/IHRoaXMudG90YWxEdXJhdGlvbigpIDogdGhpcy5kdXJhdGlvbigpKSAvIHRoaXMuX3RpbWVTY2FsZTtcblx0XHR9O1xuXG5cdFx0cC50aW1lU2NhbGUgPSBmdW5jdGlvbih2YWx1ZSkge1xuXHRcdFx0aWYgKCFhcmd1bWVudHMubGVuZ3RoKSB7XG5cdFx0XHRcdHJldHVybiB0aGlzLl90aW1lU2NhbGU7XG5cdFx0XHR9XG5cdFx0XHR2YXIgcGF1c2VUaW1lLCB0O1xuXHRcdFx0dmFsdWUgPSB2YWx1ZSB8fCBfdGlueU51bTsgLy9jYW4ndCBhbGxvdyB6ZXJvIGJlY2F1c2UgaXQnbGwgdGhyb3cgdGhlIG1hdGggb2ZmXG5cdFx0XHRpZiAodGhpcy5fdGltZWxpbmUgJiYgdGhpcy5fdGltZWxpbmUuc21vb3RoQ2hpbGRUaW1pbmcpIHtcblx0XHRcdFx0cGF1c2VUaW1lID0gdGhpcy5fcGF1c2VUaW1lO1xuXHRcdFx0XHR0ID0gKHBhdXNlVGltZSB8fCBwYXVzZVRpbWUgPT09IDApID8gcGF1c2VUaW1lIDogdGhpcy5fdGltZWxpbmUudG90YWxUaW1lKCk7XG5cdFx0XHRcdHRoaXMuX3N0YXJ0VGltZSA9IHQgLSAoKHQgLSB0aGlzLl9zdGFydFRpbWUpICogdGhpcy5fdGltZVNjYWxlIC8gdmFsdWUpO1xuXHRcdFx0fVxuXHRcdFx0dGhpcy5fdGltZVNjYWxlID0gdmFsdWU7XG5cdFx0XHR0ID0gdGhpcy50aW1lbGluZTtcblx0XHRcdHdoaWxlICh0ICYmIHQudGltZWxpbmUpIHsgLy9tdXN0IHVwZGF0ZSB0aGUgZHVyYXRpb24vdG90YWxEdXJhdGlvbiBvZiBhbGwgYW5jZXN0b3IgdGltZWxpbmVzIGltbWVkaWF0ZWx5IGluIGNhc2UgaW4gdGhlIG1pZGRsZSBvZiBhIHJlbmRlciBsb29wLCBvbmUgdHdlZW4gYWx0ZXJzIGFub3RoZXIgdHdlZW4ncyB0aW1lU2NhbGUgd2hpY2ggc2hvdmVzIGl0cyBzdGFydFRpbWUgYmVmb3JlIDAsIGZvcmNpbmcgdGhlIHBhcmVudCB0aW1lbGluZSB0byBzaGlmdCBhcm91bmQgYW5kIHNoaWZ0Q2hpbGRyZW4oKSB3aGljaCBjb3VsZCBhZmZlY3QgdGhhdCBuZXh0IHR3ZWVuJ3MgcmVuZGVyIChzdGFydFRpbWUpLiBEb2Vzbid0IG1hdHRlciBmb3IgdGhlIHJvb3QgdGltZWxpbmUgdGhvdWdoLlxuXHRcdFx0XHR0Ll9kaXJ0eSA9IHRydWU7XG5cdFx0XHRcdHQudG90YWxEdXJhdGlvbigpO1xuXHRcdFx0XHR0ID0gdC50aW1lbGluZTtcblx0XHRcdH1cblx0XHRcdHJldHVybiB0aGlzO1xuXHRcdH07XG5cblx0XHRwLnJldmVyc2VkID0gZnVuY3Rpb24odmFsdWUpIHtcblx0XHRcdGlmICghYXJndW1lbnRzLmxlbmd0aCkge1xuXHRcdFx0XHRyZXR1cm4gdGhpcy5fcmV2ZXJzZWQ7XG5cdFx0XHR9XG5cdFx0XHRpZiAodmFsdWUgIT0gdGhpcy5fcmV2ZXJzZWQpIHtcblx0XHRcdFx0dGhpcy5fcmV2ZXJzZWQgPSB2YWx1ZTtcblx0XHRcdFx0dGhpcy50b3RhbFRpbWUoKCh0aGlzLl90aW1lbGluZSAmJiAhdGhpcy5fdGltZWxpbmUuc21vb3RoQ2hpbGRUaW1pbmcpID8gdGhpcy50b3RhbER1cmF0aW9uKCkgLSB0aGlzLl90b3RhbFRpbWUgOiB0aGlzLl90b3RhbFRpbWUpLCB0cnVlKTtcblx0XHRcdH1cblx0XHRcdHJldHVybiB0aGlzO1xuXHRcdH07XG5cblx0XHRwLnBhdXNlZCA9IGZ1bmN0aW9uKHZhbHVlKSB7XG5cdFx0XHRpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHtcblx0XHRcdFx0cmV0dXJuIHRoaXMuX3BhdXNlZDtcblx0XHRcdH1cblx0XHRcdHZhciB0bCA9IHRoaXMuX3RpbWVsaW5lLFxuXHRcdFx0XHRyYXcsIGVsYXBzZWQ7XG5cdFx0XHRpZiAodmFsdWUgIT0gdGhpcy5fcGF1c2VkKSBpZiAodGwpIHtcblx0XHRcdFx0aWYgKCFfdGlja2VyQWN0aXZlICYmICF2YWx1ZSkge1xuXHRcdFx0XHRcdF90aWNrZXIud2FrZSgpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJhdyA9IHRsLnJhd1RpbWUoKTtcblx0XHRcdFx0ZWxhcHNlZCA9IHJhdyAtIHRoaXMuX3BhdXNlVGltZTtcblx0XHRcdFx0aWYgKCF2YWx1ZSAmJiB0bC5zbW9vdGhDaGlsZFRpbWluZykge1xuXHRcdFx0XHRcdHRoaXMuX3N0YXJ0VGltZSArPSBlbGFwc2VkO1xuXHRcdFx0XHRcdHRoaXMuX3VuY2FjaGUoZmFsc2UpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHRoaXMuX3BhdXNlVGltZSA9IHZhbHVlID8gcmF3IDogbnVsbDtcblx0XHRcdFx0dGhpcy5fcGF1c2VkID0gdmFsdWU7XG5cdFx0XHRcdHRoaXMuX2FjdGl2ZSA9IHRoaXMuaXNBY3RpdmUoKTtcblx0XHRcdFx0aWYgKCF2YWx1ZSAmJiBlbGFwc2VkICE9PSAwICYmIHRoaXMuX2luaXR0ZWQgJiYgdGhpcy5kdXJhdGlvbigpKSB7XG5cdFx0XHRcdFx0cmF3ID0gdGwuc21vb3RoQ2hpbGRUaW1pbmcgPyB0aGlzLl90b3RhbFRpbWUgOiAocmF3IC0gdGhpcy5fc3RhcnRUaW1lKSAvIHRoaXMuX3RpbWVTY2FsZTtcblx0XHRcdFx0XHR0aGlzLnJlbmRlcihyYXcsIChyYXcgPT09IHRoaXMuX3RvdGFsVGltZSksIHRydWUpOyAvL2luIGNhc2UgdGhlIHRhcmdldCdzIHByb3BlcnRpZXMgY2hhbmdlZCB2aWEgc29tZSBvdGhlciB0d2VlbiBvciBtYW51YWwgdXBkYXRlIGJ5IHRoZSB1c2VyLCB3ZSBzaG91bGQgZm9yY2UgYSByZW5kZXIuXG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdGlmICh0aGlzLl9nYyAmJiAhdmFsdWUpIHtcblx0XHRcdFx0dGhpcy5fZW5hYmxlZCh0cnVlLCBmYWxzZSk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gdGhpcztcblx0XHR9O1xuXG5cbi8qXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBTaW1wbGVUaW1lbGluZVxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICovXG5cdFx0dmFyIFNpbXBsZVRpbWVsaW5lID0gX2NsYXNzKFwiY29yZS5TaW1wbGVUaW1lbGluZVwiLCBmdW5jdGlvbih2YXJzKSB7XG5cdFx0XHRBbmltYXRpb24uY2FsbCh0aGlzLCAwLCB2YXJzKTtcblx0XHRcdHRoaXMuYXV0b1JlbW92ZUNoaWxkcmVuID0gdGhpcy5zbW9vdGhDaGlsZFRpbWluZyA9IHRydWU7XG5cdFx0fSk7XG5cblx0XHRwID0gU2ltcGxlVGltZWxpbmUucHJvdG90eXBlID0gbmV3IEFuaW1hdGlvbigpO1xuXHRcdHAuY29uc3RydWN0b3IgPSBTaW1wbGVUaW1lbGluZTtcblx0XHRwLmtpbGwoKS5fZ2MgPSBmYWxzZTtcblx0XHRwLl9maXJzdCA9IHAuX2xhc3QgPSBwLl9yZWNlbnQgPSBudWxsO1xuXHRcdHAuX3NvcnRDaGlsZHJlbiA9IGZhbHNlO1xuXG5cdFx0cC5hZGQgPSBwLmluc2VydCA9IGZ1bmN0aW9uKGNoaWxkLCBwb3NpdGlvbiwgYWxpZ24sIHN0YWdnZXIpIHtcblx0XHRcdHZhciBwcmV2VHdlZW4sIHN0O1xuXHRcdFx0Y2hpbGQuX3N0YXJ0VGltZSA9IE51bWJlcihwb3NpdGlvbiB8fCAwKSArIGNoaWxkLl9kZWxheTtcblx0XHRcdGlmIChjaGlsZC5fcGF1c2VkKSBpZiAodGhpcyAhPT0gY2hpbGQuX3RpbWVsaW5lKSB7IC8vd2Ugb25seSBhZGp1c3QgdGhlIF9wYXVzZVRpbWUgaWYgaXQgd2Fzbid0IGluIHRoaXMgdGltZWxpbmUgYWxyZWFkeS4gUmVtZW1iZXIsIHNvbWV0aW1lcyBhIHR3ZWVuIHdpbGwgYmUgaW5zZXJ0ZWQgYWdhaW4gaW50byB0aGUgc2FtZSB0aW1lbGluZSB3aGVuIGl0cyBzdGFydFRpbWUgaXMgY2hhbmdlZCBzbyB0aGF0IHRoZSB0d2VlbnMgaW4gdGhlIFRpbWVsaW5lTGl0ZS9NYXggYXJlIHJlLW9yZGVyZWQgcHJvcGVybHkgaW4gdGhlIGxpbmtlZCBsaXN0IChzbyBldmVyeXRoaW5nIHJlbmRlcnMgaW4gdGhlIHByb3BlciBvcmRlcikuXG5cdFx0XHRcdGNoaWxkLl9wYXVzZVRpbWUgPSBjaGlsZC5fc3RhcnRUaW1lICsgKCh0aGlzLnJhd1RpbWUoKSAtIGNoaWxkLl9zdGFydFRpbWUpIC8gY2hpbGQuX3RpbWVTY2FsZSk7XG5cdFx0XHR9XG5cdFx0XHRpZiAoY2hpbGQudGltZWxpbmUpIHtcblx0XHRcdFx0Y2hpbGQudGltZWxpbmUuX3JlbW92ZShjaGlsZCwgdHJ1ZSk7IC8vcmVtb3ZlcyBmcm9tIGV4aXN0aW5nIHRpbWVsaW5lIHNvIHRoYXQgaXQgY2FuIGJlIHByb3Blcmx5IGFkZGVkIHRvIHRoaXMgb25lLlxuXHRcdFx0fVxuXHRcdFx0Y2hpbGQudGltZWxpbmUgPSBjaGlsZC5fdGltZWxpbmUgPSB0aGlzO1xuXHRcdFx0aWYgKGNoaWxkLl9nYykge1xuXHRcdFx0XHRjaGlsZC5fZW5hYmxlZCh0cnVlLCB0cnVlKTtcblx0XHRcdH1cblx0XHRcdHByZXZUd2VlbiA9IHRoaXMuX2xhc3Q7XG5cdFx0XHRpZiAodGhpcy5fc29ydENoaWxkcmVuKSB7XG5cdFx0XHRcdHN0ID0gY2hpbGQuX3N0YXJ0VGltZTtcblx0XHRcdFx0d2hpbGUgKHByZXZUd2VlbiAmJiBwcmV2VHdlZW4uX3N0YXJ0VGltZSA+IHN0KSB7XG5cdFx0XHRcdFx0cHJldlR3ZWVuID0gcHJldlR3ZWVuLl9wcmV2O1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRpZiAocHJldlR3ZWVuKSB7XG5cdFx0XHRcdGNoaWxkLl9uZXh0ID0gcHJldlR3ZWVuLl9uZXh0O1xuXHRcdFx0XHRwcmV2VHdlZW4uX25leHQgPSBjaGlsZDtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGNoaWxkLl9uZXh0ID0gdGhpcy5fZmlyc3Q7XG5cdFx0XHRcdHRoaXMuX2ZpcnN0ID0gY2hpbGQ7XG5cdFx0XHR9XG5cdFx0XHRpZiAoY2hpbGQuX25leHQpIHtcblx0XHRcdFx0Y2hpbGQuX25leHQuX3ByZXYgPSBjaGlsZDtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHRoaXMuX2xhc3QgPSBjaGlsZDtcblx0XHRcdH1cblx0XHRcdGNoaWxkLl9wcmV2ID0gcHJldlR3ZWVuO1xuXHRcdFx0dGhpcy5fcmVjZW50ID0gY2hpbGQ7XG5cdFx0XHRpZiAodGhpcy5fdGltZWxpbmUpIHtcblx0XHRcdFx0dGhpcy5fdW5jYWNoZSh0cnVlKTtcblx0XHRcdH1cblx0XHRcdHJldHVybiB0aGlzO1xuXHRcdH07XG5cblx0XHRwLl9yZW1vdmUgPSBmdW5jdGlvbih0d2Vlbiwgc2tpcERpc2FibGUpIHtcblx0XHRcdGlmICh0d2Vlbi50aW1lbGluZSA9PT0gdGhpcykge1xuXHRcdFx0XHRpZiAoIXNraXBEaXNhYmxlKSB7XG5cdFx0XHRcdFx0dHdlZW4uX2VuYWJsZWQoZmFsc2UsIHRydWUpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKHR3ZWVuLl9wcmV2KSB7XG5cdFx0XHRcdFx0dHdlZW4uX3ByZXYuX25leHQgPSB0d2Vlbi5fbmV4dDtcblx0XHRcdFx0fSBlbHNlIGlmICh0aGlzLl9maXJzdCA9PT0gdHdlZW4pIHtcblx0XHRcdFx0XHR0aGlzLl9maXJzdCA9IHR3ZWVuLl9uZXh0O1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmICh0d2Vlbi5fbmV4dCkge1xuXHRcdFx0XHRcdHR3ZWVuLl9uZXh0Ll9wcmV2ID0gdHdlZW4uX3ByZXY7XG5cdFx0XHRcdH0gZWxzZSBpZiAodGhpcy5fbGFzdCA9PT0gdHdlZW4pIHtcblx0XHRcdFx0XHR0aGlzLl9sYXN0ID0gdHdlZW4uX3ByZXY7XG5cdFx0XHRcdH1cblx0XHRcdFx0dHdlZW4uX25leHQgPSB0d2Vlbi5fcHJldiA9IHR3ZWVuLnRpbWVsaW5lID0gbnVsbDtcblx0XHRcdFx0aWYgKHR3ZWVuID09PSB0aGlzLl9yZWNlbnQpIHtcblx0XHRcdFx0XHR0aGlzLl9yZWNlbnQgPSB0aGlzLl9sYXN0O1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKHRoaXMuX3RpbWVsaW5lKSB7XG5cdFx0XHRcdFx0dGhpcy5fdW5jYWNoZSh0cnVlKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0fTtcblxuXHRcdHAucmVuZGVyID0gZnVuY3Rpb24odGltZSwgc3VwcHJlc3NFdmVudHMsIGZvcmNlKSB7XG5cdFx0XHR2YXIgdHdlZW4gPSB0aGlzLl9maXJzdCxcblx0XHRcdFx0bmV4dDtcblx0XHRcdHRoaXMuX3RvdGFsVGltZSA9IHRoaXMuX3RpbWUgPSB0aGlzLl9yYXdQcmV2VGltZSA9IHRpbWU7XG5cdFx0XHR3aGlsZSAodHdlZW4pIHtcblx0XHRcdFx0bmV4dCA9IHR3ZWVuLl9uZXh0OyAvL3JlY29yZCBpdCBoZXJlIGJlY2F1c2UgdGhlIHZhbHVlIGNvdWxkIGNoYW5nZSBhZnRlciByZW5kZXJpbmcuLi5cblx0XHRcdFx0aWYgKHR3ZWVuLl9hY3RpdmUgfHwgKHRpbWUgPj0gdHdlZW4uX3N0YXJ0VGltZSAmJiAhdHdlZW4uX3BhdXNlZCAmJiAhdHdlZW4uX2djKSkge1xuXHRcdFx0XHRcdGlmICghdHdlZW4uX3JldmVyc2VkKSB7XG5cdFx0XHRcdFx0XHR0d2Vlbi5yZW5kZXIoKHRpbWUgLSB0d2Vlbi5fc3RhcnRUaW1lKSAqIHR3ZWVuLl90aW1lU2NhbGUsIHN1cHByZXNzRXZlbnRzLCBmb3JjZSk7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdHR3ZWVuLnJlbmRlcigoKCF0d2Vlbi5fZGlydHkpID8gdHdlZW4uX3RvdGFsRHVyYXRpb24gOiB0d2Vlbi50b3RhbER1cmF0aW9uKCkpIC0gKCh0aW1lIC0gdHdlZW4uX3N0YXJ0VGltZSkgKiB0d2Vlbi5fdGltZVNjYWxlKSwgc3VwcHJlc3NFdmVudHMsIGZvcmNlKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0dHdlZW4gPSBuZXh0O1xuXHRcdFx0fVxuXHRcdH07XG5cblx0XHRwLnJhd1RpbWUgPSBmdW5jdGlvbigpIHtcblx0XHRcdGlmICghX3RpY2tlckFjdGl2ZSkge1xuXHRcdFx0XHRfdGlja2VyLndha2UoKTtcblx0XHRcdH1cblx0XHRcdHJldHVybiB0aGlzLl90b3RhbFRpbWU7XG5cdFx0fTtcblxuLypcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIFR3ZWVuTGl0ZVxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICovXG5cdFx0dmFyIFR3ZWVuTGl0ZSA9IF9jbGFzcyhcIlR3ZWVuTGl0ZVwiLCBmdW5jdGlvbih0YXJnZXQsIGR1cmF0aW9uLCB2YXJzKSB7XG5cdFx0XHRcdEFuaW1hdGlvbi5jYWxsKHRoaXMsIGR1cmF0aW9uLCB2YXJzKTtcblx0XHRcdFx0dGhpcy5yZW5kZXIgPSBUd2VlbkxpdGUucHJvdG90eXBlLnJlbmRlcjsgLy9zcGVlZCBvcHRpbWl6YXRpb24gKGF2b2lkIHByb3RvdHlwZSBsb29rdXAgb24gdGhpcyBcImhvdFwiIG1ldGhvZClcblxuXHRcdFx0XHRpZiAodGFyZ2V0ID09IG51bGwpIHtcblx0XHRcdFx0XHR0aHJvdyBcIkNhbm5vdCB0d2VlbiBhIG51bGwgdGFyZ2V0LlwiO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0dGhpcy50YXJnZXQgPSB0YXJnZXQgPSAodHlwZW9mKHRhcmdldCkgIT09IFwic3RyaW5nXCIpID8gdGFyZ2V0IDogVHdlZW5MaXRlLnNlbGVjdG9yKHRhcmdldCkgfHwgdGFyZ2V0O1xuXG5cdFx0XHRcdHZhciBpc1NlbGVjdG9yID0gKHRhcmdldC5qcXVlcnkgfHwgKHRhcmdldC5sZW5ndGggJiYgdGFyZ2V0ICE9PSB3aW5kb3cgJiYgdGFyZ2V0WzBdICYmICh0YXJnZXRbMF0gPT09IHdpbmRvdyB8fCAodGFyZ2V0WzBdLm5vZGVUeXBlICYmIHRhcmdldFswXS5zdHlsZSAmJiAhdGFyZ2V0Lm5vZGVUeXBlKSkpKSxcblx0XHRcdFx0XHRvdmVyd3JpdGUgPSB0aGlzLnZhcnMub3ZlcndyaXRlLFxuXHRcdFx0XHRcdGksIHRhcmcsIHRhcmdldHM7XG5cblx0XHRcdFx0dGhpcy5fb3ZlcndyaXRlID0gb3ZlcndyaXRlID0gKG92ZXJ3cml0ZSA9PSBudWxsKSA/IF9vdmVyd3JpdGVMb29rdXBbVHdlZW5MaXRlLmRlZmF1bHRPdmVyd3JpdGVdIDogKHR5cGVvZihvdmVyd3JpdGUpID09PSBcIm51bWJlclwiKSA/IG92ZXJ3cml0ZSA+PiAwIDogX292ZXJ3cml0ZUxvb2t1cFtvdmVyd3JpdGVdO1xuXG5cdFx0XHRcdGlmICgoaXNTZWxlY3RvciB8fCB0YXJnZXQgaW5zdGFuY2VvZiBBcnJheSB8fCAodGFyZ2V0LnB1c2ggJiYgX2lzQXJyYXkodGFyZ2V0KSkpICYmIHR5cGVvZih0YXJnZXRbMF0pICE9PSBcIm51bWJlclwiKSB7XG5cdFx0XHRcdFx0dGhpcy5fdGFyZ2V0cyA9IHRhcmdldHMgPSBfc2xpY2UodGFyZ2V0KTsgIC8vZG9uJ3QgdXNlIEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKHRhcmdldCwgMCkgYmVjYXVzZSB0aGF0IGRvZXNuJ3Qgd29yayBpbiBJRTggd2l0aCBhIE5vZGVMaXN0IHRoYXQncyByZXR1cm5lZCBieSBxdWVyeVNlbGVjdG9yQWxsKClcblx0XHRcdFx0XHR0aGlzLl9wcm9wTG9va3VwID0gW107XG5cdFx0XHRcdFx0dGhpcy5fc2libGluZ3MgPSBbXTtcblx0XHRcdFx0XHRmb3IgKGkgPSAwOyBpIDwgdGFyZ2V0cy5sZW5ndGg7IGkrKykge1xuXHRcdFx0XHRcdFx0dGFyZyA9IHRhcmdldHNbaV07XG5cdFx0XHRcdFx0XHRpZiAoIXRhcmcpIHtcblx0XHRcdFx0XHRcdFx0dGFyZ2V0cy5zcGxpY2UoaS0tLCAxKTtcblx0XHRcdFx0XHRcdFx0Y29udGludWU7XG5cdFx0XHRcdFx0XHR9IGVsc2UgaWYgKHR5cGVvZih0YXJnKSA9PT0gXCJzdHJpbmdcIikge1xuXHRcdFx0XHRcdFx0XHR0YXJnID0gdGFyZ2V0c1tpLS1dID0gVHdlZW5MaXRlLnNlbGVjdG9yKHRhcmcpOyAvL2luIGNhc2UgaXQncyBhbiBhcnJheSBvZiBzdHJpbmdzXG5cdFx0XHRcdFx0XHRcdGlmICh0eXBlb2YodGFyZykgPT09IFwic3RyaW5nXCIpIHtcblx0XHRcdFx0XHRcdFx0XHR0YXJnZXRzLnNwbGljZShpKzEsIDEpOyAvL3RvIGF2b2lkIGFuIGVuZGxlc3MgbG9vcCAoY2FuJ3QgaW1hZ2luZSB3aHkgdGhlIHNlbGVjdG9yIHdvdWxkIHJldHVybiBhIHN0cmluZywgYnV0IGp1c3QgaW4gY2FzZSlcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRjb250aW51ZTtcblx0XHRcdFx0XHRcdH0gZWxzZSBpZiAodGFyZy5sZW5ndGggJiYgdGFyZyAhPT0gd2luZG93ICYmIHRhcmdbMF0gJiYgKHRhcmdbMF0gPT09IHdpbmRvdyB8fCAodGFyZ1swXS5ub2RlVHlwZSAmJiB0YXJnWzBdLnN0eWxlICYmICF0YXJnLm5vZGVUeXBlKSkpIHsgLy9pbiBjYXNlIHRoZSB1c2VyIGlzIHBhc3NpbmcgaW4gYW4gYXJyYXkgb2Ygc2VsZWN0b3Igb2JqZWN0cyAobGlrZSBqUXVlcnkgb2JqZWN0cyksIHdlIG5lZWQgdG8gY2hlY2sgb25lIG1vcmUgbGV2ZWwgYW5kIHB1bGwgdGhpbmdzIG91dCBpZiBuZWNlc3NhcnkuIEFsc28gbm90ZSB0aGF0IDxzZWxlY3Q+IGVsZW1lbnRzIHBhc3MgYWxsIHRoZSBjcml0ZXJpYSByZWdhcmRpbmcgbGVuZ3RoIGFuZCB0aGUgZmlyc3QgY2hpbGQgaGF2aW5nIHN0eWxlLCBzbyB3ZSBtdXN0IGFsc28gY2hlY2sgdG8gZW5zdXJlIHRoZSB0YXJnZXQgaXNuJ3QgYW4gSFRNTCBub2RlIGl0c2VsZi5cblx0XHRcdFx0XHRcdFx0dGFyZ2V0cy5zcGxpY2UoaS0tLCAxKTtcblx0XHRcdFx0XHRcdFx0dGhpcy5fdGFyZ2V0cyA9IHRhcmdldHMgPSB0YXJnZXRzLmNvbmNhdChfc2xpY2UodGFyZykpO1xuXHRcdFx0XHRcdFx0XHRjb250aW51ZTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdHRoaXMuX3NpYmxpbmdzW2ldID0gX3JlZ2lzdGVyKHRhcmcsIHRoaXMsIGZhbHNlKTtcblx0XHRcdFx0XHRcdGlmIChvdmVyd3JpdGUgPT09IDEpIGlmICh0aGlzLl9zaWJsaW5nc1tpXS5sZW5ndGggPiAxKSB7XG5cdFx0XHRcdFx0XHRcdF9hcHBseU92ZXJ3cml0ZSh0YXJnLCB0aGlzLCBudWxsLCAxLCB0aGlzLl9zaWJsaW5nc1tpXSk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0dGhpcy5fcHJvcExvb2t1cCA9IHt9O1xuXHRcdFx0XHRcdHRoaXMuX3NpYmxpbmdzID0gX3JlZ2lzdGVyKHRhcmdldCwgdGhpcywgZmFsc2UpO1xuXHRcdFx0XHRcdGlmIChvdmVyd3JpdGUgPT09IDEpIGlmICh0aGlzLl9zaWJsaW5ncy5sZW5ndGggPiAxKSB7XG5cdFx0XHRcdFx0XHRfYXBwbHlPdmVyd3JpdGUodGFyZ2V0LCB0aGlzLCBudWxsLCAxLCB0aGlzLl9zaWJsaW5ncyk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdGlmICh0aGlzLnZhcnMuaW1tZWRpYXRlUmVuZGVyIHx8IChkdXJhdGlvbiA9PT0gMCAmJiB0aGlzLl9kZWxheSA9PT0gMCAmJiB0aGlzLnZhcnMuaW1tZWRpYXRlUmVuZGVyICE9PSBmYWxzZSkpIHtcblx0XHRcdFx0XHR0aGlzLl90aW1lID0gLV90aW55TnVtOyAvL2ZvcmNlcyBhIHJlbmRlciB3aXRob3V0IGhhdmluZyB0byBzZXQgdGhlIHJlbmRlcigpIFwiZm9yY2VcIiBwYXJhbWV0ZXIgdG8gdHJ1ZSBiZWNhdXNlIHdlIHdhbnQgdG8gYWxsb3cgbGF6eWluZyBieSBkZWZhdWx0ICh1c2luZyB0aGUgXCJmb3JjZVwiIHBhcmFtZXRlciBhbHdheXMgZm9yY2VzIGFuIGltbWVkaWF0ZSBmdWxsIHJlbmRlcilcblx0XHRcdFx0XHR0aGlzLnJlbmRlcihNYXRoLm1pbigwLCAtdGhpcy5fZGVsYXkpKTsgLy9pbiBjYXNlIGRlbGF5IGlzIG5lZ2F0aXZlXG5cdFx0XHRcdH1cblx0XHRcdH0sIHRydWUpLFxuXHRcdFx0X2lzU2VsZWN0b3IgPSBmdW5jdGlvbih2KSB7XG5cdFx0XHRcdHJldHVybiAodiAmJiB2Lmxlbmd0aCAmJiB2ICE9PSB3aW5kb3cgJiYgdlswXSAmJiAodlswXSA9PT0gd2luZG93IHx8ICh2WzBdLm5vZGVUeXBlICYmIHZbMF0uc3R5bGUgJiYgIXYubm9kZVR5cGUpKSk7IC8vd2UgY2Fubm90IGNoZWNrIFwibm9kZVR5cGVcIiBpZiB0aGUgdGFyZ2V0IGlzIHdpbmRvdyBmcm9tIHdpdGhpbiBhbiBpZnJhbWUsIG90aGVyd2lzZSBpdCB3aWxsIHRyaWdnZXIgYSBzZWN1cml0eSBlcnJvciBpbiBzb21lIGJyb3dzZXJzIGxpa2UgRmlyZWZveC5cblx0XHRcdH0sXG5cdFx0XHRfYXV0b0NTUyA9IGZ1bmN0aW9uKHZhcnMsIHRhcmdldCkge1xuXHRcdFx0XHR2YXIgY3NzID0ge30sXG5cdFx0XHRcdFx0cDtcblx0XHRcdFx0Zm9yIChwIGluIHZhcnMpIHtcblx0XHRcdFx0XHRpZiAoIV9yZXNlcnZlZFByb3BzW3BdICYmICghKHAgaW4gdGFyZ2V0KSB8fCBwID09PSBcInRyYW5zZm9ybVwiIHx8IHAgPT09IFwieFwiIHx8IHAgPT09IFwieVwiIHx8IHAgPT09IFwid2lkdGhcIiB8fCBwID09PSBcImhlaWdodFwiIHx8IHAgPT09IFwiY2xhc3NOYW1lXCIgfHwgcCA9PT0gXCJib3JkZXJcIikgJiYgKCFfcGx1Z2luc1twXSB8fCAoX3BsdWdpbnNbcF0gJiYgX3BsdWdpbnNbcF0uX2F1dG9DU1MpKSkgeyAvL25vdGU6IDxpbWc+IGVsZW1lbnRzIGNvbnRhaW4gcmVhZC1vbmx5IFwieFwiIGFuZCBcInlcIiBwcm9wZXJ0aWVzLiBXZSBzaG91bGQgYWxzbyBwcmlvcml0aXplIGVkaXRpbmcgY3NzIHdpZHRoL2hlaWdodCByYXRoZXIgdGhhbiB0aGUgZWxlbWVudCdzIHByb3BlcnRpZXMuXG5cdFx0XHRcdFx0XHRjc3NbcF0gPSB2YXJzW3BdO1xuXHRcdFx0XHRcdFx0ZGVsZXRlIHZhcnNbcF07XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdHZhcnMuY3NzID0gY3NzO1xuXHRcdFx0fTtcblxuXHRcdHAgPSBUd2VlbkxpdGUucHJvdG90eXBlID0gbmV3IEFuaW1hdGlvbigpO1xuXHRcdHAuY29uc3RydWN0b3IgPSBUd2VlbkxpdGU7XG5cdFx0cC5raWxsKCkuX2djID0gZmFsc2U7XG5cbi8vLS0tLVR3ZWVuTGl0ZSBkZWZhdWx0cywgb3ZlcndyaXRlIG1hbmFnZW1lbnQsIGFuZCByb290IHVwZGF0ZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5cdFx0cC5yYXRpbyA9IDA7XG5cdFx0cC5fZmlyc3RQVCA9IHAuX3RhcmdldHMgPSBwLl9vdmVyd3JpdHRlblByb3BzID0gcC5fc3RhcnRBdCA9IG51bGw7XG5cdFx0cC5fbm90aWZ5UGx1Z2luc09mRW5hYmxlZCA9IHAuX2xhenkgPSBmYWxzZTtcblxuXHRcdFR3ZWVuTGl0ZS52ZXJzaW9uID0gXCIxLjIwLjRcIjtcblx0XHRUd2VlbkxpdGUuZGVmYXVsdEVhc2UgPSBwLl9lYXNlID0gbmV3IEVhc2UobnVsbCwgbnVsbCwgMSwgMSk7XG5cdFx0VHdlZW5MaXRlLmRlZmF1bHRPdmVyd3JpdGUgPSBcImF1dG9cIjtcblx0XHRUd2VlbkxpdGUudGlja2VyID0gX3RpY2tlcjtcblx0XHRUd2VlbkxpdGUuYXV0b1NsZWVwID0gMTIwO1xuXHRcdFR3ZWVuTGl0ZS5sYWdTbW9vdGhpbmcgPSBmdW5jdGlvbih0aHJlc2hvbGQsIGFkanVzdGVkTGFnKSB7XG5cdFx0XHRfdGlja2VyLmxhZ1Ntb290aGluZyh0aHJlc2hvbGQsIGFkanVzdGVkTGFnKTtcblx0XHR9O1xuXG5cdFx0VHdlZW5MaXRlLnNlbGVjdG9yID0gd2luZG93LiQgfHwgd2luZG93LmpRdWVyeSB8fCBmdW5jdGlvbihlKSB7XG5cdFx0XHR2YXIgc2VsZWN0b3IgPSB3aW5kb3cuJCB8fCB3aW5kb3cualF1ZXJ5O1xuXHRcdFx0aWYgKHNlbGVjdG9yKSB7XG5cdFx0XHRcdFR3ZWVuTGl0ZS5zZWxlY3RvciA9IHNlbGVjdG9yO1xuXHRcdFx0XHRyZXR1cm4gc2VsZWN0b3IoZSk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gKHR5cGVvZihfZG9jKSA9PT0gXCJ1bmRlZmluZWRcIikgPyBlIDogKF9kb2MucXVlcnlTZWxlY3RvckFsbCA/IF9kb2MucXVlcnlTZWxlY3RvckFsbChlKSA6IF9kb2MuZ2V0RWxlbWVudEJ5SWQoKGUuY2hhckF0KDApID09PSBcIiNcIikgPyBlLnN1YnN0cigxKSA6IGUpKTtcblx0XHR9O1xuXG5cdFx0dmFyIF9sYXp5VHdlZW5zID0gW10sXG5cdFx0XHRfbGF6eUxvb2t1cCA9IHt9LFxuXHRcdFx0X251bWJlcnNFeHAgPSAvKD86KC18LT18XFwrPSk/XFxkKlxcLj9cXGQqKD86ZVtcXC0rXT9cXGQrKT8pWzAtOV0vaWcsXG5cdFx0XHRfcmVsRXhwID0gL1tcXCstXT0tP1tcXC5cXGRdLyxcblx0XHRcdC8vX25vbk51bWJlcnNFeHAgPSAvKD86KFtcXC0rXSg/IShcXGR8PSkpKXxbXlxcZFxcLSs9ZV18KGUoPyFbXFwtK11bXFxkXSkpKSsvaWcsXG5cdFx0XHRfc2V0UmF0aW8gPSBmdW5jdGlvbih2KSB7XG5cdFx0XHRcdHZhciBwdCA9IHRoaXMuX2ZpcnN0UFQsXG5cdFx0XHRcdFx0bWluID0gMC4wMDAwMDEsXG5cdFx0XHRcdFx0dmFsO1xuXHRcdFx0XHR3aGlsZSAocHQpIHtcblx0XHRcdFx0XHR2YWwgPSAhcHQuYmxvYiA/IHB0LmMgKiB2ICsgcHQucyA6ICh2ID09PSAxICYmIHRoaXMuZW5kICE9IG51bGwpID8gdGhpcy5lbmQgOiB2ID8gdGhpcy5qb2luKFwiXCIpIDogdGhpcy5zdGFydDtcblx0XHRcdFx0XHRpZiAocHQubSkge1xuXHRcdFx0XHRcdFx0dmFsID0gcHQubSh2YWwsIHRoaXMuX3RhcmdldCB8fCBwdC50KTtcblx0XHRcdFx0XHR9IGVsc2UgaWYgKHZhbCA8IG1pbikgaWYgKHZhbCA+IC1taW4gJiYgIXB0LmJsb2IpIHsgLy9wcmV2ZW50cyBpc3N1ZXMgd2l0aCBjb252ZXJ0aW5nIHZlcnkgc21hbGwgbnVtYmVycyB0byBzdHJpbmdzIGluIHRoZSBicm93c2VyXG5cdFx0XHRcdFx0XHR2YWwgPSAwO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRpZiAoIXB0LmYpIHtcblx0XHRcdFx0XHRcdHB0LnRbcHQucF0gPSB2YWw7XG5cdFx0XHRcdFx0fSBlbHNlIGlmIChwdC5mcCkge1xuXHRcdFx0XHRcdFx0cHQudFtwdC5wXShwdC5mcCwgdmFsKTtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0cHQudFtwdC5wXSh2YWwpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRwdCA9IHB0Ll9uZXh0O1xuXHRcdFx0XHR9XG5cdFx0XHR9LFxuXHRcdFx0Ly9jb21wYXJlcyB0d28gc3RyaW5ncyAoc3RhcnQvZW5kKSwgZmluZHMgdGhlIG51bWJlcnMgdGhhdCBhcmUgZGlmZmVyZW50IGFuZCBzcGl0cyBiYWNrIGFuIGFycmF5IHJlcHJlc2VudGluZyB0aGUgd2hvbGUgdmFsdWUgYnV0IHdpdGggdGhlIGNoYW5naW5nIHZhbHVlcyBpc29sYXRlZCBhcyBlbGVtZW50cy4gRm9yIGV4YW1wbGUsIFwicmdiKDAsMCwwKVwiIGFuZCBcInJnYigxMDAsNTAsMClcIiB3b3VsZCBiZWNvbWUgW1wicmdiKFwiLCAwLCBcIixcIiwgNTAsIFwiLDApXCJdLiBOb3RpY2UgaXQgbWVyZ2VzIHRoZSBwYXJ0cyB0aGF0IGFyZSBpZGVudGljYWwgKHBlcmZvcm1hbmNlIG9wdGltaXphdGlvbikuIFRoZSBhcnJheSBhbHNvIGhhcyBhIGxpbmtlZCBsaXN0IG9mIFByb3BUd2VlbnMgYXR0YWNoZWQgc3RhcnRpbmcgd2l0aCBfZmlyc3RQVCB0aGF0IGNvbnRhaW4gdGhlIHR3ZWVuaW5nIGRhdGEgKHQsIHAsIHMsIGMsIGYsIGV0Yy4pLiBJdCBhbHNvIHN0b3JlcyB0aGUgc3RhcnRpbmcgdmFsdWUgYXMgYSBcInN0YXJ0XCIgcHJvcGVydHkgc28gdGhhdCB3ZSBjYW4gcmV2ZXJ0IHRvIGl0IGlmL3doZW4gbmVjZXNzYXJ5LCBsaWtlIHdoZW4gYSB0d2VlbiByZXdpbmRzIGZ1bGx5LiBJZiB0aGUgcXVhbnRpdHkgb2YgbnVtYmVycyBkaWZmZXJzIGJldHdlZW4gdGhlIHN0YXJ0IGFuZCBlbmQsIGl0IHdpbGwgYWx3YXlzIHByaW9yaXRpemUgdGhlIGVuZCB2YWx1ZShzKS4gVGhlIHB0IHBhcmFtZXRlciBpcyBvcHRpb25hbCAtIGl0J3MgZm9yIGEgUHJvcFR3ZWVuIHRoYXQgd2lsbCBiZSBhcHBlbmRlZCB0byB0aGUgZW5kIG9mIHRoZSBsaW5rZWQgbGlzdCBhbmQgaXMgdHlwaWNhbGx5IGZvciBhY3R1YWxseSBzZXR0aW5nIHRoZSB2YWx1ZSBhZnRlciBhbGwgb2YgdGhlIGVsZW1lbnRzIGhhdmUgYmVlbiB1cGRhdGVkICh3aXRoIGFycmF5LmpvaW4oXCJcIikpLlxuXHRcdFx0X2Jsb2JEaWYgPSBmdW5jdGlvbihzdGFydCwgZW5kLCBmaWx0ZXIsIHB0KSB7XG5cdFx0XHRcdHZhciBhID0gW10sXG5cdFx0XHRcdFx0Y2hhckluZGV4ID0gMCxcblx0XHRcdFx0XHRzID0gXCJcIixcblx0XHRcdFx0XHRjb2xvciA9IDAsXG5cdFx0XHRcdFx0c3RhcnROdW1zLCBlbmROdW1zLCBudW0sIGksIGwsIG5vbk51bWJlcnMsIGN1cnJlbnROdW07XG5cdFx0XHRcdGEuc3RhcnQgPSBzdGFydDtcblx0XHRcdFx0YS5lbmQgPSBlbmQ7XG5cdFx0XHRcdHN0YXJ0ID0gYVswXSA9IHN0YXJ0ICsgXCJcIjsgLy9lbnN1cmUgdmFsdWVzIGFyZSBzdHJpbmdzXG5cdFx0XHRcdGVuZCA9IGFbMV0gPSBlbmQgKyBcIlwiO1xuXHRcdFx0XHRpZiAoZmlsdGVyKSB7XG5cdFx0XHRcdFx0ZmlsdGVyKGEpOyAvL3Bhc3MgYW4gYXJyYXkgd2l0aCB0aGUgc3RhcnRpbmcgYW5kIGVuZGluZyB2YWx1ZXMgYW5kIGxldCB0aGUgZmlsdGVyIGRvIHdoYXRldmVyIGl0IG5lZWRzIHRvIHRoZSB2YWx1ZXMuXG5cdFx0XHRcdFx0c3RhcnQgPSBhWzBdO1xuXHRcdFx0XHRcdGVuZCA9IGFbMV07XG5cdFx0XHRcdH1cblx0XHRcdFx0YS5sZW5ndGggPSAwO1xuXHRcdFx0XHRzdGFydE51bXMgPSBzdGFydC5tYXRjaChfbnVtYmVyc0V4cCkgfHwgW107XG5cdFx0XHRcdGVuZE51bXMgPSBlbmQubWF0Y2goX251bWJlcnNFeHApIHx8IFtdO1xuXHRcdFx0XHRpZiAocHQpIHtcblx0XHRcdFx0XHRwdC5fbmV4dCA9IG51bGw7XG5cdFx0XHRcdFx0cHQuYmxvYiA9IDE7XG5cdFx0XHRcdFx0YS5fZmlyc3RQVCA9IGEuX2FwcGx5UFQgPSBwdDsgLy9hcHBseSBsYXN0IGluIHRoZSBsaW5rZWQgbGlzdCAod2hpY2ggbWVhbnMgaW5zZXJ0aW5nIGl0IGZpcnN0KVxuXHRcdFx0XHR9XG5cdFx0XHRcdGwgPSBlbmROdW1zLmxlbmd0aDtcblx0XHRcdFx0Zm9yIChpID0gMDsgaSA8IGw7IGkrKykge1xuXHRcdFx0XHRcdGN1cnJlbnROdW0gPSBlbmROdW1zW2ldO1xuXHRcdFx0XHRcdG5vbk51bWJlcnMgPSBlbmQuc3Vic3RyKGNoYXJJbmRleCwgZW5kLmluZGV4T2YoY3VycmVudE51bSwgY2hhckluZGV4KS1jaGFySW5kZXgpO1xuXHRcdFx0XHRcdHMgKz0gKG5vbk51bWJlcnMgfHwgIWkpID8gbm9uTnVtYmVycyA6IFwiLFwiOyAvL25vdGU6IFNWRyBzcGVjIGFsbG93cyBvbWlzc2lvbiBvZiBjb21tYS9zcGFjZSB3aGVuIGEgbmVnYXRpdmUgc2lnbiBpcyB3ZWRnZWQgYmV0d2VlbiB0d28gbnVtYmVycywgbGlrZSAyLjUtNS4zIGluc3RlYWQgb2YgMi41LC01LjMgYnV0IHdoZW4gdHdlZW5pbmcsIHRoZSBuZWdhdGl2ZSB2YWx1ZSBtYXkgc3dpdGNoIHRvIHBvc2l0aXZlLCBzbyB3ZSBpbnNlcnQgdGhlIGNvbW1hIGp1c3QgaW4gY2FzZS5cblx0XHRcdFx0XHRjaGFySW5kZXggKz0gbm9uTnVtYmVycy5sZW5ndGg7XG5cdFx0XHRcdFx0aWYgKGNvbG9yKSB7IC8vc2Vuc2UgcmdiYSgpIHZhbHVlcyBhbmQgcm91bmQgdGhlbS5cblx0XHRcdFx0XHRcdGNvbG9yID0gKGNvbG9yICsgMSkgJSA1O1xuXHRcdFx0XHRcdH0gZWxzZSBpZiAobm9uTnVtYmVycy5zdWJzdHIoLTUpID09PSBcInJnYmEoXCIpIHtcblx0XHRcdFx0XHRcdGNvbG9yID0gMTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0aWYgKGN1cnJlbnROdW0gPT09IHN0YXJ0TnVtc1tpXSB8fCBzdGFydE51bXMubGVuZ3RoIDw9IGkpIHtcblx0XHRcdFx0XHRcdHMgKz0gY3VycmVudE51bTtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0aWYgKHMpIHtcblx0XHRcdFx0XHRcdFx0YS5wdXNoKHMpO1xuXHRcdFx0XHRcdFx0XHRzID0gXCJcIjtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdG51bSA9IHBhcnNlRmxvYXQoc3RhcnROdW1zW2ldKTtcblx0XHRcdFx0XHRcdGEucHVzaChudW0pO1xuXHRcdFx0XHRcdFx0YS5fZmlyc3RQVCA9IHtfbmV4dDogYS5fZmlyc3RQVCwgdDphLCBwOiBhLmxlbmd0aC0xLCBzOm51bSwgYzooKGN1cnJlbnROdW0uY2hhckF0KDEpID09PSBcIj1cIikgPyBwYXJzZUludChjdXJyZW50TnVtLmNoYXJBdCgwKSArIFwiMVwiLCAxMCkgKiBwYXJzZUZsb2F0KGN1cnJlbnROdW0uc3Vic3RyKDIpKSA6IChwYXJzZUZsb2F0KGN1cnJlbnROdW0pIC0gbnVtKSkgfHwgMCwgZjowLCBtOihjb2xvciAmJiBjb2xvciA8IDQpID8gTWF0aC5yb3VuZCA6IDB9O1xuXHRcdFx0XHRcdFx0Ly9ub3RlOiB3ZSBkb24ndCBzZXQgX3ByZXYgYmVjYXVzZSB3ZSdsbCBuZXZlciBuZWVkIHRvIHJlbW92ZSBpbmRpdmlkdWFsIFByb3BUd2VlbnMgZnJvbSB0aGlzIGxpc3QuXG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGNoYXJJbmRleCArPSBjdXJyZW50TnVtLmxlbmd0aDtcblx0XHRcdFx0fVxuXHRcdFx0XHRzICs9IGVuZC5zdWJzdHIoY2hhckluZGV4KTtcblx0XHRcdFx0aWYgKHMpIHtcblx0XHRcdFx0XHRhLnB1c2gocyk7XG5cdFx0XHRcdH1cblx0XHRcdFx0YS5zZXRSYXRpbyA9IF9zZXRSYXRpbztcblx0XHRcdFx0aWYgKF9yZWxFeHAudGVzdChlbmQpKSB7IC8vaWYgdGhlIGVuZCBzdHJpbmcgY29udGFpbnMgcmVsYXRpdmUgdmFsdWVzLCBkZWxldGUgaXQgc28gdGhhdCBvbiB0aGUgZmluYWwgcmVuZGVyIChpbiBfc2V0UmF0aW8oKSksIHdlIGRvbid0IGFjdHVhbGx5IHNldCBpdCB0byB0aGUgc3RyaW5nIHdpdGggKz0gb3IgLT0gY2hhcmFjdGVycyAoZm9yY2VzIGl0IHRvIHVzZSB0aGUgY2FsY3VsYXRlZCB2YWx1ZSkuXG5cdFx0XHRcdFx0YS5lbmQgPSBudWxsO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiBhO1xuXHRcdFx0fSxcblx0XHRcdC8vbm90ZTogXCJmdW5jUGFyYW1cIiBpcyBvbmx5IG5lY2Vzc2FyeSBmb3IgZnVuY3Rpb24tYmFzZWQgZ2V0dGVycy9zZXR0ZXJzIHRoYXQgcmVxdWlyZSBhbiBleHRyYSBwYXJhbWV0ZXIgbGlrZSBnZXRBdHRyaWJ1dGUoXCJ3aWR0aFwiKSBhbmQgc2V0QXR0cmlidXRlKFwid2lkdGhcIiwgdmFsdWUpLiBJbiB0aGlzIGV4YW1wbGUsIGZ1bmNQYXJhbSB3b3VsZCBiZSBcIndpZHRoXCIuIFVzZWQgYnkgQXR0clBsdWdpbiBmb3IgZXhhbXBsZS5cblx0XHRcdF9hZGRQcm9wVHdlZW4gPSBmdW5jdGlvbih0YXJnZXQsIHByb3AsIHN0YXJ0LCBlbmQsIG92ZXJ3cml0ZVByb3AsIG1vZCwgZnVuY1BhcmFtLCBzdHJpbmdGaWx0ZXIsIGluZGV4KSB7XG5cdFx0XHRcdGlmICh0eXBlb2YoZW5kKSA9PT0gXCJmdW5jdGlvblwiKSB7XG5cdFx0XHRcdFx0ZW5kID0gZW5kKGluZGV4IHx8IDAsIHRhcmdldCk7XG5cdFx0XHRcdH1cblx0XHRcdFx0dmFyIHR5cGUgPSB0eXBlb2YodGFyZ2V0W3Byb3BdKSxcblx0XHRcdFx0XHRnZXR0ZXJOYW1lID0gKHR5cGUgIT09IFwiZnVuY3Rpb25cIikgPyBcIlwiIDogKChwcm9wLmluZGV4T2YoXCJzZXRcIikgfHwgdHlwZW9mKHRhcmdldFtcImdldFwiICsgcHJvcC5zdWJzdHIoMyldKSAhPT0gXCJmdW5jdGlvblwiKSA/IHByb3AgOiBcImdldFwiICsgcHJvcC5zdWJzdHIoMykpLFxuXHRcdFx0XHRcdHMgPSAoc3RhcnQgIT09IFwiZ2V0XCIpID8gc3RhcnQgOiAhZ2V0dGVyTmFtZSA/IHRhcmdldFtwcm9wXSA6IGZ1bmNQYXJhbSA/IHRhcmdldFtnZXR0ZXJOYW1lXShmdW5jUGFyYW0pIDogdGFyZ2V0W2dldHRlck5hbWVdKCksXG5cdFx0XHRcdFx0aXNSZWxhdGl2ZSA9ICh0eXBlb2YoZW5kKSA9PT0gXCJzdHJpbmdcIiAmJiBlbmQuY2hhckF0KDEpID09PSBcIj1cIiksXG5cdFx0XHRcdFx0cHQgPSB7dDp0YXJnZXQsIHA6cHJvcCwgczpzLCBmOih0eXBlID09PSBcImZ1bmN0aW9uXCIpLCBwZzowLCBuOm92ZXJ3cml0ZVByb3AgfHwgcHJvcCwgbTooIW1vZCA/IDAgOiAodHlwZW9mKG1vZCkgPT09IFwiZnVuY3Rpb25cIikgPyBtb2QgOiBNYXRoLnJvdW5kKSwgcHI6MCwgYzppc1JlbGF0aXZlID8gcGFyc2VJbnQoZW5kLmNoYXJBdCgwKSArIFwiMVwiLCAxMCkgKiBwYXJzZUZsb2F0KGVuZC5zdWJzdHIoMikpIDogKHBhcnNlRmxvYXQoZW5kKSAtIHMpIHx8IDB9LFxuXHRcdFx0XHRcdGJsb2I7XG5cblx0XHRcdFx0aWYgKHR5cGVvZihzKSAhPT0gXCJudW1iZXJcIiB8fCAodHlwZW9mKGVuZCkgIT09IFwibnVtYmVyXCIgJiYgIWlzUmVsYXRpdmUpKSB7XG5cdFx0XHRcdFx0aWYgKGZ1bmNQYXJhbSB8fCBpc05hTihzKSB8fCAoIWlzUmVsYXRpdmUgJiYgaXNOYU4oZW5kKSkgfHwgdHlwZW9mKHMpID09PSBcImJvb2xlYW5cIiB8fCB0eXBlb2YoZW5kKSA9PT0gXCJib29sZWFuXCIpIHtcblx0XHRcdFx0XHRcdC8vYSBibG9iIChzdHJpbmcgdGhhdCBoYXMgbXVsdGlwbGUgbnVtYmVycyBpbiBpdClcblx0XHRcdFx0XHRcdHB0LmZwID0gZnVuY1BhcmFtO1xuXHRcdFx0XHRcdFx0YmxvYiA9IF9ibG9iRGlmKHMsIChpc1JlbGF0aXZlID8gKHBhcnNlRmxvYXQocHQucykgKyBwdC5jKSArIChwdC5zICsgXCJcIikucmVwbGFjZSgvWzAtOVxcLVxcLl0vZywgXCJcIikgOiBlbmQpLCBzdHJpbmdGaWx0ZXIgfHwgVHdlZW5MaXRlLmRlZmF1bHRTdHJpbmdGaWx0ZXIsIHB0KTtcblx0XHRcdFx0XHRcdHB0ID0ge3Q6IGJsb2IsIHA6IFwic2V0UmF0aW9cIiwgczogMCwgYzogMSwgZjogMiwgcGc6IDAsIG46IG92ZXJ3cml0ZVByb3AgfHwgcHJvcCwgcHI6IDAsIG06IDB9OyAvL1wiMlwiIGluZGljYXRlcyBpdCdzIGEgQmxvYiBwcm9wZXJ0eSB0d2Vlbi4gTmVlZGVkIGZvciBSb3VuZFByb3BzUGx1Z2luIGZvciBleGFtcGxlLlxuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRwdC5zID0gcGFyc2VGbG9hdChzKTtcblx0XHRcdFx0XHRcdGlmICghaXNSZWxhdGl2ZSkge1xuXHRcdFx0XHRcdFx0XHRwdC5jID0gKHBhcnNlRmxvYXQoZW5kKSAtIHB0LnMpIHx8IDA7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdGlmIChwdC5jKSB7IC8vb25seSBhZGQgaXQgdG8gdGhlIGxpbmtlZCBsaXN0IGlmIHRoZXJlJ3MgYSBjaGFuZ2UuXG5cdFx0XHRcdFx0aWYgKChwdC5fbmV4dCA9IHRoaXMuX2ZpcnN0UFQpKSB7XG5cdFx0XHRcdFx0XHRwdC5fbmV4dC5fcHJldiA9IHB0O1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHR0aGlzLl9maXJzdFBUID0gcHQ7XG5cdFx0XHRcdFx0cmV0dXJuIHB0O1xuXHRcdFx0XHR9XG5cdFx0XHR9LFxuXHRcdFx0X2ludGVybmFscyA9IFR3ZWVuTGl0ZS5faW50ZXJuYWxzID0ge2lzQXJyYXk6X2lzQXJyYXksIGlzU2VsZWN0b3I6X2lzU2VsZWN0b3IsIGxhenlUd2VlbnM6X2xhenlUd2VlbnMsIGJsb2JEaWY6X2Jsb2JEaWZ9LCAvL2dpdmVzIHVzIGEgd2F5IHRvIGV4cG9zZSBjZXJ0YWluIHByaXZhdGUgdmFsdWVzIHRvIG90aGVyIEdyZWVuU29jayBjbGFzc2VzIHdpdGhvdXQgY29udGFtaW5hdGluZyB0aGEgbWFpbiBUd2VlbkxpdGUgb2JqZWN0LlxuXHRcdFx0X3BsdWdpbnMgPSBUd2VlbkxpdGUuX3BsdWdpbnMgPSB7fSxcblx0XHRcdF90d2Vlbkxvb2t1cCA9IF9pbnRlcm5hbHMudHdlZW5Mb29rdXAgPSB7fSxcblx0XHRcdF90d2Vlbkxvb2t1cE51bSA9IDAsXG5cdFx0XHRfcmVzZXJ2ZWRQcm9wcyA9IF9pbnRlcm5hbHMucmVzZXJ2ZWRQcm9wcyA9IHtlYXNlOjEsIGRlbGF5OjEsIG92ZXJ3cml0ZToxLCBvbkNvbXBsZXRlOjEsIG9uQ29tcGxldGVQYXJhbXM6MSwgb25Db21wbGV0ZVNjb3BlOjEsIHVzZUZyYW1lczoxLCBydW5CYWNrd2FyZHM6MSwgc3RhcnRBdDoxLCBvblVwZGF0ZToxLCBvblVwZGF0ZVBhcmFtczoxLCBvblVwZGF0ZVNjb3BlOjEsIG9uU3RhcnQ6MSwgb25TdGFydFBhcmFtczoxLCBvblN0YXJ0U2NvcGU6MSwgb25SZXZlcnNlQ29tcGxldGU6MSwgb25SZXZlcnNlQ29tcGxldGVQYXJhbXM6MSwgb25SZXZlcnNlQ29tcGxldGVTY29wZToxLCBvblJlcGVhdDoxLCBvblJlcGVhdFBhcmFtczoxLCBvblJlcGVhdFNjb3BlOjEsIGVhc2VQYXJhbXM6MSwgeW95bzoxLCBpbW1lZGlhdGVSZW5kZXI6MSwgcmVwZWF0OjEsIHJlcGVhdERlbGF5OjEsIGRhdGE6MSwgcGF1c2VkOjEsIHJldmVyc2VkOjEsIGF1dG9DU1M6MSwgbGF6eToxLCBvbk92ZXJ3cml0ZToxLCBjYWxsYmFja1Njb3BlOjEsIHN0cmluZ0ZpbHRlcjoxLCBpZDoxLCB5b3lvRWFzZToxfSxcblx0XHRcdF9vdmVyd3JpdGVMb29rdXAgPSB7bm9uZTowLCBhbGw6MSwgYXV0bzoyLCBjb25jdXJyZW50OjMsIGFsbE9uU3RhcnQ6NCwgcHJlZXhpc3Rpbmc6NSwgXCJ0cnVlXCI6MSwgXCJmYWxzZVwiOjB9LFxuXHRcdFx0X3Jvb3RGcmFtZXNUaW1lbGluZSA9IEFuaW1hdGlvbi5fcm9vdEZyYW1lc1RpbWVsaW5lID0gbmV3IFNpbXBsZVRpbWVsaW5lKCksXG5cdFx0XHRfcm9vdFRpbWVsaW5lID0gQW5pbWF0aW9uLl9yb290VGltZWxpbmUgPSBuZXcgU2ltcGxlVGltZWxpbmUoKSxcblx0XHRcdF9uZXh0R0NGcmFtZSA9IDMwLFxuXHRcdFx0X2xhenlSZW5kZXIgPSBfaW50ZXJuYWxzLmxhenlSZW5kZXIgPSBmdW5jdGlvbigpIHtcblx0XHRcdFx0dmFyIGkgPSBfbGF6eVR3ZWVucy5sZW5ndGgsXG5cdFx0XHRcdFx0dHdlZW47XG5cdFx0XHRcdF9sYXp5TG9va3VwID0ge307XG5cdFx0XHRcdHdoaWxlICgtLWkgPiAtMSkge1xuXHRcdFx0XHRcdHR3ZWVuID0gX2xhenlUd2VlbnNbaV07XG5cdFx0XHRcdFx0aWYgKHR3ZWVuICYmIHR3ZWVuLl9sYXp5ICE9PSBmYWxzZSkge1xuXHRcdFx0XHRcdFx0dHdlZW4ucmVuZGVyKHR3ZWVuLl9sYXp5WzBdLCB0d2Vlbi5fbGF6eVsxXSwgdHJ1ZSk7XG5cdFx0XHRcdFx0XHR0d2Vlbi5fbGF6eSA9IGZhbHNlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0XHRfbGF6eVR3ZWVucy5sZW5ndGggPSAwO1xuXHRcdFx0fTtcblxuXHRcdF9yb290VGltZWxpbmUuX3N0YXJ0VGltZSA9IF90aWNrZXIudGltZTtcblx0XHRfcm9vdEZyYW1lc1RpbWVsaW5lLl9zdGFydFRpbWUgPSBfdGlja2VyLmZyYW1lO1xuXHRcdF9yb290VGltZWxpbmUuX2FjdGl2ZSA9IF9yb290RnJhbWVzVGltZWxpbmUuX2FjdGl2ZSA9IHRydWU7XG5cdFx0c2V0VGltZW91dChfbGF6eVJlbmRlciwgMSk7IC8vb24gc29tZSBtb2JpbGUgZGV2aWNlcywgdGhlcmUgaXNuJ3QgYSBcInRpY2tcIiBiZWZvcmUgY29kZSBydW5zIHdoaWNoIG1lYW5zIGFueSBsYXp5IHJlbmRlcnMgd291bGRuJ3QgcnVuIGJlZm9yZSB0aGUgbmV4dCBvZmZpY2lhbCBcInRpY2tcIi5cblxuXHRcdEFuaW1hdGlvbi5fdXBkYXRlUm9vdCA9IFR3ZWVuTGl0ZS5yZW5kZXIgPSBmdW5jdGlvbigpIHtcblx0XHRcdFx0dmFyIGksIGEsIHA7XG5cdFx0XHRcdGlmIChfbGF6eVR3ZWVucy5sZW5ndGgpIHsgLy9pZiBjb2RlIGlzIHJ1biBvdXRzaWRlIG9mIHRoZSByZXF1ZXN0QW5pbWF0aW9uRnJhbWUgbG9vcCwgdGhlcmUgbWF5IGJlIHR3ZWVucyBxdWV1ZWQgQUZURVIgdGhlIGVuZ2luZSByZWZyZXNoZWQsIHNvIHdlIG5lZWQgdG8gZW5zdXJlIGFueSBwZW5kaW5nIHJlbmRlcnMgb2NjdXIgYmVmb3JlIHdlIHJlZnJlc2ggYWdhaW4uXG5cdFx0XHRcdFx0X2xhenlSZW5kZXIoKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRfcm9vdFRpbWVsaW5lLnJlbmRlcigoX3RpY2tlci50aW1lIC0gX3Jvb3RUaW1lbGluZS5fc3RhcnRUaW1lKSAqIF9yb290VGltZWxpbmUuX3RpbWVTY2FsZSwgZmFsc2UsIGZhbHNlKTtcblx0XHRcdFx0X3Jvb3RGcmFtZXNUaW1lbGluZS5yZW5kZXIoKF90aWNrZXIuZnJhbWUgLSBfcm9vdEZyYW1lc1RpbWVsaW5lLl9zdGFydFRpbWUpICogX3Jvb3RGcmFtZXNUaW1lbGluZS5fdGltZVNjYWxlLCBmYWxzZSwgZmFsc2UpO1xuXHRcdFx0XHRpZiAoX2xhenlUd2VlbnMubGVuZ3RoKSB7XG5cdFx0XHRcdFx0X2xhenlSZW5kZXIoKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAoX3RpY2tlci5mcmFtZSA+PSBfbmV4dEdDRnJhbWUpIHsgLy9kdW1wIGdhcmJhZ2UgZXZlcnkgMTIwIGZyYW1lcyBvciB3aGF0ZXZlciB0aGUgdXNlciBzZXRzIFR3ZWVuTGl0ZS5hdXRvU2xlZXAgdG9cblx0XHRcdFx0XHRfbmV4dEdDRnJhbWUgPSBfdGlja2VyLmZyYW1lICsgKHBhcnNlSW50KFR3ZWVuTGl0ZS5hdXRvU2xlZXAsIDEwKSB8fCAxMjApO1xuXHRcdFx0XHRcdGZvciAocCBpbiBfdHdlZW5Mb29rdXApIHtcblx0XHRcdFx0XHRcdGEgPSBfdHdlZW5Mb29rdXBbcF0udHdlZW5zO1xuXHRcdFx0XHRcdFx0aSA9IGEubGVuZ3RoO1xuXHRcdFx0XHRcdFx0d2hpbGUgKC0taSA+IC0xKSB7XG5cdFx0XHRcdFx0XHRcdGlmIChhW2ldLl9nYykge1xuXHRcdFx0XHRcdFx0XHRcdGEuc3BsaWNlKGksIDEpO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRpZiAoYS5sZW5ndGggPT09IDApIHtcblx0XHRcdFx0XHRcdFx0ZGVsZXRlIF90d2Vlbkxvb2t1cFtwXTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0Ly9pZiB0aGVyZSBhcmUgbm8gbW9yZSB0d2VlbnMgaW4gdGhlIHJvb3QgdGltZWxpbmVzLCBvciBpZiB0aGV5J3JlIGFsbCBwYXVzZWQsIG1ha2UgdGhlIF90aW1lciBzbGVlcCB0byByZWR1Y2UgbG9hZCBvbiB0aGUgQ1BVIHNsaWdodGx5XG5cdFx0XHRcdFx0cCA9IF9yb290VGltZWxpbmUuX2ZpcnN0O1xuXHRcdFx0XHRcdGlmICghcCB8fCBwLl9wYXVzZWQpIGlmIChUd2VlbkxpdGUuYXV0b1NsZWVwICYmICFfcm9vdEZyYW1lc1RpbWVsaW5lLl9maXJzdCAmJiBfdGlja2VyLl9saXN0ZW5lcnMudGljay5sZW5ndGggPT09IDEpIHtcblx0XHRcdFx0XHRcdHdoaWxlIChwICYmIHAuX3BhdXNlZCkge1xuXHRcdFx0XHRcdFx0XHRwID0gcC5fbmV4dDtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdGlmICghcCkge1xuXHRcdFx0XHRcdFx0XHRfdGlja2VyLnNsZWVwKCk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9O1xuXG5cdFx0X3RpY2tlci5hZGRFdmVudExpc3RlbmVyKFwidGlja1wiLCBBbmltYXRpb24uX3VwZGF0ZVJvb3QpO1xuXG5cdFx0dmFyIF9yZWdpc3RlciA9IGZ1bmN0aW9uKHRhcmdldCwgdHdlZW4sIHNjcnViKSB7XG5cdFx0XHRcdHZhciBpZCA9IHRhcmdldC5fZ3NUd2VlbklELCBhLCBpO1xuXHRcdFx0XHRpZiAoIV90d2Vlbkxvb2t1cFtpZCB8fCAodGFyZ2V0Ll9nc1R3ZWVuSUQgPSBpZCA9IFwidFwiICsgKF90d2Vlbkxvb2t1cE51bSsrKSldKSB7XG5cdFx0XHRcdFx0X3R3ZWVuTG9va3VwW2lkXSA9IHt0YXJnZXQ6dGFyZ2V0LCB0d2VlbnM6W119O1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmICh0d2Vlbikge1xuXHRcdFx0XHRcdGEgPSBfdHdlZW5Mb29rdXBbaWRdLnR3ZWVucztcblx0XHRcdFx0XHRhWyhpID0gYS5sZW5ndGgpXSA9IHR3ZWVuO1xuXHRcdFx0XHRcdGlmIChzY3J1Yikge1xuXHRcdFx0XHRcdFx0d2hpbGUgKC0taSA+IC0xKSB7XG5cdFx0XHRcdFx0XHRcdGlmIChhW2ldID09PSB0d2Vlbikge1xuXHRcdFx0XHRcdFx0XHRcdGEuc3BsaWNlKGksIDEpO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiBfdHdlZW5Mb29rdXBbaWRdLnR3ZWVucztcblx0XHRcdH0sXG5cdFx0XHRfb25PdmVyd3JpdGUgPSBmdW5jdGlvbihvdmVyd3JpdHRlblR3ZWVuLCBvdmVyd3JpdGluZ1R3ZWVuLCB0YXJnZXQsIGtpbGxlZFByb3BzKSB7XG5cdFx0XHRcdHZhciBmdW5jID0gb3ZlcndyaXR0ZW5Ud2Vlbi52YXJzLm9uT3ZlcndyaXRlLCByMSwgcjI7XG5cdFx0XHRcdGlmIChmdW5jKSB7XG5cdFx0XHRcdFx0cjEgPSBmdW5jKG92ZXJ3cml0dGVuVHdlZW4sIG92ZXJ3cml0aW5nVHdlZW4sIHRhcmdldCwga2lsbGVkUHJvcHMpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGZ1bmMgPSBUd2VlbkxpdGUub25PdmVyd3JpdGU7XG5cdFx0XHRcdGlmIChmdW5jKSB7XG5cdFx0XHRcdFx0cjIgPSBmdW5jKG92ZXJ3cml0dGVuVHdlZW4sIG92ZXJ3cml0aW5nVHdlZW4sIHRhcmdldCwga2lsbGVkUHJvcHMpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiAocjEgIT09IGZhbHNlICYmIHIyICE9PSBmYWxzZSk7XG5cdFx0XHR9LFxuXHRcdFx0X2FwcGx5T3ZlcndyaXRlID0gZnVuY3Rpb24odGFyZ2V0LCB0d2VlbiwgcHJvcHMsIG1vZGUsIHNpYmxpbmdzKSB7XG5cdFx0XHRcdHZhciBpLCBjaGFuZ2VkLCBjdXJUd2VlbiwgbDtcblx0XHRcdFx0aWYgKG1vZGUgPT09IDEgfHwgbW9kZSA+PSA0KSB7XG5cdFx0XHRcdFx0bCA9IHNpYmxpbmdzLmxlbmd0aDtcblx0XHRcdFx0XHRmb3IgKGkgPSAwOyBpIDwgbDsgaSsrKSB7XG5cdFx0XHRcdFx0XHRpZiAoKGN1clR3ZWVuID0gc2libGluZ3NbaV0pICE9PSB0d2Vlbikge1xuXHRcdFx0XHRcdFx0XHRpZiAoIWN1clR3ZWVuLl9nYykge1xuXHRcdFx0XHRcdFx0XHRcdGlmIChjdXJUd2Vlbi5fa2lsbChudWxsLCB0YXJnZXQsIHR3ZWVuKSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0Y2hhbmdlZCA9IHRydWU7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9IGVsc2UgaWYgKG1vZGUgPT09IDUpIHtcblx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHJldHVybiBjaGFuZ2VkO1xuXHRcdFx0XHR9XG5cdFx0XHRcdC8vTk9URTogQWRkIDAuMDAwMDAwMDAwMSB0byBvdmVyY29tZSBmbG9hdGluZyBwb2ludCBlcnJvcnMgdGhhdCBjYW4gY2F1c2UgdGhlIHN0YXJ0VGltZSB0byBiZSBWRVJZIHNsaWdodGx5IG9mZiAod2hlbiBhIHR3ZWVuJ3MgdGltZSgpIGlzIHNldCBmb3IgZXhhbXBsZSlcblx0XHRcdFx0dmFyIHN0YXJ0VGltZSA9IHR3ZWVuLl9zdGFydFRpbWUgKyBfdGlueU51bSxcblx0XHRcdFx0XHRvdmVybGFwcyA9IFtdLFxuXHRcdFx0XHRcdG9Db3VudCA9IDAsXG5cdFx0XHRcdFx0emVyb0R1ciA9ICh0d2Vlbi5fZHVyYXRpb24gPT09IDApLFxuXHRcdFx0XHRcdGdsb2JhbFN0YXJ0O1xuXHRcdFx0XHRpID0gc2libGluZ3MubGVuZ3RoO1xuXHRcdFx0XHR3aGlsZSAoLS1pID4gLTEpIHtcblx0XHRcdFx0XHRpZiAoKGN1clR3ZWVuID0gc2libGluZ3NbaV0pID09PSB0d2VlbiB8fCBjdXJUd2Vlbi5fZ2MgfHwgY3VyVHdlZW4uX3BhdXNlZCkge1xuXHRcdFx0XHRcdFx0Ly9pZ25vcmVcblx0XHRcdFx0XHR9IGVsc2UgaWYgKGN1clR3ZWVuLl90aW1lbGluZSAhPT0gdHdlZW4uX3RpbWVsaW5lKSB7XG5cdFx0XHRcdFx0XHRnbG9iYWxTdGFydCA9IGdsb2JhbFN0YXJ0IHx8IF9jaGVja092ZXJsYXAodHdlZW4sIDAsIHplcm9EdXIpO1xuXHRcdFx0XHRcdFx0aWYgKF9jaGVja092ZXJsYXAoY3VyVHdlZW4sIGdsb2JhbFN0YXJ0LCB6ZXJvRHVyKSA9PT0gMCkge1xuXHRcdFx0XHRcdFx0XHRvdmVybGFwc1tvQ291bnQrK10gPSBjdXJUd2Vlbjtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9IGVsc2UgaWYgKGN1clR3ZWVuLl9zdGFydFRpbWUgPD0gc3RhcnRUaW1lKSBpZiAoY3VyVHdlZW4uX3N0YXJ0VGltZSArIGN1clR3ZWVuLnRvdGFsRHVyYXRpb24oKSAvIGN1clR3ZWVuLl90aW1lU2NhbGUgPiBzdGFydFRpbWUpIGlmICghKCh6ZXJvRHVyIHx8ICFjdXJUd2Vlbi5faW5pdHRlZCkgJiYgc3RhcnRUaW1lIC0gY3VyVHdlZW4uX3N0YXJ0VGltZSA8PSAwLjAwMDAwMDAwMDIpKSB7XG5cdFx0XHRcdFx0XHRvdmVybGFwc1tvQ291bnQrK10gPSBjdXJUd2Vlbjtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpID0gb0NvdW50O1xuXHRcdFx0XHR3aGlsZSAoLS1pID4gLTEpIHtcblx0XHRcdFx0XHRjdXJUd2VlbiA9IG92ZXJsYXBzW2ldO1xuXHRcdFx0XHRcdGlmIChtb2RlID09PSAyKSBpZiAoY3VyVHdlZW4uX2tpbGwocHJvcHMsIHRhcmdldCwgdHdlZW4pKSB7XG5cdFx0XHRcdFx0XHRjaGFuZ2VkID0gdHJ1ZTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0aWYgKG1vZGUgIT09IDIgfHwgKCFjdXJUd2Vlbi5fZmlyc3RQVCAmJiBjdXJUd2Vlbi5faW5pdHRlZCkpIHtcblx0XHRcdFx0XHRcdGlmIChtb2RlICE9PSAyICYmICFfb25PdmVyd3JpdGUoY3VyVHdlZW4sIHR3ZWVuKSkge1xuXHRcdFx0XHRcdFx0XHRjb250aW51ZTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdGlmIChjdXJUd2Vlbi5fZW5hYmxlZChmYWxzZSwgZmFsc2UpKSB7IC8vaWYgYWxsIHByb3BlcnR5IHR3ZWVucyBoYXZlIGJlZW4gb3ZlcndyaXR0ZW4sIGtpbGwgdGhlIHR3ZWVuLlxuXHRcdFx0XHRcdFx0XHRjaGFuZ2VkID0gdHJ1ZTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIGNoYW5nZWQ7XG5cdFx0XHR9LFxuXHRcdFx0X2NoZWNrT3ZlcmxhcCA9IGZ1bmN0aW9uKHR3ZWVuLCByZWZlcmVuY2UsIHplcm9EdXIpIHtcblx0XHRcdFx0dmFyIHRsID0gdHdlZW4uX3RpbWVsaW5lLFxuXHRcdFx0XHRcdHRzID0gdGwuX3RpbWVTY2FsZSxcblx0XHRcdFx0XHR0ID0gdHdlZW4uX3N0YXJ0VGltZTtcblx0XHRcdFx0d2hpbGUgKHRsLl90aW1lbGluZSkge1xuXHRcdFx0XHRcdHQgKz0gdGwuX3N0YXJ0VGltZTtcblx0XHRcdFx0XHR0cyAqPSB0bC5fdGltZVNjYWxlO1xuXHRcdFx0XHRcdGlmICh0bC5fcGF1c2VkKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gLTEwMDtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0dGwgPSB0bC5fdGltZWxpbmU7XG5cdFx0XHRcdH1cblx0XHRcdFx0dCAvPSB0cztcblx0XHRcdFx0cmV0dXJuICh0ID4gcmVmZXJlbmNlKSA/IHQgLSByZWZlcmVuY2UgOiAoKHplcm9EdXIgJiYgdCA9PT0gcmVmZXJlbmNlKSB8fCAoIXR3ZWVuLl9pbml0dGVkICYmIHQgLSByZWZlcmVuY2UgPCAyICogX3RpbnlOdW0pKSA/IF90aW55TnVtIDogKCh0ICs9IHR3ZWVuLnRvdGFsRHVyYXRpb24oKSAvIHR3ZWVuLl90aW1lU2NhbGUgLyB0cykgPiByZWZlcmVuY2UgKyBfdGlueU51bSkgPyAwIDogdCAtIHJlZmVyZW5jZSAtIF90aW55TnVtO1xuXHRcdFx0fTtcblxuXG4vLy0tLS0gVHdlZW5MaXRlIGluc3RhbmNlIG1ldGhvZHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuXHRcdHAuX2luaXQgPSBmdW5jdGlvbigpIHtcblx0XHRcdHZhciB2ID0gdGhpcy52YXJzLFxuXHRcdFx0XHRvcCA9IHRoaXMuX292ZXJ3cml0dGVuUHJvcHMsXG5cdFx0XHRcdGR1ciA9IHRoaXMuX2R1cmF0aW9uLFxuXHRcdFx0XHRpbW1lZGlhdGUgPSAhIXYuaW1tZWRpYXRlUmVuZGVyLFxuXHRcdFx0XHRlYXNlID0gdi5lYXNlLFxuXHRcdFx0XHRpLCBpbml0UGx1Z2lucywgcHQsIHAsIHN0YXJ0VmFycywgbDtcblx0XHRcdGlmICh2LnN0YXJ0QXQpIHtcblx0XHRcdFx0aWYgKHRoaXMuX3N0YXJ0QXQpIHtcblx0XHRcdFx0XHR0aGlzLl9zdGFydEF0LnJlbmRlcigtMSwgdHJ1ZSk7IC8vaWYgd2UndmUgcnVuIGEgc3RhcnRBdCBwcmV2aW91c2x5ICh3aGVuIHRoZSB0d2VlbiBpbnN0YW50aWF0ZWQpLCB3ZSBzaG91bGQgcmV2ZXJ0IGl0IHNvIHRoYXQgdGhlIHZhbHVlcyByZS1pbnN0YW50aWF0ZSBjb3JyZWN0bHkgcGFydGljdWxhcmx5IGZvciByZWxhdGl2ZSB0d2VlbnMuIFdpdGhvdXQgdGhpcywgYSBUd2VlbkxpdGUuZnJvbVRvKG9iaiwgMSwge3g6XCIrPTEwMFwifSwge3g6XCItPTEwMFwifSksIGZvciBleGFtcGxlLCB3b3VsZCBhY3R1YWxseSBqdW1wIHRvICs9MjAwIGJlY2F1c2UgdGhlIHN0YXJ0QXQgd291bGQgcnVuIHR3aWNlLCBkb3VibGluZyB0aGUgcmVsYXRpdmUgY2hhbmdlLlxuXHRcdFx0XHRcdHRoaXMuX3N0YXJ0QXQua2lsbCgpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHN0YXJ0VmFycyA9IHt9O1xuXHRcdFx0XHRmb3IgKHAgaW4gdi5zdGFydEF0KSB7IC8vY29weSB0aGUgcHJvcGVydGllcy92YWx1ZXMgaW50byBhIG5ldyBvYmplY3QgdG8gYXZvaWQgY29sbGlzaW9ucywgbGlrZSB2YXIgdG8gPSB7eDowfSwgZnJvbSA9IHt4OjUwMH07IHRpbWVsaW5lLmZyb21UbyhlLCAxLCBmcm9tLCB0bykuZnJvbVRvKGUsIDEsIHRvLCBmcm9tKTtcblx0XHRcdFx0XHRzdGFydFZhcnNbcF0gPSB2LnN0YXJ0QXRbcF07XG5cdFx0XHRcdH1cblx0XHRcdFx0c3RhcnRWYXJzLmRhdGEgPSBcImlzU3RhcnRcIjtcblx0XHRcdFx0c3RhcnRWYXJzLm92ZXJ3cml0ZSA9IGZhbHNlO1xuXHRcdFx0XHRzdGFydFZhcnMuaW1tZWRpYXRlUmVuZGVyID0gdHJ1ZTtcblx0XHRcdFx0c3RhcnRWYXJzLmxhenkgPSAoaW1tZWRpYXRlICYmIHYubGF6eSAhPT0gZmFsc2UpO1xuXHRcdFx0XHRzdGFydFZhcnMuc3RhcnRBdCA9IHN0YXJ0VmFycy5kZWxheSA9IG51bGw7IC8vbm8gbmVzdGluZyBvZiBzdGFydEF0IG9iamVjdHMgYWxsb3dlZCAob3RoZXJ3aXNlIGl0IGNvdWxkIGNhdXNlIGFuIGluZmluaXRlIGxvb3ApLlxuXHRcdFx0XHRzdGFydFZhcnMub25VcGRhdGUgPSB2Lm9uVXBkYXRlO1xuXHRcdFx0XHRzdGFydFZhcnMub25VcGRhdGVQYXJhbXMgPSB2Lm9uVXBkYXRlUGFyYW1zO1xuXHRcdFx0XHRzdGFydFZhcnMub25VcGRhdGVTY29wZSA9IHYub25VcGRhdGVTY29wZSB8fCB2LmNhbGxiYWNrU2NvcGUgfHwgdGhpcztcblx0XHRcdFx0dGhpcy5fc3RhcnRBdCA9IFR3ZWVuTGl0ZS50byh0aGlzLnRhcmdldCwgMCwgc3RhcnRWYXJzKTtcblx0XHRcdFx0aWYgKGltbWVkaWF0ZSkge1xuXHRcdFx0XHRcdGlmICh0aGlzLl90aW1lID4gMCkge1xuXHRcdFx0XHRcdFx0dGhpcy5fc3RhcnRBdCA9IG51bGw7IC8vdHdlZW5zIHRoYXQgcmVuZGVyIGltbWVkaWF0ZWx5IChsaWtlIG1vc3QgZnJvbSgpIGFuZCBmcm9tVG8oKSB0d2VlbnMpIHNob3VsZG4ndCByZXZlcnQgd2hlbiB0aGVpciBwYXJlbnQgdGltZWxpbmUncyBwbGF5aGVhZCBnb2VzIGJhY2t3YXJkIHBhc3QgdGhlIHN0YXJ0VGltZSBiZWNhdXNlIHRoZSBpbml0aWFsIHJlbmRlciBjb3VsZCBoYXZlIGhhcHBlbmVkIGFueXRpbWUgYW5kIGl0IHNob3VsZG4ndCBiZSBkaXJlY3RseSBjb3JyZWxhdGVkIHRvIHRoaXMgdHdlZW4ncyBzdGFydFRpbWUuIEltYWdpbmUgc2V0dGluZyB1cCBhIGNvbXBsZXggYW5pbWF0aW9uIHdoZXJlIHRoZSBiZWdpbm5pbmcgc3RhdGVzIG9mIHZhcmlvdXMgb2JqZWN0cyBhcmUgcmVuZGVyZWQgaW1tZWRpYXRlbHkgYnV0IHRoZSB0d2VlbiBkb2Vzbid0IGhhcHBlbiBmb3IgcXVpdGUgc29tZSB0aW1lIC0gaWYgd2UgcmV2ZXJ0IHRvIHRoZSBzdGFydGluZyB2YWx1ZXMgYXMgc29vbiBhcyB0aGUgcGxheWhlYWQgZ29lcyBiYWNrd2FyZCBwYXN0IHRoZSB0d2VlbidzIHN0YXJ0VGltZSwgaXQgd2lsbCB0aHJvdyB0aGluZ3Mgb2ZmIHZpc3VhbGx5LiBSZXZlcnNpb24gc2hvdWxkIG9ubHkgaGFwcGVuIGluIFRpbWVsaW5lTGl0ZS9NYXggaW5zdGFuY2VzIHdoZXJlIGltbWVkaWF0ZVJlbmRlciB3YXMgZmFsc2UgKHdoaWNoIGlzIHRoZSBkZWZhdWx0IGluIHRoZSBjb252ZW5pZW5jZSBtZXRob2RzIGxpa2UgZnJvbSgpKS5cblx0XHRcdFx0XHR9IGVsc2UgaWYgKGR1ciAhPT0gMCkge1xuXHRcdFx0XHRcdFx0cmV0dXJuOyAvL3dlIHNraXAgaW5pdGlhbGl6YXRpb24gaGVyZSBzbyB0aGF0IG92ZXJ3cml0aW5nIGRvZXNuJ3Qgb2NjdXIgdW50aWwgdGhlIHR3ZWVuIGFjdHVhbGx5IGJlZ2lucy4gT3RoZXJ3aXNlLCBpZiB5b3UgY3JlYXRlIHNldmVyYWwgaW1tZWRpYXRlUmVuZGVyOnRydWUgdHdlZW5zIG9mIHRoZSBzYW1lIHRhcmdldC9wcm9wZXJ0aWVzIHRvIGRyb3AgaW50byBhIFRpbWVsaW5lTGl0ZSBvciBUaW1lbGluZU1heCwgdGhlIGxhc3Qgb25lIGNyZWF0ZWQgd291bGQgb3ZlcndyaXRlIHRoZSBmaXJzdCBvbmVzIGJlY2F1c2UgdGhleSBkaWRuJ3QgZ2V0IHBsYWNlZCBpbnRvIHRoZSB0aW1lbGluZSB5ZXQgYmVmb3JlIHRoZSBmaXJzdCByZW5kZXIgb2NjdXJzIGFuZCBraWNrcyBpbiBvdmVyd3JpdGluZy5cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSBpZiAodi5ydW5CYWNrd2FyZHMgJiYgZHVyICE9PSAwKSB7XG5cdFx0XHRcdC8vZnJvbSgpIHR3ZWVucyBtdXN0IGJlIGhhbmRsZWQgdW5pcXVlbHk6IHRoZWlyIGJlZ2lubmluZyB2YWx1ZXMgbXVzdCBiZSByZW5kZXJlZCBidXQgd2UgZG9uJ3Qgd2FudCBvdmVyd3JpdGluZyB0byBvY2N1ciB5ZXQgKHdoZW4gdGltZSBpcyBzdGlsbCAwKS4gV2FpdCB1bnRpbCB0aGUgdHdlZW4gYWN0dWFsbHkgYmVnaW5zIGJlZm9yZSBkb2luZyBhbGwgdGhlIHJvdXRpbmVzIGxpa2Ugb3ZlcndyaXRpbmcuIEF0IHRoYXQgdGltZSwgd2Ugc2hvdWxkIHJlbmRlciBhdCB0aGUgRU5EIG9mIHRoZSB0d2VlbiB0byBlbnN1cmUgdGhhdCB0aGluZ3MgaW5pdGlhbGl6ZSBjb3JyZWN0bHkgKHJlbWVtYmVyLCBmcm9tKCkgdHdlZW5zIGdvIGJhY2t3YXJkcylcblx0XHRcdFx0aWYgKHRoaXMuX3N0YXJ0QXQpIHtcblx0XHRcdFx0XHR0aGlzLl9zdGFydEF0LnJlbmRlcigtMSwgdHJ1ZSk7XG5cdFx0XHRcdFx0dGhpcy5fc3RhcnRBdC5raWxsKCk7XG5cdFx0XHRcdFx0dGhpcy5fc3RhcnRBdCA9IG51bGw7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0aWYgKHRoaXMuX3RpbWUgIT09IDApIHsgLy9pbiByYXJlIGNhc2VzIChsaWtlIGlmIGEgZnJvbSgpIHR3ZWVuIHJ1bnMgYW5kIHRoZW4gaXMgaW52YWxpZGF0ZSgpLWVkKSwgaW1tZWRpYXRlUmVuZGVyIGNvdWxkIGJlIHRydWUgYnV0IHRoZSBpbml0aWFsIGZvcmNlZC1yZW5kZXIgZ2V0cyBza2lwcGVkLCBzbyB0aGVyZSdzIG5vIG5lZWQgdG8gZm9yY2UgdGhlIHJlbmRlciBpbiB0aGlzIGNvbnRleHQgd2hlbiB0aGUgX3RpbWUgaXMgZ3JlYXRlciB0aGFuIDBcblx0XHRcdFx0XHRcdGltbWVkaWF0ZSA9IGZhbHNlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRwdCA9IHt9O1xuXHRcdFx0XHRcdGZvciAocCBpbiB2KSB7IC8vY29weSBwcm9wcyBpbnRvIGEgbmV3IG9iamVjdCBhbmQgc2tpcCBhbnkgcmVzZXJ2ZWQgcHJvcHMsIG90aGVyd2lzZSBvbkNvbXBsZXRlIG9yIG9uVXBkYXRlIG9yIG9uU3RhcnQgY291bGQgZmlyZS4gV2Ugc2hvdWxkLCBob3dldmVyLCBwZXJtaXQgYXV0b0NTUyB0byBnbyB0aHJvdWdoLlxuXHRcdFx0XHRcdFx0aWYgKCFfcmVzZXJ2ZWRQcm9wc1twXSB8fCBwID09PSBcImF1dG9DU1NcIikge1xuXHRcdFx0XHRcdFx0XHRwdFtwXSA9IHZbcF07XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHB0Lm92ZXJ3cml0ZSA9IDA7XG5cdFx0XHRcdFx0cHQuZGF0YSA9IFwiaXNGcm9tU3RhcnRcIjsgLy93ZSB0YWcgdGhlIHR3ZWVuIHdpdGggYXMgXCJpc0Zyb21TdGFydFwiIHNvIHRoYXQgaWYgW2luc2lkZSBhIHBsdWdpbl0gd2UgbmVlZCB0byBvbmx5IGRvIHNvbWV0aGluZyBhdCB0aGUgdmVyeSBFTkQgb2YgYSB0d2Vlbiwgd2UgaGF2ZSBhIHdheSBvZiBpZGVudGlmeWluZyB0aGlzIHR3ZWVuIGFzIG1lcmVseSB0aGUgb25lIHRoYXQncyBzZXR0aW5nIHRoZSBiZWdpbm5pbmcgdmFsdWVzIGZvciBhIFwiZnJvbSgpXCIgdHdlZW4uIEZvciBleGFtcGxlLCBjbGVhclByb3BzIGluIENTU1BsdWdpbiBzaG91bGQgb25seSBnZXQgYXBwbGllZCBhdCB0aGUgdmVyeSBFTkQgb2YgYSB0d2VlbiBhbmQgd2l0aG91dCB0aGlzIHRhZywgZnJvbSguLi57aGVpZ2h0OjEwMCwgY2xlYXJQcm9wczpcImhlaWdodFwiLCBkZWxheToxfSkgd291bGQgd2lwZSB0aGUgaGVpZ2h0IGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIHR3ZWVuIGFuZCBhZnRlciAxIHNlY29uZCwgaXQnZCBraWNrIGJhY2sgaW4uXG5cdFx0XHRcdFx0cHQubGF6eSA9IChpbW1lZGlhdGUgJiYgdi5sYXp5ICE9PSBmYWxzZSk7XG5cdFx0XHRcdFx0cHQuaW1tZWRpYXRlUmVuZGVyID0gaW1tZWRpYXRlOyAvL3plcm8tZHVyYXRpb24gdHdlZW5zIHJlbmRlciBpbW1lZGlhdGVseSBieSBkZWZhdWx0LCBidXQgaWYgd2UncmUgbm90IHNwZWNpZmljYWxseSBpbnN0cnVjdGVkIHRvIHJlbmRlciB0aGlzIHR3ZWVuIGltbWVkaWF0ZWx5LCB3ZSBzaG91bGQgc2tpcCB0aGlzIGFuZCBtZXJlbHkgX2luaXQoKSB0byByZWNvcmQgdGhlIHN0YXJ0aW5nIHZhbHVlcyAocmVuZGVyaW5nIHRoZW0gaW1tZWRpYXRlbHkgd291bGQgcHVzaCB0aGVtIHRvIGNvbXBsZXRpb24gd2hpY2ggaXMgd2FzdGVmdWwgaW4gdGhhdCBjYXNlIC0gd2UnZCBoYXZlIHRvIHJlbmRlcigtMSkgaW1tZWRpYXRlbHkgYWZ0ZXIpXG5cdFx0XHRcdFx0dGhpcy5fc3RhcnRBdCA9IFR3ZWVuTGl0ZS50byh0aGlzLnRhcmdldCwgMCwgcHQpO1xuXHRcdFx0XHRcdGlmICghaW1tZWRpYXRlKSB7XG5cdFx0XHRcdFx0XHR0aGlzLl9zdGFydEF0Ll9pbml0KCk7IC8vZW5zdXJlcyB0aGF0IHRoZSBpbml0aWFsIHZhbHVlcyBhcmUgcmVjb3JkZWRcblx0XHRcdFx0XHRcdHRoaXMuX3N0YXJ0QXQuX2VuYWJsZWQoZmFsc2UpOyAvL25vIG5lZWQgdG8gaGF2ZSB0aGUgdHdlZW4gcmVuZGVyIG9uIHRoZSBuZXh0IGN5Y2xlLiBEaXNhYmxlIGl0IGJlY2F1c2Ugd2UnbGwgYWx3YXlzIG1hbnVhbGx5IGNvbnRyb2wgdGhlIHJlbmRlcnMgb2YgdGhlIF9zdGFydEF0IHR3ZWVuLlxuXHRcdFx0XHRcdFx0aWYgKHRoaXMudmFycy5pbW1lZGlhdGVSZW5kZXIpIHtcblx0XHRcdFx0XHRcdFx0dGhpcy5fc3RhcnRBdCA9IG51bGw7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSBlbHNlIGlmICh0aGlzLl90aW1lID09PSAwKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHR0aGlzLl9lYXNlID0gZWFzZSA9ICghZWFzZSkgPyBUd2VlbkxpdGUuZGVmYXVsdEVhc2UgOiAoZWFzZSBpbnN0YW5jZW9mIEVhc2UpID8gZWFzZSA6ICh0eXBlb2YoZWFzZSkgPT09IFwiZnVuY3Rpb25cIikgPyBuZXcgRWFzZShlYXNlLCB2LmVhc2VQYXJhbXMpIDogX2Vhc2VNYXBbZWFzZV0gfHwgVHdlZW5MaXRlLmRlZmF1bHRFYXNlO1xuXHRcdFx0aWYgKHYuZWFzZVBhcmFtcyBpbnN0YW5jZW9mIEFycmF5ICYmIGVhc2UuY29uZmlnKSB7XG5cdFx0XHRcdHRoaXMuX2Vhc2UgPSBlYXNlLmNvbmZpZy5hcHBseShlYXNlLCB2LmVhc2VQYXJhbXMpO1xuXHRcdFx0fVxuXHRcdFx0dGhpcy5fZWFzZVR5cGUgPSB0aGlzLl9lYXNlLl90eXBlO1xuXHRcdFx0dGhpcy5fZWFzZVBvd2VyID0gdGhpcy5fZWFzZS5fcG93ZXI7XG5cdFx0XHR0aGlzLl9maXJzdFBUID0gbnVsbDtcblxuXHRcdFx0aWYgKHRoaXMuX3RhcmdldHMpIHtcblx0XHRcdFx0bCA9IHRoaXMuX3RhcmdldHMubGVuZ3RoO1xuXHRcdFx0XHRmb3IgKGkgPSAwOyBpIDwgbDsgaSsrKSB7XG5cdFx0XHRcdFx0aWYgKCB0aGlzLl9pbml0UHJvcHMoIHRoaXMuX3RhcmdldHNbaV0sICh0aGlzLl9wcm9wTG9va3VwW2ldID0ge30pLCB0aGlzLl9zaWJsaW5nc1tpXSwgKG9wID8gb3BbaV0gOiBudWxsKSwgaSkgKSB7XG5cdFx0XHRcdFx0XHRpbml0UGx1Z2lucyA9IHRydWU7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRpbml0UGx1Z2lucyA9IHRoaXMuX2luaXRQcm9wcyh0aGlzLnRhcmdldCwgdGhpcy5fcHJvcExvb2t1cCwgdGhpcy5fc2libGluZ3MsIG9wLCAwKTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKGluaXRQbHVnaW5zKSB7XG5cdFx0XHRcdFR3ZWVuTGl0ZS5fb25QbHVnaW5FdmVudChcIl9vbkluaXRBbGxQcm9wc1wiLCB0aGlzKTsgLy9yZW9yZGVycyB0aGUgYXJyYXkgaW4gb3JkZXIgb2YgcHJpb3JpdHkuIFVzZXMgYSBzdGF0aWMgVHdlZW5QbHVnaW4gbWV0aG9kIGluIG9yZGVyIHRvIG1pbmltaXplIGZpbGUgc2l6ZSBpbiBUd2VlbkxpdGVcblx0XHRcdH1cblx0XHRcdGlmIChvcCkgaWYgKCF0aGlzLl9maXJzdFBUKSBpZiAodHlwZW9mKHRoaXMudGFyZ2V0KSAhPT0gXCJmdW5jdGlvblwiKSB7IC8vaWYgYWxsIHR3ZWVuaW5nIHByb3BlcnRpZXMgaGF2ZSBiZWVuIG92ZXJ3cml0dGVuLCBraWxsIHRoZSB0d2Vlbi4gSWYgdGhlIHRhcmdldCBpcyBhIGZ1bmN0aW9uLCBpdCdzIHByb2JhYmx5IGEgZGVsYXllZENhbGwgc28gbGV0IGl0IGxpdmUuXG5cdFx0XHRcdHRoaXMuX2VuYWJsZWQoZmFsc2UsIGZhbHNlKTtcblx0XHRcdH1cblx0XHRcdGlmICh2LnJ1bkJhY2t3YXJkcykge1xuXHRcdFx0XHRwdCA9IHRoaXMuX2ZpcnN0UFQ7XG5cdFx0XHRcdHdoaWxlIChwdCkge1xuXHRcdFx0XHRcdHB0LnMgKz0gcHQuYztcblx0XHRcdFx0XHRwdC5jID0gLXB0LmM7XG5cdFx0XHRcdFx0cHQgPSBwdC5fbmV4dDtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0dGhpcy5fb25VcGRhdGUgPSB2Lm9uVXBkYXRlO1xuXHRcdFx0dGhpcy5faW5pdHRlZCA9IHRydWU7XG5cdFx0fTtcblxuXHRcdHAuX2luaXRQcm9wcyA9IGZ1bmN0aW9uKHRhcmdldCwgcHJvcExvb2t1cCwgc2libGluZ3MsIG92ZXJ3cml0dGVuUHJvcHMsIGluZGV4KSB7XG5cdFx0XHR2YXIgcCwgaSwgaW5pdFBsdWdpbnMsIHBsdWdpbiwgcHQsIHY7XG5cdFx0XHRpZiAodGFyZ2V0ID09IG51bGwpIHtcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoX2xhenlMb29rdXBbdGFyZ2V0Ll9nc1R3ZWVuSURdKSB7XG5cdFx0XHRcdF9sYXp5UmVuZGVyKCk7IC8vaWYgb3RoZXIgdHdlZW5zIG9mIHRoZSBzYW1lIHRhcmdldCBoYXZlIHJlY2VudGx5IGluaXR0ZWQgYnV0IGhhdmVuJ3QgcmVuZGVyZWQgeWV0LCB3ZSd2ZSBnb3QgdG8gZm9yY2UgdGhlIHJlbmRlciBzbyB0aGF0IHRoZSBzdGFydGluZyB2YWx1ZXMgYXJlIGNvcnJlY3QgKGltYWdpbmUgcG9wdWxhdGluZyBhIHRpbWVsaW5lIHdpdGggYSBidW5jaCBvZiBzZXF1ZW50aWFsIHR3ZWVucyBhbmQgdGhlbiBqdW1waW5nIHRvIHRoZSBlbmQpXG5cdFx0XHR9XG5cblx0XHRcdGlmICghdGhpcy52YXJzLmNzcykgaWYgKHRhcmdldC5zdHlsZSkgaWYgKHRhcmdldCAhPT0gd2luZG93ICYmIHRhcmdldC5ub2RlVHlwZSkgaWYgKF9wbHVnaW5zLmNzcykgaWYgKHRoaXMudmFycy5hdXRvQ1NTICE9PSBmYWxzZSkgeyAvL2l0J3Mgc28gY29tbW9uIHRvIHVzZSBUd2VlbkxpdGUvTWF4IHRvIGFuaW1hdGUgdGhlIGNzcyBvZiBET00gZWxlbWVudHMsIHdlIGFzc3VtZSB0aGF0IGlmIHRoZSB0YXJnZXQgaXMgYSBET00gZWxlbWVudCwgdGhhdCdzIHdoYXQgaXMgaW50ZW5kZWQgKGEgY29udmVuaWVuY2Ugc28gdGhhdCB1c2VycyBkb24ndCBoYXZlIHRvIHdyYXAgdGhpbmdzIGluIGNzczp7fSwgYWx0aG91Z2ggd2Ugc3RpbGwgcmVjb21tZW5kIGl0IGZvciBhIHNsaWdodCBwZXJmb3JtYW5jZSBib29zdCBhbmQgYmV0dGVyIHNwZWNpZmljaXR5KS4gTm90ZTogd2UgY2Fubm90IGNoZWNrIFwibm9kZVR5cGVcIiBvbiB0aGUgd2luZG93IGluc2lkZSBhbiBpZnJhbWUuXG5cdFx0XHRcdF9hdXRvQ1NTKHRoaXMudmFycywgdGFyZ2V0KTtcblx0XHRcdH1cblx0XHRcdGZvciAocCBpbiB0aGlzLnZhcnMpIHtcblx0XHRcdFx0diA9IHRoaXMudmFyc1twXTtcblx0XHRcdFx0aWYgKF9yZXNlcnZlZFByb3BzW3BdKSB7XG5cdFx0XHRcdFx0aWYgKHYpIGlmICgodiBpbnN0YW5jZW9mIEFycmF5KSB8fCAodi5wdXNoICYmIF9pc0FycmF5KHYpKSkgaWYgKHYuam9pbihcIlwiKS5pbmRleE9mKFwie3NlbGZ9XCIpICE9PSAtMSkge1xuXHRcdFx0XHRcdFx0dGhpcy52YXJzW3BdID0gdiA9IHRoaXMuX3N3YXBTZWxmSW5QYXJhbXModiwgdGhpcyk7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdH0gZWxzZSBpZiAoX3BsdWdpbnNbcF0gJiYgKHBsdWdpbiA9IG5ldyBfcGx1Z2luc1twXSgpKS5fb25Jbml0VHdlZW4odGFyZ2V0LCB0aGlzLnZhcnNbcF0sIHRoaXMsIGluZGV4KSkge1xuXG5cdFx0XHRcdFx0Ly90IC0gdGFyZ2V0IFx0XHRbb2JqZWN0XVxuXHRcdFx0XHRcdC8vcCAtIHByb3BlcnR5IFx0XHRbc3RyaW5nXVxuXHRcdFx0XHRcdC8vcyAtIHN0YXJ0XHRcdFx0W251bWJlcl1cblx0XHRcdFx0XHQvL2MgLSBjaGFuZ2VcdFx0W251bWJlcl1cblx0XHRcdFx0XHQvL2YgLSBpc0Z1bmN0aW9uXHRbYm9vbGVhbl1cblx0XHRcdFx0XHQvL24gLSBuYW1lXHRcdFx0W3N0cmluZ11cblx0XHRcdFx0XHQvL3BnIC0gaXNQbHVnaW4gXHRbYm9vbGVhbl1cblx0XHRcdFx0XHQvL3ByIC0gcHJpb3JpdHlcdFx0W251bWJlcl1cblx0XHRcdFx0XHQvL20gLSBtb2QgICAgICAgICAgIFtmdW5jdGlvbiB8IDBdXG5cdFx0XHRcdFx0dGhpcy5fZmlyc3RQVCA9IHB0ID0ge19uZXh0OnRoaXMuX2ZpcnN0UFQsIHQ6cGx1Z2luLCBwOlwic2V0UmF0aW9cIiwgczowLCBjOjEsIGY6MSwgbjpwLCBwZzoxLCBwcjpwbHVnaW4uX3ByaW9yaXR5LCBtOjB9O1xuXHRcdFx0XHRcdGkgPSBwbHVnaW4uX292ZXJ3cml0ZVByb3BzLmxlbmd0aDtcblx0XHRcdFx0XHR3aGlsZSAoLS1pID4gLTEpIHtcblx0XHRcdFx0XHRcdHByb3BMb29rdXBbcGx1Z2luLl9vdmVyd3JpdGVQcm9wc1tpXV0gPSB0aGlzLl9maXJzdFBUO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRpZiAocGx1Z2luLl9wcmlvcml0eSB8fCBwbHVnaW4uX29uSW5pdEFsbFByb3BzKSB7XG5cdFx0XHRcdFx0XHRpbml0UGx1Z2lucyA9IHRydWU7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGlmIChwbHVnaW4uX29uRGlzYWJsZSB8fCBwbHVnaW4uX29uRW5hYmxlKSB7XG5cdFx0XHRcdFx0XHR0aGlzLl9ub3RpZnlQbHVnaW5zT2ZFbmFibGVkID0gdHJ1ZTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0aWYgKHB0Ll9uZXh0KSB7XG5cdFx0XHRcdFx0XHRwdC5fbmV4dC5fcHJldiA9IHB0O1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHByb3BMb29rdXBbcF0gPSBfYWRkUHJvcFR3ZWVuLmNhbGwodGhpcywgdGFyZ2V0LCBwLCBcImdldFwiLCB2LCBwLCAwLCBudWxsLCB0aGlzLnZhcnMuc3RyaW5nRmlsdGVyLCBpbmRleCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0aWYgKG92ZXJ3cml0dGVuUHJvcHMpIGlmICh0aGlzLl9raWxsKG92ZXJ3cml0dGVuUHJvcHMsIHRhcmdldCkpIHsgLy9hbm90aGVyIHR3ZWVuIG1heSBoYXZlIHRyaWVkIHRvIG92ZXJ3cml0ZSBwcm9wZXJ0aWVzIG9mIHRoaXMgdHdlZW4gYmVmb3JlIGluaXQoKSB3YXMgY2FsbGVkIChsaWtlIGlmIHR3byB0d2VlbnMgc3RhcnQgYXQgdGhlIHNhbWUgdGltZSwgdGhlIG9uZSBjcmVhdGVkIHNlY29uZCB3aWxsIHJ1biBmaXJzdClcblx0XHRcdFx0cmV0dXJuIHRoaXMuX2luaXRQcm9wcyh0YXJnZXQsIHByb3BMb29rdXAsIHNpYmxpbmdzLCBvdmVyd3JpdHRlblByb3BzLCBpbmRleCk7XG5cdFx0XHR9XG5cdFx0XHRpZiAodGhpcy5fb3ZlcndyaXRlID4gMSkgaWYgKHRoaXMuX2ZpcnN0UFQpIGlmIChzaWJsaW5ncy5sZW5ndGggPiAxKSBpZiAoX2FwcGx5T3ZlcndyaXRlKHRhcmdldCwgdGhpcywgcHJvcExvb2t1cCwgdGhpcy5fb3ZlcndyaXRlLCBzaWJsaW5ncykpIHtcblx0XHRcdFx0dGhpcy5fa2lsbChwcm9wTG9va3VwLCB0YXJnZXQpO1xuXHRcdFx0XHRyZXR1cm4gdGhpcy5faW5pdFByb3BzKHRhcmdldCwgcHJvcExvb2t1cCwgc2libGluZ3MsIG92ZXJ3cml0dGVuUHJvcHMsIGluZGV4KTtcblx0XHRcdH1cblx0XHRcdGlmICh0aGlzLl9maXJzdFBUKSBpZiAoKHRoaXMudmFycy5sYXp5ICE9PSBmYWxzZSAmJiB0aGlzLl9kdXJhdGlvbikgfHwgKHRoaXMudmFycy5sYXp5ICYmICF0aGlzLl9kdXJhdGlvbikpIHsgLy96ZXJvIGR1cmF0aW9uIHR3ZWVucyBkb24ndCBsYXp5IHJlbmRlciBieSBkZWZhdWx0OyBldmVyeXRoaW5nIGVsc2UgZG9lcy5cblx0XHRcdFx0X2xhenlMb29rdXBbdGFyZ2V0Ll9nc1R3ZWVuSURdID0gdHJ1ZTtcblx0XHRcdH1cblx0XHRcdHJldHVybiBpbml0UGx1Z2lucztcblx0XHR9O1xuXG5cdFx0cC5yZW5kZXIgPSBmdW5jdGlvbih0aW1lLCBzdXBwcmVzc0V2ZW50cywgZm9yY2UpIHtcblx0XHRcdHZhciBwcmV2VGltZSA9IHRoaXMuX3RpbWUsXG5cdFx0XHRcdGR1cmF0aW9uID0gdGhpcy5fZHVyYXRpb24sXG5cdFx0XHRcdHByZXZSYXdQcmV2VGltZSA9IHRoaXMuX3Jhd1ByZXZUaW1lLFxuXHRcdFx0XHRpc0NvbXBsZXRlLCBjYWxsYmFjaywgcHQsIHJhd1ByZXZUaW1lO1xuXHRcdFx0aWYgKHRpbWUgPj0gZHVyYXRpb24gLSAwLjAwMDAwMDEgJiYgdGltZSA+PSAwKSB7IC8vdG8gd29yayBhcm91bmQgb2NjYXNpb25hbCBmbG9hdGluZyBwb2ludCBtYXRoIGFydGlmYWN0cy5cblx0XHRcdFx0dGhpcy5fdG90YWxUaW1lID0gdGhpcy5fdGltZSA9IGR1cmF0aW9uO1xuXHRcdFx0XHR0aGlzLnJhdGlvID0gdGhpcy5fZWFzZS5fY2FsY0VuZCA/IHRoaXMuX2Vhc2UuZ2V0UmF0aW8oMSkgOiAxO1xuXHRcdFx0XHRpZiAoIXRoaXMuX3JldmVyc2VkICkge1xuXHRcdFx0XHRcdGlzQ29tcGxldGUgPSB0cnVlO1xuXHRcdFx0XHRcdGNhbGxiYWNrID0gXCJvbkNvbXBsZXRlXCI7XG5cdFx0XHRcdFx0Zm9yY2UgPSAoZm9yY2UgfHwgdGhpcy5fdGltZWxpbmUuYXV0b1JlbW92ZUNoaWxkcmVuKTsgLy9vdGhlcndpc2UsIGlmIHRoZSBhbmltYXRpb24gaXMgdW5wYXVzZWQvYWN0aXZhdGVkIGFmdGVyIGl0J3MgYWxyZWFkeSBmaW5pc2hlZCwgaXQgZG9lc24ndCBnZXQgcmVtb3ZlZCBmcm9tIHRoZSBwYXJlbnQgdGltZWxpbmUuXG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKGR1cmF0aW9uID09PSAwKSBpZiAodGhpcy5faW5pdHRlZCB8fCAhdGhpcy52YXJzLmxhenkgfHwgZm9yY2UpIHsgLy96ZXJvLWR1cmF0aW9uIHR3ZWVucyBhcmUgdHJpY2t5IGJlY2F1c2Ugd2UgbXVzdCBkaXNjZXJuIHRoZSBtb21lbnR1bS9kaXJlY3Rpb24gb2YgdGltZSBpbiBvcmRlciB0byBkZXRlcm1pbmUgd2hldGhlciB0aGUgc3RhcnRpbmcgdmFsdWVzIHNob3VsZCBiZSByZW5kZXJlZCBvciB0aGUgZW5kaW5nIHZhbHVlcy4gSWYgdGhlIFwicGxheWhlYWRcIiBvZiBpdHMgdGltZWxpbmUgZ29lcyBwYXN0IHRoZSB6ZXJvLWR1cmF0aW9uIHR3ZWVuIGluIHRoZSBmb3J3YXJkIGRpcmVjdGlvbiBvciBsYW5kcyBkaXJlY3RseSBvbiBpdCwgdGhlIGVuZCB2YWx1ZXMgc2hvdWxkIGJlIHJlbmRlcmVkLCBidXQgaWYgdGhlIHRpbWVsaW5lJ3MgXCJwbGF5aGVhZFwiIG1vdmVzIHBhc3QgaXQgaW4gdGhlIGJhY2t3YXJkIGRpcmVjdGlvbiAoZnJvbSBhIHBvc3RpdGl2ZSB0aW1lIHRvIGEgbmVnYXRpdmUgdGltZSksIHRoZSBzdGFydGluZyB2YWx1ZXMgbXVzdCBiZSByZW5kZXJlZC5cblx0XHRcdFx0XHRpZiAodGhpcy5fc3RhcnRUaW1lID09PSB0aGlzLl90aW1lbGluZS5fZHVyYXRpb24pIHsgLy9pZiBhIHplcm8tZHVyYXRpb24gdHdlZW4gaXMgYXQgdGhlIFZFUlkgZW5kIG9mIGEgdGltZWxpbmUgYW5kIHRoYXQgdGltZWxpbmUgcmVuZGVycyBhdCBpdHMgZW5kLCBpdCB3aWxsIHR5cGljYWxseSBhZGQgYSB0aW55IGJpdCBvZiBjdXNoaW9uIHRvIHRoZSByZW5kZXIgdGltZSB0byBwcmV2ZW50IHJvdW5kaW5nIGVycm9ycyBmcm9tIGdldHRpbmcgaW4gdGhlIHdheSBvZiB0d2VlbnMgcmVuZGVyaW5nIHRoZWlyIFZFUlkgZW5kLiBJZiB3ZSB0aGVuIHJldmVyc2UoKSB0aGF0IHRpbWVsaW5lLCB0aGUgemVyby1kdXJhdGlvbiB0d2VlbiB3aWxsIHRyaWdnZXIgaXRzIG9uUmV2ZXJzZUNvbXBsZXRlIGV2ZW4gdGhvdWdoIHRlY2huaWNhbGx5IHRoZSBwbGF5aGVhZCBkaWRuJ3QgcGFzcyBvdmVyIGl0IGFnYWluLiBJdCdzIGEgdmVyeSBzcGVjaWZpYyBlZGdlIGNhc2Ugd2UgbXVzdCBhY2NvbW1vZGF0ZS5cblx0XHRcdFx0XHRcdHRpbWUgPSAwO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRpZiAocHJldlJhd1ByZXZUaW1lIDwgMCB8fCAodGltZSA8PSAwICYmIHRpbWUgPj0gLTAuMDAwMDAwMSkgfHwgKHByZXZSYXdQcmV2VGltZSA9PT0gX3RpbnlOdW0gJiYgdGhpcy5kYXRhICE9PSBcImlzUGF1c2VcIikpIGlmIChwcmV2UmF3UHJldlRpbWUgIT09IHRpbWUpIHsgLy9ub3RlOiB3aGVuIHRoaXMuZGF0YSBpcyBcImlzUGF1c2VcIiwgaXQncyBhIGNhbGxiYWNrIGFkZGVkIGJ5IGFkZFBhdXNlKCkgb24gYSB0aW1lbGluZSB0aGF0IHdlIHNob3VsZCBub3QgYmUgdHJpZ2dlcmVkIHdoZW4gTEVBVklORyBpdHMgZXhhY3Qgc3RhcnQgdGltZS4gSW4gb3RoZXIgd29yZHMsIHRsLmFkZFBhdXNlKDEpLnBsYXkoMSkgc2hvdWxkbid0IHBhdXNlLlxuXHRcdFx0XHRcdFx0Zm9yY2UgPSB0cnVlO1xuXHRcdFx0XHRcdFx0aWYgKHByZXZSYXdQcmV2VGltZSA+IF90aW55TnVtKSB7XG5cdFx0XHRcdFx0XHRcdGNhbGxiYWNrID0gXCJvblJldmVyc2VDb21wbGV0ZVwiO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHR0aGlzLl9yYXdQcmV2VGltZSA9IHJhd1ByZXZUaW1lID0gKCFzdXBwcmVzc0V2ZW50cyB8fCB0aW1lIHx8IHByZXZSYXdQcmV2VGltZSA9PT0gdGltZSkgPyB0aW1lIDogX3RpbnlOdW07IC8vd2hlbiB0aGUgcGxheWhlYWQgYXJyaXZlcyBhdCBFWEFDVExZIHRpbWUgMCAocmlnaHQgb24gdG9wKSBvZiBhIHplcm8tZHVyYXRpb24gdHdlZW4sIHdlIG5lZWQgdG8gZGlzY2VybiBpZiBldmVudHMgYXJlIHN1cHByZXNzZWQgc28gdGhhdCB3aGVuIHRoZSBwbGF5aGVhZCBtb3ZlcyBhZ2FpbiAobmV4dCB0aW1lKSwgaXQnbGwgdHJpZ2dlciB0aGUgY2FsbGJhY2suIElmIGV2ZW50cyBhcmUgTk9UIHN1cHByZXNzZWQsIG9idmlvdXNseSB0aGUgY2FsbGJhY2sgd291bGQgYmUgdHJpZ2dlcmVkIGluIHRoaXMgcmVuZGVyLiBCYXNpY2FsbHksIHRoZSBjYWxsYmFjayBzaG91bGQgZmlyZSBlaXRoZXIgd2hlbiB0aGUgcGxheWhlYWQgQVJSSVZFUyBvciBMRUFWRVMgdGhpcyBleGFjdCBzcG90LCBub3QgYm90aC4gSW1hZ2luZSBkb2luZyBhIHRpbWVsaW5lLnNlZWsoMCkgYW5kIHRoZXJlJ3MgYSBjYWxsYmFjayB0aGF0IHNpdHMgYXQgMC4gU2luY2UgZXZlbnRzIGFyZSBzdXBwcmVzc2VkIG9uIHRoYXQgc2VlaygpIGJ5IGRlZmF1bHQsIG5vdGhpbmcgd2lsbCBmaXJlLCBidXQgd2hlbiB0aGUgcGxheWhlYWQgbW92ZXMgb2ZmIG9mIHRoYXQgcG9zaXRpb24sIHRoZSBjYWxsYmFjayBzaG91bGQgZmlyZS4gVGhpcyBiZWhhdmlvciBpcyB3aGF0IHBlb3BsZSBpbnR1aXRpdmVseSBleHBlY3QuIFdlIHNldCB0aGUgX3Jhd1ByZXZUaW1lIHRvIGJlIGEgcHJlY2lzZSB0aW55IG51bWJlciB0byBpbmRpY2F0ZSB0aGlzIHNjZW5hcmlvIHJhdGhlciB0aGFuIHVzaW5nIGFub3RoZXIgcHJvcGVydHkvdmFyaWFibGUgd2hpY2ggd291bGQgaW5jcmVhc2UgbWVtb3J5IHVzYWdlLiBUaGlzIHRlY2huaXF1ZSBpcyBsZXNzIHJlYWRhYmxlLCBidXQgbW9yZSBlZmZpY2llbnQuXG5cdFx0XHRcdH1cblxuXHRcdFx0fSBlbHNlIGlmICh0aW1lIDwgMC4wMDAwMDAxKSB7IC8vdG8gd29yayBhcm91bmQgb2NjYXNpb25hbCBmbG9hdGluZyBwb2ludCBtYXRoIGFydGlmYWN0cywgcm91bmQgc3VwZXIgc21hbGwgdmFsdWVzIHRvIDAuXG5cdFx0XHRcdHRoaXMuX3RvdGFsVGltZSA9IHRoaXMuX3RpbWUgPSAwO1xuXHRcdFx0XHR0aGlzLnJhdGlvID0gdGhpcy5fZWFzZS5fY2FsY0VuZCA/IHRoaXMuX2Vhc2UuZ2V0UmF0aW8oMCkgOiAwO1xuXHRcdFx0XHRpZiAocHJldlRpbWUgIT09IDAgfHwgKGR1cmF0aW9uID09PSAwICYmIHByZXZSYXdQcmV2VGltZSA+IDApKSB7XG5cdFx0XHRcdFx0Y2FsbGJhY2sgPSBcIm9uUmV2ZXJzZUNvbXBsZXRlXCI7XG5cdFx0XHRcdFx0aXNDb21wbGV0ZSA9IHRoaXMuX3JldmVyc2VkO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmICh0aW1lIDwgMCkge1xuXHRcdFx0XHRcdHRoaXMuX2FjdGl2ZSA9IGZhbHNlO1xuXHRcdFx0XHRcdGlmIChkdXJhdGlvbiA9PT0gMCkgaWYgKHRoaXMuX2luaXR0ZWQgfHwgIXRoaXMudmFycy5sYXp5IHx8IGZvcmNlKSB7IC8vemVyby1kdXJhdGlvbiB0d2VlbnMgYXJlIHRyaWNreSBiZWNhdXNlIHdlIG11c3QgZGlzY2VybiB0aGUgbW9tZW50dW0vZGlyZWN0aW9uIG9mIHRpbWUgaW4gb3JkZXIgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdGhlIHN0YXJ0aW5nIHZhbHVlcyBzaG91bGQgYmUgcmVuZGVyZWQgb3IgdGhlIGVuZGluZyB2YWx1ZXMuIElmIHRoZSBcInBsYXloZWFkXCIgb2YgaXRzIHRpbWVsaW5lIGdvZXMgcGFzdCB0aGUgemVyby1kdXJhdGlvbiB0d2VlbiBpbiB0aGUgZm9yd2FyZCBkaXJlY3Rpb24gb3IgbGFuZHMgZGlyZWN0bHkgb24gaXQsIHRoZSBlbmQgdmFsdWVzIHNob3VsZCBiZSByZW5kZXJlZCwgYnV0IGlmIHRoZSB0aW1lbGluZSdzIFwicGxheWhlYWRcIiBtb3ZlcyBwYXN0IGl0IGluIHRoZSBiYWNrd2FyZCBkaXJlY3Rpb24gKGZyb20gYSBwb3N0aXRpdmUgdGltZSB0byBhIG5lZ2F0aXZlIHRpbWUpLCB0aGUgc3RhcnRpbmcgdmFsdWVzIG11c3QgYmUgcmVuZGVyZWQuXG5cdFx0XHRcdFx0XHRpZiAocHJldlJhd1ByZXZUaW1lID49IDAgJiYgIShwcmV2UmF3UHJldlRpbWUgPT09IF90aW55TnVtICYmIHRoaXMuZGF0YSA9PT0gXCJpc1BhdXNlXCIpKSB7XG5cdFx0XHRcdFx0XHRcdGZvcmNlID0gdHJ1ZTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdHRoaXMuX3Jhd1ByZXZUaW1lID0gcmF3UHJldlRpbWUgPSAoIXN1cHByZXNzRXZlbnRzIHx8IHRpbWUgfHwgcHJldlJhd1ByZXZUaW1lID09PSB0aW1lKSA/IHRpbWUgOiBfdGlueU51bTsgLy93aGVuIHRoZSBwbGF5aGVhZCBhcnJpdmVzIGF0IEVYQUNUTFkgdGltZSAwIChyaWdodCBvbiB0b3ApIG9mIGEgemVyby1kdXJhdGlvbiB0d2Vlbiwgd2UgbmVlZCB0byBkaXNjZXJuIGlmIGV2ZW50cyBhcmUgc3VwcHJlc3NlZCBzbyB0aGF0IHdoZW4gdGhlIHBsYXloZWFkIG1vdmVzIGFnYWluIChuZXh0IHRpbWUpLCBpdCdsbCB0cmlnZ2VyIHRoZSBjYWxsYmFjay4gSWYgZXZlbnRzIGFyZSBOT1Qgc3VwcHJlc3NlZCwgb2J2aW91c2x5IHRoZSBjYWxsYmFjayB3b3VsZCBiZSB0cmlnZ2VyZWQgaW4gdGhpcyByZW5kZXIuIEJhc2ljYWxseSwgdGhlIGNhbGxiYWNrIHNob3VsZCBmaXJlIGVpdGhlciB3aGVuIHRoZSBwbGF5aGVhZCBBUlJJVkVTIG9yIExFQVZFUyB0aGlzIGV4YWN0IHNwb3QsIG5vdCBib3RoLiBJbWFnaW5lIGRvaW5nIGEgdGltZWxpbmUuc2VlaygwKSBhbmQgdGhlcmUncyBhIGNhbGxiYWNrIHRoYXQgc2l0cyBhdCAwLiBTaW5jZSBldmVudHMgYXJlIHN1cHByZXNzZWQgb24gdGhhdCBzZWVrKCkgYnkgZGVmYXVsdCwgbm90aGluZyB3aWxsIGZpcmUsIGJ1dCB3aGVuIHRoZSBwbGF5aGVhZCBtb3ZlcyBvZmYgb2YgdGhhdCBwb3NpdGlvbiwgdGhlIGNhbGxiYWNrIHNob3VsZCBmaXJlLiBUaGlzIGJlaGF2aW9yIGlzIHdoYXQgcGVvcGxlIGludHVpdGl2ZWx5IGV4cGVjdC4gV2Ugc2V0IHRoZSBfcmF3UHJldlRpbWUgdG8gYmUgYSBwcmVjaXNlIHRpbnkgbnVtYmVyIHRvIGluZGljYXRlIHRoaXMgc2NlbmFyaW8gcmF0aGVyIHRoYW4gdXNpbmcgYW5vdGhlciBwcm9wZXJ0eS92YXJpYWJsZSB3aGljaCB3b3VsZCBpbmNyZWFzZSBtZW1vcnkgdXNhZ2UuIFRoaXMgdGVjaG5pcXVlIGlzIGxlc3MgcmVhZGFibGUsIGJ1dCBtb3JlIGVmZmljaWVudC5cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKCF0aGlzLl9pbml0dGVkIHx8ICh0aGlzLl9zdGFydEF0ICYmIHRoaXMuX3N0YXJ0QXQucHJvZ3Jlc3MoKSkpIHsgLy9pZiB3ZSByZW5kZXIgdGhlIHZlcnkgYmVnaW5uaW5nICh0aW1lID09IDApIG9mIGEgZnJvbVRvKCksIHdlIG11c3QgZm9yY2UgdGhlIHJlbmRlciAobm9ybWFsIHR3ZWVucyB3b3VsZG4ndCBuZWVkIHRvIHJlbmRlciBhdCBhIHRpbWUgb2YgMCB3aGVuIHRoZSBwcmV2VGltZSB3YXMgYWxzbyAwKS4gVGhpcyBpcyBhbHNvIG1hbmRhdG9yeSB0byBtYWtlIHN1cmUgb3ZlcndyaXRpbmcga2lja3MgaW4gaW1tZWRpYXRlbHkuIEFsc28sIHdlIGNoZWNrIHByb2dyZXNzKCkgYmVjYXVzZSBpZiBzdGFydEF0IGhhcyBhbHJlYWR5IHJlbmRlcmVkIGF0IGl0cyBlbmQsIHdlIHNob3VsZCBmb3JjZSBhIHJlbmRlciBhdCBpdHMgYmVnaW5uaW5nLiBPdGhlcndpc2UsIGlmIHlvdSBwdXQgdGhlIHBsYXloZWFkIGRpcmVjdGx5IG9uIHRvcCBvZiB3aGVyZSBhIGZyb21Ubyh7aW1tZWRpYXRlUmVuZGVyOmZhbHNlfSkgc3RhcnRzLCBhbmQgdGhlbiBtb3ZlIGl0IGJhY2t3YXJkcywgdGhlIGZyb20oKSB3b24ndCByZXZlcnQgaXRzIHZhbHVlcy5cblx0XHRcdFx0XHRmb3JjZSA9IHRydWU7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHRoaXMuX3RvdGFsVGltZSA9IHRoaXMuX3RpbWUgPSB0aW1lO1xuXG5cdFx0XHRcdGlmICh0aGlzLl9lYXNlVHlwZSkge1xuXHRcdFx0XHRcdHZhciByID0gdGltZSAvIGR1cmF0aW9uLCB0eXBlID0gdGhpcy5fZWFzZVR5cGUsIHBvdyA9IHRoaXMuX2Vhc2VQb3dlcjtcblx0XHRcdFx0XHRpZiAodHlwZSA9PT0gMSB8fCAodHlwZSA9PT0gMyAmJiByID49IDAuNSkpIHtcblx0XHRcdFx0XHRcdHIgPSAxIC0gcjtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0aWYgKHR5cGUgPT09IDMpIHtcblx0XHRcdFx0XHRcdHIgKj0gMjtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0aWYgKHBvdyA9PT0gMSkge1xuXHRcdFx0XHRcdFx0ciAqPSByO1xuXHRcdFx0XHRcdH0gZWxzZSBpZiAocG93ID09PSAyKSB7XG5cdFx0XHRcdFx0XHRyICo9IHIgKiByO1xuXHRcdFx0XHRcdH0gZWxzZSBpZiAocG93ID09PSAzKSB7XG5cdFx0XHRcdFx0XHRyICo9IHIgKiByICogcjtcblx0XHRcdFx0XHR9IGVsc2UgaWYgKHBvdyA9PT0gNCkge1xuXHRcdFx0XHRcdFx0ciAqPSByICogciAqIHIgKiByO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGlmICh0eXBlID09PSAxKSB7XG5cdFx0XHRcdFx0XHR0aGlzLnJhdGlvID0gMSAtIHI7XG5cdFx0XHRcdFx0fSBlbHNlIGlmICh0eXBlID09PSAyKSB7XG5cdFx0XHRcdFx0XHR0aGlzLnJhdGlvID0gcjtcblx0XHRcdFx0XHR9IGVsc2UgaWYgKHRpbWUgLyBkdXJhdGlvbiA8IDAuNSkge1xuXHRcdFx0XHRcdFx0dGhpcy5yYXRpbyA9IHIgLyAyO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHR0aGlzLnJhdGlvID0gMSAtIChyIC8gMik7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0dGhpcy5yYXRpbyA9IHRoaXMuX2Vhc2UuZ2V0UmF0aW8odGltZSAvIGR1cmF0aW9uKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRpZiAodGhpcy5fdGltZSA9PT0gcHJldlRpbWUgJiYgIWZvcmNlKSB7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH0gZWxzZSBpZiAoIXRoaXMuX2luaXR0ZWQpIHtcblx0XHRcdFx0dGhpcy5faW5pdCgpO1xuXHRcdFx0XHRpZiAoIXRoaXMuX2luaXR0ZWQgfHwgdGhpcy5fZ2MpIHsgLy9pbW1lZGlhdGVSZW5kZXIgdHdlZW5zIHR5cGljYWxseSB3b24ndCBpbml0aWFsaXplIHVudGlsIHRoZSBwbGF5aGVhZCBhZHZhbmNlcyAoX3RpbWUgaXMgZ3JlYXRlciB0aGFuIDApIGluIG9yZGVyIHRvIGVuc3VyZSB0aGF0IG92ZXJ3cml0aW5nIG9jY3VycyBwcm9wZXJseS4gQWxzbywgaWYgYWxsIG9mIHRoZSB0d2VlbmluZyBwcm9wZXJ0aWVzIGhhdmUgYmVlbiBvdmVyd3JpdHRlbiAod2hpY2ggd291bGQgY2F1c2UgX2djIHRvIGJlIHRydWUsIGFzIHNldCBpbiBfaW5pdCgpKSwgd2Ugc2hvdWxkbid0IGNvbnRpbnVlIG90aGVyd2lzZSBhbiBvblN0YXJ0IGNhbGxiYWNrIGNvdWxkIGJlIGNhbGxlZCBmb3IgZXhhbXBsZS5cblx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdH0gZWxzZSBpZiAoIWZvcmNlICYmIHRoaXMuX2ZpcnN0UFQgJiYgKCh0aGlzLnZhcnMubGF6eSAhPT0gZmFsc2UgJiYgdGhpcy5fZHVyYXRpb24pIHx8ICh0aGlzLnZhcnMubGF6eSAmJiAhdGhpcy5fZHVyYXRpb24pKSkge1xuXHRcdFx0XHRcdHRoaXMuX3RpbWUgPSB0aGlzLl90b3RhbFRpbWUgPSBwcmV2VGltZTtcblx0XHRcdFx0XHR0aGlzLl9yYXdQcmV2VGltZSA9IHByZXZSYXdQcmV2VGltZTtcblx0XHRcdFx0XHRfbGF6eVR3ZWVucy5wdXNoKHRoaXMpO1xuXHRcdFx0XHRcdHRoaXMuX2xhenkgPSBbdGltZSwgc3VwcHJlc3NFdmVudHNdO1xuXHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0fVxuXHRcdFx0XHQvL19lYXNlIGlzIGluaXRpYWxseSBzZXQgdG8gZGVmYXVsdEVhc2UsIHNvIG5vdyB0aGF0IGluaXQoKSBoYXMgcnVuLCBfZWFzZSBpcyBzZXQgcHJvcGVybHkgYW5kIHdlIG5lZWQgdG8gcmVjYWxjdWxhdGUgdGhlIHJhdGlvLiBPdmVyYWxsIHRoaXMgaXMgZmFzdGVyIHRoYW4gdXNpbmcgY29uZGl0aW9uYWwgbG9naWMgZWFybGllciBpbiB0aGUgbWV0aG9kIHRvIGF2b2lkIGhhdmluZyB0byBzZXQgcmF0aW8gdHdpY2UgYmVjYXVzZSB3ZSBvbmx5IGluaXQoKSBvbmNlIGJ1dCByZW5kZXJUaW1lKCkgZ2V0cyBjYWxsZWQgVkVSWSBmcmVxdWVudGx5LlxuXHRcdFx0XHRpZiAodGhpcy5fdGltZSAmJiAhaXNDb21wbGV0ZSkge1xuXHRcdFx0XHRcdHRoaXMucmF0aW8gPSB0aGlzLl9lYXNlLmdldFJhdGlvKHRoaXMuX3RpbWUgLyBkdXJhdGlvbik7XG5cdFx0XHRcdH0gZWxzZSBpZiAoaXNDb21wbGV0ZSAmJiB0aGlzLl9lYXNlLl9jYWxjRW5kKSB7XG5cdFx0XHRcdFx0dGhpcy5yYXRpbyA9IHRoaXMuX2Vhc2UuZ2V0UmF0aW8oKHRoaXMuX3RpbWUgPT09IDApID8gMCA6IDEpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRpZiAodGhpcy5fbGF6eSAhPT0gZmFsc2UpIHsgLy9pbiBjYXNlIGEgbGF6eSByZW5kZXIgaXMgcGVuZGluZywgd2Ugc2hvdWxkIGZsdXNoIGl0IGJlY2F1c2UgdGhlIG5ldyByZW5kZXIgaXMgb2NjdXJyaW5nIG5vdyAoaW1hZ2luZSBhIGxhenkgdHdlZW4gaW5zdGFudGlhdGluZyBhbmQgdGhlbiBpbW1lZGlhdGVseSB0aGUgdXNlciBjYWxscyB0d2Vlbi5zZWVrKHR3ZWVuLmR1cmF0aW9uKCkpLCBza2lwcGluZyB0byB0aGUgZW5kIC0gdGhlIGVuZCByZW5kZXIgd291bGQgYmUgZm9yY2VkLCBhbmQgdGhlbiBpZiB3ZSBkaWRuJ3QgZmx1c2ggdGhlIGxhenkgcmVuZGVyLCBpdCdkIGZpcmUgQUZURVIgdGhlIHNlZWsoKSwgcmVuZGVyaW5nIGl0IGF0IHRoZSB3cm9uZyB0aW1lLlxuXHRcdFx0XHR0aGlzLl9sYXp5ID0gZmFsc2U7XG5cdFx0XHR9XG5cdFx0XHRpZiAoIXRoaXMuX2FjdGl2ZSkgaWYgKCF0aGlzLl9wYXVzZWQgJiYgdGhpcy5fdGltZSAhPT0gcHJldlRpbWUgJiYgdGltZSA+PSAwKSB7XG5cdFx0XHRcdHRoaXMuX2FjdGl2ZSA9IHRydWU7ICAvL3NvIHRoYXQgaWYgdGhlIHVzZXIgcmVuZGVycyBhIHR3ZWVuIChhcyBvcHBvc2VkIHRvIHRoZSB0aW1lbGluZSByZW5kZXJpbmcgaXQpLCB0aGUgdGltZWxpbmUgaXMgZm9yY2VkIHRvIHJlLXJlbmRlciBhbmQgYWxpZ24gaXQgd2l0aCB0aGUgcHJvcGVyIHRpbWUvZnJhbWUgb24gdGhlIG5leHQgcmVuZGVyaW5nIGN5Y2xlLiBNYXliZSB0aGUgdHdlZW4gYWxyZWFkeSBmaW5pc2hlZCBidXQgdGhlIHVzZXIgbWFudWFsbHkgcmUtcmVuZGVycyBpdCBhcyBoYWxmd2F5IGRvbmUuXG5cdFx0XHR9XG5cdFx0XHRpZiAocHJldlRpbWUgPT09IDApIHtcblx0XHRcdFx0aWYgKHRoaXMuX3N0YXJ0QXQpIHtcblx0XHRcdFx0XHRpZiAodGltZSA+PSAwKSB7XG5cdFx0XHRcdFx0XHR0aGlzLl9zdGFydEF0LnJlbmRlcih0aW1lLCB0cnVlLCBmb3JjZSk7XG5cdFx0XHRcdFx0fSBlbHNlIGlmICghY2FsbGJhY2spIHtcblx0XHRcdFx0XHRcdGNhbGxiYWNrID0gXCJfZHVtbXlHU1wiOyAvL2lmIG5vIGNhbGxiYWNrIGlzIGRlZmluZWQsIHVzZSBhIGR1bW15IHZhbHVlIGp1c3Qgc28gdGhhdCB0aGUgY29uZGl0aW9uIGF0IHRoZSBlbmQgZXZhbHVhdGVzIGFzIHRydWUgYmVjYXVzZSBfc3RhcnRBdCBzaG91bGQgcmVuZGVyIEFGVEVSIHRoZSBub3JtYWwgcmVuZGVyIGxvb3Agd2hlbiB0aGUgdGltZSBpcyBuZWdhdGl2ZS4gV2UgY291bGQgaGFuZGxlIHRoaXMgaW4gYSBtb3JlIGludHVpdGl2ZSB3YXksIG9mIGNvdXJzZSwgYnV0IHRoZSByZW5kZXIgbG9vcCBpcyB0aGUgTU9TVCBpbXBvcnRhbnQgdGhpbmcgdG8gb3B0aW1pemUsIHNvIHRoaXMgdGVjaG5pcXVlIGFsbG93cyB1cyB0byBhdm9pZCBhZGRpbmcgZXh0cmEgY29uZGl0aW9uYWwgbG9naWMgaW4gYSBoaWdoLWZyZXF1ZW5jeSBhcmVhLlxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAodGhpcy52YXJzLm9uU3RhcnQpIGlmICh0aGlzLl90aW1lICE9PSAwIHx8IGR1cmF0aW9uID09PSAwKSBpZiAoIXN1cHByZXNzRXZlbnRzKSB7XG5cdFx0XHRcdFx0dGhpcy5fY2FsbGJhY2soXCJvblN0YXJ0XCIpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRwdCA9IHRoaXMuX2ZpcnN0UFQ7XG5cdFx0XHR3aGlsZSAocHQpIHtcblx0XHRcdFx0aWYgKHB0LmYpIHtcblx0XHRcdFx0XHRwdC50W3B0LnBdKHB0LmMgKiB0aGlzLnJhdGlvICsgcHQucyk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0cHQudFtwdC5wXSA9IHB0LmMgKiB0aGlzLnJhdGlvICsgcHQucztcblx0XHRcdFx0fVxuXHRcdFx0XHRwdCA9IHB0Ll9uZXh0O1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAodGhpcy5fb25VcGRhdGUpIHtcblx0XHRcdFx0aWYgKHRpbWUgPCAwKSBpZiAodGhpcy5fc3RhcnRBdCAmJiB0aW1lICE9PSAtMC4wMDAxKSB7IC8vaWYgdGhlIHR3ZWVuIGlzIHBvc2l0aW9uZWQgYXQgdGhlIFZFUlkgYmVnaW5uaW5nIChfc3RhcnRUaW1lIDApIG9mIGl0cyBwYXJlbnQgdGltZWxpbmUsIGl0J3MgaWxsZWdhbCBmb3IgdGhlIHBsYXloZWFkIHRvIGdvIGJhY2sgZnVydGhlciwgc28gd2Ugc2hvdWxkIG5vdCByZW5kZXIgdGhlIHJlY29yZGVkIHN0YXJ0QXQgdmFsdWVzLlxuXHRcdFx0XHRcdHRoaXMuX3N0YXJ0QXQucmVuZGVyKHRpbWUsIHRydWUsIGZvcmNlKTsgLy9ub3RlOiBmb3IgcGVyZm9ybWFuY2UgcmVhc29ucywgd2UgdHVjayB0aGlzIGNvbmRpdGlvbmFsIGxvZ2ljIGluc2lkZSBsZXNzIHRyYXZlbGVkIGFyZWFzIChtb3N0IHR3ZWVucyBkb24ndCBoYXZlIGFuIG9uVXBkYXRlKS4gV2UnZCBqdXN0IGhhdmUgaXQgYXQgdGhlIGVuZCBiZWZvcmUgdGhlIG9uQ29tcGxldGUsIGJ1dCB0aGUgdmFsdWVzIHNob3VsZCBiZSB1cGRhdGVkIGJlZm9yZSBhbnkgb25VcGRhdGUgaXMgY2FsbGVkLCBzbyB3ZSBBTFNPIHB1dCBpdCBoZXJlIGFuZCB0aGVuIGlmIGl0J3Mgbm90IGNhbGxlZCwgd2UgZG8gc28gbGF0ZXIgbmVhciB0aGUgb25Db21wbGV0ZS5cblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAoIXN1cHByZXNzRXZlbnRzKSBpZiAodGhpcy5fdGltZSAhPT0gcHJldlRpbWUgfHwgaXNDb21wbGV0ZSB8fCBmb3JjZSkge1xuXHRcdFx0XHRcdHRoaXMuX2NhbGxiYWNrKFwib25VcGRhdGVcIik7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdGlmIChjYWxsYmFjaykgaWYgKCF0aGlzLl9nYyB8fCBmb3JjZSkgeyAvL2NoZWNrIF9nYyBiZWNhdXNlIHRoZXJlJ3MgYSBjaGFuY2UgdGhhdCBraWxsKCkgY291bGQgYmUgY2FsbGVkIGluIGFuIG9uVXBkYXRlXG5cdFx0XHRcdGlmICh0aW1lIDwgMCAmJiB0aGlzLl9zdGFydEF0ICYmICF0aGlzLl9vblVwZGF0ZSAmJiB0aW1lICE9PSAtMC4wMDAxKSB7IC8vLTAuMDAwMSBpcyBhIHNwZWNpYWwgdmFsdWUgdGhhdCB3ZSB1c2Ugd2hlbiBsb29waW5nIGJhY2sgdG8gdGhlIGJlZ2lubmluZyBvZiBhIHJlcGVhdGVkIFRpbWVsaW5lTWF4LCBpbiB3aGljaCBjYXNlIHdlIHNob3VsZG4ndCByZW5kZXIgdGhlIF9zdGFydEF0IHZhbHVlcy5cblx0XHRcdFx0XHR0aGlzLl9zdGFydEF0LnJlbmRlcih0aW1lLCB0cnVlLCBmb3JjZSk7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKGlzQ29tcGxldGUpIHtcblx0XHRcdFx0XHRpZiAodGhpcy5fdGltZWxpbmUuYXV0b1JlbW92ZUNoaWxkcmVuKSB7XG5cdFx0XHRcdFx0XHR0aGlzLl9lbmFibGVkKGZhbHNlLCBmYWxzZSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHRoaXMuX2FjdGl2ZSA9IGZhbHNlO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmICghc3VwcHJlc3NFdmVudHMgJiYgdGhpcy52YXJzW2NhbGxiYWNrXSkge1xuXHRcdFx0XHRcdHRoaXMuX2NhbGxiYWNrKGNhbGxiYWNrKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAoZHVyYXRpb24gPT09IDAgJiYgdGhpcy5fcmF3UHJldlRpbWUgPT09IF90aW55TnVtICYmIHJhd1ByZXZUaW1lICE9PSBfdGlueU51bSkgeyAvL3RoZSBvbkNvbXBsZXRlIG9yIG9uUmV2ZXJzZUNvbXBsZXRlIGNvdWxkIHRyaWdnZXIgbW92ZW1lbnQgb2YgdGhlIHBsYXloZWFkIGFuZCBmb3IgemVyby1kdXJhdGlvbiB0d2VlbnMgKHdoaWNoIG11c3QgZGlzY2VybiBkaXJlY3Rpb24pIHRoYXQgbGFuZCBkaXJlY3RseSBiYWNrIG9uIHRoZWlyIHN0YXJ0IHRpbWUsIHdlIGRvbid0IHdhbnQgdG8gZmlyZSBhZ2FpbiBvbiB0aGUgbmV4dCByZW5kZXIuIFRoaW5rIG9mIHNldmVyYWwgYWRkUGF1c2UoKSdzIGluIGEgdGltZWxpbmUgdGhhdCBmb3JjZXMgdGhlIHBsYXloZWFkIHRvIGEgY2VydGFpbiBzcG90LCBidXQgd2hhdCBpZiBpdCdzIGFscmVhZHkgcGF1c2VkIGFuZCBhbm90aGVyIHR3ZWVuIGlzIHR3ZWVuaW5nIHRoZSBcInRpbWVcIiBvZiB0aGUgdGltZWxpbmU/IEVhY2ggdGltZSBpdCBtb3ZlcyBbZm9yd2FyZF0gcGFzdCB0aGF0IHNwb3QsIGl0IHdvdWxkIG1vdmUgYmFjaywgYW5kIHNpbmNlIHN1cHByZXNzRXZlbnRzIGlzIHRydWUsIGl0J2QgcmVzZXQgX3Jhd1ByZXZUaW1lIHRvIF90aW55TnVtIHNvIHRoYXQgd2hlbiBpdCBiZWdpbnMgYWdhaW4sIHRoZSBjYWxsYmFjayB3b3VsZCBmaXJlIChzbyB1bHRpbWF0ZWx5IGl0IGNvdWxkIGJvdW5jZSBiYWNrIGFuZCBmb3J0aCBkdXJpbmcgdGhhdCB0d2VlbikuIEFnYWluLCB0aGlzIGlzIGEgdmVyeSB1bmNvbW1vbiBzY2VuYXJpbywgYnV0IHBvc3NpYmxlIG5vbmV0aGVsZXNzLlxuXHRcdFx0XHRcdHRoaXMuX3Jhd1ByZXZUaW1lID0gMDtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH07XG5cblx0XHRwLl9raWxsID0gZnVuY3Rpb24odmFycywgdGFyZ2V0LCBvdmVyd3JpdGluZ1R3ZWVuKSB7XG5cdFx0XHRpZiAodmFycyA9PT0gXCJhbGxcIikge1xuXHRcdFx0XHR2YXJzID0gbnVsbDtcblx0XHRcdH1cblx0XHRcdGlmICh2YXJzID09IG51bGwpIGlmICh0YXJnZXQgPT0gbnVsbCB8fCB0YXJnZXQgPT09IHRoaXMudGFyZ2V0KSB7XG5cdFx0XHRcdHRoaXMuX2xhenkgPSBmYWxzZTtcblx0XHRcdFx0cmV0dXJuIHRoaXMuX2VuYWJsZWQoZmFsc2UsIGZhbHNlKTtcblx0XHRcdH1cblx0XHRcdHRhcmdldCA9ICh0eXBlb2YodGFyZ2V0KSAhPT0gXCJzdHJpbmdcIikgPyAodGFyZ2V0IHx8IHRoaXMuX3RhcmdldHMgfHwgdGhpcy50YXJnZXQpIDogVHdlZW5MaXRlLnNlbGVjdG9yKHRhcmdldCkgfHwgdGFyZ2V0O1xuXHRcdFx0dmFyIHNpbXVsdGFuZW91c092ZXJ3cml0ZSA9IChvdmVyd3JpdGluZ1R3ZWVuICYmIHRoaXMuX3RpbWUgJiYgb3ZlcndyaXRpbmdUd2Vlbi5fc3RhcnRUaW1lID09PSB0aGlzLl9zdGFydFRpbWUgJiYgdGhpcy5fdGltZWxpbmUgPT09IG92ZXJ3cml0aW5nVHdlZW4uX3RpbWVsaW5lKSxcblx0XHRcdFx0aSwgb3ZlcndyaXR0ZW5Qcm9wcywgcCwgcHQsIHByb3BMb29rdXAsIGNoYW5nZWQsIGtpbGxQcm9wcywgcmVjb3JkLCBraWxsZWQ7XG5cdFx0XHRpZiAoKF9pc0FycmF5KHRhcmdldCkgfHwgX2lzU2VsZWN0b3IodGFyZ2V0KSkgJiYgdHlwZW9mKHRhcmdldFswXSkgIT09IFwibnVtYmVyXCIpIHtcblx0XHRcdFx0aSA9IHRhcmdldC5sZW5ndGg7XG5cdFx0XHRcdHdoaWxlICgtLWkgPiAtMSkge1xuXHRcdFx0XHRcdGlmICh0aGlzLl9raWxsKHZhcnMsIHRhcmdldFtpXSwgb3ZlcndyaXRpbmdUd2VlbikpIHtcblx0XHRcdFx0XHRcdGNoYW5nZWQgPSB0cnVlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0aWYgKHRoaXMuX3RhcmdldHMpIHtcblx0XHRcdFx0XHRpID0gdGhpcy5fdGFyZ2V0cy5sZW5ndGg7XG5cdFx0XHRcdFx0d2hpbGUgKC0taSA+IC0xKSB7XG5cdFx0XHRcdFx0XHRpZiAodGFyZ2V0ID09PSB0aGlzLl90YXJnZXRzW2ldKSB7XG5cdFx0XHRcdFx0XHRcdHByb3BMb29rdXAgPSB0aGlzLl9wcm9wTG9va3VwW2ldIHx8IHt9O1xuXHRcdFx0XHRcdFx0XHR0aGlzLl9vdmVyd3JpdHRlblByb3BzID0gdGhpcy5fb3ZlcndyaXR0ZW5Qcm9wcyB8fCBbXTtcblx0XHRcdFx0XHRcdFx0b3ZlcndyaXR0ZW5Qcm9wcyA9IHRoaXMuX292ZXJ3cml0dGVuUHJvcHNbaV0gPSB2YXJzID8gdGhpcy5fb3ZlcndyaXR0ZW5Qcm9wc1tpXSB8fCB7fSA6IFwiYWxsXCI7XG5cdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSBlbHNlIGlmICh0YXJnZXQgIT09IHRoaXMudGFyZ2V0KSB7XG5cdFx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHByb3BMb29rdXAgPSB0aGlzLl9wcm9wTG9va3VwO1xuXHRcdFx0XHRcdG92ZXJ3cml0dGVuUHJvcHMgPSB0aGlzLl9vdmVyd3JpdHRlblByb3BzID0gdmFycyA/IHRoaXMuX292ZXJ3cml0dGVuUHJvcHMgfHwge30gOiBcImFsbFwiO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKHByb3BMb29rdXApIHtcblx0XHRcdFx0XHRraWxsUHJvcHMgPSB2YXJzIHx8IHByb3BMb29rdXA7XG5cdFx0XHRcdFx0cmVjb3JkID0gKHZhcnMgIT09IG92ZXJ3cml0dGVuUHJvcHMgJiYgb3ZlcndyaXR0ZW5Qcm9wcyAhPT0gXCJhbGxcIiAmJiB2YXJzICE9PSBwcm9wTG9va3VwICYmICh0eXBlb2YodmFycykgIT09IFwib2JqZWN0XCIgfHwgIXZhcnMuX3RlbXBLaWxsKSk7IC8vX3RlbXBLaWxsIGlzIGEgc3VwZXItc2VjcmV0IHdheSB0byBkZWxldGUgYSBwYXJ0aWN1bGFyIHR3ZWVuaW5nIHByb3BlcnR5IGJ1dCBOT1QgaGF2ZSBpdCByZW1lbWJlcmVkIGFzIGFuIG9mZmljaWFsIG92ZXJ3cml0dGVuIHByb3BlcnR5IChsaWtlIGluIEJlemllclBsdWdpbilcblx0XHRcdFx0XHRpZiAob3ZlcndyaXRpbmdUd2VlbiAmJiAoVHdlZW5MaXRlLm9uT3ZlcndyaXRlIHx8IHRoaXMudmFycy5vbk92ZXJ3cml0ZSkpIHtcblx0XHRcdFx0XHRcdGZvciAocCBpbiBraWxsUHJvcHMpIHtcblx0XHRcdFx0XHRcdFx0aWYgKHByb3BMb29rdXBbcF0pIHtcblx0XHRcdFx0XHRcdFx0XHRpZiAoIWtpbGxlZCkge1xuXHRcdFx0XHRcdFx0XHRcdFx0a2lsbGVkID0gW107XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdGtpbGxlZC5wdXNoKHApO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRpZiAoKGtpbGxlZCB8fCAhdmFycykgJiYgIV9vbk92ZXJ3cml0ZSh0aGlzLCBvdmVyd3JpdGluZ1R3ZWVuLCB0YXJnZXQsIGtpbGxlZCkpIHsgLy9pZiB0aGUgb25PdmVyd3JpdGUgcmV0dXJuZWQgZmFsc2UsIHRoYXQgbWVhbnMgdGhlIHVzZXIgd2FudHMgdG8gb3ZlcnJpZGUgdGhlIG92ZXJ3cml0aW5nIChjYW5jZWwgaXQpLlxuXHRcdFx0XHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Zm9yIChwIGluIGtpbGxQcm9wcykge1xuXHRcdFx0XHRcdFx0aWYgKChwdCA9IHByb3BMb29rdXBbcF0pKSB7XG5cdFx0XHRcdFx0XHRcdGlmIChzaW11bHRhbmVvdXNPdmVyd3JpdGUpIHsgLy9pZiBhbm90aGVyIHR3ZWVuIG92ZXJ3cml0ZXMgdGhpcyBvbmUgYW5kIHRoZXkgYm90aCBzdGFydCBhdCBleGFjdGx5IHRoZSBzYW1lIHRpbWUsIHlldCB0aGlzIHR3ZWVuIGhhcyBhbHJlYWR5IHJlbmRlcmVkIG9uY2UgKGZvciBleGFtcGxlLCBhdCAwLjAwMSkgYmVjYXVzZSBpdCdzIGZpcnN0IGluIHRoZSBxdWV1ZSwgd2Ugc2hvdWxkIHJldmVydCB0aGUgdmFsdWVzIHRvIHdoZXJlIHRoZXkgd2VyZSBhdCAwIHNvIHRoYXQgdGhlIHN0YXJ0aW5nIHZhbHVlcyBhcmVuJ3QgY29udGFtaW5hdGVkIG9uIHRoZSBvdmVyd3JpdGluZyB0d2Vlbi5cblx0XHRcdFx0XHRcdFx0XHRpZiAocHQuZikge1xuXHRcdFx0XHRcdFx0XHRcdFx0cHQudFtwdC5wXShwdC5zKTtcblx0XHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRcdFx0cHQudFtwdC5wXSA9IHB0LnM7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdGNoYW5nZWQgPSB0cnVlO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdGlmIChwdC5wZyAmJiBwdC50Ll9raWxsKGtpbGxQcm9wcykpIHtcblx0XHRcdFx0XHRcdFx0XHRjaGFuZ2VkID0gdHJ1ZTsgLy9zb21lIHBsdWdpbnMgbmVlZCB0byBiZSBub3RpZmllZCBzbyB0aGV5IGNhbiBwZXJmb3JtIGNsZWFudXAgdGFza3MgZmlyc3Rcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRpZiAoIXB0LnBnIHx8IHB0LnQuX292ZXJ3cml0ZVByb3BzLmxlbmd0aCA9PT0gMCkge1xuXHRcdFx0XHRcdFx0XHRcdGlmIChwdC5fcHJldikge1xuXHRcdFx0XHRcdFx0XHRcdFx0cHQuX3ByZXYuX25leHQgPSBwdC5fbmV4dDtcblx0XHRcdFx0XHRcdFx0XHR9IGVsc2UgaWYgKHB0ID09PSB0aGlzLl9maXJzdFBUKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHR0aGlzLl9maXJzdFBUID0gcHQuX25leHQ7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdGlmIChwdC5fbmV4dCkge1xuXHRcdFx0XHRcdFx0XHRcdFx0cHQuX25leHQuX3ByZXYgPSBwdC5fcHJldjtcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0cHQuX25leHQgPSBwdC5fcHJldiA9IG51bGw7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0ZGVsZXRlIHByb3BMb29rdXBbcF07XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRpZiAocmVjb3JkKSB7XG5cdFx0XHRcdFx0XHRcdG92ZXJ3cml0dGVuUHJvcHNbcF0gPSAxO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRpZiAoIXRoaXMuX2ZpcnN0UFQgJiYgdGhpcy5faW5pdHRlZCkgeyAvL2lmIGFsbCB0d2VlbmluZyBwcm9wZXJ0aWVzIGFyZSBraWxsZWQsIGtpbGwgdGhlIHR3ZWVuLiBXaXRob3V0IHRoaXMgbGluZSwgaWYgdGhlcmUncyBhIHR3ZWVuIHdpdGggbXVsdGlwbGUgdGFyZ2V0cyBhbmQgdGhlbiB5b3Uga2lsbFR3ZWVuc09mKCkgZWFjaCB0YXJnZXQgaW5kaXZpZHVhbGx5LCB0aGUgdHdlZW4gd291bGQgdGVjaG5pY2FsbHkgc3RpbGwgcmVtYWluIGFjdGl2ZSBhbmQgZmlyZSBpdHMgb25Db21wbGV0ZSBldmVuIHRob3VnaCB0aGVyZSBhcmVuJ3QgYW55IG1vcmUgcHJvcGVydGllcyB0d2VlbmluZy5cblx0XHRcdFx0XHRcdHRoaXMuX2VuYWJsZWQoZmFsc2UsIGZhbHNlKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdHJldHVybiBjaGFuZ2VkO1xuXHRcdH07XG5cblx0XHRwLmludmFsaWRhdGUgPSBmdW5jdGlvbigpIHtcblx0XHRcdGlmICh0aGlzLl9ub3RpZnlQbHVnaW5zT2ZFbmFibGVkKSB7XG5cdFx0XHRcdFR3ZWVuTGl0ZS5fb25QbHVnaW5FdmVudChcIl9vbkRpc2FibGVcIiwgdGhpcyk7XG5cdFx0XHR9XG5cdFx0XHR0aGlzLl9maXJzdFBUID0gdGhpcy5fb3ZlcndyaXR0ZW5Qcm9wcyA9IHRoaXMuX3N0YXJ0QXQgPSB0aGlzLl9vblVwZGF0ZSA9IG51bGw7XG5cdFx0XHR0aGlzLl9ub3RpZnlQbHVnaW5zT2ZFbmFibGVkID0gdGhpcy5fYWN0aXZlID0gdGhpcy5fbGF6eSA9IGZhbHNlO1xuXHRcdFx0dGhpcy5fcHJvcExvb2t1cCA9ICh0aGlzLl90YXJnZXRzKSA/IHt9IDogW107XG5cdFx0XHRBbmltYXRpb24ucHJvdG90eXBlLmludmFsaWRhdGUuY2FsbCh0aGlzKTtcblx0XHRcdGlmICh0aGlzLnZhcnMuaW1tZWRpYXRlUmVuZGVyKSB7XG5cdFx0XHRcdHRoaXMuX3RpbWUgPSAtX3RpbnlOdW07IC8vZm9yY2VzIGEgcmVuZGVyIHdpdGhvdXQgaGF2aW5nIHRvIHNldCB0aGUgcmVuZGVyKCkgXCJmb3JjZVwiIHBhcmFtZXRlciB0byB0cnVlIGJlY2F1c2Ugd2Ugd2FudCB0byBhbGxvdyBsYXp5aW5nIGJ5IGRlZmF1bHQgKHVzaW5nIHRoZSBcImZvcmNlXCIgcGFyYW1ldGVyIGFsd2F5cyBmb3JjZXMgYW4gaW1tZWRpYXRlIGZ1bGwgcmVuZGVyKVxuXHRcdFx0XHR0aGlzLnJlbmRlcihNYXRoLm1pbigwLCAtdGhpcy5fZGVsYXkpKTsgLy9pbiBjYXNlIGRlbGF5IGlzIG5lZ2F0aXZlLlxuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0fTtcblxuXHRcdHAuX2VuYWJsZWQgPSBmdW5jdGlvbihlbmFibGVkLCBpZ25vcmVUaW1lbGluZSkge1xuXHRcdFx0aWYgKCFfdGlja2VyQWN0aXZlKSB7XG5cdFx0XHRcdF90aWNrZXIud2FrZSgpO1xuXHRcdFx0fVxuXHRcdFx0aWYgKGVuYWJsZWQgJiYgdGhpcy5fZ2MpIHtcblx0XHRcdFx0dmFyIHRhcmdldHMgPSB0aGlzLl90YXJnZXRzLFxuXHRcdFx0XHRcdGk7XG5cdFx0XHRcdGlmICh0YXJnZXRzKSB7XG5cdFx0XHRcdFx0aSA9IHRhcmdldHMubGVuZ3RoO1xuXHRcdFx0XHRcdHdoaWxlICgtLWkgPiAtMSkge1xuXHRcdFx0XHRcdFx0dGhpcy5fc2libGluZ3NbaV0gPSBfcmVnaXN0ZXIodGFyZ2V0c1tpXSwgdGhpcywgdHJ1ZSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHRoaXMuX3NpYmxpbmdzID0gX3JlZ2lzdGVyKHRoaXMudGFyZ2V0LCB0aGlzLCB0cnVlKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0QW5pbWF0aW9uLnByb3RvdHlwZS5fZW5hYmxlZC5jYWxsKHRoaXMsIGVuYWJsZWQsIGlnbm9yZVRpbWVsaW5lKTtcblx0XHRcdGlmICh0aGlzLl9ub3RpZnlQbHVnaW5zT2ZFbmFibGVkKSBpZiAodGhpcy5fZmlyc3RQVCkge1xuXHRcdFx0XHRyZXR1cm4gVHdlZW5MaXRlLl9vblBsdWdpbkV2ZW50KChlbmFibGVkID8gXCJfb25FbmFibGVcIiA6IFwiX29uRGlzYWJsZVwiKSwgdGhpcyk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fTtcblxuXG4vLy0tLS1Ud2VlbkxpdGUgc3RhdGljIG1ldGhvZHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuXHRcdFR3ZWVuTGl0ZS50byA9IGZ1bmN0aW9uKHRhcmdldCwgZHVyYXRpb24sIHZhcnMpIHtcblx0XHRcdHJldHVybiBuZXcgVHdlZW5MaXRlKHRhcmdldCwgZHVyYXRpb24sIHZhcnMpO1xuXHRcdH07XG5cblx0XHRUd2VlbkxpdGUuZnJvbSA9IGZ1bmN0aW9uKHRhcmdldCwgZHVyYXRpb24sIHZhcnMpIHtcblx0XHRcdHZhcnMucnVuQmFja3dhcmRzID0gdHJ1ZTtcblx0XHRcdHZhcnMuaW1tZWRpYXRlUmVuZGVyID0gKHZhcnMuaW1tZWRpYXRlUmVuZGVyICE9IGZhbHNlKTtcblx0XHRcdHJldHVybiBuZXcgVHdlZW5MaXRlKHRhcmdldCwgZHVyYXRpb24sIHZhcnMpO1xuXHRcdH07XG5cblx0XHRUd2VlbkxpdGUuZnJvbVRvID0gZnVuY3Rpb24odGFyZ2V0LCBkdXJhdGlvbiwgZnJvbVZhcnMsIHRvVmFycykge1xuXHRcdFx0dG9WYXJzLnN0YXJ0QXQgPSBmcm9tVmFycztcblx0XHRcdHRvVmFycy5pbW1lZGlhdGVSZW5kZXIgPSAodG9WYXJzLmltbWVkaWF0ZVJlbmRlciAhPSBmYWxzZSAmJiBmcm9tVmFycy5pbW1lZGlhdGVSZW5kZXIgIT0gZmFsc2UpO1xuXHRcdFx0cmV0dXJuIG5ldyBUd2VlbkxpdGUodGFyZ2V0LCBkdXJhdGlvbiwgdG9WYXJzKTtcblx0XHR9O1xuXG5cdFx0VHdlZW5MaXRlLmRlbGF5ZWRDYWxsID0gZnVuY3Rpb24oZGVsYXksIGNhbGxiYWNrLCBwYXJhbXMsIHNjb3BlLCB1c2VGcmFtZXMpIHtcblx0XHRcdHJldHVybiBuZXcgVHdlZW5MaXRlKGNhbGxiYWNrLCAwLCB7ZGVsYXk6ZGVsYXksIG9uQ29tcGxldGU6Y2FsbGJhY2ssIG9uQ29tcGxldGVQYXJhbXM6cGFyYW1zLCBjYWxsYmFja1Njb3BlOnNjb3BlLCBvblJldmVyc2VDb21wbGV0ZTpjYWxsYmFjaywgb25SZXZlcnNlQ29tcGxldGVQYXJhbXM6cGFyYW1zLCBpbW1lZGlhdGVSZW5kZXI6ZmFsc2UsIGxhenk6ZmFsc2UsIHVzZUZyYW1lczp1c2VGcmFtZXMsIG92ZXJ3cml0ZTowfSk7XG5cdFx0fTtcblxuXHRcdFR3ZWVuTGl0ZS5zZXQgPSBmdW5jdGlvbih0YXJnZXQsIHZhcnMpIHtcblx0XHRcdHJldHVybiBuZXcgVHdlZW5MaXRlKHRhcmdldCwgMCwgdmFycyk7XG5cdFx0fTtcblxuXHRcdFR3ZWVuTGl0ZS5nZXRUd2VlbnNPZiA9IGZ1bmN0aW9uKHRhcmdldCwgb25seUFjdGl2ZSkge1xuXHRcdFx0aWYgKHRhcmdldCA9PSBudWxsKSB7IHJldHVybiBbXTsgfVxuXHRcdFx0dGFyZ2V0ID0gKHR5cGVvZih0YXJnZXQpICE9PSBcInN0cmluZ1wiKSA/IHRhcmdldCA6IFR3ZWVuTGl0ZS5zZWxlY3Rvcih0YXJnZXQpIHx8IHRhcmdldDtcblx0XHRcdHZhciBpLCBhLCBqLCB0O1xuXHRcdFx0aWYgKChfaXNBcnJheSh0YXJnZXQpIHx8IF9pc1NlbGVjdG9yKHRhcmdldCkpICYmIHR5cGVvZih0YXJnZXRbMF0pICE9PSBcIm51bWJlclwiKSB7XG5cdFx0XHRcdGkgPSB0YXJnZXQubGVuZ3RoO1xuXHRcdFx0XHRhID0gW107XG5cdFx0XHRcdHdoaWxlICgtLWkgPiAtMSkge1xuXHRcdFx0XHRcdGEgPSBhLmNvbmNhdChUd2VlbkxpdGUuZ2V0VHdlZW5zT2YodGFyZ2V0W2ldLCBvbmx5QWN0aXZlKSk7XG5cdFx0XHRcdH1cblx0XHRcdFx0aSA9IGEubGVuZ3RoO1xuXHRcdFx0XHQvL25vdyBnZXQgcmlkIG9mIGFueSBkdXBsaWNhdGVzICh0d2VlbnMgb2YgYXJyYXlzIG9mIG9iamVjdHMgY291bGQgY2F1c2UgZHVwbGljYXRlcylcblx0XHRcdFx0d2hpbGUgKC0taSA+IC0xKSB7XG5cdFx0XHRcdFx0dCA9IGFbaV07XG5cdFx0XHRcdFx0aiA9IGk7XG5cdFx0XHRcdFx0d2hpbGUgKC0taiA+IC0xKSB7XG5cdFx0XHRcdFx0XHRpZiAodCA9PT0gYVtqXSkge1xuXHRcdFx0XHRcdFx0XHRhLnNwbGljZShpLCAxKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSBpZiAodGFyZ2V0Ll9nc1R3ZWVuSUQpIHtcblx0XHRcdFx0YSA9IF9yZWdpc3Rlcih0YXJnZXQpLmNvbmNhdCgpO1xuXHRcdFx0XHRpID0gYS5sZW5ndGg7XG5cdFx0XHRcdHdoaWxlICgtLWkgPiAtMSkge1xuXHRcdFx0XHRcdGlmIChhW2ldLl9nYyB8fCAob25seUFjdGl2ZSAmJiAhYVtpXS5pc0FjdGl2ZSgpKSkge1xuXHRcdFx0XHRcdFx0YS5zcGxpY2UoaSwgMSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gYSB8fCBbXTtcblx0XHR9O1xuXG5cdFx0VHdlZW5MaXRlLmtpbGxUd2VlbnNPZiA9IFR3ZWVuTGl0ZS5raWxsRGVsYXllZENhbGxzVG8gPSBmdW5jdGlvbih0YXJnZXQsIG9ubHlBY3RpdmUsIHZhcnMpIHtcblx0XHRcdGlmICh0eXBlb2Yob25seUFjdGl2ZSkgPT09IFwib2JqZWN0XCIpIHtcblx0XHRcdFx0dmFycyA9IG9ubHlBY3RpdmU7IC8vZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IChiZWZvcmUgXCJvbmx5QWN0aXZlXCIgcGFyYW1ldGVyIHdhcyBpbnNlcnRlZClcblx0XHRcdFx0b25seUFjdGl2ZSA9IGZhbHNlO1xuXHRcdFx0fVxuXHRcdFx0dmFyIGEgPSBUd2VlbkxpdGUuZ2V0VHdlZW5zT2YodGFyZ2V0LCBvbmx5QWN0aXZlKSxcblx0XHRcdFx0aSA9IGEubGVuZ3RoO1xuXHRcdFx0d2hpbGUgKC0taSA+IC0xKSB7XG5cdFx0XHRcdGFbaV0uX2tpbGwodmFycywgdGFyZ2V0KTtcblx0XHRcdH1cblx0XHR9O1xuXG5cblxuLypcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIFR3ZWVuUGx1Z2luICAgKGNvdWxkIGVhc2lseSBiZSBzcGxpdCBvdXQgYXMgYSBzZXBhcmF0ZSBmaWxlL2NsYXNzLCBidXQgaW5jbHVkZWQgZm9yIGVhc2Ugb2YgdXNlIChzbyB0aGF0IHBlb3BsZSBkb24ndCBuZWVkIHRvIGluY2x1ZGUgYW5vdGhlciBzY3JpcHQgY2FsbCBiZWZvcmUgbG9hZGluZyBwbHVnaW5zIHdoaWNoIGlzIGVhc3kgdG8gZm9yZ2V0KVxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICovXG5cdFx0dmFyIFR3ZWVuUGx1Z2luID0gX2NsYXNzKFwicGx1Z2lucy5Ud2VlblBsdWdpblwiLCBmdW5jdGlvbihwcm9wcywgcHJpb3JpdHkpIHtcblx0XHRcdFx0XHR0aGlzLl9vdmVyd3JpdGVQcm9wcyA9IChwcm9wcyB8fCBcIlwiKS5zcGxpdChcIixcIik7XG5cdFx0XHRcdFx0dGhpcy5fcHJvcE5hbWUgPSB0aGlzLl9vdmVyd3JpdGVQcm9wc1swXTtcblx0XHRcdFx0XHR0aGlzLl9wcmlvcml0eSA9IHByaW9yaXR5IHx8IDA7XG5cdFx0XHRcdFx0dGhpcy5fc3VwZXIgPSBUd2VlblBsdWdpbi5wcm90b3R5cGU7XG5cdFx0XHRcdH0sIHRydWUpO1xuXG5cdFx0cCA9IFR3ZWVuUGx1Z2luLnByb3RvdHlwZTtcblx0XHRUd2VlblBsdWdpbi52ZXJzaW9uID0gXCIxLjE5LjBcIjtcblx0XHRUd2VlblBsdWdpbi5BUEkgPSAyO1xuXHRcdHAuX2ZpcnN0UFQgPSBudWxsO1xuXHRcdHAuX2FkZFR3ZWVuID0gX2FkZFByb3BUd2Vlbjtcblx0XHRwLnNldFJhdGlvID0gX3NldFJhdGlvO1xuXG5cdFx0cC5fa2lsbCA9IGZ1bmN0aW9uKGxvb2t1cCkge1xuXHRcdFx0dmFyIGEgPSB0aGlzLl9vdmVyd3JpdGVQcm9wcyxcblx0XHRcdFx0cHQgPSB0aGlzLl9maXJzdFBULFxuXHRcdFx0XHRpO1xuXHRcdFx0aWYgKGxvb2t1cFt0aGlzLl9wcm9wTmFtZV0gIT0gbnVsbCkge1xuXHRcdFx0XHR0aGlzLl9vdmVyd3JpdGVQcm9wcyA9IFtdO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0aSA9IGEubGVuZ3RoO1xuXHRcdFx0XHR3aGlsZSAoLS1pID4gLTEpIHtcblx0XHRcdFx0XHRpZiAobG9va3VwW2FbaV1dICE9IG51bGwpIHtcblx0XHRcdFx0XHRcdGEuc3BsaWNlKGksIDEpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0d2hpbGUgKHB0KSB7XG5cdFx0XHRcdGlmIChsb29rdXBbcHQubl0gIT0gbnVsbCkge1xuXHRcdFx0XHRcdGlmIChwdC5fbmV4dCkge1xuXHRcdFx0XHRcdFx0cHQuX25leHQuX3ByZXYgPSBwdC5fcHJldjtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0aWYgKHB0Ll9wcmV2KSB7XG5cdFx0XHRcdFx0XHRwdC5fcHJldi5fbmV4dCA9IHB0Ll9uZXh0O1xuXHRcdFx0XHRcdFx0cHQuX3ByZXYgPSBudWxsO1xuXHRcdFx0XHRcdH0gZWxzZSBpZiAodGhpcy5fZmlyc3RQVCA9PT0gcHQpIHtcblx0XHRcdFx0XHRcdHRoaXMuX2ZpcnN0UFQgPSBwdC5fbmV4dDtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0cHQgPSBwdC5fbmV4dDtcblx0XHRcdH1cblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9O1xuXG5cdFx0cC5fbW9kID0gcC5fcm91bmRQcm9wcyA9IGZ1bmN0aW9uKGxvb2t1cCkge1xuXHRcdFx0dmFyIHB0ID0gdGhpcy5fZmlyc3RQVCxcblx0XHRcdFx0dmFsO1xuXHRcdFx0d2hpbGUgKHB0KSB7XG5cdFx0XHRcdHZhbCA9IGxvb2t1cFt0aGlzLl9wcm9wTmFtZV0gfHwgKHB0Lm4gIT0gbnVsbCAmJiBsb29rdXBbIHB0Lm4uc3BsaXQodGhpcy5fcHJvcE5hbWUgKyBcIl9cIikuam9pbihcIlwiKSBdKTtcblx0XHRcdFx0aWYgKHZhbCAmJiB0eXBlb2YodmFsKSA9PT0gXCJmdW5jdGlvblwiKSB7IC8vc29tZSBwcm9wZXJ0aWVzIHRoYXQgYXJlIHZlcnkgcGx1Z2luLXNwZWNpZmljIGFkZCBhIHByZWZpeCBuYW1lZCBhZnRlciB0aGUgX3Byb3BOYW1lIHBsdXMgYW4gdW5kZXJzY29yZSwgc28gd2UgbmVlZCB0byBpZ25vcmUgdGhhdCBleHRyYSBzdHVmZiBoZXJlLlxuXHRcdFx0XHRcdGlmIChwdC5mID09PSAyKSB7XG5cdFx0XHRcdFx0XHRwdC50Ll9hcHBseVBULm0gPSB2YWw7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdHB0Lm0gPSB2YWw7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdHB0ID0gcHQuX25leHQ7XG5cdFx0XHR9XG5cdFx0fTtcblxuXHRcdFR3ZWVuTGl0ZS5fb25QbHVnaW5FdmVudCA9IGZ1bmN0aW9uKHR5cGUsIHR3ZWVuKSB7XG5cdFx0XHR2YXIgcHQgPSB0d2Vlbi5fZmlyc3RQVCxcblx0XHRcdFx0Y2hhbmdlZCwgcHQyLCBmaXJzdCwgbGFzdCwgbmV4dDtcblx0XHRcdGlmICh0eXBlID09PSBcIl9vbkluaXRBbGxQcm9wc1wiKSB7XG5cdFx0XHRcdC8vc29ydHMgdGhlIFByb3BUd2VlbiBsaW5rZWQgbGlzdCBpbiBvcmRlciBvZiBwcmlvcml0eSBiZWNhdXNlIHNvbWUgcGx1Z2lucyBuZWVkIHRvIHJlbmRlciBlYXJsaWVyL2xhdGVyIHRoYW4gb3RoZXJzLCBsaWtlIE1vdGlvbkJsdXJQbHVnaW4gYXBwbGllcyBpdHMgZWZmZWN0cyBhZnRlciBhbGwgeC95L2FscGhhIHR3ZWVucyBoYXZlIHJlbmRlcmVkIG9uIGVhY2ggZnJhbWUuXG5cdFx0XHRcdHdoaWxlIChwdCkge1xuXHRcdFx0XHRcdG5leHQgPSBwdC5fbmV4dDtcblx0XHRcdFx0XHRwdDIgPSBmaXJzdDtcblx0XHRcdFx0XHR3aGlsZSAocHQyICYmIHB0Mi5wciA+IHB0LnByKSB7XG5cdFx0XHRcdFx0XHRwdDIgPSBwdDIuX25leHQ7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGlmICgocHQuX3ByZXYgPSBwdDIgPyBwdDIuX3ByZXYgOiBsYXN0KSkge1xuXHRcdFx0XHRcdFx0cHQuX3ByZXYuX25leHQgPSBwdDtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0Zmlyc3QgPSBwdDtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0aWYgKChwdC5fbmV4dCA9IHB0MikpIHtcblx0XHRcdFx0XHRcdHB0Mi5fcHJldiA9IHB0O1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRsYXN0ID0gcHQ7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHB0ID0gbmV4dDtcblx0XHRcdFx0fVxuXHRcdFx0XHRwdCA9IHR3ZWVuLl9maXJzdFBUID0gZmlyc3Q7XG5cdFx0XHR9XG5cdFx0XHR3aGlsZSAocHQpIHtcblx0XHRcdFx0aWYgKHB0LnBnKSBpZiAodHlwZW9mKHB0LnRbdHlwZV0pID09PSBcImZ1bmN0aW9uXCIpIGlmIChwdC50W3R5cGVdKCkpIHtcblx0XHRcdFx0XHRjaGFuZ2VkID0gdHJ1ZTtcblx0XHRcdFx0fVxuXHRcdFx0XHRwdCA9IHB0Ll9uZXh0O1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIGNoYW5nZWQ7XG5cdFx0fTtcblxuXHRcdFR3ZWVuUGx1Z2luLmFjdGl2YXRlID0gZnVuY3Rpb24ocGx1Z2lucykge1xuXHRcdFx0dmFyIGkgPSBwbHVnaW5zLmxlbmd0aDtcblx0XHRcdHdoaWxlICgtLWkgPiAtMSkge1xuXHRcdFx0XHRpZiAocGx1Z2luc1tpXS5BUEkgPT09IFR3ZWVuUGx1Z2luLkFQSSkge1xuXHRcdFx0XHRcdF9wbHVnaW5zWyhuZXcgcGx1Z2luc1tpXSgpKS5fcHJvcE5hbWVdID0gcGx1Z2luc1tpXTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fTtcblxuXHRcdC8vcHJvdmlkZXMgYSBtb3JlIGNvbmNpc2Ugd2F5IHRvIGRlZmluZSBwbHVnaW5zIHRoYXQgaGF2ZSBubyBkZXBlbmRlbmNpZXMgYmVzaWRlcyBUd2VlblBsdWdpbiBhbmQgVHdlZW5MaXRlLCB3cmFwcGluZyBjb21tb24gYm9pbGVycGxhdGUgc3R1ZmYgaW50byBvbmUgZnVuY3Rpb24gKGFkZGVkIGluIDEuOS4wKS4gWW91IGRvbid0IE5FRUQgdG8gdXNlIHRoaXMgdG8gZGVmaW5lIGEgcGx1Z2luIC0gdGhlIG9sZCB3YXkgc3RpbGwgd29ya3MgYW5kIGNhbiBiZSB1c2VmdWwgaW4gY2VydGFpbiAocmFyZSkgc2l0dWF0aW9ucy5cblx0XHRfZ3NEZWZpbmUucGx1Z2luID0gZnVuY3Rpb24oY29uZmlnKSB7XG5cdFx0XHRpZiAoIWNvbmZpZyB8fCAhY29uZmlnLnByb3BOYW1lIHx8ICFjb25maWcuaW5pdCB8fCAhY29uZmlnLkFQSSkgeyB0aHJvdyBcImlsbGVnYWwgcGx1Z2luIGRlZmluaXRpb24uXCI7IH1cblx0XHRcdHZhciBwcm9wTmFtZSA9IGNvbmZpZy5wcm9wTmFtZSxcblx0XHRcdFx0cHJpb3JpdHkgPSBjb25maWcucHJpb3JpdHkgfHwgMCxcblx0XHRcdFx0b3ZlcndyaXRlUHJvcHMgPSBjb25maWcub3ZlcndyaXRlUHJvcHMsXG5cdFx0XHRcdG1hcCA9IHtpbml0OlwiX29uSW5pdFR3ZWVuXCIsIHNldDpcInNldFJhdGlvXCIsIGtpbGw6XCJfa2lsbFwiLCByb3VuZDpcIl9tb2RcIiwgbW9kOlwiX21vZFwiLCBpbml0QWxsOlwiX29uSW5pdEFsbFByb3BzXCJ9LFxuXHRcdFx0XHRQbHVnaW4gPSBfY2xhc3MoXCJwbHVnaW5zLlwiICsgcHJvcE5hbWUuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyBwcm9wTmFtZS5zdWJzdHIoMSkgKyBcIlBsdWdpblwiLFxuXHRcdFx0XHRcdGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdFx0VHdlZW5QbHVnaW4uY2FsbCh0aGlzLCBwcm9wTmFtZSwgcHJpb3JpdHkpO1xuXHRcdFx0XHRcdFx0dGhpcy5fb3ZlcndyaXRlUHJvcHMgPSBvdmVyd3JpdGVQcm9wcyB8fCBbXTtcblx0XHRcdFx0XHR9LCAoY29uZmlnLmdsb2JhbCA9PT0gdHJ1ZSkpLFxuXHRcdFx0XHRwID0gUGx1Z2luLnByb3RvdHlwZSA9IG5ldyBUd2VlblBsdWdpbihwcm9wTmFtZSksXG5cdFx0XHRcdHByb3A7XG5cdFx0XHRwLmNvbnN0cnVjdG9yID0gUGx1Z2luO1xuXHRcdFx0UGx1Z2luLkFQSSA9IGNvbmZpZy5BUEk7XG5cdFx0XHRmb3IgKHByb3AgaW4gbWFwKSB7XG5cdFx0XHRcdGlmICh0eXBlb2YoY29uZmlnW3Byb3BdKSA9PT0gXCJmdW5jdGlvblwiKSB7XG5cdFx0XHRcdFx0cFttYXBbcHJvcF1dID0gY29uZmlnW3Byb3BdO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRQbHVnaW4udmVyc2lvbiA9IGNvbmZpZy52ZXJzaW9uO1xuXHRcdFx0VHdlZW5QbHVnaW4uYWN0aXZhdGUoW1BsdWdpbl0pO1xuXHRcdFx0cmV0dXJuIFBsdWdpbjtcblx0XHR9O1xuXG5cblx0XHQvL25vdyBydW4gdGhyb3VnaCBhbGwgdGhlIGRlcGVuZGVuY2llcyBkaXNjb3ZlcmVkIGFuZCBpZiBhbnkgYXJlIG1pc3NpbmcsIGxvZyB0aGF0IHRvIHRoZSBjb25zb2xlIGFzIGEgd2FybmluZy4gVGhpcyBpcyB3aHkgaXQncyBiZXN0IHRvIGhhdmUgVHdlZW5MaXRlIGxvYWQgbGFzdCAtIGl0IGNhbiBjaGVjayBhbGwgdGhlIGRlcGVuZGVuY2llcyBmb3IgeW91LlxuXHRcdGEgPSB3aW5kb3cuX2dzUXVldWU7XG5cdFx0aWYgKGEpIHtcblx0XHRcdGZvciAoaSA9IDA7IGkgPCBhLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRcdGFbaV0oKTtcblx0XHRcdH1cblx0XHRcdGZvciAocCBpbiBfZGVmTG9va3VwKSB7XG5cdFx0XHRcdGlmICghX2RlZkxvb2t1cFtwXS5mdW5jKSB7XG5cdFx0XHRcdFx0d2luZG93LmNvbnNvbGUubG9nKFwiR1NBUCBlbmNvdW50ZXJlZCBtaXNzaW5nIGRlcGVuZGVuY3k6IFwiICsgcCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHRfdGlja2VyQWN0aXZlID0gZmFsc2U7IC8vZW5zdXJlcyB0aGF0IHRoZSBmaXJzdCBvZmZpY2lhbCBhbmltYXRpb24gZm9yY2VzIGEgdGlja2VyLnRpY2soKSB0byB1cGRhdGUgdGhlIHRpbWUgd2hlbiBpdCBpcyBpbnN0YW50aWF0ZWRcblxufSkoKHR5cGVvZihtb2R1bGUpICE9PSBcInVuZGVmaW5lZFwiICYmIG1vZHVsZS5leHBvcnRzICYmIHR5cGVvZihnbG9iYWwpICE9PSBcInVuZGVmaW5lZFwiKSA/IGdsb2JhbCA6IHRoaXMgfHwgd2luZG93LCBcIlR3ZWVuTWF4XCIpOyIsIi8qIVxuICogRGV0ZXJtaW5lIGlmIGFuIG9iamVjdCBpcyBhIEJ1ZmZlclxuICpcbiAqIEBhdXRob3IgICBGZXJvc3MgQWJvdWtoYWRpamVoIDxodHRwczovL2Zlcm9zcy5vcmc+XG4gKiBAbGljZW5zZSAgTUlUXG4gKi9cblxuLy8gVGhlIF9pc0J1ZmZlciBjaGVjayBpcyBmb3IgU2FmYXJpIDUtNyBzdXBwb3J0LCBiZWNhdXNlIGl0J3MgbWlzc2luZ1xuLy8gT2JqZWN0LnByb3RvdHlwZS5jb25zdHJ1Y3Rvci4gUmVtb3ZlIHRoaXMgZXZlbnR1YWxseVxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAob2JqKSB7XG4gIHJldHVybiBvYmogIT0gbnVsbCAmJiAoaXNCdWZmZXIob2JqKSB8fCBpc1Nsb3dCdWZmZXIob2JqKSB8fCAhIW9iai5faXNCdWZmZXIpXG59XG5cbmZ1bmN0aW9uIGlzQnVmZmVyIChvYmopIHtcbiAgcmV0dXJuICEhb2JqLmNvbnN0cnVjdG9yICYmIHR5cGVvZiBvYmouY29uc3RydWN0b3IuaXNCdWZmZXIgPT09ICdmdW5jdGlvbicgJiYgb2JqLmNvbnN0cnVjdG9yLmlzQnVmZmVyKG9iailcbn1cblxuLy8gRm9yIE5vZGUgdjAuMTAgc3VwcG9ydC4gUmVtb3ZlIHRoaXMgZXZlbnR1YWxseS5cbmZ1bmN0aW9uIGlzU2xvd0J1ZmZlciAob2JqKSB7XG4gIHJldHVybiB0eXBlb2Ygb2JqLnJlYWRGbG9hdExFID09PSAnZnVuY3Rpb24nICYmIHR5cGVvZiBvYmouc2xpY2UgPT09ICdmdW5jdGlvbicgJiYgaXNCdWZmZXIob2JqLnNsaWNlKDAsIDApKVxufVxuIiwiLyohXG4gKiBNYXNvbnJ5IHY0LjIuMlxuICogQ2FzY2FkaW5nIGdyaWQgbGF5b3V0IGxpYnJhcnlcbiAqIGh0dHBzOi8vbWFzb25yeS5kZXNhbmRyby5jb21cbiAqIE1JVCBMaWNlbnNlXG4gKiBieSBEYXZpZCBEZVNhbmRyb1xuICovXG5cbiggZnVuY3Rpb24oIHdpbmRvdywgZmFjdG9yeSApIHtcbiAgLy8gdW5pdmVyc2FsIG1vZHVsZSBkZWZpbml0aW9uXG4gIC8qIGpzaGludCBzdHJpY3Q6IGZhbHNlICovIC8qZ2xvYmFscyBkZWZpbmUsIG1vZHVsZSwgcmVxdWlyZSAqL1xuICBpZiAoIHR5cGVvZiBkZWZpbmUgPT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kICkge1xuICAgIC8vIEFNRFxuICAgIGRlZmluZSggW1xuICAgICAgICAnb3V0bGF5ZXIvb3V0bGF5ZXInLFxuICAgICAgICAnZ2V0LXNpemUvZ2V0LXNpemUnXG4gICAgICBdLFxuICAgICAgZmFjdG9yeSApO1xuICB9IGVsc2UgaWYgKCB0eXBlb2YgbW9kdWxlID09ICdvYmplY3QnICYmIG1vZHVsZS5leHBvcnRzICkge1xuICAgIC8vIENvbW1vbkpTXG4gICAgbW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KFxuICAgICAgcmVxdWlyZSgnb3V0bGF5ZXInKSxcbiAgICAgIHJlcXVpcmUoJ2dldC1zaXplJylcbiAgICApO1xuICB9IGVsc2Uge1xuICAgIC8vIGJyb3dzZXIgZ2xvYmFsXG4gICAgd2luZG93Lk1hc29ucnkgPSBmYWN0b3J5KFxuICAgICAgd2luZG93Lk91dGxheWVyLFxuICAgICAgd2luZG93LmdldFNpemVcbiAgICApO1xuICB9XG5cbn0oIHdpbmRvdywgZnVuY3Rpb24gZmFjdG9yeSggT3V0bGF5ZXIsIGdldFNpemUgKSB7XG5cbid1c2Ugc3RyaWN0JztcblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gbWFzb25yeURlZmluaXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gLy9cblxuICAvLyBjcmVhdGUgYW4gT3V0bGF5ZXIgbGF5b3V0IGNsYXNzXG4gIHZhciBNYXNvbnJ5ID0gT3V0bGF5ZXIuY3JlYXRlKCdtYXNvbnJ5Jyk7XG4gIC8vIGlzRml0V2lkdGggLT4gZml0V2lkdGhcbiAgTWFzb25yeS5jb21wYXRPcHRpb25zLmZpdFdpZHRoID0gJ2lzRml0V2lkdGgnO1xuXG4gIHZhciBwcm90byA9IE1hc29ucnkucHJvdG90eXBlO1xuXG4gIHByb3RvLl9yZXNldExheW91dCA9IGZ1bmN0aW9uKCkge1xuICAgIHRoaXMuZ2V0U2l6ZSgpO1xuICAgIHRoaXMuX2dldE1lYXN1cmVtZW50KCAnY29sdW1uV2lkdGgnLCAnb3V0ZXJXaWR0aCcgKTtcbiAgICB0aGlzLl9nZXRNZWFzdXJlbWVudCggJ2d1dHRlcicsICdvdXRlcldpZHRoJyApO1xuICAgIHRoaXMubWVhc3VyZUNvbHVtbnMoKTtcblxuICAgIC8vIHJlc2V0IGNvbHVtbiBZXG4gICAgdGhpcy5jb2xZcyA9IFtdO1xuICAgIGZvciAoIHZhciBpPTA7IGkgPCB0aGlzLmNvbHM7IGkrKyApIHtcbiAgICAgIHRoaXMuY29sWXMucHVzaCggMCApO1xuICAgIH1cblxuICAgIHRoaXMubWF4WSA9IDA7XG4gICAgdGhpcy5ob3Jpem9udGFsQ29sSW5kZXggPSAwO1xuICB9O1xuXG4gIHByb3RvLm1lYXN1cmVDb2x1bW5zID0gZnVuY3Rpb24oKSB7XG4gICAgdGhpcy5nZXRDb250YWluZXJXaWR0aCgpO1xuICAgIC8vIGlmIGNvbHVtbldpZHRoIGlzIDAsIGRlZmF1bHQgdG8gb3V0ZXJXaWR0aCBvZiBmaXJzdCBpdGVtXG4gICAgaWYgKCAhdGhpcy5jb2x1bW5XaWR0aCApIHtcbiAgICAgIHZhciBmaXJzdEl0ZW0gPSB0aGlzLml0ZW1zWzBdO1xuICAgICAgdmFyIGZpcnN0SXRlbUVsZW0gPSBmaXJzdEl0ZW0gJiYgZmlyc3RJdGVtLmVsZW1lbnQ7XG4gICAgICAvLyBjb2x1bW5XaWR0aCBmYWxsIGJhY2sgdG8gaXRlbSBvZiBmaXJzdCBlbGVtZW50XG4gICAgICB0aGlzLmNvbHVtbldpZHRoID0gZmlyc3RJdGVtRWxlbSAmJiBnZXRTaXplKCBmaXJzdEl0ZW1FbGVtICkub3V0ZXJXaWR0aCB8fFxuICAgICAgICAvLyBpZiBmaXJzdCBlbGVtIGhhcyBubyB3aWR0aCwgZGVmYXVsdCB0byBzaXplIG9mIGNvbnRhaW5lclxuICAgICAgICB0aGlzLmNvbnRhaW5lcldpZHRoO1xuICAgIH1cblxuICAgIHZhciBjb2x1bW5XaWR0aCA9IHRoaXMuY29sdW1uV2lkdGggKz0gdGhpcy5ndXR0ZXI7XG5cbiAgICAvLyBjYWxjdWxhdGUgY29sdW1uc1xuICAgIHZhciBjb250YWluZXJXaWR0aCA9IHRoaXMuY29udGFpbmVyV2lkdGggKyB0aGlzLmd1dHRlcjtcbiAgICB2YXIgY29scyA9IGNvbnRhaW5lcldpZHRoIC8gY29sdW1uV2lkdGg7XG4gICAgLy8gZml4IHJvdW5kaW5nIGVycm9ycywgdHlwaWNhbGx5IHdpdGggZ3V0dGVyc1xuICAgIHZhciBleGNlc3MgPSBjb2x1bW5XaWR0aCAtIGNvbnRhaW5lcldpZHRoICUgY29sdW1uV2lkdGg7XG4gICAgLy8gaWYgb3ZlcnNob290IGlzIGxlc3MgdGhhbiBhIHBpeGVsLCByb3VuZCB1cCwgb3RoZXJ3aXNlIGZsb29yIGl0XG4gICAgdmFyIG1hdGhNZXRob2QgPSBleGNlc3MgJiYgZXhjZXNzIDwgMSA/ICdyb3VuZCcgOiAnZmxvb3InO1xuICAgIGNvbHMgPSBNYXRoWyBtYXRoTWV0aG9kIF0oIGNvbHMgKTtcbiAgICB0aGlzLmNvbHMgPSBNYXRoLm1heCggY29scywgMSApO1xuICB9O1xuXG4gIHByb3RvLmdldENvbnRhaW5lcldpZHRoID0gZnVuY3Rpb24oKSB7XG4gICAgLy8gY29udGFpbmVyIGlzIHBhcmVudCBpZiBmaXQgd2lkdGhcbiAgICB2YXIgaXNGaXRXaWR0aCA9IHRoaXMuX2dldE9wdGlvbignZml0V2lkdGgnKTtcbiAgICB2YXIgY29udGFpbmVyID0gaXNGaXRXaWR0aCA/IHRoaXMuZWxlbWVudC5wYXJlbnROb2RlIDogdGhpcy5lbGVtZW50O1xuICAgIC8vIGNoZWNrIHRoYXQgdGhpcy5zaXplIGFuZCBzaXplIGFyZSB0aGVyZVxuICAgIC8vIElFOCB0cmlnZ2VycyByZXNpemUgb24gYm9keSBzaXplIGNoYW5nZSwgc28gdGhleSBtaWdodCBub3QgYmVcbiAgICB2YXIgc2l6ZSA9IGdldFNpemUoIGNvbnRhaW5lciApO1xuICAgIHRoaXMuY29udGFpbmVyV2lkdGggPSBzaXplICYmIHNpemUuaW5uZXJXaWR0aDtcbiAgfTtcblxuICBwcm90by5fZ2V0SXRlbUxheW91dFBvc2l0aW9uID0gZnVuY3Rpb24oIGl0ZW0gKSB7XG4gICAgaXRlbS5nZXRTaXplKCk7XG4gICAgLy8gaG93IG1hbnkgY29sdW1ucyBkb2VzIHRoaXMgYnJpY2sgc3BhblxuICAgIHZhciByZW1haW5kZXIgPSBpdGVtLnNpemUub3V0ZXJXaWR0aCAlIHRoaXMuY29sdW1uV2lkdGg7XG4gICAgdmFyIG1hdGhNZXRob2QgPSByZW1haW5kZXIgJiYgcmVtYWluZGVyIDwgMSA/ICdyb3VuZCcgOiAnY2VpbCc7XG4gICAgLy8gcm91bmQgaWYgb2ZmIGJ5IDEgcGl4ZWwsIG90aGVyd2lzZSB1c2UgY2VpbFxuICAgIHZhciBjb2xTcGFuID0gTWF0aFsgbWF0aE1ldGhvZCBdKCBpdGVtLnNpemUub3V0ZXJXaWR0aCAvIHRoaXMuY29sdW1uV2lkdGggKTtcbiAgICBjb2xTcGFuID0gTWF0aC5taW4oIGNvbFNwYW4sIHRoaXMuY29scyApO1xuICAgIC8vIHVzZSBob3Jpem9udGFsIG9yIHRvcCBjb2x1bW4gcG9zaXRpb25cbiAgICB2YXIgY29sUG9zTWV0aG9kID0gdGhpcy5vcHRpb25zLmhvcml6b250YWxPcmRlciA/XG4gICAgICAnX2dldEhvcml6b250YWxDb2xQb3NpdGlvbicgOiAnX2dldFRvcENvbFBvc2l0aW9uJztcbiAgICB2YXIgY29sUG9zaXRpb24gPSB0aGlzWyBjb2xQb3NNZXRob2QgXSggY29sU3BhbiwgaXRlbSApO1xuICAgIC8vIHBvc2l0aW9uIHRoZSBicmlja1xuICAgIHZhciBwb3NpdGlvbiA9IHtcbiAgICAgIHg6IHRoaXMuY29sdW1uV2lkdGggKiBjb2xQb3NpdGlvbi5jb2wsXG4gICAgICB5OiBjb2xQb3NpdGlvbi55XG4gICAgfTtcbiAgICAvLyBhcHBseSBzZXRIZWlnaHQgdG8gbmVjZXNzYXJ5IGNvbHVtbnNcbiAgICB2YXIgc2V0SGVpZ2h0ID0gY29sUG9zaXRpb24ueSArIGl0ZW0uc2l6ZS5vdXRlckhlaWdodDtcbiAgICB2YXIgc2V0TWF4ID0gY29sU3BhbiArIGNvbFBvc2l0aW9uLmNvbDtcbiAgICBmb3IgKCB2YXIgaSA9IGNvbFBvc2l0aW9uLmNvbDsgaSA8IHNldE1heDsgaSsrICkge1xuICAgICAgdGhpcy5jb2xZc1tpXSA9IHNldEhlaWdodDtcbiAgICB9XG5cbiAgICByZXR1cm4gcG9zaXRpb247XG4gIH07XG5cbiAgcHJvdG8uX2dldFRvcENvbFBvc2l0aW9uID0gZnVuY3Rpb24oIGNvbFNwYW4gKSB7XG4gICAgdmFyIGNvbEdyb3VwID0gdGhpcy5fZ2V0VG9wQ29sR3JvdXAoIGNvbFNwYW4gKTtcbiAgICAvLyBnZXQgdGhlIG1pbmltdW0gWSB2YWx1ZSBmcm9tIHRoZSBjb2x1bW5zXG4gICAgdmFyIG1pbmltdW1ZID0gTWF0aC5taW4uYXBwbHkoIE1hdGgsIGNvbEdyb3VwICk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgY29sOiBjb2xHcm91cC5pbmRleE9mKCBtaW5pbXVtWSApLFxuICAgICAgeTogbWluaW11bVksXG4gICAgfTtcbiAgfTtcblxuICAvKipcbiAgICogQHBhcmFtIHtOdW1iZXJ9IGNvbFNwYW4gLSBudW1iZXIgb2YgY29sdW1ucyB0aGUgZWxlbWVudCBzcGFuc1xuICAgKiBAcmV0dXJucyB7QXJyYXl9IGNvbEdyb3VwXG4gICAqL1xuICBwcm90by5fZ2V0VG9wQ29sR3JvdXAgPSBmdW5jdGlvbiggY29sU3BhbiApIHtcbiAgICBpZiAoIGNvbFNwYW4gPCAyICkge1xuICAgICAgLy8gaWYgYnJpY2sgc3BhbnMgb25seSBvbmUgY29sdW1uLCB1c2UgYWxsIHRoZSBjb2x1bW4gWXNcbiAgICAgIHJldHVybiB0aGlzLmNvbFlzO1xuICAgIH1cblxuICAgIHZhciBjb2xHcm91cCA9IFtdO1xuICAgIC8vIGhvdyBtYW55IGRpZmZlcmVudCBwbGFjZXMgY291bGQgdGhpcyBicmljayBmaXQgaG9yaXpvbnRhbGx5XG4gICAgdmFyIGdyb3VwQ291bnQgPSB0aGlzLmNvbHMgKyAxIC0gY29sU3BhbjtcbiAgICAvLyBmb3IgZWFjaCBncm91cCBwb3RlbnRpYWwgaG9yaXpvbnRhbCBwb3NpdGlvblxuICAgIGZvciAoIHZhciBpID0gMDsgaSA8IGdyb3VwQ291bnQ7IGkrKyApIHtcbiAgICAgIGNvbEdyb3VwW2ldID0gdGhpcy5fZ2V0Q29sR3JvdXBZKCBpLCBjb2xTcGFuICk7XG4gICAgfVxuICAgIHJldHVybiBjb2xHcm91cDtcbiAgfTtcblxuICBwcm90by5fZ2V0Q29sR3JvdXBZID0gZnVuY3Rpb24oIGNvbCwgY29sU3BhbiApIHtcbiAgICBpZiAoIGNvbFNwYW4gPCAyICkge1xuICAgICAgcmV0dXJuIHRoaXMuY29sWXNbIGNvbCBdO1xuICAgIH1cbiAgICAvLyBtYWtlIGFuIGFycmF5IG9mIGNvbFkgdmFsdWVzIGZvciB0aGF0IG9uZSBncm91cFxuICAgIHZhciBncm91cENvbFlzID0gdGhpcy5jb2xZcy5zbGljZSggY29sLCBjb2wgKyBjb2xTcGFuICk7XG4gICAgLy8gYW5kIGdldCB0aGUgbWF4IHZhbHVlIG9mIHRoZSBhcnJheVxuICAgIHJldHVybiBNYXRoLm1heC5hcHBseSggTWF0aCwgZ3JvdXBDb2xZcyApO1xuICB9O1xuXG4gIC8vIGdldCBjb2x1bW4gcG9zaXRpb24gYmFzZWQgb24gaG9yaXpvbnRhbCBpbmRleC4gIzg3M1xuICBwcm90by5fZ2V0SG9yaXpvbnRhbENvbFBvc2l0aW9uID0gZnVuY3Rpb24oIGNvbFNwYW4sIGl0ZW0gKSB7XG4gICAgdmFyIGNvbCA9IHRoaXMuaG9yaXpvbnRhbENvbEluZGV4ICUgdGhpcy5jb2xzO1xuICAgIHZhciBpc092ZXIgPSBjb2xTcGFuID4gMSAmJiBjb2wgKyBjb2xTcGFuID4gdGhpcy5jb2xzO1xuICAgIC8vIHNoaWZ0IHRvIG5leHQgcm93IGlmIGl0ZW0gY2FuJ3QgZml0IG9uIGN1cnJlbnQgcm93XG4gICAgY29sID0gaXNPdmVyID8gMCA6IGNvbDtcbiAgICAvLyBkb24ndCBsZXQgemVyby1zaXplIGl0ZW1zIHRha2UgdXAgc3BhY2VcbiAgICB2YXIgaGFzU2l6ZSA9IGl0ZW0uc2l6ZS5vdXRlcldpZHRoICYmIGl0ZW0uc2l6ZS5vdXRlckhlaWdodDtcbiAgICB0aGlzLmhvcml6b250YWxDb2xJbmRleCA9IGhhc1NpemUgPyBjb2wgKyBjb2xTcGFuIDogdGhpcy5ob3Jpem9udGFsQ29sSW5kZXg7XG5cbiAgICByZXR1cm4ge1xuICAgICAgY29sOiBjb2wsXG4gICAgICB5OiB0aGlzLl9nZXRDb2xHcm91cFkoIGNvbCwgY29sU3BhbiApLFxuICAgIH07XG4gIH07XG5cbiAgcHJvdG8uX21hbmFnZVN0YW1wID0gZnVuY3Rpb24oIHN0YW1wICkge1xuICAgIHZhciBzdGFtcFNpemUgPSBnZXRTaXplKCBzdGFtcCApO1xuICAgIHZhciBvZmZzZXQgPSB0aGlzLl9nZXRFbGVtZW50T2Zmc2V0KCBzdGFtcCApO1xuICAgIC8vIGdldCB0aGUgY29sdW1ucyB0aGF0IHRoaXMgc3RhbXAgYWZmZWN0c1xuICAgIHZhciBpc09yaWdpbkxlZnQgPSB0aGlzLl9nZXRPcHRpb24oJ29yaWdpbkxlZnQnKTtcbiAgICB2YXIgZmlyc3RYID0gaXNPcmlnaW5MZWZ0ID8gb2Zmc2V0LmxlZnQgOiBvZmZzZXQucmlnaHQ7XG4gICAgdmFyIGxhc3RYID0gZmlyc3RYICsgc3RhbXBTaXplLm91dGVyV2lkdGg7XG4gICAgdmFyIGZpcnN0Q29sID0gTWF0aC5mbG9vciggZmlyc3RYIC8gdGhpcy5jb2x1bW5XaWR0aCApO1xuICAgIGZpcnN0Q29sID0gTWF0aC5tYXgoIDAsIGZpcnN0Q29sICk7XG4gICAgdmFyIGxhc3RDb2wgPSBNYXRoLmZsb29yKCBsYXN0WCAvIHRoaXMuY29sdW1uV2lkdGggKTtcbiAgICAvLyBsYXN0Q29sIHNob3VsZCBub3QgZ28gb3ZlciBpZiBtdWx0aXBsZSBvZiBjb2x1bW5XaWR0aCAjNDI1XG4gICAgbGFzdENvbCAtPSBsYXN0WCAlIHRoaXMuY29sdW1uV2lkdGggPyAwIDogMTtcbiAgICBsYXN0Q29sID0gTWF0aC5taW4oIHRoaXMuY29scyAtIDEsIGxhc3RDb2wgKTtcbiAgICAvLyBzZXQgY29sWXMgdG8gYm90dG9tIG9mIHRoZSBzdGFtcFxuXG4gICAgdmFyIGlzT3JpZ2luVG9wID0gdGhpcy5fZ2V0T3B0aW9uKCdvcmlnaW5Ub3AnKTtcbiAgICB2YXIgc3RhbXBNYXhZID0gKCBpc09yaWdpblRvcCA/IG9mZnNldC50b3AgOiBvZmZzZXQuYm90dG9tICkgK1xuICAgICAgc3RhbXBTaXplLm91dGVySGVpZ2h0O1xuICAgIGZvciAoIHZhciBpID0gZmlyc3RDb2w7IGkgPD0gbGFzdENvbDsgaSsrICkge1xuICAgICAgdGhpcy5jb2xZc1tpXSA9IE1hdGgubWF4KCBzdGFtcE1heFksIHRoaXMuY29sWXNbaV0gKTtcbiAgICB9XG4gIH07XG5cbiAgcHJvdG8uX2dldENvbnRhaW5lclNpemUgPSBmdW5jdGlvbigpIHtcbiAgICB0aGlzLm1heFkgPSBNYXRoLm1heC5hcHBseSggTWF0aCwgdGhpcy5jb2xZcyApO1xuICAgIHZhciBzaXplID0ge1xuICAgICAgaGVpZ2h0OiB0aGlzLm1heFlcbiAgICB9O1xuXG4gICAgaWYgKCB0aGlzLl9nZXRPcHRpb24oJ2ZpdFdpZHRoJykgKSB7XG4gICAgICBzaXplLndpZHRoID0gdGhpcy5fZ2V0Q29udGFpbmVyRml0V2lkdGgoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gc2l6ZTtcbiAgfTtcblxuICBwcm90by5fZ2V0Q29udGFpbmVyRml0V2lkdGggPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgdW51c2VkQ29scyA9IDA7XG4gICAgLy8gY291bnQgdW51c2VkIGNvbHVtbnNcbiAgICB2YXIgaSA9IHRoaXMuY29scztcbiAgICB3aGlsZSAoIC0taSApIHtcbiAgICAgIGlmICggdGhpcy5jb2xZc1tpXSAhPT0gMCApIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICB1bnVzZWRDb2xzKys7XG4gICAgfVxuICAgIC8vIGZpdCBjb250YWluZXIgdG8gY29sdW1ucyB0aGF0IGhhdmUgYmVlbiB1c2VkXG4gICAgcmV0dXJuICggdGhpcy5jb2xzIC0gdW51c2VkQ29scyApICogdGhpcy5jb2x1bW5XaWR0aCAtIHRoaXMuZ3V0dGVyO1xuICB9O1xuXG4gIHByb3RvLm5lZWRzUmVzaXplTGF5b3V0ID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHByZXZpb3VzV2lkdGggPSB0aGlzLmNvbnRhaW5lcldpZHRoO1xuICAgIHRoaXMuZ2V0Q29udGFpbmVyV2lkdGgoKTtcbiAgICByZXR1cm4gcHJldmlvdXNXaWR0aCAhPSB0aGlzLmNvbnRhaW5lcldpZHRoO1xuICB9O1xuXG4gIHJldHVybiBNYXNvbnJ5O1xuXG59KSk7XG4iLCIvKipcbiAqIE91dGxheWVyIEl0ZW1cbiAqL1xuXG4oIGZ1bmN0aW9uKCB3aW5kb3csIGZhY3RvcnkgKSB7XG4gIC8vIHVuaXZlcnNhbCBtb2R1bGUgZGVmaW5pdGlvblxuICAvKiBqc2hpbnQgc3RyaWN0OiBmYWxzZSAqLyAvKiBnbG9iYWxzIGRlZmluZSwgbW9kdWxlLCByZXF1aXJlICovXG4gIGlmICggdHlwZW9mIGRlZmluZSA9PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgKSB7XG4gICAgLy8gQU1EIC0gUmVxdWlyZUpTXG4gICAgZGVmaW5lKCBbXG4gICAgICAgICdldi1lbWl0dGVyL2V2LWVtaXR0ZXInLFxuICAgICAgICAnZ2V0LXNpemUvZ2V0LXNpemUnXG4gICAgICBdLFxuICAgICAgZmFjdG9yeVxuICAgICk7XG4gIH0gZWxzZSBpZiAoIHR5cGVvZiBtb2R1bGUgPT0gJ29iamVjdCcgJiYgbW9kdWxlLmV4cG9ydHMgKSB7XG4gICAgLy8gQ29tbW9uSlMgLSBCcm93c2VyaWZ5LCBXZWJwYWNrXG4gICAgbW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KFxuICAgICAgcmVxdWlyZSgnZXYtZW1pdHRlcicpLFxuICAgICAgcmVxdWlyZSgnZ2V0LXNpemUnKVxuICAgICk7XG4gIH0gZWxzZSB7XG4gICAgLy8gYnJvd3NlciBnbG9iYWxcbiAgICB3aW5kb3cuT3V0bGF5ZXIgPSB7fTtcbiAgICB3aW5kb3cuT3V0bGF5ZXIuSXRlbSA9IGZhY3RvcnkoXG4gICAgICB3aW5kb3cuRXZFbWl0dGVyLFxuICAgICAgd2luZG93LmdldFNpemVcbiAgICApO1xuICB9XG5cbn0oIHdpbmRvdywgZnVuY3Rpb24gZmFjdG9yeSggRXZFbWl0dGVyLCBnZXRTaXplICkge1xuJ3VzZSBzdHJpY3QnO1xuXG4vLyAtLS0tLSBoZWxwZXJzIC0tLS0tIC8vXG5cbmZ1bmN0aW9uIGlzRW1wdHlPYmooIG9iaiApIHtcbiAgZm9yICggdmFyIHByb3AgaW4gb2JqICkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBwcm9wID0gbnVsbDtcbiAgcmV0dXJuIHRydWU7XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENTUzMgc3VwcG9ydCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAvL1xuXG5cbnZhciBkb2NFbGVtU3R5bGUgPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc3R5bGU7XG5cbnZhciB0cmFuc2l0aW9uUHJvcGVydHkgPSB0eXBlb2YgZG9jRWxlbVN0eWxlLnRyYW5zaXRpb24gPT0gJ3N0cmluZycgP1xuICAndHJhbnNpdGlvbicgOiAnV2Via2l0VHJhbnNpdGlvbic7XG52YXIgdHJhbnNmb3JtUHJvcGVydHkgPSB0eXBlb2YgZG9jRWxlbVN0eWxlLnRyYW5zZm9ybSA9PSAnc3RyaW5nJyA/XG4gICd0cmFuc2Zvcm0nIDogJ1dlYmtpdFRyYW5zZm9ybSc7XG5cbnZhciB0cmFuc2l0aW9uRW5kRXZlbnQgPSB7XG4gIFdlYmtpdFRyYW5zaXRpb246ICd3ZWJraXRUcmFuc2l0aW9uRW5kJyxcbiAgdHJhbnNpdGlvbjogJ3RyYW5zaXRpb25lbmQnXG59WyB0cmFuc2l0aW9uUHJvcGVydHkgXTtcblxuLy8gY2FjaGUgYWxsIHZlbmRvciBwcm9wZXJ0aWVzIHRoYXQgY291bGQgaGF2ZSB2ZW5kb3IgcHJlZml4XG52YXIgdmVuZG9yUHJvcGVydGllcyA9IHtcbiAgdHJhbnNmb3JtOiB0cmFuc2Zvcm1Qcm9wZXJ0eSxcbiAgdHJhbnNpdGlvbjogdHJhbnNpdGlvblByb3BlcnR5LFxuICB0cmFuc2l0aW9uRHVyYXRpb246IHRyYW5zaXRpb25Qcm9wZXJ0eSArICdEdXJhdGlvbicsXG4gIHRyYW5zaXRpb25Qcm9wZXJ0eTogdHJhbnNpdGlvblByb3BlcnR5ICsgJ1Byb3BlcnR5JyxcbiAgdHJhbnNpdGlvbkRlbGF5OiB0cmFuc2l0aW9uUHJvcGVydHkgKyAnRGVsYXknXG59O1xuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJdGVtIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIC8vXG5cbmZ1bmN0aW9uIEl0ZW0oIGVsZW1lbnQsIGxheW91dCApIHtcbiAgaWYgKCAhZWxlbWVudCApIHtcbiAgICByZXR1cm47XG4gIH1cblxuICB0aGlzLmVsZW1lbnQgPSBlbGVtZW50O1xuICAvLyBwYXJlbnQgbGF5b3V0IGNsYXNzLCBpLmUuIE1hc29ucnksIElzb3RvcGUsIG9yIFBhY2tlcnlcbiAgdGhpcy5sYXlvdXQgPSBsYXlvdXQ7XG4gIHRoaXMucG9zaXRpb24gPSB7XG4gICAgeDogMCxcbiAgICB5OiAwXG4gIH07XG5cbiAgdGhpcy5fY3JlYXRlKCk7XG59XG5cbi8vIGluaGVyaXQgRXZFbWl0dGVyXG52YXIgcHJvdG8gPSBJdGVtLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEV2RW1pdHRlci5wcm90b3R5cGUgKTtcbnByb3RvLmNvbnN0cnVjdG9yID0gSXRlbTtcblxucHJvdG8uX2NyZWF0ZSA9IGZ1bmN0aW9uKCkge1xuICAvLyB0cmFuc2l0aW9uIG9iamVjdHNcbiAgdGhpcy5fdHJhbnNuID0ge1xuICAgIGluZ1Byb3BlcnRpZXM6IHt9LFxuICAgIGNsZWFuOiB7fSxcbiAgICBvbkVuZDoge31cbiAgfTtcblxuICB0aGlzLmNzcyh7XG4gICAgcG9zaXRpb246ICdhYnNvbHV0ZSdcbiAgfSk7XG59O1xuXG4vLyB0cmlnZ2VyIHNwZWNpZmllZCBoYW5kbGVyIGZvciBldmVudCB0eXBlXG5wcm90by5oYW5kbGVFdmVudCA9IGZ1bmN0aW9uKCBldmVudCApIHtcbiAgdmFyIG1ldGhvZCA9ICdvbicgKyBldmVudC50eXBlO1xuICBpZiAoIHRoaXNbIG1ldGhvZCBdICkge1xuICAgIHRoaXNbIG1ldGhvZCBdKCBldmVudCApO1xuICB9XG59O1xuXG5wcm90by5nZXRTaXplID0gZnVuY3Rpb24oKSB7XG4gIHRoaXMuc2l6ZSA9IGdldFNpemUoIHRoaXMuZWxlbWVudCApO1xufTtcblxuLyoqXG4gKiBhcHBseSBDU1Mgc3R5bGVzIHRvIGVsZW1lbnRcbiAqIEBwYXJhbSB7T2JqZWN0fSBzdHlsZVxuICovXG5wcm90by5jc3MgPSBmdW5jdGlvbiggc3R5bGUgKSB7XG4gIHZhciBlbGVtU3R5bGUgPSB0aGlzLmVsZW1lbnQuc3R5bGU7XG5cbiAgZm9yICggdmFyIHByb3AgaW4gc3R5bGUgKSB7XG4gICAgLy8gdXNlIHZlbmRvciBwcm9wZXJ0eSBpZiBhdmFpbGFibGVcbiAgICB2YXIgc3VwcG9ydGVkUHJvcCA9IHZlbmRvclByb3BlcnRpZXNbIHByb3AgXSB8fCBwcm9wO1xuICAgIGVsZW1TdHlsZVsgc3VwcG9ydGVkUHJvcCBdID0gc3R5bGVbIHByb3AgXTtcbiAgfVxufTtcblxuIC8vIG1lYXN1cmUgcG9zaXRpb24sIGFuZCBzZXRzIGl0XG5wcm90by5nZXRQb3NpdGlvbiA9IGZ1bmN0aW9uKCkge1xuICB2YXIgc3R5bGUgPSBnZXRDb21wdXRlZFN0eWxlKCB0aGlzLmVsZW1lbnQgKTtcbiAgdmFyIGlzT3JpZ2luTGVmdCA9IHRoaXMubGF5b3V0Ll9nZXRPcHRpb24oJ29yaWdpbkxlZnQnKTtcbiAgdmFyIGlzT3JpZ2luVG9wID0gdGhpcy5sYXlvdXQuX2dldE9wdGlvbignb3JpZ2luVG9wJyk7XG4gIHZhciB4VmFsdWUgPSBzdHlsZVsgaXNPcmlnaW5MZWZ0ID8gJ2xlZnQnIDogJ3JpZ2h0JyBdO1xuICB2YXIgeVZhbHVlID0gc3R5bGVbIGlzT3JpZ2luVG9wID8gJ3RvcCcgOiAnYm90dG9tJyBdO1xuICB2YXIgeCA9IHBhcnNlRmxvYXQoIHhWYWx1ZSApO1xuICB2YXIgeSA9IHBhcnNlRmxvYXQoIHlWYWx1ZSApO1xuICAvLyBjb252ZXJ0IHBlcmNlbnQgdG8gcGl4ZWxzXG4gIHZhciBsYXlvdXRTaXplID0gdGhpcy5sYXlvdXQuc2l6ZTtcbiAgaWYgKCB4VmFsdWUuaW5kZXhPZignJScpICE9IC0xICkge1xuICAgIHggPSAoIHggLyAxMDAgKSAqIGxheW91dFNpemUud2lkdGg7XG4gIH1cbiAgaWYgKCB5VmFsdWUuaW5kZXhPZignJScpICE9IC0xICkge1xuICAgIHkgPSAoIHkgLyAxMDAgKSAqIGxheW91dFNpemUuaGVpZ2h0O1xuICB9XG4gIC8vIGNsZWFuIHVwICdhdXRvJyBvciBvdGhlciBub24taW50ZWdlciB2YWx1ZXNcbiAgeCA9IGlzTmFOKCB4ICkgPyAwIDogeDtcbiAgeSA9IGlzTmFOKCB5ICkgPyAwIDogeTtcbiAgLy8gcmVtb3ZlIHBhZGRpbmcgZnJvbSBtZWFzdXJlbWVudFxuICB4IC09IGlzT3JpZ2luTGVmdCA/IGxheW91dFNpemUucGFkZGluZ0xlZnQgOiBsYXlvdXRTaXplLnBhZGRpbmdSaWdodDtcbiAgeSAtPSBpc09yaWdpblRvcCA/IGxheW91dFNpemUucGFkZGluZ1RvcCA6IGxheW91dFNpemUucGFkZGluZ0JvdHRvbTtcblxuICB0aGlzLnBvc2l0aW9uLnggPSB4O1xuICB0aGlzLnBvc2l0aW9uLnkgPSB5O1xufTtcblxuLy8gc2V0IHNldHRsZWQgcG9zaXRpb24sIGFwcGx5IHBhZGRpbmdcbnByb3RvLmxheW91dFBvc2l0aW9uID0gZnVuY3Rpb24oKSB7XG4gIHZhciBsYXlvdXRTaXplID0gdGhpcy5sYXlvdXQuc2l6ZTtcbiAgdmFyIHN0eWxlID0ge307XG4gIHZhciBpc09yaWdpbkxlZnQgPSB0aGlzLmxheW91dC5fZ2V0T3B0aW9uKCdvcmlnaW5MZWZ0Jyk7XG4gIHZhciBpc09yaWdpblRvcCA9IHRoaXMubGF5b3V0Ll9nZXRPcHRpb24oJ29yaWdpblRvcCcpO1xuXG4gIC8vIHhcbiAgdmFyIHhQYWRkaW5nID0gaXNPcmlnaW5MZWZ0ID8gJ3BhZGRpbmdMZWZ0JyA6ICdwYWRkaW5nUmlnaHQnO1xuICB2YXIgeFByb3BlcnR5ID0gaXNPcmlnaW5MZWZ0ID8gJ2xlZnQnIDogJ3JpZ2h0JztcbiAgdmFyIHhSZXNldFByb3BlcnR5ID0gaXNPcmlnaW5MZWZ0ID8gJ3JpZ2h0JyA6ICdsZWZ0JztcblxuICB2YXIgeCA9IHRoaXMucG9zaXRpb24ueCArIGxheW91dFNpemVbIHhQYWRkaW5nIF07XG4gIC8vIHNldCBpbiBwZXJjZW50YWdlIG9yIHBpeGVsc1xuICBzdHlsZVsgeFByb3BlcnR5IF0gPSB0aGlzLmdldFhWYWx1ZSggeCApO1xuICAvLyByZXNldCBvdGhlciBwcm9wZXJ0eVxuICBzdHlsZVsgeFJlc2V0UHJvcGVydHkgXSA9ICcnO1xuXG4gIC8vIHlcbiAgdmFyIHlQYWRkaW5nID0gaXNPcmlnaW5Ub3AgPyAncGFkZGluZ1RvcCcgOiAncGFkZGluZ0JvdHRvbSc7XG4gIHZhciB5UHJvcGVydHkgPSBpc09yaWdpblRvcCA/ICd0b3AnIDogJ2JvdHRvbSc7XG4gIHZhciB5UmVzZXRQcm9wZXJ0eSA9IGlzT3JpZ2luVG9wID8gJ2JvdHRvbScgOiAndG9wJztcblxuICB2YXIgeSA9IHRoaXMucG9zaXRpb24ueSArIGxheW91dFNpemVbIHlQYWRkaW5nIF07XG4gIC8vIHNldCBpbiBwZXJjZW50YWdlIG9yIHBpeGVsc1xuICBzdHlsZVsgeVByb3BlcnR5IF0gPSB0aGlzLmdldFlWYWx1ZSggeSApO1xuICAvLyByZXNldCBvdGhlciBwcm9wZXJ0eVxuICBzdHlsZVsgeVJlc2V0UHJvcGVydHkgXSA9ICcnO1xuXG4gIHRoaXMuY3NzKCBzdHlsZSApO1xuICB0aGlzLmVtaXRFdmVudCggJ2xheW91dCcsIFsgdGhpcyBdICk7XG59O1xuXG5wcm90by5nZXRYVmFsdWUgPSBmdW5jdGlvbiggeCApIHtcbiAgdmFyIGlzSG9yaXpvbnRhbCA9IHRoaXMubGF5b3V0Ll9nZXRPcHRpb24oJ2hvcml6b250YWwnKTtcbiAgcmV0dXJuIHRoaXMubGF5b3V0Lm9wdGlvbnMucGVyY2VudFBvc2l0aW9uICYmICFpc0hvcml6b250YWwgP1xuICAgICggKCB4IC8gdGhpcy5sYXlvdXQuc2l6ZS53aWR0aCApICogMTAwICkgKyAnJScgOiB4ICsgJ3B4Jztcbn07XG5cbnByb3RvLmdldFlWYWx1ZSA9IGZ1bmN0aW9uKCB5ICkge1xuICB2YXIgaXNIb3Jpem9udGFsID0gdGhpcy5sYXlvdXQuX2dldE9wdGlvbignaG9yaXpvbnRhbCcpO1xuICByZXR1cm4gdGhpcy5sYXlvdXQub3B0aW9ucy5wZXJjZW50UG9zaXRpb24gJiYgaXNIb3Jpem9udGFsID9cbiAgICAoICggeSAvIHRoaXMubGF5b3V0LnNpemUuaGVpZ2h0ICkgKiAxMDAgKSArICclJyA6IHkgKyAncHgnO1xufTtcblxucHJvdG8uX3RyYW5zaXRpb25UbyA9IGZ1bmN0aW9uKCB4LCB5ICkge1xuICB0aGlzLmdldFBvc2l0aW9uKCk7XG4gIC8vIGdldCBjdXJyZW50IHggJiB5IGZyb20gdG9wL2xlZnRcbiAgdmFyIGN1clggPSB0aGlzLnBvc2l0aW9uLng7XG4gIHZhciBjdXJZID0gdGhpcy5wb3NpdGlvbi55O1xuXG4gIHZhciBkaWROb3RNb3ZlID0geCA9PSB0aGlzLnBvc2l0aW9uLnggJiYgeSA9PSB0aGlzLnBvc2l0aW9uLnk7XG5cbiAgLy8gc2F2ZSBlbmQgcG9zaXRpb25cbiAgdGhpcy5zZXRQb3NpdGlvbiggeCwgeSApO1xuXG4gIC8vIGlmIGRpZCBub3QgbW92ZSBhbmQgbm90IHRyYW5zaXRpb25pbmcsIGp1c3QgZ28gdG8gbGF5b3V0XG4gIGlmICggZGlkTm90TW92ZSAmJiAhdGhpcy5pc1RyYW5zaXRpb25pbmcgKSB7XG4gICAgdGhpcy5sYXlvdXRQb3NpdGlvbigpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHZhciB0cmFuc1ggPSB4IC0gY3VyWDtcbiAgdmFyIHRyYW5zWSA9IHkgLSBjdXJZO1xuICB2YXIgdHJhbnNpdGlvblN0eWxlID0ge307XG4gIHRyYW5zaXRpb25TdHlsZS50cmFuc2Zvcm0gPSB0aGlzLmdldFRyYW5zbGF0ZSggdHJhbnNYLCB0cmFuc1kgKTtcblxuICB0aGlzLnRyYW5zaXRpb24oe1xuICAgIHRvOiB0cmFuc2l0aW9uU3R5bGUsXG4gICAgb25UcmFuc2l0aW9uRW5kOiB7XG4gICAgICB0cmFuc2Zvcm06IHRoaXMubGF5b3V0UG9zaXRpb25cbiAgICB9LFxuICAgIGlzQ2xlYW5pbmc6IHRydWVcbiAgfSk7XG59O1xuXG5wcm90by5nZXRUcmFuc2xhdGUgPSBmdW5jdGlvbiggeCwgeSApIHtcbiAgLy8gZmxpcCBjb29yaWRpbmF0ZXMgaWYgb3JpZ2luIG9uIHJpZ2h0IG9yIGJvdHRvbVxuICB2YXIgaXNPcmlnaW5MZWZ0ID0gdGhpcy5sYXlvdXQuX2dldE9wdGlvbignb3JpZ2luTGVmdCcpO1xuICB2YXIgaXNPcmlnaW5Ub3AgPSB0aGlzLmxheW91dC5fZ2V0T3B0aW9uKCdvcmlnaW5Ub3AnKTtcbiAgeCA9IGlzT3JpZ2luTGVmdCA/IHggOiAteDtcbiAgeSA9IGlzT3JpZ2luVG9wID8geSA6IC15O1xuICByZXR1cm4gJ3RyYW5zbGF0ZTNkKCcgKyB4ICsgJ3B4LCAnICsgeSArICdweCwgMCknO1xufTtcblxuLy8gbm9uIHRyYW5zaXRpb24gKyB0cmFuc2Zvcm0gc3VwcG9ydFxucHJvdG8uZ29UbyA9IGZ1bmN0aW9uKCB4LCB5ICkge1xuICB0aGlzLnNldFBvc2l0aW9uKCB4LCB5ICk7XG4gIHRoaXMubGF5b3V0UG9zaXRpb24oKTtcbn07XG5cbnByb3RvLm1vdmVUbyA9IHByb3RvLl90cmFuc2l0aW9uVG87XG5cbnByb3RvLnNldFBvc2l0aW9uID0gZnVuY3Rpb24oIHgsIHkgKSB7XG4gIHRoaXMucG9zaXRpb24ueCA9IHBhcnNlRmxvYXQoIHggKTtcbiAgdGhpcy5wb3NpdGlvbi55ID0gcGFyc2VGbG9hdCggeSApO1xufTtcblxuLy8gLS0tLS0gdHJhbnNpdGlvbiAtLS0tLSAvL1xuXG4vKipcbiAqIEBwYXJhbSB7T2JqZWN0fSBzdHlsZSAtIENTU1xuICogQHBhcmFtIHtGdW5jdGlvbn0gb25UcmFuc2l0aW9uRW5kXG4gKi9cblxuLy8gbm9uIHRyYW5zaXRpb24sIGp1c3QgdHJpZ2dlciBjYWxsYmFja1xucHJvdG8uX25vblRyYW5zaXRpb24gPSBmdW5jdGlvbiggYXJncyApIHtcbiAgdGhpcy5jc3MoIGFyZ3MudG8gKTtcbiAgaWYgKCBhcmdzLmlzQ2xlYW5pbmcgKSB7XG4gICAgdGhpcy5fcmVtb3ZlU3R5bGVzKCBhcmdzLnRvICk7XG4gIH1cbiAgZm9yICggdmFyIHByb3AgaW4gYXJncy5vblRyYW5zaXRpb25FbmQgKSB7XG4gICAgYXJncy5vblRyYW5zaXRpb25FbmRbIHByb3AgXS5jYWxsKCB0aGlzICk7XG4gIH1cbn07XG5cbi8qKlxuICogcHJvcGVyIHRyYW5zaXRpb25cbiAqIEBwYXJhbSB7T2JqZWN0fSBhcmdzIC0gYXJndW1lbnRzXG4gKiAgIEBwYXJhbSB7T2JqZWN0fSB0byAtIHN0eWxlIHRvIHRyYW5zaXRpb24gdG9cbiAqICAgQHBhcmFtIHtPYmplY3R9IGZyb20gLSBzdHlsZSB0byBzdGFydCB0cmFuc2l0aW9uIGZyb21cbiAqICAgQHBhcmFtIHtCb29sZWFufSBpc0NsZWFuaW5nIC0gcmVtb3ZlcyB0cmFuc2l0aW9uIHN0eWxlcyBhZnRlciB0cmFuc2l0aW9uXG4gKiAgIEBwYXJhbSB7RnVuY3Rpb259IG9uVHJhbnNpdGlvbkVuZCAtIGNhbGxiYWNrXG4gKi9cbnByb3RvLnRyYW5zaXRpb24gPSBmdW5jdGlvbiggYXJncyApIHtcbiAgLy8gcmVkaXJlY3QgdG8gbm9uVHJhbnNpdGlvbiBpZiBubyB0cmFuc2l0aW9uIGR1cmF0aW9uXG4gIGlmICggIXBhcnNlRmxvYXQoIHRoaXMubGF5b3V0Lm9wdGlvbnMudHJhbnNpdGlvbkR1cmF0aW9uICkgKSB7XG4gICAgdGhpcy5fbm9uVHJhbnNpdGlvbiggYXJncyApO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHZhciBfdHJhbnNpdGlvbiA9IHRoaXMuX3RyYW5zbjtcbiAgLy8ga2VlcCB0cmFjayBvZiBvblRyYW5zaXRpb25FbmQgY2FsbGJhY2sgYnkgY3NzIHByb3BlcnR5XG4gIGZvciAoIHZhciBwcm9wIGluIGFyZ3Mub25UcmFuc2l0aW9uRW5kICkge1xuICAgIF90cmFuc2l0aW9uLm9uRW5kWyBwcm9wIF0gPSBhcmdzLm9uVHJhbnNpdGlvbkVuZFsgcHJvcCBdO1xuICB9XG4gIC8vIGtlZXAgdHJhY2sgb2YgcHJvcGVydGllcyB0aGF0IGFyZSB0cmFuc2l0aW9uaW5nXG4gIGZvciAoIHByb3AgaW4gYXJncy50byApIHtcbiAgICBfdHJhbnNpdGlvbi5pbmdQcm9wZXJ0aWVzWyBwcm9wIF0gPSB0cnVlO1xuICAgIC8vIGtlZXAgdHJhY2sgb2YgcHJvcGVydGllcyB0byBjbGVhbiB1cCB3aGVuIHRyYW5zaXRpb24gaXMgZG9uZVxuICAgIGlmICggYXJncy5pc0NsZWFuaW5nICkge1xuICAgICAgX3RyYW5zaXRpb24uY2xlYW5bIHByb3AgXSA9IHRydWU7XG4gICAgfVxuICB9XG5cbiAgLy8gc2V0IGZyb20gc3R5bGVzXG4gIGlmICggYXJncy5mcm9tICkge1xuICAgIHRoaXMuY3NzKCBhcmdzLmZyb20gKTtcbiAgICAvLyBmb3JjZSByZWRyYXcuIGh0dHA6Ly9ibG9nLmFsZXhtYWNjYXcuY29tL2Nzcy10cmFuc2l0aW9uc1xuICAgIHZhciBoID0gdGhpcy5lbGVtZW50Lm9mZnNldEhlaWdodDtcbiAgICAvLyBoYWNrIGZvciBKU0hpbnQgdG8gaHVzaCBhYm91dCB1bnVzZWQgdmFyXG4gICAgaCA9IG51bGw7XG4gIH1cbiAgLy8gZW5hYmxlIHRyYW5zaXRpb25cbiAgdGhpcy5lbmFibGVUcmFuc2l0aW9uKCBhcmdzLnRvICk7XG4gIC8vIHNldCBzdHlsZXMgdGhhdCBhcmUgdHJhbnNpdGlvbmluZ1xuICB0aGlzLmNzcyggYXJncy50byApO1xuXG4gIHRoaXMuaXNUcmFuc2l0aW9uaW5nID0gdHJ1ZTtcblxufTtcblxuLy8gZGFzaCBiZWZvcmUgYWxsIGNhcCBsZXR0ZXJzLCBpbmNsdWRpbmcgZmlyc3QgZm9yXG4vLyBXZWJraXRUcmFuc2Zvcm0gPT4gLXdlYmtpdC10cmFuc2Zvcm1cbmZ1bmN0aW9uIHRvRGFzaGVkQWxsKCBzdHIgKSB7XG4gIHJldHVybiBzdHIucmVwbGFjZSggLyhbQS1aXSkvZywgZnVuY3Rpb24oICQxICkge1xuICAgIHJldHVybiAnLScgKyAkMS50b0xvd2VyQ2FzZSgpO1xuICB9KTtcbn1cblxudmFyIHRyYW5zaXRpb25Qcm9wcyA9ICdvcGFjaXR5LCcgKyB0b0Rhc2hlZEFsbCggdHJhbnNmb3JtUHJvcGVydHkgKTtcblxucHJvdG8uZW5hYmxlVHJhbnNpdGlvbiA9IGZ1bmN0aW9uKC8qIHN0eWxlICovKSB7XG4gIC8vIEhBQ0sgY2hhbmdpbmcgdHJhbnNpdGlvblByb3BlcnR5IGR1cmluZyBhIHRyYW5zaXRpb25cbiAgLy8gd2lsbCBjYXVzZSB0cmFuc2l0aW9uIHRvIGp1bXBcbiAgaWYgKCB0aGlzLmlzVHJhbnNpdGlvbmluZyApIHtcbiAgICByZXR1cm47XG4gIH1cblxuICAvLyBtYWtlIGB0cmFuc2l0aW9uOiBmb28sIGJhciwgYmF6YCBmcm9tIHN0eWxlIG9iamVjdFxuICAvLyBIQUNLIHVuLWNvbW1lbnQgdGhpcyB3aGVuIGVuYWJsZVRyYW5zaXRpb24gY2FuIHdvcmtcbiAgLy8gd2hpbGUgYSB0cmFuc2l0aW9uIGlzIGhhcHBlbmluZ1xuICAvLyB2YXIgdHJhbnNpdGlvblZhbHVlcyA9IFtdO1xuICAvLyBmb3IgKCB2YXIgcHJvcCBpbiBzdHlsZSApIHtcbiAgLy8gICAvLyBkYXNoLWlmeSBjYW1lbENhc2VkIHByb3BlcnRpZXMgbGlrZSBXZWJraXRUcmFuc2l0aW9uXG4gIC8vICAgcHJvcCA9IHZlbmRvclByb3BlcnRpZXNbIHByb3AgXSB8fCBwcm9wO1xuICAvLyAgIHRyYW5zaXRpb25WYWx1ZXMucHVzaCggdG9EYXNoZWRBbGwoIHByb3AgKSApO1xuICAvLyB9XG4gIC8vIG11bmdlIG51bWJlciB0byBtaWxsaXNlY29uZCwgdG8gbWF0Y2ggc3RhZ2dlclxuICB2YXIgZHVyYXRpb24gPSB0aGlzLmxheW91dC5vcHRpb25zLnRyYW5zaXRpb25EdXJhdGlvbjtcbiAgZHVyYXRpb24gPSB0eXBlb2YgZHVyYXRpb24gPT0gJ251bWJlcicgPyBkdXJhdGlvbiArICdtcycgOiBkdXJhdGlvbjtcbiAgLy8gZW5hYmxlIHRyYW5zaXRpb24gc3R5bGVzXG4gIHRoaXMuY3NzKHtcbiAgICB0cmFuc2l0aW9uUHJvcGVydHk6IHRyYW5zaXRpb25Qcm9wcyxcbiAgICB0cmFuc2l0aW9uRHVyYXRpb246IGR1cmF0aW9uLFxuICAgIHRyYW5zaXRpb25EZWxheTogdGhpcy5zdGFnZ2VyRGVsYXkgfHwgMFxuICB9KTtcbiAgLy8gbGlzdGVuIGZvciB0cmFuc2l0aW9uIGVuZCBldmVudFxuICB0aGlzLmVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lciggdHJhbnNpdGlvbkVuZEV2ZW50LCB0aGlzLCBmYWxzZSApO1xufTtcblxuLy8gLS0tLS0gZXZlbnRzIC0tLS0tIC8vXG5cbnByb3RvLm9ud2Via2l0VHJhbnNpdGlvbkVuZCA9IGZ1bmN0aW9uKCBldmVudCApIHtcbiAgdGhpcy5vbnRyYW5zaXRpb25lbmQoIGV2ZW50ICk7XG59O1xuXG5wcm90by5vbm90cmFuc2l0aW9uZW5kID0gZnVuY3Rpb24oIGV2ZW50ICkge1xuICB0aGlzLm9udHJhbnNpdGlvbmVuZCggZXZlbnQgKTtcbn07XG5cbi8vIHByb3BlcnRpZXMgdGhhdCBJIG11bmdlIHRvIG1ha2UgbXkgbGlmZSBlYXNpZXJcbnZhciBkYXNoZWRWZW5kb3JQcm9wZXJ0aWVzID0ge1xuICAnLXdlYmtpdC10cmFuc2Zvcm0nOiAndHJhbnNmb3JtJ1xufTtcblxucHJvdG8ub250cmFuc2l0aW9uZW5kID0gZnVuY3Rpb24oIGV2ZW50ICkge1xuICAvLyBkaXNyZWdhcmQgYnViYmxlZCBldmVudHMgZnJvbSBjaGlsZHJlblxuICBpZiAoIGV2ZW50LnRhcmdldCAhPT0gdGhpcy5lbGVtZW50ICkge1xuICAgIHJldHVybjtcbiAgfVxuICB2YXIgX3RyYW5zaXRpb24gPSB0aGlzLl90cmFuc247XG4gIC8vIGdldCBwcm9wZXJ0eSBuYW1lIG9mIHRyYW5zaXRpb25lZCBwcm9wZXJ0eSwgY29udmVydCB0byBwcmVmaXgtZnJlZVxuICB2YXIgcHJvcGVydHlOYW1lID0gZGFzaGVkVmVuZG9yUHJvcGVydGllc1sgZXZlbnQucHJvcGVydHlOYW1lIF0gfHwgZXZlbnQucHJvcGVydHlOYW1lO1xuXG4gIC8vIHJlbW92ZSBwcm9wZXJ0eSB0aGF0IGhhcyBjb21wbGV0ZWQgdHJhbnNpdGlvbmluZ1xuICBkZWxldGUgX3RyYW5zaXRpb24uaW5nUHJvcGVydGllc1sgcHJvcGVydHlOYW1lIF07XG4gIC8vIGNoZWNrIGlmIGFueSBwcm9wZXJ0aWVzIGFyZSBzdGlsbCB0cmFuc2l0aW9uaW5nXG4gIGlmICggaXNFbXB0eU9iaiggX3RyYW5zaXRpb24uaW5nUHJvcGVydGllcyApICkge1xuICAgIC8vIGFsbCBwcm9wZXJ0aWVzIGhhdmUgY29tcGxldGVkIHRyYW5zaXRpb25pbmdcbiAgICB0aGlzLmRpc2FibGVUcmFuc2l0aW9uKCk7XG4gIH1cbiAgLy8gY2xlYW4gc3R5bGVcbiAgaWYgKCBwcm9wZXJ0eU5hbWUgaW4gX3RyYW5zaXRpb24uY2xlYW4gKSB7XG4gICAgLy8gY2xlYW4gdXAgc3R5bGVcbiAgICB0aGlzLmVsZW1lbnQuc3R5bGVbIGV2ZW50LnByb3BlcnR5TmFtZSBdID0gJyc7XG4gICAgZGVsZXRlIF90cmFuc2l0aW9uLmNsZWFuWyBwcm9wZXJ0eU5hbWUgXTtcbiAgfVxuICAvLyB0cmlnZ2VyIG9uVHJhbnNpdGlvbkVuZCBjYWxsYmFja1xuICBpZiAoIHByb3BlcnR5TmFtZSBpbiBfdHJhbnNpdGlvbi5vbkVuZCApIHtcbiAgICB2YXIgb25UcmFuc2l0aW9uRW5kID0gX3RyYW5zaXRpb24ub25FbmRbIHByb3BlcnR5TmFtZSBdO1xuICAgIG9uVHJhbnNpdGlvbkVuZC5jYWxsKCB0aGlzICk7XG4gICAgZGVsZXRlIF90cmFuc2l0aW9uLm9uRW5kWyBwcm9wZXJ0eU5hbWUgXTtcbiAgfVxuXG4gIHRoaXMuZW1pdEV2ZW50KCAndHJhbnNpdGlvbkVuZCcsIFsgdGhpcyBdICk7XG59O1xuXG5wcm90by5kaXNhYmxlVHJhbnNpdGlvbiA9IGZ1bmN0aW9uKCkge1xuICB0aGlzLnJlbW92ZVRyYW5zaXRpb25TdHlsZXMoKTtcbiAgdGhpcy5lbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoIHRyYW5zaXRpb25FbmRFdmVudCwgdGhpcywgZmFsc2UgKTtcbiAgdGhpcy5pc1RyYW5zaXRpb25pbmcgPSBmYWxzZTtcbn07XG5cbi8qKlxuICogcmVtb3ZlcyBzdHlsZSBwcm9wZXJ0eSBmcm9tIGVsZW1lbnRcbiAqIEBwYXJhbSB7T2JqZWN0fSBzdHlsZVxuKiovXG5wcm90by5fcmVtb3ZlU3R5bGVzID0gZnVuY3Rpb24oIHN0eWxlICkge1xuICAvLyBjbGVhbiB1cCB0cmFuc2l0aW9uIHN0eWxlc1xuICB2YXIgY2xlYW5TdHlsZSA9IHt9O1xuICBmb3IgKCB2YXIgcHJvcCBpbiBzdHlsZSApIHtcbiAgICBjbGVhblN0eWxlWyBwcm9wIF0gPSAnJztcbiAgfVxuICB0aGlzLmNzcyggY2xlYW5TdHlsZSApO1xufTtcblxudmFyIGNsZWFuVHJhbnNpdGlvblN0eWxlID0ge1xuICB0cmFuc2l0aW9uUHJvcGVydHk6ICcnLFxuICB0cmFuc2l0aW9uRHVyYXRpb246ICcnLFxuICB0cmFuc2l0aW9uRGVsYXk6ICcnXG59O1xuXG5wcm90by5yZW1vdmVUcmFuc2l0aW9uU3R5bGVzID0gZnVuY3Rpb24oKSB7XG4gIC8vIHJlbW92ZSB0cmFuc2l0aW9uXG4gIHRoaXMuY3NzKCBjbGVhblRyYW5zaXRpb25TdHlsZSApO1xufTtcblxuLy8gLS0tLS0gc3RhZ2dlciAtLS0tLSAvL1xuXG5wcm90by5zdGFnZ2VyID0gZnVuY3Rpb24oIGRlbGF5ICkge1xuICBkZWxheSA9IGlzTmFOKCBkZWxheSApID8gMCA6IGRlbGF5O1xuICB0aGlzLnN0YWdnZXJEZWxheSA9IGRlbGF5ICsgJ21zJztcbn07XG5cbi8vIC0tLS0tIHNob3cvaGlkZS9yZW1vdmUgLS0tLS0gLy9cblxuLy8gcmVtb3ZlIGVsZW1lbnQgZnJvbSBET01cbnByb3RvLnJlbW92ZUVsZW0gPSBmdW5jdGlvbigpIHtcbiAgdGhpcy5lbGVtZW50LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoIHRoaXMuZWxlbWVudCApO1xuICAvLyByZW1vdmUgZGlzcGxheTogbm9uZVxuICB0aGlzLmNzcyh7IGRpc3BsYXk6ICcnIH0pO1xuICB0aGlzLmVtaXRFdmVudCggJ3JlbW92ZScsIFsgdGhpcyBdICk7XG59O1xuXG5wcm90by5yZW1vdmUgPSBmdW5jdGlvbigpIHtcbiAgLy8ganVzdCByZW1vdmUgZWxlbWVudCBpZiBubyB0cmFuc2l0aW9uIHN1cHBvcnQgb3Igbm8gdHJhbnNpdGlvblxuICBpZiAoICF0cmFuc2l0aW9uUHJvcGVydHkgfHwgIXBhcnNlRmxvYXQoIHRoaXMubGF5b3V0Lm9wdGlvbnMudHJhbnNpdGlvbkR1cmF0aW9uICkgKSB7XG4gICAgdGhpcy5yZW1vdmVFbGVtKCk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLy8gc3RhcnQgdHJhbnNpdGlvblxuICB0aGlzLm9uY2UoICd0cmFuc2l0aW9uRW5kJywgZnVuY3Rpb24oKSB7XG4gICAgdGhpcy5yZW1vdmVFbGVtKCk7XG4gIH0pO1xuICB0aGlzLmhpZGUoKTtcbn07XG5cbnByb3RvLnJldmVhbCA9IGZ1bmN0aW9uKCkge1xuICBkZWxldGUgdGhpcy5pc0hpZGRlbjtcbiAgLy8gcmVtb3ZlIGRpc3BsYXk6IG5vbmVcbiAgdGhpcy5jc3MoeyBkaXNwbGF5OiAnJyB9KTtcblxuICB2YXIgb3B0aW9ucyA9IHRoaXMubGF5b3V0Lm9wdGlvbnM7XG5cbiAgdmFyIG9uVHJhbnNpdGlvbkVuZCA9IHt9O1xuICB2YXIgdHJhbnNpdGlvbkVuZFByb3BlcnR5ID0gdGhpcy5nZXRIaWRlUmV2ZWFsVHJhbnNpdGlvbkVuZFByb3BlcnR5KCd2aXNpYmxlU3R5bGUnKTtcbiAgb25UcmFuc2l0aW9uRW5kWyB0cmFuc2l0aW9uRW5kUHJvcGVydHkgXSA9IHRoaXMub25SZXZlYWxUcmFuc2l0aW9uRW5kO1xuXG4gIHRoaXMudHJhbnNpdGlvbih7XG4gICAgZnJvbTogb3B0aW9ucy5oaWRkZW5TdHlsZSxcbiAgICB0bzogb3B0aW9ucy52aXNpYmxlU3R5bGUsXG4gICAgaXNDbGVhbmluZzogdHJ1ZSxcbiAgICBvblRyYW5zaXRpb25FbmQ6IG9uVHJhbnNpdGlvbkVuZFxuICB9KTtcbn07XG5cbnByb3RvLm9uUmV2ZWFsVHJhbnNpdGlvbkVuZCA9IGZ1bmN0aW9uKCkge1xuICAvLyBjaGVjayBpZiBzdGlsbCB2aXNpYmxlXG4gIC8vIGR1cmluZyB0cmFuc2l0aW9uLCBpdGVtIG1heSBoYXZlIGJlZW4gaGlkZGVuXG4gIGlmICggIXRoaXMuaXNIaWRkZW4gKSB7XG4gICAgdGhpcy5lbWl0RXZlbnQoJ3JldmVhbCcpO1xuICB9XG59O1xuXG4vKipcbiAqIGdldCBzdHlsZSBwcm9wZXJ0eSB1c2UgZm9yIGhpZGUvcmV2ZWFsIHRyYW5zaXRpb24gZW5kXG4gKiBAcGFyYW0ge1N0cmluZ30gc3R5bGVQcm9wZXJ0eSAtIGhpZGRlblN0eWxlL3Zpc2libGVTdHlsZVxuICogQHJldHVybnMge1N0cmluZ31cbiAqL1xucHJvdG8uZ2V0SGlkZVJldmVhbFRyYW5zaXRpb25FbmRQcm9wZXJ0eSA9IGZ1bmN0aW9uKCBzdHlsZVByb3BlcnR5ICkge1xuICB2YXIgb3B0aW9uU3R5bGUgPSB0aGlzLmxheW91dC5vcHRpb25zWyBzdHlsZVByb3BlcnR5IF07XG4gIC8vIHVzZSBvcGFjaXR5XG4gIGlmICggb3B0aW9uU3R5bGUub3BhY2l0eSApIHtcbiAgICByZXR1cm4gJ29wYWNpdHknO1xuICB9XG4gIC8vIGdldCBmaXJzdCBwcm9wZXJ0eVxuICBmb3IgKCB2YXIgcHJvcCBpbiBvcHRpb25TdHlsZSApIHtcbiAgICByZXR1cm4gcHJvcDtcbiAgfVxufTtcblxucHJvdG8uaGlkZSA9IGZ1bmN0aW9uKCkge1xuICAvLyBzZXQgZmxhZ1xuICB0aGlzLmlzSGlkZGVuID0gdHJ1ZTtcbiAgLy8gcmVtb3ZlIGRpc3BsYXk6IG5vbmVcbiAgdGhpcy5jc3MoeyBkaXNwbGF5OiAnJyB9KTtcblxuICB2YXIgb3B0aW9ucyA9IHRoaXMubGF5b3V0Lm9wdGlvbnM7XG5cbiAgdmFyIG9uVHJhbnNpdGlvbkVuZCA9IHt9O1xuICB2YXIgdHJhbnNpdGlvbkVuZFByb3BlcnR5ID0gdGhpcy5nZXRIaWRlUmV2ZWFsVHJhbnNpdGlvbkVuZFByb3BlcnR5KCdoaWRkZW5TdHlsZScpO1xuICBvblRyYW5zaXRpb25FbmRbIHRyYW5zaXRpb25FbmRQcm9wZXJ0eSBdID0gdGhpcy5vbkhpZGVUcmFuc2l0aW9uRW5kO1xuXG4gIHRoaXMudHJhbnNpdGlvbih7XG4gICAgZnJvbTogb3B0aW9ucy52aXNpYmxlU3R5bGUsXG4gICAgdG86IG9wdGlvbnMuaGlkZGVuU3R5bGUsXG4gICAgLy8ga2VlcCBoaWRkZW4gc3R1ZmYgaGlkZGVuXG4gICAgaXNDbGVhbmluZzogdHJ1ZSxcbiAgICBvblRyYW5zaXRpb25FbmQ6IG9uVHJhbnNpdGlvbkVuZFxuICB9KTtcbn07XG5cbnByb3RvLm9uSGlkZVRyYW5zaXRpb25FbmQgPSBmdW5jdGlvbigpIHtcbiAgLy8gY2hlY2sgaWYgc3RpbGwgaGlkZGVuXG4gIC8vIGR1cmluZyB0cmFuc2l0aW9uLCBpdGVtIG1heSBoYXZlIGJlZW4gdW4taGlkZGVuXG4gIGlmICggdGhpcy5pc0hpZGRlbiApIHtcbiAgICB0aGlzLmNzcyh7IGRpc3BsYXk6ICdub25lJyB9KTtcbiAgICB0aGlzLmVtaXRFdmVudCgnaGlkZScpO1xuICB9XG59O1xuXG5wcm90by5kZXN0cm95ID0gZnVuY3Rpb24oKSB7XG4gIHRoaXMuY3NzKHtcbiAgICBwb3NpdGlvbjogJycsXG4gICAgbGVmdDogJycsXG4gICAgcmlnaHQ6ICcnLFxuICAgIHRvcDogJycsXG4gICAgYm90dG9tOiAnJyxcbiAgICB0cmFuc2l0aW9uOiAnJyxcbiAgICB0cmFuc2Zvcm06ICcnXG4gIH0pO1xufTtcblxucmV0dXJuIEl0ZW07XG5cbn0pKTtcbiIsIi8qIVxuICogT3V0bGF5ZXIgdjIuMS4xXG4gKiB0aGUgYnJhaW5zIGFuZCBndXRzIG9mIGEgbGF5b3V0IGxpYnJhcnlcbiAqIE1JVCBsaWNlbnNlXG4gKi9cblxuKCBmdW5jdGlvbiggd2luZG93LCBmYWN0b3J5ICkge1xuICAndXNlIHN0cmljdCc7XG4gIC8vIHVuaXZlcnNhbCBtb2R1bGUgZGVmaW5pdGlvblxuICAvKiBqc2hpbnQgc3RyaWN0OiBmYWxzZSAqLyAvKiBnbG9iYWxzIGRlZmluZSwgbW9kdWxlLCByZXF1aXJlICovXG4gIGlmICggdHlwZW9mIGRlZmluZSA9PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgKSB7XG4gICAgLy8gQU1EIC0gUmVxdWlyZUpTXG4gICAgZGVmaW5lKCBbXG4gICAgICAgICdldi1lbWl0dGVyL2V2LWVtaXR0ZXInLFxuICAgICAgICAnZ2V0LXNpemUvZ2V0LXNpemUnLFxuICAgICAgICAnZml6enktdWktdXRpbHMvdXRpbHMnLFxuICAgICAgICAnLi9pdGVtJ1xuICAgICAgXSxcbiAgICAgIGZ1bmN0aW9uKCBFdkVtaXR0ZXIsIGdldFNpemUsIHV0aWxzLCBJdGVtICkge1xuICAgICAgICByZXR1cm4gZmFjdG9yeSggd2luZG93LCBFdkVtaXR0ZXIsIGdldFNpemUsIHV0aWxzLCBJdGVtKTtcbiAgICAgIH1cbiAgICApO1xuICB9IGVsc2UgaWYgKCB0eXBlb2YgbW9kdWxlID09ICdvYmplY3QnICYmIG1vZHVsZS5leHBvcnRzICkge1xuICAgIC8vIENvbW1vbkpTIC0gQnJvd3NlcmlmeSwgV2VicGFja1xuICAgIG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeShcbiAgICAgIHdpbmRvdyxcbiAgICAgIHJlcXVpcmUoJ2V2LWVtaXR0ZXInKSxcbiAgICAgIHJlcXVpcmUoJ2dldC1zaXplJyksXG4gICAgICByZXF1aXJlKCdmaXp6eS11aS11dGlscycpLFxuICAgICAgcmVxdWlyZSgnLi9pdGVtJylcbiAgICApO1xuICB9IGVsc2Uge1xuICAgIC8vIGJyb3dzZXIgZ2xvYmFsXG4gICAgd2luZG93Lk91dGxheWVyID0gZmFjdG9yeShcbiAgICAgIHdpbmRvdyxcbiAgICAgIHdpbmRvdy5FdkVtaXR0ZXIsXG4gICAgICB3aW5kb3cuZ2V0U2l6ZSxcbiAgICAgIHdpbmRvdy5maXp6eVVJVXRpbHMsXG4gICAgICB3aW5kb3cuT3V0bGF5ZXIuSXRlbVxuICAgICk7XG4gIH1cblxufSggd2luZG93LCBmdW5jdGlvbiBmYWN0b3J5KCB3aW5kb3csIEV2RW1pdHRlciwgZ2V0U2l6ZSwgdXRpbHMsIEl0ZW0gKSB7XG4ndXNlIHN0cmljdCc7XG5cbi8vIC0tLS0tIHZhcnMgLS0tLS0gLy9cblxudmFyIGNvbnNvbGUgPSB3aW5kb3cuY29uc29sZTtcbnZhciBqUXVlcnkgPSB3aW5kb3cualF1ZXJ5O1xudmFyIG5vb3AgPSBmdW5jdGlvbigpIHt9O1xuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBPdXRsYXllciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAvL1xuXG4vLyBnbG9iYWxseSB1bmlxdWUgaWRlbnRpZmllcnNcbnZhciBHVUlEID0gMDtcbi8vIGludGVybmFsIHN0b3JlIG9mIGFsbCBPdXRsYXllciBpbnRhbmNlc1xudmFyIGluc3RhbmNlcyA9IHt9O1xuXG5cbi8qKlxuICogQHBhcmFtIHtFbGVtZW50LCBTdHJpbmd9IGVsZW1lbnRcbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zXG4gKiBAY29uc3RydWN0b3JcbiAqL1xuZnVuY3Rpb24gT3V0bGF5ZXIoIGVsZW1lbnQsIG9wdGlvbnMgKSB7XG4gIHZhciBxdWVyeUVsZW1lbnQgPSB1dGlscy5nZXRRdWVyeUVsZW1lbnQoIGVsZW1lbnQgKTtcbiAgaWYgKCAhcXVlcnlFbGVtZW50ICkge1xuICAgIGlmICggY29uc29sZSApIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoICdCYWQgZWxlbWVudCBmb3IgJyArIHRoaXMuY29uc3RydWN0b3IubmFtZXNwYWNlICtcbiAgICAgICAgJzogJyArICggcXVlcnlFbGVtZW50IHx8IGVsZW1lbnQgKSApO1xuICAgIH1cbiAgICByZXR1cm47XG4gIH1cbiAgdGhpcy5lbGVtZW50ID0gcXVlcnlFbGVtZW50O1xuICAvLyBhZGQgalF1ZXJ5XG4gIGlmICggalF1ZXJ5ICkge1xuICAgIHRoaXMuJGVsZW1lbnQgPSBqUXVlcnkoIHRoaXMuZWxlbWVudCApO1xuICB9XG5cbiAgLy8gb3B0aW9uc1xuICB0aGlzLm9wdGlvbnMgPSB1dGlscy5leHRlbmQoIHt9LCB0aGlzLmNvbnN0cnVjdG9yLmRlZmF1bHRzICk7XG4gIHRoaXMub3B0aW9uKCBvcHRpb25zICk7XG5cbiAgLy8gYWRkIGlkIGZvciBPdXRsYXllci5nZXRGcm9tRWxlbWVudFxuICB2YXIgaWQgPSArK0dVSUQ7XG4gIHRoaXMuZWxlbWVudC5vdXRsYXllckdVSUQgPSBpZDsgLy8gZXhwYW5kb1xuICBpbnN0YW5jZXNbIGlkIF0gPSB0aGlzOyAvLyBhc3NvY2lhdGUgdmlhIGlkXG5cbiAgLy8ga2ljayBpdCBvZmZcbiAgdGhpcy5fY3JlYXRlKCk7XG5cbiAgdmFyIGlzSW5pdExheW91dCA9IHRoaXMuX2dldE9wdGlvbignaW5pdExheW91dCcpO1xuICBpZiAoIGlzSW5pdExheW91dCApIHtcbiAgICB0aGlzLmxheW91dCgpO1xuICB9XG59XG5cbi8vIHNldHRpbmdzIGFyZSBmb3IgaW50ZXJuYWwgdXNlIG9ubHlcbk91dGxheWVyLm5hbWVzcGFjZSA9ICdvdXRsYXllcic7XG5PdXRsYXllci5JdGVtID0gSXRlbTtcblxuLy8gZGVmYXVsdCBvcHRpb25zXG5PdXRsYXllci5kZWZhdWx0cyA9IHtcbiAgY29udGFpbmVyU3R5bGU6IHtcbiAgICBwb3NpdGlvbjogJ3JlbGF0aXZlJ1xuICB9LFxuICBpbml0TGF5b3V0OiB0cnVlLFxuICBvcmlnaW5MZWZ0OiB0cnVlLFxuICBvcmlnaW5Ub3A6IHRydWUsXG4gIHJlc2l6ZTogdHJ1ZSxcbiAgcmVzaXplQ29udGFpbmVyOiB0cnVlLFxuICAvLyBpdGVtIG9wdGlvbnNcbiAgdHJhbnNpdGlvbkR1cmF0aW9uOiAnMC40cycsXG4gIGhpZGRlblN0eWxlOiB7XG4gICAgb3BhY2l0eTogMCxcbiAgICB0cmFuc2Zvcm06ICdzY2FsZSgwLjAwMSknXG4gIH0sXG4gIHZpc2libGVTdHlsZToge1xuICAgIG9wYWNpdHk6IDEsXG4gICAgdHJhbnNmb3JtOiAnc2NhbGUoMSknXG4gIH1cbn07XG5cbnZhciBwcm90byA9IE91dGxheWVyLnByb3RvdHlwZTtcbi8vIGluaGVyaXQgRXZFbWl0dGVyXG51dGlscy5leHRlbmQoIHByb3RvLCBFdkVtaXR0ZXIucHJvdG90eXBlICk7XG5cbi8qKlxuICogc2V0IG9wdGlvbnNcbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRzXG4gKi9cbnByb3RvLm9wdGlvbiA9IGZ1bmN0aW9uKCBvcHRzICkge1xuICB1dGlscy5leHRlbmQoIHRoaXMub3B0aW9ucywgb3B0cyApO1xufTtcblxuLyoqXG4gKiBnZXQgYmFja3dhcmRzIGNvbXBhdGlibGUgb3B0aW9uIHZhbHVlLCBjaGVjayBvbGQgbmFtZVxuICovXG5wcm90by5fZ2V0T3B0aW9uID0gZnVuY3Rpb24oIG9wdGlvbiApIHtcbiAgdmFyIG9sZE9wdGlvbiA9IHRoaXMuY29uc3RydWN0b3IuY29tcGF0T3B0aW9uc1sgb3B0aW9uIF07XG4gIHJldHVybiBvbGRPcHRpb24gJiYgdGhpcy5vcHRpb25zWyBvbGRPcHRpb24gXSAhPT0gdW5kZWZpbmVkID9cbiAgICB0aGlzLm9wdGlvbnNbIG9sZE9wdGlvbiBdIDogdGhpcy5vcHRpb25zWyBvcHRpb24gXTtcbn07XG5cbk91dGxheWVyLmNvbXBhdE9wdGlvbnMgPSB7XG4gIC8vIGN1cnJlbnROYW1lOiBvbGROYW1lXG4gIGluaXRMYXlvdXQ6ICdpc0luaXRMYXlvdXQnLFxuICBob3Jpem9udGFsOiAnaXNIb3Jpem9udGFsJyxcbiAgbGF5b3V0SW5zdGFudDogJ2lzTGF5b3V0SW5zdGFudCcsXG4gIG9yaWdpbkxlZnQ6ICdpc09yaWdpbkxlZnQnLFxuICBvcmlnaW5Ub3A6ICdpc09yaWdpblRvcCcsXG4gIHJlc2l6ZTogJ2lzUmVzaXplQm91bmQnLFxuICByZXNpemVDb250YWluZXI6ICdpc1Jlc2l6aW5nQ29udGFpbmVyJ1xufTtcblxucHJvdG8uX2NyZWF0ZSA9IGZ1bmN0aW9uKCkge1xuICAvLyBnZXQgaXRlbXMgZnJvbSBjaGlsZHJlblxuICB0aGlzLnJlbG9hZEl0ZW1zKCk7XG4gIC8vIGVsZW1lbnRzIHRoYXQgYWZmZWN0IGxheW91dCwgYnV0IGFyZSBub3QgbGFpZCBvdXRcbiAgdGhpcy5zdGFtcHMgPSBbXTtcbiAgdGhpcy5zdGFtcCggdGhpcy5vcHRpb25zLnN0YW1wICk7XG4gIC8vIHNldCBjb250YWluZXIgc3R5bGVcbiAgdXRpbHMuZXh0ZW5kKCB0aGlzLmVsZW1lbnQuc3R5bGUsIHRoaXMub3B0aW9ucy5jb250YWluZXJTdHlsZSApO1xuXG4gIC8vIGJpbmQgcmVzaXplIG1ldGhvZFxuICB2YXIgY2FuQmluZFJlc2l6ZSA9IHRoaXMuX2dldE9wdGlvbigncmVzaXplJyk7XG4gIGlmICggY2FuQmluZFJlc2l6ZSApIHtcbiAgICB0aGlzLmJpbmRSZXNpemUoKTtcbiAgfVxufTtcblxuLy8gZ29lcyB0aHJvdWdoIGFsbCBjaGlsZHJlbiBhZ2FpbiBhbmQgZ2V0cyBicmlja3MgaW4gcHJvcGVyIG9yZGVyXG5wcm90by5yZWxvYWRJdGVtcyA9IGZ1bmN0aW9uKCkge1xuICAvLyBjb2xsZWN0aW9uIG9mIGl0ZW0gZWxlbWVudHNcbiAgdGhpcy5pdGVtcyA9IHRoaXMuX2l0ZW1pemUoIHRoaXMuZWxlbWVudC5jaGlsZHJlbiApO1xufTtcblxuXG4vKipcbiAqIHR1cm4gZWxlbWVudHMgaW50byBPdXRsYXllci5JdGVtcyB0byBiZSB1c2VkIGluIGxheW91dFxuICogQHBhcmFtIHtBcnJheSBvciBOb2RlTGlzdCBvciBIVE1MRWxlbWVudH0gZWxlbXNcbiAqIEByZXR1cm5zIHtBcnJheX0gaXRlbXMgLSBjb2xsZWN0aW9uIG9mIG5ldyBPdXRsYXllciBJdGVtc1xuICovXG5wcm90by5faXRlbWl6ZSA9IGZ1bmN0aW9uKCBlbGVtcyApIHtcblxuICB2YXIgaXRlbUVsZW1zID0gdGhpcy5fZmlsdGVyRmluZEl0ZW1FbGVtZW50cyggZWxlbXMgKTtcbiAgdmFyIEl0ZW0gPSB0aGlzLmNvbnN0cnVjdG9yLkl0ZW07XG5cbiAgLy8gY3JlYXRlIG5ldyBPdXRsYXllciBJdGVtcyBmb3IgY29sbGVjdGlvblxuICB2YXIgaXRlbXMgPSBbXTtcbiAgZm9yICggdmFyIGk9MDsgaSA8IGl0ZW1FbGVtcy5sZW5ndGg7IGkrKyApIHtcbiAgICB2YXIgZWxlbSA9IGl0ZW1FbGVtc1tpXTtcbiAgICB2YXIgaXRlbSA9IG5ldyBJdGVtKCBlbGVtLCB0aGlzICk7XG4gICAgaXRlbXMucHVzaCggaXRlbSApO1xuICB9XG5cbiAgcmV0dXJuIGl0ZW1zO1xufTtcblxuLyoqXG4gKiBnZXQgaXRlbSBlbGVtZW50cyB0byBiZSB1c2VkIGluIGxheW91dFxuICogQHBhcmFtIHtBcnJheSBvciBOb2RlTGlzdCBvciBIVE1MRWxlbWVudH0gZWxlbXNcbiAqIEByZXR1cm5zIHtBcnJheX0gaXRlbXMgLSBpdGVtIGVsZW1lbnRzXG4gKi9cbnByb3RvLl9maWx0ZXJGaW5kSXRlbUVsZW1lbnRzID0gZnVuY3Rpb24oIGVsZW1zICkge1xuICByZXR1cm4gdXRpbHMuZmlsdGVyRmluZEVsZW1lbnRzKCBlbGVtcywgdGhpcy5vcHRpb25zLml0ZW1TZWxlY3RvciApO1xufTtcblxuLyoqXG4gKiBnZXR0ZXIgbWV0aG9kIGZvciBnZXR0aW5nIGl0ZW0gZWxlbWVudHNcbiAqIEByZXR1cm5zIHtBcnJheX0gZWxlbXMgLSBjb2xsZWN0aW9uIG9mIGl0ZW0gZWxlbWVudHNcbiAqL1xucHJvdG8uZ2V0SXRlbUVsZW1lbnRzID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiB0aGlzLml0ZW1zLm1hcCggZnVuY3Rpb24oIGl0ZW0gKSB7XG4gICAgcmV0dXJuIGl0ZW0uZWxlbWVudDtcbiAgfSk7XG59O1xuXG4vLyAtLS0tLSBpbml0ICYgbGF5b3V0IC0tLS0tIC8vXG5cbi8qKlxuICogbGF5cyBvdXQgYWxsIGl0ZW1zXG4gKi9cbnByb3RvLmxheW91dCA9IGZ1bmN0aW9uKCkge1xuICB0aGlzLl9yZXNldExheW91dCgpO1xuICB0aGlzLl9tYW5hZ2VTdGFtcHMoKTtcblxuICAvLyBkb24ndCBhbmltYXRlIGZpcnN0IGxheW91dFxuICB2YXIgbGF5b3V0SW5zdGFudCA9IHRoaXMuX2dldE9wdGlvbignbGF5b3V0SW5zdGFudCcpO1xuICB2YXIgaXNJbnN0YW50ID0gbGF5b3V0SW5zdGFudCAhPT0gdW5kZWZpbmVkID9cbiAgICBsYXlvdXRJbnN0YW50IDogIXRoaXMuX2lzTGF5b3V0SW5pdGVkO1xuICB0aGlzLmxheW91dEl0ZW1zKCB0aGlzLml0ZW1zLCBpc0luc3RhbnQgKTtcblxuICAvLyBmbGFnIGZvciBpbml0YWxpemVkXG4gIHRoaXMuX2lzTGF5b3V0SW5pdGVkID0gdHJ1ZTtcbn07XG5cbi8vIF9pbml0IGlzIGFsaWFzIGZvciBsYXlvdXRcbnByb3RvLl9pbml0ID0gcHJvdG8ubGF5b3V0O1xuXG4vKipcbiAqIGxvZ2ljIGJlZm9yZSBhbnkgbmV3IGxheW91dFxuICovXG5wcm90by5fcmVzZXRMYXlvdXQgPSBmdW5jdGlvbigpIHtcbiAgdGhpcy5nZXRTaXplKCk7XG59O1xuXG5cbnByb3RvLmdldFNpemUgPSBmdW5jdGlvbigpIHtcbiAgdGhpcy5zaXplID0gZ2V0U2l6ZSggdGhpcy5lbGVtZW50ICk7XG59O1xuXG4vKipcbiAqIGdldCBtZWFzdXJlbWVudCBmcm9tIG9wdGlvbiwgZm9yIGNvbHVtbldpZHRoLCByb3dIZWlnaHQsIGd1dHRlclxuICogaWYgb3B0aW9uIGlzIFN0cmluZyAtPiBnZXQgZWxlbWVudCBmcm9tIHNlbGVjdG9yIHN0cmluZywgJiBnZXQgc2l6ZSBvZiBlbGVtZW50XG4gKiBpZiBvcHRpb24gaXMgRWxlbWVudCAtPiBnZXQgc2l6ZSBvZiBlbGVtZW50XG4gKiBlbHNlIHVzZSBvcHRpb24gYXMgYSBudW1iZXJcbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gbWVhc3VyZW1lbnRcbiAqIEBwYXJhbSB7U3RyaW5nfSBzaXplIC0gd2lkdGggb3IgaGVpZ2h0XG4gKiBAcHJpdmF0ZVxuICovXG5wcm90by5fZ2V0TWVhc3VyZW1lbnQgPSBmdW5jdGlvbiggbWVhc3VyZW1lbnQsIHNpemUgKSB7XG4gIHZhciBvcHRpb24gPSB0aGlzLm9wdGlvbnNbIG1lYXN1cmVtZW50IF07XG4gIHZhciBlbGVtO1xuICBpZiAoICFvcHRpb24gKSB7XG4gICAgLy8gZGVmYXVsdCB0byAwXG4gICAgdGhpc1sgbWVhc3VyZW1lbnQgXSA9IDA7XG4gIH0gZWxzZSB7XG4gICAgLy8gdXNlIG9wdGlvbiBhcyBhbiBlbGVtZW50XG4gICAgaWYgKCB0eXBlb2Ygb3B0aW9uID09ICdzdHJpbmcnICkge1xuICAgICAgZWxlbSA9IHRoaXMuZWxlbWVudC5xdWVyeVNlbGVjdG9yKCBvcHRpb24gKTtcbiAgICB9IGVsc2UgaWYgKCBvcHRpb24gaW5zdGFuY2VvZiBIVE1MRWxlbWVudCApIHtcbiAgICAgIGVsZW0gPSBvcHRpb247XG4gICAgfVxuICAgIC8vIHVzZSBzaXplIG9mIGVsZW1lbnQsIGlmIGVsZW1lbnRcbiAgICB0aGlzWyBtZWFzdXJlbWVudCBdID0gZWxlbSA/IGdldFNpemUoIGVsZW0gKVsgc2l6ZSBdIDogb3B0aW9uO1xuICB9XG59O1xuXG4vKipcbiAqIGxheW91dCBhIGNvbGxlY3Rpb24gb2YgaXRlbSBlbGVtZW50c1xuICogQGFwaSBwdWJsaWNcbiAqL1xucHJvdG8ubGF5b3V0SXRlbXMgPSBmdW5jdGlvbiggaXRlbXMsIGlzSW5zdGFudCApIHtcbiAgaXRlbXMgPSB0aGlzLl9nZXRJdGVtc0ZvckxheW91dCggaXRlbXMgKTtcblxuICB0aGlzLl9sYXlvdXRJdGVtcyggaXRlbXMsIGlzSW5zdGFudCApO1xuXG4gIHRoaXMuX3Bvc3RMYXlvdXQoKTtcbn07XG5cbi8qKlxuICogZ2V0IHRoZSBpdGVtcyB0byBiZSBsYWlkIG91dFxuICogeW91IG1heSB3YW50IHRvIHNraXAgb3ZlciBzb21lIGl0ZW1zXG4gKiBAcGFyYW0ge0FycmF5fSBpdGVtc1xuICogQHJldHVybnMge0FycmF5fSBpdGVtc1xuICovXG5wcm90by5fZ2V0SXRlbXNGb3JMYXlvdXQgPSBmdW5jdGlvbiggaXRlbXMgKSB7XG4gIHJldHVybiBpdGVtcy5maWx0ZXIoIGZ1bmN0aW9uKCBpdGVtICkge1xuICAgIHJldHVybiAhaXRlbS5pc0lnbm9yZWQ7XG4gIH0pO1xufTtcblxuLyoqXG4gKiBsYXlvdXQgaXRlbXNcbiAqIEBwYXJhbSB7QXJyYXl9IGl0ZW1zXG4gKiBAcGFyYW0ge0Jvb2xlYW59IGlzSW5zdGFudFxuICovXG5wcm90by5fbGF5b3V0SXRlbXMgPSBmdW5jdGlvbiggaXRlbXMsIGlzSW5zdGFudCApIHtcbiAgdGhpcy5fZW1pdENvbXBsZXRlT25JdGVtcyggJ2xheW91dCcsIGl0ZW1zICk7XG5cbiAgaWYgKCAhaXRlbXMgfHwgIWl0ZW1zLmxlbmd0aCApIHtcbiAgICAvLyBubyBpdGVtcywgZW1pdCBldmVudCB3aXRoIGVtcHR5IGFycmF5XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdmFyIHF1ZXVlID0gW107XG5cbiAgaXRlbXMuZm9yRWFjaCggZnVuY3Rpb24oIGl0ZW0gKSB7XG4gICAgLy8gZ2V0IHgveSBvYmplY3QgZnJvbSBtZXRob2RcbiAgICB2YXIgcG9zaXRpb24gPSB0aGlzLl9nZXRJdGVtTGF5b3V0UG9zaXRpb24oIGl0ZW0gKTtcbiAgICAvLyBlbnF1ZXVlXG4gICAgcG9zaXRpb24uaXRlbSA9IGl0ZW07XG4gICAgcG9zaXRpb24uaXNJbnN0YW50ID0gaXNJbnN0YW50IHx8IGl0ZW0uaXNMYXlvdXRJbnN0YW50O1xuICAgIHF1ZXVlLnB1c2goIHBvc2l0aW9uICk7XG4gIH0sIHRoaXMgKTtcblxuICB0aGlzLl9wcm9jZXNzTGF5b3V0UXVldWUoIHF1ZXVlICk7XG59O1xuXG4vKipcbiAqIGdldCBpdGVtIGxheW91dCBwb3NpdGlvblxuICogQHBhcmFtIHtPdXRsYXllci5JdGVtfSBpdGVtXG4gKiBAcmV0dXJucyB7T2JqZWN0fSB4IGFuZCB5IHBvc2l0aW9uXG4gKi9cbnByb3RvLl9nZXRJdGVtTGF5b3V0UG9zaXRpb24gPSBmdW5jdGlvbiggLyogaXRlbSAqLyApIHtcbiAgcmV0dXJuIHtcbiAgICB4OiAwLFxuICAgIHk6IDBcbiAgfTtcbn07XG5cbi8qKlxuICogaXRlcmF0ZSBvdmVyIGFycmF5IGFuZCBwb3NpdGlvbiBlYWNoIGl0ZW1cbiAqIFJlYXNvbiBiZWluZyAtIHNlcGFyYXRpbmcgdGhpcyBsb2dpYyBwcmV2ZW50cyAnbGF5b3V0IGludmFsaWRhdGlvbidcbiAqIHRoeCBAcGF1bF9pcmlzaFxuICogQHBhcmFtIHtBcnJheX0gcXVldWVcbiAqL1xucHJvdG8uX3Byb2Nlc3NMYXlvdXRRdWV1ZSA9IGZ1bmN0aW9uKCBxdWV1ZSApIHtcbiAgdGhpcy51cGRhdGVTdGFnZ2VyKCk7XG4gIHF1ZXVlLmZvckVhY2goIGZ1bmN0aW9uKCBvYmosIGkgKSB7XG4gICAgdGhpcy5fcG9zaXRpb25JdGVtKCBvYmouaXRlbSwgb2JqLngsIG9iai55LCBvYmouaXNJbnN0YW50LCBpICk7XG4gIH0sIHRoaXMgKTtcbn07XG5cbi8vIHNldCBzdGFnZ2VyIGZyb20gb3B0aW9uIGluIG1pbGxpc2Vjb25kcyBudW1iZXJcbnByb3RvLnVwZGF0ZVN0YWdnZXIgPSBmdW5jdGlvbigpIHtcbiAgdmFyIHN0YWdnZXIgPSB0aGlzLm9wdGlvbnMuc3RhZ2dlcjtcbiAgaWYgKCBzdGFnZ2VyID09PSBudWxsIHx8IHN0YWdnZXIgPT09IHVuZGVmaW5lZCApIHtcbiAgICB0aGlzLnN0YWdnZXIgPSAwO1xuICAgIHJldHVybjtcbiAgfVxuICB0aGlzLnN0YWdnZXIgPSBnZXRNaWxsaXNlY29uZHMoIHN0YWdnZXIgKTtcbiAgcmV0dXJuIHRoaXMuc3RhZ2dlcjtcbn07XG5cbi8qKlxuICogU2V0cyBwb3NpdGlvbiBvZiBpdGVtIGluIERPTVxuICogQHBhcmFtIHtPdXRsYXllci5JdGVtfSBpdGVtXG4gKiBAcGFyYW0ge051bWJlcn0geCAtIGhvcml6b250YWwgcG9zaXRpb25cbiAqIEBwYXJhbSB7TnVtYmVyfSB5IC0gdmVydGljYWwgcG9zaXRpb25cbiAqIEBwYXJhbSB7Qm9vbGVhbn0gaXNJbnN0YW50IC0gZGlzYWJsZXMgdHJhbnNpdGlvbnNcbiAqL1xucHJvdG8uX3Bvc2l0aW9uSXRlbSA9IGZ1bmN0aW9uKCBpdGVtLCB4LCB5LCBpc0luc3RhbnQsIGkgKSB7XG4gIGlmICggaXNJbnN0YW50ICkge1xuICAgIC8vIGlmIG5vdCB0cmFuc2l0aW9uLCBqdXN0IHNldCBDU1NcbiAgICBpdGVtLmdvVG8oIHgsIHkgKTtcbiAgfSBlbHNlIHtcbiAgICBpdGVtLnN0YWdnZXIoIGkgKiB0aGlzLnN0YWdnZXIgKTtcbiAgICBpdGVtLm1vdmVUbyggeCwgeSApO1xuICB9XG59O1xuXG4vKipcbiAqIEFueSBsb2dpYyB5b3Ugd2FudCB0byBkbyBhZnRlciBlYWNoIGxheW91dCxcbiAqIGkuZS4gc2l6ZSB0aGUgY29udGFpbmVyXG4gKi9cbnByb3RvLl9wb3N0TGF5b3V0ID0gZnVuY3Rpb24oKSB7XG4gIHRoaXMucmVzaXplQ29udGFpbmVyKCk7XG59O1xuXG5wcm90by5yZXNpemVDb250YWluZXIgPSBmdW5jdGlvbigpIHtcbiAgdmFyIGlzUmVzaXppbmdDb250YWluZXIgPSB0aGlzLl9nZXRPcHRpb24oJ3Jlc2l6ZUNvbnRhaW5lcicpO1xuICBpZiAoICFpc1Jlc2l6aW5nQ29udGFpbmVyICkge1xuICAgIHJldHVybjtcbiAgfVxuICB2YXIgc2l6ZSA9IHRoaXMuX2dldENvbnRhaW5lclNpemUoKTtcbiAgaWYgKCBzaXplICkge1xuICAgIHRoaXMuX3NldENvbnRhaW5lck1lYXN1cmUoIHNpemUud2lkdGgsIHRydWUgKTtcbiAgICB0aGlzLl9zZXRDb250YWluZXJNZWFzdXJlKCBzaXplLmhlaWdodCwgZmFsc2UgKTtcbiAgfVxufTtcblxuLyoqXG4gKiBTZXRzIHdpZHRoIG9yIGhlaWdodCBvZiBjb250YWluZXIgaWYgcmV0dXJuZWRcbiAqIEByZXR1cm5zIHtPYmplY3R9IHNpemVcbiAqICAgQHBhcmFtIHtOdW1iZXJ9IHdpZHRoXG4gKiAgIEBwYXJhbSB7TnVtYmVyfSBoZWlnaHRcbiAqL1xucHJvdG8uX2dldENvbnRhaW5lclNpemUgPSBub29wO1xuXG4vKipcbiAqIEBwYXJhbSB7TnVtYmVyfSBtZWFzdXJlIC0gc2l6ZSBvZiB3aWR0aCBvciBoZWlnaHRcbiAqIEBwYXJhbSB7Qm9vbGVhbn0gaXNXaWR0aFxuICovXG5wcm90by5fc2V0Q29udGFpbmVyTWVhc3VyZSA9IGZ1bmN0aW9uKCBtZWFzdXJlLCBpc1dpZHRoICkge1xuICBpZiAoIG1lYXN1cmUgPT09IHVuZGVmaW5lZCApIHtcbiAgICByZXR1cm47XG4gIH1cblxuICB2YXIgZWxlbVNpemUgPSB0aGlzLnNpemU7XG4gIC8vIGFkZCBwYWRkaW5nIGFuZCBib3JkZXIgd2lkdGggaWYgYm9yZGVyIGJveFxuICBpZiAoIGVsZW1TaXplLmlzQm9yZGVyQm94ICkge1xuICAgIG1lYXN1cmUgKz0gaXNXaWR0aCA/IGVsZW1TaXplLnBhZGRpbmdMZWZ0ICsgZWxlbVNpemUucGFkZGluZ1JpZ2h0ICtcbiAgICAgIGVsZW1TaXplLmJvcmRlckxlZnRXaWR0aCArIGVsZW1TaXplLmJvcmRlclJpZ2h0V2lkdGggOlxuICAgICAgZWxlbVNpemUucGFkZGluZ0JvdHRvbSArIGVsZW1TaXplLnBhZGRpbmdUb3AgK1xuICAgICAgZWxlbVNpemUuYm9yZGVyVG9wV2lkdGggKyBlbGVtU2l6ZS5ib3JkZXJCb3R0b21XaWR0aDtcbiAgfVxuXG4gIG1lYXN1cmUgPSBNYXRoLm1heCggbWVhc3VyZSwgMCApO1xuICB0aGlzLmVsZW1lbnQuc3R5bGVbIGlzV2lkdGggPyAnd2lkdGgnIDogJ2hlaWdodCcgXSA9IG1lYXN1cmUgKyAncHgnO1xufTtcblxuLyoqXG4gKiBlbWl0IGV2ZW50Q29tcGxldGUgb24gYSBjb2xsZWN0aW9uIG9mIGl0ZW1zIGV2ZW50c1xuICogQHBhcmFtIHtTdHJpbmd9IGV2ZW50TmFtZVxuICogQHBhcmFtIHtBcnJheX0gaXRlbXMgLSBPdXRsYXllci5JdGVtc1xuICovXG5wcm90by5fZW1pdENvbXBsZXRlT25JdGVtcyA9IGZ1bmN0aW9uKCBldmVudE5hbWUsIGl0ZW1zICkge1xuICB2YXIgX3RoaXMgPSB0aGlzO1xuICBmdW5jdGlvbiBvbkNvbXBsZXRlKCkge1xuICAgIF90aGlzLmRpc3BhdGNoRXZlbnQoIGV2ZW50TmFtZSArICdDb21wbGV0ZScsIG51bGwsIFsgaXRlbXMgXSApO1xuICB9XG5cbiAgdmFyIGNvdW50ID0gaXRlbXMubGVuZ3RoO1xuICBpZiAoICFpdGVtcyB8fCAhY291bnQgKSB7XG4gICAgb25Db21wbGV0ZSgpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHZhciBkb25lQ291bnQgPSAwO1xuICBmdW5jdGlvbiB0aWNrKCkge1xuICAgIGRvbmVDb3VudCsrO1xuICAgIGlmICggZG9uZUNvdW50ID09IGNvdW50ICkge1xuICAgICAgb25Db21wbGV0ZSgpO1xuICAgIH1cbiAgfVxuXG4gIC8vIGJpbmQgY2FsbGJhY2tcbiAgaXRlbXMuZm9yRWFjaCggZnVuY3Rpb24oIGl0ZW0gKSB7XG4gICAgaXRlbS5vbmNlKCBldmVudE5hbWUsIHRpY2sgKTtcbiAgfSk7XG59O1xuXG4vKipcbiAqIGVtaXRzIGV2ZW50cyB2aWEgRXZFbWl0dGVyIGFuZCBqUXVlcnkgZXZlbnRzXG4gKiBAcGFyYW0ge1N0cmluZ30gdHlwZSAtIG5hbWUgb2YgZXZlbnRcbiAqIEBwYXJhbSB7RXZlbnR9IGV2ZW50IC0gb3JpZ2luYWwgZXZlbnRcbiAqIEBwYXJhbSB7QXJyYXl9IGFyZ3MgLSBleHRyYSBhcmd1bWVudHNcbiAqL1xucHJvdG8uZGlzcGF0Y2hFdmVudCA9IGZ1bmN0aW9uKCB0eXBlLCBldmVudCwgYXJncyApIHtcbiAgLy8gYWRkIG9yaWdpbmFsIGV2ZW50IHRvIGFyZ3VtZW50c1xuICB2YXIgZW1pdEFyZ3MgPSBldmVudCA/IFsgZXZlbnQgXS5jb25jYXQoIGFyZ3MgKSA6IGFyZ3M7XG4gIHRoaXMuZW1pdEV2ZW50KCB0eXBlLCBlbWl0QXJncyApO1xuXG4gIGlmICggalF1ZXJ5ICkge1xuICAgIC8vIHNldCB0aGlzLiRlbGVtZW50XG4gICAgdGhpcy4kZWxlbWVudCA9IHRoaXMuJGVsZW1lbnQgfHwgalF1ZXJ5KCB0aGlzLmVsZW1lbnQgKTtcbiAgICBpZiAoIGV2ZW50ICkge1xuICAgICAgLy8gY3JlYXRlIGpRdWVyeSBldmVudFxuICAgICAgdmFyICRldmVudCA9IGpRdWVyeS5FdmVudCggZXZlbnQgKTtcbiAgICAgICRldmVudC50eXBlID0gdHlwZTtcbiAgICAgIHRoaXMuJGVsZW1lbnQudHJpZ2dlciggJGV2ZW50LCBhcmdzICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIGp1c3QgdHJpZ2dlciB3aXRoIHR5cGUgaWYgbm8gZXZlbnQgYXZhaWxhYmxlXG4gICAgICB0aGlzLiRlbGVtZW50LnRyaWdnZXIoIHR5cGUsIGFyZ3MgKTtcbiAgICB9XG4gIH1cbn07XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGlnbm9yZSAmIHN0YW1wcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAvL1xuXG5cbi8qKlxuICoga2VlcCBpdGVtIGluIGNvbGxlY3Rpb24sIGJ1dCBkbyBub3QgbGF5IGl0IG91dFxuICogaWdub3JlZCBpdGVtcyBkbyBub3QgZ2V0IHNraXBwZWQgaW4gbGF5b3V0XG4gKiBAcGFyYW0ge0VsZW1lbnR9IGVsZW1cbiAqL1xucHJvdG8uaWdub3JlID0gZnVuY3Rpb24oIGVsZW0gKSB7XG4gIHZhciBpdGVtID0gdGhpcy5nZXRJdGVtKCBlbGVtICk7XG4gIGlmICggaXRlbSApIHtcbiAgICBpdGVtLmlzSWdub3JlZCA9IHRydWU7XG4gIH1cbn07XG5cbi8qKlxuICogcmV0dXJuIGl0ZW0gdG8gbGF5b3V0IGNvbGxlY3Rpb25cbiAqIEBwYXJhbSB7RWxlbWVudH0gZWxlbVxuICovXG5wcm90by51bmlnbm9yZSA9IGZ1bmN0aW9uKCBlbGVtICkge1xuICB2YXIgaXRlbSA9IHRoaXMuZ2V0SXRlbSggZWxlbSApO1xuICBpZiAoIGl0ZW0gKSB7XG4gICAgZGVsZXRlIGl0ZW0uaXNJZ25vcmVkO1xuICB9XG59O1xuXG4vKipcbiAqIGFkZHMgZWxlbWVudHMgdG8gc3RhbXBzXG4gKiBAcGFyYW0ge05vZGVMaXN0LCBBcnJheSwgRWxlbWVudCwgb3IgU3RyaW5nfSBlbGVtc1xuICovXG5wcm90by5zdGFtcCA9IGZ1bmN0aW9uKCBlbGVtcyApIHtcbiAgZWxlbXMgPSB0aGlzLl9maW5kKCBlbGVtcyApO1xuICBpZiAoICFlbGVtcyApIHtcbiAgICByZXR1cm47XG4gIH1cblxuICB0aGlzLnN0YW1wcyA9IHRoaXMuc3RhbXBzLmNvbmNhdCggZWxlbXMgKTtcbiAgLy8gaWdub3JlXG4gIGVsZW1zLmZvckVhY2goIHRoaXMuaWdub3JlLCB0aGlzICk7XG59O1xuXG4vKipcbiAqIHJlbW92ZXMgZWxlbWVudHMgdG8gc3RhbXBzXG4gKiBAcGFyYW0ge05vZGVMaXN0LCBBcnJheSwgb3IgRWxlbWVudH0gZWxlbXNcbiAqL1xucHJvdG8udW5zdGFtcCA9IGZ1bmN0aW9uKCBlbGVtcyApIHtcbiAgZWxlbXMgPSB0aGlzLl9maW5kKCBlbGVtcyApO1xuICBpZiAoICFlbGVtcyApe1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGVsZW1zLmZvckVhY2goIGZ1bmN0aW9uKCBlbGVtICkge1xuICAgIC8vIGZpbHRlciBvdXQgcmVtb3ZlZCBzdGFtcCBlbGVtZW50c1xuICAgIHV0aWxzLnJlbW92ZUZyb20oIHRoaXMuc3RhbXBzLCBlbGVtICk7XG4gICAgdGhpcy51bmlnbm9yZSggZWxlbSApO1xuICB9LCB0aGlzICk7XG59O1xuXG4vKipcbiAqIGZpbmRzIGNoaWxkIGVsZW1lbnRzXG4gKiBAcGFyYW0ge05vZGVMaXN0LCBBcnJheSwgRWxlbWVudCwgb3IgU3RyaW5nfSBlbGVtc1xuICogQHJldHVybnMge0FycmF5fSBlbGVtc1xuICovXG5wcm90by5fZmluZCA9IGZ1bmN0aW9uKCBlbGVtcyApIHtcbiAgaWYgKCAhZWxlbXMgKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIC8vIGlmIHN0cmluZywgdXNlIGFyZ3VtZW50IGFzIHNlbGVjdG9yIHN0cmluZ1xuICBpZiAoIHR5cGVvZiBlbGVtcyA9PSAnc3RyaW5nJyApIHtcbiAgICBlbGVtcyA9IHRoaXMuZWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsKCBlbGVtcyApO1xuICB9XG4gIGVsZW1zID0gdXRpbHMubWFrZUFycmF5KCBlbGVtcyApO1xuICByZXR1cm4gZWxlbXM7XG59O1xuXG5wcm90by5fbWFuYWdlU3RhbXBzID0gZnVuY3Rpb24oKSB7XG4gIGlmICggIXRoaXMuc3RhbXBzIHx8ICF0aGlzLnN0YW1wcy5sZW5ndGggKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdGhpcy5fZ2V0Qm91bmRpbmdSZWN0KCk7XG5cbiAgdGhpcy5zdGFtcHMuZm9yRWFjaCggdGhpcy5fbWFuYWdlU3RhbXAsIHRoaXMgKTtcbn07XG5cbi8vIHVwZGF0ZSBib3VuZGluZ0xlZnQgLyBUb3BcbnByb3RvLl9nZXRCb3VuZGluZ1JlY3QgPSBmdW5jdGlvbigpIHtcbiAgLy8gZ2V0IGJvdW5kaW5nIHJlY3QgZm9yIGNvbnRhaW5lciBlbGVtZW50XG4gIHZhciBib3VuZGluZ1JlY3QgPSB0aGlzLmVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gIHZhciBzaXplID0gdGhpcy5zaXplO1xuICB0aGlzLl9ib3VuZGluZ1JlY3QgPSB7XG4gICAgbGVmdDogYm91bmRpbmdSZWN0LmxlZnQgKyBzaXplLnBhZGRpbmdMZWZ0ICsgc2l6ZS5ib3JkZXJMZWZ0V2lkdGgsXG4gICAgdG9wOiBib3VuZGluZ1JlY3QudG9wICsgc2l6ZS5wYWRkaW5nVG9wICsgc2l6ZS5ib3JkZXJUb3BXaWR0aCxcbiAgICByaWdodDogYm91bmRpbmdSZWN0LnJpZ2h0IC0gKCBzaXplLnBhZGRpbmdSaWdodCArIHNpemUuYm9yZGVyUmlnaHRXaWR0aCApLFxuICAgIGJvdHRvbTogYm91bmRpbmdSZWN0LmJvdHRvbSAtICggc2l6ZS5wYWRkaW5nQm90dG9tICsgc2l6ZS5ib3JkZXJCb3R0b21XaWR0aCApXG4gIH07XG59O1xuXG4vKipcbiAqIEBwYXJhbSB7RWxlbWVudH0gc3RhbXBcbioqL1xucHJvdG8uX21hbmFnZVN0YW1wID0gbm9vcDtcblxuLyoqXG4gKiBnZXQgeC95IHBvc2l0aW9uIG9mIGVsZW1lbnQgcmVsYXRpdmUgdG8gY29udGFpbmVyIGVsZW1lbnRcbiAqIEBwYXJhbSB7RWxlbWVudH0gZWxlbVxuICogQHJldHVybnMge09iamVjdH0gb2Zmc2V0IC0gaGFzIGxlZnQsIHRvcCwgcmlnaHQsIGJvdHRvbVxuICovXG5wcm90by5fZ2V0RWxlbWVudE9mZnNldCA9IGZ1bmN0aW9uKCBlbGVtICkge1xuICB2YXIgYm91bmRpbmdSZWN0ID0gZWxlbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgdmFyIHRoaXNSZWN0ID0gdGhpcy5fYm91bmRpbmdSZWN0O1xuICB2YXIgc2l6ZSA9IGdldFNpemUoIGVsZW0gKTtcbiAgdmFyIG9mZnNldCA9IHtcbiAgICBsZWZ0OiBib3VuZGluZ1JlY3QubGVmdCAtIHRoaXNSZWN0LmxlZnQgLSBzaXplLm1hcmdpbkxlZnQsXG4gICAgdG9wOiBib3VuZGluZ1JlY3QudG9wIC0gdGhpc1JlY3QudG9wIC0gc2l6ZS5tYXJnaW5Ub3AsXG4gICAgcmlnaHQ6IHRoaXNSZWN0LnJpZ2h0IC0gYm91bmRpbmdSZWN0LnJpZ2h0IC0gc2l6ZS5tYXJnaW5SaWdodCxcbiAgICBib3R0b206IHRoaXNSZWN0LmJvdHRvbSAtIGJvdW5kaW5nUmVjdC5ib3R0b20gLSBzaXplLm1hcmdpbkJvdHRvbVxuICB9O1xuICByZXR1cm4gb2Zmc2V0O1xufTtcblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gcmVzaXplIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIC8vXG5cbi8vIGVuYWJsZSBldmVudCBoYW5kbGVycyBmb3IgbGlzdGVuZXJzXG4vLyBpLmUuIHJlc2l6ZSAtPiBvbnJlc2l6ZVxucHJvdG8uaGFuZGxlRXZlbnQgPSB1dGlscy5oYW5kbGVFdmVudDtcblxuLyoqXG4gKiBCaW5kIGxheW91dCB0byB3aW5kb3cgcmVzaXppbmdcbiAqL1xucHJvdG8uYmluZFJlc2l6ZSA9IGZ1bmN0aW9uKCkge1xuICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lciggJ3Jlc2l6ZScsIHRoaXMgKTtcbiAgdGhpcy5pc1Jlc2l6ZUJvdW5kID0gdHJ1ZTtcbn07XG5cbi8qKlxuICogVW5iaW5kIGxheW91dCB0byB3aW5kb3cgcmVzaXppbmdcbiAqL1xucHJvdG8udW5iaW5kUmVzaXplID0gZnVuY3Rpb24oKSB7XG4gIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCAncmVzaXplJywgdGhpcyApO1xuICB0aGlzLmlzUmVzaXplQm91bmQgPSBmYWxzZTtcbn07XG5cbnByb3RvLm9ucmVzaXplID0gZnVuY3Rpb24oKSB7XG4gIHRoaXMucmVzaXplKCk7XG59O1xuXG51dGlscy5kZWJvdW5jZU1ldGhvZCggT3V0bGF5ZXIsICdvbnJlc2l6ZScsIDEwMCApO1xuXG5wcm90by5yZXNpemUgPSBmdW5jdGlvbigpIHtcbiAgLy8gZG9uJ3QgdHJpZ2dlciBpZiBzaXplIGRpZCBub3QgY2hhbmdlXG4gIC8vIG9yIGlmIHJlc2l6ZSB3YXMgdW5ib3VuZC4gU2VlICM5XG4gIGlmICggIXRoaXMuaXNSZXNpemVCb3VuZCB8fCAhdGhpcy5uZWVkc1Jlc2l6ZUxheW91dCgpICkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHRoaXMubGF5b3V0KCk7XG59O1xuXG4vKipcbiAqIGNoZWNrIGlmIGxheW91dCBpcyBuZWVkZWQgcG9zdCBsYXlvdXRcbiAqIEByZXR1cm5zIEJvb2xlYW5cbiAqL1xucHJvdG8ubmVlZHNSZXNpemVMYXlvdXQgPSBmdW5jdGlvbigpIHtcbiAgdmFyIHNpemUgPSBnZXRTaXplKCB0aGlzLmVsZW1lbnQgKTtcbiAgLy8gY2hlY2sgdGhhdCB0aGlzLnNpemUgYW5kIHNpemUgYXJlIHRoZXJlXG4gIC8vIElFOCB0cmlnZ2VycyByZXNpemUgb24gYm9keSBzaXplIGNoYW5nZSwgc28gdGhleSBtaWdodCBub3QgYmVcbiAgdmFyIGhhc1NpemVzID0gdGhpcy5zaXplICYmIHNpemU7XG4gIHJldHVybiBoYXNTaXplcyAmJiBzaXplLmlubmVyV2lkdGggIT09IHRoaXMuc2l6ZS5pbm5lcldpZHRoO1xufTtcblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gbWV0aG9kcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAvL1xuXG4vKipcbiAqIGFkZCBpdGVtcyB0byBPdXRsYXllciBpbnN0YW5jZVxuICogQHBhcmFtIHtBcnJheSBvciBOb2RlTGlzdCBvciBFbGVtZW50fSBlbGVtc1xuICogQHJldHVybnMge0FycmF5fSBpdGVtcyAtIE91dGxheWVyLkl0ZW1zXG4qKi9cbnByb3RvLmFkZEl0ZW1zID0gZnVuY3Rpb24oIGVsZW1zICkge1xuICB2YXIgaXRlbXMgPSB0aGlzLl9pdGVtaXplKCBlbGVtcyApO1xuICAvLyBhZGQgaXRlbXMgdG8gY29sbGVjdGlvblxuICBpZiAoIGl0ZW1zLmxlbmd0aCApIHtcbiAgICB0aGlzLml0ZW1zID0gdGhpcy5pdGVtcy5jb25jYXQoIGl0ZW1zICk7XG4gIH1cbiAgcmV0dXJuIGl0ZW1zO1xufTtcblxuLyoqXG4gKiBMYXlvdXQgbmV3bHktYXBwZW5kZWQgaXRlbSBlbGVtZW50c1xuICogQHBhcmFtIHtBcnJheSBvciBOb2RlTGlzdCBvciBFbGVtZW50fSBlbGVtc1xuICovXG5wcm90by5hcHBlbmRlZCA9IGZ1bmN0aW9uKCBlbGVtcyApIHtcbiAgdmFyIGl0ZW1zID0gdGhpcy5hZGRJdGVtcyggZWxlbXMgKTtcbiAgaWYgKCAhaXRlbXMubGVuZ3RoICkge1xuICAgIHJldHVybjtcbiAgfVxuICAvLyBsYXlvdXQgYW5kIHJldmVhbCBqdXN0IHRoZSBuZXcgaXRlbXNcbiAgdGhpcy5sYXlvdXRJdGVtcyggaXRlbXMsIHRydWUgKTtcbiAgdGhpcy5yZXZlYWwoIGl0ZW1zICk7XG59O1xuXG4vKipcbiAqIExheW91dCBwcmVwZW5kZWQgZWxlbWVudHNcbiAqIEBwYXJhbSB7QXJyYXkgb3IgTm9kZUxpc3Qgb3IgRWxlbWVudH0gZWxlbXNcbiAqL1xucHJvdG8ucHJlcGVuZGVkID0gZnVuY3Rpb24oIGVsZW1zICkge1xuICB2YXIgaXRlbXMgPSB0aGlzLl9pdGVtaXplKCBlbGVtcyApO1xuICBpZiAoICFpdGVtcy5sZW5ndGggKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIC8vIGFkZCBpdGVtcyB0byBiZWdpbm5pbmcgb2YgY29sbGVjdGlvblxuICB2YXIgcHJldmlvdXNJdGVtcyA9IHRoaXMuaXRlbXMuc2xpY2UoMCk7XG4gIHRoaXMuaXRlbXMgPSBpdGVtcy5jb25jYXQoIHByZXZpb3VzSXRlbXMgKTtcbiAgLy8gc3RhcnQgbmV3IGxheW91dFxuICB0aGlzLl9yZXNldExheW91dCgpO1xuICB0aGlzLl9tYW5hZ2VTdGFtcHMoKTtcbiAgLy8gbGF5b3V0IG5ldyBzdHVmZiB3aXRob3V0IHRyYW5zaXRpb25cbiAgdGhpcy5sYXlvdXRJdGVtcyggaXRlbXMsIHRydWUgKTtcbiAgdGhpcy5yZXZlYWwoIGl0ZW1zICk7XG4gIC8vIGxheW91dCBwcmV2aW91cyBpdGVtc1xuICB0aGlzLmxheW91dEl0ZW1zKCBwcmV2aW91c0l0ZW1zICk7XG59O1xuXG4vKipcbiAqIHJldmVhbCBhIGNvbGxlY3Rpb24gb2YgaXRlbXNcbiAqIEBwYXJhbSB7QXJyYXkgb2YgT3V0bGF5ZXIuSXRlbXN9IGl0ZW1zXG4gKi9cbnByb3RvLnJldmVhbCA9IGZ1bmN0aW9uKCBpdGVtcyApIHtcbiAgdGhpcy5fZW1pdENvbXBsZXRlT25JdGVtcyggJ3JldmVhbCcsIGl0ZW1zICk7XG4gIGlmICggIWl0ZW1zIHx8ICFpdGVtcy5sZW5ndGggKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIHZhciBzdGFnZ2VyID0gdGhpcy51cGRhdGVTdGFnZ2VyKCk7XG4gIGl0ZW1zLmZvckVhY2goIGZ1bmN0aW9uKCBpdGVtLCBpICkge1xuICAgIGl0ZW0uc3RhZ2dlciggaSAqIHN0YWdnZXIgKTtcbiAgICBpdGVtLnJldmVhbCgpO1xuICB9KTtcbn07XG5cbi8qKlxuICogaGlkZSBhIGNvbGxlY3Rpb24gb2YgaXRlbXNcbiAqIEBwYXJhbSB7QXJyYXkgb2YgT3V0bGF5ZXIuSXRlbXN9IGl0ZW1zXG4gKi9cbnByb3RvLmhpZGUgPSBmdW5jdGlvbiggaXRlbXMgKSB7XG4gIHRoaXMuX2VtaXRDb21wbGV0ZU9uSXRlbXMoICdoaWRlJywgaXRlbXMgKTtcbiAgaWYgKCAhaXRlbXMgfHwgIWl0ZW1zLmxlbmd0aCApIHtcbiAgICByZXR1cm47XG4gIH1cbiAgdmFyIHN0YWdnZXIgPSB0aGlzLnVwZGF0ZVN0YWdnZXIoKTtcbiAgaXRlbXMuZm9yRWFjaCggZnVuY3Rpb24oIGl0ZW0sIGkgKSB7XG4gICAgaXRlbS5zdGFnZ2VyKCBpICogc3RhZ2dlciApO1xuICAgIGl0ZW0uaGlkZSgpO1xuICB9KTtcbn07XG5cbi8qKlxuICogcmV2ZWFsIGl0ZW0gZWxlbWVudHNcbiAqIEBwYXJhbSB7QXJyYXl9LCB7RWxlbWVudH0sIHtOb2RlTGlzdH0gaXRlbXNcbiAqL1xucHJvdG8ucmV2ZWFsSXRlbUVsZW1lbnRzID0gZnVuY3Rpb24oIGVsZW1zICkge1xuICB2YXIgaXRlbXMgPSB0aGlzLmdldEl0ZW1zKCBlbGVtcyApO1xuICB0aGlzLnJldmVhbCggaXRlbXMgKTtcbn07XG5cbi8qKlxuICogaGlkZSBpdGVtIGVsZW1lbnRzXG4gKiBAcGFyYW0ge0FycmF5fSwge0VsZW1lbnR9LCB7Tm9kZUxpc3R9IGl0ZW1zXG4gKi9cbnByb3RvLmhpZGVJdGVtRWxlbWVudHMgPSBmdW5jdGlvbiggZWxlbXMgKSB7XG4gIHZhciBpdGVtcyA9IHRoaXMuZ2V0SXRlbXMoIGVsZW1zICk7XG4gIHRoaXMuaGlkZSggaXRlbXMgKTtcbn07XG5cbi8qKlxuICogZ2V0IE91dGxheWVyLkl0ZW0sIGdpdmVuIGFuIEVsZW1lbnRcbiAqIEBwYXJhbSB7RWxlbWVudH0gZWxlbVxuICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2tcbiAqIEByZXR1cm5zIHtPdXRsYXllci5JdGVtfSBpdGVtXG4gKi9cbnByb3RvLmdldEl0ZW0gPSBmdW5jdGlvbiggZWxlbSApIHtcbiAgLy8gbG9vcCB0aHJvdWdoIGl0ZW1zIHRvIGdldCB0aGUgb25lIHRoYXQgbWF0Y2hlc1xuICBmb3IgKCB2YXIgaT0wOyBpIDwgdGhpcy5pdGVtcy5sZW5ndGg7IGkrKyApIHtcbiAgICB2YXIgaXRlbSA9IHRoaXMuaXRlbXNbaV07XG4gICAgaWYgKCBpdGVtLmVsZW1lbnQgPT0gZWxlbSApIHtcbiAgICAgIC8vIHJldHVybiBpdGVtXG4gICAgICByZXR1cm4gaXRlbTtcbiAgICB9XG4gIH1cbn07XG5cbi8qKlxuICogZ2V0IGNvbGxlY3Rpb24gb2YgT3V0bGF5ZXIuSXRlbXMsIGdpdmVuIEVsZW1lbnRzXG4gKiBAcGFyYW0ge0FycmF5fSBlbGVtc1xuICogQHJldHVybnMge0FycmF5fSBpdGVtcyAtIE91dGxheWVyLkl0ZW1zXG4gKi9cbnByb3RvLmdldEl0ZW1zID0gZnVuY3Rpb24oIGVsZW1zICkge1xuICBlbGVtcyA9IHV0aWxzLm1ha2VBcnJheSggZWxlbXMgKTtcbiAgdmFyIGl0ZW1zID0gW107XG4gIGVsZW1zLmZvckVhY2goIGZ1bmN0aW9uKCBlbGVtICkge1xuICAgIHZhciBpdGVtID0gdGhpcy5nZXRJdGVtKCBlbGVtICk7XG4gICAgaWYgKCBpdGVtICkge1xuICAgICAgaXRlbXMucHVzaCggaXRlbSApO1xuICAgIH1cbiAgfSwgdGhpcyApO1xuXG4gIHJldHVybiBpdGVtcztcbn07XG5cbi8qKlxuICogcmVtb3ZlIGVsZW1lbnQocykgZnJvbSBpbnN0YW5jZSBhbmQgRE9NXG4gKiBAcGFyYW0ge0FycmF5IG9yIE5vZGVMaXN0IG9yIEVsZW1lbnR9IGVsZW1zXG4gKi9cbnByb3RvLnJlbW92ZSA9IGZ1bmN0aW9uKCBlbGVtcyApIHtcbiAgdmFyIHJlbW92ZUl0ZW1zID0gdGhpcy5nZXRJdGVtcyggZWxlbXMgKTtcblxuICB0aGlzLl9lbWl0Q29tcGxldGVPbkl0ZW1zKCAncmVtb3ZlJywgcmVtb3ZlSXRlbXMgKTtcblxuICAvLyBiYWlsIGlmIG5vIGl0ZW1zIHRvIHJlbW92ZVxuICBpZiAoICFyZW1vdmVJdGVtcyB8fCAhcmVtb3ZlSXRlbXMubGVuZ3RoICkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHJlbW92ZUl0ZW1zLmZvckVhY2goIGZ1bmN0aW9uKCBpdGVtICkge1xuICAgIGl0ZW0ucmVtb3ZlKCk7XG4gICAgLy8gcmVtb3ZlIGl0ZW0gZnJvbSBjb2xsZWN0aW9uXG4gICAgdXRpbHMucmVtb3ZlRnJvbSggdGhpcy5pdGVtcywgaXRlbSApO1xuICB9LCB0aGlzICk7XG59O1xuXG4vLyAtLS0tLSBkZXN0cm95IC0tLS0tIC8vXG5cbi8vIHJlbW92ZSBhbmQgZGlzYWJsZSBPdXRsYXllciBpbnN0YW5jZVxucHJvdG8uZGVzdHJveSA9IGZ1bmN0aW9uKCkge1xuICAvLyBjbGVhbiB1cCBkeW5hbWljIHN0eWxlc1xuICB2YXIgc3R5bGUgPSB0aGlzLmVsZW1lbnQuc3R5bGU7XG4gIHN0eWxlLmhlaWdodCA9ICcnO1xuICBzdHlsZS5wb3NpdGlvbiA9ICcnO1xuICBzdHlsZS53aWR0aCA9ICcnO1xuICAvLyBkZXN0cm95IGl0ZW1zXG4gIHRoaXMuaXRlbXMuZm9yRWFjaCggZnVuY3Rpb24oIGl0ZW0gKSB7XG4gICAgaXRlbS5kZXN0cm95KCk7XG4gIH0pO1xuXG4gIHRoaXMudW5iaW5kUmVzaXplKCk7XG5cbiAgdmFyIGlkID0gdGhpcy5lbGVtZW50Lm91dGxheWVyR1VJRDtcbiAgZGVsZXRlIGluc3RhbmNlc1sgaWQgXTsgLy8gcmVtb3ZlIHJlZmVyZW5jZSB0byBpbnN0YW5jZSBieSBpZFxuICBkZWxldGUgdGhpcy5lbGVtZW50Lm91dGxheWVyR1VJRDtcbiAgLy8gcmVtb3ZlIGRhdGEgZm9yIGpRdWVyeVxuICBpZiAoIGpRdWVyeSApIHtcbiAgICBqUXVlcnkucmVtb3ZlRGF0YSggdGhpcy5lbGVtZW50LCB0aGlzLmNvbnN0cnVjdG9yLm5hbWVzcGFjZSApO1xuICB9XG5cbn07XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGRhdGEgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gLy9cblxuLyoqXG4gKiBnZXQgT3V0bGF5ZXIgaW5zdGFuY2UgZnJvbSBlbGVtZW50XG4gKiBAcGFyYW0ge0VsZW1lbnR9IGVsZW1cbiAqIEByZXR1cm5zIHtPdXRsYXllcn1cbiAqL1xuT3V0bGF5ZXIuZGF0YSA9IGZ1bmN0aW9uKCBlbGVtICkge1xuICBlbGVtID0gdXRpbHMuZ2V0UXVlcnlFbGVtZW50KCBlbGVtICk7XG4gIHZhciBpZCA9IGVsZW0gJiYgZWxlbS5vdXRsYXllckdVSUQ7XG4gIHJldHVybiBpZCAmJiBpbnN0YW5jZXNbIGlkIF07XG59O1xuXG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGNyZWF0ZSBPdXRsYXllciBjbGFzcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAvL1xuXG4vKipcbiAqIGNyZWF0ZSBhIGxheW91dCBjbGFzc1xuICogQHBhcmFtIHtTdHJpbmd9IG5hbWVzcGFjZVxuICovXG5PdXRsYXllci5jcmVhdGUgPSBmdW5jdGlvbiggbmFtZXNwYWNlLCBvcHRpb25zICkge1xuICAvLyBzdWItY2xhc3MgT3V0bGF5ZXJcbiAgdmFyIExheW91dCA9IHN1YmNsYXNzKCBPdXRsYXllciApO1xuICAvLyBhcHBseSBuZXcgb3B0aW9ucyBhbmQgY29tcGF0T3B0aW9uc1xuICBMYXlvdXQuZGVmYXVsdHMgPSB1dGlscy5leHRlbmQoIHt9LCBPdXRsYXllci5kZWZhdWx0cyApO1xuICB1dGlscy5leHRlbmQoIExheW91dC5kZWZhdWx0cywgb3B0aW9ucyApO1xuICBMYXlvdXQuY29tcGF0T3B0aW9ucyA9IHV0aWxzLmV4dGVuZCgge30sIE91dGxheWVyLmNvbXBhdE9wdGlvbnMgICk7XG5cbiAgTGF5b3V0Lm5hbWVzcGFjZSA9IG5hbWVzcGFjZTtcblxuICBMYXlvdXQuZGF0YSA9IE91dGxheWVyLmRhdGE7XG5cbiAgLy8gc3ViLWNsYXNzIEl0ZW1cbiAgTGF5b3V0Lkl0ZW0gPSBzdWJjbGFzcyggSXRlbSApO1xuXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGRlY2xhcmF0aXZlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIC8vXG5cbiAgdXRpbHMuaHRtbEluaXQoIExheW91dCwgbmFtZXNwYWNlICk7XG5cbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0galF1ZXJ5IGJyaWRnZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAvL1xuXG4gIC8vIG1ha2UgaW50byBqUXVlcnkgcGx1Z2luXG4gIGlmICggalF1ZXJ5ICYmIGpRdWVyeS5icmlkZ2V0ICkge1xuICAgIGpRdWVyeS5icmlkZ2V0KCBuYW1lc3BhY2UsIExheW91dCApO1xuICB9XG5cbiAgcmV0dXJuIExheW91dDtcbn07XG5cbmZ1bmN0aW9uIHN1YmNsYXNzKCBQYXJlbnQgKSB7XG4gIGZ1bmN0aW9uIFN1YkNsYXNzKCkge1xuICAgIFBhcmVudC5hcHBseSggdGhpcywgYXJndW1lbnRzICk7XG4gIH1cblxuICBTdWJDbGFzcy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBQYXJlbnQucHJvdG90eXBlICk7XG4gIFN1YkNsYXNzLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFN1YkNsYXNzO1xuXG4gIHJldHVybiBTdWJDbGFzcztcbn1cblxuLy8gLS0tLS0gaGVscGVycyAtLS0tLSAvL1xuXG4vLyBob3cgbWFueSBtaWxsaXNlY29uZHMgYXJlIGluIGVhY2ggdW5pdFxudmFyIG1zVW5pdHMgPSB7XG4gIG1zOiAxLFxuICBzOiAxMDAwXG59O1xuXG4vLyBtdW5nZSB0aW1lLWxpa2UgcGFyYW1ldGVyIGludG8gbWlsbGlzZWNvbmQgbnVtYmVyXG4vLyAnMC40cycgLT4gNDBcbmZ1bmN0aW9uIGdldE1pbGxpc2Vjb25kcyggdGltZSApIHtcbiAgaWYgKCB0eXBlb2YgdGltZSA9PSAnbnVtYmVyJyApIHtcbiAgICByZXR1cm4gdGltZTtcbiAgfVxuICB2YXIgbWF0Y2hlcyA9IHRpbWUubWF0Y2goIC8oXlxcZCpcXC4/XFxkKikoXFx3KikvICk7XG4gIHZhciBudW0gPSBtYXRjaGVzICYmIG1hdGNoZXNbMV07XG4gIHZhciB1bml0ID0gbWF0Y2hlcyAmJiBtYXRjaGVzWzJdO1xuICBpZiAoICFudW0ubGVuZ3RoICkge1xuICAgIHJldHVybiAwO1xuICB9XG4gIG51bSA9IHBhcnNlRmxvYXQoIG51bSApO1xuICB2YXIgbXVsdCA9IG1zVW5pdHNbIHVuaXQgXSB8fCAxO1xuICByZXR1cm4gbnVtICogbXVsdDtcbn1cblxuLy8gLS0tLS0gZmluIC0tLS0tIC8vXG5cbi8vIGJhY2sgaW4gZ2xvYmFsXG5PdXRsYXllci5JdGVtID0gSXRlbTtcblxucmV0dXJuIE91dGxheWVyO1xuXG59KSk7XG4iLCIvLyBzaGltIGZvciB1c2luZyBwcm9jZXNzIGluIGJyb3dzZXJcbnZhciBwcm9jZXNzID0gbW9kdWxlLmV4cG9ydHMgPSB7fTtcblxuLy8gY2FjaGVkIGZyb20gd2hhdGV2ZXIgZ2xvYmFsIGlzIHByZXNlbnQgc28gdGhhdCB0ZXN0IHJ1bm5lcnMgdGhhdCBzdHViIGl0XG4vLyBkb24ndCBicmVhayB0aGluZ3MuICBCdXQgd2UgbmVlZCB0byB3cmFwIGl0IGluIGEgdHJ5IGNhdGNoIGluIGNhc2UgaXQgaXNcbi8vIHdyYXBwZWQgaW4gc3RyaWN0IG1vZGUgY29kZSB3aGljaCBkb2Vzbid0IGRlZmluZSBhbnkgZ2xvYmFscy4gIEl0J3MgaW5zaWRlIGFcbi8vIGZ1bmN0aW9uIGJlY2F1c2UgdHJ5L2NhdGNoZXMgZGVvcHRpbWl6ZSBpbiBjZXJ0YWluIGVuZ2luZXMuXG5cbnZhciBjYWNoZWRTZXRUaW1lb3V0O1xudmFyIGNhY2hlZENsZWFyVGltZW91dDtcblxuZnVuY3Rpb24gZGVmYXVsdFNldFRpbW91dCgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3NldFRpbWVvdXQgaGFzIG5vdCBiZWVuIGRlZmluZWQnKTtcbn1cbmZ1bmN0aW9uIGRlZmF1bHRDbGVhclRpbWVvdXQgKCkge1xuICAgIHRocm93IG5ldyBFcnJvcignY2xlYXJUaW1lb3V0IGhhcyBub3QgYmVlbiBkZWZpbmVkJyk7XG59XG4oZnVuY3Rpb24gKCkge1xuICAgIHRyeSB7XG4gICAgICAgIGlmICh0eXBlb2Ygc2V0VGltZW91dCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgY2FjaGVkU2V0VGltZW91dCA9IHNldFRpbWVvdXQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjYWNoZWRTZXRUaW1lb3V0ID0gZGVmYXVsdFNldFRpbW91dDtcbiAgICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgY2FjaGVkU2V0VGltZW91dCA9IGRlZmF1bHRTZXRUaW1vdXQ7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAgIGlmICh0eXBlb2YgY2xlYXJUaW1lb3V0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBjYWNoZWRDbGVhclRpbWVvdXQgPSBjbGVhclRpbWVvdXQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjYWNoZWRDbGVhclRpbWVvdXQgPSBkZWZhdWx0Q2xlYXJUaW1lb3V0O1xuICAgICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBjYWNoZWRDbGVhclRpbWVvdXQgPSBkZWZhdWx0Q2xlYXJUaW1lb3V0O1xuICAgIH1cbn0gKCkpXG5mdW5jdGlvbiBydW5UaW1lb3V0KGZ1bikge1xuICAgIGlmIChjYWNoZWRTZXRUaW1lb3V0ID09PSBzZXRUaW1lb3V0KSB7XG4gICAgICAgIC8vbm9ybWFsIGVudmlyb21lbnRzIGluIHNhbmUgc2l0dWF0aW9uc1xuICAgICAgICByZXR1cm4gc2V0VGltZW91dChmdW4sIDApO1xuICAgIH1cbiAgICAvLyBpZiBzZXRUaW1lb3V0IHdhc24ndCBhdmFpbGFibGUgYnV0IHdhcyBsYXR0ZXIgZGVmaW5lZFxuICAgIGlmICgoY2FjaGVkU2V0VGltZW91dCA9PT0gZGVmYXVsdFNldFRpbW91dCB8fCAhY2FjaGVkU2V0VGltZW91dCkgJiYgc2V0VGltZW91dCkge1xuICAgICAgICBjYWNoZWRTZXRUaW1lb3V0ID0gc2V0VGltZW91dDtcbiAgICAgICAgcmV0dXJuIHNldFRpbWVvdXQoZnVuLCAwKTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgICAgLy8gd2hlbiB3aGVuIHNvbWVib2R5IGhhcyBzY3Jld2VkIHdpdGggc2V0VGltZW91dCBidXQgbm8gSS5FLiBtYWRkbmVzc1xuICAgICAgICByZXR1cm4gY2FjaGVkU2V0VGltZW91dChmdW4sIDApO1xuICAgIH0gY2F0Y2goZSl7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyBXaGVuIHdlIGFyZSBpbiBJLkUuIGJ1dCB0aGUgc2NyaXB0IGhhcyBiZWVuIGV2YWxlZCBzbyBJLkUuIGRvZXNuJ3QgdHJ1c3QgdGhlIGdsb2JhbCBvYmplY3Qgd2hlbiBjYWxsZWQgbm9ybWFsbHlcbiAgICAgICAgICAgIHJldHVybiBjYWNoZWRTZXRUaW1lb3V0LmNhbGwobnVsbCwgZnVuLCAwKTtcbiAgICAgICAgfSBjYXRjaChlKXtcbiAgICAgICAgICAgIC8vIHNhbWUgYXMgYWJvdmUgYnV0IHdoZW4gaXQncyBhIHZlcnNpb24gb2YgSS5FLiB0aGF0IG11c3QgaGF2ZSB0aGUgZ2xvYmFsIG9iamVjdCBmb3IgJ3RoaXMnLCBob3BmdWxseSBvdXIgY29udGV4dCBjb3JyZWN0IG90aGVyd2lzZSBpdCB3aWxsIHRocm93IGEgZ2xvYmFsIGVycm9yXG4gICAgICAgICAgICByZXR1cm4gY2FjaGVkU2V0VGltZW91dC5jYWxsKHRoaXMsIGZ1biwgMCk7XG4gICAgICAgIH1cbiAgICB9XG5cblxufVxuZnVuY3Rpb24gcnVuQ2xlYXJUaW1lb3V0KG1hcmtlcikge1xuICAgIGlmIChjYWNoZWRDbGVhclRpbWVvdXQgPT09IGNsZWFyVGltZW91dCkge1xuICAgICAgICAvL25vcm1hbCBlbnZpcm9tZW50cyBpbiBzYW5lIHNpdHVhdGlvbnNcbiAgICAgICAgcmV0dXJuIGNsZWFyVGltZW91dChtYXJrZXIpO1xuICAgIH1cbiAgICAvLyBpZiBjbGVhclRpbWVvdXQgd2Fzbid0IGF2YWlsYWJsZSBidXQgd2FzIGxhdHRlciBkZWZpbmVkXG4gICAgaWYgKChjYWNoZWRDbGVhclRpbWVvdXQgPT09IGRlZmF1bHRDbGVhclRpbWVvdXQgfHwgIWNhY2hlZENsZWFyVGltZW91dCkgJiYgY2xlYXJUaW1lb3V0KSB7XG4gICAgICAgIGNhY2hlZENsZWFyVGltZW91dCA9IGNsZWFyVGltZW91dDtcbiAgICAgICAgcmV0dXJuIGNsZWFyVGltZW91dChtYXJrZXIpO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgICAvLyB3aGVuIHdoZW4gc29tZWJvZHkgaGFzIHNjcmV3ZWQgd2l0aCBzZXRUaW1lb3V0IGJ1dCBubyBJLkUuIG1hZGRuZXNzXG4gICAgICAgIHJldHVybiBjYWNoZWRDbGVhclRpbWVvdXQobWFya2VyKTtcbiAgICB9IGNhdGNoIChlKXtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIFdoZW4gd2UgYXJlIGluIEkuRS4gYnV0IHRoZSBzY3JpcHQgaGFzIGJlZW4gZXZhbGVkIHNvIEkuRS4gZG9lc24ndCAgdHJ1c3QgdGhlIGdsb2JhbCBvYmplY3Qgd2hlbiBjYWxsZWQgbm9ybWFsbHlcbiAgICAgICAgICAgIHJldHVybiBjYWNoZWRDbGVhclRpbWVvdXQuY2FsbChudWxsLCBtYXJrZXIpO1xuICAgICAgICB9IGNhdGNoIChlKXtcbiAgICAgICAgICAgIC8vIHNhbWUgYXMgYWJvdmUgYnV0IHdoZW4gaXQncyBhIHZlcnNpb24gb2YgSS5FLiB0aGF0IG11c3QgaGF2ZSB0aGUgZ2xvYmFsIG9iamVjdCBmb3IgJ3RoaXMnLCBob3BmdWxseSBvdXIgY29udGV4dCBjb3JyZWN0IG90aGVyd2lzZSBpdCB3aWxsIHRocm93IGEgZ2xvYmFsIGVycm9yLlxuICAgICAgICAgICAgLy8gU29tZSB2ZXJzaW9ucyBvZiBJLkUuIGhhdmUgZGlmZmVyZW50IHJ1bGVzIGZvciBjbGVhclRpbWVvdXQgdnMgc2V0VGltZW91dFxuICAgICAgICAgICAgcmV0dXJuIGNhY2hlZENsZWFyVGltZW91dC5jYWxsKHRoaXMsIG1hcmtlcik7XG4gICAgICAgIH1cbiAgICB9XG5cblxuXG59XG52YXIgcXVldWUgPSBbXTtcbnZhciBkcmFpbmluZyA9IGZhbHNlO1xudmFyIGN1cnJlbnRRdWV1ZTtcbnZhciBxdWV1ZUluZGV4ID0gLTE7XG5cbmZ1bmN0aW9uIGNsZWFuVXBOZXh0VGljaygpIHtcbiAgICBpZiAoIWRyYWluaW5nIHx8ICFjdXJyZW50UXVldWUpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBkcmFpbmluZyA9IGZhbHNlO1xuICAgIGlmIChjdXJyZW50UXVldWUubGVuZ3RoKSB7XG4gICAgICAgIHF1ZXVlID0gY3VycmVudFF1ZXVlLmNvbmNhdChxdWV1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcXVldWVJbmRleCA9IC0xO1xuICAgIH1cbiAgICBpZiAocXVldWUubGVuZ3RoKSB7XG4gICAgICAgIGRyYWluUXVldWUoKTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGRyYWluUXVldWUoKSB7XG4gICAgaWYgKGRyYWluaW5nKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmFyIHRpbWVvdXQgPSBydW5UaW1lb3V0KGNsZWFuVXBOZXh0VGljayk7XG4gICAgZHJhaW5pbmcgPSB0cnVlO1xuXG4gICAgdmFyIGxlbiA9IHF1ZXVlLmxlbmd0aDtcbiAgICB3aGlsZShsZW4pIHtcbiAgICAgICAgY3VycmVudFF1ZXVlID0gcXVldWU7XG4gICAgICAgIHF1ZXVlID0gW107XG4gICAgICAgIHdoaWxlICgrK3F1ZXVlSW5kZXggPCBsZW4pIHtcbiAgICAgICAgICAgIGlmIChjdXJyZW50UXVldWUpIHtcbiAgICAgICAgICAgICAgICBjdXJyZW50UXVldWVbcXVldWVJbmRleF0ucnVuKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcXVldWVJbmRleCA9IC0xO1xuICAgICAgICBsZW4gPSBxdWV1ZS5sZW5ndGg7XG4gICAgfVxuICAgIGN1cnJlbnRRdWV1ZSA9IG51bGw7XG4gICAgZHJhaW5pbmcgPSBmYWxzZTtcbiAgICBydW5DbGVhclRpbWVvdXQodGltZW91dCk7XG59XG5cbnByb2Nlc3MubmV4dFRpY2sgPSBmdW5jdGlvbiAoZnVuKSB7XG4gICAgdmFyIGFyZ3MgPSBuZXcgQXJyYXkoYXJndW1lbnRzLmxlbmd0aCAtIDEpO1xuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID4gMSkge1xuICAgICAgICBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgYXJnc1tpIC0gMV0gPSBhcmd1bWVudHNbaV07XG4gICAgICAgIH1cbiAgICB9XG4gICAgcXVldWUucHVzaChuZXcgSXRlbShmdW4sIGFyZ3MpKTtcbiAgICBpZiAocXVldWUubGVuZ3RoID09PSAxICYmICFkcmFpbmluZykge1xuICAgICAgICBydW5UaW1lb3V0KGRyYWluUXVldWUpO1xuICAgIH1cbn07XG5cbi8vIHY4IGxpa2VzIHByZWRpY3RpYmxlIG9iamVjdHNcbmZ1bmN0aW9uIEl0ZW0oZnVuLCBhcnJheSkge1xuICAgIHRoaXMuZnVuID0gZnVuO1xuICAgIHRoaXMuYXJyYXkgPSBhcnJheTtcbn1cbkl0ZW0ucHJvdG90eXBlLnJ1biA9IGZ1bmN0aW9uICgpIHtcbiAgICB0aGlzLmZ1bi5hcHBseShudWxsLCB0aGlzLmFycmF5KTtcbn07XG5wcm9jZXNzLnRpdGxlID0gJ2Jyb3dzZXInO1xucHJvY2Vzcy5icm93c2VyID0gdHJ1ZTtcbnByb2Nlc3MuZW52ID0ge307XG5wcm9jZXNzLmFyZ3YgPSBbXTtcbnByb2Nlc3MudmVyc2lvbiA9ICcnOyAvLyBlbXB0eSBzdHJpbmcgdG8gYXZvaWQgcmVnZXhwIGlzc3Vlc1xucHJvY2Vzcy52ZXJzaW9ucyA9IHt9O1xuXG5mdW5jdGlvbiBub29wKCkge31cblxucHJvY2Vzcy5vbiA9IG5vb3A7XG5wcm9jZXNzLmFkZExpc3RlbmVyID0gbm9vcDtcbnByb2Nlc3Mub25jZSA9IG5vb3A7XG5wcm9jZXNzLm9mZiA9IG5vb3A7XG5wcm9jZXNzLnJlbW92ZUxpc3RlbmVyID0gbm9vcDtcbnByb2Nlc3MucmVtb3ZlQWxsTGlzdGVuZXJzID0gbm9vcDtcbnByb2Nlc3MuZW1pdCA9IG5vb3A7XG5wcm9jZXNzLnByZXBlbmRMaXN0ZW5lciA9IG5vb3A7XG5wcm9jZXNzLnByZXBlbmRPbmNlTGlzdGVuZXIgPSBub29wO1xuXG5wcm9jZXNzLmxpc3RlbmVycyA9IGZ1bmN0aW9uIChuYW1lKSB7IHJldHVybiBbXSB9XG5cbnByb2Nlc3MuYmluZGluZyA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdwcm9jZXNzLmJpbmRpbmcgaXMgbm90IHN1cHBvcnRlZCcpO1xufTtcblxucHJvY2Vzcy5jd2QgPSBmdW5jdGlvbiAoKSB7IHJldHVybiAnLycgfTtcbnByb2Nlc3MuY2hkaXIgPSBmdW5jdGlvbiAoZGlyKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdwcm9jZXNzLmNoZGlyIGlzIG5vdCBzdXBwb3J0ZWQnKTtcbn07XG5wcm9jZXNzLnVtYXNrID0gZnVuY3Rpb24oKSB7IHJldHVybiAwOyB9O1xuIiwiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogaHR0cHM6Ly9yYXcuZ2l0aHViLmNvbS9mYWNlYm9vay9yZWdlbmVyYXRvci9tYXN0ZXIvTElDRU5TRSBmaWxlLiBBblxuICogYWRkaXRpb25hbCBncmFudCBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluXG4gKiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKi9cblxuIShmdW5jdGlvbihnbG9iYWwpIHtcbiAgXCJ1c2Ugc3RyaWN0XCI7XG5cbiAgdmFyIE9wID0gT2JqZWN0LnByb3RvdHlwZTtcbiAgdmFyIGhhc093biA9IE9wLmhhc093blByb3BlcnR5O1xuICB2YXIgdW5kZWZpbmVkOyAvLyBNb3JlIGNvbXByZXNzaWJsZSB0aGFuIHZvaWQgMC5cbiAgdmFyICRTeW1ib2wgPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgPyBTeW1ib2wgOiB7fTtcbiAgdmFyIGl0ZXJhdG9yU3ltYm9sID0gJFN5bWJvbC5pdGVyYXRvciB8fCBcIkBAaXRlcmF0b3JcIjtcbiAgdmFyIGFzeW5jSXRlcmF0b3JTeW1ib2wgPSAkU3ltYm9sLmFzeW5jSXRlcmF0b3IgfHwgXCJAQGFzeW5jSXRlcmF0b3JcIjtcbiAgdmFyIHRvU3RyaW5nVGFnU3ltYm9sID0gJFN5bWJvbC50b1N0cmluZ1RhZyB8fCBcIkBAdG9TdHJpbmdUYWdcIjtcblxuICB2YXIgaW5Nb2R1bGUgPSB0eXBlb2YgbW9kdWxlID09PSBcIm9iamVjdFwiO1xuICB2YXIgcnVudGltZSA9IGdsb2JhbC5yZWdlbmVyYXRvclJ1bnRpbWU7XG4gIGlmIChydW50aW1lKSB7XG4gICAgaWYgKGluTW9kdWxlKSB7XG4gICAgICAvLyBJZiByZWdlbmVyYXRvclJ1bnRpbWUgaXMgZGVmaW5lZCBnbG9iYWxseSBhbmQgd2UncmUgaW4gYSBtb2R1bGUsXG4gICAgICAvLyBtYWtlIHRoZSBleHBvcnRzIG9iamVjdCBpZGVudGljYWwgdG8gcmVnZW5lcmF0b3JSdW50aW1lLlxuICAgICAgbW9kdWxlLmV4cG9ydHMgPSBydW50aW1lO1xuICAgIH1cbiAgICAvLyBEb24ndCBib3RoZXIgZXZhbHVhdGluZyB0aGUgcmVzdCBvZiB0aGlzIGZpbGUgaWYgdGhlIHJ1bnRpbWUgd2FzXG4gICAgLy8gYWxyZWFkeSBkZWZpbmVkIGdsb2JhbGx5LlxuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIERlZmluZSB0aGUgcnVudGltZSBnbG9iYWxseSAoYXMgZXhwZWN0ZWQgYnkgZ2VuZXJhdGVkIGNvZGUpIGFzIGVpdGhlclxuICAvLyBtb2R1bGUuZXhwb3J0cyAoaWYgd2UncmUgaW4gYSBtb2R1bGUpIG9yIGEgbmV3LCBlbXB0eSBvYmplY3QuXG4gIHJ1bnRpbWUgPSBnbG9iYWwucmVnZW5lcmF0b3JSdW50aW1lID0gaW5Nb2R1bGUgPyBtb2R1bGUuZXhwb3J0cyA6IHt9O1xuXG4gIGZ1bmN0aW9uIHdyYXAoaW5uZXJGbiwgb3V0ZXJGbiwgc2VsZiwgdHJ5TG9jc0xpc3QpIHtcbiAgICAvLyBJZiBvdXRlckZuIHByb3ZpZGVkIGFuZCBvdXRlckZuLnByb3RvdHlwZSBpcyBhIEdlbmVyYXRvciwgdGhlbiBvdXRlckZuLnByb3RvdHlwZSBpbnN0YW5jZW9mIEdlbmVyYXRvci5cbiAgICB2YXIgcHJvdG9HZW5lcmF0b3IgPSBvdXRlckZuICYmIG91dGVyRm4ucHJvdG90eXBlIGluc3RhbmNlb2YgR2VuZXJhdG9yID8gb3V0ZXJGbiA6IEdlbmVyYXRvcjtcbiAgICB2YXIgZ2VuZXJhdG9yID0gT2JqZWN0LmNyZWF0ZShwcm90b0dlbmVyYXRvci5wcm90b3R5cGUpO1xuICAgIHZhciBjb250ZXh0ID0gbmV3IENvbnRleHQodHJ5TG9jc0xpc3QgfHwgW10pO1xuXG4gICAgLy8gVGhlIC5faW52b2tlIG1ldGhvZCB1bmlmaWVzIHRoZSBpbXBsZW1lbnRhdGlvbnMgb2YgdGhlIC5uZXh0LFxuICAgIC8vIC50aHJvdywgYW5kIC5yZXR1cm4gbWV0aG9kcy5cbiAgICBnZW5lcmF0b3IuX2ludm9rZSA9IG1ha2VJbnZva2VNZXRob2QoaW5uZXJGbiwgc2VsZiwgY29udGV4dCk7XG5cbiAgICByZXR1cm4gZ2VuZXJhdG9yO1xuICB9XG4gIHJ1bnRpbWUud3JhcCA9IHdyYXA7XG5cbiAgLy8gVHJ5L2NhdGNoIGhlbHBlciB0byBtaW5pbWl6ZSBkZW9wdGltaXphdGlvbnMuIFJldHVybnMgYSBjb21wbGV0aW9uXG4gIC8vIHJlY29yZCBsaWtlIGNvbnRleHQudHJ5RW50cmllc1tpXS5jb21wbGV0aW9uLiBUaGlzIGludGVyZmFjZSBjb3VsZFxuICAvLyBoYXZlIGJlZW4gKGFuZCB3YXMgcHJldmlvdXNseSkgZGVzaWduZWQgdG8gdGFrZSBhIGNsb3N1cmUgdG8gYmVcbiAgLy8gaW52b2tlZCB3aXRob3V0IGFyZ3VtZW50cywgYnV0IGluIGFsbCB0aGUgY2FzZXMgd2UgY2FyZSBhYm91dCB3ZVxuICAvLyBhbHJlYWR5IGhhdmUgYW4gZXhpc3RpbmcgbWV0aG9kIHdlIHdhbnQgdG8gY2FsbCwgc28gdGhlcmUncyBubyBuZWVkXG4gIC8vIHRvIGNyZWF0ZSBhIG5ldyBmdW5jdGlvbiBvYmplY3QuIFdlIGNhbiBldmVuIGdldCBhd2F5IHdpdGggYXNzdW1pbmdcbiAgLy8gdGhlIG1ldGhvZCB0YWtlcyBleGFjdGx5IG9uZSBhcmd1bWVudCwgc2luY2UgdGhhdCBoYXBwZW5zIHRvIGJlIHRydWVcbiAgLy8gaW4gZXZlcnkgY2FzZSwgc28gd2UgZG9uJ3QgaGF2ZSB0byB0b3VjaCB0aGUgYXJndW1lbnRzIG9iamVjdC4gVGhlXG4gIC8vIG9ubHkgYWRkaXRpb25hbCBhbGxvY2F0aW9uIHJlcXVpcmVkIGlzIHRoZSBjb21wbGV0aW9uIHJlY29yZCwgd2hpY2hcbiAgLy8gaGFzIGEgc3RhYmxlIHNoYXBlIGFuZCBzbyBob3BlZnVsbHkgc2hvdWxkIGJlIGNoZWFwIHRvIGFsbG9jYXRlLlxuICBmdW5jdGlvbiB0cnlDYXRjaChmbiwgb2JqLCBhcmcpIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIHsgdHlwZTogXCJub3JtYWxcIiwgYXJnOiBmbi5jYWxsKG9iaiwgYXJnKSB9O1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgcmV0dXJuIHsgdHlwZTogXCJ0aHJvd1wiLCBhcmc6IGVyciB9O1xuICAgIH1cbiAgfVxuXG4gIHZhciBHZW5TdGF0ZVN1c3BlbmRlZFN0YXJ0ID0gXCJzdXNwZW5kZWRTdGFydFwiO1xuICB2YXIgR2VuU3RhdGVTdXNwZW5kZWRZaWVsZCA9IFwic3VzcGVuZGVkWWllbGRcIjtcbiAgdmFyIEdlblN0YXRlRXhlY3V0aW5nID0gXCJleGVjdXRpbmdcIjtcbiAgdmFyIEdlblN0YXRlQ29tcGxldGVkID0gXCJjb21wbGV0ZWRcIjtcblxuICAvLyBSZXR1cm5pbmcgdGhpcyBvYmplY3QgZnJvbSB0aGUgaW5uZXJGbiBoYXMgdGhlIHNhbWUgZWZmZWN0IGFzXG4gIC8vIGJyZWFraW5nIG91dCBvZiB0aGUgZGlzcGF0Y2ggc3dpdGNoIHN0YXRlbWVudC5cbiAgdmFyIENvbnRpbnVlU2VudGluZWwgPSB7fTtcblxuICAvLyBEdW1teSBjb25zdHJ1Y3RvciBmdW5jdGlvbnMgdGhhdCB3ZSB1c2UgYXMgdGhlIC5jb25zdHJ1Y3RvciBhbmRcbiAgLy8gLmNvbnN0cnVjdG9yLnByb3RvdHlwZSBwcm9wZXJ0aWVzIGZvciBmdW5jdGlvbnMgdGhhdCByZXR1cm4gR2VuZXJhdG9yXG4gIC8vIG9iamVjdHMuIEZvciBmdWxsIHNwZWMgY29tcGxpYW5jZSwgeW91IG1heSB3aXNoIHRvIGNvbmZpZ3VyZSB5b3VyXG4gIC8vIG1pbmlmaWVyIG5vdCB0byBtYW5nbGUgdGhlIG5hbWVzIG9mIHRoZXNlIHR3byBmdW5jdGlvbnMuXG4gIGZ1bmN0aW9uIEdlbmVyYXRvcigpIHt9XG4gIGZ1bmN0aW9uIEdlbmVyYXRvckZ1bmN0aW9uKCkge31cbiAgZnVuY3Rpb24gR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGUoKSB7fVxuXG4gIC8vIFRoaXMgaXMgYSBwb2x5ZmlsbCBmb3IgJUl0ZXJhdG9yUHJvdG90eXBlJSBmb3IgZW52aXJvbm1lbnRzIHRoYXRcbiAgLy8gZG9uJ3QgbmF0aXZlbHkgc3VwcG9ydCBpdC5cbiAgdmFyIEl0ZXJhdG9yUHJvdG90eXBlID0ge307XG4gIEl0ZXJhdG9yUHJvdG90eXBlW2l0ZXJhdG9yU3ltYm9sXSA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICB2YXIgZ2V0UHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2Y7XG4gIHZhciBOYXRpdmVJdGVyYXRvclByb3RvdHlwZSA9IGdldFByb3RvICYmIGdldFByb3RvKGdldFByb3RvKHZhbHVlcyhbXSkpKTtcbiAgaWYgKE5hdGl2ZUl0ZXJhdG9yUHJvdG90eXBlICYmXG4gICAgICBOYXRpdmVJdGVyYXRvclByb3RvdHlwZSAhPT0gT3AgJiZcbiAgICAgIGhhc093bi5jYWxsKE5hdGl2ZUl0ZXJhdG9yUHJvdG90eXBlLCBpdGVyYXRvclN5bWJvbCkpIHtcbiAgICAvLyBUaGlzIGVudmlyb25tZW50IGhhcyBhIG5hdGl2ZSAlSXRlcmF0b3JQcm90b3R5cGUlOyB1c2UgaXQgaW5zdGVhZFxuICAgIC8vIG9mIHRoZSBwb2x5ZmlsbC5cbiAgICBJdGVyYXRvclByb3RvdHlwZSA9IE5hdGl2ZUl0ZXJhdG9yUHJvdG90eXBlO1xuICB9XG5cbiAgdmFyIEdwID0gR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGUucHJvdG90eXBlID1cbiAgICBHZW5lcmF0b3IucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShJdGVyYXRvclByb3RvdHlwZSk7XG4gIEdlbmVyYXRvckZ1bmN0aW9uLnByb3RvdHlwZSA9IEdwLmNvbnN0cnVjdG9yID0gR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGU7XG4gIEdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlLmNvbnN0cnVjdG9yID0gR2VuZXJhdG9yRnVuY3Rpb247XG4gIEdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlW3RvU3RyaW5nVGFnU3ltYm9sXSA9XG4gICAgR2VuZXJhdG9yRnVuY3Rpb24uZGlzcGxheU5hbWUgPSBcIkdlbmVyYXRvckZ1bmN0aW9uXCI7XG5cbiAgLy8gSGVscGVyIGZvciBkZWZpbmluZyB0aGUgLm5leHQsIC50aHJvdywgYW5kIC5yZXR1cm4gbWV0aG9kcyBvZiB0aGVcbiAgLy8gSXRlcmF0b3IgaW50ZXJmYWNlIGluIHRlcm1zIG9mIGEgc2luZ2xlIC5faW52b2tlIG1ldGhvZC5cbiAgZnVuY3Rpb24gZGVmaW5lSXRlcmF0b3JNZXRob2RzKHByb3RvdHlwZSkge1xuICAgIFtcIm5leHRcIiwgXCJ0aHJvd1wiLCBcInJldHVyblwiXS5mb3JFYWNoKGZ1bmN0aW9uKG1ldGhvZCkge1xuICAgICAgcHJvdG90eXBlW21ldGhvZF0gPSBmdW5jdGlvbihhcmcpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2ludm9rZShtZXRob2QsIGFyZyk7XG4gICAgICB9O1xuICAgIH0pO1xuICB9XG5cbiAgcnVudGltZS5pc0dlbmVyYXRvckZ1bmN0aW9uID0gZnVuY3Rpb24oZ2VuRnVuKSB7XG4gICAgdmFyIGN0b3IgPSB0eXBlb2YgZ2VuRnVuID09PSBcImZ1bmN0aW9uXCIgJiYgZ2VuRnVuLmNvbnN0cnVjdG9yO1xuICAgIHJldHVybiBjdG9yXG4gICAgICA/IGN0b3IgPT09IEdlbmVyYXRvckZ1bmN0aW9uIHx8XG4gICAgICAgIC8vIEZvciB0aGUgbmF0aXZlIEdlbmVyYXRvckZ1bmN0aW9uIGNvbnN0cnVjdG9yLCB0aGUgYmVzdCB3ZSBjYW5cbiAgICAgICAgLy8gZG8gaXMgdG8gY2hlY2sgaXRzIC5uYW1lIHByb3BlcnR5LlxuICAgICAgICAoY3Rvci5kaXNwbGF5TmFtZSB8fCBjdG9yLm5hbWUpID09PSBcIkdlbmVyYXRvckZ1bmN0aW9uXCJcbiAgICAgIDogZmFsc2U7XG4gIH07XG5cbiAgcnVudGltZS5tYXJrID0gZnVuY3Rpb24oZ2VuRnVuKSB7XG4gICAgaWYgKE9iamVjdC5zZXRQcm90b3R5cGVPZikge1xuICAgICAgT2JqZWN0LnNldFByb3RvdHlwZU9mKGdlbkZ1biwgR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBnZW5GdW4uX19wcm90b19fID0gR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGU7XG4gICAgICBpZiAoISh0b1N0cmluZ1RhZ1N5bWJvbCBpbiBnZW5GdW4pKSB7XG4gICAgICAgIGdlbkZ1blt0b1N0cmluZ1RhZ1N5bWJvbF0gPSBcIkdlbmVyYXRvckZ1bmN0aW9uXCI7XG4gICAgICB9XG4gICAgfVxuICAgIGdlbkZ1bi5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKEdwKTtcbiAgICByZXR1cm4gZ2VuRnVuO1xuICB9O1xuXG4gIC8vIFdpdGhpbiB0aGUgYm9keSBvZiBhbnkgYXN5bmMgZnVuY3Rpb24sIGBhd2FpdCB4YCBpcyB0cmFuc2Zvcm1lZCB0b1xuICAvLyBgeWllbGQgcmVnZW5lcmF0b3JSdW50aW1lLmF3cmFwKHgpYCwgc28gdGhhdCB0aGUgcnVudGltZSBjYW4gdGVzdFxuICAvLyBgaGFzT3duLmNhbGwodmFsdWUsIFwiX19hd2FpdFwiKWAgdG8gZGV0ZXJtaW5lIGlmIHRoZSB5aWVsZGVkIHZhbHVlIGlzXG4gIC8vIG1lYW50IHRvIGJlIGF3YWl0ZWQuXG4gIHJ1bnRpbWUuYXdyYXAgPSBmdW5jdGlvbihhcmcpIHtcbiAgICByZXR1cm4geyBfX2F3YWl0OiBhcmcgfTtcbiAgfTtcblxuICBmdW5jdGlvbiBBc3luY0l0ZXJhdG9yKGdlbmVyYXRvcikge1xuICAgIGZ1bmN0aW9uIGludm9rZShtZXRob2QsIGFyZywgcmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICB2YXIgcmVjb3JkID0gdHJ5Q2F0Y2goZ2VuZXJhdG9yW21ldGhvZF0sIGdlbmVyYXRvciwgYXJnKTtcbiAgICAgIGlmIChyZWNvcmQudHlwZSA9PT0gXCJ0aHJvd1wiKSB7XG4gICAgICAgIHJlamVjdChyZWNvcmQuYXJnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhciByZXN1bHQgPSByZWNvcmQuYXJnO1xuICAgICAgICB2YXIgdmFsdWUgPSByZXN1bHQudmFsdWU7XG4gICAgICAgIGlmICh2YWx1ZSAmJlxuICAgICAgICAgICAgdHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiICYmXG4gICAgICAgICAgICBoYXNPd24uY2FsbCh2YWx1ZSwgXCJfX2F3YWl0XCIpKSB7XG4gICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh2YWx1ZS5fX2F3YWl0KS50aGVuKGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICAgICAgICBpbnZva2UoXCJuZXh0XCIsIHZhbHVlLCByZXNvbHZlLCByZWplY3QpO1xuICAgICAgICAgIH0sIGZ1bmN0aW9uKGVycikge1xuICAgICAgICAgICAgaW52b2tlKFwidGhyb3dcIiwgZXJyLCByZXNvbHZlLCByZWplY3QpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh2YWx1ZSkudGhlbihmdW5jdGlvbih1bndyYXBwZWQpIHtcbiAgICAgICAgICAvLyBXaGVuIGEgeWllbGRlZCBQcm9taXNlIGlzIHJlc29sdmVkLCBpdHMgZmluYWwgdmFsdWUgYmVjb21lc1xuICAgICAgICAgIC8vIHRoZSAudmFsdWUgb2YgdGhlIFByb21pc2U8e3ZhbHVlLGRvbmV9PiByZXN1bHQgZm9yIHRoZVxuICAgICAgICAgIC8vIGN1cnJlbnQgaXRlcmF0aW9uLiBJZiB0aGUgUHJvbWlzZSBpcyByZWplY3RlZCwgaG93ZXZlciwgdGhlXG4gICAgICAgICAgLy8gcmVzdWx0IGZvciB0aGlzIGl0ZXJhdGlvbiB3aWxsIGJlIHJlamVjdGVkIHdpdGggdGhlIHNhbWVcbiAgICAgICAgICAvLyByZWFzb24uIE5vdGUgdGhhdCByZWplY3Rpb25zIG9mIHlpZWxkZWQgUHJvbWlzZXMgYXJlIG5vdFxuICAgICAgICAgIC8vIHRocm93biBiYWNrIGludG8gdGhlIGdlbmVyYXRvciBmdW5jdGlvbiwgYXMgaXMgdGhlIGNhc2VcbiAgICAgICAgICAvLyB3aGVuIGFuIGF3YWl0ZWQgUHJvbWlzZSBpcyByZWplY3RlZC4gVGhpcyBkaWZmZXJlbmNlIGluXG4gICAgICAgICAgLy8gYmVoYXZpb3IgYmV0d2VlbiB5aWVsZCBhbmQgYXdhaXQgaXMgaW1wb3J0YW50LCBiZWNhdXNlIGl0XG4gICAgICAgICAgLy8gYWxsb3dzIHRoZSBjb25zdW1lciB0byBkZWNpZGUgd2hhdCB0byBkbyB3aXRoIHRoZSB5aWVsZGVkXG4gICAgICAgICAgLy8gcmVqZWN0aW9uIChzd2FsbG93IGl0IGFuZCBjb250aW51ZSwgbWFudWFsbHkgLnRocm93IGl0IGJhY2tcbiAgICAgICAgICAvLyBpbnRvIHRoZSBnZW5lcmF0b3IsIGFiYW5kb24gaXRlcmF0aW9uLCB3aGF0ZXZlcikuIFdpdGhcbiAgICAgICAgICAvLyBhd2FpdCwgYnkgY29udHJhc3QsIHRoZXJlIGlzIG5vIG9wcG9ydHVuaXR5IHRvIGV4YW1pbmUgdGhlXG4gICAgICAgICAgLy8gcmVqZWN0aW9uIHJlYXNvbiBvdXRzaWRlIHRoZSBnZW5lcmF0b3IgZnVuY3Rpb24sIHNvIHRoZVxuICAgICAgICAgIC8vIG9ubHkgb3B0aW9uIGlzIHRvIHRocm93IGl0IGZyb20gdGhlIGF3YWl0IGV4cHJlc3Npb24sIGFuZFxuICAgICAgICAgIC8vIGxldCB0aGUgZ2VuZXJhdG9yIGZ1bmN0aW9uIGhhbmRsZSB0aGUgZXhjZXB0aW9uLlxuICAgICAgICAgIHJlc3VsdC52YWx1ZSA9IHVud3JhcHBlZDtcbiAgICAgICAgICByZXNvbHZlKHJlc3VsdCk7XG4gICAgICAgIH0sIHJlamVjdCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBnbG9iYWwucHJvY2VzcyA9PT0gXCJvYmplY3RcIiAmJiBnbG9iYWwucHJvY2Vzcy5kb21haW4pIHtcbiAgICAgIGludm9rZSA9IGdsb2JhbC5wcm9jZXNzLmRvbWFpbi5iaW5kKGludm9rZSk7XG4gICAgfVxuXG4gICAgdmFyIHByZXZpb3VzUHJvbWlzZTtcblxuICAgIGZ1bmN0aW9uIGVucXVldWUobWV0aG9kLCBhcmcpIHtcbiAgICAgIGZ1bmN0aW9uIGNhbGxJbnZva2VXaXRoTWV0aG9kQW5kQXJnKCkge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgICAgaW52b2tlKG1ldGhvZCwgYXJnLCByZXNvbHZlLCByZWplY3QpO1xuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHByZXZpb3VzUHJvbWlzZSA9XG4gICAgICAgIC8vIElmIGVucXVldWUgaGFzIGJlZW4gY2FsbGVkIGJlZm9yZSwgdGhlbiB3ZSB3YW50IHRvIHdhaXQgdW50aWxcbiAgICAgICAgLy8gYWxsIHByZXZpb3VzIFByb21pc2VzIGhhdmUgYmVlbiByZXNvbHZlZCBiZWZvcmUgY2FsbGluZyBpbnZva2UsXG4gICAgICAgIC8vIHNvIHRoYXQgcmVzdWx0cyBhcmUgYWx3YXlzIGRlbGl2ZXJlZCBpbiB0aGUgY29ycmVjdCBvcmRlci4gSWZcbiAgICAgICAgLy8gZW5xdWV1ZSBoYXMgbm90IGJlZW4gY2FsbGVkIGJlZm9yZSwgdGhlbiBpdCBpcyBpbXBvcnRhbnQgdG9cbiAgICAgICAgLy8gY2FsbCBpbnZva2UgaW1tZWRpYXRlbHksIHdpdGhvdXQgd2FpdGluZyBvbiBhIGNhbGxiYWNrIHRvIGZpcmUsXG4gICAgICAgIC8vIHNvIHRoYXQgdGhlIGFzeW5jIGdlbmVyYXRvciBmdW5jdGlvbiBoYXMgdGhlIG9wcG9ydHVuaXR5IHRvIGRvXG4gICAgICAgIC8vIGFueSBuZWNlc3Nhcnkgc2V0dXAgaW4gYSBwcmVkaWN0YWJsZSB3YXkuIFRoaXMgcHJlZGljdGFiaWxpdHlcbiAgICAgICAgLy8gaXMgd2h5IHRoZSBQcm9taXNlIGNvbnN0cnVjdG9yIHN5bmNocm9ub3VzbHkgaW52b2tlcyBpdHNcbiAgICAgICAgLy8gZXhlY3V0b3IgY2FsbGJhY2ssIGFuZCB3aHkgYXN5bmMgZnVuY3Rpb25zIHN5bmNocm9ub3VzbHlcbiAgICAgICAgLy8gZXhlY3V0ZSBjb2RlIGJlZm9yZSB0aGUgZmlyc3QgYXdhaXQuIFNpbmNlIHdlIGltcGxlbWVudCBzaW1wbGVcbiAgICAgICAgLy8gYXN5bmMgZnVuY3Rpb25zIGluIHRlcm1zIG9mIGFzeW5jIGdlbmVyYXRvcnMsIGl0IGlzIGVzcGVjaWFsbHlcbiAgICAgICAgLy8gaW1wb3J0YW50IHRvIGdldCB0aGlzIHJpZ2h0LCBldmVuIHRob3VnaCBpdCByZXF1aXJlcyBjYXJlLlxuICAgICAgICBwcmV2aW91c1Byb21pc2UgPyBwcmV2aW91c1Byb21pc2UudGhlbihcbiAgICAgICAgICBjYWxsSW52b2tlV2l0aE1ldGhvZEFuZEFyZyxcbiAgICAgICAgICAvLyBBdm9pZCBwcm9wYWdhdGluZyBmYWlsdXJlcyB0byBQcm9taXNlcyByZXR1cm5lZCBieSBsYXRlclxuICAgICAgICAgIC8vIGludm9jYXRpb25zIG9mIHRoZSBpdGVyYXRvci5cbiAgICAgICAgICBjYWxsSW52b2tlV2l0aE1ldGhvZEFuZEFyZ1xuICAgICAgICApIDogY2FsbEludm9rZVdpdGhNZXRob2RBbmRBcmcoKTtcbiAgICB9XG5cbiAgICAvLyBEZWZpbmUgdGhlIHVuaWZpZWQgaGVscGVyIG1ldGhvZCB0aGF0IGlzIHVzZWQgdG8gaW1wbGVtZW50IC5uZXh0LFxuICAgIC8vIC50aHJvdywgYW5kIC5yZXR1cm4gKHNlZSBkZWZpbmVJdGVyYXRvck1ldGhvZHMpLlxuICAgIHRoaXMuX2ludm9rZSA9IGVucXVldWU7XG4gIH1cblxuICBkZWZpbmVJdGVyYXRvck1ldGhvZHMoQXN5bmNJdGVyYXRvci5wcm90b3R5cGUpO1xuICBBc3luY0l0ZXJhdG9yLnByb3RvdHlwZVthc3luY0l0ZXJhdG9yU3ltYm9sXSA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdGhpcztcbiAgfTtcbiAgcnVudGltZS5Bc3luY0l0ZXJhdG9yID0gQXN5bmNJdGVyYXRvcjtcblxuICAvLyBOb3RlIHRoYXQgc2ltcGxlIGFzeW5jIGZ1bmN0aW9ucyBhcmUgaW1wbGVtZW50ZWQgb24gdG9wIG9mXG4gIC8vIEFzeW5jSXRlcmF0b3Igb2JqZWN0czsgdGhleSBqdXN0IHJldHVybiBhIFByb21pc2UgZm9yIHRoZSB2YWx1ZSBvZlxuICAvLyB0aGUgZmluYWwgcmVzdWx0IHByb2R1Y2VkIGJ5IHRoZSBpdGVyYXRvci5cbiAgcnVudGltZS5hc3luYyA9IGZ1bmN0aW9uKGlubmVyRm4sIG91dGVyRm4sIHNlbGYsIHRyeUxvY3NMaXN0KSB7XG4gICAgdmFyIGl0ZXIgPSBuZXcgQXN5bmNJdGVyYXRvcihcbiAgICAgIHdyYXAoaW5uZXJGbiwgb3V0ZXJGbiwgc2VsZiwgdHJ5TG9jc0xpc3QpXG4gICAgKTtcblxuICAgIHJldHVybiBydW50aW1lLmlzR2VuZXJhdG9yRnVuY3Rpb24ob3V0ZXJGbilcbiAgICAgID8gaXRlciAvLyBJZiBvdXRlckZuIGlzIGEgZ2VuZXJhdG9yLCByZXR1cm4gdGhlIGZ1bGwgaXRlcmF0b3IuXG4gICAgICA6IGl0ZXIubmV4dCgpLnRoZW4oZnVuY3Rpb24ocmVzdWx0KSB7XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdC5kb25lID8gcmVzdWx0LnZhbHVlIDogaXRlci5uZXh0KCk7XG4gICAgICAgIH0pO1xuICB9O1xuXG4gIGZ1bmN0aW9uIG1ha2VJbnZva2VNZXRob2QoaW5uZXJGbiwgc2VsZiwgY29udGV4dCkge1xuICAgIHZhciBzdGF0ZSA9IEdlblN0YXRlU3VzcGVuZGVkU3RhcnQ7XG5cbiAgICByZXR1cm4gZnVuY3Rpb24gaW52b2tlKG1ldGhvZCwgYXJnKSB7XG4gICAgICBpZiAoc3RhdGUgPT09IEdlblN0YXRlRXhlY3V0aW5nKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkdlbmVyYXRvciBpcyBhbHJlYWR5IHJ1bm5pbmdcIik7XG4gICAgICB9XG5cbiAgICAgIGlmIChzdGF0ZSA9PT0gR2VuU3RhdGVDb21wbGV0ZWQpIHtcbiAgICAgICAgaWYgKG1ldGhvZCA9PT0gXCJ0aHJvd1wiKSB7XG4gICAgICAgICAgdGhyb3cgYXJnO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQmUgZm9yZ2l2aW5nLCBwZXIgMjUuMy4zLjMuMyBvZiB0aGUgc3BlYzpcbiAgICAgICAgLy8gaHR0cHM6Ly9wZW9wbGUubW96aWxsYS5vcmcvfmpvcmVuZG9yZmYvZXM2LWRyYWZ0Lmh0bWwjc2VjLWdlbmVyYXRvcnJlc3VtZVxuICAgICAgICByZXR1cm4gZG9uZVJlc3VsdCgpO1xuICAgICAgfVxuXG4gICAgICBjb250ZXh0Lm1ldGhvZCA9IG1ldGhvZDtcbiAgICAgIGNvbnRleHQuYXJnID0gYXJnO1xuXG4gICAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICB2YXIgZGVsZWdhdGUgPSBjb250ZXh0LmRlbGVnYXRlO1xuICAgICAgICBpZiAoZGVsZWdhdGUpIHtcbiAgICAgICAgICB2YXIgZGVsZWdhdGVSZXN1bHQgPSBtYXliZUludm9rZURlbGVnYXRlKGRlbGVnYXRlLCBjb250ZXh0KTtcbiAgICAgICAgICBpZiAoZGVsZWdhdGVSZXN1bHQpIHtcbiAgICAgICAgICAgIGlmIChkZWxlZ2F0ZVJlc3VsdCA9PT0gQ29udGludWVTZW50aW5lbCkgY29udGludWU7XG4gICAgICAgICAgICByZXR1cm4gZGVsZWdhdGVSZXN1bHQ7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvbnRleHQubWV0aG9kID09PSBcIm5leHRcIikge1xuICAgICAgICAgIC8vIFNldHRpbmcgY29udGV4dC5fc2VudCBmb3IgbGVnYWN5IHN1cHBvcnQgb2YgQmFiZWwnc1xuICAgICAgICAgIC8vIGZ1bmN0aW9uLnNlbnQgaW1wbGVtZW50YXRpb24uXG4gICAgICAgICAgY29udGV4dC5zZW50ID0gY29udGV4dC5fc2VudCA9IGNvbnRleHQuYXJnO1xuXG4gICAgICAgIH0gZWxzZSBpZiAoY29udGV4dC5tZXRob2QgPT09IFwidGhyb3dcIikge1xuICAgICAgICAgIGlmIChzdGF0ZSA9PT0gR2VuU3RhdGVTdXNwZW5kZWRTdGFydCkge1xuICAgICAgICAgICAgc3RhdGUgPSBHZW5TdGF0ZUNvbXBsZXRlZDtcbiAgICAgICAgICAgIHRocm93IGNvbnRleHQuYXJnO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnRleHQuZGlzcGF0Y2hFeGNlcHRpb24oY29udGV4dC5hcmcpO1xuXG4gICAgICAgIH0gZWxzZSBpZiAoY29udGV4dC5tZXRob2QgPT09IFwicmV0dXJuXCIpIHtcbiAgICAgICAgICBjb250ZXh0LmFicnVwdChcInJldHVyblwiLCBjb250ZXh0LmFyZyk7XG4gICAgICAgIH1cblxuICAgICAgICBzdGF0ZSA9IEdlblN0YXRlRXhlY3V0aW5nO1xuXG4gICAgICAgIHZhciByZWNvcmQgPSB0cnlDYXRjaChpbm5lckZuLCBzZWxmLCBjb250ZXh0KTtcbiAgICAgICAgaWYgKHJlY29yZC50eXBlID09PSBcIm5vcm1hbFwiKSB7XG4gICAgICAgICAgLy8gSWYgYW4gZXhjZXB0aW9uIGlzIHRocm93biBmcm9tIGlubmVyRm4sIHdlIGxlYXZlIHN0YXRlID09PVxuICAgICAgICAgIC8vIEdlblN0YXRlRXhlY3V0aW5nIGFuZCBsb29wIGJhY2sgZm9yIGFub3RoZXIgaW52b2NhdGlvbi5cbiAgICAgICAgICBzdGF0ZSA9IGNvbnRleHQuZG9uZVxuICAgICAgICAgICAgPyBHZW5TdGF0ZUNvbXBsZXRlZFxuICAgICAgICAgICAgOiBHZW5TdGF0ZVN1c3BlbmRlZFlpZWxkO1xuXG4gICAgICAgICAgaWYgKHJlY29yZC5hcmcgPT09IENvbnRpbnVlU2VudGluZWwpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB2YWx1ZTogcmVjb3JkLmFyZyxcbiAgICAgICAgICAgIGRvbmU6IGNvbnRleHQuZG9uZVxuICAgICAgICAgIH07XG5cbiAgICAgICAgfSBlbHNlIGlmIChyZWNvcmQudHlwZSA9PT0gXCJ0aHJvd1wiKSB7XG4gICAgICAgICAgc3RhdGUgPSBHZW5TdGF0ZUNvbXBsZXRlZDtcbiAgICAgICAgICAvLyBEaXNwYXRjaCB0aGUgZXhjZXB0aW9uIGJ5IGxvb3BpbmcgYmFjayBhcm91bmQgdG8gdGhlXG4gICAgICAgICAgLy8gY29udGV4dC5kaXNwYXRjaEV4Y2VwdGlvbihjb250ZXh0LmFyZykgY2FsbCBhYm92ZS5cbiAgICAgICAgICBjb250ZXh0Lm1ldGhvZCA9IFwidGhyb3dcIjtcbiAgICAgICAgICBjb250ZXh0LmFyZyA9IHJlY29yZC5hcmc7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgLy8gQ2FsbCBkZWxlZ2F0ZS5pdGVyYXRvcltjb250ZXh0Lm1ldGhvZF0oY29udGV4dC5hcmcpIGFuZCBoYW5kbGUgdGhlXG4gIC8vIHJlc3VsdCwgZWl0aGVyIGJ5IHJldHVybmluZyBhIHsgdmFsdWUsIGRvbmUgfSByZXN1bHQgZnJvbSB0aGVcbiAgLy8gZGVsZWdhdGUgaXRlcmF0b3IsIG9yIGJ5IG1vZGlmeWluZyBjb250ZXh0Lm1ldGhvZCBhbmQgY29udGV4dC5hcmcsXG4gIC8vIHNldHRpbmcgY29udGV4dC5kZWxlZ2F0ZSB0byBudWxsLCBhbmQgcmV0dXJuaW5nIHRoZSBDb250aW51ZVNlbnRpbmVsLlxuICBmdW5jdGlvbiBtYXliZUludm9rZURlbGVnYXRlKGRlbGVnYXRlLCBjb250ZXh0KSB7XG4gICAgdmFyIG1ldGhvZCA9IGRlbGVnYXRlLml0ZXJhdG9yW2NvbnRleHQubWV0aG9kXTtcbiAgICBpZiAobWV0aG9kID09PSB1bmRlZmluZWQpIHtcbiAgICAgIC8vIEEgLnRocm93IG9yIC5yZXR1cm4gd2hlbiB0aGUgZGVsZWdhdGUgaXRlcmF0b3IgaGFzIG5vIC50aHJvd1xuICAgICAgLy8gbWV0aG9kIGFsd2F5cyB0ZXJtaW5hdGVzIHRoZSB5aWVsZCogbG9vcC5cbiAgICAgIGNvbnRleHQuZGVsZWdhdGUgPSBudWxsO1xuXG4gICAgICBpZiAoY29udGV4dC5tZXRob2QgPT09IFwidGhyb3dcIikge1xuICAgICAgICBpZiAoZGVsZWdhdGUuaXRlcmF0b3IucmV0dXJuKSB7XG4gICAgICAgICAgLy8gSWYgdGhlIGRlbGVnYXRlIGl0ZXJhdG9yIGhhcyBhIHJldHVybiBtZXRob2QsIGdpdmUgaXQgYVxuICAgICAgICAgIC8vIGNoYW5jZSB0byBjbGVhbiB1cC5cbiAgICAgICAgICBjb250ZXh0Lm1ldGhvZCA9IFwicmV0dXJuXCI7XG4gICAgICAgICAgY29udGV4dC5hcmcgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgbWF5YmVJbnZva2VEZWxlZ2F0ZShkZWxlZ2F0ZSwgY29udGV4dCk7XG5cbiAgICAgICAgICBpZiAoY29udGV4dC5tZXRob2QgPT09IFwidGhyb3dcIikge1xuICAgICAgICAgICAgLy8gSWYgbWF5YmVJbnZva2VEZWxlZ2F0ZShjb250ZXh0KSBjaGFuZ2VkIGNvbnRleHQubWV0aG9kIGZyb21cbiAgICAgICAgICAgIC8vIFwicmV0dXJuXCIgdG8gXCJ0aHJvd1wiLCBsZXQgdGhhdCBvdmVycmlkZSB0aGUgVHlwZUVycm9yIGJlbG93LlxuICAgICAgICAgICAgcmV0dXJuIENvbnRpbnVlU2VudGluZWw7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29udGV4dC5tZXRob2QgPSBcInRocm93XCI7XG4gICAgICAgIGNvbnRleHQuYXJnID0gbmV3IFR5cGVFcnJvcihcbiAgICAgICAgICBcIlRoZSBpdGVyYXRvciBkb2VzIG5vdCBwcm92aWRlIGEgJ3Rocm93JyBtZXRob2RcIik7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBDb250aW51ZVNlbnRpbmVsO1xuICAgIH1cblxuICAgIHZhciByZWNvcmQgPSB0cnlDYXRjaChtZXRob2QsIGRlbGVnYXRlLml0ZXJhdG9yLCBjb250ZXh0LmFyZyk7XG5cbiAgICBpZiAocmVjb3JkLnR5cGUgPT09IFwidGhyb3dcIikge1xuICAgICAgY29udGV4dC5tZXRob2QgPSBcInRocm93XCI7XG4gICAgICBjb250ZXh0LmFyZyA9IHJlY29yZC5hcmc7XG4gICAgICBjb250ZXh0LmRlbGVnYXRlID0gbnVsbDtcbiAgICAgIHJldHVybiBDb250aW51ZVNlbnRpbmVsO1xuICAgIH1cblxuICAgIHZhciBpbmZvID0gcmVjb3JkLmFyZztcblxuICAgIGlmICghIGluZm8pIHtcbiAgICAgIGNvbnRleHQubWV0aG9kID0gXCJ0aHJvd1wiO1xuICAgICAgY29udGV4dC5hcmcgPSBuZXcgVHlwZUVycm9yKFwiaXRlcmF0b3IgcmVzdWx0IGlzIG5vdCBhbiBvYmplY3RcIik7XG4gICAgICBjb250ZXh0LmRlbGVnYXRlID0gbnVsbDtcbiAgICAgIHJldHVybiBDb250aW51ZVNlbnRpbmVsO1xuICAgIH1cblxuICAgIGlmIChpbmZvLmRvbmUpIHtcbiAgICAgIC8vIEFzc2lnbiB0aGUgcmVzdWx0IG9mIHRoZSBmaW5pc2hlZCBkZWxlZ2F0ZSB0byB0aGUgdGVtcG9yYXJ5XG4gICAgICAvLyB2YXJpYWJsZSBzcGVjaWZpZWQgYnkgZGVsZWdhdGUucmVzdWx0TmFtZSAoc2VlIGRlbGVnYXRlWWllbGQpLlxuICAgICAgY29udGV4dFtkZWxlZ2F0ZS5yZXN1bHROYW1lXSA9IGluZm8udmFsdWU7XG5cbiAgICAgIC8vIFJlc3VtZSBleGVjdXRpb24gYXQgdGhlIGRlc2lyZWQgbG9jYXRpb24gKHNlZSBkZWxlZ2F0ZVlpZWxkKS5cbiAgICAgIGNvbnRleHQubmV4dCA9IGRlbGVnYXRlLm5leHRMb2M7XG5cbiAgICAgIC8vIElmIGNvbnRleHQubWV0aG9kIHdhcyBcInRocm93XCIgYnV0IHRoZSBkZWxlZ2F0ZSBoYW5kbGVkIHRoZVxuICAgICAgLy8gZXhjZXB0aW9uLCBsZXQgdGhlIG91dGVyIGdlbmVyYXRvciBwcm9jZWVkIG5vcm1hbGx5LiBJZlxuICAgICAgLy8gY29udGV4dC5tZXRob2Qgd2FzIFwibmV4dFwiLCBmb3JnZXQgY29udGV4dC5hcmcgc2luY2UgaXQgaGFzIGJlZW5cbiAgICAgIC8vIFwiY29uc3VtZWRcIiBieSB0aGUgZGVsZWdhdGUgaXRlcmF0b3IuIElmIGNvbnRleHQubWV0aG9kIHdhc1xuICAgICAgLy8gXCJyZXR1cm5cIiwgYWxsb3cgdGhlIG9yaWdpbmFsIC5yZXR1cm4gY2FsbCB0byBjb250aW51ZSBpbiB0aGVcbiAgICAgIC8vIG91dGVyIGdlbmVyYXRvci5cbiAgICAgIGlmIChjb250ZXh0Lm1ldGhvZCAhPT0gXCJyZXR1cm5cIikge1xuICAgICAgICBjb250ZXh0Lm1ldGhvZCA9IFwibmV4dFwiO1xuICAgICAgICBjb250ZXh0LmFyZyA9IHVuZGVmaW5lZDtcbiAgICAgIH1cblxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBSZS15aWVsZCB0aGUgcmVzdWx0IHJldHVybmVkIGJ5IHRoZSBkZWxlZ2F0ZSBtZXRob2QuXG4gICAgICByZXR1cm4gaW5mbztcbiAgICB9XG5cbiAgICAvLyBUaGUgZGVsZWdhdGUgaXRlcmF0b3IgaXMgZmluaXNoZWQsIHNvIGZvcmdldCBpdCBhbmQgY29udGludWUgd2l0aFxuICAgIC8vIHRoZSBvdXRlciBnZW5lcmF0b3IuXG4gICAgY29udGV4dC5kZWxlZ2F0ZSA9IG51bGw7XG4gICAgcmV0dXJuIENvbnRpbnVlU2VudGluZWw7XG4gIH1cblxuICAvLyBEZWZpbmUgR2VuZXJhdG9yLnByb3RvdHlwZS57bmV4dCx0aHJvdyxyZXR1cm59IGluIHRlcm1zIG9mIHRoZVxuICAvLyB1bmlmaWVkIC5faW52b2tlIGhlbHBlciBtZXRob2QuXG4gIGRlZmluZUl0ZXJhdG9yTWV0aG9kcyhHcCk7XG5cbiAgR3BbdG9TdHJpbmdUYWdTeW1ib2xdID0gXCJHZW5lcmF0b3JcIjtcblxuICAvLyBBIEdlbmVyYXRvciBzaG91bGQgYWx3YXlzIHJldHVybiBpdHNlbGYgYXMgdGhlIGl0ZXJhdG9yIG9iamVjdCB3aGVuIHRoZVxuICAvLyBAQGl0ZXJhdG9yIGZ1bmN0aW9uIGlzIGNhbGxlZCBvbiBpdC4gU29tZSBicm93c2VycycgaW1wbGVtZW50YXRpb25zIG9mIHRoZVxuICAvLyBpdGVyYXRvciBwcm90b3R5cGUgY2hhaW4gaW5jb3JyZWN0bHkgaW1wbGVtZW50IHRoaXMsIGNhdXNpbmcgdGhlIEdlbmVyYXRvclxuICAvLyBvYmplY3QgdG8gbm90IGJlIHJldHVybmVkIGZyb20gdGhpcyBjYWxsLiBUaGlzIGVuc3VyZXMgdGhhdCBkb2Vzbid0IGhhcHBlbi5cbiAgLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWdlbmVyYXRvci9pc3N1ZXMvMjc0IGZvciBtb3JlIGRldGFpbHMuXG4gIEdwW2l0ZXJhdG9yU3ltYm9sXSA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiB0aGlzO1xuICB9O1xuXG4gIEdwLnRvU3RyaW5nID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIFwiW29iamVjdCBHZW5lcmF0b3JdXCI7XG4gIH07XG5cbiAgZnVuY3Rpb24gcHVzaFRyeUVudHJ5KGxvY3MpIHtcbiAgICB2YXIgZW50cnkgPSB7IHRyeUxvYzogbG9jc1swXSB9O1xuXG4gICAgaWYgKDEgaW4gbG9jcykge1xuICAgICAgZW50cnkuY2F0Y2hMb2MgPSBsb2NzWzFdO1xuICAgIH1cblxuICAgIGlmICgyIGluIGxvY3MpIHtcbiAgICAgIGVudHJ5LmZpbmFsbHlMb2MgPSBsb2NzWzJdO1xuICAgICAgZW50cnkuYWZ0ZXJMb2MgPSBsb2NzWzNdO1xuICAgIH1cblxuICAgIHRoaXMudHJ5RW50cmllcy5wdXNoKGVudHJ5KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHJlc2V0VHJ5RW50cnkoZW50cnkpIHtcbiAgICB2YXIgcmVjb3JkID0gZW50cnkuY29tcGxldGlvbiB8fCB7fTtcbiAgICByZWNvcmQudHlwZSA9IFwibm9ybWFsXCI7XG4gICAgZGVsZXRlIHJlY29yZC5hcmc7XG4gICAgZW50cnkuY29tcGxldGlvbiA9IHJlY29yZDtcbiAgfVxuXG4gIGZ1bmN0aW9uIENvbnRleHQodHJ5TG9jc0xpc3QpIHtcbiAgICAvLyBUaGUgcm9vdCBlbnRyeSBvYmplY3QgKGVmZmVjdGl2ZWx5IGEgdHJ5IHN0YXRlbWVudCB3aXRob3V0IGEgY2F0Y2hcbiAgICAvLyBvciBhIGZpbmFsbHkgYmxvY2spIGdpdmVzIHVzIGEgcGxhY2UgdG8gc3RvcmUgdmFsdWVzIHRocm93biBmcm9tXG4gICAgLy8gbG9jYXRpb25zIHdoZXJlIHRoZXJlIGlzIG5vIGVuY2xvc2luZyB0cnkgc3RhdGVtZW50LlxuICAgIHRoaXMudHJ5RW50cmllcyA9IFt7IHRyeUxvYzogXCJyb290XCIgfV07XG4gICAgdHJ5TG9jc0xpc3QuZm9yRWFjaChwdXNoVHJ5RW50cnksIHRoaXMpO1xuICAgIHRoaXMucmVzZXQodHJ1ZSk7XG4gIH1cblxuICBydW50aW1lLmtleXMgPSBmdW5jdGlvbihvYmplY3QpIHtcbiAgICB2YXIga2V5cyA9IFtdO1xuICAgIGZvciAodmFyIGtleSBpbiBvYmplY3QpIHtcbiAgICAgIGtleXMucHVzaChrZXkpO1xuICAgIH1cbiAgICBrZXlzLnJldmVyc2UoKTtcblxuICAgIC8vIFJhdGhlciB0aGFuIHJldHVybmluZyBhbiBvYmplY3Qgd2l0aCBhIG5leHQgbWV0aG9kLCB3ZSBrZWVwXG4gICAgLy8gdGhpbmdzIHNpbXBsZSBhbmQgcmV0dXJuIHRoZSBuZXh0IGZ1bmN0aW9uIGl0c2VsZi5cbiAgICByZXR1cm4gZnVuY3Rpb24gbmV4dCgpIHtcbiAgICAgIHdoaWxlIChrZXlzLmxlbmd0aCkge1xuICAgICAgICB2YXIga2V5ID0ga2V5cy5wb3AoKTtcbiAgICAgICAgaWYgKGtleSBpbiBvYmplY3QpIHtcbiAgICAgICAgICBuZXh0LnZhbHVlID0ga2V5O1xuICAgICAgICAgIG5leHQuZG9uZSA9IGZhbHNlO1xuICAgICAgICAgIHJldHVybiBuZXh0O1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFRvIGF2b2lkIGNyZWF0aW5nIGFuIGFkZGl0aW9uYWwgb2JqZWN0LCB3ZSBqdXN0IGhhbmcgdGhlIC52YWx1ZVxuICAgICAgLy8gYW5kIC5kb25lIHByb3BlcnRpZXMgb2ZmIHRoZSBuZXh0IGZ1bmN0aW9uIG9iamVjdCBpdHNlbGYuIFRoaXNcbiAgICAgIC8vIGFsc28gZW5zdXJlcyB0aGF0IHRoZSBtaW5pZmllciB3aWxsIG5vdCBhbm9ueW1pemUgdGhlIGZ1bmN0aW9uLlxuICAgICAgbmV4dC5kb25lID0gdHJ1ZTtcbiAgICAgIHJldHVybiBuZXh0O1xuICAgIH07XG4gIH07XG5cbiAgZnVuY3Rpb24gdmFsdWVzKGl0ZXJhYmxlKSB7XG4gICAgaWYgKGl0ZXJhYmxlKSB7XG4gICAgICB2YXIgaXRlcmF0b3JNZXRob2QgPSBpdGVyYWJsZVtpdGVyYXRvclN5bWJvbF07XG4gICAgICBpZiAoaXRlcmF0b3JNZXRob2QpIHtcbiAgICAgICAgcmV0dXJuIGl0ZXJhdG9yTWV0aG9kLmNhbGwoaXRlcmFibGUpO1xuICAgICAgfVxuXG4gICAgICBpZiAodHlwZW9mIGl0ZXJhYmxlLm5leHQgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICByZXR1cm4gaXRlcmFibGU7XG4gICAgICB9XG5cbiAgICAgIGlmICghaXNOYU4oaXRlcmFibGUubGVuZ3RoKSkge1xuICAgICAgICB2YXIgaSA9IC0xLCBuZXh0ID0gZnVuY3Rpb24gbmV4dCgpIHtcbiAgICAgICAgICB3aGlsZSAoKytpIDwgaXRlcmFibGUubGVuZ3RoKSB7XG4gICAgICAgICAgICBpZiAoaGFzT3duLmNhbGwoaXRlcmFibGUsIGkpKSB7XG4gICAgICAgICAgICAgIG5leHQudmFsdWUgPSBpdGVyYWJsZVtpXTtcbiAgICAgICAgICAgICAgbmV4dC5kb25lID0gZmFsc2U7XG4gICAgICAgICAgICAgIHJldHVybiBuZXh0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIG5leHQudmFsdWUgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgbmV4dC5kb25lID0gdHJ1ZTtcblxuICAgICAgICAgIHJldHVybiBuZXh0O1xuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiBuZXh0Lm5leHQgPSBuZXh0O1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFJldHVybiBhbiBpdGVyYXRvciB3aXRoIG5vIHZhbHVlcy5cbiAgICByZXR1cm4geyBuZXh0OiBkb25lUmVzdWx0IH07XG4gIH1cbiAgcnVudGltZS52YWx1ZXMgPSB2YWx1ZXM7XG5cbiAgZnVuY3Rpb24gZG9uZVJlc3VsdCgpIHtcbiAgICByZXR1cm4geyB2YWx1ZTogdW5kZWZpbmVkLCBkb25lOiB0cnVlIH07XG4gIH1cblxuICBDb250ZXh0LnByb3RvdHlwZSA9IHtcbiAgICBjb25zdHJ1Y3RvcjogQ29udGV4dCxcblxuICAgIHJlc2V0OiBmdW5jdGlvbihza2lwVGVtcFJlc2V0KSB7XG4gICAgICB0aGlzLnByZXYgPSAwO1xuICAgICAgdGhpcy5uZXh0ID0gMDtcbiAgICAgIC8vIFJlc2V0dGluZyBjb250ZXh0Ll9zZW50IGZvciBsZWdhY3kgc3VwcG9ydCBvZiBCYWJlbCdzXG4gICAgICAvLyBmdW5jdGlvbi5zZW50IGltcGxlbWVudGF0aW9uLlxuICAgICAgdGhpcy5zZW50ID0gdGhpcy5fc2VudCA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuZG9uZSA9IGZhbHNlO1xuICAgICAgdGhpcy5kZWxlZ2F0ZSA9IG51bGw7XG5cbiAgICAgIHRoaXMubWV0aG9kID0gXCJuZXh0XCI7XG4gICAgICB0aGlzLmFyZyA9IHVuZGVmaW5lZDtcblxuICAgICAgdGhpcy50cnlFbnRyaWVzLmZvckVhY2gocmVzZXRUcnlFbnRyeSk7XG5cbiAgICAgIGlmICghc2tpcFRlbXBSZXNldCkge1xuICAgICAgICBmb3IgKHZhciBuYW1lIGluIHRoaXMpIHtcbiAgICAgICAgICAvLyBOb3Qgc3VyZSBhYm91dCB0aGUgb3B0aW1hbCBvcmRlciBvZiB0aGVzZSBjb25kaXRpb25zOlxuICAgICAgICAgIGlmIChuYW1lLmNoYXJBdCgwKSA9PT0gXCJ0XCIgJiZcbiAgICAgICAgICAgICAgaGFzT3duLmNhbGwodGhpcywgbmFtZSkgJiZcbiAgICAgICAgICAgICAgIWlzTmFOKCtuYW1lLnNsaWNlKDEpKSkge1xuICAgICAgICAgICAgdGhpc1tuYW1lXSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuXG4gICAgc3RvcDogZnVuY3Rpb24oKSB7XG4gICAgICB0aGlzLmRvbmUgPSB0cnVlO1xuXG4gICAgICB2YXIgcm9vdEVudHJ5ID0gdGhpcy50cnlFbnRyaWVzWzBdO1xuICAgICAgdmFyIHJvb3RSZWNvcmQgPSByb290RW50cnkuY29tcGxldGlvbjtcbiAgICAgIGlmIChyb290UmVjb3JkLnR5cGUgPT09IFwidGhyb3dcIikge1xuICAgICAgICB0aHJvdyByb290UmVjb3JkLmFyZztcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRoaXMucnZhbDtcbiAgICB9LFxuXG4gICAgZGlzcGF0Y2hFeGNlcHRpb246IGZ1bmN0aW9uKGV4Y2VwdGlvbikge1xuICAgICAgaWYgKHRoaXMuZG9uZSkge1xuICAgICAgICB0aHJvdyBleGNlcHRpb247XG4gICAgICB9XG5cbiAgICAgIHZhciBjb250ZXh0ID0gdGhpcztcbiAgICAgIGZ1bmN0aW9uIGhhbmRsZShsb2MsIGNhdWdodCkge1xuICAgICAgICByZWNvcmQudHlwZSA9IFwidGhyb3dcIjtcbiAgICAgICAgcmVjb3JkLmFyZyA9IGV4Y2VwdGlvbjtcbiAgICAgICAgY29udGV4dC5uZXh0ID0gbG9jO1xuXG4gICAgICAgIGlmIChjYXVnaHQpIHtcbiAgICAgICAgICAvLyBJZiB0aGUgZGlzcGF0Y2hlZCBleGNlcHRpb24gd2FzIGNhdWdodCBieSBhIGNhdGNoIGJsb2NrLFxuICAgICAgICAgIC8vIHRoZW4gbGV0IHRoYXQgY2F0Y2ggYmxvY2sgaGFuZGxlIHRoZSBleGNlcHRpb24gbm9ybWFsbHkuXG4gICAgICAgICAgY29udGV4dC5tZXRob2QgPSBcIm5leHRcIjtcbiAgICAgICAgICBjb250ZXh0LmFyZyA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiAhISBjYXVnaHQ7XG4gICAgICB9XG5cbiAgICAgIGZvciAodmFyIGkgPSB0aGlzLnRyeUVudHJpZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyAtLWkpIHtcbiAgICAgICAgdmFyIGVudHJ5ID0gdGhpcy50cnlFbnRyaWVzW2ldO1xuICAgICAgICB2YXIgcmVjb3JkID0gZW50cnkuY29tcGxldGlvbjtcblxuICAgICAgICBpZiAoZW50cnkudHJ5TG9jID09PSBcInJvb3RcIikge1xuICAgICAgICAgIC8vIEV4Y2VwdGlvbiB0aHJvd24gb3V0c2lkZSBvZiBhbnkgdHJ5IGJsb2NrIHRoYXQgY291bGQgaGFuZGxlXG4gICAgICAgICAgLy8gaXQsIHNvIHNldCB0aGUgY29tcGxldGlvbiB2YWx1ZSBvZiB0aGUgZW50aXJlIGZ1bmN0aW9uIHRvXG4gICAgICAgICAgLy8gdGhyb3cgdGhlIGV4Y2VwdGlvbi5cbiAgICAgICAgICByZXR1cm4gaGFuZGxlKFwiZW5kXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGVudHJ5LnRyeUxvYyA8PSB0aGlzLnByZXYpIHtcbiAgICAgICAgICB2YXIgaGFzQ2F0Y2ggPSBoYXNPd24uY2FsbChlbnRyeSwgXCJjYXRjaExvY1wiKTtcbiAgICAgICAgICB2YXIgaGFzRmluYWxseSA9IGhhc093bi5jYWxsKGVudHJ5LCBcImZpbmFsbHlMb2NcIik7XG5cbiAgICAgICAgICBpZiAoaGFzQ2F0Y2ggJiYgaGFzRmluYWxseSkge1xuICAgICAgICAgICAgaWYgKHRoaXMucHJldiA8IGVudHJ5LmNhdGNoTG9jKSB7XG4gICAgICAgICAgICAgIHJldHVybiBoYW5kbGUoZW50cnkuY2F0Y2hMb2MsIHRydWUpO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLnByZXYgPCBlbnRyeS5maW5hbGx5TG9jKSB7XG4gICAgICAgICAgICAgIHJldHVybiBoYW5kbGUoZW50cnkuZmluYWxseUxvYyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICB9IGVsc2UgaWYgKGhhc0NhdGNoKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5wcmV2IDwgZW50cnkuY2F0Y2hMb2MpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGhhbmRsZShlbnRyeS5jYXRjaExvYywgdHJ1ZSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICB9IGVsc2UgaWYgKGhhc0ZpbmFsbHkpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnByZXYgPCBlbnRyeS5maW5hbGx5TG9jKSB7XG4gICAgICAgICAgICAgIHJldHVybiBoYW5kbGUoZW50cnkuZmluYWxseUxvYyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwidHJ5IHN0YXRlbWVudCB3aXRob3V0IGNhdGNoIG9yIGZpbmFsbHlcIik7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcblxuICAgIGFicnVwdDogZnVuY3Rpb24odHlwZSwgYXJnKSB7XG4gICAgICBmb3IgKHZhciBpID0gdGhpcy50cnlFbnRyaWVzLmxlbmd0aCAtIDE7IGkgPj0gMDsgLS1pKSB7XG4gICAgICAgIHZhciBlbnRyeSA9IHRoaXMudHJ5RW50cmllc1tpXTtcbiAgICAgICAgaWYgKGVudHJ5LnRyeUxvYyA8PSB0aGlzLnByZXYgJiZcbiAgICAgICAgICAgIGhhc093bi5jYWxsKGVudHJ5LCBcImZpbmFsbHlMb2NcIikgJiZcbiAgICAgICAgICAgIHRoaXMucHJldiA8IGVudHJ5LmZpbmFsbHlMb2MpIHtcbiAgICAgICAgICB2YXIgZmluYWxseUVudHJ5ID0gZW50cnk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKGZpbmFsbHlFbnRyeSAmJlxuICAgICAgICAgICh0eXBlID09PSBcImJyZWFrXCIgfHxcbiAgICAgICAgICAgdHlwZSA9PT0gXCJjb250aW51ZVwiKSAmJlxuICAgICAgICAgIGZpbmFsbHlFbnRyeS50cnlMb2MgPD0gYXJnICYmXG4gICAgICAgICAgYXJnIDw9IGZpbmFsbHlFbnRyeS5maW5hbGx5TG9jKSB7XG4gICAgICAgIC8vIElnbm9yZSB0aGUgZmluYWxseSBlbnRyeSBpZiBjb250cm9sIGlzIG5vdCBqdW1waW5nIHRvIGFcbiAgICAgICAgLy8gbG9jYXRpb24gb3V0c2lkZSB0aGUgdHJ5L2NhdGNoIGJsb2NrLlxuICAgICAgICBmaW5hbGx5RW50cnkgPSBudWxsO1xuICAgICAgfVxuXG4gICAgICB2YXIgcmVjb3JkID0gZmluYWxseUVudHJ5ID8gZmluYWxseUVudHJ5LmNvbXBsZXRpb24gOiB7fTtcbiAgICAgIHJlY29yZC50eXBlID0gdHlwZTtcbiAgICAgIHJlY29yZC5hcmcgPSBhcmc7XG5cbiAgICAgIGlmIChmaW5hbGx5RW50cnkpIHtcbiAgICAgICAgdGhpcy5tZXRob2QgPSBcIm5leHRcIjtcbiAgICAgICAgdGhpcy5uZXh0ID0gZmluYWxseUVudHJ5LmZpbmFsbHlMb2M7XG4gICAgICAgIHJldHVybiBDb250aW51ZVNlbnRpbmVsO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpcy5jb21wbGV0ZShyZWNvcmQpO1xuICAgIH0sXG5cbiAgICBjb21wbGV0ZTogZnVuY3Rpb24ocmVjb3JkLCBhZnRlckxvYykge1xuICAgICAgaWYgKHJlY29yZC50eXBlID09PSBcInRocm93XCIpIHtcbiAgICAgICAgdGhyb3cgcmVjb3JkLmFyZztcbiAgICAgIH1cblxuICAgICAgaWYgKHJlY29yZC50eXBlID09PSBcImJyZWFrXCIgfHxcbiAgICAgICAgICByZWNvcmQudHlwZSA9PT0gXCJjb250aW51ZVwiKSB7XG4gICAgICAgIHRoaXMubmV4dCA9IHJlY29yZC5hcmc7XG4gICAgICB9IGVsc2UgaWYgKHJlY29yZC50eXBlID09PSBcInJldHVyblwiKSB7XG4gICAgICAgIHRoaXMucnZhbCA9IHRoaXMuYXJnID0gcmVjb3JkLmFyZztcbiAgICAgICAgdGhpcy5tZXRob2QgPSBcInJldHVyblwiO1xuICAgICAgICB0aGlzLm5leHQgPSBcImVuZFwiO1xuICAgICAgfSBlbHNlIGlmIChyZWNvcmQudHlwZSA9PT0gXCJub3JtYWxcIiAmJiBhZnRlckxvYykge1xuICAgICAgICB0aGlzLm5leHQgPSBhZnRlckxvYztcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIENvbnRpbnVlU2VudGluZWw7XG4gICAgfSxcblxuICAgIGZpbmlzaDogZnVuY3Rpb24oZmluYWxseUxvYykge1xuICAgICAgZm9yICh2YXIgaSA9IHRoaXMudHJ5RW50cmllcy5sZW5ndGggLSAxOyBpID49IDA7IC0taSkge1xuICAgICAgICB2YXIgZW50cnkgPSB0aGlzLnRyeUVudHJpZXNbaV07XG4gICAgICAgIGlmIChlbnRyeS5maW5hbGx5TG9jID09PSBmaW5hbGx5TG9jKSB7XG4gICAgICAgICAgdGhpcy5jb21wbGV0ZShlbnRyeS5jb21wbGV0aW9uLCBlbnRyeS5hZnRlckxvYyk7XG4gICAgICAgICAgcmVzZXRUcnlFbnRyeShlbnRyeSk7XG4gICAgICAgICAgcmV0dXJuIENvbnRpbnVlU2VudGluZWw7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuXG4gICAgXCJjYXRjaFwiOiBmdW5jdGlvbih0cnlMb2MpIHtcbiAgICAgIGZvciAodmFyIGkgPSB0aGlzLnRyeUVudHJpZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyAtLWkpIHtcbiAgICAgICAgdmFyIGVudHJ5ID0gdGhpcy50cnlFbnRyaWVzW2ldO1xuICAgICAgICBpZiAoZW50cnkudHJ5TG9jID09PSB0cnlMb2MpIHtcbiAgICAgICAgICB2YXIgcmVjb3JkID0gZW50cnkuY29tcGxldGlvbjtcbiAgICAgICAgICBpZiAocmVjb3JkLnR5cGUgPT09IFwidGhyb3dcIikge1xuICAgICAgICAgICAgdmFyIHRocm93biA9IHJlY29yZC5hcmc7XG4gICAgICAgICAgICByZXNldFRyeUVudHJ5KGVudHJ5KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHRocm93bjtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBUaGUgY29udGV4dC5jYXRjaCBtZXRob2QgbXVzdCBvbmx5IGJlIGNhbGxlZCB3aXRoIGEgbG9jYXRpb25cbiAgICAgIC8vIGFyZ3VtZW50IHRoYXQgY29ycmVzcG9uZHMgdG8gYSBrbm93biBjYXRjaCBibG9jay5cbiAgICAgIHRocm93IG5ldyBFcnJvcihcImlsbGVnYWwgY2F0Y2ggYXR0ZW1wdFwiKTtcbiAgICB9LFxuXG4gICAgZGVsZWdhdGVZaWVsZDogZnVuY3Rpb24oaXRlcmFibGUsIHJlc3VsdE5hbWUsIG5leHRMb2MpIHtcbiAgICAgIHRoaXMuZGVsZWdhdGUgPSB7XG4gICAgICAgIGl0ZXJhdG9yOiB2YWx1ZXMoaXRlcmFibGUpLFxuICAgICAgICByZXN1bHROYW1lOiByZXN1bHROYW1lLFxuICAgICAgICBuZXh0TG9jOiBuZXh0TG9jXG4gICAgICB9O1xuXG4gICAgICBpZiAodGhpcy5tZXRob2QgPT09IFwibmV4dFwiKSB7XG4gICAgICAgIC8vIERlbGliZXJhdGVseSBmb3JnZXQgdGhlIGxhc3Qgc2VudCB2YWx1ZSBzbyB0aGF0IHdlIGRvbid0XG4gICAgICAgIC8vIGFjY2lkZW50YWxseSBwYXNzIGl0IG9uIHRvIHRoZSBkZWxlZ2F0ZS5cbiAgICAgICAgdGhpcy5hcmcgPSB1bmRlZmluZWQ7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBDb250aW51ZVNlbnRpbmVsO1xuICAgIH1cbiAgfTtcbn0pKFxuICAvLyBBbW9uZyB0aGUgdmFyaW91cyB0cmlja3MgZm9yIG9idGFpbmluZyBhIHJlZmVyZW5jZSB0byB0aGUgZ2xvYmFsXG4gIC8vIG9iamVjdCwgdGhpcyBzZWVtcyB0byBiZSB0aGUgbW9zdCByZWxpYWJsZSB0ZWNobmlxdWUgdGhhdCBkb2VzIG5vdFxuICAvLyB1c2UgaW5kaXJlY3QgZXZhbCAod2hpY2ggdmlvbGF0ZXMgQ29udGVudCBTZWN1cml0eSBQb2xpY3kpLlxuICB0eXBlb2YgZ2xvYmFsID09PSBcIm9iamVjdFwiID8gZ2xvYmFsIDpcbiAgdHlwZW9mIHdpbmRvdyA9PT0gXCJvYmplY3RcIiA/IHdpbmRvdyA6XG4gIHR5cGVvZiBzZWxmID09PSBcIm9iamVjdFwiID8gc2VsZiA6IHRoaXNcbik7XG4iLCIvKiFcbiAqIFNjcm9sbE1hZ2ljIHYyLjAuNSAoMjAxNS0wNC0yOSlcbiAqIFRoZSBqYXZhc2NyaXB0IGxpYnJhcnkgZm9yIG1hZ2ljYWwgc2Nyb2xsIGludGVyYWN0aW9ucy5cbiAqIChjKSAyMDE1IEphbiBQYWVwa2UgKEBqYW5wYWVwa2UpXG4gKiBQcm9qZWN0IFdlYnNpdGU6IGh0dHA6Ly9zY3JvbGxtYWdpYy5pb1xuICogXG4gKiBAdmVyc2lvbiAyLjAuNVxuICogQGxpY2Vuc2UgRHVhbCBsaWNlbnNlZCB1bmRlciBNSVQgbGljZW5zZSBhbmQgR1BMLlxuICogQGF1dGhvciBKYW4gUGFlcGtlIC0gZS1tYWlsQGphbnBhZXBrZS5kZVxuICpcbiAqIEBmaWxlIFNjcm9sbE1hZ2ljIG1haW4gbGlicmFyeS5cbiAqL1xuLyoqXG4gKiBAbmFtZXNwYWNlIFNjcm9sbE1hZ2ljXG4gKi9cbihmdW5jdGlvbiAocm9vdCwgZmFjdG9yeSkge1xuXHRpZiAodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kKSB7XG5cdFx0Ly8gQU1ELiBSZWdpc3RlciBhcyBhbiBhbm9ueW1vdXMgbW9kdWxlLlxuXHRcdGRlZmluZShmYWN0b3J5KTtcblx0fSBlbHNlIGlmICh0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcpIHtcblx0XHQvLyBDb21tb25KU1xuXHRcdG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeSgpO1xuXHR9IGVsc2Uge1xuXHRcdC8vIEJyb3dzZXIgZ2xvYmFsXG5cdFx0cm9vdC5TY3JvbGxNYWdpYyA9IGZhY3RvcnkoKTtcblx0fVxufSh0aGlzLCBmdW5jdGlvbiAoKSB7XG5cdFwidXNlIHN0cmljdFwiO1xuXG5cdHZhciBTY3JvbGxNYWdpYyA9IGZ1bmN0aW9uICgpIHtcblx0XHRfdXRpbC5sb2coMiwgJyhDT01QQVRJQklMSVRZIE5PVElDRSkgLT4gQXMgb2YgU2Nyb2xsTWFnaWMgMi4wLjAgeW91IG5lZWQgdG8gdXNlIFxcJ25ldyBTY3JvbGxNYWdpYy5Db250cm9sbGVyKClcXCcgdG8gY3JlYXRlIGEgbmV3IGNvbnRyb2xsZXIgaW5zdGFuY2UuIFVzZSBcXCduZXcgU2Nyb2xsTWFnaWMuU2NlbmUoKVxcJyB0byBpbnN0YW5jZSBhIHNjZW5lLicpO1xuXHR9O1xuXG5cdFNjcm9sbE1hZ2ljLnZlcnNpb24gPSBcIjIuMC41XCI7XG5cblx0Ly8gVE9ETzogdGVtcG9yYXJ5IHdvcmthcm91bmQgZm9yIGNocm9tZSdzIHNjcm9sbCBqaXR0ZXIgYnVnXG5cdHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwibW91c2V3aGVlbFwiLCBmdW5jdGlvbiAoKSB7fSk7XG5cblx0Ly8gZ2xvYmFsIGNvbnN0XG5cdHZhciBQSU5fU1BBQ0VSX0FUVFJJQlVURSA9IFwiZGF0YS1zY3JvbGxtYWdpYy1waW4tc3BhY2VyXCI7XG5cblx0LyoqXG5cdCAqIFRoZSBtYWluIGNsYXNzIHRoYXQgaXMgbmVlZGVkIG9uY2UgcGVyIHNjcm9sbCBjb250YWluZXIuXG5cdCAqXG5cdCAqIEBjbGFzc1xuXHQgKlxuXHQgKiBAZXhhbXBsZVxuXHQgKiAvLyBiYXNpYyBpbml0aWFsaXphdGlvblxuXHQgKiB2YXIgY29udHJvbGxlciA9IG5ldyBTY3JvbGxNYWdpYy5Db250cm9sbGVyKCk7XG5cdCAqXG5cdCAqIC8vIHBhc3Npbmcgb3B0aW9uc1xuXHQgKiB2YXIgY29udHJvbGxlciA9IG5ldyBTY3JvbGxNYWdpYy5Db250cm9sbGVyKHtjb250YWluZXI6IFwiI215Q29udGFpbmVyXCIsIGxvZ2xldmVsOiAzfSk7XG5cdCAqXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBbb3B0aW9uc10gLSBBbiBvYmplY3QgY29udGFpbmluZyBvbmUgb3IgbW9yZSBvcHRpb25zIGZvciB0aGUgY29udHJvbGxlci5cblx0ICogQHBhcmFtIHsoc3RyaW5nfG9iamVjdCl9IFtvcHRpb25zLmNvbnRhaW5lcj13aW5kb3ddIC0gQSBzZWxlY3RvciwgRE9NIG9iamVjdCB0aGF0IHJlZmVyZW5jZXMgdGhlIG1haW4gY29udGFpbmVyIGZvciBzY3JvbGxpbmcuXG5cdCAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMudmVydGljYWw9dHJ1ZV0gLSBTZXRzIHRoZSBzY3JvbGwgbW9kZSB0byB2ZXJ0aWNhbCAoYHRydWVgKSBvciBob3Jpem9udGFsIChgZmFsc2VgKSBzY3JvbGxpbmcuXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBbb3B0aW9ucy5nbG9iYWxTY2VuZU9wdGlvbnM9e31dIC0gVGhlc2Ugb3B0aW9ucyB3aWxsIGJlIHBhc3NlZCB0byBldmVyeSBTY2VuZSB0aGF0IGlzIGFkZGVkIHRvIHRoZSBjb250cm9sbGVyIHVzaW5nIHRoZSBhZGRTY2VuZSBtZXRob2QuIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIFNjZW5lIG9wdGlvbnMgc2VlIHtAbGluayBTY3JvbGxNYWdpYy5TY2VuZX0uXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbb3B0aW9ucy5sb2dsZXZlbD0yXSBMb2dsZXZlbCBmb3IgZGVidWdnaW5nLiBOb3RlIHRoYXQgbG9nZ2luZyBpcyBkaXNhYmxlZCBpbiB0aGUgbWluaWZpZWQgdmVyc2lvbiBvZiBTY3JvbGxNYWdpYy5cblx0ICoqIGAwYCA9PiBzaWxlbnRcblx0ICoqIGAxYCA9PiBlcnJvcnNcblx0ICoqIGAyYCA9PiBlcnJvcnMsIHdhcm5pbmdzXG5cdCAqKiBgM2AgPT4gZXJyb3JzLCB3YXJuaW5ncywgZGVidWdpbmZvXG5cdCAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMucmVmcmVzaEludGVydmFsPTEwMF0gLSBTb21lIGNoYW5nZXMgZG9uJ3QgY2FsbCBldmVudHMgYnkgZGVmYXVsdCwgbGlrZSBjaGFuZ2luZyB0aGUgY29udGFpbmVyIHNpemUgb3IgbW92aW5nIGEgc2NlbmUgdHJpZ2dlciBlbGVtZW50LiAgXG5cdCBUaGlzIGludGVydmFsIHBvbGxzIHRoZXNlIHBhcmFtZXRlcnMgdG8gZmlyZSB0aGUgbmVjZXNzYXJ5IGV2ZW50cy4gIFxuXHQgSWYgeW91IGRvbid0IHVzZSBjdXN0b20gY29udGFpbmVycywgdHJpZ2dlciBlbGVtZW50cyBvciBoYXZlIHN0YXRpYyBsYXlvdXRzLCB3aGVyZSB0aGUgcG9zaXRpb25zIG9mIHRoZSB0cmlnZ2VyIGVsZW1lbnRzIGRvbid0IGNoYW5nZSwgeW91IGNhbiBzZXQgdGhpcyB0byAwIGRpc2FibGUgaW50ZXJ2YWwgY2hlY2tpbmcgYW5kIGltcHJvdmUgcGVyZm9ybWFuY2UuXG5cdCAqXG5cdCAqL1xuXHRTY3JvbGxNYWdpYy5Db250cm9sbGVyID0gZnVuY3Rpb24gKG9wdGlvbnMpIHtcbi8qXG5cdCAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblx0ICogc2V0dGluZ3Ncblx0ICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXHQgKi9cblx0XHR2YXJcblx0XHROQU1FU1BBQ0UgPSAnU2Nyb2xsTWFnaWMuQ29udHJvbGxlcicsXG5cdFx0XHRTQ1JPTExfRElSRUNUSU9OX0ZPUldBUkQgPSAnRk9SV0FSRCcsXG5cdFx0XHRTQ1JPTExfRElSRUNUSU9OX1JFVkVSU0UgPSAnUkVWRVJTRScsXG5cdFx0XHRTQ1JPTExfRElSRUNUSU9OX1BBVVNFRCA9ICdQQVVTRUQnLFxuXHRcdFx0REVGQVVMVF9PUFRJT05TID0gQ09OVFJPTExFUl9PUFRJT05TLmRlZmF1bHRzO1xuXG4vKlxuXHQgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cdCAqIHByaXZhdGUgdmFyc1xuXHQgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cdCAqL1xuXHRcdHZhclxuXHRcdENvbnRyb2xsZXIgPSB0aGlzLFxuXHRcdFx0X29wdGlvbnMgPSBfdXRpbC5leHRlbmQoe30sIERFRkFVTFRfT1BUSU9OUywgb3B0aW9ucyksXG5cdFx0XHRfc2NlbmVPYmplY3RzID0gW10sXG5cdFx0XHRfdXBkYXRlU2NlbmVzT25OZXh0Q3ljbGUgPSBmYWxzZSxcblx0XHRcdC8vIGNhbiBiZSBib29sZWFuICh0cnVlID0+IGFsbCBzY2VuZXMpIG9yIGFuIGFycmF5IG9mIHNjZW5lcyB0byBiZSB1cGRhdGVkXG5cdFx0XHRfc2Nyb2xsUG9zID0gMCxcblx0XHRcdF9zY3JvbGxEaXJlY3Rpb24gPSBTQ1JPTExfRElSRUNUSU9OX1BBVVNFRCxcblx0XHRcdF9pc0RvY3VtZW50ID0gdHJ1ZSxcblx0XHRcdF92aWV3UG9ydFNpemUgPSAwLFxuXHRcdFx0X2VuYWJsZWQgPSB0cnVlLFxuXHRcdFx0X3VwZGF0ZVRpbWVvdXQsIF9yZWZyZXNoVGltZW91dDtcblxuLypcblx0ICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXHQgKiBwcml2YXRlIGZ1bmN0aW9uc1xuXHQgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cdCAqL1xuXG5cdFx0LyoqXG5cdFx0ICogSW50ZXJuYWwgY29uc3RydWN0b3IgZnVuY3Rpb24gb2YgdGhlIFNjcm9sbE1hZ2ljIENvbnRyb2xsZXJcblx0XHQgKiBAcHJpdmF0ZVxuXHRcdCAqL1xuXHRcdHZhciBjb25zdHJ1Y3QgPSBmdW5jdGlvbiAoKSB7XG5cdFx0XHRmb3IgKHZhciBrZXkgaW4gX29wdGlvbnMpIHtcblx0XHRcdFx0aWYgKCFERUZBVUxUX09QVElPTlMuaGFzT3duUHJvcGVydHkoa2V5KSkge1xuXHRcdFx0XHRcdGxvZygyLCBcIldBUk5JTkc6IFVua25vd24gb3B0aW9uIFxcXCJcIiArIGtleSArIFwiXFxcIlwiKTtcblx0XHRcdFx0XHRkZWxldGUgX29wdGlvbnNba2V5XTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0X29wdGlvbnMuY29udGFpbmVyID0gX3V0aWwuZ2V0LmVsZW1lbnRzKF9vcHRpb25zLmNvbnRhaW5lcilbMF07XG5cdFx0XHQvLyBjaGVjayBTY3JvbGxDb250YWluZXJcblx0XHRcdGlmICghX29wdGlvbnMuY29udGFpbmVyKSB7XG5cdFx0XHRcdGxvZygxLCBcIkVSUk9SIGNyZWF0aW5nIG9iamVjdCBcIiArIE5BTUVTUEFDRSArIFwiOiBObyB2YWxpZCBzY3JvbGwgY29udGFpbmVyIHN1cHBsaWVkXCIpO1xuXHRcdFx0XHR0aHJvdyBOQU1FU1BBQ0UgKyBcIiBpbml0IGZhaWxlZC5cIjsgLy8gY2FuY2VsXG5cdFx0XHR9XG5cdFx0XHRfaXNEb2N1bWVudCA9IF9vcHRpb25zLmNvbnRhaW5lciA9PT0gd2luZG93IHx8IF9vcHRpb25zLmNvbnRhaW5lciA9PT0gZG9jdW1lbnQuYm9keSB8fCAhZG9jdW1lbnQuYm9keS5jb250YWlucyhfb3B0aW9ucy5jb250YWluZXIpO1xuXHRcdFx0Ly8gbm9ybWFsaXplIHRvIHdpbmRvd1xuXHRcdFx0aWYgKF9pc0RvY3VtZW50KSB7XG5cdFx0XHRcdF9vcHRpb25zLmNvbnRhaW5lciA9IHdpbmRvdztcblx0XHRcdH1cblx0XHRcdC8vIHVwZGF0ZSBjb250YWluZXIgc2l6ZSBpbW1lZGlhdGVseVxuXHRcdFx0X3ZpZXdQb3J0U2l6ZSA9IGdldFZpZXdwb3J0U2l6ZSgpO1xuXHRcdFx0Ly8gc2V0IGV2ZW50IGhhbmRsZXJzXG5cdFx0XHRfb3B0aW9ucy5jb250YWluZXIuYWRkRXZlbnRMaXN0ZW5lcihcInJlc2l6ZVwiLCBvbkNoYW5nZSk7XG5cdFx0XHRfb3B0aW9ucy5jb250YWluZXIuYWRkRXZlbnRMaXN0ZW5lcihcInNjcm9sbFwiLCBvbkNoYW5nZSk7XG5cblx0XHRcdF9vcHRpb25zLnJlZnJlc2hJbnRlcnZhbCA9IHBhcnNlSW50KF9vcHRpb25zLnJlZnJlc2hJbnRlcnZhbCkgfHwgREVGQVVMVF9PUFRJT05TLnJlZnJlc2hJbnRlcnZhbDtcblx0XHRcdHNjaGVkdWxlUmVmcmVzaCgpO1xuXG5cdFx0XHRsb2coMywgXCJhZGRlZCBuZXcgXCIgKyBOQU1FU1BBQ0UgKyBcIiBjb250cm9sbGVyICh2XCIgKyBTY3JvbGxNYWdpYy52ZXJzaW9uICsgXCIpXCIpO1xuXHRcdH07XG5cblx0XHQvKipcblx0XHQgKiBTY2hlZHVsZSB0aGUgbmV4dCBleGVjdXRpb24gb2YgdGhlIHJlZnJlc2ggZnVuY3Rpb25cblx0XHQgKiBAcHJpdmF0ZVxuXHRcdCAqL1xuXHRcdHZhciBzY2hlZHVsZVJlZnJlc2ggPSBmdW5jdGlvbiAoKSB7XG5cdFx0XHRpZiAoX29wdGlvbnMucmVmcmVzaEludGVydmFsID4gMCkge1xuXHRcdFx0XHRfcmVmcmVzaFRpbWVvdXQgPSB3aW5kb3cuc2V0VGltZW91dChyZWZyZXNoLCBfb3B0aW9ucy5yZWZyZXNoSW50ZXJ2YWwpO1xuXHRcdFx0fVxuXHRcdH07XG5cblx0XHQvKipcblx0XHQgKiBEZWZhdWx0IGZ1bmN0aW9uIHRvIGdldCBzY3JvbGwgcG9zIC0gb3ZlcndyaXRlYWJsZSB1c2luZyBgQ29udHJvbGxlci5zY3JvbGxQb3MobmV3RnVuY3Rpb24pYFxuXHRcdCAqIEBwcml2YXRlXG5cdFx0ICovXG5cdFx0dmFyIGdldFNjcm9sbFBvcyA9IGZ1bmN0aW9uICgpIHtcblx0XHRcdHJldHVybiBfb3B0aW9ucy52ZXJ0aWNhbCA/IF91dGlsLmdldC5zY3JvbGxUb3AoX29wdGlvbnMuY29udGFpbmVyKSA6IF91dGlsLmdldC5zY3JvbGxMZWZ0KF9vcHRpb25zLmNvbnRhaW5lcik7XG5cdFx0fTtcblxuXHRcdC8qKlxuXHRcdCAqIFJldHVybnMgdGhlIGN1cnJlbnQgdmlld3BvcnQgU2l6ZSAod2lkdGggdm9yIGhvcml6b250YWwsIGhlaWdodCBmb3IgdmVydGljYWwpXG5cdFx0ICogQHByaXZhdGVcblx0XHQgKi9cblx0XHR2YXIgZ2V0Vmlld3BvcnRTaXplID0gZnVuY3Rpb24gKCkge1xuXHRcdFx0cmV0dXJuIF9vcHRpb25zLnZlcnRpY2FsID8gX3V0aWwuZ2V0LmhlaWdodChfb3B0aW9ucy5jb250YWluZXIpIDogX3V0aWwuZ2V0LndpZHRoKF9vcHRpb25zLmNvbnRhaW5lcik7XG5cdFx0fTtcblxuXHRcdC8qKlxuXHRcdCAqIERlZmF1bHQgZnVuY3Rpb24gdG8gc2V0IHNjcm9sbCBwb3MgLSBvdmVyd3JpdGVhYmxlIHVzaW5nIGBDb250cm9sbGVyLnNjcm9sbFRvKG5ld0Z1bmN0aW9uKWBcblx0XHQgKiBNYWtlIGF2YWlsYWJsZSBwdWJsaWNseSBmb3IgcGlubmVkIG1vdXNld2hlZWwgd29ya2Fyb3VuZC5cblx0XHQgKiBAcHJpdmF0ZVxuXHRcdCAqL1xuXHRcdHZhciBzZXRTY3JvbGxQb3MgPSB0aGlzLl9zZXRTY3JvbGxQb3MgPSBmdW5jdGlvbiAocG9zKSB7XG5cdFx0XHRpZiAoX29wdGlvbnMudmVydGljYWwpIHtcblx0XHRcdFx0aWYgKF9pc0RvY3VtZW50KSB7XG5cdFx0XHRcdFx0d2luZG93LnNjcm9sbFRvKF91dGlsLmdldC5zY3JvbGxMZWZ0KCksIHBvcyk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0X29wdGlvbnMuY29udGFpbmVyLnNjcm9sbFRvcCA9IHBvcztcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0aWYgKF9pc0RvY3VtZW50KSB7XG5cdFx0XHRcdFx0d2luZG93LnNjcm9sbFRvKHBvcywgX3V0aWwuZ2V0LnNjcm9sbFRvcCgpKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRfb3B0aW9ucy5jb250YWluZXIuc2Nyb2xsTGVmdCA9IHBvcztcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH07XG5cblx0XHQvKipcblx0XHQgKiBIYW5kbGUgdXBkYXRlcyBpbiBjeWNsZXMgaW5zdGVhZCBvZiBvbiBzY3JvbGwgKHBlcmZvcm1hbmNlKVxuXHRcdCAqIEBwcml2YXRlXG5cdFx0ICovXG5cdFx0dmFyIHVwZGF0ZVNjZW5lcyA9IGZ1bmN0aW9uICgpIHtcblx0XHRcdGlmIChfZW5hYmxlZCAmJiBfdXBkYXRlU2NlbmVzT25OZXh0Q3ljbGUpIHtcblx0XHRcdFx0Ly8gZGV0ZXJtaW5lIHNjZW5lcyB0byB1cGRhdGVcblx0XHRcdFx0dmFyIHNjZW5lc1RvVXBkYXRlID0gX3V0aWwudHlwZS5BcnJheShfdXBkYXRlU2NlbmVzT25OZXh0Q3ljbGUpID8gX3VwZGF0ZVNjZW5lc09uTmV4dEN5Y2xlIDogX3NjZW5lT2JqZWN0cy5zbGljZSgwKTtcblx0XHRcdFx0Ly8gcmVzZXQgc2NlbmVzXG5cdFx0XHRcdF91cGRhdGVTY2VuZXNPbk5leHRDeWNsZSA9IGZhbHNlO1xuXHRcdFx0XHR2YXIgb2xkU2Nyb2xsUG9zID0gX3Njcm9sbFBvcztcblx0XHRcdFx0Ly8gdXBkYXRlIHNjcm9sbCBwb3Mgbm93IGluc3RlYWQgb2Ygb25DaGFuZ2UsIGFzIGl0IG1pZ2h0IGhhdmUgY2hhbmdlZCBzaW5jZSBzY2hlZHVsaW5nIChpLmUuIGluLWJyb3dzZXIgc21vb3RoIHNjcm9sbClcblx0XHRcdFx0X3Njcm9sbFBvcyA9IENvbnRyb2xsZXIuc2Nyb2xsUG9zKCk7XG5cdFx0XHRcdHZhciBkZWx0YVNjcm9sbCA9IF9zY3JvbGxQb3MgLSBvbGRTY3JvbGxQb3M7XG5cdFx0XHRcdGlmIChkZWx0YVNjcm9sbCAhPT0gMCkgeyAvLyBzY3JvbGwgcG9zaXRpb24gY2hhbmdlZD9cblx0XHRcdFx0XHRfc2Nyb2xsRGlyZWN0aW9uID0gKGRlbHRhU2Nyb2xsID4gMCkgPyBTQ1JPTExfRElSRUNUSU9OX0ZPUldBUkQgOiBTQ1JPTExfRElSRUNUSU9OX1JFVkVSU0U7XG5cdFx0XHRcdH1cblx0XHRcdFx0Ly8gcmV2ZXJzZSBvcmRlciBvZiBzY2VuZXMgaWYgc2Nyb2xsaW5nIHJldmVyc2Vcblx0XHRcdFx0aWYgKF9zY3JvbGxEaXJlY3Rpb24gPT09IFNDUk9MTF9ESVJFQ1RJT05fUkVWRVJTRSkge1xuXHRcdFx0XHRcdHNjZW5lc1RvVXBkYXRlLnJldmVyc2UoKTtcblx0XHRcdFx0fVxuXHRcdFx0XHQvLyB1cGRhdGUgc2NlbmVzXG5cdFx0XHRcdHNjZW5lc1RvVXBkYXRlLmZvckVhY2goZnVuY3Rpb24gKHNjZW5lLCBpbmRleCkge1xuXHRcdFx0XHRcdGxvZygzLCBcInVwZGF0aW5nIFNjZW5lIFwiICsgKGluZGV4ICsgMSkgKyBcIi9cIiArIHNjZW5lc1RvVXBkYXRlLmxlbmd0aCArIFwiIChcIiArIF9zY2VuZU9iamVjdHMubGVuZ3RoICsgXCIgdG90YWwpXCIpO1xuXHRcdFx0XHRcdHNjZW5lLnVwZGF0ZSh0cnVlKTtcblx0XHRcdFx0fSk7XG5cdFx0XHRcdGlmIChzY2VuZXNUb1VwZGF0ZS5sZW5ndGggPT09IDAgJiYgX29wdGlvbnMubG9nbGV2ZWwgPj0gMykge1xuXHRcdFx0XHRcdGxvZygzLCBcInVwZGF0aW5nIDAgU2NlbmVzIChub3RoaW5nIGFkZGVkIHRvIGNvbnRyb2xsZXIpXCIpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fTtcblxuXHRcdC8qKlxuXHRcdCAqIEluaXRpYWxpemVzIHJBRiBjYWxsYmFja1xuXHRcdCAqIEBwcml2YXRlXG5cdFx0ICovXG5cdFx0dmFyIGRlYm91bmNlVXBkYXRlID0gZnVuY3Rpb24gKCkge1xuXHRcdFx0X3VwZGF0ZVRpbWVvdXQgPSBfdXRpbC5yQUYodXBkYXRlU2NlbmVzKTtcblx0XHR9O1xuXG5cdFx0LyoqXG5cdFx0ICogSGFuZGxlcyBDb250YWluZXIgY2hhbmdlc1xuXHRcdCAqIEBwcml2YXRlXG5cdFx0ICovXG5cdFx0dmFyIG9uQ2hhbmdlID0gZnVuY3Rpb24gKGUpIHtcblx0XHRcdGxvZygzLCBcImV2ZW50IGZpcmVkIGNhdXNpbmcgYW4gdXBkYXRlOlwiLCBlLnR5cGUpO1xuXHRcdFx0aWYgKGUudHlwZSA9PSBcInJlc2l6ZVwiKSB7XG5cdFx0XHRcdC8vIHJlc2l6ZVxuXHRcdFx0XHRfdmlld1BvcnRTaXplID0gZ2V0Vmlld3BvcnRTaXplKCk7XG5cdFx0XHRcdF9zY3JvbGxEaXJlY3Rpb24gPSBTQ1JPTExfRElSRUNUSU9OX1BBVVNFRDtcblx0XHRcdH1cblx0XHRcdC8vIHNjaGVkdWxlIHVwZGF0ZVxuXHRcdFx0aWYgKF91cGRhdGVTY2VuZXNPbk5leHRDeWNsZSAhPT0gdHJ1ZSkge1xuXHRcdFx0XHRfdXBkYXRlU2NlbmVzT25OZXh0Q3ljbGUgPSB0cnVlO1xuXHRcdFx0XHRkZWJvdW5jZVVwZGF0ZSgpO1xuXHRcdFx0fVxuXHRcdH07XG5cblx0XHR2YXIgcmVmcmVzaCA9IGZ1bmN0aW9uICgpIHtcblx0XHRcdGlmICghX2lzRG9jdW1lbnQpIHtcblx0XHRcdFx0Ly8gc2ltdWxhdGUgcmVzaXplIGV2ZW50LiBPbmx5IHdvcmtzIGZvciB2aWV3cG9ydCByZWxldmFudCBwYXJhbSAocGVyZm9ybWFuY2UpXG5cdFx0XHRcdGlmIChfdmlld1BvcnRTaXplICE9IGdldFZpZXdwb3J0U2l6ZSgpKSB7XG5cdFx0XHRcdFx0dmFyIHJlc2l6ZUV2ZW50O1xuXHRcdFx0XHRcdHRyeSB7XG5cdFx0XHRcdFx0XHRyZXNpemVFdmVudCA9IG5ldyBFdmVudCgncmVzaXplJywge1xuXHRcdFx0XHRcdFx0XHRidWJibGVzOiBmYWxzZSxcblx0XHRcdFx0XHRcdFx0Y2FuY2VsYWJsZTogZmFsc2Vcblx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdH0gY2F0Y2ggKGUpIHsgLy8gc3R1cGlkIElFXG5cdFx0XHRcdFx0XHRyZXNpemVFdmVudCA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KFwiRXZlbnRcIik7XG5cdFx0XHRcdFx0XHRyZXNpemVFdmVudC5pbml0RXZlbnQoXCJyZXNpemVcIiwgZmFsc2UsIGZhbHNlKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0X29wdGlvbnMuY29udGFpbmVyLmRpc3BhdGNoRXZlbnQocmVzaXplRXZlbnQpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRfc2NlbmVPYmplY3RzLmZvckVhY2goZnVuY3Rpb24gKHNjZW5lLCBpbmRleCkgeyAvLyByZWZyZXNoIGFsbCBzY2VuZXNcblx0XHRcdFx0c2NlbmUucmVmcmVzaCgpO1xuXHRcdFx0fSk7XG5cdFx0XHRzY2hlZHVsZVJlZnJlc2goKTtcblx0XHR9O1xuXG5cdFx0LyoqXG5cdFx0ICogU2VuZCBhIGRlYnVnIG1lc3NhZ2UgdG8gdGhlIGNvbnNvbGUuXG5cdFx0ICogcHJvdmlkZWQgcHVibGljbHkgd2l0aCBfbG9nIGZvciBwbHVnaW5zXG5cdFx0ICogQHByaXZhdGVcblx0XHQgKlxuXHRcdCAqIEBwYXJhbSB7bnVtYmVyfSBsb2dsZXZlbCAtIFRoZSBsb2dsZXZlbCByZXF1aXJlZCB0byBpbml0aWF0ZSBvdXRwdXQgZm9yIHRoZSBtZXNzYWdlLlxuXHRcdCAqIEBwYXJhbSB7Li4ubWl4ZWR9IG91dHB1dCAtIE9uZSBvciBtb3JlIHZhcmlhYmxlcyB0aGF0IHNob3VsZCBiZSBwYXNzZWQgdG8gdGhlIGNvbnNvbGUuXG5cdFx0ICovXG5cdFx0dmFyIGxvZyA9IHRoaXMuX2xvZyA9IGZ1bmN0aW9uIChsb2dsZXZlbCwgb3V0cHV0KSB7XG5cdFx0XHRpZiAoX29wdGlvbnMubG9nbGV2ZWwgPj0gbG9nbGV2ZWwpIHtcblx0XHRcdFx0QXJyYXkucHJvdG90eXBlLnNwbGljZS5jYWxsKGFyZ3VtZW50cywgMSwgMCwgXCIoXCIgKyBOQU1FU1BBQ0UgKyBcIikgLT5cIik7XG5cdFx0XHRcdF91dGlsLmxvZy5hcHBseSh3aW5kb3csIGFyZ3VtZW50cyk7XG5cdFx0XHR9XG5cdFx0fTtcblx0XHQvLyBmb3Igc2NlbmVzIHdlIGhhdmUgZ2V0dGVycyBmb3IgZWFjaCBvcHRpb24sIGJ1dCBmb3IgdGhlIGNvbnRyb2xsZXIgd2UgZG9uJ3QsIHNvIHdlIG5lZWQgdG8gbWFrZSBpdCBhdmFpbGFibGUgZXh0ZXJuYWxseSBmb3IgcGx1Z2luc1xuXHRcdHRoaXMuX29wdGlvbnMgPSBfb3B0aW9ucztcblxuXHRcdC8qKlxuXHRcdCAqIFNvcnQgc2NlbmVzIGluIGFzY2VuZGluZyBvcmRlciBvZiB0aGVpciBzdGFydCBvZmZzZXQuXG5cdFx0ICogQHByaXZhdGVcblx0XHQgKlxuXHRcdCAqIEBwYXJhbSB7YXJyYXl9IFNjZW5lc0FycmF5IC0gYW4gYXJyYXkgb2YgU2Nyb2xsTWFnaWMgU2NlbmVzIHRoYXQgc2hvdWxkIGJlIHNvcnRlZFxuXHRcdCAqIEByZXR1cm4ge2FycmF5fSBUaGUgc29ydGVkIGFycmF5IG9mIFNjZW5lcy5cblx0XHQgKi9cblx0XHR2YXIgc29ydFNjZW5lcyA9IGZ1bmN0aW9uIChTY2VuZXNBcnJheSkge1xuXHRcdFx0aWYgKFNjZW5lc0FycmF5Lmxlbmd0aCA8PSAxKSB7XG5cdFx0XHRcdHJldHVybiBTY2VuZXNBcnJheTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHZhciBzY2VuZXMgPSBTY2VuZXNBcnJheS5zbGljZSgwKTtcblx0XHRcdFx0c2NlbmVzLnNvcnQoZnVuY3Rpb24gKGEsIGIpIHtcblx0XHRcdFx0XHRyZXR1cm4gYS5zY3JvbGxPZmZzZXQoKSA+IGIuc2Nyb2xsT2Zmc2V0KCkgPyAxIDogLTE7XG5cdFx0XHRcdH0pO1xuXHRcdFx0XHRyZXR1cm4gc2NlbmVzO1xuXHRcdFx0fVxuXHRcdH07XG5cblx0XHQvKipcblx0XHQgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cdFx0ICogcHVibGljIGZ1bmN0aW9uc1xuXHRcdCAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblx0XHQgKi9cblxuXHRcdC8qKlxuXHRcdCAqIEFkZCBvbmUgb3JlIG1vcmUgc2NlbmUocykgdG8gdGhlIGNvbnRyb2xsZXIuICBcblx0XHQgKiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIGBTY2VuZS5hZGRUbyhjb250cm9sbGVyKWAuXG5cdFx0ICogQHB1YmxpY1xuXHRcdCAqIEBleGFtcGxlXG5cdFx0ICogLy8gd2l0aCBhIHByZXZpb3VzbHkgZGVmaW5lZCBzY2VuZVxuXHRcdCAqIGNvbnRyb2xsZXIuYWRkU2NlbmUoc2NlbmUpO1xuXHRcdCAqXG5cdFx0ICogLy8gd2l0aCBhIG5ld2x5IGNyZWF0ZWQgc2NlbmUuXG5cdFx0ICogY29udHJvbGxlci5hZGRTY2VuZShuZXcgU2Nyb2xsTWFnaWMuU2NlbmUoe2R1cmF0aW9uIDogMH0pKTtcblx0XHQgKlxuXHRcdCAqIC8vIGFkZGluZyBtdWx0aXBsZSBzY2VuZXNcblx0XHQgKiBjb250cm9sbGVyLmFkZFNjZW5lKFtzY2VuZSwgc2NlbmUyLCBuZXcgU2Nyb2xsTWFnaWMuU2NlbmUoe2R1cmF0aW9uIDogMH0pXSk7XG5cdFx0ICpcblx0XHQgKiBAcGFyYW0geyhTY3JvbGxNYWdpYy5TY2VuZXxhcnJheSl9IG5ld1NjZW5lIC0gU2Nyb2xsTWFnaWMgU2NlbmUgb3IgQXJyYXkgb2YgU2NlbmVzIHRvIGJlIGFkZGVkIHRvIHRoZSBjb250cm9sbGVyLlxuXHRcdCAqIEByZXR1cm4ge0NvbnRyb2xsZXJ9IFBhcmVudCBvYmplY3QgZm9yIGNoYWluaW5nLlxuXHRcdCAqL1xuXHRcdHRoaXMuYWRkU2NlbmUgPSBmdW5jdGlvbiAobmV3U2NlbmUpIHtcblx0XHRcdGlmIChfdXRpbC50eXBlLkFycmF5KG5ld1NjZW5lKSkge1xuXHRcdFx0XHRuZXdTY2VuZS5mb3JFYWNoKGZ1bmN0aW9uIChzY2VuZSwgaW5kZXgpIHtcblx0XHRcdFx0XHRDb250cm9sbGVyLmFkZFNjZW5lKHNjZW5lKTtcblx0XHRcdFx0fSk7XG5cdFx0XHR9IGVsc2UgaWYgKG5ld1NjZW5lIGluc3RhbmNlb2YgU2Nyb2xsTWFnaWMuU2NlbmUpIHtcblx0XHRcdFx0aWYgKG5ld1NjZW5lLmNvbnRyb2xsZXIoKSAhPT0gQ29udHJvbGxlcikge1xuXHRcdFx0XHRcdG5ld1NjZW5lLmFkZFRvKENvbnRyb2xsZXIpO1xuXHRcdFx0XHR9IGVsc2UgaWYgKF9zY2VuZU9iamVjdHMuaW5kZXhPZihuZXdTY2VuZSkgPCAwKSB7XG5cdFx0XHRcdFx0Ly8gbmV3IHNjZW5lXG5cdFx0XHRcdFx0X3NjZW5lT2JqZWN0cy5wdXNoKG5ld1NjZW5lKTsgLy8gYWRkIHRvIGFycmF5XG5cdFx0XHRcdFx0X3NjZW5lT2JqZWN0cyA9IHNvcnRTY2VuZXMoX3NjZW5lT2JqZWN0cyk7IC8vIHNvcnRcblx0XHRcdFx0XHRuZXdTY2VuZS5vbihcInNoaWZ0LmNvbnRyb2xsZXJfc29ydFwiLCBmdW5jdGlvbiAoKSB7IC8vIHJlc29ydCB3aGVuZXZlciBzY2VuZSBtb3Zlc1xuXHRcdFx0XHRcdFx0X3NjZW5lT2JqZWN0cyA9IHNvcnRTY2VuZXMoX3NjZW5lT2JqZWN0cyk7XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0Ly8gaW5zZXJ0IEdsb2JhbCBkZWZhdWx0cy5cblx0XHRcdFx0XHRmb3IgKHZhciBrZXkgaW4gX29wdGlvbnMuZ2xvYmFsU2NlbmVPcHRpb25zKSB7XG5cdFx0XHRcdFx0XHRpZiAobmV3U2NlbmVba2V5XSkge1xuXHRcdFx0XHRcdFx0XHRuZXdTY2VuZVtrZXldLmNhbGwobmV3U2NlbmUsIF9vcHRpb25zLmdsb2JhbFNjZW5lT3B0aW9uc1trZXldKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0bG9nKDMsIFwiYWRkaW5nIFNjZW5lIChub3cgXCIgKyBfc2NlbmVPYmplY3RzLmxlbmd0aCArIFwiIHRvdGFsKVwiKTtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0bG9nKDEsIFwiRVJST1I6IGludmFsaWQgYXJndW1lbnQgc3VwcGxpZWQgZm9yICcuYWRkU2NlbmUoKSdcIik7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gQ29udHJvbGxlcjtcblx0XHR9O1xuXG5cdFx0LyoqXG5cdFx0ICogUmVtb3ZlIG9uZSBvcmUgbW9yZSBzY2VuZShzKSBmcm9tIHRoZSBjb250cm9sbGVyLiAgXG5cdFx0ICogVGhpcyBpcyB0aGUgZXF1aXZhbGVudCB0byBgU2NlbmUucmVtb3ZlKClgLlxuXHRcdCAqIEBwdWJsaWNcblx0XHQgKiBAZXhhbXBsZVxuXHRcdCAqIC8vIHJlbW92ZSBhIHNjZW5lIGZyb20gdGhlIGNvbnRyb2xsZXJcblx0XHQgKiBjb250cm9sbGVyLnJlbW92ZVNjZW5lKHNjZW5lKTtcblx0XHQgKlxuXHRcdCAqIC8vIHJlbW92ZSBtdWx0aXBsZSBzY2VuZXMgZnJvbSB0aGUgY29udHJvbGxlclxuXHRcdCAqIGNvbnRyb2xsZXIucmVtb3ZlU2NlbmUoW3NjZW5lLCBzY2VuZTIsIHNjZW5lM10pO1xuXHRcdCAqXG5cdFx0ICogQHBhcmFtIHsoU2Nyb2xsTWFnaWMuU2NlbmV8YXJyYXkpfSBTY2VuZSAtIFNjcm9sbE1hZ2ljIFNjZW5lIG9yIEFycmF5IG9mIFNjZW5lcyB0byBiZSByZW1vdmVkIGZyb20gdGhlIGNvbnRyb2xsZXIuXG5cdFx0ICogQHJldHVybnMge0NvbnRyb2xsZXJ9IFBhcmVudCBvYmplY3QgZm9yIGNoYWluaW5nLlxuXHRcdCAqL1xuXHRcdHRoaXMucmVtb3ZlU2NlbmUgPSBmdW5jdGlvbiAoU2NlbmUpIHtcblx0XHRcdGlmIChfdXRpbC50eXBlLkFycmF5KFNjZW5lKSkge1xuXHRcdFx0XHRTY2VuZS5mb3JFYWNoKGZ1bmN0aW9uIChzY2VuZSwgaW5kZXgpIHtcblx0XHRcdFx0XHRDb250cm9sbGVyLnJlbW92ZVNjZW5lKHNjZW5lKTtcblx0XHRcdFx0fSk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHR2YXIgaW5kZXggPSBfc2NlbmVPYmplY3RzLmluZGV4T2YoU2NlbmUpO1xuXHRcdFx0XHRpZiAoaW5kZXggPiAtMSkge1xuXHRcdFx0XHRcdFNjZW5lLm9mZihcInNoaWZ0LmNvbnRyb2xsZXJfc29ydFwiKTtcblx0XHRcdFx0XHRfc2NlbmVPYmplY3RzLnNwbGljZShpbmRleCwgMSk7XG5cdFx0XHRcdFx0bG9nKDMsIFwicmVtb3ZpbmcgU2NlbmUgKG5vdyBcIiArIF9zY2VuZU9iamVjdHMubGVuZ3RoICsgXCIgbGVmdClcIik7XG5cdFx0XHRcdFx0U2NlbmUucmVtb3ZlKCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdHJldHVybiBDb250cm9sbGVyO1xuXHRcdH07XG5cblx0XHQvKipcblx0XHQgKiBVcGRhdGUgb25lIG9yZSBtb3JlIHNjZW5lKHMpIGFjY29yZGluZyB0byB0aGUgc2Nyb2xsIHBvc2l0aW9uIG9mIHRoZSBjb250YWluZXIuICBcblx0XHQgKiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIGBTY2VuZS51cGRhdGUoKWAuICBcblx0XHQgKiBUaGUgdXBkYXRlIG1ldGhvZCBjYWxjdWxhdGVzIHRoZSBzY2VuZSdzIHN0YXJ0IGFuZCBlbmQgcG9zaXRpb24gKGJhc2VkIG9uIHRoZSB0cmlnZ2VyIGVsZW1lbnQsIHRyaWdnZXIgaG9vaywgZHVyYXRpb24gYW5kIG9mZnNldCkgYW5kIGNoZWNrcyBpdCBhZ2FpbnN0IHRoZSBjdXJyZW50IHNjcm9sbCBwb3NpdGlvbiBvZiB0aGUgY29udGFpbmVyLiAgXG5cdFx0ICogSXQgdGhlbiB1cGRhdGVzIHRoZSBjdXJyZW50IHNjZW5lIHN0YXRlIGFjY29yZGluZ2x5IChvciBkb2VzIG5vdGhpbmcsIGlmIHRoZSBzdGF0ZSBpcyBhbHJlYWR5IGNvcnJlY3QpIOKAkyBQaW5zIHdpbGwgYmUgc2V0IHRvIHRoZWlyIGNvcnJlY3QgcG9zaXRpb24gYW5kIHR3ZWVucyB3aWxsIGJlIHVwZGF0ZWQgdG8gdGhlaXIgY29ycmVjdCBwcm9ncmVzcy4gIFxuXHRcdCAqIF8qKk5vdGU6KiogVGhpcyBtZXRob2QgZ2V0cyBjYWxsZWQgY29uc3RhbnRseSB3aGVuZXZlciBDb250cm9sbGVyIGRldGVjdHMgYSBjaGFuZ2UuIFRoZSBvbmx5IGFwcGxpY2F0aW9uIGZvciB5b3UgaXMgaWYgeW91IGNoYW5nZSBzb21ldGhpbmcgb3V0c2lkZSBvZiB0aGUgcmVhbG0gb2YgU2Nyb2xsTWFnaWMsIGxpa2UgbW92aW5nIHRoZSB0cmlnZ2VyIG9yIGNoYW5naW5nIHR3ZWVuIHBhcmFtZXRlcnMuX1xuXHRcdCAqIEBwdWJsaWNcblx0XHQgKiBAZXhhbXBsZVxuXHRcdCAqIC8vIHVwZGF0ZSBhIHNwZWNpZmljIHNjZW5lIG9uIG5leHQgY3ljbGVcblx0XHQgKiBjb250cm9sbGVyLnVwZGF0ZVNjZW5lKHNjZW5lKTtcblx0XHQgKlxuXHRcdCAqIC8vIHVwZGF0ZSBhIHNwZWNpZmljIHNjZW5lIGltbWVkaWF0ZWx5XG5cdFx0ICogY29udHJvbGxlci51cGRhdGVTY2VuZShzY2VuZSwgdHJ1ZSk7XG5cdFx0ICpcblx0XHQgKiAvLyB1cGRhdGUgbXVsdGlwbGUgc2NlbmVzIHNjZW5lIG9uIG5leHQgY3ljbGVcblx0XHQgKiBjb250cm9sbGVyLnVwZGF0ZVNjZW5lKFtzY2VuZTEsIHNjZW5lMiwgc2NlbmUzXSk7XG5cdFx0ICpcblx0XHQgKiBAcGFyYW0ge1Njcm9sbE1hZ2ljLlNjZW5lfSBTY2VuZSAtIFNjcm9sbE1hZ2ljIFNjZW5lIG9yIEFycmF5IG9mIFNjZW5lcyB0aGF0IGlzL2FyZSBzdXBwb3NlZCB0byBiZSB1cGRhdGVkLlxuXHRcdCAqIEBwYXJhbSB7Ym9vbGVhbn0gW2ltbWVkaWF0ZWx5PWZhbHNlXSAtIElmIGB0cnVlYCB0aGUgdXBkYXRlIHdpbGwgYmUgaW5zdGFudCwgaWYgYGZhbHNlYCBpdCB3aWxsIHdhaXQgdW50aWwgbmV4dCB1cGRhdGUgY3ljbGUuICBcblx0XHQgVGhpcyBpcyB1c2VmdWwgd2hlbiBjaGFuZ2luZyBtdWx0aXBsZSBwcm9wZXJ0aWVzIG9mIHRoZSBzY2VuZSAtIHRoaXMgd2F5IGl0IHdpbGwgb25seSBiZSB1cGRhdGVkIG9uY2UgYWxsIG5ldyBwcm9wZXJ0aWVzIGFyZSBzZXQgKHVwZGF0ZVNjZW5lcykuXG5cdFx0ICogQHJldHVybiB7Q29udHJvbGxlcn0gUGFyZW50IG9iamVjdCBmb3IgY2hhaW5pbmcuXG5cdFx0ICovXG5cdFx0dGhpcy51cGRhdGVTY2VuZSA9IGZ1bmN0aW9uIChTY2VuZSwgaW1tZWRpYXRlbHkpIHtcblx0XHRcdGlmIChfdXRpbC50eXBlLkFycmF5KFNjZW5lKSkge1xuXHRcdFx0XHRTY2VuZS5mb3JFYWNoKGZ1bmN0aW9uIChzY2VuZSwgaW5kZXgpIHtcblx0XHRcdFx0XHRDb250cm9sbGVyLnVwZGF0ZVNjZW5lKHNjZW5lLCBpbW1lZGlhdGVseSk7XG5cdFx0XHRcdH0pO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0aWYgKGltbWVkaWF0ZWx5KSB7XG5cdFx0XHRcdFx0U2NlbmUudXBkYXRlKHRydWUpO1xuXHRcdFx0XHR9IGVsc2UgaWYgKF91cGRhdGVTY2VuZXNPbk5leHRDeWNsZSAhPT0gdHJ1ZSAmJiBTY2VuZSBpbnN0YW5jZW9mIFNjcm9sbE1hZ2ljLlNjZW5lKSB7IC8vIGlmIF91cGRhdGVTY2VuZXNPbk5leHRDeWNsZSBpcyB0cnVlLCBhbGwgY29ubmVjdGVkIHNjZW5lcyBhcmUgYWxyZWFkeSBzY2hlZHVsZWQgZm9yIHVwZGF0ZVxuXHRcdFx0XHRcdC8vIHByZXAgYXJyYXkgZm9yIG5leHQgdXBkYXRlIGN5Y2xlXG5cdFx0XHRcdFx0X3VwZGF0ZVNjZW5lc09uTmV4dEN5Y2xlID0gX3VwZGF0ZVNjZW5lc09uTmV4dEN5Y2xlIHx8IFtdO1xuXHRcdFx0XHRcdGlmIChfdXBkYXRlU2NlbmVzT25OZXh0Q3ljbGUuaW5kZXhPZihTY2VuZSkgPT0gLTEpIHtcblx0XHRcdFx0XHRcdF91cGRhdGVTY2VuZXNPbk5leHRDeWNsZS5wdXNoKFNjZW5lKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0X3VwZGF0ZVNjZW5lc09uTmV4dEN5Y2xlID0gc29ydFNjZW5lcyhfdXBkYXRlU2NlbmVzT25OZXh0Q3ljbGUpOyAvLyBzb3J0XG5cdFx0XHRcdFx0ZGVib3VuY2VVcGRhdGUoKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIENvbnRyb2xsZXI7XG5cdFx0fTtcblxuXHRcdC8qKlxuXHRcdCAqIFVwZGF0ZXMgdGhlIGNvbnRyb2xsZXIgcGFyYW1zIGFuZCBjYWxscyB1cGRhdGVTY2VuZSBvbiBldmVyeSBzY2VuZSwgdGhhdCBpcyBhdHRhY2hlZCB0byB0aGUgY29udHJvbGxlci4gIFxuXHRcdCAqIFNlZSBgQ29udHJvbGxlci51cGRhdGVTY2VuZSgpYCBmb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB3aGF0IHRoaXMgbWVhbnMuICBcblx0XHQgKiBJbiBtb3N0IGNhc2VzIHlvdSB3aWxsIG5vdCBuZWVkIHRoaXMgZnVuY3Rpb24sIGFzIGl0IGlzIGNhbGxlZCBjb25zdGFudGx5LCB3aGVuZXZlciBTY3JvbGxNYWdpYyBkZXRlY3RzIGEgc3RhdGUgY2hhbmdlIGV2ZW50LCBsaWtlIHJlc2l6ZSBvciBzY3JvbGwuICBcblx0XHQgKiBUaGUgb25seSBhcHBsaWNhdGlvbiBmb3IgdGhpcyBtZXRob2QgaXMgd2hlbiBTY3JvbGxNYWdpYyBmYWlscyB0byBkZXRlY3QgdGhlc2UgZXZlbnRzLiAgXG5cdFx0ICogT25lIGFwcGxpY2F0aW9uIGlzIHdpdGggc29tZSBleHRlcm5hbCBzY3JvbGwgbGlicmFyaWVzIChsaWtlIGlTY3JvbGwpIHRoYXQgbW92ZSBhbiBpbnRlcm5hbCBjb250YWluZXIgdG8gYSBuZWdhdGl2ZSBvZmZzZXQgaW5zdGVhZCBvZiBhY3R1YWxseSBzY3JvbGxpbmcuIEluIHRoaXMgY2FzZSB0aGUgdXBkYXRlIG9uIHRoZSBjb250cm9sbGVyIG5lZWRzIHRvIGJlIGNhbGxlZCB3aGVuZXZlciB0aGUgY2hpbGQgY29udGFpbmVyJ3MgcG9zaXRpb24gY2hhbmdlcy5cblx0XHQgKiBGb3IgdGhpcyBjYXNlIHRoZXJlIHdpbGwgYWxzbyBiZSB0aGUgbmVlZCB0byBwcm92aWRlIGEgY3VzdG9tIGZ1bmN0aW9uIHRvIGNhbGN1bGF0ZSB0aGUgY29ycmVjdCBzY3JvbGwgcG9zaXRpb24uIFNlZSBgQ29udHJvbGxlci5zY3JvbGxQb3MoKWAgZm9yIGRldGFpbHMuXG5cdFx0ICogQHB1YmxpY1xuXHRcdCAqIEBleGFtcGxlXG5cdFx0ICogLy8gdXBkYXRlIHRoZSBjb250cm9sbGVyIG9uIG5leHQgY3ljbGUgKHNhdmVzIHBlcmZvcm1hbmNlIGR1ZSB0byBlbGltaW5hdGlvbiBvZiByZWR1bmRhbnQgdXBkYXRlcylcblx0XHQgKiBjb250cm9sbGVyLnVwZGF0ZSgpO1xuXHRcdCAqXG5cdFx0ICogLy8gdXBkYXRlIHRoZSBjb250cm9sbGVyIGltbWVkaWF0ZWx5XG5cdFx0ICogY29udHJvbGxlci51cGRhdGUodHJ1ZSk7XG5cdFx0ICpcblx0XHQgKiBAcGFyYW0ge2Jvb2xlYW59IFtpbW1lZGlhdGVseT1mYWxzZV0gLSBJZiBgdHJ1ZWAgdGhlIHVwZGF0ZSB3aWxsIGJlIGluc3RhbnQsIGlmIGBmYWxzZWAgaXQgd2lsbCB3YWl0IHVudGlsIG5leHQgdXBkYXRlIGN5Y2xlIChiZXR0ZXIgcGVyZm9ybWFuY2UpXG5cdFx0ICogQHJldHVybiB7Q29udHJvbGxlcn0gUGFyZW50IG9iamVjdCBmb3IgY2hhaW5pbmcuXG5cdFx0ICovXG5cdFx0dGhpcy51cGRhdGUgPSBmdW5jdGlvbiAoaW1tZWRpYXRlbHkpIHtcblx0XHRcdG9uQ2hhbmdlKHtcblx0XHRcdFx0dHlwZTogXCJyZXNpemVcIlxuXHRcdFx0fSk7IC8vIHdpbGwgdXBkYXRlIHNpemUgYW5kIHNldCBfdXBkYXRlU2NlbmVzT25OZXh0Q3ljbGUgdG8gdHJ1ZVxuXHRcdFx0aWYgKGltbWVkaWF0ZWx5KSB7XG5cdFx0XHRcdHVwZGF0ZVNjZW5lcygpO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIENvbnRyb2xsZXI7XG5cdFx0fTtcblxuXHRcdC8qKlxuXHRcdCAqIFNjcm9sbCB0byBhIG51bWVyaWMgc2Nyb2xsIG9mZnNldCwgYSBET00gZWxlbWVudCwgdGhlIHN0YXJ0IG9mIGEgc2NlbmUgb3IgcHJvdmlkZSBhbiBhbHRlcm5hdGUgbWV0aG9kIGZvciBzY3JvbGxpbmcuICBcblx0XHQgKiBGb3IgdmVydGljYWwgY29udHJvbGxlcnMgaXQgd2lsbCBjaGFuZ2UgdGhlIHRvcCBzY3JvbGwgb2Zmc2V0IGFuZCBmb3IgaG9yaXpvbnRhbCBhcHBsaWNhdGlvbnMgaXQgd2lsbCBjaGFuZ2UgdGhlIGxlZnQgb2Zmc2V0LlxuXHRcdCAqIEBwdWJsaWNcblx0XHQgKlxuXHRcdCAqIEBzaW5jZSAxLjEuMFxuXHRcdCAqIEBleGFtcGxlXG5cdFx0ICogLy8gc2Nyb2xsIHRvIGFuIG9mZnNldCBvZiAxMDBcblx0XHQgKiBjb250cm9sbGVyLnNjcm9sbFRvKDEwMCk7XG5cdFx0ICpcblx0XHQgKiAvLyBzY3JvbGwgdG8gYSBET00gZWxlbWVudFxuXHRcdCAqIGNvbnRyb2xsZXIuc2Nyb2xsVG8oXCIjYW5jaG9yXCIpO1xuXHRcdCAqXG5cdFx0ICogLy8gc2Nyb2xsIHRvIHRoZSBiZWdpbm5pbmcgb2YgYSBzY2VuZVxuXHRcdCAqIHZhciBzY2VuZSA9IG5ldyBTY3JvbGxNYWdpYy5TY2VuZSh7b2Zmc2V0OiAyMDB9KTtcblx0XHQgKiBjb250cm9sbGVyLnNjcm9sbFRvKHNjZW5lKTtcblx0XHQgKlxuXHRcdCAqIC8vIGRlZmluZSBhIG5ldyBzY3JvbGwgcG9zaXRpb24gbW9kaWZpY2F0aW9uIGZ1bmN0aW9uIChqUXVlcnkgYW5pbWF0ZSBpbnN0ZWFkIG9mIGp1bXApXG5cdFx0ICogY29udHJvbGxlci5zY3JvbGxUbyhmdW5jdGlvbiAobmV3U2Nyb2xsUG9zKSB7XG5cdFx0ICpcdCQoXCJodG1sLCBib2R5XCIpLmFuaW1hdGUoe3Njcm9sbFRvcDogbmV3U2Nyb2xsUG9zfSk7XG5cdFx0ICogfSk7XG5cdFx0ICogY29udHJvbGxlci5zY3JvbGxUbygxMDApOyAvLyBjYWxsIGFzIHVzdWFsLCBidXQgdGhlIG5ldyBmdW5jdGlvbiB3aWxsIGJlIHVzZWQgaW5zdGVhZFxuXHRcdCAqXG5cdFx0ICogLy8gZGVmaW5lIGEgbmV3IHNjcm9sbCBmdW5jdGlvbiB3aXRoIGFuIGFkZGl0aW9uYWwgcGFyYW1ldGVyXG5cdFx0ICogY29udHJvbGxlci5zY3JvbGxUbyhmdW5jdGlvbiAobmV3U2Nyb2xsUG9zLCBtZXNzYWdlKSB7XG5cdFx0ICogIGNvbnNvbGUubG9nKG1lc3NhZ2UpO1xuXHRcdCAqXHQkKHRoaXMpLmFuaW1hdGUoe3Njcm9sbFRvcDogbmV3U2Nyb2xsUG9zfSk7XG5cdFx0ICogfSk7XG5cdFx0ICogLy8gY2FsbCBhcyB1c3VhbCwgYnV0IHN1cHBseSBhbiBleHRyYSBwYXJhbWV0ZXIgdG8gdGhlIGRlZmluZWQgY3VzdG9tIGZ1bmN0aW9uXG5cdFx0ICogY29udHJvbGxlci5zY3JvbGxUbygxMDAsIFwibXkgbWVzc2FnZVwiKTtcblx0XHQgKlxuXHRcdCAqIC8vIGRlZmluZSBhIG5ldyBzY3JvbGwgZnVuY3Rpb24gd2l0aCBhbiBhZGRpdGlvbmFsIHBhcmFtZXRlciBjb250YWluaW5nIG11bHRpcGxlIHZhcmlhYmxlc1xuXHRcdCAqIGNvbnRyb2xsZXIuc2Nyb2xsVG8oZnVuY3Rpb24gKG5ld1Njcm9sbFBvcywgb3B0aW9ucykge1xuXHRcdCAqICBzb21lR2xvYmFsVmFyID0gb3B0aW9ucy5hICsgb3B0aW9ucy5iO1xuXHRcdCAqXHQkKHRoaXMpLmFuaW1hdGUoe3Njcm9sbFRvcDogbmV3U2Nyb2xsUG9zfSk7XG5cdFx0ICogfSk7XG5cdFx0ICogLy8gY2FsbCBhcyB1c3VhbCwgYnV0IHN1cHBseSBhbiBleHRyYSBwYXJhbWV0ZXIgY29udGFpbmluZyBtdWx0aXBsZSBvcHRpb25zXG5cdFx0ICogY29udHJvbGxlci5zY3JvbGxUbygxMDAsIHthOiAxLCBiOiAyfSk7XG5cdFx0ICpcblx0XHQgKiAvLyBkZWZpbmUgYSBuZXcgc2Nyb2xsIGZ1bmN0aW9uIHdpdGggYSBjYWxsYmFjayBzdXBwbGllZCBhcyBhbiBhZGRpdGlvbmFsIHBhcmFtZXRlclxuXHRcdCAqIGNvbnRyb2xsZXIuc2Nyb2xsVG8oZnVuY3Rpb24gKG5ld1Njcm9sbFBvcywgY2FsbGJhY2spIHtcblx0XHQgKlx0JCh0aGlzKS5hbmltYXRlKHtzY3JvbGxUb3A6IG5ld1Njcm9sbFBvc30sIDQwMCwgXCJzd2luZ1wiLCBjYWxsYmFjayk7XG5cdFx0ICogfSk7XG5cdFx0ICogLy8gY2FsbCBhcyB1c3VhbCwgYnV0IHN1cHBseSBhbiBleHRyYSBwYXJhbWV0ZXIsIHdoaWNoIGlzIHVzZWQgYXMgYSBjYWxsYmFjayBpbiB0aGUgcHJldmlvdXNseSBkZWZpbmVkIGN1c3RvbSBzY3JvbGwgZnVuY3Rpb25cblx0XHQgKiBjb250cm9sbGVyLnNjcm9sbFRvKDEwMCwgZnVuY3Rpb24oKSB7XG5cdFx0ICpcdGNvbnNvbGUubG9nKFwic2Nyb2xsIGhhcyBmaW5pc2hlZC5cIik7XG5cdFx0ICogfSk7XG5cdFx0ICpcblx0XHQgKiBAcGFyYW0ge21peGVkfSBzY3JvbGxUYXJnZXQgLSBUaGUgc3VwcGxpZWQgYXJndW1lbnQgY2FuIGJlIG9uZSBvZiB0aGVzZSB0eXBlczpcblx0XHQgKiAxLiBgbnVtYmVyYCAtPiBUaGUgY29udGFpbmVyIHdpbGwgc2Nyb2xsIHRvIHRoaXMgbmV3IHNjcm9sbCBvZmZzZXQuXG5cdFx0ICogMi4gYHN0cmluZ2Agb3IgYG9iamVjdGAgLT4gQ2FuIGJlIGEgc2VsZWN0b3Igb3IgYSBET00gb2JqZWN0LiAgXG5cdFx0ICogIFRoZSBjb250YWluZXIgd2lsbCBzY3JvbGwgdG8gdGhlIHBvc2l0aW9uIG9mIHRoaXMgZWxlbWVudC5cblx0XHQgKiAzLiBgU2Nyb2xsTWFnaWMgU2NlbmVgIC0+IFRoZSBjb250YWluZXIgd2lsbCBzY3JvbGwgdG8gdGhlIHN0YXJ0IG9mIHRoaXMgc2NlbmUuXG5cdFx0ICogNC4gYGZ1bmN0aW9uYCAtPiBUaGlzIGZ1bmN0aW9uIHdpbGwgYmUgdXNlZCBmb3IgZnV0dXJlIHNjcm9sbCBwb3NpdGlvbiBtb2RpZmljYXRpb25zLiAgXG5cdFx0ICogIFRoaXMgcHJvdmlkZXMgYSB3YXkgZm9yIHlvdSB0byBjaGFuZ2UgdGhlIGJlaGF2aW91ciBvZiBzY3JvbGxpbmcgYW5kIGFkZGluZyBuZXcgYmVoYXZpb3VyIGxpa2UgYW5pbWF0aW9uLiBUaGUgZnVuY3Rpb24gcmVjZWl2ZXMgdGhlIG5ldyBzY3JvbGwgcG9zaXRpb24gYXMgYSBwYXJhbWV0ZXIgYW5kIGEgcmVmZXJlbmNlIHRvIHRoZSBjb250YWluZXIgZWxlbWVudCB1c2luZyBgdGhpc2AuICBcblx0XHQgKiAgSXQgbWF5IGFsc28gb3B0aW9uYWxseSByZWNlaXZlIGFuIG9wdGlvbmFsIGFkZGl0aW9uYWwgcGFyYW1ldGVyIChzZWUgYmVsb3cpICBcblx0XHQgKiAgXyoqTk9URToqKiAgXG5cdFx0ICogIEFsbCBvdGhlciBvcHRpb25zIHdpbGwgc3RpbGwgd29yayBhcyBleHBlY3RlZCwgdXNpbmcgdGhlIG5ldyBmdW5jdGlvbiB0byBzY3JvbGwuX1xuXHRcdCAqIEBwYXJhbSB7bWl4ZWR9IFthZGRpdGlvbmFsUGFyYW1ldGVyXSAtIElmIGEgY3VzdG9tIHNjcm9sbCBmdW5jdGlvbiB3YXMgZGVmaW5lZCAoc2VlIGFib3ZlIDQuKSwgeW91IG1heSB3YW50IHRvIHN1cHBseSBhZGRpdGlvbmFsIHBhcmFtZXRlcnMgdG8gaXQsIHdoZW4gY2FsbGluZyBpdC4gWW91IGNhbiBkbyB0aGlzIHVzaW5nIHRoaXMgcGFyYW1ldGVyIOKAkyBzZWUgZXhhbXBsZXMgZm9yIGRldGFpbHMuIFBsZWFzZSBub3RlLCB0aGF0IHRoaXMgcGFyYW1ldGVyIHdpbGwgaGF2ZSBubyBlZmZlY3QsIGlmIHlvdSB1c2UgdGhlIGRlZmF1bHQgc2Nyb2xsaW5nIGZ1bmN0aW9uLlxuXHRcdCAqIEByZXR1cm5zIHtDb250cm9sbGVyfSBQYXJlbnQgb2JqZWN0IGZvciBjaGFpbmluZy5cblx0XHQgKi9cblx0XHR0aGlzLnNjcm9sbFRvID0gZnVuY3Rpb24gKHNjcm9sbFRhcmdldCwgYWRkaXRpb25hbFBhcmFtZXRlcikge1xuXHRcdFx0aWYgKF91dGlsLnR5cGUuTnVtYmVyKHNjcm9sbFRhcmdldCkpIHsgLy8gZXhjZWN1dGVcblx0XHRcdFx0c2V0U2Nyb2xsUG9zLmNhbGwoX29wdGlvbnMuY29udGFpbmVyLCBzY3JvbGxUYXJnZXQsIGFkZGl0aW9uYWxQYXJhbWV0ZXIpO1xuXHRcdFx0fSBlbHNlIGlmIChzY3JvbGxUYXJnZXQgaW5zdGFuY2VvZiBTY3JvbGxNYWdpYy5TY2VuZSkgeyAvLyBzY3JvbGwgdG8gc2NlbmVcblx0XHRcdFx0aWYgKHNjcm9sbFRhcmdldC5jb250cm9sbGVyKCkgPT09IENvbnRyb2xsZXIpIHsgLy8gY2hlY2sgaWYgdGhlIGNvbnRyb2xsZXIgaXMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgc2NlbmVcblx0XHRcdFx0XHRDb250cm9sbGVyLnNjcm9sbFRvKHNjcm9sbFRhcmdldC5zY3JvbGxPZmZzZXQoKSwgYWRkaXRpb25hbFBhcmFtZXRlcik7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0bG9nKDIsIFwic2Nyb2xsVG8oKTogVGhlIHN1cHBsaWVkIHNjZW5lIGRvZXMgbm90IGJlbG9uZyB0byB0aGlzIGNvbnRyb2xsZXIuIFNjcm9sbCBjYW5jZWxsZWQuXCIsIHNjcm9sbFRhcmdldCk7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSBpZiAoX3V0aWwudHlwZS5GdW5jdGlvbihzY3JvbGxUYXJnZXQpKSB7IC8vIGFzc2lnbiBuZXcgc2Nyb2xsIGZ1bmN0aW9uXG5cdFx0XHRcdHNldFNjcm9sbFBvcyA9IHNjcm9sbFRhcmdldDtcblx0XHRcdH0gZWxzZSB7IC8vIHNjcm9sbCB0byBlbGVtZW50XG5cdFx0XHRcdHZhciBlbGVtID0gX3V0aWwuZ2V0LmVsZW1lbnRzKHNjcm9sbFRhcmdldClbMF07XG5cdFx0XHRcdGlmIChlbGVtKSB7XG5cdFx0XHRcdFx0Ly8gaWYgcGFyZW50IGlzIHBpbiBzcGFjZXIsIHVzZSBzcGFjZXIgcG9zaXRpb24gaW5zdGVhZCBzbyBjb3JyZWN0IHN0YXJ0IHBvc2l0aW9uIGlzIHJldHVybmVkIGZvciBwaW5uZWQgZWxlbWVudHMuXG5cdFx0XHRcdFx0d2hpbGUgKGVsZW0ucGFyZW50Tm9kZS5oYXNBdHRyaWJ1dGUoUElOX1NQQUNFUl9BVFRSSUJVVEUpKSB7XG5cdFx0XHRcdFx0XHRlbGVtID0gZWxlbS5wYXJlbnROb2RlO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdHZhclxuXHRcdFx0XHRcdHBhcmFtID0gX29wdGlvbnMudmVydGljYWwgPyBcInRvcFwiIDogXCJsZWZ0XCIsXG5cdFx0XHRcdFx0XHQvLyB3aGljaCBwYXJhbSBpcyBvZiBpbnRlcmVzdCA/XG5cdFx0XHRcdFx0XHRjb250YWluZXJPZmZzZXQgPSBfdXRpbC5nZXQub2Zmc2V0KF9vcHRpb25zLmNvbnRhaW5lciksXG5cdFx0XHRcdFx0XHQvLyBjb250YWluZXIgcG9zaXRpb24gaXMgbmVlZGVkIGJlY2F1c2UgZWxlbWVudCBvZmZzZXQgaXMgcmV0dXJuZWQgaW4gcmVsYXRpb24gdG8gZG9jdW1lbnQsIG5vdCBpbiByZWxhdGlvbiB0byBjb250YWluZXIuXG5cdFx0XHRcdFx0XHRlbGVtZW50T2Zmc2V0ID0gX3V0aWwuZ2V0Lm9mZnNldChlbGVtKTtcblxuXHRcdFx0XHRcdGlmICghX2lzRG9jdW1lbnQpIHsgLy8gY29udGFpbmVyIGlzIG5vdCB0aGUgZG9jdW1lbnQgcm9vdCwgc28gc3Vic3RyYWN0IHNjcm9sbCBQb3NpdGlvbiB0byBnZXQgY29ycmVjdCB0cmlnZ2VyIGVsZW1lbnQgcG9zaXRpb24gcmVsYXRpdmUgdG8gc2Nyb2xsY29udGVudFxuXHRcdFx0XHRcdFx0Y29udGFpbmVyT2Zmc2V0W3BhcmFtXSAtPSBDb250cm9sbGVyLnNjcm9sbFBvcygpO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdENvbnRyb2xsZXIuc2Nyb2xsVG8oZWxlbWVudE9mZnNldFtwYXJhbV0gLSBjb250YWluZXJPZmZzZXRbcGFyYW1dLCBhZGRpdGlvbmFsUGFyYW1ldGVyKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRsb2coMiwgXCJzY3JvbGxUbygpOiBUaGUgc3VwcGxpZWQgYXJndW1lbnQgaXMgaW52YWxpZC4gU2Nyb2xsIGNhbmNlbGxlZC5cIiwgc2Nyb2xsVGFyZ2V0KTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIENvbnRyb2xsZXI7XG5cdFx0fTtcblxuXHRcdC8qKlxuXHRcdCAqICoqR2V0KiogdGhlIGN1cnJlbnQgc2Nyb2xsUG9zaXRpb24gb3IgKipTZXQqKiBhIG5ldyBtZXRob2QgdG8gY2FsY3VsYXRlIGl0LiAgXG5cdFx0ICogLT4gKipHRVQqKjpcblx0XHQgKiBXaGVuIHVzZWQgYXMgYSBnZXR0ZXIgdGhpcyBmdW5jdGlvbiB3aWxsIHJldHVybiB0aGUgY3VycmVudCBzY3JvbGwgcG9zaXRpb24uICBcblx0XHQgKiBUbyBnZXQgYSBjYWNoZWQgdmFsdWUgdXNlIENvbnRyb2xsZXIuaW5mbyhcInNjcm9sbFBvc1wiKSwgd2hpY2ggd2lsbCBiZSB1cGRhdGVkIGluIHRoZSB1cGRhdGUgY3ljbGUuICBcblx0XHQgKiBGb3IgdmVydGljYWwgY29udHJvbGxlcnMgaXQgd2lsbCByZXR1cm4gdGhlIHRvcCBzY3JvbGwgb2Zmc2V0IGFuZCBmb3IgaG9yaXpvbnRhbCBhcHBsaWNhdGlvbnMgaXQgd2lsbCByZXR1cm4gdGhlIGxlZnQgb2Zmc2V0LlxuXHRcdCAqXG5cdFx0ICogLT4gKipTRVQqKjpcblx0XHQgKiBXaGVuIHVzZWQgYXMgYSBzZXR0ZXIgdGhpcyBtZXRob2QgcHJvZGVzIGEgd2F5IHRvIHBlcm1hbmVudGx5IG92ZXJ3cml0ZSB0aGUgY29udHJvbGxlcidzIHNjcm9sbCBwb3NpdGlvbiBjYWxjdWxhdGlvbi4gIFxuXHRcdCAqIEEgdHlwaWNhbCB1c2VjYXNlIGlzIHdoZW4gdGhlIHNjcm9sbCBwb3NpdGlvbiBpcyBub3QgcmVmbGVjdGVkIGJ5IHRoZSBjb250YWluZXJzIHNjcm9sbFRvcCBvciBzY3JvbGxMZWZ0IHZhbHVlcywgYnV0IGZvciBleGFtcGxlIGJ5IHRoZSBpbm5lciBvZmZzZXQgb2YgYSBjaGlsZCBjb250YWluZXIuICBcblx0XHQgKiBNb3ZpbmcgYSBjaGlsZCBjb250YWluZXIgaW5zaWRlIGEgcGFyZW50IGlzIGEgY29tbW9ubHkgdXNlZCBtZXRob2QgZm9yIHNldmVyYWwgc2Nyb2xsaW5nIGZyYW1ld29ya3MsIGluY2x1ZGluZyBpU2Nyb2xsLiAgXG5cdFx0ICogQnkgcHJvdmlkaW5nIGFuIGFsdGVybmF0ZSBjYWxjdWxhdGlvbiBmdW5jdGlvbiB5b3UgY2FuIG1ha2Ugc3VyZSBTY3JvbGxNYWdpYyByZWNlaXZlcyB0aGUgY29ycmVjdCBzY3JvbGwgcG9zaXRpb24uICBcblx0XHQgKiBQbGVhc2UgYWxzbyBiZWFyIGluIG1pbmQgdGhhdCB5b3VyIGZ1bmN0aW9uIHNob3VsZCByZXR1cm4geSB2YWx1ZXMgZm9yIHZlcnRpY2FsIHNjcm9sbHMgYW4geCBmb3IgaG9yaXpvbnRhbHMuXG5cdFx0ICpcblx0XHQgKiBUbyBjaGFuZ2UgdGhlIGN1cnJlbnQgc2Nyb2xsIHBvc2l0aW9uIHBsZWFzZSB1c2UgYENvbnRyb2xsZXIuc2Nyb2xsVG8oKWAuXG5cdFx0ICogQHB1YmxpY1xuXHRcdCAqXG5cdFx0ICogQGV4YW1wbGVcblx0XHQgKiAvLyBnZXQgdGhlIGN1cnJlbnQgc2Nyb2xsIFBvc2l0aW9uXG5cdFx0ICogdmFyIHNjcm9sbFBvcyA9IGNvbnRyb2xsZXIuc2Nyb2xsUG9zKCk7XG5cdFx0ICpcblx0XHQgKiAvLyBzZXQgYSBuZXcgc2Nyb2xsIHBvc2l0aW9uIGNhbGN1bGF0aW9uIG1ldGhvZFxuXHRcdCAqIGNvbnRyb2xsZXIuc2Nyb2xsUG9zKGZ1bmN0aW9uICgpIHtcblx0XHQgKlx0cmV0dXJuIHRoaXMuaW5mbyhcInZlcnRpY2FsXCIpID8gLW15Y2hpbGRjb250YWluZXIueSA6IC1teWNoaWxkY29udGFpbmVyLnhcblx0XHQgKiB9KTtcblx0XHQgKlxuXHRcdCAqIEBwYXJhbSB7ZnVuY3Rpb259IFtzY3JvbGxQb3NNZXRob2RdIC0gVGhlIGZ1bmN0aW9uIHRvIGJlIHVzZWQgZm9yIHRoZSBzY3JvbGwgcG9zaXRpb24gY2FsY3VsYXRpb24gb2YgdGhlIGNvbnRhaW5lci5cblx0XHQgKiBAcmV0dXJucyB7KG51bWJlcnxDb250cm9sbGVyKX0gQ3VycmVudCBzY3JvbGwgcG9zaXRpb24gb3IgcGFyZW50IG9iamVjdCBmb3IgY2hhaW5pbmcuXG5cdFx0ICovXG5cdFx0dGhpcy5zY3JvbGxQb3MgPSBmdW5jdGlvbiAoc2Nyb2xsUG9zTWV0aG9kKSB7XG5cdFx0XHRpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHsgLy8gZ2V0XG5cdFx0XHRcdHJldHVybiBnZXRTY3JvbGxQb3MuY2FsbChDb250cm9sbGVyKTtcblx0XHRcdH0gZWxzZSB7IC8vIHNldFxuXHRcdFx0XHRpZiAoX3V0aWwudHlwZS5GdW5jdGlvbihzY3JvbGxQb3NNZXRob2QpKSB7XG5cdFx0XHRcdFx0Z2V0U2Nyb2xsUG9zID0gc2Nyb2xsUG9zTWV0aG9kO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGxvZygyLCBcIlByb3ZpZGVkIHZhbHVlIGZvciBtZXRob2QgJ3Njcm9sbFBvcycgaXMgbm90IGEgZnVuY3Rpb24uIFRvIGNoYW5nZSB0aGUgY3VycmVudCBzY3JvbGwgcG9zaXRpb24gdXNlICdzY3JvbGxUbygpJy5cIik7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdHJldHVybiBDb250cm9sbGVyO1xuXHRcdH07XG5cblx0XHQvKipcblx0XHQgKiAqKkdldCoqIGFsbCBpbmZvcyBvciBvbmUgaW4gcGFydGljdWxhciBhYm91dCB0aGUgY29udHJvbGxlci5cblx0XHQgKiBAcHVibGljXG5cdFx0ICogQGV4YW1wbGVcblx0XHQgKiAvLyByZXR1cm5zIHRoZSBjdXJyZW50IHNjcm9sbCBwb3NpdGlvbiAobnVtYmVyKVxuXHRcdCAqIHZhciBzY3JvbGxQb3MgPSBjb250cm9sbGVyLmluZm8oXCJzY3JvbGxQb3NcIik7XG5cdFx0ICpcblx0XHQgKiAvLyByZXR1cm5zIGFsbCBpbmZvcyBhcyBhbiBvYmplY3Rcblx0XHQgKiB2YXIgaW5mb3MgPSBjb250cm9sbGVyLmluZm8oKTtcblx0XHQgKlxuXHRcdCAqIEBwYXJhbSB7c3RyaW5nfSBbYWJvdXRdIC0gSWYgcGFzc2VkIG9ubHkgdGhpcyBpbmZvIHdpbGwgYmUgcmV0dXJuZWQgaW5zdGVhZCBvZiBhbiBvYmplY3QgY29udGFpbmluZyBhbGwuICBcblx0XHQgVmFsaWQgb3B0aW9ucyBhcmU6XG5cdFx0ICoqIGBcInNpemVcImAgPT4gdGhlIGN1cnJlbnQgdmlld3BvcnQgc2l6ZSBvZiB0aGUgY29udGFpbmVyXG5cdFx0ICoqIGBcInZlcnRpY2FsXCJgID0+IHRydWUgaWYgdmVydGljYWwgc2Nyb2xsaW5nLCBvdGhlcndpc2UgZmFsc2Vcblx0XHQgKiogYFwic2Nyb2xsUG9zXCJgID0+IHRoZSBjdXJyZW50IHNjcm9sbCBwb3NpdGlvblxuXHRcdCAqKiBgXCJzY3JvbGxEaXJlY3Rpb25cImAgPT4gdGhlIGxhc3Qga25vd24gZGlyZWN0aW9uIG9mIHRoZSBzY3JvbGxcblx0XHQgKiogYFwiY29udGFpbmVyXCJgID0+IHRoZSBjb250YWluZXIgZWxlbWVudFxuXHRcdCAqKiBgXCJpc0RvY3VtZW50XCJgID0+IHRydWUgaWYgY29udGFpbmVyIGVsZW1lbnQgaXMgdGhlIGRvY3VtZW50LlxuXHRcdCAqIEByZXR1cm5zIHsobWl4ZWR8b2JqZWN0KX0gVGhlIHJlcXVlc3RlZCBpbmZvKHMpLlxuXHRcdCAqL1xuXHRcdHRoaXMuaW5mbyA9IGZ1bmN0aW9uIChhYm91dCkge1xuXHRcdFx0dmFyIHZhbHVlcyA9IHtcblx0XHRcdFx0c2l6ZTogX3ZpZXdQb3J0U2l6ZSxcblx0XHRcdFx0Ly8gY29udGFpbnMgaGVpZ2h0IG9yIHdpZHRoIChpbiByZWdhcmQgdG8gb3JpZW50YXRpb24pO1xuXHRcdFx0XHR2ZXJ0aWNhbDogX29wdGlvbnMudmVydGljYWwsXG5cdFx0XHRcdHNjcm9sbFBvczogX3Njcm9sbFBvcyxcblx0XHRcdFx0c2Nyb2xsRGlyZWN0aW9uOiBfc2Nyb2xsRGlyZWN0aW9uLFxuXHRcdFx0XHRjb250YWluZXI6IF9vcHRpb25zLmNvbnRhaW5lcixcblx0XHRcdFx0aXNEb2N1bWVudDogX2lzRG9jdW1lbnRcblx0XHRcdH07XG5cdFx0XHRpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHsgLy8gZ2V0IGFsbCBhcyBhbiBvYmplY3Rcblx0XHRcdFx0cmV0dXJuIHZhbHVlcztcblx0XHRcdH0gZWxzZSBpZiAodmFsdWVzW2Fib3V0XSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdHJldHVybiB2YWx1ZXNbYWJvdXRdO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0bG9nKDEsIFwiRVJST1I6IG9wdGlvbiBcXFwiXCIgKyBhYm91dCArIFwiXFxcIiBpcyBub3QgYXZhaWxhYmxlXCIpO1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cdFx0fTtcblxuXHRcdC8qKlxuXHRcdCAqICoqR2V0Kiogb3IgKipTZXQqKiB0aGUgY3VycmVudCBsb2dsZXZlbCBvcHRpb24gdmFsdWUuXG5cdFx0ICogQHB1YmxpY1xuXHRcdCAqXG5cdFx0ICogQGV4YW1wbGVcblx0XHQgKiAvLyBnZXQgdGhlIGN1cnJlbnQgdmFsdWVcblx0XHQgKiB2YXIgbG9nbGV2ZWwgPSBjb250cm9sbGVyLmxvZ2xldmVsKCk7XG5cdFx0ICpcblx0XHQgKiAvLyBzZXQgYSBuZXcgdmFsdWVcblx0XHQgKiBjb250cm9sbGVyLmxvZ2xldmVsKDMpO1xuXHRcdCAqXG5cdFx0ICogQHBhcmFtIHtudW1iZXJ9IFtuZXdMb2dsZXZlbF0gLSBUaGUgbmV3IGxvZ2xldmVsIHNldHRpbmcgb2YgdGhlIENvbnRyb2xsZXIuIGBbMC0zXWBcblx0XHQgKiBAcmV0dXJucyB7KG51bWJlcnxDb250cm9sbGVyKX0gQ3VycmVudCBsb2dsZXZlbCBvciBwYXJlbnQgb2JqZWN0IGZvciBjaGFpbmluZy5cblx0XHQgKi9cblx0XHR0aGlzLmxvZ2xldmVsID0gZnVuY3Rpb24gKG5ld0xvZ2xldmVsKSB7XG5cdFx0XHRpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHsgLy8gZ2V0XG5cdFx0XHRcdHJldHVybiBfb3B0aW9ucy5sb2dsZXZlbDtcblx0XHRcdH0gZWxzZSBpZiAoX29wdGlvbnMubG9nbGV2ZWwgIT0gbmV3TG9nbGV2ZWwpIHsgLy8gc2V0XG5cdFx0XHRcdF9vcHRpb25zLmxvZ2xldmVsID0gbmV3TG9nbGV2ZWw7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gQ29udHJvbGxlcjtcblx0XHR9O1xuXG5cdFx0LyoqXG5cdFx0ICogKipHZXQqKiBvciAqKlNldCoqIHRoZSBjdXJyZW50IGVuYWJsZWQgc3RhdGUgb2YgdGhlIGNvbnRyb2xsZXIuICBcblx0XHQgKiBUaGlzIGNhbiBiZSB1c2VkIHRvIGRpc2FibGUgYWxsIFNjZW5lcyBjb25uZWN0ZWQgdG8gdGhlIGNvbnRyb2xsZXIgd2l0aG91dCBkZXN0cm95aW5nIG9yIHJlbW92aW5nIHRoZW0uXG5cdFx0ICogQHB1YmxpY1xuXHRcdCAqXG5cdFx0ICogQGV4YW1wbGVcblx0XHQgKiAvLyBnZXQgdGhlIGN1cnJlbnQgdmFsdWVcblx0XHQgKiB2YXIgZW5hYmxlZCA9IGNvbnRyb2xsZXIuZW5hYmxlZCgpO1xuXHRcdCAqXG5cdFx0ICogLy8gZGlzYWJsZSB0aGUgY29udHJvbGxlclxuXHRcdCAqIGNvbnRyb2xsZXIuZW5hYmxlZChmYWxzZSk7XG5cdFx0ICpcblx0XHQgKiBAcGFyYW0ge2Jvb2xlYW59IFtuZXdTdGF0ZV0gLSBUaGUgbmV3IGVuYWJsZWQgc3RhdGUgb2YgdGhlIGNvbnRyb2xsZXIgYHRydWVgIG9yIGBmYWxzZWAuXG5cdFx0ICogQHJldHVybnMgeyhib29sZWFufENvbnRyb2xsZXIpfSBDdXJyZW50IGVuYWJsZWQgc3RhdGUgb3IgcGFyZW50IG9iamVjdCBmb3IgY2hhaW5pbmcuXG5cdFx0ICovXG5cdFx0dGhpcy5lbmFibGVkID0gZnVuY3Rpb24gKG5ld1N0YXRlKSB7XG5cdFx0XHRpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHsgLy8gZ2V0XG5cdFx0XHRcdHJldHVybiBfZW5hYmxlZDtcblx0XHRcdH0gZWxzZSBpZiAoX2VuYWJsZWQgIT0gbmV3U3RhdGUpIHsgLy8gc2V0XG5cdFx0XHRcdF9lbmFibGVkID0gISEgbmV3U3RhdGU7XG5cdFx0XHRcdENvbnRyb2xsZXIudXBkYXRlU2NlbmUoX3NjZW5lT2JqZWN0cywgdHJ1ZSk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gQ29udHJvbGxlcjtcblx0XHR9O1xuXG5cdFx0LyoqXG5cdFx0ICogRGVzdHJveSB0aGUgQ29udHJvbGxlciwgYWxsIFNjZW5lcyBhbmQgZXZlcnl0aGluZy5cblx0XHQgKiBAcHVibGljXG5cdFx0ICpcblx0XHQgKiBAZXhhbXBsZVxuXHRcdCAqIC8vIHdpdGhvdXQgcmVzZXR0aW5nIHRoZSBzY2VuZXNcblx0XHQgKiBjb250cm9sbGVyID0gY29udHJvbGxlci5kZXN0cm95KCk7XG5cdFx0ICpcblx0XHQgKiAvLyB3aXRoIHNjZW5lIHJlc2V0XG5cdFx0ICogY29udHJvbGxlciA9IGNvbnRyb2xsZXIuZGVzdHJveSh0cnVlKTtcblx0XHQgKlxuXHRcdCAqIEBwYXJhbSB7Ym9vbGVhbn0gW3Jlc2V0U2NlbmVzPWZhbHNlXSAtIElmIGB0cnVlYCB0aGUgcGlucyBhbmQgdHdlZW5zIChpZiBleGlzdGVudCkgb2YgYWxsIHNjZW5lcyB3aWxsIGJlIHJlc2V0LlxuXHRcdCAqIEByZXR1cm5zIHtudWxsfSBOdWxsIHRvIHVuc2V0IGhhbmRsZXIgdmFyaWFibGVzLlxuXHRcdCAqL1xuXHRcdHRoaXMuZGVzdHJveSA9IGZ1bmN0aW9uIChyZXNldFNjZW5lcykge1xuXHRcdFx0d2luZG93LmNsZWFyVGltZW91dChfcmVmcmVzaFRpbWVvdXQpO1xuXHRcdFx0dmFyIGkgPSBfc2NlbmVPYmplY3RzLmxlbmd0aDtcblx0XHRcdHdoaWxlIChpLS0pIHtcblx0XHRcdFx0X3NjZW5lT2JqZWN0c1tpXS5kZXN0cm95KHJlc2V0U2NlbmVzKTtcblx0XHRcdH1cblx0XHRcdF9vcHRpb25zLmNvbnRhaW5lci5yZW1vdmVFdmVudExpc3RlbmVyKFwicmVzaXplXCIsIG9uQ2hhbmdlKTtcblx0XHRcdF9vcHRpb25zLmNvbnRhaW5lci5yZW1vdmVFdmVudExpc3RlbmVyKFwic2Nyb2xsXCIsIG9uQ2hhbmdlKTtcblx0XHRcdF91dGlsLmNBRihfdXBkYXRlVGltZW91dCk7XG5cdFx0XHRsb2coMywgXCJkZXN0cm95ZWQgXCIgKyBOQU1FU1BBQ0UgKyBcIiAocmVzZXQ6IFwiICsgKHJlc2V0U2NlbmVzID8gXCJ0cnVlXCIgOiBcImZhbHNlXCIpICsgXCIpXCIpO1xuXHRcdFx0cmV0dXJuIG51bGw7XG5cdFx0fTtcblxuXHRcdC8vIElOSVRcblx0XHRjb25zdHJ1Y3QoKTtcblx0XHRyZXR1cm4gQ29udHJvbGxlcjtcblx0fTtcblxuXHQvLyBzdG9yZSBwYWdld2lkZSBjb250cm9sbGVyIG9wdGlvbnNcblx0dmFyIENPTlRST0xMRVJfT1BUSU9OUyA9IHtcblx0XHRkZWZhdWx0czoge1xuXHRcdFx0Y29udGFpbmVyOiB3aW5kb3csXG5cdFx0XHR2ZXJ0aWNhbDogdHJ1ZSxcblx0XHRcdGdsb2JhbFNjZW5lT3B0aW9uczoge30sXG5cdFx0XHRsb2dsZXZlbDogMixcblx0XHRcdHJlZnJlc2hJbnRlcnZhbDogMTAwXG5cdFx0fVxuXHR9O1xuLypcbiAqIG1ldGhvZCB1c2VkIHRvIGFkZCBhbiBvcHRpb24gdG8gU2Nyb2xsTWFnaWMgU2NlbmVzLlxuICovXG5cdFNjcm9sbE1hZ2ljLkNvbnRyb2xsZXIuYWRkT3B0aW9uID0gZnVuY3Rpb24gKG5hbWUsIGRlZmF1bHRWYWx1ZSkge1xuXHRcdENPTlRST0xMRVJfT1BUSU9OUy5kZWZhdWx0c1tuYW1lXSA9IGRlZmF1bHRWYWx1ZTtcblx0fTtcblx0Ly8gaW5zdGFuY2UgZXh0ZW5zaW9uIGZ1bmN0aW9uIGZvciBwbHVnaW5zXG5cdFNjcm9sbE1hZ2ljLkNvbnRyb2xsZXIuZXh0ZW5kID0gZnVuY3Rpb24gKGV4dGVuc2lvbikge1xuXHRcdHZhciBvbGRDbGFzcyA9IHRoaXM7XG5cdFx0U2Nyb2xsTWFnaWMuQ29udHJvbGxlciA9IGZ1bmN0aW9uICgpIHtcblx0XHRcdG9sZENsYXNzLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG5cdFx0XHR0aGlzLiRzdXBlciA9IF91dGlsLmV4dGVuZCh7fSwgdGhpcyk7IC8vIGNvcHkgcGFyZW50IHN0YXRlXG5cdFx0XHRyZXR1cm4gZXh0ZW5zaW9uLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgfHwgdGhpcztcblx0XHR9O1xuXHRcdF91dGlsLmV4dGVuZChTY3JvbGxNYWdpYy5Db250cm9sbGVyLCBvbGRDbGFzcyk7IC8vIGNvcHkgcHJvcGVydGllc1xuXHRcdFNjcm9sbE1hZ2ljLkNvbnRyb2xsZXIucHJvdG90eXBlID0gb2xkQ2xhc3MucHJvdG90eXBlOyAvLyBjb3B5IHByb3RvdHlwZVxuXHRcdFNjcm9sbE1hZ2ljLkNvbnRyb2xsZXIucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gU2Nyb2xsTWFnaWMuQ29udHJvbGxlcjsgLy8gcmVzdG9yZSBjb25zdHJ1Y3RvclxuXHR9O1xuXG5cblx0LyoqXG5cdCAqIEEgU2NlbmUgZGVmaW5lcyB3aGVyZSB0aGUgY29udHJvbGxlciBzaG91bGQgcmVhY3QgYW5kIGhvdy5cblx0ICpcblx0ICogQGNsYXNzXG5cdCAqXG5cdCAqIEBleGFtcGxlXG5cdCAqIC8vIGNyZWF0ZSBhIHN0YW5kYXJkIHNjZW5lIGFuZCBhZGQgaXQgdG8gYSBjb250cm9sbGVyXG5cdCAqIG5ldyBTY3JvbGxNYWdpYy5TY2VuZSgpXG5cdCAqXHRcdC5hZGRUbyhjb250cm9sbGVyKTtcblx0ICpcblx0ICogLy8gY3JlYXRlIGEgc2NlbmUgd2l0aCBjdXN0b20gb3B0aW9ucyBhbmQgYXNzaWduIGEgaGFuZGxlciB0byBpdC5cblx0ICogdmFyIHNjZW5lID0gbmV3IFNjcm9sbE1hZ2ljLlNjZW5lKHtcblx0ICogXHRcdGR1cmF0aW9uOiAxMDAsXG5cdCAqXHRcdG9mZnNldDogMjAwLFxuXHQgKlx0XHR0cmlnZ2VySG9vazogXCJvbkVudGVyXCIsXG5cdCAqXHRcdHJldmVyc2U6IGZhbHNlXG5cdCAqIH0pO1xuXHQgKlxuXHQgKiBAcGFyYW0ge29iamVjdH0gW29wdGlvbnNdIC0gT3B0aW9ucyBmb3IgdGhlIFNjZW5lLiBUaGUgb3B0aW9ucyBjYW4gYmUgdXBkYXRlZCBhdCBhbnkgdGltZS4gIFxuXHQgSW5zdGVhZCBvZiBzZXR0aW5nIHRoZSBvcHRpb25zIGZvciBlYWNoIHNjZW5lIGluZGl2aWR1YWxseSB5b3UgY2FuIGFsc28gc2V0IHRoZW0gZ2xvYmFsbHkgaW4gdGhlIGNvbnRyb2xsZXIgYXMgdGhlIGNvbnRyb2xsZXJzIGBnbG9iYWxTY2VuZU9wdGlvbnNgIG9wdGlvbi4gVGhlIG9iamVjdCBhY2NlcHRzIHRoZSBzYW1lIHByb3BlcnRpZXMgYXMgdGhlIG9uZXMgYmVsb3cuICBcblx0IFdoZW4gYSBzY2VuZSBpcyBhZGRlZCB0byB0aGUgY29udHJvbGxlciB0aGUgb3B0aW9ucyBkZWZpbmVkIHVzaW5nIHRoZSBTY2VuZSBjb25zdHJ1Y3RvciB3aWxsIGJlIG92ZXJ3cml0dGVuIGJ5IHRob3NlIHNldCBpbiBgZ2xvYmFsU2NlbmVPcHRpb25zYC5cblx0ICogQHBhcmFtIHsobnVtYmVyfGZ1bmN0aW9uKX0gW29wdGlvbnMuZHVyYXRpb249MF0gLSBUaGUgZHVyYXRpb24gb2YgdGhlIHNjZW5lLiBcblx0IElmIGAwYCB0d2VlbnMgd2lsbCBhdXRvLXBsYXkgd2hlbiByZWFjaGluZyB0aGUgc2NlbmUgc3RhcnQgcG9pbnQsIHBpbnMgd2lsbCBiZSBwaW5uZWQgaW5kZWZpbmV0bHkgc3RhcnRpbmcgYXQgdGhlIHN0YXJ0IHBvc2l0aW9uLiAgXG5cdCBBIGZ1bmN0aW9uIHJldHVuaW5nIHRoZSBkdXJhdGlvbiB2YWx1ZSBpcyBhbHNvIHN1cHBvcnRlZC4gUGxlYXNlIHNlZSBgU2NlbmUuZHVyYXRpb24oKWAgZm9yIGRldGFpbHMuXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbb3B0aW9ucy5vZmZzZXQ9MF0gLSBPZmZzZXQgVmFsdWUgZm9yIHRoZSBUcmlnZ2VyIFBvc2l0aW9uLiBJZiBubyB0cmlnZ2VyRWxlbWVudCBpcyBkZWZpbmVkIHRoaXMgd2lsbCBiZSB0aGUgc2Nyb2xsIGRpc3RhbmNlIGZyb20gdGhlIHN0YXJ0IG9mIHRoZSBwYWdlLCBhZnRlciB3aGljaCB0aGUgc2NlbmUgd2lsbCBzdGFydC5cblx0ICogQHBhcmFtIHsoc3RyaW5nfG9iamVjdCl9IFtvcHRpb25zLnRyaWdnZXJFbGVtZW50PW51bGxdIC0gU2VsZWN0b3Igb3IgRE9NIG9iamVjdCB0aGF0IGRlZmluZXMgdGhlIHN0YXJ0IG9mIHRoZSBzY2VuZS4gSWYgdW5kZWZpbmVkIHRoZSBzY2VuZSB3aWxsIHN0YXJ0IHJpZ2h0IGF0IHRoZSBzdGFydCBvZiB0aGUgcGFnZSAodW5sZXNzIGFuIG9mZnNldCBpcyBzZXQpLlxuXHQgKiBAcGFyYW0geyhudW1iZXJ8c3RyaW5nKX0gW29wdGlvbnMudHJpZ2dlckhvb2s9XCJvbkNlbnRlclwiXSAtIENhbiBiZSBhIG51bWJlciBiZXR3ZWVuIDAgYW5kIDEgZGVmaW5pbmcgdGhlIHBvc2l0aW9uIG9mIHRoZSB0cmlnZ2VyIEhvb2sgaW4gcmVsYXRpb24gdG8gdGhlIHZpZXdwb3J0LiAgXG5cdCBDYW4gYWxzbyBiZSBkZWZpbmVkIHVzaW5nIGEgc3RyaW5nOlxuXHQgKiogYFwib25FbnRlclwiYCA9PiBgMWBcblx0ICoqIGBcIm9uQ2VudGVyXCJgID0+IGAwLjVgXG5cdCAqKiBgXCJvbkxlYXZlXCJgID0+IGAwYFxuXHQgKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLnJldmVyc2U9dHJ1ZV0gLSBTaG91bGQgdGhlIHNjZW5lIHJldmVyc2UsIHdoZW4gc2Nyb2xsaW5nIHVwP1xuXHQgKiBAcGFyYW0ge251bWJlcn0gW29wdGlvbnMubG9nbGV2ZWw9Ml0gLSBMb2dsZXZlbCBmb3IgZGVidWdnaW5nLiBOb3RlIHRoYXQgbG9nZ2luZyBpcyBkaXNhYmxlZCBpbiB0aGUgbWluaWZpZWQgdmVyc2lvbiBvZiBTY3JvbGxNYWdpYy5cblx0ICoqIGAwYCA9PiBzaWxlbnRcblx0ICoqIGAxYCA9PiBlcnJvcnNcblx0ICoqIGAyYCA9PiBlcnJvcnMsIHdhcm5pbmdzXG5cdCAqKiBgM2AgPT4gZXJyb3JzLCB3YXJuaW5ncywgZGVidWdpbmZvXG5cdCAqIFxuXHQgKi9cblx0U2Nyb2xsTWFnaWMuU2NlbmUgPSBmdW5jdGlvbiAob3B0aW9ucykge1xuXG4vKlxuXHQgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cdCAqIHNldHRpbmdzXG5cdCAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblx0ICovXG5cblx0XHR2YXJcblx0XHROQU1FU1BBQ0UgPSAnU2Nyb2xsTWFnaWMuU2NlbmUnLFxuXHRcdFx0U0NFTkVfU1RBVEVfQkVGT1JFID0gJ0JFRk9SRScsXG5cdFx0XHRTQ0VORV9TVEFURV9EVVJJTkcgPSAnRFVSSU5HJyxcblx0XHRcdFNDRU5FX1NUQVRFX0FGVEVSID0gJ0FGVEVSJyxcblx0XHRcdERFRkFVTFRfT1BUSU9OUyA9IFNDRU5FX09QVElPTlMuZGVmYXVsdHM7XG5cbi8qXG5cdCAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblx0ICogcHJpdmF0ZSB2YXJzXG5cdCAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblx0ICovXG5cblx0XHR2YXJcblx0XHRTY2VuZSA9IHRoaXMsXG5cdFx0XHRfb3B0aW9ucyA9IF91dGlsLmV4dGVuZCh7fSwgREVGQVVMVF9PUFRJT05TLCBvcHRpb25zKSxcblx0XHRcdF9zdGF0ZSA9IFNDRU5FX1NUQVRFX0JFRk9SRSxcblx0XHRcdF9wcm9ncmVzcyA9IDAsXG5cdFx0XHRfc2Nyb2xsT2Zmc2V0ID0ge1xuXHRcdFx0XHRzdGFydDogMCxcblx0XHRcdFx0ZW5kOiAwXG5cdFx0XHR9LFxuXHRcdFx0Ly8gcmVmbGVjdHMgdGhlIGNvbnRyb2xsZXJzJ3Mgc2Nyb2xsIHBvc2l0aW9uIGZvciB0aGUgc3RhcnQgYW5kIGVuZCBvZiB0aGUgc2NlbmUgcmVzcGVjdGl2ZWx5XG5cdFx0XHRfdHJpZ2dlclBvcyA9IDAsXG5cdFx0XHRfZW5hYmxlZCA9IHRydWUsXG5cdFx0XHRfZHVyYXRpb25VcGRhdGVNZXRob2QsIF9jb250cm9sbGVyO1xuXG5cdFx0LyoqXG5cdFx0ICogSW50ZXJuYWwgY29uc3RydWN0b3IgZnVuY3Rpb24gb2YgdGhlIFNjcm9sbE1hZ2ljIFNjZW5lXG5cdFx0ICogQHByaXZhdGVcblx0XHQgKi9cblx0XHR2YXIgY29uc3RydWN0ID0gZnVuY3Rpb24gKCkge1xuXHRcdFx0Zm9yICh2YXIga2V5IGluIF9vcHRpb25zKSB7IC8vIGNoZWNrIHN1cHBsaWVkIG9wdGlvbnNcblx0XHRcdFx0aWYgKCFERUZBVUxUX09QVElPTlMuaGFzT3duUHJvcGVydHkoa2V5KSkge1xuXHRcdFx0XHRcdGxvZygyLCBcIldBUk5JTkc6IFVua25vd24gb3B0aW9uIFxcXCJcIiArIGtleSArIFwiXFxcIlwiKTtcblx0XHRcdFx0XHRkZWxldGUgX29wdGlvbnNba2V5XTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0Ly8gYWRkIGdldHRlcnMvc2V0dGVycyBmb3IgYWxsIHBvc3NpYmxlIG9wdGlvbnNcblx0XHRcdGZvciAodmFyIG9wdGlvbk5hbWUgaW4gREVGQVVMVF9PUFRJT05TKSB7XG5cdFx0XHRcdGFkZFNjZW5lT3B0aW9uKG9wdGlvbk5hbWUpO1xuXHRcdFx0fVxuXHRcdFx0Ly8gdmFsaWRhdGUgYWxsIG9wdGlvbnNcblx0XHRcdHZhbGlkYXRlT3B0aW9uKCk7XG5cdFx0fTtcblxuLypcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIEV2ZW50IE1hbmFnZW1lbnRcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqL1xuXG5cdFx0dmFyIF9saXN0ZW5lcnMgPSB7fTtcblx0XHQvKipcblx0XHQgKiBTY2VuZSBzdGFydCBldmVudC4gIFxuXHRcdCAqIEZpcmVzIHdoZW5ldmVyIHRoZSBzY3JvbGwgcG9zaXRpb24gaXRzIHRoZSBzdGFydGluZyBwb2ludCBvZiB0aGUgc2NlbmUuICBcblx0XHQgKiBJdCB3aWxsIGFsc28gZmlyZSB3aGVuIHNjcm9sbGluZyBiYWNrIHVwIGdvaW5nIG92ZXIgdGhlIHN0YXJ0IHBvc2l0aW9uIG9mIHRoZSBzY2VuZS4gSWYgeW91IHdhbnQgc29tZXRoaW5nIHRvIGhhcHBlbiBvbmx5IHdoZW4gc2Nyb2xsaW5nIGRvd24vcmlnaHQsIHVzZSB0aGUgc2Nyb2xsRGlyZWN0aW9uIHBhcmFtZXRlciBwYXNzZWQgdG8gdGhlIGNhbGxiYWNrLlxuXHRcdCAqXG5cdFx0ICogRm9yIGRldGFpbHMgb24gdGhpcyBldmVudCBhbmQgdGhlIG9yZGVyIGluIHdoaWNoIGl0IGlzIGZpcmVkLCBwbGVhc2UgcmV2aWV3IHRoZSB7QGxpbmsgU2NlbmUucHJvZ3Jlc3N9IG1ldGhvZC5cblx0XHQgKlxuXHRcdCAqIEBldmVudCBTY3JvbGxNYWdpYy5TY2VuZSNzdGFydFxuXHRcdCAqXG5cdFx0ICogQGV4YW1wbGVcblx0XHQgKiBzY2VuZS5vbihcInN0YXJ0XCIsIGZ1bmN0aW9uIChldmVudCkge1xuXHRcdCAqIFx0Y29uc29sZS5sb2coXCJIaXQgc3RhcnQgcG9pbnQgb2Ygc2NlbmUuXCIpO1xuXHRcdCAqIH0pO1xuXHRcdCAqXG5cdFx0ICogQHByb3BlcnR5IHtvYmplY3R9IGV2ZW50IC0gVGhlIGV2ZW50IE9iamVjdCBwYXNzZWQgdG8gZWFjaCBjYWxsYmFja1xuXHRcdCAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBldmVudC50eXBlIC0gVGhlIG5hbWUgb2YgdGhlIGV2ZW50XG5cdFx0ICogQHByb3BlcnR5IHtTY2VuZX0gZXZlbnQudGFyZ2V0IC0gVGhlIFNjZW5lIG9iamVjdCB0aGF0IHRyaWdnZXJlZCB0aGlzIGV2ZW50XG5cdFx0ICogQHByb3BlcnR5IHtudW1iZXJ9IGV2ZW50LnByb2dyZXNzIC0gUmVmbGVjdHMgdGhlIGN1cnJlbnQgcHJvZ3Jlc3Mgb2YgdGhlIHNjZW5lXG5cdFx0ICogQHByb3BlcnR5IHtzdHJpbmd9IGV2ZW50LnN0YXRlIC0gVGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIHNjZW5lIGBcIkJFRk9SRVwiYCBvciBgXCJEVVJJTkdcImBcblx0XHQgKiBAcHJvcGVydHkge3N0cmluZ30gZXZlbnQuc2Nyb2xsRGlyZWN0aW9uIC0gSW5kaWNhdGVzIHdoaWNoIHdheSB3ZSBhcmUgc2Nyb2xsaW5nIGBcIlBBVVNFRFwiYCwgYFwiRk9SV0FSRFwiYCBvciBgXCJSRVZFUlNFXCJgXG5cdFx0ICovXG5cdFx0LyoqXG5cdFx0ICogU2NlbmUgZW5kIGV2ZW50LiAgXG5cdFx0ICogRmlyZXMgd2hlbmV2ZXIgdGhlIHNjcm9sbCBwb3NpdGlvbiBpdHMgdGhlIGVuZGluZyBwb2ludCBvZiB0aGUgc2NlbmUuICBcblx0XHQgKiBJdCB3aWxsIGFsc28gZmlyZSB3aGVuIHNjcm9sbGluZyBiYWNrIHVwIGZyb20gYWZ0ZXIgdGhlIHNjZW5lIGFuZCBnb2luZyBvdmVyIGl0cyBlbmQgcG9zaXRpb24uIElmIHlvdSB3YW50IHNvbWV0aGluZyB0byBoYXBwZW4gb25seSB3aGVuIHNjcm9sbGluZyBkb3duL3JpZ2h0LCB1c2UgdGhlIHNjcm9sbERpcmVjdGlvbiBwYXJhbWV0ZXIgcGFzc2VkIHRvIHRoZSBjYWxsYmFjay5cblx0XHQgKlxuXHRcdCAqIEZvciBkZXRhaWxzIG9uIHRoaXMgZXZlbnQgYW5kIHRoZSBvcmRlciBpbiB3aGljaCBpdCBpcyBmaXJlZCwgcGxlYXNlIHJldmlldyB0aGUge0BsaW5rIFNjZW5lLnByb2dyZXNzfSBtZXRob2QuXG5cdFx0ICpcblx0XHQgKiBAZXZlbnQgU2Nyb2xsTWFnaWMuU2NlbmUjZW5kXG5cdFx0ICpcblx0XHQgKiBAZXhhbXBsZVxuXHRcdCAqIHNjZW5lLm9uKFwiZW5kXCIsIGZ1bmN0aW9uIChldmVudCkge1xuXHRcdCAqIFx0Y29uc29sZS5sb2coXCJIaXQgZW5kIHBvaW50IG9mIHNjZW5lLlwiKTtcblx0XHQgKiB9KTtcblx0XHQgKlxuXHRcdCAqIEBwcm9wZXJ0eSB7b2JqZWN0fSBldmVudCAtIFRoZSBldmVudCBPYmplY3QgcGFzc2VkIHRvIGVhY2ggY2FsbGJhY2tcblx0XHQgKiBAcHJvcGVydHkge3N0cmluZ30gZXZlbnQudHlwZSAtIFRoZSBuYW1lIG9mIHRoZSBldmVudFxuXHRcdCAqIEBwcm9wZXJ0eSB7U2NlbmV9IGV2ZW50LnRhcmdldCAtIFRoZSBTY2VuZSBvYmplY3QgdGhhdCB0cmlnZ2VyZWQgdGhpcyBldmVudFxuXHRcdCAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBldmVudC5wcm9ncmVzcyAtIFJlZmxlY3RzIHRoZSBjdXJyZW50IHByb2dyZXNzIG9mIHRoZSBzY2VuZVxuXHRcdCAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBldmVudC5zdGF0ZSAtIFRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBzY2VuZSBgXCJEVVJJTkdcImAgb3IgYFwiQUZURVJcImBcblx0XHQgKiBAcHJvcGVydHkge3N0cmluZ30gZXZlbnQuc2Nyb2xsRGlyZWN0aW9uIC0gSW5kaWNhdGVzIHdoaWNoIHdheSB3ZSBhcmUgc2Nyb2xsaW5nIGBcIlBBVVNFRFwiYCwgYFwiRk9SV0FSRFwiYCBvciBgXCJSRVZFUlNFXCJgXG5cdFx0ICovXG5cdFx0LyoqXG5cdFx0ICogU2NlbmUgZW50ZXIgZXZlbnQuICBcblx0XHQgKiBGaXJlcyB3aGVuZXZlciB0aGUgc2NlbmUgZW50ZXJzIHRoZSBcIkRVUklOR1wiIHN0YXRlLiAgXG5cdFx0ICogS2VlcCBpbiBtaW5kIHRoYXQgaXQgZG9lc24ndCBtYXR0ZXIgaWYgdGhlIHNjZW5lIHBsYXlzIGZvcndhcmQgb3IgYmFja3dhcmQ6IFRoaXMgZXZlbnQgYWx3YXlzIGZpcmVzIHdoZW4gdGhlIHNjZW5lIGVudGVycyBpdHMgYWN0aXZlIHNjcm9sbCB0aW1lZnJhbWUsIHJlZ2FyZGxlc3Mgb2YgdGhlIHNjcm9sbC1kaXJlY3Rpb24uXG5cdFx0ICpcblx0XHQgKiBGb3IgZGV0YWlscyBvbiB0aGlzIGV2ZW50IGFuZCB0aGUgb3JkZXIgaW4gd2hpY2ggaXQgaXMgZmlyZWQsIHBsZWFzZSByZXZpZXcgdGhlIHtAbGluayBTY2VuZS5wcm9ncmVzc30gbWV0aG9kLlxuXHRcdCAqXG5cdFx0ICogQGV2ZW50IFNjcm9sbE1hZ2ljLlNjZW5lI2VudGVyXG5cdFx0ICpcblx0XHQgKiBAZXhhbXBsZVxuXHRcdCAqIHNjZW5lLm9uKFwiZW50ZXJcIiwgZnVuY3Rpb24gKGV2ZW50KSB7XG5cdFx0ICogXHRjb25zb2xlLmxvZyhcIlNjZW5lIGVudGVyZWQuXCIpO1xuXHRcdCAqIH0pO1xuXHRcdCAqXG5cdFx0ICogQHByb3BlcnR5IHtvYmplY3R9IGV2ZW50IC0gVGhlIGV2ZW50IE9iamVjdCBwYXNzZWQgdG8gZWFjaCBjYWxsYmFja1xuXHRcdCAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBldmVudC50eXBlIC0gVGhlIG5hbWUgb2YgdGhlIGV2ZW50XG5cdFx0ICogQHByb3BlcnR5IHtTY2VuZX0gZXZlbnQudGFyZ2V0IC0gVGhlIFNjZW5lIG9iamVjdCB0aGF0IHRyaWdnZXJlZCB0aGlzIGV2ZW50XG5cdFx0ICogQHByb3BlcnR5IHtudW1iZXJ9IGV2ZW50LnByb2dyZXNzIC0gUmVmbGVjdHMgdGhlIGN1cnJlbnQgcHJvZ3Jlc3Mgb2YgdGhlIHNjZW5lXG5cdFx0ICogQHByb3BlcnR5IHtzdHJpbmd9IGV2ZW50LnN0YXRlIC0gVGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIHNjZW5lIC0gYWx3YXlzIGBcIkRVUklOR1wiYFxuXHRcdCAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBldmVudC5zY3JvbGxEaXJlY3Rpb24gLSBJbmRpY2F0ZXMgd2hpY2ggd2F5IHdlIGFyZSBzY3JvbGxpbmcgYFwiUEFVU0VEXCJgLCBgXCJGT1JXQVJEXCJgIG9yIGBcIlJFVkVSU0VcImBcblx0XHQgKi9cblx0XHQvKipcblx0XHQgKiBTY2VuZSBsZWF2ZSBldmVudC4gIFxuXHRcdCAqIEZpcmVzIHdoZW5ldmVyIHRoZSBzY2VuZSdzIHN0YXRlIGdvZXMgZnJvbSBcIkRVUklOR1wiIHRvIGVpdGhlciBcIkJFRk9SRVwiIG9yIFwiQUZURVJcIi4gIFxuXHRcdCAqIEtlZXAgaW4gbWluZCB0aGF0IGl0IGRvZXNuJ3QgbWF0dGVyIGlmIHRoZSBzY2VuZSBwbGF5cyBmb3J3YXJkIG9yIGJhY2t3YXJkOiBUaGlzIGV2ZW50IGFsd2F5cyBmaXJlcyB3aGVuIHRoZSBzY2VuZSBsZWF2ZXMgaXRzIGFjdGl2ZSBzY3JvbGwgdGltZWZyYW1lLCByZWdhcmRsZXNzIG9mIHRoZSBzY3JvbGwtZGlyZWN0aW9uLlxuXHRcdCAqXG5cdFx0ICogRm9yIGRldGFpbHMgb24gdGhpcyBldmVudCBhbmQgdGhlIG9yZGVyIGluIHdoaWNoIGl0IGlzIGZpcmVkLCBwbGVhc2UgcmV2aWV3IHRoZSB7QGxpbmsgU2NlbmUucHJvZ3Jlc3N9IG1ldGhvZC5cblx0XHQgKlxuXHRcdCAqIEBldmVudCBTY3JvbGxNYWdpYy5TY2VuZSNsZWF2ZVxuXHRcdCAqXG5cdFx0ICogQGV4YW1wbGVcblx0XHQgKiBzY2VuZS5vbihcImxlYXZlXCIsIGZ1bmN0aW9uIChldmVudCkge1xuXHRcdCAqIFx0Y29uc29sZS5sb2coXCJTY2VuZSBsZWZ0LlwiKTtcblx0XHQgKiB9KTtcblx0XHQgKlxuXHRcdCAqIEBwcm9wZXJ0eSB7b2JqZWN0fSBldmVudCAtIFRoZSBldmVudCBPYmplY3QgcGFzc2VkIHRvIGVhY2ggY2FsbGJhY2tcblx0XHQgKiBAcHJvcGVydHkge3N0cmluZ30gZXZlbnQudHlwZSAtIFRoZSBuYW1lIG9mIHRoZSBldmVudFxuXHRcdCAqIEBwcm9wZXJ0eSB7U2NlbmV9IGV2ZW50LnRhcmdldCAtIFRoZSBTY2VuZSBvYmplY3QgdGhhdCB0cmlnZ2VyZWQgdGhpcyBldmVudFxuXHRcdCAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBldmVudC5wcm9ncmVzcyAtIFJlZmxlY3RzIHRoZSBjdXJyZW50IHByb2dyZXNzIG9mIHRoZSBzY2VuZVxuXHRcdCAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBldmVudC5zdGF0ZSAtIFRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBzY2VuZSBgXCJCRUZPUkVcImAgb3IgYFwiQUZURVJcImBcblx0XHQgKiBAcHJvcGVydHkge3N0cmluZ30gZXZlbnQuc2Nyb2xsRGlyZWN0aW9uIC0gSW5kaWNhdGVzIHdoaWNoIHdheSB3ZSBhcmUgc2Nyb2xsaW5nIGBcIlBBVVNFRFwiYCwgYFwiRk9SV0FSRFwiYCBvciBgXCJSRVZFUlNFXCJgXG5cdFx0ICovXG5cdFx0LyoqXG5cdFx0ICogU2NlbmUgdXBkYXRlIGV2ZW50LiAgXG5cdFx0ICogRmlyZXMgd2hlbmV2ZXIgdGhlIHNjZW5lIGlzIHVwZGF0ZWQgKGJ1dCBub3QgbmVjZXNzYXJpbHkgY2hhbmdlcyB0aGUgcHJvZ3Jlc3MpLlxuXHRcdCAqXG5cdFx0ICogQGV2ZW50IFNjcm9sbE1hZ2ljLlNjZW5lI3VwZGF0ZVxuXHRcdCAqXG5cdFx0ICogQGV4YW1wbGVcblx0XHQgKiBzY2VuZS5vbihcInVwZGF0ZVwiLCBmdW5jdGlvbiAoZXZlbnQpIHtcblx0XHQgKiBcdGNvbnNvbGUubG9nKFwiU2NlbmUgdXBkYXRlZC5cIik7XG5cdFx0ICogfSk7XG5cdFx0ICpcblx0XHQgKiBAcHJvcGVydHkge29iamVjdH0gZXZlbnQgLSBUaGUgZXZlbnQgT2JqZWN0IHBhc3NlZCB0byBlYWNoIGNhbGxiYWNrXG5cdFx0ICogQHByb3BlcnR5IHtzdHJpbmd9IGV2ZW50LnR5cGUgLSBUaGUgbmFtZSBvZiB0aGUgZXZlbnRcblx0XHQgKiBAcHJvcGVydHkge1NjZW5lfSBldmVudC50YXJnZXQgLSBUaGUgU2NlbmUgb2JqZWN0IHRoYXQgdHJpZ2dlcmVkIHRoaXMgZXZlbnRcblx0XHQgKiBAcHJvcGVydHkge251bWJlcn0gZXZlbnQuc3RhcnRQb3MgLSBUaGUgc3RhcnRpbmcgcG9zaXRpb24gb2YgdGhlIHNjZW5lIChpbiByZWxhdGlvbiB0byB0aGUgY29uYWluZXIpXG5cdFx0ICogQHByb3BlcnR5IHtudW1iZXJ9IGV2ZW50LmVuZFBvcyAtIFRoZSBlbmRpbmcgcG9zaXRpb24gb2YgdGhlIHNjZW5lIChpbiByZWxhdGlvbiB0byB0aGUgY29uYWluZXIpXG5cdFx0ICogQHByb3BlcnR5IHtudW1iZXJ9IGV2ZW50LnNjcm9sbFBvcyAtIFRoZSBjdXJyZW50IHNjcm9sbCBwb3NpdGlvbiBvZiB0aGUgY29udGFpbmVyXG5cdFx0ICovXG5cdFx0LyoqXG5cdFx0ICogU2NlbmUgcHJvZ3Jlc3MgZXZlbnQuICBcblx0XHQgKiBGaXJlcyB3aGVuZXZlciB0aGUgcHJvZ3Jlc3Mgb2YgdGhlIHNjZW5lIGNoYW5nZXMuXG5cdFx0ICpcblx0XHQgKiBGb3IgZGV0YWlscyBvbiB0aGlzIGV2ZW50IGFuZCB0aGUgb3JkZXIgaW4gd2hpY2ggaXQgaXMgZmlyZWQsIHBsZWFzZSByZXZpZXcgdGhlIHtAbGluayBTY2VuZS5wcm9ncmVzc30gbWV0aG9kLlxuXHRcdCAqXG5cdFx0ICogQGV2ZW50IFNjcm9sbE1hZ2ljLlNjZW5lI3Byb2dyZXNzXG5cdFx0ICpcblx0XHQgKiBAZXhhbXBsZVxuXHRcdCAqIHNjZW5lLm9uKFwicHJvZ3Jlc3NcIiwgZnVuY3Rpb24gKGV2ZW50KSB7XG5cdFx0ICogXHRjb25zb2xlLmxvZyhcIlNjZW5lIHByb2dyZXNzIGNoYW5nZWQgdG8gXCIgKyBldmVudC5wcm9ncmVzcyk7XG5cdFx0ICogfSk7XG5cdFx0ICpcblx0XHQgKiBAcHJvcGVydHkge29iamVjdH0gZXZlbnQgLSBUaGUgZXZlbnQgT2JqZWN0IHBhc3NlZCB0byBlYWNoIGNhbGxiYWNrXG5cdFx0ICogQHByb3BlcnR5IHtzdHJpbmd9IGV2ZW50LnR5cGUgLSBUaGUgbmFtZSBvZiB0aGUgZXZlbnRcblx0XHQgKiBAcHJvcGVydHkge1NjZW5lfSBldmVudC50YXJnZXQgLSBUaGUgU2NlbmUgb2JqZWN0IHRoYXQgdHJpZ2dlcmVkIHRoaXMgZXZlbnRcblx0XHQgKiBAcHJvcGVydHkge251bWJlcn0gZXZlbnQucHJvZ3Jlc3MgLSBSZWZsZWN0cyB0aGUgY3VycmVudCBwcm9ncmVzcyBvZiB0aGUgc2NlbmVcblx0XHQgKiBAcHJvcGVydHkge3N0cmluZ30gZXZlbnQuc3RhdGUgLSBUaGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgc2NlbmUgYFwiQkVGT1JFXCJgLCBgXCJEVVJJTkdcImAgb3IgYFwiQUZURVJcImBcblx0XHQgKiBAcHJvcGVydHkge3N0cmluZ30gZXZlbnQuc2Nyb2xsRGlyZWN0aW9uIC0gSW5kaWNhdGVzIHdoaWNoIHdheSB3ZSBhcmUgc2Nyb2xsaW5nIGBcIlBBVVNFRFwiYCwgYFwiRk9SV0FSRFwiYCBvciBgXCJSRVZFUlNFXCJgXG5cdFx0ICovXG5cdFx0LyoqXG5cdFx0ICogU2NlbmUgY2hhbmdlIGV2ZW50LiAgXG5cdFx0ICogRmlyZXMgd2hlbnZldmVyIGEgcHJvcGVydHkgb2YgdGhlIHNjZW5lIGlzIGNoYW5nZWQuXG5cdFx0ICpcblx0XHQgKiBAZXZlbnQgU2Nyb2xsTWFnaWMuU2NlbmUjY2hhbmdlXG5cdFx0ICpcblx0XHQgKiBAZXhhbXBsZVxuXHRcdCAqIHNjZW5lLm9uKFwiY2hhbmdlXCIsIGZ1bmN0aW9uIChldmVudCkge1xuXHRcdCAqIFx0Y29uc29sZS5sb2coXCJTY2VuZSBQcm9wZXJ0eSBcXFwiXCIgKyBldmVudC53aGF0ICsgXCJcXFwiIGNoYW5nZWQgdG8gXCIgKyBldmVudC5uZXd2YWwpO1xuXHRcdCAqIH0pO1xuXHRcdCAqXG5cdFx0ICogQHByb3BlcnR5IHtvYmplY3R9IGV2ZW50IC0gVGhlIGV2ZW50IE9iamVjdCBwYXNzZWQgdG8gZWFjaCBjYWxsYmFja1xuXHRcdCAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBldmVudC50eXBlIC0gVGhlIG5hbWUgb2YgdGhlIGV2ZW50XG5cdFx0ICogQHByb3BlcnR5IHtTY2VuZX0gZXZlbnQudGFyZ2V0IC0gVGhlIFNjZW5lIG9iamVjdCB0aGF0IHRyaWdnZXJlZCB0aGlzIGV2ZW50XG5cdFx0ICogQHByb3BlcnR5IHtzdHJpbmd9IGV2ZW50LndoYXQgLSBJbmRpY2F0ZXMgd2hhdCB2YWx1ZSBoYXMgYmVlbiBjaGFuZ2VkXG5cdFx0ICogQHByb3BlcnR5IHttaXhlZH0gZXZlbnQubmV3dmFsIC0gVGhlIG5ldyB2YWx1ZSBvZiB0aGUgY2hhbmdlZCBwcm9wZXJ0eVxuXHRcdCAqL1xuXHRcdC8qKlxuXHRcdCAqIFNjZW5lIHNoaWZ0IGV2ZW50LiAgXG5cdFx0ICogRmlyZXMgd2hlbnZldmVyIHRoZSBzdGFydCBvciBlbmQgKipzY3JvbGwgb2Zmc2V0Kiogb2YgdGhlIHNjZW5lIGNoYW5nZS5cblx0XHQgKiBUaGlzIGhhcHBlbnMgZXhwbGljaXRlbHksIHdoZW4gb25lIG9mIHRoZXNlIHZhbHVlcyBjaGFuZ2U6IGBvZmZzZXRgLCBgZHVyYXRpb25gIG9yIGB0cmlnZ2VySG9va2AuXG5cdFx0ICogSXQgd2lsbCBmaXJlIGltcGxpY2l0bHkgd2hlbiB0aGUgYHRyaWdnZXJFbGVtZW50YCBjaGFuZ2VzLCBpZiB0aGUgbmV3IGVsZW1lbnQgaGFzIGEgZGlmZmVyZW50IHBvc2l0aW9uIChtb3N0IGNhc2VzKS5cblx0XHQgKiBJdCB3aWxsIGFsc28gZmlyZSBpbXBsaWNpdGx5IHdoZW4gdGhlIHNpemUgb2YgdGhlIGNvbnRhaW5lciBjaGFuZ2VzIGFuZCB0aGUgdHJpZ2dlckhvb2sgaXMgYW55dGhpbmcgb3RoZXIgdGhhbiBgb25MZWF2ZWAuXG5cdFx0ICpcblx0XHQgKiBAZXZlbnQgU2Nyb2xsTWFnaWMuU2NlbmUjc2hpZnRcblx0XHQgKiBAc2luY2UgMS4xLjBcblx0XHQgKlxuXHRcdCAqIEBleGFtcGxlXG5cdFx0ICogc2NlbmUub24oXCJzaGlmdFwiLCBmdW5jdGlvbiAoZXZlbnQpIHtcblx0XHQgKiBcdGNvbnNvbGUubG9nKFwiU2NlbmUgbW92ZWQsIGJlY2F1c2UgdGhlIFwiICsgZXZlbnQucmVhc29uICsgXCIgaGFzIGNoYW5nZWQuKVwiKTtcblx0XHQgKiB9KTtcblx0XHQgKlxuXHRcdCAqIEBwcm9wZXJ0eSB7b2JqZWN0fSBldmVudCAtIFRoZSBldmVudCBPYmplY3QgcGFzc2VkIHRvIGVhY2ggY2FsbGJhY2tcblx0XHQgKiBAcHJvcGVydHkge3N0cmluZ30gZXZlbnQudHlwZSAtIFRoZSBuYW1lIG9mIHRoZSBldmVudFxuXHRcdCAqIEBwcm9wZXJ0eSB7U2NlbmV9IGV2ZW50LnRhcmdldCAtIFRoZSBTY2VuZSBvYmplY3QgdGhhdCB0cmlnZ2VyZWQgdGhpcyBldmVudFxuXHRcdCAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBldmVudC5yZWFzb24gLSBJbmRpY2F0ZXMgd2h5IHRoZSBzY2VuZSBoYXMgc2hpZnRlZFxuXHRcdCAqL1xuXHRcdC8qKlxuXHRcdCAqIFNjZW5lIGRlc3Ryb3kgZXZlbnQuICBcblx0XHQgKiBGaXJlcyB3aGVudmV2ZXIgdGhlIHNjZW5lIGlzIGRlc3Ryb3llZC5cblx0XHQgKiBUaGlzIGNhbiBiZSB1c2VkIHRvIHRpZHkgdXAgY3VzdG9tIGJlaGF2aW91ciB1c2VkIGluIGV2ZW50cy5cblx0XHQgKlxuXHRcdCAqIEBldmVudCBTY3JvbGxNYWdpYy5TY2VuZSNkZXN0cm95XG5cdFx0ICogQHNpbmNlIDEuMS4wXG5cdFx0ICpcblx0XHQgKiBAZXhhbXBsZVxuXHRcdCAqIHNjZW5lLm9uKFwiZW50ZXJcIiwgZnVuY3Rpb24gKGV2ZW50KSB7XG5cdFx0ICogICAgICAgIC8vIGFkZCBjdXN0b20gYWN0aW9uXG5cdFx0ICogICAgICAgICQoXCIjbXktZWxlbVwiKS5sZWZ0KFwiMjAwXCIpO1xuXHRcdCAqICAgICAgfSlcblx0XHQgKiAgICAgIC5vbihcImRlc3Ryb3lcIiwgZnVuY3Rpb24gKGV2ZW50KSB7XG5cdFx0ICogICAgICAgIC8vIHJlc2V0IG15IGVsZW1lbnQgdG8gc3RhcnQgcG9zaXRpb25cblx0XHQgKiAgICAgICAgaWYgKGV2ZW50LnJlc2V0KSB7XG5cdFx0ICogICAgICAgICAgJChcIiNteS1lbGVtXCIpLmxlZnQoXCIwXCIpO1xuXHRcdCAqICAgICAgICB9XG5cdFx0ICogICAgICB9KTtcblx0XHQgKlxuXHRcdCAqIEBwcm9wZXJ0eSB7b2JqZWN0fSBldmVudCAtIFRoZSBldmVudCBPYmplY3QgcGFzc2VkIHRvIGVhY2ggY2FsbGJhY2tcblx0XHQgKiBAcHJvcGVydHkge3N0cmluZ30gZXZlbnQudHlwZSAtIFRoZSBuYW1lIG9mIHRoZSBldmVudFxuXHRcdCAqIEBwcm9wZXJ0eSB7U2NlbmV9IGV2ZW50LnRhcmdldCAtIFRoZSBTY2VuZSBvYmplY3QgdGhhdCB0cmlnZ2VyZWQgdGhpcyBldmVudFxuXHRcdCAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gZXZlbnQucmVzZXQgLSBJbmRpY2F0ZXMgaWYgdGhlIGRlc3Ryb3kgbWV0aG9kIHdhcyBjYWxsZWQgd2l0aCByZXNldCBgdHJ1ZWAgb3IgYGZhbHNlYC5cblx0XHQgKi9cblx0XHQvKipcblx0XHQgKiBTY2VuZSBhZGQgZXZlbnQuICBcblx0XHQgKiBGaXJlcyB3aGVuIHRoZSBzY2VuZSBpcyBhZGRlZCB0byBhIGNvbnRyb2xsZXIuXG5cdFx0ICogVGhpcyBpcyBtb3N0bHkgdXNlZCBieSBwbHVnaW5zIHRvIGtub3cgdGhhdCBjaGFuZ2UgbWlnaHQgYmUgZHVlLlxuXHRcdCAqXG5cdFx0ICogQGV2ZW50IFNjcm9sbE1hZ2ljLlNjZW5lI2FkZFxuXHRcdCAqIEBzaW5jZSAyLjAuMFxuXHRcdCAqXG5cdFx0ICogQGV4YW1wbGVcblx0XHQgKiBzY2VuZS5vbihcImFkZFwiLCBmdW5jdGlvbiAoZXZlbnQpIHtcblx0XHQgKiBcdGNvbnNvbGUubG9nKCdTY2VuZSB3YXMgYWRkZWQgdG8gYSBuZXcgY29udHJvbGxlci4nKTtcblx0XHQgKiB9KTtcblx0XHQgKlxuXHRcdCAqIEBwcm9wZXJ0eSB7b2JqZWN0fSBldmVudCAtIFRoZSBldmVudCBPYmplY3QgcGFzc2VkIHRvIGVhY2ggY2FsbGJhY2tcblx0XHQgKiBAcHJvcGVydHkge3N0cmluZ30gZXZlbnQudHlwZSAtIFRoZSBuYW1lIG9mIHRoZSBldmVudFxuXHRcdCAqIEBwcm9wZXJ0eSB7U2NlbmV9IGV2ZW50LnRhcmdldCAtIFRoZSBTY2VuZSBvYmplY3QgdGhhdCB0cmlnZ2VyZWQgdGhpcyBldmVudFxuXHRcdCAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gZXZlbnQuY29udHJvbGxlciAtIFRoZSBjb250cm9sbGVyIG9iamVjdCB0aGUgc2NlbmUgd2FzIGFkZGVkIHRvLlxuXHRcdCAqL1xuXHRcdC8qKlxuXHRcdCAqIFNjZW5lIHJlbW92ZSBldmVudC4gIFxuXHRcdCAqIEZpcmVzIHdoZW4gdGhlIHNjZW5lIGlzIHJlbW92ZWQgZnJvbSBhIGNvbnRyb2xsZXIuXG5cdFx0ICogVGhpcyBpcyBtb3N0bHkgdXNlZCBieSBwbHVnaW5zIHRvIGtub3cgdGhhdCBjaGFuZ2UgbWlnaHQgYmUgZHVlLlxuXHRcdCAqXG5cdFx0ICogQGV2ZW50IFNjcm9sbE1hZ2ljLlNjZW5lI3JlbW92ZVxuXHRcdCAqIEBzaW5jZSAyLjAuMFxuXHRcdCAqXG5cdFx0ICogQGV4YW1wbGVcblx0XHQgKiBzY2VuZS5vbihcInJlbW92ZVwiLCBmdW5jdGlvbiAoZXZlbnQpIHtcblx0XHQgKiBcdGNvbnNvbGUubG9nKCdTY2VuZSB3YXMgcmVtb3ZlZCBmcm9tIGl0cyBjb250cm9sbGVyLicpO1xuXHRcdCAqIH0pO1xuXHRcdCAqXG5cdFx0ICogQHByb3BlcnR5IHtvYmplY3R9IGV2ZW50IC0gVGhlIGV2ZW50IE9iamVjdCBwYXNzZWQgdG8gZWFjaCBjYWxsYmFja1xuXHRcdCAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBldmVudC50eXBlIC0gVGhlIG5hbWUgb2YgdGhlIGV2ZW50XG5cdFx0ICogQHByb3BlcnR5IHtTY2VuZX0gZXZlbnQudGFyZ2V0IC0gVGhlIFNjZW5lIG9iamVjdCB0aGF0IHRyaWdnZXJlZCB0aGlzIGV2ZW50XG5cdFx0ICovXG5cblx0XHQvKipcblx0XHQgKiBBZGQgb25lIG9yZSBtb3JlIGV2ZW50IGxpc3RlbmVyLiAgXG5cdFx0ICogVGhlIGNhbGxiYWNrIGZ1bmN0aW9uIHdpbGwgYmUgZmlyZWQgYXQgdGhlIHJlc3BlY3RpdmUgZXZlbnQsIGFuZCBhbiBvYmplY3QgY29udGFpbmluZyByZWxldmFudCBkYXRhIHdpbGwgYmUgcGFzc2VkIHRvIHRoZSBjYWxsYmFjay5cblx0XHQgKiBAbWV0aG9kIFNjcm9sbE1hZ2ljLlNjZW5lI29uXG5cdFx0ICpcblx0XHQgKiBAZXhhbXBsZVxuXHRcdCAqIGZ1bmN0aW9uIGNhbGxiYWNrIChldmVudCkge1xuXHRcdCAqIFx0XHRjb25zb2xlLmxvZyhcIkV2ZW50IGZpcmVkISAoXCIgKyBldmVudC50eXBlICsgXCIpXCIpO1xuXHRcdCAqIH1cblx0XHQgKiAvLyBhZGQgbGlzdGVuZXJzXG5cdFx0ICogc2NlbmUub24oXCJjaGFuZ2UgdXBkYXRlIHByb2dyZXNzIHN0YXJ0IGVuZCBlbnRlciBsZWF2ZVwiLCBjYWxsYmFjayk7XG5cdFx0ICpcblx0XHQgKiBAcGFyYW0ge3N0cmluZ30gbmFtZXMgLSBUaGUgbmFtZSBvciBuYW1lcyBvZiB0aGUgZXZlbnQgdGhlIGNhbGxiYWNrIHNob3VsZCBiZSBhdHRhY2hlZCB0by5cblx0XHQgKiBAcGFyYW0ge2Z1bmN0aW9ufSBjYWxsYmFjayAtIEEgZnVuY3Rpb24gdGhhdCBzaG91bGQgYmUgZXhlY3V0ZWQsIHdoZW4gdGhlIGV2ZW50IGlzIGRpc3BhdGNoZWQuIEFuIGV2ZW50IG9iamVjdCB3aWxsIGJlIHBhc3NlZCB0byB0aGUgY2FsbGJhY2suXG5cdFx0ICogQHJldHVybnMge1NjZW5lfSBQYXJlbnQgb2JqZWN0IGZvciBjaGFpbmluZy5cblx0XHQgKi9cblx0XHR0aGlzLm9uID0gZnVuY3Rpb24gKG5hbWVzLCBjYWxsYmFjaykge1xuXHRcdFx0aWYgKF91dGlsLnR5cGUuRnVuY3Rpb24oY2FsbGJhY2spKSB7XG5cdFx0XHRcdG5hbWVzID0gbmFtZXMudHJpbSgpLnNwbGl0KCcgJyk7XG5cdFx0XHRcdG5hbWVzLmZvckVhY2goZnVuY3Rpb24gKGZ1bGxuYW1lKSB7XG5cdFx0XHRcdFx0dmFyXG5cdFx0XHRcdFx0bmFtZXBhcnRzID0gZnVsbG5hbWUuc3BsaXQoJy4nKSxcblx0XHRcdFx0XHRcdGV2ZW50bmFtZSA9IG5hbWVwYXJ0c1swXSxcblx0XHRcdFx0XHRcdG5hbWVzcGFjZSA9IG5hbWVwYXJ0c1sxXTtcblx0XHRcdFx0XHRpZiAoZXZlbnRuYW1lICE9IFwiKlwiKSB7IC8vIGRpc2FsbG93IHdpbGRjYXJkc1xuXHRcdFx0XHRcdFx0aWYgKCFfbGlzdGVuZXJzW2V2ZW50bmFtZV0pIHtcblx0XHRcdFx0XHRcdFx0X2xpc3RlbmVyc1tldmVudG5hbWVdID0gW107XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRfbGlzdGVuZXJzW2V2ZW50bmFtZV0ucHVzaCh7XG5cdFx0XHRcdFx0XHRcdG5hbWVzcGFjZTogbmFtZXNwYWNlIHx8ICcnLFxuXHRcdFx0XHRcdFx0XHRjYWxsYmFjazogY2FsbGJhY2tcblx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRsb2coMSwgXCJFUlJPUiB3aGVuIGNhbGxpbmcgJy5vbigpJzogU3VwcGxpZWQgY2FsbGJhY2sgZm9yICdcIiArIG5hbWVzICsgXCInIGlzIG5vdCBhIHZhbGlkIGZ1bmN0aW9uIVwiKTtcblx0XHRcdH1cblx0XHRcdHJldHVybiBTY2VuZTtcblx0XHR9O1xuXG5cdFx0LyoqXG5cdFx0ICogUmVtb3ZlIG9uZSBvciBtb3JlIGV2ZW50IGxpc3RlbmVyLlxuXHRcdCAqIEBtZXRob2QgU2Nyb2xsTWFnaWMuU2NlbmUjb2ZmXG5cdFx0ICpcblx0XHQgKiBAZXhhbXBsZVxuXHRcdCAqIGZ1bmN0aW9uIGNhbGxiYWNrIChldmVudCkge1xuXHRcdCAqIFx0XHRjb25zb2xlLmxvZyhcIkV2ZW50IGZpcmVkISAoXCIgKyBldmVudC50eXBlICsgXCIpXCIpO1xuXHRcdCAqIH1cblx0XHQgKiAvLyBhZGQgbGlzdGVuZXJzXG5cdFx0ICogc2NlbmUub24oXCJjaGFuZ2UgdXBkYXRlXCIsIGNhbGxiYWNrKTtcblx0XHQgKiAvLyByZW1vdmUgbGlzdGVuZXJzXG5cdFx0ICogc2NlbmUub2ZmKFwiY2hhbmdlIHVwZGF0ZVwiLCBjYWxsYmFjayk7XG5cdFx0ICpcblx0XHQgKiBAcGFyYW0ge3N0cmluZ30gbmFtZXMgLSBUaGUgbmFtZSBvciBuYW1lcyBvZiB0aGUgZXZlbnQgdGhhdCBzaG91bGQgYmUgcmVtb3ZlZC5cblx0XHQgKiBAcGFyYW0ge2Z1bmN0aW9ufSBbY2FsbGJhY2tdIC0gQSBzcGVjaWZpYyBjYWxsYmFjayBmdW5jdGlvbiB0aGF0IHNob3VsZCBiZSByZW1vdmVkLiBJZiBub25lIGlzIHBhc3NlZCBhbGwgY2FsbGJhY2tzIHRvIHRoZSBldmVudCBsaXN0ZW5lciB3aWxsIGJlIHJlbW92ZWQuXG5cdFx0ICogQHJldHVybnMge1NjZW5lfSBQYXJlbnQgb2JqZWN0IGZvciBjaGFpbmluZy5cblx0XHQgKi9cblx0XHR0aGlzLm9mZiA9IGZ1bmN0aW9uIChuYW1lcywgY2FsbGJhY2spIHtcblx0XHRcdGlmICghbmFtZXMpIHtcblx0XHRcdFx0bG9nKDEsIFwiRVJST1I6IEludmFsaWQgZXZlbnQgbmFtZSBzdXBwbGllZC5cIik7XG5cdFx0XHRcdHJldHVybiBTY2VuZTtcblx0XHRcdH1cblx0XHRcdG5hbWVzID0gbmFtZXMudHJpbSgpLnNwbGl0KCcgJyk7XG5cdFx0XHRuYW1lcy5mb3JFYWNoKGZ1bmN0aW9uIChmdWxsbmFtZSwga2V5KSB7XG5cdFx0XHRcdHZhclxuXHRcdFx0XHRuYW1lcGFydHMgPSBmdWxsbmFtZS5zcGxpdCgnLicpLFxuXHRcdFx0XHRcdGV2ZW50bmFtZSA9IG5hbWVwYXJ0c1swXSxcblx0XHRcdFx0XHRuYW1lc3BhY2UgPSBuYW1lcGFydHNbMV0gfHwgJycsXG5cdFx0XHRcdFx0cmVtb3ZlTGlzdCA9IGV2ZW50bmFtZSA9PT0gJyonID8gT2JqZWN0LmtleXMoX2xpc3RlbmVycykgOiBbZXZlbnRuYW1lXTtcblx0XHRcdFx0cmVtb3ZlTGlzdC5mb3JFYWNoKGZ1bmN0aW9uIChyZW1vdmUpIHtcblx0XHRcdFx0XHR2YXJcblx0XHRcdFx0XHRsaXN0ID0gX2xpc3RlbmVyc1tyZW1vdmVdIHx8IFtdLFxuXHRcdFx0XHRcdFx0aSA9IGxpc3QubGVuZ3RoO1xuXHRcdFx0XHRcdHdoaWxlIChpLS0pIHtcblx0XHRcdFx0XHRcdHZhciBsaXN0ZW5lciA9IGxpc3RbaV07XG5cdFx0XHRcdFx0XHRpZiAobGlzdGVuZXIgJiYgKG5hbWVzcGFjZSA9PT0gbGlzdGVuZXIubmFtZXNwYWNlIHx8IG5hbWVzcGFjZSA9PT0gJyonKSAmJiAoIWNhbGxiYWNrIHx8IGNhbGxiYWNrID09IGxpc3RlbmVyLmNhbGxiYWNrKSkge1xuXHRcdFx0XHRcdFx0XHRsaXN0LnNwbGljZShpLCAxKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0aWYgKCFsaXN0Lmxlbmd0aCkge1xuXHRcdFx0XHRcdFx0ZGVsZXRlIF9saXN0ZW5lcnNbcmVtb3ZlXTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pO1xuXHRcdFx0fSk7XG5cdFx0XHRyZXR1cm4gU2NlbmU7XG5cdFx0fTtcblxuXHRcdC8qKlxuXHRcdCAqIFRyaWdnZXIgYW4gZXZlbnQuXG5cdFx0ICogQG1ldGhvZCBTY3JvbGxNYWdpYy5TY2VuZSN0cmlnZ2VyXG5cdFx0ICpcblx0XHQgKiBAZXhhbXBsZVxuXHRcdCAqIHRoaXMudHJpZ2dlcihcImNoYW5nZVwiKTtcblx0XHQgKlxuXHRcdCAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gVGhlIG5hbWUgb2YgdGhlIGV2ZW50IHRoYXQgc2hvdWxkIGJlIHRyaWdnZXJlZC5cblx0XHQgKiBAcGFyYW0ge29iamVjdH0gW3ZhcnNdIC0gQW4gb2JqZWN0IGNvbnRhaW5pbmcgaW5mbyB0aGF0IHNob3VsZCBiZSBwYXNzZWQgdG8gdGhlIGNhbGxiYWNrLlxuXHRcdCAqIEByZXR1cm5zIHtTY2VuZX0gUGFyZW50IG9iamVjdCBmb3IgY2hhaW5pbmcuXG5cdFx0ICovXG5cdFx0dGhpcy50cmlnZ2VyID0gZnVuY3Rpb24gKG5hbWUsIHZhcnMpIHtcblx0XHRcdGlmIChuYW1lKSB7XG5cdFx0XHRcdHZhclxuXHRcdFx0XHRuYW1lcGFydHMgPSBuYW1lLnRyaW0oKS5zcGxpdCgnLicpLFxuXHRcdFx0XHRcdGV2ZW50bmFtZSA9IG5hbWVwYXJ0c1swXSxcblx0XHRcdFx0XHRuYW1lc3BhY2UgPSBuYW1lcGFydHNbMV0sXG5cdFx0XHRcdFx0bGlzdGVuZXJzID0gX2xpc3RlbmVyc1tldmVudG5hbWVdO1xuXHRcdFx0XHRsb2coMywgJ2V2ZW50IGZpcmVkOicsIGV2ZW50bmFtZSwgdmFycyA/IFwiLT5cIiA6ICcnLCB2YXJzIHx8ICcnKTtcblx0XHRcdFx0aWYgKGxpc3RlbmVycykge1xuXHRcdFx0XHRcdGxpc3RlbmVycy5mb3JFYWNoKGZ1bmN0aW9uIChsaXN0ZW5lciwga2V5KSB7XG5cdFx0XHRcdFx0XHRpZiAoIW5hbWVzcGFjZSB8fCBuYW1lc3BhY2UgPT09IGxpc3RlbmVyLm5hbWVzcGFjZSkge1xuXHRcdFx0XHRcdFx0XHRsaXN0ZW5lci5jYWxsYmFjay5jYWxsKFNjZW5lLCBuZXcgU2Nyb2xsTWFnaWMuRXZlbnQoZXZlbnRuYW1lLCBsaXN0ZW5lci5uYW1lc3BhY2UsIFNjZW5lLCB2YXJzKSk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGxvZygxLCBcIkVSUk9SOiBJbnZhbGlkIGV2ZW50IG5hbWUgc3VwcGxpZWQuXCIpO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIFNjZW5lO1xuXHRcdH07XG5cblx0XHQvLyBzZXQgZXZlbnQgbGlzdGVuZXJzXG5cdFx0U2NlbmUub24oXCJjaGFuZ2UuaW50ZXJuYWxcIiwgZnVuY3Rpb24gKGUpIHtcblx0XHRcdGlmIChlLndoYXQgIT09IFwibG9nbGV2ZWxcIiAmJiBlLndoYXQgIT09IFwidHdlZW5DaGFuZ2VzXCIpIHsgLy8gbm8gbmVlZCBmb3IgYSBzY2VuZSB1cGRhdGUgc2NlbmUgd2l0aCB0aGVzZSBvcHRpb25zLi4uXG5cdFx0XHRcdGlmIChlLndoYXQgPT09IFwidHJpZ2dlckVsZW1lbnRcIikge1xuXHRcdFx0XHRcdHVwZGF0ZVRyaWdnZXJFbGVtZW50UG9zaXRpb24oKTtcblx0XHRcdFx0fSBlbHNlIGlmIChlLndoYXQgPT09IFwicmV2ZXJzZVwiKSB7IC8vIHRoZSBvbmx5IHByb3BlcnR5IGxlZnQgdGhhdCBtYXkgaGF2ZSBhbiBpbXBhY3Qgb24gdGhlIGN1cnJlbnQgc2NlbmUgc3RhdGUuIEV2ZXJ5dGhpbmcgZWxzZSBpcyBoYW5kbGVkIGJ5IHRoZSBzaGlmdCBldmVudC5cblx0XHRcdFx0XHRTY2VuZS51cGRhdGUoKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0pLm9uKFwic2hpZnQuaW50ZXJuYWxcIiwgZnVuY3Rpb24gKGUpIHtcblx0XHRcdHVwZGF0ZVNjcm9sbE9mZnNldCgpO1xuXHRcdFx0U2NlbmUudXBkYXRlKCk7IC8vIHVwZGF0ZSBzY2VuZSB0byByZWZsZWN0IG5ldyBwb3NpdGlvblxuXHRcdH0pO1xuXG5cdFx0LyoqXG5cdFx0ICogU2VuZCBhIGRlYnVnIG1lc3NhZ2UgdG8gdGhlIGNvbnNvbGUuXG5cdFx0ICogQHByaXZhdGVcblx0XHQgKiBidXQgcHJvdmlkZWQgcHVibGljbHkgd2l0aCBfbG9nIGZvciBwbHVnaW5zXG5cdFx0ICpcblx0XHQgKiBAcGFyYW0ge251bWJlcn0gbG9nbGV2ZWwgLSBUaGUgbG9nbGV2ZWwgcmVxdWlyZWQgdG8gaW5pdGlhdGUgb3V0cHV0IGZvciB0aGUgbWVzc2FnZS5cblx0XHQgKiBAcGFyYW0gey4uLm1peGVkfSBvdXRwdXQgLSBPbmUgb3IgbW9yZSB2YXJpYWJsZXMgdGhhdCBzaG91bGQgYmUgcGFzc2VkIHRvIHRoZSBjb25zb2xlLlxuXHRcdCAqL1xuXHRcdHZhciBsb2cgPSB0aGlzLl9sb2cgPSBmdW5jdGlvbiAobG9nbGV2ZWwsIG91dHB1dCkge1xuXHRcdFx0aWYgKF9vcHRpb25zLmxvZ2xldmVsID49IGxvZ2xldmVsKSB7XG5cdFx0XHRcdEFycmF5LnByb3RvdHlwZS5zcGxpY2UuY2FsbChhcmd1bWVudHMsIDEsIDAsIFwiKFwiICsgTkFNRVNQQUNFICsgXCIpIC0+XCIpO1xuXHRcdFx0XHRfdXRpbC5sb2cuYXBwbHkod2luZG93LCBhcmd1bWVudHMpO1xuXHRcdFx0fVxuXHRcdH07XG5cblx0XHQvKipcblx0XHQgKiBBZGQgdGhlIHNjZW5lIHRvIGEgY29udHJvbGxlci4gIFxuXHRcdCAqIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgdG8gYENvbnRyb2xsZXIuYWRkU2NlbmUoc2NlbmUpYC5cblx0XHQgKiBAbWV0aG9kIFNjcm9sbE1hZ2ljLlNjZW5lI2FkZFRvXG5cdFx0ICpcblx0XHQgKiBAZXhhbXBsZVxuXHRcdCAqIC8vIGFkZCBhIHNjZW5lIHRvIGEgU2Nyb2xsTWFnaWMgQ29udHJvbGxlclxuXHRcdCAqIHNjZW5lLmFkZFRvKGNvbnRyb2xsZXIpO1xuXHRcdCAqXG5cdFx0ICogQHBhcmFtIHtTY3JvbGxNYWdpYy5Db250cm9sbGVyfSBjb250cm9sbGVyIC0gVGhlIGNvbnRyb2xsZXIgdG8gd2hpY2ggdGhlIHNjZW5lIHNob3VsZCBiZSBhZGRlZC5cblx0XHQgKiBAcmV0dXJucyB7U2NlbmV9IFBhcmVudCBvYmplY3QgZm9yIGNoYWluaW5nLlxuXHRcdCAqL1xuXHRcdHRoaXMuYWRkVG8gPSBmdW5jdGlvbiAoY29udHJvbGxlcikge1xuXHRcdFx0aWYgKCEoY29udHJvbGxlciBpbnN0YW5jZW9mIFNjcm9sbE1hZ2ljLkNvbnRyb2xsZXIpKSB7XG5cdFx0XHRcdGxvZygxLCBcIkVSUk9SOiBzdXBwbGllZCBhcmd1bWVudCBvZiAnYWRkVG8oKScgaXMgbm90IGEgdmFsaWQgU2Nyb2xsTWFnaWMgQ29udHJvbGxlclwiKTtcblx0XHRcdH0gZWxzZSBpZiAoX2NvbnRyb2xsZXIgIT0gY29udHJvbGxlcikge1xuXHRcdFx0XHQvLyBuZXcgY29udHJvbGxlclxuXHRcdFx0XHRpZiAoX2NvbnRyb2xsZXIpIHsgLy8gd2FzIGFzc29jaWF0ZWQgdG8gYSBkaWZmZXJlbnQgY29udHJvbGxlciBiZWZvcmUsIHNvIHJlbW92ZSBpdC4uLlxuXHRcdFx0XHRcdF9jb250cm9sbGVyLnJlbW92ZVNjZW5lKFNjZW5lKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRfY29udHJvbGxlciA9IGNvbnRyb2xsZXI7XG5cdFx0XHRcdHZhbGlkYXRlT3B0aW9uKCk7XG5cdFx0XHRcdHVwZGF0ZUR1cmF0aW9uKHRydWUpO1xuXHRcdFx0XHR1cGRhdGVUcmlnZ2VyRWxlbWVudFBvc2l0aW9uKHRydWUpO1xuXHRcdFx0XHR1cGRhdGVTY3JvbGxPZmZzZXQoKTtcblx0XHRcdFx0X2NvbnRyb2xsZXIuaW5mbyhcImNvbnRhaW5lclwiKS5hZGRFdmVudExpc3RlbmVyKCdyZXNpemUnLCBvbkNvbnRhaW5lclJlc2l6ZSk7XG5cdFx0XHRcdGNvbnRyb2xsZXIuYWRkU2NlbmUoU2NlbmUpO1xuXHRcdFx0XHRTY2VuZS50cmlnZ2VyKFwiYWRkXCIsIHtcblx0XHRcdFx0XHRjb250cm9sbGVyOiBfY29udHJvbGxlclxuXHRcdFx0XHR9KTtcblx0XHRcdFx0bG9nKDMsIFwiYWRkZWQgXCIgKyBOQU1FU1BBQ0UgKyBcIiB0byBjb250cm9sbGVyXCIpO1xuXHRcdFx0XHRTY2VuZS51cGRhdGUoKTtcblx0XHRcdH1cblx0XHRcdHJldHVybiBTY2VuZTtcblx0XHR9O1xuXG5cdFx0LyoqXG5cdFx0ICogKipHZXQqKiBvciAqKlNldCoqIHRoZSBjdXJyZW50IGVuYWJsZWQgc3RhdGUgb2YgdGhlIHNjZW5lLiAgXG5cdFx0ICogVGhpcyBjYW4gYmUgdXNlZCB0byBkaXNhYmxlIHRoaXMgc2NlbmUgd2l0aG91dCByZW1vdmluZyBvciBkZXN0cm95aW5nIGl0LlxuXHRcdCAqIEBtZXRob2QgU2Nyb2xsTWFnaWMuU2NlbmUjZW5hYmxlZFxuXHRcdCAqXG5cdFx0ICogQGV4YW1wbGVcblx0XHQgKiAvLyBnZXQgdGhlIGN1cnJlbnQgdmFsdWVcblx0XHQgKiB2YXIgZW5hYmxlZCA9IHNjZW5lLmVuYWJsZWQoKTtcblx0XHQgKlxuXHRcdCAqIC8vIGRpc2FibGUgdGhlIHNjZW5lXG5cdFx0ICogc2NlbmUuZW5hYmxlZChmYWxzZSk7XG5cdFx0ICpcblx0XHQgKiBAcGFyYW0ge2Jvb2xlYW59IFtuZXdTdGF0ZV0gLSBUaGUgbmV3IGVuYWJsZWQgc3RhdGUgb2YgdGhlIHNjZW5lIGB0cnVlYCBvciBgZmFsc2VgLlxuXHRcdCAqIEByZXR1cm5zIHsoYm9vbGVhbnxTY2VuZSl9IEN1cnJlbnQgZW5hYmxlZCBzdGF0ZSBvciBwYXJlbnQgb2JqZWN0IGZvciBjaGFpbmluZy5cblx0XHQgKi9cblx0XHR0aGlzLmVuYWJsZWQgPSBmdW5jdGlvbiAobmV3U3RhdGUpIHtcblx0XHRcdGlmICghYXJndW1lbnRzLmxlbmd0aCkgeyAvLyBnZXRcblx0XHRcdFx0cmV0dXJuIF9lbmFibGVkO1xuXHRcdFx0fSBlbHNlIGlmIChfZW5hYmxlZCAhPSBuZXdTdGF0ZSkgeyAvLyBzZXRcblx0XHRcdFx0X2VuYWJsZWQgPSAhISBuZXdTdGF0ZTtcblx0XHRcdFx0U2NlbmUudXBkYXRlKHRydWUpO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIFNjZW5lO1xuXHRcdH07XG5cblx0XHQvKipcblx0XHQgKiBSZW1vdmUgdGhlIHNjZW5lIGZyb20gdGhlIGNvbnRyb2xsZXIuICBcblx0XHQgKiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IHRvIGBDb250cm9sbGVyLnJlbW92ZVNjZW5lKHNjZW5lKWAuXG5cdFx0ICogVGhlIHNjZW5lIHdpbGwgbm90IGJlIHVwZGF0ZWQgYW55bW9yZSB1bnRpbCB5b3UgcmVhZGQgaXQgdG8gYSBjb250cm9sbGVyLlxuXHRcdCAqIFRvIHJlbW92ZSB0aGUgcGluIG9yIHRoZSB0d2VlbiB5b3UgbmVlZCB0byBjYWxsIHJlbW92ZVR3ZWVuKCkgb3IgcmVtb3ZlUGluKCkgcmVzcGVjdGl2ZWx5LlxuXHRcdCAqIEBtZXRob2QgU2Nyb2xsTWFnaWMuU2NlbmUjcmVtb3ZlXG5cdFx0ICogQGV4YW1wbGVcblx0XHQgKiAvLyByZW1vdmUgdGhlIHNjZW5lIGZyb20gaXRzIGNvbnRyb2xsZXJcblx0XHQgKiBzY2VuZS5yZW1vdmUoKTtcblx0XHQgKlxuXHRcdCAqIEByZXR1cm5zIHtTY2VuZX0gUGFyZW50IG9iamVjdCBmb3IgY2hhaW5pbmcuXG5cdFx0ICovXG5cdFx0dGhpcy5yZW1vdmUgPSBmdW5jdGlvbiAoKSB7XG5cdFx0XHRpZiAoX2NvbnRyb2xsZXIpIHtcblx0XHRcdFx0X2NvbnRyb2xsZXIuaW5mbyhcImNvbnRhaW5lclwiKS5yZW1vdmVFdmVudExpc3RlbmVyKCdyZXNpemUnLCBvbkNvbnRhaW5lclJlc2l6ZSk7XG5cdFx0XHRcdHZhciB0bXBQYXJlbnQgPSBfY29udHJvbGxlcjtcblx0XHRcdFx0X2NvbnRyb2xsZXIgPSB1bmRlZmluZWQ7XG5cdFx0XHRcdHRtcFBhcmVudC5yZW1vdmVTY2VuZShTY2VuZSk7XG5cdFx0XHRcdFNjZW5lLnRyaWdnZXIoXCJyZW1vdmVcIik7XG5cdFx0XHRcdGxvZygzLCBcInJlbW92ZWQgXCIgKyBOQU1FU1BBQ0UgKyBcIiBmcm9tIGNvbnRyb2xsZXJcIik7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gU2NlbmU7XG5cdFx0fTtcblxuXHRcdC8qKlxuXHRcdCAqIERlc3Ryb3kgdGhlIHNjZW5lIGFuZCBldmVyeXRoaW5nLlxuXHRcdCAqIEBtZXRob2QgU2Nyb2xsTWFnaWMuU2NlbmUjZGVzdHJveVxuXHRcdCAqIEBleGFtcGxlXG5cdFx0ICogLy8gZGVzdHJveSB0aGUgc2NlbmUgd2l0aG91dCByZXNldHRpbmcgdGhlIHBpbiBhbmQgdHdlZW4gdG8gdGhlaXIgaW5pdGlhbCBwb3NpdGlvbnNcblx0XHQgKiBzY2VuZSA9IHNjZW5lLmRlc3Ryb3koKTtcblx0XHQgKlxuXHRcdCAqIC8vIGRlc3Ryb3kgdGhlIHNjZW5lIGFuZCByZXNldCB0aGUgcGluIGFuZCB0d2VlblxuXHRcdCAqIHNjZW5lID0gc2NlbmUuZGVzdHJveSh0cnVlKTtcblx0XHQgKlxuXHRcdCAqIEBwYXJhbSB7Ym9vbGVhbn0gW3Jlc2V0PWZhbHNlXSAtIElmIGB0cnVlYCB0aGUgcGluIGFuZCB0d2VlbiAoaWYgZXhpc3RlbnQpIHdpbGwgYmUgcmVzZXQuXG5cdFx0ICogQHJldHVybnMge251bGx9IE51bGwgdG8gdW5zZXQgaGFuZGxlciB2YXJpYWJsZXMuXG5cdFx0ICovXG5cdFx0dGhpcy5kZXN0cm95ID0gZnVuY3Rpb24gKHJlc2V0KSB7XG5cdFx0XHRTY2VuZS50cmlnZ2VyKFwiZGVzdHJveVwiLCB7XG5cdFx0XHRcdHJlc2V0OiByZXNldFxuXHRcdFx0fSk7XG5cdFx0XHRTY2VuZS5yZW1vdmUoKTtcblx0XHRcdFNjZW5lLm9mZihcIiouKlwiKTtcblx0XHRcdGxvZygzLCBcImRlc3Ryb3llZCBcIiArIE5BTUVTUEFDRSArIFwiIChyZXNldDogXCIgKyAocmVzZXQgPyBcInRydWVcIiA6IFwiZmFsc2VcIikgKyBcIilcIik7XG5cdFx0XHRyZXR1cm4gbnVsbDtcblx0XHR9O1xuXG5cblx0XHQvKipcblx0XHQgKiBVcGRhdGVzIHRoZSBTY2VuZSB0byByZWZsZWN0IHRoZSBjdXJyZW50IHN0YXRlLiAgXG5cdFx0ICogVGhpcyBpcyB0aGUgZXF1aXZhbGVudCB0byBgQ29udHJvbGxlci51cGRhdGVTY2VuZShzY2VuZSwgaW1tZWRpYXRlbHkpYC4gIFxuXHRcdCAqIFRoZSB1cGRhdGUgbWV0aG9kIGNhbGN1bGF0ZXMgdGhlIHNjZW5lJ3Mgc3RhcnQgYW5kIGVuZCBwb3NpdGlvbiAoYmFzZWQgb24gdGhlIHRyaWdnZXIgZWxlbWVudCwgdHJpZ2dlciBob29rLCBkdXJhdGlvbiBhbmQgb2Zmc2V0KSBhbmQgY2hlY2tzIGl0IGFnYWluc3QgdGhlIGN1cnJlbnQgc2Nyb2xsIHBvc2l0aW9uIG9mIHRoZSBjb250YWluZXIuICBcblx0XHQgKiBJdCB0aGVuIHVwZGF0ZXMgdGhlIGN1cnJlbnQgc2NlbmUgc3RhdGUgYWNjb3JkaW5nbHkgKG9yIGRvZXMgbm90aGluZywgaWYgdGhlIHN0YXRlIGlzIGFscmVhZHkgY29ycmVjdCkg4oCTIFBpbnMgd2lsbCBiZSBzZXQgdG8gdGhlaXIgY29ycmVjdCBwb3NpdGlvbiBhbmQgdHdlZW5zIHdpbGwgYmUgdXBkYXRlZCB0byB0aGVpciBjb3JyZWN0IHByb2dyZXNzLlxuXHRcdCAqIFRoaXMgbWVhbnMgYW4gdXBkYXRlIGRvZXNuJ3QgbmVjZXNzYXJpbHkgcmVzdWx0IGluIGEgcHJvZ3Jlc3MgY2hhbmdlLiBUaGUgYHByb2dyZXNzYCBldmVudCB3aWxsIGJlIGZpcmVkIGlmIHRoZSBwcm9ncmVzcyBoYXMgaW5kZWVkIGNoYW5nZWQgYmV0d2VlbiB0aGlzIHVwZGF0ZSBhbmQgdGhlIGxhc3QuICBcblx0XHQgKiBfKipOT1RFOioqIFRoaXMgbWV0aG9kIGdldHMgY2FsbGVkIGNvbnN0YW50bHkgd2hlbmV2ZXIgU2Nyb2xsTWFnaWMgZGV0ZWN0cyBhIGNoYW5nZS4gVGhlIG9ubHkgYXBwbGljYXRpb24gZm9yIHlvdSBpcyBpZiB5b3UgY2hhbmdlIHNvbWV0aGluZyBvdXRzaWRlIG9mIHRoZSByZWFsbSBvZiBTY3JvbGxNYWdpYywgbGlrZSBtb3ZpbmcgdGhlIHRyaWdnZXIgb3IgY2hhbmdpbmcgdHdlZW4gcGFyYW1ldGVycy5fXG5cdFx0ICogQG1ldGhvZCBTY3JvbGxNYWdpYy5TY2VuZSN1cGRhdGVcblx0XHQgKiBAZXhhbXBsZVxuXHRcdCAqIC8vIHVwZGF0ZSB0aGUgc2NlbmUgb24gbmV4dCB0aWNrXG5cdFx0ICogc2NlbmUudXBkYXRlKCk7XG5cdFx0ICpcblx0XHQgKiAvLyB1cGRhdGUgdGhlIHNjZW5lIGltbWVkaWF0ZWx5XG5cdFx0ICogc2NlbmUudXBkYXRlKHRydWUpO1xuXHRcdCAqXG5cdFx0ICogQGZpcmVzIFNjZW5lLnVwZGF0ZVxuXHRcdCAqXG5cdFx0ICogQHBhcmFtIHtib29sZWFufSBbaW1tZWRpYXRlbHk9ZmFsc2VdIC0gSWYgYHRydWVgIHRoZSB1cGRhdGUgd2lsbCBiZSBpbnN0YW50LCBpZiBgZmFsc2VgIGl0IHdpbGwgd2FpdCB1bnRpbCBuZXh0IHVwZGF0ZSBjeWNsZSAoYmV0dGVyIHBlcmZvcm1hbmNlKS5cblx0XHQgKiBAcmV0dXJucyB7U2NlbmV9IFBhcmVudCBvYmplY3QgZm9yIGNoYWluaW5nLlxuXHRcdCAqL1xuXHRcdHRoaXMudXBkYXRlID0gZnVuY3Rpb24gKGltbWVkaWF0ZWx5KSB7XG5cdFx0XHRpZiAoX2NvbnRyb2xsZXIpIHtcblx0XHRcdFx0aWYgKGltbWVkaWF0ZWx5KSB7XG5cdFx0XHRcdFx0aWYgKF9jb250cm9sbGVyLmVuYWJsZWQoKSAmJiBfZW5hYmxlZCkge1xuXHRcdFx0XHRcdFx0dmFyXG5cdFx0XHRcdFx0XHRzY3JvbGxQb3MgPSBfY29udHJvbGxlci5pbmZvKFwic2Nyb2xsUG9zXCIpLFxuXHRcdFx0XHRcdFx0XHRuZXdQcm9ncmVzcztcblxuXHRcdFx0XHRcdFx0aWYgKF9vcHRpb25zLmR1cmF0aW9uID4gMCkge1xuXHRcdFx0XHRcdFx0XHRuZXdQcm9ncmVzcyA9IChzY3JvbGxQb3MgLSBfc2Nyb2xsT2Zmc2V0LnN0YXJ0KSAvIChfc2Nyb2xsT2Zmc2V0LmVuZCAtIF9zY3JvbGxPZmZzZXQuc3RhcnQpO1xuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0bmV3UHJvZ3Jlc3MgPSBzY3JvbGxQb3MgPj0gX3Njcm9sbE9mZnNldC5zdGFydCA/IDEgOiAwO1xuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRTY2VuZS50cmlnZ2VyKFwidXBkYXRlXCIsIHtcblx0XHRcdFx0XHRcdFx0c3RhcnRQb3M6IF9zY3JvbGxPZmZzZXQuc3RhcnQsXG5cdFx0XHRcdFx0XHRcdGVuZFBvczogX3Njcm9sbE9mZnNldC5lbmQsXG5cdFx0XHRcdFx0XHRcdHNjcm9sbFBvczogc2Nyb2xsUG9zXG5cdFx0XHRcdFx0XHR9KTtcblxuXHRcdFx0XHRcdFx0U2NlbmUucHJvZ3Jlc3MobmV3UHJvZ3Jlc3MpO1xuXHRcdFx0XHRcdH0gZWxzZSBpZiAoX3BpbiAmJiBfc3RhdGUgPT09IFNDRU5FX1NUQVRFX0RVUklORykge1xuXHRcdFx0XHRcdFx0dXBkYXRlUGluU3RhdGUodHJ1ZSk7IC8vIHVucGluIGluIHBvc2l0aW9uXG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdF9jb250cm9sbGVyLnVwZGF0ZVNjZW5lKFNjZW5lLCBmYWxzZSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdHJldHVybiBTY2VuZTtcblx0XHR9O1xuXG5cdFx0LyoqXG5cdFx0ICogVXBkYXRlcyBkeW5hbWljIHNjZW5lIHZhcmlhYmxlcyBsaWtlIHRoZSB0cmlnZ2VyIGVsZW1lbnQgcG9zaXRpb24gb3IgdGhlIGR1cmF0aW9uLlxuXHRcdCAqIFRoaXMgbWV0aG9kIGlzIGF1dG9tYXRpY2FsbHkgY2FsbGVkIGluIHJlZ3VsYXIgaW50ZXJ2YWxzIGZyb20gdGhlIGNvbnRyb2xsZXIuIFNlZSB7QGxpbmsgU2Nyb2xsTWFnaWMuQ29udHJvbGxlcn0gb3B0aW9uIGByZWZyZXNoSW50ZXJ2YWxgLlxuXHRcdCAqIFxuXHRcdCAqIFlvdSBjYW4gY2FsbCBpdCB0byBtaW5pbWl6ZSBsYWcsIGZvciBleGFtcGxlIHdoZW4geW91IGludGVudGlvbmFsbHkgY2hhbmdlIHRoZSBwb3NpdGlvbiBvZiB0aGUgdHJpZ2dlckVsZW1lbnQuXG5cdFx0ICogSWYgeW91IGRvbid0IGl0IHdpbGwgc2ltcGx5IGJlIHVwZGF0ZWQgaW4gdGhlIG5leHQgcmVmcmVzaCBpbnRlcnZhbCBvZiB0aGUgY29udGFpbmVyLCB3aGljaCBpcyB1c3VhbGx5IHN1ZmZpY2llbnQuXG5cdFx0ICpcblx0XHQgKiBAbWV0aG9kIFNjcm9sbE1hZ2ljLlNjZW5lI3JlZnJlc2hcblx0XHQgKiBAc2luY2UgMS4xLjBcblx0XHQgKiBAZXhhbXBsZVxuXHRcdCAqIHNjZW5lID0gbmV3IFNjcm9sbE1hZ2ljLlNjZW5lKHt0cmlnZ2VyRWxlbWVudDogXCIjdHJpZ2dlclwifSk7XG5cdFx0ICogXG5cdFx0ICogLy8gY2hhbmdlIHRoZSBwb3NpdGlvbiBvZiB0aGUgdHJpZ2dlclxuXHRcdCAqICQoXCIjdHJpZ2dlclwiKS5jc3MoXCJ0b3BcIiwgNTAwKTtcblx0XHQgKiAvLyBpbW1lZGlhdGVseSBsZXQgdGhlIHNjZW5lIGtub3cgb2YgdGhpcyBjaGFuZ2Vcblx0XHQgKiBzY2VuZS5yZWZyZXNoKCk7XG5cdFx0ICpcblx0XHQgKiBAZmlyZXMge0BsaW5rIFNjZW5lLnNoaWZ0fSwgaWYgdGhlIHRyaWdnZXIgZWxlbWVudCBwb3NpdGlvbiBvciB0aGUgZHVyYXRpb24gY2hhbmdlZFxuXHRcdCAqIEBmaXJlcyB7QGxpbmsgU2NlbmUuY2hhbmdlfSwgaWYgdGhlIGR1cmF0aW9uIGNoYW5nZWRcblx0XHQgKlxuXHRcdCAqIEByZXR1cm5zIHtTY2VuZX0gUGFyZW50IG9iamVjdCBmb3IgY2hhaW5pbmcuXG5cdFx0ICovXG5cdFx0dGhpcy5yZWZyZXNoID0gZnVuY3Rpb24gKCkge1xuXHRcdFx0dXBkYXRlRHVyYXRpb24oKTtcblx0XHRcdHVwZGF0ZVRyaWdnZXJFbGVtZW50UG9zaXRpb24oKTtcblx0XHRcdC8vIHVwZGF0ZSB0cmlnZ2VyIGVsZW1lbnQgcG9zaXRpb25cblx0XHRcdHJldHVybiBTY2VuZTtcblx0XHR9O1xuXG5cdFx0LyoqXG5cdFx0ICogKipHZXQqKiBvciAqKlNldCoqIHRoZSBzY2VuZSdzIHByb2dyZXNzLiAgXG5cdFx0ICogVXN1YWxseSBpdCBzaG91bGRuJ3QgYmUgbmVjZXNzYXJ5IHRvIHVzZSB0aGlzIGFzIGEgc2V0dGVyLCBhcyBpdCBpcyBzZXQgYXV0b21hdGljYWxseSBieSBzY2VuZS51cGRhdGUoKS4gIFxuXHRcdCAqIFRoZSBvcmRlciBpbiB3aGljaCB0aGUgZXZlbnRzIGFyZSBmaXJlZCBkZXBlbmRzIG9uIHRoZSBkdXJhdGlvbiBvZiB0aGUgc2NlbmU6XG5cdFx0ICogIDEuIFNjZW5lcyB3aXRoIGBkdXJhdGlvbiA9PSAwYDogIFxuXHRcdCAqICBTY2VuZXMgdGhhdCBoYXZlIG5vIGR1cmF0aW9uIGJ5IGRlZmluaXRpb24gaGF2ZSBubyBlbmRpbmcuIFRodXMgdGhlIGBlbmRgIGV2ZW50IHdpbGwgbmV2ZXIgYmUgZmlyZWQuICBcblx0XHQgKiAgV2hlbiB0aGUgdHJpZ2dlciBwb3NpdGlvbiBvZiB0aGUgc2NlbmUgaXMgcGFzc2VkIHRoZSBldmVudHMgYXJlIGFsd2F5cyBmaXJlZCBpbiB0aGlzIG9yZGVyOiAgXG5cdFx0ICogIGBlbnRlcmAsIGBzdGFydGAsIGBwcm9ncmVzc2Agd2hlbiBzY3JvbGxpbmcgZm9yd2FyZCAgXG5cdFx0ICogIGFuZCAgXG5cdFx0ICogIGBwcm9ncmVzc2AsIGBzdGFydGAsIGBsZWF2ZWAgd2hlbiBzY3JvbGxpbmcgaW4gcmV2ZXJzZVxuXHRcdCAqICAyLiBTY2VuZXMgd2l0aCBgZHVyYXRpb24gPiAwYDogIFxuXHRcdCAqICBTY2VuZXMgd2l0aCBhIHNldCBkdXJhdGlvbiBoYXZlIGEgZGVmaW5lZCBzdGFydCBhbmQgZW5kIHBvaW50LiAgXG5cdFx0ICogIFdoZW4gc2Nyb2xsaW5nIHBhc3QgdGhlIHN0YXJ0IHBvc2l0aW9uIG9mIHRoZSBzY2VuZSBpdCB3aWxsIGZpcmUgdGhlc2UgZXZlbnRzIGluIHRoaXMgb3JkZXI6ICBcblx0XHQgKiAgYGVudGVyYCwgYHN0YXJ0YCwgYHByb2dyZXNzYCAgXG5cdFx0ICogIFdoZW4gY29udGludWluZyB0byBzY3JvbGwgYW5kIHBhc3NpbmcgdGhlIGVuZCBwb2ludCBpdCB3aWxsIGZpcmUgdGhlc2UgZXZlbnRzOiAgXG5cdFx0ICogIGBwcm9ncmVzc2AsIGBlbmRgLCBgbGVhdmVgICBcblx0XHQgKiAgV2hlbiByZXZlcnNpbmcgdGhyb3VnaCB0aGUgZW5kIHBvaW50IHRoZXNlIGV2ZW50cyBhcmUgZmlyZWQ6ICBcblx0XHQgKiAgYGVudGVyYCwgYGVuZGAsIGBwcm9ncmVzc2AgIFxuXHRcdCAqICBBbmQgd2hlbiBjb250aW51aW5nIHRvIHNjcm9sbCBwYXN0IHRoZSBzdGFydCBwb3NpdGlvbiBpbiByZXZlcnNlIGl0IHdpbGwgZmlyZTogIFxuXHRcdCAqICBgcHJvZ3Jlc3NgLCBgc3RhcnRgLCBgbGVhdmVgICBcblx0XHQgKiAgSW4gYmV0d2VlbiBzdGFydCBhbmQgZW5kIHRoZSBgcHJvZ3Jlc3NgIGV2ZW50IHdpbGwgYmUgY2FsbGVkIGNvbnN0YW50bHksIHdoZW5ldmVyIHRoZSBwcm9ncmVzcyBjaGFuZ2VzLlxuXHRcdCAqIFxuXHRcdCAqIEluIHNob3J0OiAgXG5cdFx0ICogYGVudGVyYCBldmVudHMgd2lsbCBhbHdheXMgdHJpZ2dlciAqKmJlZm9yZSoqIHRoZSBwcm9ncmVzcyB1cGRhdGUgYW5kIGBsZWF2ZWAgZW52ZW50cyB3aWxsIHRyaWdnZXIgKiphZnRlcioqIHRoZSBwcm9ncmVzcyB1cGRhdGUuICBcblx0XHQgKiBgc3RhcnRgIGFuZCBgZW5kYCB3aWxsIGFsd2F5cyB0cmlnZ2VyIGF0IHRoZWlyIHJlc3BlY3RpdmUgcG9zaXRpb24uXG5cdFx0ICogXG5cdFx0ICogUGxlYXNlIHJldmlldyB0aGUgZXZlbnQgZGVzY3JpcHRpb25zIGZvciBkZXRhaWxzIG9uIHRoZSBldmVudHMgYW5kIHRoZSBldmVudCBvYmplY3QgdGhhdCBpcyBwYXNzZWQgdG8gdGhlIGNhbGxiYWNrLlxuXHRcdCAqIFxuXHRcdCAqIEBtZXRob2QgU2Nyb2xsTWFnaWMuU2NlbmUjcHJvZ3Jlc3Ncblx0XHQgKiBAZXhhbXBsZVxuXHRcdCAqIC8vIGdldCB0aGUgY3VycmVudCBzY2VuZSBwcm9ncmVzc1xuXHRcdCAqIHZhciBwcm9ncmVzcyA9IHNjZW5lLnByb2dyZXNzKCk7XG5cdFx0ICpcblx0XHQgKiAvLyBzZXQgbmV3IHNjZW5lIHByb2dyZXNzXG5cdFx0ICogc2NlbmUucHJvZ3Jlc3MoMC4zKTtcblx0XHQgKlxuXHRcdCAqIEBmaXJlcyB7QGxpbmsgU2NlbmUuZW50ZXJ9LCB3aGVuIHVzZWQgYXMgc2V0dGVyXG5cdFx0ICogQGZpcmVzIHtAbGluayBTY2VuZS5zdGFydH0sIHdoZW4gdXNlZCBhcyBzZXR0ZXJcblx0XHQgKiBAZmlyZXMge0BsaW5rIFNjZW5lLnByb2dyZXNzfSwgd2hlbiB1c2VkIGFzIHNldHRlclxuXHRcdCAqIEBmaXJlcyB7QGxpbmsgU2NlbmUuZW5kfSwgd2hlbiB1c2VkIGFzIHNldHRlclxuXHRcdCAqIEBmaXJlcyB7QGxpbmsgU2NlbmUubGVhdmV9LCB3aGVuIHVzZWQgYXMgc2V0dGVyXG5cdFx0ICpcblx0XHQgKiBAcGFyYW0ge251bWJlcn0gW3Byb2dyZXNzXSAtIFRoZSBuZXcgcHJvZ3Jlc3MgdmFsdWUgb2YgdGhlIHNjZW5lIGBbMC0xXWAuXG5cdFx0ICogQHJldHVybnMge251bWJlcn0gYGdldGAgLSAgQ3VycmVudCBzY2VuZSBwcm9ncmVzcy5cblx0XHQgKiBAcmV0dXJucyB7U2NlbmV9IGBzZXRgIC0gIFBhcmVudCBvYmplY3QgZm9yIGNoYWluaW5nLlxuXHRcdCAqL1xuXHRcdHRoaXMucHJvZ3Jlc3MgPSBmdW5jdGlvbiAocHJvZ3Jlc3MpIHtcblx0XHRcdGlmICghYXJndW1lbnRzLmxlbmd0aCkgeyAvLyBnZXRcblx0XHRcdFx0cmV0dXJuIF9wcm9ncmVzcztcblx0XHRcdH0gZWxzZSB7IC8vIHNldFxuXHRcdFx0XHR2YXJcblx0XHRcdFx0ZG9VcGRhdGUgPSBmYWxzZSxcblx0XHRcdFx0XHRvbGRTdGF0ZSA9IF9zdGF0ZSxcblx0XHRcdFx0XHRzY3JvbGxEaXJlY3Rpb24gPSBfY29udHJvbGxlciA/IF9jb250cm9sbGVyLmluZm8oXCJzY3JvbGxEaXJlY3Rpb25cIikgOiAnUEFVU0VEJyxcblx0XHRcdFx0XHRyZXZlcnNlT3JGb3J3YXJkID0gX29wdGlvbnMucmV2ZXJzZSB8fCBwcm9ncmVzcyA+PSBfcHJvZ3Jlc3M7XG5cdFx0XHRcdGlmIChfb3B0aW9ucy5kdXJhdGlvbiA9PT0gMCkge1xuXHRcdFx0XHRcdC8vIHplcm8gZHVyYXRpb24gc2NlbmVzXG5cdFx0XHRcdFx0ZG9VcGRhdGUgPSBfcHJvZ3Jlc3MgIT0gcHJvZ3Jlc3M7XG5cdFx0XHRcdFx0X3Byb2dyZXNzID0gcHJvZ3Jlc3MgPCAxICYmIHJldmVyc2VPckZvcndhcmQgPyAwIDogMTtcblx0XHRcdFx0XHRfc3RhdGUgPSBfcHJvZ3Jlc3MgPT09IDAgPyBTQ0VORV9TVEFURV9CRUZPUkUgOiBTQ0VORV9TVEFURV9EVVJJTkc7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Ly8gc2NlbmVzIHdpdGggc3RhcnQgYW5kIGVuZFxuXHRcdFx0XHRcdGlmIChwcm9ncmVzcyA8IDAgJiYgX3N0YXRlICE9PSBTQ0VORV9TVEFURV9CRUZPUkUgJiYgcmV2ZXJzZU9yRm9yd2FyZCkge1xuXHRcdFx0XHRcdFx0Ly8gZ28gYmFjayB0byBpbml0aWFsIHN0YXRlXG5cdFx0XHRcdFx0XHRfcHJvZ3Jlc3MgPSAwO1xuXHRcdFx0XHRcdFx0X3N0YXRlID0gU0NFTkVfU1RBVEVfQkVGT1JFO1xuXHRcdFx0XHRcdFx0ZG9VcGRhdGUgPSB0cnVlO1xuXHRcdFx0XHRcdH0gZWxzZSBpZiAocHJvZ3Jlc3MgPj0gMCAmJiBwcm9ncmVzcyA8IDEgJiYgcmV2ZXJzZU9yRm9yd2FyZCkge1xuXHRcdFx0XHRcdFx0X3Byb2dyZXNzID0gcHJvZ3Jlc3M7XG5cdFx0XHRcdFx0XHRfc3RhdGUgPSBTQ0VORV9TVEFURV9EVVJJTkc7XG5cdFx0XHRcdFx0XHRkb1VwZGF0ZSA9IHRydWU7XG5cdFx0XHRcdFx0fSBlbHNlIGlmIChwcm9ncmVzcyA+PSAxICYmIF9zdGF0ZSAhPT0gU0NFTkVfU1RBVEVfQUZURVIpIHtcblx0XHRcdFx0XHRcdF9wcm9ncmVzcyA9IDE7XG5cdFx0XHRcdFx0XHRfc3RhdGUgPSBTQ0VORV9TVEFURV9BRlRFUjtcblx0XHRcdFx0XHRcdGRvVXBkYXRlID0gdHJ1ZTtcblx0XHRcdFx0XHR9IGVsc2UgaWYgKF9zdGF0ZSA9PT0gU0NFTkVfU1RBVEVfRFVSSU5HICYmICFyZXZlcnNlT3JGb3J3YXJkKSB7XG5cdFx0XHRcdFx0XHR1cGRhdGVQaW5TdGF0ZSgpOyAvLyBpbiBjYXNlIHdlIHNjcm9sbGVkIGJhY2t3YXJkcyBtaWQtc2NlbmUgYW5kIHJldmVyc2UgaXMgZGlzYWJsZWQgPT4gdXBkYXRlIHRoZSBwaW4gcG9zaXRpb24sIHNvIGl0IGRvZXNuJ3QgbW92ZSBiYWNrIGFzIHdlbGwuXG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdGlmIChkb1VwZGF0ZSkge1xuXHRcdFx0XHRcdC8vIGZpcmUgZXZlbnRzXG5cdFx0XHRcdFx0dmFyXG5cdFx0XHRcdFx0ZXZlbnRWYXJzID0ge1xuXHRcdFx0XHRcdFx0cHJvZ3Jlc3M6IF9wcm9ncmVzcyxcblx0XHRcdFx0XHRcdHN0YXRlOiBfc3RhdGUsXG5cdFx0XHRcdFx0XHRzY3JvbGxEaXJlY3Rpb246IHNjcm9sbERpcmVjdGlvblxuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRzdGF0ZUNoYW5nZWQgPSBfc3RhdGUgIT0gb2xkU3RhdGU7XG5cblx0XHRcdFx0XHR2YXIgdHJpZ2dlciA9IGZ1bmN0aW9uIChldmVudE5hbWUpIHsgLy8gdG1wIGhlbHBlciB0byBzaW1wbGlmeSBjb2RlXG5cdFx0XHRcdFx0XHRTY2VuZS50cmlnZ2VyKGV2ZW50TmFtZSwgZXZlbnRWYXJzKTtcblx0XHRcdFx0XHR9O1xuXG5cdFx0XHRcdFx0aWYgKHN0YXRlQ2hhbmdlZCkgeyAvLyBlbnRlciBldmVudHNcblx0XHRcdFx0XHRcdGlmIChvbGRTdGF0ZSAhPT0gU0NFTkVfU1RBVEVfRFVSSU5HKSB7XG5cdFx0XHRcdFx0XHRcdHRyaWdnZXIoXCJlbnRlclwiKTtcblx0XHRcdFx0XHRcdFx0dHJpZ2dlcihvbGRTdGF0ZSA9PT0gU0NFTkVfU1RBVEVfQkVGT1JFID8gXCJzdGFydFwiIDogXCJlbmRcIik7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHRyaWdnZXIoXCJwcm9ncmVzc1wiKTtcblx0XHRcdFx0XHRpZiAoc3RhdGVDaGFuZ2VkKSB7IC8vIGxlYXZlIGV2ZW50c1xuXHRcdFx0XHRcdFx0aWYgKF9zdGF0ZSAhPT0gU0NFTkVfU1RBVEVfRFVSSU5HKSB7XG5cdFx0XHRcdFx0XHRcdHRyaWdnZXIoX3N0YXRlID09PSBTQ0VORV9TVEFURV9CRUZPUkUgPyBcInN0YXJ0XCIgOiBcImVuZFwiKTtcblx0XHRcdFx0XHRcdFx0dHJpZ2dlcihcImxlYXZlXCIpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdHJldHVybiBTY2VuZTtcblx0XHRcdH1cblx0XHR9O1xuXG5cblx0XHQvKipcblx0XHQgKiBVcGRhdGUgdGhlIHN0YXJ0IGFuZCBlbmQgc2Nyb2xsT2Zmc2V0IG9mIHRoZSBjb250YWluZXIuXG5cdFx0ICogVGhlIHBvc2l0aW9ucyByZWZsZWN0IHdoYXQgdGhlIGNvbnRyb2xsZXIncyBzY3JvbGwgcG9zaXRpb24gd2lsbCBiZSBhdCB0aGUgc3RhcnQgYW5kIGVuZCByZXNwZWN0aXZlbHkuXG5cdFx0ICogSXMgY2FsbGVkLCB3aGVuOlxuXHRcdCAqICAgLSBTY2VuZSBldmVudCBcImNoYW5nZVwiIGlzIGNhbGxlZCB3aXRoOiBvZmZzZXQsIHRyaWdnZXJIb29rLCBkdXJhdGlvbiBcblx0XHQgKiAgIC0gc2Nyb2xsIGNvbnRhaW5lciBldmVudCBcInJlc2l6ZVwiIGlzIGNhbGxlZFxuXHRcdCAqICAgLSB0aGUgcG9zaXRpb24gb2YgdGhlIHRyaWdnZXJFbGVtZW50IGNoYW5nZXNcblx0XHQgKiAgIC0gdGhlIGNvbnRyb2xsZXIgY2hhbmdlcyAtPiBhZGRUbygpXG5cdFx0ICogQHByaXZhdGVcblx0XHQgKi9cblx0XHR2YXIgdXBkYXRlU2Nyb2xsT2Zmc2V0ID0gZnVuY3Rpb24gKCkge1xuXHRcdFx0X3Njcm9sbE9mZnNldCA9IHtcblx0XHRcdFx0c3RhcnQ6IF90cmlnZ2VyUG9zICsgX29wdGlvbnMub2Zmc2V0XG5cdFx0XHR9O1xuXHRcdFx0aWYgKF9jb250cm9sbGVyICYmIF9vcHRpb25zLnRyaWdnZXJFbGVtZW50KSB7XG5cdFx0XHRcdC8vIHRha2UgYXdheSB0cmlnZ2VySG9vayBwb3J0aW9uIHRvIGdldCByZWxhdGl2ZSB0byB0b3Bcblx0XHRcdFx0X3Njcm9sbE9mZnNldC5zdGFydCAtPSBfY29udHJvbGxlci5pbmZvKFwic2l6ZVwiKSAqIF9vcHRpb25zLnRyaWdnZXJIb29rO1xuXHRcdFx0fVxuXHRcdFx0X3Njcm9sbE9mZnNldC5lbmQgPSBfc2Nyb2xsT2Zmc2V0LnN0YXJ0ICsgX29wdGlvbnMuZHVyYXRpb247XG5cdFx0fTtcblxuXHRcdC8qKlxuXHRcdCAqIFVwZGF0ZXMgdGhlIGR1cmF0aW9uIGlmIHNldCB0byBhIGR5bmFtaWMgZnVuY3Rpb24uXG5cdFx0ICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIHdoZW4gdGhlIHNjZW5lIGlzIGFkZGVkIHRvIGEgY29udHJvbGxlciBhbmQgaW4gcmVndWxhciBpbnRlcnZhbHMgZnJvbSB0aGUgY29udHJvbGxlciB0aHJvdWdoIHNjZW5lLnJlZnJlc2goKS5cblx0XHQgKiBcblx0XHQgKiBAZmlyZXMge0BsaW5rIFNjZW5lLmNoYW5nZX0sIGlmIHRoZSBkdXJhdGlvbiBjaGFuZ2VkXG5cdFx0ICogQGZpcmVzIHtAbGluayBTY2VuZS5zaGlmdH0sIGlmIHRoZSBkdXJhdGlvbiBjaGFuZ2VkXG5cdFx0ICpcblx0XHQgKiBAcGFyYW0ge2Jvb2xlYW59IFtzdXBwcmVzc0V2ZW50cz1mYWxzZV0gLSBJZiB0cnVlIHRoZSBzaGlmdCBldmVudCB3aWxsIGJlIHN1cHByZXNzZWQuXG5cdFx0ICogQHByaXZhdGVcblx0XHQgKi9cblx0XHR2YXIgdXBkYXRlRHVyYXRpb24gPSBmdW5jdGlvbiAoc3VwcHJlc3NFdmVudHMpIHtcblx0XHRcdC8vIHVwZGF0ZSBkdXJhdGlvblxuXHRcdFx0aWYgKF9kdXJhdGlvblVwZGF0ZU1ldGhvZCkge1xuXHRcdFx0XHR2YXIgdmFybmFtZSA9IFwiZHVyYXRpb25cIjtcblx0XHRcdFx0aWYgKGNoYW5nZU9wdGlvbih2YXJuYW1lLCBfZHVyYXRpb25VcGRhdGVNZXRob2QuY2FsbChTY2VuZSkpICYmICFzdXBwcmVzc0V2ZW50cykgeyAvLyBzZXRcblx0XHRcdFx0XHRTY2VuZS50cmlnZ2VyKFwiY2hhbmdlXCIsIHtcblx0XHRcdFx0XHRcdHdoYXQ6IHZhcm5hbWUsXG5cdFx0XHRcdFx0XHRuZXd2YWw6IF9vcHRpb25zW3Zhcm5hbWVdXG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0U2NlbmUudHJpZ2dlcihcInNoaWZ0XCIsIHtcblx0XHRcdFx0XHRcdHJlYXNvbjogdmFybmFtZVxuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fTtcblxuXHRcdC8qKlxuXHRcdCAqIFVwZGF0ZXMgdGhlIHBvc2l0aW9uIG9mIHRoZSB0cmlnZ2VyRWxlbWVudCwgaWYgcHJlc2VudC5cblx0XHQgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgLi4uXG5cdFx0ICogIC0gLi4uIHdoZW4gdGhlIHRyaWdnZXJFbGVtZW50IGlzIGNoYW5nZWRcblx0XHQgKiAgLSAuLi4gd2hlbiB0aGUgc2NlbmUgaXMgYWRkZWQgdG8gYSAobmV3KSBjb250cm9sbGVyXG5cdFx0ICogIC0gLi4uIGluIHJlZ3VsYXIgaW50ZXJ2YWxzIGZyb20gdGhlIGNvbnRyb2xsZXIgdGhyb3VnaCBzY2VuZS5yZWZyZXNoKCkuXG5cdFx0ICogXG5cdFx0ICogQGZpcmVzIHtAbGluayBTY2VuZS5zaGlmdH0sIGlmIHRoZSBwb3NpdGlvbiBjaGFuZ2VkXG5cdFx0ICpcblx0XHQgKiBAcGFyYW0ge2Jvb2xlYW59IFtzdXBwcmVzc0V2ZW50cz1mYWxzZV0gLSBJZiB0cnVlIHRoZSBzaGlmdCBldmVudCB3aWxsIGJlIHN1cHByZXNzZWQuXG5cdFx0ICogQHByaXZhdGVcblx0XHQgKi9cblx0XHR2YXIgdXBkYXRlVHJpZ2dlckVsZW1lbnRQb3NpdGlvbiA9IGZ1bmN0aW9uIChzdXBwcmVzc0V2ZW50cykge1xuXHRcdFx0dmFyXG5cdFx0XHRlbGVtZW50UG9zID0gMCxcblx0XHRcdFx0dGVsZW0gPSBfb3B0aW9ucy50cmlnZ2VyRWxlbWVudDtcblx0XHRcdGlmIChfY29udHJvbGxlciAmJiB0ZWxlbSkge1xuXHRcdFx0XHR2YXJcblx0XHRcdFx0Y29udHJvbGxlckluZm8gPSBfY29udHJvbGxlci5pbmZvKCksXG5cdFx0XHRcdFx0Y29udGFpbmVyT2Zmc2V0ID0gX3V0aWwuZ2V0Lm9mZnNldChjb250cm9sbGVySW5mby5jb250YWluZXIpLFxuXHRcdFx0XHRcdC8vIGNvbnRhaW5lciBwb3NpdGlvbiBpcyBuZWVkZWQgYmVjYXVzZSBlbGVtZW50IG9mZnNldCBpcyByZXR1cm5lZCBpbiByZWxhdGlvbiB0byBkb2N1bWVudCwgbm90IGluIHJlbGF0aW9uIHRvIGNvbnRhaW5lci5cblx0XHRcdFx0XHRwYXJhbSA9IGNvbnRyb2xsZXJJbmZvLnZlcnRpY2FsID8gXCJ0b3BcIiA6IFwibGVmdFwiOyAvLyB3aGljaCBwYXJhbSBpcyBvZiBpbnRlcmVzdCA/XG5cdFx0XHRcdC8vIGlmIHBhcmVudCBpcyBzcGFjZXIsIHVzZSBzcGFjZXIgcG9zaXRpb24gaW5zdGVhZCBzbyBjb3JyZWN0IHN0YXJ0IHBvc2l0aW9uIGlzIHJldHVybmVkIGZvciBwaW5uZWQgZWxlbWVudHMuXG5cdFx0XHRcdHdoaWxlICh0ZWxlbS5wYXJlbnROb2RlLmhhc0F0dHJpYnV0ZShQSU5fU1BBQ0VSX0FUVFJJQlVURSkpIHtcblx0XHRcdFx0XHR0ZWxlbSA9IHRlbGVtLnBhcmVudE5vZGU7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHR2YXIgZWxlbWVudE9mZnNldCA9IF91dGlsLmdldC5vZmZzZXQodGVsZW0pO1xuXG5cdFx0XHRcdGlmICghY29udHJvbGxlckluZm8uaXNEb2N1bWVudCkgeyAvLyBjb250YWluZXIgaXMgbm90IHRoZSBkb2N1bWVudCByb290LCBzbyBzdWJzdHJhY3Qgc2Nyb2xsIFBvc2l0aW9uIHRvIGdldCBjb3JyZWN0IHRyaWdnZXIgZWxlbWVudCBwb3NpdGlvbiByZWxhdGl2ZSB0byBzY3JvbGxjb250ZW50XG5cdFx0XHRcdFx0Y29udGFpbmVyT2Zmc2V0W3BhcmFtXSAtPSBfY29udHJvbGxlci5zY3JvbGxQb3MoKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGVsZW1lbnRQb3MgPSBlbGVtZW50T2Zmc2V0W3BhcmFtXSAtIGNvbnRhaW5lck9mZnNldFtwYXJhbV07XG5cdFx0XHR9XG5cdFx0XHR2YXIgY2hhbmdlZCA9IGVsZW1lbnRQb3MgIT0gX3RyaWdnZXJQb3M7XG5cdFx0XHRfdHJpZ2dlclBvcyA9IGVsZW1lbnRQb3M7XG5cdFx0XHRpZiAoY2hhbmdlZCAmJiAhc3VwcHJlc3NFdmVudHMpIHtcblx0XHRcdFx0U2NlbmUudHJpZ2dlcihcInNoaWZ0XCIsIHtcblx0XHRcdFx0XHRyZWFzb246IFwidHJpZ2dlckVsZW1lbnRQb3NpdGlvblwiXG5cdFx0XHRcdH0pO1xuXHRcdFx0fVxuXHRcdH07XG5cblx0XHQvKipcblx0XHQgKiBUcmlnZ2VyIGEgc2hpZnQgZXZlbnQsIHdoZW4gdGhlIGNvbnRhaW5lciBpcyByZXNpemVkIGFuZCB0aGUgdHJpZ2dlckhvb2sgaXMgPiAxLlxuXHRcdCAqIEBwcml2YXRlXG5cdFx0ICovXG5cdFx0dmFyIG9uQ29udGFpbmVyUmVzaXplID0gZnVuY3Rpb24gKGUpIHtcblx0XHRcdGlmIChfb3B0aW9ucy50cmlnZ2VySG9vayA+IDApIHtcblx0XHRcdFx0U2NlbmUudHJpZ2dlcihcInNoaWZ0XCIsIHtcblx0XHRcdFx0XHRyZWFzb246IFwiY29udGFpbmVyUmVzaXplXCJcblx0XHRcdFx0fSk7XG5cdFx0XHR9XG5cdFx0fTtcblxuXHRcdHZhciBfdmFsaWRhdGUgPSBfdXRpbC5leHRlbmQoU0NFTkVfT1BUSU9OUy52YWxpZGF0ZSwge1xuXHRcdFx0Ly8gdmFsaWRhdGlvbiBmb3IgZHVyYXRpb24gaGFuZGxlZCBpbnRlcm5hbGx5IGZvciByZWZlcmVuY2UgdG8gcHJpdmF0ZSB2YXIgX2R1cmF0aW9uTWV0aG9kXG5cdFx0XHRkdXJhdGlvbjogZnVuY3Rpb24gKHZhbCkge1xuXHRcdFx0XHRpZiAoX3V0aWwudHlwZS5TdHJpbmcodmFsKSAmJiB2YWwubWF0Y2goL14oXFwufFxcZCkqXFxkKyUkLykpIHtcblx0XHRcdFx0XHQvLyBwZXJjZW50YWdlIHZhbHVlXG5cdFx0XHRcdFx0dmFyIHBlcmMgPSBwYXJzZUZsb2F0KHZhbCkgLyAxMDA7XG5cdFx0XHRcdFx0dmFsID0gZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdFx0cmV0dXJuIF9jb250cm9sbGVyID8gX2NvbnRyb2xsZXIuaW5mbyhcInNpemVcIikgKiBwZXJjIDogMDtcblx0XHRcdFx0XHR9O1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmIChfdXRpbC50eXBlLkZ1bmN0aW9uKHZhbCkpIHtcblx0XHRcdFx0XHQvLyBmdW5jdGlvblxuXHRcdFx0XHRcdF9kdXJhdGlvblVwZGF0ZU1ldGhvZCA9IHZhbDtcblx0XHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdFx0dmFsID0gcGFyc2VGbG9hdChfZHVyYXRpb25VcGRhdGVNZXRob2QoKSk7XG5cdFx0XHRcdFx0fSBjYXRjaCAoZSkge1xuXHRcdFx0XHRcdFx0dmFsID0gLTE7IC8vIHdpbGwgY2F1c2UgZXJyb3IgYmVsb3dcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0Ly8gdmFsIGhhcyB0byBiZSBmbG9hdFxuXHRcdFx0XHR2YWwgPSBwYXJzZUZsb2F0KHZhbCk7XG5cdFx0XHRcdGlmICghX3V0aWwudHlwZS5OdW1iZXIodmFsKSB8fCB2YWwgPCAwKSB7XG5cdFx0XHRcdFx0aWYgKF9kdXJhdGlvblVwZGF0ZU1ldGhvZCkge1xuXHRcdFx0XHRcdFx0X2R1cmF0aW9uVXBkYXRlTWV0aG9kID0gdW5kZWZpbmVkO1xuXHRcdFx0XHRcdFx0dGhyb3cgW1wiSW52YWxpZCByZXR1cm4gdmFsdWUgb2Ygc3VwcGxpZWQgZnVuY3Rpb24gZm9yIG9wdGlvbiBcXFwiZHVyYXRpb25cXFwiOlwiLCB2YWxdO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHR0aHJvdyBbXCJJbnZhbGlkIHZhbHVlIGZvciBvcHRpb24gXFxcImR1cmF0aW9uXFxcIjpcIiwgdmFsXTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIHZhbDtcblx0XHRcdH1cblx0XHR9KTtcblxuXHRcdC8qKlxuXHRcdCAqIENoZWNrcyB0aGUgdmFsaWRpdHkgb2YgYSBzcGVjaWZpYyBvciBhbGwgb3B0aW9ucyBhbmQgcmVzZXQgdG8gZGVmYXVsdCBpZiBuZWNjZXNzYXJ5LlxuXHRcdCAqIEBwcml2YXRlXG5cdFx0ICovXG5cdFx0dmFyIHZhbGlkYXRlT3B0aW9uID0gZnVuY3Rpb24gKGNoZWNrKSB7XG5cdFx0XHRjaGVjayA9IGFyZ3VtZW50cy5sZW5ndGggPyBbY2hlY2tdIDogT2JqZWN0LmtleXMoX3ZhbGlkYXRlKTtcblx0XHRcdGNoZWNrLmZvckVhY2goZnVuY3Rpb24gKG9wdGlvbk5hbWUsIGtleSkge1xuXHRcdFx0XHR2YXIgdmFsdWU7XG5cdFx0XHRcdGlmIChfdmFsaWRhdGVbb3B0aW9uTmFtZV0pIHsgLy8gdGhlcmUgaXMgYSB2YWxpZGF0aW9uIG1ldGhvZCBmb3IgdGhpcyBvcHRpb25cblx0XHRcdFx0XHR0cnkgeyAvLyB2YWxpZGF0ZSB2YWx1ZVxuXHRcdFx0XHRcdFx0dmFsdWUgPSBfdmFsaWRhdGVbb3B0aW9uTmFtZV0oX29wdGlvbnNbb3B0aW9uTmFtZV0pO1xuXHRcdFx0XHRcdH0gY2F0Y2ggKGUpIHsgLy8gdmFsaWRhdGlvbiBmYWlsZWQgLT4gcmVzZXQgdG8gZGVmYXVsdFxuXHRcdFx0XHRcdFx0dmFsdWUgPSBERUZBVUxUX09QVElPTlNbb3B0aW9uTmFtZV07XG5cdFx0XHRcdFx0XHR2YXIgbG9nTVNHID0gX3V0aWwudHlwZS5TdHJpbmcoZSkgPyBbZV0gOiBlO1xuXHRcdFx0XHRcdFx0aWYgKF91dGlsLnR5cGUuQXJyYXkobG9nTVNHKSkge1xuXHRcdFx0XHRcdFx0XHRsb2dNU0dbMF0gPSBcIkVSUk9SOiBcIiArIGxvZ01TR1swXTtcblx0XHRcdFx0XHRcdFx0bG9nTVNHLnVuc2hpZnQoMSk7IC8vIGxvZ2xldmVsIDEgZm9yIGVycm9yIG1zZ1xuXHRcdFx0XHRcdFx0XHRsb2cuYXBwbHkodGhpcywgbG9nTVNHKTtcblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdGxvZygxLCBcIkVSUk9SOiBQcm9ibGVtIGV4ZWN1dGluZyB2YWxpZGF0aW9uIGNhbGxiYWNrIGZvciBvcHRpb24gJ1wiICsgb3B0aW9uTmFtZSArIFwiJzpcIiwgZS5tZXNzYWdlKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9IGZpbmFsbHkge1xuXHRcdFx0XHRcdFx0X29wdGlvbnNbb3B0aW9uTmFtZV0gPSB2YWx1ZTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXHRcdH07XG5cblx0XHQvKipcblx0XHQgKiBIZWxwZXIgdXNlZCBieSB0aGUgc2V0dGVyL2dldHRlcnMgZm9yIHNjZW5lIG9wdGlvbnNcblx0XHQgKiBAcHJpdmF0ZVxuXHRcdCAqL1xuXHRcdHZhciBjaGFuZ2VPcHRpb24gPSBmdW5jdGlvbiAodmFybmFtZSwgbmV3dmFsKSB7XG5cdFx0XHR2YXJcblx0XHRcdGNoYW5nZWQgPSBmYWxzZSxcblx0XHRcdFx0b2xkdmFsID0gX29wdGlvbnNbdmFybmFtZV07XG5cdFx0XHRpZiAoX29wdGlvbnNbdmFybmFtZV0gIT0gbmV3dmFsKSB7XG5cdFx0XHRcdF9vcHRpb25zW3Zhcm5hbWVdID0gbmV3dmFsO1xuXHRcdFx0XHR2YWxpZGF0ZU9wdGlvbih2YXJuYW1lKTsgLy8gcmVzZXRzIHRvIGRlZmF1bHQgaWYgbmVjZXNzYXJ5XG5cdFx0XHRcdGNoYW5nZWQgPSBvbGR2YWwgIT0gX29wdGlvbnNbdmFybmFtZV07XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gY2hhbmdlZDtcblx0XHR9O1xuXG5cdFx0Ly8gZ2VuZXJhdGUgZ2V0dGVycy9zZXR0ZXJzIGZvciBhbGwgb3B0aW9uc1xuXHRcdHZhciBhZGRTY2VuZU9wdGlvbiA9IGZ1bmN0aW9uIChvcHRpb25OYW1lKSB7XG5cdFx0XHRpZiAoIVNjZW5lW29wdGlvbk5hbWVdKSB7XG5cdFx0XHRcdFNjZW5lW29wdGlvbk5hbWVdID0gZnVuY3Rpb24gKG5ld1ZhbCkge1xuXHRcdFx0XHRcdGlmICghYXJndW1lbnRzLmxlbmd0aCkgeyAvLyBnZXRcblx0XHRcdFx0XHRcdHJldHVybiBfb3B0aW9uc1tvcHRpb25OYW1lXTtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0aWYgKG9wdGlvbk5hbWUgPT09IFwiZHVyYXRpb25cIikgeyAvLyBuZXcgZHVyYXRpb24gaXMgc2V0LCBzbyBhbnkgcHJldmlvdXNseSBzZXQgZnVuY3Rpb24gbXVzdCBiZSB1bnNldFxuXHRcdFx0XHRcdFx0XHRfZHVyYXRpb25VcGRhdGVNZXRob2QgPSB1bmRlZmluZWQ7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRpZiAoY2hhbmdlT3B0aW9uKG9wdGlvbk5hbWUsIG5ld1ZhbCkpIHsgLy8gc2V0XG5cdFx0XHRcdFx0XHRcdFNjZW5lLnRyaWdnZXIoXCJjaGFuZ2VcIiwge1xuXHRcdFx0XHRcdFx0XHRcdHdoYXQ6IG9wdGlvbk5hbWUsXG5cdFx0XHRcdFx0XHRcdFx0bmV3dmFsOiBfb3B0aW9uc1tvcHRpb25OYW1lXVxuXHRcdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdFx0aWYgKFNDRU5FX09QVElPTlMuc2hpZnRzLmluZGV4T2Yob3B0aW9uTmFtZSkgPiAtMSkge1xuXHRcdFx0XHRcdFx0XHRcdFNjZW5lLnRyaWdnZXIoXCJzaGlmdFwiLCB7XG5cdFx0XHRcdFx0XHRcdFx0XHRyZWFzb246IG9wdGlvbk5hbWVcblx0XHRcdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRyZXR1cm4gU2NlbmU7XG5cdFx0XHRcdH07XG5cdFx0XHR9XG5cdFx0fTtcblxuXHRcdC8qKlxuXHRcdCAqICoqR2V0Kiogb3IgKipTZXQqKiB0aGUgZHVyYXRpb24gb3B0aW9uIHZhbHVlLlxuXHRcdCAqIEFzIGEgc2V0dGVyIGl0IGFsc28gYWNjZXB0cyBhIGZ1bmN0aW9uIHJldHVybmluZyBhIG51bWVyaWMgdmFsdWUuICBcblx0XHQgKiBUaGlzIGlzIHBhcnRpY3VsYXJseSB1c2VmdWwgZm9yIHJlc3BvbnNpdmUgc2V0dXBzLlxuXHRcdCAqXG5cdFx0ICogVGhlIGR1cmF0aW9uIGlzIHVwZGF0ZWQgdXNpbmcgdGhlIHN1cHBsaWVkIGZ1bmN0aW9uIGV2ZXJ5IHRpbWUgYFNjZW5lLnJlZnJlc2goKWAgaXMgY2FsbGVkLCB3aGljaCBoYXBwZW5zIHBlcmlvZGljYWxseSBmcm9tIHRoZSBjb250cm9sbGVyIChzZWUgU2Nyb2xsTWFnaWMuQ29udHJvbGxlciBvcHRpb24gYHJlZnJlc2hJbnRlcnZhbGApLiAgXG5cdFx0ICogXyoqTk9URToqKiBCZSBhd2FyZSB0aGF0IGl0J3MgYW4gZWFzeSB3YXkgdG8ga2lsbCBwZXJmb3JtYW5jZSwgaWYgeW91IHN1cHBseSBhIGZ1bmN0aW9uIHRoYXQgaGFzIGhpZ2ggQ1BVIGRlbWFuZC4gIFxuXHRcdCAqIEV2ZW4gZm9yIHNpemUgYW5kIHBvc2l0aW9uIGNhbGN1bGF0aW9ucyBpdCBpcyByZWNvbW1lbmRlZCB0byB1c2UgYSB2YXJpYWJsZSB0byBjYWNoZSB0aGUgdmFsdWUuIChzZWUgZXhhbXBsZSkgIFxuXHRcdCAqIFRoaXMgY291bnRzIGRvdWJsZSBpZiB5b3UgdXNlIHRoZSBzYW1lIGZ1bmN0aW9uIGZvciBtdWx0aXBsZSBzY2VuZXMuX1xuXHRcdCAqXG5cdFx0ICogQG1ldGhvZCBTY3JvbGxNYWdpYy5TY2VuZSNkdXJhdGlvblxuXHRcdCAqIEBleGFtcGxlXG5cdFx0ICogLy8gZ2V0IHRoZSBjdXJyZW50IGR1cmF0aW9uIHZhbHVlXG5cdFx0ICogdmFyIGR1cmF0aW9uID0gc2NlbmUuZHVyYXRpb24oKTtcblx0XHQgKlxuXHRcdCAqIC8vIHNldCBhIG5ldyBkdXJhdGlvblxuXHRcdCAqIHNjZW5lLmR1cmF0aW9uKDMwMCk7XG5cdFx0ICpcblx0XHQgKiAvLyB1c2UgYSBmdW5jdGlvbiB0byBhdXRvbWF0aWNhbGx5IGFkanVzdCB0aGUgZHVyYXRpb24gdG8gdGhlIHdpbmRvdyBoZWlnaHQuXG5cdFx0ICogdmFyIGR1cmF0aW9uVmFsdWVDYWNoZTtcblx0XHQgKiBmdW5jdGlvbiBnZXREdXJhdGlvbiAoKSB7XG5cdFx0ICogICByZXR1cm4gZHVyYXRpb25WYWx1ZUNhY2hlO1xuXHRcdCAqIH1cblx0XHQgKiBmdW5jdGlvbiB1cGRhdGVEdXJhdGlvbiAoZSkge1xuXHRcdCAqICAgZHVyYXRpb25WYWx1ZUNhY2hlID0gd2luZG93LmlubmVySGVpZ2h0O1xuXHRcdCAqIH1cblx0XHQgKiAkKHdpbmRvdykub24oXCJyZXNpemVcIiwgdXBkYXRlRHVyYXRpb24pOyAvLyB1cGRhdGUgdGhlIGR1cmF0aW9uIHdoZW4gdGhlIHdpbmRvdyBzaXplIGNoYW5nZXNcblx0XHQgKiAkKHdpbmRvdykudHJpZ2dlckhhbmRsZXIoXCJyZXNpemVcIik7IC8vIHNldCB0byBpbml0aWFsIHZhbHVlXG5cdFx0ICogc2NlbmUuZHVyYXRpb24oZ2V0RHVyYXRpb24pOyAvLyBzdXBwbHkgZHVyYXRpb24gbWV0aG9kXG5cdFx0ICpcblx0XHQgKiBAZmlyZXMge0BsaW5rIFNjZW5lLmNoYW5nZX0sIHdoZW4gdXNlZCBhcyBzZXR0ZXJcblx0XHQgKiBAZmlyZXMge0BsaW5rIFNjZW5lLnNoaWZ0fSwgd2hlbiB1c2VkIGFzIHNldHRlclxuXHRcdCAqIEBwYXJhbSB7KG51bWJlcnxmdW5jdGlvbil9IFtuZXdEdXJhdGlvbl0gLSBUaGUgbmV3IGR1cmF0aW9uIG9mIHRoZSBzY2VuZS5cblx0XHQgKiBAcmV0dXJucyB7bnVtYmVyfSBgZ2V0YCAtICBDdXJyZW50IHNjZW5lIGR1cmF0aW9uLlxuXHRcdCAqIEByZXR1cm5zIHtTY2VuZX0gYHNldGAgLSAgUGFyZW50IG9iamVjdCBmb3IgY2hhaW5pbmcuXG5cdFx0ICovXG5cblx0XHQvKipcblx0XHQgKiAqKkdldCoqIG9yICoqU2V0KiogdGhlIG9mZnNldCBvcHRpb24gdmFsdWUuXG5cdFx0ICogQG1ldGhvZCBTY3JvbGxNYWdpYy5TY2VuZSNvZmZzZXRcblx0XHQgKiBAZXhhbXBsZVxuXHRcdCAqIC8vIGdldCB0aGUgY3VycmVudCBvZmZzZXRcblx0XHQgKiB2YXIgb2Zmc2V0ID0gc2NlbmUub2Zmc2V0KCk7XG5cdFx0ICpcblx0XHQgKiAvLyBzZXQgYSBuZXcgb2Zmc2V0XG5cdFx0ICogc2NlbmUub2Zmc2V0KDEwMCk7XG5cdFx0ICpcblx0XHQgKiBAZmlyZXMge0BsaW5rIFNjZW5lLmNoYW5nZX0sIHdoZW4gdXNlZCBhcyBzZXR0ZXJcblx0XHQgKiBAZmlyZXMge0BsaW5rIFNjZW5lLnNoaWZ0fSwgd2hlbiB1c2VkIGFzIHNldHRlclxuXHRcdCAqIEBwYXJhbSB7bnVtYmVyfSBbbmV3T2Zmc2V0XSAtIFRoZSBuZXcgb2Zmc2V0IG9mIHRoZSBzY2VuZS5cblx0XHQgKiBAcmV0dXJucyB7bnVtYmVyfSBgZ2V0YCAtICBDdXJyZW50IHNjZW5lIG9mZnNldC5cblx0XHQgKiBAcmV0dXJucyB7U2NlbmV9IGBzZXRgIC0gIFBhcmVudCBvYmplY3QgZm9yIGNoYWluaW5nLlxuXHRcdCAqL1xuXG5cdFx0LyoqXG5cdFx0ICogKipHZXQqKiBvciAqKlNldCoqIHRoZSB0cmlnZ2VyRWxlbWVudCBvcHRpb24gdmFsdWUuXG5cdFx0ICogRG9lcyAqKm5vdCoqIGZpcmUgYFNjZW5lLnNoaWZ0YCwgYmVjYXVzZSBjaGFuZ2luZyB0aGUgdHJpZ2dlciBFbGVtZW50IGRvZXNuJ3QgbmVjZXNzYXJpbHkgbWVhbiB0aGUgc3RhcnQgcG9zaXRpb24gY2hhbmdlcy4gVGhpcyB3aWxsIGJlIGRldGVybWluZWQgaW4gYFNjZW5lLnJlZnJlc2goKWAsIHdoaWNoIGlzIGF1dG9tYXRpY2FsbHkgdHJpZ2dlcmVkLlxuXHRcdCAqIEBtZXRob2QgU2Nyb2xsTWFnaWMuU2NlbmUjdHJpZ2dlckVsZW1lbnRcblx0XHQgKiBAZXhhbXBsZVxuXHRcdCAqIC8vIGdldCB0aGUgY3VycmVudCB0cmlnZ2VyRWxlbWVudFxuXHRcdCAqIHZhciB0cmlnZ2VyRWxlbWVudCA9IHNjZW5lLnRyaWdnZXJFbGVtZW50KCk7XG5cdFx0ICpcblx0XHQgKiAvLyBzZXQgYSBuZXcgdHJpZ2dlckVsZW1lbnQgdXNpbmcgYSBzZWxlY3RvclxuXHRcdCAqIHNjZW5lLnRyaWdnZXJFbGVtZW50KFwiI3RyaWdnZXJcIik7XG5cdFx0ICogLy8gc2V0IGEgbmV3IHRyaWdnZXJFbGVtZW50IHVzaW5nIGEgRE9NIG9iamVjdFxuXHRcdCAqIHNjZW5lLnRyaWdnZXJFbGVtZW50KGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwidHJpZ2dlclwiKSk7XG5cdFx0ICpcblx0XHQgKiBAZmlyZXMge0BsaW5rIFNjZW5lLmNoYW5nZX0sIHdoZW4gdXNlZCBhcyBzZXR0ZXJcblx0XHQgKiBAcGFyYW0geyhzdHJpbmd8b2JqZWN0KX0gW25ld1RyaWdnZXJFbGVtZW50XSAtIFRoZSBuZXcgdHJpZ2dlciBlbGVtZW50IGZvciB0aGUgc2NlbmUuXG5cdFx0ICogQHJldHVybnMgeyhzdHJpbmd8b2JqZWN0KX0gYGdldGAgLSAgQ3VycmVudCB0cmlnZ2VyRWxlbWVudC5cblx0XHQgKiBAcmV0dXJucyB7U2NlbmV9IGBzZXRgIC0gIFBhcmVudCBvYmplY3QgZm9yIGNoYWluaW5nLlxuXHRcdCAqL1xuXG5cdFx0LyoqXG5cdFx0ICogKipHZXQqKiBvciAqKlNldCoqIHRoZSB0cmlnZ2VySG9vayBvcHRpb24gdmFsdWUuXG5cdFx0ICogQG1ldGhvZCBTY3JvbGxNYWdpYy5TY2VuZSN0cmlnZ2VySG9va1xuXHRcdCAqIEBleGFtcGxlXG5cdFx0ICogLy8gZ2V0IHRoZSBjdXJyZW50IHRyaWdnZXJIb29rIHZhbHVlXG5cdFx0ICogdmFyIHRyaWdnZXJIb29rID0gc2NlbmUudHJpZ2dlckhvb2soKTtcblx0XHQgKlxuXHRcdCAqIC8vIHNldCBhIG5ldyB0cmlnZ2VySG9vayB1c2luZyBhIHN0cmluZ1xuXHRcdCAqIHNjZW5lLnRyaWdnZXJIb29rKFwib25MZWF2ZVwiKTtcblx0XHQgKiAvLyBzZXQgYSBuZXcgdHJpZ2dlckhvb2sgdXNpbmcgYSBudW1iZXJcblx0XHQgKiBzY2VuZS50cmlnZ2VySG9vaygwLjcpO1xuXHRcdCAqXG5cdFx0ICogQGZpcmVzIHtAbGluayBTY2VuZS5jaGFuZ2V9LCB3aGVuIHVzZWQgYXMgc2V0dGVyXG5cdFx0ICogQGZpcmVzIHtAbGluayBTY2VuZS5zaGlmdH0sIHdoZW4gdXNlZCBhcyBzZXR0ZXJcblx0XHQgKiBAcGFyYW0geyhudW1iZXJ8c3RyaW5nKX0gW25ld1RyaWdnZXJIb29rXSAtIFRoZSBuZXcgdHJpZ2dlckhvb2sgb2YgdGhlIHNjZW5lLiBTZWUge0BsaW5rIFNjZW5lfSBwYXJhbWV0ZXIgZGVzY3JpcHRpb24gZm9yIHZhbHVlIG9wdGlvbnMuXG5cdFx0ICogQHJldHVybnMge251bWJlcn0gYGdldGAgLSAgQ3VycmVudCB0cmlnZ2VySG9vayAoQUxXQVlTIG51bWVyaWNhbCkuXG5cdFx0ICogQHJldHVybnMge1NjZW5lfSBgc2V0YCAtICBQYXJlbnQgb2JqZWN0IGZvciBjaGFpbmluZy5cblx0XHQgKi9cblxuXHRcdC8qKlxuXHRcdCAqICoqR2V0Kiogb3IgKipTZXQqKiB0aGUgcmV2ZXJzZSBvcHRpb24gdmFsdWUuXG5cdFx0ICogQG1ldGhvZCBTY3JvbGxNYWdpYy5TY2VuZSNyZXZlcnNlXG5cdFx0ICogQGV4YW1wbGVcblx0XHQgKiAvLyBnZXQgdGhlIGN1cnJlbnQgcmV2ZXJzZSBvcHRpb25cblx0XHQgKiB2YXIgcmV2ZXJzZSA9IHNjZW5lLnJldmVyc2UoKTtcblx0XHQgKlxuXHRcdCAqIC8vIHNldCBuZXcgcmV2ZXJzZSBvcHRpb25cblx0XHQgKiBzY2VuZS5yZXZlcnNlKGZhbHNlKTtcblx0XHQgKlxuXHRcdCAqIEBmaXJlcyB7QGxpbmsgU2NlbmUuY2hhbmdlfSwgd2hlbiB1c2VkIGFzIHNldHRlclxuXHRcdCAqIEBwYXJhbSB7Ym9vbGVhbn0gW25ld1JldmVyc2VdIC0gVGhlIG5ldyByZXZlcnNlIHNldHRpbmcgb2YgdGhlIHNjZW5lLlxuXHRcdCAqIEByZXR1cm5zIHtib29sZWFufSBgZ2V0YCAtICBDdXJyZW50IHJldmVyc2Ugb3B0aW9uIHZhbHVlLlxuXHRcdCAqIEByZXR1cm5zIHtTY2VuZX0gYHNldGAgLSAgUGFyZW50IG9iamVjdCBmb3IgY2hhaW5pbmcuXG5cdFx0ICovXG5cblx0XHQvKipcblx0XHQgKiAqKkdldCoqIG9yICoqU2V0KiogdGhlIGxvZ2xldmVsIG9wdGlvbiB2YWx1ZS5cblx0XHQgKiBAbWV0aG9kIFNjcm9sbE1hZ2ljLlNjZW5lI2xvZ2xldmVsXG5cdFx0ICogQGV4YW1wbGVcblx0XHQgKiAvLyBnZXQgdGhlIGN1cnJlbnQgbG9nbGV2ZWxcblx0XHQgKiB2YXIgbG9nbGV2ZWwgPSBzY2VuZS5sb2dsZXZlbCgpO1xuXHRcdCAqXG5cdFx0ICogLy8gc2V0IG5ldyBsb2dsZXZlbFxuXHRcdCAqIHNjZW5lLmxvZ2xldmVsKDMpO1xuXHRcdCAqXG5cdFx0ICogQGZpcmVzIHtAbGluayBTY2VuZS5jaGFuZ2V9LCB3aGVuIHVzZWQgYXMgc2V0dGVyXG5cdFx0ICogQHBhcmFtIHtudW1iZXJ9IFtuZXdMb2dsZXZlbF0gLSBUaGUgbmV3IGxvZ2xldmVsIHNldHRpbmcgb2YgdGhlIHNjZW5lLiBgWzAtM11gXG5cdFx0ICogQHJldHVybnMge251bWJlcn0gYGdldGAgLSAgQ3VycmVudCBsb2dsZXZlbC5cblx0XHQgKiBAcmV0dXJucyB7U2NlbmV9IGBzZXRgIC0gIFBhcmVudCBvYmplY3QgZm9yIGNoYWluaW5nLlxuXHRcdCAqL1xuXG5cdFx0LyoqXG5cdFx0ICogKipHZXQqKiB0aGUgYXNzb2NpYXRlZCBjb250cm9sbGVyLlxuXHRcdCAqIEBtZXRob2QgU2Nyb2xsTWFnaWMuU2NlbmUjY29udHJvbGxlclxuXHRcdCAqIEBleGFtcGxlXG5cdFx0ICogLy8gZ2V0IHRoZSBjb250cm9sbGVyIG9mIGEgc2NlbmVcblx0XHQgKiB2YXIgY29udHJvbGxlciA9IHNjZW5lLmNvbnRyb2xsZXIoKTtcblx0XHQgKlxuXHRcdCAqIEByZXR1cm5zIHtTY3JvbGxNYWdpYy5Db250cm9sbGVyfSBQYXJlbnQgY29udHJvbGxlciBvciBgdW5kZWZpbmVkYFxuXHRcdCAqL1xuXHRcdHRoaXMuY29udHJvbGxlciA9IGZ1bmN0aW9uICgpIHtcblx0XHRcdHJldHVybiBfY29udHJvbGxlcjtcblx0XHR9O1xuXG5cdFx0LyoqXG5cdFx0ICogKipHZXQqKiB0aGUgY3VycmVudCBzdGF0ZS5cblx0XHQgKiBAbWV0aG9kIFNjcm9sbE1hZ2ljLlNjZW5lI3N0YXRlXG5cdFx0ICogQGV4YW1wbGVcblx0XHQgKiAvLyBnZXQgdGhlIGN1cnJlbnQgc3RhdGVcblx0XHQgKiB2YXIgc3RhdGUgPSBzY2VuZS5zdGF0ZSgpO1xuXHRcdCAqXG5cdFx0ICogQHJldHVybnMge3N0cmluZ30gYFwiQkVGT1JFXCJgLCBgXCJEVVJJTkdcImAgb3IgYFwiQUZURVJcImBcblx0XHQgKi9cblx0XHR0aGlzLnN0YXRlID0gZnVuY3Rpb24gKCkge1xuXHRcdFx0cmV0dXJuIF9zdGF0ZTtcblx0XHR9O1xuXG5cdFx0LyoqXG5cdFx0ICogKipHZXQqKiB0aGUgY3VycmVudCBzY3JvbGwgb2Zmc2V0IGZvciB0aGUgc3RhcnQgb2YgdGhlIHNjZW5lLiAgXG5cdFx0ICogTWluZCwgdGhhdCB0aGUgc2Nyb2xsT2Zmc2V0IGlzIHJlbGF0ZWQgdG8gdGhlIHNpemUgb2YgdGhlIGNvbnRhaW5lciwgaWYgYHRyaWdnZXJIb29rYCBpcyBiaWdnZXIgdGhhbiBgMGAgKG9yIGBcIm9uTGVhdmVcImApLiAgXG5cdFx0ICogVGhpcyBtZWFucywgdGhhdCByZXNpemluZyB0aGUgY29udGFpbmVyIG9yIGNoYW5naW5nIHRoZSBgdHJpZ2dlckhvb2tgIHdpbGwgaW5mbHVlbmNlIHRoZSBzY2VuZSdzIHN0YXJ0IG9mZnNldC5cblx0XHQgKiBAbWV0aG9kIFNjcm9sbE1hZ2ljLlNjZW5lI3Njcm9sbE9mZnNldFxuXHRcdCAqIEBleGFtcGxlXG5cdFx0ICogLy8gZ2V0IHRoZSBjdXJyZW50IHNjcm9sbCBvZmZzZXQgZm9yIHRoZSBzdGFydCBhbmQgZW5kIG9mIHRoZSBzY2VuZS5cblx0XHQgKiB2YXIgc3RhcnQgPSBzY2VuZS5zY3JvbGxPZmZzZXQoKTtcblx0XHQgKiB2YXIgZW5kID0gc2NlbmUuc2Nyb2xsT2Zmc2V0KCkgKyBzY2VuZS5kdXJhdGlvbigpO1xuXHRcdCAqIGNvbnNvbGUubG9nKFwidGhlIHNjZW5lIHN0YXJ0cyBhdFwiLCBzdGFydCwgXCJhbmQgZW5kcyBhdFwiLCBlbmQpO1xuXHRcdCAqXG5cdFx0ICogQHJldHVybnMge251bWJlcn0gVGhlIHNjcm9sbCBvZmZzZXQgKG9mIHRoZSBjb250YWluZXIpIGF0IHdoaWNoIHRoZSBzY2VuZSB3aWxsIHRyaWdnZXIuIFkgdmFsdWUgZm9yIHZlcnRpY2FsIGFuZCBYIHZhbHVlIGZvciBob3Jpem9udGFsIHNjcm9sbHMuXG5cdFx0ICovXG5cdFx0dGhpcy5zY3JvbGxPZmZzZXQgPSBmdW5jdGlvbiAoKSB7XG5cdFx0XHRyZXR1cm4gX3Njcm9sbE9mZnNldC5zdGFydDtcblx0XHR9O1xuXG5cdFx0LyoqXG5cdFx0ICogKipHZXQqKiB0aGUgdHJpZ2dlciBwb3NpdGlvbiBvZiB0aGUgc2NlbmUgKGluY2x1ZGluZyB0aGUgdmFsdWUgb2YgdGhlIGBvZmZzZXRgIG9wdGlvbikuICBcblx0XHQgKiBAbWV0aG9kIFNjcm9sbE1hZ2ljLlNjZW5lI3RyaWdnZXJQb3NpdGlvblxuXHRcdCAqIEBleGFtcGxlXG5cdFx0ICogLy8gZ2V0IHRoZSBzY2VuZSdzIHRyaWdnZXIgcG9zaXRpb25cblx0XHQgKiB2YXIgdHJpZ2dlclBvc2l0aW9uID0gc2NlbmUudHJpZ2dlclBvc2l0aW9uKCk7XG5cdFx0ICpcblx0XHQgKiBAcmV0dXJucyB7bnVtYmVyfSBTdGFydCBwb3NpdGlvbiBvZiB0aGUgc2NlbmUuIFRvcCBwb3NpdGlvbiB2YWx1ZSBmb3IgdmVydGljYWwgYW5kIGxlZnQgcG9zaXRpb24gdmFsdWUgZm9yIGhvcml6b250YWwgc2Nyb2xscy5cblx0XHQgKi9cblx0XHR0aGlzLnRyaWdnZXJQb3NpdGlvbiA9IGZ1bmN0aW9uICgpIHtcblx0XHRcdHZhciBwb3MgPSBfb3B0aW9ucy5vZmZzZXQ7IC8vIHRoZSBvZmZzZXQgaXMgdGhlIGJhc2lzXG5cdFx0XHRpZiAoX2NvbnRyb2xsZXIpIHtcblx0XHRcdFx0Ly8gZ2V0IHRoZSB0cmlnZ2VyIHBvc2l0aW9uXG5cdFx0XHRcdGlmIChfb3B0aW9ucy50cmlnZ2VyRWxlbWVudCkge1xuXHRcdFx0XHRcdC8vIEVsZW1lbnQgYXMgdHJpZ2dlclxuXHRcdFx0XHRcdHBvcyArPSBfdHJpZ2dlclBvcztcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHQvLyByZXR1cm4gdGhlIGhlaWdodCBvZiB0aGUgdHJpZ2dlckhvb2sgdG8gc3RhcnQgYXQgdGhlIGJlZ2lubmluZ1xuXHRcdFx0XHRcdHBvcyArPSBfY29udHJvbGxlci5pbmZvKFwic2l6ZVwiKSAqIFNjZW5lLnRyaWdnZXJIb29rKCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdHJldHVybiBwb3M7XG5cdFx0fTtcblxuXHRcdHZhclxuXHRcdF9waW4sIF9waW5PcHRpb25zO1xuXG5cdFx0U2NlbmUub24oXCJzaGlmdC5pbnRlcm5hbFwiLCBmdW5jdGlvbiAoZSkge1xuXHRcdFx0dmFyIGR1cmF0aW9uQ2hhbmdlZCA9IGUucmVhc29uID09PSBcImR1cmF0aW9uXCI7XG5cdFx0XHRpZiAoKF9zdGF0ZSA9PT0gU0NFTkVfU1RBVEVfQUZURVIgJiYgZHVyYXRpb25DaGFuZ2VkKSB8fCAoX3N0YXRlID09PSBTQ0VORV9TVEFURV9EVVJJTkcgJiYgX29wdGlvbnMuZHVyYXRpb24gPT09IDApKSB7XG5cdFx0XHRcdC8vIGlmIFtkdXJhdGlvbiBjaGFuZ2VkIGFmdGVyIGEgc2NlbmUgKGluc2lkZSBzY2VuZSBwcm9ncmVzcyB1cGRhdGVzIHBpbiBwb3NpdGlvbildIG9yIFtkdXJhdGlvbiBpcyAwLCB3ZSBhcmUgaW4gcGluIHBoYXNlIGFuZCBzb21lIG90aGVyIHZhbHVlIGNoYW5nZWRdLlxuXHRcdFx0XHR1cGRhdGVQaW5TdGF0ZSgpO1xuXHRcdFx0fVxuXHRcdFx0aWYgKGR1cmF0aW9uQ2hhbmdlZCkge1xuXHRcdFx0XHR1cGRhdGVQaW5EaW1lbnNpb25zKCk7XG5cdFx0XHR9XG5cdFx0fSkub24oXCJwcm9ncmVzcy5pbnRlcm5hbFwiLCBmdW5jdGlvbiAoZSkge1xuXHRcdFx0dXBkYXRlUGluU3RhdGUoKTtcblx0XHR9KS5vbihcImFkZC5pbnRlcm5hbFwiLCBmdW5jdGlvbiAoZSkge1xuXHRcdFx0dXBkYXRlUGluRGltZW5zaW9ucygpO1xuXHRcdH0pLm9uKFwiZGVzdHJveS5pbnRlcm5hbFwiLCBmdW5jdGlvbiAoZSkge1xuXHRcdFx0U2NlbmUucmVtb3ZlUGluKGUucmVzZXQpO1xuXHRcdH0pO1xuXHRcdC8qKlxuXHRcdCAqIFVwZGF0ZSB0aGUgcGluIHN0YXRlLlxuXHRcdCAqIEBwcml2YXRlXG5cdFx0ICovXG5cdFx0dmFyIHVwZGF0ZVBpblN0YXRlID0gZnVuY3Rpb24gKGZvcmNlVW5waW4pIHtcblx0XHRcdGlmIChfcGluICYmIF9jb250cm9sbGVyKSB7XG5cdFx0XHRcdHZhclxuXHRcdFx0XHRjb250YWluZXJJbmZvID0gX2NvbnRyb2xsZXIuaW5mbygpLFxuXHRcdFx0XHRcdHBpblRhcmdldCA9IF9waW5PcHRpb25zLnNwYWNlci5maXJzdENoaWxkOyAvLyBtYXkgYmUgcGluIGVsZW1lbnQgb3IgYW5vdGhlciBzcGFjZXIsIGlmIGNhc2NhZGluZyBwaW5zXG5cdFx0XHRcdGlmICghZm9yY2VVbnBpbiAmJiBfc3RhdGUgPT09IFNDRU5FX1NUQVRFX0RVUklORykgeyAvLyBkdXJpbmcgc2NlbmUgb3IgaWYgZHVyYXRpb24gaXMgMCBhbmQgd2UgYXJlIHBhc3QgdGhlIHRyaWdnZXJcblx0XHRcdFx0XHQvLyBwaW5uZWQgc3RhdGVcblx0XHRcdFx0XHRpZiAoX3V0aWwuY3NzKHBpblRhcmdldCwgXCJwb3NpdGlvblwiKSAhPSBcImZpeGVkXCIpIHtcblx0XHRcdFx0XHRcdC8vIGNoYW5nZSBzdGF0ZSBiZWZvcmUgdXBkYXRpbmcgcGluIHNwYWNlciAocG9zaXRpb24gY2hhbmdlcyBkdWUgdG8gZml4ZWQgY29sbGFwc2luZyBtaWdodCBvY2N1ci4pXG5cdFx0XHRcdFx0XHRfdXRpbC5jc3MocGluVGFyZ2V0LCB7XG5cdFx0XHRcdFx0XHRcdFwicG9zaXRpb25cIjogXCJmaXhlZFwiXG5cdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdC8vIHVwZGF0ZSBwaW4gc3BhY2VyXG5cdFx0XHRcdFx0XHR1cGRhdGVQaW5EaW1lbnNpb25zKCk7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0dmFyXG5cdFx0XHRcdFx0Zml4ZWRQb3MgPSBfdXRpbC5nZXQub2Zmc2V0KF9waW5PcHRpb25zLnNwYWNlciwgdHJ1ZSksXG5cdFx0XHRcdFx0XHQvLyBnZXQgdmlld3BvcnQgcG9zaXRpb24gb2Ygc3BhY2VyXG5cdFx0XHRcdFx0XHRzY3JvbGxEaXN0YW5jZSA9IF9vcHRpb25zLnJldmVyc2UgfHwgX29wdGlvbnMuZHVyYXRpb24gPT09IDAgPyBjb250YWluZXJJbmZvLnNjcm9sbFBvcyAtIF9zY3JvbGxPZmZzZXQuc3RhcnQgLy8gcXVpY2tlclxuXHRcdFx0XHRcdFx0OiBNYXRoLnJvdW5kKF9wcm9ncmVzcyAqIF9vcHRpb25zLmR1cmF0aW9uICogMTApIC8gMTA7IC8vIGlmIG5vIHJldmVyc2UgYW5kIGR1cmluZyBwaW4gdGhlIHBvc2l0aW9uIG5lZWRzIHRvIGJlIHJlY2FsY3VsYXRlZCB1c2luZyB0aGUgcHJvZ3Jlc3Ncblx0XHRcdFx0XHQvLyBhZGQgc2Nyb2xsRGlzdGFuY2Vcblx0XHRcdFx0XHRmaXhlZFBvc1tjb250YWluZXJJbmZvLnZlcnRpY2FsID8gXCJ0b3BcIiA6IFwibGVmdFwiXSArPSBzY3JvbGxEaXN0YW5jZTtcblxuXHRcdFx0XHRcdC8vIHNldCBuZXcgdmFsdWVzXG5cdFx0XHRcdFx0X3V0aWwuY3NzKF9waW5PcHRpb25zLnNwYWNlci5maXJzdENoaWxkLCB7XG5cdFx0XHRcdFx0XHR0b3A6IGZpeGVkUG9zLnRvcCxcblx0XHRcdFx0XHRcdGxlZnQ6IGZpeGVkUG9zLmxlZnRcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHQvLyB1bnBpbm5lZCBzdGF0ZVxuXHRcdFx0XHRcdHZhclxuXHRcdFx0XHRcdG5ld0NTUyA9IHtcblx0XHRcdFx0XHRcdHBvc2l0aW9uOiBfcGluT3B0aW9ucy5pbkZsb3cgPyBcInJlbGF0aXZlXCIgOiBcImFic29sdXRlXCIsXG5cdFx0XHRcdFx0XHR0b3A6IDAsXG5cdFx0XHRcdFx0XHRsZWZ0OiAwXG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdGNoYW5nZSA9IF91dGlsLmNzcyhwaW5UYXJnZXQsIFwicG9zaXRpb25cIikgIT0gbmV3Q1NTLnBvc2l0aW9uO1xuXG5cdFx0XHRcdFx0aWYgKCFfcGluT3B0aW9ucy5wdXNoRm9sbG93ZXJzKSB7XG5cdFx0XHRcdFx0XHRuZXdDU1NbY29udGFpbmVySW5mby52ZXJ0aWNhbCA/IFwidG9wXCIgOiBcImxlZnRcIl0gPSBfb3B0aW9ucy5kdXJhdGlvbiAqIF9wcm9ncmVzcztcblx0XHRcdFx0XHR9IGVsc2UgaWYgKF9vcHRpb25zLmR1cmF0aW9uID4gMCkgeyAvLyBvbmx5IGNvbmNlcm5zIHNjZW5lcyB3aXRoIGR1cmF0aW9uXG5cdFx0XHRcdFx0XHRpZiAoX3N0YXRlID09PSBTQ0VORV9TVEFURV9BRlRFUiAmJiBwYXJzZUZsb2F0KF91dGlsLmNzcyhfcGluT3B0aW9ucy5zcGFjZXIsIFwicGFkZGluZy10b3BcIikpID09PSAwKSB7XG5cdFx0XHRcdFx0XHRcdGNoYW5nZSA9IHRydWU7IC8vIGlmIGluIGFmdGVyIHN0YXRlIGJ1dCBoYXZlbnQgdXBkYXRlZCBzcGFjZXIgeWV0IChqdW1wZWQgcGFzdCBwaW4pXG5cdFx0XHRcdFx0XHR9IGVsc2UgaWYgKF9zdGF0ZSA9PT0gU0NFTkVfU1RBVEVfQkVGT1JFICYmIHBhcnNlRmxvYXQoX3V0aWwuY3NzKF9waW5PcHRpb25zLnNwYWNlciwgXCJwYWRkaW5nLWJvdHRvbVwiKSkgPT09IDApIHsgLy8gYmVmb3JlXG5cdFx0XHRcdFx0XHRcdGNoYW5nZSA9IHRydWU7IC8vIGp1bXBlZCBwYXN0IGZpeGVkIHN0YXRlIHVwd2FyZCBkaXJlY3Rpb25cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0Ly8gc2V0IG5ldyB2YWx1ZXNcblx0XHRcdFx0XHRfdXRpbC5jc3MocGluVGFyZ2V0LCBuZXdDU1MpO1xuXHRcdFx0XHRcdGlmIChjaGFuZ2UpIHtcblx0XHRcdFx0XHRcdC8vIHVwZGF0ZSBwaW4gc3BhY2VyIGlmIHN0YXRlIGNoYW5nZWRcblx0XHRcdFx0XHRcdHVwZGF0ZVBpbkRpbWVuc2lvbnMoKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9O1xuXG5cdFx0LyoqXG5cdFx0ICogVXBkYXRlIHRoZSBwaW4gc3BhY2VyIGFuZC9vciBlbGVtZW50IHNpemUuXG5cdFx0ICogVGhlIHNpemUgb2YgdGhlIHNwYWNlciBuZWVkcyB0byBiZSB1cGRhdGVkIHdoZW5ldmVyIHRoZSBkdXJhdGlvbiBvZiB0aGUgc2NlbmUgY2hhbmdlcywgaWYgaXQgaXMgdG8gcHVzaCBkb3duIGZvbGxvd2luZyBlbGVtZW50cy5cblx0XHQgKiBAcHJpdmF0ZVxuXHRcdCAqL1xuXHRcdHZhciB1cGRhdGVQaW5EaW1lbnNpb25zID0gZnVuY3Rpb24gKCkge1xuXHRcdFx0aWYgKF9waW4gJiYgX2NvbnRyb2xsZXIgJiYgX3Bpbk9wdGlvbnMuaW5GbG93KSB7IC8vIG5vIHNwYWNlcnJlc2l6ZSwgaWYgb3JpZ2luYWwgcG9zaXRpb24gaXMgYWJzb2x1dGVcblx0XHRcdFx0dmFyXG5cdFx0XHRcdGFmdGVyID0gKF9zdGF0ZSA9PT0gU0NFTkVfU1RBVEVfQUZURVIpLFxuXHRcdFx0XHRcdGJlZm9yZSA9IChfc3RhdGUgPT09IFNDRU5FX1NUQVRFX0JFRk9SRSksXG5cdFx0XHRcdFx0ZHVyaW5nID0gKF9zdGF0ZSA9PT0gU0NFTkVfU1RBVEVfRFVSSU5HKSxcblx0XHRcdFx0XHR2ZXJ0aWNhbCA9IF9jb250cm9sbGVyLmluZm8oXCJ2ZXJ0aWNhbFwiKSxcblx0XHRcdFx0XHRwaW5UYXJnZXQgPSBfcGluT3B0aW9ucy5zcGFjZXIuZmlyc3RDaGlsZCxcblx0XHRcdFx0XHQvLyB1c3VhbGx5IHRoZSBwaW5lZCBlbGVtZW50IGJ1dCBjYW4gYWxzbyBiZSBhbm90aGVyIHNwYWNlciAoY2FzY2FkZWQgcGlucylcblx0XHRcdFx0XHRtYXJnaW5Db2xsYXBzZSA9IF91dGlsLmlzTWFyZ2luQ29sbGFwc2VUeXBlKF91dGlsLmNzcyhfcGluT3B0aW9ucy5zcGFjZXIsIFwiZGlzcGxheVwiKSksXG5cdFx0XHRcdFx0Y3NzID0ge307XG5cblx0XHRcdFx0Ly8gc2V0IG5ldyBzaXplXG5cdFx0XHRcdC8vIGlmIHJlbHNpemU6IHNwYWNlciAtPiBwaW4gfCBlbHNlOiBwaW4gLT4gc3BhY2VyXG5cdFx0XHRcdGlmIChfcGluT3B0aW9ucy5yZWxTaXplLndpZHRoIHx8IF9waW5PcHRpb25zLnJlbFNpemUuYXV0b0Z1bGxXaWR0aCkge1xuXHRcdFx0XHRcdGlmIChkdXJpbmcpIHtcblx0XHRcdFx0XHRcdF91dGlsLmNzcyhfcGluLCB7XG5cdFx0XHRcdFx0XHRcdFwid2lkdGhcIjogX3V0aWwuZ2V0LndpZHRoKF9waW5PcHRpb25zLnNwYWNlcilcblx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRfdXRpbC5jc3MoX3Bpbiwge1xuXHRcdFx0XHRcdFx0XHRcIndpZHRoXCI6IFwiMTAwJVwiXG5cdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Ly8gbWlud2lkdGggaXMgbmVlZGVkIGZvciBjYXNjYWRlZCBwaW5zLlxuXHRcdFx0XHRcdGNzc1tcIm1pbi13aWR0aFwiXSA9IF91dGlsLmdldC53aWR0aCh2ZXJ0aWNhbCA/IF9waW4gOiBwaW5UYXJnZXQsIHRydWUsIHRydWUpO1xuXHRcdFx0XHRcdGNzcy53aWR0aCA9IGR1cmluZyA/IGNzc1tcIm1pbi13aWR0aFwiXSA6IFwiYXV0b1wiO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmIChfcGluT3B0aW9ucy5yZWxTaXplLmhlaWdodCkge1xuXHRcdFx0XHRcdGlmIChkdXJpbmcpIHtcblx0XHRcdFx0XHRcdC8vIHRoZSBvbmx5IHBhZGRpbmcgdGhlIHNwYWNlciBzaG91bGQgZXZlciBpbmNsdWRlIGlzIHRoZSBkdXJhdGlvbiAoaWYgcHVzaEZvbGxvd2VycyA9IHRydWUpLCBzbyB3ZSBuZWVkIHRvIHN1YnN0cmFjdCB0aGF0LlxuXHRcdFx0XHRcdFx0X3V0aWwuY3NzKF9waW4sIHtcblx0XHRcdFx0XHRcdFx0XCJoZWlnaHRcIjogX3V0aWwuZ2V0LmhlaWdodChfcGluT3B0aW9ucy5zcGFjZXIpIC0gKF9waW5PcHRpb25zLnB1c2hGb2xsb3dlcnMgPyBfb3B0aW9ucy5kdXJhdGlvbiA6IDApXG5cdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0X3V0aWwuY3NzKF9waW4sIHtcblx0XHRcdFx0XHRcdFx0XCJoZWlnaHRcIjogXCIxMDAlXCJcblx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHQvLyBtYXJnaW4gaXMgb25seSBpbmNsdWRlZCBpZiBpdCdzIGEgY2FzY2FkZWQgcGluIHRvIHJlc29sdmUgYW4gSUU5IGJ1Z1xuXHRcdFx0XHRcdGNzc1tcIm1pbi1oZWlnaHRcIl0gPSBfdXRpbC5nZXQuaGVpZ2h0KHZlcnRpY2FsID8gcGluVGFyZ2V0IDogX3BpbiwgdHJ1ZSwgIW1hcmdpbkNvbGxhcHNlKTsgLy8gbmVlZGVkIGZvciBjYXNjYWRpbmcgcGluc1xuXHRcdFx0XHRcdGNzcy5oZWlnaHQgPSBkdXJpbmcgPyBjc3NbXCJtaW4taGVpZ2h0XCJdIDogXCJhdXRvXCI7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBhZGQgc3BhY2UgZm9yIGR1cmF0aW9uIGlmIHB1c2hGb2xsb3dlcnMgaXMgdHJ1ZVxuXHRcdFx0XHRpZiAoX3Bpbk9wdGlvbnMucHVzaEZvbGxvd2Vycykge1xuXHRcdFx0XHRcdGNzc1tcInBhZGRpbmdcIiArICh2ZXJ0aWNhbCA/IFwiVG9wXCIgOiBcIkxlZnRcIildID0gX29wdGlvbnMuZHVyYXRpb24gKiBfcHJvZ3Jlc3M7XG5cdFx0XHRcdFx0Y3NzW1wicGFkZGluZ1wiICsgKHZlcnRpY2FsID8gXCJCb3R0b21cIiA6IFwiUmlnaHRcIildID0gX29wdGlvbnMuZHVyYXRpb24gKiAoMSAtIF9wcm9ncmVzcyk7XG5cdFx0XHRcdH1cblx0XHRcdFx0X3V0aWwuY3NzKF9waW5PcHRpb25zLnNwYWNlciwgY3NzKTtcblx0XHRcdH1cblx0XHR9O1xuXG5cdFx0LyoqXG5cdFx0ICogVXBkYXRlcyB0aGUgUGluIHN0YXRlIChpbiBjZXJ0YWluIHNjZW5hcmlvcylcblx0XHQgKiBJZiB0aGUgY29udHJvbGxlciBjb250YWluZXIgaXMgbm90IHRoZSBkb2N1bWVudCBhbmQgd2UgYXJlIG1pZC1waW4tcGhhc2Ugc2Nyb2xsaW5nIG9yIHJlc2l6aW5nIHRoZSBtYWluIGRvY3VtZW50IGNhbiByZXN1bHQgdG8gd3JvbmcgcGluIHBvc2l0aW9ucy5cblx0XHQgKiBTbyB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBvbiByZXNpemUgYW5kIHNjcm9sbCBvZiB0aGUgZG9jdW1lbnQuXG5cdFx0ICogQHByaXZhdGVcblx0XHQgKi9cblx0XHR2YXIgdXBkYXRlUGluSW5Db250YWluZXIgPSBmdW5jdGlvbiAoKSB7XG5cdFx0XHRpZiAoX2NvbnRyb2xsZXIgJiYgX3BpbiAmJiBfc3RhdGUgPT09IFNDRU5FX1NUQVRFX0RVUklORyAmJiAhX2NvbnRyb2xsZXIuaW5mbyhcImlzRG9jdW1lbnRcIikpIHtcblx0XHRcdFx0dXBkYXRlUGluU3RhdGUoKTtcblx0XHRcdH1cblx0XHR9O1xuXG5cdFx0LyoqXG5cdFx0ICogVXBkYXRlcyB0aGUgUGluIHNwYWNlciBzaXplIHN0YXRlIChpbiBjZXJ0YWluIHNjZW5hcmlvcylcblx0XHQgKiBJZiBjb250YWluZXIgaXMgcmVzaXplZCBkdXJpbmcgcGluIGFuZCByZWxhdGl2ZWx5IHNpemVkIHRoZSBzaXplIG9mIHRoZSBwaW4gbWlnaHQgbmVlZCB0byBiZSB1cGRhdGVkLi4uXG5cdFx0ICogU28gdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgb24gcmVzaXplIG9mIHRoZSBjb250YWluZXIuXG5cdFx0ICogQHByaXZhdGVcblx0XHQgKi9cblx0XHR2YXIgdXBkYXRlUmVsYXRpdmVQaW5TcGFjZXIgPSBmdW5jdGlvbiAoKSB7XG5cdFx0XHRpZiAoX2NvbnRyb2xsZXIgJiYgX3BpbiAmJiAvLyB3ZWxsLCBkdWhcblx0XHRcdF9zdGF0ZSA9PT0gU0NFTkVfU1RBVEVfRFVSSU5HICYmIC8vIGVsZW1lbnQgaW4gcGlubmVkIHN0YXRlP1xuXHRcdFx0KCAvLyBpcyB3aWR0aCBvciBoZWlnaHQgcmVsYXRpdmVseSBzaXplZCwgYnV0IG5vdCBpbiByZWxhdGlvbiB0byBib2R5PyB0aGVuIHdlIG5lZWQgdG8gcmVjYWxjLlxuXHRcdFx0KChfcGluT3B0aW9ucy5yZWxTaXplLndpZHRoIHx8IF9waW5PcHRpb25zLnJlbFNpemUuYXV0b0Z1bGxXaWR0aCkgJiYgX3V0aWwuZ2V0LndpZHRoKHdpbmRvdykgIT0gX3V0aWwuZ2V0LndpZHRoKF9waW5PcHRpb25zLnNwYWNlci5wYXJlbnROb2RlKSkgfHwgKF9waW5PcHRpb25zLnJlbFNpemUuaGVpZ2h0ICYmIF91dGlsLmdldC5oZWlnaHQod2luZG93KSAhPSBfdXRpbC5nZXQuaGVpZ2h0KF9waW5PcHRpb25zLnNwYWNlci5wYXJlbnROb2RlKSkpKSB7XG5cdFx0XHRcdHVwZGF0ZVBpbkRpbWVuc2lvbnMoKTtcblx0XHRcdH1cblx0XHR9O1xuXG5cdFx0LyoqXG5cdFx0ICogSXMgY2FsbGVkLCB3aGVuIHRoZSBtb3VzZXdoZWwgaXMgdXNlZCB3aGlsZSBvdmVyIGEgcGlubmVkIGVsZW1lbnQgaW5zaWRlIGEgZGl2IGNvbnRhaW5lci5cblx0XHQgKiBJZiB0aGUgc2NlbmUgaXMgaW4gZml4ZWQgc3RhdGUgc2Nyb2xsIGV2ZW50cyB3b3VsZCBiZSBjb3VudGVkIHRvd2FyZHMgdGhlIGJvZHkuIFRoaXMgZm9yd2FyZHMgdGhlIGV2ZW50IHRvIHRoZSBzY3JvbGwgY29udGFpbmVyLlxuXHRcdCAqIEBwcml2YXRlXG5cdFx0ICovXG5cdFx0dmFyIG9uTW91c2V3aGVlbE92ZXJQaW4gPSBmdW5jdGlvbiAoZSkge1xuXHRcdFx0aWYgKF9jb250cm9sbGVyICYmIF9waW4gJiYgX3N0YXRlID09PSBTQ0VORV9TVEFURV9EVVJJTkcgJiYgIV9jb250cm9sbGVyLmluZm8oXCJpc0RvY3VtZW50XCIpKSB7IC8vIGluIHBpbiBzdGF0ZVxuXHRcdFx0XHRlLnByZXZlbnREZWZhdWx0KCk7XG5cdFx0XHRcdF9jb250cm9sbGVyLl9zZXRTY3JvbGxQb3MoX2NvbnRyb2xsZXIuaW5mbyhcInNjcm9sbFBvc1wiKSAtICgoZS53aGVlbERlbHRhIHx8IGVbX2NvbnRyb2xsZXIuaW5mbyhcInZlcnRpY2FsXCIpID8gXCJ3aGVlbERlbHRhWVwiIDogXCJ3aGVlbERlbHRhWFwiXSkgLyAzIHx8IC1lLmRldGFpbCAqIDMwKSk7XG5cdFx0XHR9XG5cdFx0fTtcblxuXHRcdC8qKlxuXHRcdCAqIFBpbiBhbiBlbGVtZW50IGZvciB0aGUgZHVyYXRpb24gb2YgdGhlIHR3ZWVuLiAgXG5cdFx0ICogSWYgdGhlIHNjZW5lIGR1cmF0aW9uIGlzIDAgdGhlIGVsZW1lbnQgd2lsbCBvbmx5IGJlIHVucGlubmVkLCBpZiB0aGUgdXNlciBzY3JvbGxzIGJhY2sgcGFzdCB0aGUgc3RhcnQgcG9zaXRpb24uICBcblx0XHQgKiBNYWtlIHN1cmUgb25seSBvbmUgcGluIGlzIGFwcGxpZWQgdG8gYW4gZWxlbWVudCBhdCB0aGUgc2FtZSB0aW1lLlxuXHRcdCAqIEFuIGVsZW1lbnQgY2FuIGJlIHBpbm5lZCBtdWx0aXBsZSB0aW1lcywgYnV0IG9ubHkgc3VjY2Vzc2l2ZWx5LlxuXHRcdCAqIF8qKk5PVEU6KiogVGhlIG9wdGlvbiBgcHVzaEZvbGxvd2Vyc2AgaGFzIG5vIGVmZmVjdCwgd2hlbiB0aGUgc2NlbmUgZHVyYXRpb24gaXMgMC5fXG5cdFx0ICogQG1ldGhvZCBTY3JvbGxNYWdpYy5TY2VuZSNzZXRQaW5cblx0XHQgKiBAZXhhbXBsZVxuXHRcdCAqIC8vIHBpbiBlbGVtZW50IGFuZCBwdXNoIGFsbCBmb2xsb3dpbmcgZWxlbWVudHMgZG93biBieSB0aGUgYW1vdW50IG9mIHRoZSBwaW4gZHVyYXRpb24uXG5cdFx0ICogc2NlbmUuc2V0UGluKFwiI3BpblwiKTtcblx0XHQgKlxuXHRcdCAqIC8vIHBpbiBlbGVtZW50IGFuZCBrZWVwaW5nIGFsbCBmb2xsb3dpbmcgZWxlbWVudHMgaW4gdGhlaXIgcGxhY2UuIFRoZSBwaW5uZWQgZWxlbWVudCB3aWxsIG1vdmUgcGFzdCB0aGVtLlxuXHRcdCAqIHNjZW5lLnNldFBpbihcIiNwaW5cIiwge3B1c2hGb2xsb3dlcnM6IGZhbHNlfSk7XG5cdFx0ICpcblx0XHQgKiBAcGFyYW0geyhzdHJpbmd8b2JqZWN0KX0gZWxlbWVudCAtIEEgU2VsZWN0b3IgdGFyZ2V0aW5nIGFuIGVsZW1lbnQgb3IgYSBET00gb2JqZWN0IHRoYXQgaXMgc3VwcG9zZWQgdG8gYmUgcGlubmVkLlxuXHRcdCAqIEBwYXJhbSB7b2JqZWN0fSBbc2V0dGluZ3NdIC0gc2V0dGluZ3MgZm9yIHRoZSBwaW5cblx0XHQgKiBAcGFyYW0ge2Jvb2xlYW59IFtzZXR0aW5ncy5wdXNoRm9sbG93ZXJzPXRydWVdIC0gSWYgYHRydWVgIGZvbGxvd2luZyBlbGVtZW50cyB3aWxsIGJlIFwicHVzaGVkXCIgZG93biBmb3IgdGhlIGR1cmF0aW9uIG9mIHRoZSBwaW4sIGlmIGBmYWxzZWAgdGhlIHBpbm5lZCBlbGVtZW50IHdpbGwganVzdCBzY3JvbGwgcGFzdCB0aGVtLiAgXG5cdFx0IElnbm9yZWQsIHdoZW4gZHVyYXRpb24gaXMgYDBgLlxuXHRcdCAqIEBwYXJhbSB7c3RyaW5nfSBbc2V0dGluZ3Muc3BhY2VyQ2xhc3M9XCJzY3JvbGxtYWdpYy1waW4tc3BhY2VyXCJdIC0gQ2xhc3NuYW1lIG9mIHRoZSBwaW4gc3BhY2VyIGVsZW1lbnQsIHdoaWNoIGlzIHVzZWQgdG8gcmVwbGFjZSB0aGUgZWxlbWVudC5cblx0XHQgKlxuXHRcdCAqIEByZXR1cm5zIHtTY2VuZX0gUGFyZW50IG9iamVjdCBmb3IgY2hhaW5pbmcuXG5cdFx0ICovXG5cdFx0dGhpcy5zZXRQaW4gPSBmdW5jdGlvbiAoZWxlbWVudCwgc2V0dGluZ3MpIHtcblx0XHRcdHZhclxuXHRcdFx0ZGVmYXVsdFNldHRpbmdzID0ge1xuXHRcdFx0XHRwdXNoRm9sbG93ZXJzOiB0cnVlLFxuXHRcdFx0XHRzcGFjZXJDbGFzczogXCJzY3JvbGxtYWdpYy1waW4tc3BhY2VyXCJcblx0XHRcdH07XG5cdFx0XHRzZXR0aW5ncyA9IF91dGlsLmV4dGVuZCh7fSwgZGVmYXVsdFNldHRpbmdzLCBzZXR0aW5ncyk7XG5cblx0XHRcdC8vIHZhbGlkYXRlIEVsZW1lbnRcblx0XHRcdGVsZW1lbnQgPSBfdXRpbC5nZXQuZWxlbWVudHMoZWxlbWVudClbMF07XG5cdFx0XHRpZiAoIWVsZW1lbnQpIHtcblx0XHRcdFx0bG9nKDEsIFwiRVJST1IgY2FsbGluZyBtZXRob2QgJ3NldFBpbigpJzogSW52YWxpZCBwaW4gZWxlbWVudCBzdXBwbGllZC5cIik7XG5cdFx0XHRcdHJldHVybiBTY2VuZTsgLy8gY2FuY2VsXG5cdFx0XHR9IGVsc2UgaWYgKF91dGlsLmNzcyhlbGVtZW50LCBcInBvc2l0aW9uXCIpID09PSBcImZpeGVkXCIpIHtcblx0XHRcdFx0bG9nKDEsIFwiRVJST1IgY2FsbGluZyBtZXRob2QgJ3NldFBpbigpJzogUGluIGRvZXMgbm90IHdvcmsgd2l0aCBlbGVtZW50cyB0aGF0IGFyZSBwb3NpdGlvbmVkICdmaXhlZCcuXCIpO1xuXHRcdFx0XHRyZXR1cm4gU2NlbmU7IC8vIGNhbmNlbFxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoX3BpbikgeyAvLyBwcmVleGlzdGluZyBwaW4/XG5cdFx0XHRcdGlmIChfcGluID09PSBlbGVtZW50KSB7XG5cdFx0XHRcdFx0Ly8gc2FtZSBwaW4gd2UgYWxyZWFkeSBoYXZlIC0+IGRvIG5vdGhpbmdcblx0XHRcdFx0XHRyZXR1cm4gU2NlbmU7IC8vIGNhbmNlbFxuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdC8vIGtpbGwgb2xkIHBpblxuXHRcdFx0XHRcdFNjZW5lLnJlbW92ZVBpbigpO1xuXHRcdFx0XHR9XG5cblx0XHRcdH1cblx0XHRcdF9waW4gPSBlbGVtZW50O1xuXG5cdFx0XHR2YXJcblx0XHRcdHBhcmVudERpc3BsYXkgPSBfcGluLnBhcmVudE5vZGUuc3R5bGUuZGlzcGxheSxcblx0XHRcdFx0Ym91bmRzUGFyYW1zID0gW1widG9wXCIsIFwibGVmdFwiLCBcImJvdHRvbVwiLCBcInJpZ2h0XCIsIFwibWFyZ2luXCIsIFwibWFyZ2luTGVmdFwiLCBcIm1hcmdpblJpZ2h0XCIsIFwibWFyZ2luVG9wXCIsIFwibWFyZ2luQm90dG9tXCJdO1xuXG5cdFx0XHRfcGluLnBhcmVudE5vZGUuc3R5bGUuZGlzcGxheSA9ICdub25lJzsgLy8gaGFjayBzdGFydCB0byBmb3JjZSBjc3MgdG8gcmV0dXJuIHN0eWxlc2hlZXQgdmFsdWVzIGluc3RlYWQgb2YgY2FsY3VsYXRlZCBweCB2YWx1ZXMuXG5cdFx0XHR2YXJcblx0XHRcdGluRmxvdyA9IF91dGlsLmNzcyhfcGluLCBcInBvc2l0aW9uXCIpICE9IFwiYWJzb2x1dGVcIixcblx0XHRcdFx0cGluQ1NTID0gX3V0aWwuY3NzKF9waW4sIGJvdW5kc1BhcmFtcy5jb25jYXQoW1wiZGlzcGxheVwiXSkpLFxuXHRcdFx0XHRzaXplQ1NTID0gX3V0aWwuY3NzKF9waW4sIFtcIndpZHRoXCIsIFwiaGVpZ2h0XCJdKTtcblx0XHRcdF9waW4ucGFyZW50Tm9kZS5zdHlsZS5kaXNwbGF5ID0gcGFyZW50RGlzcGxheTsgLy8gaGFjayBlbmQuXG5cdFx0XHRpZiAoIWluRmxvdyAmJiBzZXR0aW5ncy5wdXNoRm9sbG93ZXJzKSB7XG5cdFx0XHRcdGxvZygyLCBcIldBUk5JTkc6IElmIHRoZSBwaW5uZWQgZWxlbWVudCBpcyBwb3NpdGlvbmVkIGFic29sdXRlbHkgcHVzaEZvbGxvd2VycyB3aWxsIGJlIGRpc2FibGVkLlwiKTtcblx0XHRcdFx0c2V0dGluZ3MucHVzaEZvbGxvd2VycyA9IGZhbHNlO1xuXHRcdFx0fVxuXHRcdFx0d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24gKCkgeyAvLyB3YWl0IHVudGlsIGFsbCBmaW5pc2hlZCwgYmVjYXVzZSB3aXRoIHJlc3BvbnNpdmUgZHVyYXRpb24gaXQgd2lsbCBvbmx5IGJlIHNldCBhZnRlciBzY2VuZSBpcyBhZGRlZCB0byBjb250cm9sbGVyXG5cdFx0XHRcdGlmIChfcGluICYmIF9vcHRpb25zLmR1cmF0aW9uID09PSAwICYmIHNldHRpbmdzLnB1c2hGb2xsb3dlcnMpIHtcblx0XHRcdFx0XHRsb2coMiwgXCJXQVJOSU5HOiBwdXNoRm9sbG93ZXJzID1cIiwgdHJ1ZSwgXCJoYXMgbm8gZWZmZWN0LCB3aGVuIHNjZW5lIGR1cmF0aW9uIGlzIDAuXCIpO1xuXHRcdFx0XHR9XG5cdFx0XHR9LCAwKTtcblxuXHRcdFx0Ly8gY3JlYXRlIHNwYWNlciBhbmQgaW5zZXJ0XG5cdFx0XHR2YXJcblx0XHRcdHNwYWNlciA9IF9waW4ucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2JyksIF9waW4pLFxuXHRcdFx0XHRzcGFjZXJDU1MgPSBfdXRpbC5leHRlbmQocGluQ1NTLCB7XG5cdFx0XHRcdFx0cG9zaXRpb246IGluRmxvdyA/IFwicmVsYXRpdmVcIiA6IFwiYWJzb2x1dGVcIixcblx0XHRcdFx0XHRib3hTaXppbmc6IFwiY29udGVudC1ib3hcIixcblx0XHRcdFx0XHRtb3pCb3hTaXppbmc6IFwiY29udGVudC1ib3hcIixcblx0XHRcdFx0XHR3ZWJraXRCb3hTaXppbmc6IFwiY29udGVudC1ib3hcIlxuXHRcdFx0XHR9KTtcblxuXHRcdFx0aWYgKCFpbkZsb3cpIHsgLy8gY29weSBzaXplIGlmIHBvc2l0aW9uZWQgYWJzb2x1dGVseSwgdG8gd29yayBmb3IgYm90dG9tL3JpZ2h0IHBvc2l0aW9uZWQgZWxlbWVudHMuXG5cdFx0XHRcdF91dGlsLmV4dGVuZChzcGFjZXJDU1MsIF91dGlsLmNzcyhfcGluLCBbXCJ3aWR0aFwiLCBcImhlaWdodFwiXSkpO1xuXHRcdFx0fVxuXG5cdFx0XHRfdXRpbC5jc3Moc3BhY2VyLCBzcGFjZXJDU1MpO1xuXHRcdFx0c3BhY2VyLnNldEF0dHJpYnV0ZShQSU5fU1BBQ0VSX0FUVFJJQlVURSwgXCJcIik7XG5cdFx0XHRfdXRpbC5hZGRDbGFzcyhzcGFjZXIsIHNldHRpbmdzLnNwYWNlckNsYXNzKTtcblxuXHRcdFx0Ly8gc2V0IHRoZSBwaW4gT3B0aW9uc1xuXHRcdFx0X3Bpbk9wdGlvbnMgPSB7XG5cdFx0XHRcdHNwYWNlcjogc3BhY2VyLFxuXHRcdFx0XHRyZWxTaXplOiB7IC8vIHNhdmUgaWYgc2l6ZSBpcyBkZWZpbmVkIHVzaW5nICUgdmFsdWVzLiBpZiBzbywgaGFuZGxlIHNwYWNlciByZXNpemUgZGlmZmVyZW50bHkuLi5cblx0XHRcdFx0XHR3aWR0aDogc2l6ZUNTUy53aWR0aC5zbGljZSgtMSkgPT09IFwiJVwiLFxuXHRcdFx0XHRcdGhlaWdodDogc2l6ZUNTUy5oZWlnaHQuc2xpY2UoLTEpID09PSBcIiVcIixcblx0XHRcdFx0XHRhdXRvRnVsbFdpZHRoOiBzaXplQ1NTLndpZHRoID09PSBcImF1dG9cIiAmJiBpbkZsb3cgJiYgX3V0aWwuaXNNYXJnaW5Db2xsYXBzZVR5cGUocGluQ1NTLmRpc3BsYXkpXG5cdFx0XHRcdH0sXG5cdFx0XHRcdHB1c2hGb2xsb3dlcnM6IHNldHRpbmdzLnB1c2hGb2xsb3dlcnMsXG5cdFx0XHRcdGluRmxvdzogaW5GbG93LFxuXHRcdFx0XHQvLyBzdG9yZXMgaWYgdGhlIGVsZW1lbnQgdGFrZXMgdXAgc3BhY2UgaW4gdGhlIGRvY3VtZW50IGZsb3dcblx0XHRcdH07XG5cblx0XHRcdGlmICghX3Bpbi5fX19vcmlnU3R5bGUpIHtcblx0XHRcdFx0X3Bpbi5fX19vcmlnU3R5bGUgPSB7fTtcblx0XHRcdFx0dmFyXG5cdFx0XHRcdHBpbklubGluZUNTUyA9IF9waW4uc3R5bGUsXG5cdFx0XHRcdFx0Y29weVN0eWxlcyA9IGJvdW5kc1BhcmFtcy5jb25jYXQoW1wid2lkdGhcIiwgXCJoZWlnaHRcIiwgXCJwb3NpdGlvblwiLCBcImJveFNpemluZ1wiLCBcIm1vekJveFNpemluZ1wiLCBcIndlYmtpdEJveFNpemluZ1wiXSk7XG5cdFx0XHRcdGNvcHlTdHlsZXMuZm9yRWFjaChmdW5jdGlvbiAodmFsKSB7XG5cdFx0XHRcdFx0X3Bpbi5fX19vcmlnU3R5bGVbdmFsXSA9IHBpbklubGluZUNTU1t2YWxdIHx8IFwiXCI7XG5cdFx0XHRcdH0pO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBpZiByZWxhdGl2ZSBzaXplLCB0cmFuc2ZlciBpdCB0byBzcGFjZXIgYW5kIG1ha2UgcGluIGNhbGN1bGF0ZSBpdC4uLlxuXHRcdFx0aWYgKF9waW5PcHRpb25zLnJlbFNpemUud2lkdGgpIHtcblx0XHRcdFx0X3V0aWwuY3NzKHNwYWNlciwge1xuXHRcdFx0XHRcdHdpZHRoOiBzaXplQ1NTLndpZHRoXG5cdFx0XHRcdH0pO1xuXHRcdFx0fVxuXHRcdFx0aWYgKF9waW5PcHRpb25zLnJlbFNpemUuaGVpZ2h0KSB7XG5cdFx0XHRcdF91dGlsLmNzcyhzcGFjZXIsIHtcblx0XHRcdFx0XHRoZWlnaHQ6IHNpemVDU1MuaGVpZ2h0XG5cdFx0XHRcdH0pO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBub3cgcGxhY2UgdGhlIHBpbiBlbGVtZW50IGluc2lkZSB0aGUgc3BhY2VyXHRcblx0XHRcdHNwYWNlci5hcHBlbmRDaGlsZChfcGluKTtcblx0XHRcdC8vIGFuZCBzZXQgbmV3IGNzc1xuXHRcdFx0X3V0aWwuY3NzKF9waW4sIHtcblx0XHRcdFx0cG9zaXRpb246IGluRmxvdyA/IFwicmVsYXRpdmVcIiA6IFwiYWJzb2x1dGVcIixcblx0XHRcdFx0bWFyZ2luOiBcImF1dG9cIixcblx0XHRcdFx0dG9wOiBcImF1dG9cIixcblx0XHRcdFx0bGVmdDogXCJhdXRvXCIsXG5cdFx0XHRcdGJvdHRvbTogXCJhdXRvXCIsXG5cdFx0XHRcdHJpZ2h0OiBcImF1dG9cIlxuXHRcdFx0fSk7XG5cblx0XHRcdGlmIChfcGluT3B0aW9ucy5yZWxTaXplLndpZHRoIHx8IF9waW5PcHRpb25zLnJlbFNpemUuYXV0b0Z1bGxXaWR0aCkge1xuXHRcdFx0XHRfdXRpbC5jc3MoX3Bpbiwge1xuXHRcdFx0XHRcdGJveFNpemluZzogXCJib3JkZXItYm94XCIsXG5cdFx0XHRcdFx0bW96Qm94U2l6aW5nOiBcImJvcmRlci1ib3hcIixcblx0XHRcdFx0XHR3ZWJraXRCb3hTaXppbmc6IFwiYm9yZGVyLWJveFwiXG5cdFx0XHRcdH0pO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBhZGQgbGlzdGVuZXIgdG8gZG9jdW1lbnQgdG8gdXBkYXRlIHBpbiBwb3NpdGlvbiBpbiBjYXNlIGNvbnRyb2xsZXIgaXMgbm90IHRoZSBkb2N1bWVudC5cblx0XHRcdHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdzY3JvbGwnLCB1cGRhdGVQaW5JbkNvbnRhaW5lcik7XG5cdFx0XHR3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigncmVzaXplJywgdXBkYXRlUGluSW5Db250YWluZXIpO1xuXHRcdFx0d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIHVwZGF0ZVJlbGF0aXZlUGluU3BhY2VyKTtcblx0XHRcdC8vIGFkZCBtb3VzZXdoZWVsIGxpc3RlbmVyIHRvIGNhdGNoIHNjcm9sbHMgb3ZlciBmaXhlZCBlbGVtZW50c1xuXHRcdFx0X3Bpbi5hZGRFdmVudExpc3RlbmVyKFwibW91c2V3aGVlbFwiLCBvbk1vdXNld2hlZWxPdmVyUGluKTtcblx0XHRcdF9waW4uYWRkRXZlbnRMaXN0ZW5lcihcIkRPTU1vdXNlU2Nyb2xsXCIsIG9uTW91c2V3aGVlbE92ZXJQaW4pO1xuXG5cdFx0XHRsb2coMywgXCJhZGRlZCBwaW5cIik7XG5cblx0XHRcdC8vIGZpbmFsbHkgdXBkYXRlIHRoZSBwaW4gdG8gaW5pdFxuXHRcdFx0dXBkYXRlUGluU3RhdGUoKTtcblxuXHRcdFx0cmV0dXJuIFNjZW5lO1xuXHRcdH07XG5cblx0XHQvKipcblx0XHQgKiBSZW1vdmUgdGhlIHBpbiBmcm9tIHRoZSBzY2VuZS5cblx0XHQgKiBAbWV0aG9kIFNjcm9sbE1hZ2ljLlNjZW5lI3JlbW92ZVBpblxuXHRcdCAqIEBleGFtcGxlXG5cdFx0ICogLy8gcmVtb3ZlIHRoZSBwaW4gZnJvbSB0aGUgc2NlbmUgd2l0aG91dCByZXNldHRpbmcgaXQgKHRoZSBzcGFjZXIgaXMgbm90IHJlbW92ZWQpXG5cdFx0ICogc2NlbmUucmVtb3ZlUGluKCk7XG5cdFx0ICpcblx0XHQgKiAvLyByZW1vdmUgdGhlIHBpbiBmcm9tIHRoZSBzY2VuZSBhbmQgcmVzZXQgdGhlIHBpbiBlbGVtZW50IHRvIGl0cyBpbml0aWFsIHBvc2l0aW9uIChzcGFjZXIgaXMgcmVtb3ZlZClcblx0XHQgKiBzY2VuZS5yZW1vdmVQaW4odHJ1ZSk7XG5cdFx0ICpcblx0XHQgKiBAcGFyYW0ge2Jvb2xlYW59IFtyZXNldD1mYWxzZV0gLSBJZiBgZmFsc2VgIHRoZSBzcGFjZXIgd2lsbCBub3QgYmUgcmVtb3ZlZCBhbmQgdGhlIGVsZW1lbnQncyBwb3NpdGlvbiB3aWxsIG5vdCBiZSByZXNldC5cblx0XHQgKiBAcmV0dXJucyB7U2NlbmV9IFBhcmVudCBvYmplY3QgZm9yIGNoYWluaW5nLlxuXHRcdCAqL1xuXHRcdHRoaXMucmVtb3ZlUGluID0gZnVuY3Rpb24gKHJlc2V0KSB7XG5cdFx0XHRpZiAoX3Bpbikge1xuXHRcdFx0XHRpZiAoX3N0YXRlID09PSBTQ0VORV9TVEFURV9EVVJJTkcpIHtcblx0XHRcdFx0XHR1cGRhdGVQaW5TdGF0ZSh0cnVlKTsgLy8gZm9yY2UgdW5waW4gYXQgcG9zaXRpb25cblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAocmVzZXQgfHwgIV9jb250cm9sbGVyKSB7IC8vIGlmIHRoZXJlJ3Mgbm8gY29udHJvbGxlciBubyBwcm9ncmVzcyB3YXMgbWFkZSBhbnl3YXkuLi5cblx0XHRcdFx0XHR2YXIgcGluVGFyZ2V0ID0gX3Bpbk9wdGlvbnMuc3BhY2VyLmZpcnN0Q2hpbGQ7IC8vIHVzdWFsbHkgdGhlIHBpbiBlbGVtZW50LCBidXQgbWF5IGJlIGFub3RoZXIgc3BhY2VyIChjYXNjYWRlZCBwaW5zKS4uLlxuXHRcdFx0XHRcdGlmIChwaW5UYXJnZXQuaGFzQXR0cmlidXRlKFBJTl9TUEFDRVJfQVRUUklCVVRFKSkgeyAvLyBjb3B5IG1hcmdpbnMgdG8gY2hpbGQgc3BhY2VyXG5cdFx0XHRcdFx0XHR2YXJcblx0XHRcdFx0XHRcdHN0eWxlID0gX3Bpbk9wdGlvbnMuc3BhY2VyLnN0eWxlLFxuXHRcdFx0XHRcdFx0XHR2YWx1ZXMgPSBbXCJtYXJnaW5cIiwgXCJtYXJnaW5MZWZ0XCIsIFwibWFyZ2luUmlnaHRcIiwgXCJtYXJnaW5Ub3BcIiwgXCJtYXJnaW5Cb3R0b21cIl07XG5cdFx0XHRcdFx0XHRtYXJnaW5zID0ge307XG5cdFx0XHRcdFx0XHR2YWx1ZXMuZm9yRWFjaChmdW5jdGlvbiAodmFsKSB7XG5cdFx0XHRcdFx0XHRcdG1hcmdpbnNbdmFsXSA9IHN0eWxlW3ZhbF0gfHwgXCJcIjtcblx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0X3V0aWwuY3NzKHBpblRhcmdldCwgbWFyZ2lucyk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdF9waW5PcHRpb25zLnNwYWNlci5wYXJlbnROb2RlLmluc2VydEJlZm9yZShwaW5UYXJnZXQsIF9waW5PcHRpb25zLnNwYWNlcik7XG5cdFx0XHRcdFx0X3Bpbk9wdGlvbnMuc3BhY2VyLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoX3Bpbk9wdGlvbnMuc3BhY2VyKTtcblx0XHRcdFx0XHRpZiAoIV9waW4ucGFyZW50Tm9kZS5oYXNBdHRyaWJ1dGUoUElOX1NQQUNFUl9BVFRSSUJVVEUpKSB7IC8vIGlmIGl0J3MgdGhlIGxhc3QgcGluIGZvciB0aGlzIGVsZW1lbnQgLT4gcmVzdG9yZSBpbmxpbmUgc3R5bGVzXG5cdFx0XHRcdFx0XHQvLyBUT0RPOiBvbmx5IGNvcnJlY3RseSBzZXQgZm9yIGZpcnN0IHBpbiAod2hlbiBjYXNjYWRpbmcpIC0gaG93IHRvIGZpeD9cblx0XHRcdFx0XHRcdF91dGlsLmNzcyhfcGluLCBfcGluLl9fX29yaWdTdHlsZSk7XG5cdFx0XHRcdFx0XHRkZWxldGUgX3Bpbi5fX19vcmlnU3R5bGU7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdzY3JvbGwnLCB1cGRhdGVQaW5JbkNvbnRhaW5lcik7XG5cdFx0XHRcdHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdyZXNpemUnLCB1cGRhdGVQaW5JbkNvbnRhaW5lcik7XG5cdFx0XHRcdHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdyZXNpemUnLCB1cGRhdGVSZWxhdGl2ZVBpblNwYWNlcik7XG5cdFx0XHRcdF9waW4ucmVtb3ZlRXZlbnRMaXN0ZW5lcihcIm1vdXNld2hlZWxcIiwgb25Nb3VzZXdoZWVsT3ZlclBpbik7XG5cdFx0XHRcdF9waW4ucmVtb3ZlRXZlbnRMaXN0ZW5lcihcIkRPTU1vdXNlU2Nyb2xsXCIsIG9uTW91c2V3aGVlbE92ZXJQaW4pO1xuXHRcdFx0XHRfcGluID0gdW5kZWZpbmVkO1xuXHRcdFx0XHRsb2coMywgXCJyZW1vdmVkIHBpbiAocmVzZXQ6IFwiICsgKHJlc2V0ID8gXCJ0cnVlXCIgOiBcImZhbHNlXCIpICsgXCIpXCIpO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIFNjZW5lO1xuXHRcdH07XG5cblxuXHRcdHZhclxuXHRcdF9jc3NDbGFzc2VzLCBfY3NzQ2xhc3NFbGVtcyA9IFtdO1xuXG5cdFx0U2NlbmUub24oXCJkZXN0cm95LmludGVybmFsXCIsIGZ1bmN0aW9uIChlKSB7XG5cdFx0XHRTY2VuZS5yZW1vdmVDbGFzc1RvZ2dsZShlLnJlc2V0KTtcblx0XHR9KTtcblx0XHQvKipcblx0XHQgKiBEZWZpbmUgYSBjc3MgY2xhc3MgbW9kaWZpY2F0aW9uIHdoaWxlIHRoZSBzY2VuZSBpcyBhY3RpdmUuICBcblx0XHQgKiBXaGVuIHRoZSBzY2VuZSB0cmlnZ2VycyB0aGUgY2xhc3NlcyB3aWxsIGJlIGFkZGVkIHRvIHRoZSBzdXBwbGllZCBlbGVtZW50IGFuZCByZW1vdmVkLCB3aGVuIHRoZSBzY2VuZSBpcyBvdmVyLlxuXHRcdCAqIElmIHRoZSBzY2VuZSBkdXJhdGlvbiBpcyAwIHRoZSBjbGFzc2VzIHdpbGwgb25seSBiZSByZW1vdmVkIGlmIHRoZSB1c2VyIHNjcm9sbHMgYmFjayBwYXN0IHRoZSBzdGFydCBwb3NpdGlvbi5cblx0XHQgKiBAbWV0aG9kIFNjcm9sbE1hZ2ljLlNjZW5lI3NldENsYXNzVG9nZ2xlXG5cdFx0ICogQGV4YW1wbGVcblx0XHQgKiAvLyBhZGQgdGhlIGNsYXNzICdteWNsYXNzJyB0byB0aGUgZWxlbWVudCB3aXRoIHRoZSBpZCAnbXktZWxlbScgZm9yIHRoZSBkdXJhdGlvbiBvZiB0aGUgc2NlbmVcblx0XHQgKiBzY2VuZS5zZXRDbGFzc1RvZ2dsZShcIiNteS1lbGVtXCIsIFwibXljbGFzc1wiKTtcblx0XHQgKlxuXHRcdCAqIC8vIGFkZCBtdWx0aXBsZSBjbGFzc2VzIHRvIG11bHRpcGxlIGVsZW1lbnRzIGRlZmluZWQgYnkgdGhlIHNlbGVjdG9yICcuY2xhc3NDaGFuZ2UnXG5cdFx0ICogc2NlbmUuc2V0Q2xhc3NUb2dnbGUoXCIuY2xhc3NDaGFuZ2VcIiwgXCJjbGFzczEgY2xhc3MyIGNsYXNzM1wiKTtcblx0XHQgKlxuXHRcdCAqIEBwYXJhbSB7KHN0cmluZ3xvYmplY3QpfSBlbGVtZW50IC0gQSBTZWxlY3RvciB0YXJnZXRpbmcgb25lIG9yIG1vcmUgZWxlbWVudHMgb3IgYSBET00gb2JqZWN0IHRoYXQgaXMgc3VwcG9zZWQgdG8gYmUgbW9kaWZpZWQuXG5cdFx0ICogQHBhcmFtIHtzdHJpbmd9IGNsYXNzZXMgLSBPbmUgb3IgbW9yZSBDbGFzc25hbWVzIChzZXBhcmF0ZWQgYnkgc3BhY2UpIHRoYXQgc2hvdWxkIGJlIGFkZGVkIHRvIHRoZSBlbGVtZW50IGR1cmluZyB0aGUgc2NlbmUuXG5cdFx0ICpcblx0XHQgKiBAcmV0dXJucyB7U2NlbmV9IFBhcmVudCBvYmplY3QgZm9yIGNoYWluaW5nLlxuXHRcdCAqL1xuXHRcdHRoaXMuc2V0Q2xhc3NUb2dnbGUgPSBmdW5jdGlvbiAoZWxlbWVudCwgY2xhc3Nlcykge1xuXHRcdFx0dmFyIGVsZW1zID0gX3V0aWwuZ2V0LmVsZW1lbnRzKGVsZW1lbnQpO1xuXHRcdFx0aWYgKGVsZW1zLmxlbmd0aCA9PT0gMCB8fCAhX3V0aWwudHlwZS5TdHJpbmcoY2xhc3NlcykpIHtcblx0XHRcdFx0bG9nKDEsIFwiRVJST1IgY2FsbGluZyBtZXRob2QgJ3NldENsYXNzVG9nZ2xlKCknOiBJbnZhbGlkIFwiICsgKGVsZW1zLmxlbmd0aCA9PT0gMCA/IFwiZWxlbWVudFwiIDogXCJjbGFzc2VzXCIpICsgXCIgc3VwcGxpZWQuXCIpO1xuXHRcdFx0XHRyZXR1cm4gU2NlbmU7XG5cdFx0XHR9XG5cdFx0XHRpZiAoX2Nzc0NsYXNzRWxlbXMubGVuZ3RoID4gMCkge1xuXHRcdFx0XHQvLyByZW1vdmUgb2xkIG9uZXNcblx0XHRcdFx0U2NlbmUucmVtb3ZlQ2xhc3NUb2dnbGUoKTtcblx0XHRcdH1cblx0XHRcdF9jc3NDbGFzc2VzID0gY2xhc3Nlcztcblx0XHRcdF9jc3NDbGFzc0VsZW1zID0gZWxlbXM7XG5cdFx0XHRTY2VuZS5vbihcImVudGVyLmludGVybmFsX2NsYXNzIGxlYXZlLmludGVybmFsX2NsYXNzXCIsIGZ1bmN0aW9uIChlKSB7XG5cdFx0XHRcdHZhciB0b2dnbGUgPSBlLnR5cGUgPT09IFwiZW50ZXJcIiA/IF91dGlsLmFkZENsYXNzIDogX3V0aWwucmVtb3ZlQ2xhc3M7XG5cdFx0XHRcdF9jc3NDbGFzc0VsZW1zLmZvckVhY2goZnVuY3Rpb24gKGVsZW0sIGtleSkge1xuXHRcdFx0XHRcdHRvZ2dsZShlbGVtLCBfY3NzQ2xhc3Nlcyk7XG5cdFx0XHRcdH0pO1xuXHRcdFx0fSk7XG5cdFx0XHRyZXR1cm4gU2NlbmU7XG5cdFx0fTtcblxuXHRcdC8qKlxuXHRcdCAqIFJlbW92ZSB0aGUgY2xhc3MgYmluZGluZyBmcm9tIHRoZSBzY2VuZS5cblx0XHQgKiBAbWV0aG9kIFNjcm9sbE1hZ2ljLlNjZW5lI3JlbW92ZUNsYXNzVG9nZ2xlXG5cdFx0ICogQGV4YW1wbGVcblx0XHQgKiAvLyByZW1vdmUgY2xhc3MgYmluZGluZyBmcm9tIHRoZSBzY2VuZSB3aXRob3V0IHJlc2V0XG5cdFx0ICogc2NlbmUucmVtb3ZlQ2xhc3NUb2dnbGUoKTtcblx0XHQgKlxuXHRcdCAqIC8vIHJlbW92ZSBjbGFzcyBiaW5kaW5nIGFuZCByZW1vdmUgdGhlIGNoYW5nZXMgaXQgY2F1c2VkXG5cdFx0ICogc2NlbmUucmVtb3ZlQ2xhc3NUb2dnbGUodHJ1ZSk7XG5cdFx0ICpcblx0XHQgKiBAcGFyYW0ge2Jvb2xlYW59IFtyZXNldD1mYWxzZV0gLSBJZiBgZmFsc2VgIGFuZCB0aGUgY2xhc3NlcyBhcmUgY3VycmVudGx5IGFjdGl2ZSwgdGhleSB3aWxsIHJlbWFpbiBvbiB0aGUgZWxlbWVudC4gSWYgYHRydWVgIHRoZXkgd2lsbCBiZSByZW1vdmVkLlxuXHRcdCAqIEByZXR1cm5zIHtTY2VuZX0gUGFyZW50IG9iamVjdCBmb3IgY2hhaW5pbmcuXG5cdFx0ICovXG5cdFx0dGhpcy5yZW1vdmVDbGFzc1RvZ2dsZSA9IGZ1bmN0aW9uIChyZXNldCkge1xuXHRcdFx0aWYgKHJlc2V0KSB7XG5cdFx0XHRcdF9jc3NDbGFzc0VsZW1zLmZvckVhY2goZnVuY3Rpb24gKGVsZW0sIGtleSkge1xuXHRcdFx0XHRcdF91dGlsLnJlbW92ZUNsYXNzKGVsZW0sIF9jc3NDbGFzc2VzKTtcblx0XHRcdFx0fSk7XG5cdFx0XHR9XG5cdFx0XHRTY2VuZS5vZmYoXCJzdGFydC5pbnRlcm5hbF9jbGFzcyBlbmQuaW50ZXJuYWxfY2xhc3NcIik7XG5cdFx0XHRfY3NzQ2xhc3NlcyA9IHVuZGVmaW5lZDtcblx0XHRcdF9jc3NDbGFzc0VsZW1zID0gW107XG5cdFx0XHRyZXR1cm4gU2NlbmU7XG5cdFx0fTtcblxuXHRcdC8vIElOSVRcblx0XHRjb25zdHJ1Y3QoKTtcblx0XHRyZXR1cm4gU2NlbmU7XG5cdH07XG5cblx0Ly8gc3RvcmUgcGFnZXdpZGUgc2NlbmUgb3B0aW9uc1xuXHR2YXIgU0NFTkVfT1BUSU9OUyA9IHtcblx0XHRkZWZhdWx0czoge1xuXHRcdFx0ZHVyYXRpb246IDAsXG5cdFx0XHRvZmZzZXQ6IDAsXG5cdFx0XHR0cmlnZ2VyRWxlbWVudDogdW5kZWZpbmVkLFxuXHRcdFx0dHJpZ2dlckhvb2s6IDAuNSxcblx0XHRcdHJldmVyc2U6IHRydWUsXG5cdFx0XHRsb2dsZXZlbDogMlxuXHRcdH0sXG5cdFx0dmFsaWRhdGU6IHtcblx0XHRcdG9mZnNldDogZnVuY3Rpb24gKHZhbCkge1xuXHRcdFx0XHR2YWwgPSBwYXJzZUZsb2F0KHZhbCk7XG5cdFx0XHRcdGlmICghX3V0aWwudHlwZS5OdW1iZXIodmFsKSkge1xuXHRcdFx0XHRcdHRocm93IFtcIkludmFsaWQgdmFsdWUgZm9yIG9wdGlvbiBcXFwib2Zmc2V0XFxcIjpcIiwgdmFsXTtcblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gdmFsO1xuXHRcdFx0fSxcblx0XHRcdHRyaWdnZXJFbGVtZW50OiBmdW5jdGlvbiAodmFsKSB7XG5cdFx0XHRcdHZhbCA9IHZhbCB8fCB1bmRlZmluZWQ7XG5cdFx0XHRcdGlmICh2YWwpIHtcblx0XHRcdFx0XHR2YXIgZWxlbSA9IF91dGlsLmdldC5lbGVtZW50cyh2YWwpWzBdO1xuXHRcdFx0XHRcdGlmIChlbGVtKSB7XG5cdFx0XHRcdFx0XHR2YWwgPSBlbGVtO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHR0aHJvdyBbXCJFbGVtZW50IGRlZmluZWQgaW4gb3B0aW9uIFxcXCJ0cmlnZ2VyRWxlbWVudFxcXCIgd2FzIG5vdCBmb3VuZDpcIiwgdmFsXTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIHZhbDtcblx0XHRcdH0sXG5cdFx0XHR0cmlnZ2VySG9vazogZnVuY3Rpb24gKHZhbCkge1xuXHRcdFx0XHR2YXIgdHJhbnNsYXRlID0ge1xuXHRcdFx0XHRcdFwib25DZW50ZXJcIjogMC41LFxuXHRcdFx0XHRcdFwib25FbnRlclwiOiAxLFxuXHRcdFx0XHRcdFwib25MZWF2ZVwiOiAwXG5cdFx0XHRcdH07XG5cdFx0XHRcdGlmIChfdXRpbC50eXBlLk51bWJlcih2YWwpKSB7XG5cdFx0XHRcdFx0dmFsID0gTWF0aC5tYXgoMCwgTWF0aC5taW4ocGFyc2VGbG9hdCh2YWwpLCAxKSk7IC8vICBtYWtlIHN1cmUgaXRzIGJldHdlZWVuIDAgYW5kIDFcblx0XHRcdFx0fSBlbHNlIGlmICh2YWwgaW4gdHJhbnNsYXRlKSB7XG5cdFx0XHRcdFx0dmFsID0gdHJhbnNsYXRlW3ZhbF07XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0dGhyb3cgW1wiSW52YWxpZCB2YWx1ZSBmb3Igb3B0aW9uIFxcXCJ0cmlnZ2VySG9va1xcXCI6IFwiLCB2YWxdO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiB2YWw7XG5cdFx0XHR9LFxuXHRcdFx0cmV2ZXJzZTogZnVuY3Rpb24gKHZhbCkge1xuXHRcdFx0XHRyZXR1cm4gISF2YWw7IC8vIGZvcmNlIGJvb2xlYW5cblx0XHRcdH0sXG5cdFx0XHRsb2dsZXZlbDogZnVuY3Rpb24gKHZhbCkge1xuXHRcdFx0XHR2YWwgPSBwYXJzZUludCh2YWwpO1xuXHRcdFx0XHRpZiAoIV91dGlsLnR5cGUuTnVtYmVyKHZhbCkgfHwgdmFsIDwgMCB8fCB2YWwgPiAzKSB7XG5cdFx0XHRcdFx0dGhyb3cgW1wiSW52YWxpZCB2YWx1ZSBmb3Igb3B0aW9uIFxcXCJsb2dsZXZlbFxcXCI6XCIsIHZhbF07XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIHZhbDtcblx0XHRcdH1cblx0XHR9LFxuXHRcdC8vIGhvbGRlciBmb3IgIHZhbGlkYXRpb24gbWV0aG9kcy4gZHVyYXRpb24gdmFsaWRhdGlvbiBpcyBoYW5kbGVkIGluICdnZXR0ZXJzLXNldHRlcnMuanMnXG5cdFx0c2hpZnRzOiBbXCJkdXJhdGlvblwiLCBcIm9mZnNldFwiLCBcInRyaWdnZXJIb29rXCJdLFxuXHRcdC8vIGxpc3Qgb2Ygb3B0aW9ucyB0aGF0IHRyaWdnZXIgYSBgc2hpZnRgIGV2ZW50XG5cdH07XG4vKlxuICogbWV0aG9kIHVzZWQgdG8gYWRkIGFuIG9wdGlvbiB0byBTY3JvbGxNYWdpYyBTY2VuZXMuXG4gKiBUT0RPOiBET0MgKHByaXZhdGUgZm9yIGRldilcbiAqL1xuXHRTY3JvbGxNYWdpYy5TY2VuZS5hZGRPcHRpb24gPSBmdW5jdGlvbiAobmFtZSwgZGVmYXVsdFZhbHVlLCB2YWxpZGF0aW9uQ2FsbGJhY2ssIHNoaWZ0cykge1xuXHRcdGlmICghKG5hbWUgaW4gU0NFTkVfT1BUSU9OUy5kZWZhdWx0cykpIHtcblx0XHRcdFNDRU5FX09QVElPTlMuZGVmYXVsdHNbbmFtZV0gPSBkZWZhdWx0VmFsdWU7XG5cdFx0XHRTQ0VORV9PUFRJT05TLnZhbGlkYXRlW25hbWVdID0gdmFsaWRhdGlvbkNhbGxiYWNrO1xuXHRcdFx0aWYgKHNoaWZ0cykge1xuXHRcdFx0XHRTQ0VORV9PUFRJT05TLnNoaWZ0cy5wdXNoKG5hbWUpO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHRTY3JvbGxNYWdpYy5fdXRpbC5sb2coMSwgXCJbc3RhdGljXSBTY3JvbGxNYWdpYy5TY2VuZSAtPiBDYW5ub3QgYWRkIFNjZW5lIG9wdGlvbiAnXCIgKyBuYW1lICsgXCInLCBiZWNhdXNlIGl0IGFscmVhZHkgZXhpc3RzLlwiKTtcblx0XHR9XG5cdH07XG5cdC8vIGluc3RhbmNlIGV4dGVuc2lvbiBmdW5jdGlvbiBmb3IgcGx1Z2luc1xuXHQvLyBUT0RPOiBET0MgKHByaXZhdGUgZm9yIGRldilcblx0U2Nyb2xsTWFnaWMuU2NlbmUuZXh0ZW5kID0gZnVuY3Rpb24gKGV4dGVuc2lvbikge1xuXHRcdHZhciBvbGRDbGFzcyA9IHRoaXM7XG5cdFx0U2Nyb2xsTWFnaWMuU2NlbmUgPSBmdW5jdGlvbiAoKSB7XG5cdFx0XHRvbGRDbGFzcy5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuXHRcdFx0dGhpcy4kc3VwZXIgPSBfdXRpbC5leHRlbmQoe30sIHRoaXMpOyAvLyBjb3B5IHBhcmVudCBzdGF0ZVxuXHRcdFx0cmV0dXJuIGV4dGVuc2lvbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpIHx8IHRoaXM7XG5cdFx0fTtcblx0XHRfdXRpbC5leHRlbmQoU2Nyb2xsTWFnaWMuU2NlbmUsIG9sZENsYXNzKTsgLy8gY29weSBwcm9wZXJ0aWVzXG5cdFx0U2Nyb2xsTWFnaWMuU2NlbmUucHJvdG90eXBlID0gb2xkQ2xhc3MucHJvdG90eXBlOyAvLyBjb3B5IHByb3RvdHlwZVxuXHRcdFNjcm9sbE1hZ2ljLlNjZW5lLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFNjcm9sbE1hZ2ljLlNjZW5lOyAvLyByZXN0b3JlIGNvbnN0cnVjdG9yXG5cdH07XG5cblxuXHQvKipcblx0ICogVE9ETzogRE9DUyAocHJpdmF0ZSBmb3IgZGV2KVxuXHQgKiBAY2xhc3Ncblx0ICogQHByaXZhdGVcblx0ICovXG5cblx0U2Nyb2xsTWFnaWMuRXZlbnQgPSBmdW5jdGlvbiAodHlwZSwgbmFtZXNwYWNlLCB0YXJnZXQsIHZhcnMpIHtcblx0XHR2YXJzID0gdmFycyB8fCB7fTtcblx0XHRmb3IgKHZhciBrZXkgaW4gdmFycykge1xuXHRcdFx0dGhpc1trZXldID0gdmFyc1trZXldO1xuXHRcdH1cblx0XHR0aGlzLnR5cGUgPSB0eXBlO1xuXHRcdHRoaXMudGFyZ2V0ID0gdGhpcy5jdXJyZW50VGFyZ2V0ID0gdGFyZ2V0O1xuXHRcdHRoaXMubmFtZXNwYWNlID0gbmFtZXNwYWNlIHx8ICcnO1xuXHRcdHRoaXMudGltZVN0YW1wID0gdGhpcy50aW1lc3RhbXAgPSBEYXRlLm5vdygpO1xuXHRcdHJldHVybiB0aGlzO1xuXHR9O1xuXG4vKlxuICogVE9ETzogRE9DUyAocHJpdmF0ZSBmb3IgZGV2KVxuICovXG5cblx0dmFyIF91dGlsID0gU2Nyb2xsTWFnaWMuX3V0aWwgPSAoZnVuY3Rpb24gKHdpbmRvdykge1xuXHRcdHZhciBVID0ge30sXG5cdFx0XHRpO1xuXG5cdFx0LyoqXG5cdFx0ICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cdFx0ICogaW50ZXJuYWwgaGVscGVyc1xuXHRcdCAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXHRcdCAqL1xuXG5cdFx0Ly8gcGFyc2UgZmxvYXQgYW5kIGZhbGwgYmFjayB0byAwLlxuXHRcdHZhciBmbG9hdHZhbCA9IGZ1bmN0aW9uIChudW1iZXIpIHtcblx0XHRcdHJldHVybiBwYXJzZUZsb2F0KG51bWJlcikgfHwgMDtcblx0XHR9O1xuXHRcdC8vIGdldCBjdXJyZW50IHN0eWxlIElFIHNhZmUgKG90aGVyd2lzZSBJRSB3b3VsZCByZXR1cm4gY2FsY3VsYXRlZCB2YWx1ZXMgZm9yICdhdXRvJylcblx0XHR2YXIgX2dldENvbXB1dGVkU3R5bGUgPSBmdW5jdGlvbiAoZWxlbSkge1xuXHRcdFx0cmV0dXJuIGVsZW0uY3VycmVudFN0eWxlID8gZWxlbS5jdXJyZW50U3R5bGUgOiB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShlbGVtKTtcblx0XHR9O1xuXG5cdFx0Ly8gZ2V0IGVsZW1lbnQgZGltZW5zaW9uICh3aWR0aCBvciBoZWlnaHQpXG5cdFx0dmFyIF9kaW1lbnNpb24gPSBmdW5jdGlvbiAod2hpY2gsIGVsZW0sIG91dGVyLCBpbmNsdWRlTWFyZ2luKSB7XG5cdFx0XHRlbGVtID0gKGVsZW0gPT09IGRvY3VtZW50KSA/IHdpbmRvdyA6IGVsZW07XG5cdFx0XHRpZiAoZWxlbSA9PT0gd2luZG93KSB7XG5cdFx0XHRcdGluY2x1ZGVNYXJnaW4gPSBmYWxzZTtcblx0XHRcdH0gZWxzZSBpZiAoIV90eXBlLkRvbUVsZW1lbnQoZWxlbSkpIHtcblx0XHRcdFx0cmV0dXJuIDA7XG5cdFx0XHR9XG5cdFx0XHR3aGljaCA9IHdoaWNoLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgd2hpY2guc3Vic3RyKDEpLnRvTG93ZXJDYXNlKCk7XG5cdFx0XHR2YXIgZGltZW5zaW9uID0gKG91dGVyID8gZWxlbVsnb2Zmc2V0JyArIHdoaWNoXSB8fCBlbGVtWydvdXRlcicgKyB3aGljaF0gOiBlbGVtWydjbGllbnQnICsgd2hpY2hdIHx8IGVsZW1bJ2lubmVyJyArIHdoaWNoXSkgfHwgMDtcblx0XHRcdGlmIChvdXRlciAmJiBpbmNsdWRlTWFyZ2luKSB7XG5cdFx0XHRcdHZhciBzdHlsZSA9IF9nZXRDb21wdXRlZFN0eWxlKGVsZW0pO1xuXHRcdFx0XHRkaW1lbnNpb24gKz0gd2hpY2ggPT09ICdIZWlnaHQnID8gZmxvYXR2YWwoc3R5bGUubWFyZ2luVG9wKSArIGZsb2F0dmFsKHN0eWxlLm1hcmdpbkJvdHRvbSkgOiBmbG9hdHZhbChzdHlsZS5tYXJnaW5MZWZ0KSArIGZsb2F0dmFsKHN0eWxlLm1hcmdpblJpZ2h0KTtcblx0XHRcdH1cblx0XHRcdHJldHVybiBkaW1lbnNpb247XG5cdFx0fTtcblx0XHQvLyBjb252ZXJ0cyAnbWFyZ2luLXRvcCcgaW50byAnbWFyZ2luVG9wJ1xuXHRcdHZhciBfY2FtZWxDYXNlID0gZnVuY3Rpb24gKHN0cikge1xuXHRcdFx0cmV0dXJuIHN0ci5yZXBsYWNlKC9eW15hLXpdKyhbYS16XSkvZywgJyQxJykucmVwbGFjZSgvLShbYS16XSkvZywgZnVuY3Rpb24gKGcpIHtcblx0XHRcdFx0cmV0dXJuIGdbMV0udG9VcHBlckNhc2UoKTtcblx0XHRcdH0pO1xuXHRcdH07XG5cblx0XHQvKipcblx0XHQgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblx0XHQgKiBleHRlcm5hbCBoZWxwZXJzXG5cdFx0ICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cdFx0ICovXG5cblx0XHQvLyBleHRlbmQgb2JqIOKAkyBzYW1lIGFzIGpRdWVyeS5leHRlbmQoe30sIG9iakEsIG9iakIpXG5cdFx0VS5leHRlbmQgPSBmdW5jdGlvbiAob2JqKSB7XG5cdFx0XHRvYmogPSBvYmogfHwge307XG5cdFx0XHRmb3IgKGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRcdGlmICghYXJndW1lbnRzW2ldKSB7XG5cdFx0XHRcdFx0Y29udGludWU7XG5cdFx0XHRcdH1cblx0XHRcdFx0Zm9yICh2YXIga2V5IGluIGFyZ3VtZW50c1tpXSkge1xuXHRcdFx0XHRcdGlmIChhcmd1bWVudHNbaV0uaGFzT3duUHJvcGVydHkoa2V5KSkge1xuXHRcdFx0XHRcdFx0b2JqW2tleV0gPSBhcmd1bWVudHNbaV1ba2V5XTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdHJldHVybiBvYmo7XG5cdFx0fTtcblxuXHRcdC8vIGNoZWNrIGlmIGEgY3NzIGRpc3BsYXkgdHlwZSByZXN1bHRzIGluIG1hcmdpbi1jb2xsYXBzZSBvciBub3Rcblx0XHRVLmlzTWFyZ2luQ29sbGFwc2VUeXBlID0gZnVuY3Rpb24gKHN0cikge1xuXHRcdFx0cmV0dXJuIFtcImJsb2NrXCIsIFwiZmxleFwiLCBcImxpc3QtaXRlbVwiLCBcInRhYmxlXCIsIFwiLXdlYmtpdC1ib3hcIl0uaW5kZXhPZihzdHIpID4gLTE7XG5cdFx0fTtcblxuXHRcdC8vIGltcGxlbWVudGF0aW9uIG9mIHJlcXVlc3RBbmltYXRpb25GcmFtZVxuXHRcdC8vIGJhc2VkIG9uIGh0dHBzOi8vZ2lzdC5naXRodWIuY29tL3BhdWxpcmlzaC8xNTc5NjcxXG5cdFx0dmFyXG5cdFx0bGFzdFRpbWUgPSAwLFxuXHRcdFx0dmVuZG9ycyA9IFsnbXMnLCAnbW96JywgJ3dlYmtpdCcsICdvJ107XG5cdFx0dmFyIF9yZXF1ZXN0QW5pbWF0aW9uRnJhbWUgPSB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lO1xuXHRcdHZhciBfY2FuY2VsQW5pbWF0aW9uRnJhbWUgPSB3aW5kb3cuY2FuY2VsQW5pbWF0aW9uRnJhbWU7XG5cdFx0Ly8gdHJ5IHZlbmRvciBwcmVmaXhlcyBpZiB0aGUgYWJvdmUgZG9lc24ndCB3b3JrXG5cdFx0Zm9yIChpID0gMDsgIV9yZXF1ZXN0QW5pbWF0aW9uRnJhbWUgJiYgaSA8IHZlbmRvcnMubGVuZ3RoOyArK2kpIHtcblx0XHRcdF9yZXF1ZXN0QW5pbWF0aW9uRnJhbWUgPSB3aW5kb3dbdmVuZG9yc1tpXSArICdSZXF1ZXN0QW5pbWF0aW9uRnJhbWUnXTtcblx0XHRcdF9jYW5jZWxBbmltYXRpb25GcmFtZSA9IHdpbmRvd1t2ZW5kb3JzW2ldICsgJ0NhbmNlbEFuaW1hdGlvbkZyYW1lJ10gfHwgd2luZG93W3ZlbmRvcnNbaV0gKyAnQ2FuY2VsUmVxdWVzdEFuaW1hdGlvbkZyYW1lJ107XG5cdFx0fVxuXG5cdFx0Ly8gZmFsbGJhY2tzXG5cdFx0aWYgKCFfcmVxdWVzdEFuaW1hdGlvbkZyYW1lKSB7XG5cdFx0XHRfcmVxdWVzdEFuaW1hdGlvbkZyYW1lID0gZnVuY3Rpb24gKGNhbGxiYWNrKSB7XG5cdFx0XHRcdHZhclxuXHRcdFx0XHRjdXJyVGltZSA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpLFxuXHRcdFx0XHRcdHRpbWVUb0NhbGwgPSBNYXRoLm1heCgwLCAxNiAtIChjdXJyVGltZSAtIGxhc3RUaW1lKSksXG5cdFx0XHRcdFx0aWQgPSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0XHRjYWxsYmFjayhjdXJyVGltZSArIHRpbWVUb0NhbGwpO1xuXHRcdFx0XHRcdH0sIHRpbWVUb0NhbGwpO1xuXHRcdFx0XHRsYXN0VGltZSA9IGN1cnJUaW1lICsgdGltZVRvQ2FsbDtcblx0XHRcdFx0cmV0dXJuIGlkO1xuXHRcdFx0fTtcblx0XHR9XG5cdFx0aWYgKCFfY2FuY2VsQW5pbWF0aW9uRnJhbWUpIHtcblx0XHRcdF9jYW5jZWxBbmltYXRpb25GcmFtZSA9IGZ1bmN0aW9uIChpZCkge1xuXHRcdFx0XHR3aW5kb3cuY2xlYXJUaW1lb3V0KGlkKTtcblx0XHRcdH07XG5cdFx0fVxuXHRcdFUuckFGID0gX3JlcXVlc3RBbmltYXRpb25GcmFtZS5iaW5kKHdpbmRvdyk7XG5cdFx0VS5jQUYgPSBfY2FuY2VsQW5pbWF0aW9uRnJhbWUuYmluZCh3aW5kb3cpO1xuXG5cdFx0dmFyXG5cdFx0bG9nbGV2ZWxzID0gW1wiZXJyb3JcIiwgXCJ3YXJuXCIsIFwibG9nXCJdLFxuXHRcdFx0Y29uc29sZSA9IHdpbmRvdy5jb25zb2xlIHx8IHt9O1xuXG5cdFx0Y29uc29sZS5sb2cgPSBjb25zb2xlLmxvZyB8fFxuXHRcdGZ1bmN0aW9uICgpIHt9OyAvLyBubyBjb25zb2xlIGxvZywgd2VsbCAtIGRvIG5vdGhpbmcgdGhlbi4uLlxuXHRcdC8vIG1ha2Ugc3VyZSBtZXRob2RzIGZvciBhbGwgbGV2ZWxzIGV4aXN0LlxuXHRcdGZvciAoaSA9IDA7IGkgPCBsb2dsZXZlbHMubGVuZ3RoOyBpKyspIHtcblx0XHRcdHZhciBtZXRob2QgPSBsb2dsZXZlbHNbaV07XG5cdFx0XHRpZiAoIWNvbnNvbGVbbWV0aG9kXSkge1xuXHRcdFx0XHRjb25zb2xlW21ldGhvZF0gPSBjb25zb2xlLmxvZzsgLy8gcHJlZmVyIC5sb2cgb3ZlciBub3RoaW5nXG5cdFx0XHR9XG5cdFx0fVxuXHRcdFUubG9nID0gZnVuY3Rpb24gKGxvZ2xldmVsKSB7XG5cdFx0XHRpZiAobG9nbGV2ZWwgPiBsb2dsZXZlbHMubGVuZ3RoIHx8IGxvZ2xldmVsIDw9IDApIGxvZ2xldmVsID0gbG9nbGV2ZWxzLmxlbmd0aDtcblx0XHRcdHZhciBub3cgPSBuZXcgRGF0ZSgpLFxuXHRcdFx0XHR0aW1lID0gKFwiMFwiICsgbm93LmdldEhvdXJzKCkpLnNsaWNlKC0yKSArIFwiOlwiICsgKFwiMFwiICsgbm93LmdldE1pbnV0ZXMoKSkuc2xpY2UoLTIpICsgXCI6XCIgKyAoXCIwXCIgKyBub3cuZ2V0U2Vjb25kcygpKS5zbGljZSgtMikgKyBcIjpcIiArIChcIjAwXCIgKyBub3cuZ2V0TWlsbGlzZWNvbmRzKCkpLnNsaWNlKC0zKSxcblx0XHRcdFx0bWV0aG9kID0gbG9nbGV2ZWxzW2xvZ2xldmVsIC0gMV0sXG5cdFx0XHRcdGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc3BsaWNlLmNhbGwoYXJndW1lbnRzLCAxKSxcblx0XHRcdFx0ZnVuYyA9IEZ1bmN0aW9uLnByb3RvdHlwZS5iaW5kLmNhbGwoY29uc29sZVttZXRob2RdLCBjb25zb2xlKTtcblx0XHRcdGFyZ3MudW5zaGlmdCh0aW1lKTtcblx0XHRcdGZ1bmMuYXBwbHkoY29uc29sZSwgYXJncyk7XG5cdFx0fTtcblxuXHRcdC8qKlxuXHRcdCAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXHRcdCAqIHR5cGUgdGVzdGluZ1xuXHRcdCAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXHRcdCAqL1xuXG5cdFx0dmFyIF90eXBlID0gVS50eXBlID0gZnVuY3Rpb24gKHYpIHtcblx0XHRcdHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodikucmVwbGFjZSgvXlxcW29iamVjdCAoLispXFxdJC8sIFwiJDFcIikudG9Mb3dlckNhc2UoKTtcblx0XHR9O1xuXHRcdF90eXBlLlN0cmluZyA9IGZ1bmN0aW9uICh2KSB7XG5cdFx0XHRyZXR1cm4gX3R5cGUodikgPT09ICdzdHJpbmcnO1xuXHRcdH07XG5cdFx0X3R5cGUuRnVuY3Rpb24gPSBmdW5jdGlvbiAodikge1xuXHRcdFx0cmV0dXJuIF90eXBlKHYpID09PSAnZnVuY3Rpb24nO1xuXHRcdH07XG5cdFx0X3R5cGUuQXJyYXkgPSBmdW5jdGlvbiAodikge1xuXHRcdFx0cmV0dXJuIEFycmF5LmlzQXJyYXkodik7XG5cdFx0fTtcblx0XHRfdHlwZS5OdW1iZXIgPSBmdW5jdGlvbiAodikge1xuXHRcdFx0cmV0dXJuICFfdHlwZS5BcnJheSh2KSAmJiAodiAtIHBhcnNlRmxvYXQodikgKyAxKSA+PSAwO1xuXHRcdH07XG5cdFx0X3R5cGUuRG9tRWxlbWVudCA9IGZ1bmN0aW9uIChvKSB7XG5cdFx0XHRyZXR1cm4gKFxuXHRcdFx0dHlwZW9mIEhUTUxFbGVtZW50ID09PSBcIm9iamVjdFwiID8gbyBpbnN0YW5jZW9mIEhUTUxFbGVtZW50IDogLy9ET00yXG5cdFx0XHRvICYmIHR5cGVvZiBvID09PSBcIm9iamVjdFwiICYmIG8gIT09IG51bGwgJiYgby5ub2RlVHlwZSA9PT0gMSAmJiB0eXBlb2Ygby5ub2RlTmFtZSA9PT0gXCJzdHJpbmdcIik7XG5cdFx0fTtcblxuXHRcdC8qKlxuXHRcdCAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXHRcdCAqIERPTSBFbGVtZW50IGluZm9cblx0XHQgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblx0XHQgKi9cblx0XHQvLyBhbHdheXMgcmV0dXJucyBhIGxpc3Qgb2YgbWF0Y2hpbmcgRE9NIGVsZW1lbnRzLCBmcm9tIGEgc2VsZWN0b3IsIGEgRE9NIGVsZW1lbnQgb3IgYW4gbGlzdCBvZiBlbGVtZW50cyBvciBldmVuIGFuIGFycmF5IG9mIHNlbGVjdG9yc1xuXHRcdHZhciBfZ2V0ID0gVS5nZXQgPSB7fTtcblx0XHRfZ2V0LmVsZW1lbnRzID0gZnVuY3Rpb24gKHNlbGVjdG9yKSB7XG5cdFx0XHR2YXIgYXJyID0gW107XG5cdFx0XHRpZiAoX3R5cGUuU3RyaW5nKHNlbGVjdG9yKSkge1xuXHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdHNlbGVjdG9yID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChzZWxlY3Rvcik7XG5cdFx0XHRcdH0gY2F0Y2ggKGUpIHsgLy8gaW52YWxpZCBzZWxlY3RvclxuXHRcdFx0XHRcdHJldHVybiBhcnI7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdGlmIChfdHlwZShzZWxlY3RvcikgPT09ICdub2RlbGlzdCcgfHwgX3R5cGUuQXJyYXkoc2VsZWN0b3IpKSB7XG5cdFx0XHRcdGZvciAodmFyIGkgPSAwLCByZWYgPSBhcnIubGVuZ3RoID0gc2VsZWN0b3IubGVuZ3RoOyBpIDwgcmVmOyBpKyspIHsgLy8gbGlzdCBvZiBlbGVtZW50c1xuXHRcdFx0XHRcdHZhciBlbGVtID0gc2VsZWN0b3JbaV07XG5cdFx0XHRcdFx0YXJyW2ldID0gX3R5cGUuRG9tRWxlbWVudChlbGVtKSA/IGVsZW0gOiBfZ2V0LmVsZW1lbnRzKGVsZW0pOyAvLyBpZiBub3QgYW4gZWxlbWVudCwgdHJ5IHRvIHJlc29sdmUgcmVjdXJzaXZlbHlcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIGlmIChfdHlwZS5Eb21FbGVtZW50KHNlbGVjdG9yKSB8fCBzZWxlY3RvciA9PT0gZG9jdW1lbnQgfHwgc2VsZWN0b3IgPT09IHdpbmRvdykge1xuXHRcdFx0XHRhcnIgPSBbc2VsZWN0b3JdOyAvLyBvbmx5IHRoZSBlbGVtZW50XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gYXJyO1xuXHRcdH07XG5cdFx0Ly8gZ2V0IHNjcm9sbCB0b3AgdmFsdWVcblx0XHRfZ2V0LnNjcm9sbFRvcCA9IGZ1bmN0aW9uIChlbGVtKSB7XG5cdFx0XHRyZXR1cm4gKGVsZW0gJiYgdHlwZW9mIGVsZW0uc2Nyb2xsVG9wID09PSAnbnVtYmVyJykgPyBlbGVtLnNjcm9sbFRvcCA6IHdpbmRvdy5wYWdlWU9mZnNldCB8fCAwO1xuXHRcdH07XG5cdFx0Ly8gZ2V0IHNjcm9sbCBsZWZ0IHZhbHVlXG5cdFx0X2dldC5zY3JvbGxMZWZ0ID0gZnVuY3Rpb24gKGVsZW0pIHtcblx0XHRcdHJldHVybiAoZWxlbSAmJiB0eXBlb2YgZWxlbS5zY3JvbGxMZWZ0ID09PSAnbnVtYmVyJykgPyBlbGVtLnNjcm9sbExlZnQgOiB3aW5kb3cucGFnZVhPZmZzZXQgfHwgMDtcblx0XHR9O1xuXHRcdC8vIGdldCBlbGVtZW50IGhlaWdodFxuXHRcdF9nZXQud2lkdGggPSBmdW5jdGlvbiAoZWxlbSwgb3V0ZXIsIGluY2x1ZGVNYXJnaW4pIHtcblx0XHRcdHJldHVybiBfZGltZW5zaW9uKCd3aWR0aCcsIGVsZW0sIG91dGVyLCBpbmNsdWRlTWFyZ2luKTtcblx0XHR9O1xuXHRcdC8vIGdldCBlbGVtZW50IHdpZHRoXG5cdFx0X2dldC5oZWlnaHQgPSBmdW5jdGlvbiAoZWxlbSwgb3V0ZXIsIGluY2x1ZGVNYXJnaW4pIHtcblx0XHRcdHJldHVybiBfZGltZW5zaW9uKCdoZWlnaHQnLCBlbGVtLCBvdXRlciwgaW5jbHVkZU1hcmdpbik7XG5cdFx0fTtcblxuXHRcdC8vIGdldCBlbGVtZW50IHBvc2l0aW9uIChvcHRpb25hbGx5IHJlbGF0aXZlIHRvIHZpZXdwb3J0KVxuXHRcdF9nZXQub2Zmc2V0ID0gZnVuY3Rpb24gKGVsZW0sIHJlbGF0aXZlVG9WaWV3cG9ydCkge1xuXHRcdFx0dmFyIG9mZnNldCA9IHtcblx0XHRcdFx0dG9wOiAwLFxuXHRcdFx0XHRsZWZ0OiAwXG5cdFx0XHR9O1xuXHRcdFx0aWYgKGVsZW0gJiYgZWxlbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QpIHsgLy8gY2hlY2sgaWYgYXZhaWxhYmxlXG5cdFx0XHRcdHZhciByZWN0ID0gZWxlbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcblx0XHRcdFx0b2Zmc2V0LnRvcCA9IHJlY3QudG9wO1xuXHRcdFx0XHRvZmZzZXQubGVmdCA9IHJlY3QubGVmdDtcblx0XHRcdFx0aWYgKCFyZWxhdGl2ZVRvVmlld3BvcnQpIHsgLy8gY2xpZW50UmVjdCBpcyBieSBkZWZhdWx0IHJlbGF0aXZlIHRvIHZpZXdwb3J0Li4uXG5cdFx0XHRcdFx0b2Zmc2V0LnRvcCArPSBfZ2V0LnNjcm9sbFRvcCgpO1xuXHRcdFx0XHRcdG9mZnNldC5sZWZ0ICs9IF9nZXQuc2Nyb2xsTGVmdCgpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gb2Zmc2V0O1xuXHRcdH07XG5cblx0XHQvKipcblx0XHQgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblx0XHQgKiBET00gRWxlbWVudCBtYW5pcHVsYXRpb25cblx0XHQgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblx0XHQgKi9cblxuXHRcdFUuYWRkQ2xhc3MgPSBmdW5jdGlvbiAoZWxlbSwgY2xhc3NuYW1lKSB7XG5cdFx0XHRpZiAoY2xhc3NuYW1lKSB7XG5cdFx0XHRcdGlmIChlbGVtLmNsYXNzTGlzdCkgZWxlbS5jbGFzc0xpc3QuYWRkKGNsYXNzbmFtZSk7XG5cdFx0XHRcdGVsc2UgZWxlbS5jbGFzc05hbWUgKz0gJyAnICsgY2xhc3NuYW1lO1xuXHRcdFx0fVxuXHRcdH07XG5cdFx0VS5yZW1vdmVDbGFzcyA9IGZ1bmN0aW9uIChlbGVtLCBjbGFzc25hbWUpIHtcblx0XHRcdGlmIChjbGFzc25hbWUpIHtcblx0XHRcdFx0aWYgKGVsZW0uY2xhc3NMaXN0KSBlbGVtLmNsYXNzTGlzdC5yZW1vdmUoY2xhc3NuYW1lKTtcblx0XHRcdFx0ZWxzZSBlbGVtLmNsYXNzTmFtZSA9IGVsZW0uY2xhc3NOYW1lLnJlcGxhY2UobmV3IFJlZ0V4cCgnKF58XFxcXGIpJyArIGNsYXNzbmFtZS5zcGxpdCgnICcpLmpvaW4oJ3wnKSArICcoXFxcXGJ8JCknLCAnZ2knKSwgJyAnKTtcblx0XHRcdH1cblx0XHR9O1xuXHRcdC8vIGlmIG9wdGlvbnMgaXMgc3RyaW5nIC0+IHJldHVybnMgY3NzIHZhbHVlXG5cdFx0Ly8gaWYgb3B0aW9ucyBpcyBhcnJheSAtPiByZXR1cm5zIG9iamVjdCB3aXRoIGNzcyB2YWx1ZSBwYWlyc1xuXHRcdC8vIGlmIG9wdGlvbnMgaXMgb2JqZWN0IC0+IHNldCBuZXcgY3NzIHZhbHVlc1xuXHRcdFUuY3NzID0gZnVuY3Rpb24gKGVsZW0sIG9wdGlvbnMpIHtcblx0XHRcdGlmIChfdHlwZS5TdHJpbmcob3B0aW9ucykpIHtcblx0XHRcdFx0cmV0dXJuIF9nZXRDb21wdXRlZFN0eWxlKGVsZW0pW19jYW1lbENhc2Uob3B0aW9ucyldO1xuXHRcdFx0fSBlbHNlIGlmIChfdHlwZS5BcnJheShvcHRpb25zKSkge1xuXHRcdFx0XHR2YXJcblx0XHRcdFx0b2JqID0ge30sXG5cdFx0XHRcdFx0c3R5bGUgPSBfZ2V0Q29tcHV0ZWRTdHlsZShlbGVtKTtcblx0XHRcdFx0b3B0aW9ucy5mb3JFYWNoKGZ1bmN0aW9uIChvcHRpb24sIGtleSkge1xuXHRcdFx0XHRcdG9ialtvcHRpb25dID0gc3R5bGVbX2NhbWVsQ2FzZShvcHRpb24pXTtcblx0XHRcdFx0fSk7XG5cdFx0XHRcdHJldHVybiBvYmo7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRmb3IgKHZhciBvcHRpb24gaW4gb3B0aW9ucykge1xuXHRcdFx0XHRcdHZhciB2YWwgPSBvcHRpb25zW29wdGlvbl07XG5cdFx0XHRcdFx0aWYgKHZhbCA9PSBwYXJzZUZsb2F0KHZhbCkpIHsgLy8gYXNzdW1lIHBpeGVsIGZvciBzZWVtaW5nbHkgbnVtZXJpY2FsIHZhbHVlc1xuXHRcdFx0XHRcdFx0dmFsICs9ICdweCc7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGVsZW0uc3R5bGVbX2NhbWVsQ2FzZShvcHRpb24pXSA9IHZhbDtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH07XG5cblx0XHRyZXR1cm4gVTtcblx0fSh3aW5kb3cgfHwge30pKTtcblxuXHRTY3JvbGxNYWdpYy5TY2VuZS5wcm90b3R5cGUuYWRkSW5kaWNhdG9ycyA9IGZ1bmN0aW9uICgpIHtcblx0XHRTY3JvbGxNYWdpYy5fdXRpbC5sb2coMSwgJyhTY3JvbGxNYWdpYy5TY2VuZSkgLT4gRVJST1IgY2FsbGluZyBhZGRJbmRpY2F0b3JzKCkgZHVlIHRvIG1pc3NpbmcgUGx1Z2luIFxcJ2RlYnVnLmFkZEluZGljYXRvcnNcXCcuIFBsZWFzZSBtYWtlIHN1cmUgdG8gaW5jbHVkZSBwbHVnaW5zL2RlYnVnLmFkZEluZGljYXRvcnMuanMnKTtcblx0XHRyZXR1cm4gdGhpcztcblx0fVxuXHRTY3JvbGxNYWdpYy5TY2VuZS5wcm90b3R5cGUucmVtb3ZlSW5kaWNhdG9ycyA9IGZ1bmN0aW9uICgpIHtcblx0XHRTY3JvbGxNYWdpYy5fdXRpbC5sb2coMSwgJyhTY3JvbGxNYWdpYy5TY2VuZSkgLT4gRVJST1IgY2FsbGluZyByZW1vdmVJbmRpY2F0b3JzKCkgZHVlIHRvIG1pc3NpbmcgUGx1Z2luIFxcJ2RlYnVnLmFkZEluZGljYXRvcnNcXCcuIFBsZWFzZSBtYWtlIHN1cmUgdG8gaW5jbHVkZSBwbHVnaW5zL2RlYnVnLmFkZEluZGljYXRvcnMuanMnKTtcblx0XHRyZXR1cm4gdGhpcztcblx0fVxuXHRTY3JvbGxNYWdpYy5TY2VuZS5wcm90b3R5cGUuc2V0VHdlZW4gPSBmdW5jdGlvbiAoKSB7XG5cdFx0U2Nyb2xsTWFnaWMuX3V0aWwubG9nKDEsICcoU2Nyb2xsTWFnaWMuU2NlbmUpIC0+IEVSUk9SIGNhbGxpbmcgc2V0VHdlZW4oKSBkdWUgdG8gbWlzc2luZyBQbHVnaW4gXFwnYW5pbWF0aW9uLmdzYXBcXCcuIFBsZWFzZSBtYWtlIHN1cmUgdG8gaW5jbHVkZSBwbHVnaW5zL2FuaW1hdGlvbi5nc2FwLmpzJyk7XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH1cblx0U2Nyb2xsTWFnaWMuU2NlbmUucHJvdG90eXBlLnJlbW92ZVR3ZWVuID0gZnVuY3Rpb24gKCkge1xuXHRcdFNjcm9sbE1hZ2ljLl91dGlsLmxvZygxLCAnKFNjcm9sbE1hZ2ljLlNjZW5lKSAtPiBFUlJPUiBjYWxsaW5nIHJlbW92ZVR3ZWVuKCkgZHVlIHRvIG1pc3NpbmcgUGx1Z2luIFxcJ2FuaW1hdGlvbi5nc2FwXFwnLiBQbGVhc2UgbWFrZSBzdXJlIHRvIGluY2x1ZGUgcGx1Z2lucy9hbmltYXRpb24uZ3NhcC5qcycpO1xuXHRcdHJldHVybiB0aGlzO1xuXHR9XG5cdFNjcm9sbE1hZ2ljLlNjZW5lLnByb3RvdHlwZS5zZXRWZWxvY2l0eSA9IGZ1bmN0aW9uICgpIHtcblx0XHRTY3JvbGxNYWdpYy5fdXRpbC5sb2coMSwgJyhTY3JvbGxNYWdpYy5TY2VuZSkgLT4gRVJST1IgY2FsbGluZyBzZXRWZWxvY2l0eSgpIGR1ZSB0byBtaXNzaW5nIFBsdWdpbiBcXCdhbmltYXRpb24udmVsb2NpdHlcXCcuIFBsZWFzZSBtYWtlIHN1cmUgdG8gaW5jbHVkZSBwbHVnaW5zL2FuaW1hdGlvbi52ZWxvY2l0eS5qcycpO1xuXHRcdHJldHVybiB0aGlzO1xuXHR9XG5cdFNjcm9sbE1hZ2ljLlNjZW5lLnByb3RvdHlwZS5yZW1vdmVWZWxvY2l0eSA9IGZ1bmN0aW9uICgpIHtcblx0XHRTY3JvbGxNYWdpYy5fdXRpbC5sb2coMSwgJyhTY3JvbGxNYWdpYy5TY2VuZSkgLT4gRVJST1IgY2FsbGluZyByZW1vdmVWZWxvY2l0eSgpIGR1ZSB0byBtaXNzaW5nIFBsdWdpbiBcXCdhbmltYXRpb24udmVsb2NpdHlcXCcuIFBsZWFzZSBtYWtlIHN1cmUgdG8gaW5jbHVkZSBwbHVnaW5zL2FuaW1hdGlvbi52ZWxvY2l0eS5qcycpO1xuXHRcdHJldHVybiB0aGlzO1xuXHR9XG5cblx0cmV0dXJuIFNjcm9sbE1hZ2ljO1xufSkpOyIsIi8qIVxuICogU2Nyb2xsTWFnaWMgdjIuMC41ICgyMDE1LTA0LTI5KVxuICogVGhlIGphdmFzY3JpcHQgbGlicmFyeSBmb3IgbWFnaWNhbCBzY3JvbGwgaW50ZXJhY3Rpb25zLlxuICogKGMpIDIwMTUgSmFuIFBhZXBrZSAoQGphbnBhZXBrZSlcbiAqIFByb2plY3QgV2Vic2l0ZTogaHR0cDovL3Njcm9sbG1hZ2ljLmlvXG4gKiBcbiAqIEB2ZXJzaW9uIDIuMC41XG4gKiBAbGljZW5zZSBEdWFsIGxpY2Vuc2VkIHVuZGVyIE1JVCBsaWNlbnNlIGFuZCBHUEwuXG4gKiBAYXV0aG9yIEphbiBQYWVwa2UgLSBlLW1haWxAamFucGFlcGtlLmRlXG4gKlxuICogQGZpbGUgU2Nyb2xsTWFnaWMgR1NBUCBBbmltYXRpb24gUGx1Z2luLlxuICpcbiAqIHJlcXVpcmVzOiBHU0FQIH4xLjE0XG4gKiBQb3dlcmVkIGJ5IHRoZSBHcmVlbnNvY2sgQW5pbWF0aW9uIFBsYXRmb3JtIChHU0FQKTogaHR0cDovL3d3dy5ncmVlbnNvY2suY29tL2pzXG4gKiBHcmVlbnNvY2sgTGljZW5zZSBpbmZvIGF0IGh0dHA6Ly93d3cuZ3JlZW5zb2NrLmNvbS9saWNlbnNpbmcvXG4gKi9cbi8qKlxuICogVGhpcyBwbHVnaW4gaXMgbWVhbnQgdG8gYmUgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZSBHcmVlbnNvY2sgQW5pbWF0aW9uIFBsYXR0Zm9ybS4gIFxuICogSXQgb2ZmZXJzIGFuIGVhc3kgQVBJIHRvIHRyaWdnZXIgVHdlZW5zIG9yIHN5bmNocm9uaXplIHRoZW0gdG8gdGhlIHNjcm9sbGJhciBtb3ZlbWVudC5cbiAqXG4gKiBCb3RoIHRoZSBgbGl0ZWAgYW5kIHRoZSBgbWF4YCB2ZXJzaW9ucyBvZiB0aGUgR1NBUCBsaWJyYXJ5IGFyZSBzdXBwb3J0ZWQuICBcbiAqIFRoZSBtb3N0IGJhc2ljIHJlcXVpcmVtZW50IGlzIGBUd2VlbkxpdGVgLlxuICogXG4gKiBUbyBoYXZlIGFjY2VzcyB0byB0aGlzIGV4dGVuc2lvbiwgcGxlYXNlIGluY2x1ZGUgYHBsdWdpbnMvYW5pbWF0aW9uLmdzYXAuanNgLlxuICogQHJlcXVpcmVzIHtAbGluayBodHRwOi8vZ3JlZW5zb2NrLmNvbS9nc2FwfEdTQVAgfjEuMTQueH1cbiAqIEBtaXhpbiBhbmltYXRpb24uR1NBUFxuICovXG4oZnVuY3Rpb24gKHJvb3QsIGZhY3RvcnkpIHtcblx0aWYgKHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCkge1xuXHRcdC8vIEFNRC4gUmVnaXN0ZXIgYXMgYW4gYW5vbnltb3VzIG1vZHVsZS5cblx0XHRkZWZpbmUoWydTY3JvbGxNYWdpYycsICdUd2Vlbk1heCcsICdUaW1lbGluZU1heCddLCBmYWN0b3J5KTtcblx0fSBlbHNlIGlmICh0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcpIHtcblx0XHQvLyBDb21tb25KU1xuXHRcdC8vIExvYWRzIHdob2xlIGdzYXAgcGFja2FnZSBvbnRvIGdsb2JhbCBzY29wZS5cblx0XHRyZXF1aXJlKCdnc2FwJyk7XG5cdFx0ZmFjdG9yeShyZXF1aXJlKCdzY3JvbGxtYWdpYycpLCBUd2Vlbk1heCwgVGltZWxpbmVNYXgpO1xuXHR9IGVsc2Uge1xuXHRcdC8vIEJyb3dzZXIgZ2xvYmFsc1xuXHRcdGZhY3Rvcnkocm9vdC5TY3JvbGxNYWdpYyB8fCAocm9vdC5qUXVlcnkgJiYgcm9vdC5qUXVlcnkuU2Nyb2xsTWFnaWMpLCByb290LlR3ZWVuTWF4IHx8IHJvb3QuVHdlZW5MaXRlLCByb290LlRpbWVsaW5lTWF4IHx8IHJvb3QuVGltZWxpbmVMaXRlKTtcblx0fVxufSh0aGlzLCBmdW5jdGlvbiAoU2Nyb2xsTWFnaWMsIFR3ZWVuLCBUaW1lbGluZSkge1xuXHRcInVzZSBzdHJpY3RcIjtcblx0dmFyIE5BTUVTUEFDRSA9IFwiYW5pbWF0aW9uLmdzYXBcIjtcblxuXHR2YXJcblx0Y29uc29sZSA9IHdpbmRvdy5jb25zb2xlIHx8IHt9LFxuXHRcdGVyciA9IEZ1bmN0aW9uLnByb3RvdHlwZS5iaW5kLmNhbGwoY29uc29sZS5lcnJvciB8fCBjb25zb2xlLmxvZyB8fFxuXHRcdGZ1bmN0aW9uICgpIHt9LCBjb25zb2xlKTtcblx0aWYgKCFTY3JvbGxNYWdpYykge1xuXHRcdGVycihcIihcIiArIE5BTUVTUEFDRSArIFwiKSAtPiBFUlJPUjogVGhlIFNjcm9sbE1hZ2ljIG1haW4gbW9kdWxlIGNvdWxkIG5vdCBiZSBmb3VuZC4gUGxlYXNlIG1ha2Ugc3VyZSBpdCdzIGxvYWRlZCBiZWZvcmUgdGhpcyBwbHVnaW4gb3IgdXNlIGFuIGFzeW5jaHJvbm91cyBsb2FkZXIgbGlrZSByZXF1aXJlanMuXCIpO1xuXHR9XG5cdGlmICghVHdlZW4pIHtcblx0XHRlcnIoXCIoXCIgKyBOQU1FU1BBQ0UgKyBcIikgLT4gRVJST1I6IFR3ZWVuTGl0ZSBvciBUd2Vlbk1heCBjb3VsZCBub3QgYmUgZm91bmQuIFBsZWFzZSBtYWtlIHN1cmUgR1NBUCBpcyBsb2FkZWQgYmVmb3JlIFNjcm9sbE1hZ2ljIG9yIHVzZSBhbiBhc3luY2hyb25vdXMgbG9hZGVyIGxpa2UgcmVxdWlyZWpzLlwiKTtcblx0fVxuXG4vKlxuXHQgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cdCAqIEV4dGVuc2lvbnMgZm9yIFNjZW5lXG5cdCAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblx0ICovXG5cdC8qKlxuXHQgKiBFdmVyeSBpbnN0YW5jZSBvZiBTY3JvbGxNYWdpYy5TY2VuZSBub3cgYWNjZXB0cyBhbiBhZGRpdGlvbmFsIG9wdGlvbi4gIFxuXHQgKiBTZWUge0BsaW5rIFNjcm9sbE1hZ2ljLlNjZW5lfSBmb3IgYSBjb21wbGV0ZSBsaXN0IG9mIHRoZSBzdGFuZGFyZCBvcHRpb25zLlxuXHQgKiBAbWVtYmVyb2YhIGFuaW1hdGlvbi5HU0FQI1xuXHQgKiBAbWV0aG9kIG5ldyBTY3JvbGxNYWdpYy5TY2VuZShvcHRpb25zKVxuXHQgKiBAZXhhbXBsZVxuXHQgKiB2YXIgc2NlbmUgPSBuZXcgU2Nyb2xsTWFnaWMuU2NlbmUoe3R3ZWVuQ2hhbmdlczogdHJ1ZX0pO1xuXHQgKlxuXHQgKiBAcGFyYW0ge29iamVjdH0gW29wdGlvbnNdIC0gT3B0aW9ucyBmb3IgdGhlIFNjZW5lLiBUaGUgb3B0aW9ucyBjYW4gYmUgdXBkYXRlZCBhdCBhbnkgdGltZS5cblx0ICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy50d2VlbkNoYW5nZXM9ZmFsc2VdIC0gVHdlZW5zIEFuaW1hdGlvbiB0byB0aGUgcHJvZ3Jlc3MgdGFyZ2V0IGluc3RlYWQgb2Ygc2V0dGluZyBpdC4gIFxuXHQgRG9lcyBub3QgYWZmZWN0IGFuaW1hdGlvbnMgd2hlcmUgZHVyYXRpb24gaXMgYDBgLlxuXHQgKi9cblx0LyoqXG5cdCAqICoqR2V0Kiogb3IgKipTZXQqKiB0aGUgdHdlZW5DaGFuZ2VzIG9wdGlvbiB2YWx1ZS4gIFxuXHQgKiBUaGlzIG9ubHkgYWZmZWN0cyBzY2VuZXMgd2l0aCBhIGR1cmF0aW9uLiBJZiBgdHdlZW5DaGFuZ2VzYCBpcyBgdHJ1ZWAsIHRoZSBwcm9ncmVzcyB1cGRhdGUgd2hlbiBzY3JvbGxpbmcgd2lsbCBub3QgYmUgaW1tZWRpYXRlLCBidXQgaW5zdGVhZCB0aGUgYW5pbWF0aW9uIHdpbGwgc21vb3RobHkgYW5pbWF0ZSB0byB0aGUgdGFyZ2V0IHN0YXRlLiAgXG5cdCAqIEZvciBhIGJldHRlciB1bmRlcnN0YW5kaW5nLCB0cnkgZW5hYmxpbmcgYW5kIGRpc2FibGluZyB0aGlzIG9wdGlvbiBpbiB0aGUgW1NjZW5lIE1hbmlwdWxhdGlvbiBFeGFtcGxlXSguLi9leGFtcGxlcy9iYXNpYy9zY2VuZV9tYW5pcHVsYXRpb24uaHRtbCkuXG5cdCAqIEBtZW1iZXJvZiEgYW5pbWF0aW9uLkdTQVAjXG5cdCAqIEBtZXRob2QgU2NlbmUudHdlZW5DaGFuZ2VzXG5cdCAqIFxuXHQgKiBAZXhhbXBsZVxuXHQgKiAvLyBnZXQgdGhlIGN1cnJlbnQgdHdlZW5DaGFuZ2VzIG9wdGlvblxuXHQgKiB2YXIgdHdlZW5DaGFuZ2VzID0gc2NlbmUudHdlZW5DaGFuZ2VzKCk7XG5cdCAqXG5cdCAqIC8vIHNldCBuZXcgdHdlZW5DaGFuZ2VzIG9wdGlvblxuXHQgKiBzY2VuZS50d2VlbkNoYW5nZXModHJ1ZSk7XG5cdCAqXG5cdCAqIEBmaXJlcyB7QGxpbmsgU2NlbmUuY2hhbmdlfSwgd2hlbiB1c2VkIGFzIHNldHRlclxuXHQgKiBAcGFyYW0ge2Jvb2xlYW59IFtuZXdUd2VlbkNoYW5nZXNdIC0gVGhlIG5ldyB0d2VlbkNoYW5nZXMgc2V0dGluZyBvZiB0aGUgc2NlbmUuXG5cdCAqIEByZXR1cm5zIHtib29sZWFufSBgZ2V0YCAtICBDdXJyZW50IHR3ZWVuQ2hhbmdlcyBvcHRpb24gdmFsdWUuXG5cdCAqIEByZXR1cm5zIHtTY2VuZX0gYHNldGAgLSAgUGFyZW50IG9iamVjdCBmb3IgY2hhaW5pbmcuXG5cdCAqL1xuXHQvLyBhZGQgb3B0aW9uIChUT0RPOiBET0MgKHByaXZhdGUgZm9yIGRldikpXG5cdFNjcm9sbE1hZ2ljLlNjZW5lLmFkZE9wdGlvbihcInR3ZWVuQ2hhbmdlc1wiLCAvLyBuYW1lXG5cdGZhbHNlLCAvLyBkZWZhdWx0XG5cblxuXHRmdW5jdGlvbiAodmFsKSB7IC8vIHZhbGlkYXRpb24gY2FsbGJhY2tcblx0XHRyZXR1cm4gISF2YWw7XG5cdH0pO1xuXHQvLyBleHRlbmQgc2NlbmVcblx0U2Nyb2xsTWFnaWMuU2NlbmUuZXh0ZW5kKGZ1bmN0aW9uICgpIHtcblx0XHR2YXIgU2NlbmUgPSB0aGlzLFxuXHRcdFx0X3R3ZWVuO1xuXG5cdFx0dmFyIGxvZyA9IGZ1bmN0aW9uICgpIHtcblx0XHRcdGlmIChTY2VuZS5fbG9nKSB7IC8vIG5vdCBhdmFpbGFibGUsIHdoZW4gbWFpbiBzb3VyY2UgbWluaWZpZWRcblx0XHRcdFx0QXJyYXkucHJvdG90eXBlLnNwbGljZS5jYWxsKGFyZ3VtZW50cywgMSwgMCwgXCIoXCIgKyBOQU1FU1BBQ0UgKyBcIilcIiwgXCItPlwiKTtcblx0XHRcdFx0U2NlbmUuX2xvZy5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuXHRcdFx0fVxuXHRcdH07XG5cblx0XHQvLyBzZXQgbGlzdGVuZXJzXG5cdFx0U2NlbmUub24oXCJwcm9ncmVzcy5wbHVnaW5fZ3NhcFwiLCBmdW5jdGlvbiAoKSB7XG5cdFx0XHR1cGRhdGVUd2VlblByb2dyZXNzKCk7XG5cdFx0fSk7XG5cdFx0U2NlbmUub24oXCJkZXN0cm95LnBsdWdpbl9nc2FwXCIsIGZ1bmN0aW9uIChlKSB7XG5cdFx0XHRTY2VuZS5yZW1vdmVUd2VlbihlLnJlc2V0KTtcblx0XHR9KTtcblxuXHRcdC8qKlxuXHRcdCAqIFVwZGF0ZSB0aGUgdHdlZW4gcHJvZ3Jlc3MgdG8gY3VycmVudCBwb3NpdGlvbi5cblx0XHQgKiBAcHJpdmF0ZVxuXHRcdCAqL1xuXHRcdHZhciB1cGRhdGVUd2VlblByb2dyZXNzID0gZnVuY3Rpb24gKCkge1xuXHRcdFx0aWYgKF90d2Vlbikge1xuXHRcdFx0XHR2YXJcblx0XHRcdFx0cHJvZ3Jlc3MgPSBTY2VuZS5wcm9ncmVzcygpLFxuXHRcdFx0XHRcdHN0YXRlID0gU2NlbmUuc3RhdGUoKTtcblx0XHRcdFx0aWYgKF90d2Vlbi5yZXBlYXQgJiYgX3R3ZWVuLnJlcGVhdCgpID09PSAtMSkge1xuXHRcdFx0XHRcdC8vIGluZmluaXRlIGxvb3AsIHNvIG5vdCBpbiByZWxhdGlvbiB0byBwcm9ncmVzc1xuXHRcdFx0XHRcdGlmIChzdGF0ZSA9PT0gJ0RVUklORycgJiYgX3R3ZWVuLnBhdXNlZCgpKSB7XG5cdFx0XHRcdFx0XHRfdHdlZW4ucGxheSgpO1xuXHRcdFx0XHRcdH0gZWxzZSBpZiAoc3RhdGUgIT09ICdEVVJJTkcnICYmICFfdHdlZW4ucGF1c2VkKCkpIHtcblx0XHRcdFx0XHRcdF90d2Vlbi5wYXVzZSgpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSBlbHNlIGlmIChwcm9ncmVzcyAhPSBfdHdlZW4ucHJvZ3Jlc3MoKSkgeyAvLyBkbyB3ZSBldmVuIG5lZWQgdG8gdXBkYXRlIHRoZSBwcm9ncmVzcz9cblx0XHRcdFx0XHQvLyBubyBpbmZpbml0ZSBsb29wIC0gc28gc2hvdWxkIHdlIGp1c3QgcGxheSBvciBnbyB0byBhIHNwZWNpZmljIHBvaW50IGluIHRpbWU/XG5cdFx0XHRcdFx0aWYgKFNjZW5lLmR1cmF0aW9uKCkgPT09IDApIHtcblx0XHRcdFx0XHRcdC8vIHBsYXkgdGhlIGFuaW1hdGlvblxuXHRcdFx0XHRcdFx0aWYgKHByb2dyZXNzID4gMCkgeyAvLyBwbGF5IGZyb20gMCB0byAxXG5cdFx0XHRcdFx0XHRcdF90d2Vlbi5wbGF5KCk7XG5cdFx0XHRcdFx0XHR9IGVsc2UgeyAvLyBwbGF5IGZyb20gMSB0byAwXG5cdFx0XHRcdFx0XHRcdF90d2Vlbi5yZXZlcnNlKCk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdC8vIGdvIHRvIGEgc3BlY2lmaWMgcG9pbnQgaW4gdGltZVxuXHRcdFx0XHRcdFx0aWYgKFNjZW5lLnR3ZWVuQ2hhbmdlcygpICYmIF90d2Vlbi50d2VlblRvKSB7XG5cdFx0XHRcdFx0XHRcdC8vIGdvIHNtb290aFxuXHRcdFx0XHRcdFx0XHRfdHdlZW4udHdlZW5Ubyhwcm9ncmVzcyAqIF90d2Vlbi5kdXJhdGlvbigpKTtcblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdC8vIGp1c3QgaGFyZCBzZXQgaXRcblx0XHRcdFx0XHRcdFx0X3R3ZWVuLnByb2dyZXNzKHByb2dyZXNzKS5wYXVzZSgpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH07XG5cblx0XHQvKipcblx0XHQgKiBBZGQgYSB0d2VlbiB0byB0aGUgc2NlbmUuICBcblx0XHQgKiBJZiB5b3Ugd2FudCB0byBhZGQgbXVsdGlwbGUgdHdlZW5zLCBhZGQgdGhlbSBpbnRvIGEgR1NBUCBUaW1lbGluZSBvYmplY3QgYW5kIHN1cHBseSBpdCBpbnN0ZWFkIChzZWUgZXhhbXBsZSBiZWxvdykuICBcblx0XHQgKiBcblx0XHQgKiBJZiB0aGUgc2NlbmUgaGFzIGEgZHVyYXRpb24sIHRoZSB0d2VlbidzIGR1cmF0aW9uIHdpbGwgYmUgcHJvamVjdGVkIHRvIHRoZSBzY3JvbGwgZGlzdGFuY2Ugb2YgdGhlIHNjZW5lLCBtZWFuaW5nIGl0cyBwcm9ncmVzcyB3aWxsIGJlIHN5bmNlZCB0byBzY3JvbGxiYXIgbW92ZW1lbnQuICBcblx0XHQgKiBGb3IgYSBzY2VuZSB3aXRoIGEgZHVyYXRpb24gb2YgYDBgLCB0aGUgdHdlZW4gd2lsbCBiZSB0cmlnZ2VyZWQgd2hlbiBzY3JvbGxpbmcgZm9yd2FyZCBwYXN0IHRoZSBzY2VuZSdzIHRyaWdnZXIgcG9zaXRpb24gYW5kIHJldmVyc2VkLCB3aGVuIHNjcm9sbGluZyBiYWNrLiAgXG5cdFx0ICogVG8gZ2FpbiBiZXR0ZXIgdW5kZXJzdGFuZGluZywgY2hlY2sgb3V0IHRoZSBbU2ltcGxlIFR3ZWVuaW5nIGV4YW1wbGVdKC4uL2V4YW1wbGVzL2Jhc2ljL3NpbXBsZV90d2VlbmluZy5odG1sKS5cblx0XHQgKlxuXHRcdCAqIEluc3RlYWQgb2Ygc3VwcGx5aW5nIGEgdHdlZW4gdGhpcyBtZXRob2QgY2FuIGFsc28gYmUgdXNlZCBhcyBhIHNob3J0aGFuZCBmb3IgYFR3ZWVuTWF4LnRvKClgIChzZWUgZXhhbXBsZSBiZWxvdykuXG5cdFx0ICogQG1lbWJlcm9mISBhbmltYXRpb24uR1NBUCNcblx0XHQgKlxuXHRcdCAqIEBleGFtcGxlXG5cdFx0ICogLy8gYWRkIGEgc2luZ2xlIHR3ZWVuIGRpcmVjdGx5XG5cdFx0ICogc2NlbmUuc2V0VHdlZW4oVHdlZW5NYXgudG8oXCJvYmpcIiksIDEsIHt4OiAxMDB9KTtcblx0XHQgKlxuXHRcdCAqIC8vIGFkZCBhIHNpbmdsZSB0d2VlbiB2aWEgdmFyaWFibGVcblx0XHQgKiB2YXIgdHdlZW4gPSBUd2Vlbk1heC50byhcIm9ialwiKSwgMSwge3g6IDEwMH07XG5cdFx0ICogc2NlbmUuc2V0VHdlZW4odHdlZW4pO1xuXHRcdCAqXG5cdFx0ICogLy8gYWRkIG11bHRpcGxlIHR3ZWVucywgd3JhcHBlZCBpbiBhIHRpbWVsaW5lLlxuXHRcdCAqIHZhciB0aW1lbGluZSA9IG5ldyBUaW1lbGluZU1heCgpO1xuXHRcdCAqIHZhciB0d2VlbjEgPSBUd2Vlbk1heC5mcm9tKFwib2JqMVwiLCAxLCB7eDogMTAwfSk7XG5cdFx0ICogdmFyIHR3ZWVuMiA9IFR3ZWVuTWF4LnRvKFwib2JqMlwiLCAxLCB7eTogMTAwfSk7XG5cdFx0ICogdGltZWxpbmVcblx0XHQgKlx0XHQuYWRkKHR3ZWVuMSlcblx0XHQgKlx0XHQuYWRkKHR3ZWVuMik7XG5cdFx0ICogc2NlbmUuYWRkVHdlZW4odGltZWxpbmUpO1xuXHRcdCAqXG5cdFx0ICogLy8gc2hvcnQgaGFuZCB0byBhZGQgYSBUd2Vlbk1heC50bygpIHR3ZWVuXG5cdFx0ICogc2NlbmUuc2V0VHdlZW4oXCJvYmozXCIsIDAuNSwge3k6IDEwMH0pO1xuXHRcdCAqXG5cdFx0ICogLy8gc2hvcnQgaGFuZCB0byBhZGQgYSBUd2Vlbk1heC50bygpIHR3ZWVuIGZvciAxIHNlY29uZFxuXHRcdCAqIC8vIHRoaXMgaXMgdXNlZnVsLCB3aGVuIHRoZSBzY2VuZSBoYXMgYSBkdXJhdGlvbiBhbmQgdGhlIHR3ZWVuIGR1cmF0aW9uIGlzbid0IGltcG9ydGFudCBhbnl3YXlcblx0XHQgKiBzY2VuZS5zZXRUd2VlbihcIm9iajNcIiwge3k6IDEwMH0pO1xuXHRcdCAqXG5cdFx0ICogQHBhcmFtIHsob2JqZWN0fHN0cmluZyl9IFR3ZWVuT2JqZWN0IC0gQSBUd2Vlbk1heCwgVHdlZW5MaXRlLCBUaW1lbGluZU1heCBvciBUaW1lbGluZUxpdGUgb2JqZWN0IHRoYXQgc2hvdWxkIGJlIGFuaW1hdGVkIGluIHRoZSBzY2VuZS4gQ2FuIGFsc28gYmUgYSBEb20gRWxlbWVudCBvciBTZWxlY3Rvciwgd2hlbiB1c2luZyBkaXJlY3QgdHdlZW4gZGVmaW5pdGlvbiAoc2VlIGV4YW1wbGVzKS5cblx0XHQgKiBAcGFyYW0geyhudW1iZXJ8b2JqZWN0KX0gZHVyYXRpb24gLSBBIGR1cmF0aW9uIGZvciB0aGUgdHdlZW4sIG9yIHR3ZWVuIHBhcmFtZXRlcnMuIElmIGFuIG9iamVjdCBjb250YWluaW5nIHBhcmFtZXRlcnMgYXJlIHN1cHBsaWVkLCBhIGRlZmF1bHQgZHVyYXRpb24gb2YgMSB3aWxsIGJlIHVzZWQuXG5cdFx0ICogQHBhcmFtIHtvYmplY3R9IHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgdHdlZW5cblx0XHQgKiBAcmV0dXJucyB7U2NlbmV9IFBhcmVudCBvYmplY3QgZm9yIGNoYWluaW5nLlxuXHRcdCAqL1xuXHRcdFNjZW5lLnNldFR3ZWVuID0gZnVuY3Rpb24gKFR3ZWVuT2JqZWN0LCBkdXJhdGlvbiwgcGFyYW1zKSB7XG5cdFx0XHR2YXIgbmV3VHdlZW47XG5cdFx0XHRpZiAoYXJndW1lbnRzLmxlbmd0aCA+IDEpIHtcblx0XHRcdFx0aWYgKGFyZ3VtZW50cy5sZW5ndGggPCAzKSB7XG5cdFx0XHRcdFx0cGFyYW1zID0gZHVyYXRpb247XG5cdFx0XHRcdFx0ZHVyYXRpb24gPSAxO1xuXHRcdFx0XHR9XG5cdFx0XHRcdFR3ZWVuT2JqZWN0ID0gVHdlZW4udG8oVHdlZW5PYmplY3QsIGR1cmF0aW9uLCBwYXJhbXMpO1xuXHRcdFx0fVxuXHRcdFx0dHJ5IHtcblx0XHRcdFx0Ly8gd3JhcCBUd2VlbiBpbnRvIGEgVGltZWxpbmUgT2JqZWN0IGlmIGF2YWlsYWJsZSB0byBpbmNsdWRlIGRlbGF5IGFuZCByZXBlYXRzIGluIHRoZSBkdXJhdGlvbiBhbmQgc3RhbmRhcmRpemUgbWV0aG9kcy5cblx0XHRcdFx0aWYgKFRpbWVsaW5lKSB7XG5cdFx0XHRcdFx0bmV3VHdlZW4gPSBuZXcgVGltZWxpbmUoe1xuXHRcdFx0XHRcdFx0c21vb3RoQ2hpbGRUaW1pbmc6IHRydWVcblx0XHRcdFx0XHR9KS5hZGQoVHdlZW5PYmplY3QpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdG5ld1R3ZWVuID0gVHdlZW5PYmplY3Q7XG5cdFx0XHRcdH1cblx0XHRcdFx0bmV3VHdlZW4ucGF1c2UoKTtcblx0XHRcdH0gY2F0Y2ggKGUpIHtcblx0XHRcdFx0bG9nKDEsIFwiRVJST1IgY2FsbGluZyBtZXRob2QgJ3NldFR3ZWVuKCknOiBTdXBwbGllZCBhcmd1bWVudCBpcyBub3QgYSB2YWxpZCBUd2Vlbk9iamVjdFwiKTtcblx0XHRcdFx0cmV0dXJuIFNjZW5lO1xuXHRcdFx0fVxuXHRcdFx0aWYgKF90d2VlbikgeyAvLyBraWxsIG9sZCB0d2Vlbj9cblx0XHRcdFx0U2NlbmUucmVtb3ZlVHdlZW4oKTtcblx0XHRcdH1cblx0XHRcdF90d2VlbiA9IG5ld1R3ZWVuO1xuXG5cdFx0XHQvLyBzb21lIHByb3BlcnRpZXMgbmVlZCB0byBiZSB0cmFuc2ZlcnJlZCBpdCB0byB0aGUgd3JhcHBlciwgb3RoZXJ3aXNlIHRoZXkgd291bGQgZ2V0IGxvc3QuXG5cdFx0XHRpZiAoVHdlZW5PYmplY3QucmVwZWF0ICYmIFR3ZWVuT2JqZWN0LnJlcGVhdCgpID09PSAtMSkgeyAvLyBUd2Vlbk1heCBvciBUaW1lbGluZU1heCBPYmplY3Q/XG5cdFx0XHRcdF90d2Vlbi5yZXBlYXQoLTEpO1xuXHRcdFx0XHRfdHdlZW4ueW95byhUd2Vlbk9iamVjdC55b3lvKCkpO1xuXHRcdFx0fVxuXHRcdFx0Ly8gU29tZSB0d2VlbiB2YWxpZGF0aW9ucyBhbmQgZGVidWdnaW5nIGhlbHBlcnNcblx0XHRcdGlmIChTY2VuZS50d2VlbkNoYW5nZXMoKSAmJiAhX3R3ZWVuLnR3ZWVuVG8pIHtcblx0XHRcdFx0bG9nKDIsIFwiV0FSTklORzogdHdlZW5DaGFuZ2VzIHdpbGwgb25seSB3b3JrIGlmIHRoZSBUaW1lbGluZU1heCBvYmplY3QgaXMgYXZhaWxhYmxlIGZvciBTY3JvbGxNYWdpYy5cIik7XG5cdFx0XHR9XG5cblx0XHRcdC8vIGNoZWNrIGlmIHRoZXJlIGFyZSBwb3NpdGlvbiB0d2VlbnMgZGVmaW5lZCBmb3IgdGhlIHRyaWdnZXIgYW5kIHdhcm4gYWJvdXQgaXQgOilcblx0XHRcdGlmIChfdHdlZW4gJiYgU2NlbmUuY29udHJvbGxlcigpICYmIFNjZW5lLnRyaWdnZXJFbGVtZW50KCkgJiYgU2NlbmUubG9nbGV2ZWwoKSA+PSAyKSB7IC8vIGNvbnRyb2xsZXIgaXMgbmVlZGVkIHRvIGtub3cgc2Nyb2xsIGRpcmVjdGlvbi5cblx0XHRcdFx0dmFyXG5cdFx0XHRcdHRyaWdnZXJUd2VlbnMgPSBUd2Vlbi5nZXRUd2VlbnNPZihTY2VuZS50cmlnZ2VyRWxlbWVudCgpKSxcblx0XHRcdFx0XHR2ZXJ0aWNhbCA9IFNjZW5lLmNvbnRyb2xsZXIoKS5pbmZvKFwidmVydGljYWxcIik7XG5cdFx0XHRcdHRyaWdnZXJUd2VlbnMuZm9yRWFjaChmdW5jdGlvbiAodmFsdWUsIGluZGV4KSB7XG5cdFx0XHRcdFx0dmFyXG5cdFx0XHRcdFx0dHdlZW52YXJzID0gdmFsdWUudmFycy5jc3MgfHwgdmFsdWUudmFycyxcblx0XHRcdFx0XHRcdGNvbmRpdGlvbiA9IHZlcnRpY2FsID8gKHR3ZWVudmFycy50b3AgIT09IHVuZGVmaW5lZCB8fCB0d2VlbnZhcnMuYm90dG9tICE9PSB1bmRlZmluZWQpIDogKHR3ZWVudmFycy5sZWZ0ICE9PSB1bmRlZmluZWQgfHwgdHdlZW52YXJzLnJpZ2h0ICE9PSB1bmRlZmluZWQpO1xuXHRcdFx0XHRcdGlmIChjb25kaXRpb24pIHtcblx0XHRcdFx0XHRcdGxvZygyLCBcIldBUk5JTkc6IFR3ZWVuaW5nIHRoZSBwb3NpdGlvbiBvZiB0aGUgdHJpZ2dlciBlbGVtZW50IGFmZmVjdHMgdGhlIHNjZW5lIHRpbWluZyBhbmQgc2hvdWxkIGJlIGF2b2lkZWQhXCIpO1xuXHRcdFx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIHdhcm4gYWJvdXQgdHdlZW4gb3ZlcndyaXRlcywgd2hlbiBhbiBlbGVtZW50IGlzIHR3ZWVuZWQgbXVsdGlwbGUgdGltZXNcblx0XHRcdGlmIChwYXJzZUZsb2F0KFR3ZWVuTGl0ZS52ZXJzaW9uKSA+PSAxLjE0KSB7IC8vIG9uT3ZlcndyaXRlIG9ubHkgcHJlc2VudCBzaW5jZSBHU0FQIHYxLjE0LjBcblx0XHRcdFx0dmFyXG5cdFx0XHRcdGxpc3QgPSBfdHdlZW4uZ2V0Q2hpbGRyZW4gPyBfdHdlZW4uZ2V0Q2hpbGRyZW4odHJ1ZSwgdHJ1ZSwgZmFsc2UpIDogW190d2Vlbl0sXG5cdFx0XHRcdFx0Ly8gZ2V0IGFsbCBuZXN0ZWQgdHdlZW4gb2JqZWN0c1xuXHRcdFx0XHRcdG5ld0NhbGxiYWNrID0gZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdFx0bG9nKDIsIFwiV0FSTklORzogdHdlZW4gd2FzIG92ZXJ3cml0dGVuIGJ5IGFub3RoZXIuIFRvIGxlYXJuIGhvdyB0byBhdm9pZCB0aGlzIGlzc3VlIHNlZSBoZXJlOiBodHRwczovL2dpdGh1Yi5jb20vamFucGFlcGtlL1Njcm9sbE1hZ2ljL3dpa2kvV0FSTklORzotdHdlZW4td2FzLW92ZXJ3cml0dGVuLWJ5LWFub3RoZXJcIik7XG5cdFx0XHRcdFx0fTtcblx0XHRcdFx0Zm9yICh2YXIgaSA9IDAsIHRoaXNUd2Vlbiwgb2xkQ2FsbGJhY2s7IGkgPCBsaXN0Lmxlbmd0aDsgaSsrKSB7IC8qanNoaW50IGxvb3BmdW5jOiB0cnVlICovXG5cdFx0XHRcdFx0dGhpc1R3ZWVuID0gbGlzdFtpXTtcblx0XHRcdFx0XHRpZiAob2xkQ2FsbGJhY2sgIT09IG5ld0NhbGxiYWNrKSB7IC8vIGlmIHR3ZWVucyBpcyBhZGRlZCBtb3JlIHRoYW4gb25jZVxuXHRcdFx0XHRcdFx0b2xkQ2FsbGJhY2sgPSB0aGlzVHdlZW4udmFycy5vbk92ZXJ3cml0ZTtcblx0XHRcdFx0XHRcdHRoaXNUd2Vlbi52YXJzLm9uT3ZlcndyaXRlID0gZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdFx0XHRpZiAob2xkQ2FsbGJhY2spIHtcblx0XHRcdFx0XHRcdFx0XHRvbGRDYWxsYmFjay5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdG5ld0NhbGxiYWNrLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG5cdFx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0bG9nKDMsIFwiYWRkZWQgdHdlZW5cIik7XG5cblx0XHRcdHVwZGF0ZVR3ZWVuUHJvZ3Jlc3MoKTtcblx0XHRcdHJldHVybiBTY2VuZTtcblx0XHR9O1xuXG5cdFx0LyoqXG5cdFx0ICogUmVtb3ZlIHRoZSB0d2VlbiBmcm9tIHRoZSBzY2VuZS4gIFxuXHRcdCAqIFRoaXMgd2lsbCB0ZXJtaW5hdGUgdGhlIGNvbnRyb2wgb2YgdGhlIFNjZW5lIG92ZXIgdGhlIHR3ZWVuLlxuXHRcdCAqXG5cdFx0ICogVXNpbmcgdGhlIHJlc2V0IG9wdGlvbiB5b3UgY2FuIGRlY2lkZSBpZiB0aGUgdHdlZW4gc2hvdWxkIHJlbWFpbiBpbiB0aGUgY3VycmVudCBzdGF0ZSBvciBiZSByZXdvdW5kIHRvIHNldCB0aGUgdGFyZ2V0IGVsZW1lbnRzIGJhY2sgdG8gdGhlIHN0YXRlIHRoZXkgd2VyZSBpbiBiZWZvcmUgdGhlIHR3ZWVuIHdhcyBhZGRlZCB0byB0aGUgc2NlbmUuXG5cdFx0ICogQG1lbWJlcm9mISBhbmltYXRpb24uR1NBUCNcblx0XHQgKlxuXHRcdCAqIEBleGFtcGxlXG5cdFx0ICogLy8gcmVtb3ZlIHRoZSB0d2VlbiBmcm9tIHRoZSBzY2VuZSB3aXRob3V0IHJlc2V0dGluZyBpdFxuXHRcdCAqIHNjZW5lLnJlbW92ZVR3ZWVuKCk7XG5cdFx0ICpcblx0XHQgKiAvLyByZW1vdmUgdGhlIHR3ZWVuIGZyb20gdGhlIHNjZW5lIGFuZCByZXNldCBpdCB0byBpbml0aWFsIHBvc2l0aW9uXG5cdFx0ICogc2NlbmUucmVtb3ZlVHdlZW4odHJ1ZSk7XG5cdFx0ICpcblx0XHQgKiBAcGFyYW0ge2Jvb2xlYW59IFtyZXNldD1mYWxzZV0gLSBJZiBgdHJ1ZWAgdGhlIHR3ZWVuIHdpbGwgYmUgcmVzZXQgdG8gaXRzIGluaXRpYWwgdmFsdWVzLlxuXHRcdCAqIEByZXR1cm5zIHtTY2VuZX0gUGFyZW50IG9iamVjdCBmb3IgY2hhaW5pbmcuXG5cdFx0ICovXG5cdFx0U2NlbmUucmVtb3ZlVHdlZW4gPSBmdW5jdGlvbiAocmVzZXQpIHtcblx0XHRcdGlmIChfdHdlZW4pIHtcblx0XHRcdFx0aWYgKHJlc2V0KSB7XG5cdFx0XHRcdFx0X3R3ZWVuLnByb2dyZXNzKDApLnBhdXNlKCk7XG5cdFx0XHRcdH1cblx0XHRcdFx0X3R3ZWVuLmtpbGwoKTtcblx0XHRcdFx0X3R3ZWVuID0gdW5kZWZpbmVkO1xuXHRcdFx0XHRsb2coMywgXCJyZW1vdmVkIHR3ZWVuIChyZXNldDogXCIgKyAocmVzZXQgPyBcInRydWVcIiA6IFwiZmFsc2VcIikgKyBcIilcIik7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gU2NlbmU7XG5cdFx0fTtcblxuXHR9KTtcbn0pKTsiLCJ2YXIgbmV4dFRpY2sgPSByZXF1aXJlKCdwcm9jZXNzL2Jyb3dzZXIuanMnKS5uZXh0VGljaztcbnZhciBhcHBseSA9IEZ1bmN0aW9uLnByb3RvdHlwZS5hcHBseTtcbnZhciBzbGljZSA9IEFycmF5LnByb3RvdHlwZS5zbGljZTtcbnZhciBpbW1lZGlhdGVJZHMgPSB7fTtcbnZhciBuZXh0SW1tZWRpYXRlSWQgPSAwO1xuXG4vLyBET00gQVBJcywgZm9yIGNvbXBsZXRlbmVzc1xuXG5leHBvcnRzLnNldFRpbWVvdXQgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIG5ldyBUaW1lb3V0KGFwcGx5LmNhbGwoc2V0VGltZW91dCwgd2luZG93LCBhcmd1bWVudHMpLCBjbGVhclRpbWVvdXQpO1xufTtcbmV4cG9ydHMuc2V0SW50ZXJ2YWwgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIG5ldyBUaW1lb3V0KGFwcGx5LmNhbGwoc2V0SW50ZXJ2YWwsIHdpbmRvdywgYXJndW1lbnRzKSwgY2xlYXJJbnRlcnZhbCk7XG59O1xuZXhwb3J0cy5jbGVhclRpbWVvdXQgPVxuZXhwb3J0cy5jbGVhckludGVydmFsID0gZnVuY3Rpb24odGltZW91dCkgeyB0aW1lb3V0LmNsb3NlKCk7IH07XG5cbmZ1bmN0aW9uIFRpbWVvdXQoaWQsIGNsZWFyRm4pIHtcbiAgdGhpcy5faWQgPSBpZDtcbiAgdGhpcy5fY2xlYXJGbiA9IGNsZWFyRm47XG59XG5UaW1lb3V0LnByb3RvdHlwZS51bnJlZiA9IFRpbWVvdXQucHJvdG90eXBlLnJlZiA9IGZ1bmN0aW9uKCkge307XG5UaW1lb3V0LnByb3RvdHlwZS5jbG9zZSA9IGZ1bmN0aW9uKCkge1xuICB0aGlzLl9jbGVhckZuLmNhbGwod2luZG93LCB0aGlzLl9pZCk7XG59O1xuXG4vLyBEb2VzIG5vdCBzdGFydCB0aGUgdGltZSwganVzdCBzZXRzIHVwIHRoZSBtZW1iZXJzIG5lZWRlZC5cbmV4cG9ydHMuZW5yb2xsID0gZnVuY3Rpb24oaXRlbSwgbXNlY3MpIHtcbiAgY2xlYXJUaW1lb3V0KGl0ZW0uX2lkbGVUaW1lb3V0SWQpO1xuICBpdGVtLl9pZGxlVGltZW91dCA9IG1zZWNzO1xufTtcblxuZXhwb3J0cy51bmVucm9sbCA9IGZ1bmN0aW9uKGl0ZW0pIHtcbiAgY2xlYXJUaW1lb3V0KGl0ZW0uX2lkbGVUaW1lb3V0SWQpO1xuICBpdGVtLl9pZGxlVGltZW91dCA9IC0xO1xufTtcblxuZXhwb3J0cy5fdW5yZWZBY3RpdmUgPSBleHBvcnRzLmFjdGl2ZSA9IGZ1bmN0aW9uKGl0ZW0pIHtcbiAgY2xlYXJUaW1lb3V0KGl0ZW0uX2lkbGVUaW1lb3V0SWQpO1xuXG4gIHZhciBtc2VjcyA9IGl0ZW0uX2lkbGVUaW1lb3V0O1xuICBpZiAobXNlY3MgPj0gMCkge1xuICAgIGl0ZW0uX2lkbGVUaW1lb3V0SWQgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uIG9uVGltZW91dCgpIHtcbiAgICAgIGlmIChpdGVtLl9vblRpbWVvdXQpXG4gICAgICAgIGl0ZW0uX29uVGltZW91dCgpO1xuICAgIH0sIG1zZWNzKTtcbiAgfVxufTtcblxuLy8gVGhhdCdzIG5vdCBob3cgbm9kZS5qcyBpbXBsZW1lbnRzIGl0IGJ1dCB0aGUgZXhwb3NlZCBhcGkgaXMgdGhlIHNhbWUuXG5leHBvcnRzLnNldEltbWVkaWF0ZSA9IHR5cGVvZiBzZXRJbW1lZGlhdGUgPT09IFwiZnVuY3Rpb25cIiA/IHNldEltbWVkaWF0ZSA6IGZ1bmN0aW9uKGZuKSB7XG4gIHZhciBpZCA9IG5leHRJbW1lZGlhdGVJZCsrO1xuICB2YXIgYXJncyA9IGFyZ3VtZW50cy5sZW5ndGggPCAyID8gZmFsc2UgOiBzbGljZS5jYWxsKGFyZ3VtZW50cywgMSk7XG5cbiAgaW1tZWRpYXRlSWRzW2lkXSA9IHRydWU7XG5cbiAgbmV4dFRpY2soZnVuY3Rpb24gb25OZXh0VGljaygpIHtcbiAgICBpZiAoaW1tZWRpYXRlSWRzW2lkXSkge1xuICAgICAgLy8gZm4uY2FsbCgpIGlzIGZhc3RlciBzbyB3ZSBvcHRpbWl6ZSBmb3IgdGhlIGNvbW1vbiB1c2UtY2FzZVxuICAgICAgLy8gQHNlZSBodHRwOi8vanNwZXJmLmNvbS9jYWxsLWFwcGx5LXNlZ3VcbiAgICAgIGlmIChhcmdzKSB7XG4gICAgICAgIGZuLmFwcGx5KG51bGwsIGFyZ3MpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZm4uY2FsbChudWxsKTtcbiAgICAgIH1cbiAgICAgIC8vIFByZXZlbnQgaWRzIGZyb20gbGVha2luZ1xuICAgICAgZXhwb3J0cy5jbGVhckltbWVkaWF0ZShpZCk7XG4gICAgfVxuICB9KTtcblxuICByZXR1cm4gaWQ7XG59O1xuXG5leHBvcnRzLmNsZWFySW1tZWRpYXRlID0gdHlwZW9mIGNsZWFySW1tZWRpYXRlID09PSBcImZ1bmN0aW9uXCIgPyBjbGVhckltbWVkaWF0ZSA6IGZ1bmN0aW9uKGlkKSB7XG4gIGRlbGV0ZSBpbW1lZGlhdGVJZHNbaWRdO1xufTsiLCIvKiEgVUlraXQgMy4wLjMgfCBodHRwOi8vd3d3LmdldHVpa2l0LmNvbSB8IChjKSAyMDE0IC0gMjAxOCBZT090aGVtZSB8IE1JVCBMaWNlbnNlICovXG5cbihmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnID8gbW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KCkgOlxuICAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZSgndWlraXQnLCBmYWN0b3J5KSA6XG4gICAgKGdsb2JhbCA9IGdsb2JhbCB8fCBzZWxmLCBnbG9iYWwuVUlraXQgPSBmYWN0b3J5KCkpO1xufSh0aGlzLCBmdW5jdGlvbiAoKSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIGZ1bmN0aW9uIGJpbmQoZm4sIGNvbnRleHQpIHtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChhKSB7XG4gICAgICAgICAgICB2YXIgbCA9IGFyZ3VtZW50cy5sZW5ndGg7XG4gICAgICAgICAgICByZXR1cm4gbCA/IGwgPiAxID8gZm4uYXBwbHkoY29udGV4dCwgYXJndW1lbnRzKSA6IGZuLmNhbGwoY29udGV4dCwgYSkgOiBmbi5jYWxsKGNvbnRleHQpO1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIHZhciBvYmpQcm90b3R5cGUgPSBPYmplY3QucHJvdG90eXBlO1xuICAgIHZhciBoYXNPd25Qcm9wZXJ0eSA9IG9ialByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTtcblxuICAgIGZ1bmN0aW9uIGhhc093bihvYmosIGtleSkge1xuICAgICAgICByZXR1cm4gaGFzT3duUHJvcGVydHkuY2FsbChvYmosIGtleSk7XG4gICAgfVxuXG4gICAgdmFyIGh5cGhlbmF0ZUNhY2hlID0ge307XG4gICAgdmFyIGh5cGhlbmF0ZVJlID0gLyhbYS16XFxkXSkoW0EtWl0pL2c7XG5cbiAgICBmdW5jdGlvbiBoeXBoZW5hdGUoc3RyKSB7XG5cbiAgICAgICAgaWYgKCEoc3RyIGluIGh5cGhlbmF0ZUNhY2hlKSkge1xuICAgICAgICAgICAgaHlwaGVuYXRlQ2FjaGVbc3RyXSA9IHN0clxuICAgICAgICAgICAgICAgIC5yZXBsYWNlKGh5cGhlbmF0ZVJlLCAnJDEtJDInKVxuICAgICAgICAgICAgICAgIC50b0xvd2VyQ2FzZSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGh5cGhlbmF0ZUNhY2hlW3N0cl07XG4gICAgfVxuXG4gICAgdmFyIGNhbWVsaXplUmUgPSAvLShcXHcpL2c7XG5cbiAgICBmdW5jdGlvbiBjYW1lbGl6ZShzdHIpIHtcbiAgICAgICAgcmV0dXJuIHN0ci5yZXBsYWNlKGNhbWVsaXplUmUsIHRvVXBwZXIpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHRvVXBwZXIoXywgYykge1xuICAgICAgICByZXR1cm4gYyA/IGMudG9VcHBlckNhc2UoKSA6ICcnO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHVjZmlyc3Qoc3RyKSB7XG4gICAgICAgIHJldHVybiBzdHIubGVuZ3RoID8gdG9VcHBlcihudWxsLCBzdHIuY2hhckF0KDApKSArIHN0ci5zbGljZSgxKSA6ICcnO1xuICAgIH1cblxuICAgIHZhciBzdHJQcm90b3R5cGUgPSBTdHJpbmcucHJvdG90eXBlO1xuICAgIHZhciBzdGFydHNXaXRoRm4gPSBzdHJQcm90b3R5cGUuc3RhcnRzV2l0aCB8fCBmdW5jdGlvbiAoc2VhcmNoKSB7IHJldHVybiB0aGlzLmxhc3RJbmRleE9mKHNlYXJjaCwgMCkgPT09IDA7IH07XG5cbiAgICBmdW5jdGlvbiBzdGFydHNXaXRoKHN0ciwgc2VhcmNoKSB7XG4gICAgICAgIHJldHVybiBzdGFydHNXaXRoRm4uY2FsbChzdHIsIHNlYXJjaCk7XG4gICAgfVxuXG4gICAgdmFyIGVuZHNXaXRoRm4gPSBzdHJQcm90b3R5cGUuZW5kc1dpdGggfHwgZnVuY3Rpb24gKHNlYXJjaCkgeyByZXR1cm4gdGhpcy5zdWJzdHIoLXNlYXJjaC5sZW5ndGgpID09PSBzZWFyY2g7IH07XG5cbiAgICBmdW5jdGlvbiBlbmRzV2l0aChzdHIsIHNlYXJjaCkge1xuICAgICAgICByZXR1cm4gZW5kc1dpdGhGbi5jYWxsKHN0ciwgc2VhcmNoKTtcbiAgICB9XG5cbiAgICB2YXIgaW5jbHVkZXNGbiA9IGZ1bmN0aW9uIChzZWFyY2gpIHsgcmV0dXJuIH50aGlzLmluZGV4T2Yoc2VhcmNoKTsgfTtcbiAgICB2YXIgaW5jbHVkZXNTdHIgPSBzdHJQcm90b3R5cGUuaW5jbHVkZXMgfHwgaW5jbHVkZXNGbjtcbiAgICB2YXIgaW5jbHVkZXNBcnJheSA9IEFycmF5LnByb3RvdHlwZS5pbmNsdWRlcyB8fCBpbmNsdWRlc0ZuO1xuXG4gICAgZnVuY3Rpb24gaW5jbHVkZXMob2JqLCBzZWFyY2gpIHtcbiAgICAgICAgcmV0dXJuIG9iaiAmJiAoaXNTdHJpbmcob2JqKSA/IGluY2x1ZGVzU3RyIDogaW5jbHVkZXNBcnJheSkuY2FsbChvYmosIHNlYXJjaCk7XG4gICAgfVxuXG4gICAgdmFyIGlzQXJyYXkgPSBBcnJheS5pc0FycmF5O1xuXG4gICAgZnVuY3Rpb24gaXNGdW5jdGlvbihvYmopIHtcbiAgICAgICAgcmV0dXJuIHR5cGVvZiBvYmogPT09ICdmdW5jdGlvbic7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNPYmplY3Qob2JqKSB7XG4gICAgICAgIHJldHVybiBvYmogIT09IG51bGwgJiYgdHlwZW9mIG9iaiA9PT0gJ29iamVjdCc7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNQbGFpbk9iamVjdChvYmopIHtcbiAgICAgICAgcmV0dXJuIGlzT2JqZWN0KG9iaikgJiYgT2JqZWN0LmdldFByb3RvdHlwZU9mKG9iaikgPT09IG9ialByb3RvdHlwZTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpc1dpbmRvdyhvYmopIHtcbiAgICAgICAgcmV0dXJuIGlzT2JqZWN0KG9iaikgJiYgb2JqID09PSBvYmoud2luZG93O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGlzRG9jdW1lbnQob2JqKSB7XG4gICAgICAgIHJldHVybiBpc09iamVjdChvYmopICYmIG9iai5ub2RlVHlwZSA9PT0gOTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpc0pRdWVyeShvYmopIHtcbiAgICAgICAgcmV0dXJuIGlzT2JqZWN0KG9iaikgJiYgISFvYmouanF1ZXJ5O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGlzTm9kZShvYmopIHtcbiAgICAgICAgcmV0dXJuIG9iaiBpbnN0YW5jZW9mIE5vZGUgfHwgaXNPYmplY3Qob2JqKSAmJiBvYmoubm9kZVR5cGUgPj0gMTtcbiAgICB9XG5cbiAgICB2YXIgdG9TdHJpbmcgPSBvYmpQcm90b3R5cGUudG9TdHJpbmc7XG4gICAgZnVuY3Rpb24gaXNOb2RlQ29sbGVjdGlvbihvYmopIHtcbiAgICAgICAgcmV0dXJuIHRvU3RyaW5nLmNhbGwob2JqKS5tYXRjaCgvXlxcW29iamVjdCAoTm9kZUxpc3R8SFRNTENvbGxlY3Rpb24pXFxdJC8pO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGlzQm9vbGVhbih2YWx1ZSkge1xuICAgICAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnYm9vbGVhbic7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNTdHJpbmcodmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZyc7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNOdW1iZXIodmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcic7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNOdW1lcmljKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBpc051bWJlcih2YWx1ZSkgfHwgaXNTdHJpbmcodmFsdWUpICYmICFpc05hTih2YWx1ZSAtIHBhcnNlRmxvYXQodmFsdWUpKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpc1VuZGVmaW5lZCh2YWx1ZSkge1xuICAgICAgICByZXR1cm4gdmFsdWUgPT09IHZvaWQgMDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiB0b0Jvb2xlYW4odmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIGlzQm9vbGVhbih2YWx1ZSlcbiAgICAgICAgICAgID8gdmFsdWVcbiAgICAgICAgICAgIDogdmFsdWUgPT09ICd0cnVlJyB8fCB2YWx1ZSA9PT0gJzEnIHx8IHZhbHVlID09PSAnJ1xuICAgICAgICAgICAgICAgID8gdHJ1ZVxuICAgICAgICAgICAgICAgIDogdmFsdWUgPT09ICdmYWxzZScgfHwgdmFsdWUgPT09ICcwJ1xuICAgICAgICAgICAgICAgICAgICA/IGZhbHNlXG4gICAgICAgICAgICAgICAgICAgIDogdmFsdWU7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gdG9OdW1iZXIodmFsdWUpIHtcbiAgICAgICAgdmFyIG51bWJlciA9IE51bWJlcih2YWx1ZSk7XG4gICAgICAgIHJldHVybiAhaXNOYU4obnVtYmVyKSA/IG51bWJlciA6IGZhbHNlO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHRvRmxvYXQodmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIHBhcnNlRmxvYXQodmFsdWUpIHx8IDA7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gdG9Ob2RlKGVsZW1lbnQpIHtcbiAgICAgICAgcmV0dXJuIGlzTm9kZShlbGVtZW50KSB8fCBpc1dpbmRvdyhlbGVtZW50KSB8fCBpc0RvY3VtZW50KGVsZW1lbnQpXG4gICAgICAgICAgICA/IGVsZW1lbnRcbiAgICAgICAgICAgIDogaXNOb2RlQ29sbGVjdGlvbihlbGVtZW50KSB8fCBpc0pRdWVyeShlbGVtZW50KVxuICAgICAgICAgICAgICAgID8gZWxlbWVudFswXVxuICAgICAgICAgICAgICAgIDogaXNBcnJheShlbGVtZW50KVxuICAgICAgICAgICAgICAgICAgICA/IHRvTm9kZShlbGVtZW50WzBdKVxuICAgICAgICAgICAgICAgICAgICA6IG51bGw7XG4gICAgfVxuXG4gICAgdmFyIGFycmF5UHJvdG8gPSBBcnJheS5wcm90b3R5cGU7XG4gICAgZnVuY3Rpb24gdG9Ob2RlcyhlbGVtZW50KSB7XG4gICAgICAgIHJldHVybiBpc05vZGUoZWxlbWVudClcbiAgICAgICAgICAgID8gW2VsZW1lbnRdXG4gICAgICAgICAgICA6IGlzTm9kZUNvbGxlY3Rpb24oZWxlbWVudClcbiAgICAgICAgICAgICAgICA/IGFycmF5UHJvdG8uc2xpY2UuY2FsbChlbGVtZW50KVxuICAgICAgICAgICAgICAgIDogaXNBcnJheShlbGVtZW50KVxuICAgICAgICAgICAgICAgICAgICA/IGVsZW1lbnQubWFwKHRvTm9kZSkuZmlsdGVyKEJvb2xlYW4pXG4gICAgICAgICAgICAgICAgICAgIDogaXNKUXVlcnkoZWxlbWVudClcbiAgICAgICAgICAgICAgICAgICAgICAgID8gZWxlbWVudC50b0FycmF5KClcbiAgICAgICAgICAgICAgICAgICAgICAgIDogW107XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gdG9MaXN0KHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBpc0FycmF5KHZhbHVlKVxuICAgICAgICAgICAgPyB2YWx1ZVxuICAgICAgICAgICAgOiBpc1N0cmluZyh2YWx1ZSlcbiAgICAgICAgICAgICAgICA/IHZhbHVlLnNwbGl0KC8sKD8hW14oXSpcXCkpLykubWFwKGZ1bmN0aW9uICh2YWx1ZSkgeyByZXR1cm4gaXNOdW1lcmljKHZhbHVlKVxuICAgICAgICAgICAgICAgICAgICA/IHRvTnVtYmVyKHZhbHVlKVxuICAgICAgICAgICAgICAgICAgICA6IHRvQm9vbGVhbih2YWx1ZS50cmltKCkpOyB9KVxuICAgICAgICAgICAgICAgIDogW3ZhbHVlXTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiB0b01zKHRpbWUpIHtcbiAgICAgICAgcmV0dXJuICF0aW1lXG4gICAgICAgICAgICA/IDBcbiAgICAgICAgICAgIDogZW5kc1dpdGgodGltZSwgJ21zJylcbiAgICAgICAgICAgICAgICA/IHRvRmxvYXQodGltZSlcbiAgICAgICAgICAgICAgICA6IHRvRmxvYXQodGltZSkgKiAxMDAwO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGlzRXF1YWwodmFsdWUsIG90aGVyKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZSA9PT0gb3RoZXJcbiAgICAgICAgICAgIHx8IGlzT2JqZWN0KHZhbHVlKVxuICAgICAgICAgICAgJiYgaXNPYmplY3Qob3RoZXIpXG4gICAgICAgICAgICAmJiBPYmplY3Qua2V5cyh2YWx1ZSkubGVuZ3RoID09PSBPYmplY3Qua2V5cyhvdGhlcikubGVuZ3RoXG4gICAgICAgICAgICAmJiBlYWNoKHZhbHVlLCBmdW5jdGlvbiAodmFsLCBrZXkpIHsgcmV0dXJuIHZhbCA9PT0gb3RoZXJba2V5XTsgfSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gc3dhcCh2YWx1ZSwgYSwgYikge1xuICAgICAgICByZXR1cm4gdmFsdWUucmVwbGFjZShuZXcgUmVnRXhwKChhICsgXCJ8XCIgKyBiKSwgJ21nJyksIGZ1bmN0aW9uIChtYXRjaCkge1xuICAgICAgICAgICAgcmV0dXJuIG1hdGNoID09PSBhID8gYiA6IGE7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHZhciBhc3NpZ24gPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uICh0YXJnZXQpIHtcbiAgICAgICAgdmFyIGFyZ3MgPSBbXSwgbGVuID0gYXJndW1lbnRzLmxlbmd0aCAtIDE7XG4gICAgICAgIHdoaWxlICggbGVuLS0gPiAwICkgYXJnc1sgbGVuIF0gPSBhcmd1bWVudHNbIGxlbiArIDEgXTtcblxuICAgICAgICB0YXJnZXQgPSBPYmplY3QodGFyZ2V0KTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcmdzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB2YXIgc291cmNlID0gYXJnc1tpXTtcbiAgICAgICAgICAgIGlmIChzb3VyY2UgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBrZXkgaW4gc291cmNlKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChoYXNPd24oc291cmNlLCBrZXkpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRba2V5XSA9IHNvdXJjZVtrZXldO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0YXJnZXQ7XG4gICAgfTtcblxuICAgIGZ1bmN0aW9uIGVhY2gob2JqLCBjYikge1xuICAgICAgICBmb3IgKHZhciBrZXkgaW4gb2JqKSB7XG4gICAgICAgICAgICBpZiAoZmFsc2UgPT09IGNiKG9ialtrZXldLCBrZXkpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHNvcnRCeShjb2xsZWN0aW9uLCBwcm9wKSB7XG4gICAgICAgIHJldHVybiBjb2xsZWN0aW9uLnNvcnQoZnVuY3Rpb24gKHJlZiwgcmVmJDEpIHtcbiAgICAgICAgICAgICAgICB2YXIgcHJvcEEgPSByZWZbcHJvcF07IGlmICggcHJvcEEgPT09IHZvaWQgMCApIHByb3BBID0gMDtcbiAgICAgICAgICAgICAgICB2YXIgcHJvcEIgPSByZWYkMVtwcm9wXTsgaWYgKCBwcm9wQiA9PT0gdm9pZCAwICkgcHJvcEIgPSAwO1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuIHByb3BBID4gcHJvcEJcbiAgICAgICAgICAgICAgICA/IDFcbiAgICAgICAgICAgICAgICA6IHByb3BCID4gcHJvcEFcbiAgICAgICAgICAgICAgICAgICAgPyAtMVxuICAgICAgICAgICAgICAgICAgICA6IDA7XG4gICAgICAgIH1cbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjbGFtcChudW1iZXIsIG1pbiwgbWF4KSB7XG4gICAgICAgIGlmICggbWluID09PSB2b2lkIDAgKSBtaW4gPSAwO1xuICAgICAgICBpZiAoIG1heCA9PT0gdm9pZCAwICkgbWF4ID0gMTtcblxuICAgICAgICByZXR1cm4gTWF0aC5taW4oTWF0aC5tYXgodG9OdW1iZXIobnVtYmVyKSB8fCAwLCBtaW4pLCBtYXgpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIG5vb3AoKSB7fVxuXG4gICAgZnVuY3Rpb24gaW50ZXJzZWN0UmVjdChyMSwgcjIpIHtcbiAgICAgICAgcmV0dXJuIHIxLmxlZnQgPCByMi5yaWdodCAmJlxuICAgICAgICAgICAgcjEucmlnaHQgPiByMi5sZWZ0ICYmXG4gICAgICAgICAgICByMS50b3AgPCByMi5ib3R0b20gJiZcbiAgICAgICAgICAgIHIxLmJvdHRvbSA+IHIyLnRvcDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBwb2ludEluUmVjdChwb2ludCwgcmVjdCkge1xuICAgICAgICByZXR1cm4gcG9pbnQueCA8PSByZWN0LnJpZ2h0ICYmXG4gICAgICAgICAgICBwb2ludC54ID49IHJlY3QubGVmdCAmJlxuICAgICAgICAgICAgcG9pbnQueSA8PSByZWN0LmJvdHRvbSAmJlxuICAgICAgICAgICAgcG9pbnQueSA+PSByZWN0LnRvcDtcbiAgICB9XG5cbiAgICB2YXIgRGltZW5zaW9ucyA9IHtcblxuICAgICAgICByYXRpbzogZnVuY3Rpb24oZGltZW5zaW9ucywgcHJvcCwgdmFsdWUpIHtcbiAgICAgICAgICAgIHZhciBvYmo7XG5cblxuICAgICAgICAgICAgdmFyIGFQcm9wID0gcHJvcCA9PT0gJ3dpZHRoJyA/ICdoZWlnaHQnIDogJ3dpZHRoJztcblxuICAgICAgICAgICAgcmV0dXJuICggb2JqID0ge30sIG9ialthUHJvcF0gPSBkaW1lbnNpb25zW3Byb3BdID8gTWF0aC5yb3VuZCh2YWx1ZSAqIGRpbWVuc2lvbnNbYVByb3BdIC8gZGltZW5zaW9uc1twcm9wXSkgOiBkaW1lbnNpb25zW2FQcm9wXSwgb2JqW3Byb3BdID0gdmFsdWUsIG9iaiApO1xuICAgICAgICB9LFxuXG4gICAgICAgIGNvbnRhaW46IGZ1bmN0aW9uKGRpbWVuc2lvbnMsIG1heERpbWVuc2lvbnMpIHtcbiAgICAgICAgICAgIHZhciB0aGlzJDEgPSB0aGlzO1xuXG4gICAgICAgICAgICBkaW1lbnNpb25zID0gYXNzaWduKHt9LCBkaW1lbnNpb25zKTtcblxuICAgICAgICAgICAgZWFjaChkaW1lbnNpb25zLCBmdW5jdGlvbiAoXywgcHJvcCkgeyByZXR1cm4gZGltZW5zaW9ucyA9IGRpbWVuc2lvbnNbcHJvcF0gPiBtYXhEaW1lbnNpb25zW3Byb3BdXG4gICAgICAgICAgICAgICAgPyB0aGlzJDEucmF0aW8oZGltZW5zaW9ucywgcHJvcCwgbWF4RGltZW5zaW9uc1twcm9wXSlcbiAgICAgICAgICAgICAgICA6IGRpbWVuc2lvbnM7IH1cbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIHJldHVybiBkaW1lbnNpb25zO1xuICAgICAgICB9LFxuXG4gICAgICAgIGNvdmVyOiBmdW5jdGlvbihkaW1lbnNpb25zLCBtYXhEaW1lbnNpb25zKSB7XG4gICAgICAgICAgICB2YXIgdGhpcyQxID0gdGhpcztcblxuICAgICAgICAgICAgZGltZW5zaW9ucyA9IHRoaXMuY29udGFpbihkaW1lbnNpb25zLCBtYXhEaW1lbnNpb25zKTtcblxuICAgICAgICAgICAgZWFjaChkaW1lbnNpb25zLCBmdW5jdGlvbiAoXywgcHJvcCkgeyByZXR1cm4gZGltZW5zaW9ucyA9IGRpbWVuc2lvbnNbcHJvcF0gPCBtYXhEaW1lbnNpb25zW3Byb3BdXG4gICAgICAgICAgICAgICAgPyB0aGlzJDEucmF0aW8oZGltZW5zaW9ucywgcHJvcCwgbWF4RGltZW5zaW9uc1twcm9wXSlcbiAgICAgICAgICAgICAgICA6IGRpbWVuc2lvbnM7IH1cbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIHJldHVybiBkaW1lbnNpb25zO1xuICAgICAgICB9XG5cbiAgICB9O1xuXG4gICAgZnVuY3Rpb24gYXR0cihlbGVtZW50LCBuYW1lLCB2YWx1ZSkge1xuXG4gICAgICAgIGlmIChpc09iamVjdChuYW1lKSkge1xuICAgICAgICAgICAgZm9yICh2YXIga2V5IGluIG5hbWUpIHtcbiAgICAgICAgICAgICAgICBhdHRyKGVsZW1lbnQsIGtleSwgbmFtZVtrZXldKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpc1VuZGVmaW5lZCh2YWx1ZSkpIHtcbiAgICAgICAgICAgIGVsZW1lbnQgPSB0b05vZGUoZWxlbWVudCk7XG4gICAgICAgICAgICByZXR1cm4gZWxlbWVudCAmJiBlbGVtZW50LmdldEF0dHJpYnV0ZShuYW1lKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRvTm9kZXMoZWxlbWVudCkuZm9yRWFjaChmdW5jdGlvbiAoZWxlbWVudCkge1xuXG4gICAgICAgICAgICAgICAgaWYgKGlzRnVuY3Rpb24odmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlID0gdmFsdWUuY2FsbChlbGVtZW50LCBhdHRyKGVsZW1lbnQsIG5hbWUpKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAodmFsdWUgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVtb3ZlQXR0cihlbGVtZW50LCBuYW1lKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZShuYW1lLCB2YWx1ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGhhc0F0dHIoZWxlbWVudCwgbmFtZSkge1xuICAgICAgICByZXR1cm4gdG9Ob2RlcyhlbGVtZW50KS5zb21lKGZ1bmN0aW9uIChlbGVtZW50KSB7IHJldHVybiBlbGVtZW50Lmhhc0F0dHJpYnV0ZShuYW1lKTsgfSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcmVtb3ZlQXR0cihlbGVtZW50LCBuYW1lKSB7XG4gICAgICAgIGVsZW1lbnQgPSB0b05vZGVzKGVsZW1lbnQpO1xuICAgICAgICBuYW1lLnNwbGl0KCcgJykuZm9yRWFjaChmdW5jdGlvbiAobmFtZSkgeyByZXR1cm4gZWxlbWVudC5mb3JFYWNoKGZ1bmN0aW9uIChlbGVtZW50KSB7IHJldHVybiBlbGVtZW50LnJlbW92ZUF0dHJpYnV0ZShuYW1lKTsgfVxuICAgICAgICAgICAgKTsgfVxuICAgICAgICApO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGRhdGEoZWxlbWVudCwgYXR0cmlidXRlKSB7XG4gICAgICAgIGZvciAodmFyIGkgPSAwLCBhdHRycyA9IFthdHRyaWJ1dGUsIChcImRhdGEtXCIgKyBhdHRyaWJ1dGUpXTsgaSA8IGF0dHJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoaGFzQXR0cihlbGVtZW50LCBhdHRyc1tpXSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gYXR0cihlbGVtZW50LCBhdHRyc1tpXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBxdWVyeShzZWxlY3RvciwgY29udGV4dCkge1xuICAgICAgICByZXR1cm4gdG9Ob2RlKHNlbGVjdG9yKSB8fCBmaW5kKHNlbGVjdG9yLCBnZXRDb250ZXh0KHNlbGVjdG9yLCBjb250ZXh0KSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcXVlcnlBbGwoc2VsZWN0b3IsIGNvbnRleHQpIHtcbiAgICAgICAgdmFyIG5vZGVzID0gdG9Ob2RlcyhzZWxlY3Rvcik7XG4gICAgICAgIHJldHVybiBub2Rlcy5sZW5ndGggJiYgbm9kZXMgfHwgZmluZEFsbChzZWxlY3RvciwgZ2V0Q29udGV4dChzZWxlY3RvciwgY29udGV4dCkpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGdldENvbnRleHQoc2VsZWN0b3IsIGNvbnRleHQpIHtcbiAgICAgICAgaWYgKCBjb250ZXh0ID09PSB2b2lkIDAgKSBjb250ZXh0ID0gZG9jdW1lbnQ7XG5cbiAgICAgICAgcmV0dXJuIGlzQ29udGV4dFNlbGVjdG9yKHNlbGVjdG9yKSB8fCBpc0RvY3VtZW50KGNvbnRleHQpXG4gICAgICAgICAgICA/IGNvbnRleHRcbiAgICAgICAgICAgIDogY29udGV4dC5vd25lckRvY3VtZW50O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGZpbmQoc2VsZWN0b3IsIGNvbnRleHQpIHtcbiAgICAgICAgcmV0dXJuIHRvTm9kZShfcXVlcnkoc2VsZWN0b3IsIGNvbnRleHQsICdxdWVyeVNlbGVjdG9yJykpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGZpbmRBbGwoc2VsZWN0b3IsIGNvbnRleHQpIHtcbiAgICAgICAgcmV0dXJuIHRvTm9kZXMoX3F1ZXJ5KHNlbGVjdG9yLCBjb250ZXh0LCAncXVlcnlTZWxlY3RvckFsbCcpKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBfcXVlcnkoc2VsZWN0b3IsIGNvbnRleHQsIHF1ZXJ5Rm4pIHtcbiAgICAgICAgaWYgKCBjb250ZXh0ID09PSB2b2lkIDAgKSBjb250ZXh0ID0gZG9jdW1lbnQ7XG5cblxuICAgICAgICBpZiAoIXNlbGVjdG9yIHx8ICFpc1N0cmluZyhzZWxlY3RvcikpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgc2VsZWN0b3IgPSBzZWxlY3Rvci5yZXBsYWNlKGNvbnRleHRTYW5pdGl6ZVJlLCAnJDEgKicpO1xuXG4gICAgICAgIHZhciByZW1vdmVzO1xuXG4gICAgICAgIGlmIChpc0NvbnRleHRTZWxlY3RvcihzZWxlY3RvcikpIHtcblxuICAgICAgICAgICAgcmVtb3ZlcyA9IFtdO1xuXG4gICAgICAgICAgICBzZWxlY3RvciA9IHNlbGVjdG9yLnNwbGl0KCcsJykubWFwKGZ1bmN0aW9uIChzZWxlY3RvciwgaSkge1xuXG4gICAgICAgICAgICAgICAgdmFyIGN0eCA9IGNvbnRleHQ7XG5cbiAgICAgICAgICAgICAgICBzZWxlY3RvciA9IHNlbGVjdG9yLnRyaW0oKTtcblxuICAgICAgICAgICAgICAgIGlmIChzZWxlY3RvclswXSA9PT0gJyEnKSB7XG5cbiAgICAgICAgICAgICAgICAgICAgdmFyIHNlbGVjdG9ycyA9IHNlbGVjdG9yLnN1YnN0cigxKS50cmltKCkuc3BsaXQoJyAnKTtcbiAgICAgICAgICAgICAgICAgICAgY3R4ID0gY2xvc2VzdChjb250ZXh0LnBhcmVudE5vZGUsIHNlbGVjdG9yc1swXSk7XG4gICAgICAgICAgICAgICAgICAgIHNlbGVjdG9yID0gc2VsZWN0b3JzLnNsaWNlKDEpLmpvaW4oJyAnKS50cmltKCk7XG5cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoc2VsZWN0b3JbMF0gPT09ICctJykge1xuXG4gICAgICAgICAgICAgICAgICAgIHZhciBzZWxlY3RvcnMkMSA9IHNlbGVjdG9yLnN1YnN0cigxKS50cmltKCkuc3BsaXQoJyAnKTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHByZXYgPSAoY3R4IHx8IGNvbnRleHQpLnByZXZpb3VzRWxlbWVudFNpYmxpbmc7XG4gICAgICAgICAgICAgICAgICAgIGN0eCA9IG1hdGNoZXMocHJldiwgc2VsZWN0b3Iuc3Vic3RyKDEpKSA/IHByZXYgOiBudWxsO1xuICAgICAgICAgICAgICAgICAgICBzZWxlY3RvciA9IHNlbGVjdG9ycyQxLnNsaWNlKDEpLmpvaW4oJyAnKTtcblxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmICghY3R4KSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmICghY3R4LmlkKSB7XG4gICAgICAgICAgICAgICAgICAgIGN0eC5pZCA9IFwidWstXCIgKyAoRGF0ZS5ub3coKSkgKyBpO1xuICAgICAgICAgICAgICAgICAgICByZW1vdmVzLnB1c2goZnVuY3Rpb24gKCkgeyByZXR1cm4gcmVtb3ZlQXR0cihjdHgsICdpZCcpOyB9KTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gKFwiI1wiICsgKGVzY2FwZShjdHguaWQpKSArIFwiIFwiICsgc2VsZWN0b3IpO1xuXG4gICAgICAgICAgICB9KS5maWx0ZXIoQm9vbGVhbikuam9pbignLCcpO1xuXG4gICAgICAgICAgICBjb250ZXh0ID0gZG9jdW1lbnQ7XG5cbiAgICAgICAgfVxuXG4gICAgICAgIHRyeSB7XG5cbiAgICAgICAgICAgIHJldHVybiBjb250ZXh0W3F1ZXJ5Rm5dKHNlbGVjdG9yKTtcblxuICAgICAgICB9IGNhdGNoIChlKSB7XG5cbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuXG4gICAgICAgIH0gZmluYWxseSB7XG5cbiAgICAgICAgICAgIHJlbW92ZXMgJiYgcmVtb3Zlcy5mb3JFYWNoKGZ1bmN0aW9uIChyZW1vdmUpIHsgcmV0dXJuIHJlbW92ZSgpOyB9KTtcblxuICAgICAgICB9XG5cbiAgICB9XG5cbiAgICB2YXIgY29udGV4dFNlbGVjdG9yUmUgPSAvKF58LClcXHMqWyE+K34tXS87XG4gICAgdmFyIGNvbnRleHRTYW5pdGl6ZVJlID0gLyhbIT4rfi1dKSg/PVxccytbIT4rfi1dfFxccyokKS9nO1xuXG4gICAgZnVuY3Rpb24gaXNDb250ZXh0U2VsZWN0b3Ioc2VsZWN0b3IpIHtcbiAgICAgICAgcmV0dXJuIGlzU3RyaW5nKHNlbGVjdG9yKSAmJiBzZWxlY3Rvci5tYXRjaChjb250ZXh0U2VsZWN0b3JSZSk7XG4gICAgfVxuXG4gICAgdmFyIGVsUHJvdG8gPSBFbGVtZW50LnByb3RvdHlwZTtcbiAgICB2YXIgbWF0Y2hlc0ZuID0gZWxQcm90by5tYXRjaGVzIHx8IGVsUHJvdG8ud2Via2l0TWF0Y2hlc1NlbGVjdG9yIHx8IGVsUHJvdG8ubXNNYXRjaGVzU2VsZWN0b3I7XG5cbiAgICBmdW5jdGlvbiBtYXRjaGVzKGVsZW1lbnQsIHNlbGVjdG9yKSB7XG4gICAgICAgIHJldHVybiB0b05vZGVzKGVsZW1lbnQpLnNvbWUoZnVuY3Rpb24gKGVsZW1lbnQpIHsgcmV0dXJuIG1hdGNoZXNGbi5jYWxsKGVsZW1lbnQsIHNlbGVjdG9yKTsgfSk7XG4gICAgfVxuXG4gICAgdmFyIGNsb3Nlc3RGbiA9IGVsUHJvdG8uY2xvc2VzdCB8fCBmdW5jdGlvbiAoc2VsZWN0b3IpIHtcbiAgICAgICAgdmFyIGFuY2VzdG9yID0gdGhpcztcblxuICAgICAgICBkbyB7XG5cbiAgICAgICAgICAgIGlmIChtYXRjaGVzKGFuY2VzdG9yLCBzZWxlY3RvcikpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gYW5jZXN0b3I7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGFuY2VzdG9yID0gYW5jZXN0b3IucGFyZW50Tm9kZTtcblxuICAgICAgICB9IHdoaWxlIChhbmNlc3RvciAmJiBhbmNlc3Rvci5ub2RlVHlwZSA9PT0gMSk7XG4gICAgfTtcblxuICAgIGZ1bmN0aW9uIGNsb3Nlc3QoZWxlbWVudCwgc2VsZWN0b3IpIHtcblxuICAgICAgICBpZiAoc3RhcnRzV2l0aChzZWxlY3RvciwgJz4nKSkge1xuICAgICAgICAgICAgc2VsZWN0b3IgPSBzZWxlY3Rvci5zbGljZSgxKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBpc05vZGUoZWxlbWVudClcbiAgICAgICAgICAgID8gZWxlbWVudC5wYXJlbnROb2RlICYmIGNsb3Nlc3RGbi5jYWxsKGVsZW1lbnQsIHNlbGVjdG9yKVxuICAgICAgICAgICAgOiB0b05vZGVzKGVsZW1lbnQpLm1hcChmdW5jdGlvbiAoZWxlbWVudCkgeyByZXR1cm4gY2xvc2VzdChlbGVtZW50LCBzZWxlY3Rvcik7IH0pLmZpbHRlcihCb29sZWFuKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBwYXJlbnRzKGVsZW1lbnQsIHNlbGVjdG9yKSB7XG4gICAgICAgIHZhciBlbGVtZW50cyA9IFtdO1xuICAgICAgICB2YXIgcGFyZW50ID0gdG9Ob2RlKGVsZW1lbnQpLnBhcmVudE5vZGU7XG5cbiAgICAgICAgd2hpbGUgKHBhcmVudCAmJiBwYXJlbnQubm9kZVR5cGUgPT09IDEpIHtcblxuICAgICAgICAgICAgaWYgKG1hdGNoZXMocGFyZW50LCBzZWxlY3RvcikpIHtcbiAgICAgICAgICAgICAgICBlbGVtZW50cy5wdXNoKHBhcmVudCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHBhcmVudCA9IHBhcmVudC5wYXJlbnROb2RlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGVsZW1lbnRzO1xuICAgIH1cblxuICAgIHZhciBlc2NhcGVGbiA9IHdpbmRvdy5DU1MgJiYgQ1NTLmVzY2FwZSB8fCBmdW5jdGlvbiAoY3NzKSB7IHJldHVybiBjc3MucmVwbGFjZSgvKFteXFx4N2YtXFx1RkZGRlxcdy1dKS9nLCBmdW5jdGlvbiAobWF0Y2gpIHsgcmV0dXJuIChcIlxcXFxcIiArIG1hdGNoKTsgfSk7IH07XG4gICAgZnVuY3Rpb24gZXNjYXBlKGNzcykge1xuICAgICAgICByZXR1cm4gaXNTdHJpbmcoY3NzKSA/IGVzY2FwZUZuLmNhbGwobnVsbCwgY3NzKSA6ICcnO1xuICAgIH1cblxuICAgIHZhciB2b2lkRWxlbWVudHMgPSB7XG4gICAgICAgIGFyZWE6IHRydWUsXG4gICAgICAgIGJhc2U6IHRydWUsXG4gICAgICAgIGJyOiB0cnVlLFxuICAgICAgICBjb2w6IHRydWUsXG4gICAgICAgIGVtYmVkOiB0cnVlLFxuICAgICAgICBocjogdHJ1ZSxcbiAgICAgICAgaW1nOiB0cnVlLFxuICAgICAgICBpbnB1dDogdHJ1ZSxcbiAgICAgICAga2V5Z2VuOiB0cnVlLFxuICAgICAgICBsaW5rOiB0cnVlLFxuICAgICAgICBtZW51aXRlbTogdHJ1ZSxcbiAgICAgICAgbWV0YTogdHJ1ZSxcbiAgICAgICAgcGFyYW06IHRydWUsXG4gICAgICAgIHNvdXJjZTogdHJ1ZSxcbiAgICAgICAgdHJhY2s6IHRydWUsXG4gICAgICAgIHdicjogdHJ1ZVxuICAgIH07XG4gICAgZnVuY3Rpb24gaXNWb2lkRWxlbWVudChlbGVtZW50KSB7XG4gICAgICAgIHJldHVybiB0b05vZGVzKGVsZW1lbnQpLnNvbWUoZnVuY3Rpb24gKGVsZW1lbnQpIHsgcmV0dXJuIHZvaWRFbGVtZW50c1tlbGVtZW50LnRhZ05hbWUudG9Mb3dlckNhc2UoKV07IH0pO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGlzVmlzaWJsZShlbGVtZW50KSB7XG4gICAgICAgIHJldHVybiB0b05vZGVzKGVsZW1lbnQpLnNvbWUoZnVuY3Rpb24gKGVsZW1lbnQpIHsgcmV0dXJuIGVsZW1lbnQub2Zmc2V0V2lkdGggfHwgZWxlbWVudC5vZmZzZXRIZWlnaHQgfHwgZWxlbWVudC5nZXRDbGllbnRSZWN0cygpLmxlbmd0aDsgfSk7XG4gICAgfVxuXG4gICAgdmFyIHNlbElucHV0ID0gJ2lucHV0LHNlbGVjdCx0ZXh0YXJlYSxidXR0b24nO1xuICAgIGZ1bmN0aW9uIGlzSW5wdXQoZWxlbWVudCkge1xuICAgICAgICByZXR1cm4gdG9Ob2RlcyhlbGVtZW50KS5zb21lKGZ1bmN0aW9uIChlbGVtZW50KSB7IHJldHVybiBtYXRjaGVzKGVsZW1lbnQsIHNlbElucHV0KTsgfSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZmlsdGVyKGVsZW1lbnQsIHNlbGVjdG9yKSB7XG4gICAgICAgIHJldHVybiB0b05vZGVzKGVsZW1lbnQpLmZpbHRlcihmdW5jdGlvbiAoZWxlbWVudCkgeyByZXR1cm4gbWF0Y2hlcyhlbGVtZW50LCBzZWxlY3Rvcik7IH0pO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHdpdGhpbihlbGVtZW50LCBzZWxlY3Rvcikge1xuICAgICAgICByZXR1cm4gIWlzU3RyaW5nKHNlbGVjdG9yKVxuICAgICAgICAgICAgPyBlbGVtZW50ID09PSBzZWxlY3RvciB8fCAoaXNEb2N1bWVudChzZWxlY3RvcilcbiAgICAgICAgICAgICAgICA/IHNlbGVjdG9yLmRvY3VtZW50RWxlbWVudFxuICAgICAgICAgICAgICAgIDogdG9Ob2RlKHNlbGVjdG9yKSkuY29udGFpbnModG9Ob2RlKGVsZW1lbnQpKSAvLyBJRSAxMSBkb2N1bWVudCBkb2VzIG5vdCBpbXBsZW1lbnQgY29udGFpbnNcbiAgICAgICAgICAgIDogbWF0Y2hlcyhlbGVtZW50LCBzZWxlY3RvcikgfHwgY2xvc2VzdChlbGVtZW50LCBzZWxlY3Rvcik7XG4gICAgfVxuXG4gICAgLyogZ2xvYmFsIERvY3VtZW50VG91Y2ggKi9cblxuICAgIHZhciBpc0lFID0gL21zaWV8dHJpZGVudC9pLnRlc3Qod2luZG93Lm5hdmlnYXRvci51c2VyQWdlbnQpO1xuICAgIHZhciBpc1J0bCA9IGF0dHIoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LCAnZGlyJykgPT09ICdydGwnO1xuXG4gICAgdmFyIGhhc1RvdWNoRXZlbnRzID0gJ29udG91Y2hzdGFydCcgaW4gd2luZG93O1xuICAgIHZhciBoYXNQb2ludGVyRXZlbnRzID0gd2luZG93LlBvaW50ZXJFdmVudDtcbiAgICB2YXIgaGFzVG91Y2ggPSBoYXNUb3VjaEV2ZW50c1xuICAgICAgICB8fCB3aW5kb3cuRG9jdW1lbnRUb3VjaCAmJiBkb2N1bWVudCBpbnN0YW5jZW9mIERvY3VtZW50VG91Y2hcbiAgICAgICAgfHwgbmF2aWdhdG9yLm1heFRvdWNoUG9pbnRzOyAvLyBJRSA+PTExXG5cbiAgICB2YXIgcG9pbnRlckRvd24gPSBoYXNQb2ludGVyRXZlbnRzID8gJ3BvaW50ZXJkb3duJyA6IGhhc1RvdWNoRXZlbnRzID8gJ3RvdWNoc3RhcnQnIDogJ21vdXNlZG93bic7XG4gICAgdmFyIHBvaW50ZXJNb3ZlID0gaGFzUG9pbnRlckV2ZW50cyA/ICdwb2ludGVybW92ZScgOiBoYXNUb3VjaEV2ZW50cyA/ICd0b3VjaG1vdmUnIDogJ21vdXNlbW92ZSc7XG4gICAgdmFyIHBvaW50ZXJVcCA9IGhhc1BvaW50ZXJFdmVudHMgPyAncG9pbnRlcnVwJyA6IGhhc1RvdWNoRXZlbnRzID8gJ3RvdWNoZW5kJyA6ICdtb3VzZXVwJztcbiAgICB2YXIgcG9pbnRlckVudGVyID0gaGFzUG9pbnRlckV2ZW50cyA/ICdwb2ludGVyZW50ZXInIDogaGFzVG91Y2hFdmVudHMgPyAnJyA6ICdtb3VzZWVudGVyJztcbiAgICB2YXIgcG9pbnRlckxlYXZlID0gaGFzUG9pbnRlckV2ZW50cyA/ICdwb2ludGVybGVhdmUnIDogaGFzVG91Y2hFdmVudHMgPyAnJyA6ICdtb3VzZWxlYXZlJztcbiAgICB2YXIgcG9pbnRlckNhbmNlbCA9IGhhc1BvaW50ZXJFdmVudHMgPyAncG9pbnRlcmNhbmNlbCcgOiAndG91Y2hjYW5jZWwnO1xuXG4gICAgZnVuY3Rpb24gb24oKSB7XG4gICAgICAgIHZhciBhcmdzID0gW10sIGxlbiA9IGFyZ3VtZW50cy5sZW5ndGg7XG4gICAgICAgIHdoaWxlICggbGVuLS0gKSBhcmdzWyBsZW4gXSA9IGFyZ3VtZW50c1sgbGVuIF07XG5cblxuICAgICAgICB2YXIgcmVmID0gZ2V0QXJncyhhcmdzKTtcbiAgICAgICAgdmFyIHRhcmdldHMgPSByZWZbMF07XG4gICAgICAgIHZhciB0eXBlID0gcmVmWzFdO1xuICAgICAgICB2YXIgc2VsZWN0b3IgPSByZWZbMl07XG4gICAgICAgIHZhciBsaXN0ZW5lciA9IHJlZlszXTtcbiAgICAgICAgdmFyIHVzZUNhcHR1cmUgPSByZWZbNF07XG5cbiAgICAgICAgdGFyZ2V0cyA9IHRvRXZlbnRUYXJnZXRzKHRhcmdldHMpO1xuXG4gICAgICAgIGlmIChzZWxlY3Rvcikge1xuICAgICAgICAgICAgbGlzdGVuZXIgPSBkZWxlZ2F0ZSh0YXJnZXRzLCBzZWxlY3RvciwgbGlzdGVuZXIpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGxpc3RlbmVyLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICAgIGxpc3RlbmVyID0gZGV0YWlsKGxpc3RlbmVyKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHR5cGUuc3BsaXQoJyAnKS5mb3JFYWNoKGZ1bmN0aW9uICh0eXBlKSB7IHJldHVybiB0YXJnZXRzLmZvckVhY2goZnVuY3Rpb24gKHRhcmdldCkgeyByZXR1cm4gdGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIodHlwZSwgbGlzdGVuZXIsIHVzZUNhcHR1cmUpOyB9XG4gICAgICAgICAgICApOyB9XG4gICAgICAgICk7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7IHJldHVybiBvZmYodGFyZ2V0cywgdHlwZSwgbGlzdGVuZXIsIHVzZUNhcHR1cmUpOyB9O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIG9mZih0YXJnZXRzLCB0eXBlLCBsaXN0ZW5lciwgdXNlQ2FwdHVyZSkge1xuICAgICAgICBpZiAoIHVzZUNhcHR1cmUgPT09IHZvaWQgMCApIHVzZUNhcHR1cmUgPSBmYWxzZTtcblxuICAgICAgICB0YXJnZXRzID0gdG9FdmVudFRhcmdldHModGFyZ2V0cyk7XG4gICAgICAgIHR5cGUuc3BsaXQoJyAnKS5mb3JFYWNoKGZ1bmN0aW9uICh0eXBlKSB7IHJldHVybiB0YXJnZXRzLmZvckVhY2goZnVuY3Rpb24gKHRhcmdldCkgeyByZXR1cm4gdGFyZ2V0LnJlbW92ZUV2ZW50TGlzdGVuZXIodHlwZSwgbGlzdGVuZXIsIHVzZUNhcHR1cmUpOyB9XG4gICAgICAgICAgICApOyB9XG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gb25jZSgpIHtcbiAgICAgICAgdmFyIGFyZ3MgPSBbXSwgbGVuID0gYXJndW1lbnRzLmxlbmd0aDtcbiAgICAgICAgd2hpbGUgKCBsZW4tLSApIGFyZ3NbIGxlbiBdID0gYXJndW1lbnRzWyBsZW4gXTtcblxuXG4gICAgICAgIHZhciByZWYgPSBnZXRBcmdzKGFyZ3MpO1xuICAgICAgICB2YXIgZWxlbWVudCA9IHJlZlswXTtcbiAgICAgICAgdmFyIHR5cGUgPSByZWZbMV07XG4gICAgICAgIHZhciBzZWxlY3RvciA9IHJlZlsyXTtcbiAgICAgICAgdmFyIGxpc3RlbmVyID0gcmVmWzNdO1xuICAgICAgICB2YXIgdXNlQ2FwdHVyZSA9IHJlZls0XTtcbiAgICAgICAgdmFyIGNvbmRpdGlvbiA9IHJlZls1XTtcbiAgICAgICAgdmFyIG9mZiA9IG9uKGVsZW1lbnQsIHR5cGUsIHNlbGVjdG9yLCBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgdmFyIHJlc3VsdCA9ICFjb25kaXRpb24gfHwgY29uZGl0aW9uKGUpO1xuICAgICAgICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICAgICAgICAgIG9mZigpO1xuICAgICAgICAgICAgICAgIGxpc3RlbmVyKGUsIHJlc3VsdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sIHVzZUNhcHR1cmUpO1xuXG4gICAgICAgIHJldHVybiBvZmY7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gdHJpZ2dlcih0YXJnZXRzLCBldmVudCwgZGV0YWlsKSB7XG4gICAgICAgIHJldHVybiB0b0V2ZW50VGFyZ2V0cyh0YXJnZXRzKS5yZWR1Y2UoZnVuY3Rpb24gKG5vdENhbmNlbGVkLCB0YXJnZXQpIHsgcmV0dXJuIG5vdENhbmNlbGVkICYmIHRhcmdldC5kaXNwYXRjaEV2ZW50KGNyZWF0ZUV2ZW50KGV2ZW50LCB0cnVlLCB0cnVlLCBkZXRhaWwpKTsgfVxuICAgICAgICAgICAgLCB0cnVlKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjcmVhdGVFdmVudChlLCBidWJibGVzLCBjYW5jZWxhYmxlLCBkZXRhaWwpIHtcbiAgICAgICAgaWYgKCBidWJibGVzID09PSB2b2lkIDAgKSBidWJibGVzID0gdHJ1ZTtcbiAgICAgICAgaWYgKCBjYW5jZWxhYmxlID09PSB2b2lkIDAgKSBjYW5jZWxhYmxlID0gZmFsc2U7XG5cbiAgICAgICAgaWYgKGlzU3RyaW5nKGUpKSB7XG4gICAgICAgICAgICB2YXIgZXZlbnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnQ3VzdG9tRXZlbnQnKTsgLy8gSUUgMTFcbiAgICAgICAgICAgIGV2ZW50LmluaXRDdXN0b21FdmVudChlLCBidWJibGVzLCBjYW5jZWxhYmxlLCBkZXRhaWwpO1xuICAgICAgICAgICAgZSA9IGV2ZW50O1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGU7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2V0QXJncyhhcmdzKSB7XG4gICAgICAgIGlmIChpc0Z1bmN0aW9uKGFyZ3NbMl0pKSB7XG4gICAgICAgICAgICBhcmdzLnNwbGljZSgyLCAwLCBmYWxzZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGFyZ3M7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZGVsZWdhdGUoZGVsZWdhdGVzLCBzZWxlY3RvciwgbGlzdGVuZXIpIHtcbiAgICAgICAgdmFyIHRoaXMkMSA9IHRoaXM7XG5cbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChlKSB7XG5cbiAgICAgICAgICAgIGRlbGVnYXRlcy5mb3JFYWNoKGZ1bmN0aW9uIChkZWxlZ2F0ZSkge1xuXG4gICAgICAgICAgICAgICAgdmFyIGN1cnJlbnQgPSBzZWxlY3RvclswXSA9PT0gJz4nXG4gICAgICAgICAgICAgICAgICAgID8gZmluZEFsbChzZWxlY3RvciwgZGVsZWdhdGUpLnJldmVyc2UoKS5maWx0ZXIoZnVuY3Rpb24gKGVsZW1lbnQpIHsgcmV0dXJuIHdpdGhpbihlLnRhcmdldCwgZWxlbWVudCk7IH0pWzBdXG4gICAgICAgICAgICAgICAgICAgIDogY2xvc2VzdChlLnRhcmdldCwgc2VsZWN0b3IpO1xuXG4gICAgICAgICAgICAgICAgaWYgKGN1cnJlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgZS5kZWxlZ2F0ZSA9IGRlbGVnYXRlO1xuICAgICAgICAgICAgICAgICAgICBlLmN1cnJlbnQgPSBjdXJyZW50O1xuXG4gICAgICAgICAgICAgICAgICAgIGxpc3RlbmVyLmNhbGwodGhpcyQxLCBlKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZGV0YWlsKGxpc3RlbmVyKSB7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbiAoZSkgeyByZXR1cm4gaXNBcnJheShlLmRldGFpbCkgPyBsaXN0ZW5lci5hcHBseSh2b2lkIDAsIFtlXS5jb25jYXQoZS5kZXRhaWwpKSA6IGxpc3RlbmVyKGUpOyB9O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGlzRXZlbnRUYXJnZXQodGFyZ2V0KSB7XG4gICAgICAgIHJldHVybiB0YXJnZXQgJiYgJ2FkZEV2ZW50TGlzdGVuZXInIGluIHRhcmdldDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiB0b0V2ZW50VGFyZ2V0KHRhcmdldCkge1xuICAgICAgICByZXR1cm4gaXNFdmVudFRhcmdldCh0YXJnZXQpID8gdGFyZ2V0IDogdG9Ob2RlKHRhcmdldCk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gdG9FdmVudFRhcmdldHModGFyZ2V0KSB7XG4gICAgICAgIHJldHVybiBpc0FycmF5KHRhcmdldClcbiAgICAgICAgICAgICAgICA/IHRhcmdldC5tYXAodG9FdmVudFRhcmdldCkuZmlsdGVyKEJvb2xlYW4pXG4gICAgICAgICAgICAgICAgOiBpc1N0cmluZyh0YXJnZXQpXG4gICAgICAgICAgICAgICAgICAgID8gZmluZEFsbCh0YXJnZXQpXG4gICAgICAgICAgICAgICAgICAgIDogaXNFdmVudFRhcmdldCh0YXJnZXQpXG4gICAgICAgICAgICAgICAgICAgICAgICA/IFt0YXJnZXRdXG4gICAgICAgICAgICAgICAgICAgICAgICA6IHRvTm9kZXModGFyZ2V0KTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBwcmV2ZW50Q2xpY2soKSB7XG5cbiAgICAgICAgdmFyIHRpbWVyID0gc2V0VGltZW91dChvbmNlKGRvY3VtZW50LCAnY2xpY2snLCBmdW5jdGlvbiAoZSkge1xuXG4gICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICBlLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xuXG4gICAgICAgICAgICBjbGVhclRpbWVvdXQodGltZXIpO1xuXG4gICAgICAgIH0sIHRydWUpKTtcblxuICAgICAgICB0cmlnZ2VyKGRvY3VtZW50LCBwb2ludGVyQ2FuY2VsKTtcblxuICAgIH1cblxuICAgIC8qIGdsb2JhbCBzZXRJbW1lZGlhdGUgKi9cblxuICAgIHZhciBQcm9taXNlID0gJ1Byb21pc2UnIGluIHdpbmRvdyA/IHdpbmRvdy5Qcm9taXNlIDogUHJvbWlzZUZuO1xuXG4gICAgdmFyIERlZmVycmVkID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciB0aGlzJDEgPSB0aGlzO1xuXG4gICAgICAgIHRoaXMucHJvbWlzZSA9IG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgICAgIHRoaXMkMS5yZWplY3QgPSByZWplY3Q7XG4gICAgICAgICAgICB0aGlzJDEucmVzb2x2ZSA9IHJlc29sdmU7XG4gICAgICAgIH0pO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBQcm9taXNlcy9BKyBwb2x5ZmlsbCB2MS4xLjQgKGh0dHBzOi8vZ2l0aHViLmNvbS9icmFtc3RlaW4vcHJvbWlzKVxuICAgICAqL1xuXG4gICAgdmFyIFJFU09MVkVEID0gMDtcbiAgICB2YXIgUkVKRUNURUQgPSAxO1xuICAgIHZhciBQRU5ESU5HID0gMjtcblxuICAgIHZhciBhc3luYyA9ICdzZXRJbW1lZGlhdGUnIGluIHdpbmRvdyA/IHNldEltbWVkaWF0ZSA6IHNldFRpbWVvdXQ7XG5cbiAgICBmdW5jdGlvbiBQcm9taXNlRm4oZXhlY3V0b3IpIHtcblxuICAgICAgICB0aGlzLnN0YXRlID0gUEVORElORztcbiAgICAgICAgdGhpcy52YWx1ZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5kZWZlcnJlZCA9IFtdO1xuXG4gICAgICAgIHZhciBwcm9taXNlID0gdGhpcztcblxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgZXhlY3V0b3IoXG4gICAgICAgICAgICAgICAgZnVuY3Rpb24gKHgpIHtcbiAgICAgICAgICAgICAgICAgICAgcHJvbWlzZS5yZXNvbHZlKHgpO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgZnVuY3Rpb24gKHIpIHtcbiAgICAgICAgICAgICAgICAgICAgcHJvbWlzZS5yZWplY3Qocik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgcHJvbWlzZS5yZWplY3QoZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBQcm9taXNlRm4ucmVqZWN0ID0gZnVuY3Rpb24gKHIpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlRm4oZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICAgICAgcmVqZWN0KHIpO1xuICAgICAgICB9KTtcbiAgICB9O1xuXG4gICAgUHJvbWlzZUZuLnJlc29sdmUgPSBmdW5jdGlvbiAoeCkge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2VGbihmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgICAgICByZXNvbHZlKHgpO1xuICAgICAgICB9KTtcbiAgICB9O1xuXG4gICAgUHJvbWlzZUZuLmFsbCA9IGZ1bmN0aW9uIGFsbChpdGVyYWJsZSkge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2VGbihmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgICAgICB2YXIgcmVzdWx0ID0gW107XG4gICAgICAgICAgICB2YXIgY291bnQgPSAwO1xuXG4gICAgICAgICAgICBpZiAoaXRlcmFibGUubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZShyZXN1bHQpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBmdW5jdGlvbiByZXNvbHZlcihpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICh4KSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdFtpXSA9IHg7XG4gICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDE7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKGNvdW50ID09PSBpdGVyYWJsZS5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUocmVzdWx0KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaXRlcmFibGUubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgICAgICAgICBQcm9taXNlRm4ucmVzb2x2ZShpdGVyYWJsZVtpXSkudGhlbihyZXNvbHZlcihpKSwgcmVqZWN0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfTtcblxuICAgIFByb21pc2VGbi5yYWNlID0gZnVuY3Rpb24gcmFjZShpdGVyYWJsZSkge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2VGbihmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGl0ZXJhYmxlLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgICAgICAgICAgUHJvbWlzZUZuLnJlc29sdmUoaXRlcmFibGVbaV0pLnRoZW4ocmVzb2x2ZSwgcmVqZWN0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfTtcblxuICAgIHZhciBwID0gUHJvbWlzZUZuLnByb3RvdHlwZTtcblxuICAgIHAucmVzb2x2ZSA9IGZ1bmN0aW9uIHJlc29sdmUoeCkge1xuICAgICAgICB2YXIgcHJvbWlzZSA9IHRoaXM7XG5cbiAgICAgICAgaWYgKHByb21pc2Uuc3RhdGUgPT09IFBFTkRJTkcpIHtcbiAgICAgICAgICAgIGlmICh4ID09PSBwcm9taXNlKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignUHJvbWlzZSBzZXR0bGVkIHdpdGggaXRzZWxmLicpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB2YXIgY2FsbGVkID0gZmFsc2U7XG5cbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgdmFyIHRoZW4gPSB4ICYmIHgudGhlbjtcblxuICAgICAgICAgICAgICAgIGlmICh4ICE9PSBudWxsICYmIGlzT2JqZWN0KHgpICYmIGlzRnVuY3Rpb24odGhlbikpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhlbi5jYWxsKFxuICAgICAgICAgICAgICAgICAgICAgICAgeCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uICh4KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFjYWxsZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvbWlzZS5yZXNvbHZlKHgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIChyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFjYWxsZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvbWlzZS5yZWplY3Qocik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFjYWxsZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgcHJvbWlzZS5yZWplY3QoZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcHJvbWlzZS5zdGF0ZSA9IFJFU09MVkVEO1xuICAgICAgICAgICAgcHJvbWlzZS52YWx1ZSA9IHg7XG4gICAgICAgICAgICBwcm9taXNlLm5vdGlmeSgpO1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIHAucmVqZWN0ID0gZnVuY3Rpb24gcmVqZWN0KHJlYXNvbikge1xuICAgICAgICB2YXIgcHJvbWlzZSA9IHRoaXM7XG5cbiAgICAgICAgaWYgKHByb21pc2Uuc3RhdGUgPT09IFBFTkRJTkcpIHtcbiAgICAgICAgICAgIGlmIChyZWFzb24gPT09IHByb21pc2UpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdQcm9taXNlIHNldHRsZWQgd2l0aCBpdHNlbGYuJyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHByb21pc2Uuc3RhdGUgPSBSRUpFQ1RFRDtcbiAgICAgICAgICAgIHByb21pc2UudmFsdWUgPSByZWFzb247XG4gICAgICAgICAgICBwcm9taXNlLm5vdGlmeSgpO1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIHAubm90aWZ5ID0gZnVuY3Rpb24gbm90aWZ5KCkge1xuICAgICAgICB2YXIgdGhpcyQxID0gdGhpcztcblxuICAgICAgICBhc3luYyhmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBpZiAodGhpcyQxLnN0YXRlICE9PSBQRU5ESU5HKSB7XG4gICAgICAgICAgICAgICAgd2hpbGUgKHRoaXMkMS5kZWZlcnJlZC5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHJlZiA9IHRoaXMkMS5kZWZlcnJlZC5zaGlmdCgpO1xuICAgICAgICAgICAgICAgICAgICB2YXIgb25SZXNvbHZlZCA9IHJlZlswXTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIG9uUmVqZWN0ZWQgPSByZWZbMV07XG4gICAgICAgICAgICAgICAgICAgIHZhciByZXNvbHZlID0gcmVmWzJdO1xuICAgICAgICAgICAgICAgICAgICB2YXIgcmVqZWN0ID0gcmVmWzNdO1xuXG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcyQxLnN0YXRlID09PSBSRVNPTFZFRCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc0Z1bmN0aW9uKG9uUmVzb2x2ZWQpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUob25SZXNvbHZlZC5jYWxsKHVuZGVmaW5lZCwgdGhpcyQxLnZhbHVlKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSh0aGlzJDEudmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcyQxLnN0YXRlID09PSBSRUpFQ1RFRCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc0Z1bmN0aW9uKG9uUmVqZWN0ZWQpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUob25SZWplY3RlZC5jYWxsKHVuZGVmaW5lZCwgdGhpcyQxLnZhbHVlKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KHRoaXMkMS52YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZWplY3QoZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH07XG5cbiAgICBwLnRoZW4gPSBmdW5jdGlvbiB0aGVuKG9uUmVzb2x2ZWQsIG9uUmVqZWN0ZWQpIHtcbiAgICAgICAgdmFyIHRoaXMkMSA9IHRoaXM7XG5cbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlRm4oZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICAgICAgdGhpcyQxLmRlZmVycmVkLnB1c2goW29uUmVzb2x2ZWQsIG9uUmVqZWN0ZWQsIHJlc29sdmUsIHJlamVjdF0pO1xuICAgICAgICAgICAgdGhpcyQxLm5vdGlmeSgpO1xuICAgICAgICB9KTtcbiAgICB9O1xuXG4gICAgcC5jYXRjaCA9IGZ1bmN0aW9uIChvblJlamVjdGVkKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnRoZW4odW5kZWZpbmVkLCBvblJlamVjdGVkKTtcbiAgICB9O1xuXG4gICAgZnVuY3Rpb24gYWpheCh1cmwsIG9wdGlvbnMpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcblxuICAgICAgICAgICAgdmFyIGVudiA9IGFzc2lnbih7XG4gICAgICAgICAgICAgICAgZGF0YTogbnVsbCxcbiAgICAgICAgICAgICAgICBtZXRob2Q6ICdHRVQnLFxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IHt9LFxuICAgICAgICAgICAgICAgIHhocjogbmV3IFhNTEh0dHBSZXF1ZXN0KCksXG4gICAgICAgICAgICAgICAgYmVmb3JlU2VuZDogbm9vcCxcbiAgICAgICAgICAgICAgICByZXNwb25zZVR5cGU6ICcnXG4gICAgICAgICAgICB9LCBvcHRpb25zKTtcblxuICAgICAgICAgICAgZW52LmJlZm9yZVNlbmQoZW52KTtcblxuICAgICAgICAgICAgdmFyIHhociA9IGVudi54aHI7XG5cbiAgICAgICAgICAgIGZvciAodmFyIHByb3AgaW4gZW52KSB7XG4gICAgICAgICAgICAgICAgaWYgKHByb3AgaW4geGhyKSB7XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHhocltwcm9wXSA9IGVudltwcm9wXTtcblxuICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7fVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgeGhyLm9wZW4oZW52Lm1ldGhvZC50b1VwcGVyQ2FzZSgpLCB1cmwpO1xuXG4gICAgICAgICAgICBmb3IgKHZhciBoZWFkZXIgaW4gZW52LmhlYWRlcnMpIHtcbiAgICAgICAgICAgICAgICB4aHIuc2V0UmVxdWVzdEhlYWRlcihoZWFkZXIsIGVudi5oZWFkZXJzW2hlYWRlcl0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBvbih4aHIsICdsb2FkJywgZnVuY3Rpb24gKCkge1xuXG4gICAgICAgICAgICAgICAgaWYgKHhoci5zdGF0dXMgPT09IDAgfHwgeGhyLnN0YXR1cyA+PSAyMDAgJiYgeGhyLnN0YXR1cyA8IDMwMCB8fCB4aHIuc3RhdHVzID09PSAzMDQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSh4aHIpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJlamVjdChhc3NpZ24oRXJyb3IoeGhyLnN0YXR1c1RleHQpLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICB4aHI6IHhocixcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1czogeGhyLnN0YXR1c1xuICAgICAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgb24oeGhyLCAnZXJyb3InLCBmdW5jdGlvbiAoKSB7IHJldHVybiByZWplY3QoYXNzaWduKEVycm9yKCdOZXR3b3JrIEVycm9yJyksIHt4aHI6IHhocn0pKTsgfSk7XG4gICAgICAgICAgICBvbih4aHIsICd0aW1lb3V0JywgZnVuY3Rpb24gKCkgeyByZXR1cm4gcmVqZWN0KGFzc2lnbihFcnJvcignTmV0d29yayBUaW1lb3V0JyksIHt4aHI6IHhocn0pKTsgfSk7XG5cbiAgICAgICAgICAgIHhoci5zZW5kKGVudi5kYXRhKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2V0SW1hZ2Uoc3JjLCBzcmNzZXQsIHNpemVzKSB7XG5cbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgICAgIHZhciBpbWcgPSBuZXcgSW1hZ2UoKTtcblxuICAgICAgICAgICAgaW1nLm9uZXJyb3IgPSByZWplY3Q7XG4gICAgICAgICAgICBpbWcub25sb2FkID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gcmVzb2x2ZShpbWcpOyB9O1xuXG4gICAgICAgICAgICBzaXplcyAmJiAoaW1nLnNpemVzID0gc2l6ZXMpO1xuICAgICAgICAgICAgc3Jjc2V0ICYmIChpbWcuc3Jjc2V0ID0gc3Jjc2V0KTtcbiAgICAgICAgICAgIGltZy5zcmMgPSBzcmM7XG4gICAgICAgIH0pO1xuXG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcmVhZHkoZm4pIHtcblxuICAgICAgICBpZiAoZG9jdW1lbnQucmVhZHlTdGF0ZSAhPT0gJ2xvYWRpbmcnKSB7XG4gICAgICAgICAgICBmbigpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHVuYmluZCA9IG9uKGRvY3VtZW50LCAnRE9NQ29udGVudExvYWRlZCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHVuYmluZCgpO1xuICAgICAgICAgICAgZm4oKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaW5kZXgoZWxlbWVudCwgcmVmKSB7XG4gICAgICAgIHJldHVybiByZWZcbiAgICAgICAgICAgID8gdG9Ob2RlcyhlbGVtZW50KS5pbmRleE9mKHRvTm9kZShyZWYpKVxuICAgICAgICAgICAgOiB0b05vZGVzKChlbGVtZW50ID0gdG9Ob2RlKGVsZW1lbnQpKSAmJiBlbGVtZW50LnBhcmVudE5vZGUuY2hpbGRyZW4pLmluZGV4T2YoZWxlbWVudCk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2V0SW5kZXgoaSwgZWxlbWVudHMsIGN1cnJlbnQsIGZpbml0ZSkge1xuICAgICAgICBpZiAoIGN1cnJlbnQgPT09IHZvaWQgMCApIGN1cnJlbnQgPSAwO1xuICAgICAgICBpZiAoIGZpbml0ZSA9PT0gdm9pZCAwICkgZmluaXRlID0gZmFsc2U7XG5cblxuICAgICAgICBlbGVtZW50cyA9IHRvTm9kZXMoZWxlbWVudHMpO1xuXG4gICAgICAgIHZhciBsZW5ndGggPSBlbGVtZW50cy5sZW5ndGg7XG5cbiAgICAgICAgaSA9IGlzTnVtZXJpYyhpKVxuICAgICAgICAgICAgPyB0b051bWJlcihpKVxuICAgICAgICAgICAgOiBpID09PSAnbmV4dCdcbiAgICAgICAgICAgICAgICA/IGN1cnJlbnQgKyAxXG4gICAgICAgICAgICAgICAgOiBpID09PSAncHJldmlvdXMnXG4gICAgICAgICAgICAgICAgICAgID8gY3VycmVudCAtIDFcbiAgICAgICAgICAgICAgICAgICAgOiBpbmRleChlbGVtZW50cywgaSk7XG5cbiAgICAgICAgaWYgKGZpbml0ZSkge1xuICAgICAgICAgICAgcmV0dXJuIGNsYW1wKGksIDAsIGxlbmd0aCAtIDEpO1xuICAgICAgICB9XG5cbiAgICAgICAgaSAlPSBsZW5ndGg7XG5cbiAgICAgICAgcmV0dXJuIGkgPCAwID8gaSArIGxlbmd0aCA6IGk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZW1wdHkoZWxlbWVudCkge1xuICAgICAgICBlbGVtZW50ID0gJChlbGVtZW50KTtcbiAgICAgICAgZWxlbWVudC5pbm5lckhUTUwgPSAnJztcbiAgICAgICAgcmV0dXJuIGVsZW1lbnQ7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaHRtbChwYXJlbnQsIGh0bWwpIHtcbiAgICAgICAgcGFyZW50ID0gJChwYXJlbnQpO1xuICAgICAgICByZXR1cm4gaXNVbmRlZmluZWQoaHRtbClcbiAgICAgICAgICAgID8gcGFyZW50LmlubmVySFRNTFxuICAgICAgICAgICAgOiBhcHBlbmQocGFyZW50Lmhhc0NoaWxkTm9kZXMoKSA/IGVtcHR5KHBhcmVudCkgOiBwYXJlbnQsIGh0bWwpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHByZXBlbmQocGFyZW50LCBlbGVtZW50KSB7XG5cbiAgICAgICAgcGFyZW50ID0gJChwYXJlbnQpO1xuXG4gICAgICAgIGlmICghcGFyZW50Lmhhc0NoaWxkTm9kZXMoKSkge1xuICAgICAgICAgICAgcmV0dXJuIGFwcGVuZChwYXJlbnQsIGVsZW1lbnQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGluc2VydE5vZGVzKGVsZW1lbnQsIGZ1bmN0aW9uIChlbGVtZW50KSB7IHJldHVybiBwYXJlbnQuaW5zZXJ0QmVmb3JlKGVsZW1lbnQsIHBhcmVudC5maXJzdENoaWxkKTsgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBhcHBlbmQocGFyZW50LCBlbGVtZW50KSB7XG4gICAgICAgIHBhcmVudCA9ICQocGFyZW50KTtcbiAgICAgICAgcmV0dXJuIGluc2VydE5vZGVzKGVsZW1lbnQsIGZ1bmN0aW9uIChlbGVtZW50KSB7IHJldHVybiBwYXJlbnQuYXBwZW5kQ2hpbGQoZWxlbWVudCk7IH0pO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGJlZm9yZShyZWYsIGVsZW1lbnQpIHtcbiAgICAgICAgcmVmID0gJChyZWYpO1xuICAgICAgICByZXR1cm4gaW5zZXJ0Tm9kZXMoZWxlbWVudCwgZnVuY3Rpb24gKGVsZW1lbnQpIHsgcmV0dXJuIHJlZi5wYXJlbnROb2RlLmluc2VydEJlZm9yZShlbGVtZW50LCByZWYpOyB9KTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBhZnRlcihyZWYsIGVsZW1lbnQpIHtcbiAgICAgICAgcmVmID0gJChyZWYpO1xuICAgICAgICByZXR1cm4gaW5zZXJ0Tm9kZXMoZWxlbWVudCwgZnVuY3Rpb24gKGVsZW1lbnQpIHsgcmV0dXJuIHJlZi5uZXh0U2libGluZ1xuICAgICAgICAgICAgPyBiZWZvcmUocmVmLm5leHRTaWJsaW5nLCBlbGVtZW50KVxuICAgICAgICAgICAgOiBhcHBlbmQocmVmLnBhcmVudE5vZGUsIGVsZW1lbnQpOyB9XG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaW5zZXJ0Tm9kZXMoZWxlbWVudCwgZm4pIHtcbiAgICAgICAgZWxlbWVudCA9IGlzU3RyaW5nKGVsZW1lbnQpID8gZnJhZ21lbnQoZWxlbWVudCkgOiBlbGVtZW50O1xuICAgICAgICByZXR1cm4gZWxlbWVudFxuICAgICAgICAgICAgPyAnbGVuZ3RoJyBpbiBlbGVtZW50XG4gICAgICAgICAgICAgICAgPyB0b05vZGVzKGVsZW1lbnQpLm1hcChmbilcbiAgICAgICAgICAgICAgICA6IGZuKGVsZW1lbnQpXG4gICAgICAgICAgICA6IG51bGw7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcmVtb3ZlKGVsZW1lbnQpIHtcbiAgICAgICAgdG9Ob2RlcyhlbGVtZW50KS5tYXAoZnVuY3Rpb24gKGVsZW1lbnQpIHsgcmV0dXJuIGVsZW1lbnQucGFyZW50Tm9kZSAmJiBlbGVtZW50LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZWxlbWVudCk7IH0pO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHdyYXBBbGwoZWxlbWVudCwgc3RydWN0dXJlKSB7XG5cbiAgICAgICAgc3RydWN0dXJlID0gdG9Ob2RlKGJlZm9yZShlbGVtZW50LCBzdHJ1Y3R1cmUpKTtcblxuICAgICAgICB3aGlsZSAoc3RydWN0dXJlLmZpcnN0Q2hpbGQpIHtcbiAgICAgICAgICAgIHN0cnVjdHVyZSA9IHN0cnVjdHVyZS5maXJzdENoaWxkO1xuICAgICAgICB9XG5cbiAgICAgICAgYXBwZW5kKHN0cnVjdHVyZSwgZWxlbWVudCk7XG5cbiAgICAgICAgcmV0dXJuIHN0cnVjdHVyZTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiB3cmFwSW5uZXIoZWxlbWVudCwgc3RydWN0dXJlKSB7XG4gICAgICAgIHJldHVybiB0b05vZGVzKHRvTm9kZXMoZWxlbWVudCkubWFwKGZ1bmN0aW9uIChlbGVtZW50KSB7IHJldHVybiBlbGVtZW50Lmhhc0NoaWxkTm9kZXMgPyB3cmFwQWxsKHRvTm9kZXMoZWxlbWVudC5jaGlsZE5vZGVzKSwgc3RydWN0dXJlKSA6IGFwcGVuZChlbGVtZW50LCBzdHJ1Y3R1cmUpOyB9XG4gICAgICAgICkpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHVud3JhcChlbGVtZW50KSB7XG4gICAgICAgIHRvTm9kZXMoZWxlbWVudClcbiAgICAgICAgICAgIC5tYXAoZnVuY3Rpb24gKGVsZW1lbnQpIHsgcmV0dXJuIGVsZW1lbnQucGFyZW50Tm9kZTsgfSlcbiAgICAgICAgICAgIC5maWx0ZXIoZnVuY3Rpb24gKHZhbHVlLCBpbmRleCwgc2VsZikgeyByZXR1cm4gc2VsZi5pbmRleE9mKHZhbHVlKSA9PT0gaW5kZXg7IH0pXG4gICAgICAgICAgICAuZm9yRWFjaChmdW5jdGlvbiAocGFyZW50KSB7XG4gICAgICAgICAgICAgICAgYmVmb3JlKHBhcmVudCwgcGFyZW50LmNoaWxkTm9kZXMpO1xuICAgICAgICAgICAgICAgIHJlbW92ZShwYXJlbnQpO1xuICAgICAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgdmFyIGZyYWdtZW50UmUgPSAvXlxccyo8KFxcdyt8ISlbXj5dKj4vO1xuICAgIHZhciBzaW5nbGVUYWdSZSA9IC9ePChcXHcrKVxccypcXC8/Pig/OjxcXC9cXDE+KT8kLztcblxuICAgIGZ1bmN0aW9uIGZyYWdtZW50KGh0bWwpIHtcblxuICAgICAgICB2YXIgbWF0Y2hlcyQkMSA9IHNpbmdsZVRhZ1JlLmV4ZWMoaHRtbCk7XG4gICAgICAgIGlmIChtYXRjaGVzJCQxKSB7XG4gICAgICAgICAgICByZXR1cm4gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChtYXRjaGVzJCQxWzFdKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBjb250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgaWYgKGZyYWdtZW50UmUudGVzdChodG1sKSkge1xuICAgICAgICAgICAgY29udGFpbmVyLmluc2VydEFkamFjZW50SFRNTCgnYmVmb3JlZW5kJywgaHRtbC50cmltKCkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29udGFpbmVyLnRleHRDb250ZW50ID0gaHRtbDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBjb250YWluZXIuY2hpbGROb2Rlcy5sZW5ndGggPiAxID8gdG9Ob2Rlcyhjb250YWluZXIuY2hpbGROb2RlcykgOiBjb250YWluZXIuZmlyc3RDaGlsZDtcblxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGFwcGx5KG5vZGUsIGZuKSB7XG5cbiAgICAgICAgaWYgKCFub2RlIHx8IG5vZGUubm9kZVR5cGUgIT09IDEpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGZuKG5vZGUpO1xuICAgICAgICBub2RlID0gbm9kZS5maXJzdEVsZW1lbnRDaGlsZDtcbiAgICAgICAgd2hpbGUgKG5vZGUpIHtcbiAgICAgICAgICAgIGFwcGx5KG5vZGUsIGZuKTtcbiAgICAgICAgICAgIG5vZGUgPSBub2RlLm5leHRFbGVtZW50U2libGluZztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uICQoc2VsZWN0b3IsIGNvbnRleHQpIHtcbiAgICAgICAgcmV0dXJuICFpc1N0cmluZyhzZWxlY3RvcilcbiAgICAgICAgICAgID8gdG9Ob2RlKHNlbGVjdG9yKVxuICAgICAgICAgICAgOiBpc0h0bWwoc2VsZWN0b3IpXG4gICAgICAgICAgICAgICAgPyB0b05vZGUoZnJhZ21lbnQoc2VsZWN0b3IpKVxuICAgICAgICAgICAgICAgIDogZmluZChzZWxlY3RvciwgY29udGV4dCk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gJCQoc2VsZWN0b3IsIGNvbnRleHQpIHtcbiAgICAgICAgcmV0dXJuICFpc1N0cmluZyhzZWxlY3RvcilcbiAgICAgICAgICAgID8gdG9Ob2RlcyhzZWxlY3RvcilcbiAgICAgICAgICAgIDogaXNIdG1sKHNlbGVjdG9yKVxuICAgICAgICAgICAgICAgID8gdG9Ob2RlcyhmcmFnbWVudChzZWxlY3RvcikpXG4gICAgICAgICAgICAgICAgOiBmaW5kQWxsKHNlbGVjdG9yLCBjb250ZXh0KTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpc0h0bWwoc3RyKSB7XG4gICAgICAgIHJldHVybiBzdHJbMF0gPT09ICc8JyB8fCBzdHIubWF0Y2goL15cXHMqPC8pO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGFkZENsYXNzKGVsZW1lbnQpIHtcbiAgICAgICAgdmFyIGFyZ3MgPSBbXSwgbGVuID0gYXJndW1lbnRzLmxlbmd0aCAtIDE7XG4gICAgICAgIHdoaWxlICggbGVuLS0gPiAwICkgYXJnc1sgbGVuIF0gPSBhcmd1bWVudHNbIGxlbiArIDEgXTtcblxuICAgICAgICBhcHBseSQxKGVsZW1lbnQsIGFyZ3MsICdhZGQnKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiByZW1vdmVDbGFzcyhlbGVtZW50KSB7XG4gICAgICAgIHZhciBhcmdzID0gW10sIGxlbiA9IGFyZ3VtZW50cy5sZW5ndGggLSAxO1xuICAgICAgICB3aGlsZSAoIGxlbi0tID4gMCApIGFyZ3NbIGxlbiBdID0gYXJndW1lbnRzWyBsZW4gKyAxIF07XG5cbiAgICAgICAgYXBwbHkkMShlbGVtZW50LCBhcmdzLCAncmVtb3ZlJyk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcmVtb3ZlQ2xhc3NlcyhlbGVtZW50LCBjbHMpIHtcbiAgICAgICAgYXR0cihlbGVtZW50LCAnY2xhc3MnLCBmdW5jdGlvbiAodmFsdWUpIHsgcmV0dXJuICh2YWx1ZSB8fCAnJykucmVwbGFjZShuZXcgUmVnRXhwKChcIlxcXFxiXCIgKyBjbHMgKyBcIlxcXFxiXCIpLCAnZycpLCAnJyk7IH0pO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHJlcGxhY2VDbGFzcyhlbGVtZW50KSB7XG4gICAgICAgIHZhciBhcmdzID0gW10sIGxlbiA9IGFyZ3VtZW50cy5sZW5ndGggLSAxO1xuICAgICAgICB3aGlsZSAoIGxlbi0tID4gMCApIGFyZ3NbIGxlbiBdID0gYXJndW1lbnRzWyBsZW4gKyAxIF07XG5cbiAgICAgICAgYXJnc1swXSAmJiByZW1vdmVDbGFzcyhlbGVtZW50LCBhcmdzWzBdKTtcbiAgICAgICAgYXJnc1sxXSAmJiBhZGRDbGFzcyhlbGVtZW50LCBhcmdzWzFdKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBoYXNDbGFzcyhlbGVtZW50LCBjbHMpIHtcbiAgICAgICAgcmV0dXJuIGNscyAmJiB0b05vZGVzKGVsZW1lbnQpLnNvbWUoZnVuY3Rpb24gKGVsZW1lbnQpIHsgcmV0dXJuIGVsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKGNscy5zcGxpdCgnICcpWzBdKTsgfSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gdG9nZ2xlQ2xhc3MoZWxlbWVudCkge1xuICAgICAgICB2YXIgYXJncyA9IFtdLCBsZW4gPSBhcmd1bWVudHMubGVuZ3RoIC0gMTtcbiAgICAgICAgd2hpbGUgKCBsZW4tLSA+IDAgKSBhcmdzWyBsZW4gXSA9IGFyZ3VtZW50c1sgbGVuICsgMSBdO1xuXG5cbiAgICAgICAgaWYgKCFhcmdzLmxlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgYXJncyA9IGdldEFyZ3MkMShhcmdzKTtcblxuICAgICAgICB2YXIgZm9yY2UgPSAhaXNTdHJpbmcoYXJnc1thcmdzLmxlbmd0aCAtIDFdKSA/IGFyZ3MucG9wKCkgOiBbXTsgLy8gaW4gaU9TIDkuMyBmb3JjZSA9PT0gdW5kZWZpbmVkIGV2YWx1YXRlcyB0byBmYWxzZVxuXG4gICAgICAgIGFyZ3MgPSBhcmdzLmZpbHRlcihCb29sZWFuKTtcblxuICAgICAgICB0b05vZGVzKGVsZW1lbnQpLmZvckVhY2goZnVuY3Rpb24gKHJlZikge1xuICAgICAgICAgICAgdmFyIGNsYXNzTGlzdCA9IHJlZi5jbGFzc0xpc3Q7XG5cbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJncy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIHN1cHBvcnRzLkZvcmNlXG4gICAgICAgICAgICAgICAgICAgID8gY2xhc3NMaXN0LnRvZ2dsZS5hcHBseShjbGFzc0xpc3QsIFthcmdzW2ldXS5jb25jYXQoZm9yY2UpKVxuICAgICAgICAgICAgICAgICAgICA6IChjbGFzc0xpc3RbKCFpc1VuZGVmaW5lZChmb3JjZSkgPyBmb3JjZSA6ICFjbGFzc0xpc3QuY29udGFpbnMoYXJnc1tpXSkpID8gJ2FkZCcgOiAncmVtb3ZlJ10oYXJnc1tpXSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGFwcGx5JDEoZWxlbWVudCwgYXJncywgZm4pIHtcbiAgICAgICAgYXJncyA9IGdldEFyZ3MkMShhcmdzKS5maWx0ZXIoQm9vbGVhbik7XG5cbiAgICAgICAgYXJncy5sZW5ndGggJiYgdG9Ob2RlcyhlbGVtZW50KS5mb3JFYWNoKGZ1bmN0aW9uIChyZWYpIHtcbiAgICAgICAgICAgIHZhciBjbGFzc0xpc3QgPSByZWYuY2xhc3NMaXN0O1xuXG4gICAgICAgICAgICBzdXBwb3J0cy5NdWx0aXBsZVxuICAgICAgICAgICAgICAgID8gY2xhc3NMaXN0W2ZuXS5hcHBseShjbGFzc0xpc3QsIGFyZ3MpXG4gICAgICAgICAgICAgICAgOiBhcmdzLmZvckVhY2goZnVuY3Rpb24gKGNscykgeyByZXR1cm4gY2xhc3NMaXN0W2ZuXShjbHMpOyB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2V0QXJncyQxKGFyZ3MpIHtcbiAgICAgICAgcmV0dXJuIGFyZ3MucmVkdWNlKGZ1bmN0aW9uIChhcmdzLCBhcmcpIHsgcmV0dXJuIGFyZ3MuY29uY2F0LmNhbGwoYXJncywgaXNTdHJpbmcoYXJnKSAmJiBpbmNsdWRlcyhhcmcsICcgJykgPyBhcmcudHJpbSgpLnNwbGl0KCcgJykgOiBhcmcpOyB9XG4gICAgICAgICAgICAsIFtdKTtcbiAgICB9XG5cbiAgICB2YXIgc3VwcG9ydHMgPSB7fTtcblxuICAgIC8vIElFIDExXG4gICAgKGZ1bmN0aW9uICgpIHtcblxuICAgICAgICB2YXIgbGlzdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ18nKS5jbGFzc0xpc3Q7XG4gICAgICAgIGlmIChsaXN0KSB7XG4gICAgICAgICAgICBsaXN0LmFkZCgnYScsICdiJyk7XG4gICAgICAgICAgICBsaXN0LnRvZ2dsZSgnYycsIGZhbHNlKTtcbiAgICAgICAgICAgIHN1cHBvcnRzLk11bHRpcGxlID0gbGlzdC5jb250YWlucygnYicpO1xuICAgICAgICAgICAgc3VwcG9ydHMuRm9yY2UgPSAhbGlzdC5jb250YWlucygnYycpO1xuICAgICAgICB9XG4gICAgICAgIGxpc3QgPSBudWxsO1xuXG4gICAgfSkoKTtcblxuICAgIHZhciBjc3NOdW1iZXIgPSB7XG4gICAgICAgICdhbmltYXRpb24taXRlcmF0aW9uLWNvdW50JzogdHJ1ZSxcbiAgICAgICAgJ2NvbHVtbi1jb3VudCc6IHRydWUsXG4gICAgICAgICdmaWxsLW9wYWNpdHknOiB0cnVlLFxuICAgICAgICAnZmxleC1ncm93JzogdHJ1ZSxcbiAgICAgICAgJ2ZsZXgtc2hyaW5rJzogdHJ1ZSxcbiAgICAgICAgJ2ZvbnQtd2VpZ2h0JzogdHJ1ZSxcbiAgICAgICAgJ2xpbmUtaGVpZ2h0JzogdHJ1ZSxcbiAgICAgICAgJ29wYWNpdHknOiB0cnVlLFxuICAgICAgICAnb3JkZXInOiB0cnVlLFxuICAgICAgICAnb3JwaGFucyc6IHRydWUsXG4gICAgICAgICd3aWRvd3MnOiB0cnVlLFxuICAgICAgICAnei1pbmRleCc6IHRydWUsXG4gICAgICAgICd6b29tJzogdHJ1ZVxuICAgIH07XG5cbiAgICBmdW5jdGlvbiBjc3MoZWxlbWVudCwgcHJvcGVydHksIHZhbHVlKSB7XG5cbiAgICAgICAgcmV0dXJuIHRvTm9kZXMoZWxlbWVudCkubWFwKGZ1bmN0aW9uIChlbGVtZW50KSB7XG5cbiAgICAgICAgICAgIGlmIChpc1N0cmluZyhwcm9wZXJ0eSkpIHtcblxuICAgICAgICAgICAgICAgIHByb3BlcnR5ID0gcHJvcE5hbWUocHJvcGVydHkpO1xuXG4gICAgICAgICAgICAgICAgaWYgKGlzVW5kZWZpbmVkKHZhbHVlKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ2V0U3R5bGUoZWxlbWVudCwgcHJvcGVydHkpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIXZhbHVlICYmICFpc051bWJlcih2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5zdHlsZS5yZW1vdmVQcm9wZXJ0eShwcm9wZXJ0eSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5zdHlsZVtwcm9wZXJ0eV0gPSBpc051bWVyaWModmFsdWUpICYmICFjc3NOdW1iZXJbcHJvcGVydHldID8gKHZhbHVlICsgXCJweFwiKSA6IHZhbHVlO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgfSBlbHNlIGlmIChpc0FycmF5KHByb3BlcnR5KSkge1xuXG4gICAgICAgICAgICAgICAgdmFyIHN0eWxlcyA9IGdldFN0eWxlcyhlbGVtZW50KTtcblxuICAgICAgICAgICAgICAgIHJldHVybiBwcm9wZXJ0eS5yZWR1Y2UoZnVuY3Rpb24gKHByb3BzLCBwcm9wZXJ0eSkge1xuICAgICAgICAgICAgICAgICAgICBwcm9wc1twcm9wZXJ0eV0gPSBzdHlsZXNbcHJvcE5hbWUocHJvcGVydHkpXTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHByb3BzO1xuICAgICAgICAgICAgICAgIH0sIHt9KTtcblxuICAgICAgICAgICAgfSBlbHNlIGlmIChpc09iamVjdChwcm9wZXJ0eSkpIHtcbiAgICAgICAgICAgICAgICBlYWNoKHByb3BlcnR5LCBmdW5jdGlvbiAodmFsdWUsIHByb3BlcnR5KSB7IHJldHVybiBjc3MoZWxlbWVudCwgcHJvcGVydHksIHZhbHVlKTsgfSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBlbGVtZW50O1xuXG4gICAgICAgIH0pWzBdO1xuXG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2V0U3R5bGVzKGVsZW1lbnQsIHBzZXVkb0VsdCkge1xuICAgICAgICBlbGVtZW50ID0gdG9Ob2RlKGVsZW1lbnQpO1xuICAgICAgICByZXR1cm4gZWxlbWVudC5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3LmdldENvbXB1dGVkU3R5bGUoZWxlbWVudCwgcHNldWRvRWx0KTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBnZXRTdHlsZShlbGVtZW50LCBwcm9wZXJ0eSwgcHNldWRvRWx0KSB7XG4gICAgICAgIHJldHVybiBnZXRTdHlsZXMoZWxlbWVudCwgcHNldWRvRWx0KVtwcm9wZXJ0eV07XG4gICAgfVxuXG4gICAgdmFyIHZhcnMgPSB7fTtcblxuICAgIGZ1bmN0aW9uIGdldENzc1ZhcihuYW1lKSB7XG5cbiAgICAgICAgdmFyIGRvY0VsID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50O1xuXG4gICAgICAgIGlmICghaXNJRSkge1xuICAgICAgICAgICAgcmV0dXJuIGdldFN0eWxlcyhkb2NFbCkuZ2V0UHJvcGVydHlWYWx1ZSgoXCItLXVrLVwiICsgbmFtZSkpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCEobmFtZSBpbiB2YXJzKSkge1xuXG4gICAgICAgICAgICAvKiB1c2FnZSBpbiBjc3M6IC51ay1uYW1lOmJlZm9yZSB7IGNvbnRlbnQ6XCJ4eXpcIiB9ICovXG5cbiAgICAgICAgICAgIHZhciBlbGVtZW50ID0gYXBwZW5kKGRvY0VsLCBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKSk7XG5cbiAgICAgICAgICAgIGFkZENsYXNzKGVsZW1lbnQsIChcInVrLVwiICsgbmFtZSkpO1xuXG4gICAgICAgICAgICB2YXJzW25hbWVdID0gZ2V0U3R5bGUoZWxlbWVudCwgJ2NvbnRlbnQnLCAnOmJlZm9yZScpLnJlcGxhY2UoL15bXCInXSguKilbXCInXSQvLCAnJDEnKTtcblxuICAgICAgICAgICAgcmVtb3ZlKGVsZW1lbnQpO1xuXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdmFyc1tuYW1lXTtcblxuICAgIH1cblxuICAgIHZhciBjc3NQcm9wcyA9IHt9O1xuXG4gICAgZnVuY3Rpb24gcHJvcE5hbWUobmFtZSkge1xuXG4gICAgICAgIHZhciByZXQgPSBjc3NQcm9wc1tuYW1lXTtcbiAgICAgICAgaWYgKCFyZXQpIHtcbiAgICAgICAgICAgIHJldCA9IGNzc1Byb3BzW25hbWVdID0gdmVuZG9yUHJvcE5hbWUobmFtZSkgfHwgbmFtZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmV0O1xuICAgIH1cblxuICAgIHZhciBjc3NQcmVmaXhlcyA9IFsnd2Via2l0JywgJ21veicsICdtcyddO1xuICAgIHZhciByZWYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdfJyk7XG4gICAgdmFyIHN0eWxlID0gcmVmLnN0eWxlO1xuXG4gICAgZnVuY3Rpb24gdmVuZG9yUHJvcE5hbWUobmFtZSkge1xuXG4gICAgICAgIG5hbWUgPSBoeXBoZW5hdGUobmFtZSk7XG5cbiAgICAgICAgaWYgKG5hbWUgaW4gc3R5bGUpIHtcbiAgICAgICAgICAgIHJldHVybiBuYW1lO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGkgPSBjc3NQcmVmaXhlcy5sZW5ndGgsIHByZWZpeGVkTmFtZTtcblxuICAgICAgICB3aGlsZSAoaS0tKSB7XG4gICAgICAgICAgICBwcmVmaXhlZE5hbWUgPSBcIi1cIiArIChjc3NQcmVmaXhlc1tpXSkgKyBcIi1cIiArIG5hbWU7XG4gICAgICAgICAgICBpZiAocHJlZml4ZWROYW1lIGluIHN0eWxlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHByZWZpeGVkTmFtZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIHRyYW5zaXRpb24oZWxlbWVudCwgcHJvcHMsIGR1cmF0aW9uLCB0aW1pbmcpIHtcbiAgICAgICAgaWYgKCBkdXJhdGlvbiA9PT0gdm9pZCAwICkgZHVyYXRpb24gPSA0MDA7XG4gICAgICAgIGlmICggdGltaW5nID09PSB2b2lkIDAgKSB0aW1pbmcgPSAnbGluZWFyJztcblxuXG4gICAgICAgIHJldHVybiBQcm9taXNlLmFsbCh0b05vZGVzKGVsZW1lbnQpLm1hcChmdW5jdGlvbiAoZWxlbWVudCkgeyByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuXG4gICAgICAgICAgICAgICAgZm9yICh2YXIgbmFtZSBpbiBwcm9wcykge1xuICAgICAgICAgICAgICAgICAgICB2YXIgdmFsdWUgPSBjc3MoZWxlbWVudCwgbmFtZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA9PT0gJycpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNzcyhlbGVtZW50LCBuYW1lLCB2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB2YXIgdGltZXIgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRyaWdnZXIoZWxlbWVudCwgJ3RyYW5zaXRpb25lbmQnKTsgfSwgZHVyYXRpb24pO1xuXG4gICAgICAgICAgICAgICAgb25jZShlbGVtZW50LCAndHJhbnNpdGlvbmVuZCB0cmFuc2l0aW9uY2FuY2VsZWQnLCBmdW5jdGlvbiAocmVmKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciB0eXBlID0gcmVmLnR5cGU7XG5cbiAgICAgICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVyKTtcbiAgICAgICAgICAgICAgICAgICAgcmVtb3ZlQ2xhc3MoZWxlbWVudCwgJ3VrLXRyYW5zaXRpb24nKTtcbiAgICAgICAgICAgICAgICAgICAgY3NzKGVsZW1lbnQsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICd0cmFuc2l0aW9uLXByb3BlcnR5JzogJycsXG4gICAgICAgICAgICAgICAgICAgICAgICAndHJhbnNpdGlvbi1kdXJhdGlvbic6ICcnLFxuICAgICAgICAgICAgICAgICAgICAgICAgJ3RyYW5zaXRpb24tdGltaW5nLWZ1bmN0aW9uJzogJydcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIHR5cGUgPT09ICd0cmFuc2l0aW9uY2FuY2VsZWQnID8gcmVqZWN0KCkgOiByZXNvbHZlKCk7XG4gICAgICAgICAgICAgICAgfSwgZmFsc2UsIGZ1bmN0aW9uIChyZWYpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHRhcmdldCA9IHJlZi50YXJnZXQ7XG5cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQgPT09IHRhcmdldDtcbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgIGFkZENsYXNzKGVsZW1lbnQsICd1ay10cmFuc2l0aW9uJyk7XG4gICAgICAgICAgICAgICAgY3NzKGVsZW1lbnQsIGFzc2lnbih7XG4gICAgICAgICAgICAgICAgICAgICd0cmFuc2l0aW9uLXByb3BlcnR5JzogT2JqZWN0LmtleXMocHJvcHMpLm1hcChwcm9wTmFtZSkuam9pbignLCcpLFxuICAgICAgICAgICAgICAgICAgICAndHJhbnNpdGlvbi1kdXJhdGlvbic6IChkdXJhdGlvbiArIFwibXNcIiksXG4gICAgICAgICAgICAgICAgICAgICd0cmFuc2l0aW9uLXRpbWluZy1mdW5jdGlvbic6IHRpbWluZ1xuICAgICAgICAgICAgICAgIH0sIHByb3BzKSk7XG5cbiAgICAgICAgICAgIH0pOyB9XG4gICAgICAgICkpO1xuXG4gICAgfVxuXG4gICAgdmFyIFRyYW5zaXRpb24gPSB7XG5cbiAgICAgICAgc3RhcnQ6IHRyYW5zaXRpb24sXG5cbiAgICAgICAgc3RvcDogZnVuY3Rpb24oZWxlbWVudCkge1xuICAgICAgICAgICAgdHJpZ2dlcihlbGVtZW50LCAndHJhbnNpdGlvbmVuZCcpO1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuICAgICAgICB9LFxuXG4gICAgICAgIGNhbmNlbDogZnVuY3Rpb24oZWxlbWVudCkge1xuICAgICAgICAgICAgdHJpZ2dlcihlbGVtZW50LCAndHJhbnNpdGlvbmNhbmNlbGVkJyk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgaW5Qcm9ncmVzczogZnVuY3Rpb24oZWxlbWVudCkge1xuICAgICAgICAgICAgcmV0dXJuIGhhc0NsYXNzKGVsZW1lbnQsICd1ay10cmFuc2l0aW9uJyk7XG4gICAgICAgIH1cblxuICAgIH07XG5cbiAgICB2YXIgYW5pbWF0aW9uUHJlZml4ID0gJ3VrLWFuaW1hdGlvbi0nO1xuICAgIHZhciBjbHNDYW5jZWxBbmltYXRpb24gPSAndWstY2FuY2VsLWFuaW1hdGlvbic7XG5cbiAgICBmdW5jdGlvbiBhbmltYXRlKGVsZW1lbnQsIGFuaW1hdGlvbiwgZHVyYXRpb24sIG9yaWdpbiwgb3V0KSB7XG4gICAgICAgIHZhciBhcmd1bWVudHMkMSA9IGFyZ3VtZW50cztcbiAgICAgICAgaWYgKCBkdXJhdGlvbiA9PT0gdm9pZCAwICkgZHVyYXRpb24gPSAyMDA7XG5cblxuICAgICAgICByZXR1cm4gUHJvbWlzZS5hbGwodG9Ob2RlcyhlbGVtZW50KS5tYXAoZnVuY3Rpb24gKGVsZW1lbnQpIHsgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcblxuICAgICAgICAgICAgICAgIGlmIChoYXNDbGFzcyhlbGVtZW50LCBjbHNDYW5jZWxBbmltYXRpb24pKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZShmdW5jdGlvbiAoKSB7IHJldHVybiBQcm9taXNlLnJlc29sdmUoKS50aGVuKGZ1bmN0aW9uICgpIHsgcmV0dXJuIGFuaW1hdGUuYXBwbHkodm9pZCAwLCBhcmd1bWVudHMkMSkudGhlbihyZXNvbHZlLCByZWplY3QpOyB9XG4gICAgICAgICAgICAgICAgICAgICAgICApOyB9XG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB2YXIgY2xzID0gYW5pbWF0aW9uICsgXCIgXCIgKyBhbmltYXRpb25QcmVmaXggKyAob3V0ID8gJ2xlYXZlJyA6ICdlbnRlcicpO1xuXG4gICAgICAgICAgICAgICAgaWYgKHN0YXJ0c1dpdGgoYW5pbWF0aW9uLCBhbmltYXRpb25QcmVmaXgpKSB7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKG9yaWdpbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2xzICs9IFwiIHVrLXRyYW5zZm9ybS1vcmlnaW4tXCIgKyBvcmlnaW47XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBpZiAob3V0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjbHMgKz0gXCIgXCIgKyBhbmltYXRpb25QcmVmaXggKyBcInJldmVyc2VcIjtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcmVzZXQoKTtcblxuICAgICAgICAgICAgICAgIG9uY2UoZWxlbWVudCwgJ2FuaW1hdGlvbmVuZCBhbmltYXRpb25jYW5jZWwnLCBmdW5jdGlvbiAocmVmKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciB0eXBlID0gcmVmLnR5cGU7XG5cblxuICAgICAgICAgICAgICAgICAgICB2YXIgaGFzUmVzZXQgPSBmYWxzZTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZSA9PT0gJ2FuaW1hdGlvbmNhbmNlbCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzZXQoKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc1Jlc2V0ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNldCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFoYXNSZXNldCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZENsYXNzKGVsZW1lbnQsIGNsc0NhbmNlbEFuaW1hdGlvbik7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZnVuY3Rpb24gKCkgeyByZXR1cm4gcmVtb3ZlQ2xhc3MoZWxlbWVudCwgY2xzQ2FuY2VsQW5pbWF0aW9uKTsgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgfSwgZmFsc2UsIGZ1bmN0aW9uIChyZWYpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHRhcmdldCA9IHJlZi50YXJnZXQ7XG5cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQgPT09IHRhcmdldDtcbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgIGNzcyhlbGVtZW50LCAnYW5pbWF0aW9uRHVyYXRpb24nLCAoZHVyYXRpb24gKyBcIm1zXCIpKTtcbiAgICAgICAgICAgICAgICBhZGRDbGFzcyhlbGVtZW50LCBjbHMpO1xuXG4gICAgICAgICAgICAgICAgZnVuY3Rpb24gcmVzZXQoKSB7XG4gICAgICAgICAgICAgICAgICAgIGNzcyhlbGVtZW50LCAnYW5pbWF0aW9uRHVyYXRpb24nLCAnJyk7XG4gICAgICAgICAgICAgICAgICAgIHJlbW92ZUNsYXNzZXMoZWxlbWVudCwgKGFuaW1hdGlvblByZWZpeCArIFwiXFxcXFMqXCIpKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIH0pOyB9XG4gICAgICAgICkpO1xuXG4gICAgfVxuXG4gICAgdmFyIGluUHJvZ3Jlc3MgPSBuZXcgUmVnRXhwKChhbmltYXRpb25QcmVmaXggKyBcIihlbnRlcnxsZWF2ZSlcIikpO1xuICAgIHZhciBBbmltYXRpb24gPSB7XG5cbiAgICAgICAgaW46IGZ1bmN0aW9uKGVsZW1lbnQsIGFuaW1hdGlvbiwgZHVyYXRpb24sIG9yaWdpbikge1xuICAgICAgICAgICAgcmV0dXJuIGFuaW1hdGUoZWxlbWVudCwgYW5pbWF0aW9uLCBkdXJhdGlvbiwgb3JpZ2luLCBmYWxzZSk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgb3V0OiBmdW5jdGlvbihlbGVtZW50LCBhbmltYXRpb24sIGR1cmF0aW9uLCBvcmlnaW4pIHtcbiAgICAgICAgICAgIHJldHVybiBhbmltYXRlKGVsZW1lbnQsIGFuaW1hdGlvbiwgZHVyYXRpb24sIG9yaWdpbiwgdHJ1ZSk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgaW5Qcm9ncmVzczogZnVuY3Rpb24oZWxlbWVudCkge1xuICAgICAgICAgICAgcmV0dXJuIGluUHJvZ3Jlc3MudGVzdChhdHRyKGVsZW1lbnQsICdjbGFzcycpKTtcbiAgICAgICAgfSxcblxuICAgICAgICBjYW5jZWw6IGZ1bmN0aW9uKGVsZW1lbnQpIHtcbiAgICAgICAgICAgIHRyaWdnZXIoZWxlbWVudCwgJ2FuaW1hdGlvbmNhbmNlbCcpO1xuICAgICAgICB9XG5cbiAgICB9O1xuXG4gICAgdmFyIGRpcnMgPSB7XG4gICAgICAgIHdpZHRoOiBbJ3gnLCAnbGVmdCcsICdyaWdodCddLFxuICAgICAgICBoZWlnaHQ6IFsneScsICd0b3AnLCAnYm90dG9tJ11cbiAgICB9O1xuXG4gICAgZnVuY3Rpb24gcG9zaXRpb25BdChlbGVtZW50LCB0YXJnZXQsIGVsQXR0YWNoLCB0YXJnZXRBdHRhY2gsIGVsT2Zmc2V0LCB0YXJnZXRPZmZzZXQsIGZsaXAsIGJvdW5kYXJ5KSB7XG5cbiAgICAgICAgZWxBdHRhY2ggPSBnZXRQb3MoZWxBdHRhY2gpO1xuICAgICAgICB0YXJnZXRBdHRhY2ggPSBnZXRQb3ModGFyZ2V0QXR0YWNoKTtcblxuICAgICAgICB2YXIgZmxpcHBlZCA9IHtlbGVtZW50OiBlbEF0dGFjaCwgdGFyZ2V0OiB0YXJnZXRBdHRhY2h9O1xuXG4gICAgICAgIGlmICghZWxlbWVudCB8fCAhdGFyZ2V0KSB7XG4gICAgICAgICAgICByZXR1cm4gZmxpcHBlZDtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBkaW0gPSBnZXREaW1lbnNpb25zKGVsZW1lbnQpO1xuICAgICAgICB2YXIgdGFyZ2V0RGltID0gZ2V0RGltZW5zaW9ucyh0YXJnZXQpO1xuICAgICAgICB2YXIgcG9zaXRpb24gPSB0YXJnZXREaW07XG5cbiAgICAgICAgbW92ZVRvKHBvc2l0aW9uLCBlbEF0dGFjaCwgZGltLCAtMSk7XG4gICAgICAgIG1vdmVUbyhwb3NpdGlvbiwgdGFyZ2V0QXR0YWNoLCB0YXJnZXREaW0sIDEpO1xuXG4gICAgICAgIGVsT2Zmc2V0ID0gZ2V0T2Zmc2V0cyhlbE9mZnNldCwgZGltLndpZHRoLCBkaW0uaGVpZ2h0KTtcbiAgICAgICAgdGFyZ2V0T2Zmc2V0ID0gZ2V0T2Zmc2V0cyh0YXJnZXRPZmZzZXQsIHRhcmdldERpbS53aWR0aCwgdGFyZ2V0RGltLmhlaWdodCk7XG5cbiAgICAgICAgZWxPZmZzZXRbJ3gnXSArPSB0YXJnZXRPZmZzZXRbJ3gnXTtcbiAgICAgICAgZWxPZmZzZXRbJ3knXSArPSB0YXJnZXRPZmZzZXRbJ3knXTtcblxuICAgICAgICBwb3NpdGlvbi5sZWZ0ICs9IGVsT2Zmc2V0Wyd4J107XG4gICAgICAgIHBvc2l0aW9uLnRvcCArPSBlbE9mZnNldFsneSddO1xuXG4gICAgICAgIGlmIChmbGlwKSB7XG5cbiAgICAgICAgICAgIHZhciBib3VuZGFyaWVzID0gW2dldERpbWVuc2lvbnMod2luZG93JDEoZWxlbWVudCkpXTtcblxuICAgICAgICAgICAgaWYgKGJvdW5kYXJ5KSB7XG4gICAgICAgICAgICAgICAgYm91bmRhcmllcy51bnNoaWZ0KGdldERpbWVuc2lvbnMoYm91bmRhcnkpKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZWFjaChkaXJzLCBmdW5jdGlvbiAocmVmLCBwcm9wKSB7XG4gICAgICAgICAgICAgICAgdmFyIGRpciA9IHJlZlswXTtcbiAgICAgICAgICAgICAgICB2YXIgYWxpZ24gPSByZWZbMV07XG4gICAgICAgICAgICAgICAgdmFyIGFsaWduRmxpcCA9IHJlZlsyXTtcblxuXG4gICAgICAgICAgICAgICAgaWYgKCEoZmxpcCA9PT0gdHJ1ZSB8fCBpbmNsdWRlcyhmbGlwLCBkaXIpKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgYm91bmRhcmllcy5zb21lKGZ1bmN0aW9uIChib3VuZGFyeSkge1xuXG4gICAgICAgICAgICAgICAgICAgIHZhciBlbGVtT2Zmc2V0ID0gZWxBdHRhY2hbZGlyXSA9PT0gYWxpZ25cbiAgICAgICAgICAgICAgICAgICAgICAgID8gLWRpbVtwcm9wXVxuICAgICAgICAgICAgICAgICAgICAgICAgOiBlbEF0dGFjaFtkaXJdID09PSBhbGlnbkZsaXBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IGRpbVtwcm9wXVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogMDtcblxuICAgICAgICAgICAgICAgICAgICB2YXIgdGFyZ2V0T2Zmc2V0ID0gdGFyZ2V0QXR0YWNoW2Rpcl0gPT09IGFsaWduXG4gICAgICAgICAgICAgICAgICAgICAgICA/IHRhcmdldERpbVtwcm9wXVxuICAgICAgICAgICAgICAgICAgICAgICAgOiB0YXJnZXRBdHRhY2hbZGlyXSA9PT0gYWxpZ25GbGlwXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAtdGFyZ2V0RGltW3Byb3BdXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAwO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChwb3NpdGlvblthbGlnbl0gPCBib3VuZGFyeVthbGlnbl0gfHwgcG9zaXRpb25bYWxpZ25dICsgZGltW3Byb3BdID4gYm91bmRhcnlbYWxpZ25GbGlwXSkge1xuXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgY2VudGVyT2Zmc2V0ID0gZGltW3Byb3BdIC8gMjtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjZW50ZXJUYXJnZXRPZmZzZXQgPSB0YXJnZXRBdHRhY2hbZGlyXSA9PT0gJ2NlbnRlcicgPyAtdGFyZ2V0RGltW3Byb3BdIC8gMiA6IDA7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlbEF0dGFjaFtkaXJdID09PSAnY2VudGVyJyAmJiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwbHkoY2VudGVyT2Zmc2V0LCBjZW50ZXJUYXJnZXRPZmZzZXQpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgYXBwbHkoLWNlbnRlck9mZnNldCwgLWNlbnRlclRhcmdldE9mZnNldClcbiAgICAgICAgICAgICAgICAgICAgICAgICkgfHwgYXBwbHkoZWxlbU9mZnNldCwgdGFyZ2V0T2Zmc2V0KTtcblxuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gYXBwbHkoZWxlbU9mZnNldCwgdGFyZ2V0T2Zmc2V0KSB7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuZXdWYWwgPSBwb3NpdGlvblthbGlnbl0gKyBlbGVtT2Zmc2V0ICsgdGFyZ2V0T2Zmc2V0IC0gZWxPZmZzZXRbZGlyXSAqIDI7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuZXdWYWwgPj0gYm91bmRhcnlbYWxpZ25dICYmIG5ld1ZhbCArIGRpbVtwcm9wXSA8PSBib3VuZGFyeVthbGlnbkZsaXBdKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb25bYWxpZ25dID0gbmV3VmFsO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgWydlbGVtZW50JywgJ3RhcmdldCddLmZvckVhY2goZnVuY3Rpb24gKGVsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsaXBwZWRbZWxdW2Rpcl0gPSAhZWxlbU9mZnNldFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBmbGlwcGVkW2VsXVtkaXJdXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGZsaXBwZWRbZWxdW2Rpcl0gPT09IGRpcnNbcHJvcF1bMV1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IGRpcnNbcHJvcF1bMl1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGRpcnNbcHJvcF1bMV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBvZmZzZXQoZWxlbWVudCwgcG9zaXRpb24pO1xuXG4gICAgICAgIHJldHVybiBmbGlwcGVkO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIG9mZnNldChlbGVtZW50LCBjb29yZGluYXRlcykge1xuXG4gICAgICAgIGVsZW1lbnQgPSB0b05vZGUoZWxlbWVudCk7XG5cbiAgICAgICAgaWYgKGNvb3JkaW5hdGVzKSB7XG5cbiAgICAgICAgICAgIHZhciBjdXJyZW50T2Zmc2V0ID0gb2Zmc2V0KGVsZW1lbnQpO1xuICAgICAgICAgICAgdmFyIHBvcyA9IGNzcyhlbGVtZW50LCAncG9zaXRpb24nKTtcblxuICAgICAgICAgICAgWydsZWZ0JywgJ3RvcCddLmZvckVhY2goZnVuY3Rpb24gKHByb3ApIHtcbiAgICAgICAgICAgICAgICBpZiAocHJvcCBpbiBjb29yZGluYXRlcykge1xuICAgICAgICAgICAgICAgICAgICB2YXIgdmFsdWUgPSBjc3MoZWxlbWVudCwgcHJvcCk7XG4gICAgICAgICAgICAgICAgICAgIGNzcyhlbGVtZW50LCBwcm9wLCBjb29yZGluYXRlc1twcm9wXSAtIGN1cnJlbnRPZmZzZXRbcHJvcF1cbiAgICAgICAgICAgICAgICAgICAgICAgICsgdG9GbG9hdChwb3MgPT09ICdhYnNvbHV0ZScgJiYgdmFsdWUgPT09ICdhdXRvJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gcG9zaXRpb24oZWxlbWVudClbcHJvcF1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHZhbHVlKVxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZ2V0RGltZW5zaW9ucyhlbGVtZW50KTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBnZXREaW1lbnNpb25zKGVsZW1lbnQpIHtcblxuICAgICAgICBlbGVtZW50ID0gdG9Ob2RlKGVsZW1lbnQpO1xuXG4gICAgICAgIHZhciByZWYgPSB3aW5kb3ckMShlbGVtZW50KTtcbiAgICAgICAgdmFyIHRvcCA9IHJlZi5wYWdlWU9mZnNldDtcbiAgICAgICAgdmFyIGxlZnQgPSByZWYucGFnZVhPZmZzZXQ7XG5cbiAgICAgICAgaWYgKGlzV2luZG93KGVsZW1lbnQpKSB7XG5cbiAgICAgICAgICAgIHZhciBoZWlnaHQgPSBlbGVtZW50LmlubmVySGVpZ2h0O1xuICAgICAgICAgICAgdmFyIHdpZHRoID0gZWxlbWVudC5pbm5lcldpZHRoO1xuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHRvcDogdG9wLFxuICAgICAgICAgICAgICAgIGxlZnQ6IGxlZnQsXG4gICAgICAgICAgICAgICAgaGVpZ2h0OiBoZWlnaHQsXG4gICAgICAgICAgICAgICAgd2lkdGg6IHdpZHRoLFxuICAgICAgICAgICAgICAgIGJvdHRvbTogdG9wICsgaGVpZ2h0LFxuICAgICAgICAgICAgICAgIHJpZ2h0OiBsZWZ0ICsgd2lkdGgsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHN0eWxlLCBoaWRkZW47XG5cbiAgICAgICAgaWYgKCFpc1Zpc2libGUoZWxlbWVudCkpIHtcbiAgICAgICAgICAgIHN0eWxlID0gYXR0cihlbGVtZW50LCAnc3R5bGUnKTtcbiAgICAgICAgICAgIGhpZGRlbiA9IGF0dHIoZWxlbWVudCwgJ2hpZGRlbicpO1xuXG4gICAgICAgICAgICBhdHRyKGVsZW1lbnQsIHtcbiAgICAgICAgICAgICAgICBzdHlsZTogKChzdHlsZSB8fCAnJykgKyBcIjtkaXNwbGF5OmJsb2NrICFpbXBvcnRhbnQ7XCIpLFxuICAgICAgICAgICAgICAgIGhpZGRlbjogbnVsbFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgcmVjdCA9IGVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG5cbiAgICAgICAgaWYgKCFpc1VuZGVmaW5lZChzdHlsZSkpIHtcbiAgICAgICAgICAgIGF0dHIoZWxlbWVudCwge3N0eWxlOiBzdHlsZSwgaGlkZGVuOiBoaWRkZW59KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBoZWlnaHQ6IHJlY3QuaGVpZ2h0LFxuICAgICAgICAgICAgd2lkdGg6IHJlY3Qud2lkdGgsXG4gICAgICAgICAgICB0b3A6IHJlY3QudG9wICsgdG9wLFxuICAgICAgICAgICAgbGVmdDogcmVjdC5sZWZ0ICsgbGVmdCxcbiAgICAgICAgICAgIGJvdHRvbTogcmVjdC5ib3R0b20gKyB0b3AsXG4gICAgICAgICAgICByaWdodDogcmVjdC5yaWdodCArIGxlZnQsXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcG9zaXRpb24oZWxlbWVudCkge1xuICAgICAgICBlbGVtZW50ID0gdG9Ob2RlKGVsZW1lbnQpO1xuXG4gICAgICAgIHZhciBwYXJlbnQgPSBlbGVtZW50Lm9mZnNldFBhcmVudCB8fCBkb2NFbChlbGVtZW50KTtcbiAgICAgICAgdmFyIHBhcmVudE9mZnNldCA9IG9mZnNldChwYXJlbnQpO1xuICAgICAgICB2YXIgcmVmID0gWyd0b3AnLCAnbGVmdCddLnJlZHVjZShmdW5jdGlvbiAocHJvcHMsIHByb3ApIHtcbiAgICAgICAgICAgIHZhciBwcm9wTmFtZSQkMSA9IHVjZmlyc3QocHJvcCk7XG4gICAgICAgICAgICBwcm9wc1twcm9wXSAtPSBwYXJlbnRPZmZzZXRbcHJvcF1cbiAgICAgICAgICAgICAgICArIHRvRmxvYXQoY3NzKGVsZW1lbnQsIChcIm1hcmdpblwiICsgcHJvcE5hbWUkJDEpKSlcbiAgICAgICAgICAgICAgICArIHRvRmxvYXQoY3NzKHBhcmVudCwgKFwiYm9yZGVyXCIgKyBwcm9wTmFtZSQkMSArIFwiV2lkdGhcIikpKTtcbiAgICAgICAgICAgIHJldHVybiBwcm9wcztcbiAgICAgICAgfSwgb2Zmc2V0KGVsZW1lbnQpKTtcbiAgICAgICAgdmFyIHRvcCA9IHJlZi50b3A7XG4gICAgICAgIHZhciBsZWZ0ID0gcmVmLmxlZnQ7XG5cbiAgICAgICAgcmV0dXJuIHt0b3A6IHRvcCwgbGVmdDogbGVmdH07XG4gICAgfVxuXG4gICAgdmFyIGhlaWdodCA9IGRpbWVuc2lvbignaGVpZ2h0Jyk7XG4gICAgdmFyIHdpZHRoID0gZGltZW5zaW9uKCd3aWR0aCcpO1xuXG4gICAgZnVuY3Rpb24gZGltZW5zaW9uKHByb3ApIHtcbiAgICAgICAgdmFyIHByb3BOYW1lJCQxID0gdWNmaXJzdChwcm9wKTtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChlbGVtZW50LCB2YWx1ZSkge1xuXG4gICAgICAgICAgICBlbGVtZW50ID0gdG9Ob2RlKGVsZW1lbnQpO1xuXG4gICAgICAgICAgICBpZiAoaXNVbmRlZmluZWQodmFsdWUpKSB7XG5cbiAgICAgICAgICAgICAgICBpZiAoaXNXaW5kb3coZWxlbWVudCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnRbKFwiaW5uZXJcIiArIHByb3BOYW1lJCQxKV07XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKGlzRG9jdW1lbnQoZWxlbWVudCkpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGRvYyA9IGVsZW1lbnQuZG9jdW1lbnRFbGVtZW50O1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gTWF0aC5tYXgoZG9jWyhcIm9mZnNldFwiICsgcHJvcE5hbWUkJDEpXSwgZG9jWyhcInNjcm9sbFwiICsgcHJvcE5hbWUkJDEpXSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgdmFsdWUgPSBjc3MoZWxlbWVudCwgcHJvcCk7XG4gICAgICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZSA9PT0gJ2F1dG8nID8gZWxlbWVudFsoXCJvZmZzZXRcIiArIHByb3BOYW1lJCQxKV0gOiB0b0Zsb2F0KHZhbHVlKSB8fCAwO1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlIC0gYm94TW9kZWxBZGp1c3QocHJvcCwgZWxlbWVudCk7XG5cbiAgICAgICAgICAgIH0gZWxzZSB7XG5cbiAgICAgICAgICAgICAgICBjc3MoZWxlbWVudCwgcHJvcCwgIXZhbHVlICYmIHZhbHVlICE9PSAwXG4gICAgICAgICAgICAgICAgICAgID8gJydcbiAgICAgICAgICAgICAgICAgICAgOiArdmFsdWUgKyBib3hNb2RlbEFkanVzdChwcm9wLCBlbGVtZW50KSArICdweCdcbiAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBib3hNb2RlbEFkanVzdChwcm9wLCBlbGVtZW50LCBzaXppbmcpIHtcbiAgICAgICAgaWYgKCBzaXppbmcgPT09IHZvaWQgMCApIHNpemluZyA9ICdib3JkZXItYm94JztcblxuICAgICAgICByZXR1cm4gY3NzKGVsZW1lbnQsICdib3hTaXppbmcnKSA9PT0gc2l6aW5nXG4gICAgICAgICAgICA/IGRpcnNbcHJvcF0uc2xpY2UoMSkubWFwKHVjZmlyc3QpLnJlZHVjZShmdW5jdGlvbiAodmFsdWUsIHByb3ApIHsgcmV0dXJuIHZhbHVlXG4gICAgICAgICAgICAgICAgKyB0b0Zsb2F0KGNzcyhlbGVtZW50LCAoXCJwYWRkaW5nXCIgKyBwcm9wKSkpXG4gICAgICAgICAgICAgICAgKyB0b0Zsb2F0KGNzcyhlbGVtZW50LCAoXCJib3JkZXJcIiArIHByb3AgKyBcIldpZHRoXCIpKSk7IH1cbiAgICAgICAgICAgICAgICAsIDApXG4gICAgICAgICAgICA6IDA7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbW92ZVRvKHBvc2l0aW9uLCBhdHRhY2gsIGRpbSwgZmFjdG9yKSB7XG4gICAgICAgIGVhY2goZGlycywgZnVuY3Rpb24gKHJlZiwgcHJvcCkge1xuICAgICAgICAgICAgdmFyIGRpciA9IHJlZlswXTtcbiAgICAgICAgICAgIHZhciBhbGlnbiA9IHJlZlsxXTtcbiAgICAgICAgICAgIHZhciBhbGlnbkZsaXAgPSByZWZbMl07XG5cbiAgICAgICAgICAgIGlmIChhdHRhY2hbZGlyXSA9PT0gYWxpZ25GbGlwKSB7XG4gICAgICAgICAgICAgICAgcG9zaXRpb25bYWxpZ25dICs9IGRpbVtwcm9wXSAqIGZhY3RvcjtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoYXR0YWNoW2Rpcl0gPT09ICdjZW50ZXInKSB7XG4gICAgICAgICAgICAgICAgcG9zaXRpb25bYWxpZ25dICs9IGRpbVtwcm9wXSAqIGZhY3RvciAvIDI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGdldFBvcyhwb3MpIHtcblxuICAgICAgICB2YXIgeCA9IC9sZWZ0fGNlbnRlcnxyaWdodC87XG4gICAgICAgIHZhciB5ID0gL3RvcHxjZW50ZXJ8Ym90dG9tLztcblxuICAgICAgICBwb3MgPSAocG9zIHx8ICcnKS5zcGxpdCgnICcpO1xuXG4gICAgICAgIGlmIChwb3MubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICBwb3MgPSB4LnRlc3QocG9zWzBdKVxuICAgICAgICAgICAgICAgID8gcG9zLmNvbmNhdChbJ2NlbnRlciddKVxuICAgICAgICAgICAgICAgIDogeS50ZXN0KHBvc1swXSlcbiAgICAgICAgICAgICAgICAgICAgPyBbJ2NlbnRlciddLmNvbmNhdChwb3MpXG4gICAgICAgICAgICAgICAgICAgIDogWydjZW50ZXInLCAnY2VudGVyJ107XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgeDogeC50ZXN0KHBvc1swXSkgPyBwb3NbMF0gOiAnY2VudGVyJyxcbiAgICAgICAgICAgIHk6IHkudGVzdChwb3NbMV0pID8gcG9zWzFdIDogJ2NlbnRlcidcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBnZXRPZmZzZXRzKG9mZnNldHMsIHdpZHRoLCBoZWlnaHQpIHtcblxuICAgICAgICB2YXIgcmVmID0gKG9mZnNldHMgfHwgJycpLnNwbGl0KCcgJyk7XG4gICAgICAgIHZhciB4ID0gcmVmWzBdO1xuICAgICAgICB2YXIgeSA9IHJlZlsxXTtcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgeDogeCA/IHRvRmxvYXQoeCkgKiAoZW5kc1dpdGgoeCwgJyUnKSA/IHdpZHRoIC8gMTAwIDogMSkgOiAwLFxuICAgICAgICAgICAgeTogeSA/IHRvRmxvYXQoeSkgKiAoZW5kc1dpdGgoeSwgJyUnKSA/IGhlaWdodCAvIDEwMCA6IDEpIDogMFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGZsaXBQb3NpdGlvbihwb3MpIHtcbiAgICAgICAgc3dpdGNoIChwb3MpIHtcbiAgICAgICAgICAgIGNhc2UgJ2xlZnQnOlxuICAgICAgICAgICAgICAgIHJldHVybiAncmlnaHQnO1xuICAgICAgICAgICAgY2FzZSAncmlnaHQnOlxuICAgICAgICAgICAgICAgIHJldHVybiAnbGVmdCc7XG4gICAgICAgICAgICBjYXNlICd0b3AnOlxuICAgICAgICAgICAgICAgIHJldHVybiAnYm90dG9tJztcbiAgICAgICAgICAgIGNhc2UgJ2JvdHRvbSc6XG4gICAgICAgICAgICAgICAgcmV0dXJuICd0b3AnO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICByZXR1cm4gcG9zO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNJblZpZXcoZWxlbWVudCwgdG9wT2Zmc2V0LCBsZWZ0T2Zmc2V0KSB7XG4gICAgICAgIGlmICggdG9wT2Zmc2V0ID09PSB2b2lkIDAgKSB0b3BPZmZzZXQgPSAwO1xuICAgICAgICBpZiAoIGxlZnRPZmZzZXQgPT09IHZvaWQgMCApIGxlZnRPZmZzZXQgPSAwO1xuXG5cbiAgICAgICAgaWYgKCFpc1Zpc2libGUoZWxlbWVudCkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGVsZW1lbnQgPSB0b05vZGUoZWxlbWVudCk7XG5cbiAgICAgICAgdmFyIHdpbiA9IHdpbmRvdyQxKGVsZW1lbnQpO1xuICAgICAgICB2YXIgY2xpZW50ID0gZWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgdmFyIGJvdW5kaW5nID0ge1xuICAgICAgICAgICAgdG9wOiAtdG9wT2Zmc2V0LFxuICAgICAgICAgICAgbGVmdDogLWxlZnRPZmZzZXQsXG4gICAgICAgICAgICBib3R0b206IHRvcE9mZnNldCArIGhlaWdodCh3aW4pLFxuICAgICAgICAgICAgcmlnaHQ6IGxlZnRPZmZzZXQgKyB3aWR0aCh3aW4pXG4gICAgICAgIH07XG5cbiAgICAgICAgcmV0dXJuIGludGVyc2VjdFJlY3QoY2xpZW50LCBib3VuZGluZykgfHwgcG9pbnRJblJlY3Qoe3g6IGNsaWVudC5sZWZ0LCB5OiBjbGllbnQudG9wfSwgYm91bmRpbmcpO1xuXG4gICAgfVxuXG4gICAgZnVuY3Rpb24gc2Nyb2xsZWRPdmVyKGVsZW1lbnQsIGhlaWdodE9mZnNldCkge1xuICAgICAgICBpZiAoIGhlaWdodE9mZnNldCA9PT0gdm9pZCAwICkgaGVpZ2h0T2Zmc2V0ID0gMDtcblxuXG4gICAgICAgIGlmICghaXNWaXNpYmxlKGVsZW1lbnQpKSB7XG4gICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgfVxuXG4gICAgICAgIGVsZW1lbnQgPSB0b05vZGUoZWxlbWVudCk7XG5cbiAgICAgICAgdmFyIHdpbiA9IHdpbmRvdyQxKGVsZW1lbnQpO1xuICAgICAgICB2YXIgZG9jID0gZG9jdW1lbnQkMShlbGVtZW50KTtcbiAgICAgICAgdmFyIGVsSGVpZ2h0ID0gZWxlbWVudC5vZmZzZXRIZWlnaHQgKyBoZWlnaHRPZmZzZXQ7XG4gICAgICAgIHZhciByZWYgPSBvZmZzZXRQb3NpdGlvbihlbGVtZW50KTtcbiAgICAgICAgdmFyIHRvcCA9IHJlZlswXTtcbiAgICAgICAgdmFyIHZwID0gaGVpZ2h0KHdpbik7XG4gICAgICAgIHZhciB2aCA9IHZwICsgTWF0aC5taW4oMCwgdG9wIC0gdnApO1xuICAgICAgICB2YXIgZGlmZiA9IE1hdGgubWF4KDAsIHZwIC0gKGhlaWdodChkb2MpICsgaGVpZ2h0T2Zmc2V0IC0gKHRvcCArIGVsSGVpZ2h0KSkpO1xuXG4gICAgICAgIHJldHVybiBjbGFtcCgoKHZoICsgd2luLnBhZ2VZT2Zmc2V0IC0gdG9wKSAvICgodmggKyAoZWxIZWlnaHQgLSAoZGlmZiA8IHZwID8gZGlmZiA6IDApKSkgLyAxMDApKSAvIDEwMCk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gc2Nyb2xsVG9wKGVsZW1lbnQsIHRvcCkge1xuICAgICAgICBlbGVtZW50ID0gdG9Ob2RlKGVsZW1lbnQpO1xuXG4gICAgICAgIGlmIChpc1dpbmRvdyhlbGVtZW50KSB8fCBpc0RvY3VtZW50KGVsZW1lbnQpKSB7XG4gICAgICAgICAgICB2YXIgcmVmID0gd2luZG93JDEoZWxlbWVudCk7XG4gICAgICAgICAgICB2YXIgc2Nyb2xsVG8gPSByZWYuc2Nyb2xsVG87XG4gICAgICAgICAgICB2YXIgcGFnZVhPZmZzZXQgPSByZWYucGFnZVhPZmZzZXQ7XG4gICAgICAgICAgICBzY3JvbGxUbyhwYWdlWE9mZnNldCwgdG9wKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGVsZW1lbnQuc2Nyb2xsVG9wID0gdG9wO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gb2Zmc2V0UG9zaXRpb24oZWxlbWVudCkge1xuICAgICAgICB2YXIgb2Zmc2V0ID0gWzAsIDBdO1xuXG4gICAgICAgIGRvIHtcblxuICAgICAgICAgICAgb2Zmc2V0WzBdICs9IGVsZW1lbnQub2Zmc2V0VG9wO1xuICAgICAgICAgICAgb2Zmc2V0WzFdICs9IGVsZW1lbnQub2Zmc2V0TGVmdDtcblxuICAgICAgICAgICAgaWYgKGNzcyhlbGVtZW50LCAncG9zaXRpb24nKSA9PT0gJ2ZpeGVkJykge1xuICAgICAgICAgICAgICAgIHZhciB3aW4gPSB3aW5kb3ckMShlbGVtZW50KTtcbiAgICAgICAgICAgICAgICBvZmZzZXRbMF0gKz0gd2luLnBhZ2VZT2Zmc2V0O1xuICAgICAgICAgICAgICAgIG9mZnNldFsxXSArPSB3aW4ucGFnZVhPZmZzZXQ7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG9mZnNldDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICB9IHdoaWxlICgoZWxlbWVudCA9IGVsZW1lbnQub2Zmc2V0UGFyZW50KSk7XG5cbiAgICAgICAgcmV0dXJuIG9mZnNldDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiB3aW5kb3ckMShlbGVtZW50KSB7XG4gICAgICAgIHJldHVybiBpc1dpbmRvdyhlbGVtZW50KSA/IGVsZW1lbnQgOiBkb2N1bWVudCQxKGVsZW1lbnQpLmRlZmF1bHRWaWV3O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGRvY3VtZW50JDEoZWxlbWVudCkge1xuICAgICAgICByZXR1cm4gdG9Ob2RlKGVsZW1lbnQpLm93bmVyRG9jdW1lbnQ7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZG9jRWwoZWxlbWVudCkge1xuICAgICAgICByZXR1cm4gZG9jdW1lbnQkMShlbGVtZW50KS5kb2N1bWVudEVsZW1lbnQ7XG4gICAgfVxuXG4gICAgLypcbiAgICAgICAgQmFzZWQgb246XG4gICAgICAgIENvcHlyaWdodCAoYykgMjAxNiBXaWxzb24gUGFnZSB3aWxzb25wYWdlQG1lLmNvbVxuICAgICAgICBodHRwczovL2dpdGh1Yi5jb20vd2lsc29ucGFnZS9mYXN0ZG9tXG4gICAgKi9cblxuICAgIHZhciBmYXN0ZG9tID0ge1xuXG4gICAgICAgIHJlYWRzOiBbXSxcbiAgICAgICAgd3JpdGVzOiBbXSxcblxuICAgICAgICByZWFkOiBmdW5jdGlvbih0YXNrKSB7XG4gICAgICAgICAgICB0aGlzLnJlYWRzLnB1c2godGFzayk7XG4gICAgICAgICAgICBzY2hlZHVsZUZsdXNoKCk7XG4gICAgICAgICAgICByZXR1cm4gdGFzaztcbiAgICAgICAgfSxcblxuICAgICAgICB3cml0ZTogZnVuY3Rpb24odGFzaykge1xuICAgICAgICAgICAgdGhpcy53cml0ZXMucHVzaCh0YXNrKTtcbiAgICAgICAgICAgIHNjaGVkdWxlRmx1c2goKTtcbiAgICAgICAgICAgIHJldHVybiB0YXNrO1xuICAgICAgICB9LFxuXG4gICAgICAgIGNsZWFyOiBmdW5jdGlvbih0YXNrKSB7XG4gICAgICAgICAgICByZXR1cm4gcmVtb3ZlJDEodGhpcy5yZWFkcywgdGFzaykgfHwgcmVtb3ZlJDEodGhpcy53cml0ZXMsIHRhc2spO1xuICAgICAgICB9LFxuXG4gICAgICAgIGZsdXNoOiBmdW5jdGlvbigpIHtcblxuICAgICAgICAgICAgcnVuVGFza3ModGhpcy5yZWFkcyk7XG4gICAgICAgICAgICBydW5UYXNrcyh0aGlzLndyaXRlcy5zcGxpY2UoMCwgdGhpcy53cml0ZXMubGVuZ3RoKSk7XG5cbiAgICAgICAgICAgIHRoaXMuc2NoZWR1bGVkID0gZmFsc2U7XG5cbiAgICAgICAgICAgIGlmICh0aGlzLnJlYWRzLmxlbmd0aCB8fCB0aGlzLndyaXRlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBzY2hlZHVsZUZsdXNoKCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgfVxuXG4gICAgfTtcblxuICAgIGZ1bmN0aW9uIHNjaGVkdWxlRmx1c2goKSB7XG4gICAgICAgIGlmICghZmFzdGRvbS5zY2hlZHVsZWQpIHtcbiAgICAgICAgICAgIGZhc3Rkb20uc2NoZWR1bGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZShmYXN0ZG9tLmZsdXNoLmJpbmQoZmFzdGRvbSkpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcnVuVGFza3ModGFza3MpIHtcbiAgICAgICAgdmFyIHRhc2s7XG4gICAgICAgIHdoaWxlICgodGFzayA9IHRhc2tzLnNoaWZ0KCkpKSB7XG4gICAgICAgICAgICB0YXNrKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiByZW1vdmUkMShhcnJheSwgaXRlbSkge1xuICAgICAgICB2YXIgaW5kZXggPSBhcnJheS5pbmRleE9mKGl0ZW0pO1xuICAgICAgICByZXR1cm4gISF+aW5kZXggJiYgISFhcnJheS5zcGxpY2UoaW5kZXgsIDEpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIE1vdXNlVHJhY2tlcigpIHt9XG5cbiAgICBNb3VzZVRyYWNrZXIucHJvdG90eXBlID0ge1xuXG4gICAgICAgIHBvc2l0aW9uczogW10sXG4gICAgICAgIHBvc2l0aW9uOiBudWxsLFxuXG4gICAgICAgIGluaXQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgdmFyIHRoaXMkMSA9IHRoaXM7XG5cblxuICAgICAgICAgICAgdGhpcy5wb3NpdGlvbnMgPSBbXTtcbiAgICAgICAgICAgIHRoaXMucG9zaXRpb24gPSBudWxsO1xuXG4gICAgICAgICAgICB2YXIgdGlja2luZyA9IGZhbHNlO1xuICAgICAgICAgICAgdGhpcy51bmJpbmQgPSBvbihkb2N1bWVudCwgJ21vdXNlbW92ZScsIGZ1bmN0aW9uIChlKSB7XG5cbiAgICAgICAgICAgICAgICBpZiAodGlja2luZykge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgICAgICAgICAgICAgdmFyIHRpbWUgPSBEYXRlLm5vdygpO1xuICAgICAgICAgICAgICAgICAgICB2YXIgcmVmID0gdGhpcyQxLnBvc2l0aW9ucztcbiAgICAgICAgICAgICAgICAgICAgdmFyIGxlbmd0aCA9IHJlZi5sZW5ndGg7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKGxlbmd0aCAmJiAodGltZSAtIHRoaXMkMS5wb3NpdGlvbnNbbGVuZ3RoIC0gMV0udGltZSA+IDEwMCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMkMS5wb3NpdGlvbnMuc3BsaWNlKDAsIGxlbmd0aCk7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICB0aGlzJDEucG9zaXRpb25zLnB1c2goe3RpbWU6IHRpbWUsIHg6IGUucGFnZVgsIHk6IGUucGFnZVl9KTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcyQxLnBvc2l0aW9ucy5sZW5ndGggPiA1KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzJDEucG9zaXRpb25zLnNoaWZ0KCk7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICB0aWNraW5nID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgfSwgNSk7XG5cbiAgICAgICAgICAgICAgICB0aWNraW5nID0gdHJ1ZTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgIH0sXG5cbiAgICAgICAgY2FuY2VsOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnVuYmluZCkge1xuICAgICAgICAgICAgICAgIHRoaXMudW5iaW5kKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG5cbiAgICAgICAgbW92ZXNUbzogZnVuY3Rpb24odGFyZ2V0KSB7XG5cbiAgICAgICAgICAgIGlmICh0aGlzLnBvc2l0aW9ucy5sZW5ndGggPCAyKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB2YXIgcCA9IG9mZnNldCh0YXJnZXQpO1xuICAgICAgICAgICAgdmFyIHBvc2l0aW9uJCQxID0gdGhpcy5wb3NpdGlvbnNbdGhpcy5wb3NpdGlvbnMubGVuZ3RoIC0gMV07XG4gICAgICAgICAgICB2YXIgcmVmID0gdGhpcy5wb3NpdGlvbnM7XG4gICAgICAgICAgICB2YXIgcHJldlBvcyA9IHJlZlswXTtcblxuICAgICAgICAgICAgaWYgKHAubGVmdCA8PSBwb3NpdGlvbiQkMS54ICYmIHBvc2l0aW9uJCQxLnggPD0gcC5yaWdodCAmJiBwLnRvcCA8PSBwb3NpdGlvbiQkMS55ICYmIHBvc2l0aW9uJCQxLnkgPD0gcC5ib3R0b20pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHZhciBwb2ludHMgPSBbXG4gICAgICAgICAgICAgICAgW3t4OiBwLmxlZnQsIHk6IHAudG9wfSwge3g6IHAucmlnaHQsIHk6IHAuYm90dG9tfV0sXG4gICAgICAgICAgICAgICAgW3t4OiBwLnJpZ2h0LCB5OiBwLnRvcH0sIHt4OiBwLmxlZnQsIHk6IHAuYm90dG9tfV1cbiAgICAgICAgICAgIF07XG5cbiAgICAgICAgICAgIGlmIChwLnJpZ2h0IDw9IHBvc2l0aW9uJCQxLngpIDsgZWxzZSBpZiAocC5sZWZ0ID49IHBvc2l0aW9uJCQxLngpIHtcbiAgICAgICAgICAgICAgICBwb2ludHNbMF0ucmV2ZXJzZSgpO1xuICAgICAgICAgICAgICAgIHBvaW50c1sxXS5yZXZlcnNlKCk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHAuYm90dG9tIDw9IHBvc2l0aW9uJCQxLnkpIHtcbiAgICAgICAgICAgICAgICBwb2ludHNbMF0ucmV2ZXJzZSgpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChwLnRvcCA+PSBwb3NpdGlvbiQkMS55KSB7XG4gICAgICAgICAgICAgICAgcG9pbnRzWzFdLnJldmVyc2UoKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuICEhcG9pbnRzLnJlZHVjZShmdW5jdGlvbiAocmVzdWx0LCBwb2ludCkge1xuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQgKyAoc2xvcGUocHJldlBvcywgcG9pbnRbMF0pIDwgc2xvcGUocG9zaXRpb24kJDEsIHBvaW50WzBdKSAmJiBzbG9wZShwcmV2UG9zLCBwb2ludFsxXSkgPiBzbG9wZShwb3NpdGlvbiQkMSwgcG9pbnRbMV0pKTtcbiAgICAgICAgICAgIH0sIDApO1xuICAgICAgICB9XG5cbiAgICB9O1xuXG4gICAgZnVuY3Rpb24gc2xvcGUoYSwgYikge1xuICAgICAgICByZXR1cm4gKGIueSAtIGEueSkgLyAoYi54IC0gYS54KTtcbiAgICB9XG5cbiAgICB2YXIgc3RyYXRzID0ge307XG5cbiAgICBzdHJhdHMuZXZlbnRzID1cbiAgICBzdHJhdHMuY3JlYXRlZCA9XG4gICAgc3RyYXRzLmJlZm9yZUNvbm5lY3QgPVxuICAgIHN0cmF0cy5jb25uZWN0ZWQgPVxuICAgIHN0cmF0cy5iZWZvcmVEaXNjb25uZWN0ID1cbiAgICBzdHJhdHMuZGlzY29ubmVjdGVkID1cbiAgICBzdHJhdHMuZGVzdHJveSA9IGNvbmNhdFN0cmF0O1xuXG4gICAgLy8gYXJncyBzdHJhdGVneVxuICAgIHN0cmF0cy5hcmdzID0gZnVuY3Rpb24gKHBhcmVudFZhbCwgY2hpbGRWYWwpIHtcbiAgICAgICAgcmV0dXJuIGNvbmNhdFN0cmF0KGNoaWxkVmFsIHx8IHBhcmVudFZhbCk7XG4gICAgfTtcblxuICAgIC8vIHVwZGF0ZSBzdHJhdGVneVxuICAgIHN0cmF0cy51cGRhdGUgPSBmdW5jdGlvbiAocGFyZW50VmFsLCBjaGlsZFZhbCkge1xuICAgICAgICByZXR1cm4gc29ydEJ5KGNvbmNhdFN0cmF0KHBhcmVudFZhbCwgaXNGdW5jdGlvbihjaGlsZFZhbCkgPyB7cmVhZDogY2hpbGRWYWx9IDogY2hpbGRWYWwpLCAnb3JkZXInKTtcbiAgICB9O1xuXG4gICAgLy8gcHJvcGVydHkgc3RyYXRlZ3lcbiAgICBzdHJhdHMucHJvcHMgPSBmdW5jdGlvbiAocGFyZW50VmFsLCBjaGlsZFZhbCkge1xuXG4gICAgICAgIGlmIChpc0FycmF5KGNoaWxkVmFsKSkge1xuICAgICAgICAgICAgY2hpbGRWYWwgPSBjaGlsZFZhbC5yZWR1Y2UoZnVuY3Rpb24gKHZhbHVlLCBrZXkpIHtcbiAgICAgICAgICAgICAgICB2YWx1ZVtrZXldID0gU3RyaW5nO1xuICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgICAgIH0sIHt9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBzdHJhdHMubWV0aG9kcyhwYXJlbnRWYWwsIGNoaWxkVmFsKTtcbiAgICB9O1xuXG4gICAgLy8gZXh0ZW5kIHN0cmF0ZWd5XG4gICAgc3RyYXRzLmNvbXB1dGVkID1cbiAgICBzdHJhdHMubWV0aG9kcyA9IGZ1bmN0aW9uIChwYXJlbnRWYWwsIGNoaWxkVmFsKSB7XG4gICAgICAgIHJldHVybiBjaGlsZFZhbFxuICAgICAgICAgICAgPyBwYXJlbnRWYWxcbiAgICAgICAgICAgICAgICA/IGFzc2lnbih7fSwgcGFyZW50VmFsLCBjaGlsZFZhbClcbiAgICAgICAgICAgICAgICA6IGNoaWxkVmFsXG4gICAgICAgICAgICA6IHBhcmVudFZhbDtcbiAgICB9O1xuXG4gICAgLy8gZGF0YSBzdHJhdGVneVxuICAgIHN0cmF0cy5kYXRhID0gZnVuY3Rpb24gKHBhcmVudFZhbCwgY2hpbGRWYWwsIHZtKSB7XG5cbiAgICAgICAgaWYgKCF2bSkge1xuXG4gICAgICAgICAgICBpZiAoIWNoaWxkVmFsKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHBhcmVudFZhbDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKCFwYXJlbnRWYWwpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gY2hpbGRWYWw7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAodm0pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbWVyZ2VGbkRhdGEocGFyZW50VmFsLCBjaGlsZFZhbCwgdm0pO1xuICAgICAgICAgICAgfTtcblxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG1lcmdlRm5EYXRhKHBhcmVudFZhbCwgY2hpbGRWYWwsIHZtKTtcbiAgICB9O1xuXG4gICAgZnVuY3Rpb24gbWVyZ2VGbkRhdGEocGFyZW50VmFsLCBjaGlsZFZhbCwgdm0pIHtcbiAgICAgICAgcmV0dXJuIHN0cmF0cy5jb21wdXRlZChcbiAgICAgICAgICAgIGlzRnVuY3Rpb24ocGFyZW50VmFsKVxuICAgICAgICAgICAgICAgID8gcGFyZW50VmFsLmNhbGwodm0sIHZtKVxuICAgICAgICAgICAgICAgIDogcGFyZW50VmFsLFxuICAgICAgICAgICAgaXNGdW5jdGlvbihjaGlsZFZhbClcbiAgICAgICAgICAgICAgICA/IGNoaWxkVmFsLmNhbGwodm0sIHZtKVxuICAgICAgICAgICAgICAgIDogY2hpbGRWYWxcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBjb25jYXQgc3RyYXRlZ3lcbiAgICBmdW5jdGlvbiBjb25jYXRTdHJhdChwYXJlbnRWYWwsIGNoaWxkVmFsKSB7XG5cbiAgICAgICAgcGFyZW50VmFsID0gcGFyZW50VmFsICYmICFpc0FycmF5KHBhcmVudFZhbCkgPyBbcGFyZW50VmFsXSA6IHBhcmVudFZhbDtcblxuICAgICAgICByZXR1cm4gY2hpbGRWYWxcbiAgICAgICAgICAgID8gcGFyZW50VmFsXG4gICAgICAgICAgICAgICAgPyBwYXJlbnRWYWwuY29uY2F0KGNoaWxkVmFsKVxuICAgICAgICAgICAgICAgIDogaXNBcnJheShjaGlsZFZhbClcbiAgICAgICAgICAgICAgICAgICAgPyBjaGlsZFZhbFxuICAgICAgICAgICAgICAgICAgICA6IFtjaGlsZFZhbF1cbiAgICAgICAgICAgIDogcGFyZW50VmFsO1xuICAgIH1cblxuICAgIC8vIGRlZmF1bHQgc3RyYXRlZ3lcbiAgICBmdW5jdGlvbiBkZWZhdWx0U3RyYXQocGFyZW50VmFsLCBjaGlsZFZhbCkge1xuICAgICAgICByZXR1cm4gaXNVbmRlZmluZWQoY2hpbGRWYWwpID8gcGFyZW50VmFsIDogY2hpbGRWYWw7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbWVyZ2VPcHRpb25zKHBhcmVudCwgY2hpbGQsIHZtKSB7XG5cbiAgICAgICAgdmFyIG9wdGlvbnMgPSB7fTtcblxuICAgICAgICBpZiAoaXNGdW5jdGlvbihjaGlsZCkpIHtcbiAgICAgICAgICAgIGNoaWxkID0gY2hpbGQub3B0aW9ucztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjaGlsZC5leHRlbmRzKSB7XG4gICAgICAgICAgICBwYXJlbnQgPSBtZXJnZU9wdGlvbnMocGFyZW50LCBjaGlsZC5leHRlbmRzLCB2bSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY2hpbGQubWl4aW5zKSB7XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMCwgbCA9IGNoaWxkLm1peGlucy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgICAgICAgICAgICBwYXJlbnQgPSBtZXJnZU9wdGlvbnMocGFyZW50LCBjaGlsZC5taXhpbnNbaV0sIHZtKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAodmFyIGtleSBpbiBwYXJlbnQpIHtcbiAgICAgICAgICAgIG1lcmdlS2V5KGtleSk7XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKHZhciBrZXkkMSBpbiBjaGlsZCkge1xuICAgICAgICAgICAgaWYgKCFoYXNPd24ocGFyZW50LCBrZXkkMSkpIHtcbiAgICAgICAgICAgICAgICBtZXJnZUtleShrZXkkMSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBmdW5jdGlvbiBtZXJnZUtleShrZXkpIHtcbiAgICAgICAgICAgIG9wdGlvbnNba2V5XSA9IChzdHJhdHNba2V5XSB8fCBkZWZhdWx0U3RyYXQpKHBhcmVudFtrZXldLCBjaGlsZFtrZXldLCB2bSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gb3B0aW9ucztcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBwYXJzZU9wdGlvbnMob3B0aW9ucywgYXJncykge1xuICAgICAgICB2YXIgb2JqO1xuXG4gICAgICAgIGlmICggYXJncyA9PT0gdm9pZCAwICkgYXJncyA9IFtdO1xuXG4gICAgICAgIHRyeSB7XG5cbiAgICAgICAgICAgIHJldHVybiAhb3B0aW9uc1xuICAgICAgICAgICAgICAgID8ge31cbiAgICAgICAgICAgICAgICA6IHN0YXJ0c1dpdGgob3B0aW9ucywgJ3snKVxuICAgICAgICAgICAgICAgICAgICA/IEpTT04ucGFyc2Uob3B0aW9ucylcbiAgICAgICAgICAgICAgICAgICAgOiBhcmdzLmxlbmd0aCAmJiAhaW5jbHVkZXMob3B0aW9ucywgJzonKVxuICAgICAgICAgICAgICAgICAgICAgICAgPyAoKCBvYmogPSB7fSwgb2JqW2FyZ3NbMF1dID0gb3B0aW9ucywgb2JqICkpXG4gICAgICAgICAgICAgICAgICAgICAgICA6IG9wdGlvbnMuc3BsaXQoJzsnKS5yZWR1Y2UoZnVuY3Rpb24gKG9wdGlvbnMsIG9wdGlvbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByZWYgPSBvcHRpb24uc3BsaXQoLzooLiopLyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGtleSA9IHJlZlswXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdmFsdWUgPSByZWZbMV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGtleSAmJiAhaXNVbmRlZmluZWQodmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnNba2V5LnRyaW0oKV0gPSB2YWx1ZS50cmltKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBvcHRpb25zO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSwge30pO1xuXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHJldHVybiB7fTtcbiAgICAgICAgfVxuXG4gICAgfVxuXG4gICAgdmFyIGlkID0gMDtcblxuICAgIHZhciBQbGF5ZXIgPSBmdW5jdGlvbihlbCkge1xuICAgICAgICB0aGlzLmlkID0gKytpZDtcbiAgICAgICAgdGhpcy5lbCA9IHRvTm9kZShlbCk7XG4gICAgfTtcblxuICAgIFBsYXllci5wcm90b3R5cGUuaXNWaWRlbyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaXNZb3V0dWJlKCkgfHwgdGhpcy5pc1ZpbWVvKCkgfHwgdGhpcy5pc0hUTUw1KCk7XG4gICAgfTtcblxuICAgIFBsYXllci5wcm90b3R5cGUuaXNIVE1MNSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZWwudGFnTmFtZSA9PT0gJ1ZJREVPJztcbiAgICB9O1xuXG4gICAgUGxheWVyLnByb3RvdHlwZS5pc0lGcmFtZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZWwudGFnTmFtZSA9PT0gJ0lGUkFNRSc7XG4gICAgfTtcblxuICAgIFBsYXllci5wcm90b3R5cGUuaXNZb3V0dWJlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5pc0lGcmFtZSgpICYmICEhdGhpcy5lbC5zcmMubWF0Y2goL1xcL1xcLy4qP3lvdXR1YmUoLW5vY29va2llKT9cXC5bYS16XStcXC8od2F0Y2hcXD92PVteJlxcc10rfGVtYmVkKXx5b3V0dVxcLmJlXFwvLiovKTtcbiAgICB9O1xuXG4gICAgUGxheWVyLnByb3RvdHlwZS5pc1ZpbWVvID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5pc0lGcmFtZSgpICYmICEhdGhpcy5lbC5zcmMubWF0Y2goL3ZpbWVvXFwuY29tXFwvdmlkZW9cXC8uKi8pO1xuICAgIH07XG5cbiAgICBQbGF5ZXIucHJvdG90eXBlLmVuYWJsZUFwaSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciB0aGlzJDEgPSB0aGlzO1xuXG5cbiAgICAgICAgaWYgKHRoaXMucmVhZHkpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnJlYWR5O1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHlvdXR1YmUgPSB0aGlzLmlzWW91dHViZSgpO1xuICAgICAgICB2YXIgdmltZW8gPSB0aGlzLmlzVmltZW8oKTtcblxuICAgICAgICB2YXIgcG9sbGVyO1xuXG4gICAgICAgIGlmICh5b3V0dWJlIHx8IHZpbWVvKSB7XG5cbiAgICAgICAgICAgIHJldHVybiB0aGlzLnJlYWR5ID0gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUpIHtcblxuICAgICAgICAgICAgICAgIG9uY2UodGhpcyQxLmVsLCAnbG9hZCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHlvdXR1YmUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBsaXN0ZW5lciA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHBvc3QodGhpcyQxLmVsLCB7ZXZlbnQ6ICdsaXN0ZW5pbmcnLCBpZDogdGhpcyQxLmlkfSk7IH07XG4gICAgICAgICAgICAgICAgICAgICAgICBwb2xsZXIgPSBzZXRJbnRlcnZhbChsaXN0ZW5lciwgMTAwKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RlbmVyKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgIGxpc3RlbihmdW5jdGlvbiAoZGF0YSQkMSkgeyByZXR1cm4geW91dHViZSAmJiBkYXRhJCQxLmlkID09PSB0aGlzJDEuaWQgJiYgZGF0YSQkMS5ldmVudCA9PT0gJ29uUmVhZHknIHx8IHZpbWVvICYmIE51bWJlcihkYXRhJCQxLnBsYXllcl9pZCkgPT09IHRoaXMkMS5pZDsgfSlcbiAgICAgICAgICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcG9sbGVyICYmIGNsZWFySW50ZXJ2YWwocG9sbGVyKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICBhdHRyKHRoaXMkMS5lbCwgJ3NyYycsIChcIlwiICsgKHRoaXMkMS5lbC5zcmMpICsgKGluY2x1ZGVzKHRoaXMkMS5lbC5zcmMsICc/JykgPyAnJicgOiAnPycpICsgKHlvdXR1YmUgPyAnZW5hYmxlanNhcGk9MScgOiAoXCJhcGk9MSZwbGF5ZXJfaWQ9XCIgKyAodGhpcyQxLmlkKSkpKSk7XG5cbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG5cbiAgICB9O1xuXG4gICAgUGxheWVyLnByb3RvdHlwZS5wbGF5ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIHRoaXMkMSA9IHRoaXM7XG5cblxuICAgICAgICBpZiAoIXRoaXMuaXNWaWRlbygpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5pc0lGcmFtZSgpKSB7XG4gICAgICAgICAgICB0aGlzLmVuYWJsZUFwaSgpLnRoZW4oZnVuY3Rpb24gKCkgeyByZXR1cm4gcG9zdCh0aGlzJDEuZWwsIHtmdW5jOiAncGxheVZpZGVvJywgbWV0aG9kOiAncGxheSd9KTsgfSk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5pc0hUTUw1KCkpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgdmFyIHByb21pc2UgPSB0aGlzLmVsLnBsYXkoKTtcblxuICAgICAgICAgICAgICAgIGlmIChwcm9taXNlKSB7XG4gICAgICAgICAgICAgICAgICAgIHByb21pc2UuY2F0Y2gobm9vcCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBjYXRjaCAoZSkge31cbiAgICAgICAgfVxuICAgIH07XG5cbiAgICBQbGF5ZXIucHJvdG90eXBlLnBhdXNlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIHRoaXMkMSA9IHRoaXM7XG5cblxuICAgICAgICBpZiAoIXRoaXMuaXNWaWRlbygpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5pc0lGcmFtZSgpKSB7XG4gICAgICAgICAgICB0aGlzLmVuYWJsZUFwaSgpLnRoZW4oZnVuY3Rpb24gKCkgeyByZXR1cm4gcG9zdCh0aGlzJDEuZWwsIHtmdW5jOiAncGF1c2VWaWRlbycsIG1ldGhvZDogJ3BhdXNlJ30pOyB9KTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmlzSFRNTDUoKSkge1xuICAgICAgICAgICAgdGhpcy5lbC5wYXVzZSgpO1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIFBsYXllci5wcm90b3R5cGUubXV0ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciB0aGlzJDEgPSB0aGlzO1xuXG5cbiAgICAgICAgaWYgKCF0aGlzLmlzVmlkZW8oKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuaXNJRnJhbWUoKSkge1xuICAgICAgICAgICAgdGhpcy5lbmFibGVBcGkoKS50aGVuKGZ1bmN0aW9uICgpIHsgcmV0dXJuIHBvc3QodGhpcyQxLmVsLCB7ZnVuYzogJ211dGUnLCBtZXRob2Q6ICdzZXRWb2x1bWUnLCB2YWx1ZTogMH0pOyB9KTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmlzSFRNTDUoKSkge1xuICAgICAgICAgICAgdGhpcy5lbC5tdXRlZCA9IHRydWU7XG4gICAgICAgICAgICBhdHRyKHRoaXMuZWwsICdtdXRlZCcsICcnKTtcbiAgICAgICAgfVxuXG4gICAgfTtcblxuICAgIGZ1bmN0aW9uIHBvc3QoZWwsIGNtZCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgZWwuY29udGVudFdpbmRvdy5wb3N0TWVzc2FnZShKU09OLnN0cmluZ2lmeShhc3NpZ24oe2V2ZW50OiAnY29tbWFuZCd9LCBjbWQpKSwgJyonKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge31cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBsaXN0ZW4oY2IpIHtcblxuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUpIHtcblxuICAgICAgICAgICAgb25jZSh3aW5kb3csICdtZXNzYWdlJywgZnVuY3Rpb24gKF8sIGRhdGEkJDEpIHsgcmV0dXJuIHJlc29sdmUoZGF0YSQkMSk7IH0sIGZhbHNlLCBmdW5jdGlvbiAocmVmKSB7XG4gICAgICAgICAgICAgICAgdmFyIGRhdGEkJDEgPSByZWYuZGF0YTtcblxuXG4gICAgICAgICAgICAgICAgaWYgKCFkYXRhJCQxIHx8ICFpc1N0cmluZyhkYXRhJCQxKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgZGF0YSQkMSA9IEpTT04ucGFyc2UoZGF0YSQkMSk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcmV0dXJuIGRhdGEkJDEgJiYgY2IoZGF0YSQkMSk7XG5cbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgIH0pO1xuXG4gICAgfVxuXG4gICAgdmFyIEludGVyc2VjdGlvbk9ic2VydmVyID0gJ0ludGVyc2VjdGlvbk9ic2VydmVyJyBpbiB3aW5kb3dcbiAgICAgICAgPyB3aW5kb3cuSW50ZXJzZWN0aW9uT2JzZXJ2ZXJcbiAgICAgICAgOiAvKkBfX1BVUkVfXyovKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgZnVuY3Rpb24gSW50ZXJzZWN0aW9uT2JzZXJ2ZXJDbGFzcyhjYWxsYmFjaywgcmVmKSB7XG4gICAgICAgICAgICB2YXIgdGhpcyQxID0gdGhpcztcbiAgICAgICAgICAgIGlmICggcmVmID09PSB2b2lkIDAgKSByZWYgPSB7fTtcbiAgICAgICAgICAgIHZhciByb290TWFyZ2luID0gcmVmLnJvb3RNYXJnaW47IGlmICggcm9vdE1hcmdpbiA9PT0gdm9pZCAwICkgcm9vdE1hcmdpbiA9ICcwIDAnO1xuXG5cbiAgICAgICAgICAgICAgICB0aGlzLnRhcmdldHMgPSBbXTtcblxuICAgICAgICAgICAgICAgIHZhciByZWYkMSA9IChyb290TWFyZ2luIHx8ICcwIDAnKS5zcGxpdCgnICcpLm1hcCh0b0Zsb2F0KTtcbiAgICAgICAgICAgIHZhciBvZmZzZXRUb3AgPSByZWYkMVswXTtcbiAgICAgICAgICAgIHZhciBvZmZzZXRMZWZ0ID0gcmVmJDFbMV07XG5cbiAgICAgICAgICAgICAgICB0aGlzLm9mZnNldFRvcCA9IG9mZnNldFRvcDtcbiAgICAgICAgICAgICAgICB0aGlzLm9mZnNldExlZnQgPSBvZmZzZXRMZWZ0O1xuXG4gICAgICAgICAgICAgICAgdmFyIHBlbmRpbmc7XG4gICAgICAgICAgICAgICAgdGhpcy5hcHBseSA9IGZ1bmN0aW9uICgpIHtcblxuICAgICAgICAgICAgICAgICAgICBpZiAocGVuZGluZykge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgcGVuZGluZyA9IHJlcXVlc3RBbmltYXRpb25GcmFtZShmdW5jdGlvbiAoKSB7IHJldHVybiBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciByZWNvcmRzID0gdGhpcyQxLnRha2VSZWNvcmRzKCk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZWNvcmRzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKHJlY29yZHMsIHRoaXMkMSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHBlbmRpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgfSk7IH0pO1xuXG4gICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgIHRoaXMub2ZmID0gb24od2luZG93LCAnc2Nyb2xsIHJlc2l6ZSBsb2FkJywgdGhpcy5hcHBseSwge3Bhc3NpdmU6IHRydWUsIGNhcHR1cmU6IHRydWV9KTtcblxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBJbnRlcnNlY3Rpb25PYnNlcnZlckNsYXNzLnByb3RvdHlwZS50YWtlUmVjb3JkcyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICB2YXIgdGhpcyQxID0gdGhpcztcblxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnRhcmdldHMuZmlsdGVyKGZ1bmN0aW9uIChlbnRyeSkge1xuXG4gICAgICAgICAgICAgICAgICAgIHZhciBpblZpZXcgPSBpc0luVmlldyhlbnRyeS50YXJnZXQsIHRoaXMkMS5vZmZzZXRUb3AsIHRoaXMkMS5vZmZzZXRMZWZ0KTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoZW50cnkuaXNJbnRlcnNlY3RpbmcgPT09IG51bGwgfHwgaW5WaWV3IF4gZW50cnkuaXNJbnRlcnNlY3RpbmcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5LmlzSW50ZXJzZWN0aW5nID0gaW5WaWV3O1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgSW50ZXJzZWN0aW9uT2JzZXJ2ZXJDbGFzcy5wcm90b3R5cGUub2JzZXJ2ZSA9IGZ1bmN0aW9uICh0YXJnZXQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnRhcmdldHMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgIHRhcmdldDogdGFyZ2V0LFxuICAgICAgICAgICAgICAgICAgICBpc0ludGVyc2VjdGluZzogbnVsbFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHRoaXMuYXBwbHkoKTtcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIEludGVyc2VjdGlvbk9ic2VydmVyQ2xhc3MucHJvdG90eXBlLmRpc2Nvbm5lY3QgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgdGhpcy50YXJnZXRzID0gW107XG4gICAgICAgICAgICAgICAgdGhpcy5vZmYoKTtcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgcmV0dXJuIEludGVyc2VjdGlvbk9ic2VydmVyQ2xhc3M7XG4gICAgfSgpKTtcblxuICAgIHZhciB0b3VjaCA9IHt9LCBzd2lwZVRpbWVvdXQsIHRvdWNoaW5nO1xuXG4gICAgb24oZG9jdW1lbnQsIHBvaW50ZXJEb3duLCBmdW5jdGlvbiAoZSkge1xuXG4gICAgICAgIGlmICh0b3VjaC5lbCkge1xuICAgICAgICAgICAgdG91Y2ggPSB7fTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciB0YXJnZXQgPSBlLnRhcmdldDtcbiAgICAgICAgdmFyIHJlZiA9IGdldFBvcyQxKGUpO1xuICAgICAgICB2YXIgeCA9IHJlZi54O1xuICAgICAgICB2YXIgeSA9IHJlZi55O1xuXG4gICAgICAgIHRvdWNoLmVsID0gJ3RhZ05hbWUnIGluIHRhcmdldCA/IHRhcmdldCA6IHRhcmdldC5wYXJlbnROb2RlO1xuICAgICAgICB0b3VjaC54ID0geDtcbiAgICAgICAgdG91Y2gueSA9IHk7XG5cbiAgICAgICAgdG91Y2hpbmcgPSBpc1RvdWNoKGUpO1xuXG4gICAgfSk7XG5cbiAgICBvbihkb2N1bWVudCwgcG9pbnRlclVwLCBmdW5jdGlvbiAoZSkge1xuXG4gICAgICAgIHZhciByZWYgPSBnZXRQb3MkMShlKTtcbiAgICAgICAgdmFyIHggPSByZWYueDtcbiAgICAgICAgdmFyIHkgPSByZWYueTtcblxuICAgICAgICAvLyBzd2lwZVxuICAgICAgICBpZiAodG91Y2guZWwgJiYgeCAmJiBNYXRoLmFicyh0b3VjaC54IC0geCkgPiAxMDAgfHwgeSAmJiBNYXRoLmFicyh0b3VjaC55IC0geSkgPiAxMDApIHtcblxuICAgICAgICAgICAgc3dpcGVUaW1lb3V0ID0gc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRvdWNoLmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIHRyaWdnZXIodG91Y2guZWwsICdzd2lwZScpO1xuICAgICAgICAgICAgICAgICAgICB0cmlnZ2VyKHRvdWNoLmVsLCAoXCJzd2lwZVwiICsgKHN3aXBlRGlyZWN0aW9uKHRvdWNoLngsIHRvdWNoLnksIHgsIHkpKSkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0b3VjaCA9IHt9O1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRvdWNoID0ge307XG4gICAgICAgIH1cblxuICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRvdWNoaW5nID0gZmFsc2U7IH0pO1xuXG4gICAgfSk7XG5cbiAgICBvbihkb2N1bWVudCwgcG9pbnRlckNhbmNlbCwgY2FuY2VsQWxsKTtcblxuICAgIGZ1bmN0aW9uIGlzVG91Y2goZSkge1xuICAgICAgICByZXR1cm4gZS5wb2ludGVyVHlwZSA9PT0gJ3RvdWNoJyB8fCBlLnRvdWNoZXMgfHwgdG91Y2hpbmc7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2V0UG9zJDEoZSwgcHJvcCkge1xuICAgICAgICBpZiAoIHByb3AgPT09IHZvaWQgMCApIHByb3AgPSAnY2xpZW50JztcblxuICAgICAgICB2YXIgdG91Y2hlcyA9IGUudG91Y2hlcztcbiAgICAgICAgdmFyIGNoYW5nZWRUb3VjaGVzID0gZS5jaGFuZ2VkVG91Y2hlcztcbiAgICAgICAgdmFyIHJlZiA9IHRvdWNoZXMgJiYgdG91Y2hlc1swXSB8fCBjaGFuZ2VkVG91Y2hlcyAmJiBjaGFuZ2VkVG91Y2hlc1swXSB8fCBlO1xuICAgICAgICB2YXIgeCA9IHJlZlsocHJvcCArIFwiWFwiKV07XG4gICAgICAgIHZhciB5ID0gcmVmWyhwcm9wICsgXCJZXCIpXTtcblxuICAgICAgICByZXR1cm4ge3g6IHgsIHk6IHl9O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHN3aXBlRGlyZWN0aW9uKHgxLCB5MSwgeDIsIHkyKSB7XG4gICAgICAgIHJldHVybiBNYXRoLmFicyh4MSAtIHgyKSA+PSBNYXRoLmFicyh5MSAtIHkyKVxuICAgICAgICAgICAgPyB4MSAtIHgyID4gMFxuICAgICAgICAgICAgICAgID8gJ0xlZnQnXG4gICAgICAgICAgICAgICAgOiAnUmlnaHQnXG4gICAgICAgICAgICA6IHkxIC0geTIgPiAwXG4gICAgICAgICAgICAgICAgPyAnVXAnXG4gICAgICAgICAgICAgICAgOiAnRG93bic7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gY2FuY2VsQWxsKCkge1xuICAgICAgICBzd2lwZVRpbWVvdXQgJiYgY2xlYXJUaW1lb3V0KHN3aXBlVGltZW91dCk7XG4gICAgICAgIHN3aXBlVGltZW91dCA9IG51bGw7XG4gICAgICAgIHRvdWNoID0ge307XG4gICAgfVxuXG5cblxuICAgIHZhciB1dGlsID0gLyojX19QVVJFX18qL09iamVjdC5mcmVlemUoe1xuICAgICAgICBhamF4OiBhamF4LFxuICAgICAgICBnZXRJbWFnZTogZ2V0SW1hZ2UsXG4gICAgICAgIHRyYW5zaXRpb246IHRyYW5zaXRpb24sXG4gICAgICAgIFRyYW5zaXRpb246IFRyYW5zaXRpb24sXG4gICAgICAgIGFuaW1hdGU6IGFuaW1hdGUsXG4gICAgICAgIEFuaW1hdGlvbjogQW5pbWF0aW9uLFxuICAgICAgICBhdHRyOiBhdHRyLFxuICAgICAgICBoYXNBdHRyOiBoYXNBdHRyLFxuICAgICAgICByZW1vdmVBdHRyOiByZW1vdmVBdHRyLFxuICAgICAgICBkYXRhOiBkYXRhLFxuICAgICAgICBhZGRDbGFzczogYWRkQ2xhc3MsXG4gICAgICAgIHJlbW92ZUNsYXNzOiByZW1vdmVDbGFzcyxcbiAgICAgICAgcmVtb3ZlQ2xhc3NlczogcmVtb3ZlQ2xhc3NlcyxcbiAgICAgICAgcmVwbGFjZUNsYXNzOiByZXBsYWNlQ2xhc3MsXG4gICAgICAgIGhhc0NsYXNzOiBoYXNDbGFzcyxcbiAgICAgICAgdG9nZ2xlQ2xhc3M6IHRvZ2dsZUNsYXNzLFxuICAgICAgICBwb3NpdGlvbkF0OiBwb3NpdGlvbkF0LFxuICAgICAgICBvZmZzZXQ6IG9mZnNldCxcbiAgICAgICAgcG9zaXRpb246IHBvc2l0aW9uLFxuICAgICAgICBoZWlnaHQ6IGhlaWdodCxcbiAgICAgICAgd2lkdGg6IHdpZHRoLFxuICAgICAgICBib3hNb2RlbEFkanVzdDogYm94TW9kZWxBZGp1c3QsXG4gICAgICAgIGZsaXBQb3NpdGlvbjogZmxpcFBvc2l0aW9uLFxuICAgICAgICBpc0luVmlldzogaXNJblZpZXcsXG4gICAgICAgIHNjcm9sbGVkT3Zlcjogc2Nyb2xsZWRPdmVyLFxuICAgICAgICBzY3JvbGxUb3A6IHNjcm9sbFRvcCxcbiAgICAgICAgb2Zmc2V0UG9zaXRpb246IG9mZnNldFBvc2l0aW9uLFxuICAgICAgICByZWFkeTogcmVhZHksXG4gICAgICAgIGluZGV4OiBpbmRleCxcbiAgICAgICAgZ2V0SW5kZXg6IGdldEluZGV4LFxuICAgICAgICBlbXB0eTogZW1wdHksXG4gICAgICAgIGh0bWw6IGh0bWwsXG4gICAgICAgIHByZXBlbmQ6IHByZXBlbmQsXG4gICAgICAgIGFwcGVuZDogYXBwZW5kLFxuICAgICAgICBiZWZvcmU6IGJlZm9yZSxcbiAgICAgICAgYWZ0ZXI6IGFmdGVyLFxuICAgICAgICByZW1vdmU6IHJlbW92ZSxcbiAgICAgICAgd3JhcEFsbDogd3JhcEFsbCxcbiAgICAgICAgd3JhcElubmVyOiB3cmFwSW5uZXIsXG4gICAgICAgIHVud3JhcDogdW53cmFwLFxuICAgICAgICBmcmFnbWVudDogZnJhZ21lbnQsXG4gICAgICAgIGFwcGx5OiBhcHBseSxcbiAgICAgICAgJDogJCxcbiAgICAgICAgJCQ6ICQkLFxuICAgICAgICBpc0lFOiBpc0lFLFxuICAgICAgICBpc1J0bDogaXNSdGwsXG4gICAgICAgIGhhc1RvdWNoOiBoYXNUb3VjaCxcbiAgICAgICAgcG9pbnRlckRvd246IHBvaW50ZXJEb3duLFxuICAgICAgICBwb2ludGVyTW92ZTogcG9pbnRlck1vdmUsXG4gICAgICAgIHBvaW50ZXJVcDogcG9pbnRlclVwLFxuICAgICAgICBwb2ludGVyRW50ZXI6IHBvaW50ZXJFbnRlcixcbiAgICAgICAgcG9pbnRlckxlYXZlOiBwb2ludGVyTGVhdmUsXG4gICAgICAgIHBvaW50ZXJDYW5jZWw6IHBvaW50ZXJDYW5jZWwsXG4gICAgICAgIG9uOiBvbixcbiAgICAgICAgb2ZmOiBvZmYsXG4gICAgICAgIG9uY2U6IG9uY2UsXG4gICAgICAgIHRyaWdnZXI6IHRyaWdnZXIsXG4gICAgICAgIGNyZWF0ZUV2ZW50OiBjcmVhdGVFdmVudCxcbiAgICAgICAgdG9FdmVudFRhcmdldHM6IHRvRXZlbnRUYXJnZXRzLFxuICAgICAgICBwcmV2ZW50Q2xpY2s6IHByZXZlbnRDbGljayxcbiAgICAgICAgZmFzdGRvbTogZmFzdGRvbSxcbiAgICAgICAgaXNWb2lkRWxlbWVudDogaXNWb2lkRWxlbWVudCxcbiAgICAgICAgaXNWaXNpYmxlOiBpc1Zpc2libGUsXG4gICAgICAgIHNlbElucHV0OiBzZWxJbnB1dCxcbiAgICAgICAgaXNJbnB1dDogaXNJbnB1dCxcbiAgICAgICAgZmlsdGVyOiBmaWx0ZXIsXG4gICAgICAgIHdpdGhpbjogd2l0aGluLFxuICAgICAgICBiaW5kOiBiaW5kLFxuICAgICAgICBoYXNPd246IGhhc093bixcbiAgICAgICAgaHlwaGVuYXRlOiBoeXBoZW5hdGUsXG4gICAgICAgIGNhbWVsaXplOiBjYW1lbGl6ZSxcbiAgICAgICAgdWNmaXJzdDogdWNmaXJzdCxcbiAgICAgICAgc3RhcnRzV2l0aDogc3RhcnRzV2l0aCxcbiAgICAgICAgZW5kc1dpdGg6IGVuZHNXaXRoLFxuICAgICAgICBpbmNsdWRlczogaW5jbHVkZXMsXG4gICAgICAgIGlzQXJyYXk6IGlzQXJyYXksXG4gICAgICAgIGlzRnVuY3Rpb246IGlzRnVuY3Rpb24sXG4gICAgICAgIGlzT2JqZWN0OiBpc09iamVjdCxcbiAgICAgICAgaXNQbGFpbk9iamVjdDogaXNQbGFpbk9iamVjdCxcbiAgICAgICAgaXNXaW5kb3c6IGlzV2luZG93LFxuICAgICAgICBpc0RvY3VtZW50OiBpc0RvY3VtZW50LFxuICAgICAgICBpc0pRdWVyeTogaXNKUXVlcnksXG4gICAgICAgIGlzTm9kZTogaXNOb2RlLFxuICAgICAgICBpc05vZGVDb2xsZWN0aW9uOiBpc05vZGVDb2xsZWN0aW9uLFxuICAgICAgICBpc0Jvb2xlYW46IGlzQm9vbGVhbixcbiAgICAgICAgaXNTdHJpbmc6IGlzU3RyaW5nLFxuICAgICAgICBpc051bWJlcjogaXNOdW1iZXIsXG4gICAgICAgIGlzTnVtZXJpYzogaXNOdW1lcmljLFxuICAgICAgICBpc1VuZGVmaW5lZDogaXNVbmRlZmluZWQsXG4gICAgICAgIHRvQm9vbGVhbjogdG9Cb29sZWFuLFxuICAgICAgICB0b051bWJlcjogdG9OdW1iZXIsXG4gICAgICAgIHRvRmxvYXQ6IHRvRmxvYXQsXG4gICAgICAgIHRvTm9kZTogdG9Ob2RlLFxuICAgICAgICB0b05vZGVzOiB0b05vZGVzLFxuICAgICAgICB0b0xpc3Q6IHRvTGlzdCxcbiAgICAgICAgdG9NczogdG9NcyxcbiAgICAgICAgaXNFcXVhbDogaXNFcXVhbCxcbiAgICAgICAgc3dhcDogc3dhcCxcbiAgICAgICAgYXNzaWduOiBhc3NpZ24sXG4gICAgICAgIGVhY2g6IGVhY2gsXG4gICAgICAgIHNvcnRCeTogc29ydEJ5LFxuICAgICAgICBjbGFtcDogY2xhbXAsXG4gICAgICAgIG5vb3A6IG5vb3AsXG4gICAgICAgIGludGVyc2VjdFJlY3Q6IGludGVyc2VjdFJlY3QsXG4gICAgICAgIHBvaW50SW5SZWN0OiBwb2ludEluUmVjdCxcbiAgICAgICAgRGltZW5zaW9uczogRGltZW5zaW9ucyxcbiAgICAgICAgTW91c2VUcmFja2VyOiBNb3VzZVRyYWNrZXIsXG4gICAgICAgIG1lcmdlT3B0aW9uczogbWVyZ2VPcHRpb25zLFxuICAgICAgICBwYXJzZU9wdGlvbnM6IHBhcnNlT3B0aW9ucyxcbiAgICAgICAgUGxheWVyOiBQbGF5ZXIsXG4gICAgICAgIFByb21pc2U6IFByb21pc2UsXG4gICAgICAgIERlZmVycmVkOiBEZWZlcnJlZCxcbiAgICAgICAgSW50ZXJzZWN0aW9uT2JzZXJ2ZXI6IEludGVyc2VjdGlvbk9ic2VydmVyLFxuICAgICAgICBxdWVyeTogcXVlcnksXG4gICAgICAgIHF1ZXJ5QWxsOiBxdWVyeUFsbCxcbiAgICAgICAgZmluZDogZmluZCxcbiAgICAgICAgZmluZEFsbDogZmluZEFsbCxcbiAgICAgICAgbWF0Y2hlczogbWF0Y2hlcyxcbiAgICAgICAgY2xvc2VzdDogY2xvc2VzdCxcbiAgICAgICAgcGFyZW50czogcGFyZW50cyxcbiAgICAgICAgZXNjYXBlOiBlc2NhcGUsXG4gICAgICAgIGNzczogY3NzLFxuICAgICAgICBnZXRTdHlsZXM6IGdldFN0eWxlcyxcbiAgICAgICAgZ2V0U3R5bGU6IGdldFN0eWxlLFxuICAgICAgICBnZXRDc3NWYXI6IGdldENzc1ZhcixcbiAgICAgICAgcHJvcE5hbWU6IHByb3BOYW1lLFxuICAgICAgICBpc1RvdWNoOiBpc1RvdWNoLFxuICAgICAgICBnZXRQb3M6IGdldFBvcyQxXG4gICAgfSk7XG5cbiAgICBmdW5jdGlvbiBjb21wb25lbnRBUEkgKFVJa2l0KSB7XG5cbiAgICAgICAgdmFyIERBVEEgPSBVSWtpdC5kYXRhO1xuXG4gICAgICAgIHZhciBjb21wb25lbnRzID0ge307XG5cbiAgICAgICAgVUlraXQuY29tcG9uZW50ID0gZnVuY3Rpb24gKG5hbWUsIG9wdGlvbnMpIHtcblxuICAgICAgICAgICAgaWYgKCFvcHRpb25zKSB7XG5cbiAgICAgICAgICAgICAgICBpZiAoaXNQbGFpbk9iamVjdChjb21wb25lbnRzW25hbWVdKSkge1xuICAgICAgICAgICAgICAgICAgICBjb21wb25lbnRzW25hbWVdID0gVUlraXQuZXh0ZW5kKGNvbXBvbmVudHNbbmFtZV0pO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHJldHVybiBjb21wb25lbnRzW25hbWVdO1xuXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIFVJa2l0W25hbWVdID0gZnVuY3Rpb24gKGVsZW1lbnQsIGRhdGEkJDEpIHtcbiAgICAgICAgICAgICAgICB2YXIgaSA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3NBcnJheSA9IEFycmF5KGkpO1xuICAgICAgICAgICAgICAgIHdoaWxlICggaS0tICkgYXJnc0FycmF5W2ldID0gYXJndW1lbnRzW2ldO1xuXG5cbiAgICAgICAgICAgICAgICB2YXIgY29tcG9uZW50ID0gVUlraXQuY29tcG9uZW50KG5hbWUpO1xuXG4gICAgICAgICAgICAgICAgaWYgKGlzUGxhaW5PYmplY3QoZWxlbWVudCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBjb21wb25lbnQoe2RhdGE6IGVsZW1lbnR9KTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoY29tcG9uZW50Lm9wdGlvbnMuZnVuY3Rpb25hbCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IGNvbXBvbmVudCh7ZGF0YTogW10uY29uY2F0KCBhcmdzQXJyYXkgKX0pO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHJldHVybiBlbGVtZW50ICYmIGVsZW1lbnQubm9kZVR5cGUgPyBpbml0KGVsZW1lbnQpIDogJCQoZWxlbWVudCkubWFwKGluaXQpWzBdO1xuXG4gICAgICAgICAgICAgICAgZnVuY3Rpb24gaW5pdChlbGVtZW50KSB7XG5cbiAgICAgICAgICAgICAgICAgICAgdmFyIGluc3RhbmNlID0gVUlraXQuZ2V0Q29tcG9uZW50KGVsZW1lbnQsIG5hbWUpO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChpbnN0YW5jZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFkYXRhJCQxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGluc3RhbmNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZS4kZGVzdHJveSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBjb21wb25lbnQoe2VsOiBlbGVtZW50LCBkYXRhOiBkYXRhJCQxfSk7XG5cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIHZhciBvcHQgPSBpc1BsYWluT2JqZWN0KG9wdGlvbnMpID8gYXNzaWduKHt9LCBvcHRpb25zKSA6IG9wdGlvbnMub3B0aW9ucztcblxuICAgICAgICAgICAgb3B0Lm5hbWUgPSBuYW1lO1xuXG4gICAgICAgICAgICBpZiAob3B0Lmluc3RhbGwpIHtcbiAgICAgICAgICAgICAgICBvcHQuaW5zdGFsbChVSWtpdCwgb3B0LCBuYW1lKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKFVJa2l0Ll9pbml0aWFsaXplZCAmJiAhb3B0LmZ1bmN0aW9uYWwpIHtcbiAgICAgICAgICAgICAgICB2YXIgaWQgPSBoeXBoZW5hdGUobmFtZSk7XG4gICAgICAgICAgICAgICAgZmFzdGRvbS5yZWFkKGZ1bmN0aW9uICgpIHsgcmV0dXJuIFVJa2l0W25hbWVdKChcIlt1ay1cIiArIGlkICsgXCJdLFtkYXRhLXVrLVwiICsgaWQgKyBcIl1cIikpOyB9KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIGNvbXBvbmVudHNbbmFtZV0gPSBpc1BsYWluT2JqZWN0KG9wdGlvbnMpID8gb3B0IDogb3B0aW9ucztcbiAgICAgICAgfTtcblxuICAgICAgICBVSWtpdC5nZXRDb21wb25lbnRzID0gZnVuY3Rpb24gKGVsZW1lbnQpIHsgcmV0dXJuIGVsZW1lbnQgJiYgZWxlbWVudFtEQVRBXSB8fCB7fTsgfTtcbiAgICAgICAgVUlraXQuZ2V0Q29tcG9uZW50ID0gZnVuY3Rpb24gKGVsZW1lbnQsIG5hbWUpIHsgcmV0dXJuIFVJa2l0LmdldENvbXBvbmVudHMoZWxlbWVudClbbmFtZV07IH07XG5cbiAgICAgICAgVUlraXQuY29ubmVjdCA9IGZ1bmN0aW9uIChub2RlKSB7XG5cbiAgICAgICAgICAgIGlmIChub2RlW0RBVEFdKSB7XG4gICAgICAgICAgICAgICAgZm9yICh2YXIgbmFtZSBpbiBub2RlW0RBVEFdKSB7XG4gICAgICAgICAgICAgICAgICAgIG5vZGVbREFUQV1bbmFtZV0uX2NhbGxDb25uZWN0ZWQoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbm9kZS5hdHRyaWJ1dGVzLmxlbmd0aDsgaSsrKSB7XG5cbiAgICAgICAgICAgICAgICB2YXIgbmFtZSQxID0gZ2V0Q29tcG9uZW50TmFtZShub2RlLmF0dHJpYnV0ZXNbaV0ubmFtZSk7XG5cbiAgICAgICAgICAgICAgICBpZiAobmFtZSQxICYmIG5hbWUkMSBpbiBjb21wb25lbnRzKSB7XG4gICAgICAgICAgICAgICAgICAgIFVJa2l0W25hbWUkMV0obm9kZSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgfTtcblxuICAgICAgICBVSWtpdC5kaXNjb25uZWN0ID0gZnVuY3Rpb24gKG5vZGUpIHtcbiAgICAgICAgICAgIGZvciAodmFyIG5hbWUgaW4gbm9kZVtEQVRBXSkge1xuICAgICAgICAgICAgICAgIG5vZGVbREFUQV1bbmFtZV0uX2NhbGxEaXNjb25uZWN0ZWQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGdldENvbXBvbmVudE5hbWUoYXR0cmlidXRlKSB7XG4gICAgICAgIHJldHVybiBzdGFydHNXaXRoKGF0dHJpYnV0ZSwgJ3VrLScpIHx8IHN0YXJ0c1dpdGgoYXR0cmlidXRlLCAnZGF0YS11ay0nKVxuICAgICAgICAgICAgPyBjYW1lbGl6ZShhdHRyaWJ1dGUucmVwbGFjZSgnZGF0YS11ay0nLCAnJykucmVwbGFjZSgndWstJywgJycpKVxuICAgICAgICAgICAgOiBmYWxzZTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBib290IChVSWtpdCkge1xuXG4gICAgICAgIHZhciBjb25uZWN0ID0gVUlraXQuY29ubmVjdDtcbiAgICAgICAgdmFyIGRpc2Nvbm5lY3QgPSBVSWtpdC5kaXNjb25uZWN0O1xuXG4gICAgICAgIGlmICghKCdNdXRhdGlvbk9ic2VydmVyJyBpbiB3aW5kb3cpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZG9jdW1lbnQuYm9keSkge1xuXG4gICAgICAgICAgICBpbml0KCk7XG5cbiAgICAgICAgfSBlbHNlIHtcblxuICAgICAgICAgICAgKG5ldyBNdXRhdGlvbk9ic2VydmVyKGZ1bmN0aW9uICgpIHtcblxuICAgICAgICAgICAgICAgIGlmIChkb2N1bWVudC5ib2R5KSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGlzY29ubmVjdCgpO1xuICAgICAgICAgICAgICAgICAgICBpbml0KCk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB9KSkub2JzZXJ2ZShkb2N1bWVudCwge2NoaWxkTGlzdDogdHJ1ZSwgc3VidHJlZTogdHJ1ZX0pO1xuXG4gICAgICAgIH1cblxuICAgICAgICBmdW5jdGlvbiBpbml0KCkge1xuXG4gICAgICAgICAgICBhcHBseSQkMShkb2N1bWVudC5ib2R5LCBjb25uZWN0KTtcblxuICAgICAgICAgICAgZmFzdGRvbS5mbHVzaCgpO1xuXG4gICAgICAgICAgICAobmV3IE11dGF0aW9uT2JzZXJ2ZXIoZnVuY3Rpb24gKG11dGF0aW9ucykgeyByZXR1cm4gbXV0YXRpb25zLmZvckVhY2goYXBwbHlNdXRhdGlvbik7IH0pKS5vYnNlcnZlKGRvY3VtZW50LCB7XG4gICAgICAgICAgICAgICAgY2hpbGRMaXN0OiB0cnVlLFxuICAgICAgICAgICAgICAgIHN1YnRyZWU6IHRydWUsXG4gICAgICAgICAgICAgICAgY2hhcmFjdGVyRGF0YTogdHJ1ZSxcbiAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzOiB0cnVlXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgVUlraXQuX2luaXRpYWxpemVkID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZ1bmN0aW9uIGFwcGx5TXV0YXRpb24obXV0YXRpb24pIHtcblxuICAgICAgICAgICAgdmFyIHRhcmdldCA9IG11dGF0aW9uLnRhcmdldDtcbiAgICAgICAgICAgIHZhciB0eXBlID0gbXV0YXRpb24udHlwZTtcblxuICAgICAgICAgICAgdmFyIHVwZGF0ZSA9IHR5cGUgIT09ICdhdHRyaWJ1dGVzJ1xuICAgICAgICAgICAgICAgID8gYXBwbHlDaGlsZExpc3QobXV0YXRpb24pXG4gICAgICAgICAgICAgICAgOiBhcHBseUF0dHJpYnV0ZShtdXRhdGlvbik7XG5cbiAgICAgICAgICAgIHVwZGF0ZSAmJiBVSWtpdC51cGRhdGUodGFyZ2V0KTtcblxuICAgICAgICB9XG5cbiAgICAgICAgZnVuY3Rpb24gYXBwbHlBdHRyaWJ1dGUocmVmKSB7XG4gICAgICAgICAgICB2YXIgdGFyZ2V0ID0gcmVmLnRhcmdldDtcbiAgICAgICAgICAgIHZhciBhdHRyaWJ1dGVOYW1lID0gcmVmLmF0dHJpYnV0ZU5hbWU7XG5cblxuICAgICAgICAgICAgaWYgKGF0dHJpYnV0ZU5hbWUgPT09ICdocmVmJykge1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB2YXIgbmFtZSA9IGdldENvbXBvbmVudE5hbWUoYXR0cmlidXRlTmFtZSk7XG5cbiAgICAgICAgICAgIGlmICghbmFtZSB8fCAhKG5hbWUgaW4gVUlraXQpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoaGFzQXR0cih0YXJnZXQsIGF0dHJpYnV0ZU5hbWUpKSB7XG4gICAgICAgICAgICAgICAgVUlraXRbbmFtZV0odGFyZ2V0KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdmFyIGNvbXBvbmVudCA9IFVJa2l0LmdldENvbXBvbmVudCh0YXJnZXQsIG5hbWUpO1xuXG4gICAgICAgICAgICBpZiAoY29tcG9uZW50KSB7XG4gICAgICAgICAgICAgICAgY29tcG9uZW50LiRkZXN0cm95KCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgfVxuXG4gICAgICAgIGZ1bmN0aW9uIGFwcGx5Q2hpbGRMaXN0KHJlZikge1xuICAgICAgICAgICAgdmFyIGFkZGVkTm9kZXMgPSByZWYuYWRkZWROb2RlcztcbiAgICAgICAgICAgIHZhciByZW1vdmVkTm9kZXMgPSByZWYucmVtb3ZlZE5vZGVzO1xuXG5cbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYWRkZWROb2Rlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGFwcGx5JCQxKGFkZGVkTm9kZXNbaV0sIGNvbm5lY3QpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBmb3IgKHZhciBpJDEgPSAwOyBpJDEgPCByZW1vdmVkTm9kZXMubGVuZ3RoOyBpJDErKykge1xuICAgICAgICAgICAgICAgIGFwcGx5JCQxKHJlbW92ZWROb2Rlc1tpJDFdLCBkaXNjb25uZWN0KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICBmdW5jdGlvbiBhcHBseSQkMShub2RlLCBmbikge1xuXG4gICAgICAgICAgICBpZiAobm9kZS5ub2RlVHlwZSAhPT0gMSB8fCBoYXNBdHRyKG5vZGUsICd1ay1uby1ib290JykpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGZuKG5vZGUpO1xuICAgICAgICAgICAgbm9kZSA9IG5vZGUuZmlyc3RFbGVtZW50Q2hpbGQ7XG4gICAgICAgICAgICB3aGlsZSAobm9kZSkge1xuICAgICAgICAgICAgICAgIHZhciBuZXh0ID0gbm9kZS5uZXh0RWxlbWVudFNpYmxpbmc7XG4gICAgICAgICAgICAgICAgYXBwbHkkJDEobm9kZSwgZm4pO1xuICAgICAgICAgICAgICAgIG5vZGUgPSBuZXh0O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBnbG9iYWxBUEkgKFVJa2l0KSB7XG5cbiAgICAgICAgdmFyIERBVEEgPSBVSWtpdC5kYXRhO1xuXG4gICAgICAgIFVJa2l0LnVzZSA9IGZ1bmN0aW9uIChwbHVnaW4pIHtcblxuICAgICAgICAgICAgaWYgKHBsdWdpbi5pbnN0YWxsZWQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHBsdWdpbi5jYWxsKG51bGwsIHRoaXMpO1xuICAgICAgICAgICAgcGx1Z2luLmluc3RhbGxlZCA9IHRydWU7XG5cbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9O1xuXG4gICAgICAgIFVJa2l0Lm1peGluID0gZnVuY3Rpb24gKG1peGluLCBjb21wb25lbnQpIHtcbiAgICAgICAgICAgIGNvbXBvbmVudCA9IChpc1N0cmluZyhjb21wb25lbnQpID8gVUlraXQuY29tcG9uZW50KGNvbXBvbmVudCkgOiBjb21wb25lbnQpIHx8IHRoaXM7XG4gICAgICAgICAgICBjb21wb25lbnQub3B0aW9ucyA9IG1lcmdlT3B0aW9ucyhjb21wb25lbnQub3B0aW9ucywgbWl4aW4pO1xuICAgICAgICB9O1xuXG4gICAgICAgIFVJa2l0LmV4dGVuZCA9IGZ1bmN0aW9uIChvcHRpb25zKSB7XG5cbiAgICAgICAgICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuXG4gICAgICAgICAgICB2YXIgU3VwZXIgPSB0aGlzO1xuICAgICAgICAgICAgdmFyIFN1YiA9IGZ1bmN0aW9uIFVJa2l0Q29tcG9uZW50IChvcHRpb25zKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5faW5pdChvcHRpb25zKTtcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIFN1Yi5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKFN1cGVyLnByb3RvdHlwZSk7XG4gICAgICAgICAgICBTdWIucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gU3ViO1xuICAgICAgICAgICAgU3ViLm9wdGlvbnMgPSBtZXJnZU9wdGlvbnMoU3VwZXIub3B0aW9ucywgb3B0aW9ucyk7XG5cbiAgICAgICAgICAgIFN1Yi5zdXBlciA9IFN1cGVyO1xuICAgICAgICAgICAgU3ViLmV4dGVuZCA9IFN1cGVyLmV4dGVuZDtcblxuICAgICAgICAgICAgcmV0dXJuIFN1YjtcbiAgICAgICAgfTtcblxuICAgICAgICBVSWtpdC51cGRhdGUgPSBmdW5jdGlvbiAoZWxlbWVudCwgZSkge1xuXG4gICAgICAgICAgICBlbGVtZW50ID0gZWxlbWVudCA/IHRvTm9kZShlbGVtZW50KSA6IGRvY3VtZW50LmJvZHk7XG5cbiAgICAgICAgICAgIHBhdGgoZWxlbWVudCwgZnVuY3Rpb24gKGVsZW1lbnQpIHsgcmV0dXJuIHVwZGF0ZShlbGVtZW50W0RBVEFdLCBlKTsgfSk7XG4gICAgICAgICAgICBhcHBseShlbGVtZW50LCBmdW5jdGlvbiAoZWxlbWVudCkgeyByZXR1cm4gdXBkYXRlKGVsZW1lbnRbREFUQV0sIGUpOyB9KTtcblxuICAgICAgICB9O1xuXG4gICAgICAgIHZhciBjb250YWluZXI7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShVSWtpdCwgJ2NvbnRhaW5lcicsIHtcblxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gY29udGFpbmVyIHx8IGRvY3VtZW50LmJvZHk7XG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uKGVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICBjb250YWluZXIgPSAkKGVsZW1lbnQpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGZ1bmN0aW9uIHVwZGF0ZShkYXRhJCQxLCBlKSB7XG5cbiAgICAgICAgICAgIGlmICghZGF0YSQkMSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZm9yICh2YXIgbmFtZSBpbiBkYXRhJCQxKSB7XG4gICAgICAgICAgICAgICAgaWYgKGRhdGEkJDFbbmFtZV0uX2Nvbm5lY3RlZCkge1xuICAgICAgICAgICAgICAgICAgICBkYXRhJCQxW25hbWVdLl9jYWxsVXBkYXRlKGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICB9XG5cbiAgICAgICAgZnVuY3Rpb24gcGF0aChub2RlLCBmbikge1xuICAgICAgICAgICAgaWYgKG5vZGUgJiYgbm9kZSAhPT0gZG9jdW1lbnQuYm9keSAmJiBub2RlLnBhcmVudE5vZGUpIHtcbiAgICAgICAgICAgICAgICBwYXRoKG5vZGUucGFyZW50Tm9kZSwgZm4pO1xuICAgICAgICAgICAgICAgIGZuKG5vZGUucGFyZW50Tm9kZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGhvb2tzQVBJIChVSWtpdCkge1xuXG4gICAgICAgIFVJa2l0LnByb3RvdHlwZS5fY2FsbEhvb2sgPSBmdW5jdGlvbiAoaG9vaykge1xuICAgICAgICAgICAgdmFyIHRoaXMkMSA9IHRoaXM7XG5cblxuICAgICAgICAgICAgdmFyIGhhbmRsZXJzID0gdGhpcy4kb3B0aW9uc1tob29rXTtcblxuICAgICAgICAgICAgaWYgKGhhbmRsZXJzKSB7XG4gICAgICAgICAgICAgICAgaGFuZGxlcnMuZm9yRWFjaChmdW5jdGlvbiAoaGFuZGxlcikgeyByZXR1cm4gaGFuZGxlci5jYWxsKHRoaXMkMSk7IH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIFVJa2l0LnByb3RvdHlwZS5fY2FsbENvbm5lY3RlZCA9IGZ1bmN0aW9uICgpIHtcblxuICAgICAgICAgICAgaWYgKHRoaXMuX2Nvbm5lY3RlZCkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5fZGF0YSA9IHt9O1xuICAgICAgICAgICAgdGhpcy5fY29tcHV0ZWRzID0ge307XG4gICAgICAgICAgICB0aGlzLl9pbml0UHJvcHMoKTtcblxuICAgICAgICAgICAgdGhpcy5fY2FsbEhvb2soJ2JlZm9yZUNvbm5lY3QnKTtcbiAgICAgICAgICAgIHRoaXMuX2Nvbm5lY3RlZCA9IHRydWU7XG5cbiAgICAgICAgICAgIHRoaXMuX2luaXRFdmVudHMoKTtcbiAgICAgICAgICAgIHRoaXMuX2luaXRPYnNlcnZlcigpO1xuXG4gICAgICAgICAgICB0aGlzLl9jYWxsSG9vaygnY29ubmVjdGVkJyk7XG4gICAgICAgICAgICB0aGlzLl9jYWxsVXBkYXRlKCk7XG4gICAgICAgIH07XG5cbiAgICAgICAgVUlraXQucHJvdG90eXBlLl9jYWxsRGlzY29ubmVjdGVkID0gZnVuY3Rpb24gKCkge1xuXG4gICAgICAgICAgICBpZiAoIXRoaXMuX2Nvbm5lY3RlZCkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5fY2FsbEhvb2soJ2JlZm9yZURpc2Nvbm5lY3QnKTtcblxuICAgICAgICAgICAgaWYgKHRoaXMuX29ic2VydmVyKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fb2JzZXJ2ZXIuZGlzY29ubmVjdCgpO1xuICAgICAgICAgICAgICAgIHRoaXMuX29ic2VydmVyID0gbnVsbDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5fdW5iaW5kRXZlbnRzKCk7XG4gICAgICAgICAgICB0aGlzLl9jYWxsSG9vaygnZGlzY29ubmVjdGVkJyk7XG5cbiAgICAgICAgICAgIHRoaXMuX2Nvbm5lY3RlZCA9IGZhbHNlO1xuXG4gICAgICAgIH07XG5cbiAgICAgICAgVUlraXQucHJvdG90eXBlLl9jYWxsVXBkYXRlID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgIHZhciB0aGlzJDEgPSB0aGlzO1xuICAgICAgICAgICAgaWYgKCBlID09PSB2b2lkIDAgKSBlID0gJ3VwZGF0ZSc7XG5cblxuICAgICAgICAgICAgdmFyIHR5cGUgPSBlLnR5cGUgfHwgZTtcblxuICAgICAgICAgICAgaWYgKGluY2x1ZGVzKFsndXBkYXRlJywgJ3Jlc2l6ZSddLCB0eXBlKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuX2NhbGxXYXRjaGVzKCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHZhciB1cGRhdGVzID0gdGhpcy4kb3B0aW9ucy51cGRhdGU7XG4gICAgICAgICAgICB2YXIgcmVmID0gdGhpcy5fZnJhbWVzO1xuICAgICAgICAgICAgdmFyIHJlYWRzID0gcmVmLnJlYWRzO1xuICAgICAgICAgICAgdmFyIHdyaXRlcyA9IHJlZi53cml0ZXM7XG5cbiAgICAgICAgICAgIGlmICghdXBkYXRlcykge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdXBkYXRlcy5mb3JFYWNoKGZ1bmN0aW9uIChyZWYsIGkpIHtcbiAgICAgICAgICAgICAgICB2YXIgcmVhZCA9IHJlZi5yZWFkO1xuICAgICAgICAgICAgICAgIHZhciB3cml0ZSA9IHJlZi53cml0ZTtcbiAgICAgICAgICAgICAgICB2YXIgZXZlbnRzID0gcmVmLmV2ZW50cztcblxuXG4gICAgICAgICAgICAgICAgaWYgKHR5cGUgIT09ICd1cGRhdGUnICYmICFpbmNsdWRlcyhldmVudHMsIHR5cGUpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAocmVhZCAmJiAhaW5jbHVkZXMoZmFzdGRvbS5yZWFkcywgcmVhZHNbaV0pKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlYWRzW2ldID0gZmFzdGRvbS5yZWFkKGZ1bmN0aW9uICgpIHtcblxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9IHRoaXMkMS5fY29ubmVjdGVkICYmIHJlYWQuY2FsbCh0aGlzJDEsIHRoaXMkMS5fZGF0YSwgdHlwZSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgPT09IGZhbHNlICYmIHdyaXRlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFzdGRvbS5jbGVhcih3cml0ZXNbaV0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpc1BsYWluT2JqZWN0KHJlc3VsdCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3NpZ24odGhpcyQxLl9kYXRhLCByZXN1bHQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAod3JpdGUgJiYgIWluY2x1ZGVzKGZhc3Rkb20ud3JpdGVzLCB3cml0ZXNbaV0pKSB7XG4gICAgICAgICAgICAgICAgICAgIHdyaXRlc1tpXSA9IGZhc3Rkb20ud3JpdGUoZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpcyQxLl9jb25uZWN0ZWQgJiYgd3JpdGUuY2FsbCh0aGlzJDEsIHRoaXMkMS5fZGF0YSwgdHlwZSk7IH0pO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgfTtcblxuICAgIH1cblxuICAgIGZ1bmN0aW9uIHN0YXRlQVBJIChVSWtpdCkge1xuXG4gICAgICAgIHZhciB1aWQgPSAwO1xuXG4gICAgICAgIFVJa2l0LnByb3RvdHlwZS5faW5pdCA9IGZ1bmN0aW9uIChvcHRpb25zKSB7XG5cbiAgICAgICAgICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICAgICAgICAgICAgb3B0aW9ucy5kYXRhID0gbm9ybWFsaXplRGF0YShvcHRpb25zLCB0aGlzLmNvbnN0cnVjdG9yLm9wdGlvbnMpO1xuXG4gICAgICAgICAgICB0aGlzLiRvcHRpb25zID0gbWVyZ2VPcHRpb25zKHRoaXMuY29uc3RydWN0b3Iub3B0aW9ucywgb3B0aW9ucywgdGhpcyk7XG4gICAgICAgICAgICB0aGlzLiRlbCA9IG51bGw7XG4gICAgICAgICAgICB0aGlzLiRwcm9wcyA9IHt9O1xuXG4gICAgICAgICAgICB0aGlzLl9mcmFtZXMgPSB7cmVhZHM6IHt9LCB3cml0ZXM6IHt9fTtcbiAgICAgICAgICAgIHRoaXMuX2V2ZW50cyA9IFtdO1xuXG4gICAgICAgICAgICB0aGlzLl91aWQgPSB1aWQrKztcbiAgICAgICAgICAgIHRoaXMuX2luaXREYXRhKCk7XG4gICAgICAgICAgICB0aGlzLl9pbml0TWV0aG9kcygpO1xuICAgICAgICAgICAgdGhpcy5faW5pdENvbXB1dGVkcygpO1xuICAgICAgICAgICAgdGhpcy5fY2FsbEhvb2soJ2NyZWF0ZWQnKTtcblxuICAgICAgICAgICAgaWYgKG9wdGlvbnMuZWwpIHtcbiAgICAgICAgICAgICAgICB0aGlzLiRtb3VudChvcHRpb25zLmVsKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgICBVSWtpdC5wcm90b3R5cGUuX2luaXREYXRhID0gZnVuY3Rpb24gKCkge1xuXG4gICAgICAgICAgICB2YXIgcmVmID0gdGhpcy4kb3B0aW9ucztcbiAgICAgICAgICAgIHZhciBkYXRhJCQxID0gcmVmLmRhdGE7IGlmICggZGF0YSQkMSA9PT0gdm9pZCAwICkgZGF0YSQkMSA9IHt9O1xuXG4gICAgICAgICAgICBmb3IgKHZhciBrZXkgaW4gZGF0YSQkMSkge1xuICAgICAgICAgICAgICAgIHRoaXMuJHByb3BzW2tleV0gPSB0aGlzW2tleV0gPSBkYXRhJCQxW2tleV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG5cbiAgICAgICAgVUlraXQucHJvdG90eXBlLl9pbml0TWV0aG9kcyA9IGZ1bmN0aW9uICgpIHtcblxuICAgICAgICAgICAgdmFyIHJlZiA9IHRoaXMuJG9wdGlvbnM7XG4gICAgICAgICAgICB2YXIgbWV0aG9kcyA9IHJlZi5tZXRob2RzO1xuXG4gICAgICAgICAgICBpZiAobWV0aG9kcykge1xuICAgICAgICAgICAgICAgIGZvciAodmFyIGtleSBpbiBtZXRob2RzKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXNba2V5XSA9IGJpbmQobWV0aG9kc1trZXldLCB0aGlzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG5cbiAgICAgICAgVUlraXQucHJvdG90eXBlLl9pbml0Q29tcHV0ZWRzID0gZnVuY3Rpb24gKCkge1xuXG4gICAgICAgICAgICB2YXIgcmVmID0gdGhpcy4kb3B0aW9ucztcbiAgICAgICAgICAgIHZhciBjb21wdXRlZCA9IHJlZi5jb21wdXRlZDtcblxuICAgICAgICAgICAgdGhpcy5fY29tcHV0ZWRzID0ge307XG5cbiAgICAgICAgICAgIGlmIChjb21wdXRlZCkge1xuICAgICAgICAgICAgICAgIGZvciAodmFyIGtleSBpbiBjb21wdXRlZCkge1xuICAgICAgICAgICAgICAgICAgICByZWdpc3RlckNvbXB1dGVkKHRoaXMsIGtleSwgY29tcHV0ZWRba2V5XSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIFVJa2l0LnByb3RvdHlwZS5fY2FsbFdhdGNoZXMgPSBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgICAgIHZhciByZWYgPSB0aGlzO1xuICAgICAgICAgICAgdmFyIGNvbXB1dGVkID0gcmVmLiRvcHRpb25zLmNvbXB1dGVkO1xuICAgICAgICAgICAgdmFyIF9jb21wdXRlZHMgPSByZWYuX2NvbXB1dGVkcztcblxuICAgICAgICAgICAgZm9yICh2YXIga2V5IGluIF9jb21wdXRlZHMpIHtcblxuICAgICAgICAgICAgICAgIHZhciB2YWx1ZSA9IF9jb21wdXRlZHNba2V5XTtcbiAgICAgICAgICAgICAgICBkZWxldGUgX2NvbXB1dGVkc1trZXldO1xuXG4gICAgICAgICAgICAgICAgaWYgKGNvbXB1dGVkW2tleV0ud2F0Y2ggJiYgIWlzRXF1YWwodmFsdWUsIHRoaXNba2V5XSkpIHtcbiAgICAgICAgICAgICAgICAgICAgY29tcHV0ZWRba2V5XS53YXRjaC5jYWxsKHRoaXMsIHRoaXNba2V5XSwgdmFsdWUpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgfVxuXG4gICAgICAgIH07XG5cbiAgICAgICAgVUlraXQucHJvdG90eXBlLl9pbml0UHJvcHMgPSBmdW5jdGlvbiAocHJvcHMpIHtcblxuICAgICAgICAgICAgdmFyIGtleTtcblxuICAgICAgICAgICAgcHJvcHMgPSBwcm9wcyB8fCBnZXRQcm9wcyh0aGlzLiRvcHRpb25zLCB0aGlzLiRuYW1lKTtcblxuICAgICAgICAgICAgZm9yIChrZXkgaW4gcHJvcHMpIHtcbiAgICAgICAgICAgICAgICBpZiAoIWlzVW5kZWZpbmVkKHByb3BzW2tleV0pKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuJHByb3BzW2tleV0gPSBwcm9wc1trZXldO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdmFyIGV4Y2x1ZGUgPSBbdGhpcy4kb3B0aW9ucy5jb21wdXRlZCwgdGhpcy4kb3B0aW9ucy5tZXRob2RzXTtcbiAgICAgICAgICAgIGZvciAoa2V5IGluIHRoaXMuJHByb3BzKSB7XG4gICAgICAgICAgICAgICAgaWYgKGtleSBpbiBwcm9wcyAmJiBub3RJbihleGNsdWRlLCBrZXkpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXNba2V5XSA9IHRoaXMuJHByb3BzW2tleV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIFVJa2l0LnByb3RvdHlwZS5faW5pdEV2ZW50cyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciB0aGlzJDEgPSB0aGlzO1xuXG5cbiAgICAgICAgICAgIHZhciByZWYgPSB0aGlzLiRvcHRpb25zO1xuICAgICAgICAgICAgdmFyIGV2ZW50cyA9IHJlZi5ldmVudHM7XG5cbiAgICAgICAgICAgIGlmIChldmVudHMpIHtcblxuICAgICAgICAgICAgICAgIGV2ZW50cy5mb3JFYWNoKGZ1bmN0aW9uIChldmVudCkge1xuXG4gICAgICAgICAgICAgICAgICAgIGlmICghaGFzT3duKGV2ZW50LCAnaGFuZGxlcicpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBrZXkgaW4gZXZlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RlckV2ZW50KHRoaXMkMSwgZXZlbnRba2V5XSwga2V5KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyRXZlbnQodGhpcyQxLCBldmVudCk7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIFVJa2l0LnByb3RvdHlwZS5fdW5iaW5kRXZlbnRzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdGhpcy5fZXZlbnRzLmZvckVhY2goZnVuY3Rpb24gKHVuYmluZCkgeyByZXR1cm4gdW5iaW5kKCk7IH0pO1xuICAgICAgICAgICAgdGhpcy5fZXZlbnRzID0gW107XG4gICAgICAgIH07XG5cbiAgICAgICAgVUlraXQucHJvdG90eXBlLl9pbml0T2JzZXJ2ZXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgdGhpcyQxID0gdGhpcztcblxuXG4gICAgICAgICAgICB2YXIgcmVmID0gdGhpcy4kb3B0aW9ucztcbiAgICAgICAgICAgIHZhciBhdHRycyA9IHJlZi5hdHRycztcbiAgICAgICAgICAgIHZhciBwcm9wcyA9IHJlZi5wcm9wcztcbiAgICAgICAgICAgIHZhciBlbCA9IHJlZi5lbDtcbiAgICAgICAgICAgIGlmICh0aGlzLl9vYnNlcnZlciB8fCAhcHJvcHMgfHwgYXR0cnMgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBhdHRycyA9IGlzQXJyYXkoYXR0cnMpID8gYXR0cnMgOiBPYmplY3Qua2V5cyhwcm9wcyk7XG5cbiAgICAgICAgICAgIHRoaXMuX29ic2VydmVyID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIoZnVuY3Rpb24gKCkge1xuXG4gICAgICAgICAgICAgICAgdmFyIGRhdGEkJDEgPSBnZXRQcm9wcyh0aGlzJDEuJG9wdGlvbnMsIHRoaXMkMS4kbmFtZSk7XG4gICAgICAgICAgICAgICAgaWYgKGF0dHJzLnNvbWUoZnVuY3Rpb24gKGtleSkgeyByZXR1cm4gIWlzVW5kZWZpbmVkKGRhdGEkJDFba2V5XSkgJiYgZGF0YSQkMVtrZXldICE9PSB0aGlzJDEuJHByb3BzW2tleV07IH0pKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMkMS4kcmVzZXQoKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICB2YXIgZmlsdGVyJCQxID0gYXR0cnMubWFwKGZ1bmN0aW9uIChrZXkpIHsgcmV0dXJuIGh5cGhlbmF0ZShrZXkpOyB9KS5jb25jYXQodGhpcy4kbmFtZSk7XG5cbiAgICAgICAgICAgIHRoaXMuX29ic2VydmVyLm9ic2VydmUoZWwsIHtcbiAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzOiB0cnVlLFxuICAgICAgICAgICAgICAgIGF0dHJpYnV0ZUZpbHRlcjogZmlsdGVyJCQxLmNvbmNhdChmaWx0ZXIkJDEubWFwKGZ1bmN0aW9uIChrZXkpIHsgcmV0dXJuIChcImRhdGEtXCIgKyBrZXkpOyB9KSlcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9O1xuXG4gICAgICAgIGZ1bmN0aW9uIGdldFByb3BzKG9wdHMsIG5hbWUpIHtcblxuICAgICAgICAgICAgdmFyIGRhdGEkJDEgPSB7fTtcbiAgICAgICAgICAgIHZhciBhcmdzID0gb3B0cy5hcmdzOyBpZiAoIGFyZ3MgPT09IHZvaWQgMCApIGFyZ3MgPSBbXTtcbiAgICAgICAgICAgIHZhciBwcm9wcyA9IG9wdHMucHJvcHM7IGlmICggcHJvcHMgPT09IHZvaWQgMCApIHByb3BzID0ge307XG4gICAgICAgICAgICB2YXIgZWwgPSBvcHRzLmVsO1xuXG4gICAgICAgICAgICBpZiAoIXByb3BzKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGRhdGEkJDE7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGZvciAodmFyIGtleSBpbiBwcm9wcykge1xuICAgICAgICAgICAgICAgIHZhciBwcm9wID0gaHlwaGVuYXRlKGtleSk7XG4gICAgICAgICAgICAgICAgdmFyIHZhbHVlID0gZGF0YShlbCwgcHJvcCk7XG5cbiAgICAgICAgICAgICAgICBpZiAoIWlzVW5kZWZpbmVkKHZhbHVlKSkge1xuXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlID0gcHJvcHNba2V5XSA9PT0gQm9vbGVhbiAmJiB2YWx1ZSA9PT0gJydcbiAgICAgICAgICAgICAgICAgICAgICAgID8gdHJ1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgOiBjb2VyY2UocHJvcHNba2V5XSwgdmFsdWUpO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChwcm9wID09PSAndGFyZ2V0JyAmJiAoIXZhbHVlIHx8IHN0YXJ0c1dpdGgodmFsdWUsICdfJykpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGRhdGEkJDFba2V5XSA9IHZhbHVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdmFyIG9wdGlvbnMgPSBwYXJzZU9wdGlvbnMoZGF0YShlbCwgbmFtZSksIGFyZ3MpO1xuXG4gICAgICAgICAgICBmb3IgKHZhciBrZXkkMSBpbiBvcHRpb25zKSB7XG4gICAgICAgICAgICAgICAgdmFyIHByb3AkMSA9IGNhbWVsaXplKGtleSQxKTtcbiAgICAgICAgICAgICAgICBpZiAocHJvcHNbcHJvcCQxXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIGRhdGEkJDFbcHJvcCQxXSA9IGNvZXJjZShwcm9wc1twcm9wJDFdLCBvcHRpb25zW2tleSQxXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gZGF0YSQkMTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZ1bmN0aW9uIHJlZ2lzdGVyQ29tcHV0ZWQoY29tcG9uZW50LCBrZXksIGNiKSB7XG4gICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoY29tcG9uZW50LCBrZXksIHtcblxuICAgICAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG5cbiAgICAgICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uKCkge1xuXG4gICAgICAgICAgICAgICAgICAgIHZhciBfY29tcHV0ZWRzID0gY29tcG9uZW50Ll9jb21wdXRlZHM7XG4gICAgICAgICAgICAgICAgICAgIHZhciAkcHJvcHMgPSBjb21wb25lbnQuJHByb3BzO1xuICAgICAgICAgICAgICAgICAgICB2YXIgJGVsID0gY29tcG9uZW50LiRlbDtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoIWhhc093bihfY29tcHV0ZWRzLCBrZXkpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBfY29tcHV0ZWRzW2tleV0gPSAoY2IuZ2V0IHx8IGNiKS5jYWxsKGNvbXBvbmVudCwgJHByb3BzLCAkZWwpO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9jb21wdXRlZHNba2V5XTtcbiAgICAgICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICAgICAgc2V0OiBmdW5jdGlvbih2YWx1ZSkge1xuXG4gICAgICAgICAgICAgICAgICAgIHZhciBfY29tcHV0ZWRzID0gY29tcG9uZW50Ll9jb21wdXRlZHM7XG5cbiAgICAgICAgICAgICAgICAgICAgX2NvbXB1dGVkc1trZXldID0gY2Iuc2V0ID8gY2Iuc2V0LmNhbGwoY29tcG9uZW50LCB2YWx1ZSkgOiB2YWx1ZTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoaXNVbmRlZmluZWQoX2NvbXB1dGVkc1trZXldKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIF9jb21wdXRlZHNba2V5XTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBmdW5jdGlvbiByZWdpc3RlckV2ZW50KGNvbXBvbmVudCwgZXZlbnQsIGtleSkge1xuXG4gICAgICAgICAgICBpZiAoIWlzUGxhaW5PYmplY3QoZXZlbnQpKSB7XG4gICAgICAgICAgICAgICAgZXZlbnQgPSAoe25hbWU6IGtleSwgaGFuZGxlcjogZXZlbnR9KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdmFyIG5hbWUgPSBldmVudC5uYW1lO1xuICAgICAgICAgICAgdmFyIGVsID0gZXZlbnQuZWw7XG4gICAgICAgICAgICB2YXIgaGFuZGxlciA9IGV2ZW50LmhhbmRsZXI7XG4gICAgICAgICAgICB2YXIgY2FwdHVyZSA9IGV2ZW50LmNhcHR1cmU7XG4gICAgICAgICAgICB2YXIgcGFzc2l2ZSA9IGV2ZW50LnBhc3NpdmU7XG4gICAgICAgICAgICB2YXIgZGVsZWdhdGUgPSBldmVudC5kZWxlZ2F0ZTtcbiAgICAgICAgICAgIHZhciBmaWx0ZXIkJDEgPSBldmVudC5maWx0ZXI7XG4gICAgICAgICAgICB2YXIgc2VsZiA9IGV2ZW50LnNlbGY7XG4gICAgICAgICAgICBlbCA9IGlzRnVuY3Rpb24oZWwpXG4gICAgICAgICAgICAgICAgPyBlbC5jYWxsKGNvbXBvbmVudClcbiAgICAgICAgICAgICAgICA6IGVsIHx8IGNvbXBvbmVudC4kZWw7XG5cbiAgICAgICAgICAgIGlmIChpc0FycmF5KGVsKSkge1xuICAgICAgICAgICAgICAgIGVsLmZvckVhY2goZnVuY3Rpb24gKGVsKSB7IHJldHVybiByZWdpc3RlckV2ZW50KGNvbXBvbmVudCwgYXNzaWduKHt9LCBldmVudCwge2VsOiBlbH0pLCBrZXkpOyB9KTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICghZWwgfHwgZmlsdGVyJCQxICYmICFmaWx0ZXIkJDEuY2FsbChjb21wb25lbnQpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBoYW5kbGVyID0gZGV0YWlsKGlzU3RyaW5nKGhhbmRsZXIpID8gY29tcG9uZW50W2hhbmRsZXJdIDogYmluZChoYW5kbGVyLCBjb21wb25lbnQpKTtcblxuICAgICAgICAgICAgaWYgKHNlbGYpIHtcbiAgICAgICAgICAgICAgICBoYW5kbGVyID0gc2VsZkZpbHRlcihoYW5kbGVyKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29tcG9uZW50Ll9ldmVudHMucHVzaChcbiAgICAgICAgICAgICAgICBvbihcbiAgICAgICAgICAgICAgICAgICAgZWwsXG4gICAgICAgICAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICAgICAgICAgICFkZWxlZ2F0ZVxuICAgICAgICAgICAgICAgICAgICAgICAgPyBudWxsXG4gICAgICAgICAgICAgICAgICAgICAgICA6IGlzU3RyaW5nKGRlbGVnYXRlKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gZGVsZWdhdGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGRlbGVnYXRlLmNhbGwoY29tcG9uZW50KSxcbiAgICAgICAgICAgICAgICAgICAgaGFuZGxlcixcbiAgICAgICAgICAgICAgICAgICAgaXNCb29sZWFuKHBhc3NpdmUpXG4gICAgICAgICAgICAgICAgICAgICAgICA/IHtwYXNzaXZlOiBwYXNzaXZlLCBjYXB0dXJlOiBjYXB0dXJlfVxuICAgICAgICAgICAgICAgICAgICAgICAgOiBjYXB0dXJlXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgKTtcblxuICAgICAgICB9XG5cbiAgICAgICAgZnVuY3Rpb24gc2VsZkZpbHRlcihoYW5kbGVyKSB7XG4gICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gc2VsZkhhbmRsZXIoZSkge1xuICAgICAgICAgICAgICAgIGlmIChlLnRhcmdldCA9PT0gZS5jdXJyZW50VGFyZ2V0IHx8IGUudGFyZ2V0ID09PSBlLmN1cnJlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGhhbmRsZXIuY2FsbChudWxsLCBlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgZnVuY3Rpb24gbm90SW4ob3B0aW9ucywga2V5KSB7XG4gICAgICAgICAgICByZXR1cm4gb3B0aW9ucy5ldmVyeShmdW5jdGlvbiAoYXJyKSB7IHJldHVybiAhYXJyIHx8ICFoYXNPd24oYXJyLCBrZXkpOyB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZ1bmN0aW9uIGRldGFpbChsaXN0ZW5lcikge1xuICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChlKSB7IHJldHVybiBpc0FycmF5KGUuZGV0YWlsKSA/IGxpc3RlbmVyLmFwcGx5KHZvaWQgMCwgW2VdLmNvbmNhdChlLmRldGFpbCkpIDogbGlzdGVuZXIoZSk7IH07XG4gICAgICAgIH1cblxuICAgICAgICBmdW5jdGlvbiBjb2VyY2UodHlwZSwgdmFsdWUpIHtcblxuICAgICAgICAgICAgaWYgKHR5cGUgPT09IEJvb2xlYW4pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdG9Cb29sZWFuKHZhbHVlKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gTnVtYmVyKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRvTnVtYmVyKHZhbHVlKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ2xpc3QnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRvTGlzdCh2YWx1ZSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiB0eXBlID8gdHlwZSh2YWx1ZSkgOiB2YWx1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZ1bmN0aW9uIG5vcm1hbGl6ZURhdGEocmVmLCByZWYkMSkge1xuICAgICAgICAgICAgdmFyIGRhdGEkJDEgPSByZWYuZGF0YTtcbiAgICAgICAgICAgIHZhciBlbCA9IHJlZi5lbDtcbiAgICAgICAgICAgIHZhciBhcmdzID0gcmVmJDEuYXJncztcbiAgICAgICAgICAgIHZhciBwcm9wcyA9IHJlZiQxLnByb3BzOyBpZiAoIHByb3BzID09PSB2b2lkIDAgKSBwcm9wcyA9IHt9O1xuXG4gICAgICAgICAgICBkYXRhJCQxID0gaXNBcnJheShkYXRhJCQxKVxuICAgICAgICAgICAgICAgID8gYXJncyAmJiBhcmdzLmxlbmd0aFxuICAgICAgICAgICAgICAgICAgICA/IGRhdGEkJDEuc2xpY2UoMCwgYXJncy5sZW5ndGgpLnJlZHVjZShmdW5jdGlvbiAoZGF0YSQkMSwgdmFsdWUsIGluZGV4JCQxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNQbGFpbk9iamVjdCh2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3NpZ24oZGF0YSQkMSwgdmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhJCQxW2FyZ3NbaW5kZXgkJDFdXSA9IHZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRhdGEkJDE7XG4gICAgICAgICAgICAgICAgICAgIH0sIHt9KVxuICAgICAgICAgICAgICAgICAgICA6IHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgIDogZGF0YSQkMTtcblxuICAgICAgICAgICAgaWYgKGRhdGEkJDEpIHtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBrZXkgaW4gZGF0YSQkMSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoaXNVbmRlZmluZWQoZGF0YSQkMVtrZXldKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIGRhdGEkJDFba2V5XTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEkJDFba2V5XSA9IHByb3BzW2tleV0gPyBjb2VyY2UocHJvcHNba2V5XSwgZGF0YSQkMVtrZXldLCBlbCkgOiBkYXRhJCQxW2tleV07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBkYXRhJCQxO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaW5zdGFuY2VBUEkgKFVJa2l0KSB7XG5cbiAgICAgICAgdmFyIERBVEEgPSBVSWtpdC5kYXRhO1xuXG4gICAgICAgIFVJa2l0LnByb3RvdHlwZS4kbW91bnQgPSBmdW5jdGlvbiAoZWwpIHtcblxuICAgICAgICAgICAgdmFyIHJlZiA9IHRoaXMuJG9wdGlvbnM7XG4gICAgICAgICAgICB2YXIgbmFtZSA9IHJlZi5uYW1lO1xuXG4gICAgICAgICAgICBpZiAoIWVsW0RBVEFdKSB7XG4gICAgICAgICAgICAgICAgZWxbREFUQV0gPSB7fTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGVsW0RBVEFdW25hbWVdKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBlbFtEQVRBXVtuYW1lXSA9IHRoaXM7XG5cbiAgICAgICAgICAgIHRoaXMuJGVsID0gdGhpcy4kb3B0aW9ucy5lbCA9IHRoaXMuJG9wdGlvbnMuZWwgfHwgZWw7XG5cbiAgICAgICAgICAgIGlmICh3aXRoaW4oZWwsIGRvY3VtZW50KSkge1xuICAgICAgICAgICAgICAgIHRoaXMuX2NhbGxDb25uZWN0ZWQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgICBVSWtpdC5wcm90b3R5cGUuJGVtaXQgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgdGhpcy5fY2FsbFVwZGF0ZShlKTtcbiAgICAgICAgfTtcblxuICAgICAgICBVSWtpdC5wcm90b3R5cGUuJHJlc2V0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdGhpcy5fY2FsbERpc2Nvbm5lY3RlZCgpO1xuICAgICAgICAgICAgdGhpcy5fY2FsbENvbm5lY3RlZCgpO1xuICAgICAgICB9O1xuXG4gICAgICAgIFVJa2l0LnByb3RvdHlwZS4kZGVzdHJveSA9IGZ1bmN0aW9uIChyZW1vdmVFbCkge1xuICAgICAgICAgICAgaWYgKCByZW1vdmVFbCA9PT0gdm9pZCAwICkgcmVtb3ZlRWwgPSBmYWxzZTtcblxuXG4gICAgICAgICAgICB2YXIgcmVmID0gdGhpcy4kb3B0aW9ucztcbiAgICAgICAgICAgIHZhciBlbCA9IHJlZi5lbDtcbiAgICAgICAgICAgIHZhciBuYW1lID0gcmVmLm5hbWU7XG5cbiAgICAgICAgICAgIGlmIChlbCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX2NhbGxEaXNjb25uZWN0ZWQoKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5fY2FsbEhvb2soJ2Rlc3Ryb3knKTtcblxuICAgICAgICAgICAgaWYgKCFlbCB8fCAhZWxbREFUQV0pIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGRlbGV0ZSBlbFtEQVRBXVtuYW1lXTtcblxuICAgICAgICAgICAgaWYgKCFPYmplY3Qua2V5cyhlbFtEQVRBXSkubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgZGVsZXRlIGVsW0RBVEFdO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAocmVtb3ZlRWwpIHtcbiAgICAgICAgICAgICAgICByZW1vdmUodGhpcy4kZWwpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIFVJa2l0LnByb3RvdHlwZS4kY3JlYXRlID0gZnVuY3Rpb24gKGNvbXBvbmVudCwgZWxlbWVudCwgZGF0YSQkMSkge1xuICAgICAgICAgICAgcmV0dXJuIFVJa2l0W2NvbXBvbmVudF0oZWxlbWVudCwgZGF0YSQkMSk7XG4gICAgICAgIH07XG5cbiAgICAgICAgVUlraXQucHJvdG90eXBlLiR1cGRhdGUgPSBVSWtpdC51cGRhdGU7XG4gICAgICAgIFVJa2l0LnByb3RvdHlwZS4kZ2V0Q29tcG9uZW50ID0gVUlraXQuZ2V0Q29tcG9uZW50O1xuXG4gICAgICAgIHZhciBuYW1lcyA9IHt9O1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyhVSWtpdC5wcm90b3R5cGUsIHtcblxuICAgICAgICAgICAgJGNvbnRhaW5lcjogT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihVSWtpdCwgJ2NvbnRhaW5lcicpLFxuXG4gICAgICAgICAgICAkbmFtZToge1xuXG4gICAgICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHJlZiA9IHRoaXMuJG9wdGlvbnM7XG4gICAgICAgICAgICAgICAgICAgIHZhciBuYW1lID0gcmVmLm5hbWU7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKCFuYW1lc1tuYW1lXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXNbbmFtZV0gPSBVSWtpdC5wcmVmaXggKyBoeXBoZW5hdGUobmFtZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmFtZXNbbmFtZV07XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgfSk7XG5cbiAgICB9XG5cbiAgICB2YXIgVUlraXQgPSBmdW5jdGlvbiAob3B0aW9ucykge1xuICAgICAgICB0aGlzLl9pbml0KG9wdGlvbnMpO1xuICAgIH07XG5cbiAgICBVSWtpdC51dGlsID0gdXRpbDtcbiAgICBVSWtpdC5kYXRhID0gJ19fdWlraXRfXyc7XG4gICAgVUlraXQucHJlZml4ID0gJ3VrLSc7XG4gICAgVUlraXQub3B0aW9ucyA9IHt9O1xuXG4gICAgZ2xvYmFsQVBJKFVJa2l0KTtcbiAgICBob29rc0FQSShVSWtpdCk7XG4gICAgc3RhdGVBUEkoVUlraXQpO1xuICAgIGNvbXBvbmVudEFQSShVSWtpdCk7XG4gICAgaW5zdGFuY2VBUEkoVUlraXQpO1xuXG4gICAgdmFyIENsYXNzID0ge1xuXG4gICAgICAgIGNvbm5lY3RlZDogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAhaGFzQ2xhc3ModGhpcy4kZWwsIHRoaXMuJG5hbWUpICYmIGFkZENsYXNzKHRoaXMuJGVsLCB0aGlzLiRuYW1lKTtcbiAgICAgICAgfVxuXG4gICAgfTtcblxuICAgIHZhciBUb2dnbGFibGUgPSB7XG5cbiAgICAgICAgcHJvcHM6IHtcbiAgICAgICAgICAgIGNsczogQm9vbGVhbixcbiAgICAgICAgICAgIGFuaW1hdGlvbjogJ2xpc3QnLFxuICAgICAgICAgICAgZHVyYXRpb246IE51bWJlcixcbiAgICAgICAgICAgIG9yaWdpbjogU3RyaW5nLFxuICAgICAgICAgICAgdHJhbnNpdGlvbjogU3RyaW5nLFxuICAgICAgICAgICAgcXVldWVkOiBCb29sZWFuXG4gICAgICAgIH0sXG5cbiAgICAgICAgZGF0YToge1xuICAgICAgICAgICAgY2xzOiBmYWxzZSxcbiAgICAgICAgICAgIGFuaW1hdGlvbjogW2ZhbHNlXSxcbiAgICAgICAgICAgIGR1cmF0aW9uOiAyMDAsXG4gICAgICAgICAgICBvcmlnaW46IGZhbHNlLFxuICAgICAgICAgICAgdHJhbnNpdGlvbjogJ2xpbmVhcicsXG4gICAgICAgICAgICBxdWV1ZWQ6IGZhbHNlLFxuXG4gICAgICAgICAgICBpbml0UHJvcHM6IHtcbiAgICAgICAgICAgICAgICBvdmVyZmxvdzogJycsXG4gICAgICAgICAgICAgICAgaGVpZ2h0OiAnJyxcbiAgICAgICAgICAgICAgICBwYWRkaW5nVG9wOiAnJyxcbiAgICAgICAgICAgICAgICBwYWRkaW5nQm90dG9tOiAnJyxcbiAgICAgICAgICAgICAgICBtYXJnaW5Ub3A6ICcnLFxuICAgICAgICAgICAgICAgIG1hcmdpbkJvdHRvbTogJydcbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIGhpZGVQcm9wczoge1xuICAgICAgICAgICAgICAgIG92ZXJmbG93OiAnaGlkZGVuJyxcbiAgICAgICAgICAgICAgICBoZWlnaHQ6IDAsXG4gICAgICAgICAgICAgICAgcGFkZGluZ1RvcDogMCxcbiAgICAgICAgICAgICAgICBwYWRkaW5nQm90dG9tOiAwLFxuICAgICAgICAgICAgICAgIG1hcmdpblRvcDogMCxcbiAgICAgICAgICAgICAgICBtYXJnaW5Cb3R0b206IDBcbiAgICAgICAgICAgIH1cblxuICAgICAgICB9LFxuXG4gICAgICAgIGNvbXB1dGVkOiB7XG5cbiAgICAgICAgICAgIGhhc0FuaW1hdGlvbjogZnVuY3Rpb24ocmVmKSB7XG4gICAgICAgICAgICAgICAgdmFyIGFuaW1hdGlvbiA9IHJlZi5hbmltYXRpb247XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gISFhbmltYXRpb25bMF07XG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICBoYXNUcmFuc2l0aW9uOiBmdW5jdGlvbihyZWYpIHtcbiAgICAgICAgICAgICAgICB2YXIgYW5pbWF0aW9uID0gcmVmLmFuaW1hdGlvbjtcblxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmhhc0FuaW1hdGlvbiAmJiBhbmltYXRpb25bMF0gPT09IHRydWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgfSxcblxuICAgICAgICBtZXRob2RzOiB7XG5cbiAgICAgICAgICAgIHRvZ2dsZUVsZW1lbnQ6IGZ1bmN0aW9uKHRhcmdldHMsIHNob3csIGFuaW1hdGUkJDEpIHtcbiAgICAgICAgICAgICAgICB2YXIgdGhpcyQxID0gdGhpcztcblxuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSkge1xuXG4gICAgICAgICAgICAgICAgICAgIHRhcmdldHMgPSB0b05vZGVzKHRhcmdldHMpO1xuXG4gICAgICAgICAgICAgICAgICAgIHZhciBhbGwgPSBmdW5jdGlvbiAodGFyZ2V0cykgeyByZXR1cm4gUHJvbWlzZS5hbGwodGFyZ2V0cy5tYXAoZnVuY3Rpb24gKGVsKSB7IHJldHVybiB0aGlzJDEuX3RvZ2dsZUVsZW1lbnQoZWwsIHNob3csIGFuaW1hdGUkJDEpOyB9KSk7IH07XG4gICAgICAgICAgICAgICAgICAgIHZhciB0b2dnbGVkID0gdGFyZ2V0cy5maWx0ZXIoZnVuY3Rpb24gKGVsKSB7IHJldHVybiB0aGlzJDEuaXNUb2dnbGVkKGVsKTsgfSk7XG4gICAgICAgICAgICAgICAgICAgIHZhciB1bnRvZ2dsZWQgPSB0YXJnZXRzLmZpbHRlcihmdW5jdGlvbiAoZWwpIHsgcmV0dXJuICFpbmNsdWRlcyh0b2dnbGVkLCBlbCk7IH0pO1xuXG4gICAgICAgICAgICAgICAgICAgIHZhciBwO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmICghdGhpcyQxLnF1ZXVlZCB8fCAhaXNVbmRlZmluZWQoYW5pbWF0ZSQkMSkgfHwgIWlzVW5kZWZpbmVkKHNob3cpIHx8ICF0aGlzJDEuaGFzQW5pbWF0aW9uIHx8IHRhcmdldHMubGVuZ3RoIDwgMikge1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBwID0gYWxsKHVudG9nZ2xlZC5jb25jYXQodG9nZ2xlZCkpO1xuXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBib2R5ID0gZG9jdW1lbnQuYm9keTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzY3JvbGwgPSBib2R5LnNjcm9sbFRvcDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlbCA9IHRvZ2dsZWRbMF07XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgaW5Qcm9ncmVzcyA9IEFuaW1hdGlvbi5pblByb2dyZXNzKGVsKSAmJiBoYXNDbGFzcyhlbCwgJ3VrLWFuaW1hdGlvbi1sZWF2ZScpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IFRyYW5zaXRpb24uaW5Qcm9ncmVzcyhlbCkgJiYgZWwuc3R5bGUuaGVpZ2h0ID09PSAnMHB4JztcblxuICAgICAgICAgICAgICAgICAgICAgICAgcCA9IGFsbCh0b2dnbGVkKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpblByb2dyZXNzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcCA9IHAudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBwID0gYWxsKHVudG9nZ2xlZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvZHkuc2Nyb2xsVG9wID0gc2Nyb2xsO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgcC50aGVuKHJlc29sdmUsIG5vb3ApO1xuXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICB0b2dnbGVOb3c6IGZ1bmN0aW9uKHRhcmdldHMsIHNob3cpIHtcbiAgICAgICAgICAgICAgICB2YXIgdGhpcyQxID0gdGhpcztcblxuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXR1cm4gUHJvbWlzZS5hbGwodG9Ob2Rlcyh0YXJnZXRzKS5tYXAoZnVuY3Rpb24gKGVsKSB7IHJldHVybiB0aGlzJDEuX3RvZ2dsZUVsZW1lbnQoZWwsIHNob3csIGZhbHNlKTsgfSkpLnRoZW4ocmVzb2x2ZSwgbm9vcCk7IH0pO1xuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgaXNUb2dnbGVkOiBmdW5jdGlvbihlbCkge1xuICAgICAgICAgICAgICAgIHZhciBub2RlcyA9IHRvTm9kZXMoZWwgfHwgdGhpcy4kZWwpO1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmNsc1xuICAgICAgICAgICAgICAgICAgICA/IGhhc0NsYXNzKG5vZGVzLCB0aGlzLmNscy5zcGxpdCgnICcpWzBdKVxuICAgICAgICAgICAgICAgICAgICA6ICFoYXNBdHRyKG5vZGVzLCAnaGlkZGVuJyk7XG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICB1cGRhdGVBcmlhOiBmdW5jdGlvbihlbCkge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmNscyA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgYXR0cihlbCwgJ2FyaWEtaGlkZGVuJywgIXRoaXMuaXNUb2dnbGVkKGVsKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgX3RvZ2dsZUVsZW1lbnQ6IGZ1bmN0aW9uKGVsLCBzaG93LCBhbmltYXRlJCQxKSB7XG4gICAgICAgICAgICAgICAgdmFyIHRoaXMkMSA9IHRoaXM7XG5cblxuICAgICAgICAgICAgICAgIHNob3cgPSBpc0Jvb2xlYW4oc2hvdylcbiAgICAgICAgICAgICAgICAgICAgPyBzaG93XG4gICAgICAgICAgICAgICAgICAgIDogQW5pbWF0aW9uLmluUHJvZ3Jlc3MoZWwpXG4gICAgICAgICAgICAgICAgICAgICAgICA/IGhhc0NsYXNzKGVsLCAndWstYW5pbWF0aW9uLWxlYXZlJylcbiAgICAgICAgICAgICAgICAgICAgICAgIDogVHJhbnNpdGlvbi5pblByb2dyZXNzKGVsKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gZWwuc3R5bGUuaGVpZ2h0ID09PSAnMHB4J1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogIXRoaXMuaXNUb2dnbGVkKGVsKTtcblxuICAgICAgICAgICAgICAgIGlmICghdHJpZ2dlcihlbCwgKFwiYmVmb3JlXCIgKyAoc2hvdyA/ICdzaG93JyA6ICdoaWRlJykpLCBbdGhpc10pKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdCgpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHZhciBwcm9taXNlID0gKFxuICAgICAgICAgICAgICAgICAgICBpc0Z1bmN0aW9uKGFuaW1hdGUkJDEpXG4gICAgICAgICAgICAgICAgICAgICAgICA/IGFuaW1hdGUkJDFcbiAgICAgICAgICAgICAgICAgICAgICAgIDogYW5pbWF0ZSQkMSA9PT0gZmFsc2UgfHwgIXRoaXMuaGFzQW5pbWF0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPyB0aGlzLl90b2dnbGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHRoaXMuaGFzVHJhbnNpdGlvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IHRvZ2dsZUhlaWdodCh0aGlzKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHRvZ2dsZUFuaW1hdGlvbih0aGlzKVxuICAgICAgICAgICAgICAgICkoZWwsIHNob3cpO1xuXG4gICAgICAgICAgICAgICAgdHJpZ2dlcihlbCwgc2hvdyA/ICdzaG93JyA6ICdoaWRlJywgW3RoaXNdKTtcblxuICAgICAgICAgICAgICAgIHZhciBmaW5hbCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgdHJpZ2dlcihlbCwgc2hvdyA/ICdzaG93bicgOiAnaGlkZGVuJywgW3RoaXMkMV0pO1xuICAgICAgICAgICAgICAgICAgICB0aGlzJDEuJHVwZGF0ZShlbCk7XG4gICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgIHJldHVybiBwcm9taXNlID8gcHJvbWlzZS50aGVuKGZpbmFsKSA6IFByb21pc2UucmVzb2x2ZShmaW5hbCgpKTtcbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIF90b2dnbGU6IGZ1bmN0aW9uKGVsLCB0b2dnbGVkKSB7XG5cbiAgICAgICAgICAgICAgICBpZiAoIWVsKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB0b2dnbGVkID0gQm9vbGVhbih0b2dnbGVkKTtcblxuICAgICAgICAgICAgICAgIHZhciBjaGFuZ2VkO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmNscykge1xuICAgICAgICAgICAgICAgICAgICBjaGFuZ2VkID0gaW5jbHVkZXModGhpcy5jbHMsICcgJykgfHwgdG9nZ2xlZCAhPT0gaGFzQ2xhc3MoZWwsIHRoaXMuY2xzKTtcbiAgICAgICAgICAgICAgICAgICAgY2hhbmdlZCAmJiB0b2dnbGVDbGFzcyhlbCwgdGhpcy5jbHMsIGluY2x1ZGVzKHRoaXMuY2xzLCAnICcpID8gdW5kZWZpbmVkIDogdG9nZ2xlZCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY2hhbmdlZCA9IHRvZ2dsZWQgPT09IGhhc0F0dHIoZWwsICdoaWRkZW4nKTtcbiAgICAgICAgICAgICAgICAgICAgY2hhbmdlZCAmJiBhdHRyKGVsLCAnaGlkZGVuJywgIXRvZ2dsZWQgPyAnJyA6IG51bGwpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICQkKCdbYXV0b2ZvY3VzXScsIGVsKS5zb21lKGZ1bmN0aW9uIChlbCkgeyByZXR1cm4gaXNWaXNpYmxlKGVsKSA/IGVsLmZvY3VzKCkgfHwgdHJ1ZSA6IGVsLmJsdXIoKTsgfSk7XG5cbiAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZUFyaWEoZWwpO1xuICAgICAgICAgICAgICAgIGNoYW5nZWQgJiYgdGhpcy4kdXBkYXRlKGVsKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICB9XG5cbiAgICB9O1xuXG4gICAgZnVuY3Rpb24gdG9nZ2xlSGVpZ2h0KHJlZikge1xuICAgICAgICB2YXIgaXNUb2dnbGVkID0gcmVmLmlzVG9nZ2xlZDtcbiAgICAgICAgdmFyIGR1cmF0aW9uID0gcmVmLmR1cmF0aW9uO1xuICAgICAgICB2YXIgaW5pdFByb3BzID0gcmVmLmluaXRQcm9wcztcbiAgICAgICAgdmFyIGhpZGVQcm9wcyA9IHJlZi5oaWRlUHJvcHM7XG4gICAgICAgIHZhciB0cmFuc2l0aW9uJCQxID0gcmVmLnRyYW5zaXRpb247XG4gICAgICAgIHZhciBfdG9nZ2xlID0gcmVmLl90b2dnbGU7XG5cbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChlbCwgc2hvdykge1xuXG4gICAgICAgICAgICB2YXIgaW5Qcm9ncmVzcyA9IFRyYW5zaXRpb24uaW5Qcm9ncmVzcyhlbCk7XG4gICAgICAgICAgICB2YXIgaW5uZXIgPSBlbC5oYXNDaGlsZE5vZGVzID8gdG9GbG9hdChjc3MoZWwuZmlyc3RFbGVtZW50Q2hpbGQsICdtYXJnaW5Ub3AnKSkgKyB0b0Zsb2F0KGNzcyhlbC5sYXN0RWxlbWVudENoaWxkLCAnbWFyZ2luQm90dG9tJykpIDogMDtcbiAgICAgICAgICAgIHZhciBjdXJyZW50SGVpZ2h0ID0gaXNWaXNpYmxlKGVsKSA/IGhlaWdodChlbCkgKyAoaW5Qcm9ncmVzcyA/IDAgOiBpbm5lcikgOiAwO1xuXG4gICAgICAgICAgICBUcmFuc2l0aW9uLmNhbmNlbChlbCk7XG5cbiAgICAgICAgICAgIGlmICghaXNUb2dnbGVkKGVsKSkge1xuICAgICAgICAgICAgICAgIF90b2dnbGUoZWwsIHRydWUpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBoZWlnaHQoZWwsICcnKTtcblxuICAgICAgICAgICAgLy8gVXBkYXRlIGNoaWxkIGNvbXBvbmVudHMgZmlyc3RcbiAgICAgICAgICAgIGZhc3Rkb20uZmx1c2goKTtcblxuICAgICAgICAgICAgdmFyIGVuZEhlaWdodCA9IGhlaWdodChlbCkgKyAoaW5Qcm9ncmVzcyA/IDAgOiBpbm5lcik7XG4gICAgICAgICAgICBoZWlnaHQoZWwsIGN1cnJlbnRIZWlnaHQpO1xuXG4gICAgICAgICAgICByZXR1cm4gKHNob3dcbiAgICAgICAgICAgICAgICAgICAgPyBUcmFuc2l0aW9uLnN0YXJ0KGVsLCBhc3NpZ24oe30sIGluaXRQcm9wcywge292ZXJmbG93OiAnaGlkZGVuJywgaGVpZ2h0OiBlbmRIZWlnaHR9KSwgTWF0aC5yb3VuZChkdXJhdGlvbiAqICgxIC0gY3VycmVudEhlaWdodCAvIGVuZEhlaWdodCkpLCB0cmFuc2l0aW9uJCQxKVxuICAgICAgICAgICAgICAgICAgICA6IFRyYW5zaXRpb24uc3RhcnQoZWwsIGhpZGVQcm9wcywgTWF0aC5yb3VuZChkdXJhdGlvbiAqIChjdXJyZW50SGVpZ2h0IC8gZW5kSGVpZ2h0KSksIHRyYW5zaXRpb24kJDEpLnRoZW4oZnVuY3Rpb24gKCkgeyByZXR1cm4gX3RvZ2dsZShlbCwgZmFsc2UpOyB9KVxuICAgICAgICAgICAgKS50aGVuKGZ1bmN0aW9uICgpIHsgcmV0dXJuIGNzcyhlbCwgaW5pdFByb3BzKTsgfSk7XG5cbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiB0b2dnbGVBbmltYXRpb24ocmVmKSB7XG4gICAgICAgIHZhciBhbmltYXRpb24gPSByZWYuYW5pbWF0aW9uO1xuICAgICAgICB2YXIgZHVyYXRpb24gPSByZWYuZHVyYXRpb247XG4gICAgICAgIHZhciBvcmlnaW4gPSByZWYub3JpZ2luO1xuICAgICAgICB2YXIgX3RvZ2dsZSA9IHJlZi5fdG9nZ2xlO1xuXG4gICAgICAgIHJldHVybiBmdW5jdGlvbiAoZWwsIHNob3cpIHtcblxuICAgICAgICAgICAgQW5pbWF0aW9uLmNhbmNlbChlbCk7XG5cbiAgICAgICAgICAgIGlmIChzaG93KSB7XG4gICAgICAgICAgICAgICAgX3RvZ2dsZShlbCwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIEFuaW1hdGlvbi5pbihlbCwgYW5pbWF0aW9uWzBdLCBkdXJhdGlvbiwgb3JpZ2luKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIEFuaW1hdGlvbi5vdXQoZWwsIGFuaW1hdGlvblsxXSB8fCBhbmltYXRpb25bMF0sIGR1cmF0aW9uLCBvcmlnaW4pLnRoZW4oZnVuY3Rpb24gKCkgeyByZXR1cm4gX3RvZ2dsZShlbCwgZmFsc2UpOyB9KTtcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICB2YXIgQWNjb3JkaW9uID0ge1xuXG4gICAgICAgIG1peGluczogW0NsYXNzLCBUb2dnbGFibGVdLFxuXG4gICAgICAgIHByb3BzOiB7XG4gICAgICAgICAgICB0YXJnZXRzOiBTdHJpbmcsXG4gICAgICAgICAgICBhY3RpdmU6IG51bGwsXG4gICAgICAgICAgICBjb2xsYXBzaWJsZTogQm9vbGVhbixcbiAgICAgICAgICAgIG11bHRpcGxlOiBCb29sZWFuLFxuICAgICAgICAgICAgdG9nZ2xlOiBTdHJpbmcsXG4gICAgICAgICAgICBjb250ZW50OiBTdHJpbmcsXG4gICAgICAgICAgICB0cmFuc2l0aW9uOiBTdHJpbmdcbiAgICAgICAgfSxcblxuICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgICB0YXJnZXRzOiAnPiAqJyxcbiAgICAgICAgICAgIGFjdGl2ZTogZmFsc2UsXG4gICAgICAgICAgICBhbmltYXRpb246IFt0cnVlXSxcbiAgICAgICAgICAgIGNvbGxhcHNpYmxlOiB0cnVlLFxuICAgICAgICAgICAgbXVsdGlwbGU6IGZhbHNlLFxuICAgICAgICAgICAgY2xzT3BlbjogJ3VrLW9wZW4nLFxuICAgICAgICAgICAgdG9nZ2xlOiAnPiAudWstYWNjb3JkaW9uLXRpdGxlJyxcbiAgICAgICAgICAgIGNvbnRlbnQ6ICc+IC51ay1hY2NvcmRpb24tY29udGVudCcsXG4gICAgICAgICAgICB0cmFuc2l0aW9uOiAnZWFzZSdcbiAgICAgICAgfSxcblxuICAgICAgICBjb21wdXRlZDoge1xuXG4gICAgICAgICAgICBpdGVtczogZnVuY3Rpb24ocmVmLCAkZWwpIHtcbiAgICAgICAgICAgICAgICB2YXIgdGFyZ2V0cyA9IHJlZi50YXJnZXRzO1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuICQkKHRhcmdldHMsICRlbCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgfSxcblxuICAgICAgICBldmVudHM6IFtcblxuICAgICAgICAgICAge1xuXG4gICAgICAgICAgICAgICAgbmFtZTogJ2NsaWNrJyxcblxuICAgICAgICAgICAgICAgIGRlbGVnYXRlOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICgodGhpcy50YXJnZXRzKSArIFwiIFwiICsgKHRoaXMuJHByb3BzLnRvZ2dsZSkpO1xuICAgICAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgICAgICBoYW5kbGVyOiBmdW5jdGlvbihlKSB7XG4gICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50b2dnbGUoaW5kZXgoJCQoKCh0aGlzLnRhcmdldHMpICsgXCIgXCIgKyAodGhpcy4kcHJvcHMudG9nZ2xlKSksIHRoaXMuJGVsKSwgZS5jdXJyZW50KSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgXSxcblxuICAgICAgICBjb25uZWN0ZWQ6IGZ1bmN0aW9uKCkge1xuXG4gICAgICAgICAgICBpZiAodGhpcy5hY3RpdmUgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB2YXIgYWN0aXZlID0gdGhpcy5pdGVtc1tOdW1iZXIodGhpcy5hY3RpdmUpXTtcbiAgICAgICAgICAgIGlmIChhY3RpdmUgJiYgIWhhc0NsYXNzKGFjdGl2ZSwgdGhpcy5jbHNPcGVuKSkge1xuICAgICAgICAgICAgICAgIHRoaXMudG9nZ2xlKGFjdGl2ZSwgZmFsc2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuXG4gICAgICAgIHVwZGF0ZTogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICB2YXIgdGhpcyQxID0gdGhpcztcblxuXG4gICAgICAgICAgICB0aGlzLml0ZW1zLmZvckVhY2goZnVuY3Rpb24gKGVsKSB7IHJldHVybiB0aGlzJDEuX3RvZ2dsZSgkKHRoaXMkMS5jb250ZW50LCBlbCksIGhhc0NsYXNzKGVsLCB0aGlzJDEuY2xzT3BlbikpOyB9KTtcblxuICAgICAgICAgICAgdmFyIGFjdGl2ZSA9ICF0aGlzLmNvbGxhcHNpYmxlICYmICFoYXNDbGFzcyh0aGlzLml0ZW1zLCB0aGlzLmNsc09wZW4pICYmIHRoaXMuaXRlbXNbMF07XG4gICAgICAgICAgICBpZiAoYWN0aXZlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy50b2dnbGUoYWN0aXZlLCBmYWxzZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG5cbiAgICAgICAgbWV0aG9kczoge1xuXG4gICAgICAgICAgICB0b2dnbGU6IGZ1bmN0aW9uKGl0ZW0sIGFuaW1hdGUkJDEpIHtcbiAgICAgICAgICAgICAgICB2YXIgdGhpcyQxID0gdGhpcztcblxuXG4gICAgICAgICAgICAgICAgdmFyIGluZGV4JCQxID0gZ2V0SW5kZXgoaXRlbSwgdGhpcy5pdGVtcyk7XG4gICAgICAgICAgICAgICAgdmFyIGFjdGl2ZSA9IGZpbHRlcih0aGlzLml0ZW1zLCAoXCIuXCIgKyAodGhpcy5jbHNPcGVuKSkpO1xuXG4gICAgICAgICAgICAgICAgaXRlbSA9IHRoaXMuaXRlbXNbaW5kZXgkJDFdO1xuXG4gICAgICAgICAgICAgICAgaXRlbSAmJiBbaXRlbV1cbiAgICAgICAgICAgICAgICAgICAgLmNvbmNhdCghdGhpcy5tdWx0aXBsZSAmJiAhaW5jbHVkZXMoYWN0aXZlLCBpdGVtKSAmJiBhY3RpdmUgfHwgW10pXG4gICAgICAgICAgICAgICAgICAgIC5mb3JFYWNoKGZ1bmN0aW9uIChlbCkge1xuXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgaXNJdGVtID0gZWwgPT09IGl0ZW07XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgc3RhdGUgPSBpc0l0ZW0gJiYgIWhhc0NsYXNzKGVsLCB0aGlzJDEuY2xzT3Blbik7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghc3RhdGUgJiYgaXNJdGVtICYmICF0aGlzJDEuY29sbGFwc2libGUgJiYgYWN0aXZlLmxlbmd0aCA8IDIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHRvZ2dsZUNsYXNzKGVsLCB0aGlzJDEuY2xzT3Blbiwgc3RhdGUpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgY29udGVudCA9IGVsLl93cmFwcGVyID8gZWwuX3dyYXBwZXIuZmlyc3RFbGVtZW50Q2hpbGQgOiAkKHRoaXMkMS5jb250ZW50LCBlbCk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZWwuX3dyYXBwZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbC5fd3JhcHBlciA9IHdyYXBBbGwoY29udGVudCwgJzxkaXY+Jyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cihlbC5fd3JhcHBlciwgJ2hpZGRlbicsIHN0YXRlID8gJycgOiBudWxsKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcyQxLl90b2dnbGUoY29udGVudCwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzJDEudG9nZ2xlRWxlbWVudChlbC5fd3JhcHBlciwgc3RhdGUsIGFuaW1hdGUkJDEpLnRoZW4oZnVuY3Rpb24gKCkge1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGhhc0NsYXNzKGVsLCB0aGlzJDEuY2xzT3BlbikgIT09IHN0YXRlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXN0YXRlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMkMS5fdG9nZ2xlKGNvbnRlbnQsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbC5fd3JhcHBlciA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdW53cmFwKGNvbnRlbnQpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICB9XG5cbiAgICB9O1xuXG4gICAgdmFyIEFsZXJ0ID0ge1xuXG4gICAgICAgIG1peGluczogW0NsYXNzLCBUb2dnbGFibGVdLFxuXG4gICAgICAgIGFyZ3M6ICdhbmltYXRpb24nLFxuXG4gICAgICAgIHByb3BzOiB7XG4gICAgICAgICAgICBjbG9zZTogU3RyaW5nXG4gICAgICAgIH0sXG5cbiAgICAgICAgZGF0YToge1xuICAgICAgICAgICAgYW5pbWF0aW9uOiBbdHJ1ZV0sXG4gICAgICAgICAgICBzZWxDbG9zZTogJy51ay1hbGVydC1jbG9zZScsXG4gICAgICAgICAgICBkdXJhdGlvbjogMTUwLFxuICAgICAgICAgICAgaGlkZVByb3BzOiBhc3NpZ24oe29wYWNpdHk6IDB9LCBUb2dnbGFibGUuZGF0YS5oaWRlUHJvcHMpXG4gICAgICAgIH0sXG5cbiAgICAgICAgZXZlbnRzOiBbXG5cbiAgICAgICAgICAgIHtcblxuICAgICAgICAgICAgICAgIG5hbWU6ICdjbGljaycsXG5cbiAgICAgICAgICAgICAgICBkZWxlZ2F0ZTogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnNlbENsb3NlO1xuICAgICAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgICAgICBoYW5kbGVyOiBmdW5jdGlvbihlKSB7XG4gICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jbG9zZSgpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgfVxuXG4gICAgICAgIF0sXG5cbiAgICAgICAgbWV0aG9kczoge1xuXG4gICAgICAgICAgICBjbG9zZTogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgdmFyIHRoaXMkMSA9IHRoaXM7XG5cbiAgICAgICAgICAgICAgICB0aGlzLnRvZ2dsZUVsZW1lbnQodGhpcy4kZWwpLnRoZW4oZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpcyQxLiRkZXN0cm95KHRydWUpOyB9KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICB9XG5cbiAgICB9O1xuXG4gICAgZnVuY3Rpb24gQ29yZSAoVUlraXQpIHtcblxuICAgICAgICByZWFkeShmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgICAgIFVJa2l0LnVwZGF0ZSgpO1xuICAgICAgICAgICAgb24od2luZG93LCAnbG9hZCByZXNpemUnLCBmdW5jdGlvbiAoKSB7IHJldHVybiBVSWtpdC51cGRhdGUobnVsbCwgJ3Jlc2l6ZScpOyB9KTtcbiAgICAgICAgICAgIG9uKGRvY3VtZW50LCAnbG9hZGVkbWV0YWRhdGEgbG9hZCcsIGZ1bmN0aW9uIChyZWYpIHtcbiAgICAgICAgICAgICAgICB2YXIgdGFyZ2V0ID0gcmVmLnRhcmdldDtcblxuICAgICAgICAgICAgICAgIHJldHVybiBVSWtpdC51cGRhdGUodGFyZ2V0LCAncmVzaXplJyk7XG4gICAgICAgICAgICB9LCB0cnVlKTtcblxuICAgICAgICAgICAgLy8gdGhyb3R0bGUgYHNjcm9sbGAgZXZlbnQgKFNhZmFyaSB0cmlnZ2VycyBtdWx0aXBsZSBgc2Nyb2xsYCBldmVudHMgcGVyIGZyYW1lKVxuICAgICAgICAgICAgdmFyIHBlbmRpbmc7XG4gICAgICAgICAgICBvbih3aW5kb3csICdzY3JvbGwnLCBmdW5jdGlvbiAoZSkge1xuXG4gICAgICAgICAgICAgICAgaWYgKHBlbmRpbmcpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBwZW5kaW5nID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBmYXN0ZG9tLndyaXRlKGZ1bmN0aW9uICgpIHsgcmV0dXJuIHBlbmRpbmcgPSBmYWxzZTsgfSk7XG5cbiAgICAgICAgICAgICAgICB2YXIgdGFyZ2V0ID0gZS50YXJnZXQ7XG4gICAgICAgICAgICAgICAgVUlraXQudXBkYXRlKHRhcmdldC5ub2RlVHlwZSAhPT0gMSA/IGRvY3VtZW50LmJvZHkgOiB0YXJnZXQsIGUudHlwZSk7XG5cbiAgICAgICAgICAgIH0sIHtwYXNzaXZlOiB0cnVlLCBjYXB0dXJlOiB0cnVlfSk7XG5cbiAgICAgICAgICAgIHZhciBzdGFydGVkID0gMDtcbiAgICAgICAgICAgIG9uKGRvY3VtZW50LCAnYW5pbWF0aW9uc3RhcnQnLCBmdW5jdGlvbiAocmVmKSB7XG4gICAgICAgICAgICAgICAgdmFyIHRhcmdldCA9IHJlZi50YXJnZXQ7XG5cbiAgICAgICAgICAgICAgICBpZiAoKGNzcyh0YXJnZXQsICdhbmltYXRpb25OYW1lJykgfHwgJycpLm1hdGNoKC9edWstLioobGVmdHxyaWdodCkvKSkge1xuXG4gICAgICAgICAgICAgICAgICAgIHN0YXJ0ZWQrKztcbiAgICAgICAgICAgICAgICAgICAgY3NzKGRvY3VtZW50LmJvZHksICdvdmVyZmxvd1gnLCAnaGlkZGVuJyk7XG4gICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEtLXN0YXJ0ZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjc3MoZG9jdW1lbnQuYm9keSwgJ292ZXJmbG93WCcsICcnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSwgdG9Ncyhjc3ModGFyZ2V0LCAnYW5pbWF0aW9uRHVyYXRpb24nKSkgKyAxMDApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sIHRydWUpO1xuXG4gICAgICAgIH0pO1xuXG4gICAgfVxuXG4gICAgdmFyIFZpZGVvID0ge1xuXG4gICAgICAgIGFyZ3M6ICdhdXRvcGxheScsXG5cbiAgICAgICAgcHJvcHM6IHtcbiAgICAgICAgICAgIGF1dG9tdXRlOiBCb29sZWFuLFxuICAgICAgICAgICAgYXV0b3BsYXk6IEJvb2xlYW4sXG4gICAgICAgIH0sXG5cbiAgICAgICAgZGF0YToge1xuICAgICAgICAgICAgYXV0b211dGU6IGZhbHNlLFxuICAgICAgICAgICAgYXV0b3BsYXk6IHRydWVcbiAgICAgICAgfSxcblxuICAgICAgICBjb21wdXRlZDoge1xuXG4gICAgICAgICAgICBpblZpZXc6IGZ1bmN0aW9uKHJlZikge1xuICAgICAgICAgICAgICAgIHZhciBhdXRvcGxheSA9IHJlZi5hdXRvcGxheTtcblxuICAgICAgICAgICAgICAgIHJldHVybiBhdXRvcGxheSA9PT0gJ2ludmlldyc7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgfSxcblxuICAgICAgICBjb25uZWN0ZWQ6IGZ1bmN0aW9uKCkge1xuXG4gICAgICAgICAgICBpZiAodGhpcy5pblZpZXcgJiYgIWhhc0F0dHIodGhpcy4kZWwsICdwcmVsb2FkJykpIHtcbiAgICAgICAgICAgICAgICB0aGlzLiRlbC5wcmVsb2FkID0gJ25vbmUnO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLnBsYXllciA9IG5ldyBQbGF5ZXIodGhpcy4kZWwpO1xuXG4gICAgICAgICAgICBpZiAodGhpcy5hdXRvbXV0ZSkge1xuICAgICAgICAgICAgICAgIHRoaXMucGxheWVyLm11dGUoKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICB9LFxuXG4gICAgICAgIHVwZGF0ZToge1xuXG4gICAgICAgICAgICByZWFkOiBmdW5jdGlvbigpIHtcblxuICAgICAgICAgICAgICAgIHJldHVybiAhdGhpcy5wbGF5ZXJcbiAgICAgICAgICAgICAgICAgICAgPyBmYWxzZVxuICAgICAgICAgICAgICAgICAgICA6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZpc2libGU6IGlzVmlzaWJsZSh0aGlzLiRlbCkgJiYgY3NzKHRoaXMuJGVsLCAndmlzaWJpbGl0eScpICE9PSAnaGlkZGVuJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGluVmlldzogdGhpcy5pblZpZXcgJiYgaXNJblZpZXcodGhpcy4kZWwpXG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICB3cml0ZTogZnVuY3Rpb24ocmVmKSB7XG4gICAgICAgICAgICAgICAgdmFyIHZpc2libGUgPSByZWYudmlzaWJsZTtcbiAgICAgICAgICAgICAgICB2YXIgaW5WaWV3ID0gcmVmLmluVmlldztcblxuXG4gICAgICAgICAgICAgICAgaWYgKCF2aXNpYmxlIHx8IHRoaXMuaW5WaWV3ICYmICFpblZpZXcpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wbGF5ZXIucGF1c2UoKTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuYXV0b3BsYXkgPT09IHRydWUgfHwgdGhpcy5pblZpZXcgJiYgaW5WaWV3KSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGxheWVyLnBsYXkoKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIGV2ZW50czogWydyZXNpemUnLCAnc2Nyb2xsJ11cblxuICAgICAgICB9XG5cbiAgICB9O1xuXG4gICAgdmFyIENvdmVyID0ge1xuXG4gICAgICAgIG1peGluczogW0NsYXNzLCBWaWRlb10sXG5cbiAgICAgICAgcHJvcHM6IHtcbiAgICAgICAgICAgIHdpZHRoOiBOdW1iZXIsXG4gICAgICAgICAgICBoZWlnaHQ6IE51bWJlclxuICAgICAgICB9LFxuXG4gICAgICAgIGRhdGE6IHtcbiAgICAgICAgICAgIGF1dG9tdXRlOiB0cnVlXG4gICAgICAgIH0sXG5cbiAgICAgICAgdXBkYXRlOiB7XG5cbiAgICAgICAgICAgIHJlYWQ6IGZ1bmN0aW9uKCkge1xuXG4gICAgICAgICAgICAgICAgdmFyIGVsID0gdGhpcy4kZWw7XG5cbiAgICAgICAgICAgICAgICBpZiAoIWlzVmlzaWJsZShlbCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHZhciByZWYgPSBlbC5wYXJlbnROb2RlO1xuICAgICAgICAgICAgICAgIHZhciBoZWlnaHQkJDEgPSByZWYub2Zmc2V0SGVpZ2h0O1xuICAgICAgICAgICAgICAgIHZhciB3aWR0aCQkMSA9IHJlZi5vZmZzZXRXaWR0aDtcblxuICAgICAgICAgICAgICAgIHJldHVybiB7aGVpZ2h0OiBoZWlnaHQkJDEsIHdpZHRoOiB3aWR0aCQkMX07XG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICB3cml0ZTogZnVuY3Rpb24ocmVmKSB7XG4gICAgICAgICAgICAgICAgdmFyIGhlaWdodCQkMSA9IHJlZi5oZWlnaHQ7XG4gICAgICAgICAgICAgICAgdmFyIHdpZHRoJCQxID0gcmVmLndpZHRoO1xuXG5cbiAgICAgICAgICAgICAgICB2YXIgZWwgPSB0aGlzLiRlbDtcbiAgICAgICAgICAgICAgICB2YXIgZWxXaWR0aCA9IHRoaXMud2lkdGggfHwgZWwubmF0dXJhbFdpZHRoIHx8IGVsLnZpZGVvV2lkdGggfHwgZWwuY2xpZW50V2lkdGg7XG4gICAgICAgICAgICAgICAgdmFyIGVsSGVpZ2h0ID0gdGhpcy5oZWlnaHQgfHwgZWwubmF0dXJhbEhlaWdodCB8fCBlbC52aWRlb0hlaWdodCB8fCBlbC5jbGllbnRIZWlnaHQ7XG5cbiAgICAgICAgICAgICAgICBpZiAoIWVsV2lkdGggfHwgIWVsSGVpZ2h0KSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBjc3MoZWwsIERpbWVuc2lvbnMuY292ZXIoXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoOiBlbFdpZHRoLFxuICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiBlbEhlaWdodFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICB3aWR0aDogd2lkdGgkJDEgKyAod2lkdGgkJDEgJSAyID8gMSA6IDApLFxuICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiBoZWlnaHQkJDEgKyAoaGVpZ2h0JCQxICUgMiA/IDEgOiAwKVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgKSk7XG5cbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIGV2ZW50czogWydyZXNpemUnXVxuXG4gICAgICAgIH1cblxuICAgIH07XG5cbiAgICB2YXIgUG9zaXRpb24gPSB7XG5cbiAgICAgICAgcHJvcHM6IHtcbiAgICAgICAgICAgIHBvczogU3RyaW5nLFxuICAgICAgICAgICAgb2Zmc2V0OiBudWxsLFxuICAgICAgICAgICAgZmxpcDogQm9vbGVhbixcbiAgICAgICAgICAgIGNsc1BvczogU3RyaW5nXG4gICAgICAgIH0sXG5cbiAgICAgICAgZGF0YToge1xuICAgICAgICAgICAgcG9zOiAoXCJib3R0b20tXCIgKyAoIWlzUnRsID8gJ2xlZnQnIDogJ3JpZ2h0JykpLFxuICAgICAgICAgICAgZmxpcDogdHJ1ZSxcbiAgICAgICAgICAgIG9mZnNldDogZmFsc2UsXG4gICAgICAgICAgICBjbHNQb3M6ICcnXG4gICAgICAgIH0sXG5cbiAgICAgICAgY29tcHV0ZWQ6IHtcblxuICAgICAgICAgICAgcG9zOiBmdW5jdGlvbihyZWYpIHtcbiAgICAgICAgICAgICAgICB2YXIgcG9zID0gcmVmLnBvcztcblxuICAgICAgICAgICAgICAgIHJldHVybiAocG9zICsgKCFpbmNsdWRlcyhwb3MsICctJykgPyAnLWNlbnRlcicgOiAnJykpLnNwbGl0KCctJyk7XG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICBkaXI6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnBvc1swXTtcbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIGFsaWduOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5wb3NbMV07XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgfSxcblxuICAgICAgICBtZXRob2RzOiB7XG5cbiAgICAgICAgICAgIHBvc2l0aW9uQXQ6IGZ1bmN0aW9uKGVsZW1lbnQsIHRhcmdldCwgYm91bmRhcnkpIHtcblxuICAgICAgICAgICAgICAgIHJlbW92ZUNsYXNzZXMoZWxlbWVudCwgKCh0aGlzLmNsc1BvcykgKyBcIi0odG9wfGJvdHRvbXxsZWZ0fHJpZ2h0KSgtW2Etel0rKT9cIikpO1xuICAgICAgICAgICAgICAgIGNzcyhlbGVtZW50LCB7dG9wOiAnJywgbGVmdDogJyd9KTtcblxuICAgICAgICAgICAgICAgIHZhciBub2RlO1xuICAgICAgICAgICAgICAgIHZhciByZWYgPSB0aGlzO1xuICAgICAgICAgICAgICAgIHZhciBvZmZzZXQkJDEgPSByZWYub2Zmc2V0O1xuICAgICAgICAgICAgICAgIHZhciBheGlzID0gdGhpcy5nZXRBeGlzKCk7XG5cbiAgICAgICAgICAgICAgICBpZiAoIWlzTnVtZXJpYyhvZmZzZXQkJDEpKSB7XG4gICAgICAgICAgICAgICAgICAgIG5vZGUgPSAkKG9mZnNldCQkMSk7XG4gICAgICAgICAgICAgICAgICAgIG9mZnNldCQkMSA9IG5vZGVcbiAgICAgICAgICAgICAgICAgICAgICAgID8gb2Zmc2V0KG5vZGUpW2F4aXMgPT09ICd4JyA/ICdsZWZ0JyA6ICd0b3AnXSAtIG9mZnNldCh0YXJnZXQpW2F4aXMgPT09ICd4JyA/ICdyaWdodCcgOiAnYm90dG9tJ11cbiAgICAgICAgICAgICAgICAgICAgICAgIDogMDtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB2YXIgcmVmJDEgPSBwb3NpdGlvbkF0KFxuICAgICAgICAgICAgICAgICAgICBlbGVtZW50LFxuICAgICAgICAgICAgICAgICAgICB0YXJnZXQsXG4gICAgICAgICAgICAgICAgICAgIGF4aXMgPT09ICd4JyA/ICgoZmxpcFBvc2l0aW9uKHRoaXMuZGlyKSkgKyBcIiBcIiArICh0aGlzLmFsaWduKSkgOiAoKHRoaXMuYWxpZ24pICsgXCIgXCIgKyAoZmxpcFBvc2l0aW9uKHRoaXMuZGlyKSkpLFxuICAgICAgICAgICAgICAgICAgICBheGlzID09PSAneCcgPyAoKHRoaXMuZGlyKSArIFwiIFwiICsgKHRoaXMuYWxpZ24pKSA6ICgodGhpcy5hbGlnbikgKyBcIiBcIiArICh0aGlzLmRpcikpLFxuICAgICAgICAgICAgICAgICAgICBheGlzID09PSAneCcgPyAoXCJcIiArICh0aGlzLmRpciA9PT0gJ2xlZnQnID8gLW9mZnNldCQkMSA6IG9mZnNldCQkMSkpIDogKFwiIFwiICsgKHRoaXMuZGlyID09PSAndG9wJyA/IC1vZmZzZXQkJDEgOiBvZmZzZXQkJDEpKSxcbiAgICAgICAgICAgICAgICAgICAgbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5mbGlwLFxuICAgICAgICAgICAgICAgICAgICBib3VuZGFyeVxuICAgICAgICAgICAgICAgICkudGFyZ2V0O1xuICAgICAgICAgICAgICAgIHZhciB4ID0gcmVmJDEueDtcbiAgICAgICAgICAgICAgICB2YXIgeSA9IHJlZiQxLnk7XG5cbiAgICAgICAgICAgICAgICB0aGlzLmRpciA9IGF4aXMgPT09ICd4JyA/IHggOiB5O1xuICAgICAgICAgICAgICAgIHRoaXMuYWxpZ24gPSBheGlzID09PSAneCcgPyB5IDogeDtcblxuICAgICAgICAgICAgICAgIHRvZ2dsZUNsYXNzKGVsZW1lbnQsICgodGhpcy5jbHNQb3MpICsgXCItXCIgKyAodGhpcy5kaXIpICsgXCItXCIgKyAodGhpcy5hbGlnbikpLCB0aGlzLm9mZnNldCA9PT0gZmFsc2UpO1xuXG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICBnZXRBeGlzOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5kaXIgPT09ICd0b3AnIHx8IHRoaXMuZGlyID09PSAnYm90dG9tJyA/ICd5JyA6ICd4JztcbiAgICAgICAgICAgIH1cblxuICAgICAgICB9XG5cbiAgICB9O1xuXG4gICAgdmFyIGFjdGl2ZTtcblxuICAgIHZhciBEcm9wID0ge1xuXG4gICAgICAgIG1peGluczogW1Bvc2l0aW9uLCBUb2dnbGFibGVdLFxuXG4gICAgICAgIGFyZ3M6ICdwb3MnLFxuXG4gICAgICAgIHByb3BzOiB7XG4gICAgICAgICAgICBtb2RlOiAnbGlzdCcsXG4gICAgICAgICAgICB0b2dnbGU6IEJvb2xlYW4sXG4gICAgICAgICAgICBib3VuZGFyeTogQm9vbGVhbixcbiAgICAgICAgICAgIGJvdW5kYXJ5QWxpZ246IEJvb2xlYW4sXG4gICAgICAgICAgICBkZWxheVNob3c6IE51bWJlcixcbiAgICAgICAgICAgIGRlbGF5SGlkZTogTnVtYmVyLFxuICAgICAgICAgICAgY2xzRHJvcDogU3RyaW5nXG4gICAgICAgIH0sXG5cbiAgICAgICAgZGF0YToge1xuICAgICAgICAgICAgbW9kZTogWydjbGljaycsICdob3ZlciddLFxuICAgICAgICAgICAgdG9nZ2xlOiAnLSAqJyxcbiAgICAgICAgICAgIGJvdW5kYXJ5OiB3aW5kb3csXG4gICAgICAgICAgICBib3VuZGFyeUFsaWduOiBmYWxzZSxcbiAgICAgICAgICAgIGRlbGF5U2hvdzogMCxcbiAgICAgICAgICAgIGRlbGF5SGlkZTogODAwLFxuICAgICAgICAgICAgY2xzRHJvcDogZmFsc2UsXG4gICAgICAgICAgICBob3ZlcklkbGU6IDIwMCxcbiAgICAgICAgICAgIGFuaW1hdGlvbjogWyd1ay1hbmltYXRpb24tZmFkZSddLFxuICAgICAgICAgICAgY2xzOiAndWstb3BlbidcbiAgICAgICAgfSxcblxuICAgICAgICBjb21wdXRlZDoge1xuXG4gICAgICAgICAgICBib3VuZGFyeTogZnVuY3Rpb24ocmVmLCAkZWwpIHtcbiAgICAgICAgICAgICAgICB2YXIgYm91bmRhcnkgPSByZWYuYm91bmRhcnk7XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gcXVlcnkoYm91bmRhcnksICRlbCk7XG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICBjbHNEcm9wOiBmdW5jdGlvbihyZWYpIHtcbiAgICAgICAgICAgICAgICB2YXIgY2xzRHJvcCA9IHJlZi5jbHNEcm9wO1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuIGNsc0Ryb3AgfHwgKFwidWstXCIgKyAodGhpcy4kb3B0aW9ucy5uYW1lKSk7XG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICBjbHNQb3M6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmNsc0Ryb3A7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgfSxcblxuICAgICAgICBjcmVhdGVkOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHRoaXMudHJhY2tlciA9IG5ldyBNb3VzZVRyYWNrZXIoKTtcbiAgICAgICAgfSxcblxuICAgICAgICBjb25uZWN0ZWQ6IGZ1bmN0aW9uKCkge1xuXG4gICAgICAgICAgICBhZGRDbGFzcyh0aGlzLiRlbCwgdGhpcy5jbHNEcm9wKTtcblxuICAgICAgICAgICAgdmFyIHJlZiA9IHRoaXMuJHByb3BzO1xuICAgICAgICAgICAgdmFyIHRvZ2dsZSA9IHJlZi50b2dnbGU7XG4gICAgICAgICAgICB0aGlzLnRvZ2dsZSA9IHRvZ2dsZSAmJiB0aGlzLiRjcmVhdGUoJ3RvZ2dsZScsIHF1ZXJ5KHRvZ2dsZSwgdGhpcy4kZWwpLCB7XG4gICAgICAgICAgICAgICAgdGFyZ2V0OiB0aGlzLiRlbCxcbiAgICAgICAgICAgICAgICBtb2RlOiB0aGlzLm1vZGVcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAhdGhpcy50b2dnbGUgJiYgdHJpZ2dlcih0aGlzLiRlbCwgJ3VwZGF0ZWFyaWEnKTtcblxuICAgICAgICB9LFxuXG4gICAgICAgIGV2ZW50czogW1xuXG5cbiAgICAgICAgICAgIHtcblxuICAgICAgICAgICAgICAgIG5hbWU6ICdjbGljaycsXG5cbiAgICAgICAgICAgICAgICBkZWxlZ2F0ZTogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAoXCIuXCIgKyAodGhpcy5jbHNEcm9wKSArIFwiLWNsb3NlXCIpO1xuICAgICAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgICAgICBoYW5kbGVyOiBmdW5jdGlvbihlKSB7XG4gICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5oaWRlKGZhbHNlKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIHtcblxuICAgICAgICAgICAgICAgIG5hbWU6ICdjbGljaycsXG5cbiAgICAgICAgICAgICAgICBkZWxlZ2F0ZTogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAnYVtocmVmXj1cIiNcIl0nO1xuICAgICAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgICAgICBoYW5kbGVyOiBmdW5jdGlvbihlKSB7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKGUuZGVmYXVsdFByZXZlbnRlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgdmFyIGlkID0gZS50YXJnZXQuaGFzaDtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoIWlkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBpZiAoIWlkIHx8ICF3aXRoaW4oaWQsIHRoaXMuJGVsKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5oaWRlKGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAge1xuXG4gICAgICAgICAgICAgICAgbmFtZTogJ2JlZm9yZXNjcm9sbCcsXG5cbiAgICAgICAgICAgICAgICBoYW5kbGVyOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5oaWRlKGZhbHNlKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIHtcblxuICAgICAgICAgICAgICAgIG5hbWU6ICd0b2dnbGUnLFxuXG4gICAgICAgICAgICAgICAgc2VsZjogdHJ1ZSxcblxuICAgICAgICAgICAgICAgIGhhbmRsZXI6IGZ1bmN0aW9uKGUsIHRvZ2dsZSkge1xuXG4gICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5pc1RvZ2dsZWQoKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5oaWRlKGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2hvdyh0b2dnbGUsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAge1xuXG4gICAgICAgICAgICAgICAgbmFtZTogcG9pbnRlckVudGVyLFxuXG4gICAgICAgICAgICAgICAgZmlsdGVyOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGluY2x1ZGVzKHRoaXMubW9kZSwgJ2hvdmVyJyk7XG4gICAgICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgICAgIGhhbmRsZXI6IGZ1bmN0aW9uKGUpIHtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoaXNUb3VjaChlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKGFjdGl2ZVxuICAgICAgICAgICAgICAgICAgICAgICAgJiYgYWN0aXZlICE9PSB0aGlzXG4gICAgICAgICAgICAgICAgICAgICAgICAmJiBhY3RpdmUudG9nZ2xlXG4gICAgICAgICAgICAgICAgICAgICAgICAmJiBpbmNsdWRlcyhhY3RpdmUudG9nZ2xlLm1vZGUsICdob3ZlcicpXG4gICAgICAgICAgICAgICAgICAgICAgICAmJiAhd2l0aGluKGUudGFyZ2V0LCBhY3RpdmUudG9nZ2xlLiRlbClcbiAgICAgICAgICAgICAgICAgICAgICAgICYmICFwb2ludEluUmVjdCh7eDogZS5wYWdlWCwgeTogZS5wYWdlWX0sIG9mZnNldChhY3RpdmUuJGVsKSlcbiAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhY3RpdmUuaGlkZShmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2hvdyh0aGlzLnRvZ2dsZSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICB7XG5cbiAgICAgICAgICAgICAgICBuYW1lOiAndG9nZ2xlc2hvdycsXG5cbiAgICAgICAgICAgICAgICBoYW5kbGVyOiBmdW5jdGlvbihlLCB0b2dnbGUpIHtcblxuICAgICAgICAgICAgICAgICAgICBpZiAodG9nZ2xlICYmICFpbmNsdWRlcyh0b2dnbGUudGFyZ2V0LCB0aGlzLiRlbCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zaG93KHRvZ2dsZSB8fCB0aGlzLnRvZ2dsZSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICB7XG5cbiAgICAgICAgICAgICAgICBuYW1lOiAoXCJ0b2dnbGVoaWRlIFwiICsgcG9pbnRlckxlYXZlKSxcblxuICAgICAgICAgICAgICAgIGhhbmRsZXI6IGZ1bmN0aW9uKGUsIHRvZ2dsZSkge1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChpc1RvdWNoKGUpIHx8IHRvZ2dsZSAmJiAhaW5jbHVkZXModG9nZ2xlLnRhcmdldCwgdGhpcy4kZWwpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMudG9nZ2xlICYmIGluY2x1ZGVzKHRoaXMudG9nZ2xlLm1vZGUsICdob3ZlcicpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmhpZGUoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAge1xuXG4gICAgICAgICAgICAgICAgbmFtZTogJ2JlZm9yZXNob3cnLFxuXG4gICAgICAgICAgICAgICAgc2VsZjogdHJ1ZSxcblxuICAgICAgICAgICAgICAgIGhhbmRsZXI6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNsZWFyVGltZXJzKCk7XG4gICAgICAgICAgICAgICAgICAgIEFuaW1hdGlvbi5jYW5jZWwodGhpcy4kZWwpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnBvc2l0aW9uKCk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICB7XG5cbiAgICAgICAgICAgICAgICBuYW1lOiAnc2hvdycsXG5cbiAgICAgICAgICAgICAgICBzZWxmOiB0cnVlLFxuXG4gICAgICAgICAgICAgICAgaGFuZGxlcjogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudHJhY2tlci5pbml0KCk7XG4gICAgICAgICAgICAgICAgICAgIHRyaWdnZXIodGhpcy4kZWwsICd1cGRhdGVhcmlhJyk7XG4gICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyRXZlbnQoKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIHtcblxuICAgICAgICAgICAgICAgIG5hbWU6ICdiZWZvcmVoaWRlJyxcblxuICAgICAgICAgICAgICAgIHNlbGY6IHRydWUsXG5cbiAgICAgICAgICAgICAgICBoYW5kbGVyOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jbGVhclRpbWVycygpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAge1xuXG4gICAgICAgICAgICAgICAgbmFtZTogJ2hpZGUnLFxuXG4gICAgICAgICAgICAgICAgaGFuZGxlcjogZnVuY3Rpb24ocmVmKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciB0YXJnZXQgPSByZWYudGFyZ2V0O1xuXG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuJGVsICE9PSB0YXJnZXQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFjdGl2ZSA9IGFjdGl2ZSA9PT0gbnVsbCAmJiB3aXRoaW4odGFyZ2V0LCB0aGlzLiRlbCkgJiYgdGhpcy5pc1RvZ2dsZWQoKSA/IHRoaXMgOiBhY3RpdmU7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBhY3RpdmUgPSB0aGlzLmlzQWN0aXZlKCkgPyBudWxsIDogYWN0aXZlO1xuICAgICAgICAgICAgICAgICAgICB0cmlnZ2VyKHRoaXMuJGVsLCAndXBkYXRlYXJpYScpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnRyYWNrZXIuY2FuY2VsKCk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICB7XG5cbiAgICAgICAgICAgICAgICBuYW1lOiAndXBkYXRlYXJpYScsXG5cbiAgICAgICAgICAgICAgICBzZWxmOiB0cnVlLFxuXG4gICAgICAgICAgICAgICAgaGFuZGxlcjogZnVuY3Rpb24oZSwgdG9nZ2xlKSB7XG5cbiAgICAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlQXJpYSh0aGlzLiRlbCk7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHRvZ2dsZSB8fCB0aGlzLnRvZ2dsZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYXR0cigodG9nZ2xlIHx8IHRoaXMudG9nZ2xlKS4kZWwsICdhcmlhLWV4cGFuZGVkJywgdGhpcy5pc1RvZ2dsZWQoKSA/ICd0cnVlJyA6ICdmYWxzZScpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdG9nZ2xlQ2xhc3ModGhpcy50b2dnbGUuJGVsLCB0aGlzLmNscywgdGhpcy5pc1RvZ2dsZWQoKSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgXSxcblxuICAgICAgICB1cGRhdGU6IHtcblxuICAgICAgICAgICAgd3JpdGU6IGZ1bmN0aW9uKCkge1xuXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuaXNUb2dnbGVkKCkgJiYgIUFuaW1hdGlvbi5pblByb2dyZXNzKHRoaXMuJGVsKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnBvc2l0aW9uKCk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICBldmVudHM6IFsncmVzaXplJ11cblxuICAgICAgICB9LFxuXG4gICAgICAgIG1ldGhvZHM6IHtcblxuICAgICAgICAgICAgc2hvdzogZnVuY3Rpb24odG9nZ2xlLCBkZWxheSkge1xuICAgICAgICAgICAgICAgIHZhciB0aGlzJDEgPSB0aGlzO1xuICAgICAgICAgICAgICAgIGlmICggZGVsYXkgPT09IHZvaWQgMCApIGRlbGF5ID0gdHJ1ZTtcblxuXG4gICAgICAgICAgICAgICAgdmFyIHNob3cgPSBmdW5jdGlvbiAoKSB7IHJldHVybiAhdGhpcyQxLmlzVG9nZ2xlZCgpICYmIHRoaXMkMS50b2dnbGVFbGVtZW50KHRoaXMkMS4kZWwsIHRydWUpOyB9O1xuICAgICAgICAgICAgICAgIHZhciB0cnlTaG93ID0gZnVuY3Rpb24gKCkge1xuXG4gICAgICAgICAgICAgICAgICAgIHRoaXMkMS50b2dnbGUgPSB0b2dnbGUgfHwgdGhpcyQxLnRvZ2dsZTtcblxuICAgICAgICAgICAgICAgICAgICB0aGlzJDEuY2xlYXJUaW1lcnMoKTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcyQxLmlzQWN0aXZlKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChkZWxheSAmJiBhY3RpdmUgJiYgYWN0aXZlICE9PSB0aGlzJDEgJiYgYWN0aXZlLmlzRGVsYXlpbmcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMkMS5zaG93VGltZXIgPSBzZXRUaW1lb3V0KHRoaXMkMS5zaG93LCAxMCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcyQxLmlzUGFyZW50T2YoYWN0aXZlKSkge1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWN0aXZlLmhpZGVUaW1lcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGl2ZS5oaWRlKGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYWN0aXZlICYmIHRoaXMkMS5pc0NoaWxkT2YoYWN0aXZlKSkge1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBhY3RpdmUuY2xlYXJUaW1lcnMoKTtcblxuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGFjdGl2ZSAmJiAhdGhpcyQxLmlzQ2hpbGRPZihhY3RpdmUpICYmICF0aGlzJDEuaXNQYXJlbnRPZihhY3RpdmUpKSB7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBwcmV2O1xuICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGFjdGl2ZSAmJiBhY3RpdmUgIT09IHByZXYgJiYgIXRoaXMkMS5pc0NoaWxkT2YoYWN0aXZlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXYgPSBhY3RpdmU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aXZlLmhpZGUoZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBpZiAoZGVsYXkgJiYgdGhpcyQxLmRlbGF5U2hvdykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcyQxLnNob3dUaW1lciA9IHNldFRpbWVvdXQoc2hvdywgdGhpcyQxLmRlbGF5U2hvdyk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzaG93KCk7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBhY3RpdmUgPSB0aGlzJDE7XG4gICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgIGlmICh0b2dnbGUgJiYgdGhpcy50b2dnbGUgJiYgdG9nZ2xlLiRlbCAhPT0gdGhpcy50b2dnbGUuJGVsKSB7XG5cbiAgICAgICAgICAgICAgICAgICAgb25jZSh0aGlzLiRlbCwgJ2hpZGUnLCB0cnlTaG93KTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5oaWRlKGZhbHNlKTtcblxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRyeVNob3coKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICBoaWRlOiBmdW5jdGlvbihkZWxheSkge1xuICAgICAgICAgICAgICAgIHZhciB0aGlzJDEgPSB0aGlzO1xuICAgICAgICAgICAgICAgIGlmICggZGVsYXkgPT09IHZvaWQgMCApIGRlbGF5ID0gdHJ1ZTtcblxuXG4gICAgICAgICAgICAgICAgdmFyIGhpZGUgPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzJDEudG9nZ2xlTm93KHRoaXMkMS4kZWwsIGZhbHNlKTsgfTtcblxuICAgICAgICAgICAgICAgIHRoaXMuY2xlYXJUaW1lcnMoKTtcblxuICAgICAgICAgICAgICAgIHRoaXMuaXNEZWxheWluZyA9IHRoaXMudHJhY2tlci5tb3Zlc1RvKHRoaXMuJGVsKTtcblxuICAgICAgICAgICAgICAgIGlmIChkZWxheSAmJiB0aGlzLmlzRGVsYXlpbmcpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5oaWRlVGltZXIgPSBzZXRUaW1lb3V0KHRoaXMuaGlkZSwgdGhpcy5ob3ZlcklkbGUpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZGVsYXkgJiYgdGhpcy5kZWxheUhpZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5oaWRlVGltZXIgPSBzZXRUaW1lb3V0KGhpZGUsIHRoaXMuZGVsYXlIaWRlKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBoaWRlKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgY2xlYXJUaW1lcnM6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aGlzLnNob3dUaW1lcik7XG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuaGlkZVRpbWVyKTtcbiAgICAgICAgICAgICAgICB0aGlzLnNob3dUaW1lciA9IG51bGw7XG4gICAgICAgICAgICAgICAgdGhpcy5oaWRlVGltZXIgPSBudWxsO1xuICAgICAgICAgICAgICAgIHRoaXMuaXNEZWxheWluZyA9IGZhbHNlO1xuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgaXNBY3RpdmU6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBhY3RpdmUgPT09IHRoaXM7XG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICBpc0NoaWxkT2Y6IGZ1bmN0aW9uKGRyb3ApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZHJvcCAmJiBkcm9wICE9PSB0aGlzICYmIHdpdGhpbih0aGlzLiRlbCwgZHJvcC4kZWwpO1xuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgaXNQYXJlbnRPZjogZnVuY3Rpb24oZHJvcCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBkcm9wICYmIGRyb3AgIT09IHRoaXMgJiYgd2l0aGluKGRyb3AuJGVsLCB0aGlzLiRlbCk7XG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICBwb3NpdGlvbjogZnVuY3Rpb24oKSB7XG5cbiAgICAgICAgICAgICAgICByZW1vdmVDbGFzc2VzKHRoaXMuJGVsLCAoKHRoaXMuY2xzRHJvcCkgKyBcIi0oc3RhY2t8Ym91bmRhcnkpXCIpKTtcbiAgICAgICAgICAgICAgICBjc3ModGhpcy4kZWwsIHt0b3A6ICcnLCBsZWZ0OiAnJywgZGlzcGxheTogJ2Jsb2NrJ30pO1xuICAgICAgICAgICAgICAgIHRvZ2dsZUNsYXNzKHRoaXMuJGVsLCAoKHRoaXMuY2xzRHJvcCkgKyBcIi1ib3VuZGFyeVwiKSwgdGhpcy5ib3VuZGFyeUFsaWduKTtcblxuICAgICAgICAgICAgICAgIHZhciBib3VuZGFyeSA9IG9mZnNldCh0aGlzLmJvdW5kYXJ5KTtcbiAgICAgICAgICAgICAgICB2YXIgYWxpZ25UbyA9IHRoaXMuYm91bmRhcnlBbGlnbiA/IGJvdW5kYXJ5IDogb2Zmc2V0KHRoaXMudG9nZ2xlLiRlbCk7XG5cbiAgICAgICAgICAgICAgICBpZiAodGhpcy5hbGlnbiA9PT0gJ2p1c3RpZnknKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBwcm9wID0gdGhpcy5nZXRBeGlzKCkgPT09ICd5JyA/ICd3aWR0aCcgOiAnaGVpZ2h0JztcbiAgICAgICAgICAgICAgICAgICAgY3NzKHRoaXMuJGVsLCBwcm9wLCBhbGlnblRvW3Byb3BdKTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuJGVsLm9mZnNldFdpZHRoID4gTWF0aC5tYXgoYm91bmRhcnkucmlnaHQgLSBhbGlnblRvLmxlZnQsIGFsaWduVG8ucmlnaHQgLSBib3VuZGFyeS5sZWZ0KSkge1xuICAgICAgICAgICAgICAgICAgICBhZGRDbGFzcyh0aGlzLiRlbCwgKCh0aGlzLmNsc0Ryb3ApICsgXCItc3RhY2tcIikpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHRoaXMucG9zaXRpb25BdCh0aGlzLiRlbCwgdGhpcy5ib3VuZGFyeUFsaWduID8gdGhpcy5ib3VuZGFyeSA6IHRoaXMudG9nZ2xlLiRlbCwgdGhpcy5ib3VuZGFyeSk7XG5cbiAgICAgICAgICAgICAgICBjc3ModGhpcy4kZWwsICdkaXNwbGF5JywgJycpO1xuXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgfVxuXG4gICAgfTtcblxuICAgIHZhciByZWdpc3RlcmVkO1xuXG4gICAgZnVuY3Rpb24gcmVnaXN0ZXJFdmVudCgpIHtcblxuICAgICAgICBpZiAocmVnaXN0ZXJlZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgcmVnaXN0ZXJlZCA9IHRydWU7XG4gICAgICAgIG9uKGRvY3VtZW50LCBwb2ludGVyVXAsIGZ1bmN0aW9uIChyZWYpIHtcbiAgICAgICAgICAgIHZhciB0YXJnZXQgPSByZWYudGFyZ2V0O1xuICAgICAgICAgICAgdmFyIGRlZmF1bHRQcmV2ZW50ZWQgPSByZWYuZGVmYXVsdFByZXZlbnRlZDtcblxuICAgICAgICAgICAgdmFyIHByZXY7XG5cbiAgICAgICAgICAgIGlmIChkZWZhdWx0UHJldmVudGVkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB3aGlsZSAoYWN0aXZlICYmIGFjdGl2ZSAhPT0gcHJldiAmJiAhd2l0aGluKHRhcmdldCwgYWN0aXZlLiRlbCkgJiYgIShhY3RpdmUudG9nZ2xlICYmIHdpdGhpbih0YXJnZXQsIGFjdGl2ZS50b2dnbGUuJGVsKSkpIHtcbiAgICAgICAgICAgICAgICBwcmV2ID0gYWN0aXZlO1xuICAgICAgICAgICAgICAgIGFjdGl2ZS5oaWRlKGZhbHNlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgdmFyIERyb3Bkb3duID0ge1xuXG4gICAgICAgIGV4dGVuZHM6IERyb3BcblxuICAgIH07XG5cbiAgICB2YXIgRm9ybUN1c3RvbSA9IHtcblxuICAgICAgICBtaXhpbnM6IFtDbGFzc10sXG5cbiAgICAgICAgYXJnczogJ3RhcmdldCcsXG5cbiAgICAgICAgcHJvcHM6IHtcbiAgICAgICAgICAgIHRhcmdldDogQm9vbGVhblxuICAgICAgICB9LFxuXG4gICAgICAgIGRhdGE6IHtcbiAgICAgICAgICAgIHRhcmdldDogZmFsc2VcbiAgICAgICAgfSxcblxuICAgICAgICBjb21wdXRlZDoge1xuXG4gICAgICAgICAgICBpbnB1dDogZnVuY3Rpb24oXywgJGVsKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICQoc2VsSW5wdXQsICRlbCk7XG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICBzdGF0ZTogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuaW5wdXQubmV4dEVsZW1lbnRTaWJsaW5nO1xuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgdGFyZ2V0OiBmdW5jdGlvbihyZWYsICRlbCkge1xuICAgICAgICAgICAgICAgIHZhciB0YXJnZXQgPSByZWYudGFyZ2V0O1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRhcmdldCAmJiAodGFyZ2V0ID09PSB0cnVlXG4gICAgICAgICAgICAgICAgICAgICYmIHRoaXMuaW5wdXQucGFyZW50Tm9kZSA9PT0gJGVsXG4gICAgICAgICAgICAgICAgICAgICYmIHRoaXMuaW5wdXQubmV4dEVsZW1lbnRTaWJsaW5nXG4gICAgICAgICAgICAgICAgICAgIHx8IHF1ZXJ5KHRhcmdldCwgJGVsKSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgfSxcblxuICAgICAgICB1cGRhdGU6IGZ1bmN0aW9uKCkge1xuXG4gICAgICAgICAgICB2YXIgcmVmID0gdGhpcztcbiAgICAgICAgICAgIHZhciB0YXJnZXQgPSByZWYudGFyZ2V0O1xuICAgICAgICAgICAgdmFyIGlucHV0ID0gcmVmLmlucHV0O1xuXG4gICAgICAgICAgICBpZiAoIXRhcmdldCkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdmFyIG9wdGlvbjtcbiAgICAgICAgICAgIHZhciBwcm9wID0gaXNJbnB1dCh0YXJnZXQpID8gJ3ZhbHVlJyA6ICd0ZXh0Q29udGVudCc7XG4gICAgICAgICAgICB2YXIgcHJldiA9IHRhcmdldFtwcm9wXTtcbiAgICAgICAgICAgIHZhciB2YWx1ZSA9IGlucHV0LmZpbGVzICYmIGlucHV0LmZpbGVzWzBdXG4gICAgICAgICAgICAgICAgPyBpbnB1dC5maWxlc1swXS5uYW1lXG4gICAgICAgICAgICAgICAgOiBtYXRjaGVzKGlucHV0LCAnc2VsZWN0JykgJiYgKG9wdGlvbiA9ICQkKCdvcHRpb24nLCBpbnB1dCkuZmlsdGVyKGZ1bmN0aW9uIChlbCkgeyByZXR1cm4gZWwuc2VsZWN0ZWQ7IH0pWzBdKVxuICAgICAgICAgICAgICAgICAgICA/IG9wdGlvbi50ZXh0Q29udGVudFxuICAgICAgICAgICAgICAgICAgICA6IGlucHV0LnZhbHVlO1xuXG4gICAgICAgICAgICBpZiAocHJldiAhPT0gdmFsdWUpIHtcbiAgICAgICAgICAgICAgICB0YXJnZXRbcHJvcF0gPSB2YWx1ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICB9LFxuXG4gICAgICAgIGV2ZW50czoge1xuXG4gICAgICAgICAgICBjaGFuZ2U6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIHRoaXMuJGVtaXQoKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICB9XG5cbiAgICB9O1xuXG4gICAgLy8gRGVwcmVjYXRlZFxuICAgIHZhciBHaWYgPSB7XG5cbiAgICAgICAgdXBkYXRlOiB7XG5cbiAgICAgICAgICAgIHJlYWQ6IGZ1bmN0aW9uKGRhdGEkJDEpIHtcblxuICAgICAgICAgICAgICAgIHZhciBpbnZpZXcgPSBpc0luVmlldyh0aGlzLiRlbCk7XG5cbiAgICAgICAgICAgICAgICBpZiAoIWludmlldyB8fCBkYXRhJCQxLmlzSW5WaWV3ID09PSBpbnZpZXcpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGRhdGEkJDEuaXNJblZpZXcgPSBpbnZpZXc7XG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICB3cml0ZTogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgdGhpcy4kZWwuc3JjID0gdGhpcy4kZWwuc3JjO1xuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgZXZlbnRzOiBbJ3Njcm9sbCcsICdyZXNpemUnXVxuICAgICAgICB9XG5cbiAgICB9O1xuXG4gICAgdmFyIE1hcmdpbiA9IHtcblxuICAgICAgICBwcm9wczoge1xuICAgICAgICAgICAgbWFyZ2luOiBTdHJpbmcsXG4gICAgICAgICAgICBmaXJzdENvbHVtbjogQm9vbGVhblxuICAgICAgICB9LFxuXG4gICAgICAgIGRhdGE6IHtcbiAgICAgICAgICAgIG1hcmdpbjogJ3VrLW1hcmdpbi1zbWFsbC10b3AnLFxuICAgICAgICAgICAgZmlyc3RDb2x1bW46ICd1ay1maXJzdC1jb2x1bW4nXG4gICAgICAgIH0sXG5cbiAgICAgICAgdXBkYXRlOiB7XG5cbiAgICAgICAgICAgIHJlYWQ6IGZ1bmN0aW9uKGRhdGEkJDEpIHtcblxuICAgICAgICAgICAgICAgIHZhciBpdGVtcyA9IHRoaXMuJGVsLmNoaWxkcmVuO1xuICAgICAgICAgICAgICAgIHZhciByb3dzID0gW1tdXTtcblxuICAgICAgICAgICAgICAgIGlmICghaXRlbXMubGVuZ3RoIHx8ICFpc1Zpc2libGUodGhpcy4kZWwpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBkYXRhJCQxLnJvd3MgPSByb3dzO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGRhdGEkJDEucm93cyA9IGdldFJvd3MoaXRlbXMpO1xuICAgICAgICAgICAgICAgIGRhdGEkJDEuc3RhY2tzID0gIWRhdGEkJDEucm93cy5zb21lKGZ1bmN0aW9uIChyb3cpIHsgcmV0dXJuIHJvdy5sZW5ndGggPiAxOyB9KTtcblxuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgd3JpdGU6IGZ1bmN0aW9uKHJlZikge1xuICAgICAgICAgICAgICAgIHZhciB0aGlzJDEgPSB0aGlzO1xuICAgICAgICAgICAgICAgIHZhciByb3dzID0gcmVmLnJvd3M7XG5cblxuICAgICAgICAgICAgICAgIHJvd3MuZm9yRWFjaChmdW5jdGlvbiAocm93LCBpKSB7IHJldHVybiByb3cuZm9yRWFjaChmdW5jdGlvbiAoZWwsIGopIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRvZ2dsZUNsYXNzKGVsLCB0aGlzJDEubWFyZ2luLCBpICE9PSAwKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRvZ2dsZUNsYXNzKGVsLCB0aGlzJDEuZmlyc3RDb2x1bW4sIGogPT09IDApO1xuICAgICAgICAgICAgICAgICAgICB9KTsgfVxuICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIGV2ZW50czogWydyZXNpemUnXVxuXG4gICAgICAgIH1cblxuICAgIH07XG5cbiAgICBmdW5jdGlvbiBnZXRSb3dzKGl0ZW1zKSB7XG4gICAgICAgIHZhciByb3dzID0gW1tdXTtcblxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKSB7XG5cbiAgICAgICAgICAgIHZhciBlbCA9IGl0ZW1zW2ldO1xuICAgICAgICAgICAgdmFyIGRpbSA9IGdldE9mZnNldChlbCk7XG5cbiAgICAgICAgICAgIGlmICghZGltLmhlaWdodCkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBmb3IgKHZhciBqID0gcm93cy5sZW5ndGggLSAxOyBqID49IDA7IGotLSkge1xuXG4gICAgICAgICAgICAgICAgdmFyIHJvdyA9IHJvd3Nbal07XG5cbiAgICAgICAgICAgICAgICBpZiAoIXJvd1swXSkge1xuICAgICAgICAgICAgICAgICAgICByb3cucHVzaChlbCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHZhciBsZWZ0RGltID0gKHZvaWQgMCk7XG4gICAgICAgICAgICAgICAgaWYgKHJvd1swXS5vZmZzZXRQYXJlbnQgPT09IGVsLm9mZnNldFBhcmVudCkge1xuICAgICAgICAgICAgICAgICAgICBsZWZ0RGltID0gZ2V0T2Zmc2V0KHJvd1swXSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgZGltID0gZ2V0T2Zmc2V0KGVsLCB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgbGVmdERpbSA9IGdldE9mZnNldChyb3dbMF0sIHRydWUpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChkaW0udG9wID49IGxlZnREaW0uYm90dG9tIC0gMSkge1xuICAgICAgICAgICAgICAgICAgICByb3dzLnB1c2goW2VsXSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChkaW0uYm90dG9tID4gbGVmdERpbS50b3ApIHtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoZGltLmxlZnQgPCBsZWZ0RGltLmxlZnQgJiYgIWlzUnRsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByb3cudW5zaGlmdChlbCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIHJvdy5wdXNoKGVsKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKGogPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgcm93cy51bnNoaWZ0KFtlbF0pO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIH1cblxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJvd3M7XG5cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBnZXRPZmZzZXQoZWxlbWVudCwgb2Zmc2V0JCQxKSB7XG4gICAgICAgIHZhciBhc3NpZ24kJDE7XG5cbiAgICAgICAgaWYgKCBvZmZzZXQkJDEgPT09IHZvaWQgMCApIG9mZnNldCQkMSA9IGZhbHNlO1xuXG4gICAgICAgIHZhciBvZmZzZXRUb3AgPSBlbGVtZW50Lm9mZnNldFRvcDtcbiAgICAgICAgdmFyIG9mZnNldExlZnQgPSBlbGVtZW50Lm9mZnNldExlZnQ7XG4gICAgICAgIHZhciBvZmZzZXRIZWlnaHQgPSBlbGVtZW50Lm9mZnNldEhlaWdodDtcblxuICAgICAgICBpZiAob2Zmc2V0JCQxKSB7XG4gICAgICAgICAgICAoYXNzaWduJCQxID0gb2Zmc2V0UG9zaXRpb24oZWxlbWVudCksIG9mZnNldFRvcCA9IGFzc2lnbiQkMVswXSwgb2Zmc2V0TGVmdCA9IGFzc2lnbiQkMVsxXSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdG9wOiBvZmZzZXRUb3AsXG4gICAgICAgICAgICBsZWZ0OiBvZmZzZXRMZWZ0LFxuICAgICAgICAgICAgaGVpZ2h0OiBvZmZzZXRIZWlnaHQsXG4gICAgICAgICAgICBib3R0b206IG9mZnNldFRvcCArIG9mZnNldEhlaWdodFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIHZhciBHcmlkID0ge1xuXG4gICAgICAgIGV4dGVuZHM6IE1hcmdpbixcblxuICAgICAgICBtaXhpbnM6IFtDbGFzc10sXG5cbiAgICAgICAgbmFtZTogJ2dyaWQnLFxuXG4gICAgICAgIHByb3BzOiB7XG4gICAgICAgICAgICBtYXNvbnJ5OiBCb29sZWFuLFxuICAgICAgICAgICAgcGFyYWxsYXg6IE51bWJlclxuICAgICAgICB9LFxuXG4gICAgICAgIGRhdGE6IHtcbiAgICAgICAgICAgIG1hcmdpbjogJ3VrLWdyaWQtbWFyZ2luJyxcbiAgICAgICAgICAgIGNsc1N0YWNrOiAndWstZ3JpZC1zdGFjaycsXG4gICAgICAgICAgICBtYXNvbnJ5OiBmYWxzZSxcbiAgICAgICAgICAgIHBhcmFsbGF4OiAwXG4gICAgICAgIH0sXG5cbiAgICAgICAgY29tcHV0ZWQ6IHtcblxuICAgICAgICAgICAgbGVuZ3RoOiBmdW5jdGlvbihfLCAkZWwpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJGVsLmNoaWxkcmVuLmxlbmd0aDtcbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIHBhcmFsbGF4OiBmdW5jdGlvbihyZWYpIHtcbiAgICAgICAgICAgICAgICB2YXIgcGFyYWxsYXggPSByZWYucGFyYWxsYXg7XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gcGFyYWxsYXggJiYgdGhpcy5sZW5ndGggPyBNYXRoLmFicyhwYXJhbGxheCkgOiAnJztcbiAgICAgICAgICAgIH1cblxuICAgICAgICB9LFxuXG4gICAgICAgIGNvbm5lY3RlZDogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICB0aGlzLm1hc29ucnkgJiYgYWRkQ2xhc3ModGhpcy4kZWwsICd1ay1mbGV4LXRvcCB1ay1mbGV4LXdyYXAtdG9wJyk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgdXBkYXRlOiBbXG5cbiAgICAgICAgICAgIHtcblxuICAgICAgICAgICAgICAgIHJlYWQ6IGZ1bmN0aW9uKHJlZikge1xuICAgICAgICAgICAgICAgICAgICB2YXIgcm93cyA9IHJlZi5yb3dzO1xuXG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMubWFzb25yeSB8fCB0aGlzLnBhcmFsbGF4KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByb3dzID0gcm93cy5tYXAoZnVuY3Rpb24gKGVsZW1lbnRzKSB7IHJldHVybiBzb3J0QnkoZWxlbWVudHMsICdvZmZzZXRMZWZ0Jyk7IH0pO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNSdGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3dzLm1hcChmdW5jdGlvbiAocm93KSB7IHJldHVybiByb3cucmV2ZXJzZSgpOyB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgdmFyIHRyYW5zaXRpb25JblByb2dyZXNzID0gcm93cy5zb21lKGZ1bmN0aW9uIChlbGVtZW50cykgeyByZXR1cm4gZWxlbWVudHMuc29tZShUcmFuc2l0aW9uLmluUHJvZ3Jlc3MpOyB9KTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHRyYW5zbGF0ZXMgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGVsSGVpZ2h0ID0gJyc7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMubWFzb25yeSAmJiB0aGlzLmxlbmd0aCkge1xuXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgaGVpZ2h0JCQxID0gMDtcblxuICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNsYXRlcyA9IHJvd3MucmVkdWNlKGZ1bmN0aW9uICh0cmFuc2xhdGVzLCByb3csIGkpIHtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zbGF0ZXNbaV0gPSByb3cubWFwKGZ1bmN0aW9uIChfLCBqKSB7IHJldHVybiBpID09PSAwID8gMCA6IHRvRmxvYXQodHJhbnNsYXRlc1tpIC0gMV1bal0pICsgKGhlaWdodCQkMSAtIHRvRmxvYXQocm93c1tpIC0gMV1bal0gJiYgcm93c1tpIC0gMV1bal0ub2Zmc2V0SGVpZ2h0KSk7IH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodCQkMSA9IHJvdy5yZWR1Y2UoZnVuY3Rpb24gKGhlaWdodCQkMSwgZWwpIHsgcmV0dXJuIE1hdGgubWF4KGhlaWdodCQkMSwgZWwub2Zmc2V0SGVpZ2h0KTsgfSwgMCk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJhbnNsYXRlcztcblxuICAgICAgICAgICAgICAgICAgICAgICAgfSwgW10pO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBlbEhlaWdodCA9IG1heENvbHVtbkhlaWdodChyb3dzKSArIGdldE1hcmdpblRvcCh0aGlzLiRlbCwgdGhpcy5tYXJnaW4pICogKHJvd3MubGVuZ3RoIC0gMSk7XG5cbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7cm93czogcm93cywgdHJhbnNsYXRlczogdHJhbnNsYXRlcywgaGVpZ2h0OiAhdHJhbnNpdGlvbkluUHJvZ3Jlc3MgPyBlbEhlaWdodCA6IGZhbHNlfTtcblxuICAgICAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgICAgICB3cml0ZTogZnVuY3Rpb24ocmVmKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBzdGFja3MgPSByZWYuc3RhY2tzO1xuICAgICAgICAgICAgICAgICAgICB2YXIgaGVpZ2h0JCQxID0gcmVmLmhlaWdodDtcblxuXG4gICAgICAgICAgICAgICAgICAgIHRvZ2dsZUNsYXNzKHRoaXMuJGVsLCB0aGlzLmNsc1N0YWNrLCBzdGFja3MpO1xuXG4gICAgICAgICAgICAgICAgICAgIGNzcyh0aGlzLiRlbCwgJ3BhZGRpbmdCb3R0b20nLCB0aGlzLnBhcmFsbGF4KTtcbiAgICAgICAgICAgICAgICAgICAgaGVpZ2h0JCQxICE9PSBmYWxzZSAmJiBjc3ModGhpcy4kZWwsICdoZWlnaHQnLCBoZWlnaHQkJDEpO1xuXG4gICAgICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgICAgIGV2ZW50czogWydyZXNpemUnXVxuXG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICB7XG5cbiAgICAgICAgICAgICAgICByZWFkOiBmdW5jdGlvbihyZWYpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGhlaWdodCQkMSA9IHJlZi5oZWlnaHQ7XG5cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNjcm9sbGVkOiB0aGlzLnBhcmFsbGF4XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBzY3JvbGxlZE92ZXIodGhpcy4kZWwsIGhlaWdodCQkMSA/IGhlaWdodCQkMSAtIGhlaWdodCh0aGlzLiRlbCkgOiAwKSAqIHRoaXMucGFyYWxsYXhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGZhbHNlXG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgICAgIHdyaXRlOiBmdW5jdGlvbihyZWYpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHJvd3MgPSByZWYucm93cztcbiAgICAgICAgICAgICAgICAgICAgdmFyIHNjcm9sbGVkID0gcmVmLnNjcm9sbGVkO1xuICAgICAgICAgICAgICAgICAgICB2YXIgdHJhbnNsYXRlcyA9IHJlZi50cmFuc2xhdGVzO1xuXG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHNjcm9sbGVkID09PSBmYWxzZSAmJiAhdHJhbnNsYXRlcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgcm93cy5mb3JFYWNoKGZ1bmN0aW9uIChyb3csIGkpIHsgcmV0dXJuIHJvdy5mb3JFYWNoKGZ1bmN0aW9uIChlbCwgaikgeyByZXR1cm4gY3NzKGVsLCAndHJhbnNmb3JtJywgIXNjcm9sbGVkICYmICF0cmFuc2xhdGVzID8gJycgOiAoXCJ0cmFuc2xhdGVZKFwiICsgKCh0cmFuc2xhdGVzICYmIC10cmFuc2xhdGVzW2ldW2pdKSArIChzY3JvbGxlZCA/IGogJSAyID8gc2Nyb2xsZWQgOiBzY3JvbGxlZCAvIDggOiAwKSkgKyBcInB4KVwiKSk7IH1cbiAgICAgICAgICAgICAgICAgICAgICAgICk7IH1cbiAgICAgICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgICAgICBldmVudHM6IFsnc2Nyb2xsJywgJ3Jlc2l6ZSddXG5cbiAgICAgICAgICAgIH1cblxuICAgICAgICBdXG5cbiAgICB9O1xuXG4gICAgZnVuY3Rpb24gZ2V0TWFyZ2luVG9wKHJvb3QsIGNscykge1xuXG4gICAgICAgIHZhciBub2RlcyA9IHRvTm9kZXMocm9vdC5jaGlsZHJlbik7XG4gICAgICAgIHZhciByZWYgPSBub2Rlcy5maWx0ZXIoZnVuY3Rpb24gKGVsKSB7IHJldHVybiBoYXNDbGFzcyhlbCwgY2xzKTsgfSk7XG4gICAgICAgIHZhciBub2RlID0gcmVmWzBdO1xuXG4gICAgICAgIHJldHVybiB0b0Zsb2F0KG5vZGVcbiAgICAgICAgICAgID8gY3NzKG5vZGUsICdtYXJnaW5Ub3AnKVxuICAgICAgICAgICAgOiBjc3Mobm9kZXNbMF0sICdwYWRkaW5nTGVmdCcpKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBtYXhDb2x1bW5IZWlnaHQocm93cykge1xuICAgICAgICByZXR1cm4gTWF0aC5tYXguYXBwbHkoTWF0aCwgcm93cy5yZWR1Y2UoZnVuY3Rpb24gKHN1bSwgcm93KSB7XG4gICAgICAgICAgICByb3cuZm9yRWFjaChmdW5jdGlvbiAoZWwsIGkpIHsgcmV0dXJuIHN1bVtpXSA9IChzdW1baV0gfHwgMCkgKyBlbC5vZmZzZXRIZWlnaHQ7IH0pO1xuICAgICAgICAgICAgcmV0dXJuIHN1bTtcbiAgICAgICAgfSwgW10pKTtcbiAgICB9XG5cbiAgICAvLyBJRSAxMSBmaXggKG1pbi1oZWlnaHQgb24gYSBmbGV4IGNvbnRhaW5lciB3b24ndCBhcHBseSB0byBpdHMgZmxleCBpdGVtcylcbiAgICB2YXIgRmxleEJ1ZyA9IGlzSUUgPyB7XG5cbiAgICAgICAgZGF0YToge1xuICAgICAgICAgICAgc2VsTWluSGVpZ2h0OiBmYWxzZSxcbiAgICAgICAgICAgIGZvcmNlSGVpZ2h0OiBmYWxzZVxuICAgICAgICB9LFxuXG4gICAgICAgIGNvbXB1dGVkOiB7XG5cbiAgICAgICAgICAgIGVsZW1lbnRzOiBmdW5jdGlvbihyZWYsICRlbCkge1xuICAgICAgICAgICAgICAgIHZhciBzZWxNaW5IZWlnaHQgPSByZWYuc2VsTWluSGVpZ2h0O1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuIHNlbE1pbkhlaWdodCA/ICQkKHNlbE1pbkhlaWdodCwgJGVsKSA6IFskZWxdO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgIH0sXG5cbiAgICAgICAgdXBkYXRlOiBbXG5cbiAgICAgICAgICAgIHtcblxuICAgICAgICAgICAgICAgIHJlYWQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICBjc3ModGhpcy5lbGVtZW50cywgJ2hlaWdodCcsICcnKTtcbiAgICAgICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICAgICAgb3JkZXI6IC01LFxuXG4gICAgICAgICAgICAgICAgZXZlbnRzOiBbJ3Jlc2l6ZSddXG5cbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIHtcblxuICAgICAgICAgICAgICAgIHdyaXRlOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHRoaXMkMSA9IHRoaXM7XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5lbGVtZW50cy5mb3JFYWNoKGZ1bmN0aW9uIChlbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGhlaWdodCQkMSA9IHRvRmxvYXQoY3NzKGVsLCAnbWluSGVpZ2h0JykpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGhlaWdodCQkMSAmJiAodGhpcyQxLmZvcmNlSGVpZ2h0IHx8IE1hdGgucm91bmQoaGVpZ2h0JCQxICsgYm94TW9kZWxBZGp1c3QoJ2hlaWdodCcsIGVsLCAnY29udGVudC1ib3gnKSkgPj0gZWwub2Zmc2V0SGVpZ2h0KSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNzcyhlbCwgJ2hlaWdodCcsIGhlaWdodCQkMSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgICAgICBvcmRlcjogNSxcblxuICAgICAgICAgICAgICAgIGV2ZW50czogWydyZXNpemUnXVxuXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgXVxuXG4gICAgfSA6IHt9O1xuXG4gICAgdmFyIEhlaWdodE1hdGNoID0ge1xuXG4gICAgICAgIG1peGluczogW0ZsZXhCdWddLFxuXG4gICAgICAgIGFyZ3M6ICd0YXJnZXQnLFxuXG4gICAgICAgIHByb3BzOiB7XG4gICAgICAgICAgICB0YXJnZXQ6IFN0cmluZyxcbiAgICAgICAgICAgIHJvdzogQm9vbGVhblxuICAgICAgICB9LFxuXG4gICAgICAgIGRhdGE6IHtcbiAgICAgICAgICAgIHRhcmdldDogJz4gKicsXG4gICAgICAgICAgICByb3c6IHRydWUsXG4gICAgICAgICAgICBmb3JjZUhlaWdodDogdHJ1ZVxuICAgICAgICB9LFxuXG4gICAgICAgIGNvbXB1dGVkOiB7XG5cbiAgICAgICAgICAgIGVsZW1lbnRzOiBmdW5jdGlvbihyZWYsICRlbCkge1xuICAgICAgICAgICAgICAgIHZhciB0YXJnZXQgPSByZWYudGFyZ2V0O1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuICQkKHRhcmdldCwgJGVsKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICB9LFxuXG4gICAgICAgIHVwZGF0ZToge1xuXG4gICAgICAgICAgICByZWFkOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICByb3dzOiAodGhpcy5yb3cgPyBnZXRSb3dzKHRoaXMuZWxlbWVudHMpIDogW3RoaXMuZWxlbWVudHNdKS5tYXAobWF0Y2gpXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIHdyaXRlOiBmdW5jdGlvbihyZWYpIHtcbiAgICAgICAgICAgICAgICB2YXIgcm93cyA9IHJlZi5yb3dzO1xuXG4gICAgICAgICAgICAgICAgcm93cy5mb3JFYWNoKGZ1bmN0aW9uIChyZWYpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBoZWlnaHRzID0gcmVmLmhlaWdodHM7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgZWxlbWVudHMgPSByZWYuZWxlbWVudHM7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlbGVtZW50cy5mb3JFYWNoKGZ1bmN0aW9uIChlbCwgaSkgeyByZXR1cm4gY3NzKGVsLCAnbWluSGVpZ2h0JywgaGVpZ2h0c1tpXSk7IH1cbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIGV2ZW50czogWydyZXNpemUnXVxuXG4gICAgICAgIH1cblxuICAgIH07XG5cbiAgICBmdW5jdGlvbiBtYXRjaChlbGVtZW50cykge1xuICAgICAgICB2YXIgYXNzaWduJCQxO1xuXG5cbiAgICAgICAgaWYgKGVsZW1lbnRzLmxlbmd0aCA8IDIpIHtcbiAgICAgICAgICAgIHJldHVybiB7aGVpZ2h0czogWycnXSwgZWxlbWVudHM6IGVsZW1lbnRzfTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciByZWYgPSBnZXRIZWlnaHRzKGVsZW1lbnRzKTtcbiAgICAgICAgdmFyIGhlaWdodHMgPSByZWYuaGVpZ2h0cztcbiAgICAgICAgdmFyIG1heCA9IHJlZi5tYXg7XG4gICAgICAgIHZhciBoYXNNaW5IZWlnaHQgPSBlbGVtZW50cy5zb21lKGZ1bmN0aW9uIChlbCkgeyByZXR1cm4gZWwuc3R5bGUubWluSGVpZ2h0OyB9KTtcbiAgICAgICAgdmFyIGhhc1NocnVuayA9IGVsZW1lbnRzLnNvbWUoZnVuY3Rpb24gKGVsLCBpKSB7IHJldHVybiAhZWwuc3R5bGUubWluSGVpZ2h0ICYmIGhlaWdodHNbaV0gPCBtYXg7IH0pO1xuXG4gICAgICAgIGlmIChoYXNNaW5IZWlnaHQgJiYgaGFzU2hydW5rKSB7XG4gICAgICAgICAgICBjc3MoZWxlbWVudHMsICdtaW5IZWlnaHQnLCAnJyk7XG4gICAgICAgICAgICAoKGFzc2lnbiQkMSA9IGdldEhlaWdodHMoZWxlbWVudHMpLCBoZWlnaHRzID0gYXNzaWduJCQxLmhlaWdodHMsIG1heCA9IGFzc2lnbiQkMS5tYXgpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGhlaWdodHMgPSBlbGVtZW50cy5tYXAoZnVuY3Rpb24gKGVsLCBpKSB7IHJldHVybiBoZWlnaHRzW2ldID09PSBtYXggJiYgdG9GbG9hdChlbC5zdHlsZS5taW5IZWlnaHQpLnRvRml4ZWQoMikgIT09IG1heC50b0ZpeGVkKDIpID8gJycgOiBtYXg7IH1cbiAgICAgICAgKTtcblxuICAgICAgICByZXR1cm4ge2hlaWdodHM6IGhlaWdodHMsIGVsZW1lbnRzOiBlbGVtZW50c307XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2V0SGVpZ2h0cyhlbGVtZW50cykge1xuICAgICAgICB2YXIgaGVpZ2h0cyA9IGVsZW1lbnRzLm1hcChmdW5jdGlvbiAoZWwpIHsgcmV0dXJuIG9mZnNldChlbCkuaGVpZ2h0IC0gYm94TW9kZWxBZGp1c3QoJ2hlaWdodCcsIGVsLCAnY29udGVudC1ib3gnKTsgfSk7XG4gICAgICAgIHZhciBtYXggPSBNYXRoLm1heC5hcHBseShudWxsLCBoZWlnaHRzKTtcblxuICAgICAgICByZXR1cm4ge2hlaWdodHM6IGhlaWdodHMsIG1heDogbWF4fTtcbiAgICB9XG5cbiAgICB2YXIgSGVpZ2h0Vmlld3BvcnQgPSB7XG5cbiAgICAgICAgbWl4aW5zOiBbRmxleEJ1Z10sXG5cbiAgICAgICAgcHJvcHM6IHtcbiAgICAgICAgICAgIGV4cGFuZDogQm9vbGVhbixcbiAgICAgICAgICAgIG9mZnNldFRvcDogQm9vbGVhbixcbiAgICAgICAgICAgIG9mZnNldEJvdHRvbTogQm9vbGVhbixcbiAgICAgICAgICAgIG1pbkhlaWdodDogTnVtYmVyXG4gICAgICAgIH0sXG5cbiAgICAgICAgZGF0YToge1xuICAgICAgICAgICAgZXhwYW5kOiBmYWxzZSxcbiAgICAgICAgICAgIG9mZnNldFRvcDogZmFsc2UsXG4gICAgICAgICAgICBvZmZzZXRCb3R0b206IGZhbHNlLFxuICAgICAgICAgICAgbWluSGVpZ2h0OiAwXG4gICAgICAgIH0sXG5cbiAgICAgICAgdXBkYXRlOiB7XG5cbiAgICAgICAgICAgIHJlYWQ6IGZ1bmN0aW9uKCkge1xuXG4gICAgICAgICAgICAgICAgdmFyIG1pbkhlaWdodCA9ICcnO1xuICAgICAgICAgICAgICAgIHZhciBib3ggPSBib3hNb2RlbEFkanVzdCgnaGVpZ2h0JywgdGhpcy4kZWwsICdjb250ZW50LWJveCcpO1xuXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuZXhwYW5kKSB7XG5cbiAgICAgICAgICAgICAgICAgICAgbWluSGVpZ2h0ID0gaGVpZ2h0KHdpbmRvdykgLSAob2Zmc2V0SGVpZ2h0KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCkgLSBvZmZzZXRIZWlnaHQodGhpcy4kZWwpKSAtIGJveCB8fCAnJztcblxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gb24gbW9iaWxlIGRldmljZXMgKGlPUyBhbmQgQW5kcm9pZCkgd2luZG93LmlubmVySGVpZ2h0ICE9PSAxMDB2aFxuICAgICAgICAgICAgICAgICAgICBtaW5IZWlnaHQgPSAnY2FsYygxMDB2aCc7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMub2Zmc2V0VG9wKSB7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciByZWYgPSBvZmZzZXQodGhpcy4kZWwpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHRvcCA9IHJlZi50b3A7XG4gICAgICAgICAgICAgICAgICAgICAgICBtaW5IZWlnaHQgKz0gdG9wIDwgaGVpZ2h0KHdpbmRvdykgLyAyID8gKFwiIC0gXCIgKyB0b3AgKyBcInB4XCIpIDogJyc7XG5cbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLm9mZnNldEJvdHRvbSA9PT0gdHJ1ZSkge1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBtaW5IZWlnaHQgKz0gXCIgLSBcIiArIChvZmZzZXRIZWlnaHQodGhpcy4kZWwubmV4dEVsZW1lbnRTaWJsaW5nKSkgKyBcInB4XCI7XG5cbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpc051bWVyaWModGhpcy5vZmZzZXRCb3R0b20pKSB7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIG1pbkhlaWdodCArPSBcIiAtIFwiICsgKHRoaXMub2Zmc2V0Qm90dG9tKSArIFwidmhcIjtcblxuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMub2Zmc2V0Qm90dG9tICYmIGVuZHNXaXRoKHRoaXMub2Zmc2V0Qm90dG9tLCAncHgnKSkge1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBtaW5IZWlnaHQgKz0gXCIgLSBcIiArICh0b0Zsb2F0KHRoaXMub2Zmc2V0Qm90dG9tKSkgKyBcInB4XCI7XG5cbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpc1N0cmluZyh0aGlzLm9mZnNldEJvdHRvbSkpIHtcblxuICAgICAgICAgICAgICAgICAgICAgICAgbWluSGVpZ2h0ICs9IFwiIC0gXCIgKyAob2Zmc2V0SGVpZ2h0KHF1ZXJ5KHRoaXMub2Zmc2V0Qm90dG9tLCB0aGlzLiRlbCkpKSArIFwicHhcIjtcblxuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgbWluSGVpZ2h0ICs9IChib3ggPyAoXCIgLSBcIiArIGJveCArIFwicHhcIikgOiAnJykgKyBcIilcIjtcblxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHJldHVybiB7bWluSGVpZ2h0OiBtaW5IZWlnaHR9O1xuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgd3JpdGU6IGZ1bmN0aW9uKHJlZikge1xuICAgICAgICAgICAgICAgIHZhciBtaW5IZWlnaHQgPSByZWYubWluSGVpZ2h0O1xuXG5cbiAgICAgICAgICAgICAgICBjc3ModGhpcy4kZWwsIHttaW5IZWlnaHQ6IG1pbkhlaWdodH0pO1xuXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMubWluSGVpZ2h0ICYmIHRvRmxvYXQoY3NzKHRoaXMuJGVsLCAnbWluSGVpZ2h0JykpIDwgdGhpcy5taW5IZWlnaHQpIHtcbiAgICAgICAgICAgICAgICAgICAgY3NzKHRoaXMuJGVsLCAnbWluSGVpZ2h0JywgdGhpcy5taW5IZWlnaHQpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgZXZlbnRzOiBbJ3Jlc2l6ZSddXG5cbiAgICAgICAgfVxuXG4gICAgfTtcblxuICAgIGZ1bmN0aW9uIG9mZnNldEhlaWdodChlbCkge1xuICAgICAgICByZXR1cm4gZWwgJiYgZWwub2Zmc2V0SGVpZ2h0IHx8IDA7XG4gICAgfVxuXG4gICAgdmFyIHN2Z3MgPSB7fTtcblxuICAgIHZhciBTVkcgPSB7XG5cbiAgICAgICAgYXJnczogJ3NyYycsXG5cbiAgICAgICAgcHJvcHM6IHtcbiAgICAgICAgICAgIGlkOiBTdHJpbmcsXG4gICAgICAgICAgICBpY29uOiBTdHJpbmcsXG4gICAgICAgICAgICBzcmM6IFN0cmluZyxcbiAgICAgICAgICAgIHN0eWxlOiBTdHJpbmcsXG4gICAgICAgICAgICB3aWR0aDogTnVtYmVyLFxuICAgICAgICAgICAgaGVpZ2h0OiBOdW1iZXIsXG4gICAgICAgICAgICByYXRpbzogTnVtYmVyLFxuICAgICAgICAgICAgJ2NsYXNzJzogU3RyaW5nXG4gICAgICAgIH0sXG5cbiAgICAgICAgZGF0YToge1xuICAgICAgICAgICAgcmF0aW86IDEsXG4gICAgICAgICAgICBpZDogZmFsc2UsXG4gICAgICAgICAgICBleGNsdWRlOiBbJ3JhdGlvJywgJ3NyYycsICdpY29uJ10sXG4gICAgICAgICAgICAnY2xhc3MnOiAnJ1xuICAgICAgICB9LFxuXG4gICAgICAgIGNvbm5lY3RlZDogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICB2YXIgdGhpcyQxID0gdGhpcztcbiAgICAgICAgICAgIHZhciBhc3NpZ24kJDE7XG5cblxuICAgICAgICAgICAgdGhpcy5jbGFzcyArPSAnIHVrLXN2Zyc7XG5cbiAgICAgICAgICAgIGlmICghdGhpcy5pY29uICYmIGluY2x1ZGVzKHRoaXMuc3JjLCAnIycpKSB7XG5cbiAgICAgICAgICAgICAgICB2YXIgcGFydHMgPSB0aGlzLnNyYy5zcGxpdCgnIycpO1xuXG4gICAgICAgICAgICAgICAgaWYgKHBhcnRzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgKGFzc2lnbiQkMSA9IHBhcnRzLCB0aGlzLnNyYyA9IGFzc2lnbiQkMVswXSwgdGhpcy5pY29uID0gYXNzaWduJCQxWzFdKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuc3ZnID0gdGhpcy5nZXRTdmcoKS50aGVuKGZ1bmN0aW9uIChzdmcpIHtcblxuICAgICAgICAgICAgICAgIHZhciBlbDtcblxuICAgICAgICAgICAgICAgIGlmIChpc1N0cmluZyhzdmcpKSB7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMkMS5pY29uICYmIGluY2x1ZGVzKHN2ZywgJzxzeW1ib2wnKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgc3ZnID0gcGFyc2VTeW1ib2xzKHN2ZywgdGhpcyQxLmljb24pIHx8IHN2ZztcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGVsID0gJChzdmcuc3Vic3RyKHN2Zy5pbmRleE9mKCc8c3ZnJykpKTtcblxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGVsID0gc3ZnLmNsb25lTm9kZSh0cnVlKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoIWVsKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdCgnU1ZHIG5vdCBmb3VuZC4nKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB2YXIgZGltZW5zaW9ucyA9IGF0dHIoZWwsICd2aWV3Qm94Jyk7XG5cbiAgICAgICAgICAgICAgICBpZiAoZGltZW5zaW9ucykge1xuICAgICAgICAgICAgICAgICAgICBkaW1lbnNpb25zID0gZGltZW5zaW9ucy5zcGxpdCgnICcpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzJDEud2lkdGggPSB0aGlzJDEuJHByb3BzLndpZHRoIHx8IGRpbWVuc2lvbnNbMl07XG4gICAgICAgICAgICAgICAgICAgIHRoaXMkMS5oZWlnaHQgPSB0aGlzJDEuJHByb3BzLmhlaWdodCB8fCBkaW1lbnNpb25zWzNdO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHRoaXMkMS53aWR0aCAqPSB0aGlzJDEucmF0aW87XG4gICAgICAgICAgICAgICAgdGhpcyQxLmhlaWdodCAqPSB0aGlzJDEucmF0aW87XG5cbiAgICAgICAgICAgICAgICBmb3IgKHZhciBwcm9wIGluIHRoaXMkMS4kb3B0aW9ucy5wcm9wcykge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcyQxW3Byb3BdICYmICFpbmNsdWRlcyh0aGlzJDEuZXhjbHVkZSwgcHJvcCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGF0dHIoZWwsIHByb3AsIHRoaXMkMVtwcm9wXSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMkMS5pZCkge1xuICAgICAgICAgICAgICAgICAgICByZW1vdmVBdHRyKGVsLCAnaWQnKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAodGhpcyQxLndpZHRoICYmICF0aGlzJDEuaGVpZ2h0KSB7XG4gICAgICAgICAgICAgICAgICAgIHJlbW92ZUF0dHIoZWwsICdoZWlnaHQnKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAodGhpcyQxLmhlaWdodCAmJiAhdGhpcyQxLndpZHRoKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlbW92ZUF0dHIoZWwsICd3aWR0aCcpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHZhciBzcmMgPSB0aGlzJDEuaWNvbiB8fCB0aGlzJDEuc3JjO1xuICAgICAgICAgICAgICAgIGF0dHIoZWwsICdkYXRhLXN2ZycsIHNyYyk7XG5cbiAgICAgICAgICAgICAgICB2YXIgcm9vdCA9IHRoaXMkMS4kZWw7XG4gICAgICAgICAgICAgICAgaWYgKGlzVm9pZEVsZW1lbnQocm9vdCkgfHwgcm9vdC50YWdOYW1lID09PSAnQ0FOVkFTJykge1xuXG4gICAgICAgICAgICAgICAgICAgIGF0dHIocm9vdCwge2hpZGRlbjogdHJ1ZSwgaWQ6IG51bGx9KTtcblxuICAgICAgICAgICAgICAgICAgICB2YXIgbmV4dCA9IHJvb3QubmV4dEVsZW1lbnRTaWJsaW5nO1xuICAgICAgICAgICAgICAgICAgICBpZiAoc3JjID09PSBhdHRyKG5leHQsICdkYXRhLXN2ZycpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbCA9IG5leHQ7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhZnRlcihyb290LCBlbCk7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG5cbiAgICAgICAgICAgICAgICAgICAgdmFyIGxhc3QgPSByb290Lmxhc3RFbGVtZW50Q2hpbGQ7XG4gICAgICAgICAgICAgICAgICAgIGlmIChzcmMgPT09IGF0dHIobGFzdCwgJ2RhdGEtc3ZnJykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsID0gbGFzdDtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZChyb290LCBlbCk7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHRoaXMkMS5zdmdFbCA9IGVsO1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVsO1xuXG4gICAgICAgICAgICB9LCBub29wKTtcblxuICAgICAgICB9LFxuXG4gICAgICAgIGRpc2Nvbm5lY3RlZDogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICB2YXIgdGhpcyQxID0gdGhpcztcblxuXG4gICAgICAgICAgICBpZiAoaXNWb2lkRWxlbWVudCh0aGlzLiRlbCkpIHtcbiAgICAgICAgICAgICAgICBhdHRyKHRoaXMuJGVsLCB7aGlkZGVuOiBudWxsLCBpZDogdGhpcy5pZCB8fCBudWxsfSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0aGlzLnN2Zykge1xuICAgICAgICAgICAgICAgIHRoaXMuc3ZnLnRoZW4oZnVuY3Rpb24gKHN2ZykgeyByZXR1cm4gKCF0aGlzJDEuX2Nvbm5lY3RlZCB8fCBzdmcgIT09IHRoaXMkMS5zdmdFbCkgJiYgcmVtb3ZlKHN2Zyk7IH0sIG5vb3ApO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLnN2ZyA9IHRoaXMuc3ZnRWwgPSBudWxsO1xuXG4gICAgICAgIH0sXG5cbiAgICAgICAgbWV0aG9kczoge1xuXG4gICAgICAgICAgICBnZXRTdmc6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIHZhciB0aGlzJDEgPSB0aGlzO1xuXG5cbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuc3JjKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdCgpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChzdmdzW3RoaXMuc3JjXSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3Znc1t0aGlzLnNyY107XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgc3Znc1t0aGlzLnNyY10gPSBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXJ0c1dpdGgodGhpcyQxLnNyYywgJ2RhdGE6JykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoZGVjb2RlVVJJQ29tcG9uZW50KHRoaXMkMS5zcmMuc3BsaXQoJywnKVsxXSkpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBhamF4KHRoaXMkMS5zcmMpLnRoZW4oXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gKHhocikgeyByZXR1cm4gcmVzb2x2ZSh4aHIucmVzcG9uc2UpOyB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uICgpIHsgcmV0dXJuIHJlamVjdCgnU1ZHIG5vdCBmb3VuZC4nKTsgfVxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgIHJldHVybiBzdmdzW3RoaXMuc3JjXTtcblxuICAgICAgICAgICAgfVxuXG4gICAgICAgIH1cblxuICAgIH07XG5cbiAgICB2YXIgc3ltYm9sUmUgPSAvPHN5bWJvbCguKj9pZD0oWydcIl0pKC4qPylcXDJbXl0qPzxcXC8pc3ltYm9sPi9nO1xuICAgIHZhciBzeW1ib2xzID0ge307XG5cbiAgICBmdW5jdGlvbiBwYXJzZVN5bWJvbHMoc3ZnLCBpY29uKSB7XG5cbiAgICAgICAgaWYgKCFzeW1ib2xzW3N2Z10pIHtcblxuICAgICAgICAgICAgc3ltYm9sc1tzdmddID0ge307XG5cbiAgICAgICAgICAgIHZhciBtYXRjaDtcbiAgICAgICAgICAgIHdoaWxlICgobWF0Y2ggPSBzeW1ib2xSZS5leGVjKHN2ZykpKSB7XG4gICAgICAgICAgICAgICAgc3ltYm9sc1tzdmddW21hdGNoWzNdXSA9IFwiPHN2ZyB4bWxucz1cXFwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcXFwiXCIgKyAobWF0Y2hbMV0pICsgXCJzdmc+XCI7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHN5bWJvbFJlLmxhc3RJbmRleCA9IDA7XG5cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBzeW1ib2xzW3N2Z11baWNvbl07XG4gICAgfVxuXG4gICAgdmFyIGNsb3NlSWNvbiA9IFwiPHN2ZyB3aWR0aD1cXFwiMTRcXFwiIGhlaWdodD1cXFwiMTRcXFwiIHZpZXdCb3g9XFxcIjAgMCAxNCAxNFxcXCIgeG1sbnM9XFxcImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXFxcIj48bGluZSBmaWxsPVxcXCJub25lXFxcIiBzdHJva2U9XFxcIiMwMDBcXFwiIHN0cm9rZS13aWR0aD1cXFwiMS4xXFxcIiB4MT1cXFwiMVxcXCIgeTE9XFxcIjFcXFwiIHgyPVxcXCIxM1xcXCIgeTI9XFxcIjEzXFxcIi8+PGxpbmUgZmlsbD1cXFwibm9uZVxcXCIgc3Ryb2tlPVxcXCIjMDAwXFxcIiBzdHJva2Utd2lkdGg9XFxcIjEuMVxcXCIgeDE9XFxcIjEzXFxcIiB5MT1cXFwiMVxcXCIgeDI9XFxcIjFcXFwiIHkyPVxcXCIxM1xcXCIvPjwvc3ZnPlwiO1xuXG4gICAgdmFyIGNsb3NlTGFyZ2UgPSBcIjxzdmcgd2lkdGg9XFxcIjIwXFxcIiBoZWlnaHQ9XFxcIjIwXFxcIiB2aWV3Qm94PVxcXCIwIDAgMjAgMjBcXFwiIHhtbG5zPVxcXCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1xcXCI+PGxpbmUgZmlsbD1cXFwibm9uZVxcXCIgc3Ryb2tlPVxcXCIjMDAwXFxcIiBzdHJva2Utd2lkdGg9XFxcIjEuNFxcXCIgeDE9XFxcIjFcXFwiIHkxPVxcXCIxXFxcIiB4Mj1cXFwiMTlcXFwiIHkyPVxcXCIxOVxcXCIvPjxsaW5lIGZpbGw9XFxcIm5vbmVcXFwiIHN0cm9rZT1cXFwiIzAwMFxcXCIgc3Ryb2tlLXdpZHRoPVxcXCIxLjRcXFwiIHgxPVxcXCIxOVxcXCIgeTE9XFxcIjFcXFwiIHgyPVxcXCIxXFxcIiB5Mj1cXFwiMTlcXFwiLz48L3N2Zz5cIjtcblxuICAgIHZhciBtYXJrZXIgPSBcIjxzdmcgd2lkdGg9XFxcIjIwXFxcIiBoZWlnaHQ9XFxcIjIwXFxcIiB2aWV3Qm94PVxcXCIwIDAgMjAgMjBcXFwiIHhtbG5zPVxcXCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1xcXCI+PHJlY3QgeD1cXFwiOVxcXCIgeT1cXFwiNFxcXCIgd2lkdGg9XFxcIjFcXFwiIGhlaWdodD1cXFwiMTFcXFwiLz48cmVjdCB4PVxcXCI0XFxcIiB5PVxcXCI5XFxcIiB3aWR0aD1cXFwiMTFcXFwiIGhlaWdodD1cXFwiMVxcXCIvPjwvc3ZnPlwiO1xuXG4gICAgdmFyIG5hdmJhclRvZ2dsZUljb24gPSBcIjxzdmcgd2lkdGg9XFxcIjIwXFxcIiBoZWlnaHQ9XFxcIjIwXFxcIiB2aWV3Qm94PVxcXCIwIDAgMjAgMjBcXFwiIHhtbG5zPVxcXCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1xcXCI+PHJlY3QgeT1cXFwiOVxcXCIgd2lkdGg9XFxcIjIwXFxcIiBoZWlnaHQ9XFxcIjJcXFwiLz48cmVjdCB5PVxcXCIzXFxcIiB3aWR0aD1cXFwiMjBcXFwiIGhlaWdodD1cXFwiMlxcXCIvPjxyZWN0IHk9XFxcIjE1XFxcIiB3aWR0aD1cXFwiMjBcXFwiIGhlaWdodD1cXFwiMlxcXCIvPjwvc3ZnPlwiO1xuXG4gICAgdmFyIG92ZXJsYXlJY29uID0gXCI8c3ZnIHdpZHRoPVxcXCI0MFxcXCIgaGVpZ2h0PVxcXCI0MFxcXCIgdmlld0JveD1cXFwiMCAwIDQwIDQwXFxcIiB4bWxucz1cXFwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcXFwiPjxyZWN0IHg9XFxcIjE5XFxcIiB5PVxcXCIwXFxcIiB3aWR0aD1cXFwiMVxcXCIgaGVpZ2h0PVxcXCI0MFxcXCIvPjxyZWN0IHg9XFxcIjBcXFwiIHk9XFxcIjE5XFxcIiB3aWR0aD1cXFwiNDBcXFwiIGhlaWdodD1cXFwiMVxcXCIvPjwvc3ZnPlwiO1xuXG4gICAgdmFyIHBhZ2luYXRpb25OZXh0ID0gXCI8c3ZnIHdpZHRoPVxcXCI3XFxcIiBoZWlnaHQ9XFxcIjEyXFxcIiB2aWV3Qm94PVxcXCIwIDAgNyAxMlxcXCIgeG1sbnM9XFxcImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXFxcIj48cG9seWxpbmUgZmlsbD1cXFwibm9uZVxcXCIgc3Ryb2tlPVxcXCIjMDAwXFxcIiBzdHJva2Utd2lkdGg9XFxcIjEuMlxcXCIgcG9pbnRzPVxcXCIxIDEgNiA2IDEgMTFcXFwiLz48L3N2Zz5cIjtcblxuICAgIHZhciBwYWdpbmF0aW9uUHJldmlvdXMgPSBcIjxzdmcgd2lkdGg9XFxcIjdcXFwiIGhlaWdodD1cXFwiMTJcXFwiIHZpZXdCb3g9XFxcIjAgMCA3IDEyXFxcIiB4bWxucz1cXFwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcXFwiPjxwb2x5bGluZSBmaWxsPVxcXCJub25lXFxcIiBzdHJva2U9XFxcIiMwMDBcXFwiIHN0cm9rZS13aWR0aD1cXFwiMS4yXFxcIiBwb2ludHM9XFxcIjYgMSAxIDYgNiAxMVxcXCIvPjwvc3ZnPlwiO1xuXG4gICAgdmFyIHNlYXJjaEljb24gPSBcIjxzdmcgd2lkdGg9XFxcIjIwXFxcIiBoZWlnaHQ9XFxcIjIwXFxcIiB2aWV3Qm94PVxcXCIwIDAgMjAgMjBcXFwiIHhtbG5zPVxcXCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1xcXCI+PGNpcmNsZSBmaWxsPVxcXCJub25lXFxcIiBzdHJva2U9XFxcIiMwMDBcXFwiIHN0cm9rZS13aWR0aD1cXFwiMS4xXFxcIiBjeD1cXFwiOVxcXCIgY3k9XFxcIjlcXFwiIHI9XFxcIjdcXFwiLz48cGF0aCBmaWxsPVxcXCJub25lXFxcIiBzdHJva2U9XFxcIiMwMDBcXFwiIHN0cm9rZS13aWR0aD1cXFwiMS4xXFxcIiBkPVxcXCJNMTQsMTQgTDE4LDE4IEwxNCwxNCBaXFxcIi8+PC9zdmc+XCI7XG5cbiAgICB2YXIgc2VhcmNoTGFyZ2UgPSBcIjxzdmcgd2lkdGg9XFxcIjQwXFxcIiBoZWlnaHQ9XFxcIjQwXFxcIiB2aWV3Qm94PVxcXCIwIDAgNDAgNDBcXFwiIHhtbG5zPVxcXCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1xcXCI+PGNpcmNsZSBmaWxsPVxcXCJub25lXFxcIiBzdHJva2U9XFxcIiMwMDBcXFwiIHN0cm9rZS13aWR0aD1cXFwiMS44XFxcIiBjeD1cXFwiMTcuNVxcXCIgY3k9XFxcIjE3LjVcXFwiIHI9XFxcIjE2LjVcXFwiLz48bGluZSBmaWxsPVxcXCJub25lXFxcIiBzdHJva2U9XFxcIiMwMDBcXFwiIHN0cm9rZS13aWR0aD1cXFwiMS44XFxcIiB4MT1cXFwiMzhcXFwiIHkxPVxcXCIzOVxcXCIgeDI9XFxcIjI5XFxcIiB5Mj1cXFwiMzBcXFwiLz48L3N2Zz5cIjtcblxuICAgIHZhciBzZWFyY2hOYXZiYXIgPSBcIjxzdmcgd2lkdGg9XFxcIjI0XFxcIiBoZWlnaHQ9XFxcIjI0XFxcIiB2aWV3Qm94PVxcXCIwIDAgMjQgMjRcXFwiIHhtbG5zPVxcXCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1xcXCI+PGNpcmNsZSBmaWxsPVxcXCJub25lXFxcIiBzdHJva2U9XFxcIiMwMDBcXFwiIHN0cm9rZS13aWR0aD1cXFwiMS4xXFxcIiBjeD1cXFwiMTAuNVxcXCIgY3k9XFxcIjEwLjVcXFwiIHI9XFxcIjkuNVxcXCIvPjxsaW5lIGZpbGw9XFxcIm5vbmVcXFwiIHN0cm9rZT1cXFwiIzAwMFxcXCIgc3Ryb2tlLXdpZHRoPVxcXCIxLjFcXFwiIHgxPVxcXCIyM1xcXCIgeTE9XFxcIjIzXFxcIiB4Mj1cXFwiMTdcXFwiIHkyPVxcXCIxN1xcXCIvPjwvc3ZnPlwiO1xuXG4gICAgdmFyIHNsaWRlbmF2TmV4dCA9IFwiPHN2ZyB3aWR0aD1cXFwiMTRweFxcXCIgaGVpZ2h0PVxcXCIyNHB4XFxcIiB2aWV3Qm94PVxcXCIwIDAgMTQgMjRcXFwiIHhtbG5zPVxcXCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1xcXCI+PHBvbHlsaW5lIGZpbGw9XFxcIm5vbmVcXFwiIHN0cm9rZT1cXFwiIzAwMFxcXCIgc3Ryb2tlLXdpZHRoPVxcXCIxLjRcXFwiIHBvaW50cz1cXFwiMS4yMjUsMjMgMTIuNzc1LDEyIDEuMjI1LDEgXFxcIi8+PC9zdmc+XCI7XG5cbiAgICB2YXIgc2xpZGVuYXZOZXh0TGFyZ2UgPSBcIjxzdmcgd2lkdGg9XFxcIjI1cHhcXFwiIGhlaWdodD1cXFwiNDBweFxcXCIgdmlld0JveD1cXFwiMCAwIDI1IDQwXFxcIiB4bWxucz1cXFwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcXFwiPjxwb2x5bGluZSBmaWxsPVxcXCJub25lXFxcIiBzdHJva2U9XFxcIiMwMDBcXFwiIHN0cm9rZS13aWR0aD1cXFwiMlxcXCIgcG9pbnRzPVxcXCI0LjAwMiwzOC41NDcgMjIuNTI3LDIwLjAyNCA0LDEuNSBcXFwiLz48L3N2Zz5cIjtcblxuICAgIHZhciBzbGlkZW5hdlByZXZpb3VzID0gXCI8c3ZnIHdpZHRoPVxcXCIxNHB4XFxcIiBoZWlnaHQ9XFxcIjI0cHhcXFwiIHZpZXdCb3g9XFxcIjAgMCAxNCAyNFxcXCIgeG1sbnM9XFxcImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXFxcIj48cG9seWxpbmUgZmlsbD1cXFwibm9uZVxcXCIgc3Ryb2tlPVxcXCIjMDAwXFxcIiBzdHJva2Utd2lkdGg9XFxcIjEuNFxcXCIgcG9pbnRzPVxcXCIxMi43NzUsMSAxLjIyNSwxMiAxMi43NzUsMjMgXFxcIi8+PC9zdmc+XCI7XG5cbiAgICB2YXIgc2xpZGVuYXZQcmV2aW91c0xhcmdlID0gXCI8c3ZnIHdpZHRoPVxcXCIyNXB4XFxcIiBoZWlnaHQ9XFxcIjQwcHhcXFwiIHZpZXdCb3g9XFxcIjAgMCAyNSA0MFxcXCIgeG1sbnM9XFxcImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXFxcIj48cG9seWxpbmUgZmlsbD1cXFwibm9uZVxcXCIgc3Ryb2tlPVxcXCIjMDAwXFxcIiBzdHJva2Utd2lkdGg9XFxcIjJcXFwiIHBvaW50cz1cXFwiMjAuNTI3LDEuNSAyLDIwLjAyNCAyMC41MjUsMzguNTQ3IFxcXCIvPjwvc3ZnPlwiO1xuXG4gICAgdmFyIHNwaW5uZXIgPSBcIjxzdmcgd2lkdGg9XFxcIjMwXFxcIiBoZWlnaHQ9XFxcIjMwXFxcIiB2aWV3Qm94PVxcXCIwIDAgMzAgMzBcXFwiIHhtbG5zPVxcXCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1xcXCI+PGNpcmNsZSBmaWxsPVxcXCJub25lXFxcIiBzdHJva2U9XFxcIiMwMDBcXFwiIGN4PVxcXCIxNVxcXCIgY3k9XFxcIjE1XFxcIiByPVxcXCIxNFxcXCIvPjwvc3ZnPlwiO1xuXG4gICAgdmFyIHRvdG9wID0gXCI8c3ZnIHdpZHRoPVxcXCIxOFxcXCIgaGVpZ2h0PVxcXCIxMFxcXCIgdmlld0JveD1cXFwiMCAwIDE4IDEwXFxcIiB4bWxucz1cXFwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcXFwiPjxwb2x5bGluZSBmaWxsPVxcXCJub25lXFxcIiBzdHJva2U9XFxcIiMwMDBcXFwiIHN0cm9rZS13aWR0aD1cXFwiMS4yXFxcIiBwb2ludHM9XFxcIjEgOSA5IDEgMTcgOSBcXFwiLz48L3N2Zz5cIjtcblxuICAgIHZhciBwYXJzZWQgPSB7fTtcbiAgICB2YXIgaWNvbnMgPSB7XG4gICAgICAgIHNwaW5uZXI6IHNwaW5uZXIsXG4gICAgICAgIHRvdG9wOiB0b3RvcCxcbiAgICAgICAgbWFya2VyOiBtYXJrZXIsXG4gICAgICAgICdjbG9zZS1pY29uJzogY2xvc2VJY29uLFxuICAgICAgICAnY2xvc2UtbGFyZ2UnOiBjbG9zZUxhcmdlLFxuICAgICAgICAnbmF2YmFyLXRvZ2dsZS1pY29uJzogbmF2YmFyVG9nZ2xlSWNvbixcbiAgICAgICAgJ292ZXJsYXktaWNvbic6IG92ZXJsYXlJY29uLFxuICAgICAgICAncGFnaW5hdGlvbi1uZXh0JzogcGFnaW5hdGlvbk5leHQsXG4gICAgICAgICdwYWdpbmF0aW9uLXByZXZpb3VzJzogcGFnaW5hdGlvblByZXZpb3VzLFxuICAgICAgICAnc2VhcmNoLWljb24nOiBzZWFyY2hJY29uLFxuICAgICAgICAnc2VhcmNoLWxhcmdlJzogc2VhcmNoTGFyZ2UsXG4gICAgICAgICdzZWFyY2gtbmF2YmFyJzogc2VhcmNoTmF2YmFyLFxuICAgICAgICAnc2xpZGVuYXYtbmV4dCc6IHNsaWRlbmF2TmV4dCxcbiAgICAgICAgJ3NsaWRlbmF2LW5leHQtbGFyZ2UnOiBzbGlkZW5hdk5leHRMYXJnZSxcbiAgICAgICAgJ3NsaWRlbmF2LXByZXZpb3VzJzogc2xpZGVuYXZQcmV2aW91cyxcbiAgICAgICAgJ3NsaWRlbmF2LXByZXZpb3VzLWxhcmdlJzogc2xpZGVuYXZQcmV2aW91c0xhcmdlXG4gICAgfTtcblxuICAgIHZhciBJY29uID0ge1xuXG4gICAgICAgIGluc3RhbGw6IGluc3RhbGwsXG5cbiAgICAgICAgYXR0cnM6IFsnaWNvbicsICdyYXRpbyddLFxuXG4gICAgICAgIG1peGluczogW0NsYXNzLCBTVkddLFxuXG4gICAgICAgIGFyZ3M6ICdpY29uJyxcblxuICAgICAgICBwcm9wczogWydpY29uJ10sXG5cbiAgICAgICAgZGF0YToge2V4Y2x1ZGU6IFsnaWQnLCAnc3R5bGUnLCAnY2xhc3MnLCAnc3JjJywgJ2ljb24nLCAncmF0aW8nXX0sXG5cbiAgICAgICAgaXNJY29uOiB0cnVlLFxuXG4gICAgICAgIGNvbm5lY3RlZDogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICBhZGRDbGFzcyh0aGlzLiRlbCwgJ3VrLWljb24nKTtcbiAgICAgICAgfSxcblxuICAgICAgICBtZXRob2RzOiB7XG5cbiAgICAgICAgICAgIGdldFN2ZzogZnVuY3Rpb24oKSB7XG5cbiAgICAgICAgICAgICAgICB2YXIgaWNvbiA9IGdldEljb24oYXBwbHlSdGwodGhpcy5pY29uKSk7XG5cbiAgICAgICAgICAgICAgICBpZiAoIWljb24pIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KCdJY29uIG5vdCBmb3VuZC4nKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGljb24pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgIH1cblxuICAgIH07XG5cbiAgICB2YXIgSWNvbkNvbXBvbmVudCA9IHtcblxuICAgICAgICBleHRlbmRzOiBJY29uLFxuXG4gICAgICAgIGRhdGE6IGZ1bmN0aW9uICh2bSkgeyByZXR1cm4gKHtcbiAgICAgICAgICAgIGljb246IGh5cGhlbmF0ZSh2bS5jb25zdHJ1Y3Rvci5vcHRpb25zLm5hbWUpXG4gICAgICAgIH0pOyB9XG5cbiAgICB9O1xuXG4gICAgdmFyIFNsaWRlbmF2ID0ge1xuXG4gICAgICAgIGV4dGVuZHM6IEljb25Db21wb25lbnQsXG5cbiAgICAgICAgY29ubmVjdGVkOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIGFkZENsYXNzKHRoaXMuJGVsLCAndWstc2xpZGVuYXYnKTtcbiAgICAgICAgfSxcblxuICAgICAgICBjb21wdXRlZDoge1xuXG4gICAgICAgICAgICBpY29uOiBmdW5jdGlvbihyZWYsICRlbCkge1xuICAgICAgICAgICAgICAgIHZhciBpY29uID0gcmVmLmljb247XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gaGFzQ2xhc3MoJGVsLCAndWstc2xpZGVuYXYtbGFyZ2UnKVxuICAgICAgICAgICAgICAgICAgICA/IChpY29uICsgXCItbGFyZ2VcIilcbiAgICAgICAgICAgICAgICAgICAgOiBpY29uO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgIH1cblxuICAgIH07XG5cbiAgICB2YXIgU2VhcmNoID0ge1xuXG4gICAgICAgIGV4dGVuZHM6IEljb25Db21wb25lbnQsXG5cbiAgICAgICAgY29tcHV0ZWQ6IHtcblxuICAgICAgICAgICAgaWNvbjogZnVuY3Rpb24ocmVmLCAkZWwpIHtcbiAgICAgICAgICAgICAgICB2YXIgaWNvbiA9IHJlZi5pY29uO1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuIGhhc0NsYXNzKCRlbCwgJ3VrLXNlYXJjaC1pY29uJykgJiYgcGFyZW50cygkZWwsICcudWstc2VhcmNoLWxhcmdlJykubGVuZ3RoXG4gICAgICAgICAgICAgICAgICAgID8gJ3NlYXJjaC1sYXJnZSdcbiAgICAgICAgICAgICAgICAgICAgOiBwYXJlbnRzKCRlbCwgJy51ay1zZWFyY2gtbmF2YmFyJykubGVuZ3RoXG4gICAgICAgICAgICAgICAgICAgICAgICA/ICdzZWFyY2gtbmF2YmFyJ1xuICAgICAgICAgICAgICAgICAgICAgICAgOiBpY29uO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgIH1cblxuICAgIH07XG5cbiAgICB2YXIgQ2xvc2UgPSB7XG5cbiAgICAgICAgZXh0ZW5kczogSWNvbkNvbXBvbmVudCxcblxuICAgICAgICBjb21wdXRlZDoge1xuXG4gICAgICAgICAgICBpY29uOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gKFwiY2xvc2UtXCIgKyAoaGFzQ2xhc3ModGhpcy4kZWwsICd1ay1jbG9zZS1sYXJnZScpID8gJ2xhcmdlJyA6ICdpY29uJykpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgIH1cblxuICAgIH07XG5cbiAgICB2YXIgU3Bpbm5lciA9IHtcblxuICAgICAgICBleHRlbmRzOiBJY29uQ29tcG9uZW50LFxuXG4gICAgICAgIGNvbm5lY3RlZDogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICB2YXIgdGhpcyQxID0gdGhpcztcblxuICAgICAgICAgICAgdGhpcy5zdmcudGhlbihmdW5jdGlvbiAoc3ZnKSB7IHJldHVybiB0aGlzJDEucmF0aW8gIT09IDEgJiYgY3NzKCQoJ2NpcmNsZScsIHN2ZyksICdzdHJva2VXaWR0aCcsIDEgLyB0aGlzJDEucmF0aW8pOyB9LCBub29wKTtcbiAgICAgICAgfVxuXG4gICAgfTtcblxuICAgIGZ1bmN0aW9uIGluc3RhbGwoVUlraXQpIHtcbiAgICAgICAgVUlraXQuaWNvbi5hZGQgPSBmdW5jdGlvbiAobmFtZSwgc3ZnKSB7XG4gICAgICAgICAgICB2YXIgb2JqO1xuXG5cbiAgICAgICAgICAgIHZhciBhZGRlZCA9IGlzU3RyaW5nKG5hbWUpID8gKCggb2JqID0ge30sIG9ialtuYW1lXSA9IHN2Zywgb2JqICkpIDogbmFtZTtcbiAgICAgICAgICAgIGVhY2goYWRkZWQsIGZ1bmN0aW9uIChzdmcsIG5hbWUpIHtcbiAgICAgICAgICAgICAgICBpY29uc1tuYW1lXSA9IHN2ZztcbiAgICAgICAgICAgICAgICBkZWxldGUgcGFyc2VkW25hbWVdO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGlmIChVSWtpdC5faW5pdGlhbGl6ZWQpIHtcbiAgICAgICAgICAgICAgICBhcHBseShkb2N1bWVudC5ib2R5LCBmdW5jdGlvbiAoZWwpIHsgcmV0dXJuIGVhY2goVUlraXQuZ2V0Q29tcG9uZW50cyhlbCksIGZ1bmN0aW9uIChjbXApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNtcC4kb3B0aW9ucy5pc0ljb24gJiYgY21wLmljb24gaW4gYWRkZWQgJiYgY21wLiRyZXNldCgpO1xuICAgICAgICAgICAgICAgICAgICB9KTsgfVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2V0SWNvbihpY29uKSB7XG5cbiAgICAgICAgaWYgKCFpY29uc1tpY29uXSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXBhcnNlZFtpY29uXSkge1xuICAgICAgICAgICAgcGFyc2VkW2ljb25dID0gJChpY29uc1tpY29uXS50cmltKCkpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHBhcnNlZFtpY29uXTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBhcHBseVJ0bChpY29uKSB7XG4gICAgICAgIHJldHVybiBpc1J0bCA/IHN3YXAoc3dhcChpY29uLCAnbGVmdCcsICdyaWdodCcpLCAncHJldmlvdXMnLCAnbmV4dCcpIDogaWNvbjtcbiAgICB9XG5cbiAgICB2YXIgSW1nID0ge1xuXG4gICAgICAgIHByb3BzOiB7XG4gICAgICAgICAgICBkYXRhU3JjOiBTdHJpbmcsXG4gICAgICAgICAgICBkYXRhU3Jjc2V0OiBCb29sZWFuLFxuICAgICAgICAgICAgc2l6ZXM6IFN0cmluZyxcbiAgICAgICAgICAgIHdpZHRoOiBOdW1iZXIsXG4gICAgICAgICAgICBoZWlnaHQ6IE51bWJlcixcbiAgICAgICAgICAgIG9mZnNldFRvcDogU3RyaW5nLFxuICAgICAgICAgICAgb2Zmc2V0TGVmdDogU3RyaW5nLFxuICAgICAgICAgICAgdGFyZ2V0OiBTdHJpbmdcbiAgICAgICAgfSxcblxuICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgICBkYXRhU3JjOiAnJyxcbiAgICAgICAgICAgIGRhdGFTcmNzZXQ6IGZhbHNlLFxuICAgICAgICAgICAgc2l6ZXM6IGZhbHNlLFxuICAgICAgICAgICAgd2lkdGg6IGZhbHNlLFxuICAgICAgICAgICAgaGVpZ2h0OiBmYWxzZSxcbiAgICAgICAgICAgIG9mZnNldFRvcDogJzUwdmgnLFxuICAgICAgICAgICAgb2Zmc2V0TGVmdDogMCxcbiAgICAgICAgICAgIHRhcmdldDogZmFsc2VcbiAgICAgICAgfSxcblxuICAgICAgICBjb21wdXRlZDoge1xuXG4gICAgICAgICAgICBjYWNoZUtleTogZnVuY3Rpb24ocmVmKSB7XG4gICAgICAgICAgICAgICAgdmFyIGRhdGFTcmMgPSByZWYuZGF0YVNyYztcblxuICAgICAgICAgICAgICAgIHJldHVybiAoKHRoaXMuJG5hbWUpICsgXCIuXCIgKyBkYXRhU3JjKTtcbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIHdpZHRoOiBmdW5jdGlvbihyZWYpIHtcbiAgICAgICAgICAgICAgICB2YXIgd2lkdGgkJDEgPSByZWYud2lkdGg7XG4gICAgICAgICAgICAgICAgdmFyIGRhdGFXaWR0aCA9IHJlZi5kYXRhV2lkdGg7XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gd2lkdGgkJDEgfHwgZGF0YVdpZHRoO1xuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgaGVpZ2h0OiBmdW5jdGlvbihyZWYpIHtcbiAgICAgICAgICAgICAgICB2YXIgaGVpZ2h0JCQxID0gcmVmLmhlaWdodDtcbiAgICAgICAgICAgICAgICB2YXIgZGF0YUhlaWdodCA9IHJlZi5kYXRhSGVpZ2h0O1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuIGhlaWdodCQkMSB8fCBkYXRhSGVpZ2h0O1xuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgc2l6ZXM6IGZ1bmN0aW9uKHJlZikge1xuICAgICAgICAgICAgICAgIHZhciBzaXplcyA9IHJlZi5zaXplcztcbiAgICAgICAgICAgICAgICB2YXIgZGF0YVNpemVzID0gcmVmLmRhdGFTaXplcztcblxuICAgICAgICAgICAgICAgIHJldHVybiBzaXplcyB8fCBkYXRhU2l6ZXM7XG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICBpc0ltZzogZnVuY3Rpb24oXywgJGVsKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGlzSW1nKCRlbCk7XG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICB0YXJnZXQ6IHtcblxuICAgICAgICAgICAgICAgIGdldDogZnVuY3Rpb24ocmVmKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciB0YXJnZXQgPSByZWYudGFyZ2V0O1xuXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBbdGhpcy4kZWxdLmNvbmNhdChxdWVyeUFsbCh0YXJnZXQsIHRoaXMuJGVsKSk7XG4gICAgICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgICAgIHdhdGNoOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vYnNlcnZlKCk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICBvZmZzZXRUb3A6IGZ1bmN0aW9uKHJlZikge1xuICAgICAgICAgICAgICAgIHZhciBvZmZzZXRUb3AgPSByZWYub2Zmc2V0VG9wO1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRvUHgob2Zmc2V0VG9wLCAnaGVpZ2h0Jyk7XG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICBvZmZzZXRMZWZ0OiBmdW5jdGlvbihyZWYpIHtcbiAgICAgICAgICAgICAgICB2YXIgb2Zmc2V0TGVmdCA9IHJlZi5vZmZzZXRMZWZ0O1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRvUHgob2Zmc2V0TGVmdCwgJ3dpZHRoJyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgfSxcblxuICAgICAgICBjb25uZWN0ZWQ6IGZ1bmN0aW9uKCkge1xuXG4gICAgICAgICAgICBpZiAoc3RvcmFnZVt0aGlzLmNhY2hlS2V5XSkge1xuICAgICAgICAgICAgICAgIHNldFNyY0F0dHJzKHRoaXMuJGVsLCBzdG9yYWdlW3RoaXMuY2FjaGVLZXldIHx8IHRoaXMuZGF0YVNyYywgdGhpcy5kYXRhU3Jjc2V0LCB0aGlzLnNpemVzKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5pc0ltZyAmJiB0aGlzLndpZHRoICYmIHRoaXMuaGVpZ2h0KSB7XG4gICAgICAgICAgICAgICAgc2V0U3JjQXR0cnModGhpcy4kZWwsIGdldFBsYWNlaG9sZGVySW1hZ2UodGhpcy53aWR0aCwgdGhpcy5oZWlnaHQsIHRoaXMuc2l6ZXMpKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5vYnNlcnZlciA9IG5ldyBJbnRlcnNlY3Rpb25PYnNlcnZlcih0aGlzLmxvYWQsIHtcbiAgICAgICAgICAgICAgICByb290TWFyZ2luOiAoKHRoaXMub2Zmc2V0VG9wKSArIFwicHggXCIgKyAodGhpcy5vZmZzZXRMZWZ0KSArIFwicHhcIiksXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKHRoaXMub2JzZXJ2ZSk7XG5cbiAgICAgICAgfSxcblxuICAgICAgICBkaXNjb25uZWN0ZWQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgdGhpcy5vYnNlcnZlci5kaXNjb25uZWN0KCk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgdXBkYXRlOiB7XG5cbiAgICAgICAgICAgIHJlYWQ6IGZ1bmN0aW9uKHJlZikge1xuICAgICAgICAgICAgICAgIHZhciB0aGlzJDEgPSB0aGlzO1xuICAgICAgICAgICAgICAgIHZhciBpbWFnZSA9IHJlZi5pbWFnZTtcblxuXG4gICAgICAgICAgICAgICAgaWYgKCFpbWFnZSAmJiBkb2N1bWVudC5yZWFkeVN0YXRlID09PSAnY29tcGxldGUnKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubG9hZCh0aGlzLm9ic2VydmVyLnRha2VSZWNvcmRzKCkpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmlzSW1nKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpbWFnZSAmJiBpbWFnZS50aGVuKGZ1bmN0aW9uIChpbWcpIHsgcmV0dXJuIGltZyAmJiBpbWcuY3VycmVudFNyYyAhPT0gJycgJiYgc2V0U3JjQXR0cnModGhpcyQxLiRlbCwgY3VycmVudFNyYyhpbWcpKTsgfSk7XG5cbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIHdyaXRlOiBmdW5jdGlvbihkYXRhJCQxKSB7XG5cbiAgICAgICAgICAgICAgICBpZiAodGhpcy5kYXRhU3Jjc2V0ICYmIHdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvICE9PSAxKSB7XG5cbiAgICAgICAgICAgICAgICAgICAgdmFyIGJnU2l6ZSA9IGNzcyh0aGlzLiRlbCwgJ2JhY2tncm91bmRTaXplJyk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChiZ1NpemUubWF0Y2goL14oYXV0b1xccz8pKyQvKSB8fCB0b0Zsb2F0KGJnU2l6ZSkgPT09IGRhdGEkJDEuYmdTaXplKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRhJCQxLmJnU2l6ZSA9IGdldFNvdXJjZVNpemUodGhpcy5kYXRhU3Jjc2V0LCB0aGlzLnNpemVzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNzcyh0aGlzLiRlbCwgJ2JhY2tncm91bmRTaXplJywgKChkYXRhJCQxLmJnU2l6ZSkgKyBcInB4XCIpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICBldmVudHM6IFsncmVzaXplJ11cblxuICAgICAgICB9LFxuXG4gICAgICAgIG1ldGhvZHM6IHtcblxuICAgICAgICAgICAgbG9hZDogZnVuY3Rpb24oZW50cmllcykge1xuICAgICAgICAgICAgICAgIHZhciB0aGlzJDEgPSB0aGlzO1xuXG5cbiAgICAgICAgICAgICAgICBpZiAoIWVudHJpZXMuc29tZShmdW5jdGlvbiAoZW50cnkpIHsgcmV0dXJuIGVudHJ5LmlzSW50ZXJzZWN0aW5nOyB9KSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgdGhpcy5fZGF0YS5pbWFnZSA9IGdldEltYWdlKHRoaXMuZGF0YVNyYywgdGhpcy5kYXRhU3Jjc2V0LCB0aGlzLnNpemVzKS50aGVuKGZ1bmN0aW9uIChpbWcpIHtcblxuICAgICAgICAgICAgICAgICAgICBzZXRTcmNBdHRycyh0aGlzJDEuJGVsLCBjdXJyZW50U3JjKGltZyksIGltZy5zcmNzZXQsIGltZy5zaXplcyk7XG4gICAgICAgICAgICAgICAgICAgIHN0b3JhZ2VbdGhpcyQxLmNhY2hlS2V5XSA9IGN1cnJlbnRTcmMoaW1nKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGltZztcblxuICAgICAgICAgICAgICAgIH0sIG5vb3ApO1xuXG4gICAgICAgICAgICAgICAgdGhpcy5vYnNlcnZlci5kaXNjb25uZWN0KCk7XG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICBvYnNlcnZlOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICB2YXIgdGhpcyQxID0gdGhpcztcblxuICAgICAgICAgICAgICAgIGlmICghdGhpcy5fZGF0YS5pbWFnZSAmJiB0aGlzLl9jb25uZWN0ZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50YXJnZXQuZm9yRWFjaChmdW5jdGlvbiAoZWwpIHsgcmV0dXJuIHRoaXMkMS5vYnNlcnZlci5vYnNlcnZlKGVsKTsgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgIH1cblxuICAgIH07XG5cbiAgICBmdW5jdGlvbiBzZXRTcmNBdHRycyhlbCwgc3JjLCBzcmNzZXQsIHNpemVzKSB7XG5cbiAgICAgICAgaWYgKGlzSW1nKGVsKSkge1xuICAgICAgICAgICAgc2l6ZXMgJiYgKGVsLnNpemVzID0gc2l6ZXMpO1xuICAgICAgICAgICAgc3Jjc2V0ICYmIChlbC5zcmNzZXQgPSBzcmNzZXQpO1xuICAgICAgICAgICAgc3JjICYmIChlbC5zcmMgPSBzcmMpO1xuICAgICAgICB9IGVsc2UgaWYgKHNyYykge1xuXG4gICAgICAgICAgICB2YXIgY2hhbmdlID0gIWluY2x1ZGVzKGVsLnN0eWxlLmJhY2tncm91bmRJbWFnZSwgc3JjKTtcbiAgICAgICAgICAgIGlmIChjaGFuZ2UpIHtcbiAgICAgICAgICAgICAgICBjc3MoZWwsICdiYWNrZ3JvdW5kSW1hZ2UnLCAoXCJ1cmwoXCIgKyAoZXNjYXBlKHNyYykpICsgXCIpXCIpKTtcbiAgICAgICAgICAgICAgICB0cmlnZ2VyKGVsLCBjcmVhdGVFdmVudCgnbG9hZCcsIGZhbHNlKSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgfVxuXG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2V0UGxhY2Vob2xkZXJJbWFnZSh3aWR0aCQkMSwgaGVpZ2h0JCQxLCBzaXplcykge1xuICAgICAgICB2YXIgYXNzaWduJCQxO1xuXG5cbiAgICAgICAgaWYgKHNpemVzKSB7XG4gICAgICAgICAgICAoKGFzc2lnbiQkMSA9IERpbWVuc2lvbnMucmF0aW8oe3dpZHRoOiB3aWR0aCQkMSwgaGVpZ2h0OiBoZWlnaHQkJDF9LCAnd2lkdGgnLCB0b1B4KHNpemVzVG9QaXhlbChzaXplcykpKSwgd2lkdGgkJDEgPSBhc3NpZ24kJDEud2lkdGgsIGhlaWdodCQkMSA9IGFzc2lnbiQkMS5oZWlnaHQpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiAoXCJkYXRhOmltYWdlL3N2Zyt4bWw7dXRmOCw8c3ZnIHhtbG5zPVxcXCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1xcXCIgd2lkdGg9XFxcIlwiICsgd2lkdGgkJDEgKyBcIlxcXCIgaGVpZ2h0PVxcXCJcIiArIGhlaWdodCQkMSArIFwiXFxcIj48L3N2Zz5cIik7XG4gICAgfVxuXG4gICAgdmFyIHNpemVzUmUgPSAvXFxzKiguKj8pXFxzKihcXHcrfGNhbGNcXCguKj9cXCkpXFxzKig/Oix8JCkvZztcbiAgICBmdW5jdGlvbiBzaXplc1RvUGl4ZWwoc2l6ZXMpIHtcbiAgICAgICAgdmFyIG1hdGNoZXMkJDE7XG5cbiAgICAgICAgc2l6ZXNSZS5sYXN0SW5kZXggPSAwO1xuXG4gICAgICAgIHdoaWxlICgobWF0Y2hlcyQkMSA9IHNpemVzUmUuZXhlYyhzaXplcykpKSB7XG4gICAgICAgICAgICBpZiAoIW1hdGNoZXMkJDFbMV0gfHwgd2luZG93Lm1hdGNoTWVkaWEobWF0Y2hlcyQkMVsxXSkubWF0Y2hlcykge1xuICAgICAgICAgICAgICAgIG1hdGNoZXMkJDEgPSBldmFsdWF0ZVNpemUobWF0Y2hlcyQkMVsyXSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbWF0Y2hlcyQkMSB8fCAnMTAwdncnO1xuICAgIH1cblxuICAgIHZhciBzaXplUmUgPSAvXFxkKyg/Olxcdyt8JSkvZztcbiAgICB2YXIgYWRkaXRpb25SZSA9IC9bKy1dPyhcXGQrKS9nO1xuICAgIGZ1bmN0aW9uIGV2YWx1YXRlU2l6ZShzaXplKSB7XG4gICAgICAgIHJldHVybiBzdGFydHNXaXRoKHNpemUsICdjYWxjJylcbiAgICAgICAgICAgID8gc2l6ZVxuICAgICAgICAgICAgICAgIC5zdWJzdHJpbmcoNSwgc2l6ZS5sZW5ndGggLSAxKVxuICAgICAgICAgICAgICAgIC5yZXBsYWNlKHNpemVSZSwgZnVuY3Rpb24gKHNpemUpIHsgcmV0dXJuIHRvUHgoc2l6ZSk7IH0pXG4gICAgICAgICAgICAgICAgLnJlcGxhY2UoLyAvZywgJycpXG4gICAgICAgICAgICAgICAgLm1hdGNoKGFkZGl0aW9uUmUpXG4gICAgICAgICAgICAgICAgLnJlZHVjZShmdW5jdGlvbiAoYSwgYikgeyByZXR1cm4gYSArICtiOyB9LCAwKVxuICAgICAgICAgICAgOiBzaXplO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHRvUHgodmFsdWUsIHByb3BlcnR5LCBlbGVtZW50KSB7XG4gICAgICAgIGlmICggcHJvcGVydHkgPT09IHZvaWQgMCApIHByb3BlcnR5ID0gJ3dpZHRoJztcbiAgICAgICAgaWYgKCBlbGVtZW50ID09PSB2b2lkIDAgKSBlbGVtZW50ID0gd2luZG93O1xuXG4gICAgICAgIHJldHVybiBpc051bWVyaWModmFsdWUpXG4gICAgICAgICAgICA/ICt2YWx1ZVxuICAgICAgICAgICAgOiBlbmRzV2l0aCh2YWx1ZSwgJ3Z3JylcbiAgICAgICAgICAgICAgICA/IHBlcmNlbnQoZWxlbWVudCwgJ3dpZHRoJywgdmFsdWUpXG4gICAgICAgICAgICAgICAgOiBlbmRzV2l0aCh2YWx1ZSwgJ3ZoJylcbiAgICAgICAgICAgICAgICAgICAgPyBwZXJjZW50KGVsZW1lbnQsICdoZWlnaHQnLCB2YWx1ZSlcbiAgICAgICAgICAgICAgICAgICAgOiBlbmRzV2l0aCh2YWx1ZSwgJyUnKVxuICAgICAgICAgICAgICAgICAgICAgICAgPyBwZXJjZW50KGVsZW1lbnQsIHByb3BlcnR5LCB2YWx1ZSlcbiAgICAgICAgICAgICAgICAgICAgICAgIDogdG9GbG9hdCh2YWx1ZSk7XG4gICAgfVxuXG4gICAgdmFyIHNyY1NldFJlID0gL1xccytcXGQrd1xccyooPzosfCQpL2c7XG4gICAgZnVuY3Rpb24gZ2V0U291cmNlU2l6ZShzcmNzZXQsIHNpemVzKSB7XG4gICAgICAgIHZhciBzcmNTaXplID0gdG9QeChzaXplc1RvUGl4ZWwoc2l6ZXMpKTtcbiAgICAgICAgdmFyIGRlc2NyaXB0b3JzID0gKHNyY3NldC5tYXRjaChzcmNTZXRSZSkgfHwgW10pLm1hcCh0b0Zsb2F0KS5zb3J0KGZ1bmN0aW9uIChhLCBiKSB7IHJldHVybiBhIC0gYjsgfSk7XG5cbiAgICAgICAgcmV0dXJuIGRlc2NyaXB0b3JzLmZpbHRlcihmdW5jdGlvbiAoc2l6ZSkgeyByZXR1cm4gc2l6ZSA+PSBzcmNTaXplOyB9KVswXSB8fCBkZXNjcmlwdG9ycy5wb3AoKSB8fCAnJztcbiAgICB9XG5cbiAgICB2YXIgZGltZW5zaW9ucyA9IHtoZWlnaHQ6IGhlaWdodCwgd2lkdGg6IHdpZHRofTtcbiAgICBmdW5jdGlvbiBwZXJjZW50KGVsZW1lbnQsIHByb3BlcnR5LCB2YWx1ZSkge1xuICAgICAgICByZXR1cm4gZGltZW5zaW9uc1twcm9wZXJ0eV0oZWxlbWVudCkgKiB0b0Zsb2F0KHZhbHVlKSAvIDEwMDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpc0ltZyhlbCkge1xuICAgICAgICByZXR1cm4gZWwudGFnTmFtZSA9PT0gJ0lNRyc7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gY3VycmVudFNyYyhlbCkge1xuICAgICAgICByZXR1cm4gZWwuY3VycmVudFNyYyB8fCBlbC5zcmM7XG4gICAgfVxuXG4gICAgdmFyIGtleSA9ICdfX3Rlc3RfXyc7XG4gICAgdmFyIHN0b3JhZ2U7XG5cbiAgICAvLyB3b3JrYXJvdW5kIGZvciBTYWZhcmkncyBwcml2YXRlIGJyb3dzaW5nIG1vZGUgYW5kIGFjY2Vzc2luZyBzZXNzaW9uU3RvcmFnZSBpbiBCbGlua1xuICAgIHRyeSB7XG4gICAgICAgIHN0b3JhZ2UgPSB3aW5kb3cuc2Vzc2lvblN0b3JhZ2UgfHwge307XG4gICAgICAgIHN0b3JhZ2Vba2V5XSA9IDE7XG4gICAgICAgIGRlbGV0ZSBzdG9yYWdlW2tleV07XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBzdG9yYWdlID0ge307XG4gICAgfVxuXG4gICAgdmFyIE1lZGlhID0ge1xuXG4gICAgICAgIHByb3BzOiB7XG4gICAgICAgICAgICBtZWRpYTogQm9vbGVhblxuICAgICAgICB9LFxuXG4gICAgICAgIGRhdGE6IHtcbiAgICAgICAgICAgIG1lZGlhOiBmYWxzZVxuICAgICAgICB9LFxuXG4gICAgICAgIGNvbXB1dGVkOiB7XG5cbiAgICAgICAgICAgIG1hdGNoTWVkaWE6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIHZhciBtZWRpYSA9IHRvTWVkaWEodGhpcy5tZWRpYSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuICFtZWRpYSB8fCB3aW5kb3cubWF0Y2hNZWRpYShtZWRpYSkubWF0Y2hlcztcbiAgICAgICAgICAgIH1cblxuICAgICAgICB9XG5cbiAgICB9O1xuXG4gICAgZnVuY3Rpb24gdG9NZWRpYSh2YWx1ZSkge1xuXG4gICAgICAgIGlmIChpc1N0cmluZyh2YWx1ZSkpIHtcbiAgICAgICAgICAgIGlmICh2YWx1ZVswXSA9PT0gJ0AnKSB7XG4gICAgICAgICAgICAgICAgdmFyIG5hbWUgPSBcImJyZWFrcG9pbnQtXCIgKyAodmFsdWUuc3Vic3RyKDEpKTtcbiAgICAgICAgICAgICAgICB2YWx1ZSA9IHRvRmxvYXQoZ2V0Q3NzVmFyKG5hbWUpKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaXNOYU4odmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHZhbHVlICYmICFpc05hTih2YWx1ZSkgPyAoXCIobWluLXdpZHRoOiBcIiArIHZhbHVlICsgXCJweClcIikgOiBmYWxzZTtcbiAgICB9XG5cbiAgICB2YXIgTGVhZGVyID0ge1xuXG4gICAgICAgIG1peGluczogW0NsYXNzLCBNZWRpYV0sXG5cbiAgICAgICAgcHJvcHM6IHtcbiAgICAgICAgICAgIGZpbGw6IFN0cmluZ1xuICAgICAgICB9LFxuXG4gICAgICAgIGRhdGE6IHtcbiAgICAgICAgICAgIGZpbGw6ICcnLFxuICAgICAgICAgICAgY2xzV3JhcHBlcjogJ3VrLWxlYWRlci1maWxsJyxcbiAgICAgICAgICAgIGNsc0hpZGU6ICd1ay1sZWFkZXItaGlkZScsXG4gICAgICAgICAgICBhdHRyRmlsbDogJ2RhdGEtZmlsbCdcbiAgICAgICAgfSxcblxuICAgICAgICBjb21wdXRlZDoge1xuXG4gICAgICAgICAgICBmaWxsOiBmdW5jdGlvbihyZWYpIHtcbiAgICAgICAgICAgICAgICB2YXIgZmlsbCA9IHJlZi5maWxsO1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZpbGwgfHwgZ2V0Q3NzVmFyKCdsZWFkZXItZmlsbC1jb250ZW50Jyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgfSxcblxuICAgICAgICBjb25uZWN0ZWQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgdmFyIGFzc2lnbiQkMTtcblxuICAgICAgICAgICAgKGFzc2lnbiQkMSA9IHdyYXBJbm5lcih0aGlzLiRlbCwgKFwiPHNwYW4gY2xhc3M9XFxcIlwiICsgKHRoaXMuY2xzV3JhcHBlcikgKyBcIlxcXCI+XCIpKSwgdGhpcy53cmFwcGVyID0gYXNzaWduJCQxWzBdKTtcbiAgICAgICAgfSxcblxuICAgICAgICBkaXNjb25uZWN0ZWQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgdW53cmFwKHRoaXMud3JhcHBlci5jaGlsZE5vZGVzKTtcbiAgICAgICAgfSxcblxuICAgICAgICB1cGRhdGU6IHtcblxuICAgICAgICAgICAgcmVhZDogZnVuY3Rpb24ocmVmKSB7XG4gICAgICAgICAgICAgICAgdmFyIGNoYW5nZWQgPSByZWYuY2hhbmdlZDtcbiAgICAgICAgICAgICAgICB2YXIgd2lkdGgkJDEgPSByZWYud2lkdGg7XG5cblxuICAgICAgICAgICAgICAgIHZhciBwcmV2ID0gd2lkdGgkJDE7XG5cbiAgICAgICAgICAgICAgICB3aWR0aCQkMSA9IE1hdGguZmxvb3IodGhpcy4kZWwub2Zmc2V0V2lkdGggLyAyKTtcblxuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIHdpZHRoOiB3aWR0aCQkMSxcbiAgICAgICAgICAgICAgICAgICAgY2hhbmdlZDogY2hhbmdlZCB8fCBwcmV2ICE9PSB3aWR0aCQkMSxcbiAgICAgICAgICAgICAgICAgICAgaGlkZTogIXRoaXMubWF0Y2hNZWRpYVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICB3cml0ZTogZnVuY3Rpb24oZGF0YSQkMSkge1xuXG4gICAgICAgICAgICAgICAgdG9nZ2xlQ2xhc3ModGhpcy53cmFwcGVyLCB0aGlzLmNsc0hpZGUsIGRhdGEkJDEuaGlkZSk7XG5cbiAgICAgICAgICAgICAgICBpZiAoZGF0YSQkMS5jaGFuZ2VkKSB7XG4gICAgICAgICAgICAgICAgICAgIGRhdGEkJDEuY2hhbmdlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICBhdHRyKHRoaXMud3JhcHBlciwgdGhpcy5hdHRyRmlsbCwgbmV3IEFycmF5KGRhdGEkJDEud2lkdGgpLmpvaW4odGhpcy5maWxsKSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICBldmVudHM6IFsncmVzaXplJ11cblxuICAgICAgICB9XG5cbiAgICB9O1xuXG4gICAgdmFyIENvbnRhaW5lciA9IHtcblxuICAgICAgICBwcm9wczoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBCb29sZWFuXG4gICAgICAgIH0sXG5cbiAgICAgICAgZGF0YToge1xuICAgICAgICAgICAgY29udGFpbmVyOiB0cnVlXG4gICAgICAgIH0sXG5cbiAgICAgICAgY29tcHV0ZWQ6IHtcblxuICAgICAgICAgICAgY29udGFpbmVyOiBmdW5jdGlvbihyZWYpIHtcbiAgICAgICAgICAgICAgICB2YXIgY29udGFpbmVyID0gcmVmLmNvbnRhaW5lcjtcblxuICAgICAgICAgICAgICAgIHJldHVybiBjb250YWluZXIgPT09IHRydWUgJiYgdGhpcy4kY29udGFpbmVyIHx8IGNvbnRhaW5lciAmJiAkKGNvbnRhaW5lcik7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgfVxuXG4gICAgfTtcblxuICAgIHZhciBhY3RpdmUkMTtcblxuICAgIHZhciBNb2RhbCA9IHtcblxuICAgICAgICBtaXhpbnM6IFtDbGFzcywgQ29udGFpbmVyLCBUb2dnbGFibGVdLFxuXG4gICAgICAgIHByb3BzOiB7XG4gICAgICAgICAgICBzZWxQYW5lbDogU3RyaW5nLFxuICAgICAgICAgICAgc2VsQ2xvc2U6IFN0cmluZyxcbiAgICAgICAgICAgIGVzY0Nsb3NlOiBCb29sZWFuLFxuICAgICAgICAgICAgYmdDbG9zZTogQm9vbGVhbixcbiAgICAgICAgICAgIHN0YWNrOiBCb29sZWFuXG4gICAgICAgIH0sXG5cbiAgICAgICAgZGF0YToge1xuICAgICAgICAgICAgY2xzOiAndWstb3BlbicsXG4gICAgICAgICAgICBlc2NDbG9zZTogdHJ1ZSxcbiAgICAgICAgICAgIGJnQ2xvc2U6IHRydWUsXG4gICAgICAgICAgICBvdmVybGF5OiB0cnVlLFxuICAgICAgICAgICAgc3RhY2s6IGZhbHNlXG4gICAgICAgIH0sXG5cbiAgICAgICAgY29tcHV0ZWQ6IHtcblxuICAgICAgICAgICAgcGFuZWw6IGZ1bmN0aW9uKHJlZiwgJGVsKSB7XG4gICAgICAgICAgICAgICAgdmFyIHNlbFBhbmVsID0gcmVmLnNlbFBhbmVsO1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuICQoc2VsUGFuZWwsICRlbCk7XG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICB0cmFuc2l0aW9uRWxlbWVudDogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucGFuZWw7XG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICBiZ0Nsb3NlOiBmdW5jdGlvbihyZWYpIHtcbiAgICAgICAgICAgICAgICB2YXIgYmdDbG9zZSA9IHJlZi5iZ0Nsb3NlO1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuIGJnQ2xvc2UgJiYgdGhpcy5wYW5lbDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICB9LFxuXG4gICAgICAgIGJlZm9yZURpc2Nvbm5lY3Q6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgaWYgKHRoaXMuaXNUb2dnbGVkKCkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnRvZ2dsZU5vdyh0aGlzLiRlbCwgZmFsc2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuXG4gICAgICAgIGV2ZW50czogW1xuXG4gICAgICAgICAgICB7XG5cbiAgICAgICAgICAgICAgICBuYW1lOiAnY2xpY2snLFxuXG4gICAgICAgICAgICAgICAgZGVsZWdhdGU6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5zZWxDbG9zZTtcbiAgICAgICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICAgICAgaGFuZGxlcjogZnVuY3Rpb24oZSkge1xuICAgICAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaGlkZSgpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAge1xuXG4gICAgICAgICAgICAgICAgbmFtZTogJ3RvZ2dsZScsXG5cbiAgICAgICAgICAgICAgICBzZWxmOiB0cnVlLFxuXG4gICAgICAgICAgICAgICAgaGFuZGxlcjogZnVuY3Rpb24oZSkge1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChlLmRlZmF1bHRQcmV2ZW50ZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50b2dnbGUoKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBuYW1lOiAnYmVmb3Jlc2hvdycsXG5cbiAgICAgICAgICAgICAgICBzZWxmOiB0cnVlLFxuXG4gICAgICAgICAgICAgICAgaGFuZGxlcjogZnVuY3Rpb24oZSkge1xuXG4gICAgICAgICAgICAgICAgICAgIHZhciBwcmV2ID0gYWN0aXZlJDEgJiYgYWN0aXZlJDEgIT09IHRoaXMgJiYgYWN0aXZlJDE7XG5cbiAgICAgICAgICAgICAgICAgICAgYWN0aXZlJDEgPSB0aGlzO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChwcmV2KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5zdGFjaykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucHJldiA9IHByZXY7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aXZlJDEgPSBwcmV2O1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByZXYuaXNUb2dnbGVkKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJldi5oaWRlKCkudGhlbih0aGlzLnNob3cpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uY2UocHJldi4kZWwsICdiZWZvcmVzaG93IGhpZGRlbicsIHRoaXMuc2hvdywgZmFsc2UsIGZ1bmN0aW9uIChyZWYpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0YXJnZXQgPSByZWYudGFyZ2V0O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHR5cGUgPSByZWYudHlwZTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHR5cGUgPT09ICdoaWRkZW4nICYmIHRhcmdldCA9PT0gcHJldi4kZWw7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXJFdmVudHMoKTtcblxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAge1xuXG4gICAgICAgICAgICAgICAgbmFtZTogJ3Nob3cnLFxuXG4gICAgICAgICAgICAgICAgc2VsZjogdHJ1ZSxcblxuICAgICAgICAgICAgICAgIGhhbmRsZXI6IGZ1bmN0aW9uKCkge1xuXG4gICAgICAgICAgICAgICAgICAgIGlmICghaGFzQ2xhc3MoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LCB0aGlzLmNsc1BhZ2UpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNjcm9sbGJhcldpZHRoID0gd2lkdGgod2luZG93KSAtIHdpZHRoKGRvY3VtZW50KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNzcyhkb2N1bWVudC5ib2R5LCAnb3ZlcmZsb3dZJywgdGhpcy5zY3JvbGxiYXJXaWR0aCAmJiB0aGlzLm92ZXJsYXkgPyAnc2Nyb2xsJyA6ICcnKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGFkZENsYXNzKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCwgdGhpcy5jbHNQYWdlKTtcblxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAge1xuXG4gICAgICAgICAgICAgICAgbmFtZTogJ2hpZGUnLFxuXG4gICAgICAgICAgICAgICAgc2VsZjogdHJ1ZSxcblxuICAgICAgICAgICAgICAgIGhhbmRsZXI6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWFjdGl2ZSQxIHx8IGFjdGl2ZSQxID09PSB0aGlzICYmICF0aGlzLnByZXYpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlcmVnaXN0ZXJFdmVudHMoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAge1xuXG4gICAgICAgICAgICAgICAgbmFtZTogJ2hpZGRlbicsXG5cbiAgICAgICAgICAgICAgICBzZWxmOiB0cnVlLFxuXG4gICAgICAgICAgICAgICAgaGFuZGxlcjogZnVuY3Rpb24oKSB7XG5cbiAgICAgICAgICAgICAgICAgICAgdmFyIGZvdW5kO1xuICAgICAgICAgICAgICAgICAgICB2YXIgcmVmID0gdGhpcztcbiAgICAgICAgICAgICAgICAgICAgdmFyIHByZXYgPSByZWYucHJldjtcblxuICAgICAgICAgICAgICAgICAgICBhY3RpdmUkMSA9IGFjdGl2ZSQxICYmIGFjdGl2ZSQxICE9PSB0aGlzICYmIGFjdGl2ZSQxIHx8IHByZXY7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKCFhY3RpdmUkMSkge1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBjc3MoZG9jdW1lbnQuYm9keSwgJ292ZXJmbG93WScsICcnKTtcblxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHByZXYpIHtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmV2LmNsc1BhZ2UgPT09IHRoaXMuY2xzUGFnZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXYgPSBwcmV2LnByZXY7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKCFmb3VuZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlQ2xhc3MoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LCB0aGlzLmNsc1BhZ2UpO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIH1cblxuICAgICAgICBdLFxuXG4gICAgICAgIG1ldGhvZHM6IHtcblxuICAgICAgICAgICAgdG9nZ2xlOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5pc1RvZ2dsZWQoKSA/IHRoaXMuaGlkZSgpIDogdGhpcy5zaG93KCk7XG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICBzaG93OiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICB2YXIgdGhpcyQxID0gdGhpcztcblxuXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuaXNUb2dnbGVkKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmNvbnRhaW5lciAmJiB0aGlzLiRlbC5wYXJlbnROb2RlICE9PSB0aGlzLmNvbnRhaW5lcikge1xuICAgICAgICAgICAgICAgICAgICBhcHBlbmQodGhpcy5jb250YWluZXIsIHRoaXMuJGVsKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJldHVybiByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpcyQxLnNob3coKS50aGVuKHJlc29sdmUpOyB9XG4gICAgICAgICAgICAgICAgICAgICAgICApOyB9XG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudG9nZ2xlRWxlbWVudCh0aGlzLiRlbCwgdHJ1ZSwgYW5pbWF0ZSQxKHRoaXMpKTtcbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIGhpZGU6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmlzVG9nZ2xlZCgpXG4gICAgICAgICAgICAgICAgICAgID8gdGhpcy50b2dnbGVFbGVtZW50KHRoaXMuJGVsLCBmYWxzZSwgYW5pbWF0ZSQxKHRoaXMpKVxuICAgICAgICAgICAgICAgICAgICA6IFByb21pc2UucmVzb2x2ZSgpO1xuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgZ2V0QWN0aXZlOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gYWN0aXZlJDE7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgfVxuXG4gICAgfTtcblxuICAgIHZhciBldmVudHM7XG5cbiAgICBmdW5jdGlvbiByZWdpc3RlckV2ZW50cygpIHtcblxuICAgICAgICBpZiAoZXZlbnRzKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBldmVudHMgPSBbXG4gICAgICAgICAgICBvbihkb2N1bWVudCwgcG9pbnRlclVwLCBmdW5jdGlvbiAocmVmKSB7XG4gICAgICAgICAgICAgICAgdmFyIHRhcmdldCA9IHJlZi50YXJnZXQ7XG4gICAgICAgICAgICAgICAgdmFyIGRlZmF1bHRQcmV2ZW50ZWQgPSByZWYuZGVmYXVsdFByZXZlbnRlZDtcblxuICAgICAgICAgICAgICAgIGlmIChhY3RpdmUkMSAmJiBhY3RpdmUkMS5iZ0Nsb3NlICYmICFkZWZhdWx0UHJldmVudGVkICYmICghYWN0aXZlJDEub3ZlcmxheSB8fCB3aXRoaW4odGFyZ2V0LCBhY3RpdmUkMS4kZWwpKSAmJiAhd2l0aGluKHRhcmdldCwgYWN0aXZlJDEucGFuZWwpKSB7XG4gICAgICAgICAgICAgICAgICAgIGFjdGl2ZSQxLmhpZGUoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIG9uKGRvY3VtZW50LCAna2V5ZG93bicsIGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICAgICAgaWYgKGUua2V5Q29kZSA9PT0gMjcgJiYgYWN0aXZlJDEgJiYgYWN0aXZlJDEuZXNjQ2xvc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgICAgICBhY3RpdmUkMS5oaWRlKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSlcbiAgICAgICAgXTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBkZXJlZ2lzdGVyRXZlbnRzKCkge1xuICAgICAgICBldmVudHMgJiYgZXZlbnRzLmZvckVhY2goZnVuY3Rpb24gKHVuYmluZCkgeyByZXR1cm4gdW5iaW5kKCk7IH0pO1xuICAgICAgICBldmVudHMgPSBudWxsO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGFuaW1hdGUkMShyZWYpIHtcbiAgICAgICAgdmFyIHRyYW5zaXRpb25FbGVtZW50ID0gcmVmLnRyYW5zaXRpb25FbGVtZW50O1xuICAgICAgICB2YXIgX3RvZ2dsZSA9IHJlZi5fdG9nZ2xlO1xuXG4gICAgICAgIHJldHVybiBmdW5jdGlvbiAoZWwsIHNob3cpIHsgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHsgcmV0dXJuIG9uY2UoZWwsICdzaG93IGhpZGUnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgIGVsLl9yZWplY3QgJiYgZWwuX3JlamVjdCgpO1xuICAgICAgICAgICAgICAgICAgICBlbC5fcmVqZWN0ID0gcmVqZWN0O1xuXG4gICAgICAgICAgICAgICAgICAgIF90b2dnbGUoZWwsIHNob3cpO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmICh0b01zKGNzcyh0cmFuc2l0aW9uRWxlbWVudCwgJ3RyYW5zaXRpb25EdXJhdGlvbicpKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgb25jZSh0cmFuc2l0aW9uRWxlbWVudCwgJ3RyYW5zaXRpb25lbmQnLCByZXNvbHZlLCBmYWxzZSwgZnVuY3Rpb24gKGUpIHsgcmV0dXJuIGUudGFyZ2V0ID09PSB0cmFuc2l0aW9uRWxlbWVudDsgfSk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTsgfVxuICAgICAgICAgICAgKTsgfTtcbiAgICB9XG5cbiAgICB2YXIgTW9kYWwkMSA9IHtcblxuICAgICAgICBpbnN0YWxsOiBpbnN0YWxsJDEsXG5cbiAgICAgICAgbWl4aW5zOiBbTW9kYWxdLFxuXG4gICAgICAgIGRhdGE6IHtcbiAgICAgICAgICAgIGNsc1BhZ2U6ICd1ay1tb2RhbC1wYWdlJyxcbiAgICAgICAgICAgIHNlbFBhbmVsOiAnLnVrLW1vZGFsLWRpYWxvZycsXG4gICAgICAgICAgICBzZWxDbG9zZTogJy51ay1tb2RhbC1jbG9zZSwgLnVrLW1vZGFsLWNsb3NlLWRlZmF1bHQsIC51ay1tb2RhbC1jbG9zZS1vdXRzaWRlLCAudWstbW9kYWwtY2xvc2UtZnVsbCdcbiAgICAgICAgfSxcblxuICAgICAgICBldmVudHM6IFtcblxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIG5hbWU6ICdzaG93JyxcblxuICAgICAgICAgICAgICAgIHNlbGY6IHRydWUsXG5cbiAgICAgICAgICAgICAgICBoYW5kbGVyOiBmdW5jdGlvbigpIHtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoaGFzQ2xhc3ModGhpcy5wYW5lbCwgJ3VrLW1hcmdpbi1hdXRvLXZlcnRpY2FsJykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFkZENsYXNzKHRoaXMuJGVsLCAndWstZmxleCcpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgY3NzKHRoaXMuJGVsLCAnZGlzcGxheScsICdibG9jaycpO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgaGVpZ2h0KHRoaXMuJGVsKTsgLy8gZm9yY2UgcmVmbG93XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIG5hbWU6ICdoaWRkZW4nLFxuXG4gICAgICAgICAgICAgICAgc2VsZjogdHJ1ZSxcblxuICAgICAgICAgICAgICAgIGhhbmRsZXI6IGZ1bmN0aW9uKCkge1xuXG4gICAgICAgICAgICAgICAgICAgIGNzcyh0aGlzLiRlbCwgJ2Rpc3BsYXknLCAnJyk7XG4gICAgICAgICAgICAgICAgICAgIHJlbW92ZUNsYXNzKHRoaXMuJGVsLCAndWstZmxleCcpO1xuXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgIF1cblxuICAgIH07XG5cbiAgICBmdW5jdGlvbiBpbnN0YWxsJDEgKFVJa2l0KSB7XG5cbiAgICAgICAgVUlraXQubW9kYWwuZGlhbG9nID0gZnVuY3Rpb24gKGNvbnRlbnQsIG9wdGlvbnMpIHtcblxuICAgICAgICAgICAgdmFyIGRpYWxvZyA9IFVJa2l0Lm1vZGFsKChcIiA8ZGl2IGNsYXNzPVxcXCJ1ay1tb2RhbFxcXCI+IDxkaXYgY2xhc3M9XFxcInVrLW1vZGFsLWRpYWxvZ1xcXCI+XCIgKyBjb250ZW50ICsgXCI8L2Rpdj4gPC9kaXY+IFwiKSwgb3B0aW9ucyk7XG5cbiAgICAgICAgICAgIGRpYWxvZy5zaG93KCk7XG5cbiAgICAgICAgICAgIG9uKGRpYWxvZy4kZWwsICdoaWRkZW4nLCBmdW5jdGlvbiAocmVmKSB7XG4gICAgICAgICAgICAgICAgdmFyIHRhcmdldCA9IHJlZi50YXJnZXQ7XG4gICAgICAgICAgICAgICAgdmFyIGN1cnJlbnRUYXJnZXQgPSByZWYuY3VycmVudFRhcmdldDtcblxuICAgICAgICAgICAgICAgIGlmICh0YXJnZXQgPT09IGN1cnJlbnRUYXJnZXQpIHtcbiAgICAgICAgICAgICAgICAgICAgUHJvbWlzZS5yZXNvbHZlKGZ1bmN0aW9uICgpIHsgcmV0dXJuIGRpYWxvZy4kZGVzdHJveSh0cnVlKTsgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHJldHVybiBkaWFsb2c7XG4gICAgICAgIH07XG5cbiAgICAgICAgVUlraXQubW9kYWwuYWxlcnQgPSBmdW5jdGlvbiAobWVzc2FnZSwgb3B0aW9ucykge1xuXG4gICAgICAgICAgICBvcHRpb25zID0gYXNzaWduKHtiZ0Nsb3NlOiBmYWxzZSwgZXNjQ2xvc2U6IGZhbHNlLCBsYWJlbHM6IFVJa2l0Lm1vZGFsLmxhYmVsc30sIG9wdGlvbnMpO1xuXG4gICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoXG4gICAgICAgICAgICAgICAgZnVuY3Rpb24gKHJlc29sdmUpIHsgcmV0dXJuIG9uKFVJa2l0Lm1vZGFsLmRpYWxvZygoXCIgPGRpdiBjbGFzcz1cXFwidWstbW9kYWwtYm9keVxcXCI+XCIgKyAoaXNTdHJpbmcobWVzc2FnZSkgPyBtZXNzYWdlIDogaHRtbChtZXNzYWdlKSkgKyBcIjwvZGl2PiA8ZGl2IGNsYXNzPVxcXCJ1ay1tb2RhbC1mb290ZXIgdWstdGV4dC1yaWdodFxcXCI+IDxidXR0b24gY2xhc3M9XFxcInVrLWJ1dHRvbiB1ay1idXR0b24tcHJpbWFyeSB1ay1tb2RhbC1jbG9zZVxcXCIgYXV0b2ZvY3VzPlwiICsgKG9wdGlvbnMubGFiZWxzLm9rKSArIFwiPC9idXR0b24+IDwvZGl2PiBcIiksIG9wdGlvbnMpLiRlbCwgJ2hpZGUnLCByZXNvbHZlKTsgfVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfTtcblxuICAgICAgICBVSWtpdC5tb2RhbC5jb25maXJtID0gZnVuY3Rpb24gKG1lc3NhZ2UsIG9wdGlvbnMpIHtcblxuICAgICAgICAgICAgb3B0aW9ucyA9IGFzc2lnbih7YmdDbG9zZTogZmFsc2UsIGVzY0Nsb3NlOiB0cnVlLCBsYWJlbHM6IFVJa2l0Lm1vZGFsLmxhYmVsc30sIG9wdGlvbnMpO1xuXG4gICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuXG4gICAgICAgICAgICAgICAgdmFyIGNvbmZpcm0gPSBVSWtpdC5tb2RhbC5kaWFsb2coKFwiIDxmb3JtPiA8ZGl2IGNsYXNzPVxcXCJ1ay1tb2RhbC1ib2R5XFxcIj5cIiArIChpc1N0cmluZyhtZXNzYWdlKSA/IG1lc3NhZ2UgOiBodG1sKG1lc3NhZ2UpKSArIFwiPC9kaXY+IDxkaXYgY2xhc3M9XFxcInVrLW1vZGFsLWZvb3RlciB1ay10ZXh0LXJpZ2h0XFxcIj4gPGJ1dHRvbiBjbGFzcz1cXFwidWstYnV0dG9uIHVrLWJ1dHRvbi1kZWZhdWx0IHVrLW1vZGFsLWNsb3NlXFxcIiB0eXBlPVxcXCJidXR0b25cXFwiPlwiICsgKG9wdGlvbnMubGFiZWxzLmNhbmNlbCkgKyBcIjwvYnV0dG9uPiA8YnV0dG9uIGNsYXNzPVxcXCJ1ay1idXR0b24gdWstYnV0dG9uLXByaW1hcnlcXFwiIGF1dG9mb2N1cz5cIiArIChvcHRpb25zLmxhYmVscy5vaykgKyBcIjwvYnV0dG9uPiA8L2Rpdj4gPC9mb3JtPiBcIiksIG9wdGlvbnMpO1xuXG4gICAgICAgICAgICAgICAgdmFyIHJlc29sdmVkID0gZmFsc2U7XG5cbiAgICAgICAgICAgICAgICBvbihjb25maXJtLiRlbCwgJ3N1Ym1pdCcsICdmb3JtJywgZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgY29uZmlybS5oaWRlKCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgb24oY29uZmlybS4kZWwsICdoaWRlJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXJlc29sdmVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZWplY3QoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfTtcblxuICAgICAgICBVSWtpdC5tb2RhbC5wcm9tcHQgPSBmdW5jdGlvbiAobWVzc2FnZSwgdmFsdWUsIG9wdGlvbnMpIHtcblxuICAgICAgICAgICAgb3B0aW9ucyA9IGFzc2lnbih7YmdDbG9zZTogZmFsc2UsIGVzY0Nsb3NlOiB0cnVlLCBsYWJlbHM6IFVJa2l0Lm1vZGFsLmxhYmVsc30sIG9wdGlvbnMpO1xuXG4gICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUpIHtcblxuICAgICAgICAgICAgICAgIHZhciBwcm9tcHQgPSBVSWtpdC5tb2RhbC5kaWFsb2coKFwiIDxmb3JtIGNsYXNzPVxcXCJ1ay1mb3JtLXN0YWNrZWRcXFwiPiA8ZGl2IGNsYXNzPVxcXCJ1ay1tb2RhbC1ib2R5XFxcIj4gPGxhYmVsPlwiICsgKGlzU3RyaW5nKG1lc3NhZ2UpID8gbWVzc2FnZSA6IGh0bWwobWVzc2FnZSkpICsgXCI8L2xhYmVsPiA8aW5wdXQgY2xhc3M9XFxcInVrLWlucHV0XFxcIiBhdXRvZm9jdXM+IDwvZGl2PiA8ZGl2IGNsYXNzPVxcXCJ1ay1tb2RhbC1mb290ZXIgdWstdGV4dC1yaWdodFxcXCI+IDxidXR0b24gY2xhc3M9XFxcInVrLWJ1dHRvbiB1ay1idXR0b24tZGVmYXVsdCB1ay1tb2RhbC1jbG9zZVxcXCIgdHlwZT1cXFwiYnV0dG9uXFxcIj5cIiArIChvcHRpb25zLmxhYmVscy5jYW5jZWwpICsgXCI8L2J1dHRvbj4gPGJ1dHRvbiBjbGFzcz1cXFwidWstYnV0dG9uIHVrLWJ1dHRvbi1wcmltYXJ5XFxcIj5cIiArIChvcHRpb25zLmxhYmVscy5vaykgKyBcIjwvYnV0dG9uPiA8L2Rpdj4gPC9mb3JtPiBcIiksIG9wdGlvbnMpLFxuICAgICAgICAgICAgICAgICAgICBpbnB1dCA9ICQoJ2lucHV0JywgcHJvbXB0LiRlbCk7XG5cbiAgICAgICAgICAgICAgICBpbnB1dC52YWx1ZSA9IHZhbHVlO1xuXG4gICAgICAgICAgICAgICAgdmFyIHJlc29sdmVkID0gZmFsc2U7XG5cbiAgICAgICAgICAgICAgICBvbihwcm9tcHQuJGVsLCAnc3VibWl0JywgJ2Zvcm0nLCBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUoaW5wdXQudmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIHByb21wdC5oaWRlKCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgb24ocHJvbXB0LiRlbCwgJ2hpZGUnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghcmVzb2x2ZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUobnVsbCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH07XG5cbiAgICAgICAgVUlraXQubW9kYWwubGFiZWxzID0ge1xuICAgICAgICAgICAgb2s6ICdPaycsXG4gICAgICAgICAgICBjYW5jZWw6ICdDYW5jZWwnXG4gICAgICAgIH07XG5cbiAgICB9XG5cbiAgICB2YXIgTmF2ID0ge1xuXG4gICAgICAgIGV4dGVuZHM6IEFjY29yZGlvbixcblxuICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgICB0YXJnZXRzOiAnPiAudWstcGFyZW50JyxcbiAgICAgICAgICAgIHRvZ2dsZTogJz4gYScsXG4gICAgICAgICAgICBjb250ZW50OiAnPiB1bCdcbiAgICAgICAgfVxuXG4gICAgfTtcblxuICAgIHZhciBOYXZiYXIgPSB7XG5cbiAgICAgICAgbWl4aW5zOiBbQ2xhc3MsIEZsZXhCdWddLFxuXG4gICAgICAgIHByb3BzOiB7XG4gICAgICAgICAgICBkcm9wZG93bjogU3RyaW5nLFxuICAgICAgICAgICAgbW9kZTogJ2xpc3QnLFxuICAgICAgICAgICAgYWxpZ246IFN0cmluZyxcbiAgICAgICAgICAgIG9mZnNldDogTnVtYmVyLFxuICAgICAgICAgICAgYm91bmRhcnk6IEJvb2xlYW4sXG4gICAgICAgICAgICBib3VuZGFyeUFsaWduOiBCb29sZWFuLFxuICAgICAgICAgICAgY2xzRHJvcDogU3RyaW5nLFxuICAgICAgICAgICAgZGVsYXlTaG93OiBOdW1iZXIsXG4gICAgICAgICAgICBkZWxheUhpZGU6IE51bWJlcixcbiAgICAgICAgICAgIGRyb3BiYXI6IEJvb2xlYW4sXG4gICAgICAgICAgICBkcm9wYmFyTW9kZTogU3RyaW5nLFxuICAgICAgICAgICAgZHJvcGJhckFuY2hvcjogQm9vbGVhbixcbiAgICAgICAgICAgIGR1cmF0aW9uOiBOdW1iZXJcbiAgICAgICAgfSxcblxuICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgICBkcm9wZG93bjogJy51ay1uYXZiYXItbmF2ID4gbGknLFxuICAgICAgICAgICAgYWxpZ246ICFpc1J0bCA/ICdsZWZ0JyA6ICdyaWdodCcsXG4gICAgICAgICAgICBjbHNEcm9wOiAndWstbmF2YmFyLWRyb3Bkb3duJyxcbiAgICAgICAgICAgIG1vZGU6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIG9mZnNldDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgZGVsYXlTaG93OiB1bmRlZmluZWQsXG4gICAgICAgICAgICBkZWxheUhpZGU6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIGJvdW5kYXJ5QWxpZ246IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIGZsaXA6ICd4JyxcbiAgICAgICAgICAgIGJvdW5kYXJ5OiB0cnVlLFxuICAgICAgICAgICAgZHJvcGJhcjogZmFsc2UsXG4gICAgICAgICAgICBkcm9wYmFyTW9kZTogJ3NsaWRlJyxcbiAgICAgICAgICAgIGRyb3BiYXJBbmNob3I6IGZhbHNlLFxuICAgICAgICAgICAgZHVyYXRpb246IDIwMCxcbiAgICAgICAgICAgIGZvcmNlSGVpZ2h0OiB0cnVlLFxuICAgICAgICAgICAgc2VsTWluSGVpZ2h0OiAnLnVrLW5hdmJhci1uYXYgPiBsaSA+IGEsIC51ay1uYXZiYXItaXRlbSwgLnVrLW5hdmJhci10b2dnbGUnXG4gICAgICAgIH0sXG5cbiAgICAgICAgY29tcHV0ZWQ6IHtcblxuICAgICAgICAgICAgYm91bmRhcnk6IGZ1bmN0aW9uKHJlZiwgJGVsKSB7XG4gICAgICAgICAgICAgICAgdmFyIGJvdW5kYXJ5ID0gcmVmLmJvdW5kYXJ5O1xuICAgICAgICAgICAgICAgIHZhciBib3VuZGFyeUFsaWduID0gcmVmLmJvdW5kYXJ5QWxpZ247XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gKGJvdW5kYXJ5ID09PSB0cnVlIHx8IGJvdW5kYXJ5QWxpZ24pID8gJGVsIDogYm91bmRhcnk7XG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICBkcm9wYmFyQW5jaG9yOiBmdW5jdGlvbihyZWYsICRlbCkge1xuICAgICAgICAgICAgICAgIHZhciBkcm9wYmFyQW5jaG9yID0gcmVmLmRyb3BiYXJBbmNob3I7XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gcXVlcnkoZHJvcGJhckFuY2hvciwgJGVsKTtcbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIHBvczogZnVuY3Rpb24ocmVmKSB7XG4gICAgICAgICAgICAgICAgdmFyIGFsaWduID0gcmVmLmFsaWduO1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuIChcImJvdHRvbS1cIiArIGFsaWduKTtcbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIGRyb3Bkb3duczogZnVuY3Rpb24ocmVmLCAkZWwpIHtcbiAgICAgICAgICAgICAgICB2YXIgZHJvcGRvd24gPSByZWYuZHJvcGRvd247XG4gICAgICAgICAgICAgICAgdmFyIGNsc0Ryb3AgPSByZWYuY2xzRHJvcDtcblxuICAgICAgICAgICAgICAgIHJldHVybiAkJCgoZHJvcGRvd24gKyBcIiAuXCIgKyBjbHNEcm9wKSwgJGVsKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICB9LFxuXG4gICAgICAgIGJlZm9yZUNvbm5lY3Q6IGZ1bmN0aW9uKCkge1xuXG4gICAgICAgICAgICB2YXIgcmVmID0gdGhpcy4kcHJvcHM7XG4gICAgICAgICAgICB2YXIgZHJvcGJhciA9IHJlZi5kcm9wYmFyO1xuXG4gICAgICAgICAgICB0aGlzLmRyb3BiYXIgPSBkcm9wYmFyICYmIChxdWVyeShkcm9wYmFyLCB0aGlzLiRlbCkgfHwgJCgnKyAudWstbmF2YmFyLWRyb3BiYXInLCB0aGlzLiRlbCkgfHwgJCgnPGRpdj48L2Rpdj4nKSk7XG5cbiAgICAgICAgICAgIGlmICh0aGlzLmRyb3BiYXIpIHtcblxuICAgICAgICAgICAgICAgIGFkZENsYXNzKHRoaXMuZHJvcGJhciwgJ3VrLW5hdmJhci1kcm9wYmFyJyk7XG5cbiAgICAgICAgICAgICAgICBpZiAodGhpcy5kcm9wYmFyTW9kZSA9PT0gJ3NsaWRlJykge1xuICAgICAgICAgICAgICAgICAgICBhZGRDbGFzcyh0aGlzLmRyb3BiYXIsICd1ay1uYXZiYXItZHJvcGJhci1zbGlkZScpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICB9LFxuXG4gICAgICAgIGRpc2Nvbm5lY3RlZDogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICB0aGlzLmRyb3BiYXIgJiYgcmVtb3ZlKHRoaXMuZHJvcGJhcik7XG4gICAgICAgIH0sXG5cbiAgICAgICAgdXBkYXRlOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHZhciB0aGlzJDEgPSB0aGlzO1xuXG5cbiAgICAgICAgICAgIHRoaXMuJGNyZWF0ZShcbiAgICAgICAgICAgICAgICAnZHJvcCcsXG4gICAgICAgICAgICAgICAgdGhpcy5kcm9wZG93bnMuZmlsdGVyKGZ1bmN0aW9uIChlbCkgeyByZXR1cm4gIXRoaXMkMS5nZXREcm9wZG93bihlbCk7IH0pLFxuICAgICAgICAgICAgICAgIGFzc2lnbih7fSwgdGhpcy4kcHJvcHMsIHtib3VuZGFyeTogdGhpcy5ib3VuZGFyeSwgcG9zOiB0aGlzLnBvcywgb2Zmc2V0OiB0aGlzLmRyb3BiYXIgfHwgdGhpcy5vZmZzZXR9KVxuICAgICAgICAgICAgKTtcblxuICAgICAgICB9LFxuXG4gICAgICAgIGV2ZW50czogW1xuXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgbmFtZTogJ21vdXNlb3ZlcicsXG5cbiAgICAgICAgICAgICAgICBkZWxlZ2F0ZTogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmRyb3Bkb3duO1xuICAgICAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgICAgICBoYW5kbGVyOiBmdW5jdGlvbihyZWYpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGN1cnJlbnQgPSByZWYuY3VycmVudDtcblxuICAgICAgICAgICAgICAgICAgICB2YXIgYWN0aXZlID0gdGhpcy5nZXRBY3RpdmUoKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGFjdGl2ZSAmJiBhY3RpdmUudG9nZ2xlICYmICF3aXRoaW4oYWN0aXZlLnRvZ2dsZS4kZWwsIGN1cnJlbnQpICYmICFhY3RpdmUudHJhY2tlci5tb3Zlc1RvKGFjdGl2ZS4kZWwpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhY3RpdmUuaGlkZShmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBuYW1lOiAnbW91c2VsZWF2ZScsXG5cbiAgICAgICAgICAgICAgICBlbDogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmRyb3BiYXI7XG4gICAgICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgICAgIGhhbmRsZXI6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgYWN0aXZlID0gdGhpcy5nZXRBY3RpdmUoKTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoYWN0aXZlICYmICFtYXRjaGVzKHRoaXMuZHJvcGJhciwgJzpob3ZlcicpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhY3RpdmUuaGlkZSgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIG5hbWU6ICdiZWZvcmVzaG93JyxcblxuICAgICAgICAgICAgICAgIGNhcHR1cmU6IHRydWUsXG5cbiAgICAgICAgICAgICAgICBmaWx0ZXI6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5kcm9wYmFyO1xuICAgICAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgICAgICBoYW5kbGVyOiBmdW5jdGlvbigpIHtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMuZHJvcGJhci5wYXJlbnROb2RlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhZnRlcih0aGlzLmRyb3BiYXJBbmNob3IgfHwgdGhpcy4kZWwsIHRoaXMuZHJvcGJhcik7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBuYW1lOiAnc2hvdycsXG5cbiAgICAgICAgICAgICAgICBjYXB0dXJlOiB0cnVlLFxuXG4gICAgICAgICAgICAgICAgZmlsdGVyOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZHJvcGJhcjtcbiAgICAgICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICAgICAgaGFuZGxlcjogZnVuY3Rpb24oXywgZHJvcCkge1xuXG4gICAgICAgICAgICAgICAgICAgIHZhciAkZWwgPSBkcm9wLiRlbDtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGRpciA9IGRyb3AuZGlyO1xuXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2xzRHJvcCAmJiBhZGRDbGFzcygkZWwsICgodGhpcy5jbHNEcm9wKSArIFwiLWRyb3BiYXJcIikpO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChkaXIgPT09ICdib3R0b20nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRyYW5zaXRpb25UbygkZWwub2Zmc2V0SGVpZ2h0ICsgdG9GbG9hdChjc3MoJGVsLCAnbWFyZ2luVG9wJykpICsgdG9GbG9hdChjc3MoJGVsLCAnbWFyZ2luQm90dG9tJykpLCAkZWwpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIG5hbWU6ICdiZWZvcmVoaWRlJyxcblxuICAgICAgICAgICAgICAgIGZpbHRlcjogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmRyb3BiYXI7XG4gICAgICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgICAgIGhhbmRsZXI6IGZ1bmN0aW9uKGUsIHJlZikge1xuICAgICAgICAgICAgICAgICAgICB2YXIgJGVsID0gcmVmLiRlbDtcblxuXG4gICAgICAgICAgICAgICAgICAgIHZhciBhY3RpdmUgPSB0aGlzLmdldEFjdGl2ZSgpO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChtYXRjaGVzKHRoaXMuZHJvcGJhciwgJzpob3ZlcicpICYmIGFjdGl2ZSAmJiBhY3RpdmUuJGVsID09PSAkZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBuYW1lOiAnaGlkZScsXG5cbiAgICAgICAgICAgICAgICBmaWx0ZXI6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5kcm9wYmFyO1xuICAgICAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgICAgICBoYW5kbGVyOiBmdW5jdGlvbihfLCByZWYpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyICRlbCA9IHJlZi4kZWw7XG5cblxuICAgICAgICAgICAgICAgICAgICB2YXIgYWN0aXZlID0gdGhpcy5nZXRBY3RpdmUoKTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoIWFjdGl2ZSB8fCBhY3RpdmUgJiYgYWN0aXZlLiRlbCA9PT0gJGVsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRyYW5zaXRpb25UbygwKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICBdLFxuXG4gICAgICAgIG1ldGhvZHM6IHtcblxuICAgICAgICAgICAgZ2V0QWN0aXZlOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICB2YXIgcmVmID0gdGhpcy5kcm9wZG93bnMubWFwKHRoaXMuZ2V0RHJvcGRvd24pLmZpbHRlcihmdW5jdGlvbiAoZHJvcCkgeyByZXR1cm4gZHJvcCAmJiBkcm9wLmlzQWN0aXZlKCk7IH0pO1xuICAgICAgICAgICAgICAgIHZhciBhY3RpdmUgPSByZWZbMF07XG4gICAgICAgICAgICAgICAgcmV0dXJuIGFjdGl2ZSAmJiBpbmNsdWRlcyhhY3RpdmUubW9kZSwgJ2hvdmVyJykgJiYgd2l0aGluKGFjdGl2ZS50b2dnbGUuJGVsLCB0aGlzLiRlbCkgJiYgYWN0aXZlO1xuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgdHJhbnNpdGlvblRvOiBmdW5jdGlvbihuZXdIZWlnaHQsIGVsKSB7XG4gICAgICAgICAgICAgICAgdmFyIHRoaXMkMSA9IHRoaXM7XG5cblxuICAgICAgICAgICAgICAgIHZhciByZWYgPSB0aGlzO1xuICAgICAgICAgICAgICAgIHZhciBkcm9wYmFyID0gcmVmLmRyb3BiYXI7XG4gICAgICAgICAgICAgICAgdmFyIG9sZEhlaWdodCA9IGlzVmlzaWJsZShkcm9wYmFyKSA/IGhlaWdodChkcm9wYmFyKSA6IDA7XG5cbiAgICAgICAgICAgICAgICBlbCA9IG9sZEhlaWdodCA8IG5ld0hlaWdodCAmJiBlbDtcblxuICAgICAgICAgICAgICAgIGNzcyhlbCwgJ2NsaXAnLCAoXCJyZWN0KDAsXCIgKyAoZWwub2Zmc2V0V2lkdGgpICsgXCJweCxcIiArIG9sZEhlaWdodCArIFwicHgsMClcIikpO1xuXG4gICAgICAgICAgICAgICAgaGVpZ2h0KGRyb3BiYXIsIG9sZEhlaWdodCk7XG5cbiAgICAgICAgICAgICAgICBUcmFuc2l0aW9uLmNhbmNlbChbZWwsIGRyb3BiYXJdKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5hbGwoW1xuICAgICAgICAgICAgICAgICAgICBUcmFuc2l0aW9uLnN0YXJ0KGRyb3BiYXIsIHtoZWlnaHQ6IG5ld0hlaWdodH0sIHRoaXMuZHVyYXRpb24pLFxuICAgICAgICAgICAgICAgICAgICBUcmFuc2l0aW9uLnN0YXJ0KGVsLCB7Y2xpcDogKFwicmVjdCgwLFwiICsgKGVsLm9mZnNldFdpZHRoKSArIFwicHgsXCIgKyBuZXdIZWlnaHQgKyBcInB4LDApXCIpfSwgdGhpcy5kdXJhdGlvbilcbiAgICAgICAgICAgICAgICBdKVxuICAgICAgICAgICAgICAgICAgICAuY2F0Y2gobm9vcClcbiAgICAgICAgICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY3NzKGVsLCB7Y2xpcDogJyd9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMkMS4kdXBkYXRlKGRyb3BiYXIpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIGdldERyb3Bkb3duOiBmdW5jdGlvbihlbCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLiRnZXRDb21wb25lbnQoZWwsICdkcm9wJykgfHwgdGhpcy4kZ2V0Q29tcG9uZW50KGVsLCAnZHJvcGRvd24nKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICB9XG5cbiAgICB9O1xuXG4gICAgdmFyIE9mZmNhbnZhcyA9IHtcblxuICAgICAgICBtaXhpbnM6IFtNb2RhbF0sXG5cbiAgICAgICAgYXJnczogJ21vZGUnLFxuXG4gICAgICAgIHByb3BzOiB7XG4gICAgICAgICAgICBtb2RlOiBTdHJpbmcsXG4gICAgICAgICAgICBmbGlwOiBCb29sZWFuLFxuICAgICAgICAgICAgb3ZlcmxheTogQm9vbGVhblxuICAgICAgICB9LFxuXG4gICAgICAgIGRhdGE6IHtcbiAgICAgICAgICAgIG1vZGU6ICdzbGlkZScsXG4gICAgICAgICAgICBmbGlwOiBmYWxzZSxcbiAgICAgICAgICAgIG92ZXJsYXk6IGZhbHNlLFxuICAgICAgICAgICAgY2xzUGFnZTogJ3VrLW9mZmNhbnZhcy1wYWdlJyxcbiAgICAgICAgICAgIGNsc0NvbnRhaW5lcjogJ3VrLW9mZmNhbnZhcy1jb250YWluZXInLFxuICAgICAgICAgICAgc2VsUGFuZWw6ICcudWstb2ZmY2FudmFzLWJhcicsXG4gICAgICAgICAgICBjbHNGbGlwOiAndWstb2ZmY2FudmFzLWZsaXAnLFxuICAgICAgICAgICAgY2xzQ29udGFpbmVyQW5pbWF0aW9uOiAndWstb2ZmY2FudmFzLWNvbnRhaW5lci1hbmltYXRpb24nLFxuICAgICAgICAgICAgY2xzU2lkZWJhckFuaW1hdGlvbjogJ3VrLW9mZmNhbnZhcy1iYXItYW5pbWF0aW9uJyxcbiAgICAgICAgICAgIGNsc01vZGU6ICd1ay1vZmZjYW52YXMnLFxuICAgICAgICAgICAgY2xzT3ZlcmxheTogJ3VrLW9mZmNhbnZhcy1vdmVybGF5JyxcbiAgICAgICAgICAgIHNlbENsb3NlOiAnLnVrLW9mZmNhbnZhcy1jbG9zZSdcbiAgICAgICAgfSxcblxuICAgICAgICBjb21wdXRlZDoge1xuXG4gICAgICAgICAgICBjbHNGbGlwOiBmdW5jdGlvbihyZWYpIHtcbiAgICAgICAgICAgICAgICB2YXIgZmxpcCA9IHJlZi5mbGlwO1xuICAgICAgICAgICAgICAgIHZhciBjbHNGbGlwID0gcmVmLmNsc0ZsaXA7XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gZmxpcCA/IGNsc0ZsaXAgOiAnJztcbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIGNsc092ZXJsYXk6IGZ1bmN0aW9uKHJlZikge1xuICAgICAgICAgICAgICAgIHZhciBvdmVybGF5ID0gcmVmLm92ZXJsYXk7XG4gICAgICAgICAgICAgICAgdmFyIGNsc092ZXJsYXkgPSByZWYuY2xzT3ZlcmxheTtcblxuICAgICAgICAgICAgICAgIHJldHVybiBvdmVybGF5ID8gY2xzT3ZlcmxheSA6ICcnO1xuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgY2xzTW9kZTogZnVuY3Rpb24ocmVmKSB7XG4gICAgICAgICAgICAgICAgdmFyIG1vZGUgPSByZWYubW9kZTtcbiAgICAgICAgICAgICAgICB2YXIgY2xzTW9kZSA9IHJlZi5jbHNNb2RlO1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuIChjbHNNb2RlICsgXCItXCIgKyBtb2RlKTtcbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIGNsc1NpZGViYXJBbmltYXRpb246IGZ1bmN0aW9uKHJlZikge1xuICAgICAgICAgICAgICAgIHZhciBtb2RlID0gcmVmLm1vZGU7XG4gICAgICAgICAgICAgICAgdmFyIGNsc1NpZGViYXJBbmltYXRpb24gPSByZWYuY2xzU2lkZWJhckFuaW1hdGlvbjtcblxuICAgICAgICAgICAgICAgIHJldHVybiBtb2RlID09PSAnbm9uZScgfHwgbW9kZSA9PT0gJ3JldmVhbCcgPyAnJyA6IGNsc1NpZGViYXJBbmltYXRpb247XG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICBjbHNDb250YWluZXJBbmltYXRpb246IGZ1bmN0aW9uKHJlZikge1xuICAgICAgICAgICAgICAgIHZhciBtb2RlID0gcmVmLm1vZGU7XG4gICAgICAgICAgICAgICAgdmFyIGNsc0NvbnRhaW5lckFuaW1hdGlvbiA9IHJlZi5jbHNDb250YWluZXJBbmltYXRpb247XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gbW9kZSAhPT0gJ3B1c2gnICYmIG1vZGUgIT09ICdyZXZlYWwnID8gJycgOiBjbHNDb250YWluZXJBbmltYXRpb247XG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICB0cmFuc2l0aW9uRWxlbWVudDogZnVuY3Rpb24ocmVmKSB7XG4gICAgICAgICAgICAgICAgdmFyIG1vZGUgPSByZWYubW9kZTtcblxuICAgICAgICAgICAgICAgIHJldHVybiBtb2RlID09PSAncmV2ZWFsJyA/IHRoaXMucGFuZWwucGFyZW50Tm9kZSA6IHRoaXMucGFuZWw7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgfSxcblxuICAgICAgICBldmVudHM6IFtcblxuICAgICAgICAgICAge1xuXG4gICAgICAgICAgICAgICAgbmFtZTogJ2NsaWNrJyxcblxuICAgICAgICAgICAgICAgIGRlbGVnYXRlOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdhW2hyZWZePVwiI1wiXSc7XG4gICAgICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgICAgIGhhbmRsZXI6IGZ1bmN0aW9uKHJlZikge1xuICAgICAgICAgICAgICAgICAgICB2YXIgY3VycmVudCA9IHJlZi5jdXJyZW50O1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChjdXJyZW50Lmhhc2ggJiYgJChjdXJyZW50Lmhhc2gsIGRvY3VtZW50LmJvZHkpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmhpZGUoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIG5hbWU6ICd0b3VjaHN0YXJ0JyxcblxuICAgICAgICAgICAgICAgIGVsOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucGFuZWw7XG4gICAgICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgICAgIGhhbmRsZXI6IGZ1bmN0aW9uKHJlZikge1xuICAgICAgICAgICAgICAgICAgICB2YXIgdGFyZ2V0VG91Y2hlcyA9IHJlZi50YXJnZXRUb3VjaGVzO1xuXG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHRhcmdldFRvdWNoZXMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNsaWVudFkgPSB0YXJnZXRUb3VjaGVzWzBdLmNsaWVudFk7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIG5hbWU6ICd0b3VjaG1vdmUnLFxuXG4gICAgICAgICAgICAgICAgc2VsZjogdHJ1ZSxcbiAgICAgICAgICAgICAgICBwYXNzaXZlOiBmYWxzZSxcblxuICAgICAgICAgICAgICAgIGZpbHRlcjogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLm92ZXJsYXk7XG4gICAgICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgICAgIGhhbmRsZXI6IGZ1bmN0aW9uKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIG5hbWU6ICd0b3VjaG1vdmUnLFxuXG4gICAgICAgICAgICAgICAgcGFzc2l2ZTogZmFsc2UsXG5cbiAgICAgICAgICAgICAgICBlbDogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnBhbmVsO1xuICAgICAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgICAgICBoYW5kbGVyOiBmdW5jdGlvbihlKSB7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKGUudGFyZ2V0VG91Y2hlcy5sZW5ndGggIT09IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIHZhciBjbGllbnRZID0gZXZlbnQudGFyZ2V0VG91Y2hlc1swXS5jbGllbnRZIC0gdGhpcy5jbGllbnRZO1xuICAgICAgICAgICAgICAgICAgICB2YXIgcmVmID0gdGhpcy5wYW5lbDtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHNjcm9sbFRvcCQkMSA9IHJlZi5zY3JvbGxUb3A7XG4gICAgICAgICAgICAgICAgICAgIHZhciBzY3JvbGxIZWlnaHQgPSByZWYuc2Nyb2xsSGVpZ2h0O1xuICAgICAgICAgICAgICAgICAgICB2YXIgY2xpZW50SGVpZ2h0ID0gcmVmLmNsaWVudEhlaWdodDtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoY2xpZW50SGVpZ2h0ID49IHNjcm9sbEhlaWdodFxuICAgICAgICAgICAgICAgICAgICAgICAgfHwgc2Nyb2xsVG9wJCQxID09PSAwICYmIGNsaWVudFkgPiAwXG4gICAgICAgICAgICAgICAgICAgICAgICB8fCBzY3JvbGxIZWlnaHQgLSBzY3JvbGxUb3AkJDEgPD0gY2xpZW50SGVpZ2h0ICYmIGNsaWVudFkgPCAwXG4gICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBuYW1lOiAnc2hvdycsXG5cbiAgICAgICAgICAgICAgICBzZWxmOiB0cnVlLFxuXG4gICAgICAgICAgICAgICAgaGFuZGxlcjogZnVuY3Rpb24oKSB7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMubW9kZSA9PT0gJ3JldmVhbCcgJiYgIWhhc0NsYXNzKHRoaXMucGFuZWwucGFyZW50Tm9kZSwgdGhpcy5jbHNNb2RlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgd3JhcEFsbCh0aGlzLnBhbmVsLCAnPGRpdj4nKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFkZENsYXNzKHRoaXMucGFuZWwucGFyZW50Tm9kZSwgdGhpcy5jbHNNb2RlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGNzcyhkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsICdvdmVyZmxvd1knLCB0aGlzLm92ZXJsYXkgPyAnaGlkZGVuJyA6ICcnKTtcbiAgICAgICAgICAgICAgICAgICAgYWRkQ2xhc3MoZG9jdW1lbnQuYm9keSwgdGhpcy5jbHNDb250YWluZXIsIHRoaXMuY2xzRmxpcCk7XG4gICAgICAgICAgICAgICAgICAgIGNzcyh0aGlzLiRlbCwgJ2Rpc3BsYXknLCAnYmxvY2snKTtcbiAgICAgICAgICAgICAgICAgICAgYWRkQ2xhc3ModGhpcy4kZWwsIHRoaXMuY2xzT3ZlcmxheSk7XG4gICAgICAgICAgICAgICAgICAgIGFkZENsYXNzKHRoaXMucGFuZWwsIHRoaXMuY2xzU2lkZWJhckFuaW1hdGlvbiwgdGhpcy5tb2RlICE9PSAncmV2ZWFsJyA/IHRoaXMuY2xzTW9kZSA6ICcnKTtcblxuICAgICAgICAgICAgICAgICAgICBoZWlnaHQoZG9jdW1lbnQuYm9keSk7IC8vIGZvcmNlIHJlZmxvd1xuICAgICAgICAgICAgICAgICAgICBhZGRDbGFzcyhkb2N1bWVudC5ib2R5LCB0aGlzLmNsc0NvbnRhaW5lckFuaW1hdGlvbik7XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jbHNDb250YWluZXJBbmltYXRpb24gJiYgc3VwcHJlc3NVc2VyU2NhbGUoKTtcblxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBuYW1lOiAnaGlkZScsXG5cbiAgICAgICAgICAgICAgICBzZWxmOiB0cnVlLFxuXG4gICAgICAgICAgICAgICAgaGFuZGxlcjogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlbW92ZUNsYXNzKGRvY3VtZW50LmJvZHksIHRoaXMuY2xzQ29udGFpbmVyQW5pbWF0aW9uKTtcblxuICAgICAgICAgICAgICAgICAgICB2YXIgYWN0aXZlID0gdGhpcy5nZXRBY3RpdmUoKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMubW9kZSA9PT0gJ25vbmUnIHx8IGFjdGl2ZSAmJiBhY3RpdmUgIT09IHRoaXMgJiYgYWN0aXZlICE9PSB0aGlzLnByZXYpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyaWdnZXIodGhpcy5wYW5lbCwgJ3RyYW5zaXRpb25lbmQnKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBuYW1lOiAnaGlkZGVuJyxcblxuICAgICAgICAgICAgICAgIHNlbGY6IHRydWUsXG5cbiAgICAgICAgICAgICAgICBoYW5kbGVyOiBmdW5jdGlvbigpIHtcblxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNsc0NvbnRhaW5lckFuaW1hdGlvbiAmJiByZXN1bWVVc2VyU2NhbGUoKTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5tb2RlID09PSAncmV2ZWFsJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdW53cmFwKHRoaXMucGFuZWwpO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgcmVtb3ZlQ2xhc3ModGhpcy5wYW5lbCwgdGhpcy5jbHNTaWRlYmFyQW5pbWF0aW9uLCB0aGlzLmNsc01vZGUpO1xuICAgICAgICAgICAgICAgICAgICByZW1vdmVDbGFzcyh0aGlzLiRlbCwgdGhpcy5jbHNPdmVybGF5KTtcbiAgICAgICAgICAgICAgICAgICAgY3NzKHRoaXMuJGVsLCAnZGlzcGxheScsICcnKTtcbiAgICAgICAgICAgICAgICAgICAgcmVtb3ZlQ2xhc3MoZG9jdW1lbnQuYm9keSwgdGhpcy5jbHNDb250YWluZXIsIHRoaXMuY2xzRmxpcCk7XG5cbiAgICAgICAgICAgICAgICAgICAgY3NzKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCwgJ292ZXJmbG93WScsICcnKTtcblxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBuYW1lOiAnc3dpcGVMZWZ0IHN3aXBlUmlnaHQnLFxuXG4gICAgICAgICAgICAgICAgaGFuZGxlcjogZnVuY3Rpb24oZSkge1xuXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmlzVG9nZ2xlZCgpICYmIGlzVG91Y2goZSkgJiYgZS50eXBlID09PSAnc3dpcGVMZWZ0JyBeIHRoaXMuZmxpcCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5oaWRlKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICBdXG5cbiAgICB9O1xuXG4gICAgLy8gQ2hyb21lIGluIHJlc3BvbnNpdmUgbW9kZSB6b29tcyBwYWdlIHVwb24gb3BlbmluZyBvZmZjYW52YXNcbiAgICBmdW5jdGlvbiBzdXBwcmVzc1VzZXJTY2FsZSgpIHtcbiAgICAgICAgZ2V0Vmlld3BvcnQoKS5jb250ZW50ICs9ICcsdXNlci1zY2FsYWJsZT0wJztcbiAgICB9XG5cbiAgICBmdW5jdGlvbiByZXN1bWVVc2VyU2NhbGUoKSB7XG4gICAgICAgIHZhciB2aWV3cG9ydCA9IGdldFZpZXdwb3J0KCk7XG4gICAgICAgIHZpZXdwb3J0LmNvbnRlbnQgPSB2aWV3cG9ydC5jb250ZW50LnJlcGxhY2UoLyx1c2VyLXNjYWxhYmxlPTAkLywgJycpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGdldFZpZXdwb3J0KCkge1xuICAgICAgICByZXR1cm4gJCgnbWV0YVtuYW1lPVwidmlld3BvcnRcIl0nLCBkb2N1bWVudC5oZWFkKSB8fCBhcHBlbmQoZG9jdW1lbnQuaGVhZCwgJzxtZXRhIG5hbWU9XCJ2aWV3cG9ydFwiPicpO1xuICAgIH1cblxuICAgIHZhciBPdmVyZmxvd0F1dG8gPSB7XG5cbiAgICAgICAgbWl4aW5zOiBbQ2xhc3NdLFxuXG4gICAgICAgIHByb3BzOiB7XG4gICAgICAgICAgICBzZWxDb250YWluZXI6IFN0cmluZyxcbiAgICAgICAgICAgIHNlbENvbnRlbnQ6IFN0cmluZyxcbiAgICAgICAgfSxcblxuICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgICBzZWxDb250YWluZXI6ICcudWstbW9kYWwnLFxuICAgICAgICAgICAgc2VsQ29udGVudDogJy51ay1tb2RhbC1kaWFsb2cnLFxuICAgICAgICB9LFxuXG4gICAgICAgIGNvbXB1dGVkOiB7XG5cbiAgICAgICAgICAgIGNvbnRhaW5lcjogZnVuY3Rpb24ocmVmLCAkZWwpIHtcbiAgICAgICAgICAgICAgICB2YXIgc2VsQ29udGFpbmVyID0gcmVmLnNlbENvbnRhaW5lcjtcblxuICAgICAgICAgICAgICAgIHJldHVybiBjbG9zZXN0KCRlbCwgc2VsQ29udGFpbmVyKTtcbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIGNvbnRlbnQ6IGZ1bmN0aW9uKHJlZiwgJGVsKSB7XG4gICAgICAgICAgICAgICAgdmFyIHNlbENvbnRlbnQgPSByZWYuc2VsQ29udGVudDtcblxuICAgICAgICAgICAgICAgIHJldHVybiBjbG9zZXN0KCRlbCwgc2VsQ29udGVudCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgfSxcblxuICAgICAgICBjb25uZWN0ZWQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgY3NzKHRoaXMuJGVsLCAnbWluSGVpZ2h0JywgMTUwKTtcbiAgICAgICAgfSxcblxuICAgICAgICB1cGRhdGU6IHtcblxuICAgICAgICAgICAgcmVhZDogZnVuY3Rpb24oKSB7XG5cbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuY29udGVudCB8fCAhdGhpcy5jb250YWluZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnQ6IHRvRmxvYXQoY3NzKHRoaXMuJGVsLCAnbWF4SGVpZ2h0JykpLFxuICAgICAgICAgICAgICAgICAgICBtYXg6IE1hdGgubWF4KDE1MCwgaGVpZ2h0KHRoaXMuY29udGFpbmVyKSAtIChvZmZzZXQodGhpcy5jb250ZW50KS5oZWlnaHQgLSBoZWlnaHQodGhpcy4kZWwpKSlcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgd3JpdGU6IGZ1bmN0aW9uKHJlZikge1xuICAgICAgICAgICAgICAgIHZhciBjdXJyZW50ID0gcmVmLmN1cnJlbnQ7XG4gICAgICAgICAgICAgICAgdmFyIG1heCA9IHJlZi5tYXg7XG5cbiAgICAgICAgICAgICAgICBjc3ModGhpcy4kZWwsICdtYXhIZWlnaHQnLCBtYXgpO1xuICAgICAgICAgICAgICAgIGlmIChNYXRoLnJvdW5kKGN1cnJlbnQpICE9PSBNYXRoLnJvdW5kKG1heCkpIHtcbiAgICAgICAgICAgICAgICAgICAgdHJpZ2dlcih0aGlzLiRlbCwgJ3Jlc2l6ZScpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIGV2ZW50czogWydyZXNpemUnXVxuXG4gICAgICAgIH1cblxuICAgIH07XG5cbiAgICB2YXIgUmVzcG9uc2l2ZSA9IHtcblxuICAgICAgICBwcm9wczogWyd3aWR0aCcsICdoZWlnaHQnXSxcblxuICAgICAgICBjb25uZWN0ZWQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgYWRkQ2xhc3ModGhpcy4kZWwsICd1ay1yZXNwb25zaXZlLXdpZHRoJyk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgdXBkYXRlOiB7XG5cbiAgICAgICAgICAgIHJlYWQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBpc1Zpc2libGUodGhpcy4kZWwpICYmIHRoaXMud2lkdGggJiYgdGhpcy5oZWlnaHRcbiAgICAgICAgICAgICAgICAgICAgPyB7d2lkdGg6IHdpZHRoKHRoaXMuJGVsLnBhcmVudE5vZGUpLCBoZWlnaHQ6IHRoaXMuaGVpZ2h0fVxuICAgICAgICAgICAgICAgICAgICA6IGZhbHNlO1xuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgd3JpdGU6IGZ1bmN0aW9uKGRpbSkge1xuICAgICAgICAgICAgICAgIGhlaWdodCh0aGlzLiRlbCwgRGltZW5zaW9ucy5jb250YWluKHtcbiAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiB0aGlzLmhlaWdodCxcbiAgICAgICAgICAgICAgICAgICAgd2lkdGg6IHRoaXMud2lkdGhcbiAgICAgICAgICAgICAgICB9LCBkaW0pLmhlaWdodCk7XG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICBldmVudHM6IFsncmVzaXplJ11cblxuICAgICAgICB9XG5cbiAgICB9O1xuXG4gICAgdmFyIFNjcm9sbCA9IHtcblxuICAgICAgICBwcm9wczoge1xuICAgICAgICAgICAgZHVyYXRpb246IE51bWJlcixcbiAgICAgICAgICAgIG9mZnNldDogTnVtYmVyXG4gICAgICAgIH0sXG5cbiAgICAgICAgZGF0YToge1xuICAgICAgICAgICAgZHVyYXRpb246IDEwMDAsXG4gICAgICAgICAgICBvZmZzZXQ6IDBcbiAgICAgICAgfSxcblxuICAgICAgICBtZXRob2RzOiB7XG5cbiAgICAgICAgICAgIHNjcm9sbFRvOiBmdW5jdGlvbihlbCkge1xuICAgICAgICAgICAgICAgIHZhciB0aGlzJDEgPSB0aGlzO1xuXG5cbiAgICAgICAgICAgICAgICBlbCA9IGVsICYmICQoZWwpIHx8IGRvY3VtZW50LmJvZHk7XG5cbiAgICAgICAgICAgICAgICB2YXIgZG9jSGVpZ2h0ID0gaGVpZ2h0KGRvY3VtZW50KTtcbiAgICAgICAgICAgICAgICB2YXIgd2luSGVpZ2h0ID0gaGVpZ2h0KHdpbmRvdyk7XG5cbiAgICAgICAgICAgICAgICB2YXIgdGFyZ2V0ID0gb2Zmc2V0KGVsKS50b3AgLSB0aGlzLm9mZnNldDtcbiAgICAgICAgICAgICAgICBpZiAodGFyZ2V0ICsgd2luSGVpZ2h0ID4gZG9jSGVpZ2h0KSB7XG4gICAgICAgICAgICAgICAgICAgIHRhcmdldCA9IGRvY0hlaWdodCAtIHdpbkhlaWdodDtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoIXRyaWdnZXIodGhpcy4kZWwsICdiZWZvcmVzY3JvbGwnLCBbdGhpcywgZWxdKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgdmFyIHN0YXJ0ID0gRGF0ZS5ub3coKTtcbiAgICAgICAgICAgICAgICB2YXIgc3RhcnRZID0gd2luZG93LnBhZ2VZT2Zmc2V0O1xuICAgICAgICAgICAgICAgIHZhciBzdGVwID0gZnVuY3Rpb24gKCkge1xuXG4gICAgICAgICAgICAgICAgICAgIHZhciBjdXJyZW50WSA9IHN0YXJ0WSArICh0YXJnZXQgLSBzdGFydFkpICogZWFzZShjbGFtcCgoRGF0ZS5ub3coKSAtIHN0YXJ0KSAvIHRoaXMkMS5kdXJhdGlvbikpO1xuXG4gICAgICAgICAgICAgICAgICAgIHNjcm9sbFRvcCh3aW5kb3csIGN1cnJlbnRZKTtcblxuICAgICAgICAgICAgICAgICAgICAvLyBzY3JvbGwgbW9yZSBpZiB3ZSBoYXZlIG5vdCByZWFjaGVkIG91ciBkZXN0aW5hdGlvblxuICAgICAgICAgICAgICAgICAgICBpZiAoY3VycmVudFkgIT09IHRhcmdldCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKHN0ZXApO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdHJpZ2dlcih0aGlzJDEuJGVsLCAnc2Nyb2xsZWQnLCBbdGhpcyQxLCBlbF0pO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgc3RlcCgpO1xuXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgfSxcblxuICAgICAgICBldmVudHM6IHtcblxuICAgICAgICAgICAgY2xpY2s6IGZ1bmN0aW9uKGUpIHtcblxuICAgICAgICAgICAgICAgIGlmIChlLmRlZmF1bHRQcmV2ZW50ZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICB0aGlzLnNjcm9sbFRvKGVzY2FwZShkZWNvZGVVUklDb21wb25lbnQodGhpcy4kZWwuaGFzaCkpLnN1YnN0cigxKSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgfVxuXG4gICAgfTtcblxuICAgIGZ1bmN0aW9uIGVhc2Uoaykge1xuICAgICAgICByZXR1cm4gMC41ICogKDEgLSBNYXRoLmNvcyhNYXRoLlBJICogaykpO1xuICAgIH1cblxuICAgIHZhciBTY3JvbGxzcHkgPSB7XG5cbiAgICAgICAgYXJnczogJ2NscycsXG5cbiAgICAgICAgcHJvcHM6IHtcbiAgICAgICAgICAgIGNsczogJ2xpc3QnLFxuICAgICAgICAgICAgdGFyZ2V0OiBTdHJpbmcsXG4gICAgICAgICAgICBoaWRkZW46IEJvb2xlYW4sXG4gICAgICAgICAgICBvZmZzZXRUb3A6IE51bWJlcixcbiAgICAgICAgICAgIG9mZnNldExlZnQ6IE51bWJlcixcbiAgICAgICAgICAgIHJlcGVhdDogQm9vbGVhbixcbiAgICAgICAgICAgIGRlbGF5OiBOdW1iZXJcbiAgICAgICAgfSxcblxuICAgICAgICBkYXRhOiBmdW5jdGlvbiAoKSB7IHJldHVybiAoe1xuICAgICAgICAgICAgY2xzOiBbXSxcbiAgICAgICAgICAgIHRhcmdldDogZmFsc2UsXG4gICAgICAgICAgICBoaWRkZW46IHRydWUsXG4gICAgICAgICAgICBvZmZzZXRUb3A6IDAsXG4gICAgICAgICAgICBvZmZzZXRMZWZ0OiAwLFxuICAgICAgICAgICAgcmVwZWF0OiBmYWxzZSxcbiAgICAgICAgICAgIGRlbGF5OiAwLFxuICAgICAgICAgICAgaW5WaWV3Q2xhc3M6ICd1ay1zY3JvbGxzcHktaW52aWV3J1xuICAgICAgICB9KTsgfSxcblxuICAgICAgICBjb21wdXRlZDoge1xuXG4gICAgICAgICAgICBlbGVtZW50czogZnVuY3Rpb24ocmVmLCAkZWwpIHtcbiAgICAgICAgICAgICAgICB2YXIgdGFyZ2V0ID0gcmVmLnRhcmdldDtcblxuICAgICAgICAgICAgICAgIHJldHVybiB0YXJnZXQgPyAkJCh0YXJnZXQsICRlbCkgOiBbJGVsXTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICB9LFxuXG4gICAgICAgIHVwZGF0ZTogW1xuXG4gICAgICAgICAgICB7XG5cbiAgICAgICAgICAgICAgICB3cml0ZTogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmhpZGRlbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgY3NzKGZpbHRlcih0aGlzLmVsZW1lbnRzLCAoXCI6bm90KC5cIiArICh0aGlzLmluVmlld0NsYXNzKSArIFwiKVwiKSksICd2aXNpYmlsaXR5JywgJ2hpZGRlbicpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICB7XG5cbiAgICAgICAgICAgICAgICByZWFkOiBmdW5jdGlvbihlbHMpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHRoaXMkMSA9IHRoaXM7XG5cblxuICAgICAgICAgICAgICAgICAgICBpZiAoIWVscy51cGRhdGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZWxlbWVudHMuZm9yRWFjaChmdW5jdGlvbiAoZWwsIGkpIHtcblxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGVsRGF0YSA9IGVsc1tpXTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFlbERhdGEgfHwgZWxEYXRhLmVsICE9PSBlbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjbHMgPSBkYXRhKGVsLCAndWstc2Nyb2xsc3B5LWNsYXNzJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxEYXRhID0ge2VsOiBlbCwgdG9nZ2xlczogY2xzICYmIGNscy5zcGxpdCgnLCcpIHx8IHRoaXMkMS5jbHN9O1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBlbERhdGEuc2hvdyA9IGlzSW5WaWV3KGVsLCB0aGlzJDEub2Zmc2V0VG9wLCB0aGlzJDEub2Zmc2V0TGVmdCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNbaV0gPSBlbERhdGE7XG5cbiAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICAgICAgd3JpdGU6IGZ1bmN0aW9uKGVscykge1xuICAgICAgICAgICAgICAgICAgICB2YXIgdGhpcyQxID0gdGhpcztcblxuXG4gICAgICAgICAgICAgICAgICAgIC8vIExldCBjaGlsZCBjb21wb25lbnRzIGJlIGFwcGxpZWQgYXQgbGVhc3Qgb25jZSBmaXJzdFxuICAgICAgICAgICAgICAgICAgICBpZiAoIWVscy51cGRhdGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuJGVtaXQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlbHMudXBkYXRlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZWxlbWVudHMuZm9yRWFjaChmdW5jdGlvbiAoZWwsIGkpIHtcblxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGVsRGF0YSA9IGVsc1tpXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjbHMgPSBlbERhdGEudG9nZ2xlc1tpXSB8fCBlbERhdGEudG9nZ2xlc1swXTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVsRGF0YS5zaG93ICYmICFlbERhdGEuaW52aWV3ICYmICFlbERhdGEucXVldWVkKSB7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgc2hvdyA9IGZ1bmN0aW9uICgpIHtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjc3MoZWwsICd2aXNpYmlsaXR5JywgJycpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRDbGFzcyhlbCwgdGhpcyQxLmluVmlld0NsYXNzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9nZ2xlQ2xhc3MoZWwsIGNscyk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJpZ2dlcihlbCwgJ2ludmlldycpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMkMS4kdXBkYXRlKGVsKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbERhdGEuaW52aWV3ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxEYXRhLmFib3J0ICYmIGVsRGF0YS5hYm9ydCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcyQxLmRlbGF5KSB7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxEYXRhLnF1ZXVlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVscy5wcm9taXNlID0gKGVscy5wcm9taXNlIHx8IFByb21pc2UucmVzb2x2ZSgpKS50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhZWxEYXRhLmludmlldyAmJiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSkge1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHRpbWVyID0gc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvdygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKCk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBlbHMucHJvbWlzZSB8fCB0aGlzJDEuZWxlbWVudHMubGVuZ3RoID09PSAxID8gdGhpcyQxLmRlbGF5IDogMCk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbERhdGEuYWJvcnQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aW1lcik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxEYXRhLnF1ZXVlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvdygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICghZWxEYXRhLnNob3cgJiYgKGVsRGF0YS5pbnZpZXcgfHwgZWxEYXRhLnF1ZXVlZCkgJiYgdGhpcyQxLnJlcGVhdCkge1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxEYXRhLmFib3J0ICYmIGVsRGF0YS5hYm9ydCgpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFlbERhdGEuaW52aWV3KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjc3MoZWwsICd2aXNpYmlsaXR5JywgdGhpcyQxLmhpZGRlbiA/ICdoaWRkZW4nIDogJycpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZUNsYXNzKGVsLCB0aGlzJDEuaW5WaWV3Q2xhc3MpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvZ2dsZUNsYXNzKGVsLCBjbHMpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJpZ2dlcihlbCwgJ291dHZpZXcnKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMkMS4kdXBkYXRlKGVsKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsRGF0YS5pbnZpZXcgPSBmYWxzZTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG5cbiAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICAgICAgZXZlbnRzOiBbJ3Njcm9sbCcsICdyZXNpemUnXVxuXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgXVxuXG4gICAgfTtcblxuICAgIHZhciBTY3JvbGxzcHlOYXYgPSB7XG5cbiAgICAgICAgcHJvcHM6IHtcbiAgICAgICAgICAgIGNsczogU3RyaW5nLFxuICAgICAgICAgICAgY2xvc2VzdDogU3RyaW5nLFxuICAgICAgICAgICAgc2Nyb2xsOiBCb29sZWFuLFxuICAgICAgICAgICAgb3ZlcmZsb3c6IEJvb2xlYW4sXG4gICAgICAgICAgICBvZmZzZXQ6IE51bWJlclxuICAgICAgICB9LFxuXG4gICAgICAgIGRhdGE6IHtcbiAgICAgICAgICAgIGNsczogJ3VrLWFjdGl2ZScsXG4gICAgICAgICAgICBjbG9zZXN0OiBmYWxzZSxcbiAgICAgICAgICAgIHNjcm9sbDogZmFsc2UsXG4gICAgICAgICAgICBvdmVyZmxvdzogdHJ1ZSxcbiAgICAgICAgICAgIG9mZnNldDogMFxuICAgICAgICB9LFxuXG4gICAgICAgIGNvbXB1dGVkOiB7XG5cbiAgICAgICAgICAgIGxpbmtzOiBmdW5jdGlvbihfLCAkZWwpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJCQoJ2FbaHJlZl49XCIjXCJdJywgJGVsKS5maWx0ZXIoZnVuY3Rpb24gKGVsKSB7IHJldHVybiBlbC5oYXNoOyB9KTtcbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIGVsZW1lbnRzOiBmdW5jdGlvbihyZWYpIHtcbiAgICAgICAgICAgICAgICB2YXIgc2VsZWN0b3IgPSByZWYuY2xvc2VzdDtcblxuICAgICAgICAgICAgICAgIHJldHVybiBjbG9zZXN0KHRoaXMubGlua3MsIHNlbGVjdG9yIHx8ICcqJyk7XG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICB0YXJnZXRzOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJCQodGhpcy5saW5rcy5tYXAoZnVuY3Rpb24gKGVsKSB7IHJldHVybiBlbC5oYXNoOyB9KS5qb2luKCcsJykpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgIH0sXG5cbiAgICAgICAgdXBkYXRlOiBbXG5cbiAgICAgICAgICAgIHtcblxuICAgICAgICAgICAgICAgIHJlYWQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5zY3JvbGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuJGNyZWF0ZSgnc2Nyb2xsJywgdGhpcy5saW5rcywge29mZnNldDogdGhpcy5vZmZzZXQgfHwgMH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICB7XG5cbiAgICAgICAgICAgICAgICByZWFkOiBmdW5jdGlvbihkYXRhJCQxKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciB0aGlzJDEgPSB0aGlzO1xuXG5cbiAgICAgICAgICAgICAgICAgICAgdmFyIHNjcm9sbCA9IHdpbmRvdy5wYWdlWU9mZnNldCArIHRoaXMub2Zmc2V0ICsgMTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIG1heCA9IGhlaWdodChkb2N1bWVudCkgLSBoZWlnaHQod2luZG93KSArIHRoaXMub2Zmc2V0O1xuXG4gICAgICAgICAgICAgICAgICAgIGRhdGEkJDEuYWN0aXZlID0gZmFsc2U7XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy50YXJnZXRzLmV2ZXJ5KGZ1bmN0aW9uIChlbCwgaSkge1xuXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgcmVmID0gb2Zmc2V0KGVsKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0b3AgPSByZWYudG9wO1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGxhc3QgPSBpICsgMSA9PT0gdGhpcyQxLnRhcmdldHMubGVuZ3RoO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMkMS5vdmVyZmxvdyAmJiAoaSA9PT0gMCAmJiB0b3AgPiBzY3JvbGwgfHwgbGFzdCAmJiB0b3AgKyBlbC5vZmZzZXRUb3AgPCBzY3JvbGwpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWxhc3QgJiYgb2Zmc2V0KHRoaXMkMS50YXJnZXRzW2kgKyAxXSkudG9wIDw9IHNjcm9sbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2Nyb2xsID49IG1heCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGogPSB0aGlzJDEudGFyZ2V0cy5sZW5ndGggLSAxOyBqID4gaTsgai0tKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc0luVmlldyh0aGlzJDEudGFyZ2V0c1tqXSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsID0gdGhpcyQxLnRhcmdldHNbal07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICEoZGF0YSQkMS5hY3RpdmUgPSAkKGZpbHRlcih0aGlzJDEubGlua3MsIChcIltocmVmPVxcXCIjXCIgKyAoZWwuaWQpICsgXCJcXFwiXVwiKSkpKTtcblxuICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgICAgICB3cml0ZTogZnVuY3Rpb24ocmVmKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBhY3RpdmUgPSByZWYuYWN0aXZlO1xuXG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5saW5rcy5mb3JFYWNoKGZ1bmN0aW9uIChlbCkgeyByZXR1cm4gZWwuYmx1cigpOyB9KTtcbiAgICAgICAgICAgICAgICAgICAgcmVtb3ZlQ2xhc3ModGhpcy5lbGVtZW50cywgdGhpcy5jbHMpO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChhY3RpdmUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyaWdnZXIodGhpcy4kZWwsICdhY3RpdmUnLCBbYWN0aXZlLCBhZGRDbGFzcyh0aGlzLmNsb3Nlc3QgPyBjbG9zZXN0KGFjdGl2ZSwgdGhpcy5jbG9zZXN0KSA6IGFjdGl2ZSwgdGhpcy5jbHMpXSk7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgICAgICBldmVudHM6IFsnc2Nyb2xsJywgJ3Jlc2l6ZSddXG5cbiAgICAgICAgICAgIH1cblxuICAgICAgICBdXG5cbiAgICB9O1xuXG4gICAgdmFyIFN0aWNreSA9IHtcblxuICAgICAgICBtaXhpbnM6IFtDbGFzcywgTWVkaWFdLFxuXG4gICAgICAgIHByb3BzOiB7XG4gICAgICAgICAgICB0b3A6IG51bGwsXG4gICAgICAgICAgICBib3R0b206IEJvb2xlYW4sXG4gICAgICAgICAgICBvZmZzZXQ6IE51bWJlcixcbiAgICAgICAgICAgIGFuaW1hdGlvbjogU3RyaW5nLFxuICAgICAgICAgICAgY2xzQWN0aXZlOiBTdHJpbmcsXG4gICAgICAgICAgICBjbHNJbmFjdGl2ZTogU3RyaW5nLFxuICAgICAgICAgICAgY2xzRml4ZWQ6IFN0cmluZyxcbiAgICAgICAgICAgIGNsc0JlbG93OiBTdHJpbmcsXG4gICAgICAgICAgICBzZWxUYXJnZXQ6IFN0cmluZyxcbiAgICAgICAgICAgIHdpZHRoRWxlbWVudDogQm9vbGVhbixcbiAgICAgICAgICAgIHNob3dPblVwOiBCb29sZWFuLFxuICAgICAgICAgICAgdGFyZ2V0T2Zmc2V0OiBOdW1iZXJcbiAgICAgICAgfSxcblxuICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgICB0b3A6IDAsXG4gICAgICAgICAgICBib3R0b206IGZhbHNlLFxuICAgICAgICAgICAgb2Zmc2V0OiAwLFxuICAgICAgICAgICAgYW5pbWF0aW9uOiAnJyxcbiAgICAgICAgICAgIGNsc0FjdGl2ZTogJ3VrLWFjdGl2ZScsXG4gICAgICAgICAgICBjbHNJbmFjdGl2ZTogJycsXG4gICAgICAgICAgICBjbHNGaXhlZDogJ3VrLXN0aWNreS1maXhlZCcsXG4gICAgICAgICAgICBjbHNCZWxvdzogJ3VrLXN0aWNreS1iZWxvdycsXG4gICAgICAgICAgICBzZWxUYXJnZXQ6ICcnLFxuICAgICAgICAgICAgd2lkdGhFbGVtZW50OiBmYWxzZSxcbiAgICAgICAgICAgIHNob3dPblVwOiBmYWxzZSxcbiAgICAgICAgICAgIHRhcmdldE9mZnNldDogZmFsc2VcbiAgICAgICAgfSxcblxuICAgICAgICBjb21wdXRlZDoge1xuXG4gICAgICAgICAgICBzZWxUYXJnZXQ6IGZ1bmN0aW9uKHJlZiwgJGVsKSB7XG4gICAgICAgICAgICAgICAgdmFyIHNlbFRhcmdldCA9IHJlZi5zZWxUYXJnZXQ7XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gc2VsVGFyZ2V0ICYmICQoc2VsVGFyZ2V0LCAkZWwpIHx8ICRlbDtcbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIHdpZHRoRWxlbWVudDogZnVuY3Rpb24ocmVmLCAkZWwpIHtcbiAgICAgICAgICAgICAgICB2YXIgd2lkdGhFbGVtZW50ID0gcmVmLndpZHRoRWxlbWVudDtcblxuICAgICAgICAgICAgICAgIHJldHVybiBxdWVyeSh3aWR0aEVsZW1lbnQsICRlbCkgfHwgdGhpcy5wbGFjZWhvbGRlcjtcbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIGlzQWN0aXZlOiB7XG5cbiAgICAgICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gaGFzQ2xhc3ModGhpcy5zZWxUYXJnZXQsIHRoaXMuY2xzQWN0aXZlKTtcbiAgICAgICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICAgICAgc2V0OiBmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUgJiYgIXRoaXMuaXNBY3RpdmUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlcGxhY2VDbGFzcyh0aGlzLnNlbFRhcmdldCwgdGhpcy5jbHNJbmFjdGl2ZSwgdGhpcy5jbHNBY3RpdmUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdHJpZ2dlcih0aGlzLiRlbCwgJ2FjdGl2ZScpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCF2YWx1ZSAmJiAhaGFzQ2xhc3ModGhpcy5zZWxUYXJnZXQsIHRoaXMuY2xzSW5hY3RpdmUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXBsYWNlQ2xhc3ModGhpcy5zZWxUYXJnZXQsIHRoaXMuY2xzQWN0aXZlLCB0aGlzLmNsc0luYWN0aXZlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyaWdnZXIodGhpcy4kZWwsICdpbmFjdGl2ZScpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB9LFxuXG4gICAgICAgIH0sXG5cbiAgICAgICAgY29ubmVjdGVkOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHRoaXMucGxhY2Vob2xkZXIgPSAkKCcrIC51ay1zdGlja3ktcGxhY2Vob2xkZXInLCB0aGlzLiRlbCkgfHwgJCgnPGRpdiBjbGFzcz1cInVrLXN0aWNreS1wbGFjZWhvbGRlclwiPjwvZGl2PicpO1xuICAgICAgICAgICAgdGhpcy5pc0ZpeGVkID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLmlzQWN0aXZlID0gZmFsc2U7XG4gICAgICAgIH0sXG5cbiAgICAgICAgZGlzY29ubmVjdGVkOiBmdW5jdGlvbigpIHtcblxuICAgICAgICAgICAgaWYgKHRoaXMuaXNGaXhlZCkge1xuICAgICAgICAgICAgICAgIHRoaXMuaGlkZSgpO1xuICAgICAgICAgICAgICAgIHJlbW92ZUNsYXNzKHRoaXMuc2VsVGFyZ2V0LCB0aGlzLmNsc0luYWN0aXZlKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmVtb3ZlKHRoaXMucGxhY2Vob2xkZXIpO1xuICAgICAgICAgICAgdGhpcy5wbGFjZWhvbGRlciA9IG51bGw7XG4gICAgICAgICAgICB0aGlzLndpZHRoRWxlbWVudCA9IG51bGw7XG4gICAgICAgIH0sXG5cbiAgICAgICAgZXZlbnRzOiBbXG5cbiAgICAgICAgICAgIHtcblxuICAgICAgICAgICAgICAgIG5hbWU6ICdsb2FkIGhhc2hjaGFuZ2UgcG9wc3RhdGUnLFxuXG4gICAgICAgICAgICAgICAgZWw6IHdpbmRvdyxcblxuICAgICAgICAgICAgICAgIGhhbmRsZXI6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgdGhpcyQxID0gdGhpcztcblxuXG4gICAgICAgICAgICAgICAgICAgIGlmICghKHRoaXMudGFyZ2V0T2Zmc2V0ICE9PSBmYWxzZSAmJiBsb2NhdGlvbi5oYXNoICYmIHdpbmRvdy5wYWdlWU9mZnNldCA+IDApKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICB2YXIgdGFyZ2V0ID0gJChsb2NhdGlvbi5oYXNoKTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAodGFyZ2V0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmYXN0ZG9tLnJlYWQoZnVuY3Rpb24gKCkge1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHJlZiA9IG9mZnNldCh0YXJnZXQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0b3AgPSByZWYudG9wO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlbFRvcCA9IG9mZnNldCh0aGlzJDEuJGVsKS50b3A7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGVsSGVpZ2h0ID0gdGhpcyQxLiRlbC5vZmZzZXRIZWlnaHQ7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcyQxLmlzRml4ZWQgJiYgZWxUb3AgKyBlbEhlaWdodCA+PSB0b3AgJiYgZWxUb3AgPD0gdG9wICsgdGFyZ2V0Lm9mZnNldEhlaWdodCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY3JvbGxUb3Aod2luZG93LCB0b3AgLSBlbEhlaWdodCAtIChpc051bWVyaWModGhpcyQxLnRhcmdldE9mZnNldCkgPyB0aGlzJDEudGFyZ2V0T2Zmc2V0IDogMCkgLSB0aGlzJDEub2Zmc2V0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIH1cblxuICAgICAgICBdLFxuXG4gICAgICAgIHVwZGF0ZTogW1xuXG4gICAgICAgICAgICB7XG5cbiAgICAgICAgICAgICAgICByZWFkOiBmdW5jdGlvbihyZWYsIHR5cGUpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGhlaWdodCQkMSA9IHJlZi5oZWlnaHQ7XG5cblxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5pc0FjdGl2ZSAmJiB0eXBlICE9PSAndXBkYXRlJykge1xuXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmhpZGUoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodCQkMSA9IHRoaXMuJGVsLm9mZnNldEhlaWdodDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2hvdygpO1xuXG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBoZWlnaHQkJDEgPSAhdGhpcy5pc0FjdGl2ZSA/IHRoaXMuJGVsLm9mZnNldEhlaWdodCA6IGhlaWdodCQkMTtcblxuICAgICAgICAgICAgICAgICAgICB0aGlzLnRvcE9mZnNldCA9IG9mZnNldCh0aGlzLmlzRml4ZWQgPyB0aGlzLnBsYWNlaG9sZGVyIDogdGhpcy4kZWwpLnRvcDtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ib3R0b21PZmZzZXQgPSB0aGlzLnRvcE9mZnNldCArIGhlaWdodCQkMTtcblxuICAgICAgICAgICAgICAgICAgICB2YXIgYm90dG9tID0gcGFyc2VQcm9wKCdib3R0b20nLCB0aGlzKTtcblxuICAgICAgICAgICAgICAgICAgICB0aGlzLnRvcCA9IE1hdGgubWF4KHRvRmxvYXQocGFyc2VQcm9wKCd0b3AnLCB0aGlzKSksIHRoaXMudG9wT2Zmc2V0KSAtIHRoaXMub2Zmc2V0O1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmJvdHRvbSA9IGJvdHRvbSAmJiBib3R0b20gLSBoZWlnaHQkJDE7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaW5hY3RpdmUgPSAhdGhpcy5tYXRjaE1lZGlhO1xuXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsYXN0U2Nyb2xsOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodDogaGVpZ2h0JCQxLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWFyZ2luczogY3NzKHRoaXMuJGVsLCBbJ21hcmdpblRvcCcsICdtYXJnaW5Cb3R0b20nLCAnbWFyZ2luTGVmdCcsICdtYXJnaW5SaWdodCddKVxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgICAgICB3cml0ZTogZnVuY3Rpb24ocmVmKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBoZWlnaHQkJDEgPSByZWYuaGVpZ2h0O1xuICAgICAgICAgICAgICAgICAgICB2YXIgbWFyZ2lucyA9IHJlZi5tYXJnaW5zO1xuXG5cbiAgICAgICAgICAgICAgICAgICAgdmFyIHJlZiQxID0gdGhpcztcbiAgICAgICAgICAgICAgICAgICAgdmFyIHBsYWNlaG9sZGVyID0gcmVmJDEucGxhY2Vob2xkZXI7XG5cbiAgICAgICAgICAgICAgICAgICAgY3NzKHBsYWNlaG9sZGVyLCBhc3NpZ24oe2hlaWdodDogaGVpZ2h0JCQxfSwgbWFyZ2lucykpO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmICghd2l0aGluKHBsYWNlaG9sZGVyLCBkb2N1bWVudCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFmdGVyKHRoaXMuJGVsLCBwbGFjZWhvbGRlcik7XG4gICAgICAgICAgICAgICAgICAgICAgICBhdHRyKHBsYWNlaG9sZGVyLCAnaGlkZGVuJywgJycpO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gZW5zdXJlIGFjdGl2ZS9pbmFjdGl2ZSBjbGFzc2VzIGFyZSBhcHBsaWVkXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaXNBY3RpdmUgPSB0aGlzLmlzQWN0aXZlO1xuXG4gICAgICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgICAgIGV2ZW50czogWydyZXNpemUnXVxuXG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICB7XG5cbiAgICAgICAgICAgICAgICByZWFkOiBmdW5jdGlvbihyZWYpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHNjcm9sbCA9IHJlZi5zY3JvbGw7IGlmICggc2Nyb2xsID09PSB2b2lkIDAgKSBzY3JvbGwgPSAwO1xuXG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy53aWR0aCA9IChpc1Zpc2libGUodGhpcy53aWR0aEVsZW1lbnQpID8gdGhpcy53aWR0aEVsZW1lbnQgOiB0aGlzLiRlbCkub2Zmc2V0V2lkdGg7XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zY3JvbGwgPSB3aW5kb3cucGFnZVlPZmZzZXQ7XG5cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRpcjogc2Nyb2xsIDw9IHRoaXMuc2Nyb2xsID8gJ2Rvd24nIDogJ3VwJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHNjcm9sbDogdGhpcy5zY3JvbGwsXG4gICAgICAgICAgICAgICAgICAgICAgICB2aXNpYmxlOiBpc1Zpc2libGUodGhpcy4kZWwpLFxuICAgICAgICAgICAgICAgICAgICAgICAgdG9wOiBvZmZzZXRQb3NpdGlvbih0aGlzLnBsYWNlaG9sZGVyKVswXVxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgICAgICB3cml0ZTogZnVuY3Rpb24oZGF0YSQkMSwgdHlwZSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgdGhpcyQxID0gdGhpcztcblxuXG4gICAgICAgICAgICAgICAgICAgIHZhciBpbml0VGltZXN0YW1wID0gZGF0YSQkMS5pbml0VGltZXN0YW1wOyBpZiAoIGluaXRUaW1lc3RhbXAgPT09IHZvaWQgMCApIGluaXRUaW1lc3RhbXAgPSAwO1xuICAgICAgICAgICAgICAgICAgICB2YXIgZGlyID0gZGF0YSQkMS5kaXI7XG4gICAgICAgICAgICAgICAgICAgIHZhciBsYXN0RGlyID0gZGF0YSQkMS5sYXN0RGlyO1xuICAgICAgICAgICAgICAgICAgICB2YXIgbGFzdFNjcm9sbCA9IGRhdGEkJDEubGFzdFNjcm9sbDtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHNjcm9sbCA9IGRhdGEkJDEuc2Nyb2xsO1xuICAgICAgICAgICAgICAgICAgICB2YXIgdG9wID0gZGF0YSQkMS50b3A7XG4gICAgICAgICAgICAgICAgICAgIHZhciB2aXNpYmxlID0gZGF0YSQkMS52aXNpYmxlO1xuICAgICAgICAgICAgICAgICAgICB2YXIgbm93ID0gcGVyZm9ybWFuY2Uubm93KCk7XG5cbiAgICAgICAgICAgICAgICAgICAgZGF0YSQkMS5sYXN0U2Nyb2xsID0gc2Nyb2xsO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChzY3JvbGwgPCAwIHx8IHNjcm9sbCA9PT0gbGFzdFNjcm9sbCB8fCAhdmlzaWJsZSB8fCB0aGlzLmRpc2FibGVkIHx8IHRoaXMuc2hvd09uVXAgJiYgdHlwZSAhPT0gJ3Njcm9sbCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGlmIChub3cgLSBpbml0VGltZXN0YW1wID4gMzAwIHx8IGRpciAhPT0gbGFzdERpcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSQkMS5pbml0U2Nyb2xsID0gc2Nyb2xsO1xuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSQkMS5pbml0VGltZXN0YW1wID0gbm93O1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgZGF0YSQkMS5sYXN0RGlyID0gZGlyO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnNob3dPblVwICYmIE1hdGguYWJzKGRhdGEkJDEuaW5pdFNjcm9sbCAtIHNjcm9sbCkgPD0gMzAgJiYgTWF0aC5hYnMobGFzdFNjcm9sbCAtIHNjcm9sbCkgPD0gMTApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmluYWN0aXZlXG4gICAgICAgICAgICAgICAgICAgICAgICB8fCBzY3JvbGwgPCB0aGlzLnRvcFxuICAgICAgICAgICAgICAgICAgICAgICAgfHwgdGhpcy5zaG93T25VcCAmJiAoc2Nyb2xsIDw9IHRoaXMudG9wIHx8IGRpciA9PT0gJ2Rvd24nIHx8IGRpciA9PT0gJ3VwJyAmJiAhdGhpcy5pc0ZpeGVkICYmIHNjcm9sbCA8PSB0aGlzLmJvdHRvbU9mZnNldClcbiAgICAgICAgICAgICAgICAgICAgKSB7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5pc0ZpeGVkKSB7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoQW5pbWF0aW9uLmluUHJvZ3Jlc3ModGhpcy4kZWwpICYmIHRvcCA+IHNjcm9sbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbmltYXRpb24uY2FuY2VsKHRoaXMuJGVsKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5oaWRlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmlzRml4ZWQgPSBmYWxzZTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuYW5pbWF0aW9uICYmIHNjcm9sbCA+IHRoaXMudG9wT2Zmc2V0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQW5pbWF0aW9uLmNhbmNlbCh0aGlzLiRlbCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQW5pbWF0aW9uLm91dCh0aGlzLiRlbCwgdGhpcy5hbmltYXRpb24pLnRoZW4oZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpcyQxLmhpZGUoKTsgfSwgbm9vcCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaGlkZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5pc0ZpeGVkKSB7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlKCk7XG5cbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmFuaW1hdGlvbikge1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBBbmltYXRpb24uY2FuY2VsKHRoaXMuJGVsKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2hvdygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgQW5pbWF0aW9uLmluKHRoaXMuJGVsLCB0aGlzLmFuaW1hdGlvbikuY2F0Y2gobm9vcCk7XG5cbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2hvdygpO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICAgICAgZXZlbnRzOiBbJ3Jlc2l6ZScsICdzY3JvbGwnXVxuXG4gICAgICAgICAgICB9IF0sXG5cbiAgICAgICAgbWV0aG9kczoge1xuXG4gICAgICAgICAgICBzaG93OiBmdW5jdGlvbigpIHtcblxuICAgICAgICAgICAgICAgIHRoaXMuaXNGaXhlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgdGhpcy51cGRhdGUoKTtcbiAgICAgICAgICAgICAgICBhdHRyKHRoaXMucGxhY2Vob2xkZXIsICdoaWRkZW4nLCBudWxsKTtcblxuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgaGlkZTogZnVuY3Rpb24oKSB7XG5cbiAgICAgICAgICAgICAgICB0aGlzLmlzQWN0aXZlID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgcmVtb3ZlQ2xhc3ModGhpcy4kZWwsIHRoaXMuY2xzRml4ZWQsIHRoaXMuY2xzQmVsb3cpO1xuICAgICAgICAgICAgICAgIGNzcyh0aGlzLiRlbCwge3Bvc2l0aW9uOiAnJywgdG9wOiAnJywgd2lkdGg6ICcnfSk7XG4gICAgICAgICAgICAgICAgYXR0cih0aGlzLnBsYWNlaG9sZGVyLCAnaGlkZGVuJywgJycpO1xuXG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICB1cGRhdGU6IGZ1bmN0aW9uKCkge1xuXG4gICAgICAgICAgICAgICAgdmFyIGFjdGl2ZSA9IHRoaXMudG9wICE9PSAwIHx8IHRoaXMuc2Nyb2xsID4gdGhpcy50b3A7XG4gICAgICAgICAgICAgICAgdmFyIHRvcCA9IE1hdGgubWF4KDAsIHRoaXMub2Zmc2V0KTtcblxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmJvdHRvbSAmJiB0aGlzLnNjcm9sbCA+IHRoaXMuYm90dG9tIC0gdGhpcy5vZmZzZXQpIHtcbiAgICAgICAgICAgICAgICAgICAgdG9wID0gdGhpcy5ib3R0b20gLSB0aGlzLnNjcm9sbDtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBjc3ModGhpcy4kZWwsIHtcbiAgICAgICAgICAgICAgICAgICAgcG9zaXRpb246ICdmaXhlZCcsXG4gICAgICAgICAgICAgICAgICAgIHRvcDogKHRvcCArIFwicHhcIiksXG4gICAgICAgICAgICAgICAgICAgIHdpZHRoOiB0aGlzLndpZHRoXG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICB0aGlzLmlzQWN0aXZlID0gYWN0aXZlO1xuICAgICAgICAgICAgICAgIHRvZ2dsZUNsYXNzKHRoaXMuJGVsLCB0aGlzLmNsc0JlbG93LCB0aGlzLnNjcm9sbCA+IHRoaXMuYm90dG9tT2Zmc2V0KTtcbiAgICAgICAgICAgICAgICBhZGRDbGFzcyh0aGlzLiRlbCwgdGhpcy5jbHNGaXhlZCk7XG5cbiAgICAgICAgICAgIH1cblxuICAgICAgICB9XG5cbiAgICB9O1xuXG4gICAgZnVuY3Rpb24gcGFyc2VQcm9wKHByb3AsIHJlZikge1xuICAgICAgICB2YXIgJHByb3BzID0gcmVmLiRwcm9wcztcbiAgICAgICAgdmFyICRlbCA9IHJlZi4kZWw7XG4gICAgICAgIHZhciBwcm9wT2Zmc2V0ID0gcmVmWyhwcm9wICsgXCJPZmZzZXRcIildO1xuXG5cbiAgICAgICAgdmFyIHZhbHVlID0gJHByb3BzW3Byb3BdO1xuXG4gICAgICAgIGlmICghdmFsdWUpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpc051bWVyaWModmFsdWUpKSB7XG5cbiAgICAgICAgICAgIHJldHVybiBwcm9wT2Zmc2V0ICsgdG9GbG9hdCh2YWx1ZSk7XG5cbiAgICAgICAgfSBlbHNlIGlmIChpc1N0cmluZyh2YWx1ZSkgJiYgdmFsdWUubWF0Y2goL14tP1xcZCt2aCQvKSkge1xuXG4gICAgICAgICAgICByZXR1cm4gaGVpZ2h0KHdpbmRvdykgKiB0b0Zsb2F0KHZhbHVlKSAvIDEwMDtcblxuICAgICAgICB9IGVsc2Uge1xuXG4gICAgICAgICAgICB2YXIgZWwgPSB2YWx1ZSA9PT0gdHJ1ZSA/ICRlbC5wYXJlbnROb2RlIDogcXVlcnkodmFsdWUsICRlbCk7XG5cbiAgICAgICAgICAgIGlmIChlbCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBvZmZzZXQoZWwpLnRvcCArIGVsLm9mZnNldEhlaWdodDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICB9XG4gICAgfVxuXG4gICAgdmFyIFN3aXRjaGVyID0ge1xuXG4gICAgICAgIG1peGluczogW1RvZ2dsYWJsZV0sXG5cbiAgICAgICAgYXJnczogJ2Nvbm5lY3QnLFxuXG4gICAgICAgIHByb3BzOiB7XG4gICAgICAgICAgICBjb25uZWN0OiBTdHJpbmcsXG4gICAgICAgICAgICB0b2dnbGU6IFN0cmluZyxcbiAgICAgICAgICAgIGFjdGl2ZTogTnVtYmVyLFxuICAgICAgICAgICAgc3dpcGluZzogQm9vbGVhblxuICAgICAgICB9LFxuXG4gICAgICAgIGRhdGE6IHtcbiAgICAgICAgICAgIGNvbm5lY3Q6ICd+LnVrLXN3aXRjaGVyJyxcbiAgICAgICAgICAgIHRvZ2dsZTogJz4gKiA+IDpmaXJzdC1jaGlsZCcsXG4gICAgICAgICAgICBhY3RpdmU6IDAsXG4gICAgICAgICAgICBzd2lwaW5nOiB0cnVlLFxuICAgICAgICAgICAgY2xzOiAndWstYWN0aXZlJyxcbiAgICAgICAgICAgIGNsc0NvbnRhaW5lcjogJ3VrLXN3aXRjaGVyJyxcbiAgICAgICAgICAgIGF0dHJJdGVtOiAndWstc3dpdGNoZXItaXRlbScsXG4gICAgICAgICAgICBxdWV1ZWQ6IHRydWVcbiAgICAgICAgfSxcblxuICAgICAgICBjb21wdXRlZDoge1xuXG4gICAgICAgICAgICBjb25uZWN0czogZnVuY3Rpb24ocmVmLCAkZWwpIHtcbiAgICAgICAgICAgICAgICB2YXIgY29ubmVjdCA9IHJlZi5jb25uZWN0O1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuIHF1ZXJ5QWxsKGNvbm5lY3QsICRlbCk7XG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICB0b2dnbGVzOiBmdW5jdGlvbihyZWYsICRlbCkge1xuICAgICAgICAgICAgICAgIHZhciB0b2dnbGUgPSByZWYudG9nZ2xlO1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuICQkKHRvZ2dsZSwgJGVsKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICB9LFxuXG4gICAgICAgIGV2ZW50czogW1xuXG4gICAgICAgICAgICB7XG5cbiAgICAgICAgICAgICAgICBuYW1lOiAnY2xpY2snLFxuXG4gICAgICAgICAgICAgICAgZGVsZWdhdGU6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gKCh0aGlzLnRvZ2dsZSkgKyBcIjpub3QoLnVrLWRpc2FibGVkKVwiKTtcbiAgICAgICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICAgICAgaGFuZGxlcjogZnVuY3Rpb24oZSkge1xuICAgICAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2hvdyh0b05vZGVzKHRoaXMuJGVsLmNoaWxkcmVuKS5maWx0ZXIoZnVuY3Rpb24gKGVsKSB7IHJldHVybiB3aXRoaW4oZS5jdXJyZW50LCBlbCk7IH0pWzBdKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBuYW1lOiAnY2xpY2snLFxuXG4gICAgICAgICAgICAgICAgZWw6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5jb25uZWN0cztcbiAgICAgICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICAgICAgZGVsZWdhdGU6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gKFwiW1wiICsgKHRoaXMuYXR0ckl0ZW0pICsgXCJdLFtkYXRhLVwiICsgKHRoaXMuYXR0ckl0ZW0pICsgXCJdXCIpO1xuICAgICAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgICAgICBoYW5kbGVyOiBmdW5jdGlvbihlKSB7XG4gICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zaG93KGRhdGEoZS5jdXJyZW50LCB0aGlzLmF0dHJJdGVtKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIG5hbWU6ICdzd2lwZVJpZ2h0IHN3aXBlTGVmdCcsXG5cbiAgICAgICAgICAgICAgICBmaWx0ZXI6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5zd2lwaW5nO1xuICAgICAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgICAgICBlbDogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbm5lY3RzO1xuICAgICAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgICAgICBoYW5kbGVyOiBmdW5jdGlvbihlKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghaXNUb3VjaChlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXdpbmRvdy5nZXRTZWxlY3Rpb24oKS50b1N0cmluZygpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNob3coZS50eXBlID09PSAnc3dpcGVMZWZ0JyA/ICduZXh0JyA6ICdwcmV2aW91cycpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgIF0sXG5cbiAgICAgICAgdXBkYXRlOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHZhciB0aGlzJDEgPSB0aGlzO1xuXG5cbiAgICAgICAgICAgIHRoaXMuY29ubmVjdHMuZm9yRWFjaChmdW5jdGlvbiAobGlzdCkgeyByZXR1cm4gdGhpcyQxLnVwZGF0ZUFyaWEobGlzdC5jaGlsZHJlbik7IH0pO1xuICAgICAgICAgICAgdmFyIHJlZiA9IHRoaXMuJGVsO1xuICAgICAgICAgICAgdmFyIGNoaWxkcmVuID0gcmVmLmNoaWxkcmVuO1xuICAgICAgICAgICAgdGhpcy5zaG93KGZpbHRlcihjaGlsZHJlbiwgKFwiLlwiICsgKHRoaXMuY2xzKSkpWzBdIHx8IGNoaWxkcmVuW3RoaXMuYWN0aXZlXSB8fCBjaGlsZHJlblswXSk7XG5cbiAgICAgICAgfSxcblxuICAgICAgICBtZXRob2RzOiB7XG5cbiAgICAgICAgICAgIGluZGV4OiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gISF0aGlzLmNvbm5lY3RzLmxlbmd0aCAmJiBpbmRleChmaWx0ZXIodGhpcy5jb25uZWN0c1swXS5jaGlsZHJlbiwgKFwiLlwiICsgKHRoaXMuY2xzKSkpWzBdKTtcbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIHNob3c6IGZ1bmN0aW9uKGl0ZW0pIHtcbiAgICAgICAgICAgICAgICB2YXIgdGhpcyQxID0gdGhpcztcblxuXG4gICAgICAgICAgICAgICAgdmFyIHJlZiA9IHRoaXMuJGVsO1xuICAgICAgICAgICAgICAgIHZhciBjaGlsZHJlbiA9IHJlZi5jaGlsZHJlbjtcbiAgICAgICAgICAgICAgICB2YXIgbGVuZ3RoID0gY2hpbGRyZW4ubGVuZ3RoO1xuICAgICAgICAgICAgICAgIHZhciBwcmV2ID0gdGhpcy5pbmRleCgpO1xuICAgICAgICAgICAgICAgIHZhciBoYXNQcmV2ID0gcHJldiA+PSAwO1xuICAgICAgICAgICAgICAgIHZhciBkaXIgPSBpdGVtID09PSAncHJldmlvdXMnID8gLTEgOiAxO1xuXG4gICAgICAgICAgICAgICAgdmFyIHRvZ2dsZSwgYWN0aXZlLCBuZXh0ID0gZ2V0SW5kZXgoaXRlbSwgY2hpbGRyZW4sIHByZXYpO1xuXG4gICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKywgbmV4dCA9IChuZXh0ICsgZGlyICsgbGVuZ3RoKSAlIGxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIW1hdGNoZXModGhpcy50b2dnbGVzW25leHRdLCAnLnVrLWRpc2FibGVkICosIC51ay1kaXNhYmxlZCwgW2Rpc2FibGVkXScpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0b2dnbGUgPSB0aGlzLnRvZ2dsZXNbbmV4dF07XG4gICAgICAgICAgICAgICAgICAgICAgICBhY3RpdmUgPSBjaGlsZHJlbltuZXh0XTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKCFhY3RpdmUgfHwgcHJldiA+PSAwICYmIGhhc0NsYXNzKGFjdGl2ZSwgdGhpcy5jbHMpIHx8IHByZXYgPT09IG5leHQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHJlbW92ZUNsYXNzKGNoaWxkcmVuLCB0aGlzLmNscyk7XG4gICAgICAgICAgICAgICAgYWRkQ2xhc3MoYWN0aXZlLCB0aGlzLmNscyk7XG4gICAgICAgICAgICAgICAgYXR0cih0aGlzLnRvZ2dsZXMsICdhcmlhLWV4cGFuZGVkJywgZmFsc2UpO1xuICAgICAgICAgICAgICAgIGF0dHIodG9nZ2xlLCAnYXJpYS1leHBhbmRlZCcsIHRydWUpO1xuXG4gICAgICAgICAgICAgICAgdGhpcy5jb25uZWN0cy5mb3JFYWNoKGZ1bmN0aW9uIChsaXN0KSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghaGFzUHJldikge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcyQxLnRvZ2dsZU5vdyhsaXN0LmNoaWxkcmVuW25leHRdKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMkMS50b2dnbGVFbGVtZW50KFtsaXN0LmNoaWxkcmVuW3ByZXZdLCBsaXN0LmNoaWxkcmVuW25leHRdXSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgfVxuXG4gICAgICAgIH1cblxuICAgIH07XG5cbiAgICB2YXIgVGFiID0ge1xuXG4gICAgICAgIG1peGluczogW0NsYXNzXSxcblxuICAgICAgICBleHRlbmRzOiBTd2l0Y2hlcixcblxuICAgICAgICBwcm9wczoge1xuICAgICAgICAgICAgbWVkaWE6IEJvb2xlYW5cbiAgICAgICAgfSxcblxuICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgICBtZWRpYTogOTYwLFxuICAgICAgICAgICAgYXR0ckl0ZW06ICd1ay10YWItaXRlbSdcbiAgICAgICAgfSxcblxuICAgICAgICBjb25uZWN0ZWQ6IGZ1bmN0aW9uKCkge1xuXG4gICAgICAgICAgICB2YXIgY2xzID0gaGFzQ2xhc3ModGhpcy4kZWwsICd1ay10YWItbGVmdCcpXG4gICAgICAgICAgICAgICAgPyAndWstdGFiLWxlZnQnXG4gICAgICAgICAgICAgICAgOiBoYXNDbGFzcyh0aGlzLiRlbCwgJ3VrLXRhYi1yaWdodCcpXG4gICAgICAgICAgICAgICAgICAgID8gJ3VrLXRhYi1yaWdodCdcbiAgICAgICAgICAgICAgICAgICAgOiBmYWxzZTtcblxuICAgICAgICAgICAgaWYgKGNscykge1xuICAgICAgICAgICAgICAgIHRoaXMuJGNyZWF0ZSgndG9nZ2xlJywgdGhpcy4kZWwsIHtjbHM6IGNscywgbW9kZTogJ21lZGlhJywgbWVkaWE6IHRoaXMubWVkaWF9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgfTtcblxuICAgIHZhciBUb2dnbGUgPSB7XG5cbiAgICAgICAgbWl4aW5zOiBbTWVkaWEsIFRvZ2dsYWJsZV0sXG5cbiAgICAgICAgYXJnczogJ3RhcmdldCcsXG5cbiAgICAgICAgcHJvcHM6IHtcbiAgICAgICAgICAgIGhyZWY6IFN0cmluZyxcbiAgICAgICAgICAgIHRhcmdldDogbnVsbCxcbiAgICAgICAgICAgIG1vZGU6ICdsaXN0JyxcbiAgICAgICAgfSxcblxuICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgICBocmVmOiBmYWxzZSxcbiAgICAgICAgICAgIHRhcmdldDogZmFsc2UsXG4gICAgICAgICAgICBtb2RlOiAnY2xpY2snLFxuICAgICAgICAgICAgcXVldWVkOiB0cnVlLFxuICAgICAgICB9LFxuXG4gICAgICAgIGNvbXB1dGVkOiB7XG5cbiAgICAgICAgICAgIHRhcmdldDogZnVuY3Rpb24ocmVmLCAkZWwpIHtcbiAgICAgICAgICAgICAgICB2YXIgaHJlZiA9IHJlZi5ocmVmO1xuICAgICAgICAgICAgICAgIHZhciB0YXJnZXQgPSByZWYudGFyZ2V0O1xuXG4gICAgICAgICAgICAgICAgdGFyZ2V0ID0gcXVlcnlBbGwodGFyZ2V0IHx8IGhyZWYsICRlbCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRhcmdldC5sZW5ndGggJiYgdGFyZ2V0IHx8IFskZWxdO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgIH0sXG5cbiAgICAgICAgY29ubmVjdGVkOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHRyaWdnZXIodGhpcy50YXJnZXQsICd1cGRhdGVhcmlhJywgW3RoaXNdKTtcbiAgICAgICAgfSxcblxuICAgICAgICBldmVudHM6IFtcblxuICAgICAgICAgICAge1xuXG4gICAgICAgICAgICAgICAgbmFtZTogKHBvaW50ZXJFbnRlciArIFwiIFwiICsgcG9pbnRlckxlYXZlKSxcblxuICAgICAgICAgICAgICAgIGZpbHRlcjogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBpbmNsdWRlcyh0aGlzLm1vZGUsICdob3ZlcicpO1xuICAgICAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgICAgICBoYW5kbGVyOiBmdW5jdGlvbihlKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghaXNUb3VjaChlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50b2dnbGUoKFwidG9nZ2xlXCIgKyAoZS50eXBlID09PSBwb2ludGVyRW50ZXIgPyAnc2hvdycgOiAnaGlkZScpKSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIHtcblxuICAgICAgICAgICAgICAgIG5hbWU6ICdjbGljaycsXG5cbiAgICAgICAgICAgICAgICBmaWx0ZXI6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gaW5jbHVkZXModGhpcy5tb2RlLCAnY2xpY2snKSB8fCBoYXNUb3VjaCAmJiBpbmNsdWRlcyh0aGlzLm1vZGUsICdob3ZlcicpO1xuICAgICAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgICAgICBoYW5kbGVyOiBmdW5jdGlvbihlKSB7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKCFpc1RvdWNoKGUpICYmICFpbmNsdWRlcyh0aGlzLm1vZGUsICdjbGljaycpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAvLyBUT0RPIGJldHRlciBpc1RvZ2dsZWQgaGFuZGxpbmdcbiAgICAgICAgICAgICAgICAgICAgdmFyIGxpbms7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjbG9zZXN0KGUudGFyZ2V0LCAnYVtocmVmPVwiI1wiXSwgYVtocmVmPVwiXCJdLCBidXR0b24nKVxuICAgICAgICAgICAgICAgICAgICAgICAgfHwgKGxpbmsgPSBjbG9zZXN0KGUudGFyZ2V0LCAnYVtocmVmXScpKSAmJiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jbHNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAhaXNWaXNpYmxlKHRoaXMudGFyZ2V0KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IGxpbmsuaGFzaCAmJiBtYXRjaGVzKHRoaXMudGFyZ2V0LCBsaW5rLmhhc2gpXG4gICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy50b2dnbGUoKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIH1cblxuICAgICAgICBdLFxuXG4gICAgICAgIHVwZGF0ZToge1xuXG4gICAgICAgICAgICB3cml0ZTogZnVuY3Rpb24oKSB7XG5cbiAgICAgICAgICAgICAgICBpZiAoIWluY2x1ZGVzKHRoaXMubW9kZSwgJ21lZGlhJykgfHwgIXRoaXMubWVkaWEpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHZhciB0b2dnbGVkID0gdGhpcy5pc1RvZ2dsZWQodGhpcy50YXJnZXQpO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLm1hdGNoTWVkaWEgPyAhdG9nZ2xlZCA6IHRvZ2dsZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50b2dnbGUoKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIGV2ZW50czogWydyZXNpemUnXVxuXG4gICAgICAgIH0sXG5cbiAgICAgICAgbWV0aG9kczoge1xuXG4gICAgICAgICAgICB0b2dnbGU6IGZ1bmN0aW9uKHR5cGUpIHtcbiAgICAgICAgICAgICAgICBpZiAodHJpZ2dlcih0aGlzLnRhcmdldCwgdHlwZSB8fCAndG9nZ2xlJywgW3RoaXNdKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnRvZ2dsZUVsZW1lbnQodGhpcy50YXJnZXQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICB9XG5cbiAgICB9O1xuXG4gICAgZnVuY3Rpb24gY29yZSAoVUlraXQpIHtcblxuICAgICAgICAvLyBjb3JlIGNvbXBvbmVudHNcbiAgICAgICAgVUlraXQuY29tcG9uZW50KCdhY2NvcmRpb24nLCBBY2NvcmRpb24pO1xuICAgICAgICBVSWtpdC5jb21wb25lbnQoJ2FsZXJ0JywgQWxlcnQpO1xuICAgICAgICBVSWtpdC5jb21wb25lbnQoJ2NvdmVyJywgQ292ZXIpO1xuICAgICAgICBVSWtpdC5jb21wb25lbnQoJ2Ryb3AnLCBEcm9wKTtcbiAgICAgICAgVUlraXQuY29tcG9uZW50KCdkcm9wZG93bicsIERyb3Bkb3duKTtcbiAgICAgICAgVUlraXQuY29tcG9uZW50KCdmb3JtQ3VzdG9tJywgRm9ybUN1c3RvbSk7XG4gICAgICAgIFVJa2l0LmNvbXBvbmVudCgnZ2lmJywgR2lmKTtcbiAgICAgICAgVUlraXQuY29tcG9uZW50KCdncmlkJywgR3JpZCk7XG4gICAgICAgIFVJa2l0LmNvbXBvbmVudCgnaGVpZ2h0TWF0Y2gnLCBIZWlnaHRNYXRjaCk7XG4gICAgICAgIFVJa2l0LmNvbXBvbmVudCgnaGVpZ2h0Vmlld3BvcnQnLCBIZWlnaHRWaWV3cG9ydCk7XG4gICAgICAgIFVJa2l0LmNvbXBvbmVudCgnaWNvbicsIEljb24pO1xuICAgICAgICBVSWtpdC5jb21wb25lbnQoJ2ltZycsIEltZyk7XG4gICAgICAgIFVJa2l0LmNvbXBvbmVudCgnbGVhZGVyJywgTGVhZGVyKTtcbiAgICAgICAgVUlraXQuY29tcG9uZW50KCdtYXJnaW4nLCBNYXJnaW4pO1xuICAgICAgICBVSWtpdC5jb21wb25lbnQoJ21vZGFsJywgTW9kYWwkMSk7XG4gICAgICAgIFVJa2l0LmNvbXBvbmVudCgnbmF2JywgTmF2KTtcbiAgICAgICAgVUlraXQuY29tcG9uZW50KCduYXZiYXInLCBOYXZiYXIpO1xuICAgICAgICBVSWtpdC5jb21wb25lbnQoJ29mZmNhbnZhcycsIE9mZmNhbnZhcyk7XG4gICAgICAgIFVJa2l0LmNvbXBvbmVudCgnb3ZlcmZsb3dBdXRvJywgT3ZlcmZsb3dBdXRvKTtcbiAgICAgICAgVUlraXQuY29tcG9uZW50KCdyZXNwb25zaXZlJywgUmVzcG9uc2l2ZSk7XG4gICAgICAgIFVJa2l0LmNvbXBvbmVudCgnc2Nyb2xsJywgU2Nyb2xsKTtcbiAgICAgICAgVUlraXQuY29tcG9uZW50KCdzY3JvbGxzcHknLCBTY3JvbGxzcHkpO1xuICAgICAgICBVSWtpdC5jb21wb25lbnQoJ3Njcm9sbHNweU5hdicsIFNjcm9sbHNweU5hdik7XG4gICAgICAgIFVJa2l0LmNvbXBvbmVudCgnc3RpY2t5JywgU3RpY2t5KTtcbiAgICAgICAgVUlraXQuY29tcG9uZW50KCdzdmcnLCBTVkcpO1xuICAgICAgICBVSWtpdC5jb21wb25lbnQoJ3N3aXRjaGVyJywgU3dpdGNoZXIpO1xuICAgICAgICBVSWtpdC5jb21wb25lbnQoJ3RhYicsIFRhYik7XG4gICAgICAgIFVJa2l0LmNvbXBvbmVudCgndG9nZ2xlJywgVG9nZ2xlKTtcbiAgICAgICAgVUlraXQuY29tcG9uZW50KCd2aWRlbycsIFZpZGVvKTtcblxuICAgICAgICAvLyBJY29uIGNvbXBvbmVudHNcbiAgICAgICAgVUlraXQuY29tcG9uZW50KCdjbG9zZScsIENsb3NlKTtcbiAgICAgICAgVUlraXQuY29tcG9uZW50KCdtYXJrZXInLCBJY29uQ29tcG9uZW50KTtcbiAgICAgICAgVUlraXQuY29tcG9uZW50KCduYXZiYXJUb2dnbGVJY29uJywgSWNvbkNvbXBvbmVudCk7XG4gICAgICAgIFVJa2l0LmNvbXBvbmVudCgnb3ZlcmxheUljb24nLCBJY29uQ29tcG9uZW50KTtcbiAgICAgICAgVUlraXQuY29tcG9uZW50KCdwYWdpbmF0aW9uTmV4dCcsIEljb25Db21wb25lbnQpO1xuICAgICAgICBVSWtpdC5jb21wb25lbnQoJ3BhZ2luYXRpb25QcmV2aW91cycsIEljb25Db21wb25lbnQpO1xuICAgICAgICBVSWtpdC5jb21wb25lbnQoJ3NlYXJjaEljb24nLCBTZWFyY2gpO1xuICAgICAgICBVSWtpdC5jb21wb25lbnQoJ3NsaWRlbmF2TmV4dCcsIFNsaWRlbmF2KTtcbiAgICAgICAgVUlraXQuY29tcG9uZW50KCdzbGlkZW5hdlByZXZpb3VzJywgU2xpZGVuYXYpO1xuICAgICAgICBVSWtpdC5jb21wb25lbnQoJ3NwaW5uZXInLCBTcGlubmVyKTtcbiAgICAgICAgVUlraXQuY29tcG9uZW50KCd0b3RvcCcsIEljb25Db21wb25lbnQpO1xuXG4gICAgICAgIC8vIGNvcmUgZnVuY3Rpb25hbGl0eVxuICAgICAgICBVSWtpdC51c2UoQ29yZSk7XG5cbiAgICB9XG5cbiAgICBVSWtpdC52ZXJzaW9uID0gJzMuMC4zJztcblxuICAgIGNvcmUoVUlraXQpO1xuXG4gICAgdmFyIENvdW50ZG93biA9IHtcblxuICAgICAgICBtaXhpbnM6IFtDbGFzc10sXG5cbiAgICAgICAgcHJvcHM6IHtcbiAgICAgICAgICAgIGRhdGU6IFN0cmluZyxcbiAgICAgICAgICAgIGNsc1dyYXBwZXI6IFN0cmluZ1xuICAgICAgICB9LFxuXG4gICAgICAgIGRhdGE6IHtcbiAgICAgICAgICAgIGRhdGU6ICcnLFxuICAgICAgICAgICAgY2xzV3JhcHBlcjogJy51ay1jb3VudGRvd24tJXVuaXQlJ1xuICAgICAgICB9LFxuXG4gICAgICAgIGNvbXB1dGVkOiB7XG5cbiAgICAgICAgICAgIGRhdGU6IGZ1bmN0aW9uKHJlZikge1xuICAgICAgICAgICAgICAgIHZhciBkYXRlID0gcmVmLmRhdGU7XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gRGF0ZS5wYXJzZShkYXRlKTtcbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIGRheXM6IGZ1bmN0aW9uKHJlZiwgJGVsKSB7XG4gICAgICAgICAgICAgICAgdmFyIGNsc1dyYXBwZXIgPSByZWYuY2xzV3JhcHBlcjtcblxuICAgICAgICAgICAgICAgIHJldHVybiAkKGNsc1dyYXBwZXIucmVwbGFjZSgnJXVuaXQlJywgJ2RheXMnKSwgJGVsKTtcbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIGhvdXJzOiBmdW5jdGlvbihyZWYsICRlbCkge1xuICAgICAgICAgICAgICAgIHZhciBjbHNXcmFwcGVyID0gcmVmLmNsc1dyYXBwZXI7XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gJChjbHNXcmFwcGVyLnJlcGxhY2UoJyV1bml0JScsICdob3VycycpLCAkZWwpO1xuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgbWludXRlczogZnVuY3Rpb24ocmVmLCAkZWwpIHtcbiAgICAgICAgICAgICAgICB2YXIgY2xzV3JhcHBlciA9IHJlZi5jbHNXcmFwcGVyO1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuICQoY2xzV3JhcHBlci5yZXBsYWNlKCcldW5pdCUnLCAnbWludXRlcycpLCAkZWwpO1xuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgc2Vjb25kczogZnVuY3Rpb24ocmVmLCAkZWwpIHtcbiAgICAgICAgICAgICAgICB2YXIgY2xzV3JhcHBlciA9IHJlZi5jbHNXcmFwcGVyO1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuICQoY2xzV3JhcHBlci5yZXBsYWNlKCcldW5pdCUnLCAnc2Vjb25kcycpLCAkZWwpO1xuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgdW5pdHM6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIHZhciB0aGlzJDEgPSB0aGlzO1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuIFsnZGF5cycsICdob3VycycsICdtaW51dGVzJywgJ3NlY29uZHMnXS5maWx0ZXIoZnVuY3Rpb24gKHVuaXQpIHsgcmV0dXJuIHRoaXMkMVt1bml0XTsgfSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgfSxcblxuICAgICAgICBjb25uZWN0ZWQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgdGhpcy5zdGFydCgpO1xuICAgICAgICB9LFxuXG4gICAgICAgIGRpc2Nvbm5lY3RlZDogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICB2YXIgdGhpcyQxID0gdGhpcztcblxuICAgICAgICAgICAgdGhpcy5zdG9wKCk7XG4gICAgICAgICAgICB0aGlzLnVuaXRzLmZvckVhY2goZnVuY3Rpb24gKHVuaXQpIHsgcmV0dXJuIGVtcHR5KHRoaXMkMVt1bml0XSk7IH0pO1xuICAgICAgICB9LFxuXG4gICAgICAgIGV2ZW50czogW1xuXG4gICAgICAgICAgICB7XG5cbiAgICAgICAgICAgICAgICBuYW1lOiAndmlzaWJpbGl0eWNoYW5nZScsXG5cbiAgICAgICAgICAgICAgICBlbDogZG9jdW1lbnQsXG5cbiAgICAgICAgICAgICAgICBoYW5kbGVyOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGRvY3VtZW50LmhpZGRlbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zdG9wKCk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnN0YXJ0KCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIH1cblxuICAgICAgICBdLFxuXG4gICAgICAgIHVwZGF0ZToge1xuXG4gICAgICAgICAgICB3cml0ZTogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgdmFyIHRoaXMkMSA9IHRoaXM7XG5cblxuICAgICAgICAgICAgICAgIHZhciB0aW1lc3BhbiA9IGdldFRpbWVTcGFuKHRoaXMuZGF0ZSk7XG5cbiAgICAgICAgICAgICAgICBpZiAodGltZXNwYW4udG90YWwgPD0gMCkge1xuXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc3RvcCgpO1xuXG4gICAgICAgICAgICAgICAgICAgIHRpbWVzcGFuLmRheXNcbiAgICAgICAgICAgICAgICAgICAgICAgID0gdGltZXNwYW4uaG91cnNcbiAgICAgICAgICAgICAgICAgICAgICAgID0gdGltZXNwYW4ubWludXRlc1xuICAgICAgICAgICAgICAgICAgICAgICAgPSB0aW1lc3Bhbi5zZWNvbmRzXG4gICAgICAgICAgICAgICAgICAgICAgICA9IDA7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgdGhpcy51bml0cy5mb3JFYWNoKGZ1bmN0aW9uICh1bml0KSB7XG5cbiAgICAgICAgICAgICAgICAgICAgdmFyIGRpZ2l0cyA9IFN0cmluZyhNYXRoLmZsb29yKHRpbWVzcGFuW3VuaXRdKSk7XG5cbiAgICAgICAgICAgICAgICAgICAgZGlnaXRzID0gZGlnaXRzLmxlbmd0aCA8IDIgPyAoXCIwXCIgKyBkaWdpdHMpIDogZGlnaXRzO1xuXG4gICAgICAgICAgICAgICAgICAgIHZhciBlbCA9IHRoaXMkMVt1bml0XTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGVsLnRleHRDb250ZW50ICE9PSBkaWdpdHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRpZ2l0cyA9IGRpZ2l0cy5zcGxpdCgnJyk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkaWdpdHMubGVuZ3RoICE9PSBlbC5jaGlsZHJlbi5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBodG1sKGVsLCBkaWdpdHMubWFwKGZ1bmN0aW9uICgpIHsgcmV0dXJuICc8c3Bhbj48L3NwYW4+JzsgfSkuam9pbignJykpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBkaWdpdHMuZm9yRWFjaChmdW5jdGlvbiAoZGlnaXQsIGkpIHsgcmV0dXJuIGVsLmNoaWxkcmVuW2ldLnRleHRDb250ZW50ID0gZGlnaXQ7IH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgfVxuXG4gICAgICAgIH0sXG5cbiAgICAgICAgbWV0aG9kczoge1xuXG4gICAgICAgICAgICBzdGFydDogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgdmFyIHRoaXMkMSA9IHRoaXM7XG5cblxuICAgICAgICAgICAgICAgIHRoaXMuc3RvcCgpO1xuXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuZGF0ZSAmJiB0aGlzLnVuaXRzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLiRlbWl0KCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudGltZXIgPSBzZXRJbnRlcnZhbChmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzJDEuJGVtaXQoKTsgfSwgMTAwMCk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICBzdG9wOiBmdW5jdGlvbigpIHtcblxuICAgICAgICAgICAgICAgIGlmICh0aGlzLnRpbWVyKSB7XG4gICAgICAgICAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwodGhpcy50aW1lcik7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudGltZXIgPSBudWxsO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgfVxuXG4gICAgICAgIH1cblxuICAgIH07XG5cbiAgICBmdW5jdGlvbiBnZXRUaW1lU3BhbihkYXRlKSB7XG5cbiAgICAgICAgdmFyIHRvdGFsID0gZGF0ZSAtIERhdGUubm93KCk7XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHRvdGFsOiB0b3RhbCxcbiAgICAgICAgICAgIHNlY29uZHM6IHRvdGFsIC8gMTAwMCAlIDYwLFxuICAgICAgICAgICAgbWludXRlczogdG90YWwgLyAxMDAwIC8gNjAgJSA2MCxcbiAgICAgICAgICAgIGhvdXJzOiB0b3RhbCAvIDEwMDAgLyA2MCAvIDYwICUgMjQsXG4gICAgICAgICAgICBkYXlzOiB0b3RhbCAvIDEwMDAgLyA2MCAvIDYwIC8gMjRcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICB2YXIgdGFyZ2V0Q2xhc3MgPSAndWstYW5pbWF0aW9uLXRhcmdldCc7XG5cbiAgICB2YXIgQW5pbWF0ZSA9IHtcblxuICAgICAgICBwcm9wczoge1xuICAgICAgICAgICAgYW5pbWF0aW9uOiBOdW1iZXJcbiAgICAgICAgfSxcblxuICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgICBhbmltYXRpb246IDE1MFxuICAgICAgICB9LFxuXG4gICAgICAgIGNvbXB1dGVkOiB7XG5cbiAgICAgICAgICAgIHRhcmdldDogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuJGVsO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgIH0sXG5cbiAgICAgICAgbWV0aG9kczoge1xuXG4gICAgICAgICAgICBhbmltYXRlOiBmdW5jdGlvbihhY3Rpb24pIHtcbiAgICAgICAgICAgICAgICB2YXIgdGhpcyQxID0gdGhpcztcblxuXG4gICAgICAgICAgICAgICAgYWRkU3R5bGUoKTtcblxuICAgICAgICAgICAgICAgIHZhciBjaGlsZHJlbiA9IHRvTm9kZXModGhpcy50YXJnZXQuY2hpbGRyZW4pO1xuICAgICAgICAgICAgICAgIHZhciBwcm9wc0Zyb20gPSBjaGlsZHJlbi5tYXAoZnVuY3Rpb24gKGVsKSB7IHJldHVybiBnZXRQcm9wcyhlbCwgdHJ1ZSk7IH0pO1xuXG4gICAgICAgICAgICAgICAgdmFyIG9sZEhlaWdodCA9IGhlaWdodCh0aGlzLnRhcmdldCk7XG4gICAgICAgICAgICAgICAgdmFyIG9sZFNjcm9sbFkgPSB3aW5kb3cucGFnZVlPZmZzZXQ7XG5cbiAgICAgICAgICAgICAgICBhY3Rpb24oKTtcblxuICAgICAgICAgICAgICAgIFRyYW5zaXRpb24uY2FuY2VsKHRoaXMudGFyZ2V0KTtcbiAgICAgICAgICAgICAgICBjaGlsZHJlbi5mb3JFYWNoKFRyYW5zaXRpb24uY2FuY2VsKTtcblxuICAgICAgICAgICAgICAgIHJlc2V0KHRoaXMudGFyZ2V0KTtcbiAgICAgICAgICAgICAgICB0aGlzLiR1cGRhdGUodGhpcy50YXJnZXQpO1xuICAgICAgICAgICAgICAgIGZhc3Rkb20uZmx1c2goKTtcblxuICAgICAgICAgICAgICAgIHZhciBuZXdIZWlnaHQgPSBoZWlnaHQodGhpcy50YXJnZXQpO1xuXG4gICAgICAgICAgICAgICAgY2hpbGRyZW4gPSBjaGlsZHJlbi5jb25jYXQodG9Ob2Rlcyh0aGlzLnRhcmdldC5jaGlsZHJlbikuZmlsdGVyKGZ1bmN0aW9uIChlbCkgeyByZXR1cm4gIWluY2x1ZGVzKGNoaWxkcmVuLCBlbCk7IH0pKTtcblxuICAgICAgICAgICAgICAgIHZhciBwcm9wc1RvID0gY2hpbGRyZW4ubWFwKGZ1bmN0aW9uIChlbCwgaSkgeyByZXR1cm4gZWwucGFyZW50Tm9kZSAmJiBpIGluIHByb3BzRnJvbVxuICAgICAgICAgICAgICAgICAgICAgICAgPyBwcm9wc0Zyb21baV1cbiAgICAgICAgICAgICAgICAgICAgICAgID8gaXNWaXNpYmxlKGVsKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gZ2V0UG9zaXRpb25XaXRoTWFyZ2luKGVsKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDoge29wYWNpdHk6IDB9XG4gICAgICAgICAgICAgICAgICAgICAgICA6IHtvcGFjaXR5OiBpc1Zpc2libGUoZWwpID8gMSA6IDB9XG4gICAgICAgICAgICAgICAgICAgICAgICA6IGZhbHNlOyB9XG4gICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgIHByb3BzRnJvbSA9IHByb3BzVG8ubWFwKGZ1bmN0aW9uIChwcm9wcywgaSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgZnJvbSA9IGNoaWxkcmVuW2ldLnBhcmVudE5vZGUgPT09IHRoaXMkMS50YXJnZXRcbiAgICAgICAgICAgICAgICAgICAgICAgID8gcHJvcHNGcm9tW2ldIHx8IGdldFByb3BzKGNoaWxkcmVuW2ldKVxuICAgICAgICAgICAgICAgICAgICAgICAgOiBmYWxzZTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoZnJvbSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFwcm9wcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBmcm9tLm9wYWNpdHk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCEoJ29wYWNpdHknIGluIHByb3BzKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBvcGFjaXR5ID0gZnJvbS5vcGFjaXR5O1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9wYWNpdHkgJSAxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BzLm9wYWNpdHkgPSAxO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBmcm9tLm9wYWNpdHk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZyb207XG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICBhZGRDbGFzcyh0aGlzLnRhcmdldCwgdGFyZ2V0Q2xhc3MpO1xuICAgICAgICAgICAgICAgIGNoaWxkcmVuLmZvckVhY2goZnVuY3Rpb24gKGVsLCBpKSB7IHJldHVybiBwcm9wc0Zyb21baV0gJiYgY3NzKGVsLCBwcm9wc0Zyb21baV0pOyB9KTtcbiAgICAgICAgICAgICAgICBjc3ModGhpcy50YXJnZXQsICdoZWlnaHQnLCBvbGRIZWlnaHQpO1xuICAgICAgICAgICAgICAgIHNjcm9sbFRvcCh3aW5kb3csIG9sZFNjcm9sbFkpO1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuIFByb21pc2UuYWxsKGNoaWxkcmVuLm1hcChmdW5jdGlvbiAoZWwsIGkpIHsgcmV0dXJuIHByb3BzRnJvbVtpXSAmJiBwcm9wc1RvW2ldXG4gICAgICAgICAgICAgICAgICAgICAgICA/IFRyYW5zaXRpb24uc3RhcnQoZWwsIHByb3BzVG9baV0sIHRoaXMkMS5hbmltYXRpb24sICdlYXNlJylcbiAgICAgICAgICAgICAgICAgICAgICAgIDogUHJvbWlzZS5yZXNvbHZlKCk7IH1cbiAgICAgICAgICAgICAgICApLmNvbmNhdChUcmFuc2l0aW9uLnN0YXJ0KHRoaXMudGFyZ2V0LCB7aGVpZ2h0OiBuZXdIZWlnaHR9LCB0aGlzLmFuaW1hdGlvbiwgJ2Vhc2UnKSkpLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICBjaGlsZHJlbi5mb3JFYWNoKGZ1bmN0aW9uIChlbCwgaSkgeyByZXR1cm4gY3NzKGVsLCB7ZGlzcGxheTogcHJvcHNUb1tpXS5vcGFjaXR5ID09PSAwID8gJ25vbmUnIDogJycsIHpJbmRleDogJyd9KTsgfSk7XG4gICAgICAgICAgICAgICAgICAgIHJlc2V0KHRoaXMkMS50YXJnZXQpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzJDEuJHVwZGF0ZSh0aGlzJDEudGFyZ2V0KTtcbiAgICAgICAgICAgICAgICAgICAgZmFzdGRvbS5mbHVzaCgpOyAvLyBuZWVkZWQgZm9yIElFMTFcbiAgICAgICAgICAgICAgICB9LCBub29wKTtcblxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfTtcblxuICAgIGZ1bmN0aW9uIGdldFByb3BzKGVsLCBvcGFjaXR5KSB7XG5cbiAgICAgICAgdmFyIHpJbmRleCA9IGNzcyhlbCwgJ3pJbmRleCcpO1xuXG4gICAgICAgIHJldHVybiBpc1Zpc2libGUoZWwpXG4gICAgICAgICAgICA/IGFzc2lnbih7XG4gICAgICAgICAgICAgICAgZGlzcGxheTogJycsXG4gICAgICAgICAgICAgICAgb3BhY2l0eTogb3BhY2l0eSA/IGNzcyhlbCwgJ29wYWNpdHknKSA6ICcwJyxcbiAgICAgICAgICAgICAgICBwb2ludGVyRXZlbnRzOiAnbm9uZScsXG4gICAgICAgICAgICAgICAgcG9zaXRpb246ICdhYnNvbHV0ZScsXG4gICAgICAgICAgICAgICAgekluZGV4OiB6SW5kZXggPT09ICdhdXRvJyA/IGluZGV4KGVsKSA6IHpJbmRleFxuICAgICAgICAgICAgfSwgZ2V0UG9zaXRpb25XaXRoTWFyZ2luKGVsKSlcbiAgICAgICAgICAgIDogZmFsc2U7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcmVzZXQoZWwpIHtcbiAgICAgICAgY3NzKGVsLmNoaWxkcmVuLCB7XG4gICAgICAgICAgICBoZWlnaHQ6ICcnLFxuICAgICAgICAgICAgbGVmdDogJycsXG4gICAgICAgICAgICBvcGFjaXR5OiAnJyxcbiAgICAgICAgICAgIHBvaW50ZXJFdmVudHM6ICcnLFxuICAgICAgICAgICAgcG9zaXRpb246ICcnLFxuICAgICAgICAgICAgdG9wOiAnJyxcbiAgICAgICAgICAgIHdpZHRoOiAnJ1xuICAgICAgICB9KTtcbiAgICAgICAgcmVtb3ZlQ2xhc3MoZWwsIHRhcmdldENsYXNzKTtcbiAgICAgICAgY3NzKGVsLCAnaGVpZ2h0JywgJycpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGdldFBvc2l0aW9uV2l0aE1hcmdpbihlbCkge1xuICAgICAgICB2YXIgcmVmID0gZWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgIHZhciBoZWlnaHQkJDEgPSByZWYuaGVpZ2h0O1xuICAgICAgICB2YXIgd2lkdGgkJDEgPSByZWYud2lkdGg7XG4gICAgICAgIHZhciByZWYkMSA9IHBvc2l0aW9uKGVsKTtcbiAgICAgICAgdmFyIHRvcCA9IHJlZiQxLnRvcDtcbiAgICAgICAgdmFyIGxlZnQgPSByZWYkMS5sZWZ0O1xuICAgICAgICB0b3AgKz0gdG9GbG9hdChjc3MoZWwsICdtYXJnaW5Ub3AnKSk7XG5cbiAgICAgICAgcmV0dXJuIHt0b3A6IHRvcCwgbGVmdDogbGVmdCwgaGVpZ2h0OiBoZWlnaHQkJDEsIHdpZHRoOiB3aWR0aCQkMX07XG4gICAgfVxuXG4gICAgdmFyIHN0eWxlJDE7XG5cbiAgICBmdW5jdGlvbiBhZGRTdHlsZSgpIHtcbiAgICAgICAgaWYgKCFzdHlsZSQxKSB7XG4gICAgICAgICAgICBzdHlsZSQxID0gYXBwZW5kKGRvY3VtZW50LmhlYWQsICc8c3R5bGU+Jykuc2hlZXQ7XG4gICAgICAgICAgICBzdHlsZSQxLmluc2VydFJ1bGUoXG4gICAgICAgICAgICAgICAgKFwiLlwiICsgdGFyZ2V0Q2xhc3MgKyBcIiA+ICoge1xcbiAgICAgICAgICAgICAgICAgICAgbWFyZ2luLXRvcDogMCAhaW1wb3J0YW50O1xcbiAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtOiBub25lICFpbXBvcnRhbnQ7XFxuICAgICAgICAgICAgICAgIH1cIiksIDBcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgRmlsdGVyID0ge1xuXG4gICAgICAgIG1peGluczogW0FuaW1hdGVdLFxuXG4gICAgICAgIGFyZ3M6ICd0YXJnZXQnLFxuXG4gICAgICAgIHByb3BzOiB7XG4gICAgICAgICAgICB0YXJnZXQ6IEJvb2xlYW4sXG4gICAgICAgICAgICBzZWxBY3RpdmU6IEJvb2xlYW5cbiAgICAgICAgfSxcblxuICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgICB0YXJnZXQ6IG51bGwsXG4gICAgICAgICAgICBzZWxBY3RpdmU6IGZhbHNlLFxuICAgICAgICAgICAgYXR0ckl0ZW06ICd1ay1maWx0ZXItY29udHJvbCcsXG4gICAgICAgICAgICBjbHM6ICd1ay1hY3RpdmUnLFxuICAgICAgICAgICAgYW5pbWF0aW9uOiAyNTBcbiAgICAgICAgfSxcblxuICAgICAgICBjb21wdXRlZDoge1xuXG4gICAgICAgICAgICB0b2dnbGVzOiB7XG5cbiAgICAgICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uKHJlZiwgJGVsKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBhdHRySXRlbSA9IHJlZi5hdHRySXRlbTtcblxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gJCQoKFwiW1wiICsgKHRoaXMuYXR0ckl0ZW0pICsgXCJdLFtkYXRhLVwiICsgKHRoaXMuYXR0ckl0ZW0pICsgXCJdXCIpLCAkZWwpO1xuICAgICAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgICAgICB3YXRjaDogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0U3RhdGUodGhpcy5nZXRTdGF0ZSgpLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICB0YXJnZXQ6IGZ1bmN0aW9uKHJlZiwgJGVsKSB7XG4gICAgICAgICAgICAgICAgdmFyIHRhcmdldCA9IHJlZi50YXJnZXQ7XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gJCh0YXJnZXQsICRlbCk7XG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICBjaGlsZHJlbjoge1xuXG4gICAgICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRvTm9kZXModGhpcy50YXJnZXQuY2hpbGRyZW4pO1xuICAgICAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgICAgICB3YXRjaDogZnVuY3Rpb24obGlzdCwgb2xkKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghaXNFcXVhbExpc3QobGlzdCwgb2xkKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy51cGRhdGVTdGF0ZSgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgIH0sXG5cbiAgICAgICAgZXZlbnRzOiBbXG5cbiAgICAgICAgICAgIHtcblxuICAgICAgICAgICAgICAgIG5hbWU6ICdjbGljaycsXG5cbiAgICAgICAgICAgICAgICBkZWxlZ2F0ZTogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAoXCJbXCIgKyAodGhpcy5hdHRySXRlbSkgKyBcIl0sW2RhdGEtXCIgKyAodGhpcy5hdHRySXRlbSkgKyBcIl1cIik7XG4gICAgICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgICAgIGhhbmRsZXI6IGZ1bmN0aW9uKGUpIHtcblxuICAgICAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYXBwbHkoZS5jdXJyZW50KTtcblxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgfVxuXG4gICAgICAgIF0sXG5cbiAgICAgICAgY29ubmVjdGVkOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHZhciB0aGlzJDEgPSB0aGlzO1xuXG5cbiAgICAgICAgICAgIGlmICh0aGlzLnNlbEFjdGl2ZSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHZhciBhY3RpdmVzID0gJCQodGhpcy5zZWxBY3RpdmUsIHRoaXMuJGVsKTtcbiAgICAgICAgICAgIHRoaXMudG9nZ2xlcy5mb3JFYWNoKGZ1bmN0aW9uIChlbCkgeyByZXR1cm4gdG9nZ2xlQ2xhc3MoZWwsIHRoaXMkMS5jbHMsIGluY2x1ZGVzKGFjdGl2ZXMsIGVsKSk7IH0pO1xuICAgICAgICB9LFxuXG4gICAgICAgIG1ldGhvZHM6IHtcblxuICAgICAgICAgICAgYXBwbHk6IGZ1bmN0aW9uKGVsKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXRTdGF0ZShtZXJnZVN0YXRlKGVsLCB0aGlzLmF0dHJJdGVtLCB0aGlzLmdldFN0YXRlKCkpKTtcbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIGdldFN0YXRlOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICB2YXIgdGhpcyQxID0gdGhpcztcblxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnRvZ2dsZXNcbiAgICAgICAgICAgICAgICAgICAgLmZpbHRlcihmdW5jdGlvbiAoaXRlbSkgeyByZXR1cm4gaGFzQ2xhc3MoaXRlbSwgdGhpcyQxLmNscyk7IH0pXG4gICAgICAgICAgICAgICAgICAgIC5yZWR1Y2UoZnVuY3Rpb24gKHN0YXRlLCBlbCkgeyByZXR1cm4gbWVyZ2VTdGF0ZShlbCwgdGhpcyQxLmF0dHJJdGVtLCBzdGF0ZSk7IH0sIHtmaWx0ZXI6IHsnJzogJyd9LCBzb3J0OiBbXX0pO1xuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgc2V0U3RhdGU6IGZ1bmN0aW9uKHN0YXRlLCBhbmltYXRlJCQxKSB7XG4gICAgICAgICAgICAgICAgdmFyIHRoaXMkMSA9IHRoaXM7XG4gICAgICAgICAgICAgICAgaWYgKCBhbmltYXRlJCQxID09PSB2b2lkIDAgKSBhbmltYXRlJCQxID0gdHJ1ZTtcblxuXG4gICAgICAgICAgICAgICAgc3RhdGUgPSBhc3NpZ24oe2ZpbHRlcjogeycnOiAnJ30sIHNvcnQ6IFtdfSwgc3RhdGUpO1xuXG4gICAgICAgICAgICAgICAgdHJpZ2dlcih0aGlzLiRlbCwgJ2JlZm9yZUZpbHRlcicsIFt0aGlzLCBzdGF0ZV0pO1xuXG4gICAgICAgICAgICAgICAgdmFyIHJlZiA9IHRoaXM7XG4gICAgICAgICAgICAgICAgdmFyIGNoaWxkcmVuID0gcmVmLmNoaWxkcmVuO1xuXG4gICAgICAgICAgICAgICAgdGhpcy50b2dnbGVzLmZvckVhY2goZnVuY3Rpb24gKGVsKSB7IHJldHVybiB0b2dnbGVDbGFzcyhlbCwgdGhpcyQxLmNscywgbWF0Y2hGaWx0ZXIoZWwsIHRoaXMkMS5hdHRySXRlbSwgc3RhdGUpKTsgfSk7XG5cbiAgICAgICAgICAgICAgICB2YXIgYXBwbHkkJDEgPSBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgICAgICAgICAgICAgdmFyIHNlbGVjdG9yID0gZ2V0U2VsZWN0b3Ioc3RhdGUpO1xuXG4gICAgICAgICAgICAgICAgICAgIGNoaWxkcmVuLmZvckVhY2goZnVuY3Rpb24gKGVsKSB7IHJldHVybiBjc3MoZWwsICdkaXNwbGF5Jywgc2VsZWN0b3IgJiYgIW1hdGNoZXMoZWwsIHNlbGVjdG9yKSA/ICdub25lJyA6ICcnKTsgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgdmFyIHJlZiA9IHN0YXRlLnNvcnQ7XG4gICAgICAgICAgICAgICAgICAgIHZhciBzb3J0ID0gcmVmWzBdO1xuICAgICAgICAgICAgICAgICAgICB2YXIgb3JkZXIgPSByZWZbMV07XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHNvcnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzb3J0ZWQgPSBzb3J0SXRlbXMoY2hpbGRyZW4sIHNvcnQsIG9yZGVyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaXNFcXVhbChzb3J0ZWQsIGNoaWxkcmVuKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvcnRlZC5mb3JFYWNoKGZ1bmN0aW9uIChlbCkgeyByZXR1cm4gYXBwZW5kKHRoaXMkMS50YXJnZXQsIGVsKTsgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICBpZiAoYW5pbWF0ZSQkMSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmFuaW1hdGUoYXBwbHkkJDEpLnRoZW4oZnVuY3Rpb24gKCkgeyByZXR1cm4gdHJpZ2dlcih0aGlzJDEuJGVsLCAnYWZ0ZXJGaWx0ZXInLCBbdGhpcyQxXSk7IH0pO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGFwcGx5JCQxKCk7XG4gICAgICAgICAgICAgICAgICAgIHRyaWdnZXIodGhpcy4kZWwsICdhZnRlckZpbHRlcicsIFt0aGlzXSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICB1cGRhdGVTdGF0ZTogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXRTdGF0ZSh0aGlzLmdldFN0YXRlKCksIGZhbHNlKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICB9XG5cbiAgICB9O1xuXG4gICAgZnVuY3Rpb24gZ2V0RmlsdGVyKGVsLCBhdHRyJCQxKSB7XG4gICAgICAgIHJldHVybiBwYXJzZU9wdGlvbnMoZGF0YShlbCwgYXR0ciQkMSksIFsnZmlsdGVyJ10pO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIG1lcmdlU3RhdGUoZWwsIGF0dHIkJDEsIHN0YXRlKSB7XG5cbiAgICAgICAgdG9Ob2RlcyhlbCkuZm9yRWFjaChmdW5jdGlvbiAoZWwpIHtcbiAgICAgICAgICAgIHZhciBmaWx0ZXJCeSA9IGdldEZpbHRlcihlbCwgYXR0ciQkMSk7XG4gICAgICAgICAgICB2YXIgZmlsdGVyJCQxID0gZmlsdGVyQnkuZmlsdGVyO1xuICAgICAgICAgICAgdmFyIGdyb3VwID0gZmlsdGVyQnkuZ3JvdXA7XG4gICAgICAgICAgICB2YXIgc29ydCA9IGZpbHRlckJ5LnNvcnQ7XG4gICAgICAgICAgICB2YXIgb3JkZXIgPSBmaWx0ZXJCeS5vcmRlcjsgaWYgKCBvcmRlciA9PT0gdm9pZCAwICkgb3JkZXIgPSAnYXNjJztcblxuICAgICAgICAgICAgaWYgKGZpbHRlciQkMSB8fCBpc1VuZGVmaW5lZChzb3J0KSkge1xuXG4gICAgICAgICAgICAgICAgaWYgKGdyb3VwKSB7XG4gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBzdGF0ZS5maWx0ZXJbJyddO1xuICAgICAgICAgICAgICAgICAgICBzdGF0ZS5maWx0ZXJbZ3JvdXBdID0gZmlsdGVyJCQxO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHN0YXRlLmZpbHRlciA9IHsnJzogZmlsdGVyJCQxIHx8ICcnfTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKCFpc1VuZGVmaW5lZChzb3J0KSkge1xuICAgICAgICAgICAgICAgIHN0YXRlLnNvcnQgPSBbc29ydCwgb3JkZXJdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gc3RhdGU7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbWF0Y2hGaWx0ZXIoZWwsIGF0dHIkJDEsIHJlZikge1xuICAgICAgICB2YXIgc3RhdGVGaWx0ZXIgPSByZWYuZmlsdGVyOyBpZiAoIHN0YXRlRmlsdGVyID09PSB2b2lkIDAgKSBzdGF0ZUZpbHRlciA9IHsnJzogJyd9O1xuICAgICAgICB2YXIgcmVmX3NvcnQgPSByZWYuc29ydDtcbiAgICAgICAgdmFyIHN0YXRlU29ydCA9IHJlZl9zb3J0WzBdO1xuICAgICAgICB2YXIgc3RhdGVPcmRlciA9IHJlZl9zb3J0WzFdO1xuXG5cbiAgICAgICAgdmFyIHJlZiQxID0gZ2V0RmlsdGVyKGVsLCBhdHRyJCQxKTtcbiAgICAgICAgdmFyIGZpbHRlciQkMSA9IHJlZiQxLmZpbHRlcjtcbiAgICAgICAgdmFyIGdyb3VwID0gcmVmJDEuZ3JvdXA7IGlmICggZ3JvdXAgPT09IHZvaWQgMCApIGdyb3VwID0gJyc7XG4gICAgICAgIHZhciBzb3J0ID0gcmVmJDEuc29ydDtcbiAgICAgICAgdmFyIG9yZGVyID0gcmVmJDEub3JkZXI7IGlmICggb3JkZXIgPT09IHZvaWQgMCApIG9yZGVyID0gJ2FzYyc7XG5cbiAgICAgICAgZmlsdGVyJCQxID0gaXNVbmRlZmluZWQoc29ydCkgPyBmaWx0ZXIkJDEgfHwgJycgOiBmaWx0ZXIkJDE7XG4gICAgICAgIHNvcnQgPSBpc1VuZGVmaW5lZChmaWx0ZXIkJDEpID8gc29ydCB8fCAnJyA6IHNvcnQ7XG5cbiAgICAgICAgcmV0dXJuIChpc1VuZGVmaW5lZChmaWx0ZXIkJDEpIHx8IGdyb3VwIGluIHN0YXRlRmlsdGVyICYmIGZpbHRlciQkMSA9PT0gc3RhdGVGaWx0ZXJbZ3JvdXBdKVxuICAgICAgICAgICAgJiYgKGlzVW5kZWZpbmVkKHNvcnQpIHx8IHN0YXRlU29ydCA9PT0gc29ydCAmJiBzdGF0ZU9yZGVyID09PSBvcmRlcik7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNFcXVhbExpc3QobGlzdEEsIGxpc3RCKSB7XG4gICAgICAgIHJldHVybiBsaXN0QS5sZW5ndGggPT09IGxpc3RCLmxlbmd0aFxuICAgICAgICAgICAgJiYgbGlzdEEuZXZlcnkoZnVuY3Rpb24gKGVsKSB7IHJldHVybiB+bGlzdEIuaW5kZXhPZihlbCk7IH0pO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGdldFNlbGVjdG9yKHJlZikge1xuICAgICAgICB2YXIgZmlsdGVyJCQxID0gcmVmLmZpbHRlcjtcblxuICAgICAgICB2YXIgc2VsZWN0b3IgPSAnJztcbiAgICAgICAgZWFjaChmaWx0ZXIkJDEsIGZ1bmN0aW9uICh2YWx1ZSkgeyByZXR1cm4gc2VsZWN0b3IgKz0gdmFsdWUgfHwgJyc7IH0pO1xuICAgICAgICByZXR1cm4gc2VsZWN0b3I7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gc29ydEl0ZW1zKG5vZGVzLCBzb3J0LCBvcmRlcikge1xuICAgICAgICByZXR1cm4gYXNzaWduKFtdLCBub2Rlcykuc29ydChmdW5jdGlvbiAoYSwgYikgeyByZXR1cm4gZGF0YShhLCBzb3J0KS5sb2NhbGVDb21wYXJlKGRhdGEoYiwgc29ydCksIHVuZGVmaW5lZCwge251bWVyaWM6IHRydWV9KSAqIChvcmRlciA9PT0gJ2FzYycgfHwgLTEpOyB9KTtcbiAgICB9XG5cbiAgICB2YXIgQW5pbWF0aW9ucyA9IHtcblxuICAgICAgICBzbGlkZToge1xuXG4gICAgICAgICAgICBzaG93OiBmdW5jdGlvbihkaXIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgICAgICAgICB7dHJhbnNmb3JtOiB0cmFuc2xhdGUoZGlyICogLTEwMCl9LFxuICAgICAgICAgICAgICAgICAgICB7dHJhbnNmb3JtOiB0cmFuc2xhdGUoKX1cbiAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgcGVyY2VudDogZnVuY3Rpb24oY3VycmVudCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0cmFuc2xhdGVkKGN1cnJlbnQpO1xuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgdHJhbnNsYXRlOiBmdW5jdGlvbihwZXJjZW50LCBkaXIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgICAgICAgICB7dHJhbnNmb3JtOiB0cmFuc2xhdGUoZGlyICogLTEwMCAqIHBlcmNlbnQpfSxcbiAgICAgICAgICAgICAgICAgICAge3RyYW5zZm9ybTogdHJhbnNsYXRlKGRpciAqIDEwMCAqICgxIC0gcGVyY2VudCkpfVxuICAgICAgICAgICAgICAgIF07XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgfVxuXG4gICAgfTtcblxuICAgIGZ1bmN0aW9uIHRyYW5zbGF0ZWQoZWwpIHtcbiAgICAgICAgcmV0dXJuIE1hdGguYWJzKGNzcyhlbCwgJ3RyYW5zZm9ybScpLnNwbGl0KCcsJylbNF0gLyBlbC5vZmZzZXRXaWR0aCkgfHwgMDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiB0cmFuc2xhdGUodmFsdWUsIHVuaXQpIHtcbiAgICAgICAgaWYgKCB2YWx1ZSA9PT0gdm9pZCAwICkgdmFsdWUgPSAwO1xuICAgICAgICBpZiAoIHVuaXQgPT09IHZvaWQgMCApIHVuaXQgPSAnJSc7XG5cbiAgICAgICAgcmV0dXJuIChcInRyYW5zbGF0ZVgoXCIgKyB2YWx1ZSArICh2YWx1ZSA/IHVuaXQgOiAnJykgKyBcIilcIik7IC8vIGN1cnJlbnRseSBub3QgdHJhbnNsYXRlM2QgdG8gc3VwcG9ydCBJRSwgdHJhbnNsYXRlM2Qgd2l0aGluIHRyYW5zbGF0ZTNkIGRvZXMgbm90IHdvcmsgd2hpbGUgdHJhbnNpdGlvbmluZ1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHNjYWxlM2QodmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIChcInNjYWxlM2QoXCIgKyB2YWx1ZSArIFwiLCBcIiArIHZhbHVlICsgXCIsIDEpXCIpO1xuICAgIH1cblxuICAgIHZhciBBbmltYXRpb25zJDEgPSBhc3NpZ24oe30sIEFuaW1hdGlvbnMsIHtcblxuICAgICAgICBmYWRlOiB7XG5cbiAgICAgICAgICAgIHNob3c6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICAgICAgICAgIHtvcGFjaXR5OiAwfSxcbiAgICAgICAgICAgICAgICAgICAge29wYWNpdHk6IDF9XG4gICAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIHBlcmNlbnQ6IGZ1bmN0aW9uKGN1cnJlbnQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gMSAtIGNzcyhjdXJyZW50LCAnb3BhY2l0eScpO1xuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgdHJhbnNsYXRlOiBmdW5jdGlvbihwZXJjZW50KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgICAgICAgICAge29wYWNpdHk6IDEgLSBwZXJjZW50fSxcbiAgICAgICAgICAgICAgICAgICAge29wYWNpdHk6IHBlcmNlbnR9XG4gICAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICB9LFxuXG4gICAgICAgIHNjYWxlOiB7XG5cbiAgICAgICAgICAgIHNob3c6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICAgICAgICAgIHtvcGFjaXR5OiAwLCB0cmFuc2Zvcm06IHNjYWxlM2QoMSAtIC4yKX0sXG4gICAgICAgICAgICAgICAgICAgIHtvcGFjaXR5OiAxLCB0cmFuc2Zvcm06IHNjYWxlM2QoMSl9XG4gICAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIHBlcmNlbnQ6IGZ1bmN0aW9uKGN1cnJlbnQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gMSAtIGNzcyhjdXJyZW50LCAnb3BhY2l0eScpO1xuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgdHJhbnNsYXRlOiBmdW5jdGlvbihwZXJjZW50KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgICAgICAgICAge29wYWNpdHk6IDEgLSBwZXJjZW50LCB0cmFuc2Zvcm06IHNjYWxlM2QoMSAtIC4yICogcGVyY2VudCl9LFxuICAgICAgICAgICAgICAgICAgICB7b3BhY2l0eTogcGVyY2VudCwgdHJhbnNmb3JtOiBzY2FsZTNkKDEgLSAuMiArIC4yICogcGVyY2VudCl9XG4gICAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICB9XG5cbiAgICB9KTtcblxuICAgIGZ1bmN0aW9uIFRyYW5zaXRpb25lcihwcmV2LCBuZXh0LCBkaXIsIHJlZikge1xuICAgICAgICB2YXIgYW5pbWF0aW9uID0gcmVmLmFuaW1hdGlvbjtcbiAgICAgICAgdmFyIGVhc2luZyA9IHJlZi5lYXNpbmc7XG5cblxuICAgICAgICB2YXIgcGVyY2VudCA9IGFuaW1hdGlvbi5wZXJjZW50O1xuICAgICAgICB2YXIgdHJhbnNsYXRlID0gYW5pbWF0aW9uLnRyYW5zbGF0ZTtcbiAgICAgICAgdmFyIHNob3cgPSBhbmltYXRpb24uc2hvdzsgaWYgKCBzaG93ID09PSB2b2lkIDAgKSBzaG93ID0gbm9vcDtcbiAgICAgICAgdmFyIHByb3BzID0gc2hvdyhkaXIpO1xuICAgICAgICB2YXIgZGVmZXJyZWQgPSBuZXcgRGVmZXJyZWQoKTtcblxuICAgICAgICByZXR1cm4ge1xuXG4gICAgICAgICAgICBkaXI6IGRpcixcblxuICAgICAgICAgICAgc2hvdzogZnVuY3Rpb24oZHVyYXRpb24sIHBlcmNlbnQsIGxpbmVhcikge1xuICAgICAgICAgICAgICAgIHZhciB0aGlzJDEgPSB0aGlzO1xuICAgICAgICAgICAgICAgIGlmICggcGVyY2VudCA9PT0gdm9pZCAwICkgcGVyY2VudCA9IDA7XG5cblxuICAgICAgICAgICAgICAgIHZhciB0aW1pbmcgPSBsaW5lYXIgPyAnbGluZWFyJyA6IGVhc2luZztcbiAgICAgICAgICAgICAgICBkdXJhdGlvbiAtPSBNYXRoLnJvdW5kKGR1cmF0aW9uICogY2xhbXAocGVyY2VudCwgLTEsIDEpKTtcblxuICAgICAgICAgICAgICAgIHRoaXMudHJhbnNsYXRlKHBlcmNlbnQpO1xuXG4gICAgICAgICAgICAgICAgdHJpZ2dlclVwZGF0ZShuZXh0LCAnaXRlbWluJywge3BlcmNlbnQ6IHBlcmNlbnQsIGR1cmF0aW9uOiBkdXJhdGlvbiwgdGltaW5nOiB0aW1pbmcsIGRpcjogZGlyfSk7XG4gICAgICAgICAgICAgICAgdHJpZ2dlclVwZGF0ZShwcmV2LCAnaXRlbW91dCcsIHtwZXJjZW50OiAxIC0gcGVyY2VudCwgZHVyYXRpb246IGR1cmF0aW9uLCB0aW1pbmc6IHRpbWluZywgZGlyOiBkaXJ9KTtcblxuICAgICAgICAgICAgICAgIFByb21pc2UuYWxsKFtcbiAgICAgICAgICAgICAgICAgICAgVHJhbnNpdGlvbi5zdGFydChuZXh0LCBwcm9wc1sxXSwgZHVyYXRpb24sIHRpbWluZyksXG4gICAgICAgICAgICAgICAgICAgIFRyYW5zaXRpb24uc3RhcnQocHJldiwgcHJvcHNbMF0sIGR1cmF0aW9uLCB0aW1pbmcpXG4gICAgICAgICAgICAgICAgXSkudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMkMS5yZXNldCgpO1xuICAgICAgICAgICAgICAgICAgICBkZWZlcnJlZC5yZXNvbHZlKCk7XG4gICAgICAgICAgICAgICAgfSwgbm9vcCk7XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gZGVmZXJyZWQucHJvbWlzZTtcbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIHN0b3A6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBUcmFuc2l0aW9uLnN0b3AoW25leHQsIHByZXZdKTtcbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIGNhbmNlbDogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgVHJhbnNpdGlvbi5jYW5jZWwoW25leHQsIHByZXZdKTtcbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIHJlc2V0OiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBwcm9wIGluIHByb3BzWzBdKSB7XG4gICAgICAgICAgICAgICAgICAgIGNzcyhbbmV4dCwgcHJldl0sIHByb3AsICcnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICBmb3J3YXJkOiBmdW5jdGlvbihkdXJhdGlvbiwgcGVyY2VudCkge1xuICAgICAgICAgICAgICAgIGlmICggcGVyY2VudCA9PT0gdm9pZCAwICkgcGVyY2VudCA9IHRoaXMucGVyY2VudCgpO1xuXG4gICAgICAgICAgICAgICAgVHJhbnNpdGlvbi5jYW5jZWwoW25leHQsIHByZXZdKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5zaG93KGR1cmF0aW9uLCBwZXJjZW50LCB0cnVlKTtcblxuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgdHJhbnNsYXRlOiBmdW5jdGlvbihwZXJjZW50KSB7XG5cbiAgICAgICAgICAgICAgICB0aGlzLnJlc2V0KCk7XG5cbiAgICAgICAgICAgICAgICB2YXIgcHJvcHMgPSB0cmFuc2xhdGUocGVyY2VudCwgZGlyKTtcbiAgICAgICAgICAgICAgICBjc3MobmV4dCwgcHJvcHNbMV0pO1xuICAgICAgICAgICAgICAgIGNzcyhwcmV2LCBwcm9wc1swXSk7XG4gICAgICAgICAgICAgICAgdHJpZ2dlclVwZGF0ZShuZXh0LCAnaXRlbXRyYW5zbGF0ZWluJywge3BlcmNlbnQ6IHBlcmNlbnQsIGRpcjogZGlyfSk7XG4gICAgICAgICAgICAgICAgdHJpZ2dlclVwZGF0ZShwcmV2LCAnaXRlbXRyYW5zbGF0ZW91dCcsIHtwZXJjZW50OiAxIC0gcGVyY2VudCwgZGlyOiBkaXJ9KTtcblxuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgcGVyY2VudDogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHBlcmNlbnQocHJldiB8fCBuZXh0LCBuZXh0LCBkaXIpO1xuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgZ2V0RGlzdGFuY2U6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBwcmV2ICYmIHByZXYub2Zmc2V0V2lkdGg7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgfTtcblxuICAgIH1cblxuICAgIGZ1bmN0aW9uIHRyaWdnZXJVcGRhdGUoZWwsIHR5cGUsIGRhdGEkJDEpIHtcbiAgICAgICAgdHJpZ2dlcihlbCwgY3JlYXRlRXZlbnQodHlwZSwgZmFsc2UsIGZhbHNlLCBkYXRhJCQxKSk7XG4gICAgfVxuXG4gICAgdmFyIFNsaWRlckF1dG9wbGF5ID0ge1xuXG4gICAgICAgIHByb3BzOiB7XG4gICAgICAgICAgICBhdXRvcGxheTogQm9vbGVhbixcbiAgICAgICAgICAgIGF1dG9wbGF5SW50ZXJ2YWw6IE51bWJlcixcbiAgICAgICAgICAgIHBhdXNlT25Ib3ZlcjogQm9vbGVhblxuICAgICAgICB9LFxuXG4gICAgICAgIGRhdGE6IHtcbiAgICAgICAgICAgIGF1dG9wbGF5OiBmYWxzZSxcbiAgICAgICAgICAgIGF1dG9wbGF5SW50ZXJ2YWw6IDcwMDAsXG4gICAgICAgICAgICBwYXVzZU9uSG92ZXI6IHRydWVcbiAgICAgICAgfSxcblxuICAgICAgICBjb25uZWN0ZWQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgdGhpcy5zdGFydEF1dG9wbGF5KCk7XG4gICAgICAgICAgICB0aGlzLnVzZXJJbnRlcmFjdGVkID0gZmFsc2U7XG4gICAgICAgIH0sXG5cbiAgICAgICAgZGlzY29ubmVjdGVkOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHRoaXMuc3RvcEF1dG9wbGF5KCk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgZXZlbnRzOiBbXG5cbiAgICAgICAgICAgIHtcblxuICAgICAgICAgICAgICAgIG5hbWU6ICd2aXNpYmlsaXR5Y2hhbmdlJyxcblxuICAgICAgICAgICAgICAgIGVsOiBkb2N1bWVudCxcblxuICAgICAgICAgICAgICAgIGhhbmRsZXI6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZG9jdW1lbnQuaGlkZGVuKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnN0b3BBdXRvcGxheSgpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgIXRoaXMudXNlckludGVyYWN0ZWQgJiYgdGhpcy5zdGFydEF1dG9wbGF5KCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIHtcblxuICAgICAgICAgICAgICAgIG5hbWU6IHBvaW50ZXJEb3duLFxuICAgICAgICAgICAgICAgIGhhbmRsZXI6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnVzZXJJbnRlcmFjdGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zdG9wQXV0b3BsYXkoKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIHtcblxuICAgICAgICAgICAgICAgIG5hbWU6ICdtb3VzZWVudGVyJyxcblxuICAgICAgICAgICAgICAgIGZpbHRlcjogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmF1dG9wbGF5O1xuICAgICAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgICAgICBoYW5kbGVyOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pc0hvdmVyaW5nID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIHtcblxuICAgICAgICAgICAgICAgIG5hbWU6ICdtb3VzZWxlYXZlJyxcblxuICAgICAgICAgICAgICAgIGZpbHRlcjogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmF1dG9wbGF5O1xuICAgICAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgICAgICBoYW5kbGVyOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pc0hvdmVyaW5nID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgXSxcblxuICAgICAgICBtZXRob2RzOiB7XG5cbiAgICAgICAgICAgIHN0YXJ0QXV0b3BsYXk6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIHZhciB0aGlzJDEgPSB0aGlzO1xuXG5cbiAgICAgICAgICAgICAgICB0aGlzLnN0b3BBdXRvcGxheSgpO1xuXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuYXV0b3BsYXkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pbnRlcnZhbCA9IHNldEludGVydmFsKFxuICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gKCkgeyByZXR1cm4gISh0aGlzJDEuaXNIb3ZlcmluZyAmJiB0aGlzJDEucGF1c2VPbkhvdmVyKSAmJiAhdGhpcyQxLnN0YWNrLmxlbmd0aCAmJiB0aGlzJDEuc2hvdygnbmV4dCcpOyB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hdXRvcGxheUludGVydmFsXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICBzdG9wQXV0b3BsYXk6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmludGVydmFsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwodGhpcy5pbnRlcnZhbCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgIH1cblxuICAgIH07XG5cbiAgICB2YXIgU2xpZGVyRHJhZyA9IHtcblxuICAgICAgICBwcm9wczoge1xuICAgICAgICAgICAgZHJhZ2dhYmxlOiBCb29sZWFuXG4gICAgICAgIH0sXG5cbiAgICAgICAgZGF0YToge1xuICAgICAgICAgICAgZHJhZ2dhYmxlOiB0cnVlLFxuICAgICAgICAgICAgdGhyZXNob2xkOiAxMFxuICAgICAgICB9LFxuXG4gICAgICAgIGNyZWF0ZWQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgdmFyIHRoaXMkMSA9IHRoaXM7XG5cblxuICAgICAgICAgICAgWydzdGFydCcsICdtb3ZlJywgJ2VuZCddLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuXG4gICAgICAgICAgICAgICAgdmFyIGZuID0gdGhpcyQxW2tleV07XG4gICAgICAgICAgICAgICAgdGhpcyQxW2tleV0gPSBmdW5jdGlvbiAoZSkge1xuXG4gICAgICAgICAgICAgICAgICAgIHZhciBwb3MgPSBnZXRQb3MkMShlKS54ICogKGlzUnRsID8gLTEgOiAxKTtcblxuICAgICAgICAgICAgICAgICAgICB0aGlzJDEucHJldlBvcyA9IHBvcyAhPT0gdGhpcyQxLnBvcyA/IHRoaXMkMS5wb3MgOiB0aGlzJDEucHJldlBvcztcbiAgICAgICAgICAgICAgICAgICAgdGhpcyQxLnBvcyA9IHBvcztcblxuICAgICAgICAgICAgICAgICAgICBmbihlKTtcbiAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICB9LFxuXG4gICAgICAgIGV2ZW50czogW1xuXG4gICAgICAgICAgICB7XG5cbiAgICAgICAgICAgICAgICBuYW1lOiBwb2ludGVyRG93bixcblxuICAgICAgICAgICAgICAgIGRlbGVnYXRlOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2VsU2xpZGVzO1xuICAgICAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgICAgICBoYW5kbGVyOiBmdW5jdGlvbihlKSB7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLmRyYWdnYWJsZVxuICAgICAgICAgICAgICAgICAgICAgICAgfHwgIWlzVG91Y2goZSkgJiYgaGFzVGV4dE5vZGVzT25seShlLnRhcmdldClcbiAgICAgICAgICAgICAgICAgICAgICAgIHx8IGUuYnV0dG9uID4gMFxuICAgICAgICAgICAgICAgICAgICAgICAgfHwgdGhpcy5sZW5ndGggPCAyXG4gICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zdGFydChlKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIHtcblxuICAgICAgICAgICAgICAgIC8vIFdvcmthcm91bmQgZm9yIGlPUyAxMSBidWc6IGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xODQyNTBcblxuICAgICAgICAgICAgICAgIG5hbWU6ICd0b3VjaG1vdmUnLFxuICAgICAgICAgICAgICAgIHBhc3NpdmU6IGZhbHNlLFxuICAgICAgICAgICAgICAgIGhhbmRsZXI6ICdtb3ZlJyxcbiAgICAgICAgICAgICAgICBkZWxlZ2F0ZTogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnNlbFNsaWRlcztcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBuYW1lOiAnZHJhZ3N0YXJ0JyxcblxuICAgICAgICAgICAgICAgIGhhbmRsZXI6IGZ1bmN0aW9uKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICBdLFxuXG4gICAgICAgIG1ldGhvZHM6IHtcblxuICAgICAgICAgICAgc3RhcnQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIHZhciB0aGlzJDEgPSB0aGlzO1xuXG5cbiAgICAgICAgICAgICAgICB0aGlzLmRyYWcgPSB0aGlzLnBvcztcblxuICAgICAgICAgICAgICAgIGlmICh0aGlzLl90cmFuc2l0aW9uZXIpIHtcblxuICAgICAgICAgICAgICAgICAgICB0aGlzLnBlcmNlbnQgPSB0aGlzLl90cmFuc2l0aW9uZXIucGVyY2VudCgpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRyYWcgKz0gdGhpcy5fdHJhbnNpdGlvbmVyLmdldERpc3RhbmNlKCkgKiB0aGlzLnBlcmNlbnQgKiB0aGlzLmRpcjtcblxuICAgICAgICAgICAgICAgICAgICB0aGlzLl90cmFuc2l0aW9uZXIuY2FuY2VsKCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3RyYW5zaXRpb25lci50cmFuc2xhdGUodGhpcy5wZXJjZW50KTtcblxuICAgICAgICAgICAgICAgICAgICB0aGlzLmRyYWdnaW5nID0gdHJ1ZTtcblxuICAgICAgICAgICAgICAgICAgICB0aGlzLnN0YWNrID0gW107XG5cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnByZXZJbmRleCA9IHRoaXMuaW5kZXg7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gU2VlIGFib3ZlIHdvcmthcm91bmQgbm90aWNlXG4gICAgICAgICAgICAgICAgdmFyIG9mZiQkMSA9IHBvaW50ZXJNb3ZlICE9PSAndG91Y2htb3ZlJ1xuICAgICAgICAgICAgICAgICAgICA/IG9uKGRvY3VtZW50LCBwb2ludGVyTW92ZSwgdGhpcy5tb3ZlLCB7cGFzc2l2ZTogZmFsc2V9KVxuICAgICAgICAgICAgICAgICAgICA6IG5vb3A7XG4gICAgICAgICAgICAgICAgdGhpcy51bmJpbmRNb3ZlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICBvZmYkJDEoKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcyQxLnVuYmluZE1vdmUgPSBudWxsO1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgb24od2luZG93LCAnc2Nyb2xsJywgdGhpcy51bmJpbmRNb3ZlKTtcbiAgICAgICAgICAgICAgICBvbihkb2N1bWVudCwgcG9pbnRlclVwLCB0aGlzLmVuZCwgdHJ1ZSk7XG5cbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIG1vdmU6IGZ1bmN0aW9uKGUpIHtcbiAgICAgICAgICAgICAgICB2YXIgdGhpcyQxID0gdGhpcztcblxuXG4gICAgICAgICAgICAgICAgLy8gU2VlIGFib3ZlIHdvcmthcm91bmQgbm90aWNlXG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLnVuYmluZE1vdmUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHZhciBkaXN0YW5jZSA9IHRoaXMucG9zIC0gdGhpcy5kcmFnO1xuXG4gICAgICAgICAgICAgICAgaWYgKGRpc3RhbmNlID09PSAwIHx8IHRoaXMucHJldlBvcyA9PT0gdGhpcy5wb3MgfHwgIXRoaXMuZHJhZ2dpbmcgJiYgTWF0aC5hYnMoZGlzdGFuY2UpIDwgdGhpcy50aHJlc2hvbGQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGUuY2FuY2VsYWJsZSAmJiBlLnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICAgICAgICAgICAgICB0aGlzLmRyYWdnaW5nID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB0aGlzLmRpciA9IChkaXN0YW5jZSA8IDAgPyAxIDogLTEpO1xuXG4gICAgICAgICAgICAgICAgdmFyIHJlZiA9IHRoaXM7XG4gICAgICAgICAgICAgICAgdmFyIHNsaWRlcyA9IHJlZi5zbGlkZXM7XG4gICAgICAgICAgICAgICAgdmFyIHJlZiQxID0gdGhpcztcbiAgICAgICAgICAgICAgICB2YXIgcHJldkluZGV4ID0gcmVmJDEucHJldkluZGV4O1xuICAgICAgICAgICAgICAgIHZhciBkaXMgPSBNYXRoLmFicyhkaXN0YW5jZSk7XG4gICAgICAgICAgICAgICAgdmFyIG5leHRJbmRleCA9IHRoaXMuZ2V0SW5kZXgocHJldkluZGV4ICsgdGhpcy5kaXIsIHByZXZJbmRleCk7XG4gICAgICAgICAgICAgICAgdmFyIHdpZHRoJCQxID0gdGhpcy5fZ2V0RGlzdGFuY2UocHJldkluZGV4LCBuZXh0SW5kZXgpIHx8IHNsaWRlc1twcmV2SW5kZXhdLm9mZnNldFdpZHRoO1xuXG4gICAgICAgICAgICAgICAgd2hpbGUgKG5leHRJbmRleCAhPT0gcHJldkluZGV4ICYmIGRpcyA+IHdpZHRoJCQxKSB7XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kcmFnIC09IHdpZHRoJCQxICogdGhpcy5kaXI7XG5cbiAgICAgICAgICAgICAgICAgICAgcHJldkluZGV4ID0gbmV4dEluZGV4O1xuICAgICAgICAgICAgICAgICAgICBkaXMgLT0gd2lkdGgkJDE7XG4gICAgICAgICAgICAgICAgICAgIG5leHRJbmRleCA9IHRoaXMuZ2V0SW5kZXgocHJldkluZGV4ICsgdGhpcy5kaXIsIHByZXZJbmRleCk7XG4gICAgICAgICAgICAgICAgICAgIHdpZHRoJCQxID0gdGhpcy5fZ2V0RGlzdGFuY2UocHJldkluZGV4LCBuZXh0SW5kZXgpIHx8IHNsaWRlc1twcmV2SW5kZXhdLm9mZnNldFdpZHRoO1xuXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgdGhpcy5wZXJjZW50ID0gZGlzIC8gd2lkdGgkJDE7XG5cbiAgICAgICAgICAgICAgICB2YXIgcHJldiA9IHNsaWRlc1twcmV2SW5kZXhdO1xuICAgICAgICAgICAgICAgIHZhciBuZXh0ID0gc2xpZGVzW25leHRJbmRleF07XG4gICAgICAgICAgICAgICAgdmFyIGNoYW5nZWQgPSB0aGlzLmluZGV4ICE9PSBuZXh0SW5kZXg7XG4gICAgICAgICAgICAgICAgdmFyIGVkZ2UgPSBwcmV2SW5kZXggPT09IG5leHRJbmRleDtcblxuICAgICAgICAgICAgICAgIHZhciBpdGVtU2hvd247XG5cbiAgICAgICAgICAgICAgICBbdGhpcy5pbmRleCwgdGhpcy5wcmV2SW5kZXhdLmZpbHRlcihmdW5jdGlvbiAoaSkgeyByZXR1cm4gIWluY2x1ZGVzKFtuZXh0SW5kZXgsIHByZXZJbmRleF0sIGkpOyB9KS5mb3JFYWNoKGZ1bmN0aW9uIChpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRyaWdnZXIoc2xpZGVzW2ldLCAnaXRlbWhpZGRlbicsIFt0aGlzJDFdKTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoZWRnZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaXRlbVNob3duID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMkMS5wcmV2SW5kZXggPSBwcmV2SW5kZXg7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuaW5kZXggPT09IHByZXZJbmRleCAmJiB0aGlzLnByZXZJbmRleCAhPT0gcHJldkluZGV4IHx8IGl0ZW1TaG93bikge1xuICAgICAgICAgICAgICAgICAgICB0cmlnZ2VyKHNsaWRlc1t0aGlzLmluZGV4XSwgJ2l0ZW1zaG93bicsIFt0aGlzXSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKGNoYW5nZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wcmV2SW5kZXggPSBwcmV2SW5kZXg7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaW5kZXggPSBuZXh0SW5kZXg7XG5cbiAgICAgICAgICAgICAgICAgICAgIWVkZ2UgJiYgdHJpZ2dlcihwcmV2LCAnYmVmb3JlaXRlbWhpZGUnLCBbdGhpc10pO1xuICAgICAgICAgICAgICAgICAgICB0cmlnZ2VyKG5leHQsICdiZWZvcmVpdGVtc2hvdycsIFt0aGlzXSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgdGhpcy5fdHJhbnNpdGlvbmVyID0gdGhpcy5fdHJhbnNsYXRlKE1hdGguYWJzKHRoaXMucGVyY2VudCksIHByZXYsICFlZGdlICYmIG5leHQpO1xuXG4gICAgICAgICAgICAgICAgaWYgKGNoYW5nZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgIWVkZ2UgJiYgdHJpZ2dlcihwcmV2LCAnaXRlbWhpZGUnLCBbdGhpc10pO1xuICAgICAgICAgICAgICAgICAgICB0cmlnZ2VyKG5leHQsICdpdGVtc2hvdycsIFt0aGlzXSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICBlbmQ6IGZ1bmN0aW9uKCkge1xuXG4gICAgICAgICAgICAgICAgb2ZmKHdpbmRvdywgJ3Njcm9sbCcsIHRoaXMudW5iaW5kTW92ZSk7XG4gICAgICAgICAgICAgICAgdGhpcy51bmJpbmRNb3ZlICYmIHRoaXMudW5iaW5kTW92ZSgpO1xuICAgICAgICAgICAgICAgIG9mZihkb2N1bWVudCwgcG9pbnRlclVwLCB0aGlzLmVuZCwgdHJ1ZSk7XG5cbiAgICAgICAgICAgICAgICBpZiAodGhpcy5kcmFnZ2luZykge1xuXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZHJhZ2dpbmcgPSBudWxsO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmluZGV4ID09PSB0aGlzLnByZXZJbmRleCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wZXJjZW50ID0gMSAtIHRoaXMucGVyY2VudDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGlyICo9IC0xO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fc2hvdyhmYWxzZSwgdGhpcy5pbmRleCwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl90cmFuc2l0aW9uZXIgPSBudWxsO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgZGlyQ2hhbmdlID0gKGlzUnRsID8gdGhpcy5kaXIgKiAoaXNSdGwgPyAxIDogLTEpIDogdGhpcy5kaXIpIDwgMCA9PT0gdGhpcy5wcmV2UG9zID4gdGhpcy5wb3M7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmluZGV4ID0gZGlyQ2hhbmdlID8gdGhpcy5pbmRleCA6IHRoaXMucHJldkluZGV4O1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGlyQ2hhbmdlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wZXJjZW50ID0gMSAtIHRoaXMucGVyY2VudDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zaG93KHRoaXMuZGlyID4gMCAmJiAhZGlyQ2hhbmdlIHx8IHRoaXMuZGlyIDwgMCAmJiBkaXJDaGFuZ2UgPyAnbmV4dCcgOiAncHJldmlvdXMnLCB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIHByZXZlbnRDbGljaygpO1xuXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgdGhpcy5kcmFnXG4gICAgICAgICAgICAgICAgICAgID0gdGhpcy5wZXJjZW50XG4gICAgICAgICAgICAgICAgICAgID0gbnVsbDtcblxuICAgICAgICAgICAgfVxuXG4gICAgICAgIH1cblxuICAgIH07XG5cbiAgICBmdW5jdGlvbiBoYXNUZXh0Tm9kZXNPbmx5KGVsKSB7XG4gICAgICAgIHJldHVybiAhZWwuY2hpbGRyZW4ubGVuZ3RoICYmIGVsLmNoaWxkTm9kZXMubGVuZ3RoO1xuICAgIH1cblxuICAgIHZhciBTbGlkZXJOYXYgPSB7XG5cbiAgICAgICAgZGF0YToge1xuICAgICAgICAgICAgc2VsTmF2OiBmYWxzZVxuICAgICAgICB9LFxuXG4gICAgICAgIGNvbXB1dGVkOiB7XG5cbiAgICAgICAgICAgIG5hdjogZnVuY3Rpb24ocmVmLCAkZWwpIHtcbiAgICAgICAgICAgICAgICB2YXIgc2VsTmF2ID0gcmVmLnNlbE5hdjtcblxuICAgICAgICAgICAgICAgIHJldHVybiAkKHNlbE5hdiwgJGVsKTtcbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIHNlbE5hdkl0ZW06IGZ1bmN0aW9uKHJlZikge1xuICAgICAgICAgICAgICAgIHZhciBhdHRySXRlbSA9IHJlZi5hdHRySXRlbTtcblxuICAgICAgICAgICAgICAgIHJldHVybiAoXCJbXCIgKyBhdHRySXRlbSArIFwiXSxbZGF0YS1cIiArIGF0dHJJdGVtICsgXCJdXCIpO1xuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgbmF2SXRlbXM6IGZ1bmN0aW9uKF8sICRlbCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAkJCh0aGlzLnNlbE5hdkl0ZW0sICRlbCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgfSxcblxuICAgICAgICB1cGRhdGU6IHtcblxuICAgICAgICAgICAgd3JpdGU6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIHZhciB0aGlzJDEgPSB0aGlzO1xuXG5cbiAgICAgICAgICAgICAgICBpZiAodGhpcy5uYXYgJiYgdGhpcy5sZW5ndGggIT09IHRoaXMubmF2LmNoaWxkcmVuLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICBodG1sKHRoaXMubmF2LCB0aGlzLnNsaWRlcy5tYXAoZnVuY3Rpb24gKF8sIGkpIHsgcmV0dXJuIChcIjxsaSBcIiArICh0aGlzJDEuYXR0ckl0ZW0pICsgXCI9XFxcIlwiICsgaSArIFwiXFxcIj48YSBocmVmPVxcXCIjXFxcIj48L2E+PC9saT5cIik7IH0pLmpvaW4oJycpKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB0b2dnbGVDbGFzcygkJCh0aGlzLnNlbE5hdkl0ZW0sIHRoaXMuJGVsKS5jb25jYXQodGhpcy5uYXYpLCAndWstaGlkZGVuJywgIXRoaXMubWF4SW5kZXgpO1xuXG4gICAgICAgICAgICAgICAgdGhpcy51cGRhdGVOYXYoKTtcblxuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgZXZlbnRzOiBbJ3Jlc2l6ZSddXG5cbiAgICAgICAgfSxcblxuICAgICAgICBldmVudHM6IFtcblxuICAgICAgICAgICAge1xuXG4gICAgICAgICAgICAgICAgbmFtZTogJ2NsaWNrJyxcblxuICAgICAgICAgICAgICAgIGRlbGVnYXRlOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2VsTmF2SXRlbTtcbiAgICAgICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICAgICAgaGFuZGxlcjogZnVuY3Rpb24oZSkge1xuICAgICAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2hvdyhkYXRhKGUuY3VycmVudCwgdGhpcy5hdHRySXRlbSkpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAge1xuXG4gICAgICAgICAgICAgICAgbmFtZTogJ2l0ZW1zaG93JyxcbiAgICAgICAgICAgICAgICBoYW5kbGVyOiAndXBkYXRlTmF2J1xuXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgXSxcblxuICAgICAgICBtZXRob2RzOiB7XG5cbiAgICAgICAgICAgIHVwZGF0ZU5hdjogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgdmFyIHRoaXMkMSA9IHRoaXM7XG5cblxuICAgICAgICAgICAgICAgIHZhciBpID0gdGhpcy5nZXRWYWxpZEluZGV4KCk7XG4gICAgICAgICAgICAgICAgdGhpcy5uYXZJdGVtcy5mb3JFYWNoKGZ1bmN0aW9uIChlbCkge1xuXG4gICAgICAgICAgICAgICAgICAgIHZhciBjbWQgPSBkYXRhKGVsLCB0aGlzJDEuYXR0ckl0ZW0pO1xuXG4gICAgICAgICAgICAgICAgICAgIHRvZ2dsZUNsYXNzKGVsLCB0aGlzJDEuY2xzQWN0aXZlLCB0b051bWJlcihjbWQpID09PSBpKTtcbiAgICAgICAgICAgICAgICAgICAgdG9nZ2xlQ2xhc3MoZWwsICd1ay1pbnZpc2libGUnLCB0aGlzJDEuZmluaXRlICYmIChjbWQgPT09ICdwcmV2aW91cycgJiYgaSA9PT0gMCB8fCBjbWQgPT09ICduZXh0JyAmJiBpID49IHRoaXMkMS5tYXhJbmRleCkpO1xuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgfVxuXG4gICAgfTtcblxuICAgIHZhciBTbGlkZXIgPSB7XG5cbiAgICAgICAgbWl4aW5zOiBbU2xpZGVyQXV0b3BsYXksIFNsaWRlckRyYWcsIFNsaWRlck5hdl0sXG5cbiAgICAgICAgcHJvcHM6IHtcbiAgICAgICAgICAgIGNsc0FjdGl2YXRlZDogQm9vbGVhbixcbiAgICAgICAgICAgIGVhc2luZzogU3RyaW5nLFxuICAgICAgICAgICAgaW5kZXg6IE51bWJlcixcbiAgICAgICAgICAgIGZpbml0ZTogQm9vbGVhbixcbiAgICAgICAgICAgIHZlbG9jaXR5OiBOdW1iZXJcbiAgICAgICAgfSxcblxuICAgICAgICBkYXRhOiBmdW5jdGlvbiAoKSB7IHJldHVybiAoe1xuICAgICAgICAgICAgZWFzaW5nOiAnZWFzZScsXG4gICAgICAgICAgICBmaW5pdGU6IGZhbHNlLFxuICAgICAgICAgICAgdmVsb2NpdHk6IDEsXG4gICAgICAgICAgICBpbmRleDogMCxcbiAgICAgICAgICAgIHN0YWNrOiBbXSxcbiAgICAgICAgICAgIHBlcmNlbnQ6IDAsXG4gICAgICAgICAgICBjbHNBY3RpdmU6ICd1ay1hY3RpdmUnLFxuICAgICAgICAgICAgY2xzQWN0aXZhdGVkOiBmYWxzZSxcbiAgICAgICAgICAgIFRyYW5zaXRpb25lcjogZmFsc2UsXG4gICAgICAgICAgICB0cmFuc2l0aW9uT3B0aW9uczoge31cbiAgICAgICAgfSk7IH0sXG5cbiAgICAgICAgY29tcHV0ZWQ6IHtcblxuICAgICAgICAgICAgZHVyYXRpb246IGZ1bmN0aW9uKHJlZiwgJGVsKSB7XG4gICAgICAgICAgICAgICAgdmFyIHZlbG9jaXR5ID0gcmVmLnZlbG9jaXR5O1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuIHNwZWVkVXAoJGVsLm9mZnNldFdpZHRoIC8gdmVsb2NpdHkpO1xuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgbGVuZ3RoOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5zbGlkZXMubGVuZ3RoO1xuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgbGlzdDogZnVuY3Rpb24ocmVmLCAkZWwpIHtcbiAgICAgICAgICAgICAgICB2YXIgc2VsTGlzdCA9IHJlZi5zZWxMaXN0O1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuICQoc2VsTGlzdCwgJGVsKTtcbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIG1heEluZGV4OiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5sZW5ndGggLSAxO1xuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgc2VsU2xpZGVzOiBmdW5jdGlvbihyZWYpIHtcbiAgICAgICAgICAgICAgICB2YXIgc2VsTGlzdCA9IHJlZi5zZWxMaXN0O1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuIChzZWxMaXN0ICsgXCIgPiAqXCIpO1xuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgc2xpZGVzOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdG9Ob2Rlcyh0aGlzLmxpc3QuY2hpbGRyZW4pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgIH0sXG5cbiAgICAgICAgZXZlbnRzOiB7XG5cbiAgICAgICAgICAgIGl0ZW1zaG93bjogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgdGhpcy4kdXBkYXRlKHRoaXMubGlzdCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgfSxcblxuICAgICAgICBtZXRob2RzOiB7XG5cbiAgICAgICAgICAgIHNob3c6IGZ1bmN0aW9uKGluZGV4JCQxLCBmb3JjZSkge1xuICAgICAgICAgICAgICAgIHZhciB0aGlzJDEgPSB0aGlzO1xuICAgICAgICAgICAgICAgIGlmICggZm9yY2UgPT09IHZvaWQgMCApIGZvcmNlID0gZmFsc2U7XG5cblxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmRyYWdnaW5nIHx8ICF0aGlzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgdmFyIHJlZiA9IHRoaXM7XG4gICAgICAgICAgICAgICAgdmFyIHN0YWNrID0gcmVmLnN0YWNrO1xuICAgICAgICAgICAgICAgIHZhciBxdWV1ZUluZGV4ID0gZm9yY2UgPyAwIDogc3RhY2subGVuZ3RoO1xuICAgICAgICAgICAgICAgIHZhciByZXNldCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgc3RhY2suc3BsaWNlKHF1ZXVlSW5kZXgsIDEpO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChzdGFjay5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMkMS5zaG93KHN0YWNrLnNoaWZ0KCksIHRydWUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgIHN0YWNrW2ZvcmNlID8gJ3Vuc2hpZnQnIDogJ3B1c2gnXShpbmRleCQkMSk7XG5cbiAgICAgICAgICAgICAgICBpZiAoIWZvcmNlICYmIHN0YWNrLmxlbmd0aCA+IDEpIHtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoc3RhY2subGVuZ3RoID09PSAyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl90cmFuc2l0aW9uZXIuZm9yd2FyZChNYXRoLm1pbih0aGlzLmR1cmF0aW9uLCAyMDApKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB2YXIgcHJldkluZGV4ID0gdGhpcy5pbmRleDtcbiAgICAgICAgICAgICAgICB2YXIgcHJldiA9IGhhc0NsYXNzKHRoaXMuc2xpZGVzLCB0aGlzLmNsc0FjdGl2ZSkgJiYgdGhpcy5zbGlkZXNbcHJldkluZGV4XTtcbiAgICAgICAgICAgICAgICB2YXIgbmV4dEluZGV4ID0gdGhpcy5nZXRJbmRleChpbmRleCQkMSwgdGhpcy5pbmRleCk7XG4gICAgICAgICAgICAgICAgdmFyIG5leHQgPSB0aGlzLnNsaWRlc1tuZXh0SW5kZXhdO1xuXG4gICAgICAgICAgICAgICAgaWYgKHByZXYgPT09IG5leHQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzZXQoKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHRoaXMuZGlyID0gZ2V0RGlyZWN0aW9uKGluZGV4JCQxLCBwcmV2SW5kZXgpO1xuICAgICAgICAgICAgICAgIHRoaXMucHJldkluZGV4ID0gcHJldkluZGV4O1xuICAgICAgICAgICAgICAgIHRoaXMuaW5kZXggPSBuZXh0SW5kZXg7XG5cbiAgICAgICAgICAgICAgICBwcmV2ICYmIHRyaWdnZXIocHJldiwgJ2JlZm9yZWl0ZW1oaWRlJywgW3RoaXNdKTtcbiAgICAgICAgICAgICAgICBpZiAoIXRyaWdnZXIobmV4dCwgJ2JlZm9yZWl0ZW1zaG93JywgW3RoaXMsIHByZXZdKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmluZGV4ID0gdGhpcy5wcmV2SW5kZXg7XG4gICAgICAgICAgICAgICAgICAgIHJlc2V0KCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB2YXIgcHJvbWlzZSA9IHRoaXMuX3Nob3cocHJldiwgbmV4dCwgZm9yY2UpLnRoZW4oZnVuY3Rpb24gKCkge1xuXG4gICAgICAgICAgICAgICAgICAgIHByZXYgJiYgdHJpZ2dlcihwcmV2LCAnaXRlbWhpZGRlbicsIFt0aGlzJDFdKTtcbiAgICAgICAgICAgICAgICAgICAgdHJpZ2dlcihuZXh0LCAnaXRlbXNob3duJywgW3RoaXMkMV0pO1xuXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZmFzdGRvbS53cml0ZShmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhY2suc2hpZnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RhY2subGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMkMS5zaG93KHN0YWNrLnNoaWZ0KCksIHRydWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMkMS5fdHJhbnNpdGlvbmVyID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICBwcmV2ICYmIHRyaWdnZXIocHJldiwgJ2l0ZW1oaWRlJywgW3RoaXNdKTtcbiAgICAgICAgICAgICAgICB0cmlnZ2VyKG5leHQsICdpdGVtc2hvdycsIFt0aGlzXSk7XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gcHJvbWlzZTtcblxuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgZ2V0SW5kZXg6IGZ1bmN0aW9uKGluZGV4JCQxLCBwcmV2KSB7XG4gICAgICAgICAgICAgICAgaWYgKCBpbmRleCQkMSA9PT0gdm9pZCAwICkgaW5kZXgkJDEgPSB0aGlzLmluZGV4O1xuICAgICAgICAgICAgICAgIGlmICggcHJldiA9PT0gdm9pZCAwICkgcHJldiA9IHRoaXMuaW5kZXg7XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gY2xhbXAoZ2V0SW5kZXgoaW5kZXgkJDEsIHRoaXMuc2xpZGVzLCBwcmV2LCB0aGlzLmZpbml0ZSksIDAsIHRoaXMubWF4SW5kZXgpO1xuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgZ2V0VmFsaWRJbmRleDogZnVuY3Rpb24oaW5kZXgkJDEsIHByZXZJbmRleCkge1xuICAgICAgICAgICAgICAgIGlmICggaW5kZXgkJDEgPT09IHZvaWQgMCApIGluZGV4JCQxID0gdGhpcy5pbmRleDtcbiAgICAgICAgICAgICAgICBpZiAoIHByZXZJbmRleCA9PT0gdm9pZCAwICkgcHJldkluZGV4ID0gdGhpcy5wcmV2SW5kZXg7XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5nZXRJbmRleChpbmRleCQkMSwgcHJldkluZGV4KTtcbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIF9zaG93OiBmdW5jdGlvbihwcmV2LCBuZXh0LCBmb3JjZSkge1xuXG4gICAgICAgICAgICAgICAgdGhpcy5fdHJhbnNpdGlvbmVyID0gdGhpcy5fZ2V0VHJhbnNpdGlvbmVyKFxuICAgICAgICAgICAgICAgICAgICBwcmV2LFxuICAgICAgICAgICAgICAgICAgICBuZXh0LFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmRpcixcbiAgICAgICAgICAgICAgICAgICAgYXNzaWduKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVhc2luZzogZm9yY2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IG5leHQub2Zmc2V0V2lkdGggPCA2MDBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAnY3ViaWMtYmV6aWVyKDAuMjUsIDAuNDYsIDAuNDUsIDAuOTQpJyAvKiBlYXNlT3V0UXVhZCAqL1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICdjdWJpYy1iZXppZXIoMC4xNjUsIDAuODQsIDAuNDQsIDEpJyAvKiBlYXNlT3V0UXVhcnQgKi9cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHRoaXMuZWFzaW5nXG4gICAgICAgICAgICAgICAgICAgIH0sIHRoaXMudHJhbnNpdGlvbk9wdGlvbnMpXG4gICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgIGlmICghZm9yY2UgJiYgIXByZXYpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fdHJhbnNpdGlvbmVyLnRyYW5zbGF0ZSgxKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHZhciByZWYgPSB0aGlzLnN0YWNrO1xuICAgICAgICAgICAgICAgIHZhciBsZW5ndGggPSByZWYubGVuZ3RoO1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl90cmFuc2l0aW9uZXJbbGVuZ3RoID4gMSA/ICdmb3J3YXJkJyA6ICdzaG93J10obGVuZ3RoID4gMSA/IE1hdGgubWluKHRoaXMuZHVyYXRpb24sIDc1ICsgNzUgLyAobGVuZ3RoIC0gMSkpIDogdGhpcy5kdXJhdGlvbiwgdGhpcy5wZXJjZW50KTtcblxuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgX2dldERpc3RhbmNlOiBmdW5jdGlvbihwcmV2LCBuZXh0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyB0aGlzLl9nZXRUcmFuc2l0aW9uZXIocHJldiwgcHJldiAhPT0gbmV4dCAmJiBuZXh0KS5nZXREaXN0YW5jZSgpO1xuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgX3RyYW5zbGF0ZTogZnVuY3Rpb24ocGVyY2VudCwgcHJldiwgbmV4dCkge1xuICAgICAgICAgICAgICAgIGlmICggcHJldiA9PT0gdm9pZCAwICkgcHJldiA9IHRoaXMucHJldkluZGV4O1xuICAgICAgICAgICAgICAgIGlmICggbmV4dCA9PT0gdm9pZCAwICkgbmV4dCA9IHRoaXMuaW5kZXg7XG5cbiAgICAgICAgICAgICAgICB2YXIgdHJhbnNpdGlvbmVyID0gdGhpcy5fZ2V0VHJhbnNpdGlvbmVyKHByZXYgIT09IG5leHQgPyBwcmV2IDogZmFsc2UsIG5leHQpO1xuICAgICAgICAgICAgICAgIHRyYW5zaXRpb25lci50cmFuc2xhdGUocGVyY2VudCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRyYW5zaXRpb25lcjtcbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIF9nZXRUcmFuc2l0aW9uZXI6IGZ1bmN0aW9uKHByZXYsIG5leHQsIGRpciwgb3B0aW9ucykge1xuICAgICAgICAgICAgICAgIGlmICggcHJldiA9PT0gdm9pZCAwICkgcHJldiA9IHRoaXMucHJldkluZGV4O1xuICAgICAgICAgICAgICAgIGlmICggbmV4dCA9PT0gdm9pZCAwICkgbmV4dCA9IHRoaXMuaW5kZXg7XG4gICAgICAgICAgICAgICAgaWYgKCBkaXIgPT09IHZvaWQgMCApIGRpciA9IHRoaXMuZGlyIHx8IDE7XG4gICAgICAgICAgICAgICAgaWYgKCBvcHRpb25zID09PSB2b2lkIDAgKSBvcHRpb25zID0gdGhpcy50cmFuc2l0aW9uT3B0aW9ucztcblxuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgdGhpcy5UcmFuc2l0aW9uZXIoXG4gICAgICAgICAgICAgICAgICAgIGlzTnVtYmVyKHByZXYpID8gdGhpcy5zbGlkZXNbcHJldl0gOiBwcmV2LFxuICAgICAgICAgICAgICAgICAgICBpc051bWJlcihuZXh0KSA/IHRoaXMuc2xpZGVzW25leHRdIDogbmV4dCxcbiAgICAgICAgICAgICAgICAgICAgZGlyICogKGlzUnRsID8gLTEgOiAxKSxcbiAgICAgICAgICAgICAgICAgICAgb3B0aW9uc1xuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgfVxuXG4gICAgfTtcblxuICAgIGZ1bmN0aW9uIGdldERpcmVjdGlvbihpbmRleCQkMSwgcHJldkluZGV4KSB7XG4gICAgICAgIHJldHVybiBpbmRleCQkMSA9PT0gJ25leHQnXG4gICAgICAgICAgICA/IDFcbiAgICAgICAgICAgIDogaW5kZXgkJDEgPT09ICdwcmV2aW91cydcbiAgICAgICAgICAgICAgICA/IC0xXG4gICAgICAgICAgICAgICAgOiBpbmRleCQkMSA8IHByZXZJbmRleFxuICAgICAgICAgICAgICAgICAgICA/IC0xXG4gICAgICAgICAgICAgICAgICAgIDogMTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBzcGVlZFVwKHgpIHtcbiAgICAgICAgcmV0dXJuIC41ICogeCArIDMwMDsgLy8gcGFyYWJvbGEgdGhyb3VnaCAoNDAwLDUwMDsgNjAwLDYwMDsgMTgwMCwxMjAwKVxuICAgIH1cblxuICAgIHZhciBTbGlkZXNob3cgPSB7XG5cbiAgICAgICAgbWl4aW5zOiBbU2xpZGVyXSxcblxuICAgICAgICBwcm9wczoge1xuICAgICAgICAgICAgYW5pbWF0aW9uOiBTdHJpbmdcbiAgICAgICAgfSxcblxuICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgICBhbmltYXRpb246ICdzbGlkZScsXG4gICAgICAgICAgICBjbHNBY3RpdmF0ZWQ6ICd1ay10cmFuc2l0aW9uLWFjdGl2ZScsXG4gICAgICAgICAgICBBbmltYXRpb25zOiBBbmltYXRpb25zLFxuICAgICAgICAgICAgVHJhbnNpdGlvbmVyOiBUcmFuc2l0aW9uZXJcbiAgICAgICAgfSxcblxuICAgICAgICBjb21wdXRlZDoge1xuXG4gICAgICAgICAgICBhbmltYXRpb246IGZ1bmN0aW9uKHJlZikge1xuICAgICAgICAgICAgICAgIHZhciBhbmltYXRpb24gPSByZWYuYW5pbWF0aW9uO1xuICAgICAgICAgICAgICAgIHZhciBBbmltYXRpb25zJCQxID0gcmVmLkFuaW1hdGlvbnM7XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gYXNzaWduKGFuaW1hdGlvbiBpbiBBbmltYXRpb25zJCQxID8gQW5pbWF0aW9ucyQkMVthbmltYXRpb25dIDogQW5pbWF0aW9ucyQkMS5zbGlkZSwge25hbWU6IGFuaW1hdGlvbn0pO1xuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgdHJhbnNpdGlvbk9wdGlvbnM6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB7YW5pbWF0aW9uOiB0aGlzLmFuaW1hdGlvbn07XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgfSxcblxuICAgICAgICBldmVudHM6IHtcblxuICAgICAgICAgICAgJ2l0ZW1zaG93IGl0ZW1oaWRlIGl0ZW1zaG93biBpdGVtaGlkZGVuJzogZnVuY3Rpb24ocmVmKSB7XG4gICAgICAgICAgICAgICAgdmFyIHRhcmdldCA9IHJlZi50YXJnZXQ7XG5cbiAgICAgICAgICAgICAgICB0aGlzLiR1cGRhdGUodGFyZ2V0KTtcbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIGl0ZW1zaG93OiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICBpc051bWJlcih0aGlzLnByZXZJbmRleCkgJiYgZmFzdGRvbS5mbHVzaCgpOyAvLyBpT1MgMTArIHdpbGwgaG9ub3IgdGhlIHZpZGVvLnBsYXkgb25seSBpZiBjYWxsZWQgZnJvbSBhIGdlc3R1cmUgaGFuZGxlclxuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgYmVmb3JlaXRlbXNob3c6IGZ1bmN0aW9uKHJlZikge1xuICAgICAgICAgICAgICAgIHZhciB0YXJnZXQgPSByZWYudGFyZ2V0O1xuXG4gICAgICAgICAgICAgICAgYWRkQ2xhc3ModGFyZ2V0LCB0aGlzLmNsc0FjdGl2ZSk7XG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICBpdGVtc2hvd246IGZ1bmN0aW9uKHJlZikge1xuICAgICAgICAgICAgICAgIHZhciB0YXJnZXQgPSByZWYudGFyZ2V0O1xuXG4gICAgICAgICAgICAgICAgYWRkQ2xhc3ModGFyZ2V0LCB0aGlzLmNsc0FjdGl2YXRlZCk7XG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICBpdGVtaGlkZGVuOiBmdW5jdGlvbihyZWYpIHtcbiAgICAgICAgICAgICAgICB2YXIgdGFyZ2V0ID0gcmVmLnRhcmdldDtcblxuICAgICAgICAgICAgICAgIHJlbW92ZUNsYXNzKHRhcmdldCwgdGhpcy5jbHNBY3RpdmUsIHRoaXMuY2xzQWN0aXZhdGVkKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICB9XG5cbiAgICB9O1xuXG4gICAgdmFyIExpZ2h0Ym94UGFuZWwgPSB7XG5cbiAgICAgICAgbWl4aW5zOiBbQ29udGFpbmVyLCBNb2RhbCwgVG9nZ2xhYmxlLCBTbGlkZXNob3ddLFxuXG4gICAgICAgIGZ1bmN0aW9uYWw6IHRydWUsXG5cbiAgICAgICAgcHJvcHM6IHtcbiAgICAgICAgICAgIGRlbGF5Q29udHJvbHM6IE51bWJlcixcbiAgICAgICAgICAgIHByZWxvYWQ6IE51bWJlcixcbiAgICAgICAgICAgIHZpZGVvQXV0b3BsYXk6IEJvb2xlYW4sXG4gICAgICAgICAgICB0ZW1wbGF0ZTogU3RyaW5nXG4gICAgICAgIH0sXG5cbiAgICAgICAgZGF0YTogZnVuY3Rpb24gKCkgeyByZXR1cm4gKHtcbiAgICAgICAgICAgIHByZWxvYWQ6IDEsXG4gICAgICAgICAgICB2aWRlb0F1dG9wbGF5OiBmYWxzZSxcbiAgICAgICAgICAgIGRlbGF5Q29udHJvbHM6IDMwMDAsXG4gICAgICAgICAgICBpdGVtczogW10sXG4gICAgICAgICAgICBjbHM6ICd1ay1vcGVuJyxcbiAgICAgICAgICAgIGNsc1BhZ2U6ICd1ay1saWdodGJveC1wYWdlJyxcbiAgICAgICAgICAgIHNlbExpc3Q6ICcudWstbGlnaHRib3gtaXRlbXMnLFxuICAgICAgICAgICAgYXR0ckl0ZW06ICd1ay1saWdodGJveC1pdGVtJyxcbiAgICAgICAgICAgIHNlbENsb3NlOiAnLnVrLWNsb3NlLWxhcmdlJyxcbiAgICAgICAgICAgIHBhdXNlT25Ib3ZlcjogZmFsc2UsXG4gICAgICAgICAgICB2ZWxvY2l0eTogMixcbiAgICAgICAgICAgIEFuaW1hdGlvbnM6IEFuaW1hdGlvbnMkMSxcbiAgICAgICAgICAgIHRlbXBsYXRlOiBcIjxkaXYgY2xhc3M9XFxcInVrLWxpZ2h0Ym94IHVrLW92ZXJmbG93LWhpZGRlblxcXCI+IDx1bCBjbGFzcz1cXFwidWstbGlnaHRib3gtaXRlbXNcXFwiPjwvdWw+IDxkaXYgY2xhc3M9XFxcInVrLWxpZ2h0Ym94LXRvb2xiYXIgdWstcG9zaXRpb24tdG9wIHVrLXRleHQtcmlnaHQgdWstdHJhbnNpdGlvbi1zbGlkZS10b3AgdWstdHJhbnNpdGlvbi1vcGFxdWVcXFwiPiA8YnV0dG9uIGNsYXNzPVxcXCJ1ay1saWdodGJveC10b29sYmFyLWljb24gdWstY2xvc2UtbGFyZ2VcXFwiIHR5cGU9XFxcImJ1dHRvblxcXCIgdWstY2xvc2U+PC9idXR0b24+IDwvZGl2PiA8YSBjbGFzcz1cXFwidWstbGlnaHRib3gtYnV0dG9uIHVrLXBvc2l0aW9uLWNlbnRlci1sZWZ0IHVrLXBvc2l0aW9uLW1lZGl1bSB1ay10cmFuc2l0aW9uLWZhZGVcXFwiIGhyZWY9XFxcIiNcXFwiIHVrLXNsaWRlbmF2LXByZXZpb3VzIHVrLWxpZ2h0Ym94LWl0ZW09XFxcInByZXZpb3VzXFxcIj48L2E+IDxhIGNsYXNzPVxcXCJ1ay1saWdodGJveC1idXR0b24gdWstcG9zaXRpb24tY2VudGVyLXJpZ2h0IHVrLXBvc2l0aW9uLW1lZGl1bSB1ay10cmFuc2l0aW9uLWZhZGVcXFwiIGhyZWY9XFxcIiNcXFwiIHVrLXNsaWRlbmF2LW5leHQgdWstbGlnaHRib3gtaXRlbT1cXFwibmV4dFxcXCI+PC9hPiA8ZGl2IGNsYXNzPVxcXCJ1ay1saWdodGJveC10b29sYmFyIHVrLWxpZ2h0Ym94LWNhcHRpb24gdWstcG9zaXRpb24tYm90dG9tIHVrLXRleHQtY2VudGVyIHVrLXRyYW5zaXRpb24tc2xpZGUtYm90dG9tIHVrLXRyYW5zaXRpb24tb3BhcXVlXFxcIj48L2Rpdj4gPC9kaXY+XCJcbiAgICAgICAgfSk7IH0sXG5cbiAgICAgICAgY3JlYXRlZDogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICB2YXIgdGhpcyQxID0gdGhpcztcblxuXG4gICAgICAgICAgICB0aGlzLiRtb3VudChhcHBlbmQodGhpcy5jb250YWluZXIsIHRoaXMudGVtcGxhdGUpKTtcblxuICAgICAgICAgICAgdGhpcy5jYXB0aW9uID0gJCgnLnVrLWxpZ2h0Ym94LWNhcHRpb24nLCB0aGlzLiRlbCk7XG5cbiAgICAgICAgICAgIHRoaXMuaXRlbXMuZm9yRWFjaChmdW5jdGlvbiAoKSB7IHJldHVybiBhcHBlbmQodGhpcyQxLmxpc3QsICc8bGk+PC9saT4nKTsgfSk7XG5cbiAgICAgICAgfSxcblxuICAgICAgICBldmVudHM6IFtcblxuICAgICAgICAgICAge1xuXG4gICAgICAgICAgICAgICAgbmFtZTogKHBvaW50ZXJNb3ZlICsgXCIgXCIgKyBwb2ludGVyRG93biArIFwiIGtleWRvd25cIiksXG5cbiAgICAgICAgICAgICAgICBoYW5kbGVyOiAnc2hvd0NvbnRyb2xzJ1xuXG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICB7XG5cbiAgICAgICAgICAgICAgICBuYW1lOiBwb2ludGVyVXAsXG5cbiAgICAgICAgICAgICAgICBzZWxmOiB0cnVlLFxuXG4gICAgICAgICAgICAgICAgZGVsZWdhdGU6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5zZWxTbGlkZXM7XG4gICAgICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgICAgIGhhbmRsZXI6IGZ1bmN0aW9uKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmhpZGUoKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIHtcblxuICAgICAgICAgICAgICAgIG5hbWU6ICdzaG93bicsXG5cbiAgICAgICAgICAgICAgICBzZWxmOiB0cnVlLFxuXG4gICAgICAgICAgICAgICAgaGFuZGxlcjogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc3RhcnRBdXRvcGxheSgpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNob3dDb250cm9scygpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAge1xuXG4gICAgICAgICAgICAgICAgbmFtZTogJ2hpZGUnLFxuXG4gICAgICAgICAgICAgICAgc2VsZjogdHJ1ZSxcblxuICAgICAgICAgICAgICAgIGhhbmRsZXI6IGZ1bmN0aW9uKCkge1xuXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc3RvcEF1dG9wbGF5KCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaGlkZUNvbnRyb2xzKCk7XG5cbiAgICAgICAgICAgICAgICAgICAgcmVtb3ZlQ2xhc3ModGhpcy5zbGlkZXMsIHRoaXMuY2xzQWN0aXZlKTtcbiAgICAgICAgICAgICAgICAgICAgVHJhbnNpdGlvbi5zdG9wKHRoaXMuc2xpZGVzKTtcblxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIHtcblxuICAgICAgICAgICAgICAgIG5hbWU6ICdoaWRkZW4nLFxuXG4gICAgICAgICAgICAgICAgc2VsZjogdHJ1ZSxcblxuICAgICAgICAgICAgICAgIGhhbmRsZXI6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLiRkZXN0cm95KHRydWUpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAge1xuXG4gICAgICAgICAgICAgICAgbmFtZTogJ2tleXVwJyxcblxuICAgICAgICAgICAgICAgIGVsOiBkb2N1bWVudCxcblxuICAgICAgICAgICAgICAgIGhhbmRsZXI6IGZ1bmN0aW9uKGUpIHtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMuaXNUb2dnbGVkKHRoaXMuJGVsKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChlLmtleUNvZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMzc6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zaG93KCdwcmV2aW91cycpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAzOTpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNob3coJ25leHQnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIHtcblxuICAgICAgICAgICAgICAgIG5hbWU6ICdiZWZvcmVpdGVtc2hvdycsXG5cbiAgICAgICAgICAgICAgICBoYW5kbGVyOiBmdW5jdGlvbihlKSB7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuaXNUb2dnbGVkKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZHJhZ2dhYmxlID0gZmFsc2U7XG5cbiAgICAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgICAgICAgICAgICAgICAgIHRoaXMudG9nZ2xlTm93KHRoaXMuJGVsLCB0cnVlKTtcblxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFuaW1hdGlvbiA9IEFuaW1hdGlvbnMkMVsnc2NhbGUnXTtcbiAgICAgICAgICAgICAgICAgICAgcmVtb3ZlQ2xhc3MoZS50YXJnZXQsIHRoaXMuY2xzQWN0aXZlKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zdGFjay5zcGxpY2UoMSwgMCwgdGhpcy5pbmRleCk7XG5cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIHtcblxuICAgICAgICAgICAgICAgIG5hbWU6ICdpdGVtc2hvdycsXG5cbiAgICAgICAgICAgICAgICBoYW5kbGVyOiBmdW5jdGlvbihyZWYpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHRhcmdldCA9IHJlZi50YXJnZXQ7XG5cblxuICAgICAgICAgICAgICAgICAgICB2YXIgaSA9IGluZGV4KHRhcmdldCk7XG4gICAgICAgICAgICAgICAgICAgIHZhciByZWYkMSA9IHRoaXMuZ2V0SXRlbShpKTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGNhcHRpb24gPSByZWYkMS5jYXB0aW9uO1xuXG4gICAgICAgICAgICAgICAgICAgIGNzcyh0aGlzLmNhcHRpb24sICdkaXNwbGF5JywgY2FwdGlvbiA/ICcnIDogJ25vbmUnKTtcbiAgICAgICAgICAgICAgICAgICAgaHRtbCh0aGlzLmNhcHRpb24sIGNhcHRpb24pO1xuXG4gICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGogPSAwOyBqIDw9IHRoaXMucHJlbG9hZDsgaisrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvYWRJdGVtKHRoaXMuZ2V0SW5kZXgoaSArIGopKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG9hZEl0ZW0odGhpcy5nZXRJbmRleChpIC0gaikpO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIHtcblxuICAgICAgICAgICAgICAgIG5hbWU6ICdpdGVtc2hvd24nLFxuXG4gICAgICAgICAgICAgICAgaGFuZGxlcjogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZHJhZ2dhYmxlID0gdGhpcy4kcHJvcHMuZHJhZ2dhYmxlO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAge1xuXG4gICAgICAgICAgICAgICAgbmFtZTogJ2l0ZW1sb2FkJyxcblxuICAgICAgICAgICAgICAgIGhhbmRsZXI6IGZ1bmN0aW9uKF8sIGl0ZW0pIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHRoaXMkMSA9IHRoaXM7XG5cblxuICAgICAgICAgICAgICAgICAgICB2YXIgc291cmNlID0gaXRlbS5zb3VyY2U7XG4gICAgICAgICAgICAgICAgICAgIHZhciB0eXBlID0gaXRlbS50eXBlO1xuICAgICAgICAgICAgICAgICAgICB2YXIgYWx0ID0gaXRlbS5hbHQ7XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRJdGVtKGl0ZW0sICc8c3BhbiB1ay1zcGlubmVyPjwvc3Bhbj4nKTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoIXNvdXJjZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgdmFyIG1hdGNoZXMkJDE7XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gSW1hZ2VcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGUgPT09ICdpbWFnZScgfHwgc291cmNlLm1hdGNoKC9cXC4oanAoZSk/Z3xwbmd8Z2lmfHN2ZykoJHxcXD8pL2kpKSB7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGdldEltYWdlKHNvdXJjZSkudGhlbihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAoaW1nKSB7IHJldHVybiB0aGlzJDEuc2V0SXRlbShpdGVtLCAoXCI8aW1nIHdpZHRoPVxcXCJcIiArIChpbWcud2lkdGgpICsgXCJcXFwiIGhlaWdodD1cXFwiXCIgKyAoaW1nLmhlaWdodCkgKyBcIlxcXCIgc3JjPVxcXCJcIiArIHNvdXJjZSArIFwiXFxcIiBhbHQ9XFxcIlwiICsgKGFsdCA/IGFsdCA6ICcnKSArIFwiXFxcIj5cIikpOyB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXMkMS5zZXRFcnJvcihpdGVtKTsgfVxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVmlkZW9cbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlID09PSAndmlkZW8nIHx8IHNvdXJjZS5tYXRjaCgvXFwuKG1wNHx3ZWJtfG9ndikoJHxcXD8pL2kpKSB7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB2aWRlbyA9ICQoKFwiPHZpZGVvIGNvbnRyb2xzIHBsYXlzaW5saW5lXCIgKyAoaXRlbS5wb3N0ZXIgPyAoXCIgcG9zdGVyPVxcXCJcIiArIChpdGVtLnBvc3RlcikgKyBcIlxcXCJcIikgOiAnJykgKyBcIiB1ay12aWRlbz1cXFwiXCIgKyAodGhpcy52aWRlb0F1dG9wbGF5KSArIFwiXFxcIj48L3ZpZGVvPlwiKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBhdHRyKHZpZGVvLCAnc3JjJywgc291cmNlKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgb25jZSh2aWRlbywgJ2Vycm9yIGxvYWRlZG1ldGFkYXRhJywgZnVuY3Rpb24gKHR5cGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZSA9PT0gJ2Vycm9yJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzJDEuc2V0RXJyb3IoaXRlbSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cih2aWRlbywge3dpZHRoOiB2aWRlby52aWRlb1dpZHRoLCBoZWlnaHQ6IHZpZGVvLnZpZGVvSGVpZ2h0fSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMkMS5zZXRJdGVtKGl0ZW0sIHZpZGVvKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWZyYW1lXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ2lmcmFtZScgfHwgc291cmNlLm1hdGNoKC9cXC4oaHRtbHxwaHApKCR8XFw/KS9pKSkge1xuXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNldEl0ZW0oaXRlbSwgKFwiPGlmcmFtZSBjbGFzcz1cXFwidWstbGlnaHRib3gtaWZyYW1lXFxcIiBzcmM9XFxcIlwiICsgc291cmNlICsgXCJcXFwiIGZyYW1lYm9yZGVyPVxcXCIwXFxcIiBhbGxvd2Z1bGxzY3JlZW4+PC9pZnJhbWU+XCIpKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gWW91VHViZVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKChtYXRjaGVzJCQxID0gc291cmNlLm1hdGNoKC9cXC9cXC8uKj95b3V0dWJlKC1ub2Nvb2tpZSk/XFwuW2Etel0rXFwvd2F0Y2hcXD92PShbXiZcXHNdKykvKSB8fCBzb3VyY2UubWF0Y2goLygpeW91dHVcXC5iZVxcLyguKikvKSkpIHtcblxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGlkID0gbWF0Y2hlcyQkMVsyXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzZXRJZnJhbWUgPSBmdW5jdGlvbiAod2lkdGgkJDEsIGhlaWdodCQkMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggd2lkdGgkJDEgPT09IHZvaWQgMCApIHdpZHRoJCQxID0gNjQwO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggaGVpZ2h0JCQxID09PSB2b2lkIDAgKSBoZWlnaHQkJDEgPSA0NTA7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcyQxLnNldEl0ZW0oaXRlbSwgZ2V0SWZyYW1lKChcImh0dHBzOi8vd3d3LnlvdXR1YmVcIiArIChtYXRjaGVzJCQxWzFdIHx8ICcnKSArIFwiLmNvbS9lbWJlZC9cIiArIGlkKSwgd2lkdGgkJDEsIGhlaWdodCQkMSwgdGhpcyQxLnZpZGVvQXV0b3BsYXkpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGdldEltYWdlKChcImh0dHBzOi8vaW1nLnlvdXR1YmUuY29tL3ZpL1wiICsgaWQgKyBcIi9tYXhyZXNkZWZhdWx0LmpwZ1wiKSkudGhlbihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAocmVmKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB3aWR0aCQkMSA9IHJlZi53aWR0aDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGhlaWdodCQkMSA9IHJlZi5oZWlnaHQ7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gWW91VHViZSBkZWZhdWx0IDQwNCB0aHVtYiwgZmFsbCBiYWNrIHRvIGxvdyByZXNvbHV0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh3aWR0aCQkMSA9PT0gMTIwICYmIGhlaWdodCQkMSA9PT0gOTApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldEltYWdlKChcImh0dHBzOi8vaW1nLnlvdXR1YmUuY29tL3ZpL1wiICsgaWQgKyBcIi8wLmpwZ1wiKSkudGhlbihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAocmVmKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB3aWR0aCQkMSA9IHJlZi53aWR0aDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGhlaWdodCQkMSA9IHJlZi5oZWlnaHQ7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNldElmcmFtZSh3aWR0aCQkMSwgaGVpZ2h0JCQxKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0SWZyYW1lXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0SWZyYW1lKHdpZHRoJCQxLCBoZWlnaHQkJDEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRJZnJhbWVcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFZpbWVvXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoKG1hdGNoZXMkJDEgPSBzb3VyY2UubWF0Y2goLyhcXC9cXC8uKj8pdmltZW9cXC5bYS16XStcXC8oWzAtOV0rKS4qPy8pKSkge1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBhamF4KChcImh0dHBzOi8vdmltZW8uY29tL2FwaS9vZW1iZWQuanNvbj9tYXh3aWR0aD0xOTIwJnVybD1cIiArIChlbmNvZGVVUkkoc291cmNlKSkpLCB7cmVzcG9uc2VUeXBlOiAnanNvbicsIHdpdGhDcmVkZW50aWFsczogZmFsc2V9KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC50aGVuKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAocmVmKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcmVmX3Jlc3BvbnNlID0gcmVmLnJlc3BvbnNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGhlaWdodCQkMSA9IHJlZl9yZXNwb25zZS5oZWlnaHQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgd2lkdGgkJDEgPSByZWZfcmVzcG9uc2Uud2lkdGg7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzJDEuc2V0SXRlbShpdGVtLCBnZXRJZnJhbWUoKFwiaHR0cHM6Ly9wbGF5ZXIudmltZW8uY29tL3ZpZGVvL1wiICsgKG1hdGNoZXMkJDFbMl0pKSwgd2lkdGgkJDEsIGhlaWdodCQkMSwgdGhpcyQxLnZpZGVvQXV0b3BsYXkpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXMkMS5zZXRFcnJvcihpdGVtKTsgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgXSxcblxuICAgICAgICBtZXRob2RzOiB7XG5cbiAgICAgICAgICAgIGxvYWRJdGVtOiBmdW5jdGlvbihpbmRleCQkMSkge1xuICAgICAgICAgICAgICAgIGlmICggaW5kZXgkJDEgPT09IHZvaWQgMCApIGluZGV4JCQxID0gdGhpcy5pbmRleDtcblxuXG4gICAgICAgICAgICAgICAgdmFyIGl0ZW0gPSB0aGlzLmdldEl0ZW0oaW5kZXgkJDEpO1xuXG4gICAgICAgICAgICAgICAgaWYgKGl0ZW0uY29udGVudCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgdHJpZ2dlcih0aGlzLiRlbCwgJ2l0ZW1sb2FkJywgW2l0ZW1dKTtcbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIGdldEl0ZW06IGZ1bmN0aW9uKGluZGV4JCQxKSB7XG4gICAgICAgICAgICAgICAgaWYgKCBpbmRleCQkMSA9PT0gdm9pZCAwICkgaW5kZXgkJDEgPSB0aGlzLmluZGV4O1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuaXRlbXNbaW5kZXgkJDFdIHx8IHt9O1xuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgc2V0SXRlbTogZnVuY3Rpb24oaXRlbSwgY29udGVudCkge1xuICAgICAgICAgICAgICAgIGFzc2lnbihpdGVtLCB7Y29udGVudDogY29udGVudH0pO1xuICAgICAgICAgICAgICAgIHZhciBlbCA9IGh0bWwodGhpcy5zbGlkZXNbdGhpcy5pdGVtcy5pbmRleE9mKGl0ZW0pXSwgY29udGVudCk7XG4gICAgICAgICAgICAgICAgdHJpZ2dlcih0aGlzLiRlbCwgJ2l0ZW1sb2FkZWQnLCBbdGhpcywgZWxdKTtcbiAgICAgICAgICAgICAgICB0aGlzLiR1cGRhdGUoZWwpO1xuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgc2V0RXJyb3I6IGZ1bmN0aW9uKGl0ZW0pIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNldEl0ZW0oaXRlbSwgJzxzcGFuIHVrLWljb249XCJpY29uOiBib2x0OyByYXRpbzogMlwiPjwvc3Bhbj4nKTtcbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIHNob3dDb250cm9sczogZnVuY3Rpb24oKSB7XG5cbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5jb250cm9sc1RpbWVyKTtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRyb2xzVGltZXIgPSBzZXRUaW1lb3V0KHRoaXMuaGlkZUNvbnRyb2xzLCB0aGlzLmRlbGF5Q29udHJvbHMpO1xuXG4gICAgICAgICAgICAgICAgYWRkQ2xhc3ModGhpcy4kZWwsICd1ay1hY3RpdmUnLCAndWstdHJhbnNpdGlvbi1hY3RpdmUnKTtcblxuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgaGlkZUNvbnRyb2xzOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICByZW1vdmVDbGFzcyh0aGlzLiRlbCwgJ3VrLWFjdGl2ZScsICd1ay10cmFuc2l0aW9uLWFjdGl2ZScpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgIH1cblxuICAgIH07XG5cbiAgICBmdW5jdGlvbiBnZXRJZnJhbWUoc3JjLCB3aWR0aCQkMSwgaGVpZ2h0JCQxLCBhdXRvcGxheSkge1xuICAgICAgICByZXR1cm4gKFwiPGlmcmFtZSBzcmM9XFxcIlwiICsgc3JjICsgXCJcXFwiIHdpZHRoPVxcXCJcIiArIHdpZHRoJCQxICsgXCJcXFwiIGhlaWdodD1cXFwiXCIgKyBoZWlnaHQkJDEgKyBcIlxcXCIgc3R5bGU9XFxcIm1heC13aWR0aDogMTAwJTsgYm94LXNpemluZzogYm9yZGVyLWJveDtcXFwiIGZyYW1lYm9yZGVyPVxcXCIwXFxcIiBhbGxvd2Z1bGxzY3JlZW4gdWstdmlkZW89XFxcImF1dG9wbGF5OiBcIiArIGF1dG9wbGF5ICsgXCJcXFwiIHVrLXJlc3BvbnNpdmU+PC9pZnJhbWU+XCIpO1xuICAgIH1cblxuICAgIHZhciBMaWdodGJveCA9IHtcblxuICAgICAgICBpbnN0YWxsOiBpbnN0YWxsJDIsXG5cbiAgICAgICAgcHJvcHM6IHt0b2dnbGU6IFN0cmluZ30sXG5cbiAgICAgICAgZGF0YToge3RvZ2dsZTogJ2EnfSxcblxuICAgICAgICBjb21wdXRlZDoge1xuXG4gICAgICAgICAgICB0b2dnbGVzOiB7XG5cbiAgICAgICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uKHJlZiwgJGVsKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciB0b2dnbGUgPSByZWYudG9nZ2xlO1xuXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAkJCh0b2dnbGUsICRlbCk7XG4gICAgICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgICAgIHdhdGNoOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5oaWRlKCk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgfSxcblxuICAgICAgICBkaXNjb25uZWN0ZWQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgdGhpcy5oaWRlKCk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgZXZlbnRzOiBbXG5cbiAgICAgICAgICAgIHtcblxuICAgICAgICAgICAgICAgIG5hbWU6ICdjbGljaycsXG5cbiAgICAgICAgICAgICAgICBkZWxlZ2F0ZTogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAoKHRoaXMudG9nZ2xlKSArIFwiOm5vdCgudWstZGlzYWJsZWQpXCIpO1xuICAgICAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgICAgICBoYW5kbGVyOiBmdW5jdGlvbihlKSB7XG4gICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zaG93KGluZGV4KHRoaXMudG9nZ2xlcywgZS5jdXJyZW50KSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgXSxcblxuICAgICAgICBtZXRob2RzOiB7XG5cbiAgICAgICAgICAgIHNob3c6IGZ1bmN0aW9uKGluZGV4JCQxKSB7XG4gICAgICAgICAgICAgICAgdmFyIHRoaXMkMSA9IHRoaXM7XG5cblxuICAgICAgICAgICAgICAgIHRoaXMucGFuZWwgPSB0aGlzLnBhbmVsIHx8IHRoaXMuJGNyZWF0ZSgnbGlnaHRib3hQYW5lbCcsIGFzc2lnbih7fSwgdGhpcy4kcHJvcHMsIHtcbiAgICAgICAgICAgICAgICAgICAgaXRlbXM6IHRoaXMudG9nZ2xlcy5yZWR1Y2UoZnVuY3Rpb24gKGl0ZW1zLCBlbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaXRlbXMucHVzaChbJ2hyZWYnLCAnY2FwdGlvbicsICd0eXBlJywgJ3Bvc3RlcicsICdhbHQnXS5yZWR1Y2UoZnVuY3Rpb24gKG9iaiwgYXR0ciQkMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9ialthdHRyJCQxID09PSAnaHJlZicgPyAnc291cmNlJyA6IGF0dHIkJDFdID0gZGF0YShlbCwgYXR0ciQkMSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9iajtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sIHt9KSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaXRlbXM7XG4gICAgICAgICAgICAgICAgICAgIH0sIFtdKVxuICAgICAgICAgICAgICAgIH0pKTtcblxuICAgICAgICAgICAgICAgIG9uKHRoaXMucGFuZWwuJGVsLCAnaGlkZGVuJywgZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpcyQxLnBhbmVsID0gZmFsc2U7IH0pO1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnBhbmVsLnNob3coaW5kZXgkJDEpO1xuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgaGlkZTogZnVuY3Rpb24oKSB7XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5wYW5lbCAmJiB0aGlzLnBhbmVsLmhpZGUoKTtcblxuICAgICAgICAgICAgfVxuXG4gICAgICAgIH1cblxuICAgIH07XG5cbiAgICBmdW5jdGlvbiBpbnN0YWxsJDIoVUlraXQsIExpZ2h0Ym94KSB7XG5cbiAgICAgICAgaWYgKCFVSWtpdC5saWdodGJveFBhbmVsKSB7XG4gICAgICAgICAgICBVSWtpdC5jb21wb25lbnQoJ2xpZ2h0Ym94UGFuZWwnLCBMaWdodGJveFBhbmVsKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGFzc2lnbihcbiAgICAgICAgICAgIExpZ2h0Ym94LnByb3BzLFxuICAgICAgICAgICAgVUlraXQuY29tcG9uZW50KCdsaWdodGJveFBhbmVsJykub3B0aW9ucy5wcm9wc1xuICAgICAgICApO1xuXG4gICAgfVxuXG4gICAgdmFyIG9iajtcblxuICAgIHZhciBjb250YWluZXJzID0ge307XG5cbiAgICB2YXIgTm90aWZpY2F0aW9uID0ge1xuXG4gICAgICAgIGZ1bmN0aW9uYWw6IHRydWUsXG5cbiAgICAgICAgYXJnczogWydtZXNzYWdlJywgJ3N0YXR1cyddLFxuXG4gICAgICAgIGRhdGE6IHtcbiAgICAgICAgICAgIG1lc3NhZ2U6ICcnLFxuICAgICAgICAgICAgc3RhdHVzOiAnJyxcbiAgICAgICAgICAgIHRpbWVvdXQ6IDUwMDAsXG4gICAgICAgICAgICBncm91cDogbnVsbCxcbiAgICAgICAgICAgIHBvczogJ3RvcC1jZW50ZXInLFxuICAgICAgICAgICAgY2xzQ2xvc2U6ICd1ay1ub3RpZmljYXRpb24tY2xvc2UnLFxuICAgICAgICAgICAgY2xzTXNnOiAndWstbm90aWZpY2F0aW9uLW1lc3NhZ2UnXG4gICAgICAgIH0sXG5cbiAgICAgICAgaW5zdGFsbDogaW5zdGFsbCQzLFxuXG4gICAgICAgIGNvbXB1dGVkOiB7XG5cbiAgICAgICAgICAgIG1hcmdpblByb3A6IGZ1bmN0aW9uKHJlZikge1xuICAgICAgICAgICAgICAgIHZhciBwb3MgPSByZWYucG9zO1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuIChcIm1hcmdpblwiICsgKHN0YXJ0c1dpdGgocG9zLCAndG9wJykgPyAnVG9wJyA6ICdCb3R0b20nKSk7XG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICBzdGFydFByb3BzOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICB2YXIgb2JqO1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuICggb2JqID0ge29wYWNpdHk6IDB9LCBvYmpbdGhpcy5tYXJnaW5Qcm9wXSA9IC10aGlzLiRlbC5vZmZzZXRIZWlnaHQsIG9iaiApO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgIH0sXG5cbiAgICAgICAgY3JlYXRlZDogZnVuY3Rpb24oKSB7XG5cbiAgICAgICAgICAgIGlmICghY29udGFpbmVyc1t0aGlzLnBvc10pIHtcbiAgICAgICAgICAgICAgICBjb250YWluZXJzW3RoaXMucG9zXSA9IGFwcGVuZCh0aGlzLiRjb250YWluZXIsIChcIjxkaXYgY2xhc3M9XFxcInVrLW5vdGlmaWNhdGlvbiB1ay1ub3RpZmljYXRpb24tXCIgKyAodGhpcy5wb3MpICsgXCJcXFwiPjwvZGl2PlwiKSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHZhciBjb250YWluZXIgPSBjc3MoY29udGFpbmVyc1t0aGlzLnBvc10sICdkaXNwbGF5JywgJ2Jsb2NrJyk7XG5cbiAgICAgICAgICAgIHRoaXMuJG1vdW50KGFwcGVuZChjb250YWluZXIsXG4gICAgICAgICAgICAgICAgKFwiPGRpdiBjbGFzcz1cXFwiXCIgKyAodGhpcy5jbHNNc2cpICsgKHRoaXMuc3RhdHVzID8gKFwiIFwiICsgKHRoaXMuY2xzTXNnKSArIFwiLVwiICsgKHRoaXMuc3RhdHVzKSkgOiAnJykgKyBcIlxcXCI+IDxhIGhyZWY9XFxcIiNcXFwiIGNsYXNzPVxcXCJcIiArICh0aGlzLmNsc0Nsb3NlKSArIFwiXFxcIiBkYXRhLXVrLWNsb3NlPjwvYT4gPGRpdj5cIiArICh0aGlzLm1lc3NhZ2UpICsgXCI8L2Rpdj4gPC9kaXY+XCIpXG4gICAgICAgICAgICApKTtcblxuICAgICAgICB9LFxuXG4gICAgICAgIGNvbm5lY3RlZDogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICB2YXIgdGhpcyQxID0gdGhpcztcbiAgICAgICAgICAgIHZhciBvYmo7XG5cblxuICAgICAgICAgICAgdmFyIG1hcmdpbiA9IHRvRmxvYXQoY3NzKHRoaXMuJGVsLCB0aGlzLm1hcmdpblByb3ApKTtcbiAgICAgICAgICAgIFRyYW5zaXRpb24uc3RhcnQoXG4gICAgICAgICAgICAgICAgY3NzKHRoaXMuJGVsLCB0aGlzLnN0YXJ0UHJvcHMpLFxuICAgICAgICAgICAgICAgICggb2JqID0ge29wYWNpdHk6IDF9LCBvYmpbdGhpcy5tYXJnaW5Qcm9wXSA9IG1hcmdpbiwgb2JqIClcbiAgICAgICAgICAgICkudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMkMS50aW1lb3V0KSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMkMS50aW1lciA9IHNldFRpbWVvdXQodGhpcyQxLmNsb3NlLCB0aGlzJDEudGltZW91dCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgfSxcblxuICAgICAgICBldmVudHM6ICggb2JqID0ge1xuXG4gICAgICAgICAgICBjbGljazogZnVuY3Rpb24oZSkge1xuICAgICAgICAgICAgICAgIGlmIChjbG9zZXN0KGUudGFyZ2V0LCAnYVtocmVmPVwiI1wiXSxhW2hyZWY9XCJcIl0nKSkge1xuICAgICAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuY2xvc2UoKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICB9LCBvYmpbcG9pbnRlckVudGVyXSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy50aW1lcikge1xuICAgICAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQodGhpcy50aW1lcik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSwgb2JqW3BvaW50ZXJMZWF2ZV0gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMudGltZW91dCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnRpbWVyID0gc2V0VGltZW91dCh0aGlzLmNsb3NlLCB0aGlzLnRpbWVvdXQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sIG9iaiApLFxuXG4gICAgICAgIG1ldGhvZHM6IHtcblxuICAgICAgICAgICAgY2xvc2U6IGZ1bmN0aW9uKGltbWVkaWF0ZSkge1xuICAgICAgICAgICAgICAgIHZhciB0aGlzJDEgPSB0aGlzO1xuXG5cbiAgICAgICAgICAgICAgICB2YXIgcmVtb3ZlRm4gPSBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgICAgICAgICAgICAgdHJpZ2dlcih0aGlzJDEuJGVsLCAnY2xvc2UnLCBbdGhpcyQxXSk7XG4gICAgICAgICAgICAgICAgICAgIHJlbW92ZSh0aGlzJDEuJGVsKTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoIWNvbnRhaW5lcnNbdGhpcyQxLnBvc10uY2hpbGRyZW4ubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjc3MoY29udGFpbmVyc1t0aGlzJDEucG9zXSwgJ2Rpc3BsYXknLCAnbm9uZScpO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMudGltZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMudGltZXIpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChpbW1lZGlhdGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVtb3ZlRm4oKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBUcmFuc2l0aW9uLnN0YXJ0KHRoaXMuJGVsLCB0aGlzLnN0YXJ0UHJvcHMpLnRoZW4ocmVtb3ZlRm4pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICB9XG5cbiAgICB9O1xuXG4gICAgZnVuY3Rpb24gaW5zdGFsbCQzKFVJa2l0KSB7XG4gICAgICAgIFVJa2l0Lm5vdGlmaWNhdGlvbi5jbG9zZUFsbCA9IGZ1bmN0aW9uIChncm91cCwgaW1tZWRpYXRlKSB7XG4gICAgICAgICAgICBhcHBseShkb2N1bWVudC5ib2R5LCBmdW5jdGlvbiAoZWwpIHtcbiAgICAgICAgICAgICAgICB2YXIgbm90aWZpY2F0aW9uID0gVUlraXQuZ2V0Q29tcG9uZW50KGVsLCAnbm90aWZpY2F0aW9uJyk7XG4gICAgICAgICAgICAgICAgaWYgKG5vdGlmaWNhdGlvbiAmJiAoIWdyb3VwIHx8IGdyb3VwID09PSBub3RpZmljYXRpb24uZ3JvdXApKSB7XG4gICAgICAgICAgICAgICAgICAgIG5vdGlmaWNhdGlvbi5jbG9zZShpbW1lZGlhdGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIHZhciBwcm9wcyA9IFsneCcsICd5JywgJ2JneCcsICdiZ3knLCAncm90YXRlJywgJ3NjYWxlJywgJ2NvbG9yJywgJ2JhY2tncm91bmRDb2xvcicsICdib3JkZXJDb2xvcicsICdvcGFjaXR5JywgJ2JsdXInLCAnaHVlJywgJ2dyYXlzY2FsZScsICdpbnZlcnQnLCAnc2F0dXJhdGUnLCAnc2VwaWEnLCAnZm9wYWNpdHknXTtcblxuICAgIHZhciBQYXJhbGxheCA9IHtcblxuICAgICAgICBtaXhpbnM6IFtNZWRpYV0sXG5cbiAgICAgICAgcHJvcHM6IHByb3BzLnJlZHVjZShmdW5jdGlvbiAocHJvcHMsIHByb3ApIHtcbiAgICAgICAgICAgIHByb3BzW3Byb3BdID0gJ2xpc3QnO1xuICAgICAgICAgICAgcmV0dXJuIHByb3BzO1xuICAgICAgICB9LCB7fSksXG5cbiAgICAgICAgZGF0YTogcHJvcHMucmVkdWNlKGZ1bmN0aW9uIChkYXRhJCQxLCBwcm9wKSB7XG4gICAgICAgICAgICBkYXRhJCQxW3Byb3BdID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgcmV0dXJuIGRhdGEkJDE7XG4gICAgICAgIH0sIHt9KSxcblxuICAgICAgICBjb21wdXRlZDoge1xuXG4gICAgICAgICAgICBwcm9wczogZnVuY3Rpb24ocHJvcGVydGllcywgJGVsKSB7XG4gICAgICAgICAgICAgICAgdmFyIHRoaXMkMSA9IHRoaXM7XG5cblxuICAgICAgICAgICAgICAgIHJldHVybiBwcm9wcy5yZWR1Y2UoZnVuY3Rpb24gKHByb3BzLCBwcm9wKSB7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKGlzVW5kZWZpbmVkKHByb3BlcnRpZXNbcHJvcF0pKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcHJvcHM7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICB2YXIgaXNDb2xvciA9IHByb3AubWF0Y2goL2NvbG9yL2kpO1xuICAgICAgICAgICAgICAgICAgICB2YXIgaXNDc3NQcm9wID0gaXNDb2xvciB8fCBwcm9wID09PSAnb3BhY2l0eSc7XG5cbiAgICAgICAgICAgICAgICAgICAgdmFyIHBvcywgYmdQb3MsIGRpZmY7XG4gICAgICAgICAgICAgICAgICAgIHZhciBzdGVwcyA9IHByb3BlcnRpZXNbcHJvcF0uc2xpY2UoMCk7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKGlzQ3NzUHJvcCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY3NzKCRlbCwgcHJvcCwgJycpO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHN0ZXBzLmxlbmd0aCA8IDIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXBzLnVuc2hpZnQoKHByb3AgPT09ICdzY2FsZSdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IDFcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGlzQ3NzUHJvcFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IGNzcygkZWwsIHByb3ApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogMCkgfHwgMCk7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICB2YXIgdW5pdCA9IGluY2x1ZGVzKHN0ZXBzLmpvaW4oJycpLCAnJScpID8gJyUnIDogJ3B4JztcblxuICAgICAgICAgICAgICAgICAgICBpZiAoaXNDb2xvcikge1xuXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgcmVmID0gJGVsLnN0eWxlO1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNvbG9yID0gcmVmLmNvbG9yO1xuICAgICAgICAgICAgICAgICAgICAgICAgc3RlcHMgPSBzdGVwcy5tYXAoZnVuY3Rpb24gKHN0ZXApIHsgcmV0dXJuIHBhcnNlQ29sb3IoJGVsLCBzdGVwKTsgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAkZWwuc3R5bGUuY29sb3IgPSBjb2xvcjtcblxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBzdGVwcyA9IHN0ZXBzLm1hcCh0b0Zsb2F0KTtcblxuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHByb3AubWF0Y2goL15iZy8pKSB7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNzcygkZWwsIChcImJhY2tncm91bmQtcG9zaXRpb24tXCIgKyAocHJvcFsyXSkpLCAnJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBiZ1BvcyA9IGNzcygkZWwsICdiYWNrZ3JvdW5kUG9zaXRpb24nKS5zcGxpdCgnICcpW3Byb3BbMl0gPT09ICd4JyA/IDAgOiAxXTsgLy8gSUUgMTEgY2FuJ3QgcmVhZCBiYWNrZ3JvdW5kLXBvc2l0aW9uLVt4fHldXG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzJDEuY292ZXJzKSB7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbWluID0gTWF0aC5taW4uYXBwbHkoTWF0aCwgc3RlcHMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBtYXggPSBNYXRoLm1heC5hcHBseShNYXRoLCBzdGVwcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGRvd24gPSBzdGVwcy5pbmRleE9mKG1pbikgPCBzdGVwcy5pbmRleE9mKG1heCk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWZmID0gbWF4IC0gbWluO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RlcHMgPSBzdGVwcy5tYXAoZnVuY3Rpb24gKHN0ZXApIHsgcmV0dXJuIHN0ZXAgLSAoZG93biA/IG1pbiA6IG1heCk7IH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcyA9IChkb3duID8gLWRpZmYgOiAwKSArIFwicHhcIjtcblxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcyA9IGJnUG9zO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBwcm9wc1twcm9wXSA9IHtzdGVwczogc3RlcHMsIHVuaXQ6IHVuaXQsIHBvczogcG9zLCBiZ1BvczogYmdQb3MsIGRpZmY6IGRpZmZ9O1xuXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBwcm9wcztcblxuICAgICAgICAgICAgICAgIH0sIHt9KTtcblxuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgYmdQcm9wczogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgdmFyIHRoaXMkMSA9IHRoaXM7XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gWydiZ3gnLCAnYmd5J10uZmlsdGVyKGZ1bmN0aW9uIChiZykgeyByZXR1cm4gYmcgaW4gdGhpcyQxLnByb3BzOyB9KTtcbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIGNvdmVyczogZnVuY3Rpb24oXywgJGVsKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNvdmVycygkZWwpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgIH0sXG5cbiAgICAgICAgZGlzY29ubmVjdGVkOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLl9pbWFnZTtcbiAgICAgICAgfSxcblxuICAgICAgICB1cGRhdGU6IHtcblxuICAgICAgICAgICAgcmVhZDogZnVuY3Rpb24oZGF0YSQkMSkge1xuICAgICAgICAgICAgICAgIHZhciB0aGlzJDEgPSB0aGlzO1xuXG5cbiAgICAgICAgICAgICAgICBkYXRhJCQxLmFjdGl2ZSA9IHRoaXMubWF0Y2hNZWRpYTtcblxuICAgICAgICAgICAgICAgIGlmICghZGF0YSQkMS5hY3RpdmUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmICghZGF0YSQkMS5pbWFnZSAmJiB0aGlzLmNvdmVycyAmJiB0aGlzLmJnUHJvcHMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBzcmMgPSBjc3ModGhpcy4kZWwsICdiYWNrZ3JvdW5kSW1hZ2UnKS5yZXBsYWNlKC9ebm9uZXx1cmxcXChbXCInXT8oLis/KVtcIiddP1xcKSQvLCAnJDEnKTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoc3JjKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgaW1nID0gbmV3IEltYWdlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpbWcuc3JjID0gc3JjO1xuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSQkMS5pbWFnZSA9IGltZztcblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpbWcubmF0dXJhbFdpZHRoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1nLm9ubG9hZCA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXMkMS4kZW1pdCgpOyB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB2YXIgaW1hZ2UgPSBkYXRhJCQxLmltYWdlO1xuXG4gICAgICAgICAgICAgICAgaWYgKCFpbWFnZSB8fCAhaW1hZ2UubmF0dXJhbFdpZHRoKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB2YXIgZGltRWwgPSB7XG4gICAgICAgICAgICAgICAgICAgIHdpZHRoOiB0aGlzLiRlbC5vZmZzZXRXaWR0aCxcbiAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiB0aGlzLiRlbC5vZmZzZXRIZWlnaHRcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIHZhciBkaW1JbWFnZSA9IHtcbiAgICAgICAgICAgICAgICAgICAgd2lkdGg6IGltYWdlLm5hdHVyYWxXaWR0aCxcbiAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiBpbWFnZS5uYXR1cmFsSGVpZ2h0XG4gICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgIHZhciBkaW0gPSBEaW1lbnNpb25zLmNvdmVyKGRpbUltYWdlLCBkaW1FbCk7XG5cbiAgICAgICAgICAgICAgICB0aGlzLmJnUHJvcHMuZm9yRWFjaChmdW5jdGlvbiAocHJvcCkge1xuXG4gICAgICAgICAgICAgICAgICAgIHZhciByZWYgPSB0aGlzJDEucHJvcHNbcHJvcF07XG4gICAgICAgICAgICAgICAgICAgIHZhciBkaWZmID0gcmVmLmRpZmY7XG4gICAgICAgICAgICAgICAgICAgIHZhciBiZ1BvcyA9IHJlZi5iZ1BvcztcbiAgICAgICAgICAgICAgICAgICAgdmFyIHN0ZXBzID0gcmVmLnN0ZXBzO1xuICAgICAgICAgICAgICAgICAgICB2YXIgYXR0ciQkMSA9IHByb3AgPT09ICdiZ3knID8gJ2hlaWdodCcgOiAnd2lkdGgnO1xuICAgICAgICAgICAgICAgICAgICB2YXIgc3BhbiA9IGRpbVthdHRyJCQxXSAtIGRpbUVsW2F0dHIkJDFdO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmICghYmdQb3MubWF0Y2goLyUkfDBweC8pKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBpZiAoc3BhbiA8IGRpZmYpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRpbUVsW2F0dHIkJDFdID0gZGltW2F0dHIkJDFdICsgZGlmZiAtIHNwYW47XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3BhbiA+IGRpZmYpIHtcblxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGJnUG9zRmxvYXQgPSBwYXJzZUZsb2F0KGJnUG9zKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJnUG9zRmxvYXQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzJDEucHJvcHNbcHJvcF0uc3RlcHMgPSBzdGVwcy5tYXAoZnVuY3Rpb24gKHN0ZXApIHsgcmV0dXJuIHN0ZXAgLSAoc3BhbiAtIGRpZmYpIC8gKDEwMCAvIGJnUG9zRmxvYXQpOyB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGRpbSA9IERpbWVuc2lvbnMuY292ZXIoZGltSW1hZ2UsIGRpbUVsKTtcbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgIGRhdGEkJDEuZGltID0gZGltO1xuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgd3JpdGU6IGZ1bmN0aW9uKHJlZikge1xuICAgICAgICAgICAgICAgIHZhciBkaW0gPSByZWYuZGltO1xuICAgICAgICAgICAgICAgIHZhciBhY3RpdmUgPSByZWYuYWN0aXZlO1xuXG5cbiAgICAgICAgICAgICAgICBpZiAoIWFjdGl2ZSkge1xuICAgICAgICAgICAgICAgICAgICBjc3ModGhpcy4kZWwsIHtiYWNrZ3JvdW5kU2l6ZTogJycsIGJhY2tncm91bmRSZXBlYXQ6ICcnfSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBkaW0gJiYgY3NzKHRoaXMuJGVsLCB7XG4gICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmRTaXplOiAoKGRpbS53aWR0aCkgKyBcInB4IFwiICsgKGRpbS5oZWlnaHQpICsgXCJweFwiKSxcbiAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZFJlcGVhdDogJ25vLXJlcGVhdCdcbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgZXZlbnRzOiBbJ3Jlc2l6ZSddXG5cbiAgICAgICAgfSxcblxuICAgICAgICBtZXRob2RzOiB7XG5cbiAgICAgICAgICAgIHJlc2V0OiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICB2YXIgdGhpcyQxID0gdGhpcztcblxuICAgICAgICAgICAgICAgIGVhY2godGhpcy5nZXRDc3MoMCksIGZ1bmN0aW9uIChfLCBwcm9wKSB7IHJldHVybiBjc3ModGhpcyQxLiRlbCwgcHJvcCwgJycpOyB9KTtcbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIGdldENzczogZnVuY3Rpb24ocGVyY2VudCkge1xuXG4gICAgICAgICAgICAgICAgdmFyIHJlZiA9IHRoaXM7XG4gICAgICAgICAgICAgICAgdmFyIHByb3BzID0gcmVmLnByb3BzO1xuICAgICAgICAgICAgICAgIHZhciB0cmFuc2xhdGVkID0gZmFsc2U7XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0LmtleXMocHJvcHMpLnJlZHVjZShmdW5jdGlvbiAoY3NzJCQxLCBwcm9wKSB7XG5cbiAgICAgICAgICAgICAgICAgICAgdmFyIHJlZiA9IHByb3BzW3Byb3BdO1xuICAgICAgICAgICAgICAgICAgICB2YXIgc3RlcHMgPSByZWYuc3RlcHM7XG4gICAgICAgICAgICAgICAgICAgIHZhciB1bml0ID0gcmVmLnVuaXQ7XG4gICAgICAgICAgICAgICAgICAgIHZhciBwb3MgPSByZWYucG9zO1xuICAgICAgICAgICAgICAgICAgICB2YXIgdmFsdWUgPSBnZXRWYWx1ZShzdGVwcywgcGVyY2VudCk7XG5cbiAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChwcm9wKSB7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRyYW5zZm9ybXNcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ3gnOlxuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAneSc6IHtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0cmFuc2xhdGVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByZWYkMSA9IFsneCcsICd5J10ubWFwKGZ1bmN0aW9uIChkaXIpIHsgcmV0dXJuIHByb3AgPT09IGRpclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IHRvRmxvYXQodmFsdWUpLnRvRml4ZWQoMCkgKyB1bml0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogcHJvcHNbZGlyXVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBnZXRWYWx1ZShwcm9wc1tkaXJdLnN0ZXBzLCBwZXJjZW50LCAxKSArIHByb3BzW2Rpcl0udW5pdFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAwOyB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgeCA9IHJlZiQxWzBdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB5ID0gcmVmJDFbMV07XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2xhdGVkID0gY3NzJCQxLnRyYW5zZm9ybSArPSBcIiB0cmFuc2xhdGUzZChcIiArIHggKyBcIiwgXCIgKyB5ICsgXCIsIDApXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdyb3RhdGUnOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNzcyQkMS50cmFuc2Zvcm0gKz0gXCIgcm90YXRlKFwiICsgdmFsdWUgKyBcImRlZylcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ3NjYWxlJzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjc3MkJDEudHJhbnNmb3JtICs9IFwiIHNjYWxlKFwiICsgdmFsdWUgKyBcIilcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYmcgaW1hZ2VcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2JneSc6XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdiZ3gnOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNzcyQkMVsoXCJiYWNrZ3JvdW5kLXBvc2l0aW9uLVwiICsgKHByb3BbMl0pKV0gPSBcImNhbGMoXCIgKyBwb3MgKyBcIiArIFwiICsgKHZhbHVlICsgdW5pdCkgKyBcIilcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29sb3JcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2NvbG9yJzpcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2JhY2tncm91bmRDb2xvcic6XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdib3JkZXJDb2xvcic6IHtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByZWYkMiA9IGdldFN0ZXAoc3RlcHMsIHBlcmNlbnQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzdGFydCA9IHJlZiQyWzBdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlbmQgPSByZWYkMlsxXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcCA9IHJlZiQyWzJdO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY3NzJCQxW3Byb3BdID0gXCJyZ2JhKFwiICsgKHN0YXJ0Lm1hcChmdW5jdGlvbiAodmFsdWUsIGkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gdmFsdWUgKyBwICogKGVuZFtpXSAtIHZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpID09PSAzID8gdG9GbG9hdCh2YWx1ZSkgOiBwYXJzZUludCh2YWx1ZSwgMTApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KS5qb2luKCcsJykpICsgXCIpXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBDU1MgRmlsdGVyXG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdibHVyJzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjc3MkJDEuZmlsdGVyICs9IFwiIGJsdXIoXCIgKyB2YWx1ZSArIFwicHgpXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdodWUnOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNzcyQkMS5maWx0ZXIgKz0gXCIgaHVlLXJvdGF0ZShcIiArIHZhbHVlICsgXCJkZWcpXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdmb3BhY2l0eSc6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY3NzJCQxLmZpbHRlciArPSBcIiBvcGFjaXR5KFwiICsgdmFsdWUgKyBcIiUpXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdncmF5c2NhbGUnOlxuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnaW52ZXJ0JzpcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ3NhdHVyYXRlJzpcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ3NlcGlhJzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjc3MkJDEuZmlsdGVyICs9IFwiIFwiICsgcHJvcCArIFwiKFwiICsgdmFsdWUgKyBcIiUpXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY3NzJCQxW3Byb3BdID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gY3NzJCQxO1xuXG4gICAgICAgICAgICAgICAgfSwge3RyYW5zZm9ybTogJycsIGZpbHRlcjogJyd9KTtcblxuICAgICAgICAgICAgfVxuXG4gICAgICAgIH1cblxuICAgIH07XG5cbiAgICBmdW5jdGlvbiBwYXJzZUNvbG9yKGVsLCBjb2xvcikge1xuICAgICAgICByZXR1cm4gY3NzKGNzcyhlbCwgJ2NvbG9yJywgY29sb3IpLCAnY29sb3InKS5zcGxpdCgvWygpLF0vZykuc2xpY2UoMSwgLTEpLmNvbmNhdCgxKS5zbGljZSgwLCA0KS5tYXAoZnVuY3Rpb24gKG4pIHsgcmV0dXJuIHRvRmxvYXQobik7IH0pO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGdldFN0ZXAoc3RlcHMsIHBlcmNlbnQpIHtcbiAgICAgICAgdmFyIGNvdW50ID0gc3RlcHMubGVuZ3RoIC0gMTtcbiAgICAgICAgdmFyIGluZGV4JCQxID0gTWF0aC5taW4oTWF0aC5mbG9vcihjb3VudCAqIHBlcmNlbnQpLCBjb3VudCAtIDEpO1xuICAgICAgICB2YXIgc3RlcCA9IHN0ZXBzLnNsaWNlKGluZGV4JCQxLCBpbmRleCQkMSArIDIpO1xuXG4gICAgICAgIHN0ZXAucHVzaChwZXJjZW50ID09PSAxID8gMSA6IHBlcmNlbnQgJSAoMSAvIGNvdW50KSAqIGNvdW50KTtcblxuICAgICAgICByZXR1cm4gc3RlcDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBnZXRWYWx1ZShzdGVwcywgcGVyY2VudCwgZGlnaXRzKSB7XG4gICAgICAgIGlmICggZGlnaXRzID09PSB2b2lkIDAgKSBkaWdpdHMgPSAyO1xuXG4gICAgICAgIHZhciByZWYgPSBnZXRTdGVwKHN0ZXBzLCBwZXJjZW50KTtcbiAgICAgICAgdmFyIHN0YXJ0ID0gcmVmWzBdO1xuICAgICAgICB2YXIgZW5kID0gcmVmWzFdO1xuICAgICAgICB2YXIgcCA9IHJlZlsyXTtcbiAgICAgICAgcmV0dXJuIChpc051bWJlcihzdGFydClcbiAgICAgICAgICAgICAgICA/IHN0YXJ0ICsgTWF0aC5hYnMoc3RhcnQgLSBlbmQpICogcCAqIChzdGFydCA8IGVuZCA/IDEgOiAtMSlcbiAgICAgICAgICAgICAgICA6ICtlbmRcbiAgICAgICAgKS50b0ZpeGVkKGRpZ2l0cyk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gY292ZXJzKGVsKSB7XG4gICAgICAgIHZhciByZWYgPSBlbC5zdHlsZTtcbiAgICAgICAgdmFyIGJhY2tncm91bmRTaXplID0gcmVmLmJhY2tncm91bmRTaXplO1xuICAgICAgICB2YXIgY292ZXJzID0gY3NzKGNzcyhlbCwgJ2JhY2tncm91bmRTaXplJywgJycpLCAnYmFja2dyb3VuZFNpemUnKSA9PT0gJ2NvdmVyJztcbiAgICAgICAgZWwuc3R5bGUuYmFja2dyb3VuZFNpemUgPSBiYWNrZ3JvdW5kU2l6ZTtcbiAgICAgICAgcmV0dXJuIGNvdmVycztcbiAgICB9XG5cbiAgICB2YXIgUGFyYWxsYXgkMSA9IHtcblxuICAgICAgICBtaXhpbnM6IFtQYXJhbGxheF0sXG5cbiAgICAgICAgcHJvcHM6IHtcbiAgICAgICAgICAgIHRhcmdldDogU3RyaW5nLFxuICAgICAgICAgICAgdmlld3BvcnQ6IE51bWJlcixcbiAgICAgICAgICAgIGVhc2luZzogTnVtYmVyLFxuICAgICAgICB9LFxuXG4gICAgICAgIGRhdGE6IHtcbiAgICAgICAgICAgIHRhcmdldDogZmFsc2UsXG4gICAgICAgICAgICB2aWV3cG9ydDogMSxcbiAgICAgICAgICAgIGVhc2luZzogMSxcbiAgICAgICAgfSxcblxuICAgICAgICBjb21wdXRlZDoge1xuXG4gICAgICAgICAgICB0YXJnZXQ6IGZ1bmN0aW9uKHJlZiwgJGVsKSB7XG4gICAgICAgICAgICAgICAgdmFyIHRhcmdldCA9IHJlZi50YXJnZXQ7XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gZ2V0T2Zmc2V0RWxlbWVudCh0YXJnZXQgJiYgcXVlcnkodGFyZ2V0LCAkZWwpIHx8ICRlbCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgfSxcblxuICAgICAgICB1cGRhdGU6IHtcblxuICAgICAgICAgICAgcmVhZDogZnVuY3Rpb24ocmVmLCB0eXBlKSB7XG4gICAgICAgICAgICAgICAgdmFyIHBlcmNlbnQgPSByZWYucGVyY2VudDtcbiAgICAgICAgICAgICAgICB2YXIgYWN0aXZlID0gcmVmLmFjdGl2ZTtcblxuXG4gICAgICAgICAgICAgICAgaWYgKHR5cGUgIT09ICdzY3JvbGwnKSB7XG4gICAgICAgICAgICAgICAgICAgIHBlcmNlbnQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoIWFjdGl2ZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgdmFyIHByZXYgPSBwZXJjZW50O1xuICAgICAgICAgICAgICAgIHBlcmNlbnQgPSBlYXNlJDEoc2Nyb2xsZWRPdmVyKHRoaXMudGFyZ2V0KSAvICh0aGlzLnZpZXdwb3J0IHx8IDEpLCB0aGlzLmVhc2luZyk7XG5cbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICBwZXJjZW50OiBwZXJjZW50LFxuICAgICAgICAgICAgICAgICAgICBzdHlsZTogcHJldiAhPT0gcGVyY2VudCA/IHRoaXMuZ2V0Q3NzKHBlcmNlbnQpIDogZmFsc2VcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgd3JpdGU6IGZ1bmN0aW9uKHJlZikge1xuICAgICAgICAgICAgICAgIHZhciBzdHlsZSA9IHJlZi5zdHlsZTtcbiAgICAgICAgICAgICAgICB2YXIgYWN0aXZlID0gcmVmLmFjdGl2ZTtcblxuXG4gICAgICAgICAgICAgICAgaWYgKCFhY3RpdmUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZXNldCgpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgc3R5bGUgJiYgY3NzKHRoaXMuJGVsLCBzdHlsZSk7XG5cbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIGV2ZW50czogWydzY3JvbGwnLCAncmVzaXplJ11cbiAgICAgICAgfVxuXG4gICAgfTtcblxuICAgIGZ1bmN0aW9uIGVhc2UkMShwZXJjZW50LCBlYXNpbmcpIHtcbiAgICAgICAgcmV0dXJuIGNsYW1wKHBlcmNlbnQgKiAoMSAtIChlYXNpbmcgLSBlYXNpbmcgKiBwZXJjZW50KSkpO1xuICAgIH1cblxuICAgIC8vIFNWRyBlbGVtZW50cyBkbyBub3QgaW5oZXJpdCBmcm9tIEhUTUxFbGVtZW50XG4gICAgZnVuY3Rpb24gZ2V0T2Zmc2V0RWxlbWVudChlbCkge1xuICAgICAgICByZXR1cm4gZWxcbiAgICAgICAgICAgID8gJ29mZnNldFRvcCcgaW4gZWxcbiAgICAgICAgICAgICAgICA/IGVsXG4gICAgICAgICAgICAgICAgOiBnZXRPZmZzZXRFbGVtZW50KGVsLnBhcmVudE5vZGUpXG4gICAgICAgICAgICA6IGRvY3VtZW50LmJvZHk7XG4gICAgfVxuXG4gICAgdmFyIFNsaWRlclJlYWN0aXZlID0ge1xuXG4gICAgICAgIHVwZGF0ZToge1xuXG4gICAgICAgICAgICB3cml0ZTogZnVuY3Rpb24oKSB7XG5cbiAgICAgICAgICAgICAgICBpZiAodGhpcy5zdGFjay5sZW5ndGggfHwgdGhpcy5kcmFnZ2luZykge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgdmFyIGluZGV4JCQxID0gdGhpcy5nZXRWYWxpZEluZGV4KCk7XG4gICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMuaW5kZXg7XG4gICAgICAgICAgICAgICAgcmVtb3ZlQ2xhc3ModGhpcy5zbGlkZXMsIHRoaXMuY2xzQWN0aXZlLCB0aGlzLmNsc0FjdGl2YXRlZCk7XG4gICAgICAgICAgICAgICAgdGhpcy5zaG93KGluZGV4JCQxKTtcblxuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgZXZlbnRzOiBbJ3Jlc2l6ZSddXG5cbiAgICAgICAgfVxuXG4gICAgfTtcblxuICAgIGZ1bmN0aW9uIFRyYW5zaXRpb25lciQxIChwcmV2LCBuZXh0LCBkaXIsIHJlZikge1xuICAgICAgICB2YXIgY2VudGVyID0gcmVmLmNlbnRlcjtcbiAgICAgICAgdmFyIGVhc2luZyA9IHJlZi5lYXNpbmc7XG4gICAgICAgIHZhciBsaXN0ID0gcmVmLmxpc3Q7XG5cblxuICAgICAgICB2YXIgZGVmZXJyZWQgPSBuZXcgRGVmZXJyZWQoKTtcblxuICAgICAgICB2YXIgZnJvbSA9IHByZXZcbiAgICAgICAgICAgID8gZ2V0TGVmdChwcmV2LCBsaXN0LCBjZW50ZXIpXG4gICAgICAgICAgICA6IGdldExlZnQobmV4dCwgbGlzdCwgY2VudGVyKSArIGJvdW5kcyhuZXh0KS53aWR0aCAqIGRpcjtcbiAgICAgICAgdmFyIHRvID0gbmV4dFxuICAgICAgICAgICAgPyBnZXRMZWZ0KG5leHQsIGxpc3QsIGNlbnRlcilcbiAgICAgICAgICAgIDogZnJvbSArIGJvdW5kcyhwcmV2KS53aWR0aCAqIGRpciAqIChpc1J0bCA/IC0xIDogMSk7XG5cbiAgICAgICAgcmV0dXJuIHtcblxuICAgICAgICAgICAgZGlyOiBkaXIsXG5cbiAgICAgICAgICAgIHNob3c6IGZ1bmN0aW9uKGR1cmF0aW9uLCBwZXJjZW50LCBsaW5lYXIpIHtcbiAgICAgICAgICAgICAgICBpZiAoIHBlcmNlbnQgPT09IHZvaWQgMCApIHBlcmNlbnQgPSAwO1xuXG5cbiAgICAgICAgICAgICAgICB2YXIgdGltaW5nID0gbGluZWFyID8gJ2xpbmVhcicgOiBlYXNpbmc7XG4gICAgICAgICAgICAgICAgZHVyYXRpb24gLT0gTWF0aC5yb3VuZChkdXJhdGlvbiAqIGNsYW1wKHBlcmNlbnQsIC0xLCAxKSk7XG5cbiAgICAgICAgICAgICAgICB0aGlzLnRyYW5zbGF0ZShwZXJjZW50KTtcblxuICAgICAgICAgICAgICAgIHByZXYgJiYgdGhpcy51cGRhdGVUcmFuc2xhdGVzKCk7XG4gICAgICAgICAgICAgICAgcGVyY2VudCA9IHByZXYgPyBwZXJjZW50IDogY2xhbXAocGVyY2VudCwgMCwgMSk7XG4gICAgICAgICAgICAgICAgdHJpZ2dlclVwZGF0ZSQxKHRoaXMuZ2V0SXRlbUluKCksICdpdGVtaW4nLCB7cGVyY2VudDogcGVyY2VudCwgZHVyYXRpb246IGR1cmF0aW9uLCB0aW1pbmc6IHRpbWluZywgZGlyOiBkaXJ9KTtcbiAgICAgICAgICAgICAgICBwcmV2ICYmIHRyaWdnZXJVcGRhdGUkMSh0aGlzLmdldEl0ZW1Jbih0cnVlKSwgJ2l0ZW1vdXQnLCB7cGVyY2VudDogMSAtIHBlcmNlbnQsIGR1cmF0aW9uOiBkdXJhdGlvbiwgdGltaW5nOiB0aW1pbmcsIGRpcjogZGlyfSk7XG5cbiAgICAgICAgICAgICAgICBUcmFuc2l0aW9uXG4gICAgICAgICAgICAgICAgICAgIC5zdGFydChsaXN0LCB7dHJhbnNmb3JtOiB0cmFuc2xhdGUoLXRvICogKGlzUnRsID8gLTEgOiAxKSwgJ3B4Jyl9LCBkdXJhdGlvbiwgdGltaW5nKVxuICAgICAgICAgICAgICAgICAgICAudGhlbihkZWZlcnJlZC5yZXNvbHZlLCBub29wKTtcblxuICAgICAgICAgICAgICAgIHJldHVybiBkZWZlcnJlZC5wcm9taXNlO1xuXG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICBzdG9wOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gVHJhbnNpdGlvbi5zdG9wKGxpc3QpO1xuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgY2FuY2VsOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICBUcmFuc2l0aW9uLmNhbmNlbChsaXN0KTtcbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIHJlc2V0OiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICBjc3MobGlzdCwgJ3RyYW5zZm9ybScsICcnKTtcbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIGZvcndhcmQ6IGZ1bmN0aW9uKGR1cmF0aW9uLCBwZXJjZW50KSB7XG4gICAgICAgICAgICAgICAgaWYgKCBwZXJjZW50ID09PSB2b2lkIDAgKSBwZXJjZW50ID0gdGhpcy5wZXJjZW50KCk7XG5cbiAgICAgICAgICAgICAgICBUcmFuc2l0aW9uLmNhbmNlbChsaXN0KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5zaG93KGR1cmF0aW9uLCBwZXJjZW50LCB0cnVlKTtcbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIHRyYW5zbGF0ZTogZnVuY3Rpb24ocGVyY2VudCkge1xuXG4gICAgICAgICAgICAgICAgdmFyIGRpc3RhbmNlID0gdGhpcy5nZXREaXN0YW5jZSgpICogZGlyICogKGlzUnRsID8gLTEgOiAxKTtcblxuICAgICAgICAgICAgICAgIGNzcyhsaXN0LCAndHJhbnNmb3JtJywgdHJhbnNsYXRlKGNsYW1wKFxuICAgICAgICAgICAgICAgICAgICAtdG8gKyAoZGlzdGFuY2UgLSBkaXN0YW5jZSAqIHBlcmNlbnQpLFxuICAgICAgICAgICAgICAgICAgICAtZ2V0V2lkdGgobGlzdCksXG4gICAgICAgICAgICAgICAgICAgIGJvdW5kcyhsaXN0KS53aWR0aFxuICAgICAgICAgICAgICAgICkgKiAoaXNSdGwgPyAtMSA6IDEpLCAncHgnKSk7XG5cbiAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZVRyYW5zbGF0ZXMoKTtcblxuICAgICAgICAgICAgICAgIGlmIChwcmV2KSB7XG4gICAgICAgICAgICAgICAgICAgIHBlcmNlbnQgPSBjbGFtcChwZXJjZW50LCAtMSwgMSk7XG4gICAgICAgICAgICAgICAgICAgIHRyaWdnZXJVcGRhdGUkMSh0aGlzLmdldEl0ZW1JbigpLCAnaXRlbXRyYW5zbGF0ZWluJywge3BlcmNlbnQ6IHBlcmNlbnQsIGRpcjogZGlyfSk7XG4gICAgICAgICAgICAgICAgICAgIHRyaWdnZXJVcGRhdGUkMSh0aGlzLmdldEl0ZW1Jbih0cnVlKSwgJ2l0ZW10cmFuc2xhdGVvdXQnLCB7cGVyY2VudDogMSAtIHBlcmNlbnQsIGRpcjogZGlyfSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICBwZXJjZW50OiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gTWF0aC5hYnMoKGNzcyhsaXN0LCAndHJhbnNmb3JtJykuc3BsaXQoJywnKVs0XSAqIChpc1J0bCA/IC0xIDogMSkgKyBmcm9tKSAvICh0byAtIGZyb20pKTtcbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIGdldERpc3RhbmNlOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gTWF0aC5hYnModG8gLSBmcm9tKTtcbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIGdldEl0ZW1JbjogZnVuY3Rpb24ob3V0KSB7XG4gICAgICAgICAgICAgICAgaWYgKCBvdXQgPT09IHZvaWQgMCApIG91dCA9IGZhbHNlO1xuXG5cbiAgICAgICAgICAgICAgICB2YXIgYWN0aXZlcyA9IHRoaXMuZ2V0QWN0aXZlcygpO1xuICAgICAgICAgICAgICAgIHZhciBhbGwgPSBzb3J0Qnkoc2xpZGVzKGxpc3QpLCAnb2Zmc2V0TGVmdCcpO1xuICAgICAgICAgICAgICAgIHZhciBpID0gaW5kZXgoYWxsLCBhY3RpdmVzW2RpciAqIChvdXQgPyAtMSA6IDEpID4gMCA/IGFjdGl2ZXMubGVuZ3RoIC0gMSA6IDBdKTtcblxuICAgICAgICAgICAgICAgIHJldHVybiB+aSAmJiBhbGxbaSArIChwcmV2ICYmICFvdXQgPyBkaXIgOiAwKV07XG5cbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIGdldEFjdGl2ZXM6IGZ1bmN0aW9uKCkge1xuXG4gICAgICAgICAgICAgICAgdmFyIGxlZnQgPSBnZXRMZWZ0KHByZXYgfHwgbmV4dCwgbGlzdCwgY2VudGVyKTtcblxuICAgICAgICAgICAgICAgIHJldHVybiBzb3J0Qnkoc2xpZGVzKGxpc3QpLmZpbHRlcihmdW5jdGlvbiAoc2xpZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHNsaWRlTGVmdCA9IGdldEVsTGVmdChzbGlkZSwgbGlzdCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBzbGlkZUxlZnQgPj0gbGVmdCAmJiBzbGlkZUxlZnQgKyBib3VuZHMoc2xpZGUpLndpZHRoIDw9IGJvdW5kcyhsaXN0KS53aWR0aCArIGxlZnQ7XG4gICAgICAgICAgICAgICAgfSksICdvZmZzZXRMZWZ0Jyk7XG5cbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIHVwZGF0ZVRyYW5zbGF0ZXM6IGZ1bmN0aW9uKCkge1xuXG4gICAgICAgICAgICAgICAgdmFyIGFjdGl2ZXMgPSB0aGlzLmdldEFjdGl2ZXMoKTtcblxuICAgICAgICAgICAgICAgIHNsaWRlcyhsaXN0KS5mb3JFYWNoKGZ1bmN0aW9uIChzbGlkZSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgaXNBY3RpdmUgPSBpbmNsdWRlcyhhY3RpdmVzLCBzbGlkZSk7XG5cbiAgICAgICAgICAgICAgICAgICAgdHJpZ2dlclVwZGF0ZSQxKHNsaWRlLCAoXCJpdGVtdHJhbnNsYXRlXCIgKyAoaXNBY3RpdmUgPyAnaW4nIDogJ291dCcpKSwge1xuICAgICAgICAgICAgICAgICAgICAgICAgcGVyY2VudDogaXNBY3RpdmUgPyAxIDogMCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGRpcjogc2xpZGUub2Zmc2V0TGVmdCA8PSBuZXh0Lm9mZnNldExlZnQgPyAxIDogLTFcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgfTtcblxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGdldExlZnQoZWwsIGxpc3QsIGNlbnRlcikge1xuXG4gICAgICAgIHZhciBsZWZ0ID0gZ2V0RWxMZWZ0KGVsLCBsaXN0KTtcblxuICAgICAgICByZXR1cm4gY2VudGVyXG4gICAgICAgICAgICA/IGxlZnQgLSBjZW50ZXJFbChlbCwgbGlzdClcbiAgICAgICAgICAgIDogTWF0aC5taW4obGVmdCwgZ2V0TWF4KGxpc3QpKTtcblxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGdldE1heChsaXN0KSB7XG4gICAgICAgIHJldHVybiBNYXRoLm1heCgwLCBnZXRXaWR0aChsaXN0KSAtIGJvdW5kcyhsaXN0KS53aWR0aCk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2V0V2lkdGgobGlzdCkge1xuICAgICAgICByZXR1cm4gc2xpZGVzKGxpc3QpLnJlZHVjZShmdW5jdGlvbiAocmlnaHQsIGVsKSB7IHJldHVybiBib3VuZHMoZWwpLndpZHRoICsgcmlnaHQ7IH0sIDApO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGdldE1heFdpZHRoKGxpc3QpIHtcbiAgICAgICAgcmV0dXJuIHNsaWRlcyhsaXN0KS5yZWR1Y2UoZnVuY3Rpb24gKHJpZ2h0LCBlbCkgeyByZXR1cm4gTWF0aC5tYXgocmlnaHQsIGJvdW5kcyhlbCkud2lkdGgpOyB9LCAwKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjZW50ZXJFbChlbCwgbGlzdCkge1xuICAgICAgICByZXR1cm4gYm91bmRzKGxpc3QpLndpZHRoIC8gMiAtIGJvdW5kcyhlbCkud2lkdGggLyAyO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGdldEVsTGVmdChlbCwgbGlzdCkge1xuICAgICAgICByZXR1cm4gKHBvc2l0aW9uKGVsKS5sZWZ0ICsgKGlzUnRsID8gYm91bmRzKGVsKS53aWR0aCAtIGJvdW5kcyhsaXN0KS53aWR0aCA6IDApKSAqIChpc1J0bCA/IC0xIDogMSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gYm91bmRzKGVsKSB7XG4gICAgICAgIHJldHVybiBlbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiB0cmlnZ2VyVXBkYXRlJDEoZWwsIHR5cGUsIGRhdGEkJDEpIHtcbiAgICAgICAgdHJpZ2dlcihlbCwgY3JlYXRlRXZlbnQodHlwZSwgZmFsc2UsIGZhbHNlLCBkYXRhJCQxKSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gc2xpZGVzKGxpc3QpIHtcbiAgICAgICAgcmV0dXJuIHRvTm9kZXMobGlzdC5jaGlsZHJlbik7XG4gICAgfVxuXG4gICAgdmFyIFNsaWRlciQxID0ge1xuXG4gICAgICAgIG1peGluczogW0NsYXNzLCBTbGlkZXIsIFNsaWRlclJlYWN0aXZlXSxcblxuICAgICAgICBwcm9wczoge1xuICAgICAgICAgICAgY2VudGVyOiBCb29sZWFuLFxuICAgICAgICAgICAgc2V0czogQm9vbGVhbixcbiAgICAgICAgfSxcblxuICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgICBjZW50ZXI6IGZhbHNlLFxuICAgICAgICAgICAgc2V0czogZmFsc2UsXG4gICAgICAgICAgICBhdHRySXRlbTogJ3VrLXNsaWRlci1pdGVtJyxcbiAgICAgICAgICAgIHNlbExpc3Q6ICcudWstc2xpZGVyLWl0ZW1zJyxcbiAgICAgICAgICAgIHNlbE5hdjogJy51ay1zbGlkZXItbmF2JyxcbiAgICAgICAgICAgIGNsc0NvbnRhaW5lcjogJ3VrLXNsaWRlci1jb250YWluZXInLFxuICAgICAgICAgICAgVHJhbnNpdGlvbmVyOiBUcmFuc2l0aW9uZXIkMVxuICAgICAgICB9LFxuXG4gICAgICAgIGNvbXB1dGVkOiB7XG5cbiAgICAgICAgICAgIGF2Z1dpZHRoOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZ2V0V2lkdGgodGhpcy5saXN0KSAvIHRoaXMubGVuZ3RoO1xuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgZmluaXRlOiBmdW5jdGlvbihyZWYpIHtcbiAgICAgICAgICAgICAgICB2YXIgZmluaXRlID0gcmVmLmZpbml0ZTtcblxuICAgICAgICAgICAgICAgIHJldHVybiBmaW5pdGUgfHwgZ2V0V2lkdGgodGhpcy5saXN0KSA8IGJvdW5kcyh0aGlzLmxpc3QpLndpZHRoICsgZ2V0TWF4V2lkdGgodGhpcy5saXN0KSArIHRoaXMuY2VudGVyO1xuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgbWF4SW5kZXg6IGZ1bmN0aW9uKCkge1xuXG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLmZpbml0ZSB8fCB0aGlzLmNlbnRlciAmJiAhdGhpcy5zZXRzKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmxlbmd0aCAtIDE7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuY2VudGVyKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnNldHNbdGhpcy5zZXRzLmxlbmd0aCAtIDFdO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGNzcyh0aGlzLnNsaWRlcywgJ29yZGVyJywgJycpO1xuXG4gICAgICAgICAgICAgICAgdmFyIG1heCA9IGdldE1heCh0aGlzLmxpc3QpO1xuICAgICAgICAgICAgICAgIHZhciBpID0gdGhpcy5sZW5ndGg7XG5cbiAgICAgICAgICAgICAgICB3aGlsZSAoaS0tKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChnZXRFbExlZnQodGhpcy5saXN0LmNoaWxkcmVuW2ldLCB0aGlzLmxpc3QpIDwgbWF4KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTWF0aC5taW4oaSArIDEsIHRoaXMubGVuZ3RoIC0gMSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIHNldHM6IGZ1bmN0aW9uKHJlZikge1xuICAgICAgICAgICAgICAgIHZhciB0aGlzJDEgPSB0aGlzO1xuICAgICAgICAgICAgICAgIHZhciBzZXRzID0gcmVmLnNldHM7XG5cblxuICAgICAgICAgICAgICAgIHZhciB3aWR0aCQkMSA9IGJvdW5kcyh0aGlzLmxpc3QpLndpZHRoIC8gKHRoaXMuY2VudGVyID8gMiA6IDEpO1xuXG4gICAgICAgICAgICAgICAgdmFyIGxlZnQgPSAwO1xuICAgICAgICAgICAgICAgIHZhciBsZWZ0Q2VudGVyID0gd2lkdGgkJDE7XG4gICAgICAgICAgICAgICAgdmFyIHNsaWRlTGVmdCA9IDA7XG5cbiAgICAgICAgICAgICAgICBzZXRzID0gc2V0cyAmJiB0aGlzLnNsaWRlcy5yZWR1Y2UoZnVuY3Rpb24gKHNldHMsIHNsaWRlLCBpKSB7XG5cbiAgICAgICAgICAgICAgICAgICAgdmFyIHJlZiA9IGJvdW5kcyhzbGlkZSk7XG4gICAgICAgICAgICAgICAgICAgIHZhciBzbGlkZVdpZHRoID0gcmVmLndpZHRoO1xuICAgICAgICAgICAgICAgICAgICB2YXIgc2xpZGVSaWdodCA9IHNsaWRlTGVmdCArIHNsaWRlV2lkdGg7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHNsaWRlUmlnaHQgPiBsZWZ0KSB7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGhpcyQxLmNlbnRlciAmJiBpID4gdGhpcyQxLm1heEluZGV4KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaSA9IHRoaXMkMS5tYXhJbmRleDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpbmNsdWRlcyhzZXRzLCBpKSkge1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNtcCA9IHRoaXMkMS5zbGlkZXNbaSArIDFdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzJDEuY2VudGVyICYmIGNtcCAmJiBzbGlkZVdpZHRoIDwgbGVmdENlbnRlciAtIGJvdW5kcyhjbXApLndpZHRoIC8gMikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWZ0Q2VudGVyIC09IHNsaWRlV2lkdGg7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVmdENlbnRlciA9IHdpZHRoJCQxO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRzLnB1c2goaSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZnQgPSBzbGlkZUxlZnQgKyB3aWR0aCQkMSArICh0aGlzJDEuY2VudGVyID8gc2xpZGVXaWR0aCAvIDIgOiAwKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIHNsaWRlTGVmdCArPSBzbGlkZVdpZHRoO1xuXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBzZXRzO1xuXG4gICAgICAgICAgICAgICAgfSwgW10pO1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuIHNldHMgJiYgc2V0cy5sZW5ndGggJiYgc2V0cztcblxuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgdHJhbnNpdGlvbk9wdGlvbnM6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIGNlbnRlcjogdGhpcy5jZW50ZXIsXG4gICAgICAgICAgICAgICAgICAgIGxpc3Q6IHRoaXMubGlzdFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgfSxcblxuICAgICAgICBjb25uZWN0ZWQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgdG9nZ2xlQ2xhc3ModGhpcy4kZWwsIHRoaXMuY2xzQ29udGFpbmVyLCAhJCgoXCIuXCIgKyAodGhpcy5jbHNDb250YWluZXIpKSwgdGhpcy4kZWwpKTtcbiAgICAgICAgfSxcblxuICAgICAgICB1cGRhdGU6IHtcblxuICAgICAgICAgICAgd3JpdGU6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIHZhciB0aGlzJDEgPSB0aGlzO1xuXG5cbiAgICAgICAgICAgICAgICAkJCgoXCJbXCIgKyAodGhpcy5hdHRySXRlbSkgKyBcIl0sW2RhdGEtXCIgKyAodGhpcy5hdHRySXRlbSkgKyBcIl1cIiksIHRoaXMuJGVsKS5mb3JFYWNoKGZ1bmN0aW9uIChlbCkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgaW5kZXgkJDEgPSBkYXRhKGVsLCB0aGlzJDEuYXR0ckl0ZW0pO1xuICAgICAgICAgICAgICAgICAgICB0aGlzJDEubWF4SW5kZXggJiYgdG9nZ2xlQ2xhc3MoZWwsICd1ay1oaWRkZW4nLCBpc051bWVyaWMoaW5kZXgkJDEpICYmICh0aGlzJDEuc2V0cyAmJiAhaW5jbHVkZXModGhpcyQxLnNldHMsIHRvRmxvYXQoaW5kZXgkJDEpKSB8fCBpbmRleCQkMSA+IHRoaXMkMS5tYXhJbmRleCkpO1xuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICBldmVudHM6IFsncmVzaXplJ11cblxuICAgICAgICB9LFxuXG4gICAgICAgIGV2ZW50czoge1xuXG4gICAgICAgICAgICBiZWZvcmVpdGVtc2hvdzogZnVuY3Rpb24oZSkge1xuXG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLmRyYWdnaW5nICYmIHRoaXMuc2V0cyAmJiB0aGlzLnN0YWNrLmxlbmd0aCA8IDIgJiYgIWluY2x1ZGVzKHRoaXMuc2V0cywgdGhpcy5pbmRleCkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pbmRleCA9IHRoaXMuZ2V0VmFsaWRJbmRleCgpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHZhciBkaWZmID0gTWF0aC5hYnMoXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaW5kZXhcbiAgICAgICAgICAgICAgICAgICAgLSB0aGlzLnByZXZJbmRleFxuICAgICAgICAgICAgICAgICAgICArICh0aGlzLmRpciA+IDAgJiYgdGhpcy5pbmRleCA8IHRoaXMucHJldkluZGV4IHx8IHRoaXMuZGlyIDwgMCAmJiB0aGlzLmluZGV4ID4gdGhpcy5wcmV2SW5kZXggPyAodGhpcy5tYXhJbmRleCArIDEpICogdGhpcy5kaXIgOiAwKVxuICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuZHJhZ2dpbmcgJiYgZGlmZiA+IDEpIHtcblxuICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGRpZmY7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zdGFjay5zcGxpY2UoMSwgMCwgdGhpcy5kaXIgPiAwID8gJ25leHQnIDogJ3ByZXZpb3VzJyk7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB0aGlzLmR1cmF0aW9uID0gc3BlZWRVcCh0aGlzLmF2Z1dpZHRoIC8gdGhpcy52ZWxvY2l0eSlcbiAgICAgICAgICAgICAgICAgICAgKiAoYm91bmRzKFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kaXIgPCAwIHx8ICF0aGlzLnNsaWRlc1t0aGlzLnByZXZJbmRleF1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IHRoaXMuc2xpZGVzW3RoaXMuaW5kZXhdXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiB0aGlzLnNsaWRlc1t0aGlzLnByZXZJbmRleF1cbiAgICAgICAgICAgICAgICAgICAgKS53aWR0aCAvIHRoaXMuYXZnV2lkdGgpO1xuXG4gICAgICAgICAgICAgICAgdGhpcy5yZW9yZGVyKCk7XG5cbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIGl0ZW1zaG93OiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAhaXNVbmRlZmluZWQodGhpcy5wcmV2SW5kZXgpICYmIGFkZENsYXNzKHRoaXMuX2dldFRyYW5zaXRpb25lcigpLmdldEl0ZW1JbigpLCB0aGlzLmNsc0FjdGl2ZSk7XG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICBpdGVtc2hvd246IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIHZhciB0aGlzJDEgPSB0aGlzO1xuXG4gICAgICAgICAgICAgICAgdmFyIGFjdGl2ZXMgPSB0aGlzLl9nZXRUcmFuc2l0aW9uZXIodGhpcy5pbmRleCkuZ2V0QWN0aXZlcygpO1xuICAgICAgICAgICAgICAgIHRoaXMuc2xpZGVzLmZvckVhY2goZnVuY3Rpb24gKHNsaWRlKSB7IHJldHVybiB0b2dnbGVDbGFzcyhzbGlkZSwgdGhpcyQxLmNsc0FjdGl2ZSwgaW5jbHVkZXMoYWN0aXZlcywgc2xpZGUpKTsgfSk7XG4gICAgICAgICAgICAgICAgKCF0aGlzLnNldHMgfHwgaW5jbHVkZXModGhpcy5zZXRzLCB0b0Zsb2F0KHRoaXMuaW5kZXgpKSkgJiYgdGhpcy5zbGlkZXMuZm9yRWFjaChmdW5jdGlvbiAoc2xpZGUpIHsgcmV0dXJuIHRvZ2dsZUNsYXNzKHNsaWRlLCB0aGlzJDEuY2xzQWN0aXZhdGVkLCBpbmNsdWRlcyhhY3RpdmVzLCBzbGlkZSkpOyB9KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICB9LFxuXG4gICAgICAgIG1ldGhvZHM6IHtcblxuICAgICAgICAgICAgcmVvcmRlcjogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgdmFyIHRoaXMkMSA9IHRoaXM7XG5cblxuICAgICAgICAgICAgICAgIGNzcyh0aGlzLnNsaWRlcywgJ29yZGVyJywgJycpO1xuXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuZmluaXRlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB2YXIgaW5kZXgkJDEgPSB0aGlzLmRpciA+IDAgJiYgdGhpcy5zbGlkZXNbdGhpcy5wcmV2SW5kZXhdID8gdGhpcy5wcmV2SW5kZXggOiB0aGlzLmluZGV4O1xuXG4gICAgICAgICAgICAgICAgdGhpcy5zbGlkZXMuZm9yRWFjaChmdW5jdGlvbiAoc2xpZGUsIGkpIHsgcmV0dXJuIGNzcyhzbGlkZSwgJ29yZGVyJywgdGhpcyQxLmRpciA+IDAgJiYgaSA8IGluZGV4JCQxXG4gICAgICAgICAgICAgICAgICAgICAgICA/IDFcbiAgICAgICAgICAgICAgICAgICAgICAgIDogdGhpcyQxLmRpciA8IDAgJiYgaSA+PSB0aGlzJDEuaW5kZXhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IC0xXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAnJ1xuICAgICAgICAgICAgICAgICAgICApOyB9XG4gICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgIGlmICghdGhpcy5jZW50ZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHZhciBuZXh0ID0gdGhpcy5zbGlkZXNbaW5kZXgkJDFdO1xuICAgICAgICAgICAgICAgIHZhciB3aWR0aCQkMSA9IGJvdW5kcyh0aGlzLmxpc3QpLndpZHRoIC8gMiAtIGJvdW5kcyhuZXh0KS53aWR0aCAvIDI7XG4gICAgICAgICAgICAgICAgdmFyIGogPSAwO1xuXG4gICAgICAgICAgICAgICAgd2hpbGUgKHdpZHRoJCQxID4gMCkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgc2xpZGVJbmRleCA9IHRoaXMuZ2V0SW5kZXgoLS1qICsgaW5kZXgkJDEsIGluZGV4JCQxKTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHNsaWRlID0gdGhpcy5zbGlkZXNbc2xpZGVJbmRleF07XG5cbiAgICAgICAgICAgICAgICAgICAgY3NzKHNsaWRlLCAnb3JkZXInLCBzbGlkZUluZGV4ID4gaW5kZXgkJDEgPyAtMiA6IC0xKTtcbiAgICAgICAgICAgICAgICAgICAgd2lkdGgkJDEgLT0gYm91bmRzKHNsaWRlKS53aWR0aDtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIGdldFZhbGlkSW5kZXg6IGZ1bmN0aW9uKGluZGV4JCQxLCBwcmV2SW5kZXgpIHtcbiAgICAgICAgICAgICAgICBpZiAoIGluZGV4JCQxID09PSB2b2lkIDAgKSBpbmRleCQkMSA9IHRoaXMuaW5kZXg7XG4gICAgICAgICAgICAgICAgaWYgKCBwcmV2SW5kZXggPT09IHZvaWQgMCApIHByZXZJbmRleCA9IHRoaXMucHJldkluZGV4O1xuXG5cbiAgICAgICAgICAgICAgICBpbmRleCQkMSA9IHRoaXMuZ2V0SW5kZXgoaW5kZXgkJDEsIHByZXZJbmRleCk7XG5cbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuc2V0cykge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gaW5kZXgkJDE7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgdmFyIHByZXY7XG5cbiAgICAgICAgICAgICAgICBkbyB7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKGluY2x1ZGVzKHRoaXMuc2V0cywgaW5kZXgkJDEpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaW5kZXgkJDE7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBwcmV2ID0gaW5kZXgkJDE7XG4gICAgICAgICAgICAgICAgICAgIGluZGV4JCQxID0gdGhpcy5nZXRJbmRleChpbmRleCQkMSArIHRoaXMuZGlyLCBwcmV2SW5kZXgpO1xuXG4gICAgICAgICAgICAgICAgfSB3aGlsZSAoaW5kZXgkJDEgIT09IHByZXYpO1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuIGluZGV4JCQxO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgIH1cblxuICAgIH07XG5cbiAgICB2YXIgU2xpZGVyUGFyYWxsYXggPSB7XG5cbiAgICAgICAgbWl4aW5zOiBbUGFyYWxsYXhdLFxuXG4gICAgICAgIGRhdGE6IHtcbiAgICAgICAgICAgIHNlbEl0ZW06ICchbGknXG4gICAgICAgIH0sXG5cbiAgICAgICAgY29tcHV0ZWQ6IHtcblxuICAgICAgICAgICAgaXRlbTogZnVuY3Rpb24ocmVmLCAkZWwpIHtcbiAgICAgICAgICAgICAgICB2YXIgc2VsSXRlbSA9IHJlZi5zZWxJdGVtO1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuIHF1ZXJ5KHNlbEl0ZW0sICRlbCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgfSxcblxuICAgICAgICBldmVudHM6IFtcblxuICAgICAgICAgICAge1xuXG4gICAgICAgICAgICAgICAgbmFtZTogJ2l0ZW1zaG93bicsXG5cbiAgICAgICAgICAgICAgICBzZWxmOiB0cnVlLFxuXG4gICAgICAgICAgICAgICAgZWw6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5pdGVtO1xuICAgICAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgICAgICBoYW5kbGVyOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgY3NzKHRoaXMuJGVsLCB0aGlzLmdldENzcyguNSkpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIG5hbWU6ICdpdGVtaW4gaXRlbW91dCcsXG5cbiAgICAgICAgICAgICAgICBzZWxmOiB0cnVlLFxuXG4gICAgICAgICAgICAgICAgZWw6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5pdGVtO1xuICAgICAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgICAgICBoYW5kbGVyOiBmdW5jdGlvbihyZWYpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHR5cGUgPSByZWYudHlwZTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHJlZl9kZXRhaWwgPSByZWYuZGV0YWlsO1xuICAgICAgICAgICAgICAgICAgICB2YXIgcGVyY2VudCA9IHJlZl9kZXRhaWwucGVyY2VudDtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGR1cmF0aW9uID0gcmVmX2RldGFpbC5kdXJhdGlvbjtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHRpbWluZyA9IHJlZl9kZXRhaWwudGltaW5nO1xuICAgICAgICAgICAgICAgICAgICB2YXIgZGlyID0gcmVmX2RldGFpbC5kaXI7XG5cblxuICAgICAgICAgICAgICAgICAgICBUcmFuc2l0aW9uLmNhbmNlbCh0aGlzLiRlbCk7XG4gICAgICAgICAgICAgICAgICAgIGNzcyh0aGlzLiRlbCwgdGhpcy5nZXRDc3MoZ2V0Q3VycmVudCh0eXBlLCBkaXIsIHBlcmNlbnQpKSk7XG5cbiAgICAgICAgICAgICAgICAgICAgVHJhbnNpdGlvbi5zdGFydCh0aGlzLiRlbCwgdGhpcy5nZXRDc3MoaXNJbih0eXBlKVxuICAgICAgICAgICAgICAgICAgICAgICAgPyAuNVxuICAgICAgICAgICAgICAgICAgICAgICAgOiBkaXIgPiAwXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAxXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAwXG4gICAgICAgICAgICAgICAgICAgICksIGR1cmF0aW9uLCB0aW1pbmcpLmNhdGNoKG5vb3ApO1xuXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIG5hbWU6ICd0cmFuc2l0aW9uY2FuY2VsZWQgdHJhbnNpdGlvbmVuZCcsXG5cbiAgICAgICAgICAgICAgICBzZWxmOiB0cnVlLFxuXG4gICAgICAgICAgICAgICAgZWw6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5pdGVtO1xuICAgICAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgICAgICBoYW5kbGVyOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgVHJhbnNpdGlvbi5jYW5jZWwodGhpcy4kZWwpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIG5hbWU6ICdpdGVtdHJhbnNsYXRlaW4gaXRlbXRyYW5zbGF0ZW91dCcsXG5cbiAgICAgICAgICAgICAgICBzZWxmOiB0cnVlLFxuXG4gICAgICAgICAgICAgICAgZWw6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5pdGVtO1xuICAgICAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgICAgICBoYW5kbGVyOiBmdW5jdGlvbihyZWYpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHR5cGUgPSByZWYudHlwZTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHJlZl9kZXRhaWwgPSByZWYuZGV0YWlsO1xuICAgICAgICAgICAgICAgICAgICB2YXIgcGVyY2VudCA9IHJlZl9kZXRhaWwucGVyY2VudDtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGRpciA9IHJlZl9kZXRhaWwuZGlyO1xuXG4gICAgICAgICAgICAgICAgICAgIFRyYW5zaXRpb24uY2FuY2VsKHRoaXMuJGVsKTtcbiAgICAgICAgICAgICAgICAgICAgY3NzKHRoaXMuJGVsLCB0aGlzLmdldENzcyhnZXRDdXJyZW50KHR5cGUsIGRpciwgcGVyY2VudCkpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgXVxuXG4gICAgfTtcblxuICAgIGZ1bmN0aW9uIGlzSW4odHlwZSkge1xuICAgICAgICByZXR1cm4gZW5kc1dpdGgodHlwZSwgJ2luJyk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2V0Q3VycmVudCh0eXBlLCBkaXIsIHBlcmNlbnQpIHtcblxuICAgICAgICBwZXJjZW50IC89IDI7XG5cbiAgICAgICAgcmV0dXJuICFpc0luKHR5cGUpXG4gICAgICAgICAgICA/IGRpciA8IDBcbiAgICAgICAgICAgICAgICA/IHBlcmNlbnRcbiAgICAgICAgICAgICAgICA6IDEgLSBwZXJjZW50XG4gICAgICAgICAgICA6IGRpciA8IDBcbiAgICAgICAgICAgICAgICA/IDEgLSBwZXJjZW50XG4gICAgICAgICAgICAgICAgOiBwZXJjZW50O1xuICAgIH1cblxuICAgIHZhciBBbmltYXRpb25zJDIgPSBhc3NpZ24oe30sIEFuaW1hdGlvbnMsIHtcblxuICAgICAgICBmYWRlOiB7XG5cbiAgICAgICAgICAgIHNob3c6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICAgICAgICAgIHtvcGFjaXR5OiAwLCB6SW5kZXg6IDB9LFxuICAgICAgICAgICAgICAgICAgICB7ekluZGV4OiAtMX1cbiAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgcGVyY2VudDogZnVuY3Rpb24oY3VycmVudCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAxIC0gY3NzKGN1cnJlbnQsICdvcGFjaXR5Jyk7XG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICB0cmFuc2xhdGU6IGZ1bmN0aW9uKHBlcmNlbnQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgICAgICAgICB7b3BhY2l0eTogMSAtIHBlcmNlbnQsIHpJbmRleDogMH0sXG4gICAgICAgICAgICAgICAgICAgIHt6SW5kZXg6IC0xfVxuICAgICAgICAgICAgICAgIF07XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgfSxcblxuICAgICAgICBzY2FsZToge1xuXG4gICAgICAgICAgICBzaG93OiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgICAgICAgICB7b3BhY2l0eTogMCwgdHJhbnNmb3JtOiBzY2FsZTNkKDEgKyAuNSksIHpJbmRleDogMH0sXG4gICAgICAgICAgICAgICAgICAgIHt6SW5kZXg6IC0xfVxuICAgICAgICAgICAgICAgIF07XG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICBwZXJjZW50OiBmdW5jdGlvbihjdXJyZW50KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIDEgLSBjc3MoY3VycmVudCwgJ29wYWNpdHknKTtcbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIHRyYW5zbGF0ZTogZnVuY3Rpb24ocGVyY2VudCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICAgICAgICAgIHtvcGFjaXR5OiAxIC0gcGVyY2VudCwgdHJhbnNmb3JtOiBzY2FsZTNkKDEgKyAuNSAqIHBlcmNlbnQpLCB6SW5kZXg6IDB9LFxuICAgICAgICAgICAgICAgICAgICB7ekluZGV4OiAtMX1cbiAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgIH0sXG5cbiAgICAgICAgcHVsbDoge1xuXG4gICAgICAgICAgICBzaG93OiBmdW5jdGlvbihkaXIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZGlyIDwgMFxuICAgICAgICAgICAgICAgICAgICA/IFtcbiAgICAgICAgICAgICAgICAgICAgICAgIHt0cmFuc2Zvcm06IHRyYW5zbGF0ZSgzMCksIHpJbmRleDogLTF9LFxuICAgICAgICAgICAgICAgICAgICAgICAge3RyYW5zZm9ybTogdHJhbnNsYXRlKCksIHpJbmRleDogMH0gXVxuICAgICAgICAgICAgICAgICAgICA6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgIHt0cmFuc2Zvcm06IHRyYW5zbGF0ZSgtMTAwKSwgekluZGV4OiAwfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHt0cmFuc2Zvcm06IHRyYW5zbGF0ZSgpLCB6SW5kZXg6IC0xfVxuICAgICAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgcGVyY2VudDogZnVuY3Rpb24oY3VycmVudCwgbmV4dCwgZGlyKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGRpciA8IDBcbiAgICAgICAgICAgICAgICAgICAgPyAxIC0gdHJhbnNsYXRlZChuZXh0KVxuICAgICAgICAgICAgICAgICAgICA6IHRyYW5zbGF0ZWQoY3VycmVudCk7XG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICB0cmFuc2xhdGU6IGZ1bmN0aW9uKHBlcmNlbnQsIGRpcikge1xuICAgICAgICAgICAgICAgIHJldHVybiBkaXIgPCAwXG4gICAgICAgICAgICAgICAgICAgID8gW1xuICAgICAgICAgICAgICAgICAgICAgICAge3RyYW5zZm9ybTogdHJhbnNsYXRlKDMwICogcGVyY2VudCksIHpJbmRleDogLTF9LFxuICAgICAgICAgICAgICAgICAgICAgICAge3RyYW5zZm9ybTogdHJhbnNsYXRlKC0xMDAgKiAoMSAtIHBlcmNlbnQpKSwgekluZGV4OiAwfSBdXG4gICAgICAgICAgICAgICAgICAgIDogW1xuICAgICAgICAgICAgICAgICAgICAgICAge3RyYW5zZm9ybTogdHJhbnNsYXRlKC1wZXJjZW50ICogMTAwKSwgekluZGV4OiAwfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHt0cmFuc2Zvcm06IHRyYW5zbGF0ZSgzMCAqICgxIC0gcGVyY2VudCkpLCB6SW5kZXg6IC0xfVxuICAgICAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgIH0sXG5cbiAgICAgICAgcHVzaDoge1xuXG4gICAgICAgICAgICBzaG93OiBmdW5jdGlvbihkaXIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZGlyIDwgMFxuICAgICAgICAgICAgICAgICAgICA/IFtcbiAgICAgICAgICAgICAgICAgICAgICAgIHt0cmFuc2Zvcm06IHRyYW5zbGF0ZSgxMDApLCB6SW5kZXg6IDB9LFxuICAgICAgICAgICAgICAgICAgICAgICAge3RyYW5zZm9ybTogdHJhbnNsYXRlKCksIHpJbmRleDogLTF9IF1cbiAgICAgICAgICAgICAgICAgICAgOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICB7dHJhbnNmb3JtOiB0cmFuc2xhdGUoLTMwKSwgekluZGV4OiAtMX0sXG4gICAgICAgICAgICAgICAgICAgICAgICB7dHJhbnNmb3JtOiB0cmFuc2xhdGUoKSwgekluZGV4OiAwfVxuICAgICAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgcGVyY2VudDogZnVuY3Rpb24oY3VycmVudCwgbmV4dCwgZGlyKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGRpciA+IDBcbiAgICAgICAgICAgICAgICAgICAgPyAxIC0gdHJhbnNsYXRlZChuZXh0KVxuICAgICAgICAgICAgICAgICAgICA6IHRyYW5zbGF0ZWQoY3VycmVudCk7XG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICB0cmFuc2xhdGU6IGZ1bmN0aW9uKHBlcmNlbnQsIGRpcikge1xuICAgICAgICAgICAgICAgIHJldHVybiBkaXIgPCAwXG4gICAgICAgICAgICAgICAgICAgID8gW1xuICAgICAgICAgICAgICAgICAgICAgICAge3RyYW5zZm9ybTogdHJhbnNsYXRlKHBlcmNlbnQgKiAxMDApLCB6SW5kZXg6IDB9LFxuICAgICAgICAgICAgICAgICAgICAgICAge3RyYW5zZm9ybTogdHJhbnNsYXRlKC0zMCAqICgxIC0gcGVyY2VudCkpLCB6SW5kZXg6IC0xfSBdXG4gICAgICAgICAgICAgICAgICAgIDogW1xuICAgICAgICAgICAgICAgICAgICAgICAge3RyYW5zZm9ybTogdHJhbnNsYXRlKC0zMCAqIHBlcmNlbnQpLCB6SW5kZXg6IC0xfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHt0cmFuc2Zvcm06IHRyYW5zbGF0ZSgxMDAgKiAoMSAtIHBlcmNlbnQpKSwgekluZGV4OiAwfVxuICAgICAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgIH1cblxuICAgIH0pO1xuXG4gICAgdmFyIFNsaWRlc2hvdyQxID0ge1xuXG4gICAgICAgIG1peGluczogW0NsYXNzLCBTbGlkZXNob3csIFNsaWRlclJlYWN0aXZlXSxcblxuICAgICAgICBwcm9wczoge1xuICAgICAgICAgICAgcmF0aW86IFN0cmluZyxcbiAgICAgICAgICAgIG1pbkhlaWdodDogQm9vbGVhbixcbiAgICAgICAgICAgIG1heEhlaWdodDogQm9vbGVhbixcbiAgICAgICAgfSxcblxuICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgICByYXRpbzogJzE2OjknLFxuICAgICAgICAgICAgbWluSGVpZ2h0OiBmYWxzZSxcbiAgICAgICAgICAgIG1heEhlaWdodDogZmFsc2UsXG4gICAgICAgICAgICBzZWxMaXN0OiAnLnVrLXNsaWRlc2hvdy1pdGVtcycsXG4gICAgICAgICAgICBhdHRySXRlbTogJ3VrLXNsaWRlc2hvdy1pdGVtJyxcbiAgICAgICAgICAgIHNlbE5hdjogJy51ay1zbGlkZXNob3ctbmF2JyxcbiAgICAgICAgICAgIEFuaW1hdGlvbnM6IEFuaW1hdGlvbnMkMlxuICAgICAgICB9LFxuXG4gICAgICAgIHVwZGF0ZToge1xuXG4gICAgICAgICAgICByZWFkOiBmdW5jdGlvbigpIHtcblxuICAgICAgICAgICAgICAgIHZhciByZWYgPSB0aGlzLnJhdGlvLnNwbGl0KCc6JykubWFwKE51bWJlcik7XG4gICAgICAgICAgICAgICAgdmFyIHdpZHRoJCQxID0gcmVmWzBdO1xuICAgICAgICAgICAgICAgIHZhciBoZWlnaHQkJDEgPSByZWZbMV07XG5cbiAgICAgICAgICAgICAgICBoZWlnaHQkJDEgPSBoZWlnaHQkJDEgKiB0aGlzLmxpc3Qub2Zmc2V0V2lkdGggLyB3aWR0aCQkMTtcblxuICAgICAgICAgICAgICAgIGlmICh0aGlzLm1pbkhlaWdodCkge1xuICAgICAgICAgICAgICAgICAgICBoZWlnaHQkJDEgPSBNYXRoLm1heCh0aGlzLm1pbkhlaWdodCwgaGVpZ2h0JCQxKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAodGhpcy5tYXhIZWlnaHQpIHtcbiAgICAgICAgICAgICAgICAgICAgaGVpZ2h0JCQxID0gTWF0aC5taW4odGhpcy5tYXhIZWlnaHQsIGhlaWdodCQkMSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcmV0dXJuIHtoZWlnaHQ6IGhlaWdodCQkMSAtIGJveE1vZGVsQWRqdXN0KHRoaXMubGlzdCwgJ2NvbnRlbnQtYm94Jyl9O1xuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgd3JpdGU6IGZ1bmN0aW9uKHJlZikge1xuICAgICAgICAgICAgICAgIHZhciBoZWlnaHQkJDEgPSByZWYuaGVpZ2h0O1xuXG4gICAgICAgICAgICAgICAgY3NzKHRoaXMubGlzdCwgJ21pbkhlaWdodCcsIGhlaWdodCQkMSk7XG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICBldmVudHM6IFsncmVzaXplJ11cblxuICAgICAgICB9XG5cbiAgICB9O1xuXG4gICAgdmFyIFNvcnRhYmxlID0ge1xuXG4gICAgICAgIG1peGluczogW0NsYXNzLCBBbmltYXRlXSxcblxuICAgICAgICBwcm9wczoge1xuICAgICAgICAgICAgZ3JvdXA6IFN0cmluZyxcbiAgICAgICAgICAgIHRocmVzaG9sZDogTnVtYmVyLFxuICAgICAgICAgICAgY2xzSXRlbTogU3RyaW5nLFxuICAgICAgICAgICAgY2xzUGxhY2Vob2xkZXI6IFN0cmluZyxcbiAgICAgICAgICAgIGNsc0RyYWc6IFN0cmluZyxcbiAgICAgICAgICAgIGNsc0RyYWdTdGF0ZTogU3RyaW5nLFxuICAgICAgICAgICAgY2xzQmFzZTogU3RyaW5nLFxuICAgICAgICAgICAgY2xzTm9EcmFnOiBTdHJpbmcsXG4gICAgICAgICAgICBjbHNFbXB0eTogU3RyaW5nLFxuICAgICAgICAgICAgY2xzQ3VzdG9tOiBTdHJpbmcsXG4gICAgICAgICAgICBoYW5kbGU6IFN0cmluZ1xuICAgICAgICB9LFxuXG4gICAgICAgIGRhdGE6IHtcbiAgICAgICAgICAgIGdyb3VwOiBmYWxzZSxcbiAgICAgICAgICAgIHRocmVzaG9sZDogNSxcbiAgICAgICAgICAgIGNsc0l0ZW06ICd1ay1zb3J0YWJsZS1pdGVtJyxcbiAgICAgICAgICAgIGNsc1BsYWNlaG9sZGVyOiAndWstc29ydGFibGUtcGxhY2Vob2xkZXInLFxuICAgICAgICAgICAgY2xzRHJhZzogJ3VrLXNvcnRhYmxlLWRyYWcnLFxuICAgICAgICAgICAgY2xzRHJhZ1N0YXRlOiAndWstZHJhZycsXG4gICAgICAgICAgICBjbHNCYXNlOiAndWstc29ydGFibGUnLFxuICAgICAgICAgICAgY2xzTm9EcmFnOiAndWstc29ydGFibGUtbm9kcmFnJyxcbiAgICAgICAgICAgIGNsc0VtcHR5OiAndWstc29ydGFibGUtZW1wdHknLFxuICAgICAgICAgICAgY2xzQ3VzdG9tOiAnJyxcbiAgICAgICAgICAgIGhhbmRsZTogZmFsc2VcbiAgICAgICAgfSxcblxuICAgICAgICBjcmVhdGVkOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHZhciB0aGlzJDEgPSB0aGlzO1xuXG4gICAgICAgICAgICBbJ2luaXQnLCAnc3RhcnQnLCAnbW92ZScsICdlbmQnXS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgICAgICAgICB2YXIgZm4gPSB0aGlzJDFba2V5XTtcbiAgICAgICAgICAgICAgICB0aGlzJDFba2V5XSA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMkMS5zY3JvbGxZID0gd2luZG93LnBhZ2VZT2Zmc2V0O1xuICAgICAgICAgICAgICAgICAgICB2YXIgcmVmID0gZ2V0UG9zJDEoZSwgJ3BhZ2UnKTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHggPSByZWYueDtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHkgPSByZWYueTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcyQxLnBvcyA9IHt4OiB4LCB5OiB5fTtcblxuICAgICAgICAgICAgICAgICAgICBmbihlKTtcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgZXZlbnRzOiB7XG5cbiAgICAgICAgICAgIG5hbWU6IHBvaW50ZXJEb3duLFxuICAgICAgICAgICAgcGFzc2l2ZTogZmFsc2UsXG4gICAgICAgICAgICBoYW5kbGVyOiAnaW5pdCdcblxuICAgICAgICB9LFxuXG4gICAgICAgIHVwZGF0ZToge1xuXG4gICAgICAgICAgICB3cml0ZTogZnVuY3Rpb24oKSB7XG5cbiAgICAgICAgICAgICAgICBpZiAodGhpcy5jbHNFbXB0eSkge1xuICAgICAgICAgICAgICAgICAgICB0b2dnbGVDbGFzcyh0aGlzLiRlbCwgdGhpcy5jbHNFbXB0eSwgIXRoaXMuJGVsLmNoaWxkcmVuLmxlbmd0aCk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgY3NzKHRoaXMuaGFuZGxlID8gJCQodGhpcy5oYW5kbGUsIHRoaXMuJGVsKSA6IHRoaXMuJGVsLmNoaWxkcmVuLCAndG91Y2hBY3Rpb24nLCAnbm9uZScpO1xuXG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLmRyYWcpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIG9mZnNldCh0aGlzLmRyYWcsIHt0b3A6IHRoaXMucG9zLnkgKyB0aGlzLm9yaWdpbi50b3AsIGxlZnQ6IHRoaXMucG9zLnggKyB0aGlzLm9yaWdpbi5sZWZ0fSk7XG5cbiAgICAgICAgICAgICAgICB2YXIgcmVmID0gb2Zmc2V0KHRoaXMuZHJhZyk7XG4gICAgICAgICAgICAgICAgdmFyIHRvcCA9IHJlZi50b3A7XG4gICAgICAgICAgICAgICAgdmFyIG9mZnNldEhlaWdodCA9IHJlZi5oZWlnaHQ7XG4gICAgICAgICAgICAgICAgdmFyIGJvdHRvbSA9IHRvcCArIG9mZnNldEhlaWdodDtcbiAgICAgICAgICAgICAgICB2YXIgc2Nyb2xsO1xuXG4gICAgICAgICAgICAgICAgaWYgKHRvcCA+IDAgJiYgdG9wIDwgdGhpcy5zY3JvbGxZKSB7XG4gICAgICAgICAgICAgICAgICAgIHNjcm9sbCA9IHRoaXMuc2Nyb2xsWSAtIDU7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChib3R0b20gPCBoZWlnaHQoZG9jdW1lbnQpICYmIGJvdHRvbSA+IGhlaWdodCh3aW5kb3cpICsgdGhpcy5zY3JvbGxZKSB7XG4gICAgICAgICAgICAgICAgICAgIHNjcm9sbCA9IHRoaXMuc2Nyb2xsWSArIDU7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgc2Nyb2xsICYmIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgeyByZXR1cm4gc2Nyb2xsVG9wKHdpbmRvdywgc2Nyb2xsKTsgfSwgNSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgfSxcblxuICAgICAgICBtZXRob2RzOiB7XG5cbiAgICAgICAgICAgIGluaXQ6IGZ1bmN0aW9uKGUpIHtcblxuICAgICAgICAgICAgICAgIHZhciB0YXJnZXQgPSBlLnRhcmdldDtcbiAgICAgICAgICAgICAgICB2YXIgYnV0dG9uID0gZS5idXR0b247XG4gICAgICAgICAgICAgICAgdmFyIGRlZmF1bHRQcmV2ZW50ZWQgPSBlLmRlZmF1bHRQcmV2ZW50ZWQ7XG4gICAgICAgICAgICAgICAgdmFyIHJlZiA9IHRvTm9kZXModGhpcy4kZWwuY2hpbGRyZW4pLmZpbHRlcihmdW5jdGlvbiAoZWwpIHsgcmV0dXJuIHdpdGhpbih0YXJnZXQsIGVsKTsgfSk7XG4gICAgICAgICAgICAgICAgdmFyIHBsYWNlaG9sZGVyID0gcmVmWzBdO1xuXG4gICAgICAgICAgICAgICAgaWYgKCFwbGFjZWhvbGRlclxuICAgICAgICAgICAgICAgICAgICB8fCBpc0lucHV0KHRhcmdldClcbiAgICAgICAgICAgICAgICAgICAgfHwgdGhpcy5oYW5kbGUgJiYgIXdpdGhpbih0YXJnZXQsIHRoaXMuaGFuZGxlKVxuICAgICAgICAgICAgICAgICAgICB8fCBidXR0b24gPiAwXG4gICAgICAgICAgICAgICAgICAgIHx8IHdpdGhpbih0YXJnZXQsIChcIi5cIiArICh0aGlzLmNsc05vRHJhZykpKVxuICAgICAgICAgICAgICAgICAgICB8fCBkZWZhdWx0UHJldmVudGVkXG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICAgICAgICAgICAgICB0aGlzLnRvdWNoZWQgPSBbdGhpc107XG4gICAgICAgICAgICAgICAgdGhpcy5wbGFjZWhvbGRlciA9IHBsYWNlaG9sZGVyO1xuICAgICAgICAgICAgICAgIHRoaXMub3JpZ2luID0gYXNzaWduKHt0YXJnZXQ6IHRhcmdldCwgaW5kZXg6IGluZGV4KHBsYWNlaG9sZGVyKX0sIHRoaXMucG9zKTtcblxuICAgICAgICAgICAgICAgIG9uKGRvY3VtZW50LCBwb2ludGVyTW92ZSwgdGhpcy5tb3ZlKTtcbiAgICAgICAgICAgICAgICBvbihkb2N1bWVudCwgcG9pbnRlclVwLCB0aGlzLmVuZCk7XG4gICAgICAgICAgICAgICAgb24od2luZG93LCAnc2Nyb2xsJywgdGhpcy5zY3JvbGwpO1xuXG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLnRocmVzaG9sZCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnN0YXJ0KGUpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgc3RhcnQ6IGZ1bmN0aW9uKGUpIHtcblxuICAgICAgICAgICAgICAgIHRoaXMuZHJhZyA9IGFwcGVuZCh0aGlzLiRjb250YWluZXIsIHRoaXMucGxhY2Vob2xkZXIub3V0ZXJIVE1MLnJlcGxhY2UoL148bGkvaSwgJzxkaXYnKS5yZXBsYWNlKC9saT4kL2ksICdkaXY+JykpO1xuXG4gICAgICAgICAgICAgICAgY3NzKHRoaXMuZHJhZywgYXNzaWduKHtcbiAgICAgICAgICAgICAgICAgICAgYm94U2l6aW5nOiAnYm9yZGVyLWJveCcsXG4gICAgICAgICAgICAgICAgICAgIHdpZHRoOiB0aGlzLnBsYWNlaG9sZGVyLm9mZnNldFdpZHRoLFxuICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6IHRoaXMucGxhY2Vob2xkZXIub2Zmc2V0SGVpZ2h0XG4gICAgICAgICAgICAgICAgfSwgY3NzKHRoaXMucGxhY2Vob2xkZXIsIFsncGFkZGluZ0xlZnQnLCAncGFkZGluZ1JpZ2h0JywgJ3BhZGRpbmdUb3AnLCAncGFkZGluZ0JvdHRvbSddKSkpO1xuICAgICAgICAgICAgICAgIGF0dHIodGhpcy5kcmFnLCAndWstbm8tYm9vdCcsICcnKTtcbiAgICAgICAgICAgICAgICBhZGRDbGFzcyh0aGlzLmRyYWcsIHRoaXMuY2xzRHJhZywgdGhpcy5jbHNDdXN0b20pO1xuXG4gICAgICAgICAgICAgICAgaGVpZ2h0KHRoaXMuZHJhZy5maXJzdEVsZW1lbnRDaGlsZCwgaGVpZ2h0KHRoaXMucGxhY2Vob2xkZXIuZmlyc3RFbGVtZW50Q2hpbGQpKTtcblxuICAgICAgICAgICAgICAgIHZhciByZWYgPSBvZmZzZXQodGhpcy5wbGFjZWhvbGRlcik7XG4gICAgICAgICAgICAgICAgdmFyIGxlZnQgPSByZWYubGVmdDtcbiAgICAgICAgICAgICAgICB2YXIgdG9wID0gcmVmLnRvcDtcbiAgICAgICAgICAgICAgICBhc3NpZ24odGhpcy5vcmlnaW4sIHtsZWZ0OiBsZWZ0IC0gdGhpcy5wb3MueCwgdG9wOiB0b3AgLSB0aGlzLnBvcy55fSk7XG5cbiAgICAgICAgICAgICAgICBhZGRDbGFzcyh0aGlzLnBsYWNlaG9sZGVyLCB0aGlzLmNsc1BsYWNlaG9sZGVyKTtcbiAgICAgICAgICAgICAgICBhZGRDbGFzcyh0aGlzLiRlbC5jaGlsZHJlbiwgdGhpcy5jbHNJdGVtKTtcbiAgICAgICAgICAgICAgICBhZGRDbGFzcyhkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsIHRoaXMuY2xzRHJhZ1N0YXRlKTtcblxuICAgICAgICAgICAgICAgIHRyaWdnZXIodGhpcy4kZWwsICdzdGFydCcsIFt0aGlzLCB0aGlzLnBsYWNlaG9sZGVyXSk7XG5cbiAgICAgICAgICAgICAgICB0aGlzLm1vdmUoZSk7XG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICBtb3ZlOiBmdW5jdGlvbihlKSB7XG5cbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuZHJhZykge1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChNYXRoLmFicyh0aGlzLnBvcy54IC0gdGhpcy5vcmlnaW4ueCkgPiB0aGlzLnRocmVzaG9sZCB8fCBNYXRoLmFicyh0aGlzLnBvcy55IC0gdGhpcy5vcmlnaW4ueSkgPiB0aGlzLnRocmVzaG9sZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zdGFydChlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB0aGlzLiRlbWl0KCk7XG5cbiAgICAgICAgICAgICAgICB2YXIgdGFyZ2V0ID0gZS50eXBlID09PSAnbW91c2Vtb3ZlJyA/IGUudGFyZ2V0IDogZG9jdW1lbnQuZWxlbWVudEZyb21Qb2ludCh0aGlzLnBvcy54IC0gd2luZG93LnBhZ2VYT2Zmc2V0LCB0aGlzLnBvcy55IC0gd2luZG93LnBhZ2VZT2Zmc2V0KTtcblxuICAgICAgICAgICAgICAgIHZhciBzb3J0YWJsZSA9IHRoaXMuZ2V0U29ydGFibGUodGFyZ2V0KTtcbiAgICAgICAgICAgICAgICB2YXIgcHJldmlvdXMgPSB0aGlzLmdldFNvcnRhYmxlKHRoaXMucGxhY2Vob2xkZXIpO1xuICAgICAgICAgICAgICAgIHZhciBtb3ZlID0gc29ydGFibGUgIT09IHByZXZpb3VzO1xuXG4gICAgICAgICAgICAgICAgaWYgKCFzb3J0YWJsZSB8fCB3aXRoaW4odGFyZ2V0LCB0aGlzLnBsYWNlaG9sZGVyKSB8fCBtb3ZlICYmICghc29ydGFibGUuZ3JvdXAgfHwgc29ydGFibGUuZ3JvdXAgIT09IHByZXZpb3VzLmdyb3VwKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgdGFyZ2V0ID0gc29ydGFibGUuJGVsID09PSB0YXJnZXQucGFyZW50Tm9kZSAmJiB0YXJnZXQgfHwgdG9Ob2Rlcyhzb3J0YWJsZS4kZWwuY2hpbGRyZW4pLmZpbHRlcihmdW5jdGlvbiAoZWxlbWVudCkgeyByZXR1cm4gd2l0aGluKHRhcmdldCwgZWxlbWVudCk7IH0pWzBdO1xuXG4gICAgICAgICAgICAgICAgaWYgKG1vdmUpIHtcbiAgICAgICAgICAgICAgICAgICAgcHJldmlvdXMucmVtb3ZlKHRoaXMucGxhY2Vob2xkZXIpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIXRhcmdldCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgc29ydGFibGUuaW5zZXJ0KHRoaXMucGxhY2Vob2xkZXIsIHRhcmdldCk7XG5cbiAgICAgICAgICAgICAgICBpZiAoIWluY2x1ZGVzKHRoaXMudG91Y2hlZCwgc29ydGFibGUpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudG91Y2hlZC5wdXNoKHNvcnRhYmxlKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIGVuZDogZnVuY3Rpb24oZSkge1xuXG4gICAgICAgICAgICAgICAgb2ZmKGRvY3VtZW50LCBwb2ludGVyTW92ZSwgdGhpcy5tb3ZlKTtcbiAgICAgICAgICAgICAgICBvZmYoZG9jdW1lbnQsIHBvaW50ZXJVcCwgdGhpcy5lbmQpO1xuICAgICAgICAgICAgICAgIG9mZih3aW5kb3csICdzY3JvbGwnLCB0aGlzLnNjcm9sbCk7XG5cbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuZHJhZykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZS50eXBlID09PSAndG91Y2hlbmQnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBlLnRhcmdldC5jbGljaygpO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHByZXZlbnRDbGljaygpO1xuXG4gICAgICAgICAgICAgICAgdmFyIHNvcnRhYmxlID0gdGhpcy5nZXRTb3J0YWJsZSh0aGlzLnBsYWNlaG9sZGVyKTtcblxuICAgICAgICAgICAgICAgIGlmICh0aGlzID09PSBzb3J0YWJsZSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5vcmlnaW4uaW5kZXggIT09IGluZGV4KHRoaXMucGxhY2Vob2xkZXIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0cmlnZ2VyKHRoaXMuJGVsLCAnbW92ZWQnLCBbdGhpcywgdGhpcy5wbGFjZWhvbGRlcl0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdHJpZ2dlcihzb3J0YWJsZS4kZWwsICdhZGRlZCcsIFtzb3J0YWJsZSwgdGhpcy5wbGFjZWhvbGRlcl0pO1xuICAgICAgICAgICAgICAgICAgICB0cmlnZ2VyKHRoaXMuJGVsLCAncmVtb3ZlZCcsIFt0aGlzLCB0aGlzLnBsYWNlaG9sZGVyXSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgdHJpZ2dlcih0aGlzLiRlbCwgJ3N0b3AnLCBbdGhpcywgdGhpcy5wbGFjZWhvbGRlcl0pO1xuXG4gICAgICAgICAgICAgICAgcmVtb3ZlKHRoaXMuZHJhZyk7XG4gICAgICAgICAgICAgICAgdGhpcy5kcmFnID0gbnVsbDtcblxuICAgICAgICAgICAgICAgIHZhciBjbGFzc2VzID0gdGhpcy50b3VjaGVkLm1hcChmdW5jdGlvbiAoc29ydGFibGUpIHsgcmV0dXJuICgoc29ydGFibGUuY2xzUGxhY2Vob2xkZXIpICsgXCIgXCIgKyAoc29ydGFibGUuY2xzSXRlbSkpOyB9KS5qb2luKCcgJyk7XG4gICAgICAgICAgICAgICAgdGhpcy50b3VjaGVkLmZvckVhY2goZnVuY3Rpb24gKHNvcnRhYmxlKSB7IHJldHVybiByZW1vdmVDbGFzcyhzb3J0YWJsZS4kZWwuY2hpbGRyZW4sIGNsYXNzZXMpOyB9KTtcblxuICAgICAgICAgICAgICAgIHJlbW92ZUNsYXNzKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCwgdGhpcy5jbHNEcmFnU3RhdGUpO1xuXG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICBzY3JvbGw6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIHZhciBzY3JvbGwgPSB3aW5kb3cucGFnZVlPZmZzZXQ7XG4gICAgICAgICAgICAgICAgaWYgKHNjcm9sbCAhPT0gdGhpcy5zY3JvbGxZKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucG9zLnkgKz0gc2Nyb2xsIC0gdGhpcy5zY3JvbGxZO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNjcm9sbFkgPSBzY3JvbGw7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuJGVtaXQoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICBpbnNlcnQ6IGZ1bmN0aW9uKGVsZW1lbnQsIHRhcmdldCkge1xuICAgICAgICAgICAgICAgIHZhciB0aGlzJDEgPSB0aGlzO1xuXG5cbiAgICAgICAgICAgICAgICBhZGRDbGFzcyh0aGlzLiRlbC5jaGlsZHJlbiwgdGhpcy5jbHNJdGVtKTtcblxuICAgICAgICAgICAgICAgIHZhciBpbnNlcnQgPSBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHRhcmdldCkge1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXdpdGhpbihlbGVtZW50LCB0aGlzJDEuJGVsKSB8fCBpc1ByZWRlY2Vzc29yKGVsZW1lbnQsIHRhcmdldCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZWZvcmUodGFyZ2V0LCBlbGVtZW50KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWZ0ZXIodGFyZ2V0LCBlbGVtZW50KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kKHRoaXMkMS4kZWwsIGVsZW1lbnQpO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuYW5pbWF0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYW5pbWF0ZShpbnNlcnQpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGluc2VydCgpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgcmVtb3ZlOiBmdW5jdGlvbihlbGVtZW50KSB7XG5cbiAgICAgICAgICAgICAgICBpZiAoIXdpdGhpbihlbGVtZW50LCB0aGlzLiRlbCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmFuaW1hdGlvbikge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmFuaW1hdGUoZnVuY3Rpb24gKCkgeyByZXR1cm4gcmVtb3ZlKGVsZW1lbnQpOyB9KTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZW1vdmUoZWxlbWVudCk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICBnZXRTb3J0YWJsZTogZnVuY3Rpb24oZWxlbWVudCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBlbGVtZW50ICYmICh0aGlzLiRnZXRDb21wb25lbnQoZWxlbWVudCwgJ3NvcnRhYmxlJykgfHwgdGhpcy5nZXRTb3J0YWJsZShlbGVtZW50LnBhcmVudE5vZGUpKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICB9XG5cbiAgICB9O1xuXG4gICAgZnVuY3Rpb24gaXNQcmVkZWNlc3NvcihlbGVtZW50LCB0YXJnZXQpIHtcbiAgICAgICAgcmV0dXJuIGVsZW1lbnQucGFyZW50Tm9kZSA9PT0gdGFyZ2V0LnBhcmVudE5vZGUgJiYgaW5kZXgoZWxlbWVudCkgPiBpbmRleCh0YXJnZXQpO1xuICAgIH1cblxuICAgIHZhciBvYmokMTtcblxuICAgIHZhciBhY3RpdmVzID0gW107XG5cbiAgICB2YXIgVG9vbHRpcCA9IHtcblxuICAgICAgICBtaXhpbnM6IFtDb250YWluZXIsIFRvZ2dsYWJsZSwgUG9zaXRpb25dLFxuXG4gICAgICAgIGFyZ3M6ICd0aXRsZScsXG5cbiAgICAgICAgcHJvcHM6IHtcbiAgICAgICAgICAgIGRlbGF5OiBOdW1iZXIsXG4gICAgICAgICAgICB0aXRsZTogU3RyaW5nXG4gICAgICAgIH0sXG5cbiAgICAgICAgZGF0YToge1xuICAgICAgICAgICAgcG9zOiAndG9wJyxcbiAgICAgICAgICAgIHRpdGxlOiAnJyxcbiAgICAgICAgICAgIGRlbGF5OiAwLFxuICAgICAgICAgICAgYW5pbWF0aW9uOiBbJ3VrLWFuaW1hdGlvbi1zY2FsZS11cCddLFxuICAgICAgICAgICAgZHVyYXRpb246IDEwMCxcbiAgICAgICAgICAgIGNsczogJ3VrLWFjdGl2ZScsXG4gICAgICAgICAgICBjbHNQb3M6ICd1ay10b29sdGlwJ1xuICAgICAgICB9LFxuXG4gICAgICAgIGJlZm9yZUNvbm5lY3Q6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgdGhpcy5faGFzVGl0bGUgPSBoYXNBdHRyKHRoaXMuJGVsLCAndGl0bGUnKTtcbiAgICAgICAgICAgIGF0dHIodGhpcy4kZWwsIHt0aXRsZTogJycsICdhcmlhLWV4cGFuZGVkJzogZmFsc2V9KTtcbiAgICAgICAgfSxcblxuICAgICAgICBkaXNjb25uZWN0ZWQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgdGhpcy5oaWRlKCk7XG4gICAgICAgICAgICBhdHRyKHRoaXMuJGVsLCB7dGl0bGU6IHRoaXMuX2hhc1RpdGxlID8gdGhpcy50aXRsZSA6IG51bGwsICdhcmlhLWV4cGFuZGVkJzogbnVsbH0pO1xuICAgICAgICB9LFxuXG4gICAgICAgIG1ldGhvZHM6IHtcblxuICAgICAgICAgICAgc2hvdzogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgdmFyIHRoaXMkMSA9IHRoaXM7XG5cblxuICAgICAgICAgICAgICAgIGlmIChpbmNsdWRlcyhhY3RpdmVzLCB0aGlzKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgYWN0aXZlcy5mb3JFYWNoKGZ1bmN0aW9uIChhY3RpdmUpIHsgcmV0dXJuIGFjdGl2ZS5oaWRlKCk7IH0pO1xuICAgICAgICAgICAgICAgIGFjdGl2ZXMucHVzaCh0aGlzKTtcblxuICAgICAgICAgICAgICAgIHRoaXMuX3VuYmluZCA9IG9uKGRvY3VtZW50LCBwb2ludGVyVXAsIGZ1bmN0aW9uIChlKSB7IHJldHVybiAhd2l0aGluKGUudGFyZ2V0LCB0aGlzJDEuJGVsKSAmJiB0aGlzJDEuaGlkZSgpOyB9KTtcblxuICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aGlzLnNob3dUaW1lcik7XG4gICAgICAgICAgICAgICAgdGhpcy5zaG93VGltZXIgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcyQxLl9zaG93KCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMkMS5oaWRlVGltZXIgPSBzZXRJbnRlcnZhbChmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaXNWaXNpYmxlKHRoaXMkMS4kZWwpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcyQxLmhpZGUoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICB9LCAxNTApO1xuICAgICAgICAgICAgICAgIH0sIHRoaXMuZGVsYXkpO1xuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgaGlkZTogZnVuY3Rpb24oKSB7XG5cbiAgICAgICAgICAgICAgICB2YXIgaW5kZXgkJDEgPSBhY3RpdmVzLmluZGV4T2YodGhpcyk7XG5cbiAgICAgICAgICAgICAgICBpZiAoIX5pbmRleCQkMSB8fCBtYXRjaGVzKHRoaXMuJGVsLCAnaW5wdXQnKSAmJiB0aGlzLiRlbCA9PT0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgYWN0aXZlcy5zcGxpY2UoaW5kZXgkJDEsIDEpO1xuXG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuc2hvd1RpbWVyKTtcbiAgICAgICAgICAgICAgICBjbGVhckludGVydmFsKHRoaXMuaGlkZVRpbWVyKTtcbiAgICAgICAgICAgICAgICBhdHRyKHRoaXMuJGVsLCAnYXJpYS1leHBhbmRlZCcsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICB0aGlzLnRvZ2dsZUVsZW1lbnQodGhpcy50b29sdGlwLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgdGhpcy50b29sdGlwICYmIHJlbW92ZSh0aGlzLnRvb2x0aXApO1xuICAgICAgICAgICAgICAgIHRoaXMudG9vbHRpcCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIHRoaXMuX3VuYmluZCgpO1xuXG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICBfc2hvdzogZnVuY3Rpb24oKSB7XG5cbiAgICAgICAgICAgICAgICB0aGlzLnRvb2x0aXAgPSBhcHBlbmQodGhpcy5jb250YWluZXIsXG4gICAgICAgICAgICAgICAgICAgIChcIjxkaXYgY2xhc3M9XFxcIlwiICsgKHRoaXMuY2xzUG9zKSArIFwiXFxcIiBhcmlhLWV4cGFuZGVkPVxcXCJ0cnVlXFxcIiBhcmlhLWhpZGRlbj4gPGRpdiBjbGFzcz1cXFwiXCIgKyAodGhpcy5jbHNQb3MpICsgXCItaW5uZXJcXFwiPlwiICsgKHRoaXMudGl0bGUpICsgXCI8L2Rpdj4gPC9kaXY+XCIpXG4gICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgIHRoaXMucG9zaXRpb25BdCh0aGlzLnRvb2x0aXAsIHRoaXMuJGVsKTtcblxuICAgICAgICAgICAgICAgIHRoaXMub3JpZ2luID0gdGhpcy5nZXRBeGlzKCkgPT09ICd5J1xuICAgICAgICAgICAgICAgICAgICA/ICgoZmxpcFBvc2l0aW9uKHRoaXMuZGlyKSkgKyBcIi1cIiArICh0aGlzLmFsaWduKSlcbiAgICAgICAgICAgICAgICAgICAgOiAoKHRoaXMuYWxpZ24pICsgXCItXCIgKyAoZmxpcFBvc2l0aW9uKHRoaXMuZGlyKSkpO1xuXG4gICAgICAgICAgICAgICAgdGhpcy50b2dnbGVFbGVtZW50KHRoaXMudG9vbHRpcCwgdHJ1ZSk7XG5cbiAgICAgICAgICAgIH1cblxuICAgICAgICB9LFxuXG4gICAgICAgIGV2ZW50czogKCBvYmokMSA9IHt9LCBvYmokMVsoXCJmb2N1cyBcIiArIHBvaW50ZXJFbnRlciArIFwiIFwiICsgcG9pbnRlckRvd24pXSA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICAgICAgaWYgKGUudHlwZSAhPT0gcG9pbnRlckRvd24gfHwgIWlzVG91Y2goZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zaG93KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSwgb2JqJDEuYmx1ciA9ICdoaWRlJywgb2JqJDFbcG9pbnRlckxlYXZlXSA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFpc1RvdWNoKGUpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaGlkZSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sIG9iaiQxIClcblxuICAgIH07XG5cbiAgICB2YXIgVXBsb2FkID0ge1xuXG4gICAgICAgIHByb3BzOiB7XG4gICAgICAgICAgICBhbGxvdzogU3RyaW5nLFxuICAgICAgICAgICAgY2xzRHJhZ292ZXI6IFN0cmluZyxcbiAgICAgICAgICAgIGNvbmN1cnJlbnQ6IE51bWJlcixcbiAgICAgICAgICAgIG1heFNpemU6IE51bWJlcixcbiAgICAgICAgICAgIG1ldGhvZDogU3RyaW5nLFxuICAgICAgICAgICAgbWltZTogU3RyaW5nLFxuICAgICAgICAgICAgbXNnSW52YWxpZE1pbWU6IFN0cmluZyxcbiAgICAgICAgICAgIG1zZ0ludmFsaWROYW1lOiBTdHJpbmcsXG4gICAgICAgICAgICBtc2dJbnZhbGlkU2l6ZTogU3RyaW5nLFxuICAgICAgICAgICAgbXVsdGlwbGU6IEJvb2xlYW4sXG4gICAgICAgICAgICBuYW1lOiBTdHJpbmcsXG4gICAgICAgICAgICBwYXJhbXM6IE9iamVjdCxcbiAgICAgICAgICAgIHR5cGU6IFN0cmluZyxcbiAgICAgICAgICAgIHVybDogU3RyaW5nLFxuICAgICAgICB9LFxuXG4gICAgICAgIGRhdGE6IHtcbiAgICAgICAgICAgIGFsbG93OiBmYWxzZSxcbiAgICAgICAgICAgIGNsc0RyYWdvdmVyOiAndWstZHJhZ292ZXInLFxuICAgICAgICAgICAgY29uY3VycmVudDogMSxcbiAgICAgICAgICAgIG1heFNpemU6IDAsXG4gICAgICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgICAgIG1pbWU6IGZhbHNlLFxuICAgICAgICAgICAgbXNnSW52YWxpZE1pbWU6ICdJbnZhbGlkIEZpbGUgVHlwZTogJXMnLFxuICAgICAgICAgICAgbXNnSW52YWxpZE5hbWU6ICdJbnZhbGlkIEZpbGUgTmFtZTogJXMnLFxuICAgICAgICAgICAgbXNnSW52YWxpZFNpemU6ICdJbnZhbGlkIEZpbGUgU2l6ZTogJXMgS2lsb2J5dGVzIE1heCcsXG4gICAgICAgICAgICBtdWx0aXBsZTogZmFsc2UsXG4gICAgICAgICAgICBuYW1lOiAnZmlsZXNbXScsXG4gICAgICAgICAgICBwYXJhbXM6IHt9LFxuICAgICAgICAgICAgdHlwZTogJycsXG4gICAgICAgICAgICB1cmw6ICcnLFxuICAgICAgICAgICAgYWJvcnQ6IG5vb3AsXG4gICAgICAgICAgICBiZWZvcmVBbGw6IG5vb3AsXG4gICAgICAgICAgICBiZWZvcmVTZW5kOiBub29wLFxuICAgICAgICAgICAgY29tcGxldGU6IG5vb3AsXG4gICAgICAgICAgICBjb21wbGV0ZUFsbDogbm9vcCxcbiAgICAgICAgICAgIGVycm9yOiBub29wLFxuICAgICAgICAgICAgZmFpbDogbm9vcCxcbiAgICAgICAgICAgIGxvYWQ6IG5vb3AsXG4gICAgICAgICAgICBsb2FkRW5kOiBub29wLFxuICAgICAgICAgICAgbG9hZFN0YXJ0OiBub29wLFxuICAgICAgICAgICAgcHJvZ3Jlc3M6IG5vb3BcbiAgICAgICAgfSxcblxuICAgICAgICBldmVudHM6IHtcblxuICAgICAgICAgICAgY2hhbmdlOiBmdW5jdGlvbihlKSB7XG5cbiAgICAgICAgICAgICAgICBpZiAoIW1hdGNoZXMoZS50YXJnZXQsICdpbnB1dFt0eXBlPVwiZmlsZVwiXScpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICAgICAgICAgICAgICBpZiAoZS50YXJnZXQuZmlsZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy51cGxvYWQoZS50YXJnZXQuZmlsZXMpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGUudGFyZ2V0LnZhbHVlID0gJyc7XG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICBkcm9wOiBmdW5jdGlvbihlKSB7XG4gICAgICAgICAgICAgICAgc3RvcChlKTtcblxuICAgICAgICAgICAgICAgIHZhciB0cmFuc2ZlciA9IGUuZGF0YVRyYW5zZmVyO1xuXG4gICAgICAgICAgICAgICAgaWYgKCF0cmFuc2ZlciB8fCAhdHJhbnNmZXIuZmlsZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHJlbW92ZUNsYXNzKHRoaXMuJGVsLCB0aGlzLmNsc0RyYWdvdmVyKTtcblxuICAgICAgICAgICAgICAgIHRoaXMudXBsb2FkKHRyYW5zZmVyLmZpbGVzKTtcbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIGRyYWdlbnRlcjogZnVuY3Rpb24oZSkge1xuICAgICAgICAgICAgICAgIHN0b3AoZSk7XG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICBkcmFnb3ZlcjogZnVuY3Rpb24oZSkge1xuICAgICAgICAgICAgICAgIHN0b3AoZSk7XG4gICAgICAgICAgICAgICAgYWRkQ2xhc3ModGhpcy4kZWwsIHRoaXMuY2xzRHJhZ292ZXIpO1xuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgZHJhZ2xlYXZlOiBmdW5jdGlvbihlKSB7XG4gICAgICAgICAgICAgICAgc3RvcChlKTtcbiAgICAgICAgICAgICAgICByZW1vdmVDbGFzcyh0aGlzLiRlbCwgdGhpcy5jbHNEcmFnb3Zlcik7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgfSxcblxuICAgICAgICBtZXRob2RzOiB7XG5cbiAgICAgICAgICAgIHVwbG9hZDogZnVuY3Rpb24oZmlsZXMpIHtcbiAgICAgICAgICAgICAgICB2YXIgdGhpcyQxID0gdGhpcztcblxuXG4gICAgICAgICAgICAgICAgaWYgKCFmaWxlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHRyaWdnZXIodGhpcy4kZWwsICd1cGxvYWQnLCBbZmlsZXNdKTtcblxuICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZmlsZXMubGVuZ3RoOyBpKyspIHtcblxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5tYXhTaXplICYmIHRoaXMubWF4U2l6ZSAqIDEwMDAgPCBmaWxlc1tpXS5zaXplKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmZhaWwodGhpcy5tc2dJbnZhbGlkU2l6ZS5yZXBsYWNlKCclcycsIHRoaXMubWF4U2l6ZSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuYWxsb3cgJiYgIW1hdGNoJDEodGhpcy5hbGxvdywgZmlsZXNbaV0ubmFtZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZmFpbCh0aGlzLm1zZ0ludmFsaWROYW1lLnJlcGxhY2UoJyVzJywgdGhpcy5hbGxvdykpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMubWltZSAmJiAhbWF0Y2gkMSh0aGlzLm1pbWUsIGZpbGVzW2ldLnR5cGUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmZhaWwodGhpcy5tc2dJbnZhbGlkTWltZS5yZXBsYWNlKCclcycsIHRoaXMubWltZSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMubXVsdGlwbGUpIHtcbiAgICAgICAgICAgICAgICAgICAgZmlsZXMgPSBbZmlsZXNbMF1dO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHRoaXMuYmVmb3JlQWxsKHRoaXMsIGZpbGVzKTtcblxuICAgICAgICAgICAgICAgIHZhciBjaHVua3MgPSBjaHVuayhmaWxlcywgdGhpcy5jb25jdXJyZW50KTtcbiAgICAgICAgICAgICAgICB2YXIgdXBsb2FkID0gZnVuY3Rpb24gKGZpbGVzKSB7XG5cbiAgICAgICAgICAgICAgICAgICAgdmFyIGRhdGEkJDEgPSBuZXcgRm9ybURhdGEoKTtcblxuICAgICAgICAgICAgICAgICAgICBmaWxlcy5mb3JFYWNoKGZ1bmN0aW9uIChmaWxlKSB7IHJldHVybiBkYXRhJCQxLmFwcGVuZCh0aGlzJDEubmFtZSwgZmlsZSk7IH0pO1xuXG4gICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGtleSBpbiB0aGlzJDEucGFyYW1zKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRhJCQxLmFwcGVuZChrZXksIHRoaXMkMS5wYXJhbXNba2V5XSk7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBhamF4KHRoaXMkMS51cmwsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGE6IGRhdGEkJDEsXG4gICAgICAgICAgICAgICAgICAgICAgICBtZXRob2Q6IHRoaXMkMS5tZXRob2QsXG4gICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZVR5cGU6IHRoaXMkMS50eXBlLFxuICAgICAgICAgICAgICAgICAgICAgICAgYmVmb3JlU2VuZDogZnVuY3Rpb24gKGVudikge1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHhociA9IGVudi54aHI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgeGhyLnVwbG9hZCAmJiBvbih4aHIudXBsb2FkLCAncHJvZ3Jlc3MnLCB0aGlzJDEucHJvZ3Jlc3MpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsnbG9hZFN0YXJ0JywgJ2xvYWQnLCAnbG9hZEVuZCcsICdhYm9ydCddLmZvckVhY2goZnVuY3Rpb24gKHR5cGUpIHsgcmV0dXJuIG9uKHhociwgdHlwZS50b0xvd2VyQ2FzZSgpLCB0aGlzJDFbdHlwZV0pOyB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMkMS5iZWZvcmVTZW5kKGVudik7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSkudGhlbihcbiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uICh4aHIpIHtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMkMS5jb21wbGV0ZSh4aHIpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNodW5rcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBsb2FkKGNodW5rcy5zaGlmdCgpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzJDEuY29tcGxldGVBbGwoeGhyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAoZSkgeyByZXR1cm4gdGhpcyQxLmVycm9yKGUpOyB9XG4gICAgICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgdXBsb2FkKGNodW5rcy5zaGlmdCgpKTtcblxuICAgICAgICAgICAgfVxuXG4gICAgICAgIH1cblxuICAgIH07XG5cbiAgICBmdW5jdGlvbiBtYXRjaCQxKHBhdHRlcm4sIHBhdGgpIHtcbiAgICAgICAgcmV0dXJuIHBhdGgubWF0Y2gobmV3IFJlZ0V4cCgoXCJeXCIgKyAocGF0dGVybi5yZXBsYWNlKC9cXC8vZywgJ1xcXFwvJykucmVwbGFjZSgvXFwqXFwqL2csICcoXFxcXC9bXlxcXFwvXSspKicpLnJlcGxhY2UoL1xcKi9nLCAnW15cXFxcL10rJykucmVwbGFjZSgvKCg/IVxcXFwpKVxcPy9nLCAnJDEuJykpICsgXCIkXCIpLCAnaScpKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjaHVuayhmaWxlcywgc2l6ZSkge1xuICAgICAgICB2YXIgY2h1bmtzID0gW107XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZmlsZXMubGVuZ3RoOyBpICs9IHNpemUpIHtcbiAgICAgICAgICAgIHZhciBjaHVuayA9IFtdO1xuICAgICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBzaXplOyBqKyspIHtcbiAgICAgICAgICAgICAgICBjaHVuay5wdXNoKGZpbGVzW2kgKyBqXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjaHVua3MucHVzaChjaHVuayk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNodW5rcztcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBzdG9wKGUpIHtcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIH1cblxuICAgIFVJa2l0LmNvbXBvbmVudCgnY291bnRkb3duJywgQ291bnRkb3duKTtcbiAgICBVSWtpdC5jb21wb25lbnQoJ2ZpbHRlcicsIEZpbHRlcik7XG4gICAgVUlraXQuY29tcG9uZW50KCdsaWdodGJveCcsIExpZ2h0Ym94KTtcbiAgICBVSWtpdC5jb21wb25lbnQoJ2xpZ2h0Ym94UGFuZWwnLCBMaWdodGJveFBhbmVsKTtcbiAgICBVSWtpdC5jb21wb25lbnQoJ25vdGlmaWNhdGlvbicsIE5vdGlmaWNhdGlvbik7XG4gICAgVUlraXQuY29tcG9uZW50KCdwYXJhbGxheCcsIFBhcmFsbGF4JDEpO1xuICAgIFVJa2l0LmNvbXBvbmVudCgnc2xpZGVyJywgU2xpZGVyJDEpO1xuICAgIFVJa2l0LmNvbXBvbmVudCgnc2xpZGVyUGFyYWxsYXgnLCBTbGlkZXJQYXJhbGxheCk7XG4gICAgVUlraXQuY29tcG9uZW50KCdzbGlkZXNob3cnLCBTbGlkZXNob3ckMSk7XG4gICAgVUlraXQuY29tcG9uZW50KCdzbGlkZXNob3dQYXJhbGxheCcsIFNsaWRlclBhcmFsbGF4KTtcbiAgICBVSWtpdC5jb21wb25lbnQoJ3NvcnRhYmxlJywgU29ydGFibGUpO1xuICAgIFVJa2l0LmNvbXBvbmVudCgndG9vbHRpcCcsIFRvb2x0aXApO1xuICAgIFVJa2l0LmNvbXBvbmVudCgndXBsb2FkJywgVXBsb2FkKTtcblxuICAgIHtcbiAgICAgICAgYm9vdChVSWtpdCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIFVJa2l0O1xuXG59KSk7XG4iLCIvKiBnbG9iYWwgZG9jdW1lbnQsIHdpbmRvdyAqL1xuaW1wb3J0ICdiYWJlbC1wb2x5ZmlsbCc7XG5cbmltcG9ydCBVSWtpdCBmcm9tICd1aWtpdCc7XG5cbi8vIGltcG9ydCBJY29ucyBmcm9tICd1aWtpdC9kaXN0L2pzL3Vpa2l0LWljb25zJztcbmltcG9ydCBJY29ucyBmcm9tICcuL2ljb25zJztcbmltcG9ydCB7IE1vYmlsZU5hdmlnYXRpb24sIE1haW5OYXZpZ2F0aW9uIH0gZnJvbSAnLi9jb21wb25lbnRzL2hlYWRlcic7XG5pbXBvcnQgUGxhemFNb2JpbGVOYXYgZnJvbSAnLi9jb21wb25lbnRzL3BsYXphLWhlYWRlcic7XG5pbXBvcnQgY3JlYXRlUHJvZHVjdENhcm91c2VsIGZyb20gJy4vY29tcG9uZW50cy9wcm9kdWN0LWNhcm91c2VsJztcbmltcG9ydCBjcmVhdGVUZXh0U2Nyb2xsZXJzIGZyb20gJy4vY29tcG9uZW50cy90ZXh0LXNjcm9sbGVyJztcbmltcG9ydCBjcmVhdGVIZXJvQ2Fyb3VzZWwgZnJvbSAnLi9jb21wb25lbnRzL2hlcm8tY2Fyb3VzZWwnO1xuaW1wb3J0IGNyZWF0ZVNlYXJjaE1vZGFsIGZyb20gJy4vY29tcG9uZW50cy9zZWFyY2gtbW9kYWwnO1xuaW1wb3J0IGNyZWF0ZURpcmVjdGlvbnNNYXAgZnJvbSAnLi9jb21wb25lbnRzL2RpcmVjdGlvbnMtbWFwJztcbmltcG9ydCBjcmVhdGVIZXJvVmlkZW9zIGZyb20gJy4vY29tcG9uZW50cy9oZXJvLXZpZGVvJztcbmltcG9ydCBjcmVhdGVIZXJvU2xpZGVyIGZyb20gJy4vY29tcG9uZW50cy9oZXJvLXNsaWRlcic7XG5pbXBvcnQgY3JlYXRlSGVyb1Njcm9sbGVyIGZyb20gJy4vY29tcG9uZW50cy9oZXJvLXNjcm9sbGVyJztcbmltcG9ydCBjcmVhdGVDb250YWN0Rm9ybVZhbGlkYXRpb24gZnJvbSAnLi9jb21wb25lbnRzL2NvbnRhY3QtZm9ybS12YWxpZGF0aW9uJztcbmltcG9ydCBmb3JtVmFsaWRhdGlvbiBmcm9tICcuL2NvbXBvbmVudHMvZm9ybS12YWxpZGF0aW9uJztcbmltcG9ydCBjcmVhdGVHb29nbGVNYXAgZnJvbSAnLi9jb21wb25lbnRzL2dvb2dsZS1tYXAnO1xuaW1wb3J0IGNyZWF0ZVByb2R1Y3RTbGlkZXIgZnJvbSAnLi9jb21wb25lbnRzL3Byb2R1Y3Qtc2xpZGVyJztcbmltcG9ydCBjcmVhdGVNb3ZpZVNsaWRlciBmcm9tICcuL2NvbXBvbmVudHMvbW92aWUtc2xpZGVyJztcbmltcG9ydCBjcmVhdGVFdmVudEdyaWQgZnJvbSAnLi9jb21wb25lbnRzL2V2ZW50LWdyaWQnO1xuXG4vLyBsb2FkcyB0aGUgSWNvbiBwbHVnaW5cblVJa2l0LnVzZShJY29ucyk7XG5cbi8vIGFkZCB1aWtpdCBnbG9iYWxseVxud2luZG93LlVJa2l0ID0gVUlraXQ7XG5cbi8vIGxvYWQgY3VzdG9tIGNvbXBvbmVudHMgaGVyZVxud2luZG93LnZhbGlkYXRlRm9ybSA9IGZvcm1WYWxpZGF0aW9uO1xuXG5kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdET01Db250ZW50TG9hZGVkJywgKCkgPT4ge1xuICAvLyBpbml0aWFsaXNlIG1vYmlsZSBuYXZpZ2F0aW9uXG4gIGNvbnN0IG1vYmlsZU5hdiA9IG5ldyBNb2JpbGVOYXZpZ2F0aW9uKCk7XG4gIG1vYmlsZU5hdi5pbml0KCk7XG5cbiAgY29uc3QgbWFpbk5hdiA9IG5ldyBNYWluTmF2aWdhdGlvbigpO1xuICBtYWluTmF2LmluaXQoKTtcblxuICBjb25zdCBwbGF6YU1vYmlsZU5hdiA9IG5ldyBQbGF6YU1vYmlsZU5hdigpO1xuICBwbGF6YU1vYmlsZU5hdi5pbml0KCk7XG5cbiAgY3JlYXRlVGV4dFNjcm9sbGVycygpO1xuXG4gIGNyZWF0ZVByb2R1Y3RDYXJvdXNlbCgpO1xuXG4gIGNyZWF0ZVByb2R1Y3RTbGlkZXIoKTtcblxuICBjcmVhdGVIZXJvQ2Fyb3VzZWwoKTtcblxuICBjcmVhdGVTZWFyY2hNb2RhbCgpO1xuXG4gIGNyZWF0ZURpcmVjdGlvbnNNYXAoKTtcblxuICBjcmVhdGVIZXJvVmlkZW9zKCk7XG5cbiAgY3JlYXRlSGVyb1NsaWRlcigpO1xuXG4gIGNyZWF0ZUhlcm9TY3JvbGxlcigpO1xuXG4gIGNyZWF0ZUNvbnRhY3RGb3JtVmFsaWRhdGlvbigpO1xuXG4gIGNyZWF0ZUdvb2dsZU1hcCgpO1xuXG4gIGNyZWF0ZU1vdmllU2xpZGVyKCk7XG5cbiAgY3JlYXRlRXZlbnRHcmlkKCk7XG59KTtcbiIsIi8qIGdsb2JhbCBkb2N1bWVudCwgRm9ybURhdGEgKi9cbmltcG9ydCBheGlvcyBmcm9tICdheGlvcyc7XG5cbmNvbnN0IHBvc3RVUkwgPSAnL0FGR0dlbmVyaWNBc3luY2hyb25vdXNGb3JtSGFuZGxlci9hc3luY2hyb25vdXNTZXJ2bGV0LmRvJztcblxuY2xhc3MgQ29udGFjdEZvcm1WYWxpZGF0aW9uIHtcbiAgY29uc3RydWN0b3IoY29udGFjdEZvcm1Db250YWluZXIpIHtcbiAgICB0aGlzLmNvbnRhaW5lciA9IGNvbnRhY3RGb3JtQ29udGFpbmVyO1xuICAgIHRoaXMuZXJyb3JzID0gW107XG4gICAgdGhpcy5mb3JtU3VibWl0dGVkID0gZmFsc2U7XG4gIH1cblxuICBpbml0KCkge1xuICAgIHRoaXMuZmlyc3ROYW1lID0gdGhpcy5jb250YWluZXIucXVlcnlTZWxlY3RvcignLmpzLWZpcnN0TmFtZScpO1xuICAgIHRoaXMubGFzdE5hbWUgPSB0aGlzLmNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCcuanMtbGFzdE5hbWUnKTtcbiAgICB0aGlzLmVtYWlsQWRkcmVzcyA9IHRoaXMuY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJy5qcy1lbWFpbEFkZHJlc3MnKTtcbiAgICB0aGlzLm1vYmlsZU51bWJlciA9IHRoaXMuY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJy5qcy1tb2JpbGVOdW1iZXInKTtcbiAgICB0aGlzLnN1YmplY3QgPSB0aGlzLmNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCcuanMtc3ViamVjdCcpO1xuICAgIHRoaXMubWVzc2FnZSA9IHRoaXMuY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJy5qcy1tZXNzYWdlJyk7XG4gICAgdGhpcy5yZXNldEJ1dHRvbiA9IHRoaXMuY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJy5qcy1yZXNldEZvcm0nKTtcbiAgICB0aGlzLnN1Ym1pdEJ1dHRvbiA9IHRoaXMuY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJy5qcy1zdWJtaXRGb3JtJyk7XG4gICAgdGhpcy5lcnJvck1lc3NhZ2UgPSB0aGlzLmNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCcuanMtZXJyb3JNZXNzYWdlJyk7XG4gICAgdGhpcy5zdWNjZXNzTWVzc2FnZSA9IHRoaXMuY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJy5qcy1zdWNjZXNzTWVzc2FnZScpO1xuICAgIHRoaXMuY29udGFjdEZvcm0gPSB0aGlzLmNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCcuanMtY29udGFjdEZvcm0nKTtcblxuICAgIHRoaXMucmVzZXRGb3JtID0gdGhpcy5yZXNldEZvcm0uYmluZCh0aGlzKTtcbiAgICB0aGlzLnN1Ym1pdEZvcm0gPSB0aGlzLnN1Ym1pdEZvcm0uYmluZCh0aGlzKTtcbiAgICB0aGlzLnZhbGlkYXRlRm9ybSA9IHRoaXMudmFsaWRhdGVGb3JtLmJpbmQodGhpcyk7XG4gICAgLy8gYWRkIGV2ZW50IGxpc3RlbmVyc1xuICAgIHRoaXMucmVzZXRCdXR0b24uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLnJlc2V0Rm9ybSwgZmFsc2UpO1xuICAgIHRoaXMuc3VibWl0QnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5zdWJtaXRGb3JtLCBmYWxzZSk7XG5cbiAgICBjb25zdCBpbnB1dHMgPSBbXG4gICAgICAuLi50aGlzLmNvbnRhaW5lci5nZXRFbGVtZW50c0J5VGFnTmFtZSgnaW5wdXQnKSxcbiAgICAgIC4uLnRoaXMuY29udGFpbmVyLmdldEVsZW1lbnRzQnlUYWdOYW1lKCd0ZXh0YXJlYScpLFxuICAgIF07XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpbnB1dHMubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgIGlucHV0c1tpXS5hZGRFdmVudExpc3RlbmVyKCdibHVyJywgdGhpcy52YWxpZGF0ZUZvcm0sIGZhbHNlKTtcbiAgICB9XG4gIH1cblxuICB2YWxpZGF0ZUZvcm0oKSB7XG4gICAgaWYgKCF0aGlzLmZvcm1TdWJtaXR0ZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5lcnJvcnMgPSBbXTtcbiAgICBjb25zdCBmaXJzdE5hbWUgPSB0aGlzLmZpcnN0TmFtZS5nZXRFbGVtZW50c0J5VGFnTmFtZSgnaW5wdXQnKVswXS52YWx1ZTtcbiAgICBjb25zdCBsYXN0TmFtZSA9IHRoaXMubGFzdE5hbWUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2lucHV0JylbMF0udmFsdWU7XG4gICAgY29uc3QgZW1haWxBZGRyZXNzID0gdGhpcy5lbWFpbEFkZHJlc3MuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2lucHV0JylbMF0udmFsdWU7XG4gICAgY29uc3QgbW9iaWxlTnVtYmVyID0gdGhpcy5tb2JpbGVOdW1iZXIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2lucHV0JylbMF0udmFsdWU7XG4gICAgY29uc3Qgc3ViamVjdCA9IHRoaXMuc3ViamVjdC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnaW5wdXQnKVswXS52YWx1ZTtcbiAgICBjb25zdCBtZXNzYWdlID0gdGhpcy5tZXNzYWdlLmdldEVsZW1lbnRzQnlUYWdOYW1lKCd0ZXh0YXJlYScpWzBdLnZhbHVlO1xuXG4gICAgLy8gdmFsaWRhdGUgZmlyc3QgbmFtZVxuICAgIGlmIChmaXJzdE5hbWUubGVuZ3RoID4gMikge1xuICAgICAgdGhpcy5maXJzdE5hbWUucXVlcnlTZWxlY3RvcignLmpzLXZhbGlkYXRpb24tbWVzc2FnZScpLmNsYXNzTGlzdC5hZGQoJ3VrLWhpZGRlbicpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmZpcnN0TmFtZS5xdWVyeVNlbGVjdG9yKCcuanMtdmFsaWRhdGlvbi1tZXNzYWdlJykuY2xhc3NMaXN0LnJlbW92ZSgndWstaGlkZGVuJyk7XG4gICAgICB0aGlzLmVycm9ycy5wdXNoKCdmaXJzdCBuYW1lIGlzIHJlcXVpcmVkJyk7XG4gICAgfVxuXG4gICAgLy8gdmFsaWRhdGUgbGFzdCBuYW1lXG4gICAgaWYgKGxhc3ROYW1lLmxlbmd0aCA+IDIpIHtcbiAgICAgIHRoaXMubGFzdE5hbWUucXVlcnlTZWxlY3RvcignLmpzLXZhbGlkYXRpb24tbWVzc2FnZScpLmNsYXNzTGlzdC5hZGQoJ3VrLWhpZGRlbicpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmxhc3ROYW1lLnF1ZXJ5U2VsZWN0b3IoJy5qcy12YWxpZGF0aW9uLW1lc3NhZ2UnKS5jbGFzc0xpc3QucmVtb3ZlKCd1ay1oaWRkZW4nKTtcbiAgICAgIHRoaXMuZXJyb3JzLnB1c2goJ2xhc3QgbmFtZSBpcyByZXF1aXJlZCcpO1xuICAgIH1cblxuICAgIC8vIHZhbGlkYXRlIGVtYWlsIGFkZHJlc3NcbiAgICBpZiAoQ29udGFjdEZvcm1WYWxpZGF0aW9uLnZhbGlkYXRlRW1haWxBZGRyZXNzKGVtYWlsQWRkcmVzcykpIHtcbiAgICAgIHRoaXMuZW1haWxBZGRyZXNzLnF1ZXJ5U2VsZWN0b3IoJy5qcy12YWxpZGF0aW9uLW1lc3NhZ2UnKS5jbGFzc0xpc3QuYWRkKCd1ay1oaWRkZW4nKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5lbWFpbEFkZHJlc3MucXVlcnlTZWxlY3RvcignLmpzLXZhbGlkYXRpb24tbWVzc2FnZScpLmNsYXNzTGlzdC5yZW1vdmUoJ3VrLWhpZGRlbicpO1xuICAgICAgdGhpcy5lcnJvcnMucHVzaCgnZW1haWwgYWRkcmVzcyBpcyByZXF1aXJlZCcpO1xuICAgIH1cblxuICAgIC8vIHZhbGlkYXRlIG1vYmlsZSBudW1iZXJcbiAgICBpZiAoQ29udGFjdEZvcm1WYWxpZGF0aW9uLnZhbGlkYXRlTW9iaWxlTnVtYmVyKG1vYmlsZU51bWJlcikpIHtcbiAgICAgIHRoaXMubW9iaWxlTnVtYmVyLnF1ZXJ5U2VsZWN0b3IoJy5qcy12YWxpZGF0aW9uLW1lc3NhZ2UnKS5jbGFzc0xpc3QuYWRkKCd1ay1oaWRkZW4nKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5tb2JpbGVOdW1iZXIucXVlcnlTZWxlY3RvcignLmpzLXZhbGlkYXRpb24tbWVzc2FnZScpLmNsYXNzTGlzdC5yZW1vdmUoJ3VrLWhpZGRlbicpO1xuICAgICAgdGhpcy5lcnJvcnMucHVzaCgnbW9iaWxlIG51bWJlciBpcyByZXF1aXJlZCcpO1xuICAgIH1cblxuICAgIC8vIHZhbGlkYXRlIHN1YmplY3RcbiAgICBpZiAoc3ViamVjdC5sZW5ndGggPiAyKSB7XG4gICAgICB0aGlzLnN1YmplY3QucXVlcnlTZWxlY3RvcignLmpzLXZhbGlkYXRpb24tbWVzc2FnZScpLmNsYXNzTGlzdC5hZGQoJ3VrLWhpZGRlbicpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnN1YmplY3QucXVlcnlTZWxlY3RvcignLmpzLXZhbGlkYXRpb24tbWVzc2FnZScpLmNsYXNzTGlzdC5yZW1vdmUoJ3VrLWhpZGRlbicpO1xuICAgICAgdGhpcy5lcnJvcnMucHVzaCgnc3ViamVjdCBpcyByZXF1aXJlZCcpO1xuICAgIH1cblxuICAgIC8vIHZhbGlkYXRlIG1lc3NhZ2VcbiAgICBpZiAobWVzc2FnZS5sZW5ndGggPiAyICYmIG1lc3NhZ2UubGVuZ3RoIDwgNTAwKSB7XG4gICAgICB0aGlzLm1lc3NhZ2UucXVlcnlTZWxlY3RvcignLmpzLXZhbGlkYXRpb24tbWVzc2FnZScpLmNsYXNzTGlzdC5hZGQoJ3VrLWhpZGRlbicpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLm1lc3NhZ2UucXVlcnlTZWxlY3RvcignLmpzLXZhbGlkYXRpb24tbWVzc2FnZScpLmNsYXNzTGlzdC5yZW1vdmUoJ3VrLWhpZGRlbicpO1xuICAgICAgdGhpcy5lcnJvcnMucHVzaCgnbWVzc2FnZSBpcyByZXF1aXJlZCcpO1xuICAgIH1cbiAgfVxuXG4gIHN0YXRpYyB2YWxpZGF0ZU1vYmlsZU51bWJlcihudW1iZXIpIHtcbiAgICBpZiAobnVtYmVyLmxlbmd0aCA8IDggfHwgbnVtYmVyLmxlbmd0aCA+IDE0KSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGNvbnN0IGZpbHRlciA9IC9eW1xcK1xcZF0/KD86W1xcZC0uXFxzKCldKikkLztcbiAgICByZXR1cm4gZmlsdGVyLnRlc3QobnVtYmVyKTtcbiAgfVxuXG4gIHN0YXRpYyB2YWxpZGF0ZUVtYWlsQWRkcmVzcyhlbWFpbCkge1xuICAgIGlmIChlbWFpbC5sZW5ndGggPCAyKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGNvbnN0IGZpbHRlciA9IC9eKD89Lns4LDI1NH0kKSgoPzooW2EtekEtWjAtOSEjJCUmJyorLz0/Xl9ge3x9fi1dKyg/OlxcLlthLXpBLVowLTkhIyQlJicqKy89P15fYHt8fX4tXSspKil8XCIoPz0uezIsMjQ4fVwiKSg/OltcXHgwMS1cXHgwOFxceDBiXFx4MGNcXHgwZS1cXHgxZlxceDIxXFx4MjMtXFx4NWJcXHg1ZC1cXHg3Zl18XFxcXFtcXHgwMS1cXHgwOVxceDBiXFx4MGNcXHgwZS1cXHg3Zl0pKlwiKUAoPzooPzpbYS16QS1aMC05XSg/OlthLXpBLVowLTktXSpbYS16QS1aMC05XSl7MSw2M30/XFwuKStbYS16QS1aMC05XSgoPzpbYS16QS1aMC05LV0qW2EtekEtWjAtOV0pezEsNjN9KXxcXFsoPzooPzooMig1WzAtNV18WzAtNF1bMC05XSl8MVswLTldWzAtOV18WzEtOV0/WzAtOV0pKVxcLil7M30oPzooMig1WzAtNV18WzAtNF1bMC05XSl8MVswLTldWzAtOV18WzEtOV0/WzAtOV0pfFthLXpBLVowLTktXSpbYS16QS1aMC05XTooPzpbXFx4MDEtXFx4MDhcXHgwYlxceDBjXFx4MGUtXFx4MWZcXHgyMS1cXHg1YVxceDUzLVxceDdmXXxcXFxcW1xceDAxLVxceDA5XFx4MGJcXHgwY1xceDBlLVxceDdmXSkrKVxcXSkpJC87XG4gICAgcmV0dXJuIGZpbHRlci50ZXN0KGVtYWlsKTtcbiAgfVxuXG4gIHN1Ym1pdEZvcm0oZSkge1xuICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICB0aGlzLmZvcm1TdWJtaXR0ZWQgPSB0cnVlO1xuICAgIHRoaXMudmFsaWRhdGVGb3JtKCk7XG4gICAgaWYgKHRoaXMuZXJyb3JzLmxlbmd0aCA+IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBmaXJzdE5hbWUgPSB0aGlzLmZpcnN0TmFtZS5nZXRFbGVtZW50c0J5VGFnTmFtZSgnaW5wdXQnKVswXS52YWx1ZTtcbiAgICBjb25zdCBsYXN0TmFtZSA9IHRoaXMubGFzdE5hbWUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2lucHV0JylbMF0udmFsdWU7XG4gICAgY29uc3QgZW1haWxBZGRyZXNzID0gdGhpcy5lbWFpbEFkZHJlc3MuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2lucHV0JylbMF0udmFsdWU7XG4gICAgY29uc3QgbW9iaWxlTnVtYmVyID0gdGhpcy5tb2JpbGVOdW1iZXIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2lucHV0JylbMF0udmFsdWU7XG4gICAgY29uc3Qgc3ViamVjdCA9IHRoaXMuc3ViamVjdC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnaW5wdXQnKVswXS52YWx1ZTtcbiAgICBjb25zdCBtZXNzYWdlID0gdGhpcy5tZXNzYWdlLmdldEVsZW1lbnRzQnlUYWdOYW1lKCd0ZXh0YXJlYScpWzBdLnZhbHVlO1xuXG4gICAgbGV0IGZvcm1EYXRhID0gYEZJUlNUX05BTUU9JHtmaXJzdE5hbWV9JkxBU1RfTkFNRT0ke2xhc3ROYW1lfSZFTUFJTD0ke2VtYWlsQWRkcmVzc30mTU9CSUxFX05VTUJFUj0ke21vYmlsZU51bWJlcn0mJlNVQkpFQ1Q9JHtzdWJqZWN0fSZNRVNTQUdFPSR7bWVzc2FnZX1gO1xuICAgIGZvcm1EYXRhXG4gICAgICArPSAnJl9hZmctY29tbW9uLXNpdGU9RHViYWlGZXN0aXZhbENpdHkmX2FmZy1jb21tb24tZnVuY3Rpb249Q29udGFjdCBVcyZPTU1JVF9QQVJBTT1SRVFVRVNUX1NFUklBTF9OVU1CRVInO1xuICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICBtZXRob2Q6ICdwb3N0JyxcbiAgICAgIHVybDogcG9zdFVSTCxcbiAgICAgIGRhdGE6IGZvcm1EYXRhLFxuICAgICAgY29uZmlnOiB7XG4gICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZDsgY2hhcnNldD1VVEYtOCcsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH07XG5cbiAgICAvLyBkaXNhYmxlIHN1Ym1pdCBidXR0b25cbiAgICB0aGlzLnN1Ym1pdEJ1dHRvbi5kaXNhYmxlZCA9IHRydWU7XG5cbiAgICBheGlvcyhvcHRpb25zKVxuICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICB0aGlzLnNob3dDb25maXJtYXRpb24oKTtcbiAgICAgIH0pXG4gICAgICAuY2F0Y2goKCkgPT4ge1xuICAgICAgICB0aGlzLnNob3dFcnJvcigpO1xuICAgICAgfSk7XG4gIH1cblxuICBzaG93RXJyb3IoKSB7XG4gICAgdGhpcy5lcnJvck1lc3NhZ2UuY2xhc3NMaXN0LnJlbW92ZSgndWstaGlkZGVuJyk7XG4gICAgdGhpcy5zdWJtaXRCdXR0b24uZGlzYWJsZWQgPSBmYWxzZTtcbiAgfVxuXG4gIHNob3dDb25maXJtYXRpb24oKSB7XG4gICAgdGhpcy5zdWNjZXNzTWVzc2FnZS5jbGFzc0xpc3QucmVtb3ZlKCd1ay1oaWRkZW4nKTtcbiAgICB0aGlzLmNvbnRhY3RGb3JtLmNsYXNzTGlzdC5hZGQoJ3VrLWhpZGRlbicpO1xuICB9XG5cbiAgLy8gcmVzZXQgdGhlIGZvcm0gdG8gb3JpZ2luYWwgc3RhdGVcbiAgcmVzZXRGb3JtKGUpIHtcbiAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgdGhpcy5mb3JtU3VibWl0dGVkID0gZmFsc2U7XG4gICAgdGhpcy5lcnJvck1lc3NhZ2UuY2xhc3NMaXN0LmFkZCgndWstaGlkZGVuJyk7XG4gICAgY29uc3QgaW5wdXRzID0gW1xuICAgICAgLi4udGhpcy5jb250YWluZXIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2lucHV0JyksXG4gICAgICAuLi50aGlzLmNvbnRhaW5lci5nZXRFbGVtZW50c0J5VGFnTmFtZSgndGV4dGFyZWEnKSxcbiAgICBdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaW5wdXRzLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICBpbnB1dHNbaV0udmFsdWUgPSAnJztcbiAgICB9XG5cbiAgICBjb25zdCB2YWxpZGF0aW9uTWVzc2FnZXMgPSB0aGlzLmNvbnRhaW5lci5xdWVyeVNlbGVjdG9yQWxsKCcuanMtdmFsaWRhdGlvbi1tZXNzYWdlJyk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB2YWxpZGF0aW9uTWVzc2FnZXMubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgIHZhbGlkYXRpb25NZXNzYWdlc1tpXS5jbGFzc0xpc3QuYWRkKCd1ay1oaWRkZW4nKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gY3JlYXRlQ29udGFjdEZvcm1WYWxpZGF0aW9uKCkge1xuICBjb25zdCBjb250YWN0Rm9ybXMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuanMtY29udGFjdC1mb3JtLWNvbnRhaW5lcicpO1xuICBpZiAoY29udGFjdEZvcm1zLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb250YWN0Rm9ybXMubGVuZ3RoOyBpICs9IDEpIHtcbiAgICBjb25zdCBjb250YWN0Rm9ybSA9IG5ldyBDb250YWN0Rm9ybVZhbGlkYXRpb24oY29udGFjdEZvcm1zW2ldKTtcbiAgICBjb250YWN0Rm9ybS5pbml0KCk7XG4gIH1cbiAgcmV0dXJuIG51bGw7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGNyZWF0ZUNvbnRhY3RGb3JtVmFsaWRhdGlvbjtcbiIsIi8qIGdsb2JhbCBkb2N1bWVudCwgZ29vZ2xlLCBuYXZpZ2F0b3IsIHdpbmRvdyAqL1xuaW1wb3J0IG1hcFN0eWxlcyBmcm9tICcuL2dvb2dsZS1tYXAtc3R5bGVzJztcblxuY2xhc3MgRGlyZWN0aW9uc01hcCB7XG4gIGNvbnN0cnVjdG9yKGRpcmVjdGlvbnNNYXApIHtcbiAgICAvLyBlbGVtZW50c1xuICAgIHRoaXMuZGlyZWN0aW9uc01hcCA9IGRpcmVjdGlvbnNNYXA7XG4gICAgdGhpcy5tYXBFbGVtZW50ID0gZGlyZWN0aW9uc01hcC5xdWVyeVNlbGVjdG9yKCcuanMtbWFwJyk7XG4gICAgdGhpcy5tYXBQYW5lbCA9IGRpcmVjdGlvbnNNYXAucXVlcnlTZWxlY3RvcignLmpzLW1hcC1wYW5lbCcpO1xuICAgIHRoaXMubW9kZSA9IGRpcmVjdGlvbnNNYXAucXVlcnlTZWxlY3RvcignLmpzLW1vZGUnKS52YWx1ZTtcbiAgICB0aGlzLmxvY2F0aW9uID0gbnVsbDtcbiAgICB0aGlzLmVuZCA9IGRpcmVjdGlvbnNNYXAucXVlcnlTZWxlY3RvcignLmpzLWVuZCcpLnZhbHVlO1xuICAgIHRoaXMuZ29CdXR0b24gPSBkaXJlY3Rpb25zTWFwLnF1ZXJ5U2VsZWN0b3IoJy5qcy1nbycpO1xuICAgIHRoaXMuYXBpS2V5ID0gZGlyZWN0aW9uc01hcC5xdWVyeVNlbGVjdG9yKCcuanMtZ29vZ2xlLWFwaS1rZXknKS52YWx1ZTtcbiAgICB0aGlzLmxhbmcgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnaHRtbCcpWzBdLmdldEF0dHJpYnV0ZSgnbGFuZycpO1xuICAgIHRoaXMubWFwQ29udGFpbmVyID0gZGlyZWN0aW9uc01hcC5xdWVyeVNlbGVjdG9yKCcuanMtbWFwLWNvbnRhaW5lcicpO1xuICAgIHRoaXMuc3Bpbm5lciA9IGRpcmVjdGlvbnNNYXAucXVlcnlTZWxlY3RvcignLmpzLXNwaW5uZXInKTtcbiAgICB0aGlzLm1hcEVycm9yID0gZGlyZWN0aW9uc01hcC5xdWVyeVNlbGVjdG9yKCcuanMtbWFwLWVycm9yJyk7XG4gICAgdGhpcy5pbnB1dCA9IGRpcmVjdGlvbnNNYXAucXVlcnlTZWxlY3RvcignLmpzLXN0YXJ0Jyk7XG4gIH1cblxuICBpbml0KCkge1xuICAgIC8vIGJpbmQgZXZlbnQgbGlzdGVuZXJzXG4gICAgdGhpcy5zZXRMb2NhdGlvbiA9IHRoaXMuc2V0TG9jYXRpb24uYmluZCh0aGlzKTtcbiAgICB0aGlzLmxvY2F0aW9uRXJyb3IgPSB0aGlzLmxvY2F0aW9uRXJyb3IuYmluZCh0aGlzKTtcbiAgICB0aGlzLnNldFVwTWFwID0gdGhpcy5zZXRVcE1hcC5iaW5kKHRoaXMpO1xuICAgIHRoaXMuaGFuZGxlR29CdXR0b24gPSB0aGlzLmhhbmRsZUdvQnV0dG9uLmJpbmQodGhpcyk7XG4gICAgdGhpcy5oYW5kbGVFbnRlciA9IHRoaXMuaGFuZGxlRW50ZXIuYmluZCh0aGlzKTtcbiAgICB0aGlzLnNldEFkZHJlc3NJbnB1dCA9IHRoaXMuc2V0QWRkcmVzc0lucHV0LmJpbmQodGhpcyk7XG5cbiAgICAvLyBzZXR1cCBldmVudCBsaXN0ZW5lclxuICAgIHRoaXMuZ29CdXR0b24uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLmhhbmRsZUdvQnV0dG9uLCBmYWxzZSk7XG4gICAgdGhpcy5pbnB1dC5hZGRFdmVudExpc3RlbmVyKCdrZXl1cCcsIHRoaXMuaGFuZGxlRW50ZXIsIGZhbHNlKTtcblxuICAgIC8vIGdldCB0aGUgdXNlcnMgbG9jYXRpb24gdXNpbmcgaHRtbDUgbmF2aWdhdG9yXG4gICAgdGhpcy5nZXRMb2NhdGlvbigpO1xuXG4gICAgLy8gc3RhcnQgZ29vZ2xlIG1hcHMgYXBpXG4gICAgY29uc3QgdGFnID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc2NyaXB0Jyk7XG4gICAgdGFnLnNyYyA9IGBodHRwczovL21hcHMuZ29vZ2xlYXBpcy5jb20vbWFwcy9hcGkvanM/a2V5PSR7XG4gICAgICB0aGlzLmFwaUtleVxuICAgIH0mY2FsbGJhY2s9aW5pdE1hcCZsYW5ndWFnZT0ke3RoaXMubGFuZ31gO1xuICAgIC8vIGluc2V0IHNjcmlwdCB0YWdlIG9uIHBhZ2VcbiAgICBjb25zdCBmaXJzdFNjcmlwdFRhZyA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCdzY3JpcHQnKVswXTtcbiAgICBmaXJzdFNjcmlwdFRhZy5wYXJlbnROb2RlLmluc2VydEJlZm9yZSh0YWcsIGZpcnN0U2NyaXB0VGFnKTtcbiAgICB0aGlzLnNob3dNYXAoKTtcbiAgICAvLyBzZXQgdXAgbWFwIHdoZW4gcmVhZHlcbiAgICB3aW5kb3cuaW5pdE1hcCA9IHRoaXMuc2V0VXBNYXA7XG4gIH1cblxuICBoYW5kbGVHb0J1dHRvbihlKSB7XG4gICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIHRoaXMubG9jYXRpb24gPSB0aGlzLmlucHV0LnZhbHVlO1xuICAgIGlmICh0aGlzLmxvY2F0aW9uKSB7XG4gICAgICB0aGlzLmNhbGN1bGF0ZUFuZERpc3BsYXlSb3V0ZSh0aGlzLmxvY2F0aW9uKTtcbiAgICB9XG4gIH1cblxuICBoYW5kbGVFbnRlcihlKSB7XG4gICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIC8vIGlmIHB1c2ggZW50ZXJcbiAgICBpZiAoZS5rZXlDb2RlID09PSAxMykge1xuICAgICAgdGhpcy5sb2NhdGlvbiA9IHRoaXMuaW5wdXQudmFsdWU7XG4gICAgICBpZiAodGhpcy5sb2NhdGlvbikge1xuICAgICAgICB0aGlzLmNhbGN1bGF0ZUFuZERpc3BsYXlSb3V0ZSh0aGlzLmxvY2F0aW9uKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBzZXRVcE1hcCgpIHtcbiAgICB0aGlzLmRpcmVjdGlvbnNTZXJ2aWNlID0gbmV3IGdvb2dsZS5tYXBzLkRpcmVjdGlvbnNTZXJ2aWNlKCk7XG4gICAgdGhpcy5kaXJlY3Rpb25zRGlzcGxheSA9IG5ldyBnb29nbGUubWFwcy5EaXJlY3Rpb25zUmVuZGVyZXIoKTtcbiAgICB0aGlzLmdlb2NvZGVyID0gbmV3IGdvb2dsZS5tYXBzLkdlb2NvZGVyKCk7XG4gICAgdGhpcy5tYXAgPSBuZXcgZ29vZ2xlLm1hcHMuTWFwKHRoaXMubWFwRWxlbWVudCwge1xuICAgICAgem9vbTogNyxcbiAgICAgIHN0eWxlczogbWFwU3R5bGVzLFxuICAgICAgY2VudGVyOiB7XG4gICAgICAgIGxhdDogMjUuMjE5ODM4OSxcbiAgICAgICAgbG5nOiA1NS4zNDAzMzQxLFxuICAgICAgfSxcbiAgICB9KTtcbiAgICB0aGlzLmRpcmVjdGlvbnNEaXNwbGF5LnNldE1hcCh0aGlzLm1hcCk7XG4gICAgdGhpcy5kaXJlY3Rpb25zRGlzcGxheS5zZXRQYW5lbCh0aGlzLm1hcFBhbmVsKTtcbiAgfVxuXG4gIC8vIGdldCB0aGUgYWRkcmVzcyBmcm9tIGxhdGxvbmdcbiAgZ2V0QWRkcmVzcygpIHtcbiAgICB0aGlzLmdlb2NvZGVyLmdlb2NvZGUoXG4gICAgICB7XG4gICAgICAgIGxhdExuZzogdGhpcy5sb2NhdGlvbixcbiAgICAgIH0sXG4gICAgICAocmVzdWx0cywgc3RhdHVzKSA9PiB7XG4gICAgICAgIGlmIChzdGF0dXMgPT09IGdvb2dsZS5tYXBzLkdlb2NvZGVyU3RhdHVzLk9LKSB7XG4gICAgICAgICAgaWYgKHJlc3VsdHNbMV0uZm9ybWF0dGVkX2FkZHJlc3MpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0QWRkcmVzc0lucHV0KHJlc3VsdHNbMV0uZm9ybWF0dGVkX2FkZHJlc3MpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSxcbiAgICApO1xuICB9XG5cbiAgY2FsY3VsYXRlQW5kRGlzcGxheVJvdXRlKGxvY2F0aW9uKSB7XG4gICAgdGhpcy5tb2RlID0gdGhpcy5kaXJlY3Rpb25zTWFwLnF1ZXJ5U2VsZWN0b3IoJy5qcy1tb2RlJykudmFsdWU7XG4gICAgdGhpcy5kaXJlY3Rpb25zU2VydmljZS5yb3V0ZShcbiAgICAgIHtcbiAgICAgICAgb3JpZ2luOiBsb2NhdGlvbixcbiAgICAgICAgZGVzdGluYXRpb246IHRoaXMuZW5kLFxuICAgICAgICB0cmF2ZWxNb2RlOiBnb29nbGUubWFwcy5UcmF2ZWxNb2RlW3RoaXMubW9kZV0sXG4gICAgICB9LFxuICAgICAgKHJlc3BvbnNlLCBzdGF0dXMpID0+IHtcbiAgICAgICAgdGhpcy5zaG93TWFwKCk7XG4gICAgICAgIGlmIChzdGF0dXMgPT09ICdPSycpIHtcbiAgICAgICAgICB0aGlzLmRpcmVjdGlvbnNEaXNwbGF5LnNldERpcmVjdGlvbnMocmVzcG9uc2UpO1xuICAgICAgICAgIHRoaXMuaGlkZUVycm9yKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5zaG93RXJyb3Ioc3RhdHVzKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICApO1xuICB9XG5cbiAgc2V0TG9jYXRpb24ocG9zKSB7XG4gICAgaWYgKHBvcykge1xuICAgICAgdGhpcy5sb2NhdGlvbiA9IG5ldyBnb29nbGUubWFwcy5MYXRMbmcocG9zLmNvb3Jkcy5sYXRpdHVkZSwgcG9zLmNvb3Jkcy5sb25naXR1ZGUpO1xuICAgICAgdGhpcy5nZXRBZGRyZXNzKCk7XG4gICAgICB0aGlzLmNhbGN1bGF0ZUFuZERpc3BsYXlSb3V0ZSh0aGlzLmxvY2F0aW9uKTtcbiAgICB9XG4gIH1cblxuICBzZXRBZGRyZXNzSW5wdXQoYWRkcmVzcykge1xuICAgIHRoaXMuaW5wdXQudmFsdWUgPSBhZGRyZXNzO1xuICB9XG5cbiAgZ2V0TG9jYXRpb24oKSB7XG4gICAgLy8gaWYgYnJvd3NlciBzdXBwb3J0cyBnZW9sb2NhdGlvbiB0cnkgYW5kIGdldCBvdGhlcndpc2Ugc2hvdyBtYXBcbiAgICBpZiAobmF2aWdhdG9yLmdlb2xvY2F0aW9uKSB7XG4gICAgICBuYXZpZ2F0b3IuZ2VvbG9jYXRpb24uZ2V0Q3VycmVudFBvc2l0aW9uKHRoaXMuc2V0TG9jYXRpb24sIHRoaXMubG9jYXRpb25FcnJvcik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc2hvd01hcCgpO1xuICAgIH1cbiAgfVxuXG4gIGxvY2F0aW9uRXJyb3IoKSB7XG4gICAgdGhpcy5zaG93TWFwKCk7XG4gIH1cblxuICBzaG93RXJyb3IoZXJyb3IpIHtcbiAgICBsZXQgbWVzc2FnZSA9ICdBIHJvdXRlIGNvdWxkIG5vdCBiZSBmb3VuZCc7XG4gICAgaWYgKGVycm9yID09PSAnTk9UX0ZPVU5EJykge1xuICAgICAgbWVzc2FnZSA9ICdBIHJvdXRlIGNvdWxkIG5vdCBiZSBmb3VuZCc7XG4gICAgfVxuICAgIHRoaXMubWFwRXJyb3IuaW5uZXJIVE1MID0gYDxwPiR7bWVzc2FnZX08L3A+YDtcbiAgICB0aGlzLm1hcFBhbmVsLmNsYXNzTGlzdC5hZGQoJ3VrLWhpZGRlbicpO1xuICAgIHRoaXMubWFwRXJyb3IuY2xhc3NMaXN0LnJlbW92ZSgndWstaGlkZGVuJyk7XG4gIH1cblxuICBoaWRlRXJyb3IoKSB7XG4gICAgdGhpcy5tYXBQYW5lbC5jbGFzc0xpc3QucmVtb3ZlKCd1ay1oaWRkZW4nKTtcbiAgICB0aGlzLm1hcEVycm9yLmNsYXNzTGlzdC5hZGQoJ3VrLWhpZGRlbicpO1xuICB9XG5cbiAgc2hvd01hcCgpIHtcbiAgICB0aGlzLm1hcENvbnRhaW5lci5jbGFzc0xpc3QucmVtb3ZlKCd1ay1oaWRkZW4nKTtcbiAgICB0aGlzLnNwaW5uZXIuY2xhc3NMaXN0LmFkZCgndWstaGlkZGVuJyk7XG4gIH1cblxuICBoaWRlTWFwKCkge1xuICAgIHRoaXMubWFwQ29udGFpbmVyLmNsYXNzTGlzdC5hZGQoJ3VrLWhpZGRlbicpO1xuICAgIHRoaXMuc3Bpbm5lci5jbGFzc0xpc3QucmVtb3ZlKCd1ay1oaWRkZW4nKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBjcmVhdGVEaXJlY3Rpb25zTWFwKCkge1xuICBjb25zdCBkaXJlY3Rpb25zTWFwcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5qcy1kaXJlY3Rpb25zLW1hcCcpO1xuICBpZiAoZGlyZWN0aW9uc01hcHMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBmb3IgKGxldCBpID0gMDsgaSA8IGRpcmVjdGlvbnNNYXBzLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgY29uc3QgZGlyZWN0aW9uc01hcCA9IG5ldyBEaXJlY3Rpb25zTWFwKGRpcmVjdGlvbnNNYXBzW2ldKTtcbiAgICBkaXJlY3Rpb25zTWFwLmluaXQoKTtcbiAgfVxuICByZXR1cm4gbnVsbDtcbn1cblxuZXhwb3J0IGRlZmF1bHQgY3JlYXRlRGlyZWN0aW9uc01hcDtcbiIsIi8qIGdsb2JhbCBkb2N1bWVudCAqL1xuaW1wb3J0IE1hc29ucnkgZnJvbSAnbWFzb25yeS1sYXlvdXQnO1xuXG5jbGFzcyBFdmVudEdyaWQge1xuICBjb25zdHJ1Y3RvcihldmVudEdyaWQpIHtcbiAgICB0aGlzLmV2ZW50R3JpZCA9IGV2ZW50R3JpZDtcbiAgICB0aGlzLm1hc29ucnkgPSBudWxsO1xuICB9XG5cbiAgaW5pdCgpIHtcbiAgICB0aGlzLm1hc29ucnkgPSBuZXcgTWFzb25yeSh0aGlzLmV2ZW50R3JpZCwge1xuICAgICAgLy8gb3B0aW9uc1xuICAgICAgaXRlbVNlbGVjdG9yOiAnLmJrLWV2ZW50LWdyaWRfX2l0ZW0nLFxuICAgICAgY29sdW1uV2lkdGg6ICcuYmstZXZlbnQtZ3JpZF9fc2l6ZXInLFxuICAgICAgcGVyY2VudFBvc2l0aW9uOiB0cnVlLFxuICAgICAgZ3V0dGVyOiAnLmJrLWV2ZW50LWdyaWRfX2d1dHRlci1zaXplcicsXG4gICAgfSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gRXZlbnRHcmlkSW5pdCgpIHtcbiAgY29uc3QgZXZlbnRHcmlkcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5qcy1ldmVudC1ncmlkJyk7XG4gIGlmIChldmVudEdyaWRzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgZXZlbnRHcmlkcy5sZW5ndGg7IGkgKz0gMSkge1xuICAgIGNvbnN0IGV2ZW50R3JpZCA9IG5ldyBFdmVudEdyaWQoZXZlbnRHcmlkc1tpXSk7XG4gICAgZXZlbnRHcmlkLmluaXQoKTtcbiAgfVxuICByZXR1cm4gbnVsbDtcbn1cblxuZXhwb3J0IGRlZmF1bHQgRXZlbnRHcmlkSW5pdDtcbiIsImNsYXNzIEZvcm1WYWxpZGF0aW9uIHtcbiAgY29uc3RydWN0b3IoY29udGFjdEZvcm1FbGVtZW50KSB7XG4gICAgdGhpcy5jb250YWluZXIgPSBjb250YWN0Rm9ybUVsZW1lbnQ7XG4gICAgdGhpcy5lcnJvcnMgPSBbXTtcbiAgICB0aGlzLmZvcm1TdWJtaXR0ZWQgPSBmYWxzZTtcbiAgfVxuXG4gIGluaXQoKSB7XG4gICAgdGhpcy5yZXNldEZvcm0gPSB0aGlzLnJlc2V0Rm9ybS5iaW5kKHRoaXMpO1xuICAgIHRoaXMudmFsaWRhdGVGb3JtID0gdGhpcy52YWxpZGF0ZUZvcm0uYmluZCh0aGlzKTtcblxuICAgIHRoaXMucmVzZXRCdXR0b24gPSB0aGlzLmNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCcuanMtcmVzZXQtYnV0dG9uJyk7XG5cbiAgICAvLyBhZGQgZXZlbnQgbGlzdGVuZXJzXG4gICAgaWYgKHRoaXMucmVzZXRCdXR0b24pIHtcbiAgICAgIHRoaXMucmVzZXRCdXR0b24uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLnJlc2V0Rm9ybSwgZmFsc2UpO1xuICAgIH1cblxuICAgIC8vIGVsZW1lbnRzIHRvIGJlIHZhbGlkYXRlZFxuICAgIHRoaXMuYWRkQmx1ckV2ZW50cygpO1xuICB9XG5cbiAgYWRkQmx1ckV2ZW50cygpIHtcbiAgICB0aGlzLmlucHV0cyA9IFtcbiAgICAgIC4uLnRoaXMuY29udGFpbmVyLmdldEVsZW1lbnRzQnlUYWdOYW1lKCdpbnB1dCcpLFxuICAgICAgLi4udGhpcy5jb250YWluZXIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ3RleHRhcmVhJyksXG4gICAgICAuLi50aGlzLmNvbnRhaW5lci5nZXRFbGVtZW50c0J5VGFnTmFtZSgnc2VsZWN0JyksXG4gICAgICAuLi50aGlzLmNvbnRhaW5lci5xdWVyeVNlbGVjdG9yQWxsKCcuanMtdmFsaWRhdGlvbi1yYWRpbycpLFxuICAgIF07XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuaW5wdXRzLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICB0aGlzLmlucHV0c1tpXS5hZGRFdmVudExpc3RlbmVyKCdibHVyJywgdGhpcy52YWxpZGF0ZUZvcm0sIGZhbHNlKTtcbiAgICB9XG4gIH1cblxuICB1cGRhdGVGb3JtKCkge1xuICAgIHRoaXMuYWRkQmx1ckV2ZW50cygpO1xuICB9XG5cbiAgc3VibWl0dGVkRm9ybSgpIHtcbiAgICB0aGlzLmZvcm1TdWJtaXR0ZWQgPSB0cnVlO1xuICB9XG5cbiAgdmFsaWRhdGVGb3JtKCkge1xuICAgIGlmICghdGhpcy5mb3JtU3VibWl0dGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMucmVzZXRWYWxpZGF0aW9uKCk7XG4gICAgdGhpcy5lcnJvcnMgPSBbXTtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5pbnB1dHMubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgIGNvbnN0IGlucHV0ID0gdGhpcy5pbnB1dHNbaV07XG4gICAgICBjb25zdCBwYXJlbnQgPSBpbnB1dC5wYXJlbnROb2RlO1xuXG4gICAgICAvLyByZXF1aXJlZFxuICAgICAgaWYgKGlucHV0LmNsYXNzTGlzdC5jb250YWlucygnanMtdmFsaWRhdGlvbi1yZXF1aXJlZCcpKSB7XG4gICAgICAgIC8vIGNoZWNrYm94XG4gICAgICAgIGlmIChpbnB1dC50eXBlID09PSAnY2hlY2tib3gnKSB7XG4gICAgICAgICAgaWYgKCFpbnB1dC5jaGVja2VkKSB7XG4gICAgICAgICAgICB0aGlzLnNob3dWYWxpZGF0aW9uTWVzc2FnZShwYXJlbnQsIGlucHV0KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gdGV4dCBpbnB1dHMgYW5kIGFyZWFzXG4gICAgICAgIH0gZWxzZSBpZiAoaW5wdXQudmFsdWUubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgdGhpcy5zaG93VmFsaWRhdGlvbk1lc3NhZ2UocGFyZW50LCBpbnB1dCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gcmFkaW8gdmFsaWRhdGlvblxuICAgICAgaWYgKGlucHV0LmNsYXNzTGlzdC5jb250YWlucygnanMtdmFsaWRhdGlvbi1yYWRpbycpKSB7XG4gICAgICAgIGNvbnN0IHJhZGlvcyA9IGlucHV0LmdldEVsZW1lbnRzQnlUYWdOYW1lKCdpbnB1dCcpO1xuICAgICAgICBsZXQgcmFkaW9TZWxlY3RlZCA9IGZhbHNlO1xuICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IHJhZGlvcy5sZW5ndGg7IGogKz0gMSkge1xuICAgICAgICAgIGlmIChyYWRpb3Nbal0uY2hlY2tlZCA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgcmFkaW9TZWxlY3RlZCA9IHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICghcmFkaW9TZWxlY3RlZCkge1xuICAgICAgICAgIHRoaXMuc2hvd1ZhbGlkYXRpb25NZXNzYWdlKHBhcmVudCwgaW5wdXQpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChpbnB1dC52YWx1ZSAmJiBpbnB1dC52YWx1ZS5sZW5ndGggPiAwKSB7XG4gICAgICAgIC8vIGVtYWlsIHZhbGlkYXRpb25cbiAgICAgICAgaWYgKGlucHV0LmNsYXNzTGlzdC5jb250YWlucygnanMtdmFsaWRhdGlvbi1lbWFpbCcpKSB7XG4gICAgICAgICAgaWYgKCFGb3JtVmFsaWRhdGlvbi52YWxpZGF0ZUVtYWlsQWRkcmVzcyhpbnB1dC52YWx1ZSkpIHtcbiAgICAgICAgICAgIHRoaXMuc2hvd1ZhbGlkYXRpb25NZXNzYWdlKHBhcmVudCwgaW5wdXQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIG1vYmlsZSB2YWxpZGF0aW9uXG4gICAgICAgIGlmIChpbnB1dC5jbGFzc0xpc3QuY29udGFpbnMoJ2pzLXZhbGlkYXRpb24tbW9iaWxlJykpIHtcbiAgICAgICAgICBpZiAoIUZvcm1WYWxpZGF0aW9uLnZhbGlkYXRlTW9iaWxlTnVtYmVyKGlucHV0LnZhbHVlKSkge1xuICAgICAgICAgICAgdGhpcy5zaG93VmFsaWRhdGlvbk1lc3NhZ2UocGFyZW50LCBpbnB1dCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gTmFtZSBvbmx5IHZhbGlkYXRpb25cbiAgICAgICAgLy8gQWxwaGFiZXQsIHNwYWNlcyBhbmQgbWluIDMgY2hhcmFjdGVyc1xuICAgICAgICBpZiAoaW5wdXQuY2xhc3NMaXN0LmNvbnRhaW5zKCdqcy12YWxpZGF0aW9uLW5hbWUnKSkge1xuICAgICAgICAgIGlmICghRm9ybVZhbGlkYXRpb24ub25seUFscGhhYmV0VmFsaWRhdGlvbihpbnB1dC52YWx1ZSkgfHwgaW5wdXQudmFsdWUubGVuZ3RoIDw9IDIpIHtcbiAgICAgICAgICAgIHRoaXMuc2hvd1ZhbGlkYXRpb25NZXNzYWdlKHBhcmVudCwgaW5wdXQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEFscGhhYmV0IG9ubHkgdmFsaWRhdGlvblxuICAgICAgICBpZiAoaW5wdXQuY2xhc3NMaXN0LmNvbnRhaW5zKCdqcy12YWxpZGF0aW9uLWFscGhhLW9ubHknKSkge1xuICAgICAgICAgIGlmICghRm9ybVZhbGlkYXRpb24ub25seUFscGhhYmV0VmFsaWRhdGlvbihpbnB1dC52YWx1ZSkpIHtcbiAgICAgICAgICAgIHRoaXMuc2hvd1ZhbGlkYXRpb25NZXNzYWdlKHBhcmVudCwgaW5wdXQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIE51bWJlciBvbmx5IHZhbGlkYXRpb25cbiAgICAgICAgaWYgKGlucHV0LmNsYXNzTGlzdC5jb250YWlucygnanMtdmFsaWRhdGlvbi1udW1iZXItb25seScpKSB7XG4gICAgICAgICAgaWYgKCFGb3JtVmFsaWRhdGlvbi5vbmx5TnVtYmVyVmFsaWRhdGlvbihpbnB1dC52YWx1ZSkpIHtcbiAgICAgICAgICAgIHRoaXMuc2hvd1ZhbGlkYXRpb25NZXNzYWdlKHBhcmVudCwgaW5wdXQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIE51bWJlciBvbmx5IHZhbGlkYXRpb25cbiAgICAgICAgaWYgKGlucHV0LmNsYXNzTGlzdC5jb250YWlucygnanMtdmFsaWRhdGlvbi1jaGlsZCcpKSB7XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgIUZvcm1WYWxpZGF0aW9uLm9ubHlOdW1iZXJWYWxpZGF0aW9uKGlucHV0LnZhbHVlKVxuICAgICAgICAgICAgfHwgTnVtYmVyKGlucHV0LnZhbHVlKSA+IDEyXG4gICAgICAgICAgICB8fCBOdW1iZXIoaW5wdXQudmFsdWUpIDwgMFxuICAgICAgICAgICkge1xuICAgICAgICAgICAgdGhpcy5zaG93VmFsaWRhdGlvbk1lc3NhZ2UocGFyZW50LCBpbnB1dCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmVycm9ycztcbiAgfVxuXG4gIHN0YXRpYyB2YWxpZGF0ZU1vYmlsZU51bWJlcihudW1iZXIpIHtcbiAgICBpZiAobnVtYmVyLmxlbmd0aCA8IDggfHwgbnVtYmVyLmxlbmd0aCA+IDE0KSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGNvbnN0IGZpbHRlciA9IC9eW1xcK1xcZF0/KD86W1xcZC0uXFxzKCldKikkLztcbiAgICByZXR1cm4gZmlsdGVyLnRlc3QobnVtYmVyKTtcbiAgfVxuXG4gIHN0YXRpYyBvbmx5QWxwaGFiZXRWYWxpZGF0aW9uKHZhbHVlKSB7XG4gICAgY29uc3QgZmlsdGVyID0gL15bYS16QS1aXFxzXSokLztcbiAgICByZXR1cm4gZmlsdGVyLnRlc3QodmFsdWUpO1xuICB9XG5cbiAgc3RhdGljIG9ubHlOdW1iZXJWYWxpZGF0aW9uKHZhbHVlKSB7XG4gICAgY29uc3QgZmlsdGVyID0gL15cXGQrJC87XG4gICAgcmV0dXJuIGZpbHRlci50ZXN0KHZhbHVlKTtcbiAgfVxuXG4gIHN0YXRpYyB2YWxpZGF0ZUVtYWlsQWRkcmVzcyhlbWFpbCkge1xuICAgIGlmIChlbWFpbC5sZW5ndGggPCAyKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGNvbnN0IGZpbHRlciA9IC9eKD89Lns4LDI1NH0kKSgoPzooW2EtekEtWjAtOSEjJCUmJyorLz0/Xl9ge3x9fi1dKyg/OlxcLlthLXpBLVowLTkhIyQlJicqKy89P15fYHt8fX4tXSspKil8XCIoPz0uezIsMjQ4fVwiKSg/OltcXHgwMS1cXHgwOFxceDBiXFx4MGNcXHgwZS1cXHgxZlxceDIxXFx4MjMtXFx4NWJcXHg1ZC1cXHg3Zl18XFxcXFtcXHgwMS1cXHgwOVxceDBiXFx4MGNcXHgwZS1cXHg3Zl0pKlwiKUAoPzooPzpbYS16QS1aMC05XSg/OlthLXpBLVowLTktXSpbYS16QS1aMC05XSl7MSw2M30/XFwuKStbYS16QS1aMC05XSgoPzpbYS16QS1aMC05LV0qW2EtekEtWjAtOV0pezEsNjN9KXxcXFsoPzooPzooMig1WzAtNV18WzAtNF1bMC05XSl8MVswLTldWzAtOV18WzEtOV0/WzAtOV0pKVxcLil7M30oPzooMig1WzAtNV18WzAtNF1bMC05XSl8MVswLTldWzAtOV18WzEtOV0/WzAtOV0pfFthLXpBLVowLTktXSpbYS16QS1aMC05XTooPzpbXFx4MDEtXFx4MDhcXHgwYlxceDBjXFx4MGUtXFx4MWZcXHgyMS1cXHg1YVxceDUzLVxceDdmXXxcXFxcW1xceDAxLVxceDA5XFx4MGJcXHgwY1xceDBlLVxceDdmXSkrKVxcXSkpJC87XG4gICAgcmV0dXJuIGZpbHRlci50ZXN0KGVtYWlsKTtcbiAgfVxuXG4gIHNob3dWYWxpZGF0aW9uTWVzc2FnZShwYXJlbnQsIGVycm9yKSB7XG4gICAgY29uc3QgZWxlbWVudCA9IHBhcmVudC5xdWVyeVNlbGVjdG9yKCcuanMtdmFsaWRhdGlvbi1tZXNzYWdlJyk7XG4gICAgaWYgKGVsZW1lbnQpIHtcbiAgICAgIHRoaXMuZXJyb3JzLnB1c2goZXJyb3IpO1xuICAgICAgZWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKCd1ay1oaWRkZW4nKTtcbiAgICB9XG4gIH1cblxuICByZXNldFZhbGlkYXRpb24oKSB7XG4gICAgY29uc3QgdmFsaWRhdGlvbk1lc3NhZ2VzID0gdGhpcy5jb250YWluZXIucXVlcnlTZWxlY3RvckFsbCgnLmpzLXZhbGlkYXRpb24tbWVzc2FnZScpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdmFsaWRhdGlvbk1lc3NhZ2VzLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICB2YWxpZGF0aW9uTWVzc2FnZXNbaV0uY2xhc3NMaXN0LmFkZCgndWstaGlkZGVuJyk7XG4gICAgfVxuICB9XG5cbiAgLy8gcmVzZXQgdGhlIGZvcm0gdG8gb3JpZ2luYWwgc3RhdGVcbiAgcmVzZXRGb3JtKGUpIHtcbiAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgdGhpcy5mb3JtU3VibWl0dGVkID0gZmFsc2U7XG4gICAgLy8gdGhpcy5lcnJvck1lc3NhZ2UuY2xhc3NMaXN0LmFkZCgndWstaGlkZGVuJyk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmlucHV0cy5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgLy8gcmVzZXQgdGV4dCBpbnB1dHMsIHRleHQgYXJlYXMgYW5kIGRhdGVcbiAgICAgIGlmICh0aGlzLmlucHV0c1tpXS52YWx1ZSkge1xuICAgICAgICB0aGlzLmlucHV0c1tpXS52YWx1ZSA9ICcnO1xuICAgICAgfVxuICAgICAgLy8gcmVzZXQgY2hlY2tib3ggYW5kIHJhZGlvIGJ1dHRvbnNcbiAgICAgIGlmICh0aGlzLmlucHV0c1tpXS5jaGVja2VkKSB7XG4gICAgICAgIHRoaXMuaW5wdXRzW2ldLmNoZWNrZWQgPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5yZXNldFZhbGlkYXRpb24oKTtcbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBGb3JtVmFsaWRhdGlvbjtcbiIsImV4cG9ydCBkZWZhdWx0IFtcbiAge1xuICAgIGZlYXR1cmVUeXBlOiAnYWRtaW5pc3RyYXRpdmUnLFxuICAgIGVsZW1lbnRUeXBlOiAnbGFiZWxzLnRleHQuZmlsbCcsXG4gICAgc3R5bGVyczogW1xuICAgICAge1xuICAgICAgICBjb2xvcjogJyM0NDQ0NDQnLFxuICAgICAgfSxcbiAgICBdLFxuICB9LFxuICB7XG4gICAgZmVhdHVyZVR5cGU6ICdsYW5kc2NhcGUnLFxuICAgIGVsZW1lbnRUeXBlOiAnYWxsJyxcbiAgICBzdHlsZXJzOiBbXG4gICAgICB7XG4gICAgICAgIGNvbG9yOiAnI0Y4RjhGOCcsXG4gICAgICB9LFxuICAgIF0sXG4gIH0sXG4gIHtcbiAgICBmZWF0dXJlVHlwZTogJ3BvaScsXG4gICAgZWxlbWVudFR5cGU6ICdhbGwnLFxuICAgIHN0eWxlcnM6IFtcbiAgICAgIHtcbiAgICAgICAgdmlzaWJpbGl0eTogJ29uJyxcbiAgICAgIH0sXG4gICAgXSxcbiAgfSxcbiAge1xuICAgIGZlYXR1cmVUeXBlOiAncG9pLnBhcmsnLFxuICAgIGVsZW1lbnRUeXBlOiAnYWxsJyxcbiAgICBzdHlsZXJzOiBbXG4gICAgICB7XG4gICAgICAgIHZpc2liaWxpdHk6ICdvZmYnLFxuICAgICAgfSxcbiAgICBdLFxuICB9LFxuICB7XG4gICAgZmVhdHVyZVR5cGU6ICdyb2FkJyxcbiAgICBlbGVtZW50VHlwZTogJ2FsbCcsXG4gICAgc3R5bGVyczogW10sXG4gIH0sXG4gIHtcbiAgICBmZWF0dXJlVHlwZTogJ3JvYWQnLFxuICAgIGVsZW1lbnRUeXBlOiAnZ2VvbWV0cnknLFxuICAgIHN0eWxlcnM6IFtcbiAgICAgIHtcbiAgICAgICAgY29sb3I6ICcjRDVENkQ4JyxcbiAgICAgIH0sXG4gICAgXSxcbiAgfSxcbiAge1xuICAgIGZlYXR1cmVUeXBlOiAncm9hZC5hcnRlcmlhbCcsXG4gICAgZWxlbWVudFR5cGU6ICdsYWJlbHMuaWNvbicsXG4gICAgc3R5bGVyczogW1xuICAgICAge1xuICAgICAgICB2aXNpYmlsaXR5OiAnb24nLFxuICAgICAgfSxcbiAgICBdLFxuICB9LFxuICB7XG4gICAgZmVhdHVyZVR5cGU6ICd0cmFuc2l0JyxcbiAgICBlbGVtZW50VHlwZTogJ2FsbCcsXG4gICAgc3R5bGVyczogW1xuICAgICAge1xuICAgICAgICB2aXNpYmlsaXR5OiAnb24nLFxuICAgICAgfSxcbiAgICBdLFxuICB9LFxuICB7XG4gICAgZmVhdHVyZVR5cGU6ICd3YXRlcicsXG4gICAgZWxlbWVudFR5cGU6ICdhbGwnLFxuICAgIHN0eWxlcnM6IFtcbiAgICAgIHtcbiAgICAgICAgY29sb3I6ICcjNkNCRkQ2JyxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIHZpc2liaWxpdHk6ICdvbicsXG4gICAgICB9LFxuICAgIF0sXG4gIH0sXG5dO1xuIiwiLyogZ2xvYmFsIGRvY3VtZW50LCB3aW5kb3csIGdvb2dsZSAqL1xuaW1wb3J0IG1hcFN0eWxlcyBmcm9tICcuL2dvb2dsZS1tYXAtc3R5bGVzJztcblxuY2xhc3MgR29vZ2xlTWFwIHtcbiAgY29uc3RydWN0b3IoY29udGFpbmVyKSB7XG4gICAgdGhpcy5jb250YWluZXIgPSBjb250YWluZXI7XG4gIH1cblxuICBpbml0KCkge1xuICAgIC8vIGdldCB0aGUgZWxlbWVudHNcbiAgICB0aGlzLmdvb2dsZU1hcFNjcmlwdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdqcy1nb29nbGUtbWFwLXNjcmlwdCcpO1xuICAgIHRoaXMuem9vbSA9IHBhcnNlSW50KHRoaXMuY29udGFpbmVyLmdldEF0dHJpYnV0ZSgnZGF0YS16b29tJyksIDEwKTtcbiAgICB0aGlzLmxhdCA9IHBhcnNlRmxvYXQodGhpcy5jb250YWluZXIuZ2V0QXR0cmlidXRlKCdkYXRhLWxhdCcpKTtcbiAgICB0aGlzLmxuZyA9IHBhcnNlRmxvYXQodGhpcy5jb250YWluZXIuZ2V0QXR0cmlidXRlKCdkYXRhLWxuZycpKTtcbiAgICB0aGlzLmtleSA9IHRoaXMuY29udGFpbmVyLmdldEF0dHJpYnV0ZSgnZGF0YS1rZXknKTtcbiAgICB0aGlzLnRpdGxlID0gdGhpcy5jb250YWluZXIuZ2V0QXR0cmlidXRlKCdkYXRhLXRpdGxlJyk7XG4gICAgdGhpcy5jcmVhdGVTY3JpcHRUYWcoKTtcbiAgICB3aW5kb3cuaW5pdGlhbGl6ZUdvb2dsZU1hcCA9IHRoaXMubWFwUmVhZHkuYmluZCh0aGlzKTtcbiAgfVxuXG4gIG1hcFJlYWR5KCkge1xuICAgIGNvbnN0IG1hcE9wdGlvbnMgPSB7XG4gICAgICAvLyBIb3cgem9vbWVkIGluIHlvdSB3YW50IHRoZSBtYXAgdG8gc3RhcnQgYXQgKGFsd2F5cyByZXF1aXJlZClcbiAgICAgIHpvb206IHRoaXMuem9vbSxcblxuICAgICAgLy8gVGhlIGxhdGl0dWRlIGFuZCBsb25naXR1ZGUgdG8gY2VudGVyIHRoZSBtYXAgKGFsd2F5cyByZXF1aXJlZClcbiAgICAgIGNlbnRlcjogbmV3IGdvb2dsZS5tYXBzLkxhdExuZyh0aGlzLmxhdCwgdGhpcy5sbmcpLFxuXG4gICAgICAvLyBNYXAgc3R5bGVzLlxuICAgICAgc3R5bGVzOiBtYXBTdHlsZXMsXG4gICAgfTtcblxuICAgIGNvbnN0IG1hcCA9IG5ldyBnb29nbGUubWFwcy5NYXAodGhpcy5jb250YWluZXIsIG1hcE9wdGlvbnMpO1xuXG4gICAgY29uc3QgbWFya2VyID0gbmV3IGdvb2dsZS5tYXBzLk1hcmtlcih7XG4gICAgICBwb3NpdGlvbjogbmV3IGdvb2dsZS5tYXBzLkxhdExuZyh0aGlzLmxhdCwgdGhpcy5sbmcpLFxuICAgICAgbWFwLFxuICAgICAgdGl0bGU6IHRoaXMudGl0bGUsXG4gICAgfSk7XG4gIH1cblxuICBjcmVhdGVTY3JpcHRUYWcoKSB7XG4gICAgaWYgKHRoaXMuZ29vZ2xlTWFwU2NyaXB0ICE9PSBudWxsKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICghdGhpcy5rZXkpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ01pc3NpbmcgZ29vZ2xlIG1hcHMgYXBpIGtleScpO1xuICAgIH1cblxuICAgIGNvbnN0IHRhZyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NjcmlwdCcpO1xuICAgIHRhZy5pZCA9ICdqcy1nb29nbGUtbWFwLXNjcmlwdCc7XG4gICAgdGFnLnNyYyA9IGBodHRwczovL21hcHMuZ29vZ2xlYXBpcy5jb20vbWFwcy9hcGkvanM/a2V5PSR7XG4gICAgICB0aGlzLmtleVxuICAgIH0mY2FsbGJhY2s9aW5pdGlhbGl6ZUdvb2dsZU1hcGA7XG4gICAgdGhpcy5nb29nbGVNYXBTY3JpcHQgPSB0YWc7XG4gICAgY29uc3QgZmlyc3RTY3JpcHRUYWcgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnc2NyaXB0JylbMF07XG4gICAgZmlyc3RTY3JpcHRUYWcucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUodGFnLCBmaXJzdFNjcmlwdFRhZyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gY3JlYXRlR29vZ2xlTWFwKCkge1xuICBjb25zdCBnb29nbGVNYXBDb250YWluZXIgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuanMtZ29vZ2xlLW1hcCcpO1xuICBpZiAoZ29vZ2xlTWFwQ29udGFpbmVyLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBnb29nbGVNYXBDb250YWluZXIubGVuZ3RoOyBpICs9IDEpIHtcbiAgICBjb25zdCBnb29nbGVNYXAgPSBuZXcgR29vZ2xlTWFwKGdvb2dsZU1hcENvbnRhaW5lcltpXSk7XG4gICAgZ29vZ2xlTWFwLmluaXQoKTtcbiAgfVxuICByZXR1cm4gbnVsbDtcbn1cblxuZXhwb3J0IGRlZmF1bHQgY3JlYXRlR29vZ2xlTWFwO1xuIiwiLyogZ2xvYmFsIHdpbmRvdywgZG9jdW1lbnQgKi9cbmltcG9ydCB7IGRpc2FibGVCb2R5U2Nyb2xsLCBlbmFibGVCb2R5U2Nyb2xsIH0gZnJvbSAnYm9keS1zY3JvbGwtbG9jayc7XG5pbXBvcnQgeyB0aHJvdHRsZSwgZGVib3VuY2UgfSBmcm9tICcuLi91dGlscyc7XG5cbmNsYXNzIE1haW5OYXZpZ2F0aW9uIHtcbiAgaW5pdCgpIHtcbiAgICB0aGlzLm1haW5NZW51ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2pzLW1haW4tbWVudScpO1xuICAgIGlmICghdGhpcy5tYWluTWVudSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLm1haW5NZW51SGVpZ2h0ID0gdGhpcy5tYWluTWVudS5jbGllbnRIZWlnaHQ7XG4gICAgdGhpcy5zdWJtZW51cyA9IHRoaXMubWFpbk1lbnUucXVlcnlTZWxlY3RvckFsbCgnLmpzLXN1Ym1lbnUnKTtcbiAgICB0aGlzLnN1Ym1lbnVCdXR0b25zID0gdGhpcy5tYWluTWVudS5xdWVyeVNlbGVjdG9yQWxsKCcuanMtc3VibWVudS1idXR0b24nKTtcbiAgICB0aGlzLnNjcm9sbFBvcyA9IDA7XG4gICAgdGhpcy5wcmV2U2NvbGxQb3MgPSAwO1xuICAgIHRoaXMuc2Nyb2xsSW50ZXJhY3Rpb25zID0gdGhpcy5zY3JvbGxJbnRlcmFjdGlvbnMuYmluZCh0aGlzKTtcblxuICAgIC8vIGV2ZW50c1xuXG4gICAgdGhpcy50b2dnbGVTdWJtZW51ID0gdGhpcy50b2dnbGVTdWJtZW51LmJpbmQodGhpcyk7XG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsIHRocm90dGxlKHRoaXMuc2Nyb2xsSW50ZXJhY3Rpb25zLCAxMCkpO1xuICAgIHRoaXMuc2Nyb2xsSW50ZXJhY3Rpb25zKCk7XG4gICAgdGhpcy5jbG9zZUFsbFN1Ym1lbnVzKCk7XG5cbiAgICAvLyBhZGQgY2xpY2sgZXZlbnRzIHRvIHN1Ym1lbnUgaXRlbXM7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnN1Ym1lbnVCdXR0b25zLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICB0aGlzLnN1Ym1lbnVCdXR0b25zW2ldLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy50b2dnbGVTdWJtZW51LCBmYWxzZSk7XG4gICAgfVxuXG4gICAgLy8gc2hvdyBoZWFkZXJcbiAgICB0aGlzLm1haW5NZW51LmNsYXNzTGlzdC5yZW1vdmUoJ2JrLWhlYWRlcl9oaWRlJyk7XG4gIH1cblxuICBjbG9zZUFsbFN1Ym1lbnVzKCkge1xuICAgIHRoaXMubWFpbk1lbnUuY2xhc3NMaXN0LnJlbW92ZSgnYmstaGVhZGVyLWFjdGl2ZScpO1xuICAgIC8vIGhpZGUgYWxsIHN1Ym1lbnVzXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnN1Ym1lbnVzLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICB0aGlzLnN1Ym1lbnVzW2ldLmNsYXNzTGlzdC5hZGQoJ3VrLWhpZGRlbicpO1xuICAgIH1cbiAgICAvLyByZW1vdmUgYWxsIGFjdGl2ZSBjbGFzc2VzXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnN1Ym1lbnVCdXR0b25zLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICB0aGlzLnN1Ym1lbnVCdXR0b25zW2ldLmNsYXNzTGlzdC5yZW1vdmUoJ3VrLW9wZW4nKTtcbiAgICB9XG4gIH1cblxuICBvcGVuU3VibWVudShpZCkge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5zdWJtZW51cy5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgLy8gY2hlY2sgaWYgaXRzIHRoZSByaWdodCBzdWJuYXYgYW5kIG9wZW5cbiAgICAgIGNvbnN0IGlzT3BlbiA9ICF0aGlzLnN1Ym1lbnVzW2ldLmNsYXNzTGlzdC5jb250YWlucygndWstaGlkZGVuJyk7XG4gICAgICBjb25zdCBsaW5rSWQgPSB0aGlzLnN1Ym1lbnVzW2ldLmdldEF0dHJpYnV0ZSgnZGF0YS1saW5rLWlkJyk7XG4gICAgICAvLyBjaGVjayBpZiB0aGUgY3VycmVudCBvbmUgaXMgb3BlbiBhbmQgY2xvc2UgaXRcbiAgICAgIGlmIChsaW5rSWQgPT09IGlkICYmIGlzT3Blbikge1xuICAgICAgICB0aGlzLnN1Ym1lbnVzW2ldLmNsYXNzTGlzdC5hZGQoJ3VrLWhpZGRlbicpO1xuICAgICAgICB0aGlzLm1haW5NZW51LmNsYXNzTGlzdC5yZW1vdmUoJ2JrLWhlYWRlci1zdWJuYXYtb3BlbicpO1xuICAgICAgICAvLyBjbG9zZSBhbGwgYW5kIG9wZW4gdGhlIG9uZSBzZWxlY3RlZFxuICAgICAgfSBlbHNlIGlmIChsaW5rSWQgPT09IGlkKSB7XG4gICAgICAgIHRoaXMuY2xvc2VBbGxTdWJtZW51cygpO1xuICAgICAgICB0aGlzLnN1Ym1lbnVzW2ldLmNsYXNzTGlzdC5yZW1vdmUoJ3VrLWhpZGRlbicpO1xuICAgICAgICB0aGlzLm1haW5NZW51LmNsYXNzTGlzdC5hZGQoJ2JrLWhlYWRlci1zdWJuYXYtb3BlbicpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHRvZ2dsZVN1Ym1lbnUoZXZlbnQpIHtcbiAgICBjb25zdCBsaW5rSWQgPSBldmVudC50YXJnZXQuZ2V0QXR0cmlidXRlKCdkYXRhLWxpbmstaWQnKTtcbiAgICBpZiAobGlua0lkKSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgdGhpcy5vcGVuU3VibWVudShsaW5rSWQpO1xuICAgICAgaWYgKGV2ZW50LnRhcmdldC5jbGFzc0xpc3QuY29udGFpbnMoJ3VrLW9wZW4nKSkge1xuICAgICAgICBldmVudC50YXJnZXQuY2xhc3NMaXN0LnJlbW92ZSgndWstb3BlbicpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZXZlbnQudGFyZ2V0LmNsYXNzTGlzdC5hZGQoJ3VrLW9wZW4nKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBzY3JvbGxJbnRlcmFjdGlvbnMoKSB7XG4gICAgdGhpcy5wcmV2U2NvbGxQb3MgPSB0aGlzLnNjcm9sbFBvcztcbiAgICB0aGlzLnNjcm9sbFBvcyA9IHdpbmRvdy5zY3JvbGxZIHx8IHdpbmRvdy5zY3JvbGxUb3AgfHwgZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2h0bWwnKVswXS5zY3JvbGxUb3A7XG5cbiAgICBpZiAodGhpcy5zY3JvbGxQb3MgPiB0aGlzLm1haW5NZW51SGVpZ2h0KSB7XG4gICAgICB0aGlzLm1haW5NZW51LmNsYXNzTGlzdC5hZGQoJ2JrLWhlYWRlci1hY3RpdmUnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5tYWluTWVudS5jbGFzc0xpc3QucmVtb3ZlKCdiay1oZWFkZXItYWN0aXZlJyk7XG4gICAgfVxuICAgIC8vXG4gICAgaWYgKHRoaXMuc2Nyb2xsUG9zIDwgdGhpcy5tYWluTWVudUhlaWdodCAqIDQpIHtcbiAgICAgIHRoaXMubWFpbk1lbnUuY2xhc3NMaXN0LnJlbW92ZSgnYmstaGVhZGVyLXVwJyk7XG4gICAgfSBlbHNlIGlmICh0aGlzLnByZXZTY29sbFBvcyA+IHRoaXMuc2Nyb2xsUG9zKSB7XG4gICAgICB0aGlzLm1haW5NZW51LmNsYXNzTGlzdC5yZW1vdmUoJ2JrLWhlYWRlci11cCcpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLm1haW5NZW51LmNsYXNzTGlzdC5hZGQoJ2JrLWhlYWRlci11cCcpO1xuICAgIH1cbiAgfVxufVxuXG5jbGFzcyBNb2JpbGVOYXZpZ2F0aW9uIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgLy8gRG9tIGVsZW1lbnRzXG4gICAgdGhpcy5tb2JpbGVNZW51ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2pzLW1vYmlsZS1tZW51Jyk7XG4gICAgdGhpcy5tYWluTWVudSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdqcy1tYWluLW1lbnUnKTtcbiAgICB0aGlzLm1vYmlsZU5hdkJ1dHRvbiA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5qcy1tb2JpbGUtbmF2LWJ1dHRvbicpO1xuICAgIHRoaXMubWVudUNvbnRlbnQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuanMtbW9iaWxlLW1lbnUtY29udGVudCcpO1xuICAgIHRoaXMuZm9vdGVyID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmpzLW1vYmlsZS1tZW51LWZvb3RlcicpO1xuICAgIHRoaXMub3ZlcmxheSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5qcy1tb2JpbGUtbWVudS1vdmVybGF5Jyk7XG4gICAgdGhpcy5oZWFkZXIgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuanMtbW9iaWxlLW1lbnUtaGVhZGVyJyk7XG4gICAgdGhpcy5zaWRlbWVudXMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuanMtbW9iaWxlLW1lbnUtc2lkZW1lbnUnKTtcbiAgICB0aGlzLnNpZGVtZW51QnV0dG9ucyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5qcy1tb2JpbGUtbWVudS1zaWRlbWVudS1idXR0b25zJyk7XG4gICAgdGhpcy5vcGVuU2lkZU1lbnUgPSB0aGlzLm9wZW5TaWRlTWVudS5iaW5kKHRoaXMpO1xuICAgIHRoaXMuY2xvc2VTaWRlTWVudSA9IHRoaXMuY2xvc2VTaWRlTWVudS5iaW5kKHRoaXMpO1xuICB9XG5cbiAgaW5pdCgpIHtcbiAgICBjb25zdCBbcm9vdF0gPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnaHRtbCcpO1xuICAgIHRoaXMucm9vdCA9IHJvb3Q7XG5cbiAgICBpZiAoIXRoaXMubW9iaWxlTWVudSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIHNldCBoZWlnaHQgb2YgY29udGVudFxuICAgIGNvbnN0IGhlYWRlckhlaWdodCA9IHRoaXMuaGVhZGVyLm9mZnNldEhlaWdodDtcbiAgICBjb25zdCBmb290ZXJIZWlnaHQgPSB0aGlzLmZvb3Rlci5vZmZzZXRIZWlnaHQ7XG4gICAgY29uc3QgaGVpZ2h0ID0gTWF0aC5tYXgoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCwgd2luZG93LmlubmVySGVpZ2h0IHx8IDApO1xuXG4gICAgY29uc3QgY29udGVudEhlaWdodCA9IGhlaWdodCAtIChoZWFkZXJIZWlnaHQgKyBmb290ZXJIZWlnaHQpO1xuICAgIHRoaXMubWVudUNvbnRlbnQuc3R5bGUuaGVpZ2h0ID0gYCR7Y29udGVudEhlaWdodH1weGA7XG5cbiAgICB0aGlzLm1vYmlsZU1lbnVPcGVuID0gZmFsc2U7XG4gICAgdGhpcy50b2dnbGVNZW51ID0gdGhpcy50b2dnbGVNZW51LmJpbmQodGhpcyk7XG4gICAgdGhpcy5tb2JpbGVOYXZCdXR0b24uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLnRvZ2dsZU1lbnUsIGZhbHNlKTtcblxuICAgIC8vIHNldCB1cCBjbGljayBldmVudHMgZm9yIHNpZGVtZW51IGJ1dHRvbnNcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuc2lkZW1lbnVCdXR0b25zLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICBjb25zdCBzaWRlTWVudU9wZW5CdXR0b24gPSB0aGlzLnNpZGVtZW51QnV0dG9uc1tpXS5xdWVyeVNlbGVjdG9yKFxuICAgICAgICAnLmpzLW1vYmlsZS1tZW51LXNpZGVtZW51LWJ1dHRvbicsXG4gICAgICApO1xuICAgICAgaWYgKHNpZGVNZW51T3BlbkJ1dHRvbikge1xuICAgICAgICBjb25zdCBpZCA9IHNpZGVNZW51T3BlbkJ1dHRvbi5nZXRBdHRyaWJ1dGUoJ2RhdGEtaWQnKTtcbiAgICAgICAgY29uc3QgbWVudSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYFtkYXRhLWlkPSdtZW51LWNvbnRlbnQtJHtpZH0nXWApO1xuXG4gICAgICAgIGlmIChtZW51KSB7XG4gICAgICAgICAgc2lkZU1lbnVPcGVuQnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4gdGhpcy5vcGVuU2lkZU1lbnUobWVudSkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIC8vIHNldCB1cCBjbG9zZSBjbGljayBldmVudHMuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnNpZGVtZW51cy5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgY29uc3Qgc2lkZU1lbnVDbG9zZUJ1dHRvbiA9IHRoaXMuc2lkZW1lbnVzW2ldLnF1ZXJ5U2VsZWN0b3IoJy5qcy1tb2JpbGUtbWVudS1zaWRlbWVudS1jbG9zZScpO1xuICAgICAgaWYgKHNpZGVNZW51Q2xvc2VCdXR0b24pIHtcbiAgICAgICAgY29uc3QgaWQgPSBzaWRlTWVudUNsb3NlQnV0dG9uLmdldEF0dHJpYnV0ZSgnZGF0YS1pZCcpO1xuICAgICAgICBjb25zdCBtZW51ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihgW2RhdGEtaWQ9J21lbnUtY29udGVudC0ke2lkfSddYCk7XG5cbiAgICAgICAgaWYgKG1lbnUpIHtcbiAgICAgICAgICBzaWRlTWVudUNsb3NlQnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4gdGhpcy5jbG9zZVNpZGVNZW51KG1lbnUpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIG9wZW5TaWRlTWVudShjb250YWluZXIpIHtcbiAgICBlbmFibGVCb2R5U2Nyb2xsKHRoaXMubWVudUNvbnRlbnQpO1xuICAgIGNvbnN0IHNpZGVNZW51Q29udGVudCA9IGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCcuanMtbW9iaWxlLW1lbnUtc2lkZW1lbnUtbGlua3MnKTtcbiAgICBjb25zdCBoZWFkZXIgPSBjb250YWluZXIucXVlcnlTZWxlY3RvcignLmpzLW1vYmlsZS1tZW51LXNpZGVtZW51LWhlYWRlcicpO1xuICAgIGNvbnN0IGhlaWdodCA9IE1hdGgubWF4KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQsIHdpbmRvdy5pbm5lckhlaWdodCB8fCAwKTtcbiAgICBjb25zdCBjb250ZW50SGVpZ2h0ID0gaGVpZ2h0IC0gaGVhZGVyLm9mZnNldEhlaWdodDtcbiAgICBzaWRlTWVudUNvbnRlbnQuc3R5bGUuaGVpZ2h0ID0gYCR7Y29udGVudEhlaWdodH1weGA7XG4gICAgZGlzYWJsZUJvZHlTY3JvbGwoc2lkZU1lbnVDb250ZW50KTtcbiAgICB0aGlzLm1haW5NZW51LmNsYXNzTGlzdC5hZGQoJ2JrLW1vYmlsZS1tZW51LXN1Yi0tb3BlbicpO1xuICAgIHRoaXMub3ZlcmxheS5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMub3ZlcmxheS5jbGFzc0xpc3QuYWRkKCdiay1tb2JpbGUtbWVudV9fb3ZlcmxheS0tYWN0aXZlJyk7XG4gICAgICBjb250YWluZXIuY2xhc3NMaXN0LmFkZCgnYmstbW9iaWxlLW1lbnVfX3NpZGVtZW51LS1vcGVuJyk7XG4gICAgfSwgMTAwKTtcbiAgfVxuXG4gIGNsb3NlU2lkZU1lbnUoY29udGFpbmVyKSB7XG4gICAgY29udGFpbmVyLmNsYXNzTGlzdC5yZW1vdmUoJ2JrLW1vYmlsZS1tZW51X19zaWRlbWVudS0tb3BlbicpO1xuICAgIGRpc2FibGVCb2R5U2Nyb2xsKHRoaXMubWVudUNvbnRlbnQpO1xuICAgIGNvbnN0IHNpZGVNZW51Q29udGVudCA9IGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCcuYmstbW9iaWxlLW1lbnVfX3NpZGVtZW51LWxpbmtzJyk7XG4gICAgZW5hYmxlQm9keVNjcm9sbChzaWRlTWVudUNvbnRlbnQpO1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5vdmVybGF5LmNsYXNzTGlzdC5yZW1vdmUoJ2JrLW1vYmlsZS1tZW51X19vdmVybGF5LS1hY3RpdmUnKTtcbiAgICB9LCAxMDApO1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5tYWluTWVudS5jbGFzc0xpc3QucmVtb3ZlKCdiay1tb2JpbGUtbWVudS1zdWItLW9wZW4nKTtcbiAgICAgIHRoaXMub3ZlcmxheS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgIH0sIDI1MCk7XG4gIH1cblxuICB0b2dnbGVNZW51KGV2ZW50KSB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICB0aGlzLm1vYmlsZU1lbnVPcGVuID0gIXRoaXMubW9iaWxlTWVudU9wZW47XG5cbiAgICBpZiAodGhpcy5tb2JpbGVNZW51T3Blbikge1xuICAgICAgdGhpcy5tYWluTWVudS5jbGFzc0xpc3QuYWRkKCdiay1tb2JpbGUtbWVudS1vcGVuJyk7XG4gICAgICB0aGlzLm1lbnVDb250ZW50LmNsYXNzTGlzdC5hZGQoJ2JrLW1vYmlsZS1tZW51LWZhZGVpbicpO1xuICAgICAgdGhpcy5mb290ZXIuY2xhc3NMaXN0LmFkZCgnYmstbW9iaWxlLW1lbnUtZmFkZWluJyk7XG4gICAgICB0aGlzLm1vYmlsZU5hdkJ1dHRvbi5jbGFzc0xpc3QuYWRkKCdpcy1hY3RpdmUnKTtcbiAgICAgIGRpc2FibGVCb2R5U2Nyb2xsKHRoaXMubWVudUNvbnRlbnQpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLm1haW5NZW51LmNsYXNzTGlzdC5yZW1vdmUoJ2JrLW1vYmlsZS1tZW51LW9wZW4nKTtcbiAgICAgIHRoaXMubWVudUNvbnRlbnQuY2xhc3NMaXN0LnJlbW92ZSgnYmstbW9iaWxlLW1lbnUtZmFkZWluJyk7XG4gICAgICB0aGlzLmZvb3Rlci5jbGFzc0xpc3QucmVtb3ZlKCdiay1tb2JpbGUtbWVudS1mYWRlaW4nKTtcbiAgICAgIHRoaXMubW9iaWxlTmF2QnV0dG9uLmNsYXNzTGlzdC5yZW1vdmUoJ2lzLWFjdGl2ZScpO1xuICAgICAgZW5hYmxlQm9keVNjcm9sbCh0aGlzLm1lbnVDb250ZW50KTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gcmVzaXplTW9iaWxlTmF2KCkge1xuICBjb25zdCBtb2JpbGVNZW51Q29udGFpbmVyID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmpzLW1vYmlsZS1tZW51LWNvbnRhaW5lcicpO1xuICBpZiAobW9iaWxlTWVudUNvbnRhaW5lcikge1xuICAgIGNvbnN0IHZoID0gTWF0aC5tYXgoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCwgd2luZG93LmlubmVySGVpZ2h0IHx8IDApO1xuICAgIG1vYmlsZU1lbnVDb250YWluZXIuc3R5bGUuaGVpZ2h0ID0gYCR7dmh9cHhgO1xuICB9XG59XG5cbi8vIFJlc2V0IGhlaWdodCBvZiB0aGUgbW9iaWxlIG5hdiB3aGVuIHRoZSBicm93c2VyIGlzIHJlc2l6ZWRcbmNvbnN0IHdpbmRvd1Jlc2l6ZURlYm91bmNlID0gZGVib3VuY2UoKCkgPT4ge1xuICByZXNpemVNb2JpbGVOYXYoKTtcbn0sIDI1MCk7XG5cbnJlc2l6ZU1vYmlsZU5hdigpO1xuXG53aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigncmVzaXplJywgd2luZG93UmVzaXplRGVib3VuY2UpO1xuXG5leHBvcnQgeyBNb2JpbGVOYXZpZ2F0aW9uLCBNYWluTmF2aWdhdGlvbiB9O1xuIiwiLyogZ2xvYmFsIGRvY3VtZW50LCB3aW5kb3cgKi9cbmltcG9ydCBVSWtpdCBmcm9tICd1aWtpdCc7XG5pbXBvcnQgeyBUd2Vlbk1heCwgUG93ZXIyIH0gZnJvbSAnZ3NhcCc7XG5pbXBvcnQgY3JlYXRlUHJvZHVjdENhcm91c2VsIGZyb20gJy4vcHJvZHVjdC1jYXJvdXNlbCc7XG5pbXBvcnQgeyB0aHJvdHRsZSB9IGZyb20gJy4uL3V0aWxzJztcblxuY29uc3QgeyBzd2l0Y2hlciwgc2Nyb2xsLCBzbGlkZXNob3cgfSA9IFVJa2l0O1xuXG5jbGFzcyBIZXJvQ2Fyb3VzZWwge1xuICBjb25zdHJ1Y3RvcihoZXJvQ2Fyb3VzZWwpIHtcbiAgICB0aGlzLmhlcm9DYXJvdXNlbCA9IGhlcm9DYXJvdXNlbDtcbiAgICB0aGlzLmhlcm9DYXJvdXNlbEFuY2hvciA9IHRoaXMuaGVyb0Nhcm91c2VsLnF1ZXJ5U2VsZWN0b3IoJy5qcy1oZXJvLWNhcm91c2VsLWFuY2hvcicpO1xuICAgIHRoaXMuaGVyb0Nhcm91c2VsQ29udGFpbmVyID0gdGhpcy5oZXJvQ2Fyb3VzZWwucXVlcnlTZWxlY3RvcignLmpzLWhlcm8tY2Fyb3VzZWwtY29udGFpbmVyJyk7XG4gICAgdGhpcy5zbGlkZXMgPSB0aGlzLmhlcm9DYXJvdXNlbC5xdWVyeVNlbGVjdG9yQWxsKCcuanMtaGVyby1jYXJvdXNlbC1zbGlkZXMnKTtcbiAgICB0aGlzLmhlYWRpbmdzID0gdGhpcy5oZXJvQ2Fyb3VzZWwucXVlcnlTZWxlY3RvcignLmpzLWhlcm8tY2Fyb3VzZWwtaGVhZGluZ3MnKTtcbiAgICB0aGlzLnN3aXRjaGVyID0gdGhpcy5oZXJvQ2Fyb3VzZWwucXVlcnlTZWxlY3RvcignLmpzLWhlcm8tY2Fyb3VzZWwtc3dpdGNoZXInKTtcbiAgICB0aGlzLm5leHRCdXR0b25zID0gdGhpcy5oZXJvQ2Fyb3VzZWwucXVlcnlTZWxlY3RvckFsbCgnLmpzLWhlcm8tY2Fyb3VzZWwtbmV4dC1idXR0b24nKTtcbiAgICB0aGlzLnByZXZCdXR0b25zID0gdGhpcy5oZXJvQ2Fyb3VzZWwucXVlcnlTZWxlY3RvckFsbCgnLmpzLWhlcm8tY2Fyb3VzZWwtcHJldi1idXR0b24nKTtcbiAgICB0aGlzLmJ1dHRvbnMgPSB0aGlzLmhlcm9DYXJvdXNlbC5xdWVyeVNlbGVjdG9yQWxsKCcuanMtY2Fyb3VzZWwtc2xpZGUtYnV0dG9uJyk7XG4gICAgdGhpcy5oZXJvVmlkZW8gPSB0aGlzLmhlcm9DYXJvdXNlbC5xdWVyeVNlbGVjdG9yKCcuanMtaGVyby1jYXJvdXNlbC12aWRlby1mcmFtZScpO1xuICAgIHRoaXMuaGVyb1Bvc3RlciA9IHRoaXMuaGVyb0Nhcm91c2VsLnF1ZXJ5U2VsZWN0b3IoJy5qcy1oZXJvLWNhcm91c2VsLXZpZGVvLXBvc3RlcicpO1xuICAgIHRoaXMud2lzdGlhU2NyaXB0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2pzLXdpc3RpYS1zY3JpcHQnKTtcbiAgICB0aGlzLmRpciA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCdodG1sJylbMF0uZ2V0QXR0cmlidXRlKCdkaXInKTtcbiAgICB0aGlzLmluZGV4ID0gMDtcbiAgICB0aGlzLmlzQW5pbWF0aW5nID0gZmFsc2U7XG4gICAgdGhpcy5pbml0aWFsTG9hZCA9IGZhbHNlO1xuICB9XG5cbiAgaW5pdCgpIHtcbiAgICBpZiAoIXRoaXMuaGVyb0Nhcm91c2VsKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHNjcm9sbE9wdGlvbnMgPSB7XG4gICAgICBkdXJhdGlvbjogNTAwLFxuICAgIH07XG4gICAgdGhpcy5zY3JvbGwgPSBzY3JvbGwodGhpcy5oZXJvQ2Fyb3VzZWxBbmNob3IsIHNjcm9sbE9wdGlvbnMpO1xuICAgIHRoaXMuY3JlYXRlU2NyaXB0VGFnKCk7XG5cbiAgICAvLyBldmVudCBiaW5kaW5nc1xuICAgIHRoaXMuc2hvd1NsaWRlID0gdGhpcy5zaG93U2xpZGUuYmluZCh0aGlzKTtcbiAgICB0aGlzLmhpZGVTbGlkZSA9IHRoaXMuaGlkZVNsaWRlLmJpbmQodGhpcyk7XG4gICAgdGhpcy5zdGFydFZpZGVvID0gdGhpcy5zdGFydFZpZGVvLmJpbmQodGhpcyk7XG4gICAgdGhpcy5oYW5kbGVOZXh0QnV0dG9uID0gdGhpcy5oYW5kbGVOZXh0QnV0dG9uLmJpbmQodGhpcyk7XG4gICAgdGhpcy5oYW5kbGVQcmV2QnV0dG9uID0gdGhpcy5oYW5kbGVQcmV2QnV0dG9uLmJpbmQodGhpcyk7XG4gICAgdGhpcy5oYW5kbGVDaGFuZ2VTbGlkZSA9IHRoaXMuaGFuZGxlQ2hhbmdlU2xpZGUuYmluZCh0aGlzKTtcblxuICAgIHRoaXMuc3dpdGNoZXJFbGVtZW50ID0gc3dpdGNoZXIodGhpcy5zd2l0Y2hlcik7XG4gICAgc3dpdGNoZXIodGhpcy5zd2l0Y2hlcikuc2hvdygwKTtcbiAgICAvLyB1bmJpbmQgc3dpcGUgZXZlbnRcbiAgICB0aGlzLnN3aXRjaGVyRWxlbWVudC5fZXZlbnRzWzJdKHVuYmluZCA9PiB1bmJpbmQoKSk7XG5cbiAgICAvLyByZXNpemUgdG8gdmlldyBwb3J0IGhlaWdodFxuICAgIHRoaXMuc2l6ZUNhcm91c2VsID0gdGhpcy5zaXplQ2Fyb3VzZWwuYmluZCh0aGlzKTtcbiAgICB0aGlzLnNpemVDYXJvdXNlbCgpO1xuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdyZXNpemUnLCB0aHJvdHRsZSh0aGlzLnNpemVDYXJvdXNlbCwgMTApKTtcblxuICAgIHRoaXMubnVtYmVyT2ZTbGlkZXMgPSB0aGlzLnNsaWRlcy5sZW5ndGg7XG5cbiAgICB0aGlzLnNldEhlaWdodE9mTGlzdHMoKTtcbiAgICB0aGlzLnRvZ2dsZUFjdGl2ZUJ1dHRvbigwKTtcblxuICAgIC8vIGFkZCBuZXh0IGJ1dHRvbiBjbGljayBldmVudHNcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMubmV4dEJ1dHRvbnMubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgIHRoaXMubmV4dEJ1dHRvbnNbaV0uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLmhhbmRsZU5leHRCdXR0b24sIGZhbHNlKTtcbiAgICB9XG5cbiAgICAvLyBhZGQgcHJldmlvdXMgYnV0dG9uIGNsaWNrIGV2ZW50c1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5wcmV2QnV0dG9ucy5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgdGhpcy5wcmV2QnV0dG9uc1tpXS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuaGFuZGxlUHJldkJ1dHRvbiwgZmFsc2UpO1xuICAgIH1cblxuICAgIC8vIGFkZCBidXR0b24gY2xpY2sgZXZlbnRzXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmJ1dHRvbnMubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgIHRoaXMuYnV0dG9uc1tpXS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuaGFuZGxlQ2hhbmdlU2xpZGUsIGZhbHNlKTtcbiAgICB9XG5cbiAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgZmluaXRlOiB0cnVlLFxuICAgICAgdmVsb2NpdHk6IDEsXG4gICAgfTtcblxuICAgIC8vIGluaXRpYWwgc2xpZGVzaG93XG4gICAgdGhpcy5zbGlkZXNob3cgPSBzbGlkZXNob3codGhpcy5oZXJvQ2Fyb3VzZWwsIG9wdGlvbnMpO1xuXG4gICAgLy8gdW5iaW5kIHNsaWRlIHNob3cgdG91Y2ggZXZlbnRzO1xuICAgIHRoaXMuc2xpZGVzaG93Ll9ldmVudHNbMl0odW5iaW5kID0+IHVuYmluZCgpKTtcblxuICAgIFVJa2l0LnV0aWwub24odGhpcy5oZXJvQ2Fyb3VzZWwsICdpdGVtc2hvd24nLCB0aGlzLnNob3dTbGlkZSk7XG4gICAgVUlraXQudXRpbC5vbih0aGlzLmhlcm9DYXJvdXNlbCwgJ2l0ZW1oaWRkZW4nLCB0aGlzLmhpZGVTbGlkZSk7XG5cbiAgICBVSWtpdC51dGlsLm9uKHRoaXMuaGVyb0Nhcm91c2VsQW5jaG9yLCAnc2Nyb2xsZWQnLCAoKSA9PiB7XG4gICAgICBjb25zdCBpbmRleCA9IHRoaXMubmV4dFNsaWRlSW5kZXg7XG4gICAgICBpZiAoaW5kZXggPiAwKSB7XG4gICAgICAgIHRoaXMudG9nZ2xlUHJldkJ1dHRvbnModHJ1ZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnRvZ2dsZVByZXZCdXR0b25zKGZhbHNlKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGluZGV4IDwgdGhpcy5udW1iZXJPZlNsaWRlcyAtIDEpIHtcbiAgICAgICAgdGhpcy50b2dnbGVOZXh0QnV0dG9ucyh0cnVlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMudG9nZ2xlTmV4dEJ1dHRvbnMoZmFsc2UpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLnRvZ2dsZUFjdGl2ZUJ1dHRvbihpbmRleCk7XG5cbiAgICAgIGNvbnN0IGhlYWRpbmdzID0gdGhpcy5oZWFkaW5ncy5xdWVyeVNlbGVjdG9yQWxsKCcuanMtY2Fyb3VzZWwtc2xpZGUtY29udGVudCcpO1xuICAgICAgY29uc3Qgd2lkdGhzID0gW107XG5cbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaGVhZGluZ3MubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgd2lkdGhzLnB1c2goaGVhZGluZ3NbaV0ub2Zmc2V0V2lkdGgpO1xuICAgICAgfVxuXG4gICAgICBsZXQgd2lkdGggPSAwO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpbmRleDsgaSArPSAxKSB7XG4gICAgICAgIHdpZHRoICs9IHdpZHRoc1tpXTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuZGlyID09PSAncnRsJykge1xuICAgICAgICB0aGlzLmhlYWRpbmdzLnN0eWxlLnRyYW5zZm9ybSA9IGB0cmFuc2xhdGVYKCR7d2lkdGh9cHgpYDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuaGVhZGluZ3Muc3R5bGUudHJhbnNmb3JtID0gYHRyYW5zbGF0ZVgoLSR7d2lkdGh9cHgpYDtcbiAgICAgIH1cbiAgICAgIHRoaXMuc2xpZGVzaG93LnNob3coaW5kZXgsIG9wdGlvbnMpO1xuICAgICAgVUlraXQudXRpbC5vbignI2pzLXN3aXRjaGVyLWNvbnRlbnQnLCAnc2hvd24nLCAoKSA9PiB7XG4gICAgICAgIC8vIG9uIHN3aXRjaGVyIGNyZWF0ZSBwcm9kdWN0IHNsaWRlcnNcbiAgICAgICAgY3JlYXRlUHJvZHVjdENhcm91c2VsKCk7XG4gICAgICB9KTtcbiAgICAgIHN3aXRjaGVyKHRoaXMuc3dpdGNoZXIpLnNob3coaW5kZXgsIG9wdGlvbnMpO1xuICAgIH0pO1xuXG4gICAgLy8gaW5pdCB2aWRlb1xuICAgIGlmICghdGhpcy5oZXJvUG9zdGVyICYmICF0aGlzLmhlcm9WaWRlbykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCB2aWRlb0lkID0gdGhpcy5oZXJvVmlkZW8uZ2V0QXR0cmlidXRlKCdkYXRhLXdpc3RpYS1pZCcpO1xuICAgIHdpbmRvdy5fd3EgPSB3aW5kb3cuX3dxIHx8IFtdO1xuICAgIHdpbmRvdy5fd3EucHVzaCh7XG4gICAgICBpZDogdmlkZW9JZCxcbiAgICAgIG9uUmVhZHk6IHRoaXMuc3RhcnRWaWRlbyxcbiAgICB9KTtcbiAgfVxuXG4gIHNob3dTbGlkZShldmVudCkge1xuICAgIGNvbnN0IHZpZGVvRWxlbWVudCA9IGV2ZW50LnRhcmdldC5nZXRBdHRyaWJ1dGUoJ2RhdGEtdmlkZW8taWQnKTtcbiAgICB0aGlzLmlzQW5pbWF0aW5nID0gZmFsc2U7XG4gICAgaWYgKHRoaXMudmlkZW8gJiYgdmlkZW9FbGVtZW50KSB7XG4gICAgICAvLyBwbGF5IHZpZGVvXG4gICAgICB0aGlzLmhlcm9WaWRlby5jbGFzc0xpc3QucmVtb3ZlKCd1ay1oaWRkZW4nKTtcbiAgICAgIHRoaXMudmlkZW8ucGxheSgpO1xuICAgIH1cbiAgfVxuXG4gIGhpZGVTbGlkZShldmVudCkge1xuICAgIGNvbnN0IHZpZGVvRWxlbWVudCA9IGV2ZW50LnRhcmdldC5nZXRBdHRyaWJ1dGUoJ2RhdGEtdmlkZW8taWQnKTtcbiAgICB0aGlzLmlzQW5pbWF0aW5nID0gZmFsc2U7XG4gICAgaWYgKHRoaXMudmlkZW8gJiYgdmlkZW9FbGVtZW50KSB7XG4gICAgICAvLyBwbGF5IHZpZGVvXG4gICAgICB0aGlzLmhlcm9WaWRlby5jbGFzc0xpc3QuYWRkKCd1ay1oaWRkZW4nKTtcbiAgICAgIHRoaXMudmlkZW8ucGF1c2UoKTtcbiAgICAgIFR3ZWVuTWF4LmZyb21UbyhcbiAgICAgICAgdGhpcy5oZXJvUG9zdGVyLFxuICAgICAgICAwLjMsXG4gICAgICAgIHtcbiAgICAgICAgICBvcGFjaXR5OiAwLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgb3BhY2l0eTogMSxcbiAgICAgICAgfSxcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgc2V0SGVpZ2h0T2ZMaXN0cygpIHtcbiAgICBjb25zdCBsaXN0cyA9IHRoaXMuaGVhZGluZ3MucXVlcnlTZWxlY3RvckFsbCgnLmpzLWNhcm91c2VsLXNsaWRlLWxpc3QnKTtcbiAgICBsZXQgbWF4SGVpZ2h0ID0gMDtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxpc3RzLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICBpZiAobGlzdHNbaV0ub2Zmc2V0SGVpZ2h0ID4gbWF4SGVpZ2h0KSB7XG4gICAgICAgIG1heEhlaWdodCA9IGxpc3RzW2ldLm9mZnNldEhlaWdodDtcbiAgICAgIH1cbiAgICAgIGlmIChpID4gMCkge1xuICAgICAgICBsaXN0c1tpXS5jbGFzc0xpc3QuYWRkKCd1ay1oaWRkZW4nKTtcbiAgICAgIH1cbiAgICB9XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaXN0cy5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgbGlzdHNbaV0uc3R5bGUubWluSGVpZ2h0ID0gYCR7bWF4SGVpZ2h0fXB4YDtcbiAgICB9XG4gIH1cblxuICBzdGFydFZpZGVvKHZpZGVvKSB7XG4gICAgdGhpcy52aWRlbyA9IHZpZGVvO1xuICAgIC8vIGlmIHZpZGVvIGluIGZpcnN0IHNsaWRlIHBsYXlcbiAgICBjb25zdCB2aWRlb0VsZW1lbnQgPSB0aGlzLnNsaWRlc1swXS5nZXRBdHRyaWJ1dGUoJ2RhdGEtdmlkZW8taWQnKTtcbiAgICBpZiAodmlkZW9FbGVtZW50KSB7XG4gICAgICB2aWRlby5wbGF5KCk7XG4gICAgfVxuICAgIHZpZGVvLmJpbmQoJ3BsYXknLCAoKSA9PiB7XG4gICAgICAvLyBmYWRlIG91dCB0aGUgcG9zdGVyIGltYWdlIHdoZW4gdGhlIHZpZGVvIGlzIHBsYXlpbmdcbiAgICAgIFR3ZWVuTWF4LmZyb21UbyhcbiAgICAgICAgdGhpcy5oZXJvUG9zdGVyLFxuICAgICAgICAwLjMsXG4gICAgICAgIHtcbiAgICAgICAgICBvcGFjaXR5OiAxLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgb3BhY2l0eTogMCxcbiAgICAgICAgfSxcbiAgICAgICk7XG4gICAgfSk7XG4gIH1cblxuICBzaXplQ2Fyb3VzZWwoKSB7XG4gICAgY29uc3QgdmggPSBNYXRoLm1heChkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0LCB3aW5kb3cuaW5uZXJIZWlnaHQgfHwgMCk7XG4gICAgdGhpcy5oZXJvQ2Fyb3VzZWxDb250YWluZXIuc3R5bGUuaGVpZ2h0ID0gYCR7dmh9cHhgO1xuICB9XG5cbiAgdG9nZ2xlQWN0aXZlQnV0dG9uKGluZGV4KSB7XG4gICAgY29uc3QgYWxsU3VibGlua3MgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuanMtaGVyby1jYXJvdXNlbC1zdWJsaW5rJyk7XG4gICAgaWYgKGFsbFN1YmxpbmtzKSB7XG4gICAgICBmb3IgKGxldCBqID0gMDsgaiA8IGFsbFN1YmxpbmtzLmxlbmd0aDsgaiArPSAxKSB7XG4gICAgICAgIGlmICh0aGlzLmluaXRpYWxMb2FkKSB7XG4gICAgICAgICAgYWxsU3VibGlua3Nbal0uc3R5bGUub3BhY2l0eSA9IDA7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmJ1dHRvbnMubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgIGNvbnN0IHBhcmVudCA9IHRoaXMuYnV0dG9uc1tpXS5wYXJlbnROb2RlO1xuICAgICAgY29uc3Qgc3VibGlua3MgPSBwYXJlbnQucXVlcnlTZWxlY3RvckFsbCgnLmpzLWhlcm8tY2Fyb3VzZWwtc3VibGluaycpO1xuICAgICAgdGhpcy5idXR0b25zW2ldLmNsYXNzTGlzdC5yZW1vdmUoJ3VrLWFjdGl2ZScpO1xuICAgICAgY29uc3QgbGlzdCA9IHBhcmVudC5xdWVyeVNlbGVjdG9yKCcuanMtY2Fyb3VzZWwtc2xpZGUtbGlzdCcpO1xuICAgICAgaWYgKGxpc3QpIHtcbiAgICAgICAgbGlzdC5jbGFzc0xpc3QuYWRkKCd1ay1oaWRkZW4nKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGJ1dHRvbkluZGV4ID0gdGhpcy5idXR0b25zW2ldLmdldEF0dHJpYnV0ZSgnZGF0YS1zbGlkZS1udW1iZXInKTtcbiAgICAgIGlmIChOdW1iZXIoaW5kZXgpID09PSBOdW1iZXIoYnV0dG9uSW5kZXgpKSB7XG4gICAgICAgIGlmIChsaXN0KSB7XG4gICAgICAgICAgbGlzdC5jbGFzc0xpc3QucmVtb3ZlKCd1ay1oaWRkZW4nKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmJ1dHRvbnNbaV0uY2xhc3NMaXN0LmFkZCgndWstYWN0aXZlJyk7XG4gICAgICAgIGlmIChzdWJsaW5rcyAmJiB0aGlzLmluaXRpYWxMb2FkKSB7XG4gICAgICAgICAgVHdlZW5NYXguc3RhZ2dlckZyb21UbyhcbiAgICAgICAgICAgIHN1YmxpbmtzLFxuICAgICAgICAgICAgMC45LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBvcGFjaXR5OiAwLFxuICAgICAgICAgICAgICB4OiAxNTAsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBvcGFjaXR5OiAxLFxuICAgICAgICAgICAgICB4OiAwLFxuICAgICAgICAgICAgICBlYXNlOiBQb3dlcjIuZWFzZUluT3V0LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIDAuMyxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuaW5pdGlhbExvYWQgPSB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHRvZ2dsZU5leHRCdXR0b25zKHNob3cpIHtcbiAgICBpZiAoc2hvdykge1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLm5leHRCdXR0b25zLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgIHRoaXMubmV4dEJ1dHRvbnNbaV0uY2xhc3NMaXN0LnJlbW92ZSgndWstaW52aXNpYmxlJyk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5uZXh0QnV0dG9ucy5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgICB0aGlzLm5leHRCdXR0b25zW2ldLmNsYXNzTGlzdC5hZGQoJ3VrLWludmlzaWJsZScpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHRvZ2dsZVByZXZCdXR0b25zKHNob3cpIHtcbiAgICBpZiAoc2hvdykge1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnByZXZCdXR0b25zLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgIHRoaXMucHJldkJ1dHRvbnNbaV0uY2xhc3NMaXN0LnJlbW92ZSgndWstaW52aXNpYmxlJyk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5wcmV2QnV0dG9ucy5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgICB0aGlzLnByZXZCdXR0b25zW2ldLmNsYXNzTGlzdC5hZGQoJ3VrLWludmlzaWJsZScpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGhhbmRsZU5leHRCdXR0b24oKSB7XG4gICAgaWYgKHRoaXMuaXNBbmltYXRpbmcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgbmV4dFNsaWRlSW5kZXggPSB0aGlzLnNsaWRlc2hvdy5nZXRJbmRleCgpICsgMTtcbiAgICBpZiAobmV4dFNsaWRlSW5kZXggPCB0aGlzLm51bWJlck9mU2xpZGVzKSB7XG4gICAgICB0aGlzLmlzQW5pbWF0aW5nID0gdHJ1ZTtcbiAgICAgIHRoaXMubmV4dFNsaWRlSW5kZXggPSBuZXh0U2xpZGVJbmRleDtcbiAgICAgIHRoaXMuc2Nyb2xsLnNjcm9sbFRvKHRoaXMuaGVyb0Nhcm91c2VsQW5jaG9yKTtcbiAgICB9XG4gIH1cblxuICBoYW5kbGVQcmV2QnV0dG9uKCkge1xuICAgIGlmICh0aGlzLmlzQW5pbWF0aW5nKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHByZXZTbGlkZUluZGV4ID0gdGhpcy5zbGlkZXNob3cuZ2V0SW5kZXgoKSAtIDE7XG4gICAgaWYgKHByZXZTbGlkZUluZGV4ID49IDApIHtcbiAgICAgIHRoaXMuaXNBbmltYXRpbmcgPSB0cnVlO1xuICAgICAgdGhpcy5uZXh0U2xpZGVJbmRleCA9IHByZXZTbGlkZUluZGV4O1xuICAgICAgdGhpcy5zY3JvbGwuc2Nyb2xsVG8odGhpcy5oZXJvQ2Fyb3VzZWxBbmNob3IpO1xuICAgIH1cbiAgfVxuXG4gIGhhbmRsZUNoYW5nZVNsaWRlKGV2ZW50KSB7XG4gICAgaWYgKHRoaXMuaXNBbmltYXRpbmcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKGRvY3VtZW50LmJvZHkuc2Nyb2xsVG9wICE9PSAwKSB7XG4gICAgICB0aGlzLmlzQW5pbWF0aW5nID0gdHJ1ZTtcbiAgICB9XG4gICAgdGhpcy5uZXh0U2xpZGVJbmRleCA9IGV2ZW50LnRhcmdldC5nZXRBdHRyaWJ1dGUoJ2RhdGEtc2xpZGUtbnVtYmVyJyk7XG4gICAgdGhpcy5zY3JvbGwuc2Nyb2xsVG8odGhpcy5oZXJvQ2Fyb3VzZWxBbmNob3IpO1xuICB9XG5cbiAgY3JlYXRlU2NyaXB0VGFnKCkge1xuICAgIGlmICh0aGlzLndpc3RpYVNjcmlwdCAhPT0gbnVsbCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHRhZyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NjcmlwdCcpO1xuICAgIHRhZy5pZCA9ICdqcy13aXN0aWEtc2NyaXB0JztcbiAgICB0YWcuc3JjID0gJ2h0dHBzOi8vZmFzdC53aXN0aWEubmV0L2Fzc2V0cy9leHRlcm5hbC9FLXYxLmpzJztcbiAgICB0YWcuYXN5bmMgPSB0cnVlO1xuICAgIHRoaXMud2lzdGlhU2NyaXB0ID0gdGFnO1xuICAgIGNvbnN0IGZpcnN0U2NyaXB0VGFnID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ3NjcmlwdCcpWzBdO1xuICAgIGZpcnN0U2NyaXB0VGFnLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKHRhZywgZmlyc3RTY3JpcHRUYWcpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUhlcm9DYXJvdXNlbCgpIHtcbiAgY29uc3QgaGVyb0Nhcm91c2VsQ29udGFpbmVyID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLmpzLWhlcm8tY2Fyb3VzZWwnKTtcbiAgaWYgKGhlcm9DYXJvdXNlbENvbnRhaW5lci5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgaGVyb0Nhcm91c2VsQ29udGFpbmVyLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgY29uc3QgaGVyb0Nhcm91c2VsID0gbmV3IEhlcm9DYXJvdXNlbChoZXJvQ2Fyb3VzZWxDb250YWluZXJbaV0pO1xuICAgIGhlcm9DYXJvdXNlbC5pbml0KCk7XG4gIH1cbiAgcmV0dXJuIG51bGw7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGNyZWF0ZUhlcm9DYXJvdXNlbDtcbiIsIi8qIGdsb2JhbCBkb2N1bWVudCwgd2luZG93LCBwYXJzZUludCAqL1xuaW1wb3J0IHsgdGhyb3R0bGUgfSBmcm9tICcuLi91dGlscyc7XG5cbmNsYXNzIEhlcm9TY3JvbGxlciB7XG4gIGNvbnN0cnVjdG9yKGhlcm9TY3JvbGxlcikge1xuICAgIHRoaXMuaGVyb1Njcm9sbGVyID0gaGVyb1Njcm9sbGVyO1xuICAgIHRoaXMuc2xpZGVzID0gaGVyb1Njcm9sbGVyLnF1ZXJ5U2VsZWN0b3JBbGwoJy5qcy1oZXJvLXNjcm9sbGVyLXNsaWRlJyk7XG4gICAgdGhpcy5jdXJyZW50U2xpZGUgPSAwO1xuICB9XG5cbiAgaW5pdCgpIHtcbiAgICBpZiAoIXRoaXMuaGVyb1Njcm9sbGVyKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vIGFkZCBldmVudCBsaXN0ZW5lcnNcbiAgICB0aGlzLmRvdG5hdkJ1dHRvbnMgPSB0aGlzLmhlcm9TY3JvbGxlci5xdWVyeVNlbGVjdG9yQWxsKCcuanMtZG90bmF2LWJ1dHRvbicpO1xuICAgIHRoaXMuc2Nyb2xsVG9TbGlkZSA9IHRoaXMuc2Nyb2xsVG9TbGlkZS5iaW5kKHRoaXMpO1xuICAgIGlmICh0aGlzLmRvdG5hdkJ1dHRvbnMubGVuZ3RoID4gMCkge1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmRvdG5hdkJ1dHRvbnMubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgdGhpcy5kb3RuYXZCdXR0b25zW2ldLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5zY3JvbGxUb1NsaWRlLCBmYWxzZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5zY3JvbGxFdmVudCA9IHRoaXMuc2Nyb2xsRXZlbnQuYmluZCh0aGlzKTtcbiAgICB0aGlzLnNsaWRlVXAgPSB0aGlzLnNsaWRlVXAuYmluZCh0aGlzKTtcbiAgICB0aGlzLnNsaWRlRG93biA9IHRoaXMuc2xpZGVEb3duLmJpbmQodGhpcyk7XG5cbiAgICB0aGlzLnRvdWNoRHJhZyA9IHRoaXMudG91Y2hEcmFnLmJpbmQodGhpcyk7XG4gICAgdGhpcy5oYW5kbGVUb3VjaEVuZCA9IHRoaXMuaGFuZGxlVG91Y2hFbmQuYmluZCh0aGlzKTtcbiAgICB0aGlzLmhhbmRsZVRvdWNoRG93biA9IHRoaXMuaGFuZGxlVG91Y2hEb3duLmJpbmQodGhpcyk7XG5cbiAgICB0aGlzLmRvd25CdXR0b24gPSB0aGlzLmhlcm9TY3JvbGxlci5xdWVyeVNlbGVjdG9yKCcuanMtc2xpZGUtdXAnKTtcbiAgICB0aGlzLnVwQnV0dG9uID0gdGhpcy5oZXJvU2Nyb2xsZXIucXVlcnlTZWxlY3RvcignLmpzLXNsaWRlLWRvd24nKTtcbiAgICBpZiAodGhpcy51cEJ1dHRvbikge1xuICAgICAgdGhpcy51cEJ1dHRvbi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuc2xpZGVVcCwgZmFsc2UpO1xuICAgIH1cbiAgICBpZiAodGhpcy5kb3duQnV0dG9uKSB7XG4gICAgICB0aGlzLmRvd25CdXR0b24uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLnNsaWRlRG93biwgZmFsc2UpO1xuICAgIH1cblxuICAgIGNvbnN0IEZ1bGxTY3JvbGxUcm90dGxlID0gdGhyb3R0bGUoKCkgPT4gdGhpcy5zY3JvbGxFdmVudCgpLCAxMDApO1xuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXG4gICAgICAnc2Nyb2xsJyxcbiAgICAgIChldmVudCkgPT4ge1xuICAgICAgICBGdWxsU2Nyb2xsVHJvdHRsZShldmVudCk7XG4gICAgICB9LFxuICAgICAgdHJ1ZSxcbiAgICApO1xuXG4gICAgLy8gc2V0IHVwIHNjcm9sbCB0aHJvdHRsZVxuICAgIGNvbnN0IHNjcm9sbFRyb3R0bGUgPSB0aHJvdHRsZSgoKSA9PiB0aGlzLnNjcm9sbEhhbmRsZXIoZXZlbnQpLCAyMDAwKTtcbiAgICB0aGlzLmhlcm9TY3JvbGxlci5hZGRFdmVudExpc3RlbmVyKFxuICAgICAgJ21vdXNld2hlZWwnLFxuICAgICAgKGV2ZW50KSA9PiB7XG4gICAgICAgIHNjcm9sbFRyb3R0bGUoZXZlbnQpO1xuICAgICAgfSxcbiAgICAgIGZhbHNlLFxuICAgICk7XG5cbiAgICB0aGlzLmhlcm9TY3JvbGxlci5hZGRFdmVudExpc3RlbmVyKCd0b3VjaHN0YXJ0JywgdGhpcy5oYW5kbGVUb3VjaERvd24sIGZhbHNlKTtcblxuICAgIHRoaXMuaGFuZGxlQXJyb3dLZXlzID0gdGhpcy5oYW5kbGVBcnJvd0tleXMuYmluZCh0aGlzKTtcblxuICAgIHRoaXMuc2Nyb2xsRXZlbnQoKTtcbiAgICB0aGlzLnJlbmRlcigpO1xuICB9XG5cbiAgaGFuZGxlVG91Y2hFbmQoKSB7XG4gICAgdGhpcy5oZXJvU2Nyb2xsZXIucmVtb3ZlRXZlbnRMaXN0ZW5lcigndG91Y2hlbmQnLCB0aGlzLmhhbmRsZVRvdWNoRW5kLCBmYWxzZSk7XG4gICAgdGhpcy5oZXJvU2Nyb2xsZXIucmVtb3ZlRXZlbnRMaXN0ZW5lcigndG91Y2htb3ZlJywgdGhpcy50b3VjaERyYWcsIGZhbHNlKTtcbiAgICBpZiAodGhpcy50b3VjaFN0YXJ0ID4gdGhpcy50b3VjaEVuZCkge1xuICAgICAgdGhpcy5zbGlkZVVwKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc2xpZGVEb3duKCk7XG4gICAgfVxuICB9XG5cbiAgdG91Y2hEcmFnKGV2ZW50KSB7XG4gICAgY29uc3QgdG91Y2ggPSBldmVudC50YXJnZXRUb3VjaGVzWzBdO1xuICAgIHRoaXMudG91Y2hFbmQgPSB0b3VjaC5wYWdlWTtcbiAgfVxuXG4gIGhhbmRsZVRvdWNoRG93bihldmVudCkge1xuICAgIHRoaXMuaGVyb1Njcm9sbGVyLmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNoZW5kJywgdGhpcy5oYW5kbGVUb3VjaEVuZCwgZmFsc2UpO1xuICAgIHRoaXMuaGVyb1Njcm9sbGVyLmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNobW92ZScsIHRoaXMudG91Y2hEcmFnLCBmYWxzZSk7XG4gICAgY29uc3QgdG91Y2ggPSBldmVudC50YXJnZXRUb3VjaGVzWzBdO1xuICAgIHRoaXMudG91Y2hTdGFydCA9IHRvdWNoLnBhZ2VZO1xuICB9XG5cbiAgaGFuZGxlQXJyb3dLZXlzKGV2ZW50KSB7XG4gICAgaWYgKGV2ZW50LndoaWNoID09PSA0MCkge1xuICAgICAgdGhpcy5zbGlkZVVwKCk7XG4gICAgfSBlbHNlIGlmIChldmVudC53aGljaCA9PT0gMzgpIHtcbiAgICAgIHRoaXMuc2xpZGVEb3duKCk7XG4gICAgfVxuICB9XG5cbiAgc2Nyb2xsRXZlbnQoKSB7XG4gICAgY29uc3QgaGVyb0hlaWdodCA9IHRoaXMuaGVyb1Njcm9sbGVyLm9mZnNldEhlaWdodDtcbiAgICBjb25zdCBzY3JvbGxQb3MgPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsVG9wO1xuICAgIGlmIChzY3JvbGxQb3MgPiBoZXJvSGVpZ2h0KSB7XG4gICAgICBkb2N1bWVudC5ib2R5LnN0eWxlLm92ZXJmbG93ID0gJ3Njcm9sbCc7XG4gICAgICBpZiAodGhpcy5jdXJyZW50U2xpZGUgIT09IHRoaXMuc2xpZGVzLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgdGhpcy5zY3JvbGxUb1NsaWRlKG51bGwsIHRoaXMuc2xpZGVzLmxlbmd0aCAtIDEpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHNjcm9sbFRvU2xpZGUoZXZlbnQsIHNsaWRlKSB7XG4gICAgbGV0IHNsaWRlTnVtYmVyID0gc2xpZGU7XG4gICAgaWYgKGV2ZW50KSB7XG4gICAgICBzbGlkZU51bWJlciA9IHBhcnNlSW50KGV2ZW50LnRhcmdldC5nZXRBdHRyaWJ1dGUoJ2RhdGEtc2xpZGUtbnVtYmVyJyksIDEwKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuY3VycmVudFNsaWRlID4gc2xpZGVOdW1iZXIpIHtcbiAgICAgIGZvciAobGV0IGkgPSB0aGlzLmN1cnJlbnRTbGlkZTsgaSA+IHNsaWRlTnVtYmVyOyBpIC09IDEpIHtcbiAgICAgICAgdGhpcy5zbGlkZXNbaV0uY2xhc3NMaXN0LnJlbW92ZSgnYmstaGVyby1zY3JvbGxlcl9fc2xpZGUtdXAnKTtcbiAgICAgICAgdGhpcy5jdXJyZW50U2xpZGUgPSBzbGlkZU51bWJlcjtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHRoaXMuY3VycmVudFNsaWRlIDwgc2xpZGVOdW1iZXIpIHtcbiAgICAgIGZvciAobGV0IGkgPSB0aGlzLmN1cnJlbnRTbGlkZTsgaSA8PSBzbGlkZU51bWJlcjsgaSArPSAxKSB7XG4gICAgICAgIHRoaXMuc2xpZGVzW2ldLmNsYXNzTGlzdC5hZGQoJ2JrLWhlcm8tc2Nyb2xsZXJfX3NsaWRlLXVwJyk7XG4gICAgICAgIHRoaXMuY3VycmVudFNsaWRlID0gc2xpZGVOdW1iZXI7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMucmVuZGVyKCk7XG4gIH1cblxuICBzbGlkZVVwKCkge1xuICAgIGxldCBzbGlkZU51bWJlciA9IHRoaXMuY3VycmVudFNsaWRlO1xuICAgIHNsaWRlTnVtYmVyICs9IDE7XG4gICAgY29uc3QgbnVtYmVyT2ZTbGlkZXMgPSB0aGlzLnNsaWRlcy5sZW5ndGg7XG4gICAgaWYgKHNsaWRlTnVtYmVyIDwgbnVtYmVyT2ZTbGlkZXMpIHtcbiAgICAgIHRoaXMuc2xpZGVzW3NsaWRlTnVtYmVyXS5jbGFzc0xpc3QuYWRkKCdiay1oZXJvLXNjcm9sbGVyX19zbGlkZS11cCcpO1xuICAgICAgdGhpcy5jdXJyZW50U2xpZGUgPSBzbGlkZU51bWJlcjtcbiAgICAgIHRoaXMucmVuZGVyKCk7XG4gICAgfVxuICB9XG5cbiAgc2xpZGVEb3duKCkge1xuICAgIGxldCBzbGlkZU51bWJlciA9IHRoaXMuY3VycmVudFNsaWRlO1xuICAgIHNsaWRlTnVtYmVyIC09IDE7XG4gICAgaWYgKHNsaWRlTnVtYmVyID49IDApIHtcbiAgICAgIHRoaXMuc2xpZGVzW3NsaWRlTnVtYmVyICsgMV0uY2xhc3NMaXN0LnJlbW92ZSgnYmstaGVyby1zY3JvbGxlcl9fc2xpZGUtdXAnKTtcbiAgICAgIHRoaXMuY3VycmVudFNsaWRlID0gc2xpZGVOdW1iZXI7XG4gICAgICB0aGlzLnJlbmRlcigpO1xuICAgIH1cbiAgfVxuXG4gIHNjcm9sbEhhbmRsZXIoZXZlbnQpIHtcbiAgICBjb25zdCBkZWx0YSA9IGV2ZW50LndoZWVsRGVsdGE7XG4gICAgaWYgKGRlbHRhID4gMCkge1xuICAgICAgdGhpcy5zbGlkZURvd24oKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zbGlkZVVwKCk7XG4gICAgfVxuICB9XG5cbiAgcmVuZGVyRG90TmF2KCkge1xuICAgIGNvbnN0IGRvdG5hdkl0ZW1zID0gdGhpcy5oZXJvU2Nyb2xsZXIucXVlcnlTZWxlY3RvckFsbCgnLmpzLWRvdG5hdi1pdGVtJyk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkb3RuYXZJdGVtcy5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgZG90bmF2SXRlbXNbaV0uY2xhc3NMaXN0LnJlbW92ZSgndWstYWN0aXZlJyk7XG4gICAgfVxuICAgIGRvdG5hdkl0ZW1zW3RoaXMuY3VycmVudFNsaWRlXS5jbGFzc0xpc3QuYWRkKCd1ay1hY3RpdmUnKTtcbiAgfVxuXG4gIHJlbmRlckJ1dHRvbigpIHtcbiAgICB0aGlzLnVwQnV0dG9uLmNsYXNzTGlzdC5yZW1vdmUoJ3VrLWhpZGRlbicpO1xuICAgIHRoaXMuZG93bkJ1dHRvbi5jbGFzc0xpc3QucmVtb3ZlKCd1ay1oaWRkZW4nKTtcbiAgICBpZiAodGhpcy5jdXJyZW50U2xpZGUgPT09IDApIHtcbiAgICAgIHRoaXMuZG93bkJ1dHRvbi5jbGFzc0xpc3QuYWRkKCd1ay1oaWRkZW4nKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuY3VycmVudFNsaWRlID09PSB0aGlzLnNsaWRlcy5sZW5ndGggLSAxKSB7XG4gICAgICB0aGlzLnVwQnV0dG9uLmNsYXNzTGlzdC5hZGQoJ3VrLWhpZGRlbicpO1xuICAgIH1cbiAgfVxuXG4gIHJlbmRlcigpIHtcbiAgICBjb25zdCBudW1iZXJPZlNsaWRlcyA9IHRoaXMuc2xpZGVzLmxlbmd0aDtcbiAgICBpZiAodGhpcy5jdXJyZW50U2xpZGUgPCBudW1iZXJPZlNsaWRlcyAtIDEpIHtcbiAgICAgIHdpbmRvdy5zY3JvbGxUbygwLCAwKTtcbiAgICAgIGRvY3VtZW50LmJvZHkuc3R5bGUub3ZlcmZsb3cgPSAnaGlkZGVuJztcbiAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCB0aGlzLmhhbmRsZUFycm93S2V5cyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICBkb2N1bWVudC5ib2R5LnN0eWxlLm92ZXJmbG93ID0gJ3Njcm9sbCc7XG4gICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCB0aGlzLmhhbmRsZUFycm93S2V5cyk7XG4gICAgICB9LCAxMDAwKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuZG90bmF2QnV0dG9ucy5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLnJlbmRlckRvdE5hdigpO1xuICAgIH1cbiAgICBpZiAodGhpcy51cEJ1dHRvbiAmJiB0aGlzLmRvd25CdXR0b24pIHtcbiAgICAgIHRoaXMucmVuZGVyQnV0dG9uKCk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUhlcm9TY3JvbGxlcigpIHtcbiAgY29uc3QgaGVyb1Njcm9sbGVycyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5qcy1oZXJvLXNjcm9sbGVyJyk7XG4gIGlmIChoZXJvU2Nyb2xsZXJzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgaGVyb1Njcm9sbGVycy5sZW5ndGg7IGkgKz0gMSkge1xuICAgIGNvbnN0IGhlcm9TY3JvbGxlciA9IG5ldyBIZXJvU2Nyb2xsZXIoaGVyb1Njcm9sbGVyc1tpXSk7XG4gICAgaGVyb1Njcm9sbGVyLmluaXQoKTtcbiAgfVxuICByZXR1cm4gbnVsbDtcbn1cblxuZXhwb3J0IGRlZmF1bHQgY3JlYXRlSGVyb1Njcm9sbGVyO1xuIiwiLyogZ2xvYmFsIGRvY3VtZW50LCB3aW5kb3csIF93cSBZVCAqL1xuLyogQ3JlYXRlIHRoZSBoZXJvIHZpZGVvcyB1c2luZyB0aGUgV2lzdGlhIGphdmFzY3JpcHQgYXBpICovXG5pbXBvcnQgVUlraXQgZnJvbSAndWlraXQnO1xuXG5jb25zdCB7IHNsaWRlc2hvdyB9ID0gVUlraXQ7XG5cbmNsYXNzIEhlcm9TbGlkZXIge1xuICBjb25zdHJ1Y3RvcihoZXJvU2xpZGVyKSB7XG4gICAgdGhpcy5oZXJvU2xpZGVyID0gaGVyb1NsaWRlcjtcbiAgICB0aGlzLnZpZGVvU2xpZGVzID0gaGVyb1NsaWRlci5xdWVyeVNlbGVjdG9yQWxsKCcuanMtaGVyby1zbGlkZXItdmlkZW8tZnJhbWUnKTtcbiAgICB0aGlzLndpc3RpYVNjcmlwdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdqcy13aXN0aWEtc2NyaXB0Jyk7XG4gICAgdGhpcy55b3V0dWJlU2NyaXB0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2pzLXlvdXR1YmUtc2NyaXB0Jyk7XG4gIH1cblxuICBpbml0KCkge1xuICAgIGlmICghdGhpcy5oZXJvU2xpZGVyKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuc2hvd1NsaWRlID0gdGhpcy5zaG93U2xpZGUuYmluZCh0aGlzKTtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy52aWRlb1NsaWRlcy5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgdGhpcy5zZXR1cFNsaWRlcyh0aGlzLnZpZGVvU2xpZGVzW2ldKTtcbiAgICB9XG4gICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgIGF1dG9wbGF5OiBmYWxzZSxcbiAgICAgIG1pbkhlaWdodDogNjYwLFxuICAgIH07XG5cbiAgICAvLyBpbml0IHNsaWRlclxuICAgIHNsaWRlc2hvdyh0aGlzLmhlcm9TbGlkZXIsIG9wdGlvbnMpO1xuXG4gICAgLy8gc2V0IHVwIGV2ZW50c1xuICAgIFVJa2l0LnV0aWwub24odGhpcy5oZXJvU2xpZGVyLCAnaXRlbXNob3duJywgdGhpcy5zaG93U2xpZGUpO1xuICB9XG5cbiAgc2hvd1NsaWRlKGV2ZW50KSB7XG4gICAgY29uc3QgaWZyYW1lID0gZXZlbnQudGFyZ2V0LnF1ZXJ5U2VsZWN0b3IoJy5qcy1oZXJvLXNsaWRlci12aWRlby1mcmFtZScpO1xuICAgIGlmIChpZnJhbWUpIHtcbiAgICAgIGNvbnN0IHdpc3RpYVZpZGVvSWQgPSBpZnJhbWUuZ2V0QXR0cmlidXRlKCdkYXRhLXdpc3RpYS1pZCcpO1xuICAgICAgY29uc3QgeW91dHViZVZpZGVvSWQgPSBpZnJhbWUuZ2V0QXR0cmlidXRlKCdkYXRhLXlvdXR1YmUtaWQnKTtcbiAgICAgIGlmICh3aXN0aWFWaWRlb0lkKSB7XG4gICAgICAgIHRoaXMud2lzdGlhVmlkZW8ucGxheSgpO1xuICAgICAgfSBlbHNlIGlmICh5b3V0dWJlVmlkZW9JZCkge1xuICAgICAgICB0aGlzLnlvdXR1YmVJZnJhbWUgPSBpZnJhbWU7XG4gICAgICAgIHRoaXMueW91dHViZVBvc3RlciA9IGV2ZW50LnRhcmdldC5xdWVyeVNlbGVjdG9yKCcuanMtaGVyby1zbGlkZXItdmlkZW8tcG9zdGVyJyk7XG4gICAgICAgIHRoaXMueW91dHViZVBsYXllci5tdXRlKCk7XG4gICAgICAgIHRoaXMueW91dHViZVBsYXllci5wbGF5VmlkZW8oKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBzZXR1cFNsaWRlcyhzbGlkZSkge1xuICAgIGNvbnN0IHdpc3RpYVZpZGVvSWQgPSBzbGlkZS5nZXRBdHRyaWJ1dGUoJ2RhdGEtd2lzdGlhLWlkJyk7XG4gICAgY29uc3QgeW91dHViZVZpZGVvSWQgPSBzbGlkZS5nZXRBdHRyaWJ1dGUoJ2RhdGEteW91dHViZS1pZCcpO1xuICAgIGlmICh3aXN0aWFWaWRlb0lkKSB7XG4gICAgICB0aGlzLnN0YXJ0V2lzdGlhVmlkZW8gPSB0aGlzLnN0YXJ0V2lzdGlhVmlkZW8uYmluZCh0aGlzKTtcbiAgICAgIHRoaXMuY3JlYXRlV2lzdGlhU2NyaXB0VGFnKCk7XG4gICAgICB0aGlzLnNldHVwV2lzdGlhVmlkZW8od2lzdGlhVmlkZW9JZCk7XG5cbiAgICAgIC8vIGlmIHRoZXJlIGlzIGEgeW91dHViZSB2aWRlb1xuICAgIH0gZWxzZSBpZiAoeW91dHViZVZpZGVvSWQpIHtcbiAgICAgIHRoaXMuc3RhcnRZb3V0dWJlVmlkZW8gPSB0aGlzLnN0YXJ0WW91dHViZVZpZGVvLmJpbmQodGhpcyk7XG4gICAgICB0aGlzLmNyZWF0ZVlvdXR1YmVTY3JpcHRUYWcoKTtcbiAgICAgIHRoaXMuc2V0dXBZb3V0dWJlVmlkZW8oeW91dHViZVZpZGVvSWQpO1xuICAgIH1cbiAgfVxuXG4gIHNldHVwWW91dHViZVZpZGVvKHlvdXR1YmVWaWRlb0lkKSB7XG4gICAgaWYgKCF5b3V0dWJlVmlkZW9JZCkge1xuICAgICAgY29uc29sZS5lcnJvcignTWlzc2luZyBkYXRhLXlvdXR1YmUtaWQnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgd2luZG93Lm9uWW91VHViZUlmcmFtZUFQSVJlYWR5ID0gKCkgPT4ge1xuICAgICAgdGhpcy55b3V0dWJlUGxheWVyID0gbmV3IFlULlBsYXllcigneW91dHViZV9lbWJlZCcsIHtcbiAgICAgICAgcGxheWVyVmFyczoge1xuICAgICAgICAgIGF1dG9wbGF5OiAwLFxuICAgICAgICAgIGNvbnRyb2xzOiAwLFxuICAgICAgICAgIGRpc2FibGVrYjogMSxcbiAgICAgICAgICBtb2Rlc3RicmFuZGluZzogMSxcbiAgICAgICAgfSxcbiAgICAgICAgZXZlbnRzOiB7XG4gICAgICAgICAgb25TdGF0ZUNoYW5nZTogdGhpcy5zdGFydFlvdXR1YmVWaWRlbyxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgIH07XG4gIH1cblxuICBzdGFydFlvdXR1YmVWaWRlbyhldmVudCkge1xuICAgIGNvbnN0IHBvc3RlciA9IHRoaXMueW91dHViZVBvc3RlcjtcbiAgICBjb25zdCBpZnJhbWUgPSB0aGlzLnlvdXR1YmVJZnJhbWU7XG4gICAgY29uc29sZS5sb2coJ3lhbGEnKTtcbiAgICAvLyBvbiBwbGF5IHZpZGVvIGhpZGUgcG9zdGVye1xuICAgIGlmIChldmVudC5kYXRhID09PSBZVC5QbGF5ZXJTdGF0ZS5QTEFZSU5HKSB7XG4gICAgICBpZnJhbWUuY2xhc3NMaXN0LmFkZCgnYmstaGVyby1zbGlkZXJfX2lmcmFtZV9zaG93Jyk7XG4gICAgICBwb3N0ZXIuY2xhc3NMaXN0LmFkZCgnYmstaGVyby1zbGlkZXJfX2ltYWdlX2hpZGRlbicpO1xuICAgIH1cbiAgICAvLyBpZiB2aWRlbyBoYXMgZmluaXNoZWQgcmVwbGF5XG4gICAgaWYgKGV2ZW50LmRhdGEgPT09IFlULlBsYXllclN0YXRlLkVOREVEKSB7XG4gICAgICB0aGlzLnlvdXR1YmVQbGF5ZXIucGxheVZpZGVvKCk7XG4gICAgfVxuICB9XG5cbiAgc2V0dXBXaXN0aWFWaWRlbyh3aXN0aWFWaWRlb0lkKSB7XG4gICAgaWYgKCF3aXN0aWFWaWRlb0lkKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdNaXNzaW5nIGRhdGEtd2lzdGlhLWlkJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHdpbmRvdy5fd3EgPSB3aW5kb3cuX3dxIHx8IFtdO1xuICAgIF93cS5wdXNoKHtcbiAgICAgIGlkOiB3aXN0aWFWaWRlb0lkLFxuICAgICAgb25SZWFkeTogdGhpcy5zdGFydFdpc3RpYVZpZGVvLFxuICAgIH0pO1xuICB9XG5cbiAgc3RhcnRXaXN0aWFWaWRlbyh2aWRlbykge1xuICAgIGxldCBwb3N0ZXIgPSBudWxsO1xuICAgIGxldCBpZnJhbWUgPSBudWxsO1xuICAgIGlmICh2aWRlby5pZnJhbWUpIHtcbiAgICAgIGlmcmFtZSA9IHZpZGVvLmlmcmFtZTtcbiAgICAgIHBvc3RlciA9IHZpZGVvLmlmcmFtZS5wYXJlbnROb2RlLnF1ZXJ5U2VsZWN0b3IoJy5qcy1oZXJvLXNsaWRlci12aWRlby1wb3N0ZXInKTtcbiAgICB9XG4gICAgLy8gb24gcGxheSB2aWRlbyByZW1vdmUgcG9zdGVyXG4gICAgdmlkZW8uYmluZCgncGxheScsICgpID0+IHtcbiAgICAgIGlmcmFtZS5jbGFzc0xpc3QuYWRkKCdiay1oZXJvLXNsaWRlcl9faWZyYW1lX3Nob3cnKTtcbiAgICAgIHBvc3Rlci5jbGFzc0xpc3QuYWRkKCdiay1oZXJvLXNsaWRlcl9faW1hZ2VfaGlkZGVuJyk7XG4gICAgfSk7XG4gICAgdGhpcy53aXN0aWFWaWRlbyA9IHZpZGVvO1xuICB9XG5cbiAgY3JlYXRlV2lzdGlhU2NyaXB0VGFnKCkge1xuICAgIGlmICh0aGlzLndpc3RpYVNjcmlwdCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCB0YWcgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzY3JpcHQnKTtcbiAgICB0YWcuaWQgPSAnanMtd2lzdGlhLXNjcmlwdCc7XG4gICAgdGFnLnNyYyA9ICdodHRwczovL2Zhc3Qud2lzdGlhLmNvbS9hc3NldHMvZXh0ZXJuYWwvRS12MS5qcyc7XG4gICAgdGFnLmNoYXJzZXQgPSAnSVNPLTg4NTktMSc7XG4gICAgdGFnLmFzeW5jID0gdHJ1ZTtcbiAgICBjb25zdCBmaXJzdFNjcmlwdFRhZyA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCdzY3JpcHQnKVswXTtcbiAgICBmaXJzdFNjcmlwdFRhZy5wYXJlbnROb2RlLmluc2VydEJlZm9yZSh0YWcsIGZpcnN0U2NyaXB0VGFnKTtcbiAgfVxuXG4gIGNyZWF0ZVlvdXR1YmVTY3JpcHRUYWcoKSB7XG4gICAgaWYgKHRoaXMueW91dHViZVNjcmlwdCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCB0YWcgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzY3JpcHQnKTtcbiAgICB0YWcuaWQgPSAnanMteW91dHViZS1zY3JpcHQnO1xuICAgIHRhZy5zcmMgPSAnaHR0cHM6Ly93d3cueW91dHViZS5jb20vaWZyYW1lX2FwaSc7XG4gICAgY29uc3QgZmlyc3RTY3JpcHRUYWcgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnc2NyaXB0JylbMF07XG4gICAgZmlyc3RTY3JpcHRUYWcucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUodGFnLCBmaXJzdFNjcmlwdFRhZyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gY3JlYXRlSGVyb1NsaWRlcigpIHtcbiAgY29uc3QgaGVyb1NsaWRlciA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5qcy1oZXJvLXNsaWRlcicpO1xuICBpZiAoaGVyb1NsaWRlci5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBmb3IgKGxldCBpID0gMDsgaSA8IGhlcm9TbGlkZXIubGVuZ3RoOyBpICs9IDEpIHtcbiAgICBjb25zdCBoZXJvU2xpZGUgPSBuZXcgSGVyb1NsaWRlcihoZXJvU2xpZGVyW2ldKTtcbiAgICBoZXJvU2xpZGUuaW5pdCgpO1xuICB9XG4gIHJldHVybiBudWxsO1xufVxuXG5leHBvcnQgZGVmYXVsdCBjcmVhdGVIZXJvU2xpZGVyO1xuIiwiLyogZ2xvYmFsIGRvY3VtZW50LCB3aW5kb3csIF93cSAqL1xuLyogQ3JlYXRlIHRoZSBoZXJvIHZpZGVvcyB1c2luZyB0aGUgV2lzdGlhIGphdmFzY3JpcHQgYXBpICovXG5jbGFzcyBIZXJvVmlkZW9zIHtcbiAgY29uc3RydWN0b3IoaGVyb1ZpZGVvKSB7XG4gICAgdGhpcy5oZXJvVmlkZW8gPSBoZXJvVmlkZW87XG4gICAgdGhpcy5oZXJvUG9zdGVyID0gaGVyb1ZpZGVvLnF1ZXJ5U2VsZWN0b3IoJy5qcy1oZXJvLXBvc3RlcicpO1xuICAgIHRoaXMudmlkZW9JZnJhbWUgPSBoZXJvVmlkZW8ucXVlcnlTZWxlY3RvcignLmpzLWhlcm8tdmlkZW8tZnJhbWUnKTtcbiAgICB0aGlzLndpc3RpYVNjcmlwdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdqcy13aXN0aWEtc2NyaXB0Jyk7XG4gICAgdGhpcy55b3V0dWJlU2NyaXB0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2pzLXlvdXR1YmUtc2NyaXB0Jyk7XG4gIH1cblxuICBpbml0KCkge1xuICAgIGlmICghdGhpcy5oZXJvUG9zdGVyKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdNaXNzaW5nIGpzLWhlcm8tcG9zdGVyIGNsYXNzJyk7XG4gICAgfVxuICAgIGlmICghdGhpcy52aWRlb0lmcmFtZSkge1xuICAgICAgY29uc29sZS5lcnJvcignTWlzc2luZyBqcy1oZXJvLXZpZGVvLWZyYW1lIGNsYXNzJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHdpc3RpYVZpZGVvSWQgPSB0aGlzLnZpZGVvSWZyYW1lLmdldEF0dHJpYnV0ZSgnZGF0YS13aXN0aWEtaWQnKTtcbiAgICBjb25zdCB5b3V0dWJlVmlkZW9JZCA9IHRoaXMudmlkZW9JZnJhbWUuZ2V0QXR0cmlidXRlKCdkYXRhLXlvdXR1YmUtaWQnKTtcbiAgICAvLyBpZiB0aGVyZSBpcyBhIHdpc3RhIHZpZGVvXG4gICAgaWYgKHdpc3RpYVZpZGVvSWQpIHtcbiAgICAgIHRoaXMuc3RhcnRXaXN0aWFWaWRlbyA9IHRoaXMuc3RhcnRXaXN0aWFWaWRlby5iaW5kKHRoaXMpO1xuICAgICAgdGhpcy5jcmVhdGVXaXN0aWFTY3JpcHRUYWcoKTtcbiAgICAgIHRoaXMuc2V0dXBXaXN0aWFWaWRlbyh3aXN0aWFWaWRlb0lkKTtcblxuICAgICAgLy8gaWYgdGhlcmUgaXMgYSB5b3V0dWJlIHZpZGVvXG4gICAgfSBlbHNlIGlmICh5b3V0dWJlVmlkZW9JZCkge1xuICAgICAgdGhpcy5zdGFydFlvdXR1YmVWaWRlbyA9IHRoaXMuc3RhcnRZb3V0dWJlVmlkZW8uYmluZCh0aGlzKTtcbiAgICAgIHRoaXMub25Zb3V0dWJlUmVhZHkgPSB0aGlzLm9uWW91dHViZVJlYWR5LmJpbmQodGhpcyk7XG4gICAgICB0aGlzLmNyZWF0ZVlvdXR1YmVTY3JpcHRUYWcoKTtcbiAgICAgIHRoaXMuc2V0dXBZb3V0dWJlVmlkZW8oeW91dHViZVZpZGVvSWQpO1xuICAgIH1cbiAgfVxuXG4gIHNldHVwV2lzdGlhVmlkZW8od2lzdGlhVmlkZW9JZCkge1xuICAgIGlmICghd2lzdGlhVmlkZW9JZCkge1xuICAgICAgY29uc29sZS5lcnJvcignTWlzc2luZyBkYXRhLXdpc3RpYS1pZCcpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB3aW5kb3cuX3dxID0gd2luZG93Ll93cSB8fCBbXTtcbiAgICBfd3EucHVzaCh7XG4gICAgICBpZDogd2lzdGlhVmlkZW9JZCxcbiAgICAgIG9uUmVhZHk6IHRoaXMuc3RhcnRXaXN0aWFWaWRlbyxcbiAgICB9KTtcbiAgfVxuXG4gIHNldHVwWW91dHViZVZpZGVvKHlvdXR1YmVWaWRlb0lkKSB7XG4gICAgaWYgKCF5b3V0dWJlVmlkZW9JZCkge1xuICAgICAgY29uc29sZS5lcnJvcignTWlzc2luZyBkYXRhLXlvdXR1YmUtaWQnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgd2luZG93Lm9uWW91VHViZUlmcmFtZUFQSVJlYWR5ID0gKCkgPT4ge1xuICAgICAgdGhpcy55b3V0dWJlUGxheWVyID0gbmV3IFlULlBsYXllcigneW91dHViZV9lbWJlZCcsIHtcbiAgICAgICAgcGxheWVyVmFyczoge1xuICAgICAgICAgIGF1dG9wbGF5OiAwLFxuICAgICAgICAgIGNvbnRyb2xzOiAwLFxuICAgICAgICAgIGRpc2FibGVrYjogMSxcbiAgICAgICAgICBtb2Rlc3RicmFuZGluZzogMSxcbiAgICAgICAgfSxcbiAgICAgICAgZXZlbnRzOiB7XG4gICAgICAgICAgb25TdGF0ZUNoYW5nZTogdGhpcy5zdGFydFlvdXR1YmVWaWRlbyxcbiAgICAgICAgICBvblJlYWR5OiB0aGlzLm9uWW91dHViZVJlYWR5LFxuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgfTtcbiAgfVxuXG4gIHN0YXJ0V2lzdGlhVmlkZW8odmlkZW8pIHtcbiAgICAvLyBvbiBwbGF5IHZpZGVvIHJlbW92ZSBwb3N0ZXJcbiAgICB2aWRlby5iaW5kKCdwbGF5JywgKCkgPT4ge1xuICAgICAgdGhpcy5oZXJvUG9zdGVyLmNsYXNzTGlzdC5hZGQoJ2JrLWhlcm8tdGV4dC1jdGFfX2ltYWdlX2hpZGRlbicpO1xuICAgIH0pO1xuICAgIHZpZGVvLnBsYXkoKTtcbiAgfVxuXG4gIHN0YXJ0WW91dHViZVZpZGVvKGV2ZW50KSB7XG4gICAgLy8gb24gcGxheSB2aWRlbyBoaWRlIHBvc3RlcntcbiAgICBpZiAoZXZlbnQuZGF0YSA9PT0gd2luZG93LllULlBsYXllclN0YXRlLlBMQVlJTkcpIHtcbiAgICAgIHRoaXMuaGVyb1Bvc3Rlci5jbGFzc0xpc3QuYWRkKCdiay1oZXJvLXRleHQtY3RhX19pbWFnZV9oaWRkZW4nKTtcbiAgICB9XG4gICAgLy8gaWYgdmlkZW8gaGFzIGZpbmlzaGVkIHJlcGxheVxuICAgIGlmIChldmVudC5kYXRhID09PSB3aW5kb3cuWVQuUGxheWVyU3RhdGUuRU5ERUQpIHtcbiAgICAgIHRoaXMueW91dHViZVBsYXllci5wbGF5VmlkZW8oKTtcbiAgICB9XG4gIH1cblxuICBvbllvdXR1YmVSZWFkeSgpIHtcbiAgICBpZiAodGhpcy55b3V0dWJlUGxheWVyKSB7XG4gICAgICB0aGlzLnlvdXR1YmVQbGF5ZXIubXV0ZSgpO1xuICAgICAgdGhpcy55b3V0dWJlUGxheWVyLnBsYXlWaWRlbygpO1xuICAgIH1cbiAgfVxuXG4gIGNyZWF0ZVdpc3RpYVNjcmlwdFRhZygpIHtcbiAgICBpZiAodGhpcy53aXN0aWFTY3JpcHQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgdGFnID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc2NyaXB0Jyk7XG4gICAgdGFnLmlkID0gJ2pzLXdpc3RpYS1zY3JpcHQnO1xuICAgIHRhZy5zcmMgPSAnaHR0cHM6Ly9mYXN0Lndpc3RpYS5jb20vYXNzZXRzL2V4dGVybmFsL0UtdjEuanMnO1xuICAgIHRhZy5jaGFyc2V0ID0gJ0lTTy04ODU5LTEnO1xuICAgIHRhZy5hc3luYyA9IHRydWU7XG4gICAgY29uc3QgZmlyc3RTY3JpcHRUYWcgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnc2NyaXB0JylbMF07XG4gICAgZmlyc3RTY3JpcHRUYWcucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUodGFnLCBmaXJzdFNjcmlwdFRhZyk7XG4gIH1cblxuICBjcmVhdGVZb3V0dWJlU2NyaXB0VGFnKCkge1xuICAgIGlmICh0aGlzLnlvdXR1YmVTY3JpcHQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgdGFnID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc2NyaXB0Jyk7XG4gICAgdGFnLmlkID0gJ2pzLXlvdXR1YmUtc2NyaXB0JztcbiAgICB0YWcuc3JjID0gJ2h0dHBzOi8vd3d3LnlvdXR1YmUuY29tL2lmcmFtZV9hcGknO1xuICAgIGNvbnN0IGZpcnN0U2NyaXB0VGFnID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ3NjcmlwdCcpWzBdO1xuICAgIGZpcnN0U2NyaXB0VGFnLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKHRhZywgZmlyc3RTY3JpcHRUYWcpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUhlcm9WaWRlb3MoKSB7XG4gIGNvbnN0IGhlcm9WaWRlb3MgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuanMtaGVyby12aWRlbycpO1xuICBpZiAoaGVyb1ZpZGVvcy5sZW5ndGggPiAwKSB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBoZXJvVmlkZW9zLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICBjb25zdCBoZXJvVmlkZW8gPSBuZXcgSGVyb1ZpZGVvcyhoZXJvVmlkZW9zW2ldKTtcbiAgICAgIGhlcm9WaWRlby5pbml0KCk7XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IGNyZWF0ZUhlcm9WaWRlb3M7XG4iLCIvKiBnbG9iYWwgZG9jdW1lbnQgKi9cblxuY2xhc3MgTW92aWVTbGlkZXIge1xuICBjb25zdHJ1Y3RvcihjYXJkU2xpZGVyKSB7XG4gICAgdGhpcy5jYXJkU2xpZGVyID0gY2FyZFNsaWRlcjtcbiAgICB0aGlzLmNvbnRhaW5lciA9IGNhcmRTbGlkZXIucXVlcnlTZWxlY3RvcignLmJrLW1vdmllLXNsaWRlcl9faXRlbXMnKTtcbiAgICB0aGlzLmxlZnRCdXR0b24gPSBjYXJkU2xpZGVyLnF1ZXJ5U2VsZWN0b3IoJy5iay1tb3ZpZS1zbGlkZXJfX2Fycm93LWxlZnQnKTtcbiAgICB0aGlzLnJpZ2h0QnV0dG9uID0gY2FyZFNsaWRlci5xdWVyeVNlbGVjdG9yKCcuYmstbW92aWUtc2xpZGVyX19hcnJvdy1yaWdodCcpO1xuICAgIHRoaXMuaXRlbXMgPSBjYXJkU2xpZGVyLnF1ZXJ5U2VsZWN0b3JBbGwoJy5iay1tb3ZpZS1zbGlkZXJfX2l0ZW0nKTtcbiAgICB0aGlzLnBvc2l0aW9uID0gMDtcbiAgICB0aGlzLmNhcmRzUGVyU2xpZGUgPSB0aGlzLmNhcmRTbGlkZXIuZ2V0QXR0cmlidXRlKCdkYXRhLXNob3ctY2FyZHMnKSB8fCAzO1xuICAgIHRoaXMubW92ZVBlcmNlbnQgPSAxMDAgLyB0aGlzLmNhcmRzUGVyU2xpZGU7XG4gICAgdGhpcy5udW1iZXJPZkl0ZW1zID0gdGhpcy5pdGVtcy5sZW5ndGg7XG4gICAgdGhpcy5kaXIgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnaHRtbCcpWzBdLmdldEF0dHJpYnV0ZSgnZGlyJyk7XG4gIH1cblxuICBpbml0KCkge1xuICAgIC8vIGFkZCBldmVudHNcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuaXRlbXMubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgIHRoaXMuaXRlbXNbaV0uc3R5bGUubWluV2lkdGggPSBgJHt0aGlzLm1vdmVQZXJjZW50fSVgO1xuICAgICAgdGhpcy5pdGVtc1tpXS5zdHlsZS5tYXhXaWR0aCA9IGAke3RoaXMubW92ZVBlcmNlbnR9JWA7XG4gICAgfVxuICAgIHRoaXMubGVmdEJ1dHRvbi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuc2xpZGVMZWZ0LmJpbmQodGhpcyksIGZhbHNlKTtcbiAgICB0aGlzLnJpZ2h0QnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5zbGlkZVJpZ2h0LmJpbmQodGhpcyksIGZhbHNlKTtcbiAgICBpZiAodGhpcy5udW1iZXJPZkl0ZW1zID4gdGhpcy5jYXJkc1BlclNsaWRlKSB7XG4gICAgICB0aGlzLnJlbmRlcigpO1xuICAgIH1cbiAgfVxuXG4gIHNsaWRlTGVmdCgpIHtcbiAgICBpZiAodGhpcy5wb3NpdGlvbiA+IDApIHtcbiAgICAgIHRoaXMucG9zaXRpb24gLT0gMTtcbiAgICAgIHRoaXMucmVuZGVyKCk7XG4gICAgfVxuICB9XG5cbiAgc2xpZGVSaWdodCgpIHtcbiAgICBpZiAodGhpcy5wb3NpdGlvbiA8IHRoaXMubnVtYmVyT2ZJdGVtcykge1xuICAgICAgdGhpcy5wb3NpdGlvbiArPSAxO1xuICAgICAgdGhpcy5yZW5kZXIoKTtcbiAgICB9XG4gIH1cblxuICByZW5kZXIoKSB7XG4gICAgY29uc3QgZGlyID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2h0bWwnKVswXS5nZXRBdHRyaWJ1dGUoJ2RpcicpO1xuICAgIGlmIChkaXIgIT09IHRoaXMuZGlyKSB7XG4gICAgICB0aGlzLmRpciA9IGRpcjtcbiAgICAgIHRoaXMucG9zaXRpb24gPSAwO1xuICAgIH1cbiAgICBpZiAodGhpcy5wb3NpdGlvbiA9PT0gMCkge1xuICAgICAgdGhpcy5sZWZ0QnV0dG9uLmNsYXNzTGlzdC5yZW1vdmUoJ2JrLW1vdmllLXNsaWRlcl9fYXJyb3dfc2hvdycpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmxlZnRCdXR0b24uY2xhc3NMaXN0LmFkZCgnYmstbW92aWUtc2xpZGVyX19hcnJvd19zaG93Jyk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMucG9zaXRpb24gPCB0aGlzLm51bWJlck9mSXRlbXMgLSB0aGlzLmNhcmRzUGVyU2xpZGUpIHtcbiAgICAgIHRoaXMucmlnaHRCdXR0b24uY2xhc3NMaXN0LmFkZCgnYmstbW92aWUtc2xpZGVyX19hcnJvd19zaG93Jyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucmlnaHRCdXR0b24uY2xhc3NMaXN0LnJlbW92ZSgnYmstbW92aWUtc2xpZGVyX19hcnJvd19zaG93Jyk7XG4gICAgfVxuICAgIGlmICh0aGlzLmRpciA9PT0gJ3J0bCcpIHtcbiAgICAgIHRoaXMuY29udGFpbmVyLnN0eWxlLnRyYW5zZm9ybSA9IGB0cmFuc2xhdGVYKCR7dGhpcy5wb3NpdGlvbiAqIHRoaXMubW92ZVBlcmNlbnR9JSlgO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmNvbnRhaW5lci5zdHlsZS50cmFuc2Zvcm0gPSBgdHJhbnNsYXRlWCgtJHt0aGlzLnBvc2l0aW9uICogdGhpcy5tb3ZlUGVyY2VudH0lKWA7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIE1vdmllU2xpZGVySW5pdCgpIHtcbiAgY29uc3QgbW92aWVTbGlkZXJzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLmJrLW1vdmllLXNsaWRlcicpO1xuICBpZiAobW92aWVTbGlkZXJzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbW92aWVTbGlkZXJzLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgY29uc3QgbW92aWVTbGlkZSA9IG5ldyBNb3ZpZVNsaWRlcihtb3ZpZVNsaWRlcnNbaV0pO1xuICAgIG1vdmllU2xpZGUuaW5pdCgpO1xuICB9XG4gIHJldHVybiBudWxsO1xufVxuXG5leHBvcnQgZGVmYXVsdCBNb3ZpZVNsaWRlckluaXQ7XG4iLCIvKiBnbG9iYWwgd2luZG93LCBkb2N1bWVudCAqL1xuaW1wb3J0IHsgZGVib3VuY2UsIHRocm90dGxlIH0gZnJvbSAnLi4vdXRpbHMnO1xuXG5jbGFzcyBQbGF6YU1vYmlsZU5hdmlnYXRpb24ge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICAvLyBEb20gZWxlbWVudHNcbiAgICB0aGlzLm1haW5NZW51ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2pzLXBsYXphLW1haW4tbWVudScpO1xuICAgIHRoaXMubW9iaWxlTWVudSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdqcy1wbGF6YS1tb2JpbGUtbWVudScpO1xuICAgIHRoaXMubW9iaWxlTmF2QnV0dG9uID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmpzLXBsYXphLW1vYmlsZS1uYXYtYnV0dG9uJyk7XG4gICAgdGhpcy5jb250ZW50ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmpzLXBsYXphLW1vYmlsZS1tZW51LWNvbnRlbnQnKTtcbiAgICB0aGlzLnNjcm9sbFBvcyA9IDA7XG4gIH1cblxuICBpbml0KCkge1xuICAgIGNvbnN0IFtyb290XSA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCdodG1sJyk7XG4gICAgdGhpcy5yb290ID0gcm9vdDtcblxuICAgIGlmICghdGhpcy5tb2JpbGVNZW51KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gc2V0dGluZ3NcbiAgICB0aGlzLm1vYmlsZU1lbnVPcGVuID0gZmFsc2U7XG4gICAgdGhpcy5tYWluTWVudUhlaWdodCA9IHRoaXMubWFpbk1lbnUuY2xpZW50SGVpZ2h0O1xuICAgIHRoaXMudG9nZ2xlTWVudSA9IHRoaXMudG9nZ2xlTWVudS5iaW5kKHRoaXMpO1xuICAgIHRoaXMuc2Nyb2xsSW50ZXJhY3Rpb25zID0gdGhpcy5zY3JvbGxJbnRlcmFjdGlvbnMuYmluZCh0aGlzKTtcblxuICAgIGNvbnN0IG1vYmlsZUxpbmtzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLmpzLXBsYXphLW1vYmlsZS1saW5rcycpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbW9iaWxlTGlua3MubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgIG1vYmlsZUxpbmtzW2ldLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy50b2dnbGVNZW51LCBmYWxzZSk7XG4gICAgfVxuXG4gICAgLy8gT3BlbiBhbmQgY2xvc2UgbW9iaWxlIG5hdmlnYXRpb25cbiAgICB0aGlzLm1vYmlsZU5hdkJ1dHRvbi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMudG9nZ2xlTWVudSwgZmFsc2UpO1xuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdzY3JvbGwnLCB0aHJvdHRsZSh0aGlzLnNjcm9sbEludGVyYWN0aW9ucywgMTApKTtcbiAgfVxuXG4gIHRvZ2dsZU1lbnUoZXZlbnQpIHtcbiAgICBkb2N1bWVudC5ib2R5LnN0eWxlLm92ZXJmbG93ID0gJ3Njcm9sbCc7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICB0aGlzLm1vYmlsZU1lbnVPcGVuID0gIXRoaXMubW9iaWxlTWVudU9wZW47XG4gICAgaWYgKHRoaXMubW9iaWxlTWVudU9wZW4pIHtcbiAgICAgIHRoaXMubWFpbk1lbnUuY2xhc3NMaXN0LmFkZCgnYmstbW9iaWxlLW1lbnUtb3BlbicpO1xuICAgICAgLy8gYWRkIG92ZXJmbG93IGhpZGRlbiB0byBwcmV2ZW50IHNjcm9sbGluZyB3aGVuIG1lbnUgb3BlblxuICAgICAgdGhpcy5yb290LmNsYXNzTGlzdC5hZGQoJ2JrLW1vYmlsZS1tZW51X19vdmVyZmxvdycpO1xuICAgICAgdGhpcy5jb250ZW50LmNsYXNzTGlzdC5hZGQoJ2JrLW1vYmlsZS1tZW51LWZhZGVpbicpO1xuICAgICAgdGhpcy5tb2JpbGVOYXZCdXR0b24uY2xhc3NMaXN0LmFkZCgnaXMtYWN0aXZlJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMubWFpbk1lbnUuY2xhc3NMaXN0LnJlbW92ZSgnYmstbW9iaWxlLW1lbnUtb3BlbicpO1xuICAgICAgdGhpcy5yb290LmNsYXNzTGlzdC5yZW1vdmUoJ2JrLW1vYmlsZS1tZW51X19vdmVyZmxvdycpO1xuICAgICAgdGhpcy5jb250ZW50LmNsYXNzTGlzdC5yZW1vdmUoJ2JrLW1vYmlsZS1tZW51LWZhZGVpbicpO1xuICAgICAgdGhpcy5tb2JpbGVOYXZCdXR0b24uY2xhc3NMaXN0LnJlbW92ZSgnaXMtYWN0aXZlJyk7XG4gICAgfVxuICB9XG5cbiAgc2Nyb2xsSW50ZXJhY3Rpb25zKCkge1xuICAgIHRoaXMucHJldlNjb2xsUG9zID0gdGhpcy5zY3JvbGxQb3M7XG4gICAgdGhpcy5zY3JvbGxQb3MgPSB3aW5kb3cuc2Nyb2xsWSB8fCB3aW5kb3cuc2Nyb2xsVG9wIHx8IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCdodG1sJylbMF0uc2Nyb2xsVG9wO1xuXG4gICAgaWYgKHRoaXMuc2Nyb2xsUG9zID4gdGhpcy5tYWluTWVudUhlaWdodCkge1xuICAgICAgdGhpcy5tYWluTWVudS5jbGFzc0xpc3QuYWRkKCdiay1mZXN0aXZhbC1wbGF6YS1oZWFkZXItYWN0aXZlJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMubWFpbk1lbnUuY2xhc3NMaXN0LnJlbW92ZSgnYmstZmVzdGl2YWwtcGxhemEtaGVhZGVyLWFjdGl2ZScpO1xuICAgIH1cbiAgICAvL1xuICAgIGlmICh0aGlzLnNjcm9sbFBvcyA8IHRoaXMubWFpbk1lbnVIZWlnaHQgKiA0KSB7XG4gICAgICB0aGlzLm1haW5NZW51LmNsYXNzTGlzdC5yZW1vdmUoJ2JrLWZlc3RpdmFsLXBsYXphLWhlYWRlci11cCcpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5wcmV2U2NvbGxQb3MgPiB0aGlzLnNjcm9sbFBvcykge1xuICAgICAgdGhpcy5tYWluTWVudS5jbGFzc0xpc3QucmVtb3ZlKCdiay1mZXN0aXZhbC1wbGF6YS1oZWFkZXItdXAnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5tYWluTWVudS5jbGFzc0xpc3QuYWRkKCdiay1mZXN0aXZhbC1wbGF6YS1oZWFkZXItdXAnKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gcmVzaXplTW9iaWxlTmF2KCkge1xuICBjb25zdCBtb2JpbGVNZW51Q29udGFpbmVyID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmpzLXBsYXphLW1vYmlsZS1tZW51LWNvbnRhaW5lcicpO1xuICBpZiAobW9iaWxlTWVudUNvbnRhaW5lcikge1xuICAgIGNvbnN0IHZoID0gTWF0aC5tYXgoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCwgd2luZG93LmlubmVySGVpZ2h0IHx8IDApO1xuICAgIG1vYmlsZU1lbnVDb250YWluZXIuc3R5bGUuaGVpZ2h0ID0gYCR7dmh9cHhgO1xuICB9XG59XG5cbi8vIFJlc2V0IGhlaWdodCBvZiB0aGUgbW9iaWxlIG5hdiB3aGVuIHRoZSBicm93c2VyIGlzIHJlc2l6ZWRcbmNvbnN0IHdpbmRvd1Jlc2l6ZURlYm91bmNlID0gZGVib3VuY2UoKCkgPT4ge1xuICByZXNpemVNb2JpbGVOYXYoKTtcbn0sIDI1MCk7XG5cbnJlc2l6ZU1vYmlsZU5hdigpO1xuXG53aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigncmVzaXplJywgd2luZG93UmVzaXplRGVib3VuY2UpO1xuXG5leHBvcnQgZGVmYXVsdCBQbGF6YU1vYmlsZU5hdmlnYXRpb247XG4iLCIvKiBnbG9iYWwgZG9jdW1lbnQsIHdpbmRvdyAqL1xuaW1wb3J0IHsgZGVib3VuY2UgfSBmcm9tICcuLi91dGlscyc7XG5cbmNvbnN0IHNsaWRlckFycmF5ID0gW107XG5cbmZ1bmN0aW9uIGNhbGN1bGF0ZVBvc2l0aW9uKHBvcywgd2lkdGgpIHtcbiAgLy8gY2FsY3VsYXRlIHRoZSBjZWlsaW5nXG4gIGNvbnN0IGNlaWwgPSBNYXRoLmNlaWwocG9zIC8gd2lkdGgpICogd2lkdGg7XG4gIC8vIGNhbGN1bGF0ZSB0aGUgZmxvb3JcbiAgY29uc3QgZmxvb3IgPSBNYXRoLmZsb29yKHBvcyAvIHdpZHRoKSAqIHdpZHRoO1xuICAvLyBjYWxjdWxhdGUgdGhlIG1lYW5cbiAgY29uc3QgbWVhbiA9IChjZWlsICsgZmxvb3IpIC8gMjtcblxuICAvLyBzZXQgdGhlIHBvc2l0aW9uXG4gIGxldCBwb3NpdGlvbiA9IDA7XG4gIGlmIChwb3MgPj0gbWVhbikge1xuICAgIHBvc2l0aW9uID0gY2VpbDtcbiAgfSBlbHNlIHtcbiAgICBwb3NpdGlvbiA9IGZsb29yO1xuICB9XG4gIHJldHVybiBwb3NpdGlvbjtcbn1cblxuY2xhc3MgSW1hZ2VTbGlkZXIge1xuICBjb25zdHJ1Y3RvcihzbGlkZXIpIHtcbiAgICB0aGlzLnNsaWRlciA9IHNsaWRlcjtcbiAgfVxuXG4gIGluaXQoKSB7XG4gICAgLy8gRG9tIGVsZW1lbnRzXG4gICAgdGhpcy5oYW5kbGUgPSB0aGlzLnNsaWRlci5xdWVyeVNlbGVjdG9yKCcuanMtaW1hZ2Utc2xpZGVyLWhhbmRsZScpO1xuICAgIHRoaXMuc2xpZGVCYXIgPSB0aGlzLnNsaWRlci5xdWVyeVNlbGVjdG9yKCcuanMtaW1hZ2Utc2xpZGVyLWJhcicpO1xuICAgIHRoaXMuc2xpZGVzID0gdGhpcy5zbGlkZXIucXVlcnlTZWxlY3RvcignLmpzLWltYWdlLXNsaWRlci1zbGlkZXMnKTtcbiAgICB0aGlzLnNsaWRlID0gdGhpcy5zbGlkZXIucXVlcnlTZWxlY3RvcignLmpzLWltYWdlLXNsaWRlci1zbGlkZScpO1xuICAgIC8vIGdldCB0aGUgZGlyZWN0aW9uXG4gICAgdGhpcy5kaXIgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnaHRtbCcpWzBdLmdldEF0dHJpYnV0ZSgnZGlyJyk7XG4gICAgaWYgKCF0aGlzLmRpcikge1xuICAgICAgdGhpcy5kaXIgPSAnbHRyJztcbiAgICB9XG4gICAgdGhpcy5yaWdodEJ1dHRvbiA9IHRoaXMuc2xpZGVyLnF1ZXJ5U2VsZWN0b3IoJy5qcy1hcnJvdy1yaWdodC1hcmVhJyk7XG4gICAgdGhpcy5sZWZ0QnV0dG9uID0gdGhpcy5zbGlkZXIucXVlcnlTZWxlY3RvcignLmpzLWFycm93LWxlZnQtYXJlYScpO1xuXG4gICAgLy8gYWRkIHNjYWxlIGNsYXNzIHRvIGluaXRpYWwgc2xpZGVcbiAgICB0aGlzLnNsaWRlcy5jaGlsZHJlblswXS5jbGFzc0xpc3QuYWRkKCdiay1wcm9kdWN0LWNhcm91c2VsLXNjYWxlJyk7XG5cbiAgICAvLyBIYW5kbGVcbiAgICB0aGlzLmhhbmRsZVdpZHRoID0gdGhpcy5oYW5kbGUub2Zmc2V0V2lkdGggLSAyMDtcbiAgICB0aGlzLmhhbmRsZVJhZGl1cyA9IHRoaXMuaGFuZGxlV2lkdGggLyAyO1xuICAgIHRoaXMuaGFuZGxlU2VsZWN0ZWQgPSBudWxsO1xuICAgIHRoaXMuaGFuZGxlUG9zID0gbnVsbDtcbiAgICB0aGlzLnhQb3MgPSAwO1xuXG4gICAgLy8gU2xpZGVCYXJcbiAgICB0aGlzLnNsaWRlQmFyT2Zmc2V0TGVmdCA9IHRoaXMuc2xpZGVCYXIub2Zmc2V0TGVmdCArIHRoaXMuaGFuZGxlUmFkaXVzO1xuICAgIHRoaXMuc2xpZGVCYXJNaW5XaWR0aCA9IDA7XG4gICAgdGhpcy5zbGlkZWJhcldpZHRoID0gdGhpcy5zbGlkZUJhci5vZmZzZXRXaWR0aDtcbiAgICB0aGlzLnNsaWRlQmFyTWF4V2lkdGggPSB0aGlzLnNsaWRlYmFyV2lkdGg7XG5cbiAgICAvLyBTbGlkZXNcbiAgICB0aGlzLm51bWJlck9mU2xpZGVzID0gdGhpcy5zbGlkZXMuY2hpbGRFbGVtZW50Q291bnQgLSAxO1xuICAgIGNvbnN0IG1hcmdpbiA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHRoaXMuc2xpZGUpLmdldFByb3BlcnR5VmFsdWUoJ21hcmdpbi1sZWZ0Jyk7XG4gICAgdGhpcy5zbGlkZU1hcmdpbiA9IHBhcnNlSW50KG1hcmdpbiwgMTApICogMjtcbiAgICB0aGlzLnNsaWRlV2lkdGggPSB0aGlzLnNsaWRlLm9mZnNldFdpZHRoICsgdGhpcy5zbGlkZU1hcmdpbjtcbiAgICB0aGlzLnNsaWRlc0NvbnRhaW5lcldpZHRoID0gdGhpcy5zbGlkZVdpZHRoICogdGhpcy5udW1iZXJPZlNsaWRlcztcbiAgICB0aGlzLnNsaWRlUmF0aW8gPSB0aGlzLnNsaWRlc0NvbnRhaW5lcldpZHRoIC8gdGhpcy5zbGlkZUJhck1heFdpZHRoO1xuXG4gICAgLy8gRXZlbnQgYmluZHNcbiAgICB0aGlzLm1vdXNlRHJhZyA9IHRoaXMubW91c2VEcmFnLmJpbmQodGhpcyk7XG4gICAgdGhpcy50b3VjaERyYWcgPSB0aGlzLnRvdWNoRHJhZy5iaW5kKHRoaXMpO1xuICAgIHRoaXMuaGFuZGxlTW91c2VVcCA9IHRoaXMuaGFuZGxlTW91c2VVcC5iaW5kKHRoaXMpO1xuICAgIHRoaXMuaGFuZGxlTW91c2VEb3duID0gdGhpcy5oYW5kbGVNb3VzZURvd24uYmluZCh0aGlzKTtcbiAgICB0aGlzLmhhbmRsZVRvdWNoRW5kID0gdGhpcy5oYW5kbGVUb3VjaEVuZC5iaW5kKHRoaXMpO1xuICAgIHRoaXMuaGFuZGxlVG91Y2hEb3duID0gdGhpcy5oYW5kbGVUb3VjaERvd24uYmluZCh0aGlzKTtcbiAgICB0aGlzLmhhbmRsZUxlZnRCdXR0b24gPSB0aGlzLmhhbmRsZUxlZnRCdXR0b24uYmluZCh0aGlzKTtcbiAgICB0aGlzLmhhbmRsZVJpZ2h0QnV0dG9uID0gdGhpcy5oYW5kbGVSaWdodEJ1dHRvbi5iaW5kKHRoaXMpO1xuXG4gICAgLy8gRXJyb3JzXG4gICAgaWYgKCF0aGlzLmhhbmRsZSkge1xuICAgICAgdGhyb3cgRXJyb3IoJ01pc3NpbmcganMtaW1hZ2Utc2xpZGVyLWhhbmRsZScpO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5zbGlkZUJhcikge1xuICAgICAgdGhyb3cgRXJyb3IoJ01pc3NpbmcganMtaW1hZ2Utc2xpZGVyLWJhcicpO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5zbGlkZXMpIHtcbiAgICAgIHRocm93IEVycm9yKCdNaXNzaW5nIGpzLWltYWdlLXNsaWRlci1zbGlkZXMnKTtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuc2xpZGUpIHtcbiAgICAgIHRocm93IEVycm9yKCdNaXNzaW5nIGpzLWltYWdlLXNsaWRlci1zbGlkZScpO1xuICAgIH1cblxuICAgIC8vIGV2ZW50IGxpc3RlbmVyc1xuICAgIHRoaXMuaGFuZGxlLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlZG93bicsIHRoaXMuaGFuZGxlTW91c2VEb3duLCBmYWxzZSk7XG4gICAgdGhpcy5oYW5kbGUuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2hzdGFydCcsIHRoaXMuaGFuZGxlVG91Y2hEb3duLCBmYWxzZSk7XG4gICAgaWYgKHRoaXMuZGlyID09PSAncnRsJykge1xuICAgICAgdGhpcy5yaWdodEJ1dHRvbi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuaGFuZGxlTGVmdEJ1dHRvbiwgZmFsc2UpO1xuICAgICAgdGhpcy5sZWZ0QnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5oYW5kbGVSaWdodEJ1dHRvbiwgZmFsc2UpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnJpZ2h0QnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5oYW5kbGVSaWdodEJ1dHRvbiwgZmFsc2UpO1xuICAgICAgdGhpcy5sZWZ0QnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5oYW5kbGVMZWZ0QnV0dG9uLCBmYWxzZSk7XG4gICAgfVxuICB9XG5cbiAgaGFuZGxlTW91c2VVcCgpIHtcbiAgICAvLyByZW1vdmUgZXZlbnQgbGlzdGVuZXJzXG4gICAgdGhpcy5zbGlkZXIucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgdGhpcy5tb3VzZURyYWcsIGZhbHNlKTtcbiAgICB0aGlzLnNsaWRlci5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgdGhpcy5oYW5kbGVNb3VzZVVwLCBmYWxzZSk7XG5cbiAgICAvLyBhZGQgY2xhc3NlcyBmb3IgYW5pbWF0aW9uXG4gICAgdGhpcy5oYW5kbGUuY2xhc3NMaXN0LmFkZCgnYmstcHJvZHVjdC1jYXJvdXNlbC1hbmltYXRlJyk7XG4gICAgdGhpcy5zbGlkZXMuY2xhc3NMaXN0LmFkZCgnYmstcHJvZHVjdC1jYXJvdXNlbC1hbmltYXRlLXNsaWRlcycpO1xuXG4gICAgLy8gU2V0IEhhbmRsZSB0byBmaXhlZCBwb3NpdGlvblxuICAgIGNvbnN0IHNsaWRlcldpZHRoID0gdGhpcy5zbGlkZUJhck1heFdpZHRoIC8gdGhpcy5udW1iZXJPZlNsaWRlcztcbiAgICBjb25zdCBzbGlkZXJQb3NpdGlvbiA9IGNhbGN1bGF0ZVBvc2l0aW9uKHRoaXMueFBvcywgc2xpZGVyV2lkdGgpO1xuXG4gICAgbGV0IGltYWdlV2lkdGhXaXRoUmF0aW8gPSB0aGlzLnhQb3MgKiB0aGlzLnNsaWRlUmF0aW87XG4gICAgbGV0IGltYWdlUG9zaXRpb24gPSBjYWxjdWxhdGVQb3NpdGlvbihpbWFnZVdpZHRoV2l0aFJhdGlvLCB0aGlzLnNsaWRlV2lkdGgpO1xuXG4gICAgaWYgKHRoaXMuZGlyID09PSAncnRsJykge1xuICAgICAgY29uc3QgcG9zID0gdGhpcy5zbGlkZUJhck1heFdpZHRoIC0gdGhpcy54UG9zO1xuICAgICAgaW1hZ2VXaWR0aFdpdGhSYXRpbyA9IHBvcyAqIHRoaXMuc2xpZGVSYXRpbztcbiAgICAgIGltYWdlUG9zaXRpb24gPSBjYWxjdWxhdGVQb3NpdGlvbihpbWFnZVdpZHRoV2l0aFJhdGlvLCB0aGlzLnNsaWRlV2lkdGgpO1xuICAgIH1cblxuICAgIHRoaXMubW92ZShzbGlkZXJQb3NpdGlvbiwgaW1hZ2VQb3NpdGlvbik7XG5cbiAgICBpZiAodGhpcy5oYW5kbGVTZWxlY3RlZCkge1xuICAgICAgdGhpcy5kZXN0cm95KCk7XG4gICAgfVxuICB9XG5cbiAgaGFuZGxlTW91c2VEb3duKGV2ZW50KSB7XG4gICAgdGhpcy5pbml0RHJhZyhldmVudC50YXJnZXQpO1xuICAgIHRoaXMuaGFuZGxlLmNsYXNzTGlzdC5yZW1vdmUoJ2JrLXByb2R1Y3QtY2Fyb3VzZWwtYW5pbWF0ZScpO1xuICAgIHRoaXMuc2xpZGVzLmNsYXNzTGlzdC5yZW1vdmUoJ2JrLXByb2R1Y3QtY2Fyb3VzZWwtYW5pbWF0ZS1zbGlkZXMnKTtcbiAgICB0aGlzLnNsaWRlci5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCB0aGlzLm1vdXNlRHJhZywgZmFsc2UpO1xuICAgIHRoaXMuc2xpZGVyLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCB0aGlzLmhhbmRsZU1vdXNlVXAsIGZhbHNlKTtcbiAgfVxuXG4gIGhhbmRsZVRvdWNoRW5kKCkge1xuICAgIC8vIHJlbW92ZSBldmVudCBsaXN0ZW5lcnNcbiAgICB0aGlzLnNsaWRlci5yZW1vdmVFdmVudExpc3RlbmVyKCd0b3VjaGVuZCcsIHRoaXMuaGFuZGxlVG91Y2hFbmQsIGZhbHNlKTtcbiAgICB0aGlzLnNsaWRlci5yZW1vdmVFdmVudExpc3RlbmVyKCd0b3VjaG1vdmUnLCB0aGlzLnRvdWNoRHJhZywgZmFsc2UpO1xuICAgIC8vIGFkZCBjbGFzc2VzIGZvciBhbmltYXRpb25cbiAgICB0aGlzLmhhbmRsZS5jbGFzc0xpc3QuYWRkKCdiay1wcm9kdWN0LWNhcm91c2VsLWFuaW1hdGUnKTtcbiAgICB0aGlzLnNsaWRlcy5jbGFzc0xpc3QuYWRkKCdiay1wcm9kdWN0LWNhcm91c2VsLWFuaW1hdGUtc2xpZGVzJyk7XG5cbiAgICAvLyBTZXQgSGFuZGxlIHRvIGZpeGVkIHBvc2l0aW9uXG4gICAgY29uc3Qgc2xpZGVyV2lkdGggPSB0aGlzLnNsaWRlQmFyTWF4V2lkdGggLyB0aGlzLm51bWJlck9mU2xpZGVzO1xuICAgIGNvbnN0IHNsaWRlclBvc2l0aW9uID0gY2FsY3VsYXRlUG9zaXRpb24odGhpcy54UG9zLCBzbGlkZXJXaWR0aCk7XG5cbiAgICAvLyBTZXQgc2xpZGVyIHRvIGZpeGVkIHBvc2l0aW9uXG4gICAgY29uc3QgaW1hZ2VXaWR0aFdpdGhSYXRpbyA9IHRoaXMueFBvcyAqIHRoaXMuc2xpZGVSYXRpbztcbiAgICBjb25zdCBpbWFnZVBvc2l0aW9uID0gY2FsY3VsYXRlUG9zaXRpb24oaW1hZ2VXaWR0aFdpdGhSYXRpbywgdGhpcy5zbGlkZVdpZHRoKTtcblxuICAgIHRoaXMubW92ZShzbGlkZXJQb3NpdGlvbiwgaW1hZ2VQb3NpdGlvbik7XG5cbiAgICBpZiAodGhpcy5oYW5kbGVTZWxlY3RlZCkge1xuICAgICAgdGhpcy5kZXN0cm95KCk7XG4gICAgfVxuICB9XG5cbiAgaGFuZGxlVG91Y2hEb3duKGV2ZW50KSB7XG4gICAgdGhpcy5pbml0RHJhZyhldmVudC50YXJnZXQpO1xuICAgIHRoaXMuaGFuZGxlLmNsYXNzTGlzdC5yZW1vdmUoJ2JrLXByb2R1Y3QtY2Fyb3VzZWwtYW5pbWF0ZScpO1xuICAgIHRoaXMuc2xpZGVzLmNsYXNzTGlzdC5yZW1vdmUoJ2JrLXByb2R1Y3QtY2Fyb3VzZWwtYW5pbWF0ZS1zbGlkZXMnKTtcbiAgICB0aGlzLnNsaWRlci5hZGRFdmVudExpc3RlbmVyKCd0b3VjaG1vdmUnLCB0aGlzLnRvdWNoRHJhZywgZmFsc2UpO1xuICAgIHRoaXMuc2xpZGVyLmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNoZW5kJywgdGhpcy5oYW5kbGVUb3VjaEVuZCwgZmFsc2UpO1xuICB9XG5cbiAgaGFuZGxlUmlnaHRCdXR0b24oKSB7XG4gICAgY29uc3QgaGFuZGxlUG9zaXRpb24gPSB0aGlzLmhhbmRsZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5sZWZ0IC0gdGhpcy5zbGlkZUJhck9mZnNldExlZnQ7XG4gICAgdGhpcy5pbml0RHJhZyh0aGlzLmhhbmRsZSk7XG4gICAgY29uc3Qgc2xpZGVXaWR0aCA9IHRoaXMuc2xpZGVCYXJNYXhXaWR0aCAvIHRoaXMubnVtYmVyT2ZTbGlkZXM7XG4gICAgY29uc3QgbmV3cG9zID0gaGFuZGxlUG9zaXRpb24gKyBzbGlkZVdpZHRoO1xuICAgIGNvbnN0IHNsaWRlclBvc2l0aW9uID0gY2FsY3VsYXRlUG9zaXRpb24obmV3cG9zLCBzbGlkZVdpZHRoKTtcbiAgICB0aGlzLm1vdmUoc2xpZGVyUG9zaXRpb24pO1xuICAgIHRoaXMuZGVzdHJveSgpO1xuICB9XG5cbiAgaGFuZGxlTGVmdEJ1dHRvbigpIHtcbiAgICBjb25zdCBoYW5kbGVQb3NpdGlvbiA9IHRoaXMuaGFuZGxlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmxlZnQgLSB0aGlzLnNsaWRlQmFyT2Zmc2V0TGVmdDtcbiAgICB0aGlzLmluaXREcmFnKHRoaXMuaGFuZGxlKTtcbiAgICBjb25zdCBzbGlkZXJXaWR0aCA9IHRoaXMuc2xpZGVCYXJNYXhXaWR0aCAvIHRoaXMubnVtYmVyT2ZTbGlkZXM7XG4gICAgY29uc3QgbmV3cG9zID0gaGFuZGxlUG9zaXRpb24gLSBzbGlkZXJXaWR0aDtcbiAgICBjb25zdCBzbGlkZXJQb3NpdGlvbiA9IGNhbGN1bGF0ZVBvc2l0aW9uKG5ld3Bvcywgc2xpZGVyV2lkdGgpO1xuICAgIHRoaXMubW92ZShzbGlkZXJQb3NpdGlvbik7XG4gICAgdGhpcy5kZXN0cm95KCk7XG4gIH1cblxuICBkZXN0cm95KCkge1xuICAgIHRoaXMuaGFuZGxlU2VsZWN0ZWQgPSBudWxsO1xuICB9XG5cbiAgaW5pdERyYWcoZWxlbWVudCkge1xuICAgIHRoaXMuaGFuZGxlU2VsZWN0ZWQgPSBlbGVtZW50O1xuICB9XG5cbiAgdG91Y2hEcmFnKGV2ZW50KSB7XG4gICAgY29uc3QgdG91Y2ggPSBldmVudC50YXJnZXRUb3VjaGVzWzBdO1xuICAgIHRoaXMueFBvcyA9IHRvdWNoLnBhZ2VYIC0gdGhpcy5zbGlkZUJhck9mZnNldExlZnQ7XG4gICAgdGhpcy5tb3ZlKHRoaXMueFBvcyk7XG4gIH1cblxuICBtb3VzZURyYWcoZXZlbnQpIHtcbiAgICB0aGlzLnhQb3MgPSBldmVudC5jbGllbnRYIC0gdGhpcy5zbGlkZUJhck9mZnNldExlZnQ7XG4gICAgdGhpcy5tb3ZlKHRoaXMueFBvcyk7XG4gIH1cblxuICBzY2FsZUltYWdlcygpIHtcbiAgICBjb25zdCBzbGlkZUNvdW50ID0gdGhpcy5udW1iZXJPZlNsaWRlcztcbiAgICBjb25zdCBoYW5kbGVQb3MgPSB0aGlzLmhhbmRsZVBvcyAvIHRoaXMuc2xpZGVCYXJNYXhXaWR0aDtcbiAgICBjb25zdCBhY3RpdmVTbGlkZSA9IE1hdGguY2VpbChoYW5kbGVQb3MgKiBzbGlkZUNvdW50KTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuc2xpZGVzLmNoaWxkcmVuLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICBpZiAoYWN0aXZlU2xpZGUgPT09IGkpIHtcbiAgICAgICAgdGhpcy5zbGlkZXMuY2hpbGRyZW5baV0uY2xhc3NMaXN0LmFkZCgnYmstcHJvZHVjdC1jYXJvdXNlbC1zY2FsZScpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5zbGlkZXMuY2hpbGRyZW5baV0uY2xhc3NMaXN0LnJlbW92ZSgnYmstcHJvZHVjdC1jYXJvdXNlbC1zY2FsZScpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJlc2V0KCkge1xuICAgIHRoaXMuc2xpZGVzLnN0eWxlLnRyYW5zZm9ybSA9ICd0cmFuc2xhdGUzZCgwcHgsIDBweCwgMHB4KSc7XG4gICAgaWYgKHRoaXMuZGlyID09PSAnbHRyJykge1xuICAgICAgdGhpcy5oYW5kbGUuc3R5bGUubGVmdCA9ICcwcHgnO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmhhbmRsZS5zdHlsZS5sZWZ0ID0gYCR7dGhpcy5zbGlkZUJhck1heFdpZHRofXB4YDtcbiAgICB9XG4gICAgdGhpcy5pbml0KCk7XG4gIH1cblxuICBtb3ZlKGhhbmRsZVBvc2l0aW9uLCBzbGlkZXJQb3NpdGlvbikge1xuICAgIGxldCBzbGlkZXJQb3MgPSBzbGlkZXJQb3NpdGlvbjtcbiAgICBpZiAoIXNsaWRlclBvcykge1xuICAgICAgaWYgKHRoaXMuZGlyID09PSAnbHRyJykge1xuICAgICAgICBzbGlkZXJQb3MgPSBoYW5kbGVQb3NpdGlvbiAqIHRoaXMuc2xpZGVSYXRpbztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHBvcyA9IHRoaXMuc2xpZGVCYXJNYXhXaWR0aCAtIGhhbmRsZVBvc2l0aW9uO1xuICAgICAgICBzbGlkZXJQb3MgPSBwb3MgKiB0aGlzLnNsaWRlUmF0aW87XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKFxuICAgICAgdGhpcy5oYW5kbGVTZWxlY3RlZCAhPT0gbnVsbFxuICAgICAgJiYgaGFuZGxlUG9zaXRpb24gPj0gdGhpcy5zbGlkZUJhck1pbldpZHRoXG4gICAgICAmJiBoYW5kbGVQb3NpdGlvbiA8PSB0aGlzLnNsaWRlQmFyTWF4V2lkdGhcbiAgICApIHtcbiAgICAgIGlmICh0aGlzLmRpciA9PT0gJ2x0cicpIHtcbiAgICAgICAgdGhpcy5zbGlkZXMuc3R5bGUudHJhbnNmb3JtID0gYHRyYW5zbGF0ZTNkKC0ke3NsaWRlclBvc31weCwgMHB4LCAwcHgpYDtcbiAgICAgICAgdGhpcy5oYW5kbGVTZWxlY3RlZC5zdHlsZS5sZWZ0ID0gYCR7aGFuZGxlUG9zaXRpb259cHhgO1xuICAgICAgICB0aGlzLmhhbmRsZVBvcyA9IGhhbmRsZVBvc2l0aW9uO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5zbGlkZXMuc3R5bGUudHJhbnNmb3JtID0gYHRyYW5zbGF0ZTNkKCR7c2xpZGVyUG9zfXB4LCAwcHgsIDBweClgO1xuICAgICAgICB0aGlzLmhhbmRsZVNlbGVjdGVkLnN0eWxlLnJpZ2h0ID0gYCR7dGhpcy5zbGlkZUJhck1heFdpZHRoIC0gaGFuZGxlUG9zaXRpb259cHhgO1xuICAgICAgICB0aGlzLmhhbmRsZVBvcyA9IHRoaXMuc2xpZGVCYXJNYXhXaWR0aCAtIGhhbmRsZVBvc2l0aW9uO1xuICAgICAgfVxuICAgIH1cbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMuc2NhbGVJbWFnZXMoKTtcbiAgICB9LCAxODApO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUltYWdlU2xpZGVycygpIHtcbiAgY29uc3QgaW1hZ2VTbGlkZXJzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLmpzLWltYWdlLXNsaWRlcicpO1xuICBpZiAoaW1hZ2VTbGlkZXJzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBpbWFnZVNsaWRlcnMubGVuZ3RoOyBpICs9IDEpIHtcbiAgICBjb25zdCBzbGlkZXIgPSBuZXcgSW1hZ2VTbGlkZXIoaW1hZ2VTbGlkZXJzW2ldKTtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHNsaWRlci5pbml0KCk7XG4gICAgfSwgMTgwKTtcbiAgICBzbGlkZXJBcnJheS5wdXNoKHNsaWRlcik7XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cblxuLy8gUmVzZXQgdGhlIHNsaWRlciB3aGVuIHRoZSBicm93c2VyIGlzIHJlc2l6ZWRcXFxubGV0IGJyb3dzZXJXaWR0aCA9IGRvY3VtZW50LmJvZHkuY2xpZW50V2lkdGg7XG5cbi8vIHJlc2l6ZSBjb21wb25lbnQgaWYgd2lkdGggY2hhbmdlcy5cbmNvbnN0IHdpbmRvd1Jlc2l6ZURlYm91bmNlID0gZGVib3VuY2UoKCkgPT4ge1xuICBpZiAoYnJvd3NlcldpZHRoICE9PSBkb2N1bWVudC5ib2R5LmNsaWVudFdpZHRoKSB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzbGlkZXJBcnJheS5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgc2xpZGVyQXJyYXlbaV0ucmVzZXQoKTtcbiAgICB9XG4gICAgYnJvd3NlcldpZHRoID0gZG9jdW1lbnQuYm9keS5jbGllbnRXaWR0aDtcbiAgfVxufSwgMjUwKTtcblxud2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIHdpbmRvd1Jlc2l6ZURlYm91bmNlKTtcblxuZXhwb3J0IGRlZmF1bHQgY3JlYXRlSW1hZ2VTbGlkZXJzO1xuIiwiLyogZ2xvYmFsIGRvY3VtZW50ICovXG5cbmltcG9ydCBVSUtpdCBmcm9tICd1aWtpdCc7XG5cbmNsYXNzIFByb2R1Y3RTbGlkZXIge1xuICBjb25zdHJ1Y3RvcihzbGlkZXIpIHtcbiAgICB0aGlzLmNvbnRhaW5lciA9IHNsaWRlcjtcbiAgICB0aGlzLnNsaWRlciA9IHNsaWRlci5xdWVyeVNlbGVjdG9yKCcuanMtcHJvZHVjdC1zbGlkZXInKTtcbiAgfVxuXG4gIGluaXQoKSB7XG4gICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgIGNlbnRlcjogdHJ1ZSxcbiAgICB9O1xuICAgIGlmICh0aGlzLnNsaWRlcikge1xuICAgICAgVUlLaXQuc2xpZGVyKHRoaXMuc2xpZGVyLCBvcHRpb25zKTtcbiAgICB9XG4gICAgdGhpcy5oYW5kbGVDbGljayA9IHRoaXMuaGFuZGxlQ2xpY2suYmluZCh0aGlzKTtcbiAgICBjb25zdCB0aHVtYm5haWxzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLmpzLXByb2R1Y3Qtc2xpZGVyLXRodW1ibmFpbCcpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGh1bWJuYWlscy5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgdGh1bWJuYWlsc1tpXS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHRoaXMuaGFuZGxlQ2xpY2sodGh1bWJuYWlsc1tpXSksIGZhbHNlKTtcbiAgICB9XG4gIH1cblxuICBoYW5kbGVDbGljayhpdGVtKSB7XG4gICAgY29uc3QgaW5kZXggPSBpdGVtLmdldEF0dHJpYnV0ZSgnZGF0YS1pdGVtJyk7XG4gICAgaWYgKGluZGV4KSB7XG4gICAgICBVSUtpdC5zbGlkZXIodGhpcy5zbGlkZXIpLnNob3coaW5kZXgpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBjcmVhdGVQcm9kdWN0U2xpZGVycygpIHtcbiAgY29uc3QgcHJvZHVjdFNsaWRlcnMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuanMtcHJvZHVjdC1zbGlkZXItY29udGFpbmVyJyk7XG4gIGlmIChwcm9kdWN0U2xpZGVycy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgcHJvZHVjdFNsaWRlcnMubGVuZ3RoOyBpICs9IDEpIHtcbiAgICBjb25zdCBzbGlkZXIgPSBuZXcgUHJvZHVjdFNsaWRlcihwcm9kdWN0U2xpZGVyc1tpXSk7XG4gICAgc2xpZGVyLmluaXQoKTtcbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuXG5leHBvcnQgZGVmYXVsdCBjcmVhdGVQcm9kdWN0U2xpZGVycztcbiIsIi8qIGdsb2JhbCBkb2N1bWVudCAqL1xuaW1wb3J0IFVJa2l0IGZyb20gJ3Vpa2l0JztcblxuY2xhc3MgU2VhcmNoTW9kYWwge1xuICBjb25zdHJ1Y3RvcihzZWFyY2hNb2RhbCkge1xuICAgIHRoaXMuc2VhcmNoTW9kYWwgPSBzZWFyY2hNb2RhbDtcbiAgICB0aGlzLnNlYXJjaE1vZGFsSW5wdXQgPSBzZWFyY2hNb2RhbC5xdWVyeVNlbGVjdG9yKCcuanMtc2VhcmNoLW5hdmJhci1pbnB1dCcpO1xuICB9XG5cbiAgaW5pdCgpIHtcbiAgICAvLyBmb2N1cyBpbnB1dCBvbiBzaG93blxuICAgIFVJa2l0LnV0aWwub24odGhpcy5zZWFyY2hNb2RhbCwgJ3Nob3duJywgKCkgPT4ge1xuICAgICAgdGhpcy5zZWFyY2hNb2RhbElucHV0LmZvY3VzKCk7XG4gICAgfSk7XG4gICAgLy8gcmVtb3ZlIHZhbHVlIHdoZW4gY2xvc2UgbW9kYWxcbiAgICBVSWtpdC51dGlsLm9uKHRoaXMuc2VhcmNoTW9kYWwsICdoaWRkZW4nLCAoKSA9PiB7XG4gICAgICB0aGlzLnNlYXJjaE1vZGFsSW5wdXQudmFsdWUgPSAnJztcbiAgICB9KTtcbiAgfVxufVxuXG5mdW5jdGlvbiBjcmVhdGVTZWFyY2hNb2RhbCgpIHtcbiAgY29uc3Qgc2VhcmNoTW9kYWxFbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2pzLXNlYXJjaC1tb2RhbCcpO1xuICBpZiAoc2VhcmNoTW9kYWxFbGVtZW50ICE9PSBudWxsKSB7XG4gICAgY29uc3Qgc2VhcmNoTW9kYWwgPSBuZXcgU2VhcmNoTW9kYWwoc2VhcmNoTW9kYWxFbGVtZW50KTtcbiAgICBzZWFyY2hNb2RhbC5pbml0KCk7XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgY3JlYXRlU2VhcmNoTW9kYWw7XG4iLCIvKiBlc2xpbnQtZGlzYWJsZSAqL1xuLyogZ2xvYmFsIGRvY3VtZW50LCB3aW5kb3cgKi9cbmltcG9ydCBVSWtpdCBmcm9tICd1aWtpdCc7XG5pbXBvcnQgU2Nyb2xsTWFnaWMgZnJvbSAnc2Nyb2xsbWFnaWMnO1xuaW1wb3J0IHsgZGVib3VuY2UsIHRocm90dGxlIH0gZnJvbSAnLi4vdXRpbHMnO1xuaW1wb3J0IHsgVHdlZW5MaXRlLCBRdWFkLCBUaW1lbGluZUxpdGUgfSBmcm9tICdnc2FwJztcbmltcG9ydCAnc2Nyb2xsbWFnaWMvc2Nyb2xsbWFnaWMvdW5jb21wcmVzc2VkL3BsdWdpbnMvYW5pbWF0aW9uLmdzYXAnO1xuXG5jbGFzcyBTY3JvbGxTY3JlZW4ge1xuICBjb25zdHJ1Y3RvcihzbGlkZSwgY29udHJvbGxlciwgaW5kZXgpIHtcbiAgICB0aGlzLnNsaWRlID0gc2xpZGU7XG4gICAgdGhpcy5jb250cm9sbGVyID0gY29udHJvbGxlcjtcbiAgICB0aGlzLmluZGV4ID0gaW5kZXg7XG4gIH1cblxuICBpbml0KCkge1xuICAgIC8vIGdldCB0aGUgZWxlbWVudHNcbiAgICB0aGlzLnRleHQgPSB0aGlzLnNsaWRlLnF1ZXJ5U2VsZWN0b3JBbGwoJy5qcy10ZXh0LXNjcm9sbGVyX190ZXh0Jyk7XG4gICAgdGhpcy52aWRlbyA9IHRoaXMuc2xpZGUucXVlcnlTZWxlY3RvcignLmpzLXRleHQtc2Nyb2xsZXItdmlkZW8tZnJhbWUnKTtcbiAgICB0aGlzLnBvc3RlciA9IHRoaXMuc2xpZGUucXVlcnlTZWxlY3RvcignLmpzLXRleHQtc2Nyb2xsZXItcG9zdGVyJyk7XG4gICAgdGhpcy53aXN0aWFTY3JpcHQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnanMtd2lzdGlhLXNjcmlwdCcpO1xuXG4gICAgLy8gYmluZCBldmVudHMgdG8gc2VsZlxuICAgIHRoaXMucGxheVZpZGVvID0gdGhpcy5wbGF5VmlkZW8uYmluZCh0aGlzKTtcbiAgICB0aGlzLnBhdXNlVmlkZW8gPSB0aGlzLnBhdXNlVmlkZW8uYmluZCh0aGlzKTtcbiAgICB0aGlzLnN0YXJ0VmlkZW8gPSB0aGlzLnN0YXJ0VmlkZW8uYmluZCh0aGlzKTtcblxuICAgIC8vIGlmIHRoZXJlIGlzIGEgdmlkZW8gc2V0dXAgeW91dHViZSB2aWRlb1xuICAgIGlmICh0aGlzLnZpZGVvKSB7XG4gICAgICB0aGlzLmNyZWF0ZVNjcmlwdFRhZygpO1xuICAgICAgY29uc3QgdmlkZW9JZCA9IHRoaXMudmlkZW8uZ2V0QXR0cmlidXRlKCdkYXRhLXdpc3RpYS1pZCcpO1xuICAgICAgd2luZG93Ll93cSA9IHdpbmRvdy5fd3EgfHwgW107XG4gICAgICB3aW5kb3cuX3dxLnB1c2goe1xuICAgICAgICBpZDogdmlkZW9JZCxcbiAgICAgICAgb25SZWFkeTogdGhpcy5zdGFydFZpZGVvLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gc2V0IGluaXRpYWwgcGxhY2Ugb2YgZmlyc3QgdGV4dCBlbGVtZW50XG4gICAgVHdlZW5MaXRlLnNldCh0aGlzLnRleHRbMF0sIHtcbiAgICAgIHk6ICctNTAlJyxcbiAgICAgIGF1dG9BbHBoYTogMSxcbiAgICB9KTtcblxuICAgIC8vIGFuaW1hdGlvbiBmb3IgdGV4dCBzY3JvbGxpbmdcbiAgICBjb25zdCB0bCA9IG5ldyBUaW1lbGluZUxpdGUoKTtcbiAgICBmb3IgKGxldCBqID0gMDsgaiA8IHRoaXMudGV4dC5sZW5ndGg7IGogKz0gMSkge1xuICAgICAgLy8gaWYgaXRzIHRoZSBmaXJzdCBvbmVcbiAgICAgIGlmIChqID09PSAwKSB7XG4gICAgICAgIHRsLnRvKHRoaXMudGV4dFtqXSwgMC41LCB7XG4gICAgICAgICAgeTogJy0yMDBweCcsXG4gICAgICAgICAgYXV0b0FscGhhOiAwLFxuICAgICAgICAgIGVhc2U6IFF1YWQuZWFzZU91dCxcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2UgaWYgKGogPT09IHRoaXMudGV4dC5sZW5ndGggLSAxKSB7XG4gICAgICAgIC8vIGlmIGl0cyB0aGUgbGFzdCBvbmVcbiAgICAgICAgdGwudG8oXG4gICAgICAgICAgdGhpcy50ZXh0W2pdLFxuICAgICAgICAgIDAuNSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICB5OiAnMjAwcHgnLFxuICAgICAgICAgICAgYXV0b0FscGhhOiAwLFxuICAgICAgICAgICAgZWFzZTogUXVhZC5lYXNlT3V0LFxuICAgICAgICAgIH0sXG4gICAgICAgICAgJy09MScsXG4gICAgICAgICk7XG4gICAgICAgIHRsLnRvKHRoaXMudGV4dFtqXSwgMC41LCB7XG4gICAgICAgICAgeTogJzBweCcsXG4gICAgICAgICAgYXV0b0FscGhhOiAxLFxuICAgICAgICAgIGVhc2U6IFF1YWQuZWFzZU91dCxcbiAgICAgICAgfSk7XG4gICAgICAgIC8vIGVsc2VcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRsLnRvKFxuICAgICAgICAgIHRoaXMudGV4dFtqXSxcbiAgICAgICAgICAwLjUsXG4gICAgICAgICAge1xuICAgICAgICAgICAgeTogJzIwMHB4JyxcbiAgICAgICAgICAgIGF1dG9BbHBoYTogMCxcbiAgICAgICAgICAgIGVhc2U6IFF1YWQuZWFzZU91dCxcbiAgICAgICAgICB9LFxuICAgICAgICAgICctPTEnLFxuICAgICAgICApO1xuICAgICAgICB0bC50byh0aGlzLnRleHRbal0sIDAuNSwge1xuICAgICAgICAgIHk6ICcwcHgnLFxuICAgICAgICAgIGF1dG9BbHBoYTogMSxcbiAgICAgICAgICBlYXNlOiBRdWFkLmVhc2VPdXQsXG4gICAgICAgIH0pO1xuICAgICAgICB0bC50byh0aGlzLnRleHRbal0sIDAuNSwge1xuICAgICAgICAgIHk6ICctMjAwcHgnLFxuICAgICAgICAgIGF1dG9BbHBoYTogMCxcbiAgICAgICAgICBlYXNlOiBRdWFkLmVhc2VPdXQsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIHNjcm9sbG1hZ2ljIHRleHQgc2Nyb2xsaW5nIGFuaW1hdGlvblxuICAgIGNvbnN0IGR1cmF0aW9uID0gYCR7dGhpcy50ZXh0Lmxlbmd0aH0wMCVgO1xuXG4gICAgdGhpcy5zY2VuZSA9IG5ldyBTY3JvbGxNYWdpYy5TY2VuZSh7XG4gICAgICB0cmlnZ2VyRWxlbWVudDogdGhpcy5zbGlkZSxcbiAgICAgIHRyaWdnZXJIb29rOiAnb25MZWF2ZScsXG4gICAgICBkdXJhdGlvbixcbiAgICB9KVxuICAgICAgLnNldFBpbih0aGlzLnNsaWRlKVxuICAgICAgLnNldFR3ZWVuKHRsKVxuICAgICAgLm9uKCdlbnRlcicsIHRoaXMucGxheVZpZGVvKVxuICAgICAgLm9uKCdsZWF2ZScsIHRoaXMucGF1c2VWaWRlbylcbiAgICAgIC5hZGRUbyh0aGlzLmNvbnRyb2xsZXIpO1xuICB9XG5cbiAgc3RhcnRWaWRlbyh2aWRlbykge1xuICAgIHRoaXMucGxheWVyID0gdmlkZW87XG4gICAgLy8gaWYgdmlkZW8gaW4gZmlyc3Qgc2xpZGUgcGxheVxuICAgIGlmICh0aGlzLmluZGV4ID09PSAwKSB7XG4gICAgICB2aWRlby5wbGF5KCk7XG4gICAgfVxuICAgIHZpZGVvLmJpbmQoJ3BsYXknLCAoKSA9PiB7XG4gICAgICAvLyBmYWRlIG91dCB0aGUgcG9zdGVyIGltYWdlIHdoZW4gdGhlIHZpZGVvIGlzIHBsYXlpbmdcbiAgICAgIFR3ZWVuTGl0ZS50byh0aGlzLnBvc3RlciwgMC4zLCB7XG4gICAgICAgIG9wYWNpdHk6IDAsXG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIHBsYXlWaWRlbygpIHtcbiAgICBpZiAodGhpcy5wbGF5ZXIpIHtcbiAgICAgIHRoaXMucGxheWVyLnBsYXkoKTtcbiAgICB9XG4gIH1cbiAgcGF1c2VWaWRlbygpIHtcbiAgICBpZiAodGhpcy5wbGF5ZXIpIHtcbiAgICAgIHRoaXMucGxheWVyLnBhdXNlKCk7XG4gICAgfVxuICB9XG4gIGNyZWF0ZVNjcmlwdFRhZygpIHtcbiAgICBpZiAodGhpcy53aXN0aWFTY3JpcHQgIT09IG51bGwpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCB0YWcgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzY3JpcHQnKTtcbiAgICB0YWcuaWQgPSAnanMtd2lzdGlhLXNjcmlwdCc7XG4gICAgdGFnLnNyYyA9ICcvL2Zhc3Qud2lzdGlhLm5ldC9hc3NldHMvZXh0ZXJuYWwvRS12MS5qcyc7XG4gICAgdGFnLmFzeW5jID0gdHJ1ZTtcbiAgICB0aGlzLndpc3RpYVNjcmlwdCA9IHRhZztcbiAgICBjb25zdCBmaXJzdFNjcmlwdFRhZyA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCdzY3JpcHQnKVswXTtcbiAgICBmaXJzdFNjcmlwdFRhZy5wYXJlbnROb2RlLmluc2VydEJlZm9yZSh0YWcsIGZpcnN0U2NyaXB0VGFnKTtcbiAgfVxufVxuXG5jbGFzcyBUZXh0U2Nyb2xsZXIge1xuICBjb25zdHJ1Y3Rvcih0ZXh0U2Nyb2xsZXIpIHtcbiAgICB0aGlzLnRleHRTY3JvbGxlciA9IHRleHRTY3JvbGxlcjtcbiAgfVxuICBpbml0KCkge1xuICAgIGNvbnN0IGNvbnRyb2xsZXIgPSBuZXcgU2Nyb2xsTWFnaWMuQ29udHJvbGxlcih7XG4gICAgICBnbG9iYWxTY2VuZU9wdGlvbnM6IHtcbiAgICAgICAgdHJpZ2dlckhvb2s6ICdvbkxlYXZlJyxcbiAgICAgIH0sXG4gICAgfSk7XG4gICAgY29uc3QgbnVtYmVyT2ZUZXh0cyA9IHRoaXMudGV4dFNjcm9sbGVyLnF1ZXJ5U2VsZWN0b3JBbGwoJy5qcy10ZXh0LXNjcm9sbGVyX190ZXh0JykubGVuZ3RoO1xuICAgIGNvbnN0IHNsaWRlcyA9IHRoaXMudGV4dFNjcm9sbGVyLnF1ZXJ5U2VsZWN0b3JBbGwoJy5qcy10ZXh0LXNjcm9sbGVyX19jb250YWluZXInKTtcbiAgICB0aGlzLnRleHRTY3JvbGxlci5zdHlsZS5oZWlnaHQgPSBgJHtudW1iZXJPZlRleHRzICsgc2xpZGVzLmxlbmd0aH0wMCVgO1xuXG4gICAgLy8gYWRkIHNjcm9sbCBzY2VuZSBmb3IgZWFjaCBzbGlkZVxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2xpZGVzLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICBjb25zdCBzY3JlZW4gPSBuZXcgU2Nyb2xsU2NyZWVuKHNsaWRlc1tpXSwgY29udHJvbGxlciwgaSk7XG4gICAgICBzY3JlZW4uaW5pdCgpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBjcmVhdGVUZXh0U2Nyb2xsZXJzKCkge1xuICBjb25zdCB0ZXh0U2Nyb2xsZXJDb250YWluZXIgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuanMtdGV4dC1zY3JvbGxlcicpO1xuICBpZiAodGV4dFNjcm9sbGVyQ29udGFpbmVyLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCB0ZXh0U2Nyb2xsZXJDb250YWluZXIubGVuZ3RoOyBpICs9IDEpIHtcbiAgICBjb25zdCB0ZXh0U2Nyb2xsZXIgPSBuZXcgVGV4dFNjcm9sbGVyKHRleHRTY3JvbGxlckNvbnRhaW5lcltpXSk7XG4gICAgdGV4dFNjcm9sbGVyLmluaXQoKTtcbiAgfVxuICByZXR1cm4gbnVsbDtcbn1cblxuZXhwb3J0IGRlZmF1bHQgY3JlYXRlVGV4dFNjcm9sbGVycztcblxuLyogZXNsaW50LWVuYWJsZSAqL1xuIiwiLyohIFVJa2l0IDMuMC4wLWJldGEuNDAgfCBodHRwOi8vd3d3LmdldHVpa2l0LmNvbSB8IChjKSAyMDE0IC0gMjAxNyBZT090aGVtZSB8IE1JVCBMaWNlbnNlICovXG5cbihmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJ1xuICAgID8gKG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeSgpKVxuICAgIDogdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kXG4gICAgICA/IGRlZmluZSgndWlraXRpY29ucycsIGZhY3RvcnkpXG4gICAgICA6IChnbG9iYWwuVUlraXRJY29ucyA9IGZhY3RvcnkoKSk7XG59KHRoaXMsICgpID0+IHtcbiAgY29uc3QgYWxidW0gPSAnPHN2ZyB3aWR0aD1cIjIwXCIgaGVpZ2h0PVwiMjBcIiB2aWV3Qm94PVwiMCAwIDIwIDIwXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPiA8cmVjdCB4PVwiNVwiIHk9XCIyXCIgd2lkdGg9XCIxMFwiIGhlaWdodD1cIjFcIiAvPiA8cmVjdCB4PVwiM1wiIHk9XCI0XCIgd2lkdGg9XCIxNFwiIGhlaWdodD1cIjFcIiAvPiA8cmVjdCBmaWxsPVwibm9uZVwiIHN0cm9rZT1cIiMwMDBcIiB4PVwiMS41XCIgeT1cIjYuNVwiIHdpZHRoPVwiMTdcIiBoZWlnaHQ9XCIxMVwiIC8+PC9zdmc+JztcbiAgY29uc3QgYmFuID0gJzxzdmcgd2lkdGg9XCIyMFwiIGhlaWdodD1cIjIwXCIgdmlld0JveD1cIjAgMCAyMCAyMFwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj4gPGNpcmNsZSBmaWxsPVwibm9uZVwiIHN0cm9rZT1cIiMwMDBcIiBzdHJva2Utd2lkdGg9XCIxLjFcIiBjeD1cIjEwXCIgY3k9XCIxMFwiIHI9XCI5XCIgLz4gPGxpbmUgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCIjMDAwXCIgc3Ryb2tlLXdpZHRoPVwiMS4xXCIgeDE9XCI0XCIgeTE9XCIzLjVcIiB4Mj1cIjE2XCIgeTI9XCIxNi41XCIgLz48L3N2Zz4nO1xuICBjb25zdCBiZWxsID0gJzxzdmcgd2lkdGg9XCIyMFwiIGhlaWdodD1cIjIwXCIgdmlld0JveD1cIjAgMCAyMCAyMFwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj4gPHBhdGggZmlsbD1cIm5vbmVcIiBzdHJva2U9XCIjMDAwXCIgc3Ryb2tlLXdpZHRoPVwiMS4xXCIgZD1cIk0xNywxNS41IEwzLDE1LjUgQzIuOTksMTQuNjEgMy43OSwxMy4zNCA0LjEsMTIuNTEgQzQuNTgsMTEuMyA0LjcyLDEwLjM1IDUuMTksNy4wMSBDNS41NCw0LjUzIDUuODksMy4yIDcuMjgsMi4xNiBDOC4xMywxLjU2IDkuMzcsMS41IDkuODEsMS41IEw5Ljk2LDEuNSBDOS45NiwxLjUgMTEuNjIsMS40MSAxMi42NywyLjE3IEMxNC4wOCwzLjIgMTQuNDIsNC41NCAxNC43Nyw3LjAyIEMxNS4yNiwxMC4zNSAxNS40LDExLjMxIDE1Ljg3LDEyLjUyIEMxNi4yLDEzLjM0IDE3LjAxLDE0LjYxIDE3LDE1LjUgTDE3LDE1LjUgWlwiIC8+IDxwYXRoIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiIzAwMFwiIGQ9XCJNMTIuMzksMTYgQzEyLjM5LDE3LjM3IDExLjM1LDE4LjQzIDkuOTEsMTguNDMgQzguNDgsMTguNDMgNy40MiwxNy4zNyA3LjQyLDE2XCIgLz48L3N2Zz4nO1xuICBjb25zdCBib2x0ID0gJzxzdmcgd2lkdGg9XCIyMFwiIGhlaWdodD1cIjIwXCIgdmlld0JveD1cIjAgMCAyMCAyMFwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj4gPHBhdGggZD1cIk00Ljc0LDIwIEw3LjczLDEyIEwzLDEyIEwxNS40MywxIEwxMi4zMiw5IEwxNy4wMiw5IEw0Ljc0LDIwIEw0Ljc0LDIwIEw0Ljc0LDIwIFogTTkuMTgsMTEgTDcuMSwxNi4zOSBMMTQuNDcsMTAgTDEwLjg2LDEwIEwxMi45OSw0LjY3IEw1LjYxLDExIEw5LjE4LDExIEw5LjE4LDExIEw5LjE4LDExIFpcIiAvPjwvc3ZnPic7XG4gIGNvbnN0IGJvb2ttYXJrID0gJzxzdmcgd2lkdGg9XCIyMFwiIGhlaWdodD1cIjIwXCIgdmlld0JveD1cIjAgMCAyMCAyMFwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj4gPHBvbHlnb24gZmlsbD1cIm5vbmVcIiBzdHJva2U9XCIjMDAwXCIgcG9pbnRzPVwiNS41IDEuNSAxNS41IDEuNSAxNS41IDE3LjUgMTAuNSAxMi41IDUuNSAxNy41XCIgLz48L3N2Zz4nO1xuICBjb25zdCBjYWxlbmRhciA9ICc8c3ZnIHdpZHRoPVwiMjBcIiBoZWlnaHQ9XCIyMFwiIHZpZXdCb3g9XCIwIDAgMjAgMjBcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+IDxwYXRoIGQ9XCJNIDIsMyAyLDE3IDE4LDE3IDE4LDMgMiwzIFogTSAxNywxNiAzLDE2IDMsOCAxNyw4IDE3LDE2IFogTSAxNyw3IDMsNyAzLDQgMTcsNCAxNyw3IFpcIiAvPiA8cmVjdCB3aWR0aD1cIjFcIiBoZWlnaHQ9XCIzXCIgeD1cIjZcIiB5PVwiMlwiIC8+IDxyZWN0IHdpZHRoPVwiMVwiIGhlaWdodD1cIjNcIiB4PVwiMTNcIiB5PVwiMlwiIC8+PC9zdmc+JztcbiAgY29uc3QgY2FtZXJhID0gJzxzdmcgd2lkdGg9XCIyMFwiIGhlaWdodD1cIjIwXCIgdmlld0JveD1cIjAgMCAyMCAyMFwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj4gPGNpcmNsZSBmaWxsPVwibm9uZVwiIHN0cm9rZT1cIiMwMDBcIiBzdHJva2Utd2lkdGg9XCIxLjFcIiBjeD1cIjEwXCIgY3k9XCIxMC44XCIgcj1cIjMuOFwiIC8+IDxwYXRoIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiIzAwMFwiIGQ9XCJNMSw0LjUgQzAuNyw0LjUgMC41LDQuNyAwLjUsNSBMMC41LDE3IEMwLjUsMTcuMyAwLjcsMTcuNSAxLDE3LjUgTDE5LDE3LjUgQzE5LjMsMTcuNSAxOS41LDE3LjMgMTkuNSwxNyBMMTkuNSw1IEMxOS41LDQuNyAxOS4zLDQuNSAxOSw0LjUgTDEzLjUsNC41IEwxMy41LDIuOSBDMTMuNSwyLjYgMTMuMywyLjUgMTMsMi41IEw3LDIuNSBDNi43LDIuNSA2LjUsMi42IDYuNSwyLjkgTDYuNSw0LjUgTDEsNC41IEwxLDQuNSBaXCIgLz48L3N2Zz4nO1xuICBjb25zdCBjYXJ0ID0gJzxzdmcgd2lkdGg9XCIyMFwiIGhlaWdodD1cIjIwXCIgdmlld0JveD1cIjAgMCAyMCAyMFwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj4gPGNpcmNsZSBjeD1cIjcuM1wiIGN5PVwiMTcuM1wiIHI9XCIxLjRcIiAvPiA8Y2lyY2xlIGN4PVwiMTMuM1wiIGN5PVwiMTcuM1wiIHI9XCIxLjRcIiAvPiA8cG9seWxpbmUgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCIjMDAwXCIgcG9pbnRzPVwiMCAyIDMuMiA0IDUuMyAxMi41IDE2IDEyLjUgMTggNi41IDggNi41XCIgLz48L3N2Zz4nO1xuICBjb25zdCBjaGVjayA9ICc8c3ZnIHdpZHRoPVwiMjBcIiBoZWlnaHQ9XCIyMFwiIHZpZXdCb3g9XCIwIDAgMjAgMjBcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+IDxwb2x5bGluZSBmaWxsPVwibm9uZVwiIHN0cm9rZT1cIiMwMDBcIiBzdHJva2Utd2lkdGg9XCIxLjFcIiBwb2ludHM9XCI0LDEwIDgsMTUgMTcsNFwiIC8+PC9zdmc+JztcbiAgY29uc3QgY2xvY2sgPSAnPHN2ZyB3aWR0aD1cIjIwXCIgaGVpZ2h0PVwiMjBcIiB2aWV3Qm94PVwiMCAwIDIwIDIwXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPiA8Y2lyY2xlIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiIzAwMFwiIHN0cm9rZS13aWR0aD1cIjEuMVwiIGN4PVwiMTBcIiBjeT1cIjEwXCIgcj1cIjlcIiAvPiA8cmVjdCB4PVwiOVwiIHk9XCI0XCIgd2lkdGg9XCIxXCIgaGVpZ2h0PVwiN1wiIC8+IDxwYXRoIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiIzAwMFwiIHN0cm9rZS13aWR0aD1cIjEuMVwiIGQ9XCJNMTMuMDE4LDE0LjE5NyBMOS40NDUsMTAuNjI1XCIgLz48L3N2Zz4nO1xuICBjb25zdCBjbG9zZSA9ICc8c3ZnIHdpZHRoPVwiMjBcIiBoZWlnaHQ9XCIyMFwiIHZpZXdCb3g9XCIwIDAgMjAgMjBcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+IDxwYXRoIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiIzAwMFwiIHN0cm9rZS13aWR0aD1cIjEuMDZcIiBkPVwiTTE2LDE2IEw0LDRcIiAvPiA8cGF0aCBmaWxsPVwibm9uZVwiIHN0cm9rZT1cIiMwMDBcIiBzdHJva2Utd2lkdGg9XCIxLjA2XCIgZD1cIk0xNiw0IEw0LDE2XCIgLz48L3N2Zz4nO1xuICBjb25zdCBjb2RlID0gJzxzdmcgd2lkdGg9XCIyMFwiIGhlaWdodD1cIjIwXCIgdmlld0JveD1cIjAgMCAyMCAyMFwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj4gPHBvbHlsaW5lIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiIzAwMFwiIHN0cm9rZS13aWR0aD1cIjEuMDFcIiBwb2ludHM9XCIxMyw0IDE5LDEwIDEzLDE2XCIgLz4gPHBvbHlsaW5lIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiIzAwMFwiIHN0cm9rZS13aWR0aD1cIjEuMDFcIiBwb2ludHM9XCI3LDQgMSwxMCA3LDE2XCIgLz48L3N2Zz4nO1xuICBjb25zdCBjb2cgPSAnPHN2ZyB3aWR0aD1cIjIwXCIgaGVpZ2h0PVwiMjBcIiB2aWV3Qm94PVwiMCAwIDIwIDIwXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPiA8Y2lyY2xlIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiIzAwMFwiIGN4PVwiOS45OTdcIiBjeT1cIjEwXCIgcj1cIjMuMzFcIiAvPiA8cGF0aCBmaWxsPVwibm9uZVwiIHN0cm9rZT1cIiMwMDBcIiBkPVwiTTE4LjQ4OCwxMi4yODUgTDE2LjIwNSwxNi4yMzcgQzE1LjMyMiwxNS40OTYgMTQuMTg1LDE1LjI4MSAxMy4zMDMsMTUuNzkxIEMxMi40MjgsMTYuMjg5IDEyLjA0NywxNy4zNzMgMTIuMjQ2LDE4LjUgTDcuNzM1LDE4LjUgQzcuOTM4LDE3LjM3NCA3LjU1MywxNi4yOTkgNi42ODQsMTUuNzkxIEM1LjgwMSwxNS4yNyA0LjY1NSwxNS40OTIgMy43NzMsMTYuMjM3IEwxLjUsMTIuMjg1IEMyLjU3MywxMS44NzEgMy4zMTcsMTAuOTk5IDMuMzE3LDkuOTkxIEMzLjMwNSw4Ljk4IDIuNTczLDguMTIxIDEuNSw3LjcxNiBMMy43NjUsMy43ODQgQzQuNjQ1LDQuNTE2IDUuNzk0LDQuNzM4IDYuNjg3LDQuMjMyIEM3LjU1NSwzLjcyMiA3LjkzOSwyLjYzNyA3LjczNSwxLjUgTDEyLjI2MywxLjUgQzEyLjA3MiwyLjYzNyAxMi40NDEsMy43MSAxMy4zMTQsNC4yMiBDMTQuMjA2LDQuNzMgMTUuMzQzLDQuNTE2IDE2LjIyNSwzLjc5NCBMMTguNDg3LDcuNzE0IEMxNy40MDQsOC4xMTcgMTYuNjYxLDguOTg4IDE2LjY3LDEwLjAwOSBDMTYuNjcyLDExLjAxOCAxNy40MTUsMTEuODggMTguNDg4LDEyLjI4NSBMMTguNDg4LDEyLjI4NSBaXCIgLz48L3N2Zz4nO1xuICBjb25zdCBjb21tZW50ID0gJzxzdmcgd2lkdGg9XCIyMFwiIGhlaWdodD1cIjIwXCIgdmlld0JveD1cIjAgMCAyMCAyMFwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj4gPHBhdGggZD1cIk02LDE4LjcxIEw2LDE0IEwxLDE0IEwxLDEgTDE5LDEgTDE5LDE0IEwxMC43MSwxNCBMNiwxOC43MSBMNiwxOC43MSBaIE0yLDEzIEw3LDEzIEw3LDE2LjI5IEwxMC4yOSwxMyBMMTgsMTMgTDE4LDIgTDIsMiBMMiwxMyBMMiwxMyBaXCIgLz48L3N2Zz4nO1xuICBjb25zdCBjb21tZW50aW5nID0gJzxzdmcgd2lkdGg9XCIyMFwiIGhlaWdodD1cIjIwXCIgdmlld0JveD1cIjAgMCAyMCAyMFwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj4gPHBvbHlnb24gZmlsbD1cIm5vbmVcIiBzdHJva2U9XCIjMDAwXCIgcG9pbnRzPVwiMS41LDEuNSAxOC41LDEuNSAxOC41LDEzLjUgMTAuNSwxMy41IDYuNSwxNy41IDYuNSwxMy41IDEuNSwxMy41XCIgLz4gPGNpcmNsZSBjeD1cIjEwXCIgY3k9XCI4XCIgcj1cIjFcIiAvPiA8Y2lyY2xlIGN4PVwiNlwiIGN5PVwiOFwiIHI9XCIxXCIgLz4gPGNpcmNsZSBjeD1cIjE0XCIgY3k9XCI4XCIgcj1cIjFcIiAvPjwvc3ZnPic7XG4gIGNvbnN0IGNvbW1lbnRzID0gJzxzdmcgd2lkdGg9XCIyMFwiIGhlaWdodD1cIjIwXCIgdmlld0JveD1cIjAgMCAyMCAyMFwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj4gPHBvbHlsaW5lIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiIzAwMFwiIHBvaW50cz1cIjIgMC41IDE5LjUgMC41IDE5LjUgMTNcIiAvPiA8cGF0aCBkPVwiTTUsMTkuNzEgTDUsMTUgTDAsMTUgTDAsMiBMMTgsMiBMMTgsMTUgTDkuNzEsMTUgTDUsMTkuNzEgTDUsMTkuNzEgTDUsMTkuNzEgWiBNMSwxNCBMNiwxNCBMNiwxNy4yOSBMOS4yOSwxNCBMMTcsMTQgTDE3LDMgTDEsMyBMMSwxNCBMMSwxNCBMMSwxNCBaXCIgLz48L3N2Zz4nO1xuICBjb25zdCBjb3B5ID0gJzxzdmcgd2lkdGg9XCIyMFwiIGhlaWdodD1cIjIwXCIgdmlld0JveD1cIjAgMCAyMCAyMFwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj4gPHJlY3QgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCIjMDAwXCIgeD1cIjMuNVwiIHk9XCIyLjVcIiB3aWR0aD1cIjEyXCIgaGVpZ2h0PVwiMTZcIiAvPiA8cG9seWxpbmUgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCIjMDAwXCIgcG9pbnRzPVwiNSAwLjUgMTcuNSAwLjUgMTcuNSAxN1wiIC8+PC9zdmc+JztcbiAgY29uc3QgZGF0YWJhc2UgPSAnPHN2ZyB3aWR0aD1cIjIwXCIgaGVpZ2h0PVwiMjBcIiB2aWV3Qm94PVwiMCAwIDIwIDIwXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPiA8ZWxsaXBzZSBmaWxsPVwibm9uZVwiIHN0cm9rZT1cIiMwMDBcIiBjeD1cIjEwXCIgY3k9XCI0LjY0XCIgcng9XCI3LjVcIiByeT1cIjMuMTRcIiAvPiA8cGF0aCBmaWxsPVwibm9uZVwiIHN0cm9rZT1cIiMwMDBcIiBkPVwiTTE3LjUsOC4xMSBDMTcuNSw5Ljg1IDE0LjE0LDExLjI1IDEwLDExLjI1IEM1Ljg2LDExLjI1IDIuNSw5Ljg0IDIuNSw4LjExXCIgLz4gPHBhdGggZmlsbD1cIm5vbmVcIiBzdHJva2U9XCIjMDAwXCIgZD1cIk0xNy41LDExLjI1IEMxNy41LDEyLjk5IDE0LjE0LDE0LjM5IDEwLDE0LjM5IEM1Ljg2LDE0LjM5IDIuNSwxMi45OCAyLjUsMTEuMjVcIiAvPiA8cGF0aCBmaWxsPVwibm9uZVwiIHN0cm9rZT1cIiMwMDBcIiBkPVwiTTE3LjQ5LDQuNjQgTDE3LjUsMTQuMzYgQzE3LjUsMTYuMSAxNC4xNCwxNy41IDEwLDE3LjUgQzUuODYsMTcuNSAyLjUsMTYuMDkgMi41LDE0LjM2IEwyLjUsNC42NFwiIC8+PC9zdmc+JztcbiAgY29uc3QgZGVza3RvcCA9ICc8c3ZnIHdpZHRoPVwiMjBcIiBoZWlnaHQ9XCIyMFwiIHZpZXdCb3g9XCIwIDAgMjAgMjBcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+IDxyZWN0IHg9XCI4XCIgeT1cIjE1XCIgd2lkdGg9XCIxXCIgaGVpZ2h0PVwiMlwiIC8+IDxyZWN0IHg9XCIxMVwiIHk9XCIxNVwiIHdpZHRoPVwiMVwiIGhlaWdodD1cIjJcIiAvPiA8cmVjdCB4PVwiNVwiIHk9XCIxNlwiIHdpZHRoPVwiMTBcIiBoZWlnaHQ9XCIxXCIgLz4gPHJlY3QgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCIjMDAwXCIgeD1cIjEuNVwiIHk9XCIzLjVcIiB3aWR0aD1cIjE3XCIgaGVpZ2h0PVwiMTFcIiAvPjwvc3ZnPic7XG4gIGNvbnN0IGRvd25sb2FkID0gJzxzdmcgd2lkdGg9XCIyMFwiIGhlaWdodD1cIjIwXCIgdmlld0JveD1cIjAgMCAyMCAyMFwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj4gPHBvbHlsaW5lIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiIzAwMFwiIHBvaW50cz1cIjE0LDEwIDkuNSwxNC41IDUsMTBcIiAvPiA8cmVjdCB4PVwiM1wiIHk9XCIxN1wiIHdpZHRoPVwiMTNcIiBoZWlnaHQ9XCIxXCIgLz4gPGxpbmUgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCIjMDAwXCIgeDE9XCI5LjVcIiB5MT1cIjEzLjkxXCIgeDI9XCI5LjVcIiB5Mj1cIjNcIiAvPjwvc3ZnPic7XG4gIGNvbnN0IGV4cGFuZCA9ICc8c3ZnIHdpZHRoPVwiMjBcIiBoZWlnaHQ9XCIyMFwiIHZpZXdCb3g9XCIwIDAgMjAgMjBcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+IDxwb2x5Z29uIHBvaW50cz1cIjEzIDIgMTggMiAxOCA3IDE3IDcgMTcgMyAxMyAzXCIgLz4gPHBvbHlnb24gcG9pbnRzPVwiMiAxMyAzIDEzIDMgMTcgNyAxNyA3IDE4IDIgMThcIiAvPiA8cGF0aCBmaWxsPVwibm9uZVwiIHN0cm9rZT1cIiMwMDBcIiBzdHJva2Utd2lkdGg9XCIxLjFcIiBkPVwiTTExLDkgTDE3LDNcIiAvPiA8cGF0aCBmaWxsPVwibm9uZVwiIHN0cm9rZT1cIiMwMDBcIiBzdHJva2Utd2lkdGg9XCIxLjFcIiBkPVwiTTMsMTcgTDksMTFcIiAvPjwvc3ZnPic7XG4gIGNvbnN0IGZhY2Vib29rID0gJzxzdmcgd2lkdGg9XCIyMFwiIGhlaWdodD1cIjIwXCIgdmlld0JveD1cIjAgMCAyMCAyMFwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj4gPHBhdGggZD1cIk0xMSwxMGgyLjZsMC40LTNIMTFWNS4zYzAtMC45LDAuMi0xLjUsMS41LTEuNUgxNFYxLjFjLTAuMywwLTEtMC4xLTIuMS0wLjFDOS42LDEsOCwyLjQsOCw1djJINS41djNIOHY4aDNWMTB6XCIgLz48L3N2Zz4nO1xuICBjb25zdCBmaWxlID0gJzxzdmcgd2lkdGg9XCIyMFwiIGhlaWdodD1cIjIwXCIgdmlld0JveD1cIjAgMCAyMCAyMFwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj4gPHJlY3QgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCIjMDAwXCIgeD1cIjMuNVwiIHk9XCIxLjVcIiB3aWR0aD1cIjEzXCIgaGVpZ2h0PVwiMTdcIiAvPjwvc3ZnPic7XG4gIGNvbnN0IGZvbGRlciA9ICc8c3ZnIHdpZHRoPVwiMjBcIiBoZWlnaHQ9XCIyMFwiIHZpZXdCb3g9XCIwIDAgMjAgMjBcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+IDxwb2x5Z29uIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiIzAwMFwiIHBvaW50cz1cIjkuNSA1LjUgOC41IDMuNSAxLjUgMy41IDEuNSAxNi41IDE4LjUgMTYuNSAxOC41IDUuNVwiIC8+PC9zdmc+JztcbiAgY29uc3QgZm9yd2FyZCA9ICc8c3ZnIHdpZHRoPVwiMjBcIiBoZWlnaHQ9XCIyMFwiIHZpZXdCb3g9XCIwIDAgMjAgMjBcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+IDxwYXRoIGQ9XCJNMi40NywxMy4xMSBDNC4wMiwxMC4wMiA2LjI3LDcuODUgOS4wNCw2LjYxIEM5LjQ4LDYuNDEgMTAuMjcsNi4xMyAxMSw1LjkxIEwxMSwyIEwxOC44OSw5IEwxMSwxNiBMMTEsMTIuMTMgQzkuMjUsMTIuNDcgNy41OCwxMy4xOSA2LjAyLDE0LjI1IEMzLjAzLDE2LjI4IDEuNjMsMTguNTQgMS42MywxOC41NCBDMS42MywxOC41NCAxLjM4LDE1LjI4IDIuNDcsMTMuMTEgTDIuNDcsMTMuMTEgWiBNNS4zLDEzLjUzIEM2LjkyLDEyLjQgOS4wNCwxMS40IDEyLDEwLjkyIEwxMiwxMy42MyBMMTcuMzYsOSBMMTIsNC4yNSBMMTIsNi44IEMxMS43MSw2Ljg2IDEwLjg2LDcuMDIgOS42Nyw3LjQ5IEM2Ljc5LDguNjUgNC41OCwxMC45NiAzLjQ5LDEzLjA4IEMzLjE4LDEzLjcgMi42OCwxNC44NyAyLjQ5LDE2IEMzLjI4LDE1LjA1IDQuNCwxNC4xNSA1LjMsMTMuNTMgTDUuMywxMy41MyBaXCIgLz48L3N2Zz4nO1xuICBjb25zdCBmb3Vyc3F1YXJlID0gJzxzdmcgd2lkdGg9XCIyMFwiIGhlaWdodD1cIjIwXCIgdmlld0JveD1cIjAgMCAyMCAyMFwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj4gPHBhdGggZD1cIk0xNS4yMywyIEMxNS45NiwyIDE2LjQsMi40MSAxNi41LDIuODYgQzE2LjU3LDMuMTUgMTYuNTYsMy40NCAxNi41MSwzLjczIEMxNi40Niw0LjA0IDE0Ljg2LDExLjcyIDE0Ljc1LDEyLjAzIEMxNC41NiwxMi41NiAxNC4xNiwxMi44MiAxMy42MSwxMi44MyBDMTMuMDMsMTIuODQgMTEuMDksMTIuNTEgMTAuNjksMTMgQzEwLjM4LDEzLjM4IDcuNzksMTYuMzkgNi44MSwxNy41MyBDNi42MSwxNy43NiA2LjQsMTcuOTYgNi4wOCwxNy45OSBDNS42OCwxOC4wNCA1LjI5LDE3Ljg3IDUuMTcsMTcuNDUgQzUuMTIsMTcuMjggNS4xLDE3LjA5IDUuMSwxNi45MSBDNS4xLDEyLjQgNC44Niw3LjgxIDUuMTEsMy4zMSBDNS4xNywyLjUgNS44MSwyLjEyIDYuNTMsMiBMMTUuMjMsMiBMMTUuMjMsMiBaIE05Ljc2LDExLjQyIEM5Ljk0LDExLjE5IDEwLjE3LDExLjEgMTAuNDUsMTEuMSBMMTIuODYsMTEuMSBDMTMuMTIsMTEuMSAxMy4zMSwxMC45NCAxMy4zNiwxMC42OSBDMTMuMzcsMTAuNjQgMTMuNjIsOS40MSAxMy43NCw4LjgzIEMxMy44MSw4LjUyIDEzLjUzLDguMjggMTMuMjcsOC4yOCBDMTIuMzUsOC4yOSAxMS40Miw4LjI4IDEwLjUsOC4yOCBDOS44NCw4LjI4IDkuODMsNy42OSA5LjgyLDcuMjEgQzkuOCw2Ljg1IDEwLjEzLDYuNTUgMTAuNSw2LjU1IEMxMS41OSw2LjU2IDEyLjY3LDYuNTUgMTMuNzYsNi41NSBDMTQuMDMsNi41NSAxNC4yMyw2LjQgMTQuMjgsNi4xNCBDMTQuMzQsNS44NyAxNC42Nyw0LjI5IDE0LjY3LDQuMjkgQzE0LjY3LDQuMjkgMTQuODIsMy43NCAxNC4xOSwzLjc0IEw3LjM0LDMuNzQgQzcsMy43NSA2Ljg0LDQuMDIgNi44NCw0LjMzIEM2Ljg0LDcuNTggNi44NSwxNC45NSA2Ljg1LDE0Ljk5IEM2Ljg3LDE1IDguODksMTIuNTEgOS43NiwxMS40MiBMOS43NiwxMS40MiBaXCIgLz48L3N2Zz4nO1xuICBjb25zdCBmdXR1cmUgPSAnPHN2ZyB3aWR0aD1cIjIwXCIgaGVpZ2h0PVwiMjBcIiB2aWV3Qm94PVwiMCAwIDIwIDIwXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPiA8cG9seWxpbmUgcG9pbnRzPVwiMTkgMiAxOCAyIDE4IDYgMTQgNiAxNCA3IDE5IDcgMTkgMlwiIC8+IDxwYXRoIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiIzAwMFwiIHN0cm9rZS13aWR0aD1cIjEuMVwiIGQ9XCJNMTgsNi41NDggQzE2LjcwOSwzLjI5IDEzLjM1NCwxIDkuNiwxIEM0LjYsMSAwLjYsNSAwLjYsMTAgQzAuNiwxNSA0LjYsMTkgOS42LDE5IEMxNC42LDE5IDE4LjYsMTUgMTguNiwxMFwiIC8+IDxyZWN0IHg9XCI5XCIgeT1cIjRcIiB3aWR0aD1cIjFcIiBoZWlnaHQ9XCI3XCIgLz4gPHBhdGggZD1cIk0xMy4wMTgsMTQuMTk3IEw5LjQ0NSwxMC42MjVcIiBmaWxsPVwibm9uZVwiIHN0cm9rZT1cIiMwMDBcIiBzdHJva2Utd2lkdGg9XCIxLjFcIiAvPjwvc3ZnPic7XG4gIGNvbnN0IGdvb2dsZSA9ICc8c3ZnIHdpZHRoPVwiMjBcIiBoZWlnaHQ9XCIyMFwiIHZpZXdCb3g9XCIwIDAgMjAgMjBcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+IDxwYXRoIGQ9XCJNMTcuODYsOS4wOSBDMTguNDYsMTIuMTIgMTcuMTQsMTYuMDUgMTMuODEsMTcuNTYgQzkuNDUsMTkuNTMgNC4xMywxNy42OCAyLjQ3LDEyLjg3IEMwLjY4LDcuNjggNC4yMiwyLjQyIDkuNSwyLjAzIEMxMS41NywxLjg4IDEzLjQyLDIuMzcgMTUuMDUsMy42NSBDMTUuMjIsMy43OCAxNS4zNywzLjkzIDE1LjYxLDQuMTQgQzE0LjksNC44MSAxNC4yMyw1LjQ1IDEzLjUsNi4xNCBDMTIuMjcsNS4wOCAxMC44NCw0LjcyIDkuMjgsNC45OCBDOC4xMiw1LjE3IDcuMTYsNS43NiA2LjM3LDYuNjMgQzQuODgsOC4yNyA0LjYyLDEwLjg2IDUuNzYsMTIuODIgQzYuOTUsMTQuODcgOS4xNywxNS44IDExLjU3LDE1LjI1IEMxMy4yNywxNC44NyAxNC43NiwxMy4zMyAxNC44OSwxMS43NSBMMTAuNTEsMTEuNzUgTDEwLjUxLDkuMDkgTDE3Ljg2LDkuMDkgTDE3Ljg2LDkuMDkgWlwiIC8+PC9zdmc+JztcbiAgY29uc3QgZ3JpZCA9ICc8c3ZnIHdpZHRoPVwiMjBcIiBoZWlnaHQ9XCIyMFwiIHZpZXdCb3g9XCIwIDAgMjAgMjBcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+IDxyZWN0IHg9XCIyXCIgeT1cIjJcIiB3aWR0aD1cIjNcIiBoZWlnaHQ9XCIzXCIgLz4gPHJlY3QgeD1cIjhcIiB5PVwiMlwiIHdpZHRoPVwiM1wiIGhlaWdodD1cIjNcIiAvPiA8cmVjdCB4PVwiMTRcIiB5PVwiMlwiIHdpZHRoPVwiM1wiIGhlaWdodD1cIjNcIiAvPiA8cmVjdCB4PVwiMlwiIHk9XCI4XCIgd2lkdGg9XCIzXCIgaGVpZ2h0PVwiM1wiIC8+IDxyZWN0IHg9XCI4XCIgeT1cIjhcIiB3aWR0aD1cIjNcIiBoZWlnaHQ9XCIzXCIgLz4gPHJlY3QgeD1cIjE0XCIgeT1cIjhcIiB3aWR0aD1cIjNcIiBoZWlnaHQ9XCIzXCIgLz4gPHJlY3QgeD1cIjJcIiB5PVwiMTRcIiB3aWR0aD1cIjNcIiBoZWlnaHQ9XCIzXCIgLz4gPHJlY3QgeD1cIjhcIiB5PVwiMTRcIiB3aWR0aD1cIjNcIiBoZWlnaHQ9XCIzXCIgLz4gPHJlY3QgeD1cIjE0XCIgeT1cIjE0XCIgd2lkdGg9XCIzXCIgaGVpZ2h0PVwiM1wiIC8+PC9zdmc+JztcbiAgY29uc3QgaGFwcHkgPSAnPHN2ZyB3aWR0aD1cIjIwXCIgaGVpZ2h0PVwiMjBcIiB2aWV3Qm94PVwiMCAwIDIwIDIwXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPiA8Y2lyY2xlIGN4PVwiMTNcIiBjeT1cIjdcIiByPVwiMVwiIC8+IDxjaXJjbGUgY3g9XCI3XCIgY3k9XCI3XCIgcj1cIjFcIiAvPiA8Y2lyY2xlIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiIzAwMFwiIGN4PVwiMTBcIiBjeT1cIjEwXCIgcj1cIjguNVwiIC8+IDxwYXRoIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiIzAwMFwiIGQ9XCJNMTQuNiwxMS40IEMxMy45LDEzLjMgMTIuMSwxNC41IDEwLDE0LjUgQzcuOSwxNC41IDYuMSwxMy4zIDUuNCwxMS40XCIgLz48L3N2Zz4nO1xuICBjb25zdCBoYXNodGFnID0gJzxzdmcgd2lkdGg9XCIyMFwiIGhlaWdodD1cIjIwXCIgdmlld0JveD1cIjAgMCAyMCAyMFwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj4gPHBhdGggZD1cIk0xNS40MzEsOCBMMTUuNjYxLDcgTDEyLjkxMSw3IEwxMy44MzEsMyBMMTIuOTAxLDMgTDExLjk4LDcgTDkuMjksNyBMMTAuMjEsMyBMOS4yODEsMyBMOC4zNjEsNyBMNS4yMyw3IEw1LDggTDguMTMsOCBMNy4yMSwxMiBMNC4yMywxMiBMNCwxMyBMNi45OCwxMyBMNi4wNjEsMTcgTDYuOTkxLDE3IEw3LjkxMSwxMyBMMTAuNjAxLDEzIEw5LjY4MSwxNyBMMTAuNjExLDE3IEwxMS41MzEsMTMgTDE0LjQzMSwxMyBMMTQuNjYxLDEyIEwxMS43NiwxMiBMMTIuNjgxLDggTDE1LjQzMSw4IFogTTEwLjgzMSwxMiBMOC4xNDEsMTIgTDkuMDYxLDggTDExLjc1LDggTDEwLjgzMSwxMiBaXCIgLz48L3N2Zz4nO1xuICBjb25zdCBoZWFydCA9ICc8c3ZnIHdpZHRoPVwiMjBcIiBoZWlnaHQ9XCIyMFwiIHZpZXdCb3g9XCIwIDAgMjAgMjBcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+IDxwYXRoIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiIzAwMFwiIHN0cm9rZS13aWR0aD1cIjEuMDNcIiBkPVwiTTEwLDQgQzEwLDQgOC4xLDIgNS43NCwyIEMzLjM4LDIgMSwzLjU1IDEsNi43MyBDMSw4Ljg0IDIuNjcsMTAuNDQgMi42NywxMC40NCBMMTAsMTggTDE3LjMzLDEwLjQ0IEMxNy4zMywxMC40NCAxOSw4Ljg0IDE5LDYuNzMgQzE5LDMuNTUgMTYuNjIsMiAxNC4yNiwyIEMxMS45LDIgMTAsNCAxMCw0IEwxMCw0IFpcIiAvPjwvc3ZnPic7XG4gIGNvbnN0IGhpc3RvcnkgPSAnPHN2ZyB3aWR0aD1cIjIwXCIgaGVpZ2h0PVwiMjBcIiB2aWV3Qm94PVwiMCAwIDIwIDIwXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPiA8cG9seWxpbmUgZmlsbD1cIiMwMDBcIiBwb2ludHM9XCIxIDIgMiAyIDIgNiA2IDYgNiA3IDEgNyAxIDJcIiAvPiA8cGF0aCBmaWxsPVwibm9uZVwiIHN0cm9rZT1cIiMwMDBcIiBzdHJva2Utd2lkdGg9XCIxLjFcIiBkPVwiTTIuMSw2LjU0OCBDMy4zOTEsMy4yOSA2Ljc0NiwxIDEwLjUsMSBDMTUuNSwxIDE5LjUsNSAxOS41LDEwIEMxOS41LDE1IDE1LjUsMTkgMTAuNSwxOSBDNS41LDE5IDEuNSwxNSAxLjUsMTBcIiAvPiA8cmVjdCB4PVwiOVwiIHk9XCI0XCIgd2lkdGg9XCIxXCIgaGVpZ2h0PVwiN1wiIC8+IDxwYXRoIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiIzAwMFwiIHN0cm9rZS13aWR0aD1cIjEuMVwiIGQ9XCJNMTMuMDE4LDE0LjE5NyBMOS40NDUsMTAuNjI1XCIgaWQ9XCJTaGFwZVwiIC8+PC9zdmc+JztcbiAgY29uc3QgaG9tZSA9ICc8c3ZnIHdpZHRoPVwiMjBcIiBoZWlnaHQ9XCIyMFwiIHZpZXdCb3g9XCIwIDAgMjAgMjBcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+IDxwb2x5Z29uIHBvaW50cz1cIjE4LjY1IDExLjM1IDEwIDIuNzEgMS4zNSAxMS4zNSAwLjY1IDEwLjY1IDEwIDEuMjkgMTkuMzUgMTAuNjVcIiAvPiA8cG9seWdvbiBwb2ludHM9XCIxNSA0IDE4IDQgMTggNyAxNyA3IDE3IDUgMTUgNVwiIC8+IDxwb2x5Z29uIHBvaW50cz1cIjMgMTEgNCAxMSA0IDE4IDcgMTggNyAxMiAxMiAxMiAxMiAxOCAxNiAxOCAxNiAxMSAxNyAxMSAxNyAxOSAxMSAxOSAxMSAxMyA4IDEzIDggMTkgMyAxOVwiIC8+PC9zdmc+JztcbiAgY29uc3QgaW1hZ2UgPSAnPHN2ZyB3aWR0aD1cIjIwXCIgaGVpZ2h0PVwiMjBcIiB2aWV3Qm94PVwiMCAwIDIwIDIwXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPiA8Y2lyY2xlIGN4PVwiMTYuMVwiIGN5PVwiNi4xXCIgcj1cIjEuMVwiIC8+IDxyZWN0IGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiIzAwMFwiIHg9XCIwLjVcIiB5PVwiMi41XCIgd2lkdGg9XCIxOVwiIGhlaWdodD1cIjE1XCIgLz4gPHBvbHlsaW5lIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiIzAwMFwiIHN0cm9rZS13aWR0aD1cIjEuMDFcIiBwb2ludHM9XCI0LDEzIDgsOSAxMywxNFwiIC8+IDxwb2x5bGluZSBmaWxsPVwibm9uZVwiIHN0cm9rZT1cIiMwMDBcIiBzdHJva2Utd2lkdGg9XCIxLjAxXCIgcG9pbnRzPVwiMTEsMTIgMTIuNSwxMC41IDE2LDE0XCIgLz48L3N2Zz4nO1xuICBjb25zdCBpbmZvID0gJzxzdmcgd2lkdGg9XCIyMFwiIGhlaWdodD1cIjIwXCIgdmlld0JveD1cIjAgMCAyMCAyMFwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj4gPHBhdGggZD1cIk0xMi4xMywxMS41OSBDMTEuOTcsMTIuODQgMTAuMzUsMTQuMTIgOS4xLDE0LjE2IEM2LjE3LDE0LjIgOS44OSw5LjQ2IDguNzQsOC4zNyBDOS4zLDguMTYgMTAuNjIsNy44MyAxMC42Miw4LjgxIEMxMC42Miw5LjYzIDEwLjEyLDEwLjU1IDkuODgsMTEuMzIgQzguNjYsMTUuMTYgMTIuMTMsMTEuMTUgMTIuMTQsMTEuMTggQzEyLjE2LDExLjIxIDEyLjE2LDExLjM1IDEyLjEzLDExLjU5IEMxMi4wOCwxMS45NSAxMi4xNiwxMS4zNSAxMi4xMywxMS41OSBMMTIuMTMsMTEuNTkgWiBNMTEuNTYsNS42NyBDMTEuNTYsNi42NyA5LjM2LDcuMTUgOS4zNiw2LjAzIEM5LjM2LDUgMTEuNTYsNC41NCAxMS41Niw1LjY3IEwxMS41Niw1LjY3IFpcIiAvPiA8Y2lyY2xlIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiIzAwMFwiIHN0cm9rZS13aWR0aD1cIjEuMVwiIGN4PVwiMTBcIiBjeT1cIjEwXCIgcj1cIjlcIiAvPjwvc3ZnPic7XG4gIGNvbnN0IGluc3RhZ3JhbSA9ICc8c3ZnIHdpZHRoPVwiMjBcIiBoZWlnaHQ9XCIyMFwiIHZpZXdCb3g9XCIwIDAgMjAgMjBcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+IDxwYXRoIGQ9XCJNMTMuNTUsMUg2LjQ2QzMuNDUsMSwxLDMuNDQsMSw2LjQ0djcuMTJjMCwzLDIuNDUsNS40NCw1LjQ2LDUuNDRoNy4wOGMzLjAyLDAsNS40Ni0yLjQ0LDUuNDYtNS40NFY2LjQ0IEMxOS4wMSwzLjQ0LDE2LjU2LDEsMTMuNTUsMXogTTE3LjUsMTRjMCwxLjkzLTEuNTcsMy41LTMuNSwzLjVINmMtMS45MywwLTMuNS0xLjU3LTMuNS0zLjVWNmMwLTEuOTMsMS41Ny0zLjUsMy41LTMuNWg4IGMxLjkzLDAsMy41LDEuNTcsMy41LDMuNVYxNHpcIiAvPiA8Y2lyY2xlIGN4PVwiMTQuODdcIiBjeT1cIjUuMjZcIiByPVwiMS4wOVwiIC8+IDxwYXRoIGQ9XCJNMTAuMDMsNS40NWMtMi41NSwwLTQuNjMsMi4wNi00LjYzLDQuNmMwLDIuNTUsMi4wNyw0LjYxLDQuNjMsNC42MWMyLjU2LDAsNC42My0yLjA2MSw0LjYzLTQuNjEgQzE0LjY1LDcuNTEsMTIuNTgsNS40NSwxMC4wMyw1LjQ1TDEwLjAzLDUuNDVMMTAuMDMsNS40NXogTTEwLjA4LDEzYy0xLjY2LDAtMy0xLjM0LTMtMi45OWMwLTEuNjUsMS4zNC0yLjk5LDMtMi45OXMzLDEuMzQsMywyLjk5IEMxMy4wOCwxMS42NiwxMS43NCwxMywxMC4wOCwxM0wxMC4wOCwxM0wxMC4wOCwxM3pcIiAvPjwvc3ZnPic7XG4gIGNvbnN0IGxhcHRvcCA9ICc8c3ZnIHdpZHRoPVwiMjBcIiBoZWlnaHQ9XCIyMFwiIHZpZXdCb3g9XCIwIDAgMjAgMjBcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+IDxyZWN0IHk9XCIxNlwiIHdpZHRoPVwiMjBcIiBoZWlnaHQ9XCIxXCIgLz4gPHJlY3QgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCIjMDAwXCIgeD1cIjIuNVwiIHk9XCI0LjVcIiB3aWR0aD1cIjE1XCIgaGVpZ2h0PVwiMTBcIiAvPjwvc3ZnPic7XG4gIGNvbnN0IGxpZmVzYXZlciA9ICc8c3ZnIHdpZHRoPVwiMjBcIiBoZWlnaHQ9XCIyMFwiIHZpZXdCb3g9XCIwIDAgMjAgMjBcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+IDxwYXRoIGQ9XCJNMTAsMC41IEM0Ljc2LDAuNSAwLjUsNC43NiAwLjUsMTAgQzAuNSwxNS4yNCA0Ljc2LDE5LjUgMTAsMTkuNSBDMTUuMjQsMTkuNSAxOS41LDE1LjI0IDE5LjUsMTAgQzE5LjUsNC43NiAxNS4yNCwwLjUgMTAsMC41IEwxMCwwLjUgWiBNMTAsMS41IEMxMS40OSwxLjUgMTIuODksMS44OCAxNC4xMSwyLjU2IEwxMS44NSw0LjgyIEMxMS4yNyw0LjYxIDEwLjY1LDQuNSAxMCw0LjUgQzkuMjEsNC41IDguNDcsNC42NyA3Ljc5LDQuOTYgTDUuNTgsMi43NSBDNi44NywxLjk1IDguMzgsMS41IDEwLDEuNSBMMTAsMS41IFogTTQuOTYsNy44IEM0LjY3LDguNDggNC41LDkuMjEgNC41LDEwIEM0LjUsMTAuNjUgNC42MSwxMS4yNyA0LjgzLDExLjg1IEwyLjU2LDE0LjExIEMxLjg4LDEyLjg5IDEuNSwxMS40OSAxLjUsMTAgQzEuNSw4LjM4IDEuOTUsNi44NyAyLjc1LDUuNTggTDQuOTYsNy43OSBMNC45Niw3LjggTDQuOTYsNy44IFogTTEwLDE4LjUgQzguMjUsMTguNSA2LjYyLDE3Ljk3IDUuMjcsMTcuMDYgTDcuNDYsMTQuODcgQzguMjIsMTUuMjcgOS4wOCwxNS41IDEwLDE1LjUgQzEwLjc5LDE1LjUgMTEuNTMsMTUuMzMgMTIuMjEsMTUuMDQgTDE0LjQyLDE3LjI1IEMxMy4xMywxOC4wNSAxMS42MiwxOC41IDEwLDE4LjUgTDEwLDE4LjUgWiBNMTAsMTQuNSBDNy41MiwxNC41IDUuNSwxMi40OCA1LjUsMTAgQzUuNSw3LjUyIDcuNTIsNS41IDEwLDUuNSBDMTIuNDgsNS41IDE0LjUsNy41MiAxNC41LDEwIEMxNC41LDEyLjQ4IDEyLjQ4LDE0LjUgMTAsMTQuNSBMMTAsMTQuNSBaIE0xNS4wNCwxMi4yMSBDMTUuMzMsMTEuNTMgMTUuNSwxMC43OSAxNS41LDEwIEMxNS41LDkuMDggMTUuMjcsOC4yMiAxNC44Nyw3LjQ2IEwxNy4wNiw1LjI3IEMxNy45Nyw2LjYyIDE4LjUsOC4yNSAxOC41LDEwIEMxOC41LDExLjYyIDE4LjA1LDEzLjEzIDE3LjI1LDE0LjQyIEwxNS4wNCwxMi4yMSBMMTUuMDQsMTIuMjEgWlwiIC8+PC9zdmc+JztcbiAgY29uc3QgbGluayA9ICc8c3ZnIHdpZHRoPVwiMjBcIiBoZWlnaHQ9XCIyMFwiIHZpZXdCb3g9XCIwIDAgMjAgMjBcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+IDxwYXRoIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiIzAwMFwiIHN0cm9rZS13aWR0aD1cIjEuMVwiIGQ9XCJNMTAuNjI1LDEyLjM3NSBMNy41MjUsMTUuNDc1IEM2LjgyNSwxNi4xNzUgNS45MjUsMTYuMTc1IDUuMjI1LDE1LjQ3NSBMNC41MjUsMTQuNzc1IEMzLjgyNSwxNC4wNzQgMy44MjUsMTMuMTc1IDQuNTI1LDEyLjQ3NSBMNy42MjUsOS4zNzVcIiAvPiA8cGF0aCBmaWxsPVwibm9uZVwiIHN0cm9rZT1cIiMwMDBcIiBzdHJva2Utd2lkdGg9XCIxLjFcIiBkPVwiTTkuMzI1LDcuMzc1IEwxMi40MjUsNC4yNzUgQzEzLjEyNSwzLjU3NSAxNC4wMjUsMy41NzUgMTQuNzI0LDQuMjc1IEwxNS40MjUsNC45NzUgQzE2LjEyNSw1LjY3NSAxNi4xMjUsNi41NzUgMTUuNDI1LDcuMjc1IEwxMi4zMjUsMTAuMzc1XCIgLz4gPHBhdGggZmlsbD1cIm5vbmVcIiBzdHJva2U9XCIjMDAwXCIgc3Ryb2tlLXdpZHRoPVwiMS4xXCIgZD1cIk03LjkyNSwxMS44NzUgTDExLjkyNSw3Ljk3NVwiIC8+PC9zdmc+JztcbiAgY29uc3QgbGlua2VkaW4gPSAnPHN2ZyB3aWR0aD1cIjIwXCIgaGVpZ2h0PVwiMjBcIiB2aWV3Qm94PVwiMCAwIDIwIDIwXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPiA8cGF0aCBkPVwiTTUuNzcsMTcuODkgTDUuNzcsNy4xNyBMMi4yMSw3LjE3IEwyLjIxLDE3Ljg5IEw1Ljc3LDE3Ljg5IEw1Ljc3LDE3Ljg5IFogTTMuOTksNS43MSBDNS4yMyw1LjcxIDYuMDEsNC44OSA2LjAxLDMuODYgQzUuOTksMi44IDUuMjQsMiA0LjAyLDIgQzIuOCwyIDIsMi44IDIsMy44NSBDMiw0Ljg4IDIuNzcsNS43IDMuOTcsNS43IEwzLjk5LDUuNyBMMy45OSw1LjcxIEwzLjk5LDUuNzEgWlwiIC8+IDxwYXRoIGQ9XCJNNy43NSwxNy44OSBMMTEuMzEsMTcuODkgTDExLjMxLDExLjkgQzExLjMxLDExLjU4IDExLjMzLDExLjI2IDExLjQzLDExLjAzIEMxMS42OSwxMC4zOSAxMi4yNyw5LjczIDEzLjI2LDkuNzMgQzE0LjU1LDkuNzMgMTUuMDYsMTAuNzEgMTUuMDYsMTIuMTUgTDE1LjA2LDE3Ljg5IEwxOC42MiwxNy44OSBMMTguNjIsMTEuNzQgQzE4LjYyLDguNDUgMTYuODYsNi45MiAxNC41Miw2LjkyIEMxMi42LDYuOTIgMTEuNzUsNy45OSAxMS4yOCw4LjczIEwxMS4zLDguNzMgTDExLjMsNy4xNyBMNy43NSw3LjE3IEM3Ljc5LDguMTcgNy43NSwxNy44OSA3Ljc1LDE3Ljg5IEw3Ljc1LDE3Ljg5IEw3Ljc1LDE3Ljg5IFpcIiAvPjwvc3ZnPic7XG4gIGNvbnN0IGxpc3QgPSAnPHN2ZyB3aWR0aD1cIjIwXCIgaGVpZ2h0PVwiMjBcIiB2aWV3Qm94PVwiMCAwIDIwIDIwXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPiA8cmVjdCB4PVwiNlwiIHk9XCI0XCIgd2lkdGg9XCIxMlwiIGhlaWdodD1cIjFcIiAvPiA8cmVjdCB4PVwiNlwiIHk9XCI5XCIgd2lkdGg9XCIxMlwiIGhlaWdodD1cIjFcIiAvPiA8cmVjdCB4PVwiNlwiIHk9XCIxNFwiIHdpZHRoPVwiMTJcIiBoZWlnaHQ9XCIxXCIgLz4gPHJlY3QgeD1cIjJcIiB5PVwiNFwiIHdpZHRoPVwiMlwiIGhlaWdodD1cIjFcIiAvPiA8cmVjdCB4PVwiMlwiIHk9XCI5XCIgd2lkdGg9XCIyXCIgaGVpZ2h0PVwiMVwiIC8+IDxyZWN0IHg9XCIyXCIgeT1cIjE0XCIgd2lkdGg9XCIyXCIgaGVpZ2h0PVwiMVwiIC8+PC9zdmc+JztcbiAgY29uc3QgbG9jYXRpb24gPSAnPHN2ZyB3aWR0aD1cIjIwXCIgaGVpZ2h0PVwiMjBcIiB2aWV3Qm94PVwiMCAwIDIwIDIwXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPiA8cGF0aCBmaWxsPVwibm9uZVwiIHN0cm9rZT1cIiMwMDBcIiBzdHJva2Utd2lkdGg9XCIxLjAxXCIgZD1cIk0xMCwwLjUgQzYuNDEsMC41IDMuNSwzLjM5IDMuNSw2Ljk4IEMzLjUsMTEuODMgMTAsMTkgMTAsMTkgQzEwLDE5IDE2LjUsMTEuODMgMTYuNSw2Ljk4IEMxNi41LDMuMzkgMTMuNTksMC41IDEwLDAuNSBMMTAsMC41IFpcIiAvPiA8Y2lyY2xlIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiIzAwMFwiIGN4PVwiMTBcIiBjeT1cIjYuOFwiIHI9XCIyLjNcIiAvPjwvc3ZnPic7XG4gIGNvbnN0IGxvY2sgPSAnPHN2ZyB3aWR0aD1cIjIwXCIgaGVpZ2h0PVwiMjBcIiB2aWV3Qm94PVwiMCAwIDIwIDIwXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPiA8cmVjdCBmaWxsPVwibm9uZVwiIHN0cm9rZT1cIiMwMDBcIiBoZWlnaHQ9XCIxMFwiIHdpZHRoPVwiMTNcIiB5PVwiOC41XCIgeD1cIjMuNVwiIC8+IDxwYXRoIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiIzAwMFwiIGQ9XCJNNi41LDggTDYuNSw0Ljg4IEM2LjUsMy4wMSA4LjA3LDEuNSAxMCwxLjUgQzExLjkzLDEuNSAxMy41LDMuMDEgMTMuNSw0Ljg4IEwxMy41LDhcIiAvPjwvc3ZnPic7XG4gIGNvbnN0IG1haWwgPSAnPHN2ZyB3aWR0aD1cIjIwXCIgaGVpZ2h0PVwiMjBcIiB2aWV3Qm94PVwiMCAwIDIwIDIwXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPiA8cG9seWxpbmUgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCIjMDAwXCIgcG9pbnRzPVwiMS40LDYuNSAxMCwxMSAxOC42LDYuNVwiIC8+IDxwYXRoIGQ9XCJNIDEsNCAxLDE2IDE5LDE2IDE5LDQgMSw0IFogTSAxOCwxNSAyLDE1IDIsNSAxOCw1IDE4LDE1IFpcIiAvPjwvc3ZnPic7XG4gIGNvbnN0IG1lbnUgPSAnPHN2ZyB3aWR0aD1cIjIwXCIgaGVpZ2h0PVwiMjBcIiB2aWV3Qm94PVwiMCAwIDIwIDIwXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPiA8cmVjdCB4PVwiMlwiIHk9XCI0XCIgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjFcIiAvPiA8cmVjdCB4PVwiMlwiIHk9XCI5XCIgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjFcIiAvPiA8cmVjdCB4PVwiMlwiIHk9XCIxNFwiIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxXCIgLz48L3N2Zz4nO1xuICBjb25zdCBtaW51cyA9ICc8c3ZnIHdpZHRoPVwiMjBcIiBoZWlnaHQ9XCIyMFwiIHZpZXdCb3g9XCIwIDAgMjAgMjBcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+IDxyZWN0IGhlaWdodD1cIjFcIiB3aWR0aD1cIjE4XCIgeT1cIjlcIiB4PVwiMVwiIC8+PC9zdmc+JztcbiAgY29uc3QgbW9yZSA9ICc8c3ZnIHdpZHRoPVwiMjBcIiBoZWlnaHQ9XCIyMFwiIHZpZXdCb3g9XCIwIDAgMjAgMjBcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+IDxjaXJjbGUgY3g9XCIzXCIgY3k9XCIxMFwiIHI9XCIyXCIgLz4gPGNpcmNsZSBjeD1cIjEwXCIgY3k9XCIxMFwiIHI9XCIyXCIgLz4gPGNpcmNsZSBjeD1cIjE3XCIgY3k9XCIxMFwiIHI9XCIyXCIgLz48L3N2Zz4nO1xuICBjb25zdCBtb3ZlID0gJzxzdmcgd2lkdGg9XCIyMFwiIGhlaWdodD1cIjIwXCIgdmlld0JveD1cIjAgMCAyMCAyMFwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj4gPHBvbHlnb24gcG9pbnRzPVwiNCw1IDEsNSAxLDkgMiw5IDIsNiA0LDYgXCIgLz4gPHBvbHlnb24gcG9pbnRzPVwiMSwxNiAyLDE2IDIsMTggNCwxOCA0LDE5IDEsMTkgXCIgLz4gPHBvbHlnb24gcG9pbnRzPVwiMTQsMTYgMTQsMTkgMTEsMTkgMTEsMTggMTMsMTggMTMsMTYgXCIgLz4gPHJlY3QgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCIjMDAwXCIgeD1cIjUuNVwiIHk9XCIxLjVcIiB3aWR0aD1cIjEzXCIgaGVpZ2h0PVwiMTNcIiAvPiA8cmVjdCB4PVwiMVwiIHk9XCIxMVwiIHdpZHRoPVwiMVwiIGhlaWdodD1cIjNcIiAvPiA8cmVjdCB4PVwiNlwiIHk9XCIxOFwiIHdpZHRoPVwiM1wiIGhlaWdodD1cIjFcIiAvPjwvc3ZnPic7XG4gIGNvbnN0IG51dCA9ICc8c3ZnIHdpZHRoPVwiMjBcIiBoZWlnaHQ9XCIyMFwiIHZpZXdCb3g9XCIwIDAgMjAgMjBcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+IDxwb2x5Z29uIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiIzAwMFwiIHBvaW50cz1cIjIuNSw1LjcgMTAsMS4zIDE3LjUsNS43IDE3LjUsMTQuMyAxMCwxOC43IDIuNSwxNC4zXCIgLz4gPGNpcmNsZSBmaWxsPVwibm9uZVwiIHN0cm9rZT1cIiMwMDBcIiBjeD1cIjEwXCIgY3k9XCIxMFwiIHI9XCIzLjVcIiAvPjwvc3ZnPic7XG4gIGNvbnN0IHBlbmNpbCA9ICc8c3ZnIHdpZHRoPVwiMjBcIiBoZWlnaHQ9XCIyMFwiIHZpZXdCb3g9XCIwIDAgMjAgMjBcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+IDxwYXRoIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiIzAwMFwiIGQ9XCJNMTcuMjUsNi4wMSBMNy4xMiwxNi4xIEwzLjgyLDE3LjIgTDUuMDIsMTMuOSBMMTUuMTIsMy44OCBDMTUuNzEsMy4yOSAxNi42NiwzLjI5IDE3LjI1LDMuODggQzE3LjgzLDQuNDcgMTcuODMsNS40MiAxNy4yNSw2LjAxIEwxNy4yNSw2LjAxIFpcIiAvPiA8cGF0aCBmaWxsPVwibm9uZVwiIHN0cm9rZT1cIiMwMDBcIiBkPVwiTTE1Ljk4LDcuMjY4IEwxMy44NTEsNS4xNDhcIiAvPjwvc3ZnPic7XG4gIGNvbnN0IHBob25lID0gJzxzdmcgd2lkdGg9XCIyMFwiIGhlaWdodD1cIjIwXCIgdmlld0JveD1cIjAgMCAyMCAyMFwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj4gPHBhdGggZmlsbD1cIm5vbmVcIiBzdHJva2U9XCIjMDAwXCIgZD1cIk0xNS41LDE3IEMxNS41LDE3LjggMTQuOCwxOC41IDE0LDE4LjUgTDcsMTguNSBDNi4yLDE4LjUgNS41LDE3LjggNS41LDE3IEw1LjUsMyBDNS41LDIuMiA2LjIsMS41IDcsMS41IEwxNCwxLjUgQzE0LjgsMS41IDE1LjUsMi4yIDE1LjUsMyBMMTUuNSwxNyBMMTUuNSwxNyBMMTUuNSwxNyBaXCIgLz4gPGNpcmNsZSBjeD1cIjEwLjVcIiBjeT1cIjE2LjVcIiByPVwiMC44XCIgLz48L3N2Zz4nO1xuICBjb25zdCBwbGF5ID0gJzxzdmcgd2lkdGg9XCIyMFwiIGhlaWdodD1cIjIwXCIgdmlld0JveD1cIjAgMCAyMCAyMFwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj4gPHBvbHlnb24gZmlsbD1cIm5vbmVcIiBzdHJva2U9XCIjMDAwXCIgcG9pbnRzPVwiNi41LDUgMTQuNSwxMCA2LjUsMTVcIiAvPjwvc3ZnPic7XG4gIGNvbnN0IHBsdXMgPSAnPHN2ZyB3aWR0aD1cIjIwXCIgaGVpZ2h0PVwiMjBcIiB2aWV3Qm94PVwiMCAwIDIwIDIwXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPiA8cmVjdCB4PVwiOVwiIHk9XCIxXCIgd2lkdGg9XCIxXCIgaGVpZ2h0PVwiMTdcIiAvPiA8cmVjdCB4PVwiMVwiIHk9XCI5XCIgd2lkdGg9XCIxN1wiIGhlaWdodD1cIjFcIiAvPjwvc3ZnPic7XG4gIGNvbnN0IHB1bGwgPSAnPHN2ZyB3aWR0aD1cIjIwXCIgaGVpZ2h0PVwiMjBcIiB2aWV3Qm94PVwiMCAwIDIwIDIwXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPiA8cG9seWdvbiBwb2ludHM9XCI2Ljg1LDggOS41LDEwLjYgMTIuMTUsOCAxMi44NSw4LjcgOS41LDEyIDYuMTUsOC43XCIgLz4gPGxpbmUgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCIjMDAwXCIgeDE9XCI5LjVcIiB5MT1cIjExXCIgeDI9XCI5LjVcIiB5Mj1cIjJcIiAvPiA8cG9seWxpbmUgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCIjMDAwXCIgcG9pbnRzPVwiNiw1LjUgMy41LDUuNSAzLjUsMTguNSAxNS41LDE4LjUgMTUuNSw1LjUgMTMsNS41XCIgLz48L3N2Zz4nO1xuICBjb25zdCBwdXNoID0gJzxzdmcgd2lkdGg9XCIyMFwiIGhlaWdodD1cIjIwXCIgdmlld0JveD1cIjAgMCAyMCAyMFwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj4gPHBvbHlnb24gcG9pbnRzPVwiMTIuMTUsNCA5LjUsMS40IDYuODUsNCA2LjE1LDMuMyA5LjUsMCAxMi44NSwzLjNcIiAvPiA8bGluZSBmaWxsPVwibm9uZVwiIHN0cm9rZT1cIiMwMDBcIiB4MT1cIjkuNVwiIHkxPVwiMTBcIiB4Mj1cIjkuNVwiIHkyPVwiMVwiIC8+IDxwb2x5bGluZSBmaWxsPVwibm9uZVwiIHN0cm9rZT1cIiMwMDBcIiBwb2ludHM9XCI2IDUuNSAzLjUgNS41IDMuNSAxOC41IDE1LjUgMTguNSAxNS41IDUuNSAxMyA1LjVcIiAvPjwvc3ZnPic7XG4gIGNvbnN0IHF1ZXN0aW9uID0gJzxzdmcgd2lkdGg9XCIyMFwiIGhlaWdodD1cIjIwXCIgdmlld0JveD1cIjAgMCAyMCAyMFwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj4gPGNpcmNsZSBmaWxsPVwibm9uZVwiIHN0cm9rZT1cIiMwMDBcIiBzdHJva2Utd2lkdGg9XCIxLjFcIiBjeD1cIjEwXCIgY3k9XCIxMFwiIHI9XCI5XCIgLz4gPGNpcmNsZSBjeD1cIjEwLjQ0XCIgY3k9XCIxNC40MlwiIHI9XCIxLjA1XCIgLz4gPHBhdGggZmlsbD1cIm5vbmVcIiBzdHJva2U9XCIjMDAwXCIgc3Ryb2tlLXdpZHRoPVwiMS4yXCIgZD1cIk04LjE3LDcuNzkgQzguMTcsNC43NSAxMi43Miw0LjczIDEyLjcyLDcuNzIgQzEyLjcyLDguNjcgMTEuODEsOS4xNSAxMS4yMyw5Ljc1IEMxMC43NSwxMC4yNCAxMC41MSwxMC43MyAxMC40NSwxMS40IEMxMC40NCwxMS41MyAxMC40MywxMS42NCAxMC40MywxMS43NVwiIC8+PC9zdmc+JztcbiAgY29uc3QgcmVjZWl2ZXIgPSAnPHN2ZyB3aWR0aD1cIjIwXCIgaGVpZ2h0PVwiMjBcIiB2aWV3Qm94PVwiMCAwIDIwIDIwXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPiA8cGF0aCBmaWxsPVwibm9uZVwiIHN0cm9rZT1cIiMwMDBcIiBzdHJva2Utd2lkdGg9XCIxLjAxXCIgZD1cIk02LjE4OSwxMy42MTFDOC4xMzQsMTUuNTI1IDExLjA5NywxOC4yMzkgMTMuODY3LDE4LjI1N0MxNi40NywxOC4yNzUgMTguMiwxNi4yNDEgMTguMiwxNi4yNDFMMTQuNTA5LDEyLjU1MUwxMS41MzksMTMuNjM5TDYuMTg5LDguMjlMNy4zMTMsNS4zNTVMMy43NiwxLjhDMy43NiwxLjggMS43MzIsMy41MzcgMS43LDYuMDkyQzEuNjY3LDguODA5IDQuMzQ3LDExLjczOCA2LjE4OSwxMy42MTFcIiAvPjwvc3ZnPic7XG4gIGNvbnN0IHJlZnJlc2ggPSAnPHN2ZyB3aWR0aD1cIjIwXCIgaGVpZ2h0PVwiMjBcIiB2aWV3Qm94PVwiMCAwIDIwIDIwXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPiA8cGF0aCBmaWxsPVwibm9uZVwiIHN0cm9rZT1cIiMwMDBcIiBzdHJva2Utd2lkdGg9XCIxLjFcIiBkPVwiTTE3LjA4LDExLjE1IEMxNy4wOSwxMS4zMSAxNy4xLDExLjQ3IDE3LjEsMTEuNjQgQzE3LjEsMTUuNTMgMTMuOTQsMTguNjkgMTAuMDUsMTguNjkgQzYuMTYsMTguNjggMywxNS41MyAzLDExLjYzIEMzLDcuNzQgNi4xNiw0LjU4IDEwLjA1LDQuNTggQzEwLjksNC41OCAxMS43MSw0LjczIDEyLjQ2LDVcIiAvPiA8cG9seWxpbmUgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCIjMDAwXCIgcG9pbnRzPVwiOS45IDIgMTIuNzkgNC44OSA5Ljc5IDcuOVwiIC8+PC9zdmc+JztcbiAgY29uc3QgcmVwbHkgPSAnPHN2ZyB3aWR0aD1cIjIwXCIgaGVpZ2h0PVwiMjBcIiB2aWV3Qm94PVwiMCAwIDIwIDIwXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPiA8cGF0aCBkPVwiTTE3LjcsMTMuMTEgQzE2LjEyLDEwLjAyIDEzLjg0LDcuODUgMTEuMDIsNi42MSBDMTAuNTcsNi40MSA5Ljc1LDYuMTMgOSw1LjkxIEw5LDIgTDEsOSBMOSwxNiBMOSwxMi4xMyBDMTAuNzgsMTIuNDcgMTIuNSwxMy4xOSAxNC4wOSwxNC4yNSBDMTcuMTMsMTYuMjggMTguNTYsMTguNTQgMTguNTYsMTguNTQgQzE4LjU2LDE4LjU0IDE4LjgxLDE1LjI4IDE3LjcsMTMuMTEgTDE3LjcsMTMuMTEgWiBNMTQuODIsMTMuNTMgQzEzLjE3LDEyLjQgMTEuMDEsMTEuNCA4LDEwLjkyIEw4LDEzLjYzIEwyLjU1LDkgTDgsNC4yNSBMOCw2LjggQzguMyw2Ljg2IDkuMTYsNy4wMiAxMC4zNyw3LjQ5IEMxMy4zLDguNjUgMTUuNTQsMTAuOTYgMTYuNjUsMTMuMDggQzE2Ljk3LDEzLjcgMTcuNDgsMTQuODYgMTcuNjgsMTYgQzE2Ljg3LDE1LjA1IDE1LjczLDE0LjE1IDE0LjgyLDEzLjUzIEwxNC44MiwxMy41MyBaXCIgLz48L3N2Zz4nO1xuICBjb25zdCByc3MgPSAnPHN2ZyB3aWR0aD1cIjIwXCIgaGVpZ2h0PVwiMjBcIiB2aWV3Qm94PVwiMCAwIDIwIDIwXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPiA8Y2lyY2xlIGN4PVwiMy4xMlwiIGN5PVwiMTYuOFwiIHI9XCIxLjg1XCIgLz4gPHBhdGggZmlsbD1cIm5vbmVcIiBzdHJva2U9XCIjMDAwXCIgc3Ryb2tlLXdpZHRoPVwiMS4xXCIgZD1cIk0xLjUsOC4yIEMxLjc4LDguMTggMi4wNiw4LjE2IDIuMzUsOC4xNiBDNy41Nyw4LjE2IDExLjgxLDEyLjM3IDExLjgxLDE3LjU3IEMxMS44MSwxNy44OSAxMS43OSwxOC4xOSAxMS43NiwxOC41XCIgLz4gPHBhdGggZmlsbD1cIm5vbmVcIiBzdHJva2U9XCIjMDAwXCIgc3Ryb2tlLXdpZHRoPVwiMS4xXCIgZD1cIk0xLjUsMi41MiBDMS43OCwyLjUxIDIuMDYsMi41IDIuMzUsMi41IEMxMC43MiwyLjUgMTcuNSw5LjI0IDE3LjUsMTcuNTcgQzE3LjUsMTcuODkgMTcuNDksMTguMTkgMTcuNDcsMTguNVwiIC8+PC9zdmc+JztcbiAgY29uc3Qgc2VhcmNoID0gJzxzdmcgd2lkdGg9XCIyMFwiIGhlaWdodD1cIjIwXCIgdmlld0JveD1cIjAgMCAyMCAyMFwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj4gPGNpcmNsZSBmaWxsPVwibm9uZVwiIHN0cm9rZT1cIiMwMDBcIiBzdHJva2Utd2lkdGg9XCIxLjFcIiBjeD1cIjlcIiBjeT1cIjlcIiByPVwiN1wiIC8+IDxwYXRoIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiIzAwMFwiIHN0cm9rZS13aWR0aD1cIjEuMVwiIGQ9XCJNMTQsMTQgTDE4LDE4IEwxNCwxNCBaXCIgLz48L3N2Zz4nO1xuICBjb25zdCBzZXJ2ZXIgPSAnPHN2ZyB3aWR0aD1cIjIwXCIgaGVpZ2h0PVwiMjBcIiB2aWV3Qm94PVwiMCAwIDIwIDIwXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPiA8cmVjdCB4PVwiM1wiIHk9XCIzXCIgd2lkdGg9XCIxXCIgaGVpZ2h0PVwiMlwiIC8+IDxyZWN0IHg9XCI1XCIgeT1cIjNcIiB3aWR0aD1cIjFcIiBoZWlnaHQ9XCIyXCIgLz4gPHJlY3QgeD1cIjdcIiB5PVwiM1wiIHdpZHRoPVwiMVwiIGhlaWdodD1cIjJcIiAvPiA8cmVjdCB4PVwiMTZcIiB5PVwiM1wiIHdpZHRoPVwiMVwiIGhlaWdodD1cIjFcIiAvPiA8cmVjdCB4PVwiMTZcIiB5PVwiMTBcIiB3aWR0aD1cIjFcIiBoZWlnaHQ9XCIxXCIgLz4gPGNpcmNsZSBmaWxsPVwibm9uZVwiIHN0cm9rZT1cIiMwMDBcIiBjeD1cIjkuOVwiIGN5PVwiMTcuNFwiIHI9XCIxLjRcIiAvPiA8cmVjdCB4PVwiM1wiIHk9XCIxMFwiIHdpZHRoPVwiMVwiIGhlaWdodD1cIjJcIiAvPiA8cmVjdCB4PVwiNVwiIHk9XCIxMFwiIHdpZHRoPVwiMVwiIGhlaWdodD1cIjJcIiAvPiA8cmVjdCB4PVwiOS41XCIgeT1cIjE0XCIgd2lkdGg9XCIxXCIgaGVpZ2h0PVwiMlwiIC8+IDxyZWN0IHg9XCIzXCIgeT1cIjE3XCIgd2lkdGg9XCI2XCIgaGVpZ2h0PVwiMVwiIC8+IDxyZWN0IHg9XCIxMVwiIHk9XCIxN1wiIHdpZHRoPVwiNlwiIGhlaWdodD1cIjFcIiAvPiA8cmVjdCBmaWxsPVwibm9uZVwiIHN0cm9rZT1cIiMwMDBcIiB4PVwiMS41XCIgeT1cIjEuNVwiIHdpZHRoPVwiMTdcIiBoZWlnaHQ9XCI1XCIgLz4gPHJlY3QgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCIjMDAwXCIgeD1cIjEuNVwiIHk9XCI4LjVcIiB3aWR0aD1cIjE3XCIgaGVpZ2h0PVwiNVwiIC8+PC9zdmc+JztcbiAgY29uc3Qgc2V0dGluZ3MgPSAnPHN2ZyB3aWR0aD1cIjIwXCIgaGVpZ2h0PVwiMjBcIiB2aWV3Qm94PVwiMCAwIDIwIDIwXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPiA8ZWxsaXBzZSBmaWxsPVwibm9uZVwiIHN0cm9rZT1cIiMwMDBcIiBjeD1cIjYuMTFcIiBjeT1cIjMuNTVcIiByeD1cIjIuMTFcIiByeT1cIjIuMTVcIiAvPiA8ZWxsaXBzZSBmaWxsPVwibm9uZVwiIHN0cm9rZT1cIiMwMDBcIiBjeD1cIjYuMTFcIiBjeT1cIjE1LjU1XCIgcng9XCIyLjExXCIgcnk9XCIyLjE1XCIgLz4gPGNpcmNsZSBmaWxsPVwibm9uZVwiIHN0cm9rZT1cIiMwMDBcIiBjeD1cIjEzLjE1XCIgY3k9XCI5LjU1XCIgcj1cIjIuMTVcIiAvPiA8cmVjdCB4PVwiMVwiIHk9XCIzXCIgd2lkdGg9XCIzXCIgaGVpZ2h0PVwiMVwiIC8+IDxyZWN0IHg9XCIxMFwiIHk9XCIzXCIgd2lkdGg9XCI4XCIgaGVpZ2h0PVwiMVwiIC8+IDxyZWN0IHg9XCIxXCIgeT1cIjlcIiB3aWR0aD1cIjhcIiBoZWlnaHQ9XCIxXCIgLz4gPHJlY3QgeD1cIjE1XCIgeT1cIjlcIiB3aWR0aD1cIjNcIiBoZWlnaHQ9XCIxXCIgLz4gPHJlY3QgeD1cIjFcIiB5PVwiMTVcIiB3aWR0aD1cIjNcIiBoZWlnaHQ9XCIxXCIgLz4gPHJlY3QgeD1cIjEwXCIgeT1cIjE1XCIgd2lkdGg9XCI4XCIgaGVpZ2h0PVwiMVwiIC8+PC9zdmc+JztcbiAgY29uc3Qgc2hyaW5rID0gJzxzdmcgd2lkdGg9XCIyMFwiIGhlaWdodD1cIjIwXCIgdmlld0JveD1cIjAgMCAyMCAyMFwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj4gPHBvbHlnb24gcG9pbnRzPVwiMTEgNCAxMiA0IDEyIDggMTYgOCAxNiA5IDExIDlcIiAvPiA8cG9seWdvbiBwb2ludHM9XCI0IDExIDkgMTEgOSAxNiA4IDE2IDggMTIgNCAxMlwiIC8+IDxwYXRoIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiIzAwMFwiIHN0cm9rZS13aWR0aD1cIjEuMVwiIGQ9XCJNMTIsOCBMMTgsMlwiIC8+IDxwYXRoIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiIzAwMFwiIHN0cm9rZS13aWR0aD1cIjEuMVwiIGQ9XCJNMiwxOCBMOCwxMlwiIC8+PC9zdmc+JztcbiAgY29uc3Qgc29jaWFsID0gJzxzdmcgd2lkdGg9XCIyMFwiIGhlaWdodD1cIjIwXCIgdmlld0JveD1cIjAgMCAyMCAyMFwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj4gPGxpbmUgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCIjMDAwXCIgc3Ryb2tlLXdpZHRoPVwiMS4xXCIgeDE9XCIxMy40XCIgeTE9XCIxNFwiIHgyPVwiNi4zXCIgeTI9XCIxMC43XCIgLz4gPGxpbmUgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCIjMDAwXCIgc3Ryb2tlLXdpZHRoPVwiMS4xXCIgeDE9XCIxMy41XCIgeTE9XCI1LjVcIiB4Mj1cIjYuNVwiIHkyPVwiOC44XCIgLz4gPGNpcmNsZSBmaWxsPVwibm9uZVwiIHN0cm9rZT1cIiMwMDBcIiBzdHJva2Utd2lkdGg9XCIxLjFcIiBjeD1cIjE1LjVcIiBjeT1cIjQuNlwiIHI9XCIyLjNcIiAvPiA8Y2lyY2xlIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiIzAwMFwiIHN0cm9rZS13aWR0aD1cIjEuMVwiIGN4PVwiMTUuNVwiIGN5PVwiMTQuOFwiIHI9XCIyLjNcIiAvPiA8Y2lyY2xlIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiIzAwMFwiIHN0cm9rZS13aWR0aD1cIjEuMVwiIGN4PVwiNC41XCIgY3k9XCI5LjhcIiByPVwiMi4zXCIgLz48L3N2Zz4nO1xuICBjb25zdCBzdGFyID0gJzxzdmcgd2lkdGg9XCIyMFwiIGhlaWdodD1cIjIwXCIgdmlld0JveD1cIjAgMCAyMCAyMFwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj4gPHBvbHlnb24gZmlsbD1cIm5vbmVcIiBzdHJva2U9XCIjMDAwXCIgc3Ryb2tlLXdpZHRoPVwiMS4wMVwiIHBvaW50cz1cIjEwIDIgMTIuNjMgNy4yNyAxOC41IDguMTIgMTQuMjUgMTIuMjIgMTUuMjUgMTggMTAgMTUuMjcgNC43NSAxOCA1Ljc1IDEyLjIyIDEuNSA4LjEyIDcuMzcgNy4yN1wiIC8+PC9zdmc+JztcbiAgY29uc3QgdGFibGUgPSAnPHN2ZyB3aWR0aD1cIjIwXCIgaGVpZ2h0PVwiMjBcIiB2aWV3Qm94PVwiMCAwIDIwIDIwXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPiA8cmVjdCB4PVwiMVwiIHk9XCIzXCIgd2lkdGg9XCIxOFwiIGhlaWdodD1cIjFcIiAvPiA8cmVjdCB4PVwiMVwiIHk9XCI3XCIgd2lkdGg9XCIxOFwiIGhlaWdodD1cIjFcIiAvPiA8cmVjdCB4PVwiMVwiIHk9XCIxMVwiIHdpZHRoPVwiMThcIiBoZWlnaHQ9XCIxXCIgLz4gPHJlY3QgeD1cIjFcIiB5PVwiMTVcIiB3aWR0aD1cIjE4XCIgaGVpZ2h0PVwiMVwiIC8+PC9zdmc+JztcbiAgY29uc3QgdGFibGV0ID0gJzxzdmcgd2lkdGg9XCIyMFwiIGhlaWdodD1cIjIwXCIgdmlld0JveD1cIjAgMCAyMCAyMFwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj4gPHBhdGggZmlsbD1cIm5vbmVcIiBzdHJva2U9XCIjMDAwXCIgZD1cIk01LDE4LjUgQzQuMiwxOC41IDMuNSwxNy44IDMuNSwxNyBMMy41LDMgQzMuNSwyLjIgNC4yLDEuNSA1LDEuNSBMMTYsMS41IEMxNi44LDEuNSAxNy41LDIuMiAxNy41LDMgTDE3LjUsMTcgQzE3LjUsMTcuOCAxNi44LDE4LjUgMTYsMTguNSBMNSwxOC41IEw1LDE4LjUgTDUsMTguNSBaXCIgLz4gPGNpcmNsZSBjeD1cIjEwLjVcIiBjeT1cIjE2LjNcIiByPVwiMC44XCIgLz48L3N2Zz4nO1xuICBjb25zdCB0YWcgPSAnPHN2ZyB3aWR0aD1cIjIwXCIgaGVpZ2h0PVwiMjBcIiB2aWV3Qm94PVwiMCAwIDIwIDIwXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPiA8cGF0aCBmaWxsPVwibm9uZVwiIHN0cm9rZT1cIiMwMDBcIiBzdHJva2Utd2lkdGg9XCIxLjFcIiBkPVwiTTE3LjUsMy43MSBMMTcuNSw3LjcyIEMxNy41LDcuOTYgMTcuNCw4LjIgMTcuMjEsOC4zOSBMOC4zOSwxNy4yIEM3Ljk5LDE3LjYgNy4zMywxNy42IDYuOTMsMTcuMiBMMi44LDEzLjA3IEMyLjQsMTIuNjcgMi40LDEyLjAxIDIuOCwxMS42MSBMMTEuNjEsMi44IEMxMS44MSwyLjYgMTIuMDgsMi41IDEyLjM0LDIuNSBMMTYuMTksMi41IEMxNi41MiwyLjUgMTYuODYsMi42MyAxNy4xMSwyLjg4IEMxNy4zNSwzLjExIDE3LjQ4LDMuNCAxNy41LDMuNzEgTDE3LjUsMy43MSBaXCIgLz4gPGNpcmNsZSBjeD1cIjE0XCIgY3k9XCI2XCIgcj1cIjFcIiAvPjwvc3ZnPic7XG4gIGNvbnN0IHRodW1ibmFpbHMgPSAnPHN2ZyB3aWR0aD1cIjIwXCIgaGVpZ2h0PVwiMjBcIiB2aWV3Qm94PVwiMCAwIDIwIDIwXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPiA8cmVjdCBmaWxsPVwibm9uZVwiIHN0cm9rZT1cIiMwMDBcIiB4PVwiMy41XCIgeT1cIjMuNVwiIHdpZHRoPVwiNVwiIGhlaWdodD1cIjVcIiAvPiA8cmVjdCBmaWxsPVwibm9uZVwiIHN0cm9rZT1cIiMwMDBcIiB4PVwiMTEuNVwiIHk9XCIzLjVcIiB3aWR0aD1cIjVcIiBoZWlnaHQ9XCI1XCIgLz4gPHJlY3QgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCIjMDAwXCIgeD1cIjExLjVcIiB5PVwiMTEuNVwiIHdpZHRoPVwiNVwiIGhlaWdodD1cIjVcIiAvPiA8cmVjdCBmaWxsPVwibm9uZVwiIHN0cm9rZT1cIiMwMDBcIiB4PVwiMy41XCIgeT1cIjExLjVcIiB3aWR0aD1cIjVcIiBoZWlnaHQ9XCI1XCIgLz48L3N2Zz4nO1xuICBjb25zdCB0cmFzaCA9ICc8c3ZnIHdpZHRoPVwiMjBcIiBoZWlnaHQ9XCIyMFwiIHZpZXdCb3g9XCIwIDAgMjAgMjBcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+IDxwb2x5bGluZSBmaWxsPVwibm9uZVwiIHN0cm9rZT1cIiMwMDBcIiBwb2ludHM9XCI2LjUgMyA2LjUgMS41IDEzLjUgMS41IDEzLjUgM1wiIC8+IDxwb2x5bGluZSBmaWxsPVwibm9uZVwiIHN0cm9rZT1cIiMwMDBcIiBwb2ludHM9XCI0LjUgNCA0LjUgMTguNSAxNS41IDE4LjUgMTUuNSA0XCIgLz4gPHJlY3QgeD1cIjhcIiB5PVwiN1wiIHdpZHRoPVwiMVwiIGhlaWdodD1cIjlcIiAvPiA8cmVjdCB4PVwiMTFcIiB5PVwiN1wiIHdpZHRoPVwiMVwiIGhlaWdodD1cIjlcIiAvPiA8cmVjdCB4PVwiMlwiIHk9XCIzXCIgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjFcIiAvPjwvc3ZnPic7XG4gIGNvbnN0IHR1bWJsciA9ICc8c3ZnIHdpZHRoPVwiMjBcIiBoZWlnaHQ9XCIyMFwiIHZpZXdCb3g9XCIwIDAgMjAgMjBcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+IDxwYXRoIGQ9XCJNNi44ODUsOC41OThjMCwwLDAsMy4zOTMsMCw0Ljk5NmMwLDAuMjgyLDAsMC42NiwwLjA5NCwwLjk0MmMwLjM3NywxLjUwOSwxLjEzMSwyLjU0NSwyLjU0NSwzLjExIGMxLjMxOSwwLjQ3MiwyLjM1NiwwLjQ3MiwzLjY3NiwwYzAuNTY1LTAuMTg4LDEuMTMyLTAuNjU5LDEuMTMyLTAuNjU5bC0wLjg0OS0yLjI2M2MwLDAtMS4wMzYsMC4zNzgtMS42MDMsMC4yODMgYy0wLjU2NS0wLjA5NC0xLjIyNi0wLjY2LTEuMjI2LTEuNTA4YzAtMS42MDMsMC00LjkwMiwwLTQuOTAyaDIuODI4VjUuNzcxaC0yLjgyOFYySDguMjA1YzAsMC0wLjA5NCwwLjY2LTAuMTg4LDAuOTQyIEM3LjgyOCwzLjc5MSw3LjI2Miw0LjczMyw2LjYwMyw1LjM5NEM1Ljg0OCw2LjE0Nyw1LDYuNDMsNSw2LjQzdjIuMTY4SDYuODg1elwiIC8+PC9zdmc+JztcbiAgY29uc3QgdHYgPSAnPHN2ZyB3aWR0aD1cIjIwXCIgaGVpZ2h0PVwiMjBcIiB2aWV3Qm94PVwiMCAwIDIwIDIwXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPiA8cmVjdCB4PVwiN1wiIHk9XCIxNlwiIHdpZHRoPVwiNlwiIGhlaWdodD1cIjFcIiAvPiA8cmVjdCBmaWxsPVwibm9uZVwiIHN0cm9rZT1cIiMwMDBcIiB4PVwiMC41XCIgeT1cIjMuNVwiIHdpZHRoPVwiMTlcIiBoZWlnaHQ9XCIxMVwiIC8+PC9zdmc+JztcbiAgY29uc3QgdHdpdHRlciA9ICc8c3ZnIHdpZHRoPVwiMjBcIiBoZWlnaHQ9XCIyMFwiIHZpZXdCb3g9XCIwIDAgMjAgMjBcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+IDxwYXRoIGQ9XCJNMTksNC43NCBDMTguMzM5LDUuMDI5IDE3LjYyNiw1LjIyOSAxNi44ODEsNS4zMiBDMTcuNjQ0LDQuODYgMTguMjI3LDQuMTM5IDE4LjUwMywzLjI4IEMxNy43OSwzLjcgMTcuMDAxLDQuMDA5IDE2LjE1OSw0LjE3IEMxNS40ODUsMy40NSAxNC41MjYsMyAxMy40NjQsMyBDMTEuNDIzLDMgOS43NzEsNC42NiA5Ljc3MSw2LjcgQzkuNzcxLDYuOTkgOS44MDQsNy4yNjkgOS44NjgsNy41MzkgQzYuNzk1LDcuMzggNC4wNzYsNS45MTkgMi4yNTQsMy42NzkgQzEuOTM2LDQuMjE5IDEuNzU0LDQuODYgMS43NTQsNS41MzkgQzEuNzU0LDYuODIgMi40MDUsNy45NSAzLjM5Nyw4LjYxIEMyLjc5LDguNTg5IDIuMjIsOC40MjkgMS43MjMsOC4xNDkgTDEuNzIzLDguMTg5IEMxLjcyMyw5Ljk3OCAyLjk5NywxMS40NzggNC42ODYsMTEuODIgQzQuMzc2LDExLjg5OSA0LjA0OSwxMS45MzkgMy43MTMsMTEuOTM5IEMzLjQ3NSwxMS45MzkgMy4yNDUsMTEuOTE5IDMuMDE4LDExLjg4IEMzLjQ5LDEzLjM0OSA0Ljg1MiwxNC40MTkgNi40NjksMTQuNDQ5IEM1LjIwNSwxNS40MjkgMy42MTIsMTYuMDE5IDEuODgyLDE2LjAxOSBDMS41ODMsMTYuMDE5IDEuMjksMTYuMDA5IDEsMTUuOTY5IEMyLjYzNSwxNy4wMTkgNC41NzYsMTcuNjI5IDYuNjYyLDE3LjYyOSBDMTMuNDU0LDE3LjYyOSAxNy4xNywxMiAxNy4xNyw3LjEyOSBDMTcuMTcsNi45NjkgMTcuMTY2LDYuODA5IDE3LjE1Nyw2LjY0OSBDMTcuODc5LDYuMTI5IDE4LjUwNCw1LjQ3OCAxOSw0Ljc0XCIgLz48L3N2Zz4nO1xuICBjb25zdCB1bmxvY2sgPSAnPHN2ZyB3aWR0aD1cIjIwXCIgaGVpZ2h0PVwiMjBcIiB2aWV3Qm94PVwiMCAwIDIwIDIwXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPiA8cmVjdCBmaWxsPVwibm9uZVwiIHN0cm9rZT1cIiMwMDBcIiB4PVwiMy41XCIgeT1cIjguNVwiIHdpZHRoPVwiMTNcIiBoZWlnaHQ9XCIxMFwiIC8+IDxwYXRoIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiIzAwMFwiIGQ9XCJNNi41LDguNSBMNi41LDQuOSBDNi41LDMgOC4xLDEuNSAxMCwxLjUgQzExLjksMS41IDEzLjUsMyAxMy41LDQuOVwiIC8+PC9zdmc+JztcbiAgY29uc3QgdXBsb2FkID0gJzxzdmcgd2lkdGg9XCIyMFwiIGhlaWdodD1cIjIwXCIgdmlld0JveD1cIjAgMCAyMCAyMFwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj4gPHBvbHlsaW5lIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiIzAwMFwiIHBvaW50cz1cIjUgOCA5LjUgMy41IDE0IDggXCIgLz4gPHJlY3QgeD1cIjNcIiB5PVwiMTdcIiB3aWR0aD1cIjEzXCIgaGVpZ2h0PVwiMVwiIC8+IDxsaW5lIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiIzAwMFwiIHgxPVwiOS41XCIgeTE9XCIxNVwiIHgyPVwiOS41XCIgeTI9XCI0XCIgLz48L3N2Zz4nO1xuICBjb25zdCB1c2VyID0gJzxzdmcgd2lkdGg9XCIyMFwiIGhlaWdodD1cIjIwXCIgdmlld0JveD1cIjAgMCAyMCAyMFwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj4gPGNpcmNsZSBmaWxsPVwibm9uZVwiIHN0cm9rZT1cIiMwMDBcIiBzdHJva2Utd2lkdGg9XCIxLjFcIiBjeD1cIjkuOVwiIGN5PVwiNi40XCIgcj1cIjQuNFwiIC8+IDxwYXRoIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiIzAwMFwiIHN0cm9rZS13aWR0aD1cIjEuMVwiIGQ9XCJNMS41LDE5IEMyLjMsMTQuNSA1LjgsMTEuMiAxMCwxMS4yIEMxNC4yLDExLjIgMTcuNywxNC42IDE4LjUsMTkuMlwiIC8+PC9zdmc+JztcbiAgY29uc3QgdXNlcnMgPSAnPHN2ZyB3aWR0aD1cIjIwXCIgaGVpZ2h0PVwiMjBcIiB2aWV3Qm94PVwiMCAwIDIwIDIwXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPiA8Y2lyY2xlIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiIzAwMFwiIHN0cm9rZS13aWR0aD1cIjEuMVwiIGN4PVwiNy43XCIgY3k9XCI4LjZcIiByPVwiMy41XCIgLz4gPHBhdGggZmlsbD1cIm5vbmVcIiBzdHJva2U9XCIjMDAwXCIgc3Ryb2tlLXdpZHRoPVwiMS4xXCIgZD1cIk0xLDE4LjEgQzEuNywxNC42IDQuNCwxMi4xIDcuNiwxMi4xIEMxMC45LDEyLjEgMTMuNywxNC44IDE0LjMsMTguM1wiIC8+IDxwYXRoIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiIzAwMFwiIHN0cm9rZS13aWR0aD1cIjEuMVwiIGQ9XCJNMTEuNCw0IEMxMi44LDIuNCAxNS40LDIuOCAxNi4zLDQuNyBDMTcuMiw2LjYgMTUuNyw4LjkgMTMuNiw4LjkgQzE2LjUsOC45IDE4LjgsMTEuMyAxOS4yLDE0LjFcIiAvPjwvc3ZnPic7XG4gIGNvbnN0IHZpbWVvID0gJzxzdmcgd2lkdGg9XCIyMFwiIGhlaWdodD1cIjIwXCIgdmlld0JveD1cIjAgMCAyMCAyMFwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj4gPHBhdGggZD1cIk0yLjA2NSw3LjU5QzEuODQsNy4zNjcsMS42NTQsNy4wODIsMS40NjgsNi44MzhjLTAuMzMyLTAuNDItMC4xMzctMC40MTEsMC4yNzQtMC43NzJjMS4wMjYtMC45MSwyLjAwNC0xLjg5NiwzLjEyNy0yLjY4OCBjMS4wMTctMC43MTMsMi4zNjUtMS4xNzMsMy4yODYtMC4wMzljMC44NDksMS4wNDUsMC44NjksMi42MjksMS4wODQsMy44OTFjMC4yMTUsMS4zMDksMC40MjEsMi42NDgsMC44OCwzLjkwMSBjMC4xMjcsMC4zNTIsMC4zNywxLjAxOCwwLjgxLDEuMDc0YzAuNTY3LDAuMDc4LDEuMTQ1LTAuOTE3LDEuNDA4LTEuMjg5YzAuNjg0LTAuOTg3LDEuNjExLTIuMzE3LDEuNDk0LTMuNTg3IGMtMC4xMTUtMS4zNDktMS41NzItMS4wOTUtMi40ODItMC43NzNjMC4xNDYtMS41MTQsMS41NTUtMy4yMTYsMi45MTItMy43OTJjMS40MzktMC41OTcsMy41NzktMC41ODcsNC4zMDIsMS4wMzYgYzAuNzcyLDEuNzU5LDAuMDc4LDMuODAyLTAuNzYzLDUuMzk2Yy0wLjkxOCwxLjczMS0yLjEsMy4zMzMtMy4zNjMsNC44MjljLTEuMTE0LDEuMzI5LTIuNDMyLDIuNzg3LTQuMDkzLDMuNDIyIGMtMS44OTcsMC43MjMtMy4wMjEtMC42ODYtMy42NjctMi4zMThjLTAuNzA1LTEuNzc3LTEuMDU2LTMuNzcxLTEuNTY1LTUuNjIxQzQuODk4LDguNzI2LDQuNjQ0LDcuODM2LDQuMTM2LDcuMTkxIEMzLjQ3Myw2LjM1OCwyLjcyLDcuMTQxLDIuMDY1LDcuNTlDMS45NzcsNy41MDIsMi4xMTUsNy41NTEsMi4wNjUsNy41OUwyLjA2NSw3LjU5elwiIC8+PC9zdmc+JztcbiAgY29uc3Qgd2FybmluZyA9ICc8c3ZnIHdpZHRoPVwiMjBcIiBoZWlnaHQ9XCIyMFwiIHZpZXdCb3g9XCIwIDAgMjAgMjBcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+IDxjaXJjbGUgY3g9XCIxMFwiIGN5PVwiMTRcIiByPVwiMVwiIC8+IDxjaXJjbGUgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCIjMDAwXCIgc3Ryb2tlLXdpZHRoPVwiMS4xXCIgY3g9XCIxMFwiIGN5PVwiMTBcIiByPVwiOVwiIC8+IDxwYXRoIGQ9XCJNMTAuOTcsNy43MiBDMTAuODUsOS41NCAxMC41NiwxMS4yOSAxMC41NiwxMS4yOSBDMTAuNTEsMTEuODcgMTAuMjcsMTIgOS45OSwxMiBDOS42OSwxMiA5LjQ5LDExLjg3IDkuNDMsMTEuMjkgQzkuNDMsMTEuMjkgOS4xNiw5LjU0IDkuMDMsNy43MiBDOC45Niw2LjU0IDkuMDMsNiA5LjAzLDYgQzkuMDMsNS40NSA5LjQ2LDUuMDIgOS45OSw1IEMxMC41Myw1LjAxIDEwLjk3LDUuNDQgMTAuOTcsNiBDMTAuOTcsNiAxMS4wNCw2LjU0IDEwLjk3LDcuNzIgTDEwLjk3LDcuNzIgWlwiIC8+PC9zdmc+JztcbiAgY29uc3Qgd2hhdHNhcHAgPSAnPHN2ZyB3aWR0aD1cIjIwXCIgaGVpZ2h0PVwiMjBcIiB2aWV3Qm94PVwiMCAwIDIwIDIwXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPiA8cGF0aCBkPVwiTTE2LjcsMy4zYy0xLjgtMS44LTQuMS0yLjgtNi43LTIuOGMtNS4yLDAtOS40LDQuMi05LjQsOS40YzAsMS43LDAuNCwzLjMsMS4zLDQuN2wtMS4zLDQuOWw1LTEuM2MxLjQsMC44LDIuOSwxLjIsNC41LDEuMiBsMCwwbDAsMGM1LjIsMCw5LjQtNC4yLDkuNC05LjRDMTkuNSw3LjQsMTguNSw1LDE2LjcsMy4zIE0xMC4xLDE3LjdMMTAuMSwxNy43Yy0xLjQsMC0yLjgtMC40LTQtMS4xbC0wLjMtMC4ybC0zLDAuOGwwLjgtMi45IGwtMC4yLTAuM2MtMC44LTEuMi0xLjItMi43LTEuMi00LjJjMC00LjMsMy41LTcuOCw3LjgtNy44YzIuMSwwLDQuMSwwLjgsNS41LDIuM2MxLjUsMS41LDIuMywzLjQsMi4zLDUuNSBDMTcuOSwxNC4yLDE0LjQsMTcuNywxMC4xLDE3LjcgTTE0LjQsMTEuOWMtMC4yLTAuMS0xLjQtMC43LTEuNi0wLjhjLTAuMi0wLjEtMC40LTAuMS0wLjUsMC4xYy0wLjIsMC4yLTAuNiwwLjgtMC44LDAuOSBjLTAuMSwwLjItMC4zLDAuMi0wLjUsMC4xYy0wLjItMC4xLTEtMC40LTEuOS0xLjJjLTAuNy0wLjYtMS4yLTEuNC0xLjMtMS42Yy0wLjEtMC4yLDAtMC40LDAuMS0wLjVDOCw4LjgsOC4xLDguNyw4LjIsOC41IGMwLjEtMC4xLDAuMi0wLjIsMC4yLTAuNGMwLjEtMC4yLDAtMC4zLDAtMC40QzguNCw3LjYsNy45LDYuNSw3LjcsNkM3LjUsNS41LDcuMyw1LjYsNy4yLDUuNmMtMC4xLDAtMC4zLDAtMC40LDAgYy0wLjIsMC0wLjQsMC4xLTAuNiwwLjNjLTAuMiwwLjItMC44LDAuOC0wLjgsMmMwLDEuMiwwLjgsMi4zLDEsMi40YzAuMSwwLjIsMS43LDIuNSw0LDMuNWMwLjYsMC4yLDEsMC40LDEuMywwLjUgYzAuNiwwLjIsMS4xLDAuMiwxLjUsMC4xYzAuNS0wLjEsMS40LTAuNiwxLjYtMS4xYzAuMi0wLjUsMC4yLTEsMC4xLTEuMUMxNC44LDEyLjEsMTQuNiwxMiwxNC40LDExLjlcIiAvPjwvc3ZnPic7XG4gIGNvbnN0IHlvdXR1YmUgPSAnPHN2ZyB3aWR0aD1cIjIwXCIgaGVpZ2h0PVwiMjBcIiB2aWV3Qm94PVwiMCAwIDIwIDIwXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPiA8cGF0aCBkPVwiTTE1LDQuMWMxLDAuMSwyLjMsMCwzLDAuOGMwLjgsMC44LDAuOSwyLjEsMC45LDMuMUMxOSw5LjIsMTksMTAuOSwxOSwxMmMtMC4xLDEuMSwwLDIuNC0wLjUsMy40Yy0wLjUsMS4xLTEuNCwxLjUtMi41LDEuNiBjLTEuMiwwLjEtOC42LDAuMS0xMSwwYy0xLjEtMC4xLTIuNC0wLjEtMy4yLTFjLTAuNy0wLjgtMC43LTItMC44LTNDMSwxMS44LDEsMTAuMSwxLDguOWMwLTEuMSwwLTIuNCwwLjUtMy40QzIsNC41LDMsNC4zLDQuMSw0LjIgQzUuMyw0LjEsMTIuNiw0LDE1LDQuMXogTTgsNy41djZsNS41LTNMOCw3LjV6XCIgLz48L3N2Zz4nO1xuICBjb25zdCBJY29ucyA9IHtcbiAgICBhbGJ1bSxcbiAgICBiYW4sXG4gICAgYmVsbCxcbiAgICBib2x0LFxuICAgIGJvb2ttYXJrLFxuICAgIGNhbGVuZGFyLFxuICAgIGNhbWVyYSxcbiAgICBjYXJ0LFxuICAgIGNoZWNrLFxuICAgIGNsb2NrLFxuICAgIGNsb3NlLFxuICAgIGNvZGUsXG4gICAgY29nLFxuICAgIGNvbW1lbnQsXG4gICAgY29tbWVudGluZyxcbiAgICBjb21tZW50cyxcbiAgICBjb3B5LFxuICAgIGRhdGFiYXNlLFxuICAgIGRlc2t0b3AsXG4gICAgZG93bmxvYWQsXG4gICAgZXhwYW5kLFxuICAgIGZhY2Vib29rLFxuICAgIGZpbGUsXG4gICAgZm9sZGVyLFxuICAgIGZvcndhcmQsXG4gICAgZm91cnNxdWFyZSxcbiAgICBmdXR1cmUsXG4gICAgZ29vZ2xlLFxuICAgIGdyaWQsXG4gICAgaGFwcHksXG4gICAgaGFzaHRhZyxcbiAgICBoZWFydCxcbiAgICBoaXN0b3J5LFxuICAgIGhvbWUsXG4gICAgaW1hZ2UsXG4gICAgaW5mbyxcbiAgICBpbnN0YWdyYW0sXG4gICAgbGFwdG9wLFxuICAgIGxpZmVzYXZlcixcbiAgICBsaW5rLFxuICAgIGxpbmtlZGluLFxuICAgIGxpc3QsXG4gICAgbG9jYXRpb24sXG4gICAgbG9jayxcbiAgICBtYWlsLFxuICAgIG1lbnUsXG4gICAgbWludXMsXG4gICAgbW9yZSxcbiAgICBtb3ZlLFxuICAgIG51dCxcbiAgICBwZW5jaWwsXG4gICAgcGhvbmUsXG4gICAgcGxheSxcbiAgICBwbHVzLFxuICAgIHB1bGwsXG4gICAgcHVzaCxcbiAgICBxdWVzdGlvbixcbiAgICByZWNlaXZlcixcbiAgICByZWZyZXNoLFxuICAgIHJlcGx5LFxuICAgIHJzcyxcbiAgICBzZWFyY2gsXG4gICAgc2VydmVyLFxuICAgIHNldHRpbmdzLFxuICAgIHNocmluayxcbiAgICBzb2NpYWwsXG4gICAgc3RhcixcbiAgICB0YWJsZSxcbiAgICB0YWJsZXQsXG4gICAgdGFnLFxuICAgIHRodW1ibmFpbHMsXG4gICAgdHJhc2gsXG4gICAgdHVtYmxyLFxuICAgIHR2LFxuICAgIHR3aXR0ZXIsXG4gICAgdW5sb2NrLFxuICAgIHVwbG9hZCxcbiAgICB1c2VyLFxuICAgIHVzZXJzLFxuICAgIHZpbWVvLFxuICAgIHdhcm5pbmcsXG4gICAgd2hhdHNhcHAsXG4gICAgeW91dHViZSxcbiAgICAnYXJyb3ctZG93bic6XG4gICAgICAnPHN2ZyB3aWR0aD1cIjIwXCIgaGVpZ2h0PVwiMjBcIiB2aWV3Qm94PVwiMCAwIDIwIDIwXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPiA8cG9seWdvbiBwb2ludHM9XCIxMC41LDE2LjA4IDUuNjMsMTAuNjYgNi4zNywxMCAxMC41LDE0LjU4IDE0LjYzLDEwIDE1LjM3LDEwLjY2XCIgLz4gPGxpbmUgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCIjMDAwXCIgeDE9XCIxMC41XCIgeTE9XCI0XCIgeDI9XCIxMC41XCIgeTI9XCIxNVwiIC8+PC9zdmc+JyxcbiAgICAnYXJyb3ctbGVmdCc6XG4gICAgICAnPHN2ZyB3aWR0aD1cIjIwXCIgaGVpZ2h0PVwiMjBcIiB2aWV3Qm94PVwiMCAwIDIwIDIwXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPiA8cG9seWxpbmUgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCIjMDAwXCIgcG9pbnRzPVwiMTAgMTQgNSA5LjUgMTAgNVwiIC8+IDxsaW5lIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiIzAwMFwiIHgxPVwiMTZcIiB5MT1cIjkuNVwiIHgyPVwiNVwiIHkyPVwiOS41MlwiIC8+PC9zdmc+JyxcbiAgICAnYXJyb3ctcmlnaHQnOlxuICAgICAgJzxzdmcgd2lkdGg9XCIyMFwiIGhlaWdodD1cIjIwXCIgdmlld0JveD1cIjAgMCAyMCAyMFwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj4gPHBvbHlsaW5lIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiIzAwMFwiIHBvaW50cz1cIjEwIDUgMTUgOS41IDEwIDE0XCIgLz4gPGxpbmUgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCIjMDAwXCIgeDE9XCI0XCIgeTE9XCI5LjVcIiB4Mj1cIjE1XCIgeTI9XCI5LjVcIiAvPjwvc3ZnPicsXG4gICAgJ2Fycm93LXVwJzpcbiAgICAgICc8c3ZnIHdpZHRoPVwiMjBcIiBoZWlnaHQ9XCIyMFwiIHZpZXdCb3g9XCIwIDAgMjAgMjBcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+IDxwb2x5Z29uIHBvaW50cz1cIjEwLjUsNCAxNS4zNyw5LjQgMTQuNjMsMTAuMDggMTAuNSw1LjQ5IDYuMzcsMTAuMDggNS42Myw5LjRcIiAvPiA8bGluZSBmaWxsPVwibm9uZVwiIHN0cm9rZT1cIiMwMDBcIiB4MT1cIjEwLjVcIiB5MT1cIjE2XCIgeDI9XCIxMC41XCIgeTI9XCI1XCIgLz48L3N2Zz4nLFxuICAgICdjaGV2cm9uLWRvd24nOlxuICAgICAgJzxzdmcgd2lkdGg9XCIyMFwiIGhlaWdodD1cIjIwXCIgdmlld0JveD1cIjAgMCAyMCAyMFwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj4gPHBvbHlsaW5lIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiIzAwMFwiIHN0cm9rZS13aWR0aD1cIjEuMDNcIiBwb2ludHM9XCIxNiA3IDEwIDEzIDQgN1wiIC8+PC9zdmc+JyxcbiAgICAnY2hldnJvbi1sZWZ0JzpcbiAgICAgICc8c3ZnIHdpZHRoPVwiMjBcIiBoZWlnaHQ9XCIyMFwiIHZpZXdCb3g9XCIwIDAgMjAgMjBcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+IDxwb2x5bGluZSBmaWxsPVwibm9uZVwiIHN0cm9rZT1cIiMwMDBcIiBzdHJva2Utd2lkdGg9XCIxLjAzXCIgcG9pbnRzPVwiMTMgMTYgNyAxMCAxMyA0XCIgLz48L3N2Zz4nLFxuICAgICdjaGV2cm9uLXJpZ2h0JzpcbiAgICAgICc8c3ZnIHdpZHRoPVwiMjBcIiBoZWlnaHQ9XCIyMFwiIHZpZXdCb3g9XCIwIDAgMjAgMjBcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+IDxwb2x5bGluZSBmaWxsPVwibm9uZVwiIHN0cm9rZT1cIiMwMDBcIiBzdHJva2Utd2lkdGg9XCIxLjAzXCIgcG9pbnRzPVwiNyA0IDEzIDEwIDcgMTZcIiAvPjwvc3ZnPicsXG4gICAgJ2NoZXZyb24tdXAnOlxuICAgICAgJzxzdmcgd2lkdGg9XCIyMFwiIGhlaWdodD1cIjIwXCIgdmlld0JveD1cIjAgMCAyMCAyMFwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj4gPHBvbHlsaW5lIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiIzAwMFwiIHN0cm9rZS13aWR0aD1cIjEuMDNcIiBwb2ludHM9XCI0IDEzIDEwIDcgMTYgMTNcIiAvPjwvc3ZnPicsXG4gICAgJ2Nsb3VkLWRvd25sb2FkJzpcbiAgICAgICc8c3ZnIHdpZHRoPVwiMjBcIiBoZWlnaHQ9XCIyMFwiIHZpZXdCb3g9XCIwIDAgMjAgMjBcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+IDxwYXRoIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiIzAwMFwiIHN0cm9rZS13aWR0aD1cIjEuMVwiIGQ9XCJNNi41LDE0LjYxIEwzLjc1LDE0LjYxIEMxLjk2LDE0LjYxIDAuNSwxMy4xNyAwLjUsMTEuMzkgQzAuNSw5Ljc2IDEuNzIsOC40MSAzLjMsOC4yIEMzLjM4LDUuMzEgNS43NSwzIDguNjgsMyBDMTEuMTksMyAxMy4zMSw0LjcxIDEzLjg5LDcuMDIgQzE0LjM5LDYuOCAxNC45Myw2LjY4IDE1LjUsNi42OCBDMTcuNzEsNi42OCAxOS41LDguNDUgMTkuNSwxMC42NCBDMTkuNSwxMi44MyAxNy43MSwxNC42IDE1LjUsMTQuNiBMMTIuNSwxNC42XCIgLz4gPHBvbHlsaW5lIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiIzAwMFwiIHBvaW50cz1cIjExLjc1IDE2IDkuNSAxOC4yNSA3LjI1IDE2XCIgLz4gPHBhdGggZmlsbD1cIm5vbmVcIiBzdHJva2U9XCIjMDAwXCIgZD1cIk05LjUsMTggTDkuNSw5LjVcIiAvPjwvc3ZnPicsXG4gICAgJ2Nsb3VkLXVwbG9hZCc6XG4gICAgICAnPHN2ZyB3aWR0aD1cIjIwXCIgaGVpZ2h0PVwiMjBcIiB2aWV3Qm94PVwiMCAwIDIwIDIwXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPiA8cGF0aCBmaWxsPVwibm9uZVwiIHN0cm9rZT1cIiMwMDBcIiBzdHJva2Utd2lkdGg9XCIxLjFcIiBkPVwiTTYuNSwxNC42MSBMMy43NSwxNC42MSBDMS45NiwxNC42MSAwLjUsMTMuMTcgMC41LDExLjM5IEMwLjUsOS43NiAxLjcyLDguNDEgMy4zMSw4LjIgQzMuMzgsNS4zMSA1Ljc1LDMgOC42OCwzIEMxMS4xOSwzIDEzLjMxLDQuNzEgMTMuODksNy4wMiBDMTQuMzksNi44IDE0LjkzLDYuNjggMTUuNSw2LjY4IEMxNy43MSw2LjY4IDE5LjUsOC40NSAxOS41LDEwLjY0IEMxOS41LDEyLjgzIDE3LjcxLDE0LjYgMTUuNSwxNC42IEwxMi41LDE0LjZcIiAvPiA8cG9seWxpbmUgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCIjMDAwXCIgcG9pbnRzPVwiNy4yNSAxMS43NSA5LjUgOS41IDExLjc1IDExLjc1XCIgLz4gPHBhdGggZmlsbD1cIm5vbmVcIiBzdHJva2U9XCIjMDAwXCIgZD1cIk05LjUsMTggTDkuNSw5LjVcIiAvPjwvc3ZnPicsXG4gICAgJ2NyZWRpdC1jYXJkJzpcbiAgICAgICc8c3ZnIHdpZHRoPVwiMjBcIiBoZWlnaHQ9XCIyMFwiIHZpZXdCb3g9XCIwIDAgMjAgMjBcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+IDxyZWN0IGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiIzAwMFwiIHg9XCIxLjVcIiB5PVwiNC41XCIgd2lkdGg9XCIxN1wiIGhlaWdodD1cIjEyXCIgLz4gPHJlY3QgeD1cIjFcIiB5PVwiN1wiIHdpZHRoPVwiMThcIiBoZWlnaHQ9XCIzXCIgLz48L3N2Zz4nLFxuICAgICdmaWxlLWVkaXQnOlxuICAgICAgJzxzdmcgd2lkdGg9XCIyMFwiIGhlaWdodD1cIjIwXCIgdmlld0JveD1cIjAgMCAyMCAyMFwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj4gPHBhdGggZmlsbD1cIm5vbmVcIiBzdHJva2U9XCIjMDAwXCIgZD1cIk0xOC42NSwxLjY4IEMxOC40MSwxLjQ1IDE4LjEwOSwxLjMzIDE3LjgxLDEuMzMgQzE3LjQ5OSwxLjMzIDE3LjIwOSwxLjQ1IDE2Ljk4LDEuNjggTDguOTIsOS43NiBMOCwxMi4zMyBMMTAuNTUsMTEuNDEgTDE4LjY1MSwzLjM0IEMxOS4xMiwyLjg3IDE5LjEyLDIuMTUgMTguNjUsMS42OCBMMTguNjUsMS42OCBMMTguNjUsMS42OCBaXCIgLz4gPHBvbHlsaW5lIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiIzAwMFwiIHBvaW50cz1cIjE2LjUgOC40ODIgMTYuNSAxOC41IDMuNSAxOC41IDMuNSAxLjUgMTQuMjExIDEuNVwiIC8+PC9zdmc+JyxcbiAgICAnZ29vZ2xlLXBsdXMnOlxuICAgICAgJzxzdmcgd2lkdGg9XCIyMFwiIGhlaWdodD1cIjIwXCIgdmlld0JveD1cIjAgMCAyMCAyMFwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj4gPHBhdGggZD1cIk0xMi45LDljMCwyLjctMC42LDUtMy4yLDYuM2MtMy43LDEuOC04LjEsMC4yLTkuNC0zLjZDLTEuMSw3LjYsMS45LDMuMyw2LjEsM2MxLjctMC4xLDMuMiwwLjMsNC42LDEuMyBjMC4xLDAuMSwwLjMsMC4yLDAuNCwwLjRjLTAuNSwwLjUtMS4yLDEtMS43LDEuNmMtMS0wLjgtMi4xLTEuMS0zLjUtMC45QzUsNS42LDQuMiw2LDMuNiw2LjdjLTEuMywxLjMtMS41LDMuNC0wLjUsNSBjMSwxLjcsMi42LDIuMyw0LjYsMS45YzEuNC0wLjMsMi40LTEuMiwyLjYtMi42SDYuOVY5SDEyLjl6XCIgLz4gPHBvbHlnb24gcG9pbnRzPVwiMjAsOSAyMCwxMSAxOCwxMSAxOCwxMyAxNiwxMyAxNiwxMSAxNCwxMSAxNCw5IDE2LDkgMTYsNyAxOCw3IDE4LDkgXCIgLz48L3N2Zz4nLFxuICAgICdtaW51cy1jaXJjbGUnOlxuICAgICAgJzxzdmcgd2lkdGg9XCIyMFwiIGhlaWdodD1cIjIwXCIgdmlld0JveD1cIjAgMCAyMCAyMFwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj4gPGNpcmNsZSBmaWxsPVwibm9uZVwiIHN0cm9rZT1cIiMwMDBcIiBzdHJva2Utd2lkdGg9XCIxLjFcIiBjeD1cIjkuNVwiIGN5PVwiOS41XCIgcj1cIjlcIiAvPiA8bGluZSBmaWxsPVwibm9uZVwiIHN0cm9rZT1cIiMwMDBcIiB4MT1cIjVcIiB5MT1cIjkuNVwiIHgyPVwiMTRcIiB5Mj1cIjkuNVwiIC8+PC9zdmc+JyxcbiAgICAnbW9yZS12ZXJ0aWNhbCc6XG4gICAgICAnPHN2ZyB3aWR0aD1cIjIwXCIgaGVpZ2h0PVwiMjBcIiB2aWV3Qm94PVwiMCAwIDIwIDIwXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPiA8Y2lyY2xlIGN4PVwiMTBcIiBjeT1cIjNcIiByPVwiMlwiIC8+IDxjaXJjbGUgY3g9XCIxMFwiIGN5PVwiMTBcIiByPVwiMlwiIC8+IDxjaXJjbGUgY3g9XCIxMFwiIGN5PVwiMTdcIiByPVwiMlwiIC8+PC9zdmc+JyxcbiAgICAncGFpbnQtYnVja2V0JzpcbiAgICAgICc8c3ZnIHdpZHRoPVwiMjBcIiBoZWlnaHQ9XCIyMFwiIHZpZXdCb3g9XCIwIDAgMjAgMjBcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+IDxwYXRoIGQ9XCJNMTAuMjEsMSBMMCwxMS4yMSBMOC4xLDE5LjMxIEwxOC4zMSw5LjEgTDEwLjIxLDEgTDEwLjIxLDEgWiBNMTYuODksOS4xIEwxNSwxMSBMMS43LDExIEwxMC4yMSwyLjQyIEwxNi44OSw5LjEgWlwiIC8+IDxwYXRoIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiIzAwMFwiIHN0cm9rZS13aWR0aD1cIjEuMVwiIGQ9XCJNNi40MiwyLjMzIEwxMS43LDcuNjFcIiAvPiA8cGF0aCBkPVwiTTE4LjQ5LDEyIEMxOC40OSwxMiAyMCwxNC4wNiAyMCwxNS4zNiBDMjAsMTYuMjggMTkuMjQsMTcgMTguNDksMTcgTDE4LjQ5LDE3IEMxNy43NCwxNyAxNywxNi4yOCAxNywxNS4zNiBDMTcsMTQuMDYgMTguNDksMTIgMTguNDksMTIgTDE4LjQ5LDEyIFpcIiAvPjwvc3ZnPicsXG4gICAgJ3Bob25lLWxhbmRzY2FwZSc6XG4gICAgICAnPHN2ZyB3aWR0aD1cIjIwXCIgaGVpZ2h0PVwiMjBcIiB2aWV3Qm94PVwiMCAwIDIwIDIwXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPiA8cGF0aCBmaWxsPVwibm9uZVwiIHN0cm9rZT1cIiMwMDBcIiBkPVwiTTE3LDUuNSBDMTcuOCw1LjUgMTguNSw2LjIgMTguNSw3IEwxOC41LDE0IEMxOC41LDE0LjggMTcuOCwxNS41IDE3LDE1LjUgTDMsMTUuNSBDMi4yLDE1LjUgMS41LDE0LjggMS41LDE0IEwxLjUsNyBDMS41LDYuMiAyLjIsNS41IDMsNS41IEwxNyw1LjUgTDE3LDUuNSBMMTcsNS41IFpcIiAvPiA8Y2lyY2xlIGN4PVwiMy44XCIgY3k9XCIxMC41XCIgcj1cIjAuOFwiIC8+PC9zdmc+JyxcbiAgICAncGxheS1jaXJjbGUnOlxuICAgICAgJzxzdmcgd2lkdGg9XCIyMFwiIGhlaWdodD1cIjIwXCIgdmlld0JveD1cIjAgMCAyMCAyMFwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj4gPHBvbHlnb24gZmlsbD1cIm5vbmVcIiBzdHJva2U9XCIjMDAwXCIgc3Ryb2tlLXdpZHRoPVwiMS4xXCIgcG9pbnRzPVwiOC41IDcgMTMuNSAxMCA4LjUgMTNcIiAvPiA8Y2lyY2xlIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiIzAwMFwiIHN0cm9rZS13aWR0aD1cIjEuMVwiIGN4PVwiMTBcIiBjeT1cIjEwXCIgcj1cIjlcIiAvPjwvc3ZnPicsXG4gICAgJ3BsdXMtY2lyY2xlJzpcbiAgICAgICc8c3ZnIHdpZHRoPVwiMjBcIiBoZWlnaHQ9XCIyMFwiIHZpZXdCb3g9XCIwIDAgMjAgMjBcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+IDxjaXJjbGUgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCIjMDAwXCIgc3Ryb2tlLXdpZHRoPVwiMS4xXCIgY3g9XCI5LjVcIiBjeT1cIjkuNVwiIHI9XCI5XCIgLz4gPGxpbmUgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCIjMDAwXCIgeDE9XCI5LjVcIiB5MT1cIjVcIiB4Mj1cIjkuNVwiIHkyPVwiMTRcIiAvPiA8bGluZSBmaWxsPVwibm9uZVwiIHN0cm9rZT1cIiMwMDBcIiB4MT1cIjVcIiB5MT1cIjkuNVwiIHgyPVwiMTRcIiB5Mj1cIjkuNVwiIC8+PC9zdmc+JyxcbiAgICAnc2lnbi1pbic6XG4gICAgICAnPHN2ZyB3aWR0aD1cIjIwXCIgaGVpZ2h0PVwiMjBcIiB2aWV3Qm94PVwiMCAwIDIwIDIwXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPiA8cG9seWdvbiBwb2ludHM9XCI3IDIgMTcgMiAxNyAxNyA3IDE3IDcgMTYgMTYgMTYgMTYgMyA3IDNcIiAvPiA8cG9seWdvbiBwb2ludHM9XCI5LjEgMTMuNCA4LjUgMTIuOCAxMS4yOCAxMCA0IDEwIDQgOSAxMS4yOCA5IDguNSA2LjIgOS4xIDUuNjIgMTMgOS41XCIgLz48L3N2Zz4nLFxuICAgICdzaWduLW91dCc6XG4gICAgICAnPHN2ZyB3aWR0aD1cIjIwXCIgaGVpZ2h0PVwiMjBcIiB2aWV3Qm94PVwiMCAwIDIwIDIwXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPiA8cG9seWdvbiBwb2ludHM9XCIxMy4xIDEzLjQgMTIuNSAxMi44IDE1LjI4IDEwIDggMTAgOCA5IDE1LjI4IDkgMTIuNSA2LjIgMTMuMSA1LjYyIDE3IDkuNVwiIC8+IDxwb2x5Z29uIHBvaW50cz1cIjEzIDIgMyAyIDMgMTcgMTMgMTcgMTMgMTYgNCAxNiA0IDMgMTMgM1wiIC8+PC9zdmc+JyxcbiAgICAndGFibGV0LWxhbmRzY2FwZSc6XG4gICAgICAnPHN2ZyB3aWR0aD1cIjIwXCIgaGVpZ2h0PVwiMjBcIiB2aWV3Qm94PVwiMCAwIDIwIDIwXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPiA8cGF0aCBmaWxsPVwibm9uZVwiIHN0cm9rZT1cIiMwMDBcIiBkPVwiTTEuNSw1IEMxLjUsNC4yIDIuMiwzLjUgMywzLjUgTDE3LDMuNSBDMTcuOCwzLjUgMTguNSw0LjIgMTguNSw1IEwxOC41LDE2IEMxOC41LDE2LjggMTcuOCwxNy41IDE3LDE3LjUgTDMsMTcuNSBDMi4yLDE3LjUgMS41LDE2LjggMS41LDE2IEwxLjUsNSBMMS41LDUgTDEuNSw1IFpcIiAvPiA8Y2lyY2xlIGN4PVwiMy43XCIgY3k9XCIxMC41XCIgcj1cIjAuOFwiIC8+PC9zdmc+JyxcbiAgICAndHJpYW5nbGUtZG93bic6XG4gICAgICAnPHN2ZyB3aWR0aD1cIjIwXCIgaGVpZ2h0PVwiMjBcIiB2aWV3Qm94PVwiMCAwIDIwIDIwXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPiA8cG9seWdvbiBwb2ludHM9XCI1IDcgMTUgNyAxMCAxMlwiIC8+PC9zdmc+JyxcbiAgICAndHJpYW5nbGUtbGVmdCc6XG4gICAgICAnPHN2ZyB3aWR0aD1cIjIwXCIgaGVpZ2h0PVwiMjBcIiB2aWV3Qm94PVwiMCAwIDIwIDIwXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPiA8cG9seWdvbiBwb2ludHM9XCIxMiA1IDcgMTAgMTIgMTVcIiAvPjwvc3ZnPicsXG4gICAgJ3RyaWFuZ2xlLXJpZ2h0JzpcbiAgICAgICc8c3ZnIHdpZHRoPVwiMjBcIiBoZWlnaHQ9XCIyMFwiIHZpZXdCb3g9XCIwIDAgMjAgMjBcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+IDxwb2x5Z29uIHBvaW50cz1cIjggNSAxMyAxMCA4IDE1XCIgLz48L3N2Zz4nLFxuICAgICd0cmlhbmdsZS11cCc6XG4gICAgICAnPHN2ZyB3aWR0aD1cIjIwXCIgaGVpZ2h0PVwiMjBcIiB2aWV3Qm94PVwiMCAwIDIwIDIwXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPiA8cG9seWdvbiBwb2ludHM9XCI1IDEzIDEwIDggMTUgMTNcIiAvPjwvc3ZnPicsXG4gICAgJ2JrLWFycm93LWRvd24nOlxuICAgICAgJzxzdmcgY2xhc3M9XCJiay1pY29uXCIgIHZpZXdCb3g9XCIwIDAgMTcgMjBcIiB2ZXJzaW9uPVwiMS4xXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHhtbG5zOnhsaW5rPVwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGlua1wiPiA8ZyBpZD1cIlBhZ2UtMVwiIHN0cm9rZT1cIm5vbmVcIiBzdHJva2Utd2lkdGg9XCIxXCIgZmlsbD1cIm5vbmVcIiBmaWxsLXJ1bGU9XCJldmVub2RkXCI+IDxnIGlkPVwiRlJFRTEwMGljb25zXCIgdHJhbnNmb3JtPVwidHJhbnNsYXRlKC0yNy4wMDAwMDAsIC0xNjEuMDAwMDAwKVwiIGZpbGw9XCIjMUExOTE5XCI+IDxnIGlkPVwiQVwiIHRyYW5zZm9ybT1cInRyYW5zbGF0ZSgwLjAwMDAwMCwgMTAwLjAwMDAwMClcIj4gPGcgaWQ9XCIxQVwiIHRyYW5zZm9ybT1cInRyYW5zbGF0ZSgzNi4wMDAwMDAsIDcxLjUwMDAwMCkgcm90YXRlKC05MC4wMDAwMDApIHRyYW5zbGF0ZSgtMzYuMDAwMDAwLCAtNzEuNTAwMDAwKSB0cmFuc2xhdGUoMjYuMDAwMDAwLCA2My4wMDAwMDApXCI+IDxwYXRoIGQ9XCJNMTguOTY0LDcuMjkxMjQxMzggTDMuNDg0LDcuMjkxMjQxMzggTDkuMjA3NDI4NTcsMS41Mjg4Mjc1OSBDOS41NDUxNDI4NiwxLjE4ODI0MTM4IDkuNTUwMjg1NzEsMC42MzE5MzEwMzQgOS4yMTg4NTcxNCwwLjI4NDg5NjU1MiBDOC44ODYyODU3MSwtMC4wNjE1NTE3MjQxIDguMzQ0LC0wLjA2NjI0MTM3OTMgOC4wMDYyODU3MSwwLjI3MzE3MjQxNCBMMC44MDQsNy41MjQ1NTE3MiBDMC42NDA1NzE0MjksNy42ODkyNzU4NiAwLjU0OCw3LjkxMzc5MzEgMC41NDc0Mjg1NzEsOC4xNDgyNzU4NiBDMC41NDYyODU3MTQsOC4zODI3NTg2MiAwLjYzNjU3MTQyOSw4LjYwODQ0ODI4IDAuNzk4Mjg1NzE0LDguNzc0MzQ0ODMgTDguMDEyNTcxNDMsMTYuMTc1MjA2OSBDOC4xOCwxNi4zNDY5NjU1IDguMzk5NDI4NTcsMTYuNDMyNTUxNyA4LjYxODg1NzE0LDE2LjQzMjU1MTcgQzguODM3NzE0MjksMTYuNDMyNTUxNyA5LjA1NzE0Mjg2LDE2LjM0Njk2NTUgOS4yMjQ1NzE0MywxNi4xNzUyMDY5IEM5LjU1OTQyODU3LDE1LjgzMTY4OTcgOS41NTk0Mjg1NywxNS4yNzQ3OTMxIDkuMjI0NTcxNDMsMTQuOTMxODYyMSBMMy40OTA4NTcxNCw5LjA0OTg2MjA3IEwxOC45NjQsOS4wNDk4NjIwNyBDMTkuNDM3MTQyOSw5LjA0OTg2MjA3IDE5LjgyMTE0MjksOC42NTU5MzEwMyAxOS44MjExNDI5LDguMTcwNTUxNzIgQzE5LjgyMTE0MjksNy42ODQ1ODYyMSAxOS40MzcxNDI5LDcuMjkxMjQxMzggMTguOTY0LDcuMjkxMjQxMzhcIj48L3BhdGg+IDwvZz4gPC9nPiA8L2c+IDwvZz48L3N2Zz4nLFxuICAgICdiay1hcnJvdy1sZWZ0JzpcbiAgICAgICc8c3ZnICBjbGFzcz1cImJrLWljb25cIiB2aWV3Qm94PVwiMCAwIDIwIDE3XCIgdmVyc2lvbj1cIjEuMVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB4bWxuczp4bGluaz1cImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmtcIj4gPGcgaWQ9XCJQYWdlLTFcIiBzdHJva2U9XCJub25lXCIgc3Ryb2tlLXdpZHRoPVwiMVwiIGZpbGw9XCJub25lXCIgZmlsbC1ydWxlPVwiZXZlbm9kZFwiPiA8ZyBpZD1cIkZSRUUxMDBpY29uc1wiIHRyYW5zZm9ybT1cInRyYW5zbGF0ZSgwLjAwMDAwMCwgLTExNy4wMDAwMDApXCIgZmlsbD1cIiMxQTE5MTlcIj4gPGcgaWQ9XCJBXCIgdHJhbnNmb3JtPVwidHJhbnNsYXRlKDAuMDAwMDAwLCAxMDAuMDAwMDAwKVwiPiA8ZyBpZD1cIjFBXCIgdHJhbnNmb3JtPVwidHJhbnNsYXRlKDAuMDAwMDAwLCAxNy4wMDAwMDApXCI+IDxwYXRoIGQ9XCJNMTguOTY0LDcuMjkxMjQxMzggTDMuNDg0LDcuMjkxMjQxMzggTDkuMjA3NDI4NTcsMS41Mjg4Mjc1OSBDOS41NDUxNDI4NiwxLjE4ODI0MTM4IDkuNTUwMjg1NzEsMC42MzE5MzEwMzQgOS4yMTg4NTcxNCwwLjI4NDg5NjU1MiBDOC44ODYyODU3MSwtMC4wNjE1NTE3MjQxIDguMzQ0LC0wLjA2NjI0MTM3OTMgOC4wMDYyODU3MSwwLjI3MzE3MjQxNCBMMC44MDQsNy41MjQ1NTE3MiBDMC42NDA1NzE0MjksNy42ODkyNzU4NiAwLjU0OCw3LjkxMzc5MzEgMC41NDc0Mjg1NzEsOC4xNDgyNzU4NiBDMC41NDYyODU3MTQsOC4zODI3NTg2MiAwLjYzNjU3MTQyOSw4LjYwODQ0ODI4IDAuNzk4Mjg1NzE0LDguNzc0MzQ0ODMgTDguMDEyNTcxNDMsMTYuMTc1MjA2OSBDOC4xOCwxNi4zNDY5NjU1IDguMzk5NDI4NTcsMTYuNDMyNTUxNyA4LjYxODg1NzE0LDE2LjQzMjU1MTcgQzguODM3NzE0MjksMTYuNDMyNTUxNyA5LjA1NzE0Mjg2LDE2LjM0Njk2NTUgOS4yMjQ1NzE0MywxNi4xNzUyMDY5IEM5LjU1OTQyODU3LDE1LjgzMTY4OTcgOS41NTk0Mjg1NywxNS4yNzQ3OTMxIDkuMjI0NTcxNDMsMTQuOTMxODYyMSBMMy40OTA4NTcxNCw5LjA0OTg2MjA3IEwxOC45NjQsOS4wNDk4NjIwNyBDMTkuNDM3MTQyOSw5LjA0OTg2MjA3IDE5LjgyMTE0MjksOC42NTU5MzEwMyAxOS44MjExNDI5LDguMTcwNTUxNzIgQzE5LjgyMTE0MjksNy42ODQ1ODYyMSAxOS40MzcxNDI5LDcuMjkxMjQxMzggMTguOTY0LDcuMjkxMjQxMzhcIj48L3BhdGg+IDwvZz4gPC9nPiA8L2c+IDwvZz48L3N2Zz4nLFxuICAgICdiay1hcnJvdy1yaWdodCc6XG4gICAgICAnPHN2ZyBjbGFzcz1cImJrLWljb25cIiB2aWV3Qm94PVwiMCAwIDIwIDE3XCIgdmVyc2lvbj1cIjEuMVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB4bWxuczp4bGluaz1cImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmtcIj4gPGcgaWQ9XCJQYWdlLTFcIiBzdHJva2U9XCJub25lXCIgc3Ryb2tlLXdpZHRoPVwiMVwiIGZpbGw9XCJub25lXCIgZmlsbC1ydWxlPVwiZXZlbm9kZFwiPiA8ZyBpZD1cIkZSRUUxMDBpY29uc1wiIHRyYW5zZm9ybT1cInRyYW5zbGF0ZSgtNjkuMDAwMDAwLCAtMTAwLjAwMDAwMClcIiBmaWxsPVwiIzFBMTkxOVwiPiA8ZyBpZD1cIkFcIiB0cmFuc2Zvcm09XCJ0cmFuc2xhdGUoMC4wMDAwMDAsIDEwMC4wMDAwMDApXCI+IDxnIGlkPVwiMUFcIiB0cmFuc2Zvcm09XCJ0cmFuc2xhdGUoNzkuMDAwMDAwLCA4LjUwMDAwMCkgcm90YXRlKC0xODAuMDAwMDAwKSB0cmFuc2xhdGUoLTc5LjAwMDAwMCwgLTguNTAwMDAwKSB0cmFuc2xhdGUoNjkuMDAwMDAwLCAwLjAwMDAwMClcIj4gPHBhdGggZD1cIk0xOC45NjQsNy4yOTEyNDEzOCBMMy40ODQsNy4yOTEyNDEzOCBMOS4yMDc0Mjg1NywxLjUyODgyNzU5IEM5LjU0NTE0Mjg2LDEuMTg4MjQxMzggOS41NTAyODU3MSwwLjYzMTkzMTAzNCA5LjIxODg1NzE0LDAuMjg0ODk2NTUyIEM4Ljg4NjI4NTcxLC0wLjA2MTU1MTcyNDEgOC4zNDQsLTAuMDY2MjQxMzc5MyA4LjAwNjI4NTcxLDAuMjczMTcyNDE0IEwwLjgwNCw3LjUyNDU1MTcyIEMwLjY0MDU3MTQyOSw3LjY4OTI3NTg2IDAuNTQ4LDcuOTEzNzkzMSAwLjU0NzQyODU3MSw4LjE0ODI3NTg2IEMwLjU0NjI4NTcxNCw4LjM4Mjc1ODYyIDAuNjM2NTcxNDI5LDguNjA4NDQ4MjggMC43OTgyODU3MTQsOC43NzQzNDQ4MyBMOC4wMTI1NzE0MywxNi4xNzUyMDY5IEM4LjE4LDE2LjM0Njk2NTUgOC4zOTk0Mjg1NywxNi40MzI1NTE3IDguNjE4ODU3MTQsMTYuNDMyNTUxNyBDOC44Mzc3MTQyOSwxNi40MzI1NTE3IDkuMDU3MTQyODYsMTYuMzQ2OTY1NSA5LjIyNDU3MTQzLDE2LjE3NTIwNjkgQzkuNTU5NDI4NTcsMTUuODMxNjg5NyA5LjU1OTQyODU3LDE1LjI3NDc5MzEgOS4yMjQ1NzE0MywxNC45MzE4NjIxIEwzLjQ5MDg1NzE0LDkuMDQ5ODYyMDcgTDE4Ljk2NCw5LjA0OTg2MjA3IEMxOS40MzcxNDI5LDkuMDQ5ODYyMDcgMTkuODIxMTQyOSw4LjY1NTkzMTAzIDE5LjgyMTE0MjksOC4xNzA1NTE3MiBDMTkuODIxMTQyOSw3LjY4NDU4NjIxIDE5LjQzNzE0MjksNy4yOTEyNDEzOCAxOC45NjQsNy4yOTEyNDEzOFwiPjwvcGF0aD4gPC9nPiA8L2c+IDwvZz4gPC9nPjwvc3ZnPicsXG4gICAgJ2JrLWFycm93LXVwJzpcbiAgICAgICc8c3ZnIGNsYXNzPVwiYmstaWNvblwiICB2aWV3Qm94PVwiMCAwIDE3IDIwXCIgdmVyc2lvbj1cIjEuMVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB4bWxuczp4bGluaz1cImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmtcIj4gPGcgaWQ9XCJQYWdlLTFcIiBzdHJva2U9XCJub25lXCIgc3Ryb2tlLXdpZHRoPVwiMVwiIGZpbGw9XCJub25lXCIgZmlsbC1ydWxlPVwiZXZlbm9kZFwiPiA8ZyBpZD1cIkZSRUUxMDBpY29uc1wiIHRyYW5zZm9ybT1cInRyYW5zbGF0ZSgtODEuMDAwMDAwLCAtMTQxLjAwMDAwMClcIiBmaWxsPVwiIzFBMTkxOVwiPiA8ZyBpZD1cIkFcIiB0cmFuc2Zvcm09XCJ0cmFuc2xhdGUoMC4wMDAwMDAsIDEwMC4wMDAwMDApXCI+IDxnIGlkPVwiMUFcIiB0cmFuc2Zvcm09XCJ0cmFuc2xhdGUoODkuMDAwMDAwLCA1MC41MDAwMDApIHJvdGF0ZSgtMjcwLjAwMDAwMCkgdHJhbnNsYXRlKC04OS4wMDAwMDAsIC01MC41MDAwMDApIHRyYW5zbGF0ZSg3OS4wMDAwMDAsIDQyLjAwMDAwMClcIj4gPHBhdGggZD1cIk0xOC45NjQsNy4yOTEyNDEzOCBMMy40ODQsNy4yOTEyNDEzOCBMOS4yMDc0Mjg1NywxLjUyODgyNzU5IEM5LjU0NTE0Mjg2LDEuMTg4MjQxMzggOS41NTAyODU3MSwwLjYzMTkzMTAzNCA5LjIxODg1NzE0LDAuMjg0ODk2NTUyIEM4Ljg4NjI4NTcxLC0wLjA2MTU1MTcyNDEgOC4zNDQsLTAuMDY2MjQxMzc5MyA4LjAwNjI4NTcxLDAuMjczMTcyNDE0IEwwLjgwNCw3LjUyNDU1MTcyIEMwLjY0MDU3MTQyOSw3LjY4OTI3NTg2IDAuNTQ4LDcuOTEzNzkzMSAwLjU0NzQyODU3MSw4LjE0ODI3NTg2IEMwLjU0NjI4NTcxNCw4LjM4Mjc1ODYyIDAuNjM2NTcxNDI5LDguNjA4NDQ4MjggMC43OTgyODU3MTQsOC43NzQzNDQ4MyBMOC4wMTI1NzE0MywxNi4xNzUyMDY5IEM4LjE4LDE2LjM0Njk2NTUgOC4zOTk0Mjg1NywxNi40MzI1NTE3IDguNjE4ODU3MTQsMTYuNDMyNTUxNyBDOC44Mzc3MTQyOSwxNi40MzI1NTE3IDkuMDU3MTQyODYsMTYuMzQ2OTY1NSA5LjIyNDU3MTQzLDE2LjE3NTIwNjkgQzkuNTU5NDI4NTcsMTUuODMxNjg5NyA5LjU1OTQyODU3LDE1LjI3NDc5MzEgOS4yMjQ1NzE0MywxNC45MzE4NjIxIEwzLjQ5MDg1NzE0LDkuMDQ5ODYyMDcgTDE4Ljk2NCw5LjA0OTg2MjA3IEMxOS40MzcxNDI5LDkuMDQ5ODYyMDcgMTkuODIxMTQyOSw4LjY1NTkzMTAzIDE5LjgyMTE0MjksOC4xNzA1NTE3MiBDMTkuODIxMTQyOSw3LjY4NDU4NjIxIDE5LjQzNzE0MjksNy4yOTEyNDEzOCAxOC45NjQsNy4yOTEyNDEzOFwiPjwvcGF0aD4gPC9nPiA8L2c+IDwvZz4gPC9nPjwvc3ZnPicsXG4gICAgJ2JrLWNhcic6XG4gICAgICAnPHN2ZyBjbGFzcz1cImJrLWljb25cIiB2ZXJzaW9uPVwiMS4xXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMjRcIiBoZWlnaHQ9XCIyNFwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIj48cGF0aCBkPVwiTTUuMDE2IDExLjAxNmgxMy45NjlsLTEuNS00LjVoLTEwLjk2OXpNMTcuNDg0IDE1Ljk4NGMwLjg0NCAwIDEuNS0wLjY1NiAxLjUtMS41cy0wLjY1Ni0xLjUtMS41LTEuNS0xLjUgMC42NTYtMS41IDEuNSAwLjY1NiAxLjUgMS41IDEuNXpNNi41MTYgMTUuOTg0YzAuODQ0IDAgMS41LTAuNjU2IDEuNS0xLjVzLTAuNjU2LTEuNS0xLjUtMS41LTEuNSAwLjY1Ni0xLjUgMS41IDAuNjU2IDEuNSAxLjUgMS41ek0xOC45MzggNmwyLjA2MyA2djguMDE2YzAgMC41NjMtMC40MjIgMC45ODQtMC45ODQgMC45ODRoLTEuMDMxYy0wLjU2MyAwLTAuOTg0LTAuNDIyLTAuOTg0LTAuOTg0di0xLjAzMWgtMTJ2MS4wMzFjMCAwLjU2My0wLjQyMiAwLjk4NC0wLjk4NCAwLjk4NGgtMS4wMzFjLTAuNTYzIDAtMC45ODQtMC40MjItMC45ODQtMC45ODR2LTguMDE2bDIuMDYzLTZjMC4xODgtMC42MDkgMC43OTctMC45ODQgMS40NTMtMC45ODRoMTAuOTY5YzAuNjU2IDAgMS4yNjYgMC4zNzUgMS40NTMgMC45ODR6XCI+PC9wYXRoPjwvc3ZnPicsXG4gICAgJ2JrLWNoZWNrJzpcbiAgICAgICc8c3ZnIGNsYXNzPVwiYmstaWNvblwiIHZpZXdCb3g9XCIwIDAgMjggMjBcIiB2ZXJzaW9uPVwiMS4xXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHhtbG5zOnhsaW5rPVwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGlua1wiPiA8ZyBpZD1cIlBhZ2UtMVwiIHN0cm9rZT1cIm5vbmVcIiBzdHJva2Utd2lkdGg9XCIxXCIgZmlsbD1cIm5vbmVcIiBmaWxsLXJ1bGU9XCJldmVub2RkXCI+IDxwYXRoIGQ9XCJNOS4xNTA0OTg1MSwxNS41NTA3NDkgQzcuMzQ2MzM3MjgsMTMuMDczNzI2NiA1Ljk5MzIxNjM1LDExLjIxNTk1OTcgNS4wOTExMzU3NCw5Ljk3NzQ0ODQ5IEM0LjYyNDcwMzg3LDkuMzM3MDYxMDMgMy45MjUwNTYwNiw4LjM3NjQ3OTg1IDIuOTkyMTkyMzMsNy4wOTU3MDQ5NCBDMi41NDQ0NTUxNCw2LjQ4MDk4NDMzIDEuNjcxMzE0MTYsNi4zNDE2NTIxNCAxLjA0ODI5NTgsNi43OTMxNzI3MiBDMC40MjA5MzM4NzksNy4yNDc4NDExOSAwLjI4NTQ3NzIxMyw4LjExMjIwMTAzIDAuNzM2MDQzMzA4LDguNzMwODA1NTIgTDcuMzAwMzQwNTcsMTcuNzQzMjU1IEM3LjM3MDAyNjU3LDE3LjgzODkzMDQgNy40NTAwMTc1NywxNy45MjMwOSA3LjUzNzc2NjY4LDE3Ljk5NTI5ODYgQzcuNTgwNDI1OTcsMTguMTA1ODY3MiA3LjYzODA4MTE1LDE4LjIxMjc0MjIgNy43MTExODUxMiwxOC4zMTMxMTAyIEM4LjE2Njk5MDIzLDE4LjkzODkwNzcgOS4wMzcxNTM4LDE5LjA3MTM4NjUgOS42NjE3OTg0MywxOC42MTg2ODczIEwyNy44OTM0MTE1LDUuNDA1Njc2ODkgQzI4LjUxNzg0MzIsNC45NTMxMzE5OCAyOC42NTc0ODU5LDQuMDgyMTk1NzYgMjguMjA0ODM2NSwzLjQ2MDczMTAzIEMyNy43NDkwMzE0LDIuODM0OTMzNTcgMjYuODc4ODY3OSwyLjcwMjQ1NDgzIDI2LjI1NDIyMzIsMy4xNTUxNTM5OSBMOS4xNTA0OTg1MSwxNS41NTA3NDkgWlwiIGlkPVwiaWNfdGlja1wiIGZpbGw9XCIjRkZGRkZGXCIgZmlsbC1ydWxlPVwibm9uemVyb1wiIHRyYW5zZm9ybT1cInRyYW5zbGF0ZSgxNC40NzA2MTcsIDEwLjg4NjkyMSkgcm90YXRlKC0xMC4wMDAwMDApIHRyYW5zbGF0ZSgtMTQuNDcwNjE3LCAtMTAuODg2OTIxKSBcIj48L3BhdGg+IDwvZz48L3N2Zz4nLFxuICAgICdiay1jaGV2cm9uLWRvd24nOlxuICAgICAgJzxzdmcgY2xhc3M9XCJiay1pY29uXCIgdmlld0JveD1cIjAgMCAyMCAxMVwiIHZlcnNpb249XCIxLjFcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgeG1sbnM6eGxpbms9XCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rXCI+IDxnIGlkPVwiUGFnZS0xXCIgc3Ryb2tlPVwibm9uZVwiIHN0cm9rZS13aWR0aD1cIjFcIiBmaWxsPVwibm9uZVwiIGZpbGwtcnVsZT1cImV2ZW5vZGRcIj4gPGcgaWQ9XCI2QVwiIHRyYW5zZm9ybT1cInRyYW5zbGF0ZSgxMC4wMDAwMDAsIDUuNTU1NTU2KSBzY2FsZSgtMSwgMSkgcm90YXRlKDkwLjAwMDAwMCkgdHJhbnNsYXRlKC0xMC4wMDAwMDAsIC01LjU1NTU1NikgdHJhbnNsYXRlKDQuNDQ0NDQ0LCAtNC40NDQ0NDQpXCIgZmlsbD1cIiMxQTE5MTlcIj4gPHBhdGggZD1cIk0xLjAwODE1LDE5Ljk5NSBDMC43OTkxNSwxOS45OTUgMC41ODk2LDE5LjkxNSAwLjQyOSwxOS43NTU1NTU2IEMwLjEwNDUsMTkuNDMyNzc3OCAwLjEwMDY1LDE4LjkwNSAwLjQyMDIsMTguNTc2NjY2NyBMOC41NDcsMTAuMjM3Nzc3OCBMMC40MjAyLDEuODk4ODg4ODkgQzAuMTAwNjUsMS41NzExMTExMSAwLjEwNDUsMS4wNDMzMzMzMyAwLjQyOSwwLjcyMDU1NTU1NiBDMC43NTQwNSwwLjM5Nzc3Nzc3OCAxLjI3NjU1LDAuNDAyMjIyMjIyIDEuNTk1NTUsMC43Mjk0NDQ0NDQgTDEwLjI5MjcsOS42NTMzMzMzMyBDMTAuNjA4NCw5Ljk3Nzc3Nzc4IDEwLjYwODQsMTAuNDk3Nzc3OCAxMC4yOTI3LDEwLjgyMjIyMjIgTDEuNTk1NTUsMTkuNzQ2MTExMSBDMS40MzQ0LDE5LjkxMTY2NjcgMS4yMjEsMTkuOTk1IDEuMDA4MTUsMTkuOTk1XCI+PC9wYXRoPiA8L2c+IDwvZz48L3N2Zz4nLFxuICAgICdiay1jaGV2cm9uLWxlZnQnOlxuICAgICAgJzxzdmcgY2xhc3M9XCJiay1pY29uXCIgdmlld0JveD1cIjAgMCAxMSAyMFwiIHZlcnNpb249XCIxLjFcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgeG1sbnM6eGxpbms9XCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rXCI+IDxnIGlkPVwiUGFnZS0xXCIgc3Ryb2tlPVwibm9uZVwiIHN0cm9rZS13aWR0aD1cIjFcIiBmaWxsPVwibm9uZVwiIGZpbGwtcnVsZT1cImV2ZW5vZGRcIj4gPGcgaWQ9XCJGUkVFMTAwaWNvbnNcIiB0cmFuc2Zvcm09XCJ0cmFuc2xhdGUoLTc0Ni4wMDAwMDAsIC0xNjEuMDAwMDAwKVwiIGZpbGw9XCIjMUExOTE5XCI+IDxnIGlkPVwiQVwiIHRyYW5zZm9ybT1cInRyYW5zbGF0ZSgxNi4wMDAwMDAsIDE1NC4wMDAwMDApXCI+IDxnIGlkPVwiNkFcIiB0cmFuc2Zvcm09XCJ0cmFuc2xhdGUoNzM1LjU1NTU1NiwgMTcuMDAwMDAwKSByb3RhdGUoMTgwLjAwMDAwMCkgdHJhbnNsYXRlKC03MzUuNTU1NTU2LCAtMTcuMDAwMDAwKSB0cmFuc2xhdGUoNzMwLjAwMDAwMCwgNy4wMDAwMDApXCI+IDxwYXRoIGQ9XCJNMS4wMDgxNSwxOS45OTUgQzAuNzk5MTUsMTkuOTk1IDAuNTg5NiwxOS45MTUgMC40MjksMTkuNzU1NTU1NiBDMC4xMDQ1LDE5LjQzMjc3NzggMC4xMDA2NSwxOC45MDUgMC40MjAyLDE4LjU3NjY2NjcgTDguNTQ3LDEwLjIzNzc3NzggTDAuNDIwMiwxLjg5ODg4ODg5IEMwLjEwMDY1LDEuNTcxMTExMTEgMC4xMDQ1LDEuMDQzMzMzMzMgMC40MjksMC43MjA1NTU1NTYgQzAuNzU0MDUsMC4zOTc3Nzc3NzggMS4yNzY1NSwwLjQwMjIyMjIyMiAxLjU5NTU1LDAuNzI5NDQ0NDQ0IEwxMC4yOTI3LDkuNjUzMzMzMzMgQzEwLjYwODQsOS45Nzc3Nzc3OCAxMC42MDg0LDEwLjQ5Nzc3NzggMTAuMjkyNywxMC44MjIyMjIyIEwxLjU5NTU1LDE5Ljc0NjExMTEgQzEuNDM0NCwxOS45MTE2NjY3IDEuMjIxLDE5Ljk5NSAxLjAwODE1LDE5Ljk5NVwiPjwvcGF0aD4gPC9nPiA8L2c+IDwvZz4gPC9nPjwvc3ZnPicsXG4gICAgJ2JrLWNoZXZyb24tcmlnaHQnOlxuICAgICAgJzxzdmcgY2xhc3M9XCJiay1pY29uXCIgdmlld0JveD1cIjAgMCAxMSAyMFwiIHZlcnNpb249XCIxLjFcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgeG1sbnM6eGxpbms9XCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rXCI+IDxnIGlkPVwiUGFnZS0xXCIgc3Ryb2tlPVwibm9uZVwiIHN0cm9rZS13aWR0aD1cIjFcIiBmaWxsPVwibm9uZVwiIGZpbGwtcnVsZT1cImV2ZW5vZGRcIj4gPGcgaWQ9XCJGUkVFMTAwaWNvbnNcIiB0cmFuc2Zvcm09XCJ0cmFuc2xhdGUoLTc0Ni4wMDAwMDAsIC0xNjEuMDAwMDAwKVwiIGZpbGw9XCIjMUExOTE5XCI+IDxnIGlkPVwiQVwiIHRyYW5zZm9ybT1cInRyYW5zbGF0ZSgxNi4wMDAwMDAsIDE1NC4wMDAwMDApXCI+IDxnIGlkPVwiNkFcIiB0cmFuc2Zvcm09XCJ0cmFuc2xhdGUoNzM1LjU1NTU1NiwgMTcuMDAwMDAwKSBzY2FsZSgtMSwgMSkgcm90YXRlKDE4MC4wMDAwMDApIHRyYW5zbGF0ZSgtNzM1LjU1NTU1NiwgLTE3LjAwMDAwMCkgdHJhbnNsYXRlKDczMC4wMDAwMDAsIDcuMDAwMDAwKVwiPiA8cGF0aCBkPVwiTTEuMDA4MTUsMTkuOTk1IEMwLjc5OTE1LDE5Ljk5NSAwLjU4OTYsMTkuOTE1IDAuNDI5LDE5Ljc1NTU1NTYgQzAuMTA0NSwxOS40MzI3Nzc4IDAuMTAwNjUsMTguOTA1IDAuNDIwMiwxOC41NzY2NjY3IEw4LjU0NywxMC4yMzc3Nzc4IEwwLjQyMDIsMS44OTg4ODg4OSBDMC4xMDA2NSwxLjU3MTExMTExIDAuMTA0NSwxLjA0MzMzMzMzIDAuNDI5LDAuNzIwNTU1NTU2IEMwLjc1NDA1LDAuMzk3Nzc3Nzc4IDEuMjc2NTUsMC40MDIyMjIyMjIgMS41OTU1NSwwLjcyOTQ0NDQ0NCBMMTAuMjkyNyw5LjY1MzMzMzMzIEMxMC42MDg0LDkuOTc3Nzc3NzggMTAuNjA4NCwxMC40OTc3Nzc4IDEwLjI5MjcsMTAuODIyMjIyMiBMMS41OTU1NSwxOS43NDYxMTExIEMxLjQzNDQsMTkuOTExNjY2NyAxLjIyMSwxOS45OTUgMS4wMDgxNSwxOS45OTVcIj48L3BhdGg+IDwvZz4gPC9nPiA8L2c+IDwvZz48L3N2Zz4nLFxuICAgICdiay1jaGV2cm9uLXVwJzpcbiAgICAgICc8c3ZnIGNsYXNzPVwiYmstaWNvblwiIHZpZXdCb3g9XCIwIDAgMjAgMTFcIiB2ZXJzaW9uPVwiMS4xXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHhtbG5zOnhsaW5rPVwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGlua1wiPiA8ZyBpZD1cIlBhZ2UtMVwiIHN0cm9rZT1cIm5vbmVcIiBzdHJva2Utd2lkdGg9XCIxXCIgZmlsbD1cIm5vbmVcIiBmaWxsLXJ1bGU9XCJldmVub2RkXCI+IDxnIGlkPVwiNkFcIiB0cmFuc2Zvcm09XCJ0cmFuc2xhdGUoOS41NTU1NTYsIDUuMDAwMDAwKSBzY2FsZSgtMSwgLTEpIHJvdGF0ZSg5MC4wMDAwMDApIHRyYW5zbGF0ZSgtOS41NTU1NTYsIC01LjAwMDAwMCkgdHJhbnNsYXRlKDQuMDAwMDAwLCAtNS4wMDAwMDApXCIgZmlsbD1cIiMxQTE5MTlcIj4gPHBhdGggZD1cIk0xLjAwODE1LDE5Ljk5NSBDMC43OTkxNSwxOS45OTUgMC41ODk2LDE5LjkxNSAwLjQyOSwxOS43NTU1NTU2IEMwLjEwNDUsMTkuNDMyNzc3OCAwLjEwMDY1LDE4LjkwNSAwLjQyMDIsMTguNTc2NjY2NyBMOC41NDcsMTAuMjM3Nzc3OCBMMC40MjAyLDEuODk4ODg4ODkgQzAuMTAwNjUsMS41NzExMTExMSAwLjEwNDUsMS4wNDMzMzMzMyAwLjQyOSwwLjcyMDU1NTU1NiBDMC43NTQwNSwwLjM5Nzc3Nzc3OCAxLjI3NjU1LDAuNDAyMjIyMjIyIDEuNTk1NTUsMC43Mjk0NDQ0NDQgTDEwLjI5MjcsOS42NTMzMzMzMyBDMTAuNjA4NCw5Ljk3Nzc3Nzc4IDEwLjYwODQsMTAuNDk3Nzc3OCAxMC4yOTI3LDEwLjgyMjIyMjIgTDEuNTk1NTUsMTkuNzQ2MTExMSBDMS40MzQ0LDE5LjkxMTY2NjcgMS4yMjEsMTkuOTk1IDEuMDA4MTUsMTkuOTk1XCI+PC9wYXRoPiA8L2c+IDwvZz48L3N2Zz4nLFxuICAgICdiay1jbG9jayc6XG4gICAgICAnPHN2ZyBjbGFzcz1cImJrLWljb25cIiB2aWV3Qm94PVwiMCAwIDIwIDIwXCIgdmVyc2lvbj1cIjEuMVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB4bWxuczp4bGluaz1cImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmtcIj4gPGcgaWQ9XCJQYWdlLTFcIiBzdHJva2U9XCJub25lXCIgc3Ryb2tlLXdpZHRoPVwiMVwiIGZpbGw9XCJub25lXCIgZmlsbC1ydWxlPVwiZXZlbm9kZFwiPiA8ZyBpZD1cIkZSRUUxMDBpY29uc1wiIHRyYW5zZm9ybT1cInRyYW5zbGF0ZSgwLjAwMDAwMCwgLTMyMi4wMDAwMDApXCIgZmlsbD1cIiMxQTE5MTlcIj4gPGcgaWQ9XCJCXCIgdHJhbnNmb3JtPVwidHJhbnNsYXRlKDAuMDAwMDAwLCAyOTkuMDAwMDAwKVwiPiA8ZyBpZD1cIjlCXCIgdHJhbnNmb3JtPVwidHJhbnNsYXRlKDAuMDAwMDAwLCAyMy4wMDAwMDApXCI+IDxwYXRoIGQ9XCJNMTMuNzEyODIwNSwxMC44NjEwMjU2IEwxMC4xMjMwNzY5LDEwLjg2MTAyNTYgQzkuNzAyNTY0MSwxMC44NjEwMjU2IDkuMzUzODQ2MTUsMTAuNTE2NDEwMyA5LjM1Mzg0NjE1LDEwLjA5MTc5NDkgTDkuMzUzODQ2MTUsNC41NjQxMDI1NiBDOS4zNTM4NDYxNSw0LjEzOTQ4NzE4IDkuNzAyNTY0MSwzLjc5NDg3MTc5IDEwLjEyMzA3NjksMy43OTQ4NzE3OSBDMTAuNTQ4NzE3OSwzLjc5NDg3MTc5IDEwLjg5MjMwNzcsNC4xMzk0ODcxOCAxMC44OTIzMDc3LDQuNTY0MTAyNTYgTDEwLjg5MjMwNzcsOS4zMjI1NjQxIEwxMy43MTI4MjA1LDkuMzIyNTY0MSBDMTQuMTM4NDYxNSw5LjMyMjU2NDEgMTQuNDgyMDUxMyw5LjY2NjY2NjY3IDE0LjQ4MjA1MTMsMTAuMDkxNzk0OSBDMTQuNDgyMDUxMywxMC41MTY0MTAzIDE0LjEzODQ2MTUsMTAuODYxMDI1NiAxMy43MTI4MjA1LDEwLjg2MTAyNTYgTTEwLjEyMzA3NjksMS43NTg0NjE1NCBDNS41MjgyMDUxMywxLjc1ODQ2MTU0IDEuNzg5NzQzNTksNS40OTY0MTAyNiAxLjc4OTc0MzU5LDEwLjA5MTc5NDkgQzEuNzg5NzQzNTksMTQuNjg2NjY2NyA1LjUyODIwNTEzLDE4LjQyNTEyODIgMTAuMTIzMDc2OSwxOC40MjUxMjgyIEMxNC43MTc5NDg3LDE4LjQyNTEyODIgMTguNDU2NDEwMywxNC42ODY2NjY3IDE4LjQ1NjQxMDMsMTAuMDkxNzk0OSBDMTguNDU2NDEwMyw1LjQ5NjQxMDI2IDE0LjcxNzk0ODcsMS43NTg0NjE1NCAxMC4xMjMwNzY5LDEuNzU4NDYxNTQgWiBNMTAuMTIzMDc2OSwxOS45NjM1ODk3IEM0LjY4MjA1MTI4LDE5Ljk2MzU4OTcgMC4yNTEyODIwNTEsMTUuNTM0ODcxOCAwLjI1MTI4MjA1MSwxMC4wOTE3OTQ5IEMwLjI1MTI4MjA1MSw0LjY0ODIwNTEzIDQuNjgyMDUxMjgsMC4yMiAxMC4xMjMwNzY5LDAuMjIgQzE1LjU2OTIzMDgsMC4yMiAxOS45OTQ4NzE4LDQuNjQ4MjA1MTMgMTkuOTk0ODcxOCwxMC4wOTE3OTQ5IEMxOS45OTQ4NzE4LDE1LjUzNDg3MTggMTUuNTY5MjMwOCwxOS45NjM1ODk3IDEwLjEyMzA3NjksMTkuOTYzNTg5NyBaXCI+PC9wYXRoPiA8L2c+IDwvZz4gPC9nPiA8L2c+PC9zdmc+JyxcbiAgICAnYmstY2xvc2UnOlxuICAgICAgJzxzdmcgY2xhc3M9XCJiay1pY29uXCIgdmlld0JveD1cIjAgMCAyMCAyMFwiIHZlcnNpb249XCIxLjFcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgeG1sbnM6eGxpbms9XCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rXCI+IDxnIGlkPVwiUGFnZS0xXCIgc3Ryb2tlPVwibm9uZVwiIHN0cm9rZS13aWR0aD1cIjFcIiBmaWxsPVwibm9uZVwiIGZpbGwtcnVsZT1cImV2ZW5vZGRcIj4gPGcgaWQ9XCJTZWFyY2gtMy1Db3B5XCIgdHJhbnNmb3JtPVwidHJhbnNsYXRlKC0xMjgwLjAwMDAwMCwgLTQxLjAwMDAwMClcIiBmaWxsPVwiI0ZGRkZGRlwiPiA8ZyBpZD1cImljL2Nsb3NlXCIgdHJhbnNmb3JtPVwidHJhbnNsYXRlKDEyODAuMDAwMDAwLCA0MS4wMDAwMDApXCI+IDxwYXRoIGQ9XCJNMTEuNTM1NTY1NiwxMC4wMDAxODEgTDE5LjY4MTgxLDEuODUzNzg5MjEgQzIwLjEwNjA2MzMsMS40MzAyNTIxMyAyMC4xMDYwNjMzLDAuNzQxNzMyODgyIDE5LjY4MTgxLDAuMzE4MTk1ODA0IEMxOS4yNTc1NTY2LC0wLjEwNjA2NTI2OCAxOC41NzA0OTc3LC0wLjEwNjA2NTI2OCAxOC4xNDYyNDQzLDAuMzE4MTk1ODA0IEwxMCw4LjQ2NDU4NzU5IEwxLjg1Mzc1NTY2LDAuMzE4MTk1ODA0IEMxLjQyOTUwMjI2LC0wLjEwNjA2NTI2OCAwLjc0MjQ0MzQzOSwtMC4xMDYwNjUyNjggMC4zMTgxOTAwNDUsMC4zMTgxOTU4MDQgQy0wLjEwNjA2MzM0OCwwLjc0MTczMjg4MiAtMC4xMDYwNjMzNDgsMS40MzAyNTIxMyAwLjMxODE5MDA0NSwxLjg1Mzc4OTIxIEw4LjQ2NDQzNDM5LDEwLjAwMDE4MSBMMC4zMTgxOTAwNDUsMTguMTQ2NTcyOCBDLTAuMTA2MDYzMzQ4LDE4LjU3MDEwOTkgLTAuMTA2MDYzMzQ4LDE5LjI1ODYyOTEgMC4zMTgxOTAwNDUsMTkuNjgyMTY2MiBDMC41MzAzMTY3NDIsMTkuODk0Mjk2NyAwLjgwODMyNTc5MiwyMCAxLjA4NjMzNDg0LDIwIEMxLjM2NDM0Mzg5LDIwIDEuNjQxNjI4OTYsMTkuODk0Mjk2NyAxLjg1Mzc1NTY2LDE5LjY4MjE2NjIgTDEwLDExLjUzNTc3NDQgTDE4LjE0NjI0NDMsMTkuNjgyMTY2MiBDMTguMzU4MzcxLDE5Ljg5NDI5NjcgMTguNjM2MzgwMSwyMCAxOC45MTQzODkxLDIwIEMxOS4xOTIzOTgyLDIwIDE5LjQ2OTY4MzMsMTkuODk0Mjk2NyAxOS42ODE4MSwxOS42ODIxNjYyIEMyMC4xMDYwNjMzLDE5LjI1ODYyOTEgMjAuMTA2MDYzMywxOC41NzAxMDk5IDE5LjY4MTgxLDE4LjE0NjU3MjggTDExLjUzNTU2NTYsMTAuMDAwMTgxXCIgaWQ9XCI0QVwiPjwvcGF0aD4gPC9nPiA8L2c+IDwvZz48L3N2Zz4nLFxuICAgICdiay1kaXJlY3Rpb25zJzpcbiAgICAgICc8c3ZnIGNsYXNzPVwiYmstaWNvblwiIHZpZXdCb3g9XCIwIDAgMjAgMTdcIiB2ZXJzaW9uPVwiMS4xXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHhtbG5zOnhsaW5rPVwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGlua1wiPiA8ZyBpZD1cIlBhZ2UtMVwiIHN0cm9rZT1cIm5vbmVcIiBzdHJva2Utd2lkdGg9XCIxXCIgZmlsbD1cIm5vbmVcIiBmaWxsLXJ1bGU9XCJldmVub2RkXCI+IDxnIGlkPVwiRlJFRTEwMGljb25zXCIgdHJhbnNmb3JtPVwidHJhbnNsYXRlKC01ODYuMDAwMDAwLCAtMTMwOC4wMDAwMDApXCIgZmlsbD1cIiMxQTE5MTlcIj4gPGcgaWQ9XCJJXCIgdHJhbnNmb3JtPVwidHJhbnNsYXRlKDExLjAwMDAwMCwgMTMwNC4wMDAwMDApXCI+IDxnIGlkPVwiNUlcIiB0cmFuc2Zvcm09XCJ0cmFuc2xhdGUoNTc1LjAwMDAwMCwgNC4wMDAwMDApXCI+IDxwYXRoIGQ9XCJNMTguNDgzODI5OCwxMi4zNDc4MDQ5IEwxMy45Njg1MTA2LDE1LjA5NjgyOTMgTDEzLjk2ODUxMDYsNC42MDY1ODUzNyBMMTguNDgzODI5OCwxLjg4NjU4NTM3IEwxOC40ODM4Mjk4LDEyLjM0NzgwNDkgWiBNMS41MzcwMjEyOCw0LjY5NzgwNDg4IEw2LjE5MzYxNzAyLDEuODg2NTg1MzcgTDYuMTkzNjE3MDIsMTIuNTA5NTEyMiBMMS41MzcwMjEyOCwxNS4xMzgyOTI3IEwxLjUzNzAyMTI4LDQuNjk3ODA0ODggWiBNNy40NzAyMTI3NywxLjc5OTUxMjIgTDEyLjY5MTkxNDksNC40NzgwNDg3OCBMMTIuNjkxOTE0OSwxNS4xODM5MDI0IEw3LjQ3MDIxMjc3LDEyLjQ5MjkyNjggTDcuNDcwMjEyNzcsMS43OTk1MTIyIFogTTE5LjQzMjc2NiwwLjIyODA0ODc4IEMxOS4yMzA2MzgzLDAuMTE2MDk3NTYxIDE4Ljk4Mjk3ODcsMC4xMjAyNDM5MDIgMTguNzg2MzgzLDAuMjQwNDg3ODA1IEwxMy40NDU5NTc0LDMuNDYyMTk1MTIgTDcuMTI5MzYxNywwLjIxOTc1NjA5OCBDNy4xMjM0MDQyNiwwLjIxNTYwOTc1NiA3LjExNzAyMTI4LDAuMjE1NjA5NzU2IDcuMTExMDYzODMsMC4yMTE0NjM0MTUgQzcuMDcyMzQwNDMsMC4xOTQ4NzgwNDkgNy4wMzE5MTQ4OSwwLjE3ODI5MjY4MyA2Ljk4ODkzNjE3LDAuMTcgQzYuOTgyMTI3NjYsMC4xNjU4NTM2NTkgNi45NzU3NDQ2OCwwLjE2NTg1MzY1OSA2Ljk2ODUxMDY0LDAuMTYxNzA3MzE3IEM2LjkyNDY4MDg1LDAuMTUzNDE0NjM0IDYuODc5MTQ4OTQsMC4xNDkyNjgyOTMgNi44MzE5MTQ4OSwwLjE0OTI2ODI5MyBDNi44Mjc2NTk1NywwLjE0OTI2ODI5MyA2LjgyMzQwNDI2LDAuMTQ5MjY4MjkzIDYuODE5MTQ4OTQsMC4xNDkyNjgyOTMgQzYuODA2MzgyOTgsMC4xNDkyNjgyOTMgNi43OTM2MTcwMiwwLjE1MzQxNDYzNCA2Ljc4MDg1MTA2LDAuMTUzNDE0NjM0IEM2Ljc0MjU1MzE5LDAuMTU3NTYwOTc2IDYuNzA1NTMxOTEsMC4xNjE3MDczMTcgNi42NjkzNjE3LDAuMTcgQzYuNjU0NDY4MDksMC4xNzQxNDYzNDEgNi42NCwwLjE3ODI5MjY4MyA2LjYyNTEwNjM4LDAuMTgyNDM5MDI0IEM2LjU4ODA4NTExLDAuMTk0ODc4MDQ5IDYuNTUzMTkxNDksMC4yMTE0NjM0MTUgNi41MiwwLjIzMjE5NTEyMiBDNi41MTE5MTQ4OSwwLjIzNjM0MTQ2MyA2LjUwMzQwNDI2LDAuMjM2MzQxNDYzIDYuNDk1NzQ0NjgsMC4yNDA0ODc4MDUgTDAuNTYyNTUzMTkxLDMuODIyOTI2ODMgQzAuMzc0ODkzNjE3LDMuOTM5MDI0MzkgMC4yNjA0MjU1MzIsNC4xMzgwNDg3OCAwLjI2MDQyNTUzMiw0LjM1MzY1ODU0IEwwLjI2MDQyNTUzMiwxNi4yMTYzNDE1IEMwLjI2MDQyNTUzMiwxNi40NDAyNDM5IDAuMzgyMTI3NjYsMTYuNjQ3NTYxIDAuNTgsMTYuNzU1MzY1OSBDMC43Nzc4NzIzNCwxNi44NjczMTcxIDEuMDIwODUxMDYsMTYuODY3MzE3MSAxLjIxODcyMzQsMTYuNzU1MzY1OSBMNi44NDU5NTc0NSwxMy41NzkyNjgzIEwxMy4wMzE5MTQ5LDE2Ljc2NzgwNDkgQzEzLjAzODI5NzksMTYuNzcxOTUxMiAxMy4wNDU1MzE5LDE2Ljc3MTk1MTIgMTMuMDUyMzQwNCwxNi43NzYwOTc2IEMxMy4wODM0MDQzLDE2Ljc4ODUzNjYgMTMuMTE2MTcwMiwxNi44MDA5NzU2IDEzLjE0OTc4NzIsMTYuODEzNDE0NiBDMTMuMTYyOTc4NywxNi44MTM0MTQ2IDEzLjE3NDg5MzYsMTYuODIxNzA3MyAxMy4xODgwODUxLDE2LjgyMTcwNzMgQzEzLjIzNDA0MjYsMTYuODM0MTQ2MyAxMy4yODEyNzY2LDE2LjgzODI5MjcgMTMuMzMwMjEyOCwxNi44MzgyOTI3IEMxMy4zODUxMDY0LDE2LjgzODI5MjcgMTMuNDM3MDIxMywxNi44MyAxMy40ODc2NTk2LDE2LjgxNzU2MSBDMTMuNTAxMjc2NiwxNi44MTM0MTQ2IDEzLjUxMzYxNywxNi44MDkyNjgzIDEzLjUyNjgwODUsMTYuODA1MTIyIEMxMy41Njk3ODcyLDE2Ljc5MjY4MjkgMTMuNjEwMjEyOCwxNi43NzYwOTc2IDEzLjY0ODA4NTEsMTYuNzU1MzY1OSBDMTMuNjU0NDY4MSwxNi43NTEyMTk1IDEzLjY2MjEyNzcsMTYuNzUxMjE5NSAxMy42Njg1MTA2LDE2Ljc0NzA3MzIgTDE5LjQ2LDEzLjIyMjY4MjkgQzE5LjY0NjgwODUsMTMuMTA2NTg1NCAxOS43NjA0MjU1LDEyLjkwNzU2MSAxOS43NjA0MjU1LDEyLjY5MTk1MTIgTDE5Ljc2MDQyNTUsMC43NzEyMTk1MTIgQzE5Ljc2MDQyNTUsMC41NDMxNzA3MzIgMTkuNjM1MzE5MSwwLjMzNTg1MzY1OSAxOS40MzI3NjYsMC4yMjgwNDg3OCBaXCI+PC9wYXRoPiA8L2c+IDwvZz4gPC9nPiA8L2c+PC9zdmc+JyxcbiAgICAnYmstZG90cyc6XG4gICAgICAnPHN2ZyBjbGFzcz1cImJrLWljb25cIiB2aWV3Qm94PVwiMCAwIDIwIDIwXCIgdmVyc2lvbj1cIjEuMVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB4bWxuczp4bGluaz1cImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmtcIj4gPGcgaWQ9XCJQYWdlLTFcIiBzdHJva2U9XCJub25lXCIgc3Ryb2tlLXdpZHRoPVwiMVwiIGZpbGw9XCJub25lXCIgZmlsbC1ydWxlPVwiZXZlbm9kZFwiPiA8ZyBmaWxsPVwiI0ZGRkZGRlwiPiA8Y2lyY2xlICBjeD1cIjEwXCIgY3k9XCIyXCIgcj1cIjJcIj48L2NpcmNsZT4gPGNpcmNsZSBjeD1cIjEwXCIgY3k9XCIxMFwiIHI9XCIyXCI+PC9jaXJjbGU+IDxjaXJjbGUgY3g9XCIxMFwiIGN5PVwiMThcIiByPVwiMlwiPjwvY2lyY2xlPiA8Y2lyY2xlICBjeD1cIjE4XCIgY3k9XCIyXCIgcj1cIjJcIj48L2NpcmNsZT4gPGNpcmNsZSAgY3g9XCIxOFwiIGN5PVwiMTBcIiByPVwiMlwiPjwvY2lyY2xlPiA8Y2lyY2xlIGN4PVwiMThcIiBjeT1cIjE4XCIgcj1cIjJcIj48L2NpcmNsZT4gPGNpcmNsZSBjeD1cIjJcIiBjeT1cIjJcIiByPVwiMlwiPjwvY2lyY2xlPiA8Y2lyY2xlICBjeD1cIjJcIiBjeT1cIjEwXCIgcj1cIjJcIj48L2NpcmNsZT4gPGNpcmNsZSBjeD1cIjJcIiBjeT1cIjE4XCIgcj1cIjJcIj48L2NpcmNsZT4gPC9nPiA8L2c+PC9zdmc+JyxcbiAgICAnYmstZW52ZWxvcGUnOlxuICAgICAgJzxzdmcgY2xhc3M9XCJiay1pY29uXCIgdmlld0JveD1cIjAgMCAyNCAxN1wiIHZlcnNpb249XCIxLjFcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgeG1sbnM6eGxpbms9XCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rXCI+IDxnIGlkPVwiUGFnZS0xXCIgc3Ryb2tlPVwibm9uZVwiIHN0cm9rZS13aWR0aD1cIjFcIiBmaWxsPVwibm9uZVwiIGZpbGwtcnVsZT1cImV2ZW5vZGRcIj4gPGcgaWQ9XCJGUkVFMTAwaWNvbnNcIiB0cmFuc2Zvcm09XCJ0cmFuc2xhdGUoMC4wMDAwMDAsIC02MzQuMDAwMDAwKVwiIGZpbGw9XCIjMUExOTE5XCI+IDxnIGlkPVwiRVwiIHRyYW5zZm9ybT1cInRyYW5zbGF0ZSgwLjAwMDAwMCwgNjM0LjAwMDAwMClcIj4gPGcgaWQ9XCIxRVwiPiA8cGF0aCBkPVwiTTIxLjc2MTQ1NDUsMTQuODIwNzA5NyBMMi4wNjEyNzI3MywxNC44MjA3MDk3IEMxLjkxMzQ1NDU1LDE0LjgyMDcwOTcgMS43ODg1NDU0NSwxNC42OTU2Nzc0IDEuNzg4NTQ1NDUsMTQuNTQ2NTE2MSBMMS43ODg1NDU0NSwyLjg1NiBMMTEuNDYzMjcyNyw5LjIyMjIyNTgxIEMxMS41OTk2MzY0LDkuMzExNjEyOSAxMS43NTUwOTA5LDkuMzU3MTI5MDMgMTEuOTExMDkwOSw5LjM1NzEyOTAzIEMxMi4wNjk4MTgyLDkuMzU3MTI5MDMgMTIuMjI4LDkuMzExMDY0NTIgMTIuMzY1NDU0NSw5LjIxODkzNTQ4IEwyMi4wMzQxODE4LDIuNzMyMDY0NTIgTDIyLjAzNDE4MTgsMTQuNTQ2NTE2MSBDMjIuMDM0MTgxOCwxNC42OTU2Nzc0IDIxLjkwOTI3MjcsMTQuODIwNzA5NyAyMS43NjE0NTQ1LDE0LjgyMDcwOTcgWiBNMjAuMDMwMTgxOCwyLjA5ODEyOTAzIEwxMS45MDcyNzI3LDcuNTQ4NTQ4MzkgTDMuNjI1MDkwOTEsMi4wOTgxMjkwMyBMMjAuMDMwMTgxOCwyLjA5ODEyOTAzIFogTTIzLjA3LDAuOTgyMTYxMjkgQzIyLjk3MDE4MTgsMC44NTIxOTM1NDggMjIuODM5MjcyNywwLjc1ODk2Nzc0MiAyMi42OTM2MzY0LDAuNzA3OTY3NzQyIEMyMi40MTY1NDU1LDAuNTUwNTgwNjQ1IDIyLjEwMTgxODIsMC40NTI5Njc3NDIgMjEuNzYxNDU0NSwwLjQ1Mjk2Nzc0MiBMMi4wNjEyNzI3MywwLjQ1Mjk2Nzc0MiBDMS4wMDkwOTA5MSwwLjQ1Mjk2Nzc0MiAwLjE1MjE4MTgxOCwxLjMxMzkzNTQ4IDAuMTUyMTgxODE4LDIuMzcyMzIyNTggTDAuMTUyMTgxODE4LDE0LjU0NjUxNjEgQzAuMTUyMTgxODE4LDE1LjYwNDkwMzIgMS4wMDkwOTA5MSwxNi40NjU4NzEgMi4wNjEyNzI3MywxNi40NjU4NzEgTDIxLjc2MTQ1NDUsMTYuNDY1ODcxIEMyMi44MTM2MzY0LDE2LjQ2NTg3MSAyMy42NzA1NDU1LDE1LjYwNDkwMzIgMjMuNjcwNTQ1NSwxNC41NDY1MTYxIEwyMy42NzA1NDU1LDIuMzcyMzIyNTggQzIzLjY3MDU0NTUsMS44MjQ0ODM4NyAyMy40Mzc2MzY0LDEuMzMyNTgwNjUgMjMuMDcsMC45ODIxNjEyOSBaXCI+PC9wYXRoPiA8L2c+IDwvZz4gPC9nPiA8L2c+PC9zdmc+JyxcbiAgICAnYmstZmFjZWJvb2snOlxuICAgICAgJzxzdmcgY2xhc3M9XCJiay1pY29uXCIgdmlld0JveD1cIjAgMCAxMSAyMFwiIHZlcnNpb249XCIxLjFcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgeG1sbnM6eGxpbms9XCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rXCI+IDxnIGlkPVwiUGFnZS0xXCIgc3Ryb2tlPVwibm9uZVwiIHN0cm9rZS13aWR0aD1cIjFcIiBmaWxsPVwibm9uZVwiIGZpbGwtcnVsZT1cImV2ZW5vZGRcIiBvcGFjaXR5PVwiMC44XCI+IDxwYXRoIGQ9XCJNMTAuODExNDI5MywwLjk2NjIwNTUxNyBDMTAuNzg2MjgwMSwwLjgxNTE3NzU3NyAxMC42ODAyNzUyLDAuNjg4Njk4MzQ4IDEwLjUzNTA1OTMsMC42MzYxMzIwODYgQzkuNjQ4ODkwNzUsMC4zMTY5OTg4NDIgOC40Nzc2OTg3OCwwLjAwMDgwMDc3MDAyNCA3LjIyMDc4MzQ2LDIuNjg1NzU4NjVlLTA3IEM2LjIzNDgyOTY2LC0wLjAwMDI2NjU2NTI0IDUuMTkwMTk0NTcsMC4xOTgyNTc3OTQgNC4yMTkxMTM5LDAuNzU3MDA3ODA1IEMzLjczMDE5MzMxLDEuMDM3NDUwMTUgMy4zNDQ4NDM4NCwxLjM5MjA3MjI5IDMuMDUxNDM3NCwxLjc5MTI1NTY4IEMyLjYwOTg0MDQzLDIuMzkwODMxMjYgMi4zNzQ4NDQ4NiwzLjA4MDg2MzUxIDIuMjQyMzM4NzIsMy43ODEzMDIyOCBDMi4xMzU1MjI1NSw0LjM0Nzc5MDQ3IDIuMDk1MjI5ODcsNC45MjQ5NTIwMSAyLjA3MzU5NjIyLDUuNDg0NTAyNTMgQzEuODIwNDgyNDYsNS40OTAzNzI4NyAxLjUzMzU2NjEyLDUuNDkyMjQwNzEgMS4yNzIzMzk3NCw1LjQ5MjI0MDcxIEMxLjA0MzgzNDI3LDUuNDkyMjQwNzEgMC44MzQ3OTkwOCw1LjQ5MDkwNjU0IDAuNjgyNTUyMjM3LDUuNDg5MzA1NTMgQzAuNjA2NTY0MDI1LDUuNDg4NTA1MDMgMC41NDUxNzg1MzEsNS40ODc5NzEzNiAwLjUwMjQ1MjA2Myw1LjQ4NzQzNzcgQzAuNDU5NzI1NTk2LDUuNDg2NjM3MiAwLjQzNzAxMDI1OCw1LjQ4NjM3MDM2IDAuNDM2NDY5NDE3LDUuNDg2MzcwMzYgQzAuMzIxODExMDQ4LDUuNDg0NzY5MzYgMC4yMDkzMTYwNDUsNS41Mjk1OTc0NCAwLjEyNzM3ODU3OSw1LjYwODg0NzA4IEMwLjA0NTcxMTUzMzIsNS42ODg2MzAzOSAtMC4wMDA4MDA4MjM4NTUsNS43OTkzNjY0MyAxLjA0MzgxODc5ZS0wNSw1LjkxMjc3MDggTDAuMDE3MDQ2OTQxMSw4LjczMDUzNTkgQzAuMDE4NjY5NDY1Miw4Ljk2NTM0OTY2IDAuMjExMjA4OTksOS4xNzE4NzkwMyAwLjQ0ODYzODM0OCw5LjE3MTg3OTAzIEMwLjQ0ODkwODc2OCw5LjE3MTg3OTAzIDAuNTYzMjk2NzE2LDkuMTcxODc5MDMgMC43NDg1MzQ4ODMsOS4xNzE4NzkwMyBDMS4xNjkwMzkwNCw5LjE3MTg3OTAzIDEuOTUzNzk5ODYsOS4xNTQwMDExNiAyLjU1NzEwODQsOS4xNjU3NDE4NSBDMi42NDYzNDcyMiwxMS4xMDEzNTQ0IDIuNjY3NDQwMDMsMTQuMDAyMTA0OCAyLjY2NzQ0MDAzLDE2LjI1Mjg0OCBDMi42Njc0NDAwMywxNy4yMDE3MDkxIDIuNjYzMzgzNzIsMTguMDI4NjI3MSAyLjY2MDEzODY4LDE4LjYyNDIwMDEgQzIuNjU3OTc1MzEsMTguOTIxMTg2MiAyLjY1NjM1Mjc5LDE5LjE1NzMzNDEgMi42NTQ3MzAyNiwxOS4zMjExNzAxIEMyLjY1MzM3ODE2LDE5LjQ4NDczOTIgMi42NTI1NjY5LDE5LjU3MjI2MDcgMi42NTI1NjY5LDE5LjU3Mjc5NDMgQzIuNjUxNDg1MjEsMTkuNjg1OTMxOSAyLjY5NjM3NTA1LDE5Ljc5NTA2NjkgMi43Nzc3NzE2NywxOS44NzU2NTA3IEMyLjg1ODg5Nzg4LDE5Ljk1NTcwMDkgMi45Njk3NzAzNiwyMC4wMDA1MjkgMy4wODQ2OTkxNCwxOS45OTk5OTUzIEw2LjkwNjgyNTA1LDE5Ljk4MTA1MDEgQzcuMDIxNzUzODQsMTkuOTgwNTE2NCA3LjEyOTkyMjExLDE5LjkzNTE1NDcgNy4yMTA1MDc0NywxOS44NTQzMDQgQzcuMjkxMzYzMjYsMTkuNzczNzIwMiA3LjMzNTQ0MTgzLDE5LjY2NjE4NjIgNy4zMzQzNjAxNCwxOS41NTI1MTUgQzcuMzM0MzYwMTQsMTkuNTUyNTE1IDcuMzE0MzQ5MDEsMTcuMjMzNDYyMyA3LjI5MDgyMjQxLDE0LjczMTg5NTMgQzcuMjcwODExMjgsMTIuNTgwNjgxIDcuMjQ4NjM2NzksMTAuMjk3NjUwOSA3LjIzNTkyNzAyLDkuMjM0MzE4MTQgQzcuNDcxNzMzODUsOS4yMzAzMTU2NCA3Ljc0NjQ4MTI2LDkuMjI4NzE0NjMgOC4wMTM2NTY4OSw5LjIyODk4MTQ3IEM4LjMyNTk5Mjc4LDkuMjI4OTgxNDcgOC42Mjk5NDU2Myw5LjIzMDg0OTMgOC44NTU0NzY0Nyw5LjIzMjcxNzE0IEM4Ljk2Nzk3MTQ4LDkuMjMzNTE3NjQgOS4wNjEyNjY2MSw5LjIzNDU4NDk4IDkuMTI1ODk3MTUsOS4yMzUzODU0OCBDOS4xOTEwNjg1NCw5LjIzNjE4NTk4IDkuMjI3MzA0OTEsOS4yMzY0NTI4MSA5LjIyNzMwNDkxLDkuMjM2NDUyODEgQzkuMzQyMjMzNyw5LjIzODA1MzgyIDkuNDUyODM1NzYsOS4xOTQwMjYyNCA5LjUzNDc3MzIyLDkuMTE0NTA5NzYgQzkuNjE2NzEwNjksOS4wMzQ5OTMyOCA5LjY2Mjk1MjYzLDguOTI2NjU4NzUgOS42NjMyMjMwNSw4LjgxMzI1NDM4IEw5LjY2ODA5MDYyLDYuMjAzMzUyODMgQzkuNjY4MzYxMDQsNi4wODk5NDg0NSA5LjYyMzIwMDc5LDUuOTQ0NTI0MDIgOS41NDE4MDQxNiw1Ljg2NDc0MDcxIEM5LjQ2MDY3Nzk2LDUuNzg0OTU3NCA5LjM1MTQyOCw1LjcwMzMwNjI1IDkuMjM2MjI4NzksNS43MDMzMDYyNSBDOS4yMzYyMjg3OSw1LjcwMzMwNjI1IDkuMTg0ODQ4ODYsNS43MDMzMDYyNSA5LjA5MzQ0NjY3LDUuNzAzMzA2MjUgQzkuMDAyMDQ0NDgsNS43MDMzMDYyNSA4Ljg3MTk3MjE0LDUuNzQxNzMwMzIgOC43MTU5Mzk0LDUuNzQxNzMwMzIgQzguMjM2NDgzNTQsNS43NDE3MzAzMiA3LjUxMTIxNTI3LDUuNzU4NTQwODUgNi45MzczODI1OCw1Ljc0ODkzNDg0IEM2Ljk0NzY1ODU3LDUuNDU5NDIwMTUgNi45NzQxNTk4LDUuMjEzMTMyNTMgNy4wMTc0MjcxMSw0Ljk5NDg2MjQ3IEM3LjA1OTA3MTg5LDQuNzgyNDYyNzYgNy4xMTY0MDEwOCw0LjYxMDM1NDk0IDcuMTg0MDA2MjUsNC40Njg2NjYxOSBDNy4yMzQ4NDUzMyw0LjM2MjQ2NjMzIDcuMjkxMzYzMjYsNC4yNzg2ODA1MSA3LjM1MTkzNzQ5LDQuMjA4NTAzMjIgQzcuNDQzODgwNTIsNC4xMDMzNzA2OSA3LjU0MzM5NTMzLDQuMDMyMzkyOSA3LjY3MTU3NDczLDMuOTc5NTU5OCBDNy43OTk0ODM3MSwzLjkyNzI2MDM3IDcuOTYwMzg0MDIsMy44OTYwNDA4MiA4LjE2NjQ0NDU4LDMuODk1NzczOTggQzguNTMyMzIzNzYsMy44OTQ3MDY2NSA5LjAzNDc2NTM5LDQuMDAxNDQwMTggOS42NjQwMzQzMSw0LjI0MTMyMzc4IEM5LjY2ODYzMTQ2LDQuMjQzMTkxNjEgOS42NzM3Njk0NSw0LjI0MzcyNTI4IDkuNjc4NjM3MDMsNC4yNDU1OTMxMiBDOS42ODM3NzUwMiw0LjI0NzE5NDEyIDkuNjg3ODMxMzMsNC4yNTAxMjkyOSA5LjY5Mjk2OTMyLDQuMjUxNDYzNDYgQzkuNzAyMTYzNjMsNC4yNTQzOTg2MyA5LjcxMTM1NzkzLDQuMjU0NjY1NDcgOS43MjA1NTIyMyw0LjI1NjgwMDE0IEM5LjczNTE1NDk1LDQuMjYwMjY4OTggOS43NDk0ODcyNCw0LjI2MzQ3MDk4IDkuNzYzODE5NTQsNC4yNjUzMzg4MiBDOS43Nzc4ODE0Miw0LjI2NjkzOTgyIDkuNzkxNjcyODcsNC4yNjc0NzM0OSA5LjgwNTE5MzksNC4yNjgwMDcxNiBDOS44MTk1MjYyLDQuMjY4MjczOTkgOS44MzMzMTc2Niw0LjI2ODU0MDgzIDkuODQ3NjQ5OTUsNC4yNjc3NDAzMiBDOS44NjE3MTE4Myw0LjI2NjY3Mjk5IDkuODc1MjMyODYsNC4yNjQ4MDUxNSA5Ljg4ODQ4MzQ3LDQuMjYyNDAzNjUgQzkuOTAyMjc0OTMsNC4yNjAyNjg5OCA5LjkxNjA2NjM4LDQuMjU3NjAwNjQgOS45MjkzMTcsNC4yNTQxMzE4IEM5Ljk0MjI5NzE5LDQuMjUwNjYyOTYgOS45NTUyNzczOCw0LjI0NjEyNjc4IDkuOTY3NzE2NzMsNC4yNDEzMjM3OCBDOS45ODA5NjczNSw0LjIzNjc4NzYgOS45OTM5NDc1NCw0LjIzMTcxNzc2IDEwLjAwNjM4NjksNC4yMjU1ODA1OCBDMTAuMDE4NTU1OCw0LjIxOTcxMDI0IDEwLjAyOTkxMzUsNC4yMTMwMzkzOSAxMC4wNDE1NDE2LDQuMjA2MTAxNzEgQzEwLjA1MzQ0MDEsNC4xOTg4OTcyIDEwLjA2NTMzODYsNC4xOTExNTkwMiAxMC4wNzY2OTYzLDQuMTgyODg3MTcgQzEwLjA4NzUxMzEsNC4xNzUxNDg5OSAxMC4wOTcyNDgyLDQuMTY2MzQzNDcgMTAuMTA2OTgzNCw0LjE1NzI3MTEyIEMxMC4xMTc4MDAyLDQuMTQ3NjY1MTEgMTAuMTI4MDc2Miw0LjEzODA1OTA5IDEwLjEzNzI3MDUsNC4xMjc2NTI1NyBDMTAuMTQ2NDY0OCw0LjExNzUxMjg5IDEwLjE1NDU3NzQsNC4xMDY4Mzk1MyAxMC4xNjI5NjA1LDQuMDk1ODk5MzUgQzEwLjE3MTM0MzUsNC4wODQ2OTIzMyAxMC4xNzk3MjY1LDQuMDczMjE4NDcgMTAuMTg3MDI3OSw0LjA2MDk0NDEyIEMxMC4xOTQwNTg4LDQuMDQ5MjAzNDMgMTAuMjAwMjc4NSw0LjAzNjEyODU3IDEwLjIwNjQ5ODIsNC4wMjMwNTM3MSBDMTAuMjEwNTU0NSw0LjAxNDUxNTAzIDEwLjIxNTY5MjUsNC4wMDY3NzY4NSAxMC4yMTkyMDgsMy45OTc3MDQ1IEMxMC4yMjEzNzEzLDMuOTkyOTAxNDkgMTAuMjIxOTEyMiwzLjk4NzgzMTY1IDEwLjIyMzgwNTEsMy45ODI0OTQ5NyBDMTAuMjI1MTU3MiwzLjk3Nzk1ODggMTAuMjI4MTMxOCwzLjk3Mzk1NjI5IDEwLjIyOTQ4NCwzLjk2OTE1MzI4IEMxMC4zMTYyODksMy42ODY4NDMxMSAxMC40NjUyOTA4LDMuMjEzNzQ2NzUgMTAuNTkzMTk5OCwyLjcxNDUwMDY4IEMxMC42NTcwMTksMi40NjQyMTA1NiAxMC43MTYyNDEyLDIuMjA2OTgyNzYgMTAuNzYwMDQ5MywxLjk1OTA5NDE1IEMxMC44MDM1ODcxLDEuNzEwOTM4NyAxMC44MzMwNjI5LDEuNDczOTkwMjcgMTAuODMzMzMzMywxLjI1MzA1MTg3IEMxMC44MzI3OTI1LDEuMTU1MzkwNjkgMTAuODI2ODQzMiwxLjA2MDY2NDY5IDEwLjgxMTQyOTMsMC45NjYyMDU1MTcgWiBNNy4xNTgxNTYzNCwzLjM3MTI1NDU1IEM2Ljk1MTA0NjA0LDMuNDc4MDcyNDYgNi43NzA1MTUzNCwzLjYyODcxOTgyIDYuNjI2MDM4MTUsMy44MTAwNzQwNSBDNi40MDg0MDEyOCw0LjA4MzAyMzk4IDYuMjY4Mzk3ODgsNC40MTc2NTAwOSA2LjE4MDUwMTAxLDQuNzk4NDY3NzMgQzYuMDkyNjA0MTQsNS4xODAwNzI3MyA2LjA1NDk3MTY1LDUuNjEyNTkzMzggNi4wNTQ5NzE2NSw2LjEwMDIyODkzIEM2LjA1NDk3MTY1LDYuMTUwMDk0NzggNi4wNTU0OTc5Nyw2LjIwMDc0Nzk5IDYuMDU2MDI0Myw2LjI1MTkyNjEgQzYuMDU5NzA4Niw2LjQ3NDc0NzcyIDYuMjM3ODcwODMsNi41OTQxNjMzMiA2LjQ2MTI5NzMxLDYuNjAxNTExOTcgQzcuMDU2MzExNzYsNi42MjA0MDg1IDguMDMxMzM1NDQsNi41NjI0MDY2NCA4LjYyNzEzOTM5LDYuNTYyNDA2NjQgQzguNjU4MTkyNzgsNi41NjI0MDY2NCA4LjY4NzQwNDAxLDYuNTYyNDA2NjQgOC43MTY2MTUyNSw2LjU2MjQwNjY0IEw4LjcxMzQ1NzI4LDguMzUwNDkxMTIgQzguNDk5NTA0NzEsOC4zNDg5MTY0MSA4LjIyNjA3NzAyLDguMzc3Nzg2MTIgNy45NDM5NjQ5LDguMzc3Nzg2MTIgQzcuNDk4NDI3NzYsOC4zNzc3ODYxMiA3LjAzNzEwMDc3LDguMzk2OTQ1MSA2Ljc0MjYxOTkzLDguNDExMzc5OTUgQzYuNTE3MDg4MTMsOC40MjI2NjUzOCA2LjM0MTgyMDcyLDguNjE2ODc5NzYgNi4zNDQ5Nzg2OSw4Ljg0MjA2MzQ1IEM2LjM1NjI5NDc1LDkuNTU0ODgyNjggNi4zODE1NTg1MywxMi4xOTk2MSA2LjQwNDE5MDY2LDE0LjY1OTMwODggQzYuNDE1NTA2NzIsMTUuODg5NDIwNiA2LjQyNjAzMzI5LDE3LjA3Njc1MjggNi40MzM5MjgyMiwxNy45NTQzOTE4IEM2LjQzNzYxMjUyLDE4LjM4MDM1MTIgNi40NDA3NzA0OSwxOC43MzM4NzM4IDYuNDQyODc1ODEsMTguOTg0Nzc3OCBMMy41NjcwMTY0NywxOSBDMy41NzE0OTAyNywxOC40NDcwMTM5IDMuNTc3NTQzMDQsMTcuMzk3OTkzOSAzLjU3NzU0MzA0LDE2LjE0MTExMiBDMy41Nzc1NDMwNCwxMy43NjUxMzUzIDMuNTU0OTEwOTIsMTAuNjU0MjkzNSAzLjQ1MDE3MTUzLDguNzMyMDk2MTIgQzMuNDM4NTkyMyw4LjUxNTgzNTc5IDMuMjY0Mzc3NTQsOC4zNDU1MDQ1NCAzLjA0NzUzMDE3LDguMzM3ODkzNDMgQzIuNDgwOTM3NDYsOC4zMTc5NDcwOSAxLjUzOTMzNTY0LDguMzE0MjcyNzcgMC45OTY0Mjc3MTMsOC4zMTQwMTAzMiBMMC45ODQ4NDg0ODUsNi40MDA3MzYzIEMxLjEwMzI3MjQxLDYuNDAxNTIzNjYgMS4yMzk1OTE1Miw2LjQwMjMxMTAxIDEuMzgzODA1NTQsNi40MDIzMTEwMSBDMS43OTI3NjI4NSw2LjQwMjA0ODU2IDIuMjYxNzIxNjEsNi4zOTc4NDkzMyAyLjU5MzA0NTQ1LDYuMzc4NjkwMzUgQzIuODA5ODkyODIsNi4zNjYzNTUxMSAyLjk4MTQ3NTkzLDYuMTg5NzI1MDEgMi45ODcwMDIzOCw1Ljk3MzQ2NDY4IEMzLjAwOTYzNDUxLDUuMDk1NTYzMjMgMy4wNTk2MzU3Myw0LjIwNDI3Njc0IDMuMjkzNTg4NzgsMy40NDYzMTU3OCBDMy40MTAxNzA1NiwzLjA2NjgxMDQgMy41NzA0Mzc2MSwyLjcyMTQyMzc2IDMuNzkxNzU4NzcsMi40MTc3NjY5NyBDNC4wMTM2MDYyNywyLjExNDM3MjYyIDQuMjk1NDU1MjIsMS44NTAzNDYwNiA0LjY3MjgzMjgxLDEuNjMwOTM2MzEgQzUuNDY1NzQ2ODEsMS4xNzA1OTU3NiA2LjMyNDE4ODcxLDEuMDAwMjY0NSA3LjE3Mjg5MzU0LDEuMDAwMDAyMDUgQzguMTM4OTY5NjQsMC45OTkyMTQ2OTYgOS4wODM5OTI1OSwxLjIyNTE4NTc0IDkuODQ4NDg0ODUsMS40ODM0MzgzNyBDOS44NDI0MzIwNywxLjYxMzg3Njk0IDkuODIyOTU3OTEsMS43NzQ3NTk5MiA5Ljc5MjQzMDg2LDEuOTQ5MjkwNDEgQzkuNzM2MTEzNywyLjI3MTU4MTI4IDkuNjQ0Nzk1NjksMi42Mzg0ODg5OCA5LjU1MTg5ODcsMi45NzQ0MjczNSBDOS41MDkyNjYwOCwzLjEyODIyNDEzIDkuNDY2NjMzNDcsMy4yNzQ2NzIyNyA5LjQyNjM2OTMzLDMuNDA5NTcyNTIgQzguOTMyOTM2MjksMy4yNTAyNjQyNSA4LjQ5MzQ1MTkzLDMuMTY0NDQyNDkgOC4wOTI2NTI3MiwzLjE2MzY1NTE0IEM3Ljc1MTU5MTgxLDMuMTYzMzkyNjggNy40MzQ3NDIsMy4yMjc2OTMzOSA3LjE1ODE1NjM0LDMuMzcxMjU0NTUgWlwiIGlkPVwiU2hhcGVcIiBmaWxsPVwiIzI4MkQzNlwiIGZpbGwtcnVsZT1cIm5vbnplcm9cIj48L3BhdGg+IDwvZz48L3N2Zz4nLFxuICAgICdiay1pbnN0YWdyYW0nOlxuICAgICAgJzxzdmcgY2xhc3M9XCJiay1pY29uXCIgdmlld0JveD1cIjAgMCAyMCAyMFwiIHZlcnNpb249XCIxLjFcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgeG1sbnM6eGxpbms9XCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rXCI+IDxnIGlkPVwiUGFnZS0xXCIgc3Ryb2tlPVwibm9uZVwiIHN0cm9rZS13aWR0aD1cIjFcIiBmaWxsPVwibm9uZVwiIGZpbGwtcnVsZT1cImV2ZW5vZGRcIiBvcGFjaXR5PVwiMC44XCI+IDxnIGlkPVwiR3JvdXBcIiBmaWxsPVwiIzI4MkQzNlwiIGZpbGwtcnVsZT1cIm5vbnplcm9cIj4gPHBhdGggZD1cIk0xNC43MDU4ODI0LDUuMjI0NTc4OTRlLTE2IEw1LjI5NDExNzY1LDUuMjI0NTc4OTRlLTE2IEMyLjM3MDI1NzIxLDAgNS4yMjQ1Nzg5NGUtMTYsMi4zNzAyNTcyMSAwLDUuMjk0MTE3NjUgTDAsMTQuNzA1ODgyNCBDLTEuNTY3MzczNjhlLTE1LDE3LjYyOTc0MjggMi4zNzAyNTcyMSwyMCA1LjI5NDExNzY1LDIwIEwxNC43MDU4ODI0LDIwIEMxNi4xMDk5Njk3LDIwIDE3LjQ1NjU0OTIsMTkuNDQyMjI4NSAxOC40NDkzODg4LDE4LjQ0OTM4ODggQzE5LjQ0MjIyODUsMTcuNDU2NTQ5MiAyMCwxNi4xMDk5Njk3IDIwLDE0LjcwNTg4MjQgTDIwLDUuMjk0MTE3NjUgQzIwLDIuMzcwMjU3MjEgMTcuNjI5NzQyOCwwIDE0LjcwNTg4MjQsNS4yMjQ1Nzg5NGUtMTYgWiBNMTksMTQuOCBDMTksMTcuMTE5NTk1OSAxNy4xMTk1OTU5LDE5IDE0LjgsMTkgTDUuMiwxOSBDMi44ODA0MDQwNSwxOSAxLDE3LjExOTU5NTkgMSwxNC44IEwxLDUuMiBDMSwyLjg4MDQwNDA1IDIuODgwNDA0MDUsMSA1LjIsMSBMMTQuOCwxIEMxNy4xMTk1OTU5LDEgMTksMi44ODA0MDQwNSAxOSw1LjIgTDE5LDE0LjggWlwiIGlkPVwiU2hhcGVcIj48L3BhdGg+IDxwYXRoIGQ9XCJNOS41LDUgQzcuMDE0NzE4NjMsNSA1LDcuMDE0NzE4NjMgNSw5LjUgQzUsMTEuOTg1MjgxNCA3LjAxNDcxODYzLDE0IDkuNSwxNCBDMTEuOTg1MjgxNCwxNCAxNCwxMS45ODUyODE0IDE0LDkuNSBDMTQsOC4zMDY1MjU4IDEzLjUyNTg5NDIsNy4xNjE5MzMxOSAxMi42ODE5ODA1LDYuMzE4MDE5NDggQzExLjgzODA2NjgsNS40NzQxMDU3OCAxMC42OTM0NzQyLDUgOS41LDUgWiBNOS41LDEzIEM3LjU2NzAwMzM4LDEzIDYsMTEuNDMyOTk2NiA2LDkuNSBDNiw3LjU2NzAwMzM4IDcuNTY3MDAzMzgsNiA5LjUsNiBDMTEuNDMyOTk2Niw2IDEzLDcuNTY3MDAzMzggMTMsOS41IEMxMywxMC40MjgyNTc3IDEyLjYzMTI1MTEsMTEuMzE4NDk2NCAxMS45NzQ4NzM3LDExLjk3NDg3MzcgQzExLjMxODQ5NjQsMTIuNjMxMjUxMSAxMC40MjgyNTc3LDEzIDkuNSwxMyBaXCIgaWQ9XCJTaGFwZVwiPjwvcGF0aD4gPHBhdGggZD1cIk0xNSwzIEMxNC40NDc3MTUzLDMgMTQsMy40NDc3MTUyNSAxNCw0IEMxNCw0LjU1MjI4NDc1IDE0LjQ0NzcxNTMsNSAxNSw1IEMxNS41NTIyODQ3LDUgMTYsNC41NTIyODQ3NSAxNiw0IEMxNiwzLjQ0NzcxNTI1IDE1LjU1MjI4NDcsMyAxNSwzIFpcIiBpZD1cIlNoYXBlXCI+PC9wYXRoPiA8L2c+IDwvZz48L3N2Zz4nLFxuICAgICdiay1tYXAnOlxuICAgICAgJzxzdmcgY2xhc3M9XCJiay1pY29uXCIgIHZlcnNpb249XCIxLjFcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIyNFwiIGhlaWdodD1cIjI0XCIgdmlld0JveD1cIjAgMCAyNCAyNFwiPjxwYXRoIGQ9XCJNMTUgMTguOTg0di0xMS44NTlsLTYtMi4xMDl2MTEuODU5ek0yMC40ODQgM2MwLjI4MSAwIDAuNTE2IDAuMjM0IDAuNTE2IDAuNTE2djE1LjA5NGMwIDAuMjM0LTAuMTg4IDAuNDIyLTAuMzc1IDAuNDY5bC01LjYyNSAxLjkyMi02LTIuMTA5LTUuMzQ0IDIuMDYzLTAuMTQxIDAuMDQ3Yy0wLjI4MSAwLTAuNTE2LTAuMjM0LTAuNTE2LTAuNTE2di0xNS4wOTRjMC0wLjIzNCAwLjE4OC0wLjQyMiAwLjM3NS0wLjQ2OWw1LjYyNS0xLjkyMiA2IDIuMTA5IDUuMzQ0LTIuMDYzelwiPjwvcGF0aD48L3N2Zz4nLFxuICAgICdiay1waG9uZSc6XG4gICAgICAnPHN2ZyBjbGFzcz1cImJrLWljb25cIiB2aWV3Qm94PVwiMCAwIDIwIDIwXCIgdmVyc2lvbj1cIjEuMVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB4bWxuczp4bGluaz1cImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmtcIj4gPGcgaWQ9XCJQYWdlLTFcIiBzdHJva2U9XCJub25lXCIgc3Ryb2tlLXdpZHRoPVwiMVwiIGZpbGw9XCJub25lXCIgZmlsbC1ydWxlPVwiZXZlbm9kZFwiPiA8ZyBpZD1cIkZSRUUxMDBpY29uc1wiIHRyYW5zZm9ybT1cInRyYW5zbGF0ZSgtNzUuMDAwMDAwLCAtOTM2LjAwMDAwMClcIiBmaWxsPVwiIzFBMTkxOVwiPiA8ZyBpZD1cIkpcIiB0cmFuc2Zvcm09XCJ0cmFuc2xhdGUoNzUuMDAwMDAwLCA5MzYuMDAwMDAwKVwiPiA8ZyBpZD1cIjJKXCI+IDxwYXRoIGQ9XCJNMS41ODk3ODcyMywzLjk0ODkzNjE3IEMxLjU3MzE5MTQ5LDQuMTc4NzIzNCAxLjU5NTMxOTE1LDQuODg5MzYxNyAyLjE5Mjc2NTk2LDYuNDQyNTUzMTkgTDIuMjExOTE0ODksNi40OTc4NzIzNCBDMy4wMDg5MzYxNyw5LjM2MTcwMjEzIDguNzgyMTI3NjYsMTUuNjc2NTk1NyAxMi4wMTc0NDY4LDE3LjIyNTUzMTkgQzE0LjQzNjU5NTcsMTguMzgyOTc4NyAxNS44NDIxMjc3LDE4LjYwNDI1NTMgMTYuMTE0NDY4MSwxOC41MzE5MTQ5IEMxNi40MjU5NTc0LDE4LjQwODUxMDYgMTcuMzM0NDY4MSwxNy4zMTkxNDg5IDE3LjcyMjEyNzcsMTYuODU1MzE5MSBDMTcuOTEwMjEyOCwxNi42Mjk3ODcyIDE4LjA3OTE0ODksMTYuNDI1NTMxOSAxOC4yMTM2MTcsMTYuMjc2NTk1NyBDMTguMzI2MzgzLDE2LjE0ODkzNjIgMTguMzIyMTI3NywxNi4wNzY1OTU3IDE4LjMyMDg1MTEsMTYuMDUxMDYzOCBDMTguMzEzNjE3LDE1LjkyNzY1OTYgMTguMTk4NzIzNCwxNS43Nzg3MjM0IDE4LjEyODA4NTEsMTUuNzEwNjM4MyBMMTQuODc3MDIxMywxMy41MDYzODMgQzE0LjQyOTc4NzIsMTMuMzcwMjEyOCAxNC4wNzkxNDg5LDEzLjQ4MDg1MTEgMTQuMDEyNzY2LDEzLjUwMjEyNzcgTDExLjY5ODI5NzksMTQuNzYxNzAyMSBMMTEuMzc0MDQyNiwxNC41MzE5MTQ5IEM3LjgzNDA0MjU1LDEyLjAzNDA0MjYgNS42NTA2MzgzLDguNjI1NTMxOTEgNS41NTkxNDg5NCw4LjQ4MDg1MTA2IEw1LjM2ODA4NTExLDguMTc4NzIzNCBMNS41MjU1MzE5MSw3Ljg1NTMxOTE1IEM1LjU1ODcyMzQsNy43OTE0ODkzNiA2LjMzODcyMzQsNi4yMDQyNTUzMiA2LjcxNzQ0NjgxLDUuNTYxNzAyMTMgQzYuODE0NDY4MDksNS4zOTU3NDQ2OCA2LjY2MTI3NjYsNC44ODkzNjE3IDYuNDY0NjgwODUsNC41NjU5NTc0NSBDNS44NjU5NTc0NSwzLjYzODI5Nzg3IDQuNzU3MDIxMjgsMi4wMjU1MzE5MSA0LjM3MTkxNDg5LDEuNjk3ODcyMzQgQzQuMTk4NzIzNCwxLjU0ODkzNjE3IDMuOTgwODUxMDYsMS42NjM4Mjk3OSAzLjg5NjU5NTc0LDEuNzE5MTQ4OTQgQzIuOTMxOTE0ODksMi41NTMxOTE0OSAxLjgxODI5Nzg3LDMuNjEyNzY1OTYgMS41ODk3ODcyMywzLjk0ODkzNjE3IFogTTE1Ljk5Nzg3MjMsMTkuODEyNzY2IEMxNC44ODI5Nzg3LDE5LjgxMjc2NiAxMy4wMDM4Mjk4LDE5LjExMDYzODMgMTEuNDY2MzgzLDE4LjM3NDQ2ODEgQzcuOTQ4OTM2MTcsMTYuNjkzNjE3IDEuOTAxNzAyMTMsMTAuMDQ2ODA4NSAwLjk5MTA2MzgzLDYuODcyMzQwNDMgQzAuNDUwMjEyNzY2LDUuNDYzODI5NzkgMC4yMjQyNTUzMTksNC4zNTc0NDY4MSAwLjMzODI5Nzg3MiwzLjY3MjM0MDQzIEMwLjM3MzYxNzAyMSwzLjQ1OTU3NDQ3IDAuNDQ3NjU5NTc0LDMuMDE3MDIxMjggMy4wODY4MDg1MSwwLjcyNzY1OTU3NCBMMy4xMjE3MDIxMywwLjcwMjEyNzY2IEMzLjUsMC40MTcwMjEyNzcgNC40MjE3MDIxMywwLjA1NTMxOTE0ODkgNS4yMDI5Nzg3MiwwLjcyNzY1OTU3NCBDNS44MzkxNDg5NCwxLjI3MjM0MDQzIDcuMjY2ODA4NTEsMy40NTUzMTkxNSA3LjU0NjM4Mjk4LDMuODg1MTA2MzggQzcuNjQsNC4wMzgyOTc4NyA4LjM2NjgwODUxLDUuMjgwODUxMDYgNy44MTY1OTU3NCw2LjIxMjc2NTk2IEM3LjU2MjEyNzY2LDYuNjQyNTUzMTkgNy4wODU1MzE5MSw3LjU4NzIzNDA0IDYuODM1MzE5MTUsOC4wODkzNjE3IEM3LjQxMTQ4OTM2LDguOTE5MTQ4OTQgOS4yMTM2MTcwMiwxMS4zNDg5MzYyIDExLjc5MDYzODMsMTMuMjU1MzE5MSBMMTMuNDczMTkxNSwxMi4zNDQ2ODA5IEMxMy41NjEyNzY2LDEyLjMwNjM4MyAxNC4zNjUxMDY0LDExLjk2MTcwMjEgMTUuMzc3MDIxMywxMi4zMjc2NTk2IEwxNS41MjA0MjU1LDEyLjQgTDE4LjkzNzAyMTMsMTQuNzE5MTQ4OSBDMTguOTk5MTQ4OSwxNC43NzAyMTI4IDE5LjU0NDI1NTMsMTUuMjUxMDYzOCAxOS41OTQwNDI2LDE1Ljk1NzQ0NjggQzE5LjYxNDQ2ODEsMTYuMjUxMDYzOCAxOS41NTY1OTU3LDE2LjY4OTM2MTcgMTkuMTY1MTA2NCwxNy4xMjc2NTk2IEMxOS4wMzgyOTc5LDE3LjI2ODA4NTEgMTguODc5MTQ4OSwxNy40NTk1NzQ1IDE4LjcwMjU1MzIsMTcuNjcyMzQwNCBDMTcuNzgzODI5OCwxOC43NzAyMTI4IDE3LjA4NzY1OTYsMTkuNTY1OTU3NCAxNi40OTE0ODk0LDE5Ljc0ODkzNjIgQzE2LjM1MjM0MDQsMTkuNzkxNDg5NCAxNi4xODU5NTc0LDE5LjgxMjc2NiAxNS45OTc4NzIzLDE5LjgxMjc2NiBaXCI+PC9wYXRoPiA8L2c+IDwvZz4gPC9nPiA8L2c+PC9zdmc+JyxcbiAgICAnYmstcGx1cyc6XG4gICAgICAnPHN2ZyBjbGFzcz1cImJrLWljb25cIiB2aWV3Qm94PVwiMCAwIDI2IDI2XCIgdmVyc2lvbj1cIjEuMVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB4bWxuczp4bGluaz1cImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmtcIj4gPGcgaWQ9XCJQYWdlLTFcIiBzdHJva2U9XCJub25lXCIgc3Ryb2tlLXdpZHRoPVwiMVwiIGZpbGw9XCJub25lXCIgZmlsbC1ydWxlPVwiZXZlbm9kZFwiPiA8cGF0aCBkPVwiTTE0LjM4MjAwOTEsMTIuODU4MDI3MyBMMjEuNzEzNjI5LDUuNTI2Mjc0NjcgQzIyLjA5NTQ1Nyw1LjE0NTA5MTI5IDIyLjA5NTQ1Nyw0LjUyNTQyMzk3IDIxLjcxMzYyOSw0LjE0NDI0MDYgQzIxLjMzMTgwMSwzLjc2MjQwNTY0IDIwLjcxMzQ0OCwzLjc2MjQwNTY0IDIwLjMzMTYxOTksNC4xNDQyNDA2IEwxMywxMS40NzU5OTMyIEw1LjY2ODM4MDEsNC4xNDQyNDA2IEM1LjI4NjU1MjA0LDMuNzYyNDA1NjQgNC42NjgxOTkxLDMuNzYyNDA1NjQgNC4yODYzNzEwNCw0LjE0NDI0MDYgQzMuOTA0NTQyOTksNC41MjU0MjM5NyAzLjkwNDU0Mjk5LDUuMTQ1MDkxMjkgNC4yODYzNzEwNCw1LjUyNjI3NDY3IEwxMS42MTc5OTEsMTIuODU4MDI3MyBMNC4yODYzNzEwNCwyMC4xODk3Nzk5IEMzLjkwNDU0Mjk5LDIwLjU3MDk2MzMgMy45MDQ1NDI5OSwyMS4xOTA2MzA2IDQuMjg2MzcxMDQsMjEuNTcxODE0IEM0LjQ3NzI4NTA3LDIxLjc2MjczMTQgNC43Mjc0OTMyMSwyMS44NTc4NjQ0IDQuOTc3NzAxMzYsMjEuODU3ODY0NCBDNS4yMjc5MDk1LDIxLjg1Nzg2NDQgNS40Nzc0NjYwNywyMS43NjI3MzE0IDUuNjY4MzgwMSwyMS41NzE4MTQgTDEzLDE0LjI0MDA2MTMgTDIwLjMzMTYxOTksMjEuNTcxODE0IEMyMC41MjI1MzM5LDIxLjc2MjczMTQgMjAuNzcyNzQyMSwyMS44NTc4NjQ0IDIxLjAyMjk1MDIsMjEuODU3ODY0NCBDMjEuMjczMTU4NCwyMS44NTc4NjQ0IDIxLjUyMjcxNSwyMS43NjI3MzE0IDIxLjcxMzYyOSwyMS41NzE4MTQgQzIyLjA5NTQ1NywyMS4xOTA2MzA2IDIyLjA5NTQ1NywyMC41NzA5NjMzIDIxLjcxMzYyOSwyMC4xODk3Nzk5IEwxNC4zODIwMDkxLDEyLjg1ODAyNzNcIiBpZD1cIjRBXCIgZmlsbD1cIiNGRkZGRkZcIiBmaWxsLXJ1bGU9XCJub256ZXJvXCIgdHJhbnNmb3JtPVwidHJhbnNsYXRlKDEzLjAwMDAwMCwgMTIuODU3ODY0KSByb3RhdGUoNDUuMDAwMDAwKSB0cmFuc2xhdGUoLTEzLjAwMDAwMCwgLTEyLjg1Nzg2NCkgXCI+PC9wYXRoPiA8L2c+PC9zdmc+JyxcbiAgICAnYmstc2VhcmNoJzpcbiAgICAgICc8c3ZnICBjbGFzcz1cImJrLWljb25cIiB2aWV3Qm94PVwiMCAwIDIwIDIwXCIgdmVyc2lvbj1cIjEuMVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB4bWxuczp4bGluaz1cImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmtcIj4gPGcgaWQ9XCJQYWdlLTFcIiBzdHJva2U9XCJub25lXCIgc3Ryb2tlLXdpZHRoPVwiMVwiIGZpbGw9XCJub25lXCIgZmlsbC1ydWxlPVwiZXZlbm9kZFwiPiA8ZyBpZD1cImljX3NlYXJjaC93aGl0ZVwiIGZpbGw9XCIjRkZGRkZGXCI+IDxwYXRoIGQ9XCJNMTEuOTM0NTI4MiwxNC40Nzg1NjAxIEMxMC4xNzI4NDY3LDE0LjQ3ODU2MDEgOC41NzQ4NDQ4OSwxMy43NzQ0ODM5IDcuNDA2NzY3NzMsMTIuNjMxMDIxNyBDNy40MDUxNzM0NCwxMi42MzEwMjE3IDcuNDA0NjQyMDIsMTIuNjI1NzI3OSA3LjQwMzA0Nzc0LDEyLjYyNTcyNzkgQzcuNDAwMzkwNiwxMi42MjU3Mjc5IDcuMzk2NjcwNjEsMTIuNjIwNDM0MSA3LjM5NDAxMzQ3LDEyLjYyMDQzNDEgQzYuMjAzNjE2MzYsMTEuNDUwNTAyOSA1LjQ2MzMzODE2LDkuODI1MzA0MzkgNS40NjMzMzgxNiw4LjAzNTk5Nzg4IEM1LjQ2MzMzODE2LDQuNDc4NTYwMDggOC4zNjY1MjU0LDEuNTg4MTQxODcgMTEuOTM0NTI4MiwxLjU4ODE0MTg3IEMxNS41MDI1MzA5LDEuNTg4MTQxODcgMTguNDA1NzE4Miw0LjQ3ODU2MDA4IDE4LjQwNTcxODIsOC4wMzU5OTc4OCBDMTguNDA1NzE4MiwxMS41ODgxNDE5IDE1LjUwMjUzMDksMTQuNDc4NTYwMSAxMS45MzQ1MjgyLDE0LjQ3ODU2MDEgWiBNMy44NjkwNTYzMiw4LjAzNTk5Nzg4IEMzLjg2OTA1NjMyLDkuOTg0MTE4NTggNC41NzEwNzE3NiwxMS43NzM0MjUxIDUuNzM0MzY2MDcsMTMuMTY1Njk2MSBMMC4yMzM1NjIyOSwxOC42NDQ3ODU2IEMtMC4wNzc4NTQwOTY2LDE4Ljk1NzEyMDIgLTAuMDc3ODU0MDk2NiwxOS40NTQ3MzggMC4yMzM1NjIyOSwxOS43NjcwNzI1IEMwLjM4OTI3MDQ4MywxOS45MjA1OTI5IDAuNTkzMzM4NTU5LDIwIDAuNzk3NDA2NjM1LDIwIEMxLjAwMTQ3NDcxLDIwIDEuMjA1MDExMzYsMTkuOTIwNTkyOSAxLjM2MDcxOTU1LDE5Ljc2NzA3MjUgTDYuODcxMDg5MDMsMTQuMjc3Mzk1NCBDOC4yNTY1MTk5NSwxNS4zOTQzODg2IDEwLjAxNzY3LDE2LjA2NjcwMiAxMS45MzQ1MjgyLDE2LjA2NjcwMiBDMTYuMzgyMDQzMSwxNi4wNjY3MDIgMjAsMTIuNDYxNjE5OSAyMCw4LjAzNTk5Nzg4IEMyMCwzLjYwNTA4MjA1IDE2LjM4MjA0MzEsMCAxMS45MzQ1MjgyLDAgQzcuNDg3NTQ0NjcsMCAzLjg2OTA1NjMyLDMuNjA1MDgyMDUgMy44NjkwNTYzMiw4LjAzNTk5Nzg4IFpcIiBpZD1cIjZGXCIgdHJhbnNmb3JtPVwidHJhbnNsYXRlKDEwLjAwMDAwMCwgMTAuMDAwMDAwKSBzY2FsZSgtMSwgMSkgdHJhbnNsYXRlKC0xMC4wMDAwMDAsIC0xMC4wMDAwMDApIFwiPjwvcGF0aD4gPC9nPiA8L2c+PC9zdmc+JyxcbiAgICAnYmstc25hcGNoYXQnOlxuICAgICAgJzxzdmcgY2xhc3M9XCJiay1pY29uXCIgdmlld0JveD1cIjAgMCAyMSAyMFwiIHZlcnNpb249XCIxLjFcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgeG1sbnM6eGxpbms9XCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rXCI+IDxnIGlkPVwiUGFnZS0xXCIgc3Ryb2tlPVwibm9uZVwiIHN0cm9rZS13aWR0aD1cIjFcIiBmaWxsPVwibm9uZVwiIGZpbGwtcnVsZT1cImV2ZW5vZGRcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIj4gPGcgaWQ9XCJpY29uczgtc25hcGNoYXQtKDEpXCIgdHJhbnNmb3JtPVwidHJhbnNsYXRlKDEuMDAwMDAwLCAxLjAwMDAwMClcIiBzdHJva2U9XCIjMDAwMDAwXCI+IDxwYXRoIGQ9XCJNOS41NDg1NzE0MywxNy44NDk1NzE0IEM5LjUwMDE0Mjg2LDE3Ljg0OTU3MTQgOS40NTIxNDI4NiwxNy44NDgyODU3IDkuNDA0NTcxNDMsMTcuODQ1NzE0MyBDOS4zNzQxNDI4NiwxNy44NDgyODU3IDkuMzQyNDI4NTcsMTcuODQ5NTcxNCA5LjMxMDI4NTcxLDE3Ljg0OTU3MTQgQzguMTkzLDE3Ljg0OTU3MTQgNy40NzYsMTcuMzQyNTcxNCA2Ljc4MjU3MTQzLDE2Ljg1MjcxNDMgQzYuMzAzODU3MTQsMTYuNTE0NTcxNCA1Ljg1MjE0Mjg2LDE2LjE5NDg1NzEgNS4zMTk4NTcxNCwxNi4xMDY1NzE0IEM1LjA2MDE0Mjg2LDE2LjA2MzcxNDMgNC44MDE3MTQyOSwxNi4wNDE4NTcxIDQuNTUxODU3MTQsMTYuMDQxODU3MSBDNC4xMDE4NTcxNCwxNi4wNDE4NTcxIDMuNzQ2NTcxNDMsMTYuMTExMjg1NyAzLjQ4NzI4NTcxLDE2LjE2MTg1NzEgQzMuMzI5NTcxNDMsMTYuMTkyNzE0MyAzLjE5MzcxNDI5LDE2LjIxOTI4NTcgMy4wOTA0Mjg1NywxNi4yMTkyODU3IEMyLjk4MjQyODU3LDE2LjIxOTI4NTcgMi44NjU0Mjg1NywxNi4xOTYxNDI5IDIuODE0ODU3MTQsMTYuMDIyMTQyOSBDMi43NzA3MTQyOSwxNS44NzE3MTQzIDIuNzM4NTcxNDMsMTUuNzI2IDIuNzA4MTQyODYsMTUuNTg1IEMyLjYyODg1NzE0LDE1LjIyMjQyODYgMi41NzI3MTQyOSwxNC45OTkxNDI5IDIuNDIwNTcxNDMsMTQuOTc2IEMwLjY0ODg1NzE0MywxNC43MDIxNDI5IDAuMTQxNDI4NTcxLDE0LjMyOTI4NTcgMC4wMjg3MTQyODU3LDE0LjA2NDQyODYgQzAuMDEyODU3MTQyOSwxNC4wMjY3MTQzIDAuMDAzNDI4NTcxNDMsMTMuOTg4NTcxNCAwLjAwMTI4NTcxNDI5LDEzLjk1MDg1NzEgQy0wLjAwNDI4NTcxNDI5LDEzLjg0OTI4NTcgMC4wNjc3MTQyODU3LDEzLjc1OTI4NTcgMC4xNjgsMTMuNzQzIEMyLjg5MTU3MTQzLDEzLjI5NDI4NTcgNC4xMTMsMTAuNTEwNzE0MyA0LjE2NCwxMC4zOTI0Mjg2IEM0LjE2NTI4NTcxLDEwLjM4OSA0LjE2NywxMC4zODYgNC4xNjgyODU3MSwxMC4zODI1NzE0IEM0LjMzNSwxMC4wNDQ4NTcxIDQuMzY3NTcxNDMsOS43NTEyODU3MSA0LjI2NTU3MTQzLDkuNTExMjg1NzEgQzQuMDc4NzE0MjksOS4wNzA3MTQyOSAzLjQ2ODg1NzE0LDguODc3IDMuMDY1NTcxNDMsOC43NDkyODU3MSBDMi45NjcsOC43MTggMi44NzMxNDI4Niw4LjY4ODQyODU3IDIuNzk5NDI4NTcsOC42NTkyODU3MSBDMS45OTQxNDI4Niw4LjM0MDg1NzE0IDEuOTI3Mjg1NzEsOC4wMTQyODU3MSAxLjk1OSw3Ljg0NzU3MTQzIEMyLjAxMyw3LjU2Mzg1NzE0IDIuMzkyMjg1NzEsNy4zNjU4NTcxNCAyLjY5ODcxNDI5LDcuMzY1ODU3MTQgQzIuNzgyNzE0MjksNy4zNjU4NTcxNCAyLjg1Njg1NzE0LDcuMzgwODU3MTQgMi45MTksNy40MSBDMy4yODExNDI4Niw3LjU3OTcxNDI5IDMuNjA3NzE0MjksNy42NjU4NTcxNCAzLjg4OTI4NTcxLDcuNjY1ODU3MTQgQzQuMjc4NDI4NTcsNy42NjU4NTcxNCA0LjQ0ODU3MTQzLDcuNTAyMTQyODYgNC40NjkxNDI4Niw3LjQ4MDcxNDI5IEM0LjQ1OTI4NTcxLDcuMjk2NDI4NTcgNC40NDY4NTcxNCw3LjEwNCA0LjQzNDQyODU3LDYuOTA1MTQyODYgQzQuMzUzNDI4NTcsNS42MTcyODU3MSA0LjI1MjcxNDI5LDQuMDE3NDI4NTcgNC42NjAyODU3MSwzLjEwNDE0Mjg2IEM1Ljg4MTI4NTcxLDAuMzY2NDI4NTcxIDguNDcwNzE0MjksMC4xNTM4NTcxNDMgOS4yMzUyODU3MSwwLjE1Mzg1NzE0MyBDOS4yNTUsMC4xNTM4NTcxNDMgOS41NzA0Mjg1NywwLjE1MDQyODU3MSA5LjU3MDQyODU3LDAuMTUwNDI4NTcxIEw5LjYxNTg1NzE0LDAuMTUwNDI4NTcxIEMxMC4zODIxNDI5LDAuMTUwNDI4NTcxIDEyLjk3NzE0MjksMC4zNjM0Mjg1NzEgMTQuMTk5LDMuMTAyODU3MTQgQzE0LjYwNjU3MTQsNC4wMTY1NzE0MyAxNC41MDU4NTcxLDUuNjE4MTQyODYgMTQuNDI0NDI4Niw2LjkwNDcxNDI5IEwxNC40MjEsNi45NjA4NTcxNCBDMTQuNDA5ODU3MSw3LjE0IDE0LjM5ODcxNDMsNy4zMTQgMTQuMzg5NzE0Myw3LjQ4MDcxNDI5IEMxNC40MDksNy41MDA0Mjg1NyAxNC41NjU0Mjg2LDcuNjUwODU3MTQgMTQuOTE4MTQyOSw3LjY2NDU3MTQzIEwxNC45MTg1NzE0LDcuNjY0NTcxNDMgQzE1LjE4Njg1NzEsNy42NTQyODU3MSAxNS40OTUsNy41NjkgMTUuODMzMTQyOSw3LjQxMDQyODU3IEMxNS45MzIxNDI5LDcuMzY0MTQyODYgMTYuMDQyMjg1Nyw3LjM1NDI4NTcxIDE2LjExNzI4NTcsNy4zNTQyODU3MSBDMTYuMjMxNzE0Myw3LjM1NDI4NTcxIDE2LjM0Nzg1NzEsNy4zNzY1NzE0MyAxNi40NDQyODU3LDcuNDE2ODU3MTQgTDE2LjQ1MDI4NTcsNy40MTk0Mjg1NyBDMTYuNzIzNzE0Myw3LjUxNjI4NTcxIDE2LjkwMjg1NzEsNy43MDgyODU3MSAxNi45MDY3MTQzLDcuOTA4NDI4NTcgQzE2LjkxMDE0MjksOC4wOTcgMTYuNzY2MTQyOSw4LjM4MDcxNDI5IDE2LjA1OTg1NzEsOC42NTk3MTQyOSBDMTUuOTg2NTcxNCw4LjY4ODQyODU3IDE1Ljg5MzE0MjksOC43MTg0Mjg1NyAxNS43OTM3MTQzLDguNzQ5NzE0MjkgQzE1LjM4OTU3MTQsOC44Nzc4NTcxNCAxNC43ODAxNDI5LDkuMDcxMTQyODYgMTQuNTkzNzE0Myw5LjUxMTcxNDI5IEMxNC40OTE3MTQzLDkuNzUyMTQyODYgMTQuNTI0Mjg1NywxMC4wNDQ4NTcxIDE0LjY5MSwxMC4zODMgQzE0LjY5MjI4NTcsMTAuMzg2NDI4NiAxNC42OTQsMTAuMzg5NDI4NiAxNC42OTUyODU3LDEwLjM5Mjg1NzEgQzE0Ljc0NTg1NzEsMTAuNTExMTQyOSAxNS45NjY0Mjg2LDEzLjI5Mzg1NzEgMTguNjkxMjg1NywxMy43NDMgQzE4Ljc5MiwxMy43NTk3MTQzIDE4Ljg2MzU3MTQsMTMuODQ5Mjg1NyAxOC44NTgsMTMuOTUxMjg1NyBDMTguODU1ODU3MSwxMy45ODk0Mjg2IDE4Ljg0NjQyODYsMTQuMDI4IDE4LjgzMDE0MjksMTQuMDY1Mjg1NyBDMTguNzE3ODU3MSwxNC4zMjggMTguMjEwODU3MSwxNC43MDA4NTcxIDE2LjQzODcxNDMsMTQuOTc0NzE0MyBDMTYuMjkzODU3MSwxNC45OTcgMTYuMjM3NzE0MywxNS4xODU1NzE0IDE2LjE1MTU3MTQsMTUuNTgxMTQyOSBDMTYuMTIwMjg1NywxNS43MjUxNDI5IDE2LjA4ODE0MjksMTUuODY2NTcxNCAxNi4wNDQ0Mjg2LDE2LjAxNTI4NTcgQzE2LjAwNjcxNDMsMTYuMTQ0Mjg1NyAxNS45MjYxNDI5LDE2LjIwNDcxNDMgMTUuNzkwNzE0MywxNi4yMDQ3MTQzIEwxNS43Njg4NTcxLDE2LjIwNDcxNDMgQzE1LjY3NSwxNi4yMDQ3MTQzIDE1LjU0MTI4NTcsMTYuMTg4IDE1LjM3MjQyODYsMTYuMTU0NTcxNCBDMTUuMDcyNDI4NiwxNi4wOTU4NTcxIDE0LjczNiwxNi4wNDE4NTcxIDE0LjMwNzg1NzEsMTYuMDQxODU3MSBDMTQuMDU4LDE2LjA0MTg1NzEgMTMuNzk5MTQyOSwxNi4wNjM3MTQzIDEzLjUzOTQyODYsMTYuMTA2NTcxNCBDMTMuMDA3NTcxNCwxNi4xOTUyODU3IDEyLjU1NjI4NTcsMTYuNTE0MTQyOSAxMi4wNzg0Mjg2LDE2Ljg1MTg1NzEgQzExLjM4Mjg1NzEsMTcuMzQyNTcxNCAxMC42NjU4NTcxLDE3Ljg0OTU3MTQgOS41NDg1NzE0MywxNy44NDk1NzE0IFpcIiBpZD1cIlNoYXBlXCI+PC9wYXRoPiA8L2c+IDwvZz48L3N2Zz4nLFxuICAgICdiay1zdGFyJzpcbiAgICAgICc8c3ZnIGNsYXNzPVwiYmstaWNvblwiIHZpZXdCb3g9XCIwIDAgMjAgMTlcIiB2ZXJzaW9uPVwiMS4xXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHhtbG5zOnhsaW5rPVwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGlua1wiPiA8ZyBpZD1cIlBhZ2UtMVwiIHN0cm9rZT1cIm5vbmVcIiBzdHJva2Utd2lkdGg9XCIxXCIgZmlsbD1cIm5vbmVcIiBmaWxsLXJ1bGU9XCJldmVub2RkXCI+IDxnIGlkPVwiRlJFRTEwMGljb25zXCIgdHJhbnNmb3JtPVwidHJhbnNsYXRlKC00NDQuMDAwMDAwLCAtMTQ0OC4wMDAwMDApXCIgZmlsbD1cIiMxQTE5MTlcIj4gPGcgaWQ9XCJKXCIgdHJhbnNmb3JtPVwidHJhbnNsYXRlKDEyLjAwMDAwMCwgMTQ0Ny4wMDAwMDApXCI+IDxnIGlkPVwiNEpcIiB0cmFuc2Zvcm09XCJ0cmFuc2xhdGUoNDMyLjAwMDAwMCwgMS4wMDAwMDApXCI+IDxwYXRoIGQ9XCJNMi40MzI4ODg4OSw3Ljg1NjI3OTA3IEw1Ljk3NDIyMjIyLDExLjI4OTUzNDkgQzYuMTMxMTExMTEsMTEuNDM5NzY3NCA2LjIwMzExMTExLDExLjY2MDY5NzcgNi4xNjYyMjIyMiwxMS44NzI3OTA3IEw1LjMyOTc3Nzc4LDE2LjcyIEw5LjcwNzU1NTU2LDE0LjQzMTE2MjggQzkuOTAxNzc3NzgsMTQuMzI5NTM0OSAxMC4xMzM3Nzc4LDE0LjMyOTUzNDkgMTAuMzI4LDE0LjQzMTE2MjggTDE0LjcwNTMzMzMsMTYuNzIgTDEzLjg2OTc3NzgsMTEuODcyNzkwNyBDMTMuODMyNDQ0NCwxMS42NjA2OTc3IDEzLjkwNDQ0NDQsMTEuNDM5NzY3NCAxNC4wNjEzMzMzLDExLjI4OTUzNDkgTDE3LjYwMjY2NjcsNy44NTYyNzkwNyBMMTIuNzA4NDQ0NCw3LjE0OTMwMjMzIEMxMi40OTExMTExLDcuMTE4MzcyMDkgMTIuMzAzNTU1Niw2Ljk4MTM5NTM1IDEyLjIwNjIyMjIsNi43ODY5NzY3NCBMMTAuMDE3Nzc3OCwyLjM3NzIwOTMgTDcuODI4ODg4ODksNi43ODY5NzY3NCBDNy43MzE1NTU1Niw2Ljk4MTM5NTM1IDcuNTQ0LDcuMTE4MzcyMDkgNy4zMjcxMTExMSw3LjE0OTMwMjMzIEwyLjQzMjg4ODg5LDcuODU2Mjc5MDcgWiBNNC40NDQ0NDQ0NCwxOC41OTM0ODg0IEM0LjMwNjIyMjIyLDE4LjU5MzQ4ODQgNC4xNjg4ODg4OSwxOC41NTM3MjA5IDQuMDUyNDQ0NDQsMTguNDY5NzY3NCBDMy44NDcxMTExMSwxOC4zMTk1MzQ5IDMuNzQ0NDQ0NDQsMTguMDY3Njc0NCAzLjc4NzExMTExLDE3LjgyMDIzMjYgTDQuNzkyNDQ0NDQsMTEuOTkyMDkzIEwwLjUzNDY2NjY2Nyw3Ljg2OTUzNDg4IEMwLjM1Mjg4ODg4OSw3LjY5Mjc5MDcgMC4yODc1NTU1NTYsNy40Mjc2NzQ0MiAwLjM2NTc3Nzc3OCw3LjE4OTA2OTc3IEMwLjQ0NDQ0NDQ0NCw2Ljk0NjA0NjUxIDAuNjUyODg4ODg5LDYuNzczNzIwOTMgMC45MDQsNi43MzgzNzIwOSBMNi43ODg0NDQ0NCw1Ljg4NTU4MTQgTDkuNDIsMC41ODc2NzQ0MTkgQzkuNTMyNDQ0NDQsMC4zNTc5MDY5NzcgOS43NjQsMC4yMTY1MTE2MjggMTAuMDE3Nzc3OCwwLjIxNjUxMTYyOCBDMTAuMjcxNTU1NiwwLjIxNjUxMTYyOCAxMC41MDMxMTExLDAuMzU3OTA2OTc3IDEwLjYxNTU1NTYsMC41ODc2NzQ0MTkgTDEzLjI0NzExMTEsNS44ODU1ODE0IEwxOS4xMzExMTExLDYuNzM4MzcyMDkgQzE5LjM4MjIyMjIsNi43NzM3MjA5MyAxOS41OTExMTExLDYuOTQ2MDQ2NTEgMTkuNjY5MzMzMyw3LjE4OTA2OTc3IEMxOS43NDgsNy40Mjc2NzQ0MiAxOS42ODI2NjY3LDcuNjkyNzkwNyAxOS41MDA0NDQ0LDcuODY5NTM0ODggTDE1LjI0MzExMTEsMTEuOTkyMDkzIEwxNi4yNDgsMTcuODIwMjMyNiBDMTYuMjkwNjY2NywxOC4wNjc2NzQ0IDE2LjE4OCwxOC4zMTk1MzQ5IDE1Ljk4MjY2NjcsMTguNDY5NzY3NCBDMTUuNzc3MzMzMywxOC42MTU1ODE0IDE1LjUwNTc3NzgsMTguNjM3Njc0NCAxNS4yODA0NDQ0LDE4LjUxODM3MjEgTDEwLjAxNzc3NzgsMTUuNzcgTDQuNzU0NjY2NjcsMTguNTE4MzcyMSBDNC42NTczMzMzMywxOC41NzEzOTUzIDQuNTUwNjY2NjcsMTguNTkzNDg4NCA0LjQ0NDQ0NDQ0LDE4LjU5MzQ4ODQgWlwiPjwvcGF0aD4gPC9nPiA8L2c+IDwvZz4gPC9nPjwvc3ZnPicsXG4gICAgJ2JrLXR3aXR0ZXInOlxuICAgICAgJzxzdmcgY2xhc3M9XCJiay1pY29uXCIgdmlld0JveD1cIjAgMCAyMCAxOVwiIHZlcnNpb249XCIxLjFcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgeG1sbnM6eGxpbms9XCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rXCI+IDxnIGlkPVwiUGFnZS0xXCIgc3Ryb2tlPVwibm9uZVwiIHN0cm9rZS13aWR0aD1cIjFcIiBmaWxsPVwibm9uZVwiIGZpbGwtcnVsZT1cImV2ZW5vZGRcIiBvcGFjaXR5PVwiMC44XCI+IDxwYXRoIGQ9XCJNMTQuMjI1MDQ2NiwwLjkwOTA5MDkwOSBDMTUuMzg2MzgzNSwwLjkwOTA5MDkwOSAxNi40MzMzNTU4LDEuNDEwMjQzMDQgMTcuMTY5Nzc0OCwyLjIxMzU3NDcxIEMxNy43ODAxNDAxLDIuMjI5NzUxMzUgMTcuODQ0NTg4NiwyLjIzNTU3NDk0IDE4LjEzOTY2MTcsMi4yMzU1NzQ5NCBDMTguMzE3MjExLDIuMjM1NTc0OTQgMTguNTc4MTY0MywyLjIzMzMxMDIxIDE5LjA5MDkwOTEsMi4yMjk3NTEzNSBDMTguNzY1NTA3MywzLjQwMDI5MjYyIDE4LjY3ODYyODIsMy42NDA2Nzc0MSAxOC4yNjEyOTI1LDQuOTg0NjMyMiBDMTguMjY4ODc0Nyw1LjE2MTkyODExIDE4LjI3Mjk4MTcsNS4zMzk1NDc1NiAxOC4yNzI5ODE3LDUuNTE5MTA4MiBDMTguMjcyOTgxNywxMC45Nzc3NTE3IDE0LjIxNTI1MjksMTcuMjcyNzI3MyA2Ljc5NTQ2MDI2LDE3LjI3MjcyNzMgQzMuMjQyNTc4MTgsMTcuMjcyNzI3MyAxLjI0ODQ2NTQ2LDE1LjQ3NDIwOTEgMS41NzM4NjcyNSwxNS40NzQyMDkxIEMzLjQ2MzcyNTAzLDE1LjQ3NDIwOTEgNS4yMDM4MzQ4LDE0LjgxNDUyNTkgNi41ODQ0MjI5OCwxMy43MDYxMDI5IEM0LjgxOTAzOTI5LDEzLjY3MjQ1NTUgLTEuNjA3MTcyMiw5LjQ5MjA4OTYzIDEuOTgwNDYxNTMsMS42NjUxODY4IEMzLjk3MDQ2NzI0LDQuMTY0MTUzMyA2Ljk0Mjk5NjgsNS44MDg2Njk5NiAxMC4yOTU4OTg5LDUuOTgwNzg5MzUgQzEwLjIyNjM5NTYsNS42Nzg2MDk4MiAxMC4xOTEwMTIyLDUuMzYzODEyNTEgMTAuMTkxMDEyMiw1LjAzOTMwOTIyIEMxMC4xOTEwMTIyLDIuNzU4NDAzNzYgMTEuOTk3MTUwMSwwLjkwOTA5MDkwOSAxNC4yMjUwNDY2LDAuOTA5MDkwOTA5IFogTTE5LjA5MDkwOTEsMi43MjcyNzI3MyBMMTkuMDkyNDgyMywyLjcyNzI3MjczIEwxOS4wOTA5MDkxLDIuNzI3MjcyNzMgWiBNMTQuMjA4NTI4NywwIEMxMS41MTk1MTksMCA5LjMyMzU2Nzc1LDIuMTk1ODAzNDUgOS4yNDg5OTUzOSw0LjkyMzQ0NTc0IEM2LjcxMzIyMDgxLDQuNTE2MjkxNzggNC4zODYzNzQ2NiwzLjE2MTc4OTg3IDIuNzQ1MTUzNjQsMS4xMDYwOTYyMiBDMi41NjQ4NTg0NiwwLjg4MDE4NTIyOCAyLjI5NTIwMjMyLDAuNzUxMzIyNzY4IDIuMDEzOTA0MDgsMC43NTEzMjI3NjggQzEuOTc1NTE2NjMsMC43NTEzMjI3NjggMS45MzY4MTQ1MiwwLjc1MzU3MjIzOCAxLjg5ODQyNzA3LDAuNzU4MzkyNTI5IEMxLjU3NjIyNDE3LDAuNzk4ODgyOTc4IDEuMjk3MTI4NDksMS4wMDU1MTI4MSAxLjE1OTMxMTIzLDEuMzA1NjU2MjkgQy0wLjg0NDcwMjcwOCw1LjY2NTQ0OTI4IDAuMTIwMDE4MDg3LDguODUzOTExNDMgMS4yODIzMzk4OCwxMC43NjA4MTg3IEMyLjEyMTUxNDgyLDEyLjEzODEzNjcgMy4yOTg2MjUyMiwxMy4yMTg4NDYxIDQuNDE3NTI1MTQsMTMuODg1OTc0NCBDMy41Mzk5NjI3NCwxNC4yNjkzNDgyIDIuNTkxNjAzODIsMTQuNDY3NjIyOSAxLjYwODk0NzksMTQuNDY3NjIyOSBDMS4wNjk2MzU2MiwxNC40Njc2MjI5IDAuNjMwNjk3MDk5LDE0LjkxMTczMjQgMC42MzA2OTcwOTksMTUuNDU3Mzg5NCBDMC42MzA2OTcwOTksMTYuNDA2MzQ0MSAyLjA5MTkzNzYsMTcuMDc3OTcxNCAyLjU3MTc4MDc5LDE3LjI5ODc0MDggQzMuNDQ4MDg0NTcsMTcuNzAxNzE3MSA0Ljg5NDUzNjQ2LDE4LjE4MTgxODIgNi44MDk1MDQwOSwxOC4xODE4MTgyIEMxMS40NjI1NjcxLDE4LjE4MTgxODIgMTQuMzc4MTI1OCwxNS45MzU1NjIzIDE2LjAwNDU1ODIsMTQuMDUxMTQ5NyBDMTguMDI1ODc3OSwxMS43MDk0NTIxIDE5LjE4NDczODYsOC42MDgzOTc5MSAxOS4xODQ3Mzg2LDUuNTQzMzM1MjIgQzE5LjE4NDczODYsNS40MTE1ODA1OSAxOS4xODI1MzYsNS4yNzgyMTkxOSAxOS4xNzg0NDU1LDUuMTQ0MjE1MDkgQzE5LjI0NzY2ODgsNC45MjMxMjQzOCAxOS4zMDY4MjMzLDQuNzM0MTY4OTYgMTkuMzU5Njg0Nyw0LjU2NTQ1ODc2IEMxOS41OTM0NzA2LDMuODE5OTIwMzQgMTkuNzAyMzM5OSwzLjQ3MzgyMzQxIDE5Ljk1MTU0MzcsMi41ODExMDU0MiBDMTkuOTgzMDA4OCwyLjQ4NTM0MjMgMjAsMi4zODI1MDk0MSAyMCwyLjI3NTgyMDI5IEMyMCwxLjc0MzMzODc2IDE5LjU3ODA1MjYsMS4zMTE3NjE5OSAxOS4wNTY5OTAxLDEuMzExNzYxOTkgQzE5LjA1NjM2MDgsMS4zMTE3NjE5OSAxOS4wNTU3MzE1LDEuMzExNzYxOTkgMTkuMDU1MTAyMiwxLjMxMTc2MTk5IEMxOS4wNTI4OTk3LDEuMzExNzYxOTkgMTkuMDUwNjk3MSwxLjMxMTc2MTk5IDE5LjA0ODgwOTIsMS4zMTE3NjE5OSBMMTguNzQ0NTQxNCwxLjMxNDMzMjgyIEMxOC40Mjk4OTAyLDEuMzE2NTgyMjggMTguMjQzNjE2NiwxLjMxNzg2NzcgMTguMTA3Njg3MywxLjMxNzg2NzcgQzE3LjkxODI2NzIsMS4zMTc4Njc3IDE3LjgyOTUzNTUsMS4zMTUyOTY4NyAxNy42MTE3OTY5LDEuMzA4ODY5ODIgTDE3LjUzNjU5NTIsMS4zMDY2MjAzNSBDMTYuNjI5MTQwOSwwLjQ3MjA2NzIxNCAxNS40Mzc4NzEyLDAgMTQuMjA4NTI4NywwIFpcIiBpZD1cIlNoYXBlXCIgZmlsbD1cIiMyODJEMzZcIiBmaWxsLXJ1bGU9XCJub256ZXJvXCI+PC9wYXRoPiA8L2c+PC9zdmc+JyxcbiAgICAnYmstdXNlcic6XG4gICAgICAnPHN2ZyBjbGFzcz1cImJrLWljb25cIiB2aWV3Qm94PVwiMCAwIDIwIDIzXCIgdmVyc2lvbj1cIjEuMVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB4bWxuczp4bGluaz1cImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmtcIj4gPGcgaWQ9XCJQYWdlLTFcIiBzdHJva2U9XCJub25lXCIgc3Ryb2tlLXdpZHRoPVwiMVwiIGZpbGw9XCJub25lXCIgZmlsbC1ydWxlPVwiZXZlbm9kZFwiPiA8ZyBpZD1cIkZSRUUxMDBpY29uc1wiIHRyYW5zZm9ybT1cInRyYW5zbGF0ZSgtNDQ5LjAwMDAwMCwgLTg3Ny4wMDAwMDApXCIgZmlsbD1cIiMxQTE5MTlcIj4gPGcgaWQ9XCJGXCIgdHJhbnNmb3JtPVwidHJhbnNsYXRlKDE3LjAwMDAwMCwgODcyLjAwMDAwMClcIj4gPGcgaWQ9XCI0RlwiIHRyYW5zZm9ybT1cInRyYW5zbGF0ZSg0MzIuMDAwMDAwLCA1LjAwMDAwMClcIj4gPHBhdGggZD1cIk05Ljg4LDIuMTkwNzUgQzExLjc1MDg1NzEsMi4xOTA3NSAxMy4yNzMxNDI5LDMuNzI2IDEzLjI3MzE0MjksNS42MDYyNSBDMTMuMjczMTQyOSw3LjQ5MjI1IDExLjc1MDg1NzEsOS4wMjE3NSA5Ljg4LDkuMDIxNzUgQzguMDA5MTQyODYsOS4wMjE3NSA2LjQ4NzQyODU3LDcuNDkyMjUgNi40ODc0Mjg1Nyw1LjYwNjI1IEM2LjQ4NzQyODU3LDMuNzI2IDguMDA5MTQyODYsMi4xOTA3NSA5Ljg4LDIuMTkwNzUgWiBNOS44OCwxMC43NDY3NSBDMTIuNjk2LDEwLjc0Njc1IDE0Ljk4NzQyODYsOC40NDEgMTQuOTg3NDI4Niw1LjYwNjI1IEMxNC45ODc0Mjg2LDIuNzcxNSAxMi42OTYsMC40NjU3NSA5Ljg4LDAuNDY1NzUgQzcuMDY0LDAuNDY1NzUgNC43NzMxNDI4NiwyLjc3MTUgNC43NzMxNDI4Niw1LjYwNjI1IEM0Ljc3MzE0Mjg2LDguNDQxIDcuMDY0LDEwLjc0Njc1IDkuODgsMTAuNzQ2NzUgWiBNMTcuOTc1NDI4NiwyMC45MTg1IEwxLjc4NDU3MTQzLDIwLjkxODUgTDEuNzg0NTcxNDMsMTYuOTE2NSBDMS43ODQ1NzE0MywxNS45MDQ1IDIuMTc4Mjg1NzEsMTQuOTE1NSAyLjgzNzcxNDI5LDE0LjI2NTc1IEMzLjE3NDg1NzE0LDEzLjkzMjI1IDMuNzMwMjg1NzEsMTMuNTI5NzUgNC41MjI4NTcxNCwxMy41NTI3NSBDNC45NiwxMy41NjQyNSA2LjMxNDI4NTcxLDEzLjU0NyA3Ljk2MTE0Mjg2LDEzLjU0MTI1IEMxMC40MjE3MTQzLDEzLjUyOTc1IDEzLjUyNTE0MjksMTMuNTEyNSAxNS4xMzA4NTcxLDEzLjUxMjUgQzE3LjA4NTE0MjksMTMuNTEyNSAxNy45NzU0Mjg2LDE1LjExNjc1IDE3Ljk3NTQyODYsMTYuNjA2IEwxNy45NzU0Mjg2LDIwLjkxODUgWiBNMTUuMTMwODU3MSwxMS43ODc1IEMxMy41MjM0Mjg2LDExLjc4NzUgMTAuNDE2NTcxNCwxMS44MDQ3NSA3Ljk1MzE0Mjg2LDExLjgxNjI1IEM2LjMxODI4NTcxLDExLjgyMiA0Ljk2OCwxMS44Mjc3NSA0LjU0NjI4NTcxLDExLjgyNzc1IEM0LjU0NDU3MTQzLDExLjgyNzc1IDQuNTQyMjg1NzEsMTEuODI3NzUgNC41NCwxMS44Mjc3NSBDMy40NzgyODU3MSwxMS44MTA1IDIuNDQ1MTQyODYsMTIuMjM2IDEuNjM3MTQyODYsMTMuMDM1MjUgQzAuNjU2LDE0LjAwMTI1IDAuMDcwMjg1NzE0MywxNS40NTAyNSAwLjA3MDI4NTcxNDMsMTYuOTE2NSBMMC4wNzAyODU3MTQzLDIxLjc4MSBDMC4wNzAyODU3MTQzLDIyLjI1MjUgMC40NTM3MTQyODYsMjIuNjQzNSAwLjkyNzQyODU3MSwyMi42NDM1IEwxOC44MzI1NzE0LDIyLjY0MzUgQzE5LjMwNTcxNDMsMjIuNjQzNSAxOS42ODk3MTQzLDIyLjI1MjUgMTkuNjg5NzE0MywyMS43ODEgTDE5LjY4OTcxNDMsMTYuNjA2IEMxOS42ODk3MTQzLDE0LjI3MTUgMTguMDkyLDExLjc4NzUgMTUuMTMwODU3MSwxMS43ODc1IFpcIj48L3BhdGg+IDwvZz4gPC9nPiA8L2c+IDwvZz48L3N2Zz4nLFxuICAgICdiay13b3JsZCc6XG4gICAgICAnPHN2ZyBjbGFzcz1cImJrLWljb25cIiB2aWV3Qm94PVwiMCAwIDIwIDIxXCIgdmVyc2lvbj1cIjEuMVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB4bWxuczp4bGluaz1cImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmtcIj4gPGcgaWQ9XCJQYWdlLTFcIiBzdHJva2U9XCJub25lXCIgc3Ryb2tlLXdpZHRoPVwiMVwiIGZpbGw9XCJub25lXCIgZmlsbC1ydWxlPVwiZXZlbm9kZFwiPiA8ZyBpZD1cIkZSRUUxMDBpY29uc1wiIHRyYW5zZm9ybT1cInRyYW5zbGF0ZSgtNzMzLjAwMDAwMCwgLTEzMDYuMDAwMDAwKVwiIGZpbGw9XCIjMUExOTE5XCI+IDxnIGlkPVwiSVwiIHRyYW5zZm9ybT1cInRyYW5zbGF0ZSgxMS4wMDAwMDAsIDEzMDQuMDAwMDAwKVwiPiA8ZyBpZD1cIjZJXCIgdHJhbnNmb3JtPVwidHJhbnNsYXRlKDcyMi4wMDAwMDAsIDIuMDAwMDAwKVwiPiA8cGF0aCBkPVwiTTExLjYwNSwxOS4yMTI0MzkgQzEyLjU0MTUsMTcuNzI3MDczMiAxMy43NDQ1LDE1LjEyNTEyMiAxMy45NDMsMTEuNDE2ODI5MyBMMTguMTY5LDExLjQxNjgyOTMgQzE3Ljg0OCwxNS4yOTQxNDYzIDE1LjEzNTUsMTguNDQ5MjY4MyAxMS42MDUsMTkuMjEyNDM5IFogTTEuNzM0NSwxMS40MTY4MjkzIEw2LjAxNDUsMTEuNDE2ODI5MyBDNi4yMDk1LDE1LjE4NjU4NTQgNy4zNTg1LDE3Ljc0MjQzOSA4LjI3NTUsMTkuMjA3MzE3MSBDNC43NTY1LDE4LjQzOTAyNDQgMi4wNTQ1LDE1LjI4MzkwMjQgMS43MzQ1LDExLjQxNjgyOTMgWiBNOC4yMjYsMi4xMTAyNDM5IEM3LjI2MzUsMy41OTA0ODc4IDYuMDgyLDYuMTYxNzA3MzIgNS45OTU1LDkuODgwMjQzOSBMMS43MzQ1LDkuODgwMjQzOSBDMi4wNTI1LDYuMDM4NzgwNDkgNC43MzE1LDIuODk5MDI0MzkgOC4yMjYsMi4xMTAyNDM5IFogTTcuNDkyLDkuODgwMjQzOSBDNy41OTUsNS44NzQ4NzgwNSA5LjEyOSwzLjM2IDkuOTQ5LDIuMjk5NzU2MSBDMTAuNzgwNSwzLjM3NTM2NTg1IDEyLjM0NCw1LjkyMDk3NTYxIDEyLjQ2NCw5Ljg4MDI0MzkgTDcuNDkyLDkuODgwMjQzOSBaIE05Ljk0MzUsMTguOTY2NTg1NCBDOS4xNTksMTcuODkwOTc1NiA3Ljc0NTUsMTUuNDIyMTk1MSA3LjUxNywxMS40MTY4MjkzIEwxMi40NDEsMTEuNDE2ODI5MyBDMTIuMjA4NSwxNS4zMTQ2MzQxIDEwLjc0MzUsMTcuODU1MTIyIDkuOTQzNSwxOC45NjY1ODU0IFogTTE4LjE2OSw5Ljg4MDI0MzkgTDEzLjk2LDkuODgwMjQzOSBDMTMuODU5LDYuMjAyNjgyOTMgMTIuNjQxLDMuNjAwNzMxNzEgMTEuNjY1NSwyLjEwNTEyMTk1IEMxNS4xNjYsMi44ODg3ODA0OSAxNy44NSw2LjAzMzY1ODU0IDE4LjE2OSw5Ljg4MDI0MzkgWiBNOS45NjA1LDAuMzczOTAyNDM5IEM5Ljk1OSwwLjM3MzkwMjQzOSA5Ljk1NzUsMC4zNzM5MDI0MzkgOS45NTYsMC4zNzM5MDI0MzkgQzkuOTU0NSwwLjM3MzkwMjQzOSA5Ljk1MywwLjM3MzkwMjQzOSA5Ljk1MTUsMC4zNzM5MDI0MzkgQzQuNTczLDAuMzczOTAyNDM5IDAuMTk3NSw0Ljk4MzY1ODU0IDAuMTk3NSwxMC42NDg1MzY2IEMwLjE5NzUsMTYuMzE4NTM2NiA0LjU3MywyMC45MjgyOTI3IDkuOTUxNSwyMC45MjgyOTI3IEMxNS4zMywyMC45MjgyOTI3IDE5LjcwNTUsMTYuMzE4NTM2NiAxOS43MDU1LDEwLjY0ODUzNjYgQzE5LjcwNTUsNC45ODg3ODA0OSAxNS4zMzUsMC4zNzkwMjQzOSA5Ljk2MDUsMC4zNzM5MDI0MzkgWlwiPjwvcGF0aD4gPC9nPiA8L2c+IDwvZz4gPC9nPjwvc3ZnPicsXG4gICAgJ2JrLXlvdXR1YmUnOlxuICAgICAgJzxzdmcgY2xhc3M9XCJiay1pY29uXCIgdmlld0JveD1cIjAgMCAyMiAxNlwiIHZlcnNpb249XCIxLjFcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgeG1sbnM6eGxpbms9XCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rXCI+IDxnIGlkPVwiUGFnZS0xXCIgc3Ryb2tlPVwibm9uZVwiIHN0cm9rZS13aWR0aD1cIjFcIiBmaWxsPVwibm9uZVwiIGZpbGwtcnVsZT1cImV2ZW5vZGRcIj4gPGcgaWQ9XCJpY29uczgtcGxheS1idXR0b24tKDEpXCIgZmlsbD1cIiMwMDAwMDBcIiBmaWxsLXJ1bGU9XCJub256ZXJvXCI+IDxwYXRoIGQ9XCJNMTAuNywxIEMxNC4zLDEgMTcuMiwxLjMgMTguNiwxLjU1IEMxOS4zNSwxLjc1IDE5Ljk1LDIuMjUgMjAuMDUsMi45IEMyMC4zNSw0LjUgMjAuNTUsNi4yIDIwLjU1LDcuOTUgQzIwLjUsMTAuMSAyMC4yNSwxMS44NSAyMC4wNSwxMy4xIEMxOS45LDE0LjA1IDE4LjksMTQuMzUgMTguNiwxNC40NSBDMTYuOCwxNC44IDEzLjgsMTUuMDUgMTAuOCwxNS4wNSBDNy44LDE1LjA1IDQuNzUsMTQuODUgMywxNC40NSBDMi4yNSwxNC4yNSAxLjY1LDEzLjc1IDEuNTUsMTMuMSBDMS4xNSwxMS43IDEsOS44NSAxLDggQzEsNS43IDEuMiw0IDEuNCwyLjk1IEMxLjU1LDIgMi42LDEuNyAyLjg1LDEuNiBDNC41LDEuMjUgNy41NSwxIDEwLjcsMSBaIE0xMC43LDAgQzcuNCwwIDQuMywwLjI1IDIuNjUsMC42IEMxLjU1LDAuODUgMC42LDEuNiAwLjQsMi43NSBDMC4yLDMuOTUgMCw1Ljc1IDAsOCBDMCwxMC4yNSAwLjIsMTIgMC40NSwxMy4yNSBDMC42NSwxNC4zNSAxLjYsMTUuMTUgMi43LDE1LjQgQzQuNDUsMTUuNzUgNy40NSwxNiAxMC43NSwxNiBDMTQuMDUsMTYgMTcuMDUsMTUuNzUgMTguOCwxNS40IEMxOS45LDE1LjE1IDIwLjg1LDE0LjQgMjEuMDUsMTMuMjUgQzIxLjI1LDEyIDIxLjUsMTAuMiAyMS41NSw3Ljk1IEMyMS41NSw1LjcgMjEuMywzLjkgMjEuMDUsMi42NSBDMjAuODUsMS41NSAxOS45LDAuNzUgMTguOCwwLjUgQzE3LjA1LDAuMjUgMTQsMCAxMC43LDAgWlwiIGlkPVwiU2hhcGVcIj48L3BhdGg+IDxwYXRoIGQ9XCJNOSw1LjcgTDEzLDggTDksMTAuMyBMOSw1LjcgWiBNOCw0IEw4LDEyIEwxNSw4IEw4LDQgWlwiIGlkPVwiU2hhcGVcIj48L3BhdGg+IDwvZz4gPC9nPjwvc3ZnPicsXG4gIH07XG5cbiAgZnVuY3Rpb24gcGx1Z2luKFVJa2l0KSB7XG4gICAgaWYgKHBsdWdpbi5pbnN0YWxsZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBVSWtpdC5pY29uLmFkZChJY29ucyk7XG4gIH1cblxuICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgd2luZG93LlVJa2l0KSB7XG4gICAgd2luZG93LlVJa2l0LnVzZShwbHVnaW4pO1xuICB9XG5cbiAgcmV0dXJuIHBsdWdpbjtcbn0pKTtcbiIsImNvbnN0IGRlYm91bmNlID0gKGZ1bmMsIHdhaXQsIGltbWVkaWF0ZSkgPT4ge1xuICBsZXQgdGltZW91dDtcbiAgcmV0dXJuICgpID0+IHtcbiAgICBjb25zdCBjb250ZXh0ID0gdGhpcztcbiAgICBjb25zdCBhcmdzID0gYXJndW1lbnRzO1xuICAgIGNvbnN0IGxhdGVyID0gKCkgPT4ge1xuICAgICAgdGltZW91dCA9IG51bGw7XG4gICAgICBpZiAoIWltbWVkaWF0ZSkgZnVuYy5hcHBseShjb250ZXh0LCBhcmdzKTtcbiAgICB9O1xuICAgIGNvbnN0IGNhbGxOb3cgPSBpbW1lZGlhdGUgJiYgIXRpbWVvdXQ7XG4gICAgY2xlYXJUaW1lb3V0KHRpbWVvdXQpO1xuICAgIHRpbWVvdXQgPSBzZXRUaW1lb3V0KGxhdGVyLCB3YWl0KTtcbiAgICBpZiAoY2FsbE5vdykgZnVuYy5hcHBseShjb250ZXh0LCBhcmdzKTtcbiAgfTtcbn07XG5cbmZ1bmN0aW9uIHRocm90dGxlKGZuLCB3YWl0KSB7XG4gIGxldCB0aW1lID0gRGF0ZS5ub3coKTtcbiAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICBpZiAodGltZSArIHdhaXQgLSBEYXRlLm5vdygpIDwgMCkge1xuICAgICAgZm4oKTtcbiAgICAgIHRpbWUgPSBEYXRlLm5vdygpO1xuICAgIH1cbiAgfTtcbn1cblxuZXhwb3J0IHsgZGVib3VuY2UsIHRocm90dGxlIH07XG4iXX0=

}catch(e){console.log("Module 'dls2': ",e);}
try{var selectedCategory = "";
var selectedEvent = "";	
var defaultView = "";


$(document).ready(function(){
defaultView = "today";
//$('.uk-subnav.bk-blog-filters__subnav li:first-child').addClass('uk-active');
//$('.bk-blog-filters__pills li:first-child').addClass('uk-active');

$('.uk-subnav.bk-blog-filters__subnav').find('li').each(function(e) {

   if($(this).is('.uk-active')){
       selectedEvent  = $(this).find("a").attr("data-value");
       //console.log("selectedEvent  uk-active!!! " + $(this).find("a").attr("data-value"));
   }

});
$('.bk-blog-filters__pills').find('li').each(function(e) {
    var $catNavClassName = $(this).parent('ul').parent('li').parent('ul');
   if($catNavClassName.is('.events-listing') ){
		 $(this).parent('ul').addClass("events-filter");
	 }
   if($(this).is('.uk-active')){
       selectedCategory = $(this).find("a").attr("data-value");
       //console.log("selectedCategory  uk-active!!! " + $(this).find("a").attr("data-value"));
   }
});
if(selectedEvent!=""&&selectedCategory!=""){
  checkEventTypeAndCallAjax();
}
});


$('.uk-subnav.bk-blog-filters__subnav>li>a').click(function(e) {
	    defaultView = "";
        $(".uk-subnav.bk-blog-filters__subnav li").removeClass("uk-active");
		$(this).parent('li').addClass("uk-active");
        //console.log("selected event type!! " + $(this).attr("data-value"));
	    selectedEvent = $(this).attr("data-value");
        if(selectedEvent!=""&&selectedCategory!=""){
         checkEventTypeAndCallAjax();
        }      
});
$(document).on('click','.bk-blog-filters__pills.events-filter>li>a',function(){
//$('.bk-blog-filters__pills.events-filter>li>a').click(function(e) {
	    defaultView = "";
         $(".bk-blog-filters__pills.events-filter li").removeClass("uk-active");
		 $(this).parent('li').addClass("uk-active");
         //console.log("selected category type!! " + $(this).attr("data-value"));
	     selectedCategory = $(this).attr("data-value");
         if(selectedEvent!=""&&selectedCategory!=""){
           checkEventTypeAndCallAjax();
         }    
	
});

function addClassToEventType(){
	$(".uk-subnav.bk-blog-filters__subnav li").removeClass("uk-active");
	$('.uk-subnav.bk-blog-filters__subnav').find('li').each(function(e) {
			$(this).find('a').each(function(e) {
			 if($(this).attr("data-value")=="upcoming"){
				 $(this).parent('li').addClass("uk-active");
			 }
		});
	});
}
function checkEventTypeAndCallAjax(){
	if(defaultView=="upcoming"){
		selectedEvent="upcoming";
		addClassToEventType();
	}
    if(selectedEvent!=""&&selectedEvent=="past"){
	  getSelectedCategoryData(pastEventsURL);
	}else if(selectedEvent!=""&&selectedEvent=="today"){
	   getSelectedCategoryData(todayEventsURL);
	}else{
	   getSelectedCategoryData(upcomingEventsURL);
		
	}
}

function getSelectedCategoryData(eventUrl){
//console.log("in getSelectedCategoryData!!! ");
//console.log("eventUrl!!! " + eventUrl);
$(".result-block>li").html("<div uk-spinner='ratio: 3'></div>");
$('.result-block').css('margin-top',"50px");
$(".result-block").css("text-align","center");

	$.ajax({
	type: "GET",
	url: eventUrl+'&category='+selectedCategory,
	cache: false,
	success: function (result,status,xhr){
		if(status='success'){
			
			//console.log("result length!!! "+ result.length); 
			if(result.length==0){
				if(defaultView == "today"){
					defaultView="upcoming";
					checkEventTypeAndCallAjax();
				}else{
				$('.result-block>li').css('margin-top',"50px");
				$('.result-block>li').html(""); 
				$('.result-block>li').append(noEventNsg);
				}
			}else{
				$('.result-block').css('margin-top',"0px");
				$(".result-block").css("text-align","");
				$('.result-block>li').css('margin-top',"0px");
				$('.result-block>li').html(""); 
				$('.result-block>li').append(result);
				generatePgnUrls();
			}
                      
		 }
		 else{
			
		 }
		}
	});
}

function generatePgnUrls(){
//console.log("in generatePgnUrls!!!!");
 $('.uk-section-large.uk-text-center').find('li').each(function(e) {
        $(this).find('a').each(function(e) {
           var pgNo = $(this).text();
           var $blockClassName = $(this).parent('li').parent('ul').parent('div').parent('li').parent('ul');
             if($blockClassName.is('.result-block') ){
               //console.log("event content!!");
               $(this).attr("href", "javascript:getPgnContents("+pgNo+");");
             }
	});
});
}
function checkSelectedEvent(pageNumber){

    if(selectedEvent!=""&&selectedEvent=="past"){
	 pgNavUrl = pastEventsURL+"&category="+selectedCategory+"&WCM_Page.PZN_Past_Events="+pageNumber;
	}else if(selectedEvent!=""&&selectedEvent=="today"){
	    pgNavUrl = todayEventsURL+"&category="+selectedCategory+"&WCM_Page.PZN_Today_Events="+pageNumber;
	}else{
	   pgNavUrl = upcomingEventsURL+"&category="+selectedCategory+"&WCM_Page.PZN_Upcoming_Events="+pageNumber;
	}
 return pgNavUrl;
}
function getPgnContents(pageNumber){

//console.log("in getPgnContents!!!");

$(".result-block>li").html("<div uk-spinner='ratio: 3'></div>");
$('.result-block').css('margin-top',"50px");
$(".result-block").css("text-align","center");
    var pgNavUrl = checkSelectedEvent(pageNumber);
	$.ajax({
	type: "GET",
	url: pgNavUrl,
	cache: false,
	success: function (result,status,xhr){
		if(status='success'){
			$('.result-block').css('margin-top',"0px");
            $(".result-block").css("text-align","");
			$('.result-block>li').html(""); 
			$('.result-block>li').append(result); 
			 var etop = $('.events-listing').offset().top;
				$('html, body').animate({
				  scrollTop: etop
				}, 1000);
            generatePgnUrls();
		 }else{
			
		 }
		}
	});
 
 return false;
}

/* onload event */
$(document).ready(function(){
	checkCookie('fc_cc_status');
	/* Click event */
	$(document).on('click','#cookie-alert .uk-alert-close',function(){
		var expiresOn = 365;
		console.log('set Cookie');
		setCookie("fc_cc_status","kXkOxvDteUXrJf3N",expiresOn);
	});
});

/* Update cookie */
function setCookie(cname, cvalue, exdays) {
  console.log(cname);
  var d = new Date();
  d.setTime(d.getTime() + (exdays*24*60*60*1000));
  var expires = "expires="+ d.toUTCString();
  document.cookie = cname + "=" + cvalue + ";" + expires + ";path=/";
  
}
/* Code to check if cookies is available*/
function checkCookie(cookieName) {
  var cookie = getCookie(cookieName);
  console.log("checkCookie="+cookie);
  if (cookie != "" && cookie=="kXkOxvDteUXrJf3N") {
	console.log('cookie notified');
  } else{	 
	$('#cookie-alert').removeClass('uk-hidden');
  }
}

function getCookie(cname) {
  var name = cname + "=";
  var ca = document.cookie.split(';');
  for(var i = 0; i < ca.length; i++) {
    var c = ca[i];
    while (c.charAt(0) == ' ') {
      c = c.substring(1);
    }
    if (c.indexOf(name) == 0) {
      return c.substring(name.length, c.length);
    }
  }
  return "";
}

}catch(e){console.log("Module 'dls2': ",e);}